ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDAzNTgyYzcuLjFiMzFiZTEgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMzksNiArMzksOSBAQAogICAgICAgIGNvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9FdmVudExvZ1RhZ3MubG9ndGFncyBcCiAgICAgICAgdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0V2ZW50TG9nVGFncy5sb2d0YWdzIFwKIAorIyBSZW5kZXJTY3JpcHQgZmlsZXMgZm9yIGludGVybmFsIHdpZGdldHMKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKGNhbGwgYWxsLXJlbmRlcnNjcmlwdC1maWxlcy11bmRlciwgY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldCkKKwogIyBUaGUgZm9sbG93aW5nIGZpbHRlcnMgb3V0IGNvZGUgd2UgYXJlIHRlbXBvcmFyaWx5IG5vdCBpbmNsdWRpbmcgYXQgYWxsLgogIyBUT0RPOiBNb3ZlIEFXVCBhbmQgYmVhbnMgKGFuZCBhc3NvY2lhdGVkIGhhcm1vbnkgY29kZSkgYmFjayBpbnRvIGxpYmNvcmUuCiAjIFRPRE86IE1heWJlIHJlbW92ZSBqYXZheC5taWNyb2VkaXRpb24gZW50aXJlbHk/CkBAIC0xMDAsOSArMTAzLDExIEBACiAJY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhDYWxsYmFjay5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEhlYWRzZXQuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhQYmFwLmFpZGwgXAorCWNvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNsaXBib2FyZC5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDb250ZW50U2VydmljZS5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lJbnRlbnRSZWNlaXZlci5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lJbnRlbnRTZW5kZXIuYWlkbCBcCisJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lci5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lTeW5jQWRhcHRlci5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lTeW5jQ29udGV4dC5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lTeW5jU3RhdHVzT2JzZXJ2ZXIuYWlkbCBcCkBAIC0xMjksNyArMTM0LDYgQEAKICAgICBjb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9JV2FsbHBhcGVyQ29ubmVjdGlvbi5haWRsIFwKICAgICBjb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9JV2FsbHBhcGVyRW5naW5lLmFpZGwgXAogICAgIGNvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL0lXYWxscGFwZXJTZXJ2aWNlLmFpZGwgXAotCWNvcmUvamF2YS9hbmRyb2lkL3RleHQvSUNsaXBib2FyZC5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JQXBwbGljYXRpb25Ub2tlbi5haWRsIFwKQEAgLTE1OSw2ICsxNjMsOSBAQAogCWNvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0lJbnB1dE1ldGhvZENsaWVudC5haWRsIFwKIAljb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9JSW5wdXRNZXRob2RNYW5hZ2VyLmFpZGwgXAogCWNvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0lJbnB1dE1ldGhvZFNlc3Npb24uYWlkbCBcCisJY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9JUmVtb3RlVmlld3NGYWN0b3J5LmFpZGwgXAorCWxvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JQ291bnRyeURldGVjdG9yLmFpZGwgXAorCWxvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JQ291bnRyeUxpc3RlbmVyLmFpZGwgXAogCWxvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JR2VvY29kZVByb3ZpZGVyLmFpZGwgXAogCWxvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JR3BzU3RhdHVzTGlzdGVuZXIuYWlkbCBcCiAJbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lHcHNTdGF0dXNQcm92aWRlci5haWRsIFwKQEAgLTM0OCw3ICszNTUsNyBAQAogCQkJZnJhbWV3b3JrIFwKIAogZnJhbWV3b3JrX2RvY3NfTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEpBVkFfTElCUkFSSUVTCi1mcmFtZXdvcmtfZG9jc19MT0NBTF9EUk9JRERPQ19IVE1MX0RJUiA6PSAkKExPQ0FMX1BBVEgpL2RvY3MvaHRtbCAkKE9VVF9ET0NTKS9nZW4KK2ZyYW1ld29ya19kb2NzX0xPQ0FMX0RST0lERE9DX0hUTUxfRElSIDo9IGRvY3MvaHRtbAogIyBUaGUgc2luY2UgZmxhZyAoLXNpbmNlIE4ueG1sIEFQSV9MRVZFTCkgaXMgdXNlZCB0byBhZGQgQVBJIExldmVsIGluZm9ybWF0aW9uCiAjIHRvIHRoZSByZWZlcmVuY2UgZG9jdW1lbnRhdGlvbi4gTXVzdCBiZSBpbiBvcmRlciBvZiBvbGRlc3QgdG8gbmV3ZXN0LgogZnJhbWV3b3JrX2RvY3NfTE9DQUxfRFJPSURET0NfT1BUSU9OUyA6PSBcCkBAIC0zNjAsNyArMzY3LDggQEAKICAgICAtc2luY2UgLi9mcmFtZXdvcmtzL2Jhc2UvYXBpLzYueG1sIDYgXAogICAgIC1zaW5jZSAuL2ZyYW1ld29ya3MvYmFzZS9hcGkvNy54bWwgNyBcCiAgICAgLXNpbmNlIC4vZnJhbWV3b3Jrcy9iYXNlL2FwaS84LnhtbCA4IFwKLQkJLWVycm9yIDEgLWVycm9yIDIgLXdhcm5pbmcgMyAtZXJyb3IgNCAtZXJyb3IgNiAtZXJyb3IgOCBcCisgICAgLXNpbmNlIC4vZnJhbWV3b3Jrcy9iYXNlL2FwaS9jdXJyZW50LnhtbCBIQyBcCisJCS1lcnJvciAxMDEgLWVycm9yIDEwMiAtd2FybmluZyAxMDMgLWVycm9yIDEwNCAtZXJyb3IgMTA2IC1lcnJvciAxMDggLXdhcm5pbmcgMTEzIFwKIAkJLW92ZXJ2aWV3ICQoTE9DQUxfUEFUSCkvY29yZS9qYXZhL292ZXJ2aWV3Lmh0bWwKIAogZnJhbWV3b3JrX2RvY3NfTE9DQUxfQURESVRJT05BTF9KQVZBX0RJUjo9JChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixKQVZBX0xJQlJBUklFUyxmcmFtZXdvcmspCkBAIC00MTYsNyArNDI0LDkgQEAKIAkJLXNhbXBsZWNvZGUgJChzYW1wbGVfZGlyKS9XaWt0aW9uYXJ5U2ltcGxlIFwKIAkJICAgICAgICAgICAgcmVzb3VyY2VzL3NhbXBsZXMvV2lrdGlvbmFyeVNpbXBsZSAiV2lrdGlvbmFyeSAoU2ltcGxpZmllZCkiIFwKIAkJLXNhbXBsZWNvZGUgJChzYW1wbGVfZGlyKS9Wb2ljZVJlY29nbml0aW9uU2VydmljZSBcCi0JCSAgICAgICAgICAgIHJlc291cmNlcy9zYW1wbGVzL1ZvaWNlUmVjb2duaXRpb25TZXJ2aWNlICJWb2ljZSBSZWNvZ25pdGlvbiBTZXJ2aWNlIgorCQkgICAgICAgICAgICByZXNvdXJjZXMvc2FtcGxlcy9Wb2ljZVJlY29nbml0aW9uU2VydmljZSAiVm9pY2UgUmVjb2duaXRpb24gU2VydmljZSIgXAorCQktc2FtcGxlY29kZSAkKHNhbXBsZV9kaXIpL1htbEFkYXB0ZXJzIFwKKwkJICAgICAgICAgICAgcmVzb3VyY2VzL3NhbXBsZXMvWG1sQWRhcHRlcnMgIlhNTCBBZGFwdGVycyIKIAogIyMgU0RLIHZlcnNpb24gaWRlbnRpZmllcnMgdXNlZCBpbiB0aGUgcHVibGlzaGVkIGRvY3MKICAgIyBtYWpvclsubWlub3JdIHZlcnNpb24gZm9yIGN1cnJlbnQgU0RLLiAoZnVsbCByZWxlYXNlcyBvbmx5KQpAQCAtNDYzLDExICs0NzMsMTEgQEAKIAkJLW5vZG9jcwogCiBMT0NBTF9EUk9JRERPQ19DVVNUT01fVEVNUExBVEVfRElSOj1idWlsZC90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2RrCi1MT0NBTF9EUk9JRERPQ19DVVNUT01fQVNTRVRfRElSOj1hc3NldHMtc2RrCiAKIGluY2x1ZGUgJChCVUlMRF9EUk9JRERPQykKIAotJChmdWxsX3RhcmdldCk6ICQoZnJhbWV3b3JrX2J1aWx0KQorIyAkKGdlbiksIGkuZS4gZnJhbWV3b3JrLmFpZGwsIGlzIGFsc28gbmVlZGVkIHdoaWxlIGJ1aWxkaW5nIGFnYWluc3QgdGhlIGN1cnJlbnQgc3R1Yi4KKyQoZnVsbF90YXJnZXQpOiAkKGZyYW1ld29ya19idWlsdCkgJChnZW4pCiAkKElOVEVSTkFMX1BMQVRGT1JNX0FQSV9GSUxFKTogJChmdWxsX3RhcmdldCkKICQoY2FsbCBkaXN0LWZvci1nb2FscyxzZGssJChJTlRFUk5BTF9QTEFURk9STV9BUElfRklMRSkpCiAKQEAgLTQ4OSw3ICs0OTksNiBAQAogCQktcGFyc2Vjb21tZW50cwogCiBMT0NBTF9EUk9JRERPQ19DVVNUT01fVEVNUExBVEVfRElSOj1idWlsZC90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2RrCi1MT0NBTF9EUk9JRERPQ19DVVNUT01fQVNTRVRfRElSOj1hc3NldHMtc2RrCiAKIGluY2x1ZGUgJChCVUlMRF9EUk9JRERPQykKIApAQCAtNTE5LDE0ICs1MjgsMTMgQEAKIAkJLXByb29mcmVhZCAkKE9VVF9ET0NTKS8kKExPQ0FMX01PRFVMRSktcHJvb2ZyZWFkLnR4dCBcCiAJCS10b2RvICQoT1VUX0RPQ1MpLyQoTE9DQUxfTU9EVUxFKS1kb2NzLXRvZG8uaHRtbCBcCiAJCS1zZGt2YWx1ZXMgJChPVVRfRE9DUykgXAotCQktaGRmIGFuZHJvaWQud2hpY2hkb2Mgb2ZmbGluZSAKKwkJLWhkZiBhbmRyb2lkLndoaWNoZG9jIG9mZmxpbmUKIAogaWZlcSAoJChmcmFtZXdvcmtfZG9jc19TREtfUFJFVklFVyksdHJ1ZSkKICAgTE9DQUxfRFJPSURET0NfT1BUSU9OUyArPSAtaGRmIHNkay5jdXJyZW50IHByZXZpZXcgCiBlbmRpZgogCiBMT0NBTF9EUk9JRERPQ19DVVNUT01fVEVNUExBVEVfRElSOj1idWlsZC90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2RrCi1MT0NBTF9EUk9JRERPQ19DVVNUT01fQVNTRVRfRElSOj1hc3NldHMtc2RrCiAKIGluY2x1ZGUgJChCVUlMRF9EUk9JRERPQykKIApAQCAtNTM5LDcgKzU0Nyw2IEBACiAkKGZ1bGxfdGFyZ2V0KTogJChzdGF0aWNfZG9jX2luZGV4X3JlZGlyZWN0KQogJChmdWxsX3RhcmdldCk6ICQoZnJhbWV3b3JrX2J1aWx0KQogCi0KICMgPT09PSBkb2NzIGZvciB0aGUgd2ViIChvbiB0aGUgZ29vZ2xlIGFwcCBlbmdpbmUgc2VydmVyKSA9PT09PT09PT09PT09PT09PT09PT09PQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKQEAgLTU2MiwxMiArNTY5LDExIEBACiAJCS1oZGYgdGVtcGxhdGUuc2hvd0xhbmd1YWdlTWVudSB0cnVlCiAKIExPQ0FMX0RST0lERE9DX0NVU1RPTV9URU1QTEFURV9ESVI6PWJ1aWxkL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zZGsKLUxPQ0FMX0RST0lERE9DX0NVU1RPTV9BU1NFVF9ESVI6PWFzc2V0cy1zZGsKIAogaW5jbHVkZSAkKEJVSUxEX0RST0lERE9DKQogCiAjIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGF0IG9ubGluZS1zZGsgZGVwZW5kcyBvbiBmcmFtZXdvcmstcmVzIGFuZCBhbnkgZ2VuZXJhdGVkIGRvY3MKLSQoZnVsbF90YXJnZXQpOiBmcmFtZXdvcmstcmVzLXBhY2thZ2UtdGFyZ2V0ICQoQUxMX0dFTkVSQVRFRF9ET0NTKQorJChmdWxsX3RhcmdldCk6IGZyYW1ld29yay1yZXMtcGFja2FnZS10YXJnZXQKIAogIyA9PT09IGRvY3MgdGhhdCBoYXZlIGFsbCBvZiB0aGUgc3R1ZmYgdGhhdCdzIEBoaWRkZW4gPT09PT09PT09PT09PT09PT09PT09PT0KIGluY2x1ZGUgJChDTEVBUl9WQVJTKQpAQCAtNTgzLDExICs1ODksMTAgQEAKIExPQ0FMX01PRFVMRSA6PSBoaWRkZW4KIExPQ0FMX0RST0lERE9DX09QVElPTlM6PVwKIAkJJChmcmFtZXdvcmtfZG9jc19MT0NBTF9EUk9JRERPQ19PUFRJT05TKSBcCi0gICAgICAgIC10aXRsZSAiQW5kcm9pZCBTREsgLSBJbmNsdWRpbmcgaGlkZGVuIEFQSXMuIgotIyAgICAgICAgLWhpZGRlbgorCQktdGl0bGUgIkFuZHJvaWQgU0RLIC0gSW5jbHVkaW5nIGhpZGRlbiBBUElzLiIKKyMJCS1oaWRkZW4KIAogTE9DQUxfRFJPSURET0NfQ1VTVE9NX1RFTVBMQVRFX0RJUjo9YnVpbGQvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNkawotTE9DQUxfRFJPSURET0NfQ1VTVE9NX0FTU0VUX0RJUjo9YXNzZXRzLXNkawogCiBpbmNsdWRlICQoQlVJTERfRFJPSURET0MpCiAKQEAgLTU5NywxMCArNjAyLDE0IEBACiBleHRfZGlycyA6PSBcCiAJLi4vLi4vZXh0ZXJuYWwvbmlzdC1zaXAvamF2YSBcCiAJLi4vLi4vZXh0ZXJuYWwvYXBhY2hlLWh0dHAvc3JjIFwKLQkuLi8uLi9leHRlcm5hbC90YWdzb3VwL3NyYworCS4uLy4uL2V4dGVybmFsL3RhZ3NvdXAvc3JjIFwKKwkuLi8uLi9leHRlcm5hbC9saWJwaG9uZW51bWJlci9qYXZhL3NyYwogCiBleHRfc3JjX2ZpbGVzIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwkKGV4dF9kaXJzKSkKIAorZXh0X3Jlc19kaXJzIDo9IFwKKwkuLi8uLi9leHRlcm5hbC9saWJwaG9uZW51bWJlci9qYXZhL3NyYworCiAjID09PT0gIHRoZSBsaWJyYXJ5ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKQEAgLTYwOCw3ICs2MTcsNyBAQAogCiBMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMgOj0gdHJ1ZQogTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY29yZQotCitMT0NBTF9KQVZBX1JFU09VUkNFX0RJUlMgOj0gJChleHRfcmVzX2RpcnMpCiBMT0NBTF9NT0RVTEUgOj0gZXh0CiAKIExPQ0FMX05PX0VNTUFfSU5TVFJVTUVOVCA6PSB0cnVlCmRpZmYgLS1naXQgYS9DbGVhblNwZWMubWsgYi9DbGVhblNwZWMubWsKaW5kZXggNTYxOGVhYS4uZTk2MWE1YSAxMDA2NDQKLS0tIGEvQ2xlYW5TcGVjLm1rCisrKyBiL0NsZWFuU3BlYy5tawpAQCAtNjcsNyArNjcsMTcgQEAKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TSEFSRURfTElCUkFSSUVTL2xpYnJldmVyYl9pbnRlcm1lZGlhdGVzKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGlicmV2ZXJidGVzdF9pbnRlcm1lZGlhdGVzKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9zb3VuZGZ4LykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgZmluZCAuIC10eXBlIGYgLW5hbWUgIioucnMiIC1wcmludDAgfCB4YXJncyAtMCB0b3VjaCkKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TSEFSRURfTElCUkFSSUVTL2xpYmFuZHJvaWRfcnVudGltZV9pbnRlcm1lZGlhdGVzKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL2xpYi9saWJhbmRyb2lkX3J1bnRpbWUuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeW1ib2xzL3N5c3RlbS9saWIvbGliYW5kcm9pZF9ydW50aW1lLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9saWJhbmRyb2lkX3J1bnRpbWUuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJod3VpX2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovbGliL2xpYmh3dWkuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeW1ib2xzL3N5c3RlbS9saWIvbGliaHd1aS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliaHd1aS5zbykKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMvc3JjL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvKikKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMvc3JjL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNsaXBib2FyZC5QKQogCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKZGlmZiAtLWdpdCBhL2FwaS85LnhtbCBiL2FwaS85LnhtbAppbmRleCA0NmYwODdmLi4wOGY4NmUxIDEwMDY0NAotLS0gYS9hcGkvOS54bWwKKysrIGIvYXBpLzkueG1sCkBAIC01ODU5MywxNiArNTg1OTMsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJiaXRtYXAiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KLTxjb25zdHJ1Y3RvciBuYW1lPSJDYW52YXMiCi0gdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5DYW52YXMiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJnbCIgdHlwZT0iamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wiPgotPC9wYXJhbWV0ZXI+Ci08L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJjbGlwUGF0aCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTk1MTksMTcgKzU5NTA5LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icGFpbnQiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZnJlZUdsQ2FjaGVzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldENsaXBCb3VuZHMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU5NTc2LDE3ICs1OTU1NSw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldEdMIgotIHJldHVybj0iamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0SGVpZ2h0IgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU5OTUwLDIxICs1OTkxOCw2IEBACiA8cGFyYW1ldGVyIG5hbWU9Im1hdHJpeCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0Vmlld3BvcnQiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ3aWR0aCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJoZWlnaHQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJza2V3IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC03NDE3MCw3ICs3NDEyMyw3IEBACiAgdHlwZT0iZmxvYXQiCiAgdHJhbnNpZW50PSJmYWxzZSIKICB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjAuMDAxMGYiCisgdmFsdWU9IjAuMDAxZiIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCkBAIC0xNDc3ODIsMTcgKzE0NzczNSw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9jb25zdHJ1Y3Rvcj4KLTxtZXRob2QgbmFtZT0iYWJvcnRVcGRhdGVzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjbG9zZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQ3ODA0LDMwICsxNDc3NDYsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJjb21taXRVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJjb21taXRVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJqYXZhLnV0aWwuTWFwJmx0Oz8gZXh0ZW5kcyBqYXZhLmxhbmcuTG9uZywgPyBleHRlbmRzIGphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCZndDsmZ3Q7Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNvcHlTdHJpbmdUb0J1ZmZlciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQ3ODU0LDE3ICsxNDc3NzIsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJkZWxldGVSb3ciCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEJsb2IiCiAgcmV0dXJuPSJieXRlW10iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQ4MDYxLDE3ICsxNDc5NjgsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJoYXNVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc0FmdGVyTGFzdCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQ4Mjc1LDE3ICsxNDgxNzEsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdXBwb3J0c1VwZGF0ZXMiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0ODMxMiwxMjQgKzE0ODE5Nyw2IEBACiA8cGFyYW1ldGVyIG5hbWU9Im9ic2VydmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVCbG9iIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImJ5dGVbXSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVEb3VibGUiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZG91YmxlIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUZsb2F0IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImZsb2F0Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUludCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlTG9uZyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJsb25nIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVNob3J0IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9InNob3J0Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVN0cmluZyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVRvTnVsbCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTW9ja0RpYWxvZ0ludGVyZmFjZSIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpAQCAtMTY0Njk2LDcgKzE2NDQ2Myw3IEBACiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgogIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iJnF1b3Q7KChhZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfChiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KGNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoZ292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoaW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KGpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KG1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwobmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwob3JnfG9tKXwocHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwodGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KHhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLXpja3phaCl8eVtldHVdfHpbYW13XSkmcXVvdDsiCisgdmFsdWU9IiZxdW90OygoYWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoYml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfChjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KGVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KGdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KGluZm98aW50fGlbZGVsbW5vcXJzdF0pfChqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfChtaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KG5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KG9yZ3xvbSl8KHByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KHRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCh4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCl8eVtldF18elthbXddKSZxdW90OyIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCkBAIC0xNjQ3MDcsNyArMTY0NDc0LDcgQEAKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSImcXVvdDsoPzooPzphZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfCg/OmJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoPzpjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KD86ZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoPzpnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfCg/OmluZm98aW50fGlbZGVsbW5vcXJzdF0pfCg/OmpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KD86bWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfCg/Om5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KD86b3JnfG9tKXwoPzpwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCg/OnRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCg/OnhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLXpja3phaCl8eVtldHVdfHpbYW13XSkpJnF1b3Q7IgorIHZhbHVlPSImcXVvdDsoPzooPzphZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfCg/OmJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoPzpjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KD86ZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoPzpnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfCg/OmluZm98aW50fGlbZGVsbW5vcXJzdF0pfCg/OmpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KD86bWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfCg/Om5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KD86b3JnfG9tKXwoPzpwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCg/OnRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCg/OnhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLW1nYmFhbTdhOGh8eG5cXC1cXC1tZ2JlcnA0YTVkNGFyfHhuXFwtXFwtd2diaDFjfHhuXFwtXFwtemNremFoKXx5W2V0XXx6W2Ftd10pKSZxdW90OyIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCkBAIC0xOTU2MjgsNiArMTk1Mzk1LDM5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX01VTFRJUExFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9OT05FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9TSU5HTEUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPG1ldGhvZCBuYW1lPSJhZnRlclRleHRDaGFuZ2VkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDQwODQsMzkgKzIwMzg4NCw2IEBACiA8cGFyYW1ldGVyIG5hbWU9InkiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX01VTFRJUExFIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9OT05FIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9TSU5HTEUiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJMaXN0Vmlldy5GaXhlZFZpZXdJbmZvIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCmRpZmYgLS1naXQgYS9hcGkvY3VycmVudC54bWwgYi9hcGkvY3VycmVudC54bWwKaW5kZXggNGY0OTg2Zi4uNDI3MzM2MCAxMDA2NDQKLS0tIGEvYXBpL2N1cnJlbnQueG1sCisrKyBiL2FwaS9jdXJyZW50LnhtbApAQCAtMTQ4Miw2ICsxNDgyLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhbmltYXRvcl9mYWRlX2luIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTc0MzI2MDkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYW5pbWF0b3JfZmFkZV9vdXQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNzQzMjYxMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJhbnRpY2lwYXRlX2ludGVycG9sYXRvciIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIwODgsNiArMjExMCw2MSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uQnV0dG9uUGFkZGluZyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQ3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbkJ1dHRvblN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uRHJvcERvd25TdHlsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQ0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbk1vZGVCYWNrZ3JvdW5kIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uTW9kZUNsb3NlRHJhd2FibGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1MCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJhY3Rpdml0eUNsb3NlRW50ZXJBbmltYXRpb24iCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMTMyLDYgKzIyMDksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFkYXB0ZXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJhZGRTdGF0ZXNGcm9tQ2hpbGRyZW4iCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMTY1LDYgKzIyNTMsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFsbENvbnRhY3RzTmFtZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTMzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImFsbG93QmFja3VwIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjI1Myw2ICsyMzUyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhbmltYXRlRmlyc3RWaWV3IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iYW5pbWF0ZU9uQ2xpY2siCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMzQxLDYgKzI0NTEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFzIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iYXV0aG9yIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzAwMSw2ICszMTIyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJjb2x1bW4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJjb2x1bW5EZWxheSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTMxNDQsNiArMzI3NiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iY3VzdG9tTmF2aWdhdGlvbkxheW91dCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImN5Y2xlcyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTM0MDgsNiArMzU1MSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZGlzcGxheU9wdGlvbnMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzNyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJkaXRoZXIiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zNjA2LDYgKzM3NjAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImRyb3BEb3duU3Bpbm5lclN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iZHJvcERvd25WZXJ0aWNhbE9mZnNldCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQxNTYsNiArNDMyMSw2MSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJhZ21lbnQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1NyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcmFnbWVudENsb3NlRW50ZXJBbmltYXRpb24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU2MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcmFnbWVudENsb3NlRXhpdEFuaW1hdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTYyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyYWdtZW50T3BlbkVudGVyQW5pbWF0aW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJhZ21lbnRPcGVuRXhpdEFuaW1hdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTYwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImZyZWV6ZXNUZXh0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDE2Nyw2ICs0Mzg3LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcm9tIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iZnJvbUFscGhhIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDE4OSw2ICs0NDIwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcm9tVmFsdWUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyOCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJmcm9tWERlbHRhIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDQ3NSw2ICs0NzE3LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJoYXJkd2FyZUFjY2VsZXJhdGVkIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iaGFzQ29kZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQ3MDYsNiArNDk1OSwzOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iaW1lU3VidHlwZUV4dHJhVmFsdWUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU2NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJpbWVTdWJ0eXBlTG9jYWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iaW1lU3VidHlwZU1vZGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU2NSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJpbW1lcnNpdmUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC01ODk0LDYgKzYxODAsMzkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQ2MiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNDU5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQ2MyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNDU4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQ2NCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNDU3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQ3IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNjM4OSw2ICs2NzA4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJsaXN0Q2hvaWNlQmFja2dyb3VuZEluZGljYXRvciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTY4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JNdWx0aXBsZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTY2NTMsNiArNjk4MywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ibWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJtZW51Q2F0ZWdvcnkiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC02Nzg1LDYgKzcxMjYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Im5hdmlnYXRpb25Nb2RlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ibmVnYXRpdmVCdXR0b25UZXh0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNjk1MCw2ICs3MzAyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJvcmRlcmluZyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTU2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Im9yZGVyaW5nRnJvbVhtbCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTY5ODMsMzkgKzczNDYsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Ci08ZmllbGQgbmFtZT0ib3ZlcnNjcm9sbEZvb3RlciIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjE2ODQzNDU5IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9Im92ZXJzY3JvbGxIZWFkZXIiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxNjg0MzQ1OCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJvdmVyc2Nyb2xsTW9kZSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjE2ODQzNDU3IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgogPGZpZWxkIG5hbWU9InBhZGRpbmciCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC03Mzc5LDYgKzc3MDksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InByZXZpZXdJbWFnZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQ4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InByaW9yaXR5IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNzUzMyw2ICs3ODc0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJwcm9wZXJ0eU5hbWUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1NSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJwcm90ZWN0aW9uTGV2ZWwiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC04MzAzLDYgKzg2NTUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNlbGVjdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNldHRpbmdzQWN0aXZpdHkiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC04NDEzLDYgKzg3NzYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNob3dBc0FjdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQ2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNob3dEZWZhdWx0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtODQ5MCw2ICs4ODY0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzb3J0T3JkZXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJzb3VuZEVmZmVjdHNFbmFibGVkIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtODU0NSw2ICs4OTMwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzcGxpdE1vdGlvbkV2ZW50cyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTY3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNyYyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTg4NDIsNiArOTIzOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic3VidGl0bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzOCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJzdWdnZXN0QWN0aW9uTXNnIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtOTY3OCw2ICsxMDA4NSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idG8iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJ0b0FscGhhIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtOTcwMCw2ICsxMDExOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idG9WYWx1ZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTI5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InRvWERlbHRhIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtOTg3Niw2ICsxMDMwNSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idXJpIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idXNlTGV2ZWwiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC05OTA5LDYgKzEwMzQ5LDM5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ2YWx1ZUZyb20iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ2YWx1ZVRvIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idmFsdWVUeXBlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idmFyaWFibGVQYWRkaW5nIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTAyMTcsNiArMTA2OTAsNjEgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpbmRvd0FjdGlvbkJhciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpbmRvd0FjdGlvbkJhck92ZXJsYXkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1OCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJTaXplIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0id2luZG93QWN0aW9uQmFyU3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ3aW5kb3dBY3Rpb25Nb2RlT3ZlcmxheSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTUxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IndpbmRvd0FuaW1hdGlvblN0eWxlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTA0MjYsNiArMTA5NTQsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpdGhDbGFzcyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTMyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpdGhFeHByZXNzaW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0id3JpdGVQZXJtaXNzaW9uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQwNzUsNiArMTQ2MjUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImhvbWUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjkwODM1MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJpY29uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQ0NjAsNiArMTUwMjEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNlbGVjdFRleHRNb2RlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5MDgzNTQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic2VsZWN0ZWRJY29uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTUwMDAsNiArMTU1NzIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Imxpc3RfY29udGVudCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE3MzY3MDczIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InByZWZlcmVuY2VfY2F0ZWdvcnkiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNTE0Myw2ICsxNTcyNiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic2ltcGxlX3NlbGVjdGFibGVfbGlzdF9pdGVtIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTczNjcwNzQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic2ltcGxlX3NwaW5uZXJfZHJvcGRvd25faXRlbSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE1NTY4LDYgKzE2MTYyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzZWxlY3RUZXh0TW9kZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE3MDM5NDA4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InVua25vd25OYW1lIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTYwNTgsNiArMTY2NjMsNTAgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX0RpYWxvZ19Ob0ZyYW1lIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NzIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfSG9sbyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTc0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX0hvbG9fTm9BY3Rpb25CYXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9Ib2xvX05vQWN0aW9uQmFyX0Z1bGxzY3JlZW4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3NyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJUaGVtZV9JbnB1dE1ldGhvZCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE2MDgwLDYgKzE2NzI5LDM5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9MaWdodF9Ib2xvIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NzUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfTGlnaHRfSG9sb19Ob0FjdGlvbkJhciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTc4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX0xpZ2h0X0hvbG9fTm9BY3Rpb25CYXJfRnVsbHNjcmVlbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTc5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlRoZW1lX0xpZ2h0X05vVGl0bGVCYXIiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNjE1Nyw2ICsxNjgzOSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfTm9UaXRsZUJhcl9PdmVybGF5QWN0aW9uTW9kZXMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJUaGVtZV9QYW5lbCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE2MjQ1LDYgKzE2OTM4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9XaXRoQWN0aW9uQmFyIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NjkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iV2lkZ2V0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTYyNjcsNiArMTY5NzEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IldpZGdldF9BY3Rpb25CdXR0b24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJXaWRnZXRfQXV0b0NvbXBsZXRlVGV4dFZpZXciCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNjY0MSw2ICsxNzM1NiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iV2lkZ2V0X1NwaW5uZXJfRHJvcERvd24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3MCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJXaWRnZXRfVGFiV2lkZ2V0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTkwNjUsOCArMTk3OTEsMjAwNSBAQAogPC9jb25zdHJ1Y3Rvcj4KIDwvY2xhc3M+CiA8L3BhY2thZ2U+Cis8cGFja2FnZSBuYW1lPSJhbmRyb2lkLmFuaW1hdGlvbiIKKz4KKzxjbGFzcyBuYW1lPSJBbmltYXRhYmxlIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5sYW5nLkNsb25lYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iQW5pbWF0YWJsZSIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZExpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUuQW5pbWF0YWJsZUxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNhbmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2xvbmUiCisgcmV0dXJuPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkNsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVuZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TGlzdGVuZXJzIgorIHJldHVybj0iamF2YS51dGlsLkFycmF5TGlzdCZsdDthbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlLkFuaW1hdGFibGVMaXN0ZW5lciZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNSdW5uaW5nIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUFsbExpc3RlbmVycyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZS5BbmltYXRhYmxlTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJBbmltYXRhYmxlLkFuaW1hdGFibGVMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25DYW5jZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkFuaW1hdGlvbkVuZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQW5pbWF0aW9uUmVwZWF0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25TdGFydCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJBbmltYXRhYmxlSW5mbGF0ZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFuaW1hdGFibGVJbmZsYXRlciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlSW5mbGF0ZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ibG9hZEFuaW1hdGFibGUiCisgcmV0dXJuPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFuaW1hdGFibGVMaXN0ZW5lckFkYXB0ZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlLkFuaW1hdGFibGVMaXN0ZW5lciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iQW5pbWF0YWJsZUxpc3RlbmVyQWRhcHRlciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlTGlzdGVuZXJBZGFwdGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9Im9uQW5pbWF0aW9uQ2FuY2VsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQW5pbWF0aW9uRW5kIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQW5pbWF0aW9uUmVwZWF0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQW5pbWF0aW9uU3RhcnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQW5pbWF0b3IiCisgZXh0ZW5kcz0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkdXJhdGlvbiIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJULi4uIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYWRkVXBkYXRlTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBbmltYXRlZFZhbHVlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBbmltYXRlZFZhbHVlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvcGVydHlOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEN1cnJlbnRQbGF5VGltZSIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RHVyYXRpb24iCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEZyYW1lRGVsYXkiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SW50ZXJwb2xhdG9yIgorIHJldHVybj0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UmVwZWF0Q291bnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UmVwZWF0TW9kZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdGFydERlbGF5IgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1J1bm5pbmciCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZVVwZGF0ZUxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmV2ZXJzZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q3VycmVudFBsYXlUaW1lIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGxheVRpbWUiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RHVyYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkdXJhdGlvbiIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFdmFsdWF0b3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRGcmFtZURlbGF5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFtZURlbGF5IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEludGVycG9sYXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZXBlYXRDb3VudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmVwZWF0TW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhcnREZWxheSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0RGVsYXkiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VmFsdWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eVZhbHVlc0hvbGRlci4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9IlQuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJJTkZJTklURSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0xIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlJFU1RBUlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlJFVkVSU0UiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQW5pbWF0b3IuQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25VcGRhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IkRvdWJsZUV2YWx1YXRvciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJEb3VibGVFdmFsdWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uRG91YmxlRXZhbHVhdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImV2YWx1YXRlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJGbG9hdEV2YWx1YXRvciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJGbG9hdEV2YWx1YXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5GbG9hdEV2YWx1YXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJldmFsdWF0ZSIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kVmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iSW50RXZhbHVhdG9yIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuYW5pbWF0aW9uLlR5cGVFdmFsdWF0b3IiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkludEV2YWx1YXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5JbnRFdmFsdWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZXZhbHVhdGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0VmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IktleWZyYW1lIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJLZXlmcmFtZSIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IktleWZyYW1lIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLktleWZyYW1lIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJLZXlmcmFtZSIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJLZXlmcmFtZSIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImRvdWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldEZyYWN0aW9uIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SW50ZXJwb2xhdG9yIgorIHJldHVybj0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKKyByZXR1cm49ImphdmEubGFuZy5DbGFzcyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWYWx1ZSIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RnJhY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW50ZXJwb2xhdG9yIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZXJwb2xhdG9yIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRWYWx1ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlByb3BlcnR5QW5pbWF0b3IiCisgZXh0ZW5kcz0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByb3BlcnR5QW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlBbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByb3BlcnR5QW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlBbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YXJnZXQiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByb3BlcnR5TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJULi4uIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcm9wZXJ0eUFuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5QW5pbWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkdXJhdGlvbiIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFyZ2V0IiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyLi4uIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0UHJvcGVydHlOYW1lIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUYXJnZXQiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFByb3BlcnR5TmFtZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByb3BlcnR5TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUYXJnZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YXJnZXQiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUHJvcGVydHlWYWx1ZXNIb2xkZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByb3BlcnR5VmFsdWVzSG9sZGVyIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJULi4uIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcm9wZXJ0eVZhbHVlc0hvbGRlciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eVZhbHVlc0hvbGRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByb3BlcnR5TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJULi4uIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0R2V0dGVyIgorIHJldHVybj0iamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByb3BlcnR5TmFtZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2V0dGVyIgorIHJldHVybj0iamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEV2YWx1YXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImV2YWx1YXRvciIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRHZXR0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJnZXR0ZXIiIHR5cGU9ImphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQcm9wZXJ0eU5hbWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9wZXJ0eU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2V0dGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2V0dGVyIiB0eXBlPSJqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VmFsdWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJULi4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlJHQkV2YWx1YXRvciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJSR0JFdmFsdWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uUkdCRXZhbHVhdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImV2YWx1YXRlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTZXF1ZW5jZXIiCisgZXh0ZW5kcz0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU2VxdWVuY2VyIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlNlcXVlbmNlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRDaGlsZEFuaW1hdGlvbnMiCisgcmV0dXJuPSJqYXZhLnV0aWwuQXJyYXlMaXN0Jmx0O2FuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzUnVubmluZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGxheSIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLlNlcXVlbmNlci5CdWlsZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBsYXlTZXF1ZW50aWFsbHkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZXF1ZW5jZUl0ZW1zIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlLi4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBsYXlUb2dldGhlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlcXVlbmNlSXRlbXMiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGFyZ2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFyZ2V0IiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNlcXVlbmNlci5CdWlsZGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iYWZ0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFmdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVsYXkiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmVmb3JlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbSIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ3aXRoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbSIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iVHlwZUV2YWx1YXRvciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImV2YWx1YXRlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0VmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQuYXBwIgogPgorPGNsYXNzIG5hbWU9IkFjdGlvbkJhciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBY3Rpb25CYXIiCisgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZFRhYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFiIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuVGFiIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEN1c3RvbU5hdmlnYXRpb25WaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREaXNwbGF5T3B0aW9ucyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEhlaWdodCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN1YnRpdGxlIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRpdGxlIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImhpZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW5zZXJ0VGFiIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWIiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNTaG93aW5nIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5ld1RhYiIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVUYWIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhYiIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVUYWJBdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZWxlY3RUYWIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhYiIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCYWNrZ3JvdW5kRHJhd2FibGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImQiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERpc3BsYXlPcHRpb25zIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcHRpb25zIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RGlzcGxheU9wdGlvbnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9wdGlvbnMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWFzayIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlNwaW5uZXJBZGFwdGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLk5hdmlnYXRpb25DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREcm9wZG93bk5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5TcGlubmVyQWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5OYXZpZ2F0aW9uQ2FsbGJhY2siPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3VidGl0bGUiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGl0bGVSZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdWJ0aXRsZVJlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGl0bGUiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGl0bGVSZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3VidGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN1YnRpdGxlIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN1YnRpdGxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRhYk5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRhYk5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXJWaWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUaXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGl0bGUiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvdyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkRJU1BMQVlfSElERV9IT01FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJESVNQTEFZX1VTRV9MT0dPIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOQVZJR0FUSU9OX01PREVfQ1VTVE9NIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOQVZJR0FUSU9OX01PREVfVEFCUyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJBY3Rpb25CYXIuTmF2aWdhdGlvbkNhbGxiYWNrIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbk5hdmlnYXRpb25JdGVtU2VsZWN0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW1Qb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtSWQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IkFjdGlvbkJhci5UYWIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBY3Rpb25CYXIuVGFiIgorIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0RnJhZ21lbnQiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEljb24iCisgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UG9zaXRpb24iCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUZXh0IgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNlbGVjdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRGcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEljb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imljb24iIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGV4dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IklOVkFMSURfUE9TSVRJT04iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQWN0aXZpdHkiCiAgZXh0ZW5kcz0iYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXIiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyMTIsNiArMjE5MzUsMzIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZXYiIHR5cGU9ImFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmaW5kRnJhZ21lbnRCeUlkIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmaW5kRnJhZ21lbnRCeVRhZyIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJmaW5kVmlld0J5SWQiCiAgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTI3Nyw2ICsyMjAyNiwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJjaGlsZCIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aXZpdHkiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QWN0aW9uQmFyIgorIHJldHVybj0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEFwcGxpY2F0aW9uIgogIHJldHVybj0iYW5kcm9pZC5hcHAuQXBwbGljYXRpb24iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkzNDMsNiArMjIxMDMsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RnJhZ21lbnRNYW5hZ2VyIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEluc3RhbmNlQ291bnQiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5Mzg3LDYgKzIyMTU4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExvYWRlck1hbmFnZXIiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5Mb2FkZXJNYW5hZ2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldExvY2FsQ2xhc3NOYW1lIgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTUyMSw2ICsyMjMwMywyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnZhbGlkYXRlT3B0aW9uc01lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzQ2hhbmdpbmdDb25maWd1cmF0aW9ucyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNDaGlsZCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk1NjEsNyArMjIzNjUsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgpAQCAtMTk2MDUsNiArMjI0MDksMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkF0dGFjaEZyYWdtZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uQXR0YWNoZWRUb1dpbmRvdyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjAxOTEsNiArMjMwMDgsMTkgQEAKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TdGFydEFjdGlvbk1vZGUiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uU3RvcCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjAzMDQsNiArMjMxMzQsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3BlbkZyYWdtZW50VHJhbnNhY3Rpb24iCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib3Blbk9wdGlvbnNNZW51IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDMzMCw2ICsyMzE3MSw0NyBAQAogPHBhcmFtZXRlciBuYW1lPSJleGl0QW5pbSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvcEJhY2tTdGFjayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb3BCYWNrU3RhY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9wQmFja1N0YWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InJlZ2lzdGVyRm9yQ29udGV4dE1lbnUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNzIxLDYgKzIzNjAzLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aW9uTW9kZSIKKyByZXR1cm49ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUuQ2FsbGJhY2siPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpdml0eUZvclJlc3VsdCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA3NTMsNiArMjM2NDgsMjMgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvZGUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEFjdGl2aXR5RnJvbUZyYWdtZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpdml0eUlmTmVlZGVkIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDgyNyw3ICsyMzczOSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgpAQCAtMjA4NzIsNyArMjM3ODQsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KQEAgLTIwOTg1LDYgKzIzODk3LDE3IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQT1BfQkFDS19TVEFDS19JTkNMVVNJVkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlJFU1VMVF9DQU5DRUxFRCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIzNzA4LDYgKzI2NjMxLDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QWN0aW9uQmFyIgorIHJldHVybj0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldENvbnRleHQiCiAgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMzc4NSw2ICsyNjcxOSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnZhbGlkYXRlT3B0aW9uc01lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzU2hvd2luZyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjQxNDYsNiArMjcwOTEsMTkgQEAKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TdGFydEFjdGlvbk1vZGUiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uU3RvcCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjQ1NTQsNiArMjc1MTIsMjUxIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJEaWFsb2dGcmFnbWVudCIKKyBleHRlbmRzPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZS5PbkNhbmNlbExpc3RlbmVyIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UuT25EaXNtaXNzTGlzdGVuZXIiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkRpYWxvZ0ZyYWdtZW50IgorIHR5cGU9ImFuZHJvaWQuYXBwLkRpYWxvZ0ZyYWdtZW50IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImRpc21pc3MiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENhbmNlbGFibGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldERpYWxvZyIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkRpYWxvZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTaG93c0RpYWxvZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGhlbWUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DYW5jZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkaWFsb2ciIHR5cGU9ImFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVEaWFsb2ciCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5EaWFsb2ciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNhdmVkSW5zdGFuY2VTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EaXNtaXNzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGlhbG9nIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENhbmNlbGFibGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYW5jZWxhYmxlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNob3dzRGlhbG9nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2hvd3NEaWFsb2ciIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3R5bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdHlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVtZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3ciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFjdGl2aXR5IiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpdml0eSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3ciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtYW5hZ2VyIiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2FjdGlvbiIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iU1RZTEVfTk9STUFMIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVFlMRV9OT19GUkFNRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RZTEVfTk9fSU5QVVQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUWUxFX05PX1RJVExFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iRXhwYW5kYWJsZUxpc3RBY3Rpdml0eSIKICBleHRlbmRzPSJhbmRyb2lkLmFwcC5BY3Rpdml0eSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNDcxMyw2ICsyNzkxNiwxMDY4IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJGcmFnbWVudCIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50Q2FsbGJhY2tzIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iRnJhZ21lbnQiCisgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZXF1YWxzIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFjdGl2aXR5IgorIHJldHVybj0iYW5kcm9pZC5hcHAuQWN0aXZpdHkiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBcmd1bWVudHMiCisgcmV0dXJuPSJhbmRyb2lkLm9zLkJ1bmRsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEZyYWdtZW50TWFuYWdlciIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldElkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TG9hZGVyTWFuYWdlciIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkxvYWRlck1hbmFnZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UmV0YWluSW5zdGFuY2UiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGFnIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRhcmdldEZyYWdtZW50IgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUYXJnZXRSZXF1ZXN0Q29kZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNoQ29kZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imluc3RhbnRpYXRlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imluc3RhbnRpYXRlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0FkZGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzSGlkZGVuIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzUmVzdW1lZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1Zpc2libGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BY3Rpdml0eUNyZWF0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzYXZlZEluc3RhbmNlU3RhdGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQWN0aXZpdHlSZXN1bHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZXN1bHRDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BdHRhY2giCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3Rpdml0eSIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aXZpdHkiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Db25maWd1cmF0aW9uQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld0NvbmZpZyIgdHlwZT0iYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ29udGV4dEl0ZW1TZWxlY3RlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQudmlldy5NZW51SXRlbSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNhdmVkSW5zdGFuY2VTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVBbmltYXRhYmxlIgorIHJldHVybj0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbnRlciIgdHlwZT0iYm9vbGVhbiI+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+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmUiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZXBsYWNlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXJWaWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlcGxhY2UiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lclZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDdXN0b21BbmltYXRpb25zIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbnRlciIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJleGl0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VHJhbnNpdGlvbiIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRyYW5zaXRpb25TdHlsZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3R5bGVSZXMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93IgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX0VOVEVSX01BU0siCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0MDk2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfRVhJVF9NQVNLIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iODE5MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX0ZSQUdNRU5UX0NMT1NFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iODE5NCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX0ZSQUdNRU5UX09QRU4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0MDk3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfTk9ORSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9VTlNFVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0xIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iSW5zdHJ1bWVudGF0aW9uIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjYxNjIsNiArMzA0MjcsMzczIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJMaXN0RnJhZ21lbnQiCisgZXh0ZW5kcz0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMaXN0RnJhZ21lbnQiCisgdHlwZT0iYW5kcm9pZC5hcHAuTGlzdEZyYWdtZW50IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldExpc3RBZGFwdGVyIgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TGlzdFZpZXciCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5MaXN0VmlldyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3RlZEl0ZW1JZCIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24iCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25MaXN0SXRlbUNsaWNrIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibCIgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdFZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InYiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFbXB0eVRleHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldExpc3RBZGFwdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TGlzdFNob3duIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2hvd24iIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TGlzdFNob3duTm9BbmltYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzaG93biIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJMb2FkZXJNYW5hZ2VyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iZ2V0TG9hZGVyIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImluaXRMb2FkZXIiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC5hcHAuTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3MmbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVzdGFydExvYWRlciIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLmFwcC5Mb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrcyZsdDtEJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdG9wTG9hZGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxpbnRlcmZhY2UgbmFtZT0iTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3MiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlTG9hZGVyIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkxvYWRGaW5pc2hlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9hZGVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJEIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJMb2FkZXJNYW5hZ2luZ0ZyYWdtZW50IgorIGV4dGVuZHM9ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXIuT25Mb2FkQ29tcGxldGVMaXN0ZW5lciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iTG9hZGVyTWFuYWdpbmdGcmFnbWVudCIKKyB0eXBlPSJhbmRyb2lkLmFwcC5Mb2FkZXJNYW5hZ2luZ0ZyYWdtZW50IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldExvYWRlciIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVMb2FkZXIiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uSW5pdGlhbGl6ZUxvYWRlcnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Mb2FkQ29tcGxldGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxvYWRlciIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iRCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkxvYWRGaW5pc2hlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9hZGVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJEIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0TG9hZGluZyIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0b3BMb2FkaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJMb2NhbEFjdGl2aXR5TWFuYWdlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI2NjQ1LDYgKzMxMjc3LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGTEFHX0hJR0hfUFJJT1JJVFkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMjgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iRkxBR19JTlNJU1RFTlQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yOTg3NSw2ICszNDUxOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVVNFU19QT0xJQ1lfU0VUU19HTE9CQUxfUFJPWFkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlVTRVNfUE9MSUNZX1dBVENIX0xPR0lOIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzAxNjQsNiArMzQ4MTgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0R2xvYmFsUHJveHlBZG1pbiIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldE1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwMTkwLDYgKzM0ODU1LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1heGltdW1MZW5ndGgiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzAyMTYsNiArMzQ4OTQsODQgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkTWluaW11bUxldHRlcnMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1pbmltdW1OdW1lcmljIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkUXVhbGl0eSIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDI5Miw2ICszNTA0OCwyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEdsb2JhbFByb3h5IgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJveHlTcGVjIiB0eXBlPSJqYXZhLm5ldC5Qcm94eSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXhjbHVzaW9uTGlzdCIgdHlwZT0iamF2YS51dGlsLkxpc3QmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwMzIyLDYgKzM1MDk1LDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9InRpbWVNcyIgdHlwZT0ibG9uZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bUxlbmd0aCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzAzMzcsNiArMzUxMjUsOTYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bU51bWVyaWMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRRdWFsaXR5IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDQzMSw2ICszNTMwOSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMzkzMjE2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTMxNDE0LDYgKzM2MzAzLDY2IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFwcFdpZGdldElkcyIgdHlwZT0iaW50W10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFwcFdpZGdldElkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBhcnRpYWxseVVwZGF0ZUFwcFdpZGdldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFwcFdpZGdldElkcyIgdHlwZT0iaW50W10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdzIiB0eXBlPSJhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcHBXaWRnZXRJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3cyIgdHlwZT0iYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idXBkYXRlQXBwV2lkZ2V0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNDAyNSw2ICszODk3NCw3MSBAQAogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBc3luY1Rhc2tMb2FkZXIiCisgZXh0ZW5kcz0iYW5kcm9pZC5jb250ZW50LkxvYWRlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQXN5bmNUYXNrTG9hZGVyIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5Bc3luY1Rhc2tMb2FkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImNhbmNlbExvYWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZvcmNlTG9hZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEluQmFja2dyb3VuZCIKKyByZXR1cm49IkQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNhbmNlbGxlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9IkQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQnJvYWRjYXN0UmVjZWl2ZXIiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0MjU1LDYgKzM5MjY5LDU3MSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQ2xpcERhdGEiCisgZXh0ZW5kcz0iYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNsaXBEYXRhIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWNvbiIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YS5JdGVtIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYWRkSXRlbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YS5JdGVtIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEljb24iCisgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJdGVtIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhLkl0ZW0iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SXRlbUNvdW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5ld0ludGVudCIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWNvbiIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXdQbGFpblRleHQiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGFiZWwiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imljb24iIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5ld1Jhd1VyaSIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWNvbiIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5ld1VyaSIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXNvbHZlciIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGFiZWwiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imljb24iIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkNSRUFUT1IiCisgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3IiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkNsaXBEYXRhLkl0ZW0iCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ2xpcERhdGEuSXRlbSIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEuSXRlbSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNsaXBEYXRhLkl0ZW0iCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhLkl0ZW0iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNsaXBEYXRhLkl0ZW0iCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhLkl0ZW0iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ2xpcERhdGEuSXRlbSIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEuSXRlbSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJjb2VyY2VUb1RleHQiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbnRlbnQiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRleHQiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFVyaSIKKyByZXR1cm49ImFuZHJvaWQubmV0LlVyaSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJDbGlwRGVzY3JpcHRpb24iCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDbGlwRGVzY3JpcHRpb24iCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ2xpcERlc2NyaXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iY29tcGFyZU1pbWVUeXBlcyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29uY3JldGVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZXNpcmVkVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXNjcmliZUNvbnRlbnRzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZpbHRlck1pbWVUeXBlcyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TGFiZWwiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE1pbWVUeXBlIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRNaW1lVHlwZUNvdW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc01pbWVUeXBlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVUb1BhcmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRlc3QiIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQ1JFQVRPUiIKKyB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvciIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNSU1FVFlQRV9URVhUX0lOVEVOVCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDt0ZXh0L3ZuZC5hbmRyb2lkLmludGVudCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNSU1FVFlQRV9URVhUX1BMQUlOIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3RleHQvcGxhaW4mcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTUlNRVRZUEVfVEVYVF9VUklMSVNUIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3RleHQvdXJpLWxpc3QmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkNsaXBib2FyZE1hbmFnZXIiCisgZXh0ZW5kcz0iYW5kcm9pZC50ZXh0LkNsaXBib2FyZE1hbmFnZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iYWRkUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ3aGF0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcGJvYXJkTWFuYWdlci5PblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByaW1hcnlDbGlwIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByaW1hcnlDbGlwRGVzY3JpcHRpb24iCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRleHQiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzUHJpbWFyeUNsaXAiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc1RleHQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ3aGF0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcGJvYXJkTWFuYWdlci5PblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFByaW1hcnlDbGlwIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2xpcCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRleHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkNsaXBib2FyZE1hbmFnZXIuT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25QcmltYXJ5Q2xpcENoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGludGVyZmFjZSBuYW1lPSJDb21wb25lbnRDYWxsYmFja3MiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTM0NjI4LDYgKzQwMjA3LDIxIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0cmVhbVR5cGVzIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGVGaWx0ZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDc2NCw2ICs0MDM1OCw0OCBAQAogPGV4Y2VwdGlvbiBuYW1lPSJGaWxlTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5QaXBlSGVscGVyIgorIHJldHVybj0iYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvcHRzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iVCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnVuYyIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlci5QaXBlRGF0YVdyaXRlciZsdDtUJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iRmlsZU5vdEZvdW5kRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuVHlwZWRBc3NldEZpbGUiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZUZpbHRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0cyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icXVlcnkiCiAgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0ODI0LDYgKzQwNDYwLDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9InBlcm1pc3Npb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2h1dGRvd24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVwZGF0ZSIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0ODQ0LDYgKzQwNDkxLDM1IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQ29udGVudFByb3ZpZGVyLlBpcGVEYXRhV3JpdGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJ3cml0ZURhdGFUb1BpcGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im91dHB1dCIgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvcHRzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iVCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iQ29udGVudFByb3ZpZGVyQ2xpZW50IgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzQ5MTYsNiArNDA1OTIsMjMgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3RyZWFtVHlwZXMiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVybCIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZUZpbHRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iUmVtb3RlRXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNDk4Niw2ICs0MDY3OSwyNyBAQAogPGV4Y2VwdGlvbiBuYW1lPSJSZW1vdGVFeGNlcHRpb24iIHR5cGU9ImFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvcHRzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iRmlsZU5vdEZvdW5kRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzxleGNlcHRpb24gbmFtZT0iUmVtb3RlRXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJxdWVyeSIKICByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM1NzU2LDYgKzQxNDcwLDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9ImF1dGhvcml0eSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdHJlYW1UeXBlcyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJsIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlRmlsdGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFN5bmNBZGFwdGVyVHlwZXMiCiAgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuU3luY0FkYXB0ZXJUeXBlW10iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzU5NTMsNiArNDE2ODIsMjUgQEAKIDxleGNlcHRpb24gbmFtZT0iRmlsZU5vdEZvdW5kRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0cyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icXVlcnkiCiAgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNjYxOCw2ICs0MjM2NiwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ia2V5U2V0IgorIHJldHVybj0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwdXQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM3NjY4LDYgKzQzNDI3LDI1IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3Blbk9yQ3JlYXRlRGF0YWJhc2UiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9ySGFuZGxlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwZWVrV2FsbHBhcGVyIgogIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM5MTA2LDYgKzQ0ODg0LDI1IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3Blbk9yQ3JlYXRlRGF0YWJhc2UiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icGVla1dhbGxwYXBlciIKICByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzk0MzIsNiArNDUyMjksMjI1IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJDdXJzb3JMb2FkZXIiCisgZXh0ZW5kcz0iYW5kcm9pZC5jb250ZW50LkFzeW5jVGFza0xvYWRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkN1cnNvckxvYWRlciIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ3Vyc29yTG9hZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwcm9qZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzb3J0T3JkZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJkZWxpdmVyUmVzdWx0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY3Vyc29yIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXN0cm95IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQcm9qZWN0aW9uIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGlvbiIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0aW9uQXJncyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTb3J0T3JkZXIiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFVyaSIKKyByZXR1cm49ImFuZHJvaWQubmV0LlVyaSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb2FkSW5CYWNrZ3JvdW5kIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DYW5jZWxsZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3IiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFByb2plY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9qZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2VsZWN0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNlbGVjdGlvbkFyZ3MiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb25BcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U29ydE9yZGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic29ydE9yZGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFVyaSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0TG9hZGluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RvcExvYWRpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGludGVyZmFjZSBuYW1lPSJEaWFsb2dJbnRlcmZhY2UiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTM5NzkzLDYgKzQ1ODA5LDkzIEBACiA+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLm9zLklJbnRlcmZhY2UiPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJkaXNwYXRjaFByaW1hcnlDbGlwQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iUmVtb3RlRXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuU3R1YiIKKyBleHRlbmRzPSJhbmRyb2lkLm9zLkJpbmRlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuY29udGVudC5JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuU3R1YiIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuU3R1YiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhc0JpbmRlciIKKyByZXR1cm49ImFuZHJvaWQub3MuSUJpbmRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhc0ludGVyZmFjZSIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvYmoiIHR5cGU9ImFuZHJvaWQub3MuSUJpbmRlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblRyYW5zYWN0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVwbHkiIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJSZW1vdGVFeGNlcHRpb24iIHR5cGU9ImFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkludGVudCIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTQyMDExLDYgKzQ4MTE0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJBQ1RJT05fUEFTVEUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YW5kcm9pZC5pbnRlbnQuYWN0aW9uLlBBU1RFJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkFDVElPTl9QSUNLIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQyMzUyLDYgKzQ4NDY2LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDQVRFR09SWV9BUFBfTUFSS0VUIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkFQUF9NQVJLRVQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iQ0FURUdPUllfQlJPV1NBQkxFIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQ0NDA5LDYgKzUwNTM0LDE4MyBAQAogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJMb2FkZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTG9hZGVyIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImRlbGl2ZXJSZXN1bHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJEIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlc3Ryb3kiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZm9yY2VMb2FkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENvbnRleHQiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJZCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNvbnRlbnRDaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWdpc3Rlckxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXIuT25Mb2FkQ29tcGxldGVMaXN0ZW5lciZsdDtEJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydExvYWRpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RvcExvYWRpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idW5yZWdpc3Rlckxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXIuT25Mb2FkQ29tcGxldGVMaXN0ZW5lciZsdDtEJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJMb2FkZXIuRm9yY2VMb2FkQ29udGVudE9ic2VydmVyIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMb2FkZXIuRm9yY2VMb2FkQ29udGVudE9ic2VydmVyIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXIuRm9yY2VMb2FkQ29udGVudE9ic2VydmVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJMb2FkZXIuT25Mb2FkQ29tcGxldGVMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25Mb2FkQ29tcGxldGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxvYWRlciIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iRCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iTXV0YWJsZUNvbnRleHRXcmFwcGVyIgogIGV4dGVuZHM9ImFuZHJvaWQuY29udGVudC5Db250ZXh0V3JhcHBlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC00NDk0OCw2ICs1MTI1MCwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJkZWZWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdHJpbmdTZXQiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmVmFsdWVzIiB0eXBlPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InJlZ2lzdGVyT25TaGFyZWRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtNDUwOTAsNiArNTE0MDcsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icHV0U3RyaW5nU2V0IgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzLkVkaXRvciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZW1vdmUiCiAgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtNDU4MDcsNiArNTIxMzksMTQ1IEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJYbWxEb2N1bWVudFByb3ZpZGVyIgorIGV4dGVuZHM9ImFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJYbWxEb2N1bWVudFByb3ZpZGVyIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5YbWxEb2N1bWVudFByb3ZpZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImRlbGV0ZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJlc291cmNlWG1sUHVsbFBhcnNlciIKKyByZXR1cm49Im9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc291cmNlVXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFVyaVhtbFB1bGxQYXJzZXIiCisgcmV0dXJuPSJvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW5zZXJ0IgorIHJldHVybj0iYW5kcm9pZC5uZXQuVXJpIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icXVlcnkiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByb2plY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb25BcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNvcnRPcmRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQuY29udGVudC5wbSIKID4KQEAgLTQ2MDcyLDYgKzUyNTQzLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAyNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGTEFHX0lNTUVSU0lWRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjUxMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJGTEFHX01VTFRJUFJPQ0VTUyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTUzNTI0LDYgKzYwMDE3LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbiIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFVwZGF0ZWRGaWVsZCIKICByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTM1MzEsNyArNjAwMzcsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTM1OTksNyArNjAxMDUsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTM4ODUsNyArNjAzOTEsNyBAQAogIHZvbGF0aWxlPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvZmllbGQ+CkBAIC01NDAyMSw3ICs2MDUyNyw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CkBAIC01NDAzNCw3ICs2MDU0MCw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CkBAIC01NDA0Nyw3ICs2MDU1Myw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CkBAIC01NDA3Myw3ICs2MDU3OSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CkBAIC01NDU0Nyw2ICs2MTA1MywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRXYW50c0FsbE9uTW92ZUNhbGxzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTU0Nzg3LDYgKzYxMzA2LDYxIEBACiA8cGFyYW1ldGVyIG5hbWU9Im9ic2VydmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkZJRUxEX1RZUEVfQkxPQiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRklFTERfVFlQRV9GTE9BVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRklFTERfVFlQRV9JTlRFR0VSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGSUVMRF9UWVBFX05VTEwiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZJRUxEX1RZUEVfU1RSSU5HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkN1cnNvckluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iCiAgZXh0ZW5kcz0iamF2YS5sYW5nLkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iCkBAIC01NTE0NCw2ICs2MTcxOCwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2wiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyb3ciIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNCbG9iIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NTE1MSw3ICs2MTc0MCw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0icm93IiB0eXBlPSJpbnQiPgpAQCAtNTUxNjYsNyArNjE3NTUsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InJvdyIgdHlwZT0iaW50Ij4KQEAgLTU1MTgxLDcgKzYxNzcwLDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJyb3ciIHR5cGU9ImludCI+CkBAIC01NTE5Niw3ICs2MTc4NSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0icm93IiB0eXBlPSJpbnQiPgpAQCAtNTUyMTEsNyArNjE4MDAsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InJvdyIgdHlwZT0iaW50Ij4KQEAgLTU1NjIyLDYgKzYyMjExLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRXYW50c0FsbE9uTW92ZUNhbGxzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NTYzMyw2ICs2MjIzNSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRXcmFwcGVkQ3Vyc29yIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNBZnRlckxhc3QiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU1OTQxLDYgKzYyNTU0LDI3IEBACiA+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkRhdGFiYXNlRXJyb3JIYW5kbGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25Db3JydXB0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYk9iaiIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkRhdGFiYXNlVXRpbHMiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NTk3Miw2ICs2MjYwNiwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJzcWxTdHJpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYXBwZW5kU2VsZWN0aW9uQXJncyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbFZhbHVlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdWYWx1ZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJhcHBlbmRWYWx1ZVRvU3FsIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NjAwNCw2ICs2MjY1MywzOCBAQAogPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJibG9iRmlsZURlc2NyaXB0b3JGb3JRdWVyeSIKKyByZXR1cm49ImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJxdWVyeSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJsb2JGaWxlRGVzY3JpcHRvckZvclF1ZXJ5IgorIHJldHVybj0iYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9nIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVTdGF0ZW1lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjcmVhdGVEYkZyb21TcWxTdGF0ZW1lbnRzIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NjQ0MSw2ICs2MzEyMiwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNxbFN0YXRlbWVudFR5cGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImxvbmdGb3JRdWVyeSIKICByZXR1cm49ImxvbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTY2MjcsNiArNjMzMjEsODMgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iamF2YS5sYW5nLkV4Y2VwdGlvbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IlNUQVRFTUVOVF9BQk9SVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX0FUVEFDSCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX0JFR0lOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVEFURU1FTlRfQ09NTUlUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVEFURU1FTlRfT1RIRVIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFTUVOVF9TRUxFQ1QiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFTUVOVF9VUERBVEUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJEYXRhYmFzZVV0aWxzLkluc2VydEhlbHBlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpAQCAtNTY4NjEsNiArNjM2MzIsMzggQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlciIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJvbkNvcnJ1cHRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYk9iaiIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTWF0cml4Q3Vyc29yIgogIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2UuQWJzdHJhY3RDdXJzb3IiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTczNDQsNiArNjQxNDcsMTE0IEBACiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iU1FMaXRlQ2xvc2FibGUiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTU3NDU1LDcgKzY0MzY2LDcgQEAKICB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDdXJzb3IiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImRiIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSI+CkBAIC01NzQ2Nyw2ICs2NDM3OCwyMCBAQAogPHBhcmFtZXRlciBuYW1lPSJxdWVyeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlUXVlcnkiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUN1cnNvciIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDdXJzb3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkcml2ZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUN1cnNvckRyaXZlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZWRpdFRhYmxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJxdWVyeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlUXVlcnkiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJnZXRDb2x1bW5OYW1lcyIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NzYwNCw2ICs2NDUyOSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NzYxNyw2ICs2NDU1MywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2FjdGlvbkxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJlZ2luVHJhbnNhY3Rpb25XaXRoTGlzdGVuZXJOb25FeGNsdXNpdmUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2FjdGlvbkxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNsb3NlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NzY3Myw2ICs2NDYyMiwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJ3aGVyZUFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmFibGVXcml0ZUFoZWFkTG9nZ2luZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJlbmRUcmFuc2FjdGlvbiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTc3MjksNiArNjQ2ODksMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idGFibGVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEF0dGFjaGVkRGJzIgorIHJldHVybj0iamF2YS51dGlsLkFycmF5TGlzdCZsdDthbmRyb2lkLnV0aWwuUGFpciZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nJmd0OyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0TWF4aW11bVNpemUiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3NzY5LDcgKzY0NzQwLDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+CkBAIC01Nzg1MCw2ICs2NDgyMSwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJjb25mbGljdEFsZ29yaXRobSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzRGF0YWJhc2VJbnRlZ3JpdHlPayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTc5MDEsNyArNjQ4ODMsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InRhYmxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KQEAgLTU3OTE2LDcgKzY0ODk4LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJ0YWJsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CkBAIC01Nzk2Nyw2ICs2NDk0OSwyNSBAQAogPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5EYXRhYmFzZSIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9ySGFuZGxlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvcGVuT3JDcmVhdGVEYXRhYmFzZSIKICByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3OTk3LDYgKzY0OTk4LDIzIEBACiA8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3Blbk9yQ3JlYXRlRGF0YWJhc2UiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icXVlcnkiCiAgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODE5MCw2ICs2NTIwOCwxOSBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENvbm5lY3Rpb25Qb29sU2l6ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2l6ZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldExvY2FsZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTgyMTYsNiArNjUyNDcsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibG9ja2luZ0VuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TWF4U3FsQ2FjaGVTaXplIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYWNoZVNpemUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRNYXhpbXVtU2l6ZSIKICByZXR1cm49ImxvbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTg0MTgsNiArNjU0NjIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik1BWF9TUUxfQ0FDSEVfU0laRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJOT19MT0NBTElaRURfQ09MTEFUT1JTIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNTg1MTcsNiArNjU1NzIsNjAgQEAKIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbiIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlNRTGl0ZURpc2tJT0V4Y2VwdGlvbiIKICBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTg2NzYsNiArNjU3ODUsMjQgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmVyc2lvbiIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVPcGVuSGVscGVyIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU9wZW5IZWxwZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVyc2lvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJjbG9zZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTg3NTMsNiArNjU4ODAsMzMgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlNRTGl0ZVByb2dyYW0iCiAgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ2xvc2FibGUiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC01ODc2MSw2ICs2NTkxNSwxOSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxtZXRob2QgbmFtZT0iYmluZEFsbEFyZ3NBc1N0cmluZ3MiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJiaW5kQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImJpbmRCbG9iIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODg3OCw3ICs2NjA0NSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+CkBAIC01OTMwMSw2ICs2NjQ2OCwzMyBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbiIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlNRTGl0ZVN0YXRlbWVudCIKICBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVQcm9ncmFtIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU5MzMxLDYgKzY2NTI1LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImV4ZWN1dGVVcGRhdGVEZWxldGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2ltcGxlUXVlcnlGb3JCbG9iRmlsZURlc2NyaXB0b3IiCisgcmV0dXJuPSJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNpbXBsZVF1ZXJ5Rm9yTG9uZyIKICByZXR1cm49ImxvbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTkzNTQsNiArNjY1NzAsMzMgQEAKID4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbiIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxpbnRlcmZhY2UgbmFtZT0iU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtNjI1NTEsMTYgKzY5Nzk0LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYml0bWFwIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iQ2FudmFzIgotIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZ2wiIHR5cGU9ImphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMIj4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iY2xpcFBhdGgiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTYzMzM0LDcgKzcwNTY3LDcgQEAKIDxtZXRob2QgbmFtZT0iZHJhd1RleHQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgpAQCAtNjM0NzcsMTcgKzcwNzEwLDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icGFpbnQiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZnJlZUdsQ2FjaGVzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldENsaXBCb3VuZHMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTYzNTQxLDggKzcwNzYzLDggQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRIZWlnaHQiCkBAIC02MzYwMiw2ICs3MDgyNCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0hhcmR3YXJlQWNjZWxlcmF0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzT3BhcXVlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC02MzkwOCwyMSArNzExNDEsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJtYXRyaXgiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldFZpZXdwb3J0IgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0id2lkdGgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iaGVpZ2h0IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2tldyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNjczMjAsNyArNzQ1MzgsNyBAQAogPG1ldGhvZCBuYW1lPSJzZXRTaGFkb3dMYXllciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCkBAIC03MzI4Nyw2ICs4MDUwNSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb21wdXRlQ29uc3RhbnRTaXplIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTc0MTgxLDYgKzgxNDEwLDM2IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJNaXBtYXBEcmF3YWJsZSIKKyBleHRlbmRzPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlQ29udGFpbmVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTWlwbWFwRHJhd2FibGUiCisgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5NaXBtYXBEcmF3YWJsZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhZGREcmF3YWJsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRyYXdhYmxlIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ik5pbmVQYXRjaERyYXdhYmxlIgogIGV4dGVuZHM9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNzg0NzEsNyArODU3MzAsNyBAQAogIHR5cGU9ImZsb2F0IgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIwLjAwMTBmIgorIHZhbHVlPSIwLjAwMWYiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtODAzNTMsNiArODc2MTIsMjQgQEAKIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJtb2RlSWQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0id2lkdGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaGVpZ2h0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IktleWJvYXJkIgorIHR5cGU9ImFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLktleWJvYXJkIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InhtbExheW91dFJlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGVJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KIDxjb25zdHJ1Y3RvciBuYW1lPSJLZXlib2FyZCIKICB0eXBlPSJhbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5LZXlib2FyZCIKQEAgLTkyMTg0LDYgKzk5NDYxLDI1IEBACiA8cGFyYW1ldGVyIG5hbWU9InByb2ZpbGUiIHR5cGU9ImFuZHJvaWQubWVkaWEuQ2FtY29yZGVyUHJvZmlsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUaW1lTGFwc2VQYXJhbWV0ZXJzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlVGltZUxhcHNlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1c2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVNcyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmNvZGVyTGV2ZWwiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRWaWRlb0VuY29kZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTk3NjkzLDcgKzEwNDk4OSw3IEBACiAgdHlwZT0iYW5kcm9pZC5uZXQuU1NMQ2VydGlmaWNhdGVTb2NrZXRGYWN0b3J5IgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJoYW5kc2hha2VUaW1lb3V0TWlsbGlzIiB0eXBlPSJpbnQiPgpAQCAtOTgxNjgsNiArMTA1NDY0LDIxIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEJvb2xlYW5RdWVyeVBhcmFtZXRlciIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmYXVsdFZhbHVlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEVuY29kZWRBdXRob3JpdHkiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtOTgzMjQsNiArMTA1NjM1LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRRdWVyeVBhcmFtZXRlck5hbWVzIgorIHJldHVybj0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRRdWVyeVBhcmFtZXRlcnMiCiAgcmV0dXJuPSJqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC05ODU3MCw2ICsxMDU4OTIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2xlYXJRdWVyeSIKKyByZXR1cm49ImFuZHJvaWQubmV0LlVyaS5CdWlsZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImVuY29kZWRBdXRob3JpdHkiCiAgcmV0dXJuPSJhbmRyb2lkLm5ldC5VcmkuQnVpbGRlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC05OTc5Myw3ICsxMDcxMjYsNyBAQAogIHR5cGU9ImFuZHJvaWQubmV0Lmh0dHAuU3NsQ2VydGlmaWNhdGUiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9Imlzc3VlZFRvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KQEAgLTk5ODYwLDcgKzEwNzE5Myw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgpAQCAtOTk4ODIsNyArMTA3MjE1LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+CkBAIC0xMjE2OTksNiArMTI5MDMyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJIT05FWUNPTUIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDAwMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQnVuZGxlIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0xMjc3MzQsNiArMTM1MDc4LDE5IEBACiA8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNyZWF0ZVBpcGUiCisgcmV0dXJuPSJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZGVzY3JpYmVDb250ZW50cyIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMjc3NDUsNiArMTM1MTAyLDIzIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZyb21EYXRhIgorIHJldHVybj0iYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJieXRlW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImZyb21Tb2NrZXQiCiAgcmV0dXJuPSJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEyOTY0NCw2ICsxMzcwMTgsNTMgQEAKIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQub3Muc3RvcmFnZSIKID4KKzxjbGFzcyBuYW1lPSJTdG9yYWdlRXZlbnRMaXN0ZW5lciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTdG9yYWdlRXZlbnRMaXN0ZW5lciIKKyB0eXBlPSJhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZUV2ZW50TGlzdGVuZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ib25TdG9yYWdlU3RhdGVDaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib2xkU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld1N0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uVXNiTWFzc1N0b3JhZ2VDb25uZWN0aW9uQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbm5lY3RlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTdG9yYWdlTWFuYWdlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEyOTY1Miw2ICsxMzcwNzMsMjggQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8bWV0aG9kIG5hbWU9ImRpc2FibGVVc2JNYXNzU3RvcmFnZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5hYmxlVXNiTWFzc1N0b3JhZ2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldE1vdW50ZWRPYmJQYXRoIgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMjk2ODAsNiArMTM3MTIzLDI4IEBACiA8ZXhjZXB0aW9uIG5hbWU9IklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1VzYk1hc3NTdG9yYWdlQ29ubmVjdGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1VzYk1hc3NTdG9yYWdlRW5hYmxlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibW91bnRPYmIiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEyOTY5NSw2ICsxMzcxNjAsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlZ2lzdGVyTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VFdmVudExpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVubW91bnRPYmIiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEyOTcxMiw2ICsxMzcxOTAsMTI0IEBACiA8ZXhjZXB0aW9uIG5hbWU9IklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1bnJlZ2lzdGVyTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VFdmVudExpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlN0b3JhZ2VSZXN1bHRDb2RlIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTdG9yYWdlUmVzdWx0Q29kZSIKKyB0eXBlPSJhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZVJlc3VsdENvZGUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWRJbnRlcm5hbEVycm9yIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkTWVkaWFCbGFuayIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0zIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZE1lZGlhQ29ycnVwdCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii00IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZE5vTWVkaWEiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWRTdG9yYWdlQnVzeSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii03IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZFN0b3JhZ2VNb3VudGVkIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkU3RvcmFnZU5vdE1vdW50ZWQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25TdWNjZWVkZWQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQucHJlZmVyZW5jZSIKQEAgLTEzMDUwNyw2ICsxMzgxMDMsMTQ4IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIgorIGV4dGVuZHM9ImFuZHJvaWQucHJlZmVyZW5jZS5EaWFsb2dQcmVmZXJlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZmluZEluZGV4T2ZWYWx1ZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RW50cmllcyIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRFbnRyeVZhbHVlcyIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWYWx1ZXMiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVudHJpZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbnRyaWVzIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RW50cmllcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVudHJpZXNSZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVudHJ5VmFsdWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW50cnlWYWx1ZXMiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFbnRyeVZhbHVlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVudHJ5VmFsdWVzUmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iUHJlZmVyZW5jZSIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEzMDYyNSw2ICsxMzgzNjMsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RXh0cmFzIgorIHJldHVybj0iYW5kcm9pZC5vcy5CdW5kbGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RnJhZ21lbnQiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEludGVudCIKICByZXR1cm49ImFuZHJvaWQuY29udGVudC5JbnRlbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMxMDU3LDYgKzEzODgxNywxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJkZWZhdWx0VmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGVla0V4dHJhcyIKKyByZXR1cm49ImFuZHJvaWQub3MuQnVuZGxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InBlcnNpc3RCb29sZWFuIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMzExODcsNiArMTM4OTU4LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RnJhZ21lbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRJbnRlbnQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEzMTUwNSw2ICsxMzkyODksOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlRnJhZ21lbnQuT25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudENhbGxiYWNrIj4KKzwvaW1wbGVtZW50cz4KIDxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQWN0aXZpdHkiCiAgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMTMxNTIwLDYgKzEzOTMwNiw0NTUgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByZWZlcmVuY2VzUmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmaW5kUHJlZmVyZW5jZSIKKyByZXR1cm49ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQcmVmZXJlbmNlTWFuYWdlciIKKyByZXR1cm49ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByZWZlcmVuY2VTY3JlZW4iCisgcmV0dXJuPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc0hlYWRlcnMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImludmFsaWRhdGVIZWFkZXJzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc011bHRpUGFuZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEhlYWRlcnNGcm9tUmVzb3VyY2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXNpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YXJnZXQiIHR5cGU9ImphdmEudXRpbC5MaXN0Jmx0O2FuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHkuSGVhZGVyJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkJ1aWxkSGVhZGVycyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS51dGlsLkxpc3QmbHQ7YW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXImZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uR2V0SW5pdGlhbEhlYWRlciIKKyByZXR1cm49ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHkuSGVhZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uR2V0TmV3SGVhZGVyIgorIHJldHVybj0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25IZWFkZXJDbGljayIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImhlYWRlciIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Jc0hpZGluZ0hlYWRlcnMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uSXNNdWx0aVBhbmUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUHJlZmVyZW5jZVN0YXJ0RnJhZ21lbnQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsZXIiIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByZWYiIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUHJlZmVyZW5jZVRyZWVDbGljayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJlZmVyZW5jZVNjcmVlbiIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VTY3JlZW4iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByZWZlcmVuY2UiIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldExpc3RGb290ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQcmVmZXJlbmNlU2NyZWVuIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcmVmZXJlbmNlU2NyZWVuIiB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydFdpdGhGcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3dpdGNoVG9IZWFkZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iRVhUUkFfTk9fSEVBREVSUyIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDs6YW5kcm9pZDpub19oZWFkZXJzJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYVFJBX1NIT1dfRlJBR01FTlQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7OmFuZHJvaWQ6c2hvd19mcmFnbWVudCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFRSQV9TSE9XX0ZSQUdNRU5UX0FSR1VNRU5UUyIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDs6YW5kcm9pZDpzaG93X2ZyYWdtZW50X2FyZ3MmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJlZmVyZW5jZUFjdGl2aXR5LkhlYWRlciIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUFjdGl2aXR5LkhlYWRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGZpZWxkIG5hbWU9ImZyYWdtZW50IgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcmFnbWVudEFyZ3VtZW50cyIKKyB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Imljb24iCisgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Imljb25SZXMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iaW50ZW50IgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzdW1tYXJ5IgorIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ0aXRsZSIKKyB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKKyBleHRlbmRzPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUdyb3VwIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJlZmVyZW5jZUNhdGVnb3J5IgorIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ2F0ZWdvcnkiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNhdGVnb3J5IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQ2F0ZWdvcnkiCisgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VDYXRlZ29yeSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUHJlZmVyZW5jZUZyYWdtZW50IgorIGV4dGVuZHM9ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlRnJhZ21lbnQiCisgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VGcmFnbWVudCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhZGRQcmVmZXJlbmNlc0Zyb21JbnRlbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgpAQCAtMTMxNjAzLDUxICsxMzk4MzgsMjkgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgotPGNsYXNzIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKLSBleHRlbmRzPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUdyb3VwIgotIGFic3RyYWN0PSJmYWxzZSIKKzxpbnRlcmZhY2UgbmFtZT0iUHJlZmVyZW5jZUZyYWdtZW50Lk9uUHJlZmVyZW5jZVN0YXJ0RnJhZ21lbnRDYWxsYmFjayIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQ2F0ZWdvcnkiCi0gdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VDYXRlZ29yeSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGVyIiB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUZyYWdtZW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8cGFyYW1ldGVyIG5hbWU9InByZWYiIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KLTxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQ2F0ZWdvcnkiCi0gdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VDYXRlZ29yeSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Ci08L3BhcmFtZXRlcj4KLTwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iUHJlZmVyZW5jZUNhdGVnb3J5IgotIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ2F0ZWdvcnkiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Ci08L3BhcmFtZXRlcj4KLTwvY29uc3RydWN0b3I+Ci08L2NsYXNzPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJQcmVmZXJlbmNlR3JvdXAiCiAgZXh0ZW5kcz0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0xMzI1NDcsOSArMTQwNzYwLDkgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJzdHJpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idHJ1bmNhdGVIaXN0b3J5IgpAQCAtMTMyOTMzLDcgKzE0MTE0Niw3IEBACiAgdmFsdWU9IiZxdW90O3VybCZxdW90OyIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgpAQCAtMTM1OTkyLDYgKzE0NDIwNSwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRElSRUNUT1JZX1BBUkFNX0tFWSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkaXJlY3RvcnkmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTElNSVRfUEFSQU1fS0VZIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2xpbWl0JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkFnZ3JlZ2F0aW9uRXhjZXB0aW9ucyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpAQCAtMTM2MjY3LDYgKzE0NDUwMiwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJ0eXBlIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJBRERSRVNTIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2RhdGExJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkNPTlRFTlRfRklMVEVSX1VSSSIKICB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTEzODAyNSw2ICsxNDYyNzEsOTEgQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkNvbnRhY3ROYW1lQ29sdW1ucyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxmaWVsZCBuYW1lPSJESVNQTEFZX05BTUVfQUxURVJOQVRJVkUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7ZGlzcGxheV9uYW1lX2FsdCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJESVNQTEFZX05BTUVfUFJJTUFSWSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkaXNwbGF5X25hbWUmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRElTUExBWV9OQU1FX1NPVVJDRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkaXNwbGF5X25hbWVfc291cmNlJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBIT05FVElDX05BTUUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7cGhvbmV0aWNfbmFtZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQSE9ORVRJQ19OQU1FX1NUWUxFIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3Bob25ldGljX25hbWVfc3R5bGUmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU09SVF9LRVlfQUxURVJOQVRJVkUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7c29ydF9rZXlfYWx0JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNPUlRfS0VZX1BSSU1BUlkiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7c29ydF9rZXkmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iQ29udGFjdHNDb250cmFjdC5Db250YWN0T3B0aW9uc0NvbHVtbnMiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJ0cnVlIgpAQCAtMTM4MTgzLDYgKzE0NjUxNCw4IEBACiA+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zIj4KIDwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0TmFtZUNvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RPcHRpb25zQ29sdW1ucyI+CiA8L2ltcGxlbWVudHM+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdFN0YXR1c0NvbHVtbnMiPgpAQCAtMTM4NDE2LDYgKzE0Njc0OSw2OCBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQ29udGFjdHNDb250cmFjdC5Db250YWN0cy5FbnRpdHkiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkJhc2VTeW5jQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE5hbWVDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0T3B0aW9uc0NvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RTdGF0dXNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0c0NvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGFDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0c0NvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlN0YXR1c0NvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlN5bmNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxmaWVsZCBuYW1lPSJDT05URU5UX0RJUkVDVE9SWSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtlbnRpdGllcyZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJEQVRBX0lEIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2RhdGFfaWQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUkFXX0NPTlRBQ1RfSUQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7cmF3X2NvbnRhY3RfaWQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMuUGhvdG8iCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMzg0MzksNiArMTQ2ODM0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQSE9UTyIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkYXRhMTUmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2NsYXNzPgogPGludGVyZmFjZSBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkNvbnRhY3RzQ29sdW1ucyIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTEzODc0NCw2ICsxNDcxNTAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IklTX1JFQURfT05MWSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtpc19yZWFkX29ubHkmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iSVNfU1VQRVJfUFJJTUFSWSIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xMzg4MzEsNiArMTQ3MjQ4LDggQEAKID4KIDxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMiPgogPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3ROYW1lQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE9wdGlvbnNDb2x1bW5zIj4KIDwvaW1wbGVtZW50cz4KIDxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0U3RhdHVzQ29sdW1ucyI+CkBAIC0xMzg4NDQsNiArMTQ3MjYzLDM4NiBAQAogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlN0YXR1c0NvbHVtbnMiPgogPC9pbXBsZW1lbnRzPgogPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iQ29udGFjdHNDb250cmFjdC5EaXJlY3RvcnkiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJub3RpZnlEaXJlY3RvcnlDaGFuZ2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc29sdmVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQUNDT1VOVF9OQU1FIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FjY291bnROYW1lJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkFDQ09VTlRfVFlQRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthY2NvdW50VHlwZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDT05URU5UX0lURU1fVFlQRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDt2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS9jb250YWN0X2RpcmVjdG9yeSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDT05URU5UX1RZUEUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7dm5kLmFuZHJvaWQuY3Vyc29yLmRpci9jb250YWN0X2RpcmVjdG9yaWVzJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNPTlRFTlRfVVJJIgorIHR5cGU9ImFuZHJvaWQubmV0LlVyaSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJERUZBVUxUIgorIHR5cGU9ImxvbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjBMIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkRJUkVDVE9SWV9BVVRIT1JJVFkiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YXV0aG9yaXR5JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkRJU1BMQVlfTkFNRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkaXNwbGF5TmFtZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFBPUlRfU1VQUE9SVCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtleHBvcnRTdXBwb3J0JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYUE9SVF9TVVBQT1JUX0FOWV9BQ0NPVU5UIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFBPUlRfU1VQUE9SVF9OT05FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFBPUlRfU1VQUE9SVF9TQU1FX0FDQ09VTlRfT05MWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTE9DQUxfSU5WSVNJQkxFIgorIHR5cGU9ImxvbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjFMIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBBQ0tBR0VfTkFNRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtwYWNrYWdlTmFtZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSE9SVENVVF9TVVBQT1JUIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3Nob3J0Y3V0U3VwcG9ydCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSE9SVENVVF9TVVBQT1JUX0RBVEFfSVRFTVNfT05MWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU0hPUlRDVVRfU1VQUE9SVF9GVUxMIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSE9SVENVVF9TVVBQT1JUX05PTkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRZUEVfUkVTT1VSQ0VfSUQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7dHlwZVJlc291cmNlSWQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkRpc3BsYXlOYW1lU291cmNlcyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxmaWVsZCBuYW1lPSJFTUFJTCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik5JQ0tOQU1FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMzUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT1JHQU5JWkFUSU9OIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMzAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUEhPTkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVFJVQ1RVUkVEX05BTUUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0MCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJVTkRFRklORUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9pbnRlcmZhY2U+Cis8aW50ZXJmYWNlIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuRnVsbE5hbWVTdHlsZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxmaWVsZCBuYW1lPSJDSElORVNFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSksiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkpBUEFORVNFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJLT1JFQU4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlVOREVGSU5FRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iV0VTVEVSTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJDb250YWN0c0NvbnRyYWN0Lkdyb3VwcyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEzODkyMSw2ICsxNDc3MjAsMTcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+Cis8ZmllbGQgbmFtZT0iQVVUT19BREQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YXV0b19hZGQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iREVMRVRFRCIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xMzg5MzIsNiArMTQ3NzQyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGQVZPUklURVMiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7ZmF2b3JpdGVzJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkdST1VQX1ZJU0lCTEUiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTM5NDg2LDYgKzE0ODMwNyw1OCBAQAogPgogPC9maWVsZD4KIDwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJDb250YWN0c0NvbnRyYWN0LlBob25ldGljTmFtZVN0eWxlIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGZpZWxkIG5hbWU9IkpBUEFORVNFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJLT1JFQU4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBJTllJTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVU5ERUZJTkVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuUHJlc2VuY2UiCiAgZXh0ZW5kcz0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlN0YXR1c1VwZGF0ZXMiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTM5NjY4LDYgKzE0ODU0MSw4IEBACiA+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zIj4KIDwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0TmFtZUNvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RPcHRpb25zQ29sdW1ucyI+CiA8L2ltcGxlbWVudHM+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHNDb2x1bW5zIj4KQEAgLTEzOTg3OCw2ICsxNDg3NTMsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlJBV19DT05UQUNUX0lTX1JFQURfT05MWSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtyYXdfY29udGFjdF9pc19yZWFkX29ubHkmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJDb250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzRW50aXR5IgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0xNDAwOTQsMTEgKzE0ODk4MCwxMSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iQ0FQQUJJTElUWV9IQVNfVklERU9fUExBWUJBQ0tfT05MWSIKKzxmaWVsZCBuYW1lPSJDQVBBQklMSVRZX0hBU19WSURFTyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKICB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjEiCisgdmFsdWU9IjIiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtMTQwMTA5LDcgKzE0ODk5NSw3IEBACiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIyIgorIHZhbHVlPSIxIgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKQEAgLTE0OTAxNCw3ICsxNTc5MDAsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iYW5kcm9pZC50ZXh0LkVkaXRhYmxlIj4KKzxwYXJhbWV0ZXIgbmFtZT0icyIgdHlwZT0iYW5kcm9pZC50ZXh0LkVkaXRhYmxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImJlZm9yZVRleHRDaGFuZ2VkIgpAQCAtMTUzODQ1LDYgKzE2MjczMSwzNiBAQAogPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkxvYWRlclRlc3RDYXNlIgorIGV4dGVuZHM9ImFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMb2FkZXJUZXN0Q2FzZSIKKyB0eXBlPSJhbmRyb2lkLnRlc3QuTG9hZGVyVGVzdENhc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0TG9hZGVyUmVzdWx0U3luY2hyb25vdXNseSIKKyByZXR1cm49IlQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxvYWRlciIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtUJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJNb3JlQXNzZXJ0cyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE1Njc2NSw2ICsxNjU2ODEsMjUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuT3JDcmVhdGVEYXRhYmFzZSIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9ySGFuZGxlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwZWVrV2FsbHBhcGVyIgogIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNTcxMDksMTcgKzE2NjA0NCw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9jb25zdHJ1Y3Rvcj4KLTxtZXRob2QgbmFtZT0iYWJvcnRVcGRhdGVzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjbG9zZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTU3MTMxLDMwICsxNjYwNTUsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJjb21taXRVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJjb21taXRVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJqYXZhLnV0aWwuTWFwJmx0Oz8gZXh0ZW5kcyBqYXZhLmxhbmcuTG9uZywgPyBleHRlbmRzIGphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCZndDsmZ3Q7Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNvcHlTdHJpbmdUb0J1ZmZlciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTU3MTgxLDE3ICsxNjYwODEsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJkZWxldGVSb3ciCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEJsb2IiCiAgcmV0dXJuPSJieXRlW10iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTU3Mzc3LDggKzE2NjI2Niw4IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0V2FudHNBbGxPbk1vdmVDYWxscyIKLSByZXR1cm49ImJvb2xlYW4iCis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKQEAgLTE1NzM4Nyw4ICsxNjYyNzYsMTAgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iaGFzVXBkYXRlcyIKKzxtZXRob2QgbmFtZT0iZ2V0V2FudHNBbGxPbk1vdmVDYWxscyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCkBAIC0xNTc2MDIsMTcgKzE2NjQ5Myw2IEBACiA8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN1cHBvcnRzVXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTU3NjM5LDEyNCArMTY2NTE5LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib2JzZXJ2ZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUJsb2IiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYnl0ZVtdIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZURvdWJsZSIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJkb3VibGUiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlRmxvYXQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZmxvYXQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlSW50IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVMb25nIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImxvbmciPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlU2hvcnQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0ic2hvcnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlU3RyaW5nIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlVG9OdWxsIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJNb2NrRGlhbG9nSW50ZXJmYWNlIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0xNTk5MDksMTUgKzE2ODY3MSwyMyBAQAogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJDbGlwYm9hcmRNYW5hZ2VyIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCi0gYWJzdHJhY3Q9ImZhbHNlIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNsaXBib2FyZE1hbmFnZXIiCisgdHlwZT0iYW5kcm9pZC50ZXh0LkNsaXBib2FyZE1hbmFnZXIiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iZ2V0VGV4dCIKICByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCi0gYWJzdHJhY3Q9ImZhbHNlIgorIGFic3RyYWN0PSJ0cnVlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMTU5OTI4LDcgKzE2ODY5OCw3IEBACiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaGFzVGV4dCIKICByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgorIGFic3RyYWN0PSJ0cnVlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMTU5OTM5LDcgKzE2ODcwOSw3IEBACiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0VGV4dCIKICByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgorIGFic3RyYWN0PSJ0cnVlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMTYyNzY0LDYgKzE3MTUzNCwyOSBAQAogPHBhcmFtZXRlciBuYW1lPSJraW5kIiB0eXBlPSJqYXZhLmxhbmcuQ2xhc3MmbHQ7VCZndDsiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGV4dFJ1bkN1cnNvciIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dFN0YXJ0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRFbmQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvck9wdCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLlBhaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Imluc2VydCIKICByZXR1cm49ImFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE2MzgyNCw3ICsxNzI2MTcsNyBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJwIiB0eXBlPSJhbmRyb2lkLnRleHQuVGV4dFBhaW50Ij4KKzxwYXJhbWV0ZXIgbmFtZT0icGFpbnQiIHR5cGU9ImFuZHJvaWQudGV4dC5UZXh0UGFpbnQiPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9ImF2YWlsIiB0eXBlPSJmbG9hdCI+CiA8L3BhcmFtZXRlcj4KQEAgLTE3MjIxMSw2ICsxODEwMDQsMTggQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBbmRyb2lkRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQudXRpbC5BbmRyb2lkRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KIDxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5FeGNlcHRpb24iPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgpAQCAtMTcyMjQ4LDYgKzE4MTA1MywxOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQudXRpbC5BbmRyb2lkUnVudGltZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+CiA8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuRXhjZXB0aW9uIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KQEAgLTE3MzI1Niw3ICsxODIwNzMsNyBAQAogIGFic3RyYWN0PSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxjb25zdHJ1Y3RvciBuYW1lPSJFdmVudExvZ1RhZ3MiCkBAIC0xNzM0MTEsNiArMTgyMjI4LDQ4MyBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iSnNvblJlYWRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEuaW8uQ2xvc2VhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJKc29uUmVhZGVyIgorIHR5cGU9ImFuZHJvaWQudXRpbC5Kc29uUmVhZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW4iIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYmVnaW5BcnJheSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJlZ2luT2JqZWN0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2xvc2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmRBcnJheSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVuZE9iamVjdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc05leHQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0Qm9vbGVhbiIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHREb3VibGUiCisgcmV0dXJuPSJkb3VibGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHRJbnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHRMb25nIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dE5hbWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0TnVsbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHRTdHJpbmciCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwZWVrIgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Ub2tlbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TGVuaWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxlbmllbnQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2tpcFZhbHVlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3ludGF4RXJyb3IiCisgcmV0dXJuPSJqYXZhLmlvLklPRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtZXNzYWdlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJKc29uVG9rZW4iCisgZXh0ZW5kcz0iamF2YS5sYW5nLkVudW0iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJ2YWx1ZU9mIgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Ub2tlbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InZhbHVlcyIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uVG9rZW5bXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iSnNvbldyaXRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEuaW8uQ2xvc2VhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJKc29uV3JpdGVyIgorIHR5cGU9ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3V0IiB0eXBlPSJqYXZhLmlvLldyaXRlciI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImJlZ2luQXJyYXkiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmVnaW5PYmplY3QiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2xvc2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmRBcnJheSIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmRPYmplY3QiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmx1c2giCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuYW1lIgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im51bGxWYWx1ZSIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJbmRlbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbmRlbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idmFsdWUiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InZhbHVlIgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ2YWx1ZSIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ2YWx1ZSIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTG9nIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTc0MTM2LDcgKzE4MzQzMCw3IEBACiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgogIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iJnF1b3Q7KChhZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfChiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KGNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoZ292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoaW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KGpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KG1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwobmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwob3JnfG9tKXwocHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwodGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KHhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLXpja3phaCl8eVtldHVdfHpbYW13XSkmcXVvdDsiCisgdmFsdWU9IiZxdW90OygoYWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoYml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfChjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KGVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KGdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KGluZm98aW50fGlbZGVsbW5vcXJzdF0pfChqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfChtaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KG5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KG9yZ3xvbSl8KHByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KHRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCh4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCl8eVtldF18elthbXddKSZxdW90OyIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCkBAIC0xNzQxNDcsNyArMTgzNDQxLDcgQEAKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSImcXVvdDsoPzooPzphZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfCg/OmJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoPzpjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KD86ZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoPzpnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfCg/OmluZm98aW50fGlbZGVsbW5vcXJzdF0pfCg/OmpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KD86bWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfCg/Om5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KD86b3JnfG9tKXwoPzpwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCg/OnRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCg/OnhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLXpja3phaCl8eVtldHVdfHpbYW13XSkpJnF1b3Q7IgorIHZhbHVlPSImcXVvdDsoPzooPzphZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfCg/OmJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoPzpjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KD86ZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoPzpnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfCg/OmluZm98aW50fGlbZGVsbW5vcXJzdF0pfCg/OmpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KD86bWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfCg/Om5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KD86b3JnfG9tKXwoPzpwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCg/OnRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCg/OnhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLW1nYmFhbTdhOGh8eG5cXC1cXC1tZ2JlcnA0YTVkNGFyfHhuXFwtXFwtd2diaDFjfHhuXFwtXFwtemNremFoKXx5W2V0XXx6W2Ftd10pKSZxdW90OyIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCkBAIC0xNzQ0MTQsNiArMTgzNzA4LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUF0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRWYWx1ZUF0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNzYwMTksNiArMTg1MzI2LDIzMSBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQWN0aW9uTW9kZSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBY3Rpb25Nb2RlIgorIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImZpbmlzaCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDdXN0b21WaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRNZW51IgorIHJldHVybj0iYW5kcm9pZC52aWV3Lk1lbnUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRNZW51SW5mbGF0ZXIiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3VidGl0bGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGl0bGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW52YWxpZGF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDdXN0b21WaWV3IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdWJ0aXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3VidGl0bGUiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3VidGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRpdGxlIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRpdGxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJBY3Rpb25Nb2RlLkNhbGxiYWNrIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbkFjdGlvbkl0ZW1DbGlja2VkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnVJdGVtIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlQWN0aW9uTW9kZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1lbnUiIHR5cGU9ImFuZHJvaWQudmlldy5NZW51Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uRGVzdHJveUFjdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUHJlcGFyZUFjdGlvbk1vZGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtZW51IiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8aW50ZXJmYWNlIG5hbWU9IkNvbnRleHRNZW51IgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC0xODE1MzgsNiArMTkxMDcwLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFscGhhQ2hhciIgdHlwZT0iY2hhciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTaG93QXNBY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFjdGlvbkVudW0iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRUaXRsZSIKICByZXR1cm49ImFuZHJvaWQudmlldy5NZW51SXRlbSIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTE4MTU5MCw2ICsxOTExMzUsMzkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmlzaWJsZSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IlNIT1dfQVNfQUNUSU9OX0FMV0FZUyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU0hPV19BU19BQ1RJT05fSUZfUk9PTSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU0hPV19BU19BQ1RJT05fTkVWRVIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9pbnRlcmZhY2U+CiA8aW50ZXJmYWNlIG5hbWU9Ik1lbnVJdGVtLk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMTg1MzUwLDYgKzE5NDkyOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBbHBoYSIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEFuaW1hdGlvbiIKICByZXR1cm49ImFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4NTc4Myw2ICsxOTUzNzIsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibG9jYXRpb24iIHR5cGU9ImludFtdIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE1hdHJpeCIKKyByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldE1lYXN1cmVkSGVpZ2h0IgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4NTg2MCwxNyArMTk1NDYwLDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0T3ZlcnNjcm9sbE1vZGUiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0UGFkZGluZ0JvdHRvbSIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODU5MjYsNiArMTk1NTE1LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBpdm90WCIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBpdm90WSIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFJlc291cmNlcyIKICByZXR1cm49ImFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4NTk4MSw2ICsxOTU1OTIsNjEgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Um90YXRpb24iCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSb3RhdGlvblgiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSb3RhdGlvblkiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTY2FsZVgiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTY2FsZVkiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRTY3JvbGxCYXJTdHlsZSIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODYxMjYsNiArMTk1NzkyLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRyYW5zbGF0aW9uWCIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRyYW5zbGF0aW9uWSIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFZlcnRpY2FsRmFkaW5nRWRnZUxlbmd0aCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODYyMjcsNiArMTk1OTE1LDI4IEBACiA8cGFyYW1ldGVyIG5hbWU9Im91dFJlY3QiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuUmVjdCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRYIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0WSIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Imhhc0ZvY3VzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODY1NTcsNiArMTk2MjY3LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzU2F2ZUZyb21QYXJlbnRFbmFibGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc1Njcm9sbGJhckZhZGluZ0VuYWJsZWQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4NzAxMSwyNSArMTk2NzMyLDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iaGVpZ2h0TWVhc3VyZVNwZWMiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJvbk92ZXJzY3JvbGxlZCIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InNjcm9sbFgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ic2Nyb2xsWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJjbGFtcGVkWCIgdHlwZT0iYm9vbGVhbiI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iY2xhbXBlZFkiIHR5cGU9ImJvb2xlYW4iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib25SZXN0b3JlSW5zdGFuY2VTdGF0ZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg3MTgzLDM1ICsxOTY4ODUsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ2aXNpYmlsaXR5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ib3ZlcnNjcm9sbEJ5IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InByb3RlY3RlZCIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZGVsdGFYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImRlbHRhWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJzY3JvbGxYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InNjcm9sbFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ic2Nyb2xsUmFuZ2VYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InNjcm9sbFJhbmdlWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtYXhPdmVyc2Nyb2xsWCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtYXhPdmVyc2Nyb2xsWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJpc1RvdWNoRXZlbnQiIHR5cGU9ImJvb2xlYW4iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icGVyZm9ybUNsaWNrIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODc1OTQsNiArMTk3MjY3LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImV2ZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QWxwaGEiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbHBoYSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0QW5pbWF0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODgwMzgsMTkgKzE5NzcyNCw2IEBACiA8cGFyYW1ldGVyIG5hbWU9ImwiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Lk9uVG91Y2hMaXN0ZW5lciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRPdmVyc2Nyb2xsTW9kZSIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9Im92ZXJzY3JvbGxNb2RlIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0UGFkZGluZyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg4MDcwLDYgKzE5Nzc0MywzMiBAQAogPHBhcmFtZXRlciBuYW1lPSJib3R0b20iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQaXZvdFgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwaXZvdFgiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBpdm90WSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBpdm90WSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0UHJlc3NlZCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg4MDgzLDYgKzE5Nzc4Miw0NSBAQAogPHBhcmFtZXRlciBuYW1lPSJwcmVzc2VkIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJvdGF0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icm90YXRpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJvdGF0aW9uWCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJvdGF0aW9uWCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Um90YXRpb25ZIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icm90YXRpb25ZIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRTYXZlRW5hYmxlZCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg4MDk2LDYgKzE5NzgzNCw0NSBAQAogPHBhcmFtZXRlciBuYW1lPSJlbmFibGVkIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNhdmVGcm9tUGFyZW50RW5hYmxlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2NhbGVYIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2NhbGVYIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTY2FsZVkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzY2FsZVkiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFNjcm9sbEJhclN0eWxlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODgyMDIsNiArMTk3OTc5LDMyIEBACiA8cGFyYW1ldGVyIG5hbWU9ImRlbGVnYXRlIiB0eXBlPSJhbmRyb2lkLnZpZXcuVG91Y2hEZWxlZ2F0ZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUcmFuc2xhdGlvblgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2xhdGlvblgiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRyYW5zbGF0aW9uWSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zbGF0aW9uWSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0VmVydGljYWxGYWRpbmdFZGdlRW5hYmxlZCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg4MjY3LDYgKzE5ODA3MCwzMiBAQAogPHBhcmFtZXRlciBuYW1lPSJ3aWxsTm90RHJhdyIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRYIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0WSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InkiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNob3dDb250ZXh0TWVudSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg4Mjc4LDYgKzE5ODEwNywxOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEFjdGlvbk1vZGUiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InN0YXJ0QW5pbWF0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODg2NzMsMzkgKzE5ODUxNSw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJPVkVSU0NST0xMX0FMV0FZUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjAiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9Ik9WRVJTQ1JPTExfTkVWRVIiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIyIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCIKICB0eXBlPSJpbnRbXSIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTg5NDY4LDI4ICsxOTkyNzcsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRTY2FsZWRPdmVyZmxpbmdEaXN0YW5jZSIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRTY2FsZWRPdmVyc2Nyb2xsRGlzdGFuY2UiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0U2NhbGVkUGFnaW5nVG91Y2hTbG9wIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MDU5NSw2ICsyMDAzODIsMTcgQEAKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNNb3Rpb25FdmVudFNwbGl0dGluZ0VuYWJsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im1lYXN1cmVDaGlsZCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkxMDU4LDYgKzIwMDg1NiwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb25MaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TW90aW9uRXZlbnRTcGxpdHRpbmdFbmFibGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3BsaXQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0T25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkxMTEwLDYgKzIwMDkyMSwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbFZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsVmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZS5DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzdGFydExheW91dEFuaW1hdGlvbiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkxODAwLDYgKzIwMTYyNiwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbFZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWxWaWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJWaWV3U3R1YiIKICBleHRlbmRzPSJhbmRyb2lkLnZpZXcuVmlldyIKQEAgLTE5MjQ3Niw2ICsyMDIzMTcsMTkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzRmVhdHVyZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZlYXR1cmUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJoYXNTb2Z0SW5wdXRNb2RlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTI0ODcsNiArMjAyMzQxLDE5IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImludmFsaWRhdGVQYW5lbE1lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZlYXR1cmVJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzQWN0aXZlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTMwNDgsNiArMjAyOTE1LDI1IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFwcE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0V2luZG93TWFuYWdlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndtIiB0eXBlPSJhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXBwVG9rZW4iIHR5cGU9ImFuZHJvaWQub3MuSUJpbmRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXBwTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzdXBlckRpc3BhdGNoS2V5RXZlbnQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMTkzMTUyLDYgKzIwMzAzOCwzOSBAQAogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkVBVFVSRV9BQ1RJT05fQkFSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iOCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGRUFUVVJFX0FDVElPTl9CQVJfT1ZFUkxBWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkVBVFVSRV9BQ1RJT05fTU9ERV9PVkVSTEFZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iRkVBVFVSRV9DT05URVhUX01FTlUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xOTMxNzQsNiArMjAzMDkzLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGRUFUVVJFX0hBUkRXQVJFX0FDQ0VMRVJBVEVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iRkVBVFVSRV9JTkRFVEVSTUlOQVRFX1BST0dSRVNTIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTkzNTMzLDYgKzIwMzQ2MywxOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblN0YXJ0QWN0aW9uTW9kZSIKKyByZXR1cm49ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZS5DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvbldpbmRvd0F0dHJpYnV0ZXNDaGFuZ2VkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTE5NDAyMiw2ICsyMDM5NjUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMjE0NzQ4MzY0OCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJGTEFHX0lHTk9SRV9DSEVFS19QUkVTU0VTIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTk1OTA4LDYgKzIwNTg2MiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTY2FsZUZhY3RvciIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFN0YXJ0T2Zmc2V0IgogIHJldHVybj0ibG9uZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTU5NDUsNiArMjA1OTEwLDIzIEBACiA8cGFyYW1ldGVyIG5hbWU9Im91dFRyYW5zZm9ybWF0aW9uIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRyYW5zZm9ybWF0aW9uIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY3VycmVudFRpbWUiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im91dFRyYW5zZm9ybWF0aW9uIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzY2FsZSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0WkFkanVzdG1lbnQiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjAwMjQxLDYgKzIxMDIyMywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdWJ0eXBlcyIKKyByZXR1cm49ImphdmEudXRpbC5BcnJheUxpc3QmbHQ7YW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kSW5mby5JbnB1dE1ldGhvZFN1YnR5cGUmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImxvYWRJY29uIgogIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDAyOTMsNiArMjEwMjg2LDEwOCBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iSW5wdXRNZXRob2RJbmZvLklucHV0TWV0aG9kU3VidHlwZSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQub3MuUGFyY2VsYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8bWV0aG9kIG5hbWU9ImRlc2NyaWJlQ29udGVudHMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RXh0cmFWYWx1ZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SWNvbklkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExvY2FsZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TW9kZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TmFtZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVUb1BhcmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRlc3QiIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwYXJjZWxhYmxlRmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkNSRUFUT1IiCisgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3IiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IklucHV0TWV0aG9kTWFuYWdlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwMzMwOCw2ICsyMTM0MDMsMTcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8bWV0aG9kIG5hbWU9ImVuYWJsZVNtb290aFRyYW5zaXRpb24iCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEFsbG93RmlsZUFjY2VzcyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjAzNTkwLDcgKzIxMzY5Niw3IEBACiAgc3luY2hyb25pemVkPSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+CkBAIC0yMDM2ODIsMTcgKzIxMzc4OCw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFVzZVdlYlZpZXdCYWNrZ3JvdW5kRm9yT3ZlcnNjcm9sbEJhY2tncm91bmQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFVzZVdpZGVWaWV3UG9ydCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjAzOTM0LDYgKzIxNDAyOSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJmbGFnIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVuYWJsZVNtb290aFRyYW5zaXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbmFibGUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0RmFudGFzeUZvbnRGYW1pbHkiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNDEzNiw3ICsyMTQyNDQsNyBAQAogIHN5bmNocm9uaXplZD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iZmxhZyIgdHlwZT0iYm9vbGVhbiI+CkBAIC0yMDQyODUsMTkgKzIxNDM5Myw2IEBACiA8cGFyYW1ldGVyIG5hbWU9InVzZSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRVc2VXZWJWaWV3QmFja2dyb3VuZEZvck92ZXJzY3JvbGxCYWNrZ3JvdW5kIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYm9vbGVhbiI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRVc2VXaWRlVmlld1BvcnQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNDg3OSw2ICsyMTQ5NzQsMjIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iV2ViVmlldyIKKyB0eXBlPSJhbmRyb2lkLndlYmtpdC5XZWJWaWV3IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwcml2YXRlQnJvd3NpbmciIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJhZGRKYXZhc2NyaXB0SW50ZXJmYWNlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDQ5MjksNiArMjE1MDQwLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNhblpvb21JbiIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2FuWm9vbU91dCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2FwdHVyZVBpY3R1cmUiCiAgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA1Mjg4LDYgKzIxNTQyMSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWaXNpYmxlVGl0bGVIZWlnaHQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0Wm9vbUNvbnRyb2xzIgogIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA1MzQ1LDYgKzIxNTQ4OSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImxvYWREYXRhIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDU2NjQsNiArMjE1ODE5LDM2IEBACiA8cGFyYW1ldGVyIG5hbWU9Im91dFN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzYXZlV2ViQXJjaGl2ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZpbGVuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNhdmVXZWJBcmNoaXZlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYmFzZW5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF1dG9uYW1lIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC53ZWJraXQuVmFsdWVDYWxsYmFjayZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRDZXJ0aWZpY2F0ZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA2MjYxLDcgKzIxNjQ0Niw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC53ZWJraXQuV2ViVmlldyI+CkBAIC0yMDY2NjgsNiArMjE2ODUzLDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFmdGVyIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2xlYXJDaG9pY2VzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjbGVhclRleHRGaWx0ZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNjY5MCw2ICsyMTY4ODYsNjEgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q2hlY2tlZEl0ZW1Db3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDaGVja2VkSXRlbUlkcyIKKyByZXR1cm49ImxvbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDaGVja2VkSXRlbVBvc2l0aW9uIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENoZWNrZWRJdGVtUG9zaXRpb25zIgorIHJldHVybj0iYW5kcm9pZC51dGlsLlNwYXJzZUJvb2xlYW5BcnJheSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDaG9pY2VNb2RlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldExpc3RQYWRkaW5nQm90dG9tIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNjgzMyw2ICsyMTcwODQsMTkgQEAKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNJdGVtQ2hlY2tlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNTY3JvbGxpbmdDYWNoZUVuYWJsZWQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNjkxMiw2ICsyMTcxNzYsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25SZW1vdGVBZGFwdGVyQ29ubmVjdGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblJlbW90ZUFkYXB0ZXJEaXNjb25uZWN0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uUmVzdG9yZUluc3RhbmNlU3RhdGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNzAxMSw2ICsyMTcyOTcsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmlld3MiIHR5cGU9ImphdmEudXRpbC5MaXN0Jmx0O2FuZHJvaWQudmlldy5WaWV3Jmd0OyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBZGFwdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0Q2FjaGVDb2xvckhpbnQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNzAyNCw2ICsyMTczMjMsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29sb3IiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDaG9pY2VNb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2hvaWNlTW9kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldERyYXdTZWxlY3Rvck9uVG9wIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDcwNjMsNiArMjE3Mzc1LDM0IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZpbHRlclRleHQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SXRlbUNoZWNrZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRNdWx0aUNob2ljZU1vZGVMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5BYnNMaXN0Vmlldy5NdWx0aUNob2ljZU1vZGVMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRPblNjcm9sbExpc3RlbmVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDcwODksNiArMjE3NDI5LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5BYnNMaXN0Vmlldy5SZWN5Y2xlckxpc3RlbmVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJlbW90ZVZpZXdzQWRhcHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRTY3JvbGxJbmRpY2F0b3JzIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDcyMzgsNiArMjE3NTkxLDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9ImJvdW5kUG9zaXRpb24iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzbW9vdGhTY3JvbGxUb1Bvc2l0aW9uRnJvbVRvcCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InZlcmlmeURyYXdhYmxlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDcyNTEsNiArMjE3NjE5LDUwIEBACiA8cGFyYW1ldGVyIG5hbWU9ImRyIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfTVVMVElQTEUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX01VTFRJUExFX01PREFMIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9OT05FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9TSU5HTEUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlRSQU5TQ1JJUFRfTU9ERV9BTFdBWVNfU0NST0xMIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjA3MzQyLDYgKzIxNzc1NCwzNSBAQAogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQWJzTGlzdFZpZXcuTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZS5DYWxsYmFjayI+Cis8L2ltcGxlbWVudHM+Cis8bWV0aG9kIG5hbWU9Im9uSXRlbUNoZWNrZWRTdGF0ZUNoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2hlY2tlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8aW50ZXJmYWNlIG5hbWU9IkFic0xpc3RWaWV3Lk9uU2Nyb2xsTGlzdGVuZXIiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJ0cnVlIgpAQCAtMjA4NTE4LDYgKzIxODk1OSw1ODIgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJBZGFwdGVyVmlld0FuaW1hdG9yIgorIGV4dGVuZHM9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBZGFwdGVyVmlld0FuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3QW5pbWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWRhcHRlclZpZXdBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlld0FuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0QWRhcHRlciIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q3VycmVudFZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREaXNwbGF5ZWRDaGlsZCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbkFuaW1hdGlvbiIKKyByZXR1cm49ImFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE91dEFuaW1hdGlvbiIKKyByZXR1cm49ImFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGVkVmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25SZW1vdGVBZGFwdGVyRGlzY29ubmVjdGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblJlc3RvcmVJbnN0YW5jZVN0YXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhdGUiIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsYWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblNhdmVJbnN0YW5jZVN0YXRlIgorIHJldHVybj0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEFkYXB0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEFuaW1hdGVGaXJzdFZpZXciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERpc3BsYXllZENoaWxkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0id2hpY2hDaGlsZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEluQW5pbWF0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5BbmltYXRpb24iIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEluQW5pbWF0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlc291cmNlSUQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRPdXRBbmltYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvdXRBbmltYXRpb24iIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE91dEFuaW1hdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZXNvdXJjZUlEIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmVtb3RlVmlld3NBZGFwdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNlbGVjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvd05leHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3dQcmV2aW91cyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQWRhcHRlclZpZXdGbGlwcGVyIgorIGV4dGVuZHM9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3QW5pbWF0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBZGFwdGVyVmlld0ZsaXBwZXIiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXdGbGlwcGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFkYXB0ZXJWaWV3RmxpcHBlciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlld0ZsaXBwZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJpc0F1dG9TdGFydCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNGbGlwcGluZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QXV0b1N0YXJ0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXV0b1N0YXJ0IiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEZsaXBJbnRlcnZhbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbGxpc2Vjb25kcyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0RmxpcHBpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0b3BGbGlwcGluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQWRhcHRlcnMiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFkYXB0ZXJzIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImxvYWRBZGFwdGVyIgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImphdmEubGFuZy5PYmplY3QuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEN1cnNvckFkYXB0ZXIiCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImphdmEubGFuZy5PYmplY3QuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEN1cnNvckFkYXB0ZXIiCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3IiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Li4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFkYXB0ZXJzLkN1cnNvckJpbmRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFkYXB0ZXJzLkN1cnNvckJpbmRlciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JCaW5kZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNmb3JtYXRpb24iIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYmluZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJtQ29udGV4dCIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ibVRyYW5zZm9ybWF0aW9uIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb24iCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbiIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0idHJhbnNmb3JtIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3IiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRyYW5zZm9ybVRvUmVzb3VyY2UiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJtQ29udGV4dCIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkFscGhhYmV0SW5kZXhlciIKICBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTA1MDUsNiArMjIxNTIyLDIwIEBACiA8cGFyYW1ldGVyIG5hbWU9ImF1dG9SZXF1ZXJ5IiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDdXJzb3JBZGFwdGVyIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJiaW5kVmlldyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yMTA2NTIsNiArMjIxNjgzLDIzIEBACiA8cGFyYW1ldGVyIG5hbWU9ImF1dG9SZXF1ZXJ5IiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImluaXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibmV3RHJvcERvd25WaWV3IgogIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjEwNzIzLDYgKzIyMTc3MSwyOCBAQAogPHBhcmFtZXRlciBuYW1lPSJmaWx0ZXJRdWVyeVByb3ZpZGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5GaWx0ZXJRdWVyeVByb3ZpZGVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iRkxBR19BVVRPX1JFUVVFUlkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkN1cnNvclRyZWVBZGFwdGVyIgogIGV4dGVuZHM9ImFuZHJvaWQud2lkZ2V0LkJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIiCkBAIC0yMTMxNjIsNyArMjI0MjMyLDcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0U3RyZXRjaE1vZGUiCis8bWV0aG9kIG5hbWU9ImdldE51bUNvbHVtbnMiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCkBAIC0yMTMxNzMsOCArMjI0MjQzLDggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0QWRhcHRlciIKLSByZXR1cm49InZvaWQiCis8bWV0aG9kIG5hbWU9ImdldFN0cmV0Y2hNb2RlIgorIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCkBAIC0yMTMxODMsOCArMjI0MjUzLDYgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyIj4KLTwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldENvbHVtbldpZHRoIgogIHJldHVybj0idm9pZCIKQEAgLTIxMzI3Nyw2ICsyMjQzNDUsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmVydGljYWxTcGFjaW5nIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic21vb3RoU2Nyb2xsQnlPZmZzZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPGZpZWxkIG5hbWU9IkFVVE9fRklUIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjE0MzQ4LDYgKzIyNTQyOSwyMCBAQAogPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iTGluZWFyTGF5b3V0IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImdldEJhc2VsaW5lQWxpZ25lZENoaWxkSW5kZXgiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE0MzkyLDYgKzIyNTQ4NywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc01lYXN1cmVXaXRoTGFyZ2VzdENoaWxkRW5hYmxlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib25MYXlvdXQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNDQ2NSw2ICsyMjU1NzEsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iaG9yaXpvbnRhbEdyYXZpdHkiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRNZWFzdXJlV2l0aExhcmdlc3RDaGlsZEVuYWJsZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbmFibGVkIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldE9yaWVudGF0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTQ2NjEsNiArMjI1NzgwLDY5MSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9Ikxpc3RQb3B1cFdpbmRvdyIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTGlzdFBvcHVwV2luZG93IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMaXN0UG9wdXBXaW5kb3ciCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdFBvcHVwV2luZG93IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMaXN0UG9wdXBXaW5kb3ciCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdFBvcHVwV2luZG93IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZUF0dHIiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iTGlzdFBvcHVwV2luZG93IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGVBdHRyIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlUmVzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJjbGVhckxpc3RTZWxlY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRpc21pc3MiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFuY2hvclZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBbmltYXRpb25TdHlsZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRCYWNrZ3JvdW5kIgorIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRIZWlnaHQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SG9yaXpvbnRhbE9mZnNldCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbnB1dE1ldGhvZE1vZGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TGlzdFZpZXciCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5MaXN0VmlldyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQcm9tcHRQb3NpdGlvbiIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3RlZEl0ZW0iCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGVkSXRlbUlkIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbiIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3RlZFZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTb2Z0SW5wdXRNb2RlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZlcnRpY2FsT2Zmc2V0IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFdpZHRoIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzSW5wdXRNZXRob2ROb3ROZWVkZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzTW9kYWwiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzU2hvd2luZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25LZXlEb3duIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJldmVudCIgdHlwZT0iYW5kcm9pZC52aWV3LktleUV2ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uS2V5UHJlSW1lIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJldmVudCIgdHlwZT0iYW5kcm9pZC52aWV3LktleUV2ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uS2V5VXAiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXlDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV2ZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuS2V5RXZlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGVyZm9ybUl0ZW1DbGljayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9zdFNob3ciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEFkYXB0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBbmNob3JWaWV3IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5jaG9yIiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBbmltYXRpb25TdHlsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvblN0eWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QmFja2dyb3VuZERyYXdhYmxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDb250ZW50V2lkdGgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ3aWR0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEhlaWdodCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImhlaWdodCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEhvcml6b250YWxPZmZzZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJbnB1dE1ldGhvZE1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TGlzdFNlbGVjdG9yIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0b3IiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TW9kYWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RhbCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRPbkRpc21pc3NMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5Qb3B1cFdpbmRvdy5PbkRpc21pc3NMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRPbkl0ZW1DbGlja0xpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2xpY2tMaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0ZWRMaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQcm9tcHRQb3NpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UHJvbXB0VmlldyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByb21wdCIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2VsZWN0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTb2Z0SW5wdXRNb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFZlcnRpY2FsT2Zmc2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0V2lkdGgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ3aWR0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3ciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iSU5QVVRfTUVUSE9EX0ZST01fRk9DVVNBQkxFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJJTlBVVF9NRVRIT0RfTkVFREVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJJTlBVVF9NRVRIT0RfTk9UX05FRURFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTUFUQ0hfUEFSRU5UIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUE9TSVRJT05fUFJPTVBUX0FCT1ZFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQT1NJVElPTl9QUk9NUFRfQkVMT1ciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IldSQVBfQ09OVEVOVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0yIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJMaXN0VmlldyIKICBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTQ3NjUsMTcgKzIyNjU2OSw2IEBACiA8cGFyYW1ldGVyIG5hbWU9InYiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImNsZWFyQ2hvaWNlcyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZmluZFZpZXdUcmF2ZXJzYWwiCiAgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTQ4MjAsNTEgKzIyNjYxMyw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0Q2hlY2tlZEl0ZW1JZHMiCi0gcmV0dXJuPSJsb25nW10iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbiIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRDaGVja2VkSXRlbVBvc2l0aW9ucyIKLSByZXR1cm49ImFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXkiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0Q2hvaWNlTW9kZSIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+CkBAIC0yMTQ5MzQsNDEgKzIyNjY4Myw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldE92ZXJzY3JvbGxGb290ZXIiCi0gcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldE92ZXJzY3JvbGxIZWFkZXIiCi0gcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImlzSXRlbUNoZWNrZWQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InJlbW92ZUZvb3RlclZpZXciCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNDk5NSwzMiArMjI2NzA5LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idiIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0QWRhcHRlciIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldENob2ljZU1vZGUiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjaG9pY2VNb2RlIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0RGl2aWRlciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE1MDczLDIxICsyMjY3NjEsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJoZWFkZXJEaXZpZGVyc0VuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0SXRlbUNoZWNrZWQiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYm9vbGVhbiI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRJdGVtc0NhbkZvY3VzIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTUxMDEsMzIgKzIyNjc3NCw2IEBACiA8cGFyYW1ldGVyIG5hbWU9Iml0ZW1zQ2FuRm9jdXMiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0T3ZlcnNjcm9sbEZvb3RlciIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImZvb3RlciIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRPdmVyc2Nyb2xsSGVhZGVyIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iaGVhZGVyIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFNlbGVjdGlvbiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE1MTY2LDM5ICsyMjY4MTMsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ieSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfTVVMVElQTEUiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIyIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKKzxtZXRob2QgbmFtZT0ic21vb3RoU2Nyb2xsQnlPZmZzZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9OT05FIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9TSU5HTEUiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJMaXN0Vmlldy5GaXhlZFZpZXdJbmZvIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0yMTU2OTgsNyArMjI3MzI1LDcgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KLTxjbGFzcyBuYW1lPSJPdmVyU2Nyb2xsZXIiCis8Y2xhc3MgbmFtZT0iUG9wdXBNZW51IgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC0yMTU3MDYsOCArMjI3MzMzLDggQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08Y29uc3RydWN0b3IgbmFtZT0iT3ZlclNjcm9sbGVyIgotIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lk92ZXJTY3JvbGxlciIKKzxjb25zdHJ1Y3RvciBuYW1lPSJQb3B1cE1lbnUiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuUG9wdXBNZW51IgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtMjE1NzE1LDM2ICsyMjczNDIsMTAgQEAKID4KIDxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgogPC9wYXJhbWV0ZXI+Ci08L2NvbnN0cnVjdG9yPgotPGNvbnN0cnVjdG9yIG5hbWU9Ik92ZXJTY3JvbGxlciIKLSB0eXBlPSJhbmRyb2lkLndpZGdldC5PdmVyU2Nyb2xsZXIiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iaW50ZXJwb2xhdG9yIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciI+Cis8cGFyYW1ldGVyIG5hbWU9ImFuY2hvciIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgotPGNvbnN0cnVjdG9yIG5hbWU9Ik92ZXJTY3JvbGxlciIKLSB0eXBlPSJhbmRyb2lkLndpZGdldC5PdmVyU2Nyb2xsZXIiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iaW50ZXJwb2xhdG9yIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iYm91bmNlQ29lZmZpY2llbnRYIiB0eXBlPSJmbG9hdCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iYm91bmNlQ29lZmZpY2llbnRZIiB0eXBlPSJmbG9hdCI+Ci08L3BhcmFtZXRlcj4KLTwvY29uc3RydWN0b3I+Ci08bWV0aG9kIG5hbWU9ImFib3J0QW5pbWF0aW9uIgorPG1ldGhvZCBuYW1lPSJkaXNtaXNzIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCiAgbmF0aXZlPSJmYWxzZSIKQEAgLTIxNTc1NSw4ICsyMjczNTYsOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJjb21wdXRlU2Nyb2xsT2Zmc2V0IgotIHJldHVybj0iYm9vbGVhbiIKKzxtZXRob2QgbmFtZT0iZ2V0TWVudSIKKyByZXR1cm49ImFuZHJvaWQudmlldy5NZW51IgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCkBAIC0yMTU3NjYsNyArMjI3MzY3LDE4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImZsaW5nIgorPG1ldGhvZCBuYW1lPSJnZXRNZW51SW5mbGF0ZXIiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCiAgbmF0aXZlPSJmYWxzZSIKQEAgLTIxNTc3NiwyNCArMjI3Mzg4LDEwIEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydFgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZlbG9jaXR5WCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2ZWxvY2l0eVkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWluWCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtYXhYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1pblkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWF4WSIgdHlwZT0iaW50Ij4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlBvcHVwTWVudS5Pbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJmbGluZyIKKzxtZXRob2QgbmFtZT0ic2hvdyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCkBAIC0yMTU4MDMsMjI2ICsyMjc0MDEsMjkgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmVsb2NpdHlYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZlbG9jaXR5WSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtaW5YIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1heFgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWluWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtYXhZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im92ZXJYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im92ZXJZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZm9yY2VGaW5pc2hlZCIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZmluaXNoZWQiIHR5cGU9ImJvb2xlYW4iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0Q3VyclgiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRDdXJyWSIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldEZpbmFsWCIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldEZpbmFsWSIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFN0YXJ0WCIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFN0YXJ0WSIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImlzRmluaXNoZWQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iaXNPdmVyc2Nyb2xsZWQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9Im5vdGlmeUhvcml6b250YWxFZGdlUmVhY2hlZCIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJmaW5hbFgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib3ZlclgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJub3RpZnlWZXJ0aWNhbEVkZ2VSZWFjaGVkIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImZpbmFsWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJvdmVyWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNwcmluZ2JhY2siCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydFgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1pblgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWF4WCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtaW5ZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1heFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdGFydFNjcm9sbCIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZHgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZHkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdGFydFNjcm9sbCIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZHgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZHkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iUG9wdXBNZW51Lk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbk1lbnVJdGVtQ2xpY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQudmlldy5NZW51SXRlbSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iUG9wdXBXaW5kb3ciCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTYwNzQsNiArMjI3NDc1LDIyIEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlQXR0ciIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZVJlcyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQb3B1cFdpbmRvdyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5Qb3B1cFdpbmRvdyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+CiA8L2NvbnN0cnVjdG9yPgogPGNvbnN0cnVjdG9yIG5hbWU9IlBvcHVwV2luZG93IgogIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93IgpAQCAtMjE3MTAzLDYgKzIyODUyMCwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJleGNsdWRlTWltZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJbWFnZVRvRGVmYXVsdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TW9kZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE4MjM5LDYgKzIyOTY2NywyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZG91YmxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVtcHR5VmlldyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbXB0eVZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEZsb2F0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTgzMTgsNiArMjI5NzYxLDIzIEBACiA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW50ZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1ldGhvZE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldExvbmciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxODM2OSw2ICsyMjk4MjksNTEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iaW5kZXRlcm1pbmF0ZSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZWxhdGl2ZVNjcm9sbFBvc2l0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJlbW90ZUFkYXB0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNjcm9sbFBvc2l0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0U2hvcnQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxODQ2NSw2ICsyMjk5NzAsMzIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmlzaWJpbGl0eSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3dOZXh0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvd1ByZXZpb3VzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0id3JpdGVUb1BhcmNlbCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE4NTMxLDYgKzIzMDA2MiwxNjAgQEAKIDxpbXBsZW1lbnRzIG5hbWU9ImphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24iPgogPC9pbXBsZW1lbnRzPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJSZW1vdGVWaWV3c1NlcnZpY2UiCisgZXh0ZW5kcz0iYW5kcm9pZC5hcHAuU2VydmljZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iUmVtb3RlVmlld3NTZXJ2aWNlIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzU2VydmljZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJvbkJpbmQiCisgcmV0dXJuPSJhbmRyb2lkLm9zLklCaW5kZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkdldFZpZXdGYWN0b3J5IgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3NTZXJ2aWNlLlJlbW90ZVZpZXdzRmFjdG9yeSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IlJlbW90ZVZpZXdzU2VydmljZS5SZW1vdGVWaWV3c0ZhY3RvcnkiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImdldENvdW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SXRlbUlkIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExvYWRpbmdWaWV3IgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWaWV3QXQiCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZpZXdUeXBlQ291bnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNTdGFibGVJZHMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EYXRhU2V0Q2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRlc3Ryb3kiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IlJlc291cmNlQ3Vyc29yQWRhcHRlciIKICBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjE4NTY5LDYgKzIzMDI1NCwyMiBAQAogPHBhcmFtZXRlciBuYW1lPSJhdXRvUmVxdWVyeSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iUmVzb3VyY2VDdXJzb3JBZGFwdGVyIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlJlc291cmNlQ3Vyc29yQWRhcHRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsYXlvdXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJuZXdWaWV3IgogIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjIwNjQ5LDYgKzIzMjM1MCwyOCBAQAogPHBhcmFtZXRlciBuYW1lPSJwcm9tcHRJZCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iTU9ERV9ESUFMT0ciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik1PREVfRFJPUERPV04iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDxpbnRlcmZhY2UgbmFtZT0iU3Bpbm5lckFkYXB0ZXIiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yMjA2NzcsNiArMjMyNDAwLDM3IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iU3RhY2tWaWV3IgorIGV4dGVuZHM9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3QW5pbWF0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTdGFja1ZpZXciCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuU3RhY2tWaWV3IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlN0YWNrVmlldyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5TdGFja1ZpZXciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJUYWJIb3N0IgogIGV4dGVuZHM9ImFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIyNTQ5OCw3ICsyMzcyNTIsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0idCIgdHlwZT0iVCI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZzAiIHR5cGU9IlQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgpAQCAtNDA1MTE2LDcgKzQxNjg3MCw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDxwYXJhbWV0ZXIgbmFtZT0icGF0dGVybiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CkBAIC00MTI0OTcsNyArNDI0MjUxLDcgQEAKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxtZXRob2QgbmFtZT0iZ2V0TGVuZ3RoIgpAQCAtNDEyOTg2LDcgKzQyNDc0MCw3IEBACiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8bWV0aG9kIG5hbWU9ImNoYXJhY3RlcnMiCkBAIC00MTMyMDEsNyArNDI0OTU1LDcgQEAKICBhYnN0cmFjdD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8aW1wbGVtZW50cyBuYW1lPSJvcmcueG1sLnNheC5EVERIYW5kbGVyIj4KQEAgLTQxMzY2OCw3ICs0MjU0MjIsNyBAQAogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPG1ldGhvZCBuYW1lPSJwYXJzZSIKQEAgLTQxNTEwMCw3ICs0MjY4NTQsNyBAQAogIGFic3RyYWN0PSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxpbXBsZW1lbnRzIG5hbWU9Im9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3QiPgpAQCAtNDE2NTg5LDcgKzQyODM0Myw3IEBACiAgYWJzdHJhY3Q9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPG1ldGhvZCBuYW1lPSJtYWtlUGFyc2VyIgpkaWZmIC0tZ2l0IGEvY21kcy9hbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvYW0vQW0uamF2YSBiL2NtZHMvYW0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL2FtL0FtLmphdmEKaW5kZXggMzAxODgzZi4uNDI2NWNjNSAxMDA2NDQKLS0tIGEvY21kcy9hbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvYW0vQW0uamF2YQorKysgYi9jbWRzL2FtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9hbS9BbS5qYXZhCkBAIC05OCw2ICs5OCw4IEBACiAgICAgICAgICAgICBzZW5kQnJvYWRjYXN0KCk7CiAgICAgICAgIH0gZWxzZSBpZiAob3AuZXF1YWxzKCJwcm9maWxlIikpIHsKICAgICAgICAgICAgIHJ1blByb2ZpbGUoKTsKKyAgICAgICAgfSBlbHNlIGlmIChvcC5lcXVhbHMoImR1bXBoZWFwIikpIHsKKyAgICAgICAgICAgIHJ1bkR1bXBIZWFwKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGNvbW1hbmQ6ICIgKyBvcCk7CiAgICAgICAgIH0KQEAgLTE0MCw2ICsxNDIsMTEgQEAKICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBuZXh0QXJnUmVxdWlyZWQoKTsKICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoa2V5LCBJbnRlZ2VyLnZhbHVlT2YodmFsdWUpKTsKICAgICAgICAgICAgICAgICBoYXNJbnRlbnRJbmZvID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0LmVxdWFscygiLS1lbCIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IG5leHRBcmdSZXF1aXJlZCgpOworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG5leHRBcmdSZXF1aXJlZCgpOworICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShrZXksIExvbmcudmFsdWVPZih2YWx1ZSkpOworICAgICAgICAgICAgICAgIGhhc0ludGVudEluZm8gPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIGlmIChvcHQuZXF1YWxzKCItLWV6IikpIHsKICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gbmV4dEFyZ1JlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbmV4dEFyZ1JlcXVpcmVkKCk7CkBAIC00MjQsNiArNDMxLDI4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgcnVuRHVtcEhlYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBtYW5hZ2VkID0gISItbiIuZXF1YWxzKG5leHRPcHRpb24oKSk7CisgICAgICAgIFN0cmluZyBwcm9jZXNzID0gbmV4dEFyZ1JlcXVpcmVkKCk7CisgICAgICAgIFN0cmluZyBoZWFwRmlsZSA9IG5leHRBcmdSZXF1aXJlZCgpOworICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZkID0gUGFyY2VsRmlsZURlc2NyaXB0b3Iub3BlbigKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoaGVhcEZpbGUpLAorICAgICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX0NSRUFURSB8CisgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfVFJVTkNBVEUgfAorICAgICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX1JFQURfV1JJVEUpOworICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvcjogVW5hYmxlIHRvIG9wZW4gZmlsZTogIiArIGhlYXBGaWxlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUFtLmR1bXBIZWFwKHByb2Nlc3MsIG1hbmFnZWQsIGhlYXBGaWxlLCBmZCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBbmRyb2lkRXhjZXB0aW9uKCJIRUFQIERVTVAgRkFJTEVEIG9uIHByb2Nlc3MgIiArIHByb2Nlc3MpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBjbGFzcyBJbnRlbnRSZWNlaXZlciBleHRlbmRzIElJbnRlbnRSZWNlaXZlci5TdHViIHsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1GaW5pc2hlZCA9IGZhbHNlOwogCkBAIC01OTMsNiArNjIyLDggQEAKICAgICAgICAgICAgICAgICAiXG4iICsKICAgICAgICAgICAgICAgICAiICAgIHN0YXJ0IHByb2ZpbGluZzogYW0gcHJvZmlsZSA8UFJPQ0VTUz4gc3RhcnQgPEZJTEU+XG4iICsKICAgICAgICAgICAgICAgICAiICAgIHN0b3AgcHJvZmlsaW5nOiBhbSBwcm9maWxlIDxQUk9DRVNTPiBzdG9wXG4iICsKKyAgICAgICAgICAgICAgICAiICAgIGR1bXAgaGVhcDogYW0gZHVtcGhlYXAgW2ZsYWdzXSA8UFJPQ0VTUz4gPEZJTEU+XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICAtbjogZHVtcCBuYXRpdmUgaGVhcCBpbnN0ZWFkIG9mIG1hbmFnZWQgaGVhcFxuIiArCiAgICAgICAgICAgICAgICAgIlxuIiArCiAgICAgICAgICAgICAgICAgIiAgICA8SU5URU5UPiBzcGVjaWZpY2F0aW9ucyBpbmNsdWRlIHRoZXNlIGZsYWdzOlxuIiArCiAgICAgICAgICAgICAgICAgIiAgICAgICAgWy1hIDxBQ1RJT04+XSBbLWQgPERBVEFfVVJJPl0gWy10IDxNSU1FX1RZUEU+XVxuIiArCkBAIC02MDAsNyArNjMxLDggQEAKICAgICAgICAgICAgICAgICAiICAgICAgICBbLWV8LS1lcyA8RVhUUkFfS0VZPiA8RVhUUkFfU1RSSU5HX1ZBTFVFPiAuLi5dXG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICBbLS1lc24gPEVYVFJBX0tFWT4gLi4uXVxuIiArCiAgICAgICAgICAgICAgICAgIiAgICAgICAgWy0tZXogPEVYVFJBX0tFWT4gPEVYVFJBX0JPT0xFQU5fVkFMVUU+IC4uLl1cbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgIFstZXwtLWVpIDxFWFRSQV9LRVk+IDxFWFRSQV9JTlRfVkFMVUU+IC4uLl1cbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIFstLWVpIDxFWFRSQV9LRVk+IDxFWFRSQV9JTlRfVkFMVUU+IC4uLl1cbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIFstLWVsIDxFWFRSQV9LRVk+IDxFWFRSQV9MT05HX1ZBTFVFPiAuLi5dXG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICBbLW4gPENPTVBPTkVOVD5dIFstZiA8RkxBR1M+XVxuIiArCiAgICAgICAgICAgICAgICAgIiAgICAgICAgWy0tZ3JhbnQtcmVhZC11cmktcGVybWlzc2lvbl0gWy0tZ3JhbnQtd3JpdGUtdXJpLXBlcm1pc3Npb25dXG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICBbLS1kZWJ1Zy1sb2ctcmVzb2x1dGlvbl1cbiIgKwpkaWZmIC0tZ2l0IGEvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmMgYi9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuYwppbmRleCAwODJlNzA0Li44ZjM2NDJjIDEwMDY0NAotLS0gYS9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuYworKysgYi9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuYwpAQCAtMzksNiArMzksOCBAQAogc3RhdGljIGNoYXIgY21kbGluZV9idWZbMTYzODRdID0gIih1bmtub3duKSI7CiBzdGF0aWMgY29uc3QgY2hhciAqZHVtcF90cmFjZXNfcGF0aCA9IE5VTEw7CiAKK3N0YXRpYyBjaGFyIHNjcmVlbnNob3RfcGF0aFtQQVRIX01BWF0gPSAiIjsKKwogLyogZHVtcHMgdGhlIGN1cnJlbnQgc3lzdGVtIHN0YXRlIHRvIHN0ZG91dCAqLwogc3RhdGljIHZvaWQgZHVtcHN0YXRlKCkgewogICAgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwpAQCAtNzYsNiArNzgsMTIgQEAKICAgICBkdW1wX2ZpbGUoIlNMQUIgSU5GTyIsICIvcHJvYy9zbGFiaW5mbyIpOwogICAgIGR1bXBfZmlsZSgiWk9ORUlORk8iLCAiL3Byb2Mvem9uZWluZm8iKTsKIAorICAgIGlmIChzY3JlZW5zaG90X3BhdGhbMF0pIHsKKyAgICAgICAgTE9HSSgidGFraW5nIHNjcmVlbnNob3RcbiIpOworICAgICAgICBydW5fY29tbWFuZChOVUxMLCA1LCAic3UiLCAicm9vdCIsICJzY3JlZW5zaG90Iiwgc2NyZWVuc2hvdF9wYXRoLCBOVUxMKTsKKyAgICAgICAgTE9HSSgid3JvdGUgc2NyZWVuc2hvdDogJXNcbiIsIHNjcmVlbnNob3RfcGF0aCk7CisgICAgfQorCiAgICAgcnVuX2NvbW1hbmQoIlNZU1RFTSBMT0ciLCAyMCwgImxvZ2NhdCIsICItdiIsICJ0aW1lIiwgIi1kIiwgIio6diIsIE5VTEwpOwogCiAgICAgLyogc2hvdyB0aGUgdHJhY2VzIHdlIGNvbGxlY3RlZCBpbiBtYWluKCksIGlmIHRoYXQgd2FzIGRvbmUgKi8KQEAgLTEwMyw2ICsxMTEsOSBAQAogICAgIGR1bXBfZmlsZSgiTkVUV09SSyBST1VURVMiLCAiL3Byb2MvbmV0L3JvdXRlIik7CiAgICAgZHVtcF9maWxlKCJBUlAgQ0FDSEUiLCAiL3Byb2MvbmV0L2FycCIpOwogCisgICAgcnVuX2NvbW1hbmQoIldJRkkgTkVUV09SS1MiLCAyMCwKKyAgICAgICAgICAgICJzdSIsICJyb290IiwgIndwYV9jbGkiLCAibGlzdF9uZXR3b3JrcyIsIE5VTEwpOworCiAjaWZkZWYgRldEVU1QX2JjbTQzMjkKICAgICBydW5fY29tbWFuZCgiRFVNUCBXSUZJIEZJUk1XQVJFIExPRyIsIDYwLAogICAgICAgICAgICAgInN1IiwgInJvb3QiLCAiZGhkdXRpbCIsICItaSIsICJldGgwIiwgInVwbG9hZCIsICIvZGF0YS9sb2NhbC90bXAvd2xhbl9jcmFzaC5kdW1wIiwgTlVMTCk7CkBAIC0xNjQsMTggKzE3NSwyNSBAQAogfQogCiBzdGF0aWMgdm9pZCB1c2FnZSgpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBkdW1wc3RhdGUgWy1kXSBbLW8gZmlsZV0gWy1zXSBbLXpdXG4iCi0gICAgICAgICAgICAiICAtZDogYXBwZW5kIGRhdGUgdG8gZmlsZW5hbWUgKHJlcXVpcmVzIC1vKVxuIgorICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6IGR1bXBzdGF0ZSBbLWIgc291bmRmaWxlXSBbLWUgc291bmRmaWxlXSBbLW8gZmlsZSBbLWRdIFstcF0gWy16XV0gWy1zXVxuIgogICAgICAgICAgICAgIiAgLW86IHdyaXRlIHRvIGZpbGUgKGluc3RlYWQgb2Ygc3Rkb3V0KVxuIgorICAgICAgICAgICAgIiAgLWQ6IGFwcGVuZCBkYXRlIHRvIGZpbGVuYW1lIChyZXF1aXJlcyAtbylcbiIKKyAgICAgICAgICAgICIgIC16OiBnemlwIG91dHB1dCAocmVxdWlyZXMgLW8pXG4iCisgICAgICAgICAgICAiICAtcDogY2FwdHVyZSBzY3JlZW5zaG90IHRvIGZpbGVuYW1lLnBuZyAocmVxdWlyZXMgLW8pXG4iCiAgICAgICAgICAgICAiICAtczogd3JpdGUgb3V0cHV0IHRvIGNvbnRyb2wgc29ja2V0IChmb3IgaW5pdClcbiIKLSAgICAgICAgICAgICIgIC16OiBnemlwIG91dHB1dCAocmVxdWlyZXMgLW8pXG4iKTsKKyAgICAgICAgICAgICIgIC1iOiBwbGF5IHNvdW5kIGZpbGUgaW5zdGVhZCBvZiB2aWJyYXRlLCBhdCBiZWdpbm5pbmcgb2Ygam9iXG4iCisgICAgICAgICAgICAiICAtZTogcGxheSBzb3VuZCBmaWxlIGluc3RlYWQgb2YgdmlicmF0ZSwgYXQgZW5kIG9mIGpvYlxuIgorCQkpOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgICAgaW50IGRvX2FkZF9kYXRlID0gMDsKICAgICBpbnQgZG9fY29tcHJlc3MgPSAwOwogICAgIGNoYXIqIHVzZV9vdXRmaWxlID0gMDsKKyAgICBjaGFyKiBiZWdpbl9zb3VuZCA9IDA7CisgICAgY2hhciogZW5kX3NvdW5kID0gMDsKICAgICBpbnQgdXNlX3NvY2tldCA9IDA7CisgICAgaW50IGRvX2ZiID0gMDsKIAogICAgIExPR0koImJlZ2luXG4iKTsKIApAQCAtMTkxLDEzICsyMDksMTYgQEAKICAgICBkdW1wX3RyYWNlc19wYXRoID0gZHVtcF92bV90cmFjZXMoKTsKIAogICAgIGludCBjOwotICAgIHdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiZGhvOnN2eiIpKSAhPSAtMSkgeworICAgIHdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiYjpkZTpobzpzdnpwIikpICE9IC0xKSB7CiAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnYic6IGJlZ2luX3NvdW5kID0gb3B0YXJnOyAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdkJzogZG9fYWRkX2RhdGUgPSAxOyAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2UnOiBlbmRfc291bmQgPSBvcHRhcmc7ICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnbyc6IHVzZV9vdXRmaWxlID0gb3B0YXJnOyAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdzJzogdXNlX3NvY2tldCA9IDE7ICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ3YnOiBicmVhazsgIC8vIGNvbXBhdGliaWxpdHkgbm8tb3AKICAgICAgICAgICAgIGNhc2UgJ3onOiBkb19jb21wcmVzcyA9IDY7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAncCc6IGRvX2ZiID0gMTsgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICc/JzogcHJpbnRmKCJcbiIpOwogICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgICAgICAgdXNhZ2UoKTsKQEAgLTIzNCw2ICsyNTUsMTAgQEAKICAgICAgICAgICAgIHN0cmZ0aW1lKGRhdGUsIHNpemVvZihkYXRlKSwgIi0lWS0lbS0lZC0lSC0lTS0lUyIsIGxvY2FsdGltZSgmbm93KSk7CiAgICAgICAgICAgICBzdHJsY2F0KHBhdGgsIGRhdGUsIHNpemVvZihwYXRoKSk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGRvX2ZiKSB7CisgICAgICAgICAgICBzdHJsY3B5KHNjcmVlbnNob3RfcGF0aCwgcGF0aCwgc2l6ZW9mKHNjcmVlbnNob3RfcGF0aCkpOworICAgICAgICAgICAgc3RybGNhdChzY3JlZW5zaG90X3BhdGgsICIucG5nIiwgc2l6ZW9mKHNjcmVlbnNob3RfcGF0aCkpOworICAgICAgICB9CiAgICAgICAgIHN0cmxjYXQocGF0aCwgIi50eHQiLCBzaXplb2YocGF0aCkpOwogICAgICAgICBpZiAoZG9fY29tcHJlc3MpIHN0cmxjYXQocGF0aCwgIi5neiIsIHNpemVvZihwYXRoKSk7CiAgICAgICAgIHN0cmxjcHkodG1wX3BhdGgsIHBhdGgsIHNpemVvZih0bXBfcGF0aCkpOwpAQCAtMjQxLDE2ICsyNjYsMTggQEAKICAgICAgICAgZ3ppcF9waWQgPSByZWRpcmVjdF90b19maWxlKHN0ZG91dCwgdG1wX3BhdGgsIGRvX2NvbXByZXNzKTsKICAgICB9CiAKLSAgICAvKiBienp6enp6ICovCi0gICAgaWYgKHZpYnJhdG9yKSB7CisgICAgaWYgKGJlZ2luX3NvdW5kKSB7CisgICAgICAgIHBsYXlfc291bmQoYmVnaW5fc291bmQpOworICAgIH0gZWxzZSBpZiAodmlicmF0b3IpIHsKICAgICAgICAgZnB1dHMoIjE1MCIsIHZpYnJhdG9yKTsKICAgICAgICAgZmZsdXNoKHZpYnJhdG9yKTsKICAgICB9CiAKICAgICBkdW1wc3RhdGUoKTsKIAotICAgIC8qIGJ6enogYnp6eiBienp6ICovCi0gICAgaWYgKHZpYnJhdG9yKSB7CisgICAgaWYgKGVuZF9zb3VuZCkgeworICAgICAgICBwbGF5X3NvdW5kKGVuZF9zb3VuZCk7CisgICAgfSBlbHNlIGlmICh2aWJyYXRvcikgewogICAgICAgICBpbnQgaTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogICAgICAgICAgICAgZnB1dHMoIjc1XG4iLCB2aWJyYXRvcik7CmRpZmYgLS1naXQgYS9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuaCBiL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5oCmluZGV4IDY4MmVhZmQuLjgzYjFkMTEgMTAwNjQ0Ci0tLSBhL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5oCisrKyBiL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5oCkBAIC00NCw0ICs0NCw3IEBACiAvKiBEaXNwbGF5cyBhIGJsb2NrZWQgcHJvY2Vzc2VzIGluLWtlcm5lbCB3YWl0IGNoYW5uZWwgKi8KIHZvaWQgc2hvd193Y2hhbihpbnQgcGlkLCBjb25zdCBjaGFyICpuYW1lKTsKIAorLyogUGxheSBhIHNvdW5kIHZpYSBTdGFnZWZyaWdodCAqLwordm9pZCBwbGF5X3NvdW5kKGNvbnN0IGNoYXIqIHBhdGgpOworCiAjZW5kaWYgLyogX0RVTVBTVEFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvY21kcy9kdW1wc3RhdGUvdXRpbHMuYyBiL2NtZHMvZHVtcHN0YXRlL3V0aWxzLmMKaW5kZXggYzdhNzhjYy4uZjkyYWNiYmIgMTAwNjQ0Ci0tLSBhL2NtZHMvZHVtcHN0YXRlL3V0aWxzLmMKKysrIGIvY21kcy9kdW1wc3RhdGUvdXRpbHMuYwpAQCAtNDI5LDMgKzQyOSw3IEBACiAgICAgcmVuYW1lKGFucl90cmFjZXNfcGF0aCwgdHJhY2VzX3BhdGgpOwogICAgIHJldHVybiBkdW1wX3RyYWNlc19wYXRoOwogfQorCit2b2lkIHBsYXlfc291bmQoY29uc3QgY2hhciogcGF0aCkgeworICAgIHJ1bl9jb21tYW5kKE5VTEwsIDUsICIvc3lzdGVtL2Jpbi9zdGFnZWZyaWdodCIsICItbyIsICItYSIsIHBhdGgsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5zaG90L0FuZHJvaWQubWsgYi9jbWRzL3NjcmVlbnNob3QvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWM3YWViCi0tLSAvZGV2L251bGwKKysrIGIvY21kcy9zY3JlZW5zaG90L0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNiBAQAoraWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IHNjcmVlbnNob3QuYworCitMT0NBTF9NT0RVTEUgOj0gc2NyZWVuc2hvdAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscyBsaWJ6CitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYnBuZworTE9DQUxfQ19JTkNMVURFUyArPSBleHRlcm5hbC96bGliCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5zaG90L3NjcmVlbnNob3QuYyBiL2NtZHMvc2NyZWVuc2hvdC9zY3JlZW5zaG90LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4NjM2YwotLS0gL2Rldi9udWxsCisrKyBiL2NtZHMvc2NyZWVuc2hvdC9zY3JlZW5zaG90LmMKQEAgLTAsMCArMSwxNzEgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNpbmNsdWRlIDx6bGliLmg+CisjaW5jbHVkZSA8bGlicG5nL3BuZy5oPgorCisjaW5jbHVkZSAicHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmgiCisKKyNkZWZpbmUgTE9HX1RBRyAic2NyZWVuc2hvdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordm9pZCB0YWtlX3NjcmVlbnNob3QoRklMRSAqZmJfaW4sIEZJTEUgKmZiX291dCkgeworICAgIGludCBmYjsKKyAgICBjaGFyIGltZ2J1ZlsweDEwMDAwXTsKKyAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmluZm87CisgICAgcG5nX3N0cnVjdHAgcG5nOworICAgIHBuZ19pbmZvcCBpbmZvOworICAgIHVuc2lnbmVkIGludCByLGMscm93bGVuOworICAgIHVuc2lnbmVkIGludCBieXRlc3BwLG9mZnNldDsKKworICAgIGZiID0gZmlsZW5vKGZiX2luKTsKKyAgICBpZihmYiA8IDApIHsKKyAgICAgICAgTE9HRSgiZmFpbGVkIHRvIG9wZW4gZnJhbWVidWZmZXJcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZiX2luID0gZmRvcGVuKGZiLCAiciIpOworCisgICAgaWYoaW9jdGwoZmIsIEZCSU9HRVRfVlNDUkVFTklORk8sICZ2aW5mbykgPCAwKSB7CisgICAgICAgIExPR0UoImZhaWxlZCB0byBnZXQgZnJhbWVidWZmZXIgaW5mb1xuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmNudGwoZmIsIEZfU0VURkQsIEZEX0NMT0VYRUMpOworCisgICAgcG5nID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAocG5nID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiZmFpbGVkIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XG4iKTsKKyAgICAgICAgZmNsb3NlKGZiX2luKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBuZ19pbml0X2lvKHBuZywgZmJfb3V0KTsKKyAgICBpbmZvID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmcpOworICAgIGlmIChpbmZvID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiZmFpbGVkIHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3RcbiIpOworICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZywgTlVMTCk7CisgICAgICAgIGZjbG9zZShmYl9pbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZykpKSB7CisgICAgICAgIExPR0UoImZhaWxlZCBwbmcgc2V0am1wXG4iKTsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmcsIE5VTEwpOworICAgICAgICBmY2xvc2UoZmJfaW4pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYnl0ZXNwcCA9IHZpbmZvLmJpdHNfcGVyX3BpeGVsIC8gODsKKyAgICBwbmdfc2V0X0lIRFIocG5nLCBpbmZvLAorICAgICAgICB2aW5mby54cmVzLCB2aW5mby55cmVzLCB2aW5mby5iaXRzX3Blcl9waXhlbCAvIDQsIAorICAgICAgICBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEsIFBOR19JTlRFUkxBQ0VfTk9ORSwKKyAgICAgICAgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSwgUE5HX0ZJTFRFUl9UWVBFX0JBU0UpOworICAgIHBuZ193cml0ZV9pbmZvKHBuZywgaW5mbyk7CisKKyAgICByb3dsZW49dmluZm8ueHJlcyAqIGJ5dGVzcHA7CisgICAgaWYgKHJvd2xlbiA+IHNpemVvZihpbWdidWYpKSB7CisgICAgICAgIExPR0UoImNyYXp5IHJvd2xlbjogJWRcbiIsIHJvd2xlbik7CisgICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nLCBOVUxMKTsKKyAgICAgICAgZmNsb3NlKGZiX2luKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG9mZnNldCA9IHZpbmZvLnhvZmZzZXQgKiBieXRlc3BwICsgdmluZm8ueHJlcyAqIHZpbmZvLnlvZmZzZXQgKiBieXRlc3BwOworICAgIGZzZWVrKGZiX2luLCBvZmZzZXQsIFNFRUtfU0VUKTsKKworICAgIGZvcihyPTA7IHI8dmluZm8ueXJlczsgcisrKSB7CisgICAgICAgIGludCBsZW4gPSBmcmVhZChpbWdidWYsIDEsIHJvd2xlbiwgZmJfaW4pOworICAgICAgICBpZiAobGVuIDw9IDApIGJyZWFrOworICAgICAgICBwbmdfd3JpdGVfcm93KHBuZywgKHBuZ19ieXRlcClpbWdidWYpOworICAgIH0KKworICAgIHBuZ193cml0ZV9lbmQocG5nLCBpbmZvKTsKKyAgICBmY2xvc2UoZmJfaW4pOworICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nLCBOVUxMKTsKK30KKwordm9pZCBmb3JrX3NvdW5kKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgICBwaWRfdCBwaWQgPSBmb3JrKCk7CisgICAgaWYgKHBpZCA9PSAwKSB7CisgICAgICAgIGV4ZWNsKCIvc3lzdGVtL2Jpbi9zdGFnZWZyaWdodCIsICJzdGFnZWZyaWdodCIsICItbyIsICItYSIsIHBhdGgsIE5VTEwpOworICAgIH0KK30KKwordm9pZCB1c2FnZSgpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJ1c2FnZTogc2NyZWVuc2hvdCBbLXMgc291bmRmaWxlXSBmaWxlbmFtZS5wbmdcbiIKKyAgICAgICAgICAgICIgICAtczogcGxheSBhIHNvdW5kIGVmZmVjdCB0byBzaWduYWwgc3VjY2Vzc1xuIgorICAgICAgICAgICAgIiAgIC1pOiBhdXRvaW5jcmVtZW50IHRvIGF2b2lkIG92ZXJ3cml0aW5nIGZpbGVuYW1lLnBuZ1xuIgorICAgICk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiphcmd2KSB7CisgICAgRklMRSAqcG5nID0gTlVMTDsKKyAgICBGSUxFICpmYl9pbiA9IE5VTEw7CisgICAgY2hhciBvdXRmaWxlW1BBVEhfTUFYXSA9ICIiOworCisgICAgY2hhciAqIHNvdW5kZmlsZSA9IE5VTEw7CisgICAgaW50IGRvX2luY3JlbWVudCA9IDA7CisKKyAgICBpbnQgYzsKKyAgICB3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgInM6aSIpKSAhPSAtMSkgeworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ3MnOiBzb3VuZGZpbGUgPSBvcHRhcmc7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnaSc6IGRvX2luY3JlbWVudCA9IDE7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnPyc6CisgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgICAgICB1c2FnZSgpOyBleGl0KDEpOworICAgICAgICB9CisgICAgfQorICAgIGFyZ2MgLT0gb3B0aW5kOworICAgIGFyZ3YgKz0gb3B0aW5kOworCisgICAgaWYgKGFyZ2MgPCAxKSB7CisgICAgICAgIHVzYWdlKCk7IGV4aXQoMSk7CisgICAgfQorCisgICAgc3RybGNweShvdXRmaWxlLCBhcmd2WzBdLCBQQVRIX01BWCk7CisgICAgaWYgKGRvX2luY3JlbWVudCkgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICAgICAgY2hhciBiYXNlW1BBVEhfTUFYXSA9ICIiOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIHdoaWxlIChzdGF0KG91dGZpbGUsICZzdCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFiYXNlWzBdKSB7CisgICAgICAgICAgICAgICAgY2hhciAqcCA9IHN0cnJjaHIob3V0ZmlsZSwgJy4nKTsKKyAgICAgICAgICAgICAgICBpZiAocCkgKnAgPSAnXDAnOworICAgICAgICAgICAgICAgIHN0cmNweShiYXNlLCBvdXRmaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNucHJpbnRmKG91dGZpbGUsIFBBVEhfTUFYLCAiJXMtJWQucG5nIiwgYmFzZSwgKytpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZiX2luID0gZm9wZW4oIi9kZXYvZ3JhcGhpY3MvZmIwIiwgInIiKTsKKyAgICBpZiAoIWZiX2luKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGNvdWxkIG5vdCByZWFkIGZyYW1lYnVmZmVyXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvKiBzd2l0Y2ggdG8gbm9uLXJvb3QgdXNlciBhbmQgZ3JvdXAgKi8KKyAgICBnaWRfdCBncm91cHNbXSA9IHsgQUlEX0xPRywgQUlEX1NEQ0FSRF9SVyB9OworICAgIHNldGdyb3VwcyhzaXplb2YoZ3JvdXBzKS9zaXplb2YoZ3JvdXBzWzBdKSwgZ3JvdXBzKTsKKyAgICBzZXR1aWQoQUlEX1NIRUxMKTsKKworICAgIHBuZyA9IGZvcGVuKG91dGZpbGUsICJ3Iik7CisgICAgaWYgKCFwbmcpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvcjogd3JpdGluZyBmaWxlICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBvdXRmaWxlLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHRha2Vfc2NyZWVuc2hvdChmYl9pbiwgcG5nKTsKKworICAgIGlmIChzb3VuZGZpbGUpIHsKKyAgICAgICAgZm9ya19zb3VuZChzb3VuZGZpbGUpOworICAgIH0KKworICAgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9BY2NvdW50TWFuYWdlclNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FjY291bnRzL0FjY291bnRNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDFkOWUwZjEuLmU2YjFjMDggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FjY291bnRzL0FjY291bnRNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FjY291bnRzL0FjY291bnRNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0zOTksMTkgKzM5OSwxOSBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIGluc2VydEFjY291bnRJbnRvRGF0YWJhc2UoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgcGFzc3dvcmQsIEJ1bmRsZSBleHRyYXMpIHsKICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBib29sZWFuIG5vQnJvYWRjYXN0ID0gYWNjb3VudC50eXBlLmVxdWFscyhHT09HTEVfQUNDT1VOVF9UWVBFKQorICAgICAgICAgICAgICAgICYmIGV4dHJhcyAhPSBudWxsICYmIGV4dHJhcy5nZXRCb29sZWFuKE5PX0JST0FEQ0FTVF9GTEFHLCBmYWxzZSk7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgJ25vYnJvYWRjYXN0JyBmbGFnIHNpbmNlIHdlIGRvbid0IHdhbnQgaXQgdG8gcGVyc2lzdCBpbiB0aGUgZGIuIEl0IGlzIGluc3RlYWQKKyAgICAgICAgLy8gdXNlZCBhcyBhIGNvbnRyb2wgc2lnbmFsIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgaW5zZXJ0aW9uIHNob3VsZCByZXN1bHQgaW4KKyAgICAgICAgLy8gYW4gYWNjb3VudHMgY2hhbmdlZCBicm9hZGNhc3QgYmVpbmcgc2VudC4KKyAgICAgICAgaWYgKGV4dHJhcyAhPSBudWxsKSB7CisgICAgICAgICAgICBleHRyYXMucmVtb3ZlKE5PX0JST0FEQ0FTVF9GTEFHKTsKKyAgICAgICAgfQogICAgICAgICBkYi5iZWdpblRyYW5zYWN0aW9uKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9vbGVhbiBub0Jyb2FkY2FzdCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGFjY291bnQudHlwZS5lcXVhbHMoR09PR0xFX0FDQ09VTlRfVFlQRSkpIHsKLSAgICAgICAgICAgICAgICAvLyBMb29rIGZvciB0aGUgJ25vYnJvYWRjYXN0JyBmbGFnIGFuZCByZW1vdmUgaXQgc2luY2Ugd2UgZG9uJ3Qgd2FudCBpdCB0byBwZXJzaXN0Ci0gICAgICAgICAgICAgICAgLy8gaW4gdGhlIGRiLgotICAgICAgICAgICAgICAgIG5vQnJvYWRjYXN0ID0gZXh0cmFzLmdldEJvb2xlYW4oTk9fQlJPQURDQVNUX0ZMQUcsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBleHRyYXMucmVtb3ZlKE5PX0JST0FEQ0FTVF9GTEFHKTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgbG9uZyBudW1NYXRjaGVzID0gRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkoZGIsCiAgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEFCTEVfQUNDT1VOVFMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgV0hFUkUgIiArIEFDQ09VTlRTX05BTUUgKyAiPT8gQU5EICIgKyBBQ0NPVU5UU19UWVBFKyAiPT8iLApAQCAtNDM2LDEzICs0MzYsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBkYi5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKLSAgICAgICAgICAgIGlmICghbm9Ccm9hZGNhc3QpIHsKLSAgICAgICAgICAgICAgICBzZW5kQWNjb3VudHNDaGFuZ2VkQnJvYWRjYXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKCFub0Jyb2FkY2FzdCkgeworICAgICAgICAgICAgc2VuZEFjY291bnRzQ2hhbmdlZEJyb2FkY2FzdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIHByaXZhdGUgbG9uZyBpbnNlcnRFeHRyYShTUUxpdGVEYXRhYmFzZSBkYiwgbG9uZyBhY2NvdW50SWQsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewpAQCAtMTY1Nyw3ICsxNjU3LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkc1Byb3Zpc2lvbmluZzsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBuZWVkc1Byb3Zpc2lvbmluZyA9IHRlbGVwaG9ueS5nZXRDZG1hTmVlZHNQcm92aXNpb25pbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSB0ZWxlcGhvbnkubmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiZXhjZXB0aW9uIHdoaWxlIGNoZWNraW5nIHByb3Zpc2lvbmluZyIsIGUpOwogICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIE5PVCB3aXBpbmcgb3V0IHRoZSBwYXNzd29yZHMKQEAgLTE2ODEsMTEgKzE2ODEsMTEgQEAKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBkYi5leGVjU1FMKCJERUxFVEUgZnJvbSAiICsgVEFCTEVfQVVUSFRPS0VOUyk7CiAgICAgICAgICAgICAgICAgICAgIGRiLmV4ZWNTUUwoIlVQREFURSAiICsgVEFCTEVfQUNDT1VOVFMgKyAiIFNFVCAiICsgQUNDT1VOVFNfUEFTU1dPUkQgKyAiID0gJyciKTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZEFjY291bnRzQ2hhbmdlZEJyb2FkY2FzdCgpOwogICAgICAgICAgICAgICAgICAgICBkYi5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZW5kQWNjb3VudHNDaGFuZ2VkQnJvYWRjYXN0KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZXRNZXRhVmFsdWUoImltc2kiLCBpbXNpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdGFibGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjZjdjMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRhYmxlLmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBzdXBlcmNsYXNzIGZvciBjbGFzc2VzIHdoaWNoIHByb3ZpZGUgYmFzaWMgc3VwcG9ydCBmb3IgYW5pbWF0aW9ucyB3aGljaCBjYW4gYmUKKyAqIHN0YXJ0ZWQsIGVuZGVkLCBhbmQgaGF2ZSA8Y29kZT5BbmltYXRhYmxlTGlzdGVuZXJzPC9jb2RlPiBhZGRlZCB0byB0aGVtLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5pbWF0YWJsZSBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgbGlzdGVuZXJzIHRvIGJlIHNlbnQgZXZlbnRzIHRocm91Z2ggdGhlIGxpZmUgb2YgYW4gYW5pbWF0aW9uLgorICAgICAqLworICAgIEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+IG1MaXN0ZW5lcnMgPSBudWxsOworCisgICAgLyoqCisgICAgICogU3RhcnRzIHRoaXMgYW5pbWF0aW9uLiBJZiB0aGUgYW5pbWF0aW9uIGhhcyBhIG5vbnplcm8gc3RhcnREZWxheSwgdGhlIGFuaW1hdGlvbiB3aWxsIHN0YXJ0CisgICAgICogcnVubmluZyBhZnRlciB0aGF0IGRlbGF5IGVsYXBzZXMuIE5vdGUgdGhhdCB0aGUgYW5pbWF0aW9uIGRvZXMgbm90IHN0YXJ0IHN5bmNocm9ub3VzbHkgd2l0aAorICAgICAqIHRoaXMgY2FsbCwgYmVjYXVzZSBhbGwgYW5pbWF0aW9uIGV2ZW50cyBhcmUgcG9zdGVkIHRvIGEgY2VudHJhbCB0aW1pbmcgbG9vcCBzbyB0aGF0IGFuaW1hdGlvbgorICAgICAqIHRpbWVzIGFyZSBhbGwgc3luY2hyb25pemVkIG9uIGEgc2luZ2xlIHRpbWluZyBwdWxzZSBvbiB0aGUgVUkgdGhyZWFkLiBTbyB0aGUgYW5pbWF0aW9uIHdpbGwKKyAgICAgKiBzdGFydCB0aGUgbmV4dCB0aW1lIHRoYXQgZXZlbnQgaGFuZGxlciBwcm9jZXNzZXMgZXZlbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbmNlbHMgdGhlIGFuaW1hdGlvbi4gVW5saWtlIHtAbGluayAjZW5kKCl9LCA8Y29kZT5jYW5jZWwoKTwvY29kZT4gY2F1c2VzIHRoZSBhbmltYXRpb24gdG8KKyAgICAgKiBzdG9wIGluIGl0cyB0cmFja3MsIHNlbmRpbmcgYW4ge0BsaW5rIEFuaW1hdGFibGVMaXN0ZW5lciNvbkFuaW1hdGlvbkNhbmNlbChBbmltYXRhYmxlKX0gdG8KKyAgICAgKiBpdHMgbGlzdGVuZXJzLCBmb2xsb3dlZCBieSBhbiB7QGxpbmsgQW5pbWF0YWJsZUxpc3RlbmVyI29uQW5pbWF0aW9uRW5kKEFuaW1hdGFibGUpfSBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmRzIHRoZSBhbmltYXRpb24uIFRoaXMgY2F1c2VzIHRoZSBhbmltYXRpb24gdG8gYXNzaWduIHRoZSBlbmQgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nCisgICAgICogYW5pbWF0ZWQsIHRoZW4gY2FsbGluZyB0aGUge0BsaW5rIEFuaW1hdGFibGVMaXN0ZW5lciNvbkFuaW1hdGlvbkVuZChBbmltYXRhYmxlKX0gbWV0aG9kIG9uCisgICAgICogaXRzIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmQoKSB7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBBbmltYXRhYmxlIGlzIGN1cnJlbnRseSBydW5uaW5nIChoYXZpbmcgYmVlbiBzdGFydGVkIGFuZCBub3QgeWV0IGVuZGVkKS4KKyAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIEFuaW1hdGFibGUgaXMgcnVubmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1J1bm5pbmcoKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgc2V0IG9mIGxpc3RlbmVycyB0aGF0IGFyZSBzZW50IGV2ZW50cyB0aHJvdWdoIHRoZSBsaWZlIG9mIGFuCisgICAgICogYW5pbWF0aW9uLCBzdWNoIGFzIHN0YXJ0LCByZXBlYXQsIGFuZCBlbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IHNldCBvZiBsaXN0ZW5lcnMgZm9yIHRoaXMgYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKEFuaW1hdGFibGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobUxpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBzZXQgbGlzdGVuaW5nIHRvIHRoaXMgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkIGZyb20gdGhlIGN1cnJlbnQgc2V0IG9mIGxpc3RlbmVycyBmb3IgdGhpcworICAgICAqICAgICAgICAgICAgICAgICBhbmltYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoQW5pbWF0YWJsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgIGlmIChtTGlzdGVuZXJzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNldCBvZiB7QGxpbmsgQW5pbWF0YWJsZUxpc3RlbmVyfSBvYmplY3RzIHRoYXQgYXJlIGN1cnJlbnRseQorICAgICAqIGxpc3RlbmluZyBmb3IgZXZlbnRzIG9uIHRoaXMgPGNvZGU+QW5pbWF0YWJsZTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBBcnJheUxpc3Q8QW5pbWF0YWJsZUxpc3RlbmVyPiBUaGUgc2V0IG9mIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXJyYXlMaXN0PEFuaW1hdGFibGVMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gbUxpc3RlbmVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCBsaXN0ZW5lcnMgZnJvbSB0aGlzIG9iamVjdC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAgICAgKiA8Y29kZT5nZXRMaXN0ZW5lcnMoKTwvY29kZT4gZm9sbG93ZWQgYnkgY2FsbGluZyA8Y29kZT5jbGVhcigpPC9jb2RlPiBvbiB0aGUKKyAgICAgKiByZXR1cm5lZCBsaXN0IG9mIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBbGxMaXN0ZW5lcnMoKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1MaXN0ZW5lcnMgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFuaW1hdGFibGUgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBbmltYXRhYmxlIGFuaW0gPSAoQW5pbWF0YWJsZSkgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdGFibGVMaXN0ZW5lcj4gb2xkTGlzdGVuZXJzID0gbUxpc3RlbmVyczsKKyAgICAgICAgICAgIGFuaW0ubUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0YWJsZUxpc3RlbmVyPigpOworICAgICAgICAgICAgaW50IG51bUxpc3RlbmVycyA9IG9sZExpc3RlbmVycy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxpc3RlbmVyczsgKytpKSB7CisgICAgICAgICAgICAgICAgYW5pbS5tTGlzdGVuZXJzLmFkZChvbGRMaXN0ZW5lcnMuZ2V0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5pbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5BbiBhbmltYXRpb24gbGlzdGVuZXIgcmVjZWl2ZXMgbm90aWZpY2F0aW9ucyBmcm9tIGFuIGFuaW1hdGlvbi4KKyAgICAgKiBOb3RpZmljYXRpb25zIGluZGljYXRlIGFuaW1hdGlvbiByZWxhdGVkIGV2ZW50cywgc3VjaCBhcyB0aGUgZW5kIG9yIHRoZQorICAgICAqIHJlcGV0aXRpb24gb2YgdGhlIGFuaW1hdGlvbi48L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQW5pbWF0YWJsZUxpc3RlbmVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPk5vdGlmaWVzIHRoZSBzdGFydCBvZiB0aGUgYW5pbWF0aW9uLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW1hdGlvbiBUaGUgc3RhcnRlZCBhbmltYXRpb24uCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0YWJsZSBhbmltYXRpb24pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Ob3RpZmllcyB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24uIFRoaXMgY2FsbGJhY2sgaXMgbm90IGludm9rZWQKKyAgICAgICAgICogZm9yIGFuaW1hdGlvbnMgd2l0aCByZXBlYXQgY291bnQgc2V0IHRvIElORklOSVRFLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHdoaWNoIHJlYWNoZWQgaXRzIGVuZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0YWJsZSBhbmltYXRpb24pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Ob3RpZmllcyB0aGUgY2FuY2VsbGF0aW9uIG9mIHRoZSBhbmltYXRpb24uIFRoaXMgY2FsbGJhY2sgaXMgbm90IGludm9rZWQKKyAgICAgICAgICogZm9yIGFuaW1hdGlvbnMgd2l0aCByZXBlYXQgY291bnQgc2V0IHRvIElORklOSVRFLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHdoaWNoIHdhcyBjYW5jZWxlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25BbmltYXRpb25DYW5jZWwoQW5pbWF0YWJsZSBhbmltYXRpb24pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Ob3RpZmllcyB0aGUgcmVwZXRpdGlvbiBvZiB0aGUgYW5pbWF0aW9uLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHdoaWNoIHdhcyByZXBlYXRlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0YWJsZSBhbmltYXRpb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRhYmxlSW5mbGF0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRhYmxlSW5mbGF0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGZhNzdlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdGFibGVJbmZsYXRlci5qYXZhCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGluc3RhbnRpYXRlIG1lbnUgWE1MIGZpbGVzIGludG8gQW5pbWF0YWJsZSBvYmplY3RzLgorICogPHA+CisgKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgbWVudSBpbmZsYXRpb24gcmVsaWVzIGhlYXZpbHkgb24gcHJlLXByb2Nlc3Npbmcgb2YKKyAqIFhNTCBmaWxlcyB0aGF0IGlzIGRvbmUgYXQgYnVpbGQgdGltZS4gVGhlcmVmb3JlLCBpdCBpcyBub3QgY3VycmVudGx5IHBvc3NpYmxlCisgKiB0byB1c2UgTWVudUluZmxhdGVyIHdpdGggYW4gWG1sUHVsbFBhcnNlciBvdmVyIGEgcGxhaW4gWE1MIGZpbGUgYXQgcnVudGltZTsKKyAqIGl0IG9ubHkgd29ya3Mgd2l0aCBhbiBYbWxQdWxsUGFyc2VyIHJldHVybmVkIGZyb20gYSBjb21waWxlZCByZXNvdXJjZSAoUi4KKyAqIDxlbT5zb21ldGhpbmc8L2VtPiBmaWxlLikKKyAqLworcHVibGljIGNsYXNzIEFuaW1hdGFibGVJbmZsYXRlciB7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSBmbGFncyBhcmUgdXNlZCB3aGVuIHBhcnNpbmcgU2VxdWVuY2VyIG9iamVjdHMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9HRVRIRVIgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVFVRU5USUFMTFkgPSAxOworCisgICAgLyoqCisgICAgICogRW51bSB2YWx1ZXMgdXNlZCBpbiBYTUwgYXR0cmlidXRlcyB0byBpbmRpY2F0ZSB0aGUgdmFsdWUgZm9yIG1WYWx1ZVR5cGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfVFlQRV9GTE9BVCAgICAgICA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTFVFX1RZUEVfSU5UICAgICAgICAgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxVRV9UWVBFX0RPVUJMRSAgICAgID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfVFlQRV9DT0xPUiAgICAgICA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTFVFX1RZUEVfQ1VTVE9NICAgICAgPSA0OworCisgICAgLyoqCisgICAgICogTG9hZHMgYW4ge0BsaW5rIEFuaW1hdGFibGV9IG9iamVjdCBmcm9tIGEgcmVzb3VyY2UKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IEFwcGxpY2F0aW9uIGNvbnRleHQgdXNlZCB0byBhY2Nlc3MgcmVzb3VyY2VzCisgICAgICogQHBhcmFtIGlkIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgYW5pbWF0aW9uIHRvIGxvYWQKKyAgICAgKiBAcmV0dXJuIFRoZSBhbmltYXRhYmxlIG9iamVjdCByZWZlcmVuY2UgYnkgdGhlIHNwZWNpZmllZCBpZAorICAgICAqIEB0aHJvd3MgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24gd2hlbiB0aGUgYW5pbWF0aW9uIGNhbm5vdCBiZSBsb2FkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFuaW1hdGFibGUgbG9hZEFuaW1hdGFibGUoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQpCisgICAgICAgICAgICB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJzZXIgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldEFuaW1hdGlvbihpZCk7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlQW5pbWF0YWJsZUZyb21YbWwoY29udGV4dCwgcGFyc2VyKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uIHJuZiA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24oIkNhbid0IGxvYWQgYW5pbWF0aW9uIHJlc291cmNlIElEICMweCIgKworICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKGlkKSk7CisgICAgICAgICAgICBybmYuaW5pdENhdXNlKGV4KTsKKyAgICAgICAgICAgIHRocm93IHJuZjsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiBybmYgPQorICAgICAgICAgICAgICAgICAgICBuZXcgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uKCJDYW4ndCBsb2FkIGFuaW1hdGlvbiByZXNvdXJjZSBJRCAjMHgiICsKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhpZCkpOworICAgICAgICAgICAgcm5mLmluaXRDYXVzZShleCk7CisgICAgICAgICAgICB0aHJvdyBybmY7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpIHBhcnNlci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQW5pbWF0YWJsZSBjcmVhdGVBbmltYXRhYmxlRnJvbVhtbChDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyKQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gY3JlYXRlQW5pbWF0YWJsZUZyb21YbWwoYywgcGFyc2VyLCBYbWwuYXNBdHRyaWJ1dGVTZXQocGFyc2VyKSwgbnVsbCwgMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQW5pbWF0YWJsZSBjcmVhdGVBbmltYXRhYmxlRnJvbVhtbChDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgQXR0cmlidXRlU2V0IGF0dHJzLCBTZXF1ZW5jZXIgcGFyZW50LCBpbnQgc2VxdWVuY2VPcmRlcmluZykKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgQW5pbWF0YWJsZSBhbmltID0gbnVsbDsKKyAgICAgICAgQXJyYXlMaXN0PEFuaW1hdGFibGU+IGNoaWxkQW5pbXMgPSBudWxsOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgb24gYSBzdGFydCB0YWcuCisgICAgICAgIGludCB0eXBlOworICAgICAgICBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKKworICAgICAgICB3aGlsZSAoKCh0eXBlPXBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCBwYXJzZXIuZ2V0RGVwdGgoKSA+IGRlcHRoKQorICAgICAgICAgICAgICAgJiYgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkgeworCisgICAgICAgICAgICBpZiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOworCisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoInByb3BlcnR5IikpIHsKKyAgICAgICAgICAgICAgICBhbmltID0gbG9hZFByb3BlcnR5QW5pbWF0b3IoYywgYXR0cnMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygiYW5pbWF0b3IiKSkgeworICAgICAgICAgICAgICAgIGFuaW0gPSBsb2FkQW5pbWF0b3IoYywgYXR0cnMsIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygic2VxdWVuY2VyIikpIHsKKyAgICAgICAgICAgICAgICBhbmltID0gbmV3IFNlcXVlbmNlcigpOworICAgICAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IGMub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNlcXVlbmNlcik7CisgICAgICAgICAgICAgICAgaW50IG9yZGVyaW5nID0gYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU2VxdWVuY2VyX29yZGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgVE9HRVRIRVIpOworICAgICAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGFibGVGcm9tWG1sKGMsIHBhcnNlciwgYXR0cnMsIChTZXF1ZW5jZXIpIGFuaW0sICBvcmRlcmluZyk7CisgICAgICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIGFuaW1hdG9yIG5hbWU6ICIgKyBwYXJzZXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkQW5pbXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjaGlsZEFuaW1zID0gbmV3IEFycmF5TGlzdDxBbmltYXRhYmxlPigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGlsZEFuaW1zLmFkZChhbmltKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocGFyZW50ICE9IG51bGwgJiYgY2hpbGRBbmltcyAhPSBudWxsKSB7CisgICAgICAgICAgICBBbmltYXRhYmxlW10gYW5pbXNBcnJheSA9IG5ldyBBbmltYXRhYmxlW2NoaWxkQW5pbXMuc2l6ZSgpXTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBmb3IgKEFuaW1hdGFibGUgYSA6IGNoaWxkQW5pbXMpIHsKKyAgICAgICAgICAgICAgICBhbmltc0FycmF5W2luZGV4KytdID0gYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZXF1ZW5jZU9yZGVyaW5nID09IFRPR0VUSEVSKSB7CisgICAgICAgICAgICAgICAgcGFyZW50LnBsYXlUb2dldGhlcihhbmltc0FycmF5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFyZW50LnBsYXlTZXF1ZW50aWFsbHkoYW5pbXNBcnJheSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYW5pbTsKKworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFByb3BlcnR5QW5pbWF0b3IgbG9hZFByb3BlcnR5QW5pbWF0b3IoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpCisgICAgICAgICAgICB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIFByb3BlcnR5QW5pbWF0b3IgYW5pbSA9IG5ldyBQcm9wZXJ0eUFuaW1hdG9yKCk7CisKKyAgICAgICAgbG9hZEFuaW1hdG9yKGNvbnRleHQsIGF0dHJzLCBhbmltKTsKKworICAgICAgICBUeXBlZEFycmF5IGEgPQorICAgICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJvcGVydHlBbmltYXRvcik7CisKKyAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByb3BlcnR5QW5pbWF0b3JfcHJvcGVydHlOYW1lKTsKKworICAgICAgICBhbmltLnNldFByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpOworCisgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIHJldHVybiBhbmltOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgYW5pbWF0aW9uIHdob3NlIHBhcmFtZXRlcnMgY29tZSBmcm9tIHRoZSBzcGVjaWZpZWQgY29udGV4dCBhbmQKKyAgICAgKiBhdHRyaWJ1dGVzIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudAorICAgICAqIEBwYXJhbSBhdHRycyB0aGUgc2V0IG9mIGF0dHJpYnV0ZXMgaG9sZGluZyB0aGUgYW5pbWF0aW9uIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBBbmltYXRvciBsb2FkQW5pbWF0b3IoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIEFuaW1hdG9yIGFuaW0pCisgICAgICAgICAgICB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIFR5cGVkQXJyYXkgYSA9CisgICAgICAgICAgICAgICAgY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcik7CisKKyAgICAgICAgbG9uZyBkdXJhdGlvbiA9IGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX2R1cmF0aW9uLCAwKTsKKworICAgICAgICBsb25nIHN0YXJ0RGVsYXkgPSBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl9zdGFydE9mZnNldCwgMCk7CisKKyAgICAgICAgaW50IHZhbHVlVHlwZSA9IGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVHlwZSwKKyAgICAgICAgICAgICAgICBWQUxVRV9UWVBFX0ZMT0FUKTsKKworICAgICAgICBPYmplY3QgdmFsdWVGcm9tID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IHZhbHVlVG8gPSBudWxsOworICAgICAgICBUeXBlRXZhbHVhdG9yIGV2YWx1YXRvciA9IG51bGw7CisKKyAgICAgICAgc3dpdGNoICh2YWx1ZVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVkFMVUVfVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlRnJvbSA9IGEuZ2V0RmxvYXQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVGcm9tLCAwZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlVG8gPSBhLmdldEZsb2F0KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8sIDBmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZBTFVFX1RZUEVfQ09MT1I6CisgICAgICAgICAgICAgICAgZXZhbHVhdG9yID0gbmV3IFJHQkV2YWx1YXRvcigpOworICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBwaWNrIHVwIHZhbHVlcworICAgICAgICAgICAgY2FzZSBWQUxVRV9UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlRnJvbSA9IGEuZ2V0SW50ZWdlcihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20sIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZVRvKSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZVRvID0gYS5nZXRJbnRlZ2VyKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8sIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVkFMVUVfVFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgaWYgKGEuaGFzVmFsdWUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVGcm9tKSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZUZyb20gPSAoRG91YmxlKSgoRmxvYXQpKGEuZ2V0RmxvYXQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVGcm9tLCAwZikpKS5kb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZVRvKSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZVRvID0gKERvdWJsZSkoKEZsb2F0KWEuZ2V0RmxvYXQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUbywgMGYpKS5kb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVkFMVUVfVFlQRV9DVVNUT006CisgICAgICAgICAgICAgICAgLy8gVE9ETzogSG93IHRvIGdldCBhbiAnT2JqZWN0JyB2YWx1ZT8KKyAgICAgICAgICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlRnJvbSA9IGEuZ2V0RmxvYXQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVGcm9tLCAwZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlVG8gPSBhLmdldEZsb2F0KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8sIDBmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYW5pbSA9PSBudWxsKSB7CisgICAgICAgICAgICBhbmltID0gbmV3IEFuaW1hdG9yKGR1cmF0aW9uLCB2YWx1ZUZyb20sIHZhbHVlVG8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYW5pbS5zZXREdXJhdGlvbihkdXJhdGlvbik7CisgICAgICAgICAgICBhbmltLnNldFZhbHVlcyh2YWx1ZUZyb20sIHZhbHVlVG8pOworICAgICAgICB9CisKKyAgICAgICAgYW5pbS5zZXRTdGFydERlbGF5KHN0YXJ0RGVsYXkpOworCisgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3JlcGVhdENvdW50KSkgeworICAgICAgICAgICAgYW5pbS5zZXRSZXBlYXRDb3VudCgKKyAgICAgICAgICAgICAgICAgICAgYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfcmVwZWF0Q291bnQsIDApKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl9yZXBlYXRNb2RlKSkgeworICAgICAgICAgICAgYW5pbS5zZXRSZXBlYXRNb2RlKAorICAgICAgICAgICAgICAgICAgICBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl9yZXBlYXRNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuaW1hdG9yLlJFU1RBUlQpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXZhbHVhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFuaW0uc2V0RXZhbHVhdG9yKGV2YWx1YXRvcik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgcmVzSUQgPQorICAgICAgICAgICAgICAgIGEuZ2V0UmVzb3VyY2VJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl9pbnRlcnBvbGF0b3IsIDApOworICAgICAgICBpZiAocmVzSUQgPiAwKSB7CisgICAgICAgICAgICBhbmltLnNldEludGVycG9sYXRvcihBbmltYXRpb25VdGlscy5sb2FkSW50ZXJwb2xhdG9yKGNvbnRleHQsIHJlc0lEKSk7CisgICAgICAgIH0KKyAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgcmV0dXJuIGFuaW07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdGFibGVMaXN0ZW5lckFkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRhYmxlTGlzdGVuZXJBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhODQyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRhYmxlTGlzdGVuZXJBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlLkFuaW1hdGFibGVMaXN0ZW5lcjsKKworLyoqCisgKiBUaGlzIGFkYXB0ZXIgY2xhc3MgcHJvdmlkZXMgZW1wdHkgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBtZXRob2RzIGZyb20ge0BsaW5rIEFuaW1hdGFibGVMaXN0ZW5lcn0uCisgKiBBbnkgY3VzdG9tIGxpc3RlbmVyIHRoYXQgY2FyZXMgb25seSBhYm91dCBhIHN1YnNldCBvZiB0aGUgbWV0aG9kcyBvZiB0aGlzIGxpc3RlbmVyIGNhbgorICogc2ltcGx5IHN1YmNsYXNzIHRoaXMgYWRhcHRlciBjbGFzcyBpbnN0ZWFkIG9mIGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlIGRpcmVjdGx5LgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5pbWF0YWJsZUxpc3RlbmVyQWRhcHRlciBpbXBsZW1lbnRzIEFuaW1hdGFibGVMaXN0ZW5lciB7CisKKyAgICAvKioKKyAgICAgKiBAe2luaGVyaXRkb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25DYW5jZWwoQW5pbWF0YWJsZSBhbmltYXRpb24pIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAe2luaGVyaXRkb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0YWJsZSBhbmltYXRpb24pIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAe2luaGVyaXRkb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0YWJsZSBhbmltYXRpb24pIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAe2luaGVyaXRkb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44Yjc0NjU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9yLmphdmEKQEAgLTAsMCArMSw5NDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBzaW1wbGUgdGltaW5nIGVuZ2luZSBmb3IgcnVubmluZyBhbmltYXRpb25zCisgKiB3aGljaCBjYWxjdWxhdGUgYW5pbWF0ZWQgdmFsdWVzIGFuZCBzZXQgdGhlbSBvbiB0YXJnZXQgb2JqZWN0cy4KKyAqCisgKiA8cD5UaGVyZSBpcyBhIHNpbmdsZSB0aW1pbmcgcHVsc2UgdGhhdCBhbGwgYW5pbWF0aW9ucyB1c2UuIEl0IHJ1bnMgaW4gYQorICogY3VzdG9tIGhhbmRsZXIgdG8gZW5zdXJlIHRoYXQgcHJvcGVydHkgY2hhbmdlcyBoYXBwZW4gb24gdGhlIFVJIHRocmVhZC48L3A+CisgKgorICogPHA+QnkgZGVmYXVsdCwgQW5pbWF0b3IgdXNlcyBub24tbGluZWFyIHRpbWUgaW50ZXJwb2xhdGlvbiwgdmlhIHRoZQorICoge0BsaW5rIEFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yfSBjbGFzcywgd2hpY2ggYWNjZWxlcmF0ZXMgaW50byBhbmQgZGVjZWxlcmF0ZXMKKyAqIG91dCBvZiBhbiBhbmltYXRpb24uIFRoaXMgYmVoYXZpb3IgY2FuIGJlIGNoYW5nZWQgYnkgY2FsbGluZworICoge0BsaW5rIEFuaW1hdG9yI3NldEludGVycG9sYXRvcihJbnRlcnBvbGF0b3IpfS48L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBBbmltYXRvcjxUPiBleHRlbmRzIEFuaW1hdGFibGUgeworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgY29uc3RhbnRzCisgICAgICovCisKKyAgICAvKgorICAgICAqIFRoZSBkZWZhdWx0IGFtb3VudCBvZiB0aW1lIGluIG1zIGJldHdlZW4gYW5pbWF0aW9uIGZyYW1lcworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9GUkFNRV9ERUxBWSA9IDMwOworCisgICAgLyoqCisgICAgICogTWVzc2FnZXMgc2VudCB0byB0aW1pbmcgaGFuZGxlcjogU1RBUlQgaXMgc2VudCB3aGVuIGFuIGFuaW1hdGlvbiBmaXJzdCBiZWdpbnMsIEZSQU1FIGlzIHNlbnQKKyAgICAgKiBieSB0aGUgaGFuZGxlciB0byBpdHNlbGYgdG8gcHJvY2VzcyB0aGUgbmV4dCBhbmltYXRpb24gZnJhbWUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU5JTUFUSU9OX1NUQVJUID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU5JTUFUSU9OX0ZSQU1FID0gMTsKKworICAgIC8qKgorICAgICAqIFZhbHVlcyB1c2VkIHdpdGggaW50ZXJuYWwgdmFyaWFibGUgbVBsYXlpbmdTdGF0ZSB0byBpbmRpY2F0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbgorICAgICAqIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RPUFBFRCAgICA9IDA7IC8vIE5vdCB5ZXQgcGxheWluZworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5OSU5HICAgID0gMTsgLy8gUGxheWluZyBub3JtYWxseQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQU5DRUxFRCAgID0gMjsgLy8gY2FuY2VsKCkgY2FsbGVkIC0gbmVlZCB0byBlbmQgaXQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5ERUQgICAgICA9IDM7IC8vIGVuZCgpIGNhbGxlZCAtIG5lZWQgdG8gZW5kIGl0CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFRUtFRCAgICAgPSA0OyAvLyBTZWVrZWQgdG8gc29tZSB0aW1lIHZhbHVlCisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCB2YXJpYWJsZXMKKyAgICAgKiBOT1RFOiBUaGlzIG9iamVjdCBpbXBsZW1lbnRzIHRoZSBjbG9uZSgpIG1ldGhvZCwgbWFraW5nIGEgZGVlcCBjb3B5IG9mIGFueSByZWZlcmVuY2VkCisgICAgICogb2JqZWN0cy4gQXMgb3RoZXIgbm9uLXRyaXZpYWwgZmllbGRzIGFyZSBhZGRlZCB0byB0aGlzIGNsYXNzLCBtYWtlIHN1cmUgdG8gYWRkIGxvZ2ljCisgICAgICogdG8gY2xvbmUoKSB0byBtYWtlIGRlZXAgY29waWVzIG9mIHRoZW0uCisgICAgICovCisKKyAgICAvLyBUaGUgZmlyc3QgdGltZSB0aGF0IHRoZSBhbmltYXRpb24ncyBhbmltYXRlRnJhbWUoKSBtZXRob2QgaXMgY2FsbGVkLiBUaGlzIHRpbWUgaXMgdXNlZCB0bworICAgIC8vIGRldGVybWluZSBlbGFwc2VkIHRpbWUgKGFuZCB0aGVyZWZvcmUgdGhlIGVsYXBzZWQgZnJhY3Rpb24pIGluIHN1YnNlcXVlbnQgY2FsbHMKKyAgICAvLyB0byBhbmltYXRlRnJhbWUoKQorICAgIHByaXZhdGUgbG9uZyBtU3RhcnRUaW1lOworCisgICAgLyoqCisgICAgICogU2V0IHdoZW4gc2V0Q3VycmVudFBsYXlUaW1lKCkgaXMgY2FsbGVkLiBJZiBuZWdhdGl2ZSwgYW5pbWF0aW9uIGlzIG5vdCBjdXJyZW50bHkgc2Vla2VkCisgICAgICogdG8gYSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgbVNlZWtUaW1lID0gLTE7CisKKyAgICAvLyBUaGUgc3RhdGljIHNBbmltYXRpb25IYW5kbGVyIHByb2Nlc3NlcyB0aGUgaW50ZXJuYWwgdGltaW5nIGxvb3Agb24gd2hpY2ggYWxsIGFuaW1hdGlvbnMKKyAgICAvLyBhcmUgYmFzZWQKKyAgICBwcml2YXRlIHN0YXRpYyBBbmltYXRpb25IYW5kbGVyIHNBbmltYXRpb25IYW5kbGVyOworCisgICAgLy8gVGhlIHN0YXRpYyBsaXN0IG9mIGFsbCBhY3RpdmUgYW5pbWF0aW9ucworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxBbmltYXRvcj4gc0FuaW1hdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yPigpOworCisgICAgLy8gVGhlIHNldCBvZiBhbmltYXRpb25zIHRvIGJlIHN0YXJ0ZWQgb24gdGhlIG5leHQgYW5pbWF0aW9uIGZyYW1lCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEFuaW1hdG9yPiBzUGVuZGluZ0FuaW1hdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yPigpOworCisgICAgLy8gVGhlIHRpbWUgaW50ZXJwb2xhdG9yIHRvIGJlIHVzZWQgaWYgbm9uZSBpcyBzZXQgb24gdGhlIGFuaW1hdGlvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludGVycG9sYXRvciBzRGVmYXVsdEludGVycG9sYXRvciA9IG5ldyBBY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcigpOworCisgICAgLy8gdHlwZSBldmFsdWF0b3JzIGZvciB0aGUgdGhyZWUgcHJpbWl0aXZlIHR5cGVzIGhhbmRsZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVFdmFsdWF0b3Igc0ludEV2YWx1YXRvciA9IG5ldyBJbnRFdmFsdWF0b3IoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlRXZhbHVhdG9yIHNGbG9hdEV2YWx1YXRvciA9IG5ldyBGbG9hdEV2YWx1YXRvcigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVFdmFsdWF0b3Igc0RvdWJsZUV2YWx1YXRvciA9IG5ldyBEb3VibGVFdmFsdWF0b3IoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgYW5pbWF0aW9uIGlzIGN1cnJlbnRseSBwbGF5aW5nIGluIHJldmVyc2UuIFRoaXMgY2F1c2VzIHRoZQorICAgICAqIGVsYXBzZWQgZnJhY3Rpb24gdG8gYmUgaW52ZXJ0ZWQgdG8gY2FsY3VsYXRlIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1QbGF5aW5nQmFja3dhcmRzID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHZhcmlhYmxlIHRyYWNrcyB0aGUgY3VycmVudCBpdGVyYXRpb24gdGhhdCBpcyBwbGF5aW5nLiBXaGVuIG1DdXJyZW50SXRlcmF0aW9uIGV4Y2VlZHMgdGhlCisgICAgICogcmVwZWF0Q291bnQgKGlmIHJlcGVhdENvdW50IT1JTkZJTklURSksIHRoZSBhbmltYXRpb24gZW5kcworICAgICAqLworICAgIHByaXZhdGUgaW50IG1DdXJyZW50SXRlcmF0aW9uID0gMDsKKworICAgIC8qKgorICAgICAqIFRyYWNrcyB3aGV0aGVyIGEgc3RhcnREZWxheSdkIGFuaW1hdGlvbiBoYXMgYmVndW4gcGxheWluZyB0aHJvdWdoIHRoZSBzdGFydERlbGF5LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhcnRlZERlbGF5ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUcmFja3MgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIGFuaW1hdGlvbiBiZWdhbiBwbGF5aW5nIHRocm91Z2ggaXRzIHN0YXJ0RGVsYXkuIFRoaXMgaXMKKyAgICAgKiBkaWZmZXJlbnQgZnJvbSB0aGUgbVN0YXJ0VGltZSB2YXJpYWJsZSwgd2hpY2ggaXMgdXNlZCB0byB0cmFjayB3aGVuIHRoZSBhbmltYXRpb24gYmVjYW1lCisgICAgICogYWN0aXZlICh3aGljaCBpcyB3aGVuIHRoZSBzdGFydERlbGF5IGV4cGlyZWQgYW5kIHRoZSBhbmltYXRpb24gd2FzIGFkZGVkIHRvIHRoZSBhY3RpdmUKKyAgICAgKiBhbmltYXRpb25zIGxpc3QpLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBtRGVsYXlTdGFydFRpbWU7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYW5pbWF0aW9uLiBVc2VkIHRvIGZpZ3VyZSBvdXQgd2hlbiB0byBzdGFydAorICAgICAqIGFuIGFuaW1hdGlvbiAoaWYgc3RhdGUgPT0gU1RPUFBFRCkuIEFsc28gdXNlZCB0byBlbmQgYW4gYW5pbWF0aW9uIHRoYXQKKyAgICAgKiBoYXMgYmVlbiBjYW5jZWwoKSdkIG9yIGVuZCgpJ2Qgc2luY2UgdGhlIGxhc3QgYW5pbWF0aW9uIGZyYW1lLiBQb3NzaWJsZSB2YWx1ZXMgYXJlCisgICAgICogU1RPUFBFRCwgUlVOTklORywgRU5ERUQsIENBTkNFTEVELgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1QbGF5aW5nU3RhdGUgPSBTVE9QUEVEOworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgY29sbGVjdGlvbnMgdXNlZCB0byBhdm9pZCBzZXQgY29sbGlzaW9ucyBhcyBhbmltYXRpb25zIHN0YXJ0IGFuZCBlbmQgd2hpbGUgYmVpbmcKKyAgICAgKiBwcm9jZXNzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEFuaW1hdG9yPiBzRW5kaW5nQW5pbXMgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yPigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxBbmltYXRvcj4gc0RlbGF5ZWRBbmltcyA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0b3I+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEFuaW1hdG9yPiBzUmVhZHlBbmltcyA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0b3I+KCk7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRoYXQgZGVub3RlcyB3aGV0aGVyIHRoZSBhbmltYXRpb24gaXMgc2V0IHVwIGFuZCByZWFkeSB0byBnby4gVXNlZCBieSBzZWVrKCkgdG8KKyAgICAgKiBzZXQgdXAgYW5pbWF0aW9uIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgIC8vCisgICAgLy8gQmFja2luZyB2YXJpYWJsZXMKKyAgICAvLworCisgICAgLy8gSG93IGxvbmcgdGhlIGFuaW1hdGlvbiBzaG91bGQgbGFzdCBpbiBtcworICAgIHByaXZhdGUgbG9uZyBtRHVyYXRpb247CisKKyAgICAvLyBUaGUgYW1vdW50IG9mIHRpbWUgaW4gbXMgdG8gZGVsYXkgc3RhcnRpbmcgdGhlIGFuaW1hdGlvbiBhZnRlciBzdGFydCgpIGlzIGNhbGxlZAorICAgIHByaXZhdGUgbG9uZyBtU3RhcnREZWxheSA9IDA7CisKKyAgICAvLyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGFuaW1hdGlvbiBmcmFtZXMKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIHNGcmFtZURlbGF5ID0gREVGQVVMVF9GUkFNRV9ERUxBWTsKKworICAgIC8vIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFuaW1hdGlvbiB3aWxsIHJlcGVhdC4gVGhlIGRlZmF1bHQgaXMgMCwgd2hpY2ggbWVhbnMgdGhlIGFuaW1hdGlvbgorICAgIC8vIHdpbGwgcGxheSBvbmx5IG9uY2UKKyAgICBwcml2YXRlIGludCBtUmVwZWF0Q291bnQgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgcmVwZXRpdGlvbiB0aGF0IHdpbGwgb2NjdXIgd2hlbiByZXBlYXRNb2RlIGlzIG5vbnplcm8uIFJFU1RBUlQgbWVhbnMgdGhlCisgICAgICogYW5pbWF0aW9uIHdpbGwgc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIG9uIGV2ZXJ5IG5ldyBjeWNsZS4gUkVWRVJTRSBtZWFucyB0aGUgYW5pbWF0aW9uCisgICAgICogd2lsbCByZXZlcnNlIGRpcmVjdGlvbnMgb24gZWFjaCBpdGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbVJlcGVhdE1vZGUgPSBSRVNUQVJUOworCisgICAgLyoqCisgICAgICogVGhlIHRpbWUgaW50ZXJwb2xhdG9yIHRvIGJlIHVzZWQuIFRoZSBlbGFwc2VkIGZyYWN0aW9uIG9mIHRoZSBhbmltYXRpb24gd2lsbCBiZSBwYXNzZWQKKyAgICAgKiB0aHJvdWdoIHRoaXMgaW50ZXJwb2xhdG9yIHRvIGNhbGN1bGF0ZSB0aGUgaW50ZXJwb2xhdGVkIGZyYWN0aW9uLCB3aGljaCBpcyB0aGVuIHVzZWQgdG8KKyAgICAgKiBjYWxjdWxhdGUgdGhlIGFuaW1hdGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEludGVycG9sYXRvciBtSW50ZXJwb2xhdG9yID0gc0RlZmF1bHRJbnRlcnBvbGF0b3I7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIGxpc3RlbmVycyB0byBiZSBzZW50IGV2ZW50cyB0aHJvdWdoIHRoZSBsaWZlIG9mIGFuIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxBbmltYXRvclVwZGF0ZUxpc3RlbmVyPiBtVXBkYXRlTGlzdGVuZXJzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBwcm9wZXJ0eS92YWx1ZSBzZXRzIGJlaW5nIGFuaW1hdGVkLgorICAgICAqLworICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyW10gbVZhbHVlczsKKworICAgIC8qKgorICAgICAqIEEgaGFzaG1hcCBvZiB0aGUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cy4gVGhpcyBtYXAgaXMgdXNlZCB0byBsb29rdXAgYW5pbWF0ZWQgdmFsdWVzCisgICAgICogYnkgcHJvcGVydHkgbmFtZSBkdXJpbmcgY2FsbHMgdG8gZ2V0QW5pbWF0ZWRWYWx1ZShTdHJpbmcpLgorICAgICAqLworICAgIEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eVZhbHVlc0hvbGRlcj4gbVZhbHVlc01hcDsKKworICAgIC8qKgorICAgICAqIFB1YmxpYyBjb25zdGFudHMKKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIFdoZW4gdGhlIGFuaW1hdGlvbiByZWFjaGVzIHRoZSBlbmQgYW5kIDxjb2RlPnJlcGVhdENvdW50PC9jb2RlPiBpcyBJTkZJTklURQorICAgICAqIG9yIGEgcG9zaXRpdmUgdmFsdWUsIHRoZSBhbmltYXRpb24gcmVzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1RBUlQgPSAxOworICAgIC8qKgorICAgICAqIFdoZW4gdGhlIGFuaW1hdGlvbiByZWFjaGVzIHRoZSBlbmQgYW5kIDxjb2RlPnJlcGVhdENvdW50PC9jb2RlPiBpcyBJTkZJTklURQorICAgICAqIG9yIGEgcG9zaXRpdmUgdmFsdWUsIHRoZSBhbmltYXRpb24gcmV2ZXJzZXMgZGlyZWN0aW9uIG9uIGV2ZXJ5IGl0ZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVZFUlNFID0gMjsKKyAgICAvKioKKyAgICAgKiBUaGlzIHZhbHVlIHVzZWQgdXNlZCB3aXRoIHRoZSB7QGxpbmsgI3NldFJlcGVhdENvdW50KGludCl9IHByb3BlcnR5IHRvIHJlcGVhdAorICAgICAqIHRoZSBhbmltYXRpb24gaW5kZWZpbml0ZWx5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORklOSVRFID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IEFuaW1hdG9yIG9iamVjdC4gVGhpcyBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIHByaW1hcmlseSBmb3IKKyAgICAgKiB1c2UgaW50ZXJuYWxseTsgdGhlIG90aGVyIGNvbnN0cnVjdG9ycyB3aGljaCB0YWtlIHBhcmFtZXRlcnMgYXJlIG1vcmUgZ2VuZXJhbGx5CisgICAgICogdXNlZnVsLgorICAgICAqLworICAgIHB1YmxpYyBBbmltYXRvcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIEFuaW1hdG9yIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgZHVyYXRpb24gYW5kIHNldCBvZgorICAgICAqIHZhbHVlcy4gSWYgdGhlIHZhbHVlcyBhcmUgYSBzZXQgb2YgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cywgdGhlbiB0aGVzZSBvYmplY3RzCisgICAgICogZGVmaW5lIHRoZSBwb3RlbnRpYWxseSBtdWx0aXBsZSBwcm9wZXJ0aWVzIGJlaW5nIGFuaW1hdGVkIGFuZCB0aGUgdmFsdWVzIHRoZSBwcm9wZXJ0aWVzIGFyZQorICAgICAqIGFuaW1hdGVkIGJldHdlZW4uIE90aGVyd2lzZSwgdGhlIHZhbHVlcyBkZWZpbmUgYSBzaW5nbGUgc2V0IG9mIHZhbHVlcyBhbmltYXRlZCBiZXR3ZWVuLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHNldCBvZiB2YWx1ZXMgdG8gYW5pbWF0ZSBiZXR3ZWVuLiBJZiB0aGVzZSB2YWx1ZXMgYXJlIG5vdAorICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMsIHRoZW4gdGhlcmUgc2hvdWxkIGJlIG1vcmUgdGhhbiBvbmUgdmFsdWUsIHNpbmNlIHRoZSB2YWx1ZXMKKyAgICAgKiBkZXRlcm1pbmUgdGhlIGludGVydmFsIHRvIGFuaW1hdGUgYmV0d2Vlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5pbWF0b3IobG9uZyBkdXJhdGlvbiwgVC4uLnZhbHVlcykgeworICAgICAgICBtRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBzZXRWYWx1ZXModmFsdWVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlcyhQcm9wZXJ0eVZhbHVlc0hvbGRlci4uLiB2YWx1ZXMpIHsKKyAgICAgICAgaW50IG51bVZhbHVlcyA9IHZhbHVlcy5sZW5ndGg7CisgICAgICAgIG1WYWx1ZXMgPSB2YWx1ZXM7CisgICAgICAgIG1WYWx1ZXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5VmFsdWVzSG9sZGVyPihudW1WYWx1ZXMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciB2YWx1ZXNIb2xkZXIgPSAoUHJvcGVydHlWYWx1ZXNIb2xkZXIpIHZhbHVlc1tpXTsKKyAgICAgICAgICAgIG1WYWx1ZXNNYXAucHV0KHZhbHVlc0hvbGRlci5nZXRQcm9wZXJ0eU5hbWUoKSwgdmFsdWVzSG9sZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlcyB0byBhbmltYXRlIGJldHdlZW4gZm9yIHRoaXMgYW5pbWF0aW9uLiBJZiA8Y29kZT52YWx1ZXM8L2NvZGU+IGlzCisgICAgICogYSBzZXQgb2YgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cywgdGhlc2Ugb2JqZWN0cyB3aWxsIGJlY29tZSB0aGUgc2V0IG9mIHByb3BlcnRpZXMKKyAgICAgKiBhbmltYXRlZCBhbmQgdGhlIHZhbHVlcyB0aGF0IHRob3NlIHByb3BlcnRpZXMgYXJlIGFuaW1hdGVkIGJldHdlZW4uIE90aGVyd2lzZSwgdGhpcyBtZXRob2QKKyAgICAgKiB3aWxsIHNldCBvbmx5IG9uZSBzZXQgb2YgdmFsdWVzIGZvciB0aGUgQW5pbWF0b3IuIEFsc28sIGlmIHRoZSB2YWx1ZXMgYXJlIG5vdAorICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMgYW5kIGlmIHRoZXJlIGFyZSBhbHJlYWR5IG11bHRpcGxlIHNldHMgb2YKKyAgICAgKiB2YWx1ZXMgZGVmaW5lZCBmb3IgdGhpcyBBbmltYXRvciB2aWEKKyAgICAgKiBtb3JlIHRoYW4gb25lIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMsIHRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZSB2YWx1ZXMgZm9yCisgICAgICogdGhlIGZpcnN0IG9mIHRob3NlIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBzZXQgb2YgdmFsdWVzIHRvIGFuaW1hdGUgYmV0d2Vlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoVC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgaWYgKG1WYWx1ZXMgPT0gbnVsbCB8fCBtVmFsdWVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICBzZXRWYWx1ZXMobmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyW117CisgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcigiIiwgKE9iamVjdFtdKXZhbHVlcyl9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHZhbHVlc0hvbGRlciA9IG1WYWx1ZXNbMF07CisgICAgICAgICAgICB2YWx1ZXNIb2xkZXIuc2V0VmFsdWVzKHZhbHVlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgZmlyc3QgYW5pbWF0aW9uCisgICAgICogZnJhbWUgb2YgYW4gYW5pbWF0aW9uLiBJZiB0aGVyZSBpcyBhIG5vbnplcm8gPGNvZGU+c3RhcnREZWxheTwvY29kZT4sIHRoZQorICAgICAqIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGF0IGRlbGF5IGVuZHMuCisgICAgICogSXQgdGFrZXMgY2FyZSBvZiB0aGUgZmluYWwgaW5pdGlhbGl6YXRpb24gc3RlcHMgZm9yIHRoZQorICAgICAqIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqICA8cD5PdmVycmlkZXMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgdGhlIHN1cGVyY2xhc3MgbWV0aG9kIHRvIGVuc3VyZQorICAgICAqICB0aGF0IGludGVybmFsIG1lY2hhbmlzbXMgZm9yIHRoZSBhbmltYXRpb24gYXJlIHNldCB1cCBjb3JyZWN0bHkuPC9wPgorICAgICAqLworICAgIHZvaWQgaW5pdEFuaW1hdGlvbigpIHsKKyAgICAgICAgaW50IG51bVZhbHVlcyA9IG1WYWx1ZXMubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICBtVmFsdWVzW2ldLmluaXQoKTsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudEl0ZXJhdGlvbiA9IDA7CisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREdXJhdGlvbihsb25nIGR1cmF0aW9uKSB7CisgICAgICAgIG1EdXJhdGlvbiA9IGR1cmF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXREdXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1EdXJhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgYW5pbWF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgcG9pbnQgaW4gdGltZS4gVGhpcyB0aW1lIHNob3VsZAorICAgICAqIGJlIGJldHdlZW4gMCBhbmQgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24sIGluY2x1ZGluZyBhbnkgcmVwZXRpdGlvbi4gSWYKKyAgICAgKiB0aGUgYW5pbWF0aW9uIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZCwgdGhlbiBpdCB3aWxsIG5vdCBhZHZhbmNlIGZvcndhcmQgYWZ0ZXIgaXQgaXMKKyAgICAgKiBzZXQgdG8gdGhpcyB0aW1lOyBpdCB3aWxsIHNpbXBseSBzZXQgdGhlIHRpbWUgdG8gdGhpcyB2YWx1ZSBhbmQgcGVyZm9ybSBhbnkgYXBwcm9wcmlhdGUKKyAgICAgKiBhY3Rpb25zIGJhc2VkIG9uIHRoYXQgdGltZS4gSWYgdGhlIGFuaW1hdGlvbiBpcyBhbHJlYWR5IHJ1bm5pbmcsIHRoZW4gc2V0Q3VycmVudFBsYXlUaW1lKCkKKyAgICAgKiB3aWxsIHNldCB0aGUgY3VycmVudCBwbGF5aW5nIHRpbWUgdG8gdGhpcyB2YWx1ZSBhbmQgY29udGludWUgcGxheWluZyBmcm9tIHRoYXQgcG9pbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGxheVRpbWUgVGhlIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gd2hpY2ggdGhlIGFuaW1hdGlvbiBpcyBhZHZhbmNlZCBvciByZXdvdW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRQbGF5VGltZShsb25nIHBsYXlUaW1lKSB7CisgICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgICAgICBpbml0QW5pbWF0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgbG9uZyBjdXJyZW50VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7CisgICAgICAgIGlmIChtUGxheWluZ1N0YXRlICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIG1TZWVrVGltZSA9IHBsYXlUaW1lOworICAgICAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IFNFRUtFRDsKKyAgICAgICAgfQorICAgICAgICBtU3RhcnRUaW1lID0gY3VycmVudFRpbWUgLSBwbGF5VGltZTsKKyAgICAgICAgYW5pbWF0aW9uRnJhbWUoY3VycmVudFRpbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGFuaW1hdGlvbiBpbiB0aW1lLCB3aGljaCBpcyBlcXVhbCB0byB0aGUgY3VycmVudAorICAgICAqIHRpbWUgbWludXMgdGhlIHRpbWUgdGhhdCB0aGUgYW5pbWF0aW9uIHN0YXJ0ZWQuIEFuIGFuaW1hdGlvbiB0aGF0IGlzIG5vdCB5ZXQgc3RhcnRlZCB3aWxsCisgICAgICogcmV0dXJuIGEgdmFsdWUgb2YgemVyby4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGltZSBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldEN1cnJlbnRQbGF5VGltZSgpIHsKKyAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQgfHwgbVBsYXlpbmdTdGF0ZSA9PSBTVE9QUEVEKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKSAtIG1TdGFydFRpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjdXN0b20sIHN0YXRpYyBoYW5kbGVyIGhhbmRsZXMgdGhlIHRpbWluZyBwdWxzZSB0aGF0IGlzIHNoYXJlZCBieQorICAgICAqIGFsbCBhY3RpdmUgYW5pbWF0aW9ucy4gVGhpcyBhcHByb2FjaCBlbnN1cmVzIHRoYXQgdGhlIHNldHRpbmcgb2YgYW5pbWF0aW9uCisgICAgICogdmFsdWVzIHdpbGwgaGFwcGVuIG9uIHRoZSBVSSB0aHJlYWQgYW5kIHRoYXQgYWxsIGFuaW1hdGlvbnMgd2lsbCBzaGFyZQorICAgICAqIHRoZSBzYW1lIHRpbWVzIGZvciBjYWxjdWxhdGluZyB0aGVpciB2YWx1ZXMsIHdoaWNoIG1ha2VzIHN5bmNocm9uaXppbmcKKyAgICAgKiBhbmltYXRpb25zIHBvc3NpYmxlLgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQW5pbWF0aW9uSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlcmUgYXJlIG9ubHkgdHdvIG1lc3NhZ2VzIHRoYXQgd2UgY2FyZSBhYm91dDogQU5JTUFUSU9OX1NUQVJUIGFuZAorICAgICAgICAgKiBBTklNQVRJT05fRlJBTUUuIFRoZSBTVEFSVCBtZXNzYWdlIGlzIHNlbnQgd2hlbiBhbiBhbmltYXRpb24ncyBzdGFydCgpCisgICAgICAgICAqIG1ldGhvZCBpcyBjYWxsZWQuIEl0IGNhbm5vdCBzdGFydCBzeW5jaHJvbm91c2x5IHdoZW4gc3RhcnQoKSBpcyBjYWxsZWQKKyAgICAgICAgICogYmVjYXVzZSB0aGUgY2FsbCBtYXkgYmUgb24gdGhlIHdyb25nIHRocmVhZCwgYW5kIGl0IHdvdWxkIGFsc28gbm90IGJlCisgICAgICAgICAqIHN5bmNocm9uaXplZCB3aXRoIG90aGVyIGFuaW1hdGlvbnMgYmVjYXVzZSBpdCB3b3VsZCBub3Qgc3RhcnQgb24gYSBjb21tb24KKyAgICAgICAgICogdGltaW5nIHB1bHNlLiBTbyBlYWNoIGFuaW1hdGlvbiBzZW5kcyBhIFNUQVJUIG1lc3NhZ2UgdG8gdGhlIGhhbmRsZXIsIHdoaWNoCisgICAgICAgICAqIGNhdXNlcyB0aGUgaGFuZGxlciB0byBwbGFjZSB0aGUgYW5pbWF0aW9uIG9uIHRoZSBhY3RpdmUgYW5pbWF0aW9ucyBxdWV1ZSBhbmQKKyAgICAgICAgICogc3RhcnQgcHJvY2Vzc2luZyBmcmFtZXMgZm9yIHRoYXQgYW5pbWF0aW9uLgorICAgICAgICAgKiBUaGUgRlJBTUUgbWVzc2FnZSBpcyB0aGUgb25lIHRoYXQgaXMgc2VudCBvdmVyIGFuZCBvdmVyIHdoaWxlIHRoZXJlIGFyZSBhbnkKKyAgICAgICAgICogYWN0aXZlIGFuaW1hdGlvbnMgdG8gcHJvY2Vzcy4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBib29sZWFuIGNhbGxBZ2FpbiA9IHRydWU7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGF2b2lkIHNlbmRpbmcgZnJhbWUgbWVzc2FnZSB3aGVuIHN0YXJ0aW5nIGlmIHdlCisgICAgICAgICAgICAgICAgLy8gd2VyZSBhbHJlYWR5IHJ1bm5pbmc/CisgICAgICAgICAgICAgICAgY2FzZSBBTklNQVRJT05fU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChzQW5pbWF0aW9ucy5zaXplKCkgPiAwIHx8IHNEZWxheWVkQW5pbXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEFnYWluID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gcGVuZGluZ0FuaW1zIGhvbGRzIGFueSBhbmltYXRpb25zIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgdG8gYmUgc3RhcnRlZAorICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBjbGVhciBzUGVuZGluZ0FuaW1hdGlvbnMsIGJ1dCBzdGFydGluZyBhbmltYXRpb24gbWF5CisgICAgICAgICAgICAgICAgICAgIC8vIGNhdXNlIG1vcmUgdG8gYmUgYWRkZWQgdG8gdGhlIHBlbmRpbmcgbGlzdCAoZm9yIGV4YW1wbGUsIGlmIG9uZSBhbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRpbmcgdHJpZ2dlcnMgYW5vdGhlciBzdGFydGluZykuIFNvIHdlIGxvb3AgdW50aWwgc1BlbmRpbmdBbmltYXRpb25zCisgICAgICAgICAgICAgICAgICAgIC8vIGlzIGVtcHR5LgorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc1BlbmRpbmdBbmltYXRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvcj4gcGVuZGluZ0NvcHkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0PEFuaW1hdG9yPikgc1BlbmRpbmdBbmltYXRpb25zLmNsb25lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzUGVuZGluZ0FuaW1hdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IHBlbmRpbmdDb3B5LnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuaW1hdG9yIGFuaW0gPSBwZW5kaW5nQ29weS5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFuaW1hdGlvbiBoYXMgYSBzdGFydERlbGF5LCBwbGFjZSBpdCBvbiB0aGUgZGVsYXllZCBsaXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW0ubVN0YXJ0RGVsYXkgPT0gMCB8fCBhbmltLm1QbGF5aW5nU3RhdGUgPT0gRU5ERUQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0ubVBsYXlpbmdTdGF0ZSA9PSBDQU5DRUxFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltLnN0YXJ0QW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0RlbGF5ZWRBbmltcy5hZGQoYW5pbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBwcm9jZXNzIGZpcnN0IGZyYW1lIG9mIG5ldyBhbmltYXRpb25zCisgICAgICAgICAgICAgICAgY2FzZSBBTklNQVRJT05fRlJBTUU6CisgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRUaW1lIGhvbGRzIHRoZSBjb21tb24gdGltZSBmb3IgYWxsIGFuaW1hdGlvbnMgcHJvY2Vzc2VkCisgICAgICAgICAgICAgICAgICAgIC8vIGR1cmluZyB0aGlzIGZyYW1lCisgICAgICAgICAgICAgICAgICAgIGxvbmcgY3VycmVudFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0LCBwcm9jZXNzIGFuaW1hdGlvbnMgY3VycmVudGx5IHNpdHRpbmcgb24gdGhlIGRlbGF5ZWQgcXVldWUsIGFkZGluZworICAgICAgICAgICAgICAgICAgICAvLyB0aGVtIHRvIHRoZSBhY3RpdmUgYW5pbWF0aW9ucyBpZiB0aGV5IGFyZSByZWFkeQorICAgICAgICAgICAgICAgICAgICBpbnQgbnVtRGVsYXllZEFuaW1zID0gc0RlbGF5ZWRBbmltcy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRGVsYXllZEFuaW1zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFuaW1hdG9yIGFuaW0gPSBzRGVsYXllZEFuaW1zLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmltLmRlbGF5ZWRBbmltYXRpb25GcmFtZShjdXJyZW50VGltZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUmVhZHlBbmltcy5hZGQoYW5pbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IG51bVJlYWR5QW5pbXMgPSBzUmVhZHlBbmltcy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChudW1SZWFkeUFuaW1zID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZWFkeUFuaW1zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmltYXRvciBhbmltID0gc1JlYWR5QW5pbXMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0uc3RhcnRBbmltYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRGVsYXllZEFuaW1zLnJlbW92ZShhbmltKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNSZWFkeUFuaW1zLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBOb3cgcHJvY2VzcyBhbGwgYWN0aXZlIGFuaW1hdGlvbnMuIFRoZSByZXR1cm4gdmFsdWUgZnJvbSBhbmltYXRpb25GcmFtZSgpCisgICAgICAgICAgICAgICAgICAgIC8vIHRlbGxzIHRoZSBoYW5kbGVyIHdoZXRoZXIgaXQgc2hvdWxkIG5vdyBiZSBlbmRlZAorICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQW5pbXMgPSBzQW5pbWF0aW9ucy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQW5pbXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQW5pbWF0b3IgYW5pbSA9IHNBbmltYXRpb25zLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmltLmFuaW1hdGlvbkZyYW1lKGN1cnJlbnRUaW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNFbmRpbmdBbmltcy5hZGQoYW5pbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNFbmRpbmdBbmltcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNFbmRpbmdBbmltcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNFbmRpbmdBbmltcy5nZXQoaSkuZW5kQW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzRW5kaW5nQW5pbXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBzdGlsbCBhY3RpdmUgb3IgZGVsYXllZCBhbmltYXRpb25zLCBjYWxsIHRoZSBoYW5kbGVyIGFnYWluCisgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIHRoZSBmcmFtZURlbGF5CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsQWdhaW4gJiYgKCFzQW5pbWF0aW9ucy5pc0VtcHR5KCkgfHwgIXNEZWxheWVkQW5pbXMuaXNFbXB0eSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoQU5JTUFUSU9OX0ZSQU1FLCBzRnJhbWVEZWxheSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gZGVsYXkgc3RhcnRpbmcgdGhlIGFuaW1hdGlvbiBhZnRlcgorICAgICAqIHtAbGluayAjc3RhcnQoKX0gaXMgY2FsbGVkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBydW5uaW5nIHRoZSBhbmltYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTdGFydERlbGF5KCkgeworICAgICAgICByZXR1cm4gbVN0YXJ0RGVsYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIGRlbGF5IHN0YXJ0aW5nIHRoZSBhbmltYXRpb24gYWZ0ZXIKKyAgICAgKiB7QGxpbmsgI3N0YXJ0KCl9IGlzIGNhbGxlZC4KKworICAgICAqIEBwYXJhbSBzdGFydERlbGF5IFRoZSBhbW91bnQgb2YgdGhlIGRlbGF5LCBpbiBtaWxsaXNlY29uZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydERlbGF5KGxvbmcgc3RhcnREZWxheSkgeworICAgICAgICB0aGlzLm1TdGFydERlbGF5ID0gc3RhcnREZWxheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgYmV0d2VlbiBlYWNoIGZyYW1lIG9mIHRoZSBhbmltYXRpb24uIFRoaXMgaXMgYQorICAgICAqIHJlcXVlc3RlZCB0aW1lIHRoYXQgdGhlIGFuaW1hdGlvbiB3aWxsIGF0dGVtcHQgdG8gaG9ub3IsIGJ1dCB0aGUgYWN0dWFsIGRlbGF5IGJldHdlZW4KKyAgICAgKiBmcmFtZXMgbWF5IGJlIGRpZmZlcmVudCwgZGVwZW5kaW5nIG9uIHN5c3RlbSBsb2FkIGFuZCBjYXBhYmlsaXRpZXMuIFRoaXMgaXMgYSBzdGF0aWMKKyAgICAgKiBmdW5jdGlvbiBiZWNhdXNlIHRoZSBzYW1lIGRlbGF5IHdpbGwgYmUgYXBwbGllZCB0byBhbGwgYW5pbWF0aW9ucywgc2luY2UgdGhleSBhcmUgYWxsCisgICAgICogcnVuIG9mZiBvZiBhIHNpbmdsZSB0aW1pbmcgbG9vcC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCB0aW1lIGJldHdlZW4gZnJhbWVzLCBpbiBtaWxsaXNlY29uZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0RnJhbWVEZWxheSgpIHsKKyAgICAgICAgcmV0dXJuIHNGcmFtZURlbGF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCBiZXR3ZWVuIGVhY2ggZnJhbWUgb2YgdGhlIGFuaW1hdGlvbi4gVGhpcyBpcyBhCisgICAgICogcmVxdWVzdGVkIHRpbWUgdGhhdCB0aGUgYW5pbWF0aW9uIHdpbGwgYXR0ZW1wdCB0byBob25vciwgYnV0IHRoZSBhY3R1YWwgZGVsYXkgYmV0d2VlbgorICAgICAqIGZyYW1lcyBtYXkgYmUgZGlmZmVyZW50LCBkZXBlbmRpbmcgb24gc3lzdGVtIGxvYWQgYW5kIGNhcGFiaWxpdGllcy4gVGhpcyBpcyBhIHN0YXRpYworICAgICAqIGZ1bmN0aW9uIGJlY2F1c2UgdGhlIHNhbWUgZGVsYXkgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBhbmltYXRpb25zLCBzaW5jZSB0aGV5IGFyZSBhbGwKKyAgICAgKiBydW4gb2ZmIG9mIGEgc2luZ2xlIHRpbWluZyBsb29wLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYW1lRGVsYXkgdGhlIHJlcXVlc3RlZCB0aW1lIGJldHdlZW4gZnJhbWVzLCBpbiBtaWxsaXNlY29uZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RnJhbWVEZWxheShsb25nIGZyYW1lRGVsYXkpIHsKKyAgICAgICAgc0ZyYW1lRGVsYXkgPSBmcmFtZURlbGF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtb3N0IHJlY2VudCB2YWx1ZSBjYWxjdWxhdGVkIGJ5IHRoaXMgPGNvZGU+QW5pbWF0b3I8L2NvZGU+IHdoZW4gdGhlcmUgaXMganVzdCBvbmUKKyAgICAgKiBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4gVGhpcyB2YWx1ZSBpcyBvbmx5IHNlbnNpYmxlIHdoaWxlIHRoZSBhbmltYXRpb24gaXMgcnVubmluZy4gVGhlIG1haW4KKyAgICAgKiBwdXJwb3NlIGZvciB0aGlzIHJlYWQtb25seSBwcm9wZXJ0eSBpcyB0byByZXRyaWV2ZSB0aGUgdmFsdWUgZnJvbSB0aGUgPGNvZGU+QW5pbWF0b3I8L2NvZGU+CisgICAgICogZHVyaW5nIGEgY2FsbCB0byB7QGxpbmsgQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciNvbkFuaW1hdGlvblVwZGF0ZShBbmltYXRvcil9LCB3aGljaAorICAgICAqIGlzIGNhbGxlZCBkdXJpbmcgZWFjaCBhbmltYXRpb24gZnJhbWUsIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB2YWx1ZSBpcyBjYWxjdWxhdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBhbmltYXRlZFZhbHVlIFRoZSB2YWx1ZSBtb3N0IHJlY2VudGx5IGNhbGN1bGF0ZWQgYnkgdGhpcyA8Y29kZT5BbmltYXRvcjwvY29kZT4gZm9yCisgICAgICogdGhlIHNpbmdsZSBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4gSWYgdGhlcmUgYXJlIHNldmVyYWwgcHJvcGVydGllcyBiZWluZyBhbmltYXRlZAorICAgICAqIChzcGVjaWZpZWQgYnkgc2V2ZXJhbCBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzIGluIHRoZSBjb25zdHJ1Y3RvciksIHRoaXMgZnVuY3Rpb24KKyAgICAgKiByZXR1cm5zIHRoZSBhbmltYXRlZCB2YWx1ZSBmb3IgdGhlIGZpcnN0IG9mIHRob3NlIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRBbmltYXRlZFZhbHVlKCkgeworICAgICAgICBpZiAobVZhbHVlcyAhPSBudWxsICYmIG1WYWx1ZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZXNbMF0uZ2V0QW5pbWF0ZWRWYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIC8vIFNob3VsZG4ndCBnZXQgaGVyZTsgc2hvdWxkIGFsd2F5cyBoYXZlIHZhbHVlcyB1bmxlc3MgQW5pbWF0b3Igd2FzIHNldCB1cCB3cm9uZworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbW9zdCByZWNlbnQgdmFsdWUgY2FsY3VsYXRlZCBieSB0aGlzIDxjb2RlPkFuaW1hdG9yPC9jb2RlPiBmb3IgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPi4KKyAgICAgKiBUaGUgbWFpbiBwdXJwb3NlIGZvciB0aGlzIHJlYWQtb25seSBwcm9wZXJ0eSBpcyB0byByZXRyaWV2ZSB0aGUgdmFsdWUgZnJvbSB0aGUKKyAgICAgKiA8Y29kZT5BbmltYXRvcjwvY29kZT4gZHVyaW5nIGEgY2FsbCB0bworICAgICAqIHtAbGluayBBbmltYXRvclVwZGF0ZUxpc3RlbmVyI29uQW5pbWF0aW9uVXBkYXRlKEFuaW1hdG9yKX0sIHdoaWNoCisgICAgICogaXMgY2FsbGVkIGR1cmluZyBlYWNoIGFuaW1hdGlvbiBmcmFtZSwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHZhbHVlIGlzIGNhbGN1bGF0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuaW1hdGVkVmFsdWUgVGhlIHZhbHVlIG1vc3QgcmVjZW50bHkgY2FsY3VsYXRlZCBmb3IgdGhlIG5hbWVkIHByb3BlcnR5CisgICAgICogYnkgdGhpcyA8Y29kZT5BbmltYXRvcjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRBbmltYXRlZFZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIgdmFsdWVzSG9sZGVyID0gbVZhbHVlc01hcC5nZXQocHJvcGVydHlOYW1lKTsKKyAgICAgICAgaWYgKHZhbHVlc0hvbGRlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWVzSG9sZGVyLmdldEFuaW1hdGVkVmFsdWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEF0IGxlYXN0IGF2b2lkIGNyYXNoaW5nIGlmIGNhbGxlZCB3aXRoIGJvZ3VzIHByb3BlcnR5TmFtZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGhvdyBtYW55IHRpbWVzIHRoZSBhbmltYXRpb24gc2hvdWxkIGJlIHJlcGVhdGVkLiBJZiB0aGUgcmVwZWF0CisgICAgICogY291bnQgaXMgMCwgdGhlIGFuaW1hdGlvbiBpcyBuZXZlciByZXBlYXRlZC4gSWYgdGhlIHJlcGVhdCBjb3VudCBpcworICAgICAqIGdyZWF0ZXIgdGhhbiAwIG9yIHtAbGluayAjSU5GSU5JVEV9LCB0aGUgcmVwZWF0IG1vZGUgd2lsbCBiZSB0YWtlbgorICAgICAqIGludG8gYWNjb3VudC4gVGhlIHJlcGVhdCBjb3VudCBpcyAwIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYW5pbWF0aW9uIHNob3VsZCBiZSByZXBlYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdENvdW50KGludCB2YWx1ZSkgeworICAgICAgICBtUmVwZWF0Q291bnQgPSB2YWx1ZTsKKyAgICB9CisgICAgLyoqCisgICAgICogRGVmaW5lcyBob3cgbWFueSB0aW1lcyB0aGUgYW5pbWF0aW9uIHNob3VsZCByZXBlYXQuIFRoZSBkZWZhdWx0IHZhbHVlCisgICAgICogaXMgMC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYW5pbWF0aW9uIHNob3VsZCByZXBlYXQsIG9yIHtAbGluayAjSU5GSU5JVEV9CisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZXBlYXRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXBlYXRDb3VudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHdoYXQgdGhpcyBhbmltYXRpb24gc2hvdWxkIGRvIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kLiBUaGlzCisgICAgICogc2V0dGluZyBpcyBhcHBsaWVkIG9ubHkgd2hlbiB0aGUgcmVwZWF0IGNvdW50IGlzIGVpdGhlciBncmVhdGVyIHRoYW4KKyAgICAgKiAwIG9yIHtAbGluayAjSU5GSU5JVEV9LiBEZWZhdWx0cyB0byB7QGxpbmsgI1JFU1RBUlR9LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHtAbGluayAjUkVTVEFSVH0gb3Ige0BsaW5rICNSRVZFUlNFfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGUoaW50IHZhbHVlKSB7CisgICAgICAgIG1SZXBlYXRNb2RlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lcyB3aGF0IHRoaXMgYW5pbWF0aW9uIHNob3VsZCBkbyB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZWl0aGVyIG9uZSBvZiB7QGxpbmsgI1JFVkVSU0V9IG9yIHtAbGluayAjUkVTVEFSVH0KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGUoKSB7CisgICAgICAgIHJldHVybiBtUmVwZWF0TW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIHNldCBvZiBsaXN0ZW5lcnMgdGhhdCBhcmUgc2VudCB1cGRhdGUgZXZlbnRzIHRocm91Z2ggdGhlIGxpZmUgb2YKKyAgICAgKiBhbiBhbmltYXRpb24uIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbGwgbGlzdGVuZXJzIGZvciBldmVyeSBmcmFtZSBvZiB0aGUgYW5pbWF0aW9uLAorICAgICAqIGFmdGVyIHRoZSB2YWx1ZXMgZm9yIHRoZSBhbmltYXRpb24gaGF2ZSBiZWVuIGNhbGN1bGF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IHNldCBvZiBsaXN0ZW5lcnMgZm9yIHRoaXMgYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFVwZGF0ZUxpc3RlbmVyKEFuaW1hdG9yVXBkYXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1VcGRhdGVMaXN0ZW5lcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbVVwZGF0ZUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0b3JVcGRhdGVMaXN0ZW5lcj4oKTsKKyAgICAgICAgfQorICAgICAgICBtVXBkYXRlTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIHNldCBsaXN0ZW5pbmcgdG8gZnJhbWUgdXBkYXRlcyBmb3IgdGhpcyBhbmltYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgY3VycmVudCBzZXQgb2YgdXBkYXRlIGxpc3RlbmVycworICAgICAqIGZvciB0aGlzIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVVcGRhdGVMaXN0ZW5lcihBbmltYXRvclVwZGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtVXBkYXRlTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtVXBkYXRlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgIGlmIChtVXBkYXRlTGlzdGVuZXJzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBtVXBkYXRlTGlzdGVuZXJzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHRpbWUgaW50ZXJwb2xhdG9yIHVzZWQgaW4gY2FsY3VsYXRpbmcgdGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhpcyBhbmltYXRpb24uIFRoZQorICAgICAqIGludGVycG9sYXRvciBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFuaW1hdGlvbiBydW5zIHdpdGggbGluZWFyIG9yIG5vbi1saW5lYXIgbW90aW9uLAorICAgICAqIHN1Y2ggYXMgYWNjZWxlcmF0aW9uIGFuZCBkZWNlbGVyYXRpb24uIFRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3J9CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGludGVycG9sYXRvciB0byBiZSB1c2VkIGJ5IHRoaXMgYW5pbWF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJwb2xhdG9yKEludGVycG9sYXRvciB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUludGVycG9sYXRvciA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGltaW5nIGludGVycG9sYXRvciB0aGF0IHRoaXMgQW5pbWF0b3IgdXNlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHRpbWluZyBpbnRlcnBvbGF0b3IgZm9yIHRoaXMgQW5pbWF0b3IuCisgICAgICovCisgICAgcHVibGljIEludGVycG9sYXRvciBnZXRJbnRlcnBvbGF0b3IoKSB7CisgICAgICAgIHJldHVybiBtSW50ZXJwb2xhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIGV2YWx1YXRvciB0byBiZSB1c2VkIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGFuaW1hdGVkIHZhbHVlcyBvZiB0aGlzIGFuaW1hdGlvbi4KKyAgICAgKiBUaGUgc3lzdGVtIHdpbGwgYXV0b21hdGljYWxseSBhc3NpZ24gYSBmbG9hdCwgaW50LCBvciBkb3VibGUgZXZhbHVhdG9yIGJhc2VkIG9uIHRoZSB0eXBlCisgICAgICogb2YgPGNvZGU+c3RhcnRWYWx1ZTwvY29kZT4gYW5kIDxjb2RlPmVuZFZhbHVlPC9jb2RlPiBpbiB0aGUgY29uc3RydWN0b3IuIEJ1dCBpZiB0aGVzZSB2YWx1ZXMKKyAgICAgKiBhcmUgbm90IG9uZSBvZiB0aGVzZSBwcmltaXRpdmUgdHlwZXMsIG9yIGlmIGRpZmZlcmVudCBldmFsdWF0aW9uIGlzIGRlc2lyZWQgKHN1Y2ggYXMgaXMKKyAgICAgKiBuZWNlc3Nhcnkgd2l0aCBpbnQgdmFsdWVzIHRoYXQgcmVwcmVzZW50IGNvbG9ycyksIGEgY3VzdG9tIGV2YWx1YXRvciBuZWVkcyB0byBiZSBhc3NpZ25lZC4KKyAgICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBydW5uaW5nIGFuIGFuaW1hdGlvbiBvbiBjb2xvciB2YWx1ZXMsIHRoZSB7QGxpbmsgUkdCRXZhbHVhdG9yfQorICAgICAqIHNob3VsZCBiZSB1c2VkIHRvIGdldCBjb3JyZWN0IFJHQiBjb2xvciBpbnRlcnBvbGF0aW9uLgorICAgICAqCisgICAgICogPHA+SWYgdGhpcyBBbmltYXRvciBoYXMgb25seSBvbmUgc2V0IG9mIHZhbHVlcyBiZWluZyBhbmltYXRlZCBiZXR3ZWVuLCB0aGlzIGV2YWx1YXRvcgorICAgICAqIHdpbGwgYmUgdXNlZCBmb3IgdGhhdCBzZXQuIElmIHRoZXJlIGFyZSBzZXZlcmFsIHNldHMgb2YgdmFsdWVzIGJlaW5nIGFuaW1hdGVkLCB3aGljaCBpcworICAgICAqIHRoZSBjYXNlIGlmIFByb3BlcnR5VmFsdWVzSE9sZGVyIG9iamVjdHMgd2VyZSBzZXQgb24gdGhlIEFuaW1hdG9yLCB0aGVuIHRoZSBldmFsdWF0b3IKKyAgICAgKiBpcyBhc3NpZ25lZCBqdXN0IHRvIHRoZSBmaXJzdCBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3QuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBldmFsdWF0b3IgdG8gYmUgdXNlZCB0aGlzIGFuaW1hdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV2YWx1YXRvcihUeXBlRXZhbHVhdG9yIHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIG1WYWx1ZXMgIT0gbnVsbCAmJiBtVmFsdWVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIG1WYWx1ZXNbMF0uc2V0RXZhbHVhdG9yKHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSBhbmltYXRpb24gcGxheWluZy4gVGhpcyB2ZXJzaW9uIG9mIHN0YXJ0KCkgdGFrZXMgYSBib29sZWFuIGZsYWcgdGhhdCBpbmRpY2F0ZXMKKyAgICAgKiB3aGV0aGVyIHRoZSBhbmltYXRpb24gc2hvdWxkIHBsYXkgaW4gcmV2ZXJzZS4gVGhlIGZsYWcgaXMgdXN1YWxseSBmYWxzZSwgYnV0IG1heSBiZSBzZXQKKyAgICAgKiB0byB0cnVlIGlmIGNhbGxlZCBmcm9tIHRoZSByZXZlcnNlKCkgbWV0aG9kLworICAgICAqCisgICAgICogQHBhcmFtIHBsYXlCYWNrd2FyZHMgV2hldGhlciB0aGUgQW5pbWF0b3Igc2hvdWxkIHN0YXJ0IHBsYXlpbmcgaW4gcmV2ZXJzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RhcnQoYm9vbGVhbiBwbGF5QmFja3dhcmRzKSB7CisgICAgICAgIG1QbGF5aW5nQmFja3dhcmRzID0gcGxheUJhY2t3YXJkczsKKyAgICAgICAgaWYgKChtU3RhcnREZWxheSA9PSAwKSAmJiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSBMb29wZXIuZ2V0TWFpbkxvb3BlcigpLmdldFRocmVhZCgpKSkgeworICAgICAgICAgICAgLy8gVGhpcyBzZXRzIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBhbmltYXRpb24sIHByaW9yIHRvIGFjdHVhbGx5IHN0YXJ0aW5nIGl0IHJ1bm5pbmcKKyAgICAgICAgICAgIHNldEN1cnJlbnRQbGF5VGltZShnZXRDdXJyZW50UGxheVRpbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IFNUT1BQRUQ7CisgICAgICAgIG1TdGFydGVkRGVsYXkgPSBmYWxzZTsKKyAgICAgICAgc1BlbmRpbmdBbmltYXRpb25zLmFkZCh0aGlzKTsKKyAgICAgICAgaWYgKHNBbmltYXRpb25IYW5kbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHNBbmltYXRpb25IYW5kbGVyID0gbmV3IEFuaW1hdGlvbkhhbmRsZXIoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBkb2VzIHRoaXMgcHV0IHRvbyBtYW55IG1lc3NhZ2VzIG9uIHRoZSBxdWV1ZSBpZiB0aGUgaGFuZGxlcgorICAgICAgICAvLyBpcyBhbHJlYWR5IHJ1bm5pbmc/CisgICAgICAgIHNBbmltYXRpb25IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoQU5JTUFUSU9OX1NUQVJUKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgc3RhcnQoZmFsc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdGFibGVMaXN0ZW5lcj4gdG1wTGlzdGVuZXJzID0KKyAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+KSBtTGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgICAgICBmb3IgKEFuaW1hdGFibGVMaXN0ZW5lciBsaXN0ZW5lciA6IHRtcExpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uQ2FuY2VsKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEp1c3Qgc2V0IHRoZSBDQU5DRUxFRCBmbGFnIC0gdGhpcyBjYXVzZXMgdGhlIGFuaW1hdGlvbiB0byBlbmQgdGhlIG5leHQgdGltZSBhIGZyYW1lCisgICAgICAgIC8vIGlzIHByb2Nlc3NlZC4KKyAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IENBTkNFTEVEOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKKyAgICAgICAgaWYgKCFzQW5pbWF0aW9ucy5jb250YWlucyh0aGlzKSAmJiAhc1BlbmRpbmdBbmltYXRpb25zLmNvbnRhaW5zKHRoaXMpKSB7CisgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgaWYgdGhlIGFuaW1hdGlvbiBoYXMgbm90IHlldCBzdGFydGVkOyBnZXQgaXQgcmVhZHkgZm9yIGVuZGluZworICAgICAgICAgICAgbVN0YXJ0ZWREZWxheSA9IGZhbHNlOworICAgICAgICAgICAgc1BlbmRpbmdBbmltYXRpb25zLmFkZCh0aGlzKTsKKyAgICAgICAgICAgIGlmIChzQW5pbWF0aW9uSGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc0FuaW1hdGlvbkhhbmRsZXIgPSBuZXcgQW5pbWF0aW9uSGFuZGxlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc0FuaW1hdGlvbkhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShBTklNQVRJT05fU1RBUlQpOworICAgICAgICB9CisgICAgICAgIC8vIEp1c3Qgc2V0IHRoZSBFTkRFRCBmbGFnIC0gdGhpcyBjYXVzZXMgdGhlIGFuaW1hdGlvbiB0byBlbmQgdGhlIG5leHQgdGltZSBhIGZyYW1lCisgICAgICAgIC8vIGlzIHByb2Nlc3NlZC4KKyAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IEVOREVEOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKKyAgICAgICAgLy8gRU5ERUQgb3IgQ0FOQ0VMRUQgaW5kaWNhdGUgdGhhdCBpdCBoYXMgYmVlbiBlbmRlZCBvciBjYW5jZWxlZCwgYnV0IG5vdCBwcm9jZXNzZWQgeWV0CisgICAgICAgIHJldHVybiAobVBsYXlpbmdTdGF0ZSA9PSBSVU5OSU5HIHx8IG1QbGF5aW5nU3RhdGUgPT0gRU5ERUQgfHwgbVBsYXlpbmdTdGF0ZSA9PSBDQU5DRUxFRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGxheXMgdGhlIEFuaW1hdG9yIGluIHJldmVyc2UuIElmIHRoZSBhbmltYXRpb24gaXMgYWxyZWFkeSBydW5uaW5nLAorICAgICAqIGl0IHdpbGwgc3RvcCBpdHNlbGYgYW5kIHBsYXkgYmFja3dhcmRzIGZyb20gdGhlIHBvaW50IHJlYWNoZWQgd2hlbiByZXZlcnNlIHdhcyBjYWxsZWQuCisgICAgICogSWYgdGhlIGFuaW1hdGlvbiBpcyBub3QgY3VycmVudGx5IHJ1bm5pbmcsIHRoZW4gaXQgd2lsbCBzdGFydCBmcm9tIHRoZSBlbmQgYW5kCisgICAgICogcGxheSBiYWNrd2FyZHMuIFRoaXMgYmVoYXZpb3IgaXMgb25seSBzZXQgZm9yIHRoZSBjdXJyZW50IGFuaW1hdGlvbjsgZnV0dXJlIHBsYXlpbmcKKyAgICAgKiBvZiB0aGUgYW5pbWF0aW9uIHdpbGwgdXNlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHBsYXlpbmcgZm9yd2FyZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXZlcnNlKCkgeworICAgICAgICBtUGxheWluZ0JhY2t3YXJkcyA9ICFtUGxheWluZ0JhY2t3YXJkczsKKyAgICAgICAgaWYgKG1QbGF5aW5nU3RhdGUgPT0gUlVOTklORykgeworICAgICAgICAgICAgbG9uZyBjdXJyZW50VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBsb25nIGN1cnJlbnRQbGF5VGltZSA9IGN1cnJlbnRUaW1lIC0gbVN0YXJ0VGltZTsKKyAgICAgICAgICAgIGxvbmcgdGltZUxlZnQgPSBtRHVyYXRpb24gLSBjdXJyZW50UGxheVRpbWU7CisgICAgICAgICAgICBtU3RhcnRUaW1lID0gY3VycmVudFRpbWUgLSB0aW1lTGVmdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0KHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGludGVybmFsbHkgdG8gZW5kIGFuIGFuaW1hdGlvbiBieSByZW1vdmluZyBpdCBmcm9tIHRoZSBhbmltYXRpb25zIGxpc3QuIE11c3QgYmUKKyAgICAgKiBjYWxsZWQgb24gdGhlIFVJIHRocmVhZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5kQW5pbWF0aW9uKCkgeworICAgICAgICBzQW5pbWF0aW9ucy5yZW1vdmUodGhpcyk7CisgICAgICAgIG1QbGF5aW5nU3RhdGUgPSBTVE9QUEVEOworICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0YWJsZUxpc3RlbmVyPiB0bXBMaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0PEFuaW1hdGFibGVMaXN0ZW5lcj4pIG1MaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgICAgIGZvciAoQW5pbWF0YWJsZUxpc3RlbmVyIGxpc3RlbmVyIDogdG1wTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIub25BbmltYXRpb25FbmQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgaW50ZXJuYWxseSB0byBzdGFydCBhbiBhbmltYXRpb24gYnkgYWRkaW5nIGl0IHRvIHRoZSBhY3RpdmUgYW5pbWF0aW9ucyBsaXN0LiBNdXN0IGJlCisgICAgICogY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0QW5pbWF0aW9uKCkgeworICAgICAgICBpbml0QW5pbWF0aW9uKCk7CisgICAgICAgIHNBbmltYXRpb25zLmFkZCh0aGlzKTsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdGFibGVMaXN0ZW5lcj4gdG1wTGlzdGVuZXJzID0KKyAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+KSBtTGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgICAgICBmb3IgKEFuaW1hdGFibGVMaXN0ZW5lciBsaXN0ZW5lciA6IHRtcExpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uU3RhcnQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiBjYWxsZWQgdG8gcHJvY2VzcyBhbiBhbmltYXRpb24gZnJhbWUgb24gYW4gYW5pbWF0aW9uIHRoYXQgaXMgY3VycmVudGx5CisgICAgICogc2xlZXBpbmcgdGhyb3VnaCBpdHMgPGNvZGU+c3RhcnREZWxheTwvY29kZT4gcGhhc2UuIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgaXQKKyAgICAgKiBzaG91bGQgYmUgd29rZW4gdXAgYW5kIHB1dCBvbiB0aGUgYWN0aXZlIGFuaW1hdGlvbnMgcXVldWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3VycmVudFRpbWUgVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHRpbWUsIHVzZWQgdG8gY2FsY3VsYXRlIHdoZXRoZXIgdGhlIGFuaW1hdGlvbgorICAgICAqIGhhcyBleGNlZWRlZCBpdHMgPGNvZGU+c3RhcnREZWxheTwvY29kZT4gYW5kIHNob3VsZCBiZSBzdGFydGVkLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgYW5pbWF0aW9uJ3MgPGNvZGU+c3RhcnREZWxheTwvY29kZT4gaGFzIGJlZW4gZXhjZWVkZWQgYW5kIHRoZSBhbmltYXRpb24KKyAgICAgKiBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHNldCBvZiBhY3RpdmUgYW5pbWF0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGVsYXllZEFuaW1hdGlvbkZyYW1lKGxvbmcgY3VycmVudFRpbWUpIHsKKyAgICAgICAgaWYgKCFtU3RhcnRlZERlbGF5KSB7CisgICAgICAgICAgICBtU3RhcnRlZERlbGF5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1EZWxheVN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9uZyBkZWx0YVRpbWUgPSBjdXJyZW50VGltZSAtIG1EZWxheVN0YXJ0VGltZTsKKyAgICAgICAgICAgIGlmIChkZWx0YVRpbWUgPiBtU3RhcnREZWxheSkgeworICAgICAgICAgICAgICAgIC8vIHN0YXJ0RGVsYXkgZW5kZWQgLSBzdGFydCB0aGUgYW5pbSBhbmQgcmVjb3JkIHRoZQorICAgICAgICAgICAgICAgIC8vIG1TdGFydFRpbWUgYXBwcm9wcmlhdGVseQorICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgPSBjdXJyZW50VGltZSAtIChkZWx0YVRpbWUgLSBtU3RhcnREZWxheSk7CisgICAgICAgICAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IFJVTk5JTkc7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaW50ZXJuYWwgZnVuY3Rpb24gcHJvY2Vzc2VzIGEgc2luZ2xlIGFuaW1hdGlvbiBmcmFtZSBmb3IgYSBnaXZlbiBhbmltYXRpb24uIFRoZQorICAgICAqIGN1cnJlbnRUaW1lIHBhcmFtZXRlciBpcyB0aGUgdGltaW5nIHB1bHNlIHNlbnQgYnkgdGhlIGhhbmRsZXIsIHVzZWQgdG8gY2FsY3VsYXRlIHRoZQorICAgICAqIGVsYXBzZWQgZHVyYXRpb24sIGFuZCB0aGVyZWZvcmUKKyAgICAgKiB0aGUgZWxhcHNlZCBmcmFjdGlvbiwgb2YgdGhlIGFuaW1hdGlvbi4gVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYW5pbWF0aW9uCisgICAgICogc2hvdWxkIGJlIGVuZGVkICh3aGljaCBoYXBwZW5zIHdoZW4gdGhlIGVsYXBzZWQgdGltZSBvZiB0aGUgYW5pbWF0aW9uIGV4Y2VlZHMgdGhlCisgICAgICogYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGluY2x1ZGluZyB0aGUgcmVwZWF0Q291bnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnJlbnRUaW1lIFRoZSBjdXJyZW50IHRpbWUsIGFzIHRyYWNrZWQgYnkgdGhlIHN0YXRpYyB0aW1pbmcgaGFuZGxlcgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGluY2x1ZGluZyBhbnkgcmVwZXRpdGlvbnMgZHVlIHRvCisgICAgICogPGNvZGU+cmVwZWF0Q291bnQ8L2NvZGU+IGhhcyBiZWVuIGV4Y2VlZGVkIGFuZCB0aGUgYW5pbWF0aW9uIHNob3VsZCBiZSBlbmRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gYW5pbWF0aW9uRnJhbWUobG9uZyBjdXJyZW50VGltZSkgeworICAgICAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKKworICAgICAgICBpZiAobVBsYXlpbmdTdGF0ZSA9PSBTVE9QUEVEKSB7CisgICAgICAgICAgICBtUGxheWluZ1N0YXRlID0gUlVOTklORzsKKyAgICAgICAgICAgIGlmIChtU2Vla1RpbWUgPCAwKSB7CisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lID0gY3VycmVudFRpbWUgLSBtU2Vla1RpbWU7CisgICAgICAgICAgICAgICAgLy8gTm93IHRoYXQgd2UncmUgcGxheWluZywgcmVzZXQgdGhlIHNlZWsgdGltZQorICAgICAgICAgICAgICAgIG1TZWVrVGltZSA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN3aXRjaCAobVBsYXlpbmdTdGF0ZSkgeworICAgICAgICBjYXNlIFJVTk5JTkc6CisgICAgICAgIGNhc2UgU0VFS0VEOgorICAgICAgICAgICAgZmxvYXQgZnJhY3Rpb24gPSAoZmxvYXQpKGN1cnJlbnRUaW1lIC0gbVN0YXJ0VGltZSkgLyBtRHVyYXRpb247CisgICAgICAgICAgICBpZiAoZnJhY3Rpb24gPj0gMWYpIHsKKyAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRJdGVyYXRpb24gPCBtUmVwZWF0Q291bnQgfHwgbVJlcGVhdENvdW50ID09IElORklOSVRFKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRpbWUgdG8gcmVwZWF0CisgICAgICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQW5pbWF0YWJsZUxpc3RlbmVyIGxpc3RlbmVyIDogbUxpc3RlbmVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uUmVwZWF0KHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrbUN1cnJlbnRJdGVyYXRpb247CisgICAgICAgICAgICAgICAgICAgIGlmIChtUmVwZWF0TW9kZSA9PSBSRVZFUlNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWluZ0JhY2t3YXJkcyA9IG1QbGF5aW5nQmFja3dhcmRzID8gZmFsc2UgOiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGRvZXNuJ3QgYWNjb3VudCBmb3IgZnJhY3Rpb24gZ29pbmcgV2F5eXl5eSBvdmVyIDEsIGxpa2UgMisKKyAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSBmcmFjdGlvbiAtIDFmOworICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lICs9IG1EdXJhdGlvbjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSBNYXRoLm1pbihmcmFjdGlvbiwgMS4wZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1QbGF5aW5nQmFja3dhcmRzKSB7CisgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSAxZiAtIGZyYWN0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYW5pbWF0ZVZhbHVlKGZyYWN0aW9uKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVOREVEOgorICAgICAgICAgICAgLy8gVGhlIGZpbmFsIHZhbHVlIHNldCBvbiB0aGUgdGFyZ2V0IHZhcmllcywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGFuaW1hdGlvbgorICAgICAgICAgICAgLy8gd2FzIHN1cHBvc2VkIHRvIHJlcGVhdCBhbiBvZGQgbnVtYmVyIG9mIHRpbWVzCisgICAgICAgICAgICBpZiAobVJlcGVhdENvdW50ID4gMCAmJiAobVJlcGVhdENvdW50ICYgMHgwMSkgPT0gMSkgeworICAgICAgICAgICAgICAgIGFuaW1hdGVWYWx1ZSgwZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFuaW1hdGVWYWx1ZSgxZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gc2V0IGRvbmUgZmxhZworICAgICAgICBjYXNlIENBTkNFTEVEOgorICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICBtUGxheWluZ1N0YXRlID0gU1RPUFBFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRvbmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbiBkdXJpbmcgZXZlcnkKKyAgICAgKiBhbmltYXRpb24gZnJhbWUuIFRoaXMgZnVuY3Rpb24gdHVybnMgdGhlIGVsYXBzZWQgZnJhY3Rpb24gaW50byBhbiBpbnRlcnBvbGF0ZWQgZnJhY3Rpb24KKyAgICAgKiBhbmQgdGhlbiBpbnRvIGFuIGFuaW1hdGVkIHZhbHVlIChmcm9tIHRoZSBldmFsdWF0b3IuIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgbW9zdGx5IGR1cmluZworICAgICAqIGFuaW1hdGlvbiB1cGRhdGVzLCBidXQgaXQgaXMgYWxzbyBjYWxsZWQgd2hlbiB0aGUgPGNvZGU+ZW5kKCk8L2NvZGU+CisgICAgICogZnVuY3Rpb24gaXMgY2FsbGVkLCB0byBzZXQgdGhlIGZpbmFsIHZhbHVlIG9uIHRoZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPk92ZXJyaWRlcyBvZiB0aGlzIG1ldGhvZCBtdXN0IGNhbGwgdGhlIHN1cGVyY2xhc3MgdG8gcGVyZm9ybSB0aGUgY2FsY3VsYXRpb24KKyAgICAgKiBvZiB0aGUgYW5pbWF0ZWQgdmFsdWUuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSBlbGFwc2VkIGZyYWN0aW9uIG9mIHRoZSBhbmltYXRpb24uCisgICAgICovCisgICAgdm9pZCBhbmltYXRlVmFsdWUoZmxvYXQgZnJhY3Rpb24pIHsKKyAgICAgICAgZnJhY3Rpb24gPSBtSW50ZXJwb2xhdG9yLmdldEludGVycG9sYXRpb24oZnJhY3Rpb24pOworICAgICAgICBpbnQgbnVtVmFsdWVzID0gbVZhbHVlcy5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyArK2kpIHsKKyAgICAgICAgICAgIG1WYWx1ZXNbaV0uY2FsY3VsYXRlVmFsdWUoZnJhY3Rpb24pOworICAgICAgICB9CisgICAgICAgIGlmIChtVXBkYXRlTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBudW1MaXN0ZW5lcnMgPSBtVXBkYXRlTGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTGlzdGVuZXJzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBtVXBkYXRlTGlzdGVuZXJzLmdldChpKS5vbkFuaW1hdGlvblVwZGF0ZSh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbmltYXRvciBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFuaW1hdG9yIGFuaW0gPSAoQW5pbWF0b3IpIHN1cGVyLmNsb25lKCk7CisgICAgICAgIGlmIChtVXBkYXRlTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvclVwZGF0ZUxpc3RlbmVyPiBvbGRMaXN0ZW5lcnMgPSBtVXBkYXRlTGlzdGVuZXJzOworICAgICAgICAgICAgYW5pbS5tVXBkYXRlTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxBbmltYXRvclVwZGF0ZUxpc3RlbmVyPigpOworICAgICAgICAgICAgaW50IG51bUxpc3RlbmVycyA9IG9sZExpc3RlbmVycy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxpc3RlbmVyczsgKytpKSB7CisgICAgICAgICAgICAgICAgYW5pbS5tVXBkYXRlTGlzdGVuZXJzLmFkZChvbGRMaXN0ZW5lcnMuZ2V0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhbmltLm1TZWVrVGltZSA9IC0xOworICAgICAgICBhbmltLm1QbGF5aW5nQmFja3dhcmRzID0gZmFsc2U7CisgICAgICAgIGFuaW0ubUN1cnJlbnRJdGVyYXRpb24gPSAwOworICAgICAgICBhbmltLm1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICBhbmltLm1QbGF5aW5nU3RhdGUgPSBTVE9QUEVEOworICAgICAgICBhbmltLm1TdGFydGVkRGVsYXkgPSBmYWxzZTsKKyAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXJbXSBvbGRWYWx1ZXMgPSBtVmFsdWVzOworICAgICAgICBpZiAob2xkVmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBudW1WYWx1ZXMgPSBvbGRWYWx1ZXMubGVuZ3RoOworICAgICAgICAgICAgYW5pbS5tVmFsdWVzID0gbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyW251bVZhbHVlc107CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICAgICAgYW5pbS5tVmFsdWVzW2ldID0gb2xkVmFsdWVzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYW5pbS5tVmFsdWVzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eVZhbHVlc0hvbGRlcj4obnVtVmFsdWVzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciB2YWx1ZXNIb2xkZXIgPSBtVmFsdWVzW2ldOworICAgICAgICAgICAgICAgIGFuaW0ubVZhbHVlc01hcC5wdXQodmFsdWVzSG9sZGVyLmdldFByb3BlcnR5TmFtZSgpLCB2YWx1ZXNIb2xkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmltOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudG9ycyBvZiB0aGlzIGludGVyZmFjZSBjYW4gYWRkIHRoZW1zZWx2ZXMgYXMgdXBkYXRlIGxpc3RlbmVycworICAgICAqIHRvIGFuIDxjb2RlPkFuaW1hdG9yPC9jb2RlPiBpbnN0YW5jZSB0byByZWNlaXZlIGNhbGxiYWNrcyBvbiBldmVyeSBhbmltYXRpb24KKyAgICAgKiBmcmFtZSwgYWZ0ZXIgdGhlIGN1cnJlbnQgZnJhbWUncyB2YWx1ZXMgaGF2ZSBiZWVuIGNhbGN1bGF0ZWQgZm9yIHRoYXQKKyAgICAgKiA8Y29kZT5BbmltYXRvcjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Ob3RpZmllcyB0aGUgb2NjdXJyZW5jZSBvZiBhbm90aGVyIGZyYW1lIG9mIHRoZSBhbmltYXRpb24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYW5pbWF0aW9uIFRoZSBhbmltYXRpb24gd2hpY2ggd2FzIHJlcGVhdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvbkFuaW1hdGlvblVwZGF0ZShBbmltYXRvciBhbmltYXRpb24pOworCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Eb3VibGVFdmFsdWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Eb3VibGVFdmFsdWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDZlYjM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0RvdWJsZUV2YWx1YXRvci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCisvKioKKyAqIFRoaXMgZXZhbHVhdG9yIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gdHlwZSBpbnRlcnBvbGF0aW9uIGJldHdlZW4gPGNvZGU+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+aW50PC9jb2RlPiBvciA8Y29kZT5JbnRlZ2VyPC9jb2RlPgorICAgICAqIEByZXR1cm4gQSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgZ2l2ZW4gdGhlCisgICAgICogICAgICAgICA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCBzdGFydFZhbHVlLCBPYmplY3QgZW5kVmFsdWUpIHsKKyAgICAgICAgaW50IHN0YXJ0SW50ID0gKChOdW1iZXIpIHN0YXJ0VmFsdWUpLmludFZhbHVlKCk7CisgICAgICAgIHJldHVybiAoaW50KSAoc3RhcnRJbnQgKyBmcmFjdGlvbiAqICgoKE51bWJlcikgZW5kVmFsdWUpLmludFZhbHVlKCkgLSBzdGFydEludCkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vS2V5ZnJhbWUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9LZXlmcmFtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyODAwYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vS2V5ZnJhbWUuamF2YQpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGhvbGRzIGEgdGltZS92YWx1ZSBwYWlyIGZvciBhbiBhbmltYXRpb24uIFRoZSBLZXlmcmFtZSBjbGFzcyBpcyB1c2VkCisgKiBieSB7QGxpbmsgQW5pbWF0b3J9IHRvIGRlZmluZSB0aGUgdmFsdWVzIHRoYXQgdGhlIGFuaW1hdGlvbiB0YXJnZXQgd2lsbCBoYXZlIG92ZXIgdGhlIGNvdXJzZQorICogb2YgdGhlIGFuaW1hdGlvbi4gQXMgdGhlIHRpbWUgcHJvY2VlZHMgZnJvbSBvbmUga2V5ZnJhbWUgdG8gdGhlIG90aGVyLCB0aGUgdmFsdWUgb2YgdGhlCisgKiB0YXJnZXQgb2JqZWN0IHdpbGwgYW5pbWF0ZSBiZXR3ZWVuIHRoZSB2YWx1ZSBhdCB0aGUgcHJldmlvdXMga2V5ZnJhbWUgYW5kIHRoZSB2YWx1ZSBhdCB0aGUKKyAqIG5leHQga2V5ZnJhbWUuIEVhY2gga2V5ZnJhbWUgYWxzbyBob2xkcyBhbiBvcHRpb24ge0BsaW5rIGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yfQorICogb2JqZWN0LCB3aGljaCBkZWZpbmVzIHRoZSB0aW1lIGludGVycG9sYXRpb24gb3ZlciB0aGUgaW50ZXJ2YWx1ZSBwcmVjZWRpbmcgdGhlIGtleWZyYW1lLgorICovCitwdWJsaWMgY2xhc3MgS2V5ZnJhbWUgeworICAgIC8qKgorICAgICAqIFRoZSB0aW1lIGF0IHdoaWNoIG1WYWx1ZSB3aWxsIGhvbGQgdHJ1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1GcmFjdGlvbjsKKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgYW5pbWF0aW9uIGF0IHRoZSB0aW1lIG1GcmFjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBtVmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgaW4gdGhpcyBLZXlmcmFtZS4gVGhpcyB0eXBlIGlzIGRldGVybWluZWQgYXQgY29uc3RydWN0aW9uIHRpbWUsCisgICAgICogYmFzZWQgb24gdGhlIHR5cGUgb2YgdGhlIDxjb2RlPnZhbHVlPC9jb2RlPiBvYmplY3QgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHByaXZhdGUgQ2xhc3MgbVZhbHVlVHlwZTsKKworICAgIC8qKgorICAgICAqIFRoZSBvcHRpb25hbCB0aW1lIGludGVycG9sYXRvciBmb3IgdGhlIGludGVydmFsIHByZWNlZGluZyB0aGlzIGtleWZyYW1lLiBBIG51bGwgaW50ZXJwb2xhdG9yCisgICAgICogKHRoZSBkZWZhdWx0KSByZXN1bHRzIGluIGxpbmVhciBpbnRlcnBvbGF0aW9uIG92ZXIgdGhlIGludGVydmFsLgorICAgICAqLworICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1JbnRlcnBvbGF0b3IgPSBudWxsOworCisgICAgLyoqCisgICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciwgY2FsbGVkIGZyb20gdGhlIHB1YmxpYyBjb25zdHJ1Y3RvcnMgd2l0aCB0aGUgYWRkaXRpb25hbAorICAgICAqIDxjb2RlPnZhbHVlVHlwZTwvY29kZT4gcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSB0aW1lLCBleHByZXNzZWQgYXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHJlcHJlc2VudGluZyB0aGUgZnJhY3Rpb24KKyAgICAgKiBvZiB0aW1lIGVsYXBzZWQgb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uIGR1cmF0aW9uLgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgb2JqZWN0IHdpbGwgYW5pbWF0ZSB0byBhcyB0aGUgYW5pbWF0aW9uIHRpbWUgYXBwcm9hY2hlcworICAgICAqIHRoZSB0aW1lIGluIHRoaXMga2V5ZnJhbWUsIGFuZCB0aGUgdGhlIHZhbHVlIGFuaW1hdGVkIGZyb20gYXMgdGhlIHRpbWUgcGFzc2VzIHRoZSB0aW1lIGluCisgICAgICogdGhpcyBrZXlmcmFtZS4KKyAgICAgKiBAcGFyYW0gdmFsdWVUeXBlIFRoZSB0eXBlIG9mIHRoZSA8Y29kZT52YWx1ZTwvY29kZT4gb2JqZWN0LiBUaGlzIGlzIHVzZWQgYnkgdGhlCisgICAgICoge0BsaW5rICNnZXRWYWx1ZSgpfSBmdW5jdGlvbm0sIHdoaWNoIGlzIHF1ZXJpZWQgYnkge0BsaW5rIEFuaW1hdG9yfSB0byBkZXRlcm1pbmUKKyAgICAgKiB0aGUgdHlwZSBvZiB7QGxpbmsgVHlwZUV2YWx1YXRvcn0gdG8gdXNlIHRvIGludGVycG9sYXRlIGJldHdlZW4gdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgS2V5ZnJhbWUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCB2YWx1ZSwgQ2xhc3MgdmFsdWVUeXBlKSB7CisgICAgICAgIG1GcmFjdGlvbiA9IGZyYWN0aW9uOworICAgICAgICBtVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgbVZhbHVlVHlwZSA9IHZhbHVlVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgS2V5ZnJhbWUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHRpbWUgYW5kIHZhbHVlLiBUaGUgdGltZSBkZWZpbmVzIHRoZQorICAgICAqIHRpbWUsIGFzIGEgcHJvcG9ydGlvbiBvZiBhbiBvdmVyYWxsIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBhdCB3aGljaCB0aGUgdmFsdWUgd2lsbCBob2xkIHRydWUKKyAgICAgKiBmb3IgdGhlIGFuaW1hdGlvbi4gVGhlIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uIGJldHdlZW4ga2V5ZnJhbWVzIHdpbGwgYmUgY2FsY3VsYXRlZCBhcworICAgICAqIGFuIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgdmFsdWVzIGF0IHRob3NlIGtleWZyYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgdGltZSwgZXhwcmVzc2VkIGFzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCByZXByZXNlbnRpbmcgdGhlIGZyYWN0aW9uCisgICAgICogb2YgdGltZSBlbGFwc2VkIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIG9iamVjdCB3aWxsIGFuaW1hdGUgdG8gYXMgdGhlIGFuaW1hdGlvbiB0aW1lIGFwcHJvYWNoZXMKKyAgICAgKiB0aGUgdGltZSBpbiB0aGlzIGtleWZyYW1lLCBhbmQgdGhlIHRoZSB2YWx1ZSBhbmltYXRlZCBmcm9tIGFzIHRoZSB0aW1lIHBhc3NlcyB0aGUgdGltZSBpbgorICAgICAqIHRoaXMga2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIEtleWZyYW1lKGZsb2F0IGZyYWN0aW9uLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhmcmFjdGlvbiwgdmFsdWUsIE9iamVjdC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEtleWZyYW1lIG9iamVjdCB3aXRoIHRoZSBnaXZlbiB0aW1lIGFuZCBpbnRlZ2VyIHZhbHVlLiBUaGUgdGltZSBkZWZpbmVzIHRoZQorICAgICAqIHRpbWUsIGFzIGEgcHJvcG9ydGlvbiBvZiBhbiBvdmVyYWxsIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBhdCB3aGljaCB0aGUgdmFsdWUgd2lsbCBob2xkIHRydWUKKyAgICAgKiBmb3IgdGhlIGFuaW1hdGlvbi4gVGhlIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uIGJldHdlZW4ga2V5ZnJhbWVzIHdpbGwgYmUgY2FsY3VsYXRlZCBhcworICAgICAqIGFuIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgdmFsdWVzIGF0IHRob3NlIGtleWZyYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgdGltZSwgZXhwcmVzc2VkIGFzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCByZXByZXNlbnRpbmcgdGhlIGZyYWN0aW9uCisgICAgICogb2YgdGltZSBlbGFwc2VkIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIG9iamVjdCB3aWxsIGFuaW1hdGUgdG8gYXMgdGhlIGFuaW1hdGlvbiB0aW1lIGFwcHJvYWNoZXMKKyAgICAgKiB0aGUgdGltZSBpbiB0aGlzIGtleWZyYW1lLCBhbmQgdGhlIHRoZSB2YWx1ZSBhbmltYXRlZCBmcm9tIGFzIHRoZSB0aW1lIHBhc3NlcyB0aGUgdGltZSBpbgorICAgICAqIHRoaXMga2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIEtleWZyYW1lKGZsb2F0IGZyYWN0aW9uLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhmcmFjdGlvbiwgdmFsdWUsIGludC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEtleWZyYW1lIG9iamVjdCB3aXRoIHRoZSBnaXZlbiB0aW1lIGFuZCBmbG9hdCB2YWx1ZS4gVGhlIHRpbWUgZGVmaW5lcyB0aGUKKyAgICAgKiB0aW1lLCBhcyBhIHByb3BvcnRpb24gb2YgYW4gb3ZlcmFsbCBhbmltYXRpb24ncyBkdXJhdGlvbiwgYXQgd2hpY2ggdGhlIHZhbHVlIHdpbGwgaG9sZCB0cnVlCisgICAgICogZm9yIHRoZSBhbmltYXRpb24uIFRoZSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiBiZXR3ZWVuIGtleWZyYW1lcyB3aWxsIGJlIGNhbGN1bGF0ZWQgYXMKKyAgICAgKiBhbiBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHZhbHVlcyBhdCB0aG9zZSBrZXlmcmFtZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIHRpbWUsIGV4cHJlc3NlZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgcmVwcmVzZW50aW5nIHRoZSBmcmFjdGlvbgorICAgICAqIG9mIHRpbWUgZWxhcHNlZCBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBvYmplY3Qgd2lsbCBhbmltYXRlIHRvIGFzIHRoZSBhbmltYXRpb24gdGltZSBhcHByb2FjaGVzCisgICAgICogdGhlIHRpbWUgaW4gdGhpcyBrZXlmcmFtZSwgYW5kIHRoZSB0aGUgdmFsdWUgYW5pbWF0ZWQgZnJvbSBhcyB0aGUgdGltZSBwYXNzZXMgdGhlIHRpbWUgaW4KKyAgICAgKiB0aGlzIGtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBLZXlmcmFtZShmbG9hdCBmcmFjdGlvbiwgZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhmcmFjdGlvbiwgdmFsdWUsIGZsb2F0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgS2V5ZnJhbWUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHRpbWUgYW5kIGRvdWJsZSB2YWx1ZS4gVGhlIHRpbWUgZGVmaW5lcyB0aGUKKyAgICAgKiB0aW1lLCBhcyBhIHByb3BvcnRpb24gb2YgYW4gb3ZlcmFsbCBhbmltYXRpb24ncyBkdXJhdGlvbiwgYXQgd2hpY2ggdGhlIHZhbHVlIHdpbGwgaG9sZCB0cnVlCisgICAgICogZm9yIHRoZSBhbmltYXRpb24uIFRoZSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiBiZXR3ZWVuIGtleWZyYW1lcyB3aWxsIGJlIGNhbGN1bGF0ZWQgYXMKKyAgICAgKiBhbiBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHZhbHVlcyBhdCB0aG9zZSBrZXlmcmFtZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIHRpbWUsIGV4cHJlc3NlZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgcmVwcmVzZW50aW5nIHRoZSBmcmFjdGlvbgorICAgICAqIG9mIHRpbWUgZWxhcHNlZCBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBvYmplY3Qgd2lsbCBhbmltYXRlIHRvIGFzIHRoZSBhbmltYXRpb24gdGltZSBhcHByb2FjaGVzCisgICAgICogdGhlIHRpbWUgaW4gdGhpcyBrZXlmcmFtZSwgYW5kIHRoZSB0aGUgdmFsdWUgYW5pbWF0ZWQgZnJvbSBhcyB0aGUgdGltZSBwYXNzZXMgdGhlIHRpbWUgaW4KKyAgICAgKiB0aGlzIGtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBLZXlmcmFtZShmbG9hdCBmcmFjdGlvbiwgZG91YmxlIHZhbHVlKSB7CisgICAgICAgIHRoaXMoZnJhY3Rpb24sIHZhbHVlLCBkb3VibGUuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIGZvciB0aGlzIEtleWZyYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdmFsdWUgZm9yIHRoaXMgS2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhpcyBLZXlmcmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSBmb3IgdGhpcyBLZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgbVZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdGltZSBmb3IgdGhpcyBrZXlmcmFtZSwgYXMgYSBmcmFjdGlvbiBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGtleWZyYW1lLCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbgorICAgICAqIGR1cmF0aW9uLiBUaGlzIHNob3VsZCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0RnJhY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBtRnJhY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGltZSBmb3IgdGhpcyBrZXlmcmFtZSwgYXMgYSBmcmFjdGlvbiBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gdGltZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXlmcmFtZSwgYXMgYSBmcmFjdGlvbiBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24KKyAgICAgKiBkdXJhdGlvbi4gVGhpcyBzaG91bGQgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RnJhY3Rpb24oZmxvYXQgZnJhY3Rpb24pIHsKKyAgICAgICAgbUZyYWN0aW9uID0gZnJhY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgb3B0aW9uYWwgaW50ZXJwb2xhdG9yIGZvciB0aGlzIEtleWZyYW1lLiBBIHZhbHVlIG9mIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRlcworICAgICAqIHRoYXQgdGhlcmUgaXMgbm8gaW50ZXJwb2xhdGlvbiwgd2hpY2ggaXMgdGhlIHNhbWUgYXMgbGluZWFyIGludGVycG9sYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBvcHRpb25hbCBpbnRlcnBvbGF0b3IgZm9yIHRoaXMgS2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIEludGVycG9sYXRvciBnZXRJbnRlcnBvbGF0b3IoKSB7CisgICAgICAgIHJldHVybiBtSW50ZXJwb2xhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG9wdGlvbmFsIGludGVycG9sYXRvciBmb3IgdGhpcyBLZXlmcmFtZS4gQSB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0ZXMKKyAgICAgKiB0aGF0IHRoZXJlIGlzIG5vIGludGVycG9sYXRpb24sIHdoaWNoIGlzIHRoZSBzYW1lIGFzIGxpbmVhciBpbnRlcnBvbGF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgb3B0aW9uYWwgaW50ZXJwb2xhdG9yIGZvciB0aGlzIEtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEludGVycG9sYXRvcihJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yKSB7CisgICAgICAgIG1JbnRlcnBvbGF0b3IgPSBpbnRlcnBvbGF0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdHlwZSBvZiBrZXlmcmFtZS4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGJ5IEFuaW1hdG9yIHRvIGRldGVybWluZSB0aGUgdHlwZSBvZgorICAgICAqIHtAbGluayBUeXBlRXZhbHVhdG9yfSB0byB1c2Ugd2hlbiBjYWxjdWxhdGluZyB2YWx1ZXMgYmV0d2VlbiBrZXlmcmFtZXMuIFRoZSB0eXBlIGlzIGJhc2VkCisgICAgICogb24gdGhlIHR5cGUgb2YgS2V5ZnJhbWUgY3JlYXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgS2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBtVmFsdWVUeXBlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9LZXlmcmFtZVNldC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0tleWZyYW1lU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE0NGI5YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9LZXlmcmFtZVNldC5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yOworCisvKioKKyAqIFRoaXMgY2xhc3MgaG9sZHMgYSBjb2xsZWN0aW9uIG9mIEtleWZyYW1lIG9iamVjdHMgYW5kIGlzIGNhbGxlZCBieSBBbmltYXRvciB0byBjYWxjdWxhdGUKKyAqIHZhbHVlcyBiZXR3ZWVuIHRob3NlIGtleWZyYW1lcyBmb3IgYSBnaXZlbiBhbmltYXRpb24uIFRoZSBjbGFzcyBpbnRlcm5hbCB0byB0aGUgYW5pbWF0aW9uCisgKiBwYWNrYWdlIGJlY2F1c2UgaXQgaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIGhvdyBLZXlmcmFtZXMgYXJlIHN0b3JlZCBhbmQgdXNlZC4KKyAqLworY2xhc3MgS2V5ZnJhbWVTZXQgeworCisgICAgcHJpdmF0ZSBpbnQgbU51bUtleWZyYW1lczsKKworICAgIEFycmF5TGlzdDxLZXlmcmFtZT4gbUtleWZyYW1lczsKKworICAgIHB1YmxpYyBLZXlmcmFtZVNldChLZXlmcmFtZS4uLiBrZXlmcmFtZXMpIHsKKyAgICAgICAgbUtleWZyYW1lcyA9IG5ldyBBcnJheUxpc3Q8S2V5ZnJhbWU+KCk7CisgICAgICAgIGZvciAoS2V5ZnJhbWUga2V5ZnJhbWUgOiBrZXlmcmFtZXMpIHsKKyAgICAgICAgICAgIG1LZXlmcmFtZXMuYWRkKGtleWZyYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtTnVtS2V5ZnJhbWVzID0gbUtleWZyYW1lcy5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYW5pbWF0ZWQgdmFsdWUsIGdpdmVuIHRoZSBlbGFwc2VkIGZyYWN0aW9uIG9mIHRoZSBhbmltYXRpb24gKGludGVycG9sYXRlZCBieSB0aGUKKyAgICAgKiBhbmltYXRpb24ncyBpbnRlcnBvbGF0b3IpIGFuZCB0aGUgZXZhbHVhdG9yIHVzZWQgdG8gY2FsY3VsYXRlIGluLWJldHdlZW4gdmFsdWVzLiBUaGlzCisgICAgICogZnVuY3Rpb24gbWFwcyB0aGUgaW5wdXQgZnJhY3Rpb24gdG8gdGhlIGFwcHJvcHJpYXRlIGtleWZyYW1lIGludGVydmFsIGFuZCBhIGZyYWN0aW9uCisgICAgICogYmV0d2VlbiB0aGVtIGFuZCByZXR1cm5zIHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUuIE5vdGUgdGhhdCB0aGUgaW5wdXQgZnJhY3Rpb24gbWF5IGZhbGwKKyAgICAgKiBvdXRzaWRlIHRoZSBbMC0xXSBib3VuZHMsIGlmIHRoZSBhbmltYXRpb24ncyBpbnRlcnBvbGF0b3IgbWFkZSB0aGF0IGhhcHBlbiAoZS5nLiwgYQorICAgICAqIHNwcmluZyBpbnRlcnBvbGF0aW9uIHRoYXQgbWlnaHQgc2VuZCB0aGUgZnJhY3Rpb24gcGFzdCAxLjApLiBXZSBoYW5kbGUgdGhpcyBzaXR1YXRpb24gYnkKKyAgICAgKiBqdXN0IHVzaW5nIHRoZSB0d28ga2V5ZnJhbWVzIGF0IHRoZSBhcHByb3ByaWF0ZSBlbmQgd2hlbiB0aGUgdmFsdWUgaXMgb3V0c2lkZSB0aG9zZSBib3VuZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbgorICAgICAqIEBwYXJhbSBldmFsdWF0b3IgVGhlIHR5cGUgZXZhbHVhdG9yIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWVzLgorICAgICAqIEByZXR1cm4gVGhlIGFuaW1hdGVkIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoZmxvYXQgZnJhY3Rpb24sIFR5cGVFdmFsdWF0b3IgZXZhbHVhdG9yKSB7CisgICAgICAgIC8vIFRPRE86IHNwZWNpYWwtY2FzZSAyLWtleWZyYW1lIGNvbW1vbiBjYXNlCisKKyAgICAgICAgaWYgKGZyYWN0aW9uIDw9IDBmKSB7CisgICAgICAgICAgICBmaW5hbCBLZXlmcmFtZSBwcmV2S2V5ZnJhbWUgPSBtS2V5ZnJhbWVzLmdldCgwKTsKKyAgICAgICAgICAgIGZpbmFsIEtleWZyYW1lIG5leHRLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KDEpOworICAgICAgICAgICAgZmluYWwgSW50ZXJwb2xhdG9yIGludGVycG9sYXRvciA9IG5leHRLZXlmcmFtZS5nZXRJbnRlcnBvbGF0b3IoKTsKKyAgICAgICAgICAgIGlmIChpbnRlcnBvbGF0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gaW50ZXJwb2xhdG9yLmdldEludGVycG9sYXRpb24oZnJhY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmxvYXQgaW50ZXJ2YWxGcmFjdGlvbiA9IChmcmFjdGlvbiAtIHByZXZLZXlmcmFtZS5nZXRGcmFjdGlvbigpKSAvCisgICAgICAgICAgICAgICAgKG5leHRLZXlmcmFtZS5nZXRGcmFjdGlvbigpIC0gcHJldktleWZyYW1lLmdldEZyYWN0aW9uKCkpOworICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5ldmFsdWF0ZShpbnRlcnZhbEZyYWN0aW9uLCBwcmV2S2V5ZnJhbWUuZ2V0VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgbmV4dEtleWZyYW1lLmdldFZhbHVlKCkpOworICAgICAgICB9IGVsc2UgaWYgKGZyYWN0aW9uID49IDFmKSB7CisgICAgICAgICAgICBmaW5hbCBLZXlmcmFtZSBwcmV2S2V5ZnJhbWUgPSBtS2V5ZnJhbWVzLmdldChtTnVtS2V5ZnJhbWVzIC0gMik7CisgICAgICAgICAgICBmaW5hbCBLZXlmcmFtZSBuZXh0S2V5ZnJhbWUgPSBtS2V5ZnJhbWVzLmdldChtTnVtS2V5ZnJhbWVzIC0gMSk7CisgICAgICAgICAgICBmaW5hbCBJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yID0gbmV4dEtleWZyYW1lLmdldEludGVycG9sYXRvcigpOworICAgICAgICAgICAgaWYgKGludGVycG9sYXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSBpbnRlcnBvbGF0b3IuZ2V0SW50ZXJwb2xhdGlvbihmcmFjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbG9hdCBpbnRlcnZhbEZyYWN0aW9uID0gKGZyYWN0aW9uIC0gcHJldktleWZyYW1lLmdldEZyYWN0aW9uKCkpIC8KKyAgICAgICAgICAgICAgICAobmV4dEtleWZyYW1lLmdldEZyYWN0aW9uKCkgLSBwcmV2S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSk7CisgICAgICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmV2YWx1YXRlKGludGVydmFsRnJhY3Rpb24sIHByZXZLZXlmcmFtZS5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICBuZXh0S2V5ZnJhbWUuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgS2V5ZnJhbWUgcHJldktleWZyYW1lID0gbUtleWZyYW1lcy5nZXQoMCk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbU51bUtleWZyYW1lczsgKytpKSB7CisgICAgICAgICAgICBLZXlmcmFtZSBuZXh0S2V5ZnJhbWUgPSBtS2V5ZnJhbWVzLmdldChpKTsKKyAgICAgICAgICAgIGlmIChmcmFjdGlvbiA8IG5leHRLZXlmcmFtZS5nZXRGcmFjdGlvbigpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgSW50ZXJwb2xhdG9yIGludGVycG9sYXRvciA9IG5leHRLZXlmcmFtZS5nZXRJbnRlcnBvbGF0b3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJwb2xhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSBpbnRlcnBvbGF0b3IuZ2V0SW50ZXJwb2xhdGlvbihmcmFjdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZsb2F0IGludGVydmFsRnJhY3Rpb24gPSAoZnJhY3Rpb24gLSBwcmV2S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSkgLworICAgICAgICAgICAgICAgICAgICAobmV4dEtleWZyYW1lLmdldEZyYWN0aW9uKCkgLSBwcmV2S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5ldmFsdWF0ZShpbnRlcnZhbEZyYWN0aW9uLCBwcmV2S2V5ZnJhbWUuZ2V0VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRLZXlmcmFtZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXZLZXlmcmFtZSA9IG5leHRLZXlmcmFtZTsKKyAgICAgICAgfQorICAgICAgICAvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKKyAgICAgICAgcmV0dXJuIG1LZXlmcmFtZXMuZ2V0KG1OdW1LZXlmcmFtZXMgLSAxKS5nZXRWYWx1ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Qcm9wZXJ0eUFuaW1hdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vUHJvcGVydHlBbmltYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNmVkY2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vUHJvcGVydHlBbmltYXRvci5qYXZhCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKKy8qKgorICogVGhpcyBzdWJjbGFzcyBvZiB7QGxpbmsgQW5pbWF0b3J9IHByb3ZpZGVzIHN1cHBvcnQgZm9yIGFuaW1hdGluZyBwcm9wZXJ0aWVzIG9uIHRhcmdldCBvYmplY3RzLgorICogVGhlIGNvbnN0cnVjdG9ycyBvZiB0aGlzIGNsYXNzIHRha2UgcGFyYW1ldGVycyB0byBkZWZpbmUgdGhlIHRhcmdldCBvYmplY3QgdGhhdCB3aWxsIGJlIGFuaW1hdGVkCisgKiBhcyB3ZWxsIGFzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgYW5pbWF0ZWQuIEFwcHJvcHJpYXRlIHNldC9nZXQgZnVuY3Rpb25zCisgKiBhcmUgdGhlbiBkZXRlcm1pbmVkIGludGVybmFsbHkgYW5kIHRoZSBhbmltYXRpb24gd2lsbCBjYWxsIHRoZXNlIGZ1bmN0aW9ucyBhcyBuZWNlc3NhcnkgdG8KKyAqIGFuaW1hdGUgdGhlIHByb3BlcnR5LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUHJvcGVydHlBbmltYXRvcjxUPiBleHRlbmRzIEFuaW1hdG9yPFQ+IHsKKworICAgIC8vIFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBwcm9wZXJ0eSBleGlzdHMsIHNldCBpbiB0aGUgY29uc3RydWN0b3IKKyAgICBwcml2YXRlIE9iamVjdCBtVGFyZ2V0OworCisgICAgcHJpdmF0ZSBTdHJpbmcgbVByb3BlcnR5TmFtZTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBhbmltYXRlZC4gVGhpcyBuYW1lIGlzIHVzZWQgdG8gZGVyaXZlCisgICAgICogYSBzZXR0ZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB0byBzZXQgYW5pbWF0ZWQgdmFsdWVzLgorICAgICAqIEZvciBleGFtcGxlLCBhIHByb3BlcnR5IG5hbWUgb2YgPGNvZGU+Zm9vPC9jb2RlPiB3aWxsIHJlc3VsdAorICAgICAqIGluIGEgY2FsbCB0byB0aGUgZnVuY3Rpb24gPGNvZGU+c2V0Rm9vKCk8L2NvZGU+IG9uIHRoZSB0YXJnZXQgb2JqZWN0LiBJZiBlaXRoZXIKKyAgICAgKiA8Y29kZT52YWx1ZUZyb208L2NvZGU+IG9yIDxjb2RlPnZhbHVlVG88L2NvZGU+IGlzIG51bGwsIHRoZW4gYSBnZXR0ZXIgZnVuY3Rpb24gd2lsbAorICAgICAqIGFsc28gYmUgZGVyaXZlZCBhbmQgY2FsbGVkLgorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IHRoZSBzZXR0ZXIgZnVuY3Rpb24gZGVyaXZlZCBmcm9tIHRoaXMgcHJvcGVydHkgbmFtZQorICAgICAqIG11c3QgdGFrZSB0aGUgc2FtZSBwYXJhbWV0ZXIgdHlwZSBhcyB0aGUKKyAgICAgKiA8Y29kZT52YWx1ZUZyb208L2NvZGU+IGFuZCA8Y29kZT52YWx1ZVRvPC9jb2RlPiBwcm9wZXJ0aWVzLCBvdGhlcndpc2UgdGhlIGNhbGwgdG8KKyAgICAgKiB0aGUgc2V0dGVyIGZ1bmN0aW9uIHdpbGwgZmFpbC48L3A+CisgICAgICoKKyAgICAgKiA8cD5JZiB0aGlzIFByb3BlcnR5QW5pbWF0b3IgaGFzIGJlZW4gc2V0IHVwIHRvIGFuaW1hdGUgc2V2ZXJhbCBwcm9wZXJ0aWVzIHRvZ2V0aGVyLAorICAgICAqIHVzaW5nIG1vcmUgdGhhbiBvbmUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cywgdGhlbiBzZXR0aW5nIHRoZSBwcm9wZXJ0eU5hbWUgc2ltcGx5CisgICAgICogc2V0cyB0aGUgcHJvcGVydHlOYW1lIGluIHRoZSBmaXJzdCBvZiB0aG9zZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgICAgIGlmIChtVmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG1WYWx1ZXMgc2hvdWxkIGFsd2F5cyBiZSBub24tbnVsbAorICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIgdmFsdWVzSG9sZGVyID0gbVZhbHVlc1swXTsKKyAgICAgICAgICAgIFN0cmluZyBvbGROYW1lID0gdmFsdWVzSG9sZGVyLmdldFByb3BlcnR5TmFtZSgpOworICAgICAgICAgICAgdmFsdWVzSG9sZGVyLnNldFByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpOworICAgICAgICAgICAgbVZhbHVlc01hcC5yZW1vdmUob2xkTmFtZSk7CisgICAgICAgICAgICBtVmFsdWVzTWFwLnB1dChwcm9wZXJ0eU5hbWUsIHZhbHVlc0hvbGRlcik7CisgICAgICAgIH0KKyAgICAgICAgbVByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgYW5pbWF0ZWQuIFRoaXMgbmFtZSB3aWxsIGJlIHVzZWQgdG8gZGVyaXZlCisgICAgICogYSBzZXR0ZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB0byBzZXQgYW5pbWF0ZWQgdmFsdWVzLgorICAgICAqIEZvciBleGFtcGxlLCBhIHByb3BlcnR5IG5hbWUgb2YgPGNvZGU+Zm9vPC9jb2RlPiB3aWxsIHJlc3VsdAorICAgICAqIGluIGEgY2FsbCB0byB0aGUgZnVuY3Rpb24gPGNvZGU+c2V0Rm9vKCk8L2NvZGU+IG9uIHRoZSB0YXJnZXQgb2JqZWN0LiBJZiBlaXRoZXIKKyAgICAgKiA8Y29kZT52YWx1ZUZyb208L2NvZGU+IG9yIDxjb2RlPnZhbHVlVG88L2NvZGU+IGlzIG51bGwsIHRoZW4gYSBnZXR0ZXIgZnVuY3Rpb24gd2lsbAorICAgICAqIGFsc28gYmUgZGVyaXZlZCBhbmQgY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgeworICAgICAgICByZXR1cm4gbVByb3BlcnR5TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgdGhlIHNldHRlciBvciBnZXR0ZXIgZnVuY3Rpb24gdXNpbmcgdGhlIEphdmFCZWFucyBjb252ZW50aW9uIG9mIHNldEZvbyBvcgorICAgICAqIGdldEZvbyBmb3IgYSBwcm9wZXJ0eSBuYW1lZCAnZm9vJy4gVGhpcyBmdW5jdGlvbiBmaWd1cmVzIG91dCB3aGF0IHRoZSBuYW1lIG9mIHRoZQorICAgICAqIGZ1bmN0aW9uIHNob3VsZCBiZSBhbmQgdXNlcyByZWZsZWN0aW9uIHRvIGZpbmQgdGhlIE1ldGhvZCB3aXRoIHRoYXQgbmFtZSBvbiB0aGUKKyAgICAgKiB0YXJnZXQgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCAic2V0IiBvciAiZ2V0IiwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgbmVlZCBhIHNldHRlciBvciBnZXR0ZXIuCisgICAgICogQHJldHVybiBNZXRob2QgdGhlIG1ldGhvZCBhc3NvY2lhdGVkIHdpdGggbVByb3BlcnR5TmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1ldGhvZCBnZXRQcm9wZXJ0eUZ1bmN0aW9uKFN0cmluZyBwcmVmaXgsIENsYXNzIHZhbHVlVHlwZSkgeworICAgICAgICAvLyBUT0RPOiBmYXN0ZXIgaW1wbGVtZW50YXRpb24uLi4KKyAgICAgICAgTWV0aG9kIHJldHVyblZhbCA9IG51bGw7CisgICAgICAgIFN0cmluZyBmaXJzdExldHRlciA9IG1Qcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsIDEpOworICAgICAgICBTdHJpbmcgdGhlUmVzdCA9IG1Qcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpOworICAgICAgICBmaXJzdExldHRlciA9IGZpcnN0TGV0dGVyLnRvVXBwZXJDYXNlKCk7CisgICAgICAgIFN0cmluZyBzZXR0ZXJOYW1lID0gcHJlZml4ICsgZmlyc3RMZXR0ZXIgKyB0aGVSZXN0OworICAgICAgICBDbGFzcyBhcmdzW10gPSBudWxsOworICAgICAgICBpZiAodmFsdWVUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFyZ3MgPSBuZXcgQ2xhc3NbMV07CisgICAgICAgICAgICBhcmdzWzBdID0gdmFsdWVUeXBlOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm5WYWwgPSBtVGFyZ2V0LmdldENsYXNzKCkuZ2V0TWV0aG9kKHNldHRlck5hbWUsIGFyZ3MpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5QW5pbWF0b3IiLAorICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZmluZCBzZXR0ZXIvZ2V0dGVyIGZvciBwcm9wZXJ0eSAiICsgbVByb3BlcnR5TmFtZSArICI6ICIgKyBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dXJuVmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgUHJvcGVydHlBbmltYXRvciBvYmplY3QuIFRoaXMgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBwcmltYXJpbHkgZm9yCisgICAgICogdXNlIGludGVybmFsbHk7IHRoZSBvdGhlciBjb25zdHJ1Y3RvcnMgd2hpY2ggdGFrZSBwYXJhbWV0ZXJzIGFyZSBtb3JlIGdlbmVyYWxseQorICAgICAqIHVzZWZ1bC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlBbmltYXRvcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYSBzaW5nbGUgcHJvcGVydHkgbmFtZSBhbmQgc2V0IG9mIHZhbHVlcy4gVGhpcyBjb25zdHJ1Y3RvciBpcworICAgICAqIHVzZWQgaW4gdGhlIHNpbXBsZSBjYXNlIG9mIGFuaW1hdGluZyBhIHNpbmdsZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgaXMgdG8gYmUgYW5pbWF0ZWQuIFRoaXMgb2JqZWN0IHNob3VsZAorICAgICAqIGhhdmUgYSBwdWJsaWMgbWV0aG9kIG9uIGl0IGNhbGxlZCA8Y29kZT5zZXROYW1lKCk8L2NvZGU+LCB3aGVyZSA8Y29kZT5uYW1lPC9jb2RlPiBpcworICAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQuCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgc2V0IG9mIHZhbHVlcyB0byBhbmltYXRlIGJldHdlZW4uIElmIHRoZXJlIGlzIG9ubHkgb25lIHZhbHVlLCBpdAorICAgICAqIGlzIGFzc3VtZWQgdG8gYmUgdGhlIGZpbmFsIHZhbHVlIGJlaW5nIGFuaW1hdGVkIHRvLCBhbmQgdGhlIGluaXRpYWwgdmFsdWUgd2lsbCBiZQorICAgICAqIGRlcml2ZWQgb24gdGhlIGZseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlBbmltYXRvcihsb25nIGR1cmF0aW9uLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBULi4udmFsdWVzKSB7CisgICAgICAgIHN1cGVyKGR1cmF0aW9uLCAoVFtdKSB2YWx1ZXMpOworICAgICAgICBtVGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICBzZXRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgPGNvZGU+UHJvcGVydHlWYWx1ZUhvbGRlcjwvY29kZT4gdmFsdWVzLiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZAorICAgICAqIGJlIHVzZWQgd2hlbiBhbmltYXRpbmcgc2V2ZXJhbCBwcm9wZXJ0aWVzIGF0IG9uY2Ugd2l0aCB0aGUgc2FtZSBQcm9wZXJ0eUFuaW1hdG9yLCBzaW5jZQorICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyIGFsbG93cyB5b3UgdG8gYXNzb2NpYXRlIGEgc2V0IG9mIGFuaW1hdGlvbiB2YWx1ZXMgd2l0aCBhIHByb3BlcnR5CisgICAgICogbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgaXMgdG8gYmUgYW5pbWF0ZWQuIFRoaXMgb2JqZWN0IHNob3VsZAorICAgICAqIGhhdmUgcHVibGljIG1ldGhvZHMgb24gaXQgY2FsbGVkIDxjb2RlPnNldE5hbWUoKTwvY29kZT4sIHdoZXJlIDxjb2RlPm5hbWU8L2NvZGU+IGlzCisgICAgICogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHBhc3NlZCBpbiBhcyB0aGUgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBwYXJhbWV0ZXIgZm9yCisgICAgICogZWFjaCBvZiB0aGUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cy4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzIHdoaWNoIGhvbGQgZWFjaCB0aGUgcHJvcGVydHkgbmFtZSBhbmQgdmFsdWVzCisgICAgICogdG8gYW5pbWF0ZSB0aGF0IHByb3BlcnR5IGJldHdlZW4uCisgICAgICovCisgICAgcHVibGljIFByb3BlcnR5QW5pbWF0b3IobG9uZyBkdXJhdGlvbiwgT2JqZWN0IHRhcmdldCwgUHJvcGVydHlWYWx1ZXNIb2xkZXIuLi52YWx1ZXMpIHsKKyAgICAgICAgc3VwZXIoZHVyYXRpb24pOworICAgICAgICBzZXRWYWx1ZXModmFsdWVzKTsKKyAgICAgICAgbVRhcmdldCA9IHRhcmdldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgZmlyc3QgYW5pbWF0aW9uCisgICAgICogZnJhbWUgb2YgYW4gYW5pbWF0aW9uLiBJZiB0aGVyZSBpcyBhIG5vbnplcm8gPGNvZGU+c3RhcnREZWxheTwvY29kZT4sIHRoZQorICAgICAqIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGF0IGRlbGF5IGVuZHMuCisgICAgICogSXQgdGFrZXMgY2FyZSBvZiB0aGUgZmluYWwgaW5pdGlhbGl6YXRpb24gc3RlcHMgZm9yIHRoZQorICAgICAqIGFuaW1hdGlvbi4gVGhpcyBpbmNsdWRlcyBzZXR0aW5nIG1FdmFsdWF0b3IsIGlmIHRoZSB1c2VyIGhhcyBub3QgeWV0CisgICAgICogc2V0IGl0IHVwLCBhbmQgdGhlIHNldHRlci9nZXR0ZXIgbWV0aG9kcywgaWYgdGhlIHVzZXIgZGlkIG5vdCBzdXBwbHkKKyAgICAgKiB0aGVtLgorICAgICAqCisgICAgICogIDxwPk92ZXJyaWRlcnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgdGhlIHN1cGVyY2xhc3MgbWV0aG9kIHRvIGNhdXNlCisgICAgICogIGludGVybmFsIG1lY2hhbmlzbXMgdG8gYmUgc2V0IHVwIGNvcnJlY3RseS48L3A+CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBpbml0QW5pbWF0aW9uKCkgeworICAgICAgICBzdXBlci5pbml0QW5pbWF0aW9uKCk7CisgICAgICAgIGludCBudW1WYWx1ZXMgPSBtVmFsdWVzLmxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7ICsraSkgeworICAgICAgICAgICAgbVZhbHVlc1tpXS5zZXR1cFNldHRlckFuZEdldHRlcihtVGFyZ2V0KTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHRhcmdldCBvYmplY3Qgd2hvc2UgcHJvcGVydHkgd2lsbCBiZSBhbmltYXRlZCBieSB0aGlzIGFuaW1hdGlvbgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgb2JqZWN0IGJlaW5nIGFuaW1hdGVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRUYXJnZXQoKSB7CisgICAgICAgIHJldHVybiBtVGFyZ2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRhcmdldCBvYmplY3Qgd2hvc2UgcHJvcGVydHkgd2lsbCBiZSBhbmltYXRlZCBieSB0aGlzIGFuaW1hdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IGJlaW5nIGFuaW1hdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE9iamVjdCB0YXJnZXQpIHsKKyAgICAgICAgbVRhcmdldCA9IHRhcmdldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUgZWxhcHNlZCBmcmFjdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGR1cmluZyBldmVyeQorICAgICAqIGFuaW1hdGlvbiBmcmFtZS4gVGhpcyBmdW5jdGlvbiB0dXJucyB0aGUgZWxhcHNlZCBmcmFjdGlvbiBpbnRvIGFuIGludGVycG9sYXRlZCBmcmFjdGlvbgorICAgICAqIGFuZCB0aGVuIGludG8gYW4gYW5pbWF0ZWQgdmFsdWUgKGZyb20gdGhlIGV2YWx1YXRvci4gVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBtb3N0bHkgZHVyaW5nCisgICAgICogYW5pbWF0aW9uIHVwZGF0ZXMsIGJ1dCBpdCBpcyBhbHNvIGNhbGxlZCB3aGVuIHRoZSA8Y29kZT5lbmQoKTwvY29kZT4KKyAgICAgKiBmdW5jdGlvbiBpcyBjYWxsZWQsIHRvIHNldCB0aGUgZmluYWwgdmFsdWUgb24gdGhlIHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+T3ZlcnJpZGVzIG9mIHRoaXMgbWV0aG9kIG11c3QgY2FsbCB0aGUgc3VwZXJjbGFzcyB0byBwZXJmb3JtIHRoZSBjYWxjdWxhdGlvbgorICAgICAqIG9mIHRoZSBhbmltYXRlZCB2YWx1ZS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIGFuaW1hdGVWYWx1ZShmbG9hdCBmcmFjdGlvbikgeworICAgICAgICBzdXBlci5hbmltYXRlVmFsdWUoZnJhY3Rpb24pOworICAgICAgICBpbnQgbnVtVmFsdWVzID0gbVZhbHVlcy5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyArK2kpIHsKKyAgICAgICAgICAgIG1WYWx1ZXNbaV0uc2V0QW5pbWF0ZWRWYWx1ZShtVGFyZ2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQcm9wZXJ0eUFuaW1hdG9yIGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUHJvcGVydHlBbmltYXRvciBhbmltID0gKFByb3BlcnR5QW5pbWF0b3IpIHN1cGVyLmNsb25lKCk7CisgICAgICAgIHJldHVybiBhbmltOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Qcm9wZXJ0eVZhbHVlc0hvbGRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1Byb3BlcnR5VmFsdWVzSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4MjliOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Qcm9wZXJ0eVZhbHVlc0hvbGRlci5qYXZhCkBAIC0wLDAgKzEsNTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgUHJvcGVydHlWYWx1ZXNIb2xkZXI8VD4geworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsdWVzLiBUaGlzIG5lZWQgbm90IGJlIGEgcmVhbCBwcm9wZXJ0eSwKKyAgICAgKiB1bmxlc3MgdGhpcyBvYmplY3QgaXMgYmVpbmcgdXNlZCB3aXRoIFByb3BlcnR5QW5pbWF0b3IuIEJ1dCB0aGlzIGlzIHRoZSBuYW1lIGJ5IHdoaWNoCisgICAgICogYW5pYW10ZWQgdmFsdWVzIGFyZSBsb29rZWQgdXAgd2l0aCBnZXRBbmltYXRlZFZhbHVlKFN0cmluZykgaW4gQW5pbWF0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbVByb3BlcnR5TmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSBzZXR0ZXIgZnVuY3Rpb24sIGlmIG5lZWRlZC4gUHJvcGVydHlBbmltYXRvciBoYW5kcyBvZmYgdGhpcyBmdW5jdGlvbmFsaXR5IHRvCisgICAgICogUHJvcGVydHlWYWx1ZXNIb2xkZXIsIHNpbmNlIGl0IGhvbGRzIGFsbCBvZiB0aGUgcGVyLXByb3BlcnR5IGluZm9ybWF0aW9uLiBUaGlzCisgICAgICogcHJvcGVydHkgY2FuIGJlIG1hbnVhbGx5IHNldCB2aWEgc2V0U2V0dGVyKCkuIE90aGVyd2lzZSwgaXQgaXMgYXV0b21hdGljYWxseQorICAgICAqIGRlcml2ZWQgd2hlbiB0aGUgYW5pbWF0aW9uIHN0YXJ0cyBpbiBzZXR1cFNldHRlckFuZEdldHRlcigpIGlmIHVzaW5nIFByb3BlcnR5QW5pbWF0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBNZXRob2QgbVNldHRlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZ2V0dGVyIGZ1bmN0aW9uLCBpZiBuZWVkZWQuIFByb3BlcnR5QW5pbWF0b3IgaGFuZHMgb2ZmIHRoaXMgZnVuY3Rpb25hbGl0eSB0bworICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyLCBzaW5jZSBpdCBob2xkcyBhbGwgb2YgdGhlIHBlci1wcm9wZXJ0eSBpbmZvcm1hdGlvbi4gVGhpcworICAgICAqIHByb3BlcnR5IGNhbiBiZSBtYW51YWxseSBzZXQgdmlhIHNldFNldHRlcigpLiBPdGhlcndpc2UsIGl0IGlzIGF1dG9tYXRpY2FsbHkKKyAgICAgKiBkZXJpdmVkIHdoZW4gdGhlIGFuaW1hdGlvbiBzdGFydHMgaW4gc2V0dXBTZXR0ZXJBbmRHZXR0ZXIoKSBpZiB1c2luZyBQcm9wZXJ0eUFuaW1hdG9yLgorICAgICAqIFRoZSBnZXR0ZXIgaXMgb25seSBkZXJpdmVkIGFuZCB1c2VkIGlmIG9uZSBvZiB0aGUgdmFsdWVzIGlzIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBNZXRob2QgbUdldHRlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB2YWx1ZXMgc3VwcGxpZWQuIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBib3RoIGluIGRlcml2aW5nIHRoZSBzZXR0ZXIvZ2V0dGVyCisgICAgICogZnVuY3Rpb25zIGFuZCBpbiBkZXJpdmluZyB0aGUgdHlwZSBvZiBUeXBlRXZhbHVhdG9yLgorICAgICAqLworICAgIHByaXZhdGUgQ2xhc3MgbVZhbHVlVHlwZTsKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2Yga2V5ZnJhbWVzICh0aW1lL3ZhbHVlIHBhaXJzKSB0aGF0IGRlZmluZSB0aGlzIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEtleWZyYW1lU2V0IG1LZXlmcmFtZVNldCA9IG51bGw7CisKKworICAgIC8vIHR5cGUgZXZhbHVhdG9ycyBmb3IgdGhlIHRocmVlIHByaW1pdGl2ZSB0eXBlcyBoYW5kbGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlRXZhbHVhdG9yIHNJbnRFdmFsdWF0b3IgPSBuZXcgSW50RXZhbHVhdG9yKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZUV2YWx1YXRvciBzRmxvYXRFdmFsdWF0b3IgPSBuZXcgRmxvYXRFdmFsdWF0b3IoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlRXZhbHVhdG9yIHNEb3VibGVFdmFsdWF0b3IgPSBuZXcgRG91YmxlRXZhbHVhdG9yKCk7CisKKyAgICAvLyBXZSB0cnkgc2V2ZXJhbCBkaWZmZXJlbnQgdHlwZXMgd2hlbiBzZWFyY2hpbmcgZm9yIGFwcHJvcHJpYXRlIHNldHRlci9nZXR0ZXIgZnVuY3Rpb25zLgorICAgIC8vIFRoZSBjYWxsZXIgbWF5IGhhdmUgc3VwcGxpZWQgdmFsdWVzIGluIGEgdHlwZSB0aGF0IGRvZXMgbm90IG1hdGNoIHRoZSBzZXR0ZXIvZ2V0dGVyCisgICAgLy8gZnVuY3Rpb25zIChzdWNoIGFzIHRoZSBpbnRlZ2VycyAwIGFuZCAxIHRvIHJlcHJlc2VudCBmbG9hdGluZyBwb2ludCB2YWx1ZXMgZm9yIGFscGhhKS4KKyAgICAvLyBBbHNvLCB0aGUgdXNlIG9mIGdlbmVyaWNzIGluIGNvbnN0cnVjdG9ycyBtZWFucyB0aGF0IHdlIGVuZCB1cCB3aXRoIHRoZSBPYmplY3QgdmVyc2lvbnMKKyAgICAvLyBvZiBwcmltaXRpdmUgdHlwZXMgKEZsb2F0IHZzLiBmbG9hdCkuIEJ1dCBtb3N0IGxpa2VseSwgdGhlIHNldHRlci9nZXR0ZXIgZnVuY3Rpb25zCisgICAgLy8gd2lsbCB0YWtlIHByaW1pdGl2ZSB0eXBlcyBpbnN0ZWFkLgorICAgIC8vIFNvIHdlIHN1cHBseSBhbiBvcmRlcmVkIGFycmF5IG9mIG90aGVyIHR5cGVzIHRvIHRyeSBiZWZvcmUgZ2l2aW5nIHVwLgorICAgIHByaXZhdGUgc3RhdGljIENsYXNzW10gRkxPQVRfVkFSSUFOVFMgPSB7ZmxvYXQuY2xhc3MsIEZsb2F0LmNsYXNzLCBkb3VibGUuY2xhc3MsIGludC5jbGFzcywKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcywgSW50ZWdlci5jbGFzc307CisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NbXSBJTlRFR0VSX1ZBUklBTlRTID0ge2ludC5jbGFzcywgSW50ZWdlci5jbGFzcywgZmxvYXQuY2xhc3MsIGRvdWJsZS5jbGFzcywKKyAgICAgICAgICAgIEZsb2F0LmNsYXNzLCBEb3VibGUuY2xhc3N9OworICAgIHByaXZhdGUgc3RhdGljIENsYXNzW10gRE9VQkxFX1ZBUklBTlRTID0ge2RvdWJsZS5jbGFzcywgRG91YmxlLmNsYXNzLCBmbG9hdC5jbGFzcywgaW50LmNsYXNzLAorICAgICAgICAgICAgRmxvYXQuY2xhc3MsIEludGVnZXIuY2xhc3N9OworCisgICAgLy8gVGhlc2UgbWFwcyBob2xkIGFsbCBwcm9wZXJ0eSBlbnRyaWVzIGZvciBhIHBhcnRpY3VsYXIgY2xhc3MuIFRoaXMgbWFwCisgICAgLy8gaXMgdXNlZCB0byBzcGVlZCB1cCBwcm9wZXJ0eS9zZXR0ZXIvZ2V0dGVyIGxvb2t1cHMgZm9yIGEgZ2l2ZW4gY2xhc3MvcHJvcGVydHkKKyAgICAvLyBjb21iaW5hdGlvbi4gTm8gbmVlZCB0byB1c2UgcmVmbGVjdGlvbiBvbiB0aGUgY29tYmluYXRpb24gbW9yZSB0aGFuIG9uY2UuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxDbGFzcywgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZD4+IHNTZXR0ZXJQcm9wZXJ0eU1hcCA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxDbGFzcywgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZD4+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxDbGFzcywgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZD4+IHNHZXR0ZXJQcm9wZXJ0eU1hcCA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxDbGFzcywgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZD4+KCk7CisKKyAgICAvLyBUaGlzIGxvY2sgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBvbmx5IG9uZSB0aHJlYWQgaXMgYWNjZXNzaW5nIHRoZSBwcm9wZXJ0eSBtYXBzCisgICAgLy8gYXQgYSB0aW1lLgorICAgIHByaXZhdGUgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBwcm9wZXJ0eU1hcExvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworCisgICAgLy8gVXNlZCB0byBwYXNzIHNpbmdsZSB2YWx1ZSB0byB2YXJhcmdzIHBhcmFtZXRlciBpbiBzZXR0ZXIgaW52b2NhdGlvbgorICAgIHByaXZhdGUgT2JqZWN0W10gbVRtcFZhbHVlQXJyYXkgPSBuZXcgT2JqZWN0WzFdOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgZXZhbHVhdG9yIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBhbmltYXRlZCB2YWx1ZXMuIFRoaXMgZXZhbHVhdG9yIGlzIGRldGVybWluZWQKKyAgICAgKiBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRoZSBzdGFydC9lbmQgb2JqZWN0cyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3IsCisgICAgICogYnV0IHRoZSBzeXN0ZW0gb25seSBrbm93cyBhYm91dCB0aGUgcHJpbWl0aXZlIHR5cGVzIGludCwgZG91YmxlLCBhbmQgZmxvYXQuIEFueSBvdGhlcgorICAgICAqIHR5cGUgd2lsbCBuZWVkIHRvIHNldCB0aGUgZXZhbHVhdG9yIHRvIGEgY3VzdG9tIGV2YWx1YXRvciBmb3IgdGhhdCB0eXBlLgorICAgICAqLworICAgIHByaXZhdGUgVHlwZUV2YWx1YXRvciBtRXZhbHVhdG9yOworCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG1vc3QgcmVjZW50bHkgY2FsY3VsYXRlZCBieSBjYWxjdWxhdGVWYWx1ZSgpLiBUaGlzIGlzIHNldCBkdXJpbmcKKyAgICAgKiB0aGF0IGZ1bmN0aW9uIGFuZCBtaWdodCBiZSByZXRyaWV2ZWQgbGF0ZXIgZWl0aGVyIGJ5IEFuaW1hdG9yLmFuaW1hdGVkVmFsdWUoKSBvcgorICAgICAqIGJ5IHRoZSBwcm9wZXJ0eS1zZXR0aW5nIGxvZ2ljIGluIFByb3BlcnR5QW5pbWF0b3IuYW5pbWF0ZWRWYWx1ZSgpLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IG1BbmltYXRlZFZhbHVlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdCB3aXRoIGp1c3QgYSBzZXQgb2YgdmFsdWVzLiBUaGlzIGNvbnN0cnVjdG9yCisgICAgICogaXMgdHlwaWNhbGx5IG5vdCB1c2VkIHdoZW4gYW5pbWF0aW5nIG9iamVjdHMgd2l0aCBQcm9wZXJ0eUFuaW1hdG9yLCBiZWNhdXNlIHRoYXQKKyAgICAgKiBvYmplY3QgbmVlZHMgZGlzdGluY3QgYW5kIG1lYW5pbmdmdWwgcHJvcGVydHkgbmFtZXMuIFNpbXBsZXIgYW5pbWF0aW9ucyBvZiBvbmUKKyAgICAgKiBzZXQgb2YgdmFsdWVzIHVzaW5nIEFuaW1hdG9yIG1heSB1c2UgdGhpcyBjb25zdHJ1Y3RvciwgaG93ZXZlciwgYmVjYXVzZSBubworICAgICAqIGRpc3Rpbmd1aXNoaW5nIG5hbWUgaXMgbmVlZGVkLgorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHNldCBvZiB2YWx1ZXMgdG8gYW5pbWF0ZSBiZXR3ZWVuLiBJZiB0aGVyZSBpcyBvbmx5IG9uZSB2YWx1ZSwgaXQKKyAgICAgKiBpcyBhc3N1bWVkIHRvIGJlIHRoZSBmaW5hbCB2YWx1ZSBiZWluZyBhbmltYXRlZCB0bywgYW5kIHRoZSBpbml0aWFsIHZhbHVlIHdpbGwgYmUKKyAgICAgKiBkZXJpdmVkIG9uIHRoZSBmbHkuCisgICAgICovCisgICAgcHVibGljIFByb3BlcnR5VmFsdWVzSG9sZGVyKFQuLi52YWx1ZXMpIHsKKyAgICAgICAgdGhpcyhudWxsLCB2YWx1ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUgYW5kIHNldCBvZgorICAgICAqIHZhbHVlcy4gVGhlc2UgdmFsdWVzIGNhbiBiZSBvZiBhbnkgdHlwZSwgYnV0IHRoZSB0eXBlIHNob3VsZCBiZSBjb25zaXN0ZW50IHNvIHRoYXQKKyAgICAgKiBhbiBhcHByb3ByaWF0ZSB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvcn0gY2FuIGJlIGZvdW5kIHRoYXQgbWF0Y2hlcworICAgICAqIHRoZSBjb21tb24gdHlwZS4KKyAgICAgKiA8cD5JZiB0aGVyZSBpcyBvbmx5IG9uZSB2YWx1ZSwgaXQgaXMgYXNzdW1lZCB0byBiZSB0aGUgZW5kIHZhbHVlIG9mIGFuIGFuaW1hdGlvbiwKKyAgICAgKiBhbmQgYW4gaW5pdGlhbCB2YWx1ZSB3aWxsIGJlIGRlcml2ZWQsIGlmIHBvc3NpYmxlLCBieSBjYWxsaW5nIGEgZ2V0dGVyIGZ1bmN0aW9uCisgICAgICogb24gdGhlIG9iamVjdC4gQWxzbywgaWYgYW55IHZhbHVlIGlzIG51bGwsIHRoZSB2YWx1ZSB3aWxsIGJlIGZpbGxlZCBpbiB3aGVuIHRoZSBhbmltYXRpb24KKyAgICAgKiBzdGFydHMgaW4gdGhlIHNhbWUgd2F5LiBUaGlzIG1lY2hhbmlzbSBvZiBhdXRvbWF0aWNhbGx5IGdldHRpbmcgbnVsbCB2YWx1ZXMgb25seSB3b3JrcworICAgICAqIGlmIHRoZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3QgaXMgdXNlZCBpbiBjb25qdW5jdGlvbgorICAgICAqIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eUFuaW1hdG9yfSwgYW5kIHdpdGggYSBnZXR0ZXIgZnVuY3Rpb24gZWl0aGVyCisgICAgICogZGVyaXZlZCBhdXRvbWF0aWNhbGx5IGZyb20gPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBvciBzZXQgZXhwbGljaXRseSB2aWEKKyAgICAgKiB7QGxpbmsgI3NldEdldHRlcihqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpfSwgc2luY2Ugb3RoZXJ3aXNlIFByb3BlcnR5VmFsdWVzSG9sZGVyIGhhcworICAgICAqIG5vIHdheSBvZiBkZXRlcm1pbmluZyB3aGF0IHRoZSB2YWx1ZSBzaG91bGQgYmUuCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2V0IG9mIHZhbHVlcy4gVGhpcworICAgICAqIGNhbiBiZSB0aGUgYWN0dWFsIHByb3BlcnR5IG5hbWUgdG8gYmUgdXNlZCB3aGVuIHVzaW5nIGEgUHJvcGVydHlBbmltYXRvciBvYmplY3QsIG9yCisgICAgICoganVzdCBhIG5hbWUgdXNlZCB0byBnZXQgYW5pbWF0ZWQgdmFsdWVzLCBzdWNoIGFzIGlmIHRoaXMgb2JqZWN0IGlzIHVzZWQgd2l0aCBhbgorICAgICAqIEFuaW1hdG9yIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBzZXQgb2YgdmFsdWVzIHRvIGFuaW1hdGUgYmV0d2Vlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlWYWx1ZXNIb2xkZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgVC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgbVByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKKyAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWVzIGJlaW5nIGFuaW1hdGVkIGJldHdlZW4uCisgICAgICogSWYgdGhlcmUgaXMgb25seSBvbmUgdmFsdWUsIGl0IGlzIGFzc3VtZWQgdG8gYmUgdGhlIGVuZCB2YWx1ZSBvZiBhbiBhbmltYXRpb24sCisgICAgICogYW5kIGFuIGluaXRpYWwgdmFsdWUgd2lsbCBiZSBkZXJpdmVkLCBpZiBwb3NzaWJsZSwgYnkgY2FsbGluZyBhIGdldHRlciBmdW5jdGlvbgorICAgICAqIG9uIHRoZSBvYmplY3QuIEFsc28sIGlmIGFueSB2YWx1ZSBpcyBudWxsLCB0aGUgdmFsdWUgd2lsbCBiZSBmaWxsZWQgaW4gd2hlbiB0aGUgYW5pbWF0aW9uCisgICAgICogc3RhcnRzIGluIHRoZSBzYW1lIHdheS4gVGhpcyBtZWNoYW5pc20gb2YgYXV0b21hdGljYWxseSBnZXR0aW5nIG51bGwgdmFsdWVzIG9ubHkgd29ya3MKKyAgICAgKiBpZiB0aGUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0IGlzIHVzZWQgaW4gY29uanVuY3Rpb24KKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlBbmltYXRvcn0sIGFuZCB3aXRoIGEgZ2V0dGVyIGZ1bmN0aW9uIGVpdGhlcgorICAgICAqIGRlcml2ZWQgYXV0b21hdGljYWxseSBmcm9tIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4gb3Igc2V0IGV4cGxpY2l0bHkgdmlhCisgICAgICoge0BsaW5rICNzZXRHZXR0ZXIoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKX0sIHNpbmNlIG90aGVyd2lzZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBoYXMKKyAgICAgKiBubyB3YXkgb2YgZGV0ZXJtaW5pbmcgd2hhdCB0aGUgdmFsdWUgc2hvdWxkIGJlLgorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHNldCBvZiB2YWx1ZXMgdG8gYW5pbWF0ZSBiZXR3ZWVuLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlcyhULi4uIHZhbHVlcykgeworICAgICAgICBpbnQgbnVtS2V5ZnJhbWVzID0gdmFsdWVzLmxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1LZXlmcmFtZXM7ICsraSkgeworICAgICAgICAgICAgaWYgKHZhbHVlc1tpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgdGhpc1ZhbHVlVHlwZSA9IHZhbHVlc1tpXS5nZXRDbGFzcygpOworICAgICAgICAgICAgICAgIGlmIChtVmFsdWVUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVZhbHVlVHlwZSA9IHRoaXNWYWx1ZVR5cGU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNWYWx1ZVR5cGUgIT0gbVZhbHVlVHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1WYWx1ZVR5cGUgPT0gSW50ZWdlci5jbGFzcyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpc1ZhbHVlVHlwZSA9PSBGbG9hdC5jbGFzcyB8fCB0aGlzVmFsdWVUeXBlID09IERvdWJsZS5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmFsdWVUeXBlID0gdGhpc1ZhbHVlVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVZhbHVlVHlwZSA9PSBGbG9hdC5jbGFzcyAmJiB0aGlzVmFsdWVUeXBlID09IERvdWJsZS5jbGFzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WYWx1ZVR5cGUgPSB0aGlzVmFsdWVUeXBlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEtleWZyYW1lIGtleWZyYW1lc1tdID0gbmV3IEtleWZyYW1lW01hdGgubWF4KG51bUtleWZyYW1lcywyKV07CisgICAgICAgIGlmIChtVmFsdWVUeXBlLmVxdWFscyhLZXlmcmFtZS5jbGFzcykpIHsKKyAgICAgICAgICAgIG1WYWx1ZVR5cGUgPSAoKEtleWZyYW1lKXZhbHVlc1swXSkuZ2V0VHlwZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1LZXlmcmFtZXM7ICsraSkgeworICAgICAgICAgICAgICAgIGtleWZyYW1lc1tpXSA9IChLZXlmcmFtZSl2YWx1ZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobnVtS2V5ZnJhbWVzID09IDEpIHsKKyAgICAgICAgICAgICAgICBrZXlmcmFtZXNbMF0gPSBuZXcgS2V5ZnJhbWUoMGYsIG51bGwpOworICAgICAgICAgICAgICAgIGtleWZyYW1lc1sxXSA9IG5ldyBLZXlmcmFtZSgxZiwgdmFsdWVzWzBdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAga2V5ZnJhbWVzWzBdID0gbmV3IEtleWZyYW1lKDBmLCB2YWx1ZXNbMF0pOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbnVtS2V5ZnJhbWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlc1tpXSAhPSBudWxsICYmICh2YWx1ZXNbaV0uZ2V0Q2xhc3MoKSAhPSBtVmFsdWVUeXBlKSkgeworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAga2V5ZnJhbWVzW2ldID0gbmV3IEtleWZyYW1lKChmbG9hdCkgaSAvIChudW1LZXlmcmFtZXMgLSAxKSwgdmFsdWVzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUtleWZyYW1lU2V0ID0gbmV3IEtleWZyYW1lU2V0KGtleWZyYW1lcyk7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIERldGVybWluZSB0aGUgc2V0dGVyIG9yIGdldHRlciBmdW5jdGlvbiB1c2luZyB0aGUgSmF2YUJlYW5zIGNvbnZlbnRpb24gb2Ygc2V0Rm9vIG9yCisgICAgICogZ2V0Rm9vIGZvciBhIHByb3BlcnR5IG5hbWVkICdmb28nLiBUaGlzIGZ1bmN0aW9uIGZpZ3VyZXMgb3V0IHdoYXQgdGhlIG5hbWUgb2YgdGhlCisgICAgICogZnVuY3Rpb24gc2hvdWxkIGJlIGFuZCB1c2VzIHJlZmxlY3Rpb24gdG8gZmluZCB0aGUgTWV0aG9kIHdpdGggdGhhdCBuYW1lIG9uIHRoZQorICAgICAqIHRhcmdldCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0Q2xhc3MgVGhlIGNsYXNzIHRvIHNlYXJjaCBmb3IgdGhlIG1ldGhvZAorICAgICAqIEBwYXJhbSBwcmVmaXggInNldCIgb3IgImdldCIsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIG5lZWQgYSBzZXR0ZXIgb3IgZ2V0dGVyLgorICAgICAqIEBwYXJhbSB2YWx1ZVR5cGUgVGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlciAoaW4gdGhlIGNhc2Ugb2YgYSBzZXR0ZXIpLiBUaGlzIHR5cGUKKyAgICAgKiBpcyBkZXJpdmVkIGZyb20gdGhlIHZhbHVlcyBzZXQgb24gdGhpcyBQcm9wZXJ0eVZhbHVlc0hvbGRlci4gVGhpcyB0eXBlIGlzIHVzZWQgYXMKKyAgICAgKiBhIGZpcnN0IGd1ZXNzIGF0IHRoZSBwYXJhbWV0ZXIgdHlwZSwgYnV0IHdlIGNoZWNrIGZvciBtZXRob2RzIHdpdGggc2V2ZXJhbCBkaWZmZXJlbnQKKyAgICAgKiB0eXBlcyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHNsaWdodCBtaXMtbWF0Y2hlcyBiZXR3ZWVuIHN1cHBsaWVkIHZhbHVlcyBhbmQgYWN0dWFsCisgICAgICogdmFsdWUgdHlwZXMgdXNlZCBvbiB0aGUgc2V0dGVyLgorICAgICAqIEByZXR1cm4gTWV0aG9kIHRoZSBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIG1Qcm9wZXJ0eU5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBNZXRob2QgZ2V0UHJvcGVydHlGdW5jdGlvbihDbGFzcyB0YXJnZXRDbGFzcywgU3RyaW5nIHByZWZpeCwgQ2xhc3MgdmFsdWVUeXBlKSB7CisgICAgICAgIC8vIFRPRE86IGZhc3RlciBpbXBsZW1lbnRhdGlvbi4uLgorICAgICAgICBNZXRob2QgcmV0dXJuVmFsID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGZpcnN0TGV0dGVyID0gbVByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgMSk7CisgICAgICAgIFN0cmluZyB0aGVSZXN0ID0gbVByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIGZpcnN0TGV0dGVyID0gZmlyc3RMZXR0ZXIudG9VcHBlckNhc2UoKTsKKyAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBwcmVmaXggKyBmaXJzdExldHRlciArIHRoZVJlc3Q7CisgICAgICAgIENsYXNzIGFyZ3NbXSA9IG51bGw7CisgICAgICAgIGlmICh2YWx1ZVR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm5WYWwgPSB0YXJnZXRDbGFzcy5nZXRNZXRob2QobWV0aG9kTmFtZSwgYXJncyk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKCJQcm9wZXJ0eVZhbHVlc0hvbGRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZmluZCBuby1hcmcgbWV0aG9kIGZvciBwcm9wZXJ0eSAiICsgbVByb3BlcnR5TmFtZSArICI6ICIgKyBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFyZ3MgPSBuZXcgQ2xhc3NbMV07CisgICAgICAgICAgICBDbGFzcyB0eXBlVmFyaWFudHNbXTsKKyAgICAgICAgICAgIGlmIChtVmFsdWVUeXBlLmVxdWFscyhGbG9hdC5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICB0eXBlVmFyaWFudHMgPSBGTE9BVF9WQVJJQU5UUzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVZhbHVlVHlwZS5lcXVhbHMoSW50ZWdlci5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICB0eXBlVmFyaWFudHMgPSBJTlRFR0VSX1ZBUklBTlRTOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVmFsdWVUeXBlLmVxdWFscyhEb3VibGUuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgdHlwZVZhcmlhbnRzID0gRE9VQkxFX1ZBUklBTlRTOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0eXBlVmFyaWFudHMgPSBuZXcgQ2xhc3NbMV07CisgICAgICAgICAgICAgICAgdHlwZVZhcmlhbnRzWzBdID0gbVZhbHVlVHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoQ2xhc3MgdHlwZVZhcmlhbnQgOiB0eXBlVmFyaWFudHMpIHsKKyAgICAgICAgICAgICAgICBhcmdzWzBdID0gdHlwZVZhcmlhbnQ7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsID0gdGFyZ2V0Q2xhc3MuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIGFyZ3MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFN3YWxsb3cgdGhlIGVycm9yIGFuZCBrZWVwIHRyeWluZyBvdGhlciB2YXJpYW50cworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIHdlIGdvdCBoZXJlLCB0aGVuIG5vIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIHdhcyBmb3VuZAorICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgc2V0dGVyL2dldHRlciBmb3IgcHJvcGVydHkgIiArIG1Qcm9wZXJ0eU5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIHZhbHVlIHR5cGUgIisgbVZhbHVlVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0dXJuVmFsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0dGVyIG9yIGdldHRlciByZXF1ZXN0ZWQuIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGUKKyAgICAgKiByZXF1ZXN0ZWQgbWV0aG9kIGV4aXN0cyBpbiB0aGUgcHJvcGVydHlNYXBNYXAgY2FjaGUuIElmIG5vdCwgaXQgY2FsbHMgYW5vdGhlcgorICAgICAqIHV0aWxpdHkgZnVuY3Rpb24gdG8gcmVxdWVzdCB0aGUgTWV0aG9kIGZyb20gdGhlIHRhcmdldENsYXNzIGRpcmVjdGx5LgorICAgICAqIEBwYXJhbSB0YXJnZXRDbGFzcyBUaGUgQ2xhc3Mgb24gd2hpY2ggdGhlIHJlcXVlc3RlZCBtZXRob2Qgc2hvdWxkIGV4aXN0LgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU1hcE1hcCBUaGUgY2FjaGUgb2Ygc2V0dGVycy9nZXR0ZXJzIGRlcml2ZWQgc28gZmFyLgorICAgICAqIEBwYXJhbSBwcmVmaXggInNldCIgb3IgImdldCIsIGZvciB0aGUgc2V0dGVyIG9yIGdldHRlci4KKyAgICAgKiBAcGFyYW0gdmFsdWVUeXBlIFRoZSB0eXBlIG9mIHBhcmFtZXRlciBwYXNzZWQgaW50byB0aGUgbWV0aG9kIChudWxsIGZvciBnZXR0ZXIpLgorICAgICAqIEByZXR1cm4gTWV0aG9kIHRoZSBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIG1Qcm9wZXJ0eU5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBNZXRob2Qgc2V0dXBTZXR0ZXJPckdldHRlcihDbGFzcyB0YXJnZXRDbGFzcywKKyAgICAgICAgICAgIEhhc2hNYXA8Q2xhc3MsIEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+PiBwcm9wZXJ0eU1hcE1hcCwKKyAgICAgICAgICAgIFN0cmluZyBwcmVmaXgsIENsYXNzIHZhbHVlVHlwZSkgeworICAgICAgICBNZXRob2Qgc2V0dGVyT3JHZXR0ZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSGF2ZSB0byBsb2NrIHByb3BlcnR5IG1hcCBwcmlvciB0byByZWFkaW5nIGl0LCB0byBndWFyZCBhZ2FpbnN0CisgICAgICAgICAgICAvLyBhbm90aGVyIHRocmVhZCBwdXR0aW5nIHNvbWV0aGluZyBpbiB0aGVyZSBhZnRlciB3ZSd2ZSBjaGVja2VkIGl0CisgICAgICAgICAgICAvLyBidXQgYmVmb3JlIHdlJ3ZlIGFkZGVkIGFuIGVudHJ5IHRvIGl0CisgICAgICAgICAgICAvLyBUT0RPOiBjYW4gd2Ugc3RvcmUgdGhlIHNldHRlci9nZXR0ZXIgcGVyIENsYXNzIGluc3RlYWQgb2YgcGVyIE9iamVjdD8KKyAgICAgICAgICAgIHByb3BlcnR5TWFwTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgTWV0aG9kPiBwcm9wZXJ0eU1hcCA9IHByb3BlcnR5TWFwTWFwLmdldCh0YXJnZXRDbGFzcyk7CisgICAgICAgICAgICBpZiAocHJvcGVydHlNYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldHRlck9yR2V0dGVyID0gcHJvcGVydHlNYXAuZ2V0KG1Qcm9wZXJ0eU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNldHRlck9yR2V0dGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXR0ZXJPckdldHRlciA9IGdldFByb3BlcnR5RnVuY3Rpb24odGFyZ2V0Q2xhc3MsIHByZWZpeCwgdmFsdWVUeXBlKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlNYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kPigpOworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU1hcE1hcC5wdXQodGFyZ2V0Q2xhc3MsIHByb3BlcnR5TWFwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KG1Qcm9wZXJ0eU5hbWUsIHNldHRlck9yR2V0dGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHByb3BlcnR5TWFwTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2V0dGVyT3JHZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBnZXQgdGhlIHNldHRlciBmcm9tIHRhcmdldENsYXNzCisgICAgICogQHBhcmFtIHRhcmdldENsYXNzIFRoZSBDbGFzcyBvbiB3aGljaCB0aGUgcmVxdWVzdGVkIG1ldGhvZCBzaG91bGQgZXhpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwU2V0dGVyKENsYXNzIHRhcmdldENsYXNzKSB7CisgICAgICAgIG1TZXR0ZXIgPSBzZXR1cFNldHRlck9yR2V0dGVyKHRhcmdldENsYXNzLCBzU2V0dGVyUHJvcGVydHlNYXAsICJzZXQiLCBtVmFsdWVUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdldCB0aGUgZ2V0dGVyIGZyb20gdGFyZ2V0Q2xhc3MKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0dXBHZXR0ZXIoQ2xhc3MgdGFyZ2V0Q2xhc3MpIHsKKyAgICAgICAgbUdldHRlciA9IHNldHVwU2V0dGVyT3JHZXR0ZXIodGFyZ2V0Q2xhc3MsIHNHZXR0ZXJQcm9wZXJ0eU1hcCwgImdldCIsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIGZ1bmN0aW9uIChjYWxsZWQgZnJvbSBQcm9wZXJ0eUFuaW1hdG9yKSB0byBzZXQgdXAgdGhlIHNldHRlciBhbmQgZ2V0dGVyCisgICAgICogcHJpb3IgdG8gcnVubmluZyB0aGUgYW5pbWF0aW9uLiBJZiB0aGUgc2V0dGVyIGhhcyBub3QgYmVlbiBtYW51YWxseSBzZXQgZm9yIHRoaXMKKyAgICAgKiBvYmplY3QsIGl0IHdpbGwgYmUgZGVyaXZlZCBhdXRvbWF0aWNhbGx5IGdpdmVuIHRoZSBwcm9wZXJ0eSBuYW1lLCB0YXJnZXQgb2JqZWN0LCBhbmQKKyAgICAgKiB0eXBlcyBvZiB2YWx1ZXMgc3VwcGxpZWQuIElmIG5vIGdldHRlciBoYXMgYmVlbiBzZXQsIGl0IHdpbGwgYmUgc3VwcGxpZWQgaWZmIGFueSBvZiB0aGUKKyAgICAgKiBzdXBwbGllZCB2YWx1ZXMgd2FzIG51bGwuIElmIHRoZXJlIGlzIGEgbnVsbCB2YWx1ZSwgdGhlbiB0aGUgZ2V0dGVyIChzdXBwbGllZCBvciBkZXJpdmVkKQorICAgICAqIHdpbGwgYmUgY2FsbGVkIHRvIHNldCB0aG9zZSBudWxsIHZhbHVlcyB0byB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgKiBvbiB0aGUgdGFyZ2V0IG9iamVjdC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIHNldHRlciAoYW5kIHBvc3NpYmx5IGdldHRlcikgZXhpc3QuCisgICAgICovCisgICAgdm9pZCBzZXR1cFNldHRlckFuZEdldHRlcihPYmplY3QgdGFyZ2V0KSB7CisgICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gdGFyZ2V0LmdldENsYXNzKCk7CisgICAgICAgIGlmIChtU2V0dGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHNldHVwU2V0dGVyKHRhcmdldENsYXNzKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEtleWZyYW1lIGtmIDogbUtleWZyYW1lU2V0Lm1LZXlmcmFtZXMpIHsKKyAgICAgICAgICAgIGlmIChrZi5nZXRWYWx1ZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobUdldHRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNldHVwR2V0dGVyKHRhcmdldENsYXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAga2Yuc2V0VmFsdWUoKFQpIG1HZXR0ZXIuaW52b2tlKHRhcmdldCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZSgiUHJvcGVydHlWYWx1ZXNIb2xkZXIiLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZSgiUHJvcGVydHlWYWx1ZXNIb2xkZXIiLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIGZ1bmN0aW9uIHRvIHNldCB0aGUgdmFsdWUgb24gdGhlIHRhcmdldCBvYmplY3QsIHVzaW5nIHRoZSBzZXR0ZXIgc2V0IHVwCisgICAgICogZWFybGllciBvbiB0aGlzIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdC4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgUHJvcGVydHlBbmltYXRvcgorICAgICAqIHRvIGhhbmRsZSB0dXJuaW5nIHRoZSB2YWx1ZSBjYWxjdWxhdGVkIGJ5IEFuaW1hdG9yIGludG8gYSB2YWx1ZSBzZXQgb24gdGhlIG9iamVjdAorICAgICAqIGFjY29yZGluZyB0byB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgdmFsdWUgaXMgc2V0CisgICAgICovCisgICAgdm9pZCBzZXRBbmltYXRlZFZhbHVlKE9iamVjdCB0YXJnZXQpIHsKKyAgICAgICAgaWYgKG1TZXR0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtVG1wVmFsdWVBcnJheVswXSA9IG1BbmltYXRlZFZhbHVlOworICAgICAgICAgICAgICAgIG1TZXR0ZXIuaW52b2tlKHRhcmdldCwgbVRtcFZhbHVlQXJyYXkpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKCJQcm9wZXJ0eVZhbHVlc0hvbGRlciIsIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiwgY2FsbGVkIGJ5IEFuaW1hdG9yLCB0byBzZXQgdXAgdGhlIFR5cGVFdmFsdWF0b3IgdGhhdCB3aWxsIGJlIHVzZWQKKyAgICAgKiB0byBjYWxjdWxhdGUgYW5pbWF0ZWQgdmFsdWVzLgorICAgICAqLworICAgIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgaWYgKG1FdmFsdWF0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgbUV2YWx1YXRvciA9IChtVmFsdWVUeXBlID09IGludC5jbGFzcykgPyBzSW50RXZhbHVhdG9yIDoKKyAgICAgICAgICAgICAgICAobVZhbHVlVHlwZSA9PSBkb3VibGUuY2xhc3MpID8gc0RvdWJsZUV2YWx1YXRvciA6IHNGbG9hdEV2YWx1YXRvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBUeXBlRXZhbHVhdG9yIHdpbGwgdGhlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCBiYXNlZCBvbiB0aGUgdHlwZSBvZiB2YWx1ZXMKKyAgICAgKiBzdXBwbGllZCB0byBQcm9wZXJ0eVZhbHVlc0hvbGRlci4gVGhlIGV2YWx1YXRvciBjYW4gYmUgbWFudWFsbHkgc2V0LCBob3dldmVyLCBpZiBzbworICAgICAqIGRlc2lyZWQuIFRoaXMgbWF5IGJlIGltcG9ydGFudCBpbiBjYXNlcyB3aGVyZSBlaXRoZXIgdGhlIHR5cGUgb2YgdGhlIHZhbHVlcyBzdXBwbGllZAorICAgICAqIGRvIG5vdCBtYXRjaCB0aGUgd2F5IHRoYXQgdGhleSBzaG91bGQgYmUgaW50ZXJwb2xhdGVkIGJldHdlZW4sIG9yIGlmIHRoZSB2YWx1ZXMKKyAgICAgKiBhcmUgb2YgYSBjdXN0b20gdHlwZSBvciBvbmUgbm90IGN1cnJlbnRseSB1bmRlcnN0b29kIGJ5IHRoZSBhbmltYXRpb24gc3lzdGVtLiBDdXJyZW50bHksCisgICAgICogb25seSB2YWx1ZXMgb2YgdHlwZSBmbG9hdCwgZG91YmxlLCBhbmQgaW50IChhbmQgdGhlaXIgT2JqZWN0IGVxdWl2YWxlbnRzLCBGbG9hdCwgRG91YmxlLAorICAgICAqIGFuZCBJbnRlZ2VyKSBhcmUgIGNvcnJlY3RseSBpbnRlcnBvbGF0ZWQ7IGFsbCBvdGhlciB0eXBlcyByZXF1aXJlIHNldHRpbmcgYSBUeXBlRXZhbHVhdG9yLgorICAgICAqIEBwYXJhbSBldmFsdWF0b3IKKyAgICAgKi8KKwlwdWJsaWMgdm9pZCBzZXRFdmFsdWF0b3IoVHlwZUV2YWx1YXRvciBldmFsdWF0b3IpIHsKKyAgICAgICAgbUV2YWx1YXRvciA9IGV2YWx1YXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdW5jdGlvbiB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBldmFsdWF0b3Igc2V0IHVwIGZvcgorICAgICAqIHRoaXMgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0LiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBBbmltYXRvci5hbmltYXRlVmFsdWUoKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgZWxhcHNlZCwgaW50ZXJwb2xhdGVkIGZyYWN0aW9uIG9mIHRoZSBhbmltYXRpb24uCisgICAgICogQHJldHVybiBUaGUgY2FsY3VsYXRlZCB2YWx1ZSBhdCB0aGlzIHBvaW50IGluIHRoZSBhbmltYXRpb24uCisgICAgICovCisgICAgT2JqZWN0IGNhbGN1bGF0ZVZhbHVlKGZsb2F0IGZyYWN0aW9uKSB7CisgICAgICAgIG1BbmltYXRlZFZhbHVlID0gbUtleWZyYW1lU2V0LmdldFZhbHVlKGZyYWN0aW9uLCBtRXZhbHVhdG9yKTsKKyAgICAgICAgcmV0dXJuIG1BbmltYXRlZFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIDxjb2RlPk1ldGhvZDwvY29kZT4gdGhhdCBpcyBjYWxsZWQgd2l0aCB0aGUgYW5pbWF0ZWQgdmFsdWVzIGNhbGN1bGF0ZWQKKyAgICAgKiBkdXJpbmcgdGhlIGFuaW1hdGlvbi4gU2V0dGluZyB0aGUgc2V0dGVyIG1ldGhvZCBpcyBhbiBhbHRlcm5hdGl2ZSB0byBzdXBwbHlpbmcgYQorICAgICAqIHtAbGluayAjc2V0UHJvcGVydHlOYW1lKFN0cmluZykgcHJvcGVydHlOYW1lfSBmcm9tIHdoaWNoIHRoZSBtZXRob2QgaXMgZGVyaXZlZC4gVGhpcworICAgICAqIGFwcHJvYWNoIGlzIG1vcmUgZGlyZWN0LCBhbmQgaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiBhIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHRoYXQgZG9lcworICAgICAqIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBjb252ZW50aW9uIG9mIDxjb2RlPnNldE5hbWUoKTwvY29kZT4uIEZvciBleGFtcGxlLCBpZiBhIGZ1bmN0aW9uCisgICAgICogY2FsbGVkIDxjb2RlPm9mZnNldCgpPC9jb2RlPiBpcyB0byBiZSBjYWxsZWQgd2l0aCB0aGUgYW5pbWF0ZWQgdmFsdWVzLCB0aGVyZSBpcyBubyB3YXkKKyAgICAgKiB0byB0ZWxsIDxjb2RlPlByb3BlcnR5QW5pbWF0b3I8L2NvZGU+IGhvdyB0byBjYWxsIHRoYXQgZnVuY3Rpb24gc2ltcGx5IHRocm91Z2ggYSBwcm9wZXJ0eQorICAgICAqIG5hbWUsIHNvIGEgc2V0dGVyIG1ldGhvZCBzaG91bGQgYmUgc3VwcGxpZWQgaW5zdGVhZC4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGUgc2V0dGVyIGZ1bmN0aW9uIG11c3QgdGFrZSB0aGUgc2FtZSBwYXJhbWV0ZXIgdHlwZSBhcyB0aGUKKyAgICAgKiA8Y29kZT52YWx1ZUZyb208L2NvZGU+IGFuZCA8Y29kZT52YWx1ZVRvPC9jb2RlPiBwcm9wZXJ0aWVzLCBvdGhlcndpc2UgdGhlIGNhbGwgdG8KKyAgICAgKiB0aGUgc2V0dGVyIGZ1bmN0aW9uIHdpbGwgZmFpbC48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2V0dGVyIFRoZSBzZXR0ZXIgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBhbmltYXRlZCB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2V0dGVyKE1ldGhvZCBzZXR0ZXIpIHsKKyAgICAgICAgbVNldHRlciA9IHNldHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSA8Y29kZT5NZXRob2Q8L2NvZGU+IHRoYXQgaXMgY2FsbGVkIHdpdGggdGhlIGFuaW1hdGVkIHZhbHVlcyBjYWxjdWxhdGVkCisgICAgICogZHVyaW5nIHRoZSBhbmltYXRpb24uCisgICAgICovCisgICAgcHVibGljIE1ldGhvZCBnZXRTZXR0ZXIoKSB7CisgICAgICAgIHJldHVybiBtU2V0dGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIDxjb2RlPk1ldGhvZDwvY29kZT4gdGhhdCBpcyBjYWxsZWQgdG8gZ2V0IHVuc3VwcGxpZWQgPGNvZGU+dmFsdWVGcm9tPC9jb2RlPiBvcgorICAgICAqIDxjb2RlPnZhbHVlVG88L2NvZGU+IHByb3BlcnRpZXMuIFNldHRpbmcgdGhlIGdldHRlciBtZXRob2QgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gc3VwcGx5aW5nIGEKKyAgICAgKiB7QGxpbmsgI3NldFByb3BlcnR5TmFtZShTdHJpbmcpIHByb3BlcnR5TmFtZX0gZnJvbSB3aGljaCB0aGUgbWV0aG9kIGlzIGRlcml2ZWQuIFRoaXMKKyAgICAgKiBhcHByb2FjaCBpcyBtb3JlIGRpcmVjdCwgYW5kIGlzIGVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gYSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB0aGF0IGRvZXMKKyAgICAgKiBub3QgY29ycmVzcG9uZCB0byB0aGUgY29udmVudGlvbiBvZiA8Y29kZT5zZXROYW1lKCk8L2NvZGU+LiBGb3IgZXhhbXBsZSwgaWYgYSBmdW5jdGlvbgorICAgICAqIGNhbGxlZCA8Y29kZT5vZmZzZXQoKTwvY29kZT4gaXMgdG8gYmUgY2FsbGVkIHRvIGdldCBhbiBpbml0aWFsIHZhbHVlLCB0aGVyZSBpcyBubyB3YXkKKyAgICAgKiB0byB0ZWxsIDxjb2RlPlByb3BlcnR5QW5pbWF0b3I8L2NvZGU+IGhvdyB0byBjYWxsIHRoYXQgZnVuY3Rpb24gc2ltcGx5IHRocm91Z2ggYSBwcm9wZXJ0eQorICAgICAqIG5hbWUsIHNvIGEgZ2V0dGVyIG1ldGhvZCBzaG91bGQgYmUgc3VwcGxpZWQgaW5zdGVhZC4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGUgZ2V0dGVyIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCB3aGV0aGVyIHN1cHBsaWVkIGhlcmUgb3IgZGVyaXZlZAorICAgICAqIGZyb20gdGhlIHByb3BlcnR5IG5hbWUsIGlmIG9uZSBvZiA8Y29kZT52YWx1ZUZyb208L2NvZGU+IG9yIDxjb2RlPnZhbHVlVG88L2NvZGU+IGFyZQorICAgICAqIG51bGwuIElmIGJvdGggb2YgdGhvc2UgdmFsdWVzIGFyZSBub24tbnVsbCwgdGhlbiB0aGVyZSBpcyBubyBuZWVkIHRvIGdldCBvbmUgb2YgdGhlCisgICAgICogdmFsdWVzIGFuZCB0aGUgZ2V0dGVyIGlzIG5vdCBjYWxsZWQuCisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIGdldHRlciBmdW5jdGlvbiBtdXN0IHJldHVybiB0aGUgc2FtZSBwYXJhbWV0ZXIgdHlwZSBhcyB0aGUKKyAgICAgKiA8Y29kZT52YWx1ZUZyb208L2NvZGU+IGFuZCA8Y29kZT52YWx1ZVRvPC9jb2RlPiBwcm9wZXJ0aWVzICh3aGljaGV2ZXIgb2YgdGhlbSBhcmUKKyAgICAgKiBub24tbnVsbCksIG90aGVyd2lzZSB0aGUgY2FsbCB0byB0aGUgZ2V0dGVyIGZ1bmN0aW9uIHdpbGwgZmFpbC48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZ2V0dGVyIFRoZSBnZXR0ZXIgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB0byBnZXQgaW5pdGlhbCBhbmltYXRpb24gdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEdldHRlcihNZXRob2QgZ2V0dGVyKSB7CisgICAgICAgIG1HZXR0ZXIgPSBnZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgPGNvZGU+TWV0aG9kPC9jb2RlPiB0aGF0IGlzIGNhbGxlZCB0byBnZXQgdW5zdXBwbGllZCA8Y29kZT52YWx1ZUZyb208L2NvZGU+IG9yCisgICAgICogPGNvZGU+dmFsdWVUbzwvY29kZT4gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kIGdldEdldHRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1HZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBUaGlzIG5hbWUgaXMgdXNlZCB0byBkZXJpdmUKKyAgICAgKiBhIHNldHRlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHRvIHNldCBhbmltYXRlZCB2YWx1ZXMuCisgICAgICogRm9yIGV4YW1wbGUsIGEgcHJvcGVydHkgbmFtZSBvZiA8Y29kZT5mb288L2NvZGU+IHdpbGwgcmVzdWx0CisgICAgICogaW4gYSBjYWxsIHRvIHRoZSBmdW5jdGlvbiA8Y29kZT5zZXRGb28oKTwvY29kZT4gb24gdGhlIHRhcmdldCBvYmplY3QuIElmIGVpdGhlcgorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gb3IgPGNvZGU+dmFsdWVUbzwvY29kZT4gaXMgbnVsbCwgdGhlbiBhIGdldHRlciBmdW5jdGlvbiB3aWxsCisgICAgICogYWxzbyBiZSBkZXJpdmVkIGFuZCBjYWxsZWQuCisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIHNldHRlciBmdW5jdGlvbiBkZXJpdmVkIGZyb20gdGhpcyBwcm9wZXJ0eSBuYW1lCisgICAgICogbXVzdCB0YWtlIHRoZSBzYW1lIHBhcmFtZXRlciB0eXBlIGFzIHRoZQorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gYW5kIDxjb2RlPnZhbHVlVG88L2NvZGU+IHByb3BlcnRpZXMsIG90aGVyd2lzZSB0aGUgY2FsbCB0bworICAgICAqIHRoZSBzZXR0ZXIgZnVuY3Rpb24gd2lsbCBmYWlsLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgICAgIG1Qcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBUaGlzIG5hbWUgd2lsbCBiZSB1c2VkIHRvIGRlcml2ZQorICAgICAqIGEgc2V0dGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgdG8gc2V0IGFuaW1hdGVkIHZhbHVlcy4KKyAgICAgKiBGb3IgZXhhbXBsZSwgYSBwcm9wZXJ0eSBuYW1lIG9mIDxjb2RlPmZvbzwvY29kZT4gd2lsbCByZXN1bHQKKyAgICAgKiBpbiBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIDxjb2RlPnNldEZvbygpPC9jb2RlPiBvbiB0aGUgdGFyZ2V0IG9iamVjdC4gSWYgZWl0aGVyCisgICAgICogPGNvZGU+dmFsdWVGcm9tPC9jb2RlPiBvciA8Y29kZT52YWx1ZVRvPC9jb2RlPiBpcyBudWxsLCB0aGVuIGEgZ2V0dGVyIGZ1bmN0aW9uIHdpbGwKKyAgICAgKiBhbHNvIGJlIGRlcml2ZWQgYW5kIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgZnVuY3Rpb24sIGNhbGxlZCBieSBBbmltYXRvciBhbmQgUHJvcGVydHlBbmltYXRvciwgdG8gcmV0cmlldmUgdGhlIHZhbHVlCisgICAgICogbW9zdCByZWNlbnRseSBjYWxjdWxhdGVkIGluIGNhbGN1bGF0ZVZhbHVlKCkuCisgICAgICogQHJldHVybgorICAgICAqLworICAgIE9iamVjdCBnZXRBbmltYXRlZFZhbHVlKCkgeworICAgICAgICByZXR1cm4gbUFuaW1hdGVkVmFsdWU7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9SR0JFdmFsdWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9SR0JFdmFsdWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWUwYWYwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1JHQkV2YWx1YXRvci5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCisvKioKKyAqIFRoaXMgZXZhbHVhdG9yIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gdHlwZSBpbnRlcnBvbGF0aW9uIGJldHdlZW4gaW50ZWdlcgorICogdmFsdWVzIHRoYXQgcmVwcmVzZW50IEFSR0IgY29sb3JzLgorICovCitwdWJsaWMgY2xhc3MgUkdCRXZhbHVhdG9yIGltcGxlbWVudHMgVHlwZUV2YWx1YXRvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgaW4tYmV0d2VlbiB2YWx1ZSBmb3IgYSBjb2xvcgorICAgICAqIGdpdmVuIGludGVnZXJzIHRoYXQgcmVwcmVzZW50IHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcyBpbiB0aGUgZm91cgorICAgICAqIGJ5dGVzIG9mIHRoZSAzMi1iaXQgaW50LiBFYWNoIGNoYW5uZWwgaXMgc2VwYXJhdGVseSBsaW5lYXJseSBpbnRlcnBvbGF0ZWQKKyAgICAgKiBhbmQgdGhlIHJlc3VsdGluZyBjYWxjdWxhdGVkIHZhbHVlcyBhcmUgcmVjb21iaW5lZCBpbnRvIHRoZSByZXR1cm4gdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIGZyYWN0aW9uIGZyb20gdGhlIHN0YXJ0aW5nIHRvIHRoZSBlbmRpbmcgdmFsdWVzCisgICAgICogQHBhcmFtIHN0YXJ0VmFsdWUgQSAzMi1iaXQgaW50IHZhbHVlIHJlcHJlc2VudGluZyBjb2xvcnMgaW4gdGhlCisgICAgICogc2VwYXJhdGUgYnl0ZXMgb2YgdGhlIHBhcmFtZXRlcgorICAgICAqIEBwYXJhbSBlbmRWYWx1ZSBBIDMyLWJpdCBpbnQgdmFsdWUgcmVwcmVzZW50aW5nIGNvbG9ycyBpbiB0aGUKKyAgICAgKiBzZXBhcmF0ZSBieXRlcyBvZiB0aGUgcGFyYW1ldGVyCisgICAgICogQHJldHVybiBBIHZhbHVlIHRoYXQgaXMgY2FsY3VsYXRlZCB0byBiZSB0aGUgbGluZWFybHkgaW50ZXJwb2xhdGVkCisgICAgICogcmVzdWx0LCBkZXJpdmVkIGJ5IHNlcGFyYXRpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzIGludG8gc2VwYXJhdGUKKyAgICAgKiBjb2xvciBjaGFubmVscyBhbmQgaW50ZXJwb2xhdGluZyBlYWNoIG9uZSBzZXBhcmF0ZWx5LCByZWNvbWJpbmluZyB0aGUKKyAgICAgKiByZXN1bHRpbmcgdmFsdWVzIGluIHRoZSBzYW1lIHdheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKGZsb2F0IGZyYWN0aW9uLCBPYmplY3Qgc3RhcnRWYWx1ZSwgT2JqZWN0IGVuZFZhbHVlKSB7CisgICAgICAgIGludCBzdGFydEludCA9IChJbnRlZ2VyKSBzdGFydFZhbHVlOworICAgICAgICBpbnQgc3RhcnRBID0gKHN0YXJ0SW50ID4+IDI0KTsKKyAgICAgICAgaW50IHN0YXJ0UiA9IChzdGFydEludCA+PiAxNikgJiAweGZmOworICAgICAgICBpbnQgc3RhcnRHID0gKHN0YXJ0SW50ID4+IDgpICYgMHhmZjsKKyAgICAgICAgaW50IHN0YXJ0QiA9IHN0YXJ0SW50ICYgMHhmZjsKKworICAgICAgICBpbnQgZW5kSW50ID0gKEludGVnZXIpIGVuZFZhbHVlOworICAgICAgICBpbnQgZW5kQSA9IChlbmRJbnQgPj4gMjQpOworICAgICAgICBpbnQgZW5kUiA9IChlbmRJbnQgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgaW50IGVuZEcgPSAoZW5kSW50ID4+IDgpICYgMHhmZjsKKyAgICAgICAgaW50IGVuZEIgPSBlbmRJbnQgJiAweGZmOworCisgICAgICAgIHJldHVybiAoaW50KSgoc3RhcnRBICsgKGludCkoZnJhY3Rpb24gKiAoZW5kQSAtIHN0YXJ0QSkpKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgIChpbnQpKChzdGFydFIgKyAoaW50KShmcmFjdGlvbiAqIChlbmRSIC0gc3RhcnRSKSkpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgKGludCkoKHN0YXJ0RyArIChpbnQpKGZyYWN0aW9uICogKGVuZEcgLSBzdGFydEcpKSkgPDwgOCkgfAorICAgICAgICAgICAgICAgIChpbnQpKChzdGFydEIgKyAoaW50KShmcmFjdGlvbiAqIChlbmRCIC0gc3RhcnRCKSkpKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1NlcXVlbmNlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1NlcXVlbmNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NzliM2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vU2VxdWVuY2VyLmphdmEKQEAgLTAsMCArMSw4NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogVGhpcyBjbGFzcyBwbGF5cyBhIHNldCBvZiB7QGxpbmsgQW5pbWF0YWJsZX0gb2JqZWN0cyBpbiB0aGUgc3BlY2lmaWVkIG9yZGVyLiBBbmltYXRpb25zCisgKiBjYW4gYmUgc2V0IHVwIHRvIHBsYXkgdG9nZXRoZXIsIGluIHNlcXVlbmNlLCBvciBhZnRlciBhIHNwZWNpZmllZCBkZWxheS4KKyAqCisgKiA8cD5UaGVyZSBhcmUgdHdvIGRpZmZlcmVudCBhcHByb2FjaGVzIHRvIGFkZGluZyBhbmltYXRpb25zIHRvIGEgPGNvZGU+U2VxdWVuY2VyPC9jb2RlPjoKKyAqIGVpdGhlciB0aGUge0BsaW5rIFNlcXVlbmNlciNwbGF5VG9nZXRoZXIoQW5pbWF0YWJsZVtdKSBwbGF5VG9nZXRoZXIoKX0gb3IKKyAqIHtAbGluayBTZXF1ZW5jZXIjcGxheVNlcXVlbnRpYWxseShBbmltYXRhYmxlW10pIHBsYXlTZXF1ZW50aWFsbHkoKX0gbWV0aG9kcyBjYW4gYmUgY2FsbGVkIHRvIGFkZAorICogYSBzZXQgb2YgYW5pbWF0aW9ucyBhbGwgYXQgb25jZSwgb3IgdGhlIHtAbGluayBTZXF1ZW5jZXIjcGxheShBbmltYXRhYmxlKX0gY2FuIGJlCisgKiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggbWV0aG9kcyBpbiB0aGUge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLlNlcXVlbmNlci5CdWlsZGVyIEJ1aWxkZXJ9CisgKiBjbGFzcyB0byBhZGQgYW5pbWF0aW9ucworICogb25lIGJ5IG9uZS48L3A+CisgKgorICogPHA+SXQgaXMgcG9zc2libGUgdG8gc2V0IHVwIGEgPGNvZGU+U2VxdWVuY2VyPC9jb2RlPiB3aXRoIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBiZXR3ZWVuCisgKiBpdHMgYW5pbWF0aW9ucy4gRm9yIGV4YW1wbGUsIGFuIGFuaW1hdGlvbiBhMSBjb3VsZCBiZSBzZXQgdXAgdG8gc3RhcnQgYmVmb3JlIGFuaW1hdGlvbiBhMiwgYTIKKyAqIGJlZm9yZSBhMywgYW5kIGEzIGJlZm9yZSBhMS4gVGhlIHJlc3VsdHMgb2YgdGhpcyBjb25maWd1cmF0aW9uIGFyZSB1bmRlZmluZWQsIGJ1dCB3aWxsIHR5cGljYWxseQorICogcmVzdWx0IGluIG5vbmUgb2YgdGhlIGFmZmVjdGVkIGFuaW1hdGlvbnMgYmVpbmcgcGxheWVkLiBCZWNhdXNlIG9mIHRoaXMgKGFuZCBiZWNhdXNlCisgKiBjaXJjdWxhciBkZXBlbmRlbmNpZXMgZG8gbm90IG1ha2UgbG9naWNhbCBzZW5zZSBhbnl3YXkpLCBjaXJjdWxhciBkZXBlbmRlbmNpZXMKKyAqIHNob3VsZCBiZSBhdm9pZGVkLCBhbmQgdGhlIGRlcGVuZGVuY3kgZmxvdyBvZiBhbmltYXRpb25zIHNob3VsZCBvbmx5IGJlIGluIG9uZSBkaXJlY3Rpb24uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXF1ZW5jZXIgZXh0ZW5kcyBBbmltYXRhYmxlIHsKKworICAgIC8qKgorICAgICAqIEludGVybmFsIHZhcmlhYmxlcworICAgICAqIE5PVEU6IFRoaXMgb2JqZWN0IGltcGxlbWVudHMgdGhlIGNsb25lKCkgbWV0aG9kLCBtYWtpbmcgYSBkZWVwIGNvcHkgb2YgYW55IHJlZmVyZW5jZWQKKyAgICAgKiBvYmplY3RzLiBBcyBvdGhlciBub24tdHJpdmlhbCBmaWVsZHMgYXJlIGFkZGVkIHRvIHRoaXMgY2xhc3MsIG1ha2Ugc3VyZSB0byBhZGQgbG9naWMKKyAgICAgKiB0byBjbG9uZSgpIHRvIG1ha2UgZGVlcCBjb3BpZXMgb2YgdGhlbS4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIFRyYWNrcyBhbmltYXRpb25zIGN1cnJlbnRseSBiZWluZyBwbGF5ZWQsIHNvIHRoYXQgd2Uga25vdyB3aGF0IHRvCisgICAgICogY2FuY2VsIG9yIGVuZCB3aGVuIGNhbmNlbCgpIG9yIGVuZCgpIGlzIGNhbGxlZCBvbiB0aGlzIFNlcXVlbmNlcgorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PEFuaW1hdGFibGU+IG1QbGF5aW5nU2V0ID0gbmV3IEFycmF5TGlzdDxBbmltYXRhYmxlPigpOworCisgICAgLyoqCisgICAgICogQ29udGFpbnMgYWxsIG5vZGVzLCBtYXBwZWQgdG8gdGhlaXIgcmVzcGVjdGl2ZSBBbmltYXRhYmxlcy4gV2hlbiBuZXcKKyAgICAgKiBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGlzIGFkZGVkIGZvciBhbiBBbmltYXRhYmxlLCB3ZSB3YW50IHRvIGFkZCBpdAorICAgICAqIHRvIGEgc2luZ2xlIG5vZGUgcmVwcmVzZW50aW5nIHRoYXQgQW5pbWF0YWJsZSwgbm90IGNyZWF0ZSBhIG5ldyBOb2RlCisgICAgICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcDxBbmltYXRhYmxlLCBOb2RlPiBtTm9kZU1hcCA9IG5ldyBIYXNoTWFwPEFuaW1hdGFibGUsIE5vZGU+KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgb2YgYWxsIG5vZGVzIGNyZWF0ZWQgZm9yIHRoaXMgU2VxdWVuY2VyLiBUaGlzIGxpc3QgaXMgdXNlZCB1cG9uCisgICAgICogc3RhcnRpbmcgdGhlIHNlcXVlbmNlciwgYW5kIHRoZSBub2RlcyBhcmUgcGxhY2VkIGluIHNvcnRlZCBvcmRlciBpbnRvIHRoZQorICAgICAqIHNvcnRlZE5vZGVzIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8Tm9kZT4gbU5vZGVzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworCisgICAgLyoqCisgICAgICogVGhlIHNvcnRlZCBsaXN0IG9mIG5vZGVzLiBUaGlzIGlzIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgYW5pbWF0aW9ucyB3aWxsCisgICAgICogYmUgcGxheWVkLiBUaGUgZGV0YWlscyBhYm91dCB3aGVuIGV4YWN0bHkgdGhleSB3aWxsIGJlIHBsYXllZCBkZXBlbmQKKyAgICAgKiBvbiB0aGUgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXBzIG9mIHRoZSBub2Rlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxOb2RlPiBtU29ydGVkTm9kZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgbm9kZXMgc2hvdWxkIGJlIHNvcnRlZCBwcmlvciB0byBwbGF5aW5nLiBUaGlzCisgICAgICogZmxhZyBhbGxvd3MgdXMgdG8gY2FjaGUgdGhlIHByZXZpb3VzIHNvcnRlZCBub2RlcyBzbyB0aGF0IGlmIHRoZSBzZXF1ZW5jZQorICAgICAqIGlzIHJlcGxheWVkIHdpdGggbm8gY2hhbmdlcywgaXQgZG9lcyBub3QgaGF2ZSB0byByZS1zb3J0IHRoZSBub2RlcyBhZ2Fpbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRzU29ydCA9IHRydWU7CisKKyAgICBwcml2YXRlIFNlcXVlbmNlckFuaW1hdGFibGVMaXN0ZW5lciBtU2VxdWVuY2VMaXN0ZW5lciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgU2VxdWVuY2VyIGhhcyBiZWVuIGNhbmNlbGVkIChieSBjYWxsaW5nIGNhbmNlbCgpIG9yIGVuZCgpKS4KKyAgICAgKiBUaGlzIGZsYWcgaXMgdXNlZCB0byBhdm9pZCBzdGFydGluZyBvdGhlciBhbmltYXRpb25zIHdoZW4gY3VycmVudGx5LXBsYXlpbmcKKyAgICAgKiBjaGlsZCBhbmltYXRpb25zIG9mIHRoaXMgU2VxdWVuY2VyIGVuZC4KKyAgICAgKi8KKyAgICBib29sZWFuIG1DYW5jZWxlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGlzIFNlcXVlbmNlciB0byBwbGF5IGFsbCBvZiB0aGUgc3VwcGxpZWQgYW5pbWF0aW9ucyBhdCB0aGUgc2FtZSB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcXVlbmNlSXRlbXMgVGhlIGFuaW1hdGlvbnMgdGhhdCB3aWxsIGJlIHN0YXJ0ZWQgc2ltdWx0YW5lb3VzbHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGxheVRvZ2V0aGVyKEFuaW1hdGFibGUuLi4gc2VxdWVuY2VJdGVtcykgeworICAgICAgICBpZiAoc2VxdWVuY2VJdGVtcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtTmVlZHNTb3J0ID0gdHJ1ZTsKKyAgICAgICAgICAgIEJ1aWxkZXIgYnVpbGRlciA9IHBsYXkoc2VxdWVuY2VJdGVtc1swXSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNlcXVlbmNlSXRlbXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLndpdGgoc2VxdWVuY2VJdGVtc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoaXMgU2VxdWVuY2VyIHRvIHBsYXkgZWFjaCBvZiB0aGUgc3VwcGxpZWQgYW5pbWF0aW9ucyB3aGVuIHRoZQorICAgICAqIHByZXZpb3VzIGFuaW1hdGlvbiBlbmRzLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcXVlbmNlSXRlbXMgVGhlIGFuaWFtdGlvbnMgdGhhdCB3aWxsIGJlIHN0YXJ0ZWQgb25lIGFmdGVyIGFub3RoZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGxheVNlcXVlbnRpYWxseShBbmltYXRhYmxlLi4uIHNlcXVlbmNlSXRlbXMpIHsKKyAgICAgICAgaWYgKHNlcXVlbmNlSXRlbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbU5lZWRzU29ydCA9IHRydWU7CisgICAgICAgICAgICBpZiAoc2VxdWVuY2VJdGVtcy5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgICAgIHBsYXkoc2VxdWVuY2VJdGVtc1swXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VxdWVuY2VJdGVtcy5sZW5ndGggLSAxOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgcGxheShzZXF1ZW5jZUl0ZW1zW2ldKS5iZWZvcmUoc2VxdWVuY2VJdGVtc1tpKzFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxpc3Qgb2YgY2hpbGQgQW5pbWF0YWJsZSBvYmplY3RzIGNvbnRyb2xsZWQgYnkgdGhpcworICAgICAqIFNlcXVlbmNlci4gVGhpcyBpcyBhIGNvcHkgb2YgdGhlIGludGVybmFsIGxpc3Q7IG1vZGlmaWNhdGlvbnMgdG8gdGhlIHJldHVybmVkIGxpc3QKKyAgICAgKiB3aWxsIG5vdCBhZmZlY3QgdGhlIFNlcXVlbmNlciwgYWx0aG91Z2ggY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBBbmltYXRhYmxlIG9iamVjdHMKKyAgICAgKiB3aWxsIGFmZmVjdCB0aG9zZSBvYmplY3RzIGJlaW5nIG1hbmFnZWQgYnkgdGhlIFNlcXVlbmNlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQXJyYXlMaXN0PEFuaW1hdGFibGU+IFRoZSBsaXN0IG9mIGNoaWxkIGFuaW1hdGlvbnMgb2YgdGhpcyBTZXF1ZW5jZXIuCisgICAgICovCisgICAgcHVibGljIEFycmF5TGlzdDxBbmltYXRhYmxlPiBnZXRDaGlsZEFuaW1hdGlvbnMoKSB7CisgICAgICAgIEFycmF5TGlzdDxBbmltYXRhYmxlPiBjaGlsZExpc3QgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdGFibGU+KCk7CisgICAgICAgIGZvciAoTm9kZSBub2RlIDogbU5vZGVzKSB7CisgICAgICAgICAgICBjaGlsZExpc3QuYWRkKG5vZGUuYW5pbWF0aW9uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hpbGRMaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRhcmdldCBvYmplY3QgZm9yIGFsbCBjdXJyZW50IHtAbGluayAjZ2V0Q2hpbGRBbmltYXRpb25zKCkgY2hpbGQgYW5pbWF0aW9uc30KKyAgICAgKiBvZiB0aGlzIFNlcXVlbmNlciB0aGF0IHRha2UgdGFyZ2V0cyAoe0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5QW5pbWF0b3J9IGFuZAorICAgICAqIFNlcXVlbmNlcikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3QgYmVpbmcgYW5pbWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoT2JqZWN0IHRhcmdldCkgeworICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Ob2RlcykgeworICAgICAgICAgICAgQW5pbWF0YWJsZSBhbmltYXRpb24gPSBub2RlLmFuaW1hdGlvbjsKKyAgICAgICAgICAgIGlmIChhbmltYXRpb24gaW5zdGFuY2VvZiBTZXF1ZW5jZXIpIHsKKyAgICAgICAgICAgICAgICAoKFNlcXVlbmNlcilhbmltYXRpb24pLnNldFRhcmdldCh0YXJnZXQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhbmltYXRpb24gaW5zdGFuY2VvZiBQcm9wZXJ0eUFuaW1hdG9yKSB7CisgICAgICAgICAgICAgICAgKChQcm9wZXJ0eUFuaW1hdG9yKWFuaW1hdGlvbikuc2V0VGFyZ2V0KHRhcmdldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgPGNvZGU+QnVpbGRlcjwvY29kZT4gb2JqZWN0LCB3aGljaCBpcyB1c2VkIHRvCisgICAgICogc2V0IHVwIHBsYXlpbmcgY29uc3RyYWludHMuIFRoaXMgaW5pdGlhbCA8Y29kZT5wbGF5KCk8L2NvZGU+IG1ldGhvZAorICAgICAqIHRlbGxzIHRoZSA8Y29kZT5CdWlsZGVyPC9jb2RlPiB0aGUgYW5pbWF0aW9uIHRoYXQgaXMgdGhlIGRlcGVuZGVuY3kgZm9yCisgICAgICogdGhlIHN1Y2NlZWRpbmcgY29tbWFuZHMgdG8gdGhlIDxjb2RlPkJ1aWxkZXI8L2NvZGU+LiBGb3IgZXhhbXBsZSwKKyAgICAgKiBjYWxsaW5nIDxjb2RlPnBsYXkoYTEpLndpdGgoYTIpPC9jb2RlPiBzZXRzIHVwIHRoZSBTZXF1ZW5jZSB0byBwbGF5CisgICAgICogPGNvZGU+YTE8L2NvZGU+IGFuZCA8Y29kZT5hMjwvY29kZT4gYXQgdGhlIHNhbWUgdGltZSwKKyAgICAgKiA8Y29kZT5wbGF5KGExKS5iZWZvcmUoYTIpPC9jb2RlPiBzZXRzIHVwIHRoZSBTZXF1ZW5jZSB0byBwbGF5CisgICAgICogPGNvZGU+YTE8L2NvZGU+IGZpcnN0LCBmb2xsb3dlZCBieSA8Y29kZT5hMjwvY29kZT4sIGFuZAorICAgICAqIDxjb2RlPnBsYXkoYTEpLmFmdGVyKGEyKTwvY29kZT4gc2V0cyB1cCB0aGUgU2VxdWVuY2UgdG8gcGxheQorICAgICAqIDxjb2RlPmEyPC9jb2RlPiBmaXJzdCwgZm9sbG93ZWQgYnkgPGNvZGU+YTE8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IDxjb2RlPnBsYXkoKTwvY29kZT4gaXMgdGhlIG9ubHkgd2F5IHRvIHRlbGwgdGhlCisgICAgICogPGNvZGU+QnVpbGRlcjwvY29kZT4gdGhlIGFuaW1hdGlvbiB1cG9uIHdoaWNoIHRoZSBkZXBlbmRlbmN5IGlzIGNyZWF0ZWQsCisgICAgICogc28gc3VjY2Vzc2l2ZSBjYWxscyB0byB0aGUgdmFyaW91cyBmdW5jdGlvbnMgaW4gPGNvZGU+QnVpbGRlcjwvY29kZT4KKyAgICAgKiB3aWxsIGFsbCByZWZlciB0byB0aGUgaW5pdGlhbCBwYXJhbWV0ZXIgc3VwcGxpZWQgaW4gPGNvZGU+cGxheSgpPC9jb2RlPgorICAgICAqIGFzIHRoZSBkZXBlbmRlbmN5IG9mIHRoZSBvdGhlciBhbmltYXRpb25zLiBGb3IgZXhhbXBsZSwgY2FsbGluZworICAgICAqIDxjb2RlPnBsYXkoYTEpLmJlZm9yZShhMikuYmVmb3JlKGEzKTwvY29kZT4gd2lsbCBwbGF5IGJvdGggPGNvZGU+YTI8L2NvZGU+CisgICAgICogYW5kIDxjb2RlPmEzPC9jb2RlPiB3aGVuIGExIGVuZHM7IGl0IGRvZXMgbm90IHNldCB1cCBhIGRlcGVuZGVuY3kgYmV0d2VlbgorICAgICAqIDxjb2RlPmEyPC9jb2RlPiBhbmQgPGNvZGU+YTM8L2NvZGU+LjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbmltIFRoZSBhbmltYXRpb24gdGhhdCBpcyB0aGUgZGVwZW5kZW5jeSB1c2VkIGluIGxhdGVyIGNhbGxzIHRvIHRoZQorICAgICAqIG1ldGhvZHMgaW4gdGhlIHJldHVybmVkIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdC4gQSBudWxsIHBhcmFtZXRlciB3aWxsIHJlc3VsdAorICAgICAqIGluIGEgbnVsbCA8Y29kZT5CdWlsZGVyPC9jb2RlPiByZXR1cm4gdmFsdWUuCisgICAgICogQHJldHVybiBCdWlsZGVyIFRoZSBvYmplY3QgdGhhdCBjb25zdHJ1Y3RzIHRoZSBzZXF1ZW5jZSBiYXNlZCBvbiB0aGUgZGVwZW5kZW5jaWVzCisgICAgICogb3V0bGluZWQgaW4gdGhlIGNhbGxzIHRvIDxjb2RlPnBsYXk8L2NvZGU+IGFuZCB0aGUgb3RoZXIgbWV0aG9kcyBpbiB0aGUKKyAgICAgKiA8Y29kZT5CdWlsZGVyPC9jb2RlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRlciBwbGF5KEFuaW1hdGFibGUgYW5pbSkgeworICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTmVlZHNTb3J0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihhbmltKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgY2FuY2VsaW5nIGEgPGNvZGU+U2VxdWVuY2VyPC9jb2RlPiBhbHNvIGNhbmNlbHMgYWxsIG9mIHRoZSBhbmltYXRpb25zIHRoYXQgaXQgaXMKKyAgICAgKiByZXNwb25zaWJsZSBmb3IuPC9wPgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKKyAgICAgICAgbUNhbmNlbGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdGFibGVMaXN0ZW5lcj4gdG1wTGlzdGVuZXJzID0KKyAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+KSBtTGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgICAgICBmb3IgKEFuaW1hdGFibGVMaXN0ZW5lciBsaXN0ZW5lciA6IHRtcExpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uQ2FuY2VsKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtU29ydGVkTm9kZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtU29ydGVkTm9kZXMpIHsKKyAgICAgICAgICAgICAgICBub2RlLmFuaW1hdGlvbi5jYW5jZWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCBlbmRpbmcgYSA8Y29kZT5TZXF1ZW5jZXI8L2NvZGU+IGFsc28gZW5kcyBhbGwgb2YgdGhlIGFuaW1hdGlvbnMgdGhhdCBpdCBpcworICAgICAqIHJlc3BvbnNpYmxlIGZvci48L3A+CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZW5kKCkgeworICAgICAgICBtQ2FuY2VsZWQgPSB0cnVlOworICAgICAgICBpZiAobVNvcnRlZE5vZGVzLnNpemUoKSAhPSBtTm9kZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAvLyBoYXNuJ3QgYmVlbiBzdGFydGVkIHlldCAtIHNvcnQgdGhlIG5vZGVzIG5vdywgdGhlbiBlbmQgdGhlbQorICAgICAgICAgICAgc29ydE5vZGVzKCk7CisgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Tb3J0ZWROb2RlcykgeworICAgICAgICAgICAgICAgIGlmIChtU2VxdWVuY2VMaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXF1ZW5jZUxpc3RlbmVyID0gbmV3IFNlcXVlbmNlckFuaW1hdGFibGVMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9kZS5hbmltYXRpb24uYWRkTGlzdGVuZXIobVNlcXVlbmNlTGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtU29ydGVkTm9kZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtU29ydGVkTm9kZXMpIHsKKyAgICAgICAgICAgICAgICBub2RlLmFuaW1hdGlvbi5lbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbnkgb2YgdGhlIGNoaWxkIGFuaW1hdGlvbnMgb2YgdGhpcyBTZXF1ZW5jZXIgaGF2ZSBiZWVuIHN0YXJ0ZWQgYW5kIGhhdmUgbm90CisgICAgICogeWV0IGVuZGVkLgorICAgICAqIEByZXR1cm4gV2hldGhlciB0aGlzIFNlcXVlbmNlciBoYXMgYmVlbiBzdGFydGVkIGFuZCBoYXMgbm90IHlldCBlbmRlZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKSB7CisgICAgICAgIGZvciAoTm9kZSBub2RlIDogbU5vZGVzKSB7CisgICAgICAgICAgICBpZiAobm9kZS5hbmltYXRpb24uaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqCisgICAgICogPHA+U3RhcnRpbmcgdGhpcyA8Y29kZT5TZXF1ZW5jZXI8L2NvZGU+IHdpbGwsIGluIHR1cm4sIHN0YXJ0IHRoZSBhbmltYXRpb25zIGZvciB3aGljaAorICAgICAqIGl0IGlzIHJlc3BvbnNpYmxlLiBUaGUgZGV0YWlscyBvZiB3aGVuIGV4YWN0bHkgdGhvc2UgYW5pbWF0aW9ucyBhcmUgc3RhcnRlZCBkZXBlbmRzIG9uCisgICAgICogdGhlIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwcyB0aGF0IGhhdmUgYmVlbiBzZXQgdXAgYmV0d2VlbiB0aGUgYW5pbWF0aW9ucy4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgbUNhbmNlbGVkID0gZmFsc2U7CisKKyAgICAgICAgLy8gRmlyc3QsIHNvcnQgdGhlIG5vZGVzIChpZiBuZWNlc3NhcnkpLiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgc29ydGVkTm9kZXMKKyAgICAgICAgLy8gY29udGFpbnMgdGhlIGFuaW1hdGlvbiBub2RlcyBpbiB0aGUgY29ycmVjdCBvcmRlci4KKyAgICAgICAgc29ydE5vZGVzKCk7CisKKyAgICAgICAgLy8gbm9kZXNUb1N0YXJ0IGhvbGRzIHRoZSBsaXN0IG9mIG5vZGVzIHRvIGJlIHN0YXJ0ZWQgaW1tZWRpYXRlbHkuIFdlIGRvbid0IHdhbnQgdG8KKyAgICAgICAgLy8gc3RhcnQgdGhlIGFuaW1hdGlvbnMgaW4gdGhlIGxvb3AgZGlyZWN0bHkgYmVjYXVzZSB3ZSBmaXJzdCBuZWVkIHRvIHNldCB1cAorICAgICAgICAvLyBkZXBlbmRlbmNpZXMgb24gYWxsIG9mIHRoZSBub2Rlcy4gRm9yIGV4YW1wbGUsIHdlIGRvbid0IHdhbnQgdG8gc3RhcnQgYW4gYW5pbWF0aW9uCisgICAgICAgIC8vIHdoZW4gc29tZSBvdGhlciBhbmltYXRpb24gYWxzbyB3YW50cyB0byBzdGFydCB3aGVuIHRoZSBmaXJzdCBhbmltYXRpb24gYmVnaW5zLgorICAgICAgICBBcnJheUxpc3Q8Tm9kZT4gbm9kZXNUb1N0YXJ0ID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Tb3J0ZWROb2RlcykgeworICAgICAgICAgICAgaWYgKG1TZXF1ZW5jZUxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU2VxdWVuY2VMaXN0ZW5lciA9IG5ldyBTZXF1ZW5jZXJBbmltYXRhYmxlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobm9kZS5kZXBlbmRlbmNpZXMgPT0gbnVsbCB8fCBub2RlLmRlcGVuZGVuY2llcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIG5vZGVzVG9TdGFydC5hZGQobm9kZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoRGVwZW5kZW5jeSBkZXBlbmRlbmN5IDogbm9kZS5kZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeS5ub2RlLmFuaW1hdGlvbi5hZGRMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVwZW5kZW5jeUxpc3RlbmVyKHRoaXMsIG5vZGUsIGRlcGVuZGVuY3kucnVsZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub2RlLnRtcERlcGVuZGVuY2llcyA9IChBcnJheUxpc3Q8RGVwZW5kZW5jeT4pIG5vZGUuZGVwZW5kZW5jaWVzLmNsb25lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlLmFuaW1hdGlvbi5hZGRMaXN0ZW5lcihtU2VxdWVuY2VMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgLy8gTm93IHRoYXQgYWxsIGRlcGVuZGVuY2llcyBhcmUgc2V0IHVwLCBzdGFydCB0aGUgYW5pbWF0aW9ucyB0aGF0IHNob3VsZCBiZSBzdGFydGVkLgorICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG5vZGVzVG9TdGFydCkgeworICAgICAgICAgICAgbm9kZS5hbmltYXRpb24uc3RhcnQoKTsKKyAgICAgICAgICAgIG1QbGF5aW5nU2V0LmFkZChub2RlLmFuaW1hdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdGFibGVMaXN0ZW5lcj4gdG1wTGlzdGVuZXJzID0KKyAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+KSBtTGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgICAgICBmb3IgKEFuaW1hdGFibGVMaXN0ZW5lciBsaXN0ZW5lciA6IHRtcExpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uU3RhcnQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2VxdWVuY2VyIGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU2VxdWVuY2VyIGFuaW0gPSAoU2VxdWVuY2VyKSBzdXBlci5jbG9uZSgpOworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgYmFzaWMgY2xvbmUoKSBvcGVyYXRpb24gY29waWVzIGFsbCBpdGVtcy4gVGhpcyBkb2Vzbid0IHdvcmsgdmVyeSB3ZWxsIGZvcgorICAgICAgICAgKiBTZXF1ZW5jZXIsIGJlY2F1c2UgaXQgd2lsbCBjb3B5IHJlZmVyZW5jZXMgdGhhdCBuZWVkIHRvIGJlIHJlY3JlYXRlZCBhbmQgc3RhdGUKKyAgICAgICAgICogdGhhdCBtYXkgbm90IGFwcGx5LiBXaGF0IHdlIG5lZWQgdG8gZG8gbm93IGlzIHB1dCB0aGUgY2xvbmUgaW4gYW4gdW5pbml0aWFsaXplZAorICAgICAgICAgKiBzdGF0ZSwgd2l0aCBmcmVzaCwgZW1wdHkgZGF0YSBzdHJ1Y3R1cmVzLiBUaGVuIHdlIHdpbGwgYnVpbGQgdXAgdGhlIG5vZGVzIGxpc3QKKyAgICAgICAgICogbWFudWFsbHksIGFzIHdlIGNsb25lIGVhY2ggTm9kZSAoYW5kIGl0cyBhbmltYXRpb24pLiBUaGUgY2xvbmUgd2lsbCB0aGVuIGJlIHNvcnRlZCwKKyAgICAgICAgICogYW5kIHdpbGwgcG9wdWxhdGUgYW55IGFwcHJvcHJpYXRlIGxpc3RzLCB3aGVuIGl0IGlzIHN0YXJ0ZWQuCisgICAgICAgICAqLworICAgICAgICBhbmltLm1OZWVkc1NvcnQgPSB0cnVlOworICAgICAgICBhbmltLm1DYW5jZWxlZCA9IGZhbHNlOworICAgICAgICBhbmltLm1QbGF5aW5nU2V0ID0gbmV3IEFycmF5TGlzdDxBbmltYXRhYmxlPigpOworICAgICAgICBhbmltLm1Ob2RlTWFwID0gbmV3IEhhc2hNYXA8QW5pbWF0YWJsZSwgTm9kZT4oKTsKKyAgICAgICAgYW5pbS5tTm9kZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisgICAgICAgIGFuaW0ubVNvcnRlZE5vZGVzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworCisgICAgICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgb2xkIG5vZGVzIGxpc3QsIGNsb25pbmcgZWFjaCBub2RlIGFuZCBhZGRpbmcgaXQgdG8gdGhlIG5ldyBub2RlbWFwLgorICAgICAgICAvLyBPbmUgcHJvYmxlbSBpcyB0aGF0IHRoZSBvbGQgbm9kZSBkZXBlbmRlbmNpZXMgcG9pbnQgdG8gbm9kZXMgaW4gdGhlIG9sZCBzZXF1ZW5jZXIuCisgICAgICAgIC8vIFdlIG5lZWQgdG8gdHJhY2sgdGhlIG9sZC9uZXcgbm9kZXMgaW4gb3JkZXIgdG8gcmVjb25zdHJ1Y3QgdGhlIGRlcGVuZGVuY2llcyBpbiB0aGUgY2xvbmUuCisgICAgICAgIEhhc2hNYXA8Tm9kZSwgTm9kZT4gbm9kZUNsb25lTWFwID0gbmV3IEhhc2hNYXA8Tm9kZSwgTm9kZT4oKTsgLy8gPG9sZCwgbmV3PgorICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Ob2RlcykgeworICAgICAgICAgICAgTm9kZSBub2RlQ2xvbmUgPSBub2RlLmNsb25lKCk7CisgICAgICAgICAgICBub2RlQ2xvbmVNYXAucHV0KG5vZGUsIG5vZGVDbG9uZSk7CisgICAgICAgICAgICBhbmltLm1Ob2Rlcy5hZGQobm9kZUNsb25lKTsKKyAgICAgICAgICAgIGFuaW0ubU5vZGVNYXAucHV0KG5vZGVDbG9uZS5hbmltYXRpb24sIG5vZGVDbG9uZSk7CisgICAgICAgICAgICAvLyBDbGVhciBvdXQgdGhlIGRlcGVuZGVuY2llcyBpbiB0aGUgY2xvbmU7IHdlJ2xsIHNldCB0aGVzZSB1cCBtYW51YWxseSBsYXRlcgorICAgICAgICAgICAgbm9kZUNsb25lLmRlcGVuZGVuY2llcyA9IG51bGw7CisgICAgICAgICAgICBub2RlQ2xvbmUudG1wRGVwZW5kZW5jaWVzID0gbnVsbDsKKyAgICAgICAgICAgIG5vZGVDbG9uZS5ub2RlRGVwZW5kZW50cyA9IG51bGw7CisgICAgICAgICAgICBub2RlQ2xvbmUubm9kZURlcGVuZGVuY2llcyA9IG51bGw7CisgICAgICAgICAgICAvLyBjbGVhciBvdXQgYW55IGxpc3RlbmVycyB0aGF0IHdlcmUgc2V0IHVwIGJ5IHRoZSBzZXF1ZW5jZXI7IHRoZXNlIHdpbGwKKyAgICAgICAgICAgIC8vIGJlIHNldCB1cCB3aGVuIHRoZSBjbG9uZSdzIG5vZGVzIGFyZSBzb3J0ZWQKKyAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+IGNsb25lTGlzdGVuZXJzID0gbm9kZUNsb25lLmFuaW1hdGlvbi5nZXRMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgIGlmIChjbG9uZUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdGFibGVMaXN0ZW5lcj4gbGlzdGVuZXJzVG9SZW1vdmUgPSBudWxsOworICAgICAgICAgICAgICAgIGZvciAoQW5pbWF0YWJsZUxpc3RlbmVyIGxpc3RlbmVyIDogY2xvbmVMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgU2VxdWVuY2VyQW5pbWF0YWJsZUxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzVG9SZW1vdmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdDxBbmltYXRhYmxlTGlzdGVuZXI+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNUb1JlbW92ZS5hZGQobGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNUb1JlbW92ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoQW5pbWF0YWJsZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzVG9SZW1vdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gTm93IHRoYXQgd2UndmUgY2xvbmVkIGFsbCBvZiB0aGUgbm9kZXMsIHdlJ3JlIHJlYWR5IHRvIHdhbGsgdGhyb3VnaCB0aGVpcgorICAgICAgICAvLyBkZXBlbmRlbmNpZXMsIG1hcHBpbmcgdGhlIG9sZCBkZXBlbmRlbmNpZXMgdG8gdGhlIG5ldyBub2RlcworICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Ob2RlcykgeworICAgICAgICAgICAgTm9kZSBub2RlQ2xvbmUgPSBub2RlQ2xvbmVNYXAuZ2V0KG5vZGUpOworICAgICAgICAgICAgaWYgKG5vZGUuZGVwZW5kZW5jaWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKERlcGVuZGVuY3kgZGVwZW5kZW5jeSA6IG5vZGUuZGVwZW5kZW5jaWVzKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGUgY2xvbmVkRGVwZW5kZW5jeU5vZGUgPSBub2RlQ2xvbmVNYXAuZ2V0KGRlcGVuZGVuY3kubm9kZSk7CisgICAgICAgICAgICAgICAgICAgIERlcGVuZGVuY3kgY2xvbmVEZXBlbmRlbmN5ID0gbmV3IERlcGVuZGVuY3koY2xvbmVkRGVwZW5kZW5jeU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeS5ydWxlKTsKKyAgICAgICAgICAgICAgICAgICAgbm9kZUNsb25lLmFkZERlcGVuZGVuY3koY2xvbmVEZXBlbmRlbmN5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYW5pbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIHRoZSBtZWNoYW5pc20gYnkgd2hpY2ggYW5pbWF0aW9ucyBhcmUgc3RhcnRlZCBiYXNlZCBvbiBldmVudHMgaW4gb3RoZXIKKyAgICAgKiBhbmltYXRpb25zLiBJZiBhbiBhbmltYXRpb24gaGFzIG11bHRpcGxlIGRlcGVuZGVuY2llcyBvbiBvdGhlciBhbmltYXRpb25zLCB0aGVuCisgICAgICogYWxsIGRlcGVuZGVuY2llcyBtdXN0IGJlIHNhdGlzZmllZCBiZWZvcmUgdGhlIGFuaW1hdGlvbiBpcyBzdGFydGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERlcGVuZGVuY3lMaXN0ZW5lciBpbXBsZW1lbnRzIEFuaW1hdGFibGVMaXN0ZW5lciB7CisKKyAgICAgICAgcHJpdmF0ZSBTZXF1ZW5jZXIgbVNlcXVlbmNlcjsKKworICAgICAgICAvLyBUaGUgbm9kZSB1cG9uIHdoaWNoIHRoZSBkZXBlbmRlbmN5IGlzIGJhc2VkLgorICAgICAgICBwcml2YXRlIE5vZGUgbU5vZGU7CisKKyAgICAgICAgLy8gVGhlIERlcGVuZGVuY3kgcnVsZSAoV0lUSCBvciBBRlRFUikgdGhhdCB0aGUgbGlzdGVuZXIgc2hvdWxkIHdhaXQgZm9yIG9uCisgICAgICAgIC8vIHRoZSBub2RlCisgICAgICAgIHByaXZhdGUgaW50IG1SdWxlOworCisgICAgICAgIHB1YmxpYyBEZXBlbmRlbmN5TGlzdGVuZXIoU2VxdWVuY2VyIHNlcXVlbmNlciwgTm9kZSBub2RlLCBpbnQgcnVsZSkgeworICAgICAgICAgICAgdGhpcy5tU2VxdWVuY2VyID0gc2VxdWVuY2VyOworICAgICAgICAgICAgdGhpcy5tTm9kZSA9IG5vZGU7CisgICAgICAgICAgICB0aGlzLm1SdWxlID0gcnVsZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJZ25vcmUgY2FuY2VsIGV2ZW50cyBmb3Igbm93LiBXZSBtYXkgd2FudCB0byBoYW5kbGUgdGhpcyBldmVudHVhbGx5LAorICAgICAgICAgKiB0byBwcmV2ZW50IGZvbGxvdy1vbiBhbmltYXRpb25zIGZyb20gcnVubmluZyB3aGVuIHNvbWUgZGVwZW5kZW5jeQorICAgICAgICAgKiBhbmltYXRpb24gaXMgY2FuY2VsZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkNhbmNlbChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIGVuZCBldmVudCBpcyByZWNlaXZlZCAtIHNlZSBpZiB0aGlzIGlzIGFuIGV2ZW50IHdlIGFyZSBsaXN0ZW5pbmcgZm9yCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaWYgKG1SdWxlID09IERlcGVuZGVuY3kuQUZURVIpIHsKKyAgICAgICAgICAgICAgICBzdGFydElmUmVhZHkoYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJZ25vcmUgcmVwZWF0IGV2ZW50cyBmb3Igbm93CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgc3RhcnQgZXZlbnQgaXMgcmVjZWl2ZWQgLSBzZWUgaWYgdGhpcyBpcyBhbiBldmVudCB3ZSBhcmUgbGlzdGVuaW5nIGZvcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaWYgKG1SdWxlID09IERlcGVuZGVuY3kuV0lUSCkgeworICAgICAgICAgICAgICAgIHN0YXJ0SWZSZWFkeShhbmltYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGV2ZW50IHJlY2VpdmVkIGlzIG9uZSB0aGF0IHRoZSBub2RlIHdhcyB3YWl0aW5nIGZvci4KKyAgICAgICAgICogSWYgc28sIG1hcmsgaXQgYXMgY29tcGxldGUgYW5kIHNlZSB3aGV0aGVyIGl0J3MgdGltZSB0byBzdGFydAorICAgICAgICAgKiB0aGUgYW5pbWF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gZGVwZW5kZW5jeUFuaW1hdGlvbiB0aGUgYW5pbWF0aW9uIHRoYXQgc2VudCB0aGUgZXZlbnQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgc3RhcnRJZlJlYWR5KEFuaW1hdGFibGUgZGVwZW5kZW5jeUFuaW1hdGlvbikgeworICAgICAgICAgICAgaWYgKG1TZXF1ZW5jZXIubUNhbmNlbGVkKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBhcmVudCBTZXF1ZW5jZXIgd2FzIGNhbmNlbGVkLCB0aGVuIGRvbid0IHN0YXJ0IGFueSBkZXBlbmRlbnQgYW5pbXMKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEZXBlbmRlbmN5IGRlcGVuZGVuY3lUb1JlbW92ZSA9IG51bGw7CisgICAgICAgICAgICBmb3IgKERlcGVuZGVuY3kgZGVwZW5kZW5jeSA6IG1Ob2RlLnRtcERlcGVuZGVuY2llcykgeworICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbmN5LnJ1bGUgPT0gbVJ1bGUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kubm9kZS5hbmltYXRpb24gPT0gZGVwZW5kZW5jeUFuaW1hdGlvbikgeworICAgICAgICAgICAgICAgICAgICAvLyBydWxlIGZpcmVkIC0gcmVtb3ZlIHRoZSBkZXBlbmRlbmN5IGFuZCBsaXN0ZW5lciBhbmQgY2hlY2sgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gc2VlIHdoZXRoZXIgaXQncyB0aW1lIHRvIHN0YXJ0IHRoZSBhbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeVRvUmVtb3ZlID0gZGVwZW5kZW5jeTsKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeUFuaW1hdGlvbi5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbU5vZGUudG1wRGVwZW5kZW5jaWVzLnJlbW92ZShkZXBlbmRlbmN5VG9SZW1vdmUpOworICAgICAgICAgICAgaWYgKG1Ob2RlLnRtcERlcGVuZGVuY2llcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIGFsbCBkZXBlbmRlbmNpZXMgc2F0aXNmaWVkOiBzdGFydCB0aGUgYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgbU5vZGUuYW5pbWF0aW9uLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgbVNlcXVlbmNlci5tUGxheWluZ1NldC5hZGQobU5vZGUuYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTZXF1ZW5jZXJBbmltYXRhYmxlTGlzdGVuZXIgaW1wbGVtZW50cyBBbmltYXRhYmxlTGlzdGVuZXIgeworCisgICAgICAgIHByaXZhdGUgU2VxdWVuY2VyIG1TZXF1ZW5jZXI7CisKKyAgICAgICAgU2VxdWVuY2VyQW5pbWF0YWJsZUxpc3RlbmVyKFNlcXVlbmNlciBzZXF1ZW5jZXIpIHsKKyAgICAgICAgICAgIG1TZXF1ZW5jZXIgPSBzZXF1ZW5jZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkNhbmNlbChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaWYgKG1QbGF5aW5nU2V0LnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKEFuaW1hdGFibGVMaXN0ZW5lciBsaXN0ZW5lciA6IG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uQ2FuY2VsKG1TZXF1ZW5jZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdGFibGUgYW5pbWF0aW9uKSB7CisgICAgICAgICAgICBhbmltYXRpb24ucmVtb3ZlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICBtUGxheWluZ1NldC5yZW1vdmUoYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIE5vZGUgYW5pbU5vZGUgPSBtU2VxdWVuY2VyLm1Ob2RlTWFwLmdldChhbmltYXRpb24pOworICAgICAgICAgICAgYW5pbU5vZGUuZG9uZSA9IHRydWU7CisgICAgICAgICAgICBBcnJheUxpc3Q8Tm9kZT4gc29ydGVkTm9kZXMgPSBtU2VxdWVuY2VyLm1Tb3J0ZWROb2RlczsKKyAgICAgICAgICAgIGJvb2xlYW4gYWxsRG9uZSA9IHRydWU7CisgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IHNvcnRlZE5vZGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFub2RlLmRvbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsRG9uZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWxsRG9uZSkgeworICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgd2FzIHRoZSBsYXN0IGNoaWxkIGFuaW1hdGlvbiB0byBlbmQsIHRoZW4gbm90aWZ5IGxpc3RlbmVycyB0aGF0IHRoaXMKKyAgICAgICAgICAgICAgICAvLyBzZXF1ZW5jZXIgaGFzIGVuZGVkCisgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0YWJsZUxpc3RlbmVyPiB0bXBMaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3Q8QW5pbWF0YWJsZUxpc3RlbmVyPikgbUxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKEFuaW1hdGFibGVMaXN0ZW5lciBsaXN0ZW5lciA6IHRtcExpc3RlbmVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIub25BbmltYXRpb25FbmQobVNlcXVlbmNlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uUmVwZWF0KEFuaW1hdGFibGUgYW5pbWF0aW9uKSB7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0YWJsZSBhbmltYXRpb24pIHsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2Qgc29ydHMgdGhlIGN1cnJlbnQgc2V0IG9mIG5vZGVzLCBpZiBuZWVkZWQuIFRoZSBzb3J0IGlzIGEgc2ltcGxlCisgICAgICogRGVwZW5kZW5jeUdyYXBoIHNvcnQsIHdoaWNoIGdvZXMgbGlrZSB0aGlzOgorICAgICAqIC0gQWxsIG5vZGVzIHdpdGhvdXQgZGVwZW5kZW5jaWVzIGJlY29tZSAncm9vdHMnCisgICAgICogLSB3aGlsZSByb290cyBsaXN0IGlzIG5vdCBudWxsCisgICAgICogLSAgIGZvciBlYWNoIHJvb3QgcgorICAgICAqIC0gICAgIGFkZCByIHRvIHNvcnRlZCBsaXN0CisgICAgICogLSAgICAgcmVtb3ZlIHIgYXMgYSBkZXBlbmRlbmN5IGZyb20gYW55IG90aGVyIG5vZGUKKyAgICAgKiAtICAgYW55IG5vZGVzIHdpdGggbm8gZGVwZW5kZW5jaWVzIGFyZSBhZGRlZCB0byB0aGUgcm9vdHMgbGlzdAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzb3J0Tm9kZXMoKSB7CisgICAgICAgIGlmIChtTmVlZHNTb3J0KSB7CisgICAgICAgICAgICBtU29ydGVkTm9kZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIEFycmF5TGlzdDxOb2RlPiByb290cyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgICAgIGZvciAoTm9kZSBub2RlIDogbU5vZGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUuZGVwZW5kZW5jaWVzID09IG51bGwgfHwgbm9kZS5kZXBlbmRlbmNpZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcm9vdHMuYWRkKG5vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFycmF5TGlzdDxOb2RlPiB0bXBSb290cyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgICAgIHdoaWxlIChyb290cy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChOb2RlIHJvb3QgOiByb290cykgeworICAgICAgICAgICAgICAgICAgICBtU29ydGVkTm9kZXMuYWRkKHJvb3QpOworICAgICAgICAgICAgICAgICAgICBpZiAocm9vdC5ub2RlRGVwZW5kZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IHJvb3Qubm9kZURlcGVuZGVudHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVEZXBlbmRlbmNpZXMucmVtb3ZlKHJvb3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVEZXBlbmRlbmNpZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wUm9vdHMuYWRkKG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByb290cy5jbGVhcigpOworICAgICAgICAgICAgICAgIHJvb3RzLmFkZEFsbCh0bXBSb290cyk7CisgICAgICAgICAgICAgICAgdG1wUm9vdHMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1OZWVkc1NvcnQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtU29ydGVkTm9kZXMuc2l6ZSgpICE9IG1Ob2Rlcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDaXJjdWxhciBkZXBlbmRlbmNpZXMgY2Fubm90IGV4aXN0IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGluIFNlcXVlbmNlciIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRG9lc24ndCBuZWVkIHNvcnRpbmcsIGJ1dCBzdGlsbCBuZWVkIHRvIGFkZCBpbiB0aGUgbm9kZURlcGVuZGVuY2llcyBsaXN0CisgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZXNlIGdldCByZW1vdmVkIGFzIHRoZSBldmVudCBsaXN0ZW5lcnMgZmlyZSBhbmQgdGhlIGRlcGVuZGVuY2llcworICAgICAgICAgICAgLy8gYXJlIHNhdGlzZmllZAorICAgICAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAobm9kZS5kZXBlbmRlbmNpZXMgIT0gbnVsbCAmJiBub2RlLmRlcGVuZGVuY2llcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoRGVwZW5kZW5jeSBkZXBlbmRlbmN5IDogbm9kZS5kZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVEZXBlbmRlbmNpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubm9kZURlcGVuZGVuY2llcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbm9kZS5ub2RlRGVwZW5kZW5jaWVzLmNvbnRhaW5zKGRlcGVuZGVuY3kubm9kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVEZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kubm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9kZS5kb25lID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXBlbmRlbmN5IGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBub2RlIHRoYXQgc29tZSBvdGhlciBub2RlIGlzCisgICAgICogZGVwZW5kZW50IHVwb24gYW5kIHRoZSBuYXR1cmUgb2YgdGhhdCBkZXBlbmRlbmN5LgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVwZW5kZW5jeSB7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgV0lUSCA9IDA7IC8vIGRlcGVuZGVudCBub2RlIG11c3Qgc3RhcnQgd2l0aCB0aGlzIGRlcGVuZGVuY3kgbm9kZQorICAgICAgICBzdGF0aWMgZmluYWwgaW50IEFGVEVSID0gMTsgLy8gZGVwZW5kZW50IG5vZGUgbXVzdCBzdGFydCB3aGVuIHRoaXMgZGVwZW5kZW5jeSBub2RlIGZpbmlzaGVzCisKKyAgICAgICAgLy8gVGhlIG5vZGUgdGhhdCB0aGUgb3RoZXIgbm9kZSB3aXRoIHRoaXMgRGVwZW5kZW5jeSBpcyBkZXBlbmRlbnQgdXBvbgorICAgICAgICBwdWJsaWMgTm9kZSBub2RlOworCisgICAgICAgIC8vIFRoZSBuYXR1cmUgb2YgdGhlIGRlcGVuZGVuY3kgKFdJVEggb3IgQUZURVIpCisgICAgICAgIHB1YmxpYyBpbnQgcnVsZTsKKworICAgICAgICBwdWJsaWMgRGVwZW5kZW5jeShOb2RlIG5vZGUsIGludCBydWxlKSB7CisgICAgICAgICAgICB0aGlzLm5vZGUgPSBub2RlOworICAgICAgICAgICAgdGhpcy5ydWxlID0gcnVsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgTm9kZSBpcyBhbiBlbWJvZGltZW50IG9mIGJvdGggdGhlIEFuaW1hdGFibGUgdGhhdCBpdCB3cmFwcyBhcyB3ZWxsIGFzCisgICAgICogYW55IGRlcGVuZGVuY2llcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBBbmltYXRpb24uIFRoaXMgaW5jbHVkZXMKKyAgICAgKiBib3RoIGRlcGVuZGVuY2llcyB1cG9uIG90aGVyIG5vZGVzIChpbiB0aGUgZGVwZW5kZW5jaWVzIGxpc3QpIGFzCisgICAgICogd2VsbCBhcyBkZXBlbmRlbmNpZXMgb2Ygb3RoZXIgbm9kZXMgdXBvbiB0aGlzIChpbiB0aGUgbm9kZURlcGVuZGVudHMgbGlzdCkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9kZSBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisgICAgICAgIHB1YmxpYyBBbmltYXRhYmxlIGFuaW1hdGlvbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogIFRoZXNlIGFyZSB0aGUgZGVwZW5kZW5jaWVzIHRoYXQgdGhpcyBub2RlJ3MgYW5pbWF0aW9uIGhhcyBvbiBvdGhlcgorICAgICAgICAgKiAgbm9kZXMuIEZvciBleGFtcGxlLCBpZiB0aGlzIG5vZGUncyBhbmltYXRpb24gc2hvdWxkIGJlZ2luIHdpdGggc29tZQorICAgICAgICAgKiAgb3RoZXIgYW5pbWF0aW9uIGVuZHMsIHRoZW4gdGhlcmUgd2lsbCBiZSBhbiBpdGVtIGluIHRoaXMgbm9kZSdzCisgICAgICAgICAqICBkZXBlbmRlbmNpZXMgbGlzdCBmb3IgdGhhdCBvdGhlciBhbmltYXRpb24ncyBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFycmF5TGlzdDxEZXBlbmRlbmN5PiBkZXBlbmRlbmNpZXMgPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiB0bXBEZXBlbmRlbmNpZXMgaXMgYSBydW50aW1lIGRldGFpbC4gV2UgdXNlIHRoZSBkZXBlbmRlbmNpZXMgbGlzdCBmb3Igc29ydGluZy4KKyAgICAgICAgICogQnV0IHdlIGFsc28gdXNlIHRoZSBsaXN0IHRvIGtlZXAgdHJhY2sgb2Ygd2hlbiBtdWx0aXBsZSBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCwKKyAgICAgICAgICogYnV0IHJlbW92aW5nIGVhY2ggZGVwZW5kZW5jeSBhcyBpdCBpcyBzYXRpc2ZpZWQuIFdlIGRvIG5vdCB3YW50IHRvIHJlbW92ZQorICAgICAgICAgKiB0aGUgZGVwZW5kZW5jeSBpdHNlbGYgZnJvbSB0aGUgbGlzdCwgYmVjYXVzZSB3ZSBuZWVkIHRvIHJldGFpbiB0aGF0IGluZm9ybWF0aW9uCisgICAgICAgICAqIGlmIHRoZSBzZXF1ZW5jZXIgaXMgbGF1bmNoZWQgaW4gdGhlIGZ1dHVyZS4gU28gd2UgY3JlYXRlIGEgY29weSBvZiB0aGUgZGVwZW5kZW5jeQorICAgICAgICAgKiBsaXN0IHdoZW4gdGhlIHNlcXVlbmNlciBzdGFydHMgYW5kIHVzZSB0aGlzIHRtcERlcGVuZGVuY2llcyBsaXN0IHRvIHRyYWNrIHRoZQorICAgICAgICAgKiBsaXN0IG9mIHNhdGlzZmllZCBkZXBlbmRlbmNpZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQXJyYXlMaXN0PERlcGVuZGVuY3k+IHRtcERlcGVuZGVuY2llcyA9IG51bGw7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIG5vZGVEZXBlbmRlbmNpZXMgaXMganVzdCBhIGxpc3Qgb2YgdGhlIG5vZGVzIHRoYXQgdGhpcyBOb2RlIGlzIGRlcGVuZGVudCB1cG9uLgorICAgICAgICAgKiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgaW4gc29ydE5vZGVzKCksIHRvIGRldGVybWluZSB3aGVuIGEgbm9kZSBpcyBhIHJvb3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQXJyYXlMaXN0PE5vZGU+IG5vZGVEZXBlbmRlbmNpZXMgPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBub2RlRGVwZGVuZGVudHMgaXMgdGhlIGxpc3Qgb2Ygbm9kZXMgdGhhdCBoYXZlIHRoaXMgbm9kZSBhcyBhIGRlcGVuZGVuY3kuIFRoaXMKKyAgICAgICAgICogaXMgYSB1dGlsaXR5IGZpZWxkIHVzZWQgaW4gc29ydE5vZGVzIHRvIGZhY2lsaXRhdGUgcmVtb3ZpbmcgdGhpcyBub2RlIGFzIGEKKyAgICAgICAgICogZGVwZW5kZW5jeSB3aGVuIGl0IGlzIGEgcm9vdCBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFycmF5TGlzdDxOb2RlPiBub2RlRGVwZW5kZW50cyA9IG51bGw7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBhbmltYXRpb24gaW4gdGhpcyBub2RlIGlzIGZpbmlzaGVkLiBUaGlzIGZsYWcKKyAgICAgICAgICogaXMgdXNlZCBieSBTZXF1ZW5jZXIgdG8gY2hlY2ssIGFzIGVhY2ggYW5pbWF0aW9uIGVuZHMsIHdoZXRoZXIgYWxsIGNoaWxkIGFuaW1hdGlvbnMKKyAgICAgICAgICogYXJlIGRvbmUgYW5kIGl0J3MgdGltZSB0byBzZW5kIG91dCBhbiBlbmQgZXZlbnQgZm9yIHRoZSBlbnRpcmUgU2VxdWVuY2VyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZG9uZSA9IGZhbHNlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIHRoZSBOb2RlIHdpdGggdGhlIGFuaW1hdGlvbiB0aGF0IGl0IGVuY2Fwc3VsYXRlcy4gQSBOb2RlIGhhcyBubworICAgICAgICAgKiBkZXBlbmRlbmNpZXMgYnkgZGVmYXVsdDsgZGVwZW5kZW5jaWVzIGFyZSBhZGRlZCB2aWEgdGhlIGFkZERlcGVuZGVuY3koKQorICAgICAgICAgKiBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltYXRpb24gVGhlIGFuaW1hdGlvbiB0aGF0IHRoZSBOb2RlIGVuY2Fwc3VsYXRlcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBOb2RlKEFuaW1hdGFibGUgYW5pbWF0aW9uKSB7CisgICAgICAgICAgICB0aGlzLmFuaW1hdGlvbiA9IGFuaW1hdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBkZXBlbmRlbmN5IHRvIHRoaXMgTm9kZS4gVGhlIGRlcGVuZGVuY3kgaW5jbHVkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgICAgICAgICAqIG5vZGUgdGhhdCB0aGlzIG5vZGUgaXMgZGVwZW5kZW5jeSB1cG9uIGFuZCB0aGUgbmF0dXJlIG9mIHRoZSBkZXBlbmRlbmN5LgorICAgICAgICAgKiBAcGFyYW0gZGVwZW5kZW5jeQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRGVwZW5kZW5jeShEZXBlbmRlbmN5IGRlcGVuZGVuY3kpIHsKKyAgICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcyA9IG5ldyBBcnJheUxpc3Q8RGVwZW5kZW5jeT4oKTsKKyAgICAgICAgICAgICAgICBub2RlRGVwZW5kZW5jaWVzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTsKKyAgICAgICAgICAgIGlmICghbm9kZURlcGVuZGVuY2llcy5jb250YWlucyhkZXBlbmRlbmN5Lm5vZGUpKSB7CisgICAgICAgICAgICAgICAgbm9kZURlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeS5ub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5vZGUgZGVwZW5kZW5jeU5vZGUgPSBkZXBlbmRlbmN5Lm5vZGU7CisgICAgICAgICAgICBpZiAoZGVwZW5kZW5jeU5vZGUubm9kZURlcGVuZGVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lOb2RlLm5vZGVEZXBlbmRlbnRzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVwZW5kZW5jeU5vZGUubm9kZURlcGVuZGVudHMuYWRkKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOb2RlIGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBzdXBlci5jbG9uZSgpOworICAgICAgICAgICAgbm9kZS5hbmltYXRpb24gPSAoQW5pbWF0YWJsZSkgYW5pbWF0aW9uLmNsb25lKCk7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QgaXMgYSB1dGlsaXR5IGNsYXNzIHRvIGZhY2lsaXRhdGUgYWRkaW5nIGFuaW1hdGlvbnMgdG8gYQorICAgICAqIDxjb2RlPlNlcXVlbmNlcjwvY29kZT4gYWxvbmcgd2l0aCB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZSB2YXJpb3VzIGFuaW1hdGlvbnMuIFRoZQorICAgICAqIGludGVudGlvbiBvZiB0aGUgPGNvZGU+QnVpbGRlcjwvY29kZT4gbWV0aG9kcywgYWxvbmcgd2l0aCB0aGUge0BsaW5rCisgICAgICogU2VxdWVuY2VyI3BsYXkoQW5pbWF0YWJsZSkgcGxheSgpfSBtZXRob2Qgb2YgPGNvZGU+U2VxdWVuY2VyPC9jb2RlPiBpcyB0byBtYWtlIGl0IHBvc3NpYmxlIHRvCisgICAgICogZXhwcmVzcyB0aGUgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXBzIG9mIGFuaW1hdGlvbnMgaW4gYSBuYXR1cmFsIHdheS4gRGV2ZWxvcGVycyBjYW4gYWxzbyB1c2UKKyAgICAgKiB0aGUge0BsaW5rIFNlcXVlbmNlciNwbGF5VG9nZXRoZXIoQW5pbWF0YWJsZVtdKSBwbGF5VG9nZXRoZXIoKX0gYW5kIHtAbGluaworICAgICAqIFNlcXVlbmNlciNwbGF5U2VxdWVudGlhbGx5KEFuaW1hdGFibGVbXSkgcGxheVNlcXVlbnRpYWxseSgpfSBtZXRob2RzIGlmIHRoZXNlIHN1aXQgdGhlIG5lZWQsCisgICAgICogYnV0IGl0IG1pZ2h0IGJlIGVhc2llciBpbiBzb21lIHNpdHVhdGlvbnMgdG8gZXhwcmVzcyB0aGUgc2VxdWVuY2Ugb2YgYW5pbWF0aW9ucyBpbiBwYWlycy4KKyAgICAgKiA8cC8+CisgICAgICogPHA+VGhlIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdCBjYW5ub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHksIGJ1dCBpcyByYXRoZXIgY29uc3RydWN0ZWQKKyAgICAgKiBpbnRlcm5hbGx5IHZpYSBhIGNhbGwgdG8ge0BsaW5rIFNlcXVlbmNlciNwbGF5KEFuaW1hdGFibGUpfS48L3A+CisgICAgICogPHAvPgorICAgICAqIDxwPkZvciBleGFtcGxlLCB0aGlzIHNldHMgdXAgYSBTZXF1ZW5jZXIgdG8gcGxheSBhbmltMSBhbmQgYW5pbTIgYXQgdGhlIHNhbWUgdGltZSwgYW5pbTMgdG8KKyAgICAgKiBwbGF5IHdoZW4gYW5pbTIgZmluaXNoZXMsIGFuZCBhbmltNCB0byBwbGF5IHdoZW4gYW5pbTMgZmluaXNoZXM6PC9wPgorICAgICAqIDxwcmU+CisgICAgICogICAgIFNlcXVlbmNlciBzID0gbmV3IFNlcXVlbmNlcigpOworICAgICAqICAgICBzLnBsYXkoYW5pbTEpLndpdGgoYW5pbTIpOworICAgICAqICAgICBzLnBsYXkoYW5pbTIpLmJlZm9yZShhbmltMyk7CisgICAgICogICAgIHMucGxheShhbmltNCkuYWZ0ZXIoYW5pbTMpOworICAgICAqIDwvcHJlPgorICAgICAqIDxwLz4KKyAgICAgKiA8cD5Ob3RlIGluIHRoZSBleGFtcGxlIHRoYXQgYm90aCB7QGxpbmsgQnVpbGRlciNiZWZvcmUoQW5pbWF0YWJsZSl9IGFuZCB7QGxpbmsKKyAgICAgKiBCdWlsZGVyI2FmdGVyKEFuaW1hdGFibGUpfSBhcmUgdXNlZC4gVGhlc2UgYXJlIGp1c3QgZGlmZmVyZW50IHdheXMgb2YgZXhwcmVzc2luZyB0aGUgc2FtZQorICAgICAqIHJlbGF0aW9uc2hpcCBhbmQgYXJlIHByb3ZpZGVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHNheSB0aGluZ3MgaW4gYSB3YXkgdGhhdCBpcyBtb3JlIG5hdHVyYWwsCisgICAgICogZGVwZW5kaW5nIG9uIHRoZSBzaXR1YXRpb24uPC9wPgorICAgICAqIDxwLz4KKyAgICAgKiA8cD5JdCBpcyBwb3NzaWJsZSB0byBtYWtlIHNldmVyYWwgY2FsbHMgaW50byB0aGUgc2FtZSA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QgdG8gZXhwcmVzcworICAgICAqIG11bHRpcGxlIHJlbGF0aW9uc2hpcHMuIEhvd2V2ZXIsIG5vdGUgdGhhdCBpdCBpcyBvbmx5IHRoZSBhbmltYXRpb24gcGFzc2VkIGludG8gdGhlIGluaXRpYWwKKyAgICAgKiB7QGxpbmsgU2VxdWVuY2VyI3BsYXkoQW5pbWF0YWJsZSl9IG1ldGhvZCB0aGF0IGlzIHRoZSBkZXBlbmRlbmN5IGluIGFueSBvZiB0aGUgc3VjY2Vzc2l2ZQorICAgICAqIGNhbGxzIHRvIHRoZSA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgc3RhcnRzIGJvdGggYW5pbTIKKyAgICAgKiBhbmQgYW5pbTMgd2hlbiBhbmltMSBlbmRzOyB0aGVyZSBpcyBubyBkaXJlY3QgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhbmltMiBhbmQKKyAgICAgKiBhbmltMzoKKyAgICAgKiA8cHJlPgorICAgICAqICAgU2VxdWVuY2VyIHMgPSBuZXcgU2VxdWVuY2VyKCk7CisgICAgICogICBzLnBsYXkoYW5pbTEpLmJlZm9yZShhbmltMikuYmVmb3JlKGFuaW0zKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiBJZiB0aGUgZGVzaXJlZCByZXN1bHQgaXMgdG8gcGxheSBhbmltMSB0aGVuIGFuaW0yIHRoZW4gYW5pbTMsIHRoaXMgY29kZSBleHByZXNzZXMgdGhlCisgICAgICogcmVsYXRpb25zaGlwIGNvcnJlY3RseTo8L3A+CisgICAgICogPHByZT4KKyAgICAgKiAgIFNlcXVlbmNlciBzID0gbmV3IFNlcXVlbmNlcigpOworICAgICAqICAgcy5wbGF5KGFuaW0xKS5iZWZvcmUoYW5pbTIpOworICAgICAqICAgcy5wbGF5KGFuaW0yKS5iZWZvcmUoYW5pbTMpOworICAgICAqIDwvcHJlPgorICAgICAqIDxwLz4KKyAgICAgKiA8cD5Ob3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gZXhwcmVzcyByZWxhdGlvbnNoaXBzIHRoYXQgY2Fubm90IGJlIHJlc29sdmVkIGFuZCB3aWxsIG5vdAorICAgICAqIHJlc3VsdCBpbiBzZW5zaWJsZSByZXN1bHRzLiBGb3IgZXhhbXBsZSwgPGNvZGU+cGxheShhbmltMSkuYWZ0ZXIoYW5pbTEpPC9jb2RlPiBtYWtlcyBubworICAgICAqIHNlbnNlLiBJbiBnZW5lcmFsLCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgbGlrZSB0aGlzIG9uZSAob3IgbW9yZSBpbmRpcmVjdCBvbmVzIHdoZXJlIGEgZGVwZW5kcworICAgICAqIG9uIGIsIHdoaWNoIGRlcGVuZHMgb24gYywgd2hpY2ggZGVwZW5kcyBvbiBhKSBzaG91bGQgYmUgYXZvaWRlZC4gT25seSBjcmVhdGUgc2VxdWVuY2VzIHRoYXQKKyAgICAgKiBjYW4gYm9pbCBkb3duIHRvIGEgc2ltcGxlLCBvbmUtd2F5IHJlbGF0aW9uc2hpcCBvZiBhbmltYXRpb25zIHN0YXJ0aW5nIHdpdGgsIGJlZm9yZSwgYW5kCisgICAgICogYWZ0ZXIgb3RoZXIsIGRpZmZlcmVudCwgYW5pbWF0aW9ucy48L3A+CisgICAgICovCisgICAgcHVibGljIGNsYXNzIEJ1aWxkZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIHRyYWNrcyB0aGUgY3VycmVudCBub2RlIGJlaW5nIHByb2Nlc3NlZC4gSXQgaXMgc3VwcGxpZWQgdG8gdGhlIHBsYXkoKSBtZXRob2QKKyAgICAgICAgICogb2YgU2VxdWVuY2VyIGFuZCBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3Igb2YgQnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgTm9kZSBtQ3VycmVudE5vZGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHBhY2thZ2UtcHJpdmF0ZSBjb25zdHJ1Y3Rvci4gQnVpbGRlcnMgYXJlIG9ubHkgY29uc3RydWN0ZWQgYnkgU2VxdWVuY2VyLCB3aGVuIHRoZQorICAgICAgICAgKiBwbGF5KCkgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW0gVGhlIGFuaW1hdGlvbiB0aGF0IGlzIHRoZSBkZXBlbmRlbmN5IGZvciB0aGUgb3RoZXIgYW5pbWF0aW9ucyBwYXNzZWQgaW50bworICAgICAgICAgKiB0aGUgb3RoZXIgbWV0aG9kcyBvZiB0aGlzIEJ1aWxkZXIgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgQnVpbGRlcihBbmltYXRhYmxlIGFuaW0pIHsKKyAgICAgICAgICAgIG1DdXJyZW50Tm9kZSA9IG1Ob2RlTWFwLmdldChhbmltKTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudE5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50Tm9kZSA9IG5ldyBOb2RlKGFuaW0pOworICAgICAgICAgICAgICAgIG1Ob2RlTWFwLnB1dChhbmltLCBtQ3VycmVudE5vZGUpOworICAgICAgICAgICAgICAgIG1Ob2Rlcy5hZGQobUN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHVwIHRoZSBnaXZlbiBhbmltYXRpb24gdG8gcGxheSBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgaW4gdGhlCisgICAgICAgICAqIHtAbGluayBTZXF1ZW5jZXIjcGxheShBbmltYXRhYmxlKX0gY2FsbCB0aGF0IGNyZWF0ZWQgdGhpcyA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltIFRoZSBhbmltYXRpb24gdGhhdCB3aWxsIHBsYXkgd2hlbiB0aGUgYW5pbWF0aW9uIHN1cHBsaWVkIHRvIHRoZQorICAgICAgICAgKiB7QGxpbmsgU2VxdWVuY2VyI3BsYXkoQW5pbWF0YWJsZSl9IG1ldGhvZCBzdGFydHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCB3aXRoKEFuaW1hdGFibGUgYW5pbSkgeworICAgICAgICAgICAgTm9kZSBub2RlID0gbU5vZGVNYXAuZ2V0KGFuaW0pOworICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5vZGUgPSBuZXcgTm9kZShhbmltKTsKKyAgICAgICAgICAgICAgICBtTm9kZU1hcC5wdXQoYW5pbSwgbm9kZSk7CisgICAgICAgICAgICAgICAgbU5vZGVzLmFkZChub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IG5ldyBEZXBlbmRlbmN5KG1DdXJyZW50Tm9kZSwgRGVwZW5kZW5jeS5XSVRIKTsKKyAgICAgICAgICAgIG5vZGUuYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHVwIHRoZSBnaXZlbiBhbmltYXRpb24gdG8gcGxheSB3aGVuIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgaW4gdGhlCisgICAgICAgICAqIHtAbGluayBTZXF1ZW5jZXIjcGxheShBbmltYXRhYmxlKX0gY2FsbCB0aGF0IGNyZWF0ZWQgdGhpcyA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QKKyAgICAgICAgICogZW5kcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW0gVGhlIGFuaW1hdGlvbiB0aGF0IHdpbGwgcGxheSB3aGVuIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgdG8gdGhlCisgICAgICAgICAqIHtAbGluayBTZXF1ZW5jZXIjcGxheShBbmltYXRhYmxlKX0gbWV0aG9kIGVuZHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBiZWZvcmUoQW5pbWF0YWJsZSBhbmltKSB7CisgICAgICAgICAgICBOb2RlIG5vZGUgPSBtTm9kZU1hcC5nZXQoYW5pbSk7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbm9kZSA9IG5ldyBOb2RlKGFuaW0pOworICAgICAgICAgICAgICAgIG1Ob2RlTWFwLnB1dChhbmltLCBub2RlKTsKKyAgICAgICAgICAgICAgICBtTm9kZXMuYWRkKG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gbmV3IERlcGVuZGVuY3kobUN1cnJlbnROb2RlLCBEZXBlbmRlbmN5LkFGVEVSKTsKKyAgICAgICAgICAgIG5vZGUuYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHVwIHRoZSBnaXZlbiBhbmltYXRpb24gdG8gcGxheSB3aGVuIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgaW4gdGhlCisgICAgICAgICAqIHtAbGluayBTZXF1ZW5jZXIjcGxheShBbmltYXRhYmxlKX0gY2FsbCB0aGF0IGNyZWF0ZWQgdGhpcyA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QKKyAgICAgICAgICogdG8gc3RhcnQgd2hlbiB0aGUgYW5pbWF0aW9uIHN1cHBsaWVkIGluIHRoaXMgbWV0aG9kIGNhbGwgZW5kcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW0gVGhlIGFuaW1hdGlvbiB3aG9zZSBlbmQgd2lsbCBjYXVzZSB0aGUgYW5pbWF0aW9uIHN1cHBsaWVkIHRvIHRoZQorICAgICAgICAgKiB7QGxpbmsgU2VxdWVuY2VyI3BsYXkoQW5pbWF0YWJsZSl9IG1ldGhvZCB0byBwbGF5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXIoQW5pbWF0YWJsZSBhbmltKSB7CisgICAgICAgICAgICBOb2RlIG5vZGUgPSBtTm9kZU1hcC5nZXQoYW5pbSk7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbm9kZSA9IG5ldyBOb2RlKGFuaW0pOworICAgICAgICAgICAgICAgIG1Ob2RlTWFwLnB1dChhbmltLCBub2RlKTsKKyAgICAgICAgICAgICAgICBtTm9kZXMuYWRkKG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gbmV3IERlcGVuZGVuY3kobm9kZSwgRGVwZW5kZW5jeS5BRlRFUik7CisgICAgICAgICAgICBtQ3VycmVudE5vZGUuYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHVwIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgaW4gdGhlCisgICAgICAgICAqIHtAbGluayBTZXF1ZW5jZXIjcGxheShBbmltYXRhYmxlKX0gY2FsbCB0aGF0IGNyZWF0ZWQgdGhpcyA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QKKyAgICAgICAgICogdG8gcGxheSB3aGVuIHRoZSBnaXZlbiBhbW91bnQgb2YgdGltZSBlbGFwc2VzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGVsYXkgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBzaG91bGQgZWxhcHNlIGJlZm9yZSB0aGUKKyAgICAgICAgICogYW5pbWF0aW9uIHN0YXJ0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyKGxvbmcgZGVsYXkpIHsKKyAgICAgICAgICAgIC8vIHNldHVwIGR1bW15IEFuaW1hdG9yIGp1c3QgdG8gcnVuIHRoZSBjbG9jaworICAgICAgICAgICAgYWZ0ZXIobmV3IEFuaW1hdG9yKGRlbGF5LCAwZiwgMWYpKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vVHlwZUV2YWx1YXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1R5cGVFdmFsdWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTUwZTAwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1R5cGVFdmFsdWF0b3IuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIHVzZSB3aXRoIHRoZSB7QGxpbmsgQW5pbWF0b3Ijc2V0RXZhbHVhdG9yKFR5cGVFdmFsdWF0b3IpfSBmdW5jdGlvbi4gRXZhbHVhdG9ycworICogYWxsb3cgZGV2ZWxvcGVycyB0byBjcmVhdGUgYW5pbWF0aW9ucyBvbiBhcmJpdHJhcnkgcHJvcGVydHkgdHlwZXMsIGJ5IGFsbG93aW5nIHRoZW0gdG8gc3VwcGx5CisgKiBjdXN0b20gZXZhdWxhdG9ycyBmb3IgdHlwZXMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgdW5kZXJzdG9vZCBhbmQgdXNlZCBieSB0aGUgYW5pbWF0aW9uCisgKiBzeXN0ZW0uCisgKgorICogQHNlZSBBbmltYXRvciNzZXRFdmFsdWF0b3IoVHlwZUV2YWx1YXRvcikKKyAqLworcHVibGljIGludGVyZmFjZSBUeXBlRXZhbHVhdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVzdWx0IG9mIGxpbmVhcmx5IGludGVycG9sYXRpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLCB3aXRoCisgICAgICogPGNvZGU+ZnJhY3Rpb248L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgcHJvcG9ydGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcy4gVGhlCisgICAgICogY2FsY3VsYXRpb24gaXMgYSBzaW1wbGUgcGFyYW1ldHJpYyBjYWxjdWxhdGlvbjogPGNvZGU+cmVzdWx0ID0geDAgKyB0ICogKHYxIC0gdjApPC9jb2RlPiwKKyAgICAgKiB3aGVyZSA8Y29kZT54MDwvY29kZT4gaXMgPGNvZGU+c3RhcnRWYWx1ZTwvY29kZT4sIDxjb2RlPngxPC9jb2RlPiBpcyA8Y29kZT5lbmRWYWx1ZTwvY29kZT4sCisgICAgICogYW5kIDxjb2RlPnQ8L2NvZGU+IGlzIDxjb2RlPmZyYWN0aW9uPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiAgIFRoZSBmcmFjdGlvbiBmcm9tIHRoZSBzdGFydGluZyB0byB0aGUgZW5kaW5nIHZhbHVlcworICAgICAqIEBwYXJhbSBzdGFydFZhbHVlIFRoZSBzdGFydCB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gZW5kVmFsdWUgICBUaGUgZW5kIHZhbHVlLgorICAgICAqIEByZXR1cm4gQSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgZ2l2ZW4gdGhlCisgICAgICogICAgICAgICA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCBzdGFydFZhbHVlLCBPYmplY3QgZW5kVmFsdWUpOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL3BhY2thZ2UuaHRtbCBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2NjY5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw2IEBACis8aHRtbD4KKzxib2R5PgorUHJvdmlkZXMgY2xhc3NlcyBmb3IgYW5pbWF0aW5nIHZhbHVlcyBvdmVyIHRpbWUsIGFuZCBzZXR0aW5nIHRob3NlIHZhbHVlcyBvbiB0YXJnZXQKK29iamVjdHMuCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aW9uQmFyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aW9uQmFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwODZmMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpb25CYXIuamF2YQpAQCAtMCwwICsxLDQ5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXI7CisKKy8qKgorICogVGhpcyBpcyB0aGUgcHVibGljIGludGVyZmFjZSB0byB0aGUgY29udGV4dHVhbCBBY3Rpb25CYXIuCisgKiBUaGUgQWN0aW9uQmFyIGFjdHMgYXMgYSByZXBsYWNlbWVudCBmb3IgdGhlIHRpdGxlIGJhciBpbiBBY3Rpdml0aWVzLgorICogSXQgcHJvdmlkZXMgZmFjaWxpdGllcyBmb3IgY3JlYXRpbmcgdG9vbGJhciBhY3Rpb25zIGFzIHdlbGwgYXMKKyAqIG1ldGhvZHMgb2YgbmF2aWdhdGluZyBhcm91bmQgYW4gYXBwbGljYXRpb24uIAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWN0aW9uQmFyIHsKKyAgICAvKioKKyAgICAgKiBTdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUuIENvbnNpc3RzIG9mIGVpdGhlciBhIGxvZ28gb3IgaWNvbgorICAgICAqIGFuZCB0aXRsZSB0ZXh0IHdpdGggYW4gb3B0aW9uYWwgc3VidGl0bGUuIENsaWNraW5nIGFueSBvZiB0aGVzZSBlbGVtZW50cworICAgICAqIHdpbGwgZGlzcGF0Y2ggb25BY3Rpb25JdGVtU2VsZWN0ZWQgdG8gdGhlIHJlZ2lzdGVyZWQgQ2FsbGJhY2sgd2l0aAorICAgICAqIGEgTWVudUl0ZW0gd2l0aCBpdGVtIElEIGFuZHJvaWQuUi5pZC5ob21lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVklHQVRJT05fTU9ERV9TVEFOREFSRCA9IDA7CisgICAgCisgICAgLyoqCisgICAgICogRHJvcGRvd24gbGlzdCBuYXZpZ2F0aW9uIG1vZGUuIEluc3RlYWQgb2Ygc3RhdGljIHRpdGxlIHRleHQgdGhpcyBtb2RlCisgICAgICogcHJlc2VudHMgYSBkcm9wZG93biBtZW51IGZvciBuYXZpZ2F0aW9uIHdpdGhpbiB0aGUgYWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1QgPSAxOworICAgIAorICAgIC8qKgorICAgICAqIFRhYiBuYXZpZ2F0aW9uIG1vZGUuIEluc3RlYWQgb2Ygc3RhdGljIHRpdGxlIHRleHQgdGhpcyBtb2RlCisgICAgICogcHJlc2VudHMgYSBzZXJpZXMgb2YgdGFicyBmb3IgbmF2aWdhdGlvbiB3aXRoaW4gdGhlIGFjdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVklHQVRJT05fTU9ERV9UQUJTID0gMjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDdXN0b20gbmF2aWdhdGlvbiBtb2RlLiBUaGlzIG5hdmlnYXRpb24gbW9kZSBpcyBzZXQgaW1wbGljaXRseSB3aGVuZXZlcgorICAgICAqIGEgY3VzdG9tIG5hdmlnYXRpb24gdmlldyBpcyBzZXQuIFNlZSB7QGxpbmsgI3NldEN1c3RvbU5hdmlnYXRpb25Nb2RlKFZpZXcpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQVZJR0FUSU9OX01PREVfQ1VTVE9NID0gMzsKKworICAgIC8qKgorICAgICAqIFVzZSBsb2dvIGluc3RlYWQgb2YgaWNvbiBpZiBhdmFpbGFibGUuIFRoaXMgZmxhZyB3aWxsIGNhdXNlIGFwcHJvcHJpYXRlCisgICAgICogbmF2aWdhdGlvbiBtb2RlcyB0byB1c2UgYSB3aWRlciBsb2dvIGluIHBsYWNlIG9mIHRoZSBzdGFuZGFyZCBpY29uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BMQVlfVVNFX0xPR08gPSAweDE7CisgICAgCisgICAgLyoqCisgICAgICogSGlkZSAnaG9tZScgZWxlbWVudHMgaW4gdGhpcyBhY3Rpb24gYmFyLCBsZWF2aW5nIG1vcmUgc3BhY2UgZm9yIG90aGVyCisgICAgICogbmF2aWdhdGlvbiBlbGVtZW50cy4gVGhpcyBpbmNsdWRlcyBsb2dvIGFuZCBpY29uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BMQVlfSElERV9IT01FID0gMHgyOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIGludG8gY3VzdG9tIG5hdmlnYXRpb24gbW9kZSwgc3VwcGx5aW5nIGEgdmlldworICAgICAqIGZvciBjdXN0b20gbmF2aWdhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBDdXN0b20gbmF2aWdhdGlvbiB2aWV3cyBhcHBlYXIgYmV0d2VlbiB0aGUgYXBwbGljYXRpb24gaWNvbiBhbmQKKyAgICAgKiBhbnkgYWN0aW9uIGJ1dHRvbnMgYW5kIG1heSB1c2UgYW55IHNwYWNlIGF2YWlsYWJsZSB0aGVyZS4gQ29tbW9uCisgICAgICogdXNlIGNhc2VzIGZvciBjdXN0b20gbmF2aWdhdGlvbiB2aWV3cyBtaWdodCBpbmNsdWRlIGFuIGF1dG8tc3VnZ2VzdGluZworICAgICAqIGFkZHJlc3MgYmFyIGZvciBhIGJyb3dzZXIgb3Igb3RoZXIgbmF2aWdhdGlvbiBtZWNoYW5pc21zIHRoYXQgZG8gbm90CisgICAgICogdHJhbnNsYXRlIHdlbGwgdG8gcHJvdmlkZWQgbmF2aWdhdGlvbiBtb2Rlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmlldyBDdXN0b20gbmF2aWdhdGlvbiB2aWV3IHRvIHBsYWNlIGluIHRoZSBBY3Rpb25CYXIuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUoVmlldyB2aWV3KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgaW50byBkcm9wZG93biBuYXZpZ2F0aW9uIG1vZGUgYW5kIHN1cHBseSBhbiBhZGFwdGVyCisgICAgICogdGhhdCB3aWxsIHByb3ZpZGUgdmlld3MgZm9yIG5hdmlnYXRpb24gY2hvaWNlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBBbiBhZGFwdGVyIHRoYXQgd2lsbCBwcm92aWRlIHZpZXdzIGJvdGggdG8gZGlzcGxheQorICAgICAqICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IG5hdmlnYXRpb24gc2VsZWN0aW9uIGFuZCBwb3B1bGF0ZSB2aWV3cworICAgICAqICAgICAgICAgICAgICAgIHdpdGhpbiB0aGUgZHJvcGRvd24gbmF2aWdhdGlvbiBtZW51LgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIE5hdmlnYXRpb25DYWxsYmFjayB0aGF0IHdpbGwgcmVjZWl2ZSBldmVudHMgd2hlbiB0aGUgdXNlcgorICAgICAqICAgICAgICAgICAgICAgICBzZWxlY3RzIGEgbmF2aWdhdGlvbiBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUoU3Bpbm5lckFkYXB0ZXIgYWRhcHRlciwKKyAgICAgICAgICAgIE5hdmlnYXRpb25DYWxsYmFjayBjYWxsYmFjayk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgaW50byBkcm9wZG93biBuYXZpZ2F0aW9uIG1vZGUgYW5kIHN1cHBseSBhbiBhZGFwdGVyIHRoYXQgd2lsbAorICAgICAqIHByb3ZpZGUgdmlld3MgZm9yIG5hdmlnYXRpb24gY2hvaWNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIEFuIGFkYXB0ZXIgdGhhdCB3aWxsIHByb3ZpZGUgdmlld3MgYm90aCB0byBkaXNwbGF5IHRoZSBjdXJyZW50CisgICAgICogICAgICAgICAgICAgICAgbmF2aWdhdGlvbiBzZWxlY3Rpb24gYW5kIHBvcHVsYXRlIHZpZXdzIHdpdGhpbiB0aGUgZHJvcGRvd24KKyAgICAgKiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uIG1lbnUuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIEEgTmF2aWdhdGlvbkNhbGxiYWNrIHRoYXQgd2lsbCByZWNlaXZlIGV2ZW50cyB3aGVuIHRoZSB1c2VyCisgICAgICogICAgICAgICAgICAgICAgIHNlbGVjdHMgYSBuYXZpZ2F0aW9uIGl0ZW0uCisgICAgICogQHBhcmFtIGRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uIFBvc2l0aW9uIHdpdGhpbiB0aGUgcHJvdmlkZWQgYWRhcHRlciB0aGF0IHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCBmcm9tIHRoZSBvdXRzZXQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShTcGlubmVyQWRhcHRlciBhZGFwdGVyLAorICAgICAgICAgICAgTmF2aWdhdGlvbkNhbGxiYWNrIGNhbGxiYWNrLCBpbnQgZGVmYXVsdFNlbGVjdGVkUG9zaXRpb24pOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZWxlY3RlZCBuYXZpZ2F0aW9uIGl0ZW0gaW4gZHJvcGRvd24gb3IgdGFiYmVkIG5hdmlnYXRpb24gbW9kZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gUG9zaXRpb24gb2YgdGhlIGl0ZW0gdG8gc2VsZWN0LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFNlbGVjdGVkTmF2aWdhdGlvbkl0ZW0oaW50IHBvc2l0aW9uKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIHNlbGVjdGVkIG5hdmlnYXRpb24gaXRlbSBpbiBkcm9wZG93biBvciB0YWJiZWQgbmF2aWdhdGlvbiBtb2Rlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUG9zaXRpb24gb2YgdGhlIHNlbGVjdGVkIGl0ZW0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRTZWxlY3RlZE5hdmlnYXRpb25JdGVtKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgaW50byBzdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUsIHN1cHBseWluZyBhIHRpdGxlIGFuZCBzdWJ0aXRsZS4KKyAgICAgKiAKKyAgICAgKiBTdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUgaXMgZGVmYXVsdC4gVGhlIHRpdGxlIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIHRoZQorICAgICAqIG5hbWUgb2YgeW91ciBBY3Rpdml0eS4gU3VidGl0bGVzIGFyZSBkaXNwbGF5ZWQgdW5kZXJuZWF0aCB0aGUgdGl0bGUsIHVzdWFsbHkKKyAgICAgKiBpbiBhIHNtYWxsZXIgZm9udCBvciBvdGhlcndpc2UgbGVzcyBwcm9taW5lbnRseSB0aGFuIHRoZSB0aXRsZS4gU3VidGl0bGVzIGFyZQorICAgICAqIGdvb2QgZm9yIGV4dGVuZGVkIGRlc2NyaXB0aW9ucyBvZiBhY3Rpdml0eSBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgYWN0aW9uIGJhcidzIHRpdGxlLiBudWxsIGlzIHRyZWF0ZWQgYXMgYW4gZW1wdHkgc3RyaW5nLgorICAgICAqIEBwYXJhbSBzdWJ0aXRsZSBUaGUgYWN0aW9uIGJhcidzIHN1YnRpdGxlLiBudWxsIHdpbGwgcmVtb3ZlIHRoZSBzdWJ0aXRsZSBlbnRpcmVseS4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoKQorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoQ2hhclNlcXVlbmNlKQorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoaW50KQorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoaW50LCBpbnQpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UgdGl0bGUsIENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgaW50byBzdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUsIHN1cHBseWluZyBhIHRpdGxlIGFuZCBzdWJ0aXRsZS4KKyAgICAgKiAKKyAgICAgKiBTdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUgaXMgZGVmYXVsdC4gVGhlIHRpdGxlIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIHRoZQorICAgICAqIG5hbWUgb2YgeW91ciBBY3Rpdml0eS4gU3VidGl0bGVzIGFyZSBkaXNwbGF5ZWQgdW5kZXJuZWF0aCB0aGUgdGl0bGUsIHVzdWFsbHkKKyAgICAgKiBpbiBhIHNtYWxsZXIgZm9udCBvciBvdGhlcndpc2UgbGVzcyBwcm9taW5lbnRseSB0aGFuIHRoZSB0aXRsZS4gU3VidGl0bGVzIGFyZQorICAgICAqIGdvb2QgZm9yIGV4dGVuZGVkIGRlc2NyaXB0aW9ucyBvZiBhY3Rpdml0eSBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aXRsZVJlc0lkIFJlc291cmNlIElEIG9mIGEgdGl0bGUgc3RyaW5nCisgICAgICogQHBhcmFtIHN1YnRpdGxlUmVzSWQgUmVzb3VyY2UgSUQgb2YgYSBzdWJ0aXRsZSBzdHJpbmcKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoKQorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoQ2hhclNlcXVlbmNlKQorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoQ2hhclNlcXVlbmNlLCBDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShpbnQpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShpbnQgdGl0bGVSZXNJZCwgaW50IHN1YnRpdGxlUmVzSWQpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIGludG8gc3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlLCBzdXBwbHlpbmcgYSB0aXRsZSBhbmQgc3VidGl0bGUuCisgICAgICogCisgICAgICogU3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlIGlzIGRlZmF1bHQuIFRoZSB0aXRsZSBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byB0aGUKKyAgICAgKiBuYW1lIG9mIHlvdXIgQWN0aXZpdHkgb24gc3RhcnR1cCBpZiBhbiBhY3Rpb24gYmFyIGlzIHByZXNlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIGFjdGlvbiBiYXIncyB0aXRsZS4gbnVsbCBpcyB0cmVhdGVkIGFzIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoKQorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoQ2hhclNlcXVlbmNlLCBDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShpbnQpCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShpbnQsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKENoYXJTZXF1ZW5jZSB0aXRsZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgaW50byBzdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUsIHN1cHBseWluZyBhIHRpdGxlIGFuZCBzdWJ0aXRsZS4KKyAgICAgKiAKKyAgICAgKiBTdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUgaXMgZGVmYXVsdC4gVGhlIHRpdGxlIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIHRoZQorICAgICAqIG5hbWUgb2YgeW91ciBBY3Rpdml0eSBvbiBzdGFydHVwIGlmIGFuIGFjdGlvbiBiYXIgaXMgcHJlc2VudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aXRsZVJlc0lkIFJlc291cmNlIElEIG9mIGEgdGl0bGUgc3RyaW5nCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKCkKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKENoYXJTZXF1ZW5jZSwgQ2hhclNlcXVlbmNlKQorICAgICAqIEBzZWUgI3NldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoaW50LCBpbnQpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShpbnQgdGl0bGVSZXNJZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgaW50byBzdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUsIHVzaW5nIHRoZSBjdXJyZW50bHkgc2V0IHRpdGxlCisgICAgICogYW5kL29yIHN1YnRpdGxlLgorICAgICAqCisgICAgICogU3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlIGlzIGRlZmF1bHQuIFRoZSB0aXRsZSBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byB0aGUgbmFtZSBvZgorICAgICAqIHlvdXIgQWN0aXZpdHkgb24gc3RhcnR1cCBpZiBhbiBhY3Rpb24gYmFyIGlzIHByZXNlbnQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSgpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyJ3MgdGl0bGUuIFRoaXMgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCBpbiBzdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGl0bGUgVGl0bGUgdG8gc2V0CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRUaXRsZShpbnQpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhcidzIHRpdGxlLiBUaGlzIHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgaW4gc3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc0lkIFJlc291cmNlIElEIG9mIHRpdGxlIHN0cmluZyB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFRpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUaXRsZShpbnQgcmVzSWQpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyJ3Mgc3VidGl0bGUuIFRoaXMgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCBpbiBzdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUuCisgICAgICogU2V0IHRvIG51bGwgdG8gZGlzYWJsZSB0aGUgc3VidGl0bGUgZW50aXJlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3VidGl0bGUgU3VidGl0bGUgdG8gc2V0CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTdWJ0aXRsZShpbnQpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlIHN1YnRpdGxlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhcidzIHN1YnRpdGxlLiBUaGlzIHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgaW4gc3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc0lkIFJlc291cmNlIElEIG9mIHN1YnRpdGxlIHN0cmluZyB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdWJ0aXRsZShpbnQgcmVzSWQpOworCisgICAgLyoqCisgICAgICogU2V0IGRpc3BsYXkgb3B0aW9ucy4gVGhpcyBjaGFuZ2VzIGFsbCBkaXNwbGF5IG9wdGlvbiBiaXRzIGF0IG9uY2UuIFRvIGNoYW5nZQorICAgICAqIGEgbGltaXRlZCBzdWJzZXQgb2YgZGlzcGxheSBvcHRpb25zLCBzZWUge0BsaW5rICNzZXREaXNwbGF5T3B0aW9ucyhpbnQsIGludCl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBvcHRpb25zIEEgY29tYmluYXRpb24gb2YgdGhlIGJpdHMgZGVmaW5lZCBieSB0aGUgRElTUExBWV8gY29uc3RhbnRzCisgICAgICogICAgICAgICAgICAgICAgZGVmaW5lZCBpbiBBY3Rpb25CYXIuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RGlzcGxheU9wdGlvbnMoaW50IG9wdGlvbnMpOworICAgIAorICAgIC8qKgorICAgICAqIFNldCBzZWxlY3RlZCBkaXNwbGF5IG9wdGlvbnMuIE9ubHkgdGhlIG9wdGlvbnMgc3BlY2lmaWVkIGJ5IG1hc2sgd2lsbCBiZSBjaGFuZ2VkLgorICAgICAqIFRvIGNoYW5nZSBhbGwgZGlzcGxheSBvcHRpb24gYml0cyBhdCBvbmNlLCBzZWUge0BsaW5rICNzZXREaXNwbGF5T3B0aW9ucyhpbnQpfS4KKyAgICAgKiAKKyAgICAgKiA8cD5FeGFtcGxlOiBzZXREaXNwbGF5T3B0aW9ucygwLCBESVNQTEFZX0hJREVfSE9NRSkgd2lsbCBkaXNhYmxlIHRoZQorICAgICAqIHtAbGluayAjRElTUExBWV9ISURFX0hPTUV9IG9wdGlvbi4KKyAgICAgKiBzZXREaXNwbGF5T3B0aW9ucyhESVNQTEFZX0hJREVfSE9NRSwgRElTUExBWV9ISURFX0hPTUUgfCBESVNQTEFZX1VTRV9MT0dPKQorICAgICAqIHdpbGwgZW5hYmxlIHtAbGluayAjRElTUExBWV9ISURFX0hPTUV9IGFuZCBkaXNhYmxlIHtAbGluayAjRElTUExBWV9VU0VfTE9HT30uCisgICAgICogCisgICAgICogQHBhcmFtIG9wdGlvbnMgQSBjb21iaW5hdGlvbiBvZiB0aGUgYml0cyBkZWZpbmVkIGJ5IHRoZSBESVNQTEFZXyBjb25zdGFudHMKKyAgICAgKiAgICAgICAgICAgICAgICBkZWZpbmVkIGluIEFjdGlvbkJhci4KKyAgICAgKiBAcGFyYW0gbWFzayBBIGJpdCBtYXNrIGRlY2xhcmluZyB3aGljaCBkaXNwbGF5IG9wdGlvbnMgc2hvdWxkIGJlIGNoYW5nZWQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RGlzcGxheU9wdGlvbnMoaW50IG9wdGlvbnMsIGludCBtYXNrKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEFjdGlvbkJhcidzIGJhY2tncm91bmQuCisgICAgICogCisgICAgICogQHBhcmFtIGQgQmFja2dyb3VuZCBkcmF3YWJsZQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSBkKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGN1c3RvbSBuYXZpZ2F0aW9uIHZpZXcuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFZpZXcgZ2V0Q3VzdG9tTmF2aWdhdGlvblZpZXcoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IEFjdGlvbkJhciB0aXRsZSBpbiBzdGFuZGFyZCBtb2RlLgorICAgICAqIFJldHVybnMgbnVsbCBpZiB7QGxpbmsgI2dldE5hdmlnYXRpb25Nb2RlKCl9IHdvdWxkIG5vdCByZXR1cm4KKyAgICAgKiB7QGxpbmsgI05BVklHQVRJT05fTU9ERV9TVEFOREFSRH0uIAorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBBY3Rpb25CYXIgdGl0bGUgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBBY3Rpb25CYXIgc3VidGl0bGUgaW4gc3RhbmRhcmQgbW9kZS4KKyAgICAgKiBSZXR1cm5zIG51bGwgaWYge0BsaW5rICNnZXROYXZpZ2F0aW9uTW9kZSgpfSB3b3VsZCBub3QgcmV0dXJuCisgICAgICoge0BsaW5rICNOQVZJR0FUSU9OX01PREVfU1RBTkRBUkR9LiAKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgQWN0aW9uQmFyIHN1YnRpdGxlIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBtb2RlLiBUaGUgcmVzdWx0IHdpbGwgYmUgb25lIG9mOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNOQVZJR0FUSU9OX01PREVfU1RBTkRBUkR9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNOQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI05BVklHQVRJT05fTU9ERV9UQUJTfTwvbGk+CisgICAgICogPGxpPntAbGluayAjTkFWSUdBVElPTl9NT0RFX0NVU1RPTX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IG5hdmlnYXRpb24gbW9kZS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKCkKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKENoYXJTZXF1ZW5jZSwgQ2hhclNlcXVlbmNlKQorICAgICAqIEBzZWUgI3NldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUoU3Bpbm5lckFkYXB0ZXIpCisgICAgICogQHNlZSAjc2V0VGFiTmF2aWdhdGlvbk1vZGUoKQorICAgICAqIEBzZWUgI3NldEN1c3RvbU5hdmlnYXRpb25Nb2RlKFZpZXcpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGludCBnZXROYXZpZ2F0aW9uTW9kZSgpOworICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2V0IG9mIGRpc3BsYXkgb3B0aW9ucy4gCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGludCBnZXREaXNwbGF5T3B0aW9ucygpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIGludG8gdGFiYmVkIG5hdmlnYXRpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEBzZWUgI2FkZFRhYihUYWIpCisgICAgICogQHNlZSAjaW5zZXJ0VGFiKFRhYiwgaW50KQorICAgICAqIEBzZWUgI3JlbW92ZVRhYihUYWIpCisgICAgICogQHNlZSAjcmVtb3ZlVGFiQXQoaW50KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRhYk5hdmlnYXRpb25Nb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgaW50byB0YWJiZWQgbmF2aWdhdGlvbiBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lclZpZXdJZCBJZCBvZiB0aGUgY29udGFpbmVyIHZpZXcgd2hlcmUgdGFiIGNvbnRlbnQgZnJhZ21lbnRzIHNob3VsZCBhcHBlYXIuCisgICAgICoKKyAgICAgKiBAc2VlICNhZGRUYWIoVGFiKQorICAgICAqIEBzZWUgI2luc2VydFRhYihUYWIsIGludCkKKyAgICAgKiBAc2VlICNyZW1vdmVUYWIoVGFiKQorICAgICAqIEBzZWUgI3JlbW92ZVRhYkF0KGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUYWJOYXZpZ2F0aW9uTW9kZShpbnQgY29udGFpbmVyVmlld0lkKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IHtAbGluayBUYWJ9LgorICAgICAqIFRoaXMgdGFiIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBhY3Rpb24gYmFyIHVudGlsIGl0IGlzIGFkZGVkLgorICAgICAqCisgICAgICogQHJldHVybiBBIG5ldyBUYWIKKyAgICAgKgorICAgICAqIEBzZWUgI2FkZFRhYihUYWIpCisgICAgICogQHNlZSAjaW5zZXJ0VGFiKFRhYiwgaW50KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBUYWIgbmV3VGFiKCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSB0YWIgZm9yIHVzZSBpbiB0YWJiZWQgbmF2aWdhdGlvbiBtb2RlLiBUaGUgdGFiIHdpbGwgYmUgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWIgVGFiIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZFRhYihUYWIgdGFiKTsKKworICAgIC8qKgorICAgICAqIEluc2VydCBhIHRhYiBmb3IgdXNlIGluIHRhYmJlZCBuYXZpZ2F0aW9uIG1vZGUuIFRoZSB0YWIgd2lsbCBiZSBpbnNlcnRlZCBhdAorICAgICAqIDxjb2RlPnBvc2l0aW9uPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWIgVGhlIHRhYiB0byBhZGQKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIG5ldyBwb3NpdGlvbiBvZiB0aGUgdGFiCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgaW5zZXJ0VGFiKFRhYiB0YWIsIGludCBwb3NpdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSB0YWIgZnJvbSB0aGUgYWN0aW9uIGJhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWIgVGhlIHRhYiB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVUYWIoVGFiIHRhYik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSB0YWIgZnJvbSB0aGUgYWN0aW9uIGJhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBQb3NpdGlvbiBvZiB0aGUgdGFiIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZVRhYkF0KGludCBwb3NpdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIHNwZWNpZmllZCB0YWIuIElmIGl0IGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgYWN0aW9uIGJhciBpdCB3aWxsIGJlIGFkZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHRhYiBUYWIgdG8gc2VsZWN0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2VsZWN0VGFiKFRhYiB0YWIpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgaGVpZ2h0IG9mIHRoZSBBY3Rpb25CYXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBBY3Rpb25CYXIncyBoZWlnaHQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEhlaWdodCgpOworCisgICAgLyoqCisgICAgICogU2hvdyB0aGUgQWN0aW9uQmFyIGlmIGl0IGlzIG5vdCBjdXJyZW50bHkgc2hvd2luZy4KKyAgICAgKiBJZiB0aGUgd2luZG93IGhvc3RpbmcgdGhlIEFjdGlvbkJhciBkb2VzIG5vdCBoYXZlIHRoZSBmZWF0dXJlCisgICAgICoge0BsaW5rIFdpbmRvdyNGRUFUVVJFX0FDVElPTl9CQVJfT1ZFUkxBWX0gaXQgd2lsbCByZXNpemUgYXBwbGljYXRpb24KKyAgICAgKiBjb250ZW50IHRvIGZpdCB0aGUgbmV3IHNwYWNlIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzaG93KCk7CisKKyAgICAvKioKKyAgICAgKiBIaWRlIHRoZSBBY3Rpb25CYXIgaWYgaXQgaXMgbm90IGN1cnJlbnRseSBzaG93aW5nLgorICAgICAqIElmIHRoZSB3aW5kb3cgaG9zdGluZyB0aGUgQWN0aW9uQmFyIGRvZXMgbm90IGhhdmUgdGhlIGZlYXR1cmUKKyAgICAgKiB7QGxpbmsgV2luZG93I0ZFQVRVUkVfQUNUSU9OX0JBUl9PVkVSTEFZfSBpdCB3aWxsIHJlc2l6ZSBhcHBsaWNhdGlvbgorICAgICAqIGNvbnRlbnQgdG8gZml0IHRoZSBuZXcgc3BhY2UgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGhpZGUoKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEFjdGlvbkJhciBpcyBzaG93aW5nLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzU2hvd2luZygpOworCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgaW50ZXJmYWNlIGZvciBBY3Rpb25CYXIgbmF2aWdhdGlvbiBldmVudHMuIAorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgTmF2aWdhdGlvbkNhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBhIG5hdmlnYXRpb24gaXRlbSBpbiB5b3VyIGFjdGlvbiBiYXIKKyAgICAgICAgICogaXMgc2VsZWN0ZWQuCisgICAgICAgICAqICAgIAorICAgICAgICAgKiBAcGFyYW0gaXRlbVBvc2l0aW9uIFBvc2l0aW9uIG9mIHRoZSBpdGVtIGNsaWNrZWQuCisgICAgICAgICAqIEBwYXJhbSBpdGVtSWQgSUQgb2YgdGhlIGl0ZW0gY2xpY2tlZC4KKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25OYXZpZ2F0aW9uSXRlbVNlbGVjdGVkKGludCBpdGVtUG9zaXRpb24sIGxvbmcgaXRlbUlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHRhYiBpbiB0aGUgYWN0aW9uIGJhci4KKyAgICAgKgorICAgICAqIDxwPlRhYnMgbWFuYWdlIHRoZSBoaWRpbmcgYW5kIHNob3dpbmcgb2Yge0BsaW5rIEZyYWdtZW50fXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBUYWIgeworICAgICAgICAvKioKKyAgICAgICAgICogQW4gaW52YWxpZCBwb3NpdGlvbiBmb3IgYSB0YWIuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgI2dldFBvc2l0aW9uKCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUE9TSVRJT04gPSAtMTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoaXMgdGFiIGluIHRoZSBhY3Rpb24gYmFyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIEN1cnJlbnQgcG9zaXRpb24sIG9yIHtAbGluayAjSU5WQUxJRF9QT1NJVElPTn0gaWYgdGhpcyB0YWIgaXMgbm90IGN1cnJlbnRseSBpbgorICAgICAgICAgKiAgICAgICAgIHRoZSBhY3Rpb24gYmFyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRQb3NpdGlvbigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIGljb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGFiLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSB0YWIncyBpY29uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgRHJhd2FibGUgZ2V0SWNvbigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIHRleHQgb2YgdGhpcyB0YWIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIHRhYidzIHRleHQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBDaGFyU2VxdWVuY2UgZ2V0VGV4dCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIGljb24gZGlzcGxheWVkIG9uIHRoaXMgdGFiLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaWNvbiBUaGUgZHJhd2FibGUgdG8gdXNlIGFzIGFuIGljb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEljb24oRHJhd2FibGUgaWNvbik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgdGV4dCBkaXNwbGF5ZWQgb24gdGhpcyB0YWIuIFRleHQgbWF5IGJlIHRydW5jYXRlZCBpZiB0aGVyZSBpcyBub3QKKyAgICAgICAgICogcm9vbSB0byBkaXNwbGF5IHRoZSBlbnRpcmUgc3RyaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBkaXNwbGF5CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgZnJhZ21lbnQgdGhhdCB3aWxsIGJlIHNob3duIHdoZW4gdGhpcyB0YWIgaXMgc2VsZWN0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gRnJhZ21lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGFiCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgRnJhZ21lbnQgZ2V0RnJhZ21lbnQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBmcmFnbWVudCB0aGF0IHdpbGwgYmUgc2hvd24gd2hlbiB0aGlzIHRhYiBpcyBzZWxlY3RlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGZyYWdtZW50IEZyYWdtZW50IHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgdGFiCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNlbGVjdCB0aGlzIHRhYi4gT25seSB2YWxpZCBpZiB0aGUgdGFiIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBhY3Rpb24gYmFyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2VsZWN0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQppbmRleCBmN2E5YTE4Li4zZmU5NzFmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQpAQCAtMTYsMTkgKzE2LDIyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hcHA7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWN0aW9uQmFySW1wbDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuUG9saWN5TWFuYWdlcjsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnRDYWxsYmFja3M7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DdXJzb3JMb2FkZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LklJbnRlbnRTZW5kZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CkBAIC0zOSw2ICs0Miw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKQEAgLTQ5LDcgKzUzLDkgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKQEAgLTU4LDE3ICs2NCwxNSBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CkBAIC0xMTAsNiArMTE0LDcgQEAKICAqIAogICogPHA+VG9waWNzIGNvdmVyZWQgaGVyZToKICAqIDxvbD4KKyAqIDxsaT48YSBocmVmPSIjRnJhZ21lbnRzIj5GcmFnbWVudHM8L2E+CiAgKiA8bGk+PGEgaHJlZj0iI0FjdGl2aXR5TGlmZWN5Y2xlIj5BY3Rpdml0eSBMaWZlY3ljbGU8L2E+CiAgKiA8bGk+PGEgaHJlZj0iI0NvbmZpZ3VyYXRpb25DaGFuZ2VzIj5Db25maWd1cmF0aW9uIENoYW5nZXM8L2E+CiAgKiA8bGk+PGEgaHJlZj0iI1N0YXJ0aW5nQWN0aXZpdGllcyI+U3RhcnRpbmcgQWN0aXZpdGllcyBhbmQgR2V0dGluZyBSZXN1bHRzPC9hPgpAQCAtMTE4LDYgKzEyMywxNCBAQAogICogPGxpPjxhIGhyZWY9IiNQcm9jZXNzTGlmZWN5Y2xlIj5Qcm9jZXNzIExpZmVjeWNsZTwvYT4KICAqIDwvb2w+CiAgKiAKKyAqIDxhIG5hbWU9IkZyYWdtZW50cyI+PC9hPgorICogPGgzPkZyYWdtZW50czwvaDM+CisgKgorICogPHA+U3RhcnRpbmcgd2l0aCB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0sIEFjdGl2aXR5CisgKiBpbXBsZW1lbnRhdGlvbnMgY2FuIG1ha2UgdXNlIG9mIHRoZSB7QGxpbmsgRnJhZ21lbnR9IGNsYXNzIHRvIGJldHRlcgorICogbW9kdWxhcml6ZSB0aGVpciBjb2RlLCBidWlsZCBtb3JlIHNvcGhpc3RpY2F0ZWQgdXNlciBpbnRlcmZhY2VzIGZvciBsYXJnZXIKKyAqIHNjcmVlbnMsIGFuZCBoZWxwIHNjYWxlIHRoZWlyIGFwcGxpY2F0aW9uIGJldHdlZW4gc21hbGwgYW5kIGxhcmdlIHNjcmVlbnMuCisgKgogICogPGEgbmFtZT0iQWN0aXZpdHlMaWZlY3ljbGUiPjwvYT4KICAqIDxoMz5BY3Rpdml0eSBMaWZlY3ljbGU8L2gzPgogICoKQEAgLTYwNyw2ICs2MjAsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGxvbmcgc0luc3RhbmNlQ291bnQgPSAwOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTkRPV19ISUVSQVJDSFlfVEFHID0gImFuZHJvaWQ6dmlld0hpZXJhcmNoeVN0YXRlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBR01FTlRTX1RBRyA9ICJhbmRyb2lkOmZyYWdtZW50cyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX0RJQUxPR19JRFNfS0VZID0gImFuZHJvaWQ6c2F2ZWREaWFsb2dJZHMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9ESUFMT0dTX1RBRyA9ICJhbmRyb2lkOnNhdmVkRGlhbG9ncyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX0RJQUxPR19LRVlfUFJFRklYID0gImFuZHJvaWQ6ZGlhbG9nXyI7CkBAIC02MjgsMTggKzY0MiwyOCBAQAogICAgIHByaXZhdGUgQ29tcG9uZW50TmFtZSBtQ29tcG9uZW50OwogICAgIC8qcGFja2FnZSovIEFjdGl2aXR5SW5mbyBtQWN0aXZpdHlJbmZvOwogICAgIC8qcGFja2FnZSovIEFjdGl2aXR5VGhyZWFkIG1NYWluVGhyZWFkOwotICAgIC8qcGFja2FnZSovIE9iamVjdCBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZTsKLSAgICAvKnBhY2thZ2UqLyBIYXNoTWFwPFN0cmluZyxPYmplY3Q+IG1MYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzOwogICAgIEFjdGl2aXR5IG1QYXJlbnQ7CiAgICAgYm9vbGVhbiBtQ2FsbGVkOworICAgIGJvb2xlYW4gbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyOworICAgIGJvb2xlYW4gbVN0YXJ0ZWQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1SZXN1bWVkOwogICAgIHByaXZhdGUgYm9vbGVhbiBtU3RvcHBlZDsKICAgICBib29sZWFuIG1GaW5pc2hlZDsKICAgICBib29sZWFuIG1TdGFydGVkQWN0aXZpdHk7CisgICAgLyoqIHRydWUgaWYgdGhlIGFjdGl2aXR5IGlzIGJlaW5nIGRlc3Ryb3llZCBpbiBvcmRlciB0byByZWNyZWF0ZSBpdCB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24gKi8KKyAgICAvKnBhY2thZ2UqLyBib29sZWFuIG1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gZmFsc2U7CiAgICAgLypwYWNrYWdlKi8gaW50IG1Db25maWdDaGFuZ2VGbGFnczsKICAgICAvKnBhY2thZ2UqLyBDb25maWd1cmF0aW9uIG1DdXJyZW50Q29uZmlnOwogICAgIHByaXZhdGUgU2VhcmNoTWFuYWdlciBtU2VhcmNoTWFuYWdlcjsKIAorICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzIHsKKyAgICAgICAgT2JqZWN0IGFjdGl2aXR5OworICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBjaGlsZHJlbjsKKyAgICAgICAgQXJyYXlMaXN0PEZyYWdtZW50PiBmcmFnbWVudHM7CisgICAgICAgIFNwYXJzZUFycmF5PExvYWRlck1hbmFnZXJJbXBsPiBsb2FkZXJzOworICAgIH0KKyAgICAvKiBwYWNrYWdlICovIE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzOworICAgIAogICAgIHByaXZhdGUgV2luZG93IG1XaW5kb3c7CiAKICAgICBwcml2YXRlIFdpbmRvd01hbmFnZXIgbVdpbmRvd01hbmFnZXI7CkBAIC02NDcsMTAgKzY3MSwxNiBAQAogICAgIC8qcGFja2FnZSovIGJvb2xlYW4gbVdpbmRvd0FkZGVkID0gZmFsc2U7CiAgICAgLypwYWNrYWdlKi8gYm9vbGVhbiBtVmlzaWJsZUZyb21TZXJ2ZXIgPSBmYWxzZTsKICAgICAvKnBhY2thZ2UqLyBib29sZWFuIG1WaXNpYmxlRnJvbUNsaWVudCA9IHRydWU7CisgICAgLypwYWNrYWdlKi8gQWN0aW9uQmFySW1wbCBtQWN0aW9uQmFyID0gbnVsbDsKIAogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UaXRsZTsKICAgICBwcml2YXRlIGludCBtVGl0bGVDb2xvciA9IDA7CiAKKyAgICBmaW5hbCBGcmFnbWVudE1hbmFnZXJJbXBsIG1GcmFnbWVudHMgPSBuZXcgRnJhZ21lbnRNYW5hZ2VySW1wbCgpOworICAgIAorICAgIFNwYXJzZUFycmF5PExvYWRlck1hbmFnZXJJbXBsPiBtQWxsTG9hZGVyTWFuYWdlcnM7CisgICAgTG9hZGVyTWFuYWdlckltcGwgbUxvYWRlck1hbmFnZXI7CisgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTWFuYWdlZEN1cnNvciB7CiAgICAgICAgIE1hbmFnZWRDdXJzb3IoQ3Vyc29yIGN1cnNvcikgewogICAgICAgICAgICAgbUN1cnNvciA9IGN1cnNvcjsKQEAgLTY3Nyw3ICs3MDcsNyBAQAogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRk9DVVNFRF9TVEFURV9TRVQgPSB7Y29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLnN0YXRlX2ZvY3VzZWR9OwogCiAgICAgcHJpdmF0ZSBUaHJlYWQgbVVpVGhyZWFkOwotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CiAKICAgICAvLyBVc2VkIGZvciBkZWJ1ZyBvbmx5CiAgICAgLyoKQEAgLTc0OCw2ICs3NzgsMzAgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIExvYWRlck1hbmFnZXIgZm9yIHRoaXMgZnJhZ21lbnQsIGNyZWF0aW5nIGl0IGlmIG5lZWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9hZGVyTWFuYWdlciBnZXRMb2FkZXJNYW5hZ2VyKCkgeworICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2FkZXJNYW5hZ2VyOworICAgICAgICB9CisgICAgICAgIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlciA9IHRydWU7CisgICAgICAgIG1Mb2FkZXJNYW5hZ2VyID0gZ2V0TG9hZGVyTWFuYWdlcigtMSwgbVN0YXJ0ZWQsIHRydWUpOworICAgICAgICByZXR1cm4gbUxvYWRlck1hbmFnZXI7CisgICAgfQorICAgIAorICAgIExvYWRlck1hbmFnZXJJbXBsIGdldExvYWRlck1hbmFnZXIoaW50IGluZGV4LCBib29sZWFuIHN0YXJ0ZWQsIGJvb2xlYW4gY3JlYXRlKSB7CisgICAgICAgIGlmIChtQWxsTG9hZGVyTWFuYWdlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbUFsbExvYWRlck1hbmFnZXJzID0gbmV3IFNwYXJzZUFycmF5PExvYWRlck1hbmFnZXJJbXBsPigpOworICAgICAgICB9CisgICAgICAgIExvYWRlck1hbmFnZXJJbXBsIGxtID0gbUFsbExvYWRlck1hbmFnZXJzLmdldChpbmRleCk7CisgICAgICAgIGlmIChsbSA9PSBudWxsICYmIGNyZWF0ZSkgeworICAgICAgICAgICAgbG0gPSBuZXcgTG9hZGVyTWFuYWdlckltcGwoc3RhcnRlZCk7CisgICAgICAgICAgICBtQWxsTG9hZGVyTWFuYWdlcnMucHV0KGluZGV4LCBsbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxtOworICAgIH0KKyAgICAKKyAgICAvKioKICAgICAgKiBDYWxscyB7QGxpbmsgYW5kcm9pZC52aWV3LldpbmRvdyNnZXRDdXJyZW50Rm9jdXN9IG9uIHRoZQogICAgICAqIFdpbmRvdyBvZiB0aGlzIEFjdGl2aXR5IHRvIHJldHVybiB0aGUgY3VycmVudGx5IGZvY3VzZWQgdmlldy4KICAgICAgKiAKQEAgLTgwMSw2ICs4NTUsMTUgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIG1WaXNpYmxlRnJvbUNsaWVudCA9ICFtV2luZG93LmdldFdpbmRvd1N0eWxlKCkuZ2V0Qm9vbGVhbigKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dfd2luZG93Tm9EaXNwbGF5LCBmYWxzZSk7CisgICAgICAgIGlmIChtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFsbExvYWRlck1hbmFnZXJzID0gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLmxvYWRlcnM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBQYXJjZWxhYmxlIHAgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0UGFyY2VsYWJsZShGUkFHTUVOVFNfVEFHKTsKKyAgICAgICAgICAgIG1GcmFnbWVudHMucmVzdG9yZUFsbFN0YXRlKHAsIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgID8gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLmZyYWdtZW50cyA6IG51bGwpOworICAgICAgICB9CisgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hDcmVhdGUoKTsKICAgICAgICAgbUNhbGxlZCA9IHRydWU7CiAgICAgfQogCkBAIC05MzMsNiArOTk2LDEzIEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TdGFydCgpIHsKICAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1Mb2FkZXJNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvU3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIGlmICghbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyKSB7CisgICAgICAgICAgICBtTG9hZGVyTWFuYWdlciA9IGdldExvYWRlck1hbmFnZXIoLTEsIG1TdGFydGVkLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyID0gdHJ1ZTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwODUsNiArMTE1NSwxMCBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CiAgICAgICAgIG91dFN0YXRlLnB1dEJ1bmRsZShXSU5ET1dfSElFUkFSQ0hZX1RBRywgbVdpbmRvdy5zYXZlSGllcmFyY2h5U3RhdGUoKSk7CisgICAgICAgIFBhcmNlbGFibGUgcCA9IG1GcmFnbWVudHMuc2F2ZUFsbFN0YXRlKCk7CisgICAgICAgIGlmIChwICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dFN0YXRlLnB1dFBhcmNlbGFibGUoRlJBR01FTlRTX1RBRywgcCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE0MDgsNyArMTQ4Miw4IEBACiAgICAgICoge0BsaW5rICNvblJldGFpbk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpfS4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldExhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZTsKKyAgICAgICAgcmV0dXJuIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyAhPSBudWxsCisgICAgICAgICAgICAgICAgPyBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMuYWN0aXZpdHkgOiBudWxsOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTE0MjAsNiArMTQ5NSwxMSBAQAogICAgICAqIHtAbGluayAjZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpfSBpbiB0aGUgbmV3IGFjdGl2aXR5CiAgICAgICogaW5zdGFuY2UuCiAgICAgICogCisgICAgICogPGVtPklmIHlvdSBhcmUgdGFyZ2V0aW5nIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjSE9ORVlDT01CfQorICAgICAqIG9yIGxhdGVyLCBjb25zaWRlciBpbnN0ZWFkIHVzaW5nIGEge0BsaW5rIEZyYWdtZW50fSB3aXRoCisgICAgICoge0BsaW5rIEZyYWdtZW50I3NldFJldGFpbkluc3RhbmNlKGJvb2xlYW4pCisgICAgICogRnJhZ21lbnQuc2V0UmV0YWluSW5zdGFuY2UoYm9vbGVhbn0uPC9lbT4KKyAgICAgKgogICAgICAqIDxwPlRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHB1cmVseSBhcyBhbiBvcHRpbWl6YXRpb24sIGFuZCB5b3UgbXVzdAogICAgICAqIG5vdCByZWx5IG9uIGl0IGJlaW5nIGNhbGxlZC4gIFdoZW4gaXQgaXMgY2FsbGVkLCBhIG51bWJlciBvZiBndWFyYW50ZWVzCiAgICAgICogd2lsbCBiZSBtYWRlIHRvIGhlbHAgb3B0aW1pemUgY29uZmlndXJhdGlvbiBzd2l0Y2hpbmc6CkBAIC0xNDY0LDggKzE1NDQsOSBAQAogICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgb2JqZWN0IHByZXZpb3VzbHkgcmV0dXJuZWQgYnkKICAgICAgKiB7QGxpbmsgI29uUmV0YWluTm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzKCl9CiAgICAgICovCi0gICAgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PiBnZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzKCkgewotICAgICAgICByZXR1cm4gbUxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXM7CisgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpIHsKKyAgICAgICAgcmV0dXJuIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyAhPSBudWxsCisgICAgICAgICAgICAgICAgPyBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMuY2hpbGRyZW4gOiBudWxsOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTE0NzksMTcgKzE1NjAsODggQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogICAgIAorICAgIE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgcmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcygpIHsKKyAgICAgICAgT2JqZWN0IGFjdGl2aXR5ID0gb25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKTsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gY2hpbGRyZW4gPSBvblJldGFpbk5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpOworICAgICAgICBBcnJheUxpc3Q8RnJhZ21lbnQ+IGZyYWdtZW50cyA9IG1GcmFnbWVudHMucmV0YWluTm9uQ29uZmlnKCk7CisgICAgICAgIGJvb2xlYW4gcmV0YWluTG9hZGVycyA9IGZhbHNlOworICAgICAgICBpZiAobUFsbExvYWRlck1hbmFnZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHBydW5lIG91dCBhbnkgbG9hZGVyIG1hbmFnZXJzIHRoYXQgd2VyZSBhbHJlYWR5IHN0b3BwZWQgYW5kIHNvCisgICAgICAgICAgICAvLyBoYXZlIG5vdGhpbmcgdXNlZnVsIHRvIHJldGFpbi4KKyAgICAgICAgICAgIGZvciAoaW50IGk9bUFsbExvYWRlck1hbmFnZXJzLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBMb2FkZXJNYW5hZ2VySW1wbCBsbSA9IG1BbGxMb2FkZXJNYW5hZ2Vycy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgIGlmIChsbS5tUmV0YWluaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHJldGFpbkxvYWRlcnMgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxtLmRvRGVzdHJveSgpOworICAgICAgICAgICAgICAgICAgICBtQWxsTG9hZGVyTWFuYWdlcnMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChhY3Rpdml0eSA9PSBudWxsICYmIGNoaWxkcmVuID09IG51bGwgJiYgZnJhZ21lbnRzID09IG51bGwgJiYgIXJldGFpbkxvYWRlcnMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzIG5jaSA9IG5ldyBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzKCk7CisgICAgICAgIG5jaS5hY3Rpdml0eSA9IGFjdGl2aXR5OworICAgICAgICBuY2kuY2hpbGRyZW4gPSBjaGlsZHJlbjsKKyAgICAgICAgbmNpLmZyYWdtZW50cyA9IGZyYWdtZW50czsKKyAgICAgICAgbmNpLmxvYWRlcnMgPSBtQWxsTG9hZGVyTWFuYWdlcnM7CisgICAgICAgIHJldHVybiBuY2k7CisgICAgfQorICAgIAogICAgIHB1YmxpYyB2b2lkIG9uTG93TWVtb3J5KCkgewogICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKICAgICB9CiAgICAgCiAgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBGcmFnbWVudE1hbmFnZXIgZm9yIGludGVyYWN0aW5nIHdpdGggZnJhZ21lbnRzIGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIHRoaXMgYWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50TWFuYWdlciBnZXRGcmFnbWVudE1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgc2VyaWVzIG9mIGVkaXQgb3BlcmF0aW9ucyBvbiB0aGUgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgYWN0aXZpdHkuCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0RnJhZ21lbnRNYW5hZ2VyfS4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIG9wZW5GcmFnbWVudFRyYW5zYWN0aW9uKCkgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBpbnZhbGlkYXRlRnJhZ21lbnRJbmRleChpbnQgaW5kZXgpIHsKKyAgICAgICAgLy9Mb2cudihUQUcsICJpbnZhbGlkYXRlRnJhZ21lbnRJbmRleDogaW5kZXg9IiArIGluZGV4KTsKKyAgICAgICAgaWYgKG1BbGxMb2FkZXJNYW5hZ2VycyAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2FkZXJNYW5hZ2VySW1wbCBsbSA9IG1BbGxMb2FkZXJNYW5hZ2Vycy5nZXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKGxtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsbS5kb0Rlc3Ryb3koKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BbGxMb2FkZXJNYW5hZ2Vycy5yZW1vdmUoaW5kZXgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgRnJhZ21lbnQgaXMgYmVpbmcgYXR0YWNoZWQgdG8gdGhpcyBhY3Rpdml0eSwgaW1tZWRpYXRlbHkKKyAgICAgKiBhZnRlciB0aGUgY2FsbCB0byBpdHMge0BsaW5rIEZyYWdtZW50I29uQXR0YWNoIEZyYWdtZW50Lm9uQXR0YWNoKCl9CisgICAgICogbWV0aG9kIGFuZCBiZWZvcmUge0BsaW5rIEZyYWdtZW50I29uQ3JlYXRlIEZyYWdtZW50Lm9uQ3JlYXRlKCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogV3JhcHBlciBhcm91bmQKICAgICAgKiB7QGxpbmsgQ29udGVudFJlc29sdmVyI3F1ZXJ5KGFuZHJvaWQubmV0LlVyaSAsIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpfQogICAgICAqIHRoYXQgZ2l2ZXMgdGhlIHJlc3VsdGluZyB7QGxpbmsgQ3Vyc29yfSB0byBjYWxsCiAgICAgICoge0BsaW5rICNzdGFydE1hbmFnaW5nQ3Vyc29yfSBzbyB0aGF0IHRoZSBhY3Rpdml0eSB3aWxsIG1hbmFnZSBpdHMKICAgICAgKiBsaWZlY3ljbGUgZm9yIHlvdS4KICAgICAgKiAKKyAgICAgKiA8ZW0+SWYgeW91IGFyZSB0YXJnZXRpbmcge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJ9CisgICAgICogb3IgbGF0ZXIsIGNvbnNpZGVyIGluc3RlYWQgdXNpbmcge0BsaW5rIExvYWRlck1hbmFnZXJ9IGluc3RlYWQsIGF2YWlsYWJsZQorICAgICAqIHZpYSB7QGxpbmsgI2dldExvYWRlck1hbmFnZXIoKX0uPC9lbT4KKyAgICAgKgogICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgY29udGVudCBwcm92aWRlciB0byBxdWVyeS4KICAgICAgKiBAcGFyYW0gcHJvamVjdGlvbiBMaXN0IG9mIGNvbHVtbnMgdG8gcmV0dXJuLgogICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gU1FMIFdIRVJFIGNsYXVzZS4KQEAgLTE1MDAsMTIgKzE2NTIsMTIgQEAKICAgICAgKiBAc2VlIENvbnRlbnRSZXNvbHZlciNxdWVyeShhbmRyb2lkLm5ldC5VcmkgLCBTdHJpbmdbXSwgU3RyaW5nLCBTdHJpbmdbXSwgU3RyaW5nKQogICAgICAqIEBzZWUgI3N0YXJ0TWFuYWdpbmdDdXJzb3IKICAgICAgKiBAaGlkZQorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDdXJzb3JMb2FkZXJ9IGluc3RlYWQuCiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIEN1cnNvciBtYW5hZ2VkUXVlcnkoVXJpIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNvcnRPcmRlcikKLSAgICB7CisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgZmluYWwgQ3Vyc29yIG1hbmFnZWRRdWVyeShVcmkgdXJpLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLAorICAgICAgICAgICAgU3RyaW5nIHNvcnRPcmRlcikgewogICAgICAgICBDdXJzb3IgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KHVyaSwgcHJvamVjdGlvbiwgc2VsZWN0aW9uLCBudWxsLCBzb3J0T3JkZXIpOwogICAgICAgICBpZiAoYyAhPSBudWxsKSB7CiAgICAgICAgICAgICBzdGFydE1hbmFnaW5nQ3Vyc29yKGMpOwpAQCAtMTUyMCw2ICsxNjcyLDEwIEBACiAgICAgICoge0BsaW5rICNzdGFydE1hbmFnaW5nQ3Vyc29yfSBzbyB0aGF0IHRoZSBhY3Rpdml0eSB3aWxsIG1hbmFnZSBpdHMKICAgICAgKiBsaWZlY3ljbGUgZm9yIHlvdS4KICAgICAgKiAKKyAgICAgKiA8ZW0+SWYgeW91IGFyZSB0YXJnZXRpbmcge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJ9CisgICAgICogb3IgbGF0ZXIsIGNvbnNpZGVyIGluc3RlYWQgdXNpbmcge0BsaW5rIExvYWRlck1hbmFnZXJ9IGluc3RlYWQsIGF2YWlsYWJsZQorICAgICAqIHZpYSB7QGxpbmsgI2dldExvYWRlck1hbmFnZXIoKX0uPC9lbT4KKyAgICAgKgogICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgY29udGVudCBwcm92aWRlciB0byBxdWVyeS4KICAgICAgKiBAcGFyYW0gcHJvamVjdGlvbiBMaXN0IG9mIGNvbHVtbnMgdG8gcmV0dXJuLgogICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gU1FMIFdIRVJFIGNsYXVzZS4KQEAgLTE1MzAsMTMgKzE2ODYsMTIgQEAKICAgICAgKiAKICAgICAgKiBAc2VlIENvbnRlbnRSZXNvbHZlciNxdWVyeShhbmRyb2lkLm5ldC5VcmkgLCBTdHJpbmdbXSwgU3RyaW5nLCBTdHJpbmdbXSwgU3RyaW5nKQogICAgICAqIEBzZWUgI3N0YXJ0TWFuYWdpbmdDdXJzb3IKKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQ3Vyc29yTG9hZGVyfSBpbnN0ZWFkLgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBDdXJzb3IgbWFuYWdlZFF1ZXJ5KFVyaSB1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcHJvamVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNvcnRPcmRlcikKLSAgICB7CisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgZmluYWwgQ3Vyc29yIG1hbmFnZWRRdWVyeShVcmkgdXJpLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLAorICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlcikgewogICAgICAgICBDdXJzb3IgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KHVyaSwgcHJvamVjdGlvbiwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBzb3J0T3JkZXIpOwogICAgICAgICBpZiAoYyAhPSBudWxsKSB7CiAgICAgICAgICAgICBzdGFydE1hbmFnaW5nQ3Vyc29yKGMpOwpAQCAtMTU0NSw0MCArMTcwMCw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JhcHBlciBhcm91bmQge0BsaW5rIEN1cnNvciNjb21taXRVcGRhdGVzKCl9IHRoYXQgdGFrZXMgY2FyZSBvZiBub3RpbmcKLSAgICAgKiB0aGF0IHRoZSBDdXJzb3IgbmVlZHMgdG8gYmUgcmVxdWVyaWVkLiAgWW91IGNhbiBjYWxsIHRoaXMgbWV0aG9kIGluCi0gICAgICoge0BsaW5rICNvblBhdXNlfSBvciB7QGxpbmsgI29uU3RvcH0gdG8gaGF2ZSB0aGUgc3lzdGVtIGNhbGwKLSAgICAgKiB7QGxpbmsgQ3Vyc29yI3JlcXVlcnl9IGZvciB5b3UgaWYgdGhlIGFjdGl2aXR5IGlzIGxhdGVyIHJlc3VtZWQuICBUaGlzCi0gICAgICogYWxsb3dzIHlvdSB0byBhdm9pZCBkZXRlcm1pbmcgd2hlbiB0byBkbyB0aGUgcmVxdWVyeSB5b3Vyc2VsZiAod2hpY2ggaXMKLSAgICAgKiByZXF1aXJlZCBmb3IgdGhlIEN1cnNvciB0byBzZWUgYW55IGRhdGEgY2hhbmdlcyB0aGF0IHdlcmUgY29tbWl0dGVkIHdpdGgKLSAgICAgKiBpdCkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGMgVGhlIEN1cnNvciB3aG9zZSBjaGFuZ2VzIGFyZSB0byBiZSBjb21taXR0ZWQuCi0gICAgICogCi0gICAgICogQHNlZSAjbWFuYWdlZFF1ZXJ5KGFuZHJvaWQubmV0LlVyaSAsIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpCi0gICAgICogQHNlZSAjc3RhcnRNYW5hZ2luZ0N1cnNvcgotICAgICAqIEBzZWUgQ3Vyc29yI2NvbW1pdFVwZGF0ZXMoKQotICAgICAqIEBzZWUgQ3Vyc29yI3JlcXVlcnkKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHZvaWQgbWFuYWdlZENvbW1pdFVwZGF0ZXMoQ3Vyc29yIGMpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTWFuYWdlZEN1cnNvcnMpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBOID0gbU1hbmFnZWRDdXJzb3JzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgICAgICBNYW5hZ2VkQ3Vyc29yIG1jID0gbU1hbmFnZWRDdXJzb3JzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAobWMubUN1cnNvciA9PSBjKSB7Ci0gICAgICAgICAgICAgICAgICAgIGMuY29tbWl0VXBkYXRlcygpOwotICAgICAgICAgICAgICAgICAgICBtYy5tVXBkYXRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ3Vyc29yICIgKyBjICsgIiBpcyBub3QgY3VycmVudGx5IG1hbmFnZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgogICAgICAqIFRoaXMgbWV0aG9kIGFsbG93cyB0aGUgYWN0aXZpdHkgdG8gdGFrZSBjYXJlIG9mIG1hbmFnaW5nIHRoZSBnaXZlbgogICAgICAqIHtAbGluayBDdXJzb3J9J3MgbGlmZWN5Y2xlIGZvciB5b3UgYmFzZWQgb24gdGhlIGFjdGl2aXR5J3MgbGlmZWN5Y2xlLgogICAgICAqIFRoYXQgaXMsIHdoZW4gdGhlIGFjdGl2aXR5IGlzIHN0b3BwZWQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGNhbGwKQEAgLTE1ODYsMTEgKzE3MDcsMTggQEAKICAgICAgKiBpdCB3aWxsIGNhbGwge0BsaW5rIEN1cnNvciNyZXF1ZXJ5fSBmb3IgeW91LiAgV2hlbiB0aGUgYWN0aXZpdHkgaXMKICAgICAgKiBkZXN0cm95ZWQsIGFsbCBtYW5hZ2VkIEN1cnNvcnMgd2lsbCBiZSBjbG9zZWQgYXV0b21hdGljYWxseS4KICAgICAgKiAKKyAgICAgKiA8ZW0+SWYgeW91IGFyZSB0YXJnZXRpbmcge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJ9CisgICAgICogb3IgbGF0ZXIsIGNvbnNpZGVyIGluc3RlYWQgdXNpbmcge0BsaW5rIExvYWRlck1hbmFnZXJ9IGluc3RlYWQsIGF2YWlsYWJsZQorICAgICAqIHZpYSB7QGxpbmsgI2dldExvYWRlck1hbmFnZXIoKX0uPC9lbT4KKyAgICAgKgogICAgICAqIEBwYXJhbSBjIFRoZSBDdXJzb3IgdG8gYmUgbWFuYWdlZC4KICAgICAgKiAKICAgICAgKiBAc2VlICNtYW5hZ2VkUXVlcnkoYW5kcm9pZC5uZXQuVXJpICwgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZykKICAgICAgKiBAc2VlICNzdG9wTWFuYWdpbmdDdXJzb3IKKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQ3Vyc29yTG9hZGVyfSBpbnN0ZWFkLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc3RhcnRNYW5hZ2luZ0N1cnNvcihDdXJzb3IgYykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1NYW5hZ2VkQ3Vyc29ycykgewogICAgICAgICAgICAgbU1hbmFnZWRDdXJzb3JzLmFkZChuZXcgTWFuYWdlZEN1cnNvcihjKSk7CkBAIC0xNjA1LDcgKzE3MzMsMTAgQEAKICAgICAgKiBAcGFyYW0gYyBUaGUgQ3Vyc29yIHRoYXQgd2FzIGJlaW5nIG1hbmFnZWQuCiAgICAgICogCiAgICAgICogQHNlZSAjc3RhcnRNYW5hZ2luZ0N1cnNvcgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDdXJzb3JMb2FkZXJ9IGluc3RlYWQuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBzdG9wTWFuYWdpbmdDdXJzb3IoQ3Vyc29yIGMpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTWFuYWdlZEN1cnNvcnMpIHsKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbU1hbmFnZWRDdXJzb3JzLnNpemUoKTsKQEAgLTE2NTYsNyArMTc4Nyw1NCBAQAogICAgIHB1YmxpYyBWaWV3IGZpbmRWaWV3QnlJZChpbnQgaWQpIHsKICAgICAgICAgcmV0dXJuIGdldFdpbmRvdygpLmZpbmRWaWV3QnlJZChpZCk7CiAgICAgfQotCisgICAgCisgICAgLyoqCisgICAgICogUmV0cmlldmUgYSByZWZlcmVuY2UgdG8gdGhpcyBhY3Rpdml0eSdzIEFjdGlvbkJhci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIEFjdGl2aXR5J3MgQWN0aW9uQmFyLCBvciBudWxsIGlmIGl0IGRvZXMgbm90IGhhdmUgb25lLgorICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25CYXIgZ2V0QWN0aW9uQmFyKCkgeworICAgICAgICBpbml0QWN0aW9uQmFyKCk7CisgICAgICAgIHJldHVybiBtQWN0aW9uQmFyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IEFjdGlvbkJhciwgbG9jYXRlcyB0aGUgaW5mbGF0ZWQgQWN0aW9uQmFyVmlldywKKyAgICAgKiBpbml0aWFsaXplcyB0aGUgQWN0aW9uQmFyIHdpdGggdGhlIHZpZXcsIGFuZCBzZXRzIG1BY3Rpb25CYXIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRBY3Rpb25CYXIoKSB7CisgICAgICAgIFdpbmRvdyB3aW5kb3cgPSBnZXRXaW5kb3coKTsKKyAgICAgICAgaWYgKGlzQ2hpbGQoKSB8fCAhd2luZG93Lmhhc0ZlYXR1cmUoV2luZG93LkZFQVRVUkVfQUNUSU9OX0JBUikgfHwgbUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1BY3Rpb25CYXIgPSBuZXcgQWN0aW9uQmFySW1wbCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogRmluZHMgYSBmcmFnbWVudCB0aGF0IHdhcyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBpZCBlaXRoZXIgd2hlbiBpbmZsYXRlZAorICAgICAqIGZyb20gWE1MIG9yIGFzIHRoZSBjb250YWluZXIgSUQgd2hlbiBhZGRlZCBpbiBhIHRyYW5zYWN0aW9uLiAgVGhpcyBvbmx5CisgICAgICogcmV0dXJucyBmcmFnbWVudHMgdGhhdCBhcmUgY3VycmVudGx5IGFkZGVkIHRvIHRoZSBhY3Rpdml0eSdzIGNvbnRlbnQuCisgICAgICogQHJldHVybiBUaGUgZnJhZ21lbnQgaWYgZm91bmQgb3IgbnVsbCBvdGhlcndpc2UuCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0RnJhZ21lbnRNYW5hZ2VyfS4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeUlkKGludCBpZCkgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5maW5kRnJhZ21lbnRCeUlkKGlkKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogRmluZHMgYSBmcmFnbWVudCB0aGF0IHdhcyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiB0YWcgZWl0aGVyIHdoZW4gaW5mbGF0ZWQKKyAgICAgKiBmcm9tIFhNTCBvciBhcyBzdXBwbGllZCB3aGVuIGFkZGVkIGluIGEgdHJhbnNhY3Rpb24uICBUaGlzIG9ubHkKKyAgICAgKiByZXR1cm5zIGZyYWdtZW50cyB0aGF0IGFyZSBjdXJyZW50bHkgYWRkZWQgdG8gdGhlIGFjdGl2aXR5J3MgY29udGVudC4KKyAgICAgKiBAcmV0dXJuIFRoZSBmcmFnbWVudCBpZiBmb3VuZCBvciBudWxsIG90aGVyd2lzZS4KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRGcmFnbWVudE1hbmFnZXJ9LgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIEZyYWdtZW50IGZpbmRGcmFnbWVudEJ5VGFnKFN0cmluZyB0YWcpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudHMuZmluZEZyYWdtZW50QnlUYWcodGFnKTsKKyAgICB9CisgICAgCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBhY3Rpdml0eSBjb250ZW50IGZyb20gYSBsYXlvdXQgcmVzb3VyY2UuICBUaGUgcmVzb3VyY2Ugd2lsbCBiZQogICAgICAqIGluZmxhdGVkLCBhZGRpbmcgYWxsIHRvcC1sZXZlbCB2aWV3cyB0byB0aGUgYWN0aXZpdHkuCkBAIC0xNjY1LDYgKzE4NDMsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRWaWV3KGludCBsYXlvdXRSZXNJRCkgewogICAgICAgICBnZXRXaW5kb3coKS5zZXRDb250ZW50VmlldyhsYXlvdXRSZXNJRCk7CisgICAgICAgIGluaXRBY3Rpb25CYXIoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE2NzYsNiArMTg1NSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFZpZXcoVmlldyB2aWV3KSB7CiAgICAgICAgIGdldFdpbmRvdygpLnNldENvbnRlbnRWaWV3KHZpZXcpOworICAgICAgICBpbml0QWN0aW9uQmFyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjg4LDYgKzE4NjgsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRWaWV3KFZpZXcgdmlldywgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMpIHsKICAgICAgICAgZ2V0V2luZG93KCkuc2V0Q29udGVudFZpZXcodmlldywgcGFyYW1zKTsKKyAgICAgICAgaW5pdEFjdGlvbkJhcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY5OSw2ICsxODgwLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRDb250ZW50VmlldyhWaWV3IHZpZXcsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zKSB7CiAgICAgICAgIGdldFdpbmRvdygpLmFkZENvbnRlbnRWaWV3KHZpZXcsIHBhcmFtcyk7CisgICAgICAgIGluaXRBY3Rpb25CYXIoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE5MjIsMTIgKzIxMDQsNjUgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCisgICAgICogRmxhZyBmb3Ige0BsaW5rICNwb3BCYWNrU3RhY2soU3RyaW5nLCBpbnQpfQorICAgICAqIGFuZCB7QGxpbmsgI3BvcEJhY2tTdGFjayhpbnQsIGludCl9OiBJZiBzZXQsIGFuZCB0aGUgbmFtZSBvciBJRCBvZgorICAgICAqIGEgYmFjayBzdGFjayBlbnRyeSBoYXMgYmVlbiBzdXBwbGllZCwgdGhlbiBhbGwgbWF0Y2hpbmcgZW50cmllcyB3aWxsCisgICAgICogYmUgY29uc3VtZWQgdW50aWwgb25lIHRoYXQgZG9lc24ndCBtYXRjaCBpcyBmb3VuZCBvciB0aGUgYm90dG9tIG9mCisgICAgICogdGhlIHN0YWNrIGlzIHJlYWNoZWQuICBPdGhlcndpc2UsIGFsbCBlbnRyaWVzIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIHRoYXQgZW50cnkKKyAgICAgKiB3aWxsIGJlIHJlbW92ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFID0gMTw8MDsKKworICAgIC8qKgorICAgICAqIFBvcCB0aGUgdG9wIHN0YXRlIG9mZiB0aGUgYmFjayBzdGFjay4gIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSB3YXMgb25lCisgICAgICogdG8gcG9wLCBlbHNlIGZhbHNlLgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldEZyYWdtZW50TWFuYWdlcn0uCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLnBvcEJhY2tTdGFjaygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcCB0aGUgbGFzdCBmcmFnbWVudCB0cmFuc2l0aW9uIGZyb20gdGhlIGxvY2FsIGFjdGl2aXR5J3MgZnJhZ21lbnQKKyAgICAgKiBiYWNrIHN0YWNrLiAgSWYgdGhlcmUgaXMgbm90aGluZyB0byBwb3AsIGZhbHNlIGlzIHJldHVybmVkLgorICAgICAqIEBwYXJhbSBuYW1lIElmIG5vbi1udWxsLCB0aGlzIGlzIHRoZSBuYW1lIG9mIGEgcHJldmlvdXMgYmFjayBzdGF0ZQorICAgICAqIHRvIGxvb2sgZm9yOyBpZiBmb3VuZCwgYWxsIHN0YXRlcyB1cCB0byB0aGF0IHN0YXRlIHdpbGwgYmUgcG9wcGVkLiAgVGhlCisgICAgICoge0BsaW5rICNQT1BfQkFDS19TVEFDS19JTkNMVVNJVkV9IGZsYWcgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB3aGV0aGVyCisgICAgICogdGhlIG5hbWVkIHN0YXRlIGl0c2VsZiBpcyBwb3BwZWQuIElmIG51bGwsIG9ubHkgdGhlIHRvcCBzdGF0ZSBpcyBwb3BwZWQuCisgICAgICogQHBhcmFtIGZsYWdzIEVpdGhlciAwIG9yIHtAbGluayAjUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFfS4KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRGcmFnbWVudE1hbmFnZXJ9LgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrKFN0cmluZyBuYW1lLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudHMucG9wQmFja1N0YWNrKG5hbWUsIGZsYWdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3AgYWxsIGJhY2sgc3RhY2sgc3RhdGVzIHVwIHRvIHRoZSBvbmUgd2l0aCB0aGUgZ2l2ZW4gaWRlbnRpZmllci4KKyAgICAgKiBAcGFyYW0gaWQgSWRlbnRpZmllciBvZiB0aGUgc3RhdGVkIHRvIGJlIHBvcHBlZC4gSWYgbm8gaWRlbnRpZmllciBleGlzdHMsCisgICAgICogZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogVGhlIGlkZW50aWZpZXIgaXMgdGhlIG51bWJlciByZXR1cm5lZCBieQorICAgICAqIHtAbGluayBGcmFnbWVudFRyYW5zYWN0aW9uI2NvbW1pdCgpIEZyYWdtZW50VHJhbnNhY3Rpb24uY29tbWl0KCl9LiAgVGhlCisgICAgICoge0BsaW5rICNQT1BfQkFDS19TVEFDS19JTkNMVVNJVkV9IGZsYWcgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB3aGV0aGVyCisgICAgICogdGhlIG5hbWVkIHN0YXRlIGl0c2VsZiBpcyBwb3BwZWQuCisgICAgICogQHBhcmFtIGZsYWdzIEVpdGhlciAwIG9yIHtAbGluayAjUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFfS4KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRGcmFnbWVudE1hbmFnZXJ9LgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrKGludCBpZCwgaW50IGZsYWdzKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLnBvcEJhY2tTdGFjayhpZCwgZmxhZ3MpOworICAgIH0KKyAgICAKKyAgICAvKioKICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaGFzIGRldGVjdGVkIHRoZSB1c2VyJ3MgcHJlc3Mgb2YgdGhlIGJhY2sKICAgICAgKiBrZXkuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgZmluaXNoZXMgdGhlIGN1cnJlbnQgYWN0aXZpdHksCiAgICAgICogYnV0IHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyB0byBkbyB3aGF0ZXZlciB5b3Ugd2FudC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBvbkJhY2tQcmVzc2VkKCkgewotICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgaWYgKCFtRnJhZ21lbnRzLnBvcEJhY2tTdGFjaygpKSB7CisgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgfQogICAgIH0KICAgICAKICAgICAvKioKQEAgLTIxNjUsNyArMjQwMCw5IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVQYW5lbE1lbnUoaW50IGZlYXR1cmVJZCwgTWVudSBtZW51KSB7CiAgICAgICAgIGlmIChmZWF0dXJlSWQgPT0gV2luZG93LkZFQVRVUkVfT1BUSU9OU19QQU5FTCkgewotICAgICAgICAgICAgcmV0dXJuIG9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSk7CisgICAgICAgICAgICBib29sZWFuIHNob3cgPSBvbkNyZWF0ZU9wdGlvbnNNZW51KG1lbnUpOworICAgICAgICAgICAgc2hvdyB8PSBtRnJhZ21lbnRzLmRpc3BhdGNoQ3JlYXRlT3B0aW9uc01lbnUobWVudSwgZ2V0TWVudUluZmxhdGVyKCkpOworICAgICAgICAgICAgcmV0dXJuIHNob3c7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTIxODIsNiArMjQxOSw3IEBACiAgICAgcHVibGljIGJvb2xlYW4gb25QcmVwYXJlUGFuZWwoaW50IGZlYXR1cmVJZCwgVmlldyB2aWV3LCBNZW51IG1lbnUpIHsKICAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBXaW5kb3cuRkVBVFVSRV9PUFRJT05TX1BBTkVMICYmIG1lbnUgIT0gbnVsbCkgewogICAgICAgICAgICAgYm9vbGVhbiBnb2Zvcml0ID0gb25QcmVwYXJlT3B0aW9uc01lbnUobWVudSk7CisgICAgICAgICAgICBnb2Zvcml0IHw9IG1GcmFnbWVudHMuZGlzcGF0Y2hQcmVwYXJlT3B0aW9uc01lbnUobWVudSk7CiAgICAgICAgICAgICByZXR1cm4gZ29mb3JpdCAmJiBtZW51Lmhhc1Zpc2libGVJdGVtcygpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMjIxMiwxMSArMjQ1MCwxNyBAQAogICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyY2xhc3MncyBpbXBsbWVlbnRhdGlvbiBvZiBlYWNoCiAgICAgICAgICAgICAgICAgLy8gb2YgdGhlc2UgbWV0aG9kcyBiZWxvdwogICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNTAwMDAsIDAsIGl0ZW0uZ2V0VGl0bGVDb25kZW5zZWQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9uT3B0aW9uc0l0ZW1TZWxlY3RlZChpdGVtKTsKKyAgICAgICAgICAgICAgICBpZiAob25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5kaXNwYXRjaE9wdGlvbnNJdGVtU2VsZWN0ZWQoaXRlbSk7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBjYXNlIFdpbmRvdy5GRUFUVVJFX0NPTlRFWFRfTUVOVToKICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KDUwMDAwLCAxLCBpdGVtLmdldFRpdGxlQ29uZGVuc2VkKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBvbkNvbnRleHRJdGVtU2VsZWN0ZWQoaXRlbSk7CisgICAgICAgICAgICAgICAgaWYgKG9uQ29udGV4dEl0ZW1TZWxlY3RlZChpdGVtKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1GcmFnbWVudHMuZGlzcGF0Y2hDb250ZXh0SXRlbVNlbGVjdGVkKGl0ZW0pOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yMjM1LDYgKzI0NzksNyBAQAogICAgIHB1YmxpYyB2b2lkIG9uUGFuZWxDbG9zZWQoaW50IGZlYXR1cmVJZCwgTWVudSBtZW51KSB7CiAgICAgICAgIHN3aXRjaCAoZmVhdHVyZUlkKSB7CiAgICAgICAgICAgICBjYXNlIFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUw6CisgICAgICAgICAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaE9wdGlvbnNNZW51Q2xvc2VkKG1lbnUpOwogICAgICAgICAgICAgICAgIG9uT3B0aW9uc01lbnVDbG9zZWQobWVudSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgCkBAIC0yMjQ1LDYgKzI0OTAsMTUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBEZWNsYXJlIHRoYXQgdGhlIG9wdGlvbnMgbWVudSBoYXMgY2hhbmdlZCwgc28gc2hvdWxkIGJlIHJlY3JlYXRlZC4KKyAgICAgKiBUaGUge0BsaW5rICNvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUpfSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgdGhlIG5leHQKKyAgICAgKiB0aW1lIGl0IG5lZWRzIHRvIGJlIGRpc3BsYXllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlT3B0aW9uc01lbnUoKSB7CisgICAgICAgIG1XaW5kb3cuaW52YWxpZGF0ZVBhbmVsTWVudShXaW5kb3cuRkVBVFVSRV9PUFRJT05TX1BBTkVMKTsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YgdGhlIEFjdGl2aXR5J3Mgc3RhbmRhcmQgb3B0aW9ucyBtZW51LiAgWW91CiAgICAgICogc2hvdWxkIHBsYWNlIHlvdXIgbWVudSBpdGVtcyBpbiB0byA8dmFyPm1lbnU8L3Zhcj4uCiAgICAgICogCkBAIC0yNDY3LDYgKzI3MjEsOSBAQAogICAgICAqIGJ5IHRoZSBhY3Rpdml0eS4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbGxzIHRocm91Z2ggdG8KICAgICAgKiB7QGxpbmsgI29uQ3JlYXRlRGlhbG9nKGludCl9IGZvciBjb21wYXRpYmlsaXR5LgogICAgICAqCisgICAgICogPGVtPklmIHlvdSBhcmUgdGFyZ2V0aW5nIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjSE9ORVlDT01CfQorICAgICAqIG9yIGxhdGVyLCBjb25zaWRlciBpbnN0ZWFkIHVzaW5nIGEge0BsaW5rIERpYWxvZ0ZyYWdtZW50fSBpbnN0ZWFkLjwvZW0+CisgICAgICoKICAgICAgKiA8cD5JZiB5b3UgdXNlIHtAbGluayAjc2hvd0RpYWxvZyhpbnQpfSwgdGhlIGFjdGl2aXR5IHdpbGwgY2FsbCB0aHJvdWdoIHRvCiAgICAgICogdGhpcyBtZXRob2QgdGhlIGZpcnN0IHRpbWUsIGFuZCBoYW5nIG9udG8gaXQgdGhlcmVhZnRlci4gIEFueSBkaWFsb2cKICAgICAgKiB0aGF0IGlzIGNyZWF0ZWQgYnkgdGhpcyBtZXRob2Qgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHNhdmVkIGFuZCByZXN0b3JlZApAQCAtMjUzOSw2ICsyNzk2LDkgQEAKICAgICAgKiB3aWxsIGJlIG1hZGUgd2l0aCB0aGUgc2FtZSBpZCB0aGUgZmlyc3QgdGltZSB0aGlzIGlzIGNhbGxlZCBmb3IgYSBnaXZlbgogICAgICAqIGlkLiAgRnJvbSB0aGVyZWFmdGVyLCB0aGUgZGlhbG9nIHdpbGwgYmUgYXV0b21hdGljYWxseSBzYXZlZCBhbmQgcmVzdG9yZWQuCiAgICAgICoKKyAgICAgKiA8ZW0+SWYgeW91IGFyZSB0YXJnZXRpbmcge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJ9CisgICAgICogb3IgbGF0ZXIsIGNvbnNpZGVyIGluc3RlYWQgdXNpbmcgYSB7QGxpbmsgRGlhbG9nRnJhZ21lbnR9IGluc3RlYWQuPC9lbT4KKyAgICAgKgogICAgICAqIDxwPkVhY2ggdGltZSBhIGRpYWxvZyBpcyBzaG93biwge0BsaW5rICNvblByZXBhcmVEaWFsb2coaW50LCBEaWFsb2csIEJ1bmRsZSl9IHdpbGwKICAgICAgKiBiZSBtYWRlIHRvIHByb3ZpZGUgYW4gb3Bwb3J0dW5pdHkgdG8gZG8gYW55IHRpbWVseSBwcmVwYXJhdGlvbi4KICAgICAgKgpAQCAtMzA4Niw2ICszMzQ2LDM2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIEZyYWdtZW50IGluIHRoaXMgYWN0aXZpdHkgY2FsbHMgaXRzIAorICAgICAqIHtAbGluayBGcmFnbWVudCNzdGFydEFjdGl2aXR5fSBvciB7QGxpbmsgRnJhZ21lbnQjc3RhcnRBY3Rpdml0eUZvclJlc3VsdH0KKyAgICAgKiBtZXRob2QuCisgICAgICogCisgICAgICogPHA+VGhpcyBtZXRob2QgdGhyb3dzIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbn0KKyAgICAgKiBpZiB0aGVyZSB3YXMgbm8gQWN0aXZpdHkgZm91bmQgdG8gcnVuIHRoZSBnaXZlbiBJbnRlbnQuCisgICAgICogCisgICAgICogQHBhcmFtIGZyYWdtZW50IFRoZSBmcmFnbWVudCBtYWtpbmcgdGhlIGNhbGwuCisgICAgICogQHBhcmFtIGludGVudCBUaGUgaW50ZW50IHRvIHN0YXJ0LgorICAgICAqIEBwYXJhbSByZXF1ZXN0Q29kZSBSZXBseSByZXF1ZXN0IGNvZGUuICA8IDAgaWYgcmVwbHkgaXMgbm90IHJlcXVlc3RlZC4gCisgICAgICogCisgICAgICogQHRocm93cyBhbmRyb2lkLmNvbnRlbnQuQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqIAorICAgICAqIEBzZWUgRnJhZ21lbnQjc3RhcnRBY3Rpdml0eSAKKyAgICAgKiBAc2VlIEZyYWdtZW50I3N0YXJ0QWN0aXZpdHlGb3JSZXN1bHQgCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eUZyb21GcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgSW50ZW50IGludGVudCwgCisgICAgICAgICAgICBpbnQgcmVxdWVzdENvZGUpIHsKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uLkFjdGl2aXR5UmVzdWx0IGFyID0KKyAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uZXhlY1N0YXJ0QWN0aXZpdHkoCisgICAgICAgICAgICAgICAgdGhpcywgbU1haW5UaHJlYWQuZ2V0QXBwbGljYXRpb25UaHJlYWQoKSwgbVRva2VuLCBmcmFnbWVudCwKKyAgICAgICAgICAgICAgICBpbnRlbnQsIHJlcXVlc3RDb2RlKTsKKyAgICAgICAgaWYgKGFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1NYWluVGhyZWFkLnNlbmRBY3Rpdml0eVJlc3VsdCgKKyAgICAgICAgICAgICAgICBtVG9rZW4sIGZyYWdtZW50Lm1XaG8sIHJlcXVlc3RDb2RlLAorICAgICAgICAgICAgICAgIGFyLmdldFJlc3VsdENvZGUoKSwgYXIuZ2V0UmVzdWx0RGF0YSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIExpa2Uge0BsaW5rICNzdGFydEFjdGl2aXR5RnJvbUNoaWxkKEFjdGl2aXR5LCBJbnRlbnQsIGludCl9LCBidXQKICAgICAgKiB0YWtpbmcgYSBJbnRlbnRTZW5kZXI7IHNlZQogICAgICAqIHtAbGluayAjc3RhcnRJbnRlbnRTZW5kZXJGb3JSZXN1bHQoSW50ZW50U2VuZGVyLCBpbnQsIEludGVudCwgaW50LCBpbnQsIGludCl9CkBAIC0zMjQ0LDYgKzM1MzQsMTkgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDaGVjayB0byBzZWUgd2hldGhlciB0aGlzIGFjdGl2aXR5IGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRlc3Ryb3llZCBpbiBvcmRlciB0byBiZQorICAgICAqIHJlY3JlYXRlZCB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24uIFRoaXMgaXMgb2Z0ZW4gdXNlZCBpbgorICAgICAqIHtAbGluayAjb25TdG9wfSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgc3RhdGUgbmVlZHMgdG8gYmUgY2xlYW5lZCB1cCBvciB3aWxsIGJlIHBhc3NlZAorICAgICAqIG9uIHRvIHRoZSBuZXh0IGluc3RhbmNlIG9mIHRoZSBhY3Rpdml0eSB2aWEge0BsaW5rICNvblJldGFpbk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIElmIHRoZSBhY3Rpdml0eSBpcyBiZWluZyB0b3JuIGRvd24gaW4gb3JkZXIgdG8gYmUgcmVjcmVhdGVkIHdpdGggYSBuZXcgY29uZmlndXJhdGlvbiwKKyAgICAgKiByZXR1cm5zIHRydWU7IGVsc2UgcmV0dXJucyBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NoYW5naW5nQ29uZmlndXJhdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBtQ2hhbmdpbmdDb25maWd1cmF0aW9uczsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDYWxsIHRoaXMgd2hlbiB5b3VyIGFjdGl2aXR5IGlzIGRvbmUgYW5kIHNob3VsZCBiZSBjbG9zZWQuICBUaGUKICAgICAgKiBBY3Rpdml0eVJlc3VsdCBpcyBwcm9wYWdhdGVkIGJhY2sgdG8gd2hvZXZlciBsYXVuY2hlZCB5b3UgdmlhCiAgICAgICogb25BY3Rpdml0eVJlc3VsdCgpLgpAQCAtMzM0NCw4ICszNjQ3LDcgQEAKICAgICAgKiBAc2VlICNjcmVhdGVQZW5kaW5nUmVzdWx0CiAgICAgICogQHNlZSAjc2V0UmVzdWx0KGludCkKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsCi0gICAgICAgICAgICBJbnRlbnQgZGF0YSkgeworICAgIHByb3RlY3RlZCB2b2lkIG9uQWN0aXZpdHlSZXN1bHQoaW50IHJlcXVlc3RDb2RlLCBpbnQgcmVzdWx0Q29kZSwgSW50ZW50IGRhdGEpIHsKICAgICB9CiAKICAgICAvKioKQEAgLTM3MjksMTQgKzQwMzEsMTI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU3R1YiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyLkZhY3Rvcnkjb25DcmVhdGVWaWV3fSB1c2VkIHdoZW4KLSAgICAgKiBpbmZsYXRpbmcgd2l0aCB0aGUgTGF5b3V0SW5mbGF0ZXIgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTeXN0ZW1TZXJ2aWNlfS4gIFRoaXMKLSAgICAgKiBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyBudWxsIGZvciBhbGwgdmlldyBuYW1lcy4KKyAgICAgKiBTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAqIHtAbGluayBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIuRmFjdG9yeSNvbkNyZWF0ZVZpZXd9IHVzZWQgd2hlbgorICAgICAqIGluZmxhdGluZyB3aXRoIHRoZSBMYXlvdXRJbmZsYXRlciByZXR1cm5lZCBieSB7QGxpbmsgI2dldFN5c3RlbVNlcnZpY2V9LgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gaGFuZGxlcyA8ZnJhZ21lbnQ+IHRhZ3MgdG8gZW1iZWQgZnJhZ21lbnRzIGluc2lkZQorICAgICAqIG9mIHRoZSBhY3Rpdml0eS4KICAgICAgKgogICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyI2NyZWF0ZVZpZXcKICAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5XaW5kb3cjZ2V0TGF5b3V0SW5mbGF0ZXIKICAgICAgKi8KICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIGlmICghImZyYWdtZW50Ii5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTdHJpbmcgZm5hbWUgPSBhdHRycy5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAiY2xhc3MiKTsKKyAgICAgICAgVHlwZWRBcnJheSBhID0gCisgICAgICAgICAgICBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50KTsKKyAgICAgICAgaWYgKGZuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIGZuYW1lID0gYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRfbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaW50IGlkID0gYS5nZXRSZXNvdXJjZUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50X2lkLCAwKTsKKyAgICAgICAgU3RyaW5nIHRhZyA9IGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50X3RhZyk7CisgICAgICAgIGEucmVjeWNsZSgpOworICAgICAgICAKKyAgICAgICAgaWYgKGlkID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oYXR0cnMuZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpCisgICAgICAgICAgICAgICAgICAgICsgIjogTXVzdCBzcGVjaWZ5IHVuaXF1ZSBhbmRyb2lkOmlkIGZvciAiICsgZm5hbWUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBJZiB3ZSByZXN0b3JlZCBmcm9tIGEgcHJldmlvdXMgc3RhdGUsIHdlIG1heSBhbHJlYWR5IGhhdmUKKyAgICAgICAgLy8gaW5zdGFudGlhdGVkIHRoaXMgZnJhZ21lbnQgZnJvbSB0aGUgc3RhdGUgYW5kIHNob3VsZCB1c2UKKyAgICAgICAgLy8gdGhhdCBpbnN0YW5jZSBpbnN0ZWFkIG9mIG1ha2luZyBhIG5ldyBvbmUuCisgICAgICAgIEZyYWdtZW50IGZyYWdtZW50ID0gbUZyYWdtZW50cy5maW5kRnJhZ21lbnRCeUlkKGlkKTsKKyAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KFRBRywgIm9uQ3JlYXRlVmlldzogaWQ9MHgiCisgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGlkKSArICIgZm5hbWU9IiArIGZuYW1lCisgICAgICAgICAgICAgICAgKyAiIGV4aXN0aW5nPSIgKyBmcmFnbWVudCk7CisgICAgICAgIGlmIChmcmFnbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBmcmFnbWVudCA9IEZyYWdtZW50Lmluc3RhbnRpYXRlKHRoaXMsIGZuYW1lKTsKKyAgICAgICAgICAgIGZyYWdtZW50Lm1Gcm9tTGF5b3V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZyYWdtZW50Lm1GcmFnbWVudElkID0gaWQ7CisgICAgICAgICAgICBmcmFnbWVudC5tVGFnID0gdGFnOworICAgICAgICAgICAgZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ID0gdGhpczsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgZnJhZ21lbnQgaXMgbmV3bHkgaW5zdGFudGlhdGVkIChlaXRoZXIgcmlnaHQgbm93LCBvcgorICAgICAgICAgICAgLy8gZnJvbSBsYXN0IHNhdmVkIHN0YXRlKSwgdGhlbiBnaXZlIGl0IHRoZSBhdHRyaWJ1dGVzIHRvCisgICAgICAgICAgICAvLyBpbml0aWFsaXplIGl0c2VsZi4KKyAgICAgICAgICAgIGlmICghZnJhZ21lbnQubVJldGFpbmluZykgeworICAgICAgICAgICAgICAgIGZyYWdtZW50Lm9uSW5mbGF0ZShhdHRycywgZnJhZ21lbnQubVNhdmVkRnJhZ21lbnRTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRnJhZ21lbnRzLmFkZEZyYWdtZW50KGZyYWdtZW50LCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnJhZ21lbnQubVZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGZuYW1lCisgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNyZWF0ZSBhIHZpZXcuIik7CisgICAgICAgIH0KKyAgICAgICAgZnJhZ21lbnQubVZpZXcuc2V0SWQoaWQpOworICAgICAgICBpZiAoZnJhZ21lbnQubVZpZXcuZ2V0VGFnKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgZnJhZ21lbnQubVZpZXcuc2V0VGFnKHRhZyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZyYWdtZW50Lm1WaWV3OworICAgIH0KKworICAgIC8qKgorICAgICAqIEJpdCBpbmRpY2F0aW5nIHRoYXQgdGhpcyBhY3Rpdml0eSBpcyAiaW1tZXJzaXZlIiBhbmQgc2hvdWxkIG5vdCBiZQorICAgICAqIGludGVycnVwdGVkIGJ5IG5vdGlmaWNhdGlvbnMgaWYgcG9zc2libGUuCisgICAgICoKKyAgICAgKiBUaGlzIHZhbHVlIGlzIGluaXRpYWxseSBzZXQgYnkgdGhlIG1hbmlmZXN0IHByb3BlcnR5CisgICAgICogPGNvZGU+YW5kcm9pZDppbW1lcnNpdmU8L2NvZGU+IGJ1dCBtYXkgYmUgY2hhbmdlZCBhdCBydW50aW1lIGJ5CisgICAgICoge0BsaW5rICNzZXRJbW1lcnNpdmV9LgorICAgICAqCisgICAgICogQHNlZSBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvI0ZMQUdfSU1NRVJTSVZFCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ltbWVyc2l2ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLmlzSW1tZXJzaXZlKG1Ub2tlbik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGp1c3QgdGhlIGN1cnJlbnQgaW1tZXJzaXZlIG1vZGUgc2V0dGluZy4KKyAgICAgKiAKKyAgICAgKiBOb3RlIHRoYXQgY2hhbmdpbmcgdGhpcyB2YWx1ZSB3aWxsIGhhdmUgbm8gZWZmZWN0IG9uIHRoZSBhY3Rpdml0eSdzCisgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm99IHN0cnVjdHVyZTsgdGhhdCBpcywgaWYKKyAgICAgKiA8Y29kZT5hbmRyb2lkOmltbWVyc2l2ZTwvY29kZT4gaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+CisgICAgICogaW4gdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QgZW50cnkgZm9yIHRoaXMgYWN0aXZpdHksIHRoZSB7QGxpbmsKKyAgICAgKiBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvI2ZsYWdzIEFjdGl2aXR5SW5mby5mbGFnc30gbWVtYmVyIHdpbGwKKyAgICAgKiBhbHdheXMgaGF2ZSBpdHMge0BsaW5rIGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm8jRkxBR19JTU1FUlNJVkUKKyAgICAgKiBGTEFHX0lNTUVSU0lWRX0gYml0IHNldC4KKyAgICAgKgorICAgICAqIEBzZWUgI2lzSW1tZXJzaXZlCisgICAgICogQHNlZSBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvI0ZMQUdfSU1NRVJTSVZFCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbW1lcnNpdmUoYm9vbGVhbiBpKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLnNldEltbWVyc2l2ZShtVG9rZW4sIGkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gcGFzcworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYSBjb250ZXh0IG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgdGhhdCB3aWxsIG1hbmFnZSBsaWZlY3ljbGUgZXZlbnRzIGZvciB0aGlzIGNvbnRleHQgbW9kZQorICAgICAqIEByZXR1cm4gVGhlIENvbnRleHRNb2RlIHRoYXQgd2FzIHN0YXJ0ZWQsIG9yIG51bGwgaWYgaXQgd2FzIGNhbmNlbGVkCisgICAgICoKKyAgICAgKiBAc2VlIEFjdGlvbk1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGUoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXREZWNvclZpZXcoKS5zdGFydEFjdGlvbk1vZGUoY2FsbGJhY2spOworICAgIH0KKworICAgIHB1YmxpYyBBY3Rpb25Nb2RlIG9uU3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaW5pdEFjdGlvbkJhcigpOworICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvbkJhci5zdGFydEFjdGlvbk1vZGUoY2FsbGJhY2spOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIApAQCAtMzc0OCwyOCArNDE2MiwzMCBAQAogCiAgICAgZmluYWwgdm9pZCBhdHRhY2goQ29udGV4dCBjb250ZXh0LCBBY3Rpdml0eVRocmVhZCBhVGhyZWFkLCBJbnN0cnVtZW50YXRpb24gaW5zdHIsIElCaW5kZXIgdG9rZW4sCiAgICAgICAgICAgICBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwgSW50ZW50IGludGVudCwgQWN0aXZpdHlJbmZvIGluZm8sIENoYXJTZXF1ZW5jZSB0aXRsZSwgCi0gICAgICAgICAgICBBY3Rpdml0eSBwYXJlbnQsIFN0cmluZyBpZCwgT2JqZWN0IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UsCisgICAgICAgICAgICBBY3Rpdml0eSBwYXJlbnQsIFN0cmluZyBpZCwgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcywKICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CiAgICAgICAgIGF0dGFjaChjb250ZXh0LCBhVGhyZWFkLCBpbnN0ciwgdG9rZW4sIDAsIGFwcGxpY2F0aW9uLCBpbnRlbnQsIGluZm8sIHRpdGxlLCBwYXJlbnQsIGlkLAotICAgICAgICAgICAgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwgbnVsbCwgY29uZmlnKTsKKyAgICAgICAgICAgIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLCBjb25maWcpOwogICAgIH0KICAgICAKICAgICBmaW5hbCB2b2lkIGF0dGFjaChDb250ZXh0IGNvbnRleHQsIEFjdGl2aXR5VGhyZWFkIGFUaHJlYWQsCiAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb24gaW5zdHIsIElCaW5kZXIgdG9rZW4sIGludCBpZGVudCwKICAgICAgICAgICAgIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBJbnRlbnQgaW50ZW50LCBBY3Rpdml0eUluZm8gaW5mbywKICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aXRsZSwgQWN0aXZpdHkgcGFyZW50LCBTdHJpbmcgaWQsCi0gICAgICAgICAgICBPYmplY3QgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLE9iamVjdD4gbGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcywKKyAgICAgICAgICAgIE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMsCiAgICAgICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZykgewogICAgICAgICBhdHRhY2hCYXNlQ29udGV4dChjb250ZXh0KTsKIAorICAgICAgICBtRnJhZ21lbnRzLmF0dGFjaEFjdGl2aXR5KHRoaXMpOworICAgICAgICAKICAgICAgICAgbVdpbmRvdyA9IFBvbGljeU1hbmFnZXIubWFrZU5ld1dpbmRvdyh0aGlzKTsKICAgICAgICAgbVdpbmRvdy5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgbVdpbmRvdy5nZXRMYXlvdXRJbmZsYXRlcigpLnNldEZhY3RvcnkodGhpcyk7CiAgICAgICAgIGlmIChpbmZvLnNvZnRJbnB1dE1vZGUgIT0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9TVEFURV9VTlNQRUNJRklFRCkgewogICAgICAgICAgICAgbVdpbmRvdy5zZXRTb2Z0SW5wdXRNb2RlKGluZm8uc29mdElucHV0TW9kZSk7CiAgICAgICAgIH0KICAgICAgICAgbVVpVGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLQorICAgICAgICAKICAgICAgICAgbU1haW5UaHJlYWQgPSBhVGhyZWFkOwogICAgICAgICBtSW5zdHJ1bWVudGF0aW9uID0gaW5zdHI7CiAgICAgICAgIG1Ub2tlbiA9IHRva2VuOwpAQCAtMzc4MSwxMCArNDE5NywxMCBAQAogICAgICAgICBtVGl0bGUgPSB0aXRsZTsKICAgICAgICAgbVBhcmVudCA9IHBhcmVudDsKICAgICAgICAgbUVtYmVkZGVkSUQgPSBpZDsKLSAgICAgICAgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlOwotICAgICAgICBtTGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcyA9IGxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXM7CisgICAgICAgIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzOwogCi0gICAgICAgIG1XaW5kb3cuc2V0V2luZG93TWFuYWdlcihudWxsLCBtVG9rZW4sIG1Db21wb25lbnQuZmxhdHRlblRvU3RyaW5nKCkpOworICAgICAgICBtV2luZG93LnNldFdpbmRvd01hbmFnZXIobnVsbCwgbVRva2VuLCBtQ29tcG9uZW50LmZsYXR0ZW5Ub1N0cmluZygpLAorICAgICAgICAgICAgICAgIChpbmZvLmZsYWdzICYgQWN0aXZpdHlJbmZvLkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQpICE9IDApOwogICAgICAgICBpZiAobVBhcmVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICBtV2luZG93LnNldENvbnRhaW5lcihtUGFyZW50LmdldFdpbmRvdygpKTsKICAgICAgICAgfQpAQCAtMzc5NiwxNCArNDIxMiwyNiBAQAogICAgICAgICByZXR1cm4gbVBhcmVudCAhPSBudWxsID8gbVBhcmVudC5nZXRBY3Rpdml0eVRva2VuKCkgOiBtVG9rZW47CiAgICAgfQogCisgICAgZmluYWwgdm9pZCBwZXJmb3JtQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgb25DcmVhdGUoaWNpY2xlKTsKKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaEFjdGl2aXR5Q3JlYXRlZCgpOworICAgIH0KKyAgICAKICAgICBmaW5hbCB2b2lkIHBlcmZvcm1TdGFydCgpIHsKICAgICAgICAgbUNhbGxlZCA9IGZhbHNlOworICAgICAgICBtRnJhZ21lbnRzLmV4ZWNQZW5kaW5nQWN0aW9ucygpOwogICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmNhbGxBY3Rpdml0eU9uU3RhcnQodGhpcyk7CiAgICAgICAgIGlmICghbUNhbGxlZCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICJBY3Rpdml0eSAiICsgbUNvbXBvbmVudC50b1Nob3J0U3RyaW5nKCkgKwogICAgICAgICAgICAgICAgICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25TdGFydCgpIik7CiAgICAgICAgIH0KKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaFN0YXJ0KCk7CisgICAgICAgIGlmIChtQWxsTG9hZGVyTWFuYWdlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT1tQWxsTG9hZGVyTWFuYWdlcnMuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIG1BbGxMb2FkZXJNYW5hZ2Vycy52YWx1ZUF0KGkpLmZpbmlzaFJldGFpbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogICAgIAogICAgIGZpbmFsIHZvaWQgcGVyZm9ybVJlc3RhcnQoKSB7CkBAIC0zODEyLDcgKzQyNDAsMTAgQEAKICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBNYW5hZ2VkQ3Vyc29yIG1jID0gbU1hbmFnZWRDdXJzb3JzLmdldChpKTsKICAgICAgICAgICAgICAgICBpZiAobWMubVJlbGVhc2VkIHx8IG1jLm1VcGRhdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1jLm1DdXJzb3IucmVxdWVyeSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIW1jLm1DdXJzb3IucmVxdWVyeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJ5aW5nIHRvIHJlcXVlcnkgYW4gYWxyZWFkeSBjbG9zZWQgY3Vyc29yIik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbWMubVJlbGVhc2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIG1jLm1VcGRhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQpAQCAtMzgzNSw3ICs0MjY2LDkgQEAKICAgICBmaW5hbCB2b2lkIHBlcmZvcm1SZXN1bWUoKSB7CiAgICAgICAgIHBlcmZvcm1SZXN0YXJ0KCk7CiAgICAgICAgIAotICAgICAgICBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSA9IG51bGw7CisgICAgICAgIG1GcmFnbWVudHMuZXhlY1BlbmRpbmdBY3Rpb25zKCk7CisgICAgICAgIAorICAgICAgICBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgPSBudWxsOwogICAgICAgICAKICAgICAgICAgLy8gRmlyc3QgY2FsbCBvblJlc3VtZSgpIC1iZWZvcmUtIHNldHRpbmcgbVJlc3VtZWQsIHNvIHdlIGRvbid0CiAgICAgICAgIC8vIHNlbmQgb3V0IGFueSBzdGF0dXMgYmFyIC8gbWVudSBub3RpZmljYXRpb25zIHRoZSBjbGllbnQgbWFrZXMuCkBAIC0zODUwLDYgKzQyODMsMTAgQEAKICAgICAgICAgLy8gTm93IHJlYWxseSByZXN1bWUsIGFuZCBpbnN0YWxsIHRoZSBjdXJyZW50IHN0YXR1cyBiYXIgYW5kIG1lbnUuCiAgICAgICAgIG1SZXN1bWVkID0gdHJ1ZTsKICAgICAgICAgbUNhbGxlZCA9IGZhbHNlOworICAgICAgICAKKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaFJlc3VtZSgpOworICAgICAgICBtRnJhZ21lbnRzLmV4ZWNQZW5kaW5nQWN0aW9ucygpOworICAgICAgICAKICAgICAgICAgb25Qb3N0UmVzdW1lKCk7CiAgICAgICAgIGlmICghbUNhbGxlZCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKApAQCAtMzg1OSw2ICs0Mjk2LDcgQEAKICAgICB9CiAKICAgICBmaW5hbCB2b2lkIHBlcmZvcm1QYXVzZSgpIHsKKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaFBhdXNlKCk7CiAgICAgICAgIG1DYWxsZWQgPSBmYWxzZTsKICAgICAgICAgb25QYXVzZSgpOwogICAgICAgICBpZiAoIW1DYWxsZWQgJiYgZ2V0QXBwbGljYXRpb25JbmZvKCkudGFyZ2V0U2RrVmVyc2lvbgpAQCAtMzg3NSwxMSArNDMxMywyNCBAQAogICAgIH0KICAgICAKICAgICBmaW5hbCB2b2lkIHBlcmZvcm1TdG9wKCkgeworICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICghbUNoYW5naW5nQ29uZmlndXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9TdG9wKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9SZXRhaW4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCiAgICAgICAgIGlmICghbVN0b3BwZWQpIHsKICAgICAgICAgICAgIGlmIChtV2luZG93ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtV2luZG93LmNsb3NlQWxsUGFuZWxzKCk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hTdG9wKCk7CisgICAgICAgICAgICAKICAgICAgICAgICAgIG1DYWxsZWQgPSBmYWxzZTsKICAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uY2FsbEFjdGl2aXR5T25TdG9wKHRoaXMpOwogICAgICAgICAgICAgaWYgKCFtQ2FsbGVkKSB7CkBAIC0zOTA0LDYgKzQzNTUsMTUgQEAKICAgICAgICAgbVJlc3VtZWQgPSBmYWxzZTsKICAgICB9CiAKKyAgICBmaW5hbCB2b2lkIHBlcmZvcm1EZXN0cm95KCkgeworICAgICAgICBtV2luZG93LmRlc3Ryb3koKTsKKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaERlc3Ryb3koKTsKKyAgICAgICAgb25EZXN0cm95KCk7CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9hZGVyTWFuYWdlci5kb0Rlc3Ryb3koKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKICAgICBmaW5hbCBib29sZWFuIGlzUmVzdW1lZCgpIHsKICAgICAgICAgcmV0dXJuIG1SZXN1bWVkOwogICAgIH0KQEAgLTM5MTUsNiArNDM3NSwxMSBAQAogICAgICAgICAgICAgKyAiLCByZXNDb2RlPSIgKyByZXN1bHRDb2RlICsgIiwgZGF0YT0iICsgZGF0YSk7CiAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgewogICAgICAgICAgICAgb25BY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGcmFnbWVudCBmcmFnID0gbUZyYWdtZW50cy5maW5kRnJhZ21lbnRCeVdobyh3aG8pOworICAgICAgICAgICAgaWYgKGZyYWcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZyYWcub25BY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmphdmEKaW5kZXggYTE4MDgzNy4uNzNlOGQzMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlck5hdGl2ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXJOYXRpdmUuamF2YQpAQCAtMTI2MSw2ICsxMjYxLDMyIEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgSVNfSU1NRVJTSVZFX1RSQU5TQUNUSU9OOiB7CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIElCaW5kZXIgdG9rZW4gPSBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNpdCA9IGlzSW1tZXJzaXZlKHRva2VuKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KGlzaXQgPyAxIDogMCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VUX0lNTUVSU0lWRV9UUkFOU0FDVElPTjogeworICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgICAgICBJQmluZGVyIHRva2VuID0gZGF0YS5yZWFkU3Ryb25nQmluZGVyKCk7CisgICAgICAgICAgICBib29sZWFuIGltbSA9IGRhdGEucmVhZEludCgpID09IDE7CisgICAgICAgICAgICBzZXRJbW1lcnNpdmUodG9rZW4sIGltbSk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgY2FzZSBJU19UT1BfQUNUSVZJVFlfSU1NRVJTSVZFX1RSQU5TQUNUSU9OOiB7CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNpdCA9IGlzVG9wQWN0aXZpdHlJbW1lcnNpdmUoKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KGlzaXQgPyAxIDogMCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgQ1JBU0hfQVBQTElDQVRJT05fVFJBTlNBQ1RJT046IHsKICAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOwogICAgICAgICAgICAgaW50IHVpZCA9IGRhdGEucmVhZEludCgpOwpAQCAtMTI3MSw3ICsxMjk3LDcgQEAKICAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0KKyAgICAgICAgCiAgICAgICAgIGNhc2UgTkVXX1VSSV9QRVJNSVNTSU9OX09XTkVSX1RSQU5TQUNUSU9OOiB7CiAgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZGF0YS5yZWFkU3RyaW5nKCk7CkBAIC0xMzA2LDYgKzEzMzIsMTkgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBEVU1QX0hFQVBfVFJBTlNBQ1RJT046IHsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgU3RyaW5nIHByb2Nlc3MgPSBkYXRhLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gbWFuYWdlZCA9IGRhdGEucmVhZEludCgpICE9IDA7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGRhdGEucmVhZFN0cmluZygpOworICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQgPSBkYXRhLnJlYWRJbnQoKSAhPSAwCisgICAgICAgICAgICAgICAgICAgID8gZGF0YS5yZWFkRmlsZURlc2NyaXB0b3IoKSA6IG51bGw7CisgICAgICAgICAgICBib29sZWFuIHJlcyA9IGR1bXBIZWFwKHByb2Nlc3MsIG1hbmFnZWQsIHBhdGgsIGZkKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KHJlcyA/IDEgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKQEAgLTI4MzIsNiArMjg3MSw0NiBAQAogICAgICAgICByZXBseS5yZWN5Y2xlKCk7CiAgICAgfQogICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEltbWVyc2l2ZShJQmluZGVyIHRva2VuLCBib29sZWFuIGltbWVyc2l2ZSkKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcih0b2tlbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQoaW1tZXJzaXZlID8gMSA6IDApOworICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KFNFVF9JTU1FUlNJVkVfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKKyAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICBkYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgcmVwbHkucmVjeWNsZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW1tZXJzaXZlKElCaW5kZXIgdG9rZW4pCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIodG9rZW4pOworICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KElTX0lNTUVSU0lWRV9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIGJvb2xlYW4gcmVzID0gcmVwbHkucmVhZEludCgpID09IDE7CisgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgICAgICByZXBseS5yZWN5Y2xlKCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNUb3BBY3Rpdml0eUltbWVyc2l2ZSgpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoSVNfVE9QX0FDVElWSVRZX0lNTUVSU0lWRV9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIGJvb2xlYW4gcmVzID0gcmVwbHkucmVhZEludCgpID09IDE7CisgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgICAgICByZXBseS5yZWN5Y2xlKCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgY3Jhc2hBcHBsaWNhdGlvbihpbnQgdWlkLCBpbnQgaW5pdGlhbFBpZCwgU3RyaW5nIHBhY2thZ2VOYW1lLAogICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKQEAgLTI4OTUsNiArMjk3NCwyOCBAQAogICAgICAgICBkYXRhLnJlY3ljbGUoKTsKICAgICAgICAgcmVwbHkucmVjeWNsZSgpOwogICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGR1bXBIZWFwKFN0cmluZyBwcm9jZXNzLCBib29sZWFuIG1hbmFnZWQsCisgICAgICAgICAgICBTdHJpbmcgcGF0aCwgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZyhwcm9jZXNzKTsKKyAgICAgICAgZGF0YS53cml0ZUludChtYW5hZ2VkID8gMSA6IDApOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nKHBhdGgpOworICAgICAgICBpZiAoZmQgIT0gbnVsbCkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludCgxKTsKKyAgICAgICAgICAgIGZkLndyaXRlVG9QYXJjZWwoZGF0YSwgUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50KDApOworICAgICAgICB9CisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoRFVNUF9IRUFQX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7CisgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgYm9vbGVhbiByZXMgPSByZXBseS5yZWFkSW50KCkgIT0gMDsKKyAgICAgICAgcmVwbHkucmVjeWNsZSgpOworICAgICAgICBkYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAgICAgCiAgICAgcHJpdmF0ZSBJQmluZGVyIG1SZW1vdGU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCmluZGV4IGNhNmZjOGEuLjRkZTBiMGEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uSW5zdHJ1bWVudGF0aW9uSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUHJvdmlkZXJJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKQEAgLTE5Nyw4ICsxOTgsNyBAQAogICAgICAgICBXaW5kb3cgd2luZG93OwogICAgICAgICBBY3Rpdml0eSBwYXJlbnQ7CiAgICAgICAgIFN0cmluZyBlbWJlZGRlZElEOwotICAgICAgICBPYmplY3QgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZTsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PiBsYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzOworICAgICAgICBBY3Rpdml0eS5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzOwogICAgICAgICBib29sZWFuIHBhdXNlZDsKICAgICAgICAgYm9vbGVhbiBzdG9wcGVkOwogICAgICAgICBib29sZWFuIGhpZGVGb3JOb3c7CkBAIC0zNTksMTEgKzM1OSwxNiBAQAogICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZDsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEdW1wSGVhcERhdGEgeworICAgICAgICBTdHJpbmcgcGF0aDsKKyAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQ7CisgICAgfQorCiAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBBcHBsaWNhdGlvblRocmVhZCBleHRlbmRzIEFwcGxpY2F0aW9uVGhyZWFkTmF0aXZlIHsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQVBfQ09MVU1OID0gIiUxN3MgJThzICU4cyAlOHMgJThzIjsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9DT1VOVF9DT0xVTU4gPSAiJTE3cyAlOGQiOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFdPX0NPVU5UX0NPTFVNTlMgPSAiJTE3cyAlOGQgJTE3cyAlOGQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfSU5GT19GT1JNQVQgPSAiICAlOGQgJThkICUxMGQgICVzIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX0lORk9fRk9STUFUID0gIiAgJTRkICU2ZCAlOGQgJTE0cyAgJXMiOwogCiAgICAgICAgIC8vIEZvcm1hdHRpbmcgZm9yIGNoZWNraW4gc2VydmljZSAtIHVwZGF0ZSB2ZXJzaW9uIGlmIHJvdyBmb3JtYXQgY2hhbmdlcwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfVEhSRUFEX0NIRUNLSU5fVkVSU0lPTiA9IDE7CkBAIC02MjYsNiArNjMxLDEzIEBACiAgICAgICAgICAgICBxdWV1ZU9yU2VuZE1lc3NhZ2UoSC5QUk9GSUxFUl9DT05UUk9MLCBwY2QsIHN0YXJ0ID8gMSA6IDApOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgZHVtcEhlYXAoYm9vbGVhbiBtYW5hZ2VkLCBTdHJpbmcgcGF0aCwgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpIHsKKyAgICAgICAgICAgIER1bXBIZWFwRGF0YSBkaGQgPSBuZXcgRHVtcEhlYXBEYXRhKCk7CisgICAgICAgICAgICBkaGQucGF0aCA9IHBhdGg7CisgICAgICAgICAgICBkaGQuZmQgPSBmZDsKKyAgICAgICAgICAgIHF1ZXVlT3JTZW5kTWVzc2FnZShILkRVTVBfSEVBUCwgZGhkLCBtYW5hZ2VkID8gMSA6IDApOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgc2V0U2NoZWR1bGluZ0dyb3VwKGludCBncm91cCkgewogICAgICAgICAgICAgLy8gTm90ZTogZG8gdGhpcyBpbW1lZGlhdGVseSwgc2luY2UgZ29pbmcgaW50byB0aGUgZm9yZWdyb3VuZAogICAgICAgICAgICAgLy8gc2hvdWxkIGhhcHBlbiByZWdhcmRsZXNzIG9mIHdoYXQgcGVuZGluZyB3b3JrIHdlIGhhdmUgdG8gZG8KQEAgLTc2Myw3ICs3NzUsNyBAQAogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHMuZGJTdGF0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBEYlN0YXRzIGRiU3RhdHMgPSBzdGF0cy5kYlN0YXRzLmdldChpKTsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRSb3cocHcsIERCX0lORk9fRk9STUFULCBkYlN0YXRzLnBhZ2VTaXplLCBkYlN0YXRzLmRiU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzLmxvb2thc2lkZSwgZGJTdGF0cy5kYk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiU3RhdHMubG9va2FzaWRlLCBkYlN0YXRzLmNhY2hlLCBkYlN0YXRzLmRiTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCcsJyk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC04MTQsMTEgKzgyNiwxMiBAQAogICAgICAgICAgICAgaW50IE4gPSBzdGF0cy5kYlN0YXRzLnNpemUoKTsKICAgICAgICAgICAgIGlmIChOID4gMCkgewogICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiBEQVRBQkFTRVMiKTsKLSAgICAgICAgICAgICAgICBwcmludFJvdyhwdywgIiAgJThzICU4cyAlMTBzICAlcyIsICJQYWdlc2l6ZSIsICJEYnNpemUiLCAiTG9va2FzaWRlIiwgIkRibmFtZSIpOworICAgICAgICAgICAgICAgIHByaW50Um93KHB3LCAiICAlNHMgJTZzICU4cyAlMTRzICAlcyIsICJwZ3N6IiwgImRic3oiLCAibGthc2lkZSIsICJjYWNoZSIsCisgICAgICAgICAgICAgICAgICAgICJEYm5hbWUiKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgICAgICAgICAgICAgICBEYlN0YXRzIGRiU3RhdHMgPSBzdGF0cy5kYlN0YXRzLmdldChpKTsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRSb3cocHcsIERCX0lORk9fRk9STUFULCBkYlN0YXRzLnBhZ2VTaXplLCBkYlN0YXRzLmRiU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzLmxvb2thc2lkZSwgZGJTdGF0cy5kYk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiU3RhdHMubG9va2FzaWRlLCBkYlN0YXRzLmNhY2hlLCBkYlN0YXRzLmRiTmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC04NzYsNiArODg5LDcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5BQkxFX0pJVCAgICAgICAgICAgICAgPSAxMzI7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BBVENIX1BBQ0tBR0VfQlJPQURDQVNUID0gMTMzOwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ0hFRFVMRV9DUkFTSCAgICAgICAgICA9IDEzNDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFVNUF9IRUFQICAgICAgICAgICAgICAgPSAxMzU7CiAgICAgICAgIFN0cmluZyBjb2RlVG9TdHJpbmcoaW50IGNvZGUpIHsKICAgICAgICAgICAgIGlmIChsb2NhbExPR1YpIHsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKQEAgLTkxNCw2ICs5MjgsNyBAQAogICAgICAgICAgICAgICAgICAgICBjYXNlIEVOQUJMRV9KSVQ6IHJldHVybiAiRU5BQkxFX0pJVCI7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgRElTUEFUQ0hfUEFDS0FHRV9CUk9BRENBU1Q6IHJldHVybiAiRElTUEFUQ0hfUEFDS0FHRV9CUk9BRENBU1QiOwogICAgICAgICAgICAgICAgICAgICBjYXNlIFNDSEVEVUxFX0NSQVNIOiByZXR1cm4gIlNDSEVEVUxFX0NSQVNIIjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBEVU1QX0hFQVA6IHJldHVybiAiRFVNUF9IRUFQIjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gIih1bmtub3duKSI7CkBAIC0xMDM5LDEzICsxMDU0LDM1IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0NIRURVTEVfQ1JBU0g6CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVTZXJ2aWNlRXhjZXB0aW9uKChTdHJpbmcpbXNnLm9iaik7CisgICAgICAgICAgICAgICAgY2FzZSBEVU1QX0hFQVA6CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUR1bXBIZWFwKG1zZy5hcmcxICE9IDAsIChEdW1wSGVhcERhdGEpbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdm9pZCBtYXliZVNuYXBzaG90KCkgewogICAgICAgICAgICAgaWYgKG1Cb3VuZEFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24ud3JpdGVTbmFwc2hvdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Cb3VuZEFwcGxpY2F0aW9uLnByb2Nlc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRoZSAqcHJpdmF0ZSogQWN0aXZpdHlUaHJlYWQuUGFja2FnZUluZm8gdG8gKnB1YmxpYyoga25vd24KKyAgICAgICAgICAgICAgICAvLyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm8KKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBtQm91bmRBcHBsaWNhdGlvbi5pbmZvLm1QYWNrYWdlTmFtZTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm8gcGFja2FnZUluZm8gPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldFN5c3RlbUNvbnRleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjYW5ub3QgZ2V0IGEgdmFsaWQgY29udGV4dCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICAgICAgICAgICAgICBpZihwbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjYW5ub3QgZ2V0IGEgdmFsaWQgUGFja2FnZU1hbmFnZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlSW5mbyA9IHBtLmdldFBhY2thZ2VJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLCBQYWNrYWdlTWFuYWdlci5HRVRfQUNUSVZJVElFUyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiY2Fubm90IGdldCBwYWNrYWdlIGluZm8gZm9yICIgKyBwYWNrYWdlTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi53cml0ZVNuYXBzaG90KG1Cb3VuZEFwcGxpY2F0aW9uLnByb2Nlc3NOYW1lLCBwYWNrYWdlSW5mbyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNDM2LDcgKzE0NzMsNyBAQAogCiAgICAgcHVibGljIGZpbmFsIEFjdGl2aXR5IHN0YXJ0QWN0aXZpdHlOb3coQWN0aXZpdHkgcGFyZW50LCBTdHJpbmcgaWQsCiAgICAgICAgIEludGVudCBpbnRlbnQsIEFjdGl2aXR5SW5mbyBhY3Rpdml0eUluZm8sIElCaW5kZXIgdG9rZW4sIEJ1bmRsZSBzdGF0ZSwKLSAgICAgICAgT2JqZWN0IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UpIHsKKyAgICAgICAgQWN0aXZpdHkuTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcykgewogICAgICAgICBBY3Rpdml0eUNsaWVudFJlY29yZCByID0gbmV3IEFjdGl2aXR5Q2xpZW50UmVjb3JkKCk7CiAgICAgICAgICAgICByLnRva2VuID0gdG9rZW47CiAgICAgICAgICAgICByLmlkZW50ID0gMDsKQEAgLTE0NDUsNyArMTQ4Miw3IEBACiAgICAgICAgICAgICByLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgIHIuZW1iZWRkZWRJRCA9IGlkOwogICAgICAgICAgICAgci5hY3Rpdml0eUluZm8gPSBhY3Rpdml0eUluZm87Ci0gICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlOworICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzOwogICAgICAgICBpZiAobG9jYWxMT0dWKSB7CiAgICAgICAgICAgICBDb21wb25lbnROYW1lIGNvbXBuYW1lID0gaW50ZW50LmdldENvbXBvbmVudCgpOwogICAgICAgICAgICAgU3RyaW5nIG5hbWU7CkBAIC0xNTY3LDE0ICsxNjA0LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICArIHIuYWN0aXZpdHlJbmZvLm5hbWUgKyAiIHdpdGggY29uZmlnICIgKyBjb25maWcpOwogICAgICAgICAgICAgICAgIGFjdGl2aXR5LmF0dGFjaChhcHBDb250ZXh0LCB0aGlzLCBnZXRJbnN0cnVtZW50YXRpb24oKSwgci50b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIHIuaWRlbnQsIGFwcCwgci5pbnRlbnQsIHIuYWN0aXZpdHlJbmZvLCB0aXRsZSwgci5wYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICByLmVtYmVkZGVkSUQsIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcywgY29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIuZW1iZWRkZWRJRCwgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcywgY29uZmlnKTsKIAogICAgICAgICAgICAgICAgIGlmIChjdXN0b21JbnRlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eS5tSW50ZW50ID0gY3VzdG9tSW50ZW50OwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcyA9IG51bGw7CisgICAgICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9IG51bGw7CiAgICAgICAgICAgICAgICAgYWN0aXZpdHkubVN0YXJ0ZWRBY3Rpdml0eSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGludCB0aGVtZSA9IHIuYWN0aXZpdHlJbmZvLmdldFRoZW1lUmVzb3VyY2UoKTsKICAgICAgICAgICAgICAgICBpZiAodGhlbWUgIT0gMCkgewpAQCAtMjU1MSw2ICsyNTg2LDkgQEAKICAgICAgICAgICAgIGlmIChmaW5pc2hpbmcpIHsKICAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1GaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0Tm9uQ29uZmlnSW5zdGFuY2UpIHsKKyAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghci5wYXVzZWQpIHsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1DYWxsZWQgPSBmYWxzZTsKQEAgLTI1OTEsOCArMjYyOSw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZ2V0Tm9uQ29uZmlnSW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHIuYWN0aXZpdHkub25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gci5hY3Rpdml0eS5yZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzKCk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtSW5zdHJ1bWVudGF0aW9uLm9uRXhjZXB0aW9uKHIuYWN0aXZpdHksIGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKQEAgLTI2MDEsMjIgKzI2MzksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiAiICsgZS50b1N0cmluZygpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHIuYWN0aXZpdHkub25SZXRhaW5Ob25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIW1JbnN0cnVtZW50YXRpb24ub25FeGNlcHRpb24oci5hY3Rpdml0eSwgZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJldGFpbiBjaGlsZCBhY3Rpdml0aWVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzYWZlVG9Db21wb25lbnRTaG9ydFN0cmluZyhyLmludGVudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiAiICsgZS50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgfQogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1DYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm9uRGVzdHJveSgpOworICAgICAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uY2FsbEFjdGl2aXR5T25EZXN0cm95KHIuYWN0aXZpdHkpOwogICAgICAgICAgICAgICAgIGlmICghci5hY3Rpdml0eS5tQ2FsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpdml0eSAiICsgc2FmZVRvQ29tcG9uZW50U2hvcnRTdHJpbmcoci5pbnRlbnQpICsKQEAgLTMwMjgsNiArMzA1NCwyNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgZmluYWwgdm9pZCBoYW5kbGVEdW1wSGVhcChib29sZWFuIG1hbmFnZWQsIER1bXBIZWFwRGF0YSBkaGQpIHsKKyAgICAgICAgaWYgKG1hbmFnZWQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRGVidWcuZHVtcEhwcm9mRGF0YShkaGQucGF0aCwgZGhkLmZkLmdldEZpbGVEZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJNYW5hZ2VkIGhlYXAgZHVtcCBmYWlsZWQgb24gcGF0aCAiICsgZGhkLnBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtLSBjYW4gdGhlIHByb2Nlc3MgYWNjZXNzIHRoaXMgcGF0aD8iKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZGhkLmZkLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRmFpbHVyZSBjbG9zaW5nIHByb2ZpbGUgZmQiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBEZWJ1Zy5kdW1wTmF0aXZlSGVhcChkaGQuZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBmaW5hbCB2b2lkIGhhbmRsZURpc3BhdGNoUGFja2FnZUJyb2FkY2FzdChpbnQgY21kLCBTdHJpbmdbXSBwYWNrYWdlcykgewogICAgICAgICBib29sZWFuIGhhc1BrZ0luZm8gPSBmYWxzZTsKICAgICAgICAgaWYgKHBhY2thZ2VzICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkVycm9yUmVwb3J0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwbGljYXRpb25FcnJvclJlcG9ydC5qYXZhCmluZGV4IDIzODI1OTYuLjFlMDEyZWIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkVycm9yUmVwb3J0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uRXJyb3JSZXBvcnQuamF2YQpAQCAtMTg0LDcgKzE4NCw3IEBACiAgICAgICAgIGNhbmRpZGF0ZSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KERFRkFVTFRfRVJST1JfUkVDRUlWRVJfUFJPUEVSVFkpOwogICAgICAgICByZXR1cm4gZ2V0RXJyb3JSZXBvcnRSZWNlaXZlcihwbSwgcGFja2FnZU5hbWUsIGNhbmRpZGF0ZSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIGFjdGl2aXR5IGluIHJlY2VpdmVyUGFja2FnZSB0aGF0IGhhbmRsZXMgQUNUSU9OX0FQUF9FUlJPUi4KICAgICAgKgpAQCAtNTgxLDYgKzU4MSw5IEBACiAgICAgICAgICAgICBjYXNlIFRZUEVfQkFUVEVSWToKICAgICAgICAgICAgICAgICBiYXR0ZXJ5SW5mby5kdW1wKHB3LCBwcmVmaXgpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUWVBFX1JVTk5JTkdfU0VSVklDRToKKyAgICAgICAgICAgICAgICBydW5uaW5nU2VydmljZUluZm8uZHVtcChwdywgcHJlZml4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvblRocmVhZE5hdGl2ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uVGhyZWFkTmF0aXZlLmphdmEKaW5kZXggMWMyMDA2Mi4uZGMyMTQ1ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uVGhyZWFkTmF0aXZlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uVGhyZWFkTmF0aXZlLmphdmEKQEAgLTQwMyw2ICs0MDMsMTcgQEAKICAgICAgICAgICAgIHNjaGVkdWxlQ3Jhc2gobXNnKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisKKyAgICAgICAgY2FzZSBEVU1QX0hFQVBfVFJBTlNBQ1RJT046CisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQXBwbGljYXRpb25UaHJlYWQuZGVzY3JpcHRvcik7CisgICAgICAgICAgICBib29sZWFuIG1hbmFnZWQgPSBkYXRhLnJlYWRJbnQoKSAhPSAwOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkYXRhLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gZGF0YS5yZWFkSW50KCkgIT0gMAorICAgICAgICAgICAgICAgICAgICA/IGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCkgOiBudWxsOworICAgICAgICAgICAgZHVtcEhlYXAobWFuYWdlZCwgcGF0aCwgZmQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CkBAIC04MjksNSArODQwLDIyIEBACiAgICAgICAgIGRhdGEucmVjeWNsZSgpOwogICAgICAgICAKICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wSGVhcChib29sZWFuIG1hbmFnZWQsIFN0cmluZyBwYXRoLAorICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBcHBsaWNhdGlvblRocmVhZC5kZXNjcmlwdG9yKTsKKyAgICAgICAgZGF0YS53cml0ZUludChtYW5hZ2VkID8gMSA6IDApOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nKHBhdGgpOworICAgICAgICBpZiAoZmQgIT0gbnVsbCkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludCgxKTsKKyAgICAgICAgICAgIGZkLndyaXRlVG9QYXJjZWwoZGF0YSwgUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50KDApOworICAgICAgICB9CisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoRFVNUF9IRUFQX1RSQU5TQUNUSU9OLCBkYXRhLCBudWxsLAorICAgICAgICAgICAgICAgIElCaW5kZXIuRkxBR19PTkVXQVkpOworICAgICAgICBkYXRhLnJlY3ljbGUoKTsKKyAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9CYWNrU3RhY2tFbnRyeS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0JhY2tTdGFja0VudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBjMmZjNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9CYWNrU3RhY2tFbnRyeS5qYXZhCkBAIC0wLDAgKzEsNDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworZmluYWwgY2xhc3MgQmFja1N0YWNrU3RhdGUgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBmaW5hbCBpbnRbXSBtT3BzOworICAgIGZpbmFsIGludCBtVHJhbnNpdGlvbjsKKyAgICBmaW5hbCBpbnQgbVRyYW5zaXRpb25TdHlsZTsKKyAgICBmaW5hbCBTdHJpbmcgbU5hbWU7CisgICAgZmluYWwgaW50IG1JbmRleDsKKyAgICAKKyAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGUoRnJhZ21lbnRNYW5hZ2VySW1wbCBmbSwgQmFja1N0YWNrRW50cnkgYnNlKSB7CisgICAgICAgIGludCBudW1SZW1vdmVkID0gMDsKKyAgICAgICAgQmFja1N0YWNrRW50cnkuT3Agb3AgPSBic2UubUhlYWQ7CisgICAgICAgIHdoaWxlIChvcCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAob3AucmVtb3ZlZCAhPSBudWxsKSBudW1SZW1vdmVkICs9IG9wLnJlbW92ZWQuc2l6ZSgpOworICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICB9CisgICAgICAgIG1PcHMgPSBuZXcgaW50W2JzZS5tTnVtT3AqNSArIG51bVJlbW92ZWRdOworICAgICAgICAKKyAgICAgICAgaWYgKCFic2UubUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3Qgb24gYmFjayBzdGFjayIpOworICAgICAgICB9CisKKyAgICAgICAgb3AgPSBic2UubUhlYWQ7CisgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICB3aGlsZSAob3AgIT0gbnVsbCkgeworICAgICAgICAgICAgbU9wc1twb3MrK10gPSBvcC5jbWQ7CisgICAgICAgICAgICBtT3BzW3BvcysrXSA9IG9wLmZyYWdtZW50Lm1JbmRleDsKKyAgICAgICAgICAgIG1PcHNbcG9zKytdID0gb3AuZW50ZXJBbmltOworICAgICAgICAgICAgbU9wc1twb3MrK10gPSBvcC5leGl0QW5pbTsKKyAgICAgICAgICAgIGlmIChvcC5yZW1vdmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG9wLnJlbW92ZWQuc2l6ZSgpOworICAgICAgICAgICAgICAgIG1PcHNbcG9zKytdID0gTjsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG1PcHNbcG9zKytdID0gb3AucmVtb3ZlZC5nZXQoaSkubUluZGV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU9wc1twb3MrK10gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICB9CisgICAgICAgIG1UcmFuc2l0aW9uID0gYnNlLm1UcmFuc2l0aW9uOworICAgICAgICBtVHJhbnNpdGlvblN0eWxlID0gYnNlLm1UcmFuc2l0aW9uU3R5bGU7CisgICAgICAgIG1OYW1lID0gYnNlLm1OYW1lOworICAgICAgICBtSW5kZXggPSBic2UubUluZGV4OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGUoUGFyY2VsIGluKSB7CisgICAgICAgIG1PcHMgPSBpbi5jcmVhdGVJbnRBcnJheSgpOworICAgICAgICBtVHJhbnNpdGlvbiA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbVRyYW5zaXRpb25TdHlsZSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbU5hbWUgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgIG1JbmRleCA9IGluLnJlYWRJbnQoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEJhY2tTdGFja0VudHJ5IGluc3RhbnRpYXRlKEZyYWdtZW50TWFuYWdlckltcGwgZm0pIHsKKyAgICAgICAgQmFja1N0YWNrRW50cnkgYnNlID0gbmV3IEJhY2tTdGFja0VudHJ5KGZtKTsKKyAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgIHdoaWxlIChwb3MgPCBtT3BzLmxlbmd0aCkgeworICAgICAgICAgICAgQmFja1N0YWNrRW50cnkuT3Agb3AgPSBuZXcgQmFja1N0YWNrRW50cnkuT3AoKTsKKyAgICAgICAgICAgIG9wLmNtZCA9IG1PcHNbcG9zKytdOworICAgICAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KEZyYWdtZW50TWFuYWdlckltcGwuVEFHLAorICAgICAgICAgICAgICAgICAgICAiQlNFICIgKyBic2UgKyAiIHNldCBiYXNlIGZyYWdtZW50ICMiICsgbU9wc1twb3NdKTsKKyAgICAgICAgICAgIEZyYWdtZW50IGYgPSBmbS5tQWN0aXZlLmdldChtT3BzW3BvcysrXSk7CisgICAgICAgICAgICBvcC5mcmFnbWVudCA9IGY7CisgICAgICAgICAgICBvcC5lbnRlckFuaW0gPSBtT3BzW3BvcysrXTsKKyAgICAgICAgICAgIG9wLmV4aXRBbmltID0gbU9wc1twb3MrK107CisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1PcHNbcG9zKytdOworICAgICAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICAgICAgb3AucmVtb3ZlZCA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KE4pOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KEZyYWdtZW50TWFuYWdlckltcGwuVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCU0UgIiArIGJzZSArICIgc2V0IHJlbW92ZSBmcmFnbWVudCAjIiArIG1PcHNbcG9zXSk7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IHIgPSBmbS5tQWN0aXZlLmdldChtT3BzW3BvcysrXSk7CisgICAgICAgICAgICAgICAgICAgIG9wLnJlbW92ZWQuYWRkKHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJzZS5hZGRPcChvcCk7CisgICAgICAgIH0KKyAgICAgICAgYnNlLm1UcmFuc2l0aW9uID0gbVRyYW5zaXRpb247CisgICAgICAgIGJzZS5tVHJhbnNpdGlvblN0eWxlID0gbVRyYW5zaXRpb25TdHlsZTsKKyAgICAgICAgYnNlLm1OYW1lID0gbU5hbWU7CisgICAgICAgIGJzZS5tSW5kZXggPSBtSW5kZXg7CisgICAgICAgIGJzZS5tQWRkVG9CYWNrU3RhY2sgPSB0cnVlOworICAgICAgICBic2UuYnVtcEJhY2tTdGFja05lc3RpbmcoMSk7CisgICAgICAgIHJldHVybiBic2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVJbnRBcnJheShtT3BzKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtVHJhbnNpdGlvbik7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobU5hbWUpOworICAgICAgICBkZXN0LndyaXRlSW50KG1JbmRleCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPEJhY2tTdGFja1N0YXRlPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8QmFja1N0YWNrU3RhdGU+KCkgeworICAgICAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmFja1N0YWNrU3RhdGUoaW4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCYWNrU3RhY2tTdGF0ZVtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKy8qKgorICogQGhpZGUgRW50cnkgb2YgYW4gb3BlcmF0aW9uIG9uIHRoZSBmcmFnbWVudCBiYWNrIHN0YWNrLgorICovCitmaW5hbCBjbGFzcyBCYWNrU3RhY2tFbnRyeSBpbXBsZW1lbnRzIEZyYWdtZW50VHJhbnNhY3Rpb24sIFJ1bm5hYmxlIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCYWNrU3RhY2tFbnRyeSI7CisgICAgCisgICAgZmluYWwgRnJhZ21lbnRNYW5hZ2VySW1wbCBtTWFuYWdlcjsKKyAgICAKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX05VTEwgPSAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BfQUREID0gMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX1JFUExBQ0UgPSAyOworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BfUkVNT1ZFID0gMzsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX0hJREUgPSA0OworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BfU0hPVyA9IDU7CisgICAgCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIE9wIHsKKyAgICAgICAgT3AgbmV4dDsKKyAgICAgICAgT3AgcHJldjsKKyAgICAgICAgaW50IGNtZDsKKyAgICAgICAgRnJhZ21lbnQgZnJhZ21lbnQ7CisgICAgICAgIGludCBlbnRlckFuaW07CisgICAgICAgIGludCBleGl0QW5pbTsKKyAgICAgICAgQXJyYXlMaXN0PEZyYWdtZW50PiByZW1vdmVkOworICAgIH0KKyAgICAKKyAgICBPcCBtSGVhZDsKKyAgICBPcCBtVGFpbDsKKyAgICBpbnQgbU51bU9wOworICAgIGludCBtRW50ZXJBbmltOworICAgIGludCBtRXhpdEFuaW07CisgICAgaW50IG1UcmFuc2l0aW9uOworICAgIGludCBtVHJhbnNpdGlvblN0eWxlOworICAgIGJvb2xlYW4gbUFkZFRvQmFja1N0YWNrOworICAgIFN0cmluZyBtTmFtZTsKKyAgICBib29sZWFuIG1Db21taXR0ZWQ7CisgICAgaW50IG1JbmRleDsKKyAgICAKKyAgICBwdWJsaWMgQmFja1N0YWNrRW50cnkoRnJhZ21lbnRNYW5hZ2VySW1wbCBtYW5hZ2VyKSB7CisgICAgICAgIG1NYW5hZ2VyID0gbWFuYWdlcjsKKyAgICB9CisgICAgCisgICAgdm9pZCBhZGRPcChPcCBvcCkgeworICAgICAgICBpZiAobUhlYWQgPT0gbnVsbCkgeworICAgICAgICAgICAgbUhlYWQgPSBtVGFpbCA9IG9wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3AucHJldiA9IG1UYWlsOworICAgICAgICAgICAgbVRhaWwubmV4dCA9IG9wOworICAgICAgICAgICAgbVRhaWwgPSBvcDsKKyAgICAgICAgfQorICAgICAgICBvcC5lbnRlckFuaW0gPSBtRW50ZXJBbmltOworICAgICAgICBvcC5leGl0QW5pbSA9IG1FeGl0QW5pbTsKKyAgICAgICAgbU51bU9wKys7CisgICAgfQorICAgICAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgZG9BZGRPcCgwLCBmcmFnbWVudCwgdGFnLCBPUF9BREQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgZG9BZGRPcChjb250YWluZXJWaWV3SWQsIGZyYWdtZW50LCBudWxsLCBPUF9BREQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgZG9BZGRPcChjb250YWluZXJWaWV3SWQsIGZyYWdtZW50LCB0YWcsIE9QX0FERCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb0FkZE9wKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgdGFnLCBpbnQgb3BjbWQpIHsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCBhbHJlYWR5IGFkZGVkOiAiICsgZnJhZ21lbnQpOworICAgICAgICB9CisgICAgICAgIGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9IG1NYW5hZ2VyLm1BY3Rpdml0eTsKKyAgICAgICAgCisgICAgICAgIGlmICh0YWcgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1UYWcgIT0gbnVsbCAmJiAhdGFnLmVxdWFscyhmcmFnbWVudC5tVGFnKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbid0IGNoYW5nZSB0YWcgb2YgZnJhZ21lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBmcmFnbWVudCArICI6IHdhcyAiICsgZnJhZ21lbnQubVRhZworICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdyAiICsgdGFnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYWdtZW50Lm1UYWcgPSB0YWc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChjb250YWluZXJWaWV3SWQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1GcmFnbWVudElkICE9IDAgJiYgZnJhZ21lbnQubUZyYWdtZW50SWQgIT0gY29udGFpbmVyVmlld0lkKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2FuJ3QgY2hhbmdlIGNvbnRhaW5lciBJRCBvZiBmcmFnbWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGZyYWdtZW50ICsgIjogd2FzICIgKyBmcmFnbWVudC5tRnJhZ21lbnRJZAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdyAiICsgY29udGFpbmVyVmlld0lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYWdtZW50Lm1Db250YWluZXJJZCA9IGZyYWdtZW50Lm1GcmFnbWVudElkID0gY29udGFpbmVyVmlld0lkOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBPcCBvcCA9IG5ldyBPcCgpOworICAgICAgICBvcC5jbWQgPSBvcGNtZDsKKyAgICAgICAgb3AuZnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICAgICAgYWRkT3Aob3ApOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHJlcGxhY2UoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgcmV0dXJuIHJlcGxhY2UoY29udGFpbmVyVmlld0lkLCBmcmFnbWVudCwgbnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHJlcGxhY2UoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgaWYgKGNvbnRhaW5lclZpZXdJZCA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNdXN0IHVzZSBub24temVybyBjb250YWluZXJWaWV3SWQiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZG9BZGRPcChjb250YWluZXJWaWV3SWQsIGZyYWdtZW50LCB0YWcsIE9QX1JFUExBQ0UpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVtb3ZlKEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgICAgIGlmIChmcmFnbWVudC5tSW1tZWRpYXRlQWN0aXZpdHkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgbm90IGFkZGVkOiAiICsgZnJhZ21lbnQpOworICAgICAgICB9CisgICAgICAgIGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9IG51bGw7CisgICAgICAgIAorICAgICAgICBPcCBvcCA9IG5ldyBPcCgpOworICAgICAgICBvcC5jbWQgPSBPUF9SRU1PVkU7CisgICAgICAgIG9wLmZyYWdtZW50ID0gZnJhZ21lbnQ7CisgICAgICAgIGFkZE9wKG9wKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGhpZGUoRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCBub3QgYWRkZWQ6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE9wIG9wID0gbmV3IE9wKCk7CisgICAgICAgIG9wLmNtZCA9IE9QX0hJREU7CisgICAgICAgIG9wLmZyYWdtZW50ID0gZnJhZ21lbnQ7CisgICAgICAgIGFkZE9wKG9wKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzaG93KEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgICAgIGlmIChmcmFnbWVudC5tSW1tZWRpYXRlQWN0aXZpdHkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgbm90IGFkZGVkOiAiICsgZnJhZ21lbnQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBPcCBvcCA9IG5ldyBPcCgpOworICAgICAgICBvcC5jbWQgPSBPUF9TSE9XOworICAgICAgICBvcC5mcmFnbWVudCA9IGZyYWdtZW50OworICAgICAgICBhZGRPcChvcCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0Q3VzdG9tQW5pbWF0aW9ucyhpbnQgZW50ZXIsIGludCBleGl0KSB7CisgICAgICAgIG1FbnRlckFuaW0gPSBlbnRlcjsKKyAgICAgICAgbUV4aXRBbmltID0gZXhpdDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldFRyYW5zaXRpb24oaW50IHRyYW5zaXRpb24pIHsKKyAgICAgICAgbVRyYW5zaXRpb24gPSB0cmFuc2l0aW9uOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0VHJhbnNpdGlvblN0eWxlKGludCBzdHlsZVJlcykgeworICAgICAgICBtVHJhbnNpdGlvblN0eWxlID0gc3R5bGVSZXM7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGRUb0JhY2tTdGFjayhTdHJpbmcgbmFtZSkgeworICAgICAgICBtQWRkVG9CYWNrU3RhY2sgPSB0cnVlOworICAgICAgICBtTmFtZSA9IG5hbWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHZvaWQgYnVtcEJhY2tTdGFja05lc3RpbmcoaW50IGFtdCkgeworICAgICAgICBpZiAoIW1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsICJCdW1wIG5lc3RpbmcgaW4gIiArIHRoaXMKKyAgICAgICAgICAgICAgICArICIgYnkgIiArIGFtdCk7CisgICAgICAgIE9wIG9wID0gbUhlYWQ7CisgICAgICAgIHdoaWxlIChvcCAhPSBudWxsKSB7CisgICAgICAgICAgICBvcC5mcmFnbWVudC5tQmFja1N0YWNrTmVzdGluZyArPSBhbXQ7CisgICAgICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VySW1wbC5ERUJVRykgTG9nLnYoVEFHLCAiQnVtcCBuZXN0aW5nIG9mICIKKyAgICAgICAgICAgICAgICAgICAgKyBvcC5mcmFnbWVudCArICIgdG8gIiArIG9wLmZyYWdtZW50Lm1CYWNrU3RhY2tOZXN0aW5nKTsKKyAgICAgICAgICAgIGlmIChvcC5yZW1vdmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPW9wLnJlbW92ZWQuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCByID0gb3AucmVtb3ZlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIHIubUJhY2tTdGFja05lc3RpbmcgKz0gYW10OworICAgICAgICAgICAgICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VySW1wbC5ERUJVRykgTG9nLnYoVEFHLCAiQnVtcCBuZXN0aW5nIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHIgKyAiIHRvICIgKyByLm1CYWNrU3RhY2tOZXN0aW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGNvbW1pdCgpIHsKKyAgICAgICAgaWYgKG1Db21taXR0ZWQpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNvbW1pdCBhbHJlYWR5IGNhbGxlZCIpOworICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VySW1wbC5ERUJVRykgTG9nLnYoVEFHLCAiQ29tbWl0OiAiICsgdGhpcyk7CisgICAgICAgIG1Db21taXR0ZWQgPSB0cnVlOworICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICBtSW5kZXggPSBtTWFuYWdlci5hbGxvY0JhY2tTdGFja0luZGV4KHRoaXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUluZGV4ID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgbU1hbmFnZXIuZW5xdWV1ZUFjdGlvbih0aGlzKTsKKyAgICAgICAgcmV0dXJuIG1JbmRleDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VySW1wbC5ERUJVRykgTG9nLnYoVEFHLCAiUnVuOiAiICsgdGhpcyk7CisgICAgICAgIAorICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICBpZiAobUluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZFRvQmFja1N0YWNrKCkgY2FsbGVkIGFmdGVyIGNvbW1pdCgpIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBidW1wQmFja1N0YWNrTmVzdGluZygxKTsKKworICAgICAgICBPcCBvcCA9IG1IZWFkOworICAgICAgICB3aGlsZSAob3AgIT0gbnVsbCkgeworICAgICAgICAgICAgc3dpdGNoIChvcC5jbWQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX0FERDogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZW50ZXJBbmltOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5hZGRGcmFnbWVudChmLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1JFUExBQ0U6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBpZiAobU1hbmFnZXIubUFkZGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtTWFuYWdlci5tQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBvbGQgPSBtTWFuYWdlci5tQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT1BfUkVQTEFDRTogYWRkaW5nPSIgKyBmICsgIiBvbGQ9IiArIG9sZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZC5tQ29udGFpbmVySWQgPT0gZi5tQ29udGFpbmVySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wLnJlbW92ZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AucmVtb3ZlZCA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AucmVtb3ZlZC5hZGQob2xkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLm1OZXh0QW5pbSA9IG9wLmV4aXRBbmltOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQubUJhY2tTdGFja05lc3RpbmcgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsICJCdW1wIG5lc3Rpbmcgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9sZCArICIgdG8gIiArIG9sZC5tQmFja1N0YWNrTmVzdGluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIucmVtb3ZlRnJhZ21lbnQob2xkLCBtVHJhbnNpdGlvbiwgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZW50ZXJBbmltOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5hZGRGcmFnbWVudChmLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1JFTU9WRTogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZXhpdEFuaW07CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUZyYWdtZW50KGYsIG1UcmFuc2l0aW9uLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfSElERTogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZXhpdEFuaW07CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmhpZGVGcmFnbWVudChmLCBtVHJhbnNpdGlvbiwgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1NIT1c6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBmLm1OZXh0QW5pbSA9IG9wLmVudGVyQW5pbTsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIuc2hvd0ZyYWdtZW50KGYsIG1UcmFuc2l0aW9uLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBjbWQ6ICIgKyBvcC5jbWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtTWFuYWdlci5tb3ZlVG9TdGF0ZShtTWFuYWdlci5tQ3VyU3RhdGUsIG1UcmFuc2l0aW9uLAorICAgICAgICAgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUsIHRydWUpOworICAgICAgICAKKyAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgbU1hbmFnZXIuYWRkQmFja1N0YWNrU3RhdGUodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcG9wRnJvbUJhY2tTdGFjayhib29sZWFuIGRvU3RhdGVNb3ZlKSB7CisgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsICJwb3BGcm9tQmFja1N0YWNrOiAiICsgdGhpcyk7CisKKyAgICAgICAgYnVtcEJhY2tTdGFja05lc3RpbmcoLTEpOworICAgICAgICAKKyAgICAgICAgT3Agb3AgPSBtVGFpbDsKKyAgICAgICAgd2hpbGUgKG9wICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3AuY21kKSB7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9BREQ6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBmLm1JbW1lZGlhdGVBY3Rpdml0eSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUZyYWdtZW50KGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5yZXZlcnNlVHJhbnNpdChtVHJhbnNpdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1JFUExBQ0U6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBmLm1JbW1lZGlhdGVBY3Rpdml0eSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUZyYWdtZW50KGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5yZXZlcnNlVHJhbnNpdChtVHJhbnNpdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcC5yZW1vdmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxvcC5yZW1vdmVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgb2xkID0gb3AucmVtb3ZlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tSW1tZWRpYXRlQWN0aXZpdHkgPSBtTWFuYWdlci5tQWN0aXZpdHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIuYWRkRnJhZ21lbnQob2xkLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfUkVNT1ZFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgZi5tSW1tZWRpYXRlQWN0aXZpdHkgPSBtTWFuYWdlci5tQWN0aXZpdHk7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZEZyYWdtZW50KGYsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfSElERTogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnNob3dGcmFnbWVudChmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwucmV2ZXJzZVRyYW5zaXQobVRyYW5zaXRpb24pLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfU0hPVzogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmhpZGVGcmFnbWVudChmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwucmV2ZXJzZVRyYW5zaXQobVRyYW5zaXRpb24pLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBjbWQ6ICIgKyBvcC5jbWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgb3AgPSBvcC5wcmV2OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoZG9TdGF0ZU1vdmUpIHsKKyAgICAgICAgICAgIG1NYW5hZ2VyLm1vdmVUb1N0YXRlKG1NYW5hZ2VyLm1DdXJTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5yZXZlcnNlVHJhbnNpdChtVHJhbnNpdGlvbiksIG1UcmFuc2l0aW9uU3R5bGUsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1JbmRleCA+PSAwKSB7CisgICAgICAgICAgICBtTWFuYWdlci5mcmVlQmFja1N0YWNrSW5kZXgobUluZGV4KTsKKyAgICAgICAgICAgIG1JbmRleCA9IC0xOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1OYW1lOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldFRyYW5zaXRpb24oKSB7CisgICAgICAgIHJldHVybiBtVHJhbnNpdGlvbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXRUcmFuc2l0aW9uU3R5bGUoKSB7CisgICAgICAgIHJldHVybiBtVHJhbnNpdGlvblN0eWxlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0NvbnRleHRJbXBsLmphdmEKaW5kZXggNzUxMzczNi4uMThlY2MyNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0NvbnRleHRJbXBsLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0NvbnRleHRJbXBsLmphdmEKQEAgLTU2LDExICs1NiwxNCBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeURldGVjdG9yOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uSUNvdW50cnlEZXRlY3RvcjsKIGltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLklMb2NhdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CkBAIC04OSw3ICs5Miw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5GaWxlVXRpbHMuRmlsZVN0YXR1czsKIGltcG9ydCBhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuQ2xpcGJvYXJkTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcGJvYXJkTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKQEAgLTE2OSw2ICsxNzIsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIFRocm90dGxlTWFuYWdlciBzVGhyb3R0bGVNYW5hZ2VyOwogICAgIHByaXZhdGUgc3RhdGljIFdpZmlNYW5hZ2VyIHNXaWZpTWFuYWdlcjsKICAgICBwcml2YXRlIHN0YXRpYyBMb2NhdGlvbk1hbmFnZXIgc0xvY2F0aW9uTWFuYWdlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBDb3VudHJ5RGV0ZWN0b3Igc0NvdW50cnlEZXRlY3RvcjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgU2hhcmVkUHJlZmVyZW5jZXNJbXBsPiBzU2hhcmVkUHJlZnMgPQogICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBTaGFyZWRQcmVmZXJlbmNlc0ltcGw+KCk7CiAKQEAgLTU0Myw2ICs1NDcsMTUgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUsIGludCBtb2RlLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgRmlsZSBmID0gdmFsaWRhdGVGaWxlUGF0aChuYW1lLCB0cnVlKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShmLmdldFBhdGgoKSwgZmFjdG9yeSwgZXJyb3JIYW5kbGVyKTsKKyAgICAgICAgc2V0RmlsZVBlcm1pc3Npb25zRnJvbU1vZGUoZi5nZXRQYXRoKCksIG1vZGUsIDApOworICAgICAgICByZXR1cm4gZGI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZGVsZXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEZpbGUgZiA9IHZhbGlkYXRlRmlsZVBhdGgobmFtZSwgZmFsc2UpOwpAQCAtNjIwLDcgKzYzMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICsgIiBJcyB0aGlzIHJlYWxseSB3aGF0IHlvdSB3YW50PyIpOwogICAgICAgICB9CiAgICAgICAgIG1NYWluVGhyZWFkLmdldEluc3RydW1lbnRhdGlvbigpLmV4ZWNTdGFydEFjdGl2aXR5KAotICAgICAgICAgICAgZ2V0T3V0ZXJDb250ZXh0KCksIG1NYWluVGhyZWFkLmdldEFwcGxpY2F0aW9uVGhyZWFkKCksIG51bGwsIG51bGwsIGludGVudCwgLTEpOworICAgICAgICAgICAgZ2V0T3V0ZXJDb250ZXh0KCksIG1NYWluVGhyZWFkLmdldEFwcGxpY2F0aW9uVGhyZWFkKCksIG51bGwsCisgICAgICAgICAgICAoQWN0aXZpdHkpbnVsbCwgaW50ZW50LCAtMSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC05NDQsNiArOTU4LDggQEAKICAgICAgICAgICAgIHJldHVybiBBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZSh0aGlzKTsKICAgICAgICAgfSBlbHNlIGlmIChMT0NBVElPTl9TRVJWSUNFLmVxdWFscyhuYW1lKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldExvY2F0aW9uTWFuYWdlcigpOworICAgICAgICB9IGVsc2UgaWYgKENPVU5UUllfREVURUNUT1IuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q291bnRyeURldGVjdG9yKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoU0VBUkNIX1NFUlZJQ0UuZXF1YWxzKG5hbWUpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0U2VhcmNoTWFuYWdlcigpOwogICAgICAgICB9IGVsc2UgaWYgKFNFTlNPUl9TRVJWSUNFLmVxdWFscyhuYW1lKSkgewpAQCAtMTExMCw2ICsxMTI2LDE3IEBACiAgICAgICAgIHJldHVybiBzTG9jYXRpb25NYW5hZ2VyOwogICAgIH0KIAorICAgIHByaXZhdGUgQ291bnRyeURldGVjdG9yIGdldENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzU3luYykgeworICAgICAgICAgICAgaWYgKHNDb3VudHJ5RGV0ZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ09VTlRSWV9ERVRFQ1RPUik7CisgICAgICAgICAgICAgICAgSUNvdW50cnlEZXRlY3RvciBzZXJ2aWNlID0gSUNvdW50cnlEZXRlY3Rvci5TdHViLmFzSW50ZXJmYWNlKGIpOworICAgICAgICAgICAgICAgIHNDb3VudHJ5RGV0ZWN0b3IgPSBuZXcgQ291bnRyeURldGVjdG9yKHNlcnZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzQ291bnRyeURldGVjdG9yOworICAgIH0KKwogICAgIHByaXZhdGUgU2VhcmNoTWFuYWdlciBnZXRTZWFyY2hNYW5hZ2VyKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CiAgICAgICAgICAgICBpZiAobVNlYXJjaE1hbmFnZXIgPT0gbnVsbCkgewpAQCAtMjc3Nyw2ICsyODA0LDEzIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHYgIT0gbnVsbCA/IHYgOiBkZWZWYWx1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFN0cmluZ1NldChTdHJpbmcga2V5LCBTZXQ8U3RyaW5nPiBkZWZWYWx1ZXMpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IHYgPSAoU2V0PFN0cmluZz4pIG1NYXAuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHYgIT0gbnVsbCA/IHYgOiBkZWZWYWx1ZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgaW50IGdldEludChTdHJpbmcga2V5LCBpbnQgZGVmVmFsdWUpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewpAQCAtMjgzOCw2ICsyODcyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBFZGl0b3IgcHV0U3RyaW5nU2V0KFN0cmluZyBrZXksIFNldDxTdHJpbmc+IHZhbHVlcykgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgICAgICBtTW9kaWZpZWQucHV0KGtleSwgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgcHVibGljIEVkaXRvciBwdXRJbnQoU3RyaW5nIGtleSwgaW50IHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Nb2RpZmllZC5wdXQoa2V5LCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nLmphdmEKaW5kZXggZGE4YzllNS4uYTBiZTBjZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0RpYWxvZy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EaWFsb2cuamF2YQpAQCAtMTYsMTggKzE2LDIxIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hcHA7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWN0aW9uQmFySW1wbDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuUG9saWN5TWFuYWdlcjsKIAotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CkBAIC0zNiwxMyArMzksMTIgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKIAogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKQEAgLTc2LDYgKzc4LDcgQEAKICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyIG1XaW5kb3dNYW5hZ2VyOwogICAgIFdpbmRvdyBtV2luZG93OwogICAgIFZpZXcgbURlY29yOworICAgIHByaXZhdGUgQWN0aW9uQmFySW1wbCBtQWN0aW9uQmFyOwogICAgIC8qKgogICAgICAqIFRoaXMgZmllbGQgc2hvdWxkIGJlIG1hZGUgcHJpdmF0ZSwgc28gaXQgaXMgaGlkZGVuIGZyb20gdGhlIFNESy4KICAgICAgKiB7QGhpZGV9CkBAIC0xNzcsNiArMTgwLDE1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIHtAbGluayBBY3Rpb25CYXJ9IGF0dGFjaGVkIHRvIHRoaXMgZGlhbG9nLCBpZiBwcmVzZW50LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgQWN0aW9uQmFyIGF0dGFjaGVkIHRvIHRoZSBkaWFsb2cgb3IgbnVsbCBpZiBubyBBY3Rpb25CYXIgaXMgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uQmFyIGdldEFjdGlvbkJhcigpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25CYXI7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgQWN0aXZpdHkgdGhhdCBvd25zIHRoaXMgZGlhbG9nLiBBbiBleGFtcGxlIHVzZTogVGhpcyBEaWFsb2cgd2lsbAogICAgICAqIHVzZSB0aGUgc3VnZ2VzdGVkIHZvbHVtZSBjb250cm9sIHN0cmVhbSBvZiB0aGUgQWN0aXZpdHkuCiAgICAgICogCkBAIC0yMTYsNiArMjI4LDkgQEAKICAgICBwdWJsaWMgdm9pZCBzaG93KCkgewogICAgICAgICBpZiAobVNob3dpbmcpIHsKICAgICAgICAgICAgIGlmIChtRGVjb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtV2luZG93Lmhhc0ZlYXR1cmUoV2luZG93LkZFQVRVUkVfQUNUSU9OX0JBUikpIHsKKyAgICAgICAgICAgICAgICAgICAgbVdpbmRvdy5pbnZhbGlkYXRlUGFuZWxNZW51KFdpbmRvdy5GRUFUVVJFX0FDVElPTl9CQVIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtRGVjb3Iuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMjI3LDYgKzI0MiwxMSBAQAogCiAgICAgICAgIG9uU3RhcnQoKTsKICAgICAgICAgbURlY29yID0gbVdpbmRvdy5nZXREZWNvclZpZXcoKTsKKworICAgICAgICBpZiAobUFjdGlvbkJhciA9PSBudWxsICYmIG1XaW5kb3cuaGFzRmVhdHVyZShXaW5kb3cuRkVBVFVSRV9BQ1RJT05fQkFSKSkgeworICAgICAgICAgICAgbUFjdGlvbkJhciA9IG5ldyBBY3Rpb25CYXJJbXBsKHRoaXMpOworICAgICAgICB9CisKICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbCA9IG1XaW5kb3cuZ2V0QXR0cmlidXRlcygpOwogICAgICAgICBpZiAoKGwuc29mdElucHV0TW9kZQogICAgICAgICAgICAgICAgICYgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9JU19GT1JXQVJEX05BVklHQVRJT04pID09IDApIHsKQEAgLTMxMCw3ICszMzAsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNpbWlsYXIgdG8ge0BsaW5rIEFjdGl2aXR5I29uQ3JlYXRlfSwgeW91IHNob3VsZCBpbml0aWFsaXplZCB5b3VyIGRpYWxvZworICAgICAqIFNpbWlsYXIgdG8ge0BsaW5rIEFjdGl2aXR5I29uQ3JlYXRlfSwgeW91IHNob3VsZCBpbml0aWFsaXplIHlvdXIgZGlhbG9nCiAgICAgICogaW4gdGhpcyBtZXRob2QsIGluY2x1ZGluZyBjYWxsaW5nIHtAbGluayAjc2V0Q29udGVudFZpZXd9LgogICAgICAqIEBwYXJhbSBzYXZlZEluc3RhbmNlU3RhdGUgSWYgdGhpcyBkaWFsb2cgaXMgYmVpbmcgcmVpbml0YWxpemVkIGFmdGVyIGEKICAgICAgKiAgICAgdGhlIGhvc3RpbmcgYWN0aXZpdHkgd2FzIHByZXZpb3VzbHkgc2h1dCBkb3duLCBob2xkcyB0aGUgcmVzdWx0IGZyb20KQEAgLTc3NSw2ICs3OTUsMTMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBAc2VlIEFjdGl2aXR5I2ludmFsaWRhdGVPcHRpb25zTWVudSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZU9wdGlvbnNNZW51KCkgeworICAgICAgICBtV2luZG93LmludmFsaWRhdGVQYW5lbE1lbnUoV2luZG93LkZFQVRVUkVfT1BUSU9OU19QQU5FTCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQHNlZSBBY3Rpdml0eSNvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51LCBWaWV3LCBDb250ZXh0TWVudUluZm8pCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51LCBWaWV3IHYsIENvbnRleHRNZW51SW5mbyBtZW51SW5mbykgewpAQCAtODMyLDggKzg1OSwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIEFjdGlvbk1vZGUgb25TdGFydEFjdGlvbk1vZGUoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvbkJhci5zdGFydEFjdGlvbk1vZGUoY2FsbGJhY2spOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGFjdGl2aXR5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRpYWxvZywgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBhc3NvY2FpdGVkIGFjdGl2aXR5LgorICAgICAqIEByZXR1cm4gVGhlIGFjdGl2aXR5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRpYWxvZywgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIGFjdGl2aXR5LgogICAgICAqLwogICAgIHByaXZhdGUgQ29tcG9uZW50TmFtZSBnZXRBc3NvY2lhdGVkQWN0aXZpdHkoKSB7CiAgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gbU93bmVyQWN0aXZpdHk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nRnJhZ21lbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EaWFsb2dGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZGZhYzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDQ1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CisKKy8qKgorICogQSBmcmFnbWVudCB0aGF0IGRpc3BsYXlzIGEgZGlhbG9nIHdpbmRvdywgZmxvYXRpbmcgb24gdG9wIG9mIGl0cworICogYWN0aXZpdHkncyB3aW5kb3cuICBUaGlzIGZyYWdtZW50IGNvbnRhaW5zIGEgRGlhbG9nIG9iamVjdCwgd2hpY2ggaXQKKyAqIGRpc3BsYXlzIGFzIGFwcHJvcHJpYXRlIGJhc2VkIG9uIHRoZSBmcmFnbWVudCdzIHN0YXRlLiAgQ29udHJvbCBvZgorICogdGhlIGRpYWxvZyAoZGVjaWRpbmcgd2hlbiB0byBzaG93LCBoaWRlLCBkaXNtaXNzIGl0KSBzaG91bGQgYmUgZG9uZSB0aHJvdWdoCisgKiB0aGUgQVBJIGhlcmUsIG5vdCB3aXRoIGRpcmVjdCBjYWxscyBvbiB0aGUgZGlhbG9nLgorICoKKyAqIDxwPkltcGxlbWVudGF0aW9ucyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBjbGFzcyBhbmQgaW1wbGVtZW50CisgKiB7QGxpbmsgI29uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciwgVmlld0dyb3VwLCBCdW5kbGUpfSB0byBzdXBwbHkgdGhlCisgKiBjb250ZW50IG9mIHRoZSBkaWFsb2cuICBBbHRlcm5hdGl2ZWx5LCB0aGV5IGNhbiBvdmVycmlkZQorICoge0BsaW5rICNvbkNyZWF0ZURpYWxvZyhCdW5kbGUpfSB0byBjcmVhdGUgYW4gZW50aXJlbHkgY3VzdG9tIGRpYWxvZywgc3VjaAorICogYXMgYW4gQWxlcnREaWFsb2csIHdpdGggaXRzIG93biBjb250ZW50LgorICoKKyAqIDxwPlRvcGljcyBjb3ZlcmVkIGhlcmU6CisgKiA8b2w+CisgKiA8bGk+PGEgaHJlZj0iI0xpZmVjeWNsZSI+TGlmZWN5Y2xlPC9hPgorICogPGxpPjxhIGhyZWY9IiNCYXNpY0RpYWxvZyI+QmFzaWMgRGlhbG9nPC9hPgorICogPGxpPjxhIGhyZWY9IiNBbGVydERpYWxvZyI+QWxlcnQgRGlhbG9nPC9hPgorICogPGxpPjxhIGhyZWY9IiNEaWFsb2dPckVtYmVkIj5TZWxlY3RpbmcgQmV0d2VlbiBEaWFsb2cgb3IgRW1iZWRkaW5nPC9hPgorICogPC9vbD4KKyAqCisgKiA8YSBuYW1lPSJMaWZlY3ljbGUiPjwvYT4KKyAqIDxoMz5MaWZlY3ljbGU8L2gzPgorICoKKyAqIDxwPkRpYWxvZ0ZyYWdtZW50IGRvZXMgdmFyaW91cyB0aGluZ3MgdG8ga2VlcCB0aGUgZnJhZ21lbnQncyBsaWZlY3ljbGUKKyAqIGRyaXZpbmcgaXQsIGluc3RlYWQgb2YgdGhlIERpYWxvZy4gIE5vdGUgdGhhdCBkaWFsb2dzIGFyZSBnZW5lcmFsbHkKKyAqIGF1dG9ub21vdXMgZW50aXRpZXMgLS0gdGhleSBhcmUgdGhlaXIgb3duIHdpbmRvdywgcmVjZWl2aW5nIHRoZWlyIG93bgorICogaW5wdXQgZXZlbnRzLCBhbmQgb2Z0ZW4gZGVjaWRpbmcgb24gdGhlaXIgb3duIHdoZW4gdG8gZGlzYXBwZWFyIChieQorICogcmVjZWl2aW5nIGEgYmFjayBrZXkgZXZlbnQgb3IgdGhlIHVzZXIgY2xpY2tpbmcgb24gYSBidXR0b24pLgorICoKKyAqIDxwPkRpYWxvZ0ZyYWdtZW50IG5lZWRzIHRvIGVuc3VyZSB0aGF0IHdoYXQgaXMgaGFwcGVuaW5nIHdpdGggdGhlIEZyYWdtZW50CisgKiBhbmQgRGlhbG9nIHN0YXRlcyByZW1haW5zIGNvbnNpc3RlbnQuICBUbyBkbyB0aGlzLCBpdCB3YXRjaGVzIGZvciBkaXNtaXNzCisgKiBldmVudHMgZnJvbSB0aGUgZGlhbG9nIGFuZCB0YWtlcyBhcmUgb2YgcmVtb3ZpbmcgaXRzIG93biBzdGF0ZSB3aGVuIHRoZXkKKyAqIGhhcHBlbi4gIFRoaXMgbWVhbnMgeW91IHNob3VsZCB1c2Uge0BsaW5rICNzaG93KEZyYWdtZW50TWFuYWdlciwgU3RyaW5nKX0KKyAqIG9yIHtAbGluayAjc2hvdyhGcmFnbWVudFRyYW5zYWN0aW9uLCBTdHJpbmcpfSB0byBhZGQgYW4gaW5zdGFuY2Ugb2YKKyAqIERpYWxvZ0ZyYWdtZW50IHRvIHlvdXIgVUksIGFzIHRoZXNlIGtlZXAgdHJhY2sgb2YgaG93IERpYWxvZ0ZyYWdtZW50IHNob3VsZAorICogcmVtb3ZlIGl0c2VsZiB3aGVuIHRoZSBkaWFsb2cgaXMgZGlzbWlzc2VkLgorICoKKyAqIDxhIG5hbWU9IkJhc2ljRGlhbG9nIj48L2E+CisgKiA8aDM+QmFzaWMgRGlhbG9nPC9oMz4KKyAqCisgKiA8cD5UaGUgc2ltcGxlc3QgdXNlIG9mIERpYWxvZ0ZyYWdtZW50IGlzIGFzIGEgZmxvYXRpbmcgY29udGFpbmVyIGZvciB0aGUKKyAqIGZyYWdtZW50J3MgdmlldyBoaWVyYXJjaHkuICBBIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBtYXkgbG9vayBsaWtlIHRoaXM6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZy5qYXZhCisgKiAgICAgIGRpYWxvZ30KKyAqCisgKiA8cD5BbiBleGFtcGxlIHNob3dEaWFsb2coKSBtZXRob2Qgb24gdGhlIEFjdGl2aXR5IGNvdWxkIGJlOgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnREaWFsb2cuamF2YQorICogICAgICBhZGRfZGlhbG9nfQorICoKKyAqIDxwPlRoaXMgcmVtb3ZlcyBhbnkgY3VycmVudGx5IHNob3duIGRpYWxvZywgY3JlYXRlcyBhIG5ldyBEaWFsb2dGcmFnbWVudAorICogd2l0aCBhbiBhcmd1bWVudCwgYW5kIHNob3dzIGl0IGFzIGEgbmV3IHN0YXRlIG9uIHRoZSBiYWNrIHN0YWNrLiAgV2hlbiB0aGUKKyAqIHRyYW5zYWN0aW9uIGlzIHBvcHBlZCwgdGhlIGN1cnJlbnQgRGlhbG9nRnJhZ21lbnQgYW5kIGl0cyBEaWFsb2cgd2lsbCBiZQorICogZGVzdHJveWVkLCBhbmQgdGhlIHByZXZpb3VzIG9uZSAoaWYgYW55KSByZS1zaG93bi4gIE5vdGUgdGhhdCBpbiB0aGlzIGNhc2UKKyAqIERpYWxvZ0ZyYWdtZW50IHdpbGwgdGFrZSBjYXJlIG9mIHBvcHBpbmcgdGhlIHRyYW5zYWN0aW9uIG9mIHRoZSBEaWFsb2cKKyAqIGlzIGRpc21pc3NlZCBzZXBhcmF0ZWx5IGZyb20gaXQuCisgKgorICogPGEgbmFtZT0iQWxlcnREaWFsb2ciPjwvYT4KKyAqIDxoMz5BbGVydCBEaWFsb2c8L2gzPgorICoKKyAqIDxwPkluc3RlYWQgb2YgKG9yIGluIGFkZGl0aW9uIHRvKSBpbXBsZW1lbnRpbmcge0BsaW5rICNvbkNyZWF0ZVZpZXd9IHRvCisgKiBnZW5lcmF0ZSB0aGUgdmlldyBoaWVyYXJjaHkgaW5zaWRlIG9mIGEgZGlhbG9nLCB5b3UgbWF5IGltcGxlbWVudAorICoge0BsaW5rICNvbkNyZWF0ZURpYWxvZyhCdW5kbGUpfSB0byBjcmVhdGUgeW91ciBvd24gY3VzdG9tIERpYWxvZyBvYmplY3QuCisgKgorICogPHA+VGhpcyBpcyBtb3N0IHVzZWZ1bCBmb3IgY3JlYXRpbmcgYW4ge0BsaW5rIEFsZXJ0RGlhbG9nfSwgYWxsb3dpbmcgeW91CisgKiB0byBkaXNwbGF5IHN0YW5kYXJkIGFsZXJ0cyB0byB0aGUgdXNlciB0aGF0IGFyZSBtYW5hZ2VkIGJ5IGEgZnJhZ21lbnQuCisgKiBBIHNpbXBsZSBleGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaXM6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudEFsZXJ0RGlhbG9nLmphdmEKKyAqICAgICAgZGlhbG9nfQorICoKKyAqIDxwPlRoZSBhY3Rpdml0eSBjcmVhdGluZyB0aGlzIGZyYWdtZW50IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB0bworICogc2hvdyB0aGUgZGlhbG9nIGFuZCByZWNlaXZlIHJlc3VsdHMgZnJvbSBpdDoKKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50QWxlcnREaWFsb2cuamF2YQorICogICAgICBhY3Rpdml0eX0KKyAqCisgKiA8cD5Ob3RlIHRoYXQgaW4gdGhpcyBjYXNlIHRoZSBmcmFnbWVudCBpcyBub3QgcGxhY2VkIG9uIHRoZSBiYWNrIHN0YWNrLCBpdAorICogaXMganVzdCBhZGRlZCBhcyBhbiBpbmRlZmluaXRlbHkgcnVubmluZyBmcmFnbWVudC4gIEJlY2F1c2UgZGlhbG9ncyBub3JtYWxseQorICogYXJlIG1vZGFsLCB0aGlzIHdpbGwgc3RpbGwgb3BlcmF0ZSBhcyBhIGJhY2sgc3RhY2ssIHNpbmNlIHRoZSBkaWFsb2cgd2lsbAorICogY2FwdHVyZSB1c2VyIGlucHV0IHVudGlsIGl0IGlzIGRpc21pc3NlZC4gIFdoZW4gaXQgaXMgZGlzbWlzc2VkLCBEaWFsb2dGcmFnbWVudAorICogd2lsbCB0YWtlIGNhcmUgb2YgcmVtb3ZpbmcgaXRzZWxmIGZyb20gaXRzIGZyYWdtZW50IG1hbmFnZXIuCisgKgorICogPGEgbmFtZT0iRGlhbG9nT3JFbWJlZCI+PC9hPgorICogPGgzPlNlbGVjdGluZyBCZXR3ZWVuIERpYWxvZyBvciBFbWJlZGRpbmc8L2gzPgorICoKKyAqIDxwPkEgRGlhbG9nRnJhZ21lbnQgY2FuIHN0aWxsIG9wdGlvbmFsbHkgYmUgdXNlZCBhcyBhIG5vcm1hbCBmcmFnbWVudCwgaWYKKyAqIGRlc2lyZWQuICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIGZyYWdtZW50IHRoYXQgaW4gc29tZSBjYXNlcyBzaG91bGQKKyAqIGJlIHNob3duIGFzIGEgZGlhbG9nIGFuZCBvdGhlcnMgZW1iZWRkZWQgaW4gYSBsYXJnZXIgVUkuICBUaGlzIGJlaGF2aW9yCisgKiB3aWxsIG5vcm1hbGx5IGJlIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgZm9yIHlvdSBiYXNlZCBvbiBob3cgeW91IGFyZSB1c2luZworICogdGhlIGZyYWdtZW50LCBidXQgY2FuIGJlIGN1c3RvbWl6ZWQgd2l0aCB7QGxpbmsgI3NldFNob3dzRGlhbG9nKGJvb2xlYW4pfS4KKyAqCisgKiA8cD5Gb3IgZXhhbXBsZSwgaGVyZSBpcyBhIHNpbXBsZSBkaWFsb2cgZnJhZ21lbnQ6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkuamF2YQorICogICAgICBkaWFsb2d9CisgKgorICogPHA+QW4gaW5zdGFuY2Ugb2YgdGhpcyBmcmFnbWVudCBjYW4gYmUgY3JlYXRlZCBhbmQgc2hvd24gYXMgYSBkaWFsb2c6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkuamF2YQorICogICAgICBzaG93X2RpYWxvZ30KKyAqCisgKiA8cD5JdCBjYW4gYWxzbyBiZSBhZGRlZCBhcyBjb250ZW50IGluIGEgdmlldyBoaWVyYXJjaHk6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkuamF2YQorICogICAgICBlbWJlZH0KKyAqLworcHVibGljIGNsYXNzIERpYWxvZ0ZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQKKyAgICAgICAgaW1wbGVtZW50cyBEaWFsb2dJbnRlcmZhY2UuT25DYW5jZWxMaXN0ZW5lciwgRGlhbG9nSW50ZXJmYWNlLk9uRGlzbWlzc0xpc3RlbmVyIHsKKworICAgIC8qKgorICAgICAqIFN0eWxlIGZvciB7QGxpbmsgI3NldFN0eWxlKGludCwgaW50KX06IGEgYmFzaWMsCisgICAgICogbm9ybWFsIGRpYWxvZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFlMRV9OT1JNQUwgPSAwOworCisgICAgLyoqCisgICAgICogU3R5bGUgZm9yIHtAbGluayAjc2V0U3R5bGUoaW50LCBpbnQpfTogZG9uJ3QgaW5jbHVkZQorICAgICAqIGEgdGl0bGUgYXJlYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFlMRV9OT19USVRMRSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBTdHlsZSBmb3Ige0BsaW5rICNzZXRTdHlsZShpbnQsIGludCl9OiBkb24ndCBkcmF3CisgICAgICogYW55IGZyYW1lIGF0IGFsbDsgdGhlIHZpZXcgaGllcmFyY2h5IHJldHVybmVkIGJ5IHtAbGluayAjb25DcmVhdGVWaWV3fQorICAgICAqIGlzIGVudGlyZWx5IHJlc3BvbnNpYmxlIGZvciBkcmF3aW5nIHRoZSBkaWFsb2cuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfTk9fRlJBTUUgPSAyOworCisgICAgLyoqCisgICAgICogU3R5bGUgZm9yIHtAbGluayAjc2V0U3R5bGUoaW50LCBpbnQpfTogbGlrZQorICAgICAqIHtAbGluayAjU1RZTEVfTk9fRlJBTUV9LCBidXQgYWxzbyBkaXNhYmxlcyBhbGwgaW5wdXQgdG8gdGhlIGRpYWxvZy4KKyAgICAgKiBUaGUgdXNlciBjYW4gbm90IHRvdWNoIGl0LCBhbmQgaXRzIHdpbmRvdyB3aWxsIG5vdCByZWNlaXZlIGlucHV0IGZvY3VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUWUxFX05PX0lOUFVUID0gMzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9ESUFMT0dfU1RBVEVfVEFHID0gImFuZHJvaWQ6c2F2ZWREaWFsb2dTdGF0ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX1NUWUxFID0gImFuZHJvaWQ6c3R5bGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9USEVNRSA9ICJhbmRyb2lkOnRoZW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfQ0FOQ0VMQUJMRSA9ICJhbmRyb2lkOmNhbmNlbGFibGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9TSE9XU19ESUFMT0cgPSAiYW5kcm9pZDpzaG93c0RpYWxvZyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX0JBQ0tfU1RBQ0tfSUQgPSAiYW5kcm9pZDpiYWNrU3RhY2tJZCI7CisKKyAgICBpbnQgbVN0eWxlID0gU1RZTEVfTk9STUFMOworICAgIGludCBtVGhlbWUgPSAwOworICAgIGJvb2xlYW4gbUNhbmNlbGFibGUgPSB0cnVlOworICAgIGJvb2xlYW4gbVNob3dzRGlhbG9nID0gdHJ1ZTsKKyAgICBpbnQgbUJhY2tTdGFja0lkID0gLTE7CisKKyAgICBEaWFsb2cgbURpYWxvZzsKKyAgICBib29sZWFuIG1EZXN0cm95ZWQ7CisgICAgYm9vbGVhbiBtUmVtb3ZlZDsKKworICAgIHB1YmxpYyBEaWFsb2dGcmFnbWVudCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHRvIGN1c3RvbWl6ZSB0aGUgYmFzaWMgYXBwZWFyYW5jZSBhbmQgYmVoYXZpb3Igb2YgdGhlCisgICAgICogZnJhZ21lbnQncyBkaWFsb2cuICBUaGlzIGNhbiBiZSB1c2VkIGZvciBzb21lIGNvbW1vbiBkaWFsb2cgYmVoYXZpb3JzLAorICAgICAqIHRha2luZyBjYXJlIG9mIHNlbGVjdGluZyBmbGFncywgdGhlbWUsIGFuZCBvdGhlciBvcHRpb25zIGZvciB5b3UuICBUaGUKKyAgICAgKiBzYW1lIGVmZmVjdCBjYW4gYmUgYWNoaWV2ZSBieSBtYW51YWxseSBzZXR0aW5nIERpYWxvZyBhbmQgV2luZG93CisgICAgICogYXR0cmlidXRlcyB5b3Vyc2VsZi4gIENhbGxpbmcgdGhpcyBhZnRlciB0aGUgZnJhZ21lbnQncyBEaWFsb2cgaXMKKyAgICAgKiBjcmVhdGVkIHdpbGwgaGF2ZSBubyBlZmZlY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3R5bGUgU2VsZWN0cyBhIHN0YW5kYXJkIHN0eWxlOiBtYXkgYmUge0BsaW5rICNTVFlMRV9OT1JNQUx9LAorICAgICAqIHtAbGluayAjU1RZTEVfTk9fVElUTEV9LCB7QGxpbmsgI1NUWUxFX05PX0ZSQU1FfSwgb3IKKyAgICAgKiB7QGxpbmsgI1NUWUxFX05PX0lOUFVUfS4KKyAgICAgKiBAcGFyYW0gdGhlbWUgT3B0aW9uYWwgY3VzdG9tIHRoZW1lLiAgSWYgMCwgYW4gYXBwcm9wcmlhdGUgdGhlbWUgKGJhc2VkCisgICAgICogb24gdGhlIHN0eWxlKSB3aWxsIGJlIHNlbGVjdGVkIGZvciB5b3UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3R5bGUoaW50IHN0eWxlLCBpbnQgdGhlbWUpIHsKKyAgICAgICAgbVN0eWxlID0gc3R5bGU7CisgICAgICAgIGlmIChtU3R5bGUgPT0gU1RZTEVfTk9fRlJBTUUgfHwgbVN0eWxlID09IFNUWUxFX05PX0lOUFVUKSB7CisgICAgICAgICAgICBtVGhlbWUgPSBhbmRyb2lkLlIuc3R5bGUuVGhlbWVfRGlhbG9nX05vRnJhbWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoZW1lICE9IDApIHsKKyAgICAgICAgICAgIG1UaGVtZSA9IHRoZW1lOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB7QGxpbmsgI3Nob3coRnJhZ21lbnRNYW5hZ2VyLCBTdHJpbmcpfS4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyB2b2lkIHNob3coQWN0aXZpdHkgYWN0aXZpdHksIFN0cmluZyB0YWcpIHsKKyAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCA9IGFjdGl2aXR5Lm9wZW5GcmFnbWVudFRyYW5zYWN0aW9uKCk7CisgICAgICAgIGZ0LmFkZCh0aGlzLCB0YWcpOworICAgICAgICBmdC5jb21taXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IHRoZSBkaWFsb2csIGFkZGluZyB0aGUgZnJhZ21lbnQgdG8gdGhlIGdpdmVuIEZyYWdtZW50TWFuYWdlci4gIFRoaXMKKyAgICAgKiBpcyBhIGNvbnZlbmllbmNlIGZvciBleHBsaWNpdGx5IGNyZWF0aW5nIGEgdHJhbnNhY3Rpb24sIGFkZGluZyB0aGUKKyAgICAgKiBmcmFnbWVudCB0byBpdCB3aXRoIHRoZSBnaXZlbiB0YWcsIGFuZCBjb21taXR0aW5nIGl0LiAgVGhpcyBkb2VzCisgICAgICogPGVtPm5vdDwvZW0+IGFkZCB0aGUgdHJhbnNhY3Rpb24gdG8gdGhlIGJhY2sgc3RhY2suICBXaGVuIHRoZSBmcmFnbWVudAorICAgICAqIGlzIGRpc21pc3NlZCwgYSBuZXcgdHJhbnNhY3Rpb24gd2lsbCBiZSBleGVjdXRlZCB0byByZW1vdmUgaXQgZnJvbQorICAgICAqIHRoZSBhY3Rpdml0eS4KKyAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgRnJhZ21lbnRNYW5hZ2VyIHRoaXMgZnJhZ21lbnQgd2lsbCBiZSBhZGRlZCB0by4KKyAgICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgZm9yIHRoaXMgZnJhZ21lbnQsIGFzIHBlcgorICAgICAqIHtAbGluayBGcmFnbWVudFRyYW5zYWN0aW9uI2FkZChGcmFnbWVudCwgU3RyaW5nKSBGcmFnbWVudFRyYW5zYWN0aW9uLmFkZH0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hvdyhGcmFnbWVudE1hbmFnZXIgbWFuYWdlciwgU3RyaW5nIHRhZykgeworICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gbWFuYWdlci5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgZnQuYWRkKHRoaXMsIHRhZyk7CisgICAgICAgIGZ0LmNvbW1pdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BsYXkgdGhlIGRpYWxvZywgYWRkaW5nIHRoZSBmcmFnbWVudCB1c2luZyBhbiBleGlzdGluZyB0cmFuc2FjdGlvbgorICAgICAqIGFuZCB0aGVuIGNvbW1pdHRpbmcgdGhlIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbiBBbiBleGlzdGluZyB0cmFuc2FjdGlvbiBpbiB3aGljaCB0byBhZGQgdGhlIGZyYWdtZW50LgorICAgICAqIEBwYXJhbSB0YWcgVGhlIHRhZyBmb3IgdGhpcyBmcmFnbWVudCwgYXMgcGVyCisgICAgICoge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb24jYWRkKEZyYWdtZW50LCBTdHJpbmcpIEZyYWdtZW50VHJhbnNhY3Rpb24uYWRkfS4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvbW1pdHRlZCB0cmFuc2FjdGlvbiwgYXMgcGVyCisgICAgICoge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb24jY29tbWl0KCkgRnJhZ21lbnRUcmFuc2FjdGlvbi5jb21taXQoKX0uCisgICAgICovCisgICAgcHVibGljIGludCBzaG93KEZyYWdtZW50VHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24sIFN0cmluZyB0YWcpIHsKKyAgICAgICAgdHJhbnNhY3Rpb24uYWRkKHRoaXMsIHRhZyk7CisgICAgICAgIG1SZW1vdmVkID0gZmFsc2U7CisgICAgICAgIG1CYWNrU3RhY2tJZCA9IHRyYW5zYWN0aW9uLmNvbW1pdCgpOworICAgICAgICByZXR1cm4gbUJhY2tTdGFja0lkOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc21pc3MgdGhlIGZyYWdtZW50IGFuZCBpdHMgZGlhbG9nLiAgSWYgdGhlIGZyYWdtZW50IHdhcyBhZGRlZCB0byB0aGUKKyAgICAgKiBiYWNrIHN0YWNrLCBhbGwgYmFjayBzdGFjayBzdGF0ZSB1cCB0byBhbmQgaW5jbHVkaW5nIHRoaXMgZW50cnkgd2lsbAorICAgICAqIGJlIHBvcHBlZC4gIE90aGVyd2lzZSwgYSBuZXcgdHJhbnNhY3Rpb24gd2lsbCBiZSBjb21taXR0ZWQgdG8gcmVtb3ZlCisgICAgICogdGhlIGZyYWdtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc21pc3MoKSB7CisgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EaWFsb2cuZGlzbWlzcygpOworICAgICAgICAgICAgbURpYWxvZyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgbVJlbW92ZWQgPSB0cnVlOworICAgICAgICBpZiAobUJhY2tTdGFja0lkID49IDApIHsKKyAgICAgICAgICAgIGdldEZyYWdtZW50TWFuYWdlcigpLnBvcEJhY2tTdGFjayhtQmFja1N0YWNrSWQsCisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlci5QT1BfQkFDS19TVEFDS19JTkNMVVNJVkUpOworICAgICAgICAgICAgbUJhY2tTdGFja0lkID0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gZ2V0RnJhZ21lbnRNYW5hZ2VyKCkub3BlblRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICBmdC5yZW1vdmUodGhpcyk7CisgICAgICAgICAgICBmdC5jb21taXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBEaWFsb2cgZ2V0RGlhbG9nKCkgeworICAgICAgICByZXR1cm4gbURpYWxvZzsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRoZW1lKCkgeworICAgICAgICByZXR1cm4gbVRoZW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2wgd2hldGhlciB0aGUgc2hvd24gRGlhbG9nIGlzIGNhbmNlbGFibGUuICBVc2UgdGhpcyBpbnN0ZWFkIG9mCisgICAgICogZGlyZWN0bHkgY2FsbGluZyB7QGxpbmsgRGlhbG9nI3NldENhbmNlbGFibGUoYm9vbGVhbikKKyAgICAgKiBEaWFsb2cuc2V0Q2FuY2VsYWJsZShib29sZWFuKX0sIGJlY2F1c2UgRGlhbG9nRnJhZ21lbnQgbmVlZHMgdG8gY2hhbmdlCisgICAgICogaXRzIGJlaGF2aW9yIGJhc2VkIG9uIHRoaXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FuY2VsYWJsZSBJZiB0cnVlLCB0aGUgZGlhbG9nIGlzIGNhbmNlbGFibGUuICBUaGUgZGVmYXVsdAorICAgICAqIGlzIHRydWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FuY2VsYWJsZShib29sZWFuIGNhbmNlbGFibGUpIHsKKyAgICAgICAgbUNhbmNlbGFibGUgPSBjYW5jZWxhYmxlOworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSBtRGlhbG9nLnNldENhbmNlbGFibGUoY2FuY2VsYWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHtAbGluayAjc2V0Q2FuY2VsYWJsZShib29sZWFuKX0uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q2FuY2VsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1DYW5jZWxhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhpcyBmcmFnbWVudCBzaG91bGQgYmUgc2hvd24gaW4gYSBkaWFsb2cuICBJZiBub3QKKyAgICAgKiBzZXQsIG5vIERpYWxvZyB3aWxsIGJlIGNyZWF0ZWQgaW4ge0BsaW5rICNvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUpfSwKKyAgICAgKiBhbmQgdGhlIGZyYWdtZW50J3MgdmlldyBoaWVyYXJjaHkgd2lsbCB0aHVzIG5vdCBiZSBhZGRlZCB0byBpdC4gIFRoaXMKKyAgICAgKiBhbGxvd3MgeW91IHRvIGluc3RlYWQgdXNlIGl0IGFzIGEgbm9ybWFsIGZyYWdtZW50IChlbWJlZGRlZCBpbnNpZGUgb2YKKyAgICAgKiBpdHMgYWN0aXZpdHkpLgorICAgICAqCisgICAgICogPHA+VGhpcyBpcyBub3JtYWxseSBzZXQgZm9yIHlvdSBiYXNlZCBvbiB3aGV0aGVyIHRoZSBmcmFnbWVudCBpcworICAgICAqIGFzc29jaWF0ZWQgd2l0aCBhIGNvbnRhaW5lciB2aWV3IElEIHBhc3NlZCB0bworICAgICAqIHtAbGluayBGcmFnbWVudFRyYW5zYWN0aW9uI2FkZChpbnQsIEZyYWdtZW50KSBGcmFnbWVudFRyYW5zYWN0aW9uLmFkZChpbnQsIEZyYWdtZW50KX0uCisgICAgICogSWYgdGhlIGZyYWdtZW50IHdhcyBhZGRlZCB3aXRoIGEgY29udGFpbmVyLCBzZXRTaG93c0RpYWxvZyB3aWxsIGJlCisgICAgICogaW5pdGlhbGl6ZWQgdG8gZmFsc2U7IG90aGVyd2lzZSwgaXQgd2lsbCBiZSB0cnVlLgorICAgICAqCisgICAgICogQHBhcmFtIHNob3dzRGlhbG9nIElmIHRydWUsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGRpc3BsYXllZCBpbiBhIERpYWxvZy4KKyAgICAgKiBJZiBmYWxzZSwgbm8gRGlhbG9nIHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlIGZyYWdtZW50J3MgdmlldyBoaWVyYXJjaGx5CisgICAgICogbGVmdCB1bmRpc3R1cmJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93c0RpYWxvZyhib29sZWFuIHNob3dzRGlhbG9nKSB7CisgICAgICAgIG1TaG93c0RpYWxvZyA9IHNob3dzRGlhbG9nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiB7QGxpbmsgI3NldFNob3dzRGlhbG9nKGJvb2xlYW4pfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93c0RpYWxvZygpIHsKKyAgICAgICAgcmV0dXJuIG1TaG93c0RpYWxvZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgbVNob3dzRGlhbG9nID0gbUNvbnRhaW5lcklkID09IDA7CisKKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3R5bGUgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KFNBVkVEX1NUWUxFLCBTVFlMRV9OT1JNQUwpOworICAgICAgICAgICAgbVRoZW1lID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEludChTQVZFRF9USEVNRSwgMCk7CisgICAgICAgICAgICBtQ2FuY2VsYWJsZSA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRCb29sZWFuKFNBVkVEX0NBTkNFTEFCTEUsIHRydWUpOworICAgICAgICAgICAgbVNob3dzRGlhbG9nID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEJvb2xlYW4oU0FWRURfU0hPV1NfRElBTE9HLCBtU2hvd3NEaWFsb2cpOworICAgICAgICAgICAgbUJhY2tTdGFja0lkID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEludChTQVZFRF9CQUNLX1NUQUNLX0lELCAtMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEaWFsb2coZ2V0QWN0aXZpdHkoKSwgZ2V0VGhlbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25DYW5jZWwoRGlhbG9nSW50ZXJmYWNlIGRpYWxvZykgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uRGlzbWlzcyhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nKSB7CisgICAgICAgIGlmICghbVJlbW92ZWQpIHsKKyAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBpZiAoIW1TaG93c0RpYWxvZykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbURpYWxvZyA9IG9uQ3JlYXRlRGlhbG9nKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIG1EZXN0cm95ZWQgPSBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChtU3R5bGUpIHsKKyAgICAgICAgICAgIGNhc2UgU1RZTEVfTk9fSU5QVVQ6CisgICAgICAgICAgICAgICAgbURpYWxvZy5nZXRXaW5kb3coKS5hZGRGbGFncygKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRSB8CisgICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSEFCTEUpOworICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaC4uLgorICAgICAgICAgICAgY2FzZSBTVFlMRV9OT19GUkFNRToKKyAgICAgICAgICAgIGNhc2UgU1RZTEVfTk9fVElUTEU6CisgICAgICAgICAgICAgICAgbURpYWxvZy5yZXF1ZXN0V2luZG93RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9OT19USVRMRSk7CisgICAgICAgIH0KKyAgICAgICAgVmlldyB2aWV3ID0gZ2V0VmlldygpOworICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAodmlldy5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRGlhbG9nRnJhZ21lbnQgY2FuIG5vdCBiZSBhdHRhY2hlZCB0byBhIGNvbnRhaW5lciB2aWV3Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGlhbG9nLnNldENvbnRlbnRWaWV3KHZpZXcpOworICAgICAgICB9CisgICAgICAgIG1EaWFsb2cuc2V0T3duZXJBY3Rpdml0eShnZXRBY3Rpdml0eSgpKTsKKyAgICAgICAgbURpYWxvZy5zZXRDYW5jZWxhYmxlKG1DYW5jZWxhYmxlKTsKKyAgICAgICAgbURpYWxvZy5zZXRPbkNhbmNlbExpc3RlbmVyKHRoaXMpOworICAgICAgICBtRGlhbG9nLnNldE9uRGlzbWlzc0xpc3RlbmVyKHRoaXMpOworICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBkaWFsb2dTdGF0ZSA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRCdW5kbGUoU0FWRURfRElBTE9HX1NUQVRFX1RBRyk7CisgICAgICAgICAgICBpZiAoZGlhbG9nU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1EaWFsb2cub25SZXN0b3JlSW5zdGFuY2VTdGF0ZShkaWFsb2dTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICBzdXBlci5vblN0YXJ0KCk7CisgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SZW1vdmVkID0gZmFsc2U7CisgICAgICAgICAgICBtRGlhbG9nLnNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUob3V0U3RhdGUpOworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICBCdW5kbGUgZGlhbG9nU3RhdGUgPSBtRGlhbG9nLm9uU2F2ZUluc3RhbmNlU3RhdGUoKTsKKyAgICAgICAgICAgIGlmIChkaWFsb2dTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0U3RhdGUucHV0QnVuZGxlKFNBVkVEX0RJQUxPR19TVEFURV9UQUcsIGRpYWxvZ1N0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobVN0eWxlICE9IFNUWUxFX05PUk1BTCkgeworICAgICAgICAgICAgb3V0U3RhdGUucHV0SW50KFNBVkVEX1NUWUxFLCBtU3R5bGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtVGhlbWUgIT0gMCkgeworICAgICAgICAgICAgb3V0U3RhdGUucHV0SW50KFNBVkVEX1RIRU1FLCBtVGhlbWUpOworICAgICAgICB9CisgICAgICAgIGlmICghbUNhbmNlbGFibGUpIHsKKyAgICAgICAgICAgIG91dFN0YXRlLnB1dEJvb2xlYW4oU0FWRURfQ0FOQ0VMQUJMRSwgbUNhbmNlbGFibGUpOworICAgICAgICB9CisgICAgICAgIGlmICghbVNob3dzRGlhbG9nKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRCb29sZWFuKFNBVkVEX1NIT1dTX0RJQUxPRywgbVNob3dzRGlhbG9nKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUJhY2tTdGFja0lkICE9IC0xKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoU0FWRURfQkFDS19TVEFDS19JRCwgbUJhY2tTdGFja0lkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgc3VwZXIub25TdG9wKCk7CisgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EaWFsb2cuaGlkZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGRpYWxvZy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lWaWV3KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3lWaWV3KCk7CisgICAgICAgIG1EZXN0cm95ZWQgPSB0cnVlOworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBTZXQgcmVtb3ZlZCBoZXJlIGJlY2F1c2UgdGhpcyBkaXNtaXNzYWwgaXMganVzdCB0byBoaWRlCisgICAgICAgICAgICAvLyB0aGUgZGlhbG9nIC0tIHdlIGRvbid0IHdhbnQgdGhpcyB0byBjYXVzZSB0aGUgZnJhZ21lbnQgdG8KKyAgICAgICAgICAgIC8vIGFjdHVhbGx5IGJlIHJlbW92ZWQuCisgICAgICAgICAgICBtUmVtb3ZlZCA9IHRydWU7CisgICAgICAgICAgICBtRGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgICAgIG1EaWFsb2cgPSBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmNmMzk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEKQEAgLTAsMCArMSwxMDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudENhbGxiYWNrczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ZpbmFsIGNsYXNzIEZyYWdtZW50U3RhdGUgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBmaW5hbCBTdHJpbmcgbUNsYXNzTmFtZTsKKyAgICBmaW5hbCBpbnQgbUluZGV4OworICAgIGZpbmFsIGJvb2xlYW4gbUZyb21MYXlvdXQ7CisgICAgZmluYWwgaW50IG1GcmFnbWVudElkOworICAgIGZpbmFsIGludCBtQ29udGFpbmVySWQ7CisgICAgZmluYWwgU3RyaW5nIG1UYWc7CisgICAgZmluYWwgYm9vbGVhbiBtUmV0YWluSW5zdGFuY2U7CisgICAgZmluYWwgQnVuZGxlIG1Bcmd1bWVudHM7CisgICAgCisgICAgQnVuZGxlIG1TYXZlZEZyYWdtZW50U3RhdGU7CisgICAgCisgICAgRnJhZ21lbnQgbUluc3RhbmNlOworICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFN0YXRlKEZyYWdtZW50IGZyYWcpIHsKKyAgICAgICAgbUNsYXNzTmFtZSA9IGZyYWcuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgIG1JbmRleCA9IGZyYWcubUluZGV4OworICAgICAgICBtRnJvbUxheW91dCA9IGZyYWcubUZyb21MYXlvdXQ7CisgICAgICAgIG1GcmFnbWVudElkID0gZnJhZy5tRnJhZ21lbnRJZDsKKyAgICAgICAgbUNvbnRhaW5lcklkID0gZnJhZy5tQ29udGFpbmVySWQ7CisgICAgICAgIG1UYWcgPSBmcmFnLm1UYWc7CisgICAgICAgIG1SZXRhaW5JbnN0YW5jZSA9IGZyYWcubVJldGFpbkluc3RhbmNlOworICAgICAgICBtQXJndW1lbnRzID0gZnJhZy5tQXJndW1lbnRzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRTdGF0ZShQYXJjZWwgaW4pIHsKKyAgICAgICAgbUNsYXNzTmFtZSA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgbUluZGV4ID0gaW4ucmVhZEludCgpOworICAgICAgICBtRnJvbUxheW91dCA9IGluLnJlYWRJbnQoKSAhPSAwOworICAgICAgICBtRnJhZ21lbnRJZCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbUNvbnRhaW5lcklkID0gaW4ucmVhZEludCgpOworICAgICAgICBtVGFnID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICBtUmV0YWluSW5zdGFuY2UgPSBpbi5yZWFkSW50KCkgIT0gMDsKKyAgICAgICAgbUFyZ3VtZW50cyA9IGluLnJlYWRCdW5kbGUoKTsKKyAgICAgICAgbVNhdmVkRnJhZ21lbnRTdGF0ZSA9IGluLnJlYWRCdW5kbGUoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50IGluc3RhbnRpYXRlKEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIGlmIChtSW5zdGFuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbUluc3RhbmNlID0gRnJhZ21lbnQuaW5zdGFudGlhdGUoYWN0aXZpdHksIG1DbGFzc05hbWUsIG1Bcmd1bWVudHMpOworICAgICAgICAKKyAgICAgICAgaWYgKG1TYXZlZEZyYWdtZW50U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNhdmVkRnJhZ21lbnRTdGF0ZS5zZXRDbGFzc0xvYWRlcihhY3Rpdml0eS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIG1JbnN0YW5jZS5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbVNhdmVkRnJhZ21lbnRTdGF0ZTsKKyAgICAgICAgfQorICAgICAgICBtSW5zdGFuY2Uuc2V0SW5kZXgobUluZGV4KTsKKyAgICAgICAgbUluc3RhbmNlLm1Gcm9tTGF5b3V0ID0gbUZyb21MYXlvdXQ7CisgICAgICAgIG1JbnN0YW5jZS5tRnJhZ21lbnRJZCA9IG1GcmFnbWVudElkOworICAgICAgICBtSW5zdGFuY2UubUNvbnRhaW5lcklkID0gbUNvbnRhaW5lcklkOworICAgICAgICBtSW5zdGFuY2UubVRhZyA9IG1UYWc7CisgICAgICAgIG1JbnN0YW5jZS5tUmV0YWluSW5zdGFuY2UgPSBtUmV0YWluSW5zdGFuY2U7CisgICAgICAgIAorICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1DbGFzc05hbWUpOworICAgICAgICBkZXN0LndyaXRlSW50KG1JbmRleCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUZyb21MYXlvdXQgPyAxIDogMCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUZyYWdtZW50SWQpOworICAgICAgICBkZXN0LndyaXRlSW50KG1Db250YWluZXJJZCk7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVRhZyk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVJldGFpbkluc3RhbmNlID8gMSA6IDApOworICAgICAgICBkZXN0LndyaXRlQnVuZGxlKG1Bcmd1bWVudHMpOworICAgICAgICBkZXN0LndyaXRlQnVuZGxlKG1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxGcmFnbWVudFN0YXRlPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8RnJhZ21lbnRTdGF0ZT4oKSB7CisgICAgICAgIHB1YmxpYyBGcmFnbWVudFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50U3RhdGUoaW4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgRnJhZ21lbnRTdGF0ZVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50U3RhdGVbc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworfQorCisvKioKKyAqIEEgRnJhZ21lbnQgaXMgYSBwaWVjZSBvZiBhbiBhcHBsaWNhdGlvbidzIHVzZXIgaW50ZXJmYWNlIG9yIGJlaGF2aW9yCisgKiB0aGF0IGNhbiBiZSBwbGFjZWQgaW4gYW4ge0BsaW5rIEFjdGl2aXR5fS4gIEludGVyYWN0aW9uIHdpdGggZnJhZ21lbnRzCisgKiBpcyBkb25lIHRocm91Z2gge0BsaW5rIEZyYWdtZW50TWFuYWdlcn0sIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCB2aWEKKyAqIHtAbGluayBBY3Rpdml0eSNnZXRGcmFnbWVudE1hbmFnZXIoKSBBY3Rpdml0eS5nZXRGcmFnbWVudE1hbmFnZXIoKX0gYW5kCisgKiB7QGxpbmsgRnJhZ21lbnQjZ2V0RnJhZ21lbnRNYW5hZ2VyKCkgRnJhZ21lbnQuZ2V0RnJhZ21lbnRNYW5hZ2VyKCl9LgorICoKKyAqIDxwPlRoZSBGcmFnbWVudCBjbGFzcyBjYW4gYmUgdXNlZCBtYW55IHdheXMgdG8gYWNoaWV2ZSBhIHdpZGUgdmFyaWV0eSBvZgorICogcmVzdWx0cy4gIEl0IGlzIGNvcmUsIGl0IHJlcHJlc2VudHMgYSBwYXJ0aWN1bGFyIG9wZXJhdGlvbiBvciBpbnRlcmZhY2UKKyAqIHRoYXQgaXMgcnVubmluZyB3aXRoaW4gYSBsYXJnZXIge0BsaW5rIEFjdGl2aXR5fS4gIEEgRnJhZ21lbnQgaXMgY2xvc2VseQorICogdGllZCB0byB0aGUgQWN0aXZpdHkgaXQgaXMgaW4sIGFuZCBjYW4gbm90IGJlIHVzZWQgYXBhcnQgZnJvbSBvbmUuICBUaG91Z2gKKyAqIEZyYWdtZW50IGRlZmluZXMgaXRzIG93biBsaWZlY3ljbGUsIHRoYXQgbGlmZWN5Y2xlIGlzIGRlcGVuZGVudCBvbiBpdHMKKyAqIGFjdGl2aXR5OiBpZiB0aGUgYWN0aXZpdHkgaXMgc3RvcHBlZCwgbm8gZnJhZ21lbnRzIGluc2lkZSBvZiBpdCBjYW4gYmUKKyAqIHN0YXJ0ZWQ7IHdoZW4gdGhlIGFjdGl2aXR5IGlzIGRlc3Ryb3llZCwgYWxsIGZyYWdtZW50cyB3aWxsIGJlIGRlc3Ryb3llZC4KKyAqCisgKiA8cD5BbGwgc3ViY2xhc3NlcyBvZiBGcmFnbWVudCBtdXN0IGluY2x1ZGUgYSBwdWJsaWMgZW1wdHkgY29uc3RydWN0b3IuCisgKiBUaGUgZnJhbWV3b3JrIHdpbGwgb2Z0ZW4gcmUtaW5zdGFudGlhdGUgYSBmcmFnbWVudCBjbGFzcyB3aGVuIG5lZWRlZCwKKyAqIGluIHBhcnRpY3VsYXIgZHVyaW5nIHN0YXRlIHJlc3RvcmUsIGFuZCBuZWVkcyB0byBiZSBhYmxlIHRvIGZpbmQgdGhpcworICogY29uc3RydWN0b3IgdG8gaW5zdGFudGlhdGUgaXQuICBJZiB0aGUgZW1wdHkgY29uc3RydWN0b3IgaXMgbm90IGF2YWlsYWJsZSwKKyAqIGEgcnVudGltZSBleGNlcHRpb24gd2lsbCBvY2N1ciBpbiBzb21lIGNhc2VzIGR1cmluZyBzdGF0ZSByZXN0b3JlLgorICoKKyAqIDxwPlRvcGljcyBjb3ZlcmVkIGhlcmU6CisgKiA8b2w+CisgKiA8bGk+PGEgaHJlZj0iI0xpZmVjeWNsZSI+TGlmZWN5Y2xlPC9hPgorICogPGxpPjxhIGhyZWY9IiNMYXlvdXQiPkxheW91dDwvYT4KKyAqIDxsaT48YSBocmVmPSIjQmFja1N0YWNrIj5CYWNrIFN0YWNrPC9hPgorICogPC9vbD4KKyAqCisgKiA8YSBuYW1lPSJMaWZlY3ljbGUiPjwvYT4KKyAqIDxoMz5MaWZlY3ljbGU8L2gzPgorICoKKyAqIDxwPlRob3VnaCBhIEZyYWdtZW50J3MgbGlmZWN5Y2xlIGlzIHRpZWQgdG8gaXRzIG93bmluZyBhY3Rpdml0eSwgaXQgaGFzCisgKiBpdHMgb3duIHdyaW5rbGUgb24gdGhlIHN0YW5kYXJkIGFjdGl2aXR5IGxpZmVjeWNsZS4gIEl0IGluY2x1ZGVzIGJhc2ljCisgKiBhY3Rpdml0eSBsaWZlY3ljbGUgbWV0aG9kcyBzdWNoIGFzIHtAbGluayAjb25SZXN1bWV9LCBidXQgYWxzbyBpbXBvcnRhbnQKKyAqIGFyZSBtZXRob2RzIHJlbGF0ZWQgdG8gaW50ZXJhY3Rpb25zIHdpdGggdGhlIGFjdGl2aXR5IGFuZCBVSSBnZW5lcmF0aW9uLgorICoKKyAqIDxwPlRoZSBjb3JlIHNlcmllcyBvZiBsaWZlY3ljbGUgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQgdG8gYnJpbmcgYSBmcmFnbWVudAorICogdXAgdG8gcmVzdW1lZCBzdGF0ZSAoaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdXNlcikgYXJlOgorICoKKyAqIDxvbD4KKyAqIDxsaT4ge0BsaW5rICNvbkF0dGFjaH0gY2FsbGVkIG9uY2UgdGhlIGZyYWdtZW50IGlzIGFzc29jaWF0ZWQgd2l0aCBpdHMgYWN0aXZpdHkuCisgKiA8bGk+IHtAbGluayAjb25DcmVhdGV9IGNhbGxlZCB0byBkbyBpbml0aWFsIGNyZWF0aW9uIG9mIHRoZSBmcmFnbWVudC4KKyAqIDxsaT4ge0BsaW5rICNvbkNyZWF0ZVZpZXd9IGNyZWF0ZXMgYW5kIHJldHVybnMgdGhlIHZpZXcgaGllcmFyY2h5IGFzc29jaWF0ZWQKKyAqIHdpdGggdGhlIGZyYWdtZW50LgorICogPGxpPiB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkfSB0ZWxscyB0aGUgZnJhZ21lbnQgdGhhdCBpdHMgYWN0aXZpdHkgaGFzCisgKiBjb21wbGV0ZWQgaXRzIG93biB7QGxpbmsgQWN0aXZpdHkjb25DcmVhdGUgQWN0aXZpdHkub25DcmVhYXRlfS4KKyAqIDxsaT4ge0BsaW5rICNvblN0YXJ0fSBtYWtlcyB0aGUgZnJhZ21lbnQgdmlzaWJsZSB0byB0aGUgdXNlciAoYmFzZWQgb24gaXRzCisgKiBjb250YWluaW5nIGFjdGl2aXR5IGJlaW5nIHN0YXJ0ZWQpLgorICogPGxpPiB7QGxpbmsgI29uUmVzdW1lfSBtYWtlcyB0aGUgZnJhZ21lbnQgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdXNlciAoYmFzZWQgb24gaXRzCisgKiBjb250YWluaW5nIGFjdGl2aXR5IGJlaW5nIHJlc3VtZWQpLgorICogPC9vbD4KKyAqCisgKiA8cD5BcyBhIGZyYWdtZW50IGlzIG5vIGxvbmdlciBiZWluZyB1c2VkLCBpdCBnb2VzIHRocm91Z2ggYSByZXZlcnNlCisgKiBzZXJpZXMgb2YgY2FsbGJhY2tzOgorICoKKyAqIDxvbD4KKyAqIDxsaT4ge0BsaW5rICNvblBhdXNlfSBmcmFnbWVudCBpcyBubyBsb25nZXIgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdXNlciBlaXRoZXIKKyAqIGJlY2F1c2UgaXRzIGFjdGl2aXR5IGlzIGJlaW5nIHBhdXNlZCBvciBhIGZyYWdtZW50IG9wZXJhdGlvbiBpcyBtb2RpZnlpbmcgaXQKKyAqIGluIHRoZSBhY3Rpdml0eS4KKyAqIDxsaT4ge0BsaW5rICNvblN0b3B9IGZyYWdtZW50IGlzIG5vIGxvbmdlciB2aXNpYmxlIHRvIHRoZSB1c2VyIGVpdGhlcgorICogYmVjYXVzZSBpdHMgYWN0aXZpdHkgaXMgYmVpbmcgc3RvcHBlZCBvciBhIGZyYWdtZW50IG9wZXJhdGlvbiBpcyBtb2RpZnlpbmcgaXQKKyAqIGluIHRoZSBhY3Rpdml0eS4KKyAqIDxsaT4ge0BsaW5rICNvbkRlc3Ryb3lWaWV3fSBhbGxvd3MgdGhlIGZyYWdtZW50IHRvIGNsZWFuIHVwIHJlc291cmNlcworICogYXNzb2NpYXRlZCB3aXRoIGl0cyBWaWV3LgorICogPGxpPiB7QGxpbmsgI29uRGVzdHJveX0gY2FsbGVkIHRvIGRvIGZpbmFsIGNsZWFudXAgb2YgdGhlIGZyYWdtZW50J3Mgc3RhdGUuCisgKiA8bGk+IHtAbGluayAjb25EZXRhY2h9IGNhbGxlZCBpbW1lZGlhdGVseSBwcmlvciB0byB0aGUgZnJhZ21lbnQgbm8gbG9uZ2VyCisgKiBiZWluZyBhc3NvY2lhdGVkIHdpdGggaXRzIGFjdGl2aXR5LgorICogPC9vbD4KKyAqCisgKiA8YSBuYW1lPSJMYXlvdXQiPjwvYT4KKyAqIDxoMz5MYXlvdXQ8L2gzPgorICoKKyAqIDxwPkZyYWdtZW50cyBjYW4gYmUgdXNlZCBhcyBwYXJ0IG9mIHlvdXIgYXBwbGljYXRpb24ncyBsYXlvdXQsIGFsbG93aW5nCisgKiB5b3UgdG8gYmV0dGVyIG1vZHVsYXJpemUgeW91ciBjb2RlIGFuZCBtb3JlIGVhc2lseSBhZGp1c3QgeW91ciB1c2VyCisgKiBpbnRlcmZhY2UgdG8gdGhlIHNjcmVlbiBpdCBpcyBydW5uaW5nIG9uLiAgQXMgYW4gZXhhbXBsZSwgd2UgY2FuIGxvb2sKKyAqIGF0IGEgc2ltcGxlIHByb2dyYW0gY29uc2lzdGluZyBvZiBhIGxpc3Qgb2YgaXRlbXMsIGFuZCBkaXNwbGF5IG9mIHRoZQorICogZGV0YWlscyBvZiBlYWNoIGl0ZW0uPC9wPgorICoKKyAqIDxwPkFuIGFjdGl2aXR5J3MgbGF5b3V0IFhNTCBjYW4gaW5jbHVkZSA8Y29kZT4mbHQ7ZnJhZ21lbnQmZ3Q7PC9jb2RlPiB0YWdzCisgKiB0byBlbWJlZCBmcmFnbWVudCBpbnN0YW5jZXMgaW5zaWRlIG9mIHRoZSBsYXlvdXQuICBGb3IgZXhhbXBsZSwgaGVyZSBpcworICogYSBzaW1wbHkgbGF5b3V0IHRoYXQgZW1iZWRzIG9uZSBmcmFnbWVudDo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2xheW91dC54bWwgbGF5b3V0fQorICoKKyAqIDxwPlRoZSBsYXlvdXQgaXMgaW5zdGFsbGVkIGluIHRoZSBhY3Rpdml0eSBpbiB0aGUgbm9ybWFsIHdheTo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExheW91dC5qYXZhCisgKiAgICAgIG1haW59CisgKgorICogPHA+VGhlIHRpdGxlcyBmcmFnbWVudCwgc2hvd2luZyBhIGxpc3Qgb2YgdGl0bGVzLCBpcyB2ZXJ5IHNpbXBsZSwgcmVseWluZworICogb24ge0BsaW5rIExpc3RGcmFnbWVudH0gZm9yIG1vc3Qgb2YgaXRzIHdvcmsuICBOb3RlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorICogY2xpY2tpbmcgYW4gaXRlbSwgd2hpY2ggY2FuIGVpdGhlciB1cGRhdGUKKyAqIHRoZSBjb250ZW50IG9mIHRoZSBkZXRhaWxzIGZyYWdtZW50IG9yIHN0YXJ0IGEgbmV3IGFjdGl2aXR5IHNob3cgdGhlCisgKiBkZXRhaWxzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBjdXJyZW50IGFjdGl2aXR5J3MgbGF5b3V0IGNhbiBzaG93IHRoZQorICogZGV0YWlscy48L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExheW91dC5qYXZhCisgKiAgICAgIHRpdGxlc30KKyAqCisgKiA8cD5UaGUgZGV0YWlscyBmcmFnbWVudCBzaG93aW5nIHRoZSBjb250ZW50cyBvZiBzZWxlY3RlZCBpdGVtIGhlcmUganVzdAorICogZGlzcGxheXMgYSBzdHJpbmcgb2YgdGV4dCBiYXNlZCBvbiBhbiBpbmRleCBvZiBhIHN0cmluZyBhcnJheSBidWlsdCBpbiB0bworICogdGhlIGFwcDo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExheW91dC5qYXZhCisgKiAgICAgIGRldGFpbHN9CisgKgorICogPHA+SW4gdGhpcyBjYXNlIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIGEgdGl0bGUsIHRoZXJlIGlzIG5vIGRldGFpbHMKKyAqIGZyYWdtZW50IGluIHRoZSBjdXJyZW50IGFjdGl2aXR5LCBzbyB0aGUgdGl0bGUgdGl0bGUgZnJhZ21lbnQncyBjbGljayBjb2RlIHdpbGwKKyAqIGxhdW5jaCBhIG5ldyBhY3Rpdml0eSB0byBkaXNwbGF5IHRoZSBkZXRhaWxzIGZyYWdtZW50OjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TGF5b3V0LmphdmEKKyAqICAgICAgZGV0YWlsc19hY3Rpdml0eX0KKyAqCisgKiA8cD5Ib3dldmVyIHRoZSBzY3JlZW4gbWF5IGJlIGxhcmdlIGVub3VnaCB0byBzaG93IGJvdGggdGhlIGxpc3Qgb2YgdGl0bGVzCisgKiBhbmQgZGV0YWlscyBhYm91dCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRpdGxlLiAgVG8gdXNlIHN1Y2ggYSBsYXlvdXQgb24KKyAqIGEgbGFuZHNjYXBlIHNjcmVlbiwgdGhpcyBhbHRlcm5hdGl2ZSBsYXlvdXQgY2FuIGJlIHBsYWNlZCB1bmRlciBsYXlvdXQtbGFuZDo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0LWxhbmQvZnJhZ21lbnRfbGF5b3V0LnhtbCBsYXlvdXR9CisgKgorICogPHA+Tm90ZSBob3cgdGhlIHByaW9yIGNvZGUgd2lsbCBhZGp1c3QgdG8gdGhpcyBhbHRlcm5hdGl2ZSBVSSBmbG93OiB0aGUKKyAqIHRpdGxlcyBmcmFnbWVudCB3aWxsIG5vdyBzaG93IGl0cyB0ZXh0IGluc2lkZSBvZiBpdHMgYWN0aXZpdHksIGFuZCB0aGUKKyAqIGRldGFpbHMgYWN0aXZpdHkgd2lsbCBmaW5pc2ggb2YgaXQgZmluZHMgaXRzZWxmIHJ1bm5pbmcgaW4gYSBjb25maWd1cmF0aW9uCisgKiB3aGVyZSB0aGUgZGV0YWlscyBjYW4gYmUgc2hvd24gaW5saW5lLgorICoKKyAqIDxhIG5hbWU9IkJhY2tTdGFjayI+PC9hPgorICogPGgzPkJhY2sgU3RhY2s8L2gzPgorICoKKyAqIDxwPlRoZSB0cmFuc2FjdGlvbiBpbiB3aGljaCBmcmFnbWVudHMgYXJlIG1vZGlmaWVkIGNhbiBiZSBwbGFjZWQgb24gYW4KKyAqIGludGVybmFsIGJhY2stc3RhY2sgb2YgdGhlIG93bmluZyBhY3Rpdml0eS4gIFdoZW4gdGhlIHVzZXIgcHJlc3NlcyBiYWNrCisgKiBpbiB0aGUgYWN0aXZpdHksIGFueSB0cmFuc2FjdGlvbnMgb24gdGhlIGJhY2sgc3RhY2sgYXJlIHBvcHBlZCBvZmYgYmVmb3JlCisgKiB0aGUgYWN0aXZpdHkgaXRzZWxmIGlzIGZpbmlzaGVkLgorICoKKyAqIDxwPkZvciBleGFtcGxlLCBjb25zaWRlciB0aGlzIHNpbXBsZSBmcmFnbWVudCB0aGF0IGlzIGluc3RhbnRpYXRlZCB3aXRoCisgKiBhbiBpbnRlZ2VyIGFyZ3VtZW50IGFuZCBkaXNwbGF5cyB0aGF0IGluIGEgVGV4dFZpZXcgaW4gaXRzIFVJOjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50U3RhY2suamF2YQorICogICAgICBmcmFnbWVudH0KKyAqCisgKiA8cD5BIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZnJhZ21lbnQsIHJlcGxhY2luZworICogd2hhdGV2ZXIgY3VycmVudCBmcmFnbWVudCBpbnN0YW5jZSBpcyBiZWluZyBzaG93biBhbmQgcHVzaGluZyB0aGF0IGNoYW5nZQorICogb24gdG8gdGhlIGJhY2sgc3RhY2sgY291bGQgYmUgd3JpdHRlbiBhczoKKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50U3RhY2suamF2YQorICogICAgICBhZGRfc3RhY2t9CisgKgorICogPHA+QWZ0ZXIgZWFjaCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24sIGEgbmV3IGVudHJ5IGlzIG9uIHRoZSBzdGFjaywgYW5kCisgKiBwcmVzc2luZyBiYWNrIHdpbGwgcG9wIGl0IHRvIHJldHVybiB0aGUgdXNlciB0byB3aGF0ZXZlciBwcmV2aW91cyBzdGF0ZQorICogdGhlIGFjdGl2aXR5IFVJIHdhcyBpbi4KKyAqLworcHVibGljIGNsYXNzIEZyYWdtZW50IGltcGxlbWVudHMgQ29tcG9uZW50Q2FsbGJhY2tzLCBPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBDbGFzczw/Pj4gc0NsYXNzTWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M8Pz4+KCk7CisgICAgCisgICAgc3RhdGljIGZpbmFsIGludCBJTklUSUFMSVpJTkcgPSAwOyAgICAgLy8gTm90IHlldCBjcmVhdGVkLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgQ1JFQVRFRCA9IDE7ICAgICAgICAgIC8vIENyZWF0ZWQuCisgICAgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9DUkVBVEVEID0gMjsgLy8gVGhlIGFjdGl2aXR5IGhhcyBmaW5pc2hlZCBpdHMgY3JlYXRpb24uCisgICAgc3RhdGljIGZpbmFsIGludCBTVEFSVEVEID0gMzsgICAgICAgICAgLy8gQ3JlYXRlZCBhbmQgc3RhcnRlZCwgbm90IHJlc3VtZWQuCisgICAgc3RhdGljIGZpbmFsIGludCBSRVNVTUVEID0gNDsgICAgICAgICAgLy8gQ3JlYXRlZCBzdGFydGVkIGFuZCByZXN1bWVkLgorICAgIAorICAgIGludCBtU3RhdGUgPSBJTklUSUFMSVpJTkc7CisgICAgCisgICAgLy8gV2hlbiBpbnN0YW50aWF0ZWQgZnJvbSBzYXZlZCBzdGF0ZSwgdGhpcyBpcyB0aGUgc2F2ZWQgc3RhdGUuCisgICAgQnVuZGxlIG1TYXZlZEZyYWdtZW50U3RhdGU7CisgICAgU3BhcnNlQXJyYXk8UGFyY2VsYWJsZT4gbVNhdmVkVmlld1N0YXRlOworICAgIAorICAgIC8vIEluZGV4IGludG8gYWN0aXZlIGZyYWdtZW50IGFycmF5LgorICAgIGludCBtSW5kZXggPSAtMTsKKyAgICAKKyAgICAvLyBJbnRlcm5hbCB1bmlxdWUgbmFtZSBmb3IgdGhpcyBmcmFnbWVudDsKKyAgICBTdHJpbmcgbVdobzsKKyAgICAKKyAgICAvLyBDb25zdHJ1Y3Rpb24gYXJndW1lbnRzOworICAgIEJ1bmRsZSBtQXJndW1lbnRzOworCisgICAgLy8gVGFyZ2V0IGZyYWdtZW50LgorICAgIEZyYWdtZW50IG1UYXJnZXQ7CisKKyAgICAvLyBUYXJnZXQgcmVxdWVzdCBjb2RlLgorICAgIGludCBtVGFyZ2V0UmVxdWVzdENvZGU7CisKKyAgICAvLyBUcnVlIGlmIHRoZSBmcmFnbWVudCBpcyBpbiB0aGUgbGlzdCBvZiBhZGRlZCBmcmFnbWVudHMuCisgICAgYm9vbGVhbiBtQWRkZWQ7CisgICAgCisgICAgLy8gVHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaXMgaW4gdGhlIHJlc3VtZWQgc3RhdGUuCisgICAgYm9vbGVhbiBtUmVzdW1lZDsKKyAgICAKKyAgICAvLyBTZXQgdG8gdHJ1ZSBpZiB0aGlzIGZyYWdtZW50IHdhcyBpbnN0YW50aWF0ZWQgZnJvbSBhIGxheW91dCBmaWxlLgorICAgIGJvb2xlYW4gbUZyb21MYXlvdXQ7CisgICAgCisgICAgLy8gTnVtYmVyIG9mIGFjdGl2ZSBiYWNrIHN0YWNrIGVudHJpZXMgdGhpcyBmcmFnbWVudCBpcyBpbi4KKyAgICBpbnQgbUJhY2tTdGFja05lc3Rpbmc7CisgICAgCisgICAgLy8gU2V0IGFzIHNvb24gYXMgYSBmcmFnbWVudCBpcyBhZGRlZCB0byBhIHRyYW5zYWN0aW9uIChvciByZW1vdmVkKSwKKyAgICAvLyB0byBiZSBhYmxlIHRvIGRvIHZhbGlkYXRpb24uCisgICAgQWN0aXZpdHkgbUltbWVkaWF0ZUFjdGl2aXR5OworICAgIAorICAgIC8vIEFjdGl2aXR5IHRoaXMgZnJhZ21lbnQgaXMgYXR0YWNoZWQgdG8uCisgICAgQWN0aXZpdHkgbUFjdGl2aXR5OworICAgIAorICAgIC8vIFRoZSBvcHRpb25hbCBpZGVudGlmaWVyIGZvciB0aGlzIGZyYWdtZW50IC0tIGVpdGhlciB0aGUgY29udGFpbmVyIElEIGlmIGl0CisgICAgLy8gd2FzIGR5bmFtaWNhbGx5IGFkZGVkIHRvIHRoZSB2aWV3IGhpZXJhcmNoeSwgb3IgdGhlIElEIHN1cHBsaWVkIGluCisgICAgLy8gbGF5b3V0LgorICAgIGludCBtRnJhZ21lbnRJZDsKKyAgICAKKyAgICAvLyBXaGVuIGEgZnJhZ21lbnQgaXMgYmVpbmcgZHluYW1pY2FsbHkgYWRkZWQgdG8gdGhlIHZpZXcgaGllcmFyY2h5LCB0aGlzCisgICAgLy8gaXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHBhcmVudCBjb250YWluZXIgaXQgaXMgYmVpbmcgYWRkZWQgdG8uCisgICAgaW50IG1Db250YWluZXJJZDsKKyAgICAKKyAgICAvLyBUaGUgb3B0aW9uYWwgbmFtZWQgdGFnIGZvciB0aGlzIGZyYWdtZW50IC0tIHVzdWFsbHkgdXNlZCB0byBmaW5kCisgICAgLy8gZnJhZ21lbnRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBsYXlvdXQuCisgICAgU3RyaW5nIG1UYWc7CisgICAgCisgICAgLy8gU2V0IHRvIHRydWUgd2hlbiB0aGUgYXBwIGhhcyByZXF1ZXN0ZWQgdGhhdCB0aGlzIGZyYWdtZW50IGJlIGhpZGRlbgorICAgIC8vIGZyb20gdGhlIHVzZXIuCisgICAgYm9vbGVhbiBtSGlkZGVuOworICAgIAorICAgIC8vIElmIHNldCB0aGlzIGZyYWdtZW50IHdvdWxkIGxpa2UgaXRzIGluc3RhbmNlIHJldGFpbmVkIGFjcm9zcworICAgIC8vIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KKyAgICBib29sZWFuIG1SZXRhaW5JbnN0YW5jZTsKKyAgICAKKyAgICAvLyBJZiBzZXQgdGhpcyBmcmFnbWVudCBpcyBiZWluZyByZXRhaW5lZCBhY3Jvc3MgdGhlIGN1cnJlbnQgY29uZmlnIGNoYW5nZS4KKyAgICBib29sZWFuIG1SZXRhaW5pbmc7CisgICAgCisgICAgLy8gSWYgc2V0IHRoaXMgZnJhZ21lbnQgaGFzIG1lbnUgaXRlbXMgdG8gY29udHJpYnV0ZS4KKyAgICBib29sZWFuIG1IYXNNZW51OworICAgIAorICAgIC8vIFVzZWQgdG8gdmVyaWZ5IHRoYXQgc3ViY2xhc3NlcyBjYWxsIHRocm91Z2ggdG8gc3VwZXIgY2xhc3MuCisgICAgYm9vbGVhbiBtQ2FsbGVkOworICAgIAorICAgIC8vIElmIGFwcCBoYXMgcmVxdWVzdGVkIGEgc3BlY2lmaWMgYW5pbWF0aW9uLCB0aGlzIGlzIHRoZSBvbmUgdG8gdXNlLgorICAgIGludCBtTmV4dEFuaW07CisgICAgCisgICAgLy8gVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhlIGZyYWdtZW50IGFmdGVyIGR5bmFtaWNhbGx5IGFkZGVkIHRvIFVJLgorICAgIFZpZXdHcm91cCBtQ29udGFpbmVyOworICAgIAorICAgIC8vIFRoZSBWaWV3IGdlbmVyYXRlZCBmb3IgdGhpcyBmcmFnbWVudC4KKyAgICBWaWV3IG1WaWV3OworICAgIAorICAgIExvYWRlck1hbmFnZXJJbXBsIG1Mb2FkZXJNYW5hZ2VyOworICAgIGJvb2xlYW4gbVN0YXJ0ZWQ7CisgICAgYm9vbGVhbiBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXI7CisgICAgCisgICAgLyoqCisgICAgICogVGhyb3duIGJ5IHtAbGluayBGcmFnbWVudCNpbnN0YW50aWF0ZShDb250ZXh0LCBTdHJpbmcsIEJ1bmRsZSl9IHdoZW4KKyAgICAgKiB0aGVyZSBpcyBhbiBpbnN0YW50aWF0aW9uIGZhaWx1cmUuCisgICAgICovCisgICAgc3RhdGljIHB1YmxpYyBjbGFzcyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbXNnLCBFeGNlcHRpb24gY2F1c2UpIHsKKyAgICAgICAgICAgIHN1cGVyKG1zZywgY2F1c2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gIDxzdHJvbmc+RXZlcnk8L3N0cm9uZz4gZnJhZ21lbnQgbXVzdCBoYXZlIGFuCisgICAgICogZW1wdHkgY29uc3RydWN0b3IsIHNvIGl0IGNhbiBiZSBpbnN0YW50aWF0ZWQgd2hlbiByZXN0b3JpbmcgaXRzCisgICAgICogYWN0aXZpdHkncyBzdGF0ZS4gIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgc3ViY2xhc3NlcyBkbyBub3QKKyAgICAgKiBoYXZlIG90aGVyIGNvbnN0cnVjdG9ycyB3aXRoIHBhcmFtZXRlcnMsIHNpbmNlIHRoZXNlIGNvbnN0cnVjdG9ycworICAgICAqIHdpbGwgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBmcmFnbWVudCBpcyByZS1pbnN0YW50aWF0ZWQ7IGluc3RlYWQsCisgICAgICogYXJndW1lbnRzIGNhbiBiZSBzdXBwbGllZCBieSB0aGUgY2FsbGVyIHdpdGgge0BsaW5rICNzZXRBcmd1bWVudHN9CisgICAgICogYW5kIGxhdGVyIHJldHJpZXZlZCBieSB0aGUgRnJhZ21lbnQgd2l0aCB7QGxpbmsgI2dldEFyZ3VtZW50c30uCisgICAgICogCisgICAgICogPHA+QXBwbGljYXRpb25zIHNob3VsZCBnZW5lcmFsbHkgbm90IGltcGxlbWVudCBhIGNvbnN0cnVjdG9yLiAgVGhlCisgICAgICogZmlyc3QgcGxhY2UgYXBwbGljYXRpb24gY29kZSBhbiBydW4gd2hlcmUgdGhlIGZyYWdtZW50IGlzIHJlYWR5IHRvCisgICAgICogYmUgdXNlZCBpcyBpbiB7QGxpbmsgI29uQXR0YWNoKEFjdGl2aXR5KX0sIHRoZSBwb2ludCB3aGVyZSB0aGUgZnJhZ21lbnQKKyAgICAgKiBpcyBhY3R1YWxseSBhc3NvY2lhdGVkIHdpdGggaXRzIGFjdGl2aXR5LiAgU29tZSBhcHBsaWNhdGlvbnMgbWF5IGFsc28KKyAgICAgKiB3YW50IHRvIGltcGxlbWVudCB7QGxpbmsgI29uSW5mbGF0ZX0gdG8gcmV0cmlldmUgYXR0cmlidXRlcyBmcm9tIGEKKyAgICAgKiBsYXlvdXQgcmVzb3VyY2UsIHRob3VnaCBzaG91bGQgdGFrZSBjYXJlIGhlcmUgYmVjYXVzZSB0aGlzIGhhcHBlbnMgZm9yCisgICAgICogdGhlIGZyYWdtZW50IGlzIGF0dGFjaGVkIHRvIGl0cyBhY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnQoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI2luc3RhbnRpYXRlKENvbnRleHQsIFN0cmluZywgQnVuZGxlKX0gYnV0IHdpdGggYSBudWxsCisgICAgICogYXJndW1lbnQgQnVuZGxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRnJhZ21lbnQgaW5zdGFudGlhdGUoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgZm5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlKGNvbnRleHQsIGZuYW1lLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSBGcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBjbGFzcyBuYW1lLiAgVGhpcyBpcworICAgICAqIHRoZSBzYW1lIGFzIGNhbGxpbmcgaXRzIGVtcHR5IGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNhbGxpbmcgY29udGV4dCBiZWluZyB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSBmcmFnbWVudC4KKyAgICAgKiBUaGlzIGlzIGN1cnJlbnRseSBqdXN0IHVzZWQgdG8gZ2V0IGl0cyBDbGFzc0xvYWRlci4KKyAgICAgKiBAcGFyYW0gZm5hbWUgVGhlIGNsYXNzIG5hbWUgb2YgdGhlIGZyYWdtZW50IHRvIGluc3RhbnRpYXRlLgorICAgICAqIEBwYXJhbSBhcmdzIEJ1bmRsZSBvZiBhcmd1bWVudHMgdG8gc3VwcGx5IHRvIHRoZSBmcmFnbWVudCwgd2hpY2ggaXQKKyAgICAgKiBjYW4gcmV0cmlldmUgd2l0aCB7QGxpbmsgI2dldEFyZ3VtZW50cygpfS4gIE1heSBiZSBudWxsLgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhIG5ldyBmcmFnbWVudCBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24gSWYgdGhlcmUgaXMgYSBmYWlsdXJlIGluIGluc3RhbnRpYXRpbmcKKyAgICAgKiB0aGUgZ2l2ZW4gZnJhZ21lbnQgY2xhc3MuICBUaGlzIGlzIGEgcnVudGltZSBleGNlcHRpb247IGl0IGlzIG5vdAorICAgICAqIG5vcm1hbGx5IGV4cGVjdGVkIHRvIGhhcHBlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZyYWdtZW50IGluc3RhbnRpYXRlKENvbnRleHQgY29udGV4dCwgU3RyaW5nIGZuYW1lLCBCdW5kbGUgYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBzQ2xhc3NNYXAuZ2V0KGZuYW1lKTsKKyAgICAgICAgICAgIGlmIChjbGF6eiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gQ2xhc3Mgbm90IGZvdW5kIGluIHRoZSBjYWNoZSwgc2VlIGlmIGl0J3MgcmVhbCwgYW5kIHRyeSB0byBhZGQgaXQKKyAgICAgICAgICAgICAgICBjbGF6eiA9IGNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoZm5hbWUpOworICAgICAgICAgICAgICAgIHNDbGFzc01hcC5wdXQoZm5hbWUsIGNsYXp6KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZyYWdtZW50IGYgPSAoRnJhZ21lbnQpY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGlmIChhcmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhcmdzLnNldENsYXNzTG9hZGVyKGYuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgICAgICBmLm1Bcmd1bWVudHMgPSBhcmdzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBmcmFnbWVudCAiICsgZm5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiOiBtYWtlIHN1cmUgY2xhc3MgbmFtZSBleGlzdHMsIGlzIHB1YmxpYywgYW5kIGhhcyBhbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGVtcHR5IGNvbnN0cnVjdG9yIHRoYXQgaXMgcHVibGljIiwgZSk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5JbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgZnJhZ21lbnQgIiArIGZuYW1lCisgICAgICAgICAgICAgICAgICAgICsgIjogbWFrZSBzdXJlIGNsYXNzIG5hbWUgZXhpc3RzLCBpcyBwdWJsaWMsIGFuZCBoYXMgYW4iCisgICAgICAgICAgICAgICAgICAgICsgIiBlbXB0eSBjb25zdHJ1Y3RvciB0aGF0IGlzIHB1YmxpYyIsIGUpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgZnJhZ21lbnQgIiArIGZuYW1lCisgICAgICAgICAgICAgICAgICAgICsgIjogbWFrZSBzdXJlIGNsYXNzIG5hbWUgZXhpc3RzLCBpcyBwdWJsaWMsIGFuZCBoYXMgYW4iCisgICAgICAgICAgICAgICAgICAgICsgIiBlbXB0eSBjb25zdHJ1Y3RvciB0aGF0IGlzIHB1YmxpYyIsIGUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgcmVzdG9yZVZpZXdTdGF0ZSgpIHsKKyAgICAgICAgaWYgKG1TYXZlZFZpZXdTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtVmlldy5yZXN0b3JlSGllcmFyY2h5U3RhdGUobVNhdmVkVmlld1N0YXRlKTsKKyAgICAgICAgICAgIG1TYXZlZFZpZXdTdGF0ZSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRJbmRleChpbnQgaW5kZXgpIHsKKyAgICAgICAgbUluZGV4ID0gaW5kZXg7CisgICAgICAgIG1XaG8gPSAiYW5kcm9pZDpmcmFnbWVudDoiICsgbUluZGV4OworICAgfQorICAgIAorICAgIHZvaWQgY2xlYXJJbmRleCgpIHsKKyAgICAgICAgbUluZGV4ID0gLTE7CisgICAgICAgIG1XaG8gPSBudWxsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzc2VzIGNhbiBub3Qgb3ZlcnJpZGUgZXF1YWxzKCkuCisgICAgICovCisgICAgQE92ZXJyaWRlIGZpbmFsIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1YmNsYXNzZXMgY2FuIG5vdCBvdmVycmlkZSBoYXNoQ29kZSgpLgorICAgICAqLworICAgIEBPdmVycmlkZSBmaW5hbCBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7CisgICAgICAgIHNiLmFwcGVuZCgiRnJhZ21lbnR7Iik7CisgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKSk7CisgICAgICAgIGlmIChtSW5kZXggPj0gMCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIyIpOworICAgICAgICAgICAgc2IuYXBwZW5kKG1JbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1GcmFnbWVudElkICE9IDApIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGlkPTB4Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhtRnJhZ21lbnRJZCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtVGFnICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKG1UYWcpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgnfScpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBpZGVudGlmaWVyIHRoaXMgZnJhZ21lbnQgaXMga25vd24gYnkuICBUaGlzIGlzIGVpdGhlcgorICAgICAqIHRoZSBhbmRyb2lkOmlkIHZhbHVlIHN1cHBsaWVkIGluIGEgbGF5b3V0IG9yIHRoZSBjb250YWluZXIgdmlldyBJRAorICAgICAqIHN1cHBsaWVkIHdoZW4gYWRkaW5nIHRoZSBmcmFnbWVudC4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgaW50IGdldElkKCkgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50SWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgdGFnIG5hbWUgb2YgdGhlIGZyYWdtZW50LCBpZiBzcGVjaWZpZWQuCisgICAgICovCisgICAgZmluYWwgcHVibGljIFN0cmluZyBnZXRUYWcoKSB7CisgICAgICAgIHJldHVybiBtVGFnOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTdXBwbHkgdGhlIGNvbnN0cnVjdGlvbiBhcmd1bWVudHMgZm9yIHRoaXMgZnJhZ21lbnQuICBUaGlzIGNhbiBvbmx5CisgICAgICogYmUgY2FsbGVkIGJlZm9yZSB0aGUgZnJhZ21lbnQgaGFzIGJlZW4gYXR0YWNoZWQgdG8gaXRzIGFjdGl2aXR5OyB0aGF0CisgICAgICogaXMsIHlvdSBzaG91bGQgY2FsbCBpdCBpbW1lZGlhdGVseSBhZnRlciBjb25zdHJ1Y3RpbmcgdGhlIGZyYWdtZW50LiAgVGhlCisgICAgICogYXJndW1lbnRzIHN1cHBsaWVkIGhlcmUgd2lsbCBiZSByZXRhaW5lZCBhY3Jvc3MgZnJhZ21lbnQgZGVzdHJveSBhbmQKKyAgICAgKiBjcmVhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudHMoQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgaWYgKG1JbmRleCA+PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCBhbHJlYWR5IGFjdGl2ZSIpOworICAgICAgICB9CisgICAgICAgIG1Bcmd1bWVudHMgPSBhcmdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXJndW1lbnRzIHN1cHBsaWVkIHdoZW4gdGhlIGZyYWdtZW50IHdhcyBpbnN0YW50aWF0ZWQsCisgICAgICogaWYgYW55LgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBCdW5kbGUgZ2V0QXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gbUFyZ3VtZW50czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcHRpb25hbCB0YXJnZXQgZm9yIHRoaXMgZnJhZ21lbnQuICBUaGlzIG1heSBiZSB1c2VkLCBmb3IgZXhhbXBsZSwKKyAgICAgKiBpZiB0aGlzIGZyYWdtZW50IGlzIGJlaW5nIHN0YXJ0ZWQgYnkgYW5vdGhlciwgYW5kIHdoZW4gZG9uZSB3YW50cyB0bworICAgICAqIGdpdmUgYSByZXN1bHQgYmFjayB0byB0aGUgZmlyc3QuICBUaGUgdGFyZ2V0IHNldCBoZXJlIGlzIHJldGFpbmVkCisgICAgICogYWNyb3NzIGluc3RhbmNlcyB2aWEge0BsaW5rIEZyYWdtZW50TWFuYWdlciNwdXRGcmFnbWVudAorICAgICAqIEZyYWdtZW50TWFuYWdlci5wdXRGcmFnbWVudCgpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoaXMgb25lLgorICAgICAqIEBwYXJhbSByZXF1ZXN0Q29kZSBPcHRpb25hbCByZXF1ZXN0IGNvZGUsIGZvciBjb252ZW5pZW5jZSBpZiB5b3UKKyAgICAgKiBhcmUgZ29pbmcgdG8gY2FsbCBiYWNrIHdpdGgge0BsaW5rICNvbkFjdGl2aXR5UmVzdWx0KGludCwgaW50LCBJbnRlbnQpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXRGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgaW50IHJlcXVlc3RDb2RlKSB7CisgICAgICAgIG1UYXJnZXQgPSBmcmFnbWVudDsKKyAgICAgICAgbVRhcmdldFJlcXVlc3RDb2RlID0gcmVxdWVzdENvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0YXJnZXQgZnJhZ21lbnQgc2V0IGJ5IHtAbGluayAjc2V0VGFyZ2V0RnJhZ21lbnR9LgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBGcmFnbWVudCBnZXRUYXJnZXRGcmFnbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1UYXJnZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0YXJnZXQgcmVxdWVzdCBjb2RlIHNldCBieSB7QGxpbmsgI3NldFRhcmdldEZyYWdtZW50fS4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgaW50IGdldFRhcmdldFJlcXVlc3RDb2RlKCkgeworICAgICAgICByZXR1cm4gbVRhcmdldFJlcXVlc3RDb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQWN0aXZpdHkgdGhpcyBmcmFnbWVudCBpcyBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoLgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBBY3Rpdml0eSBnZXRBY3Rpdml0eSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpdml0eTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBGcmFnbWVudE1hbmFnZXIgZm9yIGludGVyYWN0aW5nIHdpdGggZnJhZ21lbnRzIGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIHRoaXMgZnJhZ21lbnQncyBhY3Rpdml0eS4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgRnJhZ21lbnRNYW5hZ2VyIGdldEZyYWdtZW50TWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpdml0eS5tRnJhZ21lbnRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBjdXJyZW50bHkgYWRkZWQgdG8gaXRzIGFjdGl2aXR5LgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBib29sZWFuIGlzQWRkZWQoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZpdHkgIT0gbnVsbCAmJiBtQWN0aXZpdHkubUZyYWdtZW50cy5tQWRkZWQuY29udGFpbnModGhpcyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBpbiB0aGUgcmVzdW1lZCBzdGF0ZS4gIFRoaXMgaXMgdHJ1ZQorICAgICAqIGZvciB0aGUgZHVyYXRpb24gb2Yge0BsaW5rICNvblJlc3VtZSgpfSBhbmQge0BsaW5rICNvblBhdXNlKCl9IGFzIHdlbGwuCisgICAgICovCisgICAgZmluYWwgcHVibGljIGJvb2xlYW4gaXNSZXN1bWVkKCkgeworICAgICAgICByZXR1cm4gbVJlc3VtZWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBjdXJyZW50bHkgdmlzaWJsZSB0byB0aGUgdXNlci4gIFRoaXMgbWVhbnMKKyAgICAgKiBpdDogKDEpIGhhcyBiZWVuIGFkZGVkLCAoMikgaGFzIGl0cyB2aWV3IGF0dGFjaGVkIHRvIHRoZSB3aW5kb3csIGFuZCAKKyAgICAgKiAoMykgaXMgbm90IGhpZGRlbi4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisgICAgICAgIHJldHVybiBpc0FkZGVkKCkgJiYgIWlzSGlkZGVuKCkgJiYgbVZpZXcgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG1WaWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCAmJiBtVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaGFzIGJlZW4gaGlkZGVuLiAgQnkgZGVmYXVsdCBmcmFnbWVudHMKKyAgICAgKiBhcmUgc2hvd24uICBZb3UgY2FuIGZpbmQgb3V0IGFib3V0IGNoYW5nZXMgdG8gdGhpcyBzdGF0ZSB3aXRoCisgICAgICoge0BsaW5rICNvbkhpZGRlbkNoYW5nZWR9LiAgTm90ZSB0aGF0IHRoZSBoaWRkZW4gc3RhdGUgaXMgb3J0aG9nb25hbAorICAgICAqIHRvIG90aGVyIHN0YXRlcyAtLSB0aGF0IGlzLCB0byBiZSB2aXNpYmxlIHRvIHRoZSB1c2VyLCBhIGZyYWdtZW50CisgICAgICogbXVzdCBiZSBib3RoIHN0YXJ0ZWQgYW5kIG5vdCBoaWRkZW4uCisgICAgICovCisgICAgZmluYWwgcHVibGljIGJvb2xlYW4gaXNIaWRkZW4oKSB7CisgICAgICAgIHJldHVybiBtSGlkZGVuOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgaGlkZGVuIHN0YXRlIChhcyByZXR1cm5lZCBieSB7QGxpbmsgI2lzSGlkZGVuKCl9IG9mCisgICAgICogdGhlIGZyYWdtZW50IGhhcyBjaGFuZ2VkLiAgRnJhZ21lbnRzIHN0YXJ0IG91dCBub3QgaGlkZGVuOyB0aGlzIHdpbGwKKyAgICAgKiBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIGZyYWdtZW50IGNoYW5nZXMgc3RhdGUgZnJvbSB0aGF0LgorICAgICAqIEBwYXJhbSBoaWRkZW4gVHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaXMgbm93IGhpZGRlbiwgZmFsc2UgaWYgaXQgaXMgbm90CisgICAgICogdmlzaWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkhpZGRlbkNoYW5nZWQoYm9vbGVhbiBoaWRkZW4pIHsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29udHJvbCB3aGV0aGVyIGEgZnJhZ21lbnQgaW5zdGFuY2UgaXMgcmV0YWluZWQgYWNyb3NzIEFjdGl2aXR5CisgICAgICogcmUtY3JlYXRpb24gKHN1Y2ggYXMgZnJvbSBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlKS4gIFRoaXMgY2FuIG9ubHkKKyAgICAgKiBiZSB1c2VkIHdpdGggZnJhZ21lbnRzIG5vdCBpbiB0aGUgYmFjayBzdGFjay4gIElmIHNldCwgdGhlIGZyYWdtZW50CisgICAgICogbGlmZWN5Y2xlIHdpbGwgYmUgc2xpZ2h0bHkgZGlmZmVyZW50IHdoZW4gYW4gYWN0aXZpdHkgaXMgcmVjcmVhdGVkOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+IHtAbGluayAjb25EZXN0cm95KCl9IHdpbGwgbm90IGJlIGNhbGxlZCAoYnV0IHtAbGluayAjb25EZXRhY2goKX0gc3RpbGwKKyAgICAgKiB3aWxsIGJlLCBiZWNhdXNlIHRoZSBmcmFnbWVudCBpcyBiZWluZyBkZXRhY2hlZCBmcm9tIGl0cyBjdXJyZW50IGFjdGl2aXR5KS4KKyAgICAgKiA8bGk+IHtAbGluayAjb25DcmVhdGUoQnVuZGxlKX0gd2lsbCBub3QgYmUgY2FsbGVkIHNpbmNlIHRoZSBmcmFnbWVudAorICAgICAqIGlzIG5vdCBiZWluZyByZS1jcmVhdGVkLgorICAgICAqIDxsaT4ge0BsaW5rICNvbkF0dGFjaChBY3Rpdml0eSl9IGFuZCB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSl9IDxiPndpbGw8L2I+CisgICAgICogc3RpbGwgYmUgY2FsbGVkLgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmV0YWluSW5zdGFuY2UoYm9vbGVhbiByZXRhaW4pIHsKKyAgICAgICAgbVJldGFpbkluc3RhbmNlID0gcmV0YWluOworICAgIH0KKyAgICAKKyAgICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBnZXRSZXRhaW5JbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXRhaW5JbnN0YW5jZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVwb3J0IHRoYXQgdGhpcyBmcmFnbWVudCB3b3VsZCBsaWtlIHRvIHBhcnRpY2lwYXRlIGluIHBvcHVsYXRpbmcKKyAgICAgKiB0aGUgb3B0aW9ucyBtZW51IGJ5IHJlY2VpdmluZyBhIGNhbGwgdG8ge0BsaW5rICNvbkNyZWF0ZU9wdGlvbnNNZW51fQorICAgICAqIGFuZCByZWxhdGVkIG1ldGhvZHMuCisgICAgICogCisgICAgICogQHBhcmFtIGhhc01lbnUgSWYgdHJ1ZSwgdGhlIGZyYWdtZW50IGhhcyBtZW51IGl0ZW1zIHRvIGNvbnRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGFzT3B0aW9uc01lbnUoYm9vbGVhbiBoYXNNZW51KSB7CisgICAgICAgIGlmIChtSGFzTWVudSAhPSBoYXNNZW51KSB7CisgICAgICAgICAgICBtSGFzTWVudSA9IGhhc01lbnU7CisgICAgICAgICAgICBpZiAoaXNBZGRlZCgpICYmICFpc0hpZGRlbigpKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5LmludmFsaWRhdGVPcHRpb25zTWVudSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTG9hZGVyTWFuYWdlciBmb3IgdGhpcyBmcmFnbWVudCwgY3JlYXRpbmcgaXQgaWYgbmVlZGVkLgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXJNYW5hZ2VyIGdldExvYWRlck1hbmFnZXIoKSB7CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvYWRlck1hbmFnZXI7CisgICAgICAgIH0KKyAgICAgICAgbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyID0gdHJ1ZTsKKyAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBtQWN0aXZpdHkuZ2V0TG9hZGVyTWFuYWdlcihtSW5kZXgsIG1TdGFydGVkLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1Mb2FkZXJNYW5hZ2VyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsIHtAbGluayBBY3Rpdml0eSNzdGFydEFjdGl2aXR5KEludGVudCl9IG9uIHRoZSBmcmFnbWVudCdzCisgICAgICogY29udGFpbmluZyBBY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgbUFjdGl2aXR5LnN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQodGhpcywgaW50ZW50LCAtMSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGwge0BsaW5rIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoSW50ZW50LCBpbnQpfSBvbiB0aGUgZnJhZ21lbnQncworICAgICAqIGNvbnRhaW5pbmcgQWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQgaW50ZW50LCBpbnQgcmVxdWVzdENvZGUpIHsKKyAgICAgICAgbUFjdGl2aXR5LnN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQodGhpcywgaW50ZW50LCByZXF1ZXN0Q29kZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlY2VpdmUgdGhlIHJlc3VsdCBmcm9tIGEgcHJldmlvdXMgY2FsbCB0bworICAgICAqIHtAbGluayAjc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQsIGludCl9LiAgVGhpcyBmb2xsb3dzIHRoZQorICAgICAqIHJlbGF0ZWQgQWN0aXZpdHkgQVBJIGFzIGRlc2NyaWJlZCB0aGVyZSBpbgorICAgICAqIHtAbGluayBBY3Rpdml0eSNvbkFjdGl2aXR5UmVzdWx0KGludCwgaW50LCBJbnRlbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvZGUgVGhlIGludGVnZXIgcmVxdWVzdCBjb2RlIG9yaWdpbmFsbHkgc3VwcGxpZWQgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eUZvclJlc3VsdCgpLCBhbGxvd2luZyB5b3UgdG8gaWRlbnRpZnkgd2hvIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgcmVzdWx0IGNhbWUgZnJvbS4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q29kZSBUaGUgaW50ZWdlciByZXN1bHQgY29kZSByZXR1cm5lZCBieSB0aGUgY2hpbGQgYWN0aXZpdHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB0aHJvdWdoIGl0cyBzZXRSZXN1bHQoKS4KKyAgICAgKiBAcGFyYW0gZGF0YSBBbiBJbnRlbnQsIHdoaWNoIGNhbiByZXR1cm4gcmVzdWx0IGRhdGEgdG8gdGhlIGNhbGxlcgorICAgICAqICAgICAgICAgICAgICAgKHZhcmlvdXMgZGF0YSBjYW4gYmUgYXR0YWNoZWQgdG8gSW50ZW50ICJleHRyYXMiKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgZnJhZ21lbnQgaXMgYmVpbmcgY3JlYXRlZCBhcyBwYXJ0IG9mIGEgdmlldyBsYXlvdXQKKyAgICAgKiBpbmZsYXRpb24sIHR5cGljYWxseSBmcm9tIHNldHRpbmcgdGhlIGNvbnRlbnQgdmlldyBvZiBhbiBhY3Rpdml0eS4gIFRoaXMKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgZnJhZ21lbnQgaXMgY3JlYXRlZCBmcm9tIGEgPGZyYWdtZW50PgorICAgICAqIHRhZyBpbiBhIGxheW91dCBmaWxlLiAgTm90ZSB0aGlzIGlzIDxlbT5iZWZvcmU8L2VtPiB0aGUgZnJhZ21lbnQncworICAgICAqIHtAbGluayAjb25BdHRhY2goQWN0aXZpdHkpfSBoYXMgYmVlbiBjYWxsZWQ7IGFsbCB5b3Ugc2hvdWxkIGRvIGhlcmUgaXMKKyAgICAgKiBwYXJzZSB0aGUgYXR0cmlidXRlcyBhbmQgc2F2ZSB0aGVtIGF3YXkuICBBIGNvbnZlbmllbnQgdGhpbmcgdG8gZG8gaXMKKyAgICAgKiBzaW1wbHkgY29weSB0aGVtIGludG8gYSBCdW5kbGUgdGhhdCBpcyBnaXZlbiB0byB7QGxpbmsgI3NldEFyZ3VtZW50cyhCdW5kbGUpfS4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGlzIGlzIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBmcmFnbWVudCBpcyBpbmZsYXRlZCwgZXZlbiBpZiBpdCBpcworICAgICAqIGJlaW5nIGluZmxhdGVkIGludG8gYSBuZXcgaW5zdGFuY2Ugd2l0aCBzYXZlZCBzdGF0ZS4gIEJlY2F1c2UgYSBmcmFnbWVudCdzCisgICAgICogYXJndW1lbnRzIGFyZSByZXRhaW5lZCBhY3Jvc3MgaW5zdGFuY2VzLCBpdCBtYXkgbWFrZSBubyBzZW5zZSB0byByZS1wYXJzZQorICAgICAqIHRoZSBhdHRyaWJ1dGVzIGludG8gbmV3IGFyZ3VtZW50cy4gIFlvdSBtYXkgd2FudCB0byBmaXJzdCBjaGVjaworICAgICAqIHtAbGluayAjZ2V0QXJndW1lbnRzKCl9IGFuZCBvbmx5IHBhcnNlIHRoZSBhdHRyaWJ1dGVzIGlmIGl0IHJldHVybnMgbnVsbCwKKyAgICAgKiB0aGUgYXNzdW1wdGlvbiBiZWluZyB0aGF0IGlmIGl0IGlzIG5vbi1udWxsIHRob3NlIGFyZSB0aGUgc2FtZSBhcmd1bWVudHMKKyAgICAgKiBmcm9tIHRoZSBmaXJzdCB0aW1lIHRoZSBmcmFnbWVudCB3YXMgaW5mbGF0ZWQuICAoVGhhdCBzYWlkLCB5b3UgbWF5IHdhbnQKKyAgICAgKiB0byBoYXZlIGxheW91dHMgY2hhbmdlIGZvciBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnMgc3VjaCBhcyBsYW5kc2NhcGUKKyAgICAgKiBhbmQgcG9ydHJhaXQsIHdoaWNoIGNhbiBoYXZlIGRpZmZlcmVudCBhdHRyaWJ1dGVzLiAgSWYgc28sIHlvdSB3aWxsIG5lZWQKKyAgICAgKiB0byByZS1wYXJzZSB0aGUgYXR0cmlidXRlcyBlYWNoIHRpbWUgdGhpcyBpcyBjYWxsZWQgdG8gZ2VuZXJhdGUgbmV3CisgICAgICogYXJndW1lbnRzLik8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGVzIGF0IHRoZSB0YWcgd2hlcmUgdGhlIGZyYWdtZW50IGlzCisgICAgICogYmVpbmcgY3JlYXRlZC4KKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIHRoZSBmcmFnbWVudCBpcyBiZWluZyByZS1jcmVhdGVkIGZyb20KKyAgICAgKiBhIHByZXZpb3VzIHNhdmVkIHN0YXRlLCB0aGlzIGlzIHRoZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkluZmxhdGUoQXR0cmlidXRlU2V0IGF0dHJzLCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhIGZyYWdtZW50IGlzIGZpcnN0IGF0dGFjaGVkIHRvIGl0cyBhY3Rpdml0eS4KKyAgICAgKiB7QGxpbmsgI29uQ3JlYXRlKEJ1bmRsZSl9IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoaXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25BdHRhY2goQWN0aXZpdHkgYWN0aXZpdHkpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgZnJhZ21lbnQgbG9hZHMgYW4gYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBBbmltYXRhYmxlIG9uQ3JlYXRlQW5pbWF0YWJsZShpbnQgdHJhbnNpdCwgYm9vbGVhbiBlbnRlciwgaW50IG5leHRBbmltKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gZG8gaW5pdGlhbCBjcmVhdGlvbiBvZiBhIGZyYWdtZW50LiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIKKyAgICAgKiB7QGxpbmsgI29uQXR0YWNoKEFjdGl2aXR5KX0gYW5kIGJlZm9yZQorICAgICAqIHtAbGluayAjb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyLCBWaWV3R3JvdXAsIEJ1bmRsZSl9LgorICAgICAqIAorICAgICAqIDxwPk5vdGUgdGhhdCB0aGlzIGNhbiBiZSBjYWxsZWQgd2hpbGUgdGhlIGZyYWdtZW50J3MgYWN0aXZpdHkgaXMKKyAgICAgKiBzdGlsbCBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBjcmVhdGVkLiAgQXMgc3VjaCwgeW91IGNhbiBub3QgcmVseQorICAgICAqIG9uIHRoaW5ncyBsaWtlIHRoZSBhY3Rpdml0eSdzIGNvbnRlbnQgdmlldyBoaWVyYXJjaHkgYmVpbmcgaW5pdGlhbGl6ZWQKKyAgICAgKiBhdCB0aGlzIHBvaW50LiAgSWYgeW91IHdhbnQgdG8gZG8gd29yayBvbmNlIHRoZSBhY3Rpdml0eSBpdHNlbGYgaXMKKyAgICAgKiBjcmVhdGVkLCBzZWUge0BsaW5rICNvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIHRoZSBmcmFnbWVudCBpcyBiZWluZyByZS1jcmVhdGVkIGZyb20KKyAgICAgKiBhIHByZXZpb3VzIHNhdmVkIHN0YXRlLCB0aGlzIGlzIHRoZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gaGF2ZSB0aGUgZnJhZ21lbnQgaW5zdGFudGlhdGUgaXRzIHVzZXIgaW50ZXJmYWNlIHZpZXcuCisgICAgICogVGhpcyBpcyBvcHRpb25hbCwgYW5kIG5vbi1ncmFwaGljYWwgZnJhZ21lbnRzIGNhbiByZXR1cm4gbnVsbCAod2hpY2gKKyAgICAgKiBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbikuICBUaGlzIHdpbGwgYmUgY2FsbGVkIGJldHdlZW4KKyAgICAgKiB7QGxpbmsgI29uQ3JlYXRlKEJ1bmRsZSl9IGFuZCB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSl9LgorICAgICAqIAorICAgICAqIDxwPklmIHlvdSByZXR1cm4gYSBWaWV3IGZyb20gaGVyZSwgeW91IHdpbGwgbGF0ZXIgYmUgY2FsbGVkIGluCisgICAgICoge0BsaW5rICNvbkRlc3Ryb3lWaWV3fSB3aGVuIHRoZSB2aWV3IGlzIGJlaW5nIHJlbGVhc2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbmZsYXRlciBUaGUgTGF5b3V0SW5mbGF0ZXIgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5mbGF0ZQorICAgICAqIGFueSB2aWV3cyBpbiB0aGUgZnJhZ21lbnQsCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBJZiBub24tbnVsbCwgdGhpcyBpcyB0aGUgcGFyZW50IHZpZXcgdGhhdCB0aGUgZnJhZ21lbnQncworICAgICAqIFVJIHNob3VsZCBiZSBhdHRhY2hlZCB0by4gIFRoZSBmcmFnbWVudCBzaG91bGQgbm90IGFkZCB0aGUgdmlldyBpdHNlbGYsCisgICAgICogYnV0IHRoaXMgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIExheW91dFBhcmFtcyBvZiB0aGUgdmlldy4KKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIG5vbi1udWxsLCB0aGlzIGZyYWdtZW50IGlzIGJlaW5nIHJlLWNvbnN0cnVjdGVkCisgICAgICogZnJvbSBhIHByZXZpb3VzIHNhdmVkIHN0YXRlIGFzIGdpdmVuIGhlcmUuCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm4gdGhlIFZpZXcgZm9yIHRoZSBmcmFnbWVudCdzIFVJLCBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoKSB7CisgICAgICAgIHJldHVybiBtVmlldzsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIGZyYWdtZW50J3MgYWN0aXZpdHkgaGFzIGJlZW4gY3JlYXRlZCBhbmQgdGhpcworICAgICAqIGZyYWdtZW50J3MgdmlldyBoaWVyYXJjaHkgaW5zdGFudGlhdGVkLiAgSXQgY2FuIGJlIHVzZWQgdG8gZG8gZmluYWwKKyAgICAgKiBpbml0aWFsaXphdGlvbiBvbmNlIHRoZXNlIHBpZWNlcyBhcmUgaW4gcGxhY2UsIHN1Y2ggYXMgcmV0cmlldmluZworICAgICAqIHZpZXdzIG9yIHJlc3RvcmluZyBzdGF0ZS4gIEl0IGlzIGFsc28gdXNlZnVsIGZvciBmcmFnbWVudHMgdGhhdCB1c2UKKyAgICAgKiB7QGxpbmsgI3NldFJldGFpbkluc3RhbmNlKGJvb2xlYW4pfSB0byByZXRhaW4gdGhlaXIgaW5zdGFuY2UsCisgICAgICogYXMgdGhpcyBjYWxsYmFjayB0ZWxscyB0aGUgZnJhZ21lbnQgd2hlbiBpdCBpcyBmdWxseSBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGUgbmV3IGFjdGl2aXR5IGluc3RhbmNlLiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIge0BsaW5rICNvbkNyZWF0ZVZpZXd9CisgICAgICogYW5kIGJlZm9yZSB7QGxpbmsgI29uU3RhcnQoKX0uCisgICAgICogCisgICAgICogQHBhcmFtIHNhdmVkSW5zdGFuY2VTdGF0ZSBJZiB0aGUgZnJhZ21lbnQgaXMgYmVpbmcgcmUtY3JlYXRlZCBmcm9tCisgICAgICogYSBwcmV2aW91cyBzYXZlZCBzdGF0ZSwgdGhpcyBpcyB0aGUgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIEZyYWdtZW50IGlzIHZpc2libGUgdG8gdGhlIHVzZXIuICBUaGlzIGlzIGdlbmVyYWxseQorICAgICAqIHRpZWQgdG8ge0BsaW5rIEFjdGl2aXR5I29uU3RhcnQoKSBBY3Rpdml0eS5vblN0YXJ0fSBvZiB0aGUgY29udGFpbmluZworICAgICAqIEFjdGl2aXR5J3MgbGlmZWN5Y2xlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgICAgIGlmICghbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyKSB7CisgICAgICAgICAgICBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIgPSB0cnVlOworICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBtQWN0aXZpdHkuZ2V0TG9hZGVyTWFuYWdlcihtSW5kZXgsIG1TdGFydGVkLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Mb2FkZXJNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvU3RhcnQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnJhZ21lbnQgaXMgdmlzaWJsZSB0byB0aGUgdXNlciBhbmQgYWN0aXZlbHkgcnVubmluZy4KKyAgICAgKiBUaGlzIGlzIGdlbmVyYWxseQorICAgICAqIHRpZWQgdG8ge0BsaW5rIEFjdGl2aXR5I29uUmVzdW1lKCkgQWN0aXZpdHkub25SZXN1bWV9IG9mIHRoZSBjb250YWluaW5nCisgICAgICogQWN0aXZpdHkncyBsaWZlY3ljbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gYXNrIHRoZSBmcmFnbWVudCB0byBzYXZlIGl0cyBjdXJyZW50IGR5bmFtaWMgc3RhdGUsIHNvIGl0CisgICAgICogY2FuIGxhdGVyIGJlIHJlY29uc3RydWN0ZWQgaW4gYSBuZXcgaW5zdGFuY2Ugb2YgaXRzIHByb2Nlc3MgaXMKKyAgICAgKiByZXN0YXJ0ZWQuICBJZiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZnJhZ21lbnQgbGF0ZXIgbmVlZHMgdG8gYmUKKyAgICAgKiBjcmVhdGVkLCB0aGUgZGF0YSB5b3UgcGxhY2UgaW4gdGhlIEJ1bmRsZSBoZXJlIHdpbGwgYmUgYXZhaWxhYmxlCisgICAgICogaW4gdGhlIEJ1bmRsZSBnaXZlbiB0byB7QGxpbmsgI29uQ3JlYXRlKEJ1bmRsZSl9LAorICAgICAqIHtAbGluayAjb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyLCBWaWV3R3JvdXAsIEJ1bmRsZSl9LCBhbmQKKyAgICAgKiB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSl9LgorICAgICAqCisgICAgICogPHA+VGhpcyBjb3JyZXNwb25kcyB0byB7QGxpbmsgQWN0aXZpdHkjb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUpCisgICAgICogQWN0aXZpdHkub25uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlKX0gYW5kIG1vc3Qgb2YgdGhlIGRpc2N1c3Npb24gdGhlcmUKKyAgICAgKiBhcHBsaWVzIGhlcmUgYXMgd2VsbC4gIE5vdGUgaG93ZXZlcjogPGVtPnRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQKKyAgICAgKiBhdCBhbnkgdGltZSBiZWZvcmUge0BsaW5rICNvbkRlc3Ryb3koKX08L2VtPi4gIFRoZXJlIGFyZSBtYW55IHNpdHVhdGlvbnMKKyAgICAgKiB3aGVyZSBhIGZyYWdtZW50IG1heSBiZSBtb3N0bHkgdG9ybiBkb3duIChzdWNoIGFzIHdoZW4gcGxhY2VkIG9uIHRoZQorICAgICAqIGJhY2sgc3RhY2sgd2l0aCBubyBVSSBzaG93aW5nKSwgYnV0IGl0cyBzdGF0ZSB3aWxsIG5vdCBiZSBzYXZlZCB1bnRpbAorICAgICAqIGl0cyBvd25pbmcgYWN0aXZpdHkgYWN0dWFsbHkgbmVlZHMgdG8gc2F2ZSBpdHMgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0U3RhdGUgQnVuZGxlIGluIHdoaWNoIHRvIHBsYWNlIHlvdXIgc2F2ZWQgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIEZyYWdtZW50IGlzIG5vIGxvbmdlciByZXN1bWVkLiAgVGhpcyBpcyBnZW5lcmFsbHkKKyAgICAgKiB0aWVkIHRvIHtAbGluayBBY3Rpdml0eSNvblBhdXNlKCkgQWN0aXZpdHkub25QYXVzZX0gb2YgdGhlIGNvbnRhaW5pbmcKKyAgICAgKiBBY3Rpdml0eSdzIGxpZmVjeWNsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIEZyYWdtZW50IGlzIG5vIGxvbmdlciBzdGFydGVkLiAgVGhpcyBpcyBnZW5lcmFsbHkKKyAgICAgKiB0aWVkIHRvIHtAbGluayBBY3Rpdml0eSNvblN0b3AoKSBBY3Rpdml0eS5vblN0b3B9IG9mIHRoZSBjb250YWluaW5nCisgICAgICogQWN0aXZpdHkncyBsaWZlY3ljbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TdG9wKCkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgb25Mb3dNZW1vcnkoKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdmlldyBwcmV2aW91c2x5IGNyZWF0ZWQgYnkge0BsaW5rICNvbkNyZWF0ZVZpZXd9IGhhcworICAgICAqIGJlZW4gZGV0YWNoZWQgZnJvbSB0aGUgZnJhZ21lbnQuICBUaGUgbmV4dCB0aW1lIHRoZSBmcmFnbWVudCBuZWVkcworICAgICAqIHRvIGJlIGRpc3BsYXllZCwgYSBuZXcgdmlldyB3aWxsIGJlIGNyZWF0ZWQuICBUaGlzIGlzIGNhbGxlZAorICAgICAqIGFmdGVyIHtAbGluayAjb25TdG9wKCl9IGFuZCBiZWZvcmUge0BsaW5rICNvbkRlc3Ryb3koKX0uICBJdCBpcyBjYWxsZWQKKyAgICAgKiA8ZW0+cmVnYXJkbGVzczwvZW0+IG9mIHdoZXRoZXIge0BsaW5rICNvbkNyZWF0ZVZpZXd9IHJldHVybmVkIGEKKyAgICAgKiBub24tbnVsbCB2aWV3LiAgSW50ZXJuYWxseSBpdCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHZpZXcncyBzdGF0ZSBoYXMKKyAgICAgKiBiZWVuIHNhdmVkIGJ1dCBiZWZvcmUgaXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95VmlldygpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBmcmFnbWVudCBpcyBubyBsb25nZXIgaW4gdXNlLiAgVGhpcyBpcyBjYWxsZWQKKyAgICAgKiBhZnRlciB7QGxpbmsgI29uU3RvcCgpfSBhbmQgYmVmb3JlIHtAbGluayAjb25EZXRhY2goKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgLy9Mb2cudigiZm9vIiwgIm9uRGVzdHJveTogbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyPSIgKyBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIKKyAgICAgICAgLy8gICAgICAgICsgIiBtTG9hZGVyTWFuYWdlcj0iICsgbUxvYWRlck1hbmFnZXIpOworICAgICAgICBpZiAoIW1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcikgeworICAgICAgICAgICAgbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyID0gbUFjdGl2aXR5LmdldExvYWRlck1hbmFnZXIobUluZGV4LCBtU3RhcnRlZCwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9hZGVyTWFuYWdlci5kb0Rlc3Ryb3koKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBmcmFnbWVudCBpcyBubyBsb25nZXIgYXR0YWNoZWQgdG8gaXRzIGFjdGl2aXR5LiAgVGhpcworICAgICAqIGlzIGNhbGxlZCBhZnRlciB7QGxpbmsgI29uRGVzdHJveSgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkRldGFjaCgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mIHRoZSBBY3Rpdml0eSdzIHN0YW5kYXJkIG9wdGlvbnMgbWVudS4gIFlvdQorICAgICAqIHNob3VsZCBwbGFjZSB5b3VyIG1lbnUgaXRlbXMgaW4gdG8gPHZhcj5tZW51PC92YXI+LiAgRm9yIHRoaXMgbWV0aG9kCisgICAgICogdG8gYmUgY2FsbGVkLCB5b3UgbXVzdCBoYXZlIGZpcnN0IGNhbGxlZCB7QGxpbmsgI3NldEhhc09wdGlvbnNNZW51fS4gIFNlZQorICAgICAqIHtAbGluayBBY3Rpdml0eSNvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUpIEFjdGl2aXR5Lm9uQ3JlYXRlT3B0aW9uc01lbnV9CisgICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIG1lbnUgVGhlIG9wdGlvbnMgbWVudSBpbiB3aGljaCB5b3UgcGxhY2UgeW91ciBpdGVtcy4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRIYXNPcHRpb25zTWVudQorICAgICAqIEBzZWUgI29uUHJlcGFyZU9wdGlvbnNNZW51CisgICAgICogQHNlZSAjb25PcHRpb25zSXRlbVNlbGVjdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUsIE1lbnVJbmZsYXRlciBpbmZsYXRlcikgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXBhcmUgdGhlIFNjcmVlbidzIHN0YW5kYXJkIG9wdGlvbnMgbWVudSB0byBiZSBkaXNwbGF5ZWQuICBUaGlzIGlzCisgICAgICogY2FsbGVkIHJpZ2h0IGJlZm9yZSB0aGUgbWVudSBpcyBzaG93biwgZXZlcnkgdGltZSBpdCBpcyBzaG93bi4gIFlvdSBjYW4KKyAgICAgKiB1c2UgdGhpcyBtZXRob2QgdG8gZWZmaWNpZW50bHkgZW5hYmxlL2Rpc2FibGUgaXRlbXMgb3Igb3RoZXJ3aXNlCisgICAgICogZHluYW1pY2FsbHkgbW9kaWZ5IHRoZSBjb250ZW50cy4gIFNlZQorICAgICAqIHtAbGluayBBY3Rpdml0eSNvblByZXBhcmVPcHRpb25zTWVudShNZW51KSBBY3Rpdml0eS5vblByZXBhcmVPcHRpb25zTWVudX0KKyAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVudSBUaGUgb3B0aW9ucyBtZW51IGFzIGxhc3Qgc2hvd24gb3IgZmlyc3QgaW5pdGlhbGl6ZWQgYnkKKyAgICAgKiAgICAgICAgICAgICBvbkNyZWF0ZU9wdGlvbnNNZW51KCkuCisgICAgICogCisgICAgICogQHNlZSAjc2V0SGFzT3B0aW9uc01lbnUKKyAgICAgKiBAc2VlICNvbkNyZWF0ZU9wdGlvbnNNZW51CisgICAgICovCisgICAgcHVibGljIHZvaWQgb25QcmVwYXJlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBob29rIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBpdGVtIGluIHlvdXIgb3B0aW9ucyBtZW51IGlzIHNlbGVjdGVkLgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSByZXR1cm5zIGZhbHNlIHRvIGhhdmUgdGhlIG5vcm1hbAorICAgICAqIHByb2Nlc3NpbmcgaGFwcGVuIChjYWxsaW5nIHRoZSBpdGVtJ3MgUnVubmFibGUgb3Igc2VuZGluZyBhIG1lc3NhZ2UgdG8KKyAgICAgKiBpdHMgSGFuZGxlciBhcyBhcHByb3ByaWF0ZSkuICBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZCBmb3IgYW55IGl0ZW1zCisgICAgICogZm9yIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIGRvIHByb2Nlc3Npbmcgd2l0aG91dCB0aG9zZSBvdGhlcgorICAgICAqIGZhY2lsaXRpZXMuCisgICAgICogCisgICAgICogPHA+RGVyaXZlZCBjbGFzc2VzIHNob3VsZCBjYWxsIHRocm91Z2ggdG8gdGhlIGJhc2UgY2xhc3MgZm9yIGl0IHRvCisgICAgICogcGVyZm9ybSB0aGUgZGVmYXVsdCBtZW51IGhhbmRsaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpdGVtIFRoZSBtZW51IGl0ZW0gdGhhdCB3YXMgc2VsZWN0ZWQuCisgICAgICogCisgICAgICogQHJldHVybiBib29sZWFuIFJldHVybiBmYWxzZSB0byBhbGxvdyBub3JtYWwgbWVudSBwcm9jZXNzaW5nIHRvCisgICAgICogICAgICAgICBwcm9jZWVkLCB0cnVlIHRvIGNvbnN1bWUgaXQgaGVyZS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNvbkNyZWF0ZU9wdGlvbnNNZW51CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25PcHRpb25zSXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaG9vayBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIG9wdGlvbnMgbWVudSBpcyBiZWluZyBjbG9zZWQgKGVpdGhlciBieSB0aGUgdXNlciBjYW5jZWxpbmcKKyAgICAgKiB0aGUgbWVudSB3aXRoIHRoZSBiYWNrL21lbnUgYnV0dG9uLCBvciB3aGVuIGFuIGl0ZW0gaXMgc2VsZWN0ZWQpLgorICAgICAqICAKKyAgICAgKiBAcGFyYW0gbWVudSBUaGUgb3B0aW9ucyBtZW51IGFzIGxhc3Qgc2hvd24gb3IgZmlyc3QgaW5pdGlhbGl6ZWQgYnkKKyAgICAgKiAgICAgICAgICAgICBvbkNyZWF0ZU9wdGlvbnNNZW51KCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25PcHRpb25zTWVudUNsb3NlZChNZW51IG1lbnUpIHsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB7QGNvZGUgdmlld30gaXMgYWJvdXQgdG8gYmUgc2hvd24uCisgICAgICogVW5saWtlIHtAbGluayAjb25DcmVhdGVPcHRpb25zTWVudX0sIHRoaXMgd2lsbCBiZSBjYWxsZWQgZXZlcnkKKyAgICAgKiB0aW1lIHRoZSBjb250ZXh0IG1lbnUgaXMgYWJvdXQgdG8gYmUgc2hvd24gYW5kIHNob3VsZCBiZSBwb3B1bGF0ZWQgZm9yCisgICAgICogdGhlIHZpZXcgKG9yIGl0ZW0gaW5zaWRlIHRoZSB2aWV3IGZvciB7QGxpbmsgQWRhcHRlclZpZXd9IHN1YmNsYXNzZXMsCisgICAgICogdGhpcyBjYW4gYmUgZm91bmQgaW4gdGhlIHtAY29kZSBtZW51SW5mb30pKS4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2Uge0BsaW5rICNvbkNvbnRleHRJdGVtU2VsZWN0ZWQoYW5kcm9pZC52aWV3Lk1lbnVJdGVtKX0gdG8ga25vdyB3aGVuIGFuCisgICAgICogaXRlbSBoYXMgYmVlbiBzZWxlY3RlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyB1cCB0bworICAgICAqIHtAbGluayBBY3Rpdml0eSNvbkNyZWF0ZUNvbnRleHRNZW51IEFjdGl2aXR5Lm9uQ3JlYXRlQ29udGV4dE1lbnV9LCB0aG91Z2gKKyAgICAgKiB5b3UgY2FuIG5vdCBjYWxsIHRoaXMgaW1wbGVtZW50YXRpb24gaWYgeW91IGRvbid0IHdhbnQgdGhhdCBiZWhhdmlvci4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBub3Qgc2FmZSB0byBob2xkIG9udG8gdGhlIGNvbnRleHQgbWVudSBhZnRlciB0aGlzIG1ldGhvZCByZXR1cm5zLgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUsIFZpZXcgdiwgQ29udGV4dE1lbnVJbmZvIG1lbnVJbmZvKSB7CisgICAgICAgIGdldEFjdGl2aXR5KCkub25DcmVhdGVDb250ZXh0TWVudShtZW51LCB2LCBtZW51SW5mbyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgY29udGV4dCBtZW51IHRvIGJlIHNob3duIGZvciB0aGUgZ2l2ZW4gdmlldyAobXVsdGlwbGUgdmlld3MKKyAgICAgKiBjYW4gc2hvdyB0aGUgY29udGV4dCBtZW51KS4gVGhpcyBtZXRob2Qgd2lsbCBzZXQgdGhlCisgICAgICoge0BsaW5rIE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcn0gb24gdGhlIHZpZXcgdG8gdGhpcyBmcmFnbWVudCwgc28KKyAgICAgKiB7QGxpbmsgI29uQ3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUsIFZpZXcsIENvbnRleHRNZW51SW5mbyl9IHdpbGwgYmUKKyAgICAgKiBjYWxsZWQgd2hlbiBpdCBpcyB0aW1lIHRvIHNob3cgdGhlIGNvbnRleHQgbWVudS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICN1bnJlZ2lzdGVyRm9yQ29udGV4dE1lbnUoVmlldykKKyAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0aGF0IHNob3VsZCBzaG93IGEgY29udGV4dCBtZW51LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yQ29udGV4dE1lbnUoVmlldyB2aWV3KSB7CisgICAgICAgIHZpZXcuc2V0T25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyKHRoaXMpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50cyBhIGNvbnRleHQgbWVudSB0byBiZSBzaG93biBmb3IgdGhlIGdpdmVuIHZpZXcuIFRoaXMgbWV0aG9kIHdpbGwKKyAgICAgKiByZW1vdmUgdGhlIHtAbGluayBPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXJ9IG9uIHRoZSB2aWV3LgorICAgICAqIAorICAgICAqIEBzZWUgI3JlZ2lzdGVyRm9yQ29udGV4dE1lbnUoVmlldykKKyAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0aGF0IHNob3VsZCBzdG9wIHNob3dpbmcgYSBjb250ZXh0IG1lbnUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvckNvbnRleHRNZW51KFZpZXcgdmlldykgeworICAgICAgICB2aWV3LnNldE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcihudWxsKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhpcyBob29rIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBpdGVtIGluIGEgY29udGV4dCBtZW51IGlzIHNlbGVjdGVkLiBUaGUKKyAgICAgKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSByZXR1cm5zIGZhbHNlIHRvIGhhdmUgdGhlIG5vcm1hbCBwcm9jZXNzaW5nCisgICAgICogaGFwcGVuIChjYWxsaW5nIHRoZSBpdGVtJ3MgUnVubmFibGUgb3Igc2VuZGluZyBhIG1lc3NhZ2UgdG8gaXRzIEhhbmRsZXIKKyAgICAgKiBhcyBhcHByb3ByaWF0ZSkuIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIGZvciBhbnkgaXRlbXMgZm9yIHdoaWNoIHlvdQorICAgICAqIHdvdWxkIGxpa2UgdG8gZG8gcHJvY2Vzc2luZyB3aXRob3V0IHRob3NlIG90aGVyIGZhY2lsaXRpZXMuCisgICAgICogPHA+CisgICAgICogVXNlIHtAbGluayBNZW51SXRlbSNnZXRNZW51SW5mbygpfSB0byBnZXQgZXh0cmEgaW5mb3JtYXRpb24gc2V0IGJ5IHRoZQorICAgICAqIFZpZXcgdGhhdCBhZGRlZCB0aGlzIG1lbnUgaXRlbS4KKyAgICAgKiA8cD4KKyAgICAgKiBEZXJpdmVkIGNsYXNzZXMgc2hvdWxkIGNhbGwgdGhyb3VnaCB0byB0aGUgYmFzZSBjbGFzcyBmb3IgaXQgdG8gcGVyZm9ybQorICAgICAqIHRoZSBkZWZhdWx0IG1lbnUgaGFuZGxpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIGl0ZW0gVGhlIGNvbnRleHQgbWVudSBpdGVtIHRoYXQgd2FzIHNlbGVjdGVkLgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBSZXR1cm4gZmFsc2UgdG8gYWxsb3cgbm9ybWFsIGNvbnRleHQgbWVudSBwcm9jZXNzaW5nIHRvCisgICAgICogICAgICAgICBwcm9jZWVkLCB0cnVlIHRvIGNvbnN1bWUgaXQgaGVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRleHRJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHZvaWQgcGVyZm9ybVN0b3AoKSB7CisgICAgICAgIG9uU3RvcCgpOworICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoIW1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcikgeworICAgICAgICAgICAgICAgIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlciA9IHRydWU7CisgICAgICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBtQWN0aXZpdHkuZ2V0TG9hZGVyTWFuYWdlcihtSW5kZXgsIG1TdGFydGVkLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtQWN0aXZpdHkgPT0gbnVsbCB8fCAhbUFjdGl2aXR5Lm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvU3RvcCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvUmV0YWluKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NDFmNjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwxMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGU7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uU2VxdWVuY2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIEludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB7QGxpbmsgRnJhZ21lbnR9IG9iamVjdHMgaW5zaWRlIG9mIGFuCisgKiB7QGxpbmsgQWN0aXZpdHl9CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRnJhZ21lbnRNYW5hZ2VyIHsKKyAgICAvKioKKyAgICAgKiBTdGFydCBhIHNlcmllcyBvZiBlZGl0IG9wZXJhdGlvbnMgb24gdGhlIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIEZyYWdtZW50TWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBvcGVuVHJhbnNhY3Rpb24oKTsKKworICAgIC8qKgorICAgICAqIEZpbmRzIGEgZnJhZ21lbnQgdGhhdCB3YXMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gaWQgZWl0aGVyIHdoZW4gaW5mbGF0ZWQKKyAgICAgKiBmcm9tIFhNTCBvciBhcyB0aGUgY29udGFpbmVyIElEIHdoZW4gYWRkZWQgaW4gYSB0cmFuc2FjdGlvbi4gIFRoaXMgZmlyc3QKKyAgICAgKiBzZWFyY2hlcyB0aHJvdWdoIGZyYWdtZW50cyB0aGF0IGFyZSBjdXJyZW50bHkgYWRkZWQgdG8gdGhlIG1hbmFnZXIncworICAgICAqIGFjdGl2aXR5OyBpZiBubyBzdWNoIGZyYWdtZW50IGlzIGZvdW5kLCB0aGVuIGFsbCBmcmFnbWVudHMgY3VycmVudGx5CisgICAgICogb24gdGhlIGJhY2sgc3RhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSUQgYXJlIHNlYXJjaGVkLgorICAgICAqIEByZXR1cm4gVGhlIGZyYWdtZW50IGlmIGZvdW5kIG9yIG51bGwgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeUlkKGludCBpZCk7CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhIGZyYWdtZW50IHRoYXQgd2FzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHRhZyBlaXRoZXIgd2hlbiBpbmZsYXRlZAorICAgICAqIGZyb20gWE1MIG9yIGFzIHN1cHBsaWVkIHdoZW4gYWRkZWQgaW4gYSB0cmFuc2FjdGlvbi4gIFRoaXMgZmlyc3QKKyAgICAgKiBzZWFyY2hlcyB0aHJvdWdoIGZyYWdtZW50cyB0aGF0IGFyZSBjdXJyZW50bHkgYWRkZWQgdG8gdGhlIG1hbmFnZXIncworICAgICAqIGFjdGl2aXR5OyBpZiBubyBzdWNoIGZyYWdtZW50IGlzIGZvdW5kLCB0aGVuIGFsbCBmcmFnbWVudHMgY3VycmVudGx5CisgICAgICogb24gdGhlIGJhY2sgc3RhY2sgYXJlIHNlYXJjaGVkLgorICAgICAqIEByZXR1cm4gVGhlIGZyYWdtZW50IGlmIGZvdW5kIG9yIG51bGwgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcgdGFnKTsKKworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHtAbGluayAjcG9wQmFja1N0YWNrKFN0cmluZywgaW50KX0KKyAgICAgKiBhbmQge0BsaW5rICNwb3BCYWNrU3RhY2soaW50LCBpbnQpfTogSWYgc2V0LCBhbmQgdGhlIG5hbWUgb3IgSUQgb2YKKyAgICAgKiBhIGJhY2sgc3RhY2sgZW50cnkgaGFzIGJlZW4gc3VwcGxpZWQsIHRoZW4gYWxsIG1hdGNoaW5nIGVudHJpZXMgd2lsbAorICAgICAqIGJlIGNvbnN1bWVkIHVudGlsIG9uZSB0aGF0IGRvZXNuJ3QgbWF0Y2ggaXMgZm91bmQgb3IgdGhlIGJvdHRvbSBvZgorICAgICAqIHRoZSBzdGFjayBpcyByZWFjaGVkLiAgT3RoZXJ3aXNlLCBhbGwgZW50cmllcyB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGF0IGVudHJ5CisgICAgICogd2lsbCBiZSByZW1vdmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSA9IDE8PDA7CisKKyAgICAvKioKKyAgICAgKiBQb3AgdGhlIHRvcCBzdGF0ZSBvZmYgdGhlIGJhY2sgc3RhY2suICBSZXR1cm5zIHRydWUgaWYgdGhlcmUgd2FzIG9uZQorICAgICAqIHRvIHBvcCwgZWxzZSBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soKTsKKworICAgIC8qKgorICAgICAqIFBvcCB0aGUgbGFzdCBmcmFnbWVudCB0cmFuc2l0aW9uIGZyb20gdGhlIG1hbmFnZXIncyBmcmFnbWVudAorICAgICAqIGJhY2sgc3RhY2suICBJZiB0aGVyZSBpcyBub3RoaW5nIHRvIHBvcCwgZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIG5hbWUgSWYgbm9uLW51bGwsIHRoaXMgaXMgdGhlIG5hbWUgb2YgYSBwcmV2aW91cyBiYWNrIHN0YXRlCisgICAgICogdG8gbG9vayBmb3I7IGlmIGZvdW5kLCBhbGwgc3RhdGVzIHVwIHRvIHRoYXQgc3RhdGUgd2lsbCBiZSBwb3BwZWQuICBUaGUKKyAgICAgKiB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0gZmxhZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHdoZXRoZXIKKyAgICAgKiB0aGUgbmFtZWQgc3RhdGUgaXRzZWxmIGlzIHBvcHBlZC4gSWYgbnVsbCwgb25seSB0aGUgdG9wIHN0YXRlIGlzIHBvcHBlZC4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgRWl0aGVyIDAgb3Ige0BsaW5rICNQT1BfQkFDS19TVEFDS19JTkNMVVNJVkV9LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHBvcEJhY2tTdGFjayhTdHJpbmcgbmFtZSwgaW50IGZsYWdzKTsKKworICAgIC8qKgorICAgICAqIFBvcCBhbGwgYmFjayBzdGFjayBzdGF0ZXMgdXAgdG8gdGhlIG9uZSB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyLgorICAgICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBzdGF0ZWQgdG8gYmUgcG9wcGVkLiBJZiBubyBpZGVudGlmaWVyIGV4aXN0cywKKyAgICAgKiBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiBUaGUgaWRlbnRpZmllciBpcyB0aGUgbnVtYmVyIHJldHVybmVkIGJ5CisgICAgICoge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb24jY29tbWl0KCkgRnJhZ21lbnRUcmFuc2FjdGlvbi5jb21taXQoKX0uICBUaGUKKyAgICAgKiB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0gZmxhZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHdoZXRoZXIKKyAgICAgKiB0aGUgbmFtZWQgc3RhdGUgaXRzZWxmIGlzIHBvcHBlZC4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgRWl0aGVyIDAgb3Ige0BsaW5rICNQT1BfQkFDS19TVEFDS19JTkNMVVNJVkV9LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHBvcEJhY2tTdGFjayhpbnQgaWQsIGludCBmbGFncyk7CisKKyAgICAvKioKKyAgICAgKiBQdXQgYSByZWZlcmVuY2UgdG8gYSBmcmFnbWVudCBpbiBhIEJ1bmRsZS4gIFRoaXMgQnVuZGxlIGNhbiBiZQorICAgICAqIHBlcnNpc3RlZCBhcyBzYXZlZCBzdGF0ZSwgYW5kIHdoZW4gbGF0ZXIgcmVzdG9yaW5nCisgICAgICoge0BsaW5rICNnZXRGcmFnbWVudChCdW5kbGUsIFN0cmluZyl9IHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50CisgICAgICogaW5zdGFuY2Ugb2YgdGhlIHNhbWUgZnJhZ21lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUgaW4gd2hpY2ggdG8gcHV0IHRoZSBmcmFnbWVudCByZWZlcmVuY2UuCisgICAgICogQHBhcmFtIGtleSBUaGUgbmFtZSBvZiB0aGUgZW50cnkgaW4gdGhlIGJ1bmRsZS4KKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIEZyYWdtZW50IHdob3NlIHJlZmVyZW5jZSBpcyB0byBiZSBzdG9yZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0RnJhZ21lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGtleSwgRnJhZ21lbnQgZnJhZ21lbnQpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgRnJhZ21lbnQgaW5zdGFuY2UgZm9yIGEgcmVmZXJlbmNlIHByZXZpb3VzbHkKKyAgICAgKiBwbGFjZWQgd2l0aCB7QGxpbmsgI3B1dEZyYWdtZW50KEJ1bmRsZSwgU3RyaW5nLCBGcmFnbWVudCl9LgorICAgICAqCisgICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGZyYWdtZW50IHJlZmVyZW5jZS4KKyAgICAgKiBAcGFyYW0ga2V5IFRoZSBuYW1lIG9mIHRoZSBlbnRyeSBpbiB0aGUgYnVuZGxlLgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3VycmVudCBGcmFnbWVudCBpbnN0YW5jZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoZSBnaXZlbiByZWZlcmVuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50IGdldEZyYWdtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBrZXkpOworfQorCitmaW5hbCBjbGFzcyBGcmFnbWVudE1hbmFnZXJTdGF0ZSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIEZyYWdtZW50U3RhdGVbXSBtQWN0aXZlOworICAgIGludFtdIG1BZGRlZDsKKyAgICBCYWNrU3RhY2tTdGF0ZVtdIG1CYWNrU3RhY2s7CisgICAgCisgICAgcHVibGljIEZyYWdtZW50TWFuYWdlclN0YXRlKCkgeworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRNYW5hZ2VyU3RhdGUoUGFyY2VsIGluKSB7CisgICAgICAgIG1BY3RpdmUgPSBpbi5jcmVhdGVUeXBlZEFycmF5KEZyYWdtZW50U3RhdGUuQ1JFQVRPUik7CisgICAgICAgIG1BZGRlZCA9IGluLmNyZWF0ZUludEFycmF5KCk7CisgICAgICAgIG1CYWNrU3RhY2sgPSBpbi5jcmVhdGVUeXBlZEFycmF5KEJhY2tTdGFja1N0YXRlLkNSRUFUT1IpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlVHlwZWRBcnJheShtQWN0aXZlLCBmbGFncyk7CisgICAgICAgIGRlc3Qud3JpdGVJbnRBcnJheShtQWRkZWQpOworICAgICAgICBkZXN0LndyaXRlVHlwZWRBcnJheShtQmFja1N0YWNrLCBmbGFncyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPEZyYWdtZW50TWFuYWdlclN0YXRlPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8RnJhZ21lbnRNYW5hZ2VyU3RhdGU+KCkgeworICAgICAgICBwdWJsaWMgRnJhZ21lbnRNYW5hZ2VyU3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnRNYW5hZ2VyU3RhdGUoaW4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgRnJhZ21lbnRNYW5hZ2VyU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudE1hbmFnZXJTdGF0ZVtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKy8qKgorICogQ29udGFpbmVyIGZvciBmcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGFuIGFjdGl2aXR5LgorICovCitmaW5hbCBjbGFzcyBGcmFnbWVudE1hbmFnZXJJbXBsIGltcGxlbWVudHMgRnJhZ21lbnRNYW5hZ2VyIHsKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRnJhZ21lbnRNYW5hZ2VyIjsKKyAgICAKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9SRVFVRVNUX0NPREVfU1RBVEVfVEFHID0gImFuZHJvaWQ6dGFyZ2V0X3JlcV9zdGF0ZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfU1RBVEVfVEFHID0gImFuZHJvaWQ6dGFyZ2V0X3N0YXRlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfU1RBVEVfVEFHID0gImFuZHJvaWQ6dmlld19zdGF0ZSI7CisKKyAgICBBcnJheUxpc3Q8UnVubmFibGU+IG1QZW5kaW5nQWN0aW9uczsKKyAgICBSdW5uYWJsZVtdIG1UbXBBY3Rpb25zOworICAgIGJvb2xlYW4gbUV4ZWN1dGluZ0FjdGlvbnM7CisgICAgCisgICAgQXJyYXlMaXN0PEZyYWdtZW50PiBtQWN0aXZlOworICAgIEFycmF5TGlzdDxGcmFnbWVudD4gbUFkZGVkOworICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBtQXZhaWxJbmRpY2VzOworICAgIEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4gbUJhY2tTdGFjazsKKyAgICAKKyAgICAvLyBNdXN0IGJlIGFjY2Vzc2VkIHdoaWxlIGxvY2tlZC4KKyAgICBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+IG1CYWNrU3RhY2tJbmRpY2VzOworICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBtQXZhaWxCYWNrU3RhY2tJbmRpY2VzOworCisgICAgaW50IG1DdXJTdGF0ZSA9IEZyYWdtZW50LklOSVRJQUxJWklORzsKKyAgICBBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgCisgICAgYm9vbGVhbiBtTmVlZE1lbnVJbnZhbGlkYXRlOworICAgIAorICAgIC8vIFRlbXBvcmFyeSB2YXJzIGZvciBzdGF0ZSBzYXZlIGFuZCByZXN0b3JlLgorICAgIEJ1bmRsZSBtU3RhdGVCdW5kbGUgPSBudWxsOworICAgIFNwYXJzZUFycmF5PFBhcmNlbGFibGU+IG1TdGF0ZUFycmF5ID0gbnVsbDsKKyAgICAKKyAgICBSdW5uYWJsZSBtRXhlY0NvbW1pdCA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGV4ZWNQZW5kaW5nQWN0aW9ucygpOworICAgICAgICB9CisgICAgfTsKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBvcGVuVHJhbnNhY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgQmFja1N0YWNrRW50cnkodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrKCkgeworICAgICAgICByZXR1cm4gcG9wQmFja1N0YWNrU3RhdGUobUFjdGl2aXR5Lm1IYW5kbGVyLCBudWxsLCAtMSwgMCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrKFN0cmluZyBuYW1lLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIHBvcEJhY2tTdGFja1N0YXRlKG1BY3Rpdml0eS5tSGFuZGxlciwgbmFtZSwgLTEsIGZsYWdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soaW50IGlkLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgaWYgKGlkIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGlkOiAiICsgaWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwb3BCYWNrU3RhY2tTdGF0ZShtQWN0aXZpdHkubUhhbmRsZXIsIG51bGwsIGlkLCBmbGFncyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHV0RnJhZ21lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGtleSwgRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1JbmRleCA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmcmFnbWVudAorICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGN1cnJlbnRseSBpbiB0aGUgRnJhZ21lbnRNYW5hZ2VyIik7CisgICAgICAgIH0KKyAgICAgICAgYnVuZGxlLnB1dEludChrZXksIGZyYWdtZW50Lm1JbmRleCk7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50IGdldEZyYWdtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgaW50IGluZGV4ID0gYnVuZGxlLmdldEludChrZXksIC0xKTsKKyAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5kZXggPj0gbUFjdGl2ZS5zaXplKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdlbWVudCBubyBsb25nZXIgZXhpc3RzIGZvciBrZXkgIgorICAgICAgICAgICAgICAgICAgICArIGtleSArICI6IGluZGV4ICIgKyBpbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGluZGV4KTsKKyAgICAgICAgaWYgKGYgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ2VtZW50IG5vIGxvbmdlciBleGlzdHMgZm9yIGtleSAiCisgICAgICAgICAgICAgICAgICAgICsga2V5ICsgIjogaW5kZXggIiArIGluZGV4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZjsKKyAgICB9CisKKyAgICBBbmltYXRhYmxlIGxvYWRBbmltYXRhYmxlKEZyYWdtZW50IGZyYWdtZW50LCBpbnQgdHJhbnNpdCwgYm9vbGVhbiBlbnRlciwKKyAgICAgICAgICAgIGludCB0cmFuc2l0aW9uU3R5bGUpIHsKKyAgICAgICAgQW5pbWF0YWJsZSBhbmltT2JqID0gZnJhZ21lbnQub25DcmVhdGVBbmltYXRhYmxlKHRyYW5zaXQsIGVudGVyLAorICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1OZXh0QW5pbSk7CisgICAgICAgIGlmIChhbmltT2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBhbmltT2JqOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoZnJhZ21lbnQubU5leHRBbmltICE9IDApIHsKKyAgICAgICAgICAgIEFuaW1hdGFibGUgYW5pbSA9IEFuaW1hdGFibGVJbmZsYXRlci5sb2FkQW5pbWF0YWJsZShtQWN0aXZpdHksIGZyYWdtZW50Lm1OZXh0QW5pbSk7CisgICAgICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFuaW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICh0cmFuc2l0ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbnQgc3R5bGVJbmRleCA9IHRyYW5zaXRUb1N0eWxlSW5kZXgodHJhbnNpdCwgZW50ZXIpOworICAgICAgICBpZiAoc3R5bGVJbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAodHJhbnNpdGlvblN0eWxlID09IDAgJiYgbUFjdGl2aXR5LmdldFdpbmRvdygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyYW5zaXRpb25TdHlsZSA9IG1BY3Rpdml0eS5nZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCkud2luZG93QW5pbWF0aW9uczsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJhbnNpdGlvblN0eWxlID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBUeXBlZEFycmF5IGF0dHJzID0gbUFjdGl2aXR5Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXModHJhbnNpdGlvblN0eWxlLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50QW5pbWF0aW9uKTsKKyAgICAgICAgaW50IGFuaW0gPSBhdHRycy5nZXRSZXNvdXJjZUlkKHN0eWxlSW5kZXgsIDApOworICAgICAgICBhdHRycy5yZWN5Y2xlKCk7CisgICAgICAgIAorICAgICAgICBpZiAoYW5pbSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIEFuaW1hdGFibGVJbmZsYXRlci5sb2FkQW5pbWF0YWJsZShtQWN0aXZpdHksIGFuaW0pOworICAgIH0KKyAgICAKKyAgICB2b2lkIG1vdmVUb1N0YXRlKEZyYWdtZW50IGYsIGludCBuZXdTdGF0ZSwgaW50IHRyYW5zaXQsIGludCB0cmFuc2l0aW9uU3R5bGUpIHsKKyAgICAgICAgLy8gRnJhZ21lbnRzIHRoYXQgYXJlIG5vdCBjdXJyZW50bHkgYWRkZWQgd2lsbCBzaXQgaW4gdGhlIG9uQ3JlYXRlKCkgc3RhdGUuCisgICAgICAgIGlmICghZi5tQWRkZWQgJiYgbmV3U3RhdGUgPiBGcmFnbWVudC5DUkVBVEVEKSB7CisgICAgICAgICAgICBuZXdTdGF0ZSA9IEZyYWdtZW50LkNSRUFURUQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChmLm1TdGF0ZSA8IG5ld1N0YXRlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGYubVN0YXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5JTklUSUFMSVpJTkc6CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZXRvIENSRUFURUQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYubVNhdmVkRnJhZ21lbnRTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1TYXZlZFZpZXdTdGF0ZSA9IGYubVNhdmVkRnJhZ21lbnRTdGF0ZS5nZXRTcGFyc2VQYXJjZWxhYmxlQXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwuVklFV19TVEFURV9UQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tVGFyZ2V0ID0gZ2V0RnJhZ21lbnQoZi5tU2F2ZWRGcmFnbWVudFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXJJbXBsLlRBUkdFVF9TVEFURV9UQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubVRhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tVGFyZ2V0UmVxdWVzdENvZGUgPSBmLm1TYXZlZEZyYWdtZW50U3RhdGUuZ2V0SW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5UQVJHRVRfUkVRVUVTVF9DT0RFX1NUQVRFX1RBRywgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZi5tQWN0aXZpdHkgPSBtQWN0aXZpdHk7CisgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBmLm9uQXR0YWNoKG1BY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vbkF0dGFjaCgpIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Lm9uQXR0YWNoRnJhZ21lbnQoZik7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoIWYubVJldGFpbmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm9uQ3JlYXRlKGYubVNhdmVkRnJhZ21lbnRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vbkNyZWF0ZSgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZi5tUmV0YWluaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChmLm1Gcm9tTGF5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZnJhZ21lbnRzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGNvbnRlbnQgdmlldworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF5b3V0LCB3ZSBuZWVkIHRvIGluc3RhbnRpYXRlIHRoZSB2aWV3IGltbWVkaWF0ZWx5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIGluZmxhdGVyIHdpbGwgdGFrZSBjYXJlIG9mIGFkZGluZyBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVZpZXcgPSBmLm9uQ3JlYXRlVmlldyhtQWN0aXZpdHkuZ2V0TGF5b3V0SW5mbGF0ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1WaWV3LnNldFNhdmVGcm9tUGFyZW50RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5yZXN0b3JlVmlld1N0YXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubUhpZGRlbikgZi5tVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5DUkVBVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPiBGcmFnbWVudC5DUkVBVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmV0byBDT05URU5UOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUZyb21MYXlvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAgY29udGFpbmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tQ29udGFpbmVySWQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSAoVmlld0dyb3VwKW1BY3Rpdml0eS5maW5kVmlld0J5SWQoZi5tQ29udGFpbmVySWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5ldyB2aWV3IGZvdW5kIGZvciBpZCAweCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGYubUNvbnRhaW5lcklkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIGZyYWdtZW50ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1Db250YWluZXIgPSBjb250YWluZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldyA9IGYub25DcmVhdGVWaWV3KG1BY3Rpdml0eS5nZXRMYXlvdXRJbmZsYXRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLCBmLm1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldy5zZXRTYXZlRnJvbVBhcmVudEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuaW1hdGFibGUgYW5pbSA9IGxvYWRBbmltYXRhYmxlKGYsIHRyYW5zaXQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW0gaW5zdGFuY2VvZiBTZXF1ZW5jZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTZXF1ZW5jZXIpYW5pbSkuc2V0VGFyZ2V0KGYubVZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5pbSBpbnN0YW5jZW9mIFByb3BlcnR5QW5pbWF0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eUFuaW1hdG9yKWFuaW0pLnNldFRhcmdldChmLm1WaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmFkZFZpZXcoZi5tVmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnJlc3RvcmVWaWV3U3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tSGlkZGVuKSBmLm1WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25BY3Rpdml0eUNyZWF0ZWQoZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uUmVhZHkoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZi5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuQUNUSVZJVFlfQ1JFQVRFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID4gRnJhZ21lbnQuQUNUSVZJVFlfQ1JFQVRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZldG8gU1RBUlRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm9uU3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uU3RhcnQoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5TVEFSVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPiBGcmFnbWVudC5TVEFSVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmV0byBSRVNVTUVEOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVJlc3VtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5vblJlc3VtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25SZXN1bWUoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZi5tU3RhdGUgPiBuZXdTdGF0ZSkgeworICAgICAgICAgICAgc3dpdGNoIChmLm1TdGF0ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuUkVTVU1FRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlIDwgRnJhZ21lbnQuUkVTVU1FRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZlZnJvbSBSRVNVTUVEOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25QYXVzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25QYXVzZSgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1SZXN1bWVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LlNUQVJURUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA8IEZyYWdtZW50LlNUQVJURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZWZyb20gU1RBUlRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLnBlcmZvcm1TdG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblN0b3AoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPCBGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmVmcm9tIENPTlRFTlQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIHNhdmUgdGhlIGN1cnJlbnQgdmlldyBzdGF0ZSBpZiBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lIGFscmVhZHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtQWN0aXZpdHkuaXNGaW5pc2hpbmcoKSAmJiBmLm1TYXZlZEZyYWdtZW50U3RhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlRnJhZ21lbnRWaWV3U3RhdGUoZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm9uRGVzdHJveVZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uRGVzdHJveWVkVmlldygpIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVmlldyAhPSBudWxsICYmIGYubUNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJTdGF0ZSA+IEZyYWdtZW50LklOSVRJQUxJWklORykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmltYXRhYmxlIGFuaW0gPSBsb2FkQW5pbWF0YWJsZShmLCB0cmFuc2l0LCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmltICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmltIGluc3RhbmNlb2YgU2VxdWVuY2VyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTZXF1ZW5jZXIpYW5pbSkuc2V0VGFyZ2V0KGYubVZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbmltIGluc3RhbmNlb2YgUHJvcGVydHlBbmltYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUHJvcGVydHlBbmltYXRvcilhbmltKS5zZXRUYXJnZXQoZi5tVmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ29udGFpbmVyLnJlbW92ZVZpZXcoZi5tVmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1Db250YWluZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LkNSRUFURUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA8IEZyYWdtZW50LkNSRUFURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZWZyb20gQ1JFQVRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1SZXRhaW5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm9uRGVzdHJveSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25EZXN0cm95KCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5vbkRldGFjaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25EZXRhY2goKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZi5tQWN0aXZpdHkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGYubVN0YXRlID0gbmV3U3RhdGU7CisgICAgfQorICAgIAorICAgIHZvaWQgbW92ZVRvU3RhdGUoaW50IG5ld1N0YXRlLCBib29sZWFuIGFsd2F5cykgeworICAgICAgICBtb3ZlVG9TdGF0ZShuZXdTdGF0ZSwgMCwgMCwgYWx3YXlzKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBtb3ZlVG9TdGF0ZShpbnQgbmV3U3RhdGUsIGludCB0cmFuc2l0LCBpbnQgdHJhbnNpdFN0eWxlLCBib29sZWFuIGFsd2F5cykgeworICAgICAgICBpZiAobUFjdGl2aXR5ID09IG51bGwgJiYgbmV3U3RhdGUgIT0gRnJhZ21lbnQuSU5JVElBTElaSU5HKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBhY3Rpdml0eSIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIWFsd2F5cyAmJiBtQ3VyU3RhdGUgPT0gbmV3U3RhdGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbUN1clN0YXRlID0gbmV3U3RhdGU7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWN0aXZlLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbW92ZVRvU3RhdGUoZiwgbmV3U3RhdGUsIHRyYW5zaXQsIHRyYW5zaXRTdHlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobU5lZWRNZW51SW52YWxpZGF0ZSAmJiBtQWN0aXZpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5pbnZhbGlkYXRlT3B0aW9uc01lbnUoKTsKKyAgICAgICAgICAgICAgICBtTmVlZE1lbnVJbnZhbGlkYXRlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBtYWtlQWN0aXZlKEZyYWdtZW50IGYpIHsKKyAgICAgICAgaWYgKGYubUluZGV4ID49IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1BdmFpbEluZGljZXMgPT0gbnVsbCB8fCBtQXZhaWxJbmRpY2VzLnNpemUoKSA8PSAwKSB7CisgICAgICAgICAgICBpZiAobUFjdGl2ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2ZSA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmLnNldEluZGV4KG1BY3RpdmUuc2l6ZSgpKTsKKyAgICAgICAgICAgIG1BY3RpdmUuYWRkKGYpOworICAgICAgICAgICAgCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmLnNldEluZGV4KG1BdmFpbEluZGljZXMucmVtb3ZlKG1BdmFpbEluZGljZXMuc2l6ZSgpLTEpKTsKKyAgICAgICAgICAgIG1BY3RpdmUuc2V0KGYubUluZGV4LCBmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIG1ha2VJbmFjdGl2ZShGcmFnbWVudCBmKSB7CisgICAgICAgIGlmIChmLm1JbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJGcmVlaW5nIGZyYWdtZW50IGluZGV4ICIgKyBmLm1JbmRleCk7CisgICAgICAgIG1BY3RpdmUuc2V0KGYubUluZGV4LCBudWxsKTsKKyAgICAgICAgaWYgKG1BdmFpbEluZGljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgbUF2YWlsSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgfQorICAgICAgICBtQXZhaWxJbmRpY2VzLmFkZChmLm1JbmRleCk7CisgICAgICAgIG1BY3Rpdml0eS5pbnZhbGlkYXRlRnJhZ21lbnRJbmRleChmLm1JbmRleCk7CisgICAgICAgIGYuY2xlYXJJbmRleCgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhZGRGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgYm9vbGVhbiBtb3ZlVG9TdGF0ZU5vdykgeworICAgICAgICBpZiAobUFkZGVkID09IG51bGwpIHsKKyAgICAgICAgICAgIG1BZGRlZCA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUFkZGVkLmFkZChmcmFnbWVudCk7CisgICAgICAgIG1ha2VBY3RpdmUoZnJhZ21lbnQpOworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgImFkZDogIiArIGZyYWdtZW50KTsKKyAgICAgICAgZnJhZ21lbnQubUFkZGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1IYXNNZW51KSB7CisgICAgICAgICAgICBtTmVlZE1lbnVJbnZhbGlkYXRlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobW92ZVRvU3RhdGVOb3cpIHsKKyAgICAgICAgICAgIG1vdmVUb1N0YXRlKGZyYWdtZW50LCBtQ3VyU3RhdGUsIDAsIDApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50LCBpbnQgdHJhbnNpdGlvbiwgaW50IHRyYW5zaXRpb25TdHlsZSkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInJlbW92ZTogIiArIGZyYWdtZW50ICsgIiBuZXN0aW5nPSIgKyBmcmFnbWVudC5tQmFja1N0YWNrTmVzdGluZyk7CisgICAgICAgIG1BZGRlZC5yZW1vdmUoZnJhZ21lbnQpOworICAgICAgICBmaW5hbCBib29sZWFuIGluYWN0aXZlID0gZnJhZ21lbnQubUJhY2tTdGFja05lc3RpbmcgPD0gMDsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1IYXNNZW51KSB7CisgICAgICAgICAgICBtTmVlZE1lbnVJbnZhbGlkYXRlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBmcmFnbWVudC5tQWRkZWQgPSBmYWxzZTsKKyAgICAgICAgbW92ZVRvU3RhdGUoZnJhZ21lbnQsIGluYWN0aXZlID8gRnJhZ21lbnQuSU5JVElBTElaSU5HIDogRnJhZ21lbnQuQ1JFQVRFRCwKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLCB0cmFuc2l0aW9uU3R5bGUpOworICAgICAgICBpZiAoaW5hY3RpdmUpIHsKKyAgICAgICAgICAgIG1ha2VJbmFjdGl2ZShmcmFnbWVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgaGlkZUZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50LCBpbnQgdHJhbnNpdGlvbiwgaW50IHRyYW5zaXRpb25TdHlsZSkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgImhpZGU6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIGlmICghZnJhZ21lbnQubUhpZGRlbikgeworICAgICAgICAgICAgZnJhZ21lbnQubUhpZGRlbiA9IHRydWU7CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFuaW1hdGFibGUgYW5pbSA9IGxvYWRBbmltYXRhYmxlKGZyYWdtZW50LCB0cmFuc2l0aW9uLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbmltIGluc3RhbmNlb2YgU2VxdWVuY2VyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKFNlcXVlbmNlcilhbmltKS5zZXRUYXJnZXQoZnJhZ21lbnQubVZpZXcpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFuaW0gaW5zdGFuY2VvZiBQcm9wZXJ0eUFuaW1hdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5QW5pbWF0b3IpYW5pbSkuc2V0VGFyZ2V0KGZyYWdtZW50Lm1WaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhbmltLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmcmFnbWVudC5tQWRkZWQgJiYgZnJhZ21lbnQubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICBtTmVlZE1lbnVJbnZhbGlkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYWdtZW50Lm9uSGlkZGVuQ2hhbmdlZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzaG93RnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIGludCB0cmFuc2l0aW9uLCBpbnQgdHJhbnNpdGlvblN0eWxlKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAic2hvdzogIiArIGZyYWdtZW50KTsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1IaWRkZW4pIHsKKyAgICAgICAgICAgIGZyYWdtZW50Lm1IaWRkZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChmcmFnbWVudC5tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQW5pbWF0YWJsZSBhbmltID0gbG9hZEFuaW1hdGFibGUoZnJhZ21lbnQsIHRyYW5zaXRpb24sIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIGlmIChhbmltICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW0gaW5zdGFuY2VvZiBTZXF1ZW5jZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoU2VxdWVuY2VyKWFuaW0pLnNldFRhcmdldChmcmFnbWVudC5tVmlldyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5pbSBpbnN0YW5jZW9mIFByb3BlcnR5QW5pbWF0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoUHJvcGVydHlBbmltYXRvcilhbmltKS5zZXRUYXJnZXQoZnJhZ21lbnQubVZpZXcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFuaW0uc3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnJhZ21lbnQubVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1BZGRlZCAmJiBmcmFnbWVudC5tSGFzTWVudSkgeworICAgICAgICAgICAgICAgIG1OZWVkTWVudUludmFsaWRhdGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhZ21lbnQub25IaWRkZW5DaGFuZ2VkKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnQgZmluZEZyYWdtZW50QnlJZChpbnQgaWQpIHsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gRmlyc3QgbG9vayB0aHJvdWdoIGFkZGVkIGZyYWdtZW50cy4KKyAgICAgICAgICAgIGZvciAoaW50IGk9bUFkZGVkLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIGYubUZyYWdtZW50SWQgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTm93IGZvciBhbnkga25vd24gZnJhZ21lbnQuCisgICAgICAgICAgICBmb3IgKGludCBpPW1BY3RpdmUuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWN0aXZlLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIGYubUZyYWdtZW50SWQgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnQgZmluZEZyYWdtZW50QnlUYWcoU3RyaW5nIHRhZykgeworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsICYmIHRhZyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBGaXJzdCBsb29rIHRocm91Z2ggYWRkZWQgZnJhZ21lbnRzLgorICAgICAgICAgICAgZm9yIChpbnQgaT1tQWRkZWQuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgdGFnLmVxdWFscyhmLm1UYWcpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vdyBmb3IgYW55IGtub3duIGZyYWdtZW50LgorICAgICAgICAgICAgZm9yIChpbnQgaT1tQWN0aXZlLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiB0YWcuZXF1YWxzKGYubVRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnQgZmluZEZyYWdtZW50QnlXaG8oU3RyaW5nIHdobykgeworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsICYmIHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPW1BY3RpdmUuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWN0aXZlLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIHdoby5lcXVhbHMoZi5tV2hvKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGVucXVldWVBY3Rpb24oUnVubmFibGUgYWN0aW9uKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKG1QZW5kaW5nQWN0aW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdBY3Rpb25zID0gbmV3IEFycmF5TGlzdDxSdW5uYWJsZT4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QZW5kaW5nQWN0aW9ucy5hZGQoYWN0aW9uKTsKKyAgICAgICAgICAgIGlmIChtUGVuZGluZ0FjdGlvbnMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBtQWN0aXZpdHkubUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1FeGVjQ29tbWl0KTsKKyAgICAgICAgICAgICAgICBtQWN0aXZpdHkubUhhbmRsZXIucG9zdChtRXhlY0NvbW1pdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBhbGxvY0JhY2tTdGFja0luZGV4KEJhY2tTdGFja0VudHJ5IGJzZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChtQXZhaWxCYWNrU3RhY2tJbmRpY2VzID09IG51bGwgfHwgbUF2YWlsQmFja1N0YWNrSW5kaWNlcy5zaXplKCkgPD0gMCkgeworICAgICAgICAgICAgICAgIGlmIChtQmFja1N0YWNrSW5kaWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbUJhY2tTdGFja0luZGljZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiU2V0dGluZyBiYWNrIHN0YWNrIGluZGV4ICIgKyBpbmRleCArICIgdG8gIiArIGJzZSk7CisgICAgICAgICAgICAgICAgbUJhY2tTdGFja0luZGljZXMuYWRkKGJzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OworCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1BdmFpbEJhY2tTdGFja0luZGljZXMucmVtb3ZlKG1BdmFpbEJhY2tTdGFja0luZGljZXMuc2l6ZSgpLTEpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiQWRkaW5nIGJhY2sgc3RhY2sgaW5kZXggIiArIGluZGV4ICsgIiB3aXRoICIgKyBic2UpOworICAgICAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzLnNldChpbmRleCwgYnNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCYWNrU3RhY2tJbmRleChpbnQgaW5kZXgsIEJhY2tTdGFja0VudHJ5IGJzZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChtQmFja1N0YWNrSW5kaWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUJhY2tTdGFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PEJhY2tTdGFja0VudHJ5PigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IE4gPSBtQmFja1N0YWNrSW5kaWNlcy5zaXplKCk7CisgICAgICAgICAgICBpZiAoaW5kZXggPCBOKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJTZXR0aW5nIGJhY2sgc3RhY2sgaW5kZXggIiArIGluZGV4ICsgIiB0byAiICsgYnNlKTsKKyAgICAgICAgICAgICAgICBtQmFja1N0YWNrSW5kaWNlcy5zZXQoaW5kZXgsIGJzZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdoaWxlIChOIDwgaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgbUJhY2tTdGFja0luZGljZXMuYWRkKG51bGwpOworICAgICAgICAgICAgICAgICAgICBpZiAobUF2YWlsQmFja1N0YWNrSW5kaWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxCYWNrU3RhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiQWRkaW5nIGF2YWlsYWJsZSBiYWNrIHN0YWNrIGluZGV4ICIgKyBOKTsKKyAgICAgICAgICAgICAgICAgICAgbUF2YWlsQmFja1N0YWNrSW5kaWNlcy5hZGQoTik7CisgICAgICAgICAgICAgICAgICAgIE4rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJBZGRpbmcgYmFjayBzdGFjayBpbmRleCAiICsgaW5kZXggKyAiIHdpdGggIiArIGJzZSk7CisgICAgICAgICAgICAgICAgbUJhY2tTdGFja0luZGljZXMuYWRkKGJzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmcmVlQmFja1N0YWNrSW5kZXgoaW50IGluZGV4KSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbUJhY2tTdGFja0luZGljZXMuc2V0KGluZGV4LCBudWxsKTsKKyAgICAgICAgICAgIGlmIChtQXZhaWxCYWNrU3RhY2tJbmRpY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQXZhaWxCYWNrU3RhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJGcmVlaW5nIGJhY2sgc3RhY2sgaW5kZXggIiArIGluZGV4KTsKKyAgICAgICAgICAgIG1BdmFpbEJhY2tTdGFja0luZGljZXMuYWRkKGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE9ubHkgY2FsbCBmcm9tIG1haW4gdGhyZWFkIQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWNQZW5kaW5nQWN0aW9ucygpIHsKKyAgICAgICAgaWYgKG1FeGVjdXRpbmdBY3Rpb25zKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJSZWN1cnNpdmUgZW50cnkgdG8gZXhlY1BlbmRpbmdBY3Rpb25zIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgbnVtQWN0aW9uczsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgaWYgKG1QZW5kaW5nQWN0aW9ucyA9PSBudWxsIHx8IG1QZW5kaW5nQWN0aW9ucy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG51bUFjdGlvbnMgPSBtUGVuZGluZ0FjdGlvbnMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGlmIChtVG1wQWN0aW9ucyA9PSBudWxsIHx8IG1UbXBBY3Rpb25zLmxlbmd0aCA8IG51bUFjdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRtcEFjdGlvbnMgPSBuZXcgUnVubmFibGVbbnVtQWN0aW9uc107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1QZW5kaW5nQWN0aW9ucy50b0FycmF5KG1UbXBBY3Rpb25zKTsKKyAgICAgICAgICAgICAgICBtUGVuZGluZ0FjdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZpdHkubUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1FeGVjQ29tbWl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUV4ZWN1dGluZ0FjdGlvbnMgPSB0cnVlOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG51bUFjdGlvbnM7IGkrKykgeworICAgICAgICAgICAgICAgIG1UbXBBY3Rpb25zW2ldLnJ1bigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUV4ZWN1dGluZ0FjdGlvbnMgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhZGRCYWNrU3RhY2tTdGF0ZShCYWNrU3RhY2tFbnRyeSBzdGF0ZSkgeworICAgICAgICBpZiAobUJhY2tTdGFjayA9PSBudWxsKSB7CisgICAgICAgICAgICBtQmFja1N0YWNrID0gbmV3IEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4oKTsKKyAgICAgICAgfQorICAgICAgICBtQmFja1N0YWNrLmFkZChzdGF0ZSk7CisgICAgfQorICAgIAorICAgIGJvb2xlYW4gcG9wQmFja1N0YWNrU3RhdGUoSGFuZGxlciBoYW5kbGVyLCBTdHJpbmcgbmFtZSwgaW50IGlkLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgaWYgKG1CYWNrU3RhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChuYW1lID09IG51bGwgJiYgaWQgPCAwICYmIChmbGFncyZBY3Rpdml0eS5QT1BfQkFDS19TVEFDS19JTkNMVVNJVkUpID09IDApIHsKKyAgICAgICAgICAgIGludCBsYXN0ID0gbUJhY2tTdGFjay5zaXplKCktMTsKKyAgICAgICAgICAgIGlmIChsYXN0IDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIEJhY2tTdGFja0VudHJ5IGJzcyA9IG1CYWNrU3RhY2sucmVtb3ZlKGxhc3QpOworICAgICAgICAgICAgZW5xdWV1ZUFjdGlvbihuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlBvcHBpbmcgYmFjayBzdGFjayBzdGF0ZTogIiArIGJzcyk7CisgICAgICAgICAgICAgICAgICAgIGJzcy5wb3BGcm9tQmFja1N0YWNrKHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGluZGV4ID0gLTE7CisgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsIHx8IGlkID49IDApIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBhIG5hbWUgb3IgSUQgaXMgc3BlY2lmaWVkLCBsb29rIGZvciB0aGF0IHBsYWNlIGluCisgICAgICAgICAgICAgICAgLy8gdGhlIHN0YWNrLgorICAgICAgICAgICAgICAgIGluZGV4ID0gbUJhY2tTdGFjay5zaXplKCktMTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBCYWNrU3RhY2tFbnRyeSBic3MgPSBtQmFja1N0YWNrLmdldChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5lcXVhbHMoYnNzLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpZCA+PSAwICYmIGlkID09IGJzcy5tSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGluZGV4LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzJkFjdGl2aXR5LlBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpbmRleC0tOworICAgICAgICAgICAgICAgICAgICAvLyBDb25zdW1lIGFsbCBmb2xsb3dpbmcgZW50cmllcyB0aGF0IG1hdGNoLgorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQmFja1N0YWNrRW50cnkgYnNzID0gbUJhY2tTdGFjay5nZXQoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lICE9IG51bGwgJiYgbmFtZS5lcXVhbHMoYnNzLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChpZCA+PSAwICYmIGlkID09IGJzcy5tSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluZGV4ID09IG1CYWNrU3RhY2suc2l6ZSgpLTEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+IHN0YXRlcworICAgICAgICAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+KCk7CisgICAgICAgICAgICBmb3IgKGludCBpPW1CYWNrU3RhY2suc2l6ZSgpLTE7IGk+aW5kZXg7IGktLSkgeworICAgICAgICAgICAgICAgIHN0YXRlcy5hZGQobUJhY2tTdGFjay5yZW1vdmUoaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5xdWV1ZUFjdGlvbihuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgTEFTVCA9IHN0YXRlcy5zaXplKCktMTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPD1MQVNUOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiUG9wcGluZyBiYWNrIHN0YWNrIHN0YXRlOiAiICsgc3RhdGVzLmdldChpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXMuZ2V0KGkpLnBvcEZyb21CYWNrU3RhY2soaSA9PSBMQVNUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBBcnJheUxpc3Q8RnJhZ21lbnQ+IHJldGFpbk5vbkNvbmZpZygpIHsKKyAgICAgICAgQXJyYXlMaXN0PEZyYWdtZW50PiBmcmFnbWVudHMgPSBudWxsOworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFjdGl2ZS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWN0aXZlLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIGYubVJldGFpbkluc3RhbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnRzID0gbmV3IEFycmF5TGlzdDxGcmFnbWVudD4oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmcmFnbWVudHMuYWRkKGYpOworICAgICAgICAgICAgICAgICAgICBmLm1SZXRhaW5pbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZnJhZ21lbnRzOworICAgIH0KKyAgICAKKyAgICB2b2lkIHNhdmVGcmFnbWVudFZpZXdTdGF0ZShGcmFnbWVudCBmKSB7CisgICAgICAgIGlmIChmLm1WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobVN0YXRlQXJyYXkgPT0gbnVsbCkgeworICAgICAgICAgICAgbVN0YXRlQXJyYXkgPSBuZXcgU3BhcnNlQXJyYXk8UGFyY2VsYWJsZT4oKTsKKyAgICAgICAgfQorICAgICAgICBmLm1WaWV3LnNhdmVIaWVyYXJjaHlTdGF0ZShtU3RhdGVBcnJheSk7CisgICAgICAgIGlmIChtU3RhdGVBcnJheS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmLm1TYXZlZFZpZXdTdGF0ZSA9IG1TdGF0ZUFycmF5OworICAgICAgICAgICAgbVN0YXRlQXJyYXkgPSBudWxsOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIFBhcmNlbGFibGUgc2F2ZUFsbFN0YXRlKCkgeworICAgICAgICBpZiAobUFjdGl2ZSA9PSBudWxsIHx8IG1BY3RpdmUuc2l6ZSgpIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGaXJzdCBjb2xsZWN0IGFsbCBhY3RpdmUgZnJhZ21lbnRzLgorICAgICAgICBpbnQgTiA9IG1BY3RpdmUuc2l6ZSgpOworICAgICAgICBGcmFnbWVudFN0YXRlW10gYWN0aXZlID0gbmV3IEZyYWdtZW50U3RhdGVbTl07CisgICAgICAgIGJvb2xlYW4gaGF2ZUZyYWdtZW50cyA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaSk7CisgICAgICAgICAgICBpZiAoZiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGF2ZUZyYWdtZW50cyA9IHRydWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgRnJhZ21lbnRTdGF0ZSBmcyA9IG5ldyBGcmFnbWVudFN0YXRlKGYpOworICAgICAgICAgICAgICAgIGFjdGl2ZVtpXSA9IGZzOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChtU3RhdGVCdW5kbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU3RhdGVCdW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGYub25TYXZlSW5zdGFuY2VTdGF0ZShtU3RhdGVCdW5kbGUpOworICAgICAgICAgICAgICAgIGlmICghbVN0YXRlQnVuZGxlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbVN0YXRlQnVuZGxlOworICAgICAgICAgICAgICAgICAgICBtU3RhdGVCdW5kbGUgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoZi5tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNhdmVGcmFnbWVudFZpZXdTdGF0ZShmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYubVNhdmVkVmlld1N0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZS5wdXRTcGFyc2VQYXJjZWxhYmxlQXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwuVklFV19TVEFURV9UQUcsIGYubVNhdmVkVmlld1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmLm1UYXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1dEZyYWdtZW50KGZzLm1TYXZlZEZyYWdtZW50U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5UQVJHRVRfU1RBVEVfVEFHLCBmLm1UYXJnZXQpOworICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVGFyZ2V0UmVxdWVzdENvZGUgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZS5wdXRJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwuVEFSR0VUX1JFUVVFU1RfQ09ERV9TVEFURV9UQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubVRhcmdldFJlcXVlc3RDb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlNhdmVkIHN0YXRlIG9mICIgKyBmICsgIjogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFoYXZlRnJhZ21lbnRzKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInNhdmVBbGxTdGF0ZTogbm8gZnJhZ21lbnRzISIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGludFtdIGFkZGVkID0gbnVsbDsKKyAgICAgICAgQmFja1N0YWNrU3RhdGVbXSBiYWNrU3RhY2sgPSBudWxsOworICAgICAgICAKKyAgICAgICAgLy8gQnVpbGQgbGlzdCBvZiBjdXJyZW50bHkgYWRkZWQgZnJhZ21lbnRzLgorICAgICAgICBOID0gbUFkZGVkLnNpemUoKTsKKyAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICBhZGRlZCA9IG5ldyBpbnRbTl07CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgYWRkZWRbaV0gPSBtQWRkZWQuZ2V0KGkpLm1JbmRleDsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInNhdmVBbGxTdGF0ZTogYWRkaW5nIGZyYWdtZW50ICMiICsgaQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiAiICsgbUFkZGVkLmdldChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIE5vdyBzYXZlIGJhY2sgc3RhY2suCisgICAgICAgIGlmIChtQmFja1N0YWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIE4gPSBtQmFja1N0YWNrLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChOID4gMCkgeworICAgICAgICAgICAgICAgIGJhY2tTdGFjayA9IG5ldyBCYWNrU3RhY2tTdGF0ZVtOXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJhY2tTdGFja1tpXSA9IG5ldyBCYWNrU3RhY2tTdGF0ZSh0aGlzLCBtQmFja1N0YWNrLmdldChpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAic2F2ZUFsbFN0YXRlOiBhZGRpbmcgYmFjayBzdGFjayAjIiArIGkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6ICIgKyBtQmFja1N0YWNrLmdldChpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBGcmFnbWVudE1hbmFnZXJTdGF0ZSBmbXMgPSBuZXcgRnJhZ21lbnRNYW5hZ2VyU3RhdGUoKTsKKyAgICAgICAgZm1zLm1BY3RpdmUgPSBhY3RpdmU7CisgICAgICAgIGZtcy5tQWRkZWQgPSBhZGRlZDsKKyAgICAgICAgZm1zLm1CYWNrU3RhY2sgPSBiYWNrU3RhY2s7CisgICAgICAgIHJldHVybiBmbXM7CisgICAgfQorICAgIAorICAgIHZvaWQgcmVzdG9yZUFsbFN0YXRlKFBhcmNlbGFibGUgc3RhdGUsIEFycmF5TGlzdDxGcmFnbWVudD4gbm9uQ29uZmlnKSB7CisgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIHNhdmVkIHN0YXRlIGF0IGFsbCwgdGhlbiB0aGVyZSBjYW4gbm90IGJlCisgICAgICAgIC8vIGFueSBub25Db25maWcgZnJhZ21lbnRzIGVpdGhlciwgc28gdGhhdCBpcyB0aGF0LgorICAgICAgICBpZiAoc3RhdGUgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBGcmFnbWVudE1hbmFnZXJTdGF0ZSBmbXMgPSAoRnJhZ21lbnRNYW5hZ2VyU3RhdGUpc3RhdGU7CisgICAgICAgIGlmIChmbXMubUFjdGl2ZSA9PSBudWxsKSByZXR1cm47CisgICAgICAgIAorICAgICAgICAvLyBGaXJzdCByZS1hdHRhY2ggYW55IG5vbi1jb25maWcgaW5zdGFuY2VzIHdlIGFyZSByZXRhaW5pbmcgYmFjaworICAgICAgICAvLyB0byB0aGVpciBzYXZlZCBzdGF0ZSwgc28gd2UgZG9uJ3QgdHJ5IHRvIGluc3RhbnRpYXRlIHRoZW0gYWdhaW4uCisgICAgICAgIGlmIChub25Db25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG5vbkNvbmZpZy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBub25Db25maWcuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAicmVzdG9yZUFsbFN0YXRlOiByZS1hdHRhY2hpbmcgcmV0YWluZWQgIiArIGYpOworICAgICAgICAgICAgICAgIEZyYWdtZW50U3RhdGUgZnMgPSBmbXMubUFjdGl2ZVtmLm1JbmRleF07CisgICAgICAgICAgICAgICAgZnMubUluc3RhbmNlID0gZjsKKyAgICAgICAgICAgICAgICBmLm1TYXZlZFZpZXdTdGF0ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZyA9IDA7CisgICAgICAgICAgICAgICAgZi5tQWRkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGYubVNhdmVkVmlld1N0YXRlID0gZnMubVNhdmVkRnJhZ21lbnRTdGF0ZS5nZXRTcGFyc2VQYXJjZWxhYmxlQXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5WSUVXX1NUQVRFX1RBRyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBCdWlsZCB0aGUgZnVsbCBsaXN0IG9mIGFjdGl2ZSBmcmFnbWVudHMsIGluc3RhbnRpYXRpbmcgdGhlbSBmcm9tCisgICAgICAgIC8vIHRoZWlyIHNhdmVkIHN0YXRlLgorICAgICAgICBtQWN0aXZlID0gbmV3IEFycmF5TGlzdDxGcmFnbWVudD4oZm1zLm1BY3RpdmUubGVuZ3RoKTsKKyAgICAgICAgaWYgKG1BdmFpbEluZGljZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUF2YWlsSW5kaWNlcy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxmbXMubUFjdGl2ZS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRnJhZ21lbnRTdGF0ZSBmcyA9IGZtcy5tQWN0aXZlW2ldOworICAgICAgICAgICAgaWYgKGZzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gZnMuaW5zdGFudGlhdGUobUFjdGl2aXR5KTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInJlc3RvcmVBbGxTdGF0ZTogYWRkaW5nICMiICsgaSArICI6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZlLmFkZChmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJyZXN0b3JlQWxsU3RhdGU6IGFkZGluZyAjIiArIGkgKyAiOiAobnVsbCkiKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZlLmFkZChudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAobUF2YWlsSW5kaWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbEluZGljZXMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAicmVzdG9yZUFsbFN0YXRlOiBhZGRpbmcgYXZhaWwgIyIgKyBpKTsKKyAgICAgICAgICAgICAgICBtQXZhaWxJbmRpY2VzLmFkZChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQnVpbGQgdGhlIGxpc3Qgb2YgY3VycmVudGx5IGFkZGVkIGZyYWdtZW50cy4KKyAgICAgICAgaWYgKGZtcy5tQWRkZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFkZGVkID0gbmV3IEFycmF5TGlzdDxGcmFnbWVudD4oZm1zLm1BZGRlZC5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZtcy5tQWRkZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoZm1zLm1BZGRlZFtpXSk7CisgICAgICAgICAgICAgICAgaWYgKGYgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBpbnN0YW50aWF0ZWQgZnJhZ21lbnQgZm9yIGluZGV4ICMiICsgZm1zLm1BZGRlZFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGYubUFkZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmLm1JbW1lZGlhdGVBY3Rpdml0eSA9IG1BY3Rpdml0eTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInJlc3RvcmVBbGxTdGF0ZTogbWFraW5nIGFkZGVkICMiICsgaSArICI6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICBtQWRkZWQuYWRkKGYpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUFkZGVkID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQnVpbGQgdGhlIGJhY2sgc3RhY2suCisgICAgICAgIGlmIChmbXMubUJhY2tTdGFjayAhPSBudWxsKSB7CisgICAgICAgICAgICBtQmFja1N0YWNrID0gbmV3IEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4oZm1zLm1CYWNrU3RhY2subGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxmbXMubUJhY2tTdGFjay5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEJhY2tTdGFja0VudHJ5IGJzZSA9IGZtcy5tQmFja1N0YWNrW2ldLmluc3RhbnRpYXRlKHRoaXMpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAicmVzdG9yZUFsbFN0YXRlOiBhZGRpbmcgYnNlICMiICsgaQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIChpbmRleCAiICsgYnNlLm1JbmRleCArICIpOiAiICsgYnNlKTsKKyAgICAgICAgICAgICAgICBtQmFja1N0YWNrLmFkZChic2UpOworICAgICAgICAgICAgICAgIGlmIChic2UubUluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0QmFja1N0YWNrSW5kZXgoYnNlLm1JbmRleCwgYnNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQmFja1N0YWNrID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhdHRhY2hBY3Rpdml0eShBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICBpZiAobUFjdGl2aXR5ICE9IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgbUFjdGl2aXR5ID0gYWN0aXZpdHk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQ3JlYXRlKCkgeworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5DUkVBVEVELCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQWN0aXZpdHlDcmVhdGVkKCkgeworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVELCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoU3RhcnQoKSB7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LlNUQVJURUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hSZXN1bWUoKSB7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LlJFU1VNRUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hQYXVzZSgpIHsKKyAgICAgICAgbW92ZVRvU3RhdGUoRnJhZ21lbnQuU1RBUlRFRCwgZmFsc2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFN0b3AoKSB7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LkFDVElWSVRZX0NSRUFURUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hEZXN0cm95KCkgeworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5JTklUSUFMSVpJTkcsIGZhbHNlKTsKKyAgICAgICAgbUFjdGl2aXR5ID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hDcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUsIE1lbnVJbmZsYXRlciBpbmZsYXRlcikgeworICAgICAgICBib29sZWFuIHNob3cgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1BZGRlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgIWYubUhpZGRlbiAmJiBmLm1IYXNNZW51KSB7CisgICAgICAgICAgICAgICAgICAgIHNob3cgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBmLm9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSwgaW5mbGF0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2hvdzsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hQcmVwYXJlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgICAgIGJvb2xlYW4gc2hvdyA9IGZhbHNlOworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFkZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiAhZi5tSGlkZGVuICYmIGYubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hvdyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGYub25QcmVwYXJlT3B0aW9uc01lbnUobWVudSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzaG93OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaE9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFkZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiAhZi5tSGlkZGVuICYmIGYubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYub25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoQ29udGV4dEl0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmICFmLm1IaWRkZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYub25Db250ZXh0SXRlbVNlbGVjdGVkKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoT3B0aW9uc01lbnVDbG9zZWQoTWVudSBtZW51KSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmICFmLm1IaWRkZW4gJiYgZi5tSGFzTWVudSkgeworICAgICAgICAgICAgICAgICAgICBmLm9uT3B0aW9uc01lbnVDbG9zZWQobWVudSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgaW50IHJldmVyc2VUcmFuc2l0KGludCB0cmFuc2l0KSB7CisgICAgICAgIGludCByZXYgPSAwOworICAgICAgICBzd2l0Y2ggKHRyYW5zaXQpIHsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX09QRU46CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX0NMT1NFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfQ0xPU0U6CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX09QRU47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldjsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgaW50IHRyYW5zaXRUb1N0eWxlSW5kZXgoaW50IHRyYW5zaXQsIGJvb2xlYW4gZW50ZXIpIHsKKyAgICAgICAgaW50IGFuaW1BdHRyID0gLTE7CisgICAgICAgIHN3aXRjaCAodHJhbnNpdCkgeworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfT1BFTjoKKyAgICAgICAgICAgICAgICBhbmltQXR0ciA9IGVudGVyCisgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRBbmltYXRpb25fZnJhZ21lbnRPcGVuRW50ZXJBbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudEFuaW1hdGlvbl9mcmFnbWVudE9wZW5FeGl0QW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfQ0xPU0U6CisgICAgICAgICAgICAgICAgYW5pbUF0dHIgPSBlbnRlcgorICAgICAgICAgICAgICAgICAgICA/IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50QW5pbWF0aW9uX2ZyYWdtZW50Q2xvc2VFbnRlckFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50QW5pbWF0aW9uX2ZyYWdtZW50Q2xvc2VFeGl0QW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmltQXR0cjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRUcmFuc2FjdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50VHJhbnNhY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDU5OGEzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50VHJhbnNhY3Rpb24uamF2YQpAQCAtMCwwICsxLDEyNSBAQAorcGFja2FnZSBhbmRyb2lkLmFwcDsKKworLyoqCisgKiBBUEkgZm9yIHBlcmZvcm1pbmcgYSBzZXQgb2YgRnJhZ21lbnQgb3BlcmF0aW9ucy4KKyAqLworcHVibGljIGludGVyZmFjZSBGcmFnbWVudFRyYW5zYWN0aW9uIHsKKyAgICAvKioKKyAgICAgKiBDYWxscyB7QGxpbmsgI2FkZChpbnQsIEZyYWdtZW50LCBTdHJpbmcpfSB3aXRoIGEgMCBjb250YWluZXJWaWV3SWQuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKEZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgdGFnKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxscyB7QGxpbmsgI2FkZChpbnQsIEZyYWdtZW50LCBTdHJpbmcpfSB3aXRoIGEgbnVsbCB0YWcuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGQgYSBmcmFnbWVudCB0byB0aGUgYWN0aXZpdHkgc3RhdGUuICBUaGlzIGZyYWdtZW50IG1heSBvcHRpb25hbGx5CisgICAgICogYWxzbyBoYXZlIGl0cyB2aWV3IChpZiB7QGxpbmsgRnJhZ21lbnQjb25DcmVhdGVWaWV3IEZyYWdtZW50Lm9uQ3JlYXRlVmlld30KKyAgICAgKiByZXR1cm5zIG5vbi1udWxsKSBpbnRvIGEgY29udGFpbmVyIHZpZXcgb2YgdGhlIGFjdGl2aXR5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250YWluZXJWaWV3SWQgT3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgY29udGFpbmVyIHRoaXMgZnJhZ21lbnQgaXMKKyAgICAgKiB0byBiZSBwbGFjZWQgaW4uICBJZiAwLCBpdCB3aWxsIG5vdCBiZSBwbGFjZWQgaW4gYSBjb250YWluZXIuCisgICAgICogQHBhcmFtIGZyYWdtZW50IFRoZSBmcmFnbWVudCB0byBiZSBhZGRlZC4gIFRoaXMgZnJhZ21lbnQgbXVzdCBub3QgYWxyZWFkeQorICAgICAqIGJlIGFkZGVkIHRvIHRoZSBhY3Rpdml0eS4KKyAgICAgKiBAcGFyYW0gdGFnIE9wdGlvbmFsIHRhZyBuYW1lIGZvciB0aGUgZnJhZ21lbnQsIHRvIGxhdGVyIHJldHJpZXZlIHRoZQorICAgICAqIGZyYWdtZW50IHdpdGgge0BsaW5rIEFjdGl2aXR5I2ZpbmRGcmFnbWVudEJ5VGFnKFN0cmluZykKKyAgICAgKiBBY3Rpdml0eS5maW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcpfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpOworICAgIAorICAgIC8qKgorICAgICAqIENhbGxzIHtAbGluayAjcmVwbGFjZShpbnQsIEZyYWdtZW50LCBTdHJpbmcpfSB3aXRoIGEgbnVsbCB0YWcuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVwbGFjZShpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCk7CisgICAgCisgICAgLyoqCisgICAgICogUmVwbGFjZSBhbiBleGlzdGluZyBmcmFnbWVudCB0aGF0IHdhcyBhZGRlZCB0byBhIGNvbnRhaW5lci4gIFRoaXMgaXMKKyAgICAgKiBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyBjYWxsaW5nIHtAbGluayAjcmVtb3ZlKEZyYWdtZW50KX0gZm9yIGFsbAorICAgICAqIGN1cnJlbnRseSBhZGRlZCBmcmFnbWVudHMgdGhhdCB3ZXJlIGFkZGVkIHdpdGggdGhlIHNhbWUgY29udGFpbmVyVmlld0lkCisgICAgICogYW5kIHRoZW4ge0BsaW5rICNhZGQoaW50LCBGcmFnbWVudCwgU3RyaW5nKX0gd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMKKyAgICAgKiBnaXZlbiBoZXJlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250YWluZXJWaWV3SWQgSWRlbnRpZmllciBvZiB0aGUgY29udGFpbmVyIHdob3NlIGZyYWdtZW50KHMpIGFyZQorICAgICAqIHRvIGJlIHJlcGxhY2VkLgorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgbmV3IGZyYWdtZW50IHRvIHBsYWNlIGluIHRoZSBjb250YWluZXIuCisgICAgICogQHBhcmFtIHRhZyBPcHRpb25hbCB0YWcgbmFtZSBmb3IgdGhlIGZyYWdtZW50LCB0byBsYXRlciByZXRyaWV2ZSB0aGUKKyAgICAgKiBmcmFnbWVudCB3aXRoIHtAbGluayBBY3Rpdml0eSNmaW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcpCisgICAgICogQWN0aXZpdHkuZmluZEZyYWdtZW50QnlUYWcoU3RyaW5nKX0uCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1lIEZyYWdtZW50VHJhbnNhY3Rpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVwbGFjZShpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZyk7CisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFuIGV4aXN0aW5nIGZyYWdtZW50LiAgSWYgaXQgd2FzIGFkZGVkIHRvIGEgY29udGFpbmVyLCBpdHMgdmlldworICAgICAqIGlzIGFsc28gcmVtb3ZlZCBmcm9tIHRoYXQgY29udGFpbmVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdG8gYmUgcmVtb3ZlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiByZW1vdmUoRnJhZ21lbnQgZnJhZ21lbnQpOworICAgIAorICAgIC8qKgorICAgICAqIEhpZGVzIGFuIGV4aXN0aW5nIGZyYWdtZW50LiAgVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBmcmFnbWVudHMgd2hvc2UKKyAgICAgKiB2aWV3cyBoYXZlIGJlZW4gYWRkZWQgdG8gYSBjb250YWluZXIsIGFzIHRoaXMgd2lsbCBjYXVzZSB0aGUgdmlldyB0bworICAgICAqIGJlIGhpZGRlbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGZyYWdtZW50IHRvIGJlIGhpZGRlbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBoaWRlKEZyYWdtZW50IGZyYWdtZW50KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBIaWRlcyBhIHByZXZpb3VzbHkgaGlkZGVuIGZyYWdtZW50LiAgVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBmcmFnbWVudHMgd2hvc2UKKyAgICAgKiB2aWV3cyBoYXZlIGJlZW4gYWRkZWQgdG8gYSBjb250YWluZXIsIGFzIHRoaXMgd2lsbCBjYXVzZSB0aGUgdmlldyB0bworICAgICAqIGJlIHNob3duLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdG8gYmUgc2hvd24uCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1lIEZyYWdtZW50VHJhbnNhY3Rpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2hvdyhGcmFnbWVudCBmcmFnbWVudCk7CisgICAgCisgICAgLyoqCisgICAgICogQml0IG1hc2sgdGhhdCBpcyBzZXQgZm9yIGFsbCBlbnRlciB0cmFuc2l0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfRU5URVJfTUFTSyA9IDB4MTAwMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayB0aGF0IGlzIHNldCBmb3IgYWxsIGV4aXQgdHJhbnNpdGlvbnMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX0VYSVRfTUFTSyA9IDB4MjAwMDsKKyAgICAKKyAgICAvKiogTm90IHNldCB1cCBmb3IgYSB0cmFuc2l0aW9uLiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9VTlNFVCA9IC0xOworICAgIC8qKiBObyBhbmltYXRpb24gZm9yIHRyYW5zaXRpb24uICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX05PTkUgPSAwOworICAgIC8qKiBGcmFnbWVudCBpcyBiZWluZyBhZGRlZCAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9GUkFHTUVOVF9PUEVOID0gMSB8IFRSQU5TSVRfRU5URVJfTUFTSzsKKyAgICAvKiogRnJhZ21lbnQgaXMgYmVpbmcgcmVtb3ZlZCAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9GUkFHTUVOVF9DTE9TRSA9IDIgfCBUUkFOU0lUX0VYSVRfTUFTSzsKKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldEN1c3RvbUFuaW1hdGlvbnMoaW50IGVudGVyLCBpbnQgZXhpdCk7CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0VHJhbnNpdGlvbihpbnQgdHJhbnNpdCk7CisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0VHJhbnNpdGlvblN0eWxlKGludCBzdHlsZVJlcyk7CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkVG9CYWNrU3RhY2soU3RyaW5nIG5hbWUpOworCisgICAgLyoqCisgICAgICogU2NoZWR1bGVzIGEgY29tbWl0IG9mIHRoaXMgdHJhbnNhY3Rpb24uICBOb3RlIHRoYXQgdGhlIGNvbW1pdCBkb2VzCisgICAgICogbm90IGhhcHBlbiBpbW1lZGlhdGVseTsgaXQgd2lsbCBiZSBzY2hlZHVsZWQgYXMgd29yayBvbiB0aGUgbWFpbiB0aHJlYWQKKyAgICAgKiB0byBiZSBkb25lIHRoZSBuZXh0IHRpbWUgdGhhdCB0aHJlYWQgaXMgcmVhZHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhpcyB0cmFuc2FjdGlvbidzIGJhY2sgc3RhY2sgZW50cnksCisgICAgICogaWYge0BsaW5rICNhZGRUb0JhY2tTdGFjayhTdHJpbmcpfSBoYWQgYmVlbiBjYWxsZWQuICBPdGhlcndpc2UsIHJldHVybnMKKyAgICAgKiBhIG5lZ2F0aXZlIG51bWJlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvbW1pdCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBY3Rpdml0eU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyLmphdmEKaW5kZXggZjliZDQ2MS4uOTAxZjExNyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBY3Rpdml0eU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFjdGl2aXR5TWFuYWdlci5qYXZhCkBAIC0zMTEsNiArMzExLDEwIEBACiAgICAgCiAgICAgcHVibGljIHZvaWQgZmluaXNoSGVhdnlXZWlnaHRBcHAoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogCisgICAgcHVibGljIHZvaWQgc2V0SW1tZXJzaXZlKElCaW5kZXIgdG9rZW4sIGJvb2xlYW4gaW1tZXJzaXZlKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworICAgIHB1YmxpYyBib29sZWFuIGlzSW1tZXJzaXZlKElCaW5kZXIgdG9rZW4pIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisgICAgcHVibGljIGJvb2xlYW4gaXNUb3BBY3Rpdml0eUltbWVyc2l2ZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisgICAgCiAgICAgcHVibGljIHZvaWQgY3Jhc2hBcHBsaWNhdGlvbihpbnQgdWlkLCBpbnQgaW5pdGlhbFBpZCwgU3RyaW5nIHBhY2thZ2VOYW1lLAogICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgCkBAIC0zMjAsNiArMzI0LDEwIEBACiAgICAgcHVibGljIHZvaWQgcmV2b2tlVXJpUGVybWlzc2lvbkZyb21Pd25lcihJQmluZGVyIG93bmVyLCBVcmkgdXJpLAogICAgICAgICAgICAgaW50IG1vZGUpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAKKyAgICAvLyBDYXVzZSB0aGUgc3BlY2lmaWVkIHByb2Nlc3MgdG8gZHVtcCB0aGUgc3BlY2lmaWVkIGhlYXAuCisgICAgcHVibGljIGJvb2xlYW4gZHVtcEhlYXAoU3RyaW5nIHByb2Nlc3MsIGJvb2xlYW4gbWFuYWdlZCwgU3RyaW5nIHBhdGgsCisgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCiAgICAgLyoKICAgICAgKiBQcml2YXRlIG5vbi1CaW5kZXIgaW50ZXJmYWNlcwogICAgICAqLwpAQCAtNTI5LDQgKzUzNyw1IEBACiAgICAgaW50IE5FV19VUklfUEVSTUlTU0lPTl9PV05FUl9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTisxMTQ7CiAgICAgaW50IEdSQU5UX1VSSV9QRVJNSVNTSU9OX0ZST01fT1dORVJfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTE1OwogICAgIGludCBSRVZPS0VfVVJJX1BFUk1JU1NJT05fRlJPTV9PV05FUl9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTisxMTY7CisgICAgaW50IERVTVBfSEVBUF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTisxMTc7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFwcGxpY2F0aW9uVGhyZWFkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFwcGxpY2F0aW9uVGhyZWFkLmphdmEKaW5kZXggYzhlZjE3Zi4uMDM5YmNiOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBcHBsaWNhdGlvblRocmVhZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQXBwbGljYXRpb25UaHJlYWQuamF2YQpAQCAtOTcsNiArOTcsOCBAQAogICAgIHZvaWQgc2NoZWR1bGVBY3Rpdml0eUNvbmZpZ3VyYXRpb25DaGFuZ2VkKElCaW5kZXIgdG9rZW4pIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgdm9pZCBwcm9maWxlckNvbnRyb2woYm9vbGVhbiBzdGFydCwgU3RyaW5nIHBhdGgsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKyAgICB2b2lkIGR1bXBIZWFwKGJvb2xlYW4gbWFuYWdlZCwgU3RyaW5nIHBhdGgsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKICAgICB2b2lkIHNldFNjaGVkdWxpbmdHcm91cChpbnQgZ3JvdXApIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgdm9pZCBnZXRNZW1vcnlJbmZvKERlYnVnLk1lbW9yeUluZm8gb3V0SW5mbykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKICAgICBzdGF0aWMgZmluYWwgaW50IFBBQ0tBR0VfUkVNT1ZFRCA9IDA7CkBAIC0xNDAsNCArMTQyLDUgQEAKICAgICBpbnQgU0NIRURVTEVfU1VJQ0lERV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiszMjsKICAgICBpbnQgRElTUEFUQ0hfUEFDS0FHRV9CUk9BRENBU1RfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMzM7CiAgICAgaW50IFNDSEVEVUxFX0NSQVNIX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzM0OworICAgIGludCBEVU1QX0hFQVBfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMzU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSW5zdHJ1bWVudGF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSW5zdHJ1bWVudGF0aW9uLmphdmEKaW5kZXggYjhjM2FhMy4uNGQ1ZjM2YSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24uamF2YQpAQCAtOTk3LDggKzk5NywxMCBAQAogICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CiAgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KWNsYXp6Lm5ld0luc3RhbmNlKCk7CiAgICAgICAgIEFjdGl2aXR5VGhyZWFkIGFUaHJlYWQgPSBudWxsOwotICAgICAgICBhY3Rpdml0eS5hdHRhY2goY29udGV4dCwgYVRocmVhZCwgdGhpcywgdG9rZW4sIGFwcGxpY2F0aW9uLCBpbnRlbnQsIGluZm8sIHRpdGxlLAotICAgICAgICAgICAgICAgIHBhcmVudCwgaWQsIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UsIG5ldyBDb25maWd1cmF0aW9uKCkpOworICAgICAgICBhY3Rpdml0eS5hdHRhY2goY29udGV4dCwgYVRocmVhZCwgdGhpcywgdG9rZW4sIGFwcGxpY2F0aW9uLCBpbnRlbnQsCisgICAgICAgICAgICAgICAgaW5mbywgdGl0bGUsIHBhcmVudCwgaWQsCisgICAgICAgICAgICAgICAgKEFjdGl2aXR5Lk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMpbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwKKyAgICAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpKTsKICAgICAgICAgcmV0dXJuIGFjdGl2aXR5OwogICAgIH0KIApAQCAtMTA1OCwyMSArMTA2MCwyMyBAQAogICAgIH0KICAgICAKICAgICBwdWJsaWMgdm9pZCBjYWxsQWN0aXZpdHlPbkRlc3Ryb3koQWN0aXZpdHkgYWN0aXZpdHkpIHsKLSAgICAgIGlmIChtV2FpdGluZ0FjdGl2aXRpZXMgIT0gbnVsbCkgewotICAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKLSAgICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtV2FpdGluZ0FjdGl2aXRpZXMuc2l6ZSgpOwotICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eVdhaXRlciBhdyA9IG1XYWl0aW5nQWN0aXZpdGllcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gYXcuaW50ZW50OwotICAgICAgICAgICAgICAgICAgaWYgKGludGVudC5maWx0ZXJFcXVhbHMoYWN0aXZpdHkuZ2V0SW50ZW50KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgYXcuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLSAgICAgICAgICAgICAgICAgICAgICBtTWVzc2FnZVF1ZXVlLmFkZElkbGVIYW5kbGVyKG5ldyBBY3Rpdml0eUdvaW5nKGF3KSk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICB9CisgICAgICAvLyBUT0RPOiB0aGUgZm9sbG93aW5nIGJsb2NrIGNhdXNlcyBpbnRlcm1pdHRlbnQgaGFuZ3Mgd2hlbiB1c2luZyBzdGFydEFjdGl2aXR5CisgICAgICAvLyB0ZW1wb3JhcmlseSBjb21tZW50IG91dCB1bnRpbCByb290IGNhdXNlIGlzIGZpeGVkIChidWcgMjYzMDY4MykKKy8vICAgICAgaWYgKG1XYWl0aW5nQWN0aXZpdGllcyAhPSBudWxsKSB7CisvLyAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CisvLyAgICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtV2FpdGluZ0FjdGl2aXRpZXMuc2l6ZSgpOworLy8gICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKy8vICAgICAgICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlXYWl0ZXIgYXcgPSBtV2FpdGluZ0FjdGl2aXRpZXMuZ2V0KGkpOworLy8gICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gYXcuaW50ZW50OworLy8gICAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmZpbHRlckVxdWFscyhhY3Rpdml0eS5nZXRJbnRlbnQoKSkpIHsKKy8vICAgICAgICAgICAgICAgICAgICAgIGF3LmFjdGl2aXR5ID0gYWN0aXZpdHk7CisvLyAgICAgICAgICAgICAgICAgICAgICBtTWVzc2FnZVF1ZXVlLmFkZElkbGVIYW5kbGVyKG5ldyBBY3Rpdml0eUdvaW5nKGF3KSk7CisvLyAgICAgICAgICAgICAgICAgIH0KKy8vICAgICAgICAgICAgICB9CisvLyAgICAgICAgICB9CisvLyAgICAgIH0KICAgICAgIAotICAgICAgYWN0aXZpdHkub25EZXN0cm95KCk7CisgICAgICBhY3Rpdml0eS5wZXJmb3JtRGVzdHJveSgpOwogICAgICAgCiAgICAgICBpZiAobUFjdGl2aXR5TW9uaXRvcnMgIT0gbnVsbCkgewogICAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKQEAgLTEzMzEsNyArMTMzNSw3IEBACiAgICAgICogICAgICAgICAgICAgICAgICAgICAgaXMgYmVpbmcgc3RhcnRlZC4KICAgICAgKiBAcGFyYW0gdG9rZW4gSW50ZXJuYWwgdG9rZW4gaWRlbnRpZnlpbmcgdG8gdGhlIHN5c3RlbSB3aG8gaXMgc3RhcnRpbmcgCiAgICAgICogICAgICAgICAgICAgIHRoZSBhY3Rpdml0eTsgbWF5IGJlIG51bGwuCi0gICAgICogQHBhcmFtIHRhcmdldCBXaGljaCBhY3Rpdml0eSBpcyBwZXJmb3JtIHRoZSBzdGFydCAoYW5kIHRodXMgcmVjZWl2aW5nIAorICAgICAqIEBwYXJhbSB0YXJnZXQgV2hpY2ggYWN0aXZpdHkgaXMgcGVyZm9ybWluZyB0aGUgc3RhcnQgKGFuZCB0aHVzIHJlY2VpdmluZyAKICAgICAgKiAgICAgICAgICAgICAgIGFueSByZXN1bHQpOyBtYXkgYmUgbnVsbCBpZiB0aGlzIGNhbGwgaXMgbm90IGJlaW5nIG1hZGUKICAgICAgKiAgICAgICAgICAgICAgIGZyb20gYW4gYWN0aXZpdHkuCiAgICAgICogQHBhcmFtIGludGVudCBUaGUgYWN0dWFsIEludGVudCB0byBzdGFydC4KQEAgLTEzODEsNiArMTM4NSw2NCBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBMaWtlIHtAbGluayAjZXhlY1N0YXJ0QWN0aXZpdHkoQ29udGV4dCwgSUJpbmRlciwgSUJpbmRlciwgQWN0aXZpdHksIEludGVudCwgaW50KX0sCisgICAgICogYnV0IGZvciBjYWxscyBmcm9tIGEgeyNsaW5rIEZyYWdtZW50fS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2hvIFRoZSBDb250ZXh0IGZyb20gd2hpY2ggdGhlIGFjdGl2aXR5IGlzIGJlaW5nIHN0YXJ0ZWQuCisgICAgICogQHBhcmFtIGNvbnRleHRUaHJlYWQgVGhlIG1haW4gdGhyZWFkIG9mIHRoZSBDb250ZXh0IGZyb20gd2hpY2ggdGhlIGFjdGl2aXR5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgaXMgYmVpbmcgc3RhcnRlZC4KKyAgICAgKiBAcGFyYW0gdG9rZW4gSW50ZXJuYWwgdG9rZW4gaWRlbnRpZnlpbmcgdG8gdGhlIHN5c3RlbSB3aG8gaXMgc3RhcnRpbmcgCisgICAgICogICAgICAgICAgICAgIHRoZSBhY3Rpdml0eTsgbWF5IGJlIG51bGwuCisgICAgICogQHBhcmFtIHRhcmdldCBXaGljaCBmcmFnbWVudCBpcyBwZXJmb3JtaW5nIHRoZSBzdGFydCAoYW5kIHRodXMgcmVjZWl2aW5nIAorICAgICAqICAgICAgICAgICAgICAgYW55IHJlc3VsdCkuCisgICAgICogQHBhcmFtIGludGVudCBUaGUgYWN0dWFsIEludGVudCB0byBzdGFydC4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvZGUgSWRlbnRpZmllciBmb3IgdGhpcyByZXF1ZXN0J3MgcmVzdWx0OyBsZXNzIHRoYW4gemVybyAKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGNhbGxlciBpcyBub3QgZXhwZWN0aW5nIGEgcmVzdWx0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gVG8gZm9yY2UgdGhlIHJldHVybiBvZiBhIHBhcnRpY3VsYXIgcmVzdWx0LCByZXR1cm4gYW4gCisgICAgICogICAgICAgICBBY3Rpdml0eVJlc3VsdCBvYmplY3QgY29udGFpbmluZyB0aGUgZGVzaXJlZCBkYXRhOyBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgIHJldHVybiBudWxsLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgbnVsbC4KKyAgICAgKiAgCisgICAgICogQHRocm93cyBhbmRyb2lkLmNvbnRlbnQuQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqIAorICAgICAqIEBzZWUgQWN0aXZpdHkjc3RhcnRBY3Rpdml0eShJbnRlbnQpCisgICAgICogQHNlZSBBY3Rpdml0eSNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0KEludGVudCwgaW50KQorICAgICAqIEBzZWUgQWN0aXZpdHkjc3RhcnRBY3Rpdml0eUZyb21DaGlsZAorICAgICAqIAorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aXZpdHlSZXN1bHQgZXhlY1N0YXJ0QWN0aXZpdHkoCisgICAgICAgIENvbnRleHQgd2hvLCBJQmluZGVyIGNvbnRleHRUaHJlYWQsIElCaW5kZXIgdG9rZW4sIEZyYWdtZW50IHRhcmdldCwKKyAgICAgICAgSW50ZW50IGludGVudCwgaW50IHJlcXVlc3RDb2RlKSB7CisgICAgICAgIElBcHBsaWNhdGlvblRocmVhZCB3aG9UaHJlYWQgPSAoSUFwcGxpY2F0aW9uVGhyZWFkKSBjb250ZXh0VGhyZWFkOworICAgICAgICBpZiAobUFjdGl2aXR5TW9uaXRvcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFjdGl2aXR5TW9uaXRvcnMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlNb25pdG9yIGFtID0gbUFjdGl2aXR5TW9uaXRvcnMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYW0ubWF0Y2god2hvLCBudWxsLCBpbnRlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbS5tSGl0cysrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFtLmlzQmxvY2tpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0Q29kZSA+PSAwID8gYW0uZ2V0UmVzdWx0KCkgOiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpCisgICAgICAgICAgICAgICAgLnN0YXJ0QWN0aXZpdHkod2hvVGhyZWFkLCBpbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQucmVzb2x2ZVR5cGVJZk5lZWRlZCh3aG8uZ2V0Q29udGVudFJlc29sdmVyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgMCwgdG9rZW4sIHRhcmdldCAhPSBudWxsID8gdGFyZ2V0Lm1XaG8gOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENvZGUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICBjaGVja1N0YXJ0QWN0aXZpdHlSZXN1bHQocmVzdWx0LCBpbnRlbnQpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIC8qcGFja2FnZSovIGZpbmFsIHZvaWQgaW5pdChBY3Rpdml0eVRocmVhZCB0aHJlYWQsCiAgICAgICAgICAgICBDb250ZXh0IGluc3RyQ29udGV4dCwgQ29udGV4dCBhcHBDb250ZXh0LCBDb21wb25lbnROYW1lIGNvbXBvbmVudCwgCiAgICAgICAgICAgICBJSW5zdHJ1bWVudGF0aW9uV2F0Y2hlciB3YXRjaGVyKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEFjdGl2aXR5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEFjdGl2aXR5LmphdmEKaW5kZXggNGJmNTUxOC4uZDQ5OTY4ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RBY3Rpdml0eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9MaXN0QWN0aXZpdHkuamF2YQpAQCAtMzA5LDcgKzMwOSw3IEBACiAgICAgICAgIGlmIChtTGlzdCAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgc2V0Q29udGVudFZpZXcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQubGlzdF9jb250ZW50KTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQubGlzdF9jb250ZW50X3NpbXBsZSk7CiAKICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9MaXN0RnJhZ21lbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9MaXN0RnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTJmNGI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsNDE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisvKioKKyAqIEEgZnJhZ21lbnQgdGhhdCBkaXNwbGF5cyBhIGxpc3Qgb2YgaXRlbXMgYnkgYmluZGluZyB0byBhIGRhdGEgc291cmNlIHN1Y2ggYXMKKyAqIGFuIGFycmF5IG9yIEN1cnNvciwgYW5kIGV4cG9zZXMgZXZlbnQgaGFuZGxlcnMgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIGl0ZW0uCisgKiA8cD4KKyAqIExpc3RGcmFnbWVudCBob3N0cyBhIHtAbGluayBhbmRyb2lkLndpZGdldC5MaXN0VmlldyBMaXN0Vmlld30gb2JqZWN0IHRoYXQgY2FuCisgKiBiZSBib3VuZCB0byBkaWZmZXJlbnQgZGF0YSBzb3VyY2VzLCB0eXBpY2FsbHkgZWl0aGVyIGFuIGFycmF5IG9yIGEgQ3Vyc29yCisgKiBob2xkaW5nIHF1ZXJ5IHJlc3VsdHMuIEJpbmRpbmcsIHNjcmVlbiBsYXlvdXQsIGFuZCByb3cgbGF5b3V0IGFyZSBkaXNjdXNzZWQKKyAqIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMuCisgKiA8cD4KKyAqIDxzdHJvbmc+U2NyZWVuIExheW91dDwvc3Ryb25nPgorICogPC9wPgorICogPHA+CisgKiBMaXN0RnJhZ21lbnQgaGFzIGEgZGVmYXVsdCBsYXlvdXQgdGhhdCBjb25zaXN0cyBvZiBhIHNpbmdsZSBsaXN0IHZpZXcuCisgKiBIb3dldmVyLCBpZiB5b3UgZGVzaXJlLCB5b3UgY2FuIGN1c3RvbWl6ZSB0aGUgZnJhZ21lbnQgbGF5b3V0IGJ5IHJldHVybmluZworICogeW91ciBvd24gdmlldyBoaWVyYXJjaHkgZnJvbSB7QGxpbmsgI29uQ3JlYXRlVmlld30uCisgKiBUbyBkbyB0aGlzLCB5b3VyIHZpZXcgaGllcmFyY2h5IDxlbT5tdXN0PC9lbT4gY29udGFpbiBhIExpc3RWaWV3IG9iamVjdCB3aXRoIHRoZQorICogaWQgIkBhbmRyb2lkOmlkL2xpc3QiIChvciB7QGxpbmsgYW5kcm9pZC5SLmlkI2xpc3R9IGlmIGl0J3MgaW4gY29kZSkKKyAqIDxwPgorICogT3B0aW9uYWxseSwgeW91ciB2aWV3IGhpZXJhcmNoeSBjYW4gY29udGFpbiBhbm90aGVyIHZpZXcgb2JqZWN0IG9mIGFueSB0eXBlIHRvCisgKiBkaXNwbGF5IHdoZW4gdGhlIGxpc3QgdmlldyBpcyBlbXB0eS4gVGhpcyAiZW1wdHkgbGlzdCIgbm90aWZpZXIgbXVzdCBoYXZlIGFuCisgKiBpZCAiYW5kcm9pZDplbXB0eSIuIE5vdGUgdGhhdCB3aGVuIGFuIGVtcHR5IHZpZXcgaXMgcHJlc2VudCwgdGhlIGxpc3QgdmlldworICogd2lsbCBiZSBoaWRkZW4gd2hlbiB0aGVyZSBpcyBubyBkYXRhIHRvIGRpc3BsYXkuCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgY29kZSBkZW1vbnN0cmF0ZXMgYW4gKHVnbHkpIGN1c3RvbSBsaXN0IGxheW91dC4gSXQgaGFzIGEgbGlzdAorICogd2l0aCBhIGdyZWVuIGJhY2tncm91bmQsIGFuZCBhbiBhbHRlcm5hdGUgcmVkICJubyBkYXRhIiBtZXNzYWdlLgorICogPC9wPgorICoKKyAqIDxwcmU+CisgKiAmbHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDt1dGYtOCZxdW90Oz8mZ3Q7CisgKiAmbHQ7TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAqICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0mcXVvdDt2ZXJ0aWNhbCZxdW90OworICogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSZxdW90OzhkcCZxdW90OworICogICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0mcXVvdDs4ZHAmcXVvdDsmZ3Q7CisgKgorICogICAgICZsdDtMaXN0VmlldyBhbmRyb2lkOmlkPSZxdW90O0BpZC9hbmRyb2lkOmxpc3QmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSZxdW90OyMwMEZGMDAmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSZxdW90OzEmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0mcXVvdDtmYWxzZSZxdW90Oy8mZ3Q7CisgKgorICogICAgICZsdDtUZXh0VmlldyBhbmRyb2lkOmlkPSZxdW90O0BpZC9hbmRyb2lkOmVtcHR5JnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0mcXVvdDsjRkYwMDAwJnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0mcXVvdDtObyBkYXRhJnF1b3Q7LyZndDsKKyAqICZsdDsvTGluZWFyTGF5b3V0Jmd0OworICogPC9wcmU+CisgKgorICogPHA+CisgKiA8c3Ryb25nPlJvdyBMYXlvdXQ8L3N0cm9uZz4KKyAqIDwvcD4KKyAqIDxwPgorICogWW91IGNhbiBzcGVjaWZ5IHRoZSBsYXlvdXQgb2YgaW5kaXZpZHVhbCByb3dzIGluIHRoZSBsaXN0LiBZb3UgZG8gdGhpcyBieQorICogc3BlY2lmeWluZyBhIGxheW91dCByZXNvdXJjZSBpbiB0aGUgTGlzdEFkYXB0ZXIgb2JqZWN0IGhvc3RlZCBieSB0aGUgZnJhZ21lbnQKKyAqICh0aGUgTGlzdEFkYXB0ZXIgYmluZHMgdGhlIExpc3RWaWV3IHRvIHRoZSBkYXRhOyBtb3JlIG9uIHRoaXMgbGF0ZXIpLgorICogPHA+CisgKiBBIExpc3RBZGFwdGVyIGNvbnN0cnVjdG9yIHRha2VzIGEgcGFyYW1ldGVyIHRoYXQgc3BlY2lmaWVzIGEgbGF5b3V0IHJlc291cmNlCisgKiBmb3IgZWFjaCByb3cuIEl0IGFsc28gaGFzIHR3byBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCBsZXQgeW91IHNwZWNpZnkKKyAqIHdoaWNoIGRhdGEgZmllbGQgdG8gYXNzb2NpYXRlIHdpdGggd2hpY2ggb2JqZWN0IGluIHRoZSByb3cgbGF5b3V0IHJlc291cmNlLgorICogVGhlc2UgdHdvIHBhcmFtZXRlcnMgYXJlIHR5cGljYWxseSBwYXJhbGxlbCBhcnJheXMuCisgKiA8L3A+CisgKiA8cD4KKyAqIEFuZHJvaWQgcHJvdmlkZXMgc29tZSBzdGFuZGFyZCByb3cgbGF5b3V0IHJlc291cmNlcy4gVGhlc2UgYXJlIGluIHRoZQorICoge0BsaW5rIGFuZHJvaWQuUi5sYXlvdXR9IGNsYXNzLCBhbmQgaGF2ZSBuYW1lcyBzdWNoIGFzIHNpbXBsZV9saXN0X2l0ZW1fMSwKKyAqIHNpbXBsZV9saXN0X2l0ZW1fMiwgYW5kIHR3b19saW5lX2xpc3RfaXRlbS4gVGhlIGZvbGxvd2luZyBsYXlvdXQgWE1MIGlzIHRoZQorICogc291cmNlIGZvciB0aGUgcmVzb3VyY2UgdHdvX2xpbmVfbGlzdF9pdGVtLCB3aGljaCBkaXNwbGF5cyB0d28gZGF0YQorICogZmllbGRzLG9uZSBhYm92ZSB0aGUgb3RoZXIsIGZvciBlYWNoIGxpc3Qgcm93LgorICogPC9wPgorICoKKyAqIDxwcmU+CisgKiAmbHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDt1dGYtOCZxdW90Oz8mZ3Q7CisgKiAmbHQ7TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAqICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9JnF1b3Q7d3JhcF9jb250ZW50JnF1b3Q7CisgKiAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0mcXVvdDt2ZXJ0aWNhbCZxdW90OyZndDsKKyAqCisgKiAgICAgJmx0O1RleHRWaWV3IGFuZHJvaWQ6aWQ9JnF1b3Q7QCtpZC90ZXh0MSZxdW90OworICogICAgICAgICBhbmRyb2lkOnRleHRTaXplPSZxdW90OzE2c3AmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9JnF1b3Q7Ym9sZCZxdW90OworICogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSZxdW90O3dyYXBfY29udGVudCZxdW90Oy8mZ3Q7CisgKgorICogICAgICZsdDtUZXh0VmlldyBhbmRyb2lkOmlkPSZxdW90O0AraWQvdGV4dDImcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0mcXVvdDsxNnNwJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9JnF1b3Q7d3JhcF9jb250ZW50JnF1b3Q7LyZndDsKKyAqICZsdDsvTGluZWFyTGF5b3V0Jmd0OworICogPC9wcmU+CisgKgorICogPHA+CisgKiBZb3UgbXVzdCBpZGVudGlmeSB0aGUgZGF0YSBib3VuZCB0byBlYWNoIFRleHRWaWV3IG9iamVjdCBpbiB0aGlzIGxheW91dC4gVGhlCisgKiBzeW50YXggZm9yIHRoaXMgaXMgZGlzY3Vzc2VkIGluIHRoZSBuZXh0IHNlY3Rpb24uCisgKiA8L3A+CisgKiA8cD4KKyAqIDxzdHJvbmc+QmluZGluZyB0byBEYXRhPC9zdHJvbmc+CisgKiA8L3A+CisgKiA8cD4KKyAqIFlvdSBiaW5kIHRoZSBMaXN0RnJhZ21lbnQncyBMaXN0VmlldyBvYmplY3QgdG8gZGF0YSB1c2luZyBhIGNsYXNzIHRoYXQKKyAqIGltcGxlbWVudHMgdGhlIHtAbGluayBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciBMaXN0QWRhcHRlcn0gaW50ZXJmYWNlLgorICogQW5kcm9pZCBwcm92aWRlcyB0d28gc3RhbmRhcmQgbGlzdCBhZGFwdGVyczoKKyAqIHtAbGluayBhbmRyb2lkLndpZGdldC5TaW1wbGVBZGFwdGVyIFNpbXBsZUFkYXB0ZXJ9IGZvciBzdGF0aWMgZGF0YSAoTWFwcyksCisgKiBhbmQge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlNpbXBsZUN1cnNvckFkYXB0ZXIgU2ltcGxlQ3Vyc29yQWRhcHRlcn0gZm9yIEN1cnNvcgorICogcXVlcnkgcmVzdWx0cy4KKyAqIDwvcD4KKyAqIDxwPgorICogWW91IDxiPm11c3Q8L2I+IHVzZQorICoge0BsaW5rICNzZXRMaXN0QWRhcHRlcihMaXN0QWRhcHRlcikgTGlzdEZyYWdtZW50LnNldExpc3RBZGFwdGVyKCl9IHRvCisgKiBhc3NvY2lhdGUgdGhlIGxpc3Qgd2l0aCBhbiBhZGFwdGVyLiAgRG8gbm90IGRpcmVjdGx5IGNhbGwKKyAqIHtAbGluayBMaXN0VmlldyNzZXRBZGFwdGVyKExpc3RBZGFwdGVyKSBMaXN0Vmlldy5zZXRBZGFwdGVyKCl9IG9yIGVsc2UKKyAqIGltcG9ydGFudCBpbml0aWFsaXphdGlvbiB3aWxsIGJlIHNraXBwZWQuCisgKiA8L3A+CisgKgorICogQHNlZSAjc2V0TGlzdEFkYXB0ZXIKKyAqIEBzZWUgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXcKKyAqLworcHVibGljIGNsYXNzIExpc3RGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKKyAgICBmaW5hbCBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworCisgICAgZmluYWwgcHJpdmF0ZSBSdW5uYWJsZSBtUmVxdWVzdEZvY3VzID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBtTGlzdC5mb2N1c2FibGVWaWV3QXZhaWxhYmxlKG1MaXN0KTsKKyAgICAgICAgfQorICAgIH07CisgICAgCisgICAgZmluYWwgcHJpdmF0ZSBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIG1PbkNsaWNrTGlzdGVuZXIKKyAgICAgICAgICAgID0gbmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIG9uTGlzdEl0ZW1DbGljaygoTGlzdFZpZXcpcGFyZW50LCB2LCBwb3NpdGlvbiwgaWQpOworICAgICAgICB9CisgICAgfTsKKworICAgIExpc3RBZGFwdGVyIG1BZGFwdGVyOworICAgIExpc3RWaWV3IG1MaXN0OworICAgIFZpZXcgbUVtcHR5VmlldzsKKyAgICBUZXh0VmlldyBtU3RhbmRhcmRFbXB0eVZpZXc7CisgICAgVmlldyBtUHJvZ3Jlc3NDb250YWluZXI7CisgICAgVmlldyBtTGlzdENvbnRhaW5lcjsKKyAgICBib29sZWFuIG1TZXRFbXB0eVRleHQ7CisgICAgYm9vbGVhbiBtTGlzdFNob3duOworCisgICAgcHVibGljIExpc3RGcmFnbWVudCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gcmV0dXJuIGEgc2ltcGxlIGxpc3Qgdmlldy4gIFN1YmNsYXNzZXMKKyAgICAgKiBjYW4gb3ZlcnJpZGUgdG8gcmVwbGFjZSB3aXRoIHRoZWlyIG93biBsYXlvdXQuICBJZiBkb2luZyBzbywgdGhlCisgICAgICogcmV0dXJuZWQgdmlldyBoaWVyYXJjaHkgPGVtPm11c3Q8L2VtPiBoYXZlIGEgTGlzdFZpZXcgd2hvc2UgaWQKKyAgICAgKiBpcyB7QGxpbmsgYW5kcm9pZC5SLmlkI2xpc3QgYW5kcm9pZC5SLmlkLmxpc3R9IGFuZCBjYW4gb3B0aW9uYWxseQorICAgICAqIGhhdmUgYSBzaWJsaW5nIHZpZXcgaWQge0BsaW5rIGFuZHJvaWQuUi5pZCNlbXB0eSBhbmRyb2lkLlIuaWQuZW1wdHl9CisgICAgICogdGhhdCBpcyB0byBiZSBzaG93biB3aGVuIHRoZSBsaXN0IGlzIGVtcHR5LgorICAgICAqIAorICAgICAqIDxwPklmIHlvdSBhcmUgb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCB3aXRoIHlvdXIgb3duIGN1c3RvbSBjb250ZW50LAorICAgICAqIGNvbnNpZGVyIGluY2x1ZGluZyB0aGUgc3RhbmRhcmQgbGF5b3V0IHtAbGluayBhbmRyb2lkLlIubGF5b3V0I2xpc3RfY29udGVudH0KKyAgICAgKiBpbiB5b3VyIGxheW91dCBmaWxlLCBzbyB0aGF0IHlvdSBjb250aW51ZSB0byByZXRhaW4gYWxsIG9mIHRoZSBzdGFuZGFyZAorICAgICAqIGJlaGF2aW9yIG9mIExpc3RGcmFnbWVudC4gIEluIHBhcnRpY3VsYXIsIHRoaXMgaXMgY3VycmVudGx5IHRoZSBvbmx5CisgICAgICogd2F5IHRvIGhhdmUgdGhlIGJ1aWx0LWluIGluZGV0ZXJtaW5hbnQgcHJvZ3Jlc3Mgc3RhdGUgYmUgc2hvd24uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gaW5mbGF0ZXIuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5saXN0X2NvbnRlbnQsCisgICAgICAgICAgICAgICAgY29udGFpbmVyLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0YWNoIHRvIGxpc3QgdmlldyBvbmNlIEZyYWdtZW50IGlzIHJlYWR5IHRvIHJ1bi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlDcmVhdGVkKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGVuc3VyZUxpc3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRhY2ggZnJvbSBsaXN0IHZpZXcuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95VmlldygpIHsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SZXF1ZXN0Rm9jdXMpOworICAgICAgICBtTGlzdCA9IG51bGw7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveVZpZXcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIGFuIGl0ZW0gaW4gdGhlIGxpc3QgaXMgc2VsZWN0ZWQuCisgICAgICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuIFN1YmNsYXNzZXMgY2FuIGNhbGwKKyAgICAgKiBnZXRMaXN0VmlldygpLmdldEl0ZW1BdFBvc2l0aW9uKHBvc2l0aW9uKSBpZiB0aGV5IG5lZWQgdG8gYWNjZXNzIHRoZQorICAgICAqIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWxlY3RlZCBpdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGwgVGhlIExpc3RWaWV3IHdoZXJlIHRoZSBjbGljayBoYXBwZW5lZAorICAgICAqIEBwYXJhbSB2IFRoZSB2aWV3IHRoYXQgd2FzIGNsaWNrZWQgd2l0aGluIHRoZSBMaXN0VmlldworICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gb2YgdGhlIHZpZXcgaW4gdGhlIGxpc3QKKyAgICAgKiBAcGFyYW0gaWQgVGhlIHJvdyBpZCBvZiB0aGUgaXRlbSB0aGF0IHdhcyBjbGlja2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZSB0aGUgY3Vyc29yIGZvciB0aGUgbGlzdCB2aWV3LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpc3RBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgYm9vbGVhbiBoYWRBZGFwdGVyID0gbUFkYXB0ZXIgIT0gbnVsbDsKKyAgICAgICAgbUFkYXB0ZXIgPSBhZGFwdGVyOworICAgICAgICBpZiAobUxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxpc3Quc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgICAgIGlmICghbUxpc3RTaG93biAmJiAhaGFkQWRhcHRlcikgeworICAgICAgICAgICAgICAgIC8vIFRoZSBsaXN0IHdhcyBoaWRkZW4sIGFuZCBwcmV2aW91c2x5IGRpZG4ndCBoYXZlIGFuCisgICAgICAgICAgICAgICAgLy8gYWRhcHRlci4gIEl0IGlzIG5vdyB0aW1lIHRvIHNob3cgaXQuCisgICAgICAgICAgICAgICAgc2V0TGlzdFNob3duKHRydWUsIGdldFZpZXcoKS5nZXRXaW5kb3dUb2tlbigpICE9IG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbGlzdCBpdGVtIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBwb3NpdGlvbiB3aXRoIHRoZSBhZGFwdGVyJ3MgZGF0YQorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgICAgIG1MaXN0LnNldFNlbGVjdGlvbihwb3NpdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGxpc3QgaXRlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkgeworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgICAgIHJldHVybiBtTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3Vyc29yIHJvdyBJRCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGxpc3QgaXRlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTZWxlY3RlZEl0ZW1JZCgpIHsKKyAgICAgICAgZW5zdXJlTGlzdCgpOworICAgICAgICByZXR1cm4gbUxpc3QuZ2V0U2VsZWN0ZWRJdGVtSWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFjdGl2aXR5J3MgbGlzdCB2aWV3IHdpZGdldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFZpZXcgZ2V0TGlzdFZpZXcoKSB7CisgICAgICAgIGVuc3VyZUxpc3QoKTsKKyAgICAgICAgcmV0dXJuIG1MaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGNvbnRlbnQgZm9yIGEgTGlzdEZyYWdtZW50IGhhcyBhIFRleHRWaWV3IHRoYXQgY2FuCisgICAgICogYmUgc2hvd24gd2hlbiB0aGUgbGlzdCBpcyBlbXB0eS4gIElmIHlvdSB3b3VsZCBsaWtlIHRvIGhhdmUgaXQKKyAgICAgKiBzaG93biwgY2FsbCB0aGlzIG1ldGhvZCB0byBzdXBwbHkgdGhlIHRleHQgaXQgc2hvdWxkIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbXB0eVRleHQoQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICAgICAgZW5zdXJlTGlzdCgpOworICAgICAgICBpZiAobVN0YW5kYXJkRW1wdHlWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbid0IGJlIHVzZWQgd2l0aCBhIGN1c3RvbSBjb250ZW50IHZpZXciKTsKKyAgICAgICAgfQorICAgICAgICBtU3RhbmRhcmRFbXB0eVZpZXcuc2V0VGV4dCh0ZXh0KTsKKyAgICAgICAgaWYgKCFtU2V0RW1wdHlUZXh0KSB7CisgICAgICAgICAgICBtTGlzdC5zZXRFbXB0eVZpZXcobVN0YW5kYXJkRW1wdHlWaWV3KTsKKyAgICAgICAgICAgIG1TZXRFbXB0eVRleHQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnRyb2wgd2hldGhlciB0aGUgbGlzdCBpcyBiZWluZyBkaXNwbGF5ZWQuICBZb3UgY2FuIG1ha2UgaXQgbm90CisgICAgICogZGlzcGxheWVkIGlmIHlvdSBhcmUgd2FpdGluZyBmb3IgdGhlIGluaXRpYWwgZGF0YSB0byBzaG93IGluIGl0LiAgRHVyaW5nCisgICAgICogdGhpcyB0aW1lIGFuIGluZGV0ZXJtaW5hbnQgcHJvZ3Jlc3MgaW5kaWNhdG9yIHdpbGwgYmUgc2hvd24gaW5zdGVhZC4KKyAgICAgKiAKKyAgICAgKiA8cD5BcHBsaWNhdGlvbnMgZG8gbm90IG5vcm1hbGx5IG5lZWQgdG8gdXNlIHRoaXMgdGhlbXNlbHZlcy4gIFRoZSBkZWZhdWx0CisgICAgICogYmVoYXZpb3Igb2YgTGlzdEZyYWdtZW50IGlzIHRvIHN0YXJ0IHdpdGggdGhlIGxpc3Qgbm90IGJlaW5nIHNob3duLCBvbmx5CisgICAgICogc2hvd2luZyBpdCBvbmNlIGFuIGFkYXB0ZXIgaXMgZ2l2ZW4gd2l0aCB7QGxpbmsgI3NldExpc3RBZGFwdGVyKExpc3RBZGFwdGVyKX0uCisgICAgICogSWYgdGhlIGxpc3QgYXQgdGhhdCBwb2ludCBoYWQgbm90IGJlZW4gc2hvd24sIHdoZW4gaXQgZG9lcyBnZXQgc2hvd24KKyAgICAgKiBpdCB3aWxsIGJlIGRvIHdpdGhvdXQgdGhlIHVzZXIgZXZlciBzZWVpbmcgdGhlIGhpZGRlbiBzdGF0ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2hvd24gSWYgdHJ1ZSwgdGhlIGxpc3QgdmlldyBpcyBzaG93bjsgaWYgZmFsc2UsIHRoZSBwcm9ncmVzcworICAgICAqIGluZGljYXRvci4gIFRoZSBpbml0aWFsIHZhbHVlIGlzIHRydWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGlzdFNob3duKGJvb2xlYW4gc2hvd24pIHsKKyAgICAgICAgc2V0TGlzdFNob3duKHNob3duLCB0cnVlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI3NldExpc3RTaG93bihib29sZWFuKX0sIGJ1dCBubyBhbmltYXRpb24gaXMgdXNlZCB3aGVuCisgICAgICogdHJhbnNpdGlvbmluZyBmcm9tIHRoZSBwcmV2aW91cyBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0U2hvd25Ob0FuaW1hdGlvbihib29sZWFuIHNob3duKSB7CisgICAgICAgIHNldExpc3RTaG93bihzaG93biwgZmFsc2UpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb250cm9sIHdoZXRoZXIgdGhlIGxpc3QgaXMgYmVpbmcgZGlzcGxheWVkLiAgWW91IGNhbiBtYWtlIGl0IG5vdAorICAgICAqIGRpc3BsYXllZCBpZiB5b3UgYXJlIHdhaXRpbmcgZm9yIHRoZSBpbml0aWFsIGRhdGEgdG8gc2hvdyBpbiBpdC4gIER1cmluZworICAgICAqIHRoaXMgdGltZSBhbiBpbmRldGVybWluYW50IHByb2dyZXNzIGluZGljYXRvciB3aWxsIGJlIHNob3duIGluc3RlYWQuCisgICAgICogCisgICAgICogQHBhcmFtIHNob3duIElmIHRydWUsIHRoZSBsaXN0IHZpZXcgaXMgc2hvd247IGlmIGZhbHNlLCB0aGUgcHJvZ3Jlc3MKKyAgICAgKiBpbmRpY2F0b3IuICBUaGUgaW5pdGlhbCB2YWx1ZSBpcyB0cnVlLgorICAgICAqIEBwYXJhbSBhbmltYXRlIElmIHRydWUsIGFuIGFuaW1hdGlvbiB3aWxsIGJlIHVzZWQgdG8gdHJhbnNpdGlvbiB0byB0aGUKKyAgICAgKiBuZXcgc3RhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldExpc3RTaG93bihib29sZWFuIHNob3duLCBib29sZWFuIGFuaW1hdGUpIHsKKyAgICAgICAgZW5zdXJlTGlzdCgpOworICAgICAgICBpZiAobVByb2dyZXNzQ29udGFpbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbid0IGJlIHVzZWQgd2l0aCBhIGN1c3RvbSBjb250ZW50IHZpZXciKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUxpc3RTaG93biA9PSBzaG93bikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1MaXN0U2hvd24gPSBzaG93bjsKKyAgICAgICAgaWYgKHNob3duKSB7CisgICAgICAgICAgICBpZiAoYW5pbWF0ZSkgeworICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0NvbnRhaW5lci5zdGFydEFuaW1hdGlvbihBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKSwgYW5kcm9pZC5SLmFuaW0uZmFkZV9vdXQpKTsKKyAgICAgICAgICAgICAgICBtTGlzdENvbnRhaW5lci5zdGFydEFuaW1hdGlvbihBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKSwgYW5kcm9pZC5SLmFuaW0uZmFkZV9pbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVByb2dyZXNzQ29udGFpbmVyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1MaXN0Q29udGFpbmVyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChhbmltYXRlKSB7CisgICAgICAgICAgICAgICAgbVByb2dyZXNzQ29udGFpbmVyLnN0YXJ0QW5pbWF0aW9uKEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLCBhbmRyb2lkLlIuYW5pbS5mYWRlX2luKSk7CisgICAgICAgICAgICAgICAgbUxpc3RDb250YWluZXIuc3RhcnRBbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCksIGFuZHJvaWQuUi5hbmltLmZhZGVfb3V0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJvZ3Jlc3NDb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbUxpc3RDb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgTGlzdEFkYXB0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWN0aXZpdHkncyBMaXN0Vmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdEFkYXB0ZXIgZ2V0TGlzdEFkYXB0ZXIoKSB7CisgICAgICAgIHJldHVybiBtQWRhcHRlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlTGlzdCgpIHsKKyAgICAgICAgaWYgKG1MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBWaWV3IHJvb3QgPSBnZXRWaWV3KCk7CisgICAgICAgIGlmIChyb290ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbnRlbnQgdmlldyBub3QgeWV0IGNyZWF0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocm9vdCBpbnN0YW5jZW9mIExpc3RWaWV3KSB7CisgICAgICAgICAgICBtTGlzdCA9IChMaXN0Vmlldylyb290OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVN0YW5kYXJkRW1wdHlWaWV3ID0gKFRleHRWaWV3KXJvb3QuZmluZFZpZXdCeUlkKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmludGVybmFsRW1wdHkpOworICAgICAgICAgICAgaWYgKG1TdGFuZGFyZEVtcHR5VmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUVtcHR5VmlldyA9IHJvb3QuZmluZFZpZXdCeUlkKGFuZHJvaWQuUi5pZC5lbXB0eSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJvZ3Jlc3NDb250YWluZXIgPSByb290LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnByb2dyZXNzQ29udGFpbmVyKTsKKyAgICAgICAgICAgIG1MaXN0Q29udGFpbmVyID0gcm9vdC5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5saXN0Q29udGFpbmVyKTsKKyAgICAgICAgICAgIFZpZXcgcmF3TGlzdFZpZXcgPSByb290LmZpbmRWaWV3QnlJZChhbmRyb2lkLlIuaWQubGlzdCk7CisgICAgICAgICAgICBpZiAoIShyYXdMaXN0VmlldyBpbnN0YW5jZW9mIExpc3RWaWV3KSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQgaGFzIHZpZXcgd2l0aCBpZCBhdHRyaWJ1dGUgJ2FuZHJvaWQuUi5pZC5saXN0JyAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJ0aGF0IGlzIG5vdCBhIExpc3RWaWV3IGNsYXNzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTGlzdCA9IChMaXN0VmlldylyYXdMaXN0VmlldzsKKyAgICAgICAgICAgIGlmIChtTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiWW91ciBjb250ZW50IG11c3QgaGF2ZSBhIExpc3RWaWV3IHdob3NlIGlkIGF0dHJpYnV0ZSBpcyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICInYW5kcm9pZC5SLmlkLmxpc3QnIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUVtcHR5VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxpc3Quc2V0RW1wdHlWaWV3KG1FbXB0eVZpZXcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1MaXN0U2hvd24gPSB0cnVlOworICAgICAgICBtTGlzdC5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1PbkNsaWNrTGlzdGVuZXIpOworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0TGlzdEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV2UgYXJlIHN0YXJ0aW5nIHdpdGhvdXQgYW4gYWRhcHRlciwgc28gYXNzdW1lIHdlIHdvbid0CisgICAgICAgICAgICAvLyBoYXZlIG91ciBkYXRhIHJpZ2h0IGF3YXkgYW5kIHN0YXJ0IHdpdGggdGhlIHByb2dyZXNzIGluZGljYXRvci4KKyAgICAgICAgICAgIGlmIChtUHJvZ3Jlc3NDb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldExpc3RTaG93bihmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1IYW5kbGVyLnBvc3QobVJlcXVlc3RGb2N1cyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlck1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2FkZXJNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhhYmNhYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2FkZXJNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw0MDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkxvYWRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKKworLyoqCisgKiBJbnRlcmZhY2UgYXNzb2NpYXRlZCB3aXRoIGFuIHtAbGluayBBY3Rpdml0eX0gb3Ige0BsaW5rIEZyYWdtZW50fSBmb3IgbWFuYWdpbmcKKyAqIG9uZSBvciBtb3JlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuTG9hZGVyfSBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIGl0LgorICovCitwdWJsaWMgaW50ZXJmYWNlIExvYWRlck1hbmFnZXIgeworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGludGVyZmFjZSBmb3IgYSBjbGllbnQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgbWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIExvYWRlckNhbGxiYWNrczxEPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnN0YW50aWF0ZSBhbmQgcmV0dXJuIGEgbmV3IExvYWRlciBmb3IgdGhlIGdpdmVuIElELgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaWQgVGhlIElEIHdob3NlIGxvYWRlciBpcyB0byBiZSBjcmVhdGVkLgorICAgICAgICAgKiBAcGFyYW0gYXJncyBBbnkgYXJndW1lbnRzIHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJuIGEgbmV3IExvYWRlciBpbnN0YW5jZSB0aGF0IGlzIHJlYWR5IHRvIHN0YXJ0IGxvYWRpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTG9hZGVyPEQ+IG9uQ3JlYXRlTG9hZGVyKGludCBpZCwgQnVuZGxlIGFyZ3MpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIHByZXZpb3VzbHkgY3JlYXRlZCBsb2FkZXIgaGFzIGZpbmlzaGVkIGl0cyBsb2FkLgorICAgICAgICAgKiBAcGFyYW0gbG9hZGVyIFRoZSBMb2FkZXIgdGhhdCBoYXMgZmluaXNoZWQuCisgICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIGdlbmVyYXRlZCBieSB0aGUgTG9hZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Mb2FkRmluaXNoZWQoTG9hZGVyPEQ+IGxvYWRlciwgRCBkYXRhKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogRW5zdXJlcyBhIGxvYWRlciBpcyBpbml0aWFsaXplZCBhbmQgYWN0aXZlLiAgSWYgdGhlIGxvYWRlciBkb2Vzbid0CisgICAgICogYWxyZWFkeSBleGlzdCwgb25lIGlzIGNyZWF0ZWQgYW5kIChpZiB0aGUgYWN0aXZpdHkvZnJhZ21lbnQgaXMgY3VycmVudGx5CisgICAgICogc3RhcnRlZCkgc3RhcnRzIHRoZSBsb2FkZXIuICBPdGhlcndpc2UgdGhlIGxhc3QgY3JlYXRlZAorICAgICAqIGxvYWRlciBpcyByZS11c2VkLgorICAgICAqCisgICAgICogPHA+SW4gZWl0aGVyIGNhc2UsIHRoZSBnaXZlbiBjYWxsYmFjayBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGxvYWRlciwgYW5kCisgICAgICogd2lsbCBiZSBjYWxsZWQgYXMgdGhlIGxvYWRlciBzdGF0ZSBjaGFuZ2VzLiAgSWYgYXQgdGhlIHBvaW50IG9mIGNhbGwKKyAgICAgKiB0aGUgY2FsbGVyIGlzIGluIGl0cyBzdGFydGVkIHN0YXRlLCBhbmQgdGhlIHJlcXVlc3RlZCBsb2FkZXIKKyAgICAgKiBhbHJlYWR5IGV4aXN0cyBhbmQgaGFzIGdlbmVyYXRlZCBpdHMgZGF0YSwgdGhlbgorICAgICAqIGNhbGxiYWNrLiB7QGxpbmsgTG9hZGVyQ2FsbGJhY2tzI29uTG9hZEZpbmlzaGVkfSB3aWxsCisgICAgICogYmUgY2FsbGVkIGltbWVkaWF0ZWx5IChpbnNpZGUgb2YgdGhpcyBmdW5jdGlvbiksIHNvIHlvdSBtdXN0IGJlIHByZXBhcmVkCisgICAgICogZm9yIHRoaXMgdG8gaGFwcGVuLgorICAgICAqLworICAgIHB1YmxpYyA8RD4gTG9hZGVyPEQ+IGluaXRMb2FkZXIoaW50IGlkLCBCdW5kbGUgYXJncywKKyAgICAgICAgICAgIExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPEQ+IGNhbGxiYWNrKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgbG9hZGVyIGluIHRoaXMgbWFuYWdlciwgcmVnaXN0ZXJzIHRoZSBjYWxsYmFja3MgdG8gaXQsCisgICAgICogYW5kIChpZiB0aGUgYWN0aXZpdHkvZnJhZ21lbnQgaXMgY3VycmVudGx5IHN0YXJ0ZWQpIHN0YXJ0cyBsb2FkaW5nIGl0LgorICAgICAqIElmIGEgbG9hZGVyIHdpdGggdGhlIHNhbWUgaWQgaGFzIHByZXZpb3VzbHkgYmVlbgorICAgICAqIHN0YXJ0ZWQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRlc3Ryb3llZCB3aGVuIHRoZSBuZXcgbG9hZGVyIGNvbXBsZXRlcworICAgICAqIGl0cyB3b3JrLiBUaGUgY2FsbGJhY2sgd2lsbCBiZSBkZWxpdmVyZWQgYmVmb3JlIHRoZSBvbGQgbG9hZGVyCisgICAgICogaXMgZGVzdHJveWVkLgorICAgICAqLworICAgIHB1YmxpYyA8RD4gTG9hZGVyPEQ+IHJlc3RhcnRMb2FkZXIoaW50IGlkLCBCdW5kbGUgYXJncywKKyAgICAgICAgICAgIExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPEQ+IGNhbGxiYWNrKTsKKworICAgIC8qKgorICAgICAqIFN0b3BzIGFuZCByZW1vdmVzIHRoZSBsb2FkZXIgd2l0aCB0aGUgZ2l2ZW4gSUQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcExvYWRlcihpbnQgaWQpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBMb2FkZXIgd2l0aCB0aGUgZ2l2ZW4gaWQgb3IgbnVsbCBpZiBubyBtYXRjaGluZyBMb2FkZXIKKyAgICAgKiBpcyBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgPEQ+IExvYWRlcjxEPiBnZXRMb2FkZXIoaW50IGlkKTsKK30KKworY2xhc3MgTG9hZGVyTWFuYWdlckltcGwgaW1wbGVtZW50cyBMb2FkZXJNYW5hZ2VyIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJMb2FkZXJNYW5hZ2VySW1wbCI7CisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOworCisgICAgLy8gVGhlc2UgYXJlIHRoZSBjdXJyZW50bHkgYWN0aXZlIGxvYWRlcnMuICBBIGxvYWRlciBpcyBoZXJlCisgICAgLy8gZnJvbSB0aGUgdGltZSBpdHMgbG9hZCBpcyBzdGFydGVkIHVudGlsIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkKKyAgICAvLyBzdG9wcGVkIG9yIHJlc3RhcnRlZCBieSB0aGUgYXBwbGljYXRpb24uCisgICAgZmluYWwgU3BhcnNlQXJyYXk8TG9hZGVySW5mbz4gbUxvYWRlcnMgPSBuZXcgU3BhcnNlQXJyYXk8TG9hZGVySW5mbz4oKTsKKworICAgIC8vIFRoZXNlIGFyZSBwcmV2aW91c2x5IHJ1biBsb2FkZXJzLiAgVGhpcyBsaXN0IGlzIG1haW50YWluZWQgaW50ZXJuYWxseQorICAgIC8vIHRvIGF2b2lkIGRlc3Ryb3lpbmcgYSBsb2FkZXIgd2hpbGUgYW4gYXBwbGljYXRpb24gaXMgc3RpbGwgdXNpbmcgaXQuCisgICAgLy8gSXQgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHJlc3RhcnQgYSBsb2FkZXIsIGJ1dCBjb250aW51ZSB1c2luZyBpdHMKKyAgICAvLyBwcmV2aW91c2x5IHJ1biBsb2FkZXIgdW50aWwgdGhlIG5ldyBsb2FkZXIncyBkYXRhIGlzIGF2YWlsYWJsZS4KKyAgICBmaW5hbCBTcGFyc2VBcnJheTxMb2FkZXJJbmZvPiBtSW5hY3RpdmVMb2FkZXJzID0gbmV3IFNwYXJzZUFycmF5PExvYWRlckluZm8+KCk7CisKKyAgICBib29sZWFuIG1TdGFydGVkOworICAgIGJvb2xlYW4gbVJldGFpbmluZzsKKyAgICBib29sZWFuIG1SZXRhaW5pbmdTdGFydGVkOworCisgICAgZmluYWwgY2xhc3MgTG9hZGVySW5mbyBpbXBsZW1lbnRzIExvYWRlci5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyPE9iamVjdD4geworICAgICAgICBmaW5hbCBpbnQgbUlkOworICAgICAgICBmaW5hbCBCdW5kbGUgbUFyZ3M7CisgICAgICAgIExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPE9iamVjdD4gbUNhbGxiYWNrczsKKyAgICAgICAgTG9hZGVyPE9iamVjdD4gbUxvYWRlcjsKKyAgICAgICAgT2JqZWN0IG1EYXRhOworICAgICAgICBib29sZWFuIG1TdGFydGVkOworICAgICAgICBib29sZWFuIG1SZXRhaW5pbmc7CisgICAgICAgIGJvb2xlYW4gbVJldGFpbmluZ1N0YXJ0ZWQ7CisgICAgICAgIGJvb2xlYW4gbURlc3Ryb3llZDsKKyAgICAgICAgYm9vbGVhbiBtTGlzdGVuZXJSZWdpc3RlcmVkOworICAgICAgICAKKyAgICAgICAgcHVibGljIExvYWRlckluZm8oaW50IGlkLCBCdW5kbGUgYXJncywgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8T2JqZWN0PiBjYWxsYmFja3MpIHsKKyAgICAgICAgICAgIG1JZCA9IGlkOworICAgICAgICAgICAgbUFyZ3MgPSBhcmdzOworICAgICAgICAgICAgbUNhbGxiYWNrcyA9IGNhbGxiYWNrczsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgICAgIGlmIChtUmV0YWluaW5nICYmIG1SZXRhaW5pbmdTdGFydGVkKSB7CisgICAgICAgICAgICAgICAgLy8gT3VyIG93bmVyIGlzIHN0YXJ0ZWQsIGJ1dCB3ZSB3ZXJlIGJlaW5nIHJldGFpbmVkIGZyb20gYQorICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIGluc3RhbmNlIGluIHRoZSBzdGFydGVkIHN0YXRlLi4uICBzbyB0aGVyZSBpcyByZWFsbHkKKyAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUsIHNpbmNlIHRoZSBsb2FkZXJzIGFyZSBzdGlsbCBzdGFydGVkLgorICAgICAgICAgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIC8vIElmIGxvYWRlciBhbHJlYWR5IHN0YXJ0ZWQsIGRvbid0IHJlc3RhcnQuCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIiAgU3RhcnRpbmc6ICIgKyB0aGlzKTsKKyAgICAgICAgICAgIGlmIChtTG9hZGVyID09IG51bGwgJiYgbUNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICBtTG9hZGVyID0gbUNhbGxiYWNrcy5vbkNyZWF0ZUxvYWRlcihtSWQsIG1BcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1MaXN0ZW5lclJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvYWRlci5yZWdpc3Rlckxpc3RlbmVyKG1JZCwgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lclJlZ2lzdGVyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTG9hZGVyLnN0YXJ0TG9hZGluZygpOworICAgICAgICAgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdm9pZCByZXRhaW4oKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIiAgUmV0YWluaW5nOiAiICsgdGhpcyk7CisgICAgICAgICAgICBtUmV0YWluaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIG1SZXRhaW5pbmdTdGFydGVkID0gbVN0YXJ0ZWQ7CisgICAgICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgbUNhbGxiYWNrcyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHZvaWQgZmluaXNoUmV0YWluKCkgeworICAgICAgICAgICAgaWYgKG1SZXRhaW5pbmcpIHsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIiAgRmluaXNoZWQgUmV0YWluaW5nOiAiICsgdGhpcyk7CisgICAgICAgICAgICAgICAgbVJldGFpbmluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChtU3RhcnRlZCAhPSBtUmV0YWluaW5nU3RhcnRlZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGxvYWRlciB3YXMgcmV0YWluZWQgaW4gYSBzdGFydGVkIHN0YXRlLCBidXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgcmV0YWluaW5nIGV2ZXJ5dGhpbmcgb3VyIG93bmVyIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBsb25nZXIgc3RhcnRlZC4uLiAgc28gbWFrZSBpdCBzdG9wLgorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtU3RhcnRlZCAmJiBtRGF0YSAhPSBudWxsICYmIG1DYWxsYmFja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGxvYWRlciB3YXMgcmV0YWluZWQsIGFuZCBub3cgYXQgdGhlIHBvaW50IG9mCisgICAgICAgICAgICAgICAgICAgIC8vIGZpbmlzaGluZyB0aGUgcmV0YWluIHdlIGZpbmQgd2UgcmVtYWluIHN0YXJ0ZWQsIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgLy8gb3VyIGRhdGEsIGFuZCB0aGUgb3duZXIgaGFzIGEgbmV3IGNhbGxiYWNrLi4uICBzbworICAgICAgICAgICAgICAgICAgICAvLyBsZXQncyBkZWxpdmVyIHRoZSBkYXRhIG5vdy4KKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrcy5vbkxvYWRGaW5pc2hlZChtTG9hZGVyLCBtRGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICB2b2lkIHN0b3AoKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIiAgU3RvcHBpbmc6ICIgKyB0aGlzKTsKKyAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoIW1SZXRhaW5pbmcpIHsKKyAgICAgICAgICAgICAgICBpZiAobUxvYWRlciAhPSBudWxsICYmIG1MaXN0ZW5lclJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTGV0IHRoZSBsb2FkZXIga25vdyB3ZSdyZSBkb25lIHdpdGggaXQKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtTG9hZGVyLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvYWRlci5zdG9wTG9hZGluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtRGF0YSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBEZXN0cm95aW5nOiAiICsgdGhpcyk7CisgICAgICAgICAgICBtRGVzdHJveWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1DYWxsYmFja3MgPSBudWxsOworICAgICAgICAgICAgaWYgKG1Mb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXJSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lclJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbUxvYWRlci51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Mb2FkZXIuZGVzdHJveSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25Mb2FkQ29tcGxldGUoTG9hZGVyPE9iamVjdD4gbG9hZGVyLCBPYmplY3QgZGF0YSkgeworICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJvbkxvYWRDb21wbGV0ZTogIiArIHRoaXMgKyAiIG1EZXN0cm95ZWQ9IiArIG1EZXN0cm95ZWQpOworCisgICAgICAgICAgICBpZiAobURlc3Ryb3llZCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gTm90aWZ5IG9mIHRoZSBuZXcgZGF0YSBzbyB0aGUgYXBwIGNhbiBzd2l0Y2ggb3V0IHRoZSBvbGQgZGF0YSBiZWZvcmUKKyAgICAgICAgICAgIC8vIHdlIHRyeSB0byBkZXN0cm95IGl0LgorICAgICAgICAgICAgbURhdGEgPSBkYXRhOworICAgICAgICAgICAgaWYgKG1DYWxsYmFja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DYWxsYmFja3Mub25Mb2FkRmluaXNoZWQobG9hZGVyLCBkYXRhKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJvbkxvYWRGaW5pc2hlZCByZXR1cm5lZDogIiArIHRoaXMpOworCisgICAgICAgICAgICAvLyBXZSBoYXZlIG5vdyBnaXZlbiB0aGUgYXBwbGljYXRpb24gdGhlIG5ldyBsb2FkZXIgd2l0aCBpdHMKKyAgICAgICAgICAgIC8vIGxvYWRlZCBkYXRhLCBzbyBpdCBzaG91bGQgaGF2ZSBzdG9wcGVkIHVzaW5nIHRoZSBwcmV2aW91cworICAgICAgICAgICAgLy8gbG9hZGVyLiAgSWYgdGhlcmUgaXMgYSBwcmV2aW91cyBsb2FkZXIgb24gdGhlIGluYWN0aXZlIGxpc3QsCisgICAgICAgICAgICAvLyBjbGVhbiBpdCB1cC4KKyAgICAgICAgICAgIExvYWRlckluZm8gaW5mbyA9IG1JbmFjdGl2ZUxvYWRlcnMuZ2V0KG1JZCk7CisgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsICYmIGluZm8gIT0gdGhpcykgeworICAgICAgICAgICAgICAgIGluZm8uZGVzdHJveSgpOworICAgICAgICAgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMucmVtb3ZlKG1JZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcig2NCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIkxvYWRlckluZm97Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZSh0aGlzKSkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIyIpOworICAgICAgICAgICAgc2IuYXBwZW5kKG1JZCk7CisgICAgICAgICAgICBpZiAobUFyZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChtQXJncy50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLmFwcGVuZCgifSIpOworICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgTG9hZGVyTWFuYWdlckltcGwoYm9vbGVhbiBzdGFydGVkKSB7CisgICAgICAgIG1TdGFydGVkID0gc3RhcnRlZDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBMb2FkZXJJbmZvIGNyZWF0ZUxvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzLAorICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8T2JqZWN0PiBjYWxsYmFjaykgeworICAgICAgICBMb2FkZXJJbmZvIGluZm8gPSBuZXcgTG9hZGVySW5mbyhpZCwgYXJncywgIChMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxPYmplY3Q+KWNhbGxiYWNrKTsKKyAgICAgICAgbUxvYWRlcnMucHV0KGlkLCBpbmZvKTsKKyAgICAgICAgTG9hZGVyPE9iamVjdD4gbG9hZGVyID0gY2FsbGJhY2sub25DcmVhdGVMb2FkZXIoaWQsIGFyZ3MpOworICAgICAgICBpbmZvLm1Mb2FkZXIgPSAoTG9hZGVyPE9iamVjdD4pbG9hZGVyOworICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIC8vIFRoZSBhY3Rpdml0eSB3aWxsIHN0YXJ0IGFsbCBleGlzdGluZyBsb2FkZXJzIGluIGl0J3Mgb25TdGFydCgpLAorICAgICAgICAgICAgLy8gc28gb25seSBzdGFydCB0aGVtIGhlcmUgaWYgd2UncmUgcGFzdCB0aGF0IHBvaW50IG9mIHRoZSBhY3Rpdml0aXkncworICAgICAgICAgICAgLy8gbGlmZSBjeWNsZQorICAgICAgICAgICAgaW5mby5zdGFydCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KKyAgICAKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgPEQ+IExvYWRlcjxEPiBpbml0TG9hZGVyKGludCBpZCwgQnVuZGxlIGFyZ3MsIExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPEQ+IGNhbGxiYWNrKSB7CisgICAgICAgIExvYWRlckluZm8gaW5mbyA9IG1Mb2FkZXJzLmdldChpZCk7CisgICAgICAgIAorICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgImluaXRMb2FkZXIgaW4gIiArIHRoaXMgKyAiOiBjdXI9IiArIGluZm8pOworCisgICAgICAgIGlmIChpbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIExvYWRlciBkb2Vzbid0IGFscmVhZHkgZXhpc3Q7IGNyZWF0ZS4KKyAgICAgICAgICAgIGluZm8gPSBjcmVhdGVMb2FkZXIoaWQsIGFyZ3MsICAoTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8T2JqZWN0PiljYWxsYmFjayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbmZvLm1DYWxsYmFja3MgPSAoTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8T2JqZWN0PiljYWxsYmFjazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGluZm8ubURhdGEgIT0gbnVsbCAmJiBtU3RhcnRlZCkgeworICAgICAgICAgICAgLy8gSWYgdGhlIGxvYWRlciBoYXMgYWxyZWFkeSBnZW5lcmF0ZWQgaXRzIGRhdGEsIHJlcG9ydCBpdCBub3cuCisgICAgICAgICAgICBpbmZvLm1DYWxsYmFja3Mub25Mb2FkRmluaXNoZWQoaW5mby5tTG9hZGVyLCBpbmZvLm1EYXRhKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIChMb2FkZXI8RD4paW5mby5tTG9hZGVyOworICAgIH0KKyAgICAKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgPEQ+IExvYWRlcjxEPiByZXN0YXJ0TG9hZGVyKGludCBpZCwgQnVuZGxlIGFyZ3MsIExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPEQ+IGNhbGxiYWNrKSB7CisgICAgICAgIExvYWRlckluZm8gaW5mbyA9IG1Mb2FkZXJzLmdldChpZCk7CisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAicmVzdGFydExvYWRlciBpbiAiICsgdGhpcyArICI6IGN1cj0iICsgaW5mbyk7CisgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIExvYWRlckluZm8gaW5hY3RpdmUgPSBtSW5hY3RpdmVMb2FkZXJzLmdldChpZCk7CisgICAgICAgICAgICBpZiAoaW5hY3RpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChpbmZvLm1EYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBsb2FkZXIgbm93IGhhcyBkYXRhLi4uICB3ZSBhcmUgcHJvYmFibHkgYmVpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGVkIGZyb20gd2l0aGluIG9uTG9hZENvbXBsZXRlLCB3aGVyZSB3ZSBoYXZlbid0CisgICAgICAgICAgICAgICAgICAgIC8vIHlldCBkZXN0cm95ZWQgdGhlIGxhc3QgaW5hY3RpdmUgbG9hZGVyLiAgU28ganVzdCBkbworICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IG5vdy4KKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICIgIFJlbW92aW5nIGxhc3QgaW5hY3RpdmUgbG9hZGVyIGluICIgKyB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgaW5hY3RpdmUuZGVzdHJveSgpOworICAgICAgICAgICAgICAgICAgICBtSW5hY3RpdmVMb2FkZXJzLnB1dChpZCwgaW5mbyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGluYWN0aXZlIGxvYWRlciBmb3IgdGhpcyBJRCB0aGF0IHdlIGFyZQorICAgICAgICAgICAgICAgICAgICAvLyB3YWl0aW5nIGZvciEgIE5vdyB3ZSBoYXZlIHRocmVlIGFjdGl2ZSBsb2FkZXJzLi4uIGxldCdzIGp1c3QKKyAgICAgICAgICAgICAgICAgICAgLy8gZHJvcCB0aGUgb25lIGluIHRoZSBtaWRkbGUsIHNpbmNlIHdlIGFyZSBzdGlsbCB3YWl0aW5nIGZvcgorICAgICAgICAgICAgICAgICAgICAvLyBpdHMgcmVzdWx0IGJ1dCB0aGF0IHJlc3VsdCBpcyBhbHJlYWR5IG91dCBvZiBkYXRlLgorICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIiAgUmVtb3ZpbmcgaW50ZXJtZWRpYXRlIGxvYWRlciBpbiAiICsgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIGluZm8uZGVzdHJveSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgcHJldmlvdXMgaW5zdGFuY2Ugb2YgdGhpcyBsb2FkZXIgc28gd2UgY2FuIGRlc3Ryb3kKKyAgICAgICAgICAgICAgICAvLyBpdCB3aGVuIHRoZSBuZXcgb25lIGNvbXBsZXRlcy4KKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIiAgTWFraW5nIGluYWN0aXZlOiAiICsgaW5mbyk7CisgICAgICAgICAgICAgICAgbUluYWN0aXZlTG9hZGVycy5wdXQoaWQsIGluZm8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbmZvID0gY3JlYXRlTG9hZGVyKGlkLCBhcmdzLCAgKExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPE9iamVjdD4pY2FsbGJhY2spOworICAgICAgICByZXR1cm4gKExvYWRlcjxEPilpbmZvLm1Mb2FkZXI7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHN0b3BMb2FkZXIoaW50IGlkKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAic3RvcExvYWRlciBpbiAiICsgdGhpcyArICIgb2YgIiArIGlkKTsKKyAgICAgICAgaW50IGlkeCA9IG1Mb2FkZXJzLmluZGV4T2ZLZXkoaWQpOworICAgICAgICBpZiAoaWR4ID49IDApIHsKKyAgICAgICAgICAgIExvYWRlckluZm8gaW5mbyA9IG1Mb2FkZXJzLnZhbHVlQXQoaWR4KTsKKyAgICAgICAgICAgIG1Mb2FkZXJzLnJlbW92ZUF0KGlkeCk7CisgICAgICAgICAgICBpbmZvLmRlc3Ryb3koKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyA8RD4gTG9hZGVyPEQ+IGdldExvYWRlcihpbnQgaWQpIHsKKyAgICAgICAgTG9hZGVySW5mbyBsb2FkZXJJbmZvID0gbUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgaWYgKGxvYWRlckluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChMb2FkZXI8RD4pbUxvYWRlcnMuZ2V0KGlkKS5tTG9hZGVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAKKyAgICB2b2lkIGRvU3RhcnQoKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiU3RhcnRpbmc6ICIgKyB0aGlzKTsKKworICAgICAgICAvLyBDYWxsIG91dCB0byBzdWIgY2xhc3NlcyBzbyB0aGV5IGNhbiBzdGFydCB0aGVpciBsb2FkZXJzCisgICAgICAgIC8vIExldCB0aGUgZXhpc3RpbmcgbG9hZGVycyBrbm93IHRoYXQgd2Ugd2FudCB0byBiZSBub3RpZmllZCB3aGVuIGEgbG9hZCBpcyBjb21wbGV0ZQorICAgICAgICBmb3IgKGludCBpID0gbUxvYWRlcnMuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBtTG9hZGVycy52YWx1ZUF0KGkpLnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICB2b2lkIGRvU3RvcCgpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJTdG9wcGluZzogIiArIHRoaXMpOworCisgICAgICAgIGZvciAoaW50IGkgPSBtTG9hZGVycy5zaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIG1Mb2FkZXJzLnZhbHVlQXQoaSkuc3RvcCgpOworICAgICAgICB9CisgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgfQorICAgIAorICAgIHZvaWQgZG9SZXRhaW4oKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiUmV0YWluaW5nOiAiICsgdGhpcyk7CisKKyAgICAgICAgbVJldGFpbmluZyA9IHRydWU7CisgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSBtTG9hZGVycy5zaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIG1Mb2FkZXJzLnZhbHVlQXQoaSkucmV0YWluKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBmaW5pc2hSZXRhaW4oKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiRmluaXNoZWQgUmV0YWluaW5nOiAiICsgdGhpcyk7CisKKyAgICAgICAgbVJldGFpbmluZyA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gbUxvYWRlcnMuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBtTG9hZGVycy52YWx1ZUF0KGkpLmZpbmlzaFJldGFpbigpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgZG9EZXN0cm95KCkgeworICAgICAgICBpZiAoIW1SZXRhaW5pbmcpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiRGVzdHJveWluZyBBY3RpdmU6ICIgKyB0aGlzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtTG9hZGVycy5zaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBtTG9hZGVycy52YWx1ZUF0KGkpLmRlc3Ryb3koKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJEZXN0cm95aW5nIEluYWN0aXZlOiAiICsgdGhpcyk7CisgICAgICAgIGZvciAoaW50IGkgPSBtSW5hY3RpdmVMb2FkZXJzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgbUluYWN0aXZlTG9hZGVycy52YWx1ZUF0KGkpLmRlc3Ryb3koKTsKKyAgICAgICAgfQorICAgICAgICBtSW5hY3RpdmVMb2FkZXJzLmNsZWFyKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlck1hbmFnaW5nRnJhZ21lbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2FkZXJNYW5hZ2luZ0ZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ0MTdhMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2FkZXJNYW5hZ2luZ0ZyYWdtZW50LmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkxvYWRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIEEgRnJhZ21lbnQgdGhhdCBoYXMgdXRpbGl0eSBtZXRob2RzIGZvciBtYW5hZ2luZyB7QGxpbmsgTG9hZGVyfXMuCisgKgorICogQHBhcmFtIDxEPiBUaGUgdHlwZSBvZiBkYXRhIHJldHVybmVkIGJ5IHRoZSBMb2FkZXIuIElmIHlvdSdyZSB1c2luZyBtdWx0aXBsZSBMb2FkZXJzIHdpdGgKKyAqIGRpZmZlcmVudCByZXR1cm4gdHlwZXMgdXNlIE9iamVjdCBhbmQgY2FzZSB0aGUgcmVzdWx0cy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIExvYWRlck1hbmFnaW5nRnJhZ21lbnQ8RD4gZXh0ZW5kcyBGcmFnbWVudAorICAgICAgICBpbXBsZW1lbnRzIExvYWRlci5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyPEQ+IHsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBMb2FkZXJJbmZvPEQ+IHsKKyAgICAgICAgcHVibGljIEJ1bmRsZSBhcmdzOworICAgICAgICBwdWJsaWMgTG9hZGVyPEQ+IGxvYWRlcjsKKyAgICB9CisgICAgcHJpdmF0ZSBIYXNoTWFwPEludGVnZXIsIExvYWRlckluZm88RD4+IG1Mb2FkZXJzOworICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLCBMb2FkZXJJbmZvPEQ+PiBtSW5hY3RpdmVMb2FkZXJzOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgbG9hZGVyIHdpdGggdGhpcyBhY3Rpdml0eSwgcmVnaXN0ZXJzIHRoZSBjYWxsYmFja3Mgb24gaXQsIGFuZCBzdGFydHMgaXQgbG9hZGluZy4KKyAgICAgKiBJZiBhIGxvYWRlciB3aXRoIHRoZSBzYW1lIGlkIGhhcyBwcmV2aW91c2x5IGJlZW4gc3RhcnRlZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGVzdHJveWVkCisgICAgICogd2hlbiB0aGUgbmV3IGxvYWRlciBjb21wbGV0ZXMgaXQncyB3b3JrLiBUaGUgY2FsbGJhY2sgd2lsbCBiZSBkZWxpdmVyZWQgYmVmb3JlIHRoZSBvbGQgbG9hZGVyCisgICAgICogaXMgZGVzdHJveWVkLgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXI8RD4gc3RhcnRMb2FkaW5nKGludCBpZCwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgTG9hZGVySW5mbzxEPiBpbmZvID0gbUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgcHJldmlvdXMgaW5zdGFuY2Ugb2YgdGhpcyBsb2FkZXIgc28gd2UgY2FuIGRlc3Ryb3kKKyAgICAgICAgICAgIC8vIGl0IHdoZW4gdGhlIG5ldyBvbmUgY29tcGxldGVzLgorICAgICAgICAgICAgbUluYWN0aXZlTG9hZGVycy5wdXQoaWQsIGluZm8pOworICAgICAgICB9CisgICAgICAgIGluZm8gPSBuZXcgTG9hZGVySW5mbzxEPigpOworICAgICAgICBpbmZvLmFyZ3MgPSBhcmdzOworICAgICAgICBtTG9hZGVycy5wdXQoaWQsIGluZm8pOworICAgICAgICBMb2FkZXI8RD4gbG9hZGVyID0gb25DcmVhdGVMb2FkZXIoaWQsIGFyZ3MpOworICAgICAgICBpbmZvLmxvYWRlciA9IGxvYWRlcjsKKyAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICAvLyBUaGUgYWN0aXZpdHkgd2lsbCBzdGFydCBhbGwgZXhpc3RpbmcgbG9hZGVycyBpbiBpdCdzIG9uU3RhcnQoKSwgc28gb25seSBzdGFydCB0aGVtCisgICAgICAgICAgICAvLyBoZXJlIGlmIHdlJ3JlIHBhc3QgdGhhdCBwb2ludCBvZiB0aGUgYWN0aXZpdGl5J3MgbGlmZSBjeWNsZQorICAgICAgICAgICAgbG9hZGVyLnJlZ2lzdGVyTGlzdGVuZXIoaWQsIHRoaXMpOworICAgICAgICAgICAgbG9hZGVyLnN0YXJ0TG9hZGluZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsb2FkZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IExvYWRlcjxEPiBvbkNyZWF0ZUxvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkluaXRpYWxpemVMb2FkZXJzKCk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25Mb2FkRmluaXNoZWQoTG9hZGVyPEQ+IGxvYWRlciwgRCBkYXRhKTsKKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIG9uTG9hZENvbXBsZXRlKExvYWRlcjxEPiBsb2FkZXIsIEQgZGF0YSkgeworICAgICAgICAvLyBOb3RpZnkgb2YgdGhlIG5ldyBkYXRhIHNvIHRoZSBhcHAgY2FuIHN3aXRjaCBvdXQgdGhlIG9sZCBkYXRhIGJlZm9yZQorICAgICAgICAvLyB3ZSB0cnkgdG8gZGVzdHJveSBpdC4KKyAgICAgICAgb25Mb2FkRmluaXNoZWQobG9hZGVyLCBkYXRhKTsKKworICAgICAgICAvLyBMb29rIGZvciBhbiBpbmFjdGl2ZSBsb2FkZXIgYW5kIGRlc3Ryb3kgaXQgaWYgZm91bmQKKyAgICAgICAgaW50IGlkID0gbG9hZGVyLmdldElkKCk7CisgICAgICAgIExvYWRlckluZm88RD4gaW5mbyA9IG1JbmFjdGl2ZUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgTG9hZGVyPEQ+IG9sZExvYWRlciA9IGluZm8ubG9hZGVyOworICAgICAgICAgICAgaWYgKG9sZExvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb2xkTG9hZGVyLmRlc3Ryb3koKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMucmVtb3ZlKGlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZFN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkU3RhdGUpOworCisgICAgICAgIGlmIChtTG9hZGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBMb29rIGZvciBhIHBhc3NlZCBhbG9uZyBsb2FkZXIgYW5kIGNyZWF0ZSBhIG5ldyBvbmUgaWYgaXQncyBub3QgdGhlcmUKKy8vIFRPRE86IHVuY29tbWVudCBvbmNlIGdldExhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgbWV0aG9kIGlzIGF2YWlsYWJsZQorLy8gICAgICAgICAgICBtTG9hZGVycyA9IChIYXNoTWFwPEludGVnZXIsIExvYWRlckluZm8+KSBnZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCk7CisgICAgICAgICAgICBpZiAobUxvYWRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Mb2FkZXJzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgTG9hZGVySW5mbzxEPj4oKTsKKyAgICAgICAgICAgICAgICBvbkluaXRpYWxpemVMb2FkZXJzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JbmFjdGl2ZUxvYWRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbUluYWN0aXZlTG9hZGVycyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIExvYWRlckluZm88RD4+KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICBzdXBlci5vblN0YXJ0KCk7CisKKyAgICAgICAgLy8gQ2FsbCBvdXQgdG8gc3ViIGNsYXNzZXMgc28gdGhleSBjYW4gc3RhcnQgdGhlaXIgbG9hZGVycworICAgICAgICAvLyBMZXQgdGhlIGV4aXN0aW5nIGxvYWRlcnMga25vdyB0aGF0IHdlIHdhbnQgdG8gYmUgbm90aWZpZWQgd2hlbiBhIGxvYWQgaXMgY29tcGxldGUKKyAgICAgICAgZm9yIChIYXNoTWFwLkVudHJ5PEludGVnZXIsIExvYWRlckluZm88RD4+IGVudHJ5IDogbUxvYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgTG9hZGVySW5mbzxEPiBpbmZvID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIExvYWRlcjxEPiBsb2FkZXIgPSBpbmZvLmxvYWRlcjsKKyAgICAgICAgICAgIGludCBpZCA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICBsb2FkZXIgPSBvbkNyZWF0ZUxvYWRlcihpZCwgaW5mby5hcmdzKTsKKyAgICAgICAgICAgICAgIGluZm8ubG9hZGVyID0gbG9hZGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9hZGVyLnJlZ2lzdGVyTGlzdGVuZXIoaWQsIHRoaXMpOworICAgICAgICAgICAgbG9hZGVyLnN0YXJ0TG9hZGluZygpOworICAgICAgICB9CisKKyAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgc3VwZXIub25TdG9wKCk7CisKKyAgICAgICAgZm9yIChIYXNoTWFwLkVudHJ5PEludGVnZXIsIExvYWRlckluZm88RD4+IGVudHJ5IDogbUxvYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgTG9hZGVySW5mbzxEPiBpbmZvID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIExvYWRlcjxEPiBsb2FkZXIgPSBpbmZvLmxvYWRlcjsKKyAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBMZXQgdGhlIGxvYWRlciBrbm93IHdlJ3JlIGRvbmUgd2l0aCBpdAorICAgICAgICAgICAgbG9hZGVyLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICAgICAgLy8gVGhlIGxvYWRlciBpc24ndCBnZXR0aW5nIHBhc3NlZCBhbG9uZyB0byB0aGUgbmV4dCBpbnN0YW5jZSBzbyBhc2sgaXQgdG8gc3RvcCBsb2FkaW5nCisgICAgICAgICAgICBpZiAoIWdldEFjdGl2aXR5KCkuaXNDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCkpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXIuc3RvcExvYWRpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqIFRPIERPOiBUaGlzIG5lZWRzIHRvIGJlIHR1cm5lZCBpbnRvIGEgcmV0YWluZWQgZnJhZ21lbnQuCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBvblJldGFpbk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpIHsKKyAgICAgICAgLy8gUGFzcyB0aGUgbG9hZGVyIGFsb25nIHRvIHRoZSBuZXh0IGd1eQorICAgICAgICBPYmplY3QgcmVzdWx0ID0gbUxvYWRlcnM7CisgICAgICAgIG1Mb2FkZXJzID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgKiovCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworCisgICAgICAgIGlmIChtTG9hZGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEhhc2hNYXAuRW50cnk8SW50ZWdlciwgTG9hZGVySW5mbzxEPj4gZW50cnkgOiBtTG9hZGVycy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgTG9hZGVySW5mbzxEPiBpbmZvID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBMb2FkZXI8RD4gbG9hZGVyID0gaW5mby5sb2FkZXI7CisgICAgICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2FkZXIuZGVzdHJveSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcHMgYW5kIHJlbW92ZXMgdGhlIGxvYWRlciB3aXRoIHRoZSBnaXZlbiBJRC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wTG9hZGluZyhpbnQgaWQpIHsKKyAgICAgICAgaWYgKG1Mb2FkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIExvYWRlckluZm88RD4gaW5mbyA9IG1Mb2FkZXJzLnJlbW92ZShpZCk7CisgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9hZGVyPEQ+IGxvYWRlciA9IGluZm8ubG9hZGVyOworICAgICAgICAgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsb2FkZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgICAgICBsb2FkZXIuZGVzdHJveSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIExvYWRlciB3aXRoIHRoZSBnaXZlbiBpZCBvciBudWxsIGlmIG5vIG1hdGNoaW5nIExvYWRlcgorICAgICAqIGlzIGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXI8RD4gZ2V0TG9hZGVyKGludCBpZCkgeworICAgICAgICBMb2FkZXJJbmZvPEQ+IGxvYWRlckluZm8gPSBtTG9hZGVycy5nZXQoaWQpOworICAgICAgICBpZiAobG9hZGVySW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvYWRlcnMuZ2V0KGlkKS5sb2FkZXI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9jYWxBY3Rpdml0eU1hbmFnZXIuamF2YQppbmRleCBhMjRmY2FlLi41MjRkZTZmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9jYWxBY3Rpdml0eU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9jYWxBY3Rpdml0eU1hbmFnZXIuamF2YQpAQCAtMjAsMTMgKzIwLDExIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKgpAQCAtMzgsNyArMzYsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgTG9jYWxBY3Rpdml0eU1hbmFnZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTG9jYWxBY3Rpdml0eU1hbmFnZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gbG9jYWxMT0dWID0gZmFsc2UgfHwgQ29uZmlnLkxPR1Y7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBsb2NhbExPR1YgPSBmYWxzZTsKIAogICAgIC8vIEludGVybmFsIHRva2VuIGZvciBhbiBBY3Rpdml0eSBiZWluZyBtYW5hZ2VkIGJ5IExvY2FsQWN0aXZpdHlNYW5hZ2VyLgogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExvY2FsQWN0aXZpdHlSZWNvcmQgZXh0ZW5kcyBCaW5kZXIgewpAQCAtMTEyLDExICsxMTAsMTYgQEAKICAgICAgICAgCiAgICAgICAgIGlmIChyLmN1clN0YXRlID09IElOSVRJQUxJWklORykgewogICAgICAgICAgICAgLy8gR2V0IHRoZSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlIGZvciB0aGUgYWN0aXZpdHkKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLE9iamVjdD4gbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgPQotICAgICAgICAgICAgICAgIG1QYXJlbnQuZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpOwotICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlID0gbnVsbDsKKyAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0KKyAgICAgICAgICAgICAgICAgICAgbVBhcmVudC5nZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzKCk7CisgICAgICAgICAgICBPYmplY3QgaW5zdGFuY2VPYmogPSBudWxsOwogICAgICAgICAgICAgaWYgKGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLmdldChyLmlkKTsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZU9iaiA9IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLmdldChyLmlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2aXR5Lk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgaW5zdGFuY2UgPSBudWxsOworICAgICAgICAgICAgaWYgKGluc3RhbmNlT2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBBY3Rpdml0eS5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzKCk7CisgICAgICAgICAgICAgICAgaW5zdGFuY2UuYWN0aXZpdHkgPSBpbnN0YW5jZU9iajsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBoYXZlIGFsd2F5cyBjcmVhdGVkIHRoZSBhY3Rpdml0eS4KQEAgLTM0Niw3ICszNDksNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgV2luZG93IHBlcmZvcm1EZXN0cm95KExvY2FsQWN0aXZpdHlSZWNvcmQgciwgYm9vbGVhbiBmaW5pc2gpIHsKLSAgICAgICAgV2luZG93IHdpbiA9IG51bGw7CisgICAgICAgIFdpbmRvdyB3aW47CiAgICAgICAgIHdpbiA9IHIud2luZG93OwogICAgICAgICBpZiAoci5jdXJTdGF0ZSA9PSBSRVNVTUVEICYmICFmaW5pc2gpIHsKICAgICAgICAgICAgIHBlcmZvcm1QYXVzZShyLCBmaW5pc2gpOwpAQCAtMzgwLDcgKzM4Myw4IEBACiAgICAgICAgIGlmIChyICE9IG51bGwpIHsKICAgICAgICAgICAgIHdpbiA9IHBlcmZvcm1EZXN0cm95KHIsIGZpbmlzaCk7CiAgICAgICAgICAgICBpZiAoZmluaXNoKSB7Ci0gICAgICAgICAgICAgICAgbUFjdGl2aXRpZXMucmVtb3ZlKHIpOworICAgICAgICAgICAgICAgIG1BY3Rpdml0aWVzLnJlbW92ZShpZCk7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5QXJyYXkucmVtb3ZlKHIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiB3aW47CkBAIC00NDEsMTAgKzQ0NSw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hDcmVhdGUoQnVuZGxlIHN0YXRlKSB7CiAgICAgICAgIGlmIChzdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxTdHJpbmc+IGkgPSBzdGF0ZS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBpZCA6IHN0YXRlLmtleVNldCgpKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gaS5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBhc3RhdGUgPSBzdGF0ZS5nZXRCdW5kbGUoaWQpOwogICAgICAgICAgICAgICAgICAgICBMb2NhbEFjdGl2aXR5UmVjb3JkIHIgPSBtQWN0aXZpdGllcy5nZXQoaWQpOwogICAgICAgICAgICAgICAgICAgICBpZiAociAhPSBudWxsKSB7CkBAIC00NTcsOSArNDU5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFJlY292ZXIgZnJvbSAtYWxsLSBhcHAgZXJyb3JzLgotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gdGhyb3duIHdoZW4gcmVzdG9yaW5nIExvY2FsQWN0aXZpdHlNYW5hZ2VyIHN0YXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiB0aHJvd24gd2hlbiByZXN0b3JpbmcgTG9jYWxBY3Rpdml0eU1hbmFnZXIgc3RhdGUiLCBlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Ob3RpZmljYXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Ob3RpZmljYXRpb24uamF2YQppbmRleCA1NTI1Y2UzLi44M2EyMDI0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTm90aWZpY2F0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL05vdGlmaWNhdGlvbi5qYXZhCkBAIC0xMTIsNiArMTEyLDggQEAKICAgICAgKiBBbiBpbnRlbnQgdG8gbGF1bmNoIGluc3RlYWQgb2YgcG9zdGluZyB0aGUgbm90aWZpY2F0aW9uIHRvIHRoZSBzdGF0dXMgYmFyLiBPbmx5IGZvciB1c2Ugd2l0aAogICAgICAqIGV4dHJlbWVseSBoaWdoLXByaW9yaXR5IG5vdGlmaWNhdGlvbnMgZGVtYW5kaW5nIHRoZSB1c2VyJ3MgYXR0ZW50aW9uLCBzdWNoIGFzIGFuIGluY29taW5nCiAgICAgICogY2FsbCAoaGFuZGxlZCBpbiB0aGUgY29yZSBBbmRyb2lkIFBob25lIGFwcCB3aXRoIGEgZnVsbC1zY3JlZW4gQWN0aXZpdHkpLgorICAgICAqIFVzZSB3aXRoIHtAbGluayAjRkxBR19ISUdIX1BSSU9SSVRZfSB0byBlbnN1cmUgdGhhdCB0aGlzIG5vdGlmaWNhdGlvbiB3aWxsIHJlYWNoIHRoZSB1c2VyCisgICAgICogZXZlbiB3aGVuIG90aGVyIG5vdGlmaWNhdGlvbnMgYXJlIHN1cHByZXNzZWQuCiAgICAgICovCiAgICAgcHVibGljIFBlbmRpbmdJbnRlbnQgZnVsbFNjcmVlbkludGVudDsKIApAQCAtMjcxLDYgKzI3MywxNCBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfRk9SRUdST1VORF9TRVJWSUNFID0gMHgwMDAwMDA0MDsKIAorICAgIC8qKgorICAgICAqIEJpdCB0byBiZSBiaXR3aXNlLW9yZWQgaW50byB0aGUge0BsaW5rICNmbGFnc30gZmllbGQgdGhhdCBzaG91bGQgYmUgc2V0IGlmIHRoaXMgbm90aWZpY2F0aW9uCisgICAgICogcmVwcmVzZW50cyBhIGhpZ2gtcHJpb3JpdHkgZXZlbnQgdGhhdCBtYXkgYmUgc2hvd24gdG8gdGhlIHVzZXIgZXZlbiBpZiBub3RpZmljYXRpb25zIGFyZQorICAgICAqIG90aGVyd2lzZSB1bmF2YWlsYWJsZSAodGhhdCBpcywgd2hlbiB0aGUgc3RhdHVzIGJhciBpcyBoaWRkZW4pLiBUaGlzIGZsYWcgaXMgaWRlYWxseSB1c2VkCisgICAgICogaW4gY29uanVuY3Rpb24gd2l0aCB7QGxpbmsgI2Z1bGxTY3JlZW5JbnRlbnR9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSElHSF9QUklPUklUWSA9IDB4MDAwMDAwODA7CisKICAgICBwdWJsaWMgaW50IGZsYWdzOwogCiAgICAgLyoqCkBAIC01MzksNiArNTQ5LDkgQEAKICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcodGhpcy5kZWZhdWx0cykpOwogICAgICAgICBzYi5hcHBlbmQoIixmbGFncz0weCIpOwogICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyh0aGlzLmZsYWdzKSk7CisgICAgICAgIGlmICgodGhpcy5mbGFncyAmIEZMQUdfSElHSF9QUklPUklUWSkgIT0gMCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIhISExIW9uZSEiKTsKKyAgICAgICAgfQogICAgICAgICBzYi5hcHBlbmQoIikiKTsKICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZUFkbWluSW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZUFkbWluSW5mby5qYXZhCmluZGV4IDBiY2Q2NWMuLjIyMzdjODIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VBZG1pbkluZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlQWRtaW5JbmZvLmphdmEKQEAgLTEwMyw2ICsxMDMsMTUgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VTX1BPTElDWV9XSVBFX0RBVEEgPSA0OwogCisgICAgLyoqCisgICAgICogQSB0eXBlIG9mIHBvbGljeSB0aGF0IHRoaXMgZGV2aWNlIGFkbWluIGNhbiB1c2U6IGFibGUgdG8gc3BlY2lmeSB0aGUKKyAgICAgKiBkZXZpY2UgR2xvYmFsIFByb3h5LCB2aWEge0BsaW5rIERldmljZVBvbGljeU1hbmFnZXIjc2V0R2xvYmFsUHJveHl9LgorICAgICAqCisgICAgICogPHA+VG8gY29udHJvbCB0aGlzIHBvbGljeSwgdGhlIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgYSAic2V0LWdsb2JhbC1wcm94eSIKKyAgICAgKiB0YWcgaW4gdGhlICJ1c2VzLXBvbGljaWVzIiBzZWN0aW9uIG9mIGl0cyBtZXRhLWRhdGEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNFU19QT0xJQ1lfU0VUU19HTE9CQUxfUFJPWFkgPSA1OworCiAgICAgLyoqIEBoaWRlICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQb2xpY3lJbmZvIHsKICAgICAgICAgcHVibGljIGZpbmFsIGludCBpZGVudDsKQEAgLTEzOCw2ICsxNDcsOSBAQAogICAgICAgICBzUG9saWNpZXNEaXNwbGF5T3JkZXIuYWRkKG5ldyBQb2xpY3lJbmZvKFVTRVNfUE9MSUNZX0ZPUkNFX0xPQ0ssICJmb3JjZS1sb2NrIiwKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wb2xpY3lsYWJfZm9yY2VMb2NrLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWRlc2NfZm9yY2VMb2NrKSk7CisgICAgICAgIHNQb2xpY2llc0Rpc3BsYXlPcmRlci5hZGQobmV3IFBvbGljeUluZm8oVVNFU19QT0xJQ1lfU0VUU19HTE9CQUxfUFJPWFksICJzZXQtZ2xvYmFsLXByb3h5IiwKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wb2xpY3lsYWJfc2V0R2xvYmFsUHJveHksCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSkpOwogICAgICAgICAKICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNQb2xpY2llc0Rpc3BsYXlPcmRlci5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgUG9saWN5SW5mbyBwaSA9IHNQb2xpY2llc0Rpc3BsYXlPcmRlci5nZXQoaSk7CkBAIC0zMjgsNyArMzQwLDcgQEAKICAgICAgKiB0aGUgZ2l2ZW4gcG9saWN5IGNvbnRyb2wuICBUaGUgcG9zc2libGUgcG9saWN5IGlkZW50aWZpZXIgaW5wdXRzIGFyZToKICAgICAgKiB7QGxpbmsgI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSwge0BsaW5rICNVU0VTX1BPTElDWV9XQVRDSF9MT0dJTn0sCiAgICAgICoge0BsaW5rICNVU0VTX1BPTElDWV9SRVNFVF9QQVNTV09SRH0sIHtAbGluayAjVVNFU19QT0xJQ1lfRk9SQ0VfTE9DS30sCi0gICAgICoge0BsaW5rICNVU0VTX1BPTElDWV9XSVBFX0RBVEF9LgorICAgICAqIHtAbGluayAjVVNFU19QT0xJQ1lfV0lQRV9EQVRBfSwge0BsaW5rICNVU0VTX1BPTElDWV9TRVRTX0dMT0JBTF9QUk9YWX0uCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gdXNlc1BvbGljeShpbnQgcG9saWN5SWRlbnQpIHsKICAgICAgICAgcmV0dXJuIChtVXNlc1BvbGljaWVzICYgKDE8PHBvbGljeUlkZW50KSkgIT0gMDsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VQb2xpY3lNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlUG9saWN5TWFuYWdlci5qYXZhCmluZGV4IDI5NmQ3MGE0Li4yYjdlNDI3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlUG9saWN5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VQb2xpY3lNYW5hZ2VyLmphdmEKQEAgLTMyLDYgKzMyLDggQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Qcm94eTsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCkBAIC00Niw3ICs0OCw3IEBACiAKICAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBJRGV2aWNlUG9saWN5TWFuYWdlciBtU2VydmljZTsKLSAgICAKKwogICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKIAogICAgIHByaXZhdGUgRGV2aWNlUG9saWN5TWFuYWdlcihDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgaGFuZGxlcikgewpAQCAtNjEsMTQgKzYzLDE0IEBACiAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIgbWUgPSBuZXcgRGV2aWNlUG9saWN5TWFuYWdlcihjb250ZXh0LCBoYW5kbGVyKTsKICAgICAgICAgcmV0dXJuIG1lLm1TZXJ2aWNlICE9IG51bGwgPyBtZSA6IG51bGw7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQWN0aXZpdHkgYWN0aW9uOiBhc2sgdGhlIHVzZXIgdG8gYWRkIGEgbmV3IGRldmljZSBhZG1pbmlzdHJhdG9yIHRvIHRoZSBzeXN0ZW0uCiAgICAgICogVGhlIGRlc2lyZWQgcG9saWN5IGlzIHRoZSBDb21wb25lbnROYW1lIG9mIHRoZSBwb2xpY3kgaW4gdGhlCiAgICAgICoge0BsaW5rICNFWFRSQV9ERVZJQ0VfQURNSU59IGV4dHJhIGZpZWxkLiAgVGhpcyB3aWxsIGludm9rZSBhIFVJIHRvCiAgICAgICogYnJpbmcgdGhlIHVzZXIgdGhyb3VnaCBhZGRpbmcgdGhlIGRldmljZSBhZG1pbmlzdHJhdG9yIHRvIHRoZSBzeXN0ZW0gKG9yCiAgICAgICogYWxsb3dpbmcgdGhlbSB0byByZWplY3QgaXQpLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+WW91IGNhbiBvcHRpb25hbGx5IGluY2x1ZGUgdGhlIHtAbGluayAjRVhUUkFfQUREX0VYUExBTkFUSU9OfQogICAgICAqIGZpZWxkIHRvIHByb3ZpZGUgdGhlIHVzZXIgd2l0aCBhZGRpdGlvbmFsIGV4cGxhbmF0aW9uIChpbiBhZGRpdGlvbgogICAgICAqIHRvIHlvdXIgY29tcG9uZW50J3MgZGVzY3JpcHRpb24pIGFib3V0IHdoYXQgaXMgYmVpbmcgYWRkZWQuCkBAIC03Niw3ICs3OCw3IEBACiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5BQ1RJVklUWV9JTlRFTlRfQUNUSU9OKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9BRERfREVWSUNFX0FETUlOCiAgICAgICAgICAgICA9ICJhbmRyb2lkLmFwcC5hY3Rpb24uQUREX0RFVklDRV9BRE1JTiI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBY3Rpdml0eSBhY3Rpb246IHNlbmQgd2hlbiBhbnkgcG9saWN5IGFkbWluIGNoYW5nZXMgYSBwb2xpY3kuCiAgICAgICogVGhpcyBpcyBnZW5lcmFsbHkgdXNlZCB0byBmaW5kIG91dCB3aGVuIGEgbmV3IHBvbGljeSBpcyBpbiBlZmZlY3QuCkBAIC05Miw3ICs5NCw3IEBACiAgICAgICogQHNlZSAjQUNUSU9OX0FERF9ERVZJQ0VfQURNSU4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9ERVZJQ0VfQURNSU4gPSAiYW5kcm9pZC5hcHAuZXh0cmEuREVWSUNFX0FETUlOIjsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEFuIG9wdGlvbmFsIENoYXJTZXF1ZW5jZSBwcm92aWRpbmcgYWRkaXRpb25hbCBleHBsYW5hdGlvbiBmb3Igd2h5IHRoZQogICAgICAqIGFkbWluIGlzIGJlaW5nIGFkZGVkLgpAQCAtMTAwLDIyICsxMDIsMjEgQEAKICAgICAgKiBAc2VlICNBQ1RJT05fQUREX0RFVklDRV9BRE1JTgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0FERF9FWFBMQU5BVElPTiA9ICJhbmRyb2lkLmFwcC5leHRyYS5BRERfRVhQTEFOQVRJT04iOwotICAgIAorCiAgICAgLyoqCi0gICAgICogQWN0aXZpdHkgYWN0aW9uOiBoYXZlIHRoZSB1c2VyIGVudGVyIGEgbmV3IHBhc3N3b3JkLiAgVGhpcyBhY3Rpdml0eQotICAgICAqIHNob3VsZCBiZSBsYXVuY2hlZCBhZnRlciB1c2luZyB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eShDb21wb25lbnROYW1lLCBpbnQpfQotICAgICAqIG9yIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKENvbXBvbmVudE5hbWUsIGludCl9IHRvIGhhdmUgdGhlCi0gICAgICogdXNlciBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IG1lZXRzIHRoZSBjdXJyZW50IHJlcXVpcmVtZW50cy4gIFlvdSBjYW4KLSAgICAgKiB1c2Uge0BsaW5rICNpc0FjdGl2ZVBhc3N3b3JkU3VmZmljaWVudCgpfSB0byBkZXRlcm1pbmUgd2hldGhlciB5b3UgbmVlZAotICAgICAqIHRvIGhhdmUgdGhlIHVzZXIgc2VsZWN0IGEgbmV3IHBhc3N3b3JkIGluIG9yZGVyIHRvIG1lZXQgdGhlIGN1cnJlbnQKLSAgICAgKiBjb25zdHJhaW50cy4gIFVwb24gYmVpbmcgcmVzdW1lZCBmcm9tIHRoaXMgYWN0aXZpdHksCi0gICAgICogeW91IGNhbiBjaGVjayB0aGUgbmV3IHBhc3N3b3JkIGNoYXJhY3RlcmlzdGljcyB0byBzZWUgaWYgdGhleSBhcmUKLSAgICAgKiBzdWZmaWNpZW50LgorICAgICAqIEFjdGl2aXR5IGFjdGlvbjogaGF2ZSB0aGUgdXNlciBlbnRlciBhIG5ldyBwYXNzd29yZC4gVGhpcyBhY3Rpdml0eSBzaG91bGQKKyAgICAgKiBiZSBsYXVuY2hlZCBhZnRlciB1c2luZyB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eShDb21wb25lbnROYW1lLCBpbnQpfSwKKyAgICAgKiBvciB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bUxlbmd0aChDb21wb25lbnROYW1lLCBpbnQpfSB0byBoYXZlIHRoZSB1c2VyCisgICAgICogZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBtZWV0cyB0aGUgY3VycmVudCByZXF1aXJlbWVudHMuIFlvdSBjYW4gdXNlCisgICAgICoge0BsaW5rICNpc0FjdGl2ZVBhc3N3b3JkU3VmZmljaWVudCgpfSB0byBkZXRlcm1pbmUgd2hldGhlciB5b3UgbmVlZCB0bworICAgICAqIGhhdmUgdGhlIHVzZXIgc2VsZWN0IGEgbmV3IHBhc3N3b3JkIGluIG9yZGVyIHRvIG1lZXQgdGhlIGN1cnJlbnQKKyAgICAgKiBjb25zdHJhaW50cy4gVXBvbiBiZWluZyByZXN1bWVkIGZyb20gdGhpcyBhY3Rpdml0eSwgeW91IGNhbiBjaGVjayB0aGUgbmV3CisgICAgICogcGFzc3dvcmQgY2hhcmFjdGVyaXN0aWNzIHRvIHNlZSBpZiB0aGV5IGFyZSBzdWZmaWNpZW50LgogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQUNUSVZJVFlfSU5URU5UX0FDVElPTikKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0VUX05FV19QQVNTV09SRAogICAgICAgICAgICAgPSAiYW5kcm9pZC5hcHAuYWN0aW9uLlNFVF9ORVdfUEFTU1dPUkQiOwotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGFkbWluaXN0cmF0b3IgY29tcG9uZW50IGlzIGN1cnJlbnRseQogICAgICAqIGFjdGl2ZSAoZW5hYmxlZCkgaW4gdGhlIHN5c3RlbS4KQEAgLTEzMCw3ICsxMzEsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBjdXJyZW50bHkgYWN0aXZlIGRldmljZSBhZG1pbmlzdHJhdG9yJ3MgY29tcG9uZW50CiAgICAgICogbmFtZXMuICBOb3RlIHRoYXQgaWYgdGhlcmUgYXJlIG5vIGFkbWluaXN0cmF0b3JzIHRoYW4gbnVsbCBtYXkgYmUKQEAgLTE0Niw3ICsxNDcsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC0xNjAsNyArMTYxLDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmVtb3ZlIGEgY3VycmVudCBhZG1pbmlzdHJhdGlvbiBjb21wb25lbnQuICBUaGlzIGNhbiBvbmx5IGJlIGNhbGxlZAogICAgICAqIGJ5IHRoZSBhcHBsaWNhdGlvbiB0aGF0IG93bnMgdGhlIGFkbWluaXN0cmF0aW9uIGNvbXBvbmVudDsgaWYgeW91CkBAIC0xNzYsMjggKzE3NywyOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHBvbGljeSBoYXMgbm8gcmVxdWlyZW1lbnRzCiAgICAgICogZm9yIHRoZSBwYXNzd29yZC4gIE5vdGUgdGhhdCBxdWFsaXR5IGNvbnN0YW50cyBhcmUgb3JkZXJlZCBzbyB0aGF0IGhpZ2hlcgogICAgICAqIHZhbHVlcyBhcmUgbW9yZSByZXN0cmljdGl2ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEID0gMDsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSBwb2xpY3kgcmVxdWlyZXMgc29tZSBraW5kCiAgICAgICogb2YgcGFzc3dvcmQsIGJ1dCBkb2Vzbid0IGNhcmUgd2hhdCBpdCBpcy4gIE5vdGUgdGhhdCBxdWFsaXR5IGNvbnN0YW50cwogICAgICAqIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyIHZhbHVlcyBhcmUgbW9yZSByZXN0cmljdGl2ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORyA9IDB4MTAwMDA7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDb25zdGFudCBmb3Ige0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9OiB0aGUgdXNlciBtdXN0IGhhdmUgZW50ZXJlZCBhCiAgICAgICogcGFzc3dvcmQgY29udGFpbmluZyBhdCBsZWFzdCBudW1lcmljIGNoYXJhY3RlcnMuICBOb3RlIHRoYXQgcXVhbGl0eQogICAgICAqIGNvbnN0YW50cyBhcmUgb3JkZXJlZCBzbyB0aGF0IGhpZ2hlciB2YWx1ZXMgYXJlIG1vcmUgcmVzdHJpY3RpdmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDID0gMHgyMDAwMDsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSB1c2VyIG11c3QgaGF2ZSBlbnRlcmVkIGEKICAgICAgKiBwYXNzd29yZCBjb250YWluaW5nIGF0IGxlYXN0IGFscGhhYmV0aWMgKG9yIG90aGVyIHN5bWJvbCkgY2hhcmFjdGVycy4KQEAgLTIwNSw3ICsyMDYsNyBAQAogICAgICAqIHJlc3RyaWN0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQyA9IDB4NDAwMDA7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDb25zdGFudCBmb3Ige0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9OiB0aGUgdXNlciBtdXN0IGhhdmUgZW50ZXJlZCBhCiAgICAgICogcGFzc3dvcmQgY29udGFpbmluZyBhdCBsZWFzdCA8ZW0+Ym90aD48L2VtPiBudW1lcmljIDxlbT5hbmQ8L2VtPgpAQCAtMjEzLDcgKzIxNCwxOSBAQAogICAgICAqIG9yZGVyZWQgc28gdGhhdCBoaWdoZXIgdmFsdWVzIGFyZSBtb3JlIHJlc3RyaWN0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDID0gMHg1MDAwMDsKLSAgICAKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSB1c2VyIG11c3QgaGF2ZSBlbnRlcmVkIGEKKyAgICAgKiBwYXNzd29yZCBjb250YWluaW5nIGF0IGxlYXN0IGEgbGV0dGVyLCBhIG51bWVyaWNhbCBkaWdpdCBhbmQgYSBzcGVjaWFsCisgICAgICogc3ltYm9sLCBieSBkZWZhdWx0LiBXaXRoIHRoaXMgcGFzc3dvcmQgcXVhbGl0eSwgcGFzc3dvcmRzIGNhbiBiZQorICAgICAqIHJlc3RyaWN0ZWQgdG8gY29udGFpbiB2YXJpb3VzIHNldHMgb2YgY2hhcmFjdGVycywgbGlrZSBhdCBsZWFzdCBhbgorICAgICAqIHVwcGVyY2FzZSBsZXR0ZXIsIGV0Yy4gVGhlc2UgYXJlIHNwZWNpZmllZCB1c2luZyB2YXJpb3VzIG1ldGhvZHMsCisgICAgICogbGlrZSB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShDb21wb25lbnROYW1lLCBpbnQpfS4gTm90ZQorICAgICAqIHRoYXQgcXVhbGl0eSBjb25zdGFudHMgYXJlIG9yZGVyZWQgc28gdGhhdCBoaWdoZXIgdmFsdWVzIGFyZSBtb3JlCisgICAgICogcmVzdHJpY3RpdmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYID0gMHg2MDAwMDsKKwogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCiAgICAgICogcGFzc3dvcmQgcmVzdHJpY3Rpb25zIGl0IGlzIGltcG9zaW5nLiAgQWZ0ZXIgc2V0dGluZyB0aGlzLCB0aGUgdXNlcgpAQCAtMjIyLDIxICsyMzUsMjEgQEAKICAgICAgKiB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzIG5vdAogICAgICAqIHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuICBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKICAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5RdWFsaXR5IGNvbnN0YW50cyBhcmUgb3JkZXJlZCBzbyB0aGF0IGhpZ2hlciB2YWx1ZXMgYXJlIG1vcmUgcmVzdHJpY3RpdmU7CiAgICAgICogdGh1cyB0aGUgaGlnaGVzdCByZXF1ZXN0ZWQgcXVhbGl0eSBjb25zdGFudCAoYmV0d2VlbiB0aGUgcG9saWN5IHNldCBoZXJlLAogICAgICAqIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZSwgYW5kIGFueSBvdGhlciBjb25zaWRlcmF0aW9ucykgaXMgdGhlIG9uZSB0aGF0CiAgICAgICogaXMgaW4gZWZmZWN0LgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkIHdpdGguCiAgICAgICogQHBhcmFtIHF1YWxpdHkgVGhlIG5ldyBkZXNpcmVkIHF1YWxpdHkuICBPbmUgb2YKICAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUR9LCB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HfSwKICAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQ30sIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDfSwKLSAgICAgKiBvciB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDfS4KKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDfSBvciB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRRdWFsaXR5KENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBxdWFsaXR5KSB7CiAgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CkBAIC0yNDcsNyArMjYwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG1pbmltdW0gcGFzc3dvcmQgcXVhbGl0eSBmb3IgYWxsIGFkbWlucwogICAgICAqIG9yIGEgcGFydGljdWxhciBvbmUuCkBAIC0yNjQsNyArMjc3LDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQogICAgICAqIG1pbmltdW0gYWxsb3dlZCBwYXNzd29yZCBsZW5ndGguICBBZnRlciBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyCkBAIC0yNzQsMTQgKzI4NywxNCBAQAogICAgICAqIHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuICBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKICAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuICBUaGlzCiAgICAgICogY29uc3RyYWludCBpcyBvbmx5IGltcG9zZWQgaWYgdGhlIGFkbWluaXN0cmF0b3IgaGFzIGFsc28gcmVxdWVzdGVkIGVpdGhlcgotICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDfSwge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUN9LAotICAgICAqIG9yIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9CisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX05VTUVSSUN9LCB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQ30KKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDfSwgb3Ige0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9CiAgICAgICogd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQgd2l0aC4KICAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIHBhc3N3b3JkIGxlbmd0aC4gIEEgdmFsdWUgb2YgMAogICAgICAqIG1lYW5zIHRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uLgpAQCAtMjk1LDcgKzMwOCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBtaW5pbXVtIHBhc3N3b3JkIGxlbmd0aCBmb3IgYWxsIGFkbWlucwogICAgICAqIG9yIGEgcGFydGljdWxhciBvbmUuCkBAIC0zMTIsNyArMzI1LDM3OSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogbWluaW11bSBudW1iZXIgb2YgdXBwZXIgY2FzZSBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQWZ0ZXIKKyAgICAgKiBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBpcworICAgICAqIG5vdCBhdCBsZWFzdCBhcyByZXN0cmljdGl2ZSBhcyB3aGF0IGhhcyBiZWVuIHNldC4gTm90ZSB0aGF0IHRoZSBjdXJyZW50CisgICAgICogcGFzc3dvcmQgd2lsbCByZW1haW4gdW50aWwgdGhlIHVzZXIgaGFzIHNldCBhIG5ldyBvbmUsIHNvIHRoZSBjaGFuZ2UgZG9lcworICAgICAqIG5vdCB0YWtlIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuIFRoaXMKKyAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uIFRoZQorICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgMC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIHdpdGguCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbWluaW11bSBudW1iZXIgb2YgdXBwZXIgY2FzZSBsZXR0ZXJzCisgICAgICogICAgICAgICAgICByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubworICAgICAqICAgICAgICAgICAgcmVzdHJpY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHVwcGVyIGNhc2UgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiBwYXNzd29yZCBmb3IgYWxsIGFkbWlucyBvciBhIHBhcnRpY3VsYXIgb25lLiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogc2V0IGJ5IHsjbGluayB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShDb21wb25lbnROYW1lLCBpbnQpfQorICAgICAqIGFuZCBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgcGFzc3dvcmQgcXVhbGl0eSBpcworICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvCisgICAgICogICAgICAgICAgICBhZ2dyZWdhdGUgYWxsIGFkbWlucy4KKyAgICAgKiBAcmV0dXJuIFRoZSBtaW5pbXVtIG51bWJlciBvZiB1cHBlciBjYXNlIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlCisgICAgICogICAgICAgICBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShDb21wb25lbnROYW1lIGFkbWluKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoYWRtaW4pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogbWluaW11bSBudW1iZXIgb2YgbG93ZXIgY2FzZSBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQWZ0ZXIKKyAgICAgKiBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBpcworICAgICAqIG5vdCBhdCBsZWFzdCBhcyByZXN0cmljdGl2ZSBhcyB3aGF0IGhhcyBiZWVuIHNldC4gTm90ZSB0aGF0IHRoZSBjdXJyZW50CisgICAgICogcGFzc3dvcmQgd2lsbCByZW1haW4gdW50aWwgdGhlIHVzZXIgaGFzIHNldCBhIG5ldyBvbmUsIHNvIHRoZSBjaGFuZ2UgZG9lcworICAgICAqIG5vdCB0YWtlIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuIFRoaXMKKyAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uIFRoZQorICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgMC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIHdpdGguCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbWluaW11bSBudW1iZXIgb2YgbG93ZXIgY2FzZSBsZXR0ZXJzCisgICAgICogICAgICAgICAgICByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubworICAgICAqICAgICAgICAgICAgcmVzdHJpY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGxvd2VyIGNhc2UgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiBwYXNzd29yZCBmb3IgYWxsIGFkbWlucyBvciBhIHBhcnRpY3VsYXIgb25lLiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogc2V0IGJ5IHsjbGluayB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShDb21wb25lbnROYW1lLCBpbnQpfQorICAgICAqIGFuZCBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgcGFzc3dvcmQgcXVhbGl0eSBpcworICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvCisgICAgICogICAgICAgICAgICBhZ2dyZWdhdGUgYWxsIGFkbWlucy4KKyAgICAgKiBAcmV0dXJuIFRoZSBtaW5pbXVtIG51bWJlciBvZiBsb3dlciBjYXNlIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlCisgICAgICogICAgICAgICBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShDb21wb25lbnROYW1lIGFkbWluKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoYWRtaW4pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogbWluaW11bSBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEFmdGVyIHNldHRpbmcgdGhpcywKKyAgICAgKiB0aGUgdXNlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgaXMgbm90IGF0IGxlYXN0IGFzCisgICAgICogcmVzdHJpY3RpdmUgYXMgd2hhdCBoYXMgYmVlbiBzZXQuIE5vdGUgdGhhdCB0aGUgY3VycmVudCBwYXNzd29yZCB3aWxsCisgICAgICogcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMgbm90IHRha2UKKyAgICAgKiBwbGFjZSBpbW1lZGlhdGVseS4gVG8gcHJvbXB0IHRoZSB1c2VyIGZvciBhIG5ldyBwYXNzd29yZCwgdXNlCisgICAgICoge0BsaW5rICNBQ1RJT05fU0VUX05FV19QQVNTV09SRH0gYWZ0ZXIgc2V0dGluZyB0aGlzIHZhbHVlLiBUaGlzCisgICAgICogY29uc3RyYWludCBpcyBvbmx5IGltcG9zZWQgaWYgdGhlIGFkbWluaXN0cmF0b3IgaGFzIGFsc28gcmVxdWVzdGVkCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9IHdpdGgge0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9LiBUaGUKKyAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIDEuCisgICAgICogPHA+CisgICAgICogVGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKKyAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAgICogICAgICAgICAgICB3aXRoLgorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBkZXNpcmVkIG1pbmltdW0gbnVtYmVyIG9mIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlCisgICAgICogICAgICAgICAgICBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxldHRlcnMoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkIGZvciBhbGwKKyAgICAgKiBhZG1pbnMgb3IgYSBwYXJ0aWN1bGFyIG9uZS4gVGhpcyBpcyB0aGUgc2FtZSB2YWx1ZSBhcworICAgICAqIHNldCBieSB7I2xpbmsge0BsaW5rICNzZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhDb21wb25lbnROYW1lIGFkbWluKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKGFkbWluKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQorICAgICAqIG1pbmltdW0gbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlcgorICAgICAqIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzCisgICAgICogbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQKKyAgICAgKiBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzCisgICAgICogbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAxLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBudW1lcmljYWwgZGlnaXRzIHJlcXVpcmVkCisgICAgICogICAgICAgICAgICBpbiB0aGUgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhhZG1pbiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG51bWJlciBvZiBudW1lcmljYWwgZGlnaXRzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZAorICAgICAqIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhDb21wb25lbnROYW1lLCBpbnQpfQorICAgICAqIGFuZCBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgcGFzc3dvcmQgcXVhbGl0eSBpcworICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvCisgICAgICogICAgICAgICAgICBhZ2dyZWdhdGUgYWxsIGFkbWlucy4KKyAgICAgKiBAcmV0dXJuIFRoZSBtaW5pbXVtIG51bWJlciBvZiBudW1lcmljYWwgZGlnaXRzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bU51bWVyaWMoQ29tcG9uZW50TmFtZSBhZG1pbikgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQWZ0ZXIgc2V0dGluZyB0aGlzLAorICAgICAqIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBpcyBub3QgYXQgbGVhc3QgYXMKKyAgICAgKiByZXN0cmljdGl2ZSBhcyB3aGF0IGhhcyBiZWVuIHNldC4gTm90ZSB0aGF0IHRoZSBjdXJyZW50IHBhc3N3b3JkIHdpbGwKKyAgICAgKiByZW1haW4gdW50aWwgdGhlIHVzZXIgaGFzIHNldCBhIG5ldyBvbmUsIHNvIHRoZSBjaGFuZ2UgZG9lcyBub3QgdGFrZQorICAgICAqIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuIFRoaXMKKyAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uIFRoZQorICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgMS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIHdpdGguCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbWluaW11bSBudW1iZXIgb2Ygc3ltYm9scyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhc3N3b3JkLiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhDb21wb25lbnROYW1lIGFkbWluLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2Ygc3ltYm9scyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQgZm9yIGFsbAorICAgICAqIGFkbWlucyBvciBhIHBhcnRpY3VsYXIgb25lLiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogc2V0IGJ5IHsjbGluayB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoQ29tcG9uZW50TmFtZSwgaW50KX0KKyAgICAgKiBhbmQgb25seSBhcHBsaWVzIHdoZW4gdGhlIHBhc3N3b3JkIHF1YWxpdHkgaXMKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gVGhlIG5hbWUgb2YgdGhlIGFkbWluIGNvbXBvbmVudCB0byBjaGVjaywgb3IgbnVsbCB0bworICAgICAqICAgICAgICAgICAgYWdncmVnYXRlIGFsbCBhZG1pbnMuCisgICAgICogQHJldHVybiBUaGUgbWluaW11bSBudW1iZXIgb2Ygc3ltYm9scyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoYWRtaW4pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogbWluaW11bSBudW1iZXIgb2Ygbm9uLWxldHRlciBjaGFyYWN0ZXJzIChudW1lcmljYWwgZGlnaXRzIG9yIHN5bWJvbHMpCisgICAgICogcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlciBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUKKyAgICAgKiB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzIG5vdCBhdCBsZWFzdCBhcyByZXN0cmljdGl2ZSBhcyB3aGF0IGhhcworICAgICAqIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgcGFzc3dvcmQgd2lsbCByZW1haW4gdW50aWwgdGhlIHVzZXIgaGFzCisgICAgICogc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzIG5vdCB0YWtlIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQKKyAgICAgKiB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZSB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlcgorICAgICAqIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcyBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvcgorICAgICAqIGhhcyBhbHNvIHJlcXVlc3RlZCB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0gd2l0aAorICAgICAqIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIHdpdGguCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbWluaW11bSBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhc3N3b3JkLiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIG5vbi1sZXR0ZXIgY2hhcmFjdGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiBwYXNzd29yZCBmb3IgYWxsIGFkbWlucyBvciBhIHBhcnRpY3VsYXIgb25lLiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogc2V0IGJ5IHsjbGluayB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihDb21wb25lbnROYW1lLCBpbnQpfQorICAgICAqIGFuZCBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgcGFzc3dvcmQgcXVhbGl0eSBpcworICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvCisgICAgICogICAgICAgICAgICBhZ2dyZWdhdGUgYWxsIGFkbWlucy4KKyAgICAgKiBAcmV0dXJuIFRoZSBtaW5pbXVtIG51bWJlciBvZiBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihDb21wb25lbnROYW1lIGFkbWluKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoYWRtaW4pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKioKKyAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUgbGVuZ3RoCisgICAqIG9mIHRoZSBwYXNzd29yZCBoaXN0b3J5LiBBZnRlciBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8KKyAgICogZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBpcyB0aGUgc2FtZSBhcyBhbnkgcGFzc3dvcmQgaW4gdGhlIGhpc3RvcnkuIE5vdGUKKyAgICogdGhhdCB0aGUgY3VycmVudCBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28KKyAgICogdGhlIGNoYW5nZSBkb2VzIG5vdCB0YWtlIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3CisgICAqIHBhc3N3b3JkLCB1c2Uge0BsaW5rICNBQ1RJT05fU0VUX05FV19QQVNTV09SRH0gYWZ0ZXIgc2V0dGluZyB0aGlzIHZhbHVlLgorICAgKiBUaGlzIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgKiBlaXRoZXIge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX05VTUVSSUN9LAorICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQ30sIG9yCisgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9IHdpdGgge0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9LgorICAgKgorICAgKiA8cD4KKyAgICogVGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKKyAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsIHRoaXMKKyAgICogbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICoKKyAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgKiAgICAgICAgd2l0aC4KKyAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbGVuZ3RoIG9mIHBhc3N3b3JkIGhpc3RvcnkuIEEgdmFsdWUgb2YgMAorICAgKiAgICAgICAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCisgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChDb21wb25lbnROYW1lIGFkbWluLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChhZG1pbiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IHBhc3N3b3JkIGhpc3RvcnkgbGVuZ3RoIGZvciBhbGwgYWRtaW5zCisgICAgICogb3IgYSBwYXJ0aWN1bGFyIG9uZS4KKyAgICAgKiBAcGFyYW0gYWRtaW4gVGhlIG5hbWUgb2YgdGhlIGFkbWluIGNvbXBvbmVudCB0byBjaGVjaywgb3IgbnVsbCB0byBhZ2dyZWdhdGUKKyAgICAgKiBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIGxlbmd0aCBvZiB0aGUgcGFzc3dvcmQgaGlzdG9yeQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBtYXhpbXVtIHBhc3N3b3JkIGxlbmd0aCB0aGF0IHRoZSBkZXZpY2Ugc3VwcG9ydHMgZm9yIGEKICAgICAgKiBwYXJ0aWN1bGFyIHBhc3N3b3JkIHF1YWxpdHkuCkBAIC0zMjMsMTYgKzcwOCwxNiBAQAogICAgICAgICAvLyBLaW5kLW9mIGFyYml0cmFyeS4KICAgICAgICAgcmV0dXJuIDE2OwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBjdXJyZW50IHBhc3N3b3JkIHRoZSB1c2VyIGhhcyBzZXQgaXMgc3VmZmljaWVudAogICAgICAqIHRvIG1lZXQgdGhlIHBvbGljeSByZXF1aXJlbWVudHMgKHF1YWxpdHksIG1pbmltdW0gbGVuZ3RoKSB0aGF0IGhhdmUgYmVlbgogICAgICAqIHJlcXVlc3RlZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCiAgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhc3N3b3JkIG1lZXRzIHRoZSBjdXJyZW50IHJlcXVpcmVtZW50cywKICAgICAgKiBlbHNlIGZhbHNlLgogICAgICAqLwpAQCAtMzQ2LDExICs3MzEsMTEgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgdXNlciBoYXMgZmFpbGVkIGF0IGVudGVyaW5nIGEKICAgICAgKiBwYXNzd29yZCBzaW5jZSB0aGF0IGxhc3Qgc3VjY2Vzc2Z1bCBwYXNzd29yZCBlbnRyeS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCiAgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9XQVRDSF9MT0dJTn0gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgpAQCAtMzczLDE0ICs3NTgsMTQgQEAKICAgICAgKiB3YXRjaGluZyBmb3IgZmFpbGVkIHBhc3N3b3JkcyBhbmQgd2lwaW5nIHRoZSBkZXZpY2UsIGFuZCByZXF1aXJlcwogICAgICAqIHRoYXQgeW91IHJlcXVlc3QgYm90aCB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1dBVENIX0xPR0lOfSBhbmQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1dJUEVfREFUQX19LgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VG8gaW1wbGVtZW50IGFueSBvdGhlciBwb2xpY3kgKGUuZy4gd2lwaW5nIGRhdGEgZm9yIGEgcGFydGljdWxhcgogICAgICAqIGFwcGxpY2F0aW9uIG9ubHksIGVyYXNpbmcgb3IgcmV2b2tpbmcgY3JlZGVudGlhbHMsIG9yIHJlcG9ydGluZyB0aGUKICAgICAgKiBmYWlsdXJlIHRvIGEgc2VydmVyKSwgeW91IHNob3VsZCBpbXBsZW1lbnQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlciNvblBhc3N3b3JkRmFpbGVkKENvbnRleHQsIGFuZHJvaWQuY29udGVudC5JbnRlbnQpfQogICAgICAqIGluc3RlYWQuICBEbyBub3QgdXNlIHRoaXMgQVBJLCBiZWNhdXNlIGlmIHRoZSBtYXhpbXVtIGNvdW50IGlzIHJlYWNoZWQsCiAgICAgICogdGhlIGRldmljZSB3aWxsIGJlIHdpcGVkIGltbWVkaWF0ZWx5LCBhbmQgeW91ciBjYWxsYmFjayB3aWxsIG5vdCBiZSBpbnZva2VkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqIEBwYXJhbSBudW0gVGhlIG51bWJlciBvZiBmYWlsZWQgcGFzc3dvcmQgYXR0ZW1wdHMgYXQgd2hpY2ggcG9pbnQgdGhlCiAgICAgICogZGV2aWNlIHdpbGwgd2lwZSBpdHMgZGF0YS4KQEAgLTM5NCw3ICs3NzksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbWF4aW11bSBudW1iZXIgb2YgbG9naW4gYXR0ZW1wdHMgdGhhdCBhcmUgYWxsb3dlZAogICAgICAqIGJlZm9yZSB0aGUgZGV2aWNlIHdpcGVzIGl0c2VsZiwgZm9yIGFsbCBhZG1pbnMKQEAgLTQxMiwxMyArNzk3LDEzIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogRmxhZyBmb3Ige0BsaW5rICNyZXNldFBhc3N3b3JkfTogZG9uJ3QgYWxsb3cgb3RoZXIgYWRtaW5zIHRvIGNoYW5nZQogICAgICAqIHRoZSBwYXNzd29yZCBhZ2FpbiB1bnRpbCB0aGUgdXNlciBoYXMgZW50ZXJlZCBpdC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNFVF9QQVNTV09SRF9SRVFVSVJFX0VOVFJZID0gMHgwMDAxOwotICAgIAorCiAgICAgLyoqCiAgICAgICogRm9yY2UgYSBuZXcgZGV2aWNlIHVubG9jayBwYXNzd29yZCAodGhlIHBhc3N3b3JkIG5lZWRlZCB0byBhY2Nlc3MgdGhlCiAgICAgICogZW50aXJlIGRldmljZSwgbm90IGZvciBpbmRpdmlkdWFsIGFjY291bnRzKSBvbiB0aGUgdXNlci4gIFRoaXMgdGFrZXMKQEAgLTQzMSwxMSArODE2LDExIEBACiAgICAgICogdGhhdCB0aGUgcGFzc3dvcmQgbWF5IGJlIGEgc3Ryb25nZXIgcXVhbGl0eSAoY29udGFpbmluZyBhbHBoYW51bWVyaWMKICAgICAgKiBjaGFyYWN0ZXJzIHdoZW4gdGhlIHJlcXVlc3RlZCBxdWFsaXR5IGlzIG9ubHkgbnVtZXJpYyksIGluIHdoaWNoIGNhc2UKICAgICAgKiB0aGUgY3VycmVudGx5IGFjdGl2ZSBxdWFsaXR5IHdpbGwgYmUgaW5jcmVhc2VkIHRvIG1hdGNoLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1JFU0VUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIG5ldyBwYXNzd29yZCBmb3IgdGhlIHVzZXIuCiAgICAgICogQHBhcmFtIGZsYWdzIE1heSBiZSAwIG9yIHtAbGluayAjUkVTRVRfUEFTU1dPUkRfUkVRVUlSRV9FTlRSWX0uCiAgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhc3N3b3JkIHdhcyBhcHBsaWVkLCBvciBmYWxzZSBpZiBpdCBpcwpAQCAtNDUxLDE2ICs4MzYsMTYgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKICAgICAgKiBtYXhpbXVtIHRpbWUgZm9yIHVzZXIgYWN0aXZpdHkgdW50aWwgdGhlIGRldmljZSB3aWxsIGxvY2suICBUaGlzIGxpbWl0cwogICAgICAqIHRoZSBsZW5ndGggdGhhdCB0aGUgdXNlciBjYW4gc2V0LiAgSXQgdGFrZXMgZWZmZWN0IGltbWVkaWF0ZWx5LgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0ZPUkNFX0xPQ0t9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQgd2l0aC4KICAgICAgKiBAcGFyYW0gdGltZU1zIFRoZSBuZXcgZGVzaXJlZCBtYXhpbXVtIHRpbWUgdG8gbG9jayBpbiBtaWxsaXNlY29uZHMuCiAgICAgICogQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uLgpAQCAtNDc0LDcgKzg1OSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBtYXhpbXVtIHRpbWUgdG8gdW5sb2NrIGZvciBhbGwgYWRtaW5zCiAgICAgICogb3IgYSBwYXJ0aWN1bGFyIG9uZS4KQEAgLTQ5MSwxMSArODc2LDExIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogTWFrZSB0aGUgZGV2aWNlIGxvY2sgaW1tZWRpYXRlbHksIGFzIGlmIHRoZSBsb2NrIHNjcmVlbiB0aW1lb3V0IGhhcwogICAgICAqIGV4cGlyZWQgYXQgdGhlIHBvaW50IG9mIHRoaXMgY2FsbC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCiAgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9GT1JDRV9MT0NLfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCkBAIC01MDksMTYgKzg5NCwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQXNrIHRoZSB1c2VyIGRhdGUgYmUgd2lwZWQuICBUaGlzIHdpbGwgY2F1c2UgdGhlIGRldmljZSB0byByZWJvb3QsCiAgICAgICogZXJhc2luZyBhbGwgdXNlciBkYXRhIHdoaWxlIG5leHQgYm9vdGluZyB1cC4gIEV4dGVybmFsIHN0b3JhZ2Ugc3VjaAogICAgICAqIGFzIFNEIGNhcmRzIHdpbGwgbm90IGJlIGVyYXNlZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCiAgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9XSVBFX0RBVEF9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBmbGFncyBCaXQgbWFzayBvZiBhZGRpdGlvbmFsIG9wdGlvbnM6IGN1cnJlbnRseSBtdXN0IGJlIDAuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd2lwZURhdGEoaW50IGZsYWdzKSB7CkBAIC01MzAsNyArOTE1LDkyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQorICAgICAqIGdsb2JhbCBwcm94eSBhbmQgZXhjbHVzaW9uIGxpc3QuCisgICAgICogPHA+CisgICAgICogVGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZfSB0byBiZSBhYmxlIHRvIGNhbGwKKyAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCisgICAgICogT25seSB0aGUgZmlyc3QgZGV2aWNlIGFkbWluIGNhbiBzZXQgdGhlIHByb3h5LiBJZiBhIHNlY29uZCBhZG1pbiBhdHRlbXB0cworICAgICAqIHRvIHNldCB0aGUgcHJveHksIHRoZSB7QGxpbmsgQ29tcG9uZW50TmFtZX0gb2YgdGhlIGFkbWluIG9yaWdpbmFsbHkgc2V0dGluZyB0aGUKKyAgICAgKiBwcm94eSB3aWxsIGJlIHJldHVybmVkLiBJZiBzdWNjZXNzZnVsIGluIHNldHRpbmcgdGhlIHByb3h5LCBudWxsIHdpbGwKKyAgICAgKiBiZSByZXR1cm5lZC4KKyAgICAgKiBUaGUgbWV0aG9kIGNhbiBiZSBjYWxsZWQgcmVwZWF0ZWRseSBieSB0aGUgZGV2aWNlIGFkbWluIGFscmFkeSBzZXR0aW5nIHRoZQorICAgICAqIHByb3h5IHRvIHVwZGF0ZSB0aGUgcHJveHkgYW5kIGV4Y2x1c2lvbiBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gcHJveHlTcGVjIHRoZSBnbG9iYWwgcHJveHkgZGVzaXJlZC4gTXVzdCBiZSBhbiBIVFRQIFByb3h5LgorICAgICAqICAgICAgICAgICAgUGFzcyBQcm94eS5OT19QUk9YWSB0byByZXNldCB0aGUgcHJveHkuCisgICAgICogQHBhcmFtIGV4Y2x1c2lvbkxpc3QgYSBsaXN0IG9mIGRvbWFpbnMgdG8gYmUgZXhjbHVkZWQgZnJvbSB0aGUgZ2xvYmFsIHByb3h5LgorICAgICAqIEByZXR1cm4gcmV0dXJucyBudWxsIGlmIHRoZSBwcm94eSB3YXMgc3VjY2Vzc2Z1bGx5IHNldCwgb3IgYSB7QGxpbmsgQ29tcG9uZW50TmFtZX0KKyAgICAgKiAgICAgICAgICAgIG9mIHRoZSBkZXZpY2UgYWRtaW4gdGhhdCBzZXRzIHRoZXcgcHJveHkgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBDb21wb25lbnROYW1lIHNldEdsb2JhbFByb3h5KENvbXBvbmVudE5hbWUgYWRtaW4sIFByb3h5IHByb3h5U3BlYywKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBleGNsdXNpb25MaXN0ICkgeworICAgICAgICBpZiAocHJveHlTcGVjID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyBob3N0U3BlYzsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZXhjbFNwZWM7CisgICAgICAgICAgICAgICAgaWYgKHByb3h5U3BlYy5lcXVhbHMoUHJveHkuTk9fUFJPWFkpKSB7CisgICAgICAgICAgICAgICAgICAgIGhvc3RTcGVjID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZXhjbFNwZWMgPSBudWxsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcHJveHlTcGVjLnR5cGUoKS5lcXVhbHMoUHJveHkuVHlwZS5IVFRQKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHNhID0gKEluZXRTb2NrZXRBZGRyZXNzKXByb3h5U3BlYy5hZGRyZXNzKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBob3N0TmFtZSA9IHNhLmdldEhvc3ROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGludCBwb3J0ID0gc2EuZ2V0UG9ydCgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGhvc3RCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaG9zdFNwZWMgPSBob3N0QnVpbGRlci5hcHBlbmQoaG9zdE5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCI6IikuYXBwZW5kKEludGVnZXIudG9TdHJpbmcocG9ydCkpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChleGNsdXNpb25MaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2xTcGVjID0gIiI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGxpc3RCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3REb21haW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZXhjbERvbWFpbiA6IGV4Y2x1c2lvbkxpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0RG9tYWluKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RCdWlsZGVyID0gbGlzdEJ1aWxkZXIuYXBwZW5kKCIsIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3REb21haW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEJ1aWxkZXIgPSBsaXN0QnVpbGRlci5hcHBlbmQoZXhjbERvbWFpbi50cmltKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjbFNwZWMgPSBsaXN0QnVpbGRlci50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQubmV0LlByb3h5LnZhbGlkYXRlKGhvc3ROYW1lLCBJbnRlZ2VyLnRvU3RyaW5nKHBvcnQpLCBleGNsU3BlYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5zZXRHbG9iYWxQcm94eShhZG1pbiwgaG9zdFNwZWMsIGV4Y2xTcGVjKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgbmFtZSBzZXR0aW5nIHRoZSBnbG9iYWwgcHJveHkuCisgICAgICogQHJldHVybiBDb21wb25lbnROYW1lIG9iamVjdCBvZiB0aGUgZGV2aWNlIGFkbWluIHRoYXQgc2V0IHRoZSBnbG9iYWwgcHJveHksIG9yCisgICAgICogICAgICAgICAgICBudWxsIGlmIG5vIGFkbWluIGhhcyBzZXQgdGhlIHByb3h5LgorICAgICAqLworICAgIHB1YmxpYyBDb21wb25lbnROYW1lIGdldEdsb2JhbFByb3h5QWRtaW4oKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRHbG9iYWxQcm94eUFkbWluKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTU0Myw3ICsxMDEzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC01NTYsMTAgKzEwMjYsMTAgQEAKICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byByZXRyaWV2ZSBkZXZpY2UgcG9saWN5ICIgKyBjbiwgZSk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBSZXNvbHZlSW5mbyByaSA9IG5ldyBSZXNvbHZlSW5mbygpOwogICAgICAgICByaS5hY3Rpdml0eUluZm8gPSBhaTsKLSAgICAgICAgCisKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiBuZXcgRGV2aWNlQWRtaW5JbmZvKG1Db250ZXh0LCByaSk7CiAgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgewpAQCAtNTcwLDcgKzEwNDAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwpAQCAtNTg3LDE2ICsxMDU3LDE4IEBACiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoKSB7CisgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShpbnQgcXVhbGl0eSwgaW50IGxlbmd0aCwgaW50IGxldHRlcnMsIGludCB1cHBlcmNhc2UsCisgICAgICAgICAgICBpbnQgbG93ZXJjYXNlLCBpbnQgbnVtYmVycywgaW50IHN5bWJvbHMsIGludCBub25sZXR0ZXIpIHsKICAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShxdWFsaXR5LCBsZW5ndGgpOworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUocXVhbGl0eSwgbGVuZ3RoLCBsZXR0ZXJzLCB1cHBlcmNhc2UsIGxvd2VyY2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcnMsIHN5bWJvbHMsIG5vbmxldHRlcik7CiAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwpAQCAtNjA5LDcgKzEwODEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTYyMiw0ICsxMDk0LDUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0lEZXZpY2VQb2xpY3lNYW5hZ2VyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vSURldmljZVBvbGljeU1hbmFnZXIuYWlkbAppbmRleCA2ZmM0ZGM1Li4zZmNkNmZjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vSURldmljZVBvbGljeU1hbmFnZXIuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vSURldmljZVBvbGljeU1hbmFnZXIuYWlkbApAQCAtMjcsMTAgKzI3LDMxIEBACiBpbnRlcmZhY2UgSURldmljZVBvbGljeU1hbmFnZXIgewogICAgIHZvaWQgc2V0UGFzc3dvcmRRdWFsaXR5KGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgcXVhbGl0eSk7CiAgICAgaW50IGdldFBhc3N3b3JkUXVhbGl0eShpbiBDb21wb25lbnROYW1lIHdobyk7Ci0gICAgCisKICAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxlbmd0aChpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CiAgICAgaW50IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChpbiBDb21wb25lbnROYW1lIHdobyk7CisKKyAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShpbiBDb21wb25lbnROYW1lIHdobyk7CisKKyAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShpbiBDb21wb25lbnROYW1lIHdobyk7CisKKyAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxldHRlcnMoaW4gQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpOworICAgIGludCBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkTWluaW11bU51bWVyaWMoaW4gQ29tcG9uZW50TmFtZSB3aG8pOworCisgICAgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhpbiBDb21wb25lbnROYW1lIHdobyk7CisKKyAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihpbiBDb21wb25lbnROYW1lIHdobyk7CiAgICAgCisgICAgdm9pZCBzZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoaW4gQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpOworICAgIGludCBnZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoaW4gQ29tcG9uZW50TmFtZSB3aG8pOworCiAgICAgYm9vbGVhbiBpc0FjdGl2ZVBhc3N3b3JkU3VmZmljaWVudCgpOwogICAgIGludCBnZXRDdXJyZW50RmFpbGVkUGFzc3dvcmRBdHRlbXB0cygpOwogICAgIApAQCAtNDUsNiArNjYsOSBAQAogICAgIHZvaWQgbG9ja05vdygpOwogICAgIAogICAgIHZvaWQgd2lwZURhdGEoaW50IGZsYWdzKTsKKworICAgIENvbXBvbmVudE5hbWUgc2V0R2xvYmFsUHJveHkoaW4gQ29tcG9uZW50TmFtZSBhZG1pbiwgU3RyaW5nIHByb3h5U3BlYywgU3RyaW5nIGV4Y2x1c2lvbkxpc3QpOworICAgIENvbXBvbmVudE5hbWUgZ2V0R2xvYmFsUHJveHlBZG1pbigpOwogICAgIAogICAgIHZvaWQgc2V0QWN0aXZlQWRtaW4oaW4gQ29tcG9uZW50TmFtZSBwb2xpY3lSZWNlaXZlcik7CiAgICAgYm9vbGVhbiBpc0FkbWluQWN0aXZlKGluIENvbXBvbmVudE5hbWUgcG9saWN5UmVjZWl2ZXIpOwpAQCAtNTMsNyArNzcsOCBAQAogICAgIHZvaWQgZ2V0UmVtb3ZlV2FybmluZyhpbiBDb21wb25lbnROYW1lIHBvbGljeVJlY2VpdmVyLCBpbiBSZW1vdGVDYWxsYmFjayByZXN1bHQpOwogICAgIHZvaWQgcmVtb3ZlQWN0aXZlQWRtaW4oaW4gQ29tcG9uZW50TmFtZSBwb2xpY3lSZWNlaXZlcik7CiAgICAgCi0gICAgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoKTsKKyAgICB2b2lkIHNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoaW50IHF1YWxpdHksIGludCBsZW5ndGgsIGludCBsZXR0ZXJzLCBpbnQgdXBwZXJjYXNlLCBpbnQgbG93ZXJjYXNlLAorICAgICAgICBpbnQgbnVtYmVycywgaW50IHN5bWJvbHMsIGludCBub25sZXR0ZXIpOwogICAgIHZvaWQgcmVwb3J0RmFpbGVkUGFzc3dvcmRBdHRlbXB0KCk7CiAgICAgdm9pZCByZXBvcnRTdWNjZXNzZnVsUGFzc3dvcmRBdHRlbXB0KCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3QuamF2YQppbmRleCBiMmZjMTNmLi43NzMwOTQyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0LmphdmEKQEAgLTM5LDYgKzM5LDcgQEAKIAogICAgIHN0YXRpYyBmaW5hbCBpbnQgSEFORExFX1VQREFURSA9IDE7CiAgICAgc3RhdGljIGZpbmFsIGludCBIQU5ETEVfUFJPVklERVJfQ0hBTkdFRCA9IDI7CisgICAgc3RhdGljIGZpbmFsIGludCBIQU5ETEVfVklFV19EQVRBX0NIQU5HRUQgPSAzOwogCiAgICAgZmluYWwgc3RhdGljIE9iamVjdCBzU2VydmljZUxvY2sgPSBuZXcgT2JqZWN0KCk7CiAgICAgc3RhdGljIElBcHBXaWRnZXRTZXJ2aWNlIHNTZXJ2aWNlOwpAQCAtNjAsNiArNjEsMTMgQEAKICAgICAgICAgICAgIG1zZy5vYmogPSBpbmZvOwogICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwogICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlld0RhdGFDaGFuZ2VkKGludCBhcHBXaWRnZXRJZCwgaW50IHZpZXdJZCkgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKEhBTkRMRV9WSUVXX0RBVEFfQ0hBTkdFRCk7CisgICAgICAgICAgICBtc2cuYXJnMSA9IGFwcFdpZGdldElkOworICAgICAgICAgICAgbXNnLmFyZzIgPSB2aWV3SWQ7CisgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBjbGFzcyBVcGRhdGVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CkBAIC03Nyw2ICs4NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICBvblByb3ZpZGVyQ2hhbmdlZChtc2cuYXJnMSwgKEFwcFdpZGdldFByb3ZpZGVySW5mbyltc2cub2JqKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgSEFORExFX1ZJRVdfREFUQV9DSEFOR0VEOiB7CisgICAgICAgICAgICAgICAgICAgIHZpZXdEYXRhQ2hhbmdlZChtc2cuYXJnMSwgbXNnLmFyZzIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yNTAsNiArMjYyLDE2IEBACiAgICAgICAgICAgICB2LnVwZGF0ZUFwcFdpZGdldCh2aWV3cyk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICB2b2lkIHZpZXdEYXRhQ2hhbmdlZChpbnQgYXBwV2lkZ2V0SWQsIGludCB2aWV3SWQpIHsKKyAgICAgICAgQXBwV2lkZ2V0SG9zdFZpZXcgdjsKKyAgICAgICAgc3luY2hyb25pemVkIChtVmlld3MpIHsKKyAgICAgICAgICAgIHYgPSBtVmlld3MuZ2V0KGFwcFdpZGdldElkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICAgICAgICB2LnZpZXdEYXRhQ2hhbmdlZCh2aWV3SWQpOworICAgICAgICB9CisgICAgfQogfQogCiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3RWaWV3LmphdmEKaW5kZXggYjMzYjA5Ny4uNGY4ZWU5MyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3RWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3RWaWV3LmphdmEKQEAgLTIzLDE1ICsyMywxOCBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwpAQCAtMjU4LDYgKzI2MSwyMiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFByb2Nlc3MgZGF0YS1jaGFuZ2VkIG5vdGlmaWNhdGlvbnMgZm9yIHRoZSBzcGVjaWZpZWQgdmlldyBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogc2V0IG9mIHtAbGluayBSZW1vdGVWaWV3c30gdmlld3MuCisgICAgICovCisgICAgdm9pZCB2aWV3RGF0YUNoYW5nZWQoaW50IHZpZXdJZCkgeworICAgICAgICBWaWV3IHYgPSBmaW5kVmlld0J5SWQodmlld0lkKTsKKyAgICAgICAgaWYgKCh2ICE9IG51bGwpICYmICh2IGluc3RhbmNlb2YgQWRhcHRlclZpZXc8Pz4pKSB7CisgICAgICAgICAgICBBZGFwdGVyVmlldzw/PiBhZGFwdGVyVmlldyA9IChBZGFwdGVyVmlldzw/PikgdjsKKyAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IGFkYXB0ZXJWaWV3LmdldEFkYXB0ZXIoKTsKKyAgICAgICAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgQmFzZUFkYXB0ZXIpIHsKKyAgICAgICAgICAgICAgICBCYXNlQWRhcHRlciBiYXNlQWRhcHRlciA9IChCYXNlQWRhcHRlcikgYWRhcHRlcjsKKyAgICAgICAgICAgICAgICBiYXNlQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQnVpbGQgYSB7QGxpbmsgQ29udGV4dH0gY2xvbmVkIGludG8gYW5vdGhlciBwYWNrYWdlIG5hbWUsIHVzdWFsbHkgZm9yIHRoZQogICAgICAqIHB1cnBvc2VzIG9mIHJlYWRpbmcgcmVtb3RlIHJlc291cmNlcy4KICAgICAgKi8KQEAgLTI3NSw2ICsyOTQsNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gZHJhd0NoaWxkKENhbnZhcyBjYW52YXMsIFZpZXcgY2hpbGQsIGxvbmcgZHJhd2luZ1RpbWUpIHsKICAgICAgICAgaWYgKENST1NTRkFERSkgewogICAgICAgICAgICAgaW50IGFscGhhOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRNYW5hZ2VyLmphdmEKaW5kZXggZDJhYjg1ZS4uMmE1ODNjMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldE1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0TWFuYWdlci5qYXZhCkBAIC0yMzMsNiArMjMzLDEwIEBACiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBSZW1vdGVWaWV3cyB0byB1c2UgZm9yIHRoZSBzcGVjaWZpZWQgYXBwV2lkZ2V0SWRzLgogICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoZSBSZW1vdGVWaWV3cyBwYXJhbWV0ZXIgd2lsbCBiZSBjYWNoZWQgYnkgdGhlIEFwcFdpZGdldFNlcnZpY2UsIGFuZCBoZW5jZSBzaG91bGQKKyAgICAgKiBjb250YWluIGEgY29tcGxldGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHdpZGdldC4gRm9yIHBlcmZvcm1pbmcgcGFydGlhbCB3aWRnZXQgdXBkYXRlcywgc2VlCisgICAgICoge0BsaW5rICNwYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXQoaW50W10sIFJlbW90ZVZpZXdzKX0uCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBJdCBpcyBva2F5IHRvIGNhbGwgdGhpcyBtZXRob2QgYm90aCBpbnNpZGUgYW4ge0BsaW5rICNBQ1RJT05fQVBQV0lER0VUX1VQREFURX0gYnJvYWRjYXN0LAogICAgICAqIGFuZCBvdXRzaWRlIG9mIHRoZSBoYW5kbGVyLgpAQCAtMjUzLDYgKzI1NywxMCBAQAogICAgIC8qKgogICAgICAqIFNldCB0aGUgUmVtb3RlVmlld3MgdG8gdXNlIGZvciB0aGUgc3BlY2lmaWVkIGFwcFdpZGdldElkLgogICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoZSBSZW1vdGVWaWV3cyBwYXJhbWV0ZXIgd2lsbCBiZSBjYWNoZWQgYnkgdGhlIEFwcFdpZGdldFNlcnZpY2UsIGFuZCBoZW5jZSBzaG91bGQKKyAgICAgKiBjb250YWluIGEgY29tcGxldGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHdpZGdldC4gRm9yIHBlcmZvcm1pbmcgcGFydGlhbCB3aWRnZXQgdXBkYXRlcywgc2VlCisgICAgICoge0BsaW5rICNwYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXQoaW50LCBSZW1vdGVWaWV3cyl9LgorICAgICAqCiAgICAgICogPHA+CiAgICAgICogSXQgaXMgb2theSB0byBjYWxsIHRoaXMgbWV0aG9kIGJvdGggaW5zaWRlIGFuIHtAbGluayAjQUNUSU9OX0FQUFdJREdFVF9VUERBVEV9IGJyb2FkY2FzdCwKICAgICAgKiBhbmQgb3V0c2lkZSBvZiB0aGUgaGFuZGxlci4KQEAgLTI2Niw2ICsyNzQsNTkgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBQZXJmb3JtIGFuIGluY3JlbWVudGFsIHVwZGF0ZSBvciBjb21tYW5kIG9uIHRoZSB3aWRnZXQocykgc3BlY2lmaWVkIGJ5IGFwcFdpZGdldElkcy4KKyAgICAgKgorICAgICAqIFRoaXMgdXBkYXRlICBkaWZmZXJzIGZyb20ge0BsaW5rICN1cGRhdGVBcHBXaWRnZXQoaW50W10sIFJlbW90ZVZpZXdzKX0gaW4gdGhhdCB0aGUKKyAgICAgKiBSZW1vdGVWaWV3cyBvYmplY3Qgd2hpY2ggaXMgcGFzc2VkIGlzIHVuZGVyc3Rvb2QgdG8gYmUgYW4gaW5jb21wbGV0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgCisgICAgICogd2lkZ2V0LCBhbmQgaGVuY2UgaXMgbm90IGNhY2hlZCBieSB0aGUgQXBwV2lkZ2V0U2VydmljZS4gTm90ZSB0aGF0IGJlY2F1c2UgdGhlc2UgdXBkYXRlcyBhcmUgCisgICAgICogbm90IGNhY2hlZCwgYW55IHN0YXRlIHRoYXQgdGhleSBtb2RpZnkgdGhhdCBpcyBub3QgcmVzdG9yZWQgYnkgcmVzdG9yZUluc3RhbmNlU3RhdGUgd2lsbCBub3QKKyAgICAgKiBwZXJzaXN0IGluIHRoZSBjYXNlIHRoYXQgdGhlIHdpZGdldHMgYXJlIHJlc3RvcmVkIHVzaW5nIHRoZSBjYWNoZWQgdmVyc2lvbiBpbgorICAgICAqIEFwcFdpZGdldFNlcnZpY2UuCisgICAgICoKKyAgICAgKiBVc2Ugd2l0aCB7QGxpbmsgUmVtb3RlVmlld3Mjc2hvd05leHQoaW50KX0sIHtAbGluayBSZW1vdGVWaWV3cyNzaG93UHJldmlvdXMoaW50KX0sCisgICAgICoge0BsaW5rIFJlbW90ZVZpZXdzI3NldFNjcm9sbFBvc2l0aW9uKGludCwgaW50KX0gYW5kIHNpbWlsYXIgY29tbWFuZHMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBva2F5IHRvIGNhbGwgdGhpcyBtZXRob2QgYm90aCBpbnNpZGUgYW4ge0BsaW5rICNBQ1RJT05fQVBQV0lER0VUX1VQREFURX0gYnJvYWRjYXN0LAorICAgICAqIGFuZCBvdXRzaWRlIG9mIHRoZSBoYW5kbGVyLgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgb25seSB3b3JrIHdoZW4gY2FsbGVkIGZyb20gdGhlIHVpZCB0aGF0IG93bnMgdGhlIEFwcFdpZGdldCBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBXaWRnZXRJZHMgICAgIFRoZSBBcHBXaWRnZXQgaW5zdGFuY2VzIGZvciB3aGljaCB0byBzZXQgdGhlIFJlbW90ZVZpZXdzLgorICAgICAqIEBwYXJhbSB2aWV3cyAgICAgICAgICAgIFRoZSBSZW1vdGVWaWV3cyBvYmplY3QgY29udGFpbmluZyB0aGUgaW5jcmVtZW50YWwgdXBkYXRlIC8gY29tbWFuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXQoaW50W10gYXBwV2lkZ2V0SWRzLCBSZW1vdGVWaWV3cyB2aWV3cykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc1NlcnZpY2UucGFydGlhbGx5VXBkYXRlQXBwV2lkZ2V0SWRzKGFwcFdpZGdldElkcywgdmlld3MpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInN5c3RlbSBzZXJ2ZXIgZGVhZD8iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW4gaW5jcmVtZW50YWwgdXBkYXRlIG9yIGNvbW1hbmQgb24gdGhlIHdpZGdldCBzcGVjaWZpZWQgYnkgYXBwV2lkZ2V0SWQuCisgICAgICoKKyAgICAgKiBUaGlzIHVwZGF0ZSAgZGlmZmVycyBmcm9tIHtAbGluayAjdXBkYXRlQXBwV2lkZ2V0KGludCwgUmVtb3RlVmlld3MpfSBpbiB0aGF0IHRoZSBSZW1vdGVWaWV3cworICAgICAqIG9iamVjdCB3aGljaCBpcyBwYXNzZWQgaXMgdW5kZXJzdG9vZCB0byBiZSBhbiBpbmNvbXBsZXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB3aWRnZXQsIGFuZAorICAgICAqIGhlbmNlIGlzIG5vdCBjYWNoZWQgYnkgdGhlIEFwcFdpZGdldFNlcnZpY2UuIE5vdGUgdGhhdCBiZWNhdXNlIHRoZXNlIHVwZGF0ZXMgYXJlIG5vdCBjYWNoZWQsCisgICAgICogYW55IHN0YXRlIHRoYXQgdGhleSBtb2RpZnkgdGhhdCBpcyBub3QgcmVzdG9yZWQgYnkgcmVzdG9yZUluc3RhbmNlU3RhdGUgd2lsbCBub3QgcGVyc2lzdCBpbgorICAgICAqIHRoZSBjYXNlIHRoYXQgdGhlIHdpZGdldHMgYXJlIHJlc3RvcmVkIHVzaW5nIHRoZSBjYWNoZWQgdmVyc2lvbiBpbiBBcHBXaWRnZXRTZXJ2aWNlLgorICAgICAqCisgICAgICogVXNlIHdpdGgge0BsaW5rIFJlbW90ZVZpZXdzI3Nob3dOZXh0KGludCl9LCB7QGxpbmsgUmVtb3RlVmlld3Mjc2hvd1ByZXZpb3VzKGludCl9LAorICAgICAqIHtAbGluayBSZW1vdGVWaWV3cyNzZXRTY3JvbGxQb3NpdGlvbihpbnQsIGludCl9IGFuZCBzaW1pbGFyIGNvbW1hbmRzLgorICAgICAqCisgICAgICogPHA+CisgICAgICogSXQgaXMgb2theSB0byBjYWxsIHRoaXMgbWV0aG9kIGJvdGggaW5zaWRlIGFuIHtAbGluayAjQUNUSU9OX0FQUFdJREdFVF9VUERBVEV9IGJyb2FkY2FzdCwKKyAgICAgKiBhbmQgb3V0c2lkZSBvZiB0aGUgaGFuZGxlci4KKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgd29yayB3aGVuIGNhbGxlZCBmcm9tIHRoZSB1aWQgdGhhdCBvd25zIHRoZSBBcHBXaWRnZXQgcHJvdmlkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBwV2lkZ2V0SWQgICAgICBUaGUgQXBwV2lkZ2V0IGluc3RhbmNlIGZvciB3aGljaCB0byBzZXQgdGhlIFJlbW90ZVZpZXdzLgorICAgICAqIEBwYXJhbSB2aWV3cyAgICAgICAgICAgIFRoZSBSZW1vdGVWaWV3cyBvYmplY3QgY29udGFpbmluZyB0aGUgaW5jcmVtZW50YWwgdXBkYXRlIC8gY29tbWFuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXQoaW50IGFwcFdpZGdldElkLCBSZW1vdGVWaWV3cyB2aWV3cykgeworICAgICAgICBwYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXQobmV3IGludFtdIHsgYXBwV2lkZ2V0SWQgfSwgdmlld3MpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldCB0aGUgUmVtb3RlVmlld3MgdG8gdXNlIGZvciBhbGwgQXBwV2lkZ2V0IGluc3RhbmNlcyBmb3IgdGhlIHN1cHBsaWVkIEFwcFdpZGdldCBwcm92aWRlci4KICAgICAgKgogICAgICAqIDxwPgpAQCAtMjg4LDExICszNDksNDYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBOb3RpZmllcyB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdmlldyBpbiBhbGwgdGhlIHNwZWNpZmllZCBBcHBXaWRnZXQgaW5zdGFuY2VzCisgICAgICogdG8gaW52YWxpZGF0ZSB0aGVpciBjdXJyZW50bHkgZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBXaWRnZXRJZHMgIFRoZSBBcHBXaWRnZXQgaW5zdGFuY2VzIGZvciB3aGljaCB0byBub3RpZnkgb2YgdmlldyBkYXRhIGNoYW5nZXMuCisgICAgICogQHBhcmFtIHZpZXdJZCAgICAgICAgVGhlIGNvbGxlY3Rpb24gdmlldyBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQoaW50W10gYXBwV2lkZ2V0SWRzLCBpbnQgdmlld0lkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzU2VydmljZS5ub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQoYXBwV2lkZ2V0SWRzLCB2aWV3SWQpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInN5c3RlbSBzZXJ2ZXIgZGVhZD8iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB2aWV3IGluIGFsbCB0aGUgc3BlY2lmaWVkIEFwcFdpZGdldCBpbnN0YW5jZQorICAgICAqIHRvIGludmFsaWRhdGUgaXQncyBjdXJyZW50bHkgZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBXaWRnZXRJZCAgVGhlIEFwcFdpZGdldCBpbnN0YW5jZSBmb3Igd2hpY2ggdG8gbm90aWZ5IG9mIHZpZXcgZGF0YSBjaGFuZ2VzLgorICAgICAqIEBwYXJhbSB2aWV3SWQgICAgICAgIFRoZSBjb2xsZWN0aW9uIHZpZXcgaWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkKGludCBhcHBXaWRnZXRJZCwgaW50IHZpZXdJZCkgeworICAgICAgICBub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQobmV3IGludFtdIHsgYXBwV2lkZ2V0SWQgfSwgdmlld0lkKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSBBcHBXaWRnZXQgcHJvdmlkZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBpbnN0YWxsZWQuCiAgICAgICovCiAgICAgcHVibGljIExpc3Q8QXBwV2lkZ2V0UHJvdmlkZXJJbmZvPiBnZXRJbnN0YWxsZWRQcm92aWRlcnMoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gc1NlcnZpY2UuZ2V0SW5zdGFsbGVkUHJvdmlkZXJzKCk7CisgICAgICAgICAgICBMaXN0PEFwcFdpZGdldFByb3ZpZGVySW5mbz4gcHJvdmlkZXJzID0gc1NlcnZpY2UuZ2V0SW5zdGFsbGVkUHJvdmlkZXJzKCk7CisgICAgICAgICAgICBmb3IgKEFwcFdpZGdldFByb3ZpZGVySW5mbyBpbmZvIDogcHJvdmlkZXJzKSB7CisgICAgICAgICAgICAgICAgLy8gQ29udmVydGluZyBjb21wbGV4IHRvIGRwLgorICAgICAgICAgICAgICAgIGluZm8ubWluV2lkdGggPQorICAgICAgICAgICAgICAgICAgICAgICAgVHlwZWRWYWx1ZS5jb21wbGV4VG9EaW1lbnNpb25QaXhlbFNpemUoaW5mby5taW5XaWR0aCwgbURpc3BsYXlNZXRyaWNzKTsKKyAgICAgICAgICAgICAgICBpbmZvLm1pbkhlaWdodCA9CisgICAgICAgICAgICAgICAgICAgICAgICBUeXBlZFZhbHVlLmNvbXBsZXhUb0RpbWVuc2lvblBpeGVsU2l6ZShpbmZvLm1pbkhlaWdodCwgbURpc3BsYXlNZXRyaWNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnM7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigic3lzdGVtIHNlcnZlciBkZWFkPyIsIGUpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldFByb3ZpZGVySW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldFByb3ZpZGVySW5mby5qYXZhCmluZGV4IGNlZTI4NjUuLjM5NmU5MmQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRQcm92aWRlckluZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0UHJvdmlkZXJJbmZvLmphdmEKQEAgLTExMCw2ICsxMTAsMTcgQEAKICAgICAgKiBAaGlkZSBQZW5kaW5nIEFQSSBhcHByb3ZhbAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgb2xkTmFtZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBIHByZXZpZXcgb2Ygd2hhdCB0aGUgQXBwV2lkZ2V0IHdpbGwgbG9vayBsaWtlIGFmdGVyIGl0J3MgY29uZmlndXJlZC4KKyAgICAgKiBJZiBub3Qgc3VwcGxpZWQsIHRoZSBBcHBXaWRnZXQncyBpY29uIHdpbGwgYmUgdXNlZC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPmFuZHJvaWQ6cHJldmlld0ltYWdlPC9jb2RlPiBhdHRyaWJ1dGUgaW4KKyAgICAgKiB0aGUgPGNvZGU+Jmx0O3JlY2VpdmVyJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgQW5kcm9pZE1hbmlmZXN0LnhtbCBmaWxlLgorICAgICAqIAorICAgICAqIEBoaWRlIFBlbmRpbmcgQVBJIGFwcHJvdmFsCisgICAgICovCisJcHVibGljIGludCBwcmV2aWV3SW1hZ2U7CiAKICAgICBwdWJsaWMgQXBwV2lkZ2V0UHJvdmlkZXJJbmZvKCkgewogICAgIH0KQEAgLTEzMCw2ICsxNDEsNyBAQAogICAgICAgICB9CiAgICAgICAgIHRoaXMubGFiZWwgPSBpbi5yZWFkU3RyaW5nKCk7CiAgICAgICAgIHRoaXMuaWNvbiA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgdGhpcy5wcmV2aWV3SW1hZ2UgPSBpbi5yZWFkSW50KCk7CiAgICAgfQogCiAKQEAgLTE1Miw2ICsxNjQsNyBAQAogICAgICAgICB9CiAgICAgICAgIG91dC53cml0ZVN0cmluZyh0aGlzLmxhYmVsKTsKICAgICAgICAgb3V0LndyaXRlSW50KHRoaXMuaWNvbik7CisgICAgICAgIG91dC53cml0ZUludCh0aGlzLnByZXZpZXdJbWFnZSk7CiAgICAgfQogCiAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aENsYXNzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ2xhc3MuamF2YQppbmRleCBjN2ZlYTllLi5jODM4MWM5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ2xhc3MuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ2xhc3MuamF2YQpAQCAtMjU5LDYgKzI1OSwxMiBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0ZJTEVfQTJEUCA9IDE7CiAgICAgLyoqIEBoaWRlICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9PUFAgPSAyOworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0ZJTEVfSElEID0gMzsKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9GSUxFX1BBTlUgPSA0OworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0ZJTEVfTkFQID0gNTsKIAogICAgIC8qKgogICAgICAqIENoZWNrIGNsYXNzIGJpdHMgZm9yIHBvc3NpYmxlIGJsdWV0b290aCBwcm9maWxlIHN1cHBvcnQuCkBAIC0zMjQsNiArMzMwLDE0IEBACiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gUFJPRklMRV9ISUQpIHsKKyAgICAgICAgICAgIHJldHVybiAoZ2V0RGV2aWNlQ2xhc3MoKSAmIERldmljZS5NYWpvci5QRVJJUEhFUkFMKSA9PSBEZXZpY2UuTWFqb3IuUEVSSVBIRVJBTDsKKyAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlID09IFBST0ZJTEVfUEFOVSB8fCBwcm9maWxlID09IFBST0ZJTEVfTkFQKXsKKyAgICAgICAgICAgIC8vIE5vIGdvb2Qgd2F5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIHR3bywgYmFzZWQgb24gY2xhc3MgYml0cy4KKyAgICAgICAgICAgIGlmIChoYXNTZXJ2aWNlKFNlcnZpY2UuTkVUV09SS0lORykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoZ2V0RGV2aWNlQ2xhc3MoKSAmIERldmljZS5NYWpvci5ORVRXT1JLSU5HKSA9PSBEZXZpY2UuTWFqb3IuTkVUV09SS0lORzsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZVBpY2tlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZVBpY2tlci5qYXZhCmluZGV4IDA1ZWVkMGUuLjc0MTU3MjEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhEZXZpY2VQaWNrZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUGlja2VyLmphdmEKQEAgLTYzLDQgKzYzLDkgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxURVJfVFlQRV9BVURJTyA9IDE7CiAgICAgLyoqIEFzayBkZXZpY2UgcGlja2VyIHRvIHNob3cgQlQgZGV2aWNlcyB0aGF0IHN1cHBvcnQgT2JqZWN0IFRyYW5zZmVyICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMVEVSX1RZUEVfVFJBTlNGRVIgPSAyOworICAgIC8qKiBBc2sgZGV2aWNlIHBpY2tlciB0byBzaG93IEJUIGRldmljZXMgdGhhdCBzdXBwb3J0CisgICAgICogUGVyc29uYWwgQXJlYSBOZXR3b3JraW5nIFVzZXIgKFBBTlUpIHByb2ZpbGUqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTFRFUl9UWVBFX1BBTlUgPSAzOworICAgIC8qKiBBc2sgZGV2aWNlIHBpY2tlciB0byBzaG93IEJUIGRldmljZXMgdGhhdCBzdXBwb3J0IE5ldHdvcmsgQWNjZXNzIFBvaW50IChOQVApIHByb2ZpbGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxURVJfVFlQRV9OQVAgPSA0OwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZS5qYXZhCmluZGV4IDhlNjU1ZTIuLjFmZDcxNTEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLmphdmEKQEAgLTU4LDE5ICs1OCwyNCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7IC8vU1RPUFNISVAgLSBDaGFuZ2UgdG8gZmFsc2UKIAorICAgIC8vIFRPRE8oKTogUmVzdHJ1Y3R1cmUgdGhlIHN0YXRlIG1hY2hpbmUgdG8gbWFrZSBpdCBzY2FsYWJsZSB3aXRoIHJlZ2FyZCB0byBwcm9maWxlcy4KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0hGUF9PVVRHT0lORyA9IDE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9IRlBfSU5DT01JTkcgPSAyOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfQTJEUF9PVVRHT0lORyA9IDM7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9BMkRQX0lOQ09NSU5HID0gNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0hJRF9PVVRHT0lORyA9IDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9ISURfSU5DT01JTkcgPSA2OwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9IRlBfT1VUR09JTkcgPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0hGUF9JTkNPTUlORyA9IDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9BMkRQX09VVEdPSU5HID0gNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0EyRFBfSU5DT01JTkcgPSA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfSEZQX09VVEdPSU5HID0gNTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfSEZQX0lOQ09NSU5HID0gNTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9BMkRQX09VVEdPSU5HID0gNTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HID0gNTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9ISURfT1VUR09JTkcgPSA1NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0hJRF9JTkNPTUlORyA9IDU1OwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5QQUlSID0gOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVVRPX0NPTk5FQ1RfUFJPRklMRVMgPSAxMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU0lUSU9OX1RPX1NUQUJMRSA9IDExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOUEFJUiA9IDEwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVVRPX0NPTk5FQ1RfUFJPRklMRVMgPSAxMDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNJVElPTl9UT19TVEFCTEUgPSAxMDI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVVUT19DT05ORUNUX0RFTEFZID0gNjAwMDsgLy8gNiBzZWNzCiAKQEAgLTc5LDYgKzg0LDggQEAKICAgICBwcml2YXRlIEluY29taW5nSGFuZHNmcmVlIG1JbmNvbWluZ0hhbmRzZnJlZSA9IG5ldyBJbmNvbWluZ0hhbmRzZnJlZSgpOwogICAgIHByaXZhdGUgSW5jb21pbmdBMmRwIG1JbmNvbWluZ0EyZHAgPSBuZXcgSW5jb21pbmdBMmRwKCk7CiAgICAgcHJpdmF0ZSBPdXRnb2luZ0EyZHAgbU91dGdvaW5nQTJkcCA9IG5ldyBPdXRnb2luZ0EyZHAoKTsKKyAgICBwcml2YXRlIE91dGdvaW5nSGlkIG1PdXRnb2luZ0hpZCA9IG5ldyBPdXRnb2luZ0hpZCgpOworICAgIHByaXZhdGUgSW5jb21pbmdIaWQgbUluY29taW5nSGlkID0gbmV3IEluY29taW5nSGlkKCk7CiAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CiAgICAgcHJpdmF0ZSBCbHVldG9vdGhTZXJ2aWNlIG1TZXJ2aWNlOwpAQCAtODksNiArOTYsNyBAQAogICAgIHByaXZhdGUgQmx1ZXRvb3RoRGV2aWNlIG1EZXZpY2U7CiAgICAgcHJpdmF0ZSBpbnQgbUhlYWRzZXRTdGF0ZTsKICAgICBwcml2YXRlIGludCBtQTJkcFN0YXRlOworICAgIHByaXZhdGUgaW50IG1IaWRTdGF0ZTsKIAogICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbUJyb2FkY2FzdFJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewogICAgICAgICBAT3ZlcnJpZGUKQEAgLTEyNSw2ICsxMzMsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNURUQpIHsKICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoVFJBTlNJVElPTl9UT19TVEFCTEUpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhJbnB1dERldmljZS5BQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgaW50IG5ld1N0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aElucHV0RGV2aWNlLkVYVFJBX0lOUFVUX0RFVklDRV9TVEFURSwgMCk7CisgICAgICAgICAgICAgICAgaW50IG9sZFN0YXRlID0KKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aElucHV0RGV2aWNlLkVYVFJBX1BSRVZJT1VTX0lOUFVUX0RFVklDRV9TVEFURSwgMCk7CisgICAgICAgICAgICAgICAgbUhpZFN0YXRlID0gbmV3U3RhdGU7CisgICAgICAgICAgICAgICAgaWYgKG9sZFN0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RFRCAmJgorICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoRElTQ09OTkVDVF9ISURfSU5DT01JTkcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEIHx8CisgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aERldmljZS5BQ1RJT05fQUNMX0NPTk5FQ1RFRCkpIHsKICAgICAgICAgICAgICAgICBpZiAoIWdldEN1cnJlbnRTdGF0ZSgpLmVxdWFscyhtQm9uZGVkRGV2aWNlKSkgewogICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTdGF0ZSBpczogIiArIGdldEN1cnJlbnRTdGF0ZSgpKTsKQEAgLTE2NSw2ICsxODYsOCBAQAogICAgICAgICBhZGRTdGF0ZShtSW5jb21pbmdIYW5kc2ZyZWUpOwogICAgICAgICBhZGRTdGF0ZShtSW5jb21pbmdBMmRwKTsKICAgICAgICAgYWRkU3RhdGUobU91dGdvaW5nQTJkcCk7CisgICAgICAgIGFkZFN0YXRlKG1PdXRnb2luZ0hpZCk7CisgICAgICAgIGFkZFN0YXRlKG1JbmNvbWluZ0hpZCk7CiAgICAgICAgIHNldEluaXRpYWxTdGF0ZShtQm9uZGVkRGV2aWNlKTsKIAogICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwpAQCAtMTcyLDYgKzE5NSw3IEBACiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoQTJkcC5BQ1RJT05fU0lOS19TVEFURV9DSEFOR0VEKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9TVEFURV9DSEFOR0VEKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0FDTF9DT05ORUNURUQpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCk7CiAKICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtQnJvYWRjYXN0UmVjZWl2ZXIsIGZpbHRlcik7CiAKQEAgLTIyNCw2ICsyNDgsMTQgQEAKICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfQTJEUF9JTkNPTUlORzoKICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmNvbWluZ0EyZHApOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtT3V0Z29pbmdIaWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSW5jb21pbmdIaWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKICAgICAgICAgICAgICAgICAgICAgaWYgKG1IZWFkc2V0U3RhdGUgIT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKERJU0NPTk5FQ1RfSEZQX09VVEdPSU5HKTsKQEAgLTIzMyw2ICsyNjUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKERJU0NPTk5FQ1RfQTJEUF9PVVRHT0lORyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtSGlkU3RhdGUgIT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShESVNDT05ORUNUX0hJRF9PVVRHT0lORyk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZChVTlBBSVIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI1NCw2ICsyOTAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwU2VydmljZS5nZXRDb25uZWN0ZWRTaW5rcygpLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBTZXJ2aWNlLmNvbm5lY3RTaW5rKG1EZXZpY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZXJ2aWNlLmdldElucHV0RGV2aWNlUHJpb3JpdHkobURldmljZSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX0FVVE9fQ09OTkVDVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLmNvbm5lY3RJbnB1dERldmljZShtRGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFRSQU5TSVRJT05fVE9fU1RBQkxFOgpAQCAtMzQyLDYgKzM4MiwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UoZGVmZXJNc2cpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUluY29taW5nSGlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTXNnLndoYXQgPSBtQ29tbWFuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShkZWZlck1zZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTXNnLndoYXQgPSBtQ29tbWFuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShkZWZlck1zZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGlnbm9yZQogICAgICAgICAgICAgICAgIGNhc2UgVU5QQUlSOgogICAgICAgICAgICAgICAgIGNhc2UgQVVUT19DT05ORUNUX1BST0ZJTEVTOgogICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CkBAIC00MDksNiArNDY2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgY2F1c2VzIGluY29taW5nIEhGUCB0byBmYWlsLCBpdCBpcyBtb3JlIG9mIGEgaGVhZHNldCBwcm9ibGVtCiAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIGJvdGggY29ubmVjdGlvbnMgYXJlIGluY29taW5nIG9uZXMuCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gaWdub3JlCiAgICAgICAgICAgICAgICAgY2FzZSBVTlBBSVI6CiAgICAgICAgICAgICAgICAgY2FzZSBBVVRPX0NPTk5FQ1RfUFJPRklMRVM6CiAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKQEAgLTQ5Niw2ICs1NjAsMjMgQEAKICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfQTJEUF9JTkNPTUlORzoKICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlLCB3aWxsIGJlIGhhbmRsZWQgYnkgQmx1ZXoKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSW5jb21pbmdIaWQpOworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNc2cud2hhdCA9IG1Db21tYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKGRlZmVyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNc2cud2hhdCA9IG1Db21tYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKGRlZmVyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gaWdub3JlCiAgICAgICAgICAgICAgICAgY2FzZSBVTlBBSVI6CiAgICAgICAgICAgICAgICAgY2FzZSBBVVRPX0NPTk5FQ1RfUFJPRklMRVM6CiAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKQEAgLTU2MSw2ICs2NDIsMTMgQEAKICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfQTJEUF9JTkNPTUlORzoKICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlLCB3aWxsIGJlIGhhbmRsZWQgYnkgQmx1ZXoKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBpZ25vcmUKICAgICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKICAgICAgICAgICAgICAgICBjYXNlIEFVVE9fQ09OTkVDVF9QUk9GSUxFUzoKICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwpAQCAtNTc2LDYgKzY2NCwxNDMgQEAKICAgICB9CiAKIAorICAgIHByaXZhdGUgY2xhc3MgT3V0Z29pbmdIaWQgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhdHVzID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgaW50IG1Db21tYW5kOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGxvZygiRW50ZXJpbmcgT3V0Z29pbmdIaWQgc3RhdGUgd2l0aDogIiArIGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdCk7CisgICAgICAgICAgICBtQ29tbWFuZCA9IGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdDsKKyAgICAgICAgICAgIGlmIChtQ29tbWFuZCAhPSBDT05ORUNUX0hJRF9PVVRHT0lORyAmJgorICAgICAgICAgICAgICAgIG1Db21tYW5kICE9IERJU0NPTk5FQ1RfSElEX09VVEdPSU5HKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3I6IE91dGdvaW5nSGlkIHN0YXRlIHdpdGggY29tbWFuZDoiICsgbUNvbW1hbmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0YXR1cyA9IHByb2Nlc3NDb21tYW5kKG1Db21tYW5kKTsKKyAgICAgICAgICAgIGlmICghbVN0YXR1cykgc2VuZE1lc3NhZ2UoVFJBTlNJVElPTl9UT19TVEFCTEUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgbG9nKCJPdXRnb2luZ0hpZCBTdGF0ZS0+UHJvY2Vzc2luZyBNZXNzYWdlOiAiICsgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIE1lc3NhZ2UgZGVmZXJNc2cgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIC8vIGRlZmVyIGFsbCBvdXRnb2luZyBtZXNzYWdlcworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9IRlBfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0EyRFBfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSEZQX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSEZQX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUluY29taW5nSGFuZHNmcmVlKTsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfQTJEUF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmNvbWluZ0EyZHApOworCisgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGNhbmNlbCBISUQgb3V0Z29pbmcgYXMgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIGl0CisgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgZ2V0IGNhbmNlbGVkLgorICAgICAgICAgICAgICAgICAgICAvLyBJdCBtaWdodCBhbHJlYWR5IGJlIGNvbm5lY3RlZCBidXQgd2UgbWlnaHQgbm90IGhhdmUgZ290IHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBJTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFLiBIZW5jZSwgbm8gcG9pbnQgZGlzY29ubmVjdGluZyBoZXJlLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGUgd29yc3QgY2FzZSwgdGhlIGNvbm5lY3Rpb24gd2lsbCBmYWlsLCByZXRyeS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTXNnLndoYXQgPSBtQ29tbWFuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShkZWZlck1zZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgIC8vIEJsdWV6IHdpbGwgdGFrZSBjYXJlIG9mIHRoZSBjb25mbGljdHMKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmNvbWluZ0hpZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hGUF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfQTJEUF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgYXJlIGFscmVhZHkgZGlzY29ubmVjdGVkCisgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggSEZQLiBTb21ldGltZXMgSElEIGNvbm5lY3Rpb24gY2FuCisgICAgICAgICAgICAgICAgICAgIC8vIGZhaWwgZHVlIHRvIHRoZSBkaXNjb25uZWN0aW9uIG9mIEhGUC4gU28gYWRkIGEgcmV0cnkKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBISUQuCisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1zZy53aGF0ID0gbUNvbW1hbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UoZGVmZXJNc2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSwgd2lsbCBiZSBoYW5kbGVkIGJ5IEJsdWV6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBVTlBBSVI6CisgICAgICAgICAgICAgICAgY2FzZSBBVVRPX0NPTk5FQ1RfUFJPRklMRVM6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUUkFOU0lUSU9OX1RPX1NUQUJMRToKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Cb25kZWREZXZpY2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICBwcml2YXRlIGNsYXNzIEluY29taW5nSGlkIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgcHJpdmF0ZSBib29sZWFuIG1TdGF0dXMgPSBmYWxzZTsKKyAgICAgIHByaXZhdGUgaW50IG1Db21tYW5kOworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCB2b2lkIGVudGVyKCkgeworICAgICAgICAgIGxvZygiRW50ZXJpbmcgSW5jb21pbmdIaWQgc3RhdGUgd2l0aDogIiArIGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdCk7CisgICAgICAgICAgbUNvbW1hbmQgPSBnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQ7CisgICAgICAgICAgaWYgKG1Db21tYW5kICE9IENPTk5FQ1RfSElEX0lOQ09NSU5HICYmCisgICAgICAgICAgICAgIG1Db21tYW5kICE9IERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HKSB7CisgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yOiBJbmNvbWluZ0hpZCBzdGF0ZSB3aXRoIGNvbW1hbmQ6IiArIG1Db21tYW5kKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbVN0YXR1cyA9IHByb2Nlc3NDb21tYW5kKG1Db21tYW5kKTsKKyAgICAgICAgICBpZiAoIW1TdGF0dXMpIHNlbmRNZXNzYWdlKFRSQU5TSVRJT05fVE9fU1RBQkxFKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICBsb2coIkluY29taW5nSGlkIFN0YXRlLT5Qcm9jZXNzaW5nIE1lc3NhZ2U6ICIgKyBtZXNzYWdlLndoYXQpOworICAgICAgICAgIE1lc3NhZ2UgZGVmZXJNc2cgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hGUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hGUF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hGUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0EyRFBfSU5DT01JTkc6CisgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9BMkRQX09VVEdPSU5HOgorICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfQTJEUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSEZQX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkbid0IGhhcHBlbiBidXQgaWYgZG9lcywgd2UgY2FuIGhhbmRsZSBpdC4KKyAgICAgICAgICAgICAgICAgIC8vIERlcGVuZHMgaWYgdGhlIGhlYWRzZXQgY2FuIGhhbmRsZSBpdC4KKyAgICAgICAgICAgICAgICAgIC8vIEluY29taW5nIEhJRCB3aWxsIGJlIGhhbmRsZWQgYnkgQmx1ZXosIERpc2Nvbm5lY3QgSEZQCisgICAgICAgICAgICAgICAgICAvLyB0aGUgc29ja2V0IHdvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGNsb3NlZC4KKyAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgLy8gSWdub3JlLCB3aWxsIGJlIGhhbmRsZWQgYnkgQmx1ZXoKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKKyAgICAgICAgICAgICAgY2FzZSBBVVRPX0NPTk5FQ1RfUFJPRklMRVM6CisgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBUUkFOU0lUSU9OX1RPX1NUQUJMRToKKyAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQm9uZGVkRGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgIH0KKyAgfQorCiAKICAgICBzeW5jaHJvbml6ZWQgdm9pZCBjYW5jZWxDb21tYW5kKGludCBjb21tYW5kKSB7CiAgICAgICAgIGlmIChjb21tYW5kID09IENPTk5FQ1RfSEZQX09VVEdPSU5HICkgewpAQCAtNjE5LDYgKzg0NCwxMCBAQAogICAgICAgICAgICAgY2FzZSBDT05ORUNUX0EyRFBfSU5DT01JTkc6CiAgICAgICAgICAgICAgICAgLy8gaWdub3JlLCBCbHVleiB0YWtlcyBjYXJlCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5jb25uZWN0SW5wdXREZXZpY2VJbnRlcm5hbChtRGV2aWNlKTsKKyAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSEZQX09VVEdPSU5HOgogICAgICAgICAgICAgICAgIGlmICghbUhlYWRzZXRTZXJ2aWNlQ29ubmVjdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlZmVySGVhZHNldE1lc3NhZ2UoY29tbWFuZCk7CkBAIC02NDUsNiArODc0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQTJkcFNlcnZpY2UuZGlzY29ubmVjdFNpbmtJbnRlcm5hbChtRGV2aWNlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBpZiAobVNlcnZpY2UuZ2V0SW5wdXREZXZpY2VQcmlvcml0eShtRGV2aWNlKSA9PQorICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9BVVRPX0NPTk5FQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0SW5wdXREZXZpY2VQcmlvcml0eShtRGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9PTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5kaXNjb25uZWN0SW5wdXREZXZpY2VJbnRlcm5hbChtRGV2aWNlKTsKICAgICAgICAgICAgIGNhc2UgVU5QQUlSOgogICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5yZW1vdmVCb25kSW50ZXJuYWwobURldmljZS5nZXRBZGRyZXNzKCkpOwogICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTY1Myw2ICs4OTEsNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisKICAgICAvKnBhY2thZ2UqLyBCbHVldG9vdGhEZXZpY2UgZ2V0RGV2aWNlKCkgewogICAgICAgICByZXR1cm4gbURldmljZTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSGVhZHNldC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEhlYWRzZXQuamF2YQppbmRleCA1M2Q2YTM3Li5iZTIxZDQ2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSGVhZHNldC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhIZWFkc2V0LmphdmEKQEAgLTkwLDYgKzkwLDcgQEAKICAgICAgKiB7QGxpbmsgI0VYVFJBX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0NNRH0sIGFuZAogICAgICAqIHtAbGluayAjRVhUUkFfVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlRfQVJHU30uCiAgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEh9IHRvIHJlY2VpdmUuCisgICAgICogQGhpZGUKICAgICAgKi8KICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVCA9CkBAIC05OCw2ICs5OSw3IEBACiAgICAgLyoqCiAgICAgICogQSBTdHJpbmcgZXh0cmEgZmllbGQgaW4ge0BsaW5rICNBQ1RJT05fVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlR9CiAgICAgICogaW50ZW50cyB0aGF0IGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgY29tbWFuZC4KKyAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0NNRCA9CiAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaGVhZHNldC5leHRyYS5WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVF9DTUQiOwpAQCAtMTA4LDYgKzExMCw3IEBACiAgICAgICogY29tbWFuZC4KICAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmJsdWV0b290aC5vcmcvVGVjaG5pY2FsL0Fzc2lnbmVkTnVtYmVycy9pZGVudGlmaWVycy5odG0iPgogICAgICAqIEJsdWV0b290aCBTSUcgQXNzaWduZWQgTnVtYmVycyAtIENvbXBhbnkgSWRlbnRpZmllcnM8L2E+CisgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVF9DT01QQU5ZX0lEID0KICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LmV4dHJhLlZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0NPTVBBTllfSUQiOwpAQCAtMTE2LDYgKzExOSw3IEBACiAgICAgICogQSBQYXJjZWxhYmxlIFN0cmluZyBhcnJheSBleHRyYSBmaWVsZCBpbgogICAgICAqIHtAbGluayAjQUNUSU9OX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UfSBpbnRlbnRzIHRoYXQgY29udGFpbnMKICAgICAgKiB0aGUgYXJndW1lbnRzIHRvIHRoZSB2ZW5kb3Itc3BlY2lmaWMgY29tbWFuZC4KKyAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0FSR1MgPQogICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXQuZXh0cmEuVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlRfQVJHUyI7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSW5wdXREZXZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhJbnB1dERldmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OTM4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSW5wdXREZXZpY2UuamF2YQpAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQ7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50LlNka0NvbnN0YW50VHlwZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBQdWJsaWMgQVBJIGZvciBjb250cm9sbGluZyB0aGUgQmx1ZXRvb3RoIEhJRCAoSW5wdXQgRGV2aWNlKSBQcm9maWxlCisgKgorICogQmx1ZXRvb3RoSW5wdXREZXZpY2UgaXMgYSBwcm94eSBvYmplY3QgdXNlZCB0byBtYWtlIGNhbGxzIHRvIEJsdWV0b290aCBTZXJ2aWNlCisgKiB3aGljaCBoYW5kbGVzIHRoZSBISUQgcHJvZmlsZS4KKyAqCisgKiBDcmVhdGluZyBhIEJsdWV0b290aElucHV0RGV2aWNlIG9iamVjdCB3aWxsIGluaXRpYXRlIGEgYmluZGluZyB3aXRoIHRoZQorICogQmx1ZXRvb3RoIHNlcnZpY2UuIFVzZXJzIG9mIHRoaXMgb2JqZWN0IHNob3VsZCBjYWxsIGNsb3NlKCkgd2hlbiB0aGV5CisgKiBhcmUgZmluaXNoZWQsIHNvIHRoYXQgdGhpcyBwcm94eSBvYmplY3QgY2FuIHVuYmluZCBmcm9tIHRoZSBzZXJ2aWNlLgorICoKKyAqIEN1cnJlbnRseSB0aGUgQmx1ZXRvb3RoIHNlcnZpY2UgcnVucyBpbiB0aGUgc3lzdGVtIHNlcnZlciBhbmQgdGhpcworICogcHJveHkgb2JqZWN0IHdpbGwgYmUgaW1tZWRpYXRlbHkgYm91bmQgdG8gdGhlIHNlcnZpY2Ugb24gY29uc3RydWN0aW9uLgorICoKKyAqICBAaGlkZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmx1ZXRvb3RoSW5wdXREZXZpY2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmx1ZXRvb3RoSW5wdXREZXZpY2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisKKyAgICAvKiogaW50IGV4dHJhIGZvciBBQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JTlBVVF9ERVZJQ0VfU1RBVEUgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaW5wdXRkZXZpY2UuZXh0cmEuSU5QVVRfREVWSUNFX1NUQVRFIjsKKyAgICAvKiogaW50IGV4dHJhIGZvciBBQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVWSU9VU19JTlBVVF9ERVZJQ0VfU1RBVEUgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaW5wdXRkZXZpY2UuZXh0cmEuUFJFVklPVVNfSU5QVVRfREVWSUNFX1NUQVRFIjsKKworICAgIC8qKiBJbmRpY2F0ZXMgdGhlIHN0YXRlIG9mIGFuIGlucHV0IGRldmljZSBoYXMgY2hhbmdlZC4KKyAgICAgKiBUaGlzIGludGVudCB3aWxsIGFsd2F5cyBjb250YWluIEVYVFJBX0lOUFVUX0RFVklDRV9TVEFURSwKKyAgICAgKiBFWFRSQV9QUkVWSU9VU19JTlBVVF9ERVZJQ0VfU1RBVEUgYW5kIEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UKKyAgICAgKiBleHRyYXMuCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaW5wdXRkZXZpY2UuYWN0aW9uLklOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RFRCA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVElORyAgID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNURUQgICAgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RJTkcgPSAzOworCisgICAgLyoqCisgICAgICogQXV0byBjb25uZWN0aW9uLCBpbmNvbWluZyBhbmQgb3V0Z29pbmcgY29ubmVjdGlvbiBhcmUgYWxsb3dlZCBhdCB0aGlzCisgICAgICogcHJpb3JpdHkgbGV2ZWwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfQVVUT19DT05ORUNUID0gMTAwMDsKKyAgICAvKioKKyAgICAgKiBJbmNvbWluZyBhbmQgb3V0Z29pbmcgY29ubmVjdGlvbiBhcmUgYWxsb3dlZCBhdCB0aGlzIHByaW9yaXR5IGxldmVsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfT04gPSAxMDA7CisgICAgLyoqCisgICAgICogQ29ubmVjdGlvbnMgdG8gdGhlIGRldmljZSBhcmUgbm90IGFsbG93ZWQgYXQgdGhpcyBwcmlvcml0eSBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9PRkYgPSAwOworICAgIC8qKgorICAgICAqIERlZmF1bHQgcHJpb3JpdHkgbGV2ZWwgd2hlbiB0aGUgZGV2aWNlIGlzIHVucGFpcmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX1VOREVGSU5FRCA9IC0xOworCisgICAgcHJpdmF0ZSBmaW5hbCBJQmx1ZXRvb3RoIG1TZXJ2aWNlOworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIEJsdWV0b290aElucHV0RGV2aWNlIHByb3h5IG9iamVjdCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgbG9jYWwKKyAgICAgKiBCbHVldG9vdGggU2VydmljZSB3aGljaCBoYW5kbGUgdGhlIEhJRCBwcm9maWxlLgorICAgICAqIEBwYXJhbSBjIENvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgQmx1ZXRvb3RoSW5wdXREZXZpY2UoQ29udGV4dCBjKSB7CisgICAgICAgIG1Db250ZXh0ID0gYzsKKworICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKEJsdWV0b290aEFkYXB0ZXIuQkxVRVRPT1RIX1NFUlZJQ0UpOworICAgICAgICBpZiAoYiAhPSBudWxsKSB7CisgICAgICAgICAgICBtU2VydmljZSA9IElCbHVldG9vdGguU3R1Yi5hc0ludGVyZmFjZShiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkJsdWV0b290aCBTZXJ2aWNlIG5vdCBhdmFpbGFibGUhIik7CisKKyAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIHdoaWNoIHByZXZlbnRzIHBlb3BsZSBmcm9tIGdvaW5nCisgICAgICAgICAgICAvLyBpbnRvIFdpcmVsZXNzIHNldHRpbmdzIGluIHRoZSBlbXVsYXRvci4gTGV0IGl0IGNyYXNoIGxhdGVyIHdoZW4gaXQgaXMgYWN0dWFsbHkgdXNlZC4KKyAgICAgICAgICAgIG1TZXJ2aWNlID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBJbml0aWF0ZSBhIGNvbm5lY3Rpb24gdG8gYW4gSW5wdXQgZGV2aWNlLgorICAgICAqCisgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBvbiBlcnJvciBhbmQgdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbgorICAgICAqICBhdHRlbXB0IGlzIGJlaW5nIG1hZGUuCisgICAgICoKKyAgICAgKiAgTGlzdGVuIGZvciBJTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRF9BQ1RJT04gdG8gZmluZCBvdXQgd2hlbiB0aGUKKyAgICAgKiAgY29ubmVjdGlvbiBpcyBjb21wbGV0ZWQuCisgICAgICogIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiAgQHJldHVybiBmYWxzZSBvbiBpbW1lZGlhdGUgZXJyb3IsIHRydWUgb3RoZXJ3aXNlCisgICAgICogIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29ubmVjdElucHV0RGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0SW5wdXREZXZpY2UoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuY29ubmVjdElucHV0RGV2aWNlKGRldmljZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBJbml0aWF0ZSBkaXNjb25uZWN0IGZyb20gYW4gSW5wdXQgRGV2aWNlLgorICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybiBmYWxzZSBvbiBlcnJvciBhbmQgdHJ1ZSBpZiB0aGUgZGlzY29ubmVjdGlvbgorICAgICAqICBhdHRlbXB0IGlzIGJlaW5nIG1hZGUuCisgICAgICoKKyAgICAgKiAgTGlzdGVuIGZvciBJTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRF9BQ1RJT04gdG8gZmluZCBvdXQgd2hlbgorICAgICAqICBkaXNjb25uZWN0IGlzIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqICBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCisgICAgICogIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLCB0cnVlIG90aGVyd2lzZQorICAgICAqICBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZGlzY29ubmVjdElucHV0RGV2aWNlKCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRpc2Nvbm5lY3RJbnB1dERldmljZShkZXZpY2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQ2hlY2sgaWYgYSBzcGVjaWZpZWQgSW5wdXREZXZpY2UgaXMgY29ubmVjdGVkLgorICAgICAqCisgICAgICogIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiAgQHJldHVybiBUcnVlIGlmIGNvbm5lY3RlZCAsIGZhbHNlIG90aGVyd2lzZSBhbmQgb24gZXJyb3IuCisgICAgICogIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJbnB1dERldmljZUNvbm5lY3RlZChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiaXNJbnB1dERldmljZUNvbm5lY3RlZCgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgaW50IHN0YXRlID0gZ2V0SW5wdXREZXZpY2VTdGF0ZShkZXZpY2UpOworICAgICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfQ09OTkVDVEVEKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKiBDaGVjayBpZiBhbnkgSW5wdXQgRGV2aWNlIGlzIGNvbm5lY3RlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSB1bm1vZGlmaWFibGUgc2V0IG9mIGNvbm5lY3RlZCBJbnB1dCBEZXZpY2VzLCBvciBudWxsIG9uIGVycm9yLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIFNldDxCbHVldG9vdGhEZXZpY2U+IGdldENvbm5lY3RlZElucHV0RGV2aWNlcygpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJnZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hTZXQ8Qmx1ZXRvb3RoRGV2aWNlPigKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QobVNlcnZpY2UuZ2V0Q29ubmVjdGVkSW5wdXREZXZpY2VzKCkpKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEdldCB0aGUgc3RhdGUgb2YgYW4gSW5wdXQgRGV2aWNlLgorICAgICAqCisgICAgICogIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiAgQHJldHVybiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgSW5wdXQgRGV2aWNlCisgICAgICogIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbnB1dERldmljZVN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJnZXRJbnB1dERldmljZVN0YXRlKCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldElucHV0RGV2aWNlU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIFNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBwcmlvcml0eSBvZiBhbiBpbnB1dCBkZXZpY2UuCisgICAgICoKKyAgICAgKiBQcmlvcml0eSBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLiBQcmlvcml0eSBjYW4gdGFrZSB0aGUgZm9sbG93aW5nCisgICAgICogdmFsdWVzOgorICAgICAqIHtAbGluayBQUklPUklUWV9PTn0sIHtAbGluayBQUklPUklUWV9PRkZ9LCB7QGxpbmsgUFJJT1JJVFlfQVVUT19DT05ORUNUfQorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBQYWlyZWQgZGV2aWNlLgorICAgICAqIEBwYXJhbSBwcmlvcml0eSBJbnRlZ2VyIHByaW9yaXR5CisgICAgICogQHJldHVybiB0cnVlIGlmIHByaW9yaXR5IGlzIHNldCwgZmFsc2Ugb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSkgeworICAgICAgICBpZiAoREJHKSBsb2coInNldElucHV0RGV2aWNlUHJpb3JpdHkoIiArIGRldmljZSArICIsICIgKyBwcmlvcml0eSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2Uuc2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UsIHByaW9yaXR5KTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwcmlvcml0eSBhc3NvY2lhdGVkIHdpdGggYW4gSW5wdXQgRGV2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBJbnB1dCBEZXZpY2UKKyAgICAgKiBAcmV0dXJuIG5vbi1uZWdhdGl2ZSBwcmlvcml0eSwgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldElucHV0RGV2aWNlUHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImdldElucHV0RGV2aWNlUHJpb3JpdHkoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gUFJJT1JJVFlfT0ZGOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgeworICAgICAgICBMb2cuZChUQUcsIG1zZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFBhbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFBhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1Mjc2NWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUGFuLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50OworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudC5TZGtDb25zdGFudFR5cGU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJsdWV0b290aFBhbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhQYW4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisKKyAgICAvKiogaW50IGV4dHJhIGZvciBBQ1RJT05fUEFOX1NUQVRFX0NIQU5HRUQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QQU5fU1RBVEUgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGgucGFuLmV4dHJhLlNUQVRFIjsKKyAgICAvKiogaW50IGV4dHJhIGZvciBBQ1RJT05fUEFOX1NUQVRFX0NIQU5HRUQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVWSU9VU19QQU5fU1RBVEUgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGgucGFuLmV4dHJhLlBSRVZJT1VTX1NUQVRFIjsKKworICAgIC8qKiBJbmRpY2F0ZXMgdGhlIHN0YXRlIG9mIGFuIFBBTiBkZXZpY2UgaGFzIGNoYW5nZWQuCisgICAgICogVGhpcyBpbnRlbnQgd2lsbCBhbHdheXMgY29udGFpbiBFWFRSQV9ERVZJQ0VfU1RBVEUsCisgICAgICogRVhUUkFfUFJFVklPVVNfREVWSUNFX1NUQVRFIGFuZCBCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFCisgICAgICogZXh0cmFzLgorICAgICAqLworICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1BBTl9TVEFURV9DSEFOR0VEID0KKyAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLnBhbi5hY3Rpb24uU1RBVEVfQ0hBTkdFRCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVBfUk9MRSA9ICJuYXAiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BUF9CUklER0UgPSAicGFuMSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfQ09OTkVDVElPTlMgPSA3OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVEVEID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNUSU5HICAgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RFRCAgICA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVElORyA9IDM7CisKKyAgICBwcml2YXRlIGZpbmFsIElCbHVldG9vdGggbVNlcnZpY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgQmx1ZXRvb3RoUGFuIHByb3h5IG9iamVjdCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgbG9jYWwKKyAgICAgKiBCbHVldG9vdGggUGFuIHNlcnZpY2UuCisgICAgICogQHBhcmFtIGMgQ29udGV4dAorICAgICAqLworICAgIHB1YmxpYyBCbHVldG9vdGhQYW4oQ29udGV4dCBjKSB7CisgICAgICAgIG1Db250ZXh0ID0gYzsKKworICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKEJsdWV0b290aEFkYXB0ZXIuQkxVRVRPT1RIX1NFUlZJQ0UpOworICAgICAgICBpZiAoYiAhPSBudWxsKSB7CisgICAgICAgICAgICBtU2VydmljZSA9IElCbHVldG9vdGguU3R1Yi5hc0ludGVyZmFjZShiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkJsdWV0b290aCBTZXJ2aWNlIG5vdCBhdmFpbGFibGUhIik7CisKKyAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIHdoaWNoIHByZXZlbnRzIHBlb3BsZSBmcm9tIGdvaW5nCisgICAgICAgICAgICAvLyBpbnRvIFdpcmVsZXNzIHNldHRpbmdzIGluIHRoZSBlbXVsYXRvci4gTGV0IGl0IGNyYXNoIGxhdGVyCisgICAgICAgICAgICAvLyB3aGVuIGl0IGlzIGFjdHVhbGx5IHVzZWQuCisgICAgICAgICAgICBtU2VydmljZSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZSBhIFBBTiBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIG9uIGVycm9yIGFuZCB0cnVlIGlmIHRoZSBjb25uZWN0aW9uCisgICAgICogYXR0ZW1wdCBpcyBiZWluZyBtYWRlLgorICAgICAqCisgICAgICogTGlzdGVuIGZvciB7QGxpbmsgI0FDVElPTl9QQU5fU1RBVEVfQ0hBTkdFRH0gdG8gZmluZCBvdXQgd2hlbiB0aGUKKyAgICAgKiBjb25uZWN0aW9uIGlzIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiBAcmV0dXJuIGZhbHNlIG9uIGltbWVkaWF0ZSBlcnJvciwgdHJ1ZSBvdGhlcndpc2UKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3QoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuY29ubmVjdFBhbkRldmljZShkZXZpY2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZSBkaXNjb25uZWN0IGZyb20gUEFOLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm4gZmFsc2Ugb24gZXJyb3IgYW5kIHRydWUgaWYgdGhlIGRpc2Nvbm5lY3Rpb24KKyAgICAgKiBhdHRlbXB0IGlzIGJlaW5nIG1hZGUuCisgICAgICoKKyAgICAgKiBMaXN0ZW4gZm9yIHtAbGluayAjQUNUSU9OX1BBTl9TVEFURV9DSEFOR0VEfSB0byBmaW5kIG91dCB3aGVuCisgICAgICogZGlzY29ubmVjdCBpcyBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCisgICAgICogQHJldHVybiBmYWxzZSBvbiBpbW1lZGlhdGUgZXJyb3IsIHRydWUgb3RoZXJ3aXNlCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJkaXNjb25uZWN0KCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRpc2Nvbm5lY3RQYW5EZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEdldCB0aGUgc3RhdGUgb2YgYSBQQU4gRGV2aWNlLgorICAgICoKKyAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnQgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGUgUEFOIGNvbm5lY3Rpb24KKyAgICAqCisgICAgKiAgQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgorICAgICogIEByZXR1cm4gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIFBBTiBEZXZpY2UKKyAgICAqICBAaGlkZQorICAgICovCisgICBwdWJsaWMgaW50IGdldFBhbkRldmljZVN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICBpZiAoREJHKSBsb2coImdldFBhbkRldmljZVN0YXRlKCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgIHRyeSB7CisgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYW5EZXZpY2VTdGF0ZShkZXZpY2UpOworICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICByZXR1cm4gU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgIH0KKyAgIH0KKworICAgLyoqIFJldHVybnMgYSBzZXQgb2YgYWxsIHRoZSBjb25uZWN0ZWQgUEFOIERldmljZXMKKyAgICoKKyAgICogRG9lcyBub3QgaW5jbHVkZSBkZXZpY2VzIHRoYXQgYXJlIGN1cnJlbnRseSBjb25uZWN0aW5nIG9yIGRpc2Nvbm5lY3RpbmcKKyAgICoKKyAgICogQHJldHVybiBhIHVubW9kaWZpYWJsZSBzZXQgb2YgY29ubmVjdGVkIFBBTiBEZXZpY2VzLCBvciBudWxsIG9uIGVycm9yLgorICAgKiBAaGlkZQorICAgKi8KKyAgIHB1YmxpYyBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBnZXRDb25uZWN0ZWREZXZpY2VzKCkgeworICAgICAgaWYgKERCRykgbG9nKCJnZXRDb25uZWN0ZWREZXZpY2VzIik7CisgICAgICB0cnkgeworICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoCisgICAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxCbHVldG9vdGhEZXZpY2U+KAorICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QobVNlcnZpY2UuZ2V0Q29ubmVjdGVkUGFuRGV2aWNlcygpKSkpOworICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKKyAgICAgICAgTG9nLmQoVEFHLCBtc2cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJsdWV0b290aFRldGhlcmluZyhib29sZWFuIHZhbHVlLCBTdHJpbmcgdXVpZCwgU3RyaW5nIGJyaWRnZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2Uuc2V0Qmx1ZXRvb3RoVGV0aGVyaW5nKHZhbHVlLCB1dWlkLCBicmlkZ2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RldGhlcmluZ09uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmlzVGV0aGVyaW5nT24oKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFByb2ZpbGVTdGF0ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFByb2ZpbGVTdGF0ZS5qYXZhCmluZGV4IDk0NmRjYWEuLmFkNzBkMGQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhQcm9maWxlU3RhdGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLmphdmEKQEAgLTQzLDggKzQzLDkgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7IC8vIFNUT1BTSElQIC0gY2hhbmdlIHRvIGZhbHNlLgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmx1ZXRvb3RoUHJvZmlsZVN0YXRlIjsKIAotICAgIHB1YmxpYyBzdGF0aWMgaW50IEhGUCA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgQTJEUCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEZQID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBMkRQID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISUQgPSAyOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFRSQU5TSVRJT05fVE9fU1RBQkxFID0gMTAwOwogCkBAIC03MCw2ICs3MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRCkpIHsKICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoVFJBTlNJVElPTl9UT19TVEFCTEUpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhJbnB1dERldmljZS5BQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgaW50IG5ld1N0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aElucHV0RGV2aWNlLkVYVFJBX0lOUFVUX0RFVklDRV9TVEFURSwgMCk7CisgICAgICAgICAgICAgICAgaWYgKG1Qcm9maWxlID09IEhJRCAmJiAobmV3U3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEIHx8CisgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoVFJBTlNJVElPTl9UT19TVEFCTEUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CkBAIC04NCw2ICs5MSw3IEBACiAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoQTJkcC5BQ1RJT05fU0lOS19TVEFURV9DSEFOR0VEKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9TVEFURV9DSEFOR0VEKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhJbnB1dERldmljZS5BQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQpOwogICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobUJyb2FkY2FzdFJlY2VpdmVyLCBmaWx0ZXIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFV1aWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhVdWlkLmphdmEKaW5kZXggNDE2NGEzZC4uM2ZiZmM3MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFV1aWQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVXVpZC5qYXZhCkBAIC00OSwxMCArNDksMTggQEAKICAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDExMEMtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkIE9iZXhPYmplY3RQdXNoID0KICAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDExMDUtMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkIEhpZCA9CisgICAgICAgICAgICBQYXJjZWxVdWlkLmZyb21TdHJpbmcoIjAwMDAxMTI0LTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsVXVpZCBQQU5VID0KKyAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDExMTUtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkIE5BUCA9CisgICAgICAgICAgICBQYXJjZWxVdWlkLmZyb21TdHJpbmcoIjAwMDAxMTE2LTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsVXVpZCBCTkVQID0KKyAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDAwMGYtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbFV1aWRbXSBSRVNFUlZFRF9VVUlEUyA9IHsKICAgICAgICAgQXVkaW9TaW5rLCBBdWRpb1NvdXJjZSwgQWR2QXVkaW9EaXN0LCBIU1AsIEhhbmRzZnJlZSwgQXZyY3BDb250cm9sbGVyLCBBdnJjcFRhcmdldCwKLSAgICAgICAgT2JleE9iamVjdFB1c2h9OworICAgICAgICBPYmV4T2JqZWN0UHVzaCwgUEFOVSwgTkFQfTsKIAogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1ZGlvU291cmNlKFBhcmNlbFV1aWQgdXVpZCkgewogICAgICAgICByZXR1cm4gdXVpZC5lcXVhbHMoQXVkaW9Tb3VyY2UpOwpAQCAtODIsNiArOTAsMjEgQEAKICAgICAgICAgcmV0dXJuIHV1aWQuZXF1YWxzKEF2cmNwVGFyZ2V0KTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnB1dERldmljZShQYXJjZWxVdWlkIHV1aWQpIHsKKyAgICAgICAgcmV0dXJuIHV1aWQuZXF1YWxzKEhpZCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGFudShQYXJjZWxVdWlkIHV1aWQpIHsKKyAgICAgICAgcmV0dXJuIHV1aWQuZXF1YWxzKFBBTlUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05hcChQYXJjZWxVdWlkIHV1aWQpIHsKKyAgICAgICAgcmV0dXJuIHV1aWQuZXF1YWxzKE5BUCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQm5lcChQYXJjZWxVdWlkIHV1aWQpIHsKKyAgICAgICAgcmV0dXJuIHV1aWQuZXF1YWxzKEJORVApOworICAgIH0KICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgUGFyY2VsVXVpZCBpcyBwcmVzZW50IGluIHV1aWRBcnJheQogICAgICAqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aC5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGguYWlkbAppbmRleCBlYTcxMDM0Li5mOGY2NzhiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aC5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoLmFpZGwKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7CiAKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsVXVpZDsKIAogLyoqCkBAIC03Miw0ICs3MywxOSBAQAogICAgIGJvb2xlYW4gY29ubmVjdEhlYWRzZXQoU3RyaW5nIGFkZHJlc3MpOwogICAgIGJvb2xlYW4gZGlzY29ubmVjdEhlYWRzZXQoU3RyaW5nIGFkZHJlc3MpOwogICAgIGJvb2xlYW4gbm90aWZ5SW5jb21pbmdDb25uZWN0aW9uKFN0cmluZyBhZGRyZXNzKTsKKworICAgIC8vIEhJRCBwcm9maWxlIEFQSXMKKyAgICBib29sZWFuIGNvbm5lY3RJbnB1dERldmljZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBCbHVldG9vdGhEZXZpY2VbXSBnZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKTsgIC8vIGNoYW5nZSB0byBTZXQ8PiBvbmNlIEFJREwgc3VwcG9ydHMKKyAgICBpbnQgZ2V0SW5wdXREZXZpY2VTdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBib29sZWFuIHNldElucHV0RGV2aWNlUHJpb3JpdHkoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KTsKKyAgICBpbnQgZ2V0SW5wdXREZXZpY2VQcmlvcml0eShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKworICAgIGJvb2xlYW4gaXNUZXRoZXJpbmdPbigpOworICAgIHZvaWQgc2V0Qmx1ZXRvb3RoVGV0aGVyaW5nKGJvb2xlYW4gdmFsdWUsIFN0cmluZyB1dWlkLCBTdHJpbmcgYnJpZGdlKTsKKyAgICBpbnQgZ2V0UGFuRGV2aWNlU3RhdGUoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisgICAgQmx1ZXRvb3RoRGV2aWNlW10gZ2V0Q29ubmVjdGVkUGFuRGV2aWNlcygpOworICAgIGJvb2xlYW4gY29ubmVjdFBhbkRldmljZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBib29sZWFuIGRpc2Nvbm5lY3RQYW5EZXZpY2UoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvU2NvU29ja2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvU2NvU29ja2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NWE5OWEuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL1Njb1NvY2tldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlci5XYWtlTG9jazsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0vKioKLSAqIFRoZSBBbmRyb2lkIEJsdWV0b290aCBBUEkgaXMgbm90IGZpbmFsaXplZCwgYW5kICp3aWxsKiBjaGFuZ2UuIFVzZSBhdCB5b3VyCi0gKiBvd24gcmlzay4KLSAqCi0gKiBTaW1wbGUgU0NPIFNvY2tldC4KLSAqIEN1cnJlbnRseSBpbiBBbmRyb2lkLCB0aGVyZSBpcyBubyBzdXBwb3J0IGZvciBzZW5kaW5nIGRhdGEgb3ZlciBhIFNDTwotICogc29ja2V0IC0gdGhpcyBpcyBtYW5hZ2VkIGJ5IHRoZSBoYXJkd2FyZSBsaW5rIHRvIHRoZSBCbHVldG9vdGggQ2hpcC4gVGhpcwotICogY2xhc3MgaXMgaW5zdGVhZCBpbnRlbmRlZCBmb3IgbWFuYWdlbWVudCBvZiB0aGUgU0NPIHNvY2tldCBsaWZldGltZSwgCi0gKiBhbmQgaXMgdGFpbG9yZWQgZm9yIHVzZSB3aXRoIHRoZSBoZWFkc2V0IC8gaGFuZHNmcmVlIHByb2ZpbGVzLgotICogQGhpZGUKLSAqLwotcHVibGljIGNsYXNzIFNjb1NvY2tldCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTY29Tb2NrZXQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFZEQkcgPSBmYWxzZTsgIC8vIGV2ZW4gbW9yZSBsb2dnaW5nCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9SRUFEWSA9IDE7ICAgIC8vIFJlYWR5IGZvciB1c2UuIE5vIHRocmVhZHMgb3Igc29ja2V0cwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0FDQ0VQVCA9IDI7ICAgLy8gYWNjZXB0KCkgdGhyZWFkIHJ1bm5pbmcKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNUSU5HID0gMzsgIC8vIGNvbm5lY3QoKSB0aHJlYWQgcnVubmluZwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RFRCA9IDQ7ICAgLy8gY29ubmVjdGVkLCB3YWl0aW5nIGZvciBjbG9zZSgpCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ0xPU0VEID0gNTsgICAvLyB3YXMgY29ubmVjdGVkLCBub3cgY2xvc2VkLgotCi0gICAgcHJpdmF0ZSBpbnQgbVN0YXRlOwotICAgIHByaXZhdGUgaW50IG1OYXRpdmVEYXRhOwotICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKLSAgICBwcml2YXRlIGludCBtQWNjZXB0ZWRDb2RlOwotICAgIHByaXZhdGUgaW50IG1Db25uZWN0ZWRDb2RlOwotICAgIHByaXZhdGUgaW50IG1DbG9zZWRDb2RlOwotCi0gICAgcHJpdmF0ZSBXYWtlTG9jayBtV2FrZUxvY2s7ICAvLyBoZWxkIHdoaWxlIGluIFNUQVRFX0NPTk5FQ1RJTkcKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGNsYXNzSW5pdE5hdGl2ZSgpOwotICAgIH0KLSAgICBwcml2YXRlIG5hdGl2ZSBzdGF0aWMgdm9pZCBjbGFzc0luaXROYXRpdmUoKTsKLQotICAgIHB1YmxpYyBTY29Tb2NrZXQoUG93ZXJNYW5hZ2VyIHBtLCBIYW5kbGVyIGhhbmRsZXIsIGludCBhY2NlcHRlZENvZGUsIGludCBjb25uZWN0ZWRDb2RlLAotICAgICAgICAgICAgICAgICAgICAgaW50IGNsb3NlZENvZGUpIHsKLSAgICAgICAgaW5pdE5hdGl2ZSgpOwotICAgICAgICBtU3RhdGUgPSBTVEFURV9SRUFEWTsKLSAgICAgICAgbUhhbmRsZXIgPSBoYW5kbGVyOwotICAgICAgICBtQWNjZXB0ZWRDb2RlID0gYWNjZXB0ZWRDb2RlOwotICAgICAgICBtQ29ubmVjdGVkQ29kZSA9IGNvbm5lY3RlZENvZGU7Ci0gICAgICAgIG1DbG9zZWRDb2RlID0gY2xvc2VkQ29kZTsKLSAgICAgICAgbVdha2VMb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLCAiU2NvU29ja2V0Iik7Ci0gICAgICAgIG1XYWtlTG9jay5zZXRSZWZlcmVuY2VDb3VudGVkKGZhbHNlKTsKLSAgICAgICAgaWYgKFZEQkcpIGxvZyh0aGlzICsgIiBTQ08gT0JKRUNUIENUT1IiKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBpbml0TmF0aXZlKCk7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKFZEQkcpIGxvZyh0aGlzICsgIiBTQ08gT0JKRUNUIERUT1IiKTsKLSAgICAgICAgICAgIGRlc3Ryb3lOYXRpdmUoKTsKLSAgICAgICAgICAgIHJlbGVhc2VXYWtlTG9ja05vdygpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGRlc3Ryb3lOYXRpdmUoKTsKLQotICAgIC8qKiBDb25uZWN0IHRoaXMgU0NPIHNvY2tldCB0byB0aGUgZ2l2ZW4gQlQgYWRkcmVzcy4KLSAgICAgKiAgRG9lcyBub3QgYmxvY2suCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbm5lY3QoU3RyaW5nIGFkZHJlc3MsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChEQkcpIGxvZygiY29ubmVjdCgpICIgKyB0aGlzKTsKLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9SRUFEWSkgewotICAgICAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0KCk6IEJhZCBzdGF0ZSIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGFjcXVpcmVXYWtlTG9jaygpOwotICAgICAgICBpZiAoY29ubmVjdE5hdGl2ZShhZGRyZXNzLCBuYW1lKSkgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQ0xPU0VEOwotICAgICAgICAgICAgcmVsZWFzZVdha2VMb2NrTm93KCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBjb25uZWN0TmF0aXZlKFN0cmluZyBhZGRyZXNzLCBTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKiogQWNjZXB0IGluY29taW5nIFNDTyBjb25uZWN0aW9ucy4KLSAgICAgKiAgRG9lcyBub3QgYmxvY2suCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGFjY2VwdCgpIHsKLSAgICAgICAgaWYgKFZEQkcpIGxvZygiYWNjZXB0KCkgIiArIHRoaXMpOwotICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX1JFQURZKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBsb2coIkJhZCBzdGF0ZSIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhY2NlcHROYXRpdmUoKSkgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQUNDRVBUOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DTE9TRUQ7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBhY2NlcHROYXRpdmUoKTsKLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKHRoaXMgKyAiIFNDTyBPQkpFQ1QgY2xvc2UoKSBtU3RhdGUgPSAiICsgbVN0YXRlKTsKLSAgICAgICAgYWNxdWlyZVdha2VMb2NrKCk7Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NMT1NFRDsKLSAgICAgICAgY2xvc2VOYXRpdmUoKTsKLSAgICAgICAgcmVsZWFzZVdha2VMb2NrKCk7Ci0gICAgfQotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgY2xvc2VOYXRpdmUoKTsKLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFN0YXRlKCkgewotICAgICAgICByZXR1cm4gbVN0YXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgb25Db25uZWN0ZWQoaW50IHJlc3VsdCkgewotICAgICAgICBpZiAoVkRCRykgbG9nKHRoaXMgKyAiIG9uQ29ubmVjdGVkKCkgbVN0YXRlID0gIiArIG1TdGF0ZSArICIgIiArIHRoaXMpOwotICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0NPTk5FQ1RJTkcpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIGxvZygiU3RyYW5nZSBzdGF0ZSwgY2xvc2luZyAiICsgbVN0YXRlICsgIiAiICsgdGhpcyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCA+PSAwKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DT05ORUNURUQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DTE9TRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShtQ29ubmVjdGVkQ29kZSwgbVN0YXRlLCAtMSwgdGhpcykuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIHJlbGVhc2VXYWtlTG9ja05vdygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgb25BY2NlcHRlZChpbnQgcmVzdWx0KSB7Ci0gICAgICAgIGlmIChWREJHKSBsb2coIm9uQWNjZXB0ZWQoKSAiICsgdGhpcyk7Ci0gICAgICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQUNDRVBUKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBsb2coIlN0cmFuZ2Ugc3RhdGUgIiArIHRoaXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHQgPj0gMCkgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQ0xPU0VEOwotICAgICAgICB9Ci0gICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UobUFjY2VwdGVkQ29kZSwgbVN0YXRlLCAtMSwgdGhpcykuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBvbkNsb3NlZCgpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJvbkNsb3NlZCgpICIgKyB0aGlzKTsKLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9DTE9TRUQpIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NMT1NFRDsKLSAgICAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UobUNsb3NlZENvZGUsIG1TdGF0ZSwgLTEsIHRoaXMpLnNlbmRUb1RhcmdldCgpOwotICAgICAgICAgICAgcmVsZWFzZVdha2VMb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWNxdWlyZVdha2VMb2NrKCkgewotICAgICAgICBpZiAoIW1XYWtlTG9jay5pc0hlbGQoKSkgewotICAgICAgICAgICAgbVdha2VMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgIGlmIChWREJHKSBsb2coIm1XYWtlTG9jay5hY3F1aXJlKCkgIiArIHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VXYWtlTG9jaygpIHsKLSAgICAgICAgaWYgKG1XYWtlTG9jay5pc0hlbGQoKSkgewotICAgICAgICAgICAgLy8gS2VlcCBhcHBzIHByb2Nlc3NvciBhd2FrZSBmb3IgYSBmdXJ0aGVyIDIgc2Vjb25kcy4KLSAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBoYWNrIHRvIHJlc29sdmUgaXNzdWUgaHR0cDovL2IvMTYxNjI2MyAtIGluIHdoaWNoCi0gICAgICAgICAgICAvLyB3ZSBhcmUgbGVmdCBpbiBhIDgwIG1BIHBvd2VyIHN0YXRlIHdoZW4gcmVtb3RlbHkgdGVybWluYXRpbmcgYQotICAgICAgICAgICAgLy8gY2FsbCB3aGlsZSBjb25uZWN0ZWQgdG8gQlQgaGVhZHNldCAiSFRDIEJIIFMxMDAgIiB3aXRoIEEyRFAgYW5kCi0gICAgICAgICAgICAvLyBIRlAgcHJvZmlsZXMuCi0gICAgICAgICAgICBpZiAoVkRCRykgbG9nKCJtV2FrZUxvY2sucmVsZWFzZSgpIGluIDIgc2VjIiArIHRoaXMpOwotICAgICAgICAgICAgbVdha2VMb2NrLmFjcXVpcmUoMjAwMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVsZWFzZVdha2VMb2NrTm93KCkgewotICAgICAgICBpZiAobVdha2VMb2NrLmlzSGVsZCgpKSB7Ci0gICAgICAgICAgICBpZiAoVkRCRykgbG9nKCJtV2FrZUxvY2sucmVsZWFzZSgpIG5vdyIgKyB0aGlzKTsKLSAgICAgICAgICAgIG1XYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLSAgICAgICAgTG9nLmQoVEFHLCBtc2cpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQXN5bmNUYXNrTG9hZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0FzeW5jVGFza0xvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOWMwNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0FzeW5jVGFza0xvYWRlci5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKKworLyoqCisgKiBBYnN0cmFjdCBMb2FkZXIgdGhhdCBwcm92aWRlcyBhbiB7QGxpbmsgQXN5bmNUYXNrfSB0byBkbyB0aGUgd29yay4KKyAqCisgKiBAcGFyYW0gPEQ+IHRoZSBkYXRhIHR5cGUgdG8gYmUgbG9hZGVkLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXN5bmNUYXNrTG9hZGVyPEQ+IGV4dGVuZHMgTG9hZGVyPEQ+IHsKKyAgICBmaW5hbCBjbGFzcyBMb2FkVGFzayBleHRlbmRzIEFzeW5jVGFzazxWb2lkLCBWb2lkLCBEPiB7CisKKyAgICAgICAgcHJpdmF0ZSBEIHJlc3VsdDsKKworICAgICAgICAvKiBSdW5zIG9uIGEgd29ya2VyIHRocmVhZCAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEQgZG9JbkJhY2tncm91bmQoVm9pZC4uLiBwYXJhbXMpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFzeW5jVGFza0xvYWRlci50aGlzLmxvYWRJbkJhY2tncm91bmQoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBSdW5zIG9uIHRoZSBVSSB0aHJlYWQgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoRCBkYXRhKSB7CisgICAgICAgICAgICBBc3luY1Rhc2tMb2FkZXIudGhpcy5kaXNwYXRjaE9uTG9hZENvbXBsZXRlKGRhdGEpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQ2FuY2VsbGVkKCkgeworICAgICAgICAgICAgQXN5bmNUYXNrTG9hZGVyLnRoaXMub25DYW5jZWxsZWQocmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIExvYWRUYXNrIG1UYXNrOworCisgICAgcHVibGljIEFzeW5jVGFza0xvYWRlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yY2UgYW4gYXN5bmNocm9ub3VzIGxvYWQuIFVubGlrZSB7QGxpbmsgI3N0YXJ0TG9hZGluZygpfSB0aGlzIHdpbGwgaWdub3JlIGEgcHJldmlvdXNseQorICAgICAqIGxvYWRlZCBkYXRhIHNldCBhbmQgbG9hZCBhIG5ldyBvbmUuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZm9yY2VMb2FkKCkgeworICAgICAgICBjYW5jZWxMb2FkKCk7CisgICAgICAgIG1UYXNrID0gbmV3IExvYWRUYXNrKCk7CisgICAgICAgIG1UYXNrLmV4ZWN1dGUoKFZvaWRbXSkgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0ZW1wdCB0byBjYW5jZWwgdGhlIGN1cnJlbnQgbG9hZCB0YXNrLiBTZWUge0BsaW5rIEFzeW5jVGFzayNjYW5jZWwoYm9vbGVhbil9CisgICAgICogZm9yIG1vcmUgaW5mby4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPHR0PmZhbHNlPC90dD4gaWYgdGhlIHRhc2sgY291bGQgbm90IGJlIGNhbmNlbGVkLAorICAgICAqICAgICAgICAgdHlwaWNhbGx5IGJlY2F1c2UgaXQgaGFzIGFscmVhZHkgY29tcGxldGVkIG5vcm1hbGx5LCBvcgorICAgICAqICAgICAgICAgYmVjYXVzZSB7QGxpbmsgI3N0YXJ0TG9hZGluZygpfSBoYXNuJ3QgYmVlbiBjYWxsZWQsIGFuZAorICAgICAqICAgICAgICAgPHR0PnRydWU8L3R0PiBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5jZWxMb2FkKCkgeworICAgICAgICBpZiAobVRhc2sgIT0gbnVsbCkgeworICAgICAgICAgICAgYm9vbGVhbiBjYW5jZWxsZWQgPSBtVGFzay5jYW5jZWwoZmFsc2UpOworICAgICAgICAgICAgbVRhc2sgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIGNhbmNlbGxlZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGlmIHRoZSB0YXNrIHdhcyBjYW5jZWxlZCBiZWZvcmUgaXQgd2FzIGNvbXBsZXRlZC4gIEdpdmVzIHRoZSBjbGFzcyBhIGNoYW5jZQorICAgICAqIHRvIHByb3Blcmx5IGRpc3Bvc2Ugb2YgdGhlIHJlc3VsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNhbmNlbGxlZChEIGRhdGEpIHsKKyAgICB9CisKKyAgICB2b2lkIGRpc3BhdGNoT25Mb2FkQ29tcGxldGUoRCBkYXRhKSB7CisgICAgICAgIG1UYXNrID0gbnVsbDsKKyAgICAgICAgZGVsaXZlclJlc3VsdChkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgb24gYSB3b3JrZXIgdGhyZWFkIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBsb2FkLiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIG5vdCBkZWxpdmVyIHRoZQorICAgICAqIHJlc3VsdHMgZGlyZWN0bHksIGJ1dCBzaG91bGQgcmV0dXJuIHRoZW0gZnJvbSB0aGlzIG1ldGhvZCwgd2hpY2ggd2lsbCBldmVudHVhbGx5IGVuZCB1cAorICAgICAqIGNhbGxpbmcgZGVsaXZlclJlc3VsdCBvbiB0aGUgVUkgdGhyZWFkLiBJZiBpbXBsZW1lbnRhdGlvbnMgbmVlZCB0byBwcm9jZXNzCisgICAgICogdGhlIHJlc3VsdHMgb24gdGhlIFVJIHRocmVhZCB0aGV5IG1heSBvdmVycmlkZSBkZWxpdmVyUmVzdWx0IGFuZCBkbyBzbworICAgICAqIHRoZXJlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEQgbG9hZEluQmFja2dyb3VuZCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGF0YS5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGF0YS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYzEyY2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEYXRhLmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworcGFyY2VsYWJsZSBDbGlwRGF0YTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERhdGEuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTliMTMyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGF0YS5qYXZhCkBAIC0wLDAgKzEsNDk0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogUmVwcmVzZW50YXRpb24gb2YgYSBjbGlwcGVkIGRhdGEgb24gdGhlIGNsaXBib2FyZC4KKyAqCisgKiA8cD5DbGlwcGVkRGF0YSBpcyBhIGNvbXBsZXggdHlwZSBjb250YWluaW5nIG9uZSBvciBJdGVtIGluc3RhbmNlcywKKyAqIGVhY2ggb2Ygd2hpY2ggY2FuIGhvbGQgb25lIG9yIG1vcmUgcmVwcmVzZW50YXRpb25zIG9mIGFuIGl0ZW0gb2YgZGF0YS4KKyAqIEZvciBkaXNwbGF5IHRvIHRoZSB1c2VyLCBpdCBhbHNvIGhhcyBhIGxhYmVsIGFuZCBpY29uaWMgcmVwcmVzZW50YXRpb24uPC9wPgorICoKKyAqIDxwPkEgQ2xpcERhdGEgaXMgYSBzdWItY2xhc3Mgb2Yge0BsaW5rIENsaXBEZXNjcmlwdGlvbn0sIHdoaWNoIGRlc2NyaWJlcworICogaW1wb3J0YW50IG1ldGEtZGF0YSBhYm91dCB0aGUgY2xpcC4gIEluIHBhcnRpY3VsYXIsIGl0cyB7QGxpbmsgI2dldE1pbWVUeXBlKGludCl9CisgKiBtdXN0IHJldHVybiBjb3JyZWN0IE1JTUUgdHlwZShzKSBkZXNjcmliaW5nIHRoZSBkYXRhIGluIHRoZSBjbGlwLiAgRm9yIGhlbHAKKyAqIGluIGNvcnJlY3RseSBjb25zdHJ1Y3RpbmcgYSBjbGlwIHdpdGggdGhlIGNvcnJlY3QgTUlNRSB0eXBlLCB1c2UKKyAqIHtAbGluayAjbmV3UGxhaW5UZXh0KENoYXJTZXF1ZW5jZSwgQml0bWFwLCBDaGFyU2VxdWVuY2UpfSwKKyAqIHtAbGluayAjbmV3VXJpKENvbnRlbnRSZXNvbHZlciwgQ2hhclNlcXVlbmNlLCBCaXRtYXAsIFVyaSl9LCBhbmQKKyAqIHtAbGluayAjbmV3SW50ZW50KENoYXJTZXF1ZW5jZSwgQml0bWFwLCBJbnRlbnQpfS4KKyAqCisgKiA8cD5FYWNoIEl0ZW0gaW5zdGFuY2UgY2FuIGJlIG9uZSBvZiB0aHJlZSBtYWluIGNsYXNzZXMgb2YgZGF0YTogYSBzaW1wbGUKKyAqIENoYXJTZXF1ZW5jZSBvZiB0ZXh0LCBhIHNpbmdsZSBJbnRlbnQgb2JqZWN0LCBvciBhIFVyaS4gIFNlZSB7QGxpbmsgSXRlbX0KKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogPGEgbmFtZT0iSW1wbGVtZW50aW5nUGFzdGUiPjwvYT4KKyAqIDxoMz5JbXBsZW1lbnRpbmcgUGFzdGUgb3IgRHJvcDwvaDM+CisgKgorICogPHA+VG8gaW1wbGVtZW50IGEgcGFzdGUgb3IgZHJvcCBvZiBhIENsaXBwZWREYXRhIG9iamVjdCBpbnRvIGFuIGFwcGxpY2F0aW9uLAorICogdGhlIGFwcGxpY2F0aW9uIG11c3QgY29ycmVjdGx5IGludGVycHJldCB0aGUgZGF0YSBmb3IgaXRzIHVzZS4gIElmIHRoZSB7QGxpbmsgSXRlbX0KKyAqIGl0IGNvbnRhaW5zIGlzIHNpbXBsZSB0ZXh0IG9yIGFuIEludGVudCwgdGhlcmUgaXMgbGl0dGxlIHRvIGJlIGRvbmU6IHRleHQKKyAqIGNhbiBvbmx5IGJlIGludGVycHJldGVkIGFzIHRleHQsIGFuZCBhbiBJbnRlbnQgd2lsbCB0eXBpY2FsbHkgYmUgdXNlZCBmb3IKKyAqIGNyZWF0aW5nIHNob3J0Y3V0cyAoc3VjaCBhcyBwbGFjaW5nIGljb25zIG9uIHRoZSBob21lIHNjcmVlbikgb3Igb3RoZXIKKyAqIGFjdGlvbnMuCisgKgorICogPHA+SWYgYWxsIHlvdSB3YW50IGlzIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGlwcGVkIGRhdGEsIHlvdQorICogY2FuIHVzZSB0aGUgY29udmVuaWVuY2UgbWV0aG9kIHtAbGluayBJdGVtI2NvZXJjZVRvVGV4dCBJdGVtLmNvZXJjZVRvVGV4dH0uCisgKiBJbiB0aGlzIGNhc2UgdGhlcmUgaXMgZ2VuZXJhbGx5IG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgdGhlIE1JTUUgdHlwZXMKKyAqIHJlcG9ydGVkIGJ5IHtAbGluayAjZ2V0TWltZVR5cGUoaW50KX0sIHNpbmNlIGFueSBjbGlwIGl0ZW0gYW4gYWx3YXlzIGJlCisgKiBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcuCisgKgorICogPHA+TW9yZSBjb21wbGljYXRlZCBleGNoYW5nZXMgd2lsbCBiZSBkb25lIHRocm91Z2ggVVJJcywgaW4gcGFydGljdWxhcgorICogImNvbnRlbnQ6IiBVUklzLiAgQSBjb250ZW50IFVSSSBhbGxvd3MgdGhlIHJlY2lwaWVudCBvZiBhIENsaXBwZWREYXRhIGl0ZW0KKyAqIHRvIGludGVyYWN0IGNsb3NlbHkgd2l0aCB0aGUgQ29udGVudFByb3ZpZGVyIGhvbGRpbmcgdGhlIGRhdGEgaW4gb3JkZXIgdG8KKyAqIG5lZ290aWF0ZSB0aGUgdHJhbnNmZXIgb2YgdGhhdCBkYXRhLiAgVGhlIGNsaXAgbXVzdCBhbHNvIGJlIGZpbGxlZCBpbiB3aXRoCisgKiB0aGUgYXZhaWxhYmxlIE1JTUUgdHlwZXM7IHtAbGluayAjbmV3VXJpKENvbnRlbnRSZXNvbHZlciwgQ2hhclNlcXVlbmNlLCBCaXRtYXAsIFVyaSl9CisgKiB3aWxsIHRha2UgY2FyZSBvZiBjb3JyZWN0bHkgZG9pbmcgdGhpcy4KKyAqCisgKiA8cD5Gb3IgZXhhbXBsZSwgaGVyZSBpcyB0aGUgcGFzdGUgZnVuY3Rpb24gb2YgYSBzaW1wbGUgTm90ZVBhZCBhcHBsaWNhdGlvbi4KKyAqIFdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmcm9tIHRoZSBjbGlwYm9hcmQsIGl0IGNhbiBkbyBlaXRoZXIgdHdvIHRoaW5nczoKKyAqIGlmIHRoZSBjbGlwYm9hcmQgY29udGFpbnMgYSBVUkkgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nIG5vdGUsIGl0IGNvcGllcworICogdGhlIGVudGlyZSBzdHJ1Y3R1cmUgb2YgdGhlIG5vdGUgaW50byBhIG5ldyBub3RlOyBvdGhlcndpc2UsIGl0IHNpbXBseQorICogY29lcmNlcyB0aGUgY2xpcCBpbnRvIHRleHQgYW5kIHVzZXMgdGhhdCBhcyB0aGUgbmV3IG5vdGUncyBjb250ZW50cy4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlRWRpdG9yLmphdmEKKyAqICAgICAgcGFzdGV9CisgKgorICogPHA+SW4gbWFueSBjYXNlcyBhbiBhcHBsaWNhdGlvbiBjYW4gcGFzdGUgdmFyaW91cyB0eXBlcyBvZiBzdHJlYW1zIG9mIGRhdGEuICBGb3IKKyAqIGV4YW1wbGUsIGFuIGUtbWFpbCBhcHBsaWNhdGlvbiBtYXkgd2FudCB0byBhbGxvdyB0aGUgdXNlciB0byBwYXN0ZSBhbiBpbWFnZQorICogb3Igb3RoZXIgYmluYXJ5IGRhdGEgYXMgYW4gYXR0YWNobWVudC4gIFRoaXMgaXMgYWNjb21wbGlzaGVkIHRocm91Z2ggdGhlCisgKiBDb250ZW50UmVzb2x2ZXIge0BsaW5rIENvbnRlbnRSZXNvbHZlciNnZXRTdHJlYW1UeXBlcyhVcmksIFN0cmluZyl9IGFuZAorICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKFVyaSwgU3RyaW5nLCBhbmRyb2lkLm9zLkJ1bmRsZSl9CisgKiBtZXRob2RzLiAgVGhlc2UgYWxsb3cgYSBjbGllbnQgdG8gZGlzY292ZXIgdGhlIHR5cGUocykgb2YgZGF0YSB0aGF0IGEgcGFydGljdWxhcgorICogY29udGVudCBVUkkgY2FuIG1ha2UgYXZhaWxhYmxlIGFzIGEgc3RyZWFtIGFuZCByZXRyaWV2ZSB0aGUgc3RyZWFtIG9mIGRhdGEuCisgKgorICogPHA+Rm9yIGV4YW1wbGUsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSXRlbSNjb2VyY2VUb1RleHQgSXRlbS5jb2VyY2VUb1RleHR9CisgKiBpdHNlbGYgdXNlcyB0aGlzIHRvIHRyeSB0byByZXRyaWV2ZSBhIFVSSSBjbGlwIGFzIGEgc3RyZWFtIG9mIHRleHQ6CisgKgorICoge0BzYW1wbGUgZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERhdGEuamF2YSBjb2VyY2VUb1RleHR9CisgKgorICogPGEgbmFtZT0iSW1wbGVtZW50aW5nQ29weSI+PC9hPgorICogPGgzPkltcGxlbWVudGluZyBDb3B5IG9yIERyYWc8L2gzPgorICoKKyAqIDxwPlRvIGJlIHRoZSBzb3VyY2Ugb2YgYSBjbGlwLCB0aGUgYXBwbGljYXRpb24gbXVzdCBjb25zdHJ1Y3QgYSBDbGlwcGVkRGF0YQorICogb2JqZWN0IHRoYXQgYW55IHJlY2lwaWVudCBjYW4gaW50ZXJwcmV0IGJlc3QgZm9yIHRoZWlyIGNvbnRleHQuICBJZiB0aGUgY2xpcAorICogaXMgdG8gY29udGFpbiBhIHNpbXBsZSB0ZXh0LCBJbnRlbnQsIG9yIFVSSSwgdGhpcyBpcyBlYXN5OiBhbiB7QGxpbmsgSXRlbX0KKyAqIGNvbnRhaW5pbmcgdGhlIGFwcHJvcHJpYXRlIGRhdGEgdHlwZSBjYW4gYmUgY29uc3RydWN0ZWQgYW5kIHVzZWQuCisgKgorICogPHA+TW9yZSBjb21wbGljYXRlZCBkYXRhIHR5cGVzIHJlcXVpcmUgdGhlIGltcGxlbWVudGF0aW9uIG9mIHN1cHBvcnQgaW4KKyAqIGEgQ29udGVudFByb3ZpZGVyIGZvciBkZXNjcmliaW5nIGFuZCBnZW5lcmF0aW5nIHRoZSBkYXRhIGZvciB0aGUgcmVjaXBpZW50LgorICogQSBjb21tb24gc2NlbmFyaW8gaXMgb25lIHdoZXJlIGFuIGFwcGxpY2F0aW9uIHBsYWNlcyBvbiB0aGUgY2xpcGJvYXJkIHRoZQorICogY29udGVudDogVVJJIG9mIGFuIG9iamVjdCB0aGF0IHRoZSB1c2VyIGhhcyBjb3BpZWQsIHdpdGggdGhlIGRhdGEgYXQgdGhhdAorICogVVJJIGNvbnNpc3Rpbmcgb2YgYSBjb21wbGljYXRlZCBzdHJ1Y3R1cmUgdGhhdCBvbmx5IG90aGVyIGFwcGxpY2F0aW9ucyB3aXRoCisgKiBkaXJlY3Qga25vd2xlZGdlIG9mIHRoZSBzdHJ1Y3R1cmUgY2FuIHVzZS4KKyAqCisgKiA8cD5Gb3IgYXBwbGljYXRpb25zIHRoYXQgZG8gbm90IGhhdmUgaW50cmluc2ljIGtub3dsZWRnZSBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmUsCisgKiB0aGUgY29udGVudCBwcm92aWRlciBob2xkaW5nIGl0IGNhbiBtYWtlIHRoZSBkYXRhIGF2YWlsYWJsZSBhcyBhbiBhcmJpdHJhcnkKKyAqIG51bWJlciBvZiB0eXBlcyBvZiBkYXRhIHN0cmVhbXMuICBUaGlzIGlzIGRvbmUgYnkgaW1wbGVtZW50aW5nIHRoZQorICogQ29udGVudFByb3ZpZGVyIHtAbGluayBDb250ZW50UHJvdmlkZXIjZ2V0U3RyZWFtVHlwZXMoVXJpLCBTdHJpbmcpfSBhbmQKKyAqIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlblR5cGVkQXNzZXRGaWxlKFVyaSwgU3RyaW5nLCBhbmRyb2lkLm9zLkJ1bmRsZSl9CisgKiBtZXRob2RzLgorICoKKyAqIDxwPkdvaW5nIGJhY2sgdG8gb3VyIHNpbXBsZSBOb3RlUGFkIGFwcGxpY2F0aW9uLCB0aGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbgorICogaXQgbWF5IGhhdmUgdG8gY29udmVydCBhIHNpbmdsZSBub3RlIFVSSSAoY29uc2lzdGluZyBvZiBhIHRpdGxlIGFuZCB0aGUgbm90ZQorICogdGV4dCkgaW50byBhIHN0cmVhbSBvZiBwbGFpbiB0ZXh0IGRhdGEuCisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZVBhZFByb3ZpZGVyLmphdmEKKyAqICAgICAgc3RyZWFtfQorICoKKyAqIDxwPlRoZSBjb3B5IG9wZXJhdGlvbiBpbiBvdXIgTm90ZVBhZCBhcHBsaWNhdGlvbiBpcyBub3cganVzdCBhIHNpbXBsZSBtYXR0ZXIKKyAqIG9mIG1ha2luZyBhIGNsaXAgY29udGFpbmluZyB0aGUgVVJJIG9mIHRoZSBub3RlIGJlaW5nIGNvcGllZDoKKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3Rlc0xpc3QuamF2YQorICogICAgICBjb3B5fQorICoKKyAqIDxwPk5vdGUgaWYgYSBwYXN0ZSBvcGVyYXRpb24gbmVlZHMgdGhpcyBjbGlwIGFzIHRleHQgKGZvciBleGFtcGxlIHRvIHBhc3RlCisgKiBpbnRvIGFuIGVkaXRvciksIHRoZW4ge0BsaW5rIEl0ZW0jY29lcmNlVG9UZXh0KENvbnRleHQpfSB3aWxsIGFzayB0aGUgY29udGVudAorICogcHJvdmlkZXIgZm9yIHRoZSBjbGlwIFVSSSBhcyB0ZXh0IGFuZCBzdWNjZXNzZnVsbHkgcGFzdGUgdGhlIGVudGlyZSBub3RlLgorICovCitwdWJsaWMgY2xhc3MgQ2xpcERhdGEgZXh0ZW5kcyBDbGlwRGVzY3JpcHRpb24geworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNSU1FVFlQRVNfVEVYVF9QTEFJTiA9IG5ldyBTdHJpbmdbXSB7IE1JTUVUWVBFX1RFWFRfUExBSU4gfTsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gTUlNRVRZUEVTX1RFWFRfVVJJTElTVCA9IG5ldyBTdHJpbmdbXSB7IE1JTUVUWVBFX1RFWFRfVVJJTElTVCB9OworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNSU1FVFlQRVNfVEVYVF9JTlRFTlQgPSBuZXcgU3RyaW5nW10geyBNSU1FVFlQRV9URVhUX0lOVEVOVCB9OworCisgICAgZmluYWwgQml0bWFwIG1JY29uOworCisgICAgZmluYWwgQXJyYXlMaXN0PEl0ZW0+IG1JdGVtcyA9IG5ldyBBcnJheUxpc3Q8SXRlbT4oKTsKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aW9uIG9mIGEgc2luZ2xlIGl0ZW0gaW4gYSBDbGlwcGVkRGF0YS4KKyAgICAgKgorICAgICAqIDxwPlRoZSB0eXBlcyB0aGFuIGFuIGluZGl2aWR1YWwgaXRlbSBjYW4gY3VycmVudGx5IGNvbnRhaW4gYXJlOjwvcD4KKyAgICAgKgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+IFRleHQ6IGEgYmFzaWMgc3RyaW5nIG9mIHRleHQuICBUaGlzIGlzIGFjdHVhbGx5IGEgQ2hhclNlcXVlbmNlLAorICAgICAqIHNvIGl0IGNhbiBiZSBmb3JtYXR0ZWQgdGV4dCBzdXBwb3J0ZWQgYnkgY29ycmVzcG9uZGluZyBBbmRyb2lkIGJ1aWx0LWluCisgICAgICogc3R5bGUgc3BhbnMuICAoQ3VzdG9tIGFwcGxpY2F0aW9uIHNwYW5zIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlCisgICAgICogc3RyaXBwZWQgd2hlbiB0cmFuc3BvcnRpbmcgdGhyb3VnaCB0aGUgY2xpcGJvYXJkLikKKyAgICAgKiA8bGk+IEludGVudDogYW4gYXJiaXRyYXJ5IEludGVudCBvYmplY3QuICBBIHR5cGljYWwgdXNlIGlzIHRoZSBzaG9ydGN1dAorICAgICAqIHRvIGNyZWF0ZSB3aGVuIHBhc3RpbmcgYSBjbGlwcGVkIGl0ZW0gb24gdG8gdGhlIGhvbWUgc2NyZWVuLgorICAgICAqIDxsaT4gVXJpOiBhIFVSSSByZWZlcmVuY2UuICBUaGlzIG1heSBiZSBhbnkgVVJJIChzdWNoIGFzIGFuIGh0dHA6IFVSSQorICAgICAqIHJlcHJlc2VudGluZyBhIGJvb2ttYXJrKSwgaG93ZXZlciBpdCBpcyBvZnRlbiBhIGNvbnRlbnQ6IFVSSS4gIFVzaW5nCisgICAgICogY29udGVudCBwcm92aWRlciByZWZlcmVuY2VzIGFzIGNsaXBzIGxpa2UgdGhpcyBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8KKyAgICAgKiBzaGFyZSBjb21wbGV4IG9yIGxhcmdlIGNsaXBzIHRocm91Z2ggdGhlIHN0YW5kYXJkIGNvbnRlbnQgcHJvdmlkZXIKKyAgICAgKiBmYWNpbGl0aWVzLgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJdGVtIHsKKyAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlIG1UZXh0OworICAgICAgICBmaW5hbCBJbnRlbnQgbUludGVudDsKKyAgICAgICAgZmluYWwgVXJpIG1Vcmk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBJdGVtIGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUgYmxvY2sgb2YgKHBvc3NpYmx5IHN0eWxlZCkgdGV4dC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJdGVtKENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgICAgICAgICBtSW50ZW50ID0gbnVsbDsKKyAgICAgICAgICAgIG1VcmkgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBJdGVtIGNvbnNpc3Rpbmcgb2YgYW4gYXJiaXRyYXJ5IEludGVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJdGVtKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIG1UZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIG1JbnRlbnQgPSBpbnRlbnQ7CisgICAgICAgICAgICBtVXJpID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYW4gSXRlbSBjb25zaXN0aW5nIG9mIGFuIGFyYml0cmFyeSBVUkkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSXRlbShVcmkgdXJpKSB7CisgICAgICAgICAgICBtVGV4dCA9IG51bGw7CisgICAgICAgICAgICBtSW50ZW50ID0gbnVsbDsKKyAgICAgICAgICAgIG1VcmkgPSB1cmk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgY29tcGxleCBJdGVtLCBjb250YWluaW5nIG11bHRpcGxlIHJlcHJlc2VudGF0aW9ucyBvZgorICAgICAgICAgKiB0ZXh0LCBpbnRlbnQsIGFuZC9vciBVUkkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSXRlbShDaGFyU2VxdWVuY2UgdGV4dCwgSW50ZW50IGludGVudCwgVXJpIHVyaSkgeworICAgICAgICAgICAgbVRleHQgPSB0ZXh0OworICAgICAgICAgICAgbUludGVudCA9IGludGVudDsKKyAgICAgICAgICAgIG1VcmkgPSB1cmk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0cmlldmUgdGhlIHJhdyB0ZXh0IGNvbnRhaW5lZCBpbiB0aGlzIEl0ZW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVRleHQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0cmlldmUgdGhlIHJhdyBJbnRlbnQgY29udGFpbmVkIGluIHRoaXMgSXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJbnRlbnQgZ2V0SW50ZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1JbnRlbnQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0cmlldmUgdGhlIHJhdyBVUkkgY29udGFpbmVkIGluIHRoaXMgSXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBVcmkgZ2V0VXJpKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Vcmk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVHVybiB0aGlzIGl0ZW0gaW50byB0ZXh0LCByZWdhcmRsZXNzIG9mIHRoZSB0eXBlIG9mIGRhdGEgaXQKKyAgICAgICAgICogYWN0dWFsbHkgY29udGFpbnMuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRoZSBhbGdvcml0aG0gZm9yIGRlY2lkaW5nIHdoYXQgdGV4dCB0byByZXR1cm4gaXM6CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPiBJZiB7QGxpbmsgI2dldFRleHR9IGlzIG5vbi1udWxsLCByZXR1cm4gdGhhdC4KKyAgICAgICAgICogPGxpPiBJZiB7QGxpbmsgI2dldFVyaX0gaXMgbm9uLW51bGwsIHRyeSB0byByZXRyaWV2ZSBpdHMgZGF0YQorICAgICAgICAgKiBhcyBhIHRleHQgc3RyZWFtIGZyb20gaXRzIGNvbnRlbnQgcHJvdmlkZXIuICBJZiB0aGlzIHN1Y2NlZWRzLCBjb3B5CisgICAgICAgICAqIHRoZSB0ZXh0IGludG8gYSBTdHJpbmcgYW5kIHJldHVybiBpdC4gIElmIGl0IGlzIG5vdCBhIGNvbnRlbnQ6IFVSSSBvcgorICAgICAgICAgKiB0aGUgY29udGVudCBwcm92aWRlciBkb2VzIG5vdCBzdXBwbHkgYSB0ZXh0IHJlcHJlc2VudGF0aW9uLCByZXR1cm4KKyAgICAgICAgICogdGhlIHJhdyBVUkkgYXMgYSBzdHJpbmcuCisgICAgICAgICAqIDxsaT4gSWYge0BsaW5rICNnZXRJbnRlbnR9IGlzIG5vbi1udWxsLCBjb252ZXJ0IHRoYXQgdG8gYW4gaW50ZW50OgorICAgICAgICAgKiBVUkkgYW5kIHJldHVybml0LgorICAgICAgICAgKiA8bGk+IE90aGVyd2lzZSwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNhbGxlcidzIENvbnRleHQsIGZyb20gd2hpY2ggaXRzIENvbnRlbnRSZXNvbHZlcgorICAgICAgICAgKiBhbmQgb3RoZXIgdGhpbmdzIGNhbiBiZSByZXRyaWV2ZWQuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXRlbSdzIHRleHR1YWwgcmVwcmVzZW50YXRpb24uCisgICAgICAgICAqLworLy9CRUdJTl9JTkNMVURFKGNvZXJjZVRvVGV4dCkKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBjb2VyY2VUb1RleHQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICAvLyBJZiB0aGlzIEl0ZW0gaGFzIGFuIGV4cGxpY2l0IHRleHR1YWwgdmFsdWUsIHNpbXBseSByZXR1cm4gdGhhdC4KKyAgICAgICAgICAgIGlmIChtVGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1UZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB0aGlzIEl0ZW0gaGFzIGEgVVJJIHZhbHVlLCB0cnkgdXNpbmcgdGhhdC4KKyAgICAgICAgICAgIGlmIChtVXJpICE9IG51bGwpIHsKKworICAgICAgICAgICAgICAgIC8vIEZpcnN0IHNlZSBpZiB0aGUgVVJJIGNhbiBiZSBvcGVuZWQgYXMgYSBwbGFpbiB0ZXh0IHN0cmVhbQorICAgICAgICAgICAgICAgIC8vIChvZiBhbnkgc3ViLXR5cGUpLiAgSWYgc28sIHRoaXMgaXMgdGhlIGJlc3QgdGV4dHVhbAorICAgICAgICAgICAgICAgIC8vIHJlcHJlc2VudGF0aW9uIGZvciBpdC4KKyAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBBc2sgZm9yIGEgc3RyZWFtIG9mIHRoZSBkZXNpcmVkIHR5cGUuCisgICAgICAgICAgICAgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgZGVzY3IgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IobVVyaSwgInRleHQvKiIsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBkZXNjci5jcmVhdGVJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtLCAiVVRGLTgiKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBHb3QgaXQuLi4gIGNvcHkgdGhlIHN0cmVhbSBpbnRvIGEgbG9jYWwgc3RyaW5nIGFuZCByZXR1cm4gaXQuCisgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7CisgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcls4MTkyXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChsZW49cmVhZGVyLnJlYWQoYnVmZmVyKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChidWZmZXIsIDAsIGxlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFVuYWJsZSB0byBvcGVuIGNvbnRlbnQgVVJJIGFzIHRleHQuLi4gIG5vdCByZWFsbHkgYW4KKyAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IsIGp1c3Qgc29tZXRoaW5nIHRvIGlnbm9yZS4KKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU29tZXRoaW5nIGJhZCBoYXMgaGFwcGVuZWQuCisgICAgICAgICAgICAgICAgICAgIExvZy53KCJDbGlwcGVkRGF0YSIsICJGYWlsdXJlIGxvYWRpbmcgdGV4dCIsIGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS50b1N0cmluZygpOworCisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSWYgd2UgY291bGRuJ3Qgb3BlbiB0aGUgVVJJIGFzIGEgc3RyZWFtLCB0aGVuIHRoZSBVUkkgaXRzZWxmCisgICAgICAgICAgICAgICAgLy8gcHJvYmFibHkgc2VydmVzIGZhaXJseSB3ZWxsIGFzIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICAgICAgICByZXR1cm4gbVVyaS50b1N0cmluZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGaW5hbGx5LCBpZiBhbGwgd2UgaGF2ZSBpcyBhbiBJbnRlbnQsIHRoZW4gd2UgY2FuIGp1c3QgdHVybiB0aGF0CisgICAgICAgICAgICAvLyBpbnRvIHRleHQuICBOb3QgdGhlIG1vc3QgdXNlci1mcmllbmRseSB0aGluZywgYnV0IGl0J3Mgc29tZXRoaW5nLgorICAgICAgICAgICAgaWYgKG1JbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtSW50ZW50LnRvVXJpKEludGVudC5VUklfSU5URU5UX1NDSEVNRSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNob3VsZG4ndCBnZXQgaGVyZSwgYnV0IGp1c3QgaW4gY2FzZS4uLgorICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisvL0VORF9JTkNMVURFKGNvZXJjZVRvVGV4dCkKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgY2xpcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsYWJlbCBMYWJlbCB0byBzaG93IHRvIHRoZSB1c2VyIGRlc2NyaWJpbmcgdGhpcyBjbGlwLgorICAgICAqIEBwYXJhbSBtaW1lVHlwZXMgQW4gYXJyYXkgb2YgTUlNRSB0eXBlcyB0aGlzIGRhdGEgaXMgYXZhaWxhYmxlIGFzLgorICAgICAqIEBwYXJhbSBpY29uIEJpdG1hcCBwcm92aWRpbmcgdGhlIHVzZXIgd2l0aCBhbiBpY29uaW5nIHJlcHJlc2VudGF0aW9uIG9mCisgICAgICogdGhlIGNsaXAuCisgICAgICogQHBhcmFtIGl0ZW0gVGhlIGNvbnRlbnRzIG9mIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBjbGlwLgorICAgICAqLworICAgIHB1YmxpYyBDbGlwRGF0YShDaGFyU2VxdWVuY2UgbGFiZWwsIFN0cmluZ1tdIG1pbWVUeXBlcywgQml0bWFwIGljb24sIEl0ZW0gaXRlbSkgeworICAgICAgICBzdXBlcihsYWJlbCwgbWltZVR5cGVzKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJpdGVtIGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBtSWNvbiA9IGljb247CisgICAgICAgIG1JdGVtcy5hZGQoaXRlbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IENsaXBEYXRhIGhvbGRpbmcgZGF0YSBvZiB0aGUgdHlwZSB7QGxpbmsgI01JTUVUWVBFX1RFWFRfUExBSU59LgorICAgICAqCisgICAgICogQHBhcmFtIGxhYmVsIFVzZXItdmlzaWJsZSBsYWJlbCBmb3IgdGhlIGNsaXAgZGF0YS4KKyAgICAgKiBAcGFyYW0gaWNvbiBJY29uaWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsaXAgZGF0YS4KKyAgICAgKiBAcGFyYW0gdGV4dCBUaGUgYWN0dWFsIHRleHQgaW4gdGhlIGNsaXAuCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IENsaXBEYXRhIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBkYXRhLgorICAgICAqLworICAgIHN0YXRpYyBwdWJsaWMgQ2xpcERhdGEgbmV3UGxhaW5UZXh0KENoYXJTZXF1ZW5jZSBsYWJlbCwgQml0bWFwIGljb24sIENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgIEl0ZW0gaXRlbSA9IG5ldyBJdGVtKHRleHQpOworICAgICAgICByZXR1cm4gbmV3IENsaXBEYXRhKGxhYmVsLCBNSU1FVFlQRVNfVEVYVF9QTEFJTiwgaWNvbiwgaXRlbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IENsaXBEYXRhIGhvbGRpbmcgYW4gSW50ZW50IHdpdGggTUlNRSB0eXBlIHtAbGluayAjTUlNRVRZUEVfVEVYVF9JTlRFTlR9LgorICAgICAqCisgICAgICogQHBhcmFtIGxhYmVsIFVzZXItdmlzaWJsZSBsYWJlbCBmb3IgdGhlIGNsaXAgZGF0YS4KKyAgICAgKiBAcGFyYW0gaWNvbiBJY29uaWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsaXAgZGF0YS4KKyAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBhY3R1YWwgSW50ZW50IGluIHRoZSBjbGlwLgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhIG5ldyBDbGlwRGF0YSBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgZGF0YS4KKyAgICAgKi8KKyAgICBzdGF0aWMgcHVibGljIENsaXBEYXRhIG5ld0ludGVudChDaGFyU2VxdWVuY2UgbGFiZWwsIEJpdG1hcCBpY29uLCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIEl0ZW0gaXRlbSA9IG5ldyBJdGVtKGludGVudCk7CisgICAgICAgIHJldHVybiBuZXcgQ2xpcERhdGEobGFiZWwsIE1JTUVUWVBFU19URVhUX0lOVEVOVCwgaWNvbiwgaXRlbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IENsaXBEYXRhIGhvbGRpbmcgYSBVUkkuICBJZiB0aGUgVVJJIGlzIGEgY29udGVudDogVVJJLAorICAgICAqIHRoaXMgd2lsbCBxdWVyeSB0aGUgY29udGVudCBwcm92aWRlciBmb3IgdGhlIE1JTUUgdHlwZSBvZiBpdHMgZGF0YSBhbmQKKyAgICAgKiB1c2UgdGhhdCBhcyB0aGUgTUlNRSB0eXBlLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIHVzZSB0aGUgTUlNRSB0eXBlCisgICAgICoge0BsaW5rICNNSU1FVFlQRV9URVhUX1VSSUxJU1R9LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc29sdmVyIENvbnRlbnRSZXNvbHZlciB1c2VkIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgVVJJLgorICAgICAqIEBwYXJhbSBsYWJlbCBVc2VyLXZpc2libGUgbGFiZWwgZm9yIHRoZSBjbGlwIGRhdGEuCisgICAgICogQHBhcmFtIGljb24gSWNvbmljIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGlwIGRhdGEuCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIGluIHRoZSBjbGlwLgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhIG5ldyBDbGlwRGF0YSBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgZGF0YS4KKyAgICAgKi8KKyAgICBzdGF0aWMgcHVibGljIENsaXBEYXRhIG5ld1VyaShDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIsIENoYXJTZXF1ZW5jZSBsYWJlbCwKKyAgICAgICAgICAgIEJpdG1hcCBpY29uLCBVcmkgdXJpKSB7CisgICAgICAgIEl0ZW0gaXRlbSA9IG5ldyBJdGVtKHVyaSk7CisgICAgICAgIFN0cmluZ1tdIG1pbWVUeXBlcyA9IG51bGw7CisgICAgICAgIGlmICgiY29udGVudCIuZXF1YWxzKHVyaS5nZXRTY2hlbWUoKSkpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFsVHlwZSA9IHJlc29sdmVyLmdldFR5cGUodXJpKTsKKyAgICAgICAgICAgIG1pbWVUeXBlcyA9IHJlc29sdmVyLmdldFN0cmVhbVR5cGVzKHVyaSwgIiovKiIpOworICAgICAgICAgICAgaWYgKG1pbWVUeXBlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlYWxUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbWltZVR5cGVzID0gbmV3IFN0cmluZ1tdIHsgcmVhbFR5cGUsIE1JTUVUWVBFX1RFWFRfVVJJTElTVCB9OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gdG1wID0gbmV3IFN0cmluZ1ttaW1lVHlwZXMubGVuZ3RoICsgKHJlYWxUeXBlICE9IG51bGwgPyAyIDogMSldOworICAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgICBpZiAocmVhbFR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0bXBbMF0gPSByZWFsVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1pbWVUeXBlcywgMCwgdG1wLCBpLCBtaW1lVHlwZXMubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB0bXBbaSArIG1pbWVUeXBlcy5sZW5ndGhdID0gTUlNRVRZUEVfVEVYVF9VUklMSVNUOworICAgICAgICAgICAgICAgIG1pbWVUeXBlcyA9IHRtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobWltZVR5cGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1pbWVUeXBlcyA9IE1JTUVUWVBFU19URVhUX1VSSUxJU1Q7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBDbGlwRGF0YShsYWJlbCwgbWltZVR5cGVzLCBpY29uLCBpdGVtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgQ2xpcERhdGEgaG9sZGluZyBhbiBVUkkgd2l0aCBNSU1FIHR5cGUge0BsaW5rICNNSU1FVFlQRV9URVhUX1VSSUxJU1R9LgorICAgICAqIFVubGlrZSB7QGxpbmsgI25ld1VyaShDb250ZW50UmVzb2x2ZXIsIENoYXJTZXF1ZW5jZSwgQml0bWFwLCBVcmkpfSwgbm90aGluZworICAgICAqIGlzIGluZmVycmVkIGFib3V0IHRoZSBVUkkgLS0gaWYgaXQgaXMgYSBjb250ZW50OiBVUkkgaG9sZGluZyBhIGJpdG1hcCwKKyAgICAgKiB0aGUgcmVwb3J0ZWQgdHlwZSB3aWxsIHN0aWxsIGJlIHVyaS1saXN0LiAgVXNlIHRoaXMgd2l0aCBjYXJlIQorICAgICAqCisgICAgICogQHBhcmFtIGxhYmVsIFVzZXItdmlzaWJsZSBsYWJlbCBmb3IgdGhlIGNsaXAgZGF0YS4KKyAgICAgKiBAcGFyYW0gaWNvbiBJY29uaWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsaXAgZGF0YS4KKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgaW4gdGhlIGNsaXAuCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IENsaXBEYXRhIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBkYXRhLgorICAgICAqLworICAgIHN0YXRpYyBwdWJsaWMgQ2xpcERhdGEgbmV3UmF3VXJpKENoYXJTZXF1ZW5jZSBsYWJlbCwgQml0bWFwIGljb24sIFVyaSB1cmkpIHsKKyAgICAgICAgSXRlbSBpdGVtID0gbmV3IEl0ZW0odXJpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDbGlwRGF0YShsYWJlbCwgTUlNRVRZUEVTX1RFWFRfVVJJTElTVCwgaWNvbiwgaXRlbSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSXRlbShJdGVtIGl0ZW0pIHsKKyAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJpdGVtIGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBtSXRlbXMuYWRkKGl0ZW0pOworICAgIH0KKworICAgIHB1YmxpYyBCaXRtYXAgZ2V0SWNvbigpIHsKKyAgICAgICAgcmV0dXJuIG1JY29uOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SXRlbUNvdW50KCkgeworICAgICAgICByZXR1cm4gbUl0ZW1zLnNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlbSBnZXRJdGVtKGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gbUl0ZW1zLmdldChpbmRleCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgc3VwZXIud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgIGlmIChtSWNvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KDEpOworICAgICAgICAgICAgbUljb24ud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KDApOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBOID0gbUl0ZW1zLnNpemUoKTsKKyAgICAgICAgZGVzdC53cml0ZUludChOKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgSXRlbSBpdGVtID0gbUl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKGl0ZW0ubVRleHQsIGRlc3QsIGZsYWdzKTsKKyAgICAgICAgICAgIGlmIChpdGVtLm1JbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMSk7CisgICAgICAgICAgICAgICAgaXRlbS5tSW50ZW50LndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlSW50KDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGl0ZW0ubVVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZUludCgxKTsKKyAgICAgICAgICAgICAgICBpdGVtLm1Vcmkud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBDbGlwRGF0YShQYXJjZWwgaW4pIHsKKyAgICAgICAgc3VwZXIoaW4pOworICAgICAgICBpZiAoaW4ucmVhZEludCgpICE9IDApIHsKKyAgICAgICAgICAgIG1JY29uID0gQml0bWFwLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSWNvbiA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IE4gPSBpbi5yZWFkSW50KCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gVGV4dFV0aWxzLkNIQVJfU0VRVUVOQ0VfQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBpbi5yZWFkSW50KCkgIT0gMCA/IEludGVudC5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pIDogbnVsbDsKKyAgICAgICAgICAgIFVyaSB1cmkgPSBpbi5yZWFkSW50KCkgIT0gMCA/IFVyaS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pIDogbnVsbDsKKyAgICAgICAgICAgIG1JdGVtcy5hZGQobmV3IEl0ZW0odGV4dCwgaW50ZW50LCB1cmkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPENsaXBEYXRhPiBDUkVBVE9SID0KKyAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxDbGlwRGF0YT4oKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyBDbGlwRGF0YSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaXBEYXRhKHNvdXJjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBDbGlwRGF0YVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGlwRGF0YVtzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERlc2NyaXB0aW9uLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEZXNjcmlwdGlvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MWZkNWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEZXNjcmlwdGlvbi5haWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK3BhcmNlbGFibGUgQ2xpcERlc2NyaXB0aW9uOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGVzY3JpcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERlc2NyaXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5ZDgwNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERlc2NyaXB0aW9uLmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogTWV0YS1kYXRhIGRlc2NyaWJpbmcgdGhlIGNvbnRlbnRzIG9mIGEge0BsaW5rIENsaXBEYXRhfS4gIFByb3ZpZGVzIGVub3VnaAorICogaW5mb3JtYXRpb24gdG8ga25vdyBpZiB5b3UgY2FuIGhhbmRsZSB0aGUgQ2xpcERhdGEsIGJ1dCBub3QgdGhlIGRhdGEKKyAqIGl0c2VsZi4KKyAqLworcHVibGljIGNsYXNzIENsaXBEZXNjcmlwdGlvbiBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIC8qKgorICAgICAqIFRoZSBNSU1FIHR5cGUgZm9yIGEgY2xpcCBob2xkaW5nIHBsYWluIHRleHQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRVRZUEVfVEVYVF9QTEFJTiA9ICJ0ZXh0L3BsYWluIjsKKworICAgIC8qKgorICAgICAqIFRoZSBNSU1FIHR5cGUgZm9yIGEgY2xpcCBob2xkaW5nIG9uZSBvciBtb3JlIFVSSXMuICBUaGlzIHNob3VsZCBiZQorICAgICAqIHVzZWQgZm9yIFVSSXMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB0byBhIHVzZXIgKHN1Y2ggYXMgYW4gaHR0cDogVVJJKS4KKyAgICAgKiBJdCBzaG91bGQgPGVtPm5vdDwvZW0+IGJlIHVzZWQgZm9yIGEgY29udGVudDogVVJJIHRoYXQgcmVmZXJlbmNlcyBzb21lCisgICAgICogb3RoZXIgcGllY2Ugb2YgZGF0YTsgaW4gdGhhdCBjYXNlIHRoZSBNSU1FIHR5cGUgc2hvdWxkIGJlIHRoZSB0eXBlCisgICAgICogb2YgdGhlIHJlZmVyZW5jZWQgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FVFlQRV9URVhUX1VSSUxJU1QgPSAidGV4dC91cmktbGlzdCI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgTUlNRSB0eXBlIGZvciBhIGNsaXAgaG9sZGluZyBhbiBJbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRVRZUEVfVEVYVF9JTlRFTlQgPSAidGV4dC92bmQuYW5kcm9pZC5pbnRlbnQiOworCisgICAgZmluYWwgQ2hhclNlcXVlbmNlIG1MYWJlbDsKKyAgICBmaW5hbCBTdHJpbmdbXSBtTWltZVR5cGVzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGNsaXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFiZWwgTGFiZWwgdG8gc2hvdyB0byB0aGUgdXNlciBkZXNjcmliaW5nIHRoaXMgY2xpcC4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGVzIEFuIGFycmF5IG9mIE1JTUUgdHlwZXMgdGhpcyBkYXRhIGlzIGF2YWlsYWJsZSBhcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpcERlc2NyaXB0aW9uKENoYXJTZXF1ZW5jZSBsYWJlbCwgU3RyaW5nW10gbWltZVR5cGVzKSB7CisgICAgICAgIGlmIChtaW1lVHlwZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJtaW1lVHlwZXMgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1MYWJlbCA9IGxhYmVsOworICAgICAgICBtTWltZVR5cGVzID0gbWltZVR5cGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGNvcHkgb2YgYSBDbGlwRGVzY3JpcHRpb24uCisgICAgICovCisgICAgcHVibGljIENsaXBEZXNjcmlwdGlvbihDbGlwRGVzY3JpcHRpb24gbykgeworICAgICAgICBtTGFiZWwgPSBvLm1MYWJlbDsKKyAgICAgICAgbU1pbWVUeXBlcyA9IG8ubU1pbWVUeXBlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgdG8gY29tcGFyZSB0d28gTUlNRSB0eXBlcywgd2hlcmUgb25lIG1heSBiZSBhIHBhdHRlcm4uCisgICAgICogQHBhcmFtIGNvbmNyZXRlVHlwZSBBIGZ1bGx5LXNwZWNpZmllZCBNSU1FIHR5cGUuCisgICAgICogQHBhcmFtIGRlc2lyZWRUeXBlIEEgZGVzaXJlZCBNSU1FIHR5cGUgdGhhdCBtYXkgYmUgYSBwYXR0ZXJuIHN1Y2ggYXMgKlwvKi4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIE1JTUUgdHlwZXMgbWF0Y2guCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBhcmVNaW1lVHlwZXMoU3RyaW5nIGNvbmNyZXRlVHlwZSwgU3RyaW5nIGRlc2lyZWRUeXBlKSB7CisgICAgICAgIGZpbmFsIGludCB0eXBlTGVuZ3RoID0gZGVzaXJlZFR5cGUubGVuZ3RoKCk7CisgICAgICAgIGlmICh0eXBlTGVuZ3RoID09IDMgJiYgZGVzaXJlZFR5cGUuZXF1YWxzKCIqLyoiKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgc2xhc2hwb3MgPSBkZXNpcmVkVHlwZS5pbmRleE9mKCcvJyk7CisgICAgICAgIGlmIChzbGFzaHBvcyA+IDApIHsKKyAgICAgICAgICAgIGlmICh0eXBlTGVuZ3RoID09IHNsYXNocG9zKzIgJiYgZGVzaXJlZFR5cGUuY2hhckF0KHNsYXNocG9zKzEpID09ICcqJykgeworICAgICAgICAgICAgICAgIGlmIChkZXNpcmVkVHlwZS5yZWdpb25NYXRjaGVzKDAsIGNvbmNyZXRlVHlwZSwgMCwgc2xhc2hwb3MrMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChkZXNpcmVkVHlwZS5lcXVhbHMoY29uY3JldGVUeXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGFiZWwgZm9yIHRoaXMgY2xpcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldExhYmVsKCkgeworICAgICAgICByZXR1cm4gbUxhYmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGNsaXAgZGVzY3JpcHRpb24gY29udGFpbnMgdGhlIGdpdmVuIE1JTUUgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgZGVzaXJlZCBNSU1FIHR5cGUuICBNYXkgYmUgYSBwYXR0ZXJuLgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIG9uZSBvZiB0aGUgTUlNRSB0eXBlcyBpbiB0aGUgY2xpcCBkZXNjcmlwdGlvbgorICAgICAqIG1hdGNoZXMgdGhlIGRlc2lyZWQgTUlNRSB0eXBlLCBlbHNlIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc01pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICBmb3IgKGludCBpPTA7IGk8bU1pbWVUeXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGNvbXBhcmVNaW1lVHlwZXMobU1pbWVUeXBlc1tpXSwgbWltZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciB0aGUgY2xpcCBkZXNjcmlwdGlvbiBNSU1FIHR5cGVzIGJ5IHRoZSBnaXZlbiBNSU1FIHR5cGUuICBSZXR1cm5zCisgICAgICogYWxsIE1JTUUgdHlwZXMgaW4gdGhlIGNsaXAgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gTUlNRSB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIG1pbWVUeXBlIFRoZSBkZXNpcmVkIE1JTUUgdHlwZS4gIE1heSBiZSBhIHBhdHRlcm4uCisgICAgICogQHJldHVybiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBtYXRjaGluZyBNSU1FIHR5cGVzLiAgSWYgdGhlcmUgYXJlIG5vCisgICAgICogbWF0Y2hpbmcgTUlNRSB0eXBlcywgbnVsbCBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmlsdGVyTWltZVR5cGVzKFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhcnJheSA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxtTWltZVR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY29tcGFyZU1pbWVUeXBlcyhtTWltZVR5cGVzW2ldLCBtaW1lVHlwZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhcnJheSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhcnJheS5hZGQobU1pbWVUeXBlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIHJhd0FycmF5ID0gbmV3IFN0cmluZ1thcnJheS5zaXplKCldOworICAgICAgICBhcnJheS50b0FycmF5KHJhd0FycmF5KTsKKyAgICAgICAgcmV0dXJuIHJhd0FycmF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIE1JTUUgdHlwZXMgdGhlIGNsaXAgaXMgYXZhaWxhYmxlIGluLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWltZVR5cGVDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1NaW1lVHlwZXMubGVuZ3RoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBvbmUgb2YgdGhlIHBvc3NpYmxlIGNsaXAgTUlNRSB0eXBlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gbU1pbWVUeXBlc1tpbmRleF07CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7CisgICAgICAgIGlmIChtTWltZVR5cGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibnVsbCBtaW1lIHR5cGVzIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1NaW1lVHlwZXMubGVuZ3RoIDw9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm11c3QgaGF2ZSBhdCBsZWFzdCAxIG1pbWUgdHlwZSIpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxtTWltZVR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobU1pbWVUeXBlc1tpXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJtaW1lIHR5cGUgYXQgIiArIGkgKyAiIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKG1MYWJlbCwgZGVzdCwgZmxhZ3MpOworICAgICAgICBkZXN0LndyaXRlU3RyaW5nQXJyYXkobU1pbWVUeXBlcyk7CisgICAgfQorCisgICAgQ2xpcERlc2NyaXB0aW9uKFBhcmNlbCBpbikgeworICAgICAgICBtTGFiZWwgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICBtTWltZVR5cGVzID0gaW4uY3JlYXRlU3RyaW5nQXJyYXkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxDbGlwRGVzY3JpcHRpb24+IENSRUFUT1IgPQorICAgICAgICBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPENsaXBEZXNjcmlwdGlvbj4oKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyBDbGlwRGVzY3JpcHRpb24gY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgc291cmNlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGlwRGVzY3JpcHRpb24oc291cmNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIENsaXBEZXNjcmlwdGlvbltdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGlwRGVzY3JpcHRpb25bc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBib2FyZE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYTA2NDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBib2FyZE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDIxMyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogSW50ZXJmYWNlIHRvIHRoZSBjbGlwYm9hcmQgc2VydmljZSwgZm9yIHBsYWNpbmcgYW5kIHJldHJpZXZpbmcgdGV4dCBpbgorICogdGhlIGdsb2JhbCBjbGlwYm9hcmQuCisgKgorICogPHA+CisgKiBZb3UgZG8gbm90IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MgZGlyZWN0bHk7IGluc3RlYWQsIHJldHJpZXZlIGl0IHRocm91Z2gKKyAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNnZXRTeXN0ZW1TZXJ2aWNlfS4KKyAqCisgKiA8cD4KKyAqIFRoZSBDbGlwYm9hcmRNYW5hZ2VyIEFQSSBpdHNlbGYgaXMgdmVyeSBzaW1wbGU6IGl0IGNvbnNpc3RzIG9mIG1ldGhvZHMKKyAqIHRvIGF0b21pY2FsbHkgZ2V0IGFuZCBzZXQgdGhlIGN1cnJlbnQgcHJpbWFyeSBjbGlwYm9hcmQgZGF0YS4gIFRoYXQgZGF0YQorICogaXMgZXhwcmVzc2VkIGFzIGEge0BsaW5rIENsaXBEYXRhfSBvYmplY3QsIHdoaWNoIGRlZmluZXMgdGhlIHByb3RvY29sCisgKiBmb3IgZGF0YSBleGNoYW5nZSBiZXR3ZWVuIGFwcGxpY2F0aW9ucy4KKyAqCisgKiBAc2VlIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2dldFN5c3RlbVNlcnZpY2UKKyAqLworcHVibGljIGNsYXNzIENsaXBib2FyZE1hbmFnZXIgZXh0ZW5kcyBhbmRyb2lkLnRleHQuQ2xpcGJvYXJkTWFuYWdlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgT2JqZWN0IHNTdGF0aWNMb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgc3RhdGljIElDbGlwYm9hcmQgc1NlcnZpY2U7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyPiBtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzCisgICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PE9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXI+KCk7CisKKyAgICBwcml2YXRlIGZpbmFsIElPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLlN0dWIgbVByaW1hcnlDbGlwQ2hhbmdlZFNlcnZpY2VMaXN0ZW5lcgorICAgICAgICAgICAgPSBuZXcgSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuU3R1YigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hQcmltYXJ5Q2xpcENoYW5nZWQoKSB7CisgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19SRVBPUlRfUFJJTUFSWV9DTElQX0NIQU5HRUQpOworICAgICAgICB9CisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JFUE9SVF9QUklNQVJZX0NMSVBfQ0hBTkdFRCA9IDE7CisKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19SRVBPUlRfUFJJTUFSWV9DTElQX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByaW1hcnlDbGlwQ2hhbmdlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciB7CisgICAgICAgIHZvaWQgb25QcmltYXJ5Q2xpcENoYW5nZWQoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBJQ2xpcGJvYXJkIGdldFNlcnZpY2UoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc1N0YXRpY0xvY2spIHsKKyAgICAgICAgICAgIGlmIChzU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNTZXJ2aWNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiY2xpcGJvYXJkIik7CisgICAgICAgICAgICBzU2VydmljZSA9IElDbGlwYm9hcmQuU3R1Yi5hc0ludGVyZmFjZShiKTsKKyAgICAgICAgICAgIHJldHVybiBzU2VydmljZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiB7QGhpZGV9ICovCisgICAgcHVibGljIENsaXBib2FyZE1hbmFnZXIoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGN1cnJlbnQgcHJpbWFyeSBjbGlwIG9uIHRoZSBjbGlwYm9hcmQuICBUaGlzIGlzIHRoZSBjbGlwIHRoYXQKKyAgICAgKiBpcyBpbnZvbHZlZCBpbiBub3JtYWwgY3V0IGFuZCBwYXN0ZSBvcGVyYXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGNsaXAgVGhlIGNsaXBwZWQgZGF0YSBpdGVtIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5Q2xpcChDbGlwRGF0YSBjbGlwKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZXRTZXJ2aWNlKCkuc2V0UHJpbWFyeUNsaXAoY2xpcCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHByaW1hcnkgY2xpcCBvbiB0aGUgY2xpcGJvYXJkLgorICAgICAqLworICAgIHB1YmxpYyBDbGlwRGF0YSBnZXRQcmltYXJ5Q2xpcCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuZ2V0UHJpbWFyeUNsaXAoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50IHByaW1hcnkgY2xpcCBvbiB0aGUgY2xpcGJvYXJkCisgICAgICogYnV0IG5vdCBhIGNvcHkgb2YgaXRzIGRhdGEuCisgICAgICovCisgICAgcHVibGljIENsaXBEZXNjcmlwdGlvbiBnZXRQcmltYXJ5Q2xpcERlc2NyaXB0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldFNlcnZpY2UoKS5nZXRQcmltYXJ5Q2xpcERlc2NyaXB0aW9uKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBjdXJyZW50bHkgYSBwcmltYXJ5IGNsaXAgb24gdGhlIGNsaXBib2FyZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmltYXJ5Q2xpcCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuaGFzUHJpbWFyeUNsaXAoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKE9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgd2hhdCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGlmIChtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmljZSgpLmFkZFByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5Q2xpcENoYW5nZWRTZXJ2aWNlTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVycy5hZGQod2hhdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcihPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIHdoYXQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZSh3aGF0KTsKKyAgICAgICAgICAgIGlmIChtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmljZSgpLnJlbW92ZVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5Q2xpcENoYW5nZWRTZXJ2aWNlTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0UHJpbWFyeUNsaXAoKX0gaW5zdGVhZC4gIFRoaXMgcmV0cmlldmVzCisgICAgICogdGhlIHByaW1hcnkgY2xpcCBhbmQgdHJpZXMgdG8gY29lcmNlIGl0IHRvIGEgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGV4dCgpIHsKKyAgICAgICAgQ2xpcERhdGEgY2xpcCA9IGdldFByaW1hcnlDbGlwKCk7CisgICAgICAgIGlmIChjbGlwICE9IG51bGwgJiYgY2xpcC5nZXRJdGVtQ291bnQoKSA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBjbGlwLmdldEl0ZW0oMCkuY29lcmNlVG9UZXh0KG1Db250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRQcmltYXJ5Q2xpcChDbGlwRGF0YSl9IGluc3RlYWQuICBUaGlzCisgICAgICogY3JlYXRlcyBhIENsaXBwZWRJdGVtIGhvbGRpbmcgdGhlIGdpdmVuIHRleHQgYW5kIHNldHMgaXQgYXMgdGhlCisgICAgICogcHJpbWFyeSBjbGlwLiAgSXQgaGFzIG5vIGxhYmVsIG9yIGljb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGV4dChDaGFyU2VxdWVuY2UgdGV4dCkgeworICAgICAgICBzZXRQcmltYXJ5Q2xpcChDbGlwRGF0YS5uZXdQbGFpblRleHQobnVsbCwgbnVsbCwgdGV4dCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2hhc1ByaW1hcnlDbGlwKCl9IGluc3RlYWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuaGFzUHJpbWFyeUNsaXAoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcmVwb3J0UHJpbWFyeUNsaXBDaGFuZ2VkKCkgeworICAgICAgICBPYmplY3RbXSBsaXN0ZW5lcnM7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMuc2l6ZSgpOworICAgICAgICAgICAgaWYgKE4gPD0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3RlbmVycyA9IG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMudG9BcnJheSgpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgKChPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKWxpc3RlbmVyc1tpXSkub25QcmltYXJ5Q2xpcENoYW5nZWQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IGRjNGU5YzQuLmQzYzFiNGUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXIuamF2YQpAQCAtMjgsMTMgKzI4LDE2IEBACiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogLyoqCkBAIC03Niw2ICs3OSw4IEBACiAgKiBjcm9zcy1wcm9jZXNzIGNhbGxzLjwvcD4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIENvbXBvbmVudENhbGxiYWNrcyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDb250ZW50UHJvdmlkZXIiOworCiAgICAgLyoKICAgICAgKiBOb3RlOiBpZiB5b3UgYWRkIG1ldGhvZHMgdG8gQ29udGVudFByb3ZpZGVyLCB5b3UgbXVzdCBhZGQgc2ltaWxhciBtZXRob2RzIHRvCiAgICAgICogICAgICAgTW9ja0NvbnRlbnRQcm92aWRlci4KQEAgLTI0OSw2ICsyNTQsMTggQEAKICAgICAgICAgICAgIHJldHVybiBDb250ZW50UHJvdmlkZXIudGhpcy5jYWxsKG1ldGhvZCwgcmVxdWVzdCwgYXJncyk7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmksIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgeworICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRQcm92aWRlci50aGlzLmdldFN0cmVhbVR5cGVzKHVyaSwgbWltZVR5cGVGaWx0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJpLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgZW5mb3JjZVJlYWRQZXJtaXNzaW9uKHVyaSk7CisgICAgICAgICAgICByZXR1cm4gQ29udGVudFByb3ZpZGVyLnRoaXMub3BlblR5cGVkQXNzZXRGaWxlKHVyaSwgbWltZVR5cGUsIG9wdHMpOworICAgICAgICB9CisKICAgICAgICAgcHJpdmF0ZSB2b2lkIGVuZm9yY2VSZWFkUGVybWlzc2lvbihVcmkgdXJpKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgdWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKICAgICAgICAgICAgIGlmICh1aWQgPT0gbU15VWlkKSB7CkBAIC03NTAsNiArNzY3LDE0NCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhIGNsaWVudCB0byBkZXRlcm1pbmUgdGhlIHR5cGVzIG9mIGRhdGEgc3RyZWFtcyB0aGF0IHRoaXMKKyAgICAgKiBjb250ZW50IHByb3ZpZGVyIHN1cHBvcnRzIGZvciB0aGUgZ2l2ZW4gVVJJLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgICAgKiByZXR1cm5zIG51bGwsIG1lYW5pbmcgbm8gdHlwZXMuICBJZiB5b3VyIGNvbnRlbnQgcHJvdmlkZXIgc3RvcmVzIGRhdGEKKyAgICAgKiBvZiBhIHBhcnRpY3VsYXIgdHlwZSwgcmV0dXJuIHRoYXQgTUlNRSB0eXBlIGlmIGl0IG1hdGNoZXMgdGhlIGdpdmVuCisgICAgICogbWltZVR5cGVGaWx0ZXIuICBJZiBpdCBjYW4gcGVyZm9ybSB0eXBlIGNvbnZlcnNpb25zLCByZXR1cm4gYW4gYXJyYXkKKyAgICAgKiBvZiBhbGwgc3VwcG9ydGVkIE1JTUUgdHlwZXMgdGhhdCBtYXRjaCBtaW1lVHlwZUZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIGRhdGEgaW4gdGhlIGNvbnRlbnQgcHJvdmlkZXIgYmVpbmcgcXVlcmllZC4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGVGaWx0ZXIgVGhlIHR5cGUgb2YgZGF0YSB0aGUgY2xpZW50IGRlc2lyZXMuICBNYXkgYmUKKyAgICAgKiBhIHBhdHRlcm4sIHN1Y2ggYXMgKlwvKiB0byByZXRyaWV2ZSBhbGwgcG9zc2libGUgZGF0YSB0eXBlcy4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgbnVsbCBpZiB0aGVyZSBhcmUgbm8gcG9zc2libGUgZGF0YSBzdHJlYW1zIGZvciB0aGUKKyAgICAgKiBnaXZlbiBtaW1lVHlwZUZpbHRlci4gIE90aGVyd2lzZSByZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBhdmFpbGFibGUKKyAgICAgKiBjb25jcmV0ZSBNSU1FIHR5cGVzLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0VHlwZShVcmkpCisgICAgICogQHNlZSAjb3BlblR5cGVkQXNzZXRGaWxlKFVyaSwgU3RyaW5nLCBCdW5kbGUpCisgICAgICogQHNlZSBDbGlwRGVzY3JpcHRpb24jY29tcGFyZU1pbWVUeXBlcyhTdHJpbmcsIFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyZWFtVHlwZXMoVXJpIHVyaSwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhIGNsaWVudCB0byBvcGVuIGEgcmVhZC1vbmx5IHN0cmVhbSBjb250YWluaW5nIGRhdGEgb2YgYQorICAgICAqIHBhcnRpY3VsYXIgTUlNRSB0eXBlLiAgVGhpcyBpcyBsaWtlIHtAbGluayAjb3BlbkFzc2V0RmlsZShVcmksIFN0cmluZyl9LAorICAgICAqIGV4Y2VwdCB0aGUgZmlsZSBjYW4gb25seSBiZSByZWFkLW9ubHkgYW5kIHRoZSBjb250ZW50IHByb3ZpZGVyIG1heQorICAgICAqIHBlcmZvcm0gZGF0YSBjb252ZXJzaW9ucyB0byBnZW5lcmF0ZSBkYXRhIG9mIHRoZSBkZXNpcmVkIHR5cGUuCisgICAgICoKKyAgICAgKiA8cD5UaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjb21wYXJlcyB0aGUgZ2l2ZW4gbWltZVR5cGUgYWdhaW5zdCB0aGUKKyAgICAgKiByZXN1bHQgb2Yge0BsaW5rICNnZXRUeXBlKFVyaSl9IGFuZCwgaWYgdGhlIG1hdGNoLCBzaW1wbGUgY2FsbHMKKyAgICAgKiB7QGxpbmsgI29wZW5Bc3NldEZpbGUoVXJpLCBTdHJpbmcpfS4KKyAgICAgKgorICAgICAqIDxwPlNlZSB7QGxpbmsgQ2xpcERhdGF9IGZvciBleGFtcGxlcyBvZiB0aGUgdXNlIGFuZCBpbXBsZW1lbnRhdGlvbgorICAgICAqIG9mIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgZGF0YSBpbiB0aGUgY29udGVudCBwcm92aWRlciBiZWluZyBxdWVyaWVkLgorICAgICAqIEBwYXJhbSBtaW1lVHlwZUZpbHRlciBUaGUgdHlwZSBvZiBkYXRhIHRoZSBjbGllbnQgZGVzaXJlcy4gIE1heSBiZQorICAgICAqIGEgcGF0dGVybiwgc3VjaCBhcyAqXC8qLCBpZiB0aGUgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3BlY2lmaWMgdHlwZQorICAgICAqIHJlcXVpcmVtZW50czsgaW4gdGhpcyBjYXNlIHRoZSBjb250ZW50IHByb3ZpZGVyIHdpbGwgcGljayBpdHMgYmVzdAorICAgICAqIHR5cGUgbWF0Y2hpbmcgdGhlIHBhdHRlcm4uCisgICAgICogQHBhcmFtIG9wdHMgQWRkaXRpb25hbCBvcHRpb25zIGZyb20gdGhlIGNsaWVudC4gIFRoZSBkZWZpbml0aW9ucyBvZgorICAgICAqIHRoZXNlIGFyZSBzcGVjaWZpYyB0byB0aGUgY29udGVudCBwcm92aWRlciBiZWluZyBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgQXNzZXRGaWxlRGVzY3JpcHRvciBmcm9tIHdoaWNoIHRoZSBjbGllbnQgY2FuCisgICAgICogcmVhZCBkYXRhIG9mIHRoZSBkZXNpcmVkIHR5cGUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBUaHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZXJlIGlzCisgICAgICogbm8gZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFVSSSBvciB0aGUgbW9kZSBpcyBpbnZhbGlkLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gVGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIHRoZSBjYWxsZXIgZG9lcworICAgICAqIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSBkYXRhLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlCisgICAgICogY29udGVudCBwcm92aWRlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgTUlNRSB0eXBlLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0U3RyZWFtVHlwZXMoVXJpLCBTdHJpbmcpCisgICAgICogQHNlZSAjb3BlbkFzc2V0RmlsZShVcmksIFN0cmluZykKKyAgICAgKiBAc2VlIENsaXBEZXNjcmlwdGlvbiNjb21wYXJlTWltZVR5cGVzKFN0cmluZywgU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJpLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICgiKi8qIi5lcXVhbHMobWltZVR5cGVGaWx0ZXIpKSB7CisgICAgICAgICAgICAvLyBJZiB0aGV5IGNhbiB0YWtlIGFueXRoaW5nLCB0aGUgdW50eXBlZCBvcGVuIGNhbGwgaXMgZ29vZCBlbm91Z2guCisgICAgICAgICAgICByZXR1cm4gb3BlbkFzc2V0RmlsZSh1cmksICJyIik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGJhc2VUeXBlID0gZ2V0VHlwZSh1cmkpOworICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiBDbGlwRGVzY3JpcHRpb24uY29tcGFyZU1pbWVUeXBlcyhiYXNlVHlwZSwgbWltZVR5cGVGaWx0ZXIpKSB7CisgICAgICAgICAgICAvLyBVc2Ugb2xkIHVudHlwZWQgb3BlbiBjYWxsIGlmIHRoaXMgcHJvdmlkZXIgaGFzIGEgdHlwZSBmb3IgdGhpcworICAgICAgICAgICAgLy8gVVJJIGFuZCBpdCBtYXRjaGVzIHRoZSByZXF1ZXN0LgorICAgICAgICAgICAgcmV0dXJuIG9wZW5Bc3NldEZpbGUodXJpLCAiciIpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkNhbid0IG9wZW4gIiArIHVyaSArICIgYXMgdHlwZSAiICsgbWltZVR5cGVGaWx0ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSB0byB3cml0ZSBhIHN0cmVhbSBvZiBkYXRhIHRvIGEgcGlwZS4gIFVzZSB3aXRoCisgICAgICoge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuUGlwZUhlbHBlcn0uCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBQaXBlRGF0YVdyaXRlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgZnJvbSBhIGJhY2tncm91bmQgdGhyZWFkIHRvIHN0cmVhbSBkYXRhIG91dCB0byBhIHBpcGUuCisgICAgICAgICAqIE5vdGUgdGhhdCB0aGUgcGlwZSBpcyBibG9ja2luZywgc28gdGhpcyB0aHJlYWQgY2FuIGJsb2NrIG9uCisgICAgICAgICAqIHdyaXRlcyBmb3IgYW4gYXJiaXRyYXJ5IGFtb3VudCBvZiB0aW1lIGlmIHRoZSBjbGllbnQgaXMgc2xvdworICAgICAgICAgKiBhdCByZWFkaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb3V0cHV0IFRoZSBwaXBlIHdoZXJlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4uICBUaGlzIHdpbGwgYmUKKyAgICAgICAgICogY2xvc2VkIGZvciB5b3UgdXBvbiByZXR1cm5pbmcgZnJvbSB0aGlzIGZ1bmN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgd2hvc2UgZGF0YSBpcyB0byBiZSB3cml0dGVuLgorICAgICAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIGRlc2lyZWQgdHlwZSBvZiBkYXRhIHRvIGJlIHdyaXR0ZW4uCisgICAgICAgICAqIEBwYXJhbSBvcHRzIE9wdGlvbnMgc3VwcGxpZWQgYnkgY2FsbGVyLgorICAgICAgICAgKiBAcGFyYW0gYXJncyBZb3VyIG93biBjdXN0b20gYXJndW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVEYXRhVG9QaXBlKFBhcmNlbEZpbGVEZXNjcmlwdG9yIG91dHB1dCwgVXJpIHVyaSwgU3RyaW5nIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgIEJ1bmRsZSBvcHRzLCBUIGFyZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgaGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rICNvcGVuVHlwZWRBc3NldEZpbGV9LCBmb3IKKyAgICAgKiBjcmVhdGluZyBhIGRhdGEgcGlwZSBhbmQgYmFja2dyb3VuZCB0aHJlYWQgYWxsb3dpbmcgeW91IHRvIHN0cmVhbQorICAgICAqIGdlbmVyYXRlZCBkYXRhIGJhY2sgdG8gdGhlIGNsaWVudC4gIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG5ldworICAgICAqIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgKHRoZSBjYWxsZXIKKyAgICAgKiBpcyByZXNwb25zaWJsZSBmb3IgY2xvc2luZyBpdCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgd2hvc2UgZGF0YSBpcyB0byBiZSB3cml0dGVuLgorICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgZGVzaXJlZCB0eXBlIG9mIGRhdGEgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gb3B0cyBPcHRpb25zIHN1cHBsaWVkIGJ5IGNhbGxlci4KKyAgICAgKiBAcGFyYW0gYXJncyBZb3VyIG93biBjdXN0b20gYXJndW1lbnRzLgorICAgICAqIEBwYXJhbSBmdW5jIEludGVyZmFjZSBpbXBsZW1lbnRpbmcgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBhY3R1YWxseQorICAgICAqIHN0cmVhbSB0aGUgZGF0YS4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IgaG9sZGluZyB0aGUgcmVhZCBzaWRlIG9mCisgICAgICogdGhlIHBpcGUuICBUaGlzIHNob3VsZCBiZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyIGZvciByZWFkaW5nOyB0aGUgY2FsbGVyCisgICAgICogaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgaXQgd2hlbiBkb25lLgorICAgICAqLworICAgIHB1YmxpYyA8VD4gUGFyY2VsRmlsZURlc2NyaXB0b3Igb3BlblBpcGVIZWxwZXIoZmluYWwgVXJpIHVyaSwgZmluYWwgU3RyaW5nIG1pbWVUeXBlLAorICAgICAgICAgICAgZmluYWwgQnVuZGxlIG9wdHMsIGZpbmFsIFQgYXJncywgZmluYWwgUGlwZURhdGFXcml0ZXI8VD4gZnVuYykKKyAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBmZHMgPSBQYXJjZWxGaWxlRGVzY3JpcHRvci5jcmVhdGVQaXBlKCk7CisKKyAgICAgICAgICAgIEFzeW5jVGFzazxPYmplY3QsIE9iamVjdCwgT2JqZWN0PiB0YXNrID0gbmV3IEFzeW5jVGFzazxPYmplY3QsIE9iamVjdCwgT2JqZWN0PigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvSW5CYWNrZ3JvdW5kKE9iamVjdC4uLiBwYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZnVuYy53cml0ZURhdGFUb1BpcGUoZmRzWzFdLCB1cmksIG1pbWVUeXBlLCBvcHRzLCBhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkc1sxXS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsdXJlIGNsb3NpbmcgcGlwZSIsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0YXNrLmV4ZWN1dGUoKE9iamVjdFtdKW51bGwpOworCisgICAgICAgICAgICByZXR1cm4gZmRzWzBdOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJmYWlsdXJlIG1ha2luZyBwaXBlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnN0YW5jZSBpcyBhIHRlbXBvcmFyeSBjb250ZW50IHByb3ZpZGVyLgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RhbmNlIGlzIGEgdGVtcG9yYXJ5IGNvbnRlbnQgcHJvdmlkZXIKICAgICAgKi8KQEAgLTc3NSw2ICs5MzAsMTEgQEAKICAgICAgKiBAcGFyYW0gaW5mbyBSZWdpc3RlcmVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29udGVudCBwcm92aWRlcgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGF0dGFjaEluZm8oQ29udGV4dCBjb250ZXh0LCBQcm92aWRlckluZm8gaW5mbykgeworICAgICAgICAvKgorICAgICAgICAgKiBXZSBtYXkgYmUgdXNpbmcgQXN5bmNUYXNrIGZyb20gYmluZGVyIHRocmVhZHMuICBNYWtlIGl0IGluaXQgaGVyZQorICAgICAgICAgKiBzbyBpdHMgc3RhdGljIGhhbmRsZXIgaXMgb24gdGhlIG1haW4gdGhyZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgQXN5bmNUYXNrLmluaXQoKTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBPbmx5IGFsbG93IGl0IHRvIGJlIHNldCBvbmNlLCBzbyBhZnRlciB0aGUgY29udGVudCBzZXJ2aWNlIGdpdmVzCkBAIC04MjMsNyArOTgzLDcgQEAKICAgICAvKioKICAgICAgKiBAaGlkZSAtLSB1bnRpbCBpbnRlcmZhY2UgaGFzIHByb3ZlbiBpdHNlbGYKICAgICAgKgotICAgICAqIENhbGwgYW4gcHJvdmlkZXItZGVmaW5lZCBtZXRob2QuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudAorICAgICAqIENhbGwgYSBwcm92aWRlci1kZWZpbmVkIG1ldGhvZC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50CiAgICAgICogaW50ZXJmYWNlcyB0aGF0IGFyZSBjaGVhcGVyIHRoYW4gdXNpbmcgYSBDdXJzb3IuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbWV0aG9kIE1ldGhvZCBuYW1lIHRvIGNhbGwuICBPcGFxdWUgdG8gZnJhbWV3b3JrLgpAQCAtODMzLDQgKzk5MywzMSBAQAogICAgIHB1YmxpYyBCdW5kbGUgY2FsbChTdHJpbmcgbWV0aG9kLCBTdHJpbmcgcmVxdWVzdCwgQnVuZGxlIGFyZ3MpIHsKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoaXMgdG8gc2h1dCBkb3duIHRoZSBDb250ZW50UHJvdmlkZXIgaW5zdGFuY2UuIFlvdSBjYW4gdGhlbgorICAgICAqIGludm9rZSB0aGlzIG1ldGhvZCBpbiB1bml0IHRlc3RzLgorICAgICAqIAorICAgICAqIDxwPgorICAgICAqIEFuZHJvaWQgbm9ybWFsbHkgaGFuZGxlcyBDb250ZW50UHJvdmlkZXIgc3RhcnR1cCBhbmQgc2h1dGRvd24KKyAgICAgKiBhdXRvbWF0aWNhbGx5LiBZb3UgZG8gbm90IG5lZWQgdG8gc3RhcnQgdXAgb3Igc2h1dCBkb3duIGEKKyAgICAgKiBDb250ZW50UHJvdmlkZXIuIFdoZW4geW91IGludm9rZSBhIHRlc3QgbWV0aG9kIG9uIGEgQ29udGVudFByb3ZpZGVyLAorICAgICAqIGhvd2V2ZXIsIGEgQ29udGVudFByb3ZpZGVyIGluc3RhbmNlIGlzIHN0YXJ0ZWQgYW5kIGtlZXBzIHJ1bm5pbmcgYWZ0ZXIKKyAgICAgKiB0aGUgdGVzdCBmaW5pc2hlcywgZXZlbiBpZiBhIHN1Y2NlZWRpbmcgdGVzdCBpbnN0YW50aWF0ZXMgYW5vdGhlcgorICAgICAqIENvbnRlbnRQcm92aWRlci4gQSBjb25mbGljdCBkZXZlbG9wcyBiZWNhdXNlIHRoZSB0d28gaW5zdGFuY2VzIGFyZQorICAgICAqIHVzdWFsbHkgcnVubmluZyBhZ2FpbnN0IHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBzb3VyY2UgKGZvciBleGFtcGxlLCBhbgorICAgICAqIHNxbGl0ZSBkYXRhYmFzZSkuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEltcGxlbWVudGluZyBzaHV0RG93bigpIGF2b2lkcyB0aGlzIGNvbmZsaWN0IGJ5IHByb3ZpZGluZyBhIHdheSB0bworICAgICAqIHRlcm1pbmF0ZSB0aGUgQ29udGVudFByb3ZpZGVyLiBUaGlzIG1ldGhvZCBjYW4gYWxzbyBwcmV2ZW50IG1lbW9yeSBsZWFrcworICAgICAqIGZyb20gbXVsdGlwbGUgaW5zdGFudGlhdGlvbnMgb2YgdGhlIENvbnRlbnRQcm92aWRlciwgYW5kIGl0IGNhbiBlbnN1cmUKKyAgICAgKiB1bml0IHRlc3QgaXNvbGF0aW9uIGJ5IGFsbG93aW5nIHlvdSB0byBjb21wbGV0ZWx5IGNsZWFuIHVwIHRoZSB0ZXN0CisgICAgICogZml4dHVyZSBiZWZvcmUgbW92aW5nIG9uIHRvIHRoZSBuZXh0IHRlc3QuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgeworICAgICAgICBMb2cudyhUQUcsICJpbXBsZW1lbnQgQ29udGVudFByb3ZpZGVyIHNodXRkb3duKCkgdG8gbWFrZSBzdXJlIGFsbCBkYXRhYmFzZSAiICsKKyAgICAgICAgICAgICAgICAiY29ubmVjdGlvbnMgYXJlIGdyYWNlZnVsbHkgc2h1dGRvd24iKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlckNsaWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXJDbGllbnQuamF2YQppbmRleCAwODU4ZWE1Li4wNTQwMTA5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlckNsaWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyQ2xpZW50LmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKQEAgLTQzLDUzICs0NCw3NyBAQAogICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGVudFJlc29sdmVyOwogICAgIH0KIAotICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNxdWVyeX0gKi8KKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjcXVlcnkgQ29udGVudFByb3ZpZGVyLnF1ZXJ5fSAqLwogICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoVXJpIHVybCwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwKICAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5xdWVyeSh1cmwsIHByb2plY3Rpb24sIHNlbGVjdGlvbiwgIHNlbGVjdGlvbkFyZ3MsIHNvcnRPcmRlcik7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2dldFR5cGV9ICovCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2dldFR5cGUgQ29udGVudFByb3ZpZGVyLmdldFR5cGV9ICovCiAgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKFVyaSB1cmwpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5nZXRUeXBlKHVybCk7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2luc2VydH0gKi8KKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjZ2V0U3RyZWFtVHlwZXMgQ29udGVudFByb3ZpZGVyLmdldFN0cmVhbVR5cGVzfSAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5nZXRTdHJlYW1UeXBlcyh1cmwsIG1pbWVUeXBlRmlsdGVyKTsKKyAgICB9CisKKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjaW5zZXJ0IENvbnRlbnRQcm92aWRlci5pbnNlcnR9ICovCiAgICAgcHVibGljIFVyaSBpbnNlcnQoVXJpIHVybCwgQ29udGVudFZhbHVlcyBpbml0aWFsVmFsdWVzKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLmluc2VydCh1cmwsIGluaXRpYWxWYWx1ZXMpOwogICAgIH0KIAotICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNidWxrSW5zZXJ0fSAqLworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNidWxrSW5zZXJ0IENvbnRlbnRQcm92aWRlci5idWxrSW5zZXJ0fSAqLwogICAgIHB1YmxpYyBpbnQgYnVsa0luc2VydChVcmkgdXJsLCBDb250ZW50VmFsdWVzW10gaW5pdGlhbFZhbHVlcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLmJ1bGtJbnNlcnQodXJsLCBpbml0aWFsVmFsdWVzKTsKICAgICB9CiAKLSAgICAvKiogc2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjZGVsZXRlfSAqLworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNkZWxldGUgQ29udGVudFByb3ZpZGVyLmRlbGV0ZX0gKi8KICAgICBwdWJsaWMgaW50IGRlbGV0ZShVcmkgdXJsLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLmRlbGV0ZSh1cmwsIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncyk7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI3VwZGF0ZX0gKi8KKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjdXBkYXRlIENvbnRlbnRQcm92aWRlci51cGRhdGV9ICovCiAgICAgcHVibGljIGludCB1cGRhdGUoVXJpIHVybCwgQ29udGVudFZhbHVlcyB2YWx1ZXMsIFN0cmluZyBzZWxlY3Rpb24sCiAgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIudXBkYXRlKHVybCwgdmFsdWVzLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MpOwogICAgIH0KIAotICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuRmlsZX0gKi8KKyAgICAvKioKKyAgICAgKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuRmlsZSBDb250ZW50UHJvdmlkZXIub3BlbkZpbGV9LiAgTm90ZSB0aGF0CisgICAgICogdGhpcyA8ZW0+ZG9lcyBub3Q8L2VtPgorICAgICAqIHRha2UgY2FyZSBvZiBub24tY29udGVudDogVVJJcyBzdWNoIGFzIGZpbGU6LiAgSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQKKyAgICAgKiB5b3UgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyI29wZW5GaWxlRGVzY3JpcHRvcgorICAgICAqIENvbnRlbnRSZXNvbHZlci5vcGVuRmlsZURlc2NyaXB0b3J9IEFQSSBpbnN0ZWFkLgorICAgICAqLwogICAgIHB1YmxpYyBQYXJjZWxGaWxlRGVzY3JpcHRvciBvcGVuRmlsZShVcmkgdXJsLCBTdHJpbmcgbW9kZSkKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLm9wZW5GaWxlKHVybCwgbW9kZSk7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5Bc3NldEZpbGV9ICovCisgICAgLyoqCisgICAgICogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlbkFzc2V0RmlsZSBDb250ZW50UHJvdmlkZXIub3BlbkFzc2V0RmlsZX0uCisgICAgICogTm90ZSB0aGF0IHRoaXMgPGVtPmRvZXMgbm90PC9lbT4KKyAgICAgKiB0YWtlIGNhcmUgb2Ygbm9uLWNvbnRlbnQ6IFVSSXMgc3VjaCBhcyBmaWxlOi4gIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkCisgICAgICogeW91IHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlciNvcGVuQXNzZXRGaWxlRGVzY3JpcHRvcgorICAgICAqIENvbnRlbnRSZXNvbHZlci5vcGVuQXNzZXRGaWxlRGVzY3JpcHRvcn0gQVBJIGluc3RlYWQuCisgICAgICovCiAgICAgcHVibGljIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlbkFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbW9kZSkKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLm9wZW5Bc3NldEZpbGUodXJsLCBtb2RlKTsKICAgICB9CiAKLSAgICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2FwcGx5QmF0Y2h9ICovCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5UeXBlZEFzc2V0RmlsZSBDb250ZW50UHJvdmlkZXIub3BlblR5cGVkQXNzZXRGaWxlfSAqLworICAgIHB1YmxpYyBmaW5hbCBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IoVXJpIHVyaSwKKyAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG9wdHMpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5vcGVuVHlwZWRBc3NldEZpbGUodXJpLCBtaW1lVHlwZSwgb3B0cyk7CisgICAgfQorCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2FwcGx5QmF0Y2ggQ29udGVudFByb3ZpZGVyLmFwcGx5QmF0Y2h9ICovCiAgICAgcHVibGljIENvbnRlbnRQcm92aWRlclJlc3VsdFtdIGFwcGx5QmF0Y2goQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4gb3BlcmF0aW9ucykKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIE9wZXJhdGlvbkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIuYXBwbHlCYXRjaChvcGVyYXRpb25zKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyTmF0aXZlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlck5hdGl2ZS5qYXZhCmluZGV4IGZkYjNkMjAuLmQxYWI4ZDUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyTmF0aXZlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXJOYXRpdmUuamF2YQpAQCAtMjU3LDYgKzI1NywzOCBAQAogICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZUJ1bmRsZShyZXNwb25zZUJ1bmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgR0VUX1NUUkVBTV9UWVBFU19UUkFOU0FDVElPTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQ29udGVudFByb3ZpZGVyLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgICAgICBVcmkgdXJsID0gVXJpLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlRmlsdGVyID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHR5cGVzID0gZ2V0U3RyZWFtVHlwZXModXJsLCBtaW1lVHlwZUZpbHRlcik7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmdBcnJheSh0eXBlcyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBPUEVOX1RZUEVEX0FTU0VUX0ZJTEVfVFJBTlNBQ1RJT046CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUNvbnRlbnRQcm92aWRlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgVXJpIHVybCA9IFVyaS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IGRhdGEucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBCdW5kbGUgb3B0cyA9IGRhdGEucmVhZEJ1bmRsZSgpOworCisgICAgICAgICAgICAgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgZmQ7CisgICAgICAgICAgICAgICAgICAgIGZkID0gb3BlblR5cGVkQXNzZXRGaWxlKHVybCwgbWltZVR5cGUsIG9wdHMpOworICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZUludCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkLndyaXRlVG9QYXJjZWwocmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgRGF0YWJhc2VVdGlscy53cml0ZUV4Y2VwdGlvblRvUGFyY2VsKHJlcGx5LCBlKTsKQEAgLTU2OCw1ICs2MDAsNTAgQEAKICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKICAgICB9CiAKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyZWFtVHlwZXMoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOworCisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29udGVudFByb3ZpZGVyLmRlc2NyaXB0b3IpOworCisgICAgICAgIHVybC53cml0ZVRvUGFyY2VsKGRhdGEsIDApOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nKG1pbWVUeXBlRmlsdGVyKTsKKworICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KElDb250ZW50UHJvdmlkZXIuR0VUX1NUUkVBTV9UWVBFU19UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOworCisgICAgICAgIERhdGFiYXNlVXRpbHMucmVhZEV4Y2VwdGlvbkZyb21QYXJjZWwocmVwbHkpOworICAgICAgICBTdHJpbmdbXSBvdXQgPSByZXBseS5jcmVhdGVTdHJpbmdBcnJheSgpOworCisgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgICAgICByZXBseS5yZWN5Y2xlKCk7CisKKyAgICAgICAgcmV0dXJuIG91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGUoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CisKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb250ZW50UHJvdmlkZXIuZGVzY3JpcHRvcik7CisKKyAgICAgICAgdXJsLndyaXRlVG9QYXJjZWwoZGF0YSwgMCk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcobWltZVR5cGUpOworICAgICAgICBkYXRhLndyaXRlQnVuZGxlKG9wdHMpOworCisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoSUNvbnRlbnRQcm92aWRlci5PUEVOX1RZUEVEX0FTU0VUX0ZJTEVfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKKworICAgICAgICBEYXRhYmFzZVV0aWxzLnJlYWRFeGNlcHRpb25XaXRoRmlsZU5vdEZvdW5kRXhjZXB0aW9uRnJvbVBhcmNlbChyZXBseSk7CisgICAgICAgIGludCBoYXMgPSByZXBseS5yZWFkSW50KCk7CisgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgZmQgPSBoYXMgIT0gMAorICAgICAgICAgICAgICAgID8gQXNzZXRGaWxlRGVzY3JpcHRvci5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocmVwbHkpIDogbnVsbDsKKworICAgICAgICBkYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgcmVwbHkucmVjeWNsZSgpOworCisgICAgICAgIHJldHVybiBmZDsKKyAgICB9CisKICAgICBwcml2YXRlIElCaW5kZXIgbVJlbW90ZTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFF1ZXJ5TWFwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRRdWVyeU1hcC5qYXZhCmluZGV4IGRiY2I0YTcuLmM5NTUwOTQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFF1ZXJ5TWFwLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UXVlcnlNYXAuamF2YQpAQCAtMTI5LDcgKzEyOSw5IEBACiAgICAgLyoqIFJlcXVlcmllcyB0aGUgY3Vyc29yIGFuZCByZWFkcyB0aGUgY29udGVudHMgaW50byB0aGUgY2FjaGUgKi8KICAgICBwdWJsaWMgdm9pZCByZXF1ZXJ5KCkgewogICAgICAgICBtRGlydHkgPSBmYWxzZTsKLSAgICAgICAgbUN1cnNvci5yZXF1ZXJ5KCk7CisgICAgICAgIGlmICghbUN1cnNvci5yZXF1ZXJ5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRyeWluZyB0byByZXF1ZXJ5IGFuIGFscmVhZHkgY2xvc2VkIGN1cnNvciIpOworICAgICAgICB9CiAgICAgICAgIHJlYWRDdXJzb3JJbnRvQ2FjaGUoKTsKICAgICAgICAgc2V0Q2hhbmdlZCgpOwogICAgICAgICBub3RpZnlPYnNlcnZlcnMoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlci5qYXZhCmluZGV4IDY5Zjc2MTEuLjIyZmViOWEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXIuamF2YQpAQCAtNDQsOSArNDQsOSBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogCiAvKioKQEAgLTE4Niw4ICsxODYsNyBAQAogICAgICAqIHVzaW5nIHRoZSBjb250ZW50Oi8vIHNjaGVtZS4KICAgICAgKiBAcmV0dXJuIEEgTUlNRSB0eXBlIGZvciB0aGUgY29udGVudCwgb3IgbnVsbCBpZiB0aGUgVVJMIGlzIGludmFsaWQgb3IgdGhlIHR5cGUgaXMgdW5rbm93bgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHlwZShVcmkgdXJsKQotICAgIHsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFR5cGUoVXJpIHVybCkgewogICAgICAgICBJQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gYWNxdWlyZVByb3ZpZGVyKHVybCk7CiAgICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTIwNCw2ICsyMDMsMzkgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBRdWVyeSBmb3IgdGhlIHBvc3NpYmxlIE1JTUUgdHlwZXMgZm9yIHRoZSByZXByZXNlbnRhdGlvbnMgdGhlIGdpdmVuCisgICAgICogY29udGVudCBVUkwgY2FuIGJlIHJldHVybmVkIHdoZW4gb3BlbmVkIGFzIGFzIHN0cmVhbSB3aXRoCisgICAgICoge0BsaW5rICNvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yfS4gIE5vdGUgdGhhdCB0aGUgdHlwZXMgaGVyZSBhcmUKKyAgICAgKiBub3QgbmVjZXNzYXJpbHkgYSBzdXBlcnNldCBvZiB0aGUgdHlwZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGV9IC0tCisgICAgICogbWFueSBjb250ZW50IHByb3ZpZGVycyBjYW4gbm90IHJldHVybiBhIHJhdyBzdHJlYW0gZm9yIHRoZSBzdHJ1Y3R1cmVkCisgICAgICogZGF0YSB0aGF0IHRoZXkgY29udGFpbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgQSBVcmkgaWRlbnRpZnlpbmcgY29udGVudCAoZWl0aGVyIGEgbGlzdCBvciBzcGVjaWZpYyB0eXBlKSwKKyAgICAgKiB1c2luZyB0aGUgY29udGVudDovLyBzY2hlbWUuCisgICAgICogQHBhcmFtIG1pbWVUeXBlRmlsdGVyIFRoZSBkZXNpcmVkIE1JTUUgdHlwZS4gIFRoaXMgbWF5IGJlIGEgcGF0dGVybiwKKyAgICAgKiBzdWNoIGFzICpcLyosIHRvIHF1ZXJ5IGZvciBhbGwgYXZhaWxhYmxlIE1JTUUgdHlwZXMgdGhhdCBtYXRjaCB0aGUKKyAgICAgKiBwYXR0ZXJuLgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhbiBhcnJheSBvZiBNSU1FIHR5cGUgc3RyaW5ncyBmb3IgYWxsIGF2YWlsYWJsbGUKKyAgICAgKiBkYXRhIHN0cmVhbXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gbWltZVR5cGVGaWx0ZXIuICBJZiB0aGVyZSBhcmUgbm9uZSwKKyAgICAgKiBudWxsIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHsKKyAgICAgICAgSUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGFjcXVpcmVQcm92aWRlcih1cmwpOworICAgICAgICBpZiAocHJvdmlkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5nZXRTdHJlYW1UeXBlcyh1cmwsIG1pbWVUeXBlRmlsdGVyKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVsZWFzZVByb3ZpZGVyKHByb3ZpZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIDxwPgogICAgICAqIFF1ZXJ5IHRoZSBnaXZlbiBVUkksIHJldHVybmluZyBhIHtAbGluayBDdXJzb3J9IG92ZXIgdGhlIHJlc3VsdCBzZXQuCiAgICAgICogPC9wPgpAQCAtMzQ5LDcgKzM4MSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogT3BlbiBhIHJhdyBmaWxlIGRlc2NyaXB0b3IgdG8gYWNjZXNzIGRhdGEgdW5kZXIgYSAiY29udGVudDoiIFVSSS4gIFRoaXMKKyAgICAgKiBPcGVuIGEgcmF3IGZpbGUgZGVzY3JpcHRvciB0byBhY2Nlc3MgZGF0YSB1bmRlciBhIFVSSS4gIFRoaXMKICAgICAgKiBpcyBsaWtlIHtAbGluayAjb3BlbkFzc2V0RmlsZURlc2NyaXB0b3IoVXJpLCBTdHJpbmcpfSwgYnV0IHVzZXMgdGhlCiAgICAgICogdW5kZXJseWluZyB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5GaWxlfQogICAgICAqIENvbnRlbnRQcm92aWRlci5vcGVuRmlsZSgpfSBtZXRob2QsIHNvIHdpbGwgPGVtPm5vdDwvZW0+IHdvcmsgd2l0aApAQCAtMzk5LDEwICs0MzEsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIE9wZW4gYSByYXcgZmlsZSBkZXNjcmlwdG9yIHRvIGFjY2VzcyBkYXRhIHVuZGVyIGEgImNvbnRlbnQ6IiBVUkkuICBUaGlzCisgICAgICogT3BlbiBhIHJhdyBmaWxlIGRlc2NyaXB0b3IgdG8gYWNjZXNzIGRhdGEgdW5kZXIgYSBVUkkuICBUaGlzCiAgICAgICogaW50ZXJhY3RzIHdpdGggdGhlIHVuZGVybHlpbmcge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuQXNzZXRGaWxlfQotICAgICAqIENvbnRlbnRQcm92aWRlci5vcGVuQXNzZXRGaWxlKCl9IG1ldGhvZCBvZiB0aGUgcHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgICAqIGdpdmVuIFVSSSwgdG8gcmV0cmlldmUgYW55IGZpbGUgc3RvcmVkIHRoZXJlLgorICAgICAqIG1ldGhvZCBvZiB0aGUgcHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBVUkksIHRvIHJldHJpZXZlIGFueSBmaWxlIHN0b3JlZCB0aGVyZS4KICAgICAgKgogICAgICAqIDxoNT5BY2NlcHRzIHRoZSBmb2xsb3dpbmcgVVJJIHNjaGVtZXM6PC9oNT4KICAgICAgKiA8dWw+CkBAIC00MzQsNiArNDY1LDExIEBACiAgICAgICogPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IGlmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciByZWFkLW9ubHkgaW5wdXQgKG1vZGUgaXMgInIiKQorICAgICAqIG9uIGEgY29udGVudDogVVJJLCBpdCB3aWxsIGluc3RlYWQgY2FsbCB7QGxpbmsgI29wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3J9CisgICAgICogZm9yIHlvdSB3aXRoIGEgTUlNRSB0eXBlIG9mICIqXC8qIi4gIFRoaXMgYWxsb3dzIHN1Y2ggY2FsbGVycyB0byBiZW5lZml0CisgICAgICogZnJvbSBhbnkgYnVpbHQtaW4gZGF0YSBjb252ZXJzaW9uIHRoYXQgYSBwcm92aWRlciBpbXBsZW1lbnRzLgorICAgICAqCiAgICAgICogQHBhcmFtIHVyaSBUaGUgZGVzaXJlZCBVUkkgdG8gb3Blbi4KICAgICAgKiBAcGFyYW0gbW9kZSBUaGUgZmlsZSBtb2RlIHRvIHVzZSwgYXMgcGVyIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlbkFzc2V0RmlsZQogICAgICAqIENvbnRlbnRQcm92aWRlci5vcGVuQXNzZXRGaWxlfS4KQEAgLTQ2MCwyOSArNDk2LDk3IEBACiAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKHVyaS5nZXRQYXRoKCkpLCBtb2RlVG9Nb2RlKHVyaSwgbW9kZSkpOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NldEZpbGVEZXNjcmlwdG9yKHBmZCwgMCwgLTEpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGFjcXVpcmVQcm92aWRlcih1cmkpOwotICAgICAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJObyBjb250ZW50IHByb3ZpZGVyOiAiICsgdXJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBmZCA9IHByb3ZpZGVyLm9wZW5Bc3NldEZpbGUodXJpLCBtb2RlKTsKLSAgICAgICAgICAgICAgICBpZihmZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbGVhc2VQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKCJyIi5lcXVhbHMobW9kZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcih1cmksICIqLyoiLCBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgSUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGFjcXVpcmVQcm92aWRlcih1cmkpOworICAgICAgICAgICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIk5vIGNvbnRlbnQgcHJvdmlkZXI6ICIgKyB1cmkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGZkLmdldFBhcmNlbEZpbGVEZXNjcmlwdG9yKCksIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFzc2V0RmlsZURlc2NyaXB0b3IocGZkLCBmZC5nZXRTdGFydE9mZnNldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgZmQuZ2V0RGVjbGFyZWRMZW5ndGgoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgZmQgPSBwcm92aWRlci5vcGVuQXNzZXRGaWxlKHVyaSwgbW9kZSk7CisgICAgICAgICAgICAgICAgICAgIGlmKGZkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VQcm92aWRlcihwcm92aWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZC5nZXRQYXJjZWxGaWxlRGVzY3JpcHRvcigpLCBwcm92aWRlcik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU3VjY2VzcyEgIERvbid0IHJlbGVhc2UgdGhlIHByb3ZpZGVyIHdoZW4gZXhpdGluZywgbGV0CisgICAgICAgICAgICAgICAgICAgIC8vIFBhcmNlbEZpbGVEZXNjcmlwdG9ySW5uZXIgZG8gdGhhdCB3aGVuIGl0IGlzIGNsb3NlZC4KKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXNzZXRGaWxlRGVzY3JpcHRvcihwZmQsIGZkLmdldFN0YXJ0T2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQuZ2V0RGVjbGFyZWRMZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiRGVhZCBjb250ZW50IHByb3ZpZGVyOiAiICsgdXJpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlUHJvdmlkZXIocHJvdmlkZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbiBhIHJhdyBmaWxlIGRlc2NyaXB0b3IgdG8gYWNjZXNzIChwb3RlbnRpYWxseSB0eXBlIHRyYW5zZm9ybWVkKQorICAgICAqIGRhdGEgZnJvbSBhICJjb250ZW50OiIgVVJJLiAgVGhpcyBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZworICAgICAqIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlblR5cGVkQXNzZXRGaWxlfSBtZXRob2Qgb2YgdGhlIHByb3ZpZGVyCisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBVUkksIHRvIHJldHJpZXZlIHJldHJpZXZlIGFueSBhcHByb3ByaWF0ZQorICAgICAqIGRhdGEgc3RyZWFtIGZvciB0aGUgZGF0YSBzdG9yZWQgdGhlcmUuCisgICAgICoKKyAgICAgKiA8cD5Vbmxpa2Uge0BsaW5rICNvcGVuQXNzZXRGaWxlRGVzY3JpcHRvcn0sIHRoaXMgZnVuY3Rpb24gb25seSB3b3JrcworICAgICAqIHdpdGggImNvbnRlbnQ6IiBVUklzLCBiZWNhdXNlIGNvbnRlbnQgcHJvdmlkZXJzIGFyZSB0aGUgb25seSBmYWNpbGl0eQorICAgICAqIHdpdGggYW4gYXNzb2NpYXRlZCBNSU1FIHR5cGUgdG8gZW5zdXJlIHRoYXQgdGhlIHJldHVybmVkIGRhdGEgc3RyZWFtCisgICAgICogaXMgb2YgdGhlIGRlc2lyZWQgdHlwZS4KKyAgICAgKgorICAgICAqIDxwPkFsbCB0ZXh0Lyogc3RyZWFtcyBhcmUgZW5jb2RlZCBpbiBVVEYtOC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIGRlc2lyZWQgVVJJIHRvIG9wZW4uCisgICAgICogQHBhcmFtIG1pbWVUeXBlIFRoZSBkZXNpcmVkIE1JTUUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgZGF0YS4gIFRoaXMgY2FuCisgICAgICogYmUgYSBwYXR0ZXJuIHN1Y2ggYXMgKlwvKiwgd2hpY2ggd2lsbCBhbGxvdyB0aGUgY29udGVudCBwcm92aWRlciB0bworICAgICAqIHNlbGVjdCBhIHR5cGUsIHRob3VnaCB0aGVyZSBpcyBubyB3YXkgZm9yIHlvdSB0byBkZXRlcm1pbmUgd2hhdCB0eXBlCisgICAgICogaXQgaXMgcmV0dXJuaW5nLgorICAgICAqIEBwYXJhbSBvcHRzIEFkZGl0aW9uYWwgcHJvdmlkZXItZGVwZW5kZW50IG9wdGlvbnMuCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZyb20gd2hpY2ggeW91IGNhbiByZWFkIHRoZQorICAgICAqIGRhdGEgc3RyZWFtIGZyb20gdGhlIHByb3ZpZGVyLiAgTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGEgcGlwZSwgbWVhbmluZworICAgICAqIHlvdSBjYW4ndCBzZWVrIGluIGl0LiAgVGhlIG9ubHkgc2VlayB5b3Ugc2hvdWxkIGRvIGlzIGlmIHRoZQorICAgICAqIEFzc2V0RmlsZURlc2NyaXB0b3IgY29udGFpbnMgYW4gb2Zmc2V0LCB0byBtb3ZlIHRvIHRoYXQgb2Zmc2V0IGJlZm9yZQorICAgICAqIHJlYWRpbmcuICBZb3Ugb3duIHRoaXMgZGVzY3JpcHRvciBhbmQgYXJlIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIGl0IHdoZW4gZG9uZS4KKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBUaHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIG9mIG5vCisgICAgICogZGF0YSBvZiB0aGUgZGVzaXJlZCB0eXBlIGV4aXN0cyB1bmRlciB0aGUgVVJJLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IoVXJpIHVyaSwKKyAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG9wdHMpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBJQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gYWNxdWlyZVByb3ZpZGVyKHVyaSk7CisgICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJObyBjb250ZW50IHByb3ZpZGVyOiAiICsgdXJpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBmZCA9IHByb3ZpZGVyLm9wZW5UeXBlZEFzc2V0RmlsZSh1cmksIG1pbWVUeXBlLCBvcHRzKTsKKyAgICAgICAgICAgIGlmIChmZCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmVsZWFzZVByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJEZWFkIGNvbnRlbnQgcHJvdmlkZXI6ICIgKyB1cmkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZCA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyKAorICAgICAgICAgICAgICAgICAgICBmZC5nZXRQYXJjZWxGaWxlRGVzY3JpcHRvcigpLCBwcm92aWRlcik7CisKKyAgICAgICAgICAgIC8vIFN1Y2Nlc3MhICBEb24ndCByZWxlYXNlIHRoZSBwcm92aWRlciB3aGVuIGV4aXRpbmcsIGxldAorICAgICAgICAgICAgLy8gUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lciBkbyB0aGF0IHdoZW4gaXQgaXMgY2xvc2VkLgorICAgICAgICAgICAgcHJvdmlkZXIgPSBudWxsOworCisgICAgICAgICAgICByZXR1cm4gbmV3IEFzc2V0RmlsZURlc2NyaXB0b3IocGZkLCBmZC5nZXRTdGFydE9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICBmZC5nZXREZWNsYXJlZExlbmd0aCgpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkRlYWQgY29udGVudCBwcm92aWRlcjogIiArIHVyaSk7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICByZWxlYXNlUHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZWxlYXNlUHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzQyLDcgKzE0NDYsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ3Vyc29yV3JhcHBlcklubmVyIGV4dGVuZHMgQ3Vyc29yV3JhcHBlciB7Ci0gICAgICAgIHByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBtQ29udGVudFByb3ZpZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIElDb250ZW50UHJvdmlkZXIgbUNvbnRlbnRQcm92aWRlcjsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHPSJDdXJzb3JXcmFwcGVySW5uZXIiOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNsb3NlRmxhZyA9IGZhbHNlOwogCkBAIC0xMzcxLDcgKzE0NzUsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lciBleHRlbmRzIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHsKLSAgICAgICAgcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIG1Db250ZW50UHJvdmlkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgSUNvbnRlbnRQcm92aWRlciBtQ29udGVudFByb3ZpZGVyOwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUc9IlBhcmNlbEZpbGVEZXNjcmlwdG9ySW5uZXIiOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJlbGVhc2VQcm92aWRlckZsYWcgPSBmYWxzZTsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50VmFsdWVzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRWYWx1ZXMuamF2YQppbmRleCA3NTc4N2NkLi5jZTA0N2Y2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRWYWx1ZXMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRWYWx1ZXMuamF2YQpAQCAtNDQ2LDYgKzQ0NiwxNSBAQAogICAgICAgICByZXR1cm4gbVZhbHVlcy5lbnRyeVNldCgpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZXQgb2YgYWxsIG9mIHRoZSBrZXlzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc2V0IG9mIGFsbCBvZiB0aGUga2V5cworICAgICAqLworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBrZXlTZXQoKSB7CisgICAgICAgIHJldHVybiBtVmFsdWVzLmtleVNldCgpOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPENvbnRlbnRWYWx1ZXM+IENSRUFUT1IgPQogICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxDb250ZW50VmFsdWVzPigpIHsKICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJkZXByZWNhdGlvbiIsICJ1bmNoZWNrZWQifSkKQEAgLTQ4OCw2ICs0OTcsMTAgQEAKICAgICAgICAgcmV0dXJuIChBcnJheUxpc3Q8U3RyaW5nPikgbVZhbHVlcy5nZXQoa2V5KTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YQppbmRleCAwMTAwNTUwLi4zZDI5Mzc5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YQpAQCAtMjEsMTAgKzIxLDEyIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTY2FubmVyQ29ubmVjdGlvbi5PblNjYW5Db21wbGV0ZWRMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwpAQCAtNTg4LDYgKzU5MCwzMiBAQAogICAgICAgICAgICAgaW50IG1vZGUsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSk7CiAKICAgICAvKioKKyAgICAgKiBPcGVuIGEgbmV3IHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29udGV4dCdzCisgICAgICogYXBwbGljYXRpb24gcGFja2FnZS4gIENyZWF0ZXMgdGhlIGRhdGFiYXNlIGZpbGUgaWYgaXQgZG9lc24ndCBleGlzdC4KKyAgICAgKgorICAgICAqIDxwPkFjY2VwdHMgaW5wdXQgcGFyYW06IGEgY29uY3JldGUgaW5zdGFuY2Ugb2Yge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBiZQorICAgICAqIHVzZWQgdG8gaGFuZGxlIGNvcnJ1cHRpb24gd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZSBjb3JydXB0aW9uLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lICh1bmlxdWUgaW4gdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UpIG9mIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAcGFyYW0gbW9kZSBPcGVyYXRpbmcgbW9kZS4gIFVzZSAwIG9yIHtAbGluayAjTU9ERV9QUklWQVRFfSBmb3IgdGhlCisgICAgICogICAgIGRlZmF1bHQgb3BlcmF0aW9uLCB7QGxpbmsgI01PREVfV09STERfUkVBREFCTEV9CisgICAgICogICAgIGFuZCB7QGxpbmsgI01PREVfV09STERfV1JJVEVBQkxFfSB0byBjb250cm9sIHBlcm1pc3Npb25zLgorICAgICAqIEBwYXJhbSBmYWN0b3J5IEFuIG9wdGlvbmFsIGZhY3RvcnkgY2xhc3MgdGhhdCBpcyBjYWxsZWQgdG8gaW5zdGFudGlhdGUgYQorICAgICAqICAgICBjdXJzb3Igd2hlbiBxdWVyeSBpcyBjYWxsZWQuCisgICAgICogQHBhcmFtIGVycm9ySGFuZGxlciB0aGUge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBiZSB1c2VkIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UKKyAgICAgKiBjb3JydXB0aW9uLiBpZiBudWxsLCB7QGxpbmsgYW5kcm9pZC5kYXRhYmFzZS5EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXJ9IGlzIGFzc3VtZWQuCisgICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgYSBuZXdseSBjcmVhdGVkIGRhdGFiYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICogQHRocm93cyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24gaWYgdGhlIGRhdGFiYXNlIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZC4KKyAgICAgKgorICAgICAqIEBzZWUgI01PREVfUFJJVkFURQorICAgICAqIEBzZWUgI01PREVfV09STERfUkVBREFCTEUKKyAgICAgKiBAc2VlICNNT0RFX1dPUkxEX1dSSVRFQUJMRQorICAgICAqIEBzZWUgI2RlbGV0ZURhdGFiYXNlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFNRTGl0ZURhdGFiYXNlIG9wZW5PckNyZWF0ZURhdGFiYXNlKFN0cmluZyBuYW1lLAorICAgICAgICAgICAgaW50IG1vZGUsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKTsKKworICAgIC8qKgogICAgICAqIERlbGV0ZSBhbiBleGlzdGluZyBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIENvbnRleHQncwogICAgICAqIGFwcGxpY2F0aW9uIHBhY2thZ2UuCiAgICAgICoKQEAgLTEzNTYsNyArMTM4NCwxNiBAQAogICAgICAqIEBzZWUgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9TRVJWSUNFID0gImxvY2F0aW9uIjsKLSAgICAKKworICAgIC8qKgorICAgICAqIFVzZSB3aXRoIHtAbGluayAjZ2V0U3lzdGVtU2VydmljZX0gdG8gcmV0cmlldmUgYQorICAgICAqIHtAbGluayBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnlEZXRlY3Rvcn0gZm9yIGRldGVjdGluZyB0aGUgY291bnRyeSB0aGF0CisgICAgICogdGhlIHVzZXIgaXMgaW4uCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPVU5UUllfREVURUNUT1IgPSAiY291bnRyeV9kZXRlY3RvciI7CisKICAgICAvKioKICAgICAgKiBVc2Ugd2l0aCB7QGxpbmsgI2dldFN5c3RlbVNlcnZpY2V9IHRvIHJldHJpZXZlIGEge0BsaW5rCiAgICAgICogYW5kcm9pZC5hcHAuU2VhcmNoTWFuYWdlcn0gZm9yIGhhbmRsaW5nIHNlYXJjaGVzLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0V3JhcHBlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0V3JhcHBlci5qYXZhCmluZGV4IGE0NDcxMDguLjNmNWQyMTUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dFdyYXBwZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHRXcmFwcGVyLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwpAQCAtMjA0LDYgKzIwNSwxMiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgbmFtZSwgaW50IG1vZGUsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwKKyAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgeworICAgICAgICByZXR1cm4gbUJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobmFtZSwgbW9kZSwgZmFjdG9yeSwgZXJyb3JIYW5kbGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVEYXRhYmFzZShTdHJpbmcgbmFtZSkgewogICAgICAgICByZXR1cm4gbUJhc2UuZGVsZXRlRGF0YWJhc2UobmFtZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DdXJzb3JMb2FkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ3Vyc29yTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI1OTllZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ3Vyc29yTG9hZGVyLmphdmEKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKKworLyoqCisgKiBBIGxvYWRlciB0aGF0IHF1ZXJpZXMgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IGFuZCByZXR1cm5zIGEge0BsaW5rIEN1cnNvcn0uCisgKi8KK3B1YmxpYyBjbGFzcyBDdXJzb3JMb2FkZXIgZXh0ZW5kcyBBc3luY1Rhc2tMb2FkZXI8Q3Vyc29yPiB7CisgICAgQ3Vyc29yIG1DdXJzb3I7CisgICAgRm9yY2VMb2FkQ29udGVudE9ic2VydmVyIG1PYnNlcnZlcjsKKyAgICBib29sZWFuIG1TdG9wcGVkOworICAgIFVyaSBtVXJpOworICAgIFN0cmluZ1tdIG1Qcm9qZWN0aW9uOworICAgIFN0cmluZyBtU2VsZWN0aW9uOworICAgIFN0cmluZ1tdIG1TZWxlY3Rpb25BcmdzOworICAgIFN0cmluZyBtU29ydE9yZGVyOworCisgICAgLyogUnVucyBvbiBhIHdvcmtlciB0aHJlYWQgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ3Vyc29yIGxvYWRJbkJhY2tncm91bmQoKSB7CisgICAgICAgIEN1cnNvciBjdXJzb3IgPSBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkobVVyaSwgbVByb2plY3Rpb24sIG1TZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgbVNlbGVjdGlvbkFyZ3MsIG1Tb3J0T3JkZXIpOworICAgICAgICAvLyBFbnN1cmUgdGhlIGN1cnNvciB3aW5kb3cgaXMgZmlsbGVkCisgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgY3Vyc29yLmdldENvdW50KCk7CisgICAgICAgICAgICBjdXJzb3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobU9ic2VydmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3Vyc29yOworICAgIH0KKworICAgIC8qIFJ1bnMgb24gdGhlIFVJIHRocmVhZCAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlbGl2ZXJSZXN1bHQoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICBpZiAobVN0b3BwZWQpIHsKKyAgICAgICAgICAgIC8vIEFuIGFzeW5jIHF1ZXJ5IGNhbWUgaW4gd2hpbGUgdGhlIGxvYWRlciBpcyBzdG9wcGVkCisgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDdXJzb3Igb2xkQ3Vyc29yID0gbUN1cnNvcjsKKyAgICAgICAgbUN1cnNvciA9IGN1cnNvcjsKKyAgICAgICAgc3VwZXIuZGVsaXZlclJlc3VsdChjdXJzb3IpOworCisgICAgICAgIGlmIChvbGRDdXJzb3IgIT0gbnVsbCAmJiAhb2xkQ3Vyc29yLmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgIG9sZEN1cnNvci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEN1cnNvckxvYWRlcihDb250ZXh0IGNvbnRleHQsIFVyaSB1cmksIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sCisgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgc29ydE9yZGVyKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBtT2JzZXJ2ZXIgPSBuZXcgRm9yY2VMb2FkQ29udGVudE9ic2VydmVyKCk7CisgICAgICAgIG1VcmkgPSB1cmk7CisgICAgICAgIG1Qcm9qZWN0aW9uID0gcHJvamVjdGlvbjsKKyAgICAgICAgbVNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKyAgICAgICAgbVNlbGVjdGlvbkFyZ3MgPSBzZWxlY3Rpb25BcmdzOworICAgICAgICBtU29ydE9yZGVyID0gc29ydE9yZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0cyBhbiBhc3luY2hyb25vdXMgbG9hZCBvZiB0aGUgY29udGFjdHMgbGlzdCBkYXRhLiBXaGVuIHRoZSByZXN1bHQgaXMgcmVhZHkgdGhlIGNhbGxiYWNrcworICAgICAqIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQuIElmIGEgcHJldmlvdXMgbG9hZCBoYXMgYmVlbiBjb21wbGV0ZWQgYW5kIGlzIHN0aWxsIHZhbGlkCisgICAgICogdGhlIHJlc3VsdCBtYXkgYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFja3MgaW1tZWRpYXRlbHkuCisgICAgICoKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydExvYWRpbmcoKSB7CisgICAgICAgIG1TdG9wcGVkID0gZmFsc2U7CisKKyAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgZGVsaXZlclJlc3VsdChtQ3Vyc29yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvcmNlTG9hZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RvcExvYWRpbmcoKSB7CisgICAgICAgIGlmIChtQ3Vyc29yICE9IG51bGwgJiYgIW1DdXJzb3IuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgbUN1cnNvci5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIG1DdXJzb3IgPSBudWxsOworCisgICAgICAgIC8vIEF0dGVtcHQgdG8gY2FuY2VsIHRoZSBjdXJyZW50IGxvYWQgdGFzayBpZiBwb3NzaWJsZS4KKyAgICAgICAgY2FuY2VsTG9hZCgpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGFueSBvdXRzdGFuZGluZyBsb2FkcyBjbGVhbiB0aGVtc2VsdmVzIHVwIHByb3Blcmx5CisgICAgICAgIG1TdG9wcGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNhbmNlbGxlZChDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCAmJiAhY3Vyc29yLmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgLy8gRW5zdXJlIHRoZSBsb2FkZXIgaXMgc3RvcHBlZAorICAgICAgICBzdG9wTG9hZGluZygpOworICAgIH0KKworICAgIHB1YmxpYyBVcmkgZ2V0VXJpKCkgeworICAgICAgICByZXR1cm4gbVVyaTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcmkoVXJpIHVyaSkgeworICAgICAgICBtVXJpID0gdXJpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQcm9qZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gbVByb2plY3Rpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvamVjdGlvbihTdHJpbmdbXSBwcm9qZWN0aW9uKSB7CisgICAgICAgIG1Qcm9qZWN0aW9uID0gcHJvamVjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1TZWxlY3Rpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKFN0cmluZyBzZWxlY3Rpb24pIHsKKyAgICAgICAgbVNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U2VsZWN0aW9uQXJncygpIHsKKyAgICAgICAgcmV0dXJuIG1TZWxlY3Rpb25BcmdzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbkFyZ3MoU3RyaW5nW10gc2VsZWN0aW9uQXJncykgeworICAgICAgICBtU2VsZWN0aW9uQXJncyA9IHNlbGVjdGlvbkFyZ3M7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTb3J0T3JkZXIoKSB7CisgICAgICAgIHJldHVybiBtU29ydE9yZGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNvcnRPcmRlcihTdHJpbmcgc29ydE9yZGVyKSB7CisgICAgICAgIG1Tb3J0T3JkZXIgPSBzb3J0T3JkZXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ2xpcGJvYXJkLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDbGlwYm9hcmQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTFmZTU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ2xpcGJvYXJkLmFpZGwKQEAgLTAsMCArMSw0MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGF0YTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcjsKKworLyoqCisgKiBQcm9ncmFtbWluZyBpbnRlcmZhY2UgdG8gdGhlIGNsaXBib2FyZCwgd2hpY2ggYWxsb3dzIGNvcHlpbmcgYW5kIHBhc3RpbmcKKyAqIGJldHdlZW4gYXBwbGljYXRpb25zLgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSUNsaXBib2FyZCB7CisgICAgdm9pZCBzZXRQcmltYXJ5Q2xpcChpbiBDbGlwRGF0YSBjbGlwKTsKKyAgICBDbGlwRGF0YSBnZXRQcmltYXJ5Q2xpcCgpOworICAgIENsaXBEZXNjcmlwdGlvbiBnZXRQcmltYXJ5Q2xpcERlc2NyaXB0aW9uKCk7CisgICAgYm9vbGVhbiBoYXNQcmltYXJ5Q2xpcCgpOworICAgIHZvaWQgYWRkUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoaW4gSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpOworICAgIHZvaWQgcmVtb3ZlUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoaW4gSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjbGlwYm9hcmQgY29udGFpbnMgdGV4dDsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gaGFzQ2xpcGJvYXJkVGV4dCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ29udGVudFByb3ZpZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDb250ZW50UHJvdmlkZXIuamF2YQppbmRleCA2N2U3NTgxLi44ZjEyMmNlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDb250ZW50UHJvdmlkZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtNTksNiArNTksNyBAQAogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogICAgIHB1YmxpYyBDb250ZW50UHJvdmlkZXJSZXN1bHRbXSBhcHBseUJhdGNoKEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+IG9wZXJhdGlvbnMpCiAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBPcGVyYXRpb25BcHBsaWNhdGlvbkV4Y2VwdGlvbjsKKwogICAgIC8qKgogICAgICAqIEBoaWRlIC0tIHVudGlsIGludGVyZmFjZSBoYXMgcHJvdmVuIGl0c2VsZgogICAgICAqCkBAIC03MSw2ICs3MiwxMSBAQAogICAgICAqLwogICAgIHB1YmxpYyBCdW5kbGUgY2FsbChTdHJpbmcgbWV0aG9kLCBTdHJpbmcgcmVxdWVzdCwgQnVuZGxlIGFyZ3MpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAKKyAgICAvLyBEYXRhIGludGVyY2hhbmdlLgorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisgICAgcHVibGljIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlblR5cGVkQXNzZXRGaWxlKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG9wdHMpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb247CisKICAgICAvKiBJUEMgY29uc3RhbnRzICovCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZXNjcmlwdG9yID0gImFuZHJvaWQuY29udGVudC5JQ29udGVudFByb3ZpZGVyIjsKIApAQCAtODQsNCArOTAsNiBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BFTl9BU1NFVF9GSUxFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTQ7CiAgICAgc3RhdGljIGZpbmFsIGludCBBUFBMWV9CQVRDSF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE5OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgR0VUX1NUUkVBTV9UWVBFU19UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BFTl9UWVBFRF9BU1NFVF9GSUxFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjI7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI0MmE0NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuYWlkbApAQCAtMCwwICsxLDIxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitvbmV3YXkgaW50ZXJmYWNlIElPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIHsKKyAgICB2b2lkIGRpc3BhdGNoUHJpbWFyeUNsaXBDaGFuZ2VkKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0ludGVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnQuamF2YQppbmRleCAyYWNjNGEwLi4zNTllYWFhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0ludGVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50LmphdmEKQEAgLTUzNCw2ICs1MzQsNyBAQAogICogICAgIDxsaT4ge0BsaW5rICNDQVRFR09SWV9DQVJfRE9DS30KICAqICAgICA8bGk+IHtAbGluayAjQ0FURUdPUllfREVTS19ET0NLfQogICogICAgIDxsaT4ge0BsaW5rICNDQVRFR09SWV9DQVJfTU9ERX0KKyAqICAgICA8bGk+IHtAbGluayAjQ0FURUdPUllfQVBQX01BUktFVH0KICAqIDwvdWw+CiAgKgogICogPGgzPlN0YW5kYXJkIEV4dHJhIERhdGE8L2gzPgpAQCAtOTg1LDYgKzk4NiwxNSBAQAogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQUNUSVZJVFlfSU5URU5UX0FDVElPTikKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSU5TRVJUID0gImFuZHJvaWQuaW50ZW50LmFjdGlvbi5JTlNFUlQiOwogICAgIC8qKgorICAgICAqIEFjdGl2aXR5IEFjdGlvbjogQ3JlYXRlIGEgbmV3IGl0ZW0gaW4gdGhlIGdpdmVuIGNvbnRhaW5lciwgaW5pdGlhbGl6aW5nIGl0CisgICAgICogZnJvbSB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgY2xpcGJvYXJkLgorICAgICAqIDxwPklucHV0OiB7QGxpbmsgI2dldERhdGF9IGlzIFVSSSBvZiB0aGUgZGlyZWN0b3J5ICh2bmQuYW5kcm9pZC5jdXJzb3IuZGlyLyopCisgICAgICogaW4gd2hpY2ggdG8gcGxhY2UgdGhlIGRhdGEuCisgICAgICogPHA+T3V0cHV0OiBVUkkgb2YgdGhlIG5ldyBkYXRhIHRoYXQgd2FzIGNyZWF0ZWQuCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5BQ1RJVklUWV9JTlRFTlRfQUNUSU9OKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9QQVNURSA9ICJhbmRyb2lkLmludGVudC5hY3Rpb24uUEFTVEUiOworICAgIC8qKgogICAgICAqIEFjdGl2aXR5IEFjdGlvbjogRGVsZXRlIHRoZSBnaXZlbiBkYXRhIGZyb20gaXRzIGNvbnRhaW5lci4KICAgICAgKiA8cD5JbnB1dDoge0BsaW5rICNnZXREYXRhfSBpcyBVUkkgb2YgZGF0YSB0byBiZSBkZWxldGVkLgogICAgICAqIDxwPk91dHB1dDogbm90aGluZy4KQEAgLTE5NzcsNiArMTk4NywxMSBAQAogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuSU5URU5UX0NBVEVHT1JZKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0VNQkVEID0gImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkVNQkVEIjsKICAgICAvKioKKyAgICAgKiBUaGlzIGFjdGl2aXR5IGFsbG93cyB0aGUgdXNlciB0byBicm93c2UgYW5kIGRvd25sb2FkIG5ldyBhcHBsaWNhdGlvbnMuCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5JTlRFTlRfQ0FURUdPUlkpCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfQVBQX01BUktFVCA9ICJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5BUFBfTUFSS0VUIjsKKyAgICAvKioKICAgICAgKiBUaGlzIGFjdGl2aXR5IG1heSBiZSBleGVyY2lzZWQgYnkgdGhlIG1vbmtleSBvciBvdGhlciBhdXRvbWF0ZWQgdGVzdCB0b29scy4KICAgICAgKi8KICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLklOVEVOVF9DQVRFR09SWSkKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvTG9hZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0xvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNDA5NmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0xvYWRlci5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CisKKy8qKgorICogQW4gYWJzdHJhY3QgY2xhc3MgdGhhdCBwZXJmb3JtcyBhc3luY2hyb25vdXMgbG9hZGluZyBvZiBkYXRhLiBXaGlsZSBMb2FkZXJzIGFyZSBhY3RpdmUKKyAqIHRoZXkgc2hvdWxkIG1vbml0b3IgdGhlIHNvdXJjZSBvZiB0aGVpciBkYXRhIGFuZCBkZWxpdmVyIG5ldyByZXN1bHRzIHdoZW4gdGhlIGNvbnRlbnRzCisgKiBjaGFuZ2UuCisgKgorICogQHBhcmFtIDxEPiBUaGUgcmVzdWx0IHJldHVybmVkIHdoZW4gdGhlIGxvYWQgaXMgY29tcGxldGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIExvYWRlcjxEPiB7CisgICAgaW50IG1JZDsKKyAgICBPbkxvYWRDb21wbGV0ZUxpc3RlbmVyPEQ+IG1MaXN0ZW5lcjsKKyAgICBDb250ZXh0IG1Db250ZXh0OworCisgICAgcHVibGljIGZpbmFsIGNsYXNzIEZvcmNlTG9hZENvbnRlbnRPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CisgICAgICAgIHB1YmxpYyBGb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIoKSB7CisgICAgICAgICAgICBzdXBlcihuZXcgSGFuZGxlcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBkZWxpdmVyU2VsZk5vdGlmaWNhdGlvbnMoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIG9uQ29udGVudENoYW5nZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxEPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgb24gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIExvYWRlciB3aGVuIHRoZSBsb2FkIGlzIGNvbXBsZXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIgdGhhdCBjb21wbGV0ZWQgdGhlIGxvYWQKKyAgICAgICAgICogQHBhcmFtIGRhdGEgdGhlIHJlc3VsdCBvZiB0aGUgbG9hZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Mb2FkQ29tcGxldGUoTG9hZGVyPEQ+IGxvYWRlciwgRCBkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZXMgYXdheSB0aGUgYXBwbGljYXRpb24gY29udGV4dCBhc3NvY2lhdGVkIHdpdGggY29udGV4dC4gU2luY2UgTG9hZGVycyBjYW4gYmUgdXNlZAorICAgICAqIGFjcm9zcyBtdWx0aXBsZSBhY3Rpdml0aWVzIGl0J3MgZGFuZ2Vyb3VzIHRvIHN0b3JlIHRoZSBjb250ZXh0IGRpcmVjdGx5LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdXNlZCB0byByZXRyaWV2ZSB0aGUgYXBwbGljYXRpb24gY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9hZGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb25Db250ZXh0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZHMgdGhlIHJlc3VsdCBvZiB0aGUgbG9hZCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lci4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHN1YmNsYXNzZXMuCisgICAgICoKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVsaXZlclJlc3VsdChEIGRhdGEpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdGVuZXIub25Mb2FkQ29tcGxldGUodGhpcywgZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGFuIGFwcGxpY2F0aW9uIGNvbnRleHQgcmV0cmlldmVkIGZyb20gdGhlIENvbnRleHQgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gbUNvbnRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgSUQgb2YgdGhpcyBsb2FkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldElkKCkgeworICAgICAgICByZXR1cm4gbUlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIGNsYXNzIHRoYXQgd2lsbCByZWNlaXZlIGNhbGxiYWNrcyB3aGVuIGEgbG9hZCBpcyBjb21wbGV0ZS4gVGhlIGNhbGxiYWNrcyB3aWxsCisgICAgICogYmUgY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQgc28gaXQncyBzYWZlIHRvIHBhc3MgdGhlIHJlc3VsdHMgdG8gd2lkZ2V0cy4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoaW50IGlkLCBPbkxvYWRDb21wbGV0ZUxpc3RlbmVyPEQ+IGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgaXMgYWxyZWFkeSBhIGxpc3RlbmVyIHJlZ2lzdGVyZWQiKTsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgbUlkID0gaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3Rlckxpc3RlbmVyKE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8RD4gbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBsaXN0ZW5lciByZWdpc3RlciIpOworICAgICAgICB9CisgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkF0dGVtcHRpbmcgdG8gdW5yZWdpc3RlciB0aGUgd3JvbmcgbGlzdGVuZXIiKTsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXIgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0cyBhbiBhc3luY2hyb25vdXMgbG9hZCBvZiB0aGUgY29udGFjdHMgbGlzdCBkYXRhLiBXaGVuIHRoZSByZXN1bHQgaXMgcmVhZHkgdGhlIGNhbGxiYWNrcworICAgICAqIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQuIElmIGEgcHJldmlvdXMgbG9hZCBoYXMgYmVlbiBjb21wbGV0ZWQgYW5kIGlzIHN0aWxsIHZhbGlkCisgICAgICogdGhlIHJlc3VsdCBtYXkgYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFja3MgaW1tZWRpYXRlbHkuIFRoZSBsb2FkZXIgd2lsbCBtb25pdG9yIHRoZSBzb3VyY2Ugb2YKKyAgICAgKiB0aGUgZGF0YSBzZXQgYW5kIG1heSBkZWxpdmVyIGZ1dHVyZSBjYWxsYmFja3MgaWYgdGhlIHNvdXJjZSBjaGFuZ2VzLiBDYWxsaW5nCisgICAgICoge0BsaW5rICNzdG9wTG9hZGluZ30gd2lsbCBzdG9wIHRoZSBkZWxpdmVyeSBvZiBjYWxsYmFja3MuCisgICAgICoKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydExvYWRpbmcoKTsKKworICAgIC8qKgorICAgICAqIEZvcmNlIGFuIGFzeW5jaHJvbm91cyBsb2FkLiBVbmxpa2Uge0BsaW5rICNzdGFydExvYWRpbmcoKX0gdGhpcyB3aWxsIGlnbm9yZSBhIHByZXZpb3VzbHkKKyAgICAgKiBsb2FkZWQgZGF0YSBzZXQgYW5kIGxvYWQgYSBuZXcgb25lLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGZvcmNlTG9hZCgpOworCisgICAgLyoqCisgICAgICogU3RvcHMgZGVsaXZlcnkgb2YgdXBkYXRlcyB1bnRpbCB0aGUgbmV4dCB0aW1lIHtAbGluayAjc3RhcnRMb2FkaW5nKCl9IGlzIGNhbGxlZAorICAgICAqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RvcExvYWRpbmcoKTsKKworICAgIC8qKgorICAgICAqIERlc3Ryb3lzIHRoZSBsb2FkZXIgYW5kIGZyZWVzIGl0cyByZXNvdXJjZXMsIG1ha2luZyBpdCB1bnVzYWJsZS4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRlc3Ryb3koKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHtAbGluayBGb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXJ9IGRldGVjdHMgYSBjaGFuZ2UuICBDYWxscyB7QGxpbmsgI2ZvcmNlTG9hZCgpfQorICAgICAqIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNvbnRlbnRDaGFuZ2VkKCkgeworICAgICAgICBmb3JjZUxvYWQoKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TaGFyZWRQcmVmZXJlbmNlcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TaGFyZWRQcmVmZXJlbmNlcy5qYXZhCmluZGV4IDE0ODQyMDQuLmMwNzg4ZjUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU2hhcmVkUHJlZmVyZW5jZXMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1NoYXJlZFByZWZlcmVuY2VzLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC5jb250ZW50OwogCiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAvKioKICAqIEludGVyZmFjZSBmb3IgYWNjZXNzaW5nIGFuZCBtb2RpZnlpbmcgcHJlZmVyZW5jZSBkYXRhIHJldHVybmVkIGJ5IHtAbGluawpAQCAtNzEsNiArNzIsMTcgQEAKICAgICAgICAgRWRpdG9yIHB1dFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpOwogICAgICAgICAKICAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBhIHNldCBvZiBTdHJpbmcgdmFsdWVzIGluIHRoZSBwcmVmZXJlbmNlcyBlZGl0b3IsIHRvIGJlIHdyaXR0ZW4KKyAgICAgICAgICogYmFjayBvbmNlIHtAbGluayAjY29tbWl0fSBpcyBjYWxsZWQuCisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0ga2V5IFRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlIHRvIG1vZGlmeS4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgbmV3IHZhbHVlcyBmb3IgdGhlIHByZWZlcmVuY2UuCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgc2FtZSBFZGl0b3Igb2JqZWN0LCBzbyB5b3UgY2FuCisgICAgICAgICAqIGNoYWluIHB1dCBjYWxscyB0b2dldGhlci4KKyAgICAgICAgICovCisgICAgICAgIEVkaXRvciBwdXRTdHJpbmdTZXQoU3RyaW5nIGtleSwgU2V0PFN0cmluZz4gdmFsdWVzKTsKKyAgICAgICAgCisgICAgICAgIC8qKgogICAgICAgICAgKiBTZXQgYW4gaW50IHZhbHVlIGluIHRoZSBwcmVmZXJlbmNlcyBlZGl0b3IsIHRvIGJlIHdyaXR0ZW4gYmFjayBvbmNlCiAgICAgICAgICAqIHtAbGluayAjY29tbWl0fSBvciB7QGxpbmsgI2FwcGx5fSBhcmUgY2FsbGVkLgogICAgICAgICAgKiAKQEAgLTIxOCw2ICsyMzAsMjAgQEAKICAgICBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyBkZWZWYWx1ZSk7CiAgICAgCiAgICAgLyoqCisgICAgICogUmV0cmlldmUgYSBzZXQgb2YgU3RyaW5nIHZhbHVlcyBmcm9tIHRoZSBwcmVmZXJlbmNlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5IFRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlIHRvIHJldHJpZXZlLgorICAgICAqIEBwYXJhbSBkZWZWYWx1ZXMgVmFsdWVzIHRvIHJldHVybiBpZiB0aGlzIHByZWZlcmVuY2UgZG9lcyBub3QgZXhpc3QuCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcmVmZXJlbmNlIHZhbHVlcyBpZiB0aGV5IGV4aXN0LCBvciBkZWZWYWx1ZXMuCisgICAgICogVGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByZWZlcmVuY2Ugd2l0aCB0aGlzIG5hbWUKKyAgICAgKiB0aGF0IGlzIG5vdCBhIFNldC4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorICAgICAqLworICAgIFNldDxTdHJpbmc+IGdldFN0cmluZ1NldChTdHJpbmcga2V5LCBTZXQ8U3RyaW5nPiBkZWZWYWx1ZXMpOworICAgIAorICAgIC8qKgogICAgICAqIFJldHJpZXZlIGFuIGludCB2YWx1ZSBmcm9tIHRoZSBwcmVmZXJlbmNlcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5IFRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlIHRvIHJldHJpZXZlLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jTWFuYWdlci5qYXZhCmluZGV4IGQwYjY3Y2MuLjdmNzQ5YmIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5NYXBzOworCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7CiAKQEAgLTU1LDYgKzU3LDcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwpAQCAtMTI2LDE0ICsxMjksMTMgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTklUSUFMSVpBVElPTl9VTkJJTkRfREVMQVlfTVMgPSA1MDAwOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkNfV0FLRV9MT0NLID0gIlN5bmNNYW5hZ2VyU3luY1dha2VMb2NrIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ19XQUtFX0xPQ0tfUFJFRklYID0gIlN5bmNXYWtlTG9jayI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRV9TWU5DX0FMQVJNX1dBS0VfTE9DSyA9ICJTeW5jTWFuYWdlckhhbmRsZVN5bmNBbGFybVdha2VMb2NrIjsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKIAogICAgIHByaXZhdGUgdm9sYXRpbGUgQWNjb3VudFtdIG1BY2NvdW50cyA9IElOSVRJQUxfQUNDT1VOVFNfQVJSQVk7CiAKLSAgICB2b2xhdGlsZSBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBtU3luY1dha2VMb2NrOwogICAgIHZvbGF0aWxlIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1IYW5kbGVBbGFybVdha2VMb2NrOwogICAgIHZvbGF0aWxlIHByaXZhdGUgYm9vbGVhbiBtRGF0YUNvbm5lY3Rpb25Jc0Nvbm5lY3RlZCA9IGZhbHNlOwogICAgIHZvbGF0aWxlIHByaXZhdGUgYm9vbGVhbiBtU3RvcmFnZUlzTG93ID0gZmFsc2U7CkBAIC0xOTUsNiArMTk3LDggQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFjY291bnRbXSBJTklUSUFMX0FDQ09VTlRTX0FSUkFZID0gbmV3IEFjY291bnRbMF07CiAKKyAgICBwcml2YXRlIGZpbmFsIFBvd2VyTWFuYWdlciBtUG93ZXJNYW5hZ2VyOworCiAgICAgcHVibGljIHZvaWQgb25BY2NvdW50c1VwZGF0ZWQoQWNjb3VudFtdIGFjY291bnRzKSB7CiAgICAgICAgIC8vIHJlbWVtYmVyIGlmIHRoaXMgd2FzIHRoZSBmaXJzdCB0aW1lIHRoaXMgd2FzIGNhbGxlZCBhZnRlciBhbiB1cGRhdGUKICAgICAgICAgZmluYWwgYm9vbGVhbiBqdXN0Qm9vdGVkVXAgPSBtQWNjb3VudHMgPT0gSU5JVElBTF9BQ0NPVU5UU19BUlJBWTsKQEAgLTM1NiwxNSArMzYwLDEzIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWdyID0gbnVsbDsKICAgICAgICAgfQotICAgICAgICBQb3dlck1hbmFnZXIgcG0gPSAoUG93ZXJNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKLSAgICAgICAgbVN5bmNXYWtlTG9jayA9IHBtLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgU1lOQ19XQUtFX0xPQ0spOwotICAgICAgICBtU3luY1dha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOworICAgICAgICBtUG93ZXJNYW5hZ2VyID0gKFBvd2VyTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7CiAKICAgICAgICAgLy8gVGhpcyBXYWtlTG9jayBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHdlIHN0YXkgYXdha2UgYmV0d2VlbiB0aGUgdGltZSB0aGF0IHdlIHJlY2VpdmUKICAgICAgICAgLy8gYSBzeW5jIGFsYXJtIG5vdGlmaWNhdGlvbiBhbmQgd2hlbiB3ZSBmaW5pc2ggcHJvY2Vzc2luZyBpdC4gV2UgbmVlZCB0byBkbyB0aGlzCiAgICAgICAgIC8vIGJlY2F1c2Ugd2UgZG9uJ3QgZG8gdGhlIHdvcmsgaW4gdGhlIGFsYXJtIGhhbmRsZXIsIHJhdGhlciB3ZSBkbyBpdCBpbiBhIG1lc3NhZ2UKICAgICAgICAgLy8gaGFuZGxlci4KLSAgICAgICAgbUhhbmRsZUFsYXJtV2FrZUxvY2sgPSBwbS5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssCisgICAgICAgIG1IYW5kbGVBbGFybVdha2VMb2NrID0gbVBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssCiAgICAgICAgICAgICAgICAgSEFORExFX1NZTkNfQUxBUk1fV0FLRV9MT0NLKTsKICAgICAgICAgbUhhbmRsZUFsYXJtV2FrZUxvY2suc2V0UmVmZXJlbmNlQ291bnRlZChmYWxzZSk7CiAKQEAgLTEzMDIsNiArMTMwNCw5IEBACiAgICAgICAgIHB1YmxpYyBmaW5hbCBTeW5jTm90aWZpY2F0aW9uSW5mbyBtU3luY05vdGlmaWNhdGlvbkluZm8gPSBuZXcgU3luY05vdGlmaWNhdGlvbkluZm8oKTsKICAgICAgICAgcHJpdmF0ZSBMb25nIG1BbGFybVNjaGVkdWxlVGltZSA9IG51bGw7CiAgICAgICAgIHB1YmxpYyBmaW5hbCBTeW5jVGltZVRyYWNrZXIgbVN5bmNUaW1lVHJhY2tlciA9IG5ldyBTeW5jVGltZVRyYWNrZXIoKTsKKyAgICAgICAgcHJpdmF0ZSBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbVN5bmNXYWtlTG9jazsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFBhaXI8U3RyaW5nLCBTdHJpbmc+LCAgUG93ZXJNYW5hZ2VyLldha2VMb2NrPiBtV2FrZUxvY2tzID0KKyAgICAgICAgICAgICAgICBNYXBzLm5ld0hhc2hNYXAoKTsKIAogICAgICAgICAvLyB1c2VkIHRvIHRyYWNrIGlmIHdlIGhhdmUgaW5zdGFsbGVkIHRoZSBlcnJvciBub3RpZmljYXRpb24gc28gdGhhdCB3ZSBkb24ndCByZWluc3RhbGwKICAgICAgICAgLy8gaXQgaWYgc3luYyBpcyBzdGlsbCBmYWlsaW5nCkBAIC0xMzE1LDYgKzEzMjAsMTggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIGdldFN5bmNXYWtlTG9jayhTdHJpbmcgYWNjb3VudFR5cGUsIFN0cmluZyBhdXRob3JpdHkpIHsKKyAgICAgICAgICAgIGZpbmFsIFBhaXI8U3RyaW5nLCBTdHJpbmc+IHdha2VMb2NrS2V5ID0gUGFpci5jcmVhdGUoYWNjb3VudFR5cGUsIGF1dGhvcml0eSk7CisgICAgICAgICAgICBQb3dlck1hbmFnZXIuV2FrZUxvY2sgd2FrZUxvY2sgPSBtV2FrZUxvY2tzLmdldCh3YWtlTG9ja0tleSk7CisgICAgICAgICAgICBpZiAod2FrZUxvY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gU1lOQ19XQUtFX0xPQ0tfUFJFRklYICsgIl8iICsgYXV0aG9yaXR5ICsgIl8iICsgYWNjb3VudFR5cGU7CisgICAgICAgICAgICAgICAgd2FrZUxvY2sgPSBtUG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgbmFtZSk7CisgICAgICAgICAgICAgICAgd2FrZUxvY2suc2V0UmVmZXJlbmNlQ291bnRlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgbVdha2VMb2Nrcy5wdXQod2FrZUxvY2tLZXksIHdha2VMb2NrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB3YWtlTG9jazsKKyAgICAgICAgfQorCiAgICAgICAgIHByaXZhdGUgdm9pZCB3YWl0VW50aWxSZWFkeVRvUnVuKCkgewogICAgICAgICAgICAgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBtUmVhZHlUb1J1bkxhdGNoOwogICAgICAgICAgICAgaWYgKGxhdGNoICE9IG51bGwpIHsKQEAgLTE0NzcsOCArMTQ5NCw5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzU3luY0luUHJvZ3Jlc3MgPSBtQWN0aXZlU3luY0NvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoIWlzU3luY0luUHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzU3luY0luUHJvZ3Jlc3MgJiYgbVN5bmNXYWtlTG9jayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1TeW5jV2FrZUxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICBtU3luY1dha2VMb2NrID0gbnVsbDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbWFuYWdlU3luY05vdGlmaWNhdGlvbigpOwogICAgICAgICAgICAgICAgIG1hbmFnZUVycm9yTm90aWZpY2F0aW9uKCk7CkBAIC0xNzA0LDcgKzE3MjIsMjYgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1TeW5jV2FrZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgLy8gRmluZCB0aGUgd2FrZWxvY2sgZm9yIHRoaXMgYWNjb3VudCBhbmQgYXV0aG9yaXR5IGFuZCBzdG9yZSBpdCBpbiBtU3luY1dha2VMb2NrLgorICAgICAgICAgICAgLy8gQmUgc3VyZSB0byByZWxlYXNlIHRoZSBwcmV2aW91cyB3YWtlbG9jayBzbyB0aGF0IHdlIGRvbid0IGVuZCB1cCB3aXRoIGl0IGJlaW5nCisgICAgICAgICAgICAvLyBoZWxkIHVudGlsIGl0IGlzIHVzZWQgYWdhaW4uCisgICAgICAgICAgICAvLyBUaGVyZSBhcmUgYSBjb3VwbGUgdHJpY2t5IHRoaW5ncyBhYm91dCB0aGlzIGNvZGU6CisgICAgICAgICAgICAvLyAtIG1ha2Ugc3VyZSB0aGF0IHdlIGFjcXVpcmUgdGhlIG5ldyB3YWtlbG9jayBiZWZvcmUgcmVsZWFzaW5nIHRoZSBvbGQgb25lLAorICAgICAgICAgICAgLy8gICBvdGhlcndpc2UgdGhlIGRldmljZSBtaWdodCBnbyB0byBzbGVlcCBhcyBzb29uIGFzIHdlIHJlbGVhc2UgaXQuCisgICAgICAgICAgICAvLyAtIHNpbmNlIHdlIHVzZSBub24tcmVmZXJlbmNlIGNvdW50ZWQgd2FrZWxvY2tzIHdlIGhhdmUgdG8gYmUgc3VyZSBub3QgdG8gZG8KKyAgICAgICAgICAgIC8vICAgdGhlIHJlbGVhc2UgaWYgdGhlIHdha2Vsb2NrIGRpZG4ndCBjaGFuZ2UuIE90aGV3aXNlIHdlIHdvdWxkIGRvIGFuCisgICAgICAgICAgICAvLyAgIGFjcXVpcmUgZm9sbG93ZWQgYnkgYSByZWxlYXNlIG9uIHRoZSBzYW1lIGxvY2ssIHJlc3VsdGluZyBpbiBubyBsb2NrCisgICAgICAgICAgICAvLyAgIGJlaW5nIGhlbGQuCisgICAgICAgICAgICBQb3dlck1hbmFnZXIuV2FrZUxvY2sgb2xkV2FrZUxvY2sgPSBtU3luY1dha2VMb2NrOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU3luY1dha2VMb2NrID0gZ2V0U3luY1dha2VMb2NrKG9wLmFjY291bnQudHlwZSwgb3AuYXV0aG9yaXR5KTsKKyAgICAgICAgICAgICAgICBtU3luY1dha2VMb2NrLmFjcXVpcmUoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKG9sZFdha2VMb2NrICE9IG51bGwgJiYgb2xkV2FrZUxvY2sgIT0gbVN5bmNXYWtlTG9jaykgeworICAgICAgICAgICAgICAgICAgICBvbGRXYWtlTG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHNjaGVkdWxlIGFuIGFsYXJtLCBhcyB0aGF0IHdpbGwgYmUgZG9uZSBieSBvdXIgY2FsbGVyLgogCiAgICAgICAgICAgICAvLyB0aGUgbmV4dCBzdGVwIHdpbGwgb2NjdXIgd2hlbiB3ZSBnZXQgZWl0aGVyIGEgdGltZW91dCBvciBhCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1htbERvY3VtZW50UHJvdmlkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvWG1sRG9jdW1lbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1M2FkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1htbERvY3VtZW50UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cEdldDsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckZhY3Rvcnk7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyLk9wZW5SZXNvdXJjZUlkUmVzdWx0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuTWF0cml4Q3Vyc29yOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5odHRwLkFuZHJvaWRIdHRwQ2xpZW50OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworLyoqCisgKiBBIHJlYWQtb25seSBjb250ZW50IHByb3ZpZGVyIHdoaWNoIGV4dHJhY3RzIGRhdGEgb3V0IG9mIGFuIFhNTCBkb2N1bWVudC4KKyAqCisgKiA8cD5BIFhQYXRoLWxpa2Ugc2VsZWN0aW9uIHBhdHRlcm4gaXMgdXNlZCB0byBzZWxlY3Qgc29tZSBub2RlcyBpbiB0aGUgWE1MIGRvY3VtZW50LiBFYWNoIHN1Y2gKKyAqIG5vZGUgd2lsbCBjcmVhdGUgYSByb3cgaW4gdGhlIHtAbGluayBDdXJzb3J9IHJlc3VsdC48L3A+CisgKgorICogRWFjaCByb3cgaXMgdGhlbiBwb3B1bGF0ZWQgd2l0aCBjb2x1bW5zIHRoYXQgYXJlIGFsc28gZGVmaW5lZCBhcyBYUGF0aC1saWtlIHByb2plY3Rpb25zLiBUaGVzZQorICogcHJvamVjdGlvbnMgZmV0Y2ggYXR0cmlidXRlcyB2YWx1ZXMgb3IgdGV4dCBpbiB0aGUgbWF0Y2hpbmcgcm93IG5vZGUgb3IgaXRzIGNoaWxkcmVuLgorICoKKyAqIDxwPlRvIGFkZCB0aGlzIHByb3ZpZGVyIGluIHlvdXIgYXBwbGljYXRpb24sIHlvdSBzaG91bGQgYWRkIGl0cyBkZWNsYXJhdGlvbiB0byB5b3VyIGFwcGxpY2F0aW9uCisgKiBtYW5pZmVzdDoKKyAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KKyAqICZsdDtwcm92aWRlciBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY29udGVudC5YbWxEb2N1bWVudFByb3ZpZGVyIiBhbmRyb2lkOmF1dGhvcml0aWVzPSJ4bWxkb2N1bWVudCIgLyZndDsKKyAqIDwvcHJlPgorICogPC9wPgorICoKKyAqIDxoMj5Ob2RlIHNlbGVjdGlvbiBzeW50YXg8L2gyPgorICogVGhlIG5vZGUgc2VsZWN0aW9uIHN5bnRheCBpcyBtYWRlIG9mIHRoZSBjb25jYXRlbmF0aW9uIG9mIGFuIGFyYml0cmFyeSBudW1iZXIgKGF0IGxlYXN0IG9uZSkgb2YKKyAqIDxjb2RlPi9ub2RlX25hbWU8L2NvZGU+IG5vZGUgc2VsZWN0aW9uIHBhdHRlcm5zLgorICoKKyAqIDxwPlRoZSA8Y29kZT4vcm9vdC9jaGlsZDEvY2hpbGQyPC9jb2RlPiBwYXR0ZXJuIHdpbGwgZm9yIGluc3RhbmNlIG1hdGNoIGFsbCBub2RlcyBuYW1lZAorICogPGNvZGU+Y2hpbGQyPC9jb2RlPiB3aGljaCBhcmUgY2hpbGRyZW4gb2YgYSBub2RlIG5hbWVkIDxjb2RlPmNoaWxkMTwvY29kZT4gd2hpY2ggYXJlIHRoZW1zZWx2ZXMKKyAqIGNoaWxkcmVuIG9mIGEgcm9vdCBub2RlIG5hbWVkIDxjb2RlPnJvb3Q8L2NvZGU+LjwvcD4KKyAqCisgKiBBbnkgPGNvZGU+LzwvY29kZT4gc2VwYXJhdG9yIGluIHRoZSBwcmV2aW91cyBleHByZXNzaW9uIGNhbiBiZSByZXBsYWNlZCBieSBhIDxjb2RlPi8vPC9jb2RlPgorICogc2VwYXJhdG9yIGluc3RlYWQsIHdoaWNoIGluZGljYXRlZCBhIDxpPmRlc2NlbmRhbnQ8L2k+IGluc3RlYWQgb2YgYSBjaGlsZC4KKyAqCisgKiA8cD5UaGUgPGNvZGU+Ly9ub2RlMS8vbm9kZTI8L2NvZGU+IHBhdHRlcm4gd2lsbCBmb3IgaW5zdGFuY2UgbWF0Y2ggYWxsIG5vZGVzIG5hbWVkCisgKiA8Y29kZT5ub2RlMjwvY29kZT4gd2hpY2ggYXJlIGRlc2NlbmRhbnQgb2YgYSBub2RlIG5hbWVkIDxjb2RlPm5vZGUxPC9jb2RlPiBsb2NhdGVkIGFueXdoZXJlIGluCisgKiB0aGUgZG9jdW1lbnQgaGllcmFyY2h5LjwvcD4KKyAqCisgKiBOb2RlIG5hbWVzIGNhbiBjb250YWluIG5hbWVzcGFjZXMgaW4gdGhlIGZvcm0gPGNvZGU+bmFtZXNwYWNlOm5vZGU8L2NvZGU+LgorICoKKyAqIDxoMj5Qcm9qZWN0aW9uIHN5bnRheDwvaDI+CisgKiBGb3IgZXZlcnkgc2VsZWN0ZWQgbm9kZSwgdGhlIHByb2plY3Rpb24gd2lsbCB0aGVuIGV4dHJhY3QgYWN0dWFsIGRhdGEgZnJvbSB0aGlzIG5vZGUgYW5kIGl0cworICogZGVzY2VuZGFudC4KKyAqCisgKiA8cD5Vc2UgYSBzeW50YXggc2ltaWxhciB0byB0aGUgc2VsZWN0aW9uIHN5bnRheCBkZXNjcmliZWQgYWJvdmUgdG8gc2VsZWN0IHRoZSB0ZXh0IGFzc29jaWF0ZWQKKyAqIHdpdGggYSBjaGlsZCBvZiB0aGUgc2VsZWN0ZWQgbm9kZS4gVGhlIGltcGxpY2l0IHJvb3Qgb2YgdGhpcyBwcm9qZWN0aW9uIHBhdHRlcm4gaXMgdGhlIHNlbGVjdGVkCisgKiBub2RlLiA8Y29kZT4vPC9jb2RlPiB3aWxsIGhlbmNlIHJlZmVyIHRvIHRoZSB0ZXh0IG9mIHRoZSBzZWxlY3RlZCBub2RlLCB3aGlsZQorICogPGNvZGU+L2NoaWxkMTwvY29kZT4gd2lsbCBmZXRjaCB0aGUgdGV4dCBvZiBpdHMgY2hpbGQgbmFtZWQgPGNvZGU+Y2hpbGQxPC9jb2RlPiBhbmQKKyAqIDxjb2RlPi8vY2hpbGQxPC9jb2RlPiB3aWxsIG1hdGNoIGFueSA8aT5kZXNjZW5kYW50PC9pPiBuYW1lZCA8Y29kZT5jaGlsZDE8L2NvZGU+LiBJZiBzZXZlcmFsCisgKiBub2RlcyBtYXRjaCB0aGUgcHJvamVjdGlvbiBwYXR0ZXJuLCB0aGVpciB0ZXh0cyBhcmUgYXBwZW5kZWQgYXMgYSByZXN1bHQuPC9wPgorICoKKyAqIEEgcHJvamVjdGlvbiBjYW4gYWxzbyBmZXRjaCBhbnkgbm9kZSBhdHRyaWJ1dGUgYnkgYXBwZW5kaW5nIGEgPGNvZGU+QGF0dHJpYnV0ZV9uYW1lPC9jb2RlPgorICogcGF0dGVybiB0byB0aGUgcHJldmlvdXNseSBkZXNjcmliZWQgc3ludGF4LiA8Y29kZT4vL2NoaWxkMUBwcmljZTwvY29kZT4gd2lsbCBmb3IgaW5zdGFuY2UgbWF0Y2gKKyAqIHRoZSBhdHRyaWJ1dGUgPGNvZGU+cHJpY2U8L2NvZGU+IG9mIGFueSA8Y29kZT5jaGlsZDE8L2NvZGU+IGRlc2NlbmRhbnQuCisgKgorICogPHA+SWYgYSBwcm9qZWN0aW9uIGRvZXMgbm90IG1hdGNoIGFueSBub2RlL2F0dHJpYnV0ZSwgaXRzIGFzc29jaWF0ZWQgdmFsdWUgd2lsbCBiZSBhbiBlbXB0eQorICogc3RyaW5nLjwvcD4KKyAqCisgKiA8aDI+RXhhbXBsZTwvaDI+CisgKiBVc2luZyB0aGUgZm9sbG93aW5nIFhNTCBkb2N1bWVudDoKKyAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KKyAqICZsdDtsaWJyYXJ5Jmd0OworICogICAmbHQ7Ym9vayBpZD0iRUg5NCImZ3Q7CisgKiAgICAgJmx0O3RpdGxlJmd0O1RoZSBPbGQgTWFuIGFuZCB0aGUgU2VhJmx0Oy90aXRsZSZndDsKKyAqICAgICAmbHQ7YXV0aG9yJmd0O0VybmVzdCBIZW1pbmd3YXkmbHQ7L2F1dGhvciZndDsKKyAqICAgJmx0Oy9ib29rJmd0OworICogICAmbHQ7Ym9vayBpZD0iWFgxMCImZ3Q7CisgKiAgICAgJmx0O3RpdGxlJmd0O1RoZSBBcmFiaWFuIE5pZ2h0czogVGFsZXMgb2YgMSwwMDEgTmlnaHRzJmx0Oy90aXRsZSZndDsKKyAqICAgJmx0Oy9ib29rJmd0OworICogICAmbHQ7bm8taWQmZ3Q7CisgKiAgICAgJmx0O2Jvb2smZ3Q7CisgKiAgICAgICAmbHQ7dGl0bGUmZ3Q7QW5pbWFsIEZhcm0mbHQ7L3RpdGxlJmd0OworICogICAgICAgJmx0O2F1dGhvciZndDtHZW9yZ2UgT3J3ZWxsJmx0Oy9hdXRob3ImZ3Q7CisgKiAgICAgJmx0Oy9ib29rJmd0OworICogICAmbHQ7L25vLWlkJmd0OworICogJmx0Oy9saWJyYXJ5Jmd0OworICogPC9wcmU+CisgKiBBIHNlbGVjdGlvbiBwYXR0ZXJuIG9mIDxjb2RlPi9saWJyYXJ5Ly9ib29rPC9jb2RlPiB3aWxsIG1hdGNoIHRoZSB0aHJlZSBib29rIGVudHJpZXMgKHdoaWxlCisgKiA8Y29kZT4vbGlicmFyeS9ib29rPC9jb2RlPiB3aWxsIG9ubHkgbWF0Y2ggdGhlIGZpcnN0IHR3byBvbmVzKS4KKyAqCisgKiA8cD5EZWZpbmluZyB0aGUgcHJvamVjdGlvbnMgYXMgPGNvZGU+L3RpdGxlPC9jb2RlPiwgPGNvZGU+L2F1dGhvcjwvY29kZT4gYW5kIDxjb2RlPkBpZDwvY29kZT4KKyAqIHdpbGwgcmV0cmlldmUgdGhlIGFzc29jaWF0ZWQgZGF0YS4gTm90ZSB0aGF0IHRoZSBhdXRob3Igb2YgdGhlIHNlY29uZCBib29rIGFzIHdlbGwgYXMgdGhlIGlkIG9mCisgKiB0aGUgdGhpcmQgYXJlIGVtcHR5IHN0cmluZ3MuCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxEb2N1bWVudFByb3ZpZGVyIGV4dGVuZHMgQ29udGVudFByb3ZpZGVyIHsKKyAgICAvKgorICAgICAqIElkZWFzIGZvciBpbXByb3ZlbWVudDoKKyAgICAgKiAtIEV4cGFuZCBYUGF0aC1saWtlIHN5bnRheCB0byBhbGxvdyBmb3IgW25iXSBjaGlsZCBudW1iZXIgc2VsZWN0b3IKKyAgICAgKiAtIEFkZHJlc3MgdGhlIHN0YXJ0aW5nIC4gYnVnIGluIEFic3RyYWN0Q3Vyc29yIHdoaWNoIHByZXZlbnRzIGEgdHJ1ZSBYUGF0aCBzeW50YXguCisgICAgICogLSBQcm92aWRlIGFuIGFsdGVybmF0aXZlIHRvIGNvbmNhdGVuYXRpb24gd2hlbiBzZXZlcmFsIG5vZGUgbWF0Y2ggKGxpc3QtbGlrZSkuCisgICAgICogLSBTdXBwb3J0IG5hbWVzcGFjZXMgaW4gYXR0cmlidXRlIG5hbWVzLgorICAgICAqIC0gSW5jcmVtZW50YWwgQ3Vyc29yIGNyZWF0aW9uLCBwYWdpbmF0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiWG1sRG9jdW1lbnRQcm92aWRlciI7CisgICAgcHJpdmF0ZSBBbmRyb2lkSHR0cENsaWVudCBtSHR0cENsaWVudDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSBkYXRhIGZyb20gdGhlIFhNTCBkb2N1bWVudCByZWZlcmVuY2VkIGluIHRoZSBVUkkuCisgICAgICoKKyAgICAgKiA8cD5UaGUgWE1MIGRvY3VtZW50IGNhbiBiZSBhIGxvY2FsIHJlc291cmNlIG9yIGEgZmlsZSB0aGF0IHdpbGwgYmUgZG93bmxvYWRlZCBmcm9tIHRoZQorICAgICAqIEludGVybmV0LiBJbiB0aGUgbGF0dGVyIGNhc2UsIHlvdXIgYXBwbGljYXRpb24gbmVlZHMgdG8gcmVxdWVzdCB0aGUgSU5URVJORVQgcGVybWlzc2lvbiBpbgorICAgICAqIGl0cyBtYW5pZmVzdC48L3A+CisgICAgICoKKyAgICAgKiBUaGUgVVJJIHdpbGwgYmUgb2YgdGhlIGZvcm0gPGNvZGU+Y29udGVudDovL3htbGRvY3VtZW50Lz9yZXNvdXJjZT1SLnhtbC5teUZpbGU8L2NvZGU+IGZvciBhCisgICAgICogbG9jYWwgcmVzb3VyY2UuIDxjb2RlPnhtbGRvY3VtZW50PC9jb2RlPiBzaG91bGQgbWF0Y2ggdGhlIGF1dGhvcml0eSBkZWNsYXJlZCBmb3IgdGhpcworICAgICAqIHByb3ZpZGVyIGluIHlvdXIgbWFuaWZlc3QuIEludGVybmV0IGRvY3VtZW50cyBhcmUgcmVmZXJlbmNlZCB1c2luZworICAgICAqIDxjb2RlPmNvbnRlbnQ6Ly94bWxkb2N1bWVudC8/dXJsPTwvY29kZT4gZm9sbG93ZWQgYnkgYW4gZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSBVUkwgb2YgeW91cgorICAgICAqIGRvY3VtZW50IChzZWUge0BsaW5rIFVyaSNlbmNvZGUoU3RyaW5nKX0pLgorICAgICAqCisgICAgICogPHA+VGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSByZXN1bHRpbmcgQ3Vyc29yIGlzIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBwcm9qZWN0aW9uCisgICAgICogYXJyYXkgcGx1cyBvbmUsIG5hbWVkIDxjb2RlPl9pZDwvY29kZT4gd2hpY2ggd2lsbCBjb250YWluIGEgdW5pcXVlIHJvdyBpZCAoYWxsb3dpbmcgdGhlCisgICAgICogQ3Vyc29yIHRvIGJlIHVzZWQgd2l0aCBhIHtAbGluayBDdXJzb3JBZGFwdGVyfSkuIFRoZSBvdGhlciBjb2x1bW5zJyBuYW1lcyBhcmUgdGhlIHByb2plY3Rpb24KKyAgICAgKiBwYXR0ZXJucy48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgeW91ciBsb2NhbCByZXNvdXJjZSBvciBJbnRlcm5ldCBkb2N1bWVudC4KKyAgICAgKiBAcGFyYW0gcHJvamVjdGlvbiBBIHNldCBvZiBwYXR0ZXJucyB0aGF0IHdpbGwgYmUgdXNlZCB0byBleHRyYWN0IGRhdGEgZnJvbSBlYWNoIHNlbGVjdGVkCisgICAgICogbm9kZS4gU2VlIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIHBhdHRlcm4gc3ludGF4LgorICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gQSBzZWxlY3Rpb24gcGF0dGVybiB3aGljaCB3aWxsIHNlbGVjdCB0aGUgbm9kZXMgdGhhdCB3aWxsIGNyZWF0ZSB0aGUKKyAgICAgKiBDdXJzb3IncyByb3dzLiBTZWUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgcGF0dGVybiBzeW50YXguCisgICAgICogQHBhcmFtIHNlbGVjdGlvbkFyZ3MgVGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KKyAgICAgKiBAcGFyYW0gc29ydE9yZGVyIFRoZSByb3cgb3JkZXIgaW4gdGhlIHJlc3VsdGluZyBjdXJzb3IgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBub2RlIG9yZGVyIGluCisgICAgICogdGhlIFhNTCBkb2N1bWVudC4gVGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KKyAgICAgKiBAcmV0dXJuIEEgQ3Vyc29yIG9yIG51bGwgaW4gY2FzZSBvZiBlcnJvci4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KFVyaSB1cmksIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsCisgICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyKSB7CisKKyAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBudWxsOworICAgICAgICBtSHR0cENsaWVudCA9IG51bGw7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHVybCA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlcigidXJsIik7CisgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgcGFyc2VyID0gZ2V0VXJpWG1sUHVsbFBhcnNlcih1cmwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc291cmNlID0gdXJpLmdldFF1ZXJ5UGFyYW1ldGVyKCJyZXNvdXJjZSIpOworICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBVcmkgcmVzb3VyY2VVcmkgPSBVcmkucGFyc2UoQ29udGVudFJlc29sdmVyLlNDSEVNRV9BTkRST0lEX1JFU09VUkNFICsgIjovLyIgKworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCkgKyAiLyIgKyByZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgcGFyc2VyID0gZ2V0UmVzb3VyY2VYbWxQdWxsUGFyc2VyKHJlc291cmNlVXJpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXJzZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgWE1MQ3Vyc29yIHhtbEN1cnNvciA9IG5ldyBYTUxDdXJzb3Ioc2VsZWN0aW9uLCBwcm9qZWN0aW9uKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgeG1sQ3Vyc29yLnBhcnNlV2l0aChwYXJzZXIpOworICAgICAgICAgICAgICAgIHJldHVybiB4bWxDdXJzb3I7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkkvTyBlcnJvciB3aGlsZSBwYXJzaW5nIFhNTCAiICsgdXJpLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJFcnJvciB3aGlsZSBwYXJzaW5nIFhNTCAiICsgdXJpLCBlKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKG1IdHRwQ2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUh0dHBDbGllbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIFhtbFB1bGxQYXJzZXIgZm9yIHRoZSBwcm92aWRlZCBVUkwuIENhbiBiZSBvdmVybG9hZGVkIHRvIHByb3ZpZGUgeW91ciBvd24gcGFyc2VyLgorICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgWE1MIGRvY3VtZW50IHRoYXQgaXMgdG8gYmUgcGFyc2VkLgorICAgICAqIEByZXR1cm4gQW4gWG1sUHVsbFBhcnNlciBvbiB0aGlzIGRvY3VtZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBYbWxQdWxsUGFyc2VyIGdldFVyaVhtbFB1bGxQYXJzZXIoU3RyaW5nIHVybCkgeworICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBYbWxQdWxsUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gWG1sUHVsbFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICAgICAgICBwYXJzZXIgPSBmYWN0b3J5Lm5ld1B1bGxQYXJzZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5hYmxlIHRvIGNyZWF0ZSBYbWxQdWxsUGFyc2VyIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIEh0dHBHZXQgZ2V0ID0gbmV3IEh0dHBHZXQodXJsKTsKKyAgICAgICAgICAgIG1IdHRwQ2xpZW50ID0gQW5kcm9pZEh0dHBDbGllbnQubmV3SW5zdGFuY2UoIkFuZHJvaWQiKTsKKyAgICAgICAgICAgIEh0dHBSZXNwb25zZSByZXNwb25zZSA9IG1IdHRwQ2xpZW50LmV4ZWN1dGUoZ2V0KTsKKyAgICAgICAgICAgIGlmIChyZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpID09IEh0dHBTdGF0dXMuU0NfT0spIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBIdHRwRW50aXR5IGVudGl0eSA9IHJlc3BvbnNlLmdldEVudGl0eSgpOworICAgICAgICAgICAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IGVudGl0eS5nZXRDb250ZW50KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRXJyb3Igd2hpbGUgcmV0cmlldmluZyBYTUwgZmlsZSAiICsgdXJsLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlci5zZXRJbnB1dChpbnB1dFN0cmVhbSwgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkVycm9yIHdoaWxlIHJlYWRpbmcgWE1MIGZpbGUgZnJvbSAiICsgdXJsLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBhcnNlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIFhtbFB1bGxQYXJzZXIgZm9yIHRoZSBwcm92aWRlZCBsb2NhbCByZXNvdXJjZS4gQ2FuIGJlIG92ZXJsb2FkZWQgdG8gcHJvdmlkZSB5b3VyCisgICAgICogb3duIHBhcnNlci4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VVcmkgQSBmdWxseSBxdWFsaWZpZWQgcmVzb3VyY2UgbmFtZSByZWZlcmVuY2luZyBhIGxvY2FsIFhNTCByZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIEFuIFhtbFB1bGxQYXJzZXIgb24gdGhpcyByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgWG1sUHVsbFBhcnNlciBnZXRSZXNvdXJjZVhtbFB1bGxQYXJzZXIoVXJpIHJlc291cmNlVXJpKSB7CisgICAgICAgIE9wZW5SZXNvdXJjZUlkUmVzdWx0IHJlc291cmNlSWQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNvdXJjZUlkID0gZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLmdldFJlc291cmNlSWQocmVzb3VyY2VVcmkpOworICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlSWQuci5nZXRYbWwocmVzb3VyY2VJZC5pZCk7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiWE1MIHJlc291cmNlIG5vdCBmb3VuZDogIiArIHJlc291cmNlVXJpLnRvU3RyaW5nKCksIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zICJ2bmQuYW5kcm9pZC5jdXJzb3IuZGlyL3htbGRvYyIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKFVyaSB1cmkpIHsKKyAgICAgICAgcmV0dXJuICJ2bmQuYW5kcm9pZC5jdXJzb3IuZGlyL3htbGRvYyI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBDb250ZW50UHJvdmlkZXIgaXMgcmVhZC1vbmx5LiBUaGlzIG1ldGhvZCB0aHJvd3MgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisgICAgICoqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVcmkgaW5zZXJ0KFVyaSB1cmksIENvbnRlbnRWYWx1ZXMgdmFsdWVzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgQ29udGVudFByb3ZpZGVyIGlzIHJlYWQtb25seS4gVGhpcyBtZXRob2QgdGhyb3dzIGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgorICAgICAqKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlbGV0ZShVcmkgdXJpLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgQ29udGVudFByb3ZpZGVyIGlzIHJlYWQtb25seS4gVGhpcyBtZXRob2QgdGhyb3dzIGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgorICAgICAqKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHVwZGF0ZShVcmkgdXJpLCBDb250ZW50VmFsdWVzIHZhbHVlcywgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBYTUxDdXJzb3IgZXh0ZW5kcyBNYXRyaXhDdXJzb3IgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhdHRlcm4gbVNlbGVjdGlvblBhdHRlcm47CisgICAgICAgIHByaXZhdGUgUGF0dGVybltdIG1Qcm9qZWN0aW9uUGF0dGVybnM7CisgICAgICAgIHByaXZhdGUgU3RyaW5nW10gbUF0dHJpYnV0ZU5hbWVzOworICAgICAgICBwcml2YXRlIFN0cmluZ1tdIG1DdXJyZW50VmFsdWVzOworICAgICAgICBwcml2YXRlIEJpdFNldFtdIG1BY3RpdmVUZXh0RGVwdGhNYXNrOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtTnVtYmVyT2ZQcm9qZWN0aW9uczsKKworICAgICAgICBwdWJsaWMgWE1MQ3Vyc29yKFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHByb2plY3Rpb25zKSB7CisgICAgICAgICAgICBzdXBlcihwcm9qZWN0aW9ucyk7CisgICAgICAgICAgICAvLyBUaGUgZmlyc3QgY29sdW1uIGluIHByb2plY3Rpb25zIGlzIHVzZWQgZm9yIHRoZSBfSUQKKyAgICAgICAgICAgIG1OdW1iZXJPZlByb2plY3Rpb25zID0gcHJvamVjdGlvbnMubGVuZ3RoIC0gMTsKKyAgICAgICAgICAgIG1TZWxlY3Rpb25QYXR0ZXJuID0gY3JlYXRlUGF0dGVybihzZWxlY3Rpb24pOworICAgICAgICAgICAgY3JlYXRlUHJvamVjdGlvblBhdHRlcm4ocHJvamVjdGlvbnMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBQYXR0ZXJuIGNyZWF0ZVBhdHRlcm4oU3RyaW5nIGlucHV0KSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9IGlucHV0LnJlcGxhY2VBbGwoIi8vIiwgIi8oLiovfCkiKS5yZXBsYWNlQWxsKCJeLyIsICJeLyIpICsgIiQiOworICAgICAgICAgICAgcmV0dXJuIFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjcmVhdGVQcm9qZWN0aW9uUGF0dGVybihTdHJpbmdbXSBwcm9qZWN0aW9ucykgeworICAgICAgICAgICAgbVByb2plY3Rpb25QYXR0ZXJucyA9IG5ldyBQYXR0ZXJuW21OdW1iZXJPZlByb2plY3Rpb25zXTsKKyAgICAgICAgICAgIG1BdHRyaWJ1dGVOYW1lcyA9IG5ldyBTdHJpbmdbbU51bWJlck9mUHJvamVjdGlvbnNdOworICAgICAgICAgICAgbUFjdGl2ZVRleHREZXB0aE1hc2sgPSBuZXcgQml0U2V0W21OdW1iZXJPZlByb2plY3Rpb25zXTsKKyAgICAgICAgICAgIC8vIEFkZCBhIGNvbHVtbiB0byBzdG9yZSBfSUQKKyAgICAgICAgICAgIG1DdXJyZW50VmFsdWVzID0gbmV3IFN0cmluZ1ttTnVtYmVyT2ZQcm9qZWN0aW9ucyArIDFdOworCisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bU51bWJlck9mUHJvamVjdGlvbnM7IGkrKykgeworICAgICAgICAgICAgICAgIG1BY3RpdmVUZXh0RGVwdGhNYXNrW2ldID0gbmV3IEJpdFNldCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0aW9uID0gcHJvamVjdGlvbnNbaSArIDFdOyAvLyArMSB0byBza2lwIHRoZSBfSUQgY29sdW1uCisgICAgICAgICAgICAgICAgaW50IGF0SW5kZXggPSBwcm9qZWN0aW9uLmxhc3RJbmRleE9mKCdAJywgcHJvamVjdGlvbi5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgaWYgKGF0SW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBtQXR0cmlidXRlTmFtZXNbaV0gPSBwcm9qZWN0aW9uLnN1YnN0cmluZyhhdEluZGV4KzEpOworICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uID0gcHJvamVjdGlvbi5zdWJzdHJpbmcoMCwgYXRJbmRleCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZU5hbWVzW2ldID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDb25mb3JtcyB0byBYUGF0aCBzdGFuZGFyZDogcmVmZXJlbmNlIHRvIGxvY2FsIGNvbnRleHQgc3RhcnRzIHdpdGggYSAuCisgICAgICAgICAgICAgICAgaWYgKHByb2plY3Rpb24uY2hhckF0KDApID09ICcuJykgeworICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uID0gcHJvamVjdGlvbi5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Qcm9qZWN0aW9uUGF0dGVybnNbaV0gPSBjcmVhdGVQYXR0ZXJuKHByb2plY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcGFyc2VXaXRoKFhtbFB1bGxQYXJzZXIgcGFyc2VyKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBwYXRoID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIFN0YWNrPEludGVnZXI+IHBhdGhMZW5ndGhTdGFjayA9IG5ldyBTdGFjazxJbnRlZ2VyPigpOworCisgICAgICAgICAgICAvLyBUaGVyZSBhcmUgdHdvIHBhcnNpbmcgbW9kZTogaW4gcm9vdCBtb2RlLCByb290UGF0aCBpcyB1cGRhdGVkIGFuZCBub2RlcyBtYXRjaGluZworICAgICAgICAgICAgLy8gc2VsZWN0aW9uUGF0dGVybiBhcmUgc2VhcmNoZWQgZm9yIGFuZCBjdXJyZW50Tm9kZURlcHRoIGlzIG5lZ2F0aXZlLgorICAgICAgICAgICAgLy8gV2hlbiBhIG5vZGUgbWF0Y2hpbmcgc2VsZWN0aW9uUGF0dGVybiBpcyBmb3VuZCwgY3VycmVudE5vZGVEZXB0aCBpcyBzZXQgdG8gMCBhbmQKKyAgICAgICAgICAgIC8vIHVwZGF0ZWQgYXMgY2hpbGRyZW4gYXJlIHBhcnNlZCBhbmQgcHJvamVjdGlvblBhdHRlcm5zIGFyZSBzZWFyY2hlZCBpbiBub2RlUGF0aC4KKyAgICAgICAgICAgIGludCBjdXJyZW50Tm9kZURlcHRoID0gLTE7CisKKyAgICAgICAgICAgIC8vIEluZGV4IHdoZXJlIGxvY2FsIHNlbGVjdGVkIG5vZGUgcGF0aCBzdGFydHMgZnJvbSBpbiBwYXRoCisgICAgICAgICAgICBpbnQgY3VycmVudE5vZGVQYXRoU3RhcnRJbmRleCA9IDA7CisKKyAgICAgICAgICAgIGludCBldmVudFR5cGUgPSBwYXJzZXIuZ2V0RXZlbnRUeXBlKCk7CisgICAgICAgICAgICB3aGlsZSAoZXZlbnRUeXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBwYXRoCisgICAgICAgICAgICAgICAgICAgIHBhdGhMZW5ndGhTdGFjay5wdXNoKHBhdGgubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZCgnLycpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldFByZWZpeCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGxvY2FsIFhtbCByZXNvdXJjZSBwYXJzZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcnNlci5nZXRQcmVmaXgoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmQocHJlZml4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKCc6Jyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmQocGFyc2VyLmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlRGVwdGggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGVEZXB0aCsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBub2RlIG1hdGNoaW5nIHNlbGVjdGlvbiBpcyBmb3VuZDogaW5pdGlhbGl6ZSBjaGlsZCBwYXJzaW5nIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uUGF0dGVybi5tYXRjaGVyKHBhdGgudG9TdHJpbmcoKSkubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGVEZXB0aCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGVQYXRoU3RhcnRJbmRleCA9IHBhdGgubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZXNbMF0gPSBJbnRlZ2VyLnRvU3RyaW5nKGdldENvdW50KCkpOyAvLyBfSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZlByb2plY3Rpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdmFsdWVzIHRvIGRlZmF1bHQgKGVtcHR5IHN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZXNbaSArIDFdID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUZXh0RGVwdGhNYXNrW2ldLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyB0ZXN0IGhhcyB0byBiZSBzZXBhcmF0ZWQgZnJvbSB0aGUgcHJldmlvdXMgb25lIGFzIGN1cnJlbnROb2RlRGVwdGggY2FuCisgICAgICAgICAgICAgICAgICAgIC8vIGJlIG1vZGlmaWVkIGFib3ZlICh3aGVuIGEgbm9kZSBtYXRjaGluZyBzZWxlY3Rpb24gaXMgZm91bmQpLgorICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGVEZXB0aCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxOb2RlUGF0aCA9IHBhdGguc3Vic3RyaW5nKGN1cnJlbnROb2RlUGF0aFN0YXJ0SW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZQcm9qZWN0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Qcm9qZWN0aW9uUGF0dGVybnNbaV0ubWF0Y2hlcihsb2NhbE5vZGVQYXRoKS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG1BdHRyaWJ1dGVOYW1lc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFZhbHVlc1tpICsgMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBhdHRyaWJ1dGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRleHREZXB0aE1hc2tbaV0uc2V0KGN1cnJlbnROb2RlRGVwdGgsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBYbWxQdWxsUGFyc2VyLkVORF9UQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUG9wIGxhc3Qgbm9kZSBmcm9tIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHBhdGhMZW5ndGhTdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgcGF0aC5zZXRMZW5ndGgobGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGVEZXB0aCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGVEZXB0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGVhdmluZyBhIHNlbGVjdGlvbiBtYXRjaGluZyBub2RlOiBhZGQgYSBuZXcgcm93IHdpdGggcmVzdWx0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJvdyhtQ3VycmVudFZhbHVlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mUHJvamVjdGlvbnM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVGV4dERlcHRoTWFza1tpXS5zZXQoY3VycmVudE5vZGVEZXB0aCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlRGVwdGgtLTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnRUeXBlID09IFhtbFB1bGxQYXJzZXIuVEVYVCkgJiYgKCFwYXJzZXIuaXNXaGl0ZXNwYWNlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mUHJvamVjdGlvbnM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50Tm9kZURlcHRoID49IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1BY3RpdmVUZXh0RGVwdGhNYXNrW2ldLmdldChjdXJyZW50Tm9kZURlcHRoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFZhbHVlc1tpICsgMV0gKz0gcGFyc2VyLmdldFRleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IHBhcnNlci5uZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FjdGl2aXR5SW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm8uamF2YQppbmRleCAzOTVjMzkyLi5lMjFjYjk3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FjdGl2aXR5SW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvLmphdmEKQEAgLTE0OSw2ICsxNDksMjcgQEAKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5SLmF0dHIjZmluaXNoT25DbG9zZVN5c3RlbURpYWxvZ3N9IGF0dHJpYnV0ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZJTklTSF9PTl9DTE9TRV9TWVNURU1fRElBTE9HUyA9IDB4MDEwMDsKKyAgICAvKiogCisgICAgICogQml0IGluIHtAbGluayAjZmxhZ3N9IGNvcnJlc3BvbmRpbmcgdG8gYW4gaW1tZXJzaXZlIGFjdGl2aXR5CisgICAgICogdGhhdCB3aXNoZXMgbm90IHRvIGJlIGludGVycnVwdGVkIGJ5IG5vdGlmaWNhdGlvbnMuCisgICAgICogQXBwbGljYXRpb25zIHRoYXQgaGlkZSB0aGUgc3lzdGVtIG5vdGlmaWNhdGlvbiBiYXIgd2l0aAorICAgICAqIHtAbGluayBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMjRkxBR19GVUxMU0NSRUVOfQorICAgICAqIG1heSBzdGlsbCBiZSBpbnRlcnJ1cHRlZCBieSBoaWdoLXByaW9yaXR5IG5vdGlmaWNhdGlvbnM7IGZvciBleGFtcGxlLCBhbgorICAgICAqIGluY29taW5nIHBob25lIGNhbGwgbWF5IHVzZQorICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb24jZnVsbFNjcmVlbkludGVudCBmdWxsU2NyZWVuSW50ZW50fQorICAgICAqIHRvIHByZXNlbnQgYSBmdWxsLXNjcmVlbiBpbi1jYWxsIGFjdGl2aXR5IHRvIHRoZSB1c2VyLCBwYXVzaW5nIHRoZQorICAgICAqIGN1cnJlbnQgYWN0aXZpdHkgYXMgYSBzaWRlLWVmZmVjdC4gQW4gYWN0aXZpdHkgd2l0aAorICAgICAqIHtAbGluayAjRkxBR19JTU1FUlNJVkV9IHNldCwgaG93ZXZlciwgd2lsbCBub3QgYmUgaW50ZXJydXB0ZWQ7IHRoZQorICAgICAqIG5vdGlmaWNhdGlvbiBtYXkgYmUgc2hvd24gaW4gc29tZSBvdGhlciB3YXkgKHN1Y2ggYXMgYSBzbWFsbCBmbG9hdGluZworICAgICAqICJ0b2FzdCIgd2luZG93KS4KKyAgICAgKiB7QHNlZSBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb24jRkxBR19ISUdIX1BSSU9SSVRZfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSU1NRVJTSVZFID0gMHgwMjAwOworICAgIC8qKgorICAgICAqIFZhbHVlIGZvciB7QGxpbmsgI2ZsYWdzfTogdHJ1ZSB3aGVuIHRoZSBhcHBsaWNhdGlvbidzIHJlbmRlcmluZyBzaG91bGQKKyAgICAgKiBiZSBoYXJkd2FyZSBhY2NlbGVyYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEID0gMHgwNDAwOwogICAgIC8qKgogICAgICAqIE9wdGlvbnMgdGhhdCBoYXZlIGJlZW4gc2V0IGluIHRoZSBhY3Rpdml0eSBkZWNsYXJhdGlvbiBpbiB0aGUKICAgICAgKiBtYW5pZmVzdC4KQEAgLTE1OSw2ICsxODAsNyBAQAogICAgICAqIHtAbGluayAjRkxBR19TVEFURV9OT1RfTkVFREVEfSwge0BsaW5rICNGTEFHX0VYQ0xVREVfRlJPTV9SRUNFTlRTfSwKICAgICAgKiB7QGxpbmsgI0ZMQUdfQUxMT1dfVEFTS19SRVBBUkVOVElOR30sIHtAbGluayAjRkxBR19OT19ISVNUT1JZfSwKICAgICAgKiB7QGxpbmsgI0ZMQUdfRklOSVNIX09OX0NMT1NFX1NZU1RFTV9ESUFMT0dTfSwKKyAgICAgKiB7QGxpbmsgI0ZMQUdfSU1NRVJTSVZFfSwge0BsaW5rICNGTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEfQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZmxhZ3M7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyLmphdmEKaW5kZXggZTIwY2I1ZS4uOTJhOGE5OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyLmphdmEKQEAgLTE2LDkgKzE2LDYgQEAKIAogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucG07CiAKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247Ci0KIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CkBAIC0zMCwxNCArMjcsMTQgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGF0dGVybk1hdGNoZXI7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7Ci0KIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlhtbFV0aWxzOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtNDgsNyArNDUsNiBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwogaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKIApAQCAtMTQ5OCwxMiArMTQ5NCwxOCBAQAogICAgICAgICAgICAgYWkubm9uTG9jYWxpemVkTGFiZWwgPSB2LmNvZXJjZVRvU3RyaW5nKCk7CiAgICAgICAgIH0KIAorICAgICAgICBpbnQgZGVmYXVsdFRoZW1lID0gMDsKKyAgICAgICAgaWYgKG93bmVyLmFwcGxpY2F0aW9uSW5mby50YXJnZXRTZGtWZXJzaW9uID49IGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUy5IT05FWUNPTUIpIHsKKyAgICAgICAgICAgIC8vIEFzIG9mIGhvbmV5Y29tYiwgdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gdGhlbWUgaXMgaG9sb2dyYXBoaWMuCisgICAgICAgICAgICBkZWZhdWx0VGhlbWUgPSBhbmRyb2lkLlIuc3R5bGUuVGhlbWVfSG9sbzsKKyAgICAgICAgfQorCiAgICAgICAgIGFpLmljb24gPSBzYS5nZXRSZXNvdXJjZUlkKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2ljb24sIDApOwogICAgICAgICBhaS5sb2dvID0gc2EuZ2V0UmVzb3VyY2VJZCgKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl9sb2dvLCAwKTsKICAgICAgICAgYWkudGhlbWUgPSBzYS5nZXRSZXNvdXJjZUlkKAotICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX3RoZW1lLCAwKTsKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl90aGVtZSwgZGVmYXVsdFRoZW1lKTsKICAgICAgICAgYWkuZGVzY3JpcHRpb25SZXMgPSBzYS5nZXRSZXNvdXJjZUlkKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2Rlc2NyaXB0aW9uLCAwKTsKIApAQCAtMTUzNSw2ICsxNTM3LDEwIEBACiAgICAgICAgICAgICBhaS5mbGFncyB8PSBBcHBsaWNhdGlvbkluZm8uRkxBR19WTV9TQUZFX01PREU7CiAgICAgICAgIH0KIAorICAgICAgICBib29sZWFuIGhhcmR3YXJlQWNjZWxlcmF0ZWQgPSBzYS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2hhcmR3YXJlQWNjZWxlcmF0ZWQsCisgICAgICAgICAgICAgICAgZmFsc2UpOworCiAgICAgICAgIGlmIChzYS5nZXRCb29sZWFuKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2hhc0NvZGUsCiAgICAgICAgICAgICAgICAgdHJ1ZSkpIHsKQEAgLTE2MzQsNyArMTY0MCw4IEBACiAKICAgICAgICAgICAgIFN0cmluZyB0YWdOYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKICAgICAgICAgICAgIGlmICh0YWdOYW1lLmVxdWFscygiYWN0aXZpdHkiKSkgewotICAgICAgICAgICAgICAgIEFjdGl2aXR5IGEgPSBwYXJzZUFjdGl2aXR5KG93bmVyLCByZXMsIHBhcnNlciwgYXR0cnMsIGZsYWdzLCBvdXRFcnJvciwgZmFsc2UpOworICAgICAgICAgICAgICAgIEFjdGl2aXR5IGEgPSBwYXJzZUFjdGl2aXR5KG93bmVyLCByZXMsIHBhcnNlciwgYXR0cnMsIGZsYWdzLCBvdXRFcnJvciwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZUFjY2VsZXJhdGVkKTsKICAgICAgICAgICAgICAgICBpZiAoYSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1QYXJzZUVycm9yID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9QQVJTRV9GQUlMRURfTUFOSUZFU1RfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xNjQzLDcgKzE2NTAsNyBAQAogICAgICAgICAgICAgICAgIG93bmVyLmFjdGl2aXRpZXMuYWRkKGEpOwogCiAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzKCJyZWNlaXZlciIpKSB7Ci0gICAgICAgICAgICAgICAgQWN0aXZpdHkgYSA9IHBhcnNlQWN0aXZpdHkob3duZXIsIHJlcywgcGFyc2VyLCBhdHRycywgZmxhZ3MsIG91dEVycm9yLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBBY3Rpdml0eSBhID0gcGFyc2VBY3Rpdml0eShvd25lciwgcmVzLCBwYXJzZXIsIGF0dHJzLCBmbGFncywgb3V0RXJyb3IsIHRydWUsIGZhbHNlKTsKICAgICAgICAgICAgICAgICBpZiAoYSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1QYXJzZUVycm9yID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9QQVJTRV9GQUlMRURfTUFOSUZFU1RfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xNzc4LDcgKzE3ODUsOCBAQAogCiAgICAgcHJpdmF0ZSBBY3Rpdml0eSBwYXJzZUFjdGl2aXR5KFBhY2thZ2Ugb3duZXIsIFJlc291cmNlcyByZXMsCiAgICAgICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZmxhZ3MsIFN0cmluZ1tdIG91dEVycm9yLAotICAgICAgICAgICAgYm9vbGVhbiByZWNlaXZlcikgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVjZWl2ZXIsIGJvb2xlYW4gaGFyZHdhcmVBY2NlbGVyYXRlZCkKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFR5cGVkQXJyYXkgc2EgPSByZXMub2J0YWluQXR0cmlidXRlcyhhdHRycywKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBY3Rpdml0eSk7CiAKQEAgLTE4ODMsNyArMTg5MSwxOSBAQAogICAgICAgICAgICAgYS5pbmZvLmZsYWdzIHw9IEFjdGl2aXR5SW5mby5GTEFHX0ZJTklTSF9PTl9DTE9TRV9TWVNURU1fRElBTE9HUzsKICAgICAgICAgfQogCisgICAgICAgIGlmIChzYS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2ltbWVyc2l2ZSwKKyAgICAgICAgICAgICAgICBmYWxzZSkpIHsKKyAgICAgICAgICAgIGEuaW5mby5mbGFncyB8PSBBY3Rpdml0eUluZm8uRkxBR19JTU1FUlNJVkU7CisgICAgICAgIH0KKyAgICAgICAgCiAgICAgICAgIGlmICghcmVjZWl2ZXIpIHsKKyAgICAgICAgICAgIGlmIChzYS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBY3Rpdml0eV9oYXJkd2FyZUFjY2VsZXJhdGVkLAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZUFjY2VsZXJhdGVkKSkgeworICAgICAgICAgICAgICAgIGEuaW5mby5mbGFncyB8PSBBY3Rpdml0eUluZm8uRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgYS5pbmZvLmxhdW5jaE1vZGUgPSBzYS5nZXRJbnQoCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2xhdW5jaE1vZGUsCiAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5SW5mby5MQVVOQ0hfTVVMVElQTEUpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQXNzZXRGaWxlRGVzY3JpcHRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQXNzZXRGaWxlRGVzY3JpcHRvci5qYXZhCmluZGV4IGEzN2U0ZTguLjAxYWUxZGEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0Fzc2V0RmlsZURlc2NyaXB0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Bc3NldEZpbGVEZXNjcmlwdG9yLmphdmEKQEAgLTI1LDggKzI1LDYgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOwogCiAvKioKICAqIEZpbGUgZGVzY3JpcHRvciBvZiBhbiBlbnRyeSBpbiB0aGUgQXNzZXRNYW5hZ2VyLiAgVGhpcyBwcm92aWRlcyB5b3VyIG93bgpAQCAtNTEsNyArNDksNyBAQAogICAgICAqIEBwYXJhbSBzdGFydE9mZnNldCBUaGUgbG9jYXRpb24gd2l0aGluIHRoZSBmaWxlIHRoYXQgdGhlIGFzc2V0IHN0YXJ0cy4KICAgICAgKiBUaGlzIG11c3QgYmUgMCBpZiBsZW5ndGggaXMgVU5LTk9XTl9MRU5HVEguCiAgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBhc3NldCwgb3IKLSAgICAgKiB7QGxpbmsgI1VOS05PV05fTEVOR1RIIGlmIGl0IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAgICAgKiB7QGxpbmsgI1VOS05PV05fTEVOR1RIfSBpZiBpdCBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUuCiAgICAgICovCiAgICAgcHVibGljIEFzc2V0RmlsZURlc2NyaXB0b3IoUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQsIGxvbmcgc3RhcnRPZmZzZXQsCiAgICAgICAgICAgICBsb25nIGxlbmd0aCkgewpAQCAtMTI1LDEzICsxMjMsNiBAQAogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgbUZkLmNsb3NlKCk7CiAgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoaXMgZmlsZSBkZXNjcmlwdG9yIGlzIGZvciBhIG1lbW9yeSBmaWxlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc01lbW9yeUZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gTWVtb3J5RmlsZS5pc01lbW9yeUZpbGUobUZkLmdldEZpbGVEZXNjcmlwdG9yKCkpOwotICAgIH0KIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IGF1dG8tY2xvc2UgaW5wdXQgc3RyZWFtIGZvciB0aGlzIGFzc2V0LiAgVGhpcwpAQCAtMTQyLDEyICsxMzMsNiBAQAogICAgICAqIHNob3VsZCBvbmx5IGNhbGwgdGhpcyBvbmNlIGZvciBhIHBhcnRpY3VsYXIgYXNzZXQuCiAgICAgICovCiAgICAgcHVibGljIEZpbGVJbnB1dFN0cmVhbSBjcmVhdGVJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc01lbW9yeUZpbGUoKSkgewotICAgICAgICAgICAgaWYgKG1MZW5ndGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRmlsZSBsZW5ndGggdG9vIGxhcmdlIGZvciBhIG1lbW9yeSBmaWxlOiAiICsgbUxlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEF1dG9DbG9zZU1lbW9yeUZpbGVJbnB1dFN0cmVhbShtRmQsIChpbnQpbUxlbmd0aCk7Ci0gICAgICAgIH0KICAgICAgICAgaWYgKG1MZW5ndGggPCAwKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yLkF1dG9DbG9zZUlucHV0U3RyZWFtKG1GZCk7CiAgICAgICAgIH0KQEAgLTI3Niw2NiArMjYxLDYgQEAKICAgICAgICAgICAgIHN1cGVyLnJlc2V0KCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQW4gaW5wdXQgc3RyZWFtIHRoYXQgcmVhZHMgZnJvbSBhIE1lbW9yeUZpbGUgYW5kIGNsb3NlcyBpdCB3aGVuIHRoZSBzdHJlYW0gaXMgY2xvc2VkLgotICAgICAqIFRoaXMgZXh0ZW5kcyBGaWxlSW5wdXRTdHJlYW0ganVzdCBiZWNhdXNlIHtAbGluayAjY3JlYXRlSW5wdXRTdHJlYW19IHJldHVybnMKLSAgICAgKiBhIEZpbGVJbnB1dFN0cmVhbS4gQWxsIHRoZSBGaWxlSW5wdXRTdHJlYW0gbWV0aG9kcyBhcmUKLSAgICAgKiBvdmVycmlkZGVuIHRvIHVzZSB0aGUgTWVtb3J5RmlsZSBpbnN0ZWFkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEF1dG9DbG9zZU1lbW9yeUZpbGVJbnB1dFN0cmVhbSBleHRlbmRzIEZpbGVJbnB1dFN0cmVhbSB7Ci0gICAgICAgIHByaXZhdGUgUGFyY2VsRmlsZURlc2NyaXB0b3IgbVBhcmNlbEZkOwotICAgICAgICBwcml2YXRlIE1lbW9yeUZpbGUgbUZpbGU7Ci0gICAgICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gbVN0cmVhbTsKLQotICAgICAgICBwdWJsaWMgQXV0b0Nsb3NlTWVtb3J5RmlsZUlucHV0U3RyZWFtKFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkLCBpbnQgbGVuZ3RoKQotICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzdXBlcihmZC5nZXRGaWxlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgICAgIG1QYXJjZWxGZCA9IGZkOwotICAgICAgICAgICAgbUZpbGUgPSBuZXcgTWVtb3J5RmlsZShmZC5nZXRGaWxlRGVzY3JpcHRvcigpLCBsZW5ndGgsICJyIik7Ci0gICAgICAgICAgICBtU3RyZWFtID0gbUZpbGUuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbVN0cmVhbS5hdmFpbGFibGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBtUGFyY2VsRmQuY2xvc2UoKTsgIC8vIG11c3QgY2xvc2UgUGFyY2VsRmlsZURlc2NyaXB0b3IsIG5vdCBqdXN0IHRoZSBmaWxlIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIGl0IGNvdWxkIGJlIGEgc3ViY2xhc3Mgb2YgUGFyY2VsRmlsZURlc2NyaXB0b3IuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEUuZy4gQ29udGVudFJlc29sdmVyLlBhcmNlbEZpbGVEZXNjcmlwdG9ySW5uZXIuY2xvc2UoKSByZWxlYXNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGNvbnRlbnQgcHJvdmlkZXIKLSAgICAgICAgICAgIG1GaWxlLmNsb3NlKCk7ICAgICAgLy8gdG8gdW5tYXAgdGhlIG1lbW9yeSBmaWxlIGZyb20gdGhlIGFkZHJlc3Mgc3BhY2UuCi0gICAgICAgICAgICBtU3RyZWFtLmNsb3NlKCk7ICAgIC8vIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRmlsZUNoYW5uZWwgZ2V0Q2hhbm5lbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbVN0cmVhbS5yZWFkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBtU3RyZWFtLnJlYWQoYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBtU3RyZWFtLnJlYWQoYnVmZmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbVN0cmVhbS5za2lwKGNvdW50KTsKLSAgICAgICAgfQotICAgIH0KIAogICAgIC8qKgogICAgICAqIEFuIE91dHB1dFN0cmVhbSB5b3UgY2FuIGNyZWF0ZSBvbiBhIFBhcmNlbEZpbGVEZXNjcmlwdG9yLCB3aGljaCB3aWxsCkBAIC00MjIsMTUgKzM0Nyw0IEBACiAgICAgICAgIH0KICAgICB9OwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBBc3NldEZpbGVEZXNjcmlwdG9yIGZyb20gYSBtZW1vcnkgZmlsZS4KLSAgICAgKgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBc3NldEZpbGVEZXNjcmlwdG9yIGZyb21NZW1vcnlGaWxlKE1lbW9yeUZpbGUgbWVtb3J5RmlsZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gbWVtb3J5RmlsZS5nZXRQYXJjZWxGaWxlRGVzY3JpcHRvcigpOwotICAgICAgICByZXR1cm4gbmV3IEFzc2V0RmlsZURlc2NyaXB0b3IoZmQsIDAsIG1lbW9yeUZpbGUubGVuZ3RoKCkpOwotICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQ29uZmlndXJhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQ29uZmlndXJhdGlvbi5qYXZhCmluZGV4IDAyOTU2YmEuLjJmMTEwZjAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0NvbmZpZ3VyYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uLmphdmEKQEAgLTI2NiwxMSArMjY2LDE4IEBACiAgICAgICAgIHNiLmFwcGVuZCgiLyIpOwogICAgICAgICBzYi5hcHBlbmQobmF2aWdhdGlvbkhpZGRlbik7CiAgICAgICAgIHNiLmFwcGVuZCgiIG9yaWVuPSIpOwotICAgICAgICBzYi5hcHBlbmQob3JpZW50YXRpb24pOwotICAgICAgICBzYi5hcHBlbmQoIiBsYXlvdXQ9Iik7Ci0gICAgICAgIHNiLmFwcGVuZChzY3JlZW5MYXlvdXQpOwotICAgICAgICBzYi5hcHBlbmQoIiB1aU1vZGU9Iik7Ci0gICAgICAgIHNiLmFwcGVuZCh1aU1vZGUpOworICAgICAgICBzd2l0Y2gob3JpZW50YXRpb24pIHsKKyAgICAgICAgICAgIGNhc2UgT1JJRU5UQVRJT05fTEFORFNDQVBFOgorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiTCIpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1JJRU5UQVRJT05fUE9SVFJBSVQ6CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJQIik7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQob3JpZW50YXRpb24pOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiIGxheW91dD0weCIpOworICAgICAgICBzYi5hcHBlbmQoamF2YS5sYW5nLkludGVnZXIudG9IZXhTdHJpbmcoc2NyZWVuTGF5b3V0KSk7CisgICAgICAgIHNiLmFwcGVuZCgiIHVpTW9kZT0weCIpOworICAgICAgICBzYi5hcHBlbmQoamF2YS5sYW5nLkludGVnZXIudG9IZXhTdHJpbmcodWlNb2RlKSk7CiAgICAgICAgIGlmIChzZXEgIT0gMCkgewogICAgICAgICAgICAgc2IuYXBwZW5kKCIgc2VxPSIpOwogICAgICAgICAgICAgc2IuYXBwZW5kKHNlcSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9QbHVyYWxSdWxlcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUGx1cmFsUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRjZTNjMS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9QbHVyYWxSdWxlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuY29udGVudC5yZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0vKgotICogWXVjay1vLiAgVGhpcyBpcyBub3QgdGhlIHJpZ2h0IHdheSB0byBpbXBsZW1lbnQgdGhpcy4gIFdoZW4gdGhlIElDVSBQbHVyYWxSdWxlcwotICogb2JqZWN0IGhhcyBiZWVuIGludGVncmF0ZWQgdG8gYW5kcm9pZCwgd2Ugc2hvdWxkIHN3aXRjaCB0byB0aGF0LiAgRm9yIG5vdywgeXVjay1vLgotICovCi0KLWFic3RyYWN0IGNsYXNzIFBsdXJhbFJ1bGVzIHsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgUVVBTlRJVFlfT1RIRVIgPSAweDAwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9aRVJPICA9IDB4MDAwMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFFVQU5USVRZX09ORSAgID0gMHgwMDAyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUVVBTlRJVFlfVFdPICAgPSAweDAwMDQ7Ci0gICAgc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9GRVcgICA9IDB4MDAwODsKLSAgICBzdGF0aWMgZmluYWwgaW50IFFVQU5USVRZX01BTlkgID0gMHgwMDEwOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBJRF9PVEhFUiA9IDB4MDEwMDAwMDQ7Ci0KLSAgICBhYnN0cmFjdCBpbnQgcXVhbnRpdHlGb3JOdW1iZXIoaW50IG4pOwotCi0gICAgZmluYWwgaW50IGF0dHJGb3JOdW1iZXIoaW50IG4pIHsKLSAgICAgICAgcmV0dXJuIFBsdXJhbFJ1bGVzLmF0dHJGb3JRdWFudGl0eShxdWFudGl0eUZvck51bWJlcihuKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGludCBhdHRyRm9yUXVhbnRpdHkoaW50IHF1YW50aXR5KSB7Ci0gICAgICAgIC8vIHNlZSBpbmNsdWRlL3V0aWxzL1Jlc291cmNlVHlwZXMuaAotICAgICAgICBzd2l0Y2ggKHF1YW50aXR5KSB7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX1pFUk86IHJldHVybiAweDAxMDAwMDA1OwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9PTkU6ICByZXR1cm4gMHgwMTAwMDAwNjsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfVFdPOiAgcmV0dXJuIDB4MDEwMDAwMDc7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX0ZFVzogIHJldHVybiAweDAxMDAwMDA4OwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9NQU5ZOiByZXR1cm4gMHgwMTAwMDAwOTsKLSAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIElEX09USEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBzdHJpbmdGb3JRdWFudGl0eShpbnQgcXVhbnRpdHkpIHsKLSAgICAgICAgc3dpdGNoIChxdWFudGl0eSkgewotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9aRVJPOgotICAgICAgICAgICAgICAgIHJldHVybiAiemVybyI7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX09ORToKLSAgICAgICAgICAgICAgICByZXR1cm4gIm9uZSI7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX1RXTzoKLSAgICAgICAgICAgICAgICByZXR1cm4gInR3byI7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX0ZFVzoKLSAgICAgICAgICAgICAgICByZXR1cm4gImZldyI7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX01BTlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJtYW55IjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvdGhlciI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgZmluYWwgUGx1cmFsUnVsZXMgcnVsZUZvckxvY2FsZShMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgIFN0cmluZyBsYW5nID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0gICAgICAgIGlmICgiY3MiLmVxdWFscyhsYW5nKSkgewotICAgICAgICAgICAgaWYgKGNzID09IG51bGwpIGNzID0gbmV3IGNzKCk7Ci0gICAgICAgICAgICByZXR1cm4gY3M7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZW4gPT0gbnVsbCkgZW4gPSBuZXcgZW4oKTsKLSAgICAgICAgICAgIHJldHVybiBlbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFBsdXJhbFJ1bGVzIGNzOwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIGNzIGV4dGVuZHMgUGx1cmFsUnVsZXMgewotICAgICAgICBpbnQgcXVhbnRpdHlGb3JOdW1iZXIoaW50IG4pIHsKLSAgICAgICAgICAgIGlmIChuID09IDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUVVBTlRJVFlfT05FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobiA+PSAyICYmIG4gPD0gNCkgewotICAgICAgICAgICAgICAgIHJldHVybiBRVUFOVElUWV9GRVc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUVVBTlRJVFlfT1RIRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBQbHVyYWxSdWxlcyBlbjsKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBlbiBleHRlbmRzIFBsdXJhbFJ1bGVzIHsKLSAgICAgICAgaW50IHF1YW50aXR5Rm9yTnVtYmVyKGludCBuKSB7Ci0gICAgICAgICAgICBpZiAobiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFFVQU5USVRZX09ORTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBRVUFOVElUWV9PVEhFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMuamF2YQppbmRleCBhNjUxM2FhLi45YjIzYzFlIDEwMDc1NQotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMuamF2YQpAQCAtMTYsNyArMTYsNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY29udGVudC5yZXM7CiAKLQogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuWG1sVXRpbHM7CiAKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwpAQCAtNDIsNiArNDEsOCBAQAogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCitpbXBvcnQgbGliY29yZS5pY3UuTmF0aXZlUGx1cmFsUnVsZXM7CisKIC8qKgogICogQ2xhc3MgZm9yIGFjY2Vzc2luZyBhbiBhcHBsaWNhdGlvbidzIHJlc291cmNlcy4gIFRoaXMgc2l0cyBvbiB0b3Agb2YgdGhlCiAgKiBhc3NldCBtYW5hZ2VyIG9mIHRoZSBhcHBsaWNhdGlvbiAoYWNjZXNzaWJsZSB0aHJvdWdoIGdldEFzc2V0cygpKSBhbmQKQEAgLTUzLDYgKzU0LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0NPTkZJRyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVFJBQ0VfRk9SX1BSRUxPQUQgPSBmYWxzZTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9PVEhFUiA9IDB4MDEwMDAwMDQ7CisKICAgICAvLyBVc2UgdGhlIGN1cnJlbnQgU0RLIHZlcnNpb24gY29kZS4gIElmIHdlIGFyZSBhIGRldmVsb3BtZW50IGJ1aWxkLAogICAgIC8vIGFsc28gYWxsb3cgdGhlIHByZXZpb3VzIFNESyB2ZXJzaW9uICsgMS4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgc1Nka1ZlcnNpb24gPSBCdWlsZC5WRVJTSU9OLlNES19JTlQKQEAgLTkxLDcgKzk0LDcgQEAKICAgICAvKnBhY2thZ2UqLyBmaW5hbCBBc3NldE1hbmFnZXIgbUFzc2V0czsKICAgICBwcml2YXRlIGZpbmFsIENvbmZpZ3VyYXRpb24gbUNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpOwogICAgIC8qcGFja2FnZSovIGZpbmFsIERpc3BsYXlNZXRyaWNzIG1NZXRyaWNzID0gbmV3IERpc3BsYXlNZXRyaWNzKCk7Ci0gICAgUGx1cmFsUnVsZXMgbVBsdXJhbFJ1bGU7CisgICAgcHJpdmF0ZSBOYXRpdmVQbHVyYWxSdWxlcyBtUGx1cmFsUnVsZTsKICAgICAKICAgICBwcml2YXRlIENvbXBhdGliaWxpdHlJbmZvIG1Db21wYXRpYmlsaXR5SW5mbzsKICAgICBwcml2YXRlIERpc3BsYXkgbURlZmF1bHREaXNwbGF5OwpAQCAtMjA4LDkgKzIxMSwxNyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgSUQgZm9yIGEgcGFydGljdWxhcgorICAgICAqIG51bWVyaWNhbCBxdWFudGl0eS4KKyAgICAgKgorICAgICAqIDxwPlNlZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Jlc291cmNlcy9zdHJpbmctcmVzb3VyY2UuaHRtbCNQbHVyYWxzIj5TdHJpbmcKKyAgICAgKiBSZXNvdXJjZXM8L2E+IGZvciBtb3JlIG9uIHF1YW50aXR5IHN0cmluZ3MuCisgICAgICoKICAgICAgKiBAcGFyYW0gaWQgVGhlIGRlc2lyZWQgcmVzb3VyY2UgaWRlbnRpZmllciwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBhYXB0CiAgICAgICogICAgICAgICAgIHRvb2wuIFRoaXMgaW50ZWdlciBlbmNvZGVzIHRoZSBwYWNrYWdlLCB0eXBlLCBhbmQgcmVzb3VyY2UKICAgICAgKiAgICAgICAgICAgZW50cnkuIFRoZSB2YWx1ZSAwIGlzIGFuIGludmFsaWQgaWRlbnRpZmllci4KKyAgICAgKiBAcGFyYW0gcXVhbnRpdHkgVGhlIG51bWJlciB1c2VkIHRvIGdldCB0aGUgY29ycmVjdCBzdHJpbmcgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlJ3MKKyAgICAgKiAgICAgICAgICAgcGx1cmFsIHJ1bGVzLgogICAgICAqCiAgICAgICogQHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiBUaHJvd3MgTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIElEIGRvZXMgbm90IGV4aXN0LgogICAgICAqCkBAIC0yMTgsMjkgKzIyOSw1MiBAQAogICAgICAqICAgICAgICAgcG9zc2libHkgc3R5bGVkIHRleHQgaW5mb3JtYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRRdWFudGl0eVRleHQoaW50IGlkLCBpbnQgcXVhbnRpdHkpIHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBsdXJhbFJ1bGVzIHJ1bGUgPSBnZXRQbHVyYWxSdWxlKCk7Ci0gICAgICAgIENoYXJTZXF1ZW5jZSByZXMgPSBtQXNzZXRzLmdldFJlc291cmNlQmFnVGV4dChpZCwgcnVsZS5hdHRyRm9yTnVtYmVyKHF1YW50aXR5KSk7CisgICAgICAgIE5hdGl2ZVBsdXJhbFJ1bGVzIHJ1bGUgPSBnZXRQbHVyYWxSdWxlKCk7CisgICAgICAgIENoYXJTZXF1ZW5jZSByZXMgPSBtQXNzZXRzLmdldFJlc291cmNlQmFnVGV4dChpZCwKKyAgICAgICAgICAgICAgICBhdHRyRm9yUXVhbnRpdHlDb2RlKHJ1bGUucXVhbnRpdHlGb3JJbnQocXVhbnRpdHkpKSk7CiAgICAgICAgIGlmIChyZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotICAgICAgICByZXMgPSBtQXNzZXRzLmdldFJlc291cmNlQmFnVGV4dChpZCwgUGx1cmFsUnVsZXMuSURfT1RIRVIpOworICAgICAgICByZXMgPSBtQXNzZXRzLmdldFJlc291cmNlQmFnVGV4dChpZCwgSURfT1RIRVIpOwogICAgICAgICBpZiAocmVzICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCJQbHVyYWwgcmVzb3VyY2UgSUQgIzB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoaWQpCiAgICAgICAgICAgICAgICAgKyAiIHF1YW50aXR5PSIgKyBxdWFudGl0eQotICAgICAgICAgICAgICAgICsgIiBpdGVtPSIgKyBQbHVyYWxSdWxlcy5zdHJpbmdGb3JRdWFudGl0eShydWxlLnF1YW50aXR5Rm9yTnVtYmVyKHF1YW50aXR5KSkpOworICAgICAgICAgICAgICAgICsgIiBpdGVtPSIgKyBzdHJpbmdGb3JRdWFudGl0eUNvZGUocnVsZS5xdWFudGl0eUZvckludChxdWFudGl0eSkpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFBsdXJhbFJ1bGVzIGdldFBsdXJhbFJ1bGUoKSB7CisgICAgcHJpdmF0ZSBOYXRpdmVQbHVyYWxSdWxlcyBnZXRQbHVyYWxSdWxlKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CiAgICAgICAgICAgICBpZiAobVBsdXJhbFJ1bGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QbHVyYWxSdWxlID0gUGx1cmFsUnVsZXMucnVsZUZvckxvY2FsZShtQ29uZmlndXJhdGlvbi5sb2NhbGUpOworICAgICAgICAgICAgICAgIG1QbHVyYWxSdWxlID0gTmF0aXZlUGx1cmFsUnVsZXMuZm9yTG9jYWxlKG1Db25maWd1cmF0aW9uLmxvY2FsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gbVBsdXJhbFJ1bGU7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgYXR0ckZvclF1YW50aXR5Q29kZShpbnQgcXVhbnRpdHlDb2RlKSB7CisgICAgICAgIHN3aXRjaCAocXVhbnRpdHlDb2RlKSB7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLlpFUk86IHJldHVybiAweDAxMDAwMDA1OworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5PTkU6ICByZXR1cm4gMHgwMTAwMDAwNjsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuVFdPOiAgcmV0dXJuIDB4MDEwMDAwMDc7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLkZFVzogIHJldHVybiAweDAxMDAwMDA4OworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5NQU5ZOiByZXR1cm4gMHgwMTAwMDAwOTsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElEX09USEVSOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0cmluZ0ZvclF1YW50aXR5Q29kZShpbnQgcXVhbnRpdHlDb2RlKSB7CisgICAgICAgIHN3aXRjaCAocXVhbnRpdHlDb2RlKSB7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLlpFUk86IHJldHVybiAiemVybyI7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLk9ORTogIHJldHVybiAib25lIjsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuVFdPOiAgcmV0dXJuICJ0d28iOworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5GRVc6ICByZXR1cm4gImZldyI7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLk1BTlk6IHJldHVybiAibWFueSI7CisgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAib3RoZXIiOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBzdHJpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciByZXNvdXJjZSBJRC4gIEl0CiAgICAgICogd2lsbCBiZSBzdHJpcHBlZCBvZiBhbnkgc3R5bGVkIHRleHQgaW5mb3JtYXRpb24uCkBAIC0yOTUsNiArMzI5LDkgQEAKICAgICAgKiBzdHJpcHBlZCBvZiBhbnkgc3R5bGVkIHRleHQgaW5mb3JtYXRpb24uCiAgICAgICoge0Btb3JlfQogICAgICAqCisgICAgICogPHA+U2VlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3N0cmluZy1yZXNvdXJjZS5odG1sI1BsdXJhbHMiPlN0cmluZworICAgICAqIFJlc291cmNlczwvYT4gZm9yIG1vcmUgb24gcXVhbnRpdHkgc3RyaW5ncy4KKyAgICAgKgogICAgICAqIEBwYXJhbSBpZCBUaGUgZGVzaXJlZCByZXNvdXJjZSBpZGVudGlmaWVyLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIGFhcHQKICAgICAgKiAgICAgICAgICAgdG9vbC4gVGhpcyBpbnRlZ2VyIGVuY29kZXMgdGhlIHBhY2thZ2UsIHR5cGUsIGFuZCByZXNvdXJjZQogICAgICAqICAgICAgICAgICBlbnRyeS4gVGhlIHZhbHVlIDAgaXMgYW4gaW52YWxpZCBpZGVudGlmaWVyLgpAQCAtMzE3LDYgKzM1NCw5IEBACiAgICAgICogUmV0dXJuIHRoZSBzdHJpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciByZXNvdXJjZSBJRCBmb3IgYSBwYXJ0aWN1bGFyCiAgICAgICogbnVtZXJpY2FsIHF1YW50aXR5LgogICAgICAqCisgICAgICogPHA+U2VlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3N0cmluZy1yZXNvdXJjZS5odG1sI1BsdXJhbHMiPlN0cmluZworICAgICAqIFJlc291cmNlczwvYT4gZm9yIG1vcmUgb24gcXVhbnRpdHkgc3RyaW5ncy4KKyAgICAgKgogICAgICAqIEBwYXJhbSBpZCBUaGUgZGVzaXJlZCByZXNvdXJjZSBpZGVudGlmaWVyLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIGFhcHQKICAgICAgKiAgICAgICAgICAgdG9vbC4gVGhpcyBpbnRlZ2VyIGVuY29kZXMgdGhlIHBhY2thZ2UsIHR5cGUsIGFuZCByZXNvdXJjZQogICAgICAqICAgICAgICAgICBlbnRyeS4gVGhlIHZhbHVlIDAgaXMgYW4gaW52YWxpZCBpZGVudGlmaWVyLgpAQCAtMTMxNSw3ICsxMzU1LDcgQEAKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CiAgICAgICAgICAgICBpZiAobVBsdXJhbFJ1bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QbHVyYWxSdWxlID0gUGx1cmFsUnVsZXMucnVsZUZvckxvY2FsZShjb25maWcubG9jYWxlKTsKKyAgICAgICAgICAgICAgICBtUGx1cmFsUnVsZSA9IE5hdGl2ZVBsdXJhbFJ1bGVzLmZvckxvY2FsZShjb25maWcubG9jYWxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE1MTksNyArMTU1OSw3IEBACiAgICAgLyoqCiAgICAgICogUGFyc2UgYSBzZXJpZXMgb2Yge0BsaW5rIGFuZHJvaWQuUi5zdHlsZWFibGUjRXh0cmEgJmx0O2V4dHJhJmd0O30gdGFncyBmcm9tCiAgICAgICogYW4gWE1MIGZpbGUuICBZb3UgY2FsbCB0aGlzIHdoZW4geW91IGFyZSBhdCB0aGUgcGFyZW50IHRhZyBvZiB0aGUKLSAgICAgKiBleHRyYSB0YWdzLCBhbmQgaXQgcmV0dXJuIG9uY2UgYWxsIG9mIHRoZSBjaGlsZCB0YWdzIGhhdmUgYmVlbiBwYXJzZWQuCisgICAgICogZXh0cmEgdGFncywgYW5kIGl0IHdpbGwgcmV0dXJuIG9uY2UgYWxsIG9mIHRoZSBjaGlsZCB0YWdzIGhhdmUgYmVlbiBwYXJzZWQuCiAgICAgICogVGhpcyB3aWxsIGNhbGwge0BsaW5rICNwYXJzZUJ1bmRsZUV4dHJhfSBmb3IgZWFjaCBleHRyYSB0YWcgZW5jb3VudGVyZWQuCiAgICAgICogCiAgICAgICogQHBhcmFtIHBhcnNlciBUaGUgcGFyc2VyIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGV4dHJhcy4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0Q3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdEN1cnNvci5qYXZhCmluZGV4IGE1ZTVlNDYuLjliMTQ5OTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0Q3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RDdXJzb3IuamF2YQpAQCAtMTgsMTYgKzE4LDExIEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKQEAgLTU2LDYgKzUxLDEwIEBACiAgICAgYWJzdHJhY3QgcHVibGljIGRvdWJsZSBnZXREb3VibGUoaW50IGNvbHVtbik7CiAgICAgYWJzdHJhY3QgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW4pOwogCisgICAgcHVibGljIGludCBnZXRUeXBlKGludCBjb2x1bW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCiAgICAgLy8gVE9ETyBpbXBsZW1lbnQgZ2V0QmxvYiBpbiBhbGwgY3Vyc29yIHR5cGVzCiAgICAgcHVibGljIGJ5dGVbXSBnZXRCbG9iKGludCBjb2x1bW4pIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJnZXRCbG9iIGlzIG5vdCBzdXBwb3J0ZWQiKTsKQEAgLTg4LDcgKzg3LDcgQEAKICAgICAgICAgfQogICAgICAgICBtRGF0YVNldE9ic2VydmFibGUubm90aWZ5SW52YWxpZGF0ZWQoKTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXJ5KCkgewogICAgICAgICBpZiAobVNlbGZPYnNlcnZlciAhPSBudWxsICYmIG1TZWxmT2JzZXJ2ZXJSZWdpc3RlcmVkID09IGZhbHNlKSB7CiAgICAgICAgICAgICBtQ29udGVudFJlc29sdmVyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1Ob3RpZnlVcmksIHRydWUsIG1TZWxmT2JzZXJ2ZXIpOwpAQCAtMTA5LDIyICsxMDgsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKE1hcDw/IGV4dGVuZHMgTG9uZyw/IGV4dGVuZHMgTWFwPFN0cmluZyxPYmplY3Q+PiB2YWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBjdXJzb3IgaXMgc3VjY2Vzc2Z1bGx5IHNjcm9sbGVkCiAgICAgICogdG8gYSBuZXcgcG9zaXRpb24sIGdpdmluZyB0aGUgc3ViY2xhc3MgYSBjaGFuY2UgdG8gdXBkYXRlIGFueSBzdGF0ZSBpdAogICAgICAqIG1heSBoYXZlLiBJZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBtb3ZlIGZ1bmN0aW9uIHdpbGwgYWxzbyBkbyBzbyBhbmQgdGhlCkBAIC0zMjAsMTM3ICszMDMsNiBAQAogICAgICAgICByZXR1cm4gZ2V0Q29sdW1uTmFtZXMoKVtjb2x1bW5JbmRleF07CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUJsb2IoaW50IGNvbHVtbkluZGV4LCBieXRlW10gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTdHJpbmcoaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTaG9ydChpbnQgY29sdW1uSW5kZXgsIHNob3J0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIFNob3J0LnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlSW50KGludCBjb2x1bW5JbmRleCwgaW50IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIEludGVnZXIudmFsdWVPZih2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVMb25nKGludCBjb2x1bW5JbmRleCwgbG9uZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCBMb25nLnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlRmxvYXQoaW50IGNvbHVtbkluZGV4LCBmbG9hdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCBGbG9hdC52YWx1ZU9mKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZURvdWJsZShpbnQgY29sdW1uSW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCBEb3VibGUudmFsdWVPZih2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVUb051bGwoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGUoaW50IGNvbHVtbkluZGV4LCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNVcGRhdGVzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExvbmcudmFsdWVPZigpIHJldHVybnMgbnVsbCBzb21ldGltZXMhCi0vLyAgICAgICAgTG9uZyByb3dpZCA9IExvbmcudmFsdWVPZihnZXRMb25nKG1Sb3dJZENvbHVtbkluZGV4KSk7Ci0gICAgICAgIExvbmcgcm93aWQgPSBuZXcgTG9uZyhnZXRMb25nKG1Sb3dJZENvbHVtbkluZGV4KSk7Ci0gICAgICAgIGlmIChyb3dpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJudWxsIHJvd2lkLiBtUm93SWRDb2x1bW5JbmRleCA9ICIgKyBtUm93SWRDb2x1bW5JbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJvdyA9IG1VcGRhdGVkUm93cy5nZXQocm93aWQpOwotICAgICAgICAgICAgaWYgKHJvdyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLnB1dChyb3dpZCwgcm93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJvdy5wdXQoZ2V0Q29sdW1uTmFtZXMoKVtjb2x1bW5JbmRleF0sIG9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBwZW5kaW5nIHVwZGF0ZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBjb21taXR0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBhcmUgcGVuZGluZyB1cGRhdGVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gY29tbWl0dGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNVcGRhdGVzKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVVwZGF0ZWRSb3dzLnNpemUoKSA+IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWJvcnRVcGRhdGVzKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBtVXBkYXRlZFJvd3MuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gY29tbWl0VXBkYXRlcyhudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gbVJvd0lkQ29sdW1uSW5kZXggIT0gLTE7Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoQ29udGVudE9ic2VydmVyIG9ic2VydmVyKSB7CiAgICAgICAgIG1Db250ZW50T2JzZXJ2YWJsZS5yZWdpc3Rlck9ic2VydmVyKG9ic2VydmVyKTsKICAgICB9CkBAIC00NzgsOSArMzMwLDkgQEAKICAgICAgICAgcmV0dXJuIG1EYXRhU2V0T2JzZXJ2YWJsZTsKICAgICAgICAgCiAgICAgfQorCiAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIoRGF0YVNldE9ic2VydmVyIG9ic2VydmVyKSB7CiAgICAgICAgIG1EYXRhU2V0T2JzZXJ2YWJsZS5yZWdpc3Rlck9ic2VydmVyKG9ic2VydmVyKTsKLSAgICAgICAgCiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihEYXRhU2V0T2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKQEAgLTUzNSwzNiArMzg3LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIGlzCi0gICAgICogdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayAjZ2V0VXBkYXRlZEZpZWxkfSB0byBhbGxvdyBzdWJjbGFzc2VzIHRvCi0gICAgICogc3VwcG9ydCByZWFkaW5nIHVuY29tbWl0dGVkIHVwZGF0ZXMuIE5PVEU6IFRoaXMgZnVuY3Rpb24gYW5kCi0gICAgICoge0BsaW5rICNnZXRVcGRhdGVkRmllbGR9IHNob3VsZCBiZSBjYWxsZWQgdG9nZXRoZXIgaW5zaWRlIG9mIGEKLSAgICAgKiBibG9jayBzeW5jaHJvbml6ZWQgb24gbVVwZGF0ZWRSb3dzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSBjb2x1bW4gaW5kZXggb2YgdGhlIGZpZWxkIHRvIGNoZWNrCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWVsZCBoYXMgYmVlbiB1cGRhdGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiBAZGVwcmVjYXRlZCBBbHdheXMgcmV0dXJucyBmYWxzZSBzaW5jZSBDdXJzb3JzIGRvIG5vdCBzdXBwb3J0IHVwZGF0aW5nIHJvd3MKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHByb3RlY3RlZCBib29sZWFuIGlzRmllbGRVcGRhdGVkKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICBpZiAobVJvd0lkQ29sdW1uSW5kZXggIT0gLTEgJiYgbVVwZGF0ZWRSb3dzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gdXBkYXRlcyA9IG1VcGRhdGVkUm93cy5nZXQobUN1cnJlbnRSb3dJRCk7Ci0gICAgICAgICAgICBpZiAodXBkYXRlcyAhPSBudWxsICYmIHVwZGF0ZXMuY29udGFpbnNLZXkoZ2V0Q29sdW1uTmFtZXMoKVtjb2x1bW5JbmRleF0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdW5jb21taXR0ZWQgdXBkYXRlZCB2YWx1ZSBmb3IgdGhlIGZpZWxkCi0gICAgICogYXQgY29sdW1uSW5kZXguICBOT1RFOiBUaGlzIGZ1bmN0aW9uIGFuZCB7QGxpbmsgI2lzRmllbGRVcGRhdGVkfSBzaG91bGQKLSAgICAgKiBiZSBjYWxsZWQgdG9nZXRoZXIgaW5zaWRlIG9mIGEgYmxvY2sgc3luY2hyb25pemVkIG9uIG1VcGRhdGVkUm93cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgY29sdW1uIGluZGV4IG9mIHRoZSBmaWVsZCB0byByZXRyaWV2ZQotICAgICAqIEByZXR1cm4gdGhlIHVwZGF0ZWQgdmFsdWUKKyAgICAgKiBAZGVwcmVjYXRlZCBBbHdheXMgcmV0dXJucyBudWxsIHNpbmNlIEN1cnNvcnMgZG8gbm90IHN1cHBvcnQgdXBkYXRpbmcgcm93cwogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRVcGRhdGVkRmllbGQoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gdXBkYXRlcyA9IG1VcGRhdGVkUm93cy5nZXQobUN1cnJlbnRSb3dJRCk7Ci0gICAgICAgIHJldHVybiB1cGRhdGVzLmdldChnZXRDb2x1bW5OYW1lcygpW2NvbHVtbkluZGV4XSk7CisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjE0LDExICs0NDksOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgSGFzaE1hcCBjb250YWlucyBhIG1hcHBpbmcgZnJvbSBMb25nIHJvd0lEcyB0byBhbm90aGVyIE1hcAotICAgICAqIHRoYXQgbWFwcyBmcm9tIFN0cmluZyBjb2x1bW4gbmFtZXMgdG8gbmV3IHZhbHVlcy4gQSBOVUxMIHZhbHVlIG1lYW5zIHRvCi0gICAgICogcmVtb3ZlIGFuIGV4aXN0aW5nIHZhbHVlLCBhbmQgYWxsIG51bWVyaWMgdmFsdWVzIGFyZSBpbiB0aGVpciBjbGFzcwotICAgICAqIGZvcm1zLCBpLmUuIEludGVnZXIsIExvbmcsIEZsb2F0LCBldGMuCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBpcyBuZXZlciB1cGRhdGVkIGJ5IHRoaXMgY2xhc3MgYW5kIHNob3VsZCBub3QgYmUgdXNlZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIEhhc2hNYXA8TG9uZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gbVVwZGF0ZWRSb3dzOwogCiAgICAgLyoqCkBAIC02MjgsNiArNDYxLDExIEBACiAgICAgcHJvdGVjdGVkIGludCBtUm93SWRDb2x1bW5JbmRleDsKIAogICAgIHByb3RlY3RlZCBpbnQgbVBvczsKKyAgICAvKioKKyAgICAgKiBJZiB7QGxpbmsgI21Sb3dJZENvbHVtbkluZGV4fSBpcyBub3QgLTEgdGhpcyBjb250YWlucyBjb250YWlucyB0aGUgdmFsdWUgb2YKKyAgICAgKiB0aGUgY29sdW1uIGF0IHtAbGluayAjbVJvd0lkQ29sdW1uSW5kZXh9IGZvciB0aGUgY3VycmVudCByb3cgdGhpcyBjdXJzb3IgaXMKKyAgICAgKiBwb2ludGluZyBhdC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgTG9uZyBtQ3VycmVudFJvd0lEOwogICAgIHByb3RlY3RlZCBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQ2xvc2VkID0gZmFsc2U7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yLmphdmEKaW5kZXggMjdhMDJlMi4uOGFkZGFhOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RXaW5kb3dlZEN1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0V2luZG93ZWRDdXJzb3IuamF2YQpAQCAtMTksMjAyICsxOSwxMDUgQEAKIC8qKgogICogQSBiYXNlIGNsYXNzIGZvciBDdXJzb3JzIHRoYXQgc3RvcmUgdGhlaXIgZGF0YSBpbiB7QGxpbmsgQ3Vyc29yV2luZG93fXMuCiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdpbmRvd2VkQ3Vyc29yIGV4dGVuZHMgQWJzdHJhY3RDdXJzb3IKLXsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdpbmRvd2VkQ3Vyc29yIGV4dGVuZHMgQWJzdHJhY3RDdXJzb3IgewogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBieXRlW10gZ2V0QmxvYihpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBieXRlW10gZ2V0QmxvYihpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGJ5dGVbXSlnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIG1XaW5kb3cuZ2V0QmxvYihtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZylnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIG1XaW5kb3cuZ2V0U3RyaW5nKG1Qb3MsIGNvbHVtbkluZGV4KTsKICAgICB9Ci0gICAgCisKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjb3B5U3RyaW5nVG9CdWZmZXIoaW50IGNvbHVtbkluZGV4LCBDaGFyQXJyYXlCdWZmZXIgYnVmZmVyKQotICAgIHsKKyAgICBwdWJsaWMgdm9pZCBjb3B5U3RyaW5nVG9CdWZmZXIoaW50IGNvbHVtbkluZGV4LCBDaGFyQXJyYXlCdWZmZXIgYnVmZmVyKSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5jb3B5U3RyaW5nVG9CdWZmZXIoY29sdW1uSW5kZXgsIGJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIG1XaW5kb3cuY29weVN0cmluZ1RvQnVmZmVyKG1Qb3MsIGNvbHVtbkluZGV4LCBidWZmZXIpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydChpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydChpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBOdW1iZXIgdmFsdWUgPSAoTnVtYmVyKWdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnNob3J0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldFNob3J0KG1Qb3MsIGNvbHVtbkluZGV4KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldEludChpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBpbnQgZ2V0SW50KGludCBjb2x1bW5JbmRleCkgewogICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE51bWJlciB2YWx1ZSA9IChOdW1iZXIpZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldEludChtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0TG9uZyhpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBsb25nIGdldExvbmcoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgTnVtYmVyIHZhbHVlID0gKE51bWJlcilnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5sb25nVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldExvbmcobVBvcywgY29sdW1uSW5kZXgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdChpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdChpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBOdW1iZXIgdmFsdWUgPSAoTnVtYmVyKWdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmZsb2F0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldEZsb2F0KG1Qb3MsIGNvbHVtbkluZGV4KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE51bWJlciB2YWx1ZSA9IChOdW1iZXIpZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuZG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldERvdWJsZShtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW5JbmRleCkKLSAgICB7CisgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpID09IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbVdpbmRvdy5pc051bGwobVBvcywgY29sdW1uSW5kZXgpOworICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXRUeXBlKG1Qb3MsIGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9OVUxMOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGlzQmxvYihpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QgaW5zdGFuY2VvZiBieXRlW107Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbVdpbmRvdy5pc0Jsb2IobVBvcywgY29sdW1uSW5kZXgpOworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFR5cGV9CisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2IoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9CTE9COwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGlzU3RyaW5nKGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsIHx8IG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtV2luZG93LmlzU3RyaW5nKG1Qb3MsIGNvbHVtbkluZGV4KTsKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRUeXBlfQorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGJvb2xlYW4gaXNTdHJpbmcoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9TVFJJTkc7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb25nKGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIChvYmplY3QgaW5zdGFuY2VvZiBJbnRlZ2VyIHx8IG9iamVjdCBpbnN0YW5jZW9mIExvbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1XaW5kb3cuaXNMb25nKG1Qb3MsIGNvbHVtbkluZGV4KTsKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRUeXBlfQorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGJvb2xlYW4gaXNMb25nKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShjb2x1bW5JbmRleCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfSU5URUdFUjsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Zsb2F0KGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIChvYmplY3QgaW5zdGFuY2VvZiBGbG9hdCB8fCBvYmplY3QgaW5zdGFuY2VvZiBEb3VibGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1XaW5kb3cuaXNGbG9hdChtUG9zLCBjb2x1bW5JbmRleCk7CisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0VHlwZX0KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBib29sZWFuIGlzRmxvYXQoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9GTE9BVDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1Bvc2l0aW9uKCkKLSAgICB7CisgICAgcHVibGljIGludCBnZXRUeXBlKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICBjaGVja1Bvc2l0aW9uKCk7CisgICAgICAgIHJldHVybiBtV2luZG93LmdldFR5cGUobVBvcywgY29sdW1uSW5kZXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrUG9zaXRpb24oKSB7CiAgICAgICAgIHN1cGVyLmNoZWNrUG9zaXRpb24oKTsKICAgICAgICAgCiAgICAgICAgIGlmIChtV2luZG93ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTdGFsZURhdGFFeGNlcHRpb24oIkFjY2VzcyBjbG9zZWQgY3Vyc29yIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgU3RhbGVEYXRhRXhjZXB0aW9uKCJBdHRlbXB0aW5nIHRvIGFjY2VzcyBhIGNsb3NlZCBjdXJzb3IiKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvck5hdGl2ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvck5hdGl2ZS5qYXZhCmluZGV4IGJhYTk0ZDguLmZhNjJkNjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JOYXRpdmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yTmF0aXZlLmphdmEKQEAgLTE3LDEzICsxNywxMCBAQAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIAogLyoqCiAgKiBOYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGJ1bGsgY3Vyc29yLiBUaGlzIGlzIG9ubHkgZm9yIHVzZSBpbiBpbXBsZW1lbnRpbmcKQEAgLTEyMCwyNiArMTE3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfUk9XU19UUkFOU0FDVElPTjogewotICAgICAgICAgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSB3aGF0IENsYXNzTG9hZGVyIHNob3VsZCBiZSBwYXNzZWQgdG8gcmVhZEhhc2hNYXA/Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBzd2l0Y2ggdG8gQnVuZGxlCi0gICAgICAgICAgICAgICAgICAgIEhhc2hNYXA8TG9uZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzID0gZGF0YS5yZWFkSGFzaE1hcChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB1cGRhdGVSb3dzKHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoKHJlc3VsdCA9PSB0cnVlID8gMSA6IDApKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBERUxFVEVfUk9XX1RSQU5TQUNUSU9OOiB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQnVsa0N1cnNvci5kZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZGF0YS5yZWFkSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZGVsZXRlUm93KHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZUludCgocmVzdWx0ID09IHRydWUgPyAxIDogMCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICBjYXNlIE9OX01PVkVfVFJBTlNBQ1RJT046IHsKICAgICAgICAgICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElCdWxrQ3Vyc29yLmRlc2NyaXB0b3IpOwogICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBkYXRhLnJlYWRJbnQoKTsKQEAgLTM0Myw0OCArMzIwLDYgQEAKICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVJvd3MoTWFwIHZhbHVlcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKLQotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0KLSAgICAgICAgZGF0YS53cml0ZU1hcCh2YWx1ZXMpOwotCi0gICAgICAgIG1SZW1vdGUudHJhbnNhY3QoVVBEQVRFX1JPV1NfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKLQotICAgICAgICBEYXRhYmFzZVV0aWxzLnJlYWRFeGNlcHRpb25Gcm9tUGFyY2VsKHJlcGx5KTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gKHJlcGx5LnJlYWRJbnQoKSA9PSAxID8gdHJ1ZSA6IGZhbHNlKTsKLQotICAgICAgICBkYXRhLnJlY3ljbGUoKTsKLSAgICAgICAgcmVwbHkucmVjeWNsZSgpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KGludCBwb3NpdGlvbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKLQotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0KLSAgICAgICAgZGF0YS53cml0ZUludChwb3NpdGlvbik7Ci0KLSAgICAgICAgbVJlbW90ZS50cmFuc2FjdChERUxFVEVfUk9XX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7Ci0KLSAgICAgICAgRGF0YWJhc2VVdGlscy5yZWFkRXhjZXB0aW9uRnJvbVBhcmNlbChyZXBseSk7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIHJlc3VsdCA9IChyZXBseS5yZWFkSW50KCkgPT0gMSA/IHRydWUgOiBmYWxzZSk7Ci0KLSAgICAgICAgZGF0YS5yZWN5Y2xlKCk7Ci0gICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQogICAgIHB1YmxpYyBib29sZWFuIGdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CiAgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JUb0N1cnNvckFkYXB0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JUb0N1cnNvckFkYXB0b3IuamF2YQppbmRleCAxNDY5ZWEyLi4yY2IyYWVjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yVG9DdXJzb3JBZGFwdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvclRvQ3Vyc29yQWRhcHRvci5qYXZhCkBAIC0xNiwxMiArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOwogCi1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KIC8qKgogICogQWRhcHRzIGFuIHtAbGluayBJQnVsa0N1cnNvcn0gdG8gYSB7QGxpbmsgQ3Vyc29yfSBmb3IgdXNlIGluIHRoZSBsb2NhbAogICogcHJvY2Vzcy4KQEAgLTE3NCwzOCArMTcyLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IG1CdWxrQ3Vyc29yLmRlbGV0ZVJvdyhtUG9zKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgd2luZG93IGNvbnRhaW5zIHRoZSBvbGQgdmFsdWUsIGRpc2NhcmQgaXQKLSAgICAgICAgICAgICAgICBtV2luZG93ID0gbnVsbDsKLSAgICAKLSAgICAgICAgICAgICAgICAvLyBGaXggdXAgdGhlIHBvc2l0aW9uCi0gICAgICAgICAgICAgICAgbUNvdW50ID0gbUJ1bGtDdXJzb3IuY291bnQoKTsKLSAgICAgICAgICAgICAgICBpZiAobVBvcyA8IG1Db3VudCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgb2xkUG9zID0gbVBvczsKLSAgICAgICAgICAgICAgICAgICAgbVBvcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICBtb3ZlVG9Qb3NpdGlvbihvbGRQb3MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3MgPSBtQ291bnQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gU2VuZCB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgICAgIG9uQ2hhbmdlKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gZGVsZXRlIHJvdyBiZWNhdXNlIHRoZSByZW1vdGUgcHJvY2VzcyBpcyBkZWFkIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKSB7CiAgICAgICAgIGlmIChtQ29sdW1ucyA9PSBudWxsKSB7CkBAIC0yMTksNDQgKzE4NSw2IEBACiAgICAgICAgIHJldHVybiBtQ29sdW1uczsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsCi0gICAgICAgICAgICA/IGV4dGVuZHMgTWFwPFN0cmluZyxPYmplY3Q+PiBhZGRpdGlvbmFsVmFsdWVzKSB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNVcGRhdGVzKCkpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImNvbW1pdFVwZGF0ZXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGN1cnNvciwgZGlkIHlvdSBpbmNsdWRlIHRoZSBfaWQgY29sdW1uPyIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxWYWx1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1VcGRhdGVkUm93cy5wdXRBbGwoYWRkaXRpb25hbFZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtVXBkYXRlZFJvd3Muc2l6ZSgpIDw9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBtQnVsa0N1cnNvci51cGRhdGVSb3dzKG1VcGRhdGVkUm93cyk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1VcGRhdGVkUm93cy5jbGVhcigpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGNoYW5nZSBub3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gY29tbWl0IHVwZGF0ZXMgYmVjYXVzZSB0aGUgcmVtb3RlIHByb2Nlc3MgaXMgZGVhZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3IuamF2YQppbmRleCA2NTM5MTU2Li5jMDNjNTg2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3IuamF2YQpAQCAtMzAsNiArMzAsMjUgQEAKICAqIHRocmVhZHMgc2hvdWxkIHBlcmZvcm0gaXRzIG93biBzeW5jaHJvbml6YXRpb24gd2hlbiB1c2luZyB0aGUgQ3Vyc29yLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIEN1cnNvciB7CisgICAgLyoKKyAgICAgKiBWYWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9LgorICAgICAqIFRoZXNlIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdHlwZXMgZGVmaW5lZCBpbiBDdXJzb3JXaW5kb3cuaAorICAgICAqLworICAgIC8qKiBWYWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGUoaW50KX0gaWYgdGhlIHNwZWNpZmllZCBjb2x1bW4gaXMgbnVsbCAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9OVUxMID0gMDsKKworICAgIC8qKiBWYWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGUoaW50KX0gaWYgdGhlIHNwZWNpZmllZCAgY29sdW1uIHR5cGUgaXMgaW50ZWdlciAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9JTlRFR0VSID0gMTsKKworICAgIC8qKiBWYWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGUoaW50KX0gaWYgdGhlIHNwZWNpZmllZCBjb2x1bW4gdHlwZSBpcyBmbG9hdCAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9GTE9BVCA9IDI7CisKKyAgICAvKiogVmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9IGlmIHRoZSBzcGVjaWZpZWQgY29sdW1uIHR5cGUgaXMgc3RyaW5nICovCisgICAgc3RhdGljIGZpbmFsIGludCBGSUVMRF9UWVBFX1NUUklORyA9IDM7CisKKyAgICAvKiogVmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9IGlmIHRoZSBzcGVjaWZpZWQgY29sdW1uIHR5cGUgaXMgYmxvYiAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9CTE9CID0gNDsKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG51bWJlcnMgb2Ygcm93cyBpbiB0aGUgY3Vyc29yLgogICAgICAqCkBAIC0xNDYsMjIgKzE2NSw2IEBACiAgICAgYm9vbGVhbiBpc0FmdGVyTGFzdCgpOwogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgcm93IGF0IHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBmcm9tIHRoZSB1bmRlcmx5aW5nIGRhdGEKLSAgICAgKiBzdG9yZS4gQWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgY3Vyc29yIHdpbGwgYmUgcG9pbnRpbmcgdG8gdGhlIHJvdwotICAgICAqIGFmdGVyIHRoZSByb3cgdGhhdCBpcyBkZWxldGVkLiBUaGlzIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgZGVjcmVtZW50aW5nCi0gICAgICogdGhlIHJlc3VsdCBvZiBjb3VudCgpIGJ5IG9uZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcXVlcnkgbXVzdCBoYXZlIHRoZSByb3cgSUQgY29sdW1uIGluIGl0cyBzZWxlY3Rpb24sIG90aGVyd2lzZSB0aGlzCi0gICAgICogY2FsbCB3aWxsIGZhaWwuCi0gICAgICogCi0gICAgICogQGhpZGUKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHJlY29yZCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQuCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBDb250ZW50UmVzb2x2ZXIjZGVsZXRlKFVyaSwgU3RyaW5nLCBTdHJpbmdbXSl9Ci0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIGRlbGV0ZVJvdygpOwotCi0gICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgemVyby1iYXNlZCBpbmRleCBmb3IgdGhlIGdpdmVuIGNvbHVtbiBuYW1lLCBvciAtMSBpZiB0aGUgY29sdW1uIGRvZXNuJ3QgZXhpc3QuCiAgICAgICogSWYgeW91IGV4cGVjdCB0aGUgY29sdW1uIHRvIGV4aXN0IHVzZSB7QGxpbmsgI2dldENvbHVtbkluZGV4T3JUaHJvdyhTdHJpbmcpfSBpbnN0ZWFkLCB3aGljaAogICAgICAqIHdpbGwgbWFrZSB0aGUgZXJyb3IgbW9yZSBjbGVhci4KQEAgLTI5NSw2ICsyOTgsMjcgQEAKICAgICBkb3VibGUgZ2V0RG91YmxlKGludCBjb2x1bW5JbmRleCk7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGRhdGEgdHlwZSBvZiB0aGUgZ2l2ZW4gY29sdW1uJ3MgdmFsdWUuCisgICAgICogVGhlIHByZWZlcnJlZCB0eXBlIG9mIHRoZSBjb2x1bW4gaXMgcmV0dXJuZWQgYnV0IHRoZSBkYXRhIG1heSBiZSBjb252ZXJ0ZWQgdG8gb3RoZXIgdHlwZXMKKyAgICAgKiBhcyBkb2N1bWVudGVkIGluIHRoZSBnZXQtdHlwZSBtZXRob2RzIHN1Y2ggYXMge0BsaW5rICNnZXRJbnQoaW50KX0sIHtAbGluayAjZ2V0RmxvYXQoaW50KX0KKyAgICAgKiBldGMuCisgICAgICo8cD4KKyAgICAgKiBSZXR1cm5lZCBjb2x1bW4gdHlwZXMgYXJlCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayAjRklFTERfVFlQRV9OVUxMfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNGSUVMRF9UWVBFX0lOVEVHRVJ9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI0ZJRUxEX1RZUEVfRkxPQVR9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI0ZJRUxEX1RZUEVfU1RSSU5HfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNGSUVMRF9UWVBFX0JMT0J9PC9saT4KKyAgICAgKjwvdWw+CisgICAgICo8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCisgICAgICogQHJldHVybiBjb2x1bW4gdmFsdWUgdHlwZQorICAgICAqLworICAgIGludCBnZXRUeXBlKGludCBjb2x1bW5JbmRleCk7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB2YWx1ZSBpbiB0aGUgaW5kaWNhdGVkIGNvbHVtbiBpcyBudWxsLgogICAgICAqCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgpAQCAtMzAzLDE4OCArMzI3LDYgQEAKICAgICBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uSW5kZXgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY3Vyc29yIHN1cHBvcnRzIHVwZGF0ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGN1cnNvciBzdXBwb3J0cyB1cGRhdGVzLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiBzdXBwb3J0c1VwZGF0ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIHBlbmRpbmcgdXBkYXRlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGNvbW1pdHRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBwZW5kaW5nIHVwZGF0ZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBjb21taXR0ZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIGhhc1VwZGF0ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVCbG9iKGludCBjb2x1bW5JbmRleCwgYnl0ZVtdIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVTdHJpbmcoaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZVNob3J0KGludCBjb2x1bW5JbmRleCwgc2hvcnQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZUludChpbnQgY29sdW1uSW5kZXgsIGludCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGUgcm93IHRoZSBjdXJzb3IgaXMKLSAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgYXQuIFVwZGF0ZXMgYXJlIG5vdCBjb21taXR0ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUKLSAgICAgKiB1bnRpbCB7QGxpbmsgI2NvbW1pdFVwZGF0ZXMoKX0gaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gdXBkYXRlTG9uZyhpbnQgY29sdW1uSW5kZXgsIGxvbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZUZsb2F0KGludCBjb2x1bW5JbmRleCwgZmxvYXQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZURvdWJsZShpbnQgY29sdW1uSW5kZXgsIGRvdWJsZSB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGUgcm93IHRoZSBjdXJzb3IgaXMKLSAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgYXQuIFVwZGF0ZXMgYXJlIG5vdCBjb21taXR0ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUKLSAgICAgKiB1bnRpbCB7QGxpbmsgI2NvbW1pdFVwZGF0ZXMoKX0gaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gdXBkYXRlVG9OdWxsKGludCBjb2x1bW5JbmRleCk7Ci0KLSAgICAvKioKLSAgICAgKiBBdG9taWNhbGx5IGNvbW1pdHMgYWxsIHVwZGF0ZXMgdG8gdGhlIGJhY2tpbmcgc3RvcmUuIEFmdGVyIGNvbXBsZXRpb24sCi0gICAgICogdGhpcyBtZXRob2QgbGVhdmVzIHRoZSBkYXRhIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZSBhbmQgeW91IHNob3VsZCBjYWxsCi0gICAgICoge0BsaW5rICNyZXF1ZXJ5fSBiZWZvcmUgcmVhZGluZyBkYXRhIGZyb20gdGhlIGN1cnNvciBhZ2Fpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gY29tbWl0VXBkYXRlcygpOwotCi0gICAgLyoqCi0gICAgICogQXRvbWljYWxseSBjb21taXRzIGFsbCB1cGRhdGVzIHRvIHRoZSBiYWNraW5nIHN0b3JlLCBhcyB3ZWxsIGFzIHRoZQotICAgICAqIHVwZGF0ZXMgaW5jbHVkZWQgaW4gdmFsdWVzLiBBZnRlciBjb21wbGV0aW9uLAotICAgICAqIHRoaXMgbWV0aG9kIGxlYXZlcyB0aGUgZGF0YSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUgYW5kIHlvdSBzaG91bGQgY2FsbAotICAgICAqIHtAbGluayAjcmVxdWVyeX0gYmVmb3JlIHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBjdXJzb3IgYWdhaW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWVzIEEgbWFwIGZyb20gcm93IElEcyB0byBNYXBzIGFzc29jaWF0aW5nIGNvbHVtbiBuYW1lcyB3aXRoCi0gICAgICogICAgICAgICAgICAgICB1cGRhdGVkIHZhbHVlcy4gQSBudWxsIHZhbHVlIGluZGljYXRlcyB0aGUgZmllbGQgc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICByZW1vdmVkLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsCi0gICAgICAgICAgICA/IGV4dGVuZHMgTWFwPFN0cmluZyxPYmplY3Q+PiB2YWx1ZXMpOwotCi0gICAgLyoqCi0gICAgICogUmV2ZXJ0cyBhbGwgdXBkYXRlcyBtYWRlIHRvIHRoZSBjdXJzb3Igc2luY2UgdGhlIGxhc3QgY2FsbCB0bwotICAgICAqIGNvbW1pdFVwZGF0ZXMuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICB2b2lkIGFib3J0VXBkYXRlcygpOwotCi0gICAgLyoqCiAgICAgICogRGVhY3RpdmF0ZXMgdGhlIEN1cnNvciwgbWFraW5nIGFsbCBjYWxscyBvbiBpdCBmYWlsIHVudGlsIHtAbGluayAjcmVxdWVyeX0gaXMgY2FsbGVkLgogICAgICAqIEluYWN0aXZlIEN1cnNvcnMgdXNlIGZld2VyIHJlc291cmNlcyB0aGFuIGFjdGl2ZSBDdXJzb3JzLgogICAgICAqIENhbGxpbmcge0BsaW5rICNyZXF1ZXJ5fSB3aWxsIG1ha2UgdGhlIGN1cnNvciBhY3RpdmUgYWdhaW4uCkBAIC00OTYsNiArMzM4LDEwIEBACiAgICAgICogY29udGVudHMuIFRoaXMgbWF5IGJlIGRvbmUgYXQgYW55IHRpbWUsIGluY2x1ZGluZyBhZnRlciBhIGNhbGwgdG8ge0BsaW5rCiAgICAgICogI2RlYWN0aXZhdGV9LgogICAgICAqCisgICAgICogU2luY2UgdGhpcyBtZXRob2QgY291bGQgZXhlY3V0ZSBhIHF1ZXJ5IG9uIHRoZSBkYXRhYmFzZSBhbmQgcG90ZW50aWFsbHkgdGFrZQorICAgICAqIGEgd2hpbGUsIGl0IGNvdWxkIGNhdXNlIEFOUiBpZiBpdCBpcyBjYWxsZWQgb24gTWFpbiAoVUkpIHRocmVhZC4KKyAgICAgKiBBIHdhcm5pbmcgaXMgcHJpbnRlZCBpZiB0aGlzIG1ldGhvZCBpcyBiZWluZyBleGVjdXRlZCBvbiBNYWluIHRocmVhZC4KKyAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVxdWVyeSBzdWNjZWVkZWQsIGZhbHNlIGlmIG5vdCwgaW4gd2hpY2ggY2FzZSB0aGUKICAgICAgKiAgICAgICAgIGN1cnNvciBiZWNvbWVzIGludmFsaWQuCiAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JUb0J1bGtDdXJzb3JBZGFwdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JUb0J1bGtDdXJzb3JBZGFwdG9yLmphdmEKaW5kZXggNzQ4ZWI5OS4uOGJjN2RlMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yVG9CdWxrQ3Vyc29yQWRhcHRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvclRvQnVsa0N1cnNvckFkYXB0b3IuamF2YQpAQCAtMTYsMTYgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKIAotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU1pc3VzZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQogCiAvKioKICAqIFdyYXBzIGEgQnVsa0N1cnNvciBhcm91bmQgYW4gZXhpc3RpbmcgQ3Vyc29yIG1ha2luZyBpdCByZW1vdGFibGUuCkBAIC0zOCw3ICszNCw2IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBDcm9zc1Byb2Nlc3NDdXJzb3IgbUN1cnNvcjsKICAgICBwcml2YXRlIEN1cnNvcldpbmRvdyBtV2luZG93OwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Qcm92aWRlck5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1SZWFkT25seTsKICAgICBwcml2YXRlIENvbnRlbnRPYnNlcnZlclByb3h5IG1PYnNlcnZlcjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENvbnRlbnRPYnNlcnZlclByb3h5IGV4dGVuZHMgQ29udGVudE9ic2VydmVyIApAQCAtOTgsNyArOTMsNiBAQAogICAgICAgICAgICAgICAgICAgICAiT25seSBDcm9zc1Byb2Nlc3NDdXJzb3IgY3Vyc29ycyBhcmUgc3VwcG9ydGVkIGFjcm9zcyBwcm9jZXNzIGZvciBub3ciLCBlKTsKICAgICAgICAgfQogICAgICAgICBtUHJvdmlkZXJOYW1lID0gcHJvdmlkZXJOYW1lOwotICAgICAgICBtUmVhZE9ubHkgPSAhYWxsb3dXcml0ZTsKIAogICAgICAgICBjcmVhdGVBbmRSZWdpc3Rlck9ic2VydmVyUHJveHkob2JzZXJ2ZXIpOwogICAgIH0KQEAgLTE5NywzMSArMTkxLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVJvd3MoTWFwPD8gZXh0ZW5kcyBMb25nLCA/IGV4dGVuZHMgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzKSB7Ci0gICAgICAgIGlmIChtUmVhZE9ubHkpIHsKLSAgICAgICAgICAgIExvZy53KCJDb250ZW50UHJvdmlkZXIiLCAiUGVybWlzc2lvbiBEZW5pYWw6IG1vZGlmeWluZyAiCi0gICAgICAgICAgICAgICAgICAgICsgbVByb3ZpZGVyTmFtZQotICAgICAgICAgICAgICAgICAgICArICIgZnJvbSBwaWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nUGlkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmNvbW1pdFVwZGF0ZXModmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgIGlmIChtUmVhZE9ubHkpIHsKLSAgICAgICAgICAgIExvZy53KCJDb250ZW50UHJvdmlkZXIiLCAiUGVybWlzc2lvbiBEZW5pYWw6IG1vZGlmeWluZyAiCi0gICAgICAgICAgICAgICAgICAgICsgbVByb3ZpZGVyTmFtZQotICAgICAgICAgICAgICAgICAgICArICIgZnJvbSBwaWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nUGlkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ3Vyc29yLm1vdmVUb1Bvc2l0aW9uKHBvc2l0aW9uKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmRlbGV0ZVJvdygpOwotICAgIH0KLQogICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewogICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRFeHRyYXMoKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdy5qYXZhCmluZGV4IGM3NTY4MjUuLjU5OTQzMWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdy5qYXZhCkBAIC0yMTcsMTggKzIxNywxMyBAQAogICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CiAgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdpdmVuIGZpZWxkIGlzIHtAY29kZSBOVUxMfQorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFR5cGUoaW50LCBpbnQpfSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpc051bGwoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNOdWxsX25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFR5cGUocm93LCBjb2wpID09IEN1cnNvci5GSUVMRF9UWVBFX05VTEw7CiAgICAgfQogICAgIAotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaXNOdWxsX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKLSAgICAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgYnl0ZSBhcnJheSBmb3IgdGhlIGdpdmVuIGZpZWxkLgogICAgICAqCkBAIC0yNDgsMTkgKzI0Myw0MyBAQAogICAgIHByaXZhdGUgbmF0aXZlIGJ5dGVbXSBnZXRCbG9iX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKIAogICAgIC8qKgorICAgICAqIFJldHVybnMgZGF0YSB0eXBlIG9mIHRoZSBnaXZlbiBjb2x1bW4ncyB2YWx1ZS4KKyAgICAgKjxwPgorICAgICAqIFJldHVybmVkIGNvbHVtbiB0eXBlcyBhcmUKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX05VTEx9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfSU5URUdFUn08L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9GTE9BVH08L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9TVFJJTkd9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfQkxPQn08L2xpPgorICAgICAqPC91bD4KKyAgICAgKjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CisgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IHJvdywgaW50IGNvbCkgeworICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VHlwZV9uYXRpdmUocm93IC0gbVN0YXJ0UG9zLCBjb2wpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIGEgZmllbGQgY29udGFpbnMgZWl0aGVyIGEgYmxvYiBvciBpcyBudWxsLgogICAgICAqCiAgICAgICogQHBhcmFtIHJvdyB0aGUgcm93IHRvIHJlYWQgZnJvbSwgcm93IC0gZ2V0U3RhcnRQb3NpdGlvbigpIGJlaW5nIHRoZSBhY3R1YWwgcm93IGluIHRoZSB3aW5kb3cKICAgICAgKiBAcGFyYW0gY29sIHRoZSBjb2x1bW4gdG8gcmVhZCBmcm9tCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZ2l2ZW4gZmllbGQgaXMge0Bjb2RlIE5VTEx9IG9yIGEgYmxvYgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFR5cGUoaW50LCBpbnQpfSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2IoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNCbG9iX25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgaW50IHR5cGUgPSBnZXRUeXBlKHJvdywgY29sKTsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQiB8fCB0eXBlID09IEN1cnNvci5GSUVMRF9UWVBFX05VTEw7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNjksMTQgKzI4OCwxMSBAQAogICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CiAgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdpdmVuIGZpZWxkIGlzIGEgbG9uZworICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFR5cGUoaW50LCBpbnQpfSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpc0xvbmcoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNJbnRlZ2VyX25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFR5cGUocm93LCBjb2wpID09IEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVI7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yODUsMTQgKzMwMSwxMSBAQAogICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CiAgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdpdmVuIGZpZWxkIGlzIGEgZmxvYXQKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRUeXBlKGludCwgaW50KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gaXNGbG9hdChpbnQgcm93LCBpbnQgY29sKSB7Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBpc0Zsb2F0X25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFR5cGUocm93LCBjb2wpID09IEN1cnNvci5GSUVMRF9UWVBFX0ZMT0FUOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzAxLDIwICszMTQsMTUgQEAKICAgICAgKiBAcGFyYW0gcm93IHRoZSByb3cgdG8gcmVhZCBmcm9tLCByb3cgLSBnZXRTdGFydFBvc2l0aW9uKCkgYmVpbmcgdGhlIGFjdHVhbCByb3cgaW4gdGhlIHdpbmRvdwogICAgICAqIEBwYXJhbSBjb2wgdGhlIGNvbHVtbiB0byByZWFkIGZyb20KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBnaXZlbiBmaWVsZCBpcyB7QGNvZGUgTlVMTH0gb3IgYSBTdHJpbmcKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRUeXBlKGludCwgaW50KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gaXNTdHJpbmcoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNTdHJpbmdfbmF0aXZlKHJvdyAtIG1TdGFydFBvcywgY29sKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICBpbnQgdHlwZSA9IGdldFR5cGUocm93LCBjb2wpOworICAgICAgICByZXR1cm4gdHlwZSA9PSBDdXJzb3IuRklFTERfVFlQRV9TVFJJTkcgfHwgdHlwZSA9PSBDdXJzb3IuRklFTERfVFlQRV9OVUxMOwogICAgIH0KIAotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaXNCbG9iX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzU3RyaW5nX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzSW50ZWdlcl9uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBpc0Zsb2F0X25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgZ2V0VHlwZV9uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgU3RyaW5nIGZvciB0aGUgZ2l2ZW4gZmllbGQuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXcmFwcGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXcmFwcGVyLmphdmEKaW5kZXggZjBhYTdkNy4uM2MzYmQ0MyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yV3JhcHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldyYXBwZXIuamF2YQpAQCAtMTcsMjggKzE3LDI2IEBACiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ2hhckFycmF5QnVmZmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIAotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KIC8qKgotICogV3JhcHBlciBjbGFzcyBmb3IgQ3Vyc29yIHRoYXQgZGVsZWdhdGVzIGFsbCBjYWxscyB0byB0aGUgYWN0dWFsIGN1cnNvciBvYmplY3QKKyAqIFdyYXBwZXIgY2xhc3MgZm9yIEN1cnNvciB0aGF0IGRlbGVnYXRlcyBhbGwgY2FsbHMgdG8gdGhlIGFjdHVhbCBjdXJzb3Igb2JqZWN0LiAgVGhlIHByaW1hcnkKKyAqIHVzZSBmb3IgdGhpcyBjbGFzcyBpcyB0byBleHRlbmQgYSBjdXJzb3Igd2hpbGUgb3ZlcnJpZGluZyBvbmx5IGEgc3Vic2V0IG9mIGl0cyBtZXRob2RzLgogICovCi0KIHB1YmxpYyBjbGFzcyBDdXJzb3JXcmFwcGVyIGltcGxlbWVudHMgQ3Vyc29yIHsKIAorICAgIHByaXZhdGUgZmluYWwgQ3Vyc29yIG1DdXJzb3I7CisKICAgICBwdWJsaWMgQ3Vyc29yV3JhcHBlcihDdXJzb3IgY3Vyc29yKSB7CiAgICAgICAgIG1DdXJzb3IgPSBjdXJzb3I7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqIEByZXR1cm4gdGhlIHdyYXBwZWQgY3Vyc29yCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgYWJvcnRVcGRhdGVzKCkgewotICAgICAgICBtQ3Vyc29yLmFib3J0VXBkYXRlcygpOworICAgIHB1YmxpYyBDdXJzb3IgZ2V0V3JhcHBlZEN1cnNvcigpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJzb3I7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CkBAIC00OSwyMyArNDcsNiBAQAogICAgICAgICByZXR1cm4gbUN1cnNvci5pc0Nsb3NlZCgpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gbUN1cnNvci5jb21taXRVcGRhdGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoCi0gICAgICAgICAgICBNYXA8PyBleHRlbmRzIExvbmcsID8gZXh0ZW5kcyBNYXA8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuY29tbWl0VXBkYXRlcyh2YWx1ZXMpOwotICAgIH0KLQogICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldENvdW50KCk7CiAgICAgfQpAQCAtNzQsMTQgKzU1LDYgQEAKICAgICAgICAgbUN1cnNvci5kZWFjdGl2YXRlKCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuZGVsZXRlUm93KCk7Ci0gICAgfQotCiAgICAgcHVibGljIGJvb2xlYW4gbW92ZVRvRmlyc3QoKSB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLm1vdmVUb0ZpcnN0KCk7CiAgICAgfQpAQCAtMTQ3LDE0ICsxMjAsNiBAQAogICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRXYW50c0FsbE9uTW92ZUNhbGxzKCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1VwZGF0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmhhc1VwZGF0ZXMoKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyTGFzdCgpIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuaXNBZnRlckxhc3QoKTsKICAgICB9CkBAIC0xNzEsNiArMTM2LDEwIEBACiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmlzTGFzdCgpOwogICAgIH0KIAorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0VHlwZShjb2x1bW5JbmRleCk7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICByZXR1cm4gbUN1cnNvci5pc051bGwoY29sdW1uSW5kZXgpOwogICAgIH0KQEAgLTIxOSwxNCArMTg4LDYgQEAKICAgICAgICAgbUN1cnNvci5zZXROb3RpZmljYXRpb25VcmkoY3IsIHVyaSk7ICAgICAgICAKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gbUN1cnNvci5zdXBwb3J0c1VwZGF0ZXMoKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKENvbnRlbnRPYnNlcnZlciBvYnNlcnZlcikgewogICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIob2JzZXJ2ZXIpOyAgICAgICAgCiAgICAgfQpAQCAtMjM0LDcyICsxOTUsNSBAQAogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIoRGF0YVNldE9ic2VydmVyIG9ic2VydmVyKSB7CiAgICAgICAgIG1DdXJzb3IudW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihvYnNlcnZlcik7CiAgICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZURvdWJsZShpbnQgY29sdW1uSW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVEb3VibGUoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlRmxvYXQoaW50IGNvbHVtbkluZGV4LCBmbG9hdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVGbG9hdChjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVJbnQoaW50IGNvbHVtbkluZGV4LCBpbnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlSW50KGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUxvbmcoaW50IGNvbHVtbkluZGV4LCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZUxvbmcoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlU2hvcnQoaW50IGNvbHVtbkluZGV4LCBzaG9ydCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVTaG9ydChjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTdHJpbmcoaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlU3RyaW5nKGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUJsb2IoaW50IGNvbHVtbkluZGV4LCBieXRlW10gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlQmxvYihjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVUb051bGwoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZVRvTnVsbChjb2x1bW5JbmRleCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQ3Vyc29yIG1DdXJzb3I7Ci0gICAgCiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFTZXRPYnNlcnZhYmxlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhU2V0T2JzZXJ2YWJsZS5qYXZhCmluZGV4IDkyMDBlODEuLjUxYzcyYzEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFTZXRPYnNlcnZhYmxlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YVNldE9ic2VydmFibGUuamF2YQpAQCAtMjcsOCArMjcsMTIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQobU9ic2VydmVycykgewotICAgICAgICAgICAgZm9yIChEYXRhU2V0T2JzZXJ2ZXIgb2JzZXJ2ZXIgOiBtT2JzZXJ2ZXJzKSB7Ci0gICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25DaGFuZ2VkKCk7CisgICAgICAgICAgICAvLyBzaW5jZSBvbkNoYW5nZWQoKSBpcyBpbXBsZW1lbnRlZCBieSB0aGUgYXBwLCBpdCBjb3VsZCBkbyBhbnl0aGluZywgaW5jbHVkaW5nCisgICAgICAgICAgICAvLyByZW1vdmluZyBpdHNlbGYgZnJvbSB7QGxpbmsgbU9ic2VydmVyc30gLSBhbmQgdGhhdCBjb3VsZCBjYXVzZSBwcm9ibGVtcyBpZgorICAgICAgICAgICAgLy8gYW4gaXRlcmF0b3IgaXMgdXNlZCBvbiB0aGUgQXJyYXlMaXN0IHtAbGluayBtT2JzZXJ2ZXJzfS4KKyAgICAgICAgICAgIC8vIHRvIGF2b2lkIHN1Y2ggcHJvYmxlbXMsIGp1c3QgbWFyY2ggdGhydSB0aGUgbGlzdCBpbiB0aGUgcmV2ZXJzZSBvcmRlci4KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtT2JzZXJ2ZXJzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbU9ic2VydmVycy5nZXQoaSkub25DaGFuZ2VkKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zOSw4ICs0Myw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbm90aWZ5SW52YWxpZGF0ZWQoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobU9ic2VydmVycykgewotICAgICAgICAgICAgZm9yIChEYXRhU2V0T2JzZXJ2ZXIgb2JzZXJ2ZXIgOiBtT2JzZXJ2ZXJzKSB7Ci0gICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25JbnZhbGlkYXRlZCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1PYnNlcnZlcnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBtT2JzZXJ2ZXJzLmdldChpKS5vbkludmFsaWRhdGVkKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUVycm9ySGFuZGxlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGM1NDUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOworCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CisKKy8qKgorICogQW4gaW50ZXJmYWNlIHRvIGxldCB0aGUgYXBwcyBkZWZpbmUgdGhlIGFjdGlvbnMgdG8gdGFrZSB3aGVuIHRoZSBmb2xsb3dpbmcgZXJyb3JzIGFyZSBkZXRlY3RlZAorICogICBkYXRhYmFzZSBjb3JydXB0aW9uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGF0YWJhc2VFcnJvckhhbmRsZXIgeworCisgICAgLyoqCisgICAgICogZGVmaW5lcyB0aGUgbWV0aG9kIHRvIGJlIGludm9rZWQgd2hlbiBkYXRhYmFzZSBjb3JydXB0aW9uIGlzIGRldGVjdGVkLgorICAgICAqIEBwYXJhbSBkYk9iaiB0aGUge0BsaW5rIFNRTGl0ZURhdGFiYXNlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkYXRhYmFzZSBvbiB3aGljaCBjb3JydXB0aW9uCisgICAgICogaXMgZGV0ZWN0ZWQuCisgICAgICovCisgICAgdm9pZCBvbkNvcnJ1cHRpb24oU1FMaXRlRGF0YWJhc2UgZGJPYmopOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VVdGlscy5qYXZhCmluZGV4IDk1ZmMxZmQuLjM4ZDY1MjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZVV0aWxzLmphdmEKQEAgLTMxLDYgKzMxLDcgQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVQcm9ncmFtOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVN0YXRlbWVudDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtNTAsNiArNTEsMjMgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWID0gREVCVUcgPyBDb25maWcuTE9HRCA6IENvbmZpZy5MT0dWOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gY291bnRQcm9qZWN0aW9uID0gbmV3IFN0cmluZ1tdeyJjb3VudCgqKSJ9OworCisgICAgLyoqIE9uZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfU0VMRUNUID0gMTsKKyAgICAvKiogT25lIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyl9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9VUERBVEUgPSAyOworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX0FUVEFDSCA9IDM7CisgICAgLyoqIE9uZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfQkVHSU4gPSA0OworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX0NPTU1JVCA9IDU7CisgICAgLyoqIE9uZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfQUJPUlQgPSA2OworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX09USEVSID0gNzsKKwogICAgIC8qKgogICAgICAqIFNwZWNpYWwgZnVuY3Rpb24gZm9yIHdyaXRpbmcgYW4gZXhjZXB0aW9uIHJlc3VsdCBhdCB0aGUgaGVhZGVyIG9mCiAgICAgICogYSBwYXJjZWwsIHRvIGJlIHVzZWQgd2hlbiByZXR1cm5pbmcgYW4gZXhjZXB0aW9uIGZyb20gYSB0cmFuc2FjdGlvbi4KQEAgLTE5MSw2ICsyMDksMzcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGRhdGEgdHlwZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0J3MgdmFsdWUuCisgICAgICo8cD4KKyAgICAgKiBSZXR1cm5lZCB2YWx1ZXMgYXJlCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9OVUxMfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX0lOVEVHRVJ9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfRkxPQVR9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfU1RSSU5HfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX0JMT0J9PC9saT4KKyAgICAgKjwvdWw+CisgICAgICo8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3Qgd2hvc2UgdmFsdWUgdHlwZSBpcyB0byBiZSByZXR1cm5lZAorICAgICAqIEByZXR1cm4gb2JqZWN0IHZhbHVlIHR5cGUKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFR5cGVPZk9iamVjdChPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIEN1cnNvci5GSUVMRF9UWVBFX05VTEw7CisgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgYnl0ZVtdKSB7CisgICAgICAgICAgICByZXR1cm4gQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQjsKKyAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBGbG9hdCB8fCBvYmogaW5zdGFuY2VvZiBEb3VibGUpIHsKKyAgICAgICAgICAgIHJldHVybiBDdXJzb3IuRklFTERfVFlQRV9GTE9BVDsKKyAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBMb25nIHx8IG9iaiBpbnN0YW5jZW9mIEludGVnZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBDdXJzb3IuRklFTERfVFlQRV9JTlRFR0VSOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEN1cnNvci5GSUVMRF9UWVBFX1NUUklORzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIEFwcGVuZHMgYW4gU1FMIHN0cmluZyB0byB0aGUgZ2l2ZW4gU3RyaW5nQnVpbGRlciwgaW5jbHVkaW5nIHRoZSBvcGVuaW5nCiAgICAgICogYW5kIGNsb3Npbmcgc2luZ2xlIHF1b3Rlcy4gQW55IHNpbmdsZSBxdW90ZXMgaW50ZXJuYWwgdG8gc3FsU3RyaW5nIHdpbGwKICAgICAgKiBiZSBlc2NhcGVkLgpAQCAtNjU2LDE0ICs3MDUsOCBAQAogICAgICAqIGZpcnN0IGNvbHVtbiBvZiB0aGUgZmlyc3Qgcm93LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBsb25nRm9yUXVlcnkoU1FMaXRlU3RhdGVtZW50IHByb2csIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKLSAgICAgICAgaWYgKHNlbGVjdGlvbkFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHNpemUgPSBzZWxlY3Rpb25BcmdzLmxlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYmluZE9iamVjdFRvUHJvZ3JhbShwcm9nLCBpICsgMSwgc2VsZWN0aW9uQXJnc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyB2YWx1ZSA9IHByb2cuc2ltcGxlUXVlcnlGb3JMb25nKCk7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgcHJvZy5iaW5kQWxsQXJnc0FzU3RyaW5ncyhzZWxlY3Rpb25BcmdzKTsKKyAgICAgICAgcmV0dXJuIHByb2cuc2ltcGxlUXVlcnlGb3JMb25nKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02ODQsMTQgKzcyNywzNiBAQAogICAgICAqIGZpcnN0IGNvbHVtbiBvZiB0aGUgZmlyc3Qgcm93LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmluZ0ZvclF1ZXJ5KFNRTGl0ZVN0YXRlbWVudCBwcm9nLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7Ci0gICAgICAgIGlmIChzZWxlY3Rpb25BcmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBzaXplID0gc2VsZWN0aW9uQXJncy5sZW5ndGg7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGJpbmRPYmplY3RUb1Byb2dyYW0ocHJvZywgaSArIDEsIHNlbGVjdGlvbkFyZ3NbaV0pOwotICAgICAgICAgICAgfQorICAgICAgICBwcm9nLmJpbmRBbGxBcmdzQXNTdHJpbmdzKHNlbGVjdGlvbkFyZ3MpOworICAgICAgICByZXR1cm4gcHJvZy5zaW1wbGVRdWVyeUZvclN0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIHJ1biB0aGUgcXVlcnkgb24gdGhlIGRiIGFuZCByZXR1cm4gdGhlIGJsb2IgdmFsdWUgaW4gdGhlCisgICAgICogZmlyc3QgY29sdW1uIG9mIHRoZSBmaXJzdCByb3cuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgcmVhZC1vbmx5IGZpbGUgZGVzY3JpcHRvciBmb3IgYSBjb3B5IG9mIHRoZSBibG9iIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGFyY2VsRmlsZURlc2NyaXB0b3IgYmxvYkZpbGVEZXNjcmlwdG9yRm9yUXVlcnkoU1FMaXRlRGF0YWJhc2UgZGIsCisgICAgICAgICAgICBTdHJpbmcgcXVlcnksIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHByb2cgPSBkYi5jb21waWxlU3RhdGVtZW50KHF1ZXJ5KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBibG9iRmlsZURlc2NyaXB0b3JGb3JRdWVyeShwcm9nLCBzZWxlY3Rpb25BcmdzKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHByb2cuY2xvc2UoKTsKICAgICAgICAgfQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yU3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBydW4gdGhlIHByZS1jb21waWxlZCBxdWVyeSBhbmQgcmV0dXJuIHRoZSBibG9iIHZhbHVlIGluIHRoZQorICAgICAqIGZpcnN0IGNvbHVtbiBvZiB0aGUgZmlyc3Qgcm93LgorICAgICAqCisgICAgICogQHJldHVybiBBIHJlYWQtb25seSBmaWxlIGRlc2NyaXB0b3IgZm9yIGEgY29weSBvZiB0aGUgYmxvYiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGJsb2JGaWxlRGVzY3JpcHRvckZvclF1ZXJ5KFNRTGl0ZVN0YXRlbWVudCBwcm9nLAorICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgeworICAgICAgICBwcm9nLmJpbmRBbGxBcmdzQXNTdHJpbmdzKHNlbGVjdGlvbkFyZ3MpOworICAgICAgICByZXR1cm4gcHJvZy5zaW1wbGVRdWVyeUZvckJsb2JGaWxlRGVzY3JpcHRvcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTE1Miw0ICsxMjE3LDU5IEBACiAgICAgICAgIGRiLnNldFZlcnNpb24oZGJWZXJzaW9uKTsKICAgICAgICAgZGIuY2xvc2UoKTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIHdoaWNoIHJlcHJlc2VudCB0aGUgdHlwZSBvZiB0aGUgZ2l2ZW4gU1FMIHN0YXRlbWVudC4KKyAgICAgKiA8b2w+CisgICAgICogICA8bGk+e0BsaW5rICNTVEFURU1FTlRfU0VMRUNUfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNTVEFURU1FTlRfVVBEQVRFfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNTVEFURU1FTlRfQVRUQUNIfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNTVEFURU1FTlRfQkVHSU59PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI1NUQVRFTUVOVF9DT01NSVR9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI1NUQVRFTUVOVF9BQk9SVH08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX09USEVSfTwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKiBAcGFyYW0gc3FsIHRoZSBTUUwgc3RhdGVtZW50IHdob3NlIHR5cGUgaXMgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QKKyAgICAgKiBAcmV0dXJuIG9uZSBvZiB0aGUgdmFsdWVzIGxpc3RlZCBhYm92ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nIHNxbCkgeworICAgICAgICBzcWwgPSBzcWwudHJpbSgpOworICAgICAgICBpZiAoc3FsLmxlbmd0aCgpIDwgMykgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcHJlZml4U3FsID0gc3FsLnN1YnN0cmluZygwLCAzKS50b1VwcGVyQ2FzZSgpOworICAgICAgICBpZiAocHJlZml4U3FsLmVxdWFscygiU0VMIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfU0VMRUNUOworICAgICAgICB9IGVsc2UgaWYgKHByZWZpeFNxbC5lcXVhbHMoIklOUyIpIHx8CisgICAgICAgICAgICAgICAgcHJlZml4U3FsLmVxdWFscygiVVBEIikgfHwKKyAgICAgICAgICAgICAgICBwcmVmaXhTcWwuZXF1YWxzKCJSRVAiKSB8fAorICAgICAgICAgICAgICAgIHByZWZpeFNxbC5lcXVhbHMoIkRFTCIpKSB7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVNRU5UX1VQREFURTsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVmaXhTcWwuZXF1YWxzKCJBVFQiKSkgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9BVFRBQ0g7CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFscygiQ09NIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfQ09NTUlUOworICAgICAgICB9IGVsc2UgaWYgKHByZWZpeFNxbC5lcXVhbHMoIkVORCIpKSB7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVNRU5UX0NPTU1JVDsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVmaXhTcWwuZXF1YWxzKCJST0wiKSkgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9BQk9SVDsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVmaXhTcWwuZXF1YWxzKCJCRUciKSkgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9CRUdJTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU1RBVEVNRU5UX09USEVSOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZHMgb25lIHNldCBvZiBzZWxlY3Rpb24gYXJncyB0byBhbm90aGVyLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGFkZGluZyBhIHNlbGVjdGlvbgorICAgICAqIGFyZ3VtZW50IHRvIGEgdXNlciBwcm92aWRlZCBzZXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBhcHBlbmRTZWxlY3Rpb25BcmdzKFN0cmluZ1tdIG9yaWdpbmFsVmFsdWVzLCBTdHJpbmdbXSBuZXdWYWx1ZXMpIHsKKyAgICAgICAgaWYgKG9yaWdpbmFsVmFsdWVzID09IG51bGwgfHwgb3JpZ2luYWxWYWx1ZXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZXM7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tvcmlnaW5hbFZhbHVlcy5sZW5ndGggKyBuZXdWYWx1ZXMubGVuZ3RoIF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZ2luYWxWYWx1ZXMsIDAsIHJlc3VsdCwgMCwgb3JpZ2luYWxWYWx1ZXMubGVuZ3RoKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShuZXdWYWx1ZXMsIDAsIHJlc3VsdCwgb3JpZ2luYWxWYWx1ZXMubGVuZ3RoLCBuZXdWYWx1ZXMubGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MTllNDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CisKKy8qKgorICogRGVmYXVsdCBjbGFzcyB1c2VkIGRlZmluaW5nIHRoZSBhY3Rpb25zIHRvIHRha2Ugd2hlbiB0aGUgZm9sbG93aW5nIGVycm9ycyBhcmUgZGV0ZWN0ZWQKKyAqICAgZGF0YWJhc2UgY29ycnVwdGlvbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRGF0YWJhc2VFcnJvckhhbmRsZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIiOworCisgICAgLyoqCisgICAgICogZGVmaW5lcyB0aGUgZGVmYXVsdCBtZXRob2QgdG8gYmUgaW52b2tlZCB3aGVuIGRhdGFiYXNlIGNvcnJ1cHRpb24gaXMgZGV0ZWN0ZWQuCisgICAgICogQHBhcmFtIGRiT2JqIHRoZSB7QGxpbmsgU1FMaXRlRGF0YWJhc2V9IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRhdGFiYXNlIG9uIHdoaWNoIGNvcnJ1cHRpb24KKyAgICAgKiBpcyBkZXRlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNvcnJ1cHRpb24oU1FMaXRlRGF0YWJhc2UgZGJPYmopIHsKKyAgICAgICAgTG9nLmUoVEFHLCAiQ29ycnVwdGlvbiByZXBvcnRlZCBieSBzcWxpdGUgb24gZGF0YWJhc2U6ICIgKyBkYk9iai5nZXRQYXRoKCkpOworCisgICAgICAgIC8vIGlzIHRoZSBjb3JydXB0aW9uIGRldGVjdGVkIGV2ZW4gYmVmb3JlIGRhdGFiYXNlIGNvdWxkIGJlICdvcGVuZWQnPworICAgICAgICBpZiAoIWRiT2JqLmlzT3BlbigpKSB7CisgICAgICAgICAgICAvLyBkYXRhYmFzZSBmaWxlcyBhcmUgbm90IGV2ZW4gb3BlbmFibGUuIGRlbGV0ZSB0aGlzIGRhdGFiYXNlIGZpbGUuCisgICAgICAgICAgICAvLyBOT1RFIGlmIHRoZSBkYXRhYmFzZSBoYXMgYXR0YWNoZWQgZGF0YWJhc2VzLCB0aGVuIGFueSBvZiB0aGVtIGNvdWxkIGJlIGNvcnJ1cHQuCisgICAgICAgICAgICAvLyBhbmQgbm90IGRlbGV0aW5nIGFsbCBvZiB0aGVtIGNvdWxkIGNhdXNlIGNvcnJ1cHRlZCBkYXRhYmFzZSBmaWxlIHRvIHJlbWFpbiBhbmQgCisgICAgICAgICAgICAvLyBtYWtlIHRoZSBhcHBsaWNhdGlvbiBjcmFzaCBvbiBkYXRhYmFzZSBvcGVuIG9wZXJhdGlvbi4gVG8gYXZvaWQgdGhpcyBwcm9ibGVtLAorICAgICAgICAgICAgLy8gdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBwcm92aWRlIGl0cyBvd24ge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSBpbXBsIGNsYXNzCisgICAgICAgICAgICAvLyB0byBkZWxldGUgQUxMIGZpbGVzIG9mIHRoZSBkYXRhYmFzZSAoaW5jbHVkaW5nIHRoZSBhdHRhY2hlZCBkYXRhYmFzZXMpLgorICAgICAgICAgICAgZGVsZXRlRGF0YWJhc2VGaWxlKGRiT2JqLmdldFBhdGgoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGF0dGFjaGVkRGJzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIENsb3NlIHRoZSBkYXRhYmFzZSwgd2hpY2ggd2lsbCBjYXVzZSBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgdG8gZmFpbC4KKyAgICAgICAgICAgIC8vIGJlZm9yZSB0aGF0LCBnZXQgdGhlIGF0dGFjaGVkIGRhdGFiYXNlIGxpc3QgZmlyc3QuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGF0dGFjaGVkRGJzID0gZGJPYmouZ2V0QXR0YWNoZWREYnMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRiT2JqLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gRGVsZXRlIGFsbCBmaWxlcyBvZiB0aGlzIGNvcnJ1cHQgZGF0YWJhc2UgYW5kL29yIGF0dGFjaGVkIGRhdGFiYXNlcworICAgICAgICAgICAgaWYgKGF0dGFjaGVkRGJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFBhaXI8U3RyaW5nLCBTdHJpbmc+IHAgOiBhdHRhY2hlZERicykgeworICAgICAgICAgICAgICAgICAgICBkZWxldGVEYXRhYmFzZUZpbGUocC5zZWNvbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gYXR0YWNoZWREYnMgPSBudWxsIGlzIHBvc3NpYmxlIHdoZW4gdGhlIGRhdGFiYXNlIGlzIHNvIGNvcnJ1cHQgdGhhdCBldmVuCisgICAgICAgICAgICAgICAgLy8gIlBSQUdNQSBkYXRhYmFzZV9saXN0OyIgYWxzbyBmYWlscy4gZGVsZXRlIHRoZSBtYWluIGRhdGFiYXNlIGZpbGUKKyAgICAgICAgICAgICAgICBkZWxldGVEYXRhYmFzZUZpbGUoZGJPYmouZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWxldGVEYXRhYmFzZUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7CisgICAgICAgIGlmIChmaWxlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCI6bWVtb3J5OiIpIHx8IGZpbGVOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTG9nLmUoVEFHLCAiZGVsZXRpbmcgdGhlIGRhdGFiYXNlIGZpbGU6ICIgKyBmaWxlTmFtZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRmlsZShmaWxlTmFtZSkuZGVsZXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvKiBwcmludCB3YXJuaW5nIGFuZCBpZ25vcmUgZXhjZXB0aW9uICovCisgICAgICAgICAgICBMb2cudyhUQUcsICJkZWxldGUgZmFpbGVkOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvSUJ1bGtDdXJzb3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0lCdWxrQ3Vyc29yLmphdmEKaW5kZXggNDY3OTBhMy4uMjQ0Yzg4ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvSUJ1bGtDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9JQnVsa0N1cnNvci5qYXZhCkBAIC0xNiwxNiArMTYsMTQgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOwogCi1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSUludGVyZmFjZTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAKIC8qKgogICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYSBsb3ctbGV2ZWwgd2F5IHRvIHBhc3MgYnVsayBjdXJzb3IgZGF0YSBhY3Jvc3MKLSAqIGJvdGggcHJvY2VzcyBhbmQgbGFuZ3VhZ2UgYm91bmRyaWVzLiBBcHBsaWNhdGlvbiBjb2RlIHNob3VsZCB1c2UgdGhlIEN1cnNvcgorICogYm90aCBwcm9jZXNzIGFuZCBsYW5ndWFnZSBib3VuZGFyaWVzLiBBcHBsaWNhdGlvbiBjb2RlIHNob3VsZCB1c2UgdGhlIEN1cnNvcgogICogaW50ZXJmYWNlIGRpcmVjdGx5LgogICoKICAqIHtAaGlkZX0KQEAgLTU0LDEwICs1Miw2IEBACiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKIAotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVJvd3MoTWFwPD8gZXh0ZW5kcyBMb25nLCA/IGV4dGVuZHMgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwotCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KGludCBwb3NpdGlvbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKLQogICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwpAQCAtNzYsOCArNzAsNiBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0NVUlNPUl9XSU5ET1dfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT047CiAgICAgc3RhdGljIGZpbmFsIGludCBDT1VOVF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE7CiAgICAgc3RhdGljIGZpbmFsIGludCBHRVRfQ09MVU1OX05BTUVTX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IFVQREFURV9ST1dTX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IERFTEVURV9ST1dfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgREVBQ1RJVkFURV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU7CiAgICAgc3RhdGljIGZpbmFsIGludCBSRVFVRVJZX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjsKICAgICBzdGF0aWMgZmluYWwgaW50IE9OX01PVkVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA3OwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NYXRyaXhDdXJzb3IuamF2YQppbmRleCBkNWMzYTMyLi41YzFiOTY4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NYXRyaXhDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NYXRyaXhDdXJzb3IuamF2YQpAQCAtMjcyLDYgKzI3MiwxMSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uKSB7CisgICAgICAgIHJldHVybiBEYXRhYmFzZVV0aWxzLmdldFR5cGVPZk9iamVjdChnZXQoY29sdW1uKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW4pIHsKICAgICAgICAgcmV0dXJuIGdldChjb2x1bW4pID09IG51bGw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWVyZ2VDdXJzb3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01lcmdlQ3Vyc29yLmphdmEKaW5kZXggNzIyZDcwNy4uMmMyNWRiNyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWVyZ2VDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NZXJnZUN1cnNvci5qYXZhCkBAIC05MiwzMiArOTIsNiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpCi0gICAgewotICAgICAgICByZXR1cm4gbUN1cnNvci5kZWxldGVSb3coKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoKSB7Ci0gICAgICAgIGludCBsZW5ndGggPSBtQ3Vyc29ycy5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGxlbmd0aCA7IGkrKykgewotICAgICAgICAgICAgaWYgKG1DdXJzb3JzW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yc1tpXS5jb21taXRVcGRhdGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgb25DaGFuZ2UodHJ1ZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBjb2x1bW4pCiAgICAgewpAQCAtMTU1LDYgKzEyOSwxMSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uKSB7CisgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldFR5cGUoY29sdW1uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc051bGwoaW50IGNvbHVtbikKICAgICB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmlzTnVsbChjb2x1bW4pOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvUmVxdWVyeU9uVWlUaHJlYWRFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL1JlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhNTBkOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL1JlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKKworLyoqCisgKiBBbiBleGNlcHRpb24gdGhhdCBpbmRpY2F0ZXMgaW52b2tpbmcge0BsaW5rIEN1cnNvciNyZXF1ZXJ5KCl9IG9uIE1haW4gdGhyZWFkIGNvdWxkIGNhdXNlIEFOUi4KKyAqIFRoaXMgZXhjZXB0aW9uIHNob3VsZCBlbmNvdXJhZ2UgYXBwcyB0byBpbnZva2Uge0BsaW5rIEN1cnNvciNyZXF1ZXJ5KCl9IGluIGEgYmFja2dyb3VuZCB0aHJlYWQuIAorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIFJlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFJlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uKFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICBzdXBlcigiSW4gIiArIHBhY2thZ2VOYW1lICsgIiBSZXF1ZXJ5IGlzIGV4ZWN1dGluZyBvbiBtYWluIChVSSkgdGhyZWFkLiBjb3VsZCBjYXVzZSBBTlIuICIgKworICAgICAgICAgICAgICAgICJkbyBpdCBpbiBiYWNrZ3JvdW5kIHRocmVhZC4iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VDb25uZWN0aW9uUG9vbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlQ29ubmVjdGlvblBvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGIwNjA1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlQ29ubmVjdGlvblBvb2wuamF2YQpAQCAtMCwwICsxLDM2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCisvKioKKyAqIEEgY29ubmVjdGlvbiBwb29sIHRvIGJlIHVzZWQgYnkgcmVhZGVycy4KKyAqIE5vdGUgdGhhdCBlYWNoIGNvbm5lY3Rpb24gY2FuIGJlIHVzZWQgYnkgb25seSBvbmUgcmVhZGVyIGF0IGEgdGltZS4KKyAqLworLyogcGFja2FnZSAqLyBjbGFzcyBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGF0YWJhc2VDb25uZWN0aW9uUG9vbCI7CisKKyAgICAvKiogVGhlIGRlZmF1bHQgY29ubmVjdGlvbiBwb29sIHNpemUuIEl0IGlzIHNldCBiYXNlZCBvbiB0aGUgYW1vdW50IG9mIG1lbW9yeSB0aGUgZGV2aWNlIGhhcy4KKyAgICAgKiBUT0RPOiBzZXQgdGhpcyB3aXRoICdhIHN5c3RlbSBjYWxsJyB3aGljaCByZXR1cm5zIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRoZSBkZXZpY2UgaGFzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ09OTkVDVElPTl9QT09MX1NJWkUgPSAxOworCisgICAgLyoqIHRoZSBwb29sIHNpemUgc2V0IGZvciB0aGlzIHtAbGluayBTUUxpdGVEYXRhYmFzZX0gKi8KKyAgICBwcml2YXRlIHZvbGF0aWxlIGludCBtTWF4UG9vbFNpemUgPSBERUZBVUxUX0NPTk5FQ1RJT05fUE9PTF9TSVpFOworCisgICAgLyoqIFRoZSBjb25uZWN0aW9uIHBvb2wgb2JqZWN0cyBhcmUgc3RvcmVkIGluIHRoaXMgbWVtYmVyLgorICAgICAqIFRPRE86IHJldmlzaXQgdGhpcyBkYXRhIHN0cnVjdCBhcyB0aGUgbnVtYmVyIG9mIHBvb2xlZCBjb25uZWN0aW9ucyBpbmNyZWFzZSBiZXlvbmQKKyAgICAgKiBzaW5nbGUtZGlnaXQgdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFBvb2xPYmo+IG1Qb29sID0gbmV3IEFycmF5TGlzdDxQb29sT2JqPihtTWF4UG9vbFNpemUpOworCisgICAgLyoqIHRoZSBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gd2hpY2ggdGhpcyBjb25uZWN0aW9uIHBvb2wgaXMgYXR0YWNoZWQgKi8KKyAgICBwcml2YXRlIGZpbmFsIFNRTGl0ZURhdGFiYXNlIG1QYXJlbnREYk9iajsKKworICAgIC8qKiBSYW5kb20gbnVtYmVyIGdlbmVyYXRvciB1c2VkIHRvIHBpY2sgYSBmcmVlIGNvbm5lY3Rpb24gb3V0IG9mIHRoZSBwb29sICovCisgICAgcHJpdmF0ZSBSYW5kb20gcmFuZDsgLy8gbGF6aWx5IGluaXRpYWxpemVkCisKKyAgICAvKiBwYWNrYWdlICovIERhdGFiYXNlQ29ubmVjdGlvblBvb2woU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgdGhpcy5tUGFyZW50RGJPYmogPSBkYjsKKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiTWF4IFBvb2wgU2l6ZTogIiArIG1NYXhQb29sU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjbG9zZSBhbGwgZGF0YWJhc2UgY29ubmVjdGlvbnMgaW4gdGhlIHBvb2wgLSBldmVuIGlmIHRoZXkgYXJlIGluIHVzZSEKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIHN5bmNocm9uaXplZChtUGFyZW50RGJPYmopIHsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDbG9zaW5nIHRoZSBjb25uZWN0aW9uIHBvb2wgb24gIiArIG1QYXJlbnREYk9iai5nZXRQYXRoKCkgKyB0b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUG9vbC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIG1Qb29sLmdldChpKS5tRGIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qb29sLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgYSBmcmVlIGNvbm5lY3Rpb24gZnJvbSB0aGUgcG9vbAorICAgICAqCisgICAgICogQHBhcmFtIHNxbCBpZiBub3QgbnVsbCwgdHJ5IHRvIGZpbmQgYSBjb25uZWN0aW9uIGludGhlIHBvb2wgd2hpY2ggYWxyZWFkeSBoYXMgY2FjaGVkCisgICAgICogdGhlIGNvbXBpbGVkIHN0YXRlbWVudCBmb3IgdGhpcyBzcWwuCisgICAgICogQHJldHVybiB0aGUgRGF0YWJhc2UgY29ubmVjdGlvbiB0aGF0IHRoZSBjYWxsZXIgY2FuIHVzZQorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlRGF0YWJhc2UgZ2V0KFN0cmluZyBzcWwpIHsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBudWxsOworICAgICAgICBQb29sT2JqIHBvb2xPYmogPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQobVBhcmVudERiT2JqKSB7CisgICAgICAgICAgICBpbnQgcG9vbFNpemUgPSBtUG9vbC5zaXplKCk7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHNxbCAhPSBudWxsOworICAgICAgICAgICAgICAgIGRvQXNzZXJ0cygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdldEZyZWVQb29sU2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBubyBmcmVlICggPSBhdmFpbGFibGUpIGNvbm5lY3Rpb25zCisgICAgICAgICAgICAgICAgaWYgKG1NYXhQb29sU2l6ZSA9PSBwb29sU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBtYXhlZCBvdXQuIGNhbid0IG9wZW4gYW55IG1vcmUgY29ubmVjdGlvbnMuCisgICAgICAgICAgICAgICAgICAgIC8vIGxldCB0aGUgY2FsbGVyIHdhaXQgb24gb25lIG9mIHRoZSBwb29sZWQgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJlZmVyYWJseSBhIGNvbm5lY3Rpb24gY2FjaGluZyB0aGUgcHJlLWNvbXBpbGVkIHN0YXRlbWVudCBvZiB0aGUgZ2l2ZW4gU1FMCisgICAgICAgICAgICAgICAgICAgIGlmIChtTWF4UG9vbFNpemUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG1Qb29sLmdldCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU1heFBvb2xTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBvb2wuZ2V0KGkpLm1EYi5pc1NxbEluU3RhdGVtZW50Q2FjaGUoc3FsKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9vbE9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgYXJlIG5vIGRhdGFiYXNlIGNvbm5lY3Rpb25zIHdpdGggdGhlIGdpdmVuIFNRTCBwcmUtY29tcGlsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2sgdG8gcmV0dXJuIGFueSBvZiB0aGUgY29ubmVjdGlvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kID0gbmV3IFJhbmRvbShTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xPYmogPSBtUG9vbC5nZXQocmFuZC5uZXh0SW50KG1NYXhQb29sU2l6ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRiID0gcG9vbE9iai5tRGI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gYW5kIGFkZCBpdCB0byB0aGUgcG9vbCwgc2luY2Ugd2UgaGF2ZW4ndCByZWFjaGVkCisgICAgICAgICAgICAgICAgICAgIC8vIG1heCBwb29sIHNpemUgYWxsb3dlZAorICAgICAgICAgICAgICAgICAgICBkYiA9IG1QYXJlbnREYk9iai5jcmVhdGVQb29sQ29ubmVjdGlvbigoc2hvcnQpKHBvb2xTaXplICsgMSkpOworICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbmV3IFBvb2xPYmooZGIpOworICAgICAgICAgICAgICAgICAgICBtUG9vbC5hZGQocG9vbFNpemUsIHBvb2xPYmopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gdGhlcmUgYXJlIGZyZWUgY29ubmVjdGlvbnMgYXZhaWxhYmxlLiBwaWNrIG9uZQorICAgICAgICAgICAgICAgIC8vIHByZWZlcmFibHkgYSBjb25uZWN0aW9uIGNhY2hpbmcgdGhlIHByZS1jb21waWxlZCBzdGF0ZW1lbnQgb2YgdGhlIGdpdmVuIFNRTAorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9vbFNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAobVBvb2wuZ2V0KGkpLmlzRnJlZSgpICYmIG1Qb29sLmdldChpKS5tRGIuaXNTcWxJblN0YXRlbWVudENhY2hlKHNxbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xPYmogPSBtUG9vbC5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocG9vbE9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRpZG4ndCBmaW5kIGEgZnJlZSBkYXRhYmFzZSBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIFNRTCBhbHJlYWR5CisgICAgICAgICAgICAgICAgICAgIC8vIHByZS1jb21waWxlZC4gcmV0dXJuIGEgZnJlZSBjb25uZWN0aW9uICh0aGlzIG1lYW5zLCB0aGUgc2FtZSBTUUwgY291bGQgYmUKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJlLWNvbXBpbGVkIG9uIG1vcmUgdGhhbiBvbmUgZGF0YWJhc2UgY29ubmVjdGlvbi4gcG90ZW50aWFsIHdhc3RlZCBtZW1vcnkuKQorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvb2xTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUG9vbC5nZXQoaSkuaXNGcmVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRiID0gcG9vbE9iai5tRGI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydCBwb29sT2JqICE9IG51bGw7CisgICAgICAgICAgICBhc3NlcnQgcG9vbE9iai5tRGIgPT0gZGI7CisKKyAgICAgICAgICAgIHBvb2xPYmouYWNxdWlyZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiRU5EIGdldC1jb25uZWN0aW9uOiAiICsgdG9TdHJpbmcoKSArIHBvb2xPYmoudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRiOworICAgICAgICAvLyBUT0RPIGlmIGEgdGhyZWFkIGFjcXVpcmVzIGEgY29ubmVjdGlvbiBhbmQgZGllcyB3aXRob3V0IHJlbGVhc2luZyB0aGUgY29ubmVjdGlvbiwgdGhlbgorICAgICAgICAvLyB0aGVyZSBjb3VsZCBiZSBhIGNvbm5lY3Rpb24gbGVhay4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWxlYXNlIHRoZSBnaXZlbiBkYXRhYmFzZSBjb25uZWN0aW9uIGJhY2sgdG8gdGhlIHBvb2wuCisgICAgICogQHBhcmFtIGRiIHRoZSBjb25uZWN0aW9uIHRvIGJlIHJlbGVhc2VkCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyB2b2lkIHJlbGVhc2UoU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgUG9vbE9iaiBwb29sT2JqOworICAgICAgICBzeW5jaHJvbml6ZWQobVBhcmVudERiT2JqKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGRiLm1Db25uZWN0aW9uTnVtID4gMDsKKyAgICAgICAgICAgICAgICBkb0Fzc2VydHMoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgbVBvb2wuZ2V0KGRiLm1Db25uZWN0aW9uTnVtIC0gMSkubURiID09IGRiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KGRiLm1Db25uZWN0aW9uTnVtIC0gMSk7CisKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJCRUdJTiByZWxlYXNlLWNvbm46ICIgKyB0b1N0cmluZygpICsgcG9vbE9iai50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBvb2xPYmouaXNGcmVlKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJSZWxlYXNpbmcgb2JqZWN0IGFscmVhZHkgZnJlZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgZGIubUNvbm5lY3Rpb25OdW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwb29sT2JqLnJlbGVhc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkVORCByZWxlYXNlLWNvbm46ICIgKyB0b1N0cmluZygpICsgcG9vbE9iai50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBkYXRhYmFzZSBjb25uZWN0aW9ucyBpbiB0aGUgcG9vbCAoYm90aCBmcmVlIGFuZCBidXN5IGNvbm5lY3Rpb25zKS4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHdoZW4gImFkYiBidWdyZXBvcnQiIGlzIGRvbmUuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBBcnJheUxpc3Q8U1FMaXRlRGF0YWJhc2U+IGdldENvbm5lY3Rpb25MaXN0KCkgeworICAgICAgICBBcnJheUxpc3Q8U1FMaXRlRGF0YWJhc2U+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFNRTGl0ZURhdGFiYXNlPigpOworICAgICAgICBzeW5jaHJvbml6ZWQobVBhcmVudERiT2JqKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbVBvb2wuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZChtUG9vbC5nZXQoaSkubURiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwYWNrYWdlIGxldmVsIGFjY2VzcyBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LiBvdGhlcndpc2UsIHByaXZhdGUgc2hvdWxkIGJlIHN1ZmZpY2llbnQuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBpbnQgZ2V0RnJlZVBvb2xTaXplKCkgeworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gbVBvb2wuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGlmIChtUG9vbC5nZXQoaSkuaXNGcmVlKCkpIHsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3VudCsrOworICAgIH0KKworICAgIC8qKgorICAgICAqIG9ubHkgZm9yIHRlc3RpbmcgcHVycG9zZXMKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIEFycmF5TGlzdDxQb29sT2JqPiBnZXRQb29sKCkgeworICAgICAgICByZXR1cm4gbVBvb2w7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWZmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYnVmZi5hcHBlbmQoImRiOiAiKTsKKyAgICAgICAgYnVmZi5hcHBlbmQobVBhcmVudERiT2JqLmdldFBhdGgoKSk7CisgICAgICAgIGJ1ZmYuYXBwZW5kKCIsIHRvdGFsc2l6ZSA9ICIpOworICAgICAgICBidWZmLmFwcGVuZChtUG9vbC5zaXplKCkpOworICAgICAgICBidWZmLmFwcGVuZCgiLCAjZnJlZSA9ICIpOworICAgICAgICBidWZmLmFwcGVuZChnZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGJ1ZmYuYXBwZW5kKCIsIG1heHBvb2xzaXplID0gIik7CisgICAgICAgIGJ1ZmYuYXBwZW5kKG1NYXhQb29sU2l6ZSk7CisgICAgICAgIGZvciAoUG9vbE9iaiBwIDogbVBvb2wpIHsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgYnVmZi5hcHBlbmQocC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmZi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb0Fzc2VydHMoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVBvb2wuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1Qb29sLmdldChpKS52ZXJpZnkoKTsKKyAgICAgICAgICAgIGFzc2VydCBtUG9vbC5nZXQoaSkubURiLm1Db25uZWN0aW9uTnVtID09IChpICsgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgc2V0TWF4UG9vbFNpemUoaW50IHNpemUpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1QYXJlbnREYk9iaikgeworICAgICAgICAgICAgbU1heFBvb2xTaXplID0gc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gaW50IGdldE1heFBvb2xTaXplKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQobVBhcmVudERiT2JqKSB7CisgICAgICAgICAgICByZXR1cm4gbU1heFBvb2xTaXplOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIG9ubHkgdXNlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gKi8KKyAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gaXNEYXRhYmFzZU9iakZyZWUoU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgcmV0dXJuIG1Qb29sLmdldChkYi5tQ29ubmVjdGlvbk51bSAtIDEpLmlzRnJlZSgpOworICAgIH0KKworICAgIC8qKiBvbmx5IHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuICovCisgICAgLyogcGFja2FnZSAqLyBpbnQgZ2V0U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Qb29sLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXByZXNlbnRzIG9iamVjdHMgaW4gdGhlIGNvbm5lY3Rpb24gcG9vbC4KKyAgICAgKiBwYWNrYWdlLWxldmVsIGFjY2VzcyBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNsYXNzIFBvb2xPYmogeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU1FMaXRlRGF0YWJhc2UgbURiOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUZyZWVCdXN5RmxhZyA9IEZSRUU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gRlJFRSA9IHRydWU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gQlVTWSA9IGZhbHNlOworCisgICAgICAgIC8qKiB0aGUgbnVtYmVyIG9mIHRocmVhZHMgaG9sZGluZyB0aGlzIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgLy8gQEd1YXJkZWRCeSgidGhpcyIpCisgICAgICAgIHByaXZhdGUgaW50IG1OdW1Ib2xkZXJzID0gMDsKKworICAgICAgICAvKiogY29udGFpbnMgdGhlIHRocmVhZElkcyBvZiB0aGUgdGhyZWFkcyBob2xkaW5nIHRoaXMgY29ubmVjdGlvbi4KKyAgICAgICAgICogdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuCisgICAgICAgICAqLworICAgICAgICAvLyBAR3VhcmRlZEJ5KCJ0aGlzIikKKyAgICAgICAgcHJpdmF0ZSBIYXNoU2V0PExvbmc+IG1Ib2xkZXJJZHMgPSBuZXcgSGFzaFNldDxMb25nPigpOworCisgICAgICAgIHB1YmxpYyBQb29sT2JqKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgICAgICBtRGIgPSBkYjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWNxdWlyZSgpIHsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgaXNGcmVlKCk7CisgICAgICAgICAgICAgICAgbG9uZyBpZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgIW1Ib2xkZXJJZHMuY29udGFpbnMoaWQpOworICAgICAgICAgICAgICAgIG1Ib2xkZXJJZHMuYWRkKGlkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbU51bUhvbGRlcnMrKzsKKyAgICAgICAgICAgIG1GcmVlQnVzeUZsYWcgPSBCVVNZOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlKCkgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIGxvbmcgaWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG1Ib2xkZXJJZHMuc2l6ZSgpID09IG1OdW1Ib2xkZXJzOworICAgICAgICAgICAgICAgIGFzc2VydCBtSG9sZGVySWRzLmNvbnRhaW5zKGlkKTsKKyAgICAgICAgICAgICAgICBtSG9sZGVySWRzLnJlbW92ZShpZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1OdW1Ib2xkZXJzLS07CisgICAgICAgICAgICBpZiAobU51bUhvbGRlcnMgPT0gMCkgeworICAgICAgICAgICAgICAgIG1GcmVlQnVzeUZsYWcgPSBGUkVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0ZyZWUoKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgdmVyaWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKG1GcmVlQnVzeUZsYWcgPT0gRlJFRSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHZlcmlmeSgpIHsKKyAgICAgICAgICAgIGlmIChtRnJlZUJ1c3lGbGFnID09IEZSRUUpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgbU51bUhvbGRlcnMgPT0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG1OdW1Ib2xkZXJzID4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBvbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICAgICAqLworICAgICAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCBpbnQgZ2V0TnVtSG9sZGVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBtTnVtSG9sZGVyczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWZmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCIsIGNvbm4gIyAiKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKG1EYi5tQ29ubmVjdGlvbk51bSk7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgiLCBtQ291bnRIb2xkZXJzID0gIik7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKG1OdW1Ib2xkZXJzKTsKKyAgICAgICAgICAgICAgICBidWZmLmFwcGVuZCgiLCBmcmVlQnVzeUZsYWcgPSAiKTsKKyAgICAgICAgICAgICAgICBidWZmLmFwcGVuZChtRnJlZUJ1c3lGbGFnKTsKKyAgICAgICAgICAgICAgICBmb3IgKExvbmcgbCA6IG1Ib2xkZXJJZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQoIiwgaWQgPSAiICsgbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uLmphdmEKaW5kZXggOGFjNGMwZi4uZjI4YzcwZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uLmphdmEKQEAgLTIxLDEzICsyMSwxMSBAQAogICogdGhhdCBpcyBub3QgZXhwbGljaXRseSBjbG9zZWQKICAqIEBoaWRlCiAgKi8KLXB1YmxpYyBjbGFzcyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KLXsKK3B1YmxpYyBjbGFzcyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzID0gIkFwcGxpY2F0aW9uIGRpZCBub3QgY2xvc2UgdGhlIGN1cnNvciBvciBkYXRhYmFzZSBvYmplY3QgIiArCiAgICAgICAgICAgICAidGhhdCB3YXMgb3BlbmVkIGhlcmUiOwogCi0gICAgcHVibGljIERhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uKCkKLSAgICB7CisgICAgcHVibGljIERhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcihzKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzhkYTRiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworLyoqCisgKiBUaGlzIGV4Y2VwdGlvbiBjbGFzcyBpcyB1c2VkIHdoZW4gc3FsaXRlIGNhbid0IGFjY2VzcyB0aGUgZGF0YWJhc2UgZmlsZQorICogZHVlIHRvIGxhY2sgb2YgcGVybWlzc2lvbnMgb24gdGhlIGZpbGUuCisgKi8KK3B1YmxpYyBjbGFzcyBTUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWYyZjljCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCisvKioKKyAqIFRocm93biBpZiB0aGUgdGhlIGJpbmQgb3IgY29sdW1uIHBhcmFtZXRlciBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKKyAqLworcHVibGljIGNsYXNzIFNRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgyNjc2YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMDE3OTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitwdWJsaWMgY2xhc3MgU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ29tcGlsZWRTcWwuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb21waWxlZFNxbC5qYXZhCmluZGV4IDI1YWE5YjMuLmFhMGE1N2QgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb21waWxlZFNxbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb21waWxlZFNxbC5qYXZhCkBAIC03OCwyMCArNzgsMTMgQEAKICAgICAgKiAgZXhpc3RpbmcgY29tcGlsZWQgU1FMIHByb2dyYW0gYWxyZWFkeSBhcm91bmQKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgY29tcGlsZShTdHJpbmcgc3FsLCBib29sZWFuIGZvcmNlQ29tcGlsYXRpb24pIHsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZS52ZXJpZnlMb2NrT3duZXIoKTsKICAgICAgICAgLy8gT25seSBjb21waWxlIGlmIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBzdGF0ZW1lbnQgYWxyZWFkeSBvciB0aGUgY2FsbGVyIGhhcwogICAgICAgICAvLyBleHBsaWNpdGx5IHJlcXVlc3RlZCBhIHJlY29tcGlsZS4KICAgICAgICAgaWYgKGZvcmNlQ29tcGlsYXRpb24pIHsKLSAgICAgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgbmF0aXZlX2NvbXBpbGUoKSB0YWtlcyBjYXJlIG9mIGRlc3Ryb3lpbmcgYW55IHByZXZpb3VzbHkKLSAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBwcm9ncmFtcyBiZWZvcmUgaXQgY29tcGlsZXMuCi0gICAgICAgICAgICAgICAgbmF0aXZlX2NvbXBpbGUoc3FsKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBuYXRpdmVfY29tcGlsZSgpIHRha2VzIGNhcmUgb2YgZGVzdHJveWluZyBhbnkgcHJldmlvdXNseQorICAgICAgICAgICAgLy8gZXhpc3RpbmcgcHJvZ3JhbXMgYmVmb3JlIGl0IGNvbXBpbGVzLgorICAgICAgICAgICAgbmF0aXZlX2NvbXBpbGUoc3FsKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTAyLDEzICs5NSw4IEBACiAgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfQUNUSVZFX0NVUlNPUl9GSU5BTElaQVRJT04pIHsKICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJjbG9zZWQgYW5kIGRlYWxsb2NhdGVkIERiT2JqIChpZCMiICsgblN0YXRlbWVudCArIikiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLSAgICAgICAgICAgICAgICBuYXRpdmVfZmluYWxpemUoKTsKLSAgICAgICAgICAgICAgICBuU3RhdGVtZW50ID0gMDsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGFiYXNlLmZpbmFsaXplU3RhdGVtZW50TGF0ZXIoblN0YXRlbWVudCk7CisgICAgICAgICAgICBuU3RhdGVtZW50ID0gMDsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTM0LDYgKzEyMiwxMCBAQAogICAgICAgICBtSW5Vc2UgPSBmYWxzZTsKICAgICB9CiAKKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCBib29sZWFuIGlzSW5Vc2UoKSB7CisgICAgICAgIHJldHVybiBtSW5Vc2U7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogTWFrZSBzdXJlIHRoYXQgdGhlIG5hdGl2ZSByZXNvdXJjZSBpcyBjbGVhbmVkIHVwLgogICAgICAqLwpAQCAtMTQyLDkgKzEzNCw2IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpZiAoblN0YXRlbWVudCA9PSAwKSByZXR1cm47CiAgICAgICAgICAgICAvLyBmaW5hbGl6ZXIgc2hvdWxkIE5FVkVSIGdldCBjYWxsZWQKLSAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19BQ1RJVkVfQ1VSU09SX0ZJTkFMSVpBVElPTikgewotICAgICAgICAgICAgICAgIExvZy52KFRBRywgIioqIHdhcm5pbmcgKiogRmluYWxpemVkIERiT2JqIChpZCMiICsgblN0YXRlbWVudCArICIpIik7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnQgbGVuID0gbVNxbFN0bXQubGVuZ3RoKCk7CiAgICAgICAgICAgICBMb2cudyhUQUcsICJSZWxlYXNpbmcgc3RhdGVtZW50IGluIGEgZmluYWxpemVyLiBQbGVhc2UgZW5zdXJlICIgKwogICAgICAgICAgICAgICAgICAgICAidGhhdCB5b3UgZXhwbGljaXRseSBjYWxsIGNsb3NlKCkgb24geW91ciBjdXJzb3I6ICIgKwpAQCAtMTYyLDUgKzE1MSw0IEBACiAgICAgICogQHBhcmFtIHNxbCBUaGUgU1FMIHRvIGNvbXBpbGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfY29tcGlsZShTdHJpbmcgc3FsKTsKLSAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNvbnRlbnRIZWxwZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb250ZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDBkODYuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNvbnRlbnRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQub3MuTWVtb3J5RmlsZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogU29tZSBoZWxwZXIgZnVuY3Rpb25zIGZvciB1c2luZyBTUUxpdGUgZGF0YWJhc2UgdG8gaW1wbGVtZW50IGNvbnRlbnQgcHJvdmlkZXJzLgotICoKLSAqIEBoaWRlCi0gKi8KLXB1YmxpYyBjbGFzcyBTUUxpdGVDb250ZW50SGVscGVyIHsKLQotICAgIC8qKgotICAgICAqIFJ1bnMgYW4gU1FMaXRlIHF1ZXJ5IGFuZCByZXR1cm5zIGFuIEFzc2V0RmlsZURlc2NyaXB0b3IgZm9yIHRoZQotICAgICAqIGJsb2IgaW4gY29sdW1uIDAgb2YgdGhlIGZpcnN0IHJvdy4gSWYgdGhlIGZpcnN0IGNvbHVtbiBkb2VzCi0gICAgICogbm90IGNvbnRhaW4gYSBibG9iLCBhbiB1bnNwZWNpZmllZCBleGNlcHRpb24gaXMgdGhyb3duLgotICAgICAqCi0gICAgICogQHBhcmFtIGRiIEhhbmRsZSB0byBhIHJlYWRhYmxlIGRhdGFiYXNlLgotICAgICAqIEBwYXJhbSBzcWwgU1FMIHF1ZXJ5LCBwb3NzaWJseSB3aXRoIHF1ZXJ5IGFyZ3VtZW50cy4KLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uQXJncyBRdWVyeSBhcmd1bWVudCB2YWx1ZXMsIG9yIHtAY29kZSBudWxsfSBmb3Igbm8gYXJndW1lbnQuCi0gICAgICogQHJldHVybiBJZiBubyBleGNlcHRpb24gaXMgdGhyb3duLCBhIG5vbi1udWxsIEFzc2V0RmlsZURlc2NyaXB0b3IgaXMgcmV0dXJuZWQuCi0gICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gSWYgdGhlIHF1ZXJ5IHJldHVybnMgbm8gcmVzdWx0cyBvciB0aGUKLSAgICAgKiAgICAgICAgIHZhbHVlIG9mIGNvbHVtbiAwIGlzIE5VTEwsIG9yIGlmIHRoZXJlIGlzIGFuIGVycm9yIGNyZWF0aW5nIHRoZQotICAgICAqICAgICAgICAgYXNzZXQgZmlsZSBkZXNjcmlwdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXNzZXRGaWxlRGVzY3JpcHRvciBnZXRCbG9iQ29sdW1uQXNBc3NldEZpbGUoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwsCi0gICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IHNpbXBsZVF1ZXJ5Rm9yQmxvYk1lbW9yeUZpbGUoZGIsIHNxbCwgc2VsZWN0aW9uQXJncyk7Ci0gICAgICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiTm8gcmVzdWx0cy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBBc3NldEZpbGVEZXNjcmlwdG9yLmZyb21NZW1vcnlGaWxlKGZpbGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihleC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1bnMgYW4gU1FMaXRlIHF1ZXJ5IGFuZCByZXR1cm5zIGEgTWVtb3J5RmlsZSBmb3IgdGhlCi0gICAgICogYmxvYiBpbiBjb2x1bW4gMCBvZiB0aGUgZmlyc3Qgcm93LiBJZiB0aGUgZmlyc3QgY29sdW1uIGRvZXMKLSAgICAgKiBub3QgY29udGFpbiBhIGJsb2IsIGFuIHVuc3BlY2lmaWVkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgbWVtb3J5IGZpbGUsIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcXVlcnkgcmV0dXJucyBubyByZXN1bHRzCi0gICAgICogICAgICAgICBvciB0aGUgdmFsdWUgY29sdW1uIDAgaXMgTlVMTC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIHRoZXJlIGlzIGFuIGVycm9yIGNyZWF0aW5nIHRoZSBtZW1vcnkgZmlsZS4KLSAgICAgKi8KLSAgICAvLyBUT0RPOiBtYWtlIHRoaXMgbmF0aXZlIGFuZCB1c2UgdGhlIFNRTGl0ZSBibG9iIEFQSSB0byByZWR1Y2UgY29weWluZwotICAgIHByaXZhdGUgc3RhdGljIE1lbW9yeUZpbGUgc2ltcGxlUXVlcnlGb3JCbG9iTWVtb3J5RmlsZShTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCwKLSAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEN1cnNvciBjdXJzb3IgPSBkYi5yYXdRdWVyeShzcWwsIHNlbGVjdGlvbkFyZ3MpOwotICAgICAgICBpZiAoY3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoIWN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBjdXJzb3IuZ2V0QmxvYigwKTsKLSAgICAgICAgICAgIGlmIChieXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZW1vcnlGaWxlIGZpbGUgPSBuZXcgTWVtb3J5RmlsZShudWxsLCBieXRlcy5sZW5ndGgpOwotICAgICAgICAgICAgZmlsZS53cml0ZUJ5dGVzKGJ5dGVzLCAwLCAwLCBieXRlcy5sZW5ndGgpOwotICAgICAgICAgICAgZmlsZS5kZWFjdGl2YXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yLmphdmEKaW5kZXggYzdlNThmYS4uNDNkZDVkNyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3IuamF2YQpAQCAtMTYsMjAgKzE2LDE5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CiAKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkFic3RyYWN0V2luZG93ZWRDdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXaW5kb3c7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb247Ci0KK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLlJlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKIApAQCAtNDUsMTkgKzQ0LDE2IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBOT19DT1VOVCA9IC0xOwogCiAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBlZGl0ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUVkaXRUYWJsZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRWRpdFRhYmxlOwogCiAgICAgLyoqIFRoZSBuYW1lcyBvZiB0aGUgY29sdW1ucyBpbiB0aGUgcm93cyAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gbUNvbHVtbnM7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtQ29sdW1uczsKIAogICAgIC8qKiBUaGUgcXVlcnkgb2JqZWN0IGZvciB0aGUgY3Vyc29yICovCiAgICAgcHJpdmF0ZSBTUUxpdGVRdWVyeSBtUXVlcnk7CiAKLSAgICAvKiogVGhlIGRhdGFiYXNlIHRoZSBjdXJzb3Igd2FzIGNyZWF0ZWQgZnJvbSAqLwotICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgbURhdGFiYXNlOwotCiAgICAgLyoqIFRoZSBjb21waWxlZCBxdWVyeSB0aGlzIGN1cnNvciBjYW1lIGZyb20gKi8KLSAgICBwcml2YXRlIFNRTGl0ZUN1cnNvckRyaXZlciBtRHJpdmVyOworICAgIHByaXZhdGUgZmluYWwgU1FMaXRlQ3Vyc29yRHJpdmVyIG1Ecml2ZXI7CiAKICAgICAvKiogVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBjdXJzb3IgKi8KICAgICBwcml2YXRlIGludCBtQ291bnQgPSBOT19DT1VOVDsKQEAgLTY2LDcgKzYyLDcgQEAKICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEludGVnZXI+IG1Db2x1bW5OYW1lTWFwOwogCiAgICAgLyoqIFVzZWQgdG8gZmluZCBvdXQgd2hlcmUgYSBjdXJzb3Igd2FzIGFsbG9jYXRlZCBpbiBjYXNlIGl0IG5ldmVyIGdvdCByZWxlYXNlZC4gKi8KLSAgICBwcml2YXRlIFRocm93YWJsZSBtU3RhY2tUcmFjZTsKKyAgICBwcml2YXRlIGZpbmFsIFRocm93YWJsZSBtU3RhY2tUcmFjZTsKICAgICAKICAgICAvKiogCiAgICAgICogIG1NYXhSZWFkIGlzIHRoZSBtYXggaXRlbXMgdGhhdCBlYWNoIGN1cnNvciB3aW5kb3cgcmVhZHMgCkBAIC03Nyw2ICs3MywxMSBAQAogICAgIHByaXZhdGUgaW50IG1DdXJzb3JTdGF0ZSA9IDA7CiAgICAgcHJpdmF0ZSBSZWVudHJhbnRMb2NrIG1Mb2NrID0gbnVsbDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVBlbmRpbmdEYXRhID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGJ5IHtAbGluayAjcmVxdWVyeSgpfSB0byByZW1lbWJlciBmb3Igd2hpY2ggZGF0YWJhc2Ugd2UndmUgYWxyZWFkeSBzaG93biB0aGUgd2FybmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgQm9vbGVhbj4gc0FscmVhZHlXYXJuZWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+KCk7CiAgICAgCiAgICAgLyoqCiAgICAgICogIHN1cHBvcnQgZm9yIGEgY3Vyc29yIHZhcmlhbnQgdGhhdCBkb2Vzbid0IGFsd2F5cyByZWFkIGFsbCByZXN1bHRzCkBAIC0xMzYsNyArMTM3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG1RdWVyeS5maWxsV2luZG93KGN3LCBtTWF4UmVhZCwgbUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gZ2V0UXVlcnkoKS5maWxsV2luZG93KGN3LCBtTWF4UmVhZCwgbUNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIC0xIG1lYW5zIG5vdCBmaW5pc2hlZAogICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ID09IE5PX0NPVU5UKXsKQEAgLTIwMSwyNCArMjAyLDQ2IEBACiAgICAgICogaGFzIHBhY2thZ2Ugc2NvcGUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZGIgYSByZWZlcmVuY2UgdG8gYSBEYXRhYmFzZSBvYmplY3QgdGhhdCBpcyBhbHJlYWR5IGNvbnN0cnVjdGVkCi0gICAgICogICAgIGFuZCBvcGVuZWQKKyAgICAgKiAgICAgYW5kIG9wZW5lZC4gVGhpcyBwYXJhbSBpcyBub3QgdXNlZCBhbnkgbG9uZ2VyCiAgICAgICogQHBhcmFtIGVkaXRUYWJsZSB0aGUgbmFtZSBvZiB0aGUgdGFibGUgdXNlZCBmb3IgdGhpcyBxdWVyeQogICAgICAqIEBwYXJhbSBxdWVyeSB0aGUgcmVzdCBvZiB0aGUgcXVlcnkgdGVybXMKICAgICAgKiAgICAgY3Vyc29yIGlzIGZpbmFsaXplZAorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI1NRTGl0ZUN1cnNvcihTUUxpdGVDdXJzb3JEcml2ZXIsIFN0cmluZywgU1FMaXRlUXVlcnkpfSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgU1FMaXRlQ3Vyc29yKFNRTGl0ZURhdGFiYXNlIGRiLCBTUUxpdGVDdXJzb3JEcml2ZXIgZHJpdmVyLAogICAgICAgICAgICAgU3RyaW5nIGVkaXRUYWJsZSwgU1FMaXRlUXVlcnkgcXVlcnkpIHsKKyAgICAgICAgdGhpcyhkcml2ZXIsIGVkaXRUYWJsZSwgcXVlcnkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgYSBxdWVyeSBhbmQgcHJvdmlkZSBhY2Nlc3MgdG8gaXRzIHJlc3VsdCBzZXQgdGhyb3VnaCBhIEN1cnNvcgorICAgICAqIGludGVyZmFjZS4gRm9yIGEgcXVlcnkgc3VjaCBhczoge0Bjb2RlIFNFTEVDVCBuYW1lLCBiaXJ0aCwgcGhvbmUgRlJPTQorICAgICAqIG15VGFibGUgV0hFUkUgLi4uIExJTUlUIDEsMjAgT1JERVIgQlkuLi59IHRoZSBjb2x1bW4gbmFtZXMgKG5hbWUsIGJpcnRoLAorICAgICAqIHBob25lKSB3b3VsZCBiZSBpbiB0aGUgcHJvamVjdGlvbiBhcmd1bWVudCBhbmQgZXZlcnl0aGluZyBmcm9tCisgICAgICoge0Bjb2RlIEZST019IG9ud2FyZCB3b3VsZCBiZSBpbiB0aGUgcGFyYW1zIGFyZ3VtZW50LiBUaGlzIGNvbnN0cnVjdG9yCisgICAgICogaGFzIHBhY2thZ2Ugc2NvcGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWRpdFRhYmxlIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSB1c2VkIGZvciB0aGlzIHF1ZXJ5CisgICAgICogQHBhcmFtIHF1ZXJ5IHRoZSB7QGxpbmsgU1FMaXRlUXVlcnl9IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjdXJzb3Igb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTUUxpdGVDdXJzb3IoU1FMaXRlQ3Vyc29yRHJpdmVyIGRyaXZlciwgU3RyaW5nIGVkaXRUYWJsZSwgU1FMaXRlUXVlcnkgcXVlcnkpIHsKICAgICAgICAgLy8gVGhlIEFic3RyYWN0Q3Vyc29yIGNvbnN0cnVjdG9yIG5lZWRzIHRvIGRvIHNvbWUgc2V0dXAuCiAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIGlmIChxdWVyeSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBvYmplY3QgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocXVlcnkubURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5Lm1EYXRhYmFzZSBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB9CiAgICAgICAgIG1TdGFja1RyYWNlID0gbmV3IERhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uKCkuZmlsbEluU3RhY2tUcmFjZSgpOwotICAgICAgICBtRGF0YWJhc2UgPSBkYjsKICAgICAgICAgbURyaXZlciA9IGRyaXZlcjsKICAgICAgICAgbUVkaXRUYWJsZSA9IGVkaXRUYWJsZTsKICAgICAgICAgbUNvbHVtbk5hbWVNYXAgPSBudWxsOwogICAgICAgICBtUXVlcnkgPSBxdWVyeTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgZGIubG9jaygpOworICAgICAgICAgICAgcXVlcnkubURhdGFiYXNlLmxvY2soKTsKIAogICAgICAgICAgICAgLy8gU2V0dXAgdGhlIGxpc3Qgb2YgY29sdW1ucwogICAgICAgICAgICAgaW50IGNvbHVtbkNvdW50ID0gbVF1ZXJ5LmNvbHVtbkNvdW50TG9ja2VkKCk7CkBAIC0yMzksNyArMjYyLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBkYi51bmxvY2soKTsKKyAgICAgICAgICAgIHF1ZXJ5Lm1EYXRhYmFzZS51bmxvY2soKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjQ3LDcgKzI3MCw5IEBACiAgICAgICogQHJldHVybiB0aGUgU1FMaXRlRGF0YWJhc2UgdGhhdCB0aGlzIGN1cnNvciBpcyBhc3NvY2lhdGVkIHdpdGguCiAgICAgICovCiAgICAgcHVibGljIFNRTGl0ZURhdGFiYXNlIGdldERhdGFiYXNlKCkgewotICAgICAgICByZXR1cm4gbURhdGFiYXNlOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtUXVlcnkubURhdGFiYXNlOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yODMsNyArMzA4LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbVdpbmRvdy5zZXRTdGFydFBvc2l0aW9uKHN0YXJ0UG9zKTsKLSAgICAgICAgbUNvdW50ID0gbVF1ZXJ5LmZpbGxXaW5kb3cobVdpbmRvdywgbUluaXRpYWxSZWFkLCAwKTsKKyAgICAgICAgbUNvdW50ID0gZ2V0UXVlcnkoKS5maWxsV2luZG93KG1XaW5kb3csIG1Jbml0aWFsUmVhZCwgMCk7CiAgICAgICAgIC8vIHJldHVybiAtMSBtZWFucyBub3QgZmluaXNoZWQKICAgICAgICAgaWYgKG1Db3VudCA9PSBOT19DT1VOVCl7CiAgICAgICAgICAgICBtQ291bnQgPSBzdGFydFBvcyArIG1Jbml0aWFsUmVhZDsKQEAgLTI5Miw2ICszMTcsMTAgQEAKICAgICAgICAgfSAKICAgICB9CiAKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBTUUxpdGVRdWVyeSBnZXRRdWVyeSgpIHsKKyAgICAgICAgcmV0dXJuIG1RdWVyeTsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldENvbHVtbkluZGV4KFN0cmluZyBjb2x1bW5OYW1lKSB7CiAgICAgICAgIC8vIENyZWF0ZSBtQ29sdW1uTmFtZU1hcCBvbiBkZW1hbmQKQEAgLTMyMSwxNjYgKzM1MCwxMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpIHsKLSAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIC8vIE9ubHkgYWxsb3cgZGVsZXRlcyBpZiB0aGVyZSBpcyBhbiBJRCBjb2x1bW4sIGFuZCB0aGUgSUQgaGFzIGJlZW4gcmVhZCBmcm9tIGl0Ci0gICAgICAgIGlmIChtUm93SWRDb2x1bW5JbmRleCA9PSAtMSB8fCBtQ3VycmVudFJvd0lEID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywKLSAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkZWxldGUgcm93IGJlY2F1c2UgZWl0aGVyIHRoZSByb3cgSUQgY29sdW1uIGlzIG5vdCBhdmFpbGFibGUgb3IgaXQiICsKLSAgICAgICAgICAgICAgICAgICAgImhhcyBub3QgYmVlbiByZWFkLiIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEVuc3VyZSB3ZSBkb24ndCBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBkYXRhYmFzZSB3aGVuIGFub3RoZXIKLSAgICAgICAgICogdGhyZWFkIGlzIGhvbGRpbmcgdGhlIGRhdGFiYXNlIGxvY2suIHJlcXVlcnkoKSBhbmQgbW92ZVRvKCkgYXJlIGFsc28KLSAgICAgICAgICogc3luY2hyb25pemVkIGhlcmUgdG8gbWFrZSBzdXJlIHRoZXkgZ2V0IHRoZSBzdGF0ZSBvZiB0aGUgZGF0YWJhc2UKLSAgICAgICAgICogaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBERUxFVEUuCi0gICAgICAgICAqLwotICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZGVsZXRlKG1FZGl0VGFibGUsIG1Db2x1bW5zW21Sb3dJZENvbHVtbkluZGV4XSArICI9PyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge21DdXJyZW50Um93SUQudG9TdHJpbmcoKX0pOwotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBwb3MgPSBtUG9zOwotICAgICAgICAgICAgcmVxdWVyeSgpOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogRW5zdXJlIHByb3BlciBjdXJzb3Igc3RhdGUuIE5vdGUgdGhhdCBtQ3VycmVudFJvd0lEIGNoYW5nZXMKLSAgICAgICAgICAgICAqIGluIHRoaXMgY2FsbC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbW92ZVRvUG9zaXRpb24ocG9zKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICBvbkNoYW5nZSh0cnVlKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkgewogICAgICAgICByZXR1cm4gbUNvbHVtbnM7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzVXBkYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnN1cHBvcnRzVXBkYXRlcygpICYmICFUZXh0VXRpbHMuaXNFbXB0eShtRWRpdFRhYmxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsCi0gICAgICAgICAgICA/IGV4dGVuZHMgTWFwPFN0cmluZywgT2JqZWN0Pj4gYWRkaXRpb25hbFZhbHVlcykgewotICAgICAgICBpZiAoIXN1cHBvcnRzVXBkYXRlcygpKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJjb21taXRVcGRhdGVzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBjdXJzb3IsIGRpZCB5b3UgIgotICAgICAgICAgICAgICAgICAgICArICJpbmNsdWRlIHRoZSBfaWQgY29sdW1uPyIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogUHJldmVudCBvdGhlciB0aHJlYWRzIGZyb20gY2hhbmdpbmcgdGhlIHVwZGF0ZWQgcm93cyB3aGlsZSB0aGV5J3JlCi0gICAgICAgICAqIGJlaW5nIHByb2Nlc3NlZCBoZXJlLgotICAgICAgICAgKi8KLSAgICAgICAgc3luY2hyb25pemVkIChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChhZGRpdGlvbmFsVmFsdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtVXBkYXRlZFJvd3MucHV0QWxsKGFkZGl0aW9uYWxWYWx1ZXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVVwZGF0ZWRSb3dzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBQcmV2ZW50IG90aGVyIHRocmVhZHMgZnJvbSBjaGFuZ2luZyB0aGUgZGF0YWJhc2Ugc3RhdGUgd2hpbGUKLSAgICAgICAgICAgICAqIHdlIHByb2Nlc3MgdGhlIHVwZGF0ZWQgcm93cywgYW5kIHByZXZlbnRzIHVzIGZyb20gY2hhbmdpbmcgdGhlCi0gICAgICAgICAgICAgKiBkYXRhYmFzZSBiZWhpbmQgdGhlIGJhY2sgb2YgYW5vdGhlciB0aHJlYWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc3FsID0gbmV3IFN0cmluZ0J1aWxkZXIoMTI4KTsKLQotICAgICAgICAgICAgICAgIC8vIEZvciBlYWNoIHJvdyB0aGF0IGhhcyBiZWVuIHVwZGF0ZWQKLSAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxMb25nLCBNYXA8U3RyaW5nLCBPYmplY3Q+PiByb3dFbnRyeSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlZFJvd3MuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHZhbHVlcyA9IHJvd0VudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIExvbmcgcm93SWRPYmogPSByb3dFbnRyeS5nZXRLZXkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocm93SWRPYmogPT0gbnVsbCB8fCB2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibnVsbCByb3dJZCBvciB2YWx1ZXMgZm91bmQhIHJvd0lkID0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJvd0lkT2JqICsgIiwgdmFsdWVzID0gIiArIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGxvbmcgcm93SWQgPSByb3dJZE9iai5sb25nVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXNJdGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICAgICAgICAgIHNxbC5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIlVQREFURSAiICsgbUVkaXRUYWJsZSArICIgU0VUICIpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIEZvciBlYWNoIGNvbHVtbiB2YWx1ZSB0aGF0IGhhcyBiZWVuIHVwZGF0ZWQKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYmluZGluZ3MgPSBuZXcgT2JqZWN0W3ZhbHVlcy5zaXplKCldOwotICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh2YWx1ZXNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA9IHZhbHVlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZChlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCI9PyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ3NbaV0gPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIiBXSEVSRSAiICsgbUNvbHVtbnNbbVJvd0lkQ29sdW1uSW5kZXhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnPScgKyByb3dJZCk7Ci0gICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoJzsnKTsKLSAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoc3FsLnRvU3RyaW5nKCksIGJpbmRpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLnJvd1VwZGF0ZWQobUVkaXRUYWJsZSwgcm93SWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtVXBkYXRlZFJvd3MuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExldCBhbnkgY2hhbmdlIG9ic2VydmVycyBrbm93IGFib3V0IHRoZSB1cGRhdGUKLSAgICAgICAgb25DaGFuZ2UodHJ1ZSk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSB2b2lkIGRlYWN0aXZhdGVDb21tb24oKSB7CiAgICAgICAgIGlmIChDb25maWcuTE9HVikgTG9nLnYoVEFHLCAiPDw8IFJlbGVhc2luZyBjdXJzb3IgIiArIHRoaXMpOwogICAgICAgICBtQ3Vyc29yU3RhdGUgPSAwOwpAQCAtNTAxLDkgKzM3NSwzMiBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewogICAgICAgICBzdXBlci5jbG9zZSgpOwotICAgICAgICBkZWFjdGl2YXRlQ29tbW9uKCk7Ci0gICAgICAgIG1RdWVyeS5jbG9zZSgpOwotICAgICAgICBtRHJpdmVyLmN1cnNvckNsb3NlZCgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGRlYWN0aXZhdGVDb21tb24oKTsKKyAgICAgICAgICAgIG1RdWVyeS5jbG9zZSgpOworICAgICAgICAgICAgbURyaXZlci5jdXJzb3JDbG9zZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3cgYSB3YXJuaW5nIGFnYWluc3QgdGhlIHVzZSBvZiByZXF1ZXJ5KCkgaWYgY2FsbGVkIG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICAgKiBUaGlzIHdhcm5pbmcgaXMgc2hvd24gcGVyIGRhdGFiYXNlIHBlciBwcm9jZXNzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3YXJuSWZVaVRocmVhZCgpIHsKKyAgICAgICAgaWYgKExvb3Blci5nZXRNYWluTG9vcGVyKCkgPT0gTG9vcGVyLm15TG9vcGVyKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBkYXRhYmFzZVBhdGggPSBnZXRRdWVyeSgpLm1EYXRhYmFzZS5nZXRQYXRoKCk7CisgICAgICAgICAgICAvLyBXZSBzaG93IHRoZSB3YXJuaW5nIG9uY2UgcGVyIGRhdGFiYXNlIGluIG9yZGVyIG5vdCB0byBzcGFtIGxvZ2NhdC4KKyAgICAgICAgICAgIGlmICghc0FscmVhZHlXYXJuZWQuY29udGFpbnNLZXkoZGF0YWJhc2VQYXRoKSkgeworICAgICAgICAgICAgICAgIHNBbHJlYWR5V2FybmVkLnB1dChkYXRhYmFzZVBhdGgsIHRydWUpOworICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IEFjdGl2aXR5VGhyZWFkLmN1cnJlbnRQYWNrYWdlTmFtZSgpOworICAgICAgICAgICAgICAgIFRocm93YWJsZSB0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAvLyBCRUdJTiBTVE9QU0hJUCByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lCisgICAgICAgICAgICAgICAgdCA9IG5ldyBSZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbihwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgLy8gRU5EIFNUT1BTSElQCisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2hvdWxkIG5vdCBhdHRlbXB0IHJlcXVlcnkgb24gbWFpbiAoVUkpIHRocmVhZDogYXBwID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSA9PSBudWxsID8gIid1bmtub3duJyIgOiBwYWNrYWdlTmFtZSwgdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTUxMSwyMCArNDA4LDMwIEBACiAgICAgICAgIGlmIChpc0Nsb3NlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KKyAgICAgICAgd2FybklmVWlUaHJlYWQoKTsKICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSAwOwogICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIHsKICAgICAgICAgICAgIHRpbWVTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICB9Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFN5bmNocm9uaXplIG9uIHRoZSBkYXRhYmFzZSBsb2NrIHRvIGVuc3VyZSB0aGF0IG1Db3VudCBtYXRjaGVzIHRoZQotICAgICAgICAgKiByZXN1bHRzIG9mIG1RdWVyeS5yZXF1ZXJ5KCkuCi0gICAgICAgICAqLwotICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotICAgICAgICB0cnkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1XaW5kb3cgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1XaW5kb3cuY2xlYXIoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Qb3MgPSAtMTsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVF1ZXJ5Lm1EYXRhYmFzZS5nZXREYXRhYmFzZUhhbmRsZShtUXVlcnkubVNxbCk7CisgICAgICAgICAgICBpZiAoIWRiLmVxdWFscyhtUXVlcnkubURhdGFiYXNlKSkgeworICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIG5lZWQgdG8gdXNlIGEgZGlmZmVyZW50IGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlLAorICAgICAgICAgICAgICAgIC8vIHJlLWNvbXBpbGUgdGhlIHF1ZXJ5CisgICAgICAgICAgICAgICAgZGIubG9jaygpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBvbGQgbVF1ZXJ5IG9iamVjdCBhbmQgb3BlbiBhIG5ldyBvbmUKKyAgICAgICAgICAgICAgICAgICAgbVF1ZXJ5LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIG1RdWVyeSA9IG5ldyBTUUxpdGVRdWVyeShkYiwgbVF1ZXJ5KTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBkYi51bmxvY2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBUaGlzIG9uZSB3aWxsIHJlY3JlYXRlIHRoZSB0ZW1wIHRhYmxlLCBhbmQgZ2V0IGl0cyBjb3VudAogICAgICAgICAgICAgbURyaXZlci5jdXJzb3JSZXF1ZXJpZWQodGhpcyk7CiAgICAgICAgICAgICBtQ291bnQgPSBOT19DT1VOVDsKQEAgLTUzNSw4ICs0NDIsNiBAQAogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBxdWVyeVRocmVhZFVubG9jaygpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKENvbmZpZy5MT0dWKSB7CkBAIC01ODQsMTQgKzQ4OSwxNCBAQAogICAgICAgICAgICAgaWYgKG1XaW5kb3cgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGludCBsZW4gPSBtUXVlcnkubVNxbC5sZW5ndGgoKTsKICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGaW5hbGl6aW5nIGEgQ3Vyc29yIHRoYXQgaGFzIG5vdCBiZWVuIGRlYWN0aXZhdGVkIG9yIGNsb3NlZC4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiZGF0YWJhc2UgPSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIsIHRhYmxlID0gIiArIG1FZGl0VGFibGUgKworICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFiYXNlID0gIiArIG1RdWVyeS5tRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiwgdGFibGUgPSAiICsgbUVkaXRUYWJsZSArCiAgICAgICAgICAgICAgICAgICAgICAgICAiLCBxdWVyeSA9ICIgKyBtUXVlcnkubVNxbC5zdWJzdHJpbmcoMCwgKGxlbiA+IDEwMCkgPyAxMDAgOiBsZW4pLAogICAgICAgICAgICAgICAgICAgICAgICAgbVN0YWNrVHJhY2UpOwogICAgICAgICAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgICAgICAgICAgU1FMaXRlRGVidWcubm90aWZ5QWN0aXZlQ3Vyc29yRmluYWxpemVkKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChDb25maWcuTE9HVikgewotICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJGaW5hbGl6aW5nIGN1cnNvciBvbiBkYXRhYmFzZSA9ICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiRmluYWxpemluZyBjdXJzb3Igb24gZGF0YWJhc2UgPSAiICsgbVF1ZXJ5Lm1EYXRhYmFzZS5nZXRQYXRoKCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIHRhYmxlID0gIiArIG1FZGl0VGFibGUgKyAiLCBxdWVyeSA9ICIgKyBtUXVlcnkubVNxbCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvckRyaXZlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvckRyaXZlci5qYXZhCmluZGV4IGVkYTFiNzguLmIzOTYzZjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JEcml2ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yRHJpdmVyLmphdmEKQEAgLTQwLDggKzQwLDYgQEAKIAogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBhIFNRTGl0ZUN1cnNvciB3aGVuIGl0IGlzIHJlcXVlcnllZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgY291bnQgdmFsdWUuCiAgICAgICovCiAgICAgdm9pZCBjdXJzb3JSZXF1ZXJpZWQoQ3Vyc29yIGN1cnNvcik7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlLmphdmEKaW5kZXggY2RjOWJiYi4uYjgzZDVhZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlLmphdmEKQEAgLTE2LDE2ICsxNiwxNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwogCi1pbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTWFwczsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFwcEdsb2JhbHM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGVidWcuRGJTdGF0czsKIGltcG9ydCBhbmRyb2lkLm9zLkRlYnVnOworaW1wb3J0IGFuZHJvaWQub3MuU3RhdEZzOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CkBAIC0zOCwxNSArMzgsMTQgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CkBAIC02Nyw3ICs2Niw3IEBACiAgKiBpcyB0aGUgVW5pY29kZSBDb2xsYXRpb24gQWxnb3JpdGhtIGFuZCBub3QgdGFpbG9yZWQgdG8gdGhlIGN1cnJlbnQgbG9jYWxlLgogICovCiBwdWJsaWMgY2xhc3MgU1FMaXRlRGF0YWJhc2UgZXh0ZW5kcyBTUUxpdGVDbG9zYWJsZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEYXRhYmFzZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTUUxpdGVEYXRhYmFzZSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RCX09QRVJBVElPTiA9IDUyMDAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9EQl9DT1JSVVBUID0gNzUwMDQ7CiAKQEAgLTE5Miw2ICsxOTEsMTEgQEAKICAgICAgKi8KICAgICBwcml2YXRlIFNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIgbVRyYW5zYWN0aW9uTGlzdGVuZXI7CiAKKyAgICAvKioKKyAgICAgKiB0aGlzIG1lbWJlciBpcyBzZXQgaWYge0BsaW5rICNleGVjU1FMKFN0cmluZyl9IGlzIHVzZWQgdG8gYmVnaW4gYW5kIGVuZCB0cmFuc2FjdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1UcmFuc2FjdGlvblVzaW5nRXhlY1NxbDsKKwogICAgIC8qKiBTeW5jaHJvbml6ZSBvbiB0aGlzIHdoZW4gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZSAqLwogICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50TG9jayBtTG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKHRydWUpOwogCkBAIC0yMzMsNDggKzIzNyw3OCBAQAogICAgIC8vIGxvY2sgYWNxdWlzdGlvbnMgb2YgdGhlIGRhdGFiYXNlLgogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfTE9DS19MT0dfUFJFRklYID0gIkdFVExPQ0s6IjsKIAotICAgIC8qKiBVc2VkIGJ5IG5hdGl2ZSBjb2RlLCBkbyBub3QgcmVuYW1lICovCi0gICAgLyogcGFja2FnZSAqLyBpbnQgbU5hdGl2ZUhhbmRsZSA9IDA7CisgICAgLyoqIFVzZWQgYnkgbmF0aXZlIGNvZGUsIGRvIG5vdCByZW5hbWUuIG1ha2UgaXQgdm9sYXRpbGUsIHNvIGl0IGlzIHRocmVhZC1zYWZlLiAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9sYXRpbGUgaW50IG1OYXRpdmVIYW5kbGUgPSAwOwogCi0gICAgLyoqIFVzZWQgdG8gbWFrZSB0ZW1wIHRhYmxlIG5hbWVzIHVuaXF1ZSAqLwotICAgIC8qIHBhY2thZ2UgKi8gaW50IG1UZW1wVGFibGVTZXF1ZW5jZSA9IDA7CisgICAgLyoqCisgICAgICogVGhlIHNpemUsIGluIGJ5dGVzLCBvZiBhIGJsb2NrIG9uICIvZGF0YSIuIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIFVuaXgKKyAgICAgKiBzdGF0ZnMuZl9ic2l6ZSBmaWVsZC4gbm90ZSB0aGF0IHRoaXMgZmllbGQgaXMgbGF6aWx5IGluaXRpYWxpemVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBzQmxvY2tTaXplID0gMDsKIAogICAgIC8qKiBUaGUgcGF0aCBmb3IgdGhlIGRhdGFiYXNlIGZpbGUgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtUGF0aDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGF0aDsKIAogICAgIC8qKiBUaGUgYW5vbnltaXplZCBwYXRoIGZvciB0aGUgZGF0YWJhc2UgZmlsZSBmb3IgbG9nZ2luZyBwdXJwb3NlcyAqLwogICAgIHByaXZhdGUgU3RyaW5nIG1QYXRoRm9yTG9ncyA9IG51bGw7ICAvLyBsYXppbHkgcG9wdWxhdGVkCiAKICAgICAvKiogVGhlIGZsYWdzIHBhc3NlZCB0byBvcGVuL2NyZWF0ZSAqLwotICAgIHByaXZhdGUgaW50IG1GbGFnczsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtRmxhZ3M7CiAKICAgICAvKiogVGhlIG9wdGlvbmFsIGZhY3RvcnkgdG8gdXNlIHdoZW4gY3JlYXRpbmcgbmV3IEN1cnNvcnMgKi8KLSAgICBwcml2YXRlIEN1cnNvckZhY3RvcnkgbUZhY3Rvcnk7CisgICAgcHJpdmF0ZSBmaW5hbCBDdXJzb3JGYWN0b3J5IG1GYWN0b3J5OwogCi0gICAgcHJpdmF0ZSBXZWFrSGFzaE1hcDxTUUxpdGVDbG9zYWJsZSwgT2JqZWN0PiBtUHJvZ3JhbXM7CisgICAgcHJpdmF0ZSBmaW5hbCBXZWFrSGFzaE1hcDxTUUxpdGVDbG9zYWJsZSwgT2JqZWN0PiBtUHJvZ3JhbXM7CiAKICAgICAvKioKLSAgICAgKiBmb3IgZWFjaCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBhIGNhY2hlIGlzIG1haW50YWluZWQgdG8gc3RvcmUKKyAgICAgKiBmb3IgZWFjaCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBhIExSVSBjYWNoZSBpcyBtYWludGFpbmVkIHRvIHN0b3JlCiAgICAgICogdGhlIGNvbXBpbGVkIHF1ZXJ5IHN0YXRlbWVudCBpZHMgcmV0dXJuZWQgYnkgc3FsaXRlIGRhdGFiYXNlLgotICAgICAqICAgICBrZXkgPSBzcWwgc3RhdGVtZW50IHdpdGggIj8iIGZvciBiaW5kIGFyZ3MKKyAgICAgKiAgICAga2V5ID0gU1FMIHN0YXRlbWVudCB3aXRoICI/IiBmb3IgYmluZCBhcmdzCiAgICAgICogICAgIHZhbHVlID0ge0BsaW5rIFNRTGl0ZUNvbXBpbGVkU3FsfQogICAgICAqIElmIGFuIGFwcGxpY2F0aW9uIG9wZW5zIHRoZSBkYXRhYmFzZSBhbmQga2VlcHMgaXQgb3BlbiBkdXJpbmcgaXRzIGVudGlyZSBsaWZlLCB0aGVuCi0gICAgICogdGhlcmUgd2lsbCBub3QgYmUgYW4gb3ZlcmhlYWQgb2YgY29tcGlsYXRpb24gb2Ygc3FsIHN0YXRlbWVudHMgYnkgc3FsaXRlLgorICAgICAqIHRoZXJlIHdpbGwgbm90IGJlIGFuIG92ZXJoZWFkIG9mIGNvbXBpbGF0aW9uIG9mIFNRTCBzdGF0ZW1lbnRzIGJ5IHNxbGl0ZS4KICAgICAgKgogICAgICAqIHdoeSBpcyB0aGlzIGNhY2hlIE5PVCBzdGF0aWM/IGJlY2F1c2Ugc3FsaXRlIGF0dGFjaGVzIGNvbXBpbGVkc3FsIHN0YXRlbWVudHMgdG8gdGhlCiAgICAgICogc3RydWN0IGNyZWF0ZWQgd2hlbiB7QGxpbmsgU1FMaXRlRGF0YWJhc2Ujb3BlbkRhdGFiYXNlKFN0cmluZywgQ3Vyc29yRmFjdG9yeSwgaW50KX0gaXMKICAgICAgKiBpbnZva2VkLgogICAgICAqCiAgICAgICogdGhpcyBjYWNoZSBoYXMgYW4gdXBwZXIgbGltaXQgb2YgbU1heFNxbENhY2hlU2l6ZSAoc2V0dGFibGUgYnkgY2FsbGluZyB0aGUgbWV0aG9kCi0gICAgICogKEBsaW5rIHNldE1heENhY2hlU2l6ZShpbnQpfSkuIGl0cyBkZWZhdWx0IGlzIDAgLSBpLmUuLCBubyBjYWNoaW5nIGJ5IGRlZmF1bHQgYmVjYXVzZQotICAgICAqIG1vc3Qgb2YgdGhlIGFwcHMgZG9uJ3QgdXNlICI/IiBzeW50YXggaW4gdGhlaXIgc3FsLCBjYWNoaW5nIGlzIG5vdCB1c2VmdWwgZm9yIHRoZW0uCisgICAgICogKEBsaW5rIHNldE1heFNxbENhY2hlU2l6ZShpbnQpfSkuCiAgICAgICovCi0gICAgLyogcGFja2FnZSAqLyBNYXA8U3RyaW5nLCBTUUxpdGVDb21waWxlZFNxbD4gbUNvbXBpbGVkUXVlcmllcyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIC8vIGRlZmF1bHQgc3RhdGVtZW50LWNhY2hlIHNpemUgcGVyIGRhdGFiYXNlIGNvbm5lY3Rpb24gKCA9IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MpCisgICAgcHJpdmF0ZSBpbnQgbU1heFNxbENhY2hlU2l6ZSA9IDI1OworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgTWFwPFN0cmluZywgU1FMaXRlQ29tcGlsZWRTcWw+IG1Db21waWxlZFF1ZXJpZXMgPQorICAgICAgICBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNRTGl0ZUNvbXBpbGVkU3FsPihtTWF4U3FsQ2FjaGVTaXplICsgMSwgMC43NWYsIHRydWUpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoTWFwLkVudHJ5PFN0cmluZywgU1FMaXRlQ29tcGlsZWRTcWw+IGVsZGVzdCkgeworICAgICAgICAgICAgICAgIC8vIGVsZGVzdCA9IGxlYXN0LXJlY2VudGx5IHVzZWQgZW50cnkKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCBuZWVkcyB0byBiZSByZW1vdmVkIHRvIGFjY29tbW9kYXRlIGEgbmV3IGVudHJ5LAorICAgICAgICAgICAgICAgIC8vICAgICBjbG9zZSB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9IHJlcHJlc2VudGVkIGJ5IHRoaXMgZW50cnksIGlmIG5vdCBpbiB1c2UKKyAgICAgICAgICAgICAgICAvLyAgICAgYW5kIHRoZW4gbGV0IGl0IGJlIHJlbW92ZWQgZnJvbSB0aGUgTWFwLgorICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhpcyBpcyBjYWxsZWQsIHRoZSBjYWxsZXIgbXVzdCBiZSB0cnlpbmcgdG8gYWRkIGEganVzdC1jb21waWxlZCBzdG10CisgICAgICAgICAgICAgICAgLy8gdG8gY2FjaGU7IGkuZS4sIGNhbGxlciBzaG91bGQgYWxyZWFkeSBoYXZlIGFjcXVpcmVkIGRhdGFiYXNlIGxvY2sgQU5ECisgICAgICAgICAgICAgICAgLy8gdGhlIGxvY2sgb24gbUNvbXBpbGVkUXVlcmllcy4gZG8gYXMgYXNzZXJ0IG9mIHRoZXNlIHR3byAyIGZhY3RzLgorICAgICAgICAgICAgICAgIHZlcmlmeUxvY2tPd25lcigpOworICAgICAgICAgICAgICAgIGlmICh0aGlzLnNpemUoKSA8PSBtTWF4U3FsQ2FjaGVTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlIGlzIG5vdCBmdWxsLiBub3RoaW5nIG5lZWRzIHRvIGJlIHJlbW92ZWQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBjYWNoZSBpcyBmdWxsLiBlbGRlc3Qgd2lsbCBiZSByZW1vdmVkLgorICAgICAgICAgICAgICAgIFNRTGl0ZUNvbXBpbGVkU3FsIGVudHJ5ID0gZWxkZXN0LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKCFlbnRyeS5pc0luVXNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9IGlzIG5vdCBpbiB1c2UuIHJlbGVhc2UgaXQuCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LnJlbGVhc2VTcWxTdGF0ZW1lbnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRydWUsIHNvIHRoYXQgdGhpcyBlbnRyeSBpcyByZW1vdmVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGNhbGxlci4KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKICAgICAvKioKLSAgICAgKiBAaGlkZQorICAgICAqIGFic29sdXRlIG1heCB2YWx1ZSB0aGF0IGNhbiBiZSBzZXQgYnkge0BsaW5rICNzZXRNYXhTcWxDYWNoZVNpemUoaW50KX0KKyAgICAgKiBzaXplIG9mIGVhY2ggcHJlcGFyZWQtc3RhdGVtZW50IGlzIGJldHdlZW4gMUsgLSA2SywgZGVwZW5kaW5nIG9uIHRoZSBjb21wbGV4aXR5IG9mIHRoZQorICAgICAqIFNRTCBzdGF0ZW1lbnQgJiBzY2hlbWEuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NRTF9DQUNIRV9TSVpFID0gMjUwOwotICAgIHByaXZhdGUgaW50IG1NYXhTcWxDYWNoZVNpemUgPSBNQVhfU1FMX0NBQ0hFX1NJWkU7IC8vIG1heCBjYWNoZSBzaXplIHBlciBEYXRhYmFzZSBpbnN0YW5jZQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9TUUxfQ0FDSEVfU0laRSA9IDEwMDsKICAgICBwcml2YXRlIGludCBtQ2FjaGVGdWxsV2FybmluZ3M7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9XQVJOSU5HU19PTl9DQUNIRVNJWkVfQ09ORElUSU9OID0gMTsKIApAQCAtMjgyLDQ1ICszMTYsNTkgQEAKICAgICBwcml2YXRlIGludCBtTnVtQ2FjaGVIaXRzOwogICAgIHByaXZhdGUgaW50IG1OdW1DYWNoZU1pc3NlczsKIAotICAgIC8qKiB0aGUgZm9sbG93aW5nIDIgbWVtYmVycyBtYWludGFpbiB0aGUgdGltZSB3aGVuIGEgZGF0YWJhc2UgaXMgb3BlbmVkIGFuZCBjbG9zZWQgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtVGltZU9wZW5lZCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVRpbWVDbG9zZWQgPSBudWxsOwotCiAgICAgLyoqIFVzZWQgdG8gZmluZCBvdXQgd2hlcmUgdGhpcyBvYmplY3Qgd2FzIGNyZWF0ZWQgaW4gY2FzZSBpdCBuZXZlciBnb3QgY2xvc2VkLiAqLwotICAgIHByaXZhdGUgVGhyb3dhYmxlIG1TdGFja1RyYWNlID0gbnVsbDsKKyAgICBwcml2YXRlIGZpbmFsIFRocm93YWJsZSBtU3RhY2tUcmFjZTsKIAogICAgIC8vIFN5c3RlbSBwcm9wZXJ0eSB0aGF0IGVuYWJsZXMgbG9nZ2luZyBvZiBzbG93IHF1ZXJpZXMuIFNwZWNpZnkgdGhlIHRocmVzaG9sZCBpbiBtcy4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1NMT1dfUVVFUklFU19QUk9QRVJUWSA9ICJkYi5sb2cuc2xvd19xdWVyeV90aHJlc2hvbGQiOwogICAgIHByaXZhdGUgZmluYWwgaW50IG1TbG93UXVlcnlUaHJlc2hvbGQ7CiAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY2xvc2FibGUKKyAgICAvKiogc3RvcmVzIHRoZSBsaXN0IG9mIHN0YXRlbWVudCBpZHMgdGhhdCBuZWVkIHRvIGJlIGZpbmFsaXplZCBieSBzcWxpdGUgKi8KKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJbnRlZ2VyPiBtQ2xvc2VkU3RhdGVtZW50SWRzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworCisgICAgLyoqIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUgdXNlZCB3aGVuIFNRTGl0ZSByZXR1cm5zIGFueSBvZiB0aGUgZm9sbG93aW5nIGVycm9ycworICAgICAqICAgIENvcnJ1cHRpb24KKyAgICAgKiAqLworICAgIHByaXZhdGUgZmluYWwgRGF0YWJhc2VFcnJvckhhbmRsZXIgbUVycm9ySGFuZGxlcjsKKworICAgIC8qKiBUaGUgRGF0YWJhc2UgY29ubmVjdGlvbiBwb29sIHtAbGluayBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sfS4KKyAgICAgKiBWaXNpYmlsaXR5IGlzIHBhY2thZ2UtcHJpdmF0ZSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gb3RoZXJ3aXNlLCBwcml2YXRlIHZpc2liaWxpdHkgaXMgZW5vdWdoLgogICAgICAqLwotICAgIHZvaWQgYWRkU1FMaXRlQ2xvc2FibGUoU1FMaXRlQ2xvc2FibGUgY2xvc2FibGUpIHsKLSAgICAgICAgbG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbVByb2dyYW1zLnB1dChjbG9zYWJsZSwgbnVsbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgIC8qIHBhY2thZ2UgKi8gdm9sYXRpbGUgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCBtQ29ubmVjdGlvblBvb2wgPSBudWxsOworCisgICAgLyoqIEVhY2ggZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUgaW4gdGhlIHBvb2wgaXMgYXNzaWduZWQgYSBudW1iZXIgMS4uTiwgd2hlcmUgTiBpcyB0aGUKKyAgICAgKiBzaXplIG9mIHRoZSBjb25uZWN0aW9uIHBvb2wuCisgICAgICogVGhlIG1haW4gY29ubmVjdGlvbiBoYW5kbGUgdG8gd2hpY2ggdGhlIHBvb2wgaXMgYXR0YWNoZWQgaXMgYXNzaWduZWQgYSB2YWx1ZSBvZiAwLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgc2hvcnQgbUNvbm5lY3Rpb25OdW07CisKKyAgICAvKiogb24gcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb25zLCB0aGlzIG1lbWJlciBwb2ludHMgdG8gdGhlIHBhcmVudCAoID0gbWFpbikKKyAgICAgKiBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZS4KKyAgICAgKiBwYWNrYWdlIHZpc2liaWxpdHkgb25seSBmb3IgdGVzdGluZyBwdXJwb3NlcworICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlRGF0YWJhc2UgbVBhcmVudENvbm5PYmogPSBudWxsOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTU9SWV9EQl9QQVRIID0gIjptZW1vcnk6IjsKKworICAgIC8qKiBzdG9yZXMgcmVmZXJlbmNlIHRvIGFsbCBkYXRhYmFzZXMgb3BlbmVkIGluIHRoZSBjdXJyZW50IHByb2Nlc3MuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0PFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+PiBtQWN0aXZlRGF0YWJhc2VzID0KKyAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8V2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4+KCk7CisKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTUUxpdGVDbG9zYWJsZShTUUxpdGVDbG9zYWJsZSBjbG9zYWJsZSkgeworICAgICAgICAvLyBtUHJvZ3JhbXMgaXMgcGVyIGluc3RhbmNlIG9mIFNRTGl0ZURhdGFiYXNlIGFuZCBpdCBkb2Vzbid0IGFjdHVhbGx5IHRvdWNoIHRoZSBkYXRhYmFzZQorICAgICAgICAvLyBpdHNlbGYuIHNvLCB0aGVyZSBpcyBubyBuZWVkIHRvIGxvY2soKS4KKyAgICAgICAgbVByb2dyYW1zLnB1dChjbG9zYWJsZSwgbnVsbCk7CiAgICAgfQogCi0gICAgdm9pZCByZW1vdmVTUUxpdGVDbG9zYWJsZShTUUxpdGVDbG9zYWJsZSBjbG9zYWJsZSkgewotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtUHJvZ3JhbXMucmVtb3ZlKGNsb3NhYmxlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHVubG9jaygpOwotICAgICAgICB9CisgICAgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlU1FMaXRlQ2xvc2FibGUoU1FMaXRlQ2xvc2FibGUgY2xvc2FibGUpIHsKKyAgICAgICAgbVByb2dyYW1zLnJlbW92ZShjbG9zYWJsZSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWQoKSB7CiAgICAgICAgIGlmIChpc09wZW4oKSkgewotICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgewotICAgICAgICAgICAgICAgIG1UaW1lQ2xvc2VkID0gZ2V0VGltZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGJjbG9zZSgpOworICAgICAgICAgICAgLy8gY2xvc2UgdGhlIGRhdGFiYXNlIHdoaWNoIHdpbGwgY2xvc2UgYWxsIHBlbmRpbmcgc3RhdGVtZW50cyB0byBiZSBmaW5hbGl6ZWQgYWxzbworICAgICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzUwLDE5ICszOTgsOCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtTG9ja2luZ0VuYWJsZWQgPSB0cnVlOwogCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIG9uQ29ycnVwdGlvbigpIHsKLSAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3ZpbmcgY29ycnVwdCBkYXRhYmFzZTogIiArIG1QYXRoKTsKICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVF9EQl9DT1JSVVBULCBtUGF0aCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBDbG9zZSB0aGUgZGF0YWJhc2UgKGlmIHdlIGNhbiksIHdoaWNoIHdpbGwgY2F1c2Ugc3Vic2VxdWVudCBvcGVyYXRpb25zIHRvIGZhaWwuCi0gICAgICAgICAgICBjbG9zZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gRGVsZXRlIHRoZSBjb3JydXB0IGZpbGUuICBEb24ndCByZS1jcmVhdGUgaXQgbm93IC0tIHRoYXQgd291bGQganVzdCBjb25mdXNlIHBlb3BsZQotICAgICAgICAgICAgLy8gLS0gYnV0IHRoZSBuZXh0IHRpbWUgc29tZW9uZSB0cmllcyB0byBvcGVuIGl0LCB0aGV5IGNhbiBzZXQgaXQgdXAgZnJvbSBzY3JhdGNoLgotICAgICAgICAgICAgaWYgKCFtUGF0aC5lcXVhbHNJZ25vcmVDYXNlKCI6bWVtb3J5IikpIHsKLSAgICAgICAgICAgICAgICAvLyBkZWxldGUgaXMgb25seSBmb3Igbm9uLW1lbW9yeSBkYXRhYmFzZSBmaWxlcwotICAgICAgICAgICAgICAgIG5ldyBGaWxlKG1QYXRoKS5kZWxldGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtRXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbih0aGlzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTM3NCw2ICs0MTEsNyBAQAogICAgICAqIEBzZWUgI3VubG9jaygpCiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIGxvY2soKSB7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIGlmICghbUxvY2tpbmdFbmFibGVkKSByZXR1cm47CiAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX0xPQ0tfVElNRV9UUkFDS0lORykgewpAQCAtMzk0LDYgKzQzMiw3IEBACiAgICAgICogQHNlZSAjdW5sb2NrRm9yY2VkKCkKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgbG9ja0ZvcmNlZCgpIHsKKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfTE9DS19USU1FX1RSQUNLSU5HKSB7CiAgICAgICAgICAgICBpZiAobUxvY2suZ2V0SG9sZENvdW50KCkgPT0gMSkgewpAQCAtNDYwLDExICs0OTksMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuIFdoZW4gdGhlIG91dGVyIHRyYW5zYWN0aW9uIGlzIGVuZGVkIGFsbCBvZgorICAgICAqIEJlZ2lucyBhIHRyYW5zYWN0aW9uIGluIEVYQ0xVU0lWRSBtb2RlLgorICAgICAqIDxwPgorICAgICAqIFRyYW5zYWN0aW9ucyBjYW4gYmUgbmVzdGVkLgorICAgICAqIFdoZW4gdGhlIG91dGVyIHRyYW5zYWN0aW9uIGlzIGVuZGVkIGFsbCBvZgogICAgICAqIHRoZSB3b3JrIGRvbmUgaW4gdGhhdCB0cmFuc2FjdGlvbiBhbmQgYWxsIG9mIHRoZSBuZXN0ZWQgdHJhbnNhY3Rpb25zIHdpbGwgYmUgY29tbWl0dGVkIG9yCiAgICAgICogcm9sbGVkIGJhY2suIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcm9sbGVkIGJhY2sgaWYgYW55IHRyYW5zYWN0aW9uIGlzIGVuZGVkIHdpdGhvdXQgYmVpbmcKICAgICAgKiBtYXJrZWQgYXMgY2xlYW4gKGJ5IGNhbGxpbmcgc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKS4gT3RoZXJ3aXNlIHRoZXkgd2lsbCBiZSBjb21taXR0ZWQuCi0gICAgICoKKyAgICAgKiA8L3A+CiAgICAgICogPHA+SGVyZSBpcyB0aGUgc3RhbmRhcmQgaWRpb20gZm9yIHRyYW5zYWN0aW9uczoKICAgICAgKgogICAgICAqIDxwcmU+CkBAIC00NzgsMTUgKzUyMCw0MiBAQAogICAgICAqIDwvcHJlPgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGJlZ2luVHJhbnNhY3Rpb24oKSB7Ci0gICAgICAgIGJlZ2luVHJhbnNhY3Rpb25XaXRoTGlzdGVuZXIobnVsbCAvKiB0cmFuc2FjdGlvblN0YXR1c0NhbGxiYWNrICovKTsKKyAgICAgICAgYmVnaW5UcmFuc2FjdGlvbihudWxsIC8qIHRyYW5zYWN0aW9uU3RhdHVzQ2FsbGJhY2sgKi8sIHRydWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEJlZ2lucyBhIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbnMgY2FuIGJlIG5lc3RlZC4gV2hlbiB0aGUgb3V0ZXIgdHJhbnNhY3Rpb24gaXMgZW5kZWQgYWxsIG9mCisgICAgICogQmVnaW5zIGEgdHJhbnNhY3Rpb24gaW4gSU1NRURJQVRFIG1vZGUuIFRyYW5zYWN0aW9ucyBjYW4gYmUgbmVzdGVkLiBXaGVuCisgICAgICogdGhlIG91dGVyIHRyYW5zYWN0aW9uIGlzIGVuZGVkIGFsbCBvZiB0aGUgd29yayBkb25lIGluIHRoYXQgdHJhbnNhY3Rpb24KKyAgICAgKiBhbmQgYWxsIG9mIHRoZSBuZXN0ZWQgdHJhbnNhY3Rpb25zIHdpbGwgYmUgY29tbWl0dGVkIG9yIHJvbGxlZCBiYWNrLiBUaGUKKyAgICAgKiBjaGFuZ2VzIHdpbGwgYmUgcm9sbGVkIGJhY2sgaWYgYW55IHRyYW5zYWN0aW9uIGlzIGVuZGVkIHdpdGhvdXQgYmVpbmcKKyAgICAgKiBtYXJrZWQgYXMgY2xlYW4gKGJ5IGNhbGxpbmcgc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKS4gT3RoZXJ3aXNlIHRoZXkKKyAgICAgKiB3aWxsIGJlIGNvbW1pdHRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBIZXJlIGlzIHRoZSBzdGFuZGFyZCBpZGlvbSBmb3IgdHJhbnNhY3Rpb25zOgorICAgICAqCisgICAgICogPHByZT4KKyAgICAgKiAgIGRiLmJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKTsKKyAgICAgKiAgIHRyeSB7CisgICAgICogICAgIC4uLgorICAgICAqICAgICBkYi5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgKiAgIH0gZmluYWxseSB7CisgICAgICogICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICogICB9CisgICAgICogPC9wcmU+CisgICAgICovCisgICAgcHVibGljIHZvaWQgYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpIHsKKyAgICAgICAgYmVnaW5UcmFuc2FjdGlvbihudWxsIC8qIHRyYW5zYWN0aW9uU3RhdHVzQ2FsbGJhY2sgKi8sIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbiBpbiBFWENMVVNJVkUgbW9kZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUcmFuc2FjdGlvbnMgY2FuIGJlIG5lc3RlZC4KKyAgICAgKiBXaGVuIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YKICAgICAgKiB0aGUgd29yayBkb25lIGluIHRoYXQgdHJhbnNhY3Rpb24gYW5kIGFsbCBvZiB0aGUgbmVzdGVkIHRyYW5zYWN0aW9ucyB3aWxsIGJlIGNvbW1pdHRlZCBvcgogICAgICAqIHJvbGxlZCBiYWNrLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJvbGxlZCBiYWNrIGlmIGFueSB0cmFuc2FjdGlvbiBpcyBlbmRlZCB3aXRob3V0IGJlaW5nCiAgICAgICogbWFya2VkIGFzIGNsZWFuIChieSBjYWxsaW5nIHNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCkuIE90aGVyd2lzZSB0aGV5IHdpbGwgYmUgY29tbWl0dGVkLgotICAgICAqCisgICAgICogPC9wPgogICAgICAqIDxwPkhlcmUgaXMgdGhlIHN0YW5kYXJkIGlkaW9tIGZvciB0cmFuc2FjdGlvbnM6CiAgICAgICoKICAgICAgKiA8cHJlPgpAQCAtNDk4LDE1ICs1NjcsNDggQEAKICAgICAgKiAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKTsKICAgICAgKiAgIH0KICAgICAgKiA8L3ByZT4KKyAgICAgKgogICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIHRoYXQgc2hvdWxkIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGJlZ2lucywKICAgICAgKiBjb21taXRzLCBvciBpcyByb2xsZWQgYmFjaywgZWl0aGVyIGV4cGxpY2l0bHkgb3IgYnkgYSBjYWxsIHRvCiAgICAgICoge0BsaW5rICN5aWVsZElmQ29udGVuZGVkU2FmZWx5fS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyKFNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIgdHJhbnNhY3Rpb25MaXN0ZW5lcikgeworICAgICAgICBiZWdpblRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uTGlzdGVuZXIsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJlZ2lucyBhIHRyYW5zYWN0aW9uIGluIElNTUVESUFURSBtb2RlLiBUcmFuc2FjdGlvbnMgY2FuIGJlIG5lc3RlZC4gV2hlbgorICAgICAqIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YgdGhlIHdvcmsgZG9uZSBpbiB0aGF0IHRyYW5zYWN0aW9uCisgICAgICogYW5kIGFsbCBvZiB0aGUgbmVzdGVkIHRyYW5zYWN0aW9ucyB3aWxsIGJlIGNvbW1pdHRlZCBvciByb2xsZWQgYmFjay4gVGhlCisgICAgICogY2hhbmdlcyB3aWxsIGJlIHJvbGxlZCBiYWNrIGlmIGFueSB0cmFuc2FjdGlvbiBpcyBlbmRlZCB3aXRob3V0IGJlaW5nCisgICAgICogbWFya2VkIGFzIGNsZWFuIChieSBjYWxsaW5nIHNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCkuIE90aGVyd2lzZSB0aGV5CisgICAgICogd2lsbCBiZSBjb21taXR0ZWQuCisgICAgICogPHA+CisgICAgICogSGVyZSBpcyB0aGUgc3RhbmRhcmQgaWRpb20gZm9yIHRyYW5zYWN0aW9uczoKKyAgICAgKgorICAgICAqIDxwcmU+CisgICAgICogICBkYi5iZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyTm9uRXhjbHVzaXZlKGxpc3RlbmVyKTsKKyAgICAgKiAgIHRyeSB7CisgICAgICogICAgIC4uLgorICAgICAqICAgICBkYi5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgKiAgIH0gZmluYWxseSB7CisgICAgICogICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICogICB9CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciB0aGF0IHNob3VsZCBiZSBub3RpZmllZCB3aGVuIHRoZQorICAgICAqICAgICAgICAgICAgdHJhbnNhY3Rpb24gYmVnaW5zLCBjb21taXRzLCBvciBpcyByb2xsZWQgYmFjaywgZWl0aGVyCisgICAgICogICAgICAgICAgICBleHBsaWNpdGx5IG9yIGJ5IGEgY2FsbCB0byB7QGxpbmsgI3lpZWxkSWZDb250ZW5kZWRTYWZlbHl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luVHJhbnNhY3Rpb25XaXRoTGlzdGVuZXJOb25FeGNsdXNpdmUoCisgICAgICAgICAgICBTUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIHRyYW5zYWN0aW9uTGlzdGVuZXIpIHsKKyAgICAgICAgYmVnaW5UcmFuc2FjdGlvbih0cmFuc2FjdGlvbkxpc3RlbmVyLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGJlZ2luVHJhbnNhY3Rpb24oU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciB0cmFuc2FjdGlvbkxpc3RlbmVyLAorICAgICAgICAgICAgYm9vbGVhbiBleGNsdXNpdmUpIHsKKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgbG9ja0ZvcmNlZCgpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9CiAgICAgICAgIGJvb2xlYW4gb2sgPSBmYWxzZTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIElmIHRoaXMgdGhyZWFkIGFscmVhZHkgaGFkIHRoZSBsb2NrIHRoZW4gZ2V0IG91dApAQCAtNTI0LDcgKzYyNiwxMSBAQAogCiAgICAgICAgICAgICAvLyBUaGlzIHRocmVhZCBkaWRuJ3QgYWxyZWFkeSBoYXZlIHRoZSBsb2NrLCBzbyBiZWdpbiBhIGRhdGFiYXNlCiAgICAgICAgICAgICAvLyB0cmFuc2FjdGlvbiBub3cuCi0gICAgICAgICAgICBleGVjU1FMKCJCRUdJTiBFWENMVVNJVkU7Iik7CisgICAgICAgICAgICBpZiAoZXhjbHVzaXZlICYmIG1Db25uZWN0aW9uUG9vbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXhlY1NRTCgiQkVHSU4gRVhDTFVTSVZFOyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleGVjU1FMKCJCRUdJTiBJTU1FRElBVEU7Iik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtVHJhbnNhY3Rpb25MaXN0ZW5lciA9IHRyYW5zYWN0aW9uTGlzdGVuZXI7CiAgICAgICAgICAgICBtVHJhbnNhY3Rpb25Jc1N1Y2Nlc3NmdWwgPSB0cnVlOwogICAgICAgICAgICAgbUlubmVyVHJhbnNhY3Rpb25Jc1N1Y2Nlc3NmdWwgPSBmYWxzZTsKQEAgLTU1MSwxMiArNjU3LDcgQEAKICAgICAgKiBhcmUgY29tbWl0dGVkIGFuZCByb2xsZWQgYmFjay4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBlbmRUcmFuc2FjdGlvbigpIHsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1Mb2NrLmlzSGVsZEJ5Q3VycmVudFRocmVhZCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJubyB0cmFuc2FjdGlvbiBwZW5kaW5nIik7Ci0gICAgICAgIH0KKyAgICAgICAgdmVyaWZ5TG9ja093bmVyKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpZiAobUlubmVyVHJhbnNhY3Rpb25Jc1N1Y2Nlc3NmdWwpIHsKICAgICAgICAgICAgICAgICBtSW5uZXJUcmFuc2FjdGlvbklzU3VjY2Vzc2Z1bCA9IGZhbHNlOwpAQCAtNTgxLDYgKzY4MiwxOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1UcmFuc2FjdGlvbklzU3VjY2Vzc2Z1bCkgewogICAgICAgICAgICAgICAgIGV4ZWNTUUwoQ09NTUlUX1NRTCk7CisgICAgICAgICAgICAgICAgLy8gaWYgd3JpdGUtYWhlYWQgbG9nZ2luZyBpcyB1c2VkLCB3ZSBoYXZlIHRvIHRha2UgY2FyZSBvZiBjaGVja3BvaW50LgorICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBhcHBsaWNhdGlvbnMgYmUgZ2l2ZW4gdGhlIGZsZXhpYmlsaXR5IG9mIGNob29zaW5nIHdoZW4gdG8KKyAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGNoZWNrcG9pbnQ/CisgICAgICAgICAgICAgICAgLy8gZm9yIG5vdywgZG8gY2hlY2twb2ludCBhZnRlciBldmVyeSBDT01NSVQgYmVjYXVzZSB0aGF0IGlzIHRoZSBmYXN0ZXN0CisgICAgICAgICAgICAgICAgLy8gd2F5IHRvIGd1YXJhbnRlZSB0aGF0IHJlYWRlcnMgd2lsbCBzZWUgbGF0ZXN0IGRhdGEuCisgICAgICAgICAgICAgICAgLy8gYnV0IHRoaXMgaXMgdGhlIHNsb3dlc3Qgd2F5IHRvIHJ1biBzcWxpdGUgd2l0aCBpbiB3cml0ZS1haGVhZCBsb2dnaW5nIG1vZGUuCisgICAgICAgICAgICAgICAgaWYgKHRoaXMubUNvbm5lY3Rpb25Qb29sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhlY1NRTCgiUFJBR01BIHdhbF9jaGVja3BvaW50OyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX1NUQVRFTUVOVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlBSQUdNQSB3YWxfQ2hlY2twb2ludCBkb25lIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIGV4ZWNTUUwoIlJPTExCQUNLOyIpOwpAQCAtNjE0LDkgKzcyNyw3IEBACiAgICAgICogdHJhbnNhY3Rpb24gaXMgYWxyZWFkeSBtYXJrZWQgYXMgc3VjY2Vzc2Z1bC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKSB7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgaWYgKCFtTG9jay5pc0hlbGRCeUN1cnJlbnRUaHJlYWQoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm8gdHJhbnNhY3Rpb24gcGVuZGluZyIpOwogICAgICAgICB9CkBAIC02MzEsNyArNzQyLDUwIEBACiAgICAgICogcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSB0cmFuc2FjdGlvbiBwZW5kaW5nCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaW5UcmFuc2FjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1Mb2NrLmdldEhvbGRDb3VudCgpID4gMDsKKyAgICAgICAgcmV0dXJuIG1Mb2NrLmdldEhvbGRDb3VudCgpID4gMCB8fCBtVHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWw7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRUcmFuc2FjdGlvblVzaW5nRXhlY1NxbEZsYWcoKSB7CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgImZvdW5kIGV4ZWNTUUwoJ2JlZ2luIHRyYW5zYWN0aW9uJykiKTsKKyAgICAgICAgfQorICAgICAgICBtVHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWwgPSB0cnVlOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIHZvaWQgcmVzZXRUcmFuc2FjdGlvblVzaW5nRXhlY1NxbEZsYWcoKSB7CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIGlmIChtVHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWwpIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJmb3VuZCBleGVjU1FMKCdjb21taXQgb3IgZW5kIG9yIHJvbGxiYWNrJykiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtVHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWwgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNhbGxlciBpcyBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24sIGlmIGFueS4KKyAgICAgKiA8cD4KKyAgICAgKiBDYWxsZXIgaXMgcGFydCBvZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpZiBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlCisgICAgICogPG9sPgorICAgICAqICAgPGxpPklmIHRyYW5zYWN0aW9uIGlzIHN0YXJ0ZWQgYnkgY2FsbGluZyBiZWdpblRyYW5zYWN0aW9uKCkgbWV0aG9kcyBBTkQgaWYgdGhlIGNhbGxlciBpcworICAgICAqICAgaW4gdGhlIHNhbWUgdGhyZWFkIGFzIHRoZSB0aHJlYWQgdGhhdCBzdGFydGVkIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKiAgIDwvbGk+CisgICAgICogICA8bGk+SWYgdGhlIHRyYW5zYWN0aW9uIGlzIHN0YXJ0ZWQgYnkgY2FsbGluZyB7QGxpbmsgI2V4ZWNTUUwoU3RyaW5nKX0gbGlrZSB0aGlzOgorICAgICAqICAgZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKS4gSW4gdGhpcyBjYXNlLCBldmVyeSB0aHJlYWQgaW4gdGhlIHByb2Nlc3MgaXMgY29uc2lkZXJlZAorICAgICAqICAgcGFydCBvZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi48L2xpPgorICAgICAqIDwvb2w+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNhbGxlciBpcyBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24sIGlmIGFueS4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCBib29sZWFuIGFtSUluVHJhbnNhY3Rpb24oKSB7CisgICAgICAgIC8vIGFsd2F5cyBkbyB0aGlzIHRlc3Qgb24gdGhlIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbiAtIE5PVCBvbiBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgICAvLyBzaW5jZSB0cmFuc2FjdGlvbnMgYWx3YXlzIG9jY3VyIG9uIHRoZSBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb25zIG9ubHkuCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gKGlzUG9vbGVkQ29ubmVjdGlvbigpKSA/IG1QYXJlbnRDb25uT2JqIDogdGhpczsKKyAgICAgICAgYm9vbGVhbiBiID0gKCFkYi5pblRyYW5zYWN0aW9uKCkpID8gZmFsc2UgOgorICAgICAgICAgICAgICAgIGRiLm1UcmFuc2FjdGlvblVzaW5nRXhlY1NxbCB8fCBkYi5tTG9jay5pc0hlbGRCeUN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiYW1JaW5UcmFuc2FjdGlvbjogIiArIGIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzM1LDU0ICs4ODksMTIgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgLyoqIE1hcHMgdGFibGUgbmFtZXMgdG8gaW5mbyBhYm91dCB3aGF0IHRvIHdoaWNoIF9zeW5jX3RpbWUgY29sdW1uIHRvIHNldAotICAgICAqIHRvIE5VTEwgb24gYW4gdXBkYXRlLiBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydCBzeW5jaW5nLiAqLwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3luY1VwZGF0ZUluZm8+IG1TeW5jVXBkYXRlSW5mbyA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIFN5bmNVcGRhdGVJbmZvPigpOwotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0U3luY2VkVGFibGVzKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobVN5bmNVcGRhdGVJbmZvKSB7Ci0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiB0YWJsZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHRhYmxlIDogbVN5bmNVcGRhdGVJbmZvLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgU3luY1VwZGF0ZUluZm8gaW5mbyA9IG1TeW5jVXBkYXRlSW5mby5nZXQodGFibGUpOwotICAgICAgICAgICAgICAgIGlmIChpbmZvLmRlbGV0ZWRUYWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhYmxlcy5wdXQodGFibGUsIGluZm8uZGVsZXRlZFRhYmxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGFibGVzOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqCi0gICAgICogSW50ZXJuYWwgY2xhc3MgdXNlZCB0byBrZWVwIHRyYWNrIHdoYXQgbmVlZHMgdG8gYmUgbWFya2VkIGFzIGNoYW5nZWQKLSAgICAgKiB3aGVuIGFuIHVwZGF0ZSBvY2N1cnMuIFRoaXMgaXMgdXNlZCBmb3Igc3luY2luZywgc28gdGhlIHN5bmMgZW5naW5lCi0gICAgICoga25vd3Mgd2hhdCBkYXRhIGhhcyBiZWVuIHVwZGF0ZWQgbG9jYWxseS4KKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBubyBsb25nZXIgc2VydmVzIGFueSB1c2VmdWwgcHVycG9zZSBhbmQgaGFzIGJlZW4gZGVwcmVjYXRlZC4KICAgICAgKi8KLSAgICBzdGF0aWMgcHJpdmF0ZSBjbGFzcyBTeW5jVXBkYXRlSW5mbyB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIHRoZSBTeW5jVXBkYXRlSW5mbyBjbGFzcy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG1hc3RlclRhYmxlIFRoZSB0YWJsZSB0byBzZXQgX3N5bmNfdGltZSB0byBOVUxMIGluCi0gICAgICAgICAqIEBwYXJhbSBkZWxldGVkVGFibGUgVGhlIGRlbGV0ZWQgdGFibGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUKLSAgICAgICAgICogICAgICAgICAgbWFzdGVyIHRhYmxlCi0gICAgICAgICAqIEBwYXJhbSBmb3JlaWduS2V5IFRoZSBrZXkgdGhhdCByZWZlcnMgdG8gdGhlIHByaW1hcnkga2V5IGluIHRhYmxlCi0gICAgICAgICAqLwotICAgICAgICBTeW5jVXBkYXRlSW5mbyhTdHJpbmcgbWFzdGVyVGFibGUsIFN0cmluZyBkZWxldGVkVGFibGUsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGZvcmVpZ25LZXkpIHsKLSAgICAgICAgICAgIHRoaXMubWFzdGVyVGFibGUgPSBtYXN0ZXJUYWJsZTsKLSAgICAgICAgICAgIHRoaXMuZGVsZXRlZFRhYmxlID0gZGVsZXRlZFRhYmxlOwotICAgICAgICAgICAgdGhpcy5mb3JlaWduS2V5ID0gZm9yZWlnbktleTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBUaGUgdGFibGUgY29udGFpbmluZyB0aGUgX3N5bmNfdGltZSBjb2x1bW4gKi8KLSAgICAgICAgU3RyaW5nIG1hc3RlclRhYmxlOwotCi0gICAgICAgIC8qKiBUaGUgZGVsZXRlZCB0YWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBtYXN0ZXIgdGFibGUgKi8KLSAgICAgICAgU3RyaW5nIGRlbGV0ZWRUYWJsZTsKLQotICAgICAgICAvKiogVGhlIGtleSBpbiB0aGUgbG9jYWwgdGFibGUgdGhlIHJvdyBpbiB0YWJsZS4gSXQgbWF5IGJlIF9pZCwgaWYgdGFibGUKLSAgICAgICAgICogaXMgdGhlIGxvY2FsIHRhYmxlLiAqLwotICAgICAgICBTdHJpbmcgZm9yZWlnbktleTsKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFN5bmNlZFRhYmxlcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigwKTsKICAgICB9CiAKICAgICAvKioKQEAgLTgxNCwzMCArOTI2LDgwIEBACiAgICAgICogQHRocm93cyBTUUxpdGVFeGNlcHRpb24gaWYgdGhlIGRhdGFiYXNlIGNhbm5vdCBiZSBvcGVuZWQKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFNRTGl0ZURhdGFiYXNlIG9wZW5EYXRhYmFzZShTdHJpbmcgcGF0aCwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgU1FMaXRlRGF0YWJhc2Ugc3FsaXRlRGF0YWJhc2UgPSBudWxsOworICAgICAgICByZXR1cm4gb3BlbkRhdGFiYXNlKHBhdGgsIGZhY3RvcnksIGZsYWdzLCBuZXcgRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIGRhdGFiYXNlIGFjY29yZGluZyB0byB0aGUgZmxhZ3Mge0BsaW5rICNPUEVOX1JFQURXUklURX0KKyAgICAgKiB7QGxpbmsgI09QRU5fUkVBRE9OTFl9IHtAbGluayAjQ1JFQVRFX0lGX05FQ0VTU0FSWX0gYW5kL29yIHtAbGluayAjTk9fTE9DQUxJWkVEX0NPTExBVE9SU30uCisgICAgICoKKyAgICAgKiA8cD5TZXRzIHRoZSBsb2NhbGUgb2YgdGhlIGRhdGFiYXNlIHRvIHRoZSAgdGhlIHN5c3RlbSdzIGN1cnJlbnQgbG9jYWxlLgorICAgICAqIENhbGwge0BsaW5rICNzZXRMb2NhbGV9IGlmIHlvdSB3b3VsZCBsaWtlIHNvbWV0aGluZyBlbHNlLjwvcD4KKyAgICAgKgorICAgICAqIDxwPkFjY2VwdHMgaW5wdXQgcGFyYW06IGEgY29uY3JldGUgaW5zdGFuY2Ugb2Yge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBiZQorICAgICAqIHVzZWQgdG8gaGFuZGxlIGNvcnJ1cHRpb24gd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZSBjb3JydXB0aW9uLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIHRvIGRhdGFiYXNlIGZpbGUgdG8gb3BlbiBhbmQvb3IgY3JlYXRlCisgICAgICogQHBhcmFtIGZhY3RvcnkgYW4gb3B0aW9uYWwgZmFjdG9yeSBjbGFzcyB0aGF0IGlzIGNhbGxlZCB0byBpbnN0YW50aWF0ZSBhCisgICAgICogICAgICAgICAgICBjdXJzb3Igd2hlbiBxdWVyeSBpcyBjYWxsZWQsIG9yIG51bGwgZm9yIGRlZmF1bHQKKyAgICAgKiBAcGFyYW0gZmxhZ3MgdG8gY29udHJvbCBkYXRhYmFzZSBhY2Nlc3MgbW9kZQorICAgICAqIEBwYXJhbSBlcnJvckhhbmRsZXIgdGhlIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gb2JqIHRvIGJlIHVzZWQgdG8gaGFuZGxlIGNvcnJ1cHRpb24KKyAgICAgKiB3aGVuIHNxbGl0ZSByZXBvcnRzIGRhdGFiYXNlIGNvcnJ1cHRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBvcGVuZWQgZGF0YWJhc2UKKyAgICAgKiBAdGhyb3dzIFNRTGl0ZUV4Y2VwdGlvbiBpZiB0aGUgZGF0YWJhc2UgY2Fubm90IGJlIG9wZW5lZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU1FMaXRlRGF0YWJhc2Ugb3BlbkRhdGFiYXNlKFN0cmluZyBwYXRoLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCBmbGFncywKKyAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgeworICAgICAgICBTUUxpdGVEYXRhYmFzZSBzcWxpdGVEYXRhYmFzZSA9IG9wZW5EYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncywgZXJyb3JIYW5kbGVyLAorICAgICAgICAgICAgICAgIChzaG9ydCkgMCAvKiB0aGUgbWFpbiBjb25uZWN0aW9uIGhhbmRsZSAqLyk7CisKKyAgICAgICAgLy8gc2V0IHNxbGl0ZSBwYWdlc2l6ZSB0byBtQmxvY2tTaXplCisgICAgICAgIGlmIChzQmxvY2tTaXplID09IDApIHsKKyAgICAgICAgICAgIC8vIFRPRE86ICIvZGF0YSIgc2hvdWxkIGJlIGEgc3RhdGljIGZpbmFsIFN0cmluZyBjb25zdGFudCBzb21ld2hlcmUuIGl0IGlzIGhhcmRjb2RlZAorICAgICAgICAgICAgLy8gaW4gc2V2ZXJhbCBwbGFjZXMgcmlnaHQgbm93LgorICAgICAgICAgICAgc0Jsb2NrU2l6ZSA9IG5ldyBTdGF0RnMoIi9kYXRhIikuZ2V0QmxvY2tTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgc3FsaXRlRGF0YWJhc2Uuc2V0UGFnZVNpemUoc0Jsb2NrU2l6ZSk7CisgICAgICAgIC8vU1RPUFNISVAgLSB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lCisgICAgICAgIC8vc3FsaXRlRGF0YWJhc2Uuc2V0Sm91cm5hbE1vZGUocGF0aCwgIlRSVU5DQVRFIik7CisgICAgICAgIC8vIFNUT1BTSElQIHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmVzCisgICAgICAgIGlmICghcGF0aC5lcXVhbHNJZ25vcmVDYXNlKE1FTU9SWV9EQl9QQVRIKSkgeworICAgICAgICAgICAgc3FsaXRlRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBFTkQgU1RPUFNISVAKKworICAgICAgICAvLyBhZGQgdGhpcyBkYXRhYmFzZSB0byB0aGUgbGlzdCBvZiBkYXRhYmFzZXMgb3BlbmVkIGluIHRoaXMgcHJvY2VzcworICAgICAgICBzeW5jaHJvbml6ZWQobUFjdGl2ZURhdGFiYXNlcykgeworICAgICAgICAgICAgbUFjdGl2ZURhdGFiYXNlcy5hZGQobmV3IFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+KHNxbGl0ZURhdGFiYXNlKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNxbGl0ZURhdGFiYXNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFNRTGl0ZURhdGFiYXNlIG9wZW5EYXRhYmFzZShTdHJpbmcgcGF0aCwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgZmxhZ3MsCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIsIHNob3J0IGNvbm5lY3Rpb25OdW0pIHsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBuZXcgU1FMaXRlRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgZmxhZ3MsIGVycm9ySGFuZGxlciwgY29ubmVjdGlvbk51bSk7CiAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAib3BlbmluZyB0aGUgZGIgOiAiICsgcGF0aCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBPcGVuIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgIHNxbGl0ZURhdGFiYXNlID0gbmV3IFNRTGl0ZURhdGFiYXNlKHBhdGgsIGZhY3RvcnksIGZsYWdzKTsKKyAgICAgICAgICAgIGRiLmRib3BlbihwYXRoLCBmbGFncyk7CisgICAgICAgICAgICBkYi5zZXRMb2NhbGUoTG9jYWxlLmdldERlZmF1bHQoKSk7CiAgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX1NUQVRFTUVOVFMpIHsKLSAgICAgICAgICAgICAgICBzcWxpdGVEYXRhYmFzZS5lbmFibGVTcWxUcmFjaW5nKHBhdGgpOworICAgICAgICAgICAgICAgIGRiLmVuYWJsZVNxbFRyYWNpbmcocGF0aCwgY29ubmVjdGlvbk51bSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX1RJTUUpIHsKLSAgICAgICAgICAgICAgICBzcWxpdGVEYXRhYmFzZS5lbmFibGVTcWxQcm9maWxpbmcocGF0aCk7CisgICAgICAgICAgICAgICAgZGIuZW5hYmxlU3FsUHJvZmlsaW5nKHBhdGgsIGNvbm5lY3Rpb25OdW0pOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRiOwogICAgICAgICB9IGNhdGNoIChTUUxpdGVEYXRhYmFzZUNvcnJ1cHRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVHJ5IHRvIHJlY292ZXIgZnJvbSB0aGlzLCBpZiB3ZSBjYW4uCi0gICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgZG8gdGhpcyBmb3Igb3RoZXIgb3BlbiBmYWlsdXJlcz8KLSAgICAgICAgICAgIExvZy5lKFRBRywgIkRlbGV0aW5nIGFuZCByZS1jcmVhdGluZyBjb3JydXB0IGRhdGFiYXNlICIgKyBwYXRoLCBlKTsKLSAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRfREJfQ09SUlVQVCwgcGF0aCk7Ci0gICAgICAgICAgICBpZiAoIXBhdGguZXF1YWxzSWdub3JlQ2FzZSgiOm1lbW9yeSIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZGVsZXRlIGlzIG9ubHkgZm9yIG5vbi1tZW1vcnkgZGF0YWJhc2UgZmlsZXMKLSAgICAgICAgICAgICAgICBuZXcgRmlsZShwYXRoKS5kZWxldGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNxbGl0ZURhdGFiYXNlID0gbmV3IFNRTGl0ZURhdGFiYXNlKHBhdGgsIGZhY3RvcnksIGZsYWdzKTsKKyAgICAgICAgICAgIGRiLm1FcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiKTsKKyAgICAgICAgICAgIHJldHVybiBTUUxpdGVEYXRhYmFzZS5vcGVuRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgZmxhZ3MsIGVycm9ySGFuZGxlcik7CisgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gb3BlbiB0aGUgZGF0YWJhc2UuIGNsb3NpbmcgaXQuIiwgZSk7CisgICAgICAgICAgICBkYi5jbG9zZSgpOworICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgfQotICAgICAgICBBY3RpdmVEYXRhYmFzZXMuZ2V0SW5zdGFuY2UoKS5tQWN0aXZlRGF0YWJhc2VzLmFkZCgKLSAgICAgICAgICAgICAgICBuZXcgV2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4oc3FsaXRlRGF0YWJhc2UpKTsKLSAgICAgICAgcmV0dXJuIHNxbGl0ZURhdGFiYXNlOwogICAgIH0KIAogICAgIC8qKgpAQCAtODU1LDYgKzEwMTcsMjUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIG9wZW5EYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBDUkVBVEVfSUZfTkVDRVNTQVJZLCBlcnJvckhhbmRsZXIpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIHBhdGgsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwKKyAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgeworICAgICAgICByZXR1cm4gb3BlbkRhdGFiYXNlKHBhdGgsIGZhY3RvcnksIENSRUFURV9JRl9ORUNFU1NBUlksIGVycm9ySGFuZGxlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEpvdXJuYWxNb2RlKGZpbmFsIFN0cmluZyBkYlBhdGgsIGZpbmFsIFN0cmluZyBtb2RlKSB7CisgICAgICAgIC8vIGpvdXJuYWwgbW9kZSBjYW4gYmUgc2V0IG9ubHkgZm9yIG5vbi1tZW1vcnkgZGF0YWJhc2VzCisgICAgICAgIGlmICghZGJQYXRoLmVxdWFsc0lnbm9yZUNhc2UoTUVNT1JZX0RCX1BBVEgpKSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IERhdGFiYXNlVXRpbHMuc3RyaW5nRm9yUXVlcnkodGhpcywgIlBSQUdNQSBqb3VybmFsX21vZGU9IiArIG1vZGUsIG51bGwpOworICAgICAgICAgICAgaWYgKCFzLmVxdWFsc0lnbm9yZUNhc2UobW9kZSkpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJzZXR0aW5nIGpvdXJuYWxfbW9kZSB0byAiICsgbW9kZSArICIgZmFpbGVkIGZvciBkYjogIiArIGRiUGF0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAiIChvbiBwcmFnbWEgc2V0IGpvdXJuYWxfbW9kZSwgc3FsaXRlIHJldHVybmVkOiIgKyBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIENyZWF0ZSBhIG1lbW9yeSBiYWNrZWQgU1FMaXRlIGRhdGFiYXNlLiAgSXRzIGNvbnRlbnRzIHdpbGwgYmUgZGVzdHJveWVkCiAgICAgICogd2hlbiB0aGUgZGF0YWJhc2UgaXMgY2xvc2VkLgogICAgICAqCkBAIC04NjcsNyArMTA0OCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTUUxpdGVEYXRhYmFzZSBjcmVhdGUoQ3Vyc29yRmFjdG9yeSBmYWN0b3J5KSB7CiAgICAgICAgIC8vIFRoaXMgaXMgYSBtYWdpYyBzdHJpbmcgd2l0aCBzcGVjaWFsIG1lYW5pbmcgZm9yIFNRTGl0ZS4KLSAgICAgICAgcmV0dXJuIG9wZW5EYXRhYmFzZSgiOm1lbW9yeToiLCBmYWN0b3J5LCBDUkVBVEVfSUZfTkVDRVNTQVJZKTsKKyAgICAgICAgcmV0dXJuIG9wZW5EYXRhYmFzZShNRU1PUllfREJfUEFUSCwgZmFjdG9yeSwgQ1JFQVRFX0lGX05FQ0VTU0FSWSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NzcsMTggKzEwNTgsMzEgQEAKICAgICAgICAgaWYgKCFpc09wZW4oKSkgewogICAgICAgICAgICAgcmV0dXJuOyAvLyBhbHJlYWR5IGNsb3NlZAogICAgICAgICB9CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgImNsb3NpbmcgZGI6ICIgKyBtUGF0aCArICIgKGNvbm5lY3Rpb24gIyAiICsgbUNvbm5lY3Rpb25OdW0pOworICAgICAgICB9CiAgICAgICAgIGxvY2soKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGNsb3NlQ2xvc2FibGUoKTsKKyAgICAgICAgICAgIC8vIGZpbmFsaXplIEFMTCBzdGF0ZW1lbnRzIHF1ZXVlZCB1cCBzbyBmYXIKKyAgICAgICAgICAgIGNsb3NlUGVuZGluZ1N0YXRlbWVudHMoKTsKKyAgICAgICAgICAgIHJlbGVhc2VDdXN0b21GdW5jdGlvbnMoKTsKICAgICAgICAgICAgIC8vIGNsb3NlIHRoaXMgZGF0YWJhc2UgaW5zdGFuY2UgLSByZWdhcmRsZXNzIG9mIGl0cyByZWZlcmVuY2UgY291bnQgdmFsdWUKLSAgICAgICAgICAgIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkKCk7CisgICAgICAgICAgICBkYmNsb3NlKCk7CisgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25Qb29sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBtQ29ubmVjdGlvblBvb2wgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCBtQ29ubmVjdGlvblBvb2wudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uUG9vbC5jbG9zZSgpOworICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgdW5sb2NrKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2xvc2VDbG9zYWJsZSgpIHsKLSAgICAgICAgLyogZGVhbGxvY2F0ZSBhbGwgY29tcGlsZWQgc3FsIHN0YXRlbWVudCBvYmplY3RzIGZyb20gbUNvbXBpbGVkUXVlcmllcyBjYWNoZS4KKyAgICAgICAgLyogZGVhbGxvY2F0ZSBhbGwgY29tcGlsZWQgU1FMIHN0YXRlbWVudCBvYmplY3RzIGZyb20gbUNvbXBpbGVkUXVlcmllcyBjYWNoZS4KICAgICAgICAgICogdGhpcyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgZGUtcmVmZXJlbmNpbmcgYWxsIHtAbGluayBTUUxpdGVDbG9zYWJsZX0gb2JqZWN0cwogICAgICAgICAgKiBmcm9tIHRoaXMgZGF0YWJhc2Ugb2JqZWN0IGJlY2F1c2UgY2FsbGluZwogICAgICAgICAgKiB7QGxpbmsgU1FMaXRlQ2xvc2FibGUjb25BbGxSZWZlcmVuY2VzUmVsZWFzZWRGcm9tQ29udGFpbmVyKCl9IGNvdWxkIGNhdXNlIHRoZSBkYXRhYmFzZQpAQCAtOTEzLDI0ICsxMTA3LDYwIEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBkYmNsb3NlKCk7CiAKICAgICAvKioKKyAgICAgKiBBIGNhbGxiYWNrIGludGVyZmFjZSBmb3IgYSBjdXN0b20gc3FsaXRlMyBmdW5jdGlvbi4KKyAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNhbGxlZCBmcm9tCisgICAgICogc3FsaXRlMyBkYXRhYmFzZSB0cmlnZ2Vycy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgQ3VzdG9tRnVuY3Rpb24geworICAgICAgICBwdWJsaWMgdm9pZCBjYWxsYmFjayhTdHJpbmdbXSBhcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBDdXN0b21GdW5jdGlvbiBjYWxsYmFjayBhcyBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNhbGxlZCBmcm9tCisgICAgICogc3FsaXRlMyBkYXRhYmFzZSB0cmlnZ2Vycy4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgc3FsaXRlMyBmdW5jdGlvbgorICAgICAqIEBwYXJhbSBudW1BcmdzIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGZvciB0aGUgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gZnVuY3Rpb24gY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ3VzdG9tRnVuY3Rpb24oU3RyaW5nIG5hbWUsIGludCBudW1BcmdzLCBDdXN0b21GdW5jdGlvbiBmdW5jdGlvbikgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1DdXN0b21GdW5jdGlvbnMpIHsKKyAgICAgICAgICAgIGludCByZWYgPSBuYXRpdmVfYWRkQ3VzdG9tRnVuY3Rpb24obmFtZSwgbnVtQXJncywgZnVuY3Rpb24pOworICAgICAgICAgICAgaWYgKHJlZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gc2F2ZSBhIHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24gZm9yIGNsZWFudXAgbGF0ZXIKKyAgICAgICAgICAgICAgICBtQ3VzdG9tRnVuY3Rpb25zLmFkZChuZXcgSW50ZWdlcihyZWYpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNRTGl0ZUV4Y2VwdGlvbigiZmFpbGVkIHRvIGFkZCBjdXN0b20gZnVuY3Rpb24gIiArIG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VDdXN0b21GdW5jdGlvbnMoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUN1c3RvbUZ1bmN0aW9ucykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ3VzdG9tRnVuY3Rpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgSW50ZWdlciBmdW5jdGlvbiA9IG1DdXN0b21GdW5jdGlvbnMuZ2V0KGkpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb24oZnVuY3Rpb24uaW50VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VzdG9tRnVuY3Rpb25zLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBsaXN0IG9mIEN1c3RvbUZ1bmN0aW9uIHJlZmVyZW5jZXMgc28gd2UgY2FuIGNsZWFuIHVwIHdoZW4gdGhlIGRhdGFiYXNlIGNsb3NlcworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEludGVnZXI+IG1DdXN0b21GdW5jdGlvbnMgPQorICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbihTdHJpbmcgbmFtZSwgaW50IG51bUFyZ3MsIEN1c3RvbUZ1bmN0aW9uIGZ1bmN0aW9uKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb24oaW50IGZ1bmN0aW9uKTsKKworICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRhdGFiYXNlIHZlcnNpb24uCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBkYXRhYmFzZSB2ZXJzaW9uCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRWZXJzaW9uKCkgewotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvZyA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgIlBSQUdNQSB1c2VyX3ZlcnNpb247Iik7Ci0gICAgICAgICAgICBsb25nIHZlcnNpb24gPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOwotICAgICAgICAgICAgcmV0dXJuIChpbnQpIHZlcnNpb247Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gKChMb25nKSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeSh0aGlzLCAiUFJBR01BIHVzZXJfdmVyc2lvbjsiLCBudWxsKSkuaW50VmFsdWUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk0OCwyMCArMTE3OCw4IEBACiAgICAgICogQHJldHVybiB0aGUgbmV3IG1heGltdW0gZGF0YWJhc2Ugc2l6ZQogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldE1heGltdW1TaXplKCkgewotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvZyA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgIlBSQUdNQSBtYXhfcGFnZV9jb3VudDsiKTsKLSAgICAgICAgICAgIGxvbmcgcGFnZUNvdW50ID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBwYWdlQ291bnQgKiBnZXRQYWdlU2l6ZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHByb2cgIT0gbnVsbCkgcHJvZy5jbG9zZSgpOwotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgbG9uZyBwYWdlQ291bnQgPSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeSh0aGlzLCAiUFJBR01BIG1heF9wYWdlX2NvdW50OyIsIG51bGwpOworICAgICAgICByZXR1cm4gcGFnZUNvdW50ICogZ2V0UGFnZVNpemUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk3MiwyNiArMTE5MCwxNSBAQAogICAgICAqIEByZXR1cm4gdGhlIG5ldyBtYXhpbXVtIGRhdGFiYXNlIHNpemUKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBzZXRNYXhpbXVtU2l6ZShsb25nIG51bUJ5dGVzKSB7Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwcm9nID0gbnVsbDsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOworICAgICAgICBsb25nIHBhZ2VTaXplID0gZ2V0UGFnZVNpemUoKTsKKyAgICAgICAgbG9uZyBudW1QYWdlcyA9IG51bUJ5dGVzIC8gcGFnZVNpemU7CisgICAgICAgIC8vIElmIG51bUJ5dGVzIGlzbid0IGEgbXVsdGlwbGUgb2YgcGFnZVNpemUsIGJ1bXAgdXAgYSBwYWdlCisgICAgICAgIGlmICgobnVtQnl0ZXMgJSBwYWdlU2l6ZSkgIT0gMCkgeworICAgICAgICAgICAgbnVtUGFnZXMrKzsKICAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9uZyBwYWdlU2l6ZSA9IGdldFBhZ2VTaXplKCk7Ci0gICAgICAgICAgICBsb25nIG51bVBhZ2VzID0gbnVtQnl0ZXMgLyBwYWdlU2l6ZTsKLSAgICAgICAgICAgIC8vIElmIG51bUJ5dGVzIGlzbid0IGEgbXVsdGlwbGUgb2YgcGFnZVNpemUsIGJ1bXAgdXAgYSBwYWdlCi0gICAgICAgICAgICBpZiAoKG51bUJ5dGVzICUgcGFnZVNpemUpICE9IDApIHsKLSAgICAgICAgICAgICAgICBudW1QYWdlcysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvZyA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgIlBSQUdNQSBtYXhfcGFnZV9jb3VudCA9ICIgKyBudW1QYWdlcyk7Ci0gICAgICAgICAgICBsb25nIG5ld1BhZ2VDb3VudCA9IHByb2cuc2ltcGxlUXVlcnlGb3JMb25nKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3UGFnZUNvdW50ICogcGFnZVNpemU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgICAgICBsb25nIG5ld1BhZ2VDb3VudCA9IERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KHRoaXMsICJQUkFHTUEgbWF4X3BhZ2VfY291bnQgPSAiICsgbnVtUGFnZXMsCisgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgIHJldHVybiBuZXdQYWdlQ291bnQgKiBwYWdlU2l6ZTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMDAsMjAgKzEyMDcsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIGRhdGFiYXNlIHBhZ2Ugc2l6ZSwgaW4gYnl0ZXMKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBnZXRQYWdlU2l6ZSgpIHsKLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHByb2cgPSBudWxsOwotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb2cgPSBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICJQUkFHTUEgcGFnZV9zaXplOyIpOwotICAgICAgICAgICAgbG9uZyBzaXplID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBzaXplOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHByb2cgIT0gbnVsbCkgcHJvZy5jbG9zZSgpOwotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KHRoaXMsICJQUkFHTUEgcGFnZV9zaXplOyIsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTAzNCw5ICsxMjI4LDEwIEBACiAgICAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0byBtYXJrIGFzIHN5bmNhYmxlCiAgICAgICogQHBhcmFtIGRlbGV0ZWRUYWJsZSBUaGUgZGVsZXRlZCB0YWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQogICAgICAqICAgICAgICAgIHN5bmNhYmxlIHRhYmxlCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgbm8gbG9uZ2VyIHNlcnZlcyBhbnkgdXNlZnVsIHB1cnBvc2UgYW5kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBtYXJrVGFibGVTeW5jYWJsZShTdHJpbmcgdGFibGUsIFN0cmluZyBkZWxldGVkVGFibGUpIHsKLSAgICAgICAgbWFya1RhYmxlU3luY2FibGUodGFibGUsICJfaWQiLCB0YWJsZSwgZGVsZXRlZFRhYmxlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwNDksNjAgKzEyNDQsMTAgQEAKICAgICAgKiBAcGFyYW0gZm9yZWlnbktleSB0aGlzIGlzIHRoZSBjb2x1bW4gaW4gdGFibGUgd2hvc2UgdmFsdWUgaXMgYW4gX2lkIGluCiAgICAgICogICAgICAgICAgdXBkYXRlVGFibGUKICAgICAgKiBAcGFyYW0gdXBkYXRlVGFibGUgdGhpcyBpcyB0aGUgdGFibGUgdGhhdCB3aWxsIGhhdmUgaXRzIF9zeW5jX2RpcnR5CisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgbm8gbG9uZ2VyIHNlcnZlcyBhbnkgdXNlZnVsIHB1cnBvc2UgYW5kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgbWFya1RhYmxlU3luY2FibGUoU3RyaW5nIHRhYmxlLCBTdHJpbmcgZm9yZWlnbktleSwKLSAgICAgICAgICAgIFN0cmluZyB1cGRhdGVUYWJsZSkgewotICAgICAgICBtYXJrVGFibGVTeW5jYWJsZSh0YWJsZSwgZm9yZWlnbktleSwgdXBkYXRlVGFibGUsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hcmsgdGhpcyB0YWJsZSBhcyBzeW5jYWJsZSwgd2l0aCB0aGUgX3N5bmNfZGlydHkgcmVzaWRpbmcgaW4gYW5vdGhlcgotICAgICAqIHRhYmxlLiBXaGVuIGFuIHVwZGF0ZSBvY2N1cnMgaW4gdGhpcyB0YWJsZSB0aGUgX3N5bmNfZGlydHkgZmllbGQgb2YgdGhlCi0gICAgICogcm93IGluIHVwZGF0ZVRhYmxlIHdpdGggdGhlIF9pZCBpbiBmb3JlaWduS2V5IHdpbGwgYmUgc2V0IHRvCi0gICAgICogZW5zdXJlIHByb3BlciBzeW5jaW5nIG9wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YWJsZSBhbiB1cGRhdGUgb24gdGhpcyB0YWJsZSB3aWxsIHRyaWdnZXIgYSBzeW5jIHRpbWUgcmVtb3ZhbAotICAgICAqIEBwYXJhbSBmb3JlaWduS2V5IHRoaXMgaXMgdGhlIGNvbHVtbiBpbiB0YWJsZSB3aG9zZSB2YWx1ZSBpcyBhbiBfaWQgaW4KLSAgICAgKiAgICAgICAgICB1cGRhdGVUYWJsZQotICAgICAqIEBwYXJhbSB1cGRhdGVUYWJsZSB0aGlzIGlzIHRoZSB0YWJsZSB0aGF0IHdpbGwgaGF2ZSBpdHMgX3N5bmNfZGlydHkKLSAgICAgKiBAcGFyYW0gZGVsZXRlZFRhYmxlIFRoZSBkZWxldGVkIHRhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCi0gICAgICogICAgICAgICAgdXBkYXRlVGFibGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbWFya1RhYmxlU3luY2FibGUoU3RyaW5nIHRhYmxlLCBTdHJpbmcgZm9yZWlnbktleSwKLSAgICAgICAgICAgIFN0cmluZyB1cGRhdGVUYWJsZSwgU3RyaW5nIGRlbGV0ZWRUYWJsZSkgewotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY1NRTCgiU0VMRUNUIF9zeW5jX2RpcnR5IEZST00gIiArIHVwZGF0ZVRhYmxlCi0gICAgICAgICAgICAgICAgICAgICsgIiBMSU1JVCAwIik7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY1NRTCgiU0VMRUNUICIgKyBmb3JlaWduS2V5ICsgIiBGUk9NICIgKyB0YWJsZQotICAgICAgICAgICAgICAgICAgICArICIgTElNSVQgMCIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeW5jVXBkYXRlSW5mbyBpbmZvID0gbmV3IFN5bmNVcGRhdGVJbmZvKHVwZGF0ZVRhYmxlLCBkZWxldGVkVGFibGUsCi0gICAgICAgICAgICAgICAgZm9yZWlnbktleSk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN5bmNVcGRhdGVJbmZvKSB7Ci0gICAgICAgICAgICBtU3luY1VwZGF0ZUluZm8ucHV0KHRhYmxlLCBpbmZvKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGwgZm9yIGVhY2ggcm93IHRoYXQgaXMgdXBkYXRlZCBpbiBhIGN1cnNvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdGhlIHJvdyBpcyBpbgotICAgICAqIEBwYXJhbSByb3dJZCB0aGUgcm93IElEIG9mIHRoZSB1cGRhdGVkIHJvdwotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gdm9pZCByb3dVcGRhdGVkKFN0cmluZyB0YWJsZSwgbG9uZyByb3dJZCkgewotICAgICAgICBTeW5jVXBkYXRlSW5mbyBpbmZvOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jVXBkYXRlSW5mbykgewotICAgICAgICAgICAgaW5mbyA9IG1TeW5jVXBkYXRlSW5mby5nZXQodGFibGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgIGV4ZWNTUUwoIlVQREFURSAiICsgaW5mby5tYXN0ZXJUYWJsZQotICAgICAgICAgICAgICAgICAgICArICIgU0VUIF9zeW5jX2RpcnR5PTEgV0hFUkUgX2lkPShTRUxFQ1QgIiArIGluZm8uZm9yZWlnbktleQotICAgICAgICAgICAgICAgICAgICArICIgRlJPTSAiICsgdGFibGUgKyAiIFdIRVJFIF9pZD0iICsgcm93SWQgKyAiKSIpOwotICAgICAgICB9CisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgdm9pZCBtYXJrVGFibGVTeW5jYWJsZShTdHJpbmcgdGFibGUsIFN0cmluZyBmb3JlaWduS2V5LCBTdHJpbmcgdXBkYXRlVGFibGUpIHsKICAgICB9CiAKICAgICAvKioKQEAgLTExMzQsNiArMTI3OSw4IEBACiAgICAgICogc3RhdGVtZW50IGFuZCBmaWxsIGluIHRob3NlIHZhbHVlcyB3aXRoIHtAbGluayBTUUxpdGVQcm9ncmFtI2JpbmRTdHJpbmd9CiAgICAgICogYW5kIHtAbGluayBTUUxpdGVQcm9ncmFtI2JpbmRMb25nfSBlYWNoIHRpbWUgeW91IHdhbnQgdG8gcnVuIHRoZQogICAgICAqIHN0YXRlbWVudC4gU3RhdGVtZW50cyBtYXkgbm90IHJldHVybiByZXN1bHQgc2V0cyBsYXJnZXIgdGhhbiAxeDEuCisgICAgICo8cD4KKyAgICAgKiBObyB0d28gdGhyZWFkcyBzaG91bGQgYmUgdXNpbmcgdGhlIHNhbWUge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH0gYXQgdGhlIHNhbWUgdGltZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBzcWwgVGhlIHJhdyBTUUwgc3RhdGVtZW50LCBtYXkgY29udGFpbiA/IGZvciB1bmtub3duIHZhbHVlcyB0byBiZQogICAgICAqICAgICAgICAgICAgYm91bmQgbGF0ZXIuCkBAIC0xMTQxLDE1ICsxMjg4LDggQEAKICAgICAgKiB7QGxpbmsgU1FMaXRlU3RhdGVtZW50fXMgYXJlIG5vdCBzeW5jaHJvbml6ZWQsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAqLwogICAgIHB1YmxpYyBTUUxpdGVTdGF0ZW1lbnQgY29tcGlsZVN0YXRlbWVudChTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLCBzcWwpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgc3FsLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyMjYsOSArMTM2Niw3IEBACiAgICAgICAgICAgICBib29sZWFuIGRpc3RpbmN0LCBTdHJpbmcgdGFibGUsIFN0cmluZ1tdIGNvbHVtbnMsCiAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgZ3JvdXBCeSwKICAgICAgICAgICAgIFN0cmluZyBoYXZpbmcsIFN0cmluZyBvcmRlckJ5LCBTdHJpbmcgbGltaXQpIHsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQorICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBTdHJpbmcgc3FsID0gU1FMaXRlUXVlcnlCdWlsZGVyLmJ1aWxkUXVlcnlTdHJpbmcoCiAgICAgICAgICAgICAgICAgZGlzdGluY3QsIHRhYmxlLCBjb2x1bW5zLCBzZWxlY3Rpb24sIGdyb3VwQnksIGhhdmluZywgb3JkZXJCeSwgbGltaXQpOwogCkBAIC0xMzM5LDkgKzE0NzcsNyBAQAogICAgIHB1YmxpYyBDdXJzb3IgcmF3UXVlcnlXaXRoRmFjdG9yeSgKICAgICAgICAgICAgIEN1cnNvckZhY3RvcnkgY3Vyc29yRmFjdG9yeSwgU3RyaW5nIHNxbCwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywKICAgICAgICAgICAgIFN0cmluZyBlZGl0VGFibGUpIHsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQorICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uUmVhZEZyb21EaXNrKCk7CiAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gMDsKIApAQCAtMTM0OSw3ICsxNDg1LDggQEAKICAgICAgICAgICAgIHRpbWVTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICB9CiAKLSAgICAgICAgU1FMaXRlQ3Vyc29yRHJpdmVyIGRyaXZlciA9IG5ldyBTUUxpdGVEaXJlY3RDdXJzb3JEcml2ZXIodGhpcywgc3FsLCBlZGl0VGFibGUpOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IGdldERiQ29ubmVjdGlvbihzcWwpOworICAgICAgICBTUUxpdGVDdXJzb3JEcml2ZXIgZHJpdmVyID0gbmV3IFNRTGl0ZURpcmVjdEN1cnNvckRyaXZlcihkYiwgc3FsLCBlZGl0VGFibGUpOwogCiAgICAgICAgIEN1cnNvciBjdXJzb3IgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtMTM3NSw2ICsxNTEyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI8bnVsbD4iKSAgKyAiLCBjb3VudCBpcyAiICsgY291bnQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbGVhc2VEYkNvbm5lY3Rpb24oZGIpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjdXJzb3I7CiAgICAgfQpAQCAtMTUwMSw4NCArMTYzOSw0MSBAQAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGluc2VydFdpdGhPbkNvbmZsaWN0KFN0cmluZyB0YWJsZSwgU3RyaW5nIG51bGxDb2x1bW5IYWNrLAogICAgICAgICAgICAgQ29udGVudFZhbHVlcyBpbml0aWFsVmFsdWVzLCBpbnQgY29uZmxpY3RBbGdvcml0aG0pIHsKLSAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vbldyaXRlVG9EaXNrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNZWFzdXJlbWVudHMgc2hvdyBtb3N0IHNxbCBsZW5ndGhzIDw9IDE1MgotICAgICAgICBTdHJpbmdCdWlsZGVyIHNxbCA9IG5ldyBTdHJpbmdCdWlsZGVyKDE1Mik7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc3FsID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgc3FsLmFwcGVuZCgiSU5TRVJUIik7CiAgICAgICAgIHNxbC5hcHBlbmQoQ09ORkxJQ1RfVkFMVUVTW2NvbmZsaWN0QWxnb3JpdGhtXSk7CiAgICAgICAgIHNxbC5hcHBlbmQoIiBJTlRPICIpOwogICAgICAgICBzcWwuYXBwZW5kKHRhYmxlKTsKLSAgICAgICAgLy8gTWVhc3VyZW1lbnRzIHNob3cgbW9zdCB2YWx1ZXMgbGVuZ3RocyA8IDQwCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgdmFsdWVzID0gbmV3IFN0cmluZ0J1aWxkZXIoNDApOworICAgICAgICBzcWwuYXBwZW5kKCcoJyk7CiAKLSAgICAgICAgU2V0PE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJ5U2V0ID0gbnVsbDsKLSAgICAgICAgaWYgKGluaXRpYWxWYWx1ZXMgIT0gbnVsbCAmJiBpbml0aWFsVmFsdWVzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGVudHJ5U2V0ID0gaW5pdGlhbFZhbHVlcy52YWx1ZVNldCgpOwotICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cmllc0l0ZXIgPSBlbnRyeVNldC5pdGVyYXRvcigpOwotICAgICAgICAgICAgc3FsLmFwcGVuZCgnKCcpOwotCi0gICAgICAgICAgICBib29sZWFuIG5lZWRTZXBhcmF0b3IgPSBmYWxzZTsKLSAgICAgICAgICAgIHdoaWxlIChlbnRyaWVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobmVlZFNlcGFyYXRvcikgewotICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZWVkU2VwYXJhdG9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gZW50cmllc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQoJz8nKTsKKyAgICAgICAgT2JqZWN0W10gYmluZEFyZ3MgPSBudWxsOworICAgICAgICBpbnQgc2l6ZSA9IChpbml0aWFsVmFsdWVzICE9IG51bGwgJiYgaW5pdGlhbFZhbHVlcy5zaXplKCkgPiAwKSA/IGluaXRpYWxWYWx1ZXMuc2l6ZSgpIDogMDsKKyAgICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgICAgICBiaW5kQXJncyA9IG5ldyBPYmplY3Rbc2l6ZV07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBjb2xOYW1lIDogaW5pdGlhbFZhbHVlcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoKGkgPiAwKSA/ICIsIiA6ICIiKTsKKyAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKGNvbE5hbWUpOworICAgICAgICAgICAgICAgIGJpbmRBcmdzW2krK10gPSBpbml0aWFsVmFsdWVzLmdldChjb2xOYW1lKTsKICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgc3FsLmFwcGVuZCgnKScpOworICAgICAgICAgICAgc3FsLmFwcGVuZCgiIFZBTFVFUyAoIik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgoaSA+IDApID8gIiw/IiA6ICI/Iik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcWwuYXBwZW5kKCIoIiArIG51bGxDb2x1bW5IYWNrICsgIikgIik7Ci0gICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKCJOVUxMIik7CisgICAgICAgICAgICBzcWwuYXBwZW5kKG51bGxDb2x1bW5IYWNrICsgIikgVkFMVUVTIChOVUxMIik7CiAgICAgICAgIH0KKyAgICAgICAgc3FsLmFwcGVuZCgnKScpOwogCi0gICAgICAgIHNxbC5hcHBlbmQoIiBWQUxVRVMoIik7Ci0gICAgICAgIHNxbC5hcHBlbmQodmFsdWVzKTsKLSAgICAgICAgc3FsLmFwcGVuZCgiKTsiKTsKLQotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLCBzcWwudG9TdHJpbmcoKSwgYmluZEFyZ3MpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RhdGVtZW50ID0gY29tcGlsZVN0YXRlbWVudChzcWwudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIC8vIEJpbmQgdGhlIHZhbHVlcwotICAgICAgICAgICAgaWYgKGVudHJ5U2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGVudHJ5U2V0LnNpemUoKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+PiBlbnRyaWVzSXRlciA9IGVudHJ5U2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA9IGVudHJpZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5iaW5kT2JqZWN0VG9Qcm9ncmFtKHN0YXRlbWVudCwgaSArIDEsIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUnVuIHRoZSBwcm9ncmFtIGFuZCB0aGVuIGNsZWFudXAKLSAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKCk7Ci0KLSAgICAgICAgICAgIGxvbmcgaW5zZXJ0ZWRSb3dJZCA9IGxhc3RJbnNlcnRSb3coKTsKLSAgICAgICAgICAgIGlmIChpbnNlcnRlZFJvd0lkID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgaW5zZXJ0aW5nICIgKyBpbml0aWFsVmFsdWVzICsgIiB1c2luZyAiICsgc3FsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dEICYmIExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkluc2VydGluZyByb3cgIiArIGluc2VydGVkUm93SWQgKyAiIGZyb20gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5pdGlhbFZhbHVlcyArICIgdXNpbmcgIiArIHNxbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGluc2VydGVkUm93SWQ7CisgICAgICAgICAgICByZXR1cm4gc3RhdGVtZW50LmV4ZWN1dGVJbnNlcnQoKTsKICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIG9uQ29ycnVwdGlvbigpOwogICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTU5MywzMiArMTY4OCwxNSBAQAogICAgICAqICAgICAgICAgd2hlcmVDbGF1c2UuCiAgICAgICovCiAgICAgcHVibGljIGludCBkZWxldGUoU3RyaW5nIHRhYmxlLCBTdHJpbmcgd2hlcmVDbGF1c2UsIFN0cmluZ1tdIHdoZXJlQXJncykgewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gIG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgIkRFTEVURSBGUk9NICIgKyB0YWJsZSArCisgICAgICAgICAgICAgICAgKCFUZXh0VXRpbHMuaXNFbXB0eSh3aGVyZUNsYXVzZSkgPyAiIFdIRVJFICIgKyB3aGVyZUNsYXVzZSA6ICIiKSwgd2hlcmVBcmdzKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbXBpbGVTdGF0ZW1lbnQoIkRFTEVURSBGUk9NICIgKyB0YWJsZQotICAgICAgICAgICAgICAgICAgICArICghVGV4dFV0aWxzLmlzRW1wdHkod2hlcmVDbGF1c2UpCi0gICAgICAgICAgICAgICAgICAgID8gIiBXSEVSRSAiICsgd2hlcmVDbGF1c2UgOiAiIikpOwotICAgICAgICAgICAgaWYgKHdoZXJlQXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IG51bUFyZ3MgPSB3aGVyZUFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYmluZE9iamVjdFRvUHJvZ3JhbShzdGF0ZW1lbnQsIGkgKyAxLCB3aGVyZUFyZ3NbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbGFzdENoYW5nZUNvdW50KCk7CisgICAgICAgICAgICByZXR1cm4gc3RhdGVtZW50LmV4ZWN1dGVVcGRhdGVEZWxldGUoKTsKICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIG9uQ29ycnVwdGlvbigpOwogICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTY0OSw4ICsxNzI3LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHVwZGF0ZVdpdGhPbkNvbmZsaWN0KFN0cmluZyB0YWJsZSwgQ29udGVudFZhbHVlcyB2YWx1ZXMsCiAgICAgICAgICAgICBTdHJpbmcgd2hlcmVDbGF1c2UsIFN0cmluZ1tdIHdoZXJlQXJncywgaW50IGNvbmZsaWN0QWxnb3JpdGhtKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwotICAgICAgICBpZiAodmFsdWVzID09IG51bGwgfHwgdmFsdWVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIGludCBzZXRWYWx1ZXNTaXplID0gdmFsdWVzLnNpemUoKTsKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHNldFZhbHVlc1NpemUgPT0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRW1wdHkgdmFsdWVzIik7CiAgICAgICAgIH0KIApAQCAtMTY2MCw5OCArMTczOCw2OCBAQAogICAgICAgICBzcWwuYXBwZW5kKHRhYmxlKTsKICAgICAgICAgc3FsLmFwcGVuZCgiIFNFVCAiKTsKIAotICAgICAgICBTZXQ8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cnlTZXQgPSB2YWx1ZXMudmFsdWVTZXQoKTsKLSAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cmllc0l0ZXIgPSBlbnRyeVNldC5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChlbnRyaWVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSBlbnRyaWVzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBzcWwuYXBwZW5kKGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgLy8gbW92ZSBhbGwgYmluZCBhcmdzIHRvIG9uZSBhcnJheQorICAgICAgICBpbnQgYmluZEFyZ3NTaXplID0gKHdoZXJlQXJncyA9PSBudWxsKSA/IHNldFZhbHVlc1NpemUgOiAoc2V0VmFsdWVzU2l6ZSArIHdoZXJlQXJncy5sZW5ndGgpOworICAgICAgICBPYmplY3RbXSBiaW5kQXJncyA9IG5ldyBPYmplY3RbYmluZEFyZ3NTaXplXTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKFN0cmluZyBjb2xOYW1lIDogdmFsdWVzLmtleVNldCgpKSB7CisgICAgICAgICAgICBzcWwuYXBwZW5kKChpID4gMCkgPyAiLCIgOiAiIik7CisgICAgICAgICAgICBzcWwuYXBwZW5kKGNvbE5hbWUpOworICAgICAgICAgICAgYmluZEFyZ3NbaSsrXSA9IHZhbHVlcy5nZXQoY29sTmFtZSk7CiAgICAgICAgICAgICBzcWwuYXBwZW5kKCI9PyIpOwotICAgICAgICAgICAgaWYgKGVudHJpZXNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdoZXJlQXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGkgPSBzZXRWYWx1ZXNTaXplOyBpIDwgYmluZEFyZ3NTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBiaW5kQXJnc1tpXSA9IHdoZXJlQXJnc1tpIC0gc2V0VmFsdWVzU2l6ZV07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQogICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHdoZXJlQ2xhdXNlKSkgewogICAgICAgICAgICAgc3FsLmFwcGVuZCgiIFdIRVJFICIpOwogICAgICAgICAgICAgc3FsLmFwcGVuZCh3aGVyZUNsYXVzZSk7CiAgICAgICAgIH0KIAotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsIHNxbC50b1N0cmluZygpLCBiaW5kQXJncyk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb21waWxlU3RhdGVtZW50KHNxbC50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgLy8gQmluZCB0aGUgdmFsdWVzCi0gICAgICAgICAgICBpbnQgc2l6ZSA9IGVudHJ5U2V0LnNpemUoKTsKLSAgICAgICAgICAgIGVudHJpZXNJdGVyID0gZW50cnlTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGludCBiaW5kQXJnID0gMTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA9IGVudHJpZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmJpbmRPYmplY3RUb1Byb2dyYW0oc3RhdGVtZW50LCBiaW5kQXJnLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBiaW5kQXJnKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh3aGVyZUFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNpemUgPSB3aGVyZUFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kU3RyaW5nKGJpbmRBcmcsIHdoZXJlQXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIGJpbmRBcmcrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJ1biB0aGUgcHJvZ3JhbSBhbmQgdGhlbiBjbGVhbnVwCi0gICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZSgpOwotICAgICAgICAgICAgaW50IG51bUNoYW5nZWRSb3dzID0gbGFzdENoYW5nZUNvdW50KCk7Ci0gICAgICAgICAgICBpZiAoQ29uZmlnLkxPR0QgJiYgTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICJVcGRhdGVkICIgKyBudW1DaGFuZ2VkUm93cyArICIgdXNpbmcgIiArIHZhbHVlcyArICIgYW5kICIgKyBzcWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bUNoYW5nZWRSb3dzOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlbWVudC5leGVjdXRlVXBkYXRlRGVsZXRlKCk7CiAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBvbkNvcnJ1cHRpb24oKTsKICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciB1cGRhdGluZyAiICsgdmFsdWVzICsgIiB1c2luZyAiICsgc3FsKTsKLSAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFeGVjdXRlIGEgc2luZ2xlIFNRTCBzdGF0ZW1lbnQgdGhhdCBpcyBub3QgYSBxdWVyeS4gRm9yIGV4YW1wbGUsIENSRUFURQotICAgICAqIFRBQkxFLCBERUxFVEUsIElOU0VSVCwgZXRjLiBNdWx0aXBsZSBzdGF0ZW1lbnRzIHNlcGFyYXRlZCBieSA7cyBhcmUgbm90Ci0gICAgICogc3VwcG9ydGVkLiBpdCB0YWtlcyBhIHdyaXRlIGxvY2sKKyAgICAgKiBFeGVjdXRlIGEgc2luZ2xlIFNRTCBzdGF0ZW1lbnQgdGhhdCBpcyBOT1QgYSBTRUxFQ1QKKyAgICAgKiBvciBhbnkgb3RoZXIgU1FMIHN0YXRlbWVudCB0aGF0IHJldHVybnMgZGF0YS4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCBoYXMgbm8gbWVhbnMgdG8gcmV0dXJuIGFueSBkYXRhIChzdWNoIGFzIHRoZSBudW1iZXIgb2YgYWZmZWN0ZWQgcm93cykuCisgICAgICogSW5zdGVhZCwgeW91J3JlIGVuY291cmFnZWQgdG8gdXNlIHtAbGluayAjaW5zZXJ0KFN0cmluZywgU3RyaW5nLCBDb250ZW50VmFsdWVzKX0sCisgICAgICoge0BsaW5rICN1cGRhdGUoU3RyaW5nLCBDb250ZW50VmFsdWVzLCBTdHJpbmcsIFN0cmluZ1tdKX0sIGV0IGFsLCB3aGVuIHBvc3NpYmxlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIHVzaW5nIHtAbGluayAjZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKX0sIGpvdXJuYWxfbW9kZSBpcworICAgICAqIGF1dG9tYXRpY2FsbHkgbWFuYWdlZCBieSB0aGlzIGNsYXNzLiBTbywgZG8gbm90IHNldCBqb3VybmFsX21vZGUKKyAgICAgKiB1c2luZyAiUFJBR01BIGpvdXJuYWxfbW9kZSc8dmFsdWU+IiBzdGF0ZW1lbnQgaWYgeW91ciBhcHAgaXMgdXNpbmcKKyAgICAgKiB7QGxpbmsgI2VuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCl9CisgICAgICogPC9wPgogICAgICAqCisgICAgICogQHBhcmFtIHNxbCB0aGUgU1FMIHN0YXRlbWVudCB0byBiZSBleGVjdXRlZC4gTXVsdGlwbGUgc3RhdGVtZW50cyBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucyBhcmUKKyAgICAgKiBub3Qgc3VwcG9ydGVkLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIElmIHRoZSBTUUwgc3RyaW5nIGlzIGludmFsaWQgZm9yIHNvbWUgcmVhc29uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXhlY1NRTChTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLSAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vbldyaXRlVG9EaXNrKCk7CisgICAgICAgIGludCBzdG10VHlwZSA9IERhdGFiYXNlVXRpbHMuZ2V0U3FsU3RhdGVtZW50VHlwZShzcWwpOworICAgICAgICBpZiAoc3RtdFR5cGUgPT0gRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfQVRUQUNIKSB7CisgICAgICAgICAgICBkaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgfQogICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KICAgICAgICAgbG9nVGltZVN0YXQobUxhc3RTcWxTdGF0ZW1lbnQsIHRpbWVTdGFydCwgR0VUX0xPQ0tfTE9HX1BSRUZJWCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY1NRTChzcWwpOwotICAgICAgICB9IGNhdGNoIChTUUxpdGVEYXRhYmFzZUNvcnJ1cHRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgb25Db3JydXB0aW9uKCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZVNxbChzcWwsIG51bGwpOwogCiAgICAgICAgIC8vIExvZyBjb21taXQgc3RhdGVtZW50cyBhbG9uZyB3aXRoIHRoZSBtb3N0IHJlY2VudGx5IGV4ZWN1dGVkCi0gICAgICAgIC8vIFNRTCBzdGF0ZW1lbnQgZm9yIGRpc2FtYmlndWF0aW9uLiAgTm90ZSB0aGF0IGluc3RhbmNlCi0gICAgICAgIC8vIGVxdWFsaXR5IHRvIENPTU1JVF9TUUwgaXMgc2FmZSBoZXJlLgotICAgICAgICBpZiAoc3FsID09IENPTU1JVF9TUUwpIHsKKyAgICAgICAgLy8gU1FMIHN0YXRlbWVudCBmb3IgZGlzYW1iaWd1YXRpb24uCisgICAgICAgIGlmIChzdG10VHlwZSA9PSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9DT01NSVQpIHsKICAgICAgICAgICAgIGxvZ1RpbWVTdGF0KG1MYXN0U3FsU3RhdGVtZW50LCB0aW1lU3RhcnQsIENPTU1JVF9TUUwpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbG9nVGltZVN0YXQoc3FsLCB0aW1lU3RhcnQsIG51bGwpOwpAQCAtMTc1OSw2NSArMTgwNyw5OCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEV4ZWN1dGUgYSBzaW5nbGUgU1FMIHN0YXRlbWVudCB0aGF0IGlzIG5vdCBhIHF1ZXJ5LiBGb3IgZXhhbXBsZSwgQ1JFQVRFCi0gICAgICogVEFCTEUsIERFTEVURSwgSU5TRVJULCBldGMuIE11bHRpcGxlIHN0YXRlbWVudHMgc2VwYXJhdGVkIGJ5IDtzIGFyZSBub3QKLSAgICAgKiBzdXBwb3J0ZWQuIGl0IHRha2VzIGEgd3JpdGUgbG9jaywKKyAgICAgKiBFeGVjdXRlIGEgc2luZ2xlIFNRTCBzdGF0ZW1lbnQgdGhhdCBpcyBOT1QgYSBTRUxFQ1QvSU5TRVJUL1VQREFURS9ERUxFVEUuCisgICAgICogPHA+CisgICAgICogRm9yIElOU0VSVCBzdGF0ZW1lbnRzLCB1c2UgYW55IG9mIHRoZSBmb2xsb3dpbmcgaW5zdGVhZC4KKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rICNpbnNlcnQoU3RyaW5nLCBTdHJpbmcsIENvbnRlbnRWYWx1ZXMpfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNpbnNlcnRPclRocm93KFN0cmluZywgU3RyaW5nLCBDb250ZW50VmFsdWVzKX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjaW5zZXJ0V2l0aE9uQ29uZmxpY3QoU3RyaW5nLCBTdHJpbmcsIENvbnRlbnRWYWx1ZXMsIGludCl9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIEZvciBVUERBVEUgc3RhdGVtZW50cywgdXNlIGFueSBvZiB0aGUgZm9sbG93aW5nIGluc3RlYWQuCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayAjdXBkYXRlKFN0cmluZywgQ29udGVudFZhbHVlcywgU3RyaW5nLCBTdHJpbmdbXSl9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI3VwZGF0ZVdpdGhPbkNvbmZsaWN0KFN0cmluZywgQ29udGVudFZhbHVlcywgU3RyaW5nLCBTdHJpbmdbXSwgaW50KX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+CisgICAgICogRm9yIERFTEVURSBzdGF0ZW1lbnRzLCB1c2UgYW55IG9mIHRoZSBmb2xsb3dpbmcgaW5zdGVhZC4KKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rICNkZWxldGUoU3RyaW5nLCBTdHJpbmcsIFN0cmluZ1tdKX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgYXJlIGdvb2QgY2FuZGlkYXRlcyBmb3IgdXNpbmcgdGhpcyBtZXRob2Q6CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFMVEVSIFRBQkxFPC9saT4KKyAgICAgKiAgIDxsaT5DUkVBVEUgb3IgRFJPUCB0YWJsZSAvIHRyaWdnZXIgLyB2aWV3IC8gaW5kZXggLyB2aXJ0dWFsIHRhYmxlPC9saT4KKyAgICAgKiAgIDxsaT5SRUlOREVYPC9saT4KKyAgICAgKiAgIDxsaT5SRUxFQVNFPC9saT4KKyAgICAgKiAgIDxsaT5TQVZFUE9JTlQ8L2xpPgorICAgICAqICAgPGxpPlBSQUdNQSB0aGF0IHJldHVybnMgbm8gZGF0YTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogV2hlbiB1c2luZyB7QGxpbmsgI2VuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCl9LCBqb3VybmFsX21vZGUgaXMKKyAgICAgKiBhdXRvbWF0aWNhbGx5IG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4gU28sIGRvIG5vdCBzZXQgam91cm5hbF9tb2RlCisgICAgICogdXNpbmcgIlBSQUdNQSBqb3VybmFsX21vZGUnPHZhbHVlPiIgc3RhdGVtZW50IGlmIHlvdXIgYXBwIGlzIHVzaW5nCisgICAgICoge0BsaW5rICNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfQorICAgICAqIDwvcD4KICAgICAgKgotICAgICAqIEBwYXJhbSBzcWwKKyAgICAgKiBAcGFyYW0gc3FsIHRoZSBTUUwgc3RhdGVtZW50IHRvIGJlIGV4ZWN1dGVkLiBNdWx0aXBsZSBzdGF0ZW1lbnRzIHNlcGFyYXRlZCBieSBzZW1pY29sb25zIGFyZQorICAgICAqIG5vdCBzdXBwb3J0ZWQuCiAgICAgICogQHBhcmFtIGJpbmRBcmdzIG9ubHkgYnl0ZVtdLCBTdHJpbmcsIExvbmcgYW5kIERvdWJsZSBhcmUgc3VwcG9ydGVkIGluIGJpbmRBcmdzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIElmIHRoZSBTUUwgc3RyaW5nIGlzIGludmFsaWQgZm9yIHNvbWUgcmVhc29uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXhlY1NRTChTdHJpbmcgc3FsLCBPYmplY3RbXSBiaW5kQXJncykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwogICAgICAgICBpZiAoYmluZEFyZ3MgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRW1wdHkgYmluZEFyZ3MiKTsKICAgICAgICAgfQorICAgICAgICBleGVjdXRlU3FsKHNxbCwgYmluZEFyZ3MpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleGVjdXRlU3FsKFN0cmluZyBzcWwsIE9iamVjdFtdIGJpbmRBcmdzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLCBzcWwsIGJpbmRBcmdzKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbXBpbGVTdGF0ZW1lbnQoc3FsKTsKLSAgICAgICAgICAgIGlmIChiaW5kQXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IG51bUFyZ3MgPSBiaW5kQXJncy5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5iaW5kT2JqZWN0VG9Qcm9ncmFtKHN0YXRlbWVudCwgaSArIDEsIGJpbmRBcmdzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZSgpOworICAgICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGVVcGRhdGVEZWxldGUoKTsKICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIG9uQ29ycnVwdGlvbigpOwogICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKICAgICAgICAgfQogICAgICAgICBsb2dUaW1lU3RhdChzcWwsIHRpbWVTdGFydCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7Ci0gICAgICAgIGlmIChpc09wZW4oKSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiY2xvc2UoKSB3YXMgbmV2ZXIgZXhwbGljaXRseSBjYWxsZWQgb24gZGF0YWJhc2UgJyIgKwotICAgICAgICAgICAgICAgICAgICBtUGF0aCArICInICIsIG1TdGFja1RyYWNlKTsKLSAgICAgICAgICAgIGNsb3NlQ2xvc2FibGUoKTsKLSAgICAgICAgICAgIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkKCk7CisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChpc09wZW4oKSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNsb3NlKCkgd2FzIG5ldmVyIGV4cGxpY2l0bHkgY2FsbGVkIG9uIGRhdGFiYXNlICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYXRoICsgIicgIiwgbVN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIGNsb3NlQ2xvc2FibGUoKTsKKyAgICAgICAgICAgICAgICBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZCgpOworICAgICAgICAgICAgICAgIHJlbGVhc2VDdXN0b21GdW5jdGlvbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yLiBTZWUge0BsaW5rICNjcmVhdGV9IGFuZCB7QGxpbmsgI29wZW5EYXRhYmFzZX0uCisgICAgICogUHJpdmF0ZSBjb25zdHJ1Y3Rvci4KICAgICAgKgogICAgICAqIEBwYXJhbSBwYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGRhdGFiYXNlCiAgICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGZhY3RvcnkgdG8gdXNlIHdoZW4gY3JlYXRpbmcgY3Vyc29ycywgbWF5IGJlIE5VTEwuCiAgICAgICogQHBhcmFtIGZsYWdzIDAgb3Ige0BsaW5rICNOT19MT0NBTElaRURfQ09MTEFUT1JTfS4gIElmIHRoZSBkYXRhYmFzZSBmaWxlIGFscmVhZHkKICAgICAgKiAgICAgICAgICAgICAgZXhpc3RzLCBtRmxhZ3Mgd2lsbCBiZSB1cGRhdGVkIGFwcHJvcHJpYXRlbHkuCisgICAgICogQHBhcmFtIGVycm9ySGFuZGxlciBUaGUge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBiZSB1c2VkIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UKKyAgICAgKiBjb3JydXB0aW9uLiBtYXkgYmUgTlVMTC4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbk51bSAwIGZvciBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlLiAxLi5OIGZvciBwb29sZWQgZGF0YWJhc2UKKyAgICAgKiBjb25uZWN0aW9uIGhhbmRsZXMuCiAgICAgICovCi0gICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZShTdHJpbmcgcGF0aCwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgZmxhZ3MpIHsKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlKFN0cmluZyBwYXRoLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCBmbGFncywKKyAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciwgc2hvcnQgY29ubmVjdGlvbk51bSkgewogICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXRoIHNob3VsZCBub3QgYmUgbnVsbCIpOwogICAgICAgICB9CkBAIC0xODI2LDI1ICsxOTA3LDExIEBACiAgICAgICAgIG1TbG93UXVlcnlUaHJlc2hvbGQgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEludChMT0dfU0xPV19RVUVSSUVTX1BST1BFUlRZLCAtMSk7CiAgICAgICAgIG1TdGFja1RyYWNlID0gbmV3IERhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uKCkuZmlsbEluU3RhY2tUcmFjZSgpOwogICAgICAgICBtRmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgICAgIGRib3BlbihtUGF0aCwgbUZsYWdzKTsKLSAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgewotICAgICAgICAgICAgbVRpbWVPcGVuZWQgPSBnZXRUaW1lKCk7Ci0gICAgICAgIH0KICAgICAgICAgbVByb2dyYW1zID0gbmV3IFdlYWtIYXNoTWFwPFNRTGl0ZUNsb3NhYmxlLE9iamVjdD4oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldExvY2FsZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gc2V0TG9jYWxlKCkgd2hlbiBjb25zdHJ1Y3RpbmcsIGNsb3NpbmcgdGhlIGRhdGFiYXNlIiwgZSk7Ci0gICAgICAgICAgICBkYmNsb3NlKCk7Ci0gICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICAgICAgbVRpbWVDbG9zZWQgPSBnZXRUaW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGltZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIEhIOm1tOnNzLlNTUyAiKS5mb3JtYXQoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAvLyBTZXQgdGhlIERhdGFiYXNlRXJyb3JIYW5kbGVyIHRvIGJlIHVzZWQgd2hlbiBTUUxpdGUgcmVwb3J0cyBjb3JydXB0aW9uLgorICAgICAgICAvLyBJZiB0aGUgY2FsbGVyIHNldHMgZXJyb3JIYW5kbGVyID0gbnVsbCwgdGhlbiB1c2UgZGVmYXVsdCBlcnJvcmhhbmRsZXIuCisgICAgICAgIG1FcnJvckhhbmRsZXIgPSAoZXJyb3JIYW5kbGVyID09IG51bGwpID8gbmV3IERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpIDogZXJyb3JIYW5kbGVyOworICAgICAgICBtQ29ubmVjdGlvbk51bSA9IGNvbm5lY3Rpb25OdW07CiAgICAgfQogCiAgICAgLyoqCkBAIC0xOTAxLDcgKzE5NjgsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChkdXJhdGlvbk1pbGxpcyA+PSBzUXVlcnlMb2dUaW1lSW5NaWxsaXMpIHsKICAgICAgICAgICAgIHNhbXBsZVBlcmNlbnQgPSAxMDA7Ci0gICAgICAgIH0gZWxzZSB7OworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2FtcGxlUGVyY2VudCA9IChpbnQpICgxMDAgKiBkdXJhdGlvbk1pbGxpcyAvIHNRdWVyeUxvZ1RpbWVJbk1pbGxpcykgKyAxOwogICAgICAgICAgICAgaWYgKG1SYW5kb20ubmV4dEludCgxMDApID49IHNhbXBsZVBlcmNlbnQpIHJldHVybjsKICAgICAgICAgfQpAQCAtMTk3MCw2ICsyMDM3LDIwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgdmVyaWZ5RGJJc09wZW4oKSB7CisgICAgICAgIGlmICghaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBnZXRQYXRoKCkgKyAiIChjb25uIyAiICsKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25OdW0gKyAiKSBhbHJlYWR5IGNsb3NlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyB2b2lkIHZlcmlmeUxvY2tPd25lcigpIHsKKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgaWYgKG1Mb2NraW5nRW5hYmxlZCAmJiAhaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEb24ndCBoYXZlIGRhdGFiYXNlIGxvY2shIik7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKgogICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgKgpAQCAtMTk3Nyw1OSArMjA1OCw0NSBAQAogICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgKi8KICAgICAvKioKLSAgICAgKiBhZGRzIHRoZSBnaXZlbiBzcWwgYW5kIGl0cyBjb21waWxlZC1zdGF0ZW1lbnQtaWQtcmV0dXJuZWQtYnktc3FsaXRlIHRvIHRoZQorICAgICAqIEFkZHMgdGhlIGdpdmVuIFNRTCBhbmQgaXRzIGNvbXBpbGVkLXN0YXRlbWVudC1pZC1yZXR1cm5lZC1ieS1zcWxpdGUgdG8gdGhlCiAgICAgICogY2FjaGUgb2YgY29tcGlsZWRRdWVyaWVzIGF0dGFjaGVkIHRvICd0aGlzJy4KLSAgICAgKgotICAgICAqIGlmIHRoZXJlIGlzIGFscmVhZHkgYSB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9IGluIGNvbXBpbGVkUXVlcmllcyBmb3IgdGhlIGdpdmVuIHNxbCwKKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEge0BsaW5rIFNRTGl0ZUNvbXBpbGVkU3FsfSBpbiBjb21waWxlZFF1ZXJpZXMgZm9yIHRoZSBnaXZlbiBTUUwsCiAgICAgICogdGhlIG5ldyB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9IG9iamVjdCBpcyBOT1QgaW5zZXJ0ZWQgaW50byB0aGUgY2FjaGUgKGkuZS4sdGhlIGN1cnJlbnQKICAgICAgKiBtYXBwaW5nIGlzIE5PVCByZXBsYWNlZCB3aXRoIHRoZSBuZXcgbWFwcGluZykuCiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIGFkZFRvQ29tcGlsZWRRdWVyaWVzKFN0cmluZyBzcWwsIFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3RhdGVtZW50KSB7Ci0gICAgICAgIGlmIChtTWF4U3FsQ2FjaGVTaXplID09IDApIHsKLSAgICAgICAgICAgIC8vIGZvciB0aGlzIGRhdGFiYXNlLCB0aGVyZSBpcyBubyBjYWNoZSBvZiBjb21waWxlZCBzcWwuCi0gICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAifE5PVCBhZGRpbmdfc3FsX3RvX2NhY2hlfCIgKyBnZXRQYXRoKCkgKyAifCIgKyBzcWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTcWwgPSBudWxsOwogICAgICAgICBzeW5jaHJvbml6ZWQobUNvbXBpbGVkUXVlcmllcykgewogICAgICAgICAgICAgLy8gZG9uJ3QgaW5zZXJ0IHRoZSBuZXcgbWFwcGluZyBpZiBhIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMKLSAgICAgICAgICAgIGNvbXBpbGVkU3FsID0gbUNvbXBpbGVkUXVlcmllcy5nZXQoc3FsKTsKLSAgICAgICAgICAgIGlmIChjb21waWxlZFNxbCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobUNvbXBpbGVkUXVlcmllcy5jb250YWluc0tleShzcWwpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gYWRkIHRoaXMgPHNxbCwgY29tcGlsZWRTdGF0ZW1lbnQ+IHRvIHRoZSBjYWNoZQorCiAgICAgICAgICAgICBpZiAobUNvbXBpbGVkUXVlcmllcy5zaXplKCkgPT0gbU1heFNxbENhY2hlU2l6ZSkgewogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogY2FjaGUgc2l6ZSBvZiB7QGxpbmsgI21NYXhTcWxDYWNoZVNpemV9IGlzIG5vdCBlbm91Z2ggZm9yIHRoaXMgYXBwLgotICAgICAgICAgICAgICAgICAqIGxvZyBhIHdhcm5pbmcgTUFYX1dBUk5JTkdTX09OX0NBQ0hFU0laRV9DT05ESVRJT04gdGltZXMKLSAgICAgICAgICAgICAgICAgKiBjaGFuY2VzIGFyZSBpdCBpcyBOT1QgdXNpbmcgPyBmb3IgYmluZGFyZ3MgLSBzbyBjYWNoaW5nIGlzIHVzZWxlc3MuCi0gICAgICAgICAgICAgICAgICogVE9ETzogZWl0aGVyIGxldCB0aGUgY2FsbGVycyBzZXQgbWF4IGNjaGVzaXplIGZvciB0aGVpciBhcHAsIG9yIGludGVsbGlnZW50bHkKLSAgICAgICAgICAgICAgICAgKiBmaWd1cmUgb3V0IHdoYXQgc2hvdWxkIGJlIGNhY2hlZCBmb3IgYSBnaXZlbiBhcHAuCisgICAgICAgICAgICAgICAgICogbG9nIGEgd2FybmluZy4KKyAgICAgICAgICAgICAgICAgKiBjaGFuY2VzIGFyZSBpdCBpcyBOT1QgdXNpbmcgPyBmb3IgYmluZGFyZ3MgLSBvciBjYWNoZXNpemUgaXMgdG9vIHNtYWxsLgogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIGlmICgrK21DYWNoZUZ1bGxXYXJuaW5ncyA9PSBNQVhfV0FSTklOR1NfT05fQ0FDSEVTSVpFX0NPTkRJVElPTikgewogICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJSZWFjaGVkIE1BWCBzaXplIGZvciBjb21waWxlZC1zcWwgc3RhdGVtZW50IGNhY2hlIGZvciBkYXRhYmFzZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXRoKCkgKyAiOyBpLmUuLCBOTyBzcGFjZSBmb3IgdGhpcyBzcWwgc3RhdGVtZW50IGluIGNhY2hlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWwgKyAiLiBQbGVhc2UgY2hhbmdlIHlvdXIgc3FsIHN0YXRlbWVudHMgdG8gdXNlICc/JyBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImJpbmRhcmdzLCBpbnN0ZWFkIG9mIHVzaW5nIGFjdHVhbCB2YWx1ZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXRoKCkgKyAiLiBDb25zaWRlciBpbmNyZWFzaW5nIGNhY2hlc2l6ZS4iKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gZG9uJ3QgYWRkIHRoaXMgZW50cnkgdG8gY2FjaGUKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY2FjaGUgaXMgTk9UIGZ1bGwuIGFkZCB0aGlzIHRvIGNhY2hlLgotICAgICAgICAgICAgICAgIG1Db21waWxlZFF1ZXJpZXMucHV0KHNxbCwgY29tcGlsZWRTdGF0ZW1lbnQpOwotICAgICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfQ0FDSEUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAifGFkZGluZ19zcWxfdG9fY2FjaGV8IiArIGdldFBhdGgoKSArICJ8IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBpbGVkUXVlcmllcy5zaXplKCkgKyAifCIgKyBzcWwpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICAvKiBhZGQgdGhlIGdpdmVuIFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3RhdGVtZW50IHRvIGNhY2hlLgorICAgICAgICAgICAgICogbm8gbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgY2FjaGUgc2l6ZSAtIGJlY2F1c2Uge0BsaW5rICNtQ29tcGlsZWRRdWVyaWVzfQorICAgICAgICAgICAgICogc2VsZi1saW1pdHMgaXRzIHNpemUgdG8ge0BsaW5rICNtTWF4U3FsQ2FjaGVTaXplfS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbUNvbXBpbGVkUXVlcmllcy5wdXQoc3FsLCBjb21waWxlZFN0YXRlbWVudCk7CisgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAifGFkZGluZ19zcWxfdG9fY2FjaGV8IiArIGdldFBhdGgoKSArICJ8IiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLnNpemUoKSArICJ8IiArIHNxbCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwogICAgIH0KIAotCi0gICAgcHJpdmF0ZSB2b2lkIGRlYWxsb2NDYWNoZWRTcWxTdGF0ZW1lbnRzKCkgeworICAgIC8qKiBwYWNrYWdlLWxldmVsIGFjY2VzcyBmb3IgdGVzdGluZyBwdXJwb3NlcyAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBkZWFsbG9jQ2FjaGVkU3FsU3RhdGVtZW50cygpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtQ29tcGlsZWRRdWVyaWVzKSB7CiAgICAgICAgICAgICBmb3IgKFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3FsIDogbUNvbXBpbGVkUXVlcmllcy52YWx1ZXMoKSkgewogICAgICAgICAgICAgICAgIGNvbXBpbGVkU3FsLnJlbGVhc2VTcWxTdGF0ZW1lbnQoKTsKQEAgLTIwMzksMjAgKzIxMDYsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBmcm9tIHRoZSBjb21waWxlZFF1ZXJpZXMgY2FjaGUsIHJldHVybnMgdGhlIGNvbXBpbGVkLXN0YXRlbWVudC1pZCBmb3IgdGhlIGdpdmVuIHNxbC4KLSAgICAgKiByZXR1cm5zIG51bGwsIGlmIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUuCisgICAgICogRnJvbSB0aGUgY29tcGlsZWRRdWVyaWVzIGNhY2hlLCByZXR1cm5zIHRoZSBjb21waWxlZC1zdGF0ZW1lbnQtaWQgZm9yIHRoZSBnaXZlbiBTUUwuCisgICAgICogUmV0dXJucyBudWxsLCBpZiBub3QgZm91bmQgaW4gdGhlIGNhY2hlLgogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlQ29tcGlsZWRTcWwgZ2V0Q29tcGlsZWRTdGF0ZW1lbnRGb3JTcWwoU3RyaW5nIHNxbCkgewogICAgICAgICBTUUxpdGVDb21waWxlZFNxbCBjb21waWxlZFN0YXRlbWVudCA9IG51bGw7CiAgICAgICAgIGJvb2xlYW4gY2FjaGVIaXQ7CiAgICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7Ci0gICAgICAgICAgICBpZiAobU1heFNxbENhY2hlU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gZm9yIHRoaXMgZGF0YWJhc2UsIHRoZXJlIGlzIG5vIGNhY2hlIG9mIGNvbXBpbGVkIHNxbC4KLSAgICAgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgInxjYWNoZSBOT1QgZm91bmR8IiArIGdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FjaGVIaXQgPSAoY29tcGlsZWRTdGF0ZW1lbnQgPSBtQ29tcGlsZWRRdWVyaWVzLmdldChzcWwpKSAhPSBudWxsOwogICAgICAgICB9CiAgICAgICAgIGlmIChjYWNoZUhpdCkgewpAQCAtMjA2NSw2MyArMjEyNSwyNCBAQAogICAgICAgICAgICAgTG9nLnYoVEFHLCAifGNhY2hlX3N0YXRzfCIgKwogICAgICAgICAgICAgICAgICAgICBnZXRQYXRoKCkgKyAifCIgKyBtQ29tcGlsZWRRdWVyaWVzLnNpemUoKSArCiAgICAgICAgICAgICAgICAgICAgICJ8IiArIG1OdW1DYWNoZUhpdHMgKyAifCIgKyBtTnVtQ2FjaGVNaXNzZXMgKwotICAgICAgICAgICAgICAgICAgICAifCIgKyBjYWNoZUhpdCArICJ8IiArIG1UaW1lT3BlbmVkICsgInwiICsgbVRpbWVDbG9zZWQgKyAifCIgKyBzcWwpOworICAgICAgICAgICAgICAgICAgICAifCIgKyBjYWNoZUhpdCArICJ8IiArIHNxbCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNvbXBpbGVkU3RhdGVtZW50OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3FsIGlzIGNhY2hlZCBpbiBjb21waWxlZC1zcWwgY2FjaGUuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luQ29tcGlsZWRTcWxDYWNoZShTdHJpbmcgc3FsKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbXBpbGVkUXVlcmllcy5jb250YWluc0tleShzcWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcHVyZ2VzIHRoZSBnaXZlbiBzcWwgZnJvbSB0aGUgY29tcGlsZWQtc3FsIGNhY2hlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHVyZ2VGcm9tQ29tcGlsZWRTcWxDYWNoZShTdHJpbmcgc3FsKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7Ci0gICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLnJlbW92ZShzcWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmVtb3ZlIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgY29tcGlsZWQgc3FsIGNhY2hlCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldENvbXBpbGVkU3FsQ2FjaGUoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7Ci0gICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm4gdGhlIGN1cnJlbnQgbWF4Q2FjaGVTcWxDYWNoZVNpemUKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldE1heFNxbENhY2hlU2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1NYXhTcWxDYWNoZVNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2V0IHRoZSBtYXggc2l6ZSBvZiB0aGUgY29tcGlsZWQgc3FsIGNhY2hlIGZvciB0aGlzIGRhdGFiYXNlIGFmdGVyIHB1cmdpbmcgdGhlIGNhY2hlLgorICAgICAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgcHJlcGFyZWQtc3RhdGVtZW50IGNhY2hlIGZvciB0aGlzIGRhdGFiYXNlLgogICAgICAqIChzaXplIG9mIHRoZSBjYWNoZSA9IG51bWJlciBvZiBjb21waWxlZC1zcWwtc3RhdGVtZW50cyBzdG9yZWQgaW4gdGhlIGNhY2hlKS4KKyAgICAgKjxwPgorICAgICAqIE1heGltdW0gY2FjaGUgc2l6ZSBjYW4gT05MWSBiZSBpbmNyZWFzZWQgZnJvbSBpdHMgY3VycmVudCBzaXplIChkZWZhdWx0ID0gMTApLgorICAgICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHNtYWxsZXIgc2l6ZSB0aGFuIHRoZSBjdXJyZW50IG1heGltdW0gdmFsdWUsCisgICAgICogdGhlbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgdGhyZWFkLXNhZmUuCiAgICAgICoKLSAgICAgKiBtYXggY2FjaGUgc2l6ZSBjYW4gT05MWSBiZSBpbmNyZWFzZWQgZnJvbSBpdHMgY3VycmVudCBzaXplIChkZWZhdWx0ID0gMCkuCi0gICAgICogaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggc21hbGxlciBzaXplIHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgbU1heFNxbENhY2hlU2l6ZSwKLSAgICAgKiB0aGVuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpcyB0aHJvd24KLSAgICAgKgotICAgICAqIHN5bmNocm9uaXplZCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdCB0aHJlYWRzIHRvIGNoYW5nZSBjYWNoZSBzaXplIGF0IHRoZSBzYW1lIHRpbWUuCi0gICAgICogQHBhcmFtIGNhY2hlU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUuIGNhbiBiZSAoMCB0byBNQVhfU1FMX0NBQ0hFX1NJWkUpCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgaW5wdXQgY2FjaGVTaXplID4gTUFYX1NRTF9DQUNIRV9TSVpFIG9yIDwgMCBvcgotICAgICAqIDwgdGhlIHZhbHVlIHNldCB3aXRoIHByZXZpb3VzIHNldE1heFNxbENhY2hlU2l6ZSgpIGNhbGwuCi0gICAgICoKLSAgICAgKiBAaGlkZQorICAgICAqIEBwYXJhbSBjYWNoZVNpemUgdGhlIHNpemUgb2YgdGhlIGNhY2hlLiBjYW4gYmUgKDAgdG8ge0BsaW5rICNNQVhfU1FMX0NBQ0hFX1NJWkV9KQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGlucHV0IGNhY2hlU2l6ZSA+IHtAbGluayAjTUFYX1NRTF9DQUNIRV9TSVpFfSBvcgorICAgICAqID4gdGhlIHZhbHVlIHNldCB3aXRoIHByZXZpb3VzIHNldE1heFNxbENhY2hlU2l6ZSgpIGNhbGwuCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldE1heFNxbENhY2hlU2l6ZShpbnQgY2FjaGVTaXplKSB7CiAgICAgICAgIGlmIChjYWNoZVNpemUgPiBNQVhfU1FMX0NBQ0hFX1NJWkUgfHwgY2FjaGVTaXplIDwgMCkgewpAQCAtMjEzMyw2MCArMjE1NCwzMDQgQEAKICAgICAgICAgbU1heFNxbENhY2hlU2l6ZSA9IGNhY2hlU2l6ZTsKICAgICB9CiAKLSAgICBzdGF0aWMgY2xhc3MgQWN0aXZlRGF0YWJhc2VzIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWN0aXZlRGF0YWJhc2VzIGFjdGl2ZURhdGFiYXNlcyA9IG5ldyBBY3RpdmVEYXRhYmFzZXMoKTsKLSAgICAgICAgcHJpdmF0ZSBIYXNoU2V0PFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+PiBtQWN0aXZlRGF0YWJhc2VzID0KLSAgICAgICAgICAgIG5ldyBIYXNoU2V0PFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+PigpOwotICAgICAgICBwcml2YXRlIEFjdGl2ZURhdGFiYXNlcygpIHt9IC8vIGRpc2FibGUgaW5zdGFudGlhdGlvbiBvZiB0aGlzIGNsYXNzCi0gICAgICAgIHN0YXRpYyBBY3RpdmVEYXRhYmFzZXMgZ2V0SW5zdGFuY2UoKSB7cmV0dXJuIGFjdGl2ZURhdGFiYXNlczt9CisgICAgLyogcGFja2FnZSAqLyBib29sZWFuIGlzU3FsSW5TdGF0ZW1lbnRDYWNoZShTdHJpbmcgc3FsKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUNvbXBpbGVkUXVlcmllcykgeworICAgICAgICAgICAgcmV0dXJuIG1Db21waWxlZFF1ZXJpZXMuY29udGFpbnNLZXkoc3FsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBmaW5hbGl6ZVN0YXRlbWVudExhdGVyKGludCBpZCkgeworICAgICAgICBpZiAoIWlzT3BlbigpKSB7CisgICAgICAgICAgICAvLyBkYXRhYmFzZSBhbHJlYWR5IGNsb3NlZC4gdGhpcyBzdGF0ZW1lbnQgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBmaW5hbGl6ZWQuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkKG1DbG9zZWRTdGF0ZW1lbnRJZHMpIHsKKyAgICAgICAgICAgIGlmIChtQ2xvc2VkU3RhdGVtZW50SWRzLmNvbnRhaW5zKGlkKSkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgc3RhdGVtZW50IGlkIGlzIGFscmVhZHkgcXVldWVkIHVwIGZvciBmaW5hbGl6YXRpb24uCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNsb3NlZFN0YXRlbWVudElkcy5hZGQoaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyB2b2lkIGNsb3NlUGVuZGluZ1N0YXRlbWVudHMoKSB7CisgICAgICAgIGlmICghaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgZGF0YWJhc2UgaXMgYWxyZWFkeSBjbG9zZWQsIG5vIG5lZWQgdG8gZmluYWxpemUgYW55dGhpbmcuCisgICAgICAgICAgICBtQ2xvc2VkU3RhdGVtZW50SWRzLmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdmVyaWZ5TG9ja093bmVyKCk7CisgICAgICAgIC8qIHRvIG1pbmltaXplIHN5bmNocm9uaXphdGlvbiBvbiBtQ2xvc2VkU3RhdGVtZW50SWRzLCBtYWtlIGEgY29weSBvZiB0aGUgbGlzdCAqLworICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4obUNsb3NlZFN0YXRlbWVudElkcy5zaXplKCkpOworICAgICAgICBzeW5jaHJvbml6ZWQobUNsb3NlZFN0YXRlbWVudElkcykgeworICAgICAgICAgICAgbGlzdC5hZGRBbGwobUNsb3NlZFN0YXRlbWVudElkcyk7CisgICAgICAgICAgICBtQ2xvc2VkU3RhdGVtZW50SWRzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gZmluYWxpemUgYWxsIHRoZSBzdGF0ZW1lbnRzIGZyb20gdGhlIGNvcGllZCBsaXN0CisgICAgICAgIGludCBzaXplID0gbGlzdC5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBuYXRpdmVfZmluYWxpemUobGlzdC5nZXQoaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZm9yIHRlc3Rpbmcgb25seQorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gQXJyYXlMaXN0PEludGVnZXI+IGdldFF1ZXVlZFVwU3RtdExpc3QoKSB7CisgICAgICAgIHJldHVybiBtQ2xvc2VkU3RhdGVtZW50SWRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGVuYWJsZXMgcGFyYWxsZWwgZXhlY3V0aW9uIG9mIHF1ZXJpZXMgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIG9uIHRoZSBzYW1lIGRhdGFiYXNlLgorICAgICAqIEl0IGRvZXMgdGhpcyBieSBvcGVuaW5nIG11bHRpcGxlIGhhbmRsZXMgdG8gdGhlIGRhdGFiYXNlIGFuZCB1c2luZyBhIGRpZmZlcmVudAorICAgICAqIGRhdGFiYXNlIGhhbmRsZSBmb3IgZWFjaCBxdWVyeS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHRyYW5zYWN0aW9uIGlzIGluIHByb2dyZXNzIG9uIG9uZSBjb25uZWN0aW9uIGhhbmRsZSBhbmQgc2F5LCBhIHRhYmxlIGlzIHVwZGF0ZWQgaW4gdGhlCisgICAgICogdHJhbnNhY3Rpb24sIHRoZW4gcXVlcnkgb24gdGhlIHNhbWUgdGFibGUgb24gYW5vdGhlciBjb25uZWN0aW9uIGhhbmRsZSB3aWxsIGJsb2NrIGZvciB0aGUKKyAgICAgKiB0cmFuc2FjdGlvbiB0byBjb21wbGV0ZS4gQnV0IHRoaXMgbWV0aG9kIGVuYWJsZXMgc3VjaCBxdWVyaWVzIHRvIGV4ZWN1dGUgYnkgaGF2aW5nIHRoZW0KKyAgICAgKiByZXR1cm4gb2xkIHZlcnNpb24gb2YgdGhlIGRhdGEgZnJvbSB0aGUgdGFibGUuIE1vc3Qgb2Z0ZW4gaXQgaXMgdGhlIGRhdGEgdGhhdCBleGlzdGVkIGluIHRoZQorICAgICAqIHRhYmxlIHByaW9yIHRvIHRoZSBhYm92ZSB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIHRoYXQgdGFibGUuCisgICAgICogPHA+CisgICAgICogTWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIGhhbmRsZXMgdXNlZCB0byBleGVjdXRlIHF1ZXJpZXMgaW4gcGFyYWxsZWwgaXMKKyAgICAgKiBkZXBlbmRlbnQgdXBvbiB0aGUgZGV2aWNlIG1lbW9yeSBhbmQgcG9zc2libHkgb3RoZXIgcHJvcGVydGllcy4KKyAgICAgKiA8cD4KKyAgICAgKiBBZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCBleGVjdXRpb24gb2YgcXVlcmllcyBpbiBwYXJhbGxlbCBpcyBlbmFibGVkIGFzIGxvbmcgYXMgdGhpcworICAgICAqIGRhdGFiYXNlIGhhbmRsZSBpcyBvcGVuLiBUbyBkaXNhYmxlIGV4ZWN1dGlvbiBvZiBxdWVyaWVzIGluIHBhcmFsbGVsLCBkYXRhYmFzZSBzaG91bGQKKyAgICAgKiBiZSBjbG9zZWQgYW5kIHJlb3BlbmVkLgorICAgICAqIDxwPgorICAgICAqIElmIGEgcXVlcnkgaXMgcGFydCBvZiBhIHRyYW5zYWN0aW9uLCB0aGVuIGl0IGlzIGV4ZWN1dGVkIG9uIHRoZSBzYW1lIGRhdGFiYXNlIGhhbmRsZSB0aGUKKyAgICAgKiB0cmFuc2FjdGlvbiB3YXMgYmVndW4uCisgICAgICogPHA+CisgICAgICogSWYgdGhlIGRhdGFiYXNlIGhhcyBhbnkgYXR0YWNoZWQgZGF0YWJhc2VzLCB0aGVuIGV4ZWN1dGlvbiBvZiBxdWVyaWVzIGluIHBhcmFsZWwgaXMgTk9UCisgICAgICogcG9zc2libGUuIEluIHN1Y2ggY2FzZXMsIGEgbWVzc2FnZSBpcyBwcmludGVkIHRvIGxvZ2NhdCBhbmQgZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogPHA+CisgICAgICogVGhpcyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgZm9yIDptZW1vcnk6IGRhdGFiYXNlcy4gSW4gc3VjaCBjYXNlcywKKyAgICAgKiBhIG1lc3NhZ2UgaXMgcHJpbnRlZCB0byBsb2djYXQgYW5kIGZhbHNlIGlzIHJldHVybmVkLgorICAgICAqIDxwPgorICAgICAqIEEgdHlwaWNhbCB3YXkgdG8gdXNlIHRoaXMgbWV0aG9kIGlzIHRoZSBmb2xsb3dpbmc6CisgICAgICogPHByZT4KKyAgICAgKiAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuRGF0YWJhc2UoImRiX2ZpbGVuYW1lIiwgY3Vyc29yRmFjdG9yeSwKKyAgICAgKiAgICAgICAgICAgICBDUkVBVEVfSUZfTkVDRVNTQVJZLCBteURhdGFiYXNlRXJyb3JIYW5kbGVyKTsKKyAgICAgKiAgICAgZGIuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8cD4KKyAgICAgKiBXcml0ZXJzIHNob3VsZCB1c2Uge0BsaW5rICNiZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCl9IG9yCisgICAgICoge0BsaW5rICNiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyTm9uRXhjbHVzaXZlKFNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIpfQorICAgICAqIHRvIHN0YXJ0IGEgdHJzbnNhY3Rpb24uCisgICAgICogTm9uLWV4Y2x1c2l2ZSBtb2RlIGFsbG93cyBkYXRhYmFzZSBmaWxlIHRvIGJlIGluIHJlYWRhYmxlIGJ5IHRocmVhZHMgZXhlY3V0aW5nIHF1ZXJpZXMuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHdyaXRlLWFoZWFkLWxvZ2dpbmcgaXMgc2V0LiBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKSB7CisgICAgICAgIGlmIChtUGF0aC5lcXVhbHNJZ25vcmVDYXNlKE1FTU9SWV9EQl9QQVRIKSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiY2FuJ3QgZW5hYmxlIFdBTCBmb3IgbWVtb3J5IGRhdGFiYXNlcy4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGlzIGRhdGFiYXNlIGhhcyBOTyBhdHRhY2hlZCBkYXRhYmFzZXMgYmVjYXVzZSBzcWxpdGUncyB3cml0ZS1haGVhZC1sb2dnaW5nCisgICAgICAgIC8vIGRvZXNuJ3Qgd29yayBmb3IgZGF0YWJhc2VzIHdpdGggYXR0YWNoZWQgZGF0YWJhc2VzCisgICAgICAgIGlmIChnZXRBdHRhY2hlZERicygpLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBkYXRhYmFzZTogIiArIG1QYXRoICsgIiBoYXMgYXR0YWNoZWQgZGF0YWJhc2VzLiBjYW4ndCAgZW5hYmxlIFdBTC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNvbm5lY3Rpb25Qb29sID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Db25uZWN0aW9uUG9vbCA9IG5ldyBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sKHRoaXMpOworICAgICAgICAgICAgc2V0Sm91cm5hbE1vZGUobVBhdGgsICJXQUwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBkaXNhYmxlcyB0aGUgZmVhdHVyZXMgZW5hYmxlZCBieSB7QGxpbmsgI2VuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCl9LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvblBvb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25uZWN0aW9uUG9vbC5jbG9zZSgpOworICAgICAgICAgICAgbUNvbm5lY3Rpb25Qb29sID0gbnVsbDsKKyAgICAgICAgICAgIHNldEpvdXJuYWxNb2RlKG1QYXRoLCAiVFJVTkNBVEUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlRGF0YWJhc2UgZ2V0RGF0YWJhc2VIYW5kbGUoU3RyaW5nIHNxbCkgeworICAgICAgICBpZiAoaXNQb29sZWRDb25uZWN0aW9uKCkpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgICAgICAgLy8gdXNlIGl0IGlmIGl0IGlzIG9wZW4gQU5EIGlmIEkgYW0gbm90IGN1cnJlbnRseSBwYXJ0IG9mIGEgdHJhbnNhY3Rpb24KKyAgICAgICAgICAgIGlmIChpc09wZW4oKSAmJiAhYW1JSW5UcmFuc2FjdGlvbigpKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogdXNlIGFub3RoZXIgY29ubmVjdGlvbiBmcm9tIHRoZSBwb29sCisgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBjb25uZWN0aW9uIGlzIGN1cnJlbnRseSBpbiB1c2UgYnkgc29tZSBvdGhlciB0aHJlYWQKKyAgICAgICAgICAgICAgICAvLyBBTkQgaWYgdGhlcmUgYXJlIGZyZWUgY29ubmVjdGlvbnMgaW4gdGhlIHBvb2wKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gdGhlIHBvb2xlZCBjb25uZWN0aW9uIGlzIG5vdCBvcGVuISBjb3VsZCBoYXZlIGJlZW4gY2xvc2VkIGVpdGhlciBkdWUKKyAgICAgICAgICAgICAgICAvLyB0byBjb3JydXB0aW9uIG9uIHRoaXMgb3Igc29tZSBvdGhlciBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZQorICAgICAgICAgICAgICAgIC8vIE9SLCBtYXliZSB0aGUgY29ubmVjdGlvbiBwb29sIGlzIGRpc2FibGVkIGFmdGVyIHRoaXMgY29ubmVjdGlvbiBoYXMgYmVlbgorICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZCB0byBtZS4gdHJ5IHRvIGdldCBzb21lIG90aGVyIHBvb2xlZCBvciBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UGFyZW50RGJDb25uT2JqKCkuZ2V0RGJDb25uZWN0aW9uKHNxbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB0aGlzIGlzIE5PVCBhIHBvb2xlZCBjb25uZWN0aW9uLiBjYW4gd2UgZ2V0IG9uZT8KKyAgICAgICAgICAgIHJldHVybiBnZXREYkNvbm5lY3Rpb24oc3FsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlIHBvb2wgc2l6ZSB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICogRGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUgcG9vbCBpcyBlbmFibGVkIHdoZW4gdGhlIGFwcCBjYWxscworICAgICAqIHtAbGluayAjZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKX0uCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgY29ubmVjdGlvbiBoYW5kbGUgcG9vbCBpcyBzZXQgYnkgdGhlIHN5c3RlbSBieSB0YWtpbmcgaW50byBhY2NvdW50IHZhcmlvdXMKKyAgICAgKiBhc3BlY3RzIG9mIHRoZSBkZXZpY2UsIHN1Y2ggYXMgbWVtb3J5LCBudW1iZXIgb2YgY29yZXMgZXRjLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0CisgICAgICogYXBwbGljYXRpb25zIHVzZSB0aGUgZGVmYXVsdCBwb29sIHNpemUgc2V0IGJ5IHRoZSBzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgdmFsdWUgdGhlIGNvbm5lY3Rpb24gaGFuZGxlIHBvb2wgc2l6ZSBzaG91bGQgYmUgc2V0IHRvLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRDb25uZWN0aW9uUG9vbFNpemUoaW50IHNpemUpIHsKKyAgICAgICAgaWYgKG1Db25uZWN0aW9uUG9vbCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb25uZWN0aW9uIHBvb2wgbm90IGVuYWJsZWQiKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgaSA9IG1Db25uZWN0aW9uUG9vbC5nZXRNYXhQb29sU2l6ZSgpOworICAgICAgICBpZiAoc2l6ZSA8IGkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc2V0IG1heCBwb29sIHNpemUgdG8gYSB2YWx1ZSBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgbWF4IHZhbHVlKD0iICsKKyAgICAgICAgICAgICAgICAgICAgaSArICIpIik7CisgICAgICAgIH0KKyAgICAgICAgbUNvbm5lY3Rpb25Qb29sLnNldE1heFBvb2xTaXplKHNpemUpOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlRGF0YWJhc2UgY3JlYXRlUG9vbENvbm5lY3Rpb24oc2hvcnQgY29ubmVjdGlvbk51bSkgeworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG9wZW5EYXRhYmFzZShtUGF0aCwgbUZhY3RvcnksIG1GbGFncywgbUVycm9ySGFuZGxlciwgY29ubmVjdGlvbk51bSk7CisgICAgICAgIGRiLm1QYXJlbnRDb25uT2JqID0gdGhpczsKKyAgICAgICAgcmV0dXJuIGRiOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIFNRTGl0ZURhdGFiYXNlIGdldFBhcmVudERiQ29ubk9iaigpIHsKKyAgICAgICAgcmV0dXJuIG1QYXJlbnRDb25uT2JqOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1Bvb2xlZENvbm5lY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1Db25uZWN0aW9uTnVtID4gMDsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZURhdGFiYXNlIGdldERiQ29ubmVjdGlvbihTdHJpbmcgc3FsKSB7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CisgICAgICAgIC8vIHRoaXMgbWV0aG9kIHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIHdpdGggbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZQorICAgICAgICAvLyBORVZFUiB3aXRoIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZQorICAgICAgICBpZiAoaXNQb29sZWRDb25uZWN0aW9uKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImluY29ycmVjdCBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdXNlIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gaGFuZGxlIGlmCisgICAgICAgIC8vIDEuIGlmIHRoZSBjYWxsZXIgaXMgcGFydCBvZiB0aGUgb25nb2luZyB0cmFuc2FjdGlvbiwgaWYgYW55CisgICAgICAgIC8vIDIuIE9SLCBpZiB0aGVyZSBpcyBOTyBjb25uZWN0aW9uIGhhbmRsZSBwb29sIHNldHVwCisgICAgICAgIGlmIChhbUlJblRyYW5zYWN0aW9uKCkgfHwgbUNvbm5lY3Rpb25Qb29sID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gZ2V0IGEgY29ubmVjdGlvbiBoYW5kbGUgZnJvbSB0aGUgcG9vbAorICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIGFzc2VydCBtQ29ubmVjdGlvblBvb2wgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsIG1Db25uZWN0aW9uUG9vbC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGlvblBvb2wuZ2V0KHNxbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVsZWFzZURiQ29ubmVjdGlvbihTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICAvLyBpZ25vcmUgdGhpcyByZWxlYXNlIGNhbGwgaWYKKyAgICAgICAgLy8gMS4gdGhlIGRhdGFiYXNlIGlzIGNsb3NlZAorICAgICAgICAvLyAyLiBPUiwgaWYgZGIgaXMgTk9UIGEgcG9vbGVkIGNvbm5lY3Rpb24gaGFuZGxlCisgICAgICAgIC8vIDMuIE9SLCBpZiB0aGUgZGF0YWJhc2UgYmVpbmcgcmVsZWFzZWQgaXMgc2FtZSBhcyAndGhpcycgKHRoaXMgY29uZGl0aW9uIG1lYW5zCisgICAgICAgIC8vICAgICB0aGF0IHdlIHNob3VsZCBhbHdheXMgYmUgcmVsZWFzaW5nIGEgcG9vbGVkIGNvbm5lY3Rpb24gaGFuZGxlIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2QKKyAgICAgICAgLy8gICAgIGZyb20gdGhlICdtYWluJyBjb25uZWN0aW9uIGhhbmRsZQorICAgICAgICBpZiAoIWlzT3BlbigpIHx8ICFkYi5pc1Bvb2xlZENvbm5lY3Rpb24oKSB8fCAoZGIgPT0gdGhpcykpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBhc3NlcnQgaXNQb29sZWRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBhc3NlcnQgbUNvbm5lY3Rpb25Qb29sICE9IG51bGw7CisgICAgICAgICAgICBMb2cuZChUQUcsICJyZWxlYXNlRGJDb25uZWN0aW9uIHRocmVhZGlkID0gIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArCisgICAgICAgICAgICAgICAgICAgICIsIHJlbGVhc2luZyAjICIgKyBkYi5tQ29ubmVjdGlvbk51bSArICIsICIgKyBnZXRQYXRoKCkpOworICAgICAgICB9CisgICAgICAgIG1Db25uZWN0aW9uUG9vbC5yZWxlYXNlKGRiKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNvbGxlY3QgZGF0YSBhYm91dCBBTEwgb3BlbiBkYXRhYmFzZXMgaW4gdGhlIGN1cnJlbnQgcHJvY2Vzcy4KLSAgICAgKiBidWdyZXBvcnQgaXMgYSB1c2VyIG9mIHRoaXMgZGF0YS4gCisgICAgICogYnVncmVwb3J0IGlzIGEgdXNlciBvZiB0aGlzIGRhdGEuCiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgQXJyYXlMaXN0PERiU3RhdHM+IGdldERiU3RhdHMoKSB7CiAgICAgICAgIEFycmF5TGlzdDxEYlN0YXRzPiBkYlN0YXRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8RGJTdGF0cz4oKTsKLSAgICAgICAgZm9yIChXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPiB3IDogQWN0aXZlRGF0YWJhc2VzLmdldEluc3RhbmNlKCkubUFjdGl2ZURhdGFiYXNlcykgeworICAgICAgICAvLyBtYWtlIGEgbG9jYWwgY29weSBvZiBtQWN0aXZlRGF0YWJhc2VzIC0gc28gdGhhdCB0aGlzIG1ldGhvZCBpcyBub3QgY29tcGV0aW5nCisgICAgICAgIC8vIGZvciBzeW5jaHJvbml6YXRpb24gbG9jayBvbiBtQWN0aXZlRGF0YWJhc2VzCisgICAgICAgIEFycmF5TGlzdDxXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPj4gdGVtcExpc3Q7CisgICAgICAgIHN5bmNocm9uaXplZChtQWN0aXZlRGF0YWJhc2VzKSB7CisgICAgICAgICAgICB0ZW1wTGlzdCA9IChBcnJheUxpc3Q8V2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4+KW1BY3RpdmVEYXRhYmFzZXMuY2xvbmUoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+IHcgOiB0ZW1wTGlzdCkgewogICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSB3LmdldCgpOwogICAgICAgICAgICAgaWYgKGRiID09IG51bGwgfHwgIWRiLmlzT3BlbigpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBnZXQgU1FMSVRFX0RCU1RBVFVTX0xPT0tBU0lERV9VU0VEIGZvciB0aGUgZGIKLSAgICAgICAgICAgIGludCBsb29rYXNpZGVVc2VkID0gZGIubmF0aXZlX2dldERiTG9va2FzaWRlKCk7CiAKLSAgICAgICAgICAgIC8vIGdldCB0aGUgbGFzdG5vZGUgb2YgdGhlIGRibmFtZQotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkYi5nZXRQYXRoKCk7Ci0gICAgICAgICAgICBpbnQgaW5keCA9IHBhdGgubGFzdEluZGV4T2YoIi8iKTsKLSAgICAgICAgICAgIFN0cmluZyBsYXN0bm9kZSA9IHBhdGguc3Vic3RyaW5nKChpbmR4ICE9IC0xKSA/ICsraW5keCA6IDApOworICAgICAgICAgICAgc3luY2hyb25pemVkIChkYikgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGdldCBTUUxJVEVfREJTVEFUVVNfTE9PS0FTSURFX1VTRUQgZm9yIHRoZSBkYgorICAgICAgICAgICAgICAgICAgICBpbnQgbG9va2FzaWRlVXNlZCA9IGRiLm5hdGl2ZV9nZXREYkxvb2thc2lkZSgpOwogCi0gICAgICAgICAgICAvLyBnZXQgbGlzdCBvZiBhdHRhY2hlZCBkYnMgYW5kIGZvciBlYWNoIGRiLCBnZXQgaXRzIHNpemUgYW5kIHBhZ2VzaXplCi0gICAgICAgICAgICBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGF0dGFjaGVkRGJzID0gZ2V0QXR0YWNoZWREYnMoZGIpOwotICAgICAgICAgICAgaWYgKGF0dGFjaGVkRGJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0YWNoZWREYnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQYWlyPFN0cmluZywgU3RyaW5nPiBwID0gYXR0YWNoZWREYnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGxvbmcgcGFnZUNvdW50ID0gZ2V0UHJhZ21hVmFsKGRiLCBwLmZpcnN0ICsgIi5wYWdlX2NvdW50OyIpOworICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGxhc3Rub2RlIG9mIHRoZSBkYm5hbWUKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkYi5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgIGludCBpbmR4ID0gcGF0aC5sYXN0SW5kZXhPZigiLyIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFzdG5vZGUgPSBwYXRoLnN1YnN0cmluZygoaW5keCAhPSAtMSkgPyArK2luZHggOiAwKTsKIAotICAgICAgICAgICAgICAgIC8vIGZpcnN0IGVudHJ5IGluIHRoZSBhdHRhY2hlZCBkYiBsaXN0IGlzIGFsd2F5cyB0aGUgbWFpbiBkYXRhYmFzZQotICAgICAgICAgICAgICAgIC8vIGRvbid0IHdvcnJ5IGFib3V0IHByZWZpeGluZyB0aGUgZGJuYW1lIHdpdGggIm1haW4iCi0gICAgICAgICAgICAgICAgU3RyaW5nIGRiTmFtZTsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRiTmFtZSA9IGxhc3Rub2RlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGxvb2thc2lkZSBpcyBvbmx5IHJlbGV2YW50IGZvciB0aGUgbWFpbiBkYgotICAgICAgICAgICAgICAgICAgICBsb29rYXNpZGVVc2VkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZGJOYW1lID0gIiAgKGF0dGFjaGVkKSAiICsgcC5maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGF0dGFjaGVkIGRiIGhhcyBhIHBhdGgsIGF0dGFjaCB0aGUgbGFzdG5vZGUgZnJvbSB0aGUgcGF0aCB0byBhYm92ZQotICAgICAgICAgICAgICAgICAgICBpZiAocC5zZWNvbmQudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IHAuc2Vjb25kLmxhc3RJbmRleE9mKCIvIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYk5hbWUgKz0gIiA6ICIgKyBwLnNlY29uZC5zdWJzdHJpbmcoKGlkeCAhPSAtMSkgPyArK2lkeCA6IDApOworICAgICAgICAgICAgICAgICAgICAvLyBnZXQgbGlzdCBvZiBhdHRhY2hlZCBkYnMgYW5kIGZvciBlYWNoIGRiLCBnZXQgaXRzIHNpemUgYW5kIHBhZ2VzaXplCisgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gYXR0YWNoZWREYnMgPSBkYi5nZXRBdHRhY2hlZERicygpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNoZWREYnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBhZ2VDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGJTdGF0c0xpc3QuYWRkKG5ldyBEYlN0YXRzKGRiTmFtZSwgcGFnZUNvdW50LCBkYi5nZXRQYWdlU2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thc2lkZVVzZWQpKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRhY2hlZERicy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgUGFpcjxTdHJpbmcsIFN0cmluZz4gcCA9IGF0dGFjaGVkRGJzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcGFnZUNvdW50ID0gRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkoZGIsICJQUkFHTUEgIiArIHAuZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLnBhZ2VfY291bnQ7IiwgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGVudHJ5IGluIHRoZSBhdHRhY2hlZCBkYiBsaXN0IGlzIGFsd2F5cyB0aGUgbWFpbiBkYXRhYmFzZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qgd29ycnkgYWJvdXQgcHJlZml4aW5nIHRoZSBkYm5hbWUgd2l0aCAibWFpbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkYk5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJOYW1lID0gbGFzdG5vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb2thc2lkZSBpcyBvbmx5IHJlbGV2YW50IGZvciB0aGUgbWFpbiBkYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thc2lkZVVzZWQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiTmFtZSA9ICIgIChhdHRhY2hlZCkgIiArIHAuZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGF0dGFjaGVkIGRiIGhhcyBhIHBhdGgsIGF0dGFjaCB0aGUgbGFzdG5vZGUgZnJvbSB0aGUgcGF0aCB0byBhYm92ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLnNlY29uZC50cmltKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSBwLnNlY29uZC5sYXN0SW5kZXhPZigiLyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYk5hbWUgKz0gIiA6ICIgKyBwLnNlY29uZC5zdWJzdHJpbmcoKGlkeCAhPSAtMSkgPyArK2lkeCA6IDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJTdGF0c0xpc3QuYWRkKG5ldyBEYlN0YXRzKGRiTmFtZSwgcGFnZUNvdW50LCBkYi5nZXRQYWdlU2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FzaWRlVXNlZCwgZGIubU51bUNhY2hlSGl0cywgZGIubU51bUNhY2hlTWlzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIubUNvbXBpbGVkUXVlcmllcy5zaXplKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgcG9vbGVkIGNvbm5lY3Rpb25zLCByZXR1cm4gdGhlIGNhY2hlIHN0YXRzIGZvciB0aGVtIGFsc28uCisgICAgICAgICAgICAgICAgICAgIGlmIChkYi5tQ29ubmVjdGlvblBvb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTUUxpdGVEYXRhYmFzZSBwRGIgOiBkYi5tQ29ubmVjdGlvblBvb2wuZ2V0Q29ubmVjdGlvbkxpc3QoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiU3RhdHNMaXN0LmFkZChuZXcgRGJTdGF0cygiKHBvb2xlZCAjICIgKyBwRGIubUNvbm5lY3Rpb25OdW0gKyAiKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxhc3Rub2RlLCAwLCAwLCAwLCBwRGIubU51bUNhY2hlSGl0cywgcERiLm1OdW1DYWNoZU1pc3NlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYi5tQ29tcGlsZWRRdWVyaWVzLnNpemUoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlLiB3ZSBkb24ndCBjYXJlIGFib3V0IGV4Y2VwdGlvbnMgd2hlbiB3ZSBhcmUgdGFraW5nIGFkYgorICAgICAgICAgICAgICAgICAgICAvLyBidWdyZXBvcnQhCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMTk0LDQ0ICsyNDU5LDc2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogZ2V0IHRoZSBzcGVjaWZpZWQgcHJhZ21hIHZhbHVlIGZyb20gc3FsaXRlIGZvciB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlLgotICAgICAqIG9ubHkgaGFuZGxlcyBwcmFnbWEncyB0aGF0IHJldHVybiBpbnQvbG9uZy4KLSAgICAgKiBOTyBKQVZBIGxvY2tzIGFyZSBoZWxkIGluIHRoaXMgbWV0aG9kLgotICAgICAqIFRPRE86IHVzZSB0aGlzIHRvIGRvIGFsbCBwcmFnbWEncyBpbiB0aGlzIGNsYXNzCisgICAgICogUmV0dXJucyBsaXN0IG9mIGZ1bGwgcGF0aG5hbWVzIG9mIGFsbCBhdHRhY2hlZCBkYXRhYmFzZXMgaW5jbHVkaW5nIHRoZSBtYWluIGRhdGFiYXNlCisgICAgICogYnkgZXhlY3V0aW5nICdwcmFnbWEgZGF0YWJhc2VfbGlzdCcgb24gdGhlIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHJldHVybiBBcnJheUxpc3Qgb2YgcGFpcnMgb2YgKGRhdGFiYXNlIG5hbWUsIGRhdGFiYXNlIGZpbGUgcGF0aCkgb3IgbnVsbCBpZiB0aGUgZGF0YWJhc2UKKyAgICAgKiBpcyBub3Qgb3Blbi4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldFByYWdtYVZhbChTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHByYWdtYSkgewotICAgICAgICBpZiAoIWRiLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9nID0gbmV3IFNRTGl0ZVN0YXRlbWVudChkYiwgIlBSQUdNQSAiICsgcHJhZ21hKTsKLSAgICAgICAgICAgIGxvbmcgdmFsID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgICAgIHJldHVybiB2YWw7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm5zIGxpc3Qgb2YgZnVsbCBwYXRobmFtZXMgb2YgYWxsIGF0dGFjaGVkIGRhdGFiYXNlcwotICAgICAqIGluY2x1ZGluZyB0aGUgbWFpbiBkYXRhYmFzZQotICAgICAqIFRPRE86IG1vdmUgdGhpcyB0byB7QGxpbmsgRGF0YWJhc2VVdGlsc30KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGdldEF0dGFjaGVkRGJzKFNRTGl0ZURhdGFiYXNlIGRiT2JqKSB7Ci0gICAgICAgIGlmICghZGJPYmouaXNPcGVuKCkpIHsKKyAgICBwdWJsaWMgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBnZXRBdHRhY2hlZERicygpIHsKKyAgICAgICAgaWYgKCFpc09wZW4oKSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IG5ldyBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgIEN1cnNvciBjID0gZGJPYmoucmF3UXVlcnkoInByYWdtYSBkYXRhYmFzZV9saXN0OyIsIG51bGwpOwotICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgICBhdHRhY2hlZERicy5hZGQobmV3IFBhaXI8U3RyaW5nLCBTdHJpbmc+KGMuZ2V0U3RyaW5nKDEpLCBjLmdldFN0cmluZygyKSkpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjID0gcmF3UXVlcnkoInByYWdtYSBkYXRhYmFzZV9saXN0OyIsIG51bGwpOworICAgICAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgLy8gc3FsaXRlIHJldHVybnMgYSByb3cgZm9yIGVhY2ggZGF0YWJhc2UgaW4gdGhlIHJldHVybmVkIGxpc3Qgb2YgZGF0YWJhc2VzLgorICAgICAgICAgICAgICAgIC8vICAgaW4gZWFjaCByb3csCisgICAgICAgICAgICAgICAgLy8gICAgICAgMXN0IGNvbHVtbiBpcyB0aGUgZGF0YWJhc2UgbmFtZSBzdWNoIGFzIG1haW4sIG9yIHRoZSBkYXRhYmFzZQorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSBzcGVjaWZpZWQgb24gdGhlICJBVFRBQ0giIGNvbW1hbmQKKyAgICAgICAgICAgICAgICAvLyAgICAgICAybmQgY29sdW1uIGlzIHRoZSBkYXRhYmFzZSBmaWxlIHBhdGguCisgICAgICAgICAgICAgICAgYXR0YWNoZWREYnMuYWRkKG5ldyBQYWlyPFN0cmluZywgU3RyaW5nPihjLmdldFN0cmluZygxKSwgYy5nZXRTdHJpbmcoMikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgYy5jbG9zZSgpOwogICAgICAgICByZXR1cm4gYXR0YWNoZWREYnM7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogUnVucyAncHJhZ21hIGludGVncml0eV9jaGVjaycgb24gdGhlIGdpdmVuIGRhdGFiYXNlIChhbmQgYWxsIHRoZSBhdHRhY2hlZCBkYXRhYmFzZXMpCisgICAgICogYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZGF0YWJhc2UgKGFuZCBhbGwgaXRzIGF0dGFjaGVkIGRhdGFiYXNlcykgcGFzcyBpbnRlZ3JpdHlfY2hlY2ssCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqPHA+CisgICAgICogSWYgdGhlIHJlc3VsdCBpcyBmYWxzZSwgdGhlbiB0aGlzIG1ldGhvZCBsb2dzIHRoZSBlcnJvcnMgcmVwb3J0ZWQgYnkgdGhlIGludGVncml0eV9jaGVjaworICAgICAqIGNvbW1hbmQgZXhlY3V0aW9uLgorICAgICAqPHA+CisgICAgICogTm90ZSB0aGF0ICdwcmFnbWEgaW50ZWdyaXR5X2NoZWNrJyBvbiBhIGRhdGFiYXNlIGNhbiB0YWtlIGEgbG9uZyB0aW1lLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBkYXRhYmFzZSAoYW5kIGFsbCBpdHMgYXR0YWNoZWQgZGF0YWJhc2VzKSBwYXNzIGludGVncml0eV9jaGVjaywKKyAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEYXRhYmFzZUludGVncml0eU9rKCkgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOworICAgICAgICBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGF0dGFjaGVkRGJzID0gZ2V0QXR0YWNoZWREYnMoKTsKKyAgICAgICAgaWYgKGF0dGFjaGVkRGJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlbGlzdCBmb3I6ICIgKyBnZXRQYXRoKCkgKyAiIGNvdWxkbid0ICIgKworICAgICAgICAgICAgICAgICAgICAiYmUgcmV0cmlldmVkLiBwcm9iYWJseSBiZWNhdXNlIHRoZSBkYXRhYmFzZSBpcyBjbG9zZWQiKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIGlzRGF0YWJhc2VDb3JydXB0ID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0YWNoZWREYnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBTdHJpbmc+IHAgPSBhdHRhY2hlZERicy5nZXQoaSk7CisgICAgICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHByb2cgPSBjb21waWxlU3RhdGVtZW50KCJQUkFHTUEgIiArIHAuZmlyc3QgKyAiLmludGVncml0eV9jaGVjaygxKTsiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcnNsdCA9IHByb2cuc2ltcGxlUXVlcnlGb3JTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJzbHQuZXF1YWxzSWdub3JlQ2FzZSgib2siKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpbnRlZ3JpdHlfY2hlY2tlciBmYWlsZWQgb24gbWFpbiBvciBhdHRhY2hlZCBkYXRhYmFzZXMKKyAgICAgICAgICAgICAgICAgICAgaXNEYXRhYmFzZUNvcnJ1cHQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJQUkFHTUEgaW50ZWdyaXR5X2NoZWNrIG9uICIgKyBwLnNlY29uZCArICIgcmV0dXJuZWQ6ICIgKyByc2x0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChwcm9nICE9IG51bGwpIHByb2cuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXNEYXRhYmFzZUNvcnJ1cHQ7CisgICAgfQorCisgICAgLyoqCiAgICAgICogTmF0aXZlIGNhbGwgdG8gb3BlbiB0aGUgZGF0YWJhc2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSBkYXRhYmFzZQpAQCAtMjIzOSw1MSArMjUzNiwzNCBAQAogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZGJvcGVuKFN0cmluZyBwYXRoLCBpbnQgZmxhZ3MpOwogCiAgICAgLyoqCi0gICAgICogTmF0aXZlIGNhbGwgdG8gc2V0dXAgdHJhY2luZyBvZiBhbGwgc3FsIHN0YXRlbWVudHMKKyAgICAgKiBOYXRpdmUgY2FsbCB0byBzZXR1cCB0cmFjaW5nIG9mIGFsbCBTUUwgc3RhdGVtZW50cwogICAgICAqCiAgICAgICogQHBhcmFtIHBhdGggdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGF0YWJhc2UKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbk51bSBjb25uZWN0aW9uIG51bWJlcjogMCAtIE4sIHdoZXJlIHRoZSBtYWluIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICBjb25uZWN0aW9uIGhhbmRsZSBpcyBudW1iZXJlZCAwIGFuZCB0aGUgY29ubmVjdGlvbiBoYW5kbGVzIGluIHRoZSBjb25uZWN0aW9uCisgICAgICogICAgICAgICAgICBwb29sIGFyZSBudW1iZXJlZCAxLi5OLgogICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhTdHJpbmcgcGF0aCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBlbmFibGVTcWxUcmFjaW5nKFN0cmluZyBwYXRoLCBzaG9ydCBjb25uZWN0aW9uTnVtKTsKIAogICAgIC8qKgotICAgICAqIE5hdGl2ZSBjYWxsIHRvIHNldHVwIHByb2ZpbGluZyBvZiBhbGwgc3FsIHN0YXRlbWVudHMuCisgICAgICogTmF0aXZlIGNhbGwgdG8gc2V0dXAgcHJvZmlsaW5nIG9mIGFsbCBTUUwgc3RhdGVtZW50cy4KICAgICAgKiBjdXJyZW50bHksIHNxbGl0ZSdzIHByb2ZpbGluZyA9IHByaW50aW5nIG9mIGV4ZWN1dGlvbi10aW1lCi0gICAgICogKHdhbGwtY2xvY2sgdGltZSkgb2YgZWFjaCBvZiB0aGUgc3FsIHN0YXRlbWVudHMsIGFzIHRoZXkKKyAgICAgKiAod2FsbC1jbG9jayB0aW1lKSBvZiBlYWNoIG9mIHRoZSBTUUwgc3RhdGVtZW50cywgYXMgdGhleQogICAgICAqIGFyZSBleGVjdXRlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBwYXRoIHRoZSBmdWxsIHBhdGggdG8gdGhlIGRhdGFiYXNlCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25OdW0gY29ubmVjdGlvbiBudW1iZXI6IDAgLSBOLCB3aGVyZSB0aGUgbWFpbiBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgY29ubmVjdGlvbiBoYW5kbGUgaXMgbnVtYmVyZWQgMCBhbmQgdGhlIGNvbm5lY3Rpb24gaGFuZGxlcyBpbiB0aGUgY29ubmVjdGlvbgorICAgICAqICAgICAgICAgICAgcG9vbCBhcmUgbnVtYmVyZWQgMS4uTi4KICAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFByb2ZpbGluZyhTdHJpbmcgcGF0aCk7Ci0KLSAgICAvKioKLSAgICAgKiBOYXRpdmUgY2FsbCB0byBleGVjdXRlIGEgcmF3IFNRTCBzdGF0ZW1lbnQuIHtAbGluayAjbG9ja30gbXVzdCBiZSBoZWxkCi0gICAgICogd2hlbiBjYWxsaW5nIHRoaXMgbWV0aG9kLgotICAgICAqCi0gICAgICogQHBhcmFtIHNxbCBUaGUgcmF3IFNRTCBzdHJpbmcKLSAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gbmF0aXZlIHZvaWQgbmF0aXZlX2V4ZWNTUUwoU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFByb2ZpbGluZyhTdHJpbmcgcGF0aCwgc2hvcnQgY29ubmVjdGlvbk51bSk7CiAKICAgICAvKioKICAgICAgKiBOYXRpdmUgY2FsbCB0byBzZXQgdGhlIGxvY2FsZS4gIHtAbGluayAjbG9ja30gbXVzdCBiZSBoZWxkIHdoZW4gY2FsbGluZwogICAgICAqIHRoaXMgbWV0aG9kLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICovCi0gICAgLyogcGFja2FnZSAqLyBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0TG9jYWxlKFN0cmluZyBsb2MsIGludCBmbGFncyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByb3cgSUQgb2YgdGhlIGxhc3Qgcm93IGluc2VydGVkIGludG8gdGhlIGRhdGFiYXNlLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcm93IElEIG9mIHRoZSBsYXN0IHJvdyBpbnNlcnRlZCBpbnRvIHRoZSBkYXRhYmFzZS4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIG5hdGl2ZSBsb25nIGxhc3RJbnNlcnRSb3coKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFuZ2VzIG1hZGUgaW4gdGhlIGxhc3Qgc3RhdGVtZW50IGV4ZWN1dGVkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYW5nZXMgbWFkZSBpbiB0aGUgbGFzdCBzdGF0ZW1lbnQgZXhlY3V0ZWQuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBuYXRpdmUgaW50IGxhc3RDaGFuZ2VDb3VudCgpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX3NldExvY2FsZShTdHJpbmcgbG9jLCBpbnQgZmxhZ3MpOwogCiAgICAgLyoqCiAgICAgICogcmV0dXJuIHRoZSBTUUxJVEVfREJTVEFUVVNfTE9PS0FTSURFX1VTRUQgZG9jdW1lbnRlZCBoZXJlCkBAIC0yMjkxLDQgKzI1NzEsMTEgQEAKICAgICAgKiBAcmV0dXJuIGludCB2YWx1ZSBvZiBTUUxJVEVfREJTVEFUVVNfTE9PS0FTSURFX1VTRUQKICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2dldERiTG9va2FzaWRlKCk7CisKKyAgICAvKioKKyAgICAgKiBmaW5hbGl6ZXMgdGhlIGdpdmVuIHN0YXRlbWVudCBpZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0ZW1lbnRJZCBzdGF0ZW1lbnQgdG8gYmUgZmluemxpZWQgYnkgc3FsaXRlCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfZmluYWxpemUoaW50IHN0YXRlbWVudElkKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlMmQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCisvKioKKyAqIFRocm93biBpZiAgdGhlIGRhdGFiYXNlIGVuZ2luZSB3YXMgdW5hYmxlIHRvIGFjcXVpcmUgdGhlCisgKiBkYXRhYmFzZSBsb2NrcyBpdCBuZWVkcyB0byBkbyBpdHMgam9iLiAgSWYgdGhlIHN0YXRlbWVudCBpcyBhIFtDT01NSVRdCisgKiBvciBvY2N1cnMgb3V0c2lkZSBvZiBhbiBleHBsaWNpdCB0cmFuc2FjdGlvbiwgdGhlbiB5b3UgY2FuIHJldHJ5IHRoZQorICogc3RhdGVtZW50LiAgSWYgdGhlIHN0YXRlbWVudCBpcyBub3QgYSBbQ09NTUlUXSBhbmQgb2NjdXJzIHdpdGhpbiBhCisgKiBleHBsaWNpdCB0cmFuc2FjdGlvbiB0aGVuIHlvdSBzaG91bGQgcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uIGJlZm9yZQorICogY29udGludWluZy4KKyAqLworcHVibGljIGNsYXNzIFNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4MjUzNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEZWJ1Zy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURlYnVnLmphdmEKaW5kZXggODljM2Y5Ni4uOTQ5NjA3OTEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEZWJ1Zy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEZWJ1Zy5qYXZhCkBAIC0xMzIsMTEgKzEzMiwxNiBAQAogICAgICAgICAvKiogZG9jdW1lbnRlZCBoZXJlIGh0dHA6Ly93d3cuc3FsaXRlLm9yZy9jM3JlZi9jX2Ric3RhdHVzX2xvb2thc2lkZV91c2VkLmh0bWwgKi8KICAgICAgICAgcHVibGljIGludCBsb29rYXNpZGU7CiAKLSAgICAgICAgcHVibGljIERiU3RhdHMoU3RyaW5nIGRiTmFtZSwgbG9uZyBwYWdlQ291bnQsIGxvbmcgcGFnZVNpemUsIGludCBsb29rYXNpZGUpIHsKKyAgICAgICAgLyoqIHN0YXRlbWVudCBjYWNoZSBzdGF0czogaGl0cy9taXNzZXMvY2FjaGVzaXplICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2FjaGU7CisKKyAgICAgICAgcHVibGljIERiU3RhdHMoU3RyaW5nIGRiTmFtZSwgbG9uZyBwYWdlQ291bnQsIGxvbmcgcGFnZVNpemUsIGludCBsb29rYXNpZGUsCisgICAgICAgICAgICBpbnQgaGl0cywgaW50IG1pc3NlcywgaW50IGNhY2hlc2l6ZSkgewogICAgICAgICAgICAgdGhpcy5kYk5hbWUgPSBkYk5hbWU7Ci0gICAgICAgICAgICB0aGlzLnBhZ2VTaXplID0gcGFnZVNpemU7CisgICAgICAgICAgICB0aGlzLnBhZ2VTaXplID0gcGFnZVNpemUgLyAxMDI0OwogICAgICAgICAgICAgZGJTaXplID0gKHBhZ2VDb3VudCAqIHBhZ2VTaXplKSAvIDEwMjQ7CiAgICAgICAgICAgICB0aGlzLmxvb2thc2lkZSA9IGxvb2thc2lkZTsKKyAgICAgICAgICAgIHRoaXMuY2FjaGUgPSBoaXRzICsgIi8iICsgbWlzc2VzICsgIi8iICsgY2FjaGVzaXplOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGlyZWN0Q3Vyc29yRHJpdmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGlyZWN0Q3Vyc29yRHJpdmVyLmphdmEKaW5kZXggMjE0NGZjMy4uZGUyZmNhOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURpcmVjdEN1cnNvckRyaXZlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEaXJlY3RDdXJzb3JEcml2ZXIuamF2YQpAQCAtMzksMTggKzM5LDE2IEBACiAKICAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgewogICAgICAgICAvLyBDb21waWxlIHRoZSBxdWVyeQotICAgICAgICBTUUxpdGVRdWVyeSBxdWVyeSA9IG5ldyBTUUxpdGVRdWVyeShtRGF0YWJhc2UsIG1TcWwsIDAsIHNlbGVjdGlvbkFyZ3MpOworICAgICAgICBTUUxpdGVRdWVyeSBxdWVyeSA9IG51bGw7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEFyZyBiaW5kaW5nCi0gICAgICAgICAgICBpbnQgbnVtQXJncyA9IHNlbGVjdGlvbkFyZ3MgPT0gbnVsbCA/IDAgOiBzZWxlY3Rpb25BcmdzLmxlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcXVlcnkuYmluZFN0cmluZyhpICsgMSwgc2VsZWN0aW9uQXJnc1tpXSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtRGF0YWJhc2UubG9jaygpOworICAgICAgICAgICAgbURhdGFiYXNlLmNsb3NlUGVuZGluZ1N0YXRlbWVudHMoKTsKKyAgICAgICAgICAgIHF1ZXJ5ID0gbmV3IFNRTGl0ZVF1ZXJ5KG1EYXRhYmFzZSwgbVNxbCwgMCwgc2VsZWN0aW9uQXJncyk7CiAKICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY3Vyc29yCiAgICAgICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvciA9IG5ldyBTUUxpdGVDdXJzb3IobURhdGFiYXNlLCB0aGlzLCBtRWRpdFRhYmxlLCBxdWVyeSk7CisgICAgICAgICAgICAgICAgbUN1cnNvciA9IG5ldyBTUUxpdGVDdXJzb3IodGhpcywgbUVkaXRUYWJsZSwgcXVlcnkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtQ3Vyc29yID0gZmFjdG9yeS5uZXdDdXJzb3IobURhdGFiYXNlLCB0aGlzLCBtRWRpdFRhYmxlLCBxdWVyeSk7CiAgICAgICAgICAgICB9CkBAIC02MSw2ICs1OSw3IEBACiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyBvYmplY3QgaXMgY2xlYW5lZCB1cCBpZiBzb21ldGhpbmcgaGFwcGVucwogICAgICAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHF1ZXJ5LmNsb3NlKCk7CisgICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY5LDEwICs2OCw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0QmluZEFyZ3VtZW50cyhTdHJpbmdbXSBiaW5kQXJncykgewotICAgICAgICBmaW5hbCBpbnQgbnVtQXJncyA9IGJpbmRBcmdzLmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKLSAgICAgICAgICAgIG1RdWVyeS5iaW5kU3RyaW5nKGkgKyAxLCBiaW5kQXJnc1tpXSk7Ci0gICAgICAgIH0KKyAgICAgICAgbVF1ZXJ5LmJpbmRBbGxBcmdzQXNTdHJpbmdzKGJpbmRBcmdzKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBjdXJzb3JEZWFjdGl2YXRlZCgpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPcGVuSGVscGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3BlbkhlbHBlci5qYXZhCmluZGV4IGI0NjE1ZWIuLmNjZjhkNjggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPcGVuSGVscGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU9wZW5IZWxwZXIuamF2YQpAQCAtMTcsNiArMTcsOCBAQAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCkBAIC01MSw2ICs1Myw3IEBACiAKICAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0luaXRpYWxpemluZyA9IGZhbHNlOworICAgIHByaXZhdGUgZmluYWwgRGF0YWJhc2VFcnJvckhhbmRsZXIgbUVycm9ySGFuZGxlcjsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIGhlbHBlciBvYmplY3QgdG8gY3JlYXRlLCBvcGVuLCBhbmQvb3IgbWFuYWdlIGEgZGF0YWJhc2UuCkBAIC02NSwxMiArNjgsMzcgQEAKICAgICAgKiAgICAge0BsaW5rICNvblVwZ3JhZGV9IHdpbGwgYmUgdXNlZCB0byB1cGdyYWRlIHRoZSBkYXRhYmFzZQogICAgICAqLwogICAgIHB1YmxpYyBTUUxpdGVPcGVuSGVscGVyKENvbnRleHQgY29udGV4dCwgU3RyaW5nIG5hbWUsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IHZlcnNpb24pIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBuYW1lLCBmYWN0b3J5LCB2ZXJzaW9uLCBuZXcgRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGhlbHBlciBvYmplY3QgdG8gY3JlYXRlLCBvcGVuLCBhbmQvb3IgbWFuYWdlIGEgZGF0YWJhc2UuCisgICAgICogVGhlIGRhdGFiYXNlIGlzIG5vdCBhY3R1YWxseSBjcmVhdGVkIG9yIG9wZW5lZCB1bnRpbCBvbmUgb2YKKyAgICAgKiB7QGxpbmsgI2dldFdyaXRhYmxlRGF0YWJhc2V9IG9yIHtAbGluayAjZ2V0UmVhZGFibGVEYXRhYmFzZX0gaXMgY2FsbGVkLgorICAgICAqCisgICAgICogPHA+QWNjZXB0cyBpbnB1dCBwYXJhbTogYSBjb25jcmV0ZSBpbnN0YW5jZSBvZiB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlCisgICAgICogdXNlZCB0byBoYW5kbGUgY29ycnVwdGlvbiB3aGVuIHNxbGl0ZSByZXBvcnRzIGRhdGFiYXNlIGNvcnJ1cHRpb24uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdG8gdXNlIHRvIG9wZW4gb3IgY3JlYXRlIHRoZSBkYXRhYmFzZQorICAgICAqIEBwYXJhbSBuYW1lIG9mIHRoZSBkYXRhYmFzZSBmaWxlLCBvciBudWxsIGZvciBhbiBpbi1tZW1vcnkgZGF0YWJhc2UKKyAgICAgKiBAcGFyYW0gZmFjdG9yeSB0byB1c2UgZm9yIGNyZWF0aW5nIGN1cnNvciBvYmplY3RzLCBvciBudWxsIGZvciB0aGUgZGVmYXVsdAorICAgICAqIEBwYXJhbSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZGF0YWJhc2UgKHN0YXJ0aW5nIGF0IDEpOyBpZiB0aGUgZGF0YWJhc2UgaXMgb2xkZXIsCisgICAgICogICAgIHtAbGluayAjb25VcGdyYWRlfSB3aWxsIGJlIHVzZWQgdG8gdXBncmFkZSB0aGUgZGF0YWJhc2UKKyAgICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyIHRoZSB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlIHVzZWQgd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZQorICAgICAqIGNvcnJ1cHRpb24uCisgICAgICovCisgICAgcHVibGljIFNRTGl0ZU9wZW5IZWxwZXIoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmFtZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgdmVyc2lvbiwKKyAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgewogICAgICAgICBpZiAodmVyc2lvbiA8IDEpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZlcnNpb24gbXVzdCBiZSA+PSAxLCB3YXMgIiArIHZlcnNpb24pOworICAgICAgICBpZiAoZXJyb3JIYW5kbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkRhdGFiYXNlRXJyb3JIYW5kbGVyIHBhcmFtIHZhbHVlIGNhbid0IGJlIG51bGwuIik7CisgICAgICAgIH0KIAogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1OYW1lID0gbmFtZTsKICAgICAgICAgbUZhY3RvcnkgPSBmYWN0b3J5OwogICAgICAgICBtTmV3VmVyc2lvbiA9IHZlcnNpb247CisgICAgICAgIG1FcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXI7CiAgICAgfQogCiAgICAgLyoqCkBAIC05Myw4ICsxMjEsMTMgQEAKICAgICAgKiBAcmV0dXJuIGEgcmVhZC93cml0ZSBkYXRhYmFzZSBvYmplY3QgdmFsaWQgdW50aWwge0BsaW5rICNjbG9zZX0gaXMgY2FsbGVkCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTUUxpdGVEYXRhYmFzZSBnZXRXcml0YWJsZURhdGFiYXNlKCkgewotICAgICAgICBpZiAobURhdGFiYXNlICE9IG51bGwgJiYgbURhdGFiYXNlLmlzT3BlbigpICYmICFtRGF0YWJhc2UuaXNSZWFkT25seSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURhdGFiYXNlOyAgLy8gVGhlIGRhdGFiYXNlIGlzIGFscmVhZHkgb3BlbiBmb3IgYnVzaW5lc3MKKyAgICAgICAgaWYgKG1EYXRhYmFzZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgeworICAgICAgICAgICAgICAgIC8vIGRhcm4hIHRoZSB1c2VyIGNsb3NlZCB0aGUgZGF0YWJhc2UgYnkgY2FsbGluZyBtRGF0YWJhc2UuY2xvc2UoKQorICAgICAgICAgICAgICAgIG1EYXRhYmFzZSA9IG51bGw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFtRGF0YWJhc2UuaXNSZWFkT25seSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1EYXRhYmFzZTsgIC8vIFRoZSBkYXRhYmFzZSBpcyBhbHJlYWR5IG9wZW4gZm9yIGJ1c2luZXNzCisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobUlzSW5pdGlhbGl6aW5nKSB7CkBAIC0xMTUsMTAgKzE0OCwxNCBAQAogICAgICAgICAgICAgaWYgKG1OYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBkYiA9IFNRTGl0ZURhdGFiYXNlLmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGIgPSBtQ29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShtTmFtZSwgMCwgbUZhY3RvcnkpOworICAgICAgICAgICAgICAgIGRiID0gbUNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UobU5hbWUsIDAsIG1GYWN0b3J5LCBtRXJyb3JIYW5kbGVyKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50IHZlcnNpb24gPSBkYi5nZXRWZXJzaW9uKCk7CisgICAgICAgICAgICBpZiAodmVyc2lvbiA+IG1OZXdWZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRGF0YWJhc2UgIiArIG1OYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgY2Fubm90IGJlIGRvd25ncmFkZWQuIGluc3RlYWQsIHBsZWFzZSB1bmluc3RhbGwgbmV3IHZlcnNpb24gZmlyc3QuIik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodmVyc2lvbiAhPSBtTmV3VmVyc2lvbikgewogICAgICAgICAgICAgICAgIGRiLmJlZ2luVHJhbnNhY3Rpb24oKTsKICAgICAgICAgICAgICAgICB0cnkgewpAQCAtMTc1LDggKzIxMiwxMyBAQAogICAgICAqICAgICBvciB7QGxpbmsgI2Nsb3NlfSBpcyBjYWxsZWQuCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTUUxpdGVEYXRhYmFzZSBnZXRSZWFkYWJsZURhdGFiYXNlKCkgewotICAgICAgICBpZiAobURhdGFiYXNlICE9IG51bGwgJiYgbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURhdGFiYXNlOyAgLy8gVGhlIGRhdGFiYXNlIGlzIGFscmVhZHkgb3BlbiBmb3IgYnVzaW5lc3MKKyAgICAgICAgaWYgKG1EYXRhYmFzZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgeworICAgICAgICAgICAgICAgIC8vIGRhcm4hIHRoZSB1c2VyIGNsb3NlZCB0aGUgZGF0YWJhc2UgYnkgY2FsbGluZyBtRGF0YWJhc2UuY2xvc2UoKQorICAgICAgICAgICAgICAgIG1EYXRhYmFzZSA9IG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBtRGF0YWJhc2U7ICAvLyBUaGUgZGF0YWJhc2UgaXMgYWxyZWFkeSBvcGVuIGZvciBidXNpbmVzcworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1Jc0luaXRpYWxpemluZykgewpAQCAtMTk0LDcgKzIzNiw4IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtSXNJbml0aWFsaXppbmcgPSB0cnVlOwogICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBtQ29udGV4dC5nZXREYXRhYmFzZVBhdGgobU5hbWUpLmdldFBhdGgoKTsKLSAgICAgICAgICAgIGRiID0gU1FMaXRlRGF0YWJhc2Uub3BlbkRhdGFiYXNlKHBhdGgsIG1GYWN0b3J5LCBTUUxpdGVEYXRhYmFzZS5PUEVOX1JFQURPTkxZKTsKKyAgICAgICAgICAgIGRiID0gU1FMaXRlRGF0YWJhc2Uub3BlbkRhdGFiYXNlKHBhdGgsIG1GYWN0b3J5LCBTUUxpdGVEYXRhYmFzZS5PUEVOX1JFQURPTkxZLAorICAgICAgICAgICAgICAgICAgICBtRXJyb3JIYW5kbGVyKTsKICAgICAgICAgICAgIGlmIChkYi5nZXRWZXJzaW9uKCkgIT0gbU5ld1ZlcnNpb24pIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU1FMaXRlRXhjZXB0aW9uKCJDYW4ndCB1cGdyYWRlIHJlYWQtb25seSBkYXRhYmFzZSBmcm9tIHZlcnNpb24gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICBkYi5nZXRWZXJzaW9uKCkgKyAiIHRvICIgKyBtTmV3VmVyc2lvbiArICI6ICIgKyBwYXRoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThjZThiNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitwdWJsaWMgY2xhc3MgU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUHJvZ3JhbS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVByb2dyYW0uamF2YQppbmRleCA0ZDk2ZjEyLi45YjdkODIzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUHJvZ3JhbS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVQcm9ncmFtLmphdmEKQEAgLTE2LDExICsxNiwxNSBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwogCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKwogLyoqCiAgKiBBIGJhc2UgY2xhc3MgZm9yIGNvbXBpbGVkIFNRTGl0ZSBwcm9ncmFtcy4KLSAqCisgKjxwPgogICogU1FMaXRlUHJvZ3JhbSBpcyBub3QgaW50ZXJuYWxseSBzeW5jaHJvbml6ZWQgc28gY29kZSB1c2luZyBhIFNRTGl0ZVByb2dyYW0gZnJvbSBtdWx0aXBsZQogICogdGhyZWFkcyBzaG91bGQgcGVyZm9ybSBpdHMgb3duIHN5bmNocm9uaXphdGlvbiB3aGVuIHVzaW5nIHRoZSBTUUxpdGVQcm9ncmFtLgogICovCkBAIC00Myw3ICs0Nyw3IEBACiAgICAgICogQGRlcHJlY2F0ZWQgZG8gbm90IHVzZSB0aGlzCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKLSAgICBwcm90ZWN0ZWQgaW50IG5IYW5kbGUgPSAwOworICAgIHByb3RlY3RlZCBpbnQgbkhhbmRsZTsKIAogICAgIC8qKgogICAgICAqIHRoZSBTUUxpdGVDb21waWxlZFNxbCBvYmplY3QgZm9yIHRoZSBnaXZlbiBzcWwgc3RhdGVtZW50LgpAQCAtNTYsNDAgKzYwLDc5IEBACiAgICAgICogQGRlcHJlY2F0ZWQgZG8gbm90IHVzZSB0aGlzCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKLSAgICBwcm90ZWN0ZWQgaW50IG5TdGF0ZW1lbnQgPSAwOworICAgIHByb3RlY3RlZCBpbnQgblN0YXRlbWVudDsKKworICAgIC8qKgorICAgICAqIEluIHRoZSBjYXNlIG9mIHtAbGluayBTUUxpdGVTdGF0ZW1lbnR9LCB0aGlzIG1lbWJlciBzdG9yZXMgdGhlIGJpbmRhcmdzIHBhc3NlZAorICAgICAqIHRvIHRoZSBmb2xsb3dpbmcgbWV0aG9kcywgaW5zdGVhZCBvZiBhY3R1YWxseSBkb2luZyB0aGUgYmluZGluZy4KKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rICNiaW5kQmxvYihpbnQsIGJ5dGVbXSl9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI2JpbmREb3VibGUoaW50LCBkb3VibGUpfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNiaW5kTG9uZyhpbnQsIGxvbmcpfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNiaW5kTnVsbChpbnQpfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNiaW5kU3RyaW5nKGludCwgU3RyaW5nKX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+CisgICAgICogRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBQYWlyIG9mCisgICAgICogPG9sPgorICAgICAqICAgPGxpPmJpbmQgYXJnIHBvc2l0aW9uIG51bWJlcjwvbGk+CisgICAgICogICA8bGk+dGhlIHZhbHVlIHRvIGJlIGJvdW5kIHRvIHRoZSBiaW5kYXJnPC9saT4KKyAgICAgKiA8L29sPgorICAgICAqIDxwPgorICAgICAqIEl0IGlzIGxhemlseSBpbml0aWFsaXplZCBpbiB0aGUgYWJvdmUgYmluZCBtZXRob2RzCisgICAgICogYW5kIGl0IGlzIGNsZWFyZWQgaW4ge0BsaW5rICNjbGVhckJpbmRpbmdzKCl9IG1ldGhvZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBwcm90ZWN0ZWQgKGluIG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50KSBieSB7QGxpbmsgU1FMaXRlUHJvZ3JhbX0udGhpcworICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gSGFzaE1hcDxJbnRlZ2VyLCBPYmplY3Q+IG1CaW5kQXJncyA9IG51bGw7CisgICAgLyogcGFja2FnZSAqLyBmaW5hbCBpbnQgbVN0YXRlbWVudFR5cGU7CiAKICAgICAvKiBwYWNrYWdlICovIFNRTGl0ZVByb2dyYW0oU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwpIHsKLSAgICAgICAgbURhdGFiYXNlID0gZGI7CisgICAgICAgIHRoaXMoZGIsIHNxbCwgbnVsbCwgdHJ1ZSk7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVQcm9ncmFtKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsLCBPYmplY3RbXSBiaW5kQXJncywKKyAgICAgICAgICAgIGJvb2xlYW4gY29tcGlsZUZsYWcpIHsKICAgICAgICAgbVNxbCA9IHNxbC50cmltKCk7CisgICAgICAgIG1TdGF0ZW1lbnRUeXBlID0gRGF0YWJhc2VVdGlscy5nZXRTcWxTdGF0ZW1lbnRUeXBlKG1TcWwpOwogICAgICAgICBkYi5hY3F1aXJlUmVmZXJlbmNlKCk7CiAgICAgICAgIGRiLmFkZFNRTGl0ZUNsb3NhYmxlKHRoaXMpOwotICAgICAgICB0aGlzLm5IYW5kbGUgPSBkYi5tTmF0aXZlSGFuZGxlOworICAgICAgICBtRGF0YWJhc2UgPSBkYjsKKyAgICAgICAgbkhhbmRsZSA9IGRiLm1OYXRpdmVIYW5kbGU7CisgICAgICAgIGlmIChiaW5kQXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IGJpbmRBcmdzLmxlbmd0aDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgdGhpcy5hZGRUb0JpbmRBcmdzKGkgKyAxLCBiaW5kQXJnc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbXBpbGVGbGFnKSB7CisgICAgICAgICAgICBjb21waWxlQW5kYmluZEFsbEFyZ3MoKTsKKyAgICAgICAgfQorICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBjb21waWxlU3FsKCkgewogICAgICAgICAvLyBvbmx5IGNhY2hlIENSVUQgc3RhdGVtZW50cwotICAgICAgICBTdHJpbmcgcHJlZml4U3FsID0gbVNxbC5zdWJzdHJpbmcoMCwgNik7Ci0gICAgICAgIGlmICghcHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIklOU0VSVCIpICYmICFwcmVmaXhTcWwuZXF1YWxzSWdub3JlQ2FzZSgiVVBEQVRFIikgJiYKLSAgICAgICAgICAgICAgICAhcHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIlJFUExBQyIpICYmCi0gICAgICAgICAgICAgICAgIXByZWZpeFNxbC5lcXVhbHNJZ25vcmVDYXNlKCJERUxFVEUiKSAmJiAhcHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIlNFTEVDVCIpKSB7Ci0gICAgICAgICAgICBtQ29tcGlsZWRTcWwgPSBuZXcgU1FMaXRlQ29tcGlsZWRTcWwoZGIsIHNxbCk7CisgICAgICAgIGlmIChtU3RhdGVtZW50VHlwZSAhPSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9TRUxFQ1QgJiYKKyAgICAgICAgICAgICAgICBtU3RhdGVtZW50VHlwZSAhPSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9VUERBVEUpIHsKKyAgICAgICAgICAgIG1Db21waWxlZFNxbCA9IG5ldyBTUUxpdGVDb21waWxlZFNxbChtRGF0YWJhc2UsIG1TcWwpOwogICAgICAgICAgICAgblN0YXRlbWVudCA9IG1Db21waWxlZFNxbC5uU3RhdGVtZW50OwogICAgICAgICAgICAgLy8gc2luY2UgaXQgaXMgbm90IGluIHRoZSBjYWNoZSwgbm8gbmVlZCB0byBhY3F1aXJlKCkgaXQuCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICAvLyBpdCBpcyBub3QgcHJhZ21hCi0gICAgICAgIG1Db21waWxlZFNxbCA9IGRiLmdldENvbXBpbGVkU3RhdGVtZW50Rm9yU3FsKHNxbCk7CisgICAgICAgIG1Db21waWxlZFNxbCA9IG1EYXRhYmFzZS5nZXRDb21waWxlZFN0YXRlbWVudEZvclNxbChtU3FsKTsKICAgICAgICAgaWYgKG1Db21waWxlZFNxbCA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgY29tcGlsZWQtc3FsIG9iagotICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKGRiLCBzcWwpOworICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKG1EYXRhYmFzZSwgbVNxbCk7CiAKICAgICAgICAgICAgIC8vIGFkZCBpdCB0byB0aGUgY2FjaGUgb2YgY29tcGlsZWQtc3FscwogICAgICAgICAgICAgLy8gYnV0IGJlZm9yZSBhZGRpbmcgaXQgYW5kIHRodXMgbWFraW5nIGl0IGF2YWlsYWJsZSBmb3IgYW55b25lIGVsc2UgdG8gdXNlIGl0LAogICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGl0IGlzIGFjcXVpcmVkIGJ5IG1lLgogICAgICAgICAgICAgbUNvbXBpbGVkU3FsLmFjcXVpcmUoKTsKLSAgICAgICAgICAgIGRiLmFkZFRvQ29tcGlsZWRRdWVyaWVzKHNxbCwgbUNvbXBpbGVkU3FsKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5hZGRUb0NvbXBpbGVkUXVlcmllcyhtU3FsLCBtQ29tcGlsZWRTcWwpOwogICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX0FDVElWRV9DVVJTT1JfRklOQUxJWkFUSU9OKSB7CiAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiQ3JlYXRlZCBEYk9iaiAoaWQjIiArIG1Db21waWxlZFNxbC5uU3RhdGVtZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIpIGZvciBzcWw6ICIgKyBzcWwpOworICAgICAgICAgICAgICAgICAgICAgICAgIikgZm9yIHNxbDogIiArIG1TcWwpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gaXQgaXMgYWxyZWFkeSBpbiBjb21waWxlZC1zcWwgY2FjaGUuCkBAIC0xMDAsMTIgKzE0MywxMiBAQAogICAgICAgICAgICAgICAgIC8vIHdlIGNhbid0IGhhdmUgdHdvIGRpZmZlcmVudCBTUUxpdGVQcm9nYW0gb2JqZWN0cyBjYW4ndCBzaGFyZSB0aGUgc2FtZQogICAgICAgICAgICAgICAgIC8vIENvbXBpbGVkU3FsIG9iamVjdC4gY3JlYXRlIGEgbmV3IG9uZS4KICAgICAgICAgICAgICAgICAvLyBmaW5hbGl6ZSBpdCB3aGVuIEkgYW0gZG9uZSB3aXRoIGl0IGluICJ0aGlzIiBvYmplY3QuCi0gICAgICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKGRiLCBzcWwpOworICAgICAgICAgICAgICAgIG1Db21waWxlZFNxbCA9IG5ldyBTUUxpdGVDb21waWxlZFNxbChtRGF0YWJhc2UsIG1TcWwpOwogICAgICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19BQ1RJVkVfQ1VSU09SX0ZJTkFMSVpBVElPTikgewogICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICIqKiBwb3NzaWJsZSBidWcgKiogQ3JlYXRlZCBORVcgRGJPYmogKGlkIyIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21waWxlZFNxbC5uU3RhdGVtZW50ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBiZWNhdXNlIHRoZSBwcmV2aW91c2x5IGNyZWF0ZWQgRGJPYmogKGlkIyIgKyBsYXN0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSB3YXMgbm90IHJlbGVhc2VkIGZvciBzcWw6IiArIHNxbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgd2FzIG5vdCByZWxlYXNlZCBmb3Igc3FsOiIgKyBtU3FsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gc2luY2UgaXQgaXMgbm90IGluIHRoZSBjYWNoZSwgbm8gbmVlZCB0byBhY3F1aXJlKCkgaXQuCiAgICAgICAgICAgICB9CkBAIC0xMTUsMTggKzE1OCwxOCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWQoKSB7Ci0gICAgICAgIHJlbGVhc2VDb21waWxlZFNxbElmTm90SW5DYWNoZSgpOwotICAgICAgICBtRGF0YWJhc2UucmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICByZWxlYXNlKCk7CiAgICAgICAgIG1EYXRhYmFzZS5yZW1vdmVTUUxpdGVDbG9zYWJsZSh0aGlzKTsKKyAgICAgICAgbURhdGFiYXNlLnJlbGVhc2VSZWZlcmVuY2UoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZEZyb21Db250YWluZXIoKSB7Ci0gICAgICAgIHJlbGVhc2VDb21waWxlZFNxbElmTm90SW5DYWNoZSgpOworICAgICAgICByZWxlYXNlKCk7CiAgICAgICAgIG1EYXRhYmFzZS5yZWxlYXNlUmVmZXJlbmNlKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VDb21waWxlZFNxbElmTm90SW5DYWNoZSgpIHsKKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2UoKSB7CiAgICAgICAgIGlmIChtQ29tcGlsZWRTcWwgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0xMzUsMjIgKzE3OCwzNCBAQAogICAgICAgICAgICAgICAgIC8vIGl0IGlzIE5PVCBpbiBjb21waWxlZC1zcWwgY2FjaGUuIGkuZS4sIHJlc3BvbnNpYmlsaXR5IG9mCiAgICAgICAgICAgICAgICAgLy8gcmVsZWFzaW5nIHRoaXMgc3RhdGVtZW50IGlzIG9uIG1lLgogICAgICAgICAgICAgICAgIG1Db21waWxlZFNxbC5yZWxlYXNlU3FsU3RhdGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbnVsbDsKLSAgICAgICAgICAgICAgICBuU3RhdGVtZW50ID0gMDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gaXQgaXMgaW4gY29tcGlsZWQtc3FsIGNhY2hlLiByZXNldCBpdHMgQ29tcGlsZWRTcWwjbUluVXNlIGZsYWcKICAgICAgICAgICAgICAgICBtQ29tcGlsZWRTcWwucmVsZWFzZSgpOwogICAgICAgICAgICAgfQotICAgICAgICB9IAorICAgICAgICB9CisgICAgICAgIG1Db21waWxlZFNxbCA9IG51bGw7CisgICAgICAgIG5TdGF0ZW1lbnQgPSAwOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwcm9ncmFtLgogICAgICAqCiAgICAgICogQHJldHVybiBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHByb2dyYW0KKyAgICAgKiBAZGVwcmVjYXRlZCBkbyBub3QgdXNlIHRoaXMgbWV0aG9kLiBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB0aGUgc2FtZSBhY3Jvc3MgZXhlY3V0aW9ucyBvZgorICAgICAqIHRoZSBTUUwgc3RhdGVtZW50IGNvbnRhaW5lZCBpbiB0aGlzIG9iamVjdC4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VW5pcXVlSWQoKSB7Ci0gICAgICAgIHJldHVybiBuU3RhdGVtZW50OworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIHVzZWQgb25seSBmb3IgdGVzdGluZyBwdXJwb3NlcworICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gaW50IGdldFNxbFN0YXRlbWVudElkKCkgeworICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgcmV0dXJuIChtQ29tcGlsZWRTcWwgPT0gbnVsbCkgPyAwIDogblN0YXRlbWVudDsKKyAgICAgIH0KICAgICB9CiAKICAgICAvKiBwYWNrYWdlICovIFN0cmluZyBnZXRTcWxTdHJpbmcoKSB7CkBAIC0xNjksNiArMjI0LDM5IEBACiAgICAgICAgIC8vIFRPRE8gaXMgdGhlcmUgYSBuZWVkIGZvciB0aGlzPwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBiaW5kKGludCB0eXBlLCBpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBhZGRUb0JpbmRBcmdzKGluZGV4LCAodHlwZSA9PSBDdXJzb3IuRklFTERfVFlQRV9OVUxMKSA/IG51bGwgOiB2YWx1ZSk7CisgICAgICAgICAgICBpZiAoblN0YXRlbWVudCA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBiaW5kIG9ubHkgaWYgdGhlIFNRTCBzdGF0ZW1lbnQgaXMgY29tcGlsZWQKKyAgICAgICAgICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX05VTEw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfbnVsbChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX0JMT0I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfYmxvYihpbmRleCwgKGJ5dGVbXSkgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9kb3VibGUoaW5kZXgsIChEb3VibGUpIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfSU5URUdFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9sb25nKGluZGV4LCAoTG9uZykgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9TVFJJTkc6CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX3N0cmluZyhpbmRleCwgKFN0cmluZykgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIEJpbmQgYSBOVUxMIHZhbHVlIHRvIHRoaXMgc3RhdGVtZW50LiBUaGUgdmFsdWUgcmVtYWlucyBib3VuZCB1bnRpbAogICAgICAqIHtAbGluayAjY2xlYXJCaW5kaW5nc30gaXMgY2FsbGVkLgpAQCAtMTc2LDM0ICsyNjQsMTggQEAKICAgICAgKiBAcGFyYW0gaW5kZXggVGhlIDEtYmFzZWQgaW5kZXggdG8gdGhlIHBhcmFtZXRlciB0byBiaW5kIG51bGwgdG8KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBiaW5kTnVsbChpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9iaW5kX251bGwoaW5kZXgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIGJpbmQoQ3Vyc29yLkZJRUxEX1RZUEVfTlVMTCwgaW5kZXgsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEJpbmQgYSBsb25nIHZhbHVlIHRvIHRoaXMgc3RhdGVtZW50LiBUaGUgdmFsdWUgcmVtYWlucyBib3VuZCB1bnRpbAogICAgICAqIHtAbGluayAjY2xlYXJCaW5kaW5nc30gaXMgY2FsbGVkLgotICAgICAqCisgICAgICphZGRUb0JpbmRBcmdzCiAgICAgICogQHBhcmFtIGluZGV4IFRoZSAxLWJhc2VkIGluZGV4IHRvIHRoZSBwYXJhbWV0ZXIgdG8gYmluZAogICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmluZAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGJpbmRMb25nKGludCBpbmRleCwgbG9uZyB2YWx1ZSkgewotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2JpbmRfbG9uZyhpbmRleCwgdmFsdWUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIGJpbmQoQ3Vyc29yLkZJRUxEX1RZUEVfSU5URUdFUiwgaW5kZXgsIHZhbHVlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxNCwxNSArMjg2LDcgQEAKICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJpbmQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBiaW5kRG91YmxlKGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfYmluZF9kb3VibGUoaW5kZXgsIHZhbHVlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICBiaW5kKEN1cnNvci5GSUVMRF9UWVBFX0ZMT0FULCBpbmRleCwgdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjM2LDE1ICszMDAsNyBAQAogICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGhlIGJpbmQgdmFsdWUgYXQgaW5kZXggIiArIGluZGV4ICsgIiBpcyBudWxsIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9iaW5kX3N0cmluZyhpbmRleCwgdmFsdWUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIGJpbmQoQ3Vyc29yLkZJRUxEX1RZUEVfU1RSSU5HLCBpbmRleCwgdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjU4LDI5ICszMTQsMjUgQEAKICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRoZSBiaW5kIHZhbHVlIGF0IGluZGV4ICIgKyBpbmRleCArICIgaXMgbnVsbCIpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfYmluZF9ibG9iKGluZGV4LCB2YWx1ZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgYmluZChDdXJzb3IuRklFTERfVFlQRV9CTE9CLCBpbmRleCwgdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENsZWFycyBhbGwgZXhpc3RpbmcgYmluZGluZ3MuIFVuc2V0IGJpbmRpbmdzIGFyZSB0cmVhdGVkIGFzIE5VTEwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJCaW5kaW5ncygpIHsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9jbGVhcl9iaW5kaW5ncygpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1CaW5kQXJncyA9IG51bGw7CisgICAgICAgICAgICBpZiAodGhpcy5uU3RhdGVtZW50ID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2NsZWFyX2JpbmRpbmdzKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjg4LDE0ICszNDAsNjggQEAKICAgICAgKiBSZWxlYXNlIHRoaXMgcHJvZ3JhbSdzIHJlc291cmNlcywgbWFraW5nIGl0IGludmFsaWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbUJpbmRBcmdzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChuSGFuZGxlID09IDAgfHwgIW1EYXRhYmFzZS5pc09wZW4oKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkVG9CaW5kQXJncyhpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAobUJpbmRBcmdzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1CaW5kQXJncyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIE9iamVjdD4oKTsKKyAgICAgICAgfQorICAgICAgICBtQmluZEFyZ3MucHV0KGluZGV4LCB2YWx1ZSk7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgdm9pZCBjb21waWxlQW5kYmluZEFsbEFyZ3MoKSB7CisgICAgICAgIGlmIChuU3RhdGVtZW50ID09IDApIHsKKyAgICAgICAgICAgIC8vIFNRTCBzdGF0ZW1lbnQgaXMgbm90IGNvbXBpbGVkIHlldC4gY29tcGlsZSBpdCBub3cuCisgICAgICAgICAgICBjb21waWxlU3FsKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1CaW5kQXJncyA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKKyAgICAgICAgZm9yIChpbnQgaW5kZXggOiBtQmluZEFyZ3Mua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG1CaW5kQXJncy5nZXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9udWxsKGluZGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEb3VibGUgfHwgdmFsdWUgaW5zdGFuY2VvZiBGbG9hdCkgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2RvdWJsZShpbmRleCwgKChOdW1iZXIpIHZhbHVlKS5kb3VibGVWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9sb25nKGluZGV4LCAoKE51bWJlcikgdmFsdWUpLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7CisgICAgICAgICAgICAgICAgQm9vbGVhbiBib29sID0gKEJvb2xlYW4pdmFsdWU7CisgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfbG9uZyhpbmRleCwgKGJvb2wpID8gMSA6IDApOworICAgICAgICAgICAgICAgIGlmIChib29sKSB7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2xvbmcoaW5kZXgsIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2xvbmcoaW5kZXgsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBieXRlW10peworICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2Jsb2IoaW5kZXgsIChieXRlW10pIHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfc3RyaW5nKGluZGV4LCB2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIGFuIGFycmF5IG9mIFN0cmluZyBiaW5kQXJncywgdGhpcyBtZXRob2QgYmluZHMgYWxsIG9mIHRoZW0gaW4gb25lIHNpbmdsZSBjYWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGJpbmRBcmdzIHRoZSBTdHJpbmcgYXJyYXkgb2YgYmluZCBhcmdzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJpbmRBbGxBcmdzQXNTdHJpbmdzKFN0cmluZ1tdIGJpbmRBcmdzKSB7CisgICAgICAgIGlmIChiaW5kQXJncyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IHNpemUgPSBiaW5kQXJncy5sZW5ndGg7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGJpbmRTdHJpbmcoaSArIDEsIGJpbmRBcmdzW2ldKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVF1ZXJ5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUXVlcnkuamF2YQppbmRleCA5MDViNjZiLi42M2E4Y2U5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUXVlcnkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUXVlcnkuamF2YQpAQCAtMTgsNyArMTgsNiBAQAogCiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXaW5kb3c7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiAvKioKICAqIEEgU1FMaXRlIHByb2dyYW0gdGhhdCByZXByZXNlbnRzIGEgcXVlcnkgdGhhdCByZWFkcyB0aGUgcmVzdWx0aW5nIHJvd3MgaW50byBhIEN1cnNvcldpbmRvdy4KQEAgLTI4LDI4ICsyNywzNyBAQAogICogdGhyZWFkcyBzaG91bGQgcGVyZm9ybSBpdHMgb3duIHN5bmNocm9uaXphdGlvbiB3aGVuIHVzaW5nIHRoZSBTUUxpdGVRdWVyeS4KICAqLwogcHVibGljIGNsYXNzIFNRTGl0ZVF1ZXJ5IGV4dGVuZHMgU1FMaXRlUHJvZ3JhbSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDdXJzb3IiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU1FMaXRlUXVlcnkiOwogCiAgICAgLyoqIFRoZSBpbmRleCBvZiB0aGUgdW5ib3VuZCBPRkZTRVQgcGFyYW1ldGVyICovCi0gICAgcHJpdmF0ZSBpbnQgbU9mZnNldEluZGV4OwotICAgIAotICAgIC8qKiBBcmdzIHRvIGJpbmQgb24gcmVxdWVyeSAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gbUJpbmRBcmdzOworICAgIHByaXZhdGUgaW50IG1PZmZzZXRJbmRleCA9IDA7CiAKICAgICBwcml2YXRlIGJvb2xlYW4gbUNsb3NlZCA9IGZhbHNlOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgcGVyc2lzdGVudCBxdWVyeSBvYmplY3QuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gZGIgVGhlIGRhdGFiYXNlIHRoYXQgdGhpcyBxdWVyeSBvYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoCiAgICAgICogQHBhcmFtIHF1ZXJ5IFRoZSBTUUwgc3RyaW5nIGZvciB0aGlzIHF1ZXJ5LiAKICAgICAgKiBAcGFyYW0gb2Zmc2V0SW5kZXggVGhlIDEtYmFzZWQgaW5kZXggdG8gdGhlIE9GRlNFVCBwYXJhbWV0ZXIsIAogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlUXVlcnkoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBxdWVyeSwgaW50IG9mZnNldEluZGV4LCBTdHJpbmdbXSBiaW5kQXJncykgewogICAgICAgICBzdXBlcihkYiwgcXVlcnkpOwotCiAgICAgICAgIG1PZmZzZXRJbmRleCA9IG9mZnNldEluZGV4OwotICAgICAgICBtQmluZEFyZ3MgPSBiaW5kQXJnczsKKyAgICAgICAgYmluZEFsbEFyZ3NBc1N0cmluZ3MoYmluZEFyZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHVzZWQgdG8gY3JlYXRlIG5ldyBpbnN0YW5jZSB0byByZXBsYWNlIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgd2hlbiB0aGUgY3VycmVudCBRdWVyeSBvYmplY3QgaXMgbm93IGFzc29jaWF0ZWQgd2l0aCBhIGRpZmZlcmVudAorICAgICAqIHtAbGluayBTUUxpdGVEYXRhYmFzZX0gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRiIFRoZSBkYXRhYmFzZSB0aGF0IHRoaXMgcXVlcnkgb2JqZWN0IGlzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIEBwYXJhbSBxdWVyeSB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIFNRTGl0ZVF1ZXJ5fSB0byBiZSByZXBsYWNlZAorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlUXVlcnkoU1FMaXRlRGF0YWJhc2UgZGIsIFNRTGl0ZVF1ZXJ5IHF1ZXJ5KSB7CisgICAgICAgIHN1cGVyKGRiLCBxdWVyeS5tU3FsKTsKKyAgICAgICAgdGhpcy5tQmluZEFyZ3MgPSBxdWVyeS5tQmluZEFyZ3M7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MiwxMSArODAsNiBAQAogICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBzYWZlIGluIHRoaXMgc2l0dWF0aW9uLiB0aGUgbmF0aXZlIGNvZGUgd2lsbCBpZ25vcmUgbWF4UmVhZAogICAgICAgICAgICAgICAgIGludCBudW1Sb3dzID0gbmF0aXZlX2ZpbGxfd2luZG93KHdpbmRvdywgd2luZG93LmdldFN0YXJ0UG9zaXRpb24oKSwgbU9mZnNldEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmVhZCwgbGFzdFBvcyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBMb2dnaW5nCi0gICAgICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9TVEFURU1FTlRTKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZpbGxXaW5kb3coKTogIiArIG1TcWwpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVtUm93czsKICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKXsKQEAgLTE0MSw1MSArMTQ0LDEzIEBACiAgICAgICogQ2FsbGVkIGJ5IFNRTGl0ZUN1cnNvciB3aGVuIGl0IGlzIHJlcXVlcmllZC4KICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIHZvaWQgcmVxdWVyeSgpIHsKLSAgICAgICAgaWYgKG1CaW5kQXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgbGVuID0gbUJpbmRBcmdzLmxlbmd0aDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgICAgICBzdXBlci5iaW5kU3RyaW5nKGkgKyAxLCBtQmluZEFyZ3NbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZU1pc3VzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBlcnJNc2cgPSBuZXcgU3RyaW5nQnVpbGRlcigibVNxbCAiICsgbVNxbCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgICAgICBlcnJNc2cuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIGVyck1zZy5hcHBlbmQobUJpbmRBcmdzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBsZWFrUHJvZ3JhbSA9IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJNc2cudG9TdHJpbmcoKSwgZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbGVha1Byb2dyYW07ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQorICAgICAgICBpZiAobUNsb3NlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicmVxdWVyeWluZyBhIGNsb3NlZCBjdXJzb3IiKTsKICAgICAgICAgfQorICAgICAgICBjb21waWxlQW5kYmluZEFsbEFyZ3MoKTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiaW5kTnVsbChpbnQgaW5kZXgpIHsKLSAgICAgICAgbUJpbmRBcmdzW2luZGV4IC0gMV0gPSBudWxsOwotICAgICAgICBpZiAoIW1DbG9zZWQpIHN1cGVyLmJpbmROdWxsKGluZGV4KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiaW5kTG9uZyhpbnQgaW5kZXgsIGxvbmcgdmFsdWUpIHsKLSAgICAgICAgbUJpbmRBcmdzW2luZGV4IC0gMV0gPSBMb25nLnRvU3RyaW5nKHZhbHVlKTsKLSAgICAgICAgaWYgKCFtQ2xvc2VkKSBzdXBlci5iaW5kTG9uZyhpbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJpbmREb3VibGUoaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKLSAgICAgICAgbUJpbmRBcmdzW2luZGV4IC0gMV0gPSBEb3VibGUudG9TdHJpbmcodmFsdWUpOwotICAgICAgICBpZiAoIW1DbG9zZWQpIHN1cGVyLmJpbmREb3VibGUoaW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiaW5kU3RyaW5nKGludCBpbmRleCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIG1CaW5kQXJnc1tpbmRleCAtIDFdID0gdmFsdWU7Ci0gICAgICAgIGlmICghbUNsb3NlZCkgc3VwZXIuYmluZFN0cmluZyhpbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIGludCBuYXRpdmVfZmlsbF93aW5kb3coQ3Vyc29yV2luZG93IHdpbmRvdywgCisgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgaW50IG5hdGl2ZV9maWxsX3dpbmRvdyhDdXJzb3JXaW5kb3cgd2luZG93LAogICAgICAgICAgICAgaW50IHN0YXJ0UG9zLCBpbnQgb2Zmc2V0UGFyYW0sIGludCBtYXhSZWFkLCBpbnQgbGFzdFBvcyk7CiAKICAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlX2NvbHVtbl9jb3VudCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2MzNjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitwdWJsaWMgY2xhc3MgU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50LmphdmEKaW5kZXggOWU0MjVjMy4uZGMwN2RiMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVTdGF0ZW1lbnQuamF2YQpAQCAtMTYsNyArMTYsMTIgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKIAoraW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlsczsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIGltcG9ydCBkYWx2aWsuc3lzdGVtLkJsb2NrR3VhcmQ7CiAKQEAgLTI1LDQ0ICszMCw2NSBAQAogICogVGhlIHN0YXRlbWVudCBjYW5ub3QgcmV0dXJuIG11bHRpcGxlIHJvd3MsIGJ1dCAxeDEgcmVzdWx0IHNldHMgYXJlIGFsbG93ZWQuCiAgKiBEb24ndCB1c2UgU1FMaXRlU3RhdGVtZW50IGNvbnN0cnVjdG9yIGRpcmVjdGx5LCBwbGVhc2UgdXNlCiAgKiB7QGxpbmsgU1FMaXRlRGF0YWJhc2UjY29tcGlsZVN0YXRlbWVudChTdHJpbmcpfQotICoKKyAqPHA+CiAgKiBTUUxpdGVTdGF0ZW1lbnQgaXMgbm90IGludGVybmFsbHkgc3luY2hyb25pemVkIHNvIGNvZGUgdXNpbmcgYSBTUUxpdGVTdGF0ZW1lbnQgZnJvbSBtdWx0aXBsZQogICogdGhyZWFkcyBzaG91bGQgcGVyZm9ybSBpdHMgb3duIHN5bmNocm9uaXphdGlvbiB3aGVuIHVzaW5nIHRoZSBTUUxpdGVTdGF0ZW1lbnQuCiAgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiBwdWJsaWMgY2xhc3MgU1FMaXRlU3RhdGVtZW50IGV4dGVuZHMgU1FMaXRlUHJvZ3JhbQogeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTUUxpdGVTdGF0ZW1lbnQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRUFEID0gdHJ1ZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFdSSVRFID0gZmFsc2U7CisKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1PcmlnRGI7CisgICAgcHJpdmF0ZSBpbnQgbVN0YXRlOworICAgIC8qKiBwb3NzaWJsZSB2YWx1ZSBmb3Ige0BsaW5rICNtU3RhdGV9LiBpbmRpY2F0ZXMgdGhhdCBhIHRyYW5zYWN0aW9uIGlzIHN0YXJ0ZWQufSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUkFOU19TVEFSVEVEID0gMTsKKyAgICAvKiogcG9zc2libGUgdmFsdWUgZm9yIHtAbGluayAjbVN0YXRlfS4gaW5kaWNhdGVzIHRoYXQgYSBsb2NrIGlzIGFjcXVpcmVkLn0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DS19BQ1FVSVJFRCA9IDI7CisKICAgICAvKioKICAgICAgKiBEb24ndCB1c2UgU1FMaXRlU3RhdGVtZW50IGNvbnN0cnVjdG9yIGRpcmVjdGx5LCBwbGVhc2UgdXNlCiAgICAgICoge0BsaW5rIFNRTGl0ZURhdGFiYXNlI2NvbXBpbGVTdGF0ZW1lbnQoU3RyaW5nKX0KICAgICAgKiBAcGFyYW0gZGIKICAgICAgKiBAcGFyYW0gc3FsCiAgICAgICovCi0gICAgLyogcGFja2FnZSAqLyBTUUxpdGVTdGF0ZW1lbnQoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwpIHsKLSAgICAgICAgc3VwZXIoZGIsIHNxbCk7CisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVTdGF0ZW1lbnQoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwsIE9iamVjdFtdIGJpbmRBcmdzKSB7CisgICAgICAgIHN1cGVyKGRiLCBzcWwsIGJpbmRBcmdzLCBmYWxzZSAvKiBkb24ndCBjb21waWxlIHNxbCBzdGF0ZW1lbnQgKi8pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEV4ZWN1dGUgdGhpcyBTUUwgc3RhdGVtZW50LCBpZiBpdCBpcyBub3QgYSBxdWVyeS4gRm9yIGV4YW1wbGUsCi0gICAgICogQ1JFQVRFIFRBQkxFLCBERUxURSwgSU5TRVJULCBldGMuCisgICAgICogRXhlY3V0ZSB0aGlzIFNRTCBzdGF0ZW1lbnQsIGlmIGl0IGlzIG5vdCBhIFNFTEVDVCAvIElOU0VSVCAvIERFTEVURSAvIFVQREFURSwgZm9yIGV4YW1wbGUKKyAgICAgKiBDUkVBVEUgLyBEUk9QIHRhYmxlLCB2aWV3LCB0cmlnZ2VyLCBpbmRleCBldGMuCiAgICAgICoKICAgICAgKiBAdGhyb3dzIGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uIElmIHRoZSBTUUwgc3RyaW5nIGlzIGludmFsaWQgZm9yCiAgICAgICogICAgICAgICBzb21lIHJlYXNvbgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKKyAgICAgICAgZXhlY3V0ZVVwZGF0ZURlbGV0ZSgpOworICAgIH0KIAotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY3V0ZSgpOwotICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGlzIFNRTCBzdGF0ZW1lbnQsIGlmIHRoZSB0aGUgbnVtYmVyIG9mIHJvd3MgYWZmZWN0ZWQgYnkgZXhlY3Rpb24gb2YgdGhpcyBTUUwKKyAgICAgKiBzdGF0ZW1lbnQgaXMgb2YgYW55IGltcG9ydGFuY2UgdG8gdGhlIGNhbGxlciAtIGZvciBleGFtcGxlLCBVUERBVEUgLyBERUxFVEUgU1FMIHN0YXRlbWVudHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygcm93cyBhZmZlY3RlZCBieSB0aGlzIFNRTCBzdGF0ZW1lbnQgZXhlY3V0aW9uLgorICAgICAqIEB0aHJvd3MgYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb24gSWYgdGhlIFNRTCBzdHJpbmcgaXMgaW52YWxpZCBmb3IKKyAgICAgKiAgICAgICAgIHNvbWUgcmVhc29uCisgICAgICovCisgICAgcHVibGljIGludCBleGVjdXRlVXBkYXRlRGVsZXRlKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBhY3F1aXJlQW5kTG9jayhXUklURSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGludCBudW1DaGFuZ2VzID0gbmF0aXZlX2V4ZWN1dGUoKTsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVtQ2hhbmdlczsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZUFuZFVubG9jaygpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC03NiwyMSArMTAyLDE1IEBACiAgICAgICogICAgICAgICBzb21lIHJlYXNvbgogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGV4ZWN1dGVJbnNlcnQoKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY3V0ZSgpOwotICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7Ci0gICAgICAgICAgICByZXR1cm4gKG1EYXRhYmFzZS5sYXN0Q2hhbmdlQ291bnQoKSA+IDApID8gbURhdGFiYXNlLmxhc3RJbnNlcnRSb3coKSA6IC0xOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBhY3F1aXJlQW5kTG9jayhXUklURSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgbGFzdEluc2VydGVkUm93SWQgPSBuYXRpdmVfZXhlY3V0ZUluc2VydCgpOworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5sb2dUaW1lU3RhdChtU3FsLCB0aW1lU3RhcnQpOworICAgICAgICAgICAgICAgIHJldHVybiBsYXN0SW5zZXJ0ZWRSb3dJZDsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZUFuZFVubG9jaygpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDMsMjEgKzEyMywxNSBAQAogICAgICAqIEB0aHJvd3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRG9uZUV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgcmV0dXJucyB6ZXJvIHJvd3MKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBzaW1wbGVRdWVyeUZvckxvbmcoKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25SZWFkRnJvbURpc2soKTsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9uZyByZXRWYWx1ZSA9IG5hdGl2ZV8xeDFfbG9uZygpOwotICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBsb25nIHRpbWVTdGFydCA9IGFjcXVpcmVBbmRMb2NrKFJFQUQpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsb25nIHJldFZhbHVlID0gbmF0aXZlXzF4MV9sb25nKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICByZWxlYXNlQW5kVW5sb2NrKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEzMCwyNSArMTQ0LDEzNiBAQAogICAgICAqIEB0aHJvd3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRG9uZUV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgcmV0dXJucyB6ZXJvIHJvd3MKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHNpbXBsZVF1ZXJ5Rm9yU3RyaW5nKCkgewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uUmVhZEZyb21EaXNrKCk7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotCi0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyByZXRWYWx1ZSA9IG5hdGl2ZV8xeDFfc3RyaW5nKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKLSAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gYWNxdWlyZUFuZExvY2soUkVBRCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyByZXRWYWx1ZSA9IG5hdGl2ZV8xeDFfc3RyaW5nKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICByZWxlYXNlQW5kVW5sb2NrKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZV9leGVjdXRlKCk7CisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgYSBzdGF0ZW1lbnQgdGhhdCByZXR1cm5zIGEgMSBieSAxIHRhYmxlIHdpdGggYSBibG9iIHZhbHVlLgorICAgICAqCisgICAgICogQHJldHVybiBBIHJlYWQtb25seSBmaWxlIGRlc2NyaXB0b3IgZm9yIGEgY29weSBvZiB0aGUgYmxvYiB2YWx1ZSwgb3Ige0Bjb2RlIG51bGx9CisgICAgICogICAgICAgICBpZiB0aGUgdmFsdWUgaXMgbnVsbCBvciBjb3VsZCBub3QgYmUgcmVhZCBmb3Igc29tZSByZWFzb24uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURvbmVFeGNlcHRpb24gaWYgdGhlIHF1ZXJ5IHJldHVybnMgemVybyByb3dzCisgICAgICovCisgICAgcHVibGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHNpbXBsZVF1ZXJ5Rm9yQmxvYkZpbGVEZXNjcmlwdG9yKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBhY3F1aXJlQW5kTG9jayhSRUFEKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcmV0VmFsdWUgPSBuYXRpdmVfMXgxX2Jsb2JfYXNobWVtKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJzaW1wbGVRdWVyeUZvckJsb2JGaWxlRGVzY3JpcHRvcigpIGZhaWxlZCIsIGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZUFuZFVubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJlZm9yZSBldmVyeSBtZXRob2QgaW4gdGhpcyBjbGFzcyBiZWZvcmUgZXhlY3V0aW5nIGEgU1FMIHN0YXRlbWVudCwKKyAgICAgKiB0aGlzIG1ldGhvZCBkb2VzIHRoZSBmb2xsb3dpbmc6CisgICAgICogPHVsPgorICAgICAqICAgPGxpPm1ha2Ugc3VyZSB0aGUgZGF0YWJhc2UgaXMgb3BlbjwvbGk+CisgICAgICogICA8bGk+Z2V0IGEgZGF0YWJhc2UgY29ubmVjdGlvbiBmcm9tIHRoZSBjb25uZWN0aW9uIHBvb2wsaWYgcG9zc2libGU8L2xpPgorICAgICAqICAgPGxpPm5vdGlmaWVzIHtAbGluayBCbG9ja0d1YXJkfSBvZiByZWFkL3dyaXRlPC9saT4KKyAgICAgKiAgIDxsaT5pZiB0aGUgU1FMIHN0YXRlbWVudCBpcyBhbiB1cGRhdGUsIHN0YXJ0IHRyYW5zYWN0aW9uIGlmIG5vdCBhbHJlYWR5IGluIG9uZS4KKyAgICAgKiAgIG90aGVyd2lzZSwgZ2V0IGxvY2sgb24gdGhlIGRhdGFiYXNlPC9saT4KKyAgICAgKiAgIDxsaT5hY3F1aXJlIHJlZmVyZW5jZSBvbiB0aGlzIG9iamVjdDwvbGk+CisgICAgICogICA8bGk+YW5kIHRoZW4gcmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgX2JlZm9yZV8gdGhlIGRhdGFiYXNlIGxvY2sgd2FzIGFjcXVpcmVkPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIGR1cGxpY2F0ZSBjb2RlIGZyb20gdGhlIG90aGVyIHB1YmxpYworICAgICAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgYWNxdWlyZUFuZExvY2soYm9vbGVhbiByd0ZsYWcpIHsKKyAgICAgICAgbVN0YXRlID0gMDsKKyAgICAgICAgLy8gdXNlIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZXMgZm9yIFNFTEVDVCBTUUwgc3RhdGVtZW50cworICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSAobVN0YXRlbWVudFR5cGUgIT0gRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfU0VMRUNUKSA/IG1EYXRhYmFzZQorICAgICAgICAgICAgICAgIDogbURhdGFiYXNlLmdldERiQ29ubmVjdGlvbihtU3FsKTsKKyAgICAgICAgLy8gdXNlIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIG9idGFpbmVkIGFib3ZlCisgICAgICAgIG1PcmlnRGIgPSBtRGF0YWJhc2U7CisgICAgICAgIG1EYXRhYmFzZSA9IGRiOworICAgICAgICBuSGFuZGxlID0gbURhdGFiYXNlLm1OYXRpdmVIYW5kbGU7CisgICAgICAgIGlmIChyd0ZsYWcgPT0gV1JJVEUpIHsKKyAgICAgICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vblJlYWRGcm9tRGlzaygpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU3BlY2lhbCBjYXNlIGhhbmRsaW5nIG9mIFNRTGl0ZURhdGFiYXNlLmV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIikuCisgICAgICAgICAqIHdlIGtub3cgaXQgaXMgZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKSBmcm9tIHRoZSBjYWxsZXIgSUYgdGhlcmUgaXMgbm8gbG9jayBoZWxkLgorICAgICAgICAgKiBiZWdpblRyYW5zYWN0aW9uKCkgbWV0aG9kcyBpbiBTUUxpdGVEYXRhYmFzZSBjYWxsIGxvY2tGb3JjZWQoKSBiZWZvcmUKKyAgICAgICAgICogY2FsbGluZyBleGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKG1TdGF0ZW1lbnRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0JFR0lOKSB7CisgICAgICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgICAgICAvLyB0cmFuc2FjdGlvbiBpcyAgTk9UIHN0YXJ0ZWQgYnkgY2FsbGluZyBiZWdpblRyYW5zYWN0aW9uKCkgbWV0aG9kcyBpbgorICAgICAgICAgICAgICAgIC8vIFNRTGl0ZURhdGFiYXNlCisgICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsRmxhZygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZW1lbnRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX1VQREFURSkgeworICAgICAgICAgICAgLy8gZ290IHVwZGF0ZSBTUUwgc3RhdGVtZW50LiBpZiB0aGVyZSBpcyBOTyBwZW5kaW5nIHRyYW5zYWN0aW9uLCBzdGFydCBvbmUKKyAgICAgICAgICAgIGlmICghbURhdGFiYXNlLmluVHJhbnNhY3Rpb24oKSkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICAgICAgICAgICAgbVN0YXRlID0gVFJBTlNfU1RBUlRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBkbyBJIGhhdmUgZGF0YWJhc2UgbG9jaz8gaWYgbm90LCBncmFiIGl0LgorICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7CisgICAgICAgICAgICBtU3RhdGUgPSBMT0NLX0FDUVVJUkVEOworICAgICAgICB9CisKKyAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOworICAgICAgICBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOworICAgICAgICBjb21waWxlQW5kYmluZEFsbEFyZ3MoKTsKKyAgICAgICAgcmV0dXJuIHN0YXJ0VGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aGlzIG1ldGhvZCByZWxlYXNlcyBsb2NrcyBhbmQgcmVmZXJlbmNlcyBhY3F1aXJlZCBpbiB7QGxpbmsgI2FjcXVpcmVBbmRMb2NrKGJvb2xlYW4pfQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWxlYXNlQW5kVW5sb2NrKCkgeworICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgICAgIGlmIChtU3RhdGUgPT0gVFJBTlNfU1RBUlRFRCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBMT0NLX0FDUVVJUkVEKSB7CisgICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TdGF0ZW1lbnRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0NPTU1JVCB8fAorICAgICAgICAgICAgICAgIG1TdGF0ZW1lbnRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0FCT1JUKSB7CisgICAgICAgICAgICBtRGF0YWJhc2UucmVzZXRUcmFuc2FjdGlvblVzaW5nRXhlY1NxbEZsYWcoKTsKKyAgICAgICAgfQorICAgICAgICBjbGVhckJpbmRpbmdzKCk7CisgICAgICAgIC8vIHJlbGVhc2UgdGhlIGNvbXBpbGVkIHNxbCBzdGF0ZW1lbnQgc28gdGhhdCB0aGUgY2FsbGVyJ3MgU1FMaXRlU3RhdGVtZW50IG5vIGxvbmdlcgorICAgICAgICAvLyBoYXMgYSBoYXJkIHJlZmVyZW5jZSB0byBhIGRhdGFiYXNlIG9iamVjdCB0aGF0IG1heSBnZXQgZGVhbGxvY2F0ZWQgYXQgYW55IHBvaW50LgorICAgICAgICByZWxlYXNlKCk7CisgICAgICAgIC8vIHJlc3RvcmUgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZQorICAgICAgICBtRGF0YWJhc2UgPSBtT3JpZ0RiOworICAgICAgICBuSGFuZGxlID0gbURhdGFiYXNlLm1OYXRpdmVIYW5kbGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgaW50IG5hdGl2ZV9leGVjdXRlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgbG9uZyBuYXRpdmVfZXhlY3V0ZUluc2VydCgpOwogICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIGxvbmcgbmF0aXZlXzF4MV9sb25nKCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgU3RyaW5nIG5hdGl2ZV8xeDFfc3RyaW5nKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgUGFyY2VsRmlsZURlc2NyaXB0b3IgbmF0aXZlXzF4MV9ibG9iX2FzaG1lbSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3OGRmMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitwdWJsaWMgY2xhc3MgU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JFdmVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvU2Vuc29yRXZlbnQuamF2YQppbmRleCA2MjEyZTFiLi4yYzVjOTA5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JFdmVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1NlbnNvckV2ZW50LmphdmEKQEAgLTg0LDE0ICs4NCwxNCBAQAogICAgICAqIHNlbnNvciBpdHNlbGYgKDxiPkZzPC9iPikgdXNpbmcgdGhlIHJlbGF0aW9uOgogICAgICAqIDwvcD4KICAgICAgKiAKLSAgICAgKiA8Yj48Y2VudGVyPkFkID0gLSC3RnMgLyBtYXNzPC9jZW50ZXI+PC9iPgorICAgICAqIDxiPjxjZW50ZXI+QWQgPSAtICYjODcyMTtGcyAvIG1hc3M8L2NlbnRlcj48L2I+CiAgICAgICogCiAgICAgICogPHA+CiAgICAgICogSW4gcGFydGljdWxhciwgdGhlIGZvcmNlIG9mIGdyYXZpdHkgaXMgYWx3YXlzIGluZmx1ZW5jaW5nIHRoZSBtZWFzdXJlZAogICAgICAqIGFjY2VsZXJhdGlvbjoKICAgICAgKiA8L3A+CiAgICAgICogCi0gICAgICogPGI+PGNlbnRlcj5BZCA9IC1nIC0gt0YgLyBtYXNzPC9jZW50ZXI+PC9iPgorICAgICAqIDxiPjxjZW50ZXI+QWQgPSAtZyAtICYjODcyMTtGIC8gbWFzczwvY2VudGVyPjwvYj4KICAgICAgKiAKICAgICAgKiA8cD4KICAgICAgKiBGb3IgdGhpcyByZWFzb24sIHdoZW4gdGhlIGRldmljZSBpcyBzaXR0aW5nIG9uIGEgdGFibGUgKGFuZCBvYnZpb3VzbHkgbm90CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9Vc2IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1VzYi5qYXZhCmluZGV4IDU3MjcxZDQuLmViYjgyOTYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1VzYi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1VzYi5qYXZhCkBAIC0xNyw2ICsxNywxMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmU7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKwogLyoqCiAgKiBDbGFzcyBmb3IgYWNjZXNzaW5nIFVTQiBzdGF0ZSBpbmZvcm1hdGlvbi4KICAqIEBoaWRlCkBAIC01NSw2ICs1OSwyNCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9VU0JfU1RBVEUgPQogICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9TVEFURSI7CiAKKyAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBBY3Rpb246ICBBIGJyb2FkY2FzdCBmb3IgVVNCIGNhbWVyYSBhdHRhY2hlZCBldmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgaW50ZW50IGlzIHNlbnQgd2hlbiBhIFVTQiBkZXZpY2Ugc3VwcG9ydGluZyBQVFAgaXMgYXR0YWNoZWQgdG8gdGhlIGhvc3QgVVNCIGJ1cy4KKyAgICAgKiBUaGUgaW50ZW50J3MgZGF0YSBjb250YWlucyBhIFVyaSBmb3IgdGhlIGRldmljZSBpbiB0aGUgTVRQIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9VU0JfQ0FNRVJBX0FUVEFDSEVEID0KKyAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfQ0FNRVJBX0FUVEFDSEVEIjsKKworICAgLyoqCisgICAgICogQnJvYWRjYXN0IEFjdGlvbjogIEEgYnJvYWRjYXN0IGZvciBVU0IgY2FtZXJhIGRldGFjaGVkIGV2ZW50LgorICAgICAqCisgICAgICogVGhpcyBpbnRlbnQgaXMgc2VudCB3aGVuIGEgVVNCIGRldmljZSBzdXBwb3J0aW5nIFBUUCBpcyBkZXRhY2hlZCBmcm9tIHRoZSBob3N0IFVTQiBidXMuCisgICAgICogVGhlIGludGVudCdzIGRhdGEgY29udGFpbnMgYSBVcmkgZm9yIHRoZSBkZXZpY2UgaW4gdGhlIE1UUCBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVVNCX0NBTUVSQV9ERVRBQ0hFRCA9CisgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX0NBTUVSQV9ERVRBQ0hFRCI7CisKICAgICAvKioKICAgICAgKiBCb29sZWFuIGV4dHJhIGluZGljYXRpbmcgd2hldGhlciBVU0IgaXMgY29ubmVjdGVkIG9yIGRpc2Nvbm5lY3RlZC4KICAgICAgKiBVc2VkIGluIGV4dHJhcyBmb3IgdGhlIHtAbGluayAjQUNUSU9OX1VTQl9TVEFURX0gYnJvYWRjYXN0LgpAQCAtOTYsNCArMTE4LDMwIEBACiAgICAgICogVXNlZCBpbiBleHRyYXMgZm9yIHRoZSB7QGxpbmsgI0FDVElPTl9VU0JfQ09OTkVDVEVEfSBicm9hZGNhc3QKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0JfRlVOQ1RJT05fRElTQUJMRUQgPSAiZGlzYWJsZWQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRGdW5jdGlvbkVuYWJsZUZpbGUoU3RyaW5nIGZ1bmN0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgRmlsZSgiL3N5cy9jbGFzcy91c2JfY29tcG9zaXRlLyIgKyBmdW5jdGlvbiArICIvZW5hYmxlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgVVNCIGZ1bmN0aW9uIGlzIHN1cHBvcnRlZCBieSB0aGUga2VybmVsLgorICAgICAqIE5vdGUgdGhhdCBhIFVTQiBmdW5jdGlvbiBtYXliZSBzdXBwb3J0ZWQgYnV0IGRpc2FibGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Z1bmN0aW9uU3VwcG9ydGVkKFN0cmluZyBmdW5jdGlvbikgeworICAgICAgICByZXR1cm4gZ2V0RnVuY3Rpb25FbmFibGVGaWxlKGZ1bmN0aW9uKS5leGlzdHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBVU0IgZnVuY3Rpb24gaXMgY3VycmVudGx5IGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRnVuY3Rpb25FbmFibGVkKFN0cmluZyBmdW5jdGlvbikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZ2V0RnVuY3Rpb25FbmFibGVGaWxlKGZ1bmN0aW9uKSk7CisgICAgICAgICAgICBib29sZWFuIGVuYWJsZWQgPSAoc3RyZWFtLnJlYWQoKSA9PSAnMScpOworICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gZW5hYmxlZDsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmQuamF2YQppbmRleCA0ODE0YjBhLi44ODVhNmI4IDEwMDc1NQotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmQuamF2YQpAQCAtNTAwLDcgKzUwMCwzMCBAQAogICAgIHB1YmxpYyBLZXlib2FyZChDb250ZXh0IGNvbnRleHQsIGludCB4bWxMYXlvdXRSZXNJZCkgewogICAgICAgICB0aGlzKGNvbnRleHQsIHhtbExheW91dFJlc0lkLCAwKTsKICAgICB9Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEga2V5Ym9hcmQgZnJvbSB0aGUgZ2l2ZW4geG1sIGtleSBsYXlvdXQgZmlsZS4gV2VlZHMgb3V0IHJvd3MKKyAgICAgKiB0aGF0IGhhdmUgYSBrZXlib2FyZCBtb2RlIGRlZmluZWQgYnV0IGRvbid0IG1hdGNoIHRoZSBzcGVjaWZpZWQgbW9kZS4KKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgYXBwbGljYXRpb24gb3Igc2VydmljZSBjb250ZXh0CisgICAgICogQHBhcmFtIHhtbExheW91dFJlc0lkIHRoZSByZXNvdXJjZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGtleWJvYXJkIGxheW91dCBhbmQga2V5cy4KKyAgICAgKiBAcGFyYW0gbW9kZUlkIGtleWJvYXJkIG1vZGUgaWRlbnRpZmllcgorICAgICAqIEBwYXJhbSB3aWR0aCBzZXRzIHdpZHRoIG9mIGtleWJvYXJkCisgICAgICogQHBhcmFtIGhlaWdodCBzZXRzIGhlaWdodCBvZiBrZXlib2FyZAorICAgICAqLworICAgIHB1YmxpYyBLZXlib2FyZChDb250ZXh0IGNvbnRleHQsIGludCB4bWxMYXlvdXRSZXNJZCwgaW50IG1vZGVJZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1EaXNwbGF5V2lkdGggPSB3aWR0aDsKKyAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBoZWlnaHQ7CisKKyAgICAgICAgbURlZmF1bHRIb3Jpem9udGFsR2FwID0gMDsKKyAgICAgICAgbURlZmF1bHRXaWR0aCA9IG1EaXNwbGF5V2lkdGggLyAxMDsKKyAgICAgICAgbURlZmF1bHRWZXJ0aWNhbEdhcCA9IDA7CisgICAgICAgIG1EZWZhdWx0SGVpZ2h0ID0gbURlZmF1bHRXaWR0aDsKKyAgICAgICAgbUtleXMgPSBuZXcgQXJyYXlMaXN0PEtleT4oKTsKKyAgICAgICAgbU1vZGlmaWVyS2V5cyA9IG5ldyBBcnJheUxpc3Q8S2V5PigpOworICAgICAgICBtS2V5Ym9hcmRNb2RlID0gbW9kZUlkOworICAgICAgICBsb2FkS2V5Ym9hcmQoY29udGV4dCwgY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRYbWwoeG1sTGF5b3V0UmVzSWQpKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEga2V5Ym9hcmQgZnJvbSB0aGUgZ2l2ZW4geG1sIGtleSBsYXlvdXQgZmlsZS4gV2VlZHMgb3V0IHJvd3MKICAgICAgKiB0aGF0IGhhdmUgYSBrZXlib2FyZCBtb2RlIGRlZmluZWQgYnV0IGRvbid0IG1hdGNoIHRoZSBzcGVjaWZpZWQgbW9kZS4gCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmRWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmRWaWV3LmphdmEKaW5kZXggNGI0ODQwOS4uYWI1Yzc4YSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9LZXlib2FyZFZpZXcuamF2YQpAQCAtMTEyOCw3ICsxMTI4LDkgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBvbk1vZGlmaWVkVG91Y2hFdmVudChNb3Rpb25FdmVudCBtZSwgYm9vbGVhbiBwb3NzaWJsZVBvbHkpIHsKICAgICAgICAgaW50IHRvdWNoWCA9IChpbnQpIG1lLmdldFgoKSAtIG1QYWRkaW5nTGVmdDsKLSAgICAgICAgaW50IHRvdWNoWSA9IChpbnQpIG1lLmdldFkoKSArIG1WZXJ0aWNhbENvcnJlY3Rpb24gLSBtUGFkZGluZ1RvcDsKKyAgICAgICAgaW50IHRvdWNoWSA9IChpbnQpIG1lLmdldFkoKSAtIG1QYWRkaW5nVG9wOworICAgICAgICBpZiAodG91Y2hZID49IC1tVmVydGljYWxDb3JyZWN0aW9uKQorICAgICAgICAgICAgdG91Y2hZICs9IG1WZXJ0aWNhbENvcnJlY3Rpb247CiAgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBtZS5nZXRBY3Rpb24oKTsKICAgICAgICAgZmluYWwgbG9uZyBldmVudFRpbWUgPSBtZS5nZXRFdmVudFRpbWUoKTsKICAgICAgICAgbU9sZEV2ZW50VGltZSA9IGV2ZW50VGltZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Db25uZWN0aXZpdHlNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvQ29ubmVjdGl2aXR5TWFuYWdlci5qYXZhCmluZGV4IDViMGY2MGYuLjA1ZWJkMDcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Db25uZWN0aXZpdHlNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Nvbm5lY3Rpdml0eU1hbmFnZXIuamF2YQpAQCAtMzQ4LDE0ICszNDgsMTQgQEAKICAgICAgKiA8cD4KICAgICAgKiBBbGwgYXBwbGljYXRpb25zIHRoYXQgaGF2ZSBiYWNrZ3JvdW5kIHNlcnZpY2VzIHRoYXQgdXNlIHRoZSBuZXR3b3JrCiAgICAgICogc2hvdWxkIGxpc3RlbiB0byB7QGxpbmsgI0FDVElPTl9CQUNLR1JPVU5EX0RBVEFfU0VUVElOR19DSEFOR0VEfS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gV2hldGhlciBiYWNrZ3JvdW5kIGRhdGEgdXNhZ2UgaXMgYWxsb3dlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBnZXRCYWNrZ3JvdW5kRGF0YVNldHRpbmcoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0QmFja2dyb3VuZERhdGFTZXR0aW5nKCk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFcnIgb24gdGhlIHNpZGUgb2Ygc2FmZXR5IAorICAgICAgICAgICAgLy8gRXJyIG9uIHRoZSBzaWRlIG9mIHNhZmV0eQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtNTEzLDYgKzUxMywxNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFRldGhlcmFibGVCbHVldG9vdGhSZWdleHMoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqIHtAaGlkZX0gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVRIRVJfRVJST1JfTk9fRVJST1IgICAgICAgICAgID0gMDsKICAgICAvKioge0BoaWRlfSAqLwpAQCAtNTQ4LDUgKzU1OSwyMCBAQAogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIFRFVEhFUl9FUlJPUl9TRVJWSUNFX1VOQVZBSUw7CiAgICAgICAgIH0KLSAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhlIGRldmljZSBzdGF5cyBhd2FrZSB1bnRpbCB3ZSBjb25uZWN0IHdpdGggdGhlIG5leHQgbmV0d29yaworICAgICAqIEBwYXJhbSBmb3JXaG9tZSBUaGUgbmFtZSBvZiB0aGUgbmV0d29yayBnb2luZyBkb3duIGZvciBsb2dnaW5nIHB1cnBvc2VzCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3ROZXR3b3JrVHJhbnNpdGlvbldha2Vsb2NrKFN0cmluZyBmb3JXaG9tKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5yZXF1ZXN0TmV0d29ya1RyYW5zaXRpb25XYWtlbG9jayhmb3JXaG9tKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Rvd25sb2Fkcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Rvd25sb2Fkcy5qYXZhCmluZGV4IGZkMzM3ODEuLmRkZGU1YzEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Eb3dubG9hZHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRG93bmxvYWRzLmphdmEKQEAgLTQzMCwxMSArNDMwLDEwIEBACiAKICAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CiAKLSAgICAgICAgICAgIEN1cnNvciBjID0gY3IucXVlcnkoCi0gICAgICAgICAgICAgICAgICAgIGRvd25sb2FkVXJpLCBET1dOTE9BRFNfUFJPSkVDVElPTiwgbnVsbCAvKiBzZWxlY3Rpb24gKi8sIG51bGwgLyogc2VsZWN0aW9uIGFyZ3MgKi8sCi0gICAgICAgICAgICAgICAgICAgIG51bGwgLyogc29ydCBvcmRlciAqLyk7CisgICAgICAgICAgICBDdXJzb3IgYyA9IGNyLnF1ZXJ5KGRvd25sb2FkVXJpLCBET1dOTE9BRFNfUFJPSkVDVElPTiwgbnVsbCAvKiBzZWxlY3Rpb24gKi8sCisgICAgICAgICAgICAgICAgICAgIG51bGwgLyogc2VsZWN0aW9uIGFyZ3MgKi8sIG51bGwgLyogc29ydCBvcmRlciAqLyk7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmICghYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSBudWxsIHx8ICFjLm1vdmVUb05leHQoKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lDb25uZWN0aXZpdHlNYW5hZ2VyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXIuYWlkbAppbmRleCAwZWIzYWZkLi5mMzFmYjc1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXIuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXIuYWlkbApAQCAtMSwxNiArMSwxNiBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCkBAIC03NCw0ICs3NCw4IEBACiAgICAgU3RyaW5nW10gZ2V0VGV0aGVyYWJsZVVzYlJlZ2V4cygpOwogCiAgICAgU3RyaW5nW10gZ2V0VGV0aGVyYWJsZVdpZmlSZWdleHMoKTsKKworICAgIFN0cmluZ1tdIGdldFRldGhlcmFibGVCbHVldG9vdGhSZWdleHMoKTsKKworICAgIHZvaWQgcmVxdWVzdE5ldHdvcmtUcmFuc2l0aW9uV2FrZWxvY2soaW4gU3RyaW5nIGZvcldob20pOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtQcm9wZXJ0aWVzLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTGlua1Byb3BlcnRpZXMuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2M3OTg4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtQcm9wZXJ0aWVzLmFpZGwKQEAgLTAsMCArMSwyMiBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgKEMpIDIwMDkgUXVhbGNvbW0gSW5ub3ZhdGlvbiBDZW50ZXIsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldDsKKworcGFyY2VsYWJsZSBMaW5rUHJvcGVydGllczsKKwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtQcm9wZXJ0aWVzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTGlua1Byb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGFlYmZjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCitpbXBvcnQgYW5kcm9pZC5uZXQuUHJveHlQcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKKy8qKgorICogRGVzY3JpYmVzIHRoZSBwcm9wZXJ0aWVzIG9mIGEgbmV0d29yayBsaW5rLgorICogVE9ETyAtIGNvbnNpZGVyIGFkZGluZyBvcHRpb25hbCBmaWVsZHMgbGlrZSBBcG4gYW5kIEFwblR5cGUKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBMaW5rUHJvcGVydGllcyBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworCisgICAgcHJpdmF0ZSBOZXR3b3JrSW50ZXJmYWNlIG1JZmFjZTsKKyAgICBwcml2YXRlIENvbGxlY3Rpb248SW5ldEFkZHJlc3M+IG1BZGRyZXNzZXM7CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBtRG5zZXM7CisgICAgcHJpdmF0ZSBJbmV0QWRkcmVzcyBtR2F0ZXdheTsKKyAgICBwcml2YXRlIFByb3h5UHJvcGVydGllcyBtSHR0cFByb3h5OworCisgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzKCkgeworICAgICAgICBjbGVhcigpOworICAgIH0KKworICAgIC8vIGNvcHkgY29uc3RydWN0b3IgaW5zdGVhZCBvZiBjbG9uZQorICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcyhMaW5rUHJvcGVydGllcyBzb3VyY2UpIHsKKyAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtSWZhY2UgPSBzb3VyY2UuZ2V0SW50ZXJmYWNlKCk7CisgICAgICAgICAgICBtQWRkcmVzc2VzID0gc291cmNlLmdldEFkZHJlc3NlcygpOworICAgICAgICAgICAgbURuc2VzID0gc291cmNlLmdldERuc2VzKCk7CisgICAgICAgICAgICBtR2F0ZXdheSA9IHNvdXJjZS5nZXRHYXRld2F5KCk7CisgICAgICAgICAgICBtSHR0cFByb3h5ID0gbmV3IFByb3h5UHJvcGVydGllcyhzb3VyY2UuZ2V0SHR0cFByb3h5KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJmYWNlKE5ldHdvcmtJbnRlcmZhY2UgaWZhY2UpIHsKKyAgICAgICAgbUlmYWNlID0gaWZhY2U7CisgICAgfQorICAgIHB1YmxpYyBOZXR3b3JrSW50ZXJmYWNlIGdldEludGVyZmFjZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JZmFjZTsKKyAgICB9CisgICAgcHVibGljIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKCkgeworICAgICAgICByZXR1cm4gKG1JZmFjZSA9PSBudWxsID8gbnVsbCA6IG1JZmFjZS5nZXROYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEFkZHJlc3MoSW5ldEFkZHJlc3MgYWRkcmVzcykgeworICAgICAgICBtQWRkcmVzc2VzLmFkZChhZGRyZXNzKTsKKyAgICB9CisgICAgcHVibGljIENvbGxlY3Rpb248SW5ldEFkZHJlc3M+IGdldEFkZHJlc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24obUFkZHJlc3Nlcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRG5zKEluZXRBZGRyZXNzIGRucykgeworICAgICAgICBtRG5zZXMuYWRkKGRucyk7CisgICAgfQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBnZXREbnNlcygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24obURuc2VzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRHYXRld2F5KEluZXRBZGRyZXNzIGdhdGV3YXkpIHsKKyAgICAgICAgbUdhdGV3YXkgPSBnYXRld2F5OworICAgIH0KKyAgICBwdWJsaWMgSW5ldEFkZHJlc3MgZ2V0R2F0ZXdheSgpIHsKKyAgICAgICAgcmV0dXJuIG1HYXRld2F5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEh0dHBQcm94eShQcm94eVByb3BlcnRpZXMgcHJveHkpIHsKKyAgICAgICAgbUh0dHBQcm94eSA9IHByb3h5OworICAgIH0KKyAgICBwdWJsaWMgUHJveHlQcm9wZXJ0aWVzIGdldEh0dHBQcm94eSgpIHsKKyAgICAgICAgcmV0dXJuIG1IdHRwUHJveHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIG1JZmFjZSA9IG51bGw7CisgICAgICAgIG1BZGRyZXNzZXMgPSBuZXcgQXJyYXlMaXN0PEluZXRBZGRyZXNzPigpOworICAgICAgICBtRG5zZXMgPSBuZXcgQXJyYXlMaXN0PEluZXRBZGRyZXNzPigpOworICAgICAgICBtR2F0ZXdheSA9IG51bGw7CisgICAgICAgIG1IdHRwUHJveHkgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2UKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIGlmYWNlTmFtZSA9IChtSWZhY2UgPT0gbnVsbCA/ICIiIDogIkludGVyZmFjZU5hbWU6ICIgKyBtSWZhY2UuZ2V0TmFtZSgpICsgIiAiKTsKKworICAgICAgICBTdHJpbmcgaXAgPSAiSXBBZGRyZXNzZXM6IFsiOworICAgICAgICBmb3IgKEluZXRBZGRyZXNzIGFkZHIgOiBtQWRkcmVzc2VzKSBpcCArPSAgYWRkci5nZXRIb3N0QWRkcmVzcygpICsgIiwiOworICAgICAgICBpcCArPSAiXSAiOworCisgICAgICAgIFN0cmluZyBkbnMgPSAiRG5zQWRkcmVzc2VzOiBbIjsKKyAgICAgICAgZm9yIChJbmV0QWRkcmVzcyBhZGRyIDogbURuc2VzKSBkbnMgKz0gYWRkci5nZXRIb3N0QWRkcmVzcygpICsgIiwiOworICAgICAgICBkbnMgKz0gIl0gIjsKKworICAgICAgICBTdHJpbmcgcHJveHkgPSAobUh0dHBQcm94eSA9PSBudWxsID8gIiIgOiAiSHR0cFByb3h5OiAiICsgbUh0dHBQcm94eS50b1N0cmluZygpICsgIiAiKTsKKyAgICAgICAgU3RyaW5nIGdhdGV3YXkgPSAobUdhdGV3YXkgPT0gbnVsbCA/ICIiIDogIkdhdGV3YXk6ICIgKyBtR2F0ZXdheS5nZXRIb3N0QWRkcmVzcygpICsgIiAiKTsKKworICAgICAgICByZXR1cm4gaWZhY2VOYW1lICsgaXAgKyBnYXRld2F5ICsgZG5zICsgcHJveHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlU3RyaW5nKGdldEludGVyZmFjZU5hbWUoKSk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUFkZHJlc3Nlcy5zaXplKCkpOworICAgICAgICAvL1RPRE86IGV4cGxvcmUgYW4gZWFzeSBhbHRlcm5hdGl2ZSB0byBwcmVzZXJ2ZSBob3N0bmFtZQorICAgICAgICAvLyB3aXRob3V0IGRvaW5nIGEgbG9va3VwCisgICAgICAgIGZvcihJbmV0QWRkcmVzcyBhIDogbUFkZHJlc3NlcykgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGVBcnJheShhLmdldEFkZHJlc3MoKSk7CisgICAgICAgIH0KKyAgICAgICAgZGVzdC53cml0ZUludChtRG5zZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yKEluZXRBZGRyZXNzIGQgOiBtRG5zZXMpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlQXJyYXkoZC5nZXRBZGRyZXNzKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtR2F0ZXdheSAhPSBudWxsKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgoYnl0ZSkxKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlQXJyYXkobUdhdGV3YXkuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChieXRlKTApOworICAgICAgICB9CisgICAgICAgIGlmIChtSHR0cFByb3h5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChieXRlKTEpOworICAgICAgICAgICAgZGVzdC53cml0ZVBhcmNlbGFibGUobUh0dHBQcm94eSwgZmxhZ3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKGJ5dGUpMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDcmVhdG9yPExpbmtQcm9wZXJ0aWVzPiBDUkVBVE9SID0KKyAgICAgICAgbmV3IENyZWF0b3I8TGlua1Byb3BlcnRpZXM+KCkgeworICAgICAgICAgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgTGlua1Byb3BlcnRpZXMgbmV0UHJvcCA9IG5ldyBMaW5rUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIFN0cmluZyBpZmFjZSA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoaWZhY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV0UHJvcC5zZXRJbnRlcmZhY2UoTmV0d29ya0ludGVyZmFjZS5nZXRCeU5hbWUoaWZhY2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBhZGRyZXNzQ291bnQgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGFkZHJlc3NDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXRQcm9wLmFkZEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGluLmNyZWF0ZUJ5dGVBcnJheSgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZGRyZXNzQ291bnQgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGFkZHJlc3NDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXRQcm9wLmFkZERucyhJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaW4uY3JlYXRlQnl0ZUFycmF5KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeyB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbi5yZWFkQnl0ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldFByb3Auc2V0R2F0ZXdheShJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaW4uY3JlYXRlQnl0ZUFycmF5KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkge30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluLnJlYWRCeXRlKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBuZXRQcm9wLnNldEh0dHBQcm94eSgoUHJveHlQcm9wZXJ0aWVzKWluLnJlYWRQYXJjZWxhYmxlKG51bGwpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldFByb3A7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBMaW5rUHJvcGVydGllc1tdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMaW5rUHJvcGVydGllc1tzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Nb2JpbGVEYXRhU3RhdGVUcmFja2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IDAwNGNkYjcuLjA0OThmZmYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Nb2JpbGVEYXRhU3RhdGVUcmFja2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L01vYmlsZURhdGFTdGF0ZVRyYWNrZXIuamF2YQpAQCAtMTYsMTkgKzE2LDIxIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5uZXQ7CiAKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLQogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVRlbGVwaG9ueTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlbGVwaG9ueUludGVudHM7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKQEAgLTQwLDcgKzQyLDcgQEAKICAqCiAgKiB7QGhpZGV9CiAgKi8KLXB1YmxpYyBjbGFzcyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyIGV4dGVuZHMgTmV0d29ya1N0YXRlVHJhY2tlciB7CitwdWJsaWMgY2xhc3MgTW9iaWxlRGF0YVN0YXRlVHJhY2tlciBpbXBsZW1lbnRzIE5ldHdvcmtTdGF0ZVRyYWNrZXIgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNb2JpbGVEYXRhU3RhdGVUcmFja2VyIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7CkBAIC00OSwxMCArNTEsMTUgQEAKICAgICBwcml2YXRlIElUZWxlcGhvbnkgbVBob25lU2VydmljZTsKIAogICAgIHByaXZhdGUgU3RyaW5nIG1BcG5UeXBlOwotICAgIHByaXZhdGUgU3RyaW5nIG1BcG5UeXBlVG9XYXRjaEZvcjsKLSAgICBwcml2YXRlIFN0cmluZyBtQXBuTmFtZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZWQ7Ci0gICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtU3RhdGVSZWNlaXZlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBzRG5zUHJvcE5hbWVzOworICAgIHByaXZhdGUgTmV0d29ya0luZm8gbU5ldHdvcmtJbmZvOworICAgIHByaXZhdGUgYm9vbGVhbiBtVGVhcmRvd25SZXF1ZXN0ZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIEhhbmRsZXIgbVRhcmdldDsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBMaW5rUHJvcGVydGllcyBtTGlua1Byb3BlcnRpZXM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Qcml2YXRlRG5zUm91dGVTZXQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCBtRGVmYXVsdEdhdGV3YXlBZGRyID0gMDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbURlZmF1bHRSb3V0ZVNldCA9IGZhbHNlOwogCiAgICAgLy8gREVGQVVMVCBhbmQgSElQUkkgYXJlIHRoZSBzYW1lIGNvbm5lY3Rpb24uICBJZiB3ZSdyZSBvbmUgb2YgdGhlc2Ugd2UgbmVlZCB0byBjaGVjayBpZgogICAgIC8vIHRoZSBvdGhlciBpcyBhbHNvIGRpc2Nvbm5lY3RlZCBiZWZvcmUgd2UgcmVzZXQgc29ja2V0cwpAQCAtNjAsMzUgKzY3LDIyIEBACiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBuZXcgTW9iaWxlRGF0YVN0YXRlVHJhY2tlcgotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBhcHBsaWNhdGlvbiBjb250ZXh0IG9mIHRoZSBjYWxsZXIKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IGEgbWVzc2FnZSBoYW5kbGVyIGZvciBnZXR0aW5nIGNhbGxiYWNrcyBhYm91dCBzdGF0ZSBjaGFuZ2VzCiAgICAgICogQHBhcmFtIG5ldFR5cGUgdGhlIENvbm5lY3Rpdml0eU1hbmFnZXIgbmV0d29yayB0eXBlCi0gICAgICogQHBhcmFtIGFwblR5cGUgdGhlIFBob25lIGFwblR5cGUKICAgICAgKiBAcGFyYW0gdGFnIHRoZSBuYW1lIG9mIHRoaXMgbmV0d29yawogICAgICAqLwotICAgIHB1YmxpYyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciB0YXJnZXQsIGludCBuZXRUeXBlLCBTdHJpbmcgdGFnKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIHRhcmdldCwgbmV0VHlwZSwKKyAgICBwdWJsaWMgTW9iaWxlRGF0YVN0YXRlVHJhY2tlcihpbnQgbmV0VHlwZSwgU3RyaW5nIHRhZykgeworICAgICAgICBtTmV0d29ya0luZm8gPSBuZXcgTmV0d29ya0luZm8obmV0VHlwZSwKICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXROZXR3b3JrVHlwZSgpLCB0YWcsCiAgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0TmV0d29ya1R5cGVOYW1lKCkpOwogICAgICAgICBtQXBuVHlwZSA9IG5ldHdvcmtUeXBlVG9BcG5UeXBlKG5ldFR5cGUpOwotICAgICAgICBpZiAoVGV4dFV0aWxzLmVxdWFscyhtQXBuVHlwZSwgUGhvbmUuQVBOX1RZUEVfSElQUkkpKSB7Ci0gICAgICAgICAgICBtQXBuVHlwZVRvV2F0Y2hGb3IgPSBQaG9uZS5BUE5fVFlQRV9ERUZBVUxUOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUFwblR5cGVUb1dhdGNoRm9yID0gbUFwblR5cGU7Ci0gICAgICAgIH0KICAgICAgICAgaWYgKG5ldFR5cGUgPT0gQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRSB8fAogICAgICAgICAgICAgICAgIG5ldFR5cGUgPT0gQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRV9ISVBSSSkgewogICAgICAgICAgICAgbUlzRGVmYXVsdE9ySGlwcmkgPSB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgbVBob25lU2VydmljZSA9IG51bGw7Ci0gICAgICAgIGlmKG5ldFR5cGUgPT0gQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRSkgewotICAgICAgICAgICAgbUVuYWJsZWQgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgfQogCi0gICAgICAgIG1EbnNQcm9wTmFtZXMgPSBuZXcgU3RyaW5nW10geworICAgICAgICBzRG5zUHJvcE5hbWVzID0gbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICAibmV0LnJtbmV0MC5kbnMxIiwKICAgICAgICAgICAgICAgICAibmV0LnJtbmV0MC5kbnMyIiwKICAgICAgICAgICAgICAgICAibmV0LmV0aDAuZG5zMSIsCkBAIC05OSwxNjYgKzkzLDE2NyBAQAogICAgICAgICAgICAgICAgICJuZXQuZ3Bycy5kbnMyIiwKICAgICAgICAgICAgICAgICAibmV0LnBwcDAuZG5zMSIsCiAgICAgICAgICAgICAgICAgIm5ldC5wcHAwLmRuczIifTsKLQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEJlZ2luIG1vbml0b3JpbmcgbW9iaWxlIGRhdGEgY29ubmVjdGl2aXR5LgorICAgICAqIEJlZ2luIG1vbml0b3JpbmcgZGF0YSBjb25uZWN0aXZpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBpcyB0aGUgY3VycmVudCBBbmRyb2lkIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IGlzIHRoZSBIYW5kZXIgdG8gd2hpY2ggdG8gcmV0dXJuIHRoZSBldmVudHMuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRNb25pdG9yaW5nKCkgeworICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZyhDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgdGFyZ2V0KSB7CisgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKwogICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0KICAgICAgICAgICAgICAgICBuZXcgSW50ZW50RmlsdGVyKFRlbGVwaG9ueUludGVudHMuQUNUSU9OX0FOWV9EQVRBX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7CiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oVGVsZXBob255SW50ZW50cy5BQ1RJT05fREFUQV9DT05ORUNUSU9OX0ZBSUxFRCk7CiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oVGVsZXBob255SW50ZW50cy5BQ1RJT05fU0VSVklDRV9TVEFURV9DSEFOR0VEKTsKIAotICAgICAgICBtU3RhdGVSZWNlaXZlciA9IG5ldyBNb2JpbGVEYXRhU3RhdGVSZWNlaXZlcigpOwotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtU3RhdGVSZWNlaXZlciwgZmlsdGVyKTsKLSAgICAgICAgaWYgKGludGVudCAhPSBudWxsKQotICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSA9IGdldE1vYmlsZURhdGFTdGF0ZShpbnRlbnQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtTW9iaWxlRGF0YVN0YXRlID0gUGhvbmUuRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihuZXcgTW9iaWxlRGF0YVN0YXRlUmVjZWl2ZXIoKSwgZmlsdGVyKTsKKyAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSA9IFBob25lLkRhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBQaG9uZS5EYXRhU3RhdGUgZ2V0TW9iaWxlRGF0YVN0YXRlKEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgU3RyaW5nIHN0ciA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5TVEFURV9LRVkpOwotICAgICAgICBpZiAoc3RyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBhcG5UeXBlTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFU19LRVkpOwotICAgICAgICAgICAgaWYgKGlzQXBuVHlwZUluY2x1ZGVkKGFwblR5cGVMaXN0KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFbnVtLnZhbHVlT2YoUGhvbmUuRGF0YVN0YXRlLmNsYXNzLCBzdHIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQaG9uZS5EYXRhU3RhdGUuRElTQ09OTkVDVEVEOworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSVAgYWRkcmVzc2VzIG9mIHRoZSBETlMgc2VydmVycyBhdmFpbGFibGUgZm9yIHRoZSBtb2JpbGUgZGF0YQorICAgICAqIG5ldHdvcmsgaW50ZXJmYWNlLgorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIEROUyBhZGRyZXNzZXMsIHdpdGggbm8gaG9sZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldERuc1Byb3BOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIHNEbnNQcm9wTmFtZXM7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQXBuVHlwZUluY2x1ZGVkKFN0cmluZyB0eXBlTGlzdCkgewotICAgICAgICAvKiBjb21tYSBzZXBlcmF0ZWQgbGlzdCAtIHNwbGl0IGFuZCBjaGVjayAqLwotICAgICAgICBpZiAodHlwZUxpc3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVEbnNSb3V0ZVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qcml2YXRlRG5zUm91dGVTZXQ7CisgICAgfQogCi0gICAgICAgIFN0cmluZ1tdIGxpc3QgPSB0eXBlTGlzdC5zcGxpdCgiLCIpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwgbGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5lcXVhbHMobGlzdFtpXSwgbUFwblR5cGVUb1dhdGNoRm9yKSB8fAotICAgICAgICAgICAgICAgIFRleHRVdGlscy5lcXVhbHMobGlzdFtpXSwgUGhvbmUuQVBOX1RZUEVfQUxMKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBwdWJsaWMgdm9pZCBwcml2YXRlRG5zUm91dGVTZXQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1Qcml2YXRlRG5zUm91dGVTZXQgPSBlbmFibGVkOworICAgIH0KKworICAgIHB1YmxpYyBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG1OZXR3b3JrSW5mbzsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERlZmF1bHRHYXRld2F5QWRkcigpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0R2F0ZXdheUFkZHI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0Um91dGVTZXQoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdFJvdXRlU2V0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlZmF1bHRSb3V0ZVNldChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbURlZmF1bHRSb3V0ZVNldCA9IGVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZVdha2VMb2NrKCkgewogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgTW9iaWxlRGF0YVN0YXRlUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7Ci0gICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIgbUNvbm5lY3Rpdml0eU1hbmFnZXI7CisgICAgICAgIElDb25uZWN0aXZpdHlNYW5hZ2VyIG1Db25uZWN0aXZpdHlNYW5hZ2VyOworCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoVGVsZXBob255SW50ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgIEFDVElPTl9BTllfREFUQV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSA9IGdldE1vYmlsZURhdGFTdGF0ZShpbnRlbnQpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLlNUQVRFX0NIQU5HRV9SRUFTT05fS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFwbk5hbWUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFwblR5cGVMaXN0ID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVTX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BcG5OYW1lID0gYXBuTmFtZTsKKyAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFRlbGVwaG9ueUludGVudHMuCisgICAgICAgICAgICAgICAgICAgIEFDVElPTl9BTllfREFUQV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGFwblR5cGUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRV9LRVkpOwogCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdW5hdmFpbGFibGUgPSBpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKFBob25lLk5FVFdPUktfVU5BVkFJTEFCTEVfS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5lcXVhbHMoYXBuVHlwZSwgbUFwblR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlID0gRW51bS52YWx1ZU9mKFBob25lLkRhdGFTdGF0ZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5TVEFURV9LRVkpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLlNUQVRFX0NIQU5HRV9SRUFTT05fS0VZKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXBuTmFtZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9LRVkpOwogCi0gICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGlzIHJlZ2FyZGxlc3Mgb2YgdGhlIGFwblR5cGVMaXN0LiAgSXQncyBhbGwgdGhlIHNhbWUgcmFkaW8vbmV0d29yawotICAgICAgICAgICAgICAgICAgICAvLyB1bmRlcm5lYXRoCi0gICAgICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZSghdW5hdmFpbGFibGUpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gdW5hdmFpbGFibGUgPSBpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKFBob25lLk5FVFdPUktfVU5BVkFJTEFCTEVfS0VZLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZSghdW5hdmFpbGFibGUpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc0FwblR5cGVJbmNsdWRlZChhcG5UeXBlTGlzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBlbmFibGVkIGJ1dCB0aGUgQVBOIFR5cGUgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCByZWNvcmQgdGhlIGludGVyZmFjZSBuYW1lIGlmIG9uZSdzIHByb3ZpZGVkLiAgSWYgdGhlIHVzZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJucyBvbiB0aGlzIG5ldHdvcmsgd2Ugd2lsbCBuZWVkIHRoZSBpbnRlcmZhY2VuYW1lIGJ1dCB3b24ndCBnZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGZyZXNoIGNvbm5lY3RlZCBtZXNzYWdlIC0gVE9ETyBmaXggdGhpcyB3aGVuIHdlIGdldCBwZXItQVBOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInJlcGxhY2luZyBvbGQgbUludGVyZmFjZU5hbWUgKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lICsgIikgd2l0aCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9JRkFDRV9OQU1FX0tFWSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yICIgKyBtQXBuVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfSUZBQ0VfTkFNRV9LRVkpOworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgbUFwblR5cGUgKyAiIFJlY2VpdmVkIHN0YXRlPSAiICsgc3RhdGUgKyAiLCBvbGQ9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSArICIsIHJlYXNvbj0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAocmVhc29uID09IG51bGwgPyAiKHVuc3BlY2lmaWVkKSIgOiByZWFzb24pKTsKKworICAgICAgICAgICAgICAgIGlmIChtTW9iaWxlRGF0YVN0YXRlICE9IHN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNUZWFyZG93blJlcXVlc3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRlYXJkb3duUmVxdWVzdGVkKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBtQXBuVHlwZSArICIgUmVjZWl2ZWQgc3RhdGU9ICIgKyBzdGF0ZSArICIsIG9sZD0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSArICIsIHJlYXNvbj0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlYXNvbiA9PSBudWxsID8gIih1bnNwZWNpZmllZCkiIDogcmVhc29uKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgYXBuVHlwZUxpc3Q9ICIgKyBhcG5UeXBlTGlzdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Nb2JpbGVEYXRhU3RhdGUgIT0gc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNUZWFyZG93blJlcXVlc3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQsIHJlYXNvbiwgYXBuTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkb1Jlc2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUlzRGVmYXVsdE9ySGlwcmkgPT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGRlZmF1bHQgYW5kIGhpcHJpIG11c3QgZ28gZG93biBiZWZvcmUgd2UgcmVzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGVUb0NoZWNrID0gKFBob25lLkFQTl9UWVBFX0RFRkFVTFQuZXF1YWxzKG1BcG5UeXBlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFX0hJUFJJIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpdml0eU1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpdml0eU1hbmFnZXIgPSBJQ29ubmVjdGl2aXR5TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKGIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RFRCwgcmVhc29uLCBhcG5OYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkb1Jlc2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0RlZmF1bHRPckhpcHJpID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggZGVmYXVsdCBhbmQgaGlwcmkgbXVzdCBnbyBkb3duIGJlZm9yZSB3ZSByZXNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGVUb0NoZWNrID0gKFBob25lLkFQTl9UWVBFX0RFRkFVTFQuZXF1YWxzKG1BcG5UeXBlKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEVfSElQUkkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGl2aXR5TWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpdml0eU1hbmFnZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENvbm5lY3Rpdml0eU1hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpdml0eU1hbmFnZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtJbmZvIGluZm8gPSBtQ29ubmVjdGl2aXR5TWFuYWdlci5nZXROZXR3b3JrSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlVG9DaGVjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLmlzQ29ubmVjdGVkKCkgPT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVRvQ2hlY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLmlzQ29ubmVjdGVkKCkgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb1Jlc2V0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBnbyBhaGVhZCB3aXRoIHRoZSByZXNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIHRyeWluZyB0byBjb250YWN0IENvbm5TZXJ2aWNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvUmVzZXQgJiYgbUludGVyZmFjZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzLnJlc2V0Q29ubmVjdGlvbnMobUludGVyZmFjZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbid0IGRvIHRoaXMgaGVyZSAtIENvbm5lY3Rpdml0eVNlcnZpY2UgbmVlZHMgaXQgdG8gY2xlYXIgc3R1ZmYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBvayB0aG91Z2ggLSBqdXN0IGxlYXZlIGl0IHRvIGJlIHJlZnJlc2hlZCBuZXh0IHRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY29ubmVjdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoREJHKSBMb2cuZChUQUcsICJjbGVhcmluZyBtSW50ZXJmYWNlTmFtZSBmb3IgIisgbUFwblR5cGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIiBhcyBpdCBESVNDT05ORUNURUQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tSW50ZXJmYWNlTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbURlZmF1bHRHYXRld2F5QWRkciA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RJTkcsIHJlYXNvbiwgYXBuTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1VTUEVOREVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuU1VTUEVOREVELCByZWFzb24sIGFwbk5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZU5hbWUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9JRkFDRV9OQU1FX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSW50ZXJmYWNlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDT05ORUNURUQgZXZlbnQgZGlkIG5vdCBzdXBwbHkgaW50ZXJmYWNlIG5hbWUuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmF1bHRHYXRld2F5QWRkciA9IGludGVudC5nZXRJbnRFeHRyYShQaG9uZS5EQVRBX0dBVEVXQVlfS0VZLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCwgcmVhc29uLCBhcG5OYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb1Jlc2V0ICYmIG1MaW5rUHJvcGVydGllcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZmFjZSA9IG1MaW5rUHJvcGVydGllcy5nZXRJbnRlcmZhY2VOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZmFjZSAhPSBudWxsKSBOZXR3b3JrVXRpbHMucmVzZXRDb25uZWN0aW9ucyhpZmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBjaGVjayB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuJ3QgZG8gdGhpcyBoZXJlIC0gQ29ubmVjdGl2aXR5U2VydmljZSBuZWVkcyBpdCB0byBjbGVhciBzdHVmZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3Mgb2sgdGhvdWdoIC0ganVzdCBsZWF2ZSBpdCB0byBiZSByZWZyZXNoZWQgbmV4dCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY29ubmVjdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChEQkcpIExvZy5kKFRBRywgImNsZWFyaW5nIG1JbnRlcmZhY2VOYW1lIGZvciAiKyBtQXBuVHlwZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICIgYXMgaXQgRElTQ09OTkVDVEVEIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tSW50ZXJmYWNlTmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tRGVmYXVsdEdhdGV3YXlBZGRyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVElORywgcmVhc29uLCBhcG5OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1VTUEVOREVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5TVVNQRU5ERUQsIHJlYXNvbiwgYXBuTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhvbmUuREFUQV9MSU5LX1BST1BFUlRJRVNfS0VZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUxpbmtQcm9wZXJ0aWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT05ORUNURUQgZXZlbnQgZGlkIG5vdCBzdXBwbHkgbGluayBwcm9wZXJ0aWVzLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVEVELCByZWFzb24sIGFwbk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICBlcXVhbHMoVGVsZXBob255SW50ZW50cy5BQ1RJT05fREFUQV9DT05ORUNUSU9OX0ZBSUxFRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5GQUlMVVJFX1JFQVNPTl9LRVkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXBuTmFtZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9LRVkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJSZWNlaXZlZCAiICsgaW50ZW50LmdldEFjdGlvbigpICsgIiBicm9hZGNhc3QiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb24gPT0gbnVsbCA/ICIiIDogIigiICsgcmVhc29uICsgIikiKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkZBSUxFRCwgcmVhc29uLCBhcG5OYW1lKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlciB0bSA9IFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpOwotICAgICAgICAgICAgICAgIHNldFJvYW1pbmdTdGF0dXModG0uaXNOZXR3b3JrUm9hbWluZygpKTsKLSAgICAgICAgICAgICAgICBzZXRTdWJ0eXBlKHRtLmdldE5ldHdvcmtUeXBlKCksIHRtLmdldE5ldHdvcmtUeXBlTmFtZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW50ZW50LmdldEFjdGlvbigpLgorICAgICAgICAgICAgICAgICAgICBlcXVhbHMoVGVsZXBob255SW50ZW50cy5BQ1RJT05fREFUQV9DT05ORUNUSU9OX0ZBSUxFRCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXBuVHlwZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFX0tFWSk7CisgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuZXF1YWxzKGFwblR5cGUsIG1BcG5UeXBlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuRkFJTFVSRV9SRUFTT05fS0VZKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXBuTmFtZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9LRVkpOworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgbUFwblR5cGUgKyAiUmVjZWl2ZWQgIiArIGludGVudC5nZXRBY3Rpb24oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJyb2FkY2FzdCIgKyByZWFzb24gPT0gbnVsbCA/ICIiIDogIigiICsgcmVhc29uICsgIikiKTsKKyAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuRkFJTEVELCByZWFzb24sIGFwbk5hbWUpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgVGVsZXBob255TWFuYWdlciB0bSA9IFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNTAsNzAgKzM0NSw4OCBAQAogICAgIC8qKgogICAgICAqIFRlYXIgZG93biBtb2JpbGUgZGF0YSBjb25uZWN0aXZpdHksIGkuZS4sIGRpc2FibGUgdGhlIGFiaWxpdHkgdG8gY3JlYXRlCiAgICAgICogbW9iaWxlIGRhdGEgY29ubmVjdGlvbnMuCisgICAgICogVE9ETyAtIG1ha2UgYXN5bmMgYW5kIHJldHVybiBub3RoaW5nPwogICAgICAqLwotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHRlYXJkb3duKCkgewotICAgICAgICAvLyBzaW5jZSB3ZSB3b24ndCBnZXQgYSBub3RpZmljYXRpb24gY3VycmVudGx5IChUT0RPIC0gcGVyIEFQTiBub3RpZmljYXRpb25zKQotICAgICAgICAvLyB3ZSB3b24ndCBnZXQgYSBkaXNjb25uZWN0IG1lc3NhZ2UgdW50aWwgYWxsIEFQTidzIG9uIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24ncwotICAgICAgICAvLyBBUE4gbGlzdCBhcmUgZGlzYWJsZWQuICBUaGF0IG1lYW5zIHByaXZhdGVSb3V0ZXMgZm9yIEROUyBhbmQgc3VjaCB3aWxsIHJlbWFpbiBvbiAtCi0gICAgICAgIC8vIG5vdCBhIHByb2JsZW0gc2luY2UgdGhhdCdzIGFsbCBzaGFyZWQgd2l0aCB3aGF0ZXZlciBvdGhlciBBUE4gaXMgc3RpbGwgb24sIGJ1dAotICAgICAgICAvLyB1Z2x5LgogICAgICAgICBzZXRUZWFyZG93blJlcXVlc3RlZCh0cnVlKTsKICAgICAgICAgcmV0dXJuIChzZXRFbmFibGVBcG4obUFwblR5cGUsIGZhbHNlKSAhPSBQaG9uZS5BUE5fUkVRVUVTVF9GQUlMRUQpOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZGV0YWlsZWQgc3RhdGUgb2YgYSBuZXR3b3JrLCBhbmQgaWYgaXQgaXMgYQorICAgICAqIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cyBzdGF0ZSwgc2VuZCBhIG5vdGlmaWNhdGlvbiB0bworICAgICAqIGFueSBsaXN0ZW5lcnMuCisgICAgICogQHBhcmFtIHN0YXRlIHRoZSBuZXcgQHtjb2RlIERldGFpbGVkU3RhdGV9CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldERldGFpbGVkU3RhdGUoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSkgeworICAgICAgICBzZXREZXRhaWxlZFN0YXRlKHN0YXRlLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGRldGFpbGVkIHN0YXRlIG9mIGEgbmV0d29yaywgYW5kIGlmIGl0IGlzIGEKKyAgICAgKiBjaGFuZ2UgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUsIHNlbmQgYSBub3RpZmljYXRpb24gdG8KKyAgICAgKiBhbnkgbGlzdGVuZXJzLgorICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IEB7Y29kZSBEZXRhaWxlZFN0YXRlfQorICAgICAqIEBwYXJhbSByZWFzb24gYSB7QGNvZGUgU3RyaW5nfSBpbmRpY2F0aW5nIGEgcmVhc29uIGZvciB0aGUgc3RhdGUgY2hhbmdlLAorICAgICAqIGlmIG9uZSB3YXMgc3VwcGxpZWQuIE1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHBhcmFtIGV4dHJhSW5mbyBvcHRpb25hbCB7QGNvZGUgU3RyaW5nfSBwcm92aWRpbmcgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXRlIGNoYW5nZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXREZXRhaWxlZFN0YXRlKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUsIFN0cmluZyByZWFzb24sIFN0cmluZyBleHRyYUluZm8pIHsKKyAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAic2V0RGV0YWlsZWQgc3RhdGUsIG9sZCA9IgorICAgICAgICAgICAgICAgICsgbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSArICIgYW5kIG5ldyBzdGF0ZT0iICsgc3RhdGUpOworICAgICAgICBpZiAoc3RhdGUgIT0gbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSkgeworICAgICAgICAgICAgYm9vbGVhbiB3YXNDb25uZWN0aW5nID0gKG1OZXR3b3JrSW5mby5nZXRTdGF0ZSgpID09IE5ldHdvcmtJbmZvLlN0YXRlLkNPTk5FQ1RJTkcpOworICAgICAgICAgICAgU3RyaW5nIGxhc3RSZWFzb24gPSBtTmV0d29ya0luZm8uZ2V0UmVhc29uKCk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSWYgYSByZWFzb24gd2FzIHN1cHBsaWVkIHdoZW4gdGhlIENPTk5FQ1RJTkcgc3RhdGUgd2FzIGVudGVyZWQsIGFuZCBubworICAgICAgICAgICAgICogcmVhc29uIHdhcyBzdXBwbGllZCBmb3IgZW50ZXJpbmcgdGhlIENPTk5FQ1RFRCBzdGF0ZSwgdGhlbiByZXRhaW4gdGhlCisgICAgICAgICAgICAgKiByZWFzb24gdGhhdCB3YXMgc3VwcGxpZWQgd2hlbiBnb2luZyB0byBDT05ORUNUSU5HLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAod2FzQ29ubmVjdGluZyAmJiBzdGF0ZSA9PSBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCAmJiByZWFzb24gPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBsYXN0UmVhc29uICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVhc29uID0gbGFzdFJlYXNvbjsKKyAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXREZXRhaWxlZFN0YXRlKHN0YXRlLCByZWFzb24sIGV4dHJhSW5mbyk7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9TVEFURV9DSEFOR0VELCBtTmV0d29ya0luZm8pOworICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldERldGFpbGVkU3RhdGVJbnRlcm5hbChOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHN0YXRlKSB7CisgICAgICAgIG1OZXR3b3JrSW5mby5zZXREZXRhaWxlZFN0YXRlKHN0YXRlLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUZWFyZG93blJlcXVlc3RlZChib29sZWFuIGlzUmVxdWVzdGVkKSB7CisgICAgICAgIG1UZWFyZG93blJlcXVlc3RlZCA9IGlzUmVxdWVzdGVkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVGVhcmRvd25SZXF1ZXN0ZWQoKSB7CisgICAgICAgIHJldHVybiBtVGVhcmRvd25SZXF1ZXN0ZWQ7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmUtZW5hYmxlIG1vYmlsZSBkYXRhIGNvbm5lY3Rpdml0eSBhZnRlciBhIHtAbGluayAjdGVhcmRvd24oKX0uCisgICAgICogVE9ETyAtIG1ha2UgYXN5bmMgYW5kIGFsd2F5cyBnZXQgYSBub3RpZmljYXRpb24/CiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcmVjb25uZWN0KCkgeworICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7IC8vY29ubmVjdGVkIG9yIGV4cGVjdCB0byBiZT8KICAgICAgICAgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoZmFsc2UpOwogICAgICAgICBzd2l0Y2ggKHNldEVuYWJsZUFwbihtQXBuVHlwZSwgdHJ1ZSkpIHsKICAgICAgICAgICAgIGNhc2UgUGhvbmUuQVBOX0FMUkVBRFlfQUNUSVZFOgotICAgICAgICAgICAgICAgIC8vIFRPRE8gLSByZW1vdmUgdGhpcyB3aGVuIHdlIGdldCBwZXItYXBuIG5vdGlmaWNhdGlvbnMKLSAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBzZXQgc2VsZiB0byBDT05ORUNUSU5HIHNvIHRoZSBiZWxvdyBtZXNzYWdlIGlzIGhhbmRsZWQuCi0gICAgICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSA9IFBob25lLkRhdGFTdGF0ZS5DT05ORUNUSU5HOwotICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNUSU5HLCBQaG9uZS5SRUFTT05fQVBOX0NIQU5HRUQsIG51bGwpOwotICAgICAgICAgICAgICAgIC8vc2VuZCBvdXQgYSBjb25uZWN0ZWQgbWVzc2FnZQotICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFRlbGVwaG9ueUludGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICBBQ1RJT05fQU5ZX0RBVEFfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuU1RBVEVfS0VZLCBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVEVELnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5TVEFURV9DSEFOR0VfUkVBU09OX0tFWSwgUGhvbmUuUkVBU09OX0FQTl9DSEFOR0VEKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRVNfS0VZLCBtQXBuVHlwZVRvV2F0Y2hGb3IpOwotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0FQTl9LRVksIG1BcG5OYW1lKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9JRkFDRV9OQU1FX0tFWSwgbUludGVyZmFjZU5hbWUpOwotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5ORVRXT1JLX1VOQVZBSUxBQkxFX0tFWSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGlmIChtU3RhdGVSZWNlaXZlciAhPSBudWxsKSBtU3RhdGVSZWNlaXZlci5vblJlY2VpdmUobUNvbnRleHQsIGludGVudCk7CisgICAgICAgICAgICAgICAgcmV0VmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBQaG9uZS5BUE5fUkVRVUVTVF9TVEFSVEVEOgotICAgICAgICAgICAgICAgIG1FbmFibGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGRvIGFueXRoaW5nIC0gd2UncmUgYWxyZWFkeSBkdWUgc29tZSBzdGF0dXMgdXBkYXRlIGludGVudHMKKyAgICAgICAgICAgICAgICByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFBob25lLkFQTl9SRVFVRVNUX0ZBSUxFRDoKLSAgICAgICAgICAgICAgICBpZiAobVBob25lU2VydmljZSA9PSBudWxsICYmIG1BcG5UeXBlID09IFBob25lLkFQTl9UWVBFX0RFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gb24gc3RhcnR1cCB3ZSBtYXkgdHJ5IHRvIHRhbGsgdG8gdGhlIHBob25lIGJlZm9yZSBpdCdzIHJlYWR5Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBwaG9uZSB3aWxsIGNvbWUgdXAgZW5hYmxlZCwgZ28gd2l0aCB0aGF0LgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIC0gdGhpcyBhbHNvIGNvbWVzIHVwIG9uIHRlbGVwaG9ueSBjcmFzaDogaWYgd2UgdGhpbmsgbW9iaWxlIGRhdGEgaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gb2ZmIGFuZCB0aGUgdGVsZXBob255IHN0dWZmIGNyYXNoZXMgYW5kIGhhcyB0byByZXN0YXJ0IGl0IHdpbGwgY29tZSB1cAotICAgICAgICAgICAgICAgICAgICAvLyBlbmFibGVkIChtYWtpbmcgYSBkYXRhIGNvbm5lY3Rpb24pLiAgV2Ugd2lsbCB0aGVuIGJlIG91dCBvZiBzeW5jLgotICAgICAgICAgICAgICAgICAgICAvLyBBIHBvc3NpYmxlIHNvbHV0aW9uIGlzIGEgYnJvYWRjYXN0IHdoZW4gdGVsZXBob255IHJlc3RhcnRzLgotICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gZWxzZSBmYWxsIHRocm91Z2gKICAgICAgICAgICAgIGNhc2UgUGhvbmUuQVBOX1RZUEVfTk9UX0FWQUlMQUJMRToKLSAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGlzIGFsd2F5cyBhdmFpbGFibGUsIGJ1dCBtYXkgYmUgb2ZmIGR1ZSB0bwotICAgICAgICAgICAgICAgIC8vIEFpcnBsYW5lTW9kZSBvciBFLUNhbGwgb3Igd2hhdGV2ZXIuLgotICAgICAgICAgICAgICAgIGlmIChtQXBuVHlwZSAhPSBQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBpbiByZWNvbm5lY3QgLSB1bmV4cGVjdGVkIHJlc3BvbnNlLiIpOwotICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1FbmFibGVkOworICAgICAgICByZXR1cm4gcmV0VmFsdWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC00ODYsMjUgKzQ5OSw2IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBFbnN1cmUgdGhhdCBhIG5ldHdvcmsgcm91dGUgZXhpc3RzIHRvIGRlbGl2ZXIgdHJhZmZpYyB0byB0aGUgc3BlY2lmaWVkCi0gICAgICogaG9zdCB2aWEgdGhlIG1vYmlsZSBkYXRhIG5ldHdvcmsuCi0gICAgICogQHBhcmFtIGhvc3RBZGRyZXNzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSByb3V0ZSBpcyBkZXNpcmVkLAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RSb3V0ZVRvSG9zdChJbmV0QWRkcmVzcyBob3N0QWRkcmVzcykgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJSZXF1ZXN0ZWQgaG9zdCByb3V0ZSB0byAiICsgaG9zdEFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKSArCi0gICAgICAgICAgICAgICAgICAgICIgZm9yICIgKyBtQXBuVHlwZSArICIoIiArIG1JbnRlcmZhY2VOYW1lICsgIikiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUludGVyZmFjZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIE5ldHdvcmtVdGlscy5hZGRIb3N0Um91dGUobUludGVyZmFjZU5hbWUsIGhvc3RBZGRyZXNzLCBudWxsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIk1vYmlsZSBkYXRhIHN0YXRlOiAiKTsKQEAgLTU2Niw0ICs1NjAsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQorCisgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gbmV3IExpbmtQcm9wZXJ0aWVzKG1MaW5rUHJvcGVydGllcyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya0luZm8uamF2YQppbmRleCA2NDljYjhjLi41ZjVlMTFjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya0luZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya0luZm8uamF2YQpAQCAtOTcsNyArOTcsNyBAQAogICAgICAgICBzdGF0ZU1hcC5wdXQoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQsIFN0YXRlLkRJU0NPTk5FQ1RFRCk7CiAgICAgICAgIHN0YXRlTWFwLnB1dChEZXRhaWxlZFN0YXRlLkZBSUxFRCwgU3RhdGUuRElTQ09OTkVDVEVEKTsKICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIGludCBtTmV0d29ya1R5cGU7CiAgICAgcHJpdmF0ZSBpbnQgbVN1YnR5cGU7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbVR5cGVOYW1lOwpAQCAtMTIxLDcgKzEyMSwxMCBAQAogICAgICAqLwogICAgIHB1YmxpYyBOZXR3b3JrSW5mbyhpbnQgdHlwZSkge30KIAotICAgIE5ldHdvcmtJbmZvKGludCB0eXBlLCBpbnQgc3VidHlwZSwgU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgc3VidHlwZU5hbWUpIHsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBOZXR3b3JrSW5mbyhpbnQgdHlwZSwgaW50IHN1YnR5cGUsIFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHN1YnR5cGVOYW1lKSB7CiAgICAgICAgIGlmICghQ29ubmVjdGl2aXR5TWFuYWdlci5pc05ldHdvcmtUeXBlVmFsaWQodHlwZSkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgbmV0d29yayB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgIH0KQEAgLTE0MSw3ICsxNDQsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIG5ldHdvcmsgdHlwZQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1OZXR3b3JrVHlwZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbU5ldHdvcmtUeXBlOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNTAsMTIgKzE1NSwxNiBAQAogICAgICAqIEByZXR1cm4gdGhlIG5ldHdvcmsgc3VidHlwZQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0U3VidHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TdWJ0eXBlOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3VidHlwZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHZvaWQgc2V0U3VidHlwZShpbnQgc3VidHlwZSwgU3RyaW5nIHN1YnR5cGVOYW1lKSB7Ci0gICAgICAgIG1TdWJ0eXBlID0gc3VidHlwZTsKLSAgICAgICAgbVN1YnR5cGVOYW1lID0gc3VidHlwZU5hbWU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbVN1YnR5cGUgPSBzdWJ0eXBlOworICAgICAgICAgICAgbVN1YnR5cGVOYW1lID0gc3VidHlwZU5hbWU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE2NCw3ICsxNzMsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5ldHdvcmsgdHlwZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtVHlwZU5hbWU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1UeXBlTmFtZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTcyLDcgKzE4Myw5IEBACiAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbmV0d29yayBzdWJ0eXBlCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRTdWJ0eXBlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TdWJ0eXBlTmFtZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVN1YnR5cGVOYW1lOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xODUsNyArMTk4LDkgQEAKICAgICAgKiBvZiBiZWluZyBlc3RhYmxpc2hlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWRPckNvbm5lY3RpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEIHx8IG1TdGF0ZSA9PSBTdGF0ZS5DT05ORUNUSU5HOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEIHx8IG1TdGF0ZSA9PSBTdGF0ZS5DT05ORUNUSU5HOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xOTQsNyArMjA5LDkgQEAKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBuZXR3b3JrIGNvbm5lY3Rpdml0eSBleGlzdHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkgewotICAgICAgICByZXR1cm4gbVN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRDsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjEwLDcgKzIyNyw5IEBACiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG5ldHdvcmsgaXMgYXZhaWxhYmxlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKCkgewotICAgICAgICByZXR1cm4gbUlzQXZhaWxhYmxlOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtSXNBdmFpbGFibGU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTIyMCw3ICsyMzksOSBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SXNBdmFpbGFibGUoYm9vbGVhbiBpc0F2YWlsYWJsZSkgewotICAgICAgICBtSXNBdmFpbGFibGUgPSBpc0F2YWlsYWJsZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtSXNBdmFpbGFibGUgPSBpc0F2YWlsYWJsZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjMxLDcgKzI1Miw5IEBACiAgICAgICogb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRmFpbG92ZXIoKSB7Ci0gICAgICAgIHJldHVybiBtSXNGYWlsb3ZlcjsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbUlzRmFpbG92ZXI7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTI0MSw3ICsyNjQsOSBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RmFpbG92ZXIoYm9vbGVhbiBpc0ZhaWxvdmVyKSB7Ci0gICAgICAgIG1Jc0ZhaWxvdmVyID0gaXNGYWlsb3ZlcjsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtSXNGYWlsb3ZlciA9IGlzRmFpbG92ZXI7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTI1MSwxMSArMjc2LDE1IEBACiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgcm9hbWluZyBpcyBpbiBlZmZlY3QsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzUm9hbWluZygpIHsKLSAgICAgICAgcmV0dXJuIG1Jc1JvYW1pbmc7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1Jc1JvYW1pbmc7CisgICAgICAgIH0KICAgICB9CiAKICAgICB2b2lkIHNldFJvYW1pbmcoYm9vbGVhbiBpc1JvYW1pbmcpIHsKLSAgICAgICAgbUlzUm9hbWluZyA9IGlzUm9hbWluZzsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtSXNSb2FtaW5nID0gaXNSb2FtaW5nOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNjMsNyArMjkyLDkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBjb2Fyc2UtZ3JhaW5lZCBzdGF0ZQogICAgICAqLwogICAgIHB1YmxpYyBTdGF0ZSBnZXRTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVN0YXRlOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNzEsNyArMzAyLDkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBmaW5lLWdyYWluZWQgc3RhdGUKICAgICAgKi8KICAgICBwdWJsaWMgRGV0YWlsZWRTdGF0ZSBnZXREZXRhaWxlZFN0YXRlKCkgewotICAgICAgICByZXR1cm4gbURldGFpbGVkU3RhdGU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1EZXRhaWxlZFN0YXRlOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yODEsMTIgKzMxNCwxNSBAQAogICAgICAqIGlmIG9uZSB3YXMgc3VwcGxpZWQuIE1heSBiZSB7QGNvZGUgbnVsbH0uCiAgICAgICogQHBhcmFtIGV4dHJhSW5mbyBhbiBvcHRpb25hbCB7QGNvZGUgU3RyaW5nfSBwcm92aWRpbmcgYWRkZGl0aW9uYWwgbmV0d29yayBzdGF0ZQogICAgICAqIGluZm9ybWF0aW9uIHBhc3NlZCB1cCBmcm9tIHRoZSBsb3dlciBuZXR3b3JraW5nIGxheWVycy4KKyAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlIGRldGFpbGVkU3RhdGUsIFN0cmluZyByZWFzb24sIFN0cmluZyBleHRyYUluZm8pIHsKLSAgICAgICAgdGhpcy5tRGV0YWlsZWRTdGF0ZSA9IGRldGFpbGVkU3RhdGU7Ci0gICAgICAgIHRoaXMubVN0YXRlID0gc3RhdGVNYXAuZ2V0KGRldGFpbGVkU3RhdGUpOwotICAgICAgICB0aGlzLm1SZWFzb24gPSByZWFzb247Ci0gICAgICAgIHRoaXMubUV4dHJhSW5mbyA9IGV4dHJhSW5mbzsKKyAgICBwdWJsaWMgdm9pZCBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUgZGV0YWlsZWRTdGF0ZSwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGV4dHJhSW5mbykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHRoaXMubURldGFpbGVkU3RhdGUgPSBkZXRhaWxlZFN0YXRlOworICAgICAgICAgICAgdGhpcy5tU3RhdGUgPSBzdGF0ZU1hcC5nZXQoZGV0YWlsZWRTdGF0ZSk7CisgICAgICAgICAgICB0aGlzLm1SZWFzb24gPSByZWFzb247CisgICAgICAgICAgICB0aGlzLm1FeHRyYUluZm8gPSBleHRyYUluZm87CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTI5NSw3ICszMzEsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIHJlYXNvbiBmb3IgZmFpbHVyZSwgb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRSZWFzb24oKSB7Ci0gICAgICAgIHJldHVybiBtUmVhc29uOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtUmVhc29uOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMDUsMjAgKzM0MywyNCBAQAogICAgICAqIEByZXR1cm4gdGhlIGV4dHJhIGluZm9ybWF0aW9uLCBvciBudWxsIGlmIG5vdCBhdmFpbGFibGUKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEV4dHJhSW5mbygpIHsKLSAgICAgICAgcmV0dXJuIG1FeHRyYUluZm87CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1FeHRyYUluZm87CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigiTmV0d29ya0luZm86ICIpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgidHlwZTogIikuYXBwZW5kKGdldFR5cGVOYW1lKCkpLmFwcGVuZCgiWyIpLmFwcGVuZChnZXRTdWJ0eXBlTmFtZSgpKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIl0sIHN0YXRlOiAiKS5hcHBlbmQobVN0YXRlKS5hcHBlbmQoIi8iKS5hcHBlbmQobURldGFpbGVkU3RhdGUpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCByZWFzb246ICIpLmFwcGVuZChtUmVhc29uID09IG51bGwgPyAiKHVuc3BlY2lmaWVkKSIgOiBtUmVhc29uKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgZXh0cmE6ICIpLmFwcGVuZChtRXh0cmFJbmZvID09IG51bGwgPyAiKG5vbmUpIiA6IG1FeHRyYUluZm8pLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCByb2FtaW5nOiAiKS5hcHBlbmQobUlzUm9hbWluZykuCi0gICAgICAgICAgICAgICAgYXBwZW5kKCIsIGZhaWxvdmVyOiAiKS5hcHBlbmQobUlzRmFpbG92ZXIpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCBpc0F2YWlsYWJsZTogIikuYXBwZW5kKG1Jc0F2YWlsYWJsZSk7Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoIk5ldHdvcmtJbmZvOiAiKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJ0eXBlOiAiKS5hcHBlbmQoZ2V0VHlwZU5hbWUoKSkuYXBwZW5kKCJbIikuYXBwZW5kKGdldFN1YnR5cGVOYW1lKCkpLgorICAgICAgICAgICAgYXBwZW5kKCJdLCBzdGF0ZTogIikuYXBwZW5kKG1TdGF0ZSkuYXBwZW5kKCIvIikuYXBwZW5kKG1EZXRhaWxlZFN0YXRlKS4KKyAgICAgICAgICAgIGFwcGVuZCgiLCByZWFzb246ICIpLmFwcGVuZChtUmVhc29uID09IG51bGwgPyAiKHVuc3BlY2lmaWVkKSIgOiBtUmVhc29uKS4KKyAgICAgICAgICAgIGFwcGVuZCgiLCBleHRyYTogIikuYXBwZW5kKG1FeHRyYUluZm8gPT0gbnVsbCA/ICIobm9uZSkiIDogbUV4dHJhSW5mbykuCisgICAgICAgICAgICBhcHBlbmQoIiwgcm9hbWluZzogIikuYXBwZW5kKG1Jc1JvYW1pbmcpLgorICAgICAgICAgICAgYXBwZW5kKCIsIGZhaWxvdmVyOiAiKS5hcHBlbmQobUlzRmFpbG92ZXIpLgorICAgICAgICAgICAgYXBwZW5kKCIsIGlzQXZhaWxhYmxlOiAiKS5hcHBlbmQobUlzQXZhaWxhYmxlKTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTMzNCwxNyArMzc2LDE5IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgZGVzdC53cml0ZUludChtTmV0d29ya1R5cGUpOwotICAgICAgICBkZXN0LndyaXRlSW50KG1TdWJ0eXBlKTsKLSAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtVHlwZU5hbWUpOwotICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TdWJ0eXBlTmFtZSk7Ci0gICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVN0YXRlLm5hbWUoKSk7Ci0gICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobURldGFpbGVkU3RhdGUubmFtZSgpKTsKLSAgICAgICAgZGVzdC53cml0ZUludChtSXNGYWlsb3ZlciA/IDEgOiAwKTsKLSAgICAgICAgZGVzdC53cml0ZUludChtSXNBdmFpbGFibGUgPyAxIDogMCk7Ci0gICAgICAgIGRlc3Qud3JpdGVJbnQobUlzUm9hbWluZyA/IDEgOiAwKTsKLSAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtUmVhc29uKTsKLSAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtRXh0cmFJbmZvKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1OZXR3b3JrVHlwZSk7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1TdWJ0eXBlKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVR5cGVOYW1lKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVN1YnR5cGVOYW1lKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVN0YXRlLm5hbWUoKSk7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1EZXRhaWxlZFN0YXRlLm5hbWUoKSk7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1Jc0ZhaWxvdmVyID8gMSA6IDApOworICAgICAgICAgICAgZGVzdC53cml0ZUludChtSXNBdmFpbGFibGUgPyAxIDogMCk7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1Jc1JvYW1pbmcgPyAxIDogMCk7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1SZWFzb24pOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtRXh0cmFJbmZvKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0ZVRyYWNrZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdGVUcmFja2VyLmphdmEKaW5kZXggODM4Njk2ZC4uNDIwOTkyYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0ZVRyYWNrZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRlVHJhY2tlci5qYXZhCkBAIC0xNiwzNjIgKzE2LDEyMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmV0OwogCi1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiAKIC8qKgotICogRWFjaCBzdWJjbGFzcyBvZiB0aGlzIGNsYXNzIGtlZXBzIHRyYWNrIG9mIHRoZSBzdGF0ZSBvZiBjb25uZWN0aXZpdHkKLSAqIG9mIGEgbmV0d29yayBpbnRlcmZhY2UuIEFsbCBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgYSBuZXR3b3JrIHNob3VsZAotICogYmUga2VwdCBpbiBhIFRyYWNrZXIgY2xhc3MuIFRoaXMgc3VwZXJjbGFzcyBtYW5hZ2VzIHRoZQotICogbmV0d29yay10eXBlLWluZGVwZW5kZW50IGFzcGVjdHMgb2YgbmV0d29yayBzdGF0ZS4KKyAqIEludGVyZmFjZSBwcm92aWRlcyB0aGUge0BsaW5rIGNvbS5hbmRyb2lkLnNlcnZlci5Db25uZWN0aXZpdHlTZXJ2aWNlfQorICogd2l0aCB0aHJlZSBzZXJ2aWNlcy4gRXZlbnRzIHRvIHRoZSBDb25uZWN0aXZpdHlTZXJ2aWNlIHdoZW4KKyAqIGNoYW5nZXMgb2NjdXIsIGFuIEFQSSBmb3IgY29udHJvbGxpbmcgdGhlIG5ldHdvcmsgYW5kIHN0b3JhZ2UKKyAqIGZvciBuZXR3b3JrIHNwZWNpZmljIGluZm9ybWF0aW9uLgorICoKKyAqIFRoZSBDb25uZWN0aXZpdHkgd2lsbCBjYWxsIHN0YXJ0TW9uaXRvcmluZyBiZWZvcmUgYW55IG90aGVyCisgKiBtZXRob2QgaXMgY2FsbGVkLgogICoKICAqIHtAaGlkZX0KICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5ldHdvcmtTdGF0ZVRyYWNrZXIgZXh0ZW5kcyBIYW5kbGVyIHsKK3B1YmxpYyBpbnRlcmZhY2UgTmV0d29ya1N0YXRlVHJhY2tlciB7CiAKLSAgICBwcm90ZWN0ZWQgTmV0d29ya0luZm8gbU5ldHdvcmtJbmZvOwotICAgIHByb3RlY3RlZCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByb3RlY3RlZCBIYW5kbGVyIG1UYXJnZXQ7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBtSW50ZXJmYWNlTmFtZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gbURuc1Byb3BOYW1lczsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVByaXZhdGVEbnNSb3V0ZVNldDsKLSAgICBwcm90ZWN0ZWQgaW50IG1EZWZhdWx0R2F0ZXdheUFkZHI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1UZWFyZG93blJlcXVlc3RlZDsKLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gREJHID0gdHJ1ZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5ldHdvcmtTdGF0ZVRyYWNrZXIiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU1RBVEVfQ0hBTkdFRCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU0NBTl9SRVNVTFRTX0FWQUlMQUJMRSA9IDI7CiAgICAgLyoqCi0gICAgICogYXJnMTogMSB0byBzaG93LCAwIHRvIGhpZGUKLSAgICAgKiBhcmcyOiBJRCBvZiB0aGUgbm90aWZpY2F0aW9uCi0gICAgICogb2JqOiBOb3RpZmljYXRpb24gKGlmIHNob3dpbmcpCisgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIEV2ZW50IEludGVyZmFjZSBiYWNrIHRvIENvbm5lY3Rpdml0eVNlcnZpY2UuCisgICAgICoKKyAgICAgKiBUaGUgZXZlbnRzIHRoYXQgYXJlIHRvIGJlIHNlbnQgYmFjayB0byB0aGUgSGFuZGxlciBwYXNzZWQKKyAgICAgKiB0byBzdGFydE1vbml0b3Jpbmcgd2hlbiB0aGUgcGFydGljdWxhciBldmVudCBvY2N1cnMuCisgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX05PVElGSUNBVElPTl9DSEFOR0VEID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9DT05GSUdVUkFUSU9OX0NIQU5HRUQgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1JPQU1JTkdfQ0hBTkdFRCA9IDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTkVUV09SS19TVUJUWVBFX0NIQU5HRUQgPSA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1JFU1RPUkVfREVGQVVMVF9ORVRXT1JLID0gNzsKIAotICAgIHB1YmxpYyBOZXR3b3JrU3RhdGVUcmFja2VyKENvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgIEhhbmRsZXIgdGFyZ2V0LAotICAgICAgICAgICAgaW50IG5ldHdvcmtUeXBlLAotICAgICAgICAgICAgaW50IHN1YlR5cGUsCi0gICAgICAgICAgICBTdHJpbmcgdHlwZU5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgc3VidHlwZU5hbWUpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtVGFyZ2V0ID0gdGFyZ2V0OwotICAgICAgICBtVGVhcmRvd25SZXF1ZXN0ZWQgPSBmYWxzZTsKKyAgICAvKioKKyAgICAgKiBUaGUgbmV0d29yayBzdGF0ZSBoYXMgY2hhbmdlZCBhbmQgdGhlIE5ldHdvcmtJbmZvIG9iamVjdAorICAgICAqIGNvbnRhaW5zIHRoZSBuZXcgc3RhdGUuCisgICAgICoKKyAgICAgKiBtc2cud2hhdCA9IEVWRU5UX1NUQVRFX0NIQU5HRUQKKyAgICAgKiBtc2cub2JqID0gTmV0d29ya0luZm8gb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU1RBVEVfQ0hBTkdFRCA9IDE7CiAKLSAgICAgICAgdGhpcy5tTmV0d29ya0luZm8gPSBuZXcgTmV0d29ya0luZm8obmV0d29ya1R5cGUsIHN1YlR5cGUsIHR5cGVOYW1lLCBzdWJ0eXBlTmFtZSk7Ci0gICAgfQorICAgIC8qKgorICAgICAqIG1zZy53aGF0ID0gRVZFTlRfQ09ORklHVVJBVElPTl9DSEFOR0VECisgICAgICogbXNnLm9iaiA9IE5ldHdvcmtJbmZvIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCA9IDM7CiAKLSAgICBwdWJsaWMgTmV0d29ya0luZm8gZ2V0TmV0d29ya0luZm8oKSB7Ci0gICAgICAgIHJldHVybiBtTmV0d29ya0luZm87Ci0gICAgfQorICAgIC8qKgorICAgICAqIG1zZy53aGF0ID0gRVZFTlRfUkVTVE9SRV9ERUZBVUxUX05FVFdPUksKKyAgICAgKiBtc2cub2JqID0gRmVhdHVyZVVzZXIgb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUkVTVE9SRV9ERUZBVUxUX05FVFdPUksgPSA2OworCisgICAgLyoqCisgICAgICogVVNFRCBieSBDb25uZWN0aXZpdHlTZXJ2aWNlIG9ubHkKKyAgICAgKgorICAgICAqIG1zZy53aGF0ID0gRVZFTlRfQ0xFQVJfTkVUX1RSQU5TSVRJT05fV0FLRUxPQ0sKKyAgICAgKiBtc2cuYXJnMSA9IG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tTZXJpYWxOdW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9DTEVBUl9ORVRfVFJBTlNJVElPTl9XQUtFTE9DSyA9IDc7CisKKyAgICAvKioKKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29udHJvbCBJbnRlcmZhY2UKKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICovCisgICAgLyoqCisgICAgICogQmVnaW4gbW9uaXRvcmluZyBkYXRhIGNvbm5lY3Rpdml0eS4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgdGhlIGZpcnN0IG1ldGhvZCBjYWxsZWQgd2hlbiB0aGlzIGludGVyZmFjZSBpcyB1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgaXMgdGhlIGN1cnJlbnQgQW5kcm9pZCBjb250ZXh0CisgICAgICogQHBhcmFtIHRhcmdldCBpcyB0aGUgSGFuZGVyIHRvIHdoaWNoIHRvIHJldHVybiB0aGUgZXZlbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZyhDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgdGFyZ2V0KTsKKworICAgIC8qKgorICAgICAqIEZldGNoIE5ldHdvcmtJbmZvIGZvciB0aGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbygpOworCisgICAgLyoqCisgICAgICogRmV0Y2ggTGlua1Byb3BlcnRpZXMgZm9yIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0Y3AgYnVmZmVyIHNpemVzCiAgICAgICogZm9yIHRoaXMgbmV0d29yay4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRjcEJ1ZmZlclNpemVzUHJvcE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgSVAgYWRkcmVzc2VzIG9mIHRoZSBETlMgc2VydmVycyBhdmFpbGFibGUgZm9yIHRoZSBtb2JpbGUgZGF0YQotICAgICAqIG5ldHdvcmsgaW50ZXJmYWNlLgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIEROUyBhZGRyZXNzZXMsIHdpdGggbm8gaG9sZXMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE5hbWVTZXJ2ZXJzKCkgewotICAgICAgICByZXR1cm4gZ2V0TmFtZVNlcnZlckxpc3QobURuc1Byb3BOYW1lcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBJUCBhZGRyZXNzZXMgb2YgdGhlIEROUyBzZXJ2ZXJzIGF2YWlsYWJsZSBmb3IgdGhpcwotICAgICAqIG5ldHdvcmsgaW50ZXJmYWNlLgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWVzIHRoZSBuYW1lcyBvZiB0aGUgc3lzdGVtIHByb3BlcnRpZXMgd2hvc2UgdmFsdWVzCi0gICAgICogZ2l2ZSB0aGUgSVAgYWRkcmVzc2VzLiBQcm9wZXJ0aWVzIHdpdGggbm8gdmFsdWVzIGFyZSBza2lwcGVkLgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2Yge0Bjb2RlIFN0cmluZ31zIGNvbnRhaW5pbmcgdGhlIElQIGFkZHJlc3NlcwotICAgICAqIG9mIHRoZSBETlMgc2VydmVycywgaW4gZG90LW5vdGF0aW9uLiBUaGlzIG1heSBoYXZlIGZld2VyCi0gICAgICogbm9uLW51bGwgZW50cmllcyB0aGFuIHRoZSBsaXN0IG9mIG5hbWVzIHBhc3NlZCBpbiwgc2luY2UKLSAgICAgKiBzb21lIG9mIHRoZSBwYXNzZWQtaW4gbmFtZXMgbWF5IGhhdmUgZW1wdHkgdmFsdWVzLgotICAgICAqLwotICAgIHN0YXRpYyBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TmFtZVNlcnZlckxpc3QoU3RyaW5nW10gcHJvcGVydHlOYW1lcykgewotICAgICAgICBTdHJpbmdbXSBkbnNBZGRyZXNzZXMgPSBuZXcgU3RyaW5nW3Byb3BlcnR5TmFtZXMubGVuZ3RoXTsKLSAgICAgICAgaW50IGksIGo7Ci0KLSAgICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcm9wZXJ0eU5hbWVzW2ldKTsKLSAgICAgICAgICAgIC8vIFRoZSBHU00gbGF5ZXIgc29tZXRpbWVzIHNldHMgYSBib2d1cyBETlMgc2VydmVyIGFkZHJlc3Mgb2YKLSAgICAgICAgICAgIC8vIDAuMC4wLjAKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpICYmICFUZXh0VXRpbHMuZXF1YWxzKHZhbHVlLCAiMC4wLjAuMCIpKSB7Ci0gICAgICAgICAgICAgICAgZG5zQWRkcmVzc2VzW2orK10gPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG5zQWRkcmVzc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFByaXZhdGVEbnNSb3V0ZXMoKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImFkZFByaXZhdGVEbnNSb3V0ZXMgZm9yICIgKyB0aGlzICsKLSAgICAgICAgICAgICAgICAgICAgIigiICsgbUludGVyZmFjZU5hbWUgKyAiKSAtIG1Qcml2YXRlRG5zUm91dGVTZXQgPSAiK21Qcml2YXRlRG5zUm91dGVTZXQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSW50ZXJmYWNlTmFtZSAhPSBudWxsICYmICFtUHJpdmF0ZURuc1JvdXRlU2V0KSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBhZGRyU3RyaW5nIDogZ2V0TmFtZVNlcnZlcnMoKSkgewotICAgICAgICAgICAgICAgIGlmIChhZGRyU3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGFkZHJTdHJpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiICBhZGRpbmcgIiArIGFkZHJTdHJpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE5ldHdvcmtVdGlscy5hZGRIb3N0Um91dGUobUludGVyZmFjZU5hbWUsIGluZXRBZGRyZXNzLCBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlRG5zUm91dGVTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICIgRE5TIGFkZHJlc3MgIiArIGFkZHJTdHJpbmcgKyAiIDogRXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByaXZhdGVEbnNSb3V0ZXMoKSB7Ci0gICAgICAgIC8vIFRPRE8gLSB3ZSBzaG91bGQgZG8gdGhpcyBleHBsaWNpdGx5IGJ1dCB0aGUgTmV0VXRpbHMgYXBpIGRvZXNudAotICAgICAgICAvLyBzdXBwb3J0IHRoaXMgeWV0IC0gbXVzdCByZW1vdmUgYWxsLiAgTm8gd29yc2UgdGhhbiBiZWZvcmUKLSAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgbVByaXZhdGVEbnNSb3V0ZVNldCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZVByaXZhdGVEbnNSb3V0ZXMgZm9yICIgKyBtTmV0d29ya0luZm8uZ2V0VHlwZU5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICgiICsgbUludGVyZmFjZU5hbWUgKyAiKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTmV0d29ya1V0aWxzLnJlbW92ZUhvc3RSb3V0ZXMobUludGVyZmFjZU5hbWUpOwotICAgICAgICAgICAgbVByaXZhdGVEbnNSb3V0ZVNldCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRGVmYXVsdFJvdXRlKCkgewotICAgICAgICBpZiAoKG1JbnRlcmZhY2VOYW1lICE9IG51bGwpICYmIChtRGVmYXVsdEdhdGV3YXlBZGRyICE9IDApKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkRGVmYXVsdFJvdXRlIGZvciAiICsgbU5ldHdvcmtJbmZvLmdldFR5cGVOYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAoIiArIG1JbnRlcmZhY2VOYW1lICsgIiksIEdhdGV3YXlBZGRyPSIgKyBtRGVmYXVsdEdhdGV3YXlBZGRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gTmV0d29ya1V0aWxzLmludFRvSW5ldEFkZHJlc3MobURlZmF1bHRHYXRld2F5QWRkcik7Ci0gICAgICAgICAgICBpZiAoaW5ldEFkZHJlc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIiBVbmFibGUgdG8gYWRkIGRlZmF1bHQgcm91dGUuIG1EZWZhdWx0R2F0ZXdheUFkZHIgRXJyb3IiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFOZXR3b3JrVXRpbHMuYWRkRGVmYXVsdFJvdXRlKG1JbnRlcmZhY2VOYW1lLCBpbmV0QWRkcmVzcykgJiYgREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIiAgVW5hYmxlIHRvIGFkZCBkZWZhdWx0IHJvdXRlLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZURlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZW1vdmVEZWZhdWx0Um91dGUgZm9yICIgKyBtTmV0d29ya0luZm8uZ2V0VHlwZU5hbWUoKSArICIgKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZU5hbWUgKyAiKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTmV0d29ya1V0aWxzLnJlbW92ZURlZmF1bHRSb3V0ZShtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgbmV0d29yayBzcGVjaWZpYyBUQ1AgYnVmZmVyIHNpemVzIGZyb20gU3lzdGVtUHJvcGVydGllcwotICAgICAqIG5ldC50Y3AuYnVmZmVyc2l6ZS5bZGVmYXVsdHx3aWZpfHVtdHN8ZWRnZXxncHJzXSBhbmQgc2V0IHRoZW0gZm9yIHN5c3RlbQotICAgICAqIHdpZGUgdXNlCi0gICAgICovCi0gICBwdWJsaWMgdm9pZCB1cGRhdGVOZXR3b3JrU2V0dGluZ3MoKSB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSBnZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBidWZmZXJTaXplcyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KGtleSk7Ci0KLSAgICAgICAgaWYgKGJ1ZmZlclNpemVzLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywga2V5ICsgIiBub3QgZm91bmQgaW4gc3lzdGVtIHByb3BlcnRpZXMuIFVzaW5nIGRlZmF1bHRzIik7Ci0KLSAgICAgICAgICAgIC8vIFNldHRpbmcgdG8gZGVmYXVsdCB2YWx1ZXMgc28gd2Ugd29uJ3QgYmUgc3R1Y2sgdG8gcHJldmlvdXMgdmFsdWVzCi0gICAgICAgICAgICBrZXkgPSAibmV0LnRjcC5idWZmZXJzaXplLmRlZmF1bHQiOwotICAgICAgICAgICAgYnVmZmVyU2l6ZXMgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IHZhbHVlcyBpbiBrZXJuZWwKLSAgICAgICAgaWYgKGJ1ZmZlclNpemVzLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICJTZXR0aW5nIFRDUCB2YWx1ZXM6IFsiICsgYnVmZmVyU2l6ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gd2hpY2ggY29tZXMgZnJvbSBbIiArIGtleSArICJdIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRCdWZmZXJTaXplKGJ1ZmZlclNpemVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbGVhc2UgdGhlIHdha2Vsb2NrLCBpZiBhbnksIHRoYXQgbWF5IGJlIGhlbGQgd2hpbGUgaGFuZGxpbmcgYQotICAgICAqIGRpc2Nvbm5lY3Qgb3BlcmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VXYWtlTG9jaygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgVENQIGJ1ZmZlciBzaXplcyB0byAvc3lzL2tlcm5lbC9pcHY0L3RjcF9bci93XW1lbV9bbWluL2RlZi9tYXhdCi0gICAgICogd2hpY2ggbWFwcyB0byAvcHJvYy9zeXMvbmV0L2lwdjQvdGNwX3JtZW0gYW5kIHRjcHdtZW0KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVmZmVyU2l6ZXMgaW4gdGhlIGZvcm1hdCBvZiAicmVhZE1pbiwgcmVhZEluaXRpYWwsIHJlYWRNYXgsCi0gICAgICogICAgICAgIHdyaXRlTWluLCB3cml0ZUluaXRpYWwsIHdyaXRlTWF4IgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRCdWZmZXJTaXplKFN0cmluZyBidWZmZXJTaXplcykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gYnVmZmVyU2l6ZXMuc3BsaXQoIiwiKTsKLQotICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT0gNikgewotICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gIi9zeXMva2VybmVsL2lwdjQvdGNwXyI7Ci0gICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX21pbiIsIHZhbHVlc1swXSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX2RlZiIsIHZhbHVlc1sxXSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX21heCIsIHZhbHVlc1syXSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX21pbiIsIHZhbHVlc1szXSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX2RlZiIsIHZhbHVlc1s0XSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX21heCIsIHZhbHVlc1s1XSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgYnVmZmVyc2l6ZSBzdHJpbmc6ICIgKyBidWZmZXJTaXplcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbid0IHNldCB0Y3AgYnVmZmVyIHNpemVzOiIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBzdHJpbmcgdG8gZmlsZS4gQmFzaWNhbGx5IHNhbWUgYXMgImVjaG8gLW4gJHN0cmluZyA+ICRmaWxlbmFtZSIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmlsZW5hbWUKLSAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdHJpbmdUb0ZpbGUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlV3JpdGVyIG91dCA9IG5ldyBGaWxlV3JpdGVyKGZpbGVuYW1lKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG91dC53cml0ZShzdHJpbmcpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWNvcmQgdGhlIGRldGFpbGVkIHN0YXRlIG9mIGEgbmV0d29yaywgYW5kIGlmIGl0IGlzIGEKLSAgICAgKiBjaGFuZ2UgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUsIHNlbmQgYSBub3RpZmljYXRpb24gdG8KLSAgICAgKiBhbnkgbGlzdGVuZXJzLgotICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IEB7Y29kZSBEZXRhaWxlZFN0YXRlfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERldGFpbGVkU3RhdGUoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSkgewotICAgICAgICBzZXREZXRhaWxlZFN0YXRlKHN0YXRlLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWNvcmQgdGhlIGRldGFpbGVkIHN0YXRlIG9mIGEgbmV0d29yaywgYW5kIGlmIGl0IGlzIGEKLSAgICAgKiBjaGFuZ2UgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUsIHNlbmQgYSBub3RpZmljYXRpb24gdG8KLSAgICAgKiBhbnkgbGlzdGVuZXJzLgotICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IEB7Y29kZSBEZXRhaWxlZFN0YXRlfQotICAgICAqIEBwYXJhbSByZWFzb24gYSB7QGNvZGUgU3RyaW5nfSBpbmRpY2F0aW5nIGEgcmVhc29uIGZvciB0aGUgc3RhdGUgY2hhbmdlLAotICAgICAqIGlmIG9uZSB3YXMgc3VwcGxpZWQuIE1heSBiZSB7QGNvZGUgbnVsbH0uCi0gICAgICogQHBhcmFtIGV4dHJhSW5mbyBvcHRpb25hbCB7QGNvZGUgU3RyaW5nfSBwcm92aWRpbmcgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXRlIGNoYW5nZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERldGFpbGVkU3RhdGUoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGV4dHJhSW5mbykgewotICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJzZXREZXRhaWxlZCBzdGF0ZSwgb2xkID0iK21OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkrIiBhbmQgbmV3IHN0YXRlPSIrc3RhdGUpOwotICAgICAgICBpZiAoc3RhdGUgIT0gbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSkgewotICAgICAgICAgICAgYm9vbGVhbiB3YXNDb25uZWN0aW5nID0gKG1OZXR3b3JrSW5mby5nZXRTdGF0ZSgpID09IE5ldHdvcmtJbmZvLlN0YXRlLkNPTk5FQ1RJTkcpOwotICAgICAgICAgICAgU3RyaW5nIGxhc3RSZWFzb24gPSBtTmV0d29ya0luZm8uZ2V0UmVhc29uKCk7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogSWYgYSByZWFzb24gd2FzIHN1cHBsaWVkIHdoZW4gdGhlIENPTk5FQ1RJTkcgc3RhdGUgd2FzIGVudGVyZWQsIGFuZCBubwotICAgICAgICAgICAgICogcmVhc29uIHdhcyBzdXBwbGllZCBmb3IgZW50ZXJpbmcgdGhlIENPTk5FQ1RFRCBzdGF0ZSwgdGhlbiByZXRhaW4gdGhlCi0gICAgICAgICAgICAgKiByZWFzb24gdGhhdCB3YXMgc3VwcGxpZWQgd2hlbiBnb2luZyB0byBDT05ORUNUSU5HLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAod2FzQ29ubmVjdGluZyAmJiBzdGF0ZSA9PSBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCAmJiByZWFzb24gPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBsYXN0UmVhc29uICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmVhc29uID0gbGFzdFJlYXNvbjsKLSAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXREZXRhaWxlZFN0YXRlKHN0YXRlLCByZWFzb24sIGV4dHJhSW5mbyk7Ci0gICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9TVEFURV9DSEFOR0VELCBtTmV0d29ya0luZm8pOwotICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZUludGVybmFsKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUpIHsKLSAgICAgICAgbU5ldHdvcmtJbmZvLnNldERldGFpbGVkU3RhdGUoc3RhdGUsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRlYXJkb3duUmVxdWVzdGVkKGJvb2xlYW4gaXNSZXF1ZXN0ZWQpIHsKLSAgICAgICAgbVRlYXJkb3duUmVxdWVzdGVkID0gaXNSZXF1ZXN0ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNUZWFyZG93blJlcXVlc3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1UZWFyZG93blJlcXVlc3RlZDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2VuZCBhICBub3RpZmljYXRpb24gdGhhdCB0aGUgcmVzdWx0cyBvZiBhIHNjYW4gZm9yIG5ldHdvcmsgYWNjZXNzCi0gICAgICogcG9pbnRzIGhhcyBjb21wbGV0ZWQsIGFuZCByZXN1bHRzIGFyZSBhdmFpbGFibGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2VuZFNjYW5SZXN1bHRzQXZhaWxhYmxlKCkgewotICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFLCBtTmV0d29ya0luZm8pOwotICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjb3JkIHRoZSByb2FtaW5nIHN0YXR1cyBvZiB0aGUgZGV2aWNlLCBhbmQgaWYgaXQgaXMgYSBjaGFuZ2UgZnJvbSB0aGUgcHJldmlvdXMKLSAgICAgKiBzdGF0dXMsIHNlbmQgYSBub3RpZmljYXRpb24gdG8gYW55IGxpc3RlbmVycy4KLSAgICAgKiBAcGFyYW0gaXNSb2FtaW5nIHtAY29kZSB0cnVlfSBpZiB0aGUgZGV2aWNlIGlzIG5vdyByb2FtaW5nLCB7QGNvZGUgZmFsc2V9Ci0gICAgICogaWYgaXQgaXMgbm8gbG9uZ2VyIHJvYW1pbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0Um9hbWluZ1N0YXR1cyhib29sZWFuIGlzUm9hbWluZykgewotICAgICAgICBpZiAoaXNSb2FtaW5nICE9IG1OZXR3b3JrSW5mby5pc1JvYW1pbmcoKSkgewotICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldFJvYW1pbmcoaXNSb2FtaW5nKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX1JPQU1JTkdfQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKLSAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFN1YnR5cGUoaW50IHN1YnR5cGUsIFN0cmluZyBzdWJ0eXBlTmFtZSkgewotICAgICAgICBpZiAobU5ldHdvcmtJbmZvLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgIGludCBvbGRTdWJ0eXBlID0gbU5ldHdvcmtJbmZvLmdldFN1YnR5cGUoKTsKLSAgICAgICAgICAgIGlmIChzdWJ0eXBlICE9IG9sZFN1YnR5cGUpIHsKLSAgICAgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0U3VidHlwZShzdWJ0eXBlLCBzdWJ0eXBlTmFtZSk7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBFVkVOVF9ORVRXT1JLX1NVQlRZUEVfQ0hBTkdFRCwgb2xkU3VidHlwZSwgMCwgbU5ldHdvcmtJbmZvKTsKLSAgICAgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydE1vbml0b3JpbmcoKTsKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRjcEJ1ZmZlclNpemVzUHJvcE5hbWUoKTsKIAogICAgIC8qKgogICAgICAqIERpc2FibGUgY29ubmVjdGl2aXR5IHRvIGEgbmV0d29yawogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGEgdGVhcmRvd24gb2NjdXJyZWQsIHtAY29kZSBmYWxzZX0gaWYgdGhlCiAgICAgICogdGVhcmRvd24gZGlkIG5vdCBvY2N1ci4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiB0ZWFyZG93bigpOworICAgIHB1YmxpYyBib29sZWFuIHRlYXJkb3duKCk7CiAKICAgICAvKioKICAgICAgKiBSZWVuYWJsZSBjb25uZWN0aXZpdHkgdG8gYSBuZXR3b3JrIGFmdGVyIGEge0BsaW5rICN0ZWFyZG93bigpfS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB3ZSdyZSBjb25uZWN0ZWQgb3IgZXhwZWN0IHRvIGJlIGNvbm5lY3RlZAogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlY29ubmVjdCgpOworICAgIHB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpOwogCiAgICAgLyoqCiAgICAgICogVHVybiB0aGUgd2lyZWxlc3MgcmFkaW8gb2ZmIGZvciBhIG5ldHdvcmsuCiAgICAgICogQHBhcmFtIHR1cm5PbiB7QGNvZGUgdHJ1ZX0gdG8gdHVybiB0aGUgcmFkaW8gb24sIHtAY29kZSBmYWxzZX0KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzZXRSYWRpbyhib29sZWFuIHR1cm5Pbik7CisgICAgcHVibGljIGJvb2xlYW4gc2V0UmFkaW8oYm9vbGVhbiB0dXJuT24pOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhbiBpbmRpY2F0aW9uIG9mIHdoZXRoZXIgdGhpcyBuZXR3b3JrIGlzIGF2YWlsYWJsZSBmb3IKICAgICAgKiBjb25uZWN0aW9ucy4gQSB2YWx1ZSBvZiB7QGNvZGUgZmFsc2V9IG1lYW5zIHRoYXQgc29tZSBxdWFzaS1wZXJtYW5lbnQKICAgICAgKiBjb25kaXRpb24gcHJldmVudHMgY29ubmVjdGl2aXR5IHRvIHRoaXMgbmV0d29yay4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0F2YWlsYWJsZSgpOworICAgIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBGZXRjaCBkZWZhdWx0IGdhdGV3YXkgYWRkcmVzcyBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldERlZmF1bHRHYXRld2F5QWRkcigpOwogCiAgICAgLyoqCiAgICAgICogVGVsbHMgdGhlIHVuZGVybHlpbmcgbmV0d29ya2luZyBzeXN0ZW0gdGhhdCB0aGUgY2FsbGVyIHdhbnRzIHRvCkBAIC0zODUsNyArMTQ0LDcgQEAKICAgICAgKiBpbXBsZW1lbnRhdGlvbitmZWF0dXJlIGNvbWJpbmF0aW9uLCBleGNlcHQgdGhhdCB0aGUgdmFsdWUge0Bjb2RlIC0xfQogICAgICAqIGFsd2F5cyBpbmRpY2F0ZXMgZmFpbHVyZS4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IHN0YXJ0VXNpbmdOZXR3b3JrRmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkKTsKKyAgICBwdWJsaWMgaW50IHN0YXJ0VXNpbmdOZXR3b3JrRmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkKTsKIAogICAgIC8qKgogICAgICAqIFRlbGxzIHRoZSB1bmRlcmx5aW5nIG5ldHdvcmtpbmcgc3lzdGVtIHRoYXQgdGhlIGNhbGxlciBpcyBmaW5pc2hlZApAQCAtMzk5LDIzICsxNTgsNDMgQEAKICAgICAgKiBpbXBsZW1lbnRhdGlvbitmZWF0dXJlIGNvbWJpbmF0aW9uLCBleGNlcHQgdGhhdCB0aGUgdmFsdWUge0Bjb2RlIC0xfQogICAgICAqIGFsd2F5cyBpbmRpY2F0ZXMgZmFpbHVyZS4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IHN0b3BVc2luZ05ldHdvcmtGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBpbnQgY2FsbGluZ1BpZCwgaW50IGNhbGxpbmdVaWQpOworICAgIHB1YmxpYyBpbnQgc3RvcFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCk7CiAKICAgICAvKioKLSAgICAgKiBFbnN1cmUgdGhhdCBhIG5ldHdvcmsgcm91dGUgZXhpc3RzIHRvIGRlbGl2ZXIgdHJhZmZpYyB0byB0aGUgc3BlY2lmaWVkCi0gICAgICogaG9zdCB2aWEgdGhpcyBuZXR3b3JrIGludGVyZmFjZS4KLSAgICAgKiBAcGFyYW0gaG9zdEFkZHJlc3MgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHJvdXRlIGlzIGRlc2lyZWQKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBvbiBzdWNjZXNzLCB7QGNvZGUgZmFsc2V9IG9uIGZhaWx1cmUKKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogU3RvcmFnZSBBUEkgdXNlZCBieSBDb25uZWN0aXZpdHlTZXJ2aWNlIGZvciBzYXZpbmcKKyAgICAgKiBOZXR3b3JrIHNwZWNpZmljIGluZm9ybWF0aW9uLgorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0Um91dGVUb0hvc3QoSW5ldEFkZHJlc3MgaG9zdEFkZHJlc3MpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KIAogICAgIC8qKgotICAgICAqIEludGVycHJldHMgc2NhbiByZXN1bHRzLiBUaGlzIHdpbGwgYmUgY2FsbGVkIGF0IGEgc2FmZSB0aW1lIGZvcgotICAgICAqIHByb2Nlc3NpbmcsIGFuZCBmcm9tIGEgc2FmZSB0aHJlYWQuCisgICAgICogQ2hlY2sgaWYgcHJpdmF0ZSBETlMgcm91dGUgaXMgc2V0IGZvciB0aGUgbmV0d29yawogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGludGVycHJldFNjYW5SZXN1bHRzQXZhaWxhYmxlKCkgewotICAgIH0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVEbnNSb3V0ZVNldCgpOworCisgICAgLyoqCisgICAgICogU2V0IGEgZmxhZyBpbmRpY2F0aW5nIHByaXZhdGUgRE5TIHJvdXRlIGlzIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaXZhdGVEbnNSb3V0ZVNldChib29sZWFuIGVuYWJsZWQpOworCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgZGVmYXVsdCByb3V0ZSBpcyBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRSb3V0ZVNldCgpOworCisgICAgLyoqCisgICAgICogU2V0IGEgZmxhZyBpbmRpY2F0aW5nIGRlZmF1bHQgcm91dGUgaXMgc2V0IGZvciB0aGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlZmF1bHRSb3V0ZVNldChib29sZWFuIGVuYWJsZWQpOworCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGVhciBkb3duIHdhcyByZXF1ZXN0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RlYXJkb3duUmVxdWVzdGVkKCk7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSB0ZWFyIGRvd24gcmVxdWVzdGVkIGZyb20gY29ubmVjdGl2aXR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoYm9vbGVhbiBpc1JlcXVlc3RlZCk7CiAKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrVXRpbHMuamF2YQppbmRleCA1ZDRiMDk5Li4wMTAwNGMyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1V0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtVdGlscy5qYXZhCkBAIC01Miw3ICs1MiwxMSBAQAogICAgICAgICAgIGludCBwcmVmaXhMZW5ndGgsIFN0cmluZyBndyk7CiAKICAgICAvKiogUmV0dXJuIHRoZSBnYXRld2F5IGFkZHJlc3MgZm9yIHRoZSBkZWZhdWx0IHJvdXRlIGZvciB0aGUgbmFtZWQgaW50ZXJmYWNlLiAqLwotICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGludCBnZXREZWZhdWx0Um91dGUoU3RyaW5nIGludGVyZmFjZU5hbWUpOworICAgIHB1YmxpYyBzdGF0aWMgSW5ldEFkZHJlc3MgZ2V0RGVmYXVsdFJvdXRlKFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7CisgICAgICAgIGludCBhZGRyID0gZ2V0RGVmYXVsdFJvdXRlTmF0aXZlKGludGVyZmFjZU5hbWUpOworICAgICAgICByZXR1cm4gaW50VG9JbmV0QWRkcmVzcyhhZGRyKTsKKyAgICB9CisgICAgcHJpdmF0ZSBuYXRpdmUgc3RhdGljIGludCBnZXREZWZhdWx0Um91dGVOYXRpdmUoU3RyaW5nIGludGVyZmFjZU5hbWUpOwogCiAgICAgLyoqIFJlbW92ZSBob3N0IHJvdXRlcyB0aGF0IHVzZXMgdGhlIG5hbWVkIGludGVyZmFjZS4gKi8KICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBpbnQgcmVtb3ZlSG9zdFJvdXRlcyhTdHJpbmcgaW50ZXJmYWNlTmFtZSk7CkBAIC0xOTQsMTkgKzE5OCw0IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGFkZFJvdXRlKGludGVyZmFjZU5hbWUsIGRzdFN0ciwgcHJlZml4TGVuZ3RoLCBnd1N0cikgPT0gMDsKICAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCB2NFN0cmluZ1RvSW50KFN0cmluZyBzdHIpIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgICAgIFN0cmluZ1tdIGFycmF5ID0gc3RyLnNwbGl0KCJcXC4iKTsKLSAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCAhPSA0KSByZXR1cm4gMDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEludGVnZXIucGFyc2VJbnQoYXJyYXlbM10pOwotICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSArIEludGVnZXIucGFyc2VJbnQoYXJyYXlbMl0pOwotICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSArIEludGVnZXIucGFyc2VJbnQoYXJyYXlbMV0pOwotICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSArIEludGVnZXIucGFyc2VJbnQoYXJyYXlbMF0pOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvUHJveHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Qcm94eS5qYXZhCmluZGV4IDIyYzMwYTUuLmUyZTRkMmMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Qcm94eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Qcm94eS5qYXZhCkBAIC0xNiwzMiArMTYsMTYyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5uZXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3Q7Ci0KIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5VUkk7CiBpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVhZFdyaXRlTG9jazsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdDsKKwogLyoqCiAgKiBBIGNvbnZlbmllbmNlIGNsYXNzIGZvciBhY2Nlc3NpbmcgdGhlIHVzZXIgYW5kIGRlZmF1bHQgcHJveHkKICAqIHNldHRpbmdzLgogICovCi1maW5hbCBwdWJsaWMgY2xhc3MgUHJveHkgeworcHVibGljIGZpbmFsIGNsYXNzIFByb3h5IHsKIAogICAgIC8vIFNldCB0byB0cnVlIHRvIGVuYWJsZSBleHRyYSBkZWJ1Z2dpbmcuCi0gICAgc3RhdGljIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKIAotICAgIHN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIFBST1hZX0NIQU5HRV9BQ1RJT04gPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0NIQU5HRV9BQ1RJT04gPQogICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlBST1hZX0NIQU5HRSI7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBSZWFkV3JpdGVMb2NrIHNQcm94eUluZm9Mb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKworICAgIHByaXZhdGUgc3RhdGljIFNldHRpbmdzT2JzZXJ2ZXIgc0dsb2JhbFByb3h5Q2hhbmdlZE9ic2VydmVyID0gbnVsbDsKKworICAgIHByaXZhdGUgc3RhdGljIFByb3h5U3BlYyBzR2xvYmFsUHJveHlTcGVjID0gbnVsbDsKKworICAgIC8vIEhvc3RuYW1lIC8gSVAgUkVHRVggdmFsaWRhdGlvbgorICAgIC8vIE1hdGNoZXMgYmxhbmsgaW5wdXQsIGlwcywgYW5kIGRvbWFpbiBuYW1lcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0lQX1JFR0VYID0KKyAgICAgICAgIlthLXpBLVowLTldKyhcXC1bYS16QS1aMC05XSspKihcXC5bYS16QS1aMC05XSsoXFwtW2EtekEtWjAtOV0rKSopKiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVE5BTUVfUkVHRVhQID0gIl4kfF4iICsgTkFNRV9JUF9SRUdFWCArICIkIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gSE9TVE5BTUVfUEFUVEVSTjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMTElTVF9SRUdFWFAgPSAiJHxeKC4/IiArIE5BTUVfSVBfUkVHRVgKKyAgICAgICAgKyAiKSsoLCguPyIgKyBOQU1FX0lQX1JFR0VYICsgIikpKiQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBFWENMTElTVF9QQVRURVJOOworCisgICAgc3RhdGljIHsKKyAgICAgICAgSE9TVE5BTUVfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZShIT1NUTkFNRV9SRUdFWFApOworICAgICAgICBFWENMTElTVF9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKEVYQ0xMSVNUX1JFR0VYUCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJveHlTcGVjIHsKKyAgICAgICAgU3RyaW5nW10gZXhjbHVzaW9uTGlzdCA9IG51bGw7CisgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHByb3h5QWRkcmVzcyA9IG51bGw7CisgICAgICAgIHB1YmxpYyBQcm94eVNwZWMoKSB7IH07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VSTEluRXhjbHVzaW9uTGlzdFJlYWRMb2NrZWQoU3RyaW5nIHVybCwgU3RyaW5nW10gZXhjbHVzaW9uTGlzdCkgeworICAgICAgICBpZiAoZXhjbHVzaW9uTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgVXJpIHUgPSBVcmkucGFyc2UodXJsKTsKKyAgICAgICAgU3RyaW5nIHVybERvbWFpbiA9IHUuZ2V0SG9zdCgpOworICAgICAgICAvLyBJZiB0aGUgZG9tYWluIGlzIGRlZmluZWQgYXMgIi5hbmRyb2lkLmNvbSIgb3IgImFuZHJvaWQuY29tIiwgd2Ugd2lzaCB0byBtYXRjaAorICAgICAgICAvLyBodHRwOi8vYW5kcm9pZC5jb20gYXMgd2VsbCBhcyBodHRwOi8veHh4LmFuZHJvaWQuY29tICwgYnV0IG5vdAorICAgICAgICAvLyBodHRwOi8vbXlhbmRyb2lkLmNvbSAuIFRoaXMgY29kZSB3b3JrcyBvdXQgdGhlIGxvZ2ljLgorICAgICAgICBmb3IgKFN0cmluZyBleGNsdWRlZERvbWFpbiA6IGV4Y2x1c2lvbkxpc3QpIHsKKyAgICAgICAgICAgIFN0cmluZyBkb3REb21haW4gPSAiLiIgKyBleGNsdWRlZERvbWFpbjsKKyAgICAgICAgICAgIGlmICh1cmxEb21haW4uZXF1YWxzKGV4Y2x1ZGVkRG9tYWluKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHVybERvbWFpbi5lbmRzV2l0aChkb3REb21haW4pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gTm8gbWF0Y2gKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwYXJzZUhvc3QoU3RyaW5nIHByb3h5U3BlYykgeworICAgICAgICBpbnQgaSA9IHByb3h5U3BlYy5pbmRleE9mKCc6Jyk7CisgICAgICAgIGlmIChpID09IC0xKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShwcm94eVNwZWMubGVuZ3RoKCkgPT0gMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJveHlTcGVjLnN1YnN0cmluZygwLCBpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgcGFyc2VQb3J0KFN0cmluZyBwcm94eVNwZWMpIHsKKyAgICAgICAgaW50IGkgPSBwcm94eVNwZWMuaW5kZXhPZignOicpOworICAgICAgICBpZiAoaSA9PSAtMSkgeworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocHJveHlTcGVjLmxlbmd0aCgpID09IDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaSA8IHByb3h5U3BlYy5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQocHJveHlTcGVjLnN1YnN0cmluZyhpKzEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3h5IG9iamVjdCB0byBiZSB1c2VkIGZvciB0aGUgVVJMIGdpdmVuIGFzIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gY3R4IEEgQ29udGV4dCB1c2VkIHRvIGdldCB0aGUgc2V0dGluZ3MgZm9yIHRoZSBwcm94eSBob3N0LgorICAgICAqIEBwYXJhbSB1cmwgQSBVUkwgdG8gYmUgYWNjZXNzZWQuIFVzZWQgdG8gZXZhbHVhdGUgZXhjbHVzaW9uIGxpc3QuCisgICAgICogQHJldHVybiBQcm94eSAoamF2YS5uZXQpIG9iamVjdCBjb250YWluaW5nIHRoZSBob3N0IG5hbWUuIElmIHRoZQorICAgICAqICAgICAgICAgdXNlciBkaWQgbm90IHNldCBhIGhvc3RuYW1lIGl0IHJldHVybnMgdGhlIGRlZmF1bHQgaG9zdC4KKyAgICAgKiAgICAgICAgIEEgbnVsbCB2YWx1ZSBtZWFucyB0aGF0IG5vIGhvc3QgaXMgdG8gYmUgdXNlZC4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5Qcm94eSBnZXRQcm94eShDb250ZXh0IGN0eCwgU3RyaW5nIHVybCkgeworICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgamF2YS5uZXQuUHJveHkgcmV0dmFsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNHbG9iYWxQcm94eUNoYW5nZWRPYnNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXJzUmVhZExvY2tlZChjdHgpOworICAgICAgICAgICAgICAgIHBhcnNlR2xvYmFsUHJveHlJbmZvUmVhZExvY2tlZChjdHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNHbG9iYWxQcm94eVNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFByb3h5IGRlZmluZWQgLSBBcHBseSBleGNsdXNpb24gcnVsZXMKKyAgICAgICAgICAgICAgICBpZiAoaXNVUkxJbkV4Y2x1c2lvbkxpc3RSZWFkTG9ja2VkKHVybCwgc0dsb2JhbFByb3h5U3BlYy5leGNsdXNpb25MaXN0KSkgeworICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gbm8gcHJveHkKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gamF2YS5uZXQuUHJveHkuTk9fUFJPWFk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBqYXZhLm5ldC5Qcm94eShqYXZhLm5ldC5Qcm94eS5UeXBlLkhUVFAsIHNHbG9iYWxQcm94eVNwZWMucHJveHlBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIElmIG5ldHdvcmsgaXMgV2lGaSwgcmV0dXJuIG5vIHByb3h5LgorICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgcmV0dXJuIHRoZSBNb2JpbGUgT3BlcmF0b3IgcHJveHkuCisgICAgICAgICAgICAgICAgaWYgKCFpc05ldHdvcmtXaWZpKGN0eCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gZ2V0RGVmYXVsdFByb3h5KHVybCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gamF2YS5uZXQuUHJveHkuTk9fUFJPWFk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHJldHZhbCAhPSBqYXZhLm5ldC5Qcm94eS5OT19QUk9YWSkgJiYgKGlzTG9jYWxIb3N0KHVybCkpKSB7CisgICAgICAgICAgICByZXR2YWwgPSBqYXZhLm5ldC5Qcm94eS5OT19QUk9YWTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIC8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIGZ1bmN0aW9uCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBwcm94eSBob3N0IHNldCBieSB0aGUgdXNlci4KICAgICAgKiBAcGFyYW0gY3R4IEEgQ29udGV4dCB1c2VkIHRvIGdldCB0aGUgc2V0dGluZ3MgZm9yIHRoZSBwcm94eSBob3N0LgpAQCAtNDksNjAgKzE3OSw1NSBAQAogICAgICAqICAgICAgICAgbmFtZSBpdCByZXR1cm5zIHRoZSBkZWZhdWx0IGhvc3QuIEEgbnVsbCB2YWx1ZSBtZWFucyB0aGF0IG5vCiAgICAgICogICAgICAgICBob3N0IGlzIHRvIGJlIHVzZWQuCiAgICAgICovCi0gICAgc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdChDb250ZXh0IGN0eCkgewotICAgICAgICBDb250ZW50UmVzb2x2ZXIgY29udGVudFJlc29sdmVyID0gY3R4LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChjb250ZW50UmVzb2x2ZXIpOwotICAgICAgICBTdHJpbmcgaG9zdCA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgY29udGVudFJlc29sdmVyLAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5IVFRQX1BST1hZKTsKLSAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGkgPSBob3N0LmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIGlmIChpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGhvc3QubGVuZ3RoKCkgPT0gMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEhvc3QoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc0dsb2JhbFByb3h5Q2hhbmdlZE9ic2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckNvbnRlbnRPYnNlcnZlcnNSZWFkTG9ja2VkKGN0eCk7CisgICAgICAgICAgICAgICAgcGFyc2VHbG9iYWxQcm94eUluZm9SZWFkTG9ja2VkKGN0eCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaG9zdC5zdWJzdHJpbmcoMCwgaSk7CisgICAgICAgICAgICBpZiAoc0dsb2JhbFByb3h5U3BlYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3Mgc2EgPSBzR2xvYmFsUHJveHlTcGVjLnByb3h5QWRkcmVzczsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2EuZ2V0SG9zdE5hbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SG9zdCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEhvc3QoKTsKICAgICB9CiAKKyAgICAvLyBUT0RPOiBkZXByZWNhdGUgdGhpcyBmdW5jdGlvbgogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgcHJveHkgcG9ydCBzZXQgYnkgdGhlIHVzZXIuCiAgICAgICogQHBhcmFtIGN0eCBBIENvbnRleHQgdXNlZCB0byBnZXQgdGhlIHNldHRpbmdzIGZvciB0aGUgcHJveHkgcG9ydC4KICAgICAgKiBAcmV0dXJuIFRoZSBwb3J0IG51bWJlciB0byB1c2Ugb3IgLTEgaWYgbm8gcHJveHkgaXMgdG8gYmUgdXNlZC4KICAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgcHVibGljIGludCBnZXRQb3J0KENvbnRleHQgY3R4KSB7Ci0gICAgICAgIENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIgPSBjdHguZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGNvbnRlbnRSZXNvbHZlcik7Ci0gICAgICAgIFN0cmluZyBob3N0ID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICBjb250ZW50UmVzb2x2ZXIsCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkhUVFBfUFJPWFkpOwotICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgaSA9IGhvc3QuaW5kZXhPZignOicpOwotICAgICAgICAgICAgaWYgKGkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaG9zdC5sZW5ndGgoKSA9PSAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGdldFBvcnQoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc0dsb2JhbFByb3h5Q2hhbmdlZE9ic2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckNvbnRlbnRPYnNlcnZlcnNSZWFkTG9ja2VkKGN0eCk7CisgICAgICAgICAgICAgICAgcGFyc2VHbG9iYWxQcm94eUluZm9SZWFkTG9ja2VkKGN0eCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShpIDwgaG9zdC5sZW5ndGgoKSk7CisgICAgICAgICAgICBpZiAoc0dsb2JhbFByb3h5U3BlYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3Mgc2EgPSBzR2xvYmFsUHJveHlTcGVjLnByb3h5QWRkcmVzczsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2EuZ2V0UG9ydCgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoaG9zdC5zdWJzdHJpbmcoaSsxKSk7CisgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdFBvcnQoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldERlZmF1bHRQb3J0KCk7CiAgICAgfQogCisgICAgLy8gVE9ETzogZGVwcmVjYXRlIHRoaXMgZnVuY3Rpb24KICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGRlZmF1bHQgcHJveHkgaG9zdCBzcGVjaWZpZWQgYnkgdGhlIGNhcnJpZXIuCiAgICAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyB0aGUgaG9zdCBuYW1lIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gcHJveHkgZm9yCiAgICAgICogdGhpcyBjYXJyaWVyLgogICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRIb3N0KCkgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldERlZmF1bHRIb3N0KCkgewogICAgICAgICBTdHJpbmcgaG9zdCA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJuZXQuZ3Bycy5odHRwLXByb3h5Iik7Ci0gICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKKyAgICAgICAgaWYgKChob3N0ICE9IG51bGwpICYmIChob3N0Lmxlbmd0aCgpICE9IDApKSB7CiAgICAgICAgICAgICBVcmkgdSA9IFVyaS5wYXJzZShob3N0KTsKICAgICAgICAgICAgIGhvc3QgPSB1LmdldEhvc3QoKTsKICAgICAgICAgICAgIHJldHVybiBob3N0OwpAQCAtMTExLDE0ICsyMzYsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIGZ1bmN0aW9uCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBkZWZhdWx0IHByb3h5IHBvcnQgc3BlY2lmaWVkIGJ5IHRoZSBjYXJyaWVyLgogICAgICAqIEByZXR1cm4gVGhlIHBvcnQgbnVtYmVyIHRvIGJlIHVzZWQgd2l0aCB0aGUgcHJveHkgaG9zdCBvciAtMSBpZiB0aGVyZSBpcwogICAgICAqIG5vIHByb3h5IGZvciB0aGlzIGNhcnJpZXIuCiAgICAgICovCi0gICAgc3RhdGljIGZpbmFsIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdFBvcnQoKSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ2V0RGVmYXVsdFBvcnQoKSB7CiAgICAgICAgIFN0cmluZyBob3N0ID0gU3lzdGVtUHJvcGVydGllcy5nZXQoIm5ldC5ncHJzLmh0dHAtcHJveHkiKTsKLSAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgeworICAgICAgICBpZiAoKGhvc3QgIT0gbnVsbCkgJiYgKGhvc3QubGVuZ3RoKCkgIT0gMCkpIHsKICAgICAgICAgICAgIFVyaSB1ID0gVXJpLnBhcnNlKGhvc3QpOwogICAgICAgICAgICAgcmV0dXJuIHUuZ2V0UG9ydCgpOwogICAgICAgICB9IGVsc2UgewpAQCAtMTI2LDYgKzI1MiwyMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5uZXQuUHJveHkgZ2V0RGVmYXVsdFByb3h5KFN0cmluZyB1cmwpIHsKKyAgICAgICAgLy8gVE9ETzogVGhpcyB3aWxsIGdvIGF3YXkgd2hlbiBpbmZvcm1hdGlvbiBpcyBjb2xsZWN0ZWQgZnJvbSBDb25uZWN0aXZpdHlNYW5hZ2VyLi4uCisgICAgICAgIC8vIFRoZXJlIGFyZSBicm9hZGNhc3Qgb2YgbmV0d29yayBwcm94aWVzLCBzbyB0aGV5IGFyZSBwYXJzZSBtYW51YWxseS4KKyAgICAgICAgU3RyaW5nIGhvc3QgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgibmV0LmdwcnMuaHR0cC1wcm94eSIpOworICAgICAgICBpZiAoKGhvc3QgIT0gbnVsbCkgJiYgKGhvc3QubGVuZ3RoKCkgIT0gMCkpIHsKKyAgICAgICAgICAgIFVyaSB1ID0gVXJpLnBhcnNlKGhvc3QpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBqYXZhLm5ldC5Qcm94eShqYXZhLm5ldC5Qcm94eS5UeXBlLkhUVFAsCisgICAgICAgICAgICAgICAgICAgIG5ldyBJbmV0U29ja2V0QWRkcmVzcyh1LmdldEhvc3QoKSwgdS5nZXRQb3J0KCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBqYXZhLm5ldC5Qcm94eS5OT19QUk9YWTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGZ1bmN0aW9uIC8gZGVwcmVjYXRlCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgcHJlZmVycmVkIHByb3h5IHRvIGJlIHVzZWQgYnkgY2xpZW50cy4gVGhpcyBpcyBhIHdyYXBwZXIKICAgICAgKiBhcm91bmQge0BsaW5rIGFuZHJvaWQubmV0LlByb3h5I2dldEhvc3QoKX0uIEN1cnJlbnRseSBubyBwcm94eSB3aWxsCkBAIC0xMzgsMjYgKzI3OCwyMyBAQAogICAgICAqIGFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfTkVUV09SS19TVEFURQogICAgICAqIEByZXR1cm4gVGhlIHByZWZlcnJlZCBwcm94eSB0byBiZSB1c2VkIGJ5IGNsaWVudHMsIG9yIG51bGwgaWYgdGhlcmUKICAgICAgKiBpcyBubyBwcm94eS4KLSAgICAgKgogICAgICAqIHtAaGlkZX0KICAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgcHVibGljIEh0dHBIb3N0IGdldFByZWZlcnJlZEh0dHBIb3N0KENvbnRleHQgY29udGV4dCwKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEh0dHBIb3N0IGdldFByZWZlcnJlZEh0dHBIb3N0KENvbnRleHQgY29udGV4dCwKICAgICAgICAgICAgIFN0cmluZyB1cmwpIHsKLSAgICAgICAgaWYgKCFpc0xvY2FsSG9zdCh1cmwpICYmICFpc05ldHdvcmtXaWZpKGNvbnRleHQpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJveHlIb3N0ID0gUHJveHkuZ2V0SG9zdChjb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChwcm94eUhvc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSHR0cEhvc3QocHJveHlIb3N0LCBQcm94eS5nZXRQb3J0KGNvbnRleHQpLCAiaHR0cCIpOwotICAgICAgICAgICAgfQorICAgICAgICBqYXZhLm5ldC5Qcm94eSBwcmVmUHJveHkgPSBnZXRQcm94eShjb250ZXh0LCB1cmwpOworICAgICAgICBpZiAocHJlZlByb3h5LmVxdWFscyhqYXZhLm5ldC5Qcm94eS5OT19QUk9YWSkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3Mgc2EgPSAoSW5ldFNvY2tldEFkZHJlc3MpcHJlZlByb3h5LmFkZHJlc3MoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSHR0cEhvc3Qoc2EuZ2V0SG9zdE5hbWUoKSwgc2EuZ2V0UG9ydCgpLCAiaHR0cCIpOwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgc3RhdGljIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBpc0xvY2FsSG9zdChTdHJpbmcgdXJsKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0xvY2FsSG9zdChTdHJpbmcgdXJsKSB7CiAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0KICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVUkkuY3JlYXRlKHVybCk7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaG9zdCA9IHVyaS5nZXRIb3N0KCk7CkBAIC0xNzQsMTUgKzMxMSwxMyBAQAogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWV4KSB7CiAgICAgICAgICAgICAvLyBJZ25vcmUgKFVSSS5jcmVhdGUpCiAgICAgICAgIH0KLQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgc3RhdGljIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBpc05ldHdvcmtXaWZpKENvbnRleHQgY29udGV4dCkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNOZXR3b3JrV2lmaShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0KICAgICAgICAgZmluYWwgQ29ubmVjdGl2aXR5TWFuYWdlciBjb25uZWN0aXZpdHkgPSAoQ29ubmVjdGl2aXR5TWFuYWdlcikKICAgICAgICAgICAgIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKICAgICAgICAgaWYgKGNvbm5lY3Rpdml0eSAhPSBudWxsKSB7CkBAIC0xOTIsNyArMzI3LDEyOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLX07CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKworICAgICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICAgICAgU2V0dGluZ3NPYnNlcnZlcihDb250ZXh0IGN0eCkgeworICAgICAgICAgICAgc3VwZXIobmV3IEhhbmRsZXIoY3R4LmdldE1haW5Mb29wZXIoKSkpOworICAgICAgICAgICAgbUNvbnRleHQgPSBjdHg7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIHBhcnNlR2xvYmFsUHJveHlJbmZvUmVhZExvY2tlZChtQ29udGV4dCk7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCByZWdpc3RlckNvbnRlbnRPYnNlcnZlcnNSZWFkTG9ja2VkKENvbnRleHQgY3R4KSB7CisgICAgICAgIFVyaSB1cmlHbG9iYWxQcm94eSA9IFNldHRpbmdzLlNlY3VyZS5nZXRVcmlGb3IoU2V0dGluZ3MuU2VjdXJlLkhUVFBfUFJPWFkpOworICAgICAgICBVcmkgdXJpR2xvYmFsRXhjbExpc3QgPQorICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcihTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWV9FWENMVVNJT05fTElTVCk7CisKKyAgICAgICAgLy8gTm8gbG9jayB1cGdyYWRpbmcgKGZyb20gcmVhZCB0byB3cml0ZSkgYWxsb3dlZAorICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzR2xvYmFsUHJveHlDaGFuZ2VkT2JzZXJ2ZXIgPSBuZXcgU2V0dGluZ3NPYnNlcnZlcihjdHgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gRG93bmdyYWRpbmcgbG9ja3MgKGZyb20gd3JpdGUgdG8gcmVhZCkgaXMgYWxsb3dlZAorICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICBjdHguZ2V0Q29udGVudFJlc29sdmVyKCkucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIodXJpR2xvYmFsUHJveHksIGZhbHNlLAorICAgICAgICAgICAgICAgIHNHbG9iYWxQcm94eUNoYW5nZWRPYnNlcnZlcik7CisgICAgICAgIGN0eC5nZXRDb250ZW50UmVzb2x2ZXIoKS5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcih1cmlHbG9iYWxFeGNsTGlzdCwgZmFsc2UsCisgICAgICAgICAgICAgICAgc0dsb2JhbFByb3h5Q2hhbmdlZE9ic2VydmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIHBhcnNlR2xvYmFsUHJveHlJbmZvUmVhZExvY2tlZChDb250ZXh0IGN0eCkgeworICAgICAgICBDb250ZW50UmVzb2x2ZXIgY29udGVudFJlc29sdmVyID0gY3R4LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICBTdHJpbmcgcHJveHlIb3N0ID0gIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgY29udGVudFJlc29sdmVyLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5IVFRQX1BST1hZKTsKKyAgICAgICAgaWYgKChwcm94eUhvc3QgPT0gbnVsbCkgfHwgKHByb3h5SG9zdC5sZW5ndGgoKSA9PSAwKSkgeworICAgICAgICAgICAgLy8gQ2xlYXIgc2lnbmFsCisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgc0dsb2JhbFByb3h5U3BlYyA9IG51bGw7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBleGNsdXNpb25MaXN0U3BlYyA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgY29udGVudFJlc29sdmVyLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5IVFRQX1BST1hZX0VYQ0xVU0lPTl9MSVNUKTsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSBwYXJzZUhvc3QocHJveHlIb3N0KTsKKyAgICAgICAgaW50IHBvcnQgPSBwYXJzZVBvcnQocHJveHlIb3N0KTsKKyAgICAgICAgaWYgKHByb3h5SG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICBzR2xvYmFsUHJveHlTcGVjID0gbmV3IFByb3h5U3BlYygpOworICAgICAgICAgICAgc0dsb2JhbFByb3h5U3BlYy5wcm94eUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICBpZiAoKGV4Y2x1c2lvbkxpc3RTcGVjICE9IG51bGwpICYmIChleGNsdXNpb25MaXN0U3BlYy5sZW5ndGgoKSAhPSAwKSkgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGV4Y2x1c2lvbkxpc3RFbnRyaWVzID0gZXhjbHVzaW9uTGlzdFNwZWMudG9Mb3dlckNhc2UoKS5zcGxpdCgiLCIpOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHByb2Nlc3NlZEVudHJpZXMgPSBuZXcgU3RyaW5nW2V4Y2x1c2lvbkxpc3RFbnRyaWVzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdXNpb25MaXN0RW50cmllcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnkgPSBleGNsdXNpb25MaXN0RW50cmllc1tpXS50cmltKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5zdGFydHNXaXRoKCIuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gZW50cnkuc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEVudHJpZXNbaV0gPSBlbnRyeTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICAgICAgc0dsb2JhbFByb3h5U3BlYy5leGNsdXNpb25MaXN0ID0gcHJvY2Vzc2VkRW50cmllczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICAgICAgc0dsb2JhbFByb3h5U3BlYy5leGNsdXNpb25MaXN0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBzR2xvYmFsUHJveHlTcGVjID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgc1Byb3h5SW5mb0xvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgc3ludGF4IG9mIGhvc3RuYW1lLCBwb3J0IGFuZCBleGNsdXNpb24gbGlzdCBlbnRyaWVzCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZShTdHJpbmcgaG9zdG5hbWUsIFN0cmluZyBwb3J0LCBTdHJpbmcgZXhjbExpc3QpIHsKKyAgICAgICAgTWF0Y2hlciBtYXRjaCA9IEhPU1ROQU1FX1BBVFRFUk4ubWF0Y2hlcihob3N0bmFtZSk7CisgICAgICAgIE1hdGNoZXIgbGlzdE1hdGNoID0gRVhDTExJU1RfUEFUVEVSTi5tYXRjaGVyKGV4Y2xMaXN0KTsKKworICAgICAgICBpZiAoIW1hdGNoLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFsaXN0TWF0Y2gubWF0Y2hlcygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaG9zdG5hbWUubGVuZ3RoKCkgPiAwICYmIHBvcnQubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvcnQubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBpZiAoaG9zdG5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBwb3J0VmFsID0gLTE7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHBvcnRWYWwgPSBJbnRlZ2VyLnBhcnNlSW50KHBvcnQpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvcnRWYWwgPD0gMCB8fCBwb3J0VmFsID4gMHhGRkZGKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5UHJvcGVydGllcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5UHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZDBlYzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvUHJveHlQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKKworLyoqCisgKiBBIGNvbnRhaW5lciBjbGFzcyBmb3IgdGhlIGh0dHAgcHJveHkgaW5mbworICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIFByb3h5UHJvcGVydGllcyBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworCisgICAgcHJpdmF0ZSBJbmV0QWRkcmVzcyBtUHJveHk7CisgICAgcHJpdmF0ZSBpbnQgbVBvcnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUV4Y2x1c2lvbkxpc3Q7CisKKyAgICBwdWJsaWMgUHJveHlQcm9wZXJ0aWVzKCkgeworICAgIH0KKworICAgIC8vIGNvcHkgY29uc3RydWN0b3IgaW5zdGVhZCBvZiBjbG9uZQorICAgIHB1YmxpYyBQcm94eVByb3BlcnRpZXMoUHJveHlQcm9wZXJ0aWVzIHNvdXJjZSkgeworICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qcm94eSA9IHNvdXJjZS5nZXRBZGRyZXNzKCk7CisgICAgICAgICAgICBtUG9ydCA9IHNvdXJjZS5nZXRQb3J0KCk7CisgICAgICAgICAgICBTdHJpbmcgZXhjbHVzaW9uTGlzdCA9IHNvdXJjZS5nZXRFeGNsdXNpb25MaXN0KCk7CisgICAgICAgICAgICBpZiAoZXhjbHVzaW9uTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUV4Y2x1c2lvbkxpc3QgPSBuZXcgU3RyaW5nKGV4Y2x1c2lvbkxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEluZXRBZGRyZXNzIGdldEFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiBtUHJveHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWRkcmVzcyhJbmV0QWRkcmVzcyBwcm94eSkgeworICAgICAgICBtUHJveHkgPSBwcm94eTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBvcnQoKSB7CisgICAgICAgIHJldHVybiBtUG9ydDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwb3J0KSB7CisgICAgICAgIG1Qb3J0ID0gcG9ydDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4Y2x1c2lvbkxpc3QoKSB7CisgICAgICAgIHJldHVybiBtRXhjbHVzaW9uTGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdXNpb25MaXN0KFN0cmluZyBleGNsdXNpb25MaXN0KSB7CisgICAgICAgIG1FeGNsdXNpb25MaXN0ID0gZXhjbHVzaW9uTGlzdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKG1Qcm94eS5nZXRIb3N0QWRkcmVzcygpKS5hcHBlbmQoIjoiKS5hcHBlbmQobVBvcnQpCisgICAgICAgICAgLmFwcGVuZCgiIHhsPSIpLmFwcGVuZChtRXhjbHVzaW9uTGlzdCk7CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2UKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBpZiAobVByb3h5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChieXRlKTEpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtUHJveHkuZ2V0SG9zdE5hbWUoKSk7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZUFycmF5KG1Qcm94eS5nZXRBZGRyZXNzKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKGJ5dGUpMCk7CisgICAgICAgIH0KKyAgICAgICAgZGVzdC53cml0ZUludChtUG9ydCk7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobUV4Y2x1c2lvbkxpc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2UuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENyZWF0b3I8UHJveHlQcm9wZXJ0aWVzPiBDUkVBVE9SID0KKyAgICAgICAgbmV3IENyZWF0b3I8UHJveHlQcm9wZXJ0aWVzPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBQcm94eVByb3BlcnRpZXMgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgICAgICBQcm94eVByb3BlcnRpZXMgcHJveHlQcm9wZXJ0aWVzID0gbmV3IFByb3h5UHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIGlmIChpbi5yZWFkQnl0ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5UHJvcGVydGllcy5zZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcyhpbi5yZWFkU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLmNyZWF0ZUJ5dGVBcnJheSgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHt9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByb3h5UHJvcGVydGllcy5zZXRQb3J0KGluLnJlYWRJbnQoKSk7CisgICAgICAgICAgICAgICAgcHJveHlQcm9wZXJ0aWVzLnNldEV4Y2x1c2lvbkxpc3QoaW4ucmVhZFN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJveHlQcm9wZXJ0aWVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgUHJveHlQcm9wZXJ0aWVzW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb3h5UHJvcGVydGllc1tzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9VcmkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9VcmkuamF2YQppbmRleCA0N2ZhYWJhLi4zYjIxNTkwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvVXJpLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1VyaS5qYXZhCkBAIC0yOCw4ICsyOCwxMCBAQAogaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbUFjY2VzczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAvKioKICAqIEltbXV0YWJsZSBVUkkgcmVmZXJlbmNlLiBBIFVSSSByZWZlcmVuY2UgaW5jbHVkZXMgYSBVUkkgYW5kIGEgZnJhZ21lbnQsIHRoZQpAQCAtNDcsNyArNDksNyBAQAogICAgIC8qCiAKICAgICBUaGlzIGNsYXNzIGFpbXMgdG8gZG8gYXMgbGl0dGxlIHVwIGZyb250IHdvcmsgYXMgcG9zc2libGUuIFRvIGFjY29tcGxpc2gKLSAgICB0aGF0LCB3ZSB2YXJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbmRpbmcgb24gd2hhdCB0aGUgdXNlciBwYXNzZXMgaW4uCisgICAgdGhhdCwgd2UgdmFyeSB0aGUgaW1wbGVtZW50YXRpb24gZGVwZW5kaW5nIG9uIHdoYXQgdGhlIHVzZXIgcGFzc2VzIGluLgogICAgIEZvciBleGFtcGxlLCB3ZSBoYXZlIG9uZSBpbXBsZW1lbnRhdGlvbiBpZiB0aGUgdXNlciBwYXNzZXMgaW4gYQogICAgIFVSSSBzdHJpbmcgKFN0cmluZ1VyaSkgYW5kIGFub3RoZXIgaWYgdGhlIHVzZXIgcGFzc2VzIGluIHRoZQogICAgIGluZGl2aWR1YWwgY29tcG9uZW50cyAoT3BhcXVlVXJpKS4KQEAgLTEyNTMsMTQgKzEyNTUsMTYgQEAKICAgICAgKiBjb25jdXJyZW50IHVzZS4KICAgICAgKgogICAgICAqIDxwPkFuIGFic29sdXRlIGhpZXJhcmNoaWNhbCBVUkkgcmVmZXJlbmNlIGZvbGxvd3MgdGhlIHBhdHRlcm46Ci0gICAgICoge0Bjb2RlICZsdDtzY2hlbWUmZ3Q7Oi8vJmx0O2F1dGhvcml0eSZndDsmbHQ7YWJzb2x1dGUgcGF0aCZndDs/Jmx0O3F1ZXJ5Jmd0OyMmbHQ7ZnJhZ21lbnQmZ3Q7fQorICAgICAqIHtAY29kZSA8c2NoZW1lPjovLzxhdXRob3JpdHk+PGFic29sdXRlIHBhdGg+PzxxdWVyeT4jPGZyYWdtZW50Pn0KICAgICAgKgogICAgICAqIDxwPlJlbGF0aXZlIFVSSSByZWZlcmVuY2VzICh3aGljaCBhcmUgYWx3YXlzIGhpZXJhcmNoaWNhbCkgZm9sbG93IG9uZQotICAgICAqIG9mIHR3byBwYXR0ZXJuczoge0Bjb2RlICZsdDtyZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoJmd0Oz8mbHQ7cXVlcnkmZ3Q7IyZsdDtmcmFnbWVudCZndDt9Ci0gICAgICogb3Ige0Bjb2RlIC8vJmx0O2F1dGhvcml0eSZndDsmbHQ7YWJzb2x1dGUgcGF0aCZndDs/Jmx0O3F1ZXJ5Jmd0OyMmbHQ7ZnJhZ21lbnQmZ3Q7fQorICAgICAqIG9mIHR3byBwYXR0ZXJuczoge0Bjb2RlIDxyZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoPj88cXVlcnk+IzxmcmFnbWVudD59CisgICAgICogb3Ige0Bjb2RlIC8vPGF1dGhvcml0eT48YWJzb2x1dGUgcGF0aD4/PHF1ZXJ5PiM8ZnJhZ21lbnQ+fQogICAgICAqCiAgICAgICogPHA+QW4gb3BhcXVlIFVSSSBmb2xsb3dzIHRoaXMgcGF0dGVybjoKLSAgICAgKiB7QGNvZGUgJmx0O3NjaGVtZSZndDs6Jmx0O29wYXF1ZSBwYXJ0Jmd0OyMmbHQ7ZnJhZ21lbnQmZ3Q7fQorICAgICAqIHtAY29kZSA8c2NoZW1lPjo8b3BhcXVlIHBhcnQ+IzxmcmFnbWVudD59CisgICAgICogCisgICAgICogPHA+VXNlIHtAbGluayBVcmkjYnVpbGRVcG9uKCl9IHRvIG9idGFpbiBhIGJ1aWxkZXIgcmVwcmVzZW50aW5nIGFuIGV4aXN0aW5nIFVSSS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewogCkBAIC0xNDQ3LDYgKzE0NTEsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBDbGVhcnMgdGhlIHRoZSBwcmV2aW91c2x5IHNldCBxdWVyeS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGNsZWFyUXVlcnkoKSB7CisgICAgICAgICAgcmV0dXJuIHF1ZXJ5KChQYXJ0KSBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgogICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgVXJpIHdpdGggdGhlIGN1cnJlbnQgYXR0cmlidXRlcy4KICAgICAgICAgICoKICAgICAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgVVJJIGlzIG9wYXF1ZSBhbmQgdGhlCkBAIC0xNDkxLDE5ICsxNTAyLDYwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNldCBvZiB0aGUgdW5pcXVlIG5hbWVzIG9mIGFsbCBxdWVyeSBwYXJhbWV0ZXJzLiBJdGVyYXRpbmcKKyAgICAgKiBvdmVyIHRoZSBzZXQgd2lsbCByZXR1cm4gdGhlIG5hbWVzIGluIG9yZGVyIG9mIHRoZWlyIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgaXNuJ3QgYSBoaWVyYXJjaGljYWwgVVJJCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc2V0IG9mIGRlY29kZWQgbmFtZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UXVlcnlQYXJhbWV0ZXJOYW1lcygpIHsKKyAgICAgICAgaWYgKGlzT3BhcXVlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihOT1RfSElFUkFSQ0hJQ0FMKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBxdWVyeSA9IGdldEVuY29kZWRRdWVyeSgpOworICAgICAgICBpZiAocXVlcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBMaW5rZWRIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaW50IG5leHQgPSBxdWVyeS5pbmRleE9mKCcmJywgc3RhcnQpOworICAgICAgICAgICAgaW50IGVuZCA9IChuZXh0ID09IC0xKSA/IHF1ZXJ5Lmxlbmd0aCgpIDogbmV4dDsKKworICAgICAgICAgICAgaW50IHNlcGFyYXRvciA9IHF1ZXJ5LmluZGV4T2YoJz0nLCBzdGFydCk7CisgICAgICAgICAgICBpZiAoc2VwYXJhdG9yID4gZW5kIHx8IHNlcGFyYXRvciA9PSAtMSkgeworICAgICAgICAgICAgICAgIHNlcGFyYXRvciA9IGVuZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBxdWVyeS5zdWJzdHJpbmcoc3RhcnQsIHNlcGFyYXRvcik7CisgICAgICAgICAgICBuYW1lcy5hZGQoZGVjb2RlKG5hbWUpKTsKKworICAgICAgICAgICAgLy8gTW92ZSBzdGFydCB0byBlbmQgb2YgbmFtZS4KKyAgICAgICAgICAgIHN0YXJ0ID0gZW5kICsgMTsKKyAgICAgICAgfSB3aGlsZSAoc3RhcnQgPCBxdWVyeS5sZW5ndGgoKSk7CisKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuYW1lcyk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2VhcmNoZXMgdGhlIHF1ZXJ5IHN0cmluZyBmb3IgcGFyYW1ldGVyIHZhbHVlcyB3aXRoIHRoZSBnaXZlbiBrZXkuCiAgICAgICoKICAgICAgKiBAcGFyYW0ga2V5IHdoaWNoIHdpbGwgYmUgZW5jb2RlZAogICAgICAqCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIGlzbid0IGEgaGllcmFyY2hpY2FsIFVSSQogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYga2V5IGlzIG51bGwKLSAgICAgKgogICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGRlY29kZWQgdmFsdWVzCiAgICAgICovCiAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRRdWVyeVBhcmFtZXRlcnMoU3RyaW5nIGtleSkgewogICAgICAgICBpZiAoaXNPcGFxdWUoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE5PVF9ISUVSQVJDSElDQUwpOwogICAgICAgICB9CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigia2V5Iik7CisgICAgICAgIH0KIAogICAgICAgICBTdHJpbmcgcXVlcnkgPSBnZXRFbmNvZGVkUXVlcnkoKTsKICAgICAgICAgaWYgKHF1ZXJ5ID09IG51bGwpIHsKQEAgLTE1MTcsMzkgKzE1NjksMzQgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIFByZXBlbmQgcXVlcnkgd2l0aCAiJiIgbWFraW5nIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdGhlIHNhbWUgYXMgdGhlCi0gICAgICAgIC8vIHJlc3QuCi0gICAgICAgIHF1ZXJ5ID0gIiYiICsgcXVlcnk7Ci0KLSAgICAgICAgLy8gUGFyYW1ldGVyIHByZWZpeC4KLSAgICAgICAgU3RyaW5nIHByZWZpeCA9ICImIiArIGVuY29kZWRLZXkgKyAiPSI7Ci0KICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CiAKICAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgaW50IGxlbmd0aCA9IHF1ZXJ5Lmxlbmd0aCgpOwotICAgICAgICB3aGlsZSAoc3RhcnQgPCBsZW5ndGgpIHsKLSAgICAgICAgICAgIHN0YXJ0ID0gcXVlcnkuaW5kZXhPZihwcmVmaXgsIHN0YXJ0KTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaW50IG5leHRBbXBlcnNhbmQgPSBxdWVyeS5pbmRleE9mKCcmJywgc3RhcnQpOworICAgICAgICAgICAgaW50IGVuZCA9IG5leHRBbXBlcnNhbmQgIT0gLTEgPyBuZXh0QW1wZXJzYW5kIDogcXVlcnkubGVuZ3RoKCk7CiAKLSAgICAgICAgICAgIGlmIChzdGFydCA9PSAtMSkgewotICAgICAgICAgICAgICAgIC8vIE5vIG1vcmUgdmFsdWVzLgorICAgICAgICAgICAgaW50IHNlcGFyYXRvciA9IHF1ZXJ5LmluZGV4T2YoJz0nLCBzdGFydCk7CisgICAgICAgICAgICBpZiAoc2VwYXJhdG9yID4gZW5kIHx8IHNlcGFyYXRvciA9PSAtMSkgeworICAgICAgICAgICAgICAgIHNlcGFyYXRvciA9IGVuZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNlcGFyYXRvciAtIHN0YXJ0ID09IGVuY29kZWRLZXkubGVuZ3RoKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgcXVlcnkucmVnaW9uTWF0Y2hlcyhzdGFydCwgZW5jb2RlZEtleSwgMCwgZW5jb2RlZEtleS5sZW5ndGgoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2VwYXJhdG9yID09IGVuZCkgeworICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCgiIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoZGVjb2RlKHF1ZXJ5LnN1YnN0cmluZyhzZXBhcmF0b3IgKyAxLCBlbmQpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBNb3ZlIHN0YXJ0IHRvIGVuZCBvZiBuYW1lLgorICAgICAgICAgICAgaWYgKG5leHRBbXBlcnNhbmQgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBzdGFydCA9IG5leHRBbXBlcnNhbmQgKyAxOworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTW92ZSBzdGFydCB0byBzdGFydCBvZiB2YWx1ZS4KLSAgICAgICAgICAgIHN0YXJ0ICs9IHByZWZpeC5sZW5ndGgoKTsKLQotICAgICAgICAgICAgLy8gRmluZCBlbmQgb2YgdmFsdWUuCi0gICAgICAgICAgICBpbnQgZW5kID0gcXVlcnkuaW5kZXhPZignJicsIHN0YXJ0KTsKLSAgICAgICAgICAgIGlmIChlbmQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBlbmQgPSBxdWVyeS5sZW5ndGgoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcXVlcnkuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAgdmFsdWVzLmFkZChkZWNvZGUodmFsdWUpKTsKLQotICAgICAgICAgICAgc3RhcnQgPSBlbmQ7Ci0gICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodmFsdWVzKTsKICAgICB9CkBAIC0xNTYwLDcgKzE2MDcsNiBAQAogICAgICAqIEBwYXJhbSBrZXkgd2hpY2ggd2lsbCBiZSBlbmNvZGVkCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIGlzbid0IGEgaGllcmFyY2hpY2FsIFVSSQogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYga2V5IGlzIG51bGwKLSAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIGRlY29kZWQgdmFsdWUgb3IgbnVsbCBpZiBubyBwYXJhbWV0ZXIgaXMgZm91bmQKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5UGFyYW1ldGVyKFN0cmluZyBrZXkpIHsKQEAgLTE1NjgsNyArMTYxNCw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTk9UX0hJRVJBUkNISUNBTCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJrZXkiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigia2V5Iik7CiAgICAgICAgIH0KIAogICAgICAgICBmaW5hbCBTdHJpbmcgcXVlcnkgPSBnZXRFbmNvZGVkUXVlcnkoKTsKQEAgLTE1NzcsMzcgKzE2MjMsNTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkS2V5ID0gZW5jb2RlKGtleSwgbnVsbCk7Ci0gICAgICAgIGZpbmFsIGludCBlbmNvZGVkS2V5TGVuZ3RoID0gZW5jb2RlZEtleS5sZW5ndGgoKTsKKyAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHF1ZXJ5Lmxlbmd0aCgpOworICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpbnQgbmV4dEFtcGVyc2FuZCA9IHF1ZXJ5LmluZGV4T2YoJyYnLCBzdGFydCk7CisgICAgICAgICAgICBpbnQgZW5kID0gbmV4dEFtcGVyc2FuZCAhPSAtMSA/IG5leHRBbXBlcnNhbmQgOiBsZW5ndGg7CiAKLSAgICAgICAgaW50IGVuY29kZWRLZXlTZWFyY2hJbmRleCA9IDA7Ci0gICAgICAgIGZpbmFsIGludCBlbmNvZGVkS2V5U2VhcmNoRW5kID0gcXVlcnkubGVuZ3RoKCkgLSAoZW5jb2RlZEtleUxlbmd0aCArIDEpOworICAgICAgICAgICAgaW50IHNlcGFyYXRvciA9IHF1ZXJ5LmluZGV4T2YoJz0nLCBzdGFydCk7CisgICAgICAgICAgICBpZiAoc2VwYXJhdG9yID4gZW5kIHx8IHNlcGFyYXRvciA9PSAtMSkgeworICAgICAgICAgICAgICAgIHNlcGFyYXRvciA9IGVuZDsKKyAgICAgICAgICAgIH0KIAotICAgICAgICB3aGlsZSAoZW5jb2RlZEtleVNlYXJjaEluZGV4IDw9IGVuY29kZWRLZXlTZWFyY2hFbmQpIHsKLSAgICAgICAgICAgIGludCBrZXlJbmRleCA9IHF1ZXJ5LmluZGV4T2YoZW5jb2RlZEtleSwgZW5jb2RlZEtleVNlYXJjaEluZGV4KTsKLSAgICAgICAgICAgIGlmIChrZXlJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgaW50IGVxdWFsc0luZGV4ID0ga2V5SW5kZXggKyBlbmNvZGVkS2V5TGVuZ3RoOwotICAgICAgICAgICAgaWYgKGVxdWFsc0luZGV4ID49IHF1ZXJ5Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocXVlcnkuY2hhckF0KGVxdWFsc0luZGV4KSAhPSAnPScpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkS2V5U2VhcmNoSW5kZXggPSBlcXVhbHNJbmRleCArIDE7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoa2V5SW5kZXggPT0gMCB8fCBxdWVyeS5jaGFyQXQoa2V5SW5kZXggLSAxKSA9PSAnJicpIHsKLSAgICAgICAgICAgICAgICBpbnQgZW5kID0gcXVlcnkuaW5kZXhPZignJicsIGVxdWFsc0luZGV4KTsKLSAgICAgICAgICAgICAgICBpZiAoZW5kID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZCA9IHF1ZXJ5Lmxlbmd0aCgpOworICAgICAgICAgICAgaWYgKHNlcGFyYXRvciAtIHN0YXJ0ID09IGVuY29kZWRLZXkubGVuZ3RoKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgcXVlcnkucmVnaW9uTWF0Y2hlcyhzdGFydCwgZW5jb2RlZEtleSwgMCwgZW5jb2RlZEtleS5sZW5ndGgoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2VwYXJhdG9yID09IGVuZCkgeworICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlKHF1ZXJ5LnN1YnN0cmluZyhzZXBhcmF0b3IgKyAxLCBlbmQpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZShxdWVyeS5zdWJzdHJpbmcoZXF1YWxzSW5kZXggKyAxLCBlbmQpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEtleVNlYXJjaEluZGV4ID0gZXF1YWxzSW5kZXggKyAxOwogICAgICAgICAgICAgfQotICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE1vdmUgc3RhcnQgdG8gZW5kIG9mIG5hbWUuCisgICAgICAgICAgICBpZiAobmV4dEFtcGVyc2FuZCAhPSAtMSkgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gbmV4dEFtcGVyc2FuZCArIDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICh0cnVlKTsKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCisgICAgLyoqCisgICAgICogU2VhcmNoZXMgdGhlIHF1ZXJ5IHN0cmluZyBmb3IgdGhlIGZpcnN0IHZhbHVlIHdpdGggdGhlIGdpdmVuIGtleSBhbmQgaW50ZXJwcmV0cyBpdAorICAgICAqIGFzIGEgYm9vbGVhbiB2YWx1ZS4gImZhbHNlIiBhbmQgIjAiIGFyZSBpbnRlcnByZXRlZCBhcyA8Y29kZT5mYWxzZTwvY29kZT4sIGV2ZXJ5dGhpbmcKKyAgICAgKiBlbHNlIGlzIGludGVycHJldGVkIGFzIDxjb2RlPnRydWU8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGtleSB3aGljaCB3aWxsIGJlIGRlY29kZWQKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiB0aGVyZSBpcyBubyBxdWVyeSBwYXJhbWV0ZXIgZm9yIGtleQorICAgICAqIEByZXR1cm4gdGhlIGJvb2xlYW4gaW50ZXJwcmV0YXRpb24gb2YgdGhlIHF1ZXJ5IHBhcmFtZXRlciBrZXkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuUXVlcnlQYXJhbWV0ZXIoU3RyaW5nIGtleSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgU3RyaW5nIGZsYWcgPSBnZXRRdWVyeVBhcmFtZXRlcihrZXkpOworICAgICAgICBpZiAoZmxhZyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisgICAgICAgIGZsYWcgPSBmbGFnLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIHJldHVybiAoISJmYWxzZSIuZXF1YWxzKGZsYWcpICYmICEiMCIuZXF1YWxzKGZsYWcpKTsKKyAgICB9CisKICAgICAvKiogSWRlbnRpZmllcyBhIG51bGwgcGFyY2VsbGVkIFVyaS4gKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVMTF9UWVBFX0lEID0gMDsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQW5kcm9pZEh0dHBDbGllbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0FuZHJvaWRIdHRwQ2xpZW50LmphdmEKaW5kZXggZTA3ZWU1OS4uOTE1ZTM0MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQW5kcm9pZEh0dHBDbGllbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9BbmRyb2lkSHR0cENsaWVudC5qYXZhCkBAIC02MSw2ICs2MSw3IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQuU1NMQ2VydGlmaWNhdGVTb2NrZXRGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQubmV0LlNTTFNlc3Npb25DYWNoZTsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQmFzZTY0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIC8qKgpAQCAtODEsNiArODIsMTEgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQW5kcm9pZEh0dHBDbGllbnQiOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGV4dENvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAidGV4dC8iLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3htbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vanNvbiIKKyAgICB9OwogCiAgICAgLyoqIEludGVyY2VwdG9yIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGV4ZWN1dGluZyB0aHJlYWQgaXMgYmxvY2tlZCAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEh0dHBSZXF1ZXN0SW50ZXJjZXB0b3Igc1RocmVhZENoZWNrSW50ZXJjZXB0b3IgPQpAQCAtMzU4LDcgKzM2NCw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGxldmVsIDwgTG9nLlZFUkJPU0UgfHwgbGV2ZWwgPiBMb2cuQVNTRVJUKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMZXZlbCBpcyBvdXQgb2YgcmFuZ2UgWyIKLSAgICAgICAgICAgICAgICArIExvZy5WRVJCT1NFICsgIi4uIiArIExvZy5BU1NFUlQgKyAiXSIpOyAgICAKKyAgICAgICAgICAgICAgICArIExvZy5WRVJCT1NFICsgIi4uIiArIExvZy5BU1NFUlQgKyAiXSIpOwogICAgICAgICB9CiAKICAgICAgICAgY3VybENvbmZpZ3VyYXRpb24gPSBuZXcgTG9nZ2luZ0NvbmZpZ3VyYXRpb24obmFtZSwgbGV2ZWwpOwpAQCAtNDMxLDEyICs0MzcsMTcgQEAKICAgICAgICAgICAgICAgICBpZiAoZW50aXR5LmdldENvbnRlbnRMZW5ndGgoKSA8IDEwMjQpIHsKICAgICAgICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgICAgICAgICAgICAgZW50aXR5LndyaXRlVG8oc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVudGl0eVN0cmluZyA9IHN0cmVhbS50b1N0cmluZygpOwogCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IENoZWNrIHRoZSBjb250ZW50IHR5cGUsIHRvby4KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiAtLWRhdGEtYXNjaWkgXCIiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZW50aXR5U3RyaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0JpbmFyeUNvbnRlbnQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlNjQgPSBCYXNlNjQuZW5jb2RlVG9TdHJpbmcoc3RyZWFtLnRvQnl0ZUFycmF5KCksIEJhc2U2NC5OT19XUkFQKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuaW5zZXJ0KDAsICJlY2hvICciICsgYmFzZTY0ICsgIicgfCBiYXNlNjQgLWQgPiAvdG1wLyQkLmJpbjsgIik7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIC0tZGF0YS1iaW5hcnkgQC90bXAvJCQuYmluIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50aXR5U3RyaW5nID0gc3RyZWFtLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIC0tZGF0YS1hc2NpaSBcIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZW50aXR5U3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcIiIpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiBbVE9PIE1VQ0ggREFUQSBUTyBJTkNMVURFXSIpOwogICAgICAgICAgICAgICAgIH0KQEAgLTQ0Niw2ICs0NTcsMzAgQEAKICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQmluYXJ5Q29udGVudChIdHRwVXJpUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIEhlYWRlcltdIGhlYWRlcnM7CisgICAgICAgIGhlYWRlcnMgPSByZXF1ZXN0LmdldEhlYWRlcnMoSGVhZGVycy5DT05URU5UX0VOQ09ESU5HKTsKKyAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChIZWFkZXIgaGVhZGVyIDogaGVhZGVycykgeworICAgICAgICAgICAgICAgIGlmICgiZ3ppcCIuZXF1YWxzSWdub3JlQ2FzZShoZWFkZXIuZ2V0VmFsdWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaGVhZGVycyA9IHJlcXVlc3QuZ2V0SGVhZGVycyhIZWFkZXJzLkNPTlRFTlRfVFlQRSk7CisgICAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSGVhZGVyIGhlYWRlciA6IGhlYWRlcnMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBjb250ZW50VHlwZSA6IHRleHRDb250ZW50VHlwZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlci5nZXRWYWx1ZSgpLnN0YXJ0c1dpdGgoY29udGVudFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgZGF0ZSBvZiB0aGUgZ2l2ZW4gSFRUUCBkYXRlIHN0cmluZy4gVGhpcyBtZXRob2QgY2FuIGlkZW50aWZ5CiAgICAgICogYW5kIHBhcnNlIHRoZSBkYXRlIGZvcm1hdHMgZW1pdHRlZCBieSBjb21tb24gSFRUUCBzZXJ2ZXJzLCBzdWNoIGFzCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZUNoYWluVmFsaWRhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZUNoYWluVmFsaWRhdG9yLmphdmEKaW5kZXggYzUyN2ZlNC4uYzM2YWQzOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQ2VydGlmaWNhdGVDaGFpblZhbGlkYXRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0NlcnRpZmljYXRlQ2hhaW5WYWxpZGF0b3IuamF2YQpAQCAtODAsMTQgKzgwLDEwIEBACiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBYNTA5Q2VydGlmaWNhdGVbXSBzZXJ2ZXJDZXJ0aWZpY2F0ZXMgPSBudWxsOwogCi0gICAgICAgIC8vIHN0YXJ0IGhhbmRzaGFrZSwgY2xvc2UgdGhlIHNvY2tldCBpZiB3ZSBmYWlsCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzc2xTb2NrZXQuc2V0VXNlQ2xpZW50TW9kZSh0cnVlKTsKLSAgICAgICAgICAgIHNzbFNvY2tldC5zdGFydEhhbmRzaGFrZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBjbG9zZVNvY2tldFRocm93RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIHNzbFNvY2tldCwgZS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgImZhaWxlZCB0byBwZXJmb3JtIFNTTCBoYW5kc2hha2UiKTsKKyAgICAgICAgLy8gZ2V0IGEgdmFsaWQgU1NMU2Vzc2lvbiwgY2xvc2UgdGhlIHNvY2tldCBpZiB3ZSBmYWlsCisgICAgICAgIFNTTFNlc3Npb24gc3NsU2Vzc2lvbiA9IHNzbFNlc3Npb24gPSBzc2xTb2NrZXQuZ2V0U2Vzc2lvbigpOworICAgICAgICBpZiAoIXNzbFNlc3Npb24uaXNWYWxpZCgpKSB7CisgICAgICAgICAgICBjbG9zZVNvY2tldFRocm93RXhjZXB0aW9uKHNzbFNvY2tldCwgImZhaWxlZCB0byBwZXJmb3JtIFNTTCBoYW5kc2hha2UiKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIHJldHJpZXZlIHRoZSBjaGFpbiBvZiB0aGUgc2VydmVyIHBlZXIgY2VydGlmaWNhdGVzCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9Bc3luY1Rhc2suamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0FzeW5jVGFzay5qYXZhCmluZGV4IGQyODE0OGMuLmFhZGFjYWIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0FzeW5jVGFzay5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0FzeW5jVGFzay5qYXZhCkBAIC0xNiwxNiArMTYsMTYgQEAKIAogcGFja2FnZSBhbmRyb2lkLm9zOwogCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FuY2VsbGF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmVUYXNrOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmVUYXNrOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYW5jZWxsYXRpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiAKIC8qKgpAQCAtMzYsOCArMzYsOCBAQAogICogPHA+QW4gYXN5bmNocm9ub3VzIHRhc2sgaXMgZGVmaW5lZCBieSBhIGNvbXB1dGF0aW9uIHRoYXQgcnVucyBvbiBhIGJhY2tncm91bmQgdGhyZWFkIGFuZAogICogd2hvc2UgcmVzdWx0IGlzIHB1Ymxpc2hlZCBvbiB0aGUgVUkgdGhyZWFkLiBBbiBhc3luY2hyb25vdXMgdGFzayBpcyBkZWZpbmVkIGJ5IDMgZ2VuZXJpYwogICogdHlwZXMsIGNhbGxlZCA8Y29kZT5QYXJhbXM8L2NvZGU+LCA8Y29kZT5Qcm9ncmVzczwvY29kZT4gYW5kIDxjb2RlPlJlc3VsdDwvY29kZT4sCi0gKiBhbmQgNCBzdGVwcywgY2FsbGVkIDxjb2RlPmJlZ2luPC9jb2RlPiwgPGNvZGU+ZG9JbkJhY2tncm91bmQ8L2NvZGU+LAotICogPGNvZGU+cHJvY2Vzc1Byb2dyZXNzPC9jb2RlPiBhbmQgPGNvZGU+ZW5kPC9jb2RlPi48L3A+CisgKiBhbmQgNCBzdGVwcywgY2FsbGVkIDxjb2RlPm9uUHJlRXhlY3V0ZTwvY29kZT4sIDxjb2RlPmRvSW5CYWNrZ3JvdW5kPC9jb2RlPiwKKyAqIDxjb2RlPm9uUHJvZ3Jlc3NVcGRhdGU8L2NvZGU+IGFuZCA8Y29kZT5vblBvc3RFeGVjdXRlPC9jb2RlPi48L3A+CiAgKgogICogPGgyPlVzYWdlPC9oMj4KICAqIDxwPkFzeW5jVGFzayBtdXN0IGJlIHN1YmNsYXNzZWQgdG8gYmUgdXNlZC4gVGhlIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgYXQgbGVhc3QKQEAgLTE3NSw2ICsxNzUsMTEgQEAKICAgICAgICAgRklOSVNIRUQsCiAgICAgfQogCisgICAgLyoqIEBoaWRlIFVzZWQgdG8gZm9yY2Ugc3RhdGljIGhhbmRsZXIgdG8gYmUgY3JlYXRlZC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgc0hhbmRsZXIuZ2V0TG9vcGVyKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIG5ldyBhc3luY2hyb25vdXMgdGFzay4gVGhpcyBjb25zdHJ1Y3RvciBtdXN0IGJlIGludm9rZWQgb24gdGhlIFVJIHRocmVhZC4KICAgICAgKi8KQEAgLTE4Nyw2ICsxOTIsMTcgQEAKICAgICAgICAgfTsKIAogICAgICAgICBtRnV0dXJlID0gbmV3IEZ1dHVyZVRhc2s8UmVzdWx0PihtV29ya2VyKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0KFJlc3VsdCB2KSB7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0KHYpOworICAgICAgICAgICAgICAgIGlmIChpc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHNIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTUVTU0FHRV9QT1NUX0NBTkNFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXN5bmNUYXNrUmVzdWx0PFJlc3VsdD4oQXN5bmNUYXNrLnRoaXMsIChSZXN1bHRbXSkgbnVsbCkpOworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb25lKCkgewogICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZTsKQEAgLTQwMiwxNCArNDE4LDE5IEBACiAgICAgICogc3RpbGwgcnVubmluZy4gRWFjaCBjYWxsIHRvIHRoaXMgbWV0aG9kIHdpbGwgdHJpZ2dlciB0aGUgZXhlY3V0aW9uIG9mCiAgICAgICoge0BsaW5rICNvblByb2dyZXNzVXBkYXRlfSBvbiB0aGUgVUkgdGhyZWFkLgogICAgICAqCisgICAgICoge0BsaW5rICNvblByb2dyZXNzVXBkYXRlfSB3aWxsIG5vdGUgYmUgY2FsbGVkIGlmIHRoZSB0YXNrIGhhcyBiZWVuCisgICAgICogY2FuY2VsZWQuCisgICAgICoKICAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBwcm9ncmVzcyB2YWx1ZXMgdG8gdXBkYXRlIHRoZSBVSSB3aXRoLgogICAgICAqCiAgICAgICogQHNlZSAjb25Qcm9ncmVzc1VwZGF0ZQogICAgICAqIEBzZWUgI2RvSW5CYWNrZ3JvdW5kCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHVibGlzaFByb2dyZXNzKFByb2dyZXNzLi4uIHZhbHVlcykgewotICAgICAgICBzSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1FU1NBR0VfUE9TVF9QUk9HUkVTUywKLSAgICAgICAgICAgICAgICBuZXcgQXN5bmNUYXNrUmVzdWx0PFByb2dyZXNzPih0aGlzLCB2YWx1ZXMpKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgaWYgKCFpc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICBzSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1FU1NBR0VfUE9TVF9QUk9HUkVTUywKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFzeW5jVGFza1Jlc3VsdDxQcm9ncmVzcz4odGhpcywgdmFsdWVzKSkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZmluaXNoKFJlc3VsdCByZXN1bHQpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhCmluZGV4IDg5MjViZDAuLjkyNjhjZDEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YQpAQCAtMTk5LDYgKzE5OSwxOCBAQAogICAgICAgICAgKiA8L3VsPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0lOR0VSQlJFQUQgPSBDVVJfREVWRUxPUE1FTlQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5leHQgbmV4dCB2ZXJzaW9uIG9mIEFuZHJvaWQuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPkFwcGxpY2F0aW9ucyB0YXJnZXRpbmcgdGhpcyBvciBhIGxhdGVyIHJlbGVhc2Ugd2lsbCBnZXQgdGhlc2UKKyAgICAgICAgICogbmV3IGNoYW5nZXMgaW4gYmVoYXZpb3I6PC9wPgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT4gVGhlIGRlZmF1bHQgdGhlbWUgZm9yIGFwcGxpY2F0aW9ucyBpcyBub3cgZGFyayBob2xvZ3JhcGhpYzoKKyAgICAgICAgICogICAgICB7QGxpbmsgYW5kcm9pZC5SLnN0eWxlI1RoZW1lX0hvbG99LgorICAgICAgICAgKiA8L3VsPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9ORVlDT01CID0gQ1VSX0RFVkVMT1BNRU5UOwogICAgIH0KICAgICAKICAgICAvKiogVGhlIHR5cGUgb2YgYnVpbGQsIGxpa2UgInVzZXIiIG9yICJlbmciLiAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvRGVidWcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0RlYnVnLmphdmEKaW5kZXggODZmOWE2Yi4uYTU4ZTcwYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvRGVidWcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9EZWJ1Zy5qYXZhCkBAIC03MzEsNyArNzMxLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEdW1wICJocHJvZiIgZGF0YSB0byB0aGUgc3BlY2lmaWVkIGZpbGUuICBUaGlzIHdpbGwgY2F1c2UgYSBHQy4KKyAgICAgKiBEdW1wICJocHJvZiIgZGF0YSB0byB0aGUgc3BlY2lmaWVkIGZpbGUuICBUaGlzIG1heSBjYXVzZSBhIEdDLgogICAgICAqCiAgICAgICogQHBhcmFtIGZpbGVOYW1lIEZ1bGwgcGF0aG5hbWUgb2Ygb3V0cHV0IGZpbGUgKGUuZy4gIi9zZGNhcmQvZHVtcC5ocHJvZiIpLgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIFZNIHdhcyBidWlsdCB3aXRob3V0CkBAIC03NDMsMTEgKzc0MywyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbGxlY3QgImhwcm9mIiBhbmQgc2VuZCBpdCB0byBERE1TLiAgVGhpcyB3aWxsIGNhdXNlIGEgR0MuCisgICAgICogTGlrZSBkdW1wSHByb2ZEYXRhKFN0cmluZyksIGJ1dCB0YWtlcyBhbiBhbHJlYWR5LW9wZW5lZAorICAgICAqIEZpbGVEZXNjcmlwdG9yIHRvIHdoaWNoIHRoZSB0cmFjZSBpcyB3cml0dGVuLiAgVGhlIGZpbGUgbmFtZSBpcyBhbHNvCisgICAgICogc3VwcGxpZWQgc2ltcGx5IGZvciBsb2dnaW5nLiAgTWFrZXMgYSBkdXAgb2YgdGhlIGZpbGUgZGVzY3JpcHRvci4KKyAgICAgKgorICAgICAqIFByaW1hcmlseSBmb3IgdXNlIGJ5IHRoZSAiYW0iIHNoZWxsIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wSHByb2ZEYXRhKFN0cmluZyBmaWxlTmFtZSwgRmlsZURlc2NyaXB0b3IgZmQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBWTURlYnVnLmR1bXBIcHJvZkRhdGEoZmlsZU5hbWUsIGZkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2xsZWN0ICJocHJvZiIgYW5kIHNlbmQgaXQgdG8gRERNUy4gIFRoaXMgbWF5IGNhdXNlIGEgR0MuCiAgICAgICoKICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBWTSB3YXMgYnVpbHQgd2l0aG91dAogICAgICAqICAgICAgICAgSFBST0Ygc3VwcG9ydC4KLSAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGR1bXBIcHJvZkRhdGFEZG1zKCkgewpAQCAtNzU1LDYgKzc2OCwxMyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFdyaXRlcyBuYXRpdmUgaGVhcCBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgZmlsZSBkZXNjcmlwdG9yLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGR1bXBOYXRpdmVIZWFwKEZpbGVEZXNjcmlwdG9yIGZkKTsKKworICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzZW50IHRyYW5zYWN0aW9ucyBmcm9tIHRoaXMgcHJvY2Vzcy4KICAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2Ygc2VudCB0cmFuc2FjdGlvbnMgb3IgLTEgaWYgaXQgY291bGQgbm90IHJlYWQgdC4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0ZpbGVVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvRmlsZVV0aWxzLmphdmEKaW5kZXggYTE3YjdmZS4uNzJlMjFkZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvRmlsZVV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvRmlsZVV0aWxzLmphdmEKQEAgLTg1LDYgKzg1LDggQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRQZXJtaXNzaW9ucyhTdHJpbmcgZmlsZSwgaW50W10gb3V0UGVybWlzc2lvbnMpOwogCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHNldFVNYXNrKGludCBtYXNrKTsKKwogICAgIC8qKiByZXR1cm5zIHRoZSBGQVQgZmlsZSBzeXN0ZW0gdm9sdW1lIElEIGZvciB0aGUgdm9sdW1lIG1vdW50ZWQgCiAgICAgICogYXQgdGhlIGdpdmVuIG1vdW50IHBvaW50LCBvciAtMSBmb3IgZmFpbHVyZQogICAgICAqIEBwYXJhbSBtb3VudCBwb2ludCBmb3IgRkFUIHZvbHVtZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVtb3J5RmlsZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVtb3J5RmlsZS5qYXZhCmluZGV4IGE4MWUxNmIuLmY4MjcwMmEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL01lbW9yeUZpbGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZW1vcnlGaWxlLmphdmEKQEAgLTU4LDcgKzU4LDYgQEAKICAgICBwcml2YXRlIGludCBtQWRkcmVzczsgICAvLyBhZGRyZXNzIG9mIGFzaG1lbSBtZW1vcnkKICAgICBwcml2YXRlIGludCBtTGVuZ3RoOyAgICAvLyB0b3RhbCBsZW5ndGggb2Ygb3VyIGFzaG1lbSByZWdpb24KICAgICBwcml2YXRlIGJvb2xlYW4gbUFsbG93UHVyZ2luZyA9IGZhbHNlOyAgLy8gdHJ1ZSBpZiBvdXIgYXNobWVtIHJlZ2lvbiBpcyB1bnBpbm5lZAotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtT3duc1JlZ2lvbjsgIC8vIGZhbHNlIGlmIHRoaXMgaXMgYSByZWYgdG8gYW4gZXhpc3RpbmcgYXNobWVtIHJlZ2lvbgogCiAgICAgLyoqCiAgICAgICogQWxsb2NhdGVzIGEgbmV3IGFzaG1lbSByZWdpb24uIFRoZSByZWdpb24gaXMgaW5pdGlhbGx5IG5vdCBwdXJnYWJsZS4KQEAgLTcwLDM4ICs2OSwxMSBAQAogICAgIHB1YmxpYyBNZW1vcnlGaWxlKFN0cmluZyBuYW1lLCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBtTGVuZ3RoID0gbGVuZ3RoOwogICAgICAgICBtRkQgPSBuYXRpdmVfb3BlbihuYW1lLCBsZW5ndGgpOwotICAgICAgICBtQWRkcmVzcyA9IG5hdGl2ZV9tbWFwKG1GRCwgbGVuZ3RoLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKTsKLSAgICAgICAgbU93bnNSZWdpb24gPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSByZWZlcmVuY2UgdG8gYW4gZXhpc3RpbmcgbWVtb3J5IGZpbGUuIENoYW5nZXMgdG8gdGhlIG9yaWdpbmFsIGZpbGUKLSAgICAgKiB3aWxsIGJlIGF2YWlsYWJsZSB0aHJvdWdoIHRoaXMgcmVmZXJlbmNlLgotICAgICAqIENhbGxzIHRvIHtAbGluayAjYWxsb3dQdXJnaW5nKGJvb2xlYW4pfSBvbiB0aGUgcmV0dXJuZWQgTWVtb3J5RmlsZSB3aWxsIGZhaWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmQgRmlsZSBkZXNjcmlwdG9yIGZvciBhbiBleGlzdGluZyBtZW1vcnkgZmlsZSwgYXMgcmV0dXJuZWQgYnkKLSAgICAgKiAgICAgICAge0BsaW5rICNnZXRGaWxlRGVzY3JpcHRvcigpfS4gVGhpcyBmaWxlIGRlc2NyaXB0b3Igd2lsbCBiZSBjbG9zZWQKLSAgICAgKiAgICAgICAgYnkge0BsaW5rICNjbG9zZSgpfS4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIExlbmd0aCBvZiB0aGUgbWVtb3J5IGZpbGUgaW4gYnl0ZXMuCi0gICAgICogQHBhcmFtIG1vZGUgRmlsZSBtb2RlLiBDdXJyZW50bHkgb25seSAiciIgZm9yIHJlYWQtb25seSBhY2Nlc3MgaXMgc3VwcG9ydGVkLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+ZmQ8L2NvZGU+IGlzIG51bGwuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiA8Y29kZT5mZDwvY29kZT4gZG9lcyBub3QgcmVmZXIgdG8gYW4gZXhpc3RpbmcgbWVtb3J5IGZpbGUsCi0gICAgICogICAgICAgICBvciBpZiB0aGUgZmlsZSBtb2RlIG9mIHRoZSBleGlzdGluZyBtZW1vcnkgZmlsZSBpcyBtb3JlIHJlc3RyaWN0aXZlCi0gICAgICogICAgICAgICB0aGFuIDxjb2RlPm1vZGU8L2NvZGU+LgotICAgICAqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVtb3J5RmlsZShGaWxlRGVzY3JpcHRvciBmZCwgaW50IGxlbmd0aCwgU3RyaW5nIG1vZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChmZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkZpbGUgZGVzY3JpcHRvciBpcyBudWxsLiIpOworICAgICAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICAgICAgbUFkZHJlc3MgPSBuYXRpdmVfbW1hcChtRkQsIGxlbmd0aCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQWRkcmVzcyA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFpc01lbW9yeUZpbGUoZmQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgYSBtZW1vcnkgZmlsZS4iKTsKLSAgICAgICAgfQotICAgICAgICBtTGVuZ3RoID0gbGVuZ3RoOwotICAgICAgICBtRkQgPSBmZDsKLSAgICAgICAgbUFkZHJlc3MgPSBuYXRpdmVfbW1hcChtRkQsIGxlbmd0aCwgbW9kZVRvUHJvdChtb2RlKSk7Ci0gICAgICAgIG1Pd25zUmVnaW9uID0gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjIsNyArOTQsNyBAQAogICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgeworICAgIHZvaWQgZGVhY3RpdmF0ZSgpIHsKICAgICAgICAgaWYgKCFpc0RlYWN0aXZhdGVkKCkpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbmF0aXZlX211bm1hcChtQWRkcmVzcywgbUxlbmd0aCk7CkBAIC0xODEsOSArMTUzLDYgQEAKICAgICAgKiBAcmV0dXJuIHByZXZpb3VzIHZhbHVlIG9mIGFsbG93UHVyZ2luZwogICAgICAqLwogICAgIHN5bmNocm9uaXplZCBwdWJsaWMgYm9vbGVhbiBhbGxvd1B1cmdpbmcoYm9vbGVhbiBhbGxvd1B1cmdpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghbU93bnNSZWdpb24pIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiT25seSB0aGUgb3duZXIgY2FuIG1ha2UgYXNobWVtIHJlZ2lvbnMgcHVyZ2FibGUuIik7Ci0gICAgICAgIH0KICAgICAgICAgYm9vbGVhbiBvbGRWYWx1ZSA9IG1BbGxvd1B1cmdpbmc7CiAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBhbGxvd1B1cmdpbmcpIHsKICAgICAgICAgICAgIG5hdGl2ZV9waW4obUZELCAhYWxsb3dQdXJnaW5nKTsKQEAgLTI2MCwyOCArMjI5LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgUGFyY2VsRmlsZURlc2NyaXB0b3IgZm9yIHRoZSBtZW1vcnkgZmlsZS4gU2VlIHtAbGluayAjZ2V0RmlsZURlc2NyaXB0b3IoKX0KLSAgICAgKiBmb3IgY2F2ZWF0cy4gVGhpcyBtdXN0IGJlIGhlcmUgdG8gYWxsb3cgY2xhc3NlcyBvdXRzaWRlIDxjb2RlPmFuZHJvaWQub3M8L2NvZGU8IHRvCi0gICAgICogbWFrZSBQYXJjZWxGaWxlRGVzY3JpcHRvcnMgZnJvbSBNZW1vcnlGaWxlcywgYXMKLSAgICAgKiB7QGxpbmsgUGFyY2VsRmlsZURlc2NyaXB0b3IjUGFyY2VsRmlsZURlc2NyaXB0b3IoRmlsZURlc2NyaXB0b3IpfSBpcyBwYWNrYWdlIHByaXZhdGUuCi0gICAgICoKLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGZpbGUgZGVzY3JpcHRvciBvd25lZCBieSB0aGlzIG1lbW9yeSBmaWxlIG9iamVjdC4KLSAgICAgKiAgICAgICAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgbm90IGR1cGxpY2F0ZWQuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiB0aGUgbWVtb3J5IGZpbGUgaGFzIGJlZW4gY2xvc2VkLgotICAgICAqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyY2VsRmlsZURlc2NyaXB0b3IgZ2V0UGFyY2VsRmlsZURlc2NyaXB0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlRGVzY3JpcHRvciBmZCA9IGdldEZpbGVEZXNjcmlwdG9yKCk7Ci0gICAgICAgIHJldHVybiBmZCAhPSBudWxsID8gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yKGZkKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIEZpbGVEZXNjcmlwdG9yIGZvciB0aGUgbWVtb3J5IGZpbGUuIE5vdGUgdGhhdCB0aGlzIGZpbGUgZGVzY3JpcHRvcgotICAgICAqIGlzIG9ubHkgc2FmZSB0byBwYXNzIHRvIHtAbGluayAjTWVtb3J5RmlsZShGaWxlRGVzY3JpcHRvcixpbnQpfSkuIEl0Ci0gICAgICogc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggZmlsZSBkZXNjcmlwdG9yIG9wZXJhdGlvbnMgdGhhdCBleHBlY3QgYSBmaWxlIGRlc2NyaXB0b3IKLSAgICAgKiBmb3IgYSBub3JtYWwgZmlsZS4KKyAgICAgKiBHZXRzIGEgRmlsZURlc2NyaXB0b3IgZm9yIHRoZSBtZW1vcnkgZmlsZS4KICAgICAgKgogICAgICAqIFRoZSByZXR1cm5lZCBmaWxlIGRlc2NyaXB0b3IgaXMgbm90IGR1cGxpY2F0ZWQuCiAgICAgICoKQEAgLTI5NCwxNyArMjQyLDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yIHJlZmVycyB0byBhIG1lbW9yeSBmaWxlLgotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiA8Y29kZT5mZDwvY29kZT4gaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLgotICAgICAqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZW1vcnlGaWxlKEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKG5hdGl2ZV9nZXRfc2l6ZShmZCkgPj0gMCk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGZpbGUgdGhhdCB0aGUgZmlsZSBkZXNjcmlwdG9yIHJlZmVycyB0bywKICAgICAgKiBvciAtMSBpZiB0aGUgZmlsZSBkZXNjcmlwdG9yIGRvZXMgbm90IHJlZmVyIHRvIGEgbWVtb3J5IGZpbGUuCiAgICAgICoKQEAgLTMxNiwyMCArMjUzLDYgQEAKICAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRfc2l6ZShmZCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBmaWxlIG1vZGUgc3RyaW5nIHRvIGEgPGNvZGU+cHJvdDwvY29kZT4gdmFsdWUgYXMgZXhwZWN0ZWQgYnkKLSAgICAgKiBuYXRpdmVfbW1hcCgpLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGZpbGUgbW9kZSBpcyBpbnZhbGlkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBtb2RlVG9Qcm90KFN0cmluZyBtb2RlKSB7Ci0gICAgICAgIGlmICgiciIuZXF1YWxzKG1vZGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gUFJPVF9SRUFEOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgZmlsZSBtb2RlOiAnIiArIG1vZGUgKyAiJyIpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBjbGFzcyBNZW1vcnlJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKIAogICAgICAgICBwcml2YXRlIGludCBtTWFyayA9IDA7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZXNzYWdlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZXNzYWdlLmphdmEKaW5kZXggNDliNzJmZS4uZWI5NDFlNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2UuamF2YQpAQCAtNzMsNyArNzMsMTggQEAKICAgICAgKiByZWNlaXZlci4KICAgICAgKi8KICAgICBwdWJsaWMgTWVzc2VuZ2VyIHJlcGx5VG87Ci0gICAgCisKKyAgICAvKiogSWYgc2V0IG1lc3NhZ2UgaXMgaW4gdXNlICovCisgICAgLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIGludCBGTEFHX0lOX1VTRSA9IDE7CisKKyAgICAvKiogRmxhZ3MgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKEFsbCBhcmUgcmVzZXJ2ZWQgZm9yIG5vdykgKi8KKyAgICAvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgaW50IEZMQUdTX1JFU0VSVkVEID0gfkZMQUdfSU5fVVNFOworCisgICAgLyoqIEZsYWdzIHRvIGNsZWFyIGluIHRoZSBjb3B5RnJvbSBtZXRob2QgKi8KKyAgICAvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgaW50IEZMQUdTX1RPX0NMRUFSX09OX0NPUFlfRlJPTSA9IEZMQUdTX1JFU0VSVkVEIHwgRkxBR19JTl9VU0U7CisKKyAgICAvKnBhY2thZ2UqLyBpbnQgZmxhZ3M7CisKICAgICAvKnBhY2thZ2UqLyBsb25nIHdoZW47CiAgICAgCiAgICAgLypwYWNrYWdlKi8gQnVuZGxlIGRhdGE7CkBAIC0yNTMsNiArMjY0LDcgQEAKICAgICAgKiB0YXJnZXQvY2FsbGJhY2sgb2YgdGhlIG9yaWdpbmFsIG1lc3NhZ2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY29weUZyb20oTWVzc2FnZSBvKSB7CisgICAgICAgIHRoaXMuZmxhZ3MgPSBvLmZsYWdzICYgfkZMQUdTX1RPX0NMRUFSX09OX0NPUFlfRlJPTTsKICAgICAgICAgdGhpcy53aGF0ID0gby53aGF0OwogICAgICAgICB0aGlzLmFyZzEgPSBvLmFyZzE7CiAgICAgICAgIHRoaXMuYXJnMiA9IG8uYXJnMjsKQEAgLTM1MCw2ICszNjIsNyBAQAogICAgIH0KIAogICAgIC8qcGFja2FnZSovIHZvaWQgY2xlYXJGb3JSZWN5Y2xlKCkgeworICAgICAgICBmbGFncyA9IDA7CiAgICAgICAgIHdoYXQgPSAwOwogICAgICAgICBhcmcxID0gMDsKICAgICAgICAgYXJnMiA9IDA7CkBAIC0zNjEsNiArMzc0LDE0IEBACiAgICAgICAgIGRhdGEgPSBudWxsOwogICAgIH0KIAorICAgIC8qcGFja2FnZSovIGJvb2xlYW4gaXNJblVzZSgpIHsKKyAgICAgICAgcmV0dXJuICgoZmxhZ3MgJiBGTEFHX0lOX1VTRSkgPT0gRkxBR19JTl9VU0UpOworICAgIH0KKworICAgIC8qcGFja2FnZSovIHZvaWQgbWFya0luVXNlKCkgeworICAgICAgICBmbGFncyB8PSBGTEFHX0lOX1VTRTsKKyAgICB9CisKICAgICAvKiogQ29uc3RydWN0b3IgKGJ1dCB0aGUgcHJlZmVycmVkIHdheSB0byBnZXQgYSBNZXNzYWdlIGlzIHRvIGNhbGwge0BsaW5rICNvYnRhaW4oKSBNZXNzYWdlLm9idGFpbigpfSkuCiAgICAgKi8KICAgICBwdWJsaWMgTWVzc2FnZSgpIHsKQEAgLTQ1Myw0ICs0NzQsMyBAQAogICAgICAgICByZXBseVRvID0gTWVzc2VuZ2VyLnJlYWRNZXNzZW5nZXJPck51bGxGcm9tUGFyY2VsKHNvdXJjZSk7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZXNzYWdlUXVldWUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZS5qYXZhCmluZGV4IGFkYjExYzguLjc1ZGZkZDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZS5qYXZhCkBAIC0xMjAsNiArMTIwLDcgQEAKICAgICAgICAgICAgICAgICBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IHB1bGxOZXh0TG9ja2VkKG5vdyk7CiAgICAgICAgICAgICAgICAgaWYgKG1zZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy5tYXJrSW5Vc2UoKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgCkBAIC0xOTIsNyArMTkzLDcgQEAKICAgICB9CiAKICAgICBmaW5hbCBib29sZWFuIGVucXVldWVNZXNzYWdlKE1lc3NhZ2UgbXNnLCBsb25nIHdoZW4pIHsKLSAgICAgICAgaWYgKG1zZy53aGVuICE9IDApIHsKKyAgICAgICAgaWYgKG1zZy5pc0luVXNlKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBBbmRyb2lkUnVudGltZUV4Y2VwdGlvbihtc2cKICAgICAgICAgICAgICAgICAgICAgKyAiIFRoaXMgbWVzc2FnZSBpcyBhbHJlYWR5IGluIHVzZS4iKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL1BhcmNlbEZpbGVEZXNjcmlwdG9yLmphdmEKaW5kZXggOWQyMTNiMy4uYzFhMTgwOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvci5qYXZhCkBAIC0xMzQsNiArMTM0LDQ1IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIEZpbGVEZXNjcmlwdG9yIGdldEZpbGVEZXNjcmlwdG9yRnJvbVNvY2tldChTb2NrZXQgc29ja2V0KTsKIAogICAgIC8qKgorICAgICAqIENyZWF0ZSB0d28gUGFyY2VsRmlsZURlc2NyaXB0b3JzIHN0cnVjdHVyZWQgYXMgYSBkYXRhIHBpcGUuICBUaGUgZmlyc3QKKyAgICAgKiBQYXJjZWxGaWxlRGVzY3JpcHRvciBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgaXMgdGhlIHJlYWQgc2lkZTsgdGhlIHNlY29uZAorICAgICAqIGlzIHRoZSB3cml0ZSBzaWRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBjcmVhdGVQaXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZURlc2NyaXB0b3JbXSBmZHMgPSBuZXcgRmlsZURlc2NyaXB0b3JbMl07CisgICAgICAgIGludCByZXMgPSBjcmVhdGVQaXBlTmF0aXZlKGZkcyk7CisgICAgICAgIGlmIChyZXMgPT0gMCkgeworICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBwZmRzID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yWzJdOworICAgICAgICAgICAgcGZkc1swXSA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvcihmZHNbMF0pOworICAgICAgICAgICAgcGZkc1sxXSA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvcihmZHNbMV0pOworICAgICAgICAgICAgcmV0dXJuIHBmZHM7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIHBpcGU6IGVycm5vPSIgKyAtcmVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGNyZWF0ZVBpcGVOYXRpdmUoRmlsZURlc2NyaXB0b3JbXSBvdXRGZHMpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIGZpbGUgZGVzY3JpcHRvciBmb3IgYSByZWFkLW9ubHkgY29weSBvZiB0aGUgZ2l2ZW4gZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIERhdGEgdG8gY29weS4KKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIGZvciB0aGUgc2hhcmVkIG1lbW9yeSBhcmVhIHRoYXQgbWF5IGJhY2sgdGhlIGZpbGUgZGVzY3JpcHRvci4KKyAgICAgKiAgICAgICAgVGhpcyBpcyBwdXJlbHkgaW5mb3JtYXRpdmUgYW5kIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHJldHVybiBBIFBhcmNlbEZpbGVEZXNjcmlwdG9yLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIHNoYXJlZCBtZW1vcnkgYXJlYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZyb21EYXRhKGJ5dGVbXSBkYXRhLCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IG5ldyBNZW1vcnlGaWxlKG5hbWUsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgZmlsZS53cml0ZUJ5dGVzKGRhdGEsIDAsIDAsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBmaWxlLmRlYWN0aXZhdGUoKTsKKyAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQgPSBmaWxlLmdldEZpbGVEZXNjcmlwdG9yKCk7CisgICAgICAgIHJldHVybiBmZCAhPSBudWxsID8gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yKGZkKSA6IG51bGw7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIGFjdHVhbCBGaWxlRGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuCiAgICAgICogCiAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBGaWxlRGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VFdmVudExpc3RlbmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VFdmVudExpc3RlbmVyLmphdmEKaW5kZXggN2I4ODNhNy4uZDNkMzlkNmQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZUV2ZW50TGlzdGVuZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VFdmVudExpc3RlbmVyLmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIAogLyoqCiAgKiBVc2VkIGZvciByZWNlaXZpbmcgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBTdG9yYWdlTWFuYWdlcgotICogQGhpZGUKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFN0b3JhZ2VFdmVudExpc3RlbmVyIHsKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQppbmRleCBkZjBiNjljLi40YTAyOTZiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiAgKiBHZXQgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBieSBjYWxsaW5nCiAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjZ2V0U3lzdGVtU2VydmljZShqYXZhLmxhbmcuU3RyaW5nKX0gd2l0aCBhbiBhcmd1bWVudAogICogb2Yge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I1NUT1JBR0VfU0VSVklDRX0uCisgKgogICovCiAKIHB1YmxpYyBjbGFzcyBTdG9yYWdlTWFuYWdlcgpAQCAtMjAzLDcgKzIwNCw2IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gbGlzdGVuZXIgQSB7QGxpbmsgYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VFdmVudExpc3RlbmVyIFN0b3JhZ2VFdmVudExpc3RlbmVyfSBvYmplY3QuCiAgICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoU3RvcmFnZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHsKQEAgLTIyMCw3ICsyMjAsNiBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGxpc3RlbmVyIEEge0BsaW5rIGFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlRXZlbnRMaXN0ZW5lciBTdG9yYWdlRXZlbnRMaXN0ZW5lcn0gb2JqZWN0LgogICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoU3RvcmFnZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHsKQEAgLTI0MSw4ICsyNDAsNiBAQAogCiAgICAgLyoqCiAgICAgICogRW5hYmxlcyBVU0IgTWFzcyBTdG9yYWdlIChVTVMpIG9uIHRoZSBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGVuYWJsZVVzYk1hc3NTdG9yYWdlKCkgewogICAgICAgICB0cnkgewpAQCAtMjU0LDggKzI1MSw2IEBACiAKICAgICAvKioKICAgICAgKiBEaXNhYmxlcyBVU0IgTWFzcyBTdG9yYWdlIChVTVMpIG9uIHRoZSBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRpc2FibGVVc2JNYXNzU3RvcmFnZSgpIHsKICAgICAgICAgdHJ5IHsKQEAgLTI2OCw4ICsyNjMsNiBAQAogICAgIC8qKgogICAgICAqIFF1ZXJ5IGlmIGEgVVNCIE1hc3MgU3RvcmFnZSAoVU1TKSBob3N0IGlzIGNvbm5lY3RlZC4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgVU1TIGhvc3QgaXMgY29ubmVjdGVkLgotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1VzYk1hc3NTdG9yYWdlQ29ubmVjdGVkKCkgewogICAgICAgICB0cnkgewpAQCAtMjgzLDggKzI3Niw2IEBACiAgICAgLyoqCiAgICAgICogUXVlcnkgaWYgYSBVU0IgTWFzcyBTdG9yYWdlIChVTVMpIGlzIGVuYWJsZWQgb24gdGhlIGRldmljZS4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgVU1TIGhvc3QgaXMgZW5hYmxlZC4KLSAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNVc2JNYXNzU3RvcmFnZUVuYWJsZWQoKSB7CiAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VSZXN1bHRDb2RlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VSZXN1bHRDb2RlLmphdmEKaW5kZXggMDc1ZjQ3Zi4uMDdkOTVkZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlUmVzdWx0Q29kZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZVJlc3VsdENvZGUuamF2YQpAQCAtMTksOCArMTksNiBAQAogLyoqCiAgKiBDbGFzcyB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBjb25zdGFudHMgcmV0dXJuZWQgZnJvbSBTdG9yYWdlTWFuYWdlcgogICogYW5kIGxvd2VyIGxldmVsIE1vdW50U2VydmljZSBBUElzLgotICoKLSAqIEBoaWRlCiAgKi8KIHB1YmxpYyBjbGFzcyBTdG9yYWdlUmVzdWx0Q29kZQogewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL1JlY3VycmVuY2VTZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS9SZWN1cnJlbmNlU2V0LmphdmEKaW5kZXggNjM1MzIzZS4uMjgyNDE3ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL1JlY3VycmVuY2VTZXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vUmVjdXJyZW5jZVNldC5qYXZhCkBAIC0xODEsNyArMTgxLDkgQEAKICAgICAgICAgYm9vbGVhbiBpblV0YyA9IHN0YXJ0LnBhcnNlKGR0c3RhcnQpOwogICAgICAgICBib29sZWFuIGFsbERheSA9IHN0YXJ0LmFsbERheTsKIAotICAgICAgICBpZiAoaW5VdGMpIHsKKyAgICAgICAgLy8gV2UgZm9yY2UgVGltZVpvbmUgdG8gVVRDIGZvciAiYWxsIGRheSByZWN1cnJpbmcgZXZlbnRzIiBhcyB0aGUgc2VydmVyIGlzIHNlbmRpbmcgbm8KKyAgICAgICAgLy8gVGltZVpvbmUgaW4gRFRTVEFSVCBmb3IgdGhlbQorICAgICAgICBpZiAoaW5VdGMgfHwgYWxsRGF5KSB7CiAgICAgICAgICAgICB0emlkID0gVGltZS5USU1FWk9ORV9VVEM7CiAgICAgICAgIH0KICAgICAgICAgICAgICAgICAKQEAgLTIwNCwxMCArMjA2LDcgQEAKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgaWYgKGFsbERheSkgewotICAgICAgICAJLy8gVE9ETzogYWxzbyBjaGFuZ2UgdHppZCB0byBiZSBVVEM/ICB0aGF0IHdvdWxkIGJlIGNvbnNpc3RlbnQsIGJ1dAotICAgICAgICAJLy8gdGhhdCB3b3VsZCBub3QgcmVmbGVjdCB0aGUgb3JpZ2luYWwgdGltZXpvbmUgdmFsdWUgYmFjayB0byB0aGUKLSAgICAgICAgCS8vIHNlcnZlci4KLSAgICAgICAgCXN0YXJ0LnRpbWV6b25lID0gVGltZS5USU1FWk9ORV9VVEM7CisgICAgICAgICAgICBzdGFydC50aW1lem9uZSA9IFRpbWUuVElNRVpPTkVfVVRDOwogICAgICAgICB9CiAgICAgICAgIGxvbmcgbWlsbGlzID0gc3RhcnQudG9NaWxsaXMoZmFsc2UgLyogdXNlIGlzRHN0ICovKTsKICAgICAgICAgdmFsdWVzLnB1dChDYWxlbmRhci5FdmVudHMuRFRTVEFSVCwgbWlsbGlzKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9KYXBhbmVzZVV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvSmFwYW5lc2VVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzVjMjllLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9KYXBhbmVzZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRleHRVdGlscyBlc3BlY2lhbGx5IGZvciBKYXBhbmVzZS4KLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBKYXBhbmVzZVV0aWxzIHsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBNYXA8Q2hhcmFjdGVyLCBTdHJpbmc+IHNIYWxmV2lkdGhNYXAgPQotICAgICAgICBuZXcgSGFzaE1hcDxDaGFyYWN0ZXIsIFN0cmluZz4oKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIFRoZXJlJ3Mgbm8gbG9naWNhbCBtYXBwaW5nIHJ1bGUgaW4gVW5pY29kZS4gU2lnaC4KLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzAwMScsICJcdUZGNjQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzAwMicsICJcdUZGNjEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzAwQycsICJcdUZGNjIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzAwRCcsICJcdUZGNjMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzAxQycsICJ+Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNDEnLCAiXHVGRjY3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNDInLCAiXHVGRjcxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNDMnLCAiXHVGRjY4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNDQnLCAiXHVGRjcyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNDUnLCAiXHVGRjY5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNDYnLCAiXHVGRjczIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNDcnLCAiXHVGRjZBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNDgnLCAiXHVGRjc0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNDknLCAiXHVGRjZCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNEEnLCAiXHVGRjc1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNEInLCAiXHVGRjc2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNEMnLCAiXHVGRjc2XHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNEQnLCAiXHVGRjc3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNEUnLCAiXHVGRjc3XHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNEYnLCAiXHVGRjc4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNTAnLCAiXHVGRjc4XHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNTEnLCAiXHVGRjc5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNTInLCAiXHVGRjc5XHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNTMnLCAiXHVGRjdBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNTQnLCAiXHVGRjdBXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNTUnLCAiXHVGRjdCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNTYnLCAiXHVGRjdCXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNTcnLCAiXHVGRjdDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNTgnLCAiXHVGRjdDXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNTknLCAiXHVGRjdEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNUEnLCAiXHVGRjdEXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNUInLCAiXHVGRjdFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNUMnLCAiXHVGRjdFXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNUQnLCAiXHVGRjdGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNUUnLCAiXHVGRjdGXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNUYnLCAiXHVGRjgwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNjAnLCAiXHVGRjgwXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNjEnLCAiXHVGRjgxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNjInLCAiXHVGRjgxXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNjMnLCAiXHVGRjZGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNjQnLCAiXHVGRjgyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNjUnLCAiXHVGRjgyXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNjYnLCAiXHVGRjgzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNjcnLCAiXHVGRjgzXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNjgnLCAiXHVGRjg0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNjknLCAiXHVGRjg0XHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNkEnLCAiXHVGRjg1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNkInLCAiXHVGRjg2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNkMnLCAiXHVGRjg3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNkQnLCAiXHVGRjg4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNkUnLCAiXHVGRjg5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNkYnLCAiXHVGRjhBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNzAnLCAiXHVGRjhBXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNzEnLCAiXHVGRjhBXHVGRjlGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNzInLCAiXHVGRjhCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNzMnLCAiXHVGRjhCXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNzQnLCAiXHVGRjhCXHVGRjlGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNzUnLCAiXHVGRjhDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNzYnLCAiXHVGRjhDXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNzcnLCAiXHVGRjhDXHVGRjlGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNzgnLCAiXHVGRjhEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwNzknLCAiXHVGRjhEXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwN0EnLCAiXHVGRjhEXHVGRjlGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwN0InLCAiXHVGRjhFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwN0MnLCAiXHVGRjhFXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwN0QnLCAiXHVGRjhFXHVGRjlGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwN0UnLCAiXHVGRjhGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwN0YnLCAiXHVGRjkwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwODAnLCAiXHVGRjkxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwODEnLCAiXHVGRjkyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwODInLCAiXHVGRjkzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwODMnLCAiXHVGRjZDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwODQnLCAiXHVGRjk0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwODUnLCAiXHVGRjZEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwODYnLCAiXHVGRjk1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwODcnLCAiXHVGRjZFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwODgnLCAiXHVGRjk2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwODknLCAiXHVGRjk3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwOEEnLCAiXHVGRjk4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwOEInLCAiXHVGRjk5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwOEMnLCAiXHVGRjlBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwOEQnLCAiXHVGRjlCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwOEUnLCAiXHVGRjlDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwOEYnLCAiXHVGRjlDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwOTAnLCAiXHVGRjcyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwOTEnLCAiXHVGRjc0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwOTInLCAiXHVGRjY2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwOTMnLCAiXHVGRjlEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwOUInLCAiXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwOUMnLCAiXHVGRjlGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQTEnLCAiXHVGRjY3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQTInLCAiXHVGRjcxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQTMnLCAiXHVGRjY4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQTQnLCAiXHVGRjcyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQTUnLCAiXHVGRjY5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQTYnLCAiXHVGRjczIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQTcnLCAiXHVGRjZBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQTgnLCAiXHVGRjc0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQTknLCAiXHVGRjZCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQUEnLCAiXHVGRjc1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQUInLCAiXHVGRjc2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQUMnLCAiXHVGRjc2XHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQUQnLCAiXHVGRjc3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQUUnLCAiXHVGRjc3XHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQUYnLCAiXHVGRjc4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQjAnLCAiXHVGRjc4XHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQjEnLCAiXHVGRjc5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQjInLCAiXHVGRjc5XHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQjMnLCAiXHVGRjdBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQjQnLCAiXHVGRjdBXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQjUnLCAiXHVGRjdCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQjYnLCAiXHVGRjdCXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQjcnLCAiXHVGRjdDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQjgnLCAiXHVGRjdDXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQjknLCAiXHVGRjdEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQkEnLCAiXHVGRjdEXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQkInLCAiXHVGRjdFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQkMnLCAiXHVGRjdFXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQkQnLCAiXHVGRjdGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQkUnLCAiXHVGRjdGXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQkYnLCAiXHVGRjgwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQzAnLCAiXHVGRjgwXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQzEnLCAiXHVGRjgxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQzInLCAiXHVGRjgxXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQzMnLCAiXHVGRjZGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQzQnLCAiXHVGRjgyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQzUnLCAiXHVGRjgyXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQzYnLCAiXHVGRjgzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQzcnLCAiXHVGRjgzXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQzgnLCAiXHVGRjg0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQzknLCAiXHVGRjg0XHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQ0EnLCAiXHVGRjg1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQ0InLCAiXHVGRjg2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQ0MnLCAiXHVGRjg3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQ0QnLCAiXHVGRjg4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQ0UnLCAiXHVGRjg5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwQ0YnLCAiXHVGRjhBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRDAnLCAiXHVGRjhBXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRDEnLCAiXHVGRjhBXHVGRjlGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRDInLCAiXHVGRjhCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRDMnLCAiXHVGRjhCXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRDQnLCAiXHVGRjhCXHVGRjlGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRDUnLCAiXHVGRjhDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRDYnLCAiXHVGRjhDXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRDcnLCAiXHVGRjhDXHVGRjlGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRDgnLCAiXHVGRjhEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRDknLCAiXHVGRjhEXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwREEnLCAiXHVGRjhEXHVGRjlGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwREInLCAiXHVGRjhFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwREMnLCAiXHVGRjhFXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwREQnLCAiXHVGRjhFXHVGRjlGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwREUnLCAiXHVGRjhGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwREYnLCAiXHVGRjkwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRTAnLCAiXHVGRjkxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRTEnLCAiXHVGRjkyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRTInLCAiXHVGRjkzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRTMnLCAiXHVGRjZDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRTQnLCAiXHVGRjk0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRTUnLCAiXHVGRjZEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRTYnLCAiXHVGRjk1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRTcnLCAiXHVGRjZFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRTgnLCAiXHVGRjk2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRTknLCAiXHVGRjk3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRUEnLCAiXHVGRjk4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRUInLCAiXHVGRjk5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRUMnLCAiXHVGRjlBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRUQnLCAiXHVGRjlCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRUUnLCAiXHVGRjlDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRUYnLCAiXHVGRjlDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRjAnLCAiXHVGRjcyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRjEnLCAiXHVGRjc0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRjInLCAiXHVGRjY2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRjMnLCAiXHVGRjlEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRjQnLCAiXHVGRjczXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRjUnLCAiXHVGRjc2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRjYnLCAiXHVGRjc5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRkInLCAiXHVGRjY1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwRkMnLCAiXHVGRjcwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDEnLCAiISIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjAyJywgIlwiIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDMnLCAiIyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjA0JywgIiQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwNScsICIlIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDYnLCAiJiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjA3JywgIiciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwOCcsICIoIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDknLCAiKSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjBBJywgIioiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwQicsICIrIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMEMnLCAiLCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjBEJywgIi0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwRScsICIuIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMEYnLCAiLyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjEwJywgIjAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxMScsICIxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTInLCAiMiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjEzJywgIjMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxNCcsICI0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTUnLCAiNSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjE2JywgIjYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxNycsICI3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTgnLCAiOCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjE5JywgIjkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxQScsICI6Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMUInLCAiOyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjFDJywgIjwiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxRCcsICI9Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMUUnLCAiPiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjFGJywgIj8iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyMCcsICJAIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjEnLCAiQSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjIyJywgIkIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyMycsICJDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjQnLCAiRCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjI1JywgIkUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyNicsICJGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjcnLCAiRyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjI4JywgIkgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyOScsICJJIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMkEnLCAiSiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjJCJywgIksiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyQycsICJMIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMkQnLCAiTSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjJFJywgIk4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyRicsICJPIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzAnLCAiUCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjMxJywgIlEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzMicsICJSIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzMnLCAiUyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjM0JywgIlQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzNScsICJVIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzYnLCAiViIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjM3JywgIlciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzOCcsICJYIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzknLCAiWSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjNBJywgIloiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzQicsICJbIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGM0MnLCAiXFwiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzRCcsICJdIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGM0UnLCAiXiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjNGJywgIl8iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0MScsICJhIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDInLCAiYiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQzJywgImMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0NCcsICJkIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDUnLCAiZSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQ2JywgImYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0NycsICJnIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDgnLCAiaCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQ5JywgImkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0QScsICJqIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNEInLCAiayIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjRDJywgImwiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0RCcsICJtIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNEUnLCAibiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjRGJywgIm8iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1MCcsICJwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTEnLCAicSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjUyJywgInIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1MycsICJzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTQnLCAidCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjU1JywgInUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1NicsICJ2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTcnLCAidyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjU4JywgIngiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1OScsICJ5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNUEnLCAieiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjVCJywgInsiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1QycsICJ8Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNUQnLCAifSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjVFJywgIn4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY2MScsICJcdUZGNjEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY2MicsICJcdUZGNjIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY2MycsICJcdUZGNjMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY2NCcsICJcdUZGNjQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY2NScsICJcdUZGNjUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY2NicsICJcdUZGNjYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY2NycsICJcdUZGNjciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY2OCcsICJcdUZGNjgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY2OScsICJcdUZGNjkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY2QScsICJcdUZGNkEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY2QicsICJcdUZGNkIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY2QycsICJcdUZGNkMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY2RCcsICJcdUZGNkQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY2RScsICJcdUZGNkUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY2RicsICJcdUZGNkYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY3MCcsICJcdUZGNzAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY3MScsICJcdUZGNzEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY3MicsICJcdUZGNzIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY3MycsICJcdUZGNzMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY3NCcsICJcdUZGNzQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY3NScsICJcdUZGNzUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY3NicsICJcdUZGNzYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY3NycsICJcdUZGNzciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY3OCcsICJcdUZGNzgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY3OScsICJcdUZGNzkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY3QScsICJcdUZGN0EiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY3QicsICJcdUZGN0IiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY3QycsICJcdUZGN0MiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY3RCcsICJcdUZGN0QiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY3RScsICJcdUZGN0UiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY3RicsICJcdUZGN0YiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY4MCcsICJcdUZGODAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY4MScsICJcdUZGODEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY4MicsICJcdUZGODIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY4MycsICJcdUZGODMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY4NCcsICJcdUZGODQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY4NScsICJcdUZGODUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY4NicsICJcdUZGODYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY4NycsICJcdUZGODciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY4OCcsICJcdUZGODgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY4OScsICJcdUZGODkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY4QScsICJcdUZGOEEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY4QicsICJcdUZGOEIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY4QycsICJcdUZGOEMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY4RCcsICJcdUZGOEQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY4RScsICJcdUZGOEUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY4RicsICJcdUZGOEYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY5MCcsICJcdUZGOTAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY5MScsICJcdUZGOTEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY5MicsICJcdUZGOTIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY5MycsICJcdUZGOTMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY5NCcsICJcdUZGOTQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY5NScsICJcdUZGOTUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY5NicsICJcdUZGOTYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY5NycsICJcdUZGOTciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY5OCcsICJcdUZGOTgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY5OScsICJcdUZGOTkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY5QScsICJcdUZGOUEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY5QicsICJcdUZGOUIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY5QycsICJcdUZGOUMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY5RCcsICJcdUZGOUQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY5RScsICJcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY5RicsICJcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkZFNScsICJcdTAwNUNcdTAwNUMiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gaGFsZi13aWR0aCB2ZXJzaW9uIG9mIHRoYXQgY2hhcmFjdGVyIGlmIHBvc3NpYmxlLiBSZXR1cm4gbnVsbCBpZiBub3QgcG9zc2libGUKLSAgICAgKiBAcGFyYW0gY2ggaW5wdXQgY2hhcmFjdGVyCi0gICAgICogQHJldHVybiBDaGFyU2VxdWVuY2Ugb2JqZWN0IGlmIHRoZSBtYXBwaW5nIGZvciBjaCBleGlzdHMuIFJldHVybiBudWxsIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0cnlHZXRIYWxmV2lkdGhUZXh0KGNoYXIgY2gpIHsKLSAgICAgICAgaWYgKHNIYWxmV2lkdGhNYXAuY29udGFpbnNLZXkoY2gpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc0hhbGZXaWR0aE1hcC5nZXQoY2gpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRCdWlsZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MzQ2NzIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FbWFpbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkV2ZW50OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuSW07Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5OaWNrbmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Pcmdhbml6YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob3RvOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUmVsYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkTmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5XZWJzaXRlOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ2hhcnNldFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkJhc2U2NDsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBUaGUgY2xhc3Mgd2hpY2ggbGV0cyB1c2VycyBjcmVhdGUgdGhlaXIgb3duIHZDYXJkIFN0cmluZy4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkQnVpbGRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRCdWlsZGVyIjsKLQotICAgIC8vIElmIHlvdSBhZGQgdGhlIG90aGVyIGVsZW1lbnQsIHBsZWFzZSBjaGVjayBhbGwgdGhlIGNvbHVtbnMgYXJlIGFibGUgdG8gYmUKLSAgICAvLyBjb252ZXJ0ZWQgdG8gU3RyaW5nLgotICAgIC8vCi0gICAgLy8gZS5nLiBCTE9CIGlzIG5vdCB3aGF0IHdlIGNhbiBoYW5kbGUgaGVyZSBub3cuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc0FsbG93ZWRBbmRyb2lkUHJvcGVydHlTZXQgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUsIEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSkpKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUEhPTkVfVFlQRSA9IFBob25lLlRZUEVfSE9NRTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BPU1RBTF9UWVBFID0gU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9FTUFJTF9UWVBFID0gRW1haWwuVFlQRV9PVEhFUjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9EQVRBX1ZDQVJEID0gIlZDQVJEIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfREFUQV9QVUJMSUMgPSAiUFVCTElDIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9QQVJBTV9TRVBBUkFUT1IgPSAiOyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX0VORF9PRl9MSU5FID0gIlxyXG4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9EQVRBX1NFUEFSQVRPUiA9ICI6IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfSVRFTV9TRVBBUkFUT1IgPSAiOyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1dTID0gIiAiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9QQVJBTV9FUVVBTCA9ICI9IjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCA9ICJFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9QQVJBTV9FTkNPRElOR19CQVNFNjRfVjIxID0gIkVOQ09ESU5HPUJBU0U2NCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX0VOQ09ESU5HX0JBU0U2NF9WMzAgPSAiRU5DT0RJTkc9YiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hJRlRfSklTID0gIlNISUZUX0pJUyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl84ID0gIlVURi04IjsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IG1WQ2FyZFR5cGU7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzVjMwOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNKYXBhbmVzZU1vYmlsZVBob25lOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtT25seU9uZU5vdGVGaWVsZElzQXZhaWxhYmxlOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNEb0NvTW87Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1TaG91bGRVc2VRdW90ZWRQcmludGFibGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Vc2VzQW5kcm9pZFByb3BlcnR5OwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtVXNlc0RlZmFjdFByb3BlcnR5OwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtVXNlc1V0Zjg7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Vc2VzU2hpZnRKaXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1BcHBlbmRUeXBlUGFyYW1OYW1lOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1OZWVkc1RvQ29udmVydFBob25ldGljU3RyaW5nOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1TaG91bGRBcHBlbmRDaGFyc2V0UGFyYW07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2hhcnNldFN0cmluZzsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVkNhcmRDaGFyc2V0UGFyYW1ldGVyOwotCi0gICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIG1CdWlsZGVyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRW5kQXBwZW5kZWQ7Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZDYXJkVHlwZSA9IHZjYXJkVHlwZTsKLQotICAgICAgICBtSXNWMzAgPSBWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpOwotICAgICAgICBtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlID0gVkNhcmRDb25maWcuc2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Jc0RvQ29NbyA9IFZDYXJkQ29uZmlnLmlzRG9Db01vKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Jc0phcGFuZXNlTW9iaWxlUGhvbmUgPSBWQ2FyZENvbmZpZy5uZWVkc1RvQ29udmVydFBob25ldGljU3RyaW5nKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Pbmx5T25lTm90ZUZpZWxkSXNBdmFpbGFibGUgPSBWQ2FyZENvbmZpZy5vbmx5T25lTm90ZUZpZWxkSXNBdmFpbGFibGUodmNhcmRUeXBlKTsKLSAgICAgICAgbVVzZXNBbmRyb2lkUHJvcGVydHkgPSBWQ2FyZENvbmZpZy51c2VzQW5kcm9pZFNwZWNpZmljUHJvcGVydHkodmNhcmRUeXBlKTsKLSAgICAgICAgbVVzZXNEZWZhY3RQcm9wZXJ0eSA9IFZDYXJkQ29uZmlnLnVzZXNEZWZhY3RQcm9wZXJ0eSh2Y2FyZFR5cGUpOwotICAgICAgICBtVXNlc1V0ZjggPSBWQ2FyZENvbmZpZy51c2VzVXRmOCh2Y2FyZFR5cGUpOwotICAgICAgICBtVXNlc1NoaWZ0SmlzID0gVkNhcmRDb25maWcudXNlc1NoaWZ0SmlzKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1SZWZyYWluc1FQVG9OYW1lUHJvcGVydGllcyA9IFZDYXJkQ29uZmlnLnNob3VsZFJlZnJhaW5RUFRvTmFtZVByb3BlcnRpZXModmNhcmRUeXBlKTsKLSAgICAgICAgbUFwcGVuZFR5cGVQYXJhbU5hbWUgPSBWQ2FyZENvbmZpZy5hcHBlbmRUeXBlUGFyYW1OYW1lKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1OZWVkc1RvQ29udmVydFBob25ldGljU3RyaW5nID0gVkNhcmRDb25maWcubmVlZHNUb0NvbnZlcnRQaG9uZXRpY1N0cmluZyh2Y2FyZFR5cGUpOwotCi0gICAgICAgIG1TaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0gPSAhKG1Jc1YzMCAmJiBtVXNlc1V0ZjgpOwotCi0gICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIFN0cmluZyBjaGFyc2V0OwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldFV0aWxzLmNoYXJzZXRGb3JWZW5kb3IoU0hJRlRfSklTLCAiZG9jb21vIikubmFtZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRG9Db01vLXNwZWNpZmljIFNISUZUX0pJUyB3YXMgbm90IGZvdW5kLiBVc2UgU0hJRlRfSklTIGFzIGlzLiIpOwotICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBTSElGVF9KSVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2hhcnNldFN0cmluZyA9IGNoYXJzZXQ7Ci0gICAgICAgICAgICAvLyBEbyBub3QgdXNlIG1DaGFyc2V0U3RyaW5nIGJlbGxvdyBzaW5jZSBpdCBpcyBkaWZmZXJlbnQgZnJvbSAiU0hJRlRfSklTIiBidXQKLSAgICAgICAgICAgIC8vIG1heSBiZSAiRE9DT01PX1NISUZUX0pJUyIgb3Igc29tZXRoaW5nIGxpa2UgdGhhdCAoaW50ZXJuYWwgZXhwcmVzc2lvbiB1c2VkIGluCi0gICAgICAgICAgICAvLyBBbmRyb2lkLCBub3Qgc2hvd24gdG8gdGhlIHB1YmxpYykuCi0gICAgICAgICAgICBtVkNhcmRDaGFyc2V0UGFyYW1ldGVyID0gIkNIQVJTRVQ9IiArIFNISUZUX0pJUzsKLSAgICAgICAgfSBlbHNlIGlmIChtVXNlc1NoaWZ0SmlzKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2hhcnNldDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXRVdGlscy5jaGFyc2V0Rm9yVmVuZG9yKFNISUZUX0pJUykubmFtZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVmVuZG9yLXNwZWNpZmljIFNISUZUX0pJUyB3YXMgbm90IGZvdW5kLiBVc2UgU0hJRlRfSklTIGFzIGlzLiIpOwotICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBTSElGVF9KSVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2hhcnNldFN0cmluZyA9IGNoYXJzZXQ7Ci0gICAgICAgICAgICBtVkNhcmRDaGFyc2V0UGFyYW1ldGVyID0gIkNIQVJTRVQ9IiArIFNISUZUX0pJUzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DaGFyc2V0U3RyaW5nID0gVVRGXzg7Ci0gICAgICAgICAgICBtVkNhcmRDaGFyc2V0UGFyYW1ldGVyID0gIkNIQVJTRVQ9IiArIFVURl84OwotICAgICAgICB9Ci0gICAgICAgIGNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIG1CdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgbUVuZEFwcGVuZGVkID0gZmFsc2U7Ci0gICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQkVHSU4sIFZDQVJEX0RBVEFfVkNBUkQpOwotICAgICAgICBpZiAobUlzVjMwKSB7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1ZFUlNJT04sIFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjMwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVkVSU0lPTiwgVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WMjEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zTm9uRW1wdHlOYW1lKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICBmaW5hbCBTdHJpbmcgZmFtaWx5TmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgbWlkZGxlTmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZ2l2ZW5OYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUFJFRklYKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHN1ZmZpeCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuU1VGRklYKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljRmFtaWx5TmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY01pZGRsZU5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNHaXZlbk5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkaXNwbGF5TmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FKTsKLSAgICAgICAgcmV0dXJuICEoVGV4dFV0aWxzLmlzRW1wdHkoZmFtaWx5TmFtZSkgJiYgVGV4dFV0aWxzLmlzRW1wdHkobWlkZGxlTmFtZSkgJiYKLSAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShnaXZlbk5hbWUpICYmIFRleHRVdGlscy5pc0VtcHR5KHByZWZpeCkgJiYKLSAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShzdWZmaXgpICYmIFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljRmFtaWx5TmFtZSkgJiYKLSAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY01pZGRsZU5hbWUpICYmIFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljR2l2ZW5OYW1lKSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KGRpc3BsYXlOYW1lKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb250ZW50VmFsdWVzIGdldFByaW1hcnlDb250ZW50VmFsdWUoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBDb250ZW50VmFsdWVzIHByaW1hcnlDb250ZW50VmFsdWVzID0gbnVsbDsKLSAgICAgICAgQ29udGVudFZhbHVlcyBzdWJwcmltYXJ5Q29udGVudFZhbHVlcyA9IG51bGw7Ci0gICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWVzID09IG51bGwpewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSW50ZWdlciBpc1N1cGVyUHJpbWFyeSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKFN0cnVjdHVyZWROYW1lLklTX1NVUEVSX1BSSU1BUlkpOwotICAgICAgICAgICAgaWYgKGlzU3VwZXJQcmltYXJ5ICE9IG51bGwgJiYgaXNTdXBlclByaW1hcnkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgY2hvb3NlICJzdXBlciBwcmltYXJ5IiBDb250ZW50VmFsdWVzLgotICAgICAgICAgICAgICAgIHByaW1hcnlDb250ZW50VmFsdWVzID0gY29udGVudFZhbHVlczsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJpbWFyeUNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFdlIGNob29zZSB0aGUgZmlyc3QgInByaW1hcnkiIENvbnRlbnRWYWx1ZXMKLSAgICAgICAgICAgICAgICAvLyBpZiAic3VwZXIgcHJpbWFyeSIgQ29udGVudFZhbHVlcyBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGlzUHJpbWFyeSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlkpOwotICAgICAgICAgICAgICAgIGlmIChpc1ByaW1hcnkgIT0gbnVsbCAmJiBpc1ByaW1hcnkgPiAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc05vbkVtcHR5TmFtZShjb250ZW50VmFsdWVzKSkgewotICAgICAgICAgICAgICAgICAgICBwcmltYXJ5Q29udGVudFZhbHVlcyA9IGNvbnRlbnRWYWx1ZXM7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBicmVhaywgc2luY2UgdGhlcmUgbWF5IGJlIENvbnRlbnRWYWx1ZXMgd2l0aCAic3VwZXIgcHJpbWFyeSIKLSAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXJ3b3JkLgotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VicHJpbWFyeUNvbnRlbnRWYWx1ZXMgPT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNOb25FbXB0eU5hbWUoY29udGVudFZhbHVlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgc3VicHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBjb250ZW50VmFsdWVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcmltYXJ5Q29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoc3VicHJpbWFyeUNvbnRlbnRWYWx1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFdlIGNob29zZSB0aGUgZmlyc3QgQ29udGVudFZhbHVlcyBpZiBhbnkgInByaW1hcnkiIENvbnRlbnRWYWx1ZXMgZG9lcyBub3QgZXhpc3QuCi0gICAgICAgICAgICAgICAgcHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBzdWJwcmltYXJ5Q29udGVudFZhbHVlczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkFsbCBDb250ZW50VmFsdWVzIGdpdmVuIGZyb20gZGF0YWJhc2UgaXMgZW1wdHkuIik7Ci0gICAgICAgICAgICAgICAgcHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByaW1hcnlDb250ZW50VmFsdWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciBzYWZldHksIHdlJ2xsIGVtaXQganVzdCBvbmUgdmFsdWUgYXJvdW5kIFN0cnVjdHVyZWROYW1lLCBhcyBleHRlcm5hbCBpbXBvcnRlcnMKLSAgICAgKiBtYXkgZ2V0IGNvbmZ1c2VkIHdpdGggbXVsdGlwbGUgIk4iLCAiRk4iLCBldGMuIHByb3BlcnRpZXMsIHRob3VnaCBpdCBpcyB2YWxpZCBpbgotICAgICAqIHZDYXJkIHNwZWMuCi0gICAgICovCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmROYW1lUHJvcGVydGllcyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCA9PSBudWxsIHx8IGNvbnRlbnRWYWx1ZXNMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTiwgIiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtSXNWMzApIHsKLSAgICAgICAgICAgICAgICAvLyB2Q2FyZCAzLjAgcmVxdWlyZXMgIk4iIGFuZCAiRk4iIHByb3BlcnRpZXMuCi0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OLCAiIik7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9GTiwgIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBnZXRQcmltYXJ5Q29udGVudFZhbHVlKGNvbnRlbnRWYWx1ZXNMaXN0KTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGZhbWlseU5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1pZGRsZU5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGdpdmVuTmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBSRUZJWCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzdWZmaXggPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlNVRkZJWCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkaXNwbGF5TmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FKTsKLQotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGZhbWlseU5hbWUpIHx8ICFUZXh0VXRpbHMuaXNFbXB0eShnaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseUFwcGVuZENoYXJzZXRQYXJhbWV0ZXJUb05hbWUgPQotICAgICAgICAgICAgICAgICAgICBzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0oZmFtaWx5TmFtZSwgZ2l2ZW5OYW1lLCBtaWRkbGVOYW1lLCBwcmVmaXgsIHN1ZmZpeCk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICghbVJlZnJhaW5zUVBUb05hbWVQcm9wZXJ0aWVzICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShmYW1pbHlOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoZ2l2ZW5OYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkobWlkZGxlTmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHByZWZpeCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHN1ZmZpeCkpKTsKLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdHRlZE5hbWU7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGRpc3BsYXlOYW1lKSkgewotICAgICAgICAgICAgICAgIGZvcm1hdHRlZE5hbWUgPSBkaXNwbGF5TmFtZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0dGVkTmFtZSA9IFZDYXJkVXRpbHMuY29uc3RydWN0TmFtZUZyb21FbGVtZW50cygKLSAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uZmlnLmdldE5hbWVPcmRlclR5cGUobVZDYXJkVHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHlOYW1lLCBtaWRkbGVOYW1lLCBnaXZlbk5hbWUsIHByZWZpeCwgc3VmZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5QXBwZW5kQ2hhcnNldFBhcmFtZXRlclRvRk4gPQotICAgICAgICAgICAgICAgICAgICBzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0oZm9ybWF0dGVkTmFtZSk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvRk4gPQotICAgICAgICAgICAgICAgICAgICAhbVJlZnJhaW5zUVBUb05hbWVQcm9wZXJ0aWVzICYmCi0gICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShmb3JtYXR0ZWROYW1lKTsKLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRGYW1pbHk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZEdpdmVuOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRNaWRkbGU7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFByZWZpeDsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkU3VmZml4OwotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvTmFtZSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRGYW1pbHkgPSBlbmNvZGVRdW90ZWRQcmludGFibGUoZmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEdpdmVuID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKGdpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZE1pZGRsZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShtaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUHJlZml4ID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFN1ZmZpeCA9IGVuY29kZVF1b3RlZFByaW50YWJsZShzdWZmaXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkRmFtaWx5ID0gZXNjYXBlQ2hhcmFjdGVycyhmYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkR2l2ZW4gPSBlc2NhcGVDaGFyYWN0ZXJzKGdpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZE1pZGRsZSA9IGVzY2FwZUNoYXJhY3RlcnMobWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFByZWZpeCA9IGVzY2FwZUNoYXJhY3RlcnMocHJlZml4KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkU3VmZml4ID0gZXNjYXBlQ2hhcmFjdGVycyhzdWZmaXgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZEZvcm1hdHRlZG5hbWUgPQotICAgICAgICAgICAgICAgICAgICAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9GTiA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlUXVvdGVkUHJpbnRhYmxlKGZvcm1hdHRlZE5hbWUpIDogZXNjYXBlQ2hhcmFjdGVycyhmb3JtYXR0ZWROYW1lKSk7Ci0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OKTsKLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5QXBwZW5kQ2hhcnNldFBhcmFtZXRlclRvTmFtZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9OYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIC8vIERvQ29NbyBwaG9uZXMgcmVxdWlyZSB0aGF0IGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlICJmYW1pbHkgbmFtZSIgZmllbGQuCi0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGZvcm1hdHRlZE5hbWUpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlBcHBlbmRDaGFyc2V0UGFyYW1ldGVyVG9OYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb05hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRGYW1pbHkpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRHaXZlbik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZE1pZGRsZSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFByZWZpeCk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFN1ZmZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotCi0gICAgICAgICAgICAvLyBGTiBwcm9wZXJ0eQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0ZOKTsKLSAgICAgICAgICAgIGlmIChyZWFsbHlBcHBlbmRDaGFyc2V0UGFyYW1ldGVyVG9GTikgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb0ZOKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZEZvcm1hdHRlZG5hbWUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgfSBlbHNlIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZGlzcGxheU5hbWUpKSB7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvRGlzcGxheU5hbWUgPQotICAgICAgICAgICAgICAgICghbVJlZnJhaW5zUVBUb05hbWVQcm9wZXJ0aWVzICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoZGlzcGxheU5hbWUpKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkRGlzcGxheU5hbWUgPQotICAgICAgICAgICAgICAgICAgICByZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb0Rpc3BsYXlOYW1lID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVRdW90ZWRQcmludGFibGUoZGlzcGxheU5hbWUpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlQ2hhcmFjdGVycyhkaXNwbGF5TmFtZSk7Ci0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OKTsKLSAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0oZGlzcGxheU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvRGlzcGxheU5hbWUpIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkRGlzcGxheU5hbWUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4pOwotCi0gICAgICAgICAgICAvLyBOb3RlOiAiQ0hBUlNFVCIgcGFyYW0gaXMgbm90IGFsbG93ZWQgaW4gdkNhcmQgMy4wLCBidXQgd2UgbWF5IGFkZCBpdAotICAgICAgICAgICAgLy8gICAgICAgd2hlbiBpdCB3b3VsZCBiZSB1c2VmdWwgZm9yIGV4dGVybmFsIGltcG9ydGVycywgYXNzdW1pbmcgbm8gZXh0ZXJuYWwKLSAgICAgICAgICAgIC8vICAgICAgIGltcG9ydGVyIGFsbG93cyB0aGlzIHZpb3JhdGlvbi4KLSAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0oZGlzcGxheU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkRGlzcGxheU5hbWUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgfSBlbHNlIGlmIChtSXNWMzApIHsKLSAgICAgICAgICAgIC8vIHZDYXJkIDMuMCBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIHRoZXNlIGZpZWxkcy4KLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTiwgIiIpOwotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9GTiwgIiIpOwotICAgICAgICB9IGVsc2UgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OLCAiIik7Ci0gICAgICAgIH0KLQotICAgICAgICBhcHBlbmRQaG9uZXRpY05hbWVGaWVsZHMoY29udGVudFZhbHVlcyk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRQaG9uZXRpY05hbWVGaWVsZHMoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY0ZhbWlseU5hbWU7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY01pZGRsZU5hbWU7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY0dpdmVuTmFtZTsKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRtcFBob25ldGljRmFtaWx5TmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdG1wUGhvbmV0aWNNaWRkbGVOYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0bXBQaG9uZXRpY0dpdmVuTmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FKTsKLSAgICAgICAgICAgIGlmIChtTmVlZHNUb0NvbnZlcnRQaG9uZXRpY1N0cmluZykgewotICAgICAgICAgICAgICAgIHBob25ldGljRmFtaWx5TmFtZSA9IFZDYXJkVXRpbHMudG9IYWxmV2lkdGhTdHJpbmcodG1wUGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBwaG9uZXRpY01pZGRsZU5hbWUgPSBWQ2FyZFV0aWxzLnRvSGFsZldpZHRoU3RyaW5nKHRtcFBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgcGhvbmV0aWNHaXZlbk5hbWUgPSBWQ2FyZFV0aWxzLnRvSGFsZldpZHRoU3RyaW5nKHRtcFBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGhvbmV0aWNGYW1pbHlOYW1lID0gdG1wUGhvbmV0aWNGYW1pbHlOYW1lOwotICAgICAgICAgICAgICAgIHBob25ldGljTWlkZGxlTmFtZSA9IHRtcFBob25ldGljTWlkZGxlTmFtZTsKLSAgICAgICAgICAgICAgICBwaG9uZXRpY0dpdmVuTmFtZSA9IHRtcFBob25ldGljR2l2ZW5OYW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljRmFtaWx5TmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY01pZGRsZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNHaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1NPVU5EKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9YX0lSTUNfTik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUcnkgdG8gZW1pdCB0aGUgZmllbGQocykgcmVsYXRlZCB0byBwaG9uZXRpYyBuYW1lLgotICAgICAgICBpZiAobUlzVjMwKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgc29ydFN0cmluZyA9IFZDYXJkVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMobVZDYXJkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZXRpY0ZhbWlseU5hbWUsIHBob25ldGljTWlkZGxlTmFtZSwgcGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1NPUlRfU1RSSU5HKTsKLSAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0oc29ydFN0cmluZykpIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVzY2FwZUNoYXJhY3RlcnMoc29ydFN0cmluZykpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgfSBlbHNlIGlmIChtSXNKYXBhbmVzZU1vYmlsZVBob25lKSB7Ci0gICAgICAgICAgICAvLyBOb3RlOiBUaGVyZSBpcyBubyBhcHByb3ByaWF0ZSBwcm9wZXJ0eSBmb3IgZXhwcmVzc2luZwotICAgICAgICAgICAgLy8gICAgICAgcGhvbmV0aWMgbmFtZSBpbiB2Q2FyZCAyLjEsIHdoaWxlIHRoZXJlIGlzIGluCi0gICAgICAgICAgICAvLyAgICAgICB2Q2FyZCAzLjAgKFNPUlQtU1RSSU5HKS4KLSAgICAgICAgICAgIC8vICAgICAgIFdlIGNob3NlIHRvIHVzZSBEb0NvTW8ncyB3YXkgd2hlbiB0aGUgZGV2aWNlIGlzIEphcGFuZXNlIG9uZQotICAgICAgICAgICAgLy8gICAgICAgc2luY2UgaXQgaXMgc3VwcG9ydGVkIGJ5Ci0gICAgICAgICAgICAvLyAgICAgICBhIGxvdCBvZiBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzLiBUaGlzIGlzICJYLSIgcHJvcGVydHksIHNvCi0gICAgICAgICAgICAvLyAgICAgICBhbnkgcGFyc2VyIGhvcGVmdWxseSB3b3VsZCBub3QgZ2V0IGNvbmZ1c2VkIHdpdGggdGhpcy4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyAgICAgICBBbHNvLCBEb0NvTW8ncyBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIHZDYXJkIGNvbXBvc2VyIHRvIHVzZSBqdXN0IHRoZSBmaXJzdAotICAgICAgICAgICAgLy8gICAgICAgY29sdW1uLgotICAgICAgICAgICAgLy8gICAgICAgaS5lLgotICAgICAgICAgICAgLy8gICAgICAgbyAgU09VTkQ7WC1JUk1DLU46TWl5YWthd2EgRGFpc3VrZTs7OzsKLSAgICAgICAgICAgIC8vICAgICAgIHggIFNPVU5EO1gtSVJNQy1OOk1peWFrYXdhO0RhaXN1a2U7OzsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9TT1VORCk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1hfSVJNQ19OKTsKLQotICAgICAgICAgICAgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgICghbVJlZnJhaW5zUVBUb05hbWVQcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAhKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZXRpY0ZhbWlseU5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25ldGljTWlkZGxlTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmV0aWNHaXZlbk5hbWUpKSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWU7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lOwotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSA9IGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSA9IGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUsIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Vc2VzRGVmYWN0UHJvcGVydHkpIHsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNHaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShwaG9uZXRpY0dpdmVuTmFtZSkpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWU7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSA9IGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19GSVJTVF9OQU1FKTsKLSAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKHBob25ldGljR2l2ZW5OYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHBob25ldGljTWlkZGxlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHBob25ldGljTWlkZGxlTmFtZSkpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lOwotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1BIT05FVElDX01JRERMRV9OQU1FKTsKLSAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKHBob25ldGljTWlkZGxlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNGYW1pbHlOYW1lKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocGhvbmV0aWNGYW1pbHlOYW1lKSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWU7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSA9IGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfTEFTVF9OQU1FKTsKLSAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKHBob25ldGljRmFtaWx5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kTmlja05hbWVzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiB1c2VBbmRyb2lkUHJvcGVydHk7Ci0gICAgICAgIGlmIChtSXNWMzApIHsKLSAgICAgICAgICAgIHVzZUFuZHJvaWRQcm9wZXJ0eSA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKG1Vc2VzQW5kcm9pZFByb3BlcnR5KSB7Ci0gICAgICAgICAgICB1c2VBbmRyb2lkUHJvcGVydHkgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVGhlcmUncyBubyB3YXkgdG8gYWRkIHRoaXMgZmllbGQuCi0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuaWNrbmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoTmlja25hbWUuTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KG5pY2tuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHVzZUFuZHJvaWRQcm9wZXJ0eSkgewotICAgICAgICAgICAgICAgICAgICBhcHBlbmRBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eShOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSwgY29udGVudFZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTklDS05BTUUsIG5pY2tuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRQaG9uZXMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBib29sZWFuIHBob25lTGluZUV4aXN0cyA9IGZhbHNlOwotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgU2V0PFN0cmluZz4gcGhvbmVTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciB0eXBlQXNPYmplY3QgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihQaG9uZS5UWVBFKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWwgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFBob25lLkxBQkVMKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGlzUHJpbWFyeUFzSW50ZWdlciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKFBob25lLklTX1BSSU1BUlkpOwotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5ID0gKGlzUHJpbWFyeUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgIChpc1ByaW1hcnlBc0ludGVnZXIgPiAwKSA6IGZhbHNlKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGhvbmVOdW1iZXIgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFBob25lLk5VTUJFUik7Ci0gICAgICAgICAgICAgICAgaWYgKHBob25lTnVtYmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGhvbmVOdW1iZXIgPSBwaG9uZU51bWJlci50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwaG9uZU51bWJlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gUEFHRVIgbnVtYmVyIG5lZWRzIHVuZm9ybWF0dGVkICJwaG9uZSBudW1iZXIiLgotICAgICAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gKHR5cGVBc09iamVjdCAhPSBudWxsID8gdHlwZUFzT2JqZWN0IDogREVGQVVMVF9QSE9ORV9UWVBFKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBQaG9uZS5UWVBFX1BBR0VSIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbmZpZy5yZWZyYWluUGhvbmVOdW1iZXJGb3JtYXR0aW5nKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBob25lTGluZUV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcGhvbmVTZXQuY29udGFpbnMocGhvbmVOdW1iZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZVNldC5hZGQocGhvbmVOdW1iZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVGVsTGluZSh0eXBlLCBsYWJlbCwgcGhvbmVOdW1iZXIsIGlzUHJpbWFyeSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGhvbmVOdW1iZXJMaXN0ID0gc3BsaXRBbmRUcmltUGhvbmVOdW1iZXJzKHBob25lTnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBob25lTnVtYmVyTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBob25lTGluZUV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGFjdHVhbFBob25lTnVtYmVyIDogcGhvbmVOdW1iZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBob25lU2V0LmNvbnRhaW5zKGFjdHVhbFBob25lTnVtYmVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBmb3JtYXQgPSBWQ2FyZFV0aWxzLmdldFBob25lTnVtYmVyRm9ybWF0KG1WQ2FyZFR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmb3JtYXR0ZWRQaG9uZU51bWJlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcihhY3R1YWxQaG9uZU51bWJlciwgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZVNldC5hZGQoYWN0dWFsUGhvbmVOdW1iZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRlbExpbmUodHlwZSwgbGFiZWwsIGZvcm1hdHRlZFBob25lTnVtYmVyLCBpc1ByaW1hcnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9ICAvLyBmb3IgKFN0cmluZyBhY3R1YWxQaG9uZU51bWJlciA6IHBob25lTnVtYmVyTGlzdCkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcGhvbmVMaW5lRXhpc3RzICYmIG1Jc0RvQ29NbykgewotICAgICAgICAgICAgYXBwZW5kVGVsTGluZShQaG9uZS5UWVBFX0hPTUUsICIiLCAiIiwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogU3BsaXRzIGEgZ2l2ZW4gc3RyaW5nIGV4cHJlc3NpbmcgcGhvbmUgbnVtYmVycyBpbnRvIHNldmVyYWwgc3RyaW5ncywgYW5kIHJlbW92ZQotICAgICAqIHVubmVjZXNzYXJ5IGNoYXJhY3RlcnMgaW5zaWRlIHRoZW0uIFRoZSBzaXplIG9mIGEgcmV0dXJuZWQgbGlzdCBiZWNvbWVzIDEgd2hlbgotICAgICAqIG5vIHNwbGl0IGlzIG5lZWRlZC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhlIGdpdmVuIG51bWJlciAibWF5IiBoYXZlIHNldmVyYWwgcGhvbmUgbnVtYmVycyB3aGVuIHRoZSBjb250YWN0IGVudHJ5IGlzIGNvcnJ1cHRlZAotICAgICAqIGJlY2F1c2Ugb2YgaXRzIG9yaWdpbmFsIHNvdXJjZS4KLSAgICAgKiBlLmcuICIxMTEtMjIyLTMzMzMgKE1pYW1pKVxuNDQ0LTU1NS02NjY2IChCcm93YXJkOyAzMDUtNjUzLTY3OTYgKE1pYW1pKSIKLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBraW5kIG9mICJwaG9uZSBudW1iZXJzIiB3aWxsIG5vdCBiZSBjcmVhdGVkIHdpdGggQW5kcm9pZCB2Q2FyZCBpbXBsZW1lbnRhdGlvbiwKLSAgICAgKiBidXQgd2UgbWF5IGVuY291bnRlciB0aGVtIGlmIHRoZSBzb3VyY2Ugb2YgdGhlIGlucHV0IGRhdGEgaGFzIGFscmVhZHkgY29ycnVwdGVkCi0gICAgICogaW1wbGVtZW50YXRpb24uCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRvIGhhbmRsZSB0aGlzIGNhc2UsIHRoaXMgbWV0aG9kIGZpcnN0IHNwbGl0cyBpdHMgaW5wdXQgaW50byBtdWx0aXBsZSBwYXJ0cwotICAgICAqIChlLmcuICIxMTEtMjIyLTMzMzMgKE1pYW1pKSIsICI0NDQtNTU1LTY2NjYgKEJyb3dhcmQiLCBhbmQgMzA1NjUzLTY3OTYgKE1pYW1pKSIpIGFuZAotICAgICAqIHJlbW92ZXMgdW5uZWNlc3Nhcnkgc3RyaW5ncyBsaWtlICIoTWlhbWkpIi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogRG8gbm90IGNhbGwgdGhpcyBtZXRob2Qgd2hlbiB0cmltbWluZyBpcyBpbmFwcHJvcHJpYXRlIGZvciBpdHMgcmVjZWl2ZXJzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBzcGxpdEFuZFRyaW1QaG9uZU51bWJlcnMoZmluYWwgU3RyaW5nIHBob25lTnVtYmVyKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwaG9uZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcGhvbmVOdW1iZXIubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIGNoYXIgY2ggPSBwaG9uZU51bWJlci5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoY2gpIHx8IGNoID09ICcrJykgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKGNoID09ICc7JyB8fCBjaCA9PSAnXG4nKSAmJiBidWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHBob25lTGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHBob25lTGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwaG9uZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRFbWFpbHMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBib29sZWFuIGVtYWlsQWRkcmVzc0V4aXN0cyA9IGZhbHNlOwotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gYWRkcmVzc1NldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZW1haWxBZGRyZXNzID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhFbWFpbC5EQVRBKTsKLSAgICAgICAgICAgICAgICBpZiAoZW1haWxBZGRyZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZW1haWxBZGRyZXNzID0gZW1haWxBZGRyZXNzLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGVtYWlsQWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEludGVnZXIgdHlwZUFzT2JqZWN0ID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoRW1haWwuVFlQRSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHR5cGUgPSAodHlwZUFzT2JqZWN0ICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFzT2JqZWN0IDogREVGQVVMVF9FTUFJTF9UWVBFKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWwgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKEVtYWlsLkxBQkVMKTsKLSAgICAgICAgICAgICAgICBJbnRlZ2VyIGlzUHJpbWFyeUFzSW50ZWdlciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEVtYWlsLklTX1BSSU1BUlkpOwotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5ID0gKGlzUHJpbWFyeUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgIChpc1ByaW1hcnlBc0ludGVnZXIgPiAwKSA6IGZhbHNlKTsKLSAgICAgICAgICAgICAgICBlbWFpbEFkZHJlc3NFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmICghYWRkcmVzc1NldC5jb250YWlucyhlbWFpbEFkZHJlc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3NTZXQuYWRkKGVtYWlsQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZEVtYWlsTGluZSh0eXBlLCBsYWJlbCwgZW1haWxBZGRyZXNzLCBpc1ByaW1hcnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZW1haWxBZGRyZXNzRXhpc3RzICYmIG1Jc0RvQ29NbykgewotICAgICAgICAgICAgYXBwZW5kRW1haWxMaW5lKEVtYWlsLlRZUEVfSE9NRSwgIiIsICIiLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZFBvc3RhbHMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgPT0gbnVsbCB8fCBjb250ZW50VmFsdWVzTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQURSKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kUG9zdGFsc0ZvckRvQ29Nbyhjb250ZW50VmFsdWVzTGlzdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFwcGVuZFBvc3RhbHNGb3JHZW5lcmljKGNvbnRlbnRWYWx1ZXNMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBzUG9zdGFsVHlwZVByaW9yaXR5TWFwOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgc1Bvc3RhbFR5cGVQcmlvcml0eU1hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7Ci0gICAgICAgIHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FLCAwKTsKLSAgICAgICAgc1Bvc3RhbFR5cGVQcmlvcml0eU1hcC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkssIDEpOwotICAgICAgICBzUG9zdGFsVHlwZVByaW9yaXR5TWFwLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfT1RIRVIsIDIpOwotICAgICAgICBzUG9zdGFsVHlwZVByaW9yaXR5TWFwLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NLCAzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmllcyB0byBhcHBlbmQganVzdCBvbmUgbGluZS4gSWYgdGhlcmUncyBubyBhcHByb3ByaWF0ZSBhZGRyZXNzCi0gICAgICogaW5mb3JtYXRpb24sIGFwcGVuZCBhbiBlbXB0eSBsaW5lLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRQb3N0YWxzRm9yRG9Db01vKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaW50IGN1cnJlbnRQcmlvcml0eSA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICBpbnQgY3VycmVudFR5cGUgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgQ29udGVudFZhbHVlcyBjdXJyZW50Q29udGVudFZhbHVlcyA9IG51bGw7Ci0gICAgICAgIGZvciAoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIEludGVnZXIgdHlwZUFzSW50ZWdlciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKFN0cnVjdHVyZWRQb3N0YWwuVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHByaW9yaXR5QXNJbnRlZ2VyID0gc1Bvc3RhbFR5cGVQcmlvcml0eU1hcC5nZXQodHlwZUFzSW50ZWdlcik7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcHJpb3JpdHkgPQotICAgICAgICAgICAgICAgICAgICAocHJpb3JpdHlBc0ludGVnZXIgIT0gbnVsbCA/IHByaW9yaXR5QXNJbnRlZ2VyIDogSW50ZWdlci5NQVhfVkFMVUUpOwotICAgICAgICAgICAgaWYgKHByaW9yaXR5IDwgY3VycmVudFByaW9yaXR5KSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudFByaW9yaXR5ID0gcHJpb3JpdHk7Ci0gICAgICAgICAgICAgICAgY3VycmVudFR5cGUgPSB0eXBlQXNJbnRlZ2VyOwotICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZW50VmFsdWVzID0gY29udGVudFZhbHVlczsKLSAgICAgICAgICAgICAgICBpZiAocHJpb3JpdHkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY3VycmVudENvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlNob3VsZCBub3QgY29tZSBoZXJlLiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHBvc3RhbCBkYXRhLiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gY3VycmVudENvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5MQUJFTCk7Ci0gICAgICAgIGFwcGVuZFBvc3RhbExpbmUoY3VycmVudFR5cGUsIGxhYmVsLCBjdXJyZW50Q29udGVudFZhbHVlcywgZmFsc2UsIHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRQb3N0YWxzRm9yR2VuZXJpYyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGZvciAoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIEludGVnZXIgdHlwZUFzSW50ZWdlciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKFN0cnVjdHVyZWRQb3N0YWwuVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSA9ICh0eXBlQXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICB0eXBlQXNJbnRlZ2VyIDogREVGQVVMVF9QT1NUQUxfVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWwgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwpOwotICAgICAgICAgICAgZmluYWwgSW50ZWdlciBpc1ByaW1hcnlBc0ludGVnZXIgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKFN0cnVjdHVyZWRQb3N0YWwuSVNfUFJJTUFSWSk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSA9IChpc1ByaW1hcnlBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgIChpc1ByaW1hcnlBc0ludGVnZXIgPiAwKSA6IGZhbHNlKTsKLSAgICAgICAgICAgIGFwcGVuZFBvc3RhbExpbmUodHlwZSwgbGFiZWwsIGNvbnRlbnRWYWx1ZXMsIGlzUHJpbWFyeSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUG9zdGFsU3RydWN0IHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGU7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gYXBwZW5kQ2hhcnNldDsKLSAgICAgICAgZmluYWwgU3RyaW5nIGFkZHJlc3NEYXRhOwotICAgICAgICBwdWJsaWMgUG9zdGFsU3RydWN0KGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlLAotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXBwZW5kQ2hhcnNldCwgZmluYWwgU3RyaW5nIGFkZHJlc3NEYXRhKSB7Ci0gICAgICAgICAgICB0aGlzLnJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9IHJlYWxseVVzZVF1b3RlZFByaW50YWJsZTsKLSAgICAgICAgICAgIHRoaXMuYXBwZW5kQ2hhcnNldCA9IGFwcGVuZENoYXJzZXQ7Ci0gICAgICAgICAgICB0aGlzLmFkZHJlc3NEYXRhID0gYWRkcmVzc0RhdGE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIG51bGwgd2hlbiB0aGVyZSdzIG5vIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBjb25zdHJ1Y3QgdGhlIGRhdGEuCi0gICAgICovCi0gICAgcHJpdmF0ZSBQb3N0YWxTdHJ1Y3QgdHJ5Q29uc3RydWN0UG9zdGFsU3RydWN0KENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICAvLyBhZHItdmFsdWUgICAgPSAwKjYodGV4dC12YWx1ZSAiOyIpIHRleHQtdmFsdWUKLSAgICAgICAgLy8gICAgICAgICAgICAgIDsgUE8gQm94LCBFeHRlbmRlZCBBZGRyZXNzLCBTdHJlZXQsIExvY2FsaXR5LCBSZWdpb24sIFBvc3RhbAotICAgICAgICAvLyAgICAgICAgICAgICAgOyBDb2RlLCBDb3VudHJ5IE5hbWUKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd1BvQm94ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd05laWdoYm9yaG9vZCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5ORUlHSEJPUkhPT0QpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3U3RyZWV0ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByYXdMb2NhbGl0eSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5DSVRZKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd1JlZ2lvbiA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5SRUdJT04pOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3UG9zdGFsQ29kZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5QT1NUQ09ERSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByYXdDb3VudHJ5ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlkpOwotICAgICAgICBmaW5hbCBTdHJpbmdbXSByYXdBZGRyZXNzQXJyYXkgPSBuZXcgU3RyaW5nW117Ci0gICAgICAgICAgICAgICAgcmF3UG9Cb3gsIHJhd05laWdoYm9yaG9vZCwgcmF3U3RyZWV0LCByYXdMb2NhbGl0eSwKLSAgICAgICAgICAgICAgICByYXdSZWdpb24sIHJhd1Bvc3RhbENvZGUsIHJhd0NvdW50cnl9OwotICAgICAgICBpZiAoIVZDYXJkVXRpbHMuYXJlQWxsRW1wdHkocmF3QWRkcmVzc0FycmF5KSkgewotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3QWRkcmVzc0FycmF5KSk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGFwcGVuZENoYXJzZXQgPQotICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKHJhd0FkZHJlc3NBcnJheSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBvQm94OwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRTdHJlZXQ7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZExvY2FsaXR5OwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRSZWdpb247Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBvc3RhbENvZGU7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZENvdW50cnk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZE5laWdoYm9yaG9vZDsKLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJhd0xvY2FsaXR5MjsKLSAgICAgICAgICAgIC8vIFRoaXMgbG9va3MgaW5lZmZpY2llbnQgc2luY2Ugd2UgZW5jb2RlIHJhd0xvY2FsaXR5IGFuZCByYXdOZWlnaGJvcmhvb2QgdHdpY2UsCi0gICAgICAgICAgICAvLyBidXQgdGhpcyBpcyBpbnRlbnRpb25hbC4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBRUCBlbmNvZGluZyBtYXkgYWRkIGxpbmUgZmVlZHMgd2hlbiBuZWVkZWQgYW5kIHRoZSByZXN1bHQgb2YKLSAgICAgICAgICAgIC8vIC0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd0xvY2FsaXR5ICsgIiAiICsgcmF3TmVpZ2hib3Job29kKQotICAgICAgICAgICAgLy8gbWF5IGJlIGRpZmZlcmVudCBmcm9tCi0gICAgICAgICAgICAvLyAtIGVuY29kZWRMb2NhbGl0eSArICIgIiArIGVuY29kZWROZWlnaGJvcmhvb2QuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gV2UgdXNlIHNhZmVyIHdheS4KLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShyYXdMb2NhbGl0eSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocmF3TmVpZ2hib3Job29kKSkgewotICAgICAgICAgICAgICAgICAgICByYXdMb2NhbGl0eTIgPSAiIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByYXdMb2NhbGl0eTIgPSByYXdOZWlnaGJvcmhvb2Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocmF3TmVpZ2hib3Job29kKSkgewotICAgICAgICAgICAgICAgICAgICByYXdMb2NhbGl0eTIgPSByYXdMb2NhbGl0eTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByYXdMb2NhbGl0eTIgPSByYXdMb2NhbGl0eSArICIgIiArIHJhd05laWdoYm9yaG9vZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBvQm94ID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1BvQm94KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkU3RyZWV0ID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1N0cmVldCk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZExvY2FsaXR5ID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd0xvY2FsaXR5Mik7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFJlZ2lvbiA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdSZWdpb24pOwotICAgICAgICAgICAgICAgIGVuY29kZWRQb3N0YWxDb2RlID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1Bvc3RhbENvZGUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRDb3VudHJ5ID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd0NvdW50cnkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUG9Cb3ggPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd1BvQm94KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkU3RyZWV0ID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdTdHJlZXQpOwotICAgICAgICAgICAgICAgIGVuY29kZWRMb2NhbGl0eSA9IGVzY2FwZUNoYXJhY3RlcnMocmF3TG9jYWxpdHkyKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUmVnaW9uID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdSZWdpb24pOwotICAgICAgICAgICAgICAgIGVuY29kZWRQb3N0YWxDb2RlID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdQb3N0YWxDb2RlKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkQ291bnRyeSA9IGVzY2FwZUNoYXJhY3RlcnMocmF3Q291bnRyeSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZE5laWdoYm9yaG9vZCA9IGVzY2FwZUNoYXJhY3RlcnMocmF3TmVpZ2hib3Job29kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBhZGRyZXNzQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoZW5jb2RlZFBvQm94KTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKGVuY29kZWRTdHJlZXQpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoZW5jb2RlZExvY2FsaXR5KTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWZmZXIuYXBwZW5kKGVuY29kZWRSZWdpb24pOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoZW5jb2RlZFBvc3RhbENvZGUpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoZW5jb2RlZENvdW50cnkpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3N0YWxTdHJ1Y3QoCi0gICAgICAgICAgICAgICAgICAgIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSwgYXBwZW5kQ2hhcnNldCwgYWRkcmVzc0J1ZmZlci50b1N0cmluZygpKTsKLSAgICAgICAgfSBlbHNlIHsgIC8vIFZDYXJkVXRpbHMuYXJlQWxsRW1wdHkocmF3QWRkcmVzc0FycmF5KSA9PSB0cnVlCi0gICAgICAgICAgICAvLyBUcnkgdG8gdXNlIEZPUk1BVFRFRF9BRERSRVNTIGluc3RlYWQuCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmF3Rm9ybWF0dGVkQWRkcmVzcyA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTKTsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShyYXdGb3JtYXR0ZWRBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3Rm9ybWF0dGVkQWRkcmVzcykpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhcHBlbmRDaGFyc2V0ID0KLSAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShyYXdGb3JtYXR0ZWRBZGRyZXNzKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkRm9ybWF0dGVkQWRkcmVzczsKLSAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkRm9ybWF0dGVkQWRkcmVzcyA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdGb3JtYXR0ZWRBZGRyZXNzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEZvcm1hdHRlZEFkZHJlc3MgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd0Zvcm1hdHRlZEFkZHJlc3MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXZSB1c2UgdGhlIHNlY29uZCB2YWx1ZSAoIkV4dGVuZGVkIEFkZHJlc3MiKSBqdXN0IGJlY2F1c2UgSmFwYW5lc2UgbW9iaWxlIHBob25lcwotICAgICAgICAgICAgLy8gZG8gc28uIElmIHRoZSBvdGhlciBpbXBvcnRlciBleHBlY3RzIHRoZSB2YWx1ZSBiZSBpbiB0aGUgb3RoZXIgZmllbGQsIHNvbWUgZmxhZyBtYXkKLSAgICAgICAgICAgIC8vIGJlIG5lZWRlZC4KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBhZGRyZXNzQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoZW5jb2RlZEZvcm1hdHRlZEFkZHJlc3MpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3N0YWxTdHJ1Y3QoCi0gICAgICAgICAgICAgICAgICAgIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSwgYXBwZW5kQ2hhcnNldCwgYWRkcmVzc0J1ZmZlci50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kSW1zKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHByb3RvY29sQXNPYmplY3QgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihJbS5QUk9UT0NPTCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3RvY29sQXNPYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSA9IFZDYXJkVXRpbHMuZ2V0UHJvcGVydHlOYW1lRm9ySW0ocHJvdG9jb2xBc09iamVjdCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgZGF0YSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoSW0uREFUQSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShkYXRhKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHR5cGVBc1N0cmluZzsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgdHlwZUFzSW50ZWdlciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEltLlRZUEUpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGVBc0ludGVnZXIgIT0gbnVsbCA/IHR5cGVBc0ludGVnZXIgOiBJbS5UWVBFX09USEVSKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEltLlRZUEVfSE9NRTogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW0uVFlQRV9XT1JLOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbS5UWVBFX0NVU1RPTTogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoSW0uTEFCRUwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IChsYWJlbCAhPSBudWxsID8gIlgtIiArIGxhYmVsIDogbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEltLlRZUEVfT1RIRVI6ICAvLyBJZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHR5cGVBc1N0cmluZykpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQodHlwZUFzU3RyaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBpc1ByaW1hcnlBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihJbS5JU19QUklNQVJZKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSA9IChpc1ByaW1hcnlBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKHByb3BlcnR5TmFtZSwgcGFyYW1ldGVyTGlzdCwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRXZWJzaXRlcyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHdlYnNpdGUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFdlYnNpdGUuVVJMKTsKLSAgICAgICAgICAgICAgICBpZiAod2Vic2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdlYnNpdGUgPSB3ZWJzaXRlLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3RlOiB2Q2FyZCAzLjAgZG9lcyBub3QgYWxsb3cgYW55IHBhcmFtZXRlciBhZGRpdGlvbiB0b3dhcmQgIlVSTCIKLSAgICAgICAgICAgICAgICAvLyAgICAgICBwcm9wZXJ0eSwgd2hpbGUgdGhlcmUncyBubyBkb2N1bWVudCBpbiB2Q2FyZCAyLjEuCi0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh3ZWJzaXRlKSkgewotICAgICAgICAgICAgICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9VUkwsIHdlYnNpdGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZE9yZ2FuaXphdGlvbnMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBjb21wYW55ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhPcmdhbml6YXRpb24uQ09NUEFOWSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBhbnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb21wYW55ID0gY29tcGFueS50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBkZXBhcnRtZW50ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhPcmdhbml6YXRpb24uREVQQVJUTUVOVCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlcGFydG1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkZXBhcnRtZW50ID0gZGVwYXJ0bWVudC50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoT3JnYW5pemF0aW9uLlRJVExFKTsKLSAgICAgICAgICAgICAgICBpZiAodGl0bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIG9yZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoY29tcGFueSkpIHsKLSAgICAgICAgICAgICAgICAgICAgb3JnQnVpbGRlci5hcHBlbmQoY29tcGFueSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZGVwYXJ0bWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9yZ0J1aWxkZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcmdCdWlsZGVyLmFwcGVuZCgnOycpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9yZ0J1aWxkZXIuYXBwZW5kKGRlcGFydG1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgb3JnbGluZSA9IG9yZ0J1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX09SRywgb3JnbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKG9yZ2xpbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKG9yZ2xpbmUpKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHRpdGxlKSkgewotICAgICAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1RJVExFLCB0aXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSh0aXRsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSh0aXRsZSkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRQaG90b3MoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gY29udGVudFZhbHVlcy5nZXRBc0J5dGVBcnJheShQaG90by5QSE9UTyk7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBob3RvVHlwZSA9IFZDYXJkVXRpbHMuZ3Vlc3NJbWFnZVR5cGUoZGF0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBob3RvVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJVbmtub3duIHBob3RvIHR5cGUuIElnbm9yZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGhvdG9TdHJpbmcgPSBuZXcgU3RyaW5nKEJhc2U2NC5lbmNvZGVCYXNlNjQoZGF0YSkpOwotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocGhvdG9TdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZFBob3RvTGluZShwaG90b1N0cmluZywgcGhvdG9UeXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmROb3RlcyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobU9ubHlPbmVOb3RlRmllbGRJc0F2YWlsYWJsZSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgbm90ZUJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5vdGUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKE5vdGUuTk9URSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChub3RlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobm90ZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGVCdWlsZGVyLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGVCdWlsZGVyLmFwcGVuZChub3RlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbm90ZVN0ciA9IG5vdGVCdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB3ZSBzY2FuIG5vdGVTdHIgY29tcGxldGVseSB0d2ljZSwgd2hpY2ggaXMgcmVkdW5kYW50LgotICAgICAgICAgICAgICAgIC8vIEJ1dCBmb3Igbm93LCB3ZSBhc3N1bWUgdGhpcyBpcyBub3Qgc28gdGltZS1jb25zdW1pbmcuLgotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2hvdWxkQXBwZW5kQ2hhcnNldEluZm8gPQotICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShub3RlU3RyKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShub3RlU3RyKSk7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OT1RFLCBub3RlU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQXBwZW5kQ2hhcnNldEluZm8sIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5vdGVTdHIgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKE5vdGUuTk9URSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobm90ZVN0cikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2hvdWxkQXBwZW5kQ2hhcnNldEluZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShub3RlU3RyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShub3RlU3RyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX05PVEUsIG5vdGVTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFwcGVuZENoYXJzZXRJbmZvLCByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kRXZlbnRzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBwcmltYXJ5QmlydGhkYXkgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIHNlY29uZGFyeUJpcnRoZGF5ID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGV2ZW50VHlwZUFzSW50ZWdlciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEV2ZW50LlRZUEUpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBldmVudFR5cGU7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50VHlwZUFzSW50ZWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IGV2ZW50VHlwZUFzSW50ZWdlcjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBFdmVudC5UWVBFX09USEVSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IEV2ZW50LlRZUEVfQklSVEhEQVkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGJpcnRoZGF5Q2FuZGlkYXRlID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhFdmVudC5TVEFSVF9EQVRFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJpcnRoZGF5Q2FuZGlkYXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaXNTdXBlclByaW1hcnlBc0ludGVnZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoRXZlbnQuSVNfU1VQRVJfUFJJTUFSWSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNTdXBlclByaW1hcnkgPSAoaXNTdXBlclByaW1hcnlBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzU3VwZXJQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1N1cGVyUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gInN1cGVyIHByaW1hcnkiIGJpcnRoZGF5IHNob3VsZCB0aGUgcHJlZmVyZWQgb25lLgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUJpcnRoZGF5ID0gYmlydGhkYXlDYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGlzUHJpbWFyeUFzSW50ZWdlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihFdmVudC5JU19QUklNQVJZKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkgPSAoaXNQcmltYXJ5QXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1ByaW1hcnlBc0ludGVnZXIgPiAwKSA6IGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgYnJlYWsgaGVyZSBzaW5jZSAic3VwZXIgcHJpbWFyeSIgYmlydGhkYXkgbWF5IGV4aXN0IGxhdGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUJpcnRoZGF5ID0gYmlydGhkYXlDYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kYXJ5QmlydGhkYXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QgZW50cnkgaXMgc2V0IHRvIHRoZSAic2Vjb25kYXJ5IiBjYW5kaWRhdGUuCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlCaXJ0aGRheSA9IGJpcnRoZGF5Q2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtVXNlc0FuZHJvaWRQcm9wZXJ0eSkgewotICAgICAgICAgICAgICAgICAgICAvLyBFdmVudCB0eXBlcyBvdGhlciB0aGFuIEJpcnRoZGF5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdkNhcmQuCi0gICAgICAgICAgICAgICAgICAgIGFwcGVuZEFuZHJvaWRTcGVjaWZpY1Byb3BlcnR5KEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFLCBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHJpbWFyeUJpcnRoZGF5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9CREFZLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUJpcnRoZGF5LnRyaW0oKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlY29uZGFyeUJpcnRoZGF5ICE9IG51bGwpewotICAgICAgICAgICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0JEQVksCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlCaXJ0aGRheS50cmltKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kUmVsYXRpb24oZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAobVVzZXNBbmRyb2lkUHJvcGVydHkgJiYgY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFwcGVuZEFuZHJvaWRTcGVjaWZpY1Byb3BlcnR5KFJlbGF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFLCBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRQb3N0YWxMaW5lKGZpbmFsIGludCB0eXBlLCBmaW5hbCBTdHJpbmcgbGFiZWwsCi0gICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSwgZmluYWwgYm9vbGVhbiBlbWl0TGluZUV2ZXJ5VGltZSkgewotICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBhcHBlbmRDaGFyc2V0OwotICAgICAgICBmaW5hbCBTdHJpbmcgYWRkcmVzc1ZhbHVlOwotICAgICAgICB7Ci0gICAgICAgICAgICBQb3N0YWxTdHJ1Y3QgcG9zdGFsU3RydWN0ID0gdHJ5Q29uc3RydWN0UG9zdGFsU3RydWN0KGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICAgICAgaWYgKHBvc3RhbFN0cnVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVtaXRMaW5lRXZlcnlUaW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBhcHBlbmRDaGFyc2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3NWYWx1ZSA9ICIiOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9IHBvc3RhbFN0cnVjdC5yZWFsbHlVc2VRdW90ZWRQcmludGFibGU7Ci0gICAgICAgICAgICAgICAgYXBwZW5kQ2hhcnNldCA9IHBvc3RhbFN0cnVjdC5hcHBlbmRDaGFyc2V0OwotICAgICAgICAgICAgICAgIGFkZHJlc3NWYWx1ZSA9IHBvc3RhbFN0cnVjdC5hZGRyZXNzRGF0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGlmIChpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRik7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUks6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NOiB7Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShsYWJlbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihsYWJlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IHN1cmUgd2hldGhlciB0aGUgbGFiZWwgaXMgdmFsaWQgaW4gdGhlIHNwZWMKLSAgICAgICAgICAgICAgICAgICAgLy8gKCJJQU5BLXRva2VuIiBpbiB0aGUgdkNhcmQgMy4wIGlzIHVuY2xlYXIuLi4pCi0gICAgICAgICAgICAgICAgICAgIC8vIEp1c3QgIGZvciBzYWZldHksIHdlIGFkZCAiWC0iIGF0IHRoZSBiZWdnaW5pbmcgb2YgZWFjaCBsYWJlbC4KLSAgICAgICAgICAgICAgICAgICAgLy8gQWxzbyBjaGVja3MgdGhlIGxhYmVsIG9iZXlzIHdpdGggdkNhcmQgMy4wIHNwZWMuCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKCJYLSIgKyBsYWJlbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfT1RIRVI6IHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5rbm93biBTdHJ1Y3R1cmVkUG9zdGFsIHR5cGU6ICIgKyB0eXBlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9BRFIpOwotICAgICAgICBpZiAoIXBhcmFtZXRlckxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXJzKHBhcmFtZXRlckxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhcHBlbmRDaGFyc2V0KSB7Ci0gICAgICAgICAgICAvLyBTdHJpY3RseSwgdkNhcmQgMy4wIGRvZXMgbm90IGFsbG93IGV4cG9ydGVycyB0byBlbWl0IGNoYXJzZXQgaW5mb3JtYXRpb24sCi0gICAgICAgICAgICAvLyBidXQgd2Ugd2lsbCBhZGQgaXQgc2luY2UgdGhlIGluZm9ybWF0aW9uIHNob3VsZCBiZSB1c2VmdWwgZm9yIGltcG9ydGVycywKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBBc3N1bWUgbm8gcGFyc2VyIGRvZXMgbm90IGVtaXQgZXJyb3Igd2l0aCB0aGlzIHBhcmFtZXRlciBpbiB2Q2FyZCAzLjAuCi0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGFkZHJlc3NWYWx1ZSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kRW1haWxMaW5lKGZpbmFsIGludCB0eXBlLCBmaW5hbCBTdHJpbmcgbGFiZWwsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmF3VmFsdWUsIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB0eXBlQXNTdHJpbmc7Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBFbWFpbC5UWVBFX0NVU1RPTTogewotICAgICAgICAgICAgICAgIGlmIChWQ2FyZFV0aWxzLmlzTW9iaWxlUGhvbmVMYWJlbChsYWJlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGxhYmVsKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKGxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSAiWC0iICsgbGFiZWw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEVtYWlsLlRZUEVfSE9NRTogewotICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRW1haWwuVFlQRV9XT1JLOiB7Ci0gICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBFbWFpbC5UWVBFX09USEVSOiB7Ci0gICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gbnVsbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRW1haWwuVFlQRV9NT0JJTEU6IHsKLSAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NFTEw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVua25vd24gRW1haWwgdHlwZTogIiArIHR5cGUpOwotICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBpZiAoaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodHlwZUFzU3RyaW5nKSkgewotICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQodHlwZUFzU3RyaW5nKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0VNQUlMLCBwYXJhbWV0ZXJMaXN0LAotICAgICAgICAgICAgICAgIHJhd1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRUZWxMaW5lKGZpbmFsIEludGVnZXIgdHlwZUFzSW50ZWdlciwgZmluYWwgU3RyaW5nIGxhYmVsLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRWYWx1ZSwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1RFTCk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotCi0gICAgICAgIGZpbmFsIGludCB0eXBlOwotICAgICAgICBpZiAodHlwZUFzSW50ZWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9PVEhFUjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHR5cGUgPSB0eXBlQXNJbnRlZ2VyOwotICAgICAgICB9Ci0KLSAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9IT01FOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGRBbGwoCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX1dPUks6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZEFsbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfRkFYX0hPTUU6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZEFsbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FLCBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0ZBWCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX0ZBWF9XT1JLOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGRBbGwoCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSywgVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9GQVgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9NT0JJTEU6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NFTEwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX1BBR0VSOiB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgcmVhc29uLCBidXQgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gaGFkCi0gICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgIlZPSUNFIiBpbnN0ZWFkIG9mICJQQUdFUiIKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QQUdFUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX09USEVSOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfQ0FSOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DQVIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX0NPTVBBTllfTUFJTjogewotICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gcmVsZXZhbnQgZmllbGQgaW4gdkNhcmQgKGF0IGxlYXN0IDIuMSkuCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLKTsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX0lTRE46IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0lTRE4pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX01BSU46IHsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX09USEVSX0ZBWDogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfRkFYKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9URUxFWDogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfVExYKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9XT1JLX01PQklMRTogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkQWxsKAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkssIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX1dPUktfUEFHRVI6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspOwotICAgICAgICAgICAgICAgIC8vIFNlZSBhYm92ZS4KLSAgICAgICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUEFHRVIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9NTVM6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX01TRyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfQ1VTVE9NOiB7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IGlnbm9yZSB0aGUgY3VzdG9tIHR5cGUuCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVkNhcmRVdGlscy5pc01vYmlsZVBob25lTGFiZWwobGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtSXNWMzApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBsYWJlbCBpcyBhcHByb3ByaWF0ZWx5IGVuY29kZWQgaW4gYXBwZW5kVHlwZVBhcmFtZXRlcnMuCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKGxhYmVsKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXBwZXJMYWJlbCA9IGxhYmVsLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChWQ2FyZFV0aWxzLmlzVmFsaWRJblYyMUJ1dFVua25vd25Ub0NvbnRhY3RzUGhvdGVUeXBlKHVwcGVyTGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZCh1cHBlckxhYmVsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4obGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBTdHJpY3RseSwgdkNhcmQgMi4xIGRvZXMgbm90IGFsbG93ICJYLSIgcGFyYW1ldGVyIHdpdGhvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICJUWVBFPSIgc3RyaW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoIlgtIiArIGxhYmVsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9SQURJTzoKLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9UVFlfVEREOgotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzUHJpbWFyeSkgewotICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJhbWV0ZXJMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgYXBwZW5kVW5jb21tb25QaG9uZVR5cGUobUJ1aWxkZXIsIHR5cGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcnMocGFyYW1ldGVyTGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFZhbHVlKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmRzIHBob25lIHR5cGUgc3RyaW5nIHdoaWNoIG1heSBub3QgYmUgYXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kVW5jb21tb25QaG9uZVR5cGUoZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyLCBmaW5hbCBJbnRlZ2VyIHR5cGUpIHsKLSAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgLy8gVGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIGZvciBEb0NvTW8gaGFkIGJlZW4gY29uc2VydmF0aXZlCi0gICAgICAgICAgICAvLyBhYm91dCBtaXNjZWxsYW5lb3VzIHR5cGVzLgotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9WT0lDRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGhvbmVUeXBlID0gVkNhcmRVdGlscy5nZXRQaG9uZVR5cGVTdHJpbmcodHlwZSk7Ci0gICAgICAgICAgICBpZiAocGhvbmVUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVyKHBob25lVHlwZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIChieSB2Q2FyZCkgUGhvbmUgdHlwZTogIiArIHR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGVuY29kZWRWYWx1ZSBNdXN0IGJlIGVuY29kZWQgYnkgQkFTRTY0IAotICAgICAqIEBwYXJhbSBwaG90b1R5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRQaG90b0xpbmUoZmluYWwgU3RyaW5nIGVuY29kZWRWYWx1ZSwgZmluYWwgU3RyaW5nIHBob3RvVHlwZSkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHRtcEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9QSE9UTyk7Ci0gICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgIGlmIChtSXNWMzApIHsKLSAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX0JBU0U2NF9WMzApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfQkFTRTY0X1YyMSk7Ci0gICAgICAgIH0KLSAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcih0bXBCdWlsZGVyLCBwaG90b1R5cGUpOwotICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKGVuY29kZWRWYWx1ZSk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHRtcFN0ciA9IHRtcEJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgdG1wQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGludCBsaW5lQ291bnQgPSAwOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdG1wU3RyLmxlbmd0aCgpOwotICAgICAgICBmaW5hbCBpbnQgbWF4TnVtRm9yRmlyc3RMaW5lID0gVkNhcmRDb25zdGFudHMuTUFYX0NIQVJBQ1RFUl9OVU1TX0JBU0U2NF9WMzAKLSAgICAgICAgICAgICAgICAtIFZDQVJEX0VORF9PRl9MSU5FLmxlbmd0aCgpOwotICAgICAgICBmaW5hbCBpbnQgbWF4TnVtSW5HZW5lcmFsID0gbWF4TnVtRm9yRmlyc3RMaW5lIC0gVkNBUkRfV1MubGVuZ3RoKCk7Ci0gICAgICAgIGludCBtYXhOdW0gPSBtYXhOdW1Gb3JGaXJzdExpbmU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKHRtcFN0ci5jaGFyQXQoaSkpOwotICAgICAgICAgICAgbGluZUNvdW50Kys7Ci0gICAgICAgICAgICBpZiAobGluZUNvdW50ID4gbWF4TnVtKSB7Ci0gICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX1dTKTsKLSAgICAgICAgICAgICAgICBtYXhOdW0gPSBtYXhOdW1JbkdlbmVyYWw7Ci0gICAgICAgICAgICAgICAgbGluZUNvdW50ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtQnVpbGRlci5hcHBlbmQodG1wQnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eShmaW5hbCBTdHJpbmcgbWltZVR5cGUsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICBpZiAoIXNBbGxvd2VkQW5kcm9pZFByb3BlcnR5U2V0LmNvbnRhaW5zKG1pbWVUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gVkNhcmRDb25zdGFudHMuTUFYX0RBVEFfQ09MVU1OOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoImRhdGEiICsgaSk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByYXdWYWx1ZUxpc3QuYWRkKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gbmVlZENoYXJzZXQgPQotICAgICAgICAgICAgKG1TaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0gJiYKLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd1ZhbHVlTGlzdCkpOwotICAgICAgICBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3VmFsdWVMaXN0KSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0FORFJPSURfQ1VTVE9NKTsKLSAgICAgICAgaWYgKG5lZWRDaGFyc2V0KSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1pbWVUeXBlKTsgIC8vIFNob3VsZCBub3QgYmUgZW5jb2RlZC4KLSAgICAgICAgZm9yIChTdHJpbmcgcmF3VmFsdWUgOiByYXdWYWx1ZUxpc3QpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkVmFsdWU7Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1ZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogb25lIGxpbmUgbWF5IGJlIHRvbyBodWdlLCB3aGljaCBtYXkgYmUgaW52YWxpZCBpbiB2Q2FyZCAzLjAKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgKHdoaWNoIHNheXMgIldoZW4gZ2VuZXJhdGluZyBhIGNvbnRlbnQgbGluZSwgbGluZXMgbG9uZ2VyIHRoYW4KLSAgICAgICAgICAgICAgICAvLyAgICAgICAgNzUgY2hhcmFjdGVycyBTSE9VTEQgYmUgZm9sZGVkIiksIHRob3VnaCBzZXZlcmFsCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIChldmVuIHdlbGwta25vd24pIGFwcGxpY2F0aW9ucyBkbyBub3QgY2FyZSB0aGlzLgotICAgICAgICAgICAgICAgIGVuY29kZWRWYWx1ZSA9IGVzY2FwZUNoYXJhY3RlcnMocmF3VmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSkgewotICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihwcm9wZXJ0eU5hbWUsIG51bGwsIHJhd1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbigKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QpIHsKLSAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24ocHJvcGVydHlOYW1lLCBudWxsLCByYXdWYWx1ZUxpc3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwgZmluYWwgU3RyaW5nIHJhd1ZhbHVlKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gbmVlZENoYXJzZXQgPQotICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKHJhd1ZhbHVlKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3VmFsdWUpKTsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIHBhcmFtZXRlckxpc3QsCi0gICAgICAgICAgICAgICAgcmF3VmFsdWUsIG5lZWRDaGFyc2V0LCByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwgZmluYWwgTGlzdDxTdHJpbmc+IHJhd1ZhbHVlTGlzdCkgewotICAgICAgICBib29sZWFuIG5lZWRDaGFyc2V0ID0KLSAgICAgICAgICAgIChtU2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtICYmCi0gICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShyYXdWYWx1ZUxpc3QpKTsKLSAgICAgICAgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd1ZhbHVlTGlzdCkpOwotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgcGFyYW1ldGVyTGlzdCwgcmF3VmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIG5lZWRDaGFyc2V0LCByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGVuZHMgb25lIGxpbmUgd2l0aCBhIGdpdmVuIHByb3BlcnR5IG5hbWUgYW5kIHZhbHVlLiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBTdHJpbmcgcmF3VmFsdWUpIHsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIHJhd1ZhbHVlLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgTGlzdDxTdHJpbmc+IHJhd1ZhbHVlTGlzdCkgewotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgcmF3VmFsdWVMaXN0LCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSwgZmluYWwgYm9vbGVhbiBuZWVkQ2hhcnNldCwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgIGFwcGVuZExpbmUocHJvcGVydHlOYW1lLCBudWxsLCByYXdWYWx1ZSwgbmVlZENoYXJzZXQsIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSkgewotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgcGFyYW1ldGVyTGlzdCwgcmF3VmFsdWUsIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSwgZmluYWwgYm9vbGVhbiBuZWVkQ2hhcnNldCwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChwcm9wZXJ0eU5hbWUpOwotICAgICAgICBpZiAocGFyYW1ldGVyTGlzdCAhPSBudWxsICYmIHBhcmFtZXRlckxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVycyhwYXJhbWV0ZXJMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZENoYXJzZXQpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRWYWx1ZTsKLSAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1ZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE86IG9uZSBsaW5lIG1heSBiZSB0b28gaHVnZSwgd2hpY2ggbWF5IGJlIGludmFsaWQgaW4gdkNhcmQgc3BlYywgdGhvdWdoCi0gICAgICAgICAgICAvLyAgICAgICBzZXZlcmFsIChldmVuIHdlbGwta25vd24pIGFwcGxpY2F0aW9ucyBkbyBub3QgY2FyZSB0aGlzLgotICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFZhbHVlKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIG5lZWRDaGFyc2V0LCBib29sZWFuIG5lZWRRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIG51bGwsIHJhd1ZhbHVlTGlzdCwgbmVlZENoYXJzZXQsIG5lZWRRdW90ZWRQcmludGFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QsCi0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcmF3VmFsdWVMaXN0LCBmaW5hbCBib29sZWFuIG5lZWRDaGFyc2V0LAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBuZWVkUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChwcm9wZXJ0eU5hbWUpOwotICAgICAgICBpZiAocGFyYW1ldGVyTGlzdCAhPSBudWxsICYmIHBhcmFtZXRlckxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVycyhwYXJhbWV0ZXJMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZENoYXJzZXQpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZWVkUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChTdHJpbmcgcmF3VmFsdWUgOiByYXdWYWx1ZUxpc3QpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkVmFsdWU7Ci0gICAgICAgICAgICBpZiAobmVlZFF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRWYWx1ZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdWYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IG9uZSBsaW5lIG1heSBiZSB0b28gaHVnZSwgd2hpY2ggbWF5IGJlIGludmFsaWQgaW4gdkNhcmQgMy4wCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICh3aGljaCBzYXlzICJXaGVuIGdlbmVyYXRpbmcgYSBjb250ZW50IGxpbmUsIGxpbmVzIGxvbmdlciB0aGFuCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIDc1IGNoYXJhY3RlcnMgU0hPVUxEIGJlIGZvbGRlZCIpLCB0aG91Z2ggc2V2ZXJhbAotICAgICAgICAgICAgICAgIC8vICAgICAgICAoZXZlbiB3ZWxsLWtub3duKSBhcHBsaWNhdGlvbnMgZG8gbm90IGNhcmUgdGhpcy4KLSAgICAgICAgICAgICAgICBlbmNvZGVkVmFsdWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd1ZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVkNBUkRfUEFSQU1fU0VQQVJBVE9SIG11c3QgYmUgYXBwZW5kZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGJlaW5nIGNhbGxlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kVHlwZVBhcmFtZXRlcnMoZmluYWwgTGlzdDxTdHJpbmc+IHR5cGVzKSB7Ci0gICAgICAgIC8vIFdlIG1heSBoYXZlIHRvIG1ha2UgdGhpcyBjb21tYSBzZXBhcmF0ZWQgZm9ybSBsaWtlICJUWVBFPURPTSxXT1JLIiBpbiB0aGUgZnV0dXJlLAotICAgICAgICAvLyB3aGljaCB3b3VsZCBiZSByZWNvbW1lbmRlZCB3YXkgaW4gdmNhcmQgMy4wIHRob3VnaCBub3QgdmFsaWQgaW4gdkNhcmQgMi4xLgotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdHlwZVZhbHVlIDogdHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1YzMChtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgIC8vIE5vdGU6IHZDYXJkIDMuMCBzcGVjaWZpZXMgdGhlIGRpZmZlcmVudCB0eXBlIG9mIGFjY2VwdGFibGUgdHlwZSBTdHJpbmdzLCBidXQKLSAgICAgICAgICAgICAgICAvLyAgICAgICB3ZSBkb24ndCBlbWl0IHRoYXQga2luZCBvZiB2Q2FyZCAzLjAgc3BlY2lmaWMgdHlwZSBzaW5jZSB0aGVyZSBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAvLyAgICAgICBoaWdoIHByb2JhYmlseXR5IGluIHdoaWNoIGV4dGVybmFsIGltcG9ydGVycyBjYW5ub3QgdW5kZXJzdGFuZCB0aGVtLgotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgLy8gZS5nLiBUWVBFPSJcdTU3OEJcdTMwNkJcdTMwODciICh2Q2FyZCAzLjAgYWxsb3dzIG5vbi1Bc2NpaSBjaGFyYWN0ZXJzIGlmIHRoZXkKLSAgICAgICAgICAgICAgICAvLyAgICAgIGFyZSBxdW90ZWQuKQotICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVyKFZDYXJkVXRpbHMudG9TdHJpbmdBdmFpbGFibGVBc1YzMFBhcmFtZVZhbHVlKHR5cGVWYWx1ZSkpOwotICAgICAgICAgICAgfSBlbHNlIHsgIC8vIHZDYXJkIDIuMQotICAgICAgICAgICAgICAgIGlmICghVkNhcmRVdGlscy5pc1YyMVdvcmQodHlwZVZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXIodHlwZVZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZDQVJEX1BBUkFNX1NFUEFSQVRPUiBtdXN0IGJlIGFwcGVuZGVkIGJlZm9yZSB0aGlzIG1ldGhvZCBiZWluZyBjYWxsZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFR5cGVQYXJhbWV0ZXIoZmluYWwgU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcihtQnVpbGRlciwgdHlwZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFR5cGVQYXJhbWV0ZXIoZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyLCBmaW5hbCBTdHJpbmcgdHlwZSkgewotICAgICAgICAvLyBSZWZyYWluIGZyb20gdXNpbmcgYXBwZW5kVHlwZSgpIHNvIHRoYXQgIlRZUEU9IiBpcyBub3QgYmUgYXBwZW5kZWQgd2hlbiB0aGUKLSAgICAgICAgLy8gZGV2aWNlIGlzIERvQ29NbydzIChqdXN0IGZvciBzYWZldHkpLgotICAgICAgICAvLwotICAgICAgICAvLyBOb3RlOiBJbiB2Q2FyZCAzLjAsIFR5cGUgc3RyaW5ncyBhbHNvIGNhbiBiZSBsaWtlIHRoaXM6ICJUWVBFPUhPTUUsUFJFRiIKLSAgICAgICAgaWYgKChtSXNWMzAgfHwgbUFwcGVuZFR5cGVQYXJhbU5hbWUpICYmICFtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpLmFwcGVuZChWQ0FSRF9QQVJBTV9FUVVBTCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5hcHBlbmQodHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHByb3BlcnR5IGxpbmUgc2hvdWxkIGNvbnRhaW4gY2hhcnNldCBwYXJhbWV0ZXIKLSAgICAgKiBpbmZvcm1hdGlvbi4gVGhpcyBtZXRob2QgbWF5IHJldHVybiB0cnVlIGV2ZW4gd2hlbiB2Q2FyZCB2ZXJzaW9uIGlzIDMuMC4KLSAgICAgKgotICAgICAqIFN0cmljdGx5LCBhZGRpbmcgY2hhcnNldCBpbmZvcm1hdGlvbiBpcyBpbnZhbGlkIGluIFZDYXJkIDMuMC4KLSAgICAgKiBIb3dldmVyIHdlJ2xsIGFkZCB0aGUgaW5mbyBvbmx5IHdoZW4gY2hhcnNldCB3ZSB1c2UgaXMgbm90IFVURi04Ci0gICAgICogaW4gdkNhcmQgMy4wIGZvcm1hdCwgc2luY2UgcGFyc2VyIHNpZGUgbWF5IGJlIGFibGUgdG8gdXNlIHRoZSBjaGFyc2V0Ci0gICAgICogdmlhIHRoaXMgZmllbGQsIHRob3VnaCB3ZSBtYXkgZW5jb3VudGVyIGFub3RoZXIgcHJvYmxlbSBieSBhZGRpbmcgaXQuCi0gICAgICoKLSAgICAgKiBlLmcuIEphcGFuZXNlIG1vYmlsZSBwaG9uZXMgdXNlIFNoaWZ0X0ppcyB3aGlsZSBSRkMgMjQyNgotICAgICAqIHJlY29tbWVuZHMgVVRGLTguIEJ5IGFkZGluZyB0aGlzIGZpZWxkLCBwYXJzZXJzIG1heSBiZSBhYmxlCi0gICAgICogdG8ga25vdyB0aGlzIHRleHQgaXMgTk9UIFVURi04IGJ1dCBTaGlmdF9KaXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShTdHJpbmcuLi5wcm9wZXJ0eVZhbHVlTGlzdCkgewotICAgICAgICBpZiAoIW1TaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKFN0cmluZyBwcm9wZXJ0eVZhbHVlIDogcHJvcGVydHlWYWx1ZUxpc3QpIHsKLSAgICAgICAgICAgIGlmICghVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShwcm9wZXJ0eVZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBlbmNvZGVRdW90ZWRQcmludGFibGUoZmluYWwgU3RyaW5nIHN0cikgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc3RyKSkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgaW50IGxpbmVDb3VudCA9IDA7Ci0gICAgICAgIGJ5dGVbXSBzdHJBcnJheSA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0ckFycmF5ID0gc3RyLmdldEJ5dGVzKG1DaGFyc2V0U3RyaW5nKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiQ2hhcnNldCAiICsgbUNoYXJzZXRTdHJpbmcgKyAiIGNhbm5vdCBiZSB1c2VkLiAiCi0gICAgICAgICAgICAgICAgICAgICsgIlRyeSBkZWZhdWx0IGNoYXJzZXQiKTsKLSAgICAgICAgICAgIHN0ckFycmF5ID0gc3RyLmdldEJ5dGVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGluZGV4IDwgc3RyQXJyYXkubGVuZ3RoKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChTdHJpbmcuZm9ybWF0KCI9JTAyWCIsIHN0ckFycmF5W2luZGV4XSkpOwotICAgICAgICAgICAgaW5kZXggKz0gMTsKLSAgICAgICAgICAgIGxpbmVDb3VudCArPSAzOwotCi0gICAgICAgICAgICBpZiAobGluZUNvdW50ID49IDY3KSB7Ci0gICAgICAgICAgICAgICAgLy8gU3BlY2lmaWNhdGlvbiByZXF1aXJlcyBDUkxGIG11c3QgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZQotICAgICAgICAgICAgICAgIC8vIGxlbmd0aCBvZiB0aGUgbGluZQotICAgICAgICAgICAgICAgIC8vIGJlY29tZXMgbW9yZSB0aGFuIDc2LgotICAgICAgICAgICAgICAgIC8vIEFzc3VtaW5nIHRoYXQgdGhlIG5leHQgY2hhcmFjdGVyIGlzIGEgbXVsdGktYnl0ZSBjaGFyYWN0ZXIsCi0gICAgICAgICAgICAgICAgLy8gaXQgd2lsbCBiZWNvbWUKLSAgICAgICAgICAgICAgICAvLyA2IGJ5dGVzLgotICAgICAgICAgICAgICAgIC8vIDc2IC0gNiAtIDMgPSA2NwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI9XHJcbiIpOwotICAgICAgICAgICAgICAgIGxpbmVDb3VudCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGVuZCAnXCcgdG8gdGhlIGNoYXJhY3RlcnMgd2hpY2ggc2hvdWxkIGJlIGVzY2FwZWQuIFRoZSBjaGFyYWN0ZXIgc2V0IGlzIGRpZmZlcmVudAotICAgICAqIG5vdCBvbmx5IGJldHdlZW4gdkNhcmQgMi4xIGFuZCB2Q2FyZCAzLjAgYnV0IGFsc28gYW1vbmcgZWFjaCBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgUXVvdGVkLVByaW50YWJsZSBzdHJpbmcgbXVzdCBub3QgYmUgaW5wdXQgaGVyZS4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZmFsbHRocm91Z2giKQotICAgIHByaXZhdGUgU3RyaW5nIGVzY2FwZUNoYXJhY3RlcnMoZmluYWwgU3RyaW5nIHVuZXNjYXBlZCkgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkodW5lc2NhcGVkKSkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciB0bXBCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHVuZXNjYXBlZC5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgY2hhciBjaCA9IHVuZXNjYXBlZC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnOyc6IHsKLSAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoJ1xcJyk7Ci0gICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKCc7Jyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICdccic6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIG5leHRDaGFyID0gdW5lc2NhcGVkLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAnXG4nOiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEluIHZDYXJkIDIuMSwgdGhlcmUncyBubyBzcGVjaWZpY2F0aW9uIGFib3V0IHRoaXMsIHdoaWxlCi0gICAgICAgICAgICAgICAgICAgIC8vIHZDYXJkIDMuMCBleHBsaWNpdGx5IHJlcXVpcmVzIHRoaXMgc2hvdWxkIGJlIGVuY29kZWQgdG8gIlxuIi4KLSAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoIlxcbiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAnXFwnOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSXNWMzApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKCJcXFxcIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgJzwnOgotICAgICAgICAgICAgICAgIGNhc2UgJz4nOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKCdcXCcpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICcsJzogewotICAgICAgICAgICAgICAgICAgICBpZiAobUlzVjMwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgiXFwsIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRtcEJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBpZiAoIW1FbmRBcHBlbmRlZCkgewotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9DTEFTUywgVkNBUkRfREFUQV9QVUJMSUMpOwotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9SRURVQ1RJT04sICIiKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfTk8sICIiKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfRENNX0hNTl9NT0RFLCAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0VORCwgVkNBUkRfREFUQV9WQ0FSRCk7Ci0gICAgICAgICAgICBtRW5kQXBwZW5kZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbXBvc2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb21wb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZThiNjY1Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbXBvc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci0gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotICogdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRW50aXR5SXRlcmF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eS5OYW1lZENvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHNFbnRpdHk7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FbWFpbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkV2ZW50OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuSW07Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5OaWNrbmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Pcmdhbml6YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob3RvOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUmVsYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkTmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5XZWJzaXRlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5DaGFyc2V0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBjbGFzcyBmb3IgY29tcG9zaW5nIFZDYXJkIGZyb20gQ29udGFjdHMgaW5mb3JtYXRpb24uIE5vdGUgdGhhdCB0aGlzIGlzCi0gKiBjb21wbGV0ZWx5IGRpZmZlcm50IGltcGxlbWVudGF0aW9uIGZyb20KLSAqIGFuZHJvaWQuc3luY21sLnBpbS52Y2FyZC5WQ2FyZENvbXBvc2VyLCB3aGljaCBpcyBub3QgbWFpbnRhaW5lZCBhbnltb3JlLgotICogPC9wPgotICoKLSAqIDxwPgotICogVXN1YWxseSwgdGhpcyBjbGFzcyBzaG91bGQgYmUgdXNlZCBsaWtlIHRoaXMuCi0gKiA8L3A+Ci0gKgotICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPlZDYXJkQ29tcG9zZXIgY29tcG9zZXIgPSBudWxsOwotICogdHJ5IHsKLSAqICAgICBjb21wb3NlciA9IG5ldyBWQ2FyZENvbXBvc2VyKGNvbnRleHQpOwotICogICAgIGNvbXBvc2VyLmFkZEhhbmRsZXIoCi0gKiAgICAgICAgICAgICBjb21wb3Nlci5uZXcgSGFuZGxlckZvck91dHB1dFN0cmVhbShvdXRwdXRTdHJlYW0pKTsKLSAqICAgICBpZiAoIWNvbXBvc2VyLmluaXQoKSkgewotICogICAgICAgICAvLyBEbyBzb21ldGhpbmcgaGFuZGxpbmcgdGhlIHNpdHVhdGlvbi4KLSAqICAgICAgICAgcmV0dXJuOwotICogICAgIH0KLSAqICAgICB3aGlsZSAoIWNvbXBvc2VyLmlzQWZ0ZXJMYXN0KCkpIHsKLSAqICAgICAgICAgaWYgKG1DYW5jZWxlZCkgewotICogICAgICAgICAgICAgLy8gQXNzdW1lIGEgdXNlciBtYXkgY2FuY2VsIHRoaXMgb3BlcmF0aW9uIGR1cmluZyB0aGUgZXhwb3J0LgotICogICAgICAgICAgICAgcmV0dXJuOwotICogICAgICAgICB9Ci0gKiAgICAgICAgIGlmICghY29tcG9zZXIuY3JlYXRlT25lRW50cnkoKSkgewotICogICAgICAgICAgICAgLy8gRG8gc29tZXRoaW5nIGhhbmRsaW5nIHRoZSBlcnJvciBzaXR1YXRpb24uCi0gKiAgICAgICAgICAgICByZXR1cm47Ci0gKiAgICAgICAgIH0KLSAqICAgICB9Ci0gKiB9IGZpbmFsbHkgewotICogICAgIGlmIChjb21wb3NlciAhPSBudWxsKSB7Ci0gKiAgICAgICAgIGNvbXBvc2VyLnRlcm1pbmF0ZSgpOwotICogICAgIH0KLSAqIH0gPC9wcmU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZENvbXBvc2VyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZENvbXBvc2VyIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUEhPTkVfVFlQRSA9IFBob25lLlRZUEVfSE9NRTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BPU1RBTF9UWVBFID0gU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9FTUFJTF9UWVBFID0gRW1haWwuVFlQRV9PVEhFUjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVBU09OX0ZBSUxFRF9UT19HRVRfREFUQUJBU0VfSU5GTyA9Ci0gICAgICAgICJGYWlsZWQgdG8gZ2V0IGRhdGFiYXNlIGluZm9ybWF0aW9uIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVBU09OX05PX0VOVFJZID0KLSAgICAgICAgIlRoZXJlJ3Mgbm8gZXhwb3J0YWJsZSBpbiB0aGUgZGF0YWJhc2UiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9SRUFTT05fTk9UX0lOSVRJQUxJWkVEID0KLSAgICAgICAgIlRoZSB2Q2FyZCBjb21wb3NlciBvYmplY3QgaXMgbm90IGNvcnJlY3RseSBpbml0aWFsaXplZCI7Ci0KLSAgICAvKiogU2hvdWxkIGJlIHZpc2libGUgb25seSBmcm9tIGRldmVsb3BlcnMuLi4gKG5vIG5lZWQgdG8gdHJhbnNsYXRlLCBob3BlZnVsbHkpICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9SRUFTT05fVU5TVVBQT1JURURfVVJJID0KLSAgICAgICAgIlRoZSBVcmkgdkNhcmQgY29tcG9zZXIgcmVjZWl2ZWQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY29tcG9zZXIuIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0VSUk9SID0gIk5vIGVycm9yIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfU1RSSU5HX0RPQ09NTyA9ICJkb2NvbW8iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNISUZUX0pJUyA9ICJTSElGVF9KSVMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfOCA9ICJVVEYtOCI7Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWFsIFVSSSBmb3IgdGVzdGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9URVNUX0FVVEhPUklUWSA9ICJjb20uYW5kcm9pZC51bml0X3Rlc3RzLnZjYXJkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBWQ0FSRF9URVNUX0FVVEhPUklUWV9VUkkgPQotICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgVkNBUkRfVEVTVF9BVVRIT1JJVFkpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRBQ1RTX1RFU1RfQ09OVEVOVF9VUkkgPQotICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChWQ0FSRF9URVNUX0FVVEhPUklUWV9VUkksICJjb250YWN0cyIpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gc0ltTWFwOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgc0ltTWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOwotICAgICAgICBzSW1NYXAucHV0KEltLlBST1RPQ09MX0FJTSwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9BSU0pOwotICAgICAgICBzSW1NYXAucHV0KEltLlBST1RPQ09MX01TTiwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9NU04pOwotICAgICAgICBzSW1NYXAucHV0KEltLlBST1RPQ09MX1lBSE9PLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1lBSE9PKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9JQ1EsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfSUNRKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9KQUJCRVIsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfSkFCQkVSKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9TS1lQRSwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9TS1lQRV9VU0VSTkFNRSk7Ci0gICAgICAgIC8vIEdvb2dsZSB0YWxrIGlzIGEgc3BlY2lhbCBjYXNlLgotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE9uZUVudHJ5SGFuZGxlciB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uSW5pdChDb250ZXh0IGNvbnRleHQpOwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkVudHJ5Q3JlYXRlZChTdHJpbmcgdmNhcmQpOwotICAgICAgICBwdWJsaWMgdm9pZCBvblRlcm1pbmF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFuIHVzZWZ1bCBleGFtcGxlIGhhbmRsZXIsIHdoaWNoIGVtaXRzIFZDYXJkIFN0cmluZyB0byBvdXRwdXRzdHJlYW0gb25lIGJ5IG9uZS4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhlIGlucHV0IE91dHB1dFN0cmVhbSBvYmplY3QgaXMgY2xvc2VkKCkgb24ge0BsaW5rICNvblRlcm1pbmF0ZSgpfS4KLSAgICAgKiBNdXN0IG5vdCBjbG9zZSB0aGUgc3RyZWFtIG91dHNpZGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBIYW5kbGVyRm9yT3V0cHV0U3RyZWFtIGltcGxlbWVudHMgT25lRW50cnlIYW5kbGVyIHsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImhpZGluZyIpCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gInZjYXJkLlZDYXJkQ29tcG9zZXIuSGFuZGxlckZvck91dHB1dFN0cmVhbSI7Ci0KLSAgICAgICAgZmluYWwgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gbU91dHB1dFN0cmVhbTsgLy8gbVdyaXRlciB3aWxsIGNsb3NlIHRoaXMuCi0gICAgICAgIHByaXZhdGUgV3JpdGVyIG1Xcml0ZXI7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1PblRlcm1pbmF0ZUlzQ2FsbGVkID0gZmFsc2U7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElucHV0IHN0cmVhbSB3aWxsIGJlIGNsb3NlZCBvbiB0aGUgZGV0cnVjdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBIYW5kbGVyRm9yT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHsKLSAgICAgICAgICAgIG1PdXRwdXRTdHJlYW0gPSBvdXRwdXRTdHJlYW07Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkluaXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Xcml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRTdHJlYW0sIG1DaGFyc2V0U3RyaW5nKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVuc3VwcG9ydGVkIGNoYXJzZXQ6ICIgKyBtQ2hhcnNldFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgbUVycm9yUmVhc29uID0gIkVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQgKHVzdWFsbHkgdGhpcyBkb2VzIG5vdCBoYXBwZW4hKTogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtQ2hhcnNldFN0cmluZzsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgb25lIGVtcHR5IGVudHJ5LgotICAgICAgICAgICAgICAgICAgICBtV3JpdGVyLndyaXRlKGNyZWF0ZU9uZUVudHJ5SW50ZXJuYWwoIi0xIiwgbnVsbCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFZDYXJkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlZDYXJkRXhjZXB0aW9uIGhhcyBiZWVuIHRocm93biBkdXJpbmcgb24gSW5pdCgpOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIklPRXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBleHBvcnRPbmVDb250YWN0RGF0YTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9ICJJT0V4Y2VwdGlvbiBvY2N1cnJlZDogIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkVudHJ5Q3JlYXRlZChTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVdyaXRlci53cml0ZSh2Y2FyZCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgZXhwb3J0T25lQ29udGFjdERhdGE6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgbUVycm9yUmVhc29uID0gIklPRXhjZXB0aW9uIG9jY3VycmVkOiAiICsgZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblRlcm1pbmF0ZSgpIHsKLSAgICAgICAgICAgIG1PblRlcm1pbmF0ZUlzQ2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChtV3JpdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBGbHVzaCBhbmQgc3luYyB0aGUgZGF0YSBzbyB0aGF0IGEgdXNlciBpcyBhYmxlIHRvIHB1bGwKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFNEQ2FyZCBqdXN0IGFmdGVyCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleHBvcnQuCi0gICAgICAgICAgICAgICAgICAgIG1Xcml0ZXIuZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1PdXRwdXRTdHJlYW0gIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1PdXRwdXRTdHJlYW0gaW5zdGFuY2VvZiBGaWxlT3V0cHV0U3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGaWxlT3V0cHV0U3RyZWFtKSBtT3V0cHV0U3RyZWFtKS5nZXRGRCgpLnN5bmMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU9FeGNlcHRpb24gZHVyaW5nIGNsb3NpbmcgdGhlIG91dHB1dCBzdHJlYW06ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBmaW5hbGl6ZSgpIHsKLSAgICAgICAgICAgIGlmICghbU9uVGVybWluYXRlSXNDYWxsZWQpIHsKLSAgICAgICAgICAgICAgICBvblRlcm1pbmF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgaW50IG1WQ2FyZFR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1DYXJlSGFuZGxlckVycm9yczsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0RvQ29NbzsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVVzZXNTaGlmdEppczsKLSAgICBwcml2YXRlIEN1cnNvciBtQ3Vyc29yOwotICAgIHByaXZhdGUgaW50IG1JZENvbHVtbjsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DaGFyc2V0U3RyaW5nOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVGVybWluYXRlSXNDYWxsZWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9uZUVudHJ5SGFuZGxlcj4gbUhhbmRsZXJMaXN0OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUVycm9yUmVhc29uID0gTk9fRVJST1I7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzQ29udGFjdHNQcm9qZWN0aW9uID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgQ29udGFjdHMuX0lELAotICAgIH07Ci0KLSAgICBwdWJsaWMgVkNhcmRDb21wb3NlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RFRkFVTFQsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZENvbXBvc2VyKENvbnRleHQgY29udGV4dCwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICB0aGlzKGNvbnRleHQsIHZjYXJkVHlwZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQ29tcG9zZXIoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgdmNhcmRUeXBlU3RyLCBib29sZWFuIGNhcmVIYW5kbGVyRXJyb3JzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgVkNhcmRDb25maWcuZ2V0VkNhcmRUeXBlRnJvbVN0cmluZyh2Y2FyZFR5cGVTdHIpLCBjYXJlSGFuZGxlckVycm9ycyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGZvciBzdXBwb3J0aW5nIGNhbGwgbG9nIGVudHJ5IHZDYXJkIGNvbXBvc2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVkNhcmRDb21wb3NlcihmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIGludCB2Y2FyZFR5cGUsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGNhcmVIYW5kbGVyRXJyb3JzKSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVZDYXJkVHlwZSA9IHZjYXJkVHlwZTsKLSAgICAgICAgbUNhcmVIYW5kbGVyRXJyb3JzID0gY2FyZUhhbmRsZXJFcnJvcnM7Ci0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotCi0gICAgICAgIG1Jc0RvQ29NbyA9IFZDYXJkQ29uZmlnLmlzRG9Db01vKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Vc2VzU2hpZnRKaXMgPSBWQ2FyZENvbmZpZy51c2VzU2hpZnRKaXModmNhcmRUeXBlKTsKLSAgICAgICAgbUhhbmRsZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxPbmVFbnRyeUhhbmRsZXI+KCk7Ci0KLSAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXQ7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihTSElGVF9KSVMsICJkb2NvbW8iKS5uYW1lKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJEb0NvTW8tc3BlY2lmaWMgU0hJRlRfSklTIHdhcyBub3QgZm91bmQuIFVzZSBTSElGVF9KSVMgYXMgaXMuIik7Ci0gICAgICAgICAgICAgICAgY2hhcnNldCA9IFNISUZUX0pJUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DaGFyc2V0U3RyaW5nID0gY2hhcnNldDsKLSAgICAgICAgfSBlbHNlIGlmIChtVXNlc1NoaWZ0SmlzKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2hhcnNldDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXRVdGlscy5jaGFyc2V0Rm9yVmVuZG9yKFNISUZUX0pJUykubmFtZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVmVuZG9yLXNwZWNpZmljIFNISUZUX0pJUyB3YXMgbm90IGZvdW5kLiBVc2UgU0hJRlRfSklTIGFzIGlzLiIpOwotICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBTSElGVF9KSVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2hhcnNldFN0cmluZyA9IGNoYXJzZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ2hhcnNldFN0cmluZyA9IFVURl84OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHtAbGluayAjaW5pdCgpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRIYW5kbGVyKE9uZUVudHJ5SGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1IYW5kbGVyTGlzdC5hZGQoaGFuZGxlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSB3aGVuIGluaXRpYWxpemF0aW9uIGlzIHN1Y2Nlc3NmdWwgYW5kIGFsbCB0aGUgb3RoZXIKLSAgICAgKiAgICAgICAgICBtZXRob2RzIGFyZSBhdmFpbGFibGUuIFJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGluaXQoKSB7Ci0gICAgICAgIHJldHVybiBpbml0KG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGluaXQoZmluYWwgU3RyaW5nIHNlbGVjdGlvbiwgZmluYWwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgewotICAgICAgICByZXR1cm4gaW5pdChDb250YWN0cy5DT05URU5UX1VSSSwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyB1bnN0YWJsZSBpbnRlcmZhY2UsIG1heSBiZSBkZWxldGVkIGluIHRoZSBmdXR1cmUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaW5pdChmaW5hbCBVcmkgY29udGVudFVyaSwgZmluYWwgU3RyaW5nIHNlbGVjdGlvbiwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIGZpbmFsIFN0cmluZyBzb3J0T3JkZXIpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRVcmkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1DYXJlSGFuZGxlckVycm9ycykgewotICAgICAgICAgICAgTGlzdDxPbmVFbnRyeUhhbmRsZXI+IGZpbmlzaGVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8T25lRW50cnlIYW5kbGVyPigKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXJMaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKE9uZUVudHJ5SGFuZGxlciBoYW5kbGVyIDogbUhhbmRsZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGVyLm9uSW5pdChtQ29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChPbmVFbnRyeUhhbmRsZXIgZmluaXNoZWQgOiBmaW5pc2hlZExpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkLm9uVGVybWluYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEp1c3QgaWdub3JlIHRoZSBmYWxzZSByZXR1cm5lZCBmcm9tIG9uSW5pdCgpLgotICAgICAgICAgICAgZm9yIChPbmVFbnRyeUhhbmRsZXIgaGFuZGxlciA6IG1IYW5kbGVyTGlzdCkgewotICAgICAgICAgICAgICAgIGhhbmRsZXIub25Jbml0KG1Db250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZ1tdIHByb2plY3Rpb247Ci0gICAgICAgIGlmIChDb250YWN0cy5DT05URU5UX1VSSS5lcXVhbHMoY29udGVudFVyaSkgfHwKLSAgICAgICAgICAgICAgICBDT05UQUNUU19URVNUX0NPTlRFTlRfVVJJLmVxdWFscyhjb250ZW50VXJpKSkgewotICAgICAgICAgICAgcHJvamVjdGlvbiA9IHNDb250YWN0c1Byb2plY3Rpb247Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRXJyb3JSZWFzb24gPSBGQUlMVVJFX1JFQVNPTl9VTlNVUFBPUlRFRF9VUkk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnNvciA9IG1Db250ZW50UmVzb2x2ZXIucXVlcnkoCi0gICAgICAgICAgICAgICAgY29udGVudFVyaSwgcHJvamVjdGlvbiwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBzb3J0T3JkZXIpOwotCi0gICAgICAgIGlmIChtQ3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9IEZBSUxVUkVfUkVBU09OX0ZBSUxFRF9UT19HRVRfREFUQUJBU0VfSU5GTzsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRDb3VudCgpID09IDAgfHwgIW1DdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJTUUxpdGVFeGNlcHRpb24gb24gQ3Vyc29yI2Nsb3NlKCk6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIG1DdXJzb3IgPSBudWxsOwotICAgICAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9IEZBSUxVUkVfUkVBU09OX05PX0VOVFJZOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbUlkQ29sdW1uID0gbUN1cnNvci5nZXRDb2x1bW5JbmRleChDb250YWN0cy5fSUQpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNyZWF0ZU9uZUVudHJ5KCkgewotICAgICAgICByZXR1cm4gY3JlYXRlT25lRW50cnkobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGdldEVudGl0eUl0ZXJhdG9yTWV0aG9kIEZvciBEZXBlbmRlbmN5IEluamVjdGlvbi4KLSAgICAgKiBAaGlkZSBqdXN0IGZvciB0ZXN0aW5nLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNyZWF0ZU9uZUVudHJ5KE1ldGhvZCBnZXRFbnRpdHlJdGVyYXRvck1ldGhvZCkgewotICAgICAgICBpZiAobUN1cnNvciA9PSBudWxsIHx8IG1DdXJzb3IuaXNBZnRlckxhc3QoKSkgewotICAgICAgICAgICAgbUVycm9yUmVhc29uID0gRkFJTFVSRV9SRUFTT05fTk9UX0lOSVRJQUxJWkVEOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyB2Y2FyZDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtSWRDb2x1bW4gPj0gMCkgewotICAgICAgICAgICAgICAgIHZjYXJkID0gY3JlYXRlT25lRW50cnlJbnRlcm5hbChtQ3Vyc29yLmdldFN0cmluZyhtSWRDb2x1bW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiSW5jb3JyZWN0IG1JZENvbHVtbjogIiArIG1JZENvbHVtbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFZDYXJkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJWQ2FyZEV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZXJyb3IpIHsKLSAgICAgICAgICAgIC8vIE1heWJlIHNvbWUgZGF0YSAoZS5nLiBwaG90bykgaXMgdG9vIGJpZyB0byBoYXZlIGluIG1lbW9yeS4gQnV0IGl0Ci0gICAgICAgICAgICAvLyBzaG91bGQgYmUgcmFyZS4KLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJPdXRPZk1lbW9yeUVycm9yIG9jY3VyZWQuIElnbm9yZSB0aGUgZW50cnkuIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZ2MoKTsKLSAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB0ZWxsIHVzZXJzIHdoYXQgaGFwcGVuZWQ/Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1DdXJzb3IubW92ZVRvTmV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjYXJlIHRoZSBPdXRPZk1lbW9yeUVycm9yIG9uIHRoZSBoYW5kbGVyIHNpZGUKLSAgICAgICAgLy8gOi1QCi0gICAgICAgIGlmIChtQ2FyZUhhbmRsZXJFcnJvcnMpIHsKLSAgICAgICAgICAgIExpc3Q8T25lRW50cnlIYW5kbGVyPiBmaW5pc2hlZExpc3QgPSBuZXcgQXJyYXlMaXN0PE9uZUVudHJ5SGFuZGxlcj4oCi0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyTGlzdC5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChPbmVFbnRyeUhhbmRsZXIgaGFuZGxlciA6IG1IYW5kbGVyTGlzdCkgewotICAgICAgICAgICAgICAgIGlmICghaGFuZGxlci5vbkVudHJ5Q3JlYXRlZCh2Y2FyZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGhhbmRsZXIgOiBtSGFuZGxlckxpc3QpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVyLm9uRW50cnlDcmVhdGVkKHZjYXJkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZU9uZUVudHJ5SW50ZXJuYWwoZmluYWwgU3RyaW5nIGNvbnRhY3RJZCwKLSAgICAgICAgICAgIE1ldGhvZCBnZXRFbnRpdHlJdGVyYXRvck1ldGhvZCkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgTGlzdDxDb250ZW50VmFsdWVzPj4gY29udGVudFZhbHVlc0xpc3RNYXAgPQotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxDb250ZW50VmFsdWVzPj4oKTsKLSAgICAgICAgLy8gVGhlIHJlc29sdmVyIG1heSByZXR1cm4gdGhlIGVudGl0eSBpdGVyYXRvciB3aXRoIG5vIGRhdGEuIEl0IGlzIHBvc3NpYmxlLgotICAgICAgICAvLyBlLmcuIElmIGFsbCB0aGUgZGF0YSBpbiB0aGUgY29udGFjdCBvZiB0aGUgZ2l2ZW4gY29udGFjdCBpZCBhcmUgbm90IGV4cG9ydGFibGUgb25lcywKLSAgICAgICAgLy8gICAgICB0aGV5IGFyZSBoaWRkZW4gZnJvbSB0aGUgdmlldyBvZiB0aGlzIG1ldGhvZCwgdGhvdWdoIGNvbnRhY3QgaWQgaXRzZWxmIGV4aXN0cy4KLSAgICAgICAgRW50aXR5SXRlcmF0b3IgZW50aXR5SXRlcmF0b3IgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgVXJpIHVyaSA9IFJhd0NvbnRhY3RzRW50aXR5LkNPTlRFTlRfVVJJLmJ1aWxkVXBvbigpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmRRdWVyeVBhcmFtZXRlcihEYXRhLkZPUl9FWFBPUlRfT05MWSwgIjEiKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZWxlY3Rpb24gPSBEYXRhLkNPTlRBQ1RfSUQgKyAiPT8iOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gc2VsZWN0aW9uQXJncyA9IG5ldyBTdHJpbmdbXSB7Y29udGFjdElkfTsKLSAgICAgICAgICAgIGlmIChnZXRFbnRpdHlJdGVyYXRvck1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGJyYW5jaCBpcyBleGVjdXRlZCBieSBzb21lIHRlc3RzIG9ubHkKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBlbnRpdHlJdGVyYXRvciA9IChFbnRpdHlJdGVyYXRvcilnZXRFbnRpdHlJdGVyYXRvck1ldGhvZC5pbnZva2UobnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFJlc29sdmVyLCB1cmksIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd246ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGhhcyBiZWVuIHRocm93bjogIik7Ci0gICAgICAgICAgICAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50W10gc3RhY2tUcmFjZUVsZW1lbnRzID0gZS5nZXRDYXVzZSgpLmdldFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdGFja1RyYWNlRWxlbWVudCBlbGVtZW50IDogc3RhY2tUcmFjZUVsZW1lbnRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiICAgIGF0ICIgKyBlbGVtZW50LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd246ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW50aXR5SXRlcmF0b3IgPSBSYXdDb250YWN0cy5uZXdFbnRpdHlJdGVyYXRvcihtQ29udGVudFJlc29sdmVyLnF1ZXJ5KAotICAgICAgICAgICAgICAgICAgICAgICAgdXJpLCBudWxsLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIG51bGwpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVudGl0eUl0ZXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRW50aXR5SXRlcmF0b3IgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFlbnRpdHlJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRGF0YSBkb2VzIG5vdCBleGlzdC4gY29udGFjdElkOiAiICsgY29udGFjdElkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdoaWxlIChlbnRpdHlJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBFbnRpdHkgZW50aXR5ID0gZW50aXR5SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGZvciAoTmFtZWRDb250ZW50VmFsdWVzIG5hbWVkQ29udGVudFZhbHVlcyA6IGVudGl0eS5nZXRTdWJWYWx1ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBuYW1lZENvbnRlbnRWYWx1ZXMudmFsdWVzOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhEYXRhLk1JTUVUWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXNMaXN0ID0gbmV3IEFycmF5TGlzdDxDb250ZW50VmFsdWVzPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXNMaXN0TWFwLnB1dChrZXksIGNvbnRlbnRWYWx1ZXNMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXNMaXN0LmFkZChjb250ZW50VmFsdWVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChlbnRpdHlJdGVyYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZW50aXR5SXRlcmF0b3IuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFZDYXJkQnVpbGRlciBidWlsZGVyID0gbmV3IFZDYXJkQnVpbGRlcihtVkNhcmRUeXBlKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmROYW1lUHJvcGVydGllcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgIC5hcHBlbmROaWNrTmFtZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kUGhvbmVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZEVtYWlscyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgIC5hcHBlbmRQb3N0YWxzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kT3JnYW5pemF0aW9ucyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kV2Vic2l0ZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFdlYnNpdGUuQ09OVEVOVF9JVEVNX1RZUEUpKTsKLSAgICAgICAgaWYgKChtVkNhcmRUeXBlICYgVkNhcmRDb25maWcuRkxBR19SRUZSQUlOX0lNQUdFX0VYUE9SVCkgPT0gMCkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmRQaG90b3MoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFBob3RvLkNPTlRFTlRfSVRFTV9UWVBFKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5hcHBlbmROb3Rlcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoTm90ZS5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZEV2ZW50cyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgIC5hcHBlbmRJbXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KEltLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kUmVsYXRpb24oY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFJlbGF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKSk7Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVybWluYXRlKCkgewotICAgICAgICBmb3IgKE9uZUVudHJ5SGFuZGxlciBoYW5kbGVyIDogbUhhbmRsZXJMaXN0KSB7Ci0gICAgICAgICAgICBoYW5kbGVyLm9uVGVybWluYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1DdXJzb3IuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNRTGl0ZUV4Y2VwdGlvbiBvbiBDdXJzb3IjY2xvc2UoKTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJzb3IgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRlcm1pbmF0ZUlzQ2FsbGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBmaW5hbGl6ZSgpIHsKLSAgICAgICAgaWYgKCFtVGVybWluYXRlSXNDYWxsZWQpIHsKLSAgICAgICAgICAgIHRlcm1pbmF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgaWYgKG1DdXJzb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0Q291bnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyTGFzdCgpIHsKLSAgICAgICAgaWYgKG1DdXJzb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmlzQWZ0ZXJMYXN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm4gdGhlIGVycm9yIHJlYXNvbiBpZiBwb3NzaWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yUmVhc29uKCkgewotICAgICAgICByZXR1cm4gbUVycm9yUmVhc29uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbmZpZy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMTk4NDAuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFRoZSBjbGFzcyByZXByZXNlbnRpbmcgVkNhcmQgcmVsYXRlZCBjb25maWd1cmF0aW9ucy4gVXNlZnVsIHN0YXRpYyBtZXRob2RzIGFyZSBub3QgaW4gdGhpcyBjbGFzcwotICogYnV0IGluIFZDYXJkVXRpbHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZENvbmZpZyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRDb25maWciOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IExPR19MRVZFTF9OT05FID0gMDsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xFVkVMX1BFUkZPUk1BTkNFX01FQVNVUkVNRU5UID0gMHgxOwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBMT0dfTEVWRUxfU0hPV19XQVJOSU5HID0gMHgyOwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBMT0dfTEVWRUxfVkVSQk9TRSA9Ci0gICAgICAgIExPR19MRVZFTF9QRVJGT1JNQU5DRV9NRUFTVVJFTUVOVCB8IExPR19MRVZFTF9TSE9XX1dBUk5JTkc7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xFVkVMID0gTE9HX0xFVkVMX05PTkU7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfVFlQRV9VTktOT1dOID0gMDsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfVFlQRV9BUFBMRSA9IDE7Ci0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RZUEVfTU9CSUxFX1BIT05FX0pQID0gMjsgIC8vIEZvciBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzLgotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBQQVJTRV9UWVBFX0ZPTUEgPSAzOyAgLy8gRm9yIEphcGFuZXNlIEZPTUEgbW9iaWxlIHBob25lcy4KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfVFlQRV9XSU5ET1dTX01PQklMRV9KUCA9IDQ7Ci0KLSAgICAvLyBBc3N1bWVzIHRoYXQgImlzby04ODU5LTEiIGlzIGFibGUgdG8gbWFwICJhbGwiIDhiaXQgY2hhcmFjdGVycyB0byBzb21lIHVuaWNvZGUgYW5kCi0gICAgLy8gZGVjb2RlIHRoZSB1bmljb2RlIHRvIHRoZSBvcmlnaW5hbCBjaGFyc2V0LiBJZiBub3QsIHRoaXMgc2V0dGluZyB3aWxsIGNhdXNlIHNvbWUgYnVnLiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NIQVJTRVQgPSAiaXNvLTg4NTktMSI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19WMjEgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfVjMwID0gMTsKLQotICAgIC8vIDB4MiBpcyByZXNlcnZlZCBmb3IgdGhlIGZ1dHVyZSB1c2UgLi4uCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FX09SREVSX0RFRkFVTFQgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUVfT1JERVJfRVVST1BFID0gMHg0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUVfT1JERVJfSkFQQU5FU0UgPSAweDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5BTUVfT1JERVJfTUFTSyA9IDB4QzsKLQotICAgIC8vIDB4MTAgaXMgcmVzZXJ2ZWQgZm9yIHNhZmV0eQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0NIQVJTRVRfVVRGOCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ0hBUlNFVF9TSElGVF9KSVMgPSAweDEwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DSEFSU0VUX01BU0sgPSAweEYwMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgdGhlIHZDYXJkIGNvbXBvc2VyIHdpbGwgYWRkIHNvbWUgIlgtIiBwcm9wZXJ0aWVzIHVzZWQgb25seSBpbiBBbmRyb2lkCi0gICAgICogd2hlbiB0aGUgZm9ybWFsIHZDYXJkIHNwZWNpZmljYXRpb24gZG9lcyBub3QgaGF2ZSBhcHByb3ByaWF0ZSBmaWVsZHMgZm9yIHRoYXQgZGF0YS4KLSAgICAgKiAKLSAgICAgKiBGb3IgZXhhbXBsZSwgQW5kcm9pZCBhY2NlcHRzIG5pY2tuYW1lIGluZm9ybWF0aW9uIHdoaWxlIHZDYXJkIDIuMSBkb2VzIG5vdC4KLSAgICAgKiBXaGVuIHRoaXMgZmxhZyBpcyBvbiwgdkNhcmQgY29tcG9zZXIgZW1pdHMgYWx0ZXJuYXRpdmUgIlgtIiBwcm9wZXJ0eSAobGlrZSAiWC1OSUNLTkFNRSIpCi0gICAgICogaW5zdGVhZCBvZiBqdXN0IGRyb3BwaW5nIGl0LgotICAgICAqIAotICAgICAqIHZDYXJkIHBhcnNlciBjb2RlIGF1dG9tYXRpY2FsbHkgcGFyc2VzIHRoZSBmaWVsZCBlbWl0dGVkIGV2ZW4gd2hlbiB0aGlzIGZsYWcgaXMgb2ZmLgotICAgICAqIAotICAgICAqIE5vdGUgdGhhdCB0aGlzIGZsYWcgZG9lcyBub3QgYXNzdXJlIGFsbCB0aGUgaW5mb3JtYXRpb24gbXVzdCBiZSBob2xkIGluIHRoZSBlbWl0dGVkIHZDYXJkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZID0gMHg4MDAwMDAwMDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoZSB2Q2FyZCBjb21wb3NlciB3aWxsIGFkZCBzb21lICJYLSIgcHJvcGVydGllcyBzZWVuIGluIHRoZQotICAgICAqIHZDYXJkIGRhdGEgZW1pdHRlZCBieSB0aGUgb3RoZXIgc29mdHdhcmVzL2RldmljZXMgd2hlbiB0aGUgZm9ybWFsIHZDYXJkIHNwZWNpZmljYXRpb24KLSAgICAgKiBkb2VzIG5vdCBoYXZlIGFwcHJvcHJpYXRlIGZpZWxkKHMpIGZvciB0aGF0IGRhdGEuIAotICAgICAqIAotICAgICAqIE9uZSBleGFtcGxlIGlzIFgtUEhPTkVUSUMtRklSU1QtTkFNRS9YLVBIT05FVElDLU1JRERMRS1OQU1FL1gtUEhPTkVUSUMtTEFTVC1OQU1FLCB3aGljaCBhcmUKLSAgICAgKiBmb3IgcGhvbmV0aWMgbmFtZSAoaG93IHRoZSBuYW1lIGlzIHByb25vdW5jZWQpLCBzZWVuIGluIHRoZSB2Q2FyZCBlbWl0dGVkIGJ5IHNvbWUgb3RoZXIKLSAgICAgKiBub24tQW5kcm9pZCBkZXZpY2VzL3NvZnR3YXJlcy4gV2UgY2hvc2UgdG8gZW5hYmxlIHRoZSB2Q2FyZCBjb21wb3NlciB0byB1c2UgdGhvc2UKLSAgICAgKiBkZWZhY3QgcHJvcGVydGllcyBzaW5jZSB0aGV5IGFyZSBhbHNvIHVzZWZ1bCBmb3IgQW5kcm9pZCBkZXZpY2VzLgotICAgICAqIAotICAgICAqIE5vdGUgZm9yIGRldmVsb3BlcnM6IG9ubHkgIlgtIiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBhZGRlZCB3aXRoIHRoaXMgZmxhZy4gdkNhcmQgMi4xLzMuMAotICAgICAqIGFsbG93cyBhbnkga2luZCBvZiAiWC0iIHByb3BlcnRpZXMgYnV0IGRvZXMgbm90IGFsbG93IG5vbi0iWC0iIHByb3BlcnRpZXMgKGV4Y2VwdCBJQU5BIHRva2VucwotICAgICAqIGluIHZDYXJkIDMuMCkuIFNvbWUgZXh0ZXJuYWwgcGFyc2VycyBtYXkgZ2V0IGNvbmZ1c2VkIHdpdGggbm9uLXZhbGlkLCBub24tIlgtIiBwcm9wZXJ0aWVzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgPSAweDQwMDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyBzb21lIHNwZWNpZmljIGRpYWxlY3Qgc2VlbiBpbiB2Y2FyZCBvZiBEb0NvTW8gKG9uZSBvZiBKYXBhbmVzZQotICAgICAqIG1vYmlsZSBjYXJlZXJzKSBzaG91bGQgYmUgdXNlZC4gVGhpcyBmbGFnIGRvZXMgbm90IGluY2x1ZGUgYW55IG90aGVyIGluZm9ybWF0aW9uIGxpa2UKLSAgICAgKiB0aGF0ICJ0aGUgdkNhcmQgaXMgZm9yIEphcGFuZXNlIi4gU28gaXQgaXMgInBvc3NpYmxlIiB0aGF0ICJ0aGUgdkNhcmQgc2hvdWxkIGhhdmUgRG9Db01vJ3MKLSAgICAgKiBkaWFsZWN0IGJ1dCB0aGUgbmFtZSBvcmRlciBzaG91bGQgYmUgRXVyb3BlYW4iLCBidXQgaXQgaXMgbm90IHJlY29tbWVuZGVkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0RPQ09NTyA9IDB4MjAwMDAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoZSB2Q2FyZCBjb21wb3NlciBkb2VzICJOT1QiIHVzZSBRdW90ZWQtUHJpbnRhYmxlIHRvd2FyZCAicHJpbWFyeSIKLSAgICAgKiBwcm9wZXJ0aWVzIGV2ZW4gdGhvdWdoIGl0IGlzIHJlcXVpcmVkIGJ5IHZDYXJkIDIuMSAoUVAgaXMgcHJvaGliaXRlZCBpbiB2Q2FyZCAzLjApLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBXZSBhY3R1YWxseSBjYW5ub3QgZGVmaW5lIHdoYXQgaXMgdGhlICJwcmltYXJ5IiBwcm9wZXJ0eS4gTm90ZSB0aGF0IHRoaXMgaXMgTk9UIGRlZmluZWQKLSAgICAgKiBpbiB2Q2FyZCBzcGVjaWZpY2F0aW9uIGVpdGhlci4gQWxzbyBiZSBhd2FyZSB0aGF0IGl0IGlzIE5PVCByZWxhdGVkIHRvICJwcmltYXJ5IiBub3Rpb24KLSAgICAgKiB1c2VkIGluIHtAbGluayBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3R9LgotICAgICAqIFRoaXMgbm90aW9uIGlzIGp1c3QgZm9yIHZDYXJkIGNvbXBvc2l0aW9uIGluIEFuZHJvaWQuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIFdlIGFkZGVkIHRoaXMgQW5kcm9pZC1zcGVjaWZpYyBub3Rpb24gc2luY2Ugc29tZSAoaW5jb21wbGV0ZSkgdkNhcmQgZXhwb3J0ZXJzIGZvciB2Q2FyZCAyLjEKLSAgICAgKiBkbyBOT1QgdXNlIFF1b3RlZC1QcmludGFibGUgZW5jb2RpbmcgdG93YXJkIHNvbWUgcHJvcGVydGllcyByZWxhdGVkIG5hbWVzIGxpa2UgIk4iLCAiRk4iLCBldGMuCi0gICAgICogZXZlbiB3aGVuIHRoZWlyIHZhbHVlcyBjb250YWluIG5vbi1hc2NpaSBvci9hbmQgQ1IvTEYsIHdoaWxlIHRoZXkgdXNlIHRoZSBlbmNvZGluZyBpbiB0aGUKLSAgICAgKiBvdGhlciBwcm9wZXJ0aWVzIGxpa2UgIkFEUiIsICJPUkciLCBldGMuCi0gICAgICogPFA+Ci0gICAgICogV2UgYXJlIGFmcmFpZCBvZiB0aGUgY2FzZSB3aGVyZSBzb21lIHZDYXJkIGltcG9ydGVyIGFsc28gZm9yZ2V0IGhhbmRsaW5nIFFQIHByZXN1bWluZyBRUCBpcwotICAgICAqIG5vdCB1c2VkIGluIHN1Y2ggZmllbGRzLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBUaGlzIGZsYWcgaXMgdXNlZnVsIHdoZW4gc29tZSB0YXJnZXQgaW1wb3J0ZXIgeW91IGFyZSBnb2luZyB0byBmb2N1cyBvbiBkb2VzIG5vdCBhY2NlcHQKLSAgICAgKiBzdWNoIHByb3BlcnRpZXMgd2l0aCBRdW90ZWQtUHJpbnRhYmxlIGVuY29kaW5nLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBBZ2Fpbiwgd2Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBmbGFnIGF0IGFsbCBmb3IgY29tcGx5aW5nIHZDYXJkIDIuMSBzcGVjLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBJbiB2Q2FyZCAzLjAsIFF1b3RlZC1QcmludGFibGUgaXMgZXhwbGljaXRseSAicHJvaGliaXR0ZWQiLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNhcmUgdGhpcwotICAgICAqIGtpbmQgb2YgcHJvYmxlbSAoaG9wZWZ1bGx5KS4KLSAgICAgKiA8L1A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19SRUZSQUlOX1FQX1RPX05BTUVfUFJPUEVSVElFUyA9IDB4MTAwMDAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoYXQgcGhvbmV0aWMgbmFtZSByZWxhdGVkIGZpZWxkcyBtdXN0IGJlIGNvbnZlcnRlZCB0bwotICAgICAqIGFwcHJvcHJpYXRlIGZvcm0uIE5vdGUgdGhhdCAiYXBwcm9wcmlhdGUiIGlzIG5vdCBkZWZpbmVkIGluIGFueSB2Q2FyZCBzcGVjaWZpY2F0aW9uLgotICAgICAqIFRoaXMgaXMgQW5kcm9pZC1zcGVjaWZpYy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogT25lIHR5cGljYWwgKGFuZCBjdXJyZW50bHkgc29sZSkgZXhhbXBsZSB3aGVyZSB3ZSBuZWVkIHRoaXMgZmxhZyBpcyB0aGUgdGltZSB3aGVuCi0gICAgICogd2UgbmVlZCB0byBlbWl0IEphcGFuZXNlIHBob25ldGljIG5hbWVzIGludG8gdkNhcmQgZW50cmllcy4gVGhlIHByb3BlcnR5IHZhbHVlcwotICAgICAqIHNob3VsZCBiZSBlbmNvZGVkIGludG8gaGFsZi13aWR0aCBrYXRha2FuYSB3aGVuIHRoZSB0YXJnZXQgaW1wb3J0ZXIgaXMgSmFwYW5lc2UgbW9iaWxlCi0gICAgICogcGhvbmVzJywgd2hpY2ggYXJlIHByb2JhYmx5IG5vdCBhYmxlIHRvIHBhcnNlIGZ1bGwtd2lkdGggaGlyYWdhbmEva2F0YWthbmEgZm9yCi0gICAgICogaGlzdG9yaWNhbCByZWFzb25zLCB3aGlsZSB0aGUgdkNhcmQgaW1wb3J0ZXJzIGVtYmVkZGVkIHRvIHNvZnR3YXJlcyBmb3IgUEMgc2hvdWxkIGJlCi0gICAgICogYWJsZSB0byBwYXJzZSB0aGVtIGFzIHdlIGV4cGVjdC4KLSAgICAgKiA8L1A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DT05WRVJUX1BIT05FVElDX05BTUVfU1RSSU5HUyA9IDB4MDgwMDAwMDsKLQotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgdGhlIHZDYXJkIGNvbXBvc2VyICJmb3IgMi4xIiBlbWl0cyAiVFlQRT0iIHN0cmluZyB0b3dhcmQgVFlQRSBwYXJhbXMKLSAgICAgKiBldmVyeSB0aW1lIHBvc3NpYmxlLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBkb2VzIG5vdCBlbWl0IGl0IGFuZCBpcyB2YWxpZCBpbiB0aGUgc3BlYy4KLSAgICAgKiBJbiB2Q3JhZCAzLjAsIHRoaXMgZmxhZyBpcyB1bm5lY2Vzc2FyeSwgc2luY2UgIlRZUEU9IiBpcyBNVVNUIGluIHZDYXJkIDMuMCBzcGVjaWZpY2F0aW9uLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBEZXRhaWw6Ci0gICAgICogSG93IG1vcmUgdGhhbiBvbmUgVFlQRSBmaWVsZHMgYXJlIGV4cHJlc3NlZCBpcyBkaWZmZXJlbnQgYmV0d2VlbiB2Q2FyZCAyLjEgYW5kIHZDYXJkIDMuMC4KLSAgICAgKiA8L3A+Ci0gICAgICogPFA+Ci0gICAgICogZS5nLjxCUiAvPgotICAgICAqIDEpIFByb2JhYmx5IHZhbGlkIGluIGJvdGggdkNhcmQgMi4xIGFuZCB2Q2FyZCAzLjA6ICJBRFI7VFlQRT1ET007VFlQRT1IT01FOi4uLiI8QlIgLz4KLSAgICAgKiAyKSBWYWxpZCBpbiB2Q2FyZCAyLjEgYnV0IG5vdCBpbiB2Q2FyZCAzLjA6ICJBRFI7RE9NO0hPTUU6Li4uIjxCUiAvPgotICAgICAqIDMpIFZhbGlkIGluIHZDYXJkIDMuMCBidXQgbm90IGluIHZDYXJkIDIuMTogIkFEUjtUWVBFPURPTSxIT01FOi4uLiI8QlIgLz4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogMikgaGFkIGJlZW4gdGhlIGRlZmF1bHQgb2YgVkNhcmQgZXhwb3J0ZXIvaW1wb3J0ZXIgaW4gQW5kcm9pZCwgYnV0IGl0IGlzIGZvdW5kIHRoYXQKLSAgICAgKiBzb21lIGV4dGVybmFsIGV4cG9ydGVyIGlzIG5vdCBhYmxlIHRvIHBhcnNlIHRoZSB0eXBlIGZvcm1hdCBsaWtlIDIpIGJ1dCBvbmx5IDMpLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBJZiB5b3UgYXJlIHRhcmdldGluZyB0byB0aGUgaW1wb3J0ZXIgd2hpY2ggY2Fubm90IGFjY2VwdCBUWVBFIHBhcmFtcyB3aXRob3V0ICJUWVBFPSIKLSAgICAgKiBzdHJpbmdzICh3aGljaCBzaG91bGQgYmUgcmFyZSB0aG91Z2gpLCBwbGVhc2UgdXNlIHRoaXMgZmxhZy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogRXhhbXBsZSB1c2FnZTogaW50IHZjYXJkVHlwZSA9IChWQ0FSRF9UWVBFX1YyMV9HRU5FUklDIHwgRkxBR19BUFBFTkRfVFlQRV9QQVJBTSk7Ci0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQVBQRU5EX1RZUEVfUEFSQU0gPSAweDA0MDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVGhlIGZsYWcgYXNraW5nIGV4cG9ydGVyIHRvIHJlZnJhaW4gaW1hZ2UgZXhwb3J0LgotICAgICAqIDwvUD4KLSAgICAgKiBAaGlkZSB3aWxsIGJlIGRlbGV0ZWQgaW4gdGhlIG5lYXIgZnV0dXJlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUkVGUkFJTl9JTUFHRV9FWFBPUlQgPSAweDAyMDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgdkNhcmQgY29tcG9zZXIgZG9lcyB0b3VjaCBub3RoaW5nIHRvd2FyZCBwaG9uZSBudW1iZXIgU3RyaW5ncwotICAgICAqIGJ1dCBsZWF2ZSBpdCBhcyBpcy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogVGhlIHZDYXJkIHNwZWNpZmljYXRpb25zIG1lbnRpb24gbm90aGluZyB0b3dhcmQgcGhvbmUgbnVtYmVycywgd2hpbGUgc29tZSBkZXZpY2VzCi0gICAgICogZG8gKHdyb25nbHksIGJ1dCB3aXRoIGlubmV2aXRhYmxlIHJlYXNvbnMpLgotICAgICAqIEZvciBleGFtcGxlLCB0aGVyZSdzIGEgcG9zc2liaWxpdHkgSmFwYW5lc2UgbW9iaWxlIHBob25lcyBhcmUgZXhwZWN0ZWQgdG8gaGF2ZQotICAgICAqIGp1c3QgbnVtYmVycywgaHlwZW5zLCBwbHVzLCBldGMuIGJ1dCBub3QgdXN1YWwgYWxwaGFiZXRzLCB3aGlsZSBVUyBtb2JpbGUgcGhvbmVzCi0gICAgICogc2hvdWxkIGdldCBzdWNoIGNoYXJhY3RlcnMuIFRvIG1ha2UgZXhwb3J0ZWQgdkNhcmQgc2ltcGxlIGZvciBleHRlcm5hbCBwYXJzZXJzLAotICAgICAqIHdlIGhhdmUgdXNlZCB7QGxpbmsgUGhvbmVOdW1iZXJVdGlscyNmb3JtYXROdW1iZXIoU3RyaW5nKX0gZHVyaW5nIGV4cG9ydCwgYW5kCi0gICAgICogcmVtb3ZlZCB1bm5lY2Vzc2FyeSBjaGFyYWN0ZXJzIGluc2lkZSB0aGUgbnVtYmVyIChlLmcuICIxMTEtMjIyLTMzMzMgKE1pYW1pKSIKLSAgICAgKiBiZWNvbWVzICIxMTEtMjIyLTMzMzMiKS4KLSAgICAgKiBVbmZvcnR1bmF0ZSBzaWRlIGVmZmVjdCBvZiB0aGF0IHVzZSB3YXMgc29tZSBjb250cm9sIGNoYXJhY3RlcnMgdXNlZCBpbiB0aGUgb3RoZXIKLSAgICAgKiBhcmVhcyBtYXkgYmUgYmFkbHkgYWZmZWN0ZWQgYnkgdGhlIGZvcm1hdHRpbmcuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIFRoaXMgZmxhZyBkaXNhYmxlcyB0aGF0IGZvcm1hdHRpbmcsIGFmZmVjdGluZyBib3RoIGltcG9ydGVyIGFuZCBleHBvcnRlci4KLSAgICAgKiBJZiB0aGUgdXNlciBpcyBhd2FyZSBvZiBzb21lIHNpZGUgZWZmZWN0cyBkdWUgdG8gdGhlIGltcGxpY2l0IGZvcm1hdHRpbmcsIHVzZSB0aGlzIGZsYWcuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUkVGUkFJTl9QSE9ORV9OVU1CRVJfRk9STUFUVElORyA9IDB4MDIwMDAwMDA7Ci0KLSAgICAvLy8vIFRoZSBmb2xsb3dpbmdzIGFyZSBWQ2FyZCB0eXBlcyBhdmFpbGFibGUgZnJvbSBpbXBvcnRlci9leHBvcnRlci4gLy8vLwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogR2VuZXJpYyB2Q2FyZCBmb3JtYXQgd2l0aCB0aGUgdkNhcmQgMi4xLiBVc2VzIFVURi04IGZvciB0aGUgY2hhcnNldC4KLSAgICAgKiBXaGVuIGNvbXBvc2luZyBhIHZDYXJkIGVudHJ5LCB0aGUgVVMgY29udmVuc2lvbiB3aWxsIGJlIHVzZWQgdG93YXJkIGZvcm1hdHRpbmcKLSAgICAgKiBzb21lIHZhbHVlcy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogZS5nLiBUaGUgb3JkZXIgb2YgdGhlIGRpc3BsYXkgbmFtZSB3b3VsZCBiZSAiUHJlZml4IEdpdmVuIE1pZGRsZSBGYW1pbHkgU3VmZml4IiwKLSAgICAgKiB3aGlsZSBpdCBzaG91bGQgYmUgIlByZWZpeCBGYW1pbHkgTWlkZGxlIEdpdmVuIFN1ZmZpeCIgaW4gSmFwYW4gZm9yIGV4YW1wbGUuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGOCA9Ci0gICAgICAgIChGTEFHX1YyMSB8IE5BTUVfT1JERVJfREVGQVVMVCB8IEZMQUdfQ0hBUlNFVF9VVEY4IHwKLSAgICAgICAgICAgICAgICBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIFN0cmluZyBWQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjhfU1RSID0gInYyMV9nZW5lcmljIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBHZW5lcmFsIHZDYXJkIGZvcm1hdCB3aXRoIHRoZSB2ZXJzaW9uIDMuMC4gVXNlcyBVVEYtOCBmb3IgdGhlIGNoYXJzZXQuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE5vdCBmdWxseSByZWFkeSB5ZXQuIFVzZSB3aXRoIGNhdXRpb24gd2hlbiB5b3UgdXNlIHRoaXMuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjMwX0dFTkVSSUNfVVRGOCA9Ci0gICAgICAgIChGTEFHX1YzMCB8IE5BTUVfT1JERVJfREVGQVVMVCB8IEZMQUdfQ0hBUlNFVF9VVEY4IHwKLSAgICAgICAgICAgICAgICBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YzMF9HRU5FUklDX1VURjhfU1RSID0gInYzMF9nZW5lcmljIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBHZW5lcmFsIHZDYXJkIGZvcm1hdCBmb3IgdGhlIHZDYXJkIDIuMSB3aXRoIHNvbWUgRXVyb3BlIGNvbnZlbnNpb24uIFVzZXMgVXRmLTguCi0gICAgICogQ3VycmVudGx5LCBvbmx5IG5hbWUgb3JkZXIgaXMgY29uc2lkZXJlZCAoIlByZWZpeCBNaWRkbGUgR2l2ZW4gRmFtaWx5IFN1ZmZpeCIpCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjIxX0VVUk9QRV9VVEY4ID0KLSAgICAgICAgKEZMQUdfVjIxIHwgTkFNRV9PUkRFUl9FVVJPUEUgfCBGTEFHX0NIQVJTRVRfVVRGOCB8Ci0gICAgICAgICAgICAgICAgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0gICAgCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfVjIxX0VVUk9QRV9VVEY4X1NUUiA9ICJ2MjFfZXVyb3BlIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBHZW5lcmFsIHZDYXJkIGZvcm1hdCB3aXRoIHRoZSB2ZXJzaW9uIDMuMCB3aXRoIHNvbWUgRXVyb3BlIGNvbnZlbnNpb24uIFVzZXMgVVRGLTguCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE5vdCByZWFkeSB5ZXQuIFVzZSB3aXRoIGNhdXRpb24gd2hlbiB5b3UgdXNlIHRoaXMuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjMwX0VVUk9QRV9VVEY4ID0KLSAgICAgICAgKEZMQUdfVjMwIHwgTkFNRV9PUkRFUl9FVVJPUEUgfCBGTEFHX0NIQVJTRVRfVVRGOCB8Ci0gICAgICAgICAgICAgICAgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0gICAgCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfVjMwX0VVUk9QRV9TVFIgPSAidjMwX2V1cm9wZSI7Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBUaGUgdkNhcmQgMi4xIGZvcm1hdCBmb3IgbWlzY2VsbGFuZW91cyBKYXBhbmVzZSBkZXZpY2VzLCB1c2luZyBVVEYtOCBhcyBkZWZhdWx0IGNoYXJzZXQuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE5vdCByZWFkeSB5ZXQuIFVzZSB3aXRoIGNhdXRpb24gd2hlbiB5b3UgdXNlIHRoaXMuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjggPQotICAgICAgICAoRkxBR19WMjEgfCBOQU1FX09SREVSX0pBUEFORVNFIHwgRkxBR19DSEFSU0VUX1VURjggfAotICAgICAgICAgICAgICAgIEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjhfU1RSID0gInYyMV9qYXBhbmVzZV91dGY4IjsKLQotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIHZDYXJkIDIuMSBmb3JtYXQgZm9yIG1pc2NlbGxhbmVvdXMgSmFwYW5lc2UgZGV2aWNlcy4gU2hpZnRfSmlzIGlzIHVzZWQgZm9yCi0gICAgICogcGFyc2luZy9jb21wb3NpbmcgdGhlIHZDYXJkIGRhdGEuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE5vdCByZWFkeSB5ZXQuIFVzZSB3aXRoIGNhdXRpb24gd2hlbiB5b3UgdXNlIHRoaXMuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMgPQotICAgICAgICAoRkxBR19WMjEgfCBOQU1FX09SREVSX0pBUEFORVNFIHwgRkxBR19DSEFSU0VUX1NISUZUX0pJUyB8Ci0gICAgICAgICAgICAgICAgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJU19TVFIgPSAidjIxX2phcGFuZXNlX3NqaXMiOwotICAgIAotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIHZDYXJkIGZvcm1hdCBmb3IgbWlzY2VsbGFuZW91cyBKYXBhbmVzZSBkZXZpY2VzLCB1c2luZyBTaGlmdF9KaXMgZm9yCi0gICAgICogcGFyc2luZy9jb21wb3NpbmcgdGhlIHZDYXJkIGRhdGEuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE5vdCByZWFkeSB5ZXQuIFVzZSB3aXRoIGNhdXRpb24gd2hlbiB5b3UgdXNlIHRoaXMuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1NKSVMgPQotICAgICAgICAoRkxBR19WMzAgfCBOQU1FX09SREVSX0pBUEFORVNFIHwgRkxBR19DSEFSU0VUX1NISUZUX0pJUyB8Ci0gICAgICAgICAgICAgICAgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0gICAgICAgIAotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9TSklTX1NUUiA9ICJ2MzBfamFwYW5lc2Vfc2ppcyI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVGhlIHZDYXJkIDMuMCBmb3JtYXQgZm9yIG1pc2NlbGxhbmVvdXMgSmFwYW5lc2UgZGV2aWNlcywgdXNpbmcgVVRGLTggYXMgZGVmYXVsdCBjaGFyc2V0LgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3QgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9VVEY4ID0KLSAgICAgICAgKEZMQUdfVjMwIHwgTkFNRV9PUkRFUl9KQVBBTkVTRSB8IEZMQUdfQ0hBUlNFVF9VVEY4IHwKLSAgICAgICAgICAgICAgICBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9VVEY4X1NUUiA9ICJ2MzBfamFwYW5lc2VfdXRmOCI7Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBUaGUgdkNhcmQgMi4xIGJhc2VkIGZvcm1hdCB3aGljaCAocGFydGlhbGx5KSBjb25zaWRlcnMgdGhlIGNvbnZlbnRpb24gaW4gSmFwYW5lc2UKLSAgICAgKiBtb2JpbGUgcGhvbmVzLCB3aGVyZSBwaG9uZXRpYyBuYW1lcyBhcmUgdHJhbnNsYXRlZCB0byBoYWxmLXdpZHRoIGthdGFrYW5hIGlmCi0gICAgICogcG9zc2libGUsIGV0Yy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogTm90IHJlYWR5IHlldC4gVXNlIHdpdGggY2F1dGlvbiB3aGVuIHlvdSB1c2UgdGhpcy4KLSAgICAgKiA8L1A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFID0KLSAgICAgICAgKEZMQUdfVjIxIHwgTkFNRV9PUkRFUl9KQVBBTkVTRSB8IEZMQUdfQ0hBUlNFVF9TSElGVF9KSVMgfAotICAgICAgICAgICAgICAgIEZMQUdfQ09OVkVSVF9QSE9ORVRJQ19OQU1FX1NUUklOR1MgfAotICAgICAgICAgICAgICAgIEZMQUdfUkVGUkFJTl9RUF9UT19OQU1FX1BST1BFUlRJRVMpOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRV9TVFIgPSAidjIxX2phcGFuZXNlX21vYmlsZSI7Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBWQ2FyZCBmb3JtYXQgdXNlZCBpbiBEb0NvTW8sIHdoaWNoIGlzIG9uZSBvZiBKYXBhbmVzZSBtb2JpbGUgcGhvbmUgY2FyZWVycy4KLSAgICAgKiA8L3A+Ci0gICAgICogPFA+Ci0gICAgICogQmFzZSB2ZXJzaW9uIGlzIHZDYXJkIDIuMSwgYnV0IHRoZSBkYXRhIGhhcyBzZXZlcmFsIERvQ29Nby1zcGVjaWZpYyBjb252ZW5zaW9ucy4KLSAgICAgKiBObyBBbmRyb2lkLXNwZWNpZmljIHByb3BlcnR5IG5vciBkZWZhY3QgcHJvcGVydHkgaXMgaW5jbHVkZWQuIFRoZSAiUHJpbWFyeSIgcHJvcGVydGllcwotICAgICAqIGFyZSBOT1QgZW5jb2RlZCB0byBRdW90ZWQtUHJpbnRhYmxlLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX0RPQ09NTyA9Ci0gICAgICAgIChWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEUgfCBGTEFHX0RPQ09NTyk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9ET0NPTU9fU1RSID0gImRvY29tbyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBWQ0FSRF9UWVBFX0RFRkFVTFQgPSBWQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjg7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzVkNhcmRUeXBlTWFwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxJbnRlZ2VyPiBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0OwotICAgIAotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGOF9TVFIsIFZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGOCk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjMwX0dFTkVSSUNfVVRGOF9TVFIsIFZDQVJEX1RZUEVfVjMwX0dFTkVSSUNfVVRGOCk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjIxX0VVUk9QRV9VVEY4X1NUUiwgVkNBUkRfVFlQRV9WMjFfRVVST1BFX1VURjgpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YzMF9FVVJPUEVfU1RSLCBWQ0FSRF9UWVBFX1YzMF9FVVJPUEVfVVRGOCk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVNfU1RSLCBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTKTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfVVRGOF9TVFIsIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjgpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9TSklTX1NUUiwgVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfU0pJUyk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1VURjhfU1RSLCBWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9VVEY4KTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFX1NUUiwgVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFKTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9ET0NPTU9fU1RSLCBWQ0FSRF9UWVBFX0RPQ09NTyk7Ci0KLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldCA9IG5ldyBIYXNoU2V0PEludGVnZXI+KCk7Ci0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQuYWRkKFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMpOwotICAgICAgICBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0LmFkZChWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9VVEY4KTsKLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldC5hZGQoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUyk7Ci0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQuYWRkKFZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1NKSVMpOwotICAgICAgICBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0LmFkZChWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9VVEY4KTsKLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldC5hZGQoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFKTsKLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldC5hZGQoVkNBUkRfVFlQRV9ET0NPTU8pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFZDYXJkVHlwZUZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHZjYXJkVHlwZVN0cmluZykgewotICAgICAgICBmaW5hbCBTdHJpbmcgbG93ZXJlZEtleSA9IHZjYXJkVHlwZVN0cmluZy50b0xvd2VyQ2FzZSgpOwotICAgICAgICBpZiAoc1ZDYXJkVHlwZU1hcC5jb250YWluc0tleShsb3dlcmVkS2V5KSkgewotICAgICAgICAgICAgcmV0dXJuIHNWQ2FyZFR5cGVNYXAuZ2V0KGxvd2VyZWRLZXkpOwotICAgICAgICB9IGVsc2UgaWYgKCJkZWZhdWx0Ii5lcXVhbHNJZ25vcmVDYXNlKHZjYXJkVHlwZVN0cmluZykpIHsKLSAgICAgICAgICAgIHJldHVybiBWQ0FSRF9UWVBFX0RFRkFVTFQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5rbm93biB2Q2FyZCB0eXBlIFN0cmluZzogXCIiICsgdmNhcmRUeXBlU3RyaW5nICsgIlwiIik7Ci0gICAgICAgICAgICByZXR1cm4gVkNBUkRfVFlQRV9ERUZBVUxUOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVjMwKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgodmNhcmRUeXBlICYgRkxBR19WMzApICE9IDApOyAgCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZFVzZVF1b3RlZFByaW50YWJsZShmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAhaXNWMzAodmNhcmRUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXNlc1V0ZjgoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX0NIQVJTRVRfTUFTSykgPT0gRkxBR19DSEFSU0VUX1VURjgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1c2VzU2hpZnRKaXMoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX0NIQVJTRVRfTUFTSykgPT0gRkxBR19DSEFSU0VUX1NISUZUX0pJUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TmFtZU9yZGVyVHlwZShmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiB2Y2FyZFR5cGUgJiBOQU1FX09SREVSX01BU0s7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHVzZXNBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eShmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoKHZjYXJkVHlwZSAmIEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpICE9IDApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1c2VzRGVmYWN0UHJvcGVydHkoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkpICE9IDApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG93UGVyZm9ybWFuY2VMb2coKSB7Ci0gICAgICAgIHJldHVybiAoVkNhcmRDb25maWcuTE9HX0xFVkVMICYgVkNhcmRDb25maWcuTE9HX0xFVkVMX1BFUkZPUk1BTkNFX01FQVNVUkVNRU5UKSAhPSAwOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG91bGRSZWZyYWluUVBUb05hbWVQcm9wZXJ0aWVzKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICByZXR1cm4gKCFzaG91bGRVc2VRdW90ZWRQcmludGFibGUodmNhcmRUeXBlKSB8fAotICAgICAgICAgICAgICAgKCh2Y2FyZFR5cGUgJiBGTEFHX1JFRlJBSU5fUVBfVE9fTkFNRV9QUk9QRVJUSUVTKSAhPSAwKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFwcGVuZFR5cGVQYXJhbU5hbWUoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKGlzVjMwKHZjYXJkVHlwZSkgfHwgKCh2Y2FyZFR5cGUgJiBGTEFHX0FQUEVORF9UWVBFX1BBUkFNKSAhPSAwKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgSmFwYW5lc2UgYW5kIHNvbWUgSmFwYW5lc2UgY29udmVuc2lvbiBpcwotICAgICAqIGFwcGxpZWQgdG8gY3JlYXRpbmcgImZvcm1hdHRlZCIgc29tZXRoaW5nIGxpa2UgRk9STUFUVEVEX0FERFJFU1MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmFwYW5lc2VEZXZpY2UoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICAvLyBUT0RPOiBTb21lIG1hc2sgd2lsbCBiZSByZXF1aXJlZCBzbyB0aGF0IHRoaXMgbWV0aG9kIHdyb25nbHkgaW50ZXJwcmV0Ci0gICAgICAgIC8vICAgICAgICBKYXBhbmVzZSItbGlrZSIgdkNhcmQgdHlwZS4KLSAgICAgICAgLy8gICAgICAgIGUuZy4gVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUyB8IEZMQUdfQVBQRU5EX1RZUEVfUEFSQU1TCi0gICAgICAgIHJldHVybiBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0LmNvbnRhaW5zKHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgYm9vbGVhbiByZWZyYWluUGhvbmVOdW1iZXJGb3JtYXR0aW5nKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgodmNhcmRUeXBlICYgRkxBR19SRUZSQUlOX1BIT05FX05VTUJFUl9GT1JNQVRUSU5HKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbmVlZHNUb0NvbnZlcnRQaG9uZXRpY1N0cmluZyhmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoKHZjYXJkVHlwZSAmIEZMQUdfQ09OVkVSVF9QSE9ORVRJQ19OQU1FX1NUUklOR1MpICE9IDApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvbmx5T25lTm90ZUZpZWxkSXNBdmFpbGFibGUoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gdmNhcmRUeXBlID09IFZDQVJEX1RZUEVfRE9DT01POwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RvQ29NbyhmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoKHZjYXJkVHlwZSAmIEZMQUdfRE9DT01PKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFZDYXJkQ29uZmlnKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbnN0YW50cy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMDcxMjYuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi0vKioKLSAqIENvbnN0YW50cyB1c2VkIGluIGJvdGggZXhwb3J0ZXIgYW5kIGltcG9ydGVyIGNvZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZENvbnN0YW50cyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9WMjEgPSAiMi4xIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1YzMCA9ICIzLjAiOwotCi0gICAgLy8gVGhlIHByb3BlcnR5IG5hbWVzIHZhbGlkIGJvdGggaW4gdkNhcmQgMi4xIGFuZCAzLjAuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQkVHSU4gPSAiQkVHSU4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1ZFUlNJT04gPSAiVkVSU0lPTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTiA9ICJOIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9GTiA9ICJGTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQURSID0gIkFEUiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRU1BSUwgPSAiRU1BSUwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05PVEUgPSAiTk9URSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfT1JHID0gIk9SRyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU09VTkQgPSAiU09VTkQiOyAgLy8gTm90IGZ1bGx5IHN1cHBvcnRlZC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9URUwgPSAiVEVMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9USVRMRSA9ICJUSVRMRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUk9MRSA9ICJST0xFIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9QSE9UTyA9ICJQSE9UTyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTE9HTyA9ICJMT0dPIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9VUkwgPSAiVVJMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9CREFZID0gIkJEQVkiOyAgLy8gQmlydGhkYXkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9FTkQgPSAiRU5EIjsKLQotICAgIC8vIFZhbGlkIHByb3BlcnR5IG5hbWVzIG5vdCBzdXBwb3J0ZWQgKG5vdCBhcHByb3ByaWF0ZWx5IGhhbmRsZWQpIGJ5IG91ciB2Q2FyZCBpbXBvcnRlciBub3cuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUkVWID0gIlJFViI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQUdFTlQgPSAiQUdFTlQiOwotCi0gICAgLy8gQXZhaWxhYmxlIGluIHZDYXJkIDMuMC4gU2hvdWQgbm90IHVzZSB3aGVuIGNvbXBvc2luZyB2Q2FyZCAyLjEgZmlsZS4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FID0gIk5BTUUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05JQ0tOQU1FID0gIk5JQ0tOQU1FIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TT1JUX1NUUklORyA9ICJTT1JULVNUUklORyI7Ci0gICAgCi0gICAgLy8gRGUtZmFjdCBwcm9wZXJ0eSB2YWx1ZXMgZXhwcmVzc2luZyBwaG9uZXRpYyBuYW1lcy4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1BIT05FVElDX0ZJUlNUX05BTUUgPSAiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1BIT05FVElDX01JRERMRV9OQU1FID0gIlgtUEhPTkVUSUMtTUlERExFLU5BTUUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfUEhPTkVUSUNfTEFTVF9OQU1FID0gIlgtUEhPTkVUSUMtTEFTVC1OQU1FIjsKLQotICAgIC8vIFByb3BlcnRpZXMgYm90aCBDb250YWN0c1N0cnVjdCBpbiBFY2xhaXIgYW5kIGRlLWZhY3QgdkNhcmQgZXh0ZW5zaW9ucwotICAgIC8vIHNob3duIGluIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVkNhcmQgc3VwcG9ydCBhcmUgZGVmaW5lZCBoZXJlLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfQUlNID0gIlgtQUlNIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX01TTiA9ICJYLU1TTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9ZQUhPTyA9ICJYLVlBSE9PIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0lDUSA9ICJYLUlDUSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9KQUJCRVIgPSAiWC1KQUJCRVIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfR09PR0xFX1RBTEsgPSAiWC1HT09HTEUtVEFMSyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9TS1lQRV9VU0VSTkFNRSA9ICJYLVNLWVBFLVVTRVJOQU1FIjsKLSAgICAvLyBQcm9wZXJ0aWVzIG9ubHkgQ29udGFjdHNTdHJ1Y3QgaGFzLiBXZSBhbHNlIHVzZSB0aGlzLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfUVEgPSAiWC1RUSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9ORVRNRUVUSU5HID0gIlgtTkVUTUVFVElORyI7Ci0KLSAgICAvLyBQaG9uZSBudW1iZXIgZm9yIFNreXBlLCBhdmFpbGFibGUgYXMgdXN1YWwgcGhvbmUuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9TS1lQRV9QU1ROTlVNQkVSID0gIlgtU0tZUEUtUFNUTk5VTUJFUiI7Ci0KLSAgICAvLyBQcm9wZXJ0eSBmb3IgQW5kcm9pZC1zcGVjaWZpYyBmaWVsZHMuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9BTkRST0lEX0NVU1RPTSA9ICJYLUFORFJPSUQtQ1VTVE9NIjsKLQotICAgIC8vIFByb3BlcnRpZXMgZm9yIERvQ29NbyB2Q2FyZC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0NMQVNTID0gIlgtQ0xBU1MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfUkVEVUNUSU9OID0gIlgtUkVEVUNUSU9OIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX05PID0gIlgtTk8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfRENNX0hNTl9NT0RFID0gIlgtRENNLUhNTi1NT0RFIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEUgPSAiVFlQRSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0hPTUUgPSAiSE9NRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9XT1JLID0gIldPUksiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfRkFYID0gIkZBWCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9DRUxMID0gIkNFTEwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfVk9JQ0UgPSAiVk9JQ0UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfSU5URVJORVQgPSAiSU5URVJORVQiOwotCi0gICAgLy8gQWJicmV2aWF0aW9uIG9mICJwcmVmZXJlZCIgYWNjb3JkaW5nIHRvIHZDYXJkIDIuMSBzcGVjaWZpY2F0aW9uLgotICAgIC8vIFdlIGludGVycHJldCB0aGlzIHZhbHVlIGFzICJwcmltYXJ5IiBwcm9wZXJ0eSBkdXJpbmcgaW1wb3J0L2V4cG9ydC4KLSAgICAvLwotICAgIC8vIE5vdGU6IEJvdGggdkNhcmQgc3BlY3MgZG9lcyBub3QgbWVudGlvbiBhbnl0aGluZyBhYm91dCB0aGUgcmVxdWlyZW1lbnQgZm9yIHRoaXMgcGFyYW1ldGVyLAotICAgIC8vICAgICAgIGJ1dCB0aGVyZSBtYXkgYmUgc29tZSB2Q2FyZCBpbXBvcnRlciB3aGljaCB3aWxsIGdldCBjb25mdXNlZCB3aXRoIG1vcmUgdGhhbgotICAgIC8vICAgICAgIG9uZSAiUFJFRiJzIGluIG9uZSBwcm9wZXJ0eSBuYW1lLCB3aGlsZSBBbmRyb2lkIGFjY2VwdHMgdGhlbS4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1BSRUYgPSAiUFJFRiI7Ci0KLSAgICAvLyBQaG9uZSB0eXBlIHBhcmFtZXRlcnMgdmFsaWQgaW4gdkNhcmQgYW5kIGtub3duIHRvIENvbnRhY3RzQ29udHJhY3QsIGJ1dCBub3Qgc28gY29tbW9uLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfQ0FSID0gIkNBUiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9JU0ROID0gIklTRE4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfUEFHRVIgPSAiUEFHRVIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfVExYID0gIlRMWCI7ICAvLyBUZWxleAotCi0gICAgLy8gUGhvbmUgdHlwZXMgZXhpc3RpbmcgaW4gdkNhcmQgMi4xIGJ1dCBub3Qga25vd24gdG8gQ29udGFjdHNDb250cmFjdC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX01PREVNID0gIk1PREVNIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX01TRyA9ICJNU0ciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfQkJTID0gIkJCUyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9WSURFTyA9ICJWSURFTyI7Ci0KLSAgICAvLyBUWVBFIHBhcmFtZXRlcnMgZm9yIFBob25lcywgd2hpY2ggYXJlIG5vdCBmb3JtYWxseSB2YWxpZCBpbiB2Q2FyZCAoYXQgbGVhc3QgMi4xKS4KLSAgICAvLyBUaGVzZSB0eXBlcyBhcmUgYmFzaWNhbGx5IGVuY29kZWQgdG8gIlgtIiBwYXJhbWV0ZXJzIHdoZW4gY29tcG9zaW5nIHZDYXJkLgotICAgIC8vIFBhcnNlciBwYXNzZXMgdGhlc2Ugd2hlbiAiWC0iIGlzIGFkZGVkIHRvIHRoZSBwYXJhbWV0ZXIgb3Igbm90LgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BIT05FX0VYVFJBX1RZUEVfQ0FMTEJBQ0sgPSAiQ0FMTEJBQ0siOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BIT05FX0VYVFJBX1RZUEVfUkFESU8gPSAiUkFESU8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BIT05FX0VYVFJBX1RZUEVfVFRZX1RERCA9ICJUVFktVEREIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0FTU0lTVEFOVCA9ICJBU1NJU1RBTlQiOwotICAgIC8vIHZDYXJkIGNvbXBvc2VyIHRyYW5zbGF0ZXMgdGhpcyB0eXBlIHRvICJXT1JLIiArICJQUkVGIi4gSnVzdCBmb3IgcGFyc2luZy4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0NPTVBBTllfTUFJTiA9ICJDT01QQU5ZLU1BSU4iOwotICAgIC8vIHZDYXJkIGNvbXBvc2VyIHRyYW5zbGF0ZXMgdGhpcyB0eXBlIHRvICJWT0lDRSIgSnVzdCBmb3IgcGFyc2luZy4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX09USEVSID0gIk9USEVSIjsKLQotICAgIC8vIFRZUEUgcGFyYW1ldGVycyBmb3IgcG9zdGFsIGFkZHJlc3Nlcy4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9BRFJfVFlQRV9QQVJDRUwgPSAiUEFSQ0VMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9BRFJfVFlQRV9ET00gPSAiRE9NIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9BRFJfVFlQRV9JTlRMID0gIklOVEwiOwotCi0gICAgLy8gVFlQRSBwYXJhbWV0ZXJzIG5vdCBvZmZpY2lhbGx5IHZhbGlkIGJ1dCB1c2VkIGluIHNvbWUgdkNhcmQgZXhwb3J0ZXIuCi0gICAgLy8gRG8gbm90IHVzZSBpbiBjb21wb3NlciBzaWRlLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0VYVFJBX1RZUEVfQ09NUEFOWSA9ICJDT01QQU5ZIjsKLQotICAgIC8vIERvQ29NbyBzcGVjaWZpYyB0eXBlIHBhcmFtZXRlci4gVXNlZCB3aXRoICJTT1VORCIgcHJvcGVydHksIHdoaWNoIGlzIGFsdGVybmF0ZSBvZiBTT1JULVNUUklORyBpbgotICAgIC8vIHZDYXJkIDMuMC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1hfSVJNQ19OID0gIlgtSVJNQy1OIjsKLQotICAgIHB1YmxpYyBpbnRlcmZhY2UgSW1wb3J0T25seSB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfTklDS05BTUUgPSAiWC1OSUNLTkFNRSI7Ci0gICAgICAgIC8vIFNvbWUgZGV2aWNlIGVtaXRzIHRoaXMgIlgtIiBwYXJhbWV0ZXIgZm9yIGV4cHJlc3NpbmcgR29vZ2xlIFRhbGssCi0gICAgICAgIC8vIHdoaWNoIGlzIHNwZWNpZmljYWxseSBpbnZhbGlkIGJ1dCBzaG91bGQgYmUgYWx3YXlzIHByb3Blcmx5IGFjY2VwdGVkLCBhbmQgZW1pdHRlZAotICAgICAgICAvLyBpbiBzb21lIHNwZWNpYWwgY2FzZSAoZm9yIHRoYXQgZGV2aWNlL2FwcGxpY2F0aW9uKS4KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9HT09HTEVfVEFMS19XSVRIX1NQQUNFID0gIlgtR09PR0xFIFRBTEsiOwotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBNQVhfREFUQV9DT0xVTU4gPSAxNTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBNQVhfQ0hBUkFDVEVSX05VTVNfUVAgPSA3NjsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9DSEFSQUNURVJfTlVNU19CQVNFNjRfVjMwID0gNzU7Ci0KLSAgICBwcml2YXRlIFZDYXJkQ29uc3RhbnRzKCkgewotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdkM2ZiYy4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyUmVzdWx0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50Lk9wZXJhdGlvbkFwcGxpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3Q7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Hcm91cHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkdyb3VwTWVtYmVyc2hpcDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLldlYnNpdGU7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJVdGlsczsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBicmlkZ2VzIGJldHdlZW4gZGF0YSBzdHJ1Y3R1cmUgb2YgQ29udGFjdCBhcHAgYW5kIFZDYXJkIGRhdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZEVudHJ5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZEVudHJ5IjsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBERUZBVUxUX09SR0FOSVpBVElPTl9UWVBFID0gT3JnYW5pemF0aW9uLlRZUEVfV09SSzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEVfR09PR0xFID0gImNvbS5nb29nbGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHT09HTEVfTVlfQ09OVEFDVFNfR1JPVVAgPSAiU3lzdGVtIEdyb3VwOiBNeSBDb250YWN0cyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzSW1NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfQUlNLCBJbS5QUk9UT0NPTF9BSU0pOwotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfTVNOLCBJbS5QUk9UT0NPTF9NU04pOwotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfWUFIT08sIEltLlBST1RPQ09MX1lBSE9PKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0lDUSwgSW0uUFJPVE9DT0xfSUNRKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0pBQkJFUiwgSW0uUFJPVE9DT0xfSkFCQkVSKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1NLWVBFX1VTRVJOQU1FLCBJbS5QUk9UT0NPTF9TS1lQRSk7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9HT09HTEVfVEFMSywgSW0uUFJPVE9DT0xfR09PR0xFX1RBTEspOwotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLkltcG9ydE9ubHkuUFJPUEVSVFlfWF9HT09HTEVfVEFMS19XSVRIX1NQQUNFLAotICAgICAgICAgICAgICAgIEltLlBST1RPQ09MX0dPT0dMRV9UQUxLKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIGNsYXNzIFBob25lRGF0YSB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBkYXRhOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGxhYmVsOwotICAgICAgICAvLyBpc1ByaW1hcnkgaXMgY2hhbmdhYmxlIG9ubHkgd2hlbiB0aGVyZSdzIG5vIGFwcHJvcHJpYXRlIG9uZSBleGlzdGluZyBpbgotICAgICAgICAvLyB0aGUgb3JpZ2luYWwgVkNhcmQuCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWFyeTsKLSAgICAgICAgcHVibGljIFBob25lRGF0YShpbnQgdHlwZSwgU3RyaW5nIGRhdGEsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwotICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFBob25lRGF0YSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQaG9uZURhdGEgcGhvbmVEYXRhID0gKFBob25lRGF0YSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gcGhvbmVEYXRhLnR5cGUgJiYgZGF0YS5lcXVhbHMocGhvbmVEYXRhLmRhdGEpICYmCi0gICAgICAgICAgICAgICAgICAgIGxhYmVsLmVxdWFscyhwaG9uZURhdGEubGFiZWwpICYmIGlzUHJpbWFyeSA9PSBwaG9uZURhdGEuaXNQcmltYXJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInR5cGU6ICVkLCBkYXRhOiAlcywgbGFiZWw6ICVzLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgZGF0YSwgbGFiZWwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIGNsYXNzIEVtYWlsRGF0YSB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBkYXRhOwotICAgICAgICAvLyBVc2VkIG9ubHkgd2hlbiBUWVBFIGlzIFRZUEVfQ1VTVE9NLgotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGxhYmVsOwotICAgICAgICAvLyBpc1ByaW1hcnkgaXMgY2hhbmdhYmxlIG9ubHkgd2hlbiB0aGVyZSdzIG5vIGFwcHJvcHJpYXRlIG9uZSBleGlzdGluZyBpbgotICAgICAgICAvLyB0aGUgb3JpZ2luYWwgVkNhcmQuCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWFyeTsKLSAgICAgICAgcHVibGljIEVtYWlsRGF0YShpbnQgdHlwZSwgU3RyaW5nIGRhdGEsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwotICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIEVtYWlsRGF0YSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFbWFpbERhdGEgZW1haWxEYXRhID0gKEVtYWlsRGF0YSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gZW1haWxEYXRhLnR5cGUgJiYgZGF0YS5lcXVhbHMoZW1haWxEYXRhLmRhdGEpICYmCi0gICAgICAgICAgICAgICAgICAgIGxhYmVsLmVxdWFscyhlbWFpbERhdGEubGFiZWwpICYmIGlzUHJpbWFyeSA9PSBlbWFpbERhdGEuaXNQcmltYXJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInR5cGU6ICVkLCBkYXRhOiAlcywgbGFiZWw6ICVzLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgZGF0YSwgbGFiZWwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIGNsYXNzIFBvc3RhbERhdGEgewotICAgICAgICAvLyBEZXRlcm1pbmVkIGJ5IHZDYXJkIHNwZWMuCi0gICAgICAgIC8vIFBPIEJveCwgRXh0ZW5kZWQgQWRkciwgU3RyZWV0LCBMb2NhbGl0eSwgUmVnaW9uLCBQb3N0YWwgQ29kZSwgQ291bnRyeSBOYW1lCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERFJfTUFYX0RBVEFfU0laRSA9IDc7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gZGF0YUFycmF5OwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHBvYm94OwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGV4dGVuZGVkQWRkcmVzczsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBzdHJlZXQ7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbG9jYWx0eTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyByZWdpb247Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgcG9zdGFsQ29kZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBjb3VudHJ5OwotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbGFiZWw7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWFyeTsKLQotICAgICAgICBwdWJsaWMgUG9zdGFsRGF0YShmaW5hbCBpbnQgdHlwZSwgZmluYWwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIGRhdGFBcnJheSA9IG5ldyBTdHJpbmdbQUREUl9NQVhfREFUQV9TSVpFXTsKLQotICAgICAgICAgICAgaW50IHNpemUgPSBwcm9wVmFsdWVMaXN0LnNpemUoKTsKLSAgICAgICAgICAgIGlmIChzaXplID4gQUREUl9NQVhfREFUQV9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IEFERFJfTUFYX0RBVEFfU0laRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYWRyLXZhbHVlID0gMCo2KHRleHQtdmFsdWUgIjsiKSB0ZXh0LXZhbHVlCi0gICAgICAgICAgICAvLyAgICAgICAgICAgOyBQTyBCb3gsIEV4dGVuZGVkIEFkZHJlc3MsIFN0cmVldCwgTG9jYWxpdHksIFJlZ2lvbiwgUG9zdGFsCi0gICAgICAgICAgICAvLyAgICAgICAgICAgOyBDb2RlLCBDb3VudHJ5IE5hbWUKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBVc2UgSXRlcmF0b3IgYXNzdW1pbmcgTGlzdCBtYXkgYmUgTGlua2VkTGlzdCwgdGhvdWdoIGFjdHVhbGx5IGl0IGlzCi0gICAgICAgICAgICAvLyBhbHdheXMgQXJyYXlMaXN0IGluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLgotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgYWRkcmVzc0VsZW1lbnQgOiBwcm9wVmFsdWVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgZGF0YUFycmF5W2ldID0gYWRkcmVzc0VsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKCsraSA+PSBzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChpIDwgQUREUl9NQVhfREFUQV9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgZGF0YUFycmF5W2krK10gPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLnBvYm94ID0gZGF0YUFycmF5WzBdOwotICAgICAgICAgICAgdGhpcy5leHRlbmRlZEFkZHJlc3MgPSBkYXRhQXJyYXlbMV07Ci0gICAgICAgICAgICB0aGlzLnN0cmVldCA9IGRhdGFBcnJheVsyXTsKLSAgICAgICAgICAgIHRoaXMubG9jYWx0eSA9IGRhdGFBcnJheVszXTsKLSAgICAgICAgICAgIHRoaXMucmVnaW9uID0gZGF0YUFycmF5WzRdOwotICAgICAgICAgICAgdGhpcy5wb3N0YWxDb2RlID0gZGF0YUFycmF5WzVdOwotICAgICAgICAgICAgdGhpcy5jb3VudHJ5ID0gZGF0YUFycmF5WzZdOwotICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFBvc3RhbERhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgUG9zdGFsRGF0YSBwb3N0YWxEYXRhID0gKFBvc3RhbERhdGEpb2JqOwotICAgICAgICAgICAgcmV0dXJuIChBcnJheXMuZXF1YWxzKGRhdGFBcnJheSwgcG9zdGFsRGF0YS5kYXRhQXJyYXkpICYmCi0gICAgICAgICAgICAgICAgICAgICh0eXBlID09IHBvc3RhbERhdGEudHlwZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00gPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhYmVsID09IHBvc3RhbERhdGEubGFiZWwpIDogdHJ1ZSkpICYmCi0gICAgICAgICAgICAgICAgICAgIChpc1ByaW1hcnkgPT0gcG9zdGFsRGF0YS5pc1ByaW1hcnkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkQWRkcmVzcyhmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgYm9vbGVhbiBlbXB0eSA9IHRydWU7Ci0gICAgICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNKYXBhbmVzZURldmljZSh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSW4gSmFwYW4sIHRoZSBvcmRlciBpcyByZXZlcnNlZC4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gQUREUl9NQVhfREFUQV9TSVpFIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NQYXJ0ID0gZGF0YUFycmF5W2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGFkZHJlc3NQYXJ0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChhZGRyZXNzUGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQUREUl9NQVhfREFUQV9TSVpFOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NQYXJ0ID0gZGF0YUFycmF5W2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGFkZHJlc3NQYXJ0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChhZGRyZXNzUGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCkudHJpbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgidHlwZTogJWQsIGxhYmVsOiAlcywgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBPcmdhbml6YXRpb25EYXRhIHsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCB0eXBlOwotICAgICAgICAvLyBub24tZmluYWwgaXMgSW50ZW50aW9uYWw6IHdlIG1heSBjaGFuZ2UgdGhlIHZhbHVlcyBzaW5jZSB0aGlzIGluZm8gaXMgc2VwYXJhdGVkIGludG8KLSAgICAgICAgLy8gdHdvIHBhcnRzIGluIHZDYXJkOiAiT1JHIiArICJUSVRMRSIuCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY29tcGFueU5hbWU7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZGVwYXJ0bWVudE5hbWU7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgdGl0bGVOYW1lOwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnk7Ci0KLSAgICAgICAgcHVibGljIE9yZ2FuaXphdGlvbkRhdGEoaW50IHR5cGUsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBhbnlOYW1lLAotICAgICAgICAgICAgICAgIFN0cmluZyBkZXBhcnRtZW50TmFtZSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGl0bGVOYW1lLAotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5jb21wYW55TmFtZSA9IGNvbXBhbnlOYW1lOwotICAgICAgICAgICAgdGhpcy5kZXBhcnRtZW50TmFtZSA9IGRlcGFydG1lbnROYW1lOwotICAgICAgICAgICAgdGhpcy50aXRsZU5hbWUgPSB0aXRsZU5hbWU7Ci0gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgT3JnYW5pemF0aW9uRGF0YSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPcmdhbml6YXRpb25EYXRhIG9yZ2FuaXphdGlvbiA9IChPcmdhbml6YXRpb25EYXRhKW9iajsKLSAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBvcmdhbml6YXRpb24udHlwZSAmJgotICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZXF1YWxzKGNvbXBhbnlOYW1lLCBvcmdhbml6YXRpb24uY29tcGFueU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5lcXVhbHMoZGVwYXJ0bWVudE5hbWUsIG9yZ2FuaXphdGlvbi5kZXBhcnRtZW50TmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLmVxdWFscyh0aXRsZU5hbWUsIG9yZ2FuaXphdGlvbi50aXRsZU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9PSBvcmdhbml6YXRpb24uaXNQcmltYXJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkU3RyaW5nKCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoY29tcGFueU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY29tcGFueU5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGRlcGFydG1lbnROYW1lKSkgewotICAgICAgICAgICAgICAgIGlmIChidWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZGVwYXJ0bWVudE5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHRpdGxlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHRpdGxlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAidHlwZTogJWQsIGNvbXBhbnk6ICVzLCBkZXBhcnRtZW50OiAlcywgdGl0bGU6ICVzLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgY29tcGFueU5hbWUsIGRlcGFydG1lbnROYW1lLCB0aXRsZU5hbWUsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIGNsYXNzIEltRGF0YSB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgcHJvdG9jb2w7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY3VzdG9tUHJvdG9jb2w7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBkYXRhOwotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnk7Ci0KLSAgICAgICAgcHVibGljIEltRGF0YShmaW5hbCBpbnQgcHJvdG9jb2wsIGZpbmFsIFN0cmluZyBjdXN0b21Qcm90b2NvbCwgZmluYWwgaW50IHR5cGUsCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRhdGEsIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7Ci0gICAgICAgICAgICB0aGlzLmN1c3RvbVByb3RvY29sID0gY3VzdG9tUHJvdG9jb2w7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKLSAgICAgICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBJbURhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSW1EYXRhIGltRGF0YSA9IChJbURhdGEpb2JqOwotICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IGltRGF0YS50eXBlICYmIHByb3RvY29sID09IGltRGF0YS5wcm90b2NvbAotICAgICAgICAgICAgICAgICAgICAmJiAoY3VzdG9tUHJvdG9jb2wgIT0gbnVsbCA/IGN1c3RvbVByb3RvY29sLmVxdWFscyhpbURhdGEuY3VzdG9tUHJvdG9jb2wpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbURhdGEuY3VzdG9tUHJvdG9jb2wgPT0gbnVsbCkpCi0gICAgICAgICAgICAgICAgICAgICYmIChkYXRhICE9IG51bGwgPyBkYXRhLmVxdWFscyhpbURhdGEuZGF0YSkgOiAoaW1EYXRhLmRhdGEgPT0gbnVsbCkpCi0gICAgICAgICAgICAgICAgICAgICYmIGlzUHJpbWFyeSA9PSBpbURhdGEuaXNQcmltYXJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJ0eXBlOiAlZCwgcHJvdG9jb2w6ICVkLCBjdXN0b21fcHJvdGNvbDogJXMsIGRhdGE6ICVzLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgcHJvdG9jb2wsIGN1c3RvbVByb3RvY29sLCBkYXRhLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBQaG90b0RhdGEgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfRkxBU0ggPSAiU1dGIjsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCB0eXBlOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGZvcm1hdE5hbWU7ICAvLyB1c2VkIHdoZW4gdHlwZSBpcyBub3QgZGVmaW5lZCBpbiBDb250YWN0c0NvbnRyYWN0LgotICAgICAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIHBob3RvQnl0ZXM7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUHJpbWFyeTsKLQotICAgICAgICBwdWJsaWMgUGhvdG9EYXRhKGludCB0eXBlLCBTdHJpbmcgZm9ybWF0TmFtZSwgYnl0ZVtdIHBob3RvQnl0ZXMsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5mb3JtYXROYW1lID0gZm9ybWF0TmFtZTsKLSAgICAgICAgICAgIHRoaXMucGhvdG9CeXRlcyA9IHBob3RvQnl0ZXM7Ci0gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUGhvdG9EYXRhKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFBob3RvRGF0YSBwaG90b0RhdGEgPSAoUGhvdG9EYXRhKW9iajsKLSAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBwaG90b0RhdGEudHlwZSAmJgotICAgICAgICAgICAgICAgICAgICAoZm9ybWF0TmFtZSA9PSBudWxsID8gKHBob3RvRGF0YS5mb3JtYXROYW1lID09IG51bGwpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXROYW1lLmVxdWFscyhwaG90b0RhdGEuZm9ybWF0TmFtZSkpICYmCi0gICAgICAgICAgICAgICAgICAgIChBcnJheXMuZXF1YWxzKHBob3RvQnl0ZXMsIHBob3RvRGF0YS5waG90b0J5dGVzKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeSA9PSBwaG90b0RhdGEuaXNQcmltYXJ5KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ0eXBlOiAlZCwgZm9ybWF0OiAlczogc2l6ZTogJWQsIGlzUHJpbWFyeTogJXMiLAotICAgICAgICAgICAgICAgICAgICB0eXBlLCBmb3JtYXROYW1lLCBwaG90b0J5dGVzLmxlbmd0aCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNsYXNzIFByb3BlcnR5IHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVByb3BlcnR5TmFtZTsKLSAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IG1QYXJhbWV0ZXJNYXAgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+KCk7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1Qcm9wZXJ0eVZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBwcml2YXRlIGJ5dGVbXSBtUHJvcGVydHlCeXRlczsKLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eU5hbWUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICAgICAgbVByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihmaW5hbCBTdHJpbmcgcGFyYW1OYW1lLCBmaW5hbCBTdHJpbmcgcGFyYW1WYWx1ZSkgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHZhbHVlczsKLSAgICAgICAgICAgIGlmICghbVBhcmFtZXRlck1hcC5jb250YWluc0tleShwYXJhbU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmFtTmFtZS5lcXVhbHMoIlRZUEUiKSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJNYXAucHV0KHBhcmFtTmFtZSwgdmFsdWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVzID0gbVBhcmFtZXRlck1hcC5nZXQocGFyYW1OYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbHVlcy5hZGQocGFyYW1WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRUb1Byb3BlcnR5VmFsdWVMaXN0KGZpbmFsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0gICAgICAgICAgICBtUHJvcGVydHlWYWx1ZUxpc3QuYWRkKHByb3BlcnR5VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlCeXRlcyhmaW5hbCBieXRlW10gcHJvcGVydHlCeXRlcykgewotICAgICAgICAgICAgbVByb3BlcnR5Qnl0ZXMgPSBwcm9wZXJ0eUJ5dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBnZXRQYXJhbWV0ZXJzKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBhcmFtZXRlck1hcC5nZXQodHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldFByb3BlcnR5VmFsdWVMaXN0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm9wZXJ0eVZhbHVlTGlzdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgbVByb3BlcnR5TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICBtUGFyYW1ldGVyTWFwLmNsZWFyKCk7Ci0gICAgICAgICAgICBtUHJvcGVydHlWYWx1ZUxpc3QuY2xlYXIoKTsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eUJ5dGVzID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIG1GYW1pbHlOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1HaXZlbk5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU1pZGRsZU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVByZWZpeDsKLSAgICBwcml2YXRlIFN0cmluZyBtU3VmZml4OwotCi0gICAgLy8gVXNlZCBvbmx5IHdoZW4gbm8gZmFtaWx5IG5vciBnaXZlbiBuYW1lIGlzIGZvdW5kLgotICAgIHByaXZhdGUgU3RyaW5nIG1GdWxsTmFtZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1QaG9uZXRpY0ZhbWlseU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVBob25ldGljR2l2ZW5OYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1QaG9uZXRpY01pZGRsZU5hbWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtUGhvbmV0aWNGdWxsTmFtZTsKLQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1OaWNrTmFtZUxpc3Q7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtRGlzcGxheU5hbWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtQmlydGhkYXk7Ci0KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtTm90ZUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFBob25lRGF0YT4gbVBob25lTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8RW1haWxEYXRhPiBtRW1haWxMaXN0OwotICAgIHByaXZhdGUgTGlzdDxQb3N0YWxEYXRhPiBtUG9zdGFsTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8T3JnYW5pemF0aW9uRGF0YT4gbU9yZ2FuaXphdGlvbkxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PEltRGF0YT4gbUltTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8UGhvdG9EYXRhPiBtUGhvdG9MaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1XZWJzaXRlTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8TGlzdDxTdHJpbmc+PiBtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdDsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IG1WQ2FyZFR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50IG1BY2NvdW50OwotCi0gICAgcHVibGljIFZDYXJkRW50cnkoKSB7Ci0gICAgICAgIHRoaXMoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19VVEY4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeShpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHRoaXModmNhcmRUeXBlLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeShpbnQgdmNhcmRUeXBlLCBBY2NvdW50IGFjY291bnQpIHsKLSAgICAgICAgbVZDYXJkVHlwZSA9IHZjYXJkVHlwZTsKLSAgICAgICAgbUFjY291bnQgPSBhY2NvdW50OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRQaG9uZShpbnQgdHlwZSwgU3RyaW5nIGRhdGEsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgaWYgKG1QaG9uZUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbVBob25lTGlzdCA9IG5ldyBBcnJheUxpc3Q8UGhvbmVEYXRhPigpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB0cmltZWQgPSBkYXRhLnRyaW0oKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdHRlZE51bWJlcjsKLSAgICAgICAgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9QQUdFUiB8fCBWQ2FyZENvbmZpZy5yZWZyYWluUGhvbmVOdW1iZXJGb3JtYXR0aW5nKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBmb3JtYXR0ZWROdW1iZXIgPSB0cmltZWQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdHJpbWVkLmxlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNoYXIgY2ggPSB0cmltZWQuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIGlmICgoJzAnIDw9IGNoICYmIGNoIDw9ICc5JykgfHwgKGkgPT0gMCAmJiBjaCA9PSAnKycpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVzZSBOQU5QIGluIGRlZmF1bHQgd2hlbiB0aGVyZSdzIG5vIGluZm9ybWF0aW9uIGFib3V0IGxvY2FsZS4KLSAgICAgICAgICAgIGZpbmFsIGludCBmb3JtYXR0aW5nVHlwZSA9IFZDYXJkVXRpbHMuZ2V0UGhvbmVOdW1iZXJGb3JtYXQobVZDYXJkVHlwZSk7Ci0gICAgICAgICAgICBmb3JtYXR0ZWROdW1iZXIgPSBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcihidWlsZGVyLnRvU3RyaW5nKCksIGZvcm1hdHRpbmdUeXBlKTsKLSAgICAgICAgfQotICAgICAgICBQaG9uZURhdGEgcGhvbmVEYXRhID0gbmV3IFBob25lRGF0YSh0eXBlLCBmb3JtYXR0ZWROdW1iZXIsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICBtUGhvbmVMaXN0LmFkZChwaG9uZURhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGROaWNrTmFtZShmaW5hbCBTdHJpbmcgbmlja05hbWUpIHsKLSAgICAgICAgaWYgKG1OaWNrTmFtZUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbU5pY2tOYW1lTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICB9Ci0gICAgICAgIG1OaWNrTmFtZUxpc3QuYWRkKG5pY2tOYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkRW1haWwoaW50IHR5cGUsIFN0cmluZyBkYXRhLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KXsKLSAgICAgICAgaWYgKG1FbWFpbExpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbUVtYWlsTGlzdCA9IG5ldyBBcnJheUxpc3Q8RW1haWxEYXRhPigpOwotICAgICAgICB9Ci0gICAgICAgIG1FbWFpbExpc3QuYWRkKG5ldyBFbWFpbERhdGEodHlwZSwgZGF0YSwgbGFiZWwsIGlzUHJpbWFyeSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRQb3N0YWwoaW50IHR5cGUsIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KXsKLSAgICAgICAgaWYgKG1Qb3N0YWxMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Qb3N0YWxMaXN0ID0gbmV3IEFycmF5TGlzdDxQb3N0YWxEYXRhPigwKTsKLSAgICAgICAgfQotICAgICAgICBtUG9zdGFsTGlzdC5hZGQobmV3IFBvc3RhbERhdGEodHlwZSwgcHJvcFZhbHVlTGlzdCwgbGFiZWwsIGlzUHJpbWFyeSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3VsZCBiZSBjYWxsZWQgdmlhIHtAbGluayAjaGFuZGxlT3JnVmFsdWUoaW50LCBMaXN0LCBib29sZWFuKX0gb3IKLSAgICAgKiB7QGxpbmsgI2hhbmRsZVRpdGxlVmFsdWUoU3RyaW5nKX0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE5ld09yZ2FuaXphdGlvbihpbnQgdHlwZSwgZmluYWwgU3RyaW5nIGNvbXBhbnlOYW1lLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlcGFydG1lbnROYW1lLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRpdGxlTmFtZSwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgaWYgKG1Pcmdhbml6YXRpb25MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Pcmdhbml6YXRpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxPcmdhbml6YXRpb25EYXRhPigpOwotICAgICAgICB9Ci0gICAgICAgIG1Pcmdhbml6YXRpb25MaXN0LmFkZChuZXcgT3JnYW5pemF0aW9uRGF0YSh0eXBlLCBjb21wYW55TmFtZSwKLSAgICAgICAgICAgICAgICBkZXBhcnRtZW50TmFtZSwgdGl0bGVOYW1lLCBpc1ByaW1hcnkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gc0VtcHR5TGlzdCA9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5ldyBBcnJheUxpc3Q8U3RyaW5nPigwKSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgIk9SRyIgcmVsYXRlZCB2YWx1ZXMgdG8gdGhlIGFwcHJvcHJpYXRlIGRhdGEuIElmIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZQotICAgICAqIHtAbGluayBPcmdhbml6YXRpb25EYXRhfSBvYmplY3RzLCB0aGlzIGlucHV0IGRhdGEgYXJlIGF0dGFjaGVkIHRvIHRoZSBsYXN0IG9uZSB3aGljaAotICAgICAqIGRvZXMgbm90IGhhdmUgdmFsaWQgdmFsdWVzIChub3QgaW5jbHVkaW5nIGVtcHR5IGJ1dCBvbmx5IG51bGwpLiBJZiB0aGVyZSdzIG5vCi0gICAgICoge0BsaW5rIE9yZ2FuaXphdGlvbkRhdGF9IG9iamVjdCwgYSBuZXcge0BsaW5rIE9yZ2FuaXphdGlvbkRhdGF9IGlzIGNyZWF0ZWQsCi0gICAgICogd2hvc2UgdGl0bGUgaXMgc2V0IHRvIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU9yZ1ZhbHVlKGZpbmFsIGludCB0eXBlLCBMaXN0PFN0cmluZz4gb3JnTGlzdCwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgaWYgKG9yZ0xpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgb3JnTGlzdCA9IHNFbXB0eUxpc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIGNvbXBhbnlOYW1lOwotICAgICAgICBmaW5hbCBTdHJpbmcgZGVwYXJ0bWVudE5hbWU7Ci0gICAgICAgIGZpbmFsIGludCBzaXplID0gb3JnTGlzdC5zaXplKCk7Ci0gICAgICAgIHN3aXRjaCAoc2l6ZSkgewotICAgICAgICAgICAgY2FzZSAwOiB7Ci0gICAgICAgICAgICAgICAgY29tcGFueU5hbWUgPSAiIjsKLSAgICAgICAgICAgICAgICBkZXBhcnRtZW50TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDE6IHsKLSAgICAgICAgICAgICAgICBjb21wYW55TmFtZSA9IG9yZ0xpc3QuZ2V0KDApOwotICAgICAgICAgICAgICAgIGRlcGFydG1lbnROYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6IHsgIC8vIE1vcmUgdGhhbiAxLgotICAgICAgICAgICAgICAgIGNvbXBhbnlOYW1lID0gb3JnTGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IHN1cmUgd2hpY2ggaXMgdGhlIGNvcnJlY3Qgc3RyaW5nIGZvciBkZXBhcnRtZW50LgotICAgICAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIGtlZXAgYWxsIHRoZSBkYXRhLCBjb25jYXRpbmF0ZSB0aGUgcmVzdCBvZiBlbGVtZW50cy4KLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChvcmdMaXN0LmdldChpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlcGFydG1lbnROYW1lID0gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtT3JnYW5pemF0aW9uTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGZpcnN0IG9yZ2FuaXphdGlvbiBlbnRyeSwgd2l0aCAibnVsbCIgdGl0bGUgd2hpY2ggbWF5IGJlCi0gICAgICAgICAgICAvLyBhZGRlZCB2aWEgaGFuZGxlVGl0bGVWYWx1ZSgpLgotICAgICAgICAgICAgYWRkTmV3T3JnYW5pemF0aW9uKHR5cGUsIGNvbXBhbnlOYW1lLCBkZXBhcnRtZW50TmFtZSwgbnVsbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKE9yZ2FuaXphdGlvbkRhdGEgb3JnYW5pemF0aW9uRGF0YSA6IG1Pcmdhbml6YXRpb25MaXN0KSB7Ci0gICAgICAgICAgICAvLyBOb3QgdXNlIFRleHRVdGlscy5pc0VtcHR5KCkgc2luY2UgT1JHIHdhcyBzZXQgYnV0IHRoZSBlbGVtZW50cyBtaWdodCBiZSBlbXB0eS4KLSAgICAgICAgICAgIC8vIGUuZy4gIk9SRztQUkVGOjsiIC0+IEJvdGggY29tcGFueU5hbWUgYW5kIGRlcGFydG1lbnROYW1lIGJlY29tZSBlbXB0eSBidXQgbm90IG51bGwuCi0gICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5jb21wYW55TmFtZSA9PSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbkRhdGEuZGVwYXJ0bWVudE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFByb2JhYmx5IHRoZSAiVElUTEUiIHByb3BlcnR5IGNvbWVzIGJlZm9yZSB0aGUgIk9SRyIgcHJvcGVydHkgdmlhCi0gICAgICAgICAgICAgICAgLy8gaGFuZGxlVGl0bGVMaW5lKCkuCi0gICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uRGF0YS5jb21wYW55TmFtZSA9IGNvbXBhbnlOYW1lOwotICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbkRhdGEuZGVwYXJ0bWVudE5hbWUgPSBkZXBhcnRtZW50TmFtZTsKLSAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25EYXRhLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm8gT3JnYW5pemF0aW9EYXRhIGlzIGF2YWlsYWJsZS4gQ3JlYXRlIGFub3RoZXIgb25lLCB3aXRoICJudWxsIiB0aXRsZSwgd2hpY2ggbWF5IGJlCi0gICAgICAgIC8vIGFkZGVkIHZpYSBoYW5kbGVUaXRsZVZhbHVlKCkuCi0gICAgICAgIGFkZE5ld09yZ2FuaXphdGlvbih0eXBlLCBjb21wYW55TmFtZSwgZGVwYXJ0bWVudE5hbWUsIG51bGwsIGlzUHJpbWFyeSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0ICJ0aXRsZSIgdmFsdWUgdG8gdGhlIGFwcHJvcHJpYXRlIGRhdGEuIElmIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZQotICAgICAqIE9yZ2FuaXphdGlvbkRhdGEgb2JqZWN0cywgdGhpcyBpbnB1dCBpcyBhdHRhY2hlZCB0byB0aGUgbGFzdCBvbmUgd2hpY2ggZG9lcyBub3QKLSAgICAgKiBoYXZlIHZhbGlkIHRpdGxlIHZhbHVlIChub3QgaW5jbHVkaW5nIGVtcHR5IGJ1dCBvbmx5IG51bGwpLiBJZiB0aGVyZSdzIG5vCi0gICAgICogT3JnYW5pemF0aW9uRGF0YSBvYmplY3QsIGEgbmV3IE9yZ2FuaXphdGlvbkRhdGEgaXMgY3JlYXRlZCwgd2hvc2UgY29tcGFueSBuYW1lIGlzCi0gICAgICogc2V0IHRvIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRpdGxlVmFsdWUoZmluYWwgU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIGlmIChtT3JnYW5pemF0aW9uTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGZpcnN0IG9yZ2FuaXphdGlvbiBlbnRyeSwgd2l0aCAibnVsbCIgb3RoZXIgaW5mbywgd2hpY2ggbWF5IGJlCi0gICAgICAgICAgICAvLyBhZGRlZCB2aWEgaGFuZGxlT3JnVmFsdWUoKS4KLSAgICAgICAgICAgIGFkZE5ld09yZ2FuaXphdGlvbihERUZBVUxUX09SR0FOSVpBVElPTl9UWVBFLCBudWxsLCBudWxsLCB0aXRsZSwgZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoT3JnYW5pemF0aW9uRGF0YSBvcmdhbml6YXRpb25EYXRhIDogbU9yZ2FuaXphdGlvbkxpc3QpIHsKLSAgICAgICAgICAgIGlmIChvcmdhbml6YXRpb25EYXRhLnRpdGxlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uRGF0YS50aXRsZU5hbWUgPSB0aXRsZTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm8gT3JnYW5pemF0aW9uIGlzIGF2YWlsYWJsZS4gQ3JlYXRlIGFub3RoZXIgb25lLCB3aXRoICJudWxsIiBvdGhlciBpbmZvLCB3aGljaCBtYXkgYmUKLSAgICAgICAgLy8gYWRkZWQgdmlhIGhhbmRsZU9yZ1ZhbHVlKCkuCi0gICAgICAgIGFkZE5ld09yZ2FuaXphdGlvbihERUZBVUxUX09SR0FOSVpBVElPTl9UWVBFLCBudWxsLCBudWxsLCB0aXRsZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRJbShpbnQgcHJvdG9jb2wsIFN0cmluZyBjdXN0b21Qcm90b2NvbCwgaW50IHR5cGUsCi0gICAgICAgICAgICBTdHJpbmcgcHJvcFZhbHVlLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBpZiAobUltTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtSW1MaXN0ID0gbmV3IEFycmF5TGlzdDxJbURhdGE+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUltTGlzdC5hZGQobmV3IEltRGF0YShwcm90b2NvbCwgY3VzdG9tUHJvdG9jb2wsIHR5cGUsIHByb3BWYWx1ZSwgaXNQcmltYXJ5KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE5vdGUoZmluYWwgU3RyaW5nIG5vdGUpIHsKLSAgICAgICAgaWYgKG1Ob3RlTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTm90ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMSk7Ci0gICAgICAgIH0KLSAgICAgICAgbU5vdGVMaXN0LmFkZChub3RlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUGhvdG9CeXRlcyhTdHJpbmcgZm9ybWF0TmFtZSwgYnl0ZVtdIHBob3RvQnl0ZXMsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIGlmIChtUGhvdG9MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1QaG90b0xpc3QgPSBuZXcgQXJyYXlMaXN0PFBob3RvRGF0YT4oMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgUGhvdG9EYXRhIHBob3RvRGF0YSA9IG5ldyBQaG90b0RhdGEoMCwgbnVsbCwgcGhvdG9CeXRlcywgaXNQcmltYXJ5KTsKLSAgICAgICAgbVBob3RvTGlzdC5hZGQocGhvdG9EYXRhKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZmFsbHRocm91Z2giKQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVOUHJvcGVydHkoTGlzdDxTdHJpbmc+IGVsZW1zKSB7Ci0gICAgICAgIC8vIEZhbWlseSwgR2l2ZW4sIE1pZGRsZSwgUHJlZml4LCBTdWZmaXguICgxIC0gNSkKLSAgICAgICAgaW50IHNpemU7Ci0gICAgICAgIGlmIChlbGVtcyA9PSBudWxsIHx8IChzaXplID0gZWxlbXMuc2l6ZSgpKSA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2l6ZSA+IDUpIHsKLSAgICAgICAgICAgIHNpemUgPSA1OwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChzaXplKSB7Ci0gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaAotICAgICAgICAgICAgY2FzZSA1OiBtU3VmZml4ID0gZWxlbXMuZ2V0KDQpOwotICAgICAgICAgICAgY2FzZSA0OiBtUHJlZml4ID0gZWxlbXMuZ2V0KDMpOwotICAgICAgICAgICAgY2FzZSAzOiBtTWlkZGxlTmFtZSA9IGVsZW1zLmdldCgyKTsKLSAgICAgICAgICAgIGNhc2UgMjogbUdpdmVuTmFtZSA9IGVsZW1zLmdldCgxKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6IG1GYW1pbHlOYW1lID0gZWxlbXMuZ2V0KDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90ZTogU29tZSBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzIHVzZSB0aGlzIGZpZWxkIGZvciBwaG9uZXRpYyBuYW1lLAotICAgICAqICAgICAgIHNpbmNlIHZDYXJkIDIuMSBkb2VzIG5vdCBoYXZlICJTT1JULVNUUklORyIgdHlwZS4KLSAgICAgKiAgICAgICBBbHNvLCBpbiBzb21lIGNhc2VzLCB0aGUgZmllbGQgaGFzIHNvbWUgJzsncyBpbiBpdC4KLSAgICAgKiAgICAgICBBc3N1bWUgdGhlICc7JyBtZWFucyB0aGUgc2FtZSBtZWFuaW5nIGluIE4gcHJvcGVydHkKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZmFsbHRocm91Z2giKQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVQaG9uZXRpY05hbWVGcm9tU291bmQoTGlzdDxTdHJpbmc+IGVsZW1zKSB7Ci0gICAgICAgIGlmICghKFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0ZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljTWlkZGxlTmFtZSkgJiYKLSAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNHaXZlbk5hbWUpKSkgewotICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGUgb3RoZXIgcHJvcGVydGllcyBsaWtlICJYLVBIT05FVElDLUZJUlNULU5BTUUiIHdhcyBhbHJlYWR5IGZvdW5kLgotICAgICAgICAgICAgLy8gSWdub3JlICJTT1VORDtYLUlSTUMtTiIuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc2l6ZTsKLSAgICAgICAgaWYgKGVsZW1zID09IG51bGwgfHwgKHNpemUgPSBlbGVtcy5zaXplKCkpIDwgMSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQXNzdW1lIHRoYXQgdGhlIG9yZGVyIGlzICJGYW1pbHksIEdpdmVuLCBNaWRkbGUiLgotICAgICAgICAvLyBUaGlzIGlzIG5vdCBmcm9tIHNwZWNpZmljYXRpb24gYnV0IG1lcmUgYXNzdW1wdGlvbi4gU29tZSBKYXBhbmVzZSBwaG9uZXMgdXNlIHRoaXMgb3JkZXIuCi0gICAgICAgIGlmIChzaXplID4gMykgewotICAgICAgICAgICAgc2l6ZSA9IDM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZWxlbXMuZ2V0KDApLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgYm9vbGVhbiBvbmx5Rmlyc3RFbGVtSXNOb25FbXB0eSA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChlbGVtcy5nZXQoaSkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9ubHlGaXJzdEVsZW1Jc05vbkVtcHR5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvbmx5Rmlyc3RFbGVtSXNOb25FbXB0eSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIG5hbWVzQXJyYXkgPSBlbGVtcy5nZXQoMCkuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmFtZUFycmF5TGVuZ3RoID0gbmFtZXNBcnJheS5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVBcnJheUxlbmd0aCA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFzc3VtZSB0aGUgc3RyaW5nIGlzICJGYW1pbHkgTWlkZGxlIEdpdmVuIi4KLSAgICAgICAgICAgICAgICAgICAgbVBob25ldGljRmFtaWx5TmFtZSA9IG5hbWVzQXJyYXlbMF07Ci0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY01pZGRsZU5hbWUgPSBuYW1lc0FycmF5WzFdOwotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNHaXZlbk5hbWUgPSBuYW1lc0FycmF5WzJdOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZUFycmF5TGVuZ3RoID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIHRoZSBzdHJpbmcgaXMgIkZhbWlseSBHaXZlbiIgYmFzZWQgb24gdGhlIEphcGFuZXNlIG1vYmlsZQotICAgICAgICAgICAgICAgICAgICAvLyBwaG9uZXMnIHByZWZlcmVuY2UuCi0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY0ZhbWlseU5hbWUgPSBuYW1lc0FycmF5WzBdOwotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNHaXZlbk5hbWUgPSBuYW1lc0FycmF5WzFdOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY0Z1bGxOYW1lID0gZWxlbXMuZ2V0KDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKHNpemUpIHsKLSAgICAgICAgICAgIC8vIGZhbGx0aHJvdWdoCi0gICAgICAgICAgICBjYXNlIDM6IG1QaG9uZXRpY01pZGRsZU5hbWUgPSBlbGVtcy5nZXQoMik7Ci0gICAgICAgICAgICBjYXNlIDI6IG1QaG9uZXRpY0dpdmVuTmFtZSA9IGVsZW1zLmdldCgxKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6IG1QaG9uZXRpY0ZhbWlseU5hbWUgPSBlbGVtcy5nZXQoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eShmaW5hbCBQcm9wZXJ0eSBwcm9wZXJ0eSkgewotICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5tUHJvcGVydHlOYW1lOwotICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IHBhcmFtTWFwID0gcHJvcGVydHkubVBhcmFtZXRlck1hcDsKLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QgPSBwcm9wZXJ0eS5tUHJvcGVydHlWYWx1ZUxpc3Q7Ci0gICAgICAgIGJ5dGVbXSBwcm9wQnl0ZXMgPSBwcm9wZXJ0eS5tUHJvcGVydHlCeXRlczsKLQotICAgICAgICBpZiAocHJvcFZhbHVlTGlzdC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcm9wVmFsdWUgPSBsaXN0VG9TdHJpbmcocHJvcFZhbHVlTGlzdCkudHJpbSgpOwotCi0gICAgICAgIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVkVSU0lPTikpIHsKLSAgICAgICAgICAgIC8vIHZDYXJkIHZlcnNpb24uIElnbm9yZSB0aGlzLgotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9GTikpIHsKLSAgICAgICAgICAgIG1GdWxsTmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTkFNRSkgJiYgbUZ1bGxOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIE9ubHkgaW4gdkNhcmQgMy4wLiBVc2UgdGhpcyBpZiBGTiwgd2hpY2ggbXVzdCBleGlzdCBpbiB2Q2FyZCAzLjAgYnV0IG1heSBub3QKLSAgICAgICAgICAgIC8vIGFjdHVhbGx5IGV4aXN0IGluIHRoZSByZWFsIHZDYXJkIGRhdGEsIGRvZXMgbm90IGV4aXN0LgotICAgICAgICAgICAgbUZ1bGxOYW1lID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OKSkgewotICAgICAgICAgICAgaGFuZGxlTlByb3BlcnR5KHByb3BWYWx1ZUxpc3QpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9TT1JUX1NUUklORykpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY0Z1bGxOYW1lID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OSUNLTkFNRSkgfHwKLSAgICAgICAgICAgICAgICBwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuSW1wb3J0T25seS5QUk9QRVJUWV9YX05JQ0tOQU1FKSkgewotICAgICAgICAgICAgYWRkTmlja05hbWUocHJvcFZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfU09VTkQpKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiB0eXBlQ29sbGVjdGlvbi5jb250YWlucyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1hfSVJNQ19OKSkgewotICAgICAgICAgICAgICAgIC8vIEFzIG9mIDIwMDktMTAtMDgsIFBhcnNlciBzaWRlIGRvZXMgbm90IHNwbGl0IGEgcHJvcGVydHkgdmFsdWUgaW50byBzZXBhcmF0ZWQKLSAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgdXNpbmcgJzsnIChpbiBvdGhlciB3b3JkcywgcHJvcFZhbHVlTGlzdC5zaXplKCkgPT0gMSksCi0gICAgICAgICAgICAgICAgLy8gd2hpY2ggaXMgY29ycmVjdCBiZWhhdmlvciBmcm9tIHRoZSB2aWV3IG9mIHZDYXJkIDIuMS4KLSAgICAgICAgICAgICAgICAvLyBCdXQgd2Ugd2FudCBpdCB0byBiZSBzZXBhcmF0ZWQsIHNvIGRvIHRoZSBzZXBhcmF0aW9uIGhlcmUuCi0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBob25ldGljTmFtZUxpc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb25zdHJ1Y3RMaXN0RnJvbVZhbHVlKHByb3BWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25maWcuaXNWMzAobVZDYXJkVHlwZSkpOwotICAgICAgICAgICAgICAgIGhhbmRsZVBob25ldGljTmFtZUZyb21Tb3VuZChwaG9uZXRpY05hbWVMaXN0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gSWdub3JlIHRoaXMgZmllbGQgc2luY2UgQW5kcm9pZCBjYW5ub3QgdW5kZXJzdGFuZCB3aGF0IGl0IGlzLgotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9BRFIpKSB7Ci0gICAgICAgICAgICBib29sZWFuIHZhbHVlc0FyZUFsbEVtcHR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogcHJvcFZhbHVlTGlzdCkgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzQXJlQWxsRW1wdHkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZhbHVlc0FyZUFsbEVtcHR5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgdHlwZSA9IC0xOwotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gIiI7Ci0gICAgICAgICAgICBib29sZWFuIGlzUHJpbWFyeSA9IGZhbHNlOwotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlU3RyaW5nIDogdHlwZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVTdHJpbmcudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZy5lcXVhbHNJZ25vcmVDYXNlKFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VYVFJBX1RZUEVfQ09NUEFOWSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJDT01QQU5ZIiBzZWVtcyBlbWl0dGVkIGJ5IFdpbmRvd3MgTW9iaWxlLCB3aGljaCBpcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmljYWxseSBzdXBwb3J0ZWQgYnkgdkNhcmQgMi4xLiBXZSBhc3N1bWUgdGhpcyBpcyBzYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyAiV09SSyIuCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUks7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICIiOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX0FEUl9UWVBFX1BBUkNFTCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9BRFJfVFlQRV9ET00pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fQURSX1RZUEVfSU5UTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBoYXZlIGFueSBhcHByb3ByaWF0ZSB3YXkgdG8gc3RvcmUgdGhpcyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLnN0YXJ0c1dpdGgoIlgtIikgJiYgdHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nID0gdHlwZVN0cmluZy5zdWJzdHJpbmcoMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB2Q2FyZCAzLjAgYWxsb3dzIGlhbmEtdG9rZW4uIEFsc28gc29tZSB2Q2FyZCAyLjEgZXhwb3J0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbWl0IG5vbi1zdGFuZGFyZCB0eXBlcy4gV2UgZG8gbm90IGhhbmRsZSB0aGVpciB2YWx1ZXMgbm93LgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT007Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHR5cGVTdHJpbmc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBXZSB1c2UgIkhPTUUiIGFzIGRlZmF1bHQKLSAgICAgICAgICAgIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgIHR5cGUgPSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkUG9zdGFsKHR5cGUsIHByb3BWYWx1ZUxpc3QsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9FTUFJTCkpIHsKLSAgICAgICAgICAgIGludCB0eXBlID0gLTE7Ci0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBudWxsOwotICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZVN0cmluZyA6IHR5cGVDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBFbWFpbC5UWVBFX0hPTUU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVtYWlsLlRZUEVfV09SSzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NFTEwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gRW1haWwuVFlQRV9NT0JJTEU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5zdGFydHNXaXRoKCJYLSIpICYmIHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVTdHJpbmcuc3Vic3RyaW5nKDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdkNhcmQgMy4wIGFsbG93cyBpYW5hLXRva2VuLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWF5IGhhdmUgSU5URVJORVQgKHNwZWNpZmllZCBpbiB2Q2FyZCBzcGVjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDSE9PTCwgZXRjLgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVtYWlsLlRZUEVfQ1VTVE9NOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB0eXBlU3RyaW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IEVtYWlsLlRZUEVfT1RIRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRFbWFpbCh0eXBlLCBwcm9wVmFsdWUsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9PUkcpKSB7Ci0gICAgICAgICAgICAvLyB2Q2FyZCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHNwZWNpZnkgb3RoZXIgdHlwZXMuCi0gICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSA9IE9yZ2FuaXphdGlvbi5UWVBFX1dPUks7Ci0gICAgICAgICAgICBib29sZWFuIGlzUHJpbWFyeSA9IGZhbHNlOwotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlU3RyaW5nIDogdHlwZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVPcmdWYWx1ZSh0eXBlLCBwcm9wVmFsdWVMaXN0LCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9USVRMRSkpIHsKLSAgICAgICAgICAgIGhhbmRsZVRpdGxlVmFsdWUocHJvcFZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfUk9MRSkpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgY29uZmxpY3RzIHdpdGggVElUTEUuIElnbm9yZSBmb3Igbm93Li4uCi0gICAgICAgICAgICAvLyBoYW5kbGVUaXRsZVZhbHVlKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1BIT1RPKSB8fAotICAgICAgICAgICAgICAgIHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9MT0dPKSkgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHBhcmFtTWFwVmFsdWUgPSBwYXJhbU1hcC5nZXQoIlZBTFVFIik7Ci0gICAgICAgICAgICBpZiAocGFyYW1NYXBWYWx1ZSAhPSBudWxsICYmIHBhcmFtTWFwVmFsdWUuY29udGFpbnMoIlVSTCIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ3VycmVudGx5IHdlIGRvIG5vdCBoYXZlIGFwcHJvcHJpYXRlIGV4YW1wbGUgZm9yIHRlc3RpbmcgdGhpcyBjYXNlLgotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoIlRZUEUiKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZm9ybWF0TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlVmFsdWUgOiB0eXBlQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRi5lcXVhbHModHlwZVZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdE5hbWUgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0TmFtZSA9IHR5cGVWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRQaG90b0J5dGVzKGZvcm1hdE5hbWUsIHByb3BCeXRlcywgaXNQcmltYXJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVEVMKSkgewotICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IHR5cGVPYmplY3QgPQotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuZ2V0UGhvbmVUeXBlRnJvbVN0cmluZ3ModHlwZUNvbGxlY3Rpb24sIHByb3BWYWx1ZSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbDsKLSAgICAgICAgICAgIGlmICh0eXBlT2JqZWN0IGluc3RhbmNlb2YgSW50ZWdlcikgewotICAgICAgICAgICAgICAgIHR5cGUgPSAoSW50ZWdlcil0eXBlT2JqZWN0OwotICAgICAgICAgICAgICAgIGxhYmVsID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfQ1VTVE9NOwotICAgICAgICAgICAgICAgIGxhYmVsID0gdHlwZU9iamVjdC50b1N0cmluZygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsICYmIHR5cGVDb2xsZWN0aW9uLmNvbnRhaW5zKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZFBob25lKHR5cGUsIHByb3BWYWx1ZSwgbGFiZWwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfU0tZUEVfUFNUTk5VTUJFUikpIHsKLSAgICAgICAgICAgIC8vIFRoZSBwaG9uZSBudW1iZXIgYXZhaWxhYmxlIHZpYSBTa3lwZS4KLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gUGhvbmUuVFlQRV9PVEhFUjsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5OwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwgJiYgdHlwZUNvbGxlY3Rpb24uY29udGFpbnMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkUGhvbmUodHlwZSwgcHJvcFZhbHVlLCBudWxsLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHNJbU1hcC5jb250YWluc0tleShwcm9wTmFtZSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBwcm90b2NvbCA9IHNJbU1hcC5nZXQocHJvcE5hbWUpOwotICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIGludCB0eXBlID0gLTE7Ci0gICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGVTdHJpbmcgOiB0eXBlQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzSWdub3JlQ2FzZShWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEltLlRZUEVfSE9NRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHNJZ25vcmVDYXNlKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gSW0uVFlQRV9XT1JLOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IEltLlRZUEVfSE9NRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZEltKHByb3RvY29sLCBudWxsLCB0eXBlLCBwcm9wVmFsdWUsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX05PVEUpKSB7Ci0gICAgICAgICAgICBhZGROb3RlKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1VSTCkpIHsKLSAgICAgICAgICAgIGlmIChtV2Vic2l0ZUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1XZWJzaXRlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1XZWJzaXRlTGlzdC5hZGQocHJvcFZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQkRBWSkpIHsKLSAgICAgICAgICAgIG1CaXJ0aGRheSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19GSVJTVF9OQU1FKSkgewotICAgICAgICAgICAgbVBob25ldGljR2l2ZW5OYW1lID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1BIT05FVElDX01JRERMRV9OQU1FKSkgewotICAgICAgICAgICAgbVBob25ldGljTWlkZGxlTmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19MQVNUX05BTUUpKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNGYW1pbHlOYW1lID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0FORFJPSURfQ1VTVE9NKSkgewotICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGN1c3RvbVByb3BlcnR5TGlzdCA9Ci0gICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb25zdHJ1Y3RMaXN0RnJvbVZhbHVlKHByb3BWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uZmlnLmlzVjMwKG1WQ2FyZFR5cGUpKTsKLSAgICAgICAgICAgIGhhbmRsZUFuZHJvaWRDdXN0b21Qcm9wZXJ0eShjdXN0b21Qcm9wZXJ0eUxpc3QpOwotICAgICAgICAvKn0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJSRVYiKSkgewotICAgICAgICAgICAgLy8gUmV2aXNpb24gb2YgdGhpcyBWQ2FyZCBlbnRyeS4gSSB0aGluayB3ZSBjYW4gaWdub3JlIHRoaXMuCi0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJVSUQiKSkgewotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiS0VZIikpIHsKLSAgICAgICAgICAgIC8vIFR5cGUgaXMgWDUwOSBvciBQR1A/IEkgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHRoaXMuLi4KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoIk1BSUxFUiIpKSB7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJUWiIpKSB7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJHRU8iKSkgewotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiQ0xBU1MiKSkgewotICAgICAgICAgICAgLy8gdkNhcmQgMy4wIG9ubHkuCi0gICAgICAgICAgICAvLyBlLmcuIENMQVNTOkNPTkZJREVOVElBTAotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiUFJPRklMRSIpKSB7Ci0gICAgICAgICAgICAvLyBWQ2FyZCAzLjAgb25seS4gTXVzdCBiZSAiVkNBUkQiLiBJIHRoaW5rIHdlIGNhbiBpZ25vcmUgdGhpcy4KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoIkNBVEVHT1JJRVMiKSkgewotICAgICAgICAgICAgLy8gVkNhcmQgMy4wIG9ubHkuCi0gICAgICAgICAgICAvLyBlLmcuIENBVEVHT1JJRVM6SU5URVJORVQsSUVURixJTkRVU1RSWSxJTkZPUk1BVElPTiBURUNITk9MT0dZCi0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJTT1VSQ0UiKSkgewotICAgICAgICAgICAgLy8gVkNhcmQgMy4wIG9ubHkuCi0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJQUk9ESUQiKSkgewotICAgICAgICAgICAgLy8gVkNhcmQgMy4wIG9ubHkuCi0gICAgICAgICAgICAvLyBUbyBzcGVjaWZ5IHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcHJvZHVjdCB0aGF0IGNyZWF0ZWQKLSAgICAgICAgICAgIC8vIHRoZSB2Q2FyZCBvYmplY3QuKi8KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFVua25vd24gWC0gd29yZHMgYW5kIElBTkEgdG9rZW4uCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQW5kcm9pZEN1c3RvbVByb3BlcnR5KGZpbmFsIExpc3Q8U3RyaW5nPiBjdXN0b21Qcm9wZXJ0eUxpc3QpIHsKLSAgICAgICAgaWYgKG1BbmRyb2lkQ3VzdG9tUHJvcGVydHlMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1BbmRyb2lkQ3VzdG9tUHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0PFN0cmluZz4+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUFuZHJvaWRDdXN0b21Qcm9wZXJ0eUxpc3QuYWRkKGN1c3RvbVByb3BlcnR5TGlzdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IHRoZSBkaXNwbGF5IG5hbWUuIFRoZSBjb25zdHJ1Y3RlZCBkYXRhIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNvbnN0cnVjdERpc3BsYXlOYW1lKCkgewotICAgICAgICAvLyBGdWxsTmFtZSAoY3JlYXRlZCB2aWEgIkZOIiBvciAiTkFNRSIgZmllbGQpIGlzIHByZWZlcmVkLgotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG1GdWxsTmFtZSkpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IG1GdWxsTmFtZTsKLSAgICAgICAgfSBlbHNlIGlmICghKFRleHRVdGlscy5pc0VtcHR5KG1GYW1pbHlOYW1lKSAmJiBUZXh0VXRpbHMuaXNFbXB0eShtR2l2ZW5OYW1lKSkpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IFZDYXJkVXRpbHMuY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyhtVkNhcmRUeXBlLAotICAgICAgICAgICAgICAgICAgICBtRmFtaWx5TmFtZSwgbU1pZGRsZU5hbWUsIG1HaXZlbk5hbWUsIG1QcmVmaXgsIG1TdWZmaXgpOwotICAgICAgICB9IGVsc2UgaWYgKCEoVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljRmFtaWx5TmFtZSkgJiYKLSAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNHaXZlbk5hbWUpKSkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gVkNhcmRVdGlscy5jb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKG1WQ2FyZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY0ZhbWlseU5hbWUsIG1QaG9uZXRpY01pZGRsZU5hbWUsIG1QaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobUVtYWlsTGlzdCAhPSBudWxsICYmIG1FbWFpbExpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gbUVtYWlsTGlzdC5nZXQoMCkuZGF0YTsKLSAgICAgICAgfSBlbHNlIGlmIChtUGhvbmVMaXN0ICE9IG51bGwgJiYgbVBob25lTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBtUGhvbmVMaXN0LmdldCgwKS5kYXRhOwotICAgICAgICB9IGVsc2UgaWYgKG1Qb3N0YWxMaXN0ICE9IG51bGwgJiYgbVBvc3RhbExpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gbVBvc3RhbExpc3QuZ2V0KDApLmdldEZvcm1hdHRlZEFkZHJlc3MobVZDYXJkVHlwZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobU9yZ2FuaXphdGlvbkxpc3QgIT0gbnVsbCAmJiBtT3JnYW5pemF0aW9uTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBtT3JnYW5pemF0aW9uTGlzdC5nZXQoMCkuZ2V0Rm9ybWF0dGVkU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobURpc3BsYXlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9ICIiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc29saWRhdGUgc2V2ZXJhbCBmaWVsc2RzIChsaWtlIG1OYW1lKSB1c2luZyBuYW1lIGNhbmRpZGF0ZXMsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29uc29saWRhdGVGaWVsZHMoKSB7Ci0gICAgICAgIGNvbnN0cnVjdERpc3BsYXlOYW1lKCk7Ci0KLSAgICAgICAgaWYgKG1QaG9uZXRpY0Z1bGxOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY0Z1bGxOYW1lID0gbVBob25ldGljRnVsbE5hbWUudHJpbSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFVyaSBwdXNoSW50b0NvbnRlbnRSZXNvbHZlcihDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLSAgICAgICAgQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4gb3BlcmF0aW9uTGlzdCA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4oKTsKLSAgICAgICAgLy8gQWZ0ZXIgYXBwbHlpbmcgdGhlIGJhdGNoIHRoZSBmaXJzdCByZXN1bHQncyBVcmkgaXMgcmV0dXJuZWQgc28gaXQgaXMgaW1wb3J0YW50IHRoYXQKLSAgICAgICAgLy8gdGhlIFJhd0NvbnRhY3QgaXMgdGhlIGZpcnN0IG9wZXJhdGlvbiB0aGF0IGdldHMgaW5zZXJ0ZWQgaW50byB0aGUgbGlzdAotICAgICAgICBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24uQnVpbGRlciBidWlsZGVyID0KLSAgICAgICAgICAgIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkkpOwotICAgICAgICBTdHJpbmcgbXlHcm91cHNJZCA9IG51bGw7Ci0gICAgICAgIGlmIChtQWNjb3VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShSYXdDb250YWN0cy5BQ0NPVU5UX05BTUUsIG1BY2NvdW50Lm5hbWUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUmF3Q29udGFjdHMuQUNDT1VOVF9UWVBFLCBtQWNjb3VudC50eXBlKTsKLQotICAgICAgICAgICAgLy8gQXNzdW1lIHRoYXQgY2FsbGVyIHNpZGUgY3JlYXRlcyB0aGlzIGdyb3VwIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgICAgICAgICAgaWYgKEFDQ09VTlRfVFlQRV9HT09HTEUuZXF1YWxzKG1BY2NvdW50LnR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ3Vyc29yIGN1cnNvciA9IHJlc29sdmVyLnF1ZXJ5KEdyb3Vwcy5DT05URU5UX1VSSSwgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdyb3Vwcy5TT1VSQ0VfSUQgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdyb3Vwcy5USVRMRSArICI9PyIsIG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHT09HTEVfTVlfQ09OVEFDVFNfR1JPVVAgfSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmIGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBteUdyb3Vwc0lkID0gY3Vyc29yLmdldFN0cmluZygwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShSYXdDb250YWN0cy5BQ0NPVU5UX05BTUUsIG51bGwpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUmF3Q29udGFjdHMuQUNDT1VOVF9UWVBFLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotCi0gICAgICAgIGlmICghbmFtZUZpZWxkc0FyZUVtcHR5KCkpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKFN0cnVjdHVyZWROYW1lLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKTsKLQotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgbUdpdmVuTmFtZSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgbUZhbWlseU5hbWUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsIG1NaWRkbGVOYW1lKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgbVByZWZpeCk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsIG1TdWZmaXgpOwotCi0gICAgICAgICAgICBpZiAoIShUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNHaXZlbk5hbWUpCi0gICAgICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0ZhbWlseU5hbWUpCi0gICAgICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY01pZGRsZU5hbWUpKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsIG1QaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsIG1QaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCBtUGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0Z1bGxOYW1lKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsIG1QaG9uZXRpY0Z1bGxOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCBnZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU5pY2tOYW1lTGlzdCAhPSBudWxsICYmIG1OaWNrTmFtZUxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgbmlja05hbWUgOiBtTmlja05hbWVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKE5pY2tuYW1lLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoTmlja25hbWUuVFlQRSwgTmlja25hbWUuVFlQRV9ERUZBVUxUKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShOaWNrbmFtZS5OQU1FLCBuaWNrTmFtZSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtUGhvbmVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoUGhvbmVEYXRhIHBob25lRGF0YSA6IG1QaG9uZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoUGhvbmUuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKTsKLQotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFBob25lLlRZUEUsIHBob25lRGF0YS50eXBlKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvbmVEYXRhLnR5cGUgPT0gUGhvbmUuVFlQRV9DVVNUT00pIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUGhvbmUuTEFCRUwsIHBob25lRGF0YS5sYWJlbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFBob25lLk5VTUJFUiwgcGhvbmVEYXRhLmRhdGEpOwotICAgICAgICAgICAgICAgIGlmIChwaG9uZURhdGEuaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFBob25lLklTX1BSSU1BUlksIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Pcmdhbml6YXRpb25MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoT3JnYW5pemF0aW9uRGF0YSBvcmdhbml6YXRpb25EYXRhIDogbU9yZ2FuaXphdGlvbkxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoT3JnYW5pemF0aW9uLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE9yZ2FuaXphdGlvbi5UWVBFLCBvcmdhbml6YXRpb25EYXRhLnR5cGUpOwotICAgICAgICAgICAgICAgIGlmIChvcmdhbml6YXRpb25EYXRhLmNvbXBhbnlOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoT3JnYW5pemF0aW9uLkNPTVBBTlksIG9yZ2FuaXphdGlvbkRhdGEuY29tcGFueU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5kZXBhcnRtZW50TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5ULCBvcmdhbml6YXRpb25EYXRhLmRlcGFydG1lbnROYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9yZ2FuaXphdGlvbkRhdGEudGl0bGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoT3JnYW5pemF0aW9uLlRJVExFLCBvcmdhbml6YXRpb25EYXRhLnRpdGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvcmdhbml6YXRpb25EYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShPcmdhbml6YXRpb24uSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUVtYWlsTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEVtYWlsRGF0YSBlbWFpbERhdGEgOiBtRW1haWxMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKEVtYWlsLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBFbWFpbC5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShFbWFpbC5UWVBFLCBlbWFpbERhdGEudHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVtYWlsRGF0YS50eXBlID09IEVtYWlsLlRZUEVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEVtYWlsLkxBQkVMLCBlbWFpbERhdGEubGFiZWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShFbWFpbC5EQVRBLCBlbWFpbERhdGEuZGF0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVtYWlsRGF0YS5pc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtUG9zdGFsTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFBvc3RhbERhdGEgcG9zdGFsRGF0YSA6IG1Qb3N0YWxMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgVkNhcmRVdGlscy5pbnNlcnRTdHJ1Y3R1cmVkUG9zdGFsRGF0YVVzaW5nQ29udGFjdHNTdHJ1Y3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBtVkNhcmRUeXBlLCBidWlsZGVyLCBwb3N0YWxEYXRhKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1JbUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChJbURhdGEgaW1EYXRhIDogbUltTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShJbS5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgSW0uQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEltLlRZUEUsIGltRGF0YS50eXBlKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShJbS5QUk9UT0NPTCwgaW1EYXRhLnByb3RvY29sKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShJbS5EQVRBLCBpbURhdGEuZGF0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKGltRGF0YS5wcm90b2NvbCA9PSBJbS5QUk9UT0NPTF9DVVNUT00pIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoSW0uQ1VTVE9NX1BST1RPQ09MLCBpbURhdGEuY3VzdG9tUHJvdG9jb2wpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaW1EYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLklTX1BSSU1BUlksIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Ob3RlTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBub3RlIDogbU5vdGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKE5vdGUuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE5vdGUuTk9URSwgbm90ZSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtUGhvdG9MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoUGhvdG9EYXRhIHBob3RvRGF0YSA6IG1QaG90b0xpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoUGhvdG8uUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIFBob3RvLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG90by5QSE9UTywgcGhvdG9EYXRhLnBob3RvQnl0ZXMpOwotICAgICAgICAgICAgICAgIGlmIChwaG90b0RhdGEuaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFBob3RvLklTX1BSSU1BUlksIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1XZWJzaXRlTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB3ZWJzaXRlIDogbVdlYnNpdGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKFdlYnNpdGUuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIFdlYnNpdGUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFdlYnNpdGUuVVJMLCB3ZWJzaXRlKTsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIFVSTCBpbiB2Q2FyZC4KLSAgICAgICAgICAgICAgICAvLyBXZSB1c2UgVFlQRV9IT01FUEFHRSBmb3Igc2FmZXR5LgotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFdlYnNpdGUuVFlQRSwgV2Vic2l0ZS5UWVBFX0hPTUVQQUdFKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShtQmlydGhkYXkpKSB7Ci0gICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShFdmVudC5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBFdmVudC5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShFdmVudC5TVEFSVF9EQVRFLCBtQmlydGhkYXkpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9CSVJUSERBWSk7Ci0gICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1BbmRyb2lkQ3VzdG9tUHJvcGVydHlMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoTGlzdDxTdHJpbmc+IGN1c3RvbVByb3BlcnR5TGlzdCA6IG1BbmRyb2lkQ3VzdG9tUHJvcGVydHlMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaW50IHNpemUgPSBjdXN0b21Qcm9wZXJ0eUxpc3Quc2l6ZSgpOwotICAgICAgICAgICAgICAgIGlmIChzaXplIDwgMiB8fCBUZXh0VXRpbHMuaXNFbXB0eShjdXN0b21Qcm9wZXJ0eUxpc3QuZ2V0KDApKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNpemUgPiBWQ2FyZENvbnN0YW50cy5NQVhfREFUQV9DT0xVTU4gKyAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpemUgPSBWQ2FyZENvbnN0YW50cy5NQVhfREFUQV9DT0xVTU4gKyAxOwotICAgICAgICAgICAgICAgICAgICBjdXN0b21Qcm9wZXJ0eUxpc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tUHJvcGVydHlMaXN0LnN1Ykxpc3QoMCwgVkNhcmRDb25zdGFudHMuTUFYX0RBVEFfQ09MVU1OICsgMik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGN1c3RvbVByb3BlcnR5VmFsdWUgOiBjdXN0b21Qcm9wZXJ0eUxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1pbWVUeXBlID0gY3VzdG9tUHJvcGVydHlWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKEdyb3VwTWVtYmVyc2hpcC5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBtaW1lVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAvLyAxIDw9IGkgJiYgaSA8PSBNQVhfREFUQV9DT0xVTU5TCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGN1c3RvbVByb3BlcnR5VmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoImRhdGEiICsgaSwgY3VzdG9tUHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobXlHcm91cHNJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShHcm91cE1lbWJlcnNoaXAuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgR3JvdXBNZW1iZXJzaGlwLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEdyb3VwTWVtYmVyc2hpcC5HUk9VUF9TT1VSQ0VfSUQsIG15R3JvdXBzSWQpOwotICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDb250ZW50UHJvdmlkZXJSZXN1bHRbXSByZXN1bHRzID0gcmVzb2x2ZXIuYXBwbHlCYXRjaCgKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhY3RzQ29udHJhY3QuQVVUSE9SSVRZLCBvcGVyYXRpb25MaXN0KTsKLSAgICAgICAgICAgIC8vIHRoZSBmaXJzdCByZXN1bHQgaXMgYWx3YXlzIHRoZSByYXdfY29udGFjdC4gcmV0dXJuIGl0J3MgdXJpIHNvCi0gICAgICAgICAgICAvLyB0aGF0IGl0IGNhbiBiZSBmb3VuZCBsYXRlci4gZG8gbnVsbCBjaGVja2luZyBmb3IgYmFkbHkgYmVoYXZpbmcKLSAgICAgICAgICAgIC8vIENvbnRlbnRSZXNvbHZlcnMKLSAgICAgICAgICAgIHJldHVybiAocmVzdWx0cyA9PSBudWxsIHx8IHJlc3VsdHMubGVuZ3RoID09IDAgfHwgcmVzdWx0c1swXSA9PSBudWxsKQotICAgICAgICAgICAgICAgID8gbnVsbAotICAgICAgICAgICAgICAgIDogcmVzdWx0c1swXS51cmk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCBTdHJpbmcuZm9ybWF0KCIlczogJXMiLCBlLnRvU3RyaW5nKCksIGUuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQXBwbGljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgiJXM6ICVzIiwgZS50b1N0cmluZygpLCBlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFZDYXJkRW50cnkgYnVpbGRGcm9tUmVzb2x2ZXIoQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7Ci0gICAgICAgIHJldHVybiBidWlsZEZyb21SZXNvbHZlcihyZXNvbHZlciwgQ29udGFjdHMuQ09OVEVOVF9VUkkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVkNhcmRFbnRyeSBidWlsZEZyb21SZXNvbHZlcihDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIsIFVyaSB1cmkpIHsKLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbmFtZUZpZWxkc0FyZUVtcHR5KCkgewotICAgICAgICByZXR1cm4gKFRleHRVdGlscy5pc0VtcHR5KG1GYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1NaWRkbGVOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1HaXZlbk5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobVByZWZpeCkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtU3VmZml4KQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1GdWxsTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY01pZGRsZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0Z1bGxOYW1lKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmFibGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXREaXNwbGF5TmFtZSgpLmxlbmd0aCgpID09IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGlzdFRvU3RyaW5nKExpc3Q8U3RyaW5nPiBsaXN0KXsKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLSAgICAgICAgaWYgKHNpemUgPiAxKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZSA6IGxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCh0eXBlKTsKLSAgICAgICAgICAgICAgICBpZiAoaSA8IHNpemUgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIGlmIChzaXplID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBsaXN0LmdldCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEFsbCBnZXR0ZXIgbWV0aG9kcyBzaG91bGQgYmUgdXNlZCBjYXJlZnVsbHksIHNpbmNlIHRoZXkgbWF5IGNoYW5nZQotICAgIC8vIGluIHRoZSBmdXR1cmUgYXMgb2YgMjAwOS0xMC0wNSwgb24gd2hpY2ggSSBjYW5ub3QgYmUgc3VyZSB0aGlzIHN0cnVjdHVyZQotICAgIC8vIGlzIGNvbXBsZXRlbHkgY29uc29saWRhdGVkLgotICAgIC8vCi0gICAgLy8gQWxzbyBub3RlIHRoYXQgdGhlc2UgZ2V0dGVyIG1ldGhvZHMgc2hvdWxkIGJlIHVzZWQgb25seSBhZnRlcgotICAgIC8vIGFsbCBwcm9wZXJ0aWVzIGJlaW5nIHB1c2hlZCBpbnRvIHRoaXMgb2JqZWN0LiBJZiBub3QsIGluY29ycmVjdAotICAgIC8vIHZhbHVlIHdpbGwgImJlIHN0b3JlZCBpbiB0aGUgbG9jYWwgY2FjaGUgYW5kIiBiZSByZXR1cm5lZCB0byB5b3UuCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhbWlseU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtRmFtaWx5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEdpdmVuTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1HaXZlbk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNaWRkbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gbU1pZGRsZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiBtUHJlZml4OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VmZml4KCkgewotICAgICAgICByZXR1cm4gbVN1ZmZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgewotICAgICAgICByZXR1cm4gbUZ1bGxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNGYW1pbHlOYW1lKCkgewotICAgICAgICByZXR1cm4gbVBob25ldGljRmFtaWx5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBob25ldGljR2l2ZW5OYW1lKCkgewotICAgICAgICByZXR1cm4gbVBob25ldGljR2l2ZW5OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNNaWRkbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gbVBob25ldGljTWlkZGxlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBob25ldGljRnVsbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtUGhvbmV0aWNGdWxsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldE5pY2tOYW1lTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1OaWNrTmFtZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCaXJ0aGRheSgpIHsKLSAgICAgICAgcmV0dXJuIG1CaXJ0aGRheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldE5vdGVzKCkgewotICAgICAgICByZXR1cm4gbU5vdGVMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PFBob25lRGF0YT4gZ2V0UGhvbmVMaXN0KCkgewotICAgICAgICByZXR1cm4gbVBob25lTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxFbWFpbERhdGE+IGdldEVtYWlsTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1FbWFpbExpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8UG9zdGFsRGF0YT4gZ2V0UG9zdGFsTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Qb3N0YWxMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PE9yZ2FuaXphdGlvbkRhdGE+IGdldE9yZ2FuaXphdGlvbkxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtT3JnYW5pemF0aW9uTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxJbURhdGE+IGdldEltTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8UGhvdG9EYXRhPiBnZXRQaG90b0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtUGhvdG9MaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PFN0cmluZz4gZ2V0V2Vic2l0ZUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtV2Vic2l0ZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLSAgICAgICAgaWYgKG1EaXNwbGF5TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb25zdHJ1Y3REaXNwbGF5TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRGlzcGxheU5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb21taXR0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q29tbWl0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YTJiYWYuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb21taXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIDxQPgotICoge0BsaW5rIFZDYXJkRW50cnlIYW5kbGVyfSBpbXBsZW1lbnRhdGlvbiB3aGljaCBjb21taXRzIHRoZSBlbnRyeSB0byBDb250ZW50UmVzb2x2ZXIuCi0gKiA8L1A+Ci0gKiA8UD4KLSAqIE5vdGU6PEJSIC8+Ci0gKiBFYWNoIHZDYXJkIG1heSBjb250YWluIGJpZyBwaG90byBpbWFnZXMgZW5jb2RlZCBieSBCQVNFNjQsCi0gKiBJZiB3ZSBzdG9yZSBhbGwgdkNhcmQgZW50cmllcyBpbiBtZW1vcnksIE91dE9mTWVtb3J5RXJyb3IgbWF5IGJlIHRocm93bi4KLSAqIFRodXMsIHRoaXMgY2xhc3MgcHVzaCBlYWNoIFZDYXJkIGVudHJ5IGludG8gQ29udGVudFJlc29sdmVyIGltbWVkaWF0ZWx5LgotICogPC9QPgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRFbnRyeUNvbW1pdHRlciBpbXBsZW1lbnRzIFZDYXJkRW50cnlIYW5kbGVyIHsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkRW50cnlDb21pdHRlciI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotICAgIHByaXZhdGUgbG9uZyBtVGltZVRvQ29tbWl0OwotICAgIHByaXZhdGUgQXJyYXlMaXN0PFVyaT4gbUNyZWF0ZWRVcmlzID0gbmV3IEFycmF5TGlzdDxVcmk+KCk7Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbW1pdHRlcihDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLSAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IHJlc29sdmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25FbmQoKSB7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5zaG93UGVyZm9ybWFuY2VMb2coKSkgewotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgidGltZSB0byBjb21taXQgZW50cmllczogJWQgbXMiLCBtVGltZVRvQ29tbWl0KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkVudHJ5Q3JlYXRlZChmaW5hbCBWQ2FyZEVudHJ5IGNvbnRhY3RTdHJ1Y3QpIHsKLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBtQ3JlYXRlZFVyaXMuYWRkKGNvbnRhY3RTdHJ1Y3QucHVzaEludG9Db250ZW50UmVzb2x2ZXIobUNvbnRlbnRSZXNvbHZlcikpOwotICAgICAgICBtVGltZVRvQ29tbWl0ICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjcmVhdGVkIFVyaXMuIFRoaXMgbGlzdCBzaG91bGQgbm90IGJlIG1vZGlmaWVkIGJ5IHRoZSBjYWxsZXIgYXMgaXQgaXMKLSAgICAgKiBub3QgYSBjbG9uZS4KLSAgICAgKi8KLSAgIHB1YmxpYyBBcnJheUxpc3Q8VXJpPiBnZXRDcmVhdGVkVXJpcygpIHsKLSAgICAgICAgcmV0dXJuIG1DcmVhdGVkVXJpczsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb25zdHJ1Y3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb25zdHJ1Y3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTRlYzI5Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q29uc3RydWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNoYXJzZXRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLkRlY29kZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLm5ldC5RdW90ZWRQcmludGFibGVDb2RlYzsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgVkNhcmRFbnRyeUNvbnN0cnVjdG9yIGltcGxlbWVudHMgVkNhcmRJbnRlcnByZXRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRFbnRyeUNvbnN0cnVjdG9yIjsKLQotICAgIC8qKgotICAgICAqIElmIHRoZXJlJ3Mgbm8gb3RoZXIgaW5mb3JtYXRpb24gYXZhaWxhYmxlLCB0aGlzIGNsYXNzIHVzZXMgdGhpcyBjaGFyc2V0IGZvciBlbmNvZGluZwotICAgICAqIGJ5dGUgYXJyYXlzIHRvIFN0cmluZy4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DSEFSU0VUX0ZPUl9ERUNPREVEX0JZVEVTID0gIlVURi04IjsKLQotICAgIHByaXZhdGUgVkNhcmRFbnRyeS5Qcm9wZXJ0eSBtQ3VycmVudFByb3BlcnR5ID0gbmV3IFZDYXJkRW50cnkuUHJvcGVydHkoKTsKLSAgICBwcml2YXRlIFZDYXJkRW50cnkgbUN1cnJlbnRDb250YWN0U3RydWN0OwotICAgIHByaXZhdGUgU3RyaW5nIG1QYXJhbVR5cGU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGNoYXJzZXQgdXNpbmcgd2hpY2gge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IHBhcnNlcyB0aGUgdGV4dC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtSW5wdXRDaGFyc2V0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGNoYXJzZXQgd2l0aCB3aGljaCBieXRlIGFycmF5IGlzIGVuY29kZWQgdG8gU3RyaW5nLgotICAgICAqLwotICAgIGZpbmFsIHByaXZhdGUgU3RyaW5nIG1DaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzOwotICAgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBtU3RyaWN0TGluZUJyZWFrUGFyc2luZzsKLSAgICBmaW5hbCBwcml2YXRlIGludCBtVkNhcmRUeXBlOwotICAgIGZpbmFsIHByaXZhdGUgQWNjb3VudCBtQWNjb3VudDsKLSAgICAKLSAgICAvKiogRm9yIG1lYXN1cmluZyBwZXJmb3JtYW5jZS4gKi8KLSAgICBwcml2YXRlIGxvbmcgbVRpbWVQdXNoSW50b0NvbnRlbnRSZXNvbHZlcjsKLQotICAgIGZpbmFsIHByaXZhdGUgTGlzdDxWQ2FyZEVudHJ5SGFuZGxlcj4gbUVudHJ5SGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PFZDYXJkRW50cnlIYW5kbGVyPigpOwotCi0gICAgcHVibGljIFZDYXJkRW50cnlDb25zdHJ1Y3RvcigpIHsKLSAgICAgICAgdGhpcyhudWxsLCBudWxsLCBmYWxzZSwgVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19VVEY4LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgdGhpcyhudWxsLCBudWxsLCBmYWxzZSwgdmNhcmRUeXBlLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKGZpbmFsIFN0cmluZyBjaGFyc2V0LCBmaW5hbCBib29sZWFuIHN0cmljdExpbmVCcmVha1BhcnNpbmcsCi0gICAgICAgICAgICBmaW5hbCBpbnQgdmNhcmRUeXBlLCBmaW5hbCBBY2NvdW50IGFjY291bnQpIHsKLSAgICAgICAgdGhpcyhudWxsLCBjaGFyc2V0LCBzdHJpY3RMaW5lQnJlYWtQYXJzaW5nLCB2Y2FyZFR5cGUsIGFjY291bnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5Q29uc3RydWN0b3IoZmluYWwgU3RyaW5nIGlucHV0Q2hhcnNldCwgZmluYWwgU3RyaW5nIGNoYXJzZXRGb3JEZXRvZGVkQnl0ZXMsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHN0cmljdExpbmVCcmVha1BhcnNpbmcsIGZpbmFsIGludCB2Y2FyZFR5cGUsCi0gICAgICAgICAgICBmaW5hbCBBY2NvdW50IGFjY291bnQpIHsKLSAgICAgICAgaWYgKGlucHV0Q2hhcnNldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSW5wdXRDaGFyc2V0ID0gaW5wdXRDaGFyc2V0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUlucHV0Q2hhcnNldCA9IFZDYXJkQ29uZmlnLkRFRkFVTFRfQ0hBUlNFVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2hhcnNldEZvckRldG9kZWRCeXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2hhcnNldEZvckRlY29kZWRCeXRlcyA9IGNoYXJzZXRGb3JEZXRvZGVkQnl0ZXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ2hhcnNldEZvckRlY29kZWRCeXRlcyA9IERFRkFVTFRfQ0hBUlNFVF9GT1JfREVDT0RFRF9CWVRFUzsKLSAgICAgICAgfQotICAgICAgICBtU3RyaWN0TGluZUJyZWFrUGFyc2luZyA9IHN0cmljdExpbmVCcmVha1BhcnNpbmc7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgICAgIG1BY2NvdW50ID0gYWNjb3VudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFbnRyeUhhbmRsZXIoVkNhcmRFbnRyeUhhbmRsZXIgZW50cnlIYW5kbGVyKSB7Ci0gICAgICAgIG1FbnRyeUhhbmRsZXJzLmFkZChlbnRyeUhhbmRsZXIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEVudHJ5SGFuZGxlciBlbnRyeUhhbmRsZXIgOiBtRW50cnlIYW5kbGVycykgewotICAgICAgICAgICAgZW50cnlIYW5kbGVyLm9uU3RhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEVudHJ5SGFuZGxlciBlbnRyeUhhbmRsZXIgOiBtRW50cnlIYW5kbGVycykgewotICAgICAgICAgICAgZW50cnlIYW5kbGVyLm9uRW5kKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcGFyc2UgZmFpbGVkIGJldHdlZW4ge0BsaW5rICNzdGFydEVudHJ5KCl9IGFuZCB7QGxpbmsgI2VuZEVudHJ5KCl9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBtQ3VycmVudENvbnRhY3RTdHJ1Y3QgPSBudWxsOwotICAgICAgICBtQ3VycmVudFByb3BlcnR5ID0gbmV3IFZDYXJkRW50cnkuUHJvcGVydHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc3N1bWUgdGhhdCBWQ2FyZCBpcyBub3QgbmVzdGVkLiBJbiBvdGhlciB3b3JkcywgdGhpcyBjb2RlIGRvZXMgbm90IGFjY2VwdCAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVudHJ5KCkgewotICAgICAgICBpZiAobUN1cnJlbnRDb250YWN0U3RydWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJOZXN0ZWQgVkNhcmQgY29kZSBpcyBub3Qgc3VwcG9ydGVkIG5vdy4iKTsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudENvbnRhY3RTdHJ1Y3QgPSBuZXcgVkNhcmRFbnRyeShtVkNhcmRUeXBlLCBtQWNjb3VudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRW50cnkoKSB7Ci0gICAgICAgIG1DdXJyZW50Q29udGFjdFN0cnVjdC5jb25zb2xpZGF0ZUZpZWxkcygpOwotICAgICAgICBmb3IgKFZDYXJkRW50cnlIYW5kbGVyIGVudHJ5SGFuZGxlciA6IG1FbnRyeUhhbmRsZXJzKSB7Ci0gICAgICAgICAgICBlbnRyeUhhbmRsZXIub25FbnRyeUNyZWF0ZWQobUN1cnJlbnRDb250YWN0U3RydWN0KTsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudENvbnRhY3RTdHJ1Y3QgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJvcGVydHkoKSB7Ci0gICAgICAgIG1DdXJyZW50UHJvcGVydHkuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRQcm9wZXJ0eSgpIHsKLSAgICAgICAgbUN1cnJlbnRDb250YWN0U3RydWN0LmFkZFByb3BlcnR5KG1DdXJyZW50UHJvcGVydHkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eS5zZXRQcm9wZXJ0eU5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlHcm91cChTdHJpbmcgZ3JvdXApIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICBpZiAobVBhcmFtVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAicHJvcGVydHlQYXJhbVR5cGUoKSBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgIiArCi0gICAgICAgICAgICAgICAgICAgICJiZWZvcmUgcHJvcGVydHlQYXJhbVZhbHVlKCkgaXMgY2FsbGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVBhcmFtVHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAobVBhcmFtVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBGcm9tIHZDYXJkIDIuMSBzcGVjaWZpY2F0aW9uLiB2Q2FyZCAzLjAgZm9ybWFsbHkgZG9lcyBub3QgYWxsb3cgdGhpcyBjYXNlLgotICAgICAgICAgICAgbVBhcmFtVHlwZSA9ICJUWVBFIjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbih2YWx1ZSkpIHsKLSAgICAgICAgICAgIHZhbHVlID0gZW5jb2RlU3RyaW5nKHZhbHVlLCBtQ2hhcnNldEZvckRlY29kZWRCeXRlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eS5hZGRQYXJhbWV0ZXIobVBhcmFtVHlwZSwgdmFsdWUpOwotICAgICAgICBtUGFyYW1UeXBlID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBlbmNvZGVTdHJpbmcoU3RyaW5nIG9yaWdpbmFsU3RyaW5nLCBTdHJpbmcgY2hhcnNldEZvckRlY29kZWRCeXRlcykgewotICAgICAgICBpZiAobUlucHV0Q2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxTdHJpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKG1JbnB1dENoYXJzZXQpOwotICAgICAgICBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBjaGFyc2V0LmVuY29kZShvcmlnaW5hbFN0cmluZyk7Ci0gICAgICAgIC8vIGJ5dGVCdWZmZXIuYXJyYXkoKSAibWF5IiByZXR1cm4gYnl0ZSBhcnJheSB3aGljaCBpcyBsYXJnZXIgdGhhbgotICAgICAgICAvLyBieXRlQnVmZmVyLnJlbWFpbmluZygpLiBIZXJlLCB3ZSBrZWVwIG9uIHRoZSBzYWZlIHNpZGUuCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2J5dGVCdWZmZXIucmVtYWluaW5nKCldOwotICAgICAgICBieXRlQnVmZmVyLmdldChieXRlcyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgY2hhcnNldEZvckRlY29kZWRCeXRlcyk7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBlbmNvZGU6IGNoYXJzZXQ9IiArIGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBoYW5kbGVPbmVWYWx1ZShTdHJpbmcgdmFsdWUsIFN0cmluZyBjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzLCBTdHJpbmcgZW5jb2RpbmcpIHsKLSAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChlbmNvZGluZy5lcXVhbHMoIkJBU0U2NCIpIHx8IGVuY29kaW5nLmVxdWFscygiQiIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eS5zZXRQcm9wZXJ0eUJ5dGVzKEJhc2U2NC5kZWNvZGVCYXNlNjQodmFsdWUuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcuZXF1YWxzKCJRVU9URUQtUFJJTlRBQkxFIikpIHsKLSAgICAgICAgICAgICAgICAvLyAiPSAiIC0+ICIgIiwgIj1cdCIgLT4gIlx0Ii4KLSAgICAgICAgICAgICAgICAvLyBQcmV2aW91cyBjb2RlIGhhZCBkb25lIHRoaXMgcmVwbGFjZW1lbnQuIEtlZXAgb24gdGhlIHNhZmUgc2lkZS4KLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSB2YWx1ZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPScgJiYgaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoID0gdmFsdWUuY2hhckF0KGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2ggPT0gJyAnIHx8IG5leHRDaCA9PSAnXHQnKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChuZXh0Q2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBxdW90ZWRQcmludGFibGUgPSBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gbGluZXM7Ci0gICAgICAgICAgICAgICAgaWYgKG1TdHJpY3RMaW5lQnJlYWtQYXJzaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVzID0gcXVvdGVkUHJpbnRhYmxlLnNwbGl0KCJcclxuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHF1b3RlZFByaW50YWJsZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gcXVvdGVkUHJpbnRhYmxlLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoID0gcXVvdGVkUHJpbnRhYmxlLmNoYXJBdChpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2ggPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbmFsTGluZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsTGluZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGZpbmFsTGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGluZXMgPSBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgewotICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5lbmRzV2l0aCgiPSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXM7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBidWlsZGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMobUlucHV0Q2hhcnNldCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGVuY29kZTogY2hhcnNldD0iICsgbUlucHV0Q2hhcnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gYnVpbGRlci50b1N0cmluZygpLmdldEJ5dGVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gUXVvdGVkUHJpbnRhYmxlQ29kZWMuZGVjb2RlUXVvdGVkUHJpbnRhYmxlKGJ5dGVzKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChEZWNvZGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBkZWNvZGUgcXVvdGVkLXByaW50YWJsZTogIiArIGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMsIGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGVuY29kZTogY2hhcnNldD0iICsgY2hhcnNldEZvckRlY29kZWRCeXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBVbmtub3duIGVuY29kaW5nLiBGYWxsIGJhY2sgdG8gZGVmYXVsdC4KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW5jb2RlU3RyaW5nKHZhbHVlLCBjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwgfHwgdmFsdWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IGNoYXJzZXRDb2xsZWN0aW9uID0gbUN1cnJlbnRQcm9wZXJ0eS5nZXRQYXJhbWV0ZXJzKCJDSEFSU0VUIik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjaGFyc2V0ID0KLSAgICAgICAgICAgICgoY2hhcnNldENvbGxlY3Rpb24gIT0gbnVsbCkgPyBjaGFyc2V0Q29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSA6IG51bGwpOwotICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gZW5jb2RpbmdDb2xsZWN0aW9uID0gbUN1cnJlbnRQcm9wZXJ0eS5nZXRQYXJhbWV0ZXJzKCJFTkNPRElORyIpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RpbmcgPQotICAgICAgICAgICAgKChlbmNvZGluZ0NvbGxlY3Rpb24gIT0gbnVsbCkgPyBlbmNvZGluZ0NvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkgOiBudWxsKTsKLQotICAgICAgICBTdHJpbmcgY2hhcnNldEZvckRlY29kZWRCeXRlcyA9IENoYXJzZXRVdGlscy5uYW1lRm9yRGVmYXVsdFZlbmRvcihjaGFyc2V0KTsKLSAgICAgICAgaWYgKGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMgPT0gbnVsbCB8fCBjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMgPSBtQ2hhcnNldEZvckRlY29kZWRCeXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BlcnR5LmFkZFRvUHJvcGVydHlWYWx1ZUxpc3QoCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uZVZhbHVlKHZhbHVlLCBjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzLCBlbmNvZGluZykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2hvd1BlcmZvcm1hbmNlSW5mbygpIHsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgInRpbWUgZm9yIGluc2VydCBDb250YWN0U3RydWN0IHRvIGRhdGFiYXNlOiAiICsgCi0gICAgICAgICAgICAgICAgbVRpbWVQdXNoSW50b0NvbnRlbnRSZXNvbHZlciArICIgbXMiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvdW50ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q291bnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmFiNTBkLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q291bnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhlIGNsYXNzIHdoaWNoIGp1c3QgY291bnRzIHRoZSBudW1iZXIgb2YgdkNhcmQgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIGlucHV0LgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRFbnRyeUNvdW50ZXIgaW1wbGVtZW50cyBWQ2FyZEludGVycHJldGVyIHsKLSAgICBwcml2YXRlIGludCBtQ291bnQ7Ci0KLSAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewotICAgICAgICByZXR1cm4gbUNvdW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVudHJ5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBtQ291bnQrKzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgIH0gICAgCi19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUhhbmRsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2E2N2ZlLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgY2FsbGVkIGJ5IHtAbGluayBWQ2FyZEVudHJ5Q29uc3RydWN0b3J9LiBVc2VmdWwgd2hlbiB5b3UgZG9uJ3Qgd2FudCB0bwotICogaGFuZGxlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFzIHdoYXQge0BsaW5rIFZDYXJkUGFyc2VyfSBwcm92aWRlcyB2aWEge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZDYXJkRW50cnlIYW5kbGVyIHsKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcGFyc2luZyBzdGFydGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRob2QgY2FsbGVkIHdoZW4gb25lIFZDYXJkIGVudHJ5IGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25FbnRyeUNyZWF0ZWQoZmluYWwgVkNhcmRFbnRyeSBlbnRyeSk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcGFyc2luZyBlbmRlZC4KLSAgICAgKiBBYmxlIHRvIGJlIHVzZSB0aGlzIG1ldGhvZCBmb3Igc2hvd2luZyBwZXJmb3JtYW5jZSBsb2csIGV0Yy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkVuZCgpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEludGVycHJldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MjM3YzAuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8UD4KLSAqIFRoZSBpbnRlcmZhY2Ugd2hpY2ggc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBjbGFzc2VzIHdoaWNoIGhhdmUgdG8gYW5hbHl6ZSBlYWNoCi0gKiB2Q2FyZCBlbnRyeSBtb3JlIG1pbnV0ZWx5IHRoYW4ge0BsaW5rIFZDYXJkRW50cnl9IGNsYXNzIGFuYWx5c2lzLgotICogPC9QPgotICogPFA+Ci0gKiBIZXJlLCB0aGVyZSBhcmUgc2V2ZXJhbCB0ZXJtcyBzcGVjaWZpYyB0byB2Q2FyZCAoYW5kIHRoaXMgbGlicmFyeSkuCi0gKiA8L1A+Ci0gKiA8UD4KLSAqIFRoZSB0ZXJtICJlbnRyeSIgaXMgb25lIHZDYXJkIHJlcHJlc2VudGF0aW9uIGluIHRoZSBpbnB1dCwgd2hpY2ggc2hvdWxkIHN0YXJ0IHdpdGggIkJFR0lOOlZDQVJEIgotICogYW5kIGVuZCB3aXRoICJFTkQ6VkNBUkQiLgotICogPC9QPgotICogPFA+Ci0gKiBUaGUgdGVybSAicHJvcGVydHkiIGlzIG9uZSBsaW5lIGluIHZDYXJkIGVudHJ5LCB3aGljaCBjb25zaXN0cyBvZiAiZ3JvdXAiLCAicHJvcGVydHkgbmFtZSIsCi0gKiAicGFyYW1ldGVyKHBhcmFtKSBuYW1lcyBhbmQgdmFsdWVzIiwgYW5kICJwcm9wZXJ0eSB2YWx1ZXMiLgotICogPC9QPgotICogPFA+Ci0gKiBlLmcuIGdyb3VwMS5wcm9wTmFtZTtwYXJhbU5hbWUxPXBhcmFtVmFsdWUxO3BhcmFtTmFtZTI9cGFyYW1WYWx1ZTI7cHJvcGVydHlWYWx1ZTE7cHJvcGVydHlWYWx1ZTIuLi4KLSAqIDwvUD4KLSAqLwotcHVibGljIGludGVyZmFjZSBWQ2FyZEludGVycHJldGVyIHsKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB2Q2FyZCBpbnRlcnByZXRhdGlvbiBzdGFydGVkLgotICAgICAqLwotICAgIHZvaWQgc3RhcnQoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHZDYXJkIGludGVycHJldGF0aW9uIGZpbmlzaGVkLgotICAgICAqLwotICAgIHZvaWQgZW5kKCk7Ci0KLSAgICAvKiogCi0gICAgICogQ2FsbGVkIHdoZW4gcGFyc2luZyBvbmUgdkNhcmQgZW50cnkgc3RhcnRlZC4KLSAgICAgKiBNb3JlIHNwZWNpZmljYWxseSwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gIkJFR0lOOlZDQVJEIiBpcyByZWFkLgotICAgICAqLwotICAgIHZvaWQgc3RhcnRFbnRyeSgpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gcGFyc2luZyBvbmUgdkNhcmQgZW50cnkgZW5kZWQuCi0gICAgICogTW9yZSBzcGVjaWZpY2FsbHksIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuICJFTkQ6VkNBUkQiIGlzIHJlYWQuCi0gICAgICogTm90ZSB0aGF0IHtAbGluayAjc3RhcnRFbnRyeSgpfSBtYXkgYmUgY2FsbGVkIHNpbmNlCi0gICAgICogdkNhcmQgKGVzcGVjaWFsbHkgMi4xKSBhbGxvd3MgbmVzdGVkIHZDYXJkLgotICAgICAqLwotICAgIHZvaWQgZW5kRW50cnkoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHJlYWRpbmcgb25lIHByb3BlcnR5IHN0YXJ0ZWQuCi0gICAgICovCi0gICAgdm9pZCBzdGFydFByb3BlcnR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiByZWFkaW5nIG9uZSBwcm9wZXJ0eSBlbmRlZC4KLSAgICAgKi8KLSAgICB2b2lkIGVuZFByb3BlcnR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZ3JvdXAgQSBncm91cCBuYW1lLiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIG9yIG1heSBub3QgYmUKLSAgICAgKiBjYWxsZWQgYXQgYWxsLCBkZXBlbmRpbmcgb24gaG93IG1hbnkgZ3J1b3VwcyBhcmUgYXBwZW5kZWQgdG8gdGhlIHByb3BlcnR5LgotICAgICAqLwotICAgIHZvaWQgcHJvcGVydHlHcm91cChTdHJpbmcgZ3JvdXApOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUgQSBwcm9wZXJ0eSBuYW1lIGxpa2UgIk4iLCAiRk4iLCAiQURSIiwgZXRjLgotICAgICAqLwotICAgIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0eXBlIEEgcGFyYW1ldGVyIG5hbWUgbGlrZSAiRU5DT0RJTkciLCAiQ0hBUlNFVCIsIGV0Yy4KLSAgICAgKi8KLSAgICB2b2lkIHByb3BlcnR5UGFyYW1UeXBlKFN0cmluZyB0eXBlKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2YWx1ZSBBIHBhcmFtZXRlciB2YWx1ZS4gVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCB3aXRob3V0Ci0gICAgICoge0BsaW5rICNwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcpfSBiZWluZyBjYWxsZWQgKHdoZW4gdGhlIHZDYXJkIGlzIHZDYXJkIDIuMSkuCi0gICAgICovCi0gICAgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2YWx1ZXMgTGlzdCBvZiBwcm9wZXJ0eSB2YWx1ZXMuIFRoZSBzaXplIG9mIHZhbHVlcyB3b3VsZCBiZSAxIHVubGVzcwotICAgICAqIGNvcmVzc3BvbmRpbmcgcHJvcGVydHkgbmFtZSBpcyAiTiIsICJBRFIiLCBvciAiT1JHIi4KLSAgICAgKi8KLSAgICB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmODFmNy4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGUge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IGltcGxlbWVudGF0aW9uIHdoaWNoIGFnZ3JlZ2F0ZXMgbW9yZSB0aGFuIG9uZQotICoge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IG9iamVjdHMgYW5kIG1ha2UgYSB1c2VyIG9iamVjdCB0cmVhdCB0aGVtIGFzIG9uZQotICoge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uIGltcGxlbWVudHMgVkNhcmRJbnRlcnByZXRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFZDYXJkSW50ZXJwcmV0ZXI+IG1JbnRlcnByZXRlckNvbGxlY3Rpb247Ci0gICAgCi0gICAgcHVibGljIFZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKENvbGxlY3Rpb248VkNhcmRJbnRlcnByZXRlcj4gaW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgIG1JbnRlcnByZXRlckNvbGxlY3Rpb24gPSBpbnRlcnByZXRlckNvbGxlY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb248VkNhcmRJbnRlcnByZXRlcj4gZ2V0Q29sbGVjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1JbnRlcnByZXRlckNvbGxlY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5zdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kKCkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuZW5kKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVudHJ5KCkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuc3RhcnRFbnRyeSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRW50cnkoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5lbmRFbnRyeSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcm9wZXJ0eSgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnN0YXJ0UHJvcGVydHkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuZW5kUHJvcGVydHkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5wcm9wZXJ0eUdyb3VwKGdyb3VwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIucHJvcGVydHlOYW1lKG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnByb3BlcnR5UGFyYW1UeXBlKHR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnByb3BlcnR5VmFsdWVzKHZhbHVlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2M1MmE2Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFZDYXJkUGFyc2VyIHsKLSAgICBwcm90ZWN0ZWQgZmluYWwgaW50IG1QYXJzZVR5cGU7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbUNhbmNlbGVkOwotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyKCkgewotICAgICAgICB0aGlzKFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfVU5LTk9XTik7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyKGludCBwYXJzZVR5cGUpIHsKLSAgICAgICAgbVBhcnNlVHlwZSA9IHBhcnNlVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIHN0cmVhbSBhbmQgc2VuZCB0aGUgVkNhcmQgZGF0YSBpbnRvIFZDYXJkQnVpbGRlckJhc2Ugb2JqZWN0LgotICAgICAqIDwvUC4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3RlIHRoYXQgdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gYWxsb3dzICJDSEFSU0VUIiBwYXJhbWV0ZXIsIGFuZCBzb21lIGNhcmVlciBzZXRzCi0gICAgICogbG9jYWwgZW5jb2RpbmcgdG8gaXQuIEZvciBleGFtcGxlLCBKYXBhbmVzZSBwaG9uZSBjYXJlZXIgdXNlcyBTaGlmdF9KSVMsIHdoaWNoIGlzCi0gICAgICogZm9ybWFsbHkgYWxsb3dlZCBpbiBWQ2FyZCAyLjEsIGJ1dCBub3QgcmVjb21tZW5kZWQgaW4gVkNhcmQgMy4wLiBJbiBWQ2FyZCAyLjEsCi0gICAgICogSW4gc29tZSBleHJlbWUgY2FzZSwgc29tZSBWQ2FyZCBtYXkgaGF2ZSBkaWZmZXJlbnQgY2hhcnNldHMgaW4gb25lIFZDYXJkICh0aG91Z2gKLSAgICAgKiB3ZSBkbyBub3Qgc2VlIGFueSBkZXZpY2Ugd2hpY2ggZW1pdHMgc3VjaCBraW5kIG9mIG1hbGljaW91cyBkYXRhKQotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBJbiBvcmRlciB0byBhdm9pZCAibWlzdW5kZXJzdGFuZGluZyIgY2hhcnNldCBhcyBtdWNoIGFzIHBvc3NpYmxlLCB0aGlzIG1ldGhvZAotICAgICAqIHVzZSAiSVNPLTg4NTktMSIgZm9yIHJlYWRpbmcgdGhlIHN0cmVhbS4gV2hlbiBjaGFyc2V0IGlzIHNwZWNpZmllZCBpbiBzb21lIHByb3BlcnR5Ci0gICAgICogKHdpdGggIkNIQVJTRVQ9Li4uIiBwYXJhbWV0ZXIpLCB0aGUgc3RyaW5nIGlzIGRlY29kZWQgdG8gcmF3IGJ5dGVzIGFuZCBlbmNvZGVkIHRvCi0gICAgICogdGhlIGNoYXJzZXQuIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCAiSVNPLTg4NTktMSIgaGFzIDEgdG8gMSBtYXBwaW5nIGluIGFsbCA4Yml0Ci0gICAgICogY2hhcmFjdGVycywgd2hpY2ggaXMgbm90IGNvbXBsZXRlbHkgc3VyZS4gSW4gc29tZSBjYXNlcywgdGhpcyAiZGVjb2RpbmctZW5jb2RpbmciCi0gICAgICogc2NoZW1lIG1heSBmYWlsLiBUbyBhdm9pZCB0aGUgY2FzZSwKLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogV2UgcmVjb21tZW5kIHlvdSB0byB1c2Uge0BsaW5rIFZDYXJkU291cmNlRGV0ZWN0b3J9IGFuZCBkZXRlY3Qgd2hpY2gga2luZCBvZiBzb3VyY2UgdGhlCi0gICAgICogVkNhcmQgY29tZXMgZnJvbSBhbmQgZXhwbGljaXRseSBzcGVjaWZ5IGEgY2hhcnNldCB1c2luZyB0aGUgcmVzdWx0LgotICAgICAqIDwvUD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpcyBUaGUgc291cmNlIHRvIHBhcnNlLgotICAgICAqIEBwYXJhbSBpbnRlcmVwcmV0ZXIgQSB7QGxpbmsgVkNhcmRJbnRlcnByZXRlcn0gb2JqZWN0IHdoaWNoIHVzZWQgdG8gY29uc3RydWN0IGRhdGEuCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgZm9yIHN1Y2Nlc3MuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFZDYXJkSW50ZXJwcmV0ZXIgaW50ZXJlcHJldGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBUaGUgbWV0aG9kIHZhcmlhbnRzIHdoaWNoIGFjY2VwdCBjaGFyc2V0LgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBSRkMgMjQyNiAicmVjb21tZW5kcyIgKG5vdCBmb3JjZXMpIHRvIHVzZSBVVEYtOCwgc28gaXQgbWF5IGJlIE9LIHRvIHVzZQotICAgICAqIFVURi04IGFzIGFuIGVuY29kaW5nIHdoZW4gcGFyc2luZyB2Q2FyZCAzLjAuIEJ1dCBub3RlIHRoYXQgc29tZSBKYXBhbmVzZQotICAgICAqIHBob25lIHVzZXMgU2hpZnRfSklTIGFzIGEgY2hhcnNldCAoZS5nLiBXNjFTSCksIGFuZCBhbm90aGVyIHVzZXMKLSAgICAgKiAiQ0hBUlNFVD1TSElGVF9KSVMiLCB3aGljaCBpcyBleHBsaWNpdGx5IHByb2hpYml0ZWQgaW4gdkNhcmQgMy4wIHNwZWNpZmljYXRpb24gKGUuZy4gVzUzSykuCi0gICAgICogPC9QPgotICAgICAqCi0gICAgICogQHBhcmFtIGlzIFRoZSBzb3VyY2UgdG8gcGFyc2UuCi0gICAgICogQHBhcmFtIGNoYXJzZXQgQ2hhcnNldCB0byBiZSB1c2VkLgotICAgICAqIEBwYXJhbSBidWlsZGVyIFRoZSBWQ2FyZEJ1aWxkZXJCYXNlIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSB3aGVuIHN1Y2Nlc3NmdWwuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBjaGFyc2V0LCBWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBtZXRob2QgdmFyaWFudHMgd2hpY2ggdGVsbHMgdGhpcyBvYmplY3QgdGhlIG9wZXJhdGlvbiBpcyBhbHJlYWR5IGNhbmNlbGVkLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGlzLCBTdHJpbmcgY2hhcnNldCwKLSAgICAgICAgICAgIFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciwgYm9vbGVhbiBjYW5jZWxlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDYW5jZWwgcGFyc2luZy4KLSAgICAgKiBBY3R1YWwgY2FuY2VsIGlzIGRvbmUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBvbmUgdmNhcmQgZW50cnkgcGFyc2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7Ci0gICAgICAgIG1DYW5jZWxlZCA9IHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1YyMS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1YyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZThjZmIwLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZE5lc3RlZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRWZXJzaW9uRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBwYXJzZSB2Q2FyZC4gUGxlYXNlIHJlZmVyIHRvIHZDYXJkIFNwZWNpZmljYXRpb24gMi4xIGZvciBtb3JlIGRldGFpbC4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkUGFyc2VyX1YyMSBleHRlbmRzIFZDYXJkUGFyc2VyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZFBhcnNlcl9WMjEiOwotCi0gICAgLyoqIFN0b3JlIHRoZSBrbm93bi10eXBlICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxTdHJpbmc+IHNLbm93blR5cGVTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KAotICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiRE9NIiwgIklOVEwiLCAiUE9TVEFMIiwgIlBBUkNFTCIsICJIT01FIiwgIldPUksiLAotICAgICAgICAgICAgICAgICAgICAiUFJFRiIsICJWT0lDRSIsICJGQVgiLCAiTVNHIiwgIkNFTEwiLCAiUEFHRVIiLCAiQkJTIiwKLSAgICAgICAgICAgICAgICAgICAgIk1PREVNIiwgIkNBUiIsICJJU0ROIiwgIlZJREVPIiwgIkFPTCIsICJBUFBMRUxJTksiLAotICAgICAgICAgICAgICAgICAgICAiQVRUTUFJTCIsICJDSVMiLCAiRVdPUkxEIiwgIklOVEVSTkVUIiwgIklCTU1BSUwiLAotICAgICAgICAgICAgICAgICAgICAiTUNJTUFJTCIsICJQT1dFUlNIQVJFIiwgIlBST0RJR1kiLCAiVExYIiwgIlg0MDAiLCAiR0lGIiwKLSAgICAgICAgICAgICAgICAgICAgIkNHTSIsICJXTUYiLCAiQk1QIiwgIk1FVCIsICJQTUIiLCAiRElCIiwgIlBJQ1QiLCAiVElGRiIsCi0gICAgICAgICAgICAgICAgICAgICJQREYiLCAiUFMiLCAiSlBFRyIsICJRVElNRSIsICJNUEVHIiwgIk1QRUcyIiwgIkFWSSIsCi0gICAgICAgICAgICAgICAgICAgICJXQVZFIiwgIkFJRkYiLCAiUENNIiwgIlg1MDkiLCAiUEdQIikpOwotCi0gICAgLyoqIFN0b3JlIHRoZSBrbm93bi12YWx1ZSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hTZXQ8U3RyaW5nPiBzS25vd25WYWx1ZVNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oCi0gICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJJTkxJTkUiLCAiVVJMIiwgIkNPTlRFTlQtSUQiLCAiQ0lEIikpOwotCi0gICAgLyoqIFN0b3JlIHRoZSBwcm9wZXJ0eSBuYW1lcyBhdmFpbGFibGUgaW4gdkNhcmQgMi4xICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxTdHJpbmc+IHNBdmFpbGFibGVQcm9wZXJ0eU5hbWVTZXRWMjEgPQotICAgICAgICBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgIkJFR0lOIiwgIkxPR08iLCAiUEhPVE8iLCAiTEFCRUwiLCAiRk4iLCAiVElUTEUiLCAiU09VTkQiLAotICAgICAgICAgICAgICAgICJWRVJTSU9OIiwgIlRFTCIsICJFTUFJTCIsICJUWiIsICJHRU8iLCAiTk9URSIsICJVUkwiLAotICAgICAgICAgICAgICAgICJCREFZIiwgIlJPTEUiLCAiUkVWIiwgIlVJRCIsICJLRVkiLCAiTUFJTEVSIikpOwotCi0gICAgLyoqCi0gICAgICogVGhvdWdoIHZDYXJkIDIuMSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGFsbG93ICJCIiBlbmNvZGluZywgc29tZSBkYXRhIG1heSBoYXZlIGl0LgotICAgICAqIFdlIGFsbG93IGl0IGZvciBzYWZldHkuLi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoU2V0PFN0cmluZz4gc0F2YWlsYWJsZUVuY29kaW5nVjIxID0KLSAgICAgICAgbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICI3QklUIiwgIjhCSVQiLCAiUVVPVEVELVBSSU5UQUJMRSIsICJCQVNFNjQiLCAiQiIpKTsKLSAgICAKLSAgICAvLyBVc2VkIG9ubHkgZm9yIHBhcnNpbmcgRU5EOlZDQVJELgotICAgIHByaXZhdGUgU3RyaW5nIG1QcmV2aW91c0xpbmU7Ci0gICAgCi0gICAgLyoqIFRoZSBidWlsZGVyIHRvIGJ1aWxkIHBhcnNlZCBkYXRhICovCi0gICAgcHJvdGVjdGVkIFZDYXJkSW50ZXJwcmV0ZXIgbUJ1aWxkZXIgPSBudWxsOwotCi0gICAgLyoqIAotICAgICAqIFRoZSBlbmNvZGluZyB0eXBlLiAiRW5jb2RpbmciIGluIHZDYXJkIGlzIGRpZmZlcmVudCBmcm9tICJDaGFyc2V0Ii4KLSAgICAgKiBlLmcuIDdCSVQsIDhCSVQsIFFVT1RFRC1QUklOVEFCTEUuIAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbUVuY29kaW5nID0gbnVsbDsKLSAgICAKLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHNEZWZhdWx0RW5jb2RpbmcgPSAiOEJJVCI7Ci0gICAgCi0gICAgLy8gU2hvdWxkIG5vdCBkaXJlY3RseSByZWFkIGEgbGluZSBmcm9tIHRoaXMgb2JqZWN0LiBVc2UgZ2V0TGluZSgpIGluc3RlYWQuCi0gICAgcHJvdGVjdGVkIEJ1ZmZlcmVkUmVhZGVyIG1SZWFkZXI7Ci0gICAgCi0gICAgLy8gSW4gc29tZSBjYXNlcywgdkNhcmQgaXMgbmVzdGVkLiBDdXJyZW50bHksIHdlIG9ubHkgY29uc2lkZXIgdGhlIG1vc3QgaW50ZXJpb3IgdkNhcmQgZGF0YS4KLSAgICAvLyBTZWUgdjIxX2ZvbWFfMS52Y2YgaW4gdGVzdCBkaXJlY3RvcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgcHJpdmF0ZSBpbnQgbU5lc3RDb3VudDsKLSAgICAKLSAgICAvLyBJbiBvcmRlciB0byByZWR1Y2Ugd2FybmluZyBtZXNzYWdlIGFzIG11Y2ggYXMgcG9zc2libGUsIHdlIGhvbGQgdGhlIHZhbHVlIHdoaWNoIG1hZGUgTG9nZ2VyCi0gICAgLy8gZW1pdCBhIHdhcm5pbmcgbWVzc2FnZS4KLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gbVVua25vd25UeXBlTWFwID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBtVW5rbm93blZhbHVlTWFwID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0gICAgLy8gRm9yIG1lYXN1cmluZyBwZXJmb3JtYW5jZS4KLSAgICBwcml2YXRlIGxvbmcgbVRpbWVUb3RhbDsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVSZWFkU3RhcnRSZWNvcmQ7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUmVhZEVuZFJlY29yZDsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVTdGFydFByb3BlcnR5OwotICAgIHByaXZhdGUgbG9uZyBtVGltZUVuZFByb3BlcnR5OwotICAgIHByaXZhdGUgbG9uZyBtVGltZVBhcnNlSXRlbXM7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUGFyc2VMaW5lQW5kSGFuZGxlR3JvdXA7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUGFyc2VQcm9wZXJ0eVZhbHVlczsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVQYXJzZUFkck9yZ047Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lSGFuZGxlTWlzY1Byb3BlcnR5VmFsdWU7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lSGFuZGxlUXVvdGVkUHJpbnRhYmxlOwotICAgIHByaXZhdGUgbG9uZyBtVGltZUhhbmRsZUJhc2U2NDsKLQotICAgIHB1YmxpYyBWQ2FyZFBhcnNlcl9WMjEoKSB7Ci0gICAgICAgIHRoaXMobnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1YyMShWQ2FyZFNvdXJjZURldGVjdG9yIGRldGVjdG9yKSB7Ci0gICAgICAgIHRoaXMoZGV0ZWN0b3IgIT0gbnVsbCA/IGRldGVjdG9yLmdldEVzdGltYXRlZFR5cGUoKSA6IFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfVU5LTk9XTik7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1YyMShpbnQgcGFyc2VUeXBlKSB7Ci0gICAgICAgIHN1cGVyKHBhcnNlVHlwZSk7Ci0gICAgICAgIGlmIChwYXJzZVR5cGUgPT0gVkNhcmRDb25maWcuUEFSU0VfVFlQRV9GT01BKSB7Ci0gICAgICAgICAgICBtTmVzdENvdW50ID0gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uCi0gICAgICoKLSAgICAgKiB2Y2FyZF9maWxlID0gW3dzbHNdIHZjYXJkIFt3c2xzXQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlVkNhcmRGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3RSZWFkaW5nID0gdHJ1ZTsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGlmIChtQ2FuY2VsZWQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghcGFyc2VPbmVWQ2FyZChmaXJzdFJlYWRpbmcpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaXJzdFJlYWRpbmcgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTmVzdENvdW50ID4gMCkgewotICAgICAgICAgICAgYm9vbGVhbiB1c2VDYWNoZSA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OZXN0Q291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIHJlYWRFbmRWQ2FyZCh1c2VDYWNoZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgdXNlQ2FjaGUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkQ29uZmlnLkZMQUdfVjIxOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmVyc2lvblN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjIxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBwcm9wZXJ0eU5hbWUgaXMgYSB2YWxpZCBwcm9wZXJ0eSBuYW1lLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRQcm9wZXJ0eU5hbWUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICBpZiAoIShzQXZhaWxhYmxlUHJvcGVydHlOYW1lU2V0VjIxLmNvbnRhaW5zKHByb3BlcnR5TmFtZS50b1VwcGVyQ2FzZSgpKSB8fAotICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKCJYLSIpKSAmJiAKLSAgICAgICAgICAgICAgICAhbVVua25vd25UeXBlTWFwLmNvbnRhaW5zKHByb3BlcnR5TmFtZSkpIHsKLSAgICAgICAgICAgIG1Vbmtub3duVHlwZU1hcC5hZGQocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJQcm9wZXJ0eSBuYW1lIHVuc3VwcG9ydGVkIGJ5IHZDYXJkIDIuMTogIiArIHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIGVuY29kaW5nIGlzIGEgdmFsaWQgZW5jb2RpbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgewotICAgICAgICByZXR1cm4gc0F2YWlsYWJsZUVuY29kaW5nVjIxLmNvbnRhaW5zKGVuY29kaW5nLnRvVXBwZXJDYXNlKCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFN0cmluZy4gSXQgbWF5IGJlIG51bGwsIG9yIGl0cyBsZW5ndGggbWF5IGJlIDAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1SZWFkZXIucmVhZExpbmUoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBTdHJpbmcgd2l0aCBpdCdzIGxlbmd0aCA+IDAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB3aGVuIHRoZSBzdHJlYW0gcmVhY2hlZCBlbmQgb2YgbGluZQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9uRW1wdHlMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgbGluZSA9IGdldExpbmUoKTsKLSAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlJlYWNoZWQgZW5kIG9mIGJ1ZmZlci4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiBsaW5lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdmNhcmQgPSAiQkVHSU4iIFt3c10gIjoiIFt3c10gIlZDQVJEIiBbd3NdIDEqQ1JMRgotICAgICAqICAgICAgICAgaXRlbXMgKkNSTEYKLSAgICAgKiAgICAgICAgICJFTkQiIFt3c10gIjoiIFt3c10gIlZDQVJEIgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZU9uZVZDYXJkKGJvb2xlYW4gZmlyc3RSZWFkaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBhbGxvd0dhcmJhZ2UgPSBmYWxzZTsKLSAgICAgICAgaWYgKGZpcnN0UmVhZGluZykgewotICAgICAgICAgICAgaWYgKG1OZXN0Q291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTmVzdENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWFkQmVnaW5WQ2FyZChhbGxvd0dhcmJhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYWxsb3dHYXJiYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXJlYWRCZWdpblZDYXJkKGFsbG93R2FyYmFnZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBsb25nIHN0YXJ0OwotICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnN0YXJ0RW50cnkoKTsKLSAgICAgICAgICAgIG1UaW1lUmVhZFN0YXJ0UmVjb3JkICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgcGFyc2VJdGVtcygpOwotICAgICAgICBtVGltZVBhcnNlSXRlbXMgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgcmVhZEVuZFZDYXJkKHRydWUsIGZhbHNlKTsKLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtQnVpbGRlci5lbmRFbnRyeSgpOwotICAgICAgICAgICAgbVRpbWVSZWFkRW5kUmVjb3JkICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVHJ1ZSB3aGVuIHN1Y2Nlc3NmdWwuIEZhbHNlIHdoZW4gcmVhY2hpbmcgdGhlIGVuZCBvZiBsaW5lICAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBWQ2FyZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWRCZWdpblZDYXJkKGJvb2xlYW4gYWxsb3dHYXJiYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgbGluZSA9IGdldExpbmUoKTsKLSAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmdbXSBzdHJBcnJheSA9IGxpbmUuc3BsaXQoIjoiLCAyKTsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBzdHJBcnJheS5sZW5ndGg7Ci0KLSAgICAgICAgICAgIC8vIFRob3VnaCB2Q2FyZCAyLjEvMy4wIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgbG93ZXIgY2FzZXMsCi0gICAgICAgICAgICAvLyB2Q2FyZCBmaWxlIGVtaXR0ZWQgYnkgc29tZSBleHRlcm5hbCB2Q2FyZCBleHBvdGVyIGhhdmUgc3VjaCBpbnZhbGlkIFN0cmluZ3MuCi0gICAgICAgICAgICAvLyBTbyB3ZSBhbGxvdyBpdC4KLSAgICAgICAgICAgIC8vIGUuZy4gQkVHSU46dkNhcmQKLSAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMiAmJgotICAgICAgICAgICAgICAgICAgICBzdHJBcnJheVswXS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgiQkVHSU4iKSAmJgotICAgICAgICAgICAgICAgICAgICBzdHJBcnJheVsxXS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgiVkNBUkQiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmICghYWxsb3dHYXJiYWdlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXN0Q291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBsaW5lOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBTdHJpbmcgXCJCRUdJTjpWQ0FSRFwiIGRpZCBub3QgY29tZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKEluc3RlYWQsIFwiIiArIGxpbmUgKyAiXCIgY2FtZSkiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUoYWxsb3dHYXJiYWdlKTsKLQotICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlJlYWNoZWQgd2hlcmUgbXVzdCBub3QgYmUgcmVhY2hlZC4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYXJndW1lbnRzIHVzZUNhY2hlIGFuZCBhbGxvd0dhcmJhc2UgYXJlIHVzdWFsbHkgdHJ1ZSBhbmQgZmFsc2UgYWNjb3JkaW5nbHkgd2hlbgotICAgICAqIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG91dHNpZGUgdGhpcyBmdW5jdGlvbiBpdHNlbGYuIAotICAgICAqCi0gICAgICogQHBhcmFtIHVzZUNhY2hlIFdoZW4gdHJ1ZSwgbGluZSBpcyBvYnRhaW5lZCBmcm9tIG1QcmV2aW91c2xpbmUuIE90aGVyd2lzZSwgZ2V0TGluZSgpCi0gICAgICogaXMgdXNlZC4KLSAgICAgKiBAcGFyYW0gYWxsb3dHYXJiYWdlIFdoZW4gdHJ1ZSwgaWdub3JlIG5vbiAiRU5EOlZDQVJEIiBsaW5lLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFZDYXJkRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVhZEVuZFZDYXJkKGJvb2xlYW4gdXNlQ2FjaGUsIGJvb2xlYW4gYWxsb3dHYXJiYWdlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBpZiAodXNlQ2FjaGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaG91Z2ggdkNhcmQgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhbGxvdyBsb3dlciBjYXNlcywKLSAgICAgICAgICAgICAgICAvLyBzb21lIGRhdGEgbWF5IGhhdmUgdGhlbSwgc28gd2UgYWxsb3cgaXQuCi0gICAgICAgICAgICAgICAgbGluZSA9IG1QcmV2aW91c0xpbmU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiRXhwZWN0ZWQgRU5EOlZDQVJEIHdhcyBub3QgZm91bmQuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nW10gc3RyQXJyYXkgPSBsaW5lLnNwbGl0KCI6IiwgMik7Ci0gICAgICAgICAgICBpZiAoc3RyQXJyYXkubGVuZ3RoID09IDIgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RyQXJyYXlbMF0udHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoIkVORCIpICYmCi0gICAgICAgICAgICAgICAgICAgIHN0ckFycmF5WzFdLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKCJWQ0FSRCIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIGlmICghYWxsb3dHYXJiYWdlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJFTkQ6VkNBUkQgIT0gXCIiICsgbVByZXZpb3VzTGluZSArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXNlQ2FjaGUgPSBmYWxzZTsKLSAgICAgICAgfSB3aGlsZSAoYWxsb3dHYXJiYWdlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogaXRlbXMgPSAqQ1JMRiBpdGVtIAotICAgICAqICAgICAgIC8gaXRlbQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlSXRlbXMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBlbmRlZCA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnN0YXJ0UHJvcGVydHkoKTsKLSAgICAgICAgICAgIG1UaW1lU3RhcnRQcm9wZXJ0eSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICB9Ci0gICAgICAgIGVuZGVkID0gcGFyc2VJdGVtKCk7Ci0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsICYmICFlbmRlZCkgewotICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgbUJ1aWxkZXIuZW5kUHJvcGVydHkoKTsKLSAgICAgICAgICAgIG1UaW1lRW5kUHJvcGVydHkgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICghZW5kZWQpIHsKLSAgICAgICAgICAgIC8vIGZvbGxvdyBWQ0FSRCAsaXQgd29udCByZWFjaCBlbmRQcm9wZXJ0eQotICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuc3RhcnRQcm9wZXJ0eSgpOwotICAgICAgICAgICAgICAgIG1UaW1lU3RhcnRQcm9wZXJ0eSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBlbmRlZCA9IHBhcnNlSXRlbSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJJbnZhbGlkIGxpbmUgd2hpY2ggbG9va3MgbGlrZSBzb21lIGNvbW1lbnQgd2FzIGZvdW5kLiBJZ25vcmVkLiIpOwotICAgICAgICAgICAgICAgIGVuZGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCAmJiAhZW5kZWQpIHsKLSAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuZW5kUHJvcGVydHkoKTsKLSAgICAgICAgICAgICAgICBtVGltZUVuZFByb3BlcnR5ICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogaXRlbSA9IFtncm91cHMgIi4iXSBuYW1lICAgIFtwYXJhbXNdICI6IiB2YWx1ZSBDUkxGCi0gICAgICogICAgICAvIFtncm91cHMgIi4iXSAiQURSIiAgIFtwYXJhbXNdICI6IiBhZGRyZXNzcGFydHMgQ1JMRgotICAgICAqICAgICAgLyBbZ3JvdXBzICIuIl0gIk9SRyIgICBbcGFyYW1zXSAiOiIgb3JncGFydHMgQ1JMRgotICAgICAqICAgICAgLyBbZ3JvdXBzICIuIl0gIk4iICAgICBbcGFyYW1zXSAiOiIgbmFtZXBhcnRzIENSTEYKLSAgICAgKiAgICAgIC8gW2dyb3VwcyAiLiJdICJBR0VOVCIgW3BhcmFtc10gIjoiIHZjYXJkIENSTEYKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZUl0ZW0oKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgbUVuY29kaW5nID0gc0RlZmF1bHRFbmNvZGluZzsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IGdldE5vbkVtcHR5TGluZSgpOwotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgU3RyaW5nW10gcHJvcGVydHlOYW1lQW5kVmFsdWUgPSBzZXBhcmF0ZUxpbmVBbmRIYW5kbGVHcm91cChsaW5lKTsKLSAgICAgICAgaWYgKHByb3BlcnR5TmFtZUFuZFZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wZXJ0eU5hbWVBbmRWYWx1ZS5sZW5ndGggIT0gMikgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24oIkludmFsaWQgbGluZSBcIiIgKyBsaW5lICsgIlwiIik7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZUFuZFZhbHVlWzBdLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlOYW1lQW5kVmFsdWVbMV07Ci0KLSAgICAgICAgbVRpbWVQYXJzZUxpbmVBbmRIYW5kbGVHcm91cCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotCi0gICAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJBRFIiKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCJPUkciKSB8fAotICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZS5lcXVhbHMoIk4iKSkgewotICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGhhbmRsZU11bHRpcGxlUHJvcGVydHlWYWx1ZShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgbVRpbWVQYXJzZUFkck9yZ04gKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJBR0VOVCIpKSB7Ci0gICAgICAgICAgICBoYW5kbGVBZ2VudChwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChpc1ZhbGlkUHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSkpIHsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJCRUdJTiIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5VmFsdWUuZXF1YWxzKCJWQ0FSRCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZE5lc3RlZEV4Y2VwdGlvbigiVGhpcyB2Q2FyZCBoYXMgbmVzdGVkIHZDYXJkIGRhdGEgaW4gaXQuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJVbmtub3duIEJFR0lOIHR5cGU6ICIgKyBwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIlZFUlNJT04iKSAmJgotICAgICAgICAgICAgICAgICAgICAhcHJvcGVydHlWYWx1ZS5lcXVhbHMoZ2V0VmVyc2lvblN0cmluZygpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZFZlcnNpb25FeGNlcHRpb24oIkluY29tcGF0aWJsZSB2ZXJzaW9uOiAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlICsgIiAhPSAiICsgZ2V0VmVyc2lvblN0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBoYW5kbGVQcm9wZXJ0eVZhbHVlKHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICBtVGltZVBhcnNlUHJvcGVydHlWYWx1ZXMgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJVbmtub3duIHByb3BlcnR5IG5hbWU6IFwiIiArIHByb3BlcnR5TmFtZSArICJcIiIpOwotICAgIH0KLQotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCBTVEFURV9HUk9VUF9PUl9QUk9QTkFNRSA9IDA7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX1BBUkFNUyA9IDE7Ci0gICAgLy8gdkNhcmQgMy4wIHNwZWNpZmljYXRpb24gYWxsb3dzIGRvdWJsZS1xdW90ZWQgcGFyYW0tdmFsdWUsIHdoaWxlIHZDYXJkIDIuMSBkb2VzIG5vdC4KLSAgICAvLyBUaGlzIGlzIGp1c3QgZm9yIHNhZmV0eS4KLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgU1RBVEVfUEFSQU1TX0lOX0RRVU9URSA9IDI7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gc2VwYXJhdGVMaW5lQW5kSGFuZGxlR3JvdXAoU3RyaW5nIGxpbmUpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBzdGF0ZSA9IFNUQVRFX0dST1VQX09SX1BST1BOQU1FOwotICAgICAgICBpbnQgbmFtZUluZGV4ID0gMDsKLQotICAgICAgICBmaW5hbCBTdHJpbmdbXSBwcm9wZXJ0eU5hbWVBbmRWYWx1ZSA9IG5ldyBTdHJpbmdbMl07Ci0KLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGxpbmUubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChsZW5ndGggPiAwICYmIGxpbmUuY2hhckF0KDApID09ICcjJykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gbGluZS5jaGFyQXQoaSk7IAotICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfR1JPVVBfT1JfUFJPUE5BTUU6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICc6JykgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkVORCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lQW5kVmFsdWVbMF0gPSBwcm9wZXJ0eU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVsxXSA9IGxpbmUuc3Vic3RyaW5nKGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lQW5kVmFsdWVbMV0gPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWVBbmRWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnLicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBncm91cE5hbWUgPSBsaW5lLnN1YnN0cmluZyhuYW1lSW5kZXgsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eUdyb3VwKGdyb3VwTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lSW5kZXggPSBpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBsaW5lLnN1YnN0cmluZyhuYW1lSW5kZXgsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJFTkQiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBsaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZUFuZFZhbHVlWzBdID0gcHJvcGVydHlOYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUluZGV4ID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1BBUkFNUzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9QQVJBTVM6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICciJykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9QQVJBTVNfSU5fRFFVT1RFOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc7JykgewotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlUGFyYW1zKGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUluZGV4ID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzonKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVQYXJhbXMobGluZS5zdWJzdHJpbmcobmFtZUluZGV4LCBpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVsxXSA9IGxpbmUuc3Vic3RyaW5nKGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lQW5kVmFsdWVbMV0gPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWVBbmRWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9QQVJBTVNfSU5fRFFVT1RFOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnIicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfUEFSQU1TOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhyb3cgbmV3IFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24oIkludmFsaWQgbGluZTogXCIiICsgbGluZSArICJcIiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHBhcmFtcyAgICAgPSAiOyIgW3dzXSBwYXJhbWxpc3QKLSAgICAgKiBwYXJhbWxpc3QgID0gcGFyYW1saXN0IFt3c10gIjsiIFt3c10gcGFyYW0KLSAgICAgKiAgICAgICAgICAgIC8gcGFyYW0KLSAgICAgKiBwYXJhbSAgICAgID0gIlRZUEUiIFt3c10gIj0iIFt3c10gcHR5cGV2YWwKLSAgICAgKiAgICAgICAgICAgIC8gIlZBTFVFIiBbd3NdICI9IiBbd3NdIHB2YWx1ZXZhbAotICAgICAqICAgICAgICAgICAgLyAiRU5DT0RJTkciIFt3c10gIj0iIFt3c10gcGVuY29kaW5ndmFsCi0gICAgICogICAgICAgICAgICAvICJDSEFSU0VUIiBbd3NdICI9IiBbd3NdIGNoYXJzZXR2YWwKLSAgICAgKiAgICAgICAgICAgIC8gIkxBTkdVQUdFIiBbd3NdICI9IiBbd3NdIGxhbmd2YWwKLSAgICAgKiAgICAgICAgICAgIC8gIlgtIiB3b3JkIFt3c10gIj0iIFt3c10gd29yZAotICAgICAqICAgICAgICAgICAgLyBrbm93bnR5cGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYXJhbXMoU3RyaW5nIHBhcmFtcykgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gc3RyQXJyYXkgPSBwYXJhbXMuc3BsaXQoIj0iLCAyKTsKLSAgICAgICAgaWYgKHN0ckFycmF5Lmxlbmd0aCA9PSAyKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFyYW1OYW1lID0gc3RyQXJyYXlbMF0udHJpbSgpLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZSA9IHN0ckFycmF5WzFdLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJUWVBFIikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVUeXBlKHBhcmFtVmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJWQUxVRSIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlVmFsdWUocGFyYW1WYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZS5lcXVhbHMoIkVOQ09ESU5HIikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVFbmNvZGluZyhwYXJhbVZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLmVxdWFscygiQ0hBUlNFVCIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ2hhcnNldChwYXJhbVZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLmVxdWFscygiTEFOR1VBR0UiKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUxhbmd1YWdlKHBhcmFtVmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbU5hbWUuc3RhcnRzV2l0aCgiWC0iKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUFueVBhcmFtKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiVW5rbm93biB0eXBlIFwiIiArIHBhcmFtTmFtZSArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaGFuZGxlUGFyYW1XaXRob3V0TmFtZShzdHJBcnJheVswXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogdkNhcmQgMy4wIHBhcnNlciBtYXkgdGhyb3cgVkNhcmRFeGNlcHRpb24uCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUGFyYW1XaXRob3V0TmFtZShmaW5hbCBTdHJpbmcgcGFyYW1WYWx1ZSkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgaGFuZGxlVHlwZShwYXJhbVZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwdHlwZXZhbCA9IGtub3dudHlwZSAvICJYLSIgd29yZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVR5cGUoZmluYWwgU3RyaW5nIHB0eXBldmFsKSB7Ci0gICAgICAgIFN0cmluZyB1cHBlclR5cGVWYWx1ZSA9IHB0eXBldmFsOwotICAgICAgICBpZiAoIShzS25vd25UeXBlU2V0LmNvbnRhaW5zKHVwcGVyVHlwZVZhbHVlKSB8fCB1cHBlclR5cGVWYWx1ZS5zdGFydHNXaXRoKCJYLSIpKSAmJiAKLSAgICAgICAgICAgICAgICAhbVVua25vd25UeXBlTWFwLmNvbnRhaW5zKHB0eXBldmFsKSkgewotICAgICAgICAgICAgbVVua25vd25UeXBlTWFwLmFkZChwdHlwZXZhbCk7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVFlQRSB1bnN1cHBvcnRlZCBieSB2Q2FyZCAyLjE6ICIgKyBwdHlwZXZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1UeXBlKCJUWVBFIik7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVmFsdWUodXBwZXJUeXBlVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIHB2YWx1ZXZhbCA9ICJJTkxJTkUiIC8gIlVSTCIgLyAiQ09OVEVOVC1JRCIgLyAiQ0lEIiAvICJYLSIgd29yZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVZhbHVlKGZpbmFsIFN0cmluZyBwdmFsdWV2YWwpIHsKLSAgICAgICAgaWYgKCFzS25vd25WYWx1ZVNldC5jb250YWlucyhwdmFsdWV2YWwudG9VcHBlckNhc2UoKSkgJiYKLSAgICAgICAgICAgICAgICBwdmFsdWV2YWwuc3RhcnRzV2l0aCgiWC0iKSAmJgotICAgICAgICAgICAgICAgICFtVW5rbm93blZhbHVlTWFwLmNvbnRhaW5zKHB2YWx1ZXZhbCkpIHsKLSAgICAgICAgICAgIG1Vbmtub3duVmFsdWVNYXAuYWRkKHB2YWx1ZXZhbCk7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVkFMVUUgdW5zdXBwb3J0ZWQgYnkgdkNhcmQgMi4xOiAiICsgcHZhbHVldmFsKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVR5cGUoIlZBTFVFIik7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVmFsdWUocHZhbHVldmFsKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBwZW5jb2Rpbmd2YWwgPSAiN0JJVCIgLyAiOEJJVCIgLyAiUVVPVEVELVBSSU5UQUJMRSIgLyAiQkFTRTY0IiAvICJYLSIgd29yZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUVuY29kaW5nKFN0cmluZyBwZW5jb2Rpbmd2YWwpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc1ZhbGlkRW5jb2RpbmcocGVuY29kaW5ndmFsKSB8fAotICAgICAgICAgICAgICAgIHBlbmNvZGluZ3ZhbC5zdGFydHNXaXRoKCJYLSIpKSB7Ci0gICAgICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1UeXBlKCJFTkNPRElORyIpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1WYWx1ZShwZW5jb2Rpbmd2YWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVuY29kaW5nID0gcGVuY29kaW5ndmFsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJVbmtub3duIGVuY29kaW5nIFwiIiArIHBlbmNvZGluZ3ZhbCArICJcIiIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIHZDYXJkIDIuMSBzcGVjaWZpY2F0aW9uIG9ubHkgYWxsb3dzIHVzLWFzY2lpIGFuZCBpc28tODg1OS14eHggKFNlZSBSRkMgMTUyMSksCi0gICAgICogYnV0IHRvZGF5J3MgdkNhcmQgb2Z0ZW4gY29udGFpbnMgb3RoZXIgY2hhcnNldCwgc28gd2UgYWxsb3cgdGhlbS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFyc2V0KFN0cmluZyBjaGFyc2V0dmFsKSB7Ci0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVHlwZSgiQ0hBUlNFVCIpOwotICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKGNoYXJzZXR2YWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIGFsc28gU2VjdGlvbiA3LjEgb2YgUkZDIDE1MjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVMYW5ndWFnZShTdHJpbmcgbGFuZ3ZhbCkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gc3RyQXJyYXkgPSBsYW5ndmFsLnNwbGl0KCItIik7Ci0gICAgICAgIGlmIChzdHJBcnJheS5sZW5ndGggIT0gMikgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJJbnZhbGlkIExhbmd1YWdlOiBcIiIgKyBsYW5ndmFsICsgIlwiIik7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHRtcCA9IHN0ckFycmF5WzBdOwotICAgICAgICBpbnQgbGVuZ3RoID0gdG1wLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIWlzTGV0dGVyKHRtcC5jaGFyQXQoaSkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJJbnZhbGlkIExhbmd1YWdlOiBcIiIgKyBsYW5ndmFsICsgIlwiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdG1wID0gc3RyQXJyYXlbMV07Ci0gICAgICAgIGxlbmd0aCA9IHRtcC5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKCFpc0xldHRlcih0bXAuY2hhckF0KGkpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiSW52YWxpZCBMYW5ndWFnZTogXCIiICsgbGFuZ3ZhbCArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVHlwZSgiTEFOR1VBR0UiKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1WYWx1ZShsYW5ndmFsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1haW5seSBmb3IgIlgtIiB0eXBlLiBUaGlzIGFjY2VwdHMgYW55IGtpbmQgb2YgdHlwZSB3aXRob3V0IGNoZWNrLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFueVBhcmFtKFN0cmluZyBwYXJhbU5hbWUsIFN0cmluZyBwYXJhbVZhbHVlKSB7Ci0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVHlwZShwYXJhbU5hbWUpOwotICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKHBhcmFtVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBpZiAobUVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoIlFVT1RFRC1QUklOVEFCTEUiKSkgewotICAgICAgICAgICAgZmluYWwgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IGdldFF1b3RlZFByaW50YWJsZShwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gdiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIHYuYWRkKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlWYWx1ZXModik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGltZUhhbmRsZVF1b3RlZFByaW50YWJsZSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICB9IGVsc2UgaWYgKG1FbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCJCQVNFNjQiKSB8fAotICAgICAgICAgICAgICAgIG1FbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCJCIikpIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIC8vIEl0IGlzIHZlcnkgcmFyZSwgYnV0IHNvbWUgQkFTRTY0IGRhdGEgbWF5IGJlIHNvIGJpZyB0aGF0Ci0gICAgICAgICAgICAvLyBPdXRPZk1lbW9yeUVycm9yIG9jY3Vycy4gVG8gaWdub3JlIHN1Y2ggY2FzZXMsIHVzZSB0cnktY2F0Y2guCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBnZXRCYXNlNjQocHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gdiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICB2LmFkZChyZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVZhbHVlcyh2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGVycm9yKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIk91dE9mTWVtb3J5RXJyb3IgaGFwcGVuZWQgZHVyaW5nIHBhcnNpbmcgQkFTRTY0IGRhdGEhIik7Ci0gICAgICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlWYWx1ZXMobnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRpbWVIYW5kbGVCYXNlNjQgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghKG1FbmNvZGluZyA9PSBudWxsIHx8IG1FbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCI3QklUIikKLSAgICAgICAgICAgICAgICAgICAgfHwgbUVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoIjhCSVQiKQotICAgICAgICAgICAgICAgICAgICB8fCBtRW5jb2RpbmcudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCJYLSIpKSkgewotICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJUaGUgZW5jb2RpbmcgdW5zdXBwb3J0ZWQgYnkgdkNhcmQgc3BlYzogXCIiICsgbUVuY29kaW5nICsgIlwiLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICB2LmFkZChtYXliZVVuZXNjYXBlVGV4dChwcm9wZXJ0eVZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlWYWx1ZXModik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGltZUhhbmRsZU1pc2NQcm9wZXJ0eVZhbHVlICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRRdW90ZWRQcmludGFibGUoU3RyaW5nIGZpcnN0U3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU3BlY2lmaWNhbGx5LCB0aGVyZSBtYXkgYmUgc29tZSBwYWRkaW5nIGJldHdlZW4gPSBhbmQgQ1JMRi4KLSAgICAgICAgLy8gU2VlIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIHFwLWxpbmUgOj0gKihxcC1zZWdtZW50IHRyYW5zcG9ydC1wYWRkaW5nIENSTEYpCi0gICAgICAgIC8vICAgICAgICAgICAgcXAtcGFydCB0cmFuc3BvcnQtcGFkZGluZwotICAgICAgICAvLyBxcC1zZWdtZW50IDo9IHFwLXNlY3Rpb24gKihTUEFDRSAvIFRBQikgIj0iCi0gICAgICAgIC8vICAgICAgICAgICAgIDsgTWF4aW11bSBsZW5ndGggb2YgNzYgY2hhcmFjdGVycwotICAgICAgICAvLwotICAgICAgICAvLyBlLmcuIChmcm9tIFJGQyAyMDQ1KQotICAgICAgICAvLyBOb3cncyB0aGUgdGltZSA9Ci0gICAgICAgIC8vIGZvciBhbGwgZm9sayB0byBjb21lPQotICAgICAgICAvLyAgdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LgotICAgICAgICBpZiAoZmlyc3RTdHJpbmcudHJpbSgpLmVuZHNXaXRoKCI9IikpIHsKLSAgICAgICAgICAgIC8vIHJlbW92ZSAidHJhbnNwb3J0LXBhZGRpbmciCi0gICAgICAgICAgICBpbnQgcG9zID0gZmlyc3RTdHJpbmcubGVuZ3RoKCkgLSAxOwotICAgICAgICAgICAgd2hpbGUoZmlyc3RTdHJpbmcuY2hhckF0KHBvcykgIT0gJz0nKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZmlyc3RTdHJpbmcuc3Vic3RyaW5nKDAsIHBvcyArIDEpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcclxuIik7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgbGluZSA9IGdldExpbmUoKTsKLSAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlsZSBlbmRlZCBkdXJpbmcgcGFyc2luZyBxdW90ZWQtcHJpbnRhYmxlIFN0cmluZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGluZS50cmltKCkuZW5kc1dpdGgoIj0iKSkgewotICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgInRyYW5zcG9ydC1wYWRkaW5nIgotICAgICAgICAgICAgICAgICAgICBwb3MgPSBsaW5lLmxlbmd0aCgpIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUobGluZS5jaGFyQXQocG9zKSAhPSAnPScpIHsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lLnN1YnN0cmluZygwLCBwb3MgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcclxuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7IAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZpcnN0U3RyaW5nOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZTY0KFN0cmluZyBmaXJzdFN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZpcnN0U3RyaW5nKTsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZSA9IGdldExpbmUoKTsKLSAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiRmlsZSBlbmRlZCBkdXJpbmcgcGFyc2luZyBCQVNFNjQgYmluYXJ5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWFpbmx5IGZvciAiQURSIiwgIk9SRyIsIGFuZCAiTiIKLSAgICAgKiBXZSBkbyBub3QgY2FyZSB0aGUgbnVtYmVyIG9mIHN0cm5vc2VtaSBoZXJlLgotICAgICAqIAotICAgICAqIGFkZHJlc3NwYXJ0cyA9IDAqNihzdHJub3NlbWkgIjsiKSBzdHJub3NlbWkKLSAgICAgKiAgICAgICAgICAgICAgOyBQTyBCb3gsIEV4dGVuZGVkIEFkZHIsIFN0cmVldCwgTG9jYWxpdHksIFJlZ2lvbiwKLSAgICAgKiAgICAgICAgICAgICAgICBQb3N0YWwgQ29kZSwgQ291bnRyeSBOYW1lCi0gICAgICogb3JncGFydHMgICAgID0gKihzdHJub3NlbWkgIjsiKSBzdHJub3NlbWkKLSAgICAgKiAgICAgICAgICAgICAgOyBGaXJzdCBpcyBPcmdhbml6YXRpb24gTmFtZSwKLSAgICAgKiAgICAgICAgICAgICAgICByZW1haW5kZXIgYXJlIE9yZ2FuaXphdGlvbiBVbml0cy4KLSAgICAgKiBuYW1lcGFydHMgICAgPSAwKjQoc3Rybm9zZW1pICI7Iikgc3Rybm9zZW1pCi0gICAgICogICAgICAgICAgICAgIDsgRmFtaWx5LCBHaXZlbiwgTWlkZGxlLCBQcmVmaXgsIFN1ZmZpeC4KLSAgICAgKiAgICAgICAgICAgICAgOyBFeGFtcGxlOlB1YmxpYztKb2huO1EuO1JldmVyZW5kIERyLjtJSUksIEVzcS4KLSAgICAgKiBzdHJub3NlbWkgICAgPSAqKCpub25zZW1pICgiXDsiIC8gIlwiIENSTEYpKSAqbm9uc2VtaQotICAgICAqICAgICAgICAgICAgICA7IFRvIGluY2x1ZGUgYSBzZW1pY29sb24gaW4gdGhpcyBzdHJpbmcsIGl0IG11c3QgYmUgZXNjYXBlZAotICAgICAqICAgICAgICAgICAgICA7IHdpdGggYSAiXCIgY2hhcmFjdGVyLgotICAgICAqICAgICAgICAgICAgICAKLSAgICAgKiBXZSBhcmUgbm90IHN1cmUgd2hldGhlciB3ZSBzaG91bGQgYWRkICJcIiBDUkxGIHRvIGVhY2ggdmFsdWUuCi0gICAgICogRm9yIG5vdywgd2UgZXhjbHVkZSB0aGVtLiAgICAgICAgICAgICAgIAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZU11bHRpcGxlUHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICAvLyB2Q2FyZCAyLjEgZG9lcyBub3QgYWxsb3cgUVVPVEVELVBSSU5UQUJMRSBoZXJlLAotICAgICAgICAvLyBidXQgc29tZSBzb2Z0d2FyZXMvZGV2aWNlcyBlbWl0IHN1Y2ggZGF0YS4KLSAgICAgICAgaWYgKG1FbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCJRVU9URUQtUFJJTlRBQkxFIikpIHsKLSAgICAgICAgICAgIHByb3BlcnR5VmFsdWUgPSBnZXRRdW90ZWRQcmludGFibGUocHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlWYWx1ZXMoVkNhcmRVdGlscy5jb25zdHJ1Y3RMaXN0RnJvbVZhbHVlKAotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLCAoZ2V0VmVyc2lvbigpID09IFZDYXJkQ29uZmlnLkZMQUdfVjMwKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdkNhcmQgMi4xIHNwZWNpZmllcyBBR0VOVCBhbGxvd3Mgb25lIHZjYXJkIGVudHJ5LiBJdCBpcyBub3QgZW5jb2RlZCBhdCBhbGwuCi0gICAgICoKLSAgICAgKiBpdGVtICA9IC4uLgotICAgICAqICAgICAgIC8gW2dyb3VwcyAiLiJdICJBR0VOVCIKLSAgICAgKiAgICAgICAgIFtwYXJhbXNdICI6IiB2Y2FyZCBDUkxGCi0gICAgICogdmNhcmQgPSAiQkVHSU4iIFt3c10gIjoiIFt3c10gIlZDQVJEIiBbd3NdIDEqQ1JMRgotICAgICAqICAgICAgICAgaXRlbXMgKkNSTEYgIkVORCIgW3dzXSAiOiIgW3dzXSAiVkNBUkQiCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWdlbnQoZmluYWwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghcHJvcGVydHlWYWx1ZS50b1VwcGVyQ2FzZSgpLmNvbnRhaW5zKCJCRUdJTjpWQ0FSRCIpKSB7Ci0gICAgICAgICAgICAvLyBBcHBhcmVudGx5IGludmFsaWQgbGluZSBzZWVuIGluIFdpbmRvd3MgTW9iaWxlIDYuNS4gSWdub3JlIHRoZW0uCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiQUdFTlQgUHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBub3cuIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETzogU3VwcG9ydCBBR0VOVCBwcm9wZXJ0eS4KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRm9yIHZDYXJkIDMuMC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heWJlVW5lc2NhcGVUZXh0KGZpbmFsIFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdW5lc2NhcGVkIFN0cmluZyBpZiB0aGUgY2hhcmFjdGVyIHNob3VsZCBiZSB1bmVzY2FwZWQuIFJldHVybiBudWxsIG90aGVyd2lzZS4KLSAgICAgKiBlLmcuIEluIHZDYXJkIDIuMSwgIlw7IiBzaG91bGQgYmUgdW5lc2NhcGVkIGludG8gIjsiIHdoaWxlICJceCIgc2hvdWxkIG5vdCBiZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heWJlVW5lc2NhcGVDaGFyYWN0ZXIoZmluYWwgY2hhciBjaCkgewotICAgICAgICByZXR1cm4gdW5lc2NhcGVDaGFyYWN0ZXIoY2gpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlQ2hhcmFjdGVyKGZpbmFsIGNoYXIgY2gpIHsKLSAgICAgICAgLy8gT3JpZ2luYWwgdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgdHJhbnNmb3JtYXRpb24KLSAgICAgICAgLy8gIlw6IiAtPiAiOiIsICJcLCIgLT4gIiwiLCBhbmQgIlxcIiAtPiAiXCIsIGJ1dCBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBvZgotICAgICAgICAvLyB0aGlzIGNsYXNzIGFsbG93ZWQgdGhlbSwgc28ga2VlcCBpdCBhcyBpcy4KLSAgICAgICAgaWYgKGNoID09ICdcXCcgfHwgY2ggPT0gJzsnIHx8IGNoID09ICc6JyB8fCBjaCA9PSAnLCcpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihjaCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBwYXJzZShmaW5hbCBJbnB1dFN0cmVhbSBpcywgZmluYWwgVkNhcmRJbnRlcnByZXRlciBidWlsZGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBwYXJzZShpcywgVkNhcmRDb25maWcuREVGQVVMVF9DSEFSU0VULCBidWlsZGVyKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBjaGFyc2V0LCBWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNoYXJzZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgY2hhcnNldCA9IFZDYXJkQ29uZmlnLkRFRkFVTFRfQ0hBUlNFVDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbVJlYWRlciB0bXBSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsIGNoYXJzZXQpOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuc2hvd1BlcmZvcm1hbmNlTG9nKCkpIHsKLSAgICAgICAgICAgIG1SZWFkZXIgPSBuZXcgQ3VzdG9tQnVmZmVyZWRSZWFkZXIodG1wUmVhZGVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1SZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIodG1wUmVhZGVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbUJ1aWxkZXIgPSBidWlsZGVyOwotCi0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyc2VWQ2FyZEZpbGUoKTsKLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmVuZCgpOwotICAgICAgICB9Ci0gICAgICAgIG1UaW1lVG90YWwgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgCi0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5zaG93UGVyZm9ybWFuY2VMb2coKSkgewotICAgICAgICAgICAgc2hvd1BlcmZvcm1hbmNlSW5mbygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBjaGFyc2V0LCBWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIsIGJvb2xlYW4gY2FuY2VsZWQpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgbUNhbmNlbGVkID0gY2FuY2VsZWQ7Ci0gICAgICAgIHBhcnNlKGlzLCBjaGFyc2V0LCBidWlsZGVyKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHByaXZhdGUgdm9pZCBzaG93UGVyZm9ybWFuY2VJbmZvKCkgewotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVG90YWwgcGFyc2luZyB0aW1lOiAgIiArIG1UaW1lVG90YWwgKyAiIG1zIik7Ci0gICAgICAgIGlmIChtUmVhZGVyIGluc3RhbmNlb2YgQ3VzdG9tQnVmZmVyZWRSZWFkZXIpIHsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJUb3RhbCByZWFkTGluZSB0aW1lOiAiICsKLSAgICAgICAgICAgICAgICAgICAgKChDdXN0b21CdWZmZXJlZFJlYWRlciltUmVhZGVyKS5nZXRUb3RhbG1pbGxpc2Vjb25kKCkgKyAiIG1zIik7Ci0gICAgICAgIH0KLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIGhhbmRsaW5nIHRoZSBiZWdnaW5pbmcgb2YgdGhlIHJlY29yZDogIiArCi0gICAgICAgICAgICAgICAgbVRpbWVSZWFkU3RhcnRSZWNvcmQgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBoYW5kbGluZyB0aGUgZW5kIG9mIHRoZSByZWNvcmQ6ICIgKwotICAgICAgICAgICAgICAgIG1UaW1lUmVhZEVuZFJlY29yZCArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIHBhcnNpbmcgbGluZSwgYW5kIGhhbmRsaW5nIGdyb3VwOiAiICsKLSAgICAgICAgICAgICAgICBtVGltZVBhcnNlTGluZUFuZEhhbmRsZUdyb3VwICsgIiBtcyIpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVGltZSBmb3IgcGFyc2luZyBBRFIsIE9SRywgYW5kIE4gZmllbGRzOiIgKyBtVGltZVBhcnNlQWRyT3JnTiArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIHBhcnNpbmcgcHJvcGVydHkgdmFsdWVzOiAiICsgbVRpbWVQYXJzZVByb3BlcnR5VmFsdWVzICsgIiBtcyIpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVGltZSBmb3IgaGFuZGxpbmcgbm9ybWFsIHByb3BlcnR5IHZhbHVlczogIiArCi0gICAgICAgICAgICAgICAgbVRpbWVIYW5kbGVNaXNjUHJvcGVydHlWYWx1ZSArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIGhhbmRsaW5nIFF1b3RlZC1QcmludGFibGU6ICIgKwotICAgICAgICAgICAgICAgIG1UaW1lSGFuZGxlUXVvdGVkUHJpbnRhYmxlICsgIiBtcyIpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVGltZSBmb3IgaGFuZGxpbmcgQmFzZTY0OiAiICsgbVRpbWVIYW5kbGVCYXNlNjQgKyAiIG1zIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTGV0dGVyKGNoYXIgY2gpIHsKLSAgICAgICAgaWYgKChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLWNsYXNzIEN1c3RvbUJ1ZmZlcmVkUmVhZGVyIGV4dGVuZHMgQnVmZmVyZWRSZWFkZXIgewotICAgIHByaXZhdGUgbG9uZyBtVGltZTsKLSAgICAKLSAgICBwdWJsaWMgQ3VzdG9tQnVmZmVyZWRSZWFkZXIoUmVhZGVyIGluKSB7Ci0gICAgICAgIHN1cGVyKGluKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyByZWFkTGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgU3RyaW5nIHJldCA9IHN1cGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIG1UaW1lICs9IGVuZCAtIHN0YXJ0OwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbG1pbGxpc2Vjb25kKCkgewotICAgICAgICByZXR1cm4gbVRpbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1YzMC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1YzMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWNmZTk3Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotLyoqCi0gKiBUaGUgY2xhc3MgdXNlZCB0byBwYXJzZSB2Q2FyZCAzLjAuCi0gKiBQbGVhc2UgcmVmZXIgdG8gdkNhcmQgU3BlY2lmaWNhdGlvbiAzLjAgKGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI0MjYpLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRQYXJzZXJfVjMwIGV4dGVuZHMgVkNhcmRQYXJzZXJfVjIxIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZFBhcnNlcl9WMzAiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxTdHJpbmc+IHNBY2NlcHRhYmxlUHJvcHNXaXRoUGFyYW0gPSBuZXcgSGFzaFNldDxTdHJpbmc+KAotICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgIkJFR0lOIiwgIkxPR08iLCAiUEhPVE8iLCAiTEFCRUwiLCAiRk4iLCAiVElUTEUiLCAiU09VTkQiLCAKLSAgICAgICAgICAgICAgICAgICAgIlZFUlNJT04iLCAiVEVMIiwgIkVNQUlMIiwgIlRaIiwgIkdFTyIsICJOT1RFIiwgIlVSTCIsCi0gICAgICAgICAgICAgICAgICAgICJCREFZIiwgIlJPTEUiLCAiUkVWIiwgIlVJRCIsICJLRVkiLCAiTUFJTEVSIiwgLy8gMi4xCi0gICAgICAgICAgICAgICAgICAgICJOQU1FIiwgIlBST0ZJTEUiLCAiU09VUkNFIiwgIk5JQ0tOQU1FIiwgIkNMQVNTIiwKLSAgICAgICAgICAgICAgICAgICAgIlNPUlQtU1RSSU5HIiwgIkNBVEVHT1JJRVMiLCAiUFJPRElEIikpOyAvLyAzLjAKLSAgICAKLSAgICAvLyBBbHRob3VnaCAiN2JpdCIgYW5kICJCQVNFNjQiIGlzIG5vdCBhbGxvd2VkIGluIHZDYXJkIDMuMCwgd2UgYWxsb3cgaXQgZm9yIHNhZmV0eS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoU2V0PFN0cmluZz4gc0FjY2VwdGFibGVFbmNvZGluZ1YzMCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oCi0gICAgICAgICAgICBBcnJheXMuYXNMaXN0KCI3QklUIiwgIjhCSVQiLCAiQkFTRTY0IiwgIkIiKSk7Ci0gICAgCi0gICAgLy8gQWx0aG91Z2ggUkZDIDI0MjYgc3BlY2lmaWVzIHNvbWUgcHJvcGVydHkgbXVzdCBub3QgaGF2ZSBwYXJhbWV0ZXJzLCB3ZSBhbGxvdyBpdCwgCi0gICAgLy8gc2luY2UgdGhlcmUgbWF5IGJlIHNvbWUgY2FyZWVycyB3aGljaCB2aW9sYXRlcyB0aGUgUkZDLi4uCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxTdHJpbmc+IGFjY2VwdGFibGVQcm9wc1dpdGhvdXRQYXJhbSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1QcmV2aW91c0xpbmU7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUVtaXR0ZWRBZ2VudFdhcm5pbmcgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRydWUgd2hlbiB0aGUgY2FsbGVyIHdhbnRzIHRoZSBwYXJzZXIgdG8gYmUgc3RyaWN0IGFib3V0IHRoZSBpbnB1dC4KLSAgICAgKiBDdXJyZW50bHkgdGhpcyBpcyBvbmx5IGZvciB0ZXN0aW5nLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtU3RyaWN0UGFyc2luZzsKLQotICAgIHB1YmxpYyBWQ2FyZFBhcnNlcl9WMzAoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIG1TdHJpY3RQYXJzaW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHN0cmljdFBhcnNpbmcgd2hlbiB0cnVlLCB0aGlzIG9iamVjdCB0aHJvd3MgVkNhcmRFeGNlcHRpb24gd2hlbiB0aGUgdmNhcmQgaXMgbm90Ci0gICAgICogdmFsaWQgZnJvbSB0aGUgdmlldyBvZiB2Q2FyZCAzLjAgc3BlY2lmaWNhdGlvbiAoZGVmaW5lZCBpbiBSRkMgMjQyNikuIE5vdGUgdGhhdCB0aGlzIGNsYXNzCi0gICAgICogaXMgbm90IGZ1bGx5IHlldCBmb3IgYmVpbmcgdXNlZCB3aXRoIHRoaXMgZmxhZyBhbmQgbWF5IG5vdCBub3RpY2UgaW52YWxpZCBsaW5lKHMpLgotICAgICAqCi0gICAgICogQGhpZGUgY3VycmVudGx5IG9ubHkgZm9yIHRlc3RpbmchIAotICAgICAqLwotICAgIHB1YmxpYyBWQ2FyZFBhcnNlcl9WMzAoYm9vbGVhbiBzdHJpY3RQYXJzaW5nKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIG1TdHJpY3RQYXJzaW5nID0gc3RyaWN0UGFyc2luZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjMwKGludCBwYXJzZU1vZGUpIHsKLSAgICAgICAgc3VwZXIocGFyc2VNb2RlKTsKLSAgICAgICAgbVN0cmljdFBhcnNpbmcgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgaW50IGdldFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZENvbmZpZy5GTEFHX1YzMDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZlcnNpb25TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1YzMDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkUHJvcGVydHlOYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgaWYgKCEoc0FjY2VwdGFibGVQcm9wc1dpdGhQYXJhbS5jb250YWlucyhwcm9wZXJ0eU5hbWUpIHx8Ci0gICAgICAgICAgICAgICAgYWNjZXB0YWJsZVByb3BzV2l0aG91dFBhcmFtLmNvbnRhaW5zKHByb3BlcnR5TmFtZSkgfHwKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aCgiWC0iKSkgJiYKLSAgICAgICAgICAgICAgICAhbVVua25vd25UeXBlTWFwLmNvbnRhaW5zKHByb3BlcnR5TmFtZSkpIHsKLSAgICAgICAgICAgIG1Vbmtub3duVHlwZU1hcC5hZGQocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJQcm9wZXJ0eSBuYW1lIHVuc3VwcG9ydGVkIGJ5IHZDYXJkIDMuMDogIiArIHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgewotICAgICAgICByZXR1cm4gc0FjY2VwdGFibGVFbmNvZGluZ1YzMC5jb250YWlucyhlbmNvZGluZy50b1VwcGVyQ2FzZSgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAobVByZXZpb3VzTGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmV0ID0gbVByZXZpb3VzTGluZTsKLSAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtUmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogdkNhcmQgMy4wIHJlcXVpcmVzIHRoYXQgdGhlIGxpbmUgd2l0aCBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lCi0gICAgICogbXVzdCBiZSBjb21iaW5lZCB3aXRoIHByZXZpb3VzIGxpbmUuIAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9uRW1wdHlMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBudWxsOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgbGluZSA9IG1SZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJldmlvdXNMaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJldCA9IG1QcmV2aW91c0xpbmU7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlJlYWNoZWQgZW5kIG9mIGJ1ZmZlci4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVByZXZpb3VzTGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXQgPSBtUHJldmlvdXNMaW5lOwotICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuY2hhckF0KDApID09ICcgJyB8fCBsaW5lLmNoYXJBdCgwKSA9PSAnXHQnKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBTZWUgU2VjdGlvbiA1LjguMSBvZiBSRkMgMjQyNSAoTUlNRS1ESVIgZG9jdW1lbnQpLgotICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgaXMgdGhlIGV4Y2VycHRzIGZyb20gaXQuICAKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gREVTQ1JJUFRJT046VGhpcyBpcyBhIGxvbmcgZGVzY3JpcHRpb24gdGhhdCBleGlzdHMgb24gYSBsb25nIGxpbmUuCi0gICAgICAgICAgICAgICAgICAgIC8vIAotICAgICAgICAgICAgICAgICAgICAvLyBDYW4gYmUgcmVwcmVzZW50ZWQgYXM6Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIERFU0NSSVBUSU9OOlRoaXMgaXMgYSBsb25nIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIC8vICB0aGF0IGV4aXN0cyBvbiBhIGxvbmcgbGluZS4KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gSXQgY291bGQgYWxzbyBiZSByZXByZXNlbnRlZCBhczoKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gREVTQ1JJUFRJT046VGhpcyBpcyBhIGxvbmcgZGVzY3JpcAotICAgICAgICAgICAgICAgICAgICAvLyAgdGlvbiB0aGF0IGV4aXN0cyBvCi0gICAgICAgICAgICAgICAgICAgIC8vICBuIGEgbG9uZyBsaW5lLgotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lLnN1YnN0cmluZygxKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJldmlvdXNMaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG1QcmV2aW91c0xpbmUpOwotICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZS5zdWJzdHJpbmcoMSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiU3BhY2UgZXhpc3RzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtUHJldmlvdXNMaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmV0ID0gbVByZXZpb3VzTGluZTsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIHZjYXJkID0gW2dyb3VwICIuIl0gIkJFR0lOIiAiOiIgIlZDQVJEIiAxICogQ1JMRgotICAgICAqICAgICAgICAgMSAqIChjb250ZW50bGluZSkKLSAgICAgKiAgICAgICAgIDtBIHZDYXJkIG9iamVjdCBNVVNUIGluY2x1ZGUgdGhlIFZFUlNJT04sIEZOIGFuZCBOIHR5cGVzLgotICAgICAqICAgICAgICAgW2dyb3VwICIuIl0gIkVORCIgIjoiICJWQ0FSRCIgMSAqIENSTEYKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkQmVnaW5WQ2FyZChib29sZWFuIGFsbG93R2FyYmFnZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE86IHZDYXJkIDMuMCBzdXBwb3J0cyBncm91cC4KLSAgICAgICAgcmV0dXJuIHN1cGVyLnJlYWRCZWdpblZDYXJkKGFsbG93R2FyYmFnZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVhZEVuZFZDYXJkKGJvb2xlYW4gdXNlQ2FjaGUsIGJvb2xlYW4gYWxsb3dHYXJiYWdlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE86IHZDYXJkIDMuMCBzdXBwb3J0cyBncm91cC4KLSAgICAgICAgc3VwZXIucmVhZEVuZFZDYXJkKHVzZUNhY2hlLCBhbGxvd0dhcmJhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZDYXJkIDMuMCBhbGxvd3MgaWFuYS10b2tlbiBhcyBwYXJhbVR5cGUsIHdoaWxlIHZDYXJkIDIuMSBkb2VzIG5vdC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYXJhbXMoU3RyaW5nIHBhcmFtcykgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN1cGVyLmhhbmRsZVBhcmFtcyhwYXJhbXMpOwotICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBtYXliZSBJQU5BIHR5cGUKLSAgICAgICAgICAgIFN0cmluZ1tdIHN0ckFycmF5ID0gcGFyYW1zLnNwbGl0KCI9IiwgMik7Ci0gICAgICAgICAgICBpZiAoc3RyQXJyYXkubGVuZ3RoID09IDIpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVBbnlQYXJhbShzdHJBcnJheVswXSwgc3RyQXJyYXlbMV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBNdXN0IG5vdCBjb21lIGhlcmUgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gcGFyYW1zIHZhbHVlOiAiICsgcGFyYW1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFueVBhcmFtKFN0cmluZyBwYXJhbU5hbWUsIFN0cmluZyBwYXJhbVZhbHVlKSB7Ci0gICAgICAgIHN1cGVyLmhhbmRsZUFueVBhcmFtKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUGFyYW1XaXRob3V0TmFtZShmaW5hbCBTdHJpbmcgcGFyYW1WYWx1ZSkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1TdHJpY3RQYXJzaW5nKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlBhcmFtZXRlciB3aXRob3V0IG5hbWUgaXMgbm90IGFjY2VwdGFibGUgaW4gdkNhcmQgMy4wIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdXBlci5oYW5kbGVQYXJhbVdpdGhvdXROYW1lKHBhcmFtVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIHZDYXJkIDMuMCBkZWZpbmVzCi0gICAgICogIAotICAgICAqICBwYXJhbSAgICAgICAgID0gcGFyYW0tbmFtZSAiPSIgcGFyYW0tdmFsdWUgKigiLCIgcGFyYW0tdmFsdWUpCi0gICAgICogIHBhcmFtLW5hbWUgICAgPSBpYW5hLXRva2VuIC8geC1uYW1lCi0gICAgICogIHBhcmFtLXZhbHVlICAgPSBwdGV4dCAvIHF1b3RlZC1zdHJpbmcKLSAgICAgKiAgcXVvdGVkLXN0cmluZyA9IERRVU9URSBRU0FGRS1DSEFSIERRVU9URQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVR5cGUoU3RyaW5nIHB0eXBldmFsdWVzKSB7Ci0gICAgICAgIFN0cmluZ1tdIHB0eXBlQXJyYXkgPSBwdHlwZXZhbHVlcy5zcGxpdCgiLCIpOwotICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVHlwZSgiVFlQRSIpOwotICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHB0eXBlQXJyYXkpIHsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMiAmJiB2YWx1ZS5zdGFydHNXaXRoKCJcIiIpICYmIHZhbHVlLmVuZHNXaXRoKCJcIiIpKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGgoKSAtIDEpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFnZW50KFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0gICAgICAgIC8vIFRoZSB3YXkgaG93IHZDYXJkIDMuMCBzdXBwb3J0cyAiQUdFTlQiIGlzIGNvbXBsZXRlbHkgZGlmZmVyZW50IGZyb20gdkNhcmQgMi4xLgotICAgICAgICAvLwotICAgICAgICAvLyBlLmcuCi0gICAgICAgIC8vIEFHRU5UOkJFR0lOOlZDQVJEXG5GTjpKb2UgRnJpZGF5XG5URUw6KzEtOTE5LTU1NS03ODc4XG4KLSAgICAgICAgLy8gIFRJVExFOkFyZWEgQWRtaW5pc3RyYXRvclwsIEFzc2lzdGFudFxuIEVNQUlMXDtUWVBFPUlOVEVSTlxuCi0gICAgICAgIC8vICBFVDpqZnJpZGF5QGhvc3QuY29tXG5FTkQ6VkNBUkRcbgotICAgICAgICAvLwotICAgICAgICAvLyBUT0RPOiBmaXggdGhpcy4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gaXNzdWU6Ci0gICAgICAgIC8vICB2Q2FyZCAzLjAgYWxzbyBhbGxvd3MgdGhpcyBhcyBhbiBleGFtcGxlLgotICAgICAgICAvLwotICAgICAgICAvLyBBR0VOVDtWQUxVRT11cmk6Ci0gICAgICAgIC8vICBDSUQ6SlFQVUJMSUMucGFydDMuOTYwMTI5VDA4MzAyMC54eXpNYWlsQGhvc3QzLmNvbQotICAgICAgICAvLwotICAgICAgICAvLyBUaGlzIGlzIG5vdCB2Q2FyZC4gU2hvdWxkIHdlIHN1cHBvcnQgdGhpcz8KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSnVzdCBpZ25vcmUgdGhlIGxpbmUgZm9yIG5vdywgc2luY2Ugd2UgY2Fubm90IGtub3cgaG93IHRvIGhhbmRsZSBpdC4uLgotICAgICAgICBpZiAoIW1FbWl0dGVkQWdlbnRXYXJuaW5nKSB7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiQUdFTlQgaW4gdkNhcmQgMy4wIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiBJZ25vcmUgaXQiKTsKLSAgICAgICAgICAgIG1FbWl0dGVkQWdlbnRXYXJuaW5nID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiB2Q2FyZCAzLjAgZG9lcyBub3QgcmVxdWlyZSB0d28gQ1JMRiBhdCB0aGUgbGFzdCBvZiBCQVNFNjQgZGF0YS4KLSAgICAgKiBJdCBvbmx5IHJlcXVpcmVzIHRoYXQgZGF0YSBzaG91bGQgYmUgTUlNRS1lbmNvZGVkLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZTY0KFN0cmluZyBmaXJzdFN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZpcnN0U3RyaW5nKTsKLQotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkZpbGUgZW5kZWQgZHVyaW5nIHBhcnNpbmcgQkFTRTY0IGJpbmFyeSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmICghbGluZS5zdGFydHNXaXRoKCIgIikgJiYgIWxpbmUuc3RhcnRzV2l0aCgiXHQiKSkgewotICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBsaW5lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEVTQ0FQRUQtQ0hBUiA9ICJcXCIgLyAiXDsiIC8gIlwsIiAvICJcbiIgLyAiXE4iKQotICAgICAqICAgICAgICAgICAgICA7IFxcIGVuY29kZXMgXCwgXG4gb3IgXE4gZW5jb2RlcyBuZXdsaW5lCi0gICAgICogICAgICAgICAgICAgIDsgXDsgZW5jb2RlcyA7LCBcLCBlbmNvZGVzICwKLSAgICAgKiAgICAgICAgICAgICAgCi0gICAgICogTm90ZTogQXBwbGUgZXNjYXBlcyAnOicgaW50byAnXDonIHdoaWxlIGRvZXMgbm90IGVzY2FwZSAnXCcKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heWJlVW5lc2NhcGVUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHJldHVybiB1bmVzY2FwZVRleHQodGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdW5lc2NhcGVUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGludCBsZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gdGV4dC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJ1xcJyAmJiBpIDwgbGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgIGNoYXIgbmV4dF9jaCA9IHRleHQuY2hhckF0KCsraSk7IAotICAgICAgICAgICAgICAgIGlmIChuZXh0X2NoID09ICduJyB8fCBuZXh0X2NoID09ICdOJykgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChuZXh0X2NoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOyAgICAgICAgCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtYXliZVVuZXNjYXBlQ2hhcmFjdGVyKGNoYXIgY2gpIHsKLSAgICAgICAgcmV0dXJuIHVuZXNjYXBlQ2hhcmFjdGVyKGNoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1bmVzY2FwZUNoYXJhY3RlcihjaGFyIGNoKSB7Ci0gICAgICAgIGlmIChjaCA9PSAnbicgfHwgY2ggPT0gJ04nKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlxuIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihjaCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFNvdXJjZURldGVjdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRTb3VyY2VEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjk3YzUwLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFNvdXJjZURldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIENsYXNzIHdoaWNoIHRyaWVzIHRvIGRldGVjdHMgdGhlIHNvdXJjZSBvZiB0aGUgdkNhcmQgZnJvbSBpdHMgcHJvcGVydGllcy4KLSAqIEN1cnJlbnRseSB0aGlzIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgcHJlbWF0dXJlLgotICogQGhpZGUKLSAqLwotcHVibGljIGNsYXNzIFZDYXJkU291cmNlRGV0ZWN0b3IgaW1wbGVtZW50cyBWQ2FyZEludGVycHJldGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBBUFBMRV9TSUdOUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICJYLVBIT05FVElDLUZJUlNULU5BTUUiLCAiWC1QSE9ORVRJQy1NSURETEUtTkFNRSIsICJYLVBIT05FVElDLUxBU1QtTkFNRSIsCi0gICAgICAgICAgICAiWC1BQkFEUiIsICJYLUFCVUlEIikpOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IEpBUEFORVNFX01PQklMRV9QSE9ORV9TSUdOUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICJYLUdOTyIsICJYLUdOIiwgIlgtUkVEVUNUSU9OIikpOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IFdJTkRPV1NfTU9CSUxFX1BIT05FX1NJR05TID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgIlgtTUlDUk9TT0ZULUFTU1RfVEVMIiwgIlgtTUlDUk9TT0ZULUFTU0lTVEFOVCIsICJYLU1JQ1JPU09GVC1PRkZJQ0VMT0MiKSk7Ci0gICAgCi0gICAgLy8gTm90ZTogdGhlc2Ugc2lnbmVzIGFwcGVhcnMgYmVmb3JlIHRoZSBzaWducyBvZiB0aGUgb3RoZXIgdHlwZSAoZS5nLiAiWC1HTiIpLgotICAgIC8vIEluIG90aGVyIHdvcmRzLCBKYXBhbmVzZSBGT01BIG1vYmlsZSBwaG9uZXMgYXJlIGRldGVjdGVkIGFzIEZPTUEsIG5vdCBKQVBBTkVTRV9NT0JJTEVfUEhPTkVTLgotICAgIHByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IEZPTUFfU0lHTlMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAiWC1TRC1WRVJOIiwgIlgtU0QtRk9STUFUX1ZFUiIsICJYLVNELUNBVEVHT1JJRVMiLCAiWC1TRC1DTEFTUyIsICJYLVNELURDUkVBVEVEIiwKLSAgICAgICAgICAgICJYLVNELURFU0NSSVBUSU9OIikpOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBUWVBFX0ZPTUFfQ0hBUlNFVF9TSUdOID0gIlgtU0QtQ0hBUl9DT0RFIjsKLSAgICAKLSAgICBwcml2YXRlIGludCBtVHlwZSA9IFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfVU5LTk9XTjsKLSAgICAvLyBTb21lIG1vYmlsZSBwaG9uZXMgKGxpa2UgRk9NQSkgdGVsbHMgdXMgdGhlIGNoYXJzZXQgb2YgdGhlIGRhdGEuCi0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkUGFyc2VTcGVjaWZpZWRDaGFyc2V0OwotICAgIHByaXZhdGUgU3RyaW5nIG1TcGVjaWZpZWRDaGFyc2V0OwotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBlbmQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbnRyeSgpIHsKLSAgICB9ICAgIAotCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcm9wZXJ0eSgpIHsKLSAgICAgICAgbU5lZWRQYXJzZVNwZWNpZmllZENoYXJzZXQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZW5kUHJvcGVydHkoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRW50cnkoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlHcm91cChTdHJpbmcgZ3JvdXApIHsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoVFlQRV9GT01BX0NIQVJTRVRfU0lHTikpIHsKLSAgICAgICAgICAgIG1UeXBlID0gVkNhcmRDb25maWcuUEFSU0VfVFlQRV9GT01BOwotICAgICAgICAgICAgbU5lZWRQYXJzZVNwZWNpZmllZENoYXJzZXQgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVHlwZSAhPSBWQ2FyZENvbmZpZy5QQVJTRV9UWVBFX1VOS05PV04pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoV0lORE9XU19NT0JJTEVfUEhPTkVfU0lHTlMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgIG1UeXBlID0gVkNhcmRDb25maWcuUEFSU0VfVFlQRV9XSU5ET1dTX01PQklMRV9KUDsKLSAgICAgICAgfSBlbHNlIGlmIChGT01BX1NJR05TLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICBtVHlwZSA9IFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfRk9NQTsKLSAgICAgICAgfSBlbHNlIGlmIChKQVBBTkVTRV9NT0JJTEVfUEhPTkVfU0lHTlMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgIG1UeXBlID0gVkNhcmRDb25maWcuUEFSU0VfVFlQRV9NT0JJTEVfUEhPTkVfSlA7Ci0gICAgICAgIH0gZWxzZSBpZiAoQVBQTEVfU0lHTlMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgIG1UeXBlID0gVkNhcmRDb25maWcuUEFSU0VfVFlQRV9BUFBMRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1UeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKG1OZWVkUGFyc2VTcGVjaWZpZWRDaGFyc2V0ICYmIHZhbHVlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtU3BlY2lmaWVkQ2hhcnNldCA9IHZhbHVlcy5nZXQoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIGludCBnZXRFc3RpbWF0ZWRUeXBlKCkgewotICAgICAgICByZXR1cm4gbVR5cGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiBjaGFyc2V0IFN0cmluZyBndWVzc2VkIGZyb20gdGhlIHNvdXJjZSdzIHByb3BlcnRpZXMuCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgcGFyc2luZyB0YXJnZXQgZmlsZShzKS4KLSAgICAgKiBAcmV0dXJuIENoYXJzZXQgU3RyaW5nLiBOdWxsIGlzIHJldHVybmVkIGlmIGd1ZXNzaW5nIHRoZSBzb3VyY2UgZmFpbHMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFc3RpbWF0ZWRDaGFyc2V0KCkgewotICAgICAgICBpZiAobVNwZWNpZmllZENoYXJzZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1TcGVjaWZpZWRDaGFyc2V0OwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAobVR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgVkNhcmRDb25maWcuUEFSU0VfVFlQRV9XSU5ET1dTX01PQklMRV9KUDoKLSAgICAgICAgICAgIGNhc2UgVkNhcmRDb25maWcuUEFSU0VfVFlQRV9GT01BOgotICAgICAgICAgICAgY2FzZSBWQ2FyZENvbmZpZy5QQVJTRV9UWVBFX01PQklMRV9QSE9ORV9KUDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNISUZUX0pJUyI7Ci0gICAgICAgICAgICBjYXNlIFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfQVBQTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVVEYtOCI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NzI3OTkuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuSW07Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJVdGlsczsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBVdGlsaXRpZXMgZm9yIFZDYXJkIGhhbmRsaW5nIGNvZGVzLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRVdGlscyB7Ci0gICAgLy8gTm90ZSB0aGF0IG5vdCBhbGwgdHlwZXMgYXJlIGluY2x1ZGVkIGluIHRoaXMgbWFwL3NldCwgc2luY2UsIGZvciBleGFtcGxlLCBUWVBFX0hPTUVfRkFYIGlzCi0gICAgLy8gY29udmVydGVkIHRvIHR3byBwYXJhbWV0ZXIgU3RyaW5ncy4gVGhlc2Ugb25seSBjb250YWluIHNvbWUgbWlub3IgZmllbGRzIHZhbGlkIGluIGJvdGgKLSAgICAvLyB2Q2FyZCBhbmQgY3VycmVudCAoYXMgb2YgMjAwOS0wOC0wNykgQ29udGFjdHMgc3RydWN0dXJlLiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgU3RyaW5nPiBzS25vd25QaG9uZVR5cGVzTWFwX0l0b1M7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzS25vd25QaG9uZVR5cGVNYXBfU3RvSTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgU3RyaW5nPiBzS25vd25JbVByb3BOYW1lTWFwX0l0b1M7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc01vYmlsZVBob25lTGFiZWxTZXQ7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBzS25vd25QaG9uZVR5cGVzTWFwX0l0b1MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotCi0gICAgICAgIHNLbm93blBob25lVHlwZXNNYXBfSXRvUy5wdXQoUGhvbmUuVFlQRV9DQVIsIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0FSKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0FSLCBQaG9uZS5UWVBFX0NBUik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZXNNYXBfSXRvUy5wdXQoUGhvbmUuVFlQRV9QQUdFUiwgVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QQUdFUik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BBR0VSLCBQaG9uZS5UWVBFX1BBR0VSKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlc01hcF9JdG9TLnB1dChQaG9uZS5UWVBFX0lTRE4sIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSVNETik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0lTRE4sIFBob25lLlRZUEVfSVNETik7Ci0gICAgICAgIAotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLLCBQaG9uZS5UWVBFX1dPUkspOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMLCBQaG9uZS5UWVBFX01PQklMRSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9QSE9ORV9FWFRSQV9UWVBFX09USEVSLCBQaG9uZS5UWVBFX09USEVSKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1BIT05FX0VYVFJBX1RZUEVfQ0FMTEJBQ0ssCi0gICAgICAgICAgICAgICAgUGhvbmUuVFlQRV9DQUxMQkFDSyk7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dCgKLSAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0NPTVBBTllfTUFJTiwgUGhvbmUuVFlQRV9DT01QQU5ZX01BSU4pOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9SQURJTywgUGhvbmUuVFlQRV9SQURJTyk7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9QSE9ORV9FWFRSQV9UWVBFX1RUWV9UREQsCi0gICAgICAgICAgICAgICAgUGhvbmUuVFlQRV9UVFlfVEREKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1BIT05FX0VYVFJBX1RZUEVfQVNTSVNUQU5ULAotICAgICAgICAgICAgICAgIFBob25lLlRZUEVfQVNTSVNUQU5UKTsKLQotICAgICAgICBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX01PREVNKTsKLSAgICAgICAgc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9NU0cpOwotICAgICAgICBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0JCUyk7Ci0gICAgICAgIHNQaG9uZVR5cGVzVW5rbm93blRvQ29udGFjdHNTZXQuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfVklERU8pOwotCi0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9BSU0sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfQUlNKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9NU04sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfTVNOKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9ZQUhPTywgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9ZQUhPTyk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfU0tZUEUsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfU0tZUEVfVVNFUk5BTUUpOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX0dPT0dMRV9UQUxLLAotICAgICAgICAgICAgICAgIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfR09PR0xFX1RBTEspOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX0lDUSwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9JQ1EpOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX0pBQkJFUiwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9KQUJCRVIpOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX1FRLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1FRKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9ORVRNRUVUSU5HLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX05FVE1FRVRJTkcpOwotCi0gICAgICAgIC8vIFx1NjQzQVx1NUUyRlx1OTZGQlx1OEE3MSA9IEZ1bGwtd2lkdGggSGlyYWdhbmEgIktlaXRhaS1EZW53YSIgKG1vYmlsZSBwaG9uZSkKLSAgICAgICAgLy8gXHU2NDNBXHU1RTJGID0gRnVsbC13aWR0aCBIaXJhZ2FuYSAiS2VpdGFpIiAobW9iaWxlIHBob25lKQotICAgICAgICAvLyBcdTMwQjFcdTMwQTRcdTMwQkZcdTMwQTQgPSBGdWxsLXdpZHRoIEthdGFrYW5hICJLZWl0YWkiIChtb2JpbGUgcGhvbmUpCi0gICAgICAgIC8vIFx1RkY3OVx1RkY3Mlx1RkY4MFx1RkY3MiA9IEhhbGYtd2lkdGggS2F0YWthbmEgIktlaXRhaSIgKG1vYmlsZSBwaG9uZSkKLSAgICAgICAgc01vYmlsZVBob25lTGFiZWxTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgIk1PQklMRSIsICJcdTY0M0FcdTVFMkZcdTk2RkJcdThBNzEiLCAiXHU2NDNBXHU1RTJGIiwgIlx1MzBCMVx1MzBBNFx1MzBCRlx1MzBBNCIsCi0gICAgICAgICAgICAgICAgIlx1RkY3OVx1RkY3Mlx1RkY4MFx1RkY3MiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQaG9uZVR5cGVTdHJpbmcoSW50ZWdlciB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBzS25vd25QaG9uZVR5cGVzTWFwX0l0b1MuZ2V0KHR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgSW50ZXJnZXIgd2hlbiB0aGUgZ2l2ZW4gdHlwZXMgY2FuIGJlIHBhcnNlZCBhcyBrbm93biB0eXBlLiBSZXR1cm5zIFN0cmluZyBvYmplY3QKLSAgICAgKiB3aGVuIG5vdCwgd2hpY2ggc2hvdWxkIGJlIHNldCB0byBsYWJlbC4gCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0UGhvbmVUeXBlRnJvbVN0cmluZ3MoQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVzLAotICAgICAgICAgICAgU3RyaW5nIG51bWJlcikgewotICAgICAgICBpZiAobnVtYmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG51bWJlciA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIGludCB0eXBlID0gLTE7Ci0gICAgICAgIFN0cmluZyBsYWJlbCA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gaXNGYXggPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBoYXNQcmVmID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBpZiAodHlwZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZVN0cmluZyA6IHR5cGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVTdHJpbmcudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgICAgICBoYXNQcmVmID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfRkFYKSkgewotICAgICAgICAgICAgICAgICAgICBpc0ZheCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuc3RhcnRzV2l0aCgiWC0iKSAmJiB0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVTdHJpbmcuc3Vic3RyaW5nKDIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgdG1wID0gc0tub3duUGhvbmVUeXBlTWFwX1N0b0kuZ2V0KHR5cGVTdHJpbmcpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB0eXBlQ2FuZGlkYXRlID0gdG1wOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVFlQRV9QQUdFUiBpcyBwcmVmZXJlZCB3aGVuIHRoZSBudW1iZXIgY29udGFpbnMgQCBzdXJyb25kZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcGFnZXIgbnVtYmVyIGFuZCBhIGRvbWFpbiBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZS5nLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbyAxMTExQGRvbWFpbi5jb20KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHggQGRvbWFpbi5jb20KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHggMTExMUAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleE9mQXQgPSBudW1iZXIuaW5kZXhPZigiQCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlQ2FuZGlkYXRlID09IFBob25lLlRZUEVfUEFHRVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgMCA8IGluZGV4T2ZBdCAmJiBpbmRleE9mQXQgPCBudW1iZXIubGVuZ3RoKCkgLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlIDwgMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlID09IFBob25lLlRZUEVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHRtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfQ1VTVE9NOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB0eXBlU3RyaW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgaWYgKGhhc1ByZWYpIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9NQUlOOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIFRZUEVfSE9NRQotICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX0hPTUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzRmF4KSB7Ci0gICAgICAgICAgICBpZiAodHlwZSA9PSBQaG9uZS5UWVBFX0hPTUUpIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9GQVhfSE9NRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBQaG9uZS5UWVBFX1dPUkspIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9GQVhfV09SSzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBQaG9uZS5UWVBFX09USEVSKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfT1RIRVJfRkFYOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlID09IFBob25lLlRZUEVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGFiZWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gdHlwZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTW9iaWxlUGhvbmVMYWJlbChmaW5hbCBTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi0gICAgICAgIC8vIERldGFpbDogVW50aWwgRG9udXQsIHRoZXJlIGlzbid0IFRZUEVfTU9CSUxFIGZvciBlbWFpbCB3aGlsZSB0aGVyZSBpcyBub3cuCi0gICAgICAgIC8vICAgICAgICAgVG8gc3VwcG9ydCBtb2JpbGUgdHlwZSBhdCB0aGF0IHRpbWUsIHRoaXMgY3VzdG9tIGxhYmVsIGhhZCBiZWVuIHVzZWQuCi0gICAgICAgIHJldHVybiAoYW5kcm9pZC5wcm92aWRlci5Db250YWN0cy5Db250YWN0TWV0aG9kc0NvbHVtbnMuTU9CSUxFX0VNQUlMX1RZUEVfTkFNRS5lcXVhbHMobGFiZWwpCi0gICAgICAgICAgICAgICAgfHwgc01vYmlsZVBob25lTGFiZWxTZXQuY29udGFpbnMobGFiZWwpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEluVjIxQnV0VW5rbm93blRvQ29udGFjdHNQaG90ZVR5cGUoZmluYWwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIHJldHVybiBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0LmNvbnRhaW5zKGxhYmVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWVGb3JJbShmaW5hbCBpbnQgcHJvdG9jb2wpIHsKLSAgICAgICAgcmV0dXJuIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5nZXQocHJvdG9jb2wpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc29ydE5hbWVFbGVtZW50cyhmaW5hbCBpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZhbWlseU5hbWUsIGZpbmFsIFN0cmluZyBtaWRkbGVOYW1lLCBmaW5hbCBTdHJpbmcgZ2l2ZW5OYW1lKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGxpc3QgPSBuZXcgU3RyaW5nWzNdOwotICAgICAgICBmaW5hbCBpbnQgbmFtZU9yZGVyVHlwZSA9IFZDYXJkQ29uZmlnLmdldE5hbWVPcmRlclR5cGUodmNhcmRUeXBlKTsKLSAgICAgICAgc3dpdGNoIChuYW1lT3JkZXJUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFZDYXJkQ29uZmlnLk5BTUVfT1JERVJfSkFQQU5FU0U6IHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoZmFtaWx5TmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKGdpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFswXSA9IGdpdmVuTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFsxXSA9IG1pZGRsZU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMl0gPSBmYW1pbHlOYW1lOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMF0gPSBmYW1pbHlOYW1lOwotICAgICAgICAgICAgICAgICAgICBsaXN0WzFdID0gbWlkZGxlTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFsyXSA9IGdpdmVuTmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFZDYXJkQ29uZmlnLk5BTUVfT1JERVJfRVVST1BFOiB7Ci0gICAgICAgICAgICAgICAgbGlzdFswXSA9IG1pZGRsZU5hbWU7Ci0gICAgICAgICAgICAgICAgbGlzdFsxXSA9IGdpdmVuTmFtZTsKLSAgICAgICAgICAgICAgICBsaXN0WzJdID0gZmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICBsaXN0WzBdID0gZ2l2ZW5OYW1lOwotICAgICAgICAgICAgICAgIGxpc3RbMV0gPSBtaWRkbGVOYW1lOwotICAgICAgICAgICAgICAgIGxpc3RbMl0gPSBmYW1pbHlOYW1lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFBob25lTnVtYmVyRm9ybWF0KGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzSmFwYW5lc2VEZXZpY2UodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIHBvc3RhbCBkYXRhIGludG8gdGhlIGJ1aWxkZXIgb2JqZWN0LgotICAgICAqIAotICAgICAqIE5vdGUgdGhhdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgb2YgQ29udGFjdHNDb250cmFjdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGF0IGRlZmluZWQgaW4gdkNhcmQuCi0gICAgICogU28gc29tZSBjb252ZXJzaW9uIG1heSBiZSBwZXJmb3JtZWQgaW4gdGhpcyBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFN0cnVjdHVyZWRQb3N0YWxEYXRhVXNpbmdDb250YWN0c1N0cnVjdChpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgYnVpbGRlciwKLSAgICAgICAgICAgIGZpbmFsIFZDYXJkRW50cnkuUG9zdGFsRGF0YSBwb3N0YWxEYXRhKSB7Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShTdHJ1Y3R1cmVkUG9zdGFsLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBwb3N0YWxEYXRhLnR5cGUpOwotICAgICAgICBpZiAocG9zdGFsRGF0YS50eXBlID09IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsIHBvc3RhbERhdGEubGFiZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHN0cmVldFN0cmluZzsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBvc3RhbERhdGEuc3RyZWV0KSkgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgIHN0cmVldFN0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmVldFN0cmluZyA9IHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgIHN0cmVldFN0cmluZyA9IHBvc3RhbERhdGEuc3RyZWV0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJlZXRTdHJpbmcgPSBwb3N0YWxEYXRhLnN0cmVldCArICIgIiArIHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsIHBvc3RhbERhdGEucG9ib3gpOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgc3RyZWV0U3RyaW5nKTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCBwb3N0YWxEYXRhLmxvY2FsdHkpOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgcG9zdGFsRGF0YS5yZWdpb24pOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCBwb3N0YWxEYXRhLnBvc3RhbENvZGUpOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksIHBvc3RhbERhdGEuY291bnRyeSk7Ci0KLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICBwb3N0YWxEYXRhLmdldEZvcm1hdHRlZEFkZHJlc3ModmNhcmRUeXBlKSk7Ci0gICAgICAgIGlmIChwb3N0YWxEYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMoZmluYWwgaW50IHZjYXJkVHlwZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmYW1pbHlOYW1lLCBmaW5hbCBTdHJpbmcgbWlkZGxlTmFtZSwgZmluYWwgU3RyaW5nIGdpdmVuTmFtZSkgewotICAgICAgICByZXR1cm4gY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyh2Y2FyZFR5cGUsIGZhbWlseU5hbWUsIG1pZGRsZU5hbWUsIGdpdmVuTmFtZSwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKGZpbmFsIGludCB2Y2FyZFR5cGUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmFtaWx5TmFtZSwgZmluYWwgU3RyaW5nIG1pZGRsZU5hbWUsIGZpbmFsIFN0cmluZyBnaXZlbk5hbWUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4LCBmaW5hbCBTdHJpbmcgc3VmZml4KSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIG5hbWVMaXN0ID0gc29ydE5hbWVFbGVtZW50cyh2Y2FyZFR5cGUsIGZhbWlseU5hbWUsIG1pZGRsZU5hbWUsIGdpdmVuTmFtZSk7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHByZWZpeCkpIHsKLSAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChwcmVmaXgpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIG5hbWVQYXJ0IDogbmFtZUxpc3QpIHsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobmFtZVBhcnQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobmFtZVBhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoc3VmZml4KSkgewotICAgICAgICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChzdWZmaXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gY29uc3RydWN0TGlzdEZyb21WYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzVjMwKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2hhciBjaCA9IHZhbHVlLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnICYmIGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBuZXh0Q2ggPSB2YWx1ZS5jaGFyQXQoaSArIDEpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1bmVzY2FwZWRTdHJpbmcgPQotICAgICAgICAgICAgICAgICAgICAoaXNWMzAgPyBWQ2FyZFBhcnNlcl9WMzAudW5lc2NhcGVDaGFyYWN0ZXIobmV4dENoKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZFBhcnNlcl9WMjEudW5lc2NhcGVDaGFyYWN0ZXIobmV4dENoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVuZXNjYXBlZFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHVuZXNjYXBlZFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOycpIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKGZpbmFsIFN0cmluZy4uLnZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250YWluc09ubHlQcmludGFibGVBc2NpaShBcnJheXMuYXNMaXN0KHZhbHVlcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlQcmludGFibGVBc2NpaShmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzUHJpbnRhYmxlQXNjaWlPbmx5KHZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGNoZWNraW5nIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGVuY29kZWQgaW50byBxdW90ZWQtcHJpbnRhYmxlCi0gICAgICogb3Igbm90LCB3aGljaCBpcyByZXF1aXJlZCBieSB2Q2FyZCAyLjEuCi0gICAgICogU2VlIHRoZSBkZWZpbml0aW9uIG9mICI3Yml0IiBpbiB2Q2FyZCAyLjEgc3BlYyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGZpbmFsIFN0cmluZy4uLnZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgYXNjaWlGaXJzdCA9IDB4MjA7Ci0gICAgICAgIGZpbmFsIGludCBhc2NpaUxhc3QgPSAweDdFOyAgLy8gaW5jbHVkZWQKLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpID0gdmFsdWUub2Zmc2V0QnlDb2RlUG9pbnRzKGksIDEpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGMgPSB2YWx1ZS5jb2RlUG9pbnRBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoIShhc2NpaUZpcnN0IDw9IGMgJiYgYyA8PSBhc2NpaUxhc3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENoYXJhY3Rlcj4gc1VuQWNjZXB0YWJsZUFzY2lpSW5WMjFXb3JkU2V0ID0KLSAgICAgICAgbmV3IEhhc2hTZXQ8Q2hhcmFjdGVyPihBcnJheXMuYXNMaXN0KCdbJywgJ10nLCAnPScsICc6JywgJy4nLCAnLCcsICcgJykpOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyB1c2VmdWwgc2luY2UgdkNhcmQgMy4wIG9mdGVuIHJlcXVpcmVzIHRoZSAoIlgtIikgcHJvcGVydGllcyBhbmQgZ3JvdXBzCi0gICAgICogc2hvdWxkIGNvbnRhaW4gb25seSBhbHBoYWJldHMsIGRpZ2l0cywgYW5kIGh5cGhlbi4KLSAgICAgKiAKLSAgICAgKiBOb3RlOiBJdCBpcyBhbHJlYWR5IGtub3duIHNvbWUgZGV2aWNlcyAod3JvbmdseSkgb3V0cHV0cyBwcm9wZXJ0aWVzIHdpdGggY2hhcmFjdGVycwotICAgICAqICAgICAgIHdoaWNoIHNob3VsZCBub3QgYmUgaW4gdGhlIGZpZWxkLiBPbmUgZXhhbXBsZSBpcyAiWC1HT09HTEUgVEFMSyIuIFdlIGFjY2VwdAotICAgICAqICAgICAgIHN1Y2gga2luZCBvZiBpbnB1dCBidXQgbXVzdCBuZXZlciBvdXRwdXQgaXQgdW5sZXNzIHRoZSB0YXJnZXQgaXMgdmVyeSBzcGVjaWZpYwotICAgICAqICAgICAgIHRvIHRoZSBkZXZpY2Ugd2hpY2ggaXMgYWJsZSB0byBwYXJzZSB0aGUgbWFsZm9ybWVkIGlucHV0LiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihmaW5hbCBTdHJpbmcuLi52YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihBcnJheXMuYXNMaXN0KHZhbHVlcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgdXBwZXJBbHBoYWJldEZpcnN0ID0gMHg0MTsgIC8vIEEKLSAgICAgICAgZmluYWwgaW50IHVwcGVyQWxwaGFiZXRBZnRlckxhc3QgPSAweDViOyAgLy8gWwotICAgICAgICBmaW5hbCBpbnQgbG93ZXJBbHBoYWJldEZpcnN0ID0gMHg2MTsgIC8vIGEKLSAgICAgICAgZmluYWwgaW50IGxvd2VyQWxwaGFiZXRBZnRlckxhc3QgPSAweDdiOyAgLy8gewotICAgICAgICBmaW5hbCBpbnQgZGlnaXRGaXJzdCA9IDB4MzA7ICAvLyAwCi0gICAgICAgIGZpbmFsIGludCBkaWdpdEFmdGVyTGFzdCA9IDB4M0E7ICAvLyA6Ci0gICAgICAgIGZpbmFsIGludCBoeXBoZW4gPSAnLSc7Ci0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHN0ciA6IHZhbHVlcykgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHN0cikpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBzdHIubGVuZ3RoKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSA9IHN0ci5vZmZzZXRCeUNvZGVQb2ludHMoaSwgMSkpIHsKLSAgICAgICAgICAgICAgICBpbnQgY29kZXBvaW50ID0gc3RyLmNvZGVQb2ludEF0KGkpOwotICAgICAgICAgICAgICAgIGlmICghKChsb3dlckFscGhhYmV0Rmlyc3QgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8IGxvd2VyQWxwaGFiZXRBZnRlckxhc3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgICh1cHBlckFscGhhYmV0Rmlyc3QgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8IHVwcGVyQWxwaGFiZXRBZnRlckxhc3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChkaWdpdEZpcnN0IDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPCBkaWdpdEFmdGVyTGFzdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGNvZGVwb2ludCA9PSBoeXBoZW4pKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBnaXZlbiBTdHJpbmcgaXMgY2F0ZWdvcml6ZWQgYXMgIndvcmQiIHNwZWNpZmllZCBpbiB2Q2FyZCBzcGVjIDIuMS4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogdkNhcmQgMi4xIHNwZWNpZmllczo8QlIgLz4KLSAgICAgKiB3b3JkID0gJmx0O2FueSBwcmludGFibGUgN2JpdCB1cy1hc2NpaSBleGNlcHQgW109Oi4sICZndDsKLSAgICAgKiA8L1A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVjIxV29yZChmaW5hbCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IGFzY2lpRmlyc3QgPSAweDIwOwotICAgICAgICBmaW5hbCBpbnQgYXNjaWlMYXN0ID0gMHg3RTsgIC8vIGluY2x1ZGVkCi0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgPSB2YWx1ZS5vZmZzZXRCeUNvZGVQb2ludHMoaSwgMSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjID0gdmFsdWUuY29kZVBvaW50QXQoaSk7Ci0gICAgICAgICAgICBpZiAoIShhc2NpaUZpcnN0IDw9IGMgJiYgYyA8PSBhc2NpaUxhc3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHNVbkFjY2VwdGFibGVBc2NpaUluVjIxV29yZFNldC5jb250YWlucygoY2hhciljKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBSZXR1cm5zIFN0cmluZyBhdmFpbGFibGUgYXMgcGFyYW1ldGVyIHZhbHVlIGluIHZDYXJkIDMuMC4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogUkZDIDI0MjYgcmVxdWlyZXMgdkNhcmQgY29tcG9zZXIgdG8gcXVvdGUgcGFyYW1ldGVyIHZhbHVlcyB3aGVuIGl0IGNvbnRhaW5zCi0gICAgICogc2VtaS1jb2xvbiwgZm9yIGV4YW1wbGUgKFNlZSBSRkMgMjQyNiBmb3IgbW9yZSBpbmZvcm1hdGlvbikuCi0gICAgICogVGhpcyBtZXRob2QgY2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIFN0cmluZyBjYW4gYmUgdXNlZCB3aXRob3V0IHF1b3Rlcy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogTm90ZTogV2UgcmVtb3ZlIERRVU9URSBzaWxlbnRseSBmb3Igbm93LgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZ0F2YWlsYWJsZUFzVjMwUGFyYW1lVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHZhbHVlID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IGFzY2lpRmlyc3QgPSAweDIwOwotICAgICAgICBmaW5hbCBpbnQgYXNjaWlMYXN0ID0gMHg3RTsgIC8vIGluY2x1ZGVkCi0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgYm9vbGVhbiBuZWVkUXVvdGUgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgPSB2YWx1ZS5vZmZzZXRCeUNvZGVQb2ludHMoaSwgMSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb2RlUG9pbnQgPSB2YWx1ZS5jb2RlUG9pbnRBdChpKTsKLSAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPCBhc2NpaUZpcnN0IHx8IGNvZGVQb2ludCA9PSAnIicpIHsKLSAgICAgICAgICAgICAgICAvLyBDVEwgY2hhcmFjdGVycyBhbmQgRFFVT1RFIGFyZSBuZXZlciBhY2NlcHRlZC4gUmVtb3ZlIHRoZW0uCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZENvZGVQb2ludChjb2RlUG9pbnQpOwotICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA9PSAnOicgfHwgY29kZVBvaW50ID09ICcsJyB8fCBjb2RlUG9pbnQgPT0gJyAnKSB7Ci0gICAgICAgICAgICAgICAgbmVlZFF1b3RlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICByZXR1cm4gKChuZWVkUXVvdGUgfHwgcmVzdWx0LmlzRW1wdHkoKSkgPyAoJyInICsgcmVzdWx0ICsgJyInKSA6IHJlc3VsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9IYWxmV2lkdGhTdHJpbmcoZmluYWwgU3RyaW5nIG9yZ1N0cmluZykgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkob3JnU3RyaW5nKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IG9yZ1N0cmluZy5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgPSBvcmdTdHJpbmcub2Zmc2V0QnlDb2RlUG9pbnRzKGksIDEpKSB7Ci0gICAgICAgICAgICAvLyBBbGwgSmFwYW5lc2UgY2hhcmFjdGVyIGlzIGFibGUgdG8gYmUgZXhwcmVzc2VkIGJ5IGNoYXIuCi0gICAgICAgICAgICAvLyBEbyBub3QgbmVlZCB0byB1c2UgU3RyaW5nI2NvZGVwUG9pbnRBdCgpLgotICAgICAgICAgICAgZmluYWwgY2hhciBjaCA9IG9yZ1N0cmluZy5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgaGFsZldpZHRoVGV4dCA9IEphcGFuZXNlVXRpbHMudHJ5R2V0SGFsZldpZHRoVGV4dChjaCk7Ci0gICAgICAgICAgICBpZiAoaGFsZldpZHRoVGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoaGFsZldpZHRoVGV4dCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEd1ZXNzZXMgdGhlIGZvcm1hdCBvZiBpbnB1dCBpbWFnZS4gQ3VycmVudGx5IGp1c3QgdGhlIGZpcnN0IGZldyBieXRlcyBhcmUgdXNlZC4KLSAgICAgKiBUaGUgdHlwZSAiR0lGIiwgIlBORyIsIG9yICJKUEVHIiBpcyByZXR1cm5lZCB3aGVuIHBvc3NpYmxlLiBSZXR1cm5zIG51bGwgd2hlbgotICAgICAqIHRoZSBndWVzcyBmYWlsZWQuCi0gICAgICogQHBhcmFtIGlucHV0IEltYWdlIGFzIGJ5dGUgYXJyYXkuCi0gICAgICogQHJldHVybiBUaGUgaW1hZ2UgdHlwZSBvciBudWxsIHdoZW4gdGhlIHR5cGUgY2Fubm90IGJlIGRldGVybWluZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ3Vlc3NJbWFnZVR5cGUoZmluYWwgYnl0ZVtdIGlucHV0KSB7Ci0gICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID49IDMgJiYgaW5wdXRbMF0gPT0gJ0cnICYmIGlucHV0WzFdID09ICdJJyAmJiBpbnB1dFsyXSA9PSAnRicpIHsKLSAgICAgICAgICAgIHJldHVybiAiR0lGIjsKLSAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5sZW5ndGggPj0gNCAmJiBpbnB1dFswXSA9PSAoYnl0ZSkgMHg4OQotICAgICAgICAgICAgICAgICYmIGlucHV0WzFdID09ICdQJyAmJiBpbnB1dFsyXSA9PSAnTicgJiYgaW5wdXRbM10gPT0gJ0cnKSB7Ci0gICAgICAgICAgICAvLyBOb3RlOiB2Q2FyZCAyLjEgb2ZmaWNpYWxseSBkb2VzIG5vdCBzdXBwb3J0IFBORywgYnV0IHdlIG1heSBoYXZlIGl0IGFuZAotICAgICAgICAgICAgLy8gICAgICAgdXNpbmcgWC0gd29yZCBsaWtlICJYLVBORyIgbWF5IG5vdCBsZXQgaW1wb3J0ZXJzIGtub3cgaXQgaXMgUE5HLgotICAgICAgICAgICAgLy8gICAgICAgU28gd2UgdXNlIHRoZSBTdHJpbmcgIlBORyIgYXMgaXMuLi4KLSAgICAgICAgICAgIHJldHVybiAiUE5HIjsKLSAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5sZW5ndGggPj0gMiAmJiBpbnB1dFswXSA9PSAoYnl0ZSkgMHhmZgotICAgICAgICAgICAgICAgICYmIGlucHV0WzFdID09IChieXRlKSAweGQ4KSB7Ci0gICAgICAgICAgICByZXR1cm4gIkpQRUciOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRydWUgd2hlbiBhbGwgdGhlIGdpdmVuIHZhbHVlcyBhcmUgbnVsbCBvciBlbXB0eSBTdHJpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcmVBbGxFbXB0eShmaW5hbCBTdHJpbmcuLi52YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFZDYXJkVXRpbHMoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyYzdkZi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBWQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4dGVuZHMgVkNhcmROb3RTdXBwb3J0ZWRFeGNlcHRpb24gewotICAgIHB1YmxpYyBWQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1NzIxOS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVkNhcmRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgVkNhcmRFeGNlcHRpb24gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFZDYXJkRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBWQ2FyZEV4Y2VwdGlvbiBvYmplY3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFZDYXJkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2RiNjJjLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaHJvd24gd2hlbiB0aGUgdkNhcmQgaGFzIHNvbWUgbGluZSBzdGFydGluZyB3aXRoICcjJy4gSW4gdGhlIHNwZWNpZmljYXRpb24sCi0gKiBib3RoIHZDYXJkIDIuMSBhbmQgdkNhcmQgMy4wIGRvZXMgbm90IGFsbG93IHN1Y2ggbGluZSwgYnV0IHNvbWUgYWN0dWFsIGV4cG9ydGVyIGVtaXQKLSAqIHN1Y2ggbGluZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24gewotICAgIHB1YmxpYyBWQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwMTUzZS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaHJvd24gd2hlbiB0aGUgdkNhcmQgaGFzIHNvbWUgbGluZSBzdGFydGluZyB3aXRoICcjJy4gSW4gdGhlIHNwZWNpZmljYXRpb24sCi0gKiBib3RoIHZDYXJkIDIuMSBhbmQgdkNhcmQgMy4wIGRvZXMgbm90IGFsbG93IHN1Y2ggbGluZSwgYnV0IHNvbWUgYWN0dWFsIGV4cG9ydGVyIGVtaXQKLSAqIHN1Y2ggbGluZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uIGV4dGVuZHMgVkNhcmRFeGNlcHRpb24gewotICAgIHB1YmxpYyBWQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmROZXN0ZWRFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmROZXN0ZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzYzJmYi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTmVzdGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb247Ci0KLS8qKgotICogVkNhcmRFeGNlcHRpb24gdGhyb3duIHdoZW4gVkNhcmQgaXMgbmVzdGVkIHdpdGhvdXQgVkNhcmRQYXJzZXIncyBiZWluZyBub3RpZmllZC4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkTmVzdGVkRXhjZXB0aW9uIGV4dGVuZHMgVkNhcmROb3RTdXBwb3J0ZWRFeGNlcHRpb24gewotICAgIHB1YmxpYyBWQ2FyZE5lc3RlZEV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgcHVibGljIFZDYXJkTmVzdGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmROb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmROb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2YWE3NzYzLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmROb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb247Ci0KLS8qKgotICogVGhlIGV4Y2VwdGlvbiB3aGljaCB0ZWxscyB0aGF0IHRoZSBpbnB1dCBWQ2FyZCBpcyBwcm9iYWJseSB2YWxpZCBmcm9tIHRoZSB2aWV3IG9mCi0gKiBzcGVjaWZpY2F0aW9uIGJ1dCBub3Qgc3VwcG9ydGVkIGluIHRoZSBjdXJyZW50IGZyYW1ld29yayBmb3Igbm93LgotICogCi0gKiBUaGlzIGlzIGEga2luZCBvZiBhIGdvb2QgbmV3cyBmcm9tIHRoZSB2aWV3IG9mIGRldmVsb3BtZW50LgotICogSXQgbWF5IGJlIGdvb2QgdG8gYXNrIHVzZXJzIHRvIHNlbmQgYSByZXBvcnQgd2l0aCB0aGUgVkNhcmQgZXhhbXBsZQotICogZm9yIHRoZSBmdXR1cmUgZGV2ZWxvcG1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgVkNhcmROb3RTdXBwb3J0ZWRFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIHB1YmxpYyBWQ2FyZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZFZlcnNpb25FeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRWZXJzaW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZThiN2YuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZFZlcnNpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbjsKLQotLyoqCi0gKiBWQ2FyZEV4Y2VwdGlvbiB1c2VkIG9ubHkgd2hlbiB0aGUgdmVyc2lvbiBvZiB0aGUgdkNhcmQgaXMgZGlmZmVyZW50LiAKLSAqLwotcHVibGljIGNsYXNzIFZDYXJkVmVyc2lvbkV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgVkNhcmRWZXJzaW9uRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICBwdWJsaWMgVkNhcmRWZXJzaW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vcGFja2FnZS5odG1sIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YjhhMzIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxIVE1MPgotPEJPRFk+Ci17QGhpZGV9Ci08L0JPRFk+Ci08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL3BhY2thZ2UuaHRtbCBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YjhhMzIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPEhUTUw+Ci08Qk9EWT4KLXtAaGlkZX0KLTwvQk9EWT4KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL011bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZDU1NWNmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwyNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucHJlZmVyZW5jZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nLkJ1aWxkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEEge0BsaW5rIFByZWZlcmVuY2V9IHRoYXQgZGlzcGxheXMgYSBsaXN0IG9mIGVudHJpZXMgYXMKKyAqIGEgZGlhbG9nLgorICogPHA+CisgKiBUaGlzIHByZWZlcmVuY2Ugd2lsbCBzdG9yZSBhIHNldCBvZiBzdHJpbmdzIGludG8gdGhlIFNoYXJlZFByZWZlcmVuY2VzLgorICogVGhpcyBzZXQgd2lsbCBjb250YWluIG9uZSBvciBtb3JlIHZhbHVlcyBmcm9tIHRoZQorICoge0BsaW5rICNzZXRFbnRyeVZhbHVlcyhDaGFyU2VxdWVuY2VbXSl9IGFycmF5LgorICogCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlX2VudHJpZXMKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI011bHRpU2VsZWN0TGlzdFByZWZlcmVuY2VfZW50cnlWYWx1ZXMKKyAqLworcHVibGljIGNsYXNzIE11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UgZXh0ZW5kcyBEaWFsb2dQcmVmZXJlbmNlIHsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZVtdIG1FbnRyaWVzOworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlW10gbUVudHJ5VmFsdWVzOworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbVZhbHVlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIFNldDxTdHJpbmc+IG1OZXdWYWx1ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBib29sZWFuIG1QcmVmZXJlbmNlQ2hhbmdlZDsKKyAgICAKKyAgICBwdWJsaWMgTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZShDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIAorICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSwgMCwgMCk7CisgICAgICAgIG1FbnRyaWVzID0gYS5nZXRUZXh0QXJyYXkoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZV9lbnRyaWVzKTsKKyAgICAgICAgbUVudHJ5VmFsdWVzID0gYS5nZXRUZXh0QXJyYXkoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZV9lbnRyeVZhbHVlcyk7CisgICAgICAgIGEucmVjeWNsZSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgaHVtYW4tcmVhZGFibGUgZW50cmllcyB0byBiZSBzaG93biBpbiB0aGUgbGlzdC4gVGhpcyB3aWxsIGJlCisgICAgICogc2hvd24gaW4gc3Vic2VxdWVudCBkaWFsb2dzLgorICAgICAqIDxwPgorICAgICAqIEVhY2ggZW50cnkgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBpbmRleCBpbgorICAgICAqIHtAbGluayAjc2V0RW50cnlWYWx1ZXMoQ2hhclNlcXVlbmNlW10pfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZW50cmllcyBUaGUgZW50cmllcy4KKyAgICAgKiBAc2VlICNzZXRFbnRyeVZhbHVlcyhDaGFyU2VxdWVuY2VbXSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRyaWVzKENoYXJTZXF1ZW5jZVtdIGVudHJpZXMpIHsKKyAgICAgICAgbUVudHJpZXMgPSBlbnRyaWVzOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAc2VlICNzZXRFbnRyaWVzKENoYXJTZXF1ZW5jZVtdKQorICAgICAqIEBwYXJhbSBlbnRyaWVzUmVzSWQgVGhlIGVudHJpZXMgYXJyYXkgYXMgYSByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRyaWVzKGludCBlbnRyaWVzUmVzSWQpIHsKKyAgICAgICAgc2V0RW50cmllcyhnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0VGV4dEFycmF5KGVudHJpZXNSZXNJZCkpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBvZiBlbnRyaWVzIHRvIGJlIHNob3duIGluIHRoZSBsaXN0IGluIHN1YnNlcXVlbnQgZGlhbG9ncy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IGFzIGFuIGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2VbXSBnZXRFbnRyaWVzKCkgeworICAgICAgICByZXR1cm4gbUVudHJpZXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBhcnJheSB0byBmaW5kIHRoZSB2YWx1ZSB0byBzYXZlIGZvciBhIHByZWZlcmVuY2Ugd2hlbiBhbiBlbnRyeSBmcm9tCisgICAgICogZW50cmllcyBpcyBzZWxlY3RlZC4gSWYgYSB1c2VyIGNsaWNrcyBvbiB0aGUgc2Vjb25kIGl0ZW0gaW4gZW50cmllcywgdGhlCisgICAgICogc2Vjb25kIGl0ZW0gaW4gdGhpcyBhcnJheSB3aWxsIGJlIHNhdmVkIHRvIHRoZSBwcmVmZXJlbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbnRyeVZhbHVlcyBUaGUgYXJyYXkgdG8gYmUgdXNlZCBhcyB2YWx1ZXMgdG8gc2F2ZSBmb3IgdGhlIHByZWZlcmVuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW50cnlWYWx1ZXMoQ2hhclNlcXVlbmNlW10gZW50cnlWYWx1ZXMpIHsKKyAgICAgICAgbUVudHJ5VmFsdWVzID0gZW50cnlWYWx1ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSAjc2V0RW50cnlWYWx1ZXMoQ2hhclNlcXVlbmNlW10pCisgICAgICogQHBhcmFtIGVudHJ5VmFsdWVzUmVzSWQgVGhlIGVudHJ5IHZhbHVlcyBhcnJheSBhcyBhIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudHJ5VmFsdWVzKGludCBlbnRyeVZhbHVlc1Jlc0lkKSB7CisgICAgICAgIHNldEVudHJ5VmFsdWVzKGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXRUZXh0QXJyYXkoZW50cnlWYWx1ZXNSZXNJZCkpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiB2YWx1ZXMgdG8gYmUgc2F2ZWQgZm9yIHRoZSBwcmVmZXJlbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGFycmF5IG9mIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlW10gZ2V0RW50cnlWYWx1ZXMoKSB7CisgICAgICAgIHJldHVybiBtRW50cnlWYWx1ZXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBrZXkuIFRoaXMgc2hvdWxkIGNvbnRhaW4gZW50cmllcyBpbgorICAgICAqIHtAbGluayAjZ2V0RW50cnlWYWx1ZXMoKX0uCisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIHRvIHNldCBmb3IgdGhlIGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoU2V0PFN0cmluZz4gdmFsdWVzKSB7CisgICAgICAgIG1WYWx1ZXMgPSB2YWx1ZXM7CisgICAgICAgIAorICAgICAgICBwZXJzaXN0U3RyaW5nU2V0KHZhbHVlcyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUga2V5LgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRWYWx1ZXMoKSB7CisgICAgICAgIHJldHVybiBtVmFsdWVzOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gdmFsdWUgKGluIHRoZSBlbnRyeSB2YWx1ZXMgYXJyYXkpLgorICAgICAqIAorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgd2hvc2UgaW5kZXggc2hvdWxkIGJlIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSB2YWx1ZSwgb3IgLTEgaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZmluZEluZGV4T2ZWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgbUVudHJ5VmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtRW50cnlWYWx1ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBpZiAobUVudHJ5VmFsdWVzW2ldLmVxdWFscyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QcmVwYXJlRGlhbG9nQnVpbGRlcihCdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICAgICAgc3VwZXIub25QcmVwYXJlRGlhbG9nQnVpbGRlcihidWlsZGVyKTsKKyAgICAgICAgCisgICAgICAgIGlmIChtRW50cmllcyA9PSBudWxsIHx8IG1FbnRyeVZhbHVlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSByZXF1aXJlcyBhbiBlbnRyaWVzIGFycmF5IGFuZCAiICsKKyAgICAgICAgICAgICAgICAgICAgImFuIGVudHJ5VmFsdWVzIGFycmF5LiIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBib29sZWFuW10gY2hlY2tlZEl0ZW1zID0gZ2V0U2VsZWN0ZWRJdGVtcygpOworICAgICAgICBidWlsZGVyLnNldE11bHRpQ2hvaWNlSXRlbXMobUVudHJpZXMsIGNoZWNrZWRJdGVtcywKKyAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uTXVsdGlDaG9pY2VDbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCwgYm9vbGVhbiBpc0NoZWNrZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0NoZWNrZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJlZmVyZW5jZUNoYW5nZWQgfD0gbU5ld1ZhbHVlcy5hZGQobUVudHJpZXNbd2hpY2hdLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJlZmVyZW5jZUNoYW5nZWQgfD0gbU5ld1ZhbHVlcy5yZW1vdmUobUVudHJpZXNbd2hpY2hdLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIG1OZXdWYWx1ZXMuY2xlYXIoKTsKKyAgICAgICAgbU5ld1ZhbHVlcy5hZGRBbGwobVZhbHVlcyk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgYm9vbGVhbltdIGdldFNlbGVjdGVkSXRlbXMoKSB7CisgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZVtdIGVudHJpZXMgPSBtRW50cmllczsKKyAgICAgICAgZmluYWwgaW50IGVudHJ5Q291bnQgPSBlbnRyaWVzLmxlbmd0aDsKKyAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gdmFsdWVzID0gbVZhbHVlczsKKyAgICAgICAgYm9vbGVhbltdIHJlc3VsdCA9IG5ldyBib29sZWFuW2VudHJ5Q291bnRdOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyeUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdFtpXSA9IHZhbHVlcy5jb250YWlucyhlbnRyaWVzW2ldLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRpYWxvZ0Nsb3NlZChib29sZWFuIHBvc2l0aXZlUmVzdWx0KSB7CisgICAgICAgIHN1cGVyLm9uRGlhbG9nQ2xvc2VkKHBvc2l0aXZlUmVzdWx0KTsKKyAgICAgICAgCisgICAgICAgIGlmIChwb3NpdGl2ZVJlc3VsdCAmJiBtUHJlZmVyZW5jZUNoYW5nZWQpIHsKKyAgICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHZhbHVlcyA9IG1OZXdWYWx1ZXM7CisgICAgICAgICAgICBpZiAoY2FsbENoYW5nZUxpc3RlbmVyKHZhbHVlcykpIHsKKyAgICAgICAgICAgICAgICBzZXRWYWx1ZXModmFsdWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtUHJlZmVyZW5jZUNoYW5nZWQgPSBmYWxzZTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIE9iamVjdCBvbkdldERlZmF1bHRWYWx1ZShUeXBlZEFycmF5IGEsIGludCBpbmRleCkgeworICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2VbXSBkZWZhdWx0VmFsdWVzID0gYS5nZXRUZXh0QXJyYXkoaW5kZXgpOworICAgICAgICBmaW5hbCBpbnQgdmFsdWVDb3VudCA9IGRlZmF1bHRWYWx1ZXMubGVuZ3RoOworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0LmFkZChkZWZhdWx0VmFsdWVzW2ldLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblNldEluaXRpYWxWYWx1ZShib29sZWFuIHJlc3RvcmVWYWx1ZSwgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgeworICAgICAgICBzZXRWYWx1ZXMocmVzdG9yZVZhbHVlID8gZ2V0UGVyc2lzdGVkU3RyaW5nU2V0KG1WYWx1ZXMpIDogKFNldDxTdHJpbmc+KSBkZWZhdWx0VmFsdWUpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUGFyY2VsYWJsZSBvblNhdmVJbnN0YW5jZVN0YXRlKCkgeworICAgICAgICBmaW5hbCBQYXJjZWxhYmxlIHN1cGVyU3RhdGUgPSBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKCk7CisgICAgICAgIGlmIChpc1BlcnNpc3RlbnQoKSkgeworICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBzYXZlIGluc3RhbmNlIHN0YXRlCisgICAgICAgICAgICByZXR1cm4gc3VwZXJTdGF0ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZmluYWwgU2F2ZWRTdGF0ZSBteVN0YXRlID0gbmV3IFNhdmVkU3RhdGUoc3VwZXJTdGF0ZSk7CisgICAgICAgIG15U3RhdGUudmFsdWVzID0gZ2V0VmFsdWVzKCk7CisgICAgICAgIHJldHVybiBteVN0YXRlOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTYXZlZFN0YXRlIGV4dGVuZHMgQmFzZVNhdmVkU3RhdGUgeworICAgICAgICBTZXQ8U3RyaW5nPiB2YWx1ZXM7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZShQYXJjZWwgc291cmNlKSB7CisgICAgICAgICAgICBzdXBlcihzb3VyY2UpOworICAgICAgICAgICAgdmFsdWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgU3RyaW5nW10gc3RyaW5ncyA9IHNvdXJjZS5yZWFkU3RyaW5nQXJyYXkoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZmluYWwgaW50IHN0cmluZ0NvdW50ID0gc3RyaW5ncy5sZW5ndGg7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKHN0cmluZ3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZShQYXJjZWxhYmxlIHN1cGVyU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyKHN1cGVyU3RhdGUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBzdXBlci53cml0ZVRvUGFyY2VsKGRlc3QsIGZsYWdzKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmdBcnJheSh2YWx1ZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFNhdmVkU3RhdGU+IENSRUFUT1IgPQorICAgICAgICAgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4oKSB7CisgICAgICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZShpbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhdmVkU3RhdGVbc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UuamF2YQppbmRleCBkZGU2NDkzLi4xN2IyZTgyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UuamF2YQpAQCAtMTYsOCArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJlZmVyZW5jZTsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5DaGFyU2VxdWVuY2VzOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKQEAgLTI4LDcgKzI3LDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQ2hhclNlcXVlbmNlczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQWJzU2F2ZWRTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CkBAIC0zNiw2ICszNCwxMCBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCiAvKioKICAqIFJlcHJlc2VudHMgdGhlIGJhc2ljIFByZWZlcmVuY2UgVUkgYnVpbGRpbmcKICAqIGJsb2NrIGRpc3BsYXllZCBieSBhIHtAbGluayBQcmVmZXJlbmNlQWN0aXZpdHl9IGluIHRoZSBmb3JtIG9mIGEKQEAgLTU0LDYgKzU2LDcgQEAKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2VfdGl0bGUKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2Vfc3VtbWFyeQogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZV9vcmRlcgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZV9mcmFnbWVudAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZV9sYXlvdXQKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2Vfd2lkZ2V0TGF5b3V0CiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlX2VuYWJsZWQKQEAgLTg2LDYgKzg5LDggQEAKICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtU3VtbWFyeTsKICAgICBwcml2YXRlIFN0cmluZyBtS2V5OwogICAgIHByaXZhdGUgSW50ZW50IG1JbnRlbnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUZyYWdtZW50OworICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkID0gdHJ1ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbVNlbGVjdGFibGUgPSB0cnVlOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUmVxdWlyZXNLZXk7CkBAIC0yMDgsNiArMjEzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIG1PcmRlciA9IGEuZ2V0SW50KGF0dHIsIG1PcmRlcik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICAgICAgY2FzZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlX2ZyYWdtZW50OgorICAgICAgICAgICAgICAgICAgICBtRnJhZ21lbnQgPSBhLmdldFN0cmluZyhhdHRyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgICAgICBjYXNlIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByZWZlcmVuY2VfbGF5b3V0OgogICAgICAgICAgICAgICAgICAgICBtTGF5b3V0UmVzSWQgPSBhLmdldFJlc291cmNlSWQoYXR0ciwgbUxheW91dFJlc0lkKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zMTMsNiArMzIyLDQ0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB0aGUgY2xhc3MgbmFtZSBvZiBhIGZyYWdtZW50IHRvIGJlIHNob3duIHdoZW4gdGhpcyBQcmVmZXJlbmNlIGlzIGNsaWNrZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGNsYXNzIG5hbWUgb2YgdGhlIGZyYWdtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIFByZWZlcmVuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RnJhZ21lbnQoU3RyaW5nIGZyYWdtZW50KSB7CisgICAgICAgIG1GcmFnbWVudCA9IGZyYWdtZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZnJhZ21lbnQgY2xhc3MgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBQcmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgZnJhZ21lbnQgY2xhc3MgbmFtZSBsYXN0IHNldCB2aWEge0BsaW5rICNzZXRGcmFnbWVudH0gb3IgWE1MLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnJhZ21lbnQoKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBleHRyYXMgQnVuZGxlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcmVmZXJlbmNlLCBjcmVhdGluZworICAgICAqIGEgbmV3IEJ1bmRsZSBpZiB0aGVyZSBjdXJyZW50bHkgaXNuJ3Qgb25lLiAgWW91IGNhbiB1c2UgdGhpcyB0byBnZXQgYW5kCisgICAgICogc2V0IGluZGl2aWR1YWwgZXh0cmEga2V5L3ZhbHVlIHBhaXJzLgorICAgICAqLworICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgeworICAgICAgICBpZiAobUV4dHJhcyA9PSBudWxsKSB7CisgICAgICAgICAgICBtRXh0cmFzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRXh0cmFzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXh0cmFzIEJ1bmRsZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJlZmVyZW5jZSwKKyAgICAgKiByZXR1cm5pbmcgbnVsbCBpZiB0aGVyZSBpcyBub3QgY3VycmVudGx5IG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVuZGxlIHBlZWtFeHRyYXMoKSB7CisgICAgICAgIHJldHVybiBtRXh0cmFzOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldHMgdGhlIGxheW91dCByZXNvdXJjZSB0aGF0IGlzIGluZmxhdGVkIGFzIHRoZSB7QGxpbmsgVmlld30gdG8gYmUgc2hvd24KICAgICAgKiBmb3IgdGhpcyBQcmVmZXJlbmNlLiBJbiBtb3N0IGNhc2VzLCB0aGUgZGVmYXVsdCBsYXlvdXQgaXMgc3VmZmljaWVudCBmb3IKICAgICAgKiBjdXN0b20gUHJlZmVyZW5jZSBvYmplY3RzIGFuZCBvbmx5IHRoZSB3aWRnZXQgbGF5b3V0IG5lZWRzIHRvIGJlIGNoYW5nZWQuCkBAIC0xMjUwLDYgKzEyOTcsNjEgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCisgICAgICogQXR0ZW1wdHMgdG8gcGVyc2lzdCBhIHNldCBvZiBTdHJpbmdzIHRvIHRoZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHdpbGwgY2hlY2sgaWYgdGhpcyBQcmVmZXJlbmNlIGlzIHBlcnNpc3RlbnQsIGdldCBhbiBlZGl0b3IgZnJvbQorICAgICAqIHRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9LCBwdXQgaW4gdGhlIHN0cmluZ3MsIGFuZCBjaGVjayBpZiB3ZSBzaG91bGQgY29tbWl0IChhbmQKKyAgICAgKiBjb21taXQgaWYgc28pLgorICAgICAqIAorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBwZXJzaXN0LgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgUHJlZmVyZW5jZSBpcyBwZXJzaXN0ZW50LiAoVGhpcyBpcyBub3Qgd2hldGhlciB0aGUKKyAgICAgKiAgICAgICAgIHZhbHVlIHdhcyBwZXJzaXN0ZWQsIHNpbmNlIHdlIG1heSBub3QgbmVjZXNzYXJpbHkgY29tbWl0IGlmIHRoZXJlCisgICAgICogICAgICAgICB3aWxsIGJlIGEgYmF0Y2ggY29tbWl0IGxhdGVyLikKKyAgICAgKiBAc2VlICNnZXRQZXJzaXN0ZWRTdHJpbmcoU2V0KQorICAgICAqIAorICAgICAqIEBoaWRlIFBlbmRpbmcgQVBJIGFwcHJvdmFsCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcGVyc2lzdFN0cmluZ1NldChTZXQ8U3RyaW5nPiB2YWx1ZXMpIHsKKyAgICAgICAgaWYgKHNob3VsZFBlcnNpc3QoKSkgeworICAgICAgICAgICAgLy8gU2hvdWxkbid0IHN0b3JlIG51bGwKKyAgICAgICAgICAgIGlmICh2YWx1ZXMuZXF1YWxzKGdldFBlcnNpc3RlZFN0cmluZ1NldChudWxsKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBJdCdzIGFscmVhZHkgdGhlcmUsIHNvIHRoZSBzYW1lIGFzIHBlcnNpc3RpbmcKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yIGVkaXRvciA9IG1QcmVmZXJlbmNlTWFuYWdlci5nZXRFZGl0b3IoKTsKKyAgICAgICAgICAgIGVkaXRvci5wdXRTdHJpbmdTZXQobUtleSwgdmFsdWVzKTsKKyAgICAgICAgICAgIHRyeUNvbW1pdChlZGl0b3IpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGVtcHRzIHRvIGdldCBhIHBlcnNpc3RlZCBzZXQgb2YgU3RyaW5ncyBmcm9tIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXN9LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgd2lsbCBjaGVjayBpZiB0aGlzIFByZWZlcmVuY2UgaXMgcGVyc2lzdGVudCwgZ2V0IHRoZSBTaGFyZWRQcmVmZXJlbmNlcworICAgICAqIGZyb20gdGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0sIGFuZCBnZXQgdGhlIHZhbHVlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkZWZhdWx0UmV0dXJuVmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIGVpdGhlciB0aGUKKyAgICAgKiAgICAgICAgICAgIFByZWZlcmVuY2UgaXMgbm90IHBlcnNpc3RlbnQgb3IgdGhlIFByZWZlcmVuY2UgaXMgbm90IGluIHRoZQorICAgICAqICAgICAgICAgICAgc2hhcmVkIHByZWZlcmVuY2VzLgorICAgICAqIEByZXR1cm4gVGhlIHZhbHVlIGZyb20gdGhlIFNoYXJlZFByZWZlcmVuY2VzIG9yIHRoZSBkZWZhdWx0IHJldHVybgorICAgICAqICAgICAgICAgdmFsdWUuCisgICAgICogQHNlZSAjcGVyc2lzdFN0cmluZ1NldChTZXQpCisgICAgICogCisgICAgICogQGhpZGUgUGVuZGluZyBBUEkgYXBwcm92YWwKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZ2V0UGVyc2lzdGVkU3RyaW5nU2V0KFNldDxTdHJpbmc+IGRlZmF1bHRSZXR1cm5WYWx1ZSkgeworICAgICAgICBpZiAoIXNob3VsZFBlcnNpc3QoKSkgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRSZXR1cm5WYWx1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlci5nZXRTaGFyZWRQcmVmZXJlbmNlcygpLmdldFN0cmluZ1NldChtS2V5LCBkZWZhdWx0UmV0dXJuVmFsdWUpOworICAgIH0KKyAgICAKKyAgICAvKioKICAgICAgKiBBdHRlbXB0cyB0byBwZXJzaXN0IGFuIGludCB0byB0aGUge0BsaW5rIGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlc30uCiAgICAgICogCiAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBwZXJzaXN0LgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlQWN0aXZpdHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUFjdGl2aXR5LmphdmEKaW5kZXggNzI2NzkzZC4uNDg4OWMxOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlQWN0aXZpdHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VBY3Rpdml0eS5qYXZhCkBAIC0xNiwxMzUgKzE2LDYzMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJlZmVyZW5jZTsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuWG1sVXRpbHM7CisKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKIGltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCi0gKiBTaG93cyBhIGhpZXJhcmNoeSBvZiB7QGxpbmsgUHJlZmVyZW5jZX0gb2JqZWN0cyBhcwotICogbGlzdHMsIHBvc3NpYmx5IHNwYW5uaW5nIG11bHRpcGxlIHNjcmVlbnMuIFRoZXNlIHByZWZlcmVuY2VzIHdpbGwKLSAqIGF1dG9tYXRpY2FsbHkgc2F2ZSB0byB7QGxpbmsgU2hhcmVkUHJlZmVyZW5jZXN9IGFzIHRoZSB1c2VyIGludGVyYWN0cyB3aXRoCi0gKiB0aGVtLiBUbyByZXRyaWV2ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU2hhcmVkUHJlZmVyZW5jZXN9IHRoYXQgdGhlCi0gKiBwcmVmZXJlbmNlIGhpZXJhcmNoeSBpbiB0aGlzIGFjdGl2aXR5IHdpbGwgdXNlLCBjYWxsCi0gKiB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXIjZ2V0RGVmYXVsdFNoYXJlZFByZWZlcmVuY2VzKGFuZHJvaWQuY29udGVudC5Db250ZXh0KX0KLSAqIHdpdGggYSBjb250ZXh0IGluIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhpcyBhY3Rpdml0eS4KLSAqIDxwPgotICogRnVydGhlcm1vcmUsIHRoZSBwcmVmZXJlbmNlcyBzaG93biB3aWxsIGZvbGxvdyB0aGUgdmlzdWFsIHN0eWxlIG9mIHN5c3RlbQotICogcHJlZmVyZW5jZXMuIEl0IGlzIGVhc3kgdG8gY3JlYXRlIGEgaGllcmFyY2h5IG9mIHByZWZlcmVuY2VzICh0aGF0IGNhbiBiZQotICogc2hvd24gb24gbXVsdGlwbGUgc2NyZWVucykgdmlhIFhNTC4gRm9yIHRoZXNlIHJlYXNvbnMsIGl0IGlzIHJlY29tbWVuZGVkIHRvCi0gKiB1c2UgdGhpcyBhY3Rpdml0eSAoYXMgYSBzdXBlcmNsYXNzKSB0byBkZWFsIHdpdGggcHJlZmVyZW5jZXMgaW4gYXBwbGljYXRpb25zLgotICogPHA+Ci0gKiBBIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBvYmplY3Qgc2hvdWxkIGJlIGF0IHRoZSB0b3Agb2YgdGhlIHByZWZlcmVuY2UKLSAqIGhpZXJhcmNoeS4gRnVydGhlcm1vcmUsIHN1YnNlcXVlbnQge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IGluIHRoZSBoaWVyYXJjaHkKLSAqIGRlbm90ZSBhIHNjcmVlbiBicmVhay0tdGhhdCBpcyB0aGUgcHJlZmVyZW5jZXMgY29udGFpbmVkIHdpdGhpbiBzdWJzZXF1ZW50Ci0gKiB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gc2hvdWxkIGJlIHNob3duIG9uIGFub3RoZXIgc2NyZWVuLiBUaGUgcHJlZmVyZW5jZQotICogZnJhbWV3b3JrIGhhbmRsZXMgc2hvd2luZyB0aGVzZSBvdGhlciBzY3JlZW5zIGZyb20gdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5LgotICogPHA+Ci0gKiBUaGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgY2FuIGJlIGZvcm1lZCBpbiBtdWx0aXBsZSB3YXlzOgotICogPGxpPiBGcm9tIGFuIFhNTCBmaWxlIHNwZWNpZnlpbmcgdGhlIGhpZXJhcmNoeQotICogPGxpPiBGcm9tIGRpZmZlcmVudCB7QGxpbmsgQWN0aXZpdHkgQWN0aXZpdGllc30gdGhhdCBlYWNoIHNwZWNpZnkgaXRzIG93bgotICogcHJlZmVyZW5jZXMgaW4gYW4gWE1MIGZpbGUgdmlhIHtAbGluayBBY3Rpdml0eX0gbWV0YS1kYXRhCi0gKiA8bGk+IEZyb20gYW4gb2JqZWN0IGhpZXJhcmNoeSByb290ZWQgd2l0aCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0KLSAqIDxwPgotICogVG8gaW5mbGF0ZSBmcm9tIFhNTCwgdXNlIHRoZSB7QGxpbmsgI2FkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKGludCl9LiBUaGUKLSAqIHJvb3QgZWxlbWVudCBzaG91bGQgYmUgYSB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0uIFN1YnNlcXVlbnQgZWxlbWVudHMgY2FuIHBvaW50Ci0gKiB0byBhY3R1YWwge0BsaW5rIFByZWZlcmVuY2V9IHN1YmNsYXNzZXMuIEFzIG1lbnRpb25lZCBhYm92ZSwgc3Vic2VxdWVudAotICoge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IGluIHRoZSBoaWVyYXJjaHkgd2lsbCByZXN1bHQgaW4gdGhlIHNjcmVlbiBicmVhay4KLSAqIDxwPgotICogVG8gc3BlY2lmeSBhbiB7QGxpbmsgSW50ZW50fSB0byBxdWVyeSB7QGxpbmsgQWN0aXZpdHkgQWN0aXZpdGllc30gdGhhdCBlYWNoCi0gKiBoYXZlIHByZWZlcmVuY2VzLCB1c2Uge0BsaW5rICNhZGRQcmVmZXJlbmNlc0Zyb21JbnRlbnR9LiBFYWNoCi0gKiB7QGxpbmsgQWN0aXZpdHl9IGNhbiBzcGVjaWZ5IG1ldGEtZGF0YSBpbiB0aGUgbWFuaWZlc3QgKHZpYSB0aGUga2V5Ci0gKiB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXIjTUVUQURBVEFfS0VZX1BSRUZFUkVOQ0VTfSkgdGhhdCBwb2ludHMgdG8gYW4gWE1MCi0gKiByZXNvdXJjZS4gVGhlc2UgWE1MIHJlc291cmNlcyB3aWxsIGJlIGluZmxhdGVkIGludG8gYSBzaW5nbGUgcHJlZmVyZW5jZQotICogaGllcmFyY2h5IGFuZCBzaG93biBieSB0aGlzIGFjdGl2aXR5LgotICogPHA+Ci0gKiBUbyBzcGVjaWZ5IGFuIG9iamVjdCBoaWVyYXJjaHkgcm9vdGVkIHdpdGgge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59LCB1c2UKLSAqIHtAbGluayAjc2V0UHJlZmVyZW5jZVNjcmVlbihQcmVmZXJlbmNlU2NyZWVuKX0uCi0gKiA8cD4KLSAqIEFzIGEgY29udmVuaWVuY2UsIHRoaXMgYWN0aXZpdHkgaW1wbGVtZW50cyBhIGNsaWNrIGxpc3RlbmVyIGZvciBhbnkKLSAqIHByZWZlcmVuY2UgaW4gdGhlIGN1cnJlbnQgaGllcmFyY2h5LCBzZWUKLSAqIHtAbGluayAjb25QcmVmZXJlbmNlVHJlZUNsaWNrKFByZWZlcmVuY2VTY3JlZW4sIFByZWZlcmVuY2UpfS4KLSAqIAotICogQHNlZSBQcmVmZXJlbmNlCi0gKiBAc2VlIFByZWZlcmVuY2VTY3JlZW4KKyAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFuIGFjdGl2aXR5IHRvIHNob3cgYSBoaWVyYXJjaHkgb2YgcHJlZmVyZW5jZXMKKyAqIHRvIHRoZSB1c2VyLiAgUHJpb3IgdG8ge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJ9CisgKiB0aGlzIGNsYXNzIG9ubHkgYWxsb3dlZCB0aGUgZGlzcGxheSBvZiBhIHNpbmdsZSBzZXQgb2YgcHJlZmVyZW5jZTsgdGhpcworICogZnVuY3Rpb25hbGl0eSBzaG91bGQgbm93IGJlIGZvdW5kIGluIHRoZSBuZXcge0BsaW5rIFByZWZlcmVuY2VGcmFnbWVudH0KKyAqIGNsYXNzLiAgSWYgeW91IGFyZSB1c2luZyBQcmVmZXJlbmNlQWN0aXZpdHkgaW4gaXRzIG9sZCBtb2RlLCB0aGUgZG9jdW1lbnRhdGlvbgorICogdGhlcmUgYXBwbGllcyB0byB0aGUgZGVwcmVjYXRlZCBBUElzIGhlcmUuCisgKgorICogPHA+VGhpcyBhY3Rpdml0eSBzaG93cyBvbmUgb3IgbW9yZSBoZWFkZXJzIG9mIHByZWZlcmVuY2VzLCBlYWNoIG9mIHdpdGgKKyAqIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHtAbGluayBQcmVmZXJlbmNlRnJhZ21lbnR9IHRvIGRpc3BsYXkgdGhlIHByZWZlcmVuY2VzCisgKiBvZiB0aGF0IGhlYWRlci4gIFRoZSBhY3R1YWwgbGF5b3V0IGFuZCBkaXNwbGF5IG9mIHRoZXNlIGFzc29jaWF0aW9ucyBjYW4KKyAqIGhvd2V2ZXIgdmFyeTsgY3VycmVudGx5IHRoZXJlIGFyZSB0d28gbWFqb3IgYXBwcm9hY2hlcyBpdCBtYXkgdGFrZToKKyAqCisgKiA8dWw+CisgKiA8bGk+T24gYSBzbWFsbCBzY3JlZW4gaXQgbWF5IGRpc3BsYXkgb25seSB0aGUgaGVhZGVycyBhcyBhIHNpbmdsZSBsaXN0CisgKiB3aGVuIGZpcnN0IGxhdW5jaGVkLiAgU2VsZWN0aW5nIG9uZSBvZiB0aGUgaGVhZGVyIGl0ZW1zIHdpbGwgcmUtbGF1bmNoCisgKiB0aGUgYWN0aXZpdHkgd2l0aCBpdCBvbmx5IHNob3dpbmcgdGhlIFByZWZlcmVuY2VGcmFnbWVudCBvZiB0aGF0IGhlYWRlci4KKyAqIDxsaT5PbiBhIGxhcmdlIHNjcmVlbiBpbiBtYXkgZGlzcGxheSBib3RoIHRoZSBoZWFkZXJzIGFuZCBjdXJyZW50CisgKiBQcmVmZXJlbmNlRnJhZ21lbnQgdG9nZXRoZXIgYXMgcGFuZXMuICBTZWxlY3RpbmcgYSBoZWFkZXIgaXRlbSBzd2l0Y2hlcworICogdG8gc2hvd2luZyB0aGUgY29ycmVjdCBQcmVmZXJlbmNlRnJhZ21lbnQgZm9yIHRoYXQgaXRlbS4KKyAqIDwvdWw+CisgKgorICogPHA+U3ViY2xhc3NlcyBvZiBQcmVmZXJlbmNlQWN0aXZpdHkgc2hvdWxkIGltcGxlbWVudAorICoge0BsaW5rICNvbkJ1aWxkSGVhZGVyc30gdG8gcG9wdWxhdGUgdGhlIGhlYWRlciBsaXN0IHdpdGggdGhlIGRlc2lyZWQKKyAqIGl0ZW1zLiAgRG9pbmcgdGhpcyBpbXBsaWNpdGx5IHN3aXRjaGVzIHRoZSBjbGFzcyBpbnRvIGl0cyBuZXcgImhlYWRlcnMKKyAqICsgZnJhZ21lbnRzIiBtb2RlIHJhdGhlciB0aGFuIHRoZSBvbGQgc3R5bGUgb2YganVzdCBzaG93aW5nIGEgc2luZ2xlCisgKiBwcmVmZXJlbmNlcyBsaXN0LgorICoKKyAqIDxhIG5hbWU9IlNhbXBsZUNvZGUiPjwvYT4KKyAqIDxoMz5TYW1wbGUgQ29kZTwvaDM+CisgKgorICogPHA+VGhlIGZvbGxvd2luZyBzYW1wbGUgY29kZSBzaG93cyBhIHNpbXBsZSBwcmVmZXJlbmNlIGFjdGl2aXR5IHRoYXQKKyAqIGhhcyB0d28gZGlmZmVyZW50IHNldHMgb2YgcHJlZmVyZW5jZXMuICBUaGUgaW1wbGVtZW50YXRpb24sIGNvbnNpc3RpbmcKKyAqIG9mIHRoZSBhY3Rpdml0eSBpdHNlbGYgYXMgd2VsbCBhcyBpdHMgdHdvIHByZWZlcmVuY2UgZnJhZ21lbnRzIGlzOjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9QcmVmZXJlbmNlV2l0aEhlYWRlcnMuamF2YQorICogICAgICBhY3Rpdml0eX0KKyAqCisgKiA8cD5UaGUgcHJlZmVyZW5jZV9oZWFkZXJzIHJlc291cmNlIGRlc2NyaWJlcyB0aGUgaGVhZGVycyB0byBiZSBkaXNwbGF5ZWQKKyAqIGFuZCB0aGUgZnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGVtLiAgSXQgaXM6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL3ByZWZlcmVuY2VfaGVhZGVycy54bWwgaGVhZGVyc30KKyAqCisgKiA8cD5UaGUgZmlyc3QgaGVhZGVyIGlzIHNob3duIGJ5IFByZWZzMUZyYWdtZW50LCB3aGljaCBwb3B1bGF0ZXMgaXRzZWxmCisgKiBmcm9tIHRoZSBmb2xsb3dpbmcgWE1MIHJlc291cmNlOjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvZnJhZ21lbnRlZF9wcmVmZXJlbmNlcy54bWwgcHJlZmVyZW5jZXN9CisgKgorICogPHA+Tm90ZSB0aGF0IHRoaXMgWE1MIHJlc291cmNlIGNvbnRhaW5zIGEgcHJlZmVyZW5jZSBzY3JlZW4gaG9sZGluZyBhbm90aGVyCisgKiBmcmFnbWVudCwgdGhlIFByZWZzMUZyYWdtZW50SW5uZXIgaW1wbGVtZW50ZWQgaGVyZS4gIFRoaXMgYWxsb3dzIHRoZSB1c2VyCisgKiB0byB0cmF2ZXJzZSBkb3duIGEgaGllcmFyY2h5IG9mIHByZWZlcmVuY2VzOyBwcmVzc2luZyBiYWNrIHdpbGwgcG9wIGVhY2gKKyAqIGZyYWdtZW50IG9mZiB0aGUgc3RhY2sgdG8gcmV0dXJuIHRvIHRoZSBwcmV2aW91cyBwcmVmZXJlbmNlcy4KKyAqCisgKiA8cD5TZWUge0BsaW5rIFByZWZlcmVuY2VGcmFnbWVudH0gZm9yIGluZm9ybWF0aW9uIG9uIGltcGxlbWVudGluZyB0aGUKKyAqIGZyYWdtZW50cyB0aGVtc2VsdmVzLgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJlZmVyZW5jZUFjdGl2aXR5IGV4dGVuZHMgTGlzdEFjdGl2aXR5IGltcGxlbWVudHMKLSAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIuT25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIgewotICAgIAorICAgICAgICBQcmVmZXJlbmNlTWFuYWdlci5PblByZWZlcmVuY2VUcmVlQ2xpY2tMaXN0ZW5lciwKKyAgICAgICAgUHJlZmVyZW5jZUZyYWdtZW50Lk9uUHJlZmVyZW5jZVN0YXJ0RnJhZ21lbnRDYWxsYmFjayB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJQcmVmZXJlbmNlQWN0aXZpdHkiOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VTX1RBRyA9ICJhbmRyb2lkOnByZWZlcmVuY2VzIjsKLSAgICAKKworICAgIC8qKgorICAgICAqIFdoZW4gc3RhcnRpbmcgdGhpcyBhY3Rpdml0eSwgdGhlIGludm9raW5nIEludGVudCBjYW4gY29udGFpbiB0aGlzIGV4dHJhCisgICAgICogc3RyaW5nIHRvIHNwZWNpZnkgd2hpY2ggZnJhZ21lbnQgc2hvdWxkIGJlIGluaXRpYWxseSBkaXNwbGF5ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0hPV19GUkFHTUVOVCA9ICI6YW5kcm9pZDpzaG93X2ZyYWdtZW50IjsKKworICAgIC8qKgorICAgICAqIFdoZW4gc3RhcnRpbmcgdGhpcyBhY3Rpdml0eSBhbmQgdXNpbmcge0BsaW5rICNFWFRSQV9TSE9XX0ZSQUdNRU5UfSwKKyAgICAgKiB0aGlzIGV4dHJhIGNhbiBhbHNvIGJlIHNwZWNpZnkgdG8gc3VwcGx5IGEgQnVuZGxlIG9mIGFyZ3VtZW50cyB0byBwYXNzCisgICAgICogdG8gdGhhdCBmcmFnbWVudCB3aGVuIGl0IGlzIGluc3RhbnRpYXRlZCBkdXJpbmcgdGhlIGluaXRpYWwgY3JlYXRpb24KKyAgICAgKiBvZiBQcmVmZXJlbmNlQWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0hPV19GUkFHTUVOVF9BUkdVTUVOVFMgPSAiOmFuZHJvaWQ6c2hvd19mcmFnbWVudF9hcmdzIjsKKworICAgIC8qKgorICAgICAqIFdoZW4gc3RhcnRpbmcgdGhpcyBhY3Rpdml0eSwgdGhlIGludm9raW5nIEludGVudCBjYW4gY29udGFpbiB0aGlzIGV4dHJhCisgICAgICogYm9vbGVhbiB0aGF0IHRoZSBoZWFkZXIgbGlzdCBzaG91bGQgbm90IGJlIGRpc3BsYXllZC4gIFRoaXMgaXMgbW9zdCBvZnRlbgorICAgICAqIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB7QGxpbmsgI0VYVFJBX1NIT1dfRlJBR01FTlR9IHRvIGxhdW5jaAorICAgICAqIHRoZSBhY3Rpdml0eSB0byBkaXNwbGF5IGEgc3BlY2lmaWMgZnJhZ21lbnQgdGhhdCB0aGUgdXNlciBoYXMgbmF2aWdhdGVkCisgICAgICogdG8uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTk9fSEVBREVSUyA9ICI6YW5kcm9pZDpub19oZWFkZXJzIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQUNLX1NUQUNLX1BSRUZTID0gIjphbmRyb2lkOnByZWZzIjsKKworICAgIC8vIGV4dHJhcyB0aGF0IGFsbG93IGFueSBwcmVmZXJlbmNlIGFjdGl2aXR5IHRvIGJlIGxhdW5jaGVkIGFzIHBhcnQgb2YgYSB3aXphcmQKKworICAgIC8vIHNob3cgQmFjayBhbmQgTmV4dCBidXR0b25zPyB0YWtlcyBib29sZWFuIHBhcmFtZXRlcgorICAgIC8vIEJhY2sgd2lsbCB0aGVuIHJldHVybiBSRVNVTFRfQ0FOQ0VMRUQgYW5kIE5leHQgUkVTVUxUX09LCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BSRUZTX1NIT1dfQlVUVE9OX0JBUiA9ICJleHRyYV9wcmVmc19zaG93X2J1dHRvbl9iYXIiOworCisgICAgLy8gYWRkIGEgU2tpcCBidXR0b24/CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BSRUZTX1NIT1dfU0tJUCA9ICJleHRyYV9wcmVmc19zaG93X3NraXAiOworCisgICAgLy8gc3BlY2lmeSBjdXN0b20gdGV4dCBmb3IgdGhlIEJhY2sgb3IgTmV4dCBidXR0b25zLCBvciBjYXVzZSBhIGJ1dHRvbiB0byBub3QgYXBwZWFyCisgICAgLy8gYXQgYWxsIGJ5IHNldHRpbmcgaXQgdG8gbnVsbAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVGU19TRVRfTkVYVF9URVhUID0gImV4dHJhX3ByZWZzX3NldF9uZXh0X3RleHQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVGU19TRVRfQkFDS19URVhUID0gImV4dHJhX3ByZWZzX3NldF9iYWNrX3RleHQiOworCisgICAgLy8gLS0tIFN0YXRlIGZvciBuZXcgbW9kZSB3aGVuIHNob3dpbmcgYSBsaXN0IG9mIGhlYWRlcnMgKyBwcmVmcyBmcmFnbWVudAorCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SGVhZGVyPiBtSGVhZGVycyA9IG5ldyBBcnJheUxpc3Q8SGVhZGVyPigpOworCisgICAgcHJpdmF0ZSBIZWFkZXJBZGFwdGVyIG1BZGFwdGVyOworCisgICAgcHJpdmF0ZSBGcmFtZUxheW91dCBtTGlzdEZvb3RlcjsKKworICAgIHByaXZhdGUgVmlldyBtUHJlZnNDb250YWluZXI7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNpbmdsZVBhbmU7CisKKyAgICAvLyAtLS0gU3RhdGUgZm9yIG9sZCBtb2RlIHdoZW4gc2hvd2luZyBhIHNpbmdsZSBwcmVmZXJlbmNlIGxpc3QKKwogICAgIHByaXZhdGUgUHJlZmVyZW5jZU1hbmFnZXIgbVByZWZlcmVuY2VNYW5hZ2VyOwotICAgIAorCiAgICAgcHJpdmF0ZSBCdW5kbGUgbVNhdmVkSW5zdGFuY2VTdGF0ZTsKIAorICAgIC8vIC0tLSBDb21tb24gc3RhdGUKKworICAgIHByaXZhdGUgQnV0dG9uIG1OZXh0QnV0dG9uOworCiAgICAgLyoqCiAgICAgICogVGhlIHN0YXJ0aW5nIHJlcXVlc3QgY29kZSBnaXZlbiBvdXQgdG8gcHJlZmVyZW5jZSBmcmFtZXdvcmsuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJUlNUX1JFUVVFU1RfQ09ERSA9IDEwMDsKLSAgICAKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQklORF9QUkVGRVJFTkNFUyA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19CVUlMRF9IRUFERVJTID0gMTsKICAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKICAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBjYXNlIE1TR19CSU5EX1BSRUZFUkVOQ0VTOgogICAgICAgICAgICAgICAgICAgICBiaW5kUHJlZmVyZW5jZXMoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQlVJTERfSEVBREVSUzoKKyAgICAgICAgICAgICAgICAgICAgb25CdWlsZEhlYWRlcnMobUhlYWRlcnMpOworICAgICAgICAgICAgICAgICAgICBtQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICAgICAgICAgICAgICBIZWFkZXIgaGVhZGVyID0gb25HZXROZXdIZWFkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsICYmIGhlYWRlci5mcmFnbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hUb0hlYWRlcihoZWFkZXIuZnJhZ21lbnQsIGhlYWRlci5mcmFnbWVudEFyZ3VtZW50cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9OwogCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSGVhZGVyQWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxIZWFkZXI+IHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSGVhZGVyVmlld0hvbGRlciB7CisgICAgICAgICAgICBJbWFnZVZpZXcgaWNvbjsKKyAgICAgICAgICAgIFRleHRWaWV3IHRpdGxlOworICAgICAgICAgICAgVGV4dFZpZXcgc3VtbWFyeTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgTGF5b3V0SW5mbGF0ZXIgbUluZmxhdGVyOworCisgICAgICAgIHB1YmxpYyBIZWFkZXJBZGFwdGVyKENvbnRleHQgY29udGV4dCwgTGlzdDxIZWFkZXI+IG9iamVjdHMpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIDAsIG9iamVjdHMpOworICAgICAgICAgICAgbUluZmxhdGVyID0gKExheW91dEluZmxhdGVyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgSGVhZGVyVmlld0hvbGRlciBob2xkZXI7CisgICAgICAgICAgICBWaWV3IHZpZXc7CisKKyAgICAgICAgICAgIGlmIChjb252ZXJ0VmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmlldyA9IG1JbmZsYXRlci5pbmZsYXRlKGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnByZWZlcmVuY2VfbGlzdF9pdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaG9sZGVyID0gbmV3IEhlYWRlclZpZXdIb2xkZXIoKTsKKyAgICAgICAgICAgICAgICBob2xkZXIuaWNvbiA9IChJbWFnZVZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuaWNvbik7CisgICAgICAgICAgICAgICAgaG9sZGVyLnRpdGxlID0gKFRleHRWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnRpdGxlKTsKKyAgICAgICAgICAgICAgICBob2xkZXIuc3VtbWFyeSA9IChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5zdW1tYXJ5KTsKKyAgICAgICAgICAgICAgICB2aWV3LnNldFRhZyhob2xkZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2aWV3ID0gY29udmVydFZpZXc7CisgICAgICAgICAgICAgICAgaG9sZGVyID0gKEhlYWRlclZpZXdIb2xkZXIpIHZpZXcuZ2V0VGFnKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFsbCB2aWV3IGZpZWxkcyBtdXN0IGJlIHVwZGF0ZWQgZXZlcnkgdGltZSwgYmVjYXVzZSB0aGUgdmlldyBtYXkgYmUgcmVjeWNsZWQgCisgICAgICAgICAgICBIZWFkZXIgaGVhZGVyID0gZ2V0SXRlbShwb3NpdGlvbik7CisgICAgICAgICAgICBpZiAoaGVhZGVyLmljb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhvbGRlci5pY29uLnNldEltYWdlRHJhd2FibGUobnVsbCk7CisgICAgICAgICAgICAgICAgaG9sZGVyLmljb24uc2V0SW1hZ2VSZXNvdXJjZShoZWFkZXIuaWNvblJlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhvbGRlci5pY29uLnNldEltYWdlUmVzb3VyY2UoMCk7CisgICAgICAgICAgICAgICAgaG9sZGVyLmljb24uc2V0SW1hZ2VEcmF3YWJsZShoZWFkZXIuaWNvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBob2xkZXIudGl0bGUuc2V0VGV4dChoZWFkZXIudGl0bGUpOworICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGhlYWRlci5zdW1tYXJ5KSkgeworICAgICAgICAgICAgICAgIGhvbGRlci5zdW1tYXJ5LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaG9sZGVyLnN1bW1hcnkuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgIGhvbGRlci5zdW1tYXJ5LnNldFRleHQoaGVhZGVyLnN1bW1hcnkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdmlldzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aW9uIG9mIGEgc2luZ2xlIEhlYWRlciBpdGVtIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhlYWRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaXRsZSBvZiB0aGUgaGVhZGVyIHRoYXQgaXMgc2hvd24gdG8gdGhlIHVzZXIuCisgICAgICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2VIZWFkZXJfdGl0bGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgdGl0bGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9wdGlvbmFsIHN1bW1hcnkgZGVzY3JpYmluZyB3aGF0IHRoaXMgaGVhZGVyIGNvbnRyb2xzLgorICAgICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlSGVhZGVyX3N1bW1hcnkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2Ugc3VtbWFyeTsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3B0aW9uYWwgaWNvbiByZXNvdXJjZSB0byBzaG93IGZvciB0aGlzIGhlYWRlci4KKyAgICAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZUhlYWRlcl9pY29uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGljb25SZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9wdGlvbmFsIGljb24gZHJhd2FibGUgdG8gc2hvdyBmb3IgdGhpcyBoZWFkZXIuICAoSWYgdGhpcyBpcyBub24tbnVsbCwKKyAgICAgICAgICogdGhlIGljb25SZXMgd2lsbCBiZSBpZ25vcmVkLikKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEcmF3YWJsZSBpY29uOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGdWxsIGNsYXNzIG5hbWUgb2YgdGhlIGZyYWdtZW50IHRvIGRpc3BsYXkgd2hlbiB0aGlzIGhlYWRlciBpcworICAgICAgICAgKiBzZWxlY3RlZC4KKyAgICAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZUhlYWRlcl9mcmFnbWVudAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBmcmFnbWVudDsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3B0aW9uYWwgYXJndW1lbnRzIHRvIHN1cHBseSB0byB0aGUgZnJhZ21lbnQgd2hlbiBpdCBpcworICAgICAgICAgKiBpbnN0YW50aWF0ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVuZGxlIGZyYWdtZW50QXJndW1lbnRzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnRlbnQgdG8gbGF1bmNoIHdoZW4gdGhlIHByZWZlcmVuY2UgaXMgc2VsZWN0ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSW50ZW50IGludGVudDsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CiAKICAgICAgICAgc2V0Q29udGVudFZpZXcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQucHJlZmVyZW5jZV9saXN0X2NvbnRlbnQpOwotICAgICAgICAKLSAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyID0gb25DcmVhdGVQcmVmZXJlbmNlTWFuYWdlcigpOworCisgICAgICAgIG1MaXN0Rm9vdGVyID0gKEZyYW1lTGF5b3V0KWZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmxpc3RfZm9vdGVyKTsKKyAgICAgICAgbVByZWZzQ29udGFpbmVyID0gZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQucHJlZnMpOworICAgICAgICBib29sZWFuIGhpZGluZ0hlYWRlcnMgPSBvbklzSGlkaW5nSGVhZGVycygpOworICAgICAgICBtU2luZ2xlUGFuZSA9IGhpZGluZ0hlYWRlcnMgfHwgIW9uSXNNdWx0aVBhbmUoKTsKKyAgICAgICAgU3RyaW5nIGluaXRpYWxGcmFnbWVudCA9IGdldEludGVudCgpLmdldFN0cmluZ0V4dHJhKEVYVFJBX1NIT1dfRlJBR01FTlQpOworICAgICAgICBCdW5kbGUgaW5pdGlhbEFyZ3VtZW50cyA9IGdldEludGVudCgpLmdldEJ1bmRsZUV4dHJhKEVYVFJBX1NIT1dfRlJBR01FTlRfQVJHVU1FTlRTKTsKKworICAgICAgICBpZiAoaW5pdGlhbEZyYWdtZW50ICE9IG51bGwgJiYgbVNpbmdsZVBhbmUpIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGFyZSBqdXN0IHNob3dpbmcgYSBmcmFnbWVudCwgd2Ugd2FudCB0byBydW4gaW4KKyAgICAgICAgICAgIC8vIG5ldyBmcmFnbWVudCBtb2RlLCBidXQgZG9uJ3QgbmVlZCB0byBjb21wdXRlIGFuZCBzaG93CisgICAgICAgICAgICAvLyB0aGUgaGVhZGVycy4KKyAgICAgICAgICAgIGdldExpc3RWaWV3KCkuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbVByZWZzQ29udGFpbmVyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIHN3aXRjaFRvSGVhZGVyKGluaXRpYWxGcmFnbWVudCwgaW5pdGlhbEFyZ3VtZW50cyk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gdHJ5IHRvIGJ1aWxkIHRoZSBoZWFkZXJzLgorICAgICAgICAgICAgb25CdWlsZEhlYWRlcnMobUhlYWRlcnMpOworCisgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgaGVhZGVycywgdGhlbiBhdCB0aGlzIHBvaW50IHdlIG5lZWQgdG8gc2hvdworICAgICAgICAgICAgLy8gdGhlbSBhbmQsIGRlcGVuZGluZyBvbiB0aGUgc2NyZWVuLCB3ZSBtYXkgYWxzbyBzaG93IGluLWxpbmUKKyAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcHJlZmVyZW5jZSBmcmFnbWVudC4KKyAgICAgICAgICAgIGlmIChtSGVhZGVycy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgbUFkYXB0ZXIgPSBuZXcgSGVhZGVyQWRhcHRlcih0aGlzLCBtSGVhZGVycyk7CisgICAgICAgICAgICAgICAgc2V0TGlzdEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICAgICAgICAgIGlmICghbVNpbmdsZVBhbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVByZWZzQ29udGFpbmVyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluaXRpYWxGcmFnbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXIgaCA9IG9uR2V0SW5pdGlhbEhlYWRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbEZyYWdtZW50ID0gaC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxBcmd1bWVudHMgPSBoLmZyYWdtZW50QXJndW1lbnRzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaFRvSGVhZGVyKGluaXRpYWxGcmFnbWVudCwgaW5pdGlhbEFyZ3VtZW50cyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gaGVhZGVycywgd2UgYXJlIGluIHRoZSBvbGQgImp1c3Qgc2hvdyBhIHNjcmVlbgorICAgICAgICAgICAgLy8gb2YgcHJlZmVyZW5jZXMiIG1vZGUuCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlciA9IG5ldyBQcmVmZXJlbmNlTWFuYWdlcih0aGlzLCBGSVJTVF9SRVFVRVNUX0NPREUpOworICAgICAgICAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5zZXRPblByZWZlcmVuY2VUcmVlQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGdldExpc3RWaWV3KCkuc2V0U2Nyb2xsQmFyU3R5bGUoVmlldy5TQ1JPTExCQVJTX0lOU0lERV9PVkVSTEFZKTsKKworICAgICAgICAvLyBzZWUgaWYgd2Ugc2hvdWxkIHNob3cgQmFjay9OZXh0IGJ1dHRvbnMKKyAgICAgICAgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOworICAgICAgICBpZiAoaW50ZW50LmdldEJvb2xlYW5FeHRyYShFWFRSQV9QUkVGU19TSE9XX0JVVFRPTl9CQVIsIGZhbHNlKSkgeworCisgICAgICAgICAgICBmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5idXR0b25fYmFyKS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisKKyAgICAgICAgICAgIEJ1dHRvbiBiYWNrQnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5iYWNrX2J1dHRvbik7CisgICAgICAgICAgICBiYWNrQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgIHNldFJlc3VsdChSRVNVTFRfQ0FOQ0VMRUQpOworICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIEJ1dHRvbiBza2lwQnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5za2lwX2J1dHRvbik7CisgICAgICAgICAgICBza2lwQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgIHNldFJlc3VsdChSRVNVTFRfT0spOworICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1OZXh0QnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5uZXh0X2J1dHRvbik7CisgICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICBzZXRSZXN1bHQoUkVTVUxUX09LKTsKKyAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8vIHNldCBvdXIgdmFyaW91cyBidXR0b24gcGFyYW1ldGVycworICAgICAgICAgICAgaWYgKGludGVudC5oYXNFeHRyYShFWFRSQV9QUkVGU19TRVRfTkVYVF9URVhUKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBidXR0b25UZXh0ID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKEVYVFJBX1BSRUZTX1NFVF9ORVhUX1RFWFQpOworICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShidXR0b25UZXh0KSkgeworICAgICAgICAgICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRUZXh0KGJ1dHRvblRleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbnRlbnQuaGFzRXh0cmEoRVhUUkFfUFJFRlNfU0VUX0JBQ0tfVEVYVCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShFWFRSQV9QUkVGU19TRVRfQkFDS19URVhUKTsKKyAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoYnV0dG9uVGV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYmFja0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBiYWNrQnV0dG9uLnNldFRleHQoYnV0dG9uVGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGludGVudC5nZXRCb29sZWFuRXh0cmEoRVhUUkFfUFJFRlNfU0hPV19TS0lQLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICBza2lwQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGFjdGl2aXR5IGlzIGN1cnJlbnRseSBzaG93aW5nIHRoZSBoZWFkZXIgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNIZWFkZXJzKCkgeworICAgICAgICByZXR1cm4gZ2V0TGlzdFZpZXcoKS5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFCisgICAgICAgICAgICAgICAgJiYgbVByZWZlcmVuY2VNYW5hZ2VyID09IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYWN0aXZpdHkgaXMgc2hvd2luZyBtdWx0aXBsZSBwYW5lcyAtLSB0aGUgaGVhZGVycworICAgICAqIGFuZCBhIHByZWZlcmVuY2UgZnJhZ21lbnQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNNdWx0aVBhbmUoKSB7CisgICAgICAgIHJldHVybiBoYXNIZWFkZXJzKCkgJiYgbVByZWZzQ29udGFpbmVyLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGRldGVybWluZSBpZiB0aGUgYWN0aXZpdHkgc2hvdWxkIHJ1biBpbiBtdWx0aS1wYW5lIG1vZGUuCisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBzY3JlZW4gaXMgbGFyZ2UKKyAgICAgKiBlbm91Z2guCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25Jc011bHRpUGFuZSgpIHsKKyAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGlmICgoY29uZmlnLnNjcmVlbkxheW91dCZDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX01BU0spCisgICAgICAgICAgICAgICAgPT0gQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9YTEFSR0UKKyAgICAgICAgICAgICAgICAmJiBjb25maWcub3JpZW50YXRpb24gPT0gQ29uZmlndXJhdGlvbi5PUklFTlRBVElPTl9MQU5EU0NBUEUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGhlYWRlciBsaXN0IHNob3VsZCBiZSBoaWRkZW4uCisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0aGUKKyAgICAgKiB2YWx1ZSBnaXZlbiBpbiB7QGxpbmsgI0VYVFJBX05PX0hFQURFUlN9IG9yIGZhbHNlIGlmIGl0IGlzIG5vdCBzdXBwbGllZC4KKyAgICAgKiBUaGlzIGlzIHNldCB0byBmYWxzZSwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIGFjdGl2aXR5IGlzIGJlaW5nIHJlLWxhdW5jaGVkCisgICAgICogdG8gc2hvdyBhIHBhcnRpY3VsYXIgcHJlZmVyZW5jZSBhY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbklzSGlkaW5nSGVhZGVycygpIHsKKyAgICAgICAgcmV0dXJuIGdldEludGVudCgpLmdldEJvb2xlYW5FeHRyYShFWFRSQV9OT19IRUFERVJTLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGRldGVybWluZSB0aGUgaW5pdGlhbCBoZWFkZXIgdG8gYmUgc2hvd24uICBUaGUgZGVmYXVsdAorICAgICAqIGltcGxlbWVudGF0aW9uIHNpbXBseSByZXR1cm5zIHRoZSBmcmFnbWVudCBvZiB0aGUgZmlyc3QgaGVhZGVyLiAgTm90ZQorICAgICAqIHRoYXQgdGhlIHJldHVybmVkIEhlYWRlciBvYmplY3QgZG9lcyBub3QgYWN0dWFsbHkgbmVlZCB0byBleGlzdCBpbgorICAgICAqIHlvdXIgaGVhZGVyIGxpc3QgLS0gd2hhdGV2ZXIgaXRzIGZyYWdtZW50IGlzIHdpbGwgc2ltcGx5IGJlIHVzZWQgdG8KKyAgICAgKiBzaG93IGZvciB0aGUgaW5pdGlhbCBVSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSGVhZGVyIG9uR2V0SW5pdGlhbEhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1IZWFkZXJzLmdldCgwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGhlYWRlciBsaXN0IGhhcyBiZWVuIHVwZGF0ZWQgKHtAbGluayAjb25CdWlsZEhlYWRlcnN9CisgICAgICogaGFzIGJlZW4gY2FsbGVkIGFuZCByZXR1cm5lZCBkdWUgdG8ge0BsaW5rICNpbnZhbGlkYXRlSGVhZGVycygpfSkgdG8KKyAgICAgKiBzcGVjaWZ5IHRoZSBoZWFkZXIgdGhhdCBzaG91bGQgbm93IGJlIHNlbGVjdGVkLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgICAgKiByZXR1cm5zIG51bGwgdG8ga2VlcCB3aGF0ZXZlciBoZWFkZXIgaXMgY3VycmVudGx5IHNlbGVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBIZWFkZXIgb25HZXROZXdIZWFkZXIoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBuZWVkcyBpdHMgbGlzdCBvZiBoZWFkZXJzIGJ1aWxkLiAgQnkKKyAgICAgKiBpbXBsZW1lbnRpbmcgdGhpcyBhbmQgYWRkaW5nIGF0IGxlYXN0IG9uZSBpdGVtIHRvIHRoZSBsaXN0LCB5b3UKKyAgICAgKiB3aWxsIGNhdXNlIHRoZSBhY3Rpdml0eSB0byBydW4gaW4gaXRzIG1vZGVybiBmcmFnbWVudCBtb2RlLiAgTm90ZQorICAgICAqIHRoYXQgdGhpcyBmdW5jdGlvbiBtYXkgbm90IGFsd2F5cyBiZSBjYWxsZWQ7IGZvciBleGFtcGxlLCBpZiB0aGUKKyAgICAgKiBhY3Rpdml0eSBoYXMgYmVlbiBhc2tlZCB0byBkaXNwbGF5IGEgcGFydGljdWxhciBmcmFnbWVudCB3aXRob3V0CisgICAgICogdGhlIGhlYWRlciBsaXN0LCB0aGVyZSBpcyBubyBuZWVkIHRvIGJ1aWxkIHRoZSBoZWFkZXJzLgorICAgICAqCisgICAgICogPHA+VHlwaWNhbCBpbXBsZW1lbnRhdGlvbnMgd2lsbCB1c2Uge0BsaW5rICNsb2FkSGVhZGVyc0Zyb21SZXNvdXJjZX0KKyAgICAgKiB0byBmaWxsIGluIHRoZSBsaXN0IGZyb20gYSByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIGxpc3QgaW4gd2hpY2ggdG8gcGxhY2UgdGhlIGhlYWRlcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25CdWlsZEhlYWRlcnMoTGlzdDxIZWFkZXI+IHRhcmdldCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgd2hlbiB5b3UgbmVlZCB0byBjaGFuZ2UgdGhlIGhlYWRlcnMgYmVpbmcgZGlzcGxheWVkLiAgV2lsbCByZXN1bHQKKyAgICAgKiBpbiBvbkJ1aWxkSGVhZGVycygpIGxhdGVyIGJlaW5nIGNhbGxlZCB0byByZXRyaWV2ZSB0aGUgbmV3IGxpc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZUhlYWRlcnMoKSB7CisgICAgICAgIGlmICghbUhhbmRsZXIuaGFzTWVzc2FnZXMoTVNHX0JVSUxEX0hFQURFUlMpKSB7CisgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19CVUlMRF9IRUFERVJTKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBnaXZlbiBYTUwgZmlsZSBhcyBhIGhlYWRlciBkZXNjcmlwdGlvbiwgYWRkaW5nIGVhY2gKKyAgICAgKiBwYXJzZWQgSGVhZGVyIGludG8gdGhlIHRhcmdldCBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc2lkIFRoZSBYTUwgcmVzb3VyY2UgdG8gbG9hZCBhbmQgcGFyc2UuCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgbGlzdCBpbiB3aGljaCB0aGUgcGFyc2VkIGhlYWRlcnMgc2hvdWxkIGJlIHBsYWNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkSGVhZGVyc0Zyb21SZXNvdXJjZShpbnQgcmVzaWQsIExpc3Q8SGVhZGVyPiB0YXJnZXQpIHsKKyAgICAgICAgWG1sUmVzb3VyY2VQYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlciA9IGdldFJlc291cmNlcygpLmdldFhtbChyZXNpZCk7CisgICAgICAgICAgICBBdHRyaWJ1dGVTZXQgYXR0cnMgPSBYbWwuYXNBdHRyaWJ1dGVTZXQocGFyc2VyKTsKKworICAgICAgICAgICAgaW50IHR5cGU7CisgICAgICAgICAgICB3aGlsZSAoKHR5cGU9cGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQKKyAgICAgICAgICAgICAgICAgICAgJiYgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKCEicHJlZmVyZW5jZS1oZWFkZXJzIi5lcXVhbHMobm9kZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiWE1MIGRvY3VtZW50IG11c3Qgc3RhcnQgd2l0aCA8cHJlZmVyZW5jZS1oZWFkZXJzPiB0YWc7IGZvdW5kIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBub2RlTmFtZSArICIgYXQgIiArIHBhcnNlci5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBCdW5kbGUgY3VyQnVuZGxlID0gbnVsbDsKKworICAgICAgICAgICAgZmluYWwgaW50IG91dGVyRGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKKyAgICAgICAgICAgIHdoaWxlICgodHlwZT1wYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVAorICAgICAgICAgICAgICAgICAgICYmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCBwYXJzZXIuZ2V0RGVwdGgoKSA+IG91dGVyRGVwdGgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHR5cGUgPT0gWG1sUHVsbFBhcnNlci5URVhUKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoImhlYWRlciIuZXF1YWxzKG5vZGVOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBIZWFkZXIgaGVhZGVyID0gbmV3IEhlYWRlcigpOworCisgICAgICAgICAgICAgICAgICAgIFR5cGVkQXJyYXkgc2EgPSBnZXRSZXNvdXJjZXMoKS5vYnRhaW5BdHRyaWJ1dGVzKGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByZWZlcmVuY2VIZWFkZXIpOworICAgICAgICAgICAgICAgICAgICBoZWFkZXIudGl0bGUgPSBzYS5nZXRUZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByZWZlcmVuY2VIZWFkZXJfdGl0bGUpOworICAgICAgICAgICAgICAgICAgICBoZWFkZXIuc3VtbWFyeSA9IHNhLmdldFRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJlZmVyZW5jZUhlYWRlcl9zdW1tYXJ5KTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmljb25SZXMgPSBzYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByZWZlcmVuY2VIZWFkZXJfaWNvbiwgMCk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlci5mcmFnbWVudCA9IHNhLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyX2ZyYWdtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgc2EucmVjeWNsZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJCdW5kbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VyQnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGlubmVyRGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCh0eXBlPXBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBpbm5lckRlcHRoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHR5cGUgPT0gWG1sUHVsbFBhcnNlci5URVhUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbm5lck5vZGVOYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbm5lck5vZGVOYW1lLmVxdWFscygiZXh0cmEiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlc291cmNlcygpLnBhcnNlQnVuZGxlRXh0cmEoImV4dHJhIiwgYXR0cnMsIGN1ckJ1bmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sVXRpbHMuc2tpcEN1cnJlbnRUYWcocGFyc2VyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbm5lck5vZGVOYW1lLmVxdWFscygiaW50ZW50IikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIuaW50ZW50ID0gSW50ZW50LnBhcnNlSW50ZW50KGdldFJlc291cmNlcygpLCBwYXJzZXIsIGF0dHJzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxVdGlscy5za2lwQ3VycmVudFRhZyhwYXJzZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckJ1bmRsZS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIuZnJhZ21lbnRBcmd1bWVudHMgPSBjdXJCdW5kbGU7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJCdW5kbGUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZChoZWFkZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFhtbFV0aWxzLnNraXBDdXJyZW50VGFnKHBhcnNlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIHBhcnNpbmcgaGVhZGVycyIsIGUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBoZWFkZXJzIiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpIHBhcnNlci5jbG9zZSgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBmb290ZXIgdGhhdCBzaG91bGQgYmUgc2hvd24gYXQgdGhlIGJvdHRvbSBvZiB0aGUgaGVhZGVyIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGlzdEZvb3RlcihWaWV3IHZpZXcpIHsKKyAgICAgICAgbUxpc3RGb290ZXIucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgbUxpc3RGb290ZXIuYWRkVmlldyh2aWV3LCBuZXcgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU3RvcCgpIHsKICAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gICAgICAgIAotICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eVN0b3AoKTsKKworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaEFjdGl2aXR5U3RvcCgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25EZXN0cm95KCkgewogICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKLSAgICAgICAgCi0gICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaEFjdGl2aXR5RGVzdHJveSgpOworCisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlEZXN0cm95KCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgewogICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKIAotICAgICAgICBmaW5hbCBQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4gPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCk7Ci0gICAgICAgIGlmIChwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBjb250YWluZXIgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBwcmVmZXJlbmNlU2NyZWVuLnNhdmVIaWVyYXJjaHlTdGF0ZShjb250YWluZXIpOwotICAgICAgICAgICAgb3V0U3RhdGUucHV0QnVuZGxlKFBSRUZFUkVOQ0VTX1RBRywgY29udGFpbmVyKTsKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4gPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQnVuZGxlIGNvbnRhaW5lciA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICBwcmVmZXJlbmNlU2NyZWVuLnNhdmVIaWVyYXJjaHlTdGF0ZShjb250YWluZXIpOworICAgICAgICAgICAgICAgIG91dFN0YXRlLnB1dEJ1bmRsZShQUkVGRVJFTkNFU19UQUcsIGNvbnRhaW5lcik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBzdGF0ZSkgewotICAgICAgICBCdW5kbGUgY29udGFpbmVyID0gc3RhdGUuZ2V0QnVuZGxlKFBSRUZFUkVOQ0VTX1RBRyk7Ci0gICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOwotICAgICAgICAgICAgaWYgKHByZWZlcmVuY2VTY3JlZW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByZWZlcmVuY2VTY3JlZW4ucmVzdG9yZUhpZXJhcmNoeVN0YXRlKGNvbnRhaW5lcik7Ci0gICAgICAgICAgICAgICAgbVNhdmVkSW5zdGFuY2VTdGF0ZSA9IHN0YXRlOwotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBCdW5kbGUgY29udGFpbmVyID0gc3RhdGUuZ2V0QnVuZGxlKFBSRUZFUkVOQ0VTX1RBRyk7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4gPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgICAgICAgICAgICAgaWYgKHByZWZlcmVuY2VTY3JlZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwcmVmZXJlbmNlU2NyZWVuLnJlc3RvcmVIaWVyYXJjaHlTdGF0ZShjb250YWluZXIpOworICAgICAgICAgICAgICAgICAgICBtU2F2ZWRJbnN0YW5jZVN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTU2LDE0ICs2NTMsODkgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CiAgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOwotICAgICAgICAKLSAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOworCisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25Db250ZW50Q2hhbmdlZCgpIHsKICAgICAgICAgc3VwZXIub25Db250ZW50Q2hhbmdlZCgpOwotICAgICAgICBwb3N0QmluZFByZWZlcmVuY2VzKCk7CisKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBwb3N0QmluZFByZWZlcmVuY2VzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgc3VwZXIub25MaXN0SXRlbUNsaWNrKGwsIHYsIHBvc2l0aW9uLCBpZCk7CisKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG9uSGVhZGVyQ2xpY2sobUhlYWRlcnMuZ2V0KHBvc2l0aW9uKSwgcG9zaXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhbiBpdGVtIGluIHRoZSBoZWFkZXIgbGlzdC4gIFRoZSBkZWZhdWx0CisgICAgICogaW1wbGVtZW50YXRpb24gd2lsbCBjYWxsIGVpdGhlciB7QGxpbmsgI3N0YXJ0V2l0aEZyYWdtZW50KFN0cmluZywgQnVuZGxlKX0KKyAgICAgKiBvciB7QGxpbmsgI3N3aXRjaFRvSGVhZGVyKFN0cmluZywgQnVuZGxlKX0gYXMgYXBwcm9wcmlhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGVhZGVyIFRoZSBoZWFkZXIgdGhhdCB3YXMgc2VsZWN0ZWQuCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBoZWFkZXIncyBwb3NpdGlvbiBpbiB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkhlYWRlckNsaWNrKEhlYWRlciBoZWFkZXIsIGludCBwb3NpdGlvbikgeworICAgICAgICBpZiAoaGVhZGVyLmZyYWdtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtU2luZ2xlUGFuZSkgeworICAgICAgICAgICAgICAgIHN0YXJ0V2l0aEZyYWdtZW50KGhlYWRlci5mcmFnbWVudCwgaGVhZGVyLmZyYWdtZW50QXJndW1lbnRzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoVG9IZWFkZXIoaGVhZGVyLmZyYWdtZW50LCBoZWFkZXIuZnJhZ21lbnRBcmd1bWVudHMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGhlYWRlci5pbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShoZWFkZXIuaW50ZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgYWN0aXZpdHksIHNob3dpbmcgb25seSB0aGUgZ2l2ZW4KKyAgICAgKiBwcmVmZXJlbmNlIGZyYWdtZW50LiAgV2hlbiBsYXVuY2hlZCBpbiB0aGlzIG1vZGUsIHRoZSBoZWFkZXIgbGlzdAorICAgICAqIHdpbGwgYmUgaGlkZGVuIGFuZCB0aGUgZ2l2ZW4gcHJlZmVyZW5jZSBmcmFnbWVudCB3aWxsIGJlIGluc3RhbnRpYXRlZAorICAgICAqIGFuZCBmaWxsIHRoZSBlbnRpcmUgYWN0aXZpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnROYW1lIFRoZSBuYW1lIG9mIHRoZSBmcmFnbWVudCB0byBkaXNwbGF5LgorICAgICAqIEBwYXJhbSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBzdXBwbHkgdG8gdGhlIGZyYWdtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0V2l0aEZyYWdtZW50KFN0cmluZyBmcmFnbWVudE5hbWUsIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUFJTik7CisgICAgICAgIGludGVudC5zZXRDbGFzcyh0aGlzLCBnZXRDbGFzcygpKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX1NIT1dfRlJBR01FTlQsIGZyYWdtZW50TmFtZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShFWFRSQV9TSE9XX0ZSQUdNRU5UX0FSR1VNRU5UUywgYXJncyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShFWFRSQV9OT19IRUFERVJTLCB0cnVlKTsKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gaW4gdHdvLXBhbmUgbW9kZSwgc3dpdGNoIHRoZSBmcmFnbWVudCBwYW5lIHRvIHNob3cgdGhlIGdpdmVuCisgICAgICogcHJlZmVyZW5jZSBmcmFnbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFnbWVudE5hbWUgVGhlIG5hbWUgb2YgdGhlIGZyYWdtZW50IHRvIGRpc3BsYXkuCisgICAgICogQHBhcmFtIGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIHN1cHBseSB0byB0aGUgZnJhZ21lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3dpdGNoVG9IZWFkZXIoU3RyaW5nIGZyYWdtZW50TmFtZSwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgZ2V0RnJhZ21lbnRNYW5hZ2VyKCkucG9wQmFja1N0YWNrKEJBQ0tfU1RBQ0tfUFJFRlMsIFBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSk7CisKKyAgICAgICAgRnJhZ21lbnQgZiA9IEZyYWdtZW50Lmluc3RhbnRpYXRlKHRoaXMsIGZyYWdtZW50TmFtZSwgYXJncyk7CisgICAgICAgIGdldEZyYWdtZW50TWFuYWdlcigpLm9wZW5UcmFuc2FjdGlvbigpLnJlcGxhY2UoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5wcmVmcywgZikuY29tbWl0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudChQcmVmZXJlbmNlRnJhZ21lbnQgY2FsbGVyLCBQcmVmZXJlbmNlIHByZWYpIHsKKyAgICAgICAgRnJhZ21lbnQgZiA9IEZyYWdtZW50Lmluc3RhbnRpYXRlKHRoaXMsIHByZWYuZ2V0RnJhZ21lbnQoKSwgcHJlZi5nZXRFeHRyYXMoKSk7CisgICAgICAgIGdldEZyYWdtZW50TWFuYWdlcigpLm9wZW5UcmFuc2FjdGlvbigpLnJlcGxhY2UoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5wcmVmcywgZikKKyAgICAgICAgICAgICAgICAuYWRkVG9CYWNrU3RhY2soQkFDS19TVEFDS19QUkVGUykuY29tbWl0KCk7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTc2LDcgKzc0OCw3IEBACiAgICAgICAgIGlmIChtSGFuZGxlci5oYXNNZXNzYWdlcyhNU0dfQklORF9QUkVGRVJFTkNFUykpIHJldHVybjsKICAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQklORF9QUkVGRVJFTkNFUykuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSB2b2lkIGJpbmRQcmVmZXJlbmNlcygpIHsKICAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOwogICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CkBAIC0xODcsMzggKzc1OSw0MSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0uCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyfSB1c2VkIGJ5IHRoaXMgYWN0aXZpdHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBQcmVmZXJlbmNlTWFuYWdlciBvbkNyZWF0ZVByZWZlcmVuY2VNYW5hZ2VyKCkgewotICAgICAgICBQcmVmZXJlbmNlTWFuYWdlciBwcmVmZXJlbmNlTWFuYWdlciA9IG5ldyBQcmVmZXJlbmNlTWFuYWdlcih0aGlzLCBGSVJTVF9SRVFVRVNUX0NPREUpOwotICAgICAgICBwcmVmZXJlbmNlTWFuYWdlci5zZXRPblByZWZlcmVuY2VUcmVlQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgcmV0dXJuIHByZWZlcmVuY2VNYW5hZ2VyOwotICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0gdXNlZCBieSB0aGlzIGFjdGl2aXR5LgogICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0uCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWxldmFudCBmb3IgYSBtb2Rlcm4gZnJhZ21lbnQtYmFzZWQKKyAgICAgKiBQcmVmZXJlbmNlQWN0aXZpdHkuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgUHJlZmVyZW5jZU1hbmFnZXIgZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKSB7CiAgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXI7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSB2b2lkIHJlcXVpcmVQcmVmZXJlbmNlTWFuYWdlcigpIHsKICAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHN1cGVyLm9uQ3JlYXRlLiIpOworICAgICAgICAgICAgaWYgKG1BZGFwdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHN1cGVyLm9uQ3JlYXRlLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNb2Rlcm4gdHdvLXBhbmUgUHJlZmVyZW5jZUFjdGl2aXR5IHJlcXVpcmVzIHVzZSBvZiBhIFByZWZlcmVuY2VGcmFnbWVudCIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgdGhhdCB0aGlzIGFjdGl2aXR5IGlzIHNob3dpbmcuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gcHJlZmVyZW5jZVNjcmVlbiBUaGUgcm9vdCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gb2YgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZVNjcmVlbihQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4pIHsKKyAgICAgICAgcmVxdWlyZVByZWZlcmVuY2VNYW5hZ2VyKCk7CisKICAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlci5zZXRQcmVmZXJlbmNlcyhwcmVmZXJlbmNlU2NyZWVuKSAmJiBwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKICAgICAgICAgICAgIHBvc3RCaW5kUHJlZmVyZW5jZXMoKTsKICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aXRsZSA9IGdldFByZWZlcmVuY2VTY3JlZW4oKS5nZXRUaXRsZSgpOwpAQCAtMjI4LDYxICs4MDMsODQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHJvb3Qgb2YgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IHRoYXQgdGhpcyBhY3Rpdml0eSBpcyBzaG93aW5nLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBUaGUge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IHRoYXQgaXMgdGhlIHJvb3Qgb2YgdGhlIHByZWZlcmVuY2UKICAgICAgKiAgICAgICAgIGhpZXJhcmNoeS4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlbGV2YW50IGZvciBhIG1vZGVybiBmcmFnbWVudC1iYXNlZAorICAgICAqIFByZWZlcmVuY2VBY3Rpdml0eS4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBQcmVmZXJlbmNlU2NyZWVuIGdldFByZWZlcmVuY2VTY3JlZW4oKSB7Ci0gICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZVNjcmVlbigpOworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZVNjcmVlbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEFkZHMgcHJlZmVyZW5jZXMgZnJvbSBhY3Rpdml0aWVzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHtAbGluayBJbnRlbnR9LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGludGVudCBUaGUge0BsaW5rIEludGVudH0gdG8gcXVlcnkgYWN0aXZpdGllcy4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlbGV2YW50IGZvciBhIG1vZGVybiBmcmFnbWVudC1iYXNlZAorICAgICAqIFByZWZlcmVuY2VBY3Rpdml0eS4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIGFkZFByZWZlcmVuY2VzRnJvbUludGVudChJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgIHJlcXVpcmVQcmVmZXJlbmNlTWFuYWdlcigpOwotICAgICAgICAKKwogICAgICAgICBzZXRQcmVmZXJlbmNlU2NyZWVuKG1QcmVmZXJlbmNlTWFuYWdlci5pbmZsYXRlRnJvbUludGVudChpbnRlbnQsIGdldFByZWZlcmVuY2VTY3JlZW4oKSkpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEluZmxhdGVzIHRoZSBnaXZlbiBYTUwgcmVzb3VyY2UgYW5kIGFkZHMgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IHRvIHRoZSBjdXJyZW50CiAgICAgICogcHJlZmVyZW5jZSBoaWVyYXJjaHkuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gcHJlZmVyZW5jZXNSZXNJZCBUaGUgWE1MIHJlc291cmNlIElEIHRvIGluZmxhdGUuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWxldmFudCBmb3IgYSBtb2Rlcm4gZnJhZ21lbnQtYmFzZWQKKyAgICAgKiBQcmVmZXJlbmNlQWN0aXZpdHkuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZShpbnQgcHJlZmVyZW5jZXNSZXNJZCkgewogICAgICAgICByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKTsKLSAgICAgICAgCisKICAgICAgICAgc2V0UHJlZmVyZW5jZVNjcmVlbihtUHJlZmVyZW5jZU1hbmFnZXIuaW5mbGF0ZUZyb21SZXNvdXJjZSh0aGlzLCBwcmVmZXJlbmNlc1Jlc0lkLAogICAgICAgICAgICAgICAgIGdldFByZWZlcmVuY2VTY3JlZW4oKSkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlbGV2YW50IGZvciBhIG1vZGVybiBmcmFnbWVudC1iYXNlZAorICAgICAqIFByZWZlcmVuY2VBY3Rpdml0eS4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBib29sZWFuIG9uUHJlZmVyZW5jZVRyZWVDbGljayhQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4sIFByZWZlcmVuY2UgcHJlZmVyZW5jZSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogRmluZHMgYSB7QGxpbmsgUHJlZmVyZW5jZX0gYmFzZWQgb24gaXRzIGtleS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgcHJlZmVyZW5jZSB0byByZXRyaWV2ZS4KICAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZX0gd2l0aCB0aGUga2V5LCBvciBudWxsLgogICAgICAqIEBzZWUgUHJlZmVyZW5jZUdyb3VwI2ZpbmRQcmVmZXJlbmNlKENoYXJTZXF1ZW5jZSkKKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlbGV2YW50IGZvciBhIG1vZGVybiBmcmFnbWVudC1iYXNlZAorICAgICAqIFByZWZlcmVuY2VBY3Rpdml0eS4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBQcmVmZXJlbmNlIGZpbmRQcmVmZXJlbmNlKENoYXJTZXF1ZW5jZSBrZXkpIHsKLSAgICAgICAgCisKICAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyLmZpbmRQcmVmZXJlbmNlKGtleSk7CiAgICAgfQogCkBAIC0yOTIsNSArODkwLDE0IEBACiAgICAgICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hOZXdJbnRlbnQoaW50ZW50KTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKworICAgIC8vIGdpdmUgc3ViY2xhc3NlcyBhY2Nlc3MgdG8gdGhlIE5leHQgYnV0dG9uCisgICAgLyoqIEBoaWRlICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzTmV4dEJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIG1OZXh0QnV0dG9uICE9IG51bGw7CisgICAgfQorICAgIC8qKiBAaGlkZSAqLworICAgIHByb3RlY3RlZCBCdXR0b24gZ2V0TmV4dEJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIG1OZXh0QnV0dG9uOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNWRmZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsMzQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByZWZlcmVuY2U7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCisvKioKKyAqIFNob3dzIGEgaGllcmFyY2h5IG9mIHtAbGluayBQcmVmZXJlbmNlfSBvYmplY3RzIGFzCisgKiBsaXN0cy4gVGhlc2UgcHJlZmVyZW5jZXMgd2lsbAorICogYXV0b21hdGljYWxseSBzYXZlIHRvIHtAbGluayBTaGFyZWRQcmVmZXJlbmNlc30gYXMgdGhlIHVzZXIgaW50ZXJhY3RzIHdpdGgKKyAqIHRoZW0uIFRvIHJldHJpZXZlIGFuIGluc3RhbmNlIG9mIHtAbGluayBTaGFyZWRQcmVmZXJlbmNlc30gdGhhdCB0aGUKKyAqIHByZWZlcmVuY2UgaGllcmFyY2h5IGluIHRoaXMgZnJhZ21lbnQgd2lsbCB1c2UsIGNhbGwKKyAqIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlciNnZXREZWZhdWx0U2hhcmVkUHJlZmVyZW5jZXMoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpfQorICogd2l0aCBhIGNvbnRleHQgaW4gdGhlIHNhbWUgcGFja2FnZSBhcyB0aGlzIGZyYWdtZW50LgorICogPHA+CisgKiBGdXJ0aGVybW9yZSwgdGhlIHByZWZlcmVuY2VzIHNob3duIHdpbGwgZm9sbG93IHRoZSB2aXN1YWwgc3R5bGUgb2Ygc3lzdGVtCisgKiBwcmVmZXJlbmNlcy4gSXQgaXMgZWFzeSB0byBjcmVhdGUgYSBoaWVyYXJjaHkgb2YgcHJlZmVyZW5jZXMgKHRoYXQgY2FuIGJlCisgKiBzaG93biBvbiBtdWx0aXBsZSBzY3JlZW5zKSB2aWEgWE1MLiBGb3IgdGhlc2UgcmVhc29ucywgaXQgaXMgcmVjb21tZW5kZWQgdG8KKyAqIHVzZSB0aGlzIGZyYWdtZW50IChhcyBhIHN1cGVyY2xhc3MpIHRvIGRlYWwgd2l0aCBwcmVmZXJlbmNlcyBpbiBhcHBsaWNhdGlvbnMuCisgKiA8cD4KKyAqIEEge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IG9iamVjdCBzaG91bGQgYmUgYXQgdGhlIHRvcCBvZiB0aGUgcHJlZmVyZW5jZQorICogaGllcmFyY2h5LiBGdXJ0aGVybW9yZSwgc3Vic2VxdWVudCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gaW4gdGhlIGhpZXJhcmNoeQorICogZGVub3RlIGEgc2NyZWVuIGJyZWFrLS10aGF0IGlzIHRoZSBwcmVmZXJlbmNlcyBjb250YWluZWQgd2l0aGluIHN1YnNlcXVlbnQKKyAqIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBzaG91bGQgYmUgc2hvd24gb24gYW5vdGhlciBzY3JlZW4uIFRoZSBwcmVmZXJlbmNlCisgKiBmcmFtZXdvcmsgaGFuZGxlcyBzaG93aW5nIHRoZXNlIG90aGVyIHNjcmVlbnMgZnJvbSB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkuCisgKiA8cD4KKyAqIFRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSBjYW4gYmUgZm9ybWVkIGluIG11bHRpcGxlIHdheXM6CisgKiA8bGk+IEZyb20gYW4gWE1MIGZpbGUgc3BlY2lmeWluZyB0aGUgaGllcmFyY2h5CisgKiA8bGk+IEZyb20gZGlmZmVyZW50IHtAbGluayBBY3Rpdml0eSBBY3Rpdml0aWVzfSB0aGF0IGVhY2ggc3BlY2lmeSBpdHMgb3duCisgKiBwcmVmZXJlbmNlcyBpbiBhbiBYTUwgZmlsZSB2aWEge0BsaW5rIEFjdGl2aXR5fSBtZXRhLWRhdGEKKyAqIDxsaT4gRnJvbSBhbiBvYmplY3QgaGllcmFyY2h5IHJvb3RlZCB3aXRoIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufQorICogPHA+CisgKiBUbyBpbmZsYXRlIGZyb20gWE1MLCB1c2UgdGhlIHtAbGluayAjYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoaW50KX0uIFRoZQorICogcm9vdCBlbGVtZW50IHNob3VsZCBiZSBhIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufS4gU3Vic2VxdWVudCBlbGVtZW50cyBjYW4gcG9pbnQKKyAqIHRvIGFjdHVhbCB7QGxpbmsgUHJlZmVyZW5jZX0gc3ViY2xhc3Nlcy4gQXMgbWVudGlvbmVkIGFib3ZlLCBzdWJzZXF1ZW50CisgKiB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gaW4gdGhlIGhpZXJhcmNoeSB3aWxsIHJlc3VsdCBpbiB0aGUgc2NyZWVuIGJyZWFrLgorICogPHA+CisgKiBUbyBzcGVjaWZ5IGFuIHtAbGluayBJbnRlbnR9IHRvIHF1ZXJ5IHtAbGluayBBY3Rpdml0eSBBY3Rpdml0aWVzfSB0aGF0IGVhY2gKKyAqIGhhdmUgcHJlZmVyZW5jZXMsIHVzZSB7QGxpbmsgI2FkZFByZWZlcmVuY2VzRnJvbUludGVudH0uIEVhY2gKKyAqIHtAbGluayBBY3Rpdml0eX0gY2FuIHNwZWNpZnkgbWV0YS1kYXRhIGluIHRoZSBtYW5pZmVzdCAodmlhIHRoZSBrZXkKKyAqIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlciNNRVRBREFUQV9LRVlfUFJFRkVSRU5DRVN9KSB0aGF0IHBvaW50cyB0byBhbiBYTUwKKyAqIHJlc291cmNlLiBUaGVzZSBYTUwgcmVzb3VyY2VzIHdpbGwgYmUgaW5mbGF0ZWQgaW50byBhIHNpbmdsZSBwcmVmZXJlbmNlCisgKiBoaWVyYXJjaHkgYW5kIHNob3duIGJ5IHRoaXMgZnJhZ21lbnQuCisgKiA8cD4KKyAqIFRvIHNwZWNpZnkgYW4gb2JqZWN0IGhpZXJhcmNoeSByb290ZWQgd2l0aCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0sIHVzZQorICoge0BsaW5rICNzZXRQcmVmZXJlbmNlU2NyZWVuKFByZWZlcmVuY2VTY3JlZW4pfS4KKyAqIDxwPgorICogQXMgYSBjb252ZW5pZW5jZSwgdGhpcyBmcmFnbWVudCBpbXBsZW1lbnRzIGEgY2xpY2sgbGlzdGVuZXIgZm9yIGFueQorICogcHJlZmVyZW5jZSBpbiB0aGUgY3VycmVudCBoaWVyYXJjaHksIHNlZQorICoge0BsaW5rICNvblByZWZlcmVuY2VUcmVlQ2xpY2soUHJlZmVyZW5jZVNjcmVlbiwgUHJlZmVyZW5jZSl9LgorICoKKyAqIDxhIG5hbWU9IlNhbXBsZUNvZGUiPjwvYT4KKyAqIDxoMz5TYW1wbGUgQ29kZTwvaDM+CisgKgorICogPHA+VGhlIGZvbGxvd2luZyBzYW1wbGUgY29kZSBzaG93cyBhIHNpbXBsZSBwcmVmZXJlbmNlIGZyYWdtZW50IHRoYXQgaXMKKyAqIHBvcHVsYXRlZCBmcm9tIGEgcmVzb3VyY2UuICBUaGUgcmVzb3VyY2UgaXQgbG9hZHMgaXM6PC9wPgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9wcmVmZXJlbmNlcy54bWwgcHJlZmVyZW5jZXN9CisgKgorICogPHA+VGhlIGZyYWdtZW50IGltcGxlbWVudGF0aW9uIGl0c2VsZiBzaW1wbHkgcG9wdWxhdGVzIHRoZSBwcmVmZXJlbmNlcworICogd2hlbiBjcmVhdGVkLiAgTm90ZSB0aGF0IHRoZSBwcmVmZXJlbmNlcyBmcmFtZXdvcmsgdGFrZXMgY2FyZSBvZiBsb2FkaW5nCisgKiB0aGUgY3VycmVudCB2YWx1ZXMgb3V0IG9mIHRoZSBhcHAgcHJlZmVyZW5jZXMgYW5kIHdyaXRpbmcgdGhlbSB3aGVuIGNoYW5nZWQ6PC9wPgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL0ZyYWdtZW50UHJlZmVyZW5jZXMuamF2YQorICogICAgICBmcmFnbWVudH0KKyAqCisgKiBAc2VlIFByZWZlcmVuY2UKKyAqIEBzZWUgUHJlZmVyZW5jZVNjcmVlbgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJlZmVyZW5jZUZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgaW1wbGVtZW50cworICAgICAgICBQcmVmZXJlbmNlTWFuYWdlci5PblByZWZlcmVuY2VUcmVlQ2xpY2tMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRVNfVEFHID0gImFuZHJvaWQ6cHJlZmVyZW5jZXMiOworCisgICAgcHJpdmF0ZSBQcmVmZXJlbmNlTWFuYWdlciBtUHJlZmVyZW5jZU1hbmFnZXI7CisgICAgcHJpdmF0ZSBMaXN0VmlldyBtTGlzdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhdmVQcmVmczsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUluaXREb25lOworCisgICAgLyoqCisgICAgICogVGhlIHN0YXJ0aW5nIHJlcXVlc3QgY29kZSBnaXZlbiBvdXQgdG8gcHJlZmVyZW5jZSBmcmFtZXdvcmsuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJUlNUX1JFUVVFU1RfQ09ERSA9IDEwMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQklORF9QUkVGRVJFTkNFUyA9IDA7CisgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19CSU5EX1BSRUZFUkVOQ0VTOgorICAgICAgICAgICAgICAgICAgICBiaW5kUHJlZmVyZW5jZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgZmluYWwgcHJpdmF0ZSBSdW5uYWJsZSBtUmVxdWVzdEZvY3VzID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBtTGlzdC5mb2N1c2FibGVWaWV3QXZhaWxhYmxlKG1MaXN0KTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdGhhdCBQcmVmZXJlbmNlRnJhZ21lbnQncyBjb250YWluaW5nIGFjdGl2aXR5IHNob3VsZAorICAgICAqIGltcGxlbWVudCB0byBiZSBhYmxlIHRvIHByb2Nlc3MgcHJlZmVyZW5jZSBpdGVtcyB0aGF0IHdpc2ggdG8KKyAgICAgKiBzd2l0Y2ggdG8gYSBuZXcgZnJhZ21lbnQuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPblByZWZlcmVuY2VTdGFydEZyYWdtZW50Q2FsbGJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgaGFzIGNsaWNrZWQgb24gYSBQcmVmZXJlbmNlIHRoYXQgaGFzCisgICAgICAgICAqIGEgZnJhZ21lbnQgY2xhc3MgbmFtZSBhc3NvY2lhdGVkIHdpdGggaXQuICBUaGUgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICogdG8gc2hvdWxkIGluc3RhbnRpYXRlIGFuZCBzd2l0Y2ggdG8gYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuCisgICAgICAgICAqIGZyYWdtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBvblByZWZlcmVuY2VTdGFydEZyYWdtZW50KFByZWZlcmVuY2VGcmFnbWVudCBjYWxsZXIsIFByZWZlcmVuY2UgcHJlZik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIgPSBuZXcgUHJlZmVyZW5jZU1hbmFnZXIoZ2V0QWN0aXZpdHkoKSwgRklSU1RfUkVRVUVTVF9DT0RFKTsKKyAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLnNldE9uUHJlZmVyZW5jZVRyZWVDbGlja0xpc3RlbmVyKHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIGluZmxhdGVyLmluZmxhdGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQucHJlZmVyZW5jZV9saXN0X2NvbnRlbnQsCisgICAgICAgICAgICAgICAgY29udGFpbmVyLCBmYWxzZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkFjdGl2aXR5Q3JlYXRlZChzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBnZXRMaXN0VmlldygpLnNldFNjcm9sbEJhclN0eWxlKFZpZXcuU0NST0xMQkFSU19JTlNJREVfT1ZFUkxBWSk7CisKKyAgICAgICAgaWYgKG1IYXZlUHJlZnMpIHsKKyAgICAgICAgICAgIGJpbmRQcmVmZXJlbmNlcygpOworICAgICAgICB9CisKKyAgICAgICAgbUluaXREb25lID0gdHJ1ZTsKKworICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBjb250YWluZXIgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0QnVuZGxlKFBSRUZFUkVOQ0VTX1RBRyk7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4gPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgICAgICAgICAgICAgaWYgKHByZWZlcmVuY2VTY3JlZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwcmVmZXJlbmNlU2NyZWVuLnJlc3RvcmVIaWVyYXJjaHlTdGF0ZShjb250YWluZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgc3VwZXIub25TdG9wKCk7CisgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaEFjdGl2aXR5U3RvcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveVZpZXcoKSB7CisgICAgICAgIG1MaXN0ID0gbnVsbDsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SZXF1ZXN0Rm9jdXMpOworICAgICAgICBzdXBlci5vbkRlc3Ryb3lWaWV3KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKyAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlEZXN0cm95KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZShvdXRTdGF0ZSk7CisKKyAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOworICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CisgICAgICAgICAgICBCdW5kbGUgY29udGFpbmVyID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5zYXZlSGllcmFyY2h5U3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgIG91dFN0YXRlLnB1dEJ1bmRsZShQUkVGRVJFTkNFU19UQUcsIGNvbnRhaW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CisgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOworCisgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaEFjdGl2aXR5UmVzdWx0KHJlcXVlc3RDb2RlLCByZXN1bHRDb2RlLCBkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9IHVzZWQgYnkgdGhpcyBmcmFnbWVudC4KKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9LgorICAgICAqLworICAgIHB1YmxpYyBQcmVmZXJlbmNlTWFuYWdlciBnZXRQcmVmZXJlbmNlTWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSByb290IG9mIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSB0aGF0IHRoaXMgZnJhZ21lbnQgaXMgc2hvd2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmZXJlbmNlU2NyZWVuIFRoZSByb290IHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBvZiB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZVNjcmVlbihQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4pIHsKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlci5zZXRQcmVmZXJlbmNlcyhwcmVmZXJlbmNlU2NyZWVuKSAmJiBwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1IYXZlUHJlZnMgPSB0cnVlOworICAgICAgICAgICAgaWYgKG1Jbml0RG9uZSkgeworICAgICAgICAgICAgICAgIHBvc3RCaW5kUHJlZmVyZW5jZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHJvb3Qgb2YgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IHRoYXQgdGhpcyBmcmFnbWVudCBpcyBzaG93aW5nLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IHRoYXQgaXMgdGhlIHJvb3Qgb2YgdGhlIHByZWZlcmVuY2UKKyAgICAgKiAgICAgICAgIGhpZXJhcmNoeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJlZmVyZW5jZVNjcmVlbiBnZXRQcmVmZXJlbmNlU2NyZWVuKCkgeworICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyLmdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHByZWZlcmVuY2VzIGZyb20gYWN0aXZpdGllcyB0aGF0IG1hdGNoIHRoZSBnaXZlbiB7QGxpbmsgSW50ZW50fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIHtAbGluayBJbnRlbnR9IHRvIHF1ZXJ5IGFjdGl2aXRpZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJlZmVyZW5jZXNGcm9tSW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgcmVxdWlyZVByZWZlcmVuY2VNYW5hZ2VyKCk7CisKKyAgICAgICAgc2V0UHJlZmVyZW5jZVNjcmVlbihtUHJlZmVyZW5jZU1hbmFnZXIuaW5mbGF0ZUZyb21JbnRlbnQoaW50ZW50LCBnZXRQcmVmZXJlbmNlU2NyZWVuKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmZsYXRlcyB0aGUgZ2l2ZW4gWE1MIHJlc291cmNlIGFuZCBhZGRzIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSB0byB0aGUgY3VycmVudAorICAgICAqIHByZWZlcmVuY2UgaGllcmFyY2h5LgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZlcmVuY2VzUmVzSWQgVGhlIFhNTCByZXNvdXJjZSBJRCB0byBpbmZsYXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKGludCBwcmVmZXJlbmNlc1Jlc0lkKSB7CisgICAgICAgIHJlcXVpcmVQcmVmZXJlbmNlTWFuYWdlcigpOworCisgICAgICAgIHNldFByZWZlcmVuY2VTY3JlZW4obVByZWZlcmVuY2VNYW5hZ2VyLmluZmxhdGVGcm9tUmVzb3VyY2UoZ2V0QWN0aXZpdHkoKSwKKyAgICAgICAgICAgICAgICBwcmVmZXJlbmNlc1Jlc0lkLCBnZXRQcmVmZXJlbmNlU2NyZWVuKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25QcmVmZXJlbmNlVHJlZUNsaWNrKFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiwKKyAgICAgICAgICAgIFByZWZlcmVuY2UgcHJlZmVyZW5jZSkgeworICAgICAgICBpZiAocHJlZmVyZW5jZS5nZXRGcmFnbWVudCgpICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpIGluc3RhbmNlb2YgT25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudENhbGxiYWNrKSB7CisgICAgICAgICAgICByZXR1cm4gKChPblByZWZlcmVuY2VTdGFydEZyYWdtZW50Q2FsbGJhY2spZ2V0QWN0aXZpdHkoKSkub25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudCgKKyAgICAgICAgICAgICAgICAgICAgdGhpcywgcHJlZmVyZW5jZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIGEge0BsaW5rIFByZWZlcmVuY2V9IGJhc2VkIG9uIGl0cyBrZXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIHByZWZlcmVuY2UgdG8gcmV0cmlldmUuCisgICAgICogQHJldHVybiBUaGUge0BsaW5rIFByZWZlcmVuY2V9IHdpdGggdGhlIGtleSwgb3IgbnVsbC4KKyAgICAgKiBAc2VlIFByZWZlcmVuY2VHcm91cCNmaW5kUHJlZmVyZW5jZShDaGFyU2VxdWVuY2UpCisgICAgICovCisgICAgcHVibGljIFByZWZlcmVuY2UgZmluZFByZWZlcmVuY2UoQ2hhclNlcXVlbmNlIGtleSkgeworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXIuZmluZFByZWZlcmVuY2Uoa2V5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVxdWlyZVByZWZlcmVuY2VNYW5hZ2VyKCkgeworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgc3VwZXIub25DcmVhdGUuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcG9zdEJpbmRQcmVmZXJlbmNlcygpIHsKKyAgICAgICAgaWYgKG1IYW5kbGVyLmhhc01lc3NhZ2VzKE1TR19CSU5EX1BSRUZFUkVOQ0VTKSkgcmV0dXJuOworICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19CSU5EX1BSRUZFUkVOQ0VTKS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYmluZFByZWZlcmVuY2VzKCkgeworICAgICAgICBmaW5hbCBQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4gPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgICAgIGlmIChwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIHByZWZlcmVuY2VTY3JlZW4uYmluZChnZXRMaXN0VmlldygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBMaXN0VmlldyBnZXRMaXN0VmlldygpIHsKKyAgICAgICAgZW5zdXJlTGlzdCgpOworICAgICAgICByZXR1cm4gbUxpc3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUxpc3QoKSB7CisgICAgICAgIGlmIChtTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgVmlldyByb290ID0gZ2V0VmlldygpOworICAgICAgICBpZiAocm9vdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb250ZW50IHZpZXcgbm90IHlldCBjcmVhdGVkIik7CisgICAgICAgIH0KKyAgICAgICAgVmlldyByYXdMaXN0VmlldyA9IHJvb3QuZmluZFZpZXdCeUlkKGFuZHJvaWQuUi5pZC5saXN0KTsKKyAgICAgICAgaWYgKCEocmF3TGlzdFZpZXcgaW5zdGFuY2VvZiBMaXN0VmlldykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ29udGVudCBoYXMgdmlldyB3aXRoIGlkIGF0dHJpYnV0ZSAnYW5kcm9pZC5SLmlkLmxpc3QnICIKKyAgICAgICAgICAgICAgICAgICAgKyAidGhhdCBpcyBub3QgYSBMaXN0VmlldyBjbGFzcyIpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ID0gKExpc3RWaWV3KXJhd0xpc3RWaWV3OworICAgICAgICBpZiAobUxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJZb3VyIGNvbnRlbnQgbXVzdCBoYXZlIGEgTGlzdFZpZXcgd2hvc2UgaWQgYXR0cmlidXRlIGlzICIgKworICAgICAgICAgICAgICAgICAgICAiJ2FuZHJvaWQuUi5pZC5saXN0JyIpOworICAgICAgICB9CisgICAgICAgIG1IYW5kbGVyLnBvc3QobVJlcXVlc3RGb2N1cyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlSW5mbGF0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUluZmxhdGVyLmphdmEKaW5kZXggNzc5ZTc0Ni4uYzIxYWExOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlSW5mbGF0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VJbmZsYXRlci5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5wcmVmZXJlbmNlOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5YbWxVdGlsczsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIApAQCAtMzksNiArNDEsNyBAQAogY2xhc3MgUHJlZmVyZW5jZUluZmxhdGVyIGV4dGVuZHMgR2VuZXJpY0luZmxhdGVyPFByZWZlcmVuY2UsIFByZWZlcmVuY2VHcm91cD4gewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUHJlZmVyZW5jZUluZmxhdGVyIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URU5UX1RBR19OQU1FID0gImludGVudCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1RBR19OQU1FID0gImV4dHJhIjsKIAogICAgIHByaXZhdGUgUHJlZmVyZW5jZU1hbmFnZXIgbVByZWZlcmVuY2VNYW5hZ2VyOwogICAgIApAQCAtNzMsOCArNzYsMTAgQEAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgaW50ZW50ID0gSW50ZW50LnBhcnNlSW50ZW50KGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKSwgcGFyc2VyLCBhdHRycyk7CiAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ291bGQgbm90IHBhcnNlIEludGVudC4iKTsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsIGUpOworICAgICAgICAgICAgICAgIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZXggPSBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIHByZWZlcmVuY2UiKTsKKyAgICAgICAgICAgICAgICBleC5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGlmIChpbnRlbnQgIT0gbnVsbCkgewpAQCAtODIsNiArODcsMTggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAodGFnLmVxdWFscyhFWFRSQV9UQUdfTkFNRSkpIHsKKyAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5wYXJzZUJ1bmRsZUV4dHJhKEVYVFJBX1RBR19OQU1FLCBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50UHJlZmVyZW5jZS5nZXRFeHRyYXMoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFhtbFV0aWxzLnNraXBDdXJyZW50VGFnKHBhcnNlcik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBleCA9IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHBhcnNpbmcgcHJlZmVyZW5jZSIpOworICAgICAgICAgICAgICAgIGV4LmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VTY3JlZW4uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVNjcmVlbi5qYXZhCmluZGV4IDk1ZTU0MzI0Li5jN2Y4YWIyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VTY3JlZW4uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VTY3JlZW4uamF2YQpAQCAtOTEsNyArOTEsOCBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhbiBhZGFwdGVyIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGEge0BsaW5rIFByZWZlcmVuY2VBY3Rpdml0eX0KLSAgICAgKiB0byBzaG93IHRoZSBwcmVmZXJlbmNlcyBjb250YWluZWQgaW4gdGhpcyB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0uCisgICAgICogb3Ige0BsaW5rIFByZWZlcmVuY2VGcmFnbWVudH0gdG8gc2hvdyB0aGUgcHJlZmVyZW5jZXMgY29udGFpbmVkIGluIHRoaXMKKyAgICAgKiB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0uCiAgICAgICogPHA+CiAgICAgICogVGhpcyB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gd2lsbCBOT1QgYXBwZWFyIGluIHRoZSByZXR1cm5lZCBhZGFwdGVyLCBpbnN0ZWFkCiAgICAgICogaXQgYXBwZWFycyBpbiB0aGUgaGllcmFyY2h5IGFib3ZlIHRoaXMge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59LgpAQCAtMTM2LDcgKzEzNyw3IEBACiAgICAgCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DbGljaygpIHsKLSAgICAgICAgaWYgKGdldEludGVudCgpICE9IG51bGwgfHwgZ2V0UHJlZmVyZW5jZUNvdW50KCkgPT0gMCkgeworICAgICAgICBpZiAoZ2V0SW50ZW50KCkgIT0gbnVsbCB8fCBnZXRGcmFnbWVudCgpICE9IG51bGwgfHwgZ2V0UHJlZmVyZW5jZUNvdW50KCkgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQnJvd3Nlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQnJvd3Nlci5qYXZhCmluZGV4IDJmYmExZDc5Li5mZDlkNjk5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Ccm93c2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQnJvd3Nlci5qYXZhCkBAIC0xNywyMiArMTcsMjkgQEAKIHBhY2thZ2UgYW5kcm9pZC5wcm92aWRlcjsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Ccm93c2VyQ29udHJhY3QuQm9va21hcmtzOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQnJvd3NlckNvbnRyYWN0Lkhpc3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJJY29uRGF0YWJhc2U7CiAKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQogcHVibGljIGNsYXNzIEJyb3dzZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dUQUcgPSAiYnJvd3NlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQk9PS01BUktTX1VSSSA9Ci0gICAgICAgIFVyaS5wYXJzZSgiY29udGVudDovL2Jyb3dzZXIvYm9va21hcmtzIik7CisKKyAgICAvKioKKyAgICAgKiBBIHRhYmxlIGNvbnRhaW5pbmcgYm90aCBib29rbWFya3MgYW5kIGhpc3RvcnkgaXRlbXMuIFRoZSBjb2x1bW5zIG9mIHRoZSB0YWJsZSBhcmUgZGVmaW5lZCBpbgorICAgICAqIHtAbGluayBCb29rbWFya0NvbHVtbnN9LiBSZWFkaW5nIHRoaXMgdGFibGUgcmVxdWlyZXMgdGhlCisgICAgICoge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNSRUFEX0hJU1RPUllfQk9PS01BUktTfSBwZXJtaXNzaW9uIGFuZCB3cml0aW5nIHRvIGl0CisgICAgICogcmVxdWlyZXMgdGhlIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jV1JJVEVfSElTVE9SWV9CT09LTUFSS1N9IHBlcm1pc3Npb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQk9PS01BUktTX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovL2Jyb3dzZXIvYm9va21hcmtzIik7CiAKICAgICAvKioKICAgICAgKiBUaGUgbmFtZSBvZiBleHRyYSBkYXRhIHdoZW4gc3RhcnRpbmcgQnJvd3NlciB3aXRoIEFDVElPTl9WSUVXIG9yCkBAIC00OSwxMiArNTYsMTEgQEAKICAgICAgKiBhcHBsaWNhdGlvbi4KICAgICAgKiA8cD4KICAgICAgKiBUaGUgdmFsdWUgaXMgYSB1bmlxdWUgaWRlbnRpZmljYXRpb24gc3RyaW5nIHRoYXQgd2lsbCBiZSB1c2VkIHRvCi0gICAgICogaW5kZW50aWZ5IHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLiBUaGUgQnJvd3NlciB3aWxsIGF0dGVtcHQgdG8gcmV1c2UgdGhlCisgICAgICogaWRlbnRpZnkgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24uIFRoZSBCcm93c2VyIHdpbGwgYXR0ZW1wdCB0byByZXVzZSB0aGUKICAgICAgKiBzYW1lIHdpbmRvdyBlYWNoIHRpbWUgdGhlIGFwcGxpY2F0aW9uIGxhdW5jaGVzIHRoZSBCcm93c2VyIHdpdGggdGhlIHNhbWUKICAgICAgKiBpZGVudGlmaWVyLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0FQUExJQ0FUSU9OX0lEID0KLSAgICAgICAgImNvbS5hbmRyb2lkLmJyb3dzZXIuYXBwbGljYXRpb25faWQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0FQUExJQ0FUSU9OX0lEID0gImNvbS5hbmRyb2lkLmJyb3dzZXIuYXBwbGljYXRpb25faWQiOwogCiAgICAgLyoqCiAgICAgICogVGhlIG5hbWUgb2YgdGhlIGV4dHJhIGRhdGEgaW4gdGhlIFZJRVcgaW50ZW50LiBUaGUgZGF0YSBhcmUga2V5L3ZhbHVlCkBAIC02OCwxMCArNzQsMTcgQEAKICAgICAvKiBpZiB5b3UgY2hhbmdlIGNvbHVtbiBvcmRlciB5b3UgbXVzdCBhbHNvIGNoYW5nZSBpbmRpY2VzCiAgICAgICAgYmVsb3cgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhJU1RPUllfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIEJvb2ttYXJrQ29sdW1ucy5fSUQsIEJvb2ttYXJrQ29sdW1ucy5VUkwsIEJvb2ttYXJrQ29sdW1ucy5WSVNJVFMsCi0gICAgICAgIEJvb2ttYXJrQ29sdW1ucy5EQVRFLCBCb29rbWFya0NvbHVtbnMuQk9PS01BUkssIEJvb2ttYXJrQ29sdW1ucy5USVRMRSwKLSAgICAgICAgQm9va21hcmtDb2x1bW5zLkZBVklDT04sIEJvb2ttYXJrQ29sdW1ucy5USFVNQk5BSUwsCi0gICAgICAgIEJvb2ttYXJrQ29sdW1ucy5UT1VDSF9JQ09OLCBCb29rbWFya0NvbHVtbnMuVVNFUl9FTlRFUkVEIH07CisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuX0lELCAvLyAwCisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuVVJMLCAvLyAxCisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuVklTSVRTLCAvLyAyCisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuREFURSwgLy8gMworICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLkJPT0tNQVJLLCAvLyA0CisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuVElUTEUsIC8vIDUKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5GQVZJQ09OLCAvLyA2CisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuVEhVTUJOQUlMLCAvLyA3CisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuVE9VQ0hfSUNPTiwgLy8gOAorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLlVTRVJfRU5URVJFRCwgLy8gOQorICAgIH07CiAKICAgICAvKiB0aGVzZSBpbmRpY2VzIGRlcGVuZGVudCBvbiBISVNUT1JZX1BST0pFQ1RJT04gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISVNUT1JZX1BST0pFQ1RJT05fSURfSU5ERVggPSAwOwpAQCAtOTIsMTkgKzEwNSwzMyBAQAogCiAgICAgLyogY29sdW1ucyBuZWVkZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gdHJ1bmNhdGUgaGlzdG9yeSAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVFJVTkNBVEVfSElTVE9SWV9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgQm9va21hcmtDb2x1bW5zLl9JRCwgQm9va21hcmtDb2x1bW5zLkRBVEUsIH07CisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuX0lELAorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLkRBVEUsCisgICAgfTsKKwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSVU5DQVRFX0hJU1RPUllfUFJPSkVDVElPTl9JRF9JTkRFWCA9IDA7CiAKICAgICAvKiB0cnVuY2F0ZSB0aGlzIG1hbnkgaGlzdG9yeSBpdGVtcyBhdCBhIHRpbWUgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUlVOQ0FURV9OX09MREVTVCA9IDU7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBTRUFSQ0hFU19VUkkgPQotICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly9icm93c2VyL3NlYXJjaGVzIik7CisgICAgLyoqCisgICAgICogQSB0YWJsZSBjb250YWluaW5nIGEgbG9nIG9mIGJyb3dzZXIgc2VhcmNoZXMuIFRoZSBjb2x1bW5zIG9mIHRoZSB0YWJsZSBhcmUgZGVmaW5lZCBpbgorICAgICAqIHtAbGluayBTZWFyY2hDb2x1bW5zfS4gUmVhZGluZyB0aGlzIHRhYmxlIHJlcXVpcmVzIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jUkVBRF9ISVNUT1JZX0JPT0tNQVJLU30gcGVybWlzc2lvbiBhbmQgd3JpdGluZyB0byBpdAorICAgICAqIHJlcXVpcmVzIHRoZSB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1dSSVRFX0hJU1RPUllfQk9PS01BUktTfSBwZXJtaXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIFNFQVJDSEVTX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovL2Jyb3dzZXIvc2VhcmNoZXMiKTsKIAotICAgIC8qIGlmIHlvdSBjaGFuZ2UgY29sdW1uIG9yZGVyIHlvdSBtdXN0IGFsc28gY2hhbmdlIGluZGljZXMKLSAgICAgICBiZWxvdyAqLworICAgIC8qKgorICAgICAqIEEgcHJvamVjdGlvbiBvZiB7QGxpbmsgI1NFQVJDSEVTX1VSSX0gdGhhdCBjb250YWlucyB7QGxpbmsgU2VhcmNoQ29sdW1ucyNfSUR9LAorICAgICAqIHtAbGluayBTZWFyY2hDb2x1bW5zI1NFQVJDSH0sIGFuZCB7QGxpbmsgU2VhcmNoQ29sdW1ucyNEQVRFfS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNFQVJDSEVTX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBTZWFyY2hDb2x1bW5zLl9JRCwgU2VhcmNoQ29sdW1ucy5TRUFSQ0gsIFNlYXJjaENvbHVtbnMuREFURSB9OworICAgICAgICAgICAgLy8gaWYgeW91IGNoYW5nZSBjb2x1bW4gb3JkZXIgeW91IG11c3QgYWxzbyBjaGFuZ2UgaW5kaWNlcyBiZWxvdworICAgICAgICAgICAgU2VhcmNoQ29sdW1ucy5fSUQsIC8vIDAKKyAgICAgICAgICAgIFNlYXJjaENvbHVtbnMuU0VBUkNILCAvLyAxCisgICAgICAgICAgICBTZWFyY2hDb2x1bW5zLkRBVEUsIC8vIDIKKyAgICB9OwogCiAgICAgLyogdGhlc2UgaW5kaWNlcyBkZXBlbmRlbnQgb24gU0VBUkNIRVNfUFJPSkVDVElPTiAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFQVJDSEVTX1BST0pFQ1RJT05fU0VBUkNIX0lOREVYID0gMTsKQEAgLTEyMSw5ICsxNDgsMTAgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0hJU1RPUllfQ09VTlQgPSAyNTA7CiAKICAgICAvKioKLSAgICAgKiAgT3BlbiB0aGUgQWRkQm9va21hcmsgYWN0aXZpdHkgdG8gc2F2ZSBhIGJvb2ttYXJrLiAgTGF1bmNoIHdpdGgKLSAgICAgKiAgYW5kL29yIHVybCwgd2hpY2ggY2FuIGJlIGVkaXRlZCBieSB0aGUgdXNlciBiZWZvcmUgc2F2aW5nLgotICAgICAqICBAcGFyYW0gYyAgICAgICAgQ29udGV4dCB1c2VkIHRvIGxhdW5jaCB0aGUgQWRkQm9va21hcmsgYWN0aXZpdHkuCisgICAgICogIE9wZW4gYW4gYWN0aXZpdHkgdG8gc2F2ZSBhIGJvb2ttYXJrLiBMYXVuY2ggd2l0aCBhIHRpdGxlCisgICAgICogIGFuZC9vciBhIHVybCwgYm90aCBvZiB3aGljaCBjYW4gYmUgZWRpdGVkIGJ5IHRoZSB1c2VyIGJlZm9yZSBzYXZpbmcuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIGMgICAgICAgIENvbnRleHQgdXNlZCB0byBsYXVuY2ggdGhlIGFjdGl2aXR5IHRvIGFkZCBhIGJvb2ttYXJrLgogICAgICAqICBAcGFyYW0gdGl0bGUgICAgVGl0bGUgZm9yIHRoZSBib29rbWFyay4gQ2FuIGJlIG51bGwgb3IgZW1wdHkgc3RyaW5nLgogICAgICAqICBAcGFyYW0gdXJsICAgICAgVXJsIGZvciB0aGUgYm9va21hcmsuIENhbiBiZSBudWxsIG9yIGVtcHR5IHN0cmluZy4KICAgICAgKi8KQEAgLTE1Miw4ICsxODAsMTUgQEAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFWFRSQV9TSEFSRV9GQVZJQ09OID0gInNoYXJlX2Zhdmljb24iOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNlbmRTdHJpbmcoQ29udGV4dCBjLCBTdHJpbmcgcykgewotICAgICAgICBzZW5kU3RyaW5nKGMsIHMsIGMuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnNlbmRUZXh0KSk7CisgICAgLyoqCisgICAgICogU2VuZHMgdGhlIGdpdmVuIHN0cmluZyB1c2luZyBhbiBJbnRlbnQgd2l0aCB7QGxpbmsgSW50ZW50I0FDVElPTl9TRU5EfSBhbmQgYSBtaW1lIHR5cGUKKyAgICAgKiBvZiB0ZXh0L3BsYWluLiBUaGUgc3RyaW5nIGlzIHB1dCBpbnRvIHtAbGluayBJbnRlbnQjRVhUUkFfVEVYVH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCB1c2VkIHRvIHN0YXJ0IHRoZSBhY3Rpdml0eQorICAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIHN0cmluZyB0byBzZW5kCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNlbmRTdHJpbmcoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIHNlbmRTdHJpbmcoY29udGV4dCwgc3RyaW5nLCBjb250ZXh0LmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zZW5kVGV4dCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTgxLDQxICsyMTYsMzkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiAgUmV0dXJuIGEgY3Vyc29yIHBvaW50aW5nIHRvIGEgbGlzdCBvZiBhbGwgdGhlIGJvb2ttYXJrcy4KKyAgICAgKiAgUmV0dXJuIGEgY3Vyc29yIHBvaW50aW5nIHRvIGEgbGlzdCBvZiBhbGwgdGhlIGJvb2ttYXJrcy4gVGhlIGN1cnNvciB3aWxsIGhhdmUgYSBzaW5nbGUKKyAgICAgKiAgY29sdW1uLCB7QGxpbmsgQm9va21hcmtDb2x1bW5zI1VSTH0uCisgICAgICogIDxwPgogICAgICAqICBSZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfSElTVE9SWV9CT09LTUFSS1N9CisgICAgICoKICAgICAgKiAgQHBhcmFtIGNyICAgVGhlIENvbnRlbnRSZXNvbHZlciB1c2VkIHRvIGFjY2VzcyB0aGUgZGF0YWJhc2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgZ2V0QWxsQm9va21hcmtzKENvbnRlbnRSZXNvbHZlciBjcikgdGhyb3dzIAogICAgICAgICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KEJPT0tNQVJLU19VUkksCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgQm9va21hcmtDb2x1bW5zLlVSTCB9LCAKLSAgICAgICAgICAgICAgICAiYm9va21hcmsgPSAxIiwgbnVsbCwgbnVsbCk7CisgICAgICAgIHJldHVybiBjci5xdWVyeShCb29rbWFya3MuQ09OVEVOVF9VUkksCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgQm9va21hcmtzLlVSTCB9LCAKKyAgICAgICAgICAgICAgICBCb29rbWFya3MuSVNfRk9MREVSICsgIiA9IDAiLCBudWxsLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiAgUmV0dXJuIGEgY3Vyc29yIHBvaW50aW5nIHRvIGEgbGlzdCBvZiBhbGwgdmlzaXRlZCBzaXRlIHVybHMuCisgICAgICogIFJldHVybiBhIGN1cnNvciBwb2ludGluZyB0byBhIGxpc3Qgb2YgYWxsIHZpc2l0ZWQgc2l0ZSB1cmxzLiBUaGUgY3Vyc29yIHdpbGwKKyAgICAgKiAgaGF2ZSBhIHNpbmdsZSBjb2x1bW4sIHtAbGluayBCb29rbWFya0NvbHVtbnMjVVJMfS4KKyAgICAgKiAgPHA+CiAgICAgICogIFJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jUkVBRF9ISVNUT1JZX0JPT0tNQVJLU30KKyAgICAgKgogICAgICAqICBAcGFyYW0gY3IgICBUaGUgQ29udGVudFJlc29sdmVyIHVzZWQgdG8gYWNjZXNzIHRoZSBkYXRhYmFzZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBnZXRBbGxWaXNpdGVkVXJscyhDb250ZW50UmVzb2x2ZXIgY3IpIHRocm93cwogICAgICAgICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KEJPT0tNQVJLU19VUkksCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgQm9va21hcmtDb2x1bW5zLlVSTCB9LCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KEhpc3RvcnkuQ09OVEVOVF9VUkksCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSGlzdG9yeS5VUkwgfSwgbnVsbCwgbnVsbCwgbnVsbCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBhZGRPclVybEVxdWFscyhTdHJpbmdCdWlsZGVyIHNiKSB7CiAgICAgICAgIHNiLmFwcGVuZCgiIE9SICIgKyBCb29rbWFya0NvbHVtbnMuVVJMICsgIiA9ICIpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqICBSZXR1cm4gYSBDdXJzb3Igd2l0aCBhbGwgaGlzdG9yeS9ib29rbWFya3MgdGhhdCBhcmUgc2ltaWxhciB0byB1cmwsCi0gICAgICogIHdoZXJlIHNpbWlsYXIgbWVhbnMgJ2h0dHAocyk6Ly8nIGFuZCAnd3d3LicgYXJlIG9wdGlvbmFsLCBidXQgdGhlIHJlc3QKLSAgICAgKiAgb2YgdGhlIHVybCBpcyB0aGUgc2FtZS4KLSAgICAgKiAgQHBhcmFtIGNyICAgVGhlIENvbnRlbnRSZXNvbHZlciB1c2VkIHRvIGFjY2VzcyB0aGUgZGF0YWJhc2UuCi0gICAgICogIEBwYXJhbSB1cmwgIFRoZSB1cmwgdG8gY29tcGFyZSB0by4KLSAgICAgKiAgQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBnZXRWaXNpdGVkTGlrZShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZyB1cmwpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDdXJzb3IgZ2V0VmlzaXRlZExpa2UoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmcgdXJsKSB7CiAgICAgICAgIGJvb2xlYW4gc2VjdXJlID0gZmFsc2U7CiAgICAgICAgIFN0cmluZyBjb21wYXJlU3RyaW5nID0gdXJsOwogICAgICAgICBpZiAoY29tcGFyZVN0cmluZy5zdGFydHNXaXRoKCJodHRwOi8vIikpIHsKQEAgLTIyOSwxNCArMjYyLDE0IEBACiAgICAgICAgIH0KICAgICAgICAgU3RyaW5nQnVpbGRlciB3aGVyZUNsYXVzZSA9IG51bGw7CiAgICAgICAgIGlmIChzZWN1cmUpIHsKLSAgICAgICAgICAgIHdoZXJlQ2xhdXNlID0gbmV3IFN0cmluZ0J1aWxkZXIoQm9va21hcmtDb2x1bW5zLlVSTCArICIgPSAiKTsKKyAgICAgICAgICAgIHdoZXJlQ2xhdXNlID0gbmV3IFN0cmluZ0J1aWxkZXIoQm9va21hcmtzLlVSTCArICIgPSAiKTsKICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYXBwZW5kRXNjYXBlZFNRTFN0cmluZyh3aGVyZUNsYXVzZSwKICAgICAgICAgICAgICAgICAgICAgImh0dHBzOi8vIiArIGNvbXBhcmVTdHJpbmcpOwogICAgICAgICAgICAgYWRkT3JVcmxFcXVhbHMod2hlcmVDbGF1c2UpOwogICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5hcHBlbmRFc2NhcGVkU1FMU3RyaW5nKHdoZXJlQ2xhdXNlLAogICAgICAgICAgICAgICAgICAgICAiaHR0cHM6Ly93d3cuIiArIGNvbXBhcmVTdHJpbmcpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd2hlcmVDbGF1c2UgPSBuZXcgU3RyaW5nQnVpbGRlcihCb29rbWFya0NvbHVtbnMuVVJMICsgIiA9ICIpOworICAgICAgICAgICAgd2hlcmVDbGF1c2UgPSBuZXcgU3RyaW5nQnVpbGRlcihCb29rbWFya3MuVVJMICsgIiA9ICIpOwogICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5hcHBlbmRFc2NhcGVkU1FMU3RyaW5nKHdoZXJlQ2xhdXNlLAogICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyaW5nKTsKICAgICAgICAgICAgIGFkZE9yVXJsRXF1YWxzKHdoZXJlQ2xhdXNlKTsKQEAgLTI1MCw3ICsyODMsNyBAQAogICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5hcHBlbmRFc2NhcGVkU1FMU3RyaW5nKHdoZXJlQ2xhdXNlLAogICAgICAgICAgICAgICAgICAgICAiaHR0cDovLyIgKyB3d3dTdHJpbmcpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjci5xdWVyeShCT09LTUFSS1NfVVJJLCBISVNUT1JZX1BST0pFQ1RJT04sCisgICAgICAgIHJldHVybiBjci5xdWVyeShIaXN0b3J5LkNPTlRFTlRfVVJJLCBuZXcgU3RyaW5nW10geyBIaXN0b3J5Ll9JRCwgSGlzdG9yeS5WSVNJVFMgfSwKICAgICAgICAgICAgICAgICB3aGVyZUNsYXVzZS50b1N0cmluZygpLCBudWxsLCBudWxsKTsKICAgICB9CiAKQEAgLTI2NiwyNiArMjk5LDI0IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHVwZGF0ZVZpc2l0ZWRIaXN0b3J5KENvbnRlbnRSZXNvbHZlciBjciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCwgYm9vbGVhbiByZWFsKSB7Ci0gICAgICAgIGxvbmcgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CisgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgIEN1cnNvciBjID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGMgPSBnZXRWaXNpdGVkTGlrZShjciwgdXJsKTsKICAgICAgICAgICAgIC8qIFdlIHNob3VsZCBvbmx5IGdldCBvbmUgYW5zd2VyIHRoYXQgaXMgZXhhY3RseSB0aGUgc2FtZS4gKi8KICAgICAgICAgICAgIGlmIChjLm1vdmVUb0ZpcnN0KCkpIHsKLSAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIG1hcCA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwogICAgICAgICAgICAgICAgIGlmIChyZWFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLlZJU0lUUywgYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbnQoSElTVE9SWV9QUk9KRUNUSU9OX1ZJU0lUU19JTkRFWCkgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChIaXN0b3J5LlZJU0lUUywgYy5nZXRJbnQoMSkgKyAxKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5VU0VSX0VOVEVSRUQsIDEpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEhpc3RvcnkuVVNFUl9FTlRFUkVELCAxKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuREFURSwgbm93KTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0aW9uID0gbmV3IFN0cmluZ1tdCi0gICAgICAgICAgICAgICAgICAgICAgICB7IEludGVnZXIudmFsdWVPZihjLmdldEludCgwKSkudG9TdHJpbmcoKSB9OwotICAgICAgICAgICAgICAgIGNyLnVwZGF0ZShCT09LTUFSS1NfVVJJLCBtYXAsICJfaWQgPSA/IiwgcHJvamVjdGlvbik7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChIaXN0b3J5LkRBVEVfTEFTVF9WSVNJVEVELCBub3cpOworICAgICAgICAgICAgICAgIGNyLnVwZGF0ZShDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChIaXN0b3J5LkNPTlRFTlRfVVJJLCBjLmdldExvbmcoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCBudWxsLCBudWxsKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdHJ1bmNhdGVIaXN0b3J5KGNyKTsKLSAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIG1hcCA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwogICAgICAgICAgICAgICAgIGludCB2aXNpdHM7CiAgICAgICAgICAgICAgICAgaW50IHVzZXJfZW50ZXJlZDsKICAgICAgICAgICAgICAgICBpZiAocmVhbCkgewpAQCAtMjk1LDE0ICszMjYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgdmlzaXRzID0gMDsKICAgICAgICAgICAgICAgICAgICAgdXNlcl9lbnRlcmVkID0gMTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuVVJMLCB1cmwpOwotICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLlZJU0lUUywgdmlzaXRzKTsKLSAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5EQVRFLCBub3cpOwotICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLkJPT0tNQVJLLCAwKTsKLSAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5USVRMRSwgdXJsKTsKLSAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5DUkVBVEVELCAwKTsKLSAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5VU0VSX0VOVEVSRUQsIHVzZXJfZW50ZXJlZCk7Ci0gICAgICAgICAgICAgICAgY3IuaW5zZXJ0KEJPT0tNQVJLU19VUkksIG1hcCk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChIaXN0b3J5LlVSTCwgdXJsKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEhpc3RvcnkuVklTSVRTLCB2aXNpdHMpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoSGlzdG9yeS5EQVRFX0xBU1RfVklTSVRFRCwgbm93KTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEhpc3RvcnkuVElUTEUsIHVybCk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChIaXN0b3J5LkRBVEVfQ1JFQVRFRCwgMCk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChIaXN0b3J5LlVTRVJfRU5URVJFRCwgdXNlcl9lbnRlcmVkKTsKKyAgICAgICAgICAgICAgICBjci5pbnNlcnQoSGlzdG9yeS5DT05URU5UX1VSSSwgdmFsdWVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKExPR1RBRywgInVwZGF0ZVZpc2l0ZWRIaXN0b3J5IiwgZSk7CkBAIC0zMjIsMTAgKzM1MiwxMCBAQAogICAgICAgICBTdHJpbmdbXSBzdHIgPSBudWxsOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3RyaW5nW10gcHJvamVjdGlvbiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgInVybCIKKyAgICAgICAgICAgICAgICAgICAgSGlzdG9yeS5VUkwsCiAgICAgICAgICAgICB9OwotICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KEJPT0tNQVJLU19VUkksIHByb2plY3Rpb24sICJ2aXNpdHMgPiAwIiwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICBjID0gY3IucXVlcnkoSGlzdG9yeS5DT05URU5UX1VSSSwgcHJvamVjdGlvbiwgSGlzdG9yeS5WSVNJVFMgKyAiID4gMCIsIG51bGwsIG51bGwpOworICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCkgcmV0dXJuIG5ldyBTdHJpbmdbMF07CiAgICAgICAgICAgICBzdHIgPSBuZXcgU3RyaW5nW2MuZ2V0Q291bnQoKV07CiAgICAgICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKQEAgLTM1MywzMSArMzgzLDI5IEBACiAgICAgICogQHBhcmFtIGNyIFRoZSBDb250ZW50UmVzb2x2ZXIgdXNlZCB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCB0cnVuY2F0ZUhpc3RvcnkoQ29udGVudFJlc29sdmVyIGNyKSB7Ci0gICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgLy8gVE9ETyBtYWtlIGEgc2luZ2xlIHJlcXVlc3QgdG8gdGhlIHByb3ZpZGVyIHRvIGRvIHRoaXMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24KKyAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG51bGw7CiAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAKICAgICAgICAgICAgIC8vIFNlbGVjdCBub24tYm9va21hcmsgaGlzdG9yeSwgb3JkZXJlZCBieSBkYXRlCi0gICAgICAgICAgICBjID0gY3IucXVlcnkoCi0gICAgICAgICAgICAgICAgICAgIEJPT0tNQVJLU19VUkksCi0gICAgICAgICAgICAgICAgICAgIFRSVU5DQVRFX0hJU1RPUllfUFJPSkVDVElPTiwKLSAgICAgICAgICAgICAgICAgICAgImJvb2ttYXJrID0gMCIsCi0gICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5EQVRFKTsKLSAgICAgICAgICAgIC8vIExvZy52KExPR1RBRywgImhpc3RvcnkgY291bnQgIiArIGMuY291bnQoKSk7Ci0gICAgICAgICAgICBpZiAoYy5tb3ZlVG9GaXJzdCgpICYmIGMuZ2V0Q291bnQoKSA+PSBNQVhfSElTVE9SWV9DT1VOVCkgeworICAgICAgICAgICAgY3Vyc29yID0gY3IucXVlcnkoSGlzdG9yeS5DT05URU5UX1VSSSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSGlzdG9yeS5fSUQsIEhpc3RvcnkuVVJMLCBIaXN0b3J5LkRBVEVfTEFTVF9WSVNJVEVEIH0sCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIEhpc3RvcnkuREFURV9MQVNUX1ZJU0lURUQgKyAiIEFTQyIpOworCisgICAgICAgICAgICBpZiAoY3Vyc29yLm1vdmVUb0ZpcnN0KCkgJiYgY3Vyc29yLmdldENvdW50KCkgPj0gTUFYX0hJU1RPUllfQ09VTlQpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBXZWJJY29uRGF0YWJhc2UgaWNvbkRiID0gV2ViSWNvbkRhdGFiYXNlLmdldEluc3RhbmNlKCk7CiAgICAgICAgICAgICAgICAgLyogZWxpbWluYXRlIG9sZGVzdCBoaXN0b3J5IGl0ZW1zICovCiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBUUlVOQ0FURV9OX09MREVTVDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIExvZy52KExPR1RBRywgInRydW5jYXRlIGhpc3RvcnkgIiArCi0gICAgICAgICAgICAgICAgICAgIC8vIGMuZ2V0SW50KFRSVU5DQVRFX0hJU1RPUllfUFJPSkVDVElPTl9JRF9JTkRFWCkpOwotICAgICAgICAgICAgICAgICAgICBjci5kZWxldGUoQk9PS01BUktTX1VSSSwgIl9pZCA9ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuZ2V0SW50KFRSVU5DQVRFX0hJU1RPUllfUFJPSkVDVElPTl9JRF9JTkRFWCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYy5tb3ZlVG9OZXh0KCkpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjci5kZWxldGUoQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoSGlzdG9yeS5DT05URU5UX1VSSSwgY3Vyc29yLmdldExvbmcoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBpY29uRGIucmVsZWFzZUljb25Gb3JQYWdlVXJsKGN1cnNvci5nZXRTdHJpbmcoMSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5tb3ZlVG9OZXh0KCkpIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKExPR1RBRywgInRydW5jYXRlSGlzdG9yeSIsIGUpOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgYy5jbG9zZSgpOworICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSBjdXJzb3IuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzg4LDIzICs0MTYsMTcgQEAKICAgICAgKiBAcmV0dXJuIGJvb2xlYW4gIFRydWUgaWYgdGhlIGhpc3RvcnkgY2FuIGJlIGNsZWFyZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGNhbkNsZWFySGlzdG9yeShDb250ZW50UmVzb2x2ZXIgY3IpIHsKLSAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICBDdXJzb3IgY3Vyc29yID0gbnVsbDsKICAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGMgPSBjci5xdWVyeSgKLSAgICAgICAgICAgICAgICBCT09LTUFSS1NfVVJJLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcgW10geyBCb29rbWFya0NvbHVtbnMuX0lELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLkJPT0tNQVJLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuVklTSVRTIH0sCi0gICAgICAgICAgICAgICAgImJvb2ttYXJrID0gMCBPUiB2aXNpdHMgPiAwIiwgCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIHJldCA9IGMubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgICAgIGN1cnNvciA9IGNyLnF1ZXJ5KEhpc3RvcnkuQ09OVEVOVF9VUkksCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZyBbXSB7IEhpc3RvcnkuX0lELCBIaXN0b3J5LlZJU0lUUyB9LAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgcmV0ID0gY3Vyc29yLmdldENvdW50KCkgPiAwOwogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiY2FuQ2xlYXJIaXN0b3J5IiwgZSk7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIGN1cnNvci5jbG9zZSgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQpAQCAtNDIwLDY3ICs0NDIsMzYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGVsZXRlIGFsbCBoaXN0b3J5IGl0ZW1zIGFuZCByZXZlcnQgYWxsCi0gICAgICogYm9va21hcmtzIHRvIHplcm8gdmlzaXRzIHdoaWNoIG1lZXQgdGhlIGNyaXRlcmlhIHByb3ZpZGVkLgotICAgICAqICBSZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfSElTVE9SWV9CT09LTUFSS1N9Ci0gICAgICogIFJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jV1JJVEVfSElTVE9SWV9CT09LTUFSS1N9CisgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGRlbGV0ZSBhbGwgaGlzdG9yeSBpdGVtcyBhbmQgcmVsZWFzZSB0aGUgaWNvbnMgZm9yIHRoZW0gaW4gdGhlCisgICAgICoge0BsaW5rIFdlYkljb25EYXRhYmFzZX0uCisgICAgICoKKyAgICAgKiBSZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfSElTVE9SWV9CT09LTUFSS1N9CisgICAgICogUmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNXUklURV9ISVNUT1JZX0JPT0tNQVJLU30KKyAgICAgKgogICAgICAqIEBwYXJhbSBjciAgIFRoZSBDb250ZW50UmVzb2x2ZXIgdXNlZCB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlLgogICAgICAqIEBwYXJhbSB3aGVyZUNsYXVzZSAgIFN0cmluZyB0byBsaW1pdCB0aGUgaXRlbXMgYWZmZWN0ZWQuCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgbnVsbCBtZWFucyBhbGwgaXRlbXMuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBkZWxldGVIaXN0b3J5V2hlcmUoQ29udGVudFJlc29sdmVyIGNyLAotICAgICAgICAgICAgU3RyaW5nIHdoZXJlQ2xhdXNlKSB7Ci0gICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGRlbGV0ZUhpc3RvcnlXaGVyZShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZyB3aGVyZUNsYXVzZSkgeworICAgICAgICBDdXJzb3IgY3Vyc29yID0gbnVsbDsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGMgPSBjci5xdWVyeShCT09LTUFSS1NfVVJJLAotICAgICAgICAgICAgICAgIEhJU1RPUllfUFJPSkVDVElPTiwKLSAgICAgICAgICAgICAgICB3aGVyZUNsYXVzZSwKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgaWYgKGMubW92ZVRvRmlyc3QoKSkgeworICAgICAgICAgICAgY3Vyc29yID0gY3IucXVlcnkoSGlzdG9yeS5DT05URU5UX1VSSSwgbmV3IFN0cmluZ1tdIHsgSGlzdG9yeS5VUkwgfSwgd2hlcmVDbGF1c2UsCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOworICAgICAgICAgICAgaWYgKGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgV2ViSWNvbkRhdGFiYXNlIGljb25EYiA9IFdlYkljb25EYXRhYmFzZS5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgIC8qIERlbGV0ZSBmYXZpY29ucywgYW5kIHJldmVydCBib29rbWFya3Mgd2hpY2ggaGF2ZSBiZWVuIHZpc2l0ZWQKLSAgICAgICAgICAgICAgICAgKiB0byBzaW1wbHkgYm9va21hcmtzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGZpcnN0VGltZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gYy5nZXRTdHJpbmcoSElTVE9SWV9QUk9KRUNUSU9OX1VSTF9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNCb29rbWFyayA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLmdldEludChISVNUT1JZX1BST0pFQ1RJT05fQk9PS01BUktfSU5ERVgpID09IDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0Jvb2ttYXJrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RUaW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIE9SICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIoIF9pZCA9ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMuZ2V0SW50KDApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiICkiKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGljb25EYi5yZWxlYXNlSWNvbkZvclBhZ2VVcmwodXJsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gd2hpbGUgKGMubW92ZVRvTmV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGVsZXRlIGZhdmljb25zCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gZG9uJ3QgcmVsZWFzZSBpZiB0aGUgVVJMIGlzIGJvb2ttYXJrZWQKKyAgICAgICAgICAgICAgICAgICAgaWNvbkRiLnJlbGVhc2VJY29uRm9yUGFnZVVybChjdXJzb3IuZ2V0U3RyaW5nKDApKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChjdXJzb3IubW92ZVRvTmV4dCgpKTsKIAotICAgICAgICAgICAgICAgIGlmICghZmlyc3RUaW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgbWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuVklTSVRTLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuREFURSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBTaG91bGQgSSBhbHNvIHJlbW92ZSB0aGUgdGl0bGU/ICovCi0gICAgICAgICAgICAgICAgICAgIGNyLnVwZGF0ZShCT09LTUFSS1NfVVJJLCBtYXAsIHNiLnRvU3RyaW5nKCksIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZyBkZWxldGVXaGVyZUNsYXVzZSA9IEJvb2ttYXJrQ29sdW1ucy5CT09LTUFSSyArICIgPSAwIjsKLSAgICAgICAgICAgICAgICBpZiAod2hlcmVDbGF1c2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkZWxldGVXaGVyZUNsYXVzZSArPSAiIEFORCAiICsgd2hlcmVDbGF1c2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNyLmRlbGV0ZShCT09LTUFSS1NfVVJJLCBkZWxldGVXaGVyZUNsYXVzZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgY3IuZGVsZXRlKEJPT0tNQVJLU19VUkksIHdoZXJlQ2xhdXNlLCBudWxsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKExPR1RBRywgImRlbGV0ZUhpc3RvcnlXaGVyZSIsIGUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgYy5jbG9zZSgpOworICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSBjdXJzb3IuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTIwLDEwICs1MTEsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBkZWxldGVGcm9tSGlzdG9yeShDb250ZW50UmVzb2x2ZXIgY3IsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihCb29rbWFya0NvbHVtbnMuVVJMICsgIiA9ICIpOwotICAgICAgICBEYXRhYmFzZVV0aWxzLmFwcGVuZEVzY2FwZWRTUUxTdHJpbmcoc2IsIHVybCk7Ci0gICAgICAgIFN0cmluZyBtYXRjaGVzVXJsID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgZGVsZXRlSGlzdG9yeVdoZXJlKGNyLCBtYXRjaGVzVXJsKTsKKyAgICAgICAgY3IuZGVsZXRlKEhpc3RvcnkuQ09OVEVOVF9VUkksIEhpc3RvcnkuVVJMICsgIj0/IiwgbmV3IFN0cmluZ1tdIHsgdXJsIH0pOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTM0LDcgKzUyMiw3IEBACiAgICAgICogQHBhcmFtIHNlYXJjaCAgICBUaGUgc3RyaW5nIHRvIGFkZCB0byB0aGUgc2VhcmNoZXMgZGF0YWJhc2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGFkZFNlYXJjaFVybChDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZyBzZWFyY2gpIHsKLSAgICAgICAgbG9uZyBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKKyAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KApAQCAtNTU4LDYgKzU0Niw3IEBACiAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CisKICAgICAvKioKICAgICAgKiBSZW1vdmUgYWxsIHNlYXJjaGVzIGZyb20gdGhlIHNlYXJjaCBkYXRhYmFzZS4KICAgICAgKiAgUmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNXUklURV9ISVNUT1JZX0JPT0tNQVJLU30KQEAgLTU5MCwzMSArNTc5LDkwIEBACiAgICAgICAgICAgICAgICAgLmJ1bGtSZXF1ZXN0SWNvbkZvclBhZ2VVcmwoY3IsIHdoZXJlLCBsaXN0ZW5lcik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29sdW1uIGRlZmluaXRpb25zIGZvciB0aGUgbWl4ZWQgYm9va21hcmsgYW5kIGhpc3RvcnkgaXRlbXMgYXZhaWxhYmxlCisgICAgICogYXQge0BsaW5rICNCT09LTUFSS1NfVVJJfS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJvb2ttYXJrQ29sdW1ucyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkwgb2YgdGhlIGJvb2ttYXJrIG9yIGhpc3RvcnkgaXRlbS4KKyAgICAgICAgICogPHA+VHlwZTogVEVYVCAoVVJMKTwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTCA9ICJ1cmwiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWUgdGhlIGl0ZW0gaGFzIGJlZW4gdmlzaXRlZC4KKyAgICAgICAgICogPHA+VHlwZTogTlVNQkVSPC9wPgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklTSVRTID0gInZpc2l0cyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkYXRlIHRoZSBpdGVtIHdhcyBsYXN0IHZpc2l0ZWQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2guCisgICAgICAgICAqIDxwPlR5cGU6IE5VTUJFUiAoZGF0ZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwKTwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEUgPSAiZGF0ZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZsYWcgaW5kaWNhdGluZyB0aGF0IGFuIGl0ZW0gaXMgYSBib29rbWFyay4gQSB2YWx1ZSBvZiAxIGluZGljYXRlcyBhIGJvb2ttYXJrLCBhIHZhbHVlCisgICAgICAgICAqIG9mIDAgaW5kaWNhdGVzIGEgaGlzdG9yeSBpdGVtLgorICAgICAgICAgKiA8cD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0tNQVJLID0gImJvb2ttYXJrIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVzZXIgdmlzaWJsZSB0aXRsZSBvZiB0aGUgYm9va21hcmsgb3IgaGlzdG9yeSBpdGVtLgorICAgICAgICAgKiA8cD5UeXBlOiBURVhUPC9wPgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAidGl0bGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgaXRlbSBjcmVhdGVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLgorICAgICAgICAgKiA8cD5UeXBlOiBOVU1CRVIgKGRhdGUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCk8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVEID0gImNyZWF0ZWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZmF2aWNvbiBvZiB0aGUgYm9va21hcmsuIE11c3QgZGVjb2RlIHZpYSB7QGxpbmsgQml0bWFwRmFjdG9yeSNkZWNvZGVCeXRlQXJyYXl9LgorICAgICAgICAgKiA8cD5UeXBlOiBCTE9CIChpbWFnZSk8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVZJQ09OID0gImZhdmljb24iOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhVTUJOQUlMID0gInRodW1ibmFpbCI7CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1VDSF9JQ09OID0gInRvdWNoX2ljb24iOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9FTlRFUkVEID0gInVzZXJfZW50ZXJlZCI7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29sdW1uIGRlZmluaXRpb25zIGZvciB0aGUgc2VhcmNoIGhpc3RvcnkgdGFibGUsIGF2YWlsYWJsZSBhdCB7QGxpbmsgI1NFQVJDSEVTX1VSSX0uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZWFyY2hDb2x1bW5zIGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogTm90IHVzZWQuCisgICAgICAgICAqIEBkZXByZWNhdGVkCisgICAgICAgICAqLworICAgICAgICBARGVwcmVjYXRlZAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkwgPSAidXJsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVzZXIgZW50ZXJlZCBzZWFyY2ggdGVybS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSCA9ICJzZWFyY2giOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgc2VhcmNoIHdhcyBwZXJmb3JtZWQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2guCisgICAgICAgICAqIDxwPlR5cGU6IE5VTUJFUiAoZGF0ZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwKTwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEUgPSAiZGF0ZSI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQnJvd3NlckNvbnRyYWN0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Ccm93c2VyQ29udHJhY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmJiZTY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQnJvd3NlckNvbnRyYWN0LmphdmEKQEAgLTAsMCArMSwzODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5wcm92aWRlcjsKKworaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyQ2xpZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJPcGVyYXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFVyaXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlN5bmNTdGF0ZUNvbnRyYWN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBCcm93c2VyQ29udHJhY3QgeworICAgIC8qKiBUaGUgYXV0aG9yaXR5IGZvciB0aGUgYnJvd3NlciBwcm92aWRlciAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWSA9ICJjb20uYW5kcm9pZC5icm93c2VyIjsKKworICAgIC8qKiBBIGNvbnRlbnQ6Ly8gc3R5bGUgdXJpIHRvIHRoZSBhdXRob3JpdHkgZm9yIHRoZSBicm93c2VyIHByb3ZpZGVyICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQVVUSE9SSVRZX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkpOworCisgICAgLyoqCisgICAgICogQW4gb3B0aW9uYWwgaW5zZXJ0LCB1cGRhdGUgb3IgZGVsZXRlIFVSSSBwYXJhbWV0ZXIgdGhhdCBhbGxvd3MgdGhlIGNhbGxlcgorICAgICAqIHRvIHNwZWNpZnkgdGhhdCBpdCBpcyBhIHN5bmMgYWRhcHRlci4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuIElmIHRydWUKKyAgICAgKiB0aGUgZGlydHkgZmxhZyBpcyBub3QgYXV0b21hdGljYWxseSBzZXQgYW5kIHRoZSAic3luY1RvTmV0d29yayIgcGFyYW1ldGVyCisgICAgICogaXMgc2V0IHRvIGZhbHNlIHdoZW4gY2FsbGluZworICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjbm90aWZ5Q2hhbmdlKGFuZHJvaWQubmV0LlVyaSwgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIsIGJvb2xlYW4pfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxMRVJfSVNfU1lOQ0FEQVBURVIgPSAiY2FsbGVyX2lzX3N5bmNhZGFwdGVyIjsKKworICAgIC8qKgorICAgICAqIEdlbmVyaWMgY29sdW1ucyBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuIFRoZSBzcGVjaWZpYyBmdW5jdGlvbnMgb2YKKyAgICAgKiB0aGVzZSBjb2x1bW5zIGFyZSBwcml2YXRlIHRvIHRoZSBzeW5jIGFkYXB0ZXIuIE90aGVyIGNsaWVudHMgb2YgdGhlIEFQSQorICAgICAqIHNob3VsZCBub3QgYXR0ZW1wdCB0byBlaXRoZXIgcmVhZCBvciB3cml0ZSB0aGVzZSBjb2x1bW5zLgorICAgICAqLworICAgIGludGVyZmFjZSBCYXNlU3luY0NvbHVtbnMgeworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DMSA9ICJzeW5jMSI7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkMyID0gInN5bmMyIjsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzMgPSAic3luYzMiOworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DNCA9ICJzeW5jNCI7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkM1ID0gInN5bmM1IjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBkZWZpbml0aW9ucyBmb3IgdXNlIGluIGltcGxlbWVudGluZyBjaHJvbWUgYm9va21hcmtzIHN5bmMgaW4gdGhlIEJvb2ttYXJrcyB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENocm9tZVN5bmNDb2x1bW5zIHsKKyAgICAgICAgcHJpdmF0ZSBDaHJvbWVTeW5jQ29sdW1ucygpIHt9CisKKyAgICAgICAgLyoqIFRoZSBzZXJ2ZXIgdW5pcXVlIElEIGZvciBhbiBpdGVtICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9VTklRVUUgPSBCYXNlU3luY0NvbHVtbnMuU1lOQzM7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9MREVSX05BTUVfUk9PVCA9ICJnb29nbGVfY2hyb21lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9MREVSX05BTUVfQk9PS01BUktTID0gImdvb2dsZV9jaHJvbWVfYm9va21hcmtzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9MREVSX05BTUVfQk9PS01BUktTX0JBUiA9ICJib29rbWFya19iYXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT0xERVJfTkFNRV9PVEhFUl9CT09LTUFSS1MgPSAib3RoZXJfYm9va21hcmtzIjsKKyAgICAgICAgCisgICAgICAgIC8qKiBUaGUgY2xpZW50IHVuaXF1ZSBJRCBmb3IgYW4gaXRlbSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfVU5JUVVFID0gQmFzZVN5bmNDb2x1bW5zLlNZTkM0OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb2x1bW5zIHRoYXQgYXBwZWFyIHdoZW4gZWFjaCByb3cgb2YgYSB0YWJsZSBiZWxvbmdzIHRvIGEgc3BlY2lmaWMKKyAgICAgKiBhY2NvdW50LCBpbmNsdWRpbmcgc3luYyBpbmZvcm1hdGlvbiB0aGF0IGFuIGFjY291bnQgbWF5IG5lZWQuCisgICAgICovCisgICAgaW50ZXJmYWNlIFN5bmNDb2x1bW5zIGV4dGVuZHMgQmFzZVN5bmNDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGluc3RhbmNlIHRvIHdoaWNoIHRoaXMgcm93IGJlbG9uZ3MsIHdoaWNoIHdoZW4gcGFpcmVkIHdpdGgKKyAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX1RZUEV9IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBhY2NvdW50LgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9OQU1FID0gImFjY291bnRfbmFtZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0eXBlIG9mIGFjY291bnQgdG8gd2hpY2ggdGhpcyByb3cgYmVsb25ncywgd2hpY2ggd2hlbiBwYWlyZWQgd2l0aAorICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfTkFNRX0gaWRlbnRpZmllcyBhIHNwZWNpZmljIGFjY291bnQuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEUgPSAiYWNjb3VudF90eXBlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogU3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIHJvdyB0byBpdHMgc291cmNlIGFjY291bnQuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfSUQgPSAic291cmNlaWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBWZXJzaW9uIG51bWJlciB0aGF0IGlzIHVwZGF0ZWQgd2hlbmV2ZXIgdGhpcyByb3cgb3IgaXRzIHJlbGF0ZWQgZGF0YQorICAgICAgICAgKiBjaGFuZ2VzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICJ2ZXJzaW9uIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRmxhZyBpbmRpY2F0aW5nIHRoYXQge0BsaW5rICNWRVJTSU9OfSBoYXMgY2hhbmdlZCwgYW5kIHRoaXMgcm93IG5lZWRzCisgICAgICAgICAqIHRvIGJlIHN5bmNocm9uaXplZCBieSBpdHMgb3duaW5nIGFjY291bnQuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSVFkgPSAiZGlydHkiOworICAgIH0KKworICAgIGludGVyZmFjZSBCb29rbWFya0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVuaXF1ZSBJRCBmb3IgYSByb3cuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX0lEID0gIl9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkwgb2YgdGhlIGJvb2ttYXJrLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChVUkwpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMID0gInVybCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1c2VyIHZpc2libGUgdGl0bGUgb2YgdGhlIGJvb2ttYXJrLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAidGl0bGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZmF2aWNvbiBvZiB0aGUgYm9va21hcmssIG1heSBiZSBOVUxMLgorICAgICAgICAgKiBNdXN0IGRlY29kZSB2aWEge0BsaW5rIEJpdG1hcEZhY3RvcnkjZGVjb2RlQnl0ZUFycmF5fS4KKyAgICAgICAgICogPHA+VHlwZTogQkxPQiAoaW1hZ2UpPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFWSUNPTiA9ICJmYXZpY29uIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQSB0aHVtYm5haWwgb2YgdGhlIHBhZ2UsbWF5IGJlIE5VTEwuCisgICAgICAgICAqIE11c3QgZGVjb2RlIHZpYSB7QGxpbmsgQml0bWFwRmFjdG9yeSNkZWNvZGVCeXRlQXJyYXl9LgorICAgICAgICAgKiA8cD5UeXBlOiBCTE9CIChpbWFnZSk8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQk5BSUwgPSAidGh1bWJuYWlsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRvdWNoIGljb24gZm9yIHRoZSB3ZWIgcGFnZSwgbWF5IGJlIE5VTEwuCisgICAgICAgICAqIE11c3QgZGVjb2RlIHZpYSB7QGxpbmsgQml0bWFwRmFjdG9yeSNkZWNvZGVCeXRlQXJyYXl9LgorICAgICAgICAgKiA8cD5UeXBlOiBCTE9CIChpbWFnZSk8L3A+CisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1VDSF9JQ09OID0gInRvdWNoX2ljb24iOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBib29rbWFya3MgdGFibGUsIHdoaWNoIGhvbGRzIHRoZSB1c2VyJ3MgYnJvd3NlciBib29rbWFya3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCb29rbWFya3MgaW1wbGVtZW50cyBCb29rbWFya0NvbHVtbnMsIFN5bmNDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgdXRpbGl0eSBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBCb29rbWFya3MoKSB7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHRoaXMgdGFibGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLndpdGhBcHBlbmRlZFBhdGgoQVVUSE9SSVRZX1VSSSwgImJvb2ttYXJrcyIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHRoZSBkZWZhdWx0IGZvbGRlcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUklfREVGQVVMVF9GT0xERVIgPQorICAgICAgICAgICAgICAgIFVyaS53aXRoQXBwZW5kZWRQYXRoKENPTlRFTlRfVVJJLCAiZm9sZGVyIik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkcyBhIFVSSSB0aGF0IHBvaW50cyB0byBhIHNwZWNpZmljIGZvbGRlci4KKyAgICAgICAgICogQHBhcmFtIGZvbGRlcklkIHRoZSBJRCBvZiB0aGUgZm9sZGVyIHRvIHBvaW50IHRvCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBidWlsZEZvbGRlclVyaShsb25nIGZvbGRlcklkKSB7CisgICAgICAgICAgICByZXR1cm4gQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoQ09OVEVOVF9VUklfREVGQVVMVF9GT0xERVIsIGZvbGRlcklkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIHtAbGluayAjQ09OVEVOVF9VUkl9IHByb3ZpZGluZyBhIGRpcmVjdG9yeSBvZiBib29rbWFya3MuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSAidm5kLmFuZHJvaWQuY3Vyc29yLmRpci9ib29rbWFyayI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2YgYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBvZiBhIHNpbmdsZSBib29rbWFyay4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFID0gInZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL2Jvb2ttYXJrIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogUXVlcnkgcGFyYW1ldGVyIHRvIHVzZSBpZiB5b3Ugd2FudCB0byBzZWUgZGVsZXRlZCBib29rbWFya3MgdGhhdCBhcmUgc3RpbGwKKyAgICAgICAgICogYXJvdW5kIG9uIHRoZSBkZXZpY2UgYW5kIGhhdmVuJ3QgYmVlbiBzeW5jZWQgeWV0LgorICAgICAgICAgKiBAc2VlICNJU19ERUxFVEVECisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9QQVJBTUVURVJfU0hPV19ERUxFVEVEID0gInNob3dfZGVsZXRlZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZsYWcgaW5kaWNhdGluZyBpZiBhbiBpdGVtIGlzIGEgZm9sZGVyIG9yIGJvb2ttYXJrLiBOb24temVybyB2YWx1ZXMgaW5kaWNhdGUKKyAgICAgICAgICogYSBmb2xkZXIgYW5kIHplcm8gaW5kaWNhdGVzIGEgYm9va21hcmsuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfRk9MREVSID0gImZvbGRlciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgcGFyZW50IGZvbGRlci4gSUQgMCBpcyB0aGUgcm9vdCBmb2xkZXIuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKHJlZmVyZW5jZSB0byBpdGVtIGluIHRoZSBzYW1lIHRhYmxlKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVCA9ICJwYXJlbnQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcG9zaXRpb24gb2YgdGhlIGJvb2ttYXJrIGluIHJlbGF0aW9uIHRvIGl0J3Mgc2libGluZ3MgdGhhdCBzaGFyZSB0aGUgc2FtZQorICAgICAgICAgKiB7QGxpbmsgI1BBUkVOVH0uIE1heSBiZSBuZWdhdGl2ZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU0lUSU9OID0gInBvc2l0aW9uIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGl0ZW0gdGhhdCB0aGUgYm9va21hcmsgc2hvdWxkIGJlIGluc2VydGVkIGFmdGVyLgorICAgICAgICAgKiBNYXkgYmUgbmVnYXRpdmUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNFUlRfQUZURVIgPSAiaW5zZXJ0X2FmdGVyIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQSBmbGFnIHRvIGluZGljYXRlIGlmIGFuIGl0ZW0gaGFzIGJlZW4gZGVsZXRlZC4gUXVlcmllcyB3aWxsIG5vdCByZXR1cm4gZGVsZXRlZAorICAgICAgICAgKiBlbnRyaWVzIHVubGVzcyB5b3UgYWRkIHRoZSB7QGxpbmsgI1FVRVJZX1BBUkFNRVRFUl9TSE9XX0RFTEVURUR9IHF1ZXJ5IHBhcmFtdGVyCisgICAgICAgICAqIHRvIHRoZSBVUkkgd2hlbiBwZXJmb3JtaW5nIHlvdXIgcXVlcnkuCisgICAgICAgICAqIDxwPlR5cGU6IElOVEVHRVIgKG5vbi16ZXJvIGlmIHRoZSBpdGVtIGhhcyBiZWVuIGRlbGV0ZWQsIHplcm8gaWYgaXQgaGFzbid0KQorICAgICAgICAgKiBAc2VlICNRVUVSWV9QQVJBTUVURVJfU0hPV19ERUxFVEVECisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19ERUxFVEVEID0gImRlbGV0ZWQiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBoaXN0b3J5IHRhYmxlLCB3aGljaCBob2xkcyB0aGUgYnJvd3NpbmcgaGlzdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEhpc3RvcnkgaW1wbGVtZW50cyBCb29rbWFya0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyB1dGlsaXR5IGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIEhpc3RvcnkoKSB7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHRoaXMgdGFibGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLndpdGhBcHBlbmRlZFBhdGgoQVVUSE9SSVRZX1VSSSwgImhpc3RvcnkiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiB7QGxpbmsgI0NPTlRFTlRfVVJJfSBwcm92aWRpbmcgYSBkaXJlY3Rvcnkgb2YgYnJvd3NlciBoaXN0b3J5IGl0ZW1zLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFID0gInZuZC5hbmRyb2lkLmN1cnNvci5kaXIvYnJvd3Nlci1oaXN0b3J5IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiBhIHtAbGluayAjQ09OVEVOVF9VUkl9IG9mIGEgc2luZ2xlIGJyb3dzZXIgaGlzdG9yeSBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9JVEVNX1RZUEUgPSAidm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vYnJvd3Nlci1oaXN0b3J5IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhdGUgdGhlIGl0ZW0gd2FzIGxhc3QgdmlzaXRlZCwgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaC4KKyAgICAgICAgICogPHA+VHlwZTogSU5URUdFUiAoZGF0ZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwKTwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfTEFTVF9WSVNJVEVEID0gImRhdGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgaXRlbSBjcmVhdGVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLgorICAgICAgICAgKiA8cD5UeXBlOiBOVU1CRVIgKGRhdGUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCk8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFX0NSRUFURUQgPSAiY3JlYXRlZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGl0ZW0gaGFzIGJlZW4gdmlzaXRlZC4KKyAgICAgICAgICogPHA+VHlwZTogSU5URUdFUjwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJU0lUUyA9ICJ2aXNpdHMiOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfRU5URVJFRCA9ICJ1c2VyX2VudGVyZWQiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzZWFyY2ggaGlzdG9yeSB0YWJsZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU2VhcmNoZXMgeworICAgICAgICBwcml2YXRlIFNlYXJjaGVzKCkge30KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJJIGZvciB0aGlzIHRhYmxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKEFVVEhPUklUWV9VUkksICJzZWFyY2hlcyIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIHtAbGluayAjQ09OVEVOVF9VUkl9IHByb3ZpZGluZyBhIGRpcmVjdG9yeSBvZiBicm93c2VyIHNlYXJjaCBpdGVtcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRSA9ICJ2bmQuYW5kcm9pZC5jdXJzb3IuZGlyL3NlYXJjaGVzIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiBhIHtAbGluayAjQ09OVEVOVF9VUkl9IG9mIGEgc2luZ2xlIGJyb3dzZXIgc2VhcmNoIGl0ZW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0lURU1fVFlQRSA9ICJ2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS9zZWFyY2hlcyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1bmlxdWUgSUQgZm9yIGEgcm93LgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9JRCA9ICJfaWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdXNlciBlbnRlcmVkIHNlYXJjaCB0ZXJtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VBUkNIID0gInNlYXJjaCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkYXRlIHRoZSBzZWFyY2ggd2FzIHBlcmZvcm1lZCwgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaC4KKyAgICAgICAgICogPHA+VHlwZTogTlVNQkVSIChkYXRlIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzApPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFURSA9ICJkYXRlIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHRhYmxlIHByb3ZpZGVkIGZvciBzeW5jIGFkYXB0ZXJzIHRvIHVzZSBmb3Igc3RvcmluZyBwcml2YXRlIHN5bmMgc3RhdGUgZGF0YS4KKyAgICAgKgorICAgICAqIEBzZWUgU3luY1N0YXRlQ29udHJhY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFN5bmNTdGF0ZSBpbXBsZW1lbnRzIFN5bmNTdGF0ZUNvbnRyYWN0LkNvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyB1dGlsaXR5IGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgU3luY1N0YXRlKCkge30KKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0RJUkVDVE9SWSA9CisgICAgICAgICAgICAgICAgU3luY1N0YXRlQ29udHJhY3QuQ29uc3RhbnRzLkNPTlRFTlRfRElSRUNUT1JZOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHRoaXMgdGFibGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0KKyAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChBVVRIT1JJVFlfVVJJLCBDT05URU5UX0RJUkVDVE9SWSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgYW5kcm9pZC5wcm92aWRlci5TeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzI2dldAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gZ2V0KENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlciwgQWNjb3VudCBhY2NvdW50KQorICAgICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIFN5bmNTdGF0ZUNvbnRyYWN0LkhlbHBlcnMuZ2V0KHByb3ZpZGVyLCBDT05URU5UX1VSSSwgYWNjb3VudCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhbmRyb2lkLnByb3ZpZGVyLlN5bmNTdGF0ZUNvbnRyYWN0LkhlbHBlcnMjZ2V0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFBhaXI8VXJpLCBieXRlW10+IGdldFdpdGhVcmkoQ29udGVudFByb3ZpZGVyQ2xpZW50IHByb3ZpZGVyLCBBY2NvdW50IGFjY291bnQpCisgICAgICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gU3luY1N0YXRlQ29udHJhY3QuSGVscGVycy5nZXRXaXRoVXJpKHByb3ZpZGVyLCBDT05URU5UX1VSSSwgYWNjb3VudCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhbmRyb2lkLnByb3ZpZGVyLlN5bmNTdGF0ZUNvbnRyYWN0LkhlbHBlcnMjc2V0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0KENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlciwgQWNjb3VudCBhY2NvdW50LCBieXRlW10gZGF0YSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN5bmNTdGF0ZUNvbnRyYWN0LkhlbHBlcnMuc2V0KHByb3ZpZGVyLCBDT05URU5UX1VSSSwgYWNjb3VudCwgZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhbmRyb2lkLnByb3ZpZGVyLlN5bmNTdGF0ZUNvbnRyYWN0LkhlbHBlcnMjbmV3U2V0T3BlcmF0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbiBuZXdTZXRPcGVyYXRpb24oQWNjb3VudCBhY2NvdW50LCBieXRlW10gZGF0YSkgeworICAgICAgICAgICAgcmV0dXJuIFN5bmNTdGF0ZUNvbnRyYWN0LkhlbHBlcnMubmV3U2V0T3BlcmF0aW9uKENPTlRFTlRfVVJJLCBhY2NvdW50LCBkYXRhKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhci5qYXZhCmluZGV4IDlhMDk4MDUuLmE2Mzk0ZTUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIuamF2YQpAQCAtNzYsMTEgKzc2LDEwNiBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTExFUl9JU19TWU5DQURBUFRFUiA9ICJjYWxsZXJfaXNfc3luY2FkYXB0ZXIiOwogCisKKyAgICAvKioKKyAgICAgKiBHZW5lcmljIGNvbHVtbnMgZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiBUaGUgc3BlY2lmaWMgZnVuY3Rpb25zIG9mCisgICAgICogdGhlc2UgY29sdW1ucyBhcmUgcHJpdmF0ZSB0byB0aGUgc3luYyBhZGFwdGVyLiBPdGhlciBjbGllbnRzIG9mIHRoZSBBUEkKKyAgICAgKiBzaG91bGQgbm90IGF0dGVtcHQgdG8gZWl0aGVyIHJlYWQgb3Igd3JpdGUgdGhpcyBjb2x1bW4uCisgICAgICovCisgICAgcHJvdGVjdGVkIGludGVyZmFjZSBCYXNlU3luY0NvbHVtbnMgeworCisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkMxID0gInN5bmMxIjsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzIgPSAic3luYzIiOworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DMyA9ICJzeW5jMyI7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkM0ID0gInN5bmM0IjsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzUgPSAic3luYzUiOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbHVtbnMgZm9yIFN5bmMgaW5mb3JtYXRpb24gdXNlZCBieSBDYWxlbmRhcnMgYW5kIEV2ZW50cyB0YWJsZXMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBTeW5jQ29sdW1ucyBleHRlbmRzIEJhc2VTeW5jQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYWNjb3VudCB0aGF0IHdhcyB1c2VkIHRvIHN5bmMgdGhlIGVudHJ5IHRvIHRoZSBkZXZpY2UuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19BQ0NPVU5UID0gIl9zeW5jX2FjY291bnQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdHlwZSBvZiB0aGUgYWNjb3VudCB0aGF0IHdhcyB1c2VkIHRvIHN5bmMgdGhlIGVudHJ5IHRvIHRoZSBkZXZpY2UuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19BQ0NPVU5UX1RZUEUgPSAiX3N5bmNfYWNjb3VudF90eXBlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVuaXF1ZSBJRCBmb3IgYSByb3cgYXNzaWduZWQgYnkgdGhlIHN5bmMgc291cmNlLiBOVUxMIGlmIHRoZSByb3cgaGFzIG5ldmVyIGJlZW4gc3luY2VkLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfSUQgPSAiX3N5bmNfaWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbGFzdCB0aW1lLCBmcm9tIHRoZSBzeW5jIHNvdXJjZSdzIHBvaW50IG9mIHZpZXcsIHRoYXQgdGhpcyByb3cgaGFzIGJlZW4gc3luY2hyb25pemVkLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX1RJTUUgPSAiX3N5bmNfdGltZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSByb3csIGFzIGFzc2lnbmVkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19WRVJTSU9OID0gIl9zeW5jX3ZlcnNpb24iOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGb3IgdXNlIGJ5IHN5bmMgYWRhcHRlciBhdCBpdHMgZGlzY3JldGlvbjsgbm90IG1vZGlmaWVkIGJ5IENhbGVuZGFyUHJvdmlkZXIKKyAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgY29sdW1uIHdhcyBmb3JtZXJseSBuYW1lZCBfU1lOQ19MT0NBTF9JRC4gIFdlIGFyZSB1c2luZyBpdCB0byBhdm9pZCBhCisgICAgICAgICAqIHNjaGVtYSBjaGFuZ2UuCisgICAgICAgICAqIFRPRE8gUmVwbGFjZSB0aGlzIHdpdGggc29tZXRoaW5nIG1vcmUgZ2VuZXJhbCBpbiB0aGUgZnV0dXJlLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0RBVEEgPSAiX3N5bmNfbG9jYWxfaWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2VkIG9ubHkgaW4gcGVyc2lzdGVudCBwcm92aWRlcnMsIGFuZCBvbmx5IGR1cmluZyBtZXJnaW5nLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX01BUksgPSAiX3N5bmNfbWFyayI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCBsb2NhbCwgdW5zeW5jZWQsIGNoYW5nZXMgYXJlIHByZXNlbnQuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfRElSVFkgPSAiX3N5bmNfZGlydHkiOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sdW1ucyBmcm9tIHRoZSBBY2NvdW50IGluZm9ybWF0aW9uIHVzZWQgYnkgQ2FsZW5kYXJzIGFuZCBFdmVudHMgdGFibGVzLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgQWNjb3VudENvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgaW5zdGFuY2UgdG8gd2hpY2ggdGhpcyByb3cgYmVsb25ncywgd2hpY2ggd2hlbiBwYWlyZWQgd2l0aAorICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfVFlQRX0gaWRlbnRpZmllcyBhIHNwZWNpZmljIGFjY291bnQuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX05BTUUgPSAiYWNjb3VudF9uYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGUgb2YgYWNjb3VudCB0byB3aGljaCB0aGlzIHJvdyBiZWxvbmdzLCB3aGljaCB3aGVuIHBhaXJlZCB3aXRoCisgICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9OQU1FfSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYWNjb3VudC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfVFlQRSA9ICJhY2NvdW50X3R5cGUiOworICAgIH0KKwogICAgIC8qKgogICAgICAqIENvbHVtbnMgZnJvbSB0aGUgQ2FsZW5kYXJzIHRhYmxlIHRoYXQgb3RoZXIgdGFibGVzIGpvaW4gaW50byB0aGVtc2VsdmVzLgogICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2FsZW5kYXJzQ29sdW1ucwotICAgIHsKKyAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGVuZGFyc0NvbHVtbnMgewogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGNvbG9yIG9mIHRoZSBjYWxlbmRhcgogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChjb2xvciB2YWx1ZSk8L1A+CkBAIC0xMzUsNzUgKzIzMCwxMDMgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ19TVEFURSA9ICJzeW5jX3N0YXRlIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGFjY291bnQgdGhhdCB3YXMgdXNlZCB0byBzeW5jIHRoZSBlbnRyeSB0byB0aGUgZGV2aWNlLgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKiBXaGV0aGVyIHRoZSByb3cgaGFzIGJlZW4gZGVsZXRlZC4gIEEgZGVsZXRlZCByb3cgc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfQUNDT1VOVCA9ICJfc3luY19hY2NvdW50IjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHR5cGUgb2YgdGhlIGFjY291bnQgdGhhdCB3YXMgdXNlZCB0byBzeW5jIHRoZSBlbnRyeSB0byB0aGUgZGV2aWNlLgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfQUNDT1VOVF9UWVBFID0gIl9zeW5jX2FjY291bnRfdHlwZSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB1bmlxdWUgSUQgZm9yIGEgcm93IGFzc2lnbmVkIGJ5IHRoZSBzeW5jIHNvdXJjZS4gTlVMTCBpZiB0aGUgcm93IGhhcyBuZXZlciBiZWVuIHN5bmNlZC4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0lEID0gIl9zeW5jX2lkIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGxhc3QgdGltZSwgZnJvbSB0aGUgc3luYyBzb3VyY2UncyBwb2ludCBvZiB2aWV3LCB0aGF0IHRoaXMgcm93IGhhcyBiZWVuIHN5bmNocm9uaXplZC4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19USU1FID0gIl9zeW5jX3RpbWUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcm93LCBhcyBhc3NpZ25lZCBieSB0aGUgc2VydmVyLgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfVkVSU0lPTiA9ICJfc3luY192ZXJzaW9uIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogRm9yIHVzZSBieSBzeW5jIGFkYXB0ZXIgYXQgaXRzIGRpc2NyZXRpb247IG5vdCBtb2RpZmllZCBieSBDYWxlbmRhclByb3ZpZGVyCi0gICAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGNvbHVtbiB3YXMgZm9ybWVybHkgbmFtZWQgX1NZTkNfTE9DQUxfSUQuICBXZSBhcmUgdXNpbmcgaXQgdG8gYXZvaWQgYQotICAgICAgICAgKiBzY2hlbWEgY2hhbmdlLgotICAgICAgICAgKiBUT0RPIFJlcGxhY2UgdGhpcyB3aXRoIHNvbWV0aGluZyBtb3JlIGdlbmVyYWwgaW4gdGhlIGZ1dHVyZS4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19EQVRBID0gIl9zeW5jX2xvY2FsX2lkIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVXNlZCBvbmx5IGluIHBlcnNpc3RlbnQgcHJvdmlkZXJzLCBhbmQgb25seSBkdXJpbmcgbWVyZ2luZy4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19NQVJLID0gIl9zeW5jX21hcmsiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVc2VkIHRvIGluZGljYXRlIHRoYXQgbG9jYWwsIHVuc3luY2VkLCBjaGFuZ2VzIGFyZSBwcmVzZW50LgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0RJUlRZID0gIl9zeW5jX2RpcnR5IjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgaW5zdGFuY2UgdG8gd2hpY2ggdGhpcyByb3cgYmVsb25ncywgd2hpY2ggd2hlbiBwYWlyZWQgd2l0aAotICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfVFlQRX0gaWRlbnRpZmllcyBhIHNwZWNpZmljIGFjY291bnQuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX05BTUUgPSAiYWNjb3VudF9uYW1lIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHR5cGUgb2YgYWNjb3VudCB0byB3aGljaCB0aGlzIHJvdyBiZWxvbmdzLCB3aGljaCB3aGVuIHBhaXJlZCB3aXRoCi0gICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9OQU1FfSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYWNjb3VudC4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfVFlQRSA9ICJhY2NvdW50X3R5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVEID0gImRlbGV0ZWQiOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIENsYXNzIHRoYXQgcmVwcmVzZW50cyBhIENhbGVuZGFyIEVudGl0eS4gVGhlcmUgaXMgb25lIGVudHJ5IHBlciBjYWxlbmRhci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbGVuZGFyc0VudGl0eSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBTeW5jQ29sdW1ucywgQ2FsZW5kYXJzQ29sdW1ucyB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsKKyAgICAgICAgICAgICAgICAiL2NhbGVuZGFyX2VudGl0aWVzIik7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBFbnRpdHlJdGVyYXRvciBuZXdFbnRpdHlJdGVyYXRvcihDdXJzb3IgY3Vyc29yLCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW50aXR5SXRlcmF0b3JJbXBsKGN1cnNvciwgcmVzb2x2ZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBFbnRpdHlJdGVyYXRvciBuZXdFbnRpdHlJdGVyYXRvcihDdXJzb3IgY3Vyc29yLAorICAgICAgICAgICAgICAgIENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlJdGVyYXRvckltcGwoY3Vyc29yLCBwcm92aWRlcik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbnRpdHlJdGVyYXRvckltcGwgZXh0ZW5kcyBDdXJzb3JFbnRpdHlJdGVyYXRvciB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtUmVzb2x2ZXI7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRQcm92aWRlckNsaWVudCBtUHJvdmlkZXI7CisKKyAgICAgICAgICAgIHB1YmxpYyBFbnRpdHlJdGVyYXRvckltcGwoQ3Vyc29yIGN1cnNvciwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7CisgICAgICAgICAgICAgICAgc3VwZXIoY3Vyc29yKTsKKyAgICAgICAgICAgICAgICBtUmVzb2x2ZXIgPSByZXNvbHZlcjsKKyAgICAgICAgICAgICAgICBtUHJvdmlkZXIgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRW50aXR5SXRlcmF0b3JJbXBsKEN1cnNvciBjdXJzb3IsIENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlcikgeworICAgICAgICAgICAgICAgIHN1cGVyKGN1cnNvcik7CisgICAgICAgICAgICAgICAgbVJlc29sdmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtUHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRW50aXR5IGdldEVudGl0eUFuZEluY3JlbWVudEN1cnNvcihDdXJzb3IgY3Vyc29yKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBleHBlY3QgdGhlIGN1cnNvciBpcyBhbHJlYWR5IGF0IHRoZSByb3cgd2UgbmVlZCB0byByZWFkIGZyb20KKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGNhbGVuZGFySWQgPSBjdXJzb3IuZ2V0TG9uZyhjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KF9JRCkpOworCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb250ZW50IHZhbHVlCisgICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyBjdiA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICAgICAgY3YucHV0KF9JRCwgY2FsZW5kYXJJZCk7CisKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19BQ0NPVU5UKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19BQ0NPVU5UX1RZUEUpOworCisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfSUQpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX1ZFUlNJT04pOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX1RJTUUpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0RBVEEpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yTG9uZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19ESVJUWSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JMb25nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX01BUkspOworCisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkMxKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU1lOQzIpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TWU5DMyk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkM0KTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU1lOQzUpOworCisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLk5BTUUpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsCisgICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcnMuRElTUExBWV9OQU1FKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuQ09MT1IpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIEFDQ0VTU19MRVZFTCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU0VMRUNURUQpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIFNZTkNfRVZFTlRTKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuTE9DQVRJT04pOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIFRJTUVaT05FKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJzLk9XTkVSX0FDQ09VTlQpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsCisgICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcnMuT1JHQU5JWkVSX0NBTl9SRVNQT05EKTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIERFTEVURUQpOworCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBFbnRpdHkgZnJvbSB0aGUgQ29udGVudFZhbHVlCisgICAgICAgICAgICAgICAgRW50aXR5IGVudGl0eSA9IG5ldyBFbnRpdHkoY3YpOworCisgICAgICAgICAgICAgICAgLy8gU2V0IGN1cnNvciB0byBuZXh0IHJvdworICAgICAgICAgICAgICAgIGN1cnNvci5tb3ZlVG9OZXh0KCk7CisKKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGNyZWF0ZWQgRW50aXR5CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICB9CisKKyAgICAvKioKICAgICAgKiBDb250YWlucyBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNhbGVuZGFycy4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbGVuZGFycyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBDYWxlbmRhcnNDb2x1bW5zCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDYWxlbmRhcnMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgU3luY0NvbHVtbnMsIEFjY291bnRDb2x1bW5zLAorICAgICAgICAgICAgQ2FsZW5kYXJzQ29sdW1ucwogICAgIHsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdIRVJFX0RFTEVURV9GT1JfQUNDT1VOVCA9IENhbGVuZGFycy5fU1lOQ19BQ0NPVU5UICsgIj0/IgogICAgICAgICAgICAgICAgICsgIiBBTkQgIiArIENhbGVuZGFycy5fU1lOQ19BQ0NPVU5UX1RZUEUgKyAiPT8iOwpAQCAtMjU4LDYgKzM4MSwyNCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkwgPSAidXJsIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFVSTCBmb3IgdGhlIGNhbGVuZGFyIGl0c2VsZgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChVUkwpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRl9VUkwgPSAic2VsZlVybCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkwgZm9yIHRoZSBjYWxlbmRhciB0byBiZSBlZGl0ZWQKKyAgICAgICAgICogPFA+VHlwZTogVEVYVCAoVVJMKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfVVJMID0gImVkaXRVcmwiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJMIGZvciB0aGUgY2FsZW5kYXIgZXZlbnRzCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQgKFVSTCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVFNfVVJMID0gImV2ZW50c1VybCI7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjYWxlbmRhcgogICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgogICAgICAgICAgKi8KQEAgLTI3NiwxMiArNDE3LDYgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT04gPSAibG9jYXRpb24iOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBTaG91bGQgdGhlIGNhbGVuZGFyIGJlIGhpZGRlbiBpbiB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uIHBhbmVsPwotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhJRERFTiA9ICJoaWRkZW4iOwotCi0gICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgb3duZXIgYWNjb3VudCBmb3IgdGhpcyBjYWxlbmRhciwgYmFzZWQgb24gdGhlIGNhbGVuZGFyIGZlZWQuCiAgICAgICAgICAqIFRoaXMgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgX1NZTkNfQUNDT1VOVCBmb3IgZGVsZWdhdGVkIGNhbGVuZGFycy4KICAgICAgICAgICogPFA+VHlwZTogU3RyaW5nPC9QPgpAQCAtMjk2LDYgKzQzMSw5IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SR0FOSVpFUl9DQU5fUkVTUE9ORCA9ICJvcmdhbml6ZXJDYW5SZXNwb25kIjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDb2x1bW5zIGZyb20gdGhlIEF0dGVuZGVlcyB0YWJsZSB0aGF0IG90aGVyIHRhYmxlcyBqb2luIGludG8gdGhlbXNlbHZlcy4KKyAgICAgKi8KICAgICBwdWJsaWMgaW50ZXJmYWNlIEF0dGVuZGVlc0NvbHVtbnMgewogCiAgICAgICAgIC8qKgpAQCAtMzYxLDggKzQ5OSw3IEBACiAgICAgLyoqCiAgICAgICogQ29sdW1ucyBmcm9tIHRoZSBFdmVudHMgdGFibGUgdGhhdCBvdGhlciB0YWJsZXMgam9pbiBpbnRvIHRoZW1zZWx2ZXMuCiAgICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBFdmVudHNDb2x1bW5zCi0gICAgeworICAgIHB1YmxpYyBpbnRlcmZhY2UgRXZlbnRzQ29sdW1ucyB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgY2FsZW5kYXIgdGhlIGV2ZW50IGJlbG9uZ3MgdG8KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoZm9yZWlnbiBrZXkgdG8gdGhlIENhbGVuZGFycyB0YWJsZSk8L1A+CkBAIC00MzgsNiArNTc1LDE4IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURU5EID0gImR0ZW5kIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRpbWUgdGhlIGV2ZW50IHN0YXJ0cyB3aXRoIGFsbERheSBldmVudHMgaW4gYSBsb2NhbCB0egorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nOyBtaWxsaXMgc2luY2UgZXBvY2gpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRTVEFSVDIgPSAiZHRzdGFydDIiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGltZSB0aGUgZXZlbnQgZW5kcyB3aXRoIGFsbERheSBldmVudHMgaW4gYSBsb2NhbCB0egorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nOyBtaWxsaXMgc2luY2UgZXBvY2gpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRFTkQyID0gImR0ZW5kMiI7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgZXZlbnQKICAgICAgICAgICogPFA+VHlwZTogVEVYVCAoZHVyYXRpb24gaW4gUkZDMjQ0NSBmb3JtYXQpPC9QPgogICAgICAgICAgKi8KQEAgLTQ1MCw2ICs1OTksMTIgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfVElNRVpPTkUgPSAiZXZlbnRUaW1lem9uZSI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lem9uZSBmb3IgdGhlIGV2ZW50LCBhbGxEYXkgZXZlbnRzIHdpbGwgaGF2ZSBhIGxvY2FsIHR6IGluc3RlYWQgb2YgVVRDCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX1RJTUVaT05FMiA9ICJldmVudFRpbWV6b25lMiI7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFdoZXRoZXIgdGhlIGV2ZW50IGxhc3RzIGFsbCBkYXkgb3Igbm90CiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgogICAgICAgICAgKi8KQEAgLTU5OCw3ICs3NTMsOCBAQAogICAgIC8qKgogICAgICAqIENvbnRhaW5zIG9uZSBlbnRyeSBwZXIgY2FsZW5kYXIgZXZlbnQuIFJlY3VycmluZyBldmVudHMgc2hvdyB1cCBhcyBhIHNpbmdsZSBlbnRyeS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV2ZW50c0VudGl0eSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBFdmVudHNDb2x1bW5zLCBDYWxlbmRhcnNDb2x1bW5zIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV2ZW50c0VudGl0eSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBTeW5jQ29sdW1ucywgQWNjb3VudENvbHVtbnMsCisgICAgICAgICAgICBFdmVudHNDb2x1bW5zIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSTCBmb3IgdGhpcyB0YWJsZQogICAgICAgICAgKi8KQEAgLTcwMyw4ICs4NTksOCBAQAogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0RBVEEpOwogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yTG9uZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19ESVJUWSk7CiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfVkVSU0lPTik7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgREVMRVRFRCk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlVSTCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgRXZlbnRzQ29sdW1ucy5ERUxFVEVEKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU1lOQzEpOwogCiAgICAgICAgICAgICAgICAgRW50aXR5IGVudGl0eSA9IG5ldyBFbnRpdHkoY3YpOwogICAgICAgICAgICAgICAgIEN1cnNvciBzdWJDdXJzb3I7CkBAIC03OTUsNyArOTUxLDggQEAKICAgICAvKioKICAgICAgKiBDb250YWlucyBvbmUgZW50cnkgcGVyIGNhbGVuZGFyIGV2ZW50LiBSZWN1cnJpbmcgZXZlbnRzIHNob3cgdXAgYXMgYSBzaW5nbGUgZW50cnkuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgRXZlbnRzQ29sdW1ucywgQ2FsZW5kYXJzQ29sdW1ucyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgU3luY0NvbHVtbnMsIEFjY291bnRDb2x1bW5zLAorICAgICAgICAgICAgRXZlbnRzQ29sdW1ucyB7CiAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRkVUQ0hfRU5UUllfQ09MVU1OUyA9CiAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgRXZlbnRzLl9TWU5DX0FDQ09VTlQsIEV2ZW50cy5fU1lOQ19JRCB9OwpAQCAtODYwLDYgKzEwMTcsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIHF1ZXJ5KENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nW10gcHJvamVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBiZWdpbiwgbG9uZyBlbmQsIFN0cmluZyBzZWFyY2hRdWVyeSkgeworICAgICAgICAgICAgVXJpLkJ1aWxkZXIgYnVpbGRlciA9IENPTlRFTlRfU0VBUkNIX1VSSS5idWlsZFVwb24oKTsKKyAgICAgICAgICAgIENvbnRlbnRVcmlzLmFwcGVuZElkKGJ1aWxkZXIsIGJlZ2luKTsKKyAgICAgICAgICAgIENvbnRlbnRVcmlzLmFwcGVuZElkKGJ1aWxkZXIsIGVuZCk7CisgICAgICAgICAgICByZXR1cm4gY3IucXVlcnkoYnVpbGRlci5idWlsZCgpLCBwcm9qZWN0aW9uLCBXSEVSRV9DQUxFTkRBUlNfU0VMRUNURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgc2VhcmNoUXVlcnkgfSwgREVGQVVMVF9TT1JUX09SREVSKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIHF1ZXJ5KENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nW10gcHJvamVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBiZWdpbiwgbG9uZyBlbmQsIFN0cmluZyB3aGVyZSwgU3RyaW5nIG9yZGVyQnkpIHsKICAgICAgICAgICAgIFVyaS5CdWlsZGVyIGJ1aWxkZXIgPSBDT05URU5UX1VSSS5idWlsZFVwb24oKTsKICAgICAgICAgICAgIENvbnRlbnRVcmlzLmFwcGVuZElkKGJ1aWxkZXIsIGJlZ2luKTsKQEAgLTg3Myw2ICsxMDM5LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgb3JkZXJCeSA9PSBudWxsID8gREVGQVVMVF9TT1JUX09SREVSIDogb3JkZXJCeSk7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sIGxvbmcgYmVnaW4sCisgICAgICAgICAgICAgICAgbG9uZyBlbmQsIFN0cmluZyBzZWFyY2hRdWVyeSwgU3RyaW5nIHdoZXJlLCBTdHJpbmcgb3JkZXJCeSkgeworICAgICAgICAgICAgVXJpLkJ1aWxkZXIgYnVpbGRlciA9IENPTlRFTlRfU0VBUkNIX1VSSS5idWlsZFVwb24oKTsKKyAgICAgICAgICAgIENvbnRlbnRVcmlzLmFwcGVuZElkKGJ1aWxkZXIsIGJlZ2luKTsKKyAgICAgICAgICAgIENvbnRlbnRVcmlzLmFwcGVuZElkKGJ1aWxkZXIsIGVuZCk7CisgICAgICAgICAgICBidWlsZGVyID0gYnVpbGRlci5hcHBlbmRQYXRoKHNlYXJjaFF1ZXJ5KTsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh3aGVyZSkpIHsKKyAgICAgICAgICAgICAgICB3aGVyZSA9IFdIRVJFX0NBTEVOREFSU19TRUxFQ1RFRDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2hlcmUgPSAiKCIgKyB3aGVyZSArICIpIEFORCAiICsgV0hFUkVfQ0FMRU5EQVJTX1NFTEVDVEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KGJ1aWxkZXIuYnVpbGQoKSwgcHJvamVjdGlvbiwgd2hlcmUsIG51bGwsCisgICAgICAgICAgICAgICAgICAgIG9yZGVyQnkgPT0gbnVsbCA/IERFRkFVTFRfU09SVF9PUkRFUiA6IG9yZGVyQnkpOworICAgICAgICB9CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSTCBmb3IgdGhpcyB0YWJsZQogICAgICAgICAgKi8KQEAgLTg4MCw2ICsxMDYxLDEwIEBACiAgICAgICAgICAgICAgICAgIi9pbnN0YW5jZXMvd2hlbiIpOwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX0JZX0RBWV9VUkkgPQogICAgICAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvaW5zdGFuY2VzL3doZW5ieWRheSIpOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1NFQVJDSF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsKKyAgICAgICAgICAgICAgICAiL2luc3RhbmNlcy9zZWFyY2giKTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9TRUFSQ0hfQllfREFZX1VSSSA9CisgICAgICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9pbnN0YW5jZXMvc2VhcmNoYnlkYXkiKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGRlZmF1bHQgc29ydCBvcmRlciBmb3IgdGhpcyB0YWJsZS4KQEAgLTg5Niw3ICsxMDgxLDYgQEAKICAgICAgICAgICogcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzLCBpdCBqdXN0IGFkZHMgYSBuaWNlIHRvdWNoLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09SVF9DQUxFTkRBUl9WSUVXID0gImJlZ2luIEFTQywgZW5kIERFU0MsIHRpdGxlIEFTQyI7Ci0KICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBiZWdpbm5pbmcgdGltZSBvZiB0aGUgaW5zdGFuY2UsIGluIFVUQyBtaWxsaXNlY29uZHMKICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZzsgbWlsbGlzIHNpbmNlIGVwb2NoKTwvUD4KQEAgLTk4MSw3ICsxMTY1LDcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0VWRU5UREFZUyA9ICJtYXhFdmVudERheXMiOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ2FsZW5kYXJNZXRhRGF0YSBpbXBsZW1lbnRzIENhbGVuZGFyTWV0YURhdGFDb2x1bW5zIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENhbGVuZGFyTWV0YURhdGEgaW1wbGVtZW50cyBDYWxlbmRhck1ldGFEYXRhQ29sdW1ucywgQmFzZUNvbHVtbnMgewogICAgIH0KIAogICAgIHB1YmxpYyBpbnRlcmZhY2UgRXZlbnREYXlzQ29sdW1ucyB7CkBAIC0xMzc5LDQgKzE1NjMsNDMgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPQogICAgICAgICAgICAgICAgIFVyaS53aXRoQXBwZW5kZWRQYXRoKENhbGVuZGFyLkNPTlRFTlRfVVJJLCBDT05URU5UX0RJUkVDVE9SWSk7CiAgICAgfQorCisgICAgLyoqCisgICAgICogQ29sdW1ucyBmcm9tIHRoZSBFdmVudHNSYXdUaW1lcyB0YWJsZQorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgRXZlbnRzUmF3VGltZXNDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb3JyZXNwb25kaW5nIGV2ZW50IGlkCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfSUQgPSAiZXZlbnRfaWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgUkZDMjQ0NSBjb21wbGlhbnQgdGltZSB0aGUgZXZlbnQgc3RhcnRzCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVFNUQVJUXzI0NDUgPSAiZHRzdGFydDI0NDUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgUkZDMjQ0NSBjb21wbGlhbnQgdGltZSB0aGUgZXZlbnQgZW5kcworICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRFTkRfMjQ0NSA9ICJkdGVuZDI0NDUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgUkZDMjQ0NSBjb21wbGlhbnQgb3JpZ2luYWwgaW5zdGFuY2UgdGltZSBvZiB0aGUgcmVjdXJyaW5nIGV2ZW50IGZvciB3aGljaCB0aGlzCisgICAgICAgICAqIGV2ZW50IGlzIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SSUdJTkFMX0lOU1RBTkNFX1RJTUVfMjQ0NSA9ICJvcmlnaW5hbEluc3RhbmNlVGltZTI0NDUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgUkZDMjQ0NSBjb21wbGlhbnQgbGFzdCBkYXRlIHRoaXMgZXZlbnQgcmVwZWF0cyBvbiwgb3IgTlVMTCBpZiBpdCBuZXZlciBlbmRzCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX0RBVEVfMjQ0NSA9ICJsYXN0RGF0ZTI0NDUiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRzUmF3VGltZXMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgRXZlbnRzUmF3VGltZXNDb2x1bW5zIHsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxsTG9nLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxsTG9nLmphdmEKaW5kZXggZDUyNjMyYi4uYmYwNTFmNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsbExvZy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGxMb2cuamF2YQpAQCAtODgsNiArODgsMTcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNQkVSID0gIm51bWJlciI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZSBvZiB0aGUgY291bnRyeSB3aGVyZSB0aGUKKyAgICAgICAgICogdXNlciByZWNlaXZlZCBvciBtYWRlIHRoZSBjYWxsLgorICAgICAgICAgKiA8UD4KKyAgICAgICAgICogVHlwZTogVEVYVAorICAgICAgICAgKiA8L1A+CisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1VOVFJZX0lTTyA9ICJjb3VudHJ5aXNvIjsKKworICAgICAgICAvKioKICAgICAgICAgICogVGhlIGRhdGUgdGhlIGNhbGwgb2NjdXJlZCwgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaAogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KICAgICAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Db250YWN0c0NvbnRyYWN0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Db250YWN0c0NvbnRyYWN0LmphdmEKaW5kZXggMTNjYmRhOC4uNmU1ZWQzYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHNDb250cmFjdC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzQ29udHJhY3QuamF2YQpAQCAtMzAsOSArMzAsOSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlsczsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5VcmkuQnVpbGRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKQEAgLTQxLDYgKzQxLDcgQEAKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKICAqIDxwPgpAQCAtMTMwLDYgKzEzMSwyMCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RJTkdfUEFDS0FHRV9QQVJBTV9LRVkgPSAicmVxdWVzdGluZ19wYWNrYWdlIjsKIAogICAgIC8qKgorICAgICAqIFF1ZXJ5IHBhcmFtZXRlciB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBjbGllbnQgdG8gYWNjZXNzIGEgc3BlY2lmaWMKKyAgICAgKiB7QGxpbmsgRGlyZWN0b3J5fS4gVGhlIHBhcmFtZXRlciB2YWx1ZSBzaG91bGQgYmUgdGhlIF9JRCBvZiB0aGUgY29ycmVzcG9uZGluZworICAgICAqIGRpcmVjdG9yeSwgZS5nLgorICAgICAqIHtAY29kZSBjb250ZW50Oi8vY29tLmFuZHJvaWQuY29udGFjdHMvZGF0YS9lbWFpbHMvZmlsdGVyL2FjbWU/ZGlyZWN0b3J5PTN9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUT1JZX1BBUkFNX0tFWSA9ICJkaXJlY3RvcnkiOworCisgICAgLyoqCisgICAgICogQSBxdWVyeSBwYXJhbWV0ZXIgdGhhdCBsaW1pdHMgdGhlIG51bWJlciBvZiByZXN1bHRzIHJldHVybmVkLiBUaGUKKyAgICAgKiBwYXJhbWV0ZXIgdmFsdWUgc2hvdWxkIGJlIGFuIGludGVnZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElNSVRfUEFSQU1fS0VZID0gImxpbWl0IjsKKworICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcmVmZXJlbmNlcyB7CkBAIC0xODEsNiArMTk2LDI5NSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEEgRGlyZWN0b3J5IHJlcHJlc2VudHMgYSBjb250YWN0cyBjb3JwdXMsIGUuZy4gTG9jYWwgY29udGFjdHMsCisgICAgICogR29vZ2xlIEFwcHMgR2xvYmFsIEFkZHJlc3MgTGlzdCBvciBDb3Jwb3JhdGUgR2xvYmFsIEFkZHJlc3MgTGlzdC4KKyAgICAgKiA8cD4KKyAgICAgKiBBIERpcmVjdG9yeSBpcyBpbXBsZW1lbnRlZCBhcyBhIGNvbnRlbnQgcHJvdmlkZXIgd2l0aCBpdHMgdW5pcXVlIGF1dGhvcml0eSBhbmQKKyAgICAgKiB0aGUgc2FtZSBBUEkgYXMgdGhlIG1haW4gQ29udGFjdHMgUHJvdmlkZXIuICBIb3dldmVyLCB0aGVyZSBpcyBubyBleHBlY3RhdGlvbiB0aGF0CisgICAgICogZXZlcnkgZGlyZWN0b3J5IHByb3ZpZGVyIHdpbGwgaW1wbGVtZW50IHRoaXMgQ29udHJhY3QgaW4gaXRzIGVudGlyZXR5LiAgSWYgYQorICAgICAqIGRpcmVjdG9yeSBwcm92aWRlciBkb2VzIG5vdCBoYXZlIGFuIGltcGxlbWVudGF0aW9uIGZvciBhIHNwZWNpZmljIHJlcXVlc3QsIGl0CisgICAgICogc2hvdWxkIHRocm93IGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbW9zdCBpbXBvcnRhbnQgdXNlIGNhc2UgZm9yIERpcmVjdG9yaWVzIGlzIHNlYXJjaC4gIEEgRGlyZWN0b3J5IHByb3ZpZGVyIGlzCisgICAgICogZXhwZWN0ZWQgdG8gc3VwcG9ydCBhdCBsZWFzdCB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5Db250YWN0cyNDT05URU5UX0ZJTFRFUl9VUkkKKyAgICAgKiBDb250YWN0cy5DT05URU5UX0ZJTFRFUl9VUkl9LiAgSWYgYSBEaXJlY3RvcnkgcHJvdmlkZXIgd2FudHMgdG8gcGFydGljaXBhdGUKKyAgICAgKiBpbiBlbWFpbCBhbmQgcGhvbmUgbG9va3VwIGZ1bmN0aW9uYWxpdGllcywgaXQgc2hvdWxkIGFsc28gaW1wbGVtZW50CisgICAgICoge0BsaW5rIENvbW1vbkRhdGFLaW5kcy5FbWFpbCNDT05URU5UX0ZJTFRFUl9VUkkgQ29tbW9uRGF0YUtpbmRzLkVtYWlsLkNPTlRFTlRfRklMVEVSX1VSSX0KKyAgICAgKiBhbmQKKyAgICAgKiB7QGxpbmsgQ29tbW9uRGF0YUtpbmRzLlBob25lI0NPTlRFTlRfRklMVEVSX1VSSSBDb21tb25EYXRhS2luZHMuUGhvbmUuQ09OVEVOVF9GSUxURVJfVVJJfS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQSBkaXJlY3RvcnkgcHJvdmlkZXIgc2hvdWxkIHJldHVybiBOVUxMIGZvciBldmVyeSBwcm9qZWN0aW9uIGZpZWxkIGl0IGRvZXMgbm90CisgICAgICogcmVjb2duaXplLCByYXRoZXIgdGhhbiB0aHJvd2luZyBhbiBleGNlcHRpb24uICBUaGlzIHdheSBpdCB3aWxsIG5vdCBiZSBicm9rZW4KKyAgICAgKiBpZiBDb250YWN0c0NvbnRyYWN0IGlzIGV4dGVuZGVkIHdpdGggbmV3IGZpZWxkcyBpbiB0aGUgZnV0dXJlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2xpZW50IGludGVyYWN0cyB3aXRoIGEgZGlyZWN0b3J5IHZpYSBDb250YWN0cyBQcm92aWRlciBieSBzdXBwbHlpbmcgYW4KKyAgICAgKiBvcHRpb25hbCB7QGNvZGUgZGlyZWN0b3J5PX0gcXVlcnkgcGFyYW1ldGVyLgorICAgICAqIDxwPgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhlIENvbnRhY3RzIFByb3ZpZGVyIHJlY2VpdmVzIHRoZSByZXF1ZXN0LCBpdCB0cmFuc2Zvcm1zIHRoZSBVUkkgYW5kIGZvcndhcmRzCisgICAgICogdGhlIHJlcXVlc3QgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGlyZWN0b3J5IGNvbnRlbnQgcHJvdmlkZXIuCisgICAgICogVGhlIFVSSSBpcyB0cmFuc2Zvcm1lZCBpbiB0aGUgZm9sbG93aW5nIGZhc2hpb246CisgICAgICogPHVsPgorICAgICAqIDxsaT5UaGUgVVJJIGF1dGhvcml0eSBpcyByZXBsYWNlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayAjRElSRUNUT1JZX0FVVEhPUklUWX0uPC9saT4KKyAgICAgKiA8bGk+VGhlIHtAY29kZSBhY2NvdW50TmFtZT19IGFuZCB7QGNvZGUgYWNjb3VudFR5cGU9fSBwYXJhbWV0ZXJzIGFyZSBhZGRlZCBvcgorICAgICAqIHJlcGxhY2VkIHVzaW5nIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayAjQUNDT1VOVF9UWVBFfSBhbmQge0BsaW5rICNBQ0NPVU5UX05BTUV9IHZhbHVlcy48L2xpPgorICAgICAqIDxsaT5JZiB0aGUgVVJJIGlzIG1pc3NpbmcgYSBDb250YWN0c0NvbnRyYWN0LlJFUVVFU1RJTkdfUEFDS0FHRV9QQVJBTV9LRVkKKyAgICAgKiBwYXJhbWV0ZXIsIHRoaXMgcGFyYW1ldGVyIGlzIGFkZGVkLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQ2xpZW50cyBzaG91bGQgc2VuZCBkaXJlY3RvcnkgcmVxdWVzdHMgdG8gQ29udGFjdHMgUHJvdmlkZXIgYW5kIGxldCBpdAorICAgICAqIGZvcndhcmQgdGhlbSB0byB0aGUgcmVzcGVjdGl2ZSBwcm92aWRlcnMgcmF0aGVyIHRoYW4gY29uc3RydWN0aW5nCisgICAgICogZGlyZWN0b3J5IHByb3ZpZGVyIFVSSXMgYnkgdGhlbXNlbHZlcy4gVGhpcyBsZXZlbCBvZiBpbmRpcmVjdGlvbiBhbGxvd3MKKyAgICAgKiBDb250YWN0cyBQcm92aWRlciB0byBpbXBsZW1lbnQgYWRkaXRpb25hbCBzeXN0ZW0tbGV2ZWwgZmVhdHVyZXMgYW5kCisgICAgICogb3B0aW1pemF0aW9ucy4gQWNjZXNzIHRvIENvbnRhY3RzIFByb3ZpZGVyIGlzIHByb3RlY3RlZCBieSB0aGUKKyAgICAgKiBSRUFEX0NPTlRBQ1RTIHBlcm1pc3Npb24sIGJ1dCBhY2Nlc3MgdG8gdGhlIGRpcmVjdG9yeSBwcm92aWRlciBpcyBub3QuCisgICAgICogVGhlcmVmb3JlIGRpcmVjdG9yeSBwcm92aWRlcnMgbXVzdCByZWplY3QgcmVxdWVzdHMgY29taW5nIGZyb20gY2xpZW50cworICAgICAqIG90aGVyIHRoYW4gdGhlIENvbnRhY3RzIFByb3ZpZGVyIGl0c2VsZi4gQW4gZWFzeSB3YXkgdG8gcHJldmVudCBzdWNoCisgICAgICogdW5hdXRob3JpemVkIGFjY2VzcyBpcyB0byBjaGVjayB0aGUgbmFtZSBvZiB0aGUgY2FsbGluZyBwYWNrYWdlOgorICAgICAqIDxwcmU+CisgICAgICogcHJpdmF0ZSBib29sZWFuIGlzQ2FsbGVyQWxsb3dlZCgpIHsKKyAgICAgKiAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICogICBmb3IgKFN0cmluZyBwYWNrYWdlTmFtZTogcG0uZ2V0UGFja2FnZXNGb3JVaWQoQmluZGVyLmdldENhbGxpbmdVaWQoKSkpIHsKKyAgICAgKiAgICAgaWYgKHBhY2thZ2VOYW1lLmVxdWFscygiY29tLmFuZHJvaWQucHJvdmlkZXJzLmNvbnRhY3RzIikpIHsKKyAgICAgKiAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgKiAgICAgfQorICAgICAqICAgfQorICAgICAqICAgcmV0dXJuIGZhbHNlOworICAgICAqIH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIERpcmVjdG9yeSB0YWJsZSBpcyByZWFkLW9ubHkgYW5kIGlzIG1haW50YWluZWQgYnkgdGhlIENvbnRhY3RzIFByb3ZpZGVyCisgICAgICogYXV0b21hdGljYWxseS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+SXQgYWx3YXlzIGhhcyBhdCBsZWFzdCB0aGVzZSB0d28gcm93czoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPgorICAgICAqIFRoZSBsb2NhbCBkaXJlY3RvcnkuIEl0IGhhcyB7QGxpbmsgRGlyZWN0b3J5I19JRCBEaXJlY3RvcnkuX0lEfSA9CisgICAgICoge0BsaW5rIERpcmVjdG9yeSNERUZBVUxUIERpcmVjdG9yeS5ERUZBVUxUfS4gVGhpcyBkaXJlY3RvcnkgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIGxvY2FsbHkKKyAgICAgKiBzdG9yZWQgY29udGFjdHMuIFRoZSBzYW1lIGNhbiBiZSBhY2hpZXZlZCBieSBvbWl0dGluZyB0aGUge0Bjb2RlIGRpcmVjdG9yeT19CisgICAgICogcGFyYW1ldGVyIGFsdG9nZXRoZXIuCisgICAgICogPC9saT4KKyAgICAgKiA8bGk+CisgICAgICogVGhlIGxvY2FsIGludmlzaWJsZSBjb250YWN0cy4gVGhlIGNvcnJlc3BvbmRpbmcgZGlyZWN0b3J5IElEIGlzCisgICAgICoge0BsaW5rIERpcmVjdG9yeSNMT0NBTF9JTlZJU0lCTEUgRGlyZWN0b3J5LkxPQ0FMX0lOVklTSUJMRX0uCisgICAgICogPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KKyAgICAgKiA8cD5DdXN0b20gRGlyZWN0b3JpZXMgYXJlIGRpc2NvdmVyZWQgYnkgdGhlIENvbnRhY3RzIFByb3ZpZGVyIGZvbGxvd2luZyB0aGlzIHByb2NlZHVyZToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPkl0IGZpbmRzIGFsbCBpbnN0YWxsZWQgY29udGVudCBwcm92aWRlcnMgd2l0aCBtZXRhIGRhdGEgaWRlbnRpZnlpbmcgdGhlbQorICAgICAqIGFzIGRpcmVjdG9yeSBwcm92aWRlcnMgaW4gQW5kcm9pZE1hbmlmZXN0LnhtbDoKKyAgICAgKiA8Y29kZT4KKyAgICAgKiAmbHQ7bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LkNvbnRhY3REaXJlY3RvcnkiCisgICAgICogICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJ0cnVlIiAvJmd0OworICAgICAqIDwvY29kZT4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHRhZyBzaG91bGQgYmUgcGxhY2VkIGluc2lkZSB0aGUgY29ycmVzcG9uZGluZyBjb250ZW50IHByb3ZpZGVyIGRlY2xhcmF0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT4KKyAgICAgKiBUaGVuIENvbnRhY3RzIFByb3ZpZGVyIHNlbmRzIGEge0BsaW5rIERpcmVjdG9yeSNDT05URU5UX1VSSSBEaXJlY3RvcnkuQ09OVEVOVF9VUkl9CisgICAgICogcXVlcnkgdG8gZWFjaCBvZiB0aGUgZGlyZWN0b3J5IGF1dGhvcml0aWVzLiAgQSBkaXJlY3RvcnkgcHJvdmlkZXIgbXVzdCBpbXBsZW1lbnQKKyAgICAgKiB0aGlzIHF1ZXJ5IGFuZCByZXR1cm4gYSBsaXN0IG9mIGRpcmVjdG9yaWVzLiAgRWFjaCBkaXJlY3RvcnkgcmV0dXJuZWQgYnkKKyAgICAgKiB0aGUgcHJvdmlkZXIgbXVzdCBoYXZlIGEgdW5pcXVlIGNvbWJpbmF0aW9uIGZvciB0aGUge0BsaW5rICNBQ0NPVU5UX05BTUV9IGFuZAorICAgICAqIHtAbGluayAjQUNDT1VOVF9UWVBFfSBjb2x1bW5zIChudWxscyBhcmUgYWxsb3dlZCkuICBTaW5jZSBkaXJlY3RvcnkgSURzIGFyZSBhc3NpZ25lZAorICAgICAqIGF1dG9tYXRpY2FsbHksIHRoZSBfSUQgZmllbGQgd2lsbCBub3QgYmUgcGFydCBvZiB0aGUgcXVlcnkgcHJvamVjdGlvbi4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT5Db250YWN0cyBQcm92aWRlciBjb21waWxlcyBkaXJlY3RvcnkgbGlzdHMgcmVjZWl2ZWQgZnJvbSBhbGwgZGlyZWN0b3J5CisgICAgICogcHJvdmlkZXJzIGludG8gb25lLCBhc3NpZ25zIGVhY2ggaW5kaXZpZHVhbCBkaXJlY3RvcnkgYSBnbG9iYWxseSB1bmlxdWUgSUQgYW5kCisgICAgICogc3RvcmVzIGFsbCBkaXJlY3RvcnkgcmVjb3JkcyBpbiB0aGUgRGlyZWN0b3J5IHRhYmxlLgorICAgICAqIDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICogPHA+Q29udGFjdHMgUHJvdmlkZXIgYXV0b21hdGljYWxseSBpbnRlcnJvZ2F0ZXMgbmV3bHkgaW5zdGFsbGVkIG9yIHJlcGxhY2VkIHBhY2thZ2VzLgorICAgICAqIFRodXMgc2ltcGx5IGluc3RhbGxpbmcgYSBwYWNrYWdlIGNvbnRhaW5pbmcgYSBkaXJlY3RvcnkgcHJvdmlkZXIgaXMgc3VmZmljaWVudAorICAgICAqIHRvIGhhdmUgdGhhdCBwcm92aWRlciByZWdpc3RlcmVkLiAgQSBwYWNrYWdlIHN1cHBseWluZyBhIGRpcmVjdG9yeSBwcm92aWRlciBkb2VzCisgICAgICogbm90IGhhdmUgdG8gY29udGFpbiBsYXVuY2hhYmxlIGFjdGl2aXRpZXMuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEV2ZXJ5IHJvdyBpbiB0aGUgRGlyZWN0b3J5IHRhYmxlIGlzIGF1dG9tYXRpY2FsbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHBhY2thZ2UKKyAgICAgKiAoYXBrKS4gIElmIHRoZSBwYWNrYWdlIGlzIGxhdGVyIHVuaW5zdGFsbGVkLCBhbGwgY29ycmVzcG9uZGluZyBkaXJlY3Rvcnkgcm93cworICAgICAqIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgQ29udGFjdHMgUHJvdmlkZXIuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgaGFuZGxlZCBieSBhIGRpcmVjdG9yeSBwcm92aWRlciBjaGFuZ2VzCisgICAgICogKGZvciBpbnN0YW5jZSB3aGVuIHRoZSB1c2VyIGFkZHMgYSBuZXcgRGlyZWN0b3J5IGFjY291bnQpLCB0aGUgZGlyZWN0b3J5IHByb3ZpZGVyCisgICAgICogc2hvdWxkIGNhbGwge0BsaW5rICNub3RpZnlEaXJlY3RvcnlDaGFuZ2V9IHRvIG5vdGlmeSB0aGUgQ29udGFjdHMgUHJvdmlkZXIgb2YgdGhlIGNoYW5nZS4KKyAgICAgKiBJbiByZXNwb25zZSwgdGhlIENvbnRhY3RzIFByb3ZpZGVyIHdpbGwgcmVxdWVyeSB0aGUgZGlyZWN0b3J5IHByb3ZpZGVyIHRvIG9idGFpbiB0aGUKKyAgICAgKiBuZXcgbGlzdCBvZiBkaXJlY3Rvcmllcy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQSBkaXJlY3Rvcnkgcm93IGNhbiBiZSBvcHRpb25hbGx5IGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBhY2NvdW50CisgICAgICogKHNlZSB7QGxpbmsgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TWFuYWdlcn0pLiBJZiB0aGUgYWNjb3VudCBpcyBsYXRlciByZW1vdmVkLAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIGRpcmVjdG9yeSByb3dzIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgQ29udGFjdHMgUHJvdmlkZXIuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRGlyZWN0b3J5IGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3QgaW5zdGFudGlhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBEaXJlY3RvcnkoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJJIGZvciB0aGlzIHRhYmxlLiAgUmVxdWVzdHMgdG8gdGhpcyBVUkkgY2FuIGJlCisgICAgICAgICAqIHBlcmZvcm1lZCBvbiB0aGUgVUkgdGhyZWFkIGJlY2F1c2UgdGhleSBhcmUgYWx3YXlzIHVuYmxvY2tpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9CisgICAgICAgICAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoQVVUSE9SSVRZX1VSSSwgImRpcmVjdG9yaWVzIik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FLXR5cGUgb2Yge0BsaW5rICNDT05URU5UX1VSSX0gcHJvdmlkaW5nIGEgZGlyZWN0b3J5IG9mCisgICAgICAgICAqIGNvbnRhY3QgZGlyZWN0b3JpZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPQorICAgICAgICAgICAgICAgICJ2bmQuYW5kcm9pZC5jdXJzb3IuZGlyL2NvbnRhY3RfZGlyZWN0b3JpZXMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIGEge0BsaW5rICNDT05URU5UX1VSSX0gaXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFID0KKyAgICAgICAgICAgICAgICAidm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vY29udGFjdF9kaXJlY3RvcnkiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBfSUQgb2YgdGhlIGRlZmF1bHQgZGlyZWN0b3J5LCB3aGljaCByZXByZXNlbnRzIGxvY2FsbHkgc3RvcmVkIGNvbnRhY3RzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFQgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBfSUQgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IHJlcHJlc2VudHMgbG9jYWxseSBzdG9yZWQgaW52aXNpYmxlIGNvbnRhY3RzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIExPQ0FMX0lOVklTSUJMRSA9IDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoYXQgb3ducyB0aGlzIGRpcmVjdG9yeS4gQ29udGFjdHMgUHJvdmlkZXIKKyAgICAgICAgICogZmlsbCBpdCBpbiB3aXRoIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeSBwcm92aWRlci4KKyAgICAgICAgICogSWYgdGhlIHBhY2thZ2UgaXMgbGF0ZXIgdW5pbnN0YWxsZWQsIHRoZSBkaXJlY3RvcmllcyBpdCBvd25zIGFyZQorICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGlzIHRhYmxlLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiBURVhUPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gInBhY2thZ2VOYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGUgb2YgZGlyZWN0b3J5IGNhcHR1cmVkIGFzIGEgcmVzb3VyY2UgSUQgaW4gdGhlIGNvbnRleHQgb2YgdGhlCisgICAgICAgICAqIHBhY2thZ2Uge0BsaW5rICNQQUNLQUdFX05BTUV9LCBlLmcuICJDb3Jwb3JhdGUgRGlyZWN0b3J5IgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiBJTlRFR0VSPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9SRVNPVVJDRV9JRCA9ICJ0eXBlUmVzb3VyY2VJZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIG9wdGlvbmFsIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUgVUkgdG8gcmVwcmVzZW50IHRoaXMgZGlyZWN0b3J5LAorICAgICAgICAgKiBlLmcuICJBY21lIENvcnAiCisgICAgICAgICAqIDxwPlRZUEU6IHRleHQ8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX05BTUUgPSAiZGlzcGxheU5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIGF1dGhvcml0eSBvZiB0aGUgRGlyZWN0b3J5IFByb3ZpZGVyLiBDb250YWN0cyBQcm92aWRlciB3aWxsCisgICAgICAgICAqIHVzZSB0aGlzIGF1dGhvcml0eSB0byBmb3J3YXJkIHJlcXVlc3RzIHRvIHRoZSBkaXJlY3RvcnkgcHJvdmlkZXIuCisgICAgICAgICAqIEEgZGlyZWN0b3J5IHByb3ZpZGVyIGNhbiBsZWF2ZSB0aGlzIGNvbHVtbiBlbXB0eSAtIENvbnRhY3RzIFByb3ZpZGVyIHdpbGwgZmlsbCBpdCBpbi4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogQ2xpZW50cyBvZiB0aGlzIEFQSSBzaG91bGQgbm90IHNlbmQgcmVxdWVzdHMgZGlyZWN0bHkgdG8gdGhpcyBhdXRob3JpdHkuCisgICAgICAgICAqIEFsbCBkaXJlY3RvcnkgcmVxdWVzdHMgbXVzdCBiZSByb3V0ZWQgdGhyb3VnaCBDb250YWN0cyBQcm92aWRlci4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiB0ZXh0PC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUT1JZX0FVVEhPUklUWSA9ICJhdXRob3JpdHkiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYWNjb3VudCB0eXBlIHdoaWNoIHRoaXMgZGlyZWN0b3J5IGlzIGFzc29jaWF0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IHRleHQ8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEUgPSAiYWNjb3VudFR5cGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYWNjb3VudCB3aXRoIHdoaWNoIHRoaXMgZGlyZWN0b3J5IGlzIGFzc29jaWF0ZWQuIElmIHRoZSBhY2NvdW50IGlzIGxhdGVyCisgICAgICAgICAqIHJlbW92ZWQsIHRoZSBkaXJlY3RvcmllcyBpdCBvd25zIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGlzIHRhYmxlLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiB0ZXh0PC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9OQU1FID0gImFjY291bnROYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogT25lIG9mIHtAbGluayAjRVhQT1JUX1NVUFBPUlRfTk9ORX0sIHtAbGluayAjRVhQT1JUX1NVUFBPUlRfQU5ZX0FDQ09VTlR9LAorICAgICAgICAgKiB7QGxpbmsgI0VYUE9SVF9TVVBQT1JUX1NBTUVfQUNDT1VOVF9PTkxZfS4gVGhpcyBpcyB0aGUgZXhwZWN0YXRpb24gdGhlCisgICAgICAgICAqIGRpcmVjdG9yeSBoYXMgZm9yIGRhdGEgZXhwb3J0ZWQgZnJvbSBpdC4gIENsaWVudHMgbXVzdCBvYmV5IHRoaXMgc2V0dGluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9TVVBQT1JUID0gImV4cG9ydFN1cHBvcnQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiB7QGxpbmsgI0VYUE9SVF9TVVBQT1JUfSBzZXR0aW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBkb2VzIG5vdCBhbGxvdyBhbnkgZGF0YSB0byBiZSBjb3BpZWQgb3V0IG9mIGl0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQT1JUX1NVUFBPUlRfTk9ORSA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjRVhQT1JUX1NVUFBPUlR9IHNldHRpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0b3J5CisgICAgICAgICAqIGFsbG93IGl0cyBkYXRhIGNvcGllZCBvbmx5IHRvIHRoZSBhY2NvdW50IHNwZWNpZmllZCBieQorICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfVFlQRX0ve0BsaW5rICNBQ0NPVU5UX05BTUV9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQT1JUX1NVUFBPUlRfU0FNRV9BQ0NPVU5UX09OTFkgPSAxOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiB7QGxpbmsgI0VYUE9SVF9TVVBQT1JUfSBzZXR0aW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBhbGxvdyBpdHMgZGF0YSBjb3BpZWQgdG8gYW55IGNvbnRhY3RzIGFjY291bnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBPUlRfU1VQUE9SVF9BTllfQUNDT1VOVCA9IDI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9uZSBvZiB7QGxpbmsgI1NIT1JUQ1VUX1NVUFBPUlRfTk9ORX0sIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVF9EQVRBX0lURU1TX09OTFl9LAorICAgICAgICAgKiB7QGxpbmsgI1NIT1JUQ1VUX1NVUFBPUlRfRlVMTH0sIFRoaXMgaXMgdGhlIGV4cGVjdGF0aW9uIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogaGFzIGZvciBzaG9ydGN1dHMgY3JlYXRlZCBmb3IgaXRzIGVsZW1lbnRzLiBDbGllbnRzIG11c3Qgb2JleSB0aGlzIHNldHRpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9SVENVVF9TVVBQT1JUID0gInNob3J0Y3V0U3VwcG9ydCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVH0gc2V0dGluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogZG9lcyBub3QgYWxsb3cgYW55IHNob3J0Y3V0cyBjcmVhdGVkIGZvciBpdHMgY29udGFjdHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9SVENVVF9TVVBQT1JUX05PTkUgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiB7QGxpbmsgI1NIT1JUQ1VUX1NVUFBPUlR9IHNldHRpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0b3J5CisgICAgICAgICAqIGFsbG93IGNyZWF0aW9uIG9mIHNob3J0Y3V0cyBmb3IgZGF0YSBpdGVtcyBsaWtlIGVtYWlsLCBwaG9uZSBvciBwb3N0YWwgYWRkcmVzcywKKyAgICAgICAgICogYnV0IG5vdCB0aGUgZW50aXJlIGNvbnRhY3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9SVENVVF9TVVBQT1JUX0RBVEFfSVRFTVNfT05MWSA9IDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVH0gc2V0dGluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogYWxsb3cgY3JlYXRpb24gb2Ygc2hvcnRjdXRzIGZvciBjb250YWN0IGFzIHdlbGwgYXMgdGhlaXIgY29uc3RpdHVlbnQgZWxlbWVudHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9SVENVVF9TVVBQT1JUX0ZVTEwgPSAyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3RpZmllcyB0aGUgc3lzdGVtIG9mIGEgY2hhbmdlIGluIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGhhbmRsZWQgYnkKKyAgICAgICAgICogYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSBwcm92aWRlci4gVGhlIENvbnRhY3RzIHByb3ZpZGVyIHdpbGwgdHVybiBhcm91bmQKKyAgICAgICAgICogYW5kIHNlbmQgYSBxdWVyeSB0byB0aGUgZGlyZWN0b3J5IHByb3ZpZGVyIGZvciB0aGUgZnVsbCBsaXN0IG9mIGRpcmVjdG9yaWVzLAorICAgICAgICAgKiB3aGljaCB3aWxsIHJlcGxhY2UgdGhlIHByZXZpb3VzIGxpc3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbm90aWZ5RGlyZWN0b3J5Q2hhbmdlKENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBkb25lIHRvIHRyaWdnZXIgYSBxdWVyeSBieSBDb250YWN0cyBQcm92aWRlciBiYWNrIHRvIHRoZSBkaXJlY3RvcnkgcHJvdmlkZXIuCisgICAgICAgICAgICAvLyBObyBkYXRhIG5lZWRzIHRvIGJlIHNlbnQgYmFjaywgYmVjYXVzZSB0aGUgcHJvdmlkZXIgY2FuIGluZmVyIHRoZSBjYWxsaW5nCisgICAgICAgICAgICAvLyBwYWNrYWdlIGZyb20gYmluZGVyLgorICAgICAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgIHJlc29sdmVyLnVwZGF0ZShEaXJlY3RvcnkuQ09OVEVOVF9VUkksIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQGhpZGUgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiB1c2VycyBhcmUgdXBkYXRlZCB0byByZWZlciB0byBTeW5jU3RhdGUKICAgICAgKiBAZGVwcmVjYXRlZCB1c2UgU3luY1N0YXRlIGluc3RlYWQKICAgICAgKi8KQEAgLTQ1Nyw3ICs3NjEsNiBAQAogICAgICAqICdmYW1pbHkgbmFtZScsICdnaXZlbiBuYW1lJyAnbWlkZGxlIG5hbWUnLiAgVGhlIENKSyB0cmFkaXRpb24gaXMKICAgICAgKiAnZmFtaWx5IG5hbWUnICdtaWRkbGUgbmFtZScgJ2dpdmVuIG5hbWUnLCB3aXRoIEphcGFuZXNlIGZhdm9yaW5nIGEgc3BhY2UgYmV0d2VlbgogICAgICAqIHRoZSBuYW1lcyBhbmQgQ2hpbmVzZSBvbWl0dGluZyB0aGUgc3BhY2UuCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50ZXJmYWNlIEZ1bGxOYW1lU3R5bGUgewogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFRklORUQgPSAwOwpAQCAtNDc2LDcgKzc3OSw2IEBACiAKICAgICAvKioKICAgICAgKiBDb25zdGFudHMgZm9yIHZhcmlvdXMgc3R5bGVzIG9mIGNhcHR1cmluZyB0aGUgcHJvbnVuY2lhdGlvbiBvZiBhIHBlcnNvbidzIG5hbWUuCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50ZXJmYWNlIFBob25ldGljTmFtZVN0eWxlIHsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEID0gMDsKQEAgLTUwMiw4ICs4MDQsNiBAQAogICAgIC8qKgogICAgICAqIFR5cGVzIG9mIGRhdGEgdXNlZCB0byBwcm9kdWNlIHRoZSBkaXNwbGF5IG5hbWUgZm9yIGEgY29udGFjdC4gTGlzdGVkIGluIHRoZSBvcmRlcgogICAgICAqIG9mIGluY3JlYXNpbmcgcHJpb3JpdHkuCi0gICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBpbnRlcmZhY2UgRGlzcGxheU5hbWVTb3VyY2VzIHsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEID0gMDsKQEAgLTUxOSwxNSArODE5LDEyIEBACiAgICAgICoKICAgICAgKiBAc2VlIENvbnRhY3RzCiAgICAgICogQHNlZSBSYXdDb250YWN0cwotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludGVyZmFjZSBDb250YWN0TmFtZUNvbHVtbnMgewogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUga2luZCBvZiBkYXRhIHRoYXQgaXMgdXNlZCBhcyB0aGUgZGlzcGxheSBuYW1lIGZvciB0aGUgY29udGFjdCwgc3VjaCBhcwotICAgICAgICAgKiBzdHJ1Y3R1cmVkIG5hbWUgb3IgZW1haWwgYWRkcmVzcy4gIFNlZSBEaXNwbGF5TmFtZVNvdXJjZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRPRE86IGNvbnZlcnQgRGlzcGxheU5hbWVTb3VyY2VzIHRvIGEgbGluayBhZnRlciBpdCBpcyB1bi1oaWRkZW4KKyAgICAgICAgICogc3RydWN0dXJlZCBuYW1lIG9yIGVtYWlsIGFkZHJlc3MuICBTZWUge0BsaW5rIERpc3BsYXlOYW1lU291cmNlc30uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX05BTUVfU09VUkNFID0gImRpc3BsYXlfbmFtZV9zb3VyY2UiOwogCkBAIC01NzUsOSArODcyLDcgQEAKIAogICAgICAgICAvKioKICAgICAgICAgICogVGhlIHBob25ldGljIGFscGhhYmV0IHVzZWQgdG8gcmVwcmVzZW50IHRoZSB7QGxpbmsgI1BIT05FVElDX05BTUV9LiAgU2VlCi0gICAgICAgICAqIFBob25ldGljTmFtZVN0eWxlLgotICAgICAgICAgKgotICAgICAgICAgKiBUT0RPOiBjb252ZXJ0IFBob25ldGljTmFtZVN0eWxlIHRvIGEgbGluayBhZnRlciBpdCBpcyB1bi1oaWRkZW4KKyAgICAgICAgICoge0BsaW5rIFBob25ldGljTmFtZVN0eWxlfS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT05FVElDX05BTUVfU1RZTEUgPSAicGhvbmV0aWNfbmFtZV9zdHlsZSI7CiAKQEAgLTU4NywxMyArODgyLDEwIEBACiAgICAgICAgICAqIHtAbGluayAjUEhPTkVUSUNfTkFNRV9TVFlMRX0uCiAgICAgICAgICAqIDwvcD4KICAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSB2YWx1ZSBtYXkgYmUgc2V0IG1hbnVhbGx5IGJ5IHRoZSB1c2VyLgotICAgICAgICAgKiBUaGlzIGNhcGFiaWxpdHkgaXMgaXMgb2YgaW50ZXJlc3Qgb25seSBpbiBjb3VudHJpZXMKLSAgICAgICAgICogd2l0aCBjb21tb25seSB1c2VkIHBob25ldGljCi0gICAgICAgICAqIGFscGhhYmV0cywgc3VjaCBhcyBKYXBhbiBhbmQgS29yZWEuICBTZWUgUGhvbmV0aWNOYW1lU3R5bGUuCisgICAgICAgICAqIFRoZSB2YWx1ZSBtYXkgYmUgc2V0IG1hbnVhbGx5IGJ5IHRoZSB1c2VyLiBUaGlzIGNhcGFiaWxpdHkgaXMgb2YKKyAgICAgICAgICogaW50ZXJlc3Qgb25seSBpbiBjb3VudHJpZXMgd2l0aCBjb21tb25seSB1c2VkIHBob25ldGljIGFscGhhYmV0cywKKyAgICAgICAgICogc3VjaCBhcyBKYXBhbiBhbmQgS29yZWEuIFNlZSB7QGxpbmsgUGhvbmV0aWNOYW1lU3R5bGV9LgogICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIFRPRE86IGNvbnZlcnQgUGhvbmV0aWNOYW1lU3R5bGUgdG8gYSBsaW5rIGFmdGVyIGl0IGlzIHVuLWhpZGRlbgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhPTkVUSUNfTkFNRSA9ICJwaG9uZXRpY19uYW1lIjsKIApAQCAtMTA1Niw2ICsxMzQ4LDU3IEBACiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIDxwPgorICAgICAgICAgKiBBIHN1Yi1kaXJlY3Rvcnkgb2YgYSBjb250YWN0IHRoYXQgY29udGFpbnMgYWxsIG9mIGl0cworICAgICAgICAgKiB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0c30gYXMgd2VsbCBhcworICAgICAgICAgKiB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5EYXRhfSByb3dzLiBUbyBhY2Nlc3MgdGhpcyBkaXJlY3RvcnkgYXBwZW5kCisgICAgICAgICAqIHtAbGluayAjQ09OVEVOVF9ESVJFQ1RPUll9IHRvIHRoZSBjb250YWN0IFVSSS4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogRW50aXR5IGhhcyB0aHJlZSBJRCBmaWVsZHM6IHtAbGluayAjQ09OVEFDVF9JRH0gZm9yIHRoZSBjb250YWN0LAorICAgICAgICAgKiB7QGxpbmsgI1JBV19DT05UQUNUX0lEfSBmb3IgdGhlIHJhdyBjb250YWN0IGFuZCB7QGxpbmsgI0RBVEFfSUR9IGZvcgorICAgICAgICAgKiB0aGUgZGF0YSByb3dzLiBFbnRpdHkgYWx3YXlzIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSByb3cgcGVyCisgICAgICAgICAqIGNvbnN0aXR1ZW50IHJhdyBjb250YWN0LCBldmVuIGlmIHRoZXJlIGFyZSBubyBhY3R1YWwgZGF0YSByb3dzLiBJbgorICAgICAgICAgKiB0aGlzIGNhc2UgdGhlIHtAbGluayAjREFUQV9JRH0gZmllbGQgd2lsbCBiZSBudWxsLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBFbnRpdHkgcmVhZHMgYWxsIGRhdGEgZm9yIHRoZSBlbnRpcmUgY29udGFjdCBpbiBvbmUgdHJhbnNhY3Rpb24sIHRvCisgICAgICAgICAqIGd1YXJhbnRlZSBjb25zaXN0ZW5jeS4gIFRoZXJlIGlzIHNpZ25pZmljYW50IGRhdGEgZHVwbGljYXRpb24KKyAgICAgICAgICogaW4gdGhlIEVudGl0eSAoZWFjaCByb3cgcmVwZWF0cyBhbGwgQ29udGFjdCBjb2x1bW5zIGFuZCBhbGwgUmF3Q29udGFjdAorICAgICAgICAgKiBjb2x1bW5zKSwgc28gdGhlIGJlbmVmaXRzIG9mIHRyYW5zYWN0aW9uYWwgY29uc2lzdGVuY3kgc2hvdWxkIGJlIHdlaWdoZWQKKyAgICAgICAgICogYWdhaW5zdCB0aGUgY29zdCBvZiB0cmFuc2ZlcnJpbmcgbGFyZ2UgYW1vdW50cyBvZiBkZW5vcm1hbGl6ZWQgZGF0YQorICAgICAgICAgKiBmcm9tIHRoZSBQcm92aWRlci4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFbnRpdHkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgQ29udGFjdHNDb2x1bW5zLAorICAgICAgICAgICAgICAgIENvbnRhY3ROYW1lQ29sdW1ucywgUmF3Q29udGFjdHNDb2x1bW5zLCBCYXNlU3luY0NvbHVtbnMsIFN5bmNDb2x1bW5zLCBEYXRhQ29sdW1ucywKKyAgICAgICAgICAgICAgICBTdGF0dXNDb2x1bW5zLCBDb250YWN0T3B0aW9uc0NvbHVtbnMsIENvbnRhY3RTdGF0dXNDb2x1bW5zIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogbm8gcHVibGljIGNvbnN0cnVjdG9yIHNpbmNlIHRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHByaXZhdGUgRW50aXR5KCkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBkaXJlY3RvcnkgdHdpZyBmb3IgdGhpcyBzdWItdGFibGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVJFQ1RPUlkgPSAiZW50aXRpZXMiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgcmF3IGNvbnRhY3Qgcm93LgorICAgICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFXX0NPTlRBQ1RfSUQgPSAicmF3X2NvbnRhY3RfaWQiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgZGF0YSByb3cuIFRoZSB2YWx1ZSB3aWxsIGJlIG51bGwgaWYgdGhpcyByYXcgY29udGFjdCBoYXMgbm8KKyAgICAgICAgICAgICAqIGRhdGEgcm93cy4KKyAgICAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfSUQgPSAiZGF0YV9pZCI7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+CiAgICAgICAgICAqIEEgPGk+cmVhZC1vbmx5PC9pPiBzdWItZGlyZWN0b3J5IG9mIGEgc2luZ2xlIGNvbnRhY3QgYWdncmVnYXRlIHRoYXQKICAgICAgICAgICogY29udGFpbnMgYWxsIGFnZ3JlZ2F0aW9uIHN1Z2dlc3Rpb25zIChvdGhlciBjb250YWN0cykuIFRoZQogICAgICAgICAgKiBhZ2dyZWdhdGlvbiBzdWdnZXN0aW9ucyBhcmUgY29tcHV0ZWQgYmFzZWQgb24gYXBwcm94aW1hdGUgZGF0YQpAQCAtMTA5NCw2ICsxNDM3LDEwNiBAQAogICAgICAgICAgICAgICoge0BsaW5rIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0cyNDT05URU5UX0ZJTFRFUl9VUkl9LgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0RJUkVDVE9SWSA9ICJzdWdnZXN0aW9ucyI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVXNlZCB3aXRoIHtAbGluayBCdWlsZGVyI2FkZFBhcmFtZXRlcn0gdG8gc3BlY2lmeSB3aGF0IGtpbmQgb2YgZGF0YSBpcworICAgICAgICAgICAgICogc3VwcGxpZWQgZm9yIHRoZSBzdWdnZXN0aW9uIHF1ZXJ5LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEBoaWRlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9NQVRDSF9OQU1FID0gIm5hbWUiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgQnVpbGRlciNhZGRQYXJhbWV0ZXJ9IHRvIHNwZWNpZnkgd2hhdCBraW5kIG9mIGRhdGEgaXMKKyAgICAgICAgICAgICAqIHN1cHBsaWVkIGZvciB0aGUgc3VnZ2VzdGlvbiBxdWVyeS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAaGlkZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfTUFUQ0hfRU1BSUwgPSAiZW1haWwiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgQnVpbGRlciNhZGRQYXJhbWV0ZXJ9IHRvIHNwZWNpZnkgd2hhdCBraW5kIG9mIGRhdGEgaXMKKyAgICAgICAgICAgICAqIHN1cHBsaWVkIGZvciB0aGUgc3VnZ2VzdGlvbiBxdWVyeS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAaGlkZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfTUFUQ0hfUEhPTkUgPSAicGhvbmUiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgQnVpbGRlciNhZGRQYXJhbWV0ZXJ9IHRvIHNwZWNpZnkgd2hhdCBraW5kIG9mIGRhdGEgaXMKKyAgICAgICAgICAgICAqIHN1cHBsaWVkIGZvciB0aGUgc3VnZ2VzdGlvbiBxdWVyeS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAaGlkZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfTUFUQ0hfTklDS05BTUUgPSAibmlja25hbWUiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEEgY29udmVuaWVuY2UgYnVpbGRlciBmb3IgYWdncmVnYXRpb24gc3VnZ2VzdGlvbiBjb250ZW50IFVSSXMuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVE9ETzogY2hhbmdlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3MgdG8gdXNlIHRoZSBidWlsZGVyLgorICAgICAgICAgICAgICogQGhpZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKKyAgICAgICAgICAgICAgICBwcml2YXRlIGxvbmcgbUNvbnRhY3RJZDsKKyAgICAgICAgICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1LaW5kcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbVZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgICAgIHByaXZhdGUgaW50IG1MaW1pdDsKKworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIE9wdGlvbmFsIGV4aXN0aW5nIGNvbnRhY3QgSUQuICBJZiBpdCBpcyBub3QgcHJvdmlkZWQsIHRoZSBzZWFyY2gKKyAgICAgICAgICAgICAgICAgKiB3aWxsIGJlIGJhc2VkIGV4Y2x1c2l2ZWx5IG9uIHRoZSB2YWx1ZXMgc3VwcGxpZWQgd2l0aCB7QGxpbmsgI2FkZFBhcmFtZXRlcn0uCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29udGFjdElkKGxvbmcgY29udGFjdElkKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMubUNvbnRhY3RJZCA9IGNvbnRhY3RJZDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQSB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gc2VhcmNoaW5nIGZvciBhbiBhZ2dyZWdhdGlvbgorICAgICAgICAgICAgICAgICAqIHN1Z2dlc3Rpb24uCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBAcGFyYW0ga2luZCBjYW4gYmUgb25lIG9mCisgICAgICAgICAgICAgICAgICogICAgICAgICAgICB7QGxpbmsgQWdncmVnYXRpb25TdWdnZXN0aW9ucyNQQVJBTUVURVJfTUFUQ0hfTkFNRX0sCisgICAgICAgICAgICAgICAgICogICAgICAgICAgICB7QGxpbmsgQWdncmVnYXRpb25TdWdnZXN0aW9ucyNQQVJBTUVURVJfTUFUQ0hfRU1BSUx9LAorICAgICAgICAgICAgICAgICAqICAgICAgICAgICAge0BsaW5rIEFnZ3JlZ2F0aW9uU3VnZ2VzdGlvbnMjUEFSQU1FVEVSX01BVENIX05JQ0tOQU1FfSwKKyAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgIHtAbGluayBBZ2dyZWdhdGlvblN1Z2dlc3Rpb25zI1BBUkFNRVRFUl9NQVRDSF9QSE9ORX0KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRQYXJhbWV0ZXIoU3RyaW5nIGtpbmQsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUtpbmRzLmFkZChraW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1WYWx1ZXMuYWRkKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRMaW1pdChpbnQgbGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxpbWl0ID0gbGltaXQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBVcmkgYnVpbGQoKSB7CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQubmV0LlVyaS5CdWlsZGVyIGJ1aWxkZXIgPSBDb250YWN0cy5DT05URU5UX1VSSS5idWlsZFVwb24oKTsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmRFbmNvZGVkUGF0aChTdHJpbmcudmFsdWVPZihtQ29udGFjdElkKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kUGF0aChDb250YWN0cy5BZ2dyZWdhdGlvblN1Z2dlc3Rpb25zLkNPTlRFTlRfRElSRUNUT1JZKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1MaW1pdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKCJsaW1pdCIsIFN0cmluZy52YWx1ZU9mKG1MaW1pdCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gbUtpbmRzLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKCJxdWVyeSIsIG1LaW5kcy5nZXQoaSkgKyAiOiIgKyBtVmFsdWVzLmdldChpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBAaGlkZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJ1aWxkZXIgYnVpbGRlcigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMTE0Nyw3ICsxNTkwLDYgQEAKICAgICAgICAgICAgICAqIHRoYXQgY291bGQgYmUgaW5mbGF0ZWQgdXNpbmcge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeX0uCiAgICAgICAgICAgICAgKiA8cD4KICAgICAgICAgICAgICAqIFR5cGU6IEJMT0IKLSAgICAgICAgICAgICAqIEBoaWRlIFRPRE86IFVuaGlkZSBpbiBhIHNlcGFyYXRlIENMCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT1RPID0gREFUQTE1OwogICAgICAgICB9CkBAIC0xMjQ0LDYgKzE2ODYsMTMgQEAKICAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfVkVSSUZJRUQgPSAibmFtZV92ZXJpZmllZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSAicmVhZC1vbmx5IiBmbGFnOiAiMCIgYnkgZGVmYXVsdCwgIjEiIGlmIHRoZSByb3cgY2Fubm90IGJlIG1vZGlmaWVkIG9yCisgICAgICAgICAqIGRlbGV0ZWQgZXhjZXB0IGJ5IGEgc3luYyBhZGFwdGVyLiAgU2VlIHtAbGluayBDb250YWN0c0NvbnRyYWN0I0NBTExFUl9JU19TWU5DQURBUFRFUn0uCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQVdfQ09OVEFDVF9JU19SRUFEX09OTFkgPSAicmF3X2NvbnRhY3RfaXNfcmVhZF9vbmx5IjsKICAgICB9CiAKICAgICAvKioKQEAgLTE3NTEsNyArMjIwMCw3IEBACiAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0RJUkVDVE9SWSA9ICJlbnRpdHkiOwogCiAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgZGF0YSBjb2x1bW4uIFRoZSB2YWx1ZSB3aWxsIGJlIG51bGwgaWYgdGhpcyByYXcgY29udGFjdCBoYXMgbm8KKyAgICAgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgZGF0YSByb3cuIFRoZSB2YWx1ZSB3aWxsIGJlIG51bGwgaWYgdGhpcyByYXcgY29udGFjdCBoYXMgbm8KICAgICAgICAgICAgICAqIGRhdGEgcm93cy4KICAgICAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CiAgICAgICAgICAgICAgKi8KQEAgLTE4MzksMjggKzIyODgsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLkRBVEFfVkVSU0lPTik7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IERBVEFfS0VZUykgewogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvbHVtbkluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdyhrZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc051bGwoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcHV0IGFueXRoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGN1cnNvci5nZXRUeXBlKGNvbHVtbkluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfTlVMTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcHV0IGFueXRoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfSU5URUdFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX0ZMT0FUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfU1RSSU5HOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdi5wdXQoa2V5LCBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbkluZGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9CTE9COgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdi5wdXQoa2V5LCBjdXJzb3IuZ2V0QmxvYihjb2x1bW5JbmRleCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW52YWxpZCBvciB1bmhhbmRsZWQgZGF0YSB0eXBlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBnbyBiYWNrIHRvIHRoaXMgdmVyc2lvbiBvZiB0aGUgY29kZSB3aGVuIGJ1ZwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL2IvaXNzdWU/aWQ9MjMwNjM3MCBpcyBmaXhlZC4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc051bGwoY29sdW1uSW5kZXgpKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBwdXQgYW55dGhpbmcKLS8vICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJzb3IuaXNMb25nKGNvbHVtbkluZGV4KSkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChrZXksIGN1cnNvci5nZXRMb25nKGNvbHVtbkluZGV4KSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yLmlzRmxvYXQoY29sdW1uSW5kZXgpKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KGtleSwgY3Vyc29yLmdldEZsb2F0KGNvbHVtbkluZGV4KSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yLmlzU3RyaW5nKGNvbHVtbkluZGV4KSkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChrZXksIGN1cnNvci5nZXRTdHJpbmcoY29sdW1uSW5kZXgpKTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJzb3IuaXNCbG9iKGNvbHVtbkluZGV4KSkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChrZXksIGN1cnNvci5nZXRCbG9iKGNvbHVtbkluZGV4KSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBjb250YWN0LmFkZFN1YlZhbHVlKENvbnRhY3RzQ29udHJhY3QuRGF0YS5DT05URU5UX1VSSSwgY3YpOwogICAgICAgICAgICAgICAgIH0gd2hpbGUgKGN1cnNvci5tb3ZlVG9OZXh0KCkpOwpAQCAtMTk2NSwxOCArMjQwNywxOSBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFUX0NBUEFCSUxJVFkgPSAiY2hhdF9jYXBhYmlsaXR5IjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQW4gYWxsb3dlZCB2YWx1ZSBvZiB7QGxpbmsgI0NIQVRfQ0FQQUJJTElUWX0uIEluZGljYXRlcyB0aGF0IHRoZSBjb250YWN0J3MgZGV2aWNlIGNhbgorICAgICAgICAgKiBBbiBhbGxvd2VkIGZsYWcgb2Yge0BsaW5rICNDSEFUX0NBUEFCSUxJVFl9LiBJbmRpY2F0ZXMgYXVkaW8tY2hhdCBjYXBhYmlsaXR5IChtaWNyb3Bob25lCisgICAgICAgICAqIGFuZCBzcGVha2VyKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQQUJJTElUWV9IQVNfVk9JQ0UgPSAxOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiBhbGxvd2VkIGZsYWcgb2Yge0BsaW5rICNDSEFUX0NBUEFCSUxJVFl9LiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29udGFjdCdzIGRldmljZSBjYW4KICAgICAgICAgICogZGlzcGxheSBhIHZpZGVvIGZlZWQuCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBBQklMSVRZX0hBU19WSURFT19QTEFZQkFDS19PTkxZID0gMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQQUJJTElUWV9IQVNfVklERU8gPSAyOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBBbiBhbGxvd2VkIHZhbHVlIG9mIHtAbGluayAjQ0hBVF9DQVBBQklMSVRZfS4gSW5kaWNhdGVzIGF1ZGlvLWNoYXQgY2FwYWJpbGl0eS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUEFCSUxJVFlfSEFTX1ZPSUNFID0gMjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gYWxsb3dlZCB2YWx1ZSBvZiB7QGxpbmsgI0NIQVRfQ0FQQUJJTElUWX0uIEluZGljYXRlcyB0aGF0IHRoZSBjb250YWN0J3MgZGV2aWNlIGhhcyBhCisgICAgICAgICAqIEFuIGFsbG93ZWQgZmxhZyBvZiB7QGxpbmsgI0NIQVRfQ0FQQUJJTElUWX0uIEluZGljYXRlcyB0aGF0IHRoZSBjb250YWN0J3MgZGV2aWNlIGhhcyBhCiAgICAgICAgICAqIGNhbWVyYSB0aGF0IGNhbiBiZSB1c2VkIGZvciB2aWRlbyBjaGF0IChlLmcuIGEgZnJvbnQtZmFjaW5nIGNhbWVyYSBvbiBhIHBob25lKS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUEFCSUxJVFlfSEFTX0NBTUVSQSA9IDQ7CkBAIC0yMDIzLDYgKzI0NjYsMTMgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfU1VQRVJfUFJJTUFSWSA9ICJpc19zdXBlcl9wcmltYXJ5IjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVGhlICJyZWFkLW9ubHkiIGZsYWc6ICIwIiBieSBkZWZhdWx0LCAiMSIgaWYgdGhlIHJvdyBjYW5ub3QgYmUgbW9kaWZpZWQgb3IKKyAgICAgICAgICogZGVsZXRlZCBleGNlcHQgYnkgYSBzeW5jIGFkYXB0ZXIuICBTZWUge0BsaW5rIENvbnRhY3RzQ29udHJhY3QjQ0FMTEVSX0lTX1NZTkNBREFQVEVSfS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1JFQURfT05MWSA9ICJpc19yZWFkX29ubHkiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGlzIGRhdGEgcmVjb3JkLiBUaGlzIGlzIGEgcmVhZC1vbmx5IHZhbHVlLiBUaGUgZGF0YSBjb2x1bW4gaXMKICAgICAgICAgICogZ3VhcmFudGVlZCB0byBub3QgY2hhbmdlIHdpdGhvdXQgdGhlIHZlcnNpb24gZ29pbmcgdXAuIFRoaXMgdmFsdWUgaXMgbW9ub3RvbmljYWxseQogICAgICAgICAgKiBpbmNyZWFzaW5nLgpAQCAtMjg1Nyw2ICszMzA3LDE0IEBACiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJsYWJlbCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwaG9uZSBudW1iZXIncyBFMTY0IHJlcHJlc2VudGF0aW9uLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9STUFMSVpFRF9OVU1CRVIgPSAibm9ybWFsaXplZF9udW1iZXIiOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzEyOSwxMCArMzU4NywxMSBAQAogICAgICAqIDx0ZD5pbnQ8L3RkPgogICAgICAqIDx0ZD57QGxpbmsgI0NIQVRfQ0FQQUJJTElUWX08L3RkPgogICAgICAqIDx0ZD5yZWFkL3dyaXRlPC90ZD4KLSAgICAgKiA8dGQ+Q29udGFjdCBJTSBjaGF0IGNvbXBhdGliaWxpdHkgdmFsdWUuIFRoZSBhbGxvd2VkIHZhbHVlcyBhcmU6CisgICAgICogPHRkPkNvbnRhY3QgSU0gY2hhdCBjb21wYXRpYmlsaXR5IHZhbHVlLiBUaGUgYWxsb3dlZCB2YWx1ZXMgY29tYmluYXRpb25zIG9mIHRoZSBmb2xsb3dpbmcKKyAgICAgKiBmbGFncy4gSWYgTm9uZSBvZiB0aGVzZSBmbGFncyBpcyBzZXQsIHRoZSBkZXZpY2UgY2FuIG9ubHkgZG8gdGV4dCBtZXNzYWdpbmcuCiAgICAgICogPHA+CiAgICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0NBUEFCSUxJVFlfSEFTX1ZJREVPX1BMQVlCQUNLX09OTFl9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNDQVBBQklMSVRZX0hBU19WSURFT308L2xpPgogICAgICAqIDxsaT57QGxpbmsgI0NBUEFCSUxJVFlfSEFTX1ZPSUNFfTwvbGk+CiAgICAgICogPGxpPntAbGluayAjQ0FQQUJJTElUWV9IQVNfQ0FNRVJBfTwvbGk+CiAgICAgICogPC91bD4KQEAgLTM3MDgsNiArNDE2NywxNCBAQAogICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNQkVSID0gREFUQTsKIAogICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgcGhvbmUgbnVtYmVyJ3MgRTE2NCByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQGhpZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9STUFMSVpFRF9OVU1CRVIgPSBEQVRBNDsKKworICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRUeXBlTGFiZWwoUmVzb3VyY2VzLCBpbnQsIENoYXJTZXF1ZW5jZSl9IGluc3RlYWQuCiAgICAgICAgICAgICAgKiBAaGlkZQogICAgICAgICAgICAgICovCkBAIC0zODgwLDcgKzQzNDcsNiBAQAogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBUaGUgZW1haWwgYWRkcmVzcy4KICAgICAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAgICAgKiBAaGlkZSBUT0RPOiBVbmhpZGUgaW4gYSBzZXBhcmF0ZSBDTAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERSRVNTID0gREFUQTE7CiAKQEAgLTQ5OTgsNiArNTQ2NCwyMyBAQAogICAgICAgICAgKiBUeXBlOiBJTlRFR0VSIChib29sZWFuKQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPVUxEX1NZTkMgPSAic2hvdWxkX3N5bmMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbnkgbmV3bHkgY3JlYXRlZCBjb250YWN0cyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgYWRkZWQgdG8gZ3JvdXBzIHRoYXQgaGF2ZSB0aGlzCisgICAgICAgICAqIGZsYWcgc2V0IHRvIHRydWUuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUeXBlOiBJTlRFR0VSIChib29sZWFuKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19BREQgPSAiYXV0b19hZGQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXaGVuIGEgY29udGFjdHMgaXMgbWFya2VkIGFzIGEgZmF2b3JpdGVzIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSBhZGRlZAorICAgICAgICAgKiB0byB0aGUgZ3JvdXBzIHRoYXQgaGF2ZSB0aGlzIGZsYWcgc2V0LCBhbmQgd2hlbiBpdCBpcyByZW1vdmVkIGZyb20gZmF2b3JpdGVzCisgICAgICAgICAqIGl0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZXNlIGdyb3Vwcy4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFR5cGU6IElOVEVHRVIgKGJvb2xlYW4pCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVZPUklURVMgPSAiZmF2b3JpdGVzIjsKICAgICB9CiAKICAgICAvKioKQEAgLTUxMzgsNiArNTYyMSw4IEBACiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JMb25nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgdmFsdWVzLCBERUxFVEVEKTsKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIHZhbHVlcywgTk9URVMpOwogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgdmFsdWVzLCBTSE9VTERfU1lOQyk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCB2YWx1ZXMsIEZBVk9SSVRFUyk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCB2YWx1ZXMsIEFVVE9fQUREKTsKICAgICAgICAgICAgICAgICBjdXJzb3IubW92ZVRvTmV4dCgpOwogICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRW50aXR5KHZhbHVlcyk7CiAgICAgICAgICAgICB9CkBAIC01NjU0LDYgKzYxMzksMjggQEAKICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuY29udGFjdHMuYWN0aW9uLlNIT1dfT1JfQ1JFQVRFX0NPTlRBQ1QiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBTdGFydHMgYW4gQWN0aXZpdHkgdGhhdCBsZXRzIHRoZSB1c2VyIHNlbGVjdCB0aGUgbXVsdGlwbGUgcGhvbmVzIGZyb20gYQorICAgICAgICAgKiBsaXN0IG9mIHBob25lIG51bWJlcnMgd2hpY2ggY29tZSBmcm9tIHRoZSBjb250YWN0cyBvcgorICAgICAgICAgKiB7QGxpbmsgI0VYVFJBX1BIT05FX1VSSVN9LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHBob25lIG51bWJlcnMgYmVpbmcgcGFzc2VkIGluIHRocm91Z2gge0BsaW5rICNFWFRSQV9QSE9ORV9VUklTfQorICAgICAgICAgKiBjb3VsZCBiZWxvbmcgdG8gdGhlIGNvbnRhY3RzIG9yIG5vdCwgYW5kIHdpbGwgYmUgc2VsZWN0ZWQgYnkgZGVmYXVsdC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSB1c2VyJ3Mgc2VsZWN0aW9uIHdpbGwgYmUgcmV0dXJuZWQgZnJvbQorICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25BY3Rpdml0eVJlc3VsdChpbnQsIGludCwgYW5kcm9pZC5jb250ZW50LkludGVudCl9CisgICAgICAgICAqIGlmIHRoZSByZXN1bHRDb2RlIGlzCisgICAgICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNSRVNVTFRfT0t9LCB0aGUgYXJyYXkgb2YgcGlja2VkIHBob25lCisgICAgICAgICAqIG51bWJlcnMgYXJlIGluIHRoZSBJbnRlbnQncworICAgICAgICAgKiB7QGxpbmsgI0VYVFJBX1BIT05FX1VSSVN9OyBvdGhlcndpc2UsIHRoZQorICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjUkVTVUxUX0NBTkNFTEVEfSBpcyByZXR1cm5lZCBpZiB0aGUgdXNlcgorICAgICAgICAgKiBsZWZ0IHRoZSBBY3Rpdml0eSB3aXRob3V0IGNoYW5naW5nIHRoZSBzZWxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fR0VUX01VTFRJUExFX1BIT05FUyA9CisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNvbnRhY3RzLmFjdGlvbi5HRVRfTVVMVElQTEVfUEhPTkVTIjsKKworICAgICAgICAvKioKICAgICAgICAgICogVXNlZCB3aXRoIHtAbGluayAjU0hPV19PUl9DUkVBVEVfQ09OVEFDVH0gdG8gZm9yY2UgY3JlYXRpbmcgYSBuZXcKICAgICAgICAgICogY29udGFjdCBpZiBubyBtYXRjaGluZyBjb250YWN0IGZvdW5kLiBPdGhlcndpc2UsIGRlZmF1bHQgYmVoYXZpb3IgaXMKICAgICAgICAgICogdG8gcHJvbXB0IHVzZXIgd2l0aCBkaWFsb2cgYmVmb3JlIGNyZWF0aW5nLgpAQCAtNTY3NCw2ICs2MTgxLDIzIEBACiAgICAgICAgICAgICAiY29tLmFuZHJvaWQuY29udGFjdHMuYWN0aW9uLkNSRUFURV9ERVNDUklQVElPTiI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9HRVRfTVVMVElQTEVfUEhPTkVTfSBhcyB0aGUgaW5wdXQgb3Igb3V0cHV0IHZhbHVlLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHBob25lIG51bWJlcnMgd2FudCB0byBiZSBwaWNrZWQgYnkgZGVmYXVsdCBzaG91bGQgYmUgcGFzc2VkIGluIGFzCisgICAgICAgICAqIGlucHV0IHZhbHVlLiBUaGVzZSBwaG9uZSBudW1iZXJzIGNvdWxkIGJlbG9uZyB0byB0aGUgY29udGFjdHMgb3Igbm90LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHBob25lIG51bWJlcnMgd2hpY2ggd2VyZSBwaWNrZWQgYnkgdGhlIHVzZXIgYXJlIHJldHVybmVkIGFzIG91dHB1dAorICAgICAgICAgKiB2YWx1ZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFR5cGU6IGFycmF5IG9mIFVSSXMsIHRoZSB0ZWwgVVJJIGlzIHVzZWQgZm9yIHRoZSBwaG9uZSBudW1iZXJzIHdoaWNoIGRvbid0CisgICAgICAgICAqIGJlbG9uZyB0byBhbnkgY29udGFjdCwgdGhlIGNvbnRlbnQgVVJJIGlzIHVzZWQgZm9yIHBob25lIGlkIGluIGNvbnRhY3RzLgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUEhPTkVfVVJJUyA9CisgICAgICAgICAgICAiY29tLmFuZHJvaWQuY29udGFjdHMuZXh0cmEuUEhPTkVfVVJJUyI7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIE9wdGlvbmFsIGV4dHJhIHVzZWQgd2l0aCB7QGxpbmsgI1NIT1dfT1JfQ1JFQVRFX0NPTlRBQ1R9IHRvIHNwZWNpZnkgYQogICAgICAgICAgKiBkaWFsb2cgbG9jYXRpb24gdXNpbmcgc2NyZWVuIGNvb3JkaW5hdGVzLiBXaGVuIG5vdCBzcGVjaWZpZWQsIHRoZQogICAgICAgICAgKiBkaWFsb2cgd2lsbCBiZSBjZW50ZXJlZC4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0RybVN0b3JlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Ecm1TdG9yZS5qYXZhCmluZGV4IGM0MzhhYzQuLjBhMTExYTcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0RybVN0b3JlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvRHJtU3RvcmUuamF2YQpAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgaW5zZXJ0aW5nIGEgZmlsZSBzdHJlYW0gaW50byB0aGUgRFJNIGNvbnRlbnQgcHJvdmlkZXIuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY3IgVGhlIGNvbnRlbnQgcmVzb2x2ZXIgdG8gdXNlCi0gICAgICogQHBhcmFtIGZpbGVTdHJlYW0gVGhlIEZpbGVJbnB1dFN0cmVhbSB0byBpbnNlcnQKKyAgICAgKiBAcGFyYW0gZmlzIFRoZSBGaWxlSW5wdXRTdHJlYW0gdG8gaW5zZXJ0CiAgICAgICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZSBmb3IgdGhlIGNvbnRlbnQgKG9yIG51bGwpCiAgICAgICogQHJldHVybiB1cmkgdG8gdGhlIERSTSByZWNvcmQgb3IgbnVsbAogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZS5qYXZhCmluZGV4IGQyMGU4OWQuLjYwY2NkYWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlLmphdmEKQEAgLTIzNyw5ICsyMzcsODIgQEAKICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfVFlQRSA9ICJtaW1lX3R5cGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcm93IElEIGluIHRoZSBNVFAgb2JqZWN0IHRhYmxlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZWRpYSBmaWxlLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVRQX09CSkVDVF9JRCA9ICJvYmplY3RfaWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgTVRQIG9iamVjdCBoYW5kbGUgb2YgYSBuZXdseSB0cmFuc2ZlcmVkIGZpbGUuCisgICAgICAgICAqIFVzZWQgdG8gcGFzcyB0aGUgbmV3IGZpbGUncyBvYmplY3QgaGFuZGxlIHRocm91Z2ggdGhlIG1lZGlhIHNjYW5uZXIKKyAgICAgICAgICogZnJvbSBNVFAgdG8gdGhlIG1lZGlhIHByb3ZpZGVyCisgICAgICAgICAqIEZvciBpbnRlcm5hbCB1c2Ugb25seSBieSBNVFAsIG1lZGlhIHNjYW5uZXIgYW5kIG1lZGlhIHByb3ZpZGVyLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFfU0NBTk5FUl9ORVdfT0JKRUNUX0lEID0gIm1lZGlhX3NjYW5uZXJfbmV3X29iamVjdF9pZCI7CiAgICAgIH0KIAogICAgIC8qKgorICAgICAqIE1lZGlhIHByb3ZpZGVyIGludGVyZmFjZSB1c2VkIGJ5IE1UUCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTXRwT2JqZWN0cyB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaShTdHJpbmcgdm9sdW1lTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShDT05URU5UX0FVVEhPUklUWV9TTEFTSCArIHZvbHVtZU5hbWUgKworICAgICAgICAgICAgICAgICAgICAiL29iamVjdCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgZ2V0Q29udGVudFVyaShTdHJpbmcgdm9sdW1lTmFtZSwKKyAgICAgICAgICAgICAgICBsb25nIG9iamVjdElkKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgdm9sdW1lTmFtZQorICAgICAgICAgICAgICAgICAgICArICIvb2JqZWN0LyIgKyBvYmplY3RJZCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB1c2VkIGZvciBNVFAgR2V0T2JqZWN0UmVmZXJlbmNlcyBhbmQgU2V0T2JqZWN0UmVmZXJlbmNlcworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBnZXRSZWZlcmVuY2VzVXJpKFN0cmluZyB2b2x1bWVOYW1lLAorICAgICAgICAgICAgICAgIGxvbmcgb2JqZWN0SWQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfU0xBU0ggKyB2b2x1bWVOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIi9vYmplY3QvIiArIG9iamVjdElkICsgIi9yZWZlcmVuY2VzIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRmllbGRzIGZvciBtYXN0ZXIgdGFibGUgZm9yIGFsbCBtZWRpYSBmaWxlcy4KKyAgICAgICAgICogVGFibGUgYWxzbyBjb250YWlucyBNZWRpYUNvbHVtbnMuX0lELCBEQVRBLCBTSVpFIGFuZCBEQVRFX01PRElGSUVELgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludGVyZmFjZSBPYmplY3RDb2x1bW5zIGV4dGVuZHMgTWVkaWFDb2x1bW5zIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIE1UUCBmb3JtYXQgY29kZSBvZiB0aGUgZmlsZQorICAgICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUID0gImZvcm1hdCI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIGluZGV4IG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBmaWxlCisgICAgICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlQgPSAicGFyZW50IjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBJZGVudGlmaWVyIGZvciB0aGUgbWVkaWEgdGFibGUgY29udGFpbmluZyB0aGUgb2JqZWN0LgorICAgICAgICAgICAgICogVXNlZCBpbnRlcm5hbGx5IGJ5IE1lZGlhUHJvdmlkZXIKKyAgICAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1RBQkxFID0gIm1lZGlhX3RhYmxlIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIG9iamVjdCBpbiBpdHMgbWVkaWEgdGFibGUuCisgICAgICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQV9JRCA9ICJtZWRpYV9pZCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgaW50ZXJuYWxseSBieSBJbWFnZXMuVGh1bWJuYWlscyBhbmQgVmlkZW8uVGh1bWJuYWlscywgaXQncyBub3QgaW50ZW5kZWQKICAgICAgKiB0byBiZSBhY2Nlc3NlZCBlbHNld2hlcmUuCiAgICAgICovCkBAIC0zMTksMjYgKzM5MiwyNyBAQAogICAgICAgICAgICAgLy8gTG9nLnYoVEFHLCAiZ2V0VGh1bWJuYWlsOiBvcmlnSWQ9IitvcmlnSWQrIiwga2luZD0iK2tpbmQrIiwgaXNWaWRlbz0iK2lzVmlkZW8pOwogICAgICAgICAgICAgLy8gSWYgdGhlIG1hZ2ljIGlzIG5vbi16ZXJvLCB3ZSBzaW1wbHkgcmV0dXJuIHRodW1ibmFpbCBpZiBpdCBkb2VzIGV4aXN0LgogICAgICAgICAgICAgLy8gcXVlcnlpbmcgTWVkaWFQcm92aWRlciBhbmQgc2ltcGx5IHJldHVybiB0aHVtYm5haWwuCi0gICAgICAgICAgICBNaW5pVGh1bWJGaWxlIHRodW1iRmlsZSA9IE1pbmlUaHVtYkZpbGUuaW5zdGFuY2UoYmFzZVVyaSk7Ci0gICAgICAgICAgICBsb25nIG1hZ2ljID0gdGh1bWJGaWxlLmdldE1hZ2ljKG9yaWdJZCk7Ci0gICAgICAgICAgICBpZiAobWFnaWMgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChraW5kID09IE1JQ1JPX0tJTkQpIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzVGh1bWJCdWZMb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1RodW1iQnVmID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzVGh1bWJCdWYgPSBuZXcgYnl0ZVtNaW5pVGh1bWJGaWxlLkJZVEVTX1BFUl9NSU5USFVNQl07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGh1bWJGaWxlLmdldE1pbmlUaHVtYkZyb21GaWxlKG9yaWdJZCwgc1RodW1iQnVmKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkoc1RodW1iQnVmLCAwLCBzVGh1bWJCdWYubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0bWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY291bGRuJ3QgZGVjb2RlIGJ5dGUgYXJyYXkuIik7CisgICAgICAgICAgICBNaW5pVGh1bWJGaWxlIHRodW1iRmlsZSA9IG5ldyBNaW5pVGh1bWJGaWxlKGlzVmlkZW8gPyBWaWRlby5NZWRpYS5FWFRFUk5BTF9DT05URU5UX1VSSQorICAgICAgICAgICAgICAgICAgICA6IEltYWdlcy5NZWRpYS5FWFRFUk5BTF9DT05URU5UX1VSSSk7CisgICAgICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgbWFnaWMgPSB0aHVtYkZpbGUuZ2V0TWFnaWMob3JpZ0lkKTsKKyAgICAgICAgICAgICAgICBpZiAobWFnaWMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA9PSBNSUNST19LSU5EKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNUaHVtYkJ1ZkxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1RodW1iQnVmID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1RodW1iQnVmID0gbmV3IGJ5dGVbTWluaVRodW1iRmlsZS5CWVRFU19QRVJfTUlOVEhVTUJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGh1bWJGaWxlLmdldE1pbmlUaHVtYkZyb21GaWxlKG9yaWdJZCwgc1RodW1iQnVmKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KHNUaHVtYkJ1ZiwgMCwgc1RodW1iQnVmLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRtYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY291bGRuJ3QgZGVjb2RlIGJ5dGUgYXJyYXkuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT0gTUlOSV9LSU5EKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb2x1bW4gPSBpc1ZpZGVvID8gInZpZGVvX2lkPSIgOiAiaW1hZ2VfaWQ9IjsKLSAgICAgICAgICAgICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChraW5kID09IE1JTklfS0lORCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbHVtbiA9IGlzVmlkZW8gPyAidmlkZW9faWQ9IiA6ICJpbWFnZV9pZD0iOwogICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KGJhc2VVcmksIFBST0pFQ1RJT04sIGNvbHVtbiArIG9yaWdJZCwgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsICYmIGMubW92ZVRvRmlyc3QoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IGdldE1pbmlUaHVtYkZyb21GaWxlKGMsIGJhc2VVcmksIGNyLCBvcHRpb25zKTsKQEAgLTM0NiwxNyArNDIwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgYy5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDdXJzb3IgYyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIFVyaSBibG9ja2luZ1VyaSA9IGJhc2VVcmkuYnVpbGRVcG9uKCkuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoImJsb2NraW5nIiwgIjEiKQogICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKCJvcmlnX2lkIiwgU3RyaW5nLnZhbHVlT2Yob3JpZ0lkKSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRRdWVyeVBhcmFtZXRlcigiZ3JvdXBfaWQiLCBTdHJpbmcudmFsdWVPZihncm91cElkKSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KGJsb2NraW5nVXJpLCBQUk9KRUNUSU9OLCBudWxsLCBudWxsLCBudWxsKTsKICAgICAgICAgICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiBvcmlnaW5hbCBpbWFnZS92aWRlbyBkb2Vzbid0IGV4aXN0LgogICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwpIHJldHVybiBudWxsOwpAQCAtNDA3LDYgKzQ3Nyw5IEBACiAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCBleCk7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAvLyBUbyBhdm9pZCBmaWxlIGRlc2NyaXB0b3IgbGVhayBpbiBhcHBsaWNhdGlvbiBwcm9jZXNzLgorICAgICAgICAgICAgICAgIHRodW1iRmlsZS5kZWFjdGl2YXRlKCk7CisgICAgICAgICAgICAgICAgdGh1bWJGaWxlID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL010cC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTXRwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1ZGJhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL010cC5qYXZhCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByb3ZpZGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogVGhlIE1UUCBwcm92aWRlciBzdXBwb3J0cyBhY2Nlc3NpbmcgY29udGVudCBvbiBNVFAgYW5kIFBUUCBkZXZpY2VzLgorICogQGhpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE10cAoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiTXRwIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWSA9ICJtdHAiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIID0gImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0FVVEhPUklUWV9ERVZJQ0VfU0xBU0ggPSAiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL2RldmljZS8iOworCisKKyAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBBY3Rpb246ICBBIGJyb2FkY2FzdCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIGFuIE1UUCBzZXNzaW9uIHdpdGggdGhlIGhvc3QuCisgICAgICogVGhpcyBicm9hZGNhc3QgaXMgb25seSBzZW50IGlmIE1UUCBhY3Rpdml0eSBoYXMgbW9kaWZpZWQgdGhlIG1lZGlhIGRhdGFiYXNlIGR1cmluZyB0aGUKKyAgICAgKiBtb3N0IHJlY2VudCBNVFAgc2Vzc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9NVFBfU0VTU0lPTl9FTkQgPSAiYW5kcm9pZC5wcm92aWRlci5hY3Rpb24uTVRQX1NFU1NJT05fRU5EIjsKKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGxpc3Qgb2YgYWxsIE1UUC9QVFAgZGV2aWNlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRGV2aWNlIGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgImRldmljZSIpOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmkoaW50IGRldmljZUlEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlEKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWFudWZhY3R1cmVyIG9mIHRoZSBkZXZpY2UKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTlVGQUNUVVJFUiA9ICJtYW51ZmFjdHVyZXIiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbW9kZWwgbmFtZSBvZiB0aGUgZGV2aWNlCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTCA9ICJtb2RlbCI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udGFpbnMgbGlzdCBvZiBzdG9yYWdlIHVuaXRzIGZvciBhbiBNVFAvUFRQIGRldmljZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU3RvcmFnZSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRDb250ZW50VXJpKGludCBkZXZpY2VJRCkgeworICAgICAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShDT05URU5UX0FVVEhPUklUWV9ERVZJQ0VfU0xBU0ggKyBkZXZpY2VJRCArICIvc3RvcmFnZSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaShpbnQgZGV2aWNlSUQsIGludCBzdG9yYWdlSUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQgKyAiL3N0b3JhZ2UvIiArIHN0b3JhZ2VJRCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU3RvcmFnZSB1bml0IGlkZW50aWZpZXIKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USUZJRVIgPSAiaWRlbnRpZmllciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0b3JhZ2UgdW5pdCBkZXNjcmlwdGlvbgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGxpc3Qgb2Ygb2JqZWN0cyBvbiBhbiBNVFAvUFRQIGRldmljZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgT2JqZWN0IGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmkoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQKKyAgICAgICAgICAgICAgICAgICAgKyAiL29iamVjdC8iICsgb2JqZWN0SUQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaUZvck9iamVjdENoaWxkcmVuKGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlECisgICAgICAgICAgICAgICAgICAgICsgIi9vYmplY3QvIiArIG9iamVjdElEICsgIi9jaGlsZCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaUZvclN0b3JhZ2VDaGlsZHJlbihpbnQgZGV2aWNlSUQsIGludCBzdG9yYWdlSUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQKKyAgICAgICAgICAgICAgICAgICAgKyAiL3N0b3JhZ2UvIiArIHN0b3JhZ2VJRCArICIvY2hpbGQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGNvbHVtbnMgY29ycmVzcG9uZCB0byB0aGUgZmllbGRzIGluIHRoZSBPYmplY3RJbmZvIGRhdGFzZXQKKyAgICAgICAgICogYXMgZGVzY3JpYmVkIGluIHRoZSBNVFAgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgc3RvcmFnZSB1bml0IGNvbnRhaW5pbmcgdGhlIG9iamVjdC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JBR0VfSUQgPSAic3RvcmFnZV9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvYmplY3QncyBmb3JtYXQuICBDYW4gYmUgb25lIG9mIHRoZSBGT1JNQVRfKiBzeW1ib2xzIGJlbG93LAorICAgICAgICAgKiBvciBhbnkgb2YgdGhlIHZhbGlkIE1UUCBvYmplY3QgZm9ybWF0cyBhcyBkZWZpbmVkIGluIHRoZSBNVFAgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVCA9ICJmb3JtYXQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcHJvdGVjdGlvbiBzdGF0dXMgb2YgdGhlIG9iamVjdC4gIFNlZSB0aGUgUFJPVEVDVElPTl9TVEFUVVNfKnN5bWJvbHMgYmVsb3cuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9URUNUSU9OX1NUQVRVUyA9ICJwcm90ZWN0aW9uX3N0YXR1cyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzaXplIG9mIHRoZSBvYmplY3QgaW4gYnl0ZXMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSVpFID0gInNpemUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb2JqZWN0J3MgdGh1bWJuYWlsIGZvcm1hdC4gIENhbiBiZSBvbmUgb2YgdGhlIEZPUk1BVF8qIHN5bWJvbHMgYmVsb3csCisgICAgICAgICAqIG9yIGFueSBvZiB0aGUgdmFsaWQgTVRQIG9iamVjdCBmb3JtYXRzIGFzIGRlZmluZWQgaW4gdGhlIE1UUCBzcGVjaWZpY2F0aW9uLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhVTUJfRk9STUFUID0gImZvcm1hdCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzaXplIG9mIHRoZSBvYmplY3QncyB0aHVtYm5haWwgaW4gYnl0ZXMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQl9TSVpFID0gInRodW1iX3NpemUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIG9iamVjdCdzIHRodW1ibmFpbCBpbiBwaXhlbHMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQl9XSURUSCA9ICJ0aHVtYl93aWR0aCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIG9iamVjdCdzIHRodW1ibmFpbCBpbiBwaXhlbHMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQl9IRUlHSFQgPSAidGh1bWJfaGVpZ2h0IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9iamVjdCdzIHRodW1ibmFpbC4KKyAgICAgICAgICogPFA+VHlwZTogQkxPQjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIVU1CID0gInRodW1iIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBvYmplY3QgaW4gcGl4ZWxzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfV0lEVEggPSAiaW1hZ2Vfd2lkdGgiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBvYmplY3QgaW4gcGl4ZWxzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfSEVJR0hUID0gImltYWdlX2hlaWdodCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkZXB0aCBvZiB0aGUgb2JqZWN0IGluIGJpdHMgcGVyIHBpeGVsLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfREVQVEggPSAiaW1hZ2VfZGVwdGgiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIG9iamVjdCdzIHBhcmVudCwgb3IgemVybyBpZiB0aGUgb2JqZWN0CisgICAgICAgICAqIGlzIGluIHRoZSByb290IG9mIGl0cyBzdG9yYWdlIHVuaXQuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlQgPSAicGFyZW50IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGFzc29jaWF0aW9uIHR5cGUgZm9yIGEgY29udGFpbmVyIG9iamVjdC4KKyAgICAgICAgICogRm9yIGZvbGRlcnMgdGhpcyBpcyB0eXBpY2FsbHkge0BsaW5rICNBU1NPQ0lBVElPTl9UWVBFX0dFTkVSSUNfRk9MREVSfQorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTT0NJQVRJT05fVFlQRSA9ICJhc3NvY2lhdGlvbl90eXBlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udGFpbnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBjb250YWluZXIgb2JqZWN0cy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU09DSUFUSU9OX0RFU0MgPSAiYXNzb2NpYXRpb25fZGVzYyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIG9iamVjdCwgdHlwaWNhbGx5IHVzZWQgZm9yIGFuIGFzc29jaWF0aW9uCisgICAgICAgICAqIGNvbnRhaW5pbmcgaW1hZ2VzIHRha2VuIGluIHNlcXVlbmNlLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VRVUVOQ0VfTlVNQkVSID0gInNlcXVlbmNlX251bWJlciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBvYmplY3QuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkLCBpbiBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfQ1JFQVRFRCA9ICJkYXRlX2NyZWF0ZWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgb2JqZWN0IHdhcyBsYXN0IG1vZGlmaWVkLCBpbiBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfTU9ESUZJRUQgPSAiZGF0ZV9tb2RpZmllZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgbGlzdCBvZiBrZXl3b3JkcyBhc3NvY2lhdGVkIHdpdGggYW4gb2JqZWN0LCBzZXBhcmF0ZWQgYnkgc3BhY2VzLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZV09SRFMgPSAia2V5d29yZHMiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhCmluZGV4IGY1ZmFkNGQuLmQxY2E3MjMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQpAQCAtMTYsMTQgKzE2LDExIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5wcm92aWRlcjsKIAotaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5jb2xsZWN0Lk1hcHM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkJhc2U2NDsKIAogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQuU2RrQ29uc3RhbnRUeXBlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UXVlcnlNYXA7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKQEAgLTM4LDE5ICszNSwxNCBAQAogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLio7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BbmRyb2lkRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIAogLyoqCkBAIC0xMDA5LDcgKzEwMDEsNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzSW50ZXJlc3RpbmdDb25maWd1cmF0aW9uQ2hhbmdlcyhpbnQgY2hhbmdlcykgewogICAgICAgICAgICAgcmV0dXJuIChjaGFuZ2VzJkFjdGl2aXR5SW5mby5DT05GSUdfRk9OVF9TQ0FMRSkgIT0gMDsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0U2hvd0dUYWxrU2VydmljZVN0YXR1cyhDb250ZW50UmVzb2x2ZXIgY3IpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRJbnQoY3IsIFNIT1dfR1RBTEtfU0VSVklDRV9TVEFUVVMsIDApICE9IDA7CiAgICAgICAgIH0KQEAgLTEyMTYsNyArMTIwOCw3IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0tfUEFUVEVSTl9WSVNJQkxFID0gImxvY2tfcGF0dGVybl92aXNpYmxlX3BhdHRlcm4iOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UgCisgICAgICAgICAqIEBkZXByZWNhdGVkIFVzZQogICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUjTE9DS19QQVRURVJOX1RBQ1RJTEVfRkVFREJBQ0tfRU5BQkxFRH0KICAgICAgICAgICogaW5zdGVhZAogICAgICAgICAgKi8KQEAgLTE2OTQsNiArMTY4NiwxMiBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkxPQ0tfU09VTkQgPSAidW5sb2NrX3NvdW5kIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgYXBwZWFyIGFzIGEgUFRQIGRldmljZSBpbnN0ZWFkIG9mIE1UUC4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9QVFBfSU5URVJGQUNFID0gInVzZV9wdHBfaW50ZXJmYWNlIjsKKworICAgICAgICAvKioKICAgICAgICAgICogUmVjZWl2ZSBpbmNvbWluZyBTSVAgY2FsbHM/CiAgICAgICAgICAqIDAgPSBubwogICAgICAgICAgKiAxID0geWVzCkBAIC0xNzg5LDYgKzE3ODcsNyBAQAogICAgICAgICAgICAgTE9DS1NDUkVFTl9TT1VORFNfRU5BQkxFRCwKICAgICAgICAgICAgIFNIT1dfV0VCX1NVR0dFU1RJT05TLAogICAgICAgICAgICAgTk9USUZJQ0FUSU9OX0xJR0hUX1BVTFNFLAorICAgICAgICAgICAgVVNFX1BUUF9JTlRFUkZBQ0UsCiAgICAgICAgICAgICBTSVBfQ0FMTF9PUFRJT05TLAogICAgICAgICAgICAgU0lQX1JFQ0VJVkVfQ0FMTFMKICAgICAgICAgfTsKQEAgLTIzMjcsNiArMjMyNiwxNCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUga2V5IHRoYXQgcmV0cmlldmVzIGEgYmx1ZXRvb3RoIElucHV0IERldmljZSdzIHByaW9yaXR5LgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0Qmx1ZXRvb3RoSW5wdXREZXZpY2VQcmlvcml0eUtleShTdHJpbmcgYWRkcmVzcykgeworICAgICAgICAgICAgcmV0dXJuICgiYmx1ZXRvb3RoX2lucHV0X2RldmljZV9wcmlvcml0eV8iICsgYWRkcmVzcy50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgogICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCBkYXRhIHJvYW1pbmcgaXMgZW5hYmxlZC4gKDAgPSBmYWxzZSwgMSA9IHRydWUpCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1JPQU1JTkcgPSAiZGF0YV9yb2FtaW5nIjsKQEAgLTIzNTgsMTEgKzIzNjUsMjYgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfU1lTVEVNX0lOUFVUX01FVEhPRFMgPSAiZGlzYWJsZWRfc3lzdGVtX2lucHV0X21ldGhvZHMiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBIb3N0IG5hbWUgYW5kIHBvcnQgZm9yIGEgdXNlci1zZWxlY3RlZCBwcm94eS4KKyAgICAgICAgICogSG9zdCBuYW1lIGFuZCBwb3J0IGZvciBnbG9iYWwgcHJveHkuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BST1hZID0gImh0dHBfcHJveHkiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBFeGNsdXNpb24gbGlzdCBmb3IgZ2xvYmFsIHByb3h5LiBUaGlzIHN0cmluZyBjb250YWlucyBhIGxpc3Qgb2YgY29tbWEtc2VwYXJhdGVkCisgICAgICAgICAqIGRvbWFpbnMgd2hlcmUgdGhlIGdsb2JhbCBwcm94eSBkb2VzIG5vdCBhcHBseS4gRG9tYWlucyBzaG91bGQgYmUgbGlzdGVkIGluIGEgY29tbWEtCisgICAgICAgICAqIHNlcGFyYXRlZCBsaXN0LiBFeGFtcGxlIG9mIGFjY2VwdGFibGUgZm9ybWF0czogIi5kb21haW4xLmNvbSxteS5kb21haW4yLmNvbSIKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUFJPWFlfRVhDTFVTSU9OX0xJU1QgPSAiaHR0cF9wcm94eV9leGNsdXNpb25fbGlzdCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEVuYWJsZXMgdGhlIFVJIHNldHRpbmcgdG8gYWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgZ2xvYmFsIEhUVFAgcHJveHkKKyAgICAgICAgICogYW5kIGFzc29jaWF0ZWQgZXhjbHVzaW9uIGxpc3QuCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfR0xPQkFMX0hUVFBfUFJPWFkgPSAic2V0X2dsb2JhbF9odHRwX3Byb3h5IjsKKworICAgICAgICAvKioKICAgICAgICAgICogV2hldGhlciB0aGUgcGFja2FnZSBpbnN0YWxsZXIgc2hvdWxkIGFsbG93IGluc3RhbGxhdGlvbiBvZiBhcHBzIGRvd25sb2FkZWQgZnJvbQogICAgICAgICAgKiBzb3VyY2VzIG90aGVyIHRoYW4gdGhlIEFuZHJvaWQgTWFya2V0ICh2ZW5kaW5nIG1hY2hpbmUpLgogICAgICAgICAgKgpAQCAtMjQ1Myw2ICsyNDc1LDE0IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVEFMX0NPTlRST0xfUkVESVJFQ1RfVVJMID0gInBhcmVudGFsX2NvbnRyb2xfcmVkaXJlY3RfdXJsIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogQSBwb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGZyZXF1ZW5jeSBvZiBTYW1wbGluZ1Byb2ZpbGVyCisgICAgICAgICAqIHRha2luZyBzbmFwc2hvdHMgaW4gaGVydHouIFplcm8gdmFsdWUgbWVhbnMgU2FtcGxpbmdQcm9maWxlciBpcyBkaXNhYmxlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBTVBMSU5HX1BST0ZJTEVSX0haID0gInNhbXBsaW5nX3Byb2ZpbGVyX2h6IjsKKworICAgICAgICAvKioKICAgICAgICAgICogU2V0dGluZ3MgY2xhc3NuYW1lIHRvIGxhdW5jaCB3aGVuIFNldHRpbmdzIGlzIGNsaWNrZWQgZnJvbSBBbGwKICAgICAgICAgICogQXBwbGljYXRpb25zLiAgTmVlZGVkIGJlY2F1c2Ugb2YgdXNlciB0ZXN0aW5nIGJldHdlZW4gdGhlIG9sZAogICAgICAgICAgKiBhbmQgbmV3IFNldHRpbmdzIGFwcHMuCkBAIC0zNjE4LDIwICszNjQ4LDggQEAKICAgICAgICAgICAgIC8vIElmIGEgc2hvcnRjdXQgaXMgc3VwcGxpZWQsIGFuZCBpdCBpcyBhbHJlYWR5IGRlZmluZWQgZm9yCiAgICAgICAgICAgICAvLyBhbm90aGVyIGJvb2ttYXJrLCB0aGVuIHJlbW92ZSB0aGUgb2xkIGRlZmluaXRpb24uCiAgICAgICAgICAgICBpZiAoc2hvcnRjdXQgIT0gMCkgewotICAgICAgICAgICAgICAgIEN1cnNvciBjID0gY3IucXVlcnkoQ09OVEVOVF9VUkksCi0gICAgICAgICAgICAgICAgICAgICAgICBzU2hvcnRjdXRQcm9qZWN0aW9uLCBzU2hvcnRjdXRTZWxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBTdHJpbmcudmFsdWVPZigoaW50KSBzaG9ydGN1dCkgfSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGMuZ2V0Q291bnQoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWMuZGVsZXRlUm93KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ291bGQgbm90IGRlbGV0ZSBleGlzdGluZyBzaG9ydGN1dCByb3ciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNyLmRlbGV0ZShDT05URU5UX1VSSSwgc1Nob3J0Y3V0U2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgU3RyaW5nLnZhbHVlT2YoKGludCkgc2hvcnRjdXQpIH0pOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoRXZlbnRMb29wLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoRXZlbnRMb29wLmphdmEKaW5kZXggMzVhNTgyZC4uMzg2MWVmNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEV2ZW50TG9vcC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhFdmVudExvb3AuamF2YQpAQCAtMjAsNiArMjAsOCBAQAogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQ2xhc3M7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aElucHV0RGV2aWNlOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFBhbjsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhVdWlkOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CkBAIC0zNjQsNyArMzY2LDggQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBsb2coIkRldmljZSBwcm9wZXJ0eSBjaGFuZ2VkOiIgKyBhZGRyZXNzICsgInByb3BlcnR5OiIgKyBuYW1lKTsKKyAgICAgICAgICAgIGxvZygiRGV2aWNlIHByb3BlcnR5IGNoYW5nZWQ6ICIgKyBhZGRyZXNzICsgIiBwcm9wZXJ0eTogIgorICAgICAgICAgICAgICAgICAgICArIG5hbWUgKyAiIHZhbHVlOiAiICsgcHJvcFZhbHVlc1sxXSk7CiAgICAgICAgIH0KICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJOYW1lIikpIHsKQEAgLTQyNyw2ICs0MzAsMzkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBvbklucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwYXRoLCBTdHJpbmdbXSBwcm9wVmFsdWVzKSB7CisgICAgICAgIFN0cmluZyBhZGRyZXNzID0gbUJsdWV0b290aFNlcnZpY2UuZ2V0QWRkcmVzc0Zyb21PYmplY3RQYXRoKHBhdGgpOworICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJvbklucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2VkOiBBZGRyZXNzIG9mIHRoZSByZW1vdGUgZGV2aWNlIGluIG51bGwiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBsb2coIiBJbnB1dCBEZXZpY2UgOiBOYW1lIG9mIFByb3BlcnR5IGlzOiIgKyBwcm9wVmFsdWVzWzBdKTsKKyAgICAgICAgYm9vbGVhbiBzdGF0ZSA9IGZhbHNlOworICAgICAgICBpZiAocHJvcFZhbHVlc1sxXS5lcXVhbHMoInRydWUiKSkgeworICAgICAgICAgICAgc3RhdGUgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1CbHVldG9vdGhTZXJ2aWNlLmhhbmRsZUlucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2UoYWRkcmVzcywgc3RhdGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvblBhbkRldmljZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgZGV2aWNlT2JqZWN0UGF0aCwgU3RyaW5nW10gcHJvcFZhbHVlcykgeworICAgICAgICBTdHJpbmcgbmFtZSA9IHByb3BWYWx1ZXNbMF07CisgICAgICAgIFN0cmluZyBhZGRyZXNzID0gbUJsdWV0b290aFNlcnZpY2UuZ2V0QWRkcmVzc0Zyb21PYmplY3RQYXRoKGRldmljZU9iamVjdFBhdGgpOworICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJvblBhbkRldmljZVByb3BlcnR5Q2hhbmdlZDogQWRkcmVzcyBvZiB0aGUgcmVtb3RlIGRldmljZSBpbiBudWxsIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgbG9nKCJQYW4gRGV2aWNlIHByb3BlcnR5IGNoYW5nZWQ6ICIgKyBhZGRyZXNzICsgIiAgcHJvcGVydHk6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBuYW1lICsgIiB2YWx1ZTogIisgcHJvcFZhbHVlc1sxXSk7CisgICAgICAgIH0KKyAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKKyAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJDb25uZWN0ZWQiKSkgeworICAgICAgICAgICAgaW50IHN0YXRlID0gcHJvcFZhbHVlc1sxXS5lcXVhbHMoInRydWUiKSA/IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RFRCA6CisgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgICAgICAgbUJsdWV0b290aFNlcnZpY2UuaGFuZGxlUGFuRGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBzdGF0ZSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIFN0cmluZyBjaGVja1BhaXJpbmdSZXF1ZXN0QW5kR2V0QWRkcmVzcyhTdHJpbmcgb2JqZWN0UGF0aCwgaW50IG5hdGl2ZURhdGEpIHsKICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRBZGRyZXNzRnJvbU9iamVjdFBhdGgob2JqZWN0UGF0aCk7CiAgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHsKQEAgLTU3Myw2ICs2MDksOCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBvbkFnZW50QXV0aG9yaXplKFN0cmluZyBvYmplY3RQYXRoLCBTdHJpbmcgZGV2aWNlVXVpZCkgeworICAgICAgICBpZiAoIW1CbHVldG9vdGhTZXJ2aWNlLmlzRW5hYmxlZCgpKSByZXR1cm4gZmFsc2U7CisKICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRBZGRyZXNzRnJvbU9iamVjdFBhdGgob2JqZWN0UGF0aCk7CiAgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIlVuYWJsZSB0byBnZXQgZGV2aWNlIGFkZHJlc3MgaW4gb25BdXRoQWdlbnRBdXRob3JpemUiKTsKQEAgLTU4MSwxNSArNjE5LDE1IEBACiAKICAgICAgICAgYm9vbGVhbiBhdXRob3JpemVkID0gZmFsc2U7CiAgICAgICAgIFBhcmNlbFV1aWQgdXVpZCA9IFBhcmNlbFV1aWQuZnJvbVN0cmluZyhkZXZpY2VVdWlkKTsKLSAgICAgICAgQmx1ZXRvb3RoQTJkcCBhMmRwID0gbmV3IEJsdWV0b290aEEyZHAobUNvbnRleHQpOworICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOwogCiAgICAgICAgIC8vIEJsdWV6IHNlbmRzIHRoZSBVVUlEIG9mIHRoZSBsb2NhbCBzZXJ2aWNlIGJlaW5nIGFjY2Vzc2VkLCBfbm90XyB0aGUKICAgICAgICAgLy8gcmVtb3RlIHNlcnZpY2UKLSAgICAgICAgaWYgKG1CbHVldG9vdGhTZXJ2aWNlLmlzRW5hYmxlZCgpICYmCi0gICAgICAgICAgICAgICAgKEJsdWV0b290aFV1aWQuaXNBdWRpb1NvdXJjZSh1dWlkKSB8fCBCbHVldG9vdGhVdWlkLmlzQXZyY3BUYXJnZXQodXVpZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IEJsdWV0b290aFV1aWQuaXNBZHZBdWRpb0Rpc3QodXVpZCkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhaXNPdGhlclNpbmtJbk5vbkRpc2Nvbm5lY3RpbmdTdGF0ZShhZGRyZXNzKSkgewotICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKKyAgICAgICAgaWYgKChCbHVldG9vdGhVdWlkLmlzQXVkaW9Tb3VyY2UodXVpZCkgfHwgQmx1ZXRvb3RoVXVpZC5pc0F2cmNwVGFyZ2V0KHV1aWQpCisgICAgICAgICAgICAgIHx8IEJsdWV0b290aFV1aWQuaXNBZHZBdWRpb0Rpc3QodXVpZCkpICYmCisgICAgICAgICAgICAgICFpc090aGVyU2lua0luTm9uRGlzY29ubmVjdGluZ1N0YXRlKGFkZHJlc3MpKSB7CisgICAgICAgICAgICBCbHVldG9vdGhBMmRwIGEyZHAgPSBuZXcgQmx1ZXRvb3RoQTJkcChtQ29udGV4dCk7CisKICAgICAgICAgICAgIGF1dGhvcml6ZWQgPSBhMmRwLmdldFNpbmtQcmlvcml0eShkZXZpY2UpID4gQmx1ZXRvb3RoQTJkcC5QUklPUklUWV9PRkY7CiAgICAgICAgICAgICBpZiAoYXV0aG9yaXplZCkgewogICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkFsbG93aW5nIGluY29taW5nIEEyRFAgLyBBVlJDUCBjb25uZWN0aW9uIGZyb20gIiArIGFkZHJlc3MpOwpAQCAtNTk3LDYgKzYzNSwxNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJSZWplY3RpbmcgaW5jb21pbmcgQTJEUCAvIEFWUkNQIGNvbm5lY3Rpb24gZnJvbSAiICsgYWRkcmVzcyk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoQmx1ZXRvb3RoVXVpZC5pc0lucHV0RGV2aWNlKHV1aWQpICYmICFpc090aGVySW5wdXREZXZpY2VDb25uZWN0ZWQoYWRkcmVzcykpIHsKKyAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlIGlucHV0RGV2aWNlID0gbmV3IEJsdWV0b290aElucHV0RGV2aWNlKG1Db250ZXh0KTsKKyAgICAgICAgICAgIGF1dGhvcml6ZWQgPSBpbnB1dERldmljZS5nZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSkgPgorICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX09GRjsKKyAgICAgICAgICAgICBpZiAoYXV0aG9yaXplZCkgeworICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJBbGxvd2luZyBpbmNvbWluZyBISUQgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKKyAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJSZWplY3RpbmcgaW5jb21pbmcgSElEIGNvbm5lY3Rpb24gZnJvbSAiICsgYWRkcmVzcyk7CisgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKEJsdWV0b290aFV1aWQuaXNCbmVwKHV1aWQpIHx8IEJsdWV0b290aFV1aWQuaXNOYXAodXVpZCkpeworICAgICAgICAgICAgYXV0aG9yaXplZCA9IHRydWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBMb2cuaShUQUcsICJSZWplY3RpbmcgaW5jb21pbmcgIiArIGRldmljZVV1aWQgKyAiIGNvbm5lY3Rpb24gZnJvbSAiICsgYWRkcmVzcyk7CiAgICAgICAgIH0KQEAgLTYwNCw3ICs2NTMsMTkgQEAKICAgICAgICAgcmV0dXJuIGF1dGhvcml6ZWQ7CiAgICAgfQogCi0gICAgYm9vbGVhbiBpc090aGVyU2lua0luTm9uRGlzY29ubmVjdGluZ1N0YXRlKFN0cmluZyBhZGRyZXNzKSB7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzT3RoZXJJbnB1dERldmljZUNvbm5lY3RlZChTdHJpbmcgYWRkcmVzcykgeworICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzID0KKyAgICAgICAgICAgIG1CbHVldG9vdGhTZXJ2aWNlLmxvb2t1cElucHV0RGV2aWNlc01hdGNoaW5nU3RhdGVzKG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNUSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEfSk7CisKKyAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlIDogZGV2aWNlcykgeworICAgICAgICAgICAgaWYgKCFkZXZpY2UuZ2V0QWRkcmVzcygpLmVxdWFscyhhZGRyZXNzKSkgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc090aGVyU2lua0luTm9uRGlzY29ubmVjdGluZ1N0YXRlKFN0cmluZyBhZGRyZXNzKSB7CiAgICAgICAgIEJsdWV0b290aEEyZHAgYTJkcCA9IG5ldyBCbHVldG9vdGhBMmRwKG1Db250ZXh0KTsKICAgICAgICAgU2V0PEJsdWV0b290aERldmljZT4gZGV2aWNlcyA9IGEyZHAuZ2V0Tm9uRGlzY29ubmVjdGVkU2lua3MoKTsKICAgICAgICAgaWYgKGRldmljZXMuc2l6ZSgpID09IDApIHJldHVybiBmYWxzZTsKQEAgLTY1NSw2ICs3MTYsNTAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBvbklucHV0RGV2aWNlQ29ubmVjdGlvblJlc3VsdChTdHJpbmcgcGF0aCwgYm9vbGVhbiByZXN1bHQpIHsKKyAgICAgICAgLy8gU3VjY2VzcyBjYXNlIGdldHMgaGFuZGxlZCBieSBQcm9wZXJ0eSBDaGFuZ2Ugc2lnbmFsCisgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldEFkZHJlc3NGcm9tT2JqZWN0UGF0aChwYXRoKTsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CisgICAgICAgICAgICBpbnQgc3RhdGUgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRJbnB1dERldmljZVN0YXRlKGRldmljZSk7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVElORykgeworICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNUSU5HKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3Igb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQuIFN0YXRlIGlzOiIgKyBzdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS5oYW5kbGVJbnB1dERldmljZVByb3BlcnR5Q2hhbmdlKGFkZHJlc3MsIGNvbm5lY3RlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25QYW5EZXZpY2VDb25uZWN0aW9uUmVzdWx0KFN0cmluZyBwYXRoLCBib29sZWFuIHJlc3VsdCkgeworICAgICAgICBsb2cgKCJvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQgIiArIHBhdGggKyAiICIgKyByZXN1bHQpOworICAgICAgICAvLyBTdWNjZXNzIGNhc2UgZ2V0cyBoYW5kbGVkIGJ5IFByb3BlcnR5IENoYW5nZSBzaWduYWwKKyAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gbUJsdWV0b290aFNlcnZpY2UuZ2V0QWRkcmVzc0Zyb21PYmplY3RQYXRoKHBhdGgpOworICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICBib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKKyAgICAgICAgICAgIGludCBzdGF0ZSA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldFBhbkRldmljZVN0YXRlKGRldmljZSk7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RJTkcpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RJTkcpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQuIFN0YXRlIGlzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHN0YXRlICsgIiByZXN1bHQ6ICIrIHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbmV3U3RhdGUgPSBjb25uZWN0ZWQ/IEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQgOgorICAgICAgICAgICAgICAgIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS5oYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIG5ld1N0YXRlKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBvblJlc3RhcnRSZXF1aXJlZCgpIHsKICAgICAgICAgaWYgKG1CbHVldG9vdGhTZXJ2aWNlLmlzRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICBMb2cuZShUQUcsICIqKiogQSBzZXJpb3VzIGVycm9yIG9jY3VyZWQgKGRpZCBibHVldG9vdGhkIGNyYXNoPykgLSAiICsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhTZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoU2VydmljZS5qYXZhCmluZGV4IGIyYWEwNGQuLmZhNWYxNTYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhTZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aFNlcnZpY2UuamF2YQpAQCAtMjksNyArMjksOSBAQAogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0OwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQYW47CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZVN0YXRlOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aElucHV0RGV2aWNlOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFNvY2tldDsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhVdWlkOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGg7CkBAIC00MCw5ICs0MiwxMiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5JbnRlcmZhY2VDb25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbFV1aWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CkBAIC03MCw4ICs3NSwxMCBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBwdWJsaWMgY2xhc3MgQmx1ZXRvb3RoU2VydmljZSBleHRlbmRzIElCbHVldG9vdGguU3R1YiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhTZXJ2aWNlIjsKQEAgLTg0LDYgKzkxLDcgQEAKICAgICBwcml2YXRlIGludCBtQmx1ZXRvb3RoU3RhdGU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1SZXN0YXJ0ID0gZmFsc2U7ICAvLyBuZWVkIHRvIGNhbGwgZW5hYmxlKCkgYWZ0ZXIgZGlzYWJsZSgpCiAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0Rpc2NvdmVyaW5nOworICAgIHByaXZhdGUgYm9vbGVhbiBtVGV0aGVyaW5nT247CiAKICAgICBwcml2YXRlIEJsdWV0b290aEFkYXB0ZXIgbUFkYXB0ZXI7ICAvLyBjb25zdGFudCBhZnRlciBpbml0KCkKICAgICBwcml2YXRlIGZpbmFsIEJvbmRTdGF0ZSBtQm9uZFN0YXRlID0gbmV3IEJvbmRTdGF0ZSgpOyAgLy8gbG9jYWwgY2FjaGUgb2YgYm9uZGluZ3MKQEAgLTEwNCw2ICsxMTIsMTAgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9VVUlEX0lOVEVOVCA9IDM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfRElTQ09WRVJBQkxFX1RJTUVPVVQgPSA0OwogCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtQmx1ZXRvb3RoSWZhY2VBZGRyZXNzZXM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJMVUVUT09USF9ORUFSX0lGQUNFX0FERFJfUFJFRklYPSAiMTkyLjE2OC40NC4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCTFVFVE9PVEhfTkVUTUFTSyAgICAgICAgPSAiMjU1LjI1NS4yNTUuMCI7CisKICAgICAvLyBUaGUgdGltZW91dCB1c2VkIHRvIHNlbnQgdGhlIFVVSURzIEludGVudAogICAgIC8vIFRoaXMgdGltZW91dCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIHRoZSBwYWdlIHRpbWVvdXQKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVVJRF9JTlRFTlRfREVMQVkgPSA2MDAwOwpAQCAtMTI3LDggKzEzOSwxMiBAQAogICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZT4gbURldmljZVByb2ZpbGVTdGF0ZTsKICAgICBwcml2YXRlIGZpbmFsIEJsdWV0b290aFByb2ZpbGVTdGF0ZSBtQTJkcFByb2ZpbGVTdGF0ZTsKICAgICBwcml2YXRlIGZpbmFsIEJsdWV0b290aFByb2ZpbGVTdGF0ZSBtSGZwUHJvZmlsZVN0YXRlOworICAgIHByaXZhdGUgZmluYWwgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlIG1IaWRQcm9maWxlU3RhdGU7CiAKICAgICBwcml2YXRlIEJsdWV0b290aEEyZHBTZXJ2aWNlIG1BMmRwU2VydmljZTsKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8Qmx1ZXRvb3RoRGV2aWNlLCBJbnRlZ2VyPiBtSW5wdXREZXZpY2VzOworICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxCbHVldG9vdGhEZXZpY2UsIEludGVnZXI+IG1QYW5EZXZpY2VzOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1Eb2NrQWRkcmVzczsKICAgICBwcml2YXRlIFN0cmluZyBtRG9ja1BpbjsKIApAQCAtMTc5LDYgKzE5NSw3IEBACiAKICAgICAgICAgbUJsdWV0b290aFN0YXRlID0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PRkY7CiAgICAgICAgIG1Jc0Rpc2NvdmVyaW5nID0gZmFsc2U7CisgICAgICAgIG1UZXRoZXJpbmdPbiA9IGZhbHNlOwogICAgICAgICBtQWRhcHRlclByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKICAgICAgICAgbURldmljZVByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsU3RyaW5nPj4oKTsKIApAQCAtMTg5LDE1ICsyMDYsMjUgQEAKICAgICAgICAgbURldmljZVByb2ZpbGVTdGF0ZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlPigpOwogICAgICAgICBtQTJkcFByb2ZpbGVTdGF0ZSA9IG5ldyBCbHVldG9vdGhQcm9maWxlU3RhdGUobUNvbnRleHQsIEJsdWV0b290aFByb2ZpbGVTdGF0ZS5BMkRQKTsKICAgICAgICAgbUhmcFByb2ZpbGVTdGF0ZSA9IG5ldyBCbHVldG9vdGhQcm9maWxlU3RhdGUobUNvbnRleHQsIEJsdWV0b290aFByb2ZpbGVTdGF0ZS5IRlApOworICAgICAgICBtSGlkUHJvZmlsZVN0YXRlID0gbmV3IEJsdWV0b290aFByb2ZpbGVTdGF0ZShtQ29udGV4dCwgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLkhJRCk7CisKKyAgICAgICAgLy8gQ2FuIHRldGhlciB0byB1cCB0byA3IGRldmljZXMKKyAgICAgICAgbUJsdWV0b290aElmYWNlQWRkcmVzc2VzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEJsdWV0b290aFBhbi5NQVhfQ09OTkVDVElPTlMpOworICAgICAgICBmb3IgKGludCBpPTE7IGkgPD0gQmx1ZXRvb3RoUGFuLk1BWF9DT05ORUNUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBtQmx1ZXRvb3RoSWZhY2VBZGRyZXNzZXMuYWRkKEJMVUVUT09USF9ORUFSX0lGQUNFX0FERFJfUFJFRklYICsgaSk7CisgICAgICAgIH0KIAogICAgICAgICBtSGZwUHJvZmlsZVN0YXRlLnN0YXJ0KCk7CiAgICAgICAgIG1BMmRwUHJvZmlsZVN0YXRlLnN0YXJ0KCk7CisgICAgICAgIG1IaWRQcm9maWxlU3RhdGUuc3RhcnQoKTsKIAogICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwogICAgICAgICByZWdpc3RlckZvckFpcnBsYW5lTW9kZShmaWx0ZXIpOwogCiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9ET0NLX0VWRU5UKTsKICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGZpbHRlcik7CisgICAgICAgIG1JbnB1dERldmljZXMgPSBuZXcgSGFzaE1hcDxCbHVldG9vdGhEZXZpY2UsIEludGVnZXI+KCk7CisgICAgICAgIG1QYW5EZXZpY2VzID0gbmV3IEhhc2hNYXA8Qmx1ZXRvb3RoRGV2aWNlLCBJbnRlZ2VyPigpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFN0cmluZyByZWFkRG9ja0JsdWV0b290aEFkZHJlc3MoKSB7CkBAIC0zMjUsNiArMzUyLDcgQEAKICAgICAgICAgfQogICAgICAgICBzZXRCbHVldG9vdGhTdGF0ZShCbHVldG9vdGhBZGFwdGVyLlNUQVRFX1RVUk5JTkdfT0ZGKTsKICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTUVTU0FHRV9SRUdJU1RFUl9TRFBfUkVDT1JEUyk7CisgICAgICAgIHNldEJsdWV0b290aFRldGhlcmluZyhmYWxzZSwgQmx1ZXRvb3RoUGFuLk5BUF9ST0xFLCBCbHVldG9vdGhQYW4uTkFQX0JSSURHRSk7CiAKICAgICAgICAgLy8gQWxsb3cgMyBzZWNvbmRzIGZvciBwcm9maWxlcyB0byBncmFjZWZ1bGx5IGRpc2Nvbm5lY3QKICAgICAgICAgLy8gVE9ETzogSW50cm9kdWNlIGEgY2FsbGJhY2sgbWVjaGFuaXNtIHNvIHRoYXQgZWFjaCBwcm9maWxlIGNhbiBub3RpZnkKQEAgLTY2OCw2ICs2OTYsMTAgQEAKICAgICAgICAgICAgICAgICByZW1vdmVQcm9maWxlU3RhdGUoYWRkcmVzcyk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIC8vIEhJRCBpcyBoYW5kbGVkIGJ5IEJsdWV0b290aFNlcnZpY2UsIG90aGVyIHByb2ZpbGVzCisgICAgICAgICAgICAvLyB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlaXIgcmVzcGVjdGl2ZSBzZXJ2aWNlcy4KKyAgICAgICAgICAgIHNldEluaXRpYWxJbnB1dERldmljZVByaW9yaXR5KG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKSwgc3RhdGUpOworCiAgICAgICAgICAgICBpZiAoREJHKSBsb2coYWRkcmVzcyArICIgYm9uZCBzdGF0ZSAiICsgb2xkU3RhdGUgKyAiIC0+ICIgKyBzdGF0ZSArICIgKCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbiArICIpIik7CiAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0JPTkRfU1RBVEVfQ0hBTkdFRCk7CkBAIC0xMjIwLDYgKzEyNTIsMzc1IEBACiAgICAgICAgIHJldHVybiBzcC5jb250YWlucyhTSEFSRURfUFJFRkVSRU5DRV9ET0NLX0FERFJFU1MgKyBhZGRyZXNzKTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNUZXRoZXJpbmdPbigpIHsKKyAgICAgICAgcmV0dXJuIG1UZXRoZXJpbmdPbjsKKyAgICB9CisKKyAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1UZXRoZXJpbmdSZWNlaXZlciA9IG51bGw7CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Qmx1ZXRvb3RoVGV0aGVyaW5nKGJvb2xlYW4gdmFsdWUsIAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHV1aWQsIGZpbmFsIFN0cmluZyBicmlkZ2UpIHsKKyAgICAgICAgbVRldGhlcmluZ09uID0gdmFsdWU7CisgICAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgICAgIGRpc2Nvbm5lY3RQYW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRCbHVldG9vdGhTdGF0ZSgpICE9IEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT04gJiYgbVRldGhlcmluZ09uKSB7CisgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhBZGFwdGVyLkFDVElPTl9TVEFURV9DSEFOR0VEKTsKKyAgICAgICAgICAgIG1UZXRoZXJpbmdSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aEFkYXB0ZXIuRVhUUkFfU1RBVEUsIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT0ZGKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEJsdWV0b290aFRldGhlcmluZyh0cnVlLCB1dWlkLCBicmlkZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1UZXRoZXJpbmdSZWNlaXZlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtVGV0aGVyaW5nUmVjZWl2ZXIsIGZpbHRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmUodmFsdWUsIHV1aWQsIGJyaWRnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRQYW5EZXZpY2VTdGF0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfUEVSTSwgIk5lZWQgQkxVRVRPT1RIIHBlcm1pc3Npb24iKTsKKworICAgICAgICBpZiAobVBhbkRldmljZXMuZ2V0KGRldmljZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1QYW5EZXZpY2VzLmdldChkZXZpY2UpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb25uZWN0UGFuRGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKKworICAgICAgICBTdHJpbmcgb2JqZWN0UGF0aCA9IGdldE9iamVjdFBhdGhGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0IFBBTigiICsgb2JqZWN0UGF0aCArICIpIik7CisgICAgICAgIGlmIChnZXRQYW5EZXZpY2VTdGF0ZShkZXZpY2UpICE9IEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgIGxvZyAoZGV2aWNlICsgIiBhbHJlYWR5IGNvbm5lY3RlZCB0byBQQU4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjb25uZWN0ZWRDb3VudCA9IDA7CisgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIEJUZGV2aWNlOiBtUGFuRGV2aWNlcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGdldFBhbkRldmljZVN0YXRlKEJUZGV2aWNlKSA9PSBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkQ291bnQgKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbm5lY3RlZENvdW50ID4gOCkgeworICAgICAgICAgICAgbG9nIChkZXZpY2UgKyAiIGNvdWxkIG5vdCBjb25uZWN0IHRvIFBBTiBiZWNhdXNlIDggb3RoZXIgZGV2aWNlcyBhcmUgYWxyZWFkeSBjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGhhbmRsZVBhbkRldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RJTkcpOworICAgICAgICBpZiAoY29ubmVjdFBhbkRldmljZU5hdGl2ZShvYmplY3RQYXRoLCAibmFwIiwgInBhbnUiKSkgeworICAgICAgICAgICAgbG9nICgiY29ubmVjdGluZyB0byBQQU4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGFuZGxlUGFuRGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhQYW4uU1RBVEVfRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIGxvZyAoImNvdWxkIG5vdCBjb25uZWN0IHRvIFBBTiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkaXNjb25uZWN0UGFuKCkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX1BFUk0sICJOZWVkIEJMVUVUT09USCBwZXJtaXNzaW9uIik7CisgICAgICAgIGlmIChEQkcpIGxvZygiZGlzY29ubmVjdCBhbGwgUEFOIGRldmljZXMiKTsKKworICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2U6IG1QYW5EZXZpY2VzLmtleVNldCgpKSB7CisgICAgICAgICAgICBpZiAoZ2V0UGFuRGV2aWNlU3RhdGUoZGV2aWNlKSA9PSBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgaWYgKCFkaXNjb25uZWN0UGFuRGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nICgiY291bGQgbm90IGRpc2Nvbm5lY3QgUGFuIERldmljZSAiK2RldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQmx1ZXRvb3RoRGV2aWNlW10gZ2V0Q29ubmVjdGVkUGFuRGV2aWNlcygpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworCisgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMgPSBuZXcgSGFzaFNldDxCbHVldG9vdGhEZXZpY2U+KCk7CisgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZTogbVBhbkRldmljZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChnZXRQYW5EZXZpY2VTdGF0ZShkZXZpY2UpID09IEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBkZXZpY2VzLnRvQXJyYXkobmV3IEJsdWV0b290aERldmljZVtkZXZpY2VzLnNpemUoKV0pOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkaXNjb25uZWN0UGFuRGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKKyAgICAgICAgU3RyaW5nIG9iamVjdFBhdGggPSBnZXRPYmplY3RQYXRoRnJvbUFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgIGlmIChEQkcpIGxvZygiZGlzY29ubmVjdCBQQU4oIiArIG9iamVjdFBhdGggKyAiKSIpOworICAgICAgICBpZiAoZ2V0UGFuRGV2aWNlU3RhdGUoZGV2aWNlKSAhPSBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICBsb2cgKGRldmljZSArICIgYWxyZWFkeSBkaXNjb25uZWN0ZWQgZnJvbSBQQU4iKTsKKyAgICAgICAgfQorICAgICAgICBoYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNUSU5HKTsKKyAgICAgICAgcmV0dXJuIGRpc2Nvbm5lY3RQYW5EZXZpY2VOYXRpdmUob2JqZWN0UGF0aCk7CisgICAgfQorCisgICAgLypwYWNrYWdlKi8gdm9pZCBoYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgc3RhdGUpIHsKKyAgICAgICAgaW50IHByZXZTdGF0ZTsKKyAgICAgICAgaWYgKG1QYW5EZXZpY2VzLmdldChkZXZpY2UpID09IG51bGwpIHsKKyAgICAgICAgICAgIHByZXZTdGF0ZSA9IEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmV2U3RhdGUgPSBtUGFuRGV2aWNlcy5nZXQoZGV2aWNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJldlN0YXRlID09IHN0YXRlKSByZXR1cm47CisKKyAgICAgICAgbVBhbkRldmljZXMucHV0KGRldmljZSwgc3RhdGUpOworCisgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICB1cGRhdGVUZXRoZXJTdGF0ZSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aFBhbi5BQ1RJT05fUEFOX1NUQVRFX0NIQU5HRUQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0RFVklDRSwgZGV2aWNlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aFBhbi5FWFRSQV9QUkVWSU9VU19QQU5fU1RBVEUsIHByZXZTdGF0ZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhQYW4uRVhUUkFfUEFOX1NUQVRFLCBzdGF0ZSk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfUEVSTSk7CisKKyAgICAgICAgaWYgKERCRykgbG9nKCJQYW4gRGV2aWNlIHN0YXRlIDogZGV2aWNlOiAiICsgZGV2aWNlICsgIiBTdGF0ZToiICsgcHJldlN0YXRlICsgIi0+IiArIHN0YXRlKTsKKworICAgIH0KKworICAgIC8vIGNvbmZpZ3VyZWQgd2hlbiB3ZSBzdGFydCB0ZXRoZXJpbmcgYW5kIHVuY29uZmlnJ2Qgb24gZXJyb3Igb3IgY29uY2x1c2lvbgorICAgIHByaXZhdGUgYm9vbGVhbiB1cGRhdGVUZXRoZXJTdGF0ZShib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiY29uZmlndXJlQmx1ZXRvb3RoSWZhY2UoIiArIGVuYWJsZWQgKyAiKSIpOworCisgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKKyAgICAgICAgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBzZXJ2aWNlID0gSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGIpOworICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyIGNtID0KKyAgICAgICAgICAgIChDb25uZWN0aXZpdHlNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgIFN0cmluZ1tdIGJsdWV0b290aFJlZ2V4cyA9IGNtLmdldFRldGhlcmFibGVCbHVldG9vdGhSZWdleHMoKTsKKworICAgICAgICAvLyBicmluZyB0b2dnbGUgdGhlIGludGVyZmFjZXMKKyAgICAgICAgU3RyaW5nW10gaWZhY2VzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmYWNlcyA9IHNlcnZpY2UubGlzdEludGVyZmFjZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIGxpc3RpbmcgSW50ZXJmYWNlcyA6IiArIGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gaWZhY2VBZGRyZXNzZXMgPSAoQXJyYXlMaXN0PFN0cmluZz4pIG1CbHVldG9vdGhJZmFjZUFkZHJlc3Nlcy5jbG9uZSgpOworICAgICAgICBmb3IgKFN0cmluZyBpZmFjZSA6IGlmYWNlcykgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgcmVnZXggOiBibHVldG9vdGhSZWdleHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoaWZhY2UubWF0Y2hlcyhyZWdleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlQ29uZmlndXJhdGlvbiBpZmNnID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmY2cgPSBzZXJ2aWNlLmdldEludGVyZmFjZUNvbmZpZyhpZmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWZjZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gYWRkciA9IEJMVUVUT09USF9ORVRNQVNLLnNwbGl0KCJcXC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZjZy5uZXRtYXNrID0gKEludGVnZXIucGFyc2VJbnQoYWRkclswXSkgPDwgMjQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSW50ZWdlci5wYXJzZUludChhZGRyWzFdKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyLnBhcnNlSW50KGFkZHJbMl0pIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSW50ZWdlci5wYXJzZUludChhZGRyWzNdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZmNnLmlwQWRkciA9PSAwICYmICFpZmFjZUFkZHJlc3Nlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgPSBpZmFjZUFkZHJlc3Nlcy5yZW1vdmUoMCkuc3BsaXQoIlxcLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZjZy5pcEFkZHIgPSAoSW50ZWdlci5wYXJzZUludChhZGRyWzBdKSA8PCAyNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSW50ZWdlci5wYXJzZUludChhZGRyWzFdKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSW50ZWdlci5wYXJzZUludChhZGRyWzJdKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyLnBhcnNlSW50KGFkZHJbM10pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBJZmFjZUFkZHJlc3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihpZmNnLmlwQWRkciA+Pj4gMjQpICsgIi4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoKGlmY2cuaXBBZGRyICYgMHgwMEZGMDAwMCkgPj4+IDE2KSArICIuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKChpZmNnLmlwQWRkciAmIDB4MDAwMEZGMDApID4+PiA4KSArICIuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGlmY2cuaXBBZGRyICYgMHgwMDAwMDBGRik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmFjZUFkZHJlc3Nlcy5yZW1vdmUoSWZhY2VBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmNnLmludGVyZmFjZUZsYWdzID0gaWZjZy5pbnRlcmZhY2VGbGFncy5yZXBsYWNlKCJkb3duIiwgInVwIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZjZy5pbnRlcmZhY2VGbGFncyA9IGlmY2cuaW50ZXJmYWNlRmxhZ3MucmVwbGFjZSgidXAiLCAiZG93biIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmNnLmludGVyZmFjZUZsYWdzID0gaWZjZy5pbnRlcmZhY2VGbGFncy5yZXBsYWNlKCJydW5uaW5nIiwgIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmY2cuaW50ZXJmYWNlRmxhZ3MgPSBpZmNnLmludGVyZmFjZUZsYWdzLnJlcGxhY2UoIiAgIiwiICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uuc2V0SW50ZXJmYWNlQ29uZmlnKGlmYWNlLCBpZmNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY20udGV0aGVyKGlmYWNlKSAhPSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRFVEhFUl9FUlJPUl9OT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgdGV0aGVyaW5nICIraWZhY2VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIGNvbmZpZ3VyaW5nIGludGVyZmFjZSAiICsgaWZhY2UgKyAiLCA6IiArIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbm5lY3RJbnB1dERldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfQURNSU5fUEVSTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWVkIEJMVUVUT09USF9BRE1JTiBwZXJtaXNzaW9uIik7CisKKyAgICAgICAgU3RyaW5nIG9iamVjdFBhdGggPSBnZXRPYmplY3RQYXRoRnJvbUFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgIGlmIChvYmplY3RQYXRoID09IG51bGwgfHwKKyAgICAgICAgICAgIGdldElucHV0RGV2aWNlU3RhdGUoZGV2aWNlKSAhPSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQgfHwKKyAgICAgICAgICAgIGdldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlKSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9PRkYpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUgc3RhdGUgPSBtRGV2aWNlUHJvZmlsZVN0YXRlLmdldChkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIG1zZy5hcmcxID0gQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLkNPTk5FQ1RfSElEX09VVEdPSU5HOworICAgICAgICAgICAgbXNnLm9iaiA9IHN0YXRlOworICAgICAgICAgICAgbUhpZFByb2ZpbGVTdGF0ZS5zZW5kTWVzc2FnZShtc2cpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2VJbnRlcm5hbChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIFN0cmluZyBvYmplY3RQYXRoID0gZ2V0T2JqZWN0UGF0aEZyb21BZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICBoYW5kbGVJbnB1dERldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVElORyk7CisgICAgICAgIGlmICghY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKG9iamVjdFBhdGgpKSB7CisgICAgICAgICAgICBoYW5kbGVJbnB1dERldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKKworICAgICAgICBTdHJpbmcgb2JqZWN0UGF0aCA9IGdldE9iamVjdFBhdGhGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKG9iamVjdFBhdGggPT0gbnVsbCB8fCBnZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKS5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZSBzdGF0ZSA9IG1EZXZpY2VQcm9maWxlU3RhdGUuZ2V0KGRldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICAgICAgbXNnLmFyZzEgPSBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUuRElTQ09OTkVDVF9ISURfT1VUR09JTkc7CisgICAgICAgICAgICBtc2cub2JqID0gc3RhdGU7CisgICAgICAgICAgICBtSGlkUHJvZmlsZVN0YXRlLnNlbmRNZXNzYWdlKG1zZyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZUludGVybmFsKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgU3RyaW5nIG9iamVjdFBhdGggPSBnZXRPYmplY3RQYXRoRnJvbUFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNUSU5HKTsKKyAgICAgICAgaWYgKCFkaXNjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUob2JqZWN0UGF0aCkpIHsKKyAgICAgICAgICAgIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldElucHV0RGV2aWNlU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX1BFUk0sICJOZWVkIEJMVUVUT09USCBwZXJtaXNzaW9uIik7CisKKyAgICAgICAgaWYgKG1JbnB1dERldmljZXMuZ2V0KGRldmljZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUlucHV0RGV2aWNlcy5nZXQoZGV2aWNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEJsdWV0b290aERldmljZVtdIGdldENvbm5lY3RlZElucHV0RGV2aWNlcygpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzID0gbG9va3VwSW5wdXREZXZpY2VzTWF0Y2hpbmdTdGF0ZXMoCisgICAgICAgICAgICBuZXcgaW50W10ge0JsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RFRH0pOworICAgICAgICByZXR1cm4gZGV2aWNlcy50b0FycmF5KG5ldyBCbHVldG9vdGhEZXZpY2VbZGV2aWNlcy5zaXplKCldKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0Qmx1ZXRvb3RoSW5wdXREZXZpY2VQcmlvcml0eUtleShkZXZpY2UuZ2V0QWRkcmVzcygpKSwKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9VTkRFRklORUQpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOworICAgICAgICBpZiAoIUJsdWV0b290aEFkYXB0ZXIuY2hlY2tCbHVldG9vdGhBZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5wdXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEJsdWV0b290aElucHV0RGV2aWNlUHJpb3JpdHlLZXkoZGV2aWNlLmdldEFkZHJlc3MoKSksCisgICAgICAgICAgICAgICAgcHJpb3JpdHkpOworICAgIH0KKworICAgIC8qcGFja2FnZSovc3luY2hyb25pemVkIFNldDxCbHVldG9vdGhEZXZpY2U+IGxvb2t1cElucHV0RGV2aWNlc01hdGNoaW5nU3RhdGVzKGludFtdIHN0YXRlcykgeworICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBpbnB1dERldmljZXMgPSBuZXcgSGFzaFNldDxCbHVldG9vdGhEZXZpY2U+KCk7CisgICAgICAgIGlmIChtSW5wdXREZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0RGV2aWNlczsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2U6IG1JbnB1dERldmljZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGludCBpbnB1dERldmljZVN0YXRlID0gZ2V0SW5wdXREZXZpY2VTdGF0ZShkZXZpY2UpOworICAgICAgICAgICAgZm9yIChpbnQgc3RhdGUgOiBzdGF0ZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gaW5wdXREZXZpY2VTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dERldmljZXMuYWRkKGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5wdXREZXZpY2VzOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaGFuZGxlSW5wdXREZXZpY2VTdGF0ZUNoYW5nZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgc3RhdGUpIHsKKyAgICAgICAgaW50IHByZXZTdGF0ZTsKKyAgICAgICAgaWYgKG1JbnB1dERldmljZXMuZ2V0KGRldmljZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgcHJldlN0YXRlID0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJldlN0YXRlID0gbUlucHV0RGV2aWNlcy5nZXQoZGV2aWNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJldlN0YXRlID09IHN0YXRlKSByZXR1cm47CisKKyAgICAgICAgbUlucHV0RGV2aWNlcy5wdXQoZGV2aWNlLCBzdGF0ZSk7CisKKyAgICAgICAgaWYgKGdldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlKSA+CisgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX09GRiAmJgorICAgICAgICAgICAgc3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVElORyB8fAorICAgICAgICAgICAgc3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIGNvbm5lY3RlZCBvciBhdHRlbXB0aW5nIHRvIGNvbm5lY3QuCisgICAgICAgICAgICAvLyBCdW1wIHByaW9yaXR5CisgICAgICAgICAgICBzZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfQVVUT19DT05ORUNUKTsKKyAgICAgICAgfQorCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBkZXZpY2UpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfUFJFVklPVVNfSU5QVVRfREVWSUNFX1NUQVRFLCBwcmV2U3RhdGUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfSU5QVVRfREVWSUNFX1NUQVRFLCBzdGF0ZSk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfUEVSTSk7CisKKyAgICAgICAgaWYgKERCRykgbG9nKCJJbnB1dERldmljZSBzdGF0ZSA6IGRldmljZTogIiArIGRldmljZSArICIgU3RhdGU6IiArIHByZXZTdGF0ZSArICItPiIgKyBzdGF0ZSk7CisKKyAgICB9CisKKyAgICAvKnBhY2thZ2UqLyB2b2lkIGhhbmRsZUlucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2UoU3RyaW5nIGFkZHJlc3MsIGJvb2xlYW4gY29ubmVjdGVkKSB7CisgICAgICAgIGludCBzdGF0ZSA9IGNvbm5lY3RlZCA/IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RFRCA6CisgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CisgICAgICAgIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBzdGF0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEluaXRpYWxJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBzdGF0ZSkgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRDoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UpID09IEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX1VOREVGSU5FRCkgeworICAgICAgICAgICAgICAgICAgICBzZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfT04pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORToKKyAgICAgICAgICAgICAgICBzZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfVU5ERUZJTkVEKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qcGFja2FnZSovIGJvb2xlYW4gaXNSZW1vdGVEZXZpY2VJbkNhY2hlKFN0cmluZyBhZGRyZXNzKSB7CiAgICAgICAgIHJldHVybiAobURldmljZVByb3BlcnRpZXMuZ2V0KGFkZHJlc3MpICE9IG51bGwpOwogICAgIH0KQEAgLTEyNDIsNyArMTY0Myw3IEBACiAgICAgICAgICAgICBpZiAodXBkYXRlUmVtb3RlRGV2aWNlUHJvcGVydGllc0NhY2hlKGFkZHJlc3MpKQogICAgICAgICAgICAgICAgIHJldHVybiBnZXRSZW1vdGVEZXZpY2VQcm9wZXJ0eShhZGRyZXNzLCBwcm9wZXJ0eSk7CiAgICAgICAgIH0KLSAgICAgICAgTG9nLmUoVEFHLCAiZ2V0UmVtb3RlRGV2aWNlUHJvcGVydHk6ICIgKyBwcm9wZXJ0eSArICJub3QgcHJlc2VudDoiICsgYWRkcmVzcyk7CisgICAgICAgIExvZy5lKFRBRywgImdldFJlbW90ZURldmljZVByb3BlcnR5OiAiICsgcHJvcGVydHkgKyAiIG5vdCBwcmVzZW50OiAiICsgYWRkcmVzcyk7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIApAQCAtMjEwMyw0ICsyNTA0LDEwIEBACiAgICAgICAgICAgICBzaG9ydCBjaGFubmVsKTsKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHJlbW92ZVNlcnZpY2VSZWNvcmROYXRpdmUoaW50IGhhbmRsZSk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBzZXRMaW5rVGltZW91dE5hdGl2ZShTdHJpbmcgcGF0aCwgaW50IG51bV9zbG90cyk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUoU3RyaW5nIHBhdGgpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKFN0cmluZyBwYXRoKTsKKworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gc2V0Qmx1ZXRvb3RoVGV0aGVyaW5nTmF0aXZlKGJvb2xlYW4gdmFsdWUsIFN0cmluZyBuYXAsIFN0cmluZyBicmlkZ2UpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gY29ubmVjdFBhbkRldmljZU5hdGl2ZShTdHJpbmcgcGF0aCwgU3RyaW5nIHNyY1JvbGUsIFN0cmluZyBkc3RSb2xlKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGRpc2Nvbm5lY3RQYW5EZXZpY2VOYXRpdmUoU3RyaW5nIHBhdGgpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL1NwZWVjaFJlY29nbml6ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC9TcGVlY2hSZWNvZ25pemVyLmphdmEKaW5kZXggOGZhMGQ1OS4uY2Q3M2JhOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL1NwZWVjaFJlY29nbml6ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvU3BlZWNoUmVjb2duaXplci5qYXZhCkBAIC01MCw3ICs1MCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTcGVlY2hSZWNvZ25pemVyIjsKIAogICAgIC8qKgotICAgICAqIFVzZWQgdG8gcmV0cmlldmUgYW4ge0Bjb2RlIEFycmF5TGlzdCZsdDtTdHJpbmcmZ3Q7fSBmcm9tIHRoZSB7QGxpbmsgQnVuZGxlfSBwYXNzZWQgdG8gdGhlCisgICAgICogVXNlZCB0byByZXRyaWV2ZSBhbiB7QGNvZGUgQXJyYXlMaXN0PFN0cmluZz59IGZyb20gdGhlIHtAbGluayBCdW5kbGV9IHBhc3NlZCB0byB0aGUKICAgICAgKiB7QGxpbmsgUmVjb2duaXRpb25MaXN0ZW5lciNvblJlc3VsdHMoQnVuZGxlKX0gYW5kCiAgICAgICoge0BsaW5rIFJlY29nbml0aW9uTGlzdGVuZXIjb25QYXJ0aWFsUmVzdWx0cyhCdW5kbGUpfSBtZXRob2RzLiBUaGVzZSBzdHJpbmdzIGFyZSB0aGUgcG9zc2libGUKICAgICAgKiByZWNvZ25pdGlvbiByZXN1bHRzLCB3aGVyZSB0aGUgZmlyc3QgZWxlbWVudCBpcyB0aGUgbW9zdCBsaWtlbHkgY2FuZGlkYXRlLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9BbmRyb2lkQmlkaS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9BbmRyb2lkQmlkaS5qYXZhCmluZGV4IGU0ZjkzNGUuLmVhY2Q0MGQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQW5kcm9pZEJpZGkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0FuZHJvaWRCaWRpLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLnRleHQ7CiAKK2ltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0LkRpcmVjdGlvbnM7CisKIC8qKgogICogQWNjZXNzIHRoZSBJQ1UgYmlkaSBpbXBsZW1lbnRhdGlvbi4KICAqIEBoaWRlCkBAIC00NCw1ICs0NiwxMzIgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHJ1biBkaXJlY3Rpb24gaW5mb3JtYXRpb24gZm9yIGEgbGluZSB3aXRoaW4gYSBwYXJhZ3JhcGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyIGJhc2UgbGluZSBkaXJlY3Rpb24sIGVpdGhlciBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQgb3IKKyAgICAgKiAgICAgTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUCisgICAgICogQHBhcmFtIGxldmVscyBsZXZlbHMgYXMgcmV0dXJuZWQgZnJvbSB7QGxpbmsgI2JpZGl9CisgICAgICogQHBhcmFtIGxzdGFydCBzdGFydCBvZiB0aGUgbGluZSBpbiB0aGUgbGV2ZWxzIGFycmF5CisgICAgICogQHBhcmFtIGNoYXJzIHRoZSBjaGFyYWN0ZXIgYXJyYXkgKHVzZWQgdG8gZGV0ZXJtaW5lIHdoaXRlc3BhY2UpCisgICAgICogQHBhcmFtIGNzdGFydCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgaW4gdGhlIGNoYXJzIGFycmF5CisgICAgICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBsaW5lCisgICAgICogQHJldHVybiB0aGUgZGlyZWN0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRGlyZWN0aW9ucyBkaXJlY3Rpb25zKGludCBkaXIsIGJ5dGVbXSBsZXZlbHMsIGludCBsc3RhcnQsCisgICAgICAgICAgICBjaGFyW10gY2hhcnMsIGludCBjc3RhcnQsIGludCBsZW4pIHsKKworICAgICAgICBpbnQgYmFzZUxldmVsID0gZGlyID09IExheW91dC5ESVJfTEVGVF9UT19SSUdIVCA/IDAgOiAxOworICAgICAgICBpbnQgY3VyTGV2ZWwgPSBsZXZlbHNbbHN0YXJ0XTsKKyAgICAgICAgaW50IG1pbkxldmVsID0gY3VyTGV2ZWw7CisgICAgICAgIGludCBydW5Db3VudCA9IDE7CisgICAgICAgIGZvciAoaW50IGkgPSBsc3RhcnQgKyAxLCBlID0gbHN0YXJ0ICsgbGVuOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICBpbnQgbGV2ZWwgPSBsZXZlbHNbaV07CisgICAgICAgICAgICBpZiAobGV2ZWwgIT0gY3VyTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBjdXJMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgICsrcnVuQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgZmluYWwgcnVuIGZvciB0cmFpbGluZyBjb3VudGVyLWRpcmVjdGlvbmFsIHdoaXRlc3BhY2UKKyAgICAgICAgaW50IHZpc0xlbiA9IGxlbjsKKyAgICAgICAgaWYgKChjdXJMZXZlbCAmIDEpICE9IChiYXNlTGV2ZWwgJiAxKSkgeworICAgICAgICAgICAgLy8gbG9vayBmb3IgdmlzaWJsZSBlbmQKKyAgICAgICAgICAgIHdoaWxlICgtLXZpc0xlbiA+PSAwKSB7CisgICAgICAgICAgICAgICAgY2hhciBjaCA9IGNoYXJzW2NzdGFydCArIHZpc0xlbl07CisKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgICAgICAgICAtLXZpc0xlbjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGNoICE9ICcgJyAmJiBjaCAhPSAnXHQnKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrdmlzTGVuOworICAgICAgICAgICAgaWYgKHZpc0xlbiAhPSBsZW4pIHsKKyAgICAgICAgICAgICAgICArK3J1bkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJ1bkNvdW50ID09IDEgJiYgbWluTGV2ZWwgPT0gYmFzZUxldmVsKSB7CisgICAgICAgICAgICAvLyB3ZSdyZSBkb25lLCBvbmx5IG9uZSBydW4gb24gdGhpcyBsaW5lCisgICAgICAgICAgICBpZiAoKG1pbkxldmVsICYgMSkgIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBMYXlvdXQuRElSU19BTExfUklHSFRfVE9fTEVGVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBMYXlvdXQuRElSU19BTExfTEVGVF9UT19SSUdIVDsKKyAgICAgICAgfQorCisgICAgICAgIGludFtdIGxkID0gbmV3IGludFtydW5Db3VudCAqIDJdOworICAgICAgICBpbnQgbWF4TGV2ZWwgPSBtaW5MZXZlbDsKKyAgICAgICAgaW50IGxldmVsQml0cyA9IG1pbkxldmVsIDw8IExheW91dC5SVU5fTEVWRUxfU0hJRlQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFN0YXJ0IG9mIGZpcnN0IHBhaXIgaXMgYWx3YXlzIDAsIHdlIHdyaXRlCisgICAgICAgICAgICAvLyBsZW5ndGggdGhlbiBzdGFydCBhdCBlYWNoIG5ldyBydW4sIGFuZCB0aGUKKyAgICAgICAgICAgIC8vIGxhc3QgcnVuIGxlbmd0aCBhZnRlciB3ZSdyZSBkb25lLgorICAgICAgICAgICAgaW50IG4gPSAxOworICAgICAgICAgICAgaW50IHByZXYgPSBsc3RhcnQ7CisgICAgICAgICAgICBjdXJMZXZlbCA9IG1pbkxldmVsOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGxzdGFydCwgZSA9IGxzdGFydCArIHZpc0xlbjsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgICAgIGludCBsZXZlbCA9IGxldmVsc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWwgIT0gY3VyTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heExldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPCBtaW5MZXZlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBYWFggaWdub3JlIHJ1biBsZW5ndGggbGltaXQgb2YgMl5SVU5fTEVWRUxfU0hJRlQKKyAgICAgICAgICAgICAgICAgICAgbGRbbisrXSA9IChpIC0gcHJldikgfCBsZXZlbEJpdHM7CisgICAgICAgICAgICAgICAgICAgIGxkW24rK10gPSBpIC0gbHN0YXJ0OworICAgICAgICAgICAgICAgICAgICBsZXZlbEJpdHMgPSBjdXJMZXZlbCA8PCBMYXlvdXQuUlVOX0xFVkVMX1NISUZUOworICAgICAgICAgICAgICAgICAgICBwcmV2ID0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZFtuXSA9IChsc3RhcnQgKyB2aXNMZW4gLSBwcmV2KSB8IGxldmVsQml0czsKKyAgICAgICAgICAgIGlmICh2aXNMZW4gPCBsZW4pIHsKKyAgICAgICAgICAgICAgICBsZFsrK25dID0gdmlzTGVuOworICAgICAgICAgICAgICAgIGxkWysrbl0gPSAobGVuIC0gdmlzTGVuKSB8IChiYXNlTGV2ZWwgPDwgTGF5b3V0LlJVTl9MRVZFTF9TSElGVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTZWUgaWYgd2UgbmVlZCB0byBzd2FwIGFueSBydW5zLgorICAgICAgICAvLyBJZiB0aGUgbWluIGxldmVsIHJ1biBkaXJlY3Rpb24gZG9lc24ndCBtYXRjaCB0aGUgYmFzZQorICAgICAgICAvLyBkaXJlY3Rpb24sIHdlIGFsd2F5cyBuZWVkIHRvIHN3YXAgKGF0IHRoaXMgcG9pbnQKKyAgICAgICAgLy8gd2UgaGF2ZSBtb3JlIHRoYW4gb25lIHJ1bikuCisgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgZG9uJ3QgbmVlZCB0byBzd2FwIHRoZSBsb3dlc3QgbGV2ZWwuCisgICAgICAgIC8vIFNpbmNlIHRoZXJlIGFyZSBubyBsb2dpY2FsbHkgYWRqYWNlbnQgcnVucyBhdCB0aGUgc2FtZQorICAgICAgICAvLyBsZXZlbCwgaWYgdGhlIG1heCBsZXZlbCBpcyB0aGUgc2FtZSBhcyB0aGUgKG5ldykgbWluCisgICAgICAgIC8vIGxldmVsLCB3ZSBoYXZlIGEgc2VyaWVzIG9mIGFsdGVybmF0aW5nIGxldmVscyB0aGF0CisgICAgICAgIC8vIGlzIGFscmVhZHkgaW4gb3JkZXIsIHNvIHRoZXJlJ3Mgbm8gbW9yZSB0byBkby4KKyAgICAgICAgLy8KKyAgICAgICAgYm9vbGVhbiBzd2FwOworICAgICAgICBpZiAoKG1pbkxldmVsICYgMSkgPT0gYmFzZUxldmVsKSB7CisgICAgICAgICAgICBtaW5MZXZlbCArPSAxOworICAgICAgICAgICAgc3dhcCA9IG1heExldmVsID4gbWluTGV2ZWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2FwID0gcnVuQ291bnQgPiAxOworICAgICAgICB9CisgICAgICAgIGlmIChzd2FwKSB7CisgICAgICAgICAgICBmb3IgKGludCBsZXZlbCA9IG1heExldmVsIC0gMTsgbGV2ZWwgPj0gbWluTGV2ZWw7IC0tbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxkLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbHNbbGRbaV1dID49IGxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZSA9IGkgKyAyOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGUgPCBsZC5sZW5ndGggJiYgbGV2ZWxzW2xkW2VdXSA+PSBsZXZlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGxvdyA9IGksIGhpID0gZSAtIDI7IGxvdyA8IGhpOyBsb3cgKz0gMiwgaGkgLT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4ID0gbGRbbG93XTsgbGRbbG93XSA9IGxkW2hpXTsgbGRbaGldID0geDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gbGRbbG93KzFdOyBsZFtsb3crMV0gPSBsZFtoaSsxXTsgbGRbaGkrMV0gPSB4OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGUgKyAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgRGlyZWN0aW9ucyhsZCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBuYXRpdmUgc3RhdGljIGludCBydW5CaWRpKGludCBkaXIsIGNoYXJbXSBjaHMsIGJ5dGVbXSBjaEluZm8sIGludCBuLCBib29sZWFuIGhhdmVJbmZvKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0JvcmluZ0xheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9Cb3JpbmdMYXlvdXQuamF2YQppbmRleCA5NDRmNzM1Li45MzA5YjA1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0JvcmluZ0xheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQm9yaW5nTGF5b3V0LmphdmEKQEAgLTIwOCwxMSArMjA4LDExIEBACiAgICAgICAgICAgICAgKiB3aWR0aCBiZWNhdXNlIHRoZSB3aWR0aCB0aGF0IHdhcyBwYXNzZWQgaW4gd2FzIGZvciB0aGUKICAgICAgICAgICAgICAqIGZ1bGwgdGV4dCwgbm90IHRoZSBlbGxpcHNpemVkIGZvcm0uCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc1RlbXApIHsKLSAgICAgICAgICAgICAgICBtTWF4ID0gKGludCkgKEZsb2F0TWF0aC5jZWlsKFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgc1RlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsIDAsIHNvdXJjZS5sZW5ndGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBUZXh0TGluZSBsaW5lID0gVGV4dExpbmUub2J0YWluKCk7CisgICAgICAgICAgICBsaW5lLnNldChwYWludCwgc291cmNlLCAwLCBzb3VyY2UubGVuZ3RoKCksIExheW91dC5ESVJfTEVGVF9UT19SSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQsIGZhbHNlLCBudWxsKTsKKyAgICAgICAgICAgIG1NYXggPSAoaW50KSBGbG9hdE1hdGguY2VpbChsaW5lLm1ldHJpY3MobnVsbCkpOworICAgICAgICAgICAgVGV4dExpbmUucmVjeWNsZShsaW5lKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpbmNsdWRlcGFkKSB7CkBAIC0yNzYsMTQgKzI3NiwxMyBAQAogICAgICAgICAgICAgaWYgKGZtID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBmbSA9IG5ldyBNZXRyaWNzKCk7CiAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBpbnQgd2lkOwogCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNUZW1wKSB7Ci0gICAgICAgICAgICAgICAgd2lkID0gKGludCkgKEZsb2F0TWF0aC5jZWlsKFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgc1RlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpLCBmbSkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZtLndpZHRoID0gd2lkOworICAgICAgICAgICAgVGV4dExpbmUgbGluZSA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICAgICAgbGluZS5zZXQocGFpbnQsIHRleHQsIDAsIHRleHQubGVuZ3RoKCksIExheW91dC5ESVJfTEVGVF9UT19SSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQsIGZhbHNlLCBudWxsKTsKKyAgICAgICAgICAgIGZtLndpZHRoID0gKGludCkgRmxvYXRNYXRoLmNlaWwobGluZS5tZXRyaWNzKGZtKSk7CisgICAgICAgICAgICBUZXh0TGluZS5yZWN5Y2xlKGxpbmUpOworCiAgICAgICAgICAgICByZXR1cm4gZm07CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTM4OSw3ICszODgsNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZXRyaWNzIGV4dGVuZHMgUGFpbnQuRm9udE1ldHJpY3NJbnQgewogICAgICAgICBwdWJsaWMgaW50IHdpZHRoOwotICAgICAgICAKKwogICAgICAgICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIiB3aWR0aD0iICsgd2lkdGg7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9DbGlwYm9hcmRNYW5hZ2VyLmphdmEKaW5kZXggNTIwMzlhZi4uMGIyMzljZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9DbGlwYm9hcmRNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9DbGlwYm9hcmRNYW5hZ2VyLmphdmEKQEAgLTE2LDczICsxNiwyNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGV4dDsKIAotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCiAvKioKLSAqIEludGVyZmFjZSB0byB0aGUgY2xpcGJvYXJkIHNlcnZpY2UsIGZvciBwbGFjaW5nIGFuZCByZXRyaWV2aW5nIHRleHQgaW4KLSAqIHRoZSBnbG9iYWwgY2xpcGJvYXJkLgotICoKLSAqIDxwPgotICogWW91IGRvIG5vdCBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIGRpcmVjdGx5OyBpbnN0ZWFkLCByZXRyaWV2ZSBpdCB0aHJvdWdoCi0gKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjZ2V0U3lzdGVtU2VydmljZX0uCi0gKgotICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNnZXRTeXN0ZW1TZXJ2aWNlCisgKiBAZGVwcmVjYXRlZCBPbGQgdGV4dC1vbmx5IGludGVyYWNlIHRvIHRoZSBjbGlwYm9hcmQuICBTZWUKKyAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ2xpcGJvYXJkTWFuYWdlcn0gZm9yIHRoZSBtb2Rlcm4gQVBJLgogICovCi1wdWJsaWMgY2xhc3MgQ2xpcGJvYXJkTWFuYWdlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSUNsaXBib2FyZCBzU2VydmljZTsKLQotICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLQotICAgIHN0YXRpYyBwcml2YXRlIElDbGlwYm9hcmQgZ2V0U2VydmljZSgpIHsKLSAgICAgICAgaWYgKHNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBzU2VydmljZTsKLSAgICAgICAgfQotICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKCJjbGlwYm9hcmQiKTsKLSAgICAgICAgc1NlcnZpY2UgPSBJQ2xpcGJvYXJkLlN0dWIuYXNJbnRlcmZhY2UoYik7Ci0gICAgICAgIHJldHVybiBzU2VydmljZTsKLSAgICB9Ci0KLSAgICAvKioge0BoaWRlfSAqLwotICAgIHB1YmxpYyBDbGlwYm9hcmRNYW5hZ2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0KK0BEZXByZWNhdGVkCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xpcGJvYXJkTWFuYWdlciB7CiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdGV4dCBvbiB0aGUgY2xpcGJvYXJkLiAgSXQgd2lsbCBldmVudHVhbGx5IGJlIHBvc3NpYmxlCiAgICAgICogdG8gc3RvcmUgdHlwZXMgb3RoZXIgdGhhbiB0ZXh0IHRvbywgaW4gd2hpY2ggY2FzZSB0aGlzIHdpbGwgcmV0dXJuCiAgICAgICogbnVsbCBpZiB0aGUgdHlwZSBjYW5ub3QgYmUgY29lcmNlZCB0byB0ZXh0LgogICAgICAqLwotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGV4dCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuZ2V0Q2xpcGJvYXJkVGV4dCgpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9CisgICAgcHVibGljIGFic3RyYWN0IENoYXJTZXF1ZW5jZSBnZXRUZXh0KCk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBjb250ZW50cyBvZiB0aGUgY2xpcGJvYXJkIHRvIHRoZSBzcGVjaWZpZWQgdGV4dC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRTZXJ2aWNlKCkuc2V0Q2xpcGJvYXJkVGV4dCh0ZXh0KTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgIH0KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2xpcGJvYXJkIGNvbnRhaW5zIHRleHQ7IGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNUZXh0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFNlcnZpY2UoKS5oYXNDbGlwYm9hcmRUZXh0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9CisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzVGV4dCgpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9EeW5hbWljTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0R5bmFtaWNMYXlvdXQuamF2YQppbmRleCAxNGU1NjU1Li5iNmFhMDNhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0R5bmFtaWNMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0R5bmFtaWNMYXlvdXQuamF2YQpAQCAtMzEwLDcgKzMxMCw2IEBACiAKICAgICAgICAgRGlyZWN0aW9uc1tdIG9iamVjdHMgPSBuZXcgRGlyZWN0aW9uc1sxXTsKIAotCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgICBpbnRzW1NUQVJUXSA9IHJlZmxvd2VkLmdldExpbmVTdGFydChpKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWZsb3dlZC5nZXRQYXJhZ3JhcGhEaXJlY3Rpb24oaSkgPDwgRElSX1NISUZUKSB8CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0dyYXBoaWNzT3BlcmF0aW9ucy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9HcmFwaGljc09wZXJhdGlvbnMuamF2YQppbmRleCBjM2JkMGFlLi5kNDI2ZDEyNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9HcmFwaGljc09wZXJhdGlvbnMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0dyYXBoaWNzT3BlcmF0aW9ucy5qYXZhCkBAIC0zNCwxMyArMzQsMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwKTsKIAogICAgIC8qKgorICAgICAqIEp1c3QgbGlrZSB7QGxpbmsgQ2FudmFzI2RyYXdUZXh0UnVufS4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgdm9pZCBkcmF3VGV4dFJ1bihDYW52YXMgYywgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgUGFpbnQgcCk7CisKKyAgIC8qKgogICAgICAqIEp1c3QgbGlrZSB7QGxpbmsgUGFpbnQjbWVhc3VyZVRleHR9LgogICAgICAqLwogICAgIGZsb2F0IG1lYXN1cmVUZXh0KGludCBzdGFydCwgaW50IGVuZCwgUGFpbnQgcCk7CiAKLQogICAgIC8qKgogICAgICAqIEp1c3QgbGlrZSB7QGxpbmsgUGFpbnQjZ2V0VGV4dFdpZHRoc30uCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRUZXh0V2lkdGhzKGludCBzdGFydCwgaW50IGVuZCwgZmxvYXRbXSB3aWR0aHMsIFBhaW50IHApOworCisgICAgLyoqCisgICAgICogSnVzdCBsaWtlIHtAbGluayBQYWludCNnZXRUZXh0UnVuQWR2YW5jZXN9LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzKGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsIGludCBhZHZhbmNlc0luZGV4LCBQYWludCBwYWludCk7CisKKyAgICAvKioKKyAgICAgKiBKdXN0IGxpa2Uge0BsaW5rIFBhaW50I2dldFRleHRSdW5DdXJzb3J9LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgaW50IGdldFRleHRSdW5DdXJzb3IoaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgaW50IG9mZnNldCwKKyAgICAgICAgICAgIGludCBjdXJzb3JPcHQsIFBhaW50IHApOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9JQ2xpcGJvYXJkLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0lDbGlwYm9hcmQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRlYjVjOC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0lDbGlwYm9hcmQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnRleHQ7Ci0KLS8qKgotICogUHJvZ3JhbW1pbmcgaW50ZXJmYWNlIHRvIHRoZSBjbGlwYm9hcmQsIHdoaWNoIGFsbG93cyBjb3B5aW5nIGFuZCBwYXN0aW5nCi0gKiBiZXR3ZWVuIGFwcGxpY2F0aW9ucy4KLSAqIHtAaGlkZX0KLSAqLwotaW50ZXJmYWNlIElDbGlwYm9hcmQgewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRleHQgb24gdGhlIGNsaXBib2FyZC4gIEl0IHdpbGwgZXZlbnR1YWxseSBiZSBwb3NzaWJsZQotICAgICAqIHRvIHN0b3JlIHR5cGVzIG90aGVyIHRoYW4gdGV4dCB0b28sIGluIHdoaWNoIGNhc2UgdGhpcyB3aWxsIHJldHVybgotICAgICAqIG51bGwgaWYgdGhlIHR5cGUgY2Fubm90IGJlIGNvZXJjZWQgdG8gdGV4dC4KLSAgICAgKi8KLSAgICBDaGFyU2VxdWVuY2UgZ2V0Q2xpcGJvYXJkVGV4dCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29udGVudHMgb2YgdGhlIGNsaXBib2FyZCB0byB0aGUgc3BlY2lmaWVkIHRleHQuCi0gICAgICovCi0gICAgdm9pZCBzZXRDbGlwYm9hcmRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2xpcGJvYXJkIGNvbnRhaW5zIHRleHQ7IGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGhhc0NsaXBib2FyZFRleHQoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9MYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTGF5b3V0LmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA0ZTE5N2NkLi41NGFjOTA2Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9MYXlvdXQuamF2YQpAQCAtMTYsMjkgKzE2LDMzIEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCi1pbXBvcnQgYW5kcm9pZC5lbW9qaS5FbW9qaUZhY3Rvcnk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGg7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuKjsKK2ltcG9ydCBhbmRyb2lkLmVtb2ppLkVtb2ppRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkFsaWdubWVudFNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkxlYWRpbmdNYXJnaW5TcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MaW5lQmFja2dyb3VuZFNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlBhcmFncmFwaFN0eWxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5SZXBsYWNlbWVudFNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlRhYlN0b3BTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKwogLyoqCi0gKiBBIGJhc2UgY2xhc3MgdGhhdCBtYW5hZ2VzIHRleHQgbGF5b3V0IGluIHZpc3VhbCBlbGVtZW50cyBvbiAKLSAqIHRoZSBzY3JlZW4uIAotICogPHA+Rm9yIHRleHQgdGhhdCB3aWxsIGJlIGVkaXRlZCwgdXNlIGEge0BsaW5rIER5bmFtaWNMYXlvdXR9LCAKLSAqIHdoaWNoIHdpbGwgYmUgdXBkYXRlZCBhcyB0aGUgdGV4dCBjaGFuZ2VzLiAgCisgKiBBIGJhc2UgY2xhc3MgdGhhdCBtYW5hZ2VzIHRleHQgbGF5b3V0IGluIHZpc3VhbCBlbGVtZW50cyBvbgorICogdGhlIHNjcmVlbi4KKyAqIDxwPkZvciB0ZXh0IHRoYXQgd2lsbCBiZSBlZGl0ZWQsIHVzZSBhIHtAbGluayBEeW5hbWljTGF5b3V0fSwKKyAqIHdoaWNoIHdpbGwgYmUgdXBkYXRlZCBhcyB0aGUgdGV4dCBjaGFuZ2VzLgogICogRm9yIHRleHQgdGhhdCB3aWxsIG5vdCBjaGFuZ2UsIHVzZSBhIHtAbGluayBTdGF0aWNMYXlvdXR9LgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGF5b3V0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGFyYWdyYXBoU3R5bGVbXSBOT19QQVJBX1NQQU5TID0KICAgICAgICAgQXJyYXlVdGlscy5lbXB0eUFycmF5KFBhcmFncmFwaFN0eWxlLmNsYXNzKTsKIApAQCAtNTQsOSArNTgsNyBAQAogICAgICAgICAgICAgTUlOX0VNT0pJID0gLTE7CiAgICAgICAgICAgICBNQVhfRU1PSkkgPSAtMTsKICAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIFJlY3RGIG1FbW9qaVJlY3Q7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIGhvdyB3aWRlIGEgbGF5b3V0IG11c3QgYmUgaW4gb3JkZXIgdG8gZGlzcGxheSB0aGUKQEAgLTY2LDcgKzY4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQpIHsKICAgICAgICAgcmV0dXJuIGdldERlc2lyZWRXaWR0aChzb3VyY2UsIDAsIHNvdXJjZS5sZW5ndGgoKSwgcGFpbnQpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiBob3cgd2lkZSBhIGxheW91dCBtdXN0IGJlIGluIG9yZGVyIHRvIGRpc3BsYXkgdGhlCiAgICAgICogc3BlY2lmaWVkIHRleHQgc2xpY2Ugd2l0aCBvbmUgbGluZSBwZXIgcGFyYWdyYXBoLgpAQCAtODUsOCArODcsNyBAQAogICAgICAgICAgICAgICAgIG5leHQgPSBlbmQ7CiAKICAgICAgICAgICAgIC8vIG5vdGUsIG9taXRzIHRyYWlsaW5nIHBhcmFncmFwaCBjaGFyCi0gICAgICAgICAgICBmbG9hdCB3ID0gbWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsIGksIG5leHQsIG51bGwsIHRydWUsIG51bGwpOworICAgICAgICAgICAgZmxvYXQgdyA9IG1lYXN1cmVQYXJhKHBhaW50LCB3b3JrUGFpbnQsIHNvdXJjZSwgaSwgbmV4dCk7CiAKICAgICAgICAgICAgIGlmICh3ID4gbmVlZCkKICAgICAgICAgICAgICAgICBuZWVkID0gdzsKQEAgLTExNiw2ICsxMTcsMTUgQEAKICAgICAgICAgaWYgKHdpZHRoIDwgMCkKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxheW91dDogIiArIHdpZHRoICsgIiA8IDAiKTsKIAorICAgICAgICAvLyBFbnN1cmUgcGFpbnQgZG9lc24ndCBoYXZlIGJhc2VsaW5lU2hpZnQgc2V0LgorICAgICAgICAvLyBXaGlsZSBub3JtYWxseSB3ZSBkb24ndCBtb2RpZnkgdGhlIHBhaW50IHRoZSB1c2VyIHBhc3NlZCBpbiwKKyAgICAgICAgLy8gd2Ugd2VyZSBhbHJlYWR5IGRvaW5nIHRoaXMgaW4gU3R5bGVkLmRyYXdVbmlmb3JtUnVuIHdpdGggYm90aAorICAgICAgICAvLyBiYXNlbGluZVNoaWZ0IGFuZCBiZ0NvbG9yLiAgV2UgcHJvYmFibHkgc2hvdWxkIHJlZXZhbHVhdGUgYmdDb2xvci4KKyAgICAgICAgaWYgKHBhaW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhaW50LmJnQ29sb3IgPSAwOworICAgICAgICAgICAgcGFpbnQuYmFzZWxpbmVTaGlmdCA9IDA7CisgICAgICAgIH0KKwogICAgICAgICBtVGV4dCA9IHRleHQ7CiAgICAgICAgIG1QYWludCA9IHBhaW50OwogICAgICAgICBtV29ya1BhaW50ID0gbmV3IFRleHRQYWludCgpOwpAQCAtMTc1LDcgKzE4NSw2IEBACiAgICAgICAgICAgICBkYm90dG9tID0gc1RlbXBSZWN0LmJvdHRvbTsKICAgICAgICAgfQogCi0KICAgICAgICAgaW50IHRvcCA9IDA7CiAgICAgICAgIGludCBib3R0b20gPSBnZXRMaW5lVG9wKGdldExpbmVDb3VudCgpKTsKIApAQCAtMTg1LDI2ICsxOTQsMjggQEAKICAgICAgICAgaWYgKGRib3R0b20gPCBib3R0b20pIHsKICAgICAgICAgICAgIGJvdHRvbSA9IGRib3R0b207CiAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGludCBmaXJzdCA9IGdldExpbmVGb3JWZXJ0aWNhbCh0b3ApOyAKKworICAgICAgICBpbnQgZmlyc3QgPSBnZXRMaW5lRm9yVmVydGljYWwodG9wKTsKICAgICAgICAgaW50IGxhc3QgPSBnZXRMaW5lRm9yVmVydGljYWwoYm90dG9tKTsKLSAgICAgICAgCisKICAgICAgICAgaW50IHByZXZpb3VzTGluZUJvdHRvbSA9IGdldExpbmVUb3AoZmlyc3QpOwogICAgICAgICBpbnQgcHJldmlvdXNMaW5lRW5kID0gZ2V0TGluZVN0YXJ0KGZpcnN0KTsKLSAgICAgICAgCisKICAgICAgICAgVGV4dFBhaW50IHBhaW50ID0gbVBhaW50OwogICAgICAgICBDaGFyU2VxdWVuY2UgYnVmID0gbVRleHQ7CiAgICAgICAgIGludCB3aWR0aCA9IG1XaWR0aDsKICAgICAgICAgYm9vbGVhbiBzcGFubmVkVGV4dCA9IG1TcGFubmVkVGV4dDsKIAogICAgICAgICBQYXJhZ3JhcGhTdHlsZVtdIHNwYW5zID0gTk9fUEFSQV9TUEFOUzsKLSAgICAgICAgaW50IHNwYW5lbmQgPSAwOworICAgICAgICBpbnQgc3BhbkVuZCA9IDA7CiAgICAgICAgIGludCB0ZXh0TGVuZ3RoID0gMDsKIAogICAgICAgICAvLyBGaXJzdCwgZHJhdyBMaW5lQmFja2dyb3VuZFNwYW5zLgotICAgICAgICAvLyBMaW5lQmFja2dyb3VuZFNwYW5zIGtub3cgbm90aGluZyBhYm91dCB0aGUgYWxpZ25tZW50IG9yIGRpcmVjdGlvbiBvZgotICAgICAgICAvLyB0aGUgbGF5b3V0IG9yIGxpbmUuICBYWFg6IFNob3VsZCB0aGV5PworICAgICAgICAvLyBMaW5lQmFja2dyb3VuZFNwYW5zIGtub3cgbm90aGluZyBhYm91dCB0aGUgYWxpZ25tZW50LCBtYXJnaW5zLCBvcgorICAgICAgICAvLyBkaXJlY3Rpb24gb2YgdGhlIGxheW91dCBvciBsaW5lLiAgWFhYOiBTaG91bGQgdGhleT8KKyAgICAgICAgLy8gVGhleSBhcmUgZXZhbHVhdGVkIGF0IGVhY2ggbGluZS4KICAgICAgICAgaWYgKHNwYW5uZWRUZXh0KSB7CisgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIGJ1ZjsKICAgICAgICAgICAgIHRleHRMZW5ndGggPSBidWYubGVuZ3RoKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gZmlyc3Q7IGkgPD0gbGFzdDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gcHJldmlvdXNMaW5lRW5kOwpAQCAtMjE2LDEyICsyMjcsMTQgQEAKICAgICAgICAgICAgICAgICBwcmV2aW91c0xpbmVCb3R0b20gPSBsYm90dG9tOwogICAgICAgICAgICAgICAgIGludCBsYmFzZWxpbmUgPSBsYm90dG9tIC0gZ2V0TGluZURlc2NlbnQoaSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gc3BhbmVuZCkgewotICAgICAgICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgYnVmOwotICAgICAgICAgICAgICAgICAgIHNwYW5lbmQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIHRleHRMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lQmFja2dyb3VuZFNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgICAgIHNwYW5zID0gc3AuZ2V0U3BhbnMoc3RhcnQsIHNwYW5lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lQmFja2dyb3VuZFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIGlmIChzdGFydCA+PSBzcGFuRW5kKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHNob3VsZCBiZSBpbmZyZXF1ZW50LCBzbyB3ZSdsbCB1c2UgdGhpcyBzbyB0aGF0CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgdG8gY2hlY2sgYXMgb2Z0ZW4uCisgICAgICAgICAgICAgICAgICAgIHNwYW5FbmQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIHRleHRMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZUJhY2tncm91bmRTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWxsIExpbmVCYWNrZ3JvdW5kU3BhbnMgb24gYSBsaW5lIGNvbnRyaWJ1dGUgdG8gaXRzCisgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQuCisgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcCwgc3RhcnQsIGVuZCwgTGluZUJhY2tncm91bmRTcGFuLmNsYXNzKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IHNwYW5zLmxlbmd0aDsgbisrKSB7CkBAIC0yMzQsMTEgKzI0NywxMSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIHJlc2V0IHRvIHRoZWlyIG9yaWdpbmFsIHZhbHVlcwotICAgICAgICAgICAgc3BhbmVuZCA9IDA7CisgICAgICAgICAgICBzcGFuRW5kID0gMDsKICAgICAgICAgICAgIHByZXZpb3VzTGluZUJvdHRvbSA9IGdldExpbmVUb3AoZmlyc3QpOwogICAgICAgICAgICAgcHJldmlvdXNMaW5lRW5kID0gZ2V0TGluZVN0YXJ0KGZpcnN0KTsKICAgICAgICAgICAgIHNwYW5zID0gTk9fUEFSQV9TUEFOUzsKLSAgICAgICAgfSAKKyAgICAgICAgfQogCiAgICAgICAgIC8vIFRoZXJlIGNhbiBiZSBhIGhpZ2hsaWdodCBldmVuIHdpdGhvdXQgc3BhbnMgaWYgd2UgYXJlIGRyYXdpbmcKICAgICAgICAgLy8gYSBub24tc3Bhbm5lZCB0cmFuc2Zvcm1hdGlvbiBvZiBhIHNwYW5uZWQgZWRpdGluZyBidWZmZXIuCkBAIC0yNTUsNyArMjY4LDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBBbGlnbm1lbnQgYWxpZ24gPSBtQWxpZ25tZW50OwotICAgICAgICAKKyAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOworICAgICAgICBib29sZWFuIHRhYlN0b3BzSXNJbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgICAgIFRleHRMaW5lIHRsID0gVGV4dExpbmUub2J0YWluKCk7CisKICAgICAgICAgLy8gTmV4dCBkcmF3IHRoZSBsaW5lcywgb25lIGF0IGEgdGltZS4KICAgICAgICAgLy8gdGhlIGJhc2VsaW5lIGlzIHRoZSB0b3Agb2YgdGhlIGZvbGxvd2luZyBsaW5lIG1pbnVzIHRoZSBjdXJyZW50CiAgICAgICAgIC8vIGxpbmUncyBkZXNjZW50LgpAQCAtMjcwLDE5ICsyODcsMzAgQEAKICAgICAgICAgICAgIHByZXZpb3VzTGluZUJvdHRvbSA9IGxib3R0b207CiAgICAgICAgICAgICBpbnQgbGJhc2VsaW5lID0gbGJvdHRvbSAtIGdldExpbmVEZXNjZW50KGkpOwogCi0gICAgICAgICAgICBib29sZWFuIGlzRmlyc3RQYXJhTGluZSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKHNwYW5uZWRUZXh0KSB7IAotICAgICAgICAgICAgICAgIGlmIChzdGFydCA9PSAwIHx8IGJ1Zi5jaGFyQXQoc3RhcnQgLSAxKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzRmlyc3RQYXJhTGluZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIE5ldyBiYXRjaCBvZiBwYXJhZ3JhcGggc3R5bGVzLCBjb21wdXRlIHRoZSBhbGlnbm1lbnQuCi0gICAgICAgICAgICAgICAgLy8gTGFzdCBhbGlnbm1lbnQgc3R5bGUgd2lucy4KLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gc3BhbmVuZCkgewotICAgICAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIGJ1ZjsKLSAgICAgICAgICAgICAgICAgICAgc3BhbmVuZCA9IHNwLm5leHRTcGFuVHJhbnNpdGlvbihzdGFydCwgdGV4dExlbmd0aCwKKyAgICAgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24oaSk7CisgICAgICAgICAgICBpbnQgbGVmdCA9IDA7CisgICAgICAgICAgICBpbnQgcmlnaHQgPSBtV2lkdGg7CisKKyAgICAgICAgICAgIGlmIChzcGFubmVkVGV4dCkgeworICAgICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgYnVmOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNGaXJzdFBhcmFMaW5lID0gKHN0YXJ0ID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5jaGFyQXQoc3RhcnQgLSAxKSA9PSAnXG4nKTsKKworICAgICAgICAgICAgICAgIC8vIE5ldyBiYXRjaCBvZiBwYXJhZ3JhcGggc3R5bGVzLCBjb2xsZWN0IGludG8gc3BhbnMgYXJyYXkuCisgICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgYWxpZ25tZW50LCBsYXN0IGFsaWdubWVudCBzdHlsZSB3aW5zLgorICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRhYlN0b3BzLCB3ZSdsbCByZWJ1aWxkIGlmIHdlIGVuY291bnRlciBhIGxpbmUgd2l0aAorICAgICAgICAgICAgICAgIC8vIHRhYnMuCisgICAgICAgICAgICAgICAgLy8gV2UgZXhwZWN0IHBhcmFncmFwaCBzcGFucyB0byBiZSByZWxhdGl2ZWx5IGluZnJlcXVlbnQsIHVzZQorICAgICAgICAgICAgICAgIC8vIHNwYW5FbmQgc28gdGhhdCB3ZSBjYW4gY2hlY2sgbGVzcyBmcmVxdWVudGx5LiAgU2luY2UKKyAgICAgICAgICAgICAgICAvLyBwYXJhZ3JhcGggc3R5bGVzIG91Z2h0IHRvIGFwcGx5IHRvIGVudGlyZSBwYXJhZ3JhcGhzLCB3ZSBjYW4KKyAgICAgICAgICAgICAgICAvLyBqdXN0IGNvbGxlY3QgdGhlIG9uZXMgcHJlc2VudCBhdCB0aGUgc3RhcnQgb2YgdGhlIHBhcmFncmFwaC4KKyAgICAgICAgICAgICAgICAvLyBJZiBzcGFuRW5kIGlzIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBwYXJhZ3JhcGgsIHRoYXQncyBub3QKKyAgICAgICAgICAgICAgICAvLyBvdXIgcHJvYmxlbS4KKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gc3BhbkVuZCAmJiAoaSA9PSBmaXJzdCB8fCBpc0ZpcnN0UGFyYUxpbmUpKSB7CisgICAgICAgICAgICAgICAgICAgIHNwYW5FbmQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIHRleHRMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYWdyYXBoU3R5bGUuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBzcGFucyA9IHNwLmdldFNwYW5zKHN0YXJ0LCBzcGFuZW5kLCBQYXJhZ3JhcGhTdHlsZS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBzcGFucyA9IGdldFBhcmFncmFwaFNwYW5zKHNwLCBzdGFydCwgc3BhbkVuZCwgUGFyYWdyYXBoU3R5bGUuY2xhc3MpOworCiAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gbUFsaWdubWVudDsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IHNwYW5zLmxlbmd0aC0xOyBuID49IDA7IG4tLSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5zW25dIGluc3RhbmNlb2YgQWxpZ25tZW50U3BhbikgewpAQCAtMjkwLDQ1ICszMTgsNDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihpKTsKLSAgICAgICAgICAgIGludCBsZWZ0ID0gMDsKLSAgICAgICAgICAgIGludCByaWdodCA9IG1XaWR0aDsKIAotICAgICAgICAgICAgLy8gRHJhdyBhbGwgbGVhZGluZyBtYXJnaW4gc3BhbnMuICBBZGp1c3QgbGVmdCBvciByaWdodCBhY2NvcmRpbmcKLSAgICAgICAgICAgIC8vIHRvIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uIG9mIHRoZSBsaW5lLgotICAgICAgICAgICAgaWYgKHNwYW5uZWRUZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzSXNJbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIERyYXcgYWxsIGxlYWRpbmcgbWFyZ2luIHNwYW5zLiAgQWRqdXN0IGxlZnQgb3IgcmlnaHQgYWNjb3JkaW5nCisgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHBhcmFncmFwaCBkaXJlY3Rpb24gb2YgdGhlIGxpbmUuCiAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHNwYW5zLmxlbmd0aDsKICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IGxlbmd0aDsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuc1tuXSBpbnN0YW5jZW9mIExlYWRpbmdNYXJnaW5TcGFuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbiBtYXJnaW4gPSAoTGVhZGluZ01hcmdpblNwYW4pIHNwYW5zW25dOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VGaXJzdExpbmVNYXJnaW4gPSBpc0ZpcnN0UGFyYUxpbmU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFyZ2luIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gKChMZWFkaW5nTWFyZ2luU3BhbjIpIG1hcmdpbikuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydExpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KHNwLmdldFNwYW5TdGFydChtYXJnaW4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VGaXJzdExpbmVNYXJnaW4gPSBpIDwgc3RhcnRMaW5lICsgY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4uZHJhd0xlYWRpbmdNYXJnaW4oYywgcGFpbnQsIHJpZ2h0LCBkaXIsIGx0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxiYXNlbGluZSwgbGJvdHRvbSwgYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCBpc0ZpcnN0UGFyYUxpbmUsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAtPSBtYXJnaW4uZ2V0TGVhZGluZ01hcmdpbihpc0ZpcnN0UGFyYUxpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IC09IG1hcmdpbi5nZXRMZWFkaW5nTWFyZ2luKHVzZUZpcnN0TGluZU1hcmdpbik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbi5kcmF3TGVhZGluZ01hcmdpbihjLCBwYWludCwgbGVmdCwgZGlyLCBsdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYmFzZWxpbmUsIGxib3R0b20sIGJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgaXNGaXJzdFBhcmFMaW5lLCB0aGlzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlTWFyZ2luID0gaXNGaXJzdFBhcmFMaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXJnaW4gaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gKChMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpbWFyZ2luKS5nZXRMZWFkaW5nTWFyZ2luTGluZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZU1hcmdpbiA9IGNvdW50ID4gaTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCArPSBtYXJnaW4uZ2V0TGVhZGluZ01hcmdpbih1c2VNYXJnaW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKz0gbWFyZ2luLmdldExlYWRpbmdNYXJnaW4odXNlRmlyc3RMaW5lTWFyZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSBwb2ludCBhdCB3aGljaCB0byBzdGFydCByZW5kZXJpbmcgZGVwZW5kaW5nIG9uIHRoZQotICAgICAgICAgICAgLy8gYWxpZ25tZW50IG9mIHRoZSBwYXJhZ3JhcGguCisgICAgICAgICAgICBib29sZWFuIGhhc1RhYk9yRW1vamkgPSBnZXRMaW5lQ29udGFpbnNUYWIoaSk7CisgICAgICAgICAgICAvLyBDYW4ndCB0ZWxsIGlmIHdlIGhhdmUgdGFicyBmb3Igc3VyZSwgY3VycmVudGx5CisgICAgICAgICAgICBpZiAoaGFzVGFiT3JFbW9qaSAmJiAhdGFiU3RvcHNJc0luaXRpYWxpemVkKSB7CisgICAgICAgICAgICAgICAgaWYgKHRhYlN0b3BzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgc3BhbnMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzLnJlc2V0KFRBQl9JTkNSRU1FTlQsIHNwYW5zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGFiU3RvcHNJc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICBpZiAoYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX05PUk1BTCkgewogICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpIHsKQEAgLTMzNyw0MSArMzY5LDgwIEBACiAgICAgICAgICAgICAgICAgICAgIHggPSByaWdodDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBtYXggPSAoaW50KWdldExpbmVNYXgoaSwgc3BhbnMsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpbnQgbWF4ID0gKGludClnZXRMaW5lRXh0ZW50KGksIHRhYlN0b3BzLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9PUFBPU0lURSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4ID0gbGVmdCArIG1heDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHJpZ2h0IC0gbWF4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQWxpZ25tZW50LkFMSUdOX0NFTlRFUgotICAgICAgICAgICAgICAgICAgICBtYXggPSBtYXggJiB+MTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGhhbGYgPSAocmlnaHQgLSBsZWZ0IC0gbWF4KSA+PiAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4ID0gcmlnaHQgLSBoYWxmOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGxlZnQgKyBoYWxmOworICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGxlZnQgLSBtYXg7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBBbGlnbm1lbnQuQUxJR05fQ0VOVEVSCisgICAgICAgICAgICAgICAgICAgIG1heCA9IG1heCAmIH4xOworICAgICAgICAgICAgICAgICAgICB4ID0gKHJpZ2h0ICsgbGVmdCAtIG1heCkgPj4gMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucyA9IGdldExpbmVEaXJlY3Rpb25zKGkpOwotICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWIgPSBnZXRMaW5lQ29udGFpbnNUYWIoaSk7CiAgICAgICAgICAgICBpZiAoZGlyZWN0aW9ucyA9PSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUICYmCi0gICAgICAgICAgICAgICAgICAgICFzcGFubmVkVGV4dCAmJiAhaGFzVGFiKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCk7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGMpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIXNwYW5uZWRUZXh0ICYmICFoYXNUYWJPckVtb2ppKSB7CiAgICAgICAgICAgICAgICAgLy8gWFhYOiBhc3N1bWVzIHRoZXJlJ3Mgbm90aGluZyBhZGRpdGlvbmFsIHRvIGJlIGRvbmUKICAgICAgICAgICAgICAgICBjLmRyYXdUZXh0KGJ1Ziwgc3RhcnQsIGVuZCwgeCwgbGJhc2VsaW5lLCBwYWludCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRyYXdUZXh0KGMsIGJ1Ziwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICB4LCBsdG9wLCBsYmFzZWxpbmUsIGxib3R0b20sIHBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICBoYXNUYWIsIHNwYW5zKTsKKyAgICAgICAgICAgICAgICB0bC5zZXQocGFpbnQsIGJ1Ziwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLCBoYXNUYWJPckVtb2ppLCB0YWJTdG9wcyk7CisgICAgICAgICAgICAgICAgdGwuZHJhdyhjLCB4LCBsdG9wLCBsYmFzZWxpbmUsIGxib3R0b20pOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgVGV4dExpbmUucmVjeWNsZSh0bCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgbGluZSwgZ2l2ZW4gdGhlIGxlZnQgYW5kIHJpZ2h0IGJvdW5kcworICAgICAqIG9mIHRoZSBtYXJnaW5zLgorICAgICAqCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgaW5kZXgKKyAgICAgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCBib3VuZHMgKDAsIG9yIGxlYWRpbmcgbWFyZ2luIGlmIGx0ciBwYXJhKQorICAgICAqIEBwYXJhbSByaWdodCB0aGUgcmlnaHQgYm91bmRzICh3aWR0aCwgbWludXMgbGVhZGluZyBtYXJnaW4gaWYgcnRsIHBhcmEpCisgICAgICogQHJldHVybiB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGxpbmUgKHRvIHJpZ2h0IG9mIGxpbmUgaWYgcnRsIHBhcmEpCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0TGluZVN0YXJ0UG9zKGludCBsaW5lLCBpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CisgICAgICAgIC8vIEFkanVzdCB0aGUgcG9pbnQgYXQgd2hpY2ggdG8gc3RhcnQgcmVuZGVyaW5nIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgICAgLy8gYWxpZ25tZW50IG9mIHRoZSBwYXJhZ3JhcGguCisgICAgICAgIEFsaWdubWVudCBhbGlnbiA9IGdldFBhcmFncmFwaEFsaWdubWVudChsaW5lKTsKKyAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKKworICAgICAgICBpbnQgeDsKKyAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9OT1JNQUwpIHsKKyAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpIHsKKyAgICAgICAgICAgICAgICB4ID0gbGVmdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgeCA9IHJpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOworICAgICAgICAgICAgaWYgKG1TcGFubmVkVGV4dCAmJiBnZXRMaW5lQ29udGFpbnNUYWIobGluZSkpIHsKKyAgICAgICAgICAgICAgICBTcGFubmVkIHNwYW5uZWQgPSAoU3Bhbm5lZCkgbVRleHQ7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICAgICAgICAgIGludCBzcGFuRW5kID0gc3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIHNwYW5uZWQubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgICBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgVGFiU3RvcFNwYW5bXSB0YWJTcGFucyA9IGdldFBhcmFncmFwaFNwYW5zKHNwYW5uZWQsIHN0YXJ0LCBzcGFuRW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKHRhYlNwYW5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgdGFiU3BhbnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBtYXggPSAoaW50KWdldExpbmVFeHRlbnQobGluZSwgdGFiU3RvcHMsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChhbGlnbiA9PSBBbGlnbm1lbnQuQUxJR05fT1BQT1NJVEUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSB7CisgICAgICAgICAgICAgICAgICAgIHggPSByaWdodCAtIG1heDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB4ID0gbGVmdCAtIG1heDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBBbGlnbm1lbnQuQUxJR05fQ0VOVEVSCisgICAgICAgICAgICAgICAgbWF4ID0gbWF4ICYgfjE7CisgICAgICAgICAgICAgICAgeCA9IChsZWZ0ICsgcmlnaHQgLSBtYXgpID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHg7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MTcsNyArNDg4LDcgQEAKIAogICAgICAgICBtV2lkdGggPSB3aWQ7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSB0b3RhbCBoZWlnaHQgb2YgdGhpcyBsYXlvdXQuCiAgICAgICovCkBAIC00NTAsNyArNTIxLDcgQEAKICAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBsaW5lcyBvZiB0ZXh0IGluIHRoaXMgbGF5b3V0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TGluZUNvdW50KCk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGJhc2VsaW5lIGZvciB0aGUgc3BlY2lmaWVkIGxpbmUgKDAmaGVsbGlwO2dldExpbmVDb3VudCgpIC0gMSkKICAgICAgKiBJZiBib3VuZHMgaXMgbm90IG51bGwsIHJldHVybiB0aGUgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tIGV4dGVudHMKQEAgLTUyNCwxMyArNTk1LDk1IEBACiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRCb3R0b21QYWRkaW5nKCk7CiAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIGF0IG9mZnNldCBhbmQgdGhlIHByZWNlZGluZyBjaGFyYWN0ZXIKKyAgICAgKiBhcmUgYXQgZGlmZmVyZW50IHJ1biBsZXZlbHMgKGFuZCB0aHVzIHRoZXJlJ3MgYSBzcGxpdCBjYXJldCkuCisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0CisgICAgICogQHJldHVybiB0cnVlIGlmIGF0IGEgbGV2ZWwgYm91bmRhcnkKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNMZXZlbEJvdW5kYXJ5KGludCBvZmZzZXQpIHsKKyAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7CisgICAgICAgIERpcmVjdGlvbnMgZGlycyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOworICAgICAgICBpZiAoZGlycyA9PSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUIHx8IGRpcnMgPT0gRElSU19BTExfUklHSFRfVE9fTEVGVCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaW50W10gcnVucyA9IGRpcnMubURpcmVjdGlvbnM7CisgICAgICAgIGludCBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBsaW5lRW5kID0gZ2V0TGluZUVuZChsaW5lKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSBsaW5lU3RhcnQgfHwgb2Zmc2V0ID09IGxpbmVFbmQpIHsKKyAgICAgICAgICAgIGludCBwYXJhTGV2ZWwgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSkgPT0gMSA/IDAgOiAxOworICAgICAgICAgICAgaW50IHJ1bkluZGV4ID0gb2Zmc2V0ID09IGxpbmVTdGFydCA/IDAgOiBydW5zLmxlbmd0aCAtIDI7CisgICAgICAgICAgICByZXR1cm4gKChydW5zW3J1bkluZGV4ICsgMV0gPj4+IFJVTl9MRVZFTF9TSElGVCkgJiBSVU5fTEVWRUxfTUFTSykgIT0gcGFyYUxldmVsOworICAgICAgICB9CisKKyAgICAgICAgb2Zmc2V0IC09IGxpbmVTdGFydDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpZiAob2Zmc2V0ID09IHJ1bnNbaV0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHByaW1hcnlJc1RyYWlsaW5nUHJldmlvdXMoaW50IG9mZnNldCkgeworICAgICAgICBpbnQgbGluZSA9IGdldExpbmVGb3JPZmZzZXQob2Zmc2V0KTsKKyAgICAgICAgaW50IGxpbmVTdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKKyAgICAgICAgaW50IGxpbmVFbmQgPSBnZXRMaW5lRW5kKGxpbmUpOworICAgICAgICBpbnRbXSBydW5zID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSkubURpcmVjdGlvbnM7CisKKyAgICAgICAgaW50IGxldmVsQXQgPSAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgc3RhcnQgPSBsaW5lU3RhcnQgKyBydW5zW2ldOworICAgICAgICAgICAgaW50IGxpbWl0ID0gc3RhcnQgKyAocnVuc1tpKzFdICYgUlVOX0xFTkdUSF9NQVNLKTsKKyAgICAgICAgICAgIGlmIChsaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICBsaW1pdCA9IGxpbmVFbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2Zmc2V0ID49IHN0YXJ0ICYmIG9mZnNldCA8IGxpbWl0KSB7CisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+IHN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFByZXZpb3VzIGNoYXJhY3RlciBpcyBhdCBzYW1lIGxldmVsLCBzbyBkb24ndCB1c2UgdHJhaWxpbmcuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGV2ZWxBdCA9IChydW5zW2krMV0gPj4+IFJVTl9MRVZFTF9TSElGVCkgJiBSVU5fTEVWRUxfTUFTSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobGV2ZWxBdCA9PSAtMSkgeworICAgICAgICAgICAgLy8gT2Zmc2V0IHdhcyBsaW1pdCBvZiBsaW5lLgorICAgICAgICAgICAgbGV2ZWxBdCA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKSA9PSAxID8gMCA6IDE7CisgICAgICAgIH0KKworICAgICAgICAvLyBBdCBsZXZlbCBib3VuZGFyeSwgY2hlY2sgcHJldmlvdXMgbGV2ZWwuCisgICAgICAgIGludCBsZXZlbEJlZm9yZSA9IC0xOworICAgICAgICBpZiAob2Zmc2V0ID09IGxpbmVTdGFydCkgeworICAgICAgICAgICAgbGV2ZWxCZWZvcmUgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSkgPT0gMSA/IDAgOiAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb2Zmc2V0IC09IDE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bnMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSBsaW5lU3RhcnQgKyBydW5zW2ldOworICAgICAgICAgICAgICAgIGludCBsaW1pdCA9IHN0YXJ0ICsgKHJ1bnNbaSsxXSAmIFJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICAgICAgaWYgKGxpbWl0ID4gbGluZUVuZCkgeworICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGxpbmVFbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gc3RhcnQgJiYgb2Zmc2V0IDwgbGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxCZWZvcmUgPSAocnVuc1tpKzFdID4+PiBSVU5fTEVWRUxfU0hJRlQpICYgUlVOX0xFVkVMX01BU0s7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsZXZlbEJlZm9yZSA8IGxldmVsQXQ7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBwcmltYXJ5IGhvcml6b250YWwgcG9zaXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgdGV4dCBvZmZzZXQuCiAgICAgICogVGhpcyBpcyB0aGUgbG9jYXRpb24gd2hlcmUgYSBuZXcgY2hhcmFjdGVyIHdvdWxkIGJlIGluc2VydGVkIGluCiAgICAgICogdGhlIHBhcmFncmFwaCdzIHByaW1hcnkgZGlyZWN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRQcmltYXJ5SG9yaXpvbnRhbChpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiBnZXRIb3Jpem9udGFsKG9mZnNldCwgZmFsc2UsIHRydWUpOworICAgICAgICBib29sZWFuIHRyYWlsaW5nID0gcHJpbWFyeUlzVHJhaWxpbmdQcmV2aW91cyhvZmZzZXQpOworICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsIHRyYWlsaW5nKTsKICAgICB9CiAKICAgICAvKioKQEAgLTUzOSw2NiArNjkyLDQyIEBACiAgICAgICogdGhlIGRpcmVjdGlvbiBvdGhlciB0aGFuIHRoZSBwYXJhZ3JhcGgncyBwcmltYXJ5IGRpcmVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0U2Vjb25kYXJ5SG9yaXpvbnRhbChpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiBnZXRIb3Jpem9udGFsKG9mZnNldCwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIGJvb2xlYW4gdHJhaWxpbmcgPSBwcmltYXJ5SXNUcmFpbGluZ1ByZXZpb3VzKG9mZnNldCk7CisgICAgICAgIHJldHVybiBnZXRIb3Jpem9udGFsKG9mZnNldCwgIXRyYWlsaW5nKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGZsb2F0IGdldEhvcml6b250YWwoaW50IG9mZnNldCwgYm9vbGVhbiB0cmFpbGluZywgYm9vbGVhbiBhbHQpIHsKKyAgICBwcml2YXRlIGZsb2F0IGdldEhvcml6b250YWwoaW50IG9mZnNldCwgYm9vbGVhbiB0cmFpbGluZykgewogICAgICAgICBpbnQgbGluZSA9IGdldExpbmVGb3JPZmZzZXQob2Zmc2V0KTsKIAotICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsIHRyYWlsaW5nLCBhbHQsIGxpbmUpOworICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsIHRyYWlsaW5nLCBsaW5lKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGZsb2F0IGdldEhvcml6b250YWwoaW50IG9mZnNldCwgYm9vbGVhbiB0cmFpbGluZywgYm9vbGVhbiBhbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKSB7CisgICAgcHJpdmF0ZSBmbG9hdCBnZXRIb3Jpem9udGFsKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcsIGludCBsaW5lKSB7CiAgICAgICAgIGludCBzdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKLSAgICAgICAgaW50IGVuZCA9IGdldExpbmVWaXNpYmxlRW5kKGxpbmUpOworICAgICAgICBpbnQgZW5kID0gZ2V0TGluZUVuZChsaW5lKTsKICAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKLSAgICAgICAgYm9vbGVhbiB0YWIgPSBnZXRMaW5lQ29udGFpbnNUYWIobGluZSk7CisgICAgICAgIGJvb2xlYW4gaGFzVGFiT3JFbW9qaSA9IGdldExpbmVDb250YWluc1RhYihsaW5lKTsKICAgICAgICAgRGlyZWN0aW9ucyBkaXJlY3Rpb25zID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7CiAKLSAgICAgICAgVGFiU3RvcFNwYW5bXSB0YWJzID0gbnVsbDsKLSAgICAgICAgaWYgKHRhYiAmJiBtVGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKLSAgICAgICAgICAgIHRhYnMgPSAoKFNwYW5uZWQpIG1UZXh0KS5nZXRTcGFucyhzdGFydCwgZW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgIFRhYlN0b3BzIHRhYlN0b3BzID0gbnVsbDsKKyAgICAgICAgaWYgKGhhc1RhYk9yRW1vamkgJiYgbVRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICAvLyBKdXN0IGNoZWNraW5nIHRoaXMgbGluZSBzaG91bGQgYmUgZ29vZCBlbm91Z2gsIHRhYnMgc2hvdWxkIGJlCisgICAgICAgICAgICAvLyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgbGluZXMgaW4gYSBwYXJhZ3JhcGguCisgICAgICAgICAgICBUYWJTdG9wU3BhbltdIHRhYnMgPSBnZXRQYXJhZ3JhcGhTcGFucygoU3Bhbm5lZCkgbVRleHQsIHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgIGlmICh0YWJzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICB0YWJTdG9wcyA9IG5ldyBUYWJTdG9wcyhUQUJfSU5DUkVNRU5ULCB0YWJzKTsgLy8gWFhYIHNob3VsZCByZXVzZQorICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgZmxvYXQgd2lkID0gbWVhc3VyZVRleHQobVBhaW50LCBtV29ya1BhaW50LCBtVGV4dCwgc3RhcnQsIG9mZnNldCwgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIsIGRpcmVjdGlvbnMsIHRyYWlsaW5nLCBhbHQsIHRhYiwgdGFicyk7CisgICAgICAgIFRleHRMaW5lIHRsID0gVGV4dExpbmUub2J0YWluKCk7CisgICAgICAgIHRsLnNldChtUGFpbnQsIG1UZXh0LCBzdGFydCwgZW5kLCBkaXIsIGRpcmVjdGlvbnMsIGhhc1RhYk9yRW1vamksIHRhYlN0b3BzKTsKKyAgICAgICAgZmxvYXQgd2lkID0gdGwubWVhc3VyZShvZmZzZXQgLSBzdGFydCwgdHJhaWxpbmcsIG51bGwpOworICAgICAgICBUZXh0TGluZS5yZWN5Y2xlKHRsKTsKIAotICAgICAgICBpZiAob2Zmc2V0ID4gZW5kKSB7Ci0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHdpZCAtPSBtZWFzdXJlVGV4dChtUGFpbnQsIG1Xb3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXh0LCBlbmQsIG9mZnNldCwgbnVsbCwgdGFiLCB0YWJzKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB3aWQgKz0gbWVhc3VyZVRleHQobVBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dCwgZW5kLCBvZmZzZXQsIG51bGwsIHRhYiwgdGFicyk7Ci0gICAgICAgIH0KLQotICAgICAgICBBbGlnbm1lbnQgYWxpZ24gPSBnZXRQYXJhZ3JhcGhBbGlnbm1lbnQobGluZSk7CiAgICAgICAgIGludCBsZWZ0ID0gZ2V0UGFyYWdyYXBoTGVmdChsaW5lKTsKICAgICAgICAgaW50IHJpZ2h0ID0gZ2V0UGFyYWdyYXBoUmlnaHQobGluZSk7CiAKLSAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9OT1JNQUwpIHsKLSAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJpZ2h0ICsgd2lkOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgd2lkOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgbWF4ID0gZ2V0TGluZU1heChsaW5lKTsKLQotICAgICAgICBpZiAoYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFKSB7Ci0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgbWF4ICsgd2lkOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiByaWdodCAtIG1heCArIHdpZDsKLSAgICAgICAgfSBlbHNlIHsgLyogYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX0NFTlRFUiAqLwotICAgICAgICAgICAgaW50IGltYXggPSAoKGludCkgbWF4KSAmIH4xOwotCi0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHJldHVybiByaWdodCAtICgoKHJpZ2h0IC0gbGVmdCkgLSBpbWF4KSAvIDIpICsgd2lkOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgKChyaWdodCAtIGxlZnQpIC0gaW1heCkgLyAyICsgd2lkOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRMaW5lU3RhcnRQb3MobGluZSwgbGVmdCwgcmlnaHQpICsgd2lkOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjU2LDM4ICs3ODUsNzYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBob3Jpem9udGFsIGV4dGVudCBvZiB0aGUgc3BlY2lmaWVkIGxpbmUsIGV4Y2x1ZGluZwotICAgICAqIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgICogR2V0cyB0aGUgdW5zaWduZWQgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lLCBpbmNsdWRpbmcKKyAgICAgKiBsZWFkaW5nIG1hcmdpbiBpbmRlbnQsIGJ1dCBleGNsdWRpbmcgdHJhaWxpbmcgd2hpdGVzcGFjZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0TGluZU1heChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gZ2V0TGluZU1heChsaW5lLCBudWxsLCBmYWxzZSk7CisgICAgICAgIGZsb2F0IG1hcmdpbiA9IGdldFBhcmFncmFwaExlYWRpbmdNYXJnaW4obGluZSk7CisgICAgICAgIGZsb2F0IHNpZ25lZEV4dGVudCA9IGdldExpbmVFeHRlbnQobGluZSwgZmFsc2UpOworICAgICAgICByZXR1cm4gbWFyZ2luICsgc2lnbmVkRXh0ZW50ID49IDAgPyBzaWduZWRFeHRlbnQgOiAtc2lnbmVkRXh0ZW50OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhvcml6b250YWwgZXh0ZW50IG9mIHRoZSBzcGVjaWZpZWQgbGluZSwgaW5jbHVkaW5nCi0gICAgICogdHJhaWxpbmcgd2hpdGVzcGFjZS4KKyAgICAgKiBHZXRzIHRoZSB1bnNpZ25lZCBob3Jpem9udGFsIGV4dGVudCBvZiB0aGUgc3BlY2lmaWVkIGxpbmUsIGluY2x1ZGluZworICAgICAqIGxlYWRpbmcgbWFyZ2luIGluZGVudCBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0TGluZVdpZHRoKGludCBsaW5lKSB7Ci0gICAgICAgIHJldHVybiBnZXRMaW5lTWF4KGxpbmUsIG51bGwsIHRydWUpOworICAgICAgICBmbG9hdCBtYXJnaW4gPSBnZXRQYXJhZ3JhcGhMZWFkaW5nTWFyZ2luKGxpbmUpOworICAgICAgICBmbG9hdCBzaWduZWRFeHRlbnQgPSBnZXRMaW5lRXh0ZW50KGxpbmUsIHRydWUpOworICAgICAgICByZXR1cm4gbWFyZ2luICsgc2lnbmVkRXh0ZW50ID49IDAgPyBzaWduZWRFeHRlbnQgOiAtc2lnbmVkRXh0ZW50OwogICAgIH0KIAotICAgIHByaXZhdGUgZmxvYXQgZ2V0TGluZU1heChpbnQgbGluZSwgT2JqZWN0W10gdGFicywgYm9vbGVhbiBmdWxsKSB7CisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI2dldExpbmVFeHRlbnQoaW50LFRhYlN0b3BzLGJvb2xlYW4pfSBidXQgZGV0ZXJtaW5lcyB0aGUKKyAgICAgKiB0YWIgc3RvcHMgaW5zdGVhZCBvZiB1c2luZyB0aGUgb25lcyBwYXNzZWQgaW4uCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGluZGV4IG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIGZ1bGwgd2hldGhlciB0byBpbmNsdWRlIHRyYWlsaW5nIHdoaXRlc3BhY2UKKyAgICAgKiBAcmV0dXJuIHRoZSBleHRlbnQgb2YgdGhlIGxpbmUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGdldExpbmVFeHRlbnQoaW50IGxpbmUsIGJvb2xlYW4gZnVsbCkgewogICAgICAgICBpbnQgc3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7Ci0gICAgICAgIGludCBlbmQ7CisgICAgICAgIGludCBlbmQgPSBmdWxsID8gZ2V0TGluZUVuZChsaW5lKSA6IGdldExpbmVWaXNpYmxlRW5kKGxpbmUpOwogCi0gICAgICAgIGlmIChmdWxsKSB7Ci0gICAgICAgICAgICBlbmQgPSBnZXRMaW5lRW5kKGxpbmUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZW5kID0gZ2V0TGluZVZpc2libGVFbmQobGluZSk7Ci0gICAgICAgIH0gCi0gICAgICAgIGJvb2xlYW4gdGFiID0gZ2V0TGluZUNvbnRhaW5zVGFiKGxpbmUpOwotCi0gICAgICAgIGlmICh0YWJzID09IG51bGwgJiYgdGFiICYmIG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgewotICAgICAgICAgICAgdGFicyA9ICgoU3Bhbm5lZCkgbVRleHQpLmdldFNwYW5zKHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgYm9vbGVhbiBoYXNUYWJzT3JFbW9qaSA9IGdldExpbmVDb250YWluc1RhYihsaW5lKTsKKyAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOworICAgICAgICBpZiAoaGFzVGFic09yRW1vamkgJiYgbVRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICAvLyBKdXN0IGNoZWNraW5nIHRoaXMgbGluZSBzaG91bGQgYmUgZ29vZCBlbm91Z2gsIHRhYnMgc2hvdWxkIGJlCisgICAgICAgICAgICAvLyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgbGluZXMgaW4gYSBwYXJhZ3JhcGguCisgICAgICAgICAgICBUYWJTdG9wU3BhbltdIHRhYnMgPSBnZXRQYXJhZ3JhcGhTcGFucygoU3Bhbm5lZCkgbVRleHQsIHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgIGlmICh0YWJzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICB0YWJTdG9wcyA9IG5ldyBUYWJTdG9wcyhUQUJfSU5DUkVNRU5ULCB0YWJzKTsgLy8gWFhYIHNob3VsZCByZXVzZQorICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOworICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOwogCi0gICAgICAgIHJldHVybiBtZWFzdXJlVGV4dChtUGFpbnQsIG1Xb3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dCwgc3RhcnQsIGVuZCwgbnVsbCwgdGFiLCB0YWJzKTsKKyAgICAgICAgVGV4dExpbmUgdGwgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgdGwuc2V0KG1QYWludCwgbVRleHQsIHN0YXJ0LCBlbmQsIGRpciwgZGlyZWN0aW9ucywgaGFzVGFic09yRW1vamksIHRhYlN0b3BzKTsKKyAgICAgICAgZmxvYXQgd2lkdGggPSB0bC5tZXRyaWNzKG51bGwpOworICAgICAgICBUZXh0TGluZS5yZWN5Y2xlKHRsKTsKKyAgICAgICAgcmV0dXJuIHdpZHRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNpZ25lZCBob3Jpem9udGFsIGV4dGVudCBvZiB0aGUgc3BlY2lmaWVkIGxpbmUsIGV4Y2x1ZGluZworICAgICAqIGxlYWRpbmcgbWFyZ2luLiAgSWYgZnVsbCBpcyBmYWxzZSwgZXhjbHVkZXMgdHJhaWxpbmcgd2hpdGVzcGFjZS4KKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgaW5kZXggb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0gdGFiU3RvcHMgdGhlIHRhYiBzdG9wcywgY2FuIGJlIG51bGwgaWYgd2Uga25vdyB0aGV5J3JlIG5vdCB1c2VkLgorICAgICAqIEBwYXJhbSBmdWxsIHdoZXRoZXIgdG8gaW5jbHVkZSB0cmFpbGluZyB3aGl0ZXNwYWNlCisgICAgICogQHJldHVybiB0aGUgZXh0ZW50IG9mIHRoZSB0ZXh0IG9uIHRoaXMgbGluZQorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgZ2V0TGluZUV4dGVudChpbnQgbGluZSwgVGFiU3RvcHMgdGFiU3RvcHMsIGJvb2xlYW4gZnVsbCkgeworICAgICAgICBpbnQgc3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBlbmQgPSBmdWxsID8gZ2V0TGluZUVuZChsaW5lKSA6IGdldExpbmVWaXNpYmxlRW5kKGxpbmUpOworICAgICAgICBib29sZWFuIGhhc1RhYnNPckVtb2ppID0gZ2V0TGluZUNvbnRhaW5zVGFiKGxpbmUpOworICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKKyAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKKworICAgICAgICBUZXh0TGluZSB0bCA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICB0bC5zZXQobVBhaW50LCBtVGV4dCwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLCBoYXNUYWJzT3JFbW9qaSwgdGFiU3RvcHMpOworICAgICAgICBmbG9hdCB3aWR0aCA9IHRsLm1ldHJpY3MobnVsbCk7CisgICAgICAgIFRleHRMaW5lLnJlY3ljbGUodGwpOworICAgICAgICByZXR1cm4gd2lkdGg7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MzgsNyArOTA1LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNoYXJhY3RlciBvZmZzZXQgb24gdGhlIHNwZWNmaWVkIGxpbmUgd2hvc2UgcG9zaXRpb24gaXMKKyAgICAgKiBHZXQgdGhlIGNoYXJhY3RlciBvZmZzZXQgb24gdGhlIHNwZWNpZmllZCBsaW5lIHdob3NlIHBvc2l0aW9uIGlzCiAgICAgICogY2xvc2VzdCB0byB0aGUgc3BlY2lmaWVkIGhvcml6b250YWwgcG9zaXRpb24uCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGludCBsaW5lLCBmbG9hdCBob3JpeikgewpAQCAtNzQ5LDIwICs5MTYsMTYgQEAKICAgICAgICAgaWYgKGxpbmUgPT0gZ2V0TGluZUNvdW50KCkgLSAxKQogICAgICAgICAgICAgbWF4Kys7CiAKLSAgICAgICAgaWYgKGxpbmUgIT0gZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgbWF4ID0gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgZ2V0TGluZUVuZChsaW5lKSk7Ci0KICAgICAgICAgaW50IGJlc3QgPSBtaW47CiAgICAgICAgIGZsb2F0IGJlc3RkaXN0ID0gTWF0aC5hYnMoZ2V0UHJpbWFyeUhvcml6b250YWwoYmVzdCkgLSBob3Jpeik7CiAKLSAgICAgICAgaW50IGhlcmUgPSBtaW47Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5tRGlyZWN0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IHRoZXJlID0gaGVyZSArIGRpcnMubURpcmVjdGlvbnNbaV07Ci0gICAgICAgICAgICBpbnQgc3dhcCA9ICgoaSAmIDEpID09IDApID8gMSA6IC0xOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGludCBoZXJlID0gbWluICsgZGlycy5tRGlyZWN0aW9uc1tpXTsKKyAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyAoZGlycy5tRGlyZWN0aW9uc1tpKzFdICYgUlVOX0xFTkdUSF9NQVNLKTsKKyAgICAgICAgICAgIGludCBzd2FwID0gKGRpcnMubURpcmVjdGlvbnNbaSsxXSAmIFJVTl9SVExfRkxBRykgIT0gMCA/IC0xIDogMTsKIAogICAgICAgICAgICAgaWYgKHRoZXJlID4gbWF4KQogICAgICAgICAgICAgICAgIHRoZXJlID0gbWF4OwotCiAgICAgICAgICAgICBpbnQgaGlnaCA9IHRoZXJlIC0gMSArIDEsIGxvdyA9IGhlcmUgKyAxIC0gMSwgZ3Vlc3M7CiAKICAgICAgICAgICAgIHdoaWxlIChoaWdoIC0gbG93ID4gMSkgewpAQCAtNzk1LDcgKzk1OCw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAoZGlzdCA8IGJlc3RkaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgIGJlc3RkaXN0ID0gZGlzdDsKLSAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGxvdzsgICAKKyAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGxvdzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTgwNSw4ICs5NjgsNiBAQAogICAgICAgICAgICAgICAgIGJlc3RkaXN0ID0gZGlzdDsKICAgICAgICAgICAgICAgICBiZXN0ID0gaGVyZTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwogICAgICAgICB9CiAKICAgICAgICAgZmxvYXQgZGlzdCA9IE1hdGguYWJzKGdldFByaW1hcnlIb3Jpem9udGFsKG1heCkgLSBob3Jpeik7CkBAIC04MjYsMTkgKzk4NywxNSBAQAogICAgICAgICByZXR1cm4gZ2V0TGluZVN0YXJ0KGxpbmUgKyAxKTsKICAgICB9CiAKLSAgICAvKiogCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSB0ZXh0IG9mZnNldCBhZnRlciB0aGUgbGFzdCB2aXNpYmxlIGNoYXJhY3RlciAoc28gd2hpdGVzcGFjZQogICAgICAqIGlzIG5vdCBjb3VudGVkKSBvbiB0aGUgc3BlY2lmaWVkIGxpbmUuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRMaW5lVmlzaWJsZUVuZChpbnQgbGluZSkgewogICAgICAgICByZXR1cm4gZ2V0TGluZVZpc2libGVFbmQobGluZSwgZ2V0TGluZVN0YXJ0KGxpbmUpLCBnZXRMaW5lU3RhcnQobGluZSsxKSk7CiAgICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGdldExpbmVWaXNpYmxlRW5kKGludCBsaW5lLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShnZXRMaW5lU3RhcnQobGluZSkgPT0gc3RhcnQgJiYgZ2V0TGluZVN0YXJ0KGxpbmUrMSkgPT0gZW5kKTsKLSAgICAgICAgfQogCisgICAgcHJpdmF0ZSBpbnQgZ2V0TGluZVZpc2libGVFbmQoaW50IGxpbmUsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IG1UZXh0OwogICAgICAgICBjaGFyIGNoOwogICAgICAgICBpZiAobGluZSA9PSBnZXRMaW5lQ291bnQoKSAtIDEpIHsKQEAgLTg4NSwyMDcgKzEwNDIsNjIgQEAKICAgICAgICAgcmV0dXJuIGdldExpbmVUb3AobGluZSkgLSAoZ2V0TGluZVRvcChsaW5lKzEpIC0gZ2V0TGluZURlc2NlbnQobGluZSkpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdGV4dCBvZmZzZXQgdGhhdCB3b3VsZCBiZSByZWFjaGVkIGJ5IG1vdmluZyBsZWZ0Ci0gICAgICogKHBvc3NpYmx5IG9udG8gYW5vdGhlciBsaW5lKSBmcm9tIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgotICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0VG9MZWZ0T2YoaW50IG9mZnNldCkgewotICAgICAgICBpbnQgbGluZSA9IGdldExpbmVGb3JPZmZzZXQob2Zmc2V0KTsKLSAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpbnQgZW5kID0gZ2V0TGluZUVuZChsaW5lKTsKLSAgICAgICAgRGlyZWN0aW9ucyBkaXJzID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7Ci0KLSAgICAgICAgaWYgKGxpbmUgIT0gZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgZW5kID0gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgZW5kKTsKLQotICAgICAgICBmbG9hdCBob3JpeiA9IGdldFByaW1hcnlIb3Jpem9udGFsKG9mZnNldCk7Ci0KLSAgICAgICAgaW50IGJlc3QgPSBvZmZzZXQ7Ci0gICAgICAgIGZsb2F0IGJlc3RoID0gSW50ZWdlci5NSU5fVkFMVUU7Ci0gICAgICAgIGludCBjYW5kaWRhdGU7Ci0KLSAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgb2Zmc2V0KTsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoY2FuZGlkYXRlKTsKLQotICAgICAgICAgICAgaWYgKGggPCBob3JpeiAmJiBoID4gYmVzdGgpIHsKLSAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRBZnRlcihtVGV4dCwgb2Zmc2V0KTsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoY2FuZGlkYXRlKTsKLQotICAgICAgICAgICAgaWYgKGggPCBob3JpeiAmJiBoID4gYmVzdGgpIHsKLSAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludCBoZXJlID0gc3RhcnQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5tRGlyZWN0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IHRoZXJlID0gaGVyZSArIGRpcnMubURpcmVjdGlvbnNbaV07Ci0gICAgICAgICAgICBpZiAodGhlcmUgPiBlbmQpCi0gICAgICAgICAgICAgICAgdGhlcmUgPSBlbmQ7Ci0KLSAgICAgICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChoZXJlKTsKLQotICAgICAgICAgICAgaWYgKGggPCBob3JpeiAmJiBoID4gYmVzdGgpIHsKLSAgICAgICAgICAgICAgICBiZXN0ID0gaGVyZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRBZnRlcihtVGV4dCwgaGVyZSk7Ci0gICAgICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgICAgICBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoY2FuZGlkYXRlKTsKLQotICAgICAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIHRoZXJlKTsKLSAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgICAgIGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGggPCBob3JpeiAmJiBoID4gYmVzdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGVuZCk7Ci0KLSAgICAgICAgaWYgKGggPCBob3JpeiAmJiBoID4gYmVzdGgpIHsKLSAgICAgICAgICAgIGJlc3QgPSBlbmQ7Ci0gICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmVzdCAhPSBvZmZzZXQpCi0gICAgICAgICAgICByZXR1cm4gYmVzdDsKLQotICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOwotCi0gICAgICAgIGlmIChkaXIgPiAwKSB7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBiZXN0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUgLSAxLCAxMDAwMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSBnZXRMaW5lQ291bnQoKSAtIDEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdldE9mZnNldEZvckhvcml6b250YWwobGluZSArIDEsIDEwMDAwKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0VG9MZWZ0UmlnaHRPZihvZmZzZXQsIHRydWUpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdGV4dCBvZmZzZXQgdGhhdCB3b3VsZCBiZSByZWFjaGVkIGJ5IG1vdmluZyByaWdodAotICAgICAqIChwb3NzaWJseSBvbnRvIGFub3RoZXIgbGluZSkgZnJvbSB0aGUgc3BlY2lmaWVkIG9mZnNldC4KLSAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE9mZnNldFRvUmlnaHRPZihpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIGludCBsaW5lID0gZ2V0TGluZUZvck9mZnNldChvZmZzZXQpOwotICAgICAgICBpbnQgc3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7Ci0gICAgICAgIGludCBlbmQgPSBnZXRMaW5lRW5kKGxpbmUpOwotICAgICAgICBEaXJlY3Rpb25zIGRpcnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKKyAgICAgICAgcmV0dXJuIGdldE9mZnNldFRvTGVmdFJpZ2h0T2Yob2Zmc2V0LCBmYWxzZSk7CisgICAgfQogCi0gICAgICAgIGlmIChsaW5lICE9IGdldExpbmVDb3VudCgpIC0gMSkKLSAgICAgICAgICAgIGVuZCA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIGVuZCk7CisgICAgcHJpdmF0ZSBpbnQgZ2V0T2Zmc2V0VG9MZWZ0UmlnaHRPZihpbnQgY2FyZXQsIGJvb2xlYW4gdG9MZWZ0KSB7CisgICAgICAgIGludCBsaW5lID0gZ2V0TGluZUZvck9mZnNldChjYXJldCk7CisgICAgICAgIGludCBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBsaW5lRW5kID0gZ2V0TGluZUVuZChsaW5lKTsKKyAgICAgICAgaW50IGxpbmVEaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7CiAKLSAgICAgICAgZmxvYXQgaG9yaXogPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChvZmZzZXQpOwotCi0gICAgICAgIGludCBiZXN0ID0gb2Zmc2V0OwotICAgICAgICBmbG9hdCBiZXN0aCA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICBpbnQgY2FuZGlkYXRlOwotCi0gICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIG9mZnNldCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIG9mZnNldCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaGVyZSA9IHN0YXJ0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaWYgKHRoZXJlID4gZW5kKQotICAgICAgICAgICAgICAgIHRoZXJlID0gZW5kOwotCi0gICAgICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoaGVyZSk7Ci0KLSAgICAgICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGhlcmU7Ci0gICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIGhlcmUpOwotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICBiZXN0aCA9IGg7CisgICAgICAgIGJvb2xlYW4gYWR2YW5jZSA9IHRvTGVmdCA9PSAobGluZURpciA9PSBESVJfUklHSFRfVE9fTEVGVCk7CisgICAgICAgIGlmIChjYXJldCA9PSAoYWR2YW5jZSA/IGxpbmVFbmQgOiBsaW5lU3RhcnQpKSB7CisgICAgICAgICAgICAvLyB3YWxraW5nIG9mZiBsaW5lLCBzbyBsb29rIGF0IHRoZSBsaW5lIHdlJ3JlIGhlYWRlZCB0bworICAgICAgICAgICAgaWYgKGNhcmV0ID09IGxpbmVTdGFydCkgeworICAgICAgICAgICAgICAgIGlmIChsaW5lID4gMCkgeworICAgICAgICAgICAgICAgICAgICAtLWxpbmU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhcmV0OyAvLyBhdCB2ZXJ5IHN0YXJ0LCBkb24ndCBtb3ZlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobGluZSA8IGdldExpbmVDb3VudCgpIC0gMSkgeworICAgICAgICAgICAgICAgICAgICArK2xpbmU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhcmV0OyAvLyBhdCB2ZXJ5IGVuZCwgZG9uJ3QgbW92ZQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgdGhlcmUpOwotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgbGluZVN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICAgICAgbGluZUVuZCA9IGdldExpbmVFbmQobGluZSk7CisgICAgICAgICAgICBpbnQgbmV3RGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOworICAgICAgICAgICAgaWYgKG5ld0RpciAhPSBsaW5lRGlyKSB7CisgICAgICAgICAgICAgICAgLy8gdW51c3VhbCBjYXNlLiAgd2Ugd2FudCB0byB3YWxrIG9udG8gdGhlIGxpbmUsIGJ1dCBpdCBydW5zCisgICAgICAgICAgICAgICAgLy8gaW4gYSBkaWZmZXJlbnQgZGlyZWN0aW9uIHRoYW4gdGhpcyBvbmUsIHNvIHdlIGZha2UgbW92ZW1lbnQKKyAgICAgICAgICAgICAgICAvLyBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLgorICAgICAgICAgICAgICAgIHRvTGVmdCA9ICF0b0xlZnQ7CisgICAgICAgICAgICAgICAgbGluZURpciA9IG5ld0RpcjsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwogICAgICAgICB9CiAKLSAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGVuZCk7CisgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOwogCi0gICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICBiZXN0ID0gZW5kOwotICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJlc3QgIT0gb2Zmc2V0KQotICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0KLSAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKLQotICAgICAgICBpZiAoZGlyID4gMCkgewotICAgICAgICAgICAgaWYgKGxpbmUgPT0gZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgICAgIHJldHVybiBiZXN0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUgKyAxLCAtMTAwMDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxpbmUgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gYmVzdDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lIC0gMSwgLTEwMDAwKTsKLSAgICAgICAgfQorICAgICAgICBUZXh0TGluZSB0bCA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICAvLyBYWFg6IHdlIGRvbid0IGNhcmUgYWJvdXQgdGFicworICAgICAgICB0bC5zZXQobVBhaW50LCBtVGV4dCwgbGluZVN0YXJ0LCBsaW5lRW5kLCBsaW5lRGlyLCBkaXJlY3Rpb25zLCBmYWxzZSwgbnVsbCk7CisgICAgICAgIGNhcmV0ID0gbGluZVN0YXJ0ICsgdGwuZ2V0T2Zmc2V0VG9MZWZ0UmlnaHRPZihjYXJldCAtIGxpbmVTdGFydCwgdG9MZWZ0KTsKKyAgICAgICAgdGwgPSBUZXh0TGluZS5yZWN5Y2xlKHRsKTsKKyAgICAgICAgcmV0dXJuIGNhcmV0OwogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGdldE9mZnNldEF0U3RhcnRPZihpbnQgb2Zmc2V0KSB7CisgICAgICAgIC8vIFhYWCB0aGlzIHByb2JhYmx5IHNob3VsZCBza2lwIGxvY2FsIHJlb3JkZXJpbmdzIGFuZAorICAgICAgICAvLyB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMsIGxvb2sgYXQgY2FsbGVycwogICAgICAgICBpZiAob2Zmc2V0ID09IDApCiAgICAgICAgICAgICByZXR1cm4gMDsKIApAQCAtMTExOCw3ICsxMTMwLDcgQEAKICAgICAvKioKICAgICAgKiBGaWxscyBpbiB0aGUgc3BlY2lmaWVkIFBhdGggd2l0aCBhIHJlcHJlc2VudGF0aW9uIG9mIGEgY3Vyc29yCiAgICAgICogYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuICBUaGlzIHdpbGwgb2Z0ZW4gYmUgYSB2ZXJ0aWNhbCBsaW5lCi0gICAgICogYnV0IGNhbiBiZSBtdWx0aXBsZSBkaXNjb250aW5vdXMgbGluZXMgaW4gdGV4dCB3aXRoIG11bHRpcGxlCisgICAgICogYnV0IGNhbiBiZSBtdWx0aXBsZSBkaXNjb250aW51b3VzIGxpbmVzIGluIHRleHQgd2l0aCBtdWx0aXBsZQogICAgICAqIGRpcmVjdGlvbmFsaXRpZXMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZ2V0Q3Vyc29yUGF0aChpbnQgcG9pbnQsIFBhdGggZGVzdCwKQEAgLTExMzAsNyArMTE0Miw4IEBACiAgICAgICAgIGludCBib3R0b20gPSBnZXRMaW5lVG9wKGxpbmUrMSk7CiAKICAgICAgICAgZmxvYXQgaDEgPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChwb2ludCkgLSAwLjVmOwotICAgICAgICBmbG9hdCBoMiA9IGdldFNlY29uZGFyeUhvcml6b250YWwocG9pbnQpIC0gMC41ZjsKKyAgICAgICAgZmxvYXQgaDIgPSBpc0xldmVsQm91bmRhcnkocG9pbnQpID8KKyAgICAgICAgICAgICAgICAgICAgZ2V0U2Vjb25kYXJ5SG9yaXpvbnRhbChwb2ludCkgLSAwLjVmIDogaDE7CiAKICAgICAgICAgaW50IGNhcHMgPSBUZXh0S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGVkaXRpbmdCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5NRVRBX1NISUZUX09OKSB8CkBAIC0xMjA3LDkgKzEyMjAsMTAgQEAKICAgICAgICAgaWYgKGxpbmVlbmQgPiBsaW5lc3RhcnQgJiYgbVRleHQuY2hhckF0KGxpbmVlbmQgLSAxKSA9PSAnXG4nKQogICAgICAgICAgICAgbGluZWVuZC0tOwogCi0gICAgICAgIGludCBoZXJlID0gbGluZXN0YXJ0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGludCBoZXJlID0gbGluZXN0YXJ0ICsgZGlycy5tRGlyZWN0aW9uc1tpXTsKKyAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyAoZGlycy5tRGlyZWN0aW9uc1tpKzFdICYgUlVOX0xFTkdUSF9NQVNLKTsKKwogICAgICAgICAgICAgaWYgKHRoZXJlID4gbGluZWVuZCkKICAgICAgICAgICAgICAgICB0aGVyZSA9IGxpbmVlbmQ7CiAKQEAgLTEyMTgsMTQgKzEyMzIsMTIgQEAKICAgICAgICAgICAgICAgICBpbnQgZW4gPSBNYXRoLm1pbihlbmQsIHRoZXJlKTsKIAogICAgICAgICAgICAgICAgIGlmIChzdCAhPSBlbikgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBoMSA9IGdldEhvcml6b250YWwoc3QsIGZhbHNlLCBmYWxzZSwgbGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGgyID0gZ2V0SG9yaXpvbnRhbChlbiwgdHJ1ZSwgZmFsc2UsIGxpbmUpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBoMSA9IGdldEhvcml6b250YWwoc3QsIGZhbHNlLCBsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgaDIgPSBnZXRIb3Jpem9udGFsKGVuLCB0cnVlLCBsaW5lKTsKIAogICAgICAgICAgICAgICAgICAgICBkZXN0LmFkZFJlY3QoaDEsIHRvcCwgaDIsIGJvdHRvbSwgUGF0aC5EaXJlY3Rpb24uQ1cpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjYwLDcgKzEyNzIsNyBAQAogCiAgICAgICAgICAgICBhZGRTZWxlY3Rpb24oc3RhcnRsaW5lLCBzdGFydCwgZ2V0TGluZUVuZChzdGFydGxpbmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwgZ2V0TGluZUJvdHRvbShzdGFydGxpbmUpLCBkZXN0KTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAoZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKHN0YXJ0bGluZSkgPT0gRElSX1JJR0hUX1RPX0xFRlQpCiAgICAgICAgICAgICAgICAgZGVzdC5hZGRSZWN0KGdldExpbmVMZWZ0KHN0YXJ0bGluZSksIHRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGdldExpbmVCb3R0b20oc3RhcnRsaW5lKSwgUGF0aC5EaXJlY3Rpb24uQ1cpOwpAQCAtMTI5Niw3ICsxMzA4LDcgQEAKIAogICAgICAgICBpZiAobVNwYW5uZWRUZXh0KSB7CiAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIG1UZXh0OwotICAgICAgICAgICAgQWxpZ25tZW50U3BhbltdIHNwYW5zID0gc3AuZ2V0U3BhbnMoZ2V0TGluZVN0YXJ0KGxpbmUpLAorICAgICAgICAgICAgQWxpZ25tZW50U3BhbltdIHNwYW5zID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3AsIGdldExpbmVTdGFydChsaW5lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExpbmVFbmQobGluZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnRTcGFuLmNsYXNzKTsKIApAQCAtMTMxMyw0MjMgKzEzMjUsMTczIEBACiAgICAgICogR2V0IHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHNwZWNpZmllZCBwYXJhZ3JhcGgsIGluc2V0IGJ5IGxlZnQgbWFyZ2lucy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldFBhcmFncmFwaExlZnQoaW50IGxpbmUpIHsKLSAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKLQogICAgICAgICBpbnQgbGVmdCA9IDA7Ci0KLSAgICAgICAgYm9vbGVhbiBwYXIgPSBmYWxzZTsKLSAgICAgICAgaW50IG9mZiA9IGdldExpbmVTdGFydChsaW5lKTsKLSAgICAgICAgaWYgKG9mZiA9PSAwIHx8IG1UZXh0LmNoYXJBdChvZmYgLSAxKSA9PSAnXG4nKQotICAgICAgICAgICAgcGFyID0gdHJ1ZTsKLQotICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSB7Ci0gICAgICAgICAgICBpZiAobVNwYW5uZWRUZXh0KSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBtVGV4dDsKLSAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbltdIHNwYW5zID0gc3AuZ2V0U3BhbnMoZ2V0TGluZVN0YXJ0KGxpbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMaW5lRW5kKGxpbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3Bhbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbWFyZ2luID0gcGFyOwotICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbiBzcGFuID0gc3BhbnNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAoKExlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMilzcGFuKS5nZXRMZWFkaW5nTWFyZ2luTGluZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBjb3VudCA+PSBsaW5lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgKz0gc3Bhbi5nZXRMZWFkaW5nTWFyZ2luKG1hcmdpbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOworICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUIHx8ICFtU3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiBsZWZ0OyAvLyBsZWFkaW5nIG1hcmdpbiBoYXMgbm8gaW1wYWN0LCBvciBubyBzdHlsZXMKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsZWZ0OworICAgICAgICByZXR1cm4gZ2V0UGFyYWdyYXBoTGVhZGluZ01hcmdpbihsaW5lKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIHNwZWNpZmllZCBwYXJhZ3JhcGgsIGluc2V0IGJ5IHJpZ2h0IG1hcmdpbnMuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRQYXJhZ3JhcGhSaWdodChpbnQgbGluZSkgewotICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOwotCiAgICAgICAgIGludCByaWdodCA9IG1XaWR0aDsKLQotICAgICAgICBib29sZWFuIHBhciA9IGZhbHNlOwotICAgICAgICBpbnQgb2ZmID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpZiAob2ZmID09IDAgfHwgbVRleHQuY2hhckF0KG9mZiAtIDEpID09ICdcbicpCi0gICAgICAgICAgICBwYXIgPSB0cnVlOwotCi0KLSAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgaWYgKG1TcGFubmVkVGV4dCkgewotICAgICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgbVRleHQ7Ci0gICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW5bXSBzcGFucyA9IHNwLmdldFNwYW5zKGdldExpbmVTdGFydChsaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGluZUVuZChsaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICByaWdodCAtPSBzcGFuc1tpXS5nZXRMZWFkaW5nTWFyZ2luKHBhcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOworICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUIHx8ICFtU3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiByaWdodDsgLy8gbGVhZGluZyBtYXJnaW4gaGFzIG5vIGltcGFjdCwgb3Igbm8gc3R5bGVzCiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmlnaHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRyYXdUZXh0KENhbnZhcyBjYW52YXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgRGlyZWN0aW9ucyBkaXJlY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJzLCBPYmplY3RbXSBwYXJzcGFucykgewotICAgICAgICBjaGFyW10gYnVmOwotICAgICAgICBpZiAoIWhhc1RhYnMpIHsKLSAgICAgICAgICAgIGlmIChkaXJlY3Rpb25zID09IERJUlNfQUxMX0xFRlRfVE9fUklHSFQpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoRElSX0xFRlRfVE9fUklHSFQgPT0gZGlyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3R5bGVkLmRyYXdUZXh0KGNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwgZGlyLCBmYWxzZSwgeCwgdG9wLCB5LCBib3R0b20sIHBhaW50LCB3b3JrUGFpbnQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWYgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmID0gVGV4dFV0aWxzLm9idGFpbihlbmQgLSBzdGFydCk7Ci0gICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGggPSAwOwotCi0gICAgICAgIGludCBoZXJlID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3Rpb25zLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgZGlyZWN0aW9ucy5tRGlyZWN0aW9uc1tpXTsKLSAgICAgICAgICAgIGlmICh0aGVyZSA+IGVuZCAtIHN0YXJ0KQotICAgICAgICAgICAgICAgIHRoZXJlID0gZW5kIC0gc3RhcnQ7Ci0KLSAgICAgICAgICAgIGludCBzZWdzdGFydCA9IGhlcmU7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gaGFzVGFicyA/IGhlcmUgOiB0aGVyZTsgaiA8PSB0aGVyZTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGogPT0gdGhlcmUgfHwgYnVmW2pdID09ICdcdCcpIHsKLSAgICAgICAgICAgICAgICAgICAgaCArPSBTdHlsZWQuZHJhd1RleHQoY2FudmFzLCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LCBzdGFydCArIGosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciwgKGkgJiAxKSAhPSAwLCB4ICsgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLCB5LCBib3R0b20sIHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgaiAhPSBlbmQpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChqICE9IHRoZXJlICYmIGJ1ZltqXSA9PSAnXHQnKQotICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGRpciAqIG5leHRUYWIodGV4dCwgc3RhcnQsIGVuZCwgaCAqIGRpciwgcGFyc3BhbnMpOwotCi0gICAgICAgICAgICAgICAgICAgIHNlZ3N0YXJ0ID0gaiArIDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYXNUYWJzICYmIGJ1ZltqXSA+PSAweEQ4MDAgJiYgYnVmW2pdIDw9IDB4REZGRiAmJiBqICsgMSA8IHRoZXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBlbW9qaSA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChidWYsIGopOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChlbW9qaSA+PSBNSU5fRU1PSkkgJiYgZW1vamkgPD0gTUFYX0VNT0pJKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBFTU9KSV9GQUNUT1JZLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJpdG1hcEZyb21BbmRyb2lkUHVhKGVtb2ppKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICs9IFN0eWxlZC5kcmF3VGV4dChjYW52YXMsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwgc3RhcnQgKyBqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciwgKGkgJiAxKSAhPSAwLCB4ICsgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsIHksIGJvdHRvbSwgcGFpbnQsIHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIGogIT0gZW5kKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRW1vamlSZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVtb2ppUmVjdCA9IG5ldyBSZWN0RigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXQocGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIGosIHN0YXJ0ICsgaiArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJpdG1hcEhlaWdodCA9IGJtLmdldEhlaWdodCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRleHRIZWlnaHQgPSAtd29ya1BhaW50LmFzY2VudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gdGV4dEhlaWdodCAvIGJpdG1hcEhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWR0aCA9IGJtLmdldFdpZHRoKCkgKiBzY2FsZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FbW9qaVJlY3Quc2V0KHggKyBoLCB5IC0gdGV4dEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ICsgaCArIHdpZHRoLCB5KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKGJtLCBudWxsLCBtRW1vamlSZWN0LCBwYWludCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCArPSB3aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdzdGFydCA9IGogKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoZXJlID0gdGhlcmU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFzVGFicykKLSAgICAgICAgICAgIFRleHRVdGlscy5yZWN5Y2xlKGJ1Zik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgbWVhc3VyZVRleHQoVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgb2Zmc2V0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIERpcmVjdGlvbnMgZGlyZWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHRyYWlsaW5nLCBib29sZWFuIGFsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc1RhYnMsIE9iamVjdFtdIHRhYnMpIHsKLSAgICAgICAgY2hhcltdIGJ1ZiA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGhhc1RhYnMpIHsKLSAgICAgICAgICAgIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oZW5kIC0gc3RhcnQpOwotICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBoID0gMDsKLQotICAgICAgICBpZiAoYWx0KSB7Ci0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHRyYWlsaW5nID0gIXRyYWlsaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGhlcmUgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdGlvbnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhbHQpCi0gICAgICAgICAgICAgICAgdHJhaWxpbmcgPSAhdHJhaWxpbmc7Ci0KLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJlY3Rpb25zLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaWYgKHRoZXJlID4gZW5kIC0gc3RhcnQpCi0gICAgICAgICAgICAgICAgdGhlcmUgPSBlbmQgLSBzdGFydDsKLQotICAgICAgICAgICAgaW50IHNlZ3N0YXJ0ID0gaGVyZTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBoYXNUYWJzID8gaGVyZSA6IHRoZXJlOyBqIDw9IHRoZXJlOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgY29kZXB0ID0gMDsKLSAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBudWxsOwotCi0gICAgICAgICAgICAgICAgaWYgKGhhc1RhYnMgJiYgaiA8IHRoZXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVwdCA9IGJ1ZltqXTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IDB4RDgwMCAmJiBjb2RlcHQgPD0gMHhERkZGICYmIGogKyAxIDwgdGhlcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgY29kZXB0ID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGJ1Ziwgaik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA+PSBNSU5fRU1PSkkgJiYgY29kZXB0IDw9IE1BWF9FTU9KSSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm0gPSBFTU9KSV9GQUNUT1JZLmdldEJpdG1hcEZyb21BbmRyb2lkUHVhKGNvZGVwdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaiA9PSB0aGVyZSB8fCBjb2RlcHQgPT0gJ1x0JyB8fCBibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IHNlZ3c7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IHN0YXJ0ICsgaiB8fAotICAgICAgICAgICAgICAgICAgICAgICAodHJhaWxpbmcgJiYgb2Zmc2V0IDw9IHN0YXJ0ICsgaikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQgJiYgKGkgJiAxKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCArPSBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQgJiYgKGkgJiAxKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtPSBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzZWd3ID0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwgc3RhcnQgKyBqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCBzdGFydCArIGogfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICh0cmFpbGluZyAmJiBvZmZzZXQgPD0gc3RhcnQgKyBqKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gc2VndyAtIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtPSBzZWd3IC0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgc2Vnc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgICAgICAgICAgaCAtPSBzZWd3OwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBoICs9IHNlZ3c7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGogIT0gdGhlcmUgJiYgYnVmW2pdID09ICdcdCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gc3RhcnQgKyBqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBoID0gZGlyICogbmV4dFRhYih0ZXh0LCBzdGFydCwgZW5kLCBoICogZGlyLCB0YWJzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChqICE9IHRoZXJlICYmIGJtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gc3RhcnQgKyBqKSByZXR1cm4gaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXQocGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaiArIDIsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWQgPSAoZmxvYXQpIGJtLmdldFdpZHRoKCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdvcmtQYWludC5hc2NlbnQoKSAvIGJtLmdldEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtPSB3aWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gd2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzZWdzdGFydCA9IGogKyAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhc1RhYnMpCi0gICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOwotCi0gICAgICAgIHJldHVybiBoOworICAgICAgICByZXR1cm4gcmlnaHQgLSBnZXRQYXJhZ3JhcGhMZWFkaW5nTWFyZ2luKGxpbmUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIE1lYXN1cmUgd2lkdGggb2YgYSBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lIHRoYXQgaXMga25vd24gdG8gYWxsIGJlCi0gICAgICogaW4gdGhlIHNhbWUgZGlyZWN0aW9uIGFzIHRoZSBwYXJhZ3JhcGggYmFzZSBkaXJlY3Rpb24uIFJldHVybnMgdGhlIHdpZHRoLAotICAgICAqIGFuZCB0aGUgbGluZSBtZXRyaWNzIGluIGZtIGlmIGZtIGlzIG5vdCBudWxsLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhaW50IHRoZSBwYWludCBmb3IgdGhlIHRleHQ7IHdpbGwgbm90IGJlIG1vZGlmaWVkCi0gICAgICogQHBhcmFtIHdvcmtQYWludCBwYWludCBhdmFpbGFibGUgZm9yIG1vZGlmaWNhdGlvbgotICAgICAqIEBwYXJhbSB0ZXh0IHRleHQKLSAgICAgKiBAcGFyYW0gc3RhcnQgc3RhcnQgb2YgdGhlIGxpbmUKLSAgICAgKiBAcGFyYW0gZW5kIGxpbWl0IG9mIHRoZSBsaW5lCi0gICAgICogQHBhcmFtIGZtIG9iamVjdCB0byByZXR1cm4gaW50ZWdlciBtZXRyaWNzIGluLCBjYW4gYmUgbnVsbAotICAgICAqIEBwYXJhbSBoYXNUYWJzIHRydWUgaWYgaXQgaXMga25vd24gdGhhdCB0aGUgbGluZSBoYXMgdGFicwotICAgICAqIEBwYXJhbSB0YWJzIHRhYiBwb3NpdGlvbiBpbmZvcm1hdGlvbgotICAgICAqIEByZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGZyb20gc3RhcnQgdG8gZW5kCisgICAgICogUmV0dXJucyB0aGUgZWZmZWN0aXZlIGxlYWRpbmcgbWFyZ2luICh1bnNpZ25lZCkgZm9yIHRoaXMgbGluZSwKKyAgICAgKiB0YWtpbmcgaW50byBhY2NvdW50IExlYWRpbmdNYXJnaW5TcGFuIGFuZCBMZWFkaW5nTWFyZ2luU3BhbjIuCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgaW5kZXgKKyAgICAgKiBAcmV0dXJuIHRoZSBsZWFkaW5nIG1hcmdpbiBvZiB0aGlzIGxpbmUKICAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmbG9hdCBtZWFzdXJlVGV4dChUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJzLCBPYmplY3RbXSB0YWJzKSB7Ci0gICAgICAgIGNoYXJbXSBidWYgPSBudWxsOwotICAKLSAgICAgICAgaWYgKGhhc1RhYnMpIHsKLSAgICAgICAgICAgIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oZW5kIC0gc3RhcnQpOwotICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7CisgICAgcHJpdmF0ZSBpbnQgZ2V0UGFyYWdyYXBoTGVhZGluZ01hcmdpbihpbnQgbGluZSkgeworICAgICAgICBpZiAoIW1TcGFubmVkVGV4dCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgU3Bhbm5lZCBzcGFubmVkID0gKFNwYW5uZWQpIG1UZXh0OworCisgICAgICAgIGludCBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBsaW5lRW5kID0gZ2V0TGluZUVuZChsaW5lKTsKKyAgICAgICAgaW50IHNwYW5FbmQgPSBzcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihsaW5lU3RhcnQsIGxpbmVFbmQsCisgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOworICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbltdIHNwYW5zID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3Bhbm5lZCwgbGluZVN0YXJ0LCBzcGFuRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOworICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOyAvLyBubyBsZWFkaW5nIG1hcmdpbiBzcGFuOwogICAgICAgICB9CiAKLSAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICBpbnQgbWFyZ2luID0gMDsKIAotICAgICAgICBpbnQgbGFzdFBvcyA9IDA7Ci0gICAgICAgIGZsb2F0IHdpZHRoID0gMDsKLSAgICAgICAgaW50IGFzY2VudCA9IDAsIGRlc2NlbnQgPSAwLCB0b3AgPSAwLCBib3R0b20gPSAwOworICAgICAgICBib29sZWFuIGlzRmlyc3RQYXJhTGluZSA9IGxpbmVTdGFydCA9PSAwIHx8CisgICAgICAgICAgICBzcGFubmVkLmNoYXJBdChsaW5lU3RhcnQgLSAxKSA9PSAnXG4nOwogCi0gICAgICAgIGlmIChmbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmbS5hc2NlbnQgPSAwOwotICAgICAgICAgICAgZm0uZGVzY2VudCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBwb3MgPSBoYXNUYWJzID8gMCA6IGxlbjsgcG9zIDw9IGxlbjsgcG9zKyspIHsKLSAgICAgICAgICAgIGludCBjb2RlcHQgPSAwOwotICAgICAgICAgICAgQml0bWFwIGJtID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKGhhc1RhYnMgJiYgcG9zIDwgbGVuKSB7Ci0gICAgICAgICAgICAgICAgY29kZXB0ID0gYnVmW3Bvc107CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuIHNwYW4gPSBzcGFuc1tpXTsKKyAgICAgICAgICAgIGJvb2xlYW4gdXNlRmlyc3RMaW5lTWFyZ2luID0gaXNGaXJzdFBhcmFMaW5lOworICAgICAgICAgICAgaWYgKHNwYW4gaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3BhbjIpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3BTdGFydCA9IHNwYW5uZWQuZ2V0U3BhblN0YXJ0KHNwYW4pOworICAgICAgICAgICAgICAgIGludCBzcGFuTGluZSA9IGdldExpbmVGb3JPZmZzZXQoc3BTdGFydCk7CisgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gKChMZWFkaW5nTWFyZ2luU3BhbjIpc3BhbikuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOworICAgICAgICAgICAgICAgIHVzZUZpcnN0TGluZU1hcmdpbiA9IGxpbmUgPCBzcGFuTGluZSArIGNvdW50OwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFyZ2luICs9IHNwYW4uZ2V0TGVhZGluZ01hcmdpbih1c2VGaXJzdExpbmVNYXJnaW4pOworICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gMHhEODAwICYmIGNvZGVwdCA8PSAweERGRkYgJiYgcG9zIDwgbGVuKSB7Ci0gICAgICAgICAgICAgICAgY29kZXB0ID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGJ1ZiwgcG9zKTsKKyAgICAgICAgcmV0dXJuIG1hcmdpbjsKKyAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IE1JTl9FTU9KSSAmJiBjb2RlcHQgPD0gTUFYX0VNT0pJKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJtID0gRU1PSklfRkFDVE9SWS5nZXRCaXRtYXBGcm9tQW5kcm9pZFB1YShjb2RlcHQpOworICAgIC8qIHBhY2thZ2UgKi8KKyAgICBzdGF0aWMgZmxvYXQgbWVhc3VyZVBhcmEoVGV4dFBhaW50IHBhaW50LCBUZXh0UGFpbnQgd29ya1BhaW50LAorICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCkgeworCisgICAgICAgIE1lYXN1cmVkVGV4dCBtdCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKyAgICAgICAgVGV4dExpbmUgdGwgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG10LnNldFBhcmEodGV4dCwgc3RhcnQsIGVuZCwgRElSX1JFUVVFU1RfTFRSKTsKKyAgICAgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9uczsKKyAgICAgICAgICAgIGludCBkaXI7CisgICAgICAgICAgICBpZiAobXQubUVhc3kpIHsKKyAgICAgICAgICAgICAgICBkaXJlY3Rpb25zID0gRElSU19BTExfTEVGVF9UT19SSUdIVDsKKyAgICAgICAgICAgICAgICBkaXIgPSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRpcmVjdGlvbnMgPSBBbmRyb2lkQmlkaS5kaXJlY3Rpb25zKG10Lm1EaXIsIG10Lm1MZXZlbHMsCisgICAgICAgICAgICAgICAgICAgIDAsIG10Lm1DaGFycywgMCwgbXQubUxlbik7CisgICAgICAgICAgICAgICAgZGlyID0gbXQubURpcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXJbXSBjaGFycyA9IG10Lm1DaGFyczsKKyAgICAgICAgICAgIGludCBsZW4gPSBtdC5tTGVuOworICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJzID0gZmFsc2U7CisgICAgICAgICAgICBUYWJTdG9wcyB0YWJTdG9wcyA9IG51bGw7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoYXJzW2ldID09ICdcdCcpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzVGFicyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZCBzcGFubmVkID0gKFNwYW5uZWQpIHRleHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3BhbkVuZCA9IHNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuW10gc3BhbnMgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcGFubmVkLCBzdGFydCwgc3BhbkVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJTdG9wcyA9IG5ldyBUYWJTdG9wcyhUQUJfSU5DUkVNRU5ULCBzcGFucyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgdGwuc2V0KHBhaW50LCB0ZXh0LCBzdGFydCwgZW5kLCBkaXIsIGRpcmVjdGlvbnMsIGhhc1RhYnMsIHRhYlN0b3BzKTsKKyAgICAgICAgICAgIHJldHVybiB0bC5tZXRyaWNzKG51bGwpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgVGV4dExpbmUucmVjeWNsZSh0bCk7CisgICAgICAgICAgICBNZWFzdXJlZFRleHQucmVjeWNsZShtdCk7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgICAgIGlmIChwb3MgPT0gbGVuIHx8IGNvZGVwdCA9PSAnXHQnIHx8IGJtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdCA9IDA7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBUYWJTdG9wcyB7CisgICAgICAgIHByaXZhdGUgaW50W10gbVN0b3BzOworICAgICAgICBwcml2YXRlIGludCBtTnVtU3RvcHM7CisgICAgICAgIHByaXZhdGUgaW50IG1JbmNyZW1lbnQ7CiAKLSAgICAgICAgICAgICAgICB3aWR0aCArPSBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIGxhc3RQb3MsIHN0YXJ0ICsgcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtKTsKKyAgICAgICAgVGFiU3RvcHMoaW50IGluY3JlbWVudCwgT2JqZWN0W10gc3BhbnMpIHsKKyAgICAgICAgICAgIHJlc2V0KGluY3JlbWVudCwgc3BhbnMpOworICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoZm0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAod29ya1BhaW50LmJhc2VsaW5lU2hpZnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbS5hc2NlbnQgKz0gd29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbS50b3AgKz0gd29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbS5kZXNjZW50ICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgZm0uYm90dG9tICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICB2b2lkIHJlc2V0KGludCBpbmNyZW1lbnQsIE9iamVjdFtdIHNwYW5zKSB7CisgICAgICAgICAgICB0aGlzLm1JbmNyZW1lbnQgPSBpbmNyZW1lbnQ7CisKKyAgICAgICAgICAgIGludCBucyA9IDA7CisgICAgICAgICAgICBpZiAoc3BhbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludFtdIHN0b3BzID0gdGhpcy5tU3RvcHM7CisgICAgICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IHNwYW5zKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgVGFiU3RvcFNwYW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdG9wcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHMgPSBuZXcgaW50WzEwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnMgPT0gc3RvcHMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gbnN0b3BzID0gbmV3IGludFtucyAqIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc3RvcHNbaV0gPSBzdG9wc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHMgPSBuc3RvcHM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9wc1tucysrXSA9ICgoVGFiU3RvcFNwYW4pIG8pLmdldFRhYlN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwb3MgIT0gbGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChibSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBlbW9qaSwgbXVzdCBoYXZlIGhpdCBhIHRhYgotICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBuZXh0VGFiKHRleHQsIHN0YXJ0LCBlbmQsIHdpZHRoLCB0YWJzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2V0cyB1cCB3b3JrUGFpbnQgd2l0aCB0aGUgZm9udCBvbiB0aGUgZW1vamkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRleHQsIHNvIHRoYXQgd2UgY2FuIGV4dHJhY3QgdGhlIGFzY2VudCBhbmQgc2NhbGUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IHVzZSB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBjYWxsIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZWFzdXJlVGV4dCBiZWNhdXNlIHRoZSBlbW9qaSBtaWdodCBoYXZlIGl0cyBvd24gc3R5bGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGluaXRpYWxpemUgd29ya1BhaW50IGhlcmUgYmVjYXVzZSBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRleHQgaXMgdW5zdHlsZWQgbWVhc3VyZVRleHQgbWlnaHQgbm90IHVzZSB3b3JrUGFpbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IGFsbC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXQocGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBwb3MsIHN0YXJ0ICsgcG9zICsgMSwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoICs9IChmbG9hdCkgYm0uZ2V0V2lkdGgoKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd29ya1BhaW50LmFzY2VudCgpIC8gYm0uZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGhhZCBhbiBlbW9qaSwgd2UgYnVtcCBwYXN0IHRoZSBzZWNvbmQgaGFsZgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHN1cnJvZ2F0ZSBwYWlyLgotICAgICAgICAgICAgICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobnMgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIEFycmF5cy5zb3J0KHN0b3BzLCAwLCBucyk7CiAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGZtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZtLmFzY2VudCA8IGFzY2VudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNjZW50ID0gZm0uYXNjZW50OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmbS5kZXNjZW50ID4gZGVzY2VudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVzY2VudCA9IGZtLmRlc2NlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZm0udG9wIDwgdG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBmbS50b3A7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZtLmJvdHRvbSA+IGJvdHRvbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tID0gZm0uYm90dG9tOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byB0YWtlIGJpdG1hcCBoZWlnaHQgaW50byBhY2NvdW50IGhlcmUsCi0gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIGl0IGlzIHNjYWxlZCB0byBtYXRjaCB0aGUgdGV4dCBoZWlnaHQuCisgICAgICAgICAgICAgICAgaWYgKHN0b3BzICE9IHRoaXMubVN0b3BzKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMubVN0b3BzID0gc3RvcHM7CiAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbGFzdFBvcyA9IHBvcyArIDE7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLm1OdW1TdG9wcyA9IG5zOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGZtICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZtLmFzY2VudCA9IGFzY2VudDsKLSAgICAgICAgICAgIGZtLmRlc2NlbnQgPSBkZXNjZW50OwotICAgICAgICAgICAgZm0udG9wID0gdG9wOwotICAgICAgICAgICAgZm0uYm90dG9tID0gYm90dG9tOworICAgICAgICBmbG9hdCBuZXh0VGFiKGZsb2F0IGgpIHsKKyAgICAgICAgICAgIGludCBucyA9IHRoaXMubU51bVN0b3BzOworICAgICAgICAgICAgaWYgKG5zID4gMCkgeworICAgICAgICAgICAgICAgIGludFtdIHN0b3BzID0gdGhpcy5tU3RvcHM7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzdG9wID0gc3RvcHNbaV07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdG9wID4gaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3A7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV4dERlZmF1bHRTdG9wKGgsIG1JbmNyZW1lbnQpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGhhc1RhYnMpCi0gICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOwotCi0gICAgICAgIHJldHVybiB3aWR0aDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmbG9hdCBuZXh0RGVmYXVsdFN0b3AoZmxvYXQgaCwgaW50IGluYykgeworICAgICAgICAgICAgcmV0dXJuICgoaW50KSAoKGggKyBpbmMpIC8gaW5jKSkgKiBpbmM7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE3NTEsNyArMTUxMyw3IEBACiAKICAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CiAgICAgICAgICAgICBpZiAodGFicyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGFicyA9ICgoU3Bhbm5lZCkgdGV4dCkuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIHRhYnMgPSBnZXRQYXJhZ3JhcGhTcGFucygoU3Bhbm5lZCkgdGV4dCwgc3RhcnQsIGVuZCwgVGFiU3RvcFNwYW4uY2xhc3MpOwogICAgICAgICAgICAgICAgIGFsbHRhYnMgPSB0cnVlOwogICAgICAgICAgICAgfQogCkBAIC0xNzc4LDYgKzE1NDAsMzggQEAKICAgICAgICAgcmV0dXJuIG1TcGFubmVkVGV4dDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzYW1lIGFzIDxjb2RlPnRleHQuZ2V0U3BhbnMoKTwvY29kZT4sIGV4Y2VwdCB3aGVyZQorICAgICAqIDxjb2RlPnN0YXJ0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kPC9jb2RlPiBhcmUgdGhlIHNhbWUgYW5kIGFyZSBub3QKKyAgICAgKiBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgdGhlIHRleHQsIGluIHdoaWNoIGNhc2UgYW4gZW1wdHkgYXJyYXkKKyAgICAgKiBpcyByZXR1cm5lZCBpbnN0ZWFkLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIHNwZWNpYWwgY2FzZSB0aGF0IDxjb2RlPmdldFNwYW5zKCk8L2NvZGU+CisgICAgICogb24gYW4gZW1wdHkgcmFuZ2UgcmV0dXJucyB0aGUgc3BhbnMgYWRqYWNlbnQgdG8gdGhhdCByYW5nZSwgd2hpY2ggaXMKKyAgICAgKiBwcmltYXJpbHkgZm9yIHRoZSBzYWtlIG9mIDxjb2RlPlRleHRXYXRjaGVyczwvY29kZT4gc28gdGhleSB3aWxsIGdldAorICAgICAqIG5vdGlmaWNhdGlvbnMgd2hlbiB0ZXh0IGdvZXMgZnJvbSBlbXB0eSB0byBub24tZW1wdHkuICBCdXQgaXQgYWxzbworICAgICAqIGhhcyB0aGUgdW5mb3J0dW5hdGUgc2lkZSBlZmZlY3QgdGhhdCBpZiB0aGUgdGV4dCBlbmRzIHdpdGggYW4gZW1wdHkKKyAgICAgKiBwYXJhZ3JhcGgsIHRoYXQgcGFyYWdyYXBoIGFjY2lkZW50YWxseSBwaWNrcyB1cCB0aGUgc3R5bGVzIG9mIHRoZQorICAgICAqIHByZWNlZGluZyBwYXJhZ3JhcGggKGV2ZW4gdGhvdWdoIHRob3NlIHN0eWxlcyB3aWxsIG5vdCBiZSBwaWNrZWQgdXAKKyAgICAgKiBieSBuZXcgdGV4dCB0aGF0IGlzIGluc2VydGVkIGludG8gdGhlIGVtcHR5IHBhcmFncmFwaCkuCisgICAgICogPHA+CisgICAgICogVGhlIHJlYXNvbiBpdCBqdXN0IGNoZWNrcyB3aGV0aGVyIDxjb2RlPnN0YXJ0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kPC9jb2RlPgorICAgICAqIGlzIHRoZSBzYW1lIGlzIHRoYXQgdGhlIG9ubHkgdGltZSBhIGxpbmUgY2FuIGNvbnRhaW4gMCBjaGFyYWN0ZXJzCisgICAgICogaXMgaWYgaXQgaXMgdGhlIGZpbmFsIHBhcmFncmFwaCBvZiB0aGUgTGF5b3V0OyBvdGhlcndpc2UgYW55IGxpbmUgd2lsbAorICAgICAqIGNvbnRhaW4gYXQgbGVhc3Qgb25lIHByaW50aW5nIG9yIG5ld2xpbmUgY2hhcmFjdGVyLiAgVGhlIHJlYXNvbiBmb3IgdGhlCisgICAgICogYWRkaXRpb25hbCBjaGVjayBpZiA8Y29kZT5zdGFydDwvY29kZT4gaXMgZ3JlYXRlciB0aGFuIDAgaXMgdGhhdAorICAgICAqIGlmIHRoZSBlbXB0eSBwYXJhZ3JhcGggaXMgdGhlIGVudGlyZSBjb250ZW50IG9mIHRoZSBidWZmZXIsIHBhcmFncmFwaAorICAgICAqIHN0eWxlcyB0aGF0IGFyZSBhbHJlYWR5IGFwcGxpZWQgdG8gdGhlIGJ1ZmZlciB3aWxsIGFwcGx5IHRvIHRleHQgdGhhdAorICAgICAqIGlzIGluc2VydGVkIGludG8gaXQuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgPFQ+IFRbXSBnZXRQYXJhZ3JhcGhTcGFucyhTcGFubmVkIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgQ2xhc3M8VD4gdHlwZSkgeworICAgICAgICBpZiAoc3RhcnQgPT0gZW5kICYmIHN0YXJ0ID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIChUW10pIEFycmF5VXRpbHMuZW1wdHlBcnJheSh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0ZXh0LmdldFNwYW5zKHN0YXJ0LCBlbmQsIHR5cGUpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBlbGxpcHNpemUoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBkZXN0LCBpbnQgZGVzdG9mZikgewogICAgICAgICBpbnQgZWxsaXBzaXNDb3VudCA9IGdldEVsbGlwc2lzQ291bnQobGluZSk7CkBAIC0xODA4LDIzICsxNjAyLDIyIEBACiAKICAgICAvKioKICAgICAgKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgYmlkaXJlY3Rpb25hbCAobGVmdC10by1yaWdodCBvciByaWdodC10by1sZWZ0KQotICAgICAqIHRleHQgd2l0aGluIHRoZSBsYXlvdXQgb2YgYSBsaW5lLiAgVE9ETzogVGhpcyB3b3JrIGlzIG5vdCBjb21wbGV0ZQotICAgICAqIG9yIGNvcnJlY3QgYW5kIHdpbGwgYmUgZmxlc2hlZCBvdXQgaW4gYSBsYXRlciByZXZpc2lvbi4KKyAgICAgKiB0ZXh0IHdpdGhpbiB0aGUgbGF5b3V0IG9mIGEgbGluZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERpcmVjdGlvbnMgewotICAgICAgICBwcml2YXRlIHNob3J0W10gbURpcmVjdGlvbnM7CisgICAgICAgIC8vIERpcmVjdGlvbnMgcmVwcmVzZW50cyBkaXJlY3Rpb25hbCBydW5zIHdpdGhpbiBhIGxpbmUgb2YgdGV4dC4KKyAgICAgICAgLy8gUnVucyBhcmUgcGFpcnMgb2YgaW50cyBsaXN0ZWQgaW4gdmlzdWFsIG9yZGVyLCBzdGFydGluZyBmcm9tIHRoZQorICAgICAgICAvLyBsZWFkaW5nIG1hcmdpbi4gIFRoZSBmaXJzdCBpbnQgb2YgZWFjaCBwYWlyIGlzIHRoZSBvZmZzZXQgZnJvbQorICAgICAgICAvLyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBsaW5lIHRvIHRoZSBzdGFydCBvZiB0aGUgcnVuLiAgVGhlCisgICAgICAgIC8vIHNlY29uZCBpbnQgcmVwcmVzZW50cyBib3RoIHRoZSBsZW5ndGggYW5kIGxldmVsIG9mIHRoZSBydW4uCisgICAgICAgIC8vIFRoZSBsZW5ndGggaXMgaW4gdGhlIGxvd2VyIGJpdHMsIGFjY2Vzc2VkIGJ5IG1hc2tpbmcgd2l0aAorICAgICAgICAvLyBESVJfTEVOR1RIX01BU0suICBUaGUgbGV2ZWwgaXMgaW4gdGhlIGhpZ2hlciBiaXRzLCBhY2Nlc3NlZAorICAgICAgICAvLyBieSBzaGlmdGluZyBieSBESVJfTEVWRUxfU0hJRlQgYW5kIG1hc2tpbmcgYnkgRElSX0xFVkVMX01BU0suCisgICAgICAgIC8vIFRvIHNpbXBseSB0ZXN0IGZvciBhbiBSVEwgZGlyZWN0aW9uLCB0ZXN0IHRoZSBiaXQgdXNpbmcKKyAgICAgICAgLy8gRElSX1JUTF9GTEFHLCBpZiBzZXQgdGhlbiB0aGUgZGlyZWN0aW9uIGlzIHJ0bC4KIAotICAgICAgICAvLyBUaGUgdmFsdWVzIGluIG1EaXJlY3Rpb25zIGFyZSB0aGUgb2Zmc2V0cyBmcm9tIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICAgICAgLy8gaW4gdGhlIGxpbmUgdG8gdGhlIG5leHQgZmxpcCBpbiBkaXJlY3Rpb24uICBSdW5zIGF0IGV2ZW4gaW5kaWNlcwotICAgICAgICAvLyBhcmUgbGVmdC10by1yaWdodCwgdGhlIG90aGVycyBhcmUgcmlnaHQtdG8tbGVmdC4gIFNvLCBmb3IgZXhhbXBsZSwKLSAgICAgICAgLy8gYSBsaW5lIHRoYXQgc3RhcnRzIHdpdGggYSByaWdodC10by1sZWZ0IHJ1biBoYXMgMCBhdCBtRGlyZWN0aW9uc1swXSwKLSAgICAgICAgLy8gc2luY2UgdGhlICdmaXJzdCcgKGx0cikgcnVuIGlzIHplcm8gbGVuZ3RoLgotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgY29kZSBjdXJyZW50bHkgYXNzdW1lcyB0aGF0IGVhY2ggcnVuIGlzIGFkamFjZW50IHRvIHRoZSBwcmV2aW91cwotICAgICAgICAvLyBvbmUsIHByb2dyZXNzaW5nIGluIHRoZSBiYXNlIGxpbmUgZGlyZWN0aW9uLiAgVGhpcyBpc24ndCBzdWZmaWNpZW50Ci0gICAgICAgIC8vIHRvIGhhbmRsZSBuZXN0ZWQgcnVucywgZm9yIGV4YW1wbGUgbnVtZXJpYyB0ZXh0IGluIGFuIHJ0bCBjb250ZXh0Ci0gICAgICAgIC8vIGluIGFuIGx0ciBwYXJhZ3JhcGguCi0gICAgICAgIC8qIHBhY2thZ2UgKi8gRGlyZWN0aW9ucyhzaG9ydFtdIGRpcnMpIHsKKyAgICAgICAgLyogcGFja2FnZSAqLyBpbnRbXSBtRGlyZWN0aW9uczsKKyAgICAgICAgLyogcGFja2FnZSAqLyBEaXJlY3Rpb25zKGludFtdIGRpcnMpIHsKICAgICAgICAgICAgIG1EaXJlY3Rpb25zID0gZGlyczsKICAgICAgICAgfQogICAgIH0KQEAgLTE4MzUsNiArMTYyOCw3IEBACiAgICAgICogbGluZSBpcyBlbGxpcHNpemVkLCBub3QgZ2V0TGluZVN0YXJ0KCkuKQogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RWxsaXBzaXNTdGFydChpbnQgbGluZSk7CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSBlbGxpcHNpemVkIGF3YXksIG9yIDAgaWYKICAgICAgKiBubyBlbGxpcHNpcyBpcyB0byB0YWtlIHBsYWNlLgpAQCAtMTg3NCw3ICsxNjY4LDcgQEAKICAgICAgICAgcHVibGljIGludCBsZW5ndGgoKSB7CiAgICAgICAgICAgICByZXR1cm4gbVRleHQubGVuZ3RoKCk7CiAgICAgICAgIH0KLSAgICAKKwogICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgICAgICAgY2hhcltdIHMgPSBuZXcgY2hhcltlbmQgLSBzdGFydF07CiAgICAgICAgICAgICBnZXRDaGFycyhzdGFydCwgZW5kLCBzLCAwKTsKQEAgLTE5MzUsMTcgKzE3MjksMjIgQEAKICAgICBwcml2YXRlIEFsaWdubWVudCBtQWxpZ25tZW50ID0gQWxpZ25tZW50LkFMSUdOX05PUk1BTDsKICAgICBwcml2YXRlIGZsb2F0IG1TcGFjaW5nTXVsdDsKICAgICBwcml2YXRlIGZsb2F0IG1TcGFjaW5nQWRkOwotICAgIHByaXZhdGUgc3RhdGljIFJlY3Qgc1RlbXBSZWN0ID0gbmV3IFJlY3QoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZWN0IHNUZW1wUmVjdCA9IG5ldyBSZWN0KCk7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1TcGFubmVkVGV4dDsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUl9MRUZUX1RPX1JJR0hUID0gMTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJfUklHSFRfVE9fTEVGVCA9IC0xOwotICAgIAorCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IERJUl9SRVFVRVNUX0xUUiA9IDE7CiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IERJUl9SRVFVRVNUX1JUTCA9IC0xOwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBESVJfUkVRVUVTVF9ERUZBVUxUX0xUUiA9IDI7CiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IERJUl9SRVFVRVNUX0RFRkFVTFRfUlRMID0gLTI7CiAKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUlVOX0xFTkdUSF9NQVNLID0gMHgwM2ZmZmZmZjsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUlVOX0xFVkVMX1NISUZUID0gMjY7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFJVTl9MRVZFTF9NQVNLID0gMHgzZjsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUlVOX1JUTF9GTEFHID0gMSA8PCBSVU5fTEVWRUxfU0hJRlQ7CisKICAgICBwdWJsaWMgZW51bSBBbGlnbm1lbnQgewogICAgICAgICBBTElHTl9OT1JNQUwsCiAgICAgICAgIEFMSUdOX09QUE9TSVRFLApAQCAtMTk1Nyw4ICsxNzU2LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCX0lOQ1JFTUVOVCA9IDIwOwogCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgRGlyZWN0aW9ucyBESVJTX0FMTF9MRUZUX1RPX1JJR0hUID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBzaG9ydFtdIHsgMzI3NjcgfSk7CisgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBpbnRbXSB7IDAsIFJVTl9MRU5HVEhfTUFTSyB9KTsKICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBEaXJlY3Rpb25zIERJUlNfQUxMX1JJR0hUX1RPX0xFRlQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpcmVjdGlvbnMobmV3IHNob3J0W10geyAwLCAzMjc2NyB9KTsKLQorICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgaW50W10geyAwLCBSVU5fTEVOR1RIX01BU0sgfCBSVU5fUlRMX0ZMQUcgfSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L01lYXN1cmVkVGV4dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9NZWFzdXJlZFRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTY5OWYxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9NZWFzdXJlZFRleHQuamF2YQpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXh0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogQGhpZGUKKyAqLworY2xhc3MgTWVhc3VyZWRUZXh0IHsKKyAgICAvKiBwYWNrYWdlICovIENoYXJTZXF1ZW5jZSBtVGV4dDsKKyAgICAvKiBwYWNrYWdlICovIGludCBtVGV4dFN0YXJ0OworICAgIC8qIHBhY2thZ2UgKi8gZmxvYXRbXSBtV2lkdGhzOworICAgIC8qIHBhY2thZ2UgKi8gY2hhcltdIG1DaGFyczsKKyAgICAvKiBwYWNrYWdlICovIGJ5dGVbXSBtTGV2ZWxzOworICAgIC8qIHBhY2thZ2UgKi8gaW50IG1EaXI7CisgICAgLyogcGFja2FnZSAqLyBib29sZWFuIG1FYXN5OworICAgIC8qIHBhY2thZ2UgKi8gaW50IG1MZW47CisgICAgcHJpdmF0ZSBpbnQgbVBvczsKKyAgICBwcml2YXRlIFRleHRQYWludCBtV29ya1BhaW50OworCisgICAgcHJpdmF0ZSBNZWFzdXJlZFRleHQoKSB7CisgICAgICAgIG1Xb3JrUGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWVhc3VyZWRUZXh0W10gY2FjaGVkID0gbmV3IE1lYXN1cmVkVGV4dFszXTsKKworICAgIC8qIHBhY2thZ2UgKi8KKyAgICBzdGF0aWMgTWVhc3VyZWRUZXh0IG9idGFpbigpIHsKKyAgICAgICAgTWVhc3VyZWRUZXh0IG10OworICAgICAgICBzeW5jaHJvbml6ZWQgKGNhY2hlZCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNhY2hlZC5sZW5ndGg7IC0taSA+PSAwOykgeworICAgICAgICAgICAgICAgIGlmIChjYWNoZWRbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtdCA9IGNhY2hlZFtpXTsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVkW2ldID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG10OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtdCA9IG5ldyBNZWFzdXJlZFRleHQoKTsKKyAgICAgICAgTG9nLmUoIk1FQVMiLCAibmV3OiAiICsgbXQpOworICAgICAgICByZXR1cm4gbXQ7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLworICAgIHN0YXRpYyBNZWFzdXJlZFRleHQgcmVjeWNsZShNZWFzdXJlZFRleHQgbXQpIHsKKyAgICAgICAgbXQubVRleHQgPSBudWxsOworICAgICAgICBpZiAobXQubUxlbiA8IDEwMDApIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZChjYWNoZWQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZC5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkW2ldID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZFtpXSA9IG10OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW5hbHl6ZXMgdGV4dCBmb3IgYmlkaXJlY3Rpb25hbCBydW5zLiAgQWxsb2NhdGVzIHdvcmtpbmcgYnVmZmVycy4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovCisgICAgdm9pZCBzZXRQYXJhKENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBiaWRpUmVxdWVzdCkgeworICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgICAgIG1UZXh0U3RhcnQgPSBzdGFydDsKKworICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIG1MZW4gPSBsZW47CisgICAgICAgIG1Qb3MgPSAwOworCisgICAgICAgIGlmIChtV2lkdGhzID09IG51bGwgfHwgbVdpZHRocy5sZW5ndGggPCBsZW4pIHsKKyAgICAgICAgICAgIG1XaWR0aHMgPSBuZXcgZmxvYXRbQXJyYXlVdGlscy5pZGVhbEZsb2F0QXJyYXlTaXplKGxlbildOworICAgICAgICB9CisgICAgICAgIGlmIChtQ2hhcnMgPT0gbnVsbCB8fCBtQ2hhcnMubGVuZ3RoIDwgbGVuKSB7CisgICAgICAgICAgICBtQ2hhcnMgPSBuZXcgY2hhcltBcnJheVV0aWxzLmlkZWFsQ2hhckFycmF5U2l6ZShsZW4pXTsKKyAgICAgICAgfQorICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgbUNoYXJzLCAwKTsKKworICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKKyAgICAgICAgICAgIFNwYW5uZWQgc3Bhbm5lZCA9IChTcGFubmVkKSB0ZXh0OworICAgICAgICAgICAgUmVwbGFjZW1lbnRTcGFuW10gc3BhbnMgPSBzcGFubmVkLmdldFNwYW5zKHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3Bhbi5jbGFzcyk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnRJblBhcmEgPSBzcGFubmVkLmdldFNwYW5TdGFydChzcGFuc1tpXSkgLSBzdGFydDsKKyAgICAgICAgICAgICAgICBpbnQgZW5kSW5QYXJhID0gc3Bhbm5lZC5nZXRTcGFuRW5kKHNwYW5zW2ldKSAtIHN0YXJ0OworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBzdGFydEluUGFyYTsgaiA8IGVuZEluUGFyYTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGFyc1tqXSA9ICdcdUZGRkMnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChUZXh0VXRpbHMuZG9lc05vdE5lZWRCaWRpKG1DaGFycywgMCwgbGVuKSkgeworICAgICAgICAgICAgbURpciA9IExheW91dC5ESVJfTEVGVF9UT19SSUdIVDsKKyAgICAgICAgICAgIG1FYXN5ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtTGV2ZWxzID09IG51bGwgfHwgbUxldmVscy5sZW5ndGggPCBsZW4pIHsKKyAgICAgICAgICAgICAgICBtTGV2ZWxzID0gbmV3IGJ5dGVbQXJyYXlVdGlscy5pZGVhbEJ5dGVBcnJheVNpemUobGVuKV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGlyID0gQW5kcm9pZEJpZGkuYmlkaShiaWRpUmVxdWVzdCwgbUNoYXJzLCBtTGV2ZWxzLCBsZW4sIGZhbHNlKTsKKyAgICAgICAgICAgIG1FYXN5ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCBhZGRTdHlsZVJ1bihUZXh0UGFpbnQgcGFpbnQsIGludCBsZW4sIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtKSB7CisgICAgICAgIGlmIChmbSAhPSBudWxsKSB7CisgICAgICAgICAgICBwYWludC5nZXRGb250TWV0cmljc0ludChmbSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcCA9IG1Qb3M7CisgICAgICAgIG1Qb3MgPSBwICsgbGVuOworCisgICAgICAgIGlmIChtRWFzeSkgeworICAgICAgICAgICAgaW50IGZsYWdzID0gbURpciA9PSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQKKyAgICAgICAgICAgICAgICA/IENhbnZhcy5ESVJFQ1RJT05fTFRSIDogQ2FudmFzLkRJUkVDVElPTl9SVEw7CisgICAgICAgICAgICByZXR1cm4gcGFpbnQuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1DaGFycywgcCwgbGVuLCBwLCBsZW4sIGZsYWdzLCBtV2lkdGhzLCBwKTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IHRvdGFsQWR2YW5jZSA9IDA7CisgICAgICAgIGludCBsZXZlbCA9IG1MZXZlbHNbcF07CisgICAgICAgIGZvciAoaW50IHEgPSBwLCBpID0gcCArIDEsIGUgPSBwICsgbGVuOzsgKytpKSB7CisgICAgICAgICAgICBpZiAoaSA9PSBlIHx8IG1MZXZlbHNbaV0gIT0gbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgPSAobGV2ZWwgJiAweDEpID09IDAgPyBDYW52YXMuRElSRUNUSU9OX0xUUiA6IENhbnZhcy5ESVJFQ1RJT05fUlRMOworICAgICAgICAgICAgICAgIHRvdGFsQWR2YW5jZSArPQorICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1DaGFycywgcSwgaSAtIHEsIHEsIGkgLSBxLCBmbGFncywgbVdpZHRocywgcSk7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gZSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcSA9IGk7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBtTGV2ZWxzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0b3RhbEFkdmFuY2U7CisgICAgfQorCisgICAgZmxvYXQgYWRkU3R5bGVSdW4oVGV4dFBhaW50IHBhaW50LCBNZXRyaWNBZmZlY3RpbmdTcGFuW10gc3BhbnMsIGludCBsZW4sCisgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbSkgeworCisgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQgPSBtV29ya1BhaW50OworICAgICAgICB3b3JrUGFpbnQuc2V0KHBhaW50KTsKKyAgICAgICAgLy8gWFhYIHBhaW50IHNob3VsZCBub3QgaGF2ZSBhIGJhc2VsaW5lIHNoaWZ0LCBidXQuLi4KKyAgICAgICAgd29ya1BhaW50LmJhc2VsaW5lU2hpZnQgPSAwOworCisgICAgICAgIFJlcGxhY2VtZW50U3BhbiByZXBsYWNlbWVudCA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4gc3BhbiA9IHNwYW5zW2ldOworICAgICAgICAgICAgaWYgKHNwYW4gaW5zdGFuY2VvZiBSZXBsYWNlbWVudFNwYW4pIHsKKyAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IChSZXBsYWNlbWVudFNwYW4pc3BhbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3Bhbi51cGRhdGVNZWFzdXJlU3RhdGUod29ya1BhaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IHdpZDsKKyAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHdpZCA9IGFkZFN0eWxlUnVuKHdvcmtQYWludCwgbGVuLCBmbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBVc2Ugb3JpZ2luYWwgdGV4dC4gIFNob3VsZG4ndCBtYXR0ZXIuCisgICAgICAgICAgICB3aWQgPSByZXBsYWNlbWVudC5nZXRTaXplKHdvcmtQYWludCwgbVRleHQsIG1UZXh0U3RhcnQgKyBtUG9zLAorICAgICAgICAgICAgICAgICAgICBtVGV4dFN0YXJ0ICsgbVBvcyArIGxlbiwgZm0pOworICAgICAgICAgICAgZmxvYXRbXSB3ID0gbVdpZHRoczsKKyAgICAgICAgICAgIHdbbVBvc10gPSB3aWQ7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbVBvcyArIDEsIGUgPSBtUG9zICsgbGVuOyBpIDwgZTsgaSsrKQorICAgICAgICAgICAgICAgIHdbaV0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZtICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdCA8IDApIHsKKyAgICAgICAgICAgICAgICBmbS5hc2NlbnQgKz0gd29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7CisgICAgICAgICAgICAgICAgZm0udG9wICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmbS5kZXNjZW50ICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICAgICAgICAgIGZtLmJvdHRvbSArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB3aWQ7CisgICAgfQorCisgICAgaW50IGJyZWFrVGV4dChpbnQgc3RhcnQsIGludCBsaW1pdCwgYm9vbGVhbiBmb3J3YXJkcywgZmxvYXQgd2lkdGgpIHsKKyAgICAgICAgZmxvYXRbXSB3ID0gbVdpZHRoczsKKyAgICAgICAgaWYgKGZvcndhcmRzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBsaW1pdDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKCh3aWR0aCAtPSB3W2ldKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgLSBzdGFydDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbGltaXQ7IC0taSA+PSBzdGFydDspIHsKKyAgICAgICAgICAgICAgICBpZiAoKHdpZHRoIC09IHdbaV0pIDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGltaXQgLSBpIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsaW1pdCAtIHN0YXJ0OworICAgIH0KKworICAgIGZsb2F0IG1lYXN1cmUoaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKKyAgICAgICAgZmxvYXQgd2lkdGggPSAwOworICAgICAgICBmbG9hdFtdIHcgPSBtV2lkdGhzOworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBsaW1pdDsgKytpKSB7CisgICAgICAgICAgICB3aWR0aCArPSB3W2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3aWR0aDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmFibGVTdHJpbmdCdWlsZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uYWJsZVN0cmluZ0J1aWxkZXIuamF2YQppbmRleCBjYWFhZmExLi5mYzAxZWYyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uYWJsZVN0cmluZ0J1aWxkZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uYWJsZVN0cmluZ0J1aWxkZXIuamF2YQpAQCAtMTcsOCArMTcsOSBAQAogcGFja2FnZSBhbmRyb2lkLnRleHQ7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKKwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKIApAQCAtMzEyLDEyICszMTMsMTUgQEAKIAogICAgICAgICBtb3ZlR2FwVG8oZW5kKTsKIAotICAgICAgICBpZiAodGJlbmQgLSB0YnN0YXJ0ID49IG1HYXBMZW5ndGggKyAoZW5kIC0gc3RhcnQpKQotICAgICAgICAgICAgcmVzaXplRm9yKG1UZXh0Lmxlbmd0aCAtIG1HYXBMZW5ndGggKwotICAgICAgICAgICAgICAgICAgICAgIHRiZW5kIC0gdGJzdGFydCAtIChlbmQgLSBzdGFydCkpOworICAgICAgICAvLyBDYW4gYmUgbmVnYXRpdmUKKyAgICAgICAgZmluYWwgaW50IG5iTmV3Q2hhcnMgPSAodGJlbmQgLSB0YnN0YXJ0KSAtIChlbmQgLSBzdGFydCk7CiAKLSAgICAgICAgbUdhcFN0YXJ0ICs9IHRiZW5kIC0gdGJzdGFydCAtIChlbmQgLSBzdGFydCk7Ci0gICAgICAgIG1HYXBMZW5ndGggLT0gdGJlbmQgLSB0YnN0YXJ0IC0gKGVuZCAtIHN0YXJ0KTsKKyAgICAgICAgaWYgKG5iTmV3Q2hhcnMgPj0gbUdhcExlbmd0aCkgeworICAgICAgICAgICAgcmVzaXplRm9yKG1UZXh0Lmxlbmd0aCArIG5iTmV3Q2hhcnMgLSBtR2FwTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1HYXBTdGFydCArPSBuYk5ld0NoYXJzOworICAgICAgICBtR2FwTGVuZ3RoIC09IG5iTmV3Q2hhcnM7CiAKICAgICAgICAgaWYgKG1HYXBMZW5ndGggPCAxKQogICAgICAgICAgICAgbmV3IEV4Y2VwdGlvbigibUdhcExlbmd0aCA8IDEiKS5wcmludFN0YWNrVHJhY2UoKTsKQEAgLTcwNyw2ICs3MTEsNyBAQAogICAgICAqIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgdGhlIGJ1ZmZlci4gIFRoZSBraW5kIG1heSBiZSBPYmplY3QuY2xhc3MgdG8gZ2V0CiAgICAgICogYSBsaXN0IG9mIGFsbCB0aGUgc3BhbnMgcmVnYXJkbGVzcyBvZiB0eXBlLgogICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyA8VD4gVFtdIGdldFNwYW5zKGludCBxdWVyeVN0YXJ0LCBpbnQgcXVlcnlFbmQsIENsYXNzPFQ+IGtpbmQpIHsKICAgICAgICAgaW50IHNwYW5Db3VudCA9IG1TcGFuQ291bnQ7CiAgICAgICAgIE9iamVjdFtdIHNwYW5zID0gbVNwYW5zOwpAQCAtNzE3LDggKzcyMiw4IEBACiAgICAgICAgIGludCBnYXBsZW4gPSBtR2FwTGVuZ3RoOwogCiAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIE9iamVjdFtdIHJldCA9IG51bGw7Ci0gICAgICAgIE9iamVjdCByZXQxID0gbnVsbDsKKyAgICAgICAgVFtdIHJldCA9IG51bGw7CisgICAgICAgIFQgcmV0MSA9IG51bGw7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFuQ291bnQ7IGkrKykgewogICAgICAgICAgICAgaW50IHNwYW5TdGFydCA9IHN0YXJ0c1tpXTsKQEAgLTc1MCwxMSArNzU1LDEzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0MSA9IHNwYW5zW2ldOworICAgICAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiB0aGFua3MgdG8gdGhlIGlzSW5zdGFuY2UgdGVzdCBhYm92ZQorICAgICAgICAgICAgICAgIHJldDEgPSAoVCkgc3BhbnNbaV07CiAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGNvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCBzcGFuQ291bnQgLSBpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiwgYnV0IHJlcXVpcmVzIGEgc3VwcHJlc3NXYXJuaW5nCisgICAgICAgICAgICAgICAgICAgIHJldCA9IChUW10pIEFycmF5Lm5ld0luc3RhbmNlKGtpbmQsIHNwYW5Db3VudCAtIGkgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgcmV0WzBdID0gcmV0MTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTc3MSwyOSArNzc4LDMzIEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJldCwgaiwgcmV0LCBqICsgMSwgY291bnQgLSBqKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0W2pdID0gc3BhbnNbaV07CisgICAgICAgICAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiB0aGFua3MgdG8gdGhlIGlzSW5zdGFuY2UgdGVzdCBhYm92ZQorICAgICAgICAgICAgICAgICAgICByZXRbal0gPSAoVCkgc3BhbnNbaV07CiAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0W2NvdW50KytdID0gc3BhbnNbaV07CisgICAgICAgICAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiB0aGFua3MgdG8gdGhlIGlzSW5zdGFuY2UgdGVzdCBhYm92ZQorICAgICAgICAgICAgICAgICAgICByZXRbY291bnQrK10gPSAoVCkgc3BhbnNbaV07CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAoVFtdKSBBcnJheVV0aWxzLmVtcHR5QXJyYXkoa2luZCk7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlVdGlscy5lbXB0eUFycmF5KGtpbmQpOwogICAgICAgICB9CiAgICAgICAgIGlmIChjb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICByZXQgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGtpbmQsIDEpOworICAgICAgICAgICAgLy8gU2FmZSBjb252ZXJzaW9uLCBidXQgcmVxdWlyZXMgYSBzdXBwcmVzc1dhcm5pbmcKKyAgICAgICAgICAgIHJldCA9IChUW10pIEFycmF5Lm5ld0luc3RhbmNlKGtpbmQsIDEpOwogICAgICAgICAgICAgcmV0WzBdID0gcmV0MTsKLSAgICAgICAgICAgIHJldHVybiAoVFtdKSByZXQ7CisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAgICAgICAgIGlmIChjb3VudCA9PSByZXQubGVuZ3RoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFRbXSkgcmV0OworICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogCi0gICAgICAgIE9iamVjdFtdIG5yZXQgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGtpbmQsIGNvdW50KTsKKyAgICAgICAgLy8gU2FmZSBjb252ZXJzaW9uLCBidXQgcmVxdWlyZXMgYSBzdXBwcmVzc1dhcm5pbmcKKyAgICAgICAgVFtdIG5yZXQgPSAoVFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCBjb3VudCk7CiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmV0LCAwLCBucmV0LCAwLCBjb3VudCk7Ci0gICAgICAgIHJldHVybiAoVFtdKSBucmV0OworICAgICAgICByZXR1cm4gbnJldDsKICAgICB9CiAKICAgICAvKioKQEAgLTg2Miw2ICs4NzMsNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybiBhIFN0cmluZyBjb250YWluaW5nIGEgY29weSBvZiB0aGUgY2hhcnMgaW4gdGhpcyBidWZmZXIuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgaW50IGxlbiA9IGxlbmd0aCgpOwogICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbbGVuXTsKQEAgLTk1Miw2ICs5NjQsNyBAQAogICAgICAgICB9CiAgICAgfQogCisvKgogICAgIHByaXZhdGUgYm9vbGVhbiBpc3ByaW50KGNoYXIgYykgeyAvLyBYWFgKICAgICAgICAgaWYgKGMgPj0gJyAnICYmIGMgPD0gJ34nKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC05NTksNyArOTcyLDYgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLS8qCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHN0YXJ0RmxhZyhpbnQgZmxhZykgewogICAgICAgICByZXR1cm4gKGZsYWcgPj4gNCkgJiAweDBGOwogICAgIH0KQEAgLTEwNTQsNyArMTA2NiwzMiBAQAogICAgICAgICB9CiAgICAgfQogCisKICAgICAvKioKKyAgICAgKiBEb24ndCBjYWxsIHRoaXMgeW91cnNlbGYgLS0gZXhpc3RzIGZvciBDYW52YXMgdG8gdXNlIGludGVybmFsbHkuCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0UnVuKENhbnZhcyBjLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgUGFpbnQgcCkgeworICAgICAgICBjaGVja1JhbmdlKCJkcmF3VGV4dFJ1biIsIHN0YXJ0LCBlbmQpOworCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICBpZiAoY29udGV4dEVuZCA8PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4obVRleHQsIHN0YXJ0LCBsZW4sIGNvbnRleHRTdGFydCwgY29udGV4dExlbiwgeCwgeSwgZmxhZ3MsIHApOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRTdGFydCA+PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4obVRleHQsIHN0YXJ0ICsgbUdhcExlbmd0aCwgbGVuLCBjb250ZXh0U3RhcnQgKyBtR2FwTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0TGVuLCB4LCB5LCBmbGFncywgcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gVGV4dFV0aWxzLm9idGFpbihjb250ZXh0TGVuKTsKKyAgICAgICAgICAgIGdldENoYXJzKGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYnVmLCAwKTsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4oYnVmLCBzdGFydCAtIGNvbnRleHRTdGFydCwgbGVuLCAwLCBjb250ZXh0TGVuLCB4LCB5LCBmbGFncywgcCk7CisgICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOworICAgICAgICB9CisgICAgfQorCisgICAvKioKICAgICAgKiBEb24ndCBjYWxsIHRoaXMgeW91cnNlbGYgLS0gZXhpc3RzIGZvciBQYWludCB0byB1c2UgaW50ZXJuYWxseS4KICAgICAgKiB7QGhpZGV9CiAgICAgICovCkBAIC0xMTAzLDYgKzExNDAsNTggQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBEb24ndCBjYWxsIHRoaXMgeW91cnNlbGYgLS0gZXhpc3RzIGZvciBQYWludCB0byB1c2UgaW50ZXJuYWxseS4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsCisgICAgICAgICAgICBmbG9hdFtdIGFkdmFuY2VzLCBpbnQgYWR2YW5jZXNQb3MsIFBhaW50IHApIHsKKworICAgICAgICBmbG9hdCByZXQ7CisKKyAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisKKyAgICAgICAgaWYgKGVuZCA8PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1UZXh0LCBzdGFydCwgbGVuLCBjb250ZXh0U3RhcnQsIGNvbnRleHRMZW4sCisgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNQb3MpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0ID49IG1HYXBTdGFydCkgeworICAgICAgICAgICAgcmV0ID0gcC5nZXRUZXh0UnVuQWR2YW5jZXMobVRleHQsIHN0YXJ0ICsgbUdhcExlbmd0aCwgbGVuLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQgKyBtR2FwTGVuZ3RoLCBjb250ZXh0TGVuLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzUG9zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBUZXh0VXRpbHMub2J0YWluKGNvbnRleHRMZW4pOworICAgICAgICAgICAgZ2V0Q2hhcnMoY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOworICAgICAgICAgICAgcmV0ID0gcC5nZXRUZXh0UnVuQWR2YW5jZXMoYnVmLCBzdGFydCAtIGNvbnRleHRTdGFydCwgbGVuLAorICAgICAgICAgICAgICAgICAgICAwLCBjb250ZXh0TGVuLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzUG9zKTsKKyAgICAgICAgICAgIFRleHRVdGlscy5yZWN5Y2xlKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VGV4dFJ1bkN1cnNvcihpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgaW50IGN1cnNvck9wdCwgUGFpbnQgcCkgeworCisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICBpZiAoY29udGV4dEVuZCA8PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkN1cnNvcihtVGV4dCwgY29udGV4dFN0YXJ0LCBjb250ZXh0TGVuLAorICAgICAgICAgICAgICAgICAgICBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRTdGFydCA+PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkN1cnNvcihtVGV4dCwgY29udGV4dFN0YXJ0ICsgbUdhcExlbmd0aCwgY29udGV4dExlbiwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZnNldCArIG1HYXBMZW5ndGgsIGN1cnNvck9wdCkgLSBtR2FwTGVuZ3RoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgICAgICBnZXRDaGFycyhjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGJ1ZiwgMCk7CisgICAgICAgICAgICByZXQgPSBwLmdldFRleHRSdW5DdXJzb3IoYnVmLCAwLCBjb250ZXh0TGVuLAorICAgICAgICAgICAgICAgICAgICBmbGFncywgb2Zmc2V0IC0gY29udGV4dFN0YXJ0LCBjdXJzb3JPcHQpICsgY29udGV4dFN0YXJ0OworICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCiAgICAgLy8gRG9jdW1lbnRhdGlvbiBmcm9tIGludGVyZmFjZQogICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcnMoSW5wdXRGaWx0ZXJbXSBmaWx0ZXJzKSB7CiAgICAgICAgIGlmIChmaWx0ZXJzID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmVkLmphdmEKaW5kZXggMTU0NDk3ZC4uZDE0ZmNiYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmVkLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmVkLmphdmEKQEAgLTkxLDcgKzkxLDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUgPSBTUEFOX1BPSU5UX01BUks7CiAKICAgICAvKioKLSAgICAgKiBOb24tMC1sZW5ndGggc3BhbnMgb2YgdHlwZSBTUEFOX0lOQ0xVU0lWRV9FWENMVVNJVkUgZXhwYW5kCisgICAgICogTm9uLTAtbGVuZ3RoIHNwYW5zIG9mIHR5cGUgU1BBTl9FWENMVVNJVkVfSU5DTFVTSVZFIGV4cGFuZAogICAgICAqIHRvIGluY2x1ZGUgdGV4dCBpbnNlcnRlZCBhdCB0aGVpciBlbmRpbmcgcG9pbnQgYnV0IG5vdCBhdCB0aGVpcgogICAgICAqIHN0YXJ0aW5nIHBvaW50LiAgV2hlbiAwLWxlbmd0aCwgdGhleSBiZWhhdmUgbGlrZSBwb2ludHMuCiAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGQwZDI0ODIuLmNjOTY5Y2IKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dC5qYXZhCkBAIC0xNiwxNCArMTYsMTUgQEAKIAogcGFja2FnZSBhbmRyb2lkLnRleHQ7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7CisKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MZWFkaW5nTWFyZ2luU3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGluZUhlaWdodFNwYW47CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLk1ldHJpY0FmZmVjdGluZ1NwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlJlcGxhY2VtZW50U3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVGFiU3RvcFNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkxlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMjsKIAogLyoqCiAgKiBTdGF0aWNMYXlvdXQgaXMgYSBMYXlvdXQgZm9yIHRleHQgdGhhdCB3aWxsIG5vdCBiZSBlZGl0ZWQgYWZ0ZXIgaXQKQEAgLTMxLDggKzMyLDkgQEAKICAqIDxwPlRoaXMgaXMgdXNlZCBieSB3aWRnZXRzIHRvIGNvbnRyb2wgdGV4dCBsYXlvdXQuIFlvdSBzaG91bGQgbm90IG5lZWQKICAqIHRvIHVzZSB0aGlzIGNsYXNzIGRpcmVjdGx5IHVubGVzcyB5b3UgYXJlIGltcGxlbWVudGluZyB5b3VyIG93biB3aWRnZXQKICAqIG9yIGN1c3RvbSBkaXNwbGF5IG9iamVjdCwgb3Igd291bGQgYmUgdGVtcHRlZCB0byBjYWxsCi0gKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjZHJhd1RleHQoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSwgaW50LCBpbnQsIGZsb2F0LCBmbG9hdCwgYW5kcm9pZC5ncmFwaGljcy5QYWludCkKLSAqICBDYW52YXMuZHJhd1RleHQoKX0gZGlyZWN0bHkuPC9wPgorICoge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzI2RyYXdUZXh0KGphdmEubGFuZy5DaGFyU2VxdWVuY2UsIGludCwgaW50LAorICogZmxvYXQsIGZsb2F0LCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50KQorICogQ2FudmFzLmRyYXdUZXh0KCl9IGRpcmVjdGx5LjwvcD4KICAqLwogcHVibGljIGNsYXNzCiBTdGF0aWNMYXlvdXQKQEAgLTYyLDcgKzY0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZXBhZCwKICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5UcnVuY2F0ZUF0IGVsbGlwc2l6ZSwgaW50IGVsbGlwc2l6ZWRXaWR0aCkgewogICAgICAgICBzdXBlcigoZWxsaXBzaXplID09IG51bGwpCi0gICAgICAgICAgICAgICAgPyBzb3VyY2UgCisgICAgICAgICAgICAgICAgPyBzb3VyY2UKICAgICAgICAgICAgICAgICA6IChzb3VyY2UgaW5zdGFuY2VvZiBTcGFubmVkKQogICAgICAgICAgICAgICAgICAgICA/IG5ldyBTcGFubmVkRWxsaXBzaXplcihzb3VyY2UpCiAgICAgICAgICAgICAgICAgICAgIDogbmV3IEVsbGlwc2l6ZXIoc291cmNlKSwKQEAgLTcyLDcgKzc0LDcgQEAKICAgICAgICAgICogVGhpcyBpcyBhbm5veWluZywgYnV0IHdlIGNhbid0IHJlZmVyIHRvIHRoZSBsYXlvdXQgdW50aWwKICAgICAgICAgICogc3VwZXJjbGFzcyBjb25zdHJ1Y3Rpb24gaXMgZmluaXNoZWQsIGFuZCB0aGUgc3VwZXJjbGFzcwogICAgICAgICAgKiBjb25zdHJ1Y3RvciB3YW50cyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBkaXNwbGF5IHRleHQuCi0gICAgICAgICAqIAorICAgICAgICAgKgogICAgICAgICAgKiBUaGlzIHdpbGwgYnJlYWsgaWYgdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IgZXZlciBhY3R1YWxseQogICAgICAgICAgKiBjYXJlcyBhYm91dCB0aGUgY29udGVudCBpbnN0ZWFkIG9mIGp1c3QgaG9sZGluZyB0aGUgcmVmZXJlbmNlLgogICAgICAgICAgKi8KQEAgLTk0LDEzICs5NiwxMyBAQAogICAgICAgICBtTGluZURpcmVjdGlvbnMgPSBuZXcgRGlyZWN0aW9uc1sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlVdGlscy5pZGVhbEludEFycmF5U2l6ZSgyICogbUNvbHVtbnMpXTsKIAorICAgICAgICBtTWVhc3VyZWQgPSBNZWFzdXJlZFRleHQub2J0YWluKCk7CisKICAgICAgICAgZ2VuZXJhdGUoc291cmNlLCBidWZzdGFydCwgYnVmZW5kLCBwYWludCwgb3V0ZXJ3aWR0aCwgYWxpZ24sCiAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBpbmNsdWRlcGFkLCBpbmNsdWRlcGFkLAogICAgICAgICAgICAgICAgICBlbGxpcHNpemUgIT0gbnVsbCwgZWxsaXBzaXplZFdpZHRoLCBlbGxpcHNpemUpOwogCi0gICAgICAgIG1DaGRpcnMgPSBudWxsOwotICAgICAgICBtQ2hzID0gbnVsbDsKLSAgICAgICAgbVdpZHRocyA9IG51bGw7CisgICAgICAgIG1NZWFzdXJlZCA9IE1lYXN1cmVkVGV4dC5yZWN5Y2xlKG1NZWFzdXJlZCk7CiAgICAgICAgIG1Gb250TWV0cmljc0ludCA9IG51bGw7CiAgICAgfQogCkBAIC0xMTEsNiArMTEzLDcgQEAKICAgICAgICAgbUxpbmVzID0gbmV3IGludFtBcnJheVV0aWxzLmlkZWFsSW50QXJyYXlTaXplKDIgKiBtQ29sdW1ucyldOwogICAgICAgICBtTGluZURpcmVjdGlvbnMgPSBuZXcgRGlyZWN0aW9uc1sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlVdGlscy5pZGVhbEludEFycmF5U2l6ZSgyICogbUNvbHVtbnMpXTsKKyAgICAgICAgbU1lYXN1cmVkID0gTWVhc3VyZWRUZXh0Lm9idGFpbigpOwogICAgIH0KIAogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBnZW5lcmF0ZShDaGFyU2VxdWVuY2Ugc291cmNlLCBpbnQgYnVmc3RhcnQsIGludCBidWZlbmQsCkBAIC0xMjgsNTkgKzEzMSw1MCBAQAogICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbSA9IG1Gb250TWV0cmljc0ludDsKICAgICAgICAgaW50W10gY2hvb3NlaHR2ID0gbnVsbDsKIAotICAgICAgICBpbnQgZW5kID0gVGV4dFV0aWxzLmluZGV4T2Yoc291cmNlLCAnXG4nLCBidWZzdGFydCwgYnVmZW5kKTsKLSAgICAgICAgaW50IGJ1ZnNpeiA9IGVuZCA+PSAwID8gZW5kIC0gYnVmc3RhcnQgOiBidWZlbmQgLSBidWZzdGFydDsKLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICAgIE1lYXN1cmVkVGV4dCBtZWFzdXJlZCA9IG1NZWFzdXJlZDsKIAotICAgICAgICBpZiAobUNoZGlycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2hkaXJzID0gbmV3IGJ5dGVbQXJyYXlVdGlscy5pZGVhbEJ5dGVBcnJheVNpemUoYnVmc2l6ICsgMSldOwotICAgICAgICAgICAgbUNocyA9IG5ldyBjaGFyW0FycmF5VXRpbHMuaWRlYWxDaGFyQXJyYXlTaXplKGJ1ZnNpeiArIDEpXTsKLSAgICAgICAgICAgIG1XaWR0aHMgPSBuZXcgZmxvYXRbQXJyYXlVdGlscy5pZGVhbEludEFycmF5U2l6ZSgoYnVmc2l6ICsgMSkgKiAyKV07Ci0gICAgICAgIH0KLQotICAgICAgICBieXRlW10gY2hkaXJzID0gbUNoZGlyczsKLSAgICAgICAgY2hhcltdIGNocyA9IG1DaHM7Ci0gICAgICAgIGZsb2F0W10gd2lkdGhzID0gbVdpZHRoczsKLQotICAgICAgICBBbHRlcmVkQ2hhclNlcXVlbmNlIGFsdGVyID0gbnVsbDsKICAgICAgICAgU3Bhbm5lZCBzcGFubmVkID0gbnVsbDsKLQogICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgU3Bhbm5lZCkKICAgICAgICAgICAgIHNwYW5uZWQgPSAoU3Bhbm5lZCkgc291cmNlOwogCiAgICAgICAgIGludCBERUZBVUxUX0RJUiA9IERJUl9MRUZUX1RPX1JJR0hUOyAvLyBYWFgKIAotICAgICAgICBmb3IgKGludCBzdGFydCA9IGJ1ZnN0YXJ0OyBzdGFydCA8PSBidWZlbmQ7IHN0YXJ0ID0gZW5kKSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgaW50IHBhcmFFbmQ7CisgICAgICAgIGZvciAoaW50IHBhcmFTdGFydCA9IGJ1ZnN0YXJ0OyBwYXJhU3RhcnQgPD0gYnVmZW5kOyBwYXJhU3RhcnQgPSBwYXJhRW5kKSB7CisgICAgICAgICAgICBwYXJhRW5kID0gVGV4dFV0aWxzLmluZGV4T2Yoc291cmNlLCAnXG4nLCBwYXJhU3RhcnQsIGJ1ZmVuZCk7CisgICAgICAgICAgICBpZiAocGFyYUVuZCA8IDApCisgICAgICAgICAgICAgICAgcGFyYUVuZCA9IGJ1ZmVuZDsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlbmQgPSBUZXh0VXRpbHMuaW5kZXhPZihzb3VyY2UsICdcbicsIHN0YXJ0LCBidWZlbmQpOworICAgICAgICAgICAgICAgIHBhcmFFbmQrKzsKKyAgICAgICAgICAgIGludCBwYXJhTGVuID0gcGFyYUVuZCAtIHBhcmFTdGFydDsKIAotICAgICAgICAgICAgaWYgKGVuZCA8IDApCi0gICAgICAgICAgICAgICAgZW5kID0gYnVmZW5kOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVuZCsrOwotCi0gICAgICAgICAgICBpbnQgZmlyc3RXaWR0aExpbmVDb3VudCA9IDE7CisgICAgICAgICAgICBpbnQgZmlyc3RXaWR0aExpbmVMaW1pdCA9IG1MaW5lQ291bnQgKyAxOwogICAgICAgICAgICAgaW50IGZpcnN0d2lkdGggPSBvdXRlcndpZHRoOwogICAgICAgICAgICAgaW50IHJlc3R3aWR0aCA9IG91dGVyd2lkdGg7CiAKICAgICAgICAgICAgIExpbmVIZWlnaHRTcGFuW10gY2hvb3NlaHQgPSBudWxsOwogCiAgICAgICAgICAgICBpZiAoc3Bhbm5lZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW5bXSBzcDsKLQotICAgICAgICAgICAgICAgIHNwID0gc3Bhbm5lZC5nZXRTcGFucyhzdGFydCwgZW5kLCBMZWFkaW5nTWFyZ2luU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW5bXSBzcCA9IGdldFBhcmFncmFwaFNwYW5zKHNwYW5uZWQsIHBhcmFTdGFydCwgcGFyYUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuLmNsYXNzKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuIGxtcyA9IHNwW2ldOwogICAgICAgICAgICAgICAgICAgICBmaXJzdHdpZHRoIC09IHNwW2ldLmdldExlYWRpbmdNYXJnaW4odHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIHJlc3R3aWR0aCAtPSBzcFtpXS5nZXRMZWFkaW5nTWFyZ2luKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxtcyBpbnN0YW5jZW9mIExlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMikgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RXaWR0aExpbmVDb3VudCA9ICgoTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yKWxtcykuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLy8gTGVhZGluZ01hcmdpblNwYW4yIGlzIG9kZC4gIFRoZSBjb3VudCBhZmZlY3RzIGFsbAorICAgICAgICAgICAgICAgICAgICAvLyBsZWFkaW5nIG1hcmdpbiBzcGFucywgbm90IGp1c3QgdGhpcyBwYXJ0aWN1bGFyIG9uZSwKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHN0YXJ0IGZyb20gdGhlIHRvcCBvZiB0aGUgc3Bhbiwgbm90IHRoZSB0b3Agb2YgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFncmFwaC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxtcyBpbnN0YW5jZW9mIExlYWRpbmdNYXJnaW5TcGFuMikgeworICAgICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4yIGxtczIgPSAoTGVhZGluZ01hcmdpblNwYW4yKSBsbXM7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG1zRmlyc3RMaW5lID0gZ2V0TGluZUZvck9mZnNldChzcGFubmVkLmdldFNwYW5TdGFydChsbXMyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFdpZHRoTGluZUxpbWl0ID0gbG1zRmlyc3RMaW5lICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG1zMi5nZXRMZWFkaW5nTWFyZ2luTGluZUNvdW50KCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjaG9vc2VodCA9IHNwYW5uZWQuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgTGluZUhlaWdodFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIGNob29zZWh0ID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3Bhbm5lZCwgcGFyYVN0YXJ0LCBwYXJhRW5kLCBMaW5lSGVpZ2h0U3Bhbi5jbGFzcyk7CiAKICAgICAgICAgICAgICAgICBpZiAoY2hvb3NlaHQubGVuZ3RoICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNob29zZWh0diA9PSBudWxsIHx8CkBAIC0xOTIsMTEgKzE4NiwxMSBAQAogICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNob29zZWh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbyA9IHNwYW5uZWQuZ2V0U3BhblN0YXJ0KGNob29zZWh0W2ldKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPCBzdGFydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPCBwYXJhU3RhcnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydHMgaW4gdGhpcyBsYXlvdXQsIGJlZm9yZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHBhcmFncmFwaAogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2W2ldID0gZ2V0TGluZVRvcChnZXRMaW5lRm9yT2Zmc2V0KG8pKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2W2ldID0gZ2V0TGluZVRvcChnZXRMaW5lRm9yT2Zmc2V0KG8pKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRzIGluIHRoaXMgcGFyYWdyYXBoCiAKQEAgLTIwNiwxNjYgKzIwMCw4NyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGVuZCAtIHN0YXJ0ID4gY2hkaXJzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIGNoZGlycyA9IG5ldyBieXRlW0FycmF5VXRpbHMuaWRlYWxCeXRlQXJyYXlTaXplKGVuZCAtIHN0YXJ0KV07Ci0gICAgICAgICAgICAgICAgbUNoZGlycyA9IGNoZGlyczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbmQgLSBzdGFydCA+IGNocy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBjaHMgPSBuZXcgY2hhcltBcnJheVV0aWxzLmlkZWFsQ2hhckFycmF5U2l6ZShlbmQgLSBzdGFydCldOwotICAgICAgICAgICAgICAgIG1DaHMgPSBjaHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGVuZCAtIHN0YXJ0KSAqIDIgPiB3aWR0aHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGhzID0gbmV3IGZsb2F0W0FycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUoKGVuZCAtIHN0YXJ0KSAqIDIpXTsKLSAgICAgICAgICAgICAgICBtV2lkdGhzID0gd2lkdGhzOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVhc3VyZWQuc2V0UGFyYShzb3VyY2UsIHBhcmFTdGFydCwgcGFyYUVuZCwgRElSX1JFUVVFU1RfREVGQVVMVF9MVFIpOworICAgICAgICAgICAgY2hhcltdIGNocyA9IG1lYXN1cmVkLm1DaGFyczsKKyAgICAgICAgICAgIGZsb2F0W10gd2lkdGhzID0gbWVhc3VyZWQubVdpZHRoczsKKyAgICAgICAgICAgIGJ5dGVbXSBjaGRpcnMgPSBtZWFzdXJlZC5tTGV2ZWxzOworICAgICAgICAgICAgaW50IGRpciA9IG1lYXN1cmVkLm1EaXI7CisgICAgICAgICAgICBib29sZWFuIGVhc3kgPSBtZWFzdXJlZC5tRWFzeTsKIAotICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHNvdXJjZSwgc3RhcnQsIGVuZCwgY2hzLCAwKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBuID0gZW5kIC0gc3RhcnQ7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gZWFzeSA9IHRydWU7Ci0gICAgICAgICAgICBib29sZWFuIGFsdGVyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGludCBkaXIgPSBERUZBVUxUX0RJUjsgLy8gWFhYCi0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoc1tpXSA+PSBGSVJTVF9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVhc3kgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBub25lIG9mIHRoZSB1bmRlcmx5aW5nIGNoYXJhY3RlcnMgYXJlIHRyZWF0ZWQKLSAgICAgICAgICAgIC8vIGFzIHZpYWJsZSBicmVha3BvaW50cywgYW5kIHRoYXQgdGhlIGVudGlyZSBydW4gZ2V0cyB0aGUKLSAgICAgICAgICAgIC8vIHNhbWUgYmlkaSBkaXJlY3Rpb24uCi0KLSAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBTcGFubmVkKSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBzb3VyY2U7Ci0gICAgICAgICAgICAgICAgUmVwbGFjZW1lbnRTcGFuW10gc3BhbnMgPSBzcC5nZXRTcGFucyhzdGFydCwgZW5kLCBSZXBsYWNlbWVudFNwYW4uY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBzcGFucy5sZW5ndGg7IHkrKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgYSA9IHNwLmdldFNwYW5TdGFydChzcGFuc1t5XSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBiID0gc3AuZ2V0U3BhbkVuZChzcGFuc1t5XSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IGE7IHggPCBiOyB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoc1t4IC0gc3RhcnRdID0gJ1x1RkZGQyc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZWFzeSkgewotICAgICAgICAgICAgICAgIC8vIFhYWCBwdXQgb3ZlcnJpZGUgZmxhZ3MsIGV0Yy4gaW50byBjaGRpcnMKLSAgICAgICAgICAgICAgICBkaXIgPSBiaWRpKGRpciwgY2hzLCBjaGRpcnMsIG4sIGZhbHNlKTsKLQotICAgICAgICAgICAgICAgIC8vIERvIG1pcnJvcmluZyBmb3IgcmlnaHQtdG8tbGVmdCBzZWdtZW50cwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoZGlyc1tpXSA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGo7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGk7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hkaXJzW2pdICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFuZHJvaWRDaGFyYWN0ZXIubWlycm9yKGNocywgaSwgaiAtIGkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyZWQgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpID0gaiAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBzdWI7Ci0KLSAgICAgICAgICAgIGlmIChhbHRlcmVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFsdGVyID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGFsdGVyID0gQWx0ZXJlZENoYXJTZXF1ZW5jZS5tYWtlKHNvdXJjZSwgY2hzLCBzdGFydCwgZW5kKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGFsdGVyLnVwZGF0ZShjaHMsIHN0YXJ0LCBlbmQpOwotCi0gICAgICAgICAgICAgICAgc3ViID0gYWx0ZXI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN1YiA9IHNvdXJjZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBzdWIgPSBzb3VyY2U7CiAKICAgICAgICAgICAgIGludCB3aWR0aCA9IGZpcnN0d2lkdGg7CiAKICAgICAgICAgICAgIGZsb2F0IHcgPSAwOwotICAgICAgICAgICAgaW50IGhlcmUgPSBzdGFydDsKKyAgICAgICAgICAgIGludCBoZXJlID0gcGFyYVN0YXJ0OwogCi0gICAgICAgICAgICBpbnQgb2sgPSBzdGFydDsKKyAgICAgICAgICAgIGludCBvayA9IHBhcmFTdGFydDsKICAgICAgICAgICAgIGZsb2F0IG9rd2lkdGggPSB3OwogICAgICAgICAgICAgaW50IG9rYXNjZW50ID0gMCwgb2tkZXNjZW50ID0gMCwgb2t0b3AgPSAwLCBva2JvdHRvbSA9IDA7CiAKLSAgICAgICAgICAgIGludCBmaXQgPSBzdGFydDsKKyAgICAgICAgICAgIGludCBmaXQgPSBwYXJhU3RhcnQ7CiAgICAgICAgICAgICBmbG9hdCBmaXR3aWR0aCA9IHc7CiAgICAgICAgICAgICBpbnQgZml0YXNjZW50ID0gMCwgZml0ZGVzY2VudCA9IDAsIGZpdHRvcCA9IDAsIGZpdGJvdHRvbSA9IDA7CiAKLSAgICAgICAgICAgIGJvb2xlYW4gdGFiID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGhhc1RhYk9yRW1vamkgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFiID0gZmFsc2U7CisgICAgICAgICAgICBUYWJTdG9wcyB0YWJTdG9wcyA9IG51bGw7CiAKLSAgICAgICAgICAgIGludCBuZXh0OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpID0gbmV4dCkgewotICAgICAgICAgICAgICAgIGlmIChzcGFubmVkID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIG5leHQgPSBlbmQ7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBuZXh0ID0gc3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24oaSwgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3Bhbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzKTsKKyAgICAgICAgICAgIGZvciAoaW50IHNwYW5TdGFydCA9IHBhcmFTdGFydCwgc3BhbkVuZCA9IHNwYW5TdGFydCwgbmV4dFNwYW5TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgc3BhblN0YXJ0IDwgcGFyYUVuZDsgc3BhblN0YXJ0ID0gbmV4dFNwYW5TdGFydCkgewogCi0gICAgICAgICAgICAgICAgaWYgKHNwYW5uZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYWN0dWFsTnVtID0gcGFpbnQuZ2V0VGV4dFdpZHRocyhzdWIsIGksIG5leHQsIHdpZHRocyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0IC0gaSA+IGFjdHVhbE51bSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdFRleHRXaWR0aHMod2lkdGhzLCBzdWIsIGksIG5leHQsIGFjdHVhbE51bSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkod2lkdGhzLCAwLCB3aWR0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kIC0gc3RhcnQgKyAoaSAtIHN0YXJ0KSwgbmV4dCAtIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBwYWludC5nZXRGb250TWV0cmljc0ludChmbSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVdvcmtQYWludC5iYXNlbGluZVNoaWZ0ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoc3BhblN0YXJ0ID09IHNwYW5FbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5uZWQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5FbmQgPSBwYXJhRW5kOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzcGFuRW5kID0gc3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24oc3BhblN0YXJ0LCBwYXJhRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYWN0dWFsTnVtID0gU3R5bGVkLmdldFRleHRXaWR0aHMocGFpbnQsIG1Xb3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbm5lZCwgaSwgbmV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMsIGZtKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgLSBpID4gYWN0dWFsTnVtKQotICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0VGV4dFdpZHRocyh3aWR0aHMsIHNwYW5uZWQsIGksIG5leHQsIGFjdHVhbE51bSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkod2lkdGhzLCAwLCB3aWR0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kIC0gc3RhcnQgKyAoaSAtIHN0YXJ0KSwgbmV4dCAtIGkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtV29ya1BhaW50LmJhc2VsaW5lU2hpZnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbS5hc2NlbnQgKz0gbVdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgZm0udG9wICs9IG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5MZW4gPSBzcGFuRW5kIC0gc3BhblN0YXJ0OworICAgICAgICAgICAgICAgICAgICBpZiAoc3Bhbm5lZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZC5hZGRTdHlsZVJ1bihwYWludCwgc3BhbkxlbiwgZm0pOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZm0uZGVzY2VudCArPSBtV29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbS5ib3R0b20gKz0gbVdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFubmVkLmdldFNwYW5zKHNwYW5TdGFydCwgc3BhbkVuZCwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZC5hZGRTdHlsZVJ1bihwYWludCwgc3BhbnMsIHNwYW5MZW4sIGZtKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIG5leHRTcGFuU3RhcnQgPSBzcGFuRW5kOworICAgICAgICAgICAgICAgIGludCBzdGFydEluUGFyYSA9IHNwYW5TdGFydCAtIHBhcmFTdGFydDsKKyAgICAgICAgICAgICAgICBpbnQgZW5kSW5QYXJhID0gc3BhbkVuZCAtIHBhcmFTdGFydDsKKwogICAgICAgICAgICAgICAgIGludCBmbXRvcCA9IGZtLnRvcDsKICAgICAgICAgICAgICAgICBpbnQgZm1ib3R0b20gPSBmbS5ib3R0b207CiAgICAgICAgICAgICAgICAgaW50IGZtYXNjZW50ID0gZm0uYXNjZW50OwogICAgICAgICAgICAgICAgIGludCBmbWRlc2NlbnQgPSBmbS5kZXNjZW50OwogCi0gICAgICAgICAgICAgICAgaWYgKGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaTsgaiA8IG5leHQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHdpZHRoc1tqIC0gc3RhcnQgKyAoZW5kIC0gc3RhcnQpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIExvZy5lKCJ0ZXh0Iiwgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGk7IGogPCBuZXh0OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gY2hzW2ogLSBzdGFydF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHNwYW5TdGFydDsgaiA8IHNwYW5FbmQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSBjaHNbaiAtIHBhcmFTdGFydF07CiAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJlZm9yZSA9IHc7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJykgewogICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1x0JykgewotICAgICAgICAgICAgICAgICAgICAgICAgdyA9IExheW91dC5uZXh0VGFiKHN1Yiwgc3RhcnQsIGVuZCwgdywgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YWIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhERkZGICYmIGogKyAxIDwgbmV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVtb2ppID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGNocywgaiAtIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNUYWIgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNUYWIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1RhYk9yRW1vamkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFubmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QgdGFiIHRoaXMgcGFyYSwgY2hlY2sgZm9yIHRhYnN0b3BzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuW10gc3BhbnMgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcGFubmVkLCBwYXJhU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYUVuZCwgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgc3BhbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYlN0b3BzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ID0gdGFiU3RvcHMubmV4dFRhYih3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IFRhYlN0b3BzLm5leHREZWZhdWx0U3RvcCh3LCBUQUJfSU5DUkVNRU5UKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REZGRiAmJiBqICsgMSA8IHNwYW5FbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbW9qaSA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChjaHMsIGogLSBwYXJhU3RhcnQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1vamkgPj0gTUlOX0VNT0pJICYmIGVtb2ppIDw9IE1BWF9FTU9KSSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IEVNT0pJX0ZBQ1RPUlkuCkBAIC0zODAsMjEgKzI5NSwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hQYWludCA9IG1Xb3JrUGFpbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWQgPSAoZmxvYXQpIGJtLmdldFdpZHRoKCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWQgPSBibS5nZXRXaWR0aCgpICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdoaWNoUGFpbnQuYXNjZW50KCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibS5nZXRIZWlnaHQoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ICs9IHdpZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzVGFiT3JFbW9qaSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ICs9IHdpZHRoc1tqIC0gc3RhcnQgKyAoZW5kIC0gc3RhcnQpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHBhcmFTdGFydF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ICs9IHdpZHRoc1tqIC0gc3RhcnQgKyAoZW5kIC0gc3RhcnQpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ICs9IHdpZHRoc1tqIC0gcGFyYVN0YXJ0XTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ogLSBzdGFydCArIChlbmQgLSBzdGFydCldOworICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHBhcmFTdGFydF07CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAvLyBMb2cuZSgidGV4dCIsICJ3YXMgIiArIGJlZm9yZSArICIgbm93ICIgKyB3ICsgIiBhZnRlciAiICsgYyArICIgd2l0aGluICIgKyB3aWR0aCk7CkBAIC00MTUsNyArMzMwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgICAgKiBGcm9tIHRoZSBVbmljb2RlIExpbmUgQnJlYWtpbmcgQWxnb3JpdGhtOgogICAgICAgICAgICAgICAgICAgICAgICAgICogKGF0IGxlYXN0IGFwcHJveGltYXRlbHkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgICAgICAgICAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICAgICAgICAgICAgICogLiw6OyBhcmUgY2xhc3MgSVM6IGJyZWFrcG9pbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgIGV4Y2VwdCB3aGVuIGFkamFjZW50IHRvIGRpZ2l0cwogICAgICAgICAgICAgICAgICAgICAgICAgICogLyAgICBpcyBjbGFzcyBTWTogYSBicmVha3BvaW50CkBAIC00MzAsMTIgKzM0NSwxMiBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjID09ICcuJyAgfHwgYyA9PSAnLCcgfHwgYyA9PSAnOicgfHwgYyA9PSAnOycpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqIC0gMSA8IGhlcmUgfHwgIUNoYXJhY3Rlci5pc0RpZ2l0KGNoc1tqIC0gMSAtIHN0YXJ0XSkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqICsgMSA+PSBuZXh0IHx8ICFDaGFyYWN0ZXIuaXNEaWdpdChjaHNbaiArIDEgLSBzdGFydF0pKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGogLSAxIDwgaGVyZSB8fCAhQ2hhcmFjdGVyLmlzRGlnaXQoY2hzW2ogLSAxIC0gcGFyYVN0YXJ0XSkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqICsgMSA+PSBzcGFuRW5kIHx8ICFDaGFyYWN0ZXIuaXNEaWdpdChjaHNbaiArIDEgLSBwYXJhU3RhcnRdKSkpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjID09ICcvJyB8fCBjID09ICctJykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGogKyAxID49IG5leHQgfHwgIUNoYXJhY3Rlci5pc0RpZ2l0KGNoc1tqICsgMSAtIHN0YXJ0XSkpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiArIDEgPj0gc3BhbkVuZCB8fCAhQ2hhcmFjdGVyLmlzRGlnaXQoY2hzW2ogKyAxIC0gcGFyYVN0YXJ0XSkpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjID49IEZJUlNUX0NKSyAmJiBpc0lkZW9ncmFwaGljKGMsIHRydWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKyAxIDwgbmV4dCAmJiBpc0lkZW9ncmFwaGljKGNoc1tqICsgMSAtIHN0YXJ0XSwgZmFsc2UpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICsgMSA8IHNwYW5FbmQgJiYgaXNJZGVvZ3JhcGhpYyhjaHNbaiArIDEgLSBwYXJhU3RhcnRdLCBmYWxzZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2t3aWR0aCA9IHc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBqICsgMTsKIApAQCAtNDUyLDcgKzM2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2sgIT0gaGVyZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvZy5lKCJ0ZXh0IiwgIm91dHB1dCBvayAiICsgaGVyZSArICIgdG8gIiArb2spOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9rIDwgbmV4dCAmJiBjaHNbb2sgLSBzdGFydF0gPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9rIDwgc3BhbkVuZCAmJiBjaHNbb2sgLSBwYXJhU3RhcnRdID09ICcgJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtNDYxLDEwICszNzYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rYXNjZW50LCBva2Rlc2NlbnQsIG9rdG9wLCBva2JvdHRvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nbXVsdCwgc3BhY2luZ2FkZCwgY2hvb3NlaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHYsIGZtLCB0YWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIHN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIGhhc1RhYk9yRW1vamksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIHBhcmFTdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvayA9PSBidWZlbmQsIGluY2x1ZGVwYWQsIHRyYWNrcGFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHMsIHdpZHRocywgaGVyZSAtIHBhcmFTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsIG9rd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludCk7CiAKQEAgLTQ4OCw3ICs0MDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9rICE9IGhlcmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2cuZSgidGV4dCIsICJvdXRwdXQgb2sgIiArIGhlcmUgKyAiIHRvICIgK29rKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvayA8IG5leHQgJiYgY2hzW29rIC0gc3RhcnRdID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvayA8IHNwYW5FbmQgJiYgY2hzW29rIC0gcGFyYVN0YXJ0XSA9PSAnICcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2srKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTQ5NywxMCArNDEyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBva2FzY2VudCwgb2tkZXNjZW50LCBva3RvcCwgb2tib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ211bHQsIHNwYWNpbmdhZGQsIGNob29zZWh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBzdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHYsIGZtLCBoYXNUYWJPckVtb2ppLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBwYXJhU3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hzLCB3aWR0aHMsIGhlcmUgLSBwYXJhU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSwgZWxsaXBzaXplZFdpZHRoLCBva3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQpOwogCkBAIC01MTMsMTkgKzQyOCwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml0dG9wLCBmaXRib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ211bHQsIHNwYWNpbmdhZGQsIGNob29zZWh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBzdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHYsIGZtLCBoYXNUYWJPckVtb2ppLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBwYXJhU3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml0ID09IGJ1ZmVuZCwgaW5jbHVkZXBhZCwgdHJhY2twYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMsIHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocywgd2lkdGhzLCBoZXJlIC0gcGFyYVN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsIGVsbGlwc2l6ZWRXaWR0aCwgZml0d2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlID0gZml0OwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2cuZSgidGV4dCIsICJvdXRwdXQgb25lICIgKyBoZXJlICsgIiB0byAiICsoaGVyZSArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlVGV4dChwYWludCwgbVdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsIGhlcmUsIGhlcmUgKyAxLCBmbSwgdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhYWCBub3Qgc3VyZSB3aHkgdGhlIGV4aXN0aW5nIGZtIHdhc24ndCBvay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZWFzdXJlVGV4dChwYWludCwgbVdvcmtQYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBzb3VyY2UsIGhlcmUsIGhlcmUgKyAxLCBmbSwgdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIG51bGwpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IG91dChzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlLCBoZXJlKzEsCkBAIC01MzMsMTkgKzQ0OSwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm0udG9wLCBmbS5ib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ211bHQsIHNwYWNpbmdhZGQsIGNob29zZWh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBzdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHYsIGZtLCBoYXNUYWJPckVtb2ppLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBwYXJhU3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSArIDEgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2twYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMsIHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocywgd2lkdGhzLCBoZXJlIC0gcGFyYVN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsIGVsbGlwc2l6ZWRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoc1toZXJlIC0gc3RhcnRdLCBwYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHNbaGVyZSAtIHBhcmFTdGFydF0sIHBhaW50KTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgPSBoZXJlICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlcmUgPCBpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IG5leHQgPSBoZXJlOyAvLyBtdXN0IHJlbWVhc3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlcmUgPCBzcGFuU3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaWRuJ3Qgb3V0cHV0IGFsbCB0aGUgdGV4dCBmb3IgdGhpcyBzcGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UndmUgbWVhc3VyZWQgdGhlIHJhdyB3aWR0aHMsIHRob3VnaCwgc28KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IHJlc2V0IHRoZSBzdGFydCBwb2ludAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBuZXh0U3BhblN0YXJ0ID0gaGVyZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IGhlcmUgLSAxOyAgICAvLyBjb250aW51ZSBsb29waW5nCiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC01NTUsMTQgKzQ3NCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZml0YXNjZW50ID0gZml0ZGVzY2VudCA9IGZpdHRvcCA9IGZpdGJvdHRvbSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBva2FzY2VudCA9IG9rZGVzY2VudCA9IG9rdG9wID0gb2tib3R0b20gPSAwOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1maXJzdFdpZHRoTGluZUNvdW50IDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtLWZpcnN0V2lkdGhMaW5lTGltaXQgPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gcmVzdHdpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoZW5kICE9IGhlcmUpIHsKKyAgICAgICAgICAgIGlmIChwYXJhRW5kICE9IGhlcmUpIHsKICAgICAgICAgICAgICAgICBpZiAoKGZpdHRvcCB8IGZpdGJvdHRvbSB8IGZpdGRlc2NlbnQgfCBmaXRhc2NlbnQpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgcGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm0pOwogCkBAIC01NzUsMjAgKzQ5NCwyMCBAQAogICAgICAgICAgICAgICAgIC8vIExvZy5lKCJ0ZXh0IiwgIm91dHB1dCByZXN0ICIgKyBoZXJlICsgIiB0byAiICsgZW5kKTsKIAogICAgICAgICAgICAgICAgIHYgPSBvdXQoc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSwgZW5kLCBmaXRhc2NlbnQsIGZpdGRlc2NlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBoZXJlLCBwYXJhRW5kLCBmaXRhc2NlbnQsIGZpdGRlc2NlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICBmaXR0b3AsIGZpdGJvdHRvbSwKICAgICAgICAgICAgICAgICAgICAgICAgIHYsCiAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nbXVsdCwgc3BhY2luZ2FkZCwgY2hvb3NlaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHYsIGZtLCB0YWIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIHN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9PSBidWZlbmQsIGluY2x1ZGVwYWQsIHRyYWNrcGFkLAotICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHYsIGZtLCBoYXNUYWJPckVtb2ppLAorICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBwYXJhU3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYUVuZCA9PSBidWZlbmQsIGluY2x1ZGVwYWQsIHRyYWNrcGFkLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hzLCB3aWR0aHMsIGhlcmUgLSBwYXJhU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSwgZWxsaXBzaXplZFdpZHRoLCB3LCBwYWludCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHN0YXJ0ID0gZW5kOworICAgICAgICAgICAgcGFyYVN0YXJ0ID0gcGFyYUVuZDsKIAotICAgICAgICAgICAgaWYgKGVuZCA9PSBidWZlbmQpCisgICAgICAgICAgICBpZiAocGFyYUVuZCA9PSBidWZlbmQpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNjAzLDI0NiArNTIyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgIHYsCiAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBudWxsLAogICAgICAgICAgICAgICAgICAgICBudWxsLCBmbSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgYnVmZW5kLCBjaGRpcnMsIERFRkFVTFRfRElSLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIGJ1ZmVuZCwgbnVsbCwgREVGQVVMVF9ESVIsIHRydWUsCiAgICAgICAgICAgICAgICAgICAgIHRydWUsIGluY2x1ZGVwYWQsIHRyYWNrcGFkLAotICAgICAgICAgICAgICAgICAgICB3aWR0aHMsIGJ1ZnN0YXJ0LCAwLAorICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBidWZzdGFydCwKICAgICAgICAgICAgICAgICAgICAgd2hlcmUsIGVsbGlwc2l6ZWRXaWR0aCwgMCwgcGFpbnQpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUnVucyB0aGUgdW5pY29kZSBiaWRpIGFsZ29yaXRobSBvbiB0aGUgZmlyc3QgbiBjaGFycyBpbiBjaHMsIHJldHVybmluZwotICAgICAqIHRoZSBjaGFyIGRpcnMgaW4gY2hJbmZvIGFuZCB0aGUgYmFzZSBsaW5lIGRpcmVjdGlvbiBvZiB0aGUgZmlyc3QKLSAgICAgKiBwYXJhZ3JhcGguCi0gICAgICogCi0gICAgICogWFhYIGNoYW5nZSByZXN1bHQgZnJvbSBkaXJzIHRvIGxldmVscwotICAgICAqICAKLSAgICAgKiBAcGFyYW0gZGlyIHRoZSBkaXJlY3Rpb24gZmxhZywgZWl0aGVyIERJUl9SRVFVRVNUX0xUUiwKLSAgICAgKiBESVJfUkVRVUVTVF9SVEwsIERJUl9SRVFVRVNUX0RFRkFVTFRfTFRSLCBvciBESVJfUkVRVUVTVF9ERUZBVUxUX1JUTC4KLSAgICAgKiBAcGFyYW0gY2hzIHRoZSB0ZXh0IHRvIGV4YW1pbmUKLSAgICAgKiBAcGFyYW0gY2hJbmZvIG9uIGlucHV0LCBpZiBoYXNJbmZvIGlzIHRydWUsIG92ZXJyaWRlIGFuZCBvdGhlciBmbGFncyAKLSAgICAgKiByZXByZXNlbnRpbmcgb3V0LW9mLWJhbmQgZW1iZWRkaW5nIGluZm9ybWF0aW9uLiBPbiBvdXRwdXQsIHRoZSBnZW5lcmF0ZWQgCi0gICAgICogZGlycyBvZiB0aGUgdGV4dC4KLSAgICAgKiBAcGFyYW0gbiB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0L2luZm9ybWF0aW9uIGluIGNocyBhbmQgY2hJbmZvCi0gICAgICogQHBhcmFtIGhhc0luZm8gdHJ1ZSBpZiBjaEluZm8gaGFzIGlucHV0IGluZm9ybWF0aW9uLCBvdGhlcndpc2UgdGhlCi0gICAgICogaW5wdXQgZGF0YSBpbiBjaEluZm8gaXMgaWdub3JlZC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBkaXJlY3Rpb24gbGV2ZWwgb2YgdGhlIGZpcnN0IHBhcmFncmFwaCwgZWl0aGVyCi0gICAgICogRElSX0xFRlRfVE9fUklHSFQgb3IgRElSX1JJR0hUX1RPX0xFRlQuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgaW50IGJpZGkoaW50IGRpciwgY2hhcltdIGNocywgYnl0ZVtdIGNoSW5mbywgaW50IG4sIAotICAgICAgICAgICAgYm9vbGVhbiBoYXNJbmZvKSB7Ci0gICAgICAgIAotICAgICAgICBBbmRyb2lkQ2hhcmFjdGVyLmdldERpcmVjdGlvbmFsaXRpZXMoY2hzLCBjaEluZm8sIG4pOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIERldGVybWluZSBwcmltYXJ5IHBhcmFncmFwaCBkaXJlY3Rpb24gaWYgbm90IHNwZWNpZmllZAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGRpciAhPSBESVJfUkVRVUVTVF9MVFIgJiYgZGlyICE9IERJUl9SRVFVRVNUX1JUTCkgewotICAgICAgICAgICAgLy8gc2V0IHVwIGRlZmF1bHQKLSAgICAgICAgICAgIGRpciA9IGRpciA+PSAwID8gRElSX0xFRlRfVE9fUklHSFQgOiBESVJfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGQgPSBjaEluZm9bal07Ci0KLSAgICAgICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCkgewotICAgICAgICAgICAgICAgICAgICBkaXIgPSBESVJfTEVGVF9UT19SSUdIVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpciA9IERJUl9SSUdIVF9UT19MRUZUOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBieXRlIFNPUiA9IGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCA/Ci0gICAgICAgICAgICAgICAgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQgOgotICAgICAgICAgICAgICAgIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFhYWCBFeHBsaWNpdCBvdmVycmlkZXMgc2hvdWxkIGdvIGhlcmUKLSAgICAgICAgICovCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogV2VhayB0eXBlIHJlc29sdXRpb24KLSAgICAgICAgICovCi0KLSAgICAgICAgLy8gZHVtcChjaGRpcnMsIG4sICJpbml0aWFsIik7Ci0KLSAgICAgICAgLy8gVzEgbm9uIHNwYWNpbmcgbWFya3MKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGlmIChjaEluZm9bal0gPT0gQ2hhcmFjdGVyLk5PTl9TUEFDSU5HX01BUkspIHsKLSAgICAgICAgICAgICAgICBpZiAoaiA9PSAwKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBTT1I7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBjaEluZm9baiAtIDFdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZHVtcChjaGRpcnMsIG4sICJXMSIpOwotCi0gICAgICAgIC8vIFcyIGV1cm9wZWFuIG51bWJlcnMKLSAgICAgICAgYnl0ZSBjdXIgPSBTT1I7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICBieXRlIGQgPSBjaEluZm9bal07Ci0KLSAgICAgICAgICAgIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUIHx8Ci0gICAgICAgICAgICAgICAgZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVCB8fAotICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlRfQVJBQklDKQotICAgICAgICAgICAgICAgIGN1ciA9IGQ7Ci0gICAgICAgICAgICBlbHNlIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVIpIHsKLSAgICAgICAgICAgICAgICAgaWYgKGN1ciA9PQotICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVF9BUkFCSUMpCi0gICAgICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9BUkFCSUNfTlVNQkVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZHVtcChjaGRpcnMsIG4sICJXMiIpOwotCi0gICAgICAgIC8vIFczIGFyYWJpYyBsZXR0ZXJzCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICBpZiAoY2hJbmZvW2pdID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUX0FSQUJJQykKLSAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzMiKTsKLQotICAgICAgICAvLyBXNCBzaW5nbGUgc2VwYXJhdG9yIGJldHdlZW4gbnVtYmVycwotICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8IG4gLSAxOyBqKyspIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLSAgICAgICAgICAgIGJ5dGUgcHJldiA9IGNoSW5mb1tqIC0gMV07Ci0gICAgICAgICAgICBieXRlIG5leHQgPSBjaEluZm9baiArIDFdOwotCi0gICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSX1NFUEFSQVRPUikgewotICAgICAgICAgICAgICAgIGlmIChwcmV2ID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVIgJiYKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSOwotICAgICAgICAgICAgfSBlbHNlIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9DT01NT05fTlVNQkVSX1NFUEFSQVRPUikgewotICAgICAgICAgICAgICAgIGlmIChwcmV2ID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVIgJiYKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSOwotICAgICAgICAgICAgICAgIGlmIChwcmV2ID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9BUkFCSUNfTlVNQkVSICYmCi0gICAgICAgICAgICAgICAgICAgIG5leHQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0FSQUJJQ19OVU1CRVIpCi0gICAgICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9BUkFCSUNfTlVNQkVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZHVtcChjaGRpcnMsIG4sICJXNCIpOwotCi0gICAgICAgIC8vIFc1IGV1cm9wZWFuIG51bWJlciB0ZXJtaW5hdG9ycwotICAgICAgICBib29sZWFuIGFkamFjZW50ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICBieXRlIGQgPSBjaEluZm9bal07Ci0KLSAgICAgICAgICAgIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVIpCi0gICAgICAgICAgICAgICAgYWRqYWNlbnQgPSB0cnVlOwotICAgICAgICAgICAgZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSX1RFUk1JTkFUT1IgJiYgYWRqYWNlbnQpCi0gICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBhZGphY2VudCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9kdW1wKGNoZGlycywgbiwgIlc1Iik7Ci0KLSAgICAgICAgLy8gVzUgZXVyb3BlYW4gbnVtYmVyIHRlcm1pbmF0b3JzIHBhcnQgMiwKLSAgICAgICAgLy8gVzYgc2VwYXJhdG9ycyBhbmQgdGVybWluYXRvcnMKLSAgICAgICAgYWRqYWNlbnQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaiA9IG4gLSAxOyBqID49IDA7IGotLSkgewotICAgICAgICAgICAgYnl0ZSBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSKQotICAgICAgICAgICAgICAgIGFkamFjZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUl9URVJNSU5BVE9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFkamFjZW50KQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX09USEVSX05FVVRSQUxTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRqYWNlbnQgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVJfU0VQQVJBVE9SIHx8Ci0gICAgICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0NPTU1PTl9OVU1CRVJfU0VQQVJBVE9SIHx8Ci0gICAgICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1BBUkFHUkFQSF9TRVBBUkFUT1IgfHwKLSAgICAgICAgICAgICAgICAgICAgZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfU0VHTUVOVF9TRVBBUkFUT1IpCi0gICAgICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9PVEhFUl9ORVVUUkFMUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzYiKTsKLQotICAgICAgICAvLyBXNyBzdHJvbmcgZGlyZWN0aW9uIG9mIGV1cm9wZWFuIG51bWJlcnMKLSAgICAgICAgY3VyID0gU09SOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgYnl0ZSBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICBpZiAoZCA9PSBTT1IgfHwKLSAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUIHx8Ci0gICAgICAgICAgICAgICAgZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICBjdXIgPSBkOwotCi0gICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSKQotICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IGN1cjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzciKTsKLQotICAgICAgICAvLyBOMSwgTjIgbmV1dHJhbHMKLSAgICAgICAgY3VyID0gU09SOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgYnl0ZSBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCB8fAotICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICBjdXIgPSBkOwotICAgICAgICAgICAgfSBlbHNlIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUikgewotICAgICAgICAgICAgICAgIGN1ciA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBieXRlIGRkID0gU09SOwotICAgICAgICAgICAgICAgIGludCBrOwotCi0gICAgICAgICAgICAgICAgZm9yIChrID0gaiArIDE7IGsgPCBuOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZGQgPSBjaEluZm9ba107Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9BUkFCSUNfTlVNQkVSKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZCA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCB5ID0gajsgeSA8IGs7IHkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGQgPT0gY3VyKQotICAgICAgICAgICAgICAgICAgICAgICAgY2hJbmZvW3ldID0gY3VyOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBjaEluZm9beV0gPSBTT1I7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaiA9IGsgLSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZHVtcChjaGRpcnMsIG4sICJmaW5hbCIpOwotCi0gICAgICAgIC8vIGV4dHJhOiBlbmZvcmNlIHRoYXQgYWxsIHRhYnMgYW5kIHN1cnJvZ2F0ZSBjaGFyYWN0ZXJzIGdvIHRoZQotICAgICAgICAvLyBwcmltYXJ5IGRpcmVjdGlvbgotICAgICAgICAvLyBUT0RPOiBhY3R1YWxseSBkbyBkaXJlY3Rpb25zIHJpZ2h0IGZvciBzdXJyb2dhdGVzCi0KLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IGNoc1tqXTsKLQotICAgICAgICAgICAgaWYgKGMgPT0gJ1x0JyB8fCAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYpKSB7Ci0gICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gU09SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZGlyOwotICAgIH0KLQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRklSU1RfQ0pLID0gJ1x1MkU4MCc7CiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIG9uZSBvZiB0aG9zZSBzcGVjaWZpZWQKQEAgLTk0OCw1MyArNjM0LDE1IEBACiAgICAgfQogKi8KIAotICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRGaXQoVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkKSB7Ci0gICAgICAgIGludCBoaWdoID0gZW5kICsgMSwgbG93ID0gc3RhcnQgLSAxLCBndWVzczsKLQotICAgICAgICB3aGlsZSAoaGlnaCAtIGxvdyA+IDEpIHsKLSAgICAgICAgICAgIGd1ZXNzID0gKGhpZ2ggKyBsb3cpIC8gMjsKLQotICAgICAgICAgICAgaWYgKG1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwgc3RhcnQsIGd1ZXNzLCBudWxsLCB0cnVlLCBudWxsKSA+IHdpZCkKLSAgICAgICAgICAgICAgICBoaWdoID0gZ3Vlc3M7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbG93ID0gZ3Vlc3M7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG93IDwgc3RhcnQpCi0gICAgICAgICAgICByZXR1cm4gc3RhcnQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBsb3c7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGp1c3RUZXh0V2lkdGhzKGZsb2F0W10gd2lkdGhzLCBDaGFyU2VxdWVuY2UgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdXJQb3MsIGludCBuZXh0UG9zLCBpbnQgYWN0dWFsTnVtKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgZHN0SW5kZXggPSBuZXh0UG9zIC0gY3VyUG9zIC0gMTsKLSAgICAgICAgICAgIGZvciAoaW50IHNyY0luZGV4ID0gYWN0dWFsTnVtIC0gMTsgc3JjSW5kZXggPj0gMDsgc3JjSW5kZXgtLSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGNoYXIgYyA9IHRleHQuY2hhckF0KGRzdEluZGV4ICsgY3VyUG9zKTsKLSAgICAgICAgICAgICAgICBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYpIHsKLSAgICAgICAgICAgICAgICAgICAgd2lkdGhzW2RzdEluZGV4LS1dID0gMC4wZjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2lkdGhzW2RzdEluZGV4LS1dID0gd2lkdGhzW3NyY0luZGV4XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZSgidGV4dCIsICJhZGp1c3QgdGV4dCB3aWR0aHMgZmFpbGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIGludCBvdXQoQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWJvdmUsIGludCBiZWxvdywgaW50IHRvcCwgaW50IGJvdHRvbSwgaW50IHYsCiAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3BhY2luZ211bHQsIGZsb2F0IHNwYWNpbmdhZGQsCiAgICAgICAgICAgICAgICAgICAgICAgTGluZUhlaWdodFNwYW5bXSBjaG9vc2VodCwgaW50W10gY2hvb3NlaHR2LAotICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtLCBib29sZWFuIHRhYiwKKyAgICAgICAgICAgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbSwgYm9vbGVhbiBoYXNUYWJPckVtb2ppLAogICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZE11bHRpcGx5LCBpbnQgcHN0YXJ0LCBieXRlW10gY2hkaXJzLAogICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIGJvb2xlYW4gZWFzeSwgYm9vbGVhbiBsYXN0LAogICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZXBhZCwgYm9vbGVhbiB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIHdpZHRocywgaW50IHdpZHN0YXJ0LCBpbnQgd2lkb2ZmLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBjaHMsIGZsb2F0W10gd2lkdGhzLCBpbnQgd2lkc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLlRydW5jYXRlQXQgZWxsaXBzaXplLCBmbG9hdCBlbGxpcHNpc3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRleHR3aWR0aCwgVGV4dFBhaW50IHBhaW50KSB7CiAgICAgICAgIGludCBqID0gbUxpbmVDb3VudDsKQEAgLTEwMDIsOCArNjUwLDYgQEAKICAgICAgICAgaW50IHdhbnQgPSBvZmYgKyBtQ29sdW1ucyArIFRPUDsKICAgICAgICAgaW50W10gbGluZXMgPSBtTGluZXM7CiAKLSAgICAgICAgLy8gTG9nLmUoInRleHQiLCAibGluZSAiICsgc3RhcnQgKyAiIHRvICIgKyBlbmQgKyAobGFzdCA/ICI9PT0iIDogIiIpKTsKLQogICAgICAgICBpZiAod2FudCA+PSBsaW5lcy5sZW5ndGgpIHsKICAgICAgICAgICAgIGludCBubGVuID0gQXJyYXlVdGlscy5pZGVhbEludEFycmF5U2l6ZSh3YW50ICsgMSk7CiAgICAgICAgICAgICBpbnRbXSBncm93ID0gbmV3IGludFtubGVuXTsKQEAgLTEwNzksNTkgKzcyNSwyMyBAQAogICAgICAgICBsaW5lc1tvZmYgKyBtQ29sdW1ucyArIFNUQVJUXSA9IGVuZDsKICAgICAgICAgbGluZXNbb2ZmICsgbUNvbHVtbnMgKyBUT1BdID0gdjsKIAotICAgICAgICBpZiAodGFiKQorICAgICAgICBpZiAoaGFzVGFiT3JFbW9qaSkKICAgICAgICAgICAgIGxpbmVzW29mZiArIFRBQl0gfD0gVEFCX01BU0s7CiAKLSAgICAgICAgewotICAgICAgICAgICAgbGluZXNbb2ZmICsgRElSXSB8PSBkaXIgPDwgRElSX1NISUZUOwotCi0gICAgICAgICAgICBpbnQgY3VyID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQ7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotCi0gICAgICAgICAgICBpZiAoIWVhc3kpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gc3RhcnQ7IGsgPCBlbmQ7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2hkaXJzW2sgLSBwc3RhcnRdICE9IGN1cikgewotICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1ciA9IGNoZGlyc1trIC0gcHN0YXJ0XTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRGlyZWN0aW9ucyBsaW5lZGlyczsKLQotICAgICAgICAgICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgICAgICAgICBsaW5lZGlycyA9IERJUlNfQUxMX0xFRlRfVE9fUklHSFQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNob3J0W10gbGQgPSBuZXcgc2hvcnRbY291bnQgKyAxXTsKLQotICAgICAgICAgICAgICAgIGN1ciA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUOwotICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgaGVyZSA9IHN0YXJ0OwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IHN0YXJ0OyBrIDwgZW5kOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoZGlyc1trIC0gcHN0YXJ0XSAhPSBjdXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhYWCBjaGVjayB0byBtYWtlIHN1cmUgd2UgZG9uJ3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBvdmVyZmxvdyBzaG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgbGRbY291bnQrK10gPSAoc2hvcnQpIChrIC0gaGVyZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXIgPSBjaGRpcnNbayAtIHBzdGFydF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBoZXJlID0gazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxkW2NvdW50XSA9IChzaG9ydCkgKGVuZCAtIGhlcmUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID09IDEgJiYgbGRbMF0gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBsaW5lZGlycyA9IERJUlNfQUxMX1JJR0hUX1RPX0xFRlQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZWRpcnMgPSBuZXcgRGlyZWN0aW9ucyhsZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCisgICAgICAgIGxpbmVzW29mZiArIERJUl0gfD0gZGlyIDw8IERJUl9TSElGVDsKKyAgICAgICAgRGlyZWN0aW9ucyBsaW5lZGlycyA9IERJUlNfQUxMX0xFRlRfVE9fUklHSFQ7CisgICAgICAgIC8vIGVhc3kgbWVhbnMgYWxsIGNoYXJzIDwgdGhlIGZpcnN0IFJUTCwgc28gbm8gZW1vamksIG5vIG5vdGhpbmcKKyAgICAgICAgLy8gWFhYIGEgcnVuIHdpdGggbm8gdGV4dCBvciBhbGwgc3BhY2VzIGlzIGVhc3kgYnV0IG1pZ2h0IGJlIGFuIGVtcHR5CisgICAgICAgIC8vIFJUTCBwYXJhZ3JhcGguICBNYWtlIHN1cmUgZWFzeSBpcyBmYWxzZSBpZiB0aGlzIGlzIHRoZSBjYXNlLgorICAgICAgICBpZiAoZWFzeSkgewogICAgICAgICAgICAgbUxpbmVEaXJlY3Rpb25zW2pdID0gbGluZWRpcnM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTGluZURpcmVjdGlvbnNbal0gPSBBbmRyb2lkQmlkaS5kaXJlY3Rpb25zKGRpciwgY2hkaXJzLCB3aWRzdGFydCwgY2hzLAorICAgICAgICAgICAgICAgICAgICB3aWRzdGFydCwgZW5kIC0gc3RhcnQpOwogCiAgICAgICAgICAgICAvLyBJZiBlbGxpcHNpemUgaXMgaW4gbWFycXVlZSBtb2RlLCBkbyBub3QgYXBwbHkgZWxsaXBzaXMgb24gdGhlIGZpcnN0IGxpbmUKICAgICAgICAgICAgIGlmIChlbGxpcHNpemUgIT0gbnVsbCAmJiAoZWxsaXBzaXplICE9IFRleHRVdGlscy5UcnVuY2F0ZUF0Lk1BUlFVRUUgfHwgaiAhPSAwKSkgewotICAgICAgICAgICAgICAgIGNhbGN1bGF0ZUVsbGlwc2lzKHN0YXJ0LCBlbmQsIHdpZHRocywgd2lkc3RhcnQsIHdpZG9mZiwKKyAgICAgICAgICAgICAgICBjYWxjdWxhdGVFbGxpcHNpcyhzdGFydCwgZW5kLCB3aWR0aHMsIHdpZHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsbGlwc2lzd2lkdGgsIGVsbGlwc2l6ZSwgaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0d2lkdGgsIHBhaW50KTsKICAgICAgICAgICAgIH0KQEAgLTExNDIsNyArNzUyLDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2FsY3VsYXRlRWxsaXBzaXMoaW50IGxpbmVzdGFydCwgaW50IGxpbmVlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0W10gd2lkdGhzLCBpbnQgd2lkc3RhcnQsIGludCB3aWRvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0W10gd2lkdGhzLCBpbnQgd2lkc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGF2YWlsLCBUZXh0VXRpbHMuVHJ1bmNhdGVBdCB3aGVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUsIGZsb2F0IHRleHR3aWR0aCwgVGV4dFBhaW50IHBhaW50KSB7CiAgICAgICAgIGludCBsZW4gPSBsaW5lZW5kIC0gbGluZXN0YXJ0OwpAQCAtMTE2Miw3ICs3NzIsNyBAQAogICAgICAgICAgICAgaW50IGk7CiAKICAgICAgICAgICAgIGZvciAoaSA9IGxlbjsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2kgLSAxICsgbGluZXN0YXJ0IC0gd2lkc3RhcnQgKyB3aWRvZmZdOworICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWR0aHNbaSAtIDEgKyBsaW5lc3RhcnQgLSB3aWRzdGFydF07CiAKICAgICAgICAgICAgICAgICBpZiAodyArIHN1bSArIGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTc4LDcgKzc4OCw3IEBACiAgICAgICAgICAgICBpbnQgaTsKIAogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tpICsgbGluZXN0YXJ0IC0gd2lkc3RhcnQgKyB3aWRvZmZdOworICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWR0aHNbaSArIGxpbmVzdGFydCAtIHdpZHN0YXJ0XTsKIAogICAgICAgICAgICAgICAgIGlmICh3ICsgc3VtICsgZWxsaXBzaXN3aWQgPiBhdmFpbCkgewogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTExOTUsNyArODA1LDcgQEAKIAogICAgICAgICAgICAgZmxvYXQgcmF2YWlsID0gKGF2YWlsIC0gZWxsaXBzaXN3aWQpIC8gMjsKICAgICAgICAgICAgIGZvciAocmlnaHQgPSBsZW47IHJpZ2h0ID49IDA7IHJpZ2h0LS0pIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW3JpZ2h0IC0gMSArIGxpbmVzdGFydCAtIHdpZHN0YXJ0ICsgd2lkb2ZmXTsKKyAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW3JpZ2h0IC0gMSArIGxpbmVzdGFydCAtIHdpZHN0YXJ0XTsKIAogICAgICAgICAgICAgICAgIGlmICh3ICsgcnN1bSA+IHJhdmFpbCkgewogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEyMDYsNyArODE2LDcgQEAKIAogICAgICAgICAgICAgZmxvYXQgbGF2YWlsID0gYXZhaWwgLSBlbGxpcHNpc3dpZCAtIHJzdW07CiAgICAgICAgICAgICBmb3IgKGxlZnQgPSAwOyBsZWZ0IDwgcmlnaHQ7IGxlZnQrKykgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWR0aHNbbGVmdCArIGxpbmVzdGFydCAtIHdpZHN0YXJ0ICsgd2lkb2ZmXTsKKyAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2xlZnQgKyBsaW5lc3RhcnQgLSB3aWRzdGFydF07CiAKICAgICAgICAgICAgICAgICBpZiAodyArIGxzdW0gPiBsYXZhaWwpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMjIzLDcgKzgzMyw3IEBACiAgICAgICAgIG1MaW5lc1ttQ29sdW1ucyAqIGxpbmUgKyBFTExJUFNJU19DT1VOVF0gPSBlbGxpcHNpc0NvdW50OwogICAgIH0KIAotICAgIC8vIE92ZXJyaWRlIHRoZSBiYXNlY2xhc3Mgc28gd2UgY2FuIGRpcmVjdGx5IGFjY2VzcyBvdXIgbWVtYmVycywKKyAgICAvLyBPdmVycmlkZSB0aGUgYmFzZSBjbGFzcyBzbyB3ZSBjYW4gZGlyZWN0bHkgYWNjZXNzIG91ciBtZW1iZXJzLAogICAgIC8vIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gbWVtYmVyIGZ1bmN0aW9ucy4KICAgICAvLyBUaGUgbG9naWMgbWlycm9ycyB0aGF0IG9mIExheW91dC5nZXRMaW5lRm9yVmVydGljYWwKICAgICAvLyBGSVhNRTogSXQgbWF5IGJlIGZhc3RlciB0byBkbyBhIGxpbmVhciBzZWFyY2ggZm9yIGxheW91dHMgd2l0aG91dCBtYW55IGxpbmVzLgpAQCAtMTI1MiwxMSArODYyLDExIEBACiAgICAgfQogCiAgICAgcHVibGljIGludCBnZXRMaW5lVG9wKGludCBsaW5lKSB7Ci0gICAgICAgIHJldHVybiBtTGluZXNbbUNvbHVtbnMgKiBsaW5lICsgVE9QXTsgICAgCisgICAgICAgIHJldHVybiBtTGluZXNbbUNvbHVtbnMgKiBsaW5lICsgVE9QXTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldExpbmVEZXNjZW50KGludCBsaW5lKSB7Ci0gICAgICAgIHJldHVybiBtTGluZXNbbUNvbHVtbnMgKiBsaW5lICsgREVTQ0VOVF07ICAgCisgICAgICAgIHJldHVybiBtTGluZXNbbUNvbHVtbnMgKiBsaW5lICsgREVTQ0VOVF07CiAgICAgfQogCiAgICAgcHVibGljIGludCBnZXRMaW5lU3RhcnQoaW50IGxpbmUpIHsKQEAgLTEzMjksMTMgKzkzOSwxMSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVJfU0hJRlQgID0gMzA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQl9NQVNLICAgPSAweDIwMDAwMDAwOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBGSVJTVF9SSUdIVF9UT19MRUZUID0gJ1x1MDU5MCc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQl9JTkNSRU1FTlQgPSAyMDsgLy8gc2FtZSBhcyBMYXlvdXQsIGJ1dCB0aGF0J3MgcHJpdmF0ZQogCiAgICAgLyoKLSAgICAgKiBUaGVzZSBhcmUgcmV1c2VkIGFjcm9zcyBjYWxscyB0byBnZW5lcmF0ZSgpCisgICAgICogVGhpcyBpcyByZXVzZWQgYWNyb3NzIGNhbGxzIHRvIGdlbmVyYXRlKCkKICAgICAgKi8KLSAgICBwcml2YXRlIGJ5dGVbXSBtQ2hkaXJzOwotICAgIHByaXZhdGUgY2hhcltdIG1DaHM7Ci0gICAgcHJpdmF0ZSBmbG9hdFtdIG1XaWR0aHM7CisgICAgcHJpdmF0ZSBNZWFzdXJlZFRleHQgbU1lYXN1cmVkOwogICAgIHByaXZhdGUgUGFpbnQuRm9udE1ldHJpY3NJbnQgbUZvbnRNZXRyaWNzSW50ID0gbmV3IFBhaW50LkZvbnRNZXRyaWNzSW50KCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1N0eWxlZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdHlsZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTNjYzQyYy4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1N0eWxlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnRleHQ7Ci0KLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3RhdGljIG1ldGhvZHMgZm9yIGRyYXdpbmcgYW5kIG1lYXN1cmluZyBzdHlsZWQgdGV4dCwKLSAqIGxpa2Uge0BsaW5rIGFuZHJvaWQudGV4dC5TcGFubmVkfSBvYmplY3Qgd2l0aAotICoge0BsaW5rIGFuZHJvaWQudGV4dC5zdHlsZS5SZXBsYWNlbWVudFNwYW59LgotICoKLSAqIEBoaWRlCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZWQKLXsKLSAgICAvKioKLSAgICAgKiBEcmF3cyBhbmQvb3IgbWVhc3VyZXMgYSB1bmlmb3JtIHJ1biBvZiB0ZXh0IG9uIGEgc2luZ2xlIGxpbmUuIE5vIHNwYW4gb2YKLSAgICAgKiBpbnRlcmVzdCBzaG91bGQgc3RhcnQgb3IgZW5kIGluIHRoZSBtaWRkbGUgb2YgdGhpcyBydW4gKGlmIG5vdAotICAgICAqIGRyYXdpbmcsIGNoYXJhY3RlciBzcGFucyB0aGF0IGRvbid0IGFmZmVjdCBtZXRyaWNzIGNhbiBiZSBpZ25vcmVkKS4KLSAgICAgKiBOZWl0aGVyIHNob3VsZCB0aGUgcnVuIGRpcmVjdGlvbiBjaGFuZ2UgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcnVuLgotICAgICAqCi0gICAgICogPHA+VGhlIHggcG9zaXRpb24gaXMgdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGV4dC4gSW4gYSByaWdodC10by1sZWZ0Ci0gICAgICogcGFyYWdyYXBoLCB0aGlzIHdpbGwgYmUgdG8gdGhlIHJpZ2h0IG9mIHRoZSB0ZXh0IHRvIGJlIGRyYXduLiBQYWludAotICAgICAqIHNob3VsZCBub3QgaGF2ZSBhbiBBbGlnbiB2YWx1ZSBvdGhlciB0aGFuIExFRlQgb3IgcG9zaXRpb25pbmcgd2lsbCBnZXQKLSAgICAgKiBjb25mdXNlZC4KLSAgICAgKgotICAgICAqIDxwPk9uIHJldHVybiwgd29ya1BhaW50IHdpbGwgcmVmbGVjdCB0aGUgb3JpZ2luYWwgcGFpbnQgcGx1cyBhbnkKLSAgICAgKiBtb2RpZmljYXRpb25zIG1hZGUgYnkgY2hhcmFjdGVyIHN0eWxlcyBvbiB0aGUgcnVuLgotICAgICAqCi0gICAgICogPHA+VGhlIHJldHVybmVkIHdpZHRoIGlzIHNpZ25lZCBhbmQgd2lsbCBiZSA8IDAgaWYgdGhlIHBhcmFncmFwaAotICAgICAqIGRpcmVjdGlvbiBpcyByaWdodC10by1sZWZ0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IGRyYXdVbmlmb3JtUnVuKENhbnZhcyBjYW52YXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFubmVkIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIGJvb2xlYW4gcnVuSXNSdGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgewotCi0gICAgICAgIGJvb2xlYW4gaGF2ZVdpZHRoID0gZmFsc2U7Ci0gICAgICAgIGZsb2F0IHJldCA9IDA7Ci0gICAgICAgIENoYXJhY3RlclN0eWxlW10gc3BhbnMgPSB0ZXh0LmdldFNwYW5zKHN0YXJ0LCBlbmQsIENoYXJhY3RlclN0eWxlLmNsYXNzKTsKLQotICAgICAgICBSZXBsYWNlbWVudFNwYW4gcmVwbGFjZW1lbnQgPSBudWxsOwotCi0gICAgICAgIC8vIFhYWDogVGhpcyBzaG91bGRuJ3QgYmUgbW9kaWZ5aW5nIHBhaW50LCBvbmx5IHdvcmtQYWludC4KLSAgICAgICAgLy8gSG93ZXZlciwgdGhlIG1lbWJlcnMgYmVsb25naW5nIHRvIFRleHRQYWludCBzaG91bGQgaGF2ZSBkZWZhdWx0Ci0gICAgICAgIC8vIHZhbHVlcyBhbnl3YXkuICBCZXR0ZXIgdG8gZW5zdXJlIHRoaXMgaW4gdGhlIExheW91dCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgcGFpbnQuYmdDb2xvciA9IDA7Ci0gICAgICAgIHBhaW50LmJhc2VsaW5lU2hpZnQgPSAwOwotICAgICAgICB3b3JrUGFpbnQuc2V0KHBhaW50KTsKLQotCQlpZiAoc3BhbnMubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykgewotCQkJCUNoYXJhY3RlclN0eWxlIHNwYW4gPSBzcGFuc1tpXTsKLQotCQkJCWlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7Ci0JCQkJCXJlcGxhY2VtZW50ID0gKFJlcGxhY2VtZW50U3BhbilzcGFuOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3Bhbi51cGRhdGVEcmF3U3RhdGUod29ya1BhaW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotICAgICAgICBpZiAocmVwbGFjZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRtcDsKLSAgICAgICAgICAgIGludCB0bXBzdGFydCwgdG1wZW5kOwotCi0gICAgICAgICAgICBpZiAocnVuSXNSdGwpIHsKLSAgICAgICAgICAgICAgICB0bXAgPSBUZXh0VXRpbHMuZ2V0UmV2ZXJzZSh0ZXh0LCBzdGFydCwgZW5kKTsKLSAgICAgICAgICAgICAgICB0bXBzdGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgLy8gWFhYOiBhc3N1bWVzIGdldFJldmVyc2UgZG9lc24ndCBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgdGV4dAotICAgICAgICAgICAgICAgIHRtcGVuZCA9IGVuZCAtIHN0YXJ0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0bXAgPSB0ZXh0OwotICAgICAgICAgICAgICAgIHRtcHN0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgICAgICAgICAgdG1wZW5kID0gZW5kOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZm1pICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3b3JrUGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm1pKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNhbnZhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHdvcmtQYWludC5iZ0NvbG9yICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGMgPSB3b3JrUGFpbnQuZ2V0Q29sb3IoKTsKLSAgICAgICAgICAgICAgICAgICAgUGFpbnQuU3R5bGUgcyA9IHdvcmtQYWludC5nZXRTdHlsZSgpOwotICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQuc2V0Q29sb3Iod29ya1BhaW50LmJnQ29sb3IpOwotICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuRklMTCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXZlV2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHdvcmtQYWludC5tZWFzdXJlVGV4dCh0bXAsIHRtcHN0YXJ0LCB0bXBlbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZVdpZHRoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KHggLSByZXQsIHRvcCwgeCwgYm90dG9tLCB3b3JrUGFpbnQpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoeCwgdG9wLCB4ICsgcmV0LCBib3R0b20sIHdvcmtQYWludCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldFN0eWxlKHMpOwotICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQuc2V0Q29sb3IoYyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGRpciA9PSBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXZlV2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHdvcmtQYWludC5tZWFzdXJlVGV4dCh0bXAsIHRtcHN0YXJ0LCB0bXBlbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZVdpZHRoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCh0bXAsIHRtcHN0YXJ0LCB0bXBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0gcmV0LCB5ICsgd29ya1BhaW50LmJhc2VsaW5lU2hpZnQsIHdvcmtQYWludCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRXaWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXZlV2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB3b3JrUGFpbnQubWVhc3VyZVRleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlV2lkdGggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KHRtcCwgdG1wc3RhcnQsIHRtcGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHkgKyB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdCwgd29ya1BhaW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChuZWVkV2lkdGggJiYgIWhhdmVXaWR0aCkgewotICAgICAgICAgICAgICAgICAgICByZXQgPSB3b3JrUGFpbnQubWVhc3VyZVRleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgaGF2ZVdpZHRoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSByZXBsYWNlbWVudC5nZXRTaXplKHdvcmtQYWludCwgdGV4dCwgc3RhcnQsIGVuZCwgZm1pKTsKLQotICAgICAgICAgICAgaWYgKGNhbnZhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRpciA9PSBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50LmRyYXcoY2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLSByZXQsIHRvcCwgeSwgYm90dG9tLCB3b3JrUGFpbnQpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQuZHJhdyhjYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgdG9wLCB5LCBib3R0b20sIHdvcmtQYWludCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgIHJldHVybiAtcmV0OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFkdmFuY2Ugd2lkdGhzIGZvciBhIHVuaWZvcm0gbGVmdC10by1yaWdodCBydW4gb2YgdGV4dCB3aXRoCi0gICAgICogbm8gc3R5bGUgY2hhbmdlcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBydW4uIElmIGFueSBzdHlsZSBpcyByZXBsYWNlbWVudAotICAgICAqIHRleHQsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgd2lsbCBnZXQgdGhlIHdpZHRoIG9mIHRoZSByZXBsYWNlbWVudCBhbmQgdGhlCi0gICAgICogcmVtYWluaW5nIGNoYXJhY3RlcnMgd2lsbCBnZXQgYSB3aWR0aCBvZiAwLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYWludCB0aGUgcGFpbnQsIHdpbGwgbm90IGJlIG1vZGlmaWVkCi0gICAgICogQHBhcmFtIHdvcmtQYWludCBhIHBhaW50IHRvIG1vZGlmeTsgb24gcmV0dXJuIHdpbGwgcmVmbGVjdCB0aGUgb3JpZ2luYWwKLSAgICAgKiAgICAgICAgcGFpbnQgcGx1cyB0aGUgZWZmZWN0IG9mIGFsbCBzcGFucyBvbiB0aGUgcnVuCi0gICAgICogQHBhcmFtIHRleHQgdGhlIHRleHQKLSAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBydW4KLSAgICAgKiBAcGFyYW0gZW5kIHRoZSBsaW1pdCBvZiB0aGUgcnVuCi0gICAgICogQHBhcmFtIHdpZHRocyBhcnJheSB0byByZWNlaXZlIHRoZSBhZHZhbmNlIHdpZHRocyBvZiB0aGUgY2hhcmFjdGVycy4gTXVzdAotICAgICAqICAgICAgICBiZSBhdCBsZWFzdCBhIGxhcmdlIGFzIChlbmQgLSBzdGFydCkuCi0gICAgICogQHBhcmFtIGZtaSBGb250TWV0cmljcyBpbmZvcm1hdGlvbjsgY2FuIGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHdpZHRocyByZXR1cm5lZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFRleHRXaWR0aHMoVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uZWQgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRbXSB3aWR0aHMsIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtaSkgewotICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuW10gc3BhbnMgPQotICAgICAgICAgICAgdGV4dC5nZXRTcGFucyhzdGFydCwgZW5kLCBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKLQotCQlSZXBsYWNlbWVudFNwYW4gcmVwbGFjZW1lbnQgPSBudWxsOwotICAgICAgICB3b3JrUGFpbnQuc2V0KHBhaW50KTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKLQkJCU1ldHJpY0FmZmVjdGluZ1NwYW4gc3BhbiA9IHNwYW5zW2ldOwotCQkJaWYgKHNwYW4gaW5zdGFuY2VvZiBSZXBsYWNlbWVudFNwYW4pIHsKLQkJCQlyZXBsYWNlbWVudCA9IChSZXBsYWNlbWVudFNwYW4pc3BhbjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNwYW4udXBkYXRlTWVhc3VyZVN0YXRlKHdvcmtQYWludCk7Ci0JCQl9Ci0JCX0KLQkKLSAgICAgICAgaW50IHJlc3VsdDsKLSAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHdvcmtQYWludC5nZXRGb250TWV0cmljc0ludChmbWkpOwotICAgICAgICAgICAgcmVzdWx0ID0gd29ya1BhaW50LmdldFRleHRXaWR0aHModGV4dCwgc3RhcnQsIGVuZCwgd2lkdGhzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCB3aWQgPSByZXBsYWNlbWVudC5nZXRTaXplKHdvcmtQYWludCwgdGV4dCwgc3RhcnQsIGVuZCwgZm1pKTsKLQotICAgICAgICAgICAgaWYgKGVuZCA+IHN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgd2lkdGhzWzBdID0gd2lkOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCArIDE7IGkgPCBlbmQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgd2lkdGhzW2kgLSBzdGFydF0gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0ID0gZW5kIC0gc3RhcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW5kZXJzIGFuZC9vciBtZWFzdXJlcyBhIGRpcmVjdGlvbmFsIHJ1biBvZiB0ZXh0IG9uIGEgc2luZ2xlIGxpbmUuCi0gICAgICogVW5saWtlIHtAbGluayAjZHJhd1VuaWZvcm1SdW59LCB0aGlzIGNhbiByZW5kZXIgcnVucyB0aGF0IGNyb3NzIHN0eWxlCi0gICAgICogYm91bmRhcmllcy4gIFJldHVybnMgdGhlIHNpZ25lZCBhZHZhbmNlIHdpZHRoLCBpZiByZXF1ZXN0ZWQuCi0gICAgICoKLSAgICAgKiA8cD5UaGUgeCBwb3NpdGlvbiBpcyB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0ZXh0LiBJbiBhIHJpZ2h0LXRvLWxlZnQKLSAgICAgKiBwYXJhZ3JhcGgsIHRoaXMgd2lsbCBiZSB0byB0aGUgcmlnaHQgb2YgdGhlIHRleHQgdG8gYmUgZHJhd24uIFBhaW50Ci0gICAgICogc2hvdWxkIG5vdCBoYXZlIGFuIEFsaWduIHZhbHVlIG90aGVyIHRoYW4gTEVGVCBvciBwb3NpdGlvbmluZyB3aWxsIGdldAotICAgICAqIGNvbmZ1c2VkLgotICAgICAqCi0gICAgICogPHA+VGhpcyBvcHRpbWl6ZXMgZm9yIHVuc3R5bGVkIHRleHQgYW5kIHNvIHdvcmtQYWludCBtaWdodCBub3QgYmUKLSAgICAgKiBtb2RpZmllZCBieSB0aGlzIGNhbGwuCi0gICAgICoKLSAgICAgKiA8cD5UaGUgcmV0dXJuZWQgYWR2YW5jZSB3aWR0aCB3aWxsIGJlIDwgMCBpZiB0aGUgcGFyYWdyYXBoCi0gICAgICogZGlyZWN0aW9uIGlzIHJpZ2h0LXRvLWxlZnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgZHJhd0RpcmVjdGlvbmFsUnVuKENhbnZhcyBjYW52YXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgYm9vbGVhbiBydW5Jc1J0bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm1pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZFdpZHRoKSB7Ci0KLSAgICAgICAgLy8gWFhYOiBJdCBsb29rcyBsaWtlIGFsbCBjYWxscyB0byB0aGlzIEFQSSBtYXRjaCBkaXIgYW5kIHJ1bklzUnRsLCBzbwotICAgICAgICAvLyBoYXZpbmcgYm90aCBwYXJhbWV0ZXJzIGlzIHJlZHVuZGFudCBhbmQgY29uZnVzaW5nLgotCi0gICAgICAgIC8vIGZhc3QgcGF0aCBmb3IgdW5zdHlsZWQgdGV4dAotICAgICAgICBpZiAoISh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkpIHsKLSAgICAgICAgICAgIGZsb2F0IHJldCA9IDA7Ci0KLSAgICAgICAgICAgIGlmIChydW5Jc1J0bCkgewotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0bXAgPSBUZXh0VXRpbHMuZ2V0UmV2ZXJzZSh0ZXh0LCBzdGFydCwgZW5kKTsKLSAgICAgICAgICAgICAgICAvLyBYWFg6IHRoaXMgYXNzdW1lcyBnZXRSZXZlcnNlIGRvZXNuJ3QgdHdlYWsgdGhlIGxlbmd0aCBvZgotICAgICAgICAgICAgICAgIC8vIHRoZSB0ZXh0Ci0gICAgICAgICAgICAgICAgaW50IHRtcGVuZCA9IGVuZCAtIHN0YXJ0OwotCi0gICAgICAgICAgICAgICAgaWYgKGNhbnZhcyAhPSBudWxsIHx8IG5lZWRXaWR0aCkKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gcGFpbnQubWVhc3VyZVRleHQodG1wLCAwLCB0bXBlbmQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNhbnZhcyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQodG1wLCAwLCB0bXBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0gcmV0LCB5LCBwYWludCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChuZWVkV2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IHBhaW50Lm1lYXN1cmVUZXh0KHRleHQsIHN0YXJ0LCBlbmQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNhbnZhcyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQodGV4dCwgc3RhcnQsIGVuZCwgeCwgeSwgcGFpbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZm1pICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwYWludC5nZXRGb250TWV0cmljc0ludChmbWkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmV0ICogZGlyOyAgIC8vIExheW91dC5ESVJfUklHSFRfVE9fTEVGVCA9PSAtMQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmbG9hdCBveCA9IHg7Ci0gICAgICAgIGludCBtaW5Bc2NlbnQgPSAwLCBtYXhEZXNjZW50ID0gMCwgbWluVG9wID0gMCwgbWF4Qm90dG9tID0gMDsKLQotICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIHRleHQ7Ci0gICAgICAgIENsYXNzPD8+IGRpdmlzaW9uOwotCi0gICAgICAgIGlmIChjYW52YXMgPT0gbnVsbCkKLSAgICAgICAgICAgIGRpdmlzaW9uID0gTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzczsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZGl2aXNpb24gPSBDaGFyYWN0ZXJTdHlsZS5jbGFzczsKLQotICAgICAgICBpbnQgbmV4dDsKLSAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpID0gbmV4dCkgewotICAgICAgICAgICAgbmV4dCA9IHNwLm5leHRTcGFuVHJhbnNpdGlvbihpLCBlbmQsIGRpdmlzaW9uKTsKLQotICAgICAgICAgICAgLy8gWFhYOiBpZiBkaXIgYW5kIHJ1bklzUnRsIHdlcmUgbm90IHRoZSBzYW1lLCB0aGlzIHdvdWxkIGRyYXcKLSAgICAgICAgICAgIC8vIHNwYW5zIGluIHRoZSB3cm9uZyBvcmRlciwgYnV0IG5vIG9uZSBhcHBlYXJzIHRvIGNhbGwgaXQgdGhpcwotICAgICAgICAgICAgLy8gd2F5LgotICAgICAgICAgICAgeCArPSBkcmF3VW5pZm9ybVJ1bihjYW52YXMsIHNwLCBpLCBuZXh0LCBkaXIsIHJ1bklzUnRsLAotICAgICAgICAgICAgICAgICAgeCwgdG9wLCB5LCBib3R0b20sIGZtaSwgcGFpbnQsIHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgIG5lZWRXaWR0aCB8fCBuZXh0ICE9IGVuZCk7Ci0KLSAgICAgICAgICAgIGlmIChmbWkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChmbWkuYXNjZW50IDwgbWluQXNjZW50KQotICAgICAgICAgICAgICAgICAgICBtaW5Bc2NlbnQgPSBmbWkuYXNjZW50OwotICAgICAgICAgICAgICAgIGlmIChmbWkuZGVzY2VudCA+IG1heERlc2NlbnQpCi0gICAgICAgICAgICAgICAgICAgIG1heERlc2NlbnQgPSBmbWkuZGVzY2VudDsKLQotICAgICAgICAgICAgICAgIGlmIChmbWkudG9wIDwgbWluVG9wKQotICAgICAgICAgICAgICAgICAgICBtaW5Ub3AgPSBmbWkudG9wOwotICAgICAgICAgICAgICAgIGlmIChmbWkuYm90dG9tID4gbWF4Qm90dG9tKQotICAgICAgICAgICAgICAgICAgICBtYXhCb3R0b20gPSBmbWkuYm90dG9tOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZtaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgcGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm1pKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm1pLmFzY2VudCA9IG1pbkFzY2VudDsKLSAgICAgICAgICAgICAgICBmbWkuZGVzY2VudCA9IG1heERlc2NlbnQ7Ci0gICAgICAgICAgICAgICAgZm1pLnRvcCA9IG1pblRvcDsKLSAgICAgICAgICAgICAgICBmbWkuYm90dG9tID0gbWF4Qm90dG9tOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHggLSBveDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEcmF3cyBhIHVuaWRpcmVjdGlvbmFsIHJ1biBvZiB0ZXh0IG9uIGEgc2luZ2xlIGxpbmUsIGFuZCBvcHRpb25hbGx5Ci0gICAgICogcmV0dXJucyB0aGUgc2lnbmVkIGFkdmFuY2UuICBVbmxpa2UgZHJhd0RpcmVjdGlvbmFsUnVuLCB0aGUgcGFyYWdyYXBoCi0gICAgICogZGlyZWN0aW9uIGFuZCBydW4gZGlyZWN0aW9uIGNhbiBiZSBkaWZmZXJlbnQuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmxvYXQgZHJhd1RleHQoQ2FudmFzIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLCBib29sZWFuIHJ1bklzUnRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkV2lkdGgpIHsKLSAgICAgICAgLy8gWFhYIHRoaXMgbG9naWMgaXMgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCkgPT0gcnVuSXNSdGwKLSAgICAgICAgaWYgKChkaXIgPT0gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUICYmICFydW5Jc1J0bCkgfHwKLSAgICAgICAgICAgIChydW5Jc1J0bCAmJiBkaXIgPT0gTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUKSkgewotICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBuZWVkcyB0aGUgcmVhbCBkaXJlY3Rpb24KLSAgICAgICAgICAgIGZsb2F0IGNoID0gZHJhd0RpcmVjdGlvbmFsUnVuKG51bGwsIHRleHQsIHN0YXJ0LCBlbmQsCi0gICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJfTEVGVF9UT19SSUdIVCwgZmFsc2UsIDAsIDAsIDAsIDAsIG51bGwsIHBhaW50LAotICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQsIHRydWUpOwotCi0gICAgICAgICAgICBjaCAqPSBkaXI7ICAvLyBESVJfUklHSFRfVE9fTEVGVCA9PSAtMQotICAgICAgICAgICAgZHJhd0RpcmVjdGlvbmFsUnVuKGNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwgLWRpciwKLSAgICAgICAgICAgICAgICAgICAgcnVuSXNSdGwsIHggKyBjaCwgdG9wLCB5LCBib3R0b20sIG51bGwsIHBhaW50LAotICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQsIHRydWUpOwotCi0gICAgICAgICAgICByZXR1cm4gY2g7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZHJhd0RpcmVjdGlvbmFsUnVuKGNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwgZGlyLCBydW5Jc1J0bCwKLSAgICAgICAgICAgICAgICAgICAgICAgeCwgdG9wLCB5LCBib3R0b20sIG51bGwsIHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIG5lZWRXaWR0aCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIERyYXdzIGEgcnVuIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZSwgd2l0aCBpdHMKLSAgICAgKiBvcmlnaW4gYXQgKHgseSksIGluIHRoZSBzcGVjaWZpZWQgUGFpbnQuIFRoZSBvcmlnaW4gaXMgaW50ZXJwcmV0ZWQgYmFzZWQKLSAgICAgKiBvbiB0aGUgQWxpZ24gc2V0dGluZyBpbiB0aGUgUGFpbnQuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBjb25zaWRlcnMgc3R5bGUgaW5mb3JtYXRpb24gaW4gdGhlIHRleHQgKGUuZy4gZXZlbiB3aGVuIHRleHQKLSAgICAgKiBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgYW5kcm9pZC50ZXh0LlNwYW5uZWR9LCB0aGlzIG1ldGhvZCBjb3JyZWN0bHkKLSAgICAgKiBkcmF3cyB0aGUgdGV4dCkuIFNlZSBhbHNvCi0gICAgICoge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzI2RyYXdUZXh0KENoYXJTZXF1ZW5jZSwgaW50LCBpbnQsIGZsb2F0LAotICAgICAqIGZsb2F0LCBQYWludCl9IGFuZAotICAgICAqIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNkcmF3UmVjdChmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwKLSAgICAgKiBQYWludCl9LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjYW52YXMgVGhlIHRhcmdldCBjYW52YXMKLSAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBiZSBkcmF3bgotICAgICAqIEBwYXJhbSBzdGFydCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0ZXh0IHRvIGRyYXcKLSAgICAgKiBAcGFyYW0gZW5kIChlbmQgLSAxKSBpcyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRleHQgdG8gZHJhdwotICAgICAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiBvZiB0aGUgdGV4dC4gVGhpcyBtdXN0IGJlCi0gICAgICogICAgICAgIHtAbGluayBhbmRyb2lkLnRleHQuTGF5b3V0I0RJUl9MRUZUX1RPX1JJR0hUfSBvcgotICAgICAqICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXh0LkxheW91dCNESVJfUklHSFRfVE9fTEVGVH0uCi0gICAgICogQHBhcmFtIHggVGhlIHgtY29vcmRpbmF0ZSBvZiBvcmlnaW4gZm9yIHdoZXJlIHRvIGRyYXcgdGhlIHRleHQKLSAgICAgKiBAcGFyYW0gdG9wIFRoZSB0b3Agc2lkZSBvZiB0aGUgcmVjdGFuZ2xlIHRvIGJlIGRyYXduCi0gICAgICogQHBhcmFtIHkgVGhlIHktY29vcmRpbmF0ZSBvZiBvcmlnaW4gZm9yIHdoZXJlIHRvIGRyYXcgdGhlIHRleHQKLSAgICAgKiBAcGFyYW0gYm90dG9tIFRoZSBib3R0b20gc2lkZSBvZiB0aGUgcmVjdGFuZ2xlIHRvIGJlIGRyYXduCi0gICAgICogQHBhcmFtIHBhaW50IFRoZSBtYWluIHtAbGluayBUZXh0UGFpbnR9IG9iamVjdC4KLSAgICAgKiBAcGFyYW0gd29ya1BhaW50IFRoZSB7QGxpbmsgVGV4dFBhaW50fSBvYmplY3QgdXNlZCBmb3IgdGVtcG9yYWwKLSAgICAgKiAgICAgICAgd29ya3NwYWNlLgotICAgICAqIEBwYXJhbSBuZWVkV2lkdGggSWYgdHJ1ZSwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgd2lkdGggb2YgZHJhd24gdGV4dAotICAgICAqIEByZXR1cm4gV2lkdGggb2YgdGhlIGRyYXduIHRleHQgaWYgbmVlZFdpZHRoIGlzIHRydWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZsb2F0IGRyYXdUZXh0KENhbnZhcyBjYW52YXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZFdpZHRoKSB7Ci0gICAgICAgIC8vIEZvciBzYWZldHkuCi0gICAgICAgIGRpcmVjdGlvbiA9IGRpcmVjdGlvbiA+PSAwID8gTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUCi0gICAgICAgICAgICAgICAgOiBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQ7Ci0KLSAgICAgICAgLy8gSGlkZSBydW5Jc1J0bCBwYXJhbWV0ZXIgc2luY2UgaXQgaXMgbWVhbmluZ2xlc3MgZm9yIGV4dGVybmFsCi0gICAgICAgIC8vIGRldmVsb3BlcnMuCi0gICAgICAgIC8vIFhYWDogdGhlIHJ1bklzUnRsIHByb2JhYmx5IG91Z2h0IHRvIGJlIHRoZSBzYW1lIGFzIGRpcmVjdGlvbiwgdGhlbgotICAgICAgICAvLyB0aGlzIGNvdWxkIGRyYXcgcnRsIHRleHQuCi0gICAgICAgIHJldHVybiBkcmF3VGV4dChjYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIGRpcmVjdGlvbiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB4LCB0b3AsIHksIGJvdHRvbSwgcGFpbnQsIHdvcmtQYWludCwgbmVlZFdpZHRoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgd2lkdGggb2YgYSBydW4gb2YgbGVmdC10by1yaWdodCB0ZXh0IG9uIGEgc2luZ2xlIGxpbmUsCi0gICAgICogY29uc2lkZXJpbmcgc3R5bGUgaW5mb3JtYXRpb24gaW4gdGhlIHRleHQgKGUuZy4gZXZlbiB3aGVuIHRleHQgaXMgYW4KLSAgICAgKiBpbnN0YW5jZSBvZiB7QGxpbmsgYW5kcm9pZC50ZXh0LlNwYW5uZWR9LCB0aGlzIG1ldGhvZCBjb3JyZWN0bHkgbWVhc3VyZXMKLSAgICAgKiB0aGUgd2lkdGggb2YgdGhlIHRleHQpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYWludCB0aGUgbWFpbiB7QGxpbmsgVGV4dFBhaW50fSBvYmplY3Q7IHdpbGwgbm90IGJlIG1vZGlmaWVkCi0gICAgICogQHBhcmFtIHdvcmtQYWludCB0aGUge0BsaW5rIFRleHRQYWludH0gb2JqZWN0IGF2YWlsYWJsZSBmb3IgbW9kaWZpY2F0aW9uOwotICAgICAqICAgICAgICB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSB1c2VkCi0gICAgICogQHBhcmFtIHRleHQgdGhlIHRleHQgdG8gbWVhc3VyZQotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciB0byBzdGFydCBtZWFzdXJpbmcKLSAgICAgKiBAcGFyYW0gZW5kIDEgYmV5b25kIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgdG8gbWVhc3VyZQotICAgICAqIEBwYXJhbSBmbWkgRm9udE1ldHJpY3MgaW5mb3JtYXRpb247IGNhbiBiZSBudWxsCi0gICAgICogQHJldHVybiBUaGUgd2lkdGggb2YgdGhlIHRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZsb2F0IG1lYXN1cmVUZXh0KFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm1pKSB7Ci0gICAgICAgIHJldHVybiBkcmF3RGlyZWN0aW9uYWxSdW4obnVsbCwgdGV4dCwgc3RhcnQsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hULCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgZm1pLCBwYWludCwgd29ya1BhaW50LCB0cnVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRMaW5lLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRMaW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3NDgyYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dExpbmUuamF2YQpAQCAtMCwwICsxLDk0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXh0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LkZvbnRNZXRyaWNzSW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dC5EaXJlY3Rpb25zOworaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQuVGFiU3RvcHM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkNoYXJhY3RlclN0eWxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5NZXRyaWNBZmZlY3RpbmdTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5SZXBsYWNlbWVudFNwYW47CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgbGluZSBvZiBzdHlsZWQgdGV4dCwgZm9yIG1lYXN1cmluZyBpbiB2aXN1YWwgb3JkZXIgYW5kCisgKiBmb3IgcmVuZGVyaW5nLgorICoKKyAqIDxwPkdldCBhIG5ldyBpbnN0YW5jZSB1c2luZyBvYnRhaW4oKSwgYW5kIHdoZW4gZmluaXNoZWQgd2l0aCBpdCwgcmV0dXJuIGl0CisgKiB0byB0aGUgcG9vbCB1c2luZyByZWN5Y2xlKCkuCisgKgorICogPHA+Q2FsbCBzZXQgdG8gcHJlcGFyZSB0aGUgaW5zdGFuY2UgZm9yIHVzZSwgdGhlbiBlaXRoZXIgZHJhdywgbWVhc3VyZSwKKyAqIG1ldHJpY3MsIG9yIGNhcmV0VG9MZWZ0UmlnaHRPZi4KKyAqCisgKiBAaGlkZQorICovCitjbGFzcyBUZXh0TGluZSB7CisgICAgcHJpdmF0ZSBUZXh0UGFpbnQgbVBhaW50OworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UZXh0OworICAgIHByaXZhdGUgaW50IG1TdGFydDsKKyAgICBwcml2YXRlIGludCBtTGVuOworICAgIHByaXZhdGUgaW50IG1EaXI7CisgICAgcHJpdmF0ZSBEaXJlY3Rpb25zIG1EaXJlY3Rpb25zOworICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzVGFiczsKKyAgICBwcml2YXRlIFRhYlN0b3BzIG1UYWJzOworICAgIHByaXZhdGUgY2hhcltdIG1DaGFyczsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUNoYXJzVmFsaWQ7CisgICAgcHJpdmF0ZSBTcGFubmVkIG1TcGFubmVkOworICAgIHByaXZhdGUgZmluYWwgVGV4dFBhaW50IG1Xb3JrUGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBUZXh0TGluZVtdIGNhY2hlZCA9IG5ldyBUZXh0TGluZVszXTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgVGV4dExpbmUgZnJvbSB0aGUgc2hhcmVkIHBvb2wuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIHVuaW5pdGlhbGl6ZWQgVGV4dExpbmUKKyAgICAgKi8KKyAgICBzdGF0aWMgVGV4dExpbmUgb2J0YWluKCkgeworICAgICAgICBUZXh0TGluZSB0bDsKKyAgICAgICAgc3luY2hyb25pemVkIChjYWNoZWQpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBjYWNoZWQubGVuZ3RoOyAtLWkgPj0gMDspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGVkW2ldICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGwgPSBjYWNoZWRbaV07CisgICAgICAgICAgICAgICAgICAgIGNhY2hlZFtpXSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGwgPSBuZXcgVGV4dExpbmUoKTsKKyAgICAgICAgTG9nLnYoIlRMSU5FIiwgIm5ldzogIiArIHRsKTsKKyAgICAgICAgcmV0dXJuIHRsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dHMgYSBUZXh0TGluZSBiYWNrIGludG8gdGhlIHNoYXJlZCBwb29sLiBEbyBub3QgdXNlIHRoaXMgVGV4dExpbmUgb25jZQorICAgICAqIGl0IGhhcyBiZWVuIHJldHVybmVkLgorICAgICAqIEBwYXJhbSB0bCB0aGUgdGV4dExpbmUKKyAgICAgKiBAcmV0dXJuIG51bGwsIGFzIGEgY29udmVuaWVuY2UgZnJvbSBjbGVhcmluZyByZWZlcmVuY2VzIHRvIHRoZSBwcm92aWRlZAorICAgICAqIFRleHRMaW5lCisgICAgICovCisgICAgc3RhdGljIFRleHRMaW5lIHJlY3ljbGUoVGV4dExpbmUgdGwpIHsKKyAgICAgICAgdGwubVRleHQgPSBudWxsOworICAgICAgICB0bC5tUGFpbnQgPSBudWxsOworICAgICAgICB0bC5tRGlyZWN0aW9ucyA9IG51bGw7CisgICAgICAgIGlmICh0bC5tTGVuIDwgMjUwKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQoY2FjaGVkKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWNoZWQubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFtpXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRbaV0gPSB0bDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIGEgVGV4dExpbmUgYW5kIHByZXBhcmVzIGl0IGZvciB1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFpbnQgdGhlIGJhc2UgcGFpbnQgZm9yIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHRleHQgdGhlIHRleHQsIGNhbiBiZSBTdHlsZWQKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIHJlbGF0aXZlIHRvIHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW1pdCBvZiB0aGUgbGluZSByZWxhdGl2ZSB0byB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBkaXIgdGhlIHBhcmFncmFwaCBkaXJlY3Rpb24gb2YgdGhpcyBsaW5lCisgICAgICogQHBhcmFtIGRpcmVjdGlvbnMgdGhlIGRpcmVjdGlvbnMgaW5mb3JtYXRpb24gb2YgdGhpcyBsaW5lCisgICAgICogQHBhcmFtIGhhc1RhYnMgdHJ1ZSBpZiB0aGUgbGluZSBtaWdodCBjb250YWluIHRhYnMgb3IgZW1vamkKKyAgICAgKiBAcGFyYW0gdGFiU3RvcHMgdGhlIHRhYlN0b3BzLiBDYW4gYmUgbnVsbC4KKyAgICAgKi8KKyAgICB2b2lkIHNldChUZXh0UGFpbnQgcGFpbnQsIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBsaW1pdCwgaW50IGRpciwKKyAgICAgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucywgYm9vbGVhbiBoYXNUYWJzLCBUYWJTdG9wcyB0YWJTdG9wcykgeworICAgICAgICBtUGFpbnQgPSBwYWludDsKKyAgICAgICAgbVRleHQgPSB0ZXh0OworICAgICAgICBtU3RhcnQgPSBzdGFydDsKKyAgICAgICAgbUxlbiA9IGxpbWl0IC0gc3RhcnQ7CisgICAgICAgIG1EaXIgPSBkaXI7CisgICAgICAgIG1EaXJlY3Rpb25zID0gZGlyZWN0aW9uczsKKyAgICAgICAgbUhhc1RhYnMgPSBoYXNUYWJzOworICAgICAgICBtU3Bhbm5lZCA9IG51bGw7CisKKyAgICAgICAgYm9vbGVhbiBoYXNSZXBsYWNlbWVudCA9IGZhbHNlOworICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKKyAgICAgICAgICAgIG1TcGFubmVkID0gKFNwYW5uZWQpIHRleHQ7CisgICAgICAgICAgICBoYXNSZXBsYWNlbWVudCA9IG1TcGFubmVkLmdldFNwYW5zKHN0YXJ0LCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgUmVwbGFjZW1lbnRTcGFuLmNsYXNzKS5sZW5ndGggPiAwOworICAgICAgICB9CisKKyAgICAgICAgbUNoYXJzVmFsaWQgPSBoYXNSZXBsYWNlbWVudCB8fCBoYXNUYWJzIHx8CisgICAgICAgICAgICBkaXJlY3Rpb25zICE9IExheW91dC5ESVJTX0FMTF9MRUZUX1RPX1JJR0hUOworCisgICAgICAgIGlmIChtQ2hhcnNWYWxpZCkgeworICAgICAgICAgICAgaWYgKG1DaGFycyA9PSBudWxsIHx8IG1DaGFycy5sZW5ndGggPCBtTGVuKSB7CisgICAgICAgICAgICAgICAgbUNoYXJzID0gbmV3IGNoYXJbQXJyYXlVdGlscy5pZGVhbENoYXJBcnJheVNpemUobUxlbildOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBsaW1pdCwgbUNoYXJzLCAwKTsKKyAgICAgICAgICAgIGlmIChoYXNSZXBsYWNlbWVudCkgeworICAgICAgICAgICAgICAgIC8vIEhhbmRsZSB0aGVzZSBhbGwgYXQgb25jZSBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIGl0IGFzIHdlIGdvLgorICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBlYWNoIHJlcGxhY2VtZW50IHJ1biB3aXRoIHRoZQorICAgICAgICAgICAgICAgIC8vIG9iamVjdC1yZXBsYWNlbWVudCBjaGFyYWN0ZXIgYW5kIHRoZSByZW1haW5kZXIgd2l0aCB6ZXJvIHdpZHRoCisgICAgICAgICAgICAgICAgLy8gbm9uLWJyZWFrIHNwYWNlIGFrYSBCT00uICBDdXJzb3IgbW92ZW1lbnQgY29kZSBza2lwcyB0aGVzZQorICAgICAgICAgICAgICAgIC8vIHplcm8td2lkdGggY2hhcmFjdGVycy4KKyAgICAgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBtQ2hhcnM7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBpbmV4dDsgaSA8IGxpbWl0OyBpID0gaW5leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5leHQgPSBtU3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24oaSwgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwbGFjZW1lbnRTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TcGFubmVkLmdldFNwYW5zKGksIGluZXh0LCBSZXBsYWNlbWVudFNwYW4uY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCA+IDApIHsgLy8gdHJhbnNpdGlvbiBpbnRvIGEgc3BhbgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNbaSAtIHN0YXJ0XSA9ICdcdWZmZmMnOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgLSBzdGFydCArIDEsIGUgPSBpbmV4dCAtIHN0YXJ0OyBqIDwgZTsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNbal0gPSAnXHVmZWZmJzsgLy8gdXNlZCBhcyBaV05CUywgbWFya3MgcG9zaXRpb25zIHRvIHNraXAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtVGFicyA9IHRhYlN0b3BzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbmRlcnMgdGhlIFRleHRMaW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGMgdGhlIGNhbnZhcyB0byByZW5kZXIgb24KKyAgICAgKiBAcGFyYW0geCB0aGUgbGVhZGluZyBtYXJnaW4gcG9zaXRpb24KKyAgICAgKiBAcGFyYW0gdG9wIHRoZSB0b3Agb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0geSB0aGUgYmFzZWxpbmUKKyAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20gb2YgdGhlIGxpbmUKKyAgICAgKi8KKyAgICB2b2lkIGRyYXcoQ2FudmFzIGMsIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tKSB7CisgICAgICAgIGlmICghbUhhc1RhYnMpIHsKKyAgICAgICAgICAgIGlmIChtRGlyZWN0aW9ucyA9PSBMYXlvdXQuRElSU19BTExfTEVGVF9UT19SSUdIVCkgeworICAgICAgICAgICAgICAgIGRyYXdSdW4oYywgMCwgMCwgbUxlbiwgZmFsc2UsIHgsIHRvcCwgeSwgYm90dG9tLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1EaXJlY3Rpb25zID09IExheW91dC5ESVJTX0FMTF9SSUdIVF9UT19MRUZUKSB7CisgICAgICAgICAgICAgICAgZHJhd1J1bihjLCAwLCAwLCBtTGVuLCB0cnVlLCB4LCB0b3AsIHksIGJvdHRvbSwgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGggPSAwOworICAgICAgICBpbnRbXSBydW5zID0gbURpcmVjdGlvbnMubURpcmVjdGlvbnM7CisgICAgICAgIFJlY3RGIGVtb2ppUmVjdCA9IG51bGw7CisKKyAgICAgICAgaW50IGxhc3RSdW5JbmRleCA9IHJ1bnMubGVuZ3RoIC0gMjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgcnVuU3RhcnQgPSBydW5zW2ldOworICAgICAgICAgICAgaW50IHJ1bkxpbWl0ID0gcnVuU3RhcnQgKyAocnVuc1tpKzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpZiAocnVuTGltaXQgPiBtTGVuKSB7CisgICAgICAgICAgICAgICAgcnVuTGltaXQgPSBtTGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhbiBydW5Jc1J0bCA9IChydW5zW2krMV0gJiBMYXlvdXQuUlVOX1JUTF9GTEFHKSAhPSAwOworCisgICAgICAgICAgICBpbnQgc2Vnc3RhcnQgPSBydW5TdGFydDsKKyAgICAgICAgICAgIGNoYXJbXSBjaGFycyA9IG1DaGFyczsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBtSGFzVGFicyA/IHJ1blN0YXJ0IDogcnVuTGltaXQ7IGogPD0gcnVuTGltaXQ7IGorKykgeworICAgICAgICAgICAgICAgIGludCBjb2RlcHQgPSAwOworICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBpZiAobUhhc1RhYnMgJiYgaiA8IHJ1bkxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGVwdCA9IG1DaGFyc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA+PSAweGQ4MDAgJiYgY29kZXB0IDwgMHhkYzAwICYmIGogKyAxIDwgcnVuTGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVwdCA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChtQ2hhcnMsIGopOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA+PSBMYXlvdXQuTUlOX0VNT0pJICYmIGNvZGVwdCA8PSBMYXlvdXQuTUFYX0VNT0pJKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm0gPSBMYXlvdXQuRU1PSklfRkFDVE9SWS5nZXRCaXRtYXBGcm9tQW5kcm9pZFB1YShjb2RlcHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlcHQgPiAweGZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2o7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaiA9PSBydW5MaW1pdCB8fCBjb2RlcHQgPT0gJ1x0JyB8fCBibSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGggKz0gZHJhd1J1bihjLCBpLCBzZWdzdGFydCwgaiwgcnVuSXNSdGwsIHgraCwgdG9wLCB5LCBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAhPSBsYXN0UnVuSW5kZXggfHwgaiAhPSBtTGVuKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID09ICdcdCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGggPSBtRGlyICogbmV4dFRhYihoICogbURpcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm1Bc2NlbnQgPSBhc2NlbnQoaik7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBiaXRtYXBIZWlnaHQgPSBibS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gLWJtQXNjZW50IC8gYml0bWFwSGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkdGggPSBibS5nZXRXaWR0aCgpICogc2NhbGU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbW9qaVJlY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppUmVjdCA9IG5ldyBSZWN0RigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlSZWN0LnNldCh4ICsgaCwgeSArIGJtQXNjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ICsgaCArIHdpZHRoLCB5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuZHJhd0JpdG1hcChibSwgbnVsbCwgZW1vamlSZWN0LCBtUGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaCArPSB3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZWdzdGFydCA9IGogKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgbWV0cmljcyBpbmZvcm1hdGlvbiBmb3IgdGhlIGVudGlyZSBsaW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGZtaSByZWNlaXZlcyBmb250IG1ldHJpY3MgaW5mb3JtYXRpb24sIGNhbiBiZSBudWxsCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIG9mIHRoZSBsaW5lCisgICAgICovCisgICAgZmxvYXQgbWV0cmljcyhGb250TWV0cmljc0ludCBmbWkpIHsKKyAgICAgICAgcmV0dXJuIG1lYXN1cmUobUxlbiwgZmFsc2UsIGZtaSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBhIHBvc2l0aW9uIG9uIHRoZSBsaW5lLgorICAgICAqCisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgbGluZS1yZWxhdGl2ZSBjaGFyYWN0ZXIgb2Zmc2V0LCBiZXR3ZWVuIDAgYW5kIHRoZQorICAgICAqIGxpbmUgbGVuZ3RoLCBpbmNsdXNpdmUKKyAgICAgKiBAcGFyYW0gdHJhaWxpbmcgdHJ1ZSB0byBtZWFzdXJlIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSBjaGFyYWN0ZXIKKyAgICAgKiBiZWZvcmUgb2Zmc2V0LCBmYWxzZSB0byBtZWFzdXJlIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIGNoYXJhY3RlcgorICAgICAqIGF0IG9mZnNldC4KKyAgICAgKiBAcGFyYW0gZm1pIHJlY2VpdmVzIG1ldHJpY3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVlc3RlZAorICAgICAqIGNoYXJhY3RlciwgY2FuIGJlIG51bGwuCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIG9mZnNldCBmcm9tIHRoZSBsZWFkaW5nIG1hcmdpbiB0byB0aGUgcmVxdWVzdGVkCisgICAgICogY2hhcmFjdGVyIGVkZ2UuCisgICAgICovCisgICAgZmxvYXQgbWVhc3VyZShpbnQgb2Zmc2V0LCBib29sZWFuIHRyYWlsaW5nLCBGb250TWV0cmljc0ludCBmbWkpIHsKKyAgICAgICAgaW50IHRhcmdldCA9IHRyYWlsaW5nID8gb2Zmc2V0IC0gMSA6IG9mZnNldDsKKyAgICAgICAgaWYgKHRhcmdldCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgaCA9IDA7CisKKyAgICAgICAgaWYgKCFtSGFzVGFicykgeworICAgICAgICAgICAgaWYgKG1EaXJlY3Rpb25zID09IExheW91dC5ESVJTX0FMTF9MRUZUX1RPX1JJR0hUKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmVSdW4oMCwgMCwgb2Zmc2V0LCBtTGVuLCBmYWxzZSwgZm1pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRGlyZWN0aW9ucyA9PSBMYXlvdXQuRElSU19BTExfUklHSFRfVE9fTEVGVCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtZWFzdXJlUnVuKDAsIDAsIG9mZnNldCwgbUxlbiwgdHJ1ZSwgZm1pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNoYXJbXSBjaGFycyA9IG1DaGFyczsKKyAgICAgICAgaW50W10gcnVucyA9IG1EaXJlY3Rpb25zLm1EaXJlY3Rpb25zOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bnMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGludCBydW5TdGFydCA9IHJ1bnNbaV07CisgICAgICAgICAgICBpbnQgcnVuTGltaXQgPSBydW5TdGFydCArIChydW5zW2krMV0gJiBMYXlvdXQuUlVOX0xFTkdUSF9NQVNLKTsKKyAgICAgICAgICAgIGlmIChydW5MaW1pdCA+IG1MZW4pIHsKKyAgICAgICAgICAgICAgICBydW5MaW1pdCA9IG1MZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sZWFuIHJ1bklzUnRsID0gKHJ1bnNbaSsxXSAmIExheW91dC5SVU5fUlRMX0ZMQUcpICE9IDA7CisKKyAgICAgICAgICAgIGludCBzZWdzdGFydCA9IHJ1blN0YXJ0OworICAgICAgICAgICAgZm9yIChpbnQgaiA9IG1IYXNUYWJzID8gcnVuU3RhcnQgOiBydW5MaW1pdDsgaiA8PSBydW5MaW1pdDsgaisrKSB7CisgICAgICAgICAgICAgICAgaW50IGNvZGVwdCA9IDA7CisgICAgICAgICAgICAgICAgQml0bWFwIGJtID0gbnVsbDsKKworICAgICAgICAgICAgICAgIGlmIChtSGFzVGFicyAmJiBqIDwgcnVuTGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZXB0ID0gY2hhcnNbal07CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gMHhkODAwICYmIGNvZGVwdCA8IDB4ZGMwMCAmJiBqICsgMSA8IHJ1bkxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQoY2hhcnMsIGopOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA+PSBMYXlvdXQuTUlOX0VNT0pJICYmIGNvZGVwdCA8PSBMYXlvdXQuTUFYX0VNT0pJKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm0gPSBMYXlvdXQuRU1PSklfRkFDVE9SWS5nZXRCaXRtYXBGcm9tQW5kcm9pZFB1YShjb2RlcHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlcHQgPiAweGZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2o7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaiA9PSBydW5MaW1pdCB8fCBjb2RlcHQgPT0gJ1x0JyB8fCBibSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5TZWdtZW50ID0gdGFyZ2V0ID49IHNlZ3N0YXJ0ICYmIHRhcmdldCA8IGo7CisKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhZHZhbmNlID0gKG1EaXIgPT0gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUKSA9PSBydW5Jc1J0bDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluU2VnbWVudCAmJiBhZHZhbmNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaCArPSBtZWFzdXJlUnVuKGksIHNlZ3N0YXJ0LCBvZmZzZXQsIGosIHJ1bklzUnRsLCBmbWkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgdyA9IG1lYXN1cmVSdW4oaSwgc2Vnc3RhcnQsIGosIGosIHJ1bklzUnRsLCBmbWkpOworICAgICAgICAgICAgICAgICAgICBoICs9IGFkdmFuY2UgPyB3IDogLXc7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluU2VnbWVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGggKz0gbWVhc3VyZVJ1bihpLCBzZWdzdGFydCwgb2Zmc2V0LCBqLCBydW5Jc1J0bCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID09ICdcdCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gaikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaCA9IG1EaXIgKiBuZXh0VGFiKGggKiBtRGlyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gaikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJtQXNjZW50ID0gYXNjZW50KGopOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkID0gYm0uZ2V0V2lkdGgoKSAqIC1ibUFzY2VudCAvIGJtLmdldEhlaWdodCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaCArPSBtRGlyICogd2lkOworICAgICAgICAgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc2Vnc3RhcnQgPSBqICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEcmF3cyBhIHVuaWRpcmVjdGlvbmFsIChidXQgcG9zc2libHkgbXVsdGktc3R5bGVkKSBydW4gb2YgdGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIHRoZSBjYW52YXMgdG8gZHJhdyBvbgorICAgICAqIEBwYXJhbSBydW5JbmRleCB0aGUgaW5kZXggb2YgdGhpcyBkaXJlY3Rpb25hbCBydW4KKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGxpbmUtcmVsYXRpdmUgc3RhcnQKKyAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbmUtcmVsYXRpdmUgbGltaXQKKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0geCB0aGUgcG9zaXRpb24gb2YgdGhlIHJ1biB0aGF0IGlzIGNsb3Nlc3QgdG8gdGhlIGxlYWRpbmcgbWFyZ2luCisgICAgICogQHBhcmFtIHRvcCB0aGUgdG9wIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHkgdGhlIGJhc2VsaW5lCisgICAgICogQHBhcmFtIGJvdHRvbSB0aGUgYm90dG9tIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIG5lZWRXaWR0aCB0cnVlIGlmIHRoZSB3aWR0aCB2YWx1ZSBpcyByZXF1aXJlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzaWduZWQgd2lkdGggb2YgdGhlIHJ1biwgYmFzZWQgb24gdGhlIHBhcmFncmFwaCBkaXJlY3Rpb24uCisgICAgICogT25seSB2YWxpZCBpZiBuZWVkV2lkdGggaXMgdHJ1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGRyYXdSdW4oQ2FudmFzIGMsIGludCBydW5JbmRleCwgaW50IHN0YXJ0LAorICAgICAgICAgICAgaW50IGxpbWl0LCBib29sZWFuIHJ1bklzUnRsLCBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKKyAgICAgICAgICAgIGJvb2xlYW4gbmVlZFdpZHRoKSB7CisKKyAgICAgICAgaWYgKChtRGlyID09IExheW91dC5ESVJfTEVGVF9UT19SSUdIVCkgPT0gcnVuSXNSdGwpIHsKKyAgICAgICAgICAgIGZsb2F0IHcgPSAtbWVhc3VyZVJ1bihydW5JbmRleCwgc3RhcnQsIGxpbWl0LCBsaW1pdCwgcnVuSXNSdGwsIG51bGwpOworICAgICAgICAgICAgaGFuZGxlUnVuKHJ1bkluZGV4LCBzdGFydCwgbGltaXQsIGxpbWl0LCBydW5Jc1J0bCwgYywgeCArIHcsIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgeSwgYm90dG9tLCBudWxsLCBmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gdzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBoYW5kbGVSdW4ocnVuSW5kZXgsIHN0YXJ0LCBsaW1pdCwgbGltaXQsIHJ1bklzUnRsLCBjLCB4LCB0b3AsCisgICAgICAgICAgICAgICAgeSwgYm90dG9tLCBudWxsLCBuZWVkV2lkdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1lYXN1cmVzIGEgdW5pZGlyZWN0aW9uYWwgKGJ1dCBwb3NzaWJseSBtdWx0aS1zdHlsZWQpIHJ1biBvZiB0ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIHJ1bkluZGV4IHRoZSBydW4gaW5kZXgKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGxpbmUtcmVsYXRpdmUgc3RhcnQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0byBtZWFzdXJlIHRvLCBiZXR3ZWVuIHN0YXJ0IGFuZCBsaW1pdCBpbmNsdXNpdmUKKyAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbmUtcmVsYXRpdmUgbGltaXQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBydW5Jc1J0bCB0cnVlIGlmIHRoZSBydW4gaXMgcmlnaHQtdG8tbGVmdAorICAgICAqIEBwYXJhbSBmbWkgcmVjZWl2ZXMgbWV0cmljcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVxdWVzdGVkCisgICAgICogcnVuLCBjYW4gYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzaWduZWQgd2lkdGggZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHJ1biB0byB0aGUgbGVhZGluZyBlZGdlCisgICAgICogb2YgdGhlIGNoYXJhY3RlciBhdCBvZmZzZXQsIGJhc2VkIG9uIHRoZSBydW4gKG5vdCBwYXJhZ3JhcGgpIGRpcmVjdGlvbgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbWVhc3VyZVJ1bihpbnQgcnVuSW5kZXgsIGludCBzdGFydCwKKyAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBsaW1pdCwgYm9vbGVhbiBydW5Jc1J0bCwgRm9udE1ldHJpY3NJbnQgZm1pKSB7CisgICAgICAgIHJldHVybiBoYW5kbGVSdW4ocnVuSW5kZXgsIHN0YXJ0LCBvZmZzZXQsIGxpbWl0LCBydW5Jc1J0bCwgbnVsbCwKKyAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCBmbWksIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdhbGsgdGhlIGN1cnNvciB0aHJvdWdoIHRoaXMgbGluZSwgc2tpcHBpbmcgY29uanVuY3RzIGFuZAorICAgICAqIHplcm8td2lkdGggY2hhcmFjdGVycy4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgZnVuY3Rpb24gY2Fubm90IHByb3Blcmx5IHdhbGsgdGhlIGN1cnNvciBvZmYgdGhlIGVuZHMgb2YgdGhlIGxpbmUKKyAgICAgKiBzaW5jZSBpdCBkb2VzIG5vdCBrbm93IGFib3V0IGFueSBzaGFwaW5nIG9uIHRoZSBwcmV2aW91cy9mb2xsb3dpbmcgbGluZQorICAgICAqIHRoYXQgbWlnaHQgYWZmZWN0IHRoZSBjdXJzb3IgcG9zaXRpb24uIENhbGxlcnMgbXVzdCBlaXRoZXIgYXZvaWQgdGhlc2UKKyAgICAgKiBzaXR1YXRpb25zIG9yIGhhbmRsZSB0aGUgcmVzdWx0IHNwZWNpYWxseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdXJzb3IgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IsIGJldHdlZW4gMCBhbmQgdGhlCisgICAgICogbGVuZ3RoIG9mIHRoZSBsaW5lLCBpbmNsdXNpdmUKKyAgICAgKiBAcGFyYW0gdG9MZWZ0IHRydWUgaWYgdGhlIGNhcmV0IGlzIG1vdmluZyB0byB0aGUgbGVmdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgb2Zmc2V0LiAgSWYgaXQgaXMgbGVzcyB0aGFuIDAgb3IgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGgKKyAgICAgKiBvZiB0aGUgbGluZSwgdGhlIHByZXZpb3VzL2ZvbGxvd2luZyBsaW5lIHNob3VsZCBiZSBleGFtaW5lZCB0byBnZXQgdGhlCisgICAgICogYWN0dWFsIG9mZnNldC4KKyAgICAgKi8KKyAgICBpbnQgZ2V0T2Zmc2V0VG9MZWZ0UmlnaHRPZihpbnQgY3Vyc29yLCBib29sZWFuIHRvTGVmdCkgeworICAgICAgICAvLyAxKSBUaGUgY2FyZXQgbWFya3MgdGhlIGxlYWRpbmcgZWRnZSBvZiBhIGNoYXJhY3Rlci4gVGhlIGNoYXJhY3RlcgorICAgICAgICAvLyBsb2dpY2FsbHkgYmVmb3JlIGl0IG1pZ2h0IGJlIG9uIGEgZGlmZmVyZW50IGxldmVsLCBhbmQgdGhlIGFjdGl2ZSBjYXJldAorICAgICAgICAvLyBwb3NpdGlvbiBpcyBvbiB0aGUgY2hhcmFjdGVyIGF0IHRoZSBsb3dlciBsZXZlbC4gSWYgdGhhdCBjaGFyYWN0ZXIKKyAgICAgICAgLy8gd2FzIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIsIHRoZSBjYXJldCBpcyBvbiBpdHMgdHJhaWxpbmcgZWRnZS4KKyAgICAgICAgLy8gMikgVGFrZSB0aGlzIGNoYXJhY3Rlci9lZGdlIGFuZCBtb3ZlIGl0IGluIHRoZSBpbmRpY2F0ZWQgZGlyZWN0aW9uLgorICAgICAgICAvLyBUaGlzIGdpdmVzIHlvdSBhIG5ldyBjaGFyYWN0ZXIgYW5kIGEgbmV3IGVkZ2UuCisgICAgICAgIC8vIDMpIFRoaXMgcG9zaXRpb24gaXMgYmV0d2VlbiB0d28gdmlzdWFsbHkgYWRqYWNlbnQgY2hhcmFjdGVycy4gIE9uZSBvZgorICAgICAgICAvLyB0aGVzZSBtaWdodCBiZSBhdCBhIGxvd2VyIGxldmVsLiAgVGhlIGFjdGl2ZSBwb3NpdGlvbiBpcyBvbiB0aGUKKyAgICAgICAgLy8gY2hhcmFjdGVyIGF0IHRoZSBsb3dlciBsZXZlbC4KKyAgICAgICAgLy8gNCkgSWYgdGhlIGFjdGl2ZSBwb3NpdGlvbiBpcyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgY2hhcmFjdGVyLAorICAgICAgICAvLyB0aGUgbmV3IGNhcmV0IHBvc2l0aW9uIGlzIHRoZSBmb2xsb3dpbmcgbG9naWNhbCBjaGFyYWN0ZXIsIGVsc2UgaXQKKyAgICAgICAgLy8gaXMgdGhlIGNoYXJhY3Rlci4KKworICAgICAgICBpbnQgbGluZVN0YXJ0ID0gMDsKKyAgICAgICAgaW50IGxpbmVFbmQgPSBtTGVuOworICAgICAgICBib29sZWFuIHBhcmFJc1J0bCA9IG1EaXIgPT0gLTE7CisgICAgICAgIGludFtdIHJ1bnMgPSBtRGlyZWN0aW9ucy5tRGlyZWN0aW9uczsKKworICAgICAgICBpbnQgcnVuSW5kZXgsIHJ1bkxldmVsID0gMCwgcnVuU3RhcnQgPSBsaW5lU3RhcnQsIHJ1bkxpbWl0ID0gbGluZUVuZCwgbmV3Q2FyZXQgPSAtMTsKKyAgICAgICAgYm9vbGVhbiB0cmFpbGluZyA9IGZhbHNlOworCisgICAgICAgIGlmIChjdXJzb3IgPT0gbGluZVN0YXJ0KSB7CisgICAgICAgICAgICBydW5JbmRleCA9IC0yOworICAgICAgICB9IGVsc2UgaWYgKGN1cnNvciA9PSBsaW5lRW5kKSB7CisgICAgICAgICAgICBydW5JbmRleCA9IHJ1bnMubGVuZ3RoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIEZpcnN0LCBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJ1biBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXIgd2l0aAorICAgICAgICAgIC8vIHRoZSBhY3RpdmUgY2FyZXQuCisgICAgICAgICAgZm9yIChydW5JbmRleCA9IDA7IHJ1bkluZGV4IDwgcnVucy5sZW5ndGg7IHJ1bkluZGV4ICs9IDIpIHsKKyAgICAgICAgICAgIHJ1blN0YXJ0ID0gbGluZVN0YXJ0ICsgcnVuc1tydW5JbmRleF07CisgICAgICAgICAgICBpZiAoY3Vyc29yID49IHJ1blN0YXJ0KSB7CisgICAgICAgICAgICAgIHJ1bkxpbWl0ID0gcnVuU3RhcnQgKyAocnVuc1tydW5JbmRleCsxXSAmIExheW91dC5SVU5fTEVOR1RIX01BU0spOworICAgICAgICAgICAgICBpZiAocnVuTGltaXQgPiBsaW5lRW5kKSB7CisgICAgICAgICAgICAgICAgICBydW5MaW1pdCA9IGxpbmVFbmQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKGN1cnNvciA8IHJ1bkxpbWl0KSB7CisgICAgICAgICAgICAgICAgcnVuTGV2ZWwgPSAocnVuc1tydW5JbmRleCsxXSA+Pj4gTGF5b3V0LlJVTl9MRVZFTF9TSElGVCkgJgorICAgICAgICAgICAgICAgICAgICBMYXlvdXQuUlVOX0xFVkVMX01BU0s7CisgICAgICAgICAgICAgICAgaWYgKGN1cnNvciA9PSBydW5TdGFydCkgeworICAgICAgICAgICAgICAgICAgLy8gVGhlIGNhcmV0IGlzIG9uIGEgcnVuIGJvdW5kYXJ5LCBzZWUgaWYgd2Ugc2hvdWxkCisgICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIHBvc2l0aW9uIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSBwcmV2aW91cworICAgICAgICAgICAgICAgICAgLy8gbG9naWNhbCBjaGFyYWN0ZXIgaW5zdGVhZC4KKyAgICAgICAgICAgICAgICAgIGludCBwcmV2UnVuSW5kZXgsIHByZXZSdW5MZXZlbCwgcHJldlJ1blN0YXJ0LCBwcmV2UnVuTGltaXQ7CisgICAgICAgICAgICAgICAgICBpbnQgcG9zID0gY3Vyc29yIC0gMTsKKyAgICAgICAgICAgICAgICAgIGZvciAocHJldlJ1bkluZGV4ID0gMDsgcHJldlJ1bkluZGV4IDwgcnVucy5sZW5ndGg7IHByZXZSdW5JbmRleCArPSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHByZXZSdW5TdGFydCA9IGxpbmVTdGFydCArIHJ1bnNbcHJldlJ1bkluZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBwcmV2UnVuU3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICBwcmV2UnVuTGltaXQgPSBwcmV2UnVuU3RhcnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAocnVuc1twcmV2UnVuSW5kZXgrMV0gJiBMYXlvdXQuUlVOX0xFTkdUSF9NQVNLKTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldlJ1bkxpbWl0ID4gbGluZUVuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2UnVuTGltaXQgPSBsaW5lRW5kOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zIDwgcHJldlJ1bkxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2UnVuTGV2ZWwgPSAocnVuc1twcmV2UnVuSW5kZXgrMV0gPj4+IExheW91dC5SVU5fTEVWRUxfU0hJRlQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBMYXlvdXQuUlVOX0xFVkVMX01BU0s7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldlJ1bkxldmVsIDwgcnVuTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgZnJvbSBsb2dpY2FsbHkgcHJldmlvdXMgY2hhcmFjdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JbmRleCA9IHByZXZSdW5JbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuTGV2ZWwgPSBwcmV2UnVuTGV2ZWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ID0gcHJldlJ1blN0YXJ0OworICAgICAgICAgICAgICAgICAgICAgICAgICBydW5MaW1pdCA9IHByZXZSdW5MaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBjYXJldCBtaWdodCBiZSA9PSBsaW5lRW5kLiAgVGhpcyBpcyBnZW5lcmFsbHkgYSBzcGFjZSBvciBwYXJhZ3JhcGgKKyAgICAgICAgICAvLyBzZXBhcmF0b3IgYW5kIGhhcyBhbiBhc3NvY2lhdGVkIHJ1biwgYnV0IG1pZ2h0IGJlIHRoZSBlbmQgb2YKKyAgICAgICAgICAvLyB0ZXh0LCBpbiB3aGljaCBjYXNlIGl0IGRvZXNuJ3QuICBJZiB0aGF0IGhhcHBlbnMsIHdlIHJhbiBvZmYgdGhlCisgICAgICAgICAgLy8gZW5kIG9mIHRoZSBydW4gbGlzdCwgYW5kIHJ1bkluZGV4ID09IHJ1bnMubGVuZ3RoLiAgSW4gdGhpcyBjYXNlLAorICAgICAgICAgIC8vIHdlIGFyZSBhdCBhIHJ1biBib3VuZGFyeSBzbyB3ZSBza2lwIHRoZSBiZWxvdyB0ZXN0LgorICAgICAgICAgIGlmIChydW5JbmRleCAhPSBydW5zLmxlbmd0aCkgeworICAgICAgICAgICAgICBib29sZWFuIHJ1bklzUnRsID0gKHJ1bkxldmVsICYgMHgxKSAhPSAwOworICAgICAgICAgICAgICBib29sZWFuIGFkdmFuY2UgPSB0b0xlZnQgPT0gcnVuSXNSdGw7CisgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gKGFkdmFuY2UgPyBydW5MaW1pdCA6IHJ1blN0YXJ0KSB8fCBhZHZhbmNlICE9IHRyYWlsaW5nKSB7CisgICAgICAgICAgICAgICAgICAvLyBNb3Zpbmcgd2l0aGluIG9yIGludG8gdGhlIHJ1biwgc28gd2UgY2FuIG1vdmUgbG9naWNhbGx5LgorICAgICAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBnZXRPZmZzZXRCZWZvcmVBZnRlcihydW5JbmRleCwgcnVuU3RhcnQsIHJ1bkxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBydW5Jc1J0bCwgY3Vyc29yLCBhZHZhbmNlKTsKKyAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBuZXcgcG9zaXRpb24gaXMgaW50ZXJuYWwgdG8gdGhlIHJ1biwgd2UncmUgYXQgdGhlIHN0cm9uZworICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24gYWxyZWFkeSBzbyB3ZSdyZSBmaW5pc2hlZC4KKyAgICAgICAgICAgICAgICAgIGlmIChuZXdDYXJldCAhPSAoYWR2YW5jZSA/IHJ1bkxpbWl0IDogcnVuU3RhcnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0NhcmV0OworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgbmV3Q2FyZXQgaXMgLTEsIHdlJ3JlIHN0YXJ0aW5nIGF0IGEgcnVuIGJvdW5kYXJ5IGFuZCBjcm9zc2luZworICAgICAgICAvLyBpbnRvIGFub3RoZXIgcnVuLiBPdGhlcndpc2Ugd2UndmUgYXJyaXZlZCBhdCBhIHJ1biBib3VuZGFyeSwgYW5kCisgICAgICAgIC8vIG5lZWQgdG8gZmlndXJlIG91dCB3aGljaCBjaGFyYWN0ZXIgdG8gYXR0YWNoIHRvLiAgTm90ZSB3ZSBtaWdodAorICAgICAgICAvLyBuZWVkIHRvIHJ1biB0aGlzIHR3aWNlLCBpZiB3ZSBjcm9zcyBhIHJ1biBib3VuZGFyeSBhbmQgZW5kIHVwIGF0CisgICAgICAgIC8vIGFub3RoZXIgcnVuIGJvdW5kYXJ5LgorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgIGJvb2xlYW4gYWR2YW5jZSA9IHRvTGVmdCA9PSBwYXJhSXNSdGw7CisgICAgICAgICAgaW50IG90aGVyUnVuSW5kZXggPSBydW5JbmRleCArIChhZHZhbmNlID8gMiA6IC0yKTsKKyAgICAgICAgICBpZiAob3RoZXJSdW5JbmRleCA+PSAwICYmIG90aGVyUnVuSW5kZXggPCBydW5zLmxlbmd0aCkgeworICAgICAgICAgICAgaW50IG90aGVyUnVuU3RhcnQgPSBsaW5lU3RhcnQgKyBydW5zW290aGVyUnVuSW5kZXhdOworICAgICAgICAgICAgaW50IG90aGVyUnVuTGltaXQgPSBvdGhlclJ1blN0YXJ0ICsKKyAgICAgICAgICAgIChydW5zW290aGVyUnVuSW5kZXgrMV0gJiBMYXlvdXQuUlVOX0xFTkdUSF9NQVNLKTsKKyAgICAgICAgICAgIGlmIChvdGhlclJ1bkxpbWl0ID4gbGluZUVuZCkgeworICAgICAgICAgICAgICAgIG90aGVyUnVuTGltaXQgPSBsaW5lRW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IG90aGVyUnVuTGV2ZWwgPSAocnVuc1tvdGhlclJ1bkluZGV4KzFdID4+PiBMYXlvdXQuUlVOX0xFVkVMX1NISUZUKSAmCisgICAgICAgICAgICAgICAgTGF5b3V0LlJVTl9MRVZFTF9NQVNLOworICAgICAgICAgICAgYm9vbGVhbiBvdGhlclJ1bklzUnRsID0gKG90aGVyUnVuTGV2ZWwgJiAxKSAhPSAwOworCisgICAgICAgICAgICBhZHZhbmNlID0gdG9MZWZ0ID09IG90aGVyUnVuSXNSdGw7CisgICAgICAgICAgICBpZiAobmV3Q2FyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBuZXdDYXJldCA9IGdldE9mZnNldEJlZm9yZUFmdGVyKG90aGVyUnVuSW5kZXgsIG90aGVyUnVuU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBvdGhlclJ1bkxpbWl0LCBvdGhlclJ1bklzUnRsLAorICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSA/IG90aGVyUnVuU3RhcnQgOiBvdGhlclJ1bkxpbWl0LCBhZHZhbmNlKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3Q2FyZXQgPT0gKGFkdmFuY2UgPyBvdGhlclJ1bkxpbWl0IDogb3RoZXJSdW5TdGFydCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ3Jvc3NlZCBhbmQgZW5kZWQgdXAgYXQgYSBuZXcgYm91bmRhcnksCisgICAgICAgICAgICAgICAgICAgIC8vIHJlcGVhdCBhIHNlY29uZCBhbmQgZmluYWwgdGltZS4KKyAgICAgICAgICAgICAgICAgICAgcnVuSW5kZXggPSBvdGhlclJ1bkluZGV4OworICAgICAgICAgICAgICAgICAgICBydW5MZXZlbCA9IG90aGVyUnVuTGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhlIG5ldyBjYXJldCBpcyBhdCBhIGJvdW5kYXJ5LgorICAgICAgICAgICAgaWYgKG90aGVyUnVuTGV2ZWwgPCBydW5MZXZlbCkgeworICAgICAgICAgICAgICAvLyBUaGUgc3Ryb25nIGNoYXJhY3RlciBpcyBpbiB0aGUgb3RoZXIgcnVuLgorICAgICAgICAgICAgICBuZXdDYXJldCA9IGFkdmFuY2UgPyBvdGhlclJ1blN0YXJ0IDogb3RoZXJSdW5MaW1pdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChuZXdDYXJldCA9PSAtMSkgeworICAgICAgICAgICAgICAvLyBXZSdyZSB3YWxraW5nIG9mZiB0aGUgZW5kIG9mIHRoZSBsaW5lLiAgVGhlIHBhcmFncmFwaAorICAgICAgICAgICAgICAvLyBsZXZlbCBpcyBhbHdheXMgZXF1YWwgdG8gb3IgbG93ZXIgdGhhbiBhbnkgaW50ZXJuYWwgbGV2ZWwsIHNvCisgICAgICAgICAgICAgIC8vIHRoZSBib3VuZGFyaWVzIGdldCB0aGUgc3Ryb25nIGNhcmV0LgorICAgICAgICAgICAgICBuZXdDYXJldCA9IGFkdmFuY2UgPyBtTGVuICsgMSA6IC0xOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBFbHNlIHdlJ3ZlIGFycml2ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4gIFRoYXQncyBhIHN0cm9uZyBwb3NpdGlvbi4KKyAgICAgICAgICAvLyBXZSBtaWdodCBoYXZlIGFycml2ZWQgaGVyZSBieSBjcm9zc2luZyBvdmVyIGEgcnVuIHdpdGggbm8gaW50ZXJuYWwKKyAgICAgICAgICAvLyBicmVha3MgYW5kIGRyb3BwaW5nIG91dCBvZiB0aGUgYWJvdmUgbG9vcCBiZWZvcmUgYWR2YW5jaW5nIG9uZSBmaW5hbAorICAgICAgICAgIC8vIHRpbWUsIHNvIHJlc2V0IHRoZSBjYXJldC4KKyAgICAgICAgICAvLyBOb3RlLCB3ZSB1c2UgJzw9JyBiZWxvdyB0byBoYW5kbGUgYSBzaXR1YXRpb24gd2hlcmUgdGhlIG9ubHkgcnVuCisgICAgICAgICAgLy8gb24gdGhlIGxpbmUgaXMgYSBjb3VudGVyLWRpcmVjdGlvbmFsIHJ1bi4gIElmIHdlJ3JlIG5vdCBhZHZhbmNpbmcsCisgICAgICAgICAgLy8gd2UgY2FuIGVuZCB1cCBhdCB0aGUgJ2xpbmVFbmQnIHBvc2l0aW9uIGJ1dCB0aGUgY2FyZXQgd2Ugd2FudCBpcyBhdAorICAgICAgICAgIC8vIHRoZSBsaW5lU3RhcnQuCisgICAgICAgICAgaWYgKG5ld0NhcmV0IDw9IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBhZHZhbmNlID8gbGluZUVuZCA6IGxpbmVTdGFydDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3Q2FyZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCB2YWxpZCBvZmZzZXQgd2l0aGluIHRoaXMgZGlyZWN0aW9uYWwgcnVuLCBza2lwcGluZworICAgICAqIGNvbmp1bmN0cyBhbmQgemVyby13aWR0aCBjaGFyYWN0ZXJzLiAgVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCB0byB3YWxrCisgICAgICogb2ZmIHRoZSBlbmQgb2YgdGhlIGxpbmUsIHNpbmNlIHRoZSByZXR1cm5lZCB2YWx1ZXMgbWlnaHQgbm90IGJlIHZhbGlkCisgICAgICogb24gbmVpZ2hib3JpbmcgbGluZXMuICBJZiB0aGUgcmV0dXJuZWQgb2Zmc2V0IGlzIGxlc3MgdGhhbiB6ZXJvIG9yCisgICAgICogZ3JlYXRlciB0aGFuIHRoZSBsaW5lIGxlbmd0aCwgdGhlIG9mZnNldCBzaG91bGQgYmUgcmVjb21wdXRlZCBvbiB0aGUKKyAgICAgKiBwcmVjZWRpbmcgb3IgZm9sbG93aW5nIGxpbmUsIHJlc3BlY3RpdmVseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBydW5JbmRleCB0aGUgcnVuIGluZGV4CisgICAgICogQHBhcmFtIHJ1blN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIHJ1bkxpbWl0IHRoZSBsaW1pdCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIHJ1bklzUnRsIHRydWUgaWYgdGhlIHJ1biBpcyByaWdodC10by1sZWZ0CisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0CisgICAgICogQHBhcmFtIGFmdGVyIHRydWUgaWYgdGhlIG5ldyBvZmZzZXQgc2hvdWxkIGxvZ2ljYWxseSBmb2xsb3cgdGhlIHByb3ZpZGVkCisgICAgICogb2Zmc2V0CisgICAgICogQHJldHVybiB0aGUgbmV3IG9mZnNldAorICAgICAqLworICAgIHByaXZhdGUgaW50IGdldE9mZnNldEJlZm9yZUFmdGVyKGludCBydW5JbmRleCwgaW50IHJ1blN0YXJ0LCBpbnQgcnVuTGltaXQsCisgICAgICAgICAgICBib29sZWFuIHJ1bklzUnRsLCBpbnQgb2Zmc2V0LCBib29sZWFuIGFmdGVyKSB7CisKKyAgICAgICAgaWYgKHJ1bkluZGV4IDwgMCB8fCBvZmZzZXQgPT0gKGFmdGVyID8gbUxlbiA6IDApKSB7CisgICAgICAgICAgICAvLyBXYWxraW5nIG9mZiBlbmQgb2YgbGluZS4gIFNpbmNlIHdlIGRvbid0IGtub3cKKyAgICAgICAgICAgIC8vIHdoYXQgY3Vyc29yIHBvc2l0aW9ucyBhcmUgYXZhaWxhYmxlIG9uIG90aGVyIGxpbmVzLCB3ZSBjYW4ndAorICAgICAgICAgICAgLy8gcmV0dXJuIGFjY3VyYXRlIHZhbHVlcy4gIFRoZXNlIGFyZSBhIGd1ZXNzLgorICAgICAgICAgICAgaWYgKGFmdGVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRleHRVdGlscy5nZXRPZmZzZXRBZnRlcihtVGV4dCwgb2Zmc2V0ICsgbVN0YXJ0KSAtIG1TdGFydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbHMuZ2V0T2Zmc2V0QmVmb3JlKG1UZXh0LCBvZmZzZXQgKyBtU3RhcnQpIC0gbVN0YXJ0OworICAgICAgICB9CisKKyAgICAgICAgVGV4dFBhaW50IHdwID0gbVdvcmtQYWludDsKKyAgICAgICAgd3Auc2V0KG1QYWludCk7CisKKyAgICAgICAgaW50IHNwYW5TdGFydCA9IHJ1blN0YXJ0OworICAgICAgICBpbnQgc3BhbkxpbWl0OworICAgICAgICBpZiAobVNwYW5uZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgc3BhbkxpbWl0ID0gcnVuTGltaXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgdGFyZ2V0ID0gYWZ0ZXIgPyBvZmZzZXQgKyAxIDogb2Zmc2V0OworICAgICAgICAgICAgaW50IGxpbWl0ID0gbVN0YXJ0ICsgcnVuTGltaXQ7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHNwYW5MaW1pdCA9IG1TcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihtU3RhcnQgKyBzcGFuU3RhcnQsIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcykgLSBtU3RhcnQ7CisgICAgICAgICAgICAgICAgaWYgKHNwYW5MaW1pdCA+PSB0YXJnZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNwYW5TdGFydCA9IHNwYW5MaW1pdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0gbVNwYW5uZWQuZ2V0U3BhbnMobVN0YXJ0ICsgc3BhblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBtU3RhcnQgKyBzcGFuTGltaXQsIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOworCisgICAgICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3BhbiByZXBsYWNlbWVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzcGFucy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuIHNwYW4gPSBzcGFuc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW4gaW5zdGFuY2VvZiBSZXBsYWNlbWVudFNwYW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gKFJlcGxhY2VtZW50U3BhbilzcGFuOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi51cGRhdGVNZWFzdXJlU3RhdGUod3ApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHJlcGxhY2VtZW50IHNwYW4sIHdlJ3JlIG1vdmluZyBlaXRoZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGlzIHNwYW4uCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZnRlciA/IHNwYW5MaW1pdCA6IHNwYW5TdGFydDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgZmxhZ3MgPSBydW5Jc1J0bCA/IFBhaW50LkRJUkVDVElPTl9SVEwgOiBQYWludC5ESVJFQ1RJT05fTFRSOworICAgICAgICBpbnQgY3Vyc29yT3B0ID0gYWZ0ZXIgPyBQYWludC5DVVJTT1JfQUZURVIgOiBQYWludC5DVVJTT1JfQkVGT1JFOworICAgICAgICBpZiAobUNoYXJzVmFsaWQpIHsKKyAgICAgICAgICAgIHJldHVybiB3cC5nZXRUZXh0UnVuQ3Vyc29yKG1DaGFycywgc3BhblN0YXJ0LCBzcGFuTGltaXQgLSBzcGFuU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBvZmZzZXQsIGN1cnNvck9wdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gd3AuZ2V0VGV4dFJ1bkN1cnNvcihtVGV4dCwgbVN0YXJ0ICsgc3BhblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBtU3RhcnQgKyBzcGFuTGltaXQsIGZsYWdzLCBtU3RhcnQgKyBvZmZzZXQsIGN1cnNvck9wdCkgLSBtU3RhcnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciBtZWFzdXJpbmcgYW5kIHJlbmRlcmluZyB0ZXh0LiAgVGhlIHRleHQgbXVzdAorICAgICAqIG5vdCBpbmNsdWRlIGEgdGFiIG9yIGVtb2ppLgorICAgICAqCisgICAgICogQHBhcmFtIHdwIHRoZSB3b3JraW5nIHBhaW50CisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBlbmQgdGhlIGVuZCBvZiB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBydW5Jc1J0bCB0cnVlIGlmIHRoZSBydW4gaXMgcmlnaHQtdG8tbGVmdAorICAgICAqIEBwYXJhbSBjIHRoZSBjYW52YXMsIGNhbiBiZSBudWxsIGlmIHJlbmRlcmluZyBpcyBub3QgbmVlZGVkCisgICAgICogQHBhcmFtIHggdGhlIGVkZ2Ugb2YgdGhlIHJ1biBjbG9zZXN0IHRvIHRoZSBsZWFkaW5nIG1hcmdpbgorICAgICAqIEBwYXJhbSB0b3AgdGhlIHRvcCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSB5IHRoZSBiYXNlbGluZQorICAgICAqIEBwYXJhbSBib3R0b20gdGhlIGJvdHRvbSBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSBmbWkgcmVjZWl2ZXMgbWV0cmljcyBpbmZvcm1hdGlvbiwgY2FuIGJlIG51bGwKKyAgICAgKiBAcGFyYW0gbmVlZFdpZHRoIHRydWUgaWYgdGhlIHdpZHRoIG9mIHRoZSBydW4gaXMgbmVlZGVkCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIG9mIHRoZSBydW4gYmFzZWQgb24gdGhlIHJ1biBkaXJlY3Rpb247IG9ubHkKKyAgICAgKiB2YWxpZCBpZiBuZWVkV2lkdGggaXMgdHJ1ZQorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgaGFuZGxlVGV4dChUZXh0UGFpbnQgd3AsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBib29sZWFuIHJ1bklzUnRsLAorICAgICAgICAgICAgQ2FudmFzIGMsIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLAorICAgICAgICAgICAgRm9udE1ldHJpY3NJbnQgZm1pLCBib29sZWFuIG5lZWRXaWR0aCkgeworCisgICAgICAgIGZsb2F0IHJldCA9IDA7CisKKyAgICAgICAgaW50IHJ1bkxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICBpbnQgY29udGV4dExlbiA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgIGlmIChuZWVkV2lkdGggfHwgKGMgIT0gbnVsbCAmJiAod3AuYmdDb2xvciAhPSAwIHx8IHJ1bklzUnRsKSkpIHsKKyAgICAgICAgICAgIGludCBmbGFncyA9IHJ1bklzUnRsID8gUGFpbnQuRElSRUNUSU9OX1JUTCA6IFBhaW50LkRJUkVDVElPTl9MVFI7CisgICAgICAgICAgICBpZiAobUNoYXJzVmFsaWQpIHsKKyAgICAgICAgICAgICAgICByZXQgPSB3cC5nZXRUZXh0UnVuQWR2YW5jZXMobUNoYXJzLCBzdGFydCwgcnVuTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0TGVuLCBmbGFncywgbnVsbCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBkZWx0YSA9IG1TdGFydDsKKyAgICAgICAgICAgICAgICByZXQgPSB3cC5nZXRUZXh0UnVuQWR2YW5jZXMobVRleHQsIGRlbHRhICsgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSArIGVuZCwgZGVsdGEgKyBjb250ZXh0U3RhcnQsIGRlbHRhICsgY29udGV4dEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBudWxsLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbWkgIT0gbnVsbCkgeworICAgICAgICAgICAgd3AuZ2V0Rm9udE1ldHJpY3NJbnQoZm1pKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChydW5Jc1J0bCkgeworICAgICAgICAgICAgICAgIHggLT0gcmV0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod3AuYmdDb2xvciAhPSAwKSB7CisgICAgICAgICAgICAgICAgaW50IGNvbG9yID0gd3AuZ2V0Q29sb3IoKTsKKyAgICAgICAgICAgICAgICBQYWludC5TdHlsZSBzID0gd3AuZ2V0U3R5bGUoKTsKKyAgICAgICAgICAgICAgICB3cC5zZXRDb2xvcih3cC5iZ0NvbG9yKTsKKyAgICAgICAgICAgICAgICB3cC5zZXRTdHlsZShQYWludC5TdHlsZS5GSUxMKTsKKworICAgICAgICAgICAgICAgIGMuZHJhd1JlY3QoeCwgdG9wLCB4ICsgcmV0LCBib3R0b20sIHdwKTsKKworICAgICAgICAgICAgICAgIHdwLnNldFN0eWxlKHMpOworICAgICAgICAgICAgICAgIHdwLnNldENvbG9yKGNvbG9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHJhd1RleHRSdW4oYywgd3AsIHN0YXJ0LCBlbmQsIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgcnVuSXNSdGwsCisgICAgICAgICAgICAgICAgICAgIHgsIHkgKyB3cC5iYXNlbGluZVNoaWZ0KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBydW5Jc1J0bCA/IC1yZXQgOiByZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgbWVhc3VyaW5nIGFuZCByZW5kZXJpbmcgYSByZXBsYWNlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXBsYWNlbWVudCB0aGUgcmVwbGFjZW1lbnQKKyAgICAgKiBAcGFyYW0gd3AgdGhlIHdvcmsgcGFpbnQKKyAgICAgKiBAcGFyYW0gcnVuSW5kZXggdGhlIHJ1biBpbmRleAorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbGltaXQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBydW5Jc1J0bCB0cnVlIGlmIHRoZSBydW4gaXMgcmlnaHQtdG8tbGVmdAorICAgICAqIEBwYXJhbSBjIHRoZSBjYW52YXMsIGNhbiBiZSBudWxsIGlmIG5vdCByZW5kZXJpbmcKKyAgICAgKiBAcGFyYW0geCB0aGUgZWRnZSBvZiB0aGUgcmVwbGFjZW1lbnQgY2xvc2VzdCB0byB0aGUgbGVhZGluZyBtYXJnaW4KKyAgICAgKiBAcGFyYW0gdG9wIHRoZSB0b3Agb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0geSB0aGUgYmFzZWxpbmUKKyAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20gb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0gZm1pIHJlY2VpdmVzIG1ldHJpY3MgaW5mb3JtYXRpb24sIGNhbiBiZSBudWxsCisgICAgICogQHBhcmFtIG5lZWRXaWR0aCB0cnVlIGlmIHRoZSB3aWR0aCBvZiB0aGUgcmVwbGFjZW1lbnQgaXMgbmVlZGVkCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIG9mIHRoZSBydW4gYmFzZWQgb24gdGhlIHJ1biBkaXJlY3Rpb247IG9ubHkKKyAgICAgKiB2YWxpZCBpZiBuZWVkV2lkdGggaXMgdHJ1ZQorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgaGFuZGxlUmVwbGFjZW1lbnQoUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50LCBUZXh0UGFpbnQgd3AsCisgICAgICAgICAgICBpbnQgcnVuSW5kZXgsIGludCBzdGFydCwgaW50IGxpbWl0LCBib29sZWFuIHJ1bklzUnRsLCBDYW52YXMgYywKKyAgICAgICAgICAgIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLCBGb250TWV0cmljc0ludCBmbWksCisgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgeworCisgICAgICAgIGZsb2F0IHJldCA9IDA7CisKKyAgICAgICAgaW50IHRleHRTdGFydCA9IG1TdGFydCArIHN0YXJ0OworICAgICAgICBpbnQgdGV4dExpbWl0ID0gbVN0YXJ0ICsgbGltaXQ7CisKKyAgICAgICAgaWYgKG5lZWRXaWR0aCB8fCAoYyAhPSBudWxsICYmIHJ1bklzUnRsKSkgeworICAgICAgICAgICAgcmV0ID0gcmVwbGFjZW1lbnQuZ2V0U2l6ZSh3cCwgbVRleHQsIHRleHRTdGFydCwgdGV4dExpbWl0LCBmbWkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHJ1bklzUnRsKSB7CisgICAgICAgICAgICAgICAgeCAtPSByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBsYWNlbWVudC5kcmF3KGMsIG1UZXh0LCB0ZXh0U3RhcnQsIHRleHRMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgeCwgdG9wLCB5LCBib3R0b20sIHdwKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBydW5Jc1J0bCA/IC1yZXQgOiByZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgYSB1bmlkaXJlY3Rpb25hbCBydW4uICBUaGUgcnVuIG11c3Qgbm90CisgICAgICogY29udGFpbiB0YWJzIG9yIGVtb2ppIGJ1dCBjYW4gY29udGFpbiBzdHlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcnVuSW5kZXggdGhlIHJ1biBpbmRleAorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgbGluZS1yZWxhdGl2ZSBzdGFydCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIG1lYXN1cmVMaW1pdCB0aGUgb2Zmc2V0IHRvIG1lYXN1cmUgdG8sIGJldHdlZW4gc3RhcnQgYW5kIGxpbWl0IGluY2x1c2l2ZQorICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbGltaXQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBydW5Jc1J0bCB0cnVlIGlmIHRoZSBydW4gaXMgcmlnaHQtdG8tbGVmdAorICAgICAqIEBwYXJhbSBjIHRoZSBjYW52YXMsIGNhbiBiZSBudWxsCisgICAgICogQHBhcmFtIHggdGhlIGVuZCBvZiB0aGUgcnVuIGNsb3Nlc3QgdG8gdGhlIGxlYWRpbmcgbWFyZ2luCisgICAgICogQHBhcmFtIHRvcCB0aGUgdG9wIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHkgdGhlIGJhc2VsaW5lCisgICAgICogQHBhcmFtIGJvdHRvbSB0aGUgYm90dG9tIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIGZtaSByZWNlaXZlcyBtZXRyaWNzIGluZm9ybWF0aW9uLCBjYW4gYmUgbnVsbAorICAgICAqIEBwYXJhbSBuZWVkV2lkdGggdHJ1ZSBpZiB0aGUgd2lkdGggaXMgcmVxdWlyZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBzaWduZWQgd2lkdGggb2YgdGhlIHJ1biBiYXNlZCBvbiB0aGUgcnVuIGRpcmVjdGlvbjsgb25seQorICAgICAqIHZhbGlkIGlmIG5lZWRXaWR0aCBpcyB0cnVlCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBoYW5kbGVSdW4oaW50IHJ1bkluZGV4LCBpbnQgc3RhcnQsIGludCBtZWFzdXJlTGltaXQsCisgICAgICAgICAgICBpbnQgbGltaXQsIGJvb2xlYW4gcnVuSXNSdGwsIENhbnZhcyBjLCBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwKKyAgICAgICAgICAgIGludCBib3R0b20sIEZvbnRNZXRyaWNzSW50IGZtaSwgYm9vbGVhbiBuZWVkV2lkdGgpIHsKKworICAgICAgICAvLyBTaGFwaW5nIG5lZWRzIHRvIHRha2UgaW50byBhY2NvdW50IGNvbnRleHQgdXAgdG8gbWV0cmljIGJvdW5kYXJpZXMsCisgICAgICAgIC8vIGJ1dCByZW5kZXJpbmcgbmVlZHMgdG8gdGFrZSBpbnRvIGFjY291bnQgY2hhcmFjdGVyIHN0eWxlIGJvdW5kYXJpZXMuCisgICAgICAgIC8vIFNvIHdlIGl0ZXJhdGUgdGhyb3VnaCBtZXRyaWMgcnVucyB0byBnZXQgbWV0cmljIGJvdW5kcywKKyAgICAgICAgLy8gdGhlbiB3aXRoaW4gZWFjaCBtZXRyaWMgcnVuIGl0ZXJhdGUgdGhyb3VnaCBjaGFyYWN0ZXIgc3R5bGUgcnVucworICAgICAgICAvLyBmb3IgdGhlIHJ1biBib3VuZHMuCisgICAgICAgIGZsb2F0IG94ID0geDsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBpbmV4dDsgaSA8IG1lYXN1cmVMaW1pdDsgaSA9IGluZXh0KSB7CisgICAgICAgICAgICBUZXh0UGFpbnQgd3AgPSBtV29ya1BhaW50OworICAgICAgICAgICAgd3Auc2V0KG1QYWludCk7CisKKyAgICAgICAgICAgIGludCBtbGltaXQ7CisgICAgICAgICAgICBpZiAobVNwYW5uZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGluZXh0ID0gbGltaXQ7CisgICAgICAgICAgICAgICAgbWxpbWl0ID0gbWVhc3VyZUxpbWl0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmV4dCA9IG1TcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihtU3RhcnQgKyBpLCBtU3RhcnQgKyBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpIC0gbVN0YXJ0OworCisgICAgICAgICAgICAgICAgbWxpbWl0ID0gaW5leHQgPCBtZWFzdXJlTGltaXQgPyBpbmV4dCA6IG1lYXN1cmVMaW1pdDsKKyAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuW10gc3BhbnMgPSBtU3Bhbm5lZC5nZXRTcGFucyhtU3RhcnQgKyBpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgbWxpbWl0LCBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKKworICAgICAgICAgICAgICAgIGlmIChzcGFucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3BhbiByZXBsYWNlbWVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3BhbnMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4gc3BhbiA9IHNwYW5zW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW4gaW5zdGFuY2VvZiBSZXBsYWNlbWVudFNwYW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IChSZXBsYWNlbWVudFNwYW4pc3BhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWlnaHQgaGF2ZSBhIHJlcGxhY2VtZW50IHRoYXQgdXNlcyB0aGUgZHJhdworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXRlLCBvdGhlcndpc2UgbWVhc3VyZSBzdGF0ZSB3b3VsZCBzdWZmaWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4udXBkYXRlRHJhd1N0YXRlKHdwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB4ICs9IGhhbmRsZVJlcGxhY2VtZW50KHJlcGxhY2VtZW50LCB3cCwgcnVuSW5kZXgsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1saW1pdCwgcnVuSXNSdGwsIGMsIHgsIHRvcCwgeSwgYm90dG9tLCBmbWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRXaWR0aCB8fCBtbGltaXQgPCBtZWFzdXJlTGltaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtU3Bhbm5lZCA9PSBudWxsIHx8IGMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHggKz0gaGFuZGxlVGV4dCh3cCwgaSwgbWxpbWl0LCBpLCBpbmV4dCwgcnVuSXNSdGwsIGMsIHgsIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHksIGJvdHRvbSwgZm1pLCBuZWVkV2lkdGggfHwgbWxpbWl0IDwgbWVhc3VyZUxpbWl0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGksIGpuZXh0OyBqIDwgbWxpbWl0OyBqID0gam5leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgam5leHQgPSBtU3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24obVN0YXJ0ICsgaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnQgKyBtbGltaXQsIENoYXJhY3RlclN0eWxlLmNsYXNzKSAtIG1TdGFydDsKKworICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXJTdHlsZVtdIHNwYW5zID0gbVNwYW5uZWQuZ2V0U3BhbnMobVN0YXJ0ICsgaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnQgKyBqbmV4dCwgQ2hhcmFjdGVyU3R5bGUuY2xhc3MpOworCisgICAgICAgICAgICAgICAgICAgIHdwLnNldChtUGFpbnQpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHNwYW5zLmxlbmd0aDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXJTdHlsZSBzcGFuID0gc3BhbnNba107CisgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLnVwZGF0ZURyYXdTdGF0ZSh3cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB4ICs9IGhhbmRsZVRleHQod3AsIGosIGpuZXh0LCBpLCBpbmV4dCwgcnVuSXNSdGwsIGMsIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLCB5LCBib3R0b20sIGZtaSwgbmVlZFdpZHRoIHx8IGpuZXh0IDwgbWVhc3VyZUxpbWl0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4geCAtIG94OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbmRlciBhIHRleHQgcnVuIHdpdGggdGhlIHNldC11cCBwYWludC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIHRoZSBjYW52YXMKKyAgICAgKiBAcGFyYW0gd3AgdGhlIHBhaW50IHVzZWQgdG8gcmVuZGVyIHRoZSB0ZXh0CisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIGVuZCB0aGUgZW5kIG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gY29udGV4dFN0YXJ0IHRoZSBzdGFydCBvZiBjb250ZXh0IGZvciB0aGUgcnVuCisgICAgICogQHBhcmFtIGNvbnRleHRFbmQgdGhlIGVuZCBvZiB0aGUgY29udGV4dCBmb3IgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBydW5Jc1J0bCB0cnVlIGlmIHRoZSBydW4gaXMgcmlnaHQtdG8tbGVmdAorICAgICAqIEBwYXJhbSB4IHRoZSB4IHBvc2l0aW9uIG9mIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSB5IHRoZSBiYXNlbGluZSBvZiB0aGUgcnVuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRyYXdUZXh0UnVuKENhbnZhcyBjLCBUZXh0UGFpbnQgd3AsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBib29sZWFuIHJ1bklzUnRsLCBmbG9hdCB4LCBpbnQgeSkgeworCisgICAgICAgIGludCBmbGFncyA9IHJ1bklzUnRsID8gQ2FudmFzLkRJUkVDVElPTl9SVEwgOiBDYW52YXMuRElSRUNUSU9OX0xUUjsKKyAgICAgICAgaWYgKG1DaGFyc1ZhbGlkKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBlbmQgLSBzdGFydDsKKyAgICAgICAgICAgIGludCBjb250ZXh0Q291bnQgPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICAgICAgYy5kcmF3VGV4dFJ1bihtQ2hhcnMsIHN0YXJ0LCBjb3VudCwgY29udGV4dFN0YXJ0LCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICAgICAgICAgIHgsIHksIGZsYWdzLCB3cCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgZGVsdGEgPSBtU3RhcnQ7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKG1UZXh0LCBkZWx0YSArIHN0YXJ0LCBkZWx0YSArIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgZGVsdGEgKyBjb250ZXh0U3RhcnQsIGRlbHRhICsgY29udGV4dEVuZCwgeCwgeSwgZmxhZ3MsIHdwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFzY2VudCBvZiB0aGUgdGV4dCBhdCBzdGFydC4gIFRoaXMgaXMgdXNlZCBmb3Igc2NhbGluZworICAgICAqIGVtb2ppLgorICAgICAqCisgICAgICogQHBhcmFtIHBvcyB0aGUgbGluZS1yZWxhdGl2ZSBwb3NpdGlvbgorICAgICAqIEByZXR1cm4gdGhlIGFzY2VudCBvZiB0aGUgdGV4dCBhdCBzdGFydAorICAgICAqLworICAgIGZsb2F0IGFzY2VudChpbnQgcG9zKSB7CisgICAgICAgIGlmIChtU3Bhbm5lZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbVBhaW50LmFzY2VudCgpOworICAgICAgICB9CisKKyAgICAgICAgcG9zICs9IG1TdGFydDsKKyAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0gbVNwYW5uZWQuZ2V0U3BhbnMocG9zLCBwb3MgKyAxLAorICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOworICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBtUGFpbnQuYXNjZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBUZXh0UGFpbnQgd3AgPSBtV29ya1BhaW50OworICAgICAgICB3cC5zZXQobVBhaW50KTsKKyAgICAgICAgZm9yIChNZXRyaWNBZmZlY3RpbmdTcGFuIHNwYW4gOiBzcGFucykgeworICAgICAgICAgICAgc3Bhbi51cGRhdGVNZWFzdXJlU3RhdGUod3ApOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3cC5hc2NlbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHRhYiBwb3NpdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoIHRoZSAodW5zaWduZWQpIG9mZnNldCBmcm9tIHRoZSBsZWFkaW5nIG1hcmdpbgorICAgICAqIEByZXR1cm4gdGhlICh1bnNpZ25lZCkgdGFiIHBvc2l0aW9uIGFmdGVyIHRoaXMgb2Zmc2V0CisgICAgICovCisgICAgZmxvYXQgbmV4dFRhYihmbG9hdCBoKSB7CisgICAgICAgIGlmIChtVGFicyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbVRhYnMubmV4dFRhYihoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVGFiU3RvcHMubmV4dERlZmF1bHRTdG9wKGgsIFRBQl9JTkNSRU1FTlQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfSU5DUkVNRU5UID0gMjA7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0VXRpbHMuamF2YQppbmRleCA5NTg5YmYzLi4yZDZjN2I2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dFV0aWxzLmphdmEKQEAgLTE3LDEyICsxNywxMSBAQAogcGFja2FnZSBhbmRyb2lkLnRleHQ7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKIAotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3Q7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyLkNhcGl0YWxpemU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkFic29sdXRlU2l6ZVNwYW47CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkFsaWdubWVudFNwYW47CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkJhY2tncm91bmRDb2xvclNwYW47CkBAIC00NSwxMCArNDQsOCBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5VbmRlcmxpbmVTcGFuOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QcmludGVyOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCiBwdWJsaWMgY2xhc3MgVGV4dFV0aWxzIHsKICAgICBwcml2YXRlIFRleHRVdGlscygpIHsgLyogY2Fubm90IGJlIGluc3RhbnRpYXRlZCAqLyB9CkBAIC05ODMsNyArOTgwLDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCB0ZXh0IGlmIGl0IGZpdHMgaW4gdGhlIHNwZWNpZmllZCB3aWR0aAogICAgICAqIGdpdmVuIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzcGVjaWZpZWQgUGFpbnQsCi0gICAgICogb3IsIGlmIGl0IGRvZXMgbm90IGZpdCwgYSBjb3B5IHdpdGggZWxsaXBzaXMgY2hhcmFjdGVyIGFkZGVkIAorICAgICAqIG9yLCBpZiBpdCBkb2VzIG5vdCBmaXQsIGEgY29weSB3aXRoIGVsbGlwc2lzIGNoYXJhY3RlciBhZGRlZAogICAgICAqIGF0IHRoZSBzcGVjaWZpZWQgZWRnZSBvciBjZW50ZXIuCiAgICAgICogSWYgPGNvZGU+cHJlc2VydmVMZW5ndGg8L2NvZGU+IGlzIHNwZWNpZmllZCwgdGhlIHJldHVybmVkIGNvcHkKICAgICAgKiB3aWxsIGJlIHBhZGRlZCB3aXRoIHplcm8td2lkdGggc3BhY2VzIHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbApAQCAtOTkyLDcgKzk4OSw3IEBACiAgICAgICogcmVwb3J0IHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBlbGxpcHNpemVkIHJhbmdlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGVsbGlwc2l6ZShDaGFyU2VxdWVuY2UgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYXZhaWwsIFRydW5jYXRlQXQgd2hlcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJlc2VydmVMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsbGlwc2l6ZUNhbGxiYWNrIGNhbGxiYWNrKSB7CkBAIC0xMDAzLDEzICsxMDAwLDEyIEBACiAKICAgICAgICAgaW50IGxlbiA9IHRleHQubGVuZ3RoKCk7CiAKLSAgICAgICAgLy8gVXNlIFBhaW50LmJyZWFrVGV4dCgpIGZvciB0aGUgbm9uLVNwYW5uZWQgY2FzZSB0byBhdm9pZCBoYXZpbmcKLSAgICAgICAgLy8gdG8gYWxsb2NhdGUgbWVtb3J5IGFuZCBhY2N1bXVsYXRlIHRoZSBjaGFyYWN0ZXIgd2lkdGhzIG91cnNlbHZlcy4KKyAgICAgICAgTWVhc3VyZWRUZXh0IG10ID0gTWVhc3VyZWRUZXh0Lm9idGFpbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmxvYXQgd2lkdGggPSBzZXRQYXJhKG10LCBwYWludCwgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0LkRJUl9SRVFVRVNUX0RFRkFVTFRfTFRSKTsKIAotICAgICAgICBpZiAoISh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkpIHsKLSAgICAgICAgICAgIGZsb2F0IHdpZCA9IHAubWVhc3VyZVRleHQodGV4dCwgMCwgbGVuKTsKLQotICAgICAgICAgICAgaWYgKHdpZCA8PSBhdmFpbCkgeworICAgICAgICAgICAgaWYgKHdpZHRoIDw9IGF2YWlsKSB7CiAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCAwKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDE3LDI1MCArMTAxMyw2OSBAQAogICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmbG9hdCBlbGxpcHNpc3dpZCA9IHAubWVhc3VyZVRleHQoc0VsbGlwc2lzKTsKKyAgICAgICAgICAgIC8vIFhYWCBhc3N1bWVzIGVsbGlwc2lzIHN0cmluZyBkb2VzIG5vdCByZXF1aXJlIHNoYXBpbmcgYW5kCisgICAgICAgICAgICAvLyBpcyB1bmFmZmVjdGVkIGJ5IHN0eWxlCisgICAgICAgICAgICBmbG9hdCBlbGxpcHNpc3dpZCA9IHBhaW50Lm1lYXN1cmVUZXh0KHNFbGxpcHNpcyk7CisgICAgICAgICAgICBhdmFpbCAtPSBlbGxpcHNpc3dpZDsKIAotICAgICAgICAgICAgaWYgKGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKDAsIGxlbik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJbXSBidWYgPSBvYnRhaW4obGVuKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2ldID0gJ1x1RkVGRic7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJldCA9IG5ldyBTdHJpbmcoYnVmLCAwLCBsZW4pOwotICAgICAgICAgICAgICAgICAgICByZWN5Y2xlKGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHdoZXJlID09IFRydW5jYXRlQXQuU1RBUlQpIHsKLSAgICAgICAgICAgICAgICBpbnQgZml0ID0gcC5icmVha1RleHQodGV4dCwgMCwgbGVuLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWwgLSBlbGxpcHNpc3dpZCwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKDAsIGxlbiAtIGZpdCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBibGFuayh0ZXh0LCAwLCBsZW4gLSBmaXQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzRWxsaXBzaXMgKyB0ZXh0LnRvU3RyaW5nKCkuc3Vic3RyaW5nKGxlbiAtIGZpdCwgbGVuKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbGVmdCA9IDA7CisgICAgICAgICAgICBpbnQgcmlnaHQgPSBsZW47CisgICAgICAgICAgICBpZiAoYXZhaWwgPCAwKSB7CisgICAgICAgICAgICAgICAgLy8gaXQgYWxsIGdvZXMKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hlcmUgPT0gVHJ1bmNhdGVBdC5TVEFSVCkgeworICAgICAgICAgICAgICAgIHJpZ2h0ID0gbGVuIC0gbXQuYnJlYWtUZXh0KDAsIGxlbiwgZmFsc2UsIGF2YWlsKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hlcmUgPT0gVHJ1bmNhdGVBdC5FTkQpIHsKLSAgICAgICAgICAgICAgICBpbnQgZml0ID0gcC5icmVha1RleHQodGV4dCwgMCwgbGVuLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbCAtIGVsbGlwc2lzd2lkLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoZml0LCBsZW4pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxhbmsodGV4dCwgZml0LCBsZW4pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCkuc3Vic3RyaW5nKDAsIGZpdCkgKyBzRWxsaXBzaXM7Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIH0gZWxzZSAvKiB3aGVyZSA9PSBUcnVuY2F0ZUF0Lk1JRERMRSAqLyB7Ci0gICAgICAgICAgICAgICAgaW50IHJpZ2h0ID0gcC5icmVha1RleHQodGV4dCwgMCwgbGVuLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWwgLSBlbGxpcHNpc3dpZCkgLyAyLCBudWxsKTsKLSAgICAgICAgICAgICAgICBmbG9hdCB1c2VkID0gcC5tZWFzdXJlVGV4dCh0ZXh0LCBsZW4gLSByaWdodCwgbGVuKTsKLSAgICAgICAgICAgICAgICBpbnQgbGVmdCA9IHAuYnJlYWtUZXh0KHRleHQsIDAsIGxlbiAtIHJpZ2h0LCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWwgLSBlbGxpcHNpc3dpZCAtIHVzZWQsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZChsZWZ0LCBsZW4gLSByaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBibGFuayh0ZXh0LCBsZWZ0LCBsZW4gLSByaWdodCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSB0ZXh0LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzLnN1YnN0cmluZygwLCBsZWZ0KSArIHNFbGxpcHNpcyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzLnN1YnN0cmluZyhsZW4gLSByaWdodCwgbGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBCdXQgZG8gdGhlIFNwYW5uZWQgY2FzZXMgYnkgaGFuZCwgYmVjYXVzZSBpdCdzIHN1Y2ggYSBwYWluCi0gICAgICAgIC8vIHRvIGl0ZXJhdGUgdGhlIHNwYW4gdHJhbnNpdGlvbnMgYmFja3dhcmRzIGFuZCBnZXRUZXh0V2lkdGhzKCkKLSAgICAgICAgLy8gd2lsbCBnaXZlIHVzIHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkLgotCi0gICAgICAgIC8vIGdldFRleHRXaWR0aHMoKSBhbHdheXMgd3JpdGVzIGludG8gdGhlIHN0YXJ0IG9mIHRoZSBhcnJheSwKLSAgICAgICAgLy8gc28gbWVhc3VyZSBlYWNoIHNwYW4gaW50byB0aGUgZmlyc3QgaGFsZiBhbmQgdGhlbiBjb3B5IHRoZQotICAgICAgICAvLyByZXN1bHRzIGludG8gdGhlIHNlY29uZCBoYWxmIHRvIHVzZSBsYXRlci4KLQotICAgICAgICBmbG9hdFtdIHdpZCA9IG5ldyBmbG9hdFtsZW4gKiAyXTsKLSAgICAgICAgVGV4dFBhaW50IHRlbXBwYWludCA9IG5ldyBUZXh0UGFpbnQoKTsKLSAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSB0ZXh0OwotCi0gICAgICAgIGludCBuZXh0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSA9IG5leHQpIHsKLSAgICAgICAgICAgIG5leHQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oaSwgbGVuLCBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKLQotICAgICAgICAgICAgU3R5bGVkLmdldFRleHRXaWR0aHMocCwgdGVtcHBhaW50LCBzcCwgaSwgbmV4dCwgd2lkLCBudWxsKTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkod2lkLCAwLCB3aWQsIGxlbiArIGksIG5leHQgLSBpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IHN1bSA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgIHN1bSArPSB3aWRbbGVuICsgaV07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3VtIDw9IGF2YWlsKSB7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoMCwgMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgZWxsaXBzaXN3aWQgPSBwLm1lYXN1cmVUZXh0KHNFbGxpcHNpcyk7Ci0KLSAgICAgICAgaWYgKGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCBsZW4pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBjaGFyW10gYnVmID0gb2J0YWluKGxlbik7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgICAgICBidWZbaV0gPSAnXHVGRUZGJzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nIHNzID0gbmV3IFNwYW5uYWJsZVN0cmluZyhuZXcgU3RyaW5nKGJ1ZiwgMCwgbGVuKSk7Ci0gICAgICAgICAgICAgICAgcmVjeWNsZShidWYpOwotICAgICAgICAgICAgICAgIGNvcHlTcGFuc0Zyb20oc3AsIDAsIGxlbiwgT2JqZWN0LmNsYXNzLCBzcywgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNzOworICAgICAgICAgICAgICAgIGxlZnQgPSBtdC5icmVha1RleHQoMCwgbGVuLCB0cnVlLCBhdmFpbCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh3aGVyZSA9PSBUcnVuY2F0ZUF0LlNUQVJUKSB7Ci0gICAgICAgICAgICBzdW0gPSAwOwotICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IGxlbjsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkW2xlbiArIGkgLSAxXTsKLQotICAgICAgICAgICAgICAgIGlmICh3ICsgc3VtICsgZWxsaXBzaXN3aWQgPiBhdmFpbCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzdW0gKz0gdzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKDAsIGkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmcgc3MgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nKGJsYW5rKHRleHQsIDAsIGkpKTsKLSAgICAgICAgICAgICAgICBjb3B5U3BhbnNGcm9tKHNwLCAwLCBsZW4sIE9iamVjdC5jbGFzcywgc3MsIDApOwotICAgICAgICAgICAgICAgIHJldHVybiBzczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBvdXQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihzRWxsaXBzaXMpOwotICAgICAgICAgICAgICAgIG91dC5pbnNlcnQoMSwgdGV4dCwgaSwgbGVuKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAod2hlcmUgPT0gVHJ1bmNhdGVBdC5FTkQpIHsKLSAgICAgICAgICAgIHN1bSA9IDA7Ci0gICAgICAgICAgICBpbnQgaTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZFtsZW4gKyBpXTsKLQotICAgICAgICAgICAgICAgIGlmICh3ICsgc3VtICsgZWxsaXBzaXN3aWQgPiBhdmFpbCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzdW0gKz0gdzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKGksIGxlbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZyBzcyA9IG5ldyBTcGFubmFibGVTdHJpbmcoYmxhbmsodGV4dCwgaSwgbGVuKSk7Ci0gICAgICAgICAgICAgICAgY29weVNwYW5zRnJvbShzcCwgMCwgbGVuLCBPYmplY3QuY2xhc3MsIHNzLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3M7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgb3V0ID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoc0VsbGlwc2lzKTsKLSAgICAgICAgICAgICAgICBvdXQuaW5zZXJ0KDAsIHRleHQsIDAsIGkpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIC8qIHdoZXJlID0gVHJ1bmNhdGVBdC5NSURETEUgKi8gewotICAgICAgICAgICAgZmxvYXQgbHN1bSA9IDAsIHJzdW0gPSAwOwotICAgICAgICAgICAgaW50IGxlZnQgPSAwLCByaWdodCA9IGxlbjsKLQotICAgICAgICAgICAgZmxvYXQgcmF2YWlsID0gKGF2YWlsIC0gZWxsaXBzaXN3aWQpIC8gMjsKLSAgICAgICAgICAgIGZvciAocmlnaHQgPSBsZW47IHJpZ2h0ID49IDA7IHJpZ2h0LS0pIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkW2xlbiArIHJpZ2h0IC0gMV07Ci0KLSAgICAgICAgICAgICAgICBpZiAodyArIHJzdW0gPiByYXZhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcnN1bSArPSB3OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmbG9hdCBsYXZhaWwgPSBhdmFpbCAtIGVsbGlwc2lzd2lkIC0gcnN1bTsKLSAgICAgICAgICAgIGZvciAobGVmdCA9IDA7IGxlZnQgPCByaWdodDsgbGVmdCsrKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZFtsZW4gKyBsZWZ0XTsKLQotICAgICAgICAgICAgICAgIGlmICh3ICsgbHN1bSA+IGxhdmFpbCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsc3VtICs9IHc7CisgICAgICAgICAgICAgICAgcmlnaHQgPSBsZW4gLSBtdC5icmVha1RleHQoMCwgbGVuLCBmYWxzZSwgYXZhaWwgLyAyKTsKKyAgICAgICAgICAgICAgICBhdmFpbCAtPSBtdC5tZWFzdXJlKHJpZ2h0LCBsZW4pOworICAgICAgICAgICAgICAgIGxlZnQgPSBtdC5icmVha1RleHQoMCwgcmlnaHQsIHRydWUsIGF2YWlsKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKGxlZnQsIHJpZ2h0KTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG10Lm1DaGFyczsKKyAgICAgICAgICAgIFNwYW5uZWQgc3AgPSB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCA/IChTcGFubmVkKSB0ZXh0IDogbnVsbDsKKworICAgICAgICAgICAgaW50IHJlbWFpbmluZyA9IGxlbiAtIChyaWdodCAtIGxlZnQpOwogICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nIHNzID0gbmV3IFNwYW5uYWJsZVN0cmluZyhibGFuayh0ZXh0LCBsZWZ0LCByaWdodCkpOworICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPiAwKSB7IC8vIGVsc2UgZWxpbWluYXRlIHRoZSBlbGxpcHNpcyB0b28KKyAgICAgICAgICAgICAgICAgICAgYnVmW2xlZnQrK10gPSAnXHUyMDI2JzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGxlZnQ7IGkgPCByaWdodDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZltpXSA9ICdcdUZFRkYnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcoYnVmLCAwLCBsZW4pOworICAgICAgICAgICAgICAgIGlmIChzcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmcgc3MgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nKHMpOwogICAgICAgICAgICAgICAgIGNvcHlTcGFuc0Zyb20oc3AsIDAsIGxlbiwgT2JqZWN0LmNsYXNzLCBzcywgMCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHNFbGxpcHNpcyk7Ci0gICAgICAgICAgICAgICAgb3V0Lmluc2VydCgwLCB0ZXh0LCAwLCBsZWZ0KTsKLSAgICAgICAgICAgICAgICBvdXQuaW5zZXJ0KG91dC5sZW5ndGgoKSwgdGV4dCwgcmlnaHQsIGxlbik7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJsYW5rKENoYXJTZXF1ZW5jZSBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCkgewotICAgICAgICBpbnQgbGVuID0gc291cmNlLmxlbmd0aCgpOwotICAgICAgICBjaGFyW10gYnVmID0gb2J0YWluKGxlbik7Ci0KLSAgICAgICAgaWYgKHN0YXJ0ICE9IDApIHsKLSAgICAgICAgICAgIGdldENoYXJzKHNvdXJjZSwgMCwgc3RhcnQsIGJ1ZiwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVuZCAhPSBsZW4pIHsKLSAgICAgICAgICAgIGdldENoYXJzKHNvdXJjZSwgZW5kLCBsZW4sIGJ1ZiwgZW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdGFydCAhPSBlbmQpIHsKLSAgICAgICAgICAgIGJ1ZltzdGFydF0gPSAnXHUyMDI2JzsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0ICsgMTsgaSA8IGVuZDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYnVmW2ldID0gJ1x1RkVGRic7CisgICAgICAgICAgICBpZiAocmVtYWluaW5nID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgU3RyaW5nIHJldCA9IG5ldyBTdHJpbmcoYnVmLCAwLCBsZW4pOwotICAgICAgICByZWN5Y2xlKGJ1Zik7CiAKLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGlmIChzcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHJlbWFpbmluZyArIHNFbGxpcHNpcy5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGJ1ZiwgMCwgbGVmdCk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHNFbGxpcHNpcyk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGJ1ZiwgcmlnaHQsIGxlbiAtIHJpZ2h0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBzc2IgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc3NiLmFwcGVuZCh0ZXh0LCAwLCBsZWZ0KTsKKyAgICAgICAgICAgIHNzYi5hcHBlbmQoc0VsbGlwc2lzKTsKKyAgICAgICAgICAgIHNzYi5hcHBlbmQodGV4dCwgcmlnaHQsIGxlbik7CisgICAgICAgICAgICByZXR1cm4gc3NiOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgTWVhc3VyZWRUZXh0LnJlY3ljbGUobXQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjc4LDgwICsxMDkzLDEyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwLCBmbG9hdCBhdmFpbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb25lTW9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbW9yZSkgewotICAgICAgICBpbnQgbGVuID0gdGV4dC5sZW5ndGgoKTsKLSAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyW2xlbl07Ci0gICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCAwLCBsZW4sIGJ1ZiwgMCk7CiAKLSAgICAgICAgaW50IGNvbW1hQ291bnQgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoYnVmW2ldID09ICcsJykgewotICAgICAgICAgICAgICAgIGNvbW1hQ291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0W10gd2lkOwotCi0gICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgewotICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSB0ZXh0OwotICAgICAgICAgICAgVGV4dFBhaW50IHRlbXBwYWludCA9IG5ldyBUZXh0UGFpbnQoKTsKLSAgICAgICAgICAgIHdpZCA9IG5ldyBmbG9hdFtsZW4gKiAyXTsKLQotICAgICAgICAgICAgaW50IG5leHQ7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSA9IG5leHQpIHsKLSAgICAgICAgICAgICAgICBuZXh0ID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKGksIGxlbiwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICBTdHlsZWQuZ2V0VGV4dFdpZHRocyhwLCB0ZW1wcGFpbnQsIHNwLCBpLCBuZXh0LCB3aWQsIG51bGwpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkod2lkLCAwLCB3aWQsIGxlbiArIGksIG5leHQgLSBpKTsKKyAgICAgICAgTWVhc3VyZWRUZXh0IG10ID0gTWVhc3VyZWRUZXh0Lm9idGFpbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGxlbiA9IHRleHQubGVuZ3RoKCk7CisgICAgICAgICAgICBmbG9hdCB3aWR0aCA9IHNldFBhcmEobXQsIHAsIHRleHQsIDAsIGxlbiwgTGF5b3V0LkRJUl9SRVFVRVNUX0RFRkFVTFRfTFRSKTsKKyAgICAgICAgICAgIGlmICh3aWR0aCA8PSBhdmFpbCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZCwgbGVuLCB3aWQsIDAsIGxlbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3aWQgPSBuZXcgZmxvYXRbbGVuXTsKLSAgICAgICAgICAgIHAuZ2V0VGV4dFdpZHRocyh0ZXh0LCAwLCBsZW4sIHdpZCk7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBtdC5tQ2hhcnM7CiAKLSAgICAgICAgaW50IG9rID0gMDsKLSAgICAgICAgaW50IG9rUmVtYWluaW5nID0gY29tbWFDb3VudCArIDE7Ci0gICAgICAgIFN0cmluZyBva0Zvcm1hdCA9ICIiOwotCi0gICAgICAgIGludCB3ID0gMDsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICB3ICs9IHdpZFtpXTsKLQotICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PSAnLCcpIHsKLSAgICAgICAgICAgICAgICBjb3VudCsrOwotCi0gICAgICAgICAgICAgICAgaW50IHJlbWFpbmluZyA9IGNvbW1hQ291bnQgLSBjb3VudCArIDE7Ci0gICAgICAgICAgICAgICAgZmxvYXQgbW9yZVdpZDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZm9ybWF0OwotCi0gICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICIgIiArIG9uZU1vcmU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gIiAiICsgU3RyaW5nLmZvcm1hdChtb3JlLCByZW1haW5pbmcpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1vcmVXaWQgPSBwLm1lYXN1cmVUZXh0KGZvcm1hdCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodyArIG1vcmVXaWQgPD0gYXZhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgb2sgPSBpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgb2tSZW1haW5pbmcgPSByZW1haW5pbmc7Ci0gICAgICAgICAgICAgICAgICAgIG9rRm9ybWF0ID0gZm9ybWF0OworICAgICAgICAgICAgaW50IGNvbW1hQ291bnQgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChidWZbaV0gPT0gJywnKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hQ291bnQrKzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KIAotICAgICAgICBpZiAodyA8PSBhdmFpbCkgewotICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgcmVtYWluaW5nID0gY29tbWFDb3VudCArIDE7CisKKyAgICAgICAgICAgIGludCBvayA9IDA7CisgICAgICAgICAgICBpbnQgb2tSZW1haW5pbmcgPSByZW1haW5pbmc7CisgICAgICAgICAgICBTdHJpbmcgb2tGb3JtYXQgPSAiIjsKKworICAgICAgICAgICAgaW50IHcgPSAwOworICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgICAgIGZsb2F0W10gd2lkdGhzID0gbXQubVdpZHRoczsKKworICAgICAgICAgICAgaW50IHJlcXVlc3QgPSBtdC5tRGlyID09IDEgPyBMYXlvdXQuRElSX1JFUVVFU1RfTFRSIDoKKyAgICAgICAgICAgICAgICBMYXlvdXQuRElSX1JFUVVFU1RfUlRMOworCisgICAgICAgICAgICBNZWFzdXJlZFRleHQgdGVtcE10ID0gTWVhc3VyZWRUZXh0Lm9idGFpbigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ldOworCisgICAgICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZm9ybWF0OworICAgICAgICAgICAgICAgICAgICAvLyBYWFggc2hvdWxkIG5vdCBpbnNlcnQgc3BhY2VzLCBzaG91bGQgYmUgcGFydCBvZiBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gWFhYIHNob3VsZCB1c2UgcGx1cmFsIHJ1bGVzIGFuZCBub3QgYXNzdW1lIEVuZ2xpc2ggcGx1cmFscworICAgICAgICAgICAgICAgICAgICBpZiAoLS1yZW1haW5pbmcgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gIiAiICsgb25lTW9yZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICIgIiArIFN0cmluZy5mb3JtYXQobW9yZSwgcmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFhYWCB0aGlzIGlzIHByb2JhYmx5IG9rLCBidXQgbmVlZCB0byBsb29rIGF0IGl0IG1vcmUKKyAgICAgICAgICAgICAgICAgICAgdGVtcE10LnNldFBhcmEoZm9ybWF0LCAwLCBmb3JtYXQubGVuZ3RoKCksIHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBtb3JlV2lkID0gbXQuYWRkU3R5bGVSdW4ocCwgbXQubUxlbiwgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHcgKyBtb3JlV2lkIDw9IGF2YWlsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvayA9IGkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgb2tSZW1haW5pbmcgPSByZW1haW5pbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBva0Zvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1lYXN1cmVkVGV4dC5yZWN5Y2xlKHRlbXBNdCk7CisKICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgb3V0ID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIob2tGb3JtYXQpOwogICAgICAgICAgICAgb3V0Lmluc2VydCgwLCB0ZXh0LCAwLCBvayk7CiAgICAgICAgICAgICByZXR1cm4gb3V0OworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgTWVhc3VyZWRUZXh0LnJlY3ljbGUobXQpOwogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgc2V0UGFyYShNZWFzdXJlZFRleHQgbXQsIFRleHRQYWludCBwYWludCwKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBiaWRpUmVxdWVzdCkgeworCisgICAgICAgIG10LnNldFBhcmEodGV4dCwgc3RhcnQsIGVuZCwgYmlkaVJlcXVlc3QpOworCisgICAgICAgIGZsb2F0IHdpZHRoOworICAgICAgICBTcGFubmVkIHNwID0gdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQgPyAoU3Bhbm5lZCkgdGV4dCA6IG51bGw7CisgICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgaWYgKHNwID09IG51bGwpIHsKKyAgICAgICAgICAgIHdpZHRoID0gbXQuYWRkU3R5bGVSdW4ocGFpbnQsIGxlbiwgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3aWR0aCA9IDA7CisgICAgICAgICAgICBpbnQgc3BhbkVuZDsKKyAgICAgICAgICAgIGZvciAoaW50IHNwYW5TdGFydCA9IDA7IHNwYW5TdGFydCA8IGxlbjsgc3BhblN0YXJ0ID0gc3BhbkVuZCkgeworICAgICAgICAgICAgICAgIHNwYW5FbmQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oc3BhblN0YXJ0LCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuW10gc3BhbnMgPSBzcC5nZXRTcGFucygKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5TdGFydCwgc3BhbkVuZCwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgd2lkdGggKz0gbXQuYWRkU3R5bGVSdW4ocGFpbnQsIHNwYW5zLCBzcGFuRW5kIC0gc3BhblN0YXJ0LCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB3aWR0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZJUlNUX1JJR0hUX1RPX0xFRlQgPSAnXHUwNTkwJzsKKworICAgIC8qIHBhY2thZ2UgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBkb2VzTm90TmVlZEJpZGkoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGVuZCkgeworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworICAgICAgICAgICAgaWYgKHMuY2hhckF0KGkpID49IEZJUlNUX1JJR0hUX1RPX0xFRlQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLworICAgIHN0YXRpYyBib29sZWFuIGRvZXNOb3ROZWVkQmlkaShjaGFyW10gdGV4dCwgaW50IHN0YXJ0LCBpbnQgbGVuKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgZSA9IGkgKyBsZW47IGkgPCBlOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh0ZXh0W2ldID49IEZJUlNUX1JJR0hUX1RPX0xFRlQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgY2hhcltdIG9idGFpbihpbnQgbGVuKSB7CiAgICAgICAgIGNoYXJbXSBidWY7CiAKQEAgLTE1MjksNyArMTM4NSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQX01PREVfQ0hBUkFDVEVSUwogICAgICAgICAgICAgPSBJbnB1dFR5cGUuVFlQRV9URVhUX0ZMQUdfQ0FQX0NIQVJBQ1RFUlM7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDYXBpdGFsaXphdGlvbiBtb2RlIGZvciB7QGxpbmsgI2dldENhcHNNb2RlfTogY2FwaXRhbGl6ZSB0aGUgZmlyc3QKICAgICAgKiBjaGFyYWN0ZXIgb2YgYWxsIHdvcmRzLiAgVGhpcyB2YWx1ZSBpcyBleHBsaWNpdGx5IGRlZmluZWQgdG8gYmUgdGhlIHNhbWUgYXMKQEAgLTE1MzcsNyArMTM5Myw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQX01PREVfV09SRFMKICAgICAgICAgICAgID0gSW5wdXRUeXBlLlRZUEVfVEVYVF9GTEFHX0NBUF9XT1JEUzsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENhcGl0YWxpemF0aW9uIG1vZGUgZm9yIHtAbGluayAjZ2V0Q2Fwc01vZGV9OiBjYXBpdGFsaXplIHRoZSBmaXJzdAogICAgICAqIGNoYXJhY3RlciBvZiBlYWNoIHNlbnRlbmNlLiAgVGhpcyB2YWx1ZSBpcyBleHBsaWNpdGx5IGRlZmluZWQgdG8gYmUgdGhlIHNhbWUgYXMKQEAgLTE1NDUsMTMgKzE0MDEsMTMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBfTU9ERV9TRU5URU5DRVMKICAgICAgICAgICAgID0gSW5wdXRUeXBlLlRZUEVfVEVYVF9GTEFHX0NBUF9TRU5URU5DRVM7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBEZXRlcm1pbmUgd2hhdCBjYXBzIG1vZGUgc2hvdWxkIGJlIGluIGVmZmVjdCBhdCB0aGUgY3VycmVudCBvZmZzZXQgaW4KICAgICAgKiB0aGUgdGV4dC4gIE9ubHkgdGhlIG1vZGUgYml0cyBzZXQgaW4gPHZhcj5yZXFNb2RlczwvdmFyPiB3aWxsIGJlCiAgICAgICogY2hlY2tlZC4gIE5vdGUgdGhhdCB0aGUgY2FwcyBtb2RlIGZsYWdzIGhlcmUgYXJlIGV4cGxpY2l0bHkgZGVmaW5lZAogICAgICAqIHRvIG1hdGNoIHRob3NlIGluIHtAbGluayBJbnB1dFR5cGV9LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGNzIFRoZSB0ZXh0IHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIGNhcHMgbW9kZXMuCiAgICAgICogQHBhcmFtIG9mZiBMb2NhdGlvbiBpbiB0aGUgdGV4dCBhdCB3aGljaCB0byBjaGVjay4KICAgICAgKiBAcGFyYW0gcmVxTW9kZXMgVGhlIG1vZGVzIHRvIGJlIGNoZWNrZWQ6IG1heSBiZSBhbnkgY29tYmluYXRpb24gb2YKQEAgLTE2NTEsNyArMTUwNyw3IEBACiAKICAgICAgICAgcmV0dXJuIG1vZGU7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IHNMb2NrID0gbmV3IE9iamVjdCgpOwogICAgIHByaXZhdGUgc3RhdGljIGNoYXJbXSBzVGVtcCA9IG51bGw7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Ub3VjaC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9tZXRob2QvVG91Y2guamF2YQppbmRleCBhMTlhNzhlLi4zYjk4ZmMzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Ub3VjaC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL1RvdWNoLmphdmEKQEAgLTQ0LDYgKzQ0LDcgQEAKICAgICAgICAgaW50IGxlZnQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKICAgICAgICAgaW50IHJpZ2h0ID0gMDsKICAgICAgICAgQWxpZ25tZW50IGEgPSBudWxsOworICAgICAgICBib29sZWFuIGx0ciA9IHRydWU7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IHRvcDsgaSA8PSBib3R0b207IGkrKykgewogICAgICAgICAgICAgbGVmdCA9IChpbnQpIE1hdGgubWluKGxlZnQsIGxheW91dC5nZXRMaW5lTGVmdChpKSk7CkBAIC01MSw2ICs1Miw3IEBACiAKICAgICAgICAgICAgIGlmIChhID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBhID0gbGF5b3V0LmdldFBhcmFncmFwaEFsaWdubWVudChpKTsKKyAgICAgICAgICAgICAgICBsdHIgPSBsYXlvdXQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGkpID4gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC01OCwxMCArNjAsMTIgQEAKICAgICAgICAgaW50IHdpZHRoID0gd2lkZ2V0LmdldFdpZHRoKCk7CiAgICAgICAgIGludCBkaWZmID0gMDsKIAorICAgICAgICAvLyBhbGlnbl9vcHBvc2l0ZSBkb2VzIE5PVCBtZWFuIGFsaWduX3JpZ2h0LCB3ZSBuZWVkIHRoZSBwYXJhZ3JhcGgKKyAgICAgICAgLy8gZGlyZWN0aW9uIHRvIHJlc29sdmUgaXQgdG8gbGVmdCBvciByaWdodAogICAgICAgICBpZiAocmlnaHQgLSBsZWZ0IDwgd2lkdGggLSBwYWRkaW5nKSB7CiAgICAgICAgICAgICBpZiAoYSA9PSBBbGlnbm1lbnQuQUxJR05fQ0VOVEVSKSB7CiAgICAgICAgICAgICAgICAgZGlmZiA9ICh3aWR0aCAtIHBhZGRpbmcgLSAocmlnaHQgLSBsZWZ0KSkgLyAyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IEFsaWdubWVudC5BTElHTl9PUFBPU0lURSkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChsdHIgPT0gKGEgPT0gQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFKSkgewogICAgICAgICAgICAgICAgIGRpZmYgPSB3aWR0aCAtIHBhZGRpbmcgLSAocmlnaHQgLSBsZWZ0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0FuZHJvaWRFeGNlcHRpb24uamF2YQppbmRleCBhNzY3ZWExLi5kZmUwMGM5YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkRXhjZXB0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkRXhjZXB0aW9uLmphdmEKQEAgLTI3LDYgKzI3LDEwIEBACiAgICAgICAgIHN1cGVyKG5hbWUpOwogICAgIH0KIAorICAgIHB1YmxpYyBBbmRyb2lkRXhjZXB0aW9uKFN0cmluZyBuYW1lLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIobmFtZSwgY2F1c2UpOworICAgIH0KKwogICAgIHB1YmxpYyBBbmRyb2lkRXhjZXB0aW9uKEV4Y2VwdGlvbiBjYXVzZSkgewogICAgICAgICBzdXBlcihjYXVzZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkUnVudGltZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkUnVudGltZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDRlZDE3YmNkLi4yYjgyNGJmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0FuZHJvaWRSdW50aW1lRXhjZXB0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkUnVudGltZUV4Y2VwdGlvbi5qYXZhCkBAIC0yNyw2ICsyNywxMCBAQAogICAgICAgICBzdXBlcihuYW1lKTsKICAgICB9CiAKKyAgICBwdWJsaWMgQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nIG5hbWUsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihuYW1lLCBjYXVzZSk7CisgICAgfQorCiAgICAgcHVibGljIEFuZHJvaWRSdW50aW1lRXhjZXB0aW9uKEV4Y2VwdGlvbiBjYXVzZSkgewogICAgICAgICBzdXBlcihjYXVzZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9DaGFyc2V0VXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvQ2hhcnNldFV0aWxzLmphdmEKaW5kZXggOWQ5MWFjYS4uYTc2M2E2OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9DaGFyc2V0VXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0NoYXJzZXRVdGlscy5qYXZhCkBAIC0xNywzNiArMTcsNTggQEAKIHBhY2thZ2UgYW5kcm9pZC51dGlsOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogCiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKgorICogPHA+CiAgKiBBIGNsYXNzIGNvbnRhaW5pbmcgdXRpbGl0eSBtZXRob2RzIHJlbGF0ZWQgdG8gY2hhcmFjdGVyIHNldHMuIFRoaXMKICAqIGNsYXNzIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIGNvZGUgdGhhdCB3aXNoZXMgdG8gYmUgdmVuZG9yLWF3YXJlCi0gKiBpbiBpdHMgaW50ZXJwcmV0YXRpb24gb2YgSmFwYW5lc2UgZW5jb2RpbmcgbmFtZXMuCi0gKiAKLSAqIDxwPkFzIG9mIHRoaXMgd3JpdGluZywgdGhlIG9ubHkgdmVuZG9yIHRoYXQgaXMgcmVjb2duaXplZCBieSB0aGlzCi0gKiBjbGFzcyBpcyBEb2NvbW8gKGlkZW50aWZpZWQgY2FzZS1pbnNlbnNpdGl2ZWx5IGFzIHtAY29kZSAiZG9jb21vIn0pLjwvcD4KLSAqIAotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MgaXMgaGlkZGVuIGluIEN1cGNha2UsIHdpdGggYSBwbGFuIHRvCi0gKiB1bi1oaWRlIGluIERvbnV0LiBUaGlzIHdhcyBkb25lIGJlY2F1c2UgdGhlIGZpcnN0IGRlcGxveW1lbnQgdG8gdXNlCi0gKiB0aGlzIGNvZGUgaXMgYmFzZWQgb24gQ3VwY2FrZSwgYnV0IHRoZSBBUEkgaGFkIHRvIGJlIGludHJvZHVjZWQKLSAqIGFmdGVyIHRoZSBwdWJsaWMgQVBJIGZyZWV6ZSBmb3IgdGhhdCByZWxlYXNlLiBUaGUgdXBzaG90IGlzIHRoYXQKLSAqIG9ubHkgc3lzdGVtIGFwcGxpY2F0aW9ucyBjYW4gc2FmZWx5IHVzZSB0aGlzIGNsYXNzIHVudGlsIERvbnV0IGlzCi0gKiBhdmFpbGFibGUuCi0gKiAKKyAqIGluIGl0cyBpbnRlcnByZXRhdGlvbiBvZiBKYXBhbmVzZSBjaGFyc2V0IG5hbWVzICh1c2VkIGluIERvQ29NbywKKyAqIEtEREksIGFuZCBTb2Z0QmFuaykuCisgKiA8L3A+CisgKgorICogPHA+CisgKiA8Yj5Ob3RlOjwvYj4gRGV2ZWxvcGVycyB3aWxsIG5lZWQgdG8gYWRkIGFuIGFwcHJvcHJpYXRlIG1hcHBpbmcgZm9yCisgKiBlYWNoIHZlbmRvci1zcGVjaWZpYyBjaGFyc2V0LiBZb3UgbWF5IG5lZWQgdG8gbW9kaWZ5IHRoZSBDIGxpYnJhcmllcworICogbGlrZSBpY3U0YyBpbiBvcmRlciB0byBsZXQgQW5kcm9pZCBzdXBwb3J0IGFuIGFkZGl0aW9uYWwgY2hhcnNldC4KKyAqIDwvcD4KKyAqCiAgKiBAaGlkZQogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQ2hhcnNldFV0aWxzIHsKICAgICAvKioKLSAgICAgKiBuYW1lIG9mIHRoZSB2ZW5kb3IgIkRvY29tbyIuIDxiPk5vdGU6PC9iPiBUaGlzIGlzbid0IGEgcHVibGljCisgICAgICogbmFtZSBvZiB0aGUgdmVuZG9yICJEb0NvTW8iLiA8Yj5Ob3RlOjwvYj4gVGhpcyBpc24ndCBhIHB1YmxpYwogICAgICAqIGNvbnN0YW50LCBpbiBvcmRlciB0byBrZWVwIHRoaXMgY2xhc3MgZnJvbSBiZWNvbWluZyBhIGRlIGZhY3RvCiAgICAgICogcmVmZXJlbmNlIGxpc3Qgb2YgdmVuZG9yIG5hbWVzLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRU5ET1JfRE9DT01PID0gImRvY29tbyI7Ci0gICAgCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgdmVuZG9yICJLRERJIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVORE9SX0tEREkgPSAia2RkaSI7CisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgdmVuZG9yICJTb2Z0QmFuayIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFTkRPUl9TT0ZUQkFOSyA9ICJzb2Z0YmFuayI7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIG9uZS10by1vbmUgbWFwcGluZyBmcm9tIGEgdmVuZG9yIG5hbWUgdG8gYSBjaGFyc2V0IHNwZWNpZmljIHRvIHRoZSB2ZW5kb3IuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBzVmVuZG9yU2hpZnRKaXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIC8vIFRoZXNlIHZhcmlhbnRzIG9mIFNoaWZ0X0pJUyBjb21lIGZyb20gaWN1J3MgbWFwcGluZyBkYXRhIChjb252cnRycy50eHQpCisgICAgICAgIHNWZW5kb3JTaGlmdEppc01hcC5wdXQoVkVORE9SX0RPQ09NTywgImRvY29tby1zaGlmdF9qaXMtMjAwNyIpOworICAgICAgICBzVmVuZG9yU2hpZnRKaXNNYXAucHV0KFZFTkRPUl9LRERJLCAia2RkaS1zaGlmdF9qaXMtMjAwNyIpOworICAgICAgICBzVmVuZG9yU2hpZnRKaXNNYXAucHV0KFZFTkRPUl9TT0ZUQkFOSywgInNvZnRiYW5rLXNoaWZ0X2ppcy0yMDA3Iik7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVGhpcyBjbGFzcyBpcyB1bmluc3RhbnRpYWJsZS4KICAgICAgKi8KQEAgLTU4LDIwICs4MCwyMiBAQAogICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBjaGFyYWN0ZXIgc2V0CiAgICAgICogY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gb3JpZ2luYWwgY2hhcmFjdGVyIHNldCBuYW1lIGFuZAogICAgICAqIHZlbmRvci4gSWYgdGhlcmUgaXMgbm8gdmVuZG9yLXNwZWNpZmljIGNoYXJhY3RlciBzZXQgZm9yIHRoZQotICAgICAqIGdpdmVuIG5hbWUvdmVuZG9yIHBhaXIsIHRoaXMgcmV0dXJucyB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyIHNldAotICAgICAqIG5hbWUuIFRoZSB2ZW5kb3IgbmFtZSBpcyBtYXRjaGVkIGNhc2UtaW5zZW5zaXRpdmVseS4KLSAgICAgKiAKKyAgICAgKiBnaXZlbiBuYW1lL3ZlbmRvciBwYWlyLCB0aGlzIHJldHVybnMgdGhlIG9yaWdpbmFsIGNoYXJhY3RlciBzZXQgbmFtZS4KKyAgICAgKgogICAgICAqIEBwYXJhbSBjaGFyc2V0TmFtZSB0aGUgYmFzZSBjaGFyYWN0ZXIgc2V0IG5hbWUKLSAgICAgKiBAcGFyYW0gdmVuZG9yIHRoZSB2ZW5kb3IgdG8gc3BlY2lhbGl6ZSBmb3IKKyAgICAgKiBAcGFyYW0gdmVuZG9yIHRoZSB2ZW5kb3IgdG8gc3BlY2lhbGl6ZSBmb3IuIEFsbCBjaGFyYWN0ZXJzIHNob3VsZCBiZSBsb3dlci1jYXNlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBzcGVjaWFsaXplZCBjaGFyYWN0ZXIgc2V0IG5hbWUsIG9yIHtAY29kZSBjaGFyc2V0TmFtZX0gaWYKICAgICAgKiB0aGVyZSBpcyBubyBzcGVjaWFsaXplZCBuYW1lCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZUZvclZlbmRvcihTdHJpbmcgY2hhcnNldE5hbWUsIFN0cmluZyB2ZW5kb3IpIHsKLSAgICAgICAgLy8gVE9ETzogRXZlbnR1YWxseSwgdGhpcyBtYXkgd2FudCB0byBiZSB0YWJsZS1kcml2ZW4uCi0KLSAgICAgICAgaWYgKHZlbmRvci5lcXVhbHNJZ25vcmVDYXNlKFZFTkRPUl9ET0NPTU8pCi0gICAgICAgICAgICAgICAgJiYgaXNTaGlmdEppcyhjaGFyc2V0TmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiAiZG9jb21vLXNoaWZ0X2ppcy0yMDA3IjsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjaGFyc2V0TmFtZSkgJiYgIVRleHRVdGlscy5pc0VtcHR5KHZlbmRvcikpIHsKKyAgICAgICAgICAgIC8vIFlvdSBjYW4gYWRkIHlvdXIgb3duIG1hcHBpbmcgaGVyZS4KKyAgICAgICAgICAgIGlmIChpc1NoaWZ0SmlzKGNoYXJzZXROYW1lKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZW5kb3JTaGlmdEppcyA9IHNWZW5kb3JTaGlmdEppc01hcC5nZXQodmVuZG9yKTsKKyAgICAgICAgICAgICAgICBpZiAodmVuZG9yU2hpZnRKaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmVuZG9yU2hpZnRKaXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGNoYXJzZXROYW1lOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9GaW5hbGl6ZXJzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0ZpbmFsaXplcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzFmMmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9GaW5hbGl6ZXJzLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudXRpbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuUGhhbnRvbVJlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlOworCisvKioKKyAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHJlbGlhYmxlIGZpbmFsaXplcnMuCisgKiAKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGaW5hbGl6ZXJzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJGaW5hbGl6ZXJzIjsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBzTG9jayA9IG5ldyBPYmplY3RbMF07CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzSW5pdDsKKyAgICBwcml2YXRlIHN0YXRpYyBSZWNsYWltZXIgc1JlY2xhaW1lcjsKKworICAgIC8qKgorICAgICAqIFN1YmNsYXNzIG9mIFBoYW50b21SZWZlcmVuY2UgdXNlZCB0byByZWNsYWltIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFJlY2xhaW1hYmxlUmVmZXJlbmNlPFQ+IGV4dGVuZHMgUGhhbnRvbVJlZmVyZW5jZTxUPiB7CisgICAgICAgIHB1YmxpYyBSZWNsYWltYWJsZVJlZmVyZW5jZShUIHIsIFJlZmVyZW5jZVF1ZXVlPE9iamVjdD4gcSkgeworICAgICAgICAgICAgc3VwZXIociwgcSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlY2xhaW0oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBxdWV1ZSB1c2VkIHRvIHJlY2xhaW0gUmVjbGFpbWFibGVSZWZlcmVuY2VzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgcXVldWUgb3IgbnVsbCBiZWZvcmUgaW5pdGlhbGl6YXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFJlZmVyZW5jZVF1ZXVlPE9iamVjdD4gZ2V0UXVldWUoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKKyAgICAgICAgICAgIGlmICghc0luaXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc1JlY2xhaW1lci5pc1J1bm5pbmcoKSkgeworICAgICAgICAgICAgICAgIHNSZWNsYWltZXIgPSBuZXcgUmVjbGFpbWVyKHNSZWNsYWltZXIubVF1ZXVlKTsKKyAgICAgICAgICAgICAgICBzUmVjbGFpbWVyLnN0YXJ0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc1JlY2xhaW1lci5tUXVldWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGJ5IFp5Z290ZS4gRG9uJ3QgdG91Y2ghCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXQoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKKyAgICAgICAgICAgIGlmICghc0luaXQgJiYgc1JlY2xhaW1lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc1JlY2xhaW1lciA9IG5ldyBSZWNsYWltZXIoKTsKKyAgICAgICAgICAgICAgICBzUmVjbGFpbWVyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgc0luaXQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlY2xhaW1lciBleHRlbmRzIFRocmVhZCB7CisgICAgICAgIFJlZmVyZW5jZVF1ZXVlPE9iamVjdD4gbVF1ZXVlOworCisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtUnVubmluZyA9IGZhbHNlOworCisgICAgICAgIFJlY2xhaW1lcigpIHsKKyAgICAgICAgICAgIHRoaXMobmV3IFJlZmVyZW5jZVF1ZXVlPE9iamVjdD4oKSk7CisgICAgICAgIH0KKworICAgICAgICBSZWNsYWltZXIoUmVmZXJlbmNlUXVldWU8T2JqZWN0PiBxdWV1ZSkgeworICAgICAgICAgICAgc3VwZXIoIlJlY2xhaW1lciIpOworICAgICAgICAgICAgc2V0RGFlbW9uKHRydWUpOworICAgICAgICAgICAgbVF1ZXVlID0gcXVldWU7ICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgICAgICBtUnVubmluZyA9IHRydWU7CisgICAgICAgICAgICBzdXBlci5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpc1J1bm5pbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJ1bm5pbmc7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkluZmluaXRlTG9vcFN0YXRlbWVudCJ9KQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5VcChtUXVldWUucmVtb3ZlKCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlJlY2xhaW1lciB0aHJlYWQgZXhpdGluZzogIiwgZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY2xlYW5VcChSZWZlcmVuY2U8Pz4gcmVmZXJlbmNlKSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgcmVmZXJlbmNlLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgKChSZWNsYWltYWJsZVJlZmVyZW5jZTw/PikgcmVmZXJlbmNlKS5yZWNsYWltKCk7CisgICAgICAgICAgICB9IHdoaWxlICgocmVmZXJlbmNlID0gbVF1ZXVlLnBvbGwoKSkgIT0gbnVsbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25SZWFkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvblJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNDViZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25SZWFkZXIuamF2YQpAQCAtMCwwICsxLDEwNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBSZWFkcyBhIEpTT04gKDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQ2MjcudHh0Ij5SRkMgNDYyNzwvYT4pCisgKiBlbmNvZGVkIHZhbHVlIGFzIGEgc3RyZWFtIG9mIHRva2Vucy4gVGhpcyBzdHJlYW0gaW5jbHVkZXMgYm90aCBsaXRlcmFsCisgKiB2YWx1ZXMgKHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zLCBhbmQgbnVsbHMpIGFzIHdlbGwgYXMgdGhlIGJlZ2luIGFuZAorICogZW5kIGRlbGltaXRlcnMgb2Ygb2JqZWN0cyBhbmQgYXJyYXlzLiBUaGUgdG9rZW5zIGFyZSB0cmF2ZXJzZWQgaW4KKyAqIGRlcHRoLWZpcnN0IG9yZGVyLCB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZXkgYXBwZWFyIGluIHRoZSBKU09OIGRvY3VtZW50LgorICogV2l0aGluIEpTT04gb2JqZWN0cywgbmFtZS92YWx1ZSBwYWlycyBhcmUgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgdG9rZW4uCisgKgorICogPGgzPlBhcnNpbmcgSlNPTjwvaDM+CisgKiBUbyBjcmVhdGUgYSByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIgeW91ciBvd24gSlNPTiBzdHJlYW1zLCBmaXJzdCBjcmVhdGUgYW4KKyAqIGVudHJ5IHBvaW50IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSB7QGNvZGUgSnNvblJlYWRlcn0uCisgKgorICogPHA+TmV4dCwgY3JlYXRlIGhhbmRsZXIgbWV0aG9kcyBmb3IgZWFjaCBzdHJ1Y3R1cmUgaW4geW91ciBKU09OIHRleHQuIFlvdSdsbAorICogbmVlZCBhIG1ldGhvZCBmb3IgZWFjaCBvYmplY3QgdHlwZSBhbmQgZm9yIGVhY2ggYXJyYXkgdHlwZS4KKyAqIDx1bD4KKyAqICAgPGxpPldpdGhpbiA8c3Ryb25nPmFycmF5IGhhbmRsaW5nPC9zdHJvbmc+IG1ldGhvZHMsIGZpcnN0IGNhbGwge0BsaW5rCisgKiAgICAgICAjYmVnaW5BcnJheX0gdG8gY29uc3VtZSB0aGUgYXJyYXkncyBvcGVuaW5nIGJyYWNrZXQuIFRoZW4gY3JlYXRlIGEKKyAqICAgICAgIHdoaWxlIGxvb3AgdGhhdCBhY2N1bXVsYXRlcyB2YWx1ZXMsIHRlcm1pbmF0aW5nIHdoZW4ge0BsaW5rICNoYXNOZXh0fQorICogICAgICAgaXMgZmFsc2UuIEZpbmFsbHksIHJlYWQgdGhlIGFycmF5J3MgY2xvc2luZyBicmFja2V0IGJ5IGNhbGxpbmcge0BsaW5rCisgKiAgICAgICAjZW5kQXJyYXl9LgorICogICA8bGk+V2l0aGluIDxzdHJvbmc+b2JqZWN0IGhhbmRsaW5nPC9zdHJvbmc+IG1ldGhvZHMsIGZpcnN0IGNhbGwge0BsaW5rCisgKiAgICAgICAjYmVnaW5PYmplY3R9IHRvIGNvbnN1bWUgdGhlIG9iamVjdCdzIG9wZW5pbmcgYnJhY2UuIFRoZW4gY3JlYXRlIGEKKyAqICAgICAgIHdoaWxlIGxvb3AgdGhhdCBhc3NpZ25zIHZhbHVlcyB0byBsb2NhbCB2YXJpYWJsZXMgYmFzZWQgb24gdGhlaXIgbmFtZS4KKyAqICAgICAgIFRoaXMgbG9vcCBzaG91bGQgdGVybWluYXRlIHdoZW4ge0BsaW5rICNoYXNOZXh0fSBpcyBmYWxzZS4gRmluYWxseSwKKyAqICAgICAgIHJlYWQgdGhlIG9iamVjdCdzIGNsb3NpbmcgYnJhY2UgYnkgY2FsbGluZyB7QGxpbmsgI2VuZE9iamVjdH0uCisgKiA8L3VsPgorICogPHA+V2hlbiBhIG5lc3RlZCBvYmplY3Qgb3IgYXJyYXkgaXMgZW5jb3VudGVyZWQsIGRlbGVnYXRlIHRvIHRoZQorICogY29ycmVzcG9uZGluZyBoYW5kbGVyIG1ldGhvZC4KKyAqCisgKiA8cD5XaGVuIGFuIHVua25vd24gbmFtZSBpcyBlbmNvdW50ZXJlZCwgc3RyaWN0IHBhcnNlcnMgc2hvdWxkIGZhaWwgd2l0aCBhbgorICogZXhjZXB0aW9uLiBMZW5pZW50IHBhcnNlcnMgc2hvdWxkIGNhbGwge0BsaW5rICNza2lwVmFsdWUoKX0gdG8gcmVjdXJzaXZlbHkKKyAqIHNraXAgdGhlIHZhbHVlJ3MgbmVzdGVkIHRva2Vucywgd2hpY2ggbWF5IG90aGVyd2lzZSBjb25mbGljdC4KKyAqCisgKiA8cD5JZiBhIHZhbHVlIG1heSBiZSBudWxsLCB5b3Ugc2hvdWxkIGZpcnN0IGNoZWNrIHVzaW5nIHtAbGluayAjcGVlaygpfS4KKyAqIE51bGwgbGl0ZXJhbHMgY2FuIGJlIGNvbnN1bWVkIHVzaW5nIGVpdGhlciB7QGxpbmsgI25leHROdWxsKCl9IG9yIHtAbGluaworICogI3NraXBWYWx1ZSgpfS4KKyAqCisgKiA8aDM+RXhhbXBsZTwvaDM+CisgKiBTdXBwb3NlIHdlJ2QgbGlrZSB0byBwYXJzZSBhIHN0cmVhbSBvZiBtZXNzYWdlcyBzdWNoIGFzIHRoZSBmb2xsb3dpbmc6IDxwcmU+IHtAY29kZQorICogWworICogICB7CisgKiAgICAgImlkIjogOTEyMzQ1Njc4OTAxLAorICogICAgICJ0ZXh0IjogIkhvdyBkbyBJIHJlYWQgSlNPTiBvbiBBbmRyb2lkPyIsCisgKiAgICAgImdlbyI6IG51bGwsCisgKiAgICAgInVzZXIiOiB7CisgKiAgICAgICAibmFtZSI6ICJhbmRyb2lkX25ld2IiLAorICogICAgICAgImZvbGxvd2Vyc19jb3VudCI6IDQxCisgKiAgICAgIH0KKyAqICAgfSwKKyAqICAgeworICogICAgICJpZCI6IDkxMjM0NTY3ODkwMiwKKyAqICAgICAidGV4dCI6ICJAYW5kcm9pZF9uZXdiIGp1c3QgdXNlIGFuZHJvaWQudXRpbC5Kc29uUmVhZGVyISIsCisgKiAgICAgImdlbyI6IFs1MC40NTQ3MjIsIC0xMDQuNjA2NjY3XSwKKyAqICAgICAidXNlciI6IHsKKyAqICAgICAgICJuYW1lIjogImplc3NlIiwKKyAqICAgICAgICJmb2xsb3dlcnNfY291bnQiOiAyCisgKiAgICAgfQorICogICB9CisgKiBdfTwvcHJlPgorICogVGhpcyBjb2RlIGltcGxlbWVudHMgdGhlIHBhcnNlciBmb3IgdGhlIGFib3ZlIHN0cnVjdHVyZTogPHByZT4gICB7QGNvZGUKKyAqCisgKiAgIHB1YmxpYyBMaXN0PE1lc3NhZ2U+IHJlYWRKc29uU3RyZWFtKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICogICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCAiVVRGLTgiKSk7CisgKiAgICAgcmV0dXJuIHJlYWRNZXNzYWdlc0FycmF5KHJlYWRlcik7CisgKiAgIH0KKyAqCisgKiAgIHB1YmxpYyBMaXN0PE1lc3NhZ2U+IHJlYWRNZXNzYWdlc0FycmF5KEpzb25SZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICogICAgIExpc3Q8TWVzc2FnZT4gbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0PE1lc3NhZ2U+KCk7CisgKgorICogICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgKiAgICAgd2hpbGUgKHJlYWRlci5oYXNOZXh0KCkpIHsKKyAqICAgICAgIG1lc3NhZ2VzLmFkZChyZWFkTWVzc2FnZShyZWFkZXIpKTsKKyAqICAgICB9CisgKiAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgKiAgICAgcmV0dXJuIG1lc3NhZ2VzOworICogICB9CisgKgorICogICBwdWJsaWMgTWVzc2FnZSByZWFkTWVzc2FnZShKc29uUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAqICAgICBsb25nIGlkID0gLTE7CisgKiAgICAgU3RyaW5nIHRleHQgPSBudWxsOworICogICAgIFVzZXIgdXNlciA9IG51bGw7CisgKiAgICAgTGlzdDxEb3VibGU+IGdlbyA9IG51bGw7CisgKgorICogICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICogICAgIHdoaWxlIChyZWFkZXIuaGFzTmV4dCgpKSB7CisgKiAgICAgICBTdHJpbmcgbmFtZSA9IHJlYWRlci5uZXh0TmFtZSgpOworICogICAgICAgaWYgKG5hbWUuZXF1YWxzKCJpZCIpKSB7CisgKiAgICAgICAgIGlkID0gcmVhZGVyLm5leHRMb25nKCk7CisgKiAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJ0ZXh0IikpIHsKKyAqICAgICAgICAgdGV4dCA9IHJlYWRlci5uZXh0U3RyaW5nKCk7CisgKiAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJnZW8iKSAmJiByZWFkZXIucGVlaygpICE9IEpzb25Ub2tlbi5OVUxMKSB7CisgKiAgICAgICAgIGdlbyA9IHJlYWREb3VibGVzQXJyYXkocmVhZGVyKTsKKyAqICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoInVzZXIiKSkgeworICogICAgICAgICB1c2VyID0gcmVhZFVzZXIocmVhZGVyKTsKKyAqICAgICAgIH0gZWxzZSB7CisgKiAgICAgICAgIHJlYWRlci5za2lwVmFsdWUoKTsKKyAqICAgICAgIH0KKyAqICAgICB9CisgKiAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICogICAgIHJldHVybiBuZXcgTWVzc2FnZShpZCwgdGV4dCwgdXNlciwgZ2VvKTsKKyAqICAgfQorICoKKyAqICAgcHVibGljIExpc3Q8RG91YmxlPiByZWFkRG91Ymxlc0FycmF5KEpzb25SZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICogICAgIExpc3Q8RG91YmxlPiBkb3VibGVzID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisgKgorICogICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgKiAgICAgd2hpbGUgKHJlYWRlci5oYXNOZXh0KCkpIHsKKyAqICAgICAgIGRvdWJsZXMuYWRkKHJlYWRlci5uZXh0RG91YmxlKCkpOworICogICAgIH0KKyAqICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAqICAgICByZXR1cm4gZG91YmxlczsKKyAqICAgfQorICoKKyAqICAgcHVibGljIFVzZXIgcmVhZFVzZXIoSnNvblJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgKiAgICAgU3RyaW5nIHVzZXJuYW1lID0gbnVsbDsKKyAqICAgICBpbnQgZm9sbG93ZXJzQ291bnQgPSAtMTsKKyAqCisgKiAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgKiAgICAgd2hpbGUgKHJlYWRlci5oYXNOZXh0KCkpIHsKKyAqICAgICAgIFN0cmluZyBuYW1lID0gcmVhZGVyLm5leHROYW1lKCk7CisgKiAgICAgICBpZiAobmFtZS5lcXVhbHMoIm5hbWUiKSkgeworICogICAgICAgICB1c2VybmFtZSA9IHJlYWRlci5uZXh0U3RyaW5nKCk7CisgKiAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJmb2xsb3dlcnNfY291bnQiKSkgeworICogICAgICAgICBmb2xsb3dlcnNDb3VudCA9IHJlYWRlci5uZXh0SW50KCk7CisgKiAgICAgICB9IGVsc2UgeworICogICAgICAgICByZWFkZXIuc2tpcFZhbHVlKCk7CisgKiAgICAgICB9CisgKiAgICAgfQorICogICAgIHJlYWRlci5lbmRPYmplY3QoKTsKKyAqICAgICByZXR1cm4gbmV3IFVzZXIodXNlcm5hbWUsIGZvbGxvd2Vyc0NvdW50KTsKKyAqICAgfX08L3ByZT4KKyAqCisgKiA8aDM+TnVtYmVyIEhhbmRsaW5nPC9oMz4KKyAqIFRoaXMgcmVhZGVyIHBlcm1pdHMgbnVtZXJpYyB2YWx1ZXMgdG8gYmUgcmVhZCBhcyBzdHJpbmdzIGFuZCBzdHJpbmcgdmFsdWVzIHRvCisgKiBiZSByZWFkIGFzIG51bWJlcnMuIEZvciBleGFtcGxlLCBib3RoIGVsZW1lbnRzIG9mIHRoZSBKU09OIGFycmF5IHtAY29kZQorICogWzEsICIxIl19IG1heSBiZSByZWFkIHVzaW5nIGVpdGhlciB7QGxpbmsgI25leHRJbnR9IG9yIHtAbGluayAjbmV4dFN0cmluZ30uCisgKiBUaGlzIGJlaGF2aW9yIGlzIGludGVuZGVkIHRvIHByZXZlbnQgbG9zc3kgbnVtZXJpYyBjb252ZXJzaW9uczogZG91YmxlIGlzCisgKiBKYXZhU2NyaXB0J3Mgb25seSBudW1lcmljIHR5cGUgYW5kIHZlcnkgbGFyZ2UgdmFsdWVzIGxpa2Uge0Bjb2RlCisgKiA5MDA3MTk5MjU0NzQwOTkzfSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBvbiB0aGF0IHBsYXRmb3JtLiBUbyBtaW5pbWl6ZQorICogcHJlY2lzaW9uIGxvc3MsIGV4dHJlbWVseSBsYXJnZSB2YWx1ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gYW5kIHJlYWQgYXMgc3RyaW5ncworICogaW4gSlNPTi4KKyAqCisgKiA8cD5FYWNoIHtAY29kZSBKc29uUmVhZGVyfSBtYXkgYmUgdXNlZCB0byByZWFkIGEgc2luZ2xlIEpTT04gc3RyZWFtLiBJbnN0YW5jZXMKKyAqIG9mIHRoaXMgY2xhc3MgYXJlIG5vdCB0aHJlYWQgc2FmZS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEpzb25SZWFkZXIgaW1wbGVtZW50cyBDbG9zZWFibGUgeworCisgICAgLyoqIFRoZSBpbnB1dCBKU09OLiAqLworICAgIHByaXZhdGUgZmluYWwgUmVhZGVyIGluOworCisgICAgLyoqIFRydWUgdG8gYWNjZXB0IG5vbi1zcGVjIGNvbXBsaWFudCBKU09OICovCisgICAgcHJpdmF0ZSBib29sZWFuIGxlbmllbnQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFVzZSBhIG1hbnVhbCBidWZmZXIgdG8gZWFzaWx5IHJlYWQgYW5kIHVucmVhZCB1cGNvbWluZyBjaGFyYWN0ZXJzLCBhbmQKKyAgICAgKiBhbHNvIHNvIHdlIGNhbiBjcmVhdGUgc3RyaW5ncyB3aXRob3V0IGFuIGludGVybWVkaWF0ZSBTdHJpbmdCdWlsZGVyLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWzEwMjRdOworICAgIHByaXZhdGUgaW50IHBvcyA9IDA7CisgICAgcHJpdmF0ZSBpbnQgbGltaXQgPSAwOworCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEpzb25TY29wZT4gc3RhY2sgPSBuZXcgQXJyYXlMaXN0PEpzb25TY29wZT4oKTsKKyAgICB7CisgICAgICAgIHB1c2goSnNvblNjb3BlLkVNUFRZX0RPQ1VNRU5UKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHdlJ3ZlIGFscmVhZHkgcmVhZCB0aGUgbmV4dCB0b2tlbi4gSWYgd2UgaGF2ZSwgdGhlIHN0cmluZyB2YWx1ZQorICAgICAqIGZvciB0aGF0IHRva2VuIHdpbGwgYmUgYXNzaWduZWQgdG8ge0Bjb2RlIHZhbHVlfSBpZiBzdWNoIGEgc3RyaW5nIHZhbHVlCisgICAgICogZXhpc3RzLiBBbmQgdGhlIHRva2VuIHR5cGUgd2lsbCBiZSBhc3NpZ25lZCB0byB7QGNvZGUgdG9rZW59IGlmIHRoZSB0b2tlbgorICAgICAqIHR5cGUgaXMga25vd24uIFRoZSB0b2tlbiB0eXBlIG1heSBiZSBudWxsIGZvciBsaXRlcmFscywgc2luY2Ugd2UgZGVyaXZlCisgICAgICogdGhhdCBsYXppbHkuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1Rva2VuOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgdGhlIG5leHQgdG9rZW4gdG8gYmUgcmV0dXJuZWQgYnkge0BsaW5rICNwZWVrfSBhbmQge0BsaW5rCisgICAgICogI2FkdmFuY2V9LCBvciB7QGNvZGUgbnVsbH0gaWYgaXQgaXMgdW5rbm93biBhbmQgbXVzdCBmaXJzdCBiZSBkZXJpdmVkCisgICAgICogZnJvbSB7QGNvZGUgdmFsdWV9LiBUaGlzIHZhbHVlIGlzIHVuZGVmaW5lZCBpZiB7QGNvZGUgaGFzVG9rZW59IGlzIGZhbHNlLgorICAgICAqLworICAgIHByaXZhdGUgSnNvblRva2VuIHRva2VuOworCisgICAgLyoqIFRoZSB0ZXh0IG9mIHRoZSBuZXh0IG5hbWUuICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIC8qKiBUaGUgdGV4dCBvZiB0aGUgbmV4dCBsaXRlcmFsIHZhbHVlLiAqLworICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgLyoqIFRydWUgaWYgd2UncmUgY3VycmVudGx5IGhhbmRsaW5nIGEgc2tpcFZhbHVlKCkgY2FsbC4gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2tpcHBpbmcgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgdGhhdCByZWFkcyBhIEpTT04tZW5jb2RlZCBzdHJlYW0gZnJvbSB7QGNvZGUgaW59LgorICAgICAqLworICAgIHB1YmxpYyBKc29uUmVhZGVyKFJlYWRlciBpbikgeworICAgICAgICBpZiAoaW4gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJpbiA9PSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5pbiA9IGluOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZSB0aGlzIHBhcnNlciB0byBiZSAgYmUgbGliZXJhbCBpbiB3aGF0IGl0IGFjY2VwdHMuIEJ5IGRlZmF1bHQsCisgICAgICogdGhpcyBwYXJzZXIgaXMgc3RyaWN0IGFuZCBvbmx5IGFjY2VwdHMgSlNPTiBhcyBzcGVjaWZpZWQgYnkgPGEKKyAgICAgKiBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0NjI3LnR4dCI+UkZDIDQ2Mjc8L2E+LiBTZXR0aW5nIHRoZQorICAgICAqIHBhcnNlciB0byBsZW5pZW50IGNhdXNlcyBpdCB0byBpZ25vcmUgdGhlIGZvbGxvd2luZyBzeW50YXggZXJyb3JzOgorICAgICAqCisgICAgICogPHVsPgorICAgICAqICAgPGxpPkVuZCBvZiBsaW5lIGNvbW1lbnRzIHN0YXJ0aW5nIHdpdGgge0Bjb2RlIC8vfSBvciB7QGNvZGUgI30gYW5kCisgICAgICogICAgICAgZW5kaW5nIHdpdGggYSBuZXdsaW5lIGNoYXJhY3Rlci4KKyAgICAgKiAgIDxsaT5DLXN0eWxlIGNvbW1lbnRzIHN0YXJ0aW5nIHdpdGgge0Bjb2RlIC8qfSBhbmQgZW5kaW5nIHdpdGgKKyAgICAgKiAgICAgICB7QGNvZGUgKn17QGNvZGUgL30uIFN1Y2ggY29tbWVudHMgbWF5IG5vdCBiZSBuZXN0ZWQuCisgICAgICogICA8bGk+TmFtZXMgdGhhdCBhcmUgdW5xdW90ZWQgb3Ige0Bjb2RlICdzaW5nbGUgcXVvdGVkJ30uCisgICAgICogICA8bGk+U3RyaW5ncyB0aGF0IGFyZSB1bnF1b3RlZCBvciB7QGNvZGUgJ3NpbmdsZSBxdW90ZWQnfS4KKyAgICAgKiAgIDxsaT5BcnJheSBlbGVtZW50cyBzZXBhcmF0ZWQgYnkge0Bjb2RlIDt9IGluc3RlYWQgb2Yge0Bjb2RlICx9LgorICAgICAqICAgPGxpPlVubmVjZXNzYXJ5IGFycmF5IHNlcGFyYXRvcnMuIFRoZXNlIGFyZSBpbnRlcnByZXRlZCBhcyBpZiBudWxsCisgICAgICogICAgICAgd2FzIHRoZSBvbWl0dGVkIHZhbHVlLgorICAgICAqICAgPGxpPk5hbWVzIGFuZCB2YWx1ZXMgc2VwYXJhdGVkIGJ5IHtAY29kZSA9fSBvciB7QGNvZGUgPT59IGluc3RlYWQgb2YKKyAgICAgKiAgICAgICB7QGNvZGUgOn0uCisgICAgICogICA8bGk+TmFtZS92YWx1ZSBwYWlycyBzZXBhcmF0ZWQgYnkge0Bjb2RlIDt9IGluc3RlYWQgb2Yge0Bjb2RlICx9LgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGVuaWVudChib29sZWFuIGxlbmllbnQpIHsKKyAgICAgICAgdGhpcy5sZW5pZW50ID0gbGVuaWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdW1lcyB0aGUgbmV4dCB0b2tlbiBmcm9tIHRoZSBKU09OIHN0cmVhbSBhbmQgYXNzZXJ0cyB0aGF0IGl0IGlzIHRoZQorICAgICAqIGJlZ2lubmluZyBvZiBhIG5ldyBhcnJheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWdpbkFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0KEpzb25Ub2tlbi5CRUdJTl9BUlJBWSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3VtZXMgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgSlNPTiBzdHJlYW0gYW5kIGFzc2VydHMgdGhhdCBpdCBpcyB0aGUKKyAgICAgKiBlbmQgb2YgdGhlIGN1cnJlbnQgYXJyYXkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleHBlY3QoSnNvblRva2VuLkVORF9BUlJBWSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3VtZXMgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgSlNPTiBzdHJlYW0gYW5kIGFzc2VydHMgdGhhdCBpdCBpcyB0aGUKKyAgICAgKiBiZWdpbm5pbmcgb2YgYSBuZXcgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luT2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0KEpzb25Ub2tlbi5CRUdJTl9PQkpFQ1QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN1bWVzIHRoZSBuZXh0IHRva2VuIGZyb20gdGhlIEpTT04gc3RyZWFtIGFuZCBhc3NlcnRzIHRoYXQgaXQgaXMgdGhlCisgICAgICogZW5kIG9mIHRoZSBjdXJyZW50IGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZE9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdChKc29uVG9rZW4uRU5EX09CSkVDVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3VtZXMge0Bjb2RlIGV4cGVjdGVkfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZXhwZWN0KEpzb25Ub2tlbiBleHBlY3RlZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcXVpY2tQZWVrKCk7CisgICAgICAgIGlmICh0b2tlbiAhPSBleHBlY3RlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXhwZWN0ZWQgIiArIGV4cGVjdGVkICsgIiBidXQgd2FzICIgKyBwZWVrKCkpOworICAgICAgICB9CisgICAgICAgIGFkdmFuY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgYXJyYXkgb3Igb2JqZWN0IGhhcyBhbm90aGVyIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHF1aWNrUGVlaygpOworICAgICAgICByZXR1cm4gdG9rZW4gIT0gSnNvblRva2VuLkVORF9PQkpFQ1QgJiYgdG9rZW4gIT0gSnNvblRva2VuLkVORF9BUlJBWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBuZXh0IHRva2VuIHdpdGhvdXQgY29uc3VtaW5nIGl0LgorICAgICAqLworICAgIHB1YmxpYyBKc29uVG9rZW4gcGVlaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHF1aWNrUGVlaygpOworCisgICAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7CisgICAgICAgICAgICBkZWNvZGVMaXRlcmFsKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdG9rZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGF0IGEgdG9rZW4gaXMgcmVhZHkuIEFmdGVyIHRoaXMgY2FsbCBlaXRoZXIge0Bjb2RlIHRva2VufSBvcgorICAgICAqIHtAY29kZSB2YWx1ZX0gd2lsbCBiZSBub24tbnVsbC4gVG8gZW5zdXJlIHtAY29kZSB0b2tlbn0gaGFzIGEgZGVmaW5pdGl2ZQorICAgICAqIHZhbHVlLCB1c2Uge0BsaW5rICNwZWVrKCl9CisgICAgICovCisgICAgcHJpdmF0ZSBKc29uVG9rZW4gcXVpY2tQZWVrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGhhc1Rva2VuKSB7CisgICAgICAgICAgICByZXR1cm4gdG9rZW47CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHBlZWtTdGFjaygpKSB7CisgICAgICAgICAgICBjYXNlIEVNUFRZX0RPQ1VNRU5UOgorICAgICAgICAgICAgICAgIHJlcGxhY2VUb3AoSnNvblNjb3BlLk5PTkVNUFRZX0RPQ1VNRU5UKTsKKyAgICAgICAgICAgICAgICBKc29uVG9rZW4gZmlyc3RUb2tlbiA9IG5leHRWYWx1ZSgpOworICAgICAgICAgICAgICAgIGlmICh0b2tlbiAhPSBKc29uVG9rZW4uQkVHSU5fQVJSQVkgJiYgdG9rZW4gIT0gSnNvblRva2VuLkJFR0lOX09CSkVDVCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIEpTT04gZG9jdW1lbnQgdG8gc3RhcnQgd2l0aCAnWycgb3IgJ3snIGJ1dCB3YXMgIiArIHRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0VG9rZW47CisgICAgICAgICAgICBjYXNlIEVNUFRZX0FSUkFZOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXh0SW5BcnJheSh0cnVlKTsKKyAgICAgICAgICAgIGNhc2UgTk9ORU1QVFlfQVJSQVk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRJbkFycmF5KGZhbHNlKTsKKyAgICAgICAgICAgIGNhc2UgRU1QVFlfT0JKRUNUOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXh0SW5PYmplY3QodHJ1ZSk7CisgICAgICAgICAgICBjYXNlIERBTkdMSU5HX05BTUU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdFZhbHVlKCk7CisgICAgICAgICAgICBjYXNlIE5PTkVNUFRZX09CSkVDVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dEluT2JqZWN0KGZhbHNlKTsKKyAgICAgICAgICAgIGNhc2UgTk9ORU1QVFlfRE9DVU1FTlQ6CisgICAgICAgICAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQ7CisgICAgICAgICAgICBjYXNlIENMT1NFRDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJKc29uUmVhZGVyIGlzIGNsb3NlZCIpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkdmFuY2VzIHRoZSBjdXJzb3IgaW4gdGhlIEpTT04gc3RyZWFtIHRvIHRoZSBuZXh0IHRva2VuLgorICAgICAqLworICAgIHByaXZhdGUgSnNvblRva2VuIGFkdmFuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBxdWlja1BlZWsoKTsKKworICAgICAgICBKc29uVG9rZW4gcmVzdWx0ID0gdG9rZW47CisgICAgICAgIGhhc1Rva2VuID0gZmFsc2U7CisgICAgICAgIHRva2VuID0gbnVsbDsKKyAgICAgICAgdmFsdWUgPSBudWxsOworICAgICAgICBuYW1lID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHRva2VuLCBhIHtAbGluayBKc29uVG9rZW4jTkFNRSBwcm9wZXJ0eSBuYW1lfSwgYW5kCisgICAgICogY29uc3VtZXMgaXQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBuZXh0IHRva2VuIGluIHRoZSBzdHJlYW0gaXMgbm90IGEgcHJvcGVydHkKKyAgICAgKiAgICAgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIG5leHROYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcXVpY2tQZWVrKCk7CisgICAgICAgIGlmICh0b2tlbiAhPSBKc29uVG9rZW4uTkFNRSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXhwZWN0ZWQgYSBuYW1lIGJ1dCB3YXMgIiArIHBlZWsoKSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG5hbWU7CisgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSnNvblRva2VuI1NUUklORyBzdHJpbmd9IHZhbHVlIG9mIHRoZSBuZXh0IHRva2VuLAorICAgICAqIGNvbnN1bWluZyBpdC4gSWYgdGhlIG5leHQgdG9rZW4gaXMgYSBudW1iZXIsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGl0cworICAgICAqIHN0cmluZyBmb3JtLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIG5leHQgdG9rZW4gaXMgbm90IGEgc3RyaW5nIG9yIGlmCisgICAgICogICAgIHRoaXMgcmVhZGVyIGlzIGNsb3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIG5leHRTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBwZWVrKCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8ICh0b2tlbiAhPSBKc29uVG9rZW4uU1RSSU5HICYmIHRva2VuICE9IEpzb25Ub2tlbi5OVU1CRVIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBhIHN0cmluZyBidXQgd2FzICIgKyBwZWVrKCkpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHZhbHVlOworICAgICAgICBhZHZhbmNlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0BsaW5rIEpzb25Ub2tlbiNCT09MRUFOIGJvb2xlYW59IHZhbHVlIG9mIHRoZSBuZXh0IHRva2VuLAorICAgICAqIGNvbnN1bWluZyBpdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBuZXh0IHRva2VuIGlzIG5vdCBhIGJvb2xlYW4gb3IgaWYKKyAgICAgKiAgICAgdGhpcyByZWFkZXIgaXMgY2xvc2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG5leHRCb29sZWFuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcXVpY2tQZWVrKCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHRva2VuID09IEpzb25Ub2tlbi5TVFJJTkcpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIGEgYm9vbGVhbiBidXQgd2FzICIgKyBwZWVrKCkpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiByZXN1bHQ7CisgICAgICAgIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3QgYSBib29sZWFuOiAiICsgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgYWR2YW5jZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN1bWVzIHRoZSBuZXh0IHRva2VuIGZyb20gdGhlIEpTT04gc3RyZWFtIGFuZCBhc3NlcnRzIHRoYXQgaXQgaXMgYQorICAgICAqIGxpdGVyYWwgbnVsbC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBuZXh0IHRva2VuIGlzIG5vdCBudWxsIG9yIGlmIHRoaXMKKyAgICAgKiAgICAgcmVhZGVyIGlzIGNsb3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBuZXh0TnVsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHF1aWNrUGVlaygpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB0b2tlbiA9PSBKc29uVG9rZW4uU1RSSU5HKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBudWxsIGJ1dCB3YXMgIiArIHBlZWsoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoIm51bGwiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm90IGEgbnVsbDogIiArIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGFkdmFuY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSnNvblRva2VuI05VTUJFUiBkb3VibGV9IHZhbHVlIG9mIHRoZSBuZXh0IHRva2VuLAorICAgICAqIGNvbnN1bWluZyBpdC4gSWYgdGhlIG5leHQgdG9rZW4gaXMgYSBzdHJpbmcsIHRoaXMgbWV0aG9kIHdpbGwgYXR0ZW1wdCB0bworICAgICAqIHBhcnNlIGl0IGFzIGEgZG91YmxlLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIG5leHQgdG9rZW4gaXMgbm90IGEgbGl0ZXJhbCB2YWx1ZS4KKyAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZiB0aGUgbmV4dCBsaXRlcmFsIHZhbHVlIGNhbm5vdCBiZSBwYXJzZWQKKyAgICAgKiAgICAgYXMgYSBkb3VibGUsIG9yIGlzIG5vbi1maW5pdGUuCisgICAgICovCisgICAgcHVibGljIGRvdWJsZSBuZXh0RG91YmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcXVpY2tQZWVrKCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBhIGRvdWJsZSBidXQgd2FzICIgKyBwZWVrKCkpOworICAgICAgICB9CisKKyAgICAgICAgZG91YmxlIHJlc3VsdCA9IERvdWJsZS5wYXJzZURvdWJsZSh2YWx1ZSk7CisKKyAgICAgICAgaWYgKChyZXN1bHQgPj0gMS4wZCAmJiB2YWx1ZS5zdGFydHNXaXRoKCIwIikpCisgICAgICAgICAgICAgICAgfHwgRG91YmxlLmlzTmFOKHJlc3VsdCkKKyAgICAgICAgICAgICAgICB8fCBEb3VibGUuaXNJbmZpbml0ZShyZXN1bHQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSlNPTiBmb3JiaWRzIG9jdGFsIHByZWZpeGVzLCBOYU4gYW5kIGluZmluaXRpZXM6ICIgKyB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBhZHZhbmNlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0BsaW5rIEpzb25Ub2tlbiNOVU1CRVIgbG9uZ30gdmFsdWUgb2YgdGhlIG5leHQgdG9rZW4sCisgICAgICogY29uc3VtaW5nIGl0LiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIHN0cmluZywgdGhpcyBtZXRob2Qgd2lsbCBhdHRlbXB0IHRvCisgICAgICogcGFyc2UgaXQgYXMgYSBsb25nLiBJZiB0aGUgbmV4dCB0b2tlbidzIG51bWVyaWMgdmFsdWUgY2Fubm90IGJlIGV4YWN0bHkKKyAgICAgKiByZXByZXNlbnRlZCBieSBhIEphdmEge0Bjb2RlIGxvbmd9LCB0aGlzIG1ldGhvZCB0aHJvd3MuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgbmV4dCB0b2tlbiBpcyBub3QgYSBsaXRlcmFsIHZhbHVlLgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBuZXh0IGxpdGVyYWwgdmFsdWUgY2Fubm90IGJlIHBhcnNlZAorICAgICAqICAgICBhcyBhIG51bWJlciwgb3IgZXhhY3RseSByZXByZXNlbnRlZCBhcyBhIGxvbmcuCisgICAgICovCisgICAgcHVibGljIGxvbmcgbmV4dExvbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBxdWlja1BlZWsoKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIGEgbG9uZyBidXQgd2FzICIgKyBwZWVrKCkpOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyByZXN1bHQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXN1bHQgPSBMb25nLnBhcnNlTG9uZyh2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICBkb3VibGUgYXNEb3VibGUgPSBEb3VibGUucGFyc2VEb3VibGUodmFsdWUpOyAvLyBkb24ndCBjYXRjaCB0aGlzIE51bWJlckZvcm1hdEV4Y2VwdGlvbgorICAgICAgICAgICAgcmVzdWx0ID0gKGxvbmcpIGFzRG91YmxlOworICAgICAgICAgICAgaWYgKChkb3VibGUpIHJlc3VsdCAhPSBhc0RvdWJsZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24odmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdCA+PSAxTCAmJiB2YWx1ZS5zdGFydHNXaXRoKCIwIikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oIkpTT04gZm9yYmlkcyBvY3RhbCBwcmVmaXhlczogIiArIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSnNvblRva2VuI05VTUJFUiBpbnR9IHZhbHVlIG9mIHRoZSBuZXh0IHRva2VuLAorICAgICAqIGNvbnN1bWluZyBpdC4gSWYgdGhlIG5leHQgdG9rZW4gaXMgYSBzdHJpbmcsIHRoaXMgbWV0aG9kIHdpbGwgYXR0ZW1wdCB0bworICAgICAqIHBhcnNlIGl0IGFzIGFuIGludC4gSWYgdGhlIG5leHQgdG9rZW4ncyBudW1lcmljIHZhbHVlIGNhbm5vdCBiZSBleGFjdGx5CisgICAgICogcmVwcmVzZW50ZWQgYnkgYSBKYXZhIHtAY29kZSBpbnR9LCB0aGlzIG1ldGhvZCB0aHJvd3MuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgbmV4dCB0b2tlbiBpcyBub3QgYSBsaXRlcmFsIHZhbHVlLgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBuZXh0IGxpdGVyYWwgdmFsdWUgY2Fubm90IGJlIHBhcnNlZAorICAgICAqICAgICBhcyBhIG51bWJlciwgb3IgZXhhY3RseSByZXByZXNlbnRlZCBhcyBhbiBpbnQuCisgICAgICovCisgICAgcHVibGljIGludCBuZXh0SW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcXVpY2tQZWVrKCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBhbiBpbnQgYnV0IHdhcyAiICsgcGVlaygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXN1bHQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgIGRvdWJsZSBhc0RvdWJsZSA9IERvdWJsZS5wYXJzZURvdWJsZSh2YWx1ZSk7IC8vIGRvbid0IGNhdGNoIHRoaXMgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCisgICAgICAgICAgICByZXN1bHQgPSAoaW50KSBhc0RvdWJsZTsKKyAgICAgICAgICAgIGlmICgoZG91YmxlKSByZXN1bHQgIT0gYXNEb3VibGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXN1bHQgPj0gMUwgJiYgdmFsdWUuc3RhcnRzV2l0aCgiMCIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCJKU09OIGZvcmJpZHMgb2N0YWwgcHJlZml4ZXM6ICIgKyB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBhZHZhbmNlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoaXMgSlNPTiByZWFkZXIgYW5kIHRoZSB1bmRlcmx5aW5nIHtAbGluayBSZWFkZXJ9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaGFzVG9rZW4gPSBmYWxzZTsKKyAgICAgICAgdmFsdWUgPSBudWxsOworICAgICAgICB0b2tlbiA9IG51bGw7CisgICAgICAgIHN0YWNrLmNsZWFyKCk7CisgICAgICAgIHN0YWNrLmFkZChKc29uU2NvcGUuQ0xPU0VEKTsKKyAgICAgICAgaW4uY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTa2lwcyB0aGUgbmV4dCB2YWx1ZSByZWN1cnNpdmVseS4gSWYgaXQgaXMgYW4gb2JqZWN0IG9yIGFycmF5LCBhbGwgbmVzdGVkCisgICAgICogZWxlbWVudHMgYXJlIHNraXBwZWQuIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB1c2Ugd2hlbiB0aGUgSlNPTiB0b2tlbgorICAgICAqIHN0cmVhbSBjb250YWlucyB1bnJlY29nbml6ZWQgb3IgdW5oYW5kbGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBza2lwVmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBza2lwcGluZyA9IHRydWU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIEpzb25Ub2tlbiB0b2tlbiA9IGFkdmFuY2UoKTsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT0gSnNvblRva2VuLkJFR0lOX0FSUkFZIHx8IHRva2VuID09IEpzb25Ub2tlbi5CRUdJTl9PQkpFQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09IEpzb25Ub2tlbi5FTkRfQVJSQVkgfHwgdG9rZW4gPT0gSnNvblRva2VuLkVORF9PQkpFQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChjb3VudCAhPSAwKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNraXBwaW5nID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEpzb25TY29wZSBwZWVrU3RhY2soKSB7CisgICAgICAgIHJldHVybiBzdGFjay5nZXQoc3RhY2suc2l6ZSgpIC0gMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBKc29uU2NvcGUgcG9wKCkgeworICAgICAgICByZXR1cm4gc3RhY2sucmVtb3ZlKHN0YWNrLnNpemUoKSAtIDEpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwdXNoKEpzb25TY29wZSBuZXdUb3ApIHsKKyAgICAgICAgc3RhY2suYWRkKG5ld1RvcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZSB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VUb3AoSnNvblNjb3BlIG5ld1RvcCkgeworICAgICAgICBzdGFjay5zZXQoc3RhY2suc2l6ZSgpIC0gMSwgbmV3VG9wKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEpzb25Ub2tlbiBuZXh0SW5BcnJheShib29sZWFuIGZpcnN0RWxlbWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpcnN0RWxlbWVudCkgeworICAgICAgICAgICAgcmVwbGFjZVRvcChKc29uU2NvcGUuTk9ORU1QVFlfQVJSQVkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogTG9vayBmb3IgYSBjb21tYSBiZWZvcmUgZWFjaCBlbGVtZW50IGFmdGVyIHRoZSBmaXJzdCBlbGVtZW50LiAqLworICAgICAgICAgICAgc3dpdGNoIChuZXh0Tm9uV2hpdGVzcGFjZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnXSc6CisgICAgICAgICAgICAgICAgICAgIHBvcCgpOworICAgICAgICAgICAgICAgICAgICBoYXNUb2tlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IEpzb25Ub2tlbi5FTkRfQVJSQVk7CisgICAgICAgICAgICAgICAgY2FzZSAnOyc6CisgICAgICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOyAvLyBmYWxsLXRocm91Z2gKKyAgICAgICAgICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIlVudGVybWluYXRlZCBhcnJheSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChuZXh0Tm9uV2hpdGVzcGFjZSgpKSB7CisgICAgICAgICAgICBjYXNlICddJzoKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RFbGVtZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHBvcCgpOworICAgICAgICAgICAgICAgICAgICBoYXNUb2tlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IEpzb25Ub2tlbi5FTkRfQVJSQVk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaCB0byBoYW5kbGUgIixdIgorICAgICAgICAgICAgY2FzZSAnOyc6CisgICAgICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgICAgICAvKiBJbiBsZW5pZW50IG1vZGUsIGEgMC1sZW5ndGggbGl0ZXJhbCBtZWFucyAnbnVsbCcgKi8KKyAgICAgICAgICAgICAgICBjaGVja0xlbmllbnQoKTsKKyAgICAgICAgICAgICAgICBwb3MtLTsKKyAgICAgICAgICAgICAgICBoYXNUb2tlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAibnVsbCI7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gSnNvblRva2VuLk5VTEw7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHBvcy0tOworICAgICAgICAgICAgICAgIHJldHVybiBuZXh0VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgSnNvblRva2VuIG5leHRJbk9iamVjdChib29sZWFuIGZpcnN0RWxlbWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVhZCBkZWxpbWl0ZXJzLiBFaXRoZXIgYSBjb21tYS9zZW1pY29sb24gc2VwYXJhdGluZyB0aGlzIGFuZCB0aGUKKyAgICAgICAgICogcHJldmlvdXMgbmFtZS12YWx1ZSBwYWlyLCBvciBhIGNsb3NlIGJyYWNlIHRvIGRlbm90ZSB0aGUgZW5kIG9mIHRoZQorICAgICAgICAgKiBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBpZiAoZmlyc3RFbGVtZW50KSB7CisgICAgICAgICAgICAvKiBQZWVrIHRvIHNlZSBpZiB0aGlzIGlzIHRoZSBlbXB0eSBvYmplY3QuICovCisgICAgICAgICAgICBzd2l0Y2ggKG5leHROb25XaGl0ZXNwYWNlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlICd9JzoKKyAgICAgICAgICAgICAgICAgICAgcG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gSnNvblRva2VuLkVORF9PQkpFQ1Q7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKG5leHROb25XaGl0ZXNwYWNlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlICd9JzoKKyAgICAgICAgICAgICAgICAgICAgcG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gSnNvblRva2VuLkVORF9PQkpFQ1Q7CisgICAgICAgICAgICAgICAgY2FzZSAnOyc6CisgICAgICAgICAgICAgICAgY2FzZSAnLCc6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IHN5bnRheEVycm9yKCJVbnRlcm1pbmF0ZWQgb2JqZWN0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBSZWFkIHRoZSBuYW1lLiAqLworICAgICAgICBpbnQgcXVvdGUgPSBuZXh0Tm9uV2hpdGVzcGFjZSgpOworICAgICAgICBzd2l0Y2ggKHF1b3RlKSB7CisgICAgICAgICAgICBjYXNlICdcJyc6CisgICAgICAgICAgICAgICAgY2hlY2tMZW5pZW50KCk7IC8vIGZhbGwtdGhyb3VnaAorICAgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICAgICAgbmFtZSA9IG5leHRTdHJpbmcoKGNoYXIpIHF1b3RlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY2hlY2tMZW5pZW50KCk7CisgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICAgICAgbmFtZSA9IG5leHRMaXRlcmFsKCk7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IHN5bnRheEVycm9yKCJFeHBlY3RlZCBuYW1lIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVwbGFjZVRvcChKc29uU2NvcGUuREFOR0xJTkdfTkFNRSk7CisgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRva2VuID0gSnNvblRva2VuLk5BTUU7CisgICAgfQorCisgICAgcHJpdmF0ZSBKc29uVG9rZW4gb2JqZWN0VmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvKgorICAgICAgICAgKiBSZWFkIHRoZSBuYW1lL3ZhbHVlIHNlcGFyYXRvci4gVXN1YWxseSBhIGNvbG9uICc6Jy4gSW4gbGVuaWVudCBtb2RlCisgICAgICAgICAqIHdlIGFsc28gYWNjZXB0IGFuIGVxdWFscyBzaWduICc9Jywgb3IgYW4gYXJyb3cgIj0+Ii4KKyAgICAgICAgICovCisgICAgICAgIHN3aXRjaCAobmV4dE5vbldoaXRlc3BhY2UoKSkgeworICAgICAgICAgICAgY2FzZSAnOic6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc9JzoKKyAgICAgICAgICAgICAgICBjaGVja0xlbmllbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoKHBvcyA8IGxpbWl0IHx8IGZpbGxCdWZmZXIoMSkpICYmIGJ1ZmZlcltwb3NdID09ICc+JykgeworICAgICAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IHN5bnRheEVycm9yKCJFeHBlY3RlZCAnOiciKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlcGxhY2VUb3AoSnNvblNjb3BlLk5PTkVNUFRZX09CSkVDVCk7CisgICAgICAgIHJldHVybiBuZXh0VmFsdWUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEpzb25Ub2tlbiBuZXh0VmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgYyA9IG5leHROb25XaGl0ZXNwYWNlKCk7CisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAneyc6CisgICAgICAgICAgICAgICAgcHVzaChKc29uU2NvcGUuRU1QVFlfT0JKRUNUKTsKKyAgICAgICAgICAgICAgICBoYXNUb2tlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gSnNvblRva2VuLkJFR0lOX09CSkVDVDsKKworICAgICAgICAgICAgY2FzZSAnWyc6CisgICAgICAgICAgICAgICAgcHVzaChKc29uU2NvcGUuRU1QVFlfQVJSQVkpOworICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSBKc29uVG9rZW4uQkVHSU5fQVJSQVk7CisKKyAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgICBjaGVja0xlbmllbnQoKTsgLy8gZmFsbC10aHJvdWdoCisgICAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IG5leHRTdHJpbmcoKGNoYXIpIGMpOworICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSBKc29uVG9rZW4uU1RSSU5HOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHBvcy0tOworICAgICAgICAgICAgICAgIHJldHVybiByZWFkTGl0ZXJhbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIG9uY2Uge0Bjb2RlIGxpbWl0IC0gcG9zID49IG1pbmltdW19LiBJZiB0aGUgZGF0YSBpcworICAgICAqIGV4aGF1c3RlZCBiZWZvcmUgdGhhdCBtYW55IGNoYXJhY3RlcnMgYXJlIGF2YWlsYWJsZSwgdGhpcyByZXR1cm5zCisgICAgICogZmFsc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGZpbGxCdWZmZXIoaW50IG1pbmltdW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChsaW1pdCAhPSBwb3MpIHsKKyAgICAgICAgICAgIGxpbWl0IC09IHBvczsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBwb3MsIGJ1ZmZlciwgMCwgbGltaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGltaXQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcG9zID0gMDsKKyAgICAgICAgaW50IHRvdGFsOworICAgICAgICB3aGlsZSAoKHRvdGFsID0gaW4ucmVhZChidWZmZXIsIGxpbWl0LCBidWZmZXIubGVuZ3RoIC0gbGltaXQpKSAhPSAtMSkgeworICAgICAgICAgICAgbGltaXQgKz0gdG90YWw7CisgICAgICAgICAgICBpZiAobGltaXQgPj0gbWluaW11bSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBuZXh0Tm9uV2hpdGVzcGFjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdoaWxlIChwb3MgPCBsaW1pdCB8fCBmaWxsQnVmZmVyKDEpKSB7CisgICAgICAgICAgICBpbnQgYyA9IGJ1ZmZlcltwb3MrK107CisgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSBsaW1pdCAmJiAhZmlsbEJ1ZmZlcigxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjaGVja0xlbmllbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBwZWVrID0gYnVmZmVyW3Bvc107CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocGVlaykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBhIC8qIGMtc3R5bGUgY29tbWVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2tpcFRvKCIqLyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHN5bnRheEVycm9yKCJVbnRlcm1pbmF0ZWQgY29tbWVudCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBhIC8vIGVuZC1vZi1saW5lIGNvbW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwVG9FbmRPZkxpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSAnIyc6CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIFNraXAgYSAjIGhhc2ggZW5kLW9mLWxpbmUgY29tbWVudC4gVGhlIEpTT04gUkZDIGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAgICAgICogc3BlY2lmeSB0aGlzIGJlaGF2aW91ciwgYnV0IGl0J3MgcmVxdWlyZWQgdG8gcGFyc2UKKyAgICAgICAgICAgICAgICAgICAgICogZXhpc3RpbmcgZG9jdW1lbnRzLiBTZWUgaHR0cDovL2IvMjU3MTQyMy4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOworICAgICAgICAgICAgICAgICAgICBza2lwVG9FbmRPZkxpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRocm93IHN5bnRheEVycm9yKCJFbmQgb2YgaW5wdXQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tMZW5pZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFsZW5pZW50KSB7CisgICAgICAgICAgICB0aHJvdyBzeW50YXhFcnJvcigiVXNlIEpzb25SZWFkZXIuc2V0TGVuaWVudCh0cnVlKSB0byBhY2NlcHQgbWFsZm9ybWVkIEpTT04iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkdmFuY2VzIHRoZSBwb3NpdGlvbiB1bnRpbCBhZnRlciB0aGUgbmV4dCBuZXdsaW5lIGNoYXJhY3Rlci4gSWYgdGhlIGxpbmUKKyAgICAgKiBpcyB0ZXJtaW5hdGVkIGJ5ICJcclxuIiwgdGhlICdcbicgbXVzdCBiZSBjb25zdW1lZCBhcyB3aGl0ZXNwYWNlIGJ5IHRoZQorICAgICAqIGNhbGxlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2tpcFRvRW5kT2ZMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd2hpbGUgKHBvcyA8IGxpbWl0IHx8IGZpbGxCdWZmZXIoMSkpIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IGJ1ZmZlcltwb3MrK107CisgICAgICAgICAgICBpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNraXBUbyhTdHJpbmcgdG9GaW5kKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXRlcjoKKyAgICAgICAgZm9yICg7IHBvcyArIHRvRmluZC5sZW5ndGgoKSA8IGxpbWl0IHx8IGZpbGxCdWZmZXIodG9GaW5kLmxlbmd0aCgpKTsgcG9zKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgdG9GaW5kLmxlbmd0aCgpOyBjKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyW3BvcyArIGNdICE9IHRvRmluZC5jaGFyQXQoYykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB1cCB0byBidXQgbm90IGluY2x1ZGluZyB7QGNvZGUgcXVvdGV9LCB1bmVzY2FwaW5nIGFueQorICAgICAqIGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2VzIGVuY291bnRlcmVkIGFsb25nIHRoZSB3YXkuIFRoZSBvcGVuaW5nIHF1b3RlCisgICAgICogc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlYWQuIFRoaXMgY29uc3VtZXMgdGhlIGNsb3NpbmcgcXVvdGUsIGJ1dCBkb2VzCisgICAgICogbm90IGluY2x1ZGUgaXQgaW4gdGhlIHJldHVybmVkIHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBxdW90ZSBlaXRoZXIgJyBvciAiLgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIGFueSB1bmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMgYXJlCisgICAgICogICAgIG1hbGZvcm1lZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBuZXh0U3RyaW5nKGNoYXIgcXVvdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG51bGw7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIC8qIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG5vdCB5ZXQgYXBwZW5kZWQgdG8gdGhlIGJ1aWxkZXIuICovCisgICAgICAgICAgICBpbnQgc3RhcnQgPSBwb3M7CisgICAgICAgICAgICB3aGlsZSAocG9zIDwgbGltaXQpIHsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IGJ1ZmZlcltwb3MrK107CisKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSBxdW90ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcHBpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic2tpcHBlZCEiOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyLCBzdGFydCwgcG9zIC0gc3RhcnQgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGJ1ZmZlciwgc3RhcnQsIHBvcyAtIHN0YXJ0IC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1xcJykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnVpbGRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChidWZmZXIsIHN0YXJ0LCBwb3MgLSBzdGFydCAtIDEpOworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChyZWFkRXNjYXBlQ2hhcmFjdGVyKCkpOworICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHBvczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGJ1ZmZlciwgc3RhcnQsIHBvcyAtIHN0YXJ0KTsKKyAgICAgICAgfSB3aGlsZSAoZmlsbEJ1ZmZlcigxKSk7CisKKyAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIlVudGVybWluYXRlZCBzdHJpbmciKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgYW55IGRlbGltaXRlciBjaGFyYWN0ZXJzLiBUaGlzCisgICAgICogZG9lcyBub3QgY29uc3VtZSB0aGUgZGVsaW1pdGVyIGNoYXJhY3Rlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBuZXh0TGl0ZXJhbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG51bGw7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIC8qIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG5vdCB5ZXQgYXBwZW5kZWQgdG8gdGhlIGJ1aWxkZXIuICovCisgICAgICAgICAgICBpbnQgc3RhcnQgPSBwb3M7CisgICAgICAgICAgICB3aGlsZSAocG9zIDwgbGltaXQpIHsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IGJ1ZmZlcltwb3MrK107CisgICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJzsnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICcjJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnPSc6CisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0xlbmllbnQoKTsgLy8gZmFsbC10aHJvdWdoCisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAneyc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ30nOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdbJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXSc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJzonOgorICAgICAgICAgICAgICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXGYnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcy0tOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBwaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJza2lwcGVkISI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlciwgc3RhcnQsIHBvcyAtIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYnVmZmVyLCBzdGFydCwgcG9zIC0gc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYnVpbGRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChidWZmZXIsIHN0YXJ0LCBwb3MgLSBzdGFydCk7CisgICAgICAgIH0gd2hpbGUgKGZpbGxCdWZmZXIoMSkpOworCisgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgbmVhciAiICsgZ2V0U25pcHBldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVuZXNjYXBlcyB0aGUgY2hhcmFjdGVyIGlkZW50aWZpZWQgYnkgdGhlIGNoYXJhY3RlciBvciBjaGFyYWN0ZXJzIHRoYXQKKyAgICAgKiBpbW1lZGlhdGVseSBmb2xsb3cgYSBiYWNrc2xhc2guIFRoZSBiYWNrc2xhc2ggJ1wnIHNob3VsZCBoYXZlIGFscmVhZHkKKyAgICAgKiBiZWVuIHJlYWQuIFRoaXMgc3VwcG9ydHMgYm90aCB1bmljb2RlIGVzY2FwZXMgInUwMDBBIiBhbmQgdHdvLWNoYXJhY3RlcgorICAgICAqIGVzY2FwZXMgIlxuIi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIGFueSB1bmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMgYXJlCisgICAgICogICAgIG1hbGZvcm1lZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNoYXIgcmVhZEVzY2FwZUNoYXJhY3RlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwb3MgPT0gbGltaXQgJiYgIWZpbGxCdWZmZXIoMSkpIHsKKyAgICAgICAgICAgIHRocm93IHN5bnRheEVycm9yKCJVbnRlcm1pbmF0ZWQgZXNjYXBlIHNlcXVlbmNlIik7CisgICAgICAgIH0KKworICAgICAgICBjaGFyIGVzY2FwZWQgPSBidWZmZXJbcG9zKytdOworICAgICAgICBzd2l0Y2ggKGVzY2FwZWQpIHsKKyAgICAgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICAgICAgICAgIGlmIChwb3MgKyA0ID4gbGltaXQgJiYgIWZpbGxCdWZmZXIoNCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIlVudGVybWluYXRlZCBlc2NhcGUgc2VxdWVuY2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIGhleCA9IG5ldyBTdHJpbmcoYnVmZmVyLCBwb3MsIDQpOworICAgICAgICAgICAgICAgIHBvcyArPSA0OworICAgICAgICAgICAgICAgIHJldHVybiAoY2hhcikgSW50ZWdlci5wYXJzZUludChoZXgsIDE2KTsKKworICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgICAgcmV0dXJuICdcdCc7CisKKyAgICAgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgICAgIHJldHVybiAnXGInOworCisgICAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ1xuJzsKKworICAgICAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgICAgICAgcmV0dXJuICdccic7CisKKyAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgICAgIHJldHVybiAnXGYnOworCisgICAgICAgICAgICBjYXNlICdcJyc6CisgICAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVzY2FwZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIG51bGwsIGJvb2xlYW4sIG51bWVyaWMgb3IgdW5xdW90ZWQgc3RyaW5nIGxpdGVyYWwgdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSBKc29uVG9rZW4gcmVhZExpdGVyYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbGl0ZXJhbCA9IG5leHRMaXRlcmFsKCk7CisgICAgICAgIGlmIChsaXRlcmFsLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIkV4cGVjdGVkIGxpdGVyYWwgdmFsdWUiKTsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZSA9IGxpdGVyYWw7CisgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRva2VuID0gbnVsbDsgLy8gdXNlIGRlY29kZUxpdGVyYWwoKSB0byBnZXQgdGhlIHRva2VuIHR5cGUKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NpZ25zIHtAY29kZSBuZXh0VG9rZW59IGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB7QGNvZGUgbmV4dFZhbHVlfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZGVjb2RlTGl0ZXJhbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJudWxsIikpIHsKKyAgICAgICAgICAgIHRva2VuID0gSnNvblRva2VuLk5VTEw7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpIHx8IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpIHsKKyAgICAgICAgICAgIHRva2VuID0gSnNvblRva2VuLkJPT0xFQU47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIERvdWJsZS5wYXJzZURvdWJsZSh2YWx1ZSk7IC8vIHRoaXMgd29yayBjb3VsZCBwb3RlbnRpYWxseSBiZSBjYWNoZWQKKyAgICAgICAgICAgICAgICB0b2tlbiA9IEpzb25Ub2tlbi5OVU1CRVI7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgbXVzdCBiZSBhbiB1bnF1b3RlZCBzdHJpbmcKKyAgICAgICAgICAgICAgICBjaGVja0xlbmllbnQoKTsKKyAgICAgICAgICAgICAgICB0b2tlbiA9IEpzb25Ub2tlbi5TVFJJTkc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJvd3MgYSBuZXcgSU8gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGEgY29udGV4dCBzbmlwcGV0CisgICAgICogd2l0aCB0aGlzIHJlYWRlcidzIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIElPRXhjZXB0aW9uIHN5bnRheEVycm9yKFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgSnNvblN5bnRheEV4Y2VwdGlvbihtZXNzYWdlICsgIiBuZWFyICIgKyBnZXRTbmlwcGV0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIGdldFNuaXBwZXQoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc25pcHBldCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGludCBiZWZvcmVQb3MgPSBNYXRoLm1pbihwb3MsIDIwKTsKKyAgICAgICAgc25pcHBldC5hcHBlbmQoYnVmZmVyLCBwb3MgLSBiZWZvcmVQb3MsIGJlZm9yZVBvcyk7CisgICAgICAgIGludCBhZnRlclBvcyA9IE1hdGgubWluKGxpbWl0IC0gcG9zLCAyMCk7CisgICAgICAgIHNuaXBwZXQuYXBwZW5kKGJ1ZmZlciwgcG9zLCBhZnRlclBvcyk7CisgICAgICAgIHJldHVybiBzbmlwcGV0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEpzb25TeW50YXhFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaXZhdGUgSnNvblN5bnRheEV4Y2VwdGlvbihTdHJpbmcgcykgeworICAgICAgICAgICAgc3VwZXIocyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25TY29wZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Kc29uU2NvcGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTUzNGU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Kc29uU2NvcGUuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnV0aWw7CisKKy8qKgorICogTGV4aWNhbCBzY29waW5nIGVsZW1lbnRzIHdpdGhpbiBhIEpTT04gcmVhZGVyIG9yIHdyaXRlci4KKyAqLworZW51bSBKc29uU2NvcGUgeworCisgICAgLyoqCisgICAgICogQW4gYXJyYXkgd2l0aCBubyBlbGVtZW50cyByZXF1aXJlcyBubyBzZXBhcmF0b3JzIG9yIG5ld2xpbmVzIGJlZm9yZQorICAgICAqIGl0IGlzIGNsb3NlZC4KKyAgICAgKi8KKyAgICBFTVBUWV9BUlJBWSwKKworICAgIC8qKgorICAgICAqIEEgYXJyYXkgd2l0aCBhdCBsZWFzdCBvbmUgdmFsdWUgcmVxdWlyZXMgYSBjb21tYSBhbmQgbmV3bGluZSBiZWZvcmUKKyAgICAgKiB0aGUgbmV4dCBlbGVtZW50LgorICAgICAqLworICAgIE5PTkVNUFRZX0FSUkFZLAorCisgICAgLyoqCisgICAgICogQW4gb2JqZWN0IHdpdGggbm8gbmFtZS92YWx1ZSBwYWlycyByZXF1aXJlcyBubyBzZXBhcmF0b3JzIG9yIG5ld2xpbmVzCisgICAgICogYmVmb3JlIGl0IGlzIGNsb3NlZC4KKyAgICAgKi8KKyAgICBFTVBUWV9PQkpFQ1QsCisKKyAgICAvKioKKyAgICAgKiBBbiBvYmplY3Qgd2hvc2UgbW9zdCByZWNlbnQgZWxlbWVudCBpcyBhIGtleS4gVGhlIG5leHQgZWxlbWVudCBtdXN0CisgICAgICogYmUgYSB2YWx1ZS4KKyAgICAgKi8KKyAgICBEQU5HTElOR19OQU1FLAorCisgICAgLyoqCisgICAgICogQW4gb2JqZWN0IHdpdGggYXQgbGVhc3Qgb25lIG5hbWUvdmFsdWUgcGFpciByZXF1aXJlcyBhIGNvbW1hIGFuZAorICAgICAqIG5ld2xpbmUgYmVmb3JlIHRoZSBuZXh0IGVsZW1lbnQuCisgICAgICovCisgICAgTk9ORU1QVFlfT0JKRUNULAorCisgICAgLyoqCisgICAgICogTm8gb2JqZWN0IG9yIGFycmF5IGhhcyBiZWVuIHN0YXJ0ZWQuCisgICAgICovCisgICAgRU1QVFlfRE9DVU1FTlQsCisKKyAgICAvKioKKyAgICAgKiBBIGRvY3VtZW50IHdpdGggYXQgYW4gYXJyYXkgb3Igb2JqZWN0LgorICAgICAqLworICAgIE5PTkVNUFRZX0RPQ1VNRU5ULAorCisgICAgLyoqCisgICAgICogQSBkb2N1bWVudCB0aGF0J3MgYmVlbiBjbG9zZWQgYW5kIGNhbm5vdCBiZSBhY2Nlc3NlZC4KKyAgICAgKi8KKyAgICBDTE9TRUQsCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25Ub2tlbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Kc29uVG9rZW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWJjNmNhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Kc29uVG9rZW4uamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnV0aWw7CisKKy8qKgorICogQSBzdHJ1Y3R1cmUsIG5hbWUgb3IgdmFsdWUgdHlwZSBpbiBhIEpTT04tZW5jb2RlZCBzdHJpbmcuCisgKi8KK3B1YmxpYyBlbnVtIEpzb25Ub2tlbiB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3BlbmluZyBvZiBhIEpTT04gYXJyYXkuIFdyaXR0ZW4gdXNpbmcge0BsaW5rIEpzb25Xcml0ZXIjYmVnaW5PYmplY3R9CisgICAgICogYW5kIHJlYWQgdXNpbmcge0BsaW5rIEpzb25SZWFkZXIjYmVnaW5PYmplY3R9LgorICAgICAqLworICAgIEJFR0lOX0FSUkFZLAorCisgICAgLyoqCisgICAgICogVGhlIGNsb3Npbmcgb2YgYSBKU09OIGFycmF5LiBXcml0dGVuIHVzaW5nIHtAbGluayBKc29uV3JpdGVyI2VuZEFycmF5fQorICAgICAqIGFuZCByZWFkIHVzaW5nIHtAbGluayBKc29uUmVhZGVyI2VuZEFycmF5fS4KKyAgICAgKi8KKyAgICBFTkRfQVJSQVksCisKKyAgICAvKioKKyAgICAgKiBUaGUgb3BlbmluZyBvZiBhIEpTT04gb2JqZWN0LiBXcml0dGVuIHVzaW5nIHtAbGluayBKc29uV3JpdGVyI2JlZ2luT2JqZWN0fQorICAgICAqIGFuZCByZWFkIHVzaW5nIHtAbGluayBKc29uUmVhZGVyI2JlZ2luT2JqZWN0fS4KKyAgICAgKi8KKyAgICBCRUdJTl9PQkpFQ1QsCisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xvc2luZyBvZiBhIEpTT04gb2JqZWN0LiBXcml0dGVuIHVzaW5nIHtAbGluayBKc29uV3JpdGVyI2VuZE9iamVjdH0KKyAgICAgKiBhbmQgcmVhZCB1c2luZyB7QGxpbmsgSnNvblJlYWRlciNlbmRPYmplY3R9LgorICAgICAqLworICAgIEVORF9PQkpFQ1QsCisKKyAgICAvKioKKyAgICAgKiBBIEpTT04gcHJvcGVydHkgbmFtZS4gV2l0aGluIG9iamVjdHMsIHRva2VucyBhbHRlcm5hdGUgYmV0d2VlbiBuYW1lcyBhbmQKKyAgICAgKiB0aGVpciB2YWx1ZXMuIFdyaXR0ZW4gdXNpbmcge0BsaW5rIEpzb25Xcml0ZXIjbmFtZX0gYW5kIHJlYWQgdXNpbmcge0BsaW5rCisgICAgICogSnNvblJlYWRlciNuZXh0TmFtZX0KKyAgICAgKi8KKyAgICBOQU1FLAorCisgICAgLyoqCisgICAgICogQSBKU09OIHN0cmluZy4KKyAgICAgKi8KKyAgICBTVFJJTkcsCisKKyAgICAvKioKKyAgICAgKiBBIEpTT04gbnVtYmVyIHJlcHJlc2VudGVkIGluIHRoaXMgQVBJIGJ5IGEgSmF2YSB7QGNvZGUgZG91YmxlfSwge0Bjb2RlCisgICAgICogbG9uZ30sIG9yIHtAY29kZSBpbnR9LgorICAgICAqLworICAgIE5VTUJFUiwKKworICAgIC8qKgorICAgICAqIEEgSlNPTiB7QGNvZGUgdHJ1ZX0gb3Ige0Bjb2RlIGZhbHNlfS4KKyAgICAgKi8KKyAgICBCT09MRUFOLAorCisgICAgLyoqCisgICAgICogQSBKU09OIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBOVUxMLAorCisgICAgLyoqCisgICAgICogVGhlIGVuZCBvZiB0aGUgSlNPTiBzdHJlYW0uIFRoaXMgc2VudGluZWwgdmFsdWUgaXMgcmV0dXJuZWQgYnkge0BsaW5rCisgICAgICogSnNvblJlYWRlciNwZWVrKCl9IHRvIHNpZ25hbCB0aGF0IHRoZSBKU09OLWVuY29kZWQgdmFsdWUgaGFzIG5vIG1vcmUKKyAgICAgKiB0b2tlbnMuCisgICAgICovCisgICAgRU5EX0RPQ1VNRU5UCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25Xcml0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvbldyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlY2MxYzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25Xcml0ZXIuamF2YQpAQCAtMCwwICsxLDQ3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC51dGlsOworCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFdyaXRlcyBhIEpTT04gKDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQ2MjcudHh0Ij5SRkMgNDYyNzwvYT4pCisgKiBlbmNvZGVkIHZhbHVlIHRvIGEgc3RyZWFtLCBvbmUgdG9rZW4gYXQgYSB0aW1lLiBUaGUgc3RyZWFtIGluY2x1ZGVzIGJvdGgKKyAqIGxpdGVyYWwgdmFsdWVzIChzdHJpbmdzLCBudW1iZXJzLCBib29sZWFucyBhbmQgbnVsbHMpIGFzIHdlbGwgYXMgdGhlIGJlZ2luCisgKiBhbmQgZW5kIGRlbGltaXRlcnMgb2Ygb2JqZWN0cyBhbmQgYXJyYXlzLgorICoKKyAqIDxoMz5FbmNvZGluZyBKU09OPC9oMz4KKyAqIFRvIGVuY29kZSB5b3VyIGRhdGEgYXMgSlNPTiwgY3JlYXRlIGEgbmV3IHtAY29kZSBKc29uV3JpdGVyfS4gRWFjaCBKU09OCisgKiBkb2N1bWVudCBtdXN0IGNvbnRhaW4gb25lIHRvcC1sZXZlbCBhcnJheSBvciBvYmplY3QuIENhbGwgbWV0aG9kcyBvbiB0aGUKKyAqIHdyaXRlciBhcyB5b3Ugd2FsayB0aGUgc3RydWN0dXJlJ3MgY29udGVudHMsIG5lc3RpbmcgYXJyYXlzIGFuZCBvYmplY3RzIGFzCisgKiBuZWNlc3Nhcnk6CisgKiA8dWw+CisgKiAgIDxsaT5UbyB3cml0ZSA8c3Ryb25nPmFycmF5czwvc3Ryb25nPiwgZmlyc3QgY2FsbCB7QGxpbmsgI2JlZ2luQXJyYXkoKX0uCisgKiAgICAgICBXcml0ZSBlYWNoIG9mIHRoZSBhcnJheSdzIGVsZW1lbnRzIHdpdGggdGhlIGFwcHJvcHJpYXRlIHtAbGluayAjdmFsdWV9CisgKiAgICAgICBtZXRob2RzIG9yIGJ5IG5lc3Rpbmcgb3RoZXIgYXJyYXlzIGFuZCBvYmplY3RzLiBGaW5hbGx5IGNsb3NlIHRoZSBhcnJheQorICogICAgICAgdXNpbmcge0BsaW5rICNlbmRBcnJheSgpfS4KKyAqICAgPGxpPlRvIHdyaXRlIDxzdHJvbmc+b2JqZWN0czwvc3Ryb25nPiwgZmlyc3QgY2FsbCB7QGxpbmsgI2JlZ2luT2JqZWN0KCl9LgorICogICAgICAgV3JpdGUgZWFjaCBvZiB0aGUgb2JqZWN0J3MgcHJvcGVydGllcyBieSBhbHRlcm5hdGluZyBjYWxscyB0bworICogICAgICAge0BsaW5rICNuYW1lfSB3aXRoIHRoZSBwcm9wZXJ0eSdzIHZhbHVlLiBXcml0ZSBwcm9wZXJ0eSB2YWx1ZXMgd2l0aCB0aGUKKyAqICAgICAgIGFwcHJvcHJpYXRlIHtAbGluayAjdmFsdWV9IG1ldGhvZCBvciBieSBuZXN0aW5nIG90aGVyIG9iamVjdHMgb3IgYXJyYXlzLgorICogICAgICAgRmluYWxseSBjbG9zZSB0aGUgb2JqZWN0IHVzaW5nIHtAbGluayAjZW5kT2JqZWN0KCl9LgorICogPC91bD4KKyAqCisgKiA8aDM+RXhhbXBsZTwvaDM+CisgKiBTdXBwb3NlIHdlJ2QgbGlrZSB0byBlbmNvZGUgYSBzdHJlYW0gb2YgbWVzc2FnZXMgc3VjaCBhcyB0aGUgZm9sbG93aW5nOiA8cHJlPiB7QGNvZGUKKyAqIFsKKyAqICAgeworICogICAgICJpZCI6IDkxMjM0NTY3ODkwMSwKKyAqICAgICAidGV4dCI6ICJIb3cgZG8gSSB3cml0ZSBKU09OIG9uIEFuZHJvaWQ/IiwKKyAqICAgICAiZ2VvIjogbnVsbCwKKyAqICAgICAidXNlciI6IHsKKyAqICAgICAgICJuYW1lIjogImFuZHJvaWRfbmV3YiIsCisgKiAgICAgICAiZm9sbG93ZXJzX2NvdW50IjogNDEKKyAqICAgICAgfQorICogICB9LAorICogICB7CisgKiAgICAgImlkIjogOTEyMzQ1Njc4OTAyLAorICogICAgICJ0ZXh0IjogIkBhbmRyb2lkX25ld2IganVzdCB1c2UgYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIhIiwKKyAqICAgICAiZ2VvIjogWzUwLjQ1NDcyMiwgLTEwNC42MDY2NjddLAorICogICAgICJ1c2VyIjogeworICogICAgICAgIm5hbWUiOiAiamVzc2UiLAorICogICAgICAgImZvbGxvd2Vyc19jb3VudCI6IDIKKyAqICAgICB9CisgKiAgIH0KKyAqIF19PC9wcmU+CisgKiBUaGlzIGNvZGUgZW5jb2RlcyB0aGUgYWJvdmUgc3RydWN0dXJlOiA8cHJlPiAgIHtAY29kZQorICogICBwdWJsaWMgdm9pZCB3cml0ZUpzb25TdHJlYW0oT3V0cHV0U3RyZWFtIG91dCwgTGlzdDxNZXNzYWdlPiBtZXNzYWdlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAqICAgICBKc29uV3JpdGVyIHdyaXRlciA9IG5ldyBKc29uV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCAiVVRGLTgiKSk7CisgKiAgICAgd3JpdGVyLnNldEluZGVudFNwYWNlcyg0KTsKKyAqICAgICB3cml0ZU1lc3NhZ2VzQXJyYXkod3JpdGVyLCBtZXNzYWdlcyk7CisgKiAgICAgd3JpdGVyLmNsb3NlKCk7CisgKiAgIH0KKyAqCisgKiAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZXNBcnJheShKc29uV3JpdGVyIHdyaXRlciwgTGlzdDxNZXNzYWdlPiBtZXNzYWdlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAqICAgICB3cml0ZXIuYmVnaW5BcnJheSgpOworICogICAgIGZvciAoTWVzc2FnZSBtZXNzYWdlIDogbWVzc2FnZXMpIHsKKyAqICAgICAgIHdyaXRlTWVzc2FnZSh3cml0ZXIsIG1lc3NhZ2UpOworICogICAgIH0KKyAqICAgICB3cml0ZXIuZW5kQXJyYXkoKTsKKyAqICAgfQorICoKKyAqICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlKEpzb25Xcml0ZXIgd3JpdGVyLCBNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgKiAgICAgd3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgKiAgICAgd3JpdGVyLm5hbWUoImlkIikudmFsdWUobWVzc2FnZS5nZXRJZCgpKTsKKyAqICAgICB3cml0ZXIubmFtZSgidGV4dCIpLnZhbHVlKG1lc3NhZ2UuZ2V0VGV4dCgpKTsKKyAqICAgICBpZiAobWVzc2FnZS5nZXRHZW8oKSAhPSBudWxsKSB7CisgKiAgICAgICB3cml0ZXIubmFtZSgiZ2VvIik7CisgKiAgICAgICB3cml0ZURvdWJsZXNBcnJheSh3cml0ZXIsIG1lc3NhZ2UuZ2V0R2VvKCkpOworICogICAgIH0gZWxzZSB7CisgKiAgICAgICB3cml0ZXIubmFtZSgiZ2VvIikubnVsbFZhbHVlKCk7CisgKiAgICAgfQorICogICAgIHdyaXRlci5uYW1lKCJ1c2VyIik7CisgKiAgICAgd3JpdGVVc2VyKHdyaXRlciwgbWVzc2FnZS5nZXRVc2VyKCkpOworICogICAgIHdyaXRlci5lbmRPYmplY3QoKTsKKyAqICAgfQorICoKKyAqICAgcHVibGljIHZvaWQgd3JpdGVVc2VyKEpzb25Xcml0ZXIgd3JpdGVyLCBVc2VyIHVzZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgKiAgICAgd3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgKiAgICAgd3JpdGVyLm5hbWUoIm5hbWUiKS52YWx1ZSh1c2VyLmdldE5hbWUoKSk7CisgKiAgICAgd3JpdGVyLm5hbWUoImZvbGxvd2Vyc19jb3VudCIpLnZhbHVlKHVzZXIuZ2V0Rm9sbG93ZXJzQ291bnQoKSk7CisgKiAgICAgd3JpdGVyLmVuZE9iamVjdCgpOworICogICB9CisgKgorICogICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZXNBcnJheShKc29uV3JpdGVyIHdyaXRlciwgTGlzdDxEb3VibGU+IGRvdWJsZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgKiAgICAgd3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAqICAgICBmb3IgKERvdWJsZSB2YWx1ZSA6IGRvdWJsZXMpIHsKKyAqICAgICAgIHdyaXRlci52YWx1ZSh2YWx1ZSk7CisgKiAgICAgfQorICogICAgIHdyaXRlci5lbmRBcnJheSgpOworICogICB9fTwvcHJlPgorICoKKyAqIDxwPkVhY2gge0Bjb2RlIEpzb25Xcml0ZXJ9IG1heSBiZSB1c2VkIHRvIHdyaXRlIGEgc2luZ2xlIEpTT04gc3RyZWFtLgorICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIG5vdCB0aHJlYWQgc2FmZS4gQ2FsbHMgdGhhdCB3b3VsZCByZXN1bHQgaW4gYQorICogbWFsZm9ybWVkIEpTT04gc3RyaW5nIHdpbGwgZmFpbCB3aXRoIGFuIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSnNvbldyaXRlciBpbXBsZW1lbnRzIENsb3NlYWJsZSB7CisKKyAgICAvKiogVGhlIG91dHB1dCBkYXRhLCBjb250YWluaW5nIGF0IG1vc3Qgb25lIHRvcC1sZXZlbCBhcnJheSBvciBvYmplY3QuICovCisgICAgcHJpdmF0ZSBmaW5hbCBXcml0ZXIgb3V0OworCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEpzb25TY29wZT4gc3RhY2sgPSBuZXcgQXJyYXlMaXN0PEpzb25TY29wZT4oKTsKKyAgICB7CisgICAgICAgIHN0YWNrLmFkZChKc29uU2NvcGUuRU1QVFlfRE9DVU1FTlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBmdWxsIHNldCBvZiBzcGFjZXMgZm9yIGEgc2luZ2xlIGxldmVsIG9mCisgICAgICogaW5kZW50YXRpb24sIG9yIG51bGwgZm9yIG5vIHByZXR0eSBwcmludGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpbmRlbnQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZS92YWx1ZSBzZXBhcmF0b3I7IGVpdGhlciAiOiIgb3IgIjogIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzZXBhcmF0b3IgPSAiOiI7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIHRoYXQgd3JpdGVzIGEgSlNPTi1lbmNvZGVkIHN0cmVhbSB0byB7QGNvZGUgb3V0fS4KKyAgICAgKiBGb3IgYmVzdCBwZXJmb3JtYW5jZSwgZW5zdXJlIHtAbGluayBXcml0ZXJ9IGlzIGJ1ZmZlcmVkOyB3cmFwcGluZyBpbgorICAgICAqIHtAbGluayBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyIEJ1ZmZlcmVkV3JpdGVyfSBpZiBuZWNlc3NhcnkuCisgICAgICovCisgICAgcHVibGljIEpzb25Xcml0ZXIoV3JpdGVyIG91dCkgeworICAgICAgICBpZiAob3V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigib3V0ID09IG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLm91dCA9IG91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBpbmRlbnRhdGlvbiBzdHJpbmcgdG8gYmUgcmVwZWF0ZWQgZm9yIGVhY2ggbGV2ZWwgb2YgaW5kZW50YXRpb24KKyAgICAgKiBpbiB0aGUgZW5jb2RlZCBkb2N1bWVudC4gSWYge0Bjb2RlIGluZGVudC5pc0VtcHR5KCl9IHRoZSBlbmNvZGVkIGRvY3VtZW50CisgICAgICogd2lsbCBiZSBjb21wYWN0LiBPdGhlcndpc2UgdGhlIGVuY29kZWQgZG9jdW1lbnQgd2lsbCBiZSBtb3JlCisgICAgICogaHVtYW4tcmVhZGFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5kZW50IGEgc3RyaW5nIGNvbnRhaW5pbmcgb25seSB3aGl0ZXNwYWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluZGVudChTdHJpbmcgaW5kZW50KSB7CisgICAgICAgIGlmIChpbmRlbnQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aGlzLmluZGVudCA9IG51bGw7CisgICAgICAgICAgICB0aGlzLnNlcGFyYXRvciA9ICI6IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuaW5kZW50ID0gaW5kZW50OworICAgICAgICAgICAgdGhpcy5zZXBhcmF0b3IgPSAiOiAiOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQmVnaW5zIGVuY29kaW5nIGEgbmV3IGFycmF5LiBFYWNoIGNhbGwgdG8gdGhpcyBtZXRob2QgbXVzdCBiZSBwYWlyZWQgd2l0aAorICAgICAqIGEgY2FsbCB0byB7QGxpbmsgI2VuZEFycmF5fS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIEpzb25Xcml0ZXIgYmVnaW5BcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBvcGVuKEpzb25TY29wZS5FTVBUWV9BUlJBWSwgIlsiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmRzIGVuY29kaW5nIHRoZSBjdXJyZW50IGFycmF5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlciBlbmRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjbG9zZShKc29uU2NvcGUuRU1QVFlfQVJSQVksIEpzb25TY29wZS5OT05FTVBUWV9BUlJBWSwgIl0iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCZWdpbnMgZW5jb2RpbmcgYSBuZXcgb2JqZWN0LiBFYWNoIGNhbGwgdG8gdGhpcyBtZXRob2QgbXVzdCBiZSBwYWlyZWQKKyAgICAgKiB3aXRoIGEgY2FsbCB0byB7QGxpbmsgI2VuZE9iamVjdH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBKc29uV3JpdGVyIGJlZ2luT2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG9wZW4oSnNvblNjb3BlLkVNUFRZX09CSkVDVCwgInsiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmRzIGVuY29kaW5nIHRoZSBjdXJyZW50IG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIEpzb25Xcml0ZXIgZW5kT2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNsb3NlKEpzb25TY29wZS5FTVBUWV9PQkpFQ1QsIEpzb25TY29wZS5OT05FTVBUWV9PQkpFQ1QsICJ9Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW50ZXJzIGEgbmV3IHNjb3BlIGJ5IGFwcGVuZGluZyBhbnkgbmVjZXNzYXJ5IHdoaXRlc3BhY2UgYW5kIHRoZSBnaXZlbgorICAgICAqIGJyYWNrZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBKc29uV3JpdGVyIG9wZW4oSnNvblNjb3BlIGVtcHR5LCBTdHJpbmcgb3BlbkJyYWNrZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJlZm9yZVZhbHVlKHRydWUpOworICAgICAgICBzdGFjay5hZGQoZW1wdHkpOworICAgICAgICBvdXQud3JpdGUob3BlbkJyYWNrZXQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIGN1cnJlbnQgc2NvcGUgYnkgYXBwZW5kaW5nIGFueSBuZWNlc3Nhcnkgd2hpdGVzcGFjZSBhbmQgdGhlCisgICAgICogZ2l2ZW4gYnJhY2tldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEpzb25Xcml0ZXIgY2xvc2UoSnNvblNjb3BlIGVtcHR5LCBKc29uU2NvcGUgbm9uZW1wdHksIFN0cmluZyBjbG9zZUJyYWNrZXQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uU2NvcGUgY29udGV4dCA9IHBlZWsoKTsKKyAgICAgICAgaWYgKGNvbnRleHQgIT0gbm9uZW1wdHkgJiYgY29udGV4dCAhPSBlbXB0eSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTmVzdGluZyBwcm9ibGVtOiAiICsgc3RhY2spOworICAgICAgICB9CisKKyAgICAgICAgc3RhY2sucmVtb3ZlKHN0YWNrLnNpemUoKSAtIDEpOworICAgICAgICBpZiAoY29udGV4dCA9PSBub25lbXB0eSkgeworICAgICAgICAgICAgbmV3bGluZSgpOworICAgICAgICB9CisgICAgICAgIG91dC53cml0ZShjbG9zZUJyYWNrZXQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4KKyAgICAgKi8KKyAgICBwcml2YXRlIEpzb25TY29wZSBwZWVrKCkgeworICAgICAgICByZXR1cm4gc3RhY2suZ2V0KHN0YWNrLnNpemUoKSAtIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcGxhY2UgdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrIHdpdGggdGhlIGdpdmVuIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXBsYWNlVG9wKEpzb25TY29wZSB0b3BPZlN0YWNrKSB7CisgICAgICAgIHN0YWNrLnNldChzdGFjay5zaXplKCkgLSAxLCB0b3BPZlN0YWNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIHRoZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZvcnRoY29taW5nIHZhbHVlLiBNYXkgbm90IGJlIG51bGwuCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlciBuYW1lKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm5hbWUgPT0gbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGJlZm9yZU5hbWUoKTsKKyAgICAgICAgc3RyaW5nKG5hbWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIHtAY29kZSB2YWx1ZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGxpdGVyYWwgc3RyaW5nIHZhbHVlLCBvciBudWxsIHRvIGVuY29kZSBhIG51bGwgbGl0ZXJhbC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBKc29uV3JpdGVyIHZhbHVlKFN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsVmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICBiZWZvcmVWYWx1ZShmYWxzZSk7CisgICAgICAgIHN0cmluZyh2YWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMge0Bjb2RlIG51bGx9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlciBudWxsVmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBiZWZvcmVWYWx1ZShmYWxzZSk7CisgICAgICAgIG91dC53cml0ZSgibnVsbCIpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIHtAY29kZSB2YWx1ZX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBKc29uV3JpdGVyIHZhbHVlKGJvb2xlYW4gdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJlZm9yZVZhbHVlKGZhbHNlKTsKKyAgICAgICAgb3V0LndyaXRlKHZhbHVlID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMge0Bjb2RlIHZhbHVlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBhIGZpbml0ZSB2YWx1ZS4gTWF5IG5vdCBiZSB7QGxpbmsgRG91YmxlI2lzTmFOKCkgTmFOc30gb3IKKyAgICAgKiAgICAge0BsaW5rIERvdWJsZSNpc0luZmluaXRlKCkgaW5maW5pdGllc30uCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlciB2YWx1ZShkb3VibGUgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChEb3VibGUuaXNOYU4odmFsdWUpIHx8IERvdWJsZS5pc0luZmluaXRlKHZhbHVlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVtZXJpYyB2YWx1ZXMgbXVzdCBiZSBmaW5pdGUsIGJ1dCB3YXMgIiArIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBiZWZvcmVWYWx1ZShmYWxzZSk7CisgICAgICAgIG91dC5hcHBlbmQoRG91YmxlLnRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMge0Bjb2RlIHZhbHVlfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIEpzb25Xcml0ZXIgdmFsdWUobG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYmVmb3JlVmFsdWUoZmFsc2UpOworICAgICAgICBvdXQud3JpdGUoTG9uZy50b1N0cmluZyh2YWx1ZSkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIGFsbCBidWZmZXJlZCBkYXRhIGlzIHdyaXR0ZW4gdG8gdGhlIHVuZGVybHlpbmcge0BsaW5rIFdyaXRlcn0KKyAgICAgKiBhbmQgZmx1c2hlcyB0aGF0IHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC5mbHVzaCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZsdXNoZXMgYW5kIGNsb3NlcyB0aGlzIHdyaXRlciBhbmQgdGhlIHVuZGVybHlpbmcge0BsaW5rIFdyaXRlcn0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBKU09OIGRvY3VtZW50IGlzIGluY29tcGxldGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQuY2xvc2UoKTsKKworICAgICAgICBpZiAocGVlaygpICE9IEpzb25TY29wZS5OT05FTVBUWV9ET0NVTUVOVCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJbmNvbXBsZXRlIGRvY3VtZW50Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RyaW5nKFN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LndyaXRlKCJcIiIpOworICAgICAgICBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gdmFsdWUuY2hhckF0KGkpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRnJvbSBSRkMgNDYyNywgIkFsbCBVbmljb2RlIGNoYXJhY3RlcnMgbWF5IGJlIHBsYWNlZCB3aXRoaW4gdGhlCisgICAgICAgICAgICAgKiBxdW90YXRpb24gbWFya3MgZXhjZXB0IGZvciB0aGUgY2hhcmFjdGVycyB0aGF0IG11c3QgYmUgZXNjYXBlZDoKKyAgICAgICAgICAgICAqIHF1b3RhdGlvbiBtYXJrLCByZXZlcnNlIHNvbGlkdXMsIGFuZCB0aGUgY29udHJvbCBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgKiAoVSswMDAwIHRocm91Z2ggVSswMDFGKS4iCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCdcXCcpOworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIlxcdCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ1xiJzoKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCJcXGIiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgiXFxuIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIlxcciIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ1xmJzoKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCJcXGYiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoYyA8PSAweDFGKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoU3RyaW5nLmZvcm1hdCgiXFx1JTA0eCIsIChpbnQpIGMpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShjKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIG91dC53cml0ZSgiXCIiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbmV3bGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpbmRlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgb3V0LndyaXRlKCJcbiIpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHN0YWNrLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBvdXQud3JpdGUoaW5kZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydHMgYW55IG5lY2Vzc2FyeSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIGJlZm9yZSBhIG5hbWUuIEFsc28KKyAgICAgKiBhZGp1c3RzIHRoZSBzdGFjayB0byBleHBlY3QgdGhlIG5hbWUncyB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYmVmb3JlTmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25TY29wZSBjb250ZXh0ID0gcGVlaygpOworICAgICAgICBpZiAoY29udGV4dCA9PSBKc29uU2NvcGUuTk9ORU1QVFlfT0JKRUNUKSB7IC8vIGZpcnN0IGluIG9iamVjdAorICAgICAgICAgICAgb3V0LndyaXRlKCcsJyk7CisgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dCAhPSBKc29uU2NvcGUuRU1QVFlfT0JKRUNUKSB7IC8vIG5vdCBpbiBhbiBvYmplY3QhCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOZXN0aW5nIHByb2JsZW06ICIgKyBzdGFjayk7CisgICAgICAgIH0KKyAgICAgICAgbmV3bGluZSgpOworICAgICAgICByZXBsYWNlVG9wKEpzb25TY29wZS5EQU5HTElOR19OQU1FKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnRzIGFueSBuZWNlc3Nhcnkgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSBiZWZvcmUgYSBsaXRlcmFsIHZhbHVlLAorICAgICAqIGlubGluZSBhcnJheSwgb3IgaW5saW5lIG9iamVjdC4gQWxzbyBhZGp1c3RzIHRoZSBzdGFjayB0byBleHBlY3QgZWl0aGVyIGEKKyAgICAgKiBjbG9zaW5nIGJyYWNrZXQgb3IgYW5vdGhlciBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHJvb3QgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBuZXcgYXJyYXkgb3Igb2JqZWN0LCB0aGUgdHdvIHZhbHVlcworICAgICAqICAgICBwZXJtaXR0ZWQgYXMgdG9wLWxldmVsIGVsZW1lbnRzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBiZWZvcmVWYWx1ZShib29sZWFuIHJvb3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN3aXRjaCAocGVlaygpKSB7CisgICAgICAgICAgICBjYXNlIEVNUFRZX0RPQ1VNRU5UOiAvLyBmaXJzdCBpbiBkb2N1bWVudAorICAgICAgICAgICAgICAgIGlmICghcm9vdCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKU09OIG11c3Qgc3RhcnQgd2l0aCBhbiBhcnJheSBvciBhbiBvYmplY3QuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcGxhY2VUb3AoSnNvblNjb3BlLk5PTkVNUFRZX0RPQ1VNRU5UKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBFTVBUWV9BUlJBWTogLy8gZmlyc3QgaW4gYXJyYXkKKyAgICAgICAgICAgICAgICByZXBsYWNlVG9wKEpzb25TY29wZS5OT05FTVBUWV9BUlJBWSk7CisgICAgICAgICAgICAgICAgbmV3bGluZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5PTkVNUFRZX0FSUkFZOiAvLyBhbm90aGVyIGluIGFycmF5CisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgnLCcpOworICAgICAgICAgICAgICAgIG5ld2xpbmUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBEQU5HTElOR19OQU1FOiAvLyB2YWx1ZSBmb3IgbmFtZQorICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoc2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICByZXBsYWNlVG9wKEpzb25TY29wZS5OT05FTVBUWV9PQkpFQ1QpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5PTkVNUFRZX0RPQ1VNRU5UOgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiSlNPTiBtdXN0IGhhdmUgb25seSBvbmUgdG9wLWxldmVsIHZhbHVlLiIpOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5lc3RpbmcgcHJvYmxlbTogIiArIHN0YWNrKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvUGF0dGVybnMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvUGF0dGVybnMuamF2YQppbmRleCA1Y2JmZDI5Li4zYmNkMjY2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1BhdHRlcm5zLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9QYXR0ZXJucy5qYXZhCkBAIC0yNSw3ICsyNSw3IEBACiBwdWJsaWMgY2xhc3MgUGF0dGVybnMgewogICAgIC8qKgogICAgICAqICBSZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggYWxsIElBTkEgdG9wLWxldmVsIGRvbWFpbnMuCi0gICAgICogIExpc3QgYWNjdXJhdGUgYXMgb2YgMjAxMC8wMi8wNS4gIExpc3QgdGFrZW4gZnJvbToKKyAgICAgKiAgTGlzdCBhY2N1cmF0ZSBhcyBvZiAyMDEwLzA1LzA2LiAgTGlzdCB0YWtlbiBmcm9tOgogICAgICAqICBodHRwOi8vZGF0YS5pYW5hLm9yZy9UTEQvdGxkcy1hbHBoYS1ieS1kb21haW4udHh0CiAgICAgICogIFRoaXMgcGF0dGVybiBpcyBhdXRvLWdlbmVyYXRlZCBieSBmcmFtZXdvcmtzL2Jhc2UvY29tbW9uL3Rvb2xzL21ha2UtaWFuYS10bGQtcGF0dGVybi5weQogICAgICAqLwpAQCAtNTMsOCArNTMsOCBAQAogICAgICAgICArICJ8dVthZ2tzeXpdIgogICAgICAgICArICJ8dlthY2VnaW51XSIKICAgICAgICAgKyAifHdbZnNdIgotICAgICAgICArICJ8KHhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLXpja3phaCkiCi0gICAgICAgICsgInx5W2V0dV0iCisgICAgICAgICsgInwoeG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtbWdiYWFtN2E4aHx4blxcLVxcLW1nYmVycDRhNWQ0YXJ8eG5cXC1cXC13Z2JoMWN8eG5cXC1cXC16Y2t6YWgpIgorICAgICAgICArICJ8eVtldF0iCiAgICAgICAgICsgInx6W2Ftd10pIjsKIAogICAgIC8qKgpAQCAtNjUsNyArNjUsNyBAQAogCiAgICAgLyoqCiAgICAgICogIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBhbGwgSUFOQSB0b3AtbGV2ZWwgZG9tYWlucyBmb3IgV0VCX1VSTC4KLSAgICAgKiAgTGlzdCBhY2N1cmF0ZSBhcyBvZiAyMDEwLzAyLzA1LiAgTGlzdCB0YWtlbiBmcm9tOgorICAgICAqICBMaXN0IGFjY3VyYXRlIGFzIG9mIDIwMTAvMDUvMDYuICBMaXN0IHRha2VuIGZyb206CiAgICAgICogIGh0dHA6Ly9kYXRhLmlhbmEub3JnL1RMRC90bGRzLWFscGhhLWJ5LWRvbWFpbi50eHQKICAgICAgKiAgVGhpcyBwYXR0ZXJuIGlzIGF1dG8tZ2VuZXJhdGVkIGJ5IGZyYW1ld29ya3MvYmFzZS9jb21tb24vdG9vbHMvbWFrZS1pYW5hLXRsZC1wYXR0ZXJuLnB5CiAgICAgICovCkBAIC05NCw4ICs5NCw4IEBACiAgICAgICAgICsgInx1W2Fna3N5el0iCiAgICAgICAgICsgInx2W2FjZWdpbnVdIgogICAgICAgICArICJ8d1tmc10iCi0gICAgICAgICsgInwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC16Y2t6YWgpIgotICAgICAgICArICJ8eVtldHVdIgorICAgICAgICArICJ8KD86eG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtbWdiYWFtN2E4aHx4blxcLVxcLW1nYmVycDRhNWQ0YXJ8eG5cXC1cXC13Z2JoMWN8eG5cXC1cXC16Y2t6YWgpIgorICAgICAgICArICJ8eVtldF0iCiAgICAgICAgICsgInx6W2Ftd10pKSI7CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvU3BhcnNlQXJyYXkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvU3BhcnNlQXJyYXkuamF2YQppbmRleCAxYzhiMzMwLi43ZmM0M2I5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9TcGFyc2VBcnJheS5qYXZhCkBAIC05MCw2ICs5MCwxNiBAQAogICAgICAgICBkZWxldGUoa2V5KTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBtYXBwaW5nIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXQoaW50IGluZGV4KSB7CisgICAgICAgIGlmIChtVmFsdWVzW2luZGV4XSAhPSBERUxFVEVEKSB7CisgICAgICAgICAgICBtVmFsdWVzW2luZGV4XSA9IERFTEVURUQ7CisgICAgICAgICAgICBtR2FyYmFnZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgCiAgICAgcHJpdmF0ZSB2b2lkIGdjKCkgewogICAgICAgICAvLyBMb2cuZSgiU3BhcnNlQXJyYXkiLCAiZ2Mgc3RhcnQgd2l0aCAiICsgbVNpemUpOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1RpbWluZ0xvZ2dlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9UaW1pbmdMb2dnZXIuamF2YQppbmRleCAwZjM5Yzk3Li5iZTQ0MmRhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1RpbWluZ0xvZ2dlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvVGltaW5nTG9nZ2VyLmphdmEKQEAgLTI0LDIyICsyNCwyNiBAQAogICogQSB1dGlsaXR5IGNsYXNzIHRvIGhlbHAgbG9nIHRpbWluZ3Mgc3BsaXRzIHRocm91Z2hvdXQgYSBtZXRob2QgY2FsbC4KICAqIFR5cGljYWwgdXNhZ2UgaXM6CiAgKgotICogVGltaW5nTG9nZ2VyIHRpbWluZ3MgPSBuZXcgVGltaW5nTG9nZ2VyKFRBRywgIm1ldGhvZEEiKTsKLSAqIC4uLiBkbyBzb21lIHdvcmsgQSAuLi4KLSAqIHRpbWluZ3MuYWRkU3BsaXQoIndvcmsgQSIpOwotICogLi4uIGRvIHNvbWUgd29yayBCIC4uLgotICogdGltaW5ncy5hZGRTcGxpdCgid29yayBCIik7Ci0gKiAuLi4gZG8gc29tZSB3b3JrIEMgLi4uCi0gKiB0aW1pbmdzLmFkZFNwbGl0KCJ3b3JrIEMiKTsKLSAqIHRpbWluZ3MuZHVtcFRvTG9nKCk7CisgKiA8cHJlPgorICogICAgIFRpbWluZ0xvZ2dlciB0aW1pbmdzID0gbmV3IFRpbWluZ0xvZ2dlcihUQUcsICJtZXRob2RBIik7CisgKiAgICAgLy8gLi4uIGRvIHNvbWUgd29yayBBIC4uLgorICogICAgIHRpbWluZ3MuYWRkU3BsaXQoIndvcmsgQSIpOworICogICAgIC8vIC4uLiBkbyBzb21lIHdvcmsgQiAuLi4KKyAqICAgICB0aW1pbmdzLmFkZFNwbGl0KCJ3b3JrIEIiKTsKKyAqICAgICAvLyAuLi4gZG8gc29tZSB3b3JrIEMgLi4uCisgKiAgICAgdGltaW5ncy5hZGRTcGxpdCgid29yayBDIik7CisgKiAgICAgdGltaW5ncy5kdW1wVG9Mb2coKTsKKyAqIDwvcHJlPgogICoKLSAqIFRoZSBkdW1wVG9Mb2cgY2FsbCB3b3VsZCBhZGQgdGhlIGZvbGxvd2luZyB0byB0aGUgbG9nOgorICogPHA+VGhlIGR1bXBUb0xvZyBjYWxsIHdvdWxkIGFkZCB0aGUgZm9sbG93aW5nIHRvIHRoZSBsb2c6PC9wPgogICoKLSAqIEQvVEFHICAgICAoIDM0NTkpOiBtZXRob2RBOiBiZWdpbgotICogRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6ICAgICAgOSBtcywgd29yayBBCi0gKiBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogICAgICAxIG1zLCB3b3JrIEIKLSAqIEQvVEFHICAgICAoIDM0NTkpOiBtZXRob2RBOiAgICAgIDYgbXMsIHdvcmsgQwotICogRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6IGVuZCwgMTYgbXMKKyAqIDxwcmU+CisgKiAgICAgRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6IGJlZ2luCisgKiAgICAgRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6ICAgICAgOSBtcywgd29yayBBCisgKiAgICAgRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6ICAgICAgMSBtcywgd29yayBCCisgKiAgICAgRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6ICAgICAgNiBtcywgd29yayBDCisgKiAgICAgRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6IGVuZCwgMTYgbXMKKyAqIDwvcHJlPgogICovCiBwdWJsaWMgY2xhc3MgVGltaW5nTG9nZ2VyIHsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9BY3Rpb25Nb2RlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0FjdGlvbk1vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmFmYTk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9BY3Rpb25Nb2RlLmphdmEKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudmlldzsKKworCisvKioKKyAqIFJlcHJlc2VudHMgYSBjb250ZXh0dWFsIG1vZGUgb2YgdGhlIHVzZXIgaW50ZXJmYWNlLiBBY3Rpb24gbW9kZXMgY2FuIGJlIHVzZWQgZm9yCisgKiBtb2RhbCBpbnRlcmFjdGlvbnMgd2l0aCBjb250ZW50IGFuZCByZXBsYWNlIHBhcnRzIG9mIHRoZSBub3JtYWwgVUkgdW50aWwgZmluaXNoZWQuCisgKiBFeGFtcGxlcyBvZiBnb29kIGFjdGlvbiBtb2RlcyBpbmNsdWRlIHNlbGVjdGlvbiBtb2Rlcywgc2VhcmNoLCBjb250ZW50IGVkaXRpbmcsIGV0Yy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFjdGlvbk1vZGUgeworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGl0bGUgb2YgdGhlIGFjdGlvbiBtb2RlLiBUaGlzIG1ldGhvZCB3aWxsIGhhdmUgbm8gdmlzaWJsZSBlZmZlY3QgaWYKKyAgICAgKiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSBzdHJpbmcgdG8gc2V0CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRUaXRsZShpbnQpCisgICAgICogQHNlZSAjc2V0Q3VzdG9tVmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRpdGxlIG9mIHRoZSBhY3Rpb24gbW9kZS4gVGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIHZpc2libGUgZWZmZWN0IGlmCisgICAgICogYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzSWQgUmVzb3VyY2UgSUQgb2YgYSBzdHJpbmcgdG8gc2V0IGFzIHRoZSB0aXRsZQorICAgICAqCisgICAgICogQHNlZSAjc2V0VGl0bGUoQ2hhclNlcXVlbmNlKQorICAgICAqIEBzZWUgI3NldEN1c3RvbVZpZXcoVmlldykKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUaXRsZShpbnQgcmVzSWQpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdWJ0aXRsZSBvZiB0aGUgYWN0aW9uIG1vZGUuIFRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBubyB2aXNpYmxlIGVmZmVjdCBpZgorICAgICAqIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHN1YnRpdGxlIFN1YnRpdGxlIHN0cmluZyB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFN1YnRpdGxlKGludCkKKyAgICAgKiBAc2VlICNzZXRDdXN0b21WaWV3KFZpZXcpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlIHN1YnRpdGxlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3VidGl0bGUgb2YgdGhlIGFjdGlvbiBtb2RlLiBUaGlzIG1ldGhvZCB3aWxsIGhhdmUgbm8gdmlzaWJsZSBlZmZlY3QgaWYKKyAgICAgKiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNJZCBSZXNvdXJjZSBJRCBvZiBhIHN0cmluZyB0byBzZXQgYXMgdGhlIHN1YnRpdGxlCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0Q3VzdG9tVmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFN1YnRpdGxlKGludCByZXNJZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBjdXN0b20gdmlldyBmb3IgdGhpcyBhY3Rpb24gbW9kZS4gVGhlIGN1c3RvbSB2aWV3IHdpbGwgdGFrZSB0aGUgcGxhY2Ugb2YKKyAgICAgKiB0aGUgdGl0bGUgYW5kIHN1YnRpdGxlLiBVc2VmdWwgZm9yIHRoaW5ncyBsaWtlIHNlYXJjaCBib3hlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2aWV3IEN1c3RvbSB2aWV3IHRvIHVzZSBpbiBwbGFjZSBvZiB0aGUgdGl0bGUvc3VidGl0bGUuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRUaXRsZShDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlKQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEN1c3RvbVZpZXcoVmlldyB2aWV3KTsKKworICAgIC8qKgorICAgICAqIEludmFsaWRhdGUgdGhlIGFjdGlvbiBtb2RlIGFuZCByZWZyZXNoIG1lbnUgY29udGVudC4gVGhlIG1vZGUncworICAgICAqIHtAbGluayBBY3Rpb25Nb2RlLkNhbGxiYWNrfSB3aWxsIGhhdmUgaXRzCisgICAgICoge0BsaW5rIENhbGxiYWNrI29uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSwgTWVudSl9IG1ldGhvZCBjYWxsZWQuCisgICAgICogSWYgaXQgcmV0dXJucyB0cnVlIHRoZSBtZW51IHdpbGwgYmUgc2Nhbm5lZCBmb3IgdXBkYXRlZCBjb250ZW50IGFuZCBhbnkgcmVsZXZhbnQgY2hhbmdlcworICAgICAqIHdpbGwgYmUgcmVmbGVjdGVkIHRvIHRoZSB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGludmFsaWRhdGUoKTsKKworICAgIC8qKgorICAgICAqIEZpbmlzaCBhbmQgY2xvc2UgdGhpcyBhY3Rpb24gbW9kZS4gVGhlIGFjdGlvbiBtb2RlJ3Mge0BsaW5rIEFjdGlvbk1vZGUuQ2FsbGJhY2t9IHdpbGwKKyAgICAgKiBoYXZlIGl0cyB7QGxpbmsgQ2FsbGJhY2sjb25EZXN0cm95QWN0aW9uTW9kZShBY3Rpb25Nb2RlKX0gbWV0aG9kIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmaW5pc2goKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1lbnUgb2YgYWN0aW9ucyB0aGF0IHRoaXMgYWN0aW9uIG1vZGUgcHJlc2VudHMuCisgICAgICogQHJldHVybiBUaGUgYWN0aW9uIG1vZGUncyBtZW51LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBNZW51IGdldE1lbnUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGl0bGUgb2YgdGhpcyBhY3Rpb24gbW9kZS4KKyAgICAgKiBAcmV0dXJuIFRpdGxlIHRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN1YnRpdGxlIG9mIHRoaXMgYWN0aW9uIG1vZGUuCisgICAgICogQHJldHVybiBTdWJ0aXRsZSB0ZXh0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBjdXN0b20gdmlldyBmb3IgdGhpcyBhY3Rpb24gbW9kZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGN1c3RvbSB2aWV3CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFZpZXcgZ2V0Q3VzdG9tVmlldygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAbGluayBNZW51SW5mbGF0ZXJ9IHdpdGggdGhlIEFjdGlvbk1vZGUncyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBNZW51SW5mbGF0ZXIgZ2V0TWVudUluZmxhdGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBpbnRlcmZhY2UgZm9yIGFjdGlvbiBtb2Rlcy4gU3VwcGxpZWQgdG8KKyAgICAgKiB7QGxpbmsgVmlldyNzdGFydEFjdGlvbk1vZGUoQ2FsbGJhY2spfSwgYSBDYWxsYmFjaworICAgICAqIGNvbmZpZ3VyZXMgYW5kIGhhbmRsZXMgZXZlbnRzIHJhaXNlZCBieSBhIHVzZXIncyBpbnRlcmFjdGlvbiB3aXRoIGFuIGFjdGlvbiBtb2RlLgorICAgICAqCisgICAgICogPHA+QW4gYWN0aW9uIG1vZGUncyBsaWZlY3ljbGUgaXMgYXMgZm9sbG93czoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayBDYWxsYmFjayNvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSwgTWVudSl9IG9uY2Ugb24gaW5pdGlhbAorICAgICAqIGNyZWF0aW9uPC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIENhbGxiYWNrI29uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSwgTWVudSl9IGFmdGVyIGNyZWF0aW9uCisgICAgICogYW5kIGFueSB0aW1lIHRoZSB7QGxpbmsgQWN0aW9uTW9kZX0gaXMgaW52YWxpZGF0ZWQ8L2xpPgorICAgICAqIDxsaT57QGxpbmsgQ2FsbGJhY2sjb25BY3Rpb25JdGVtQ2xpY2tlZChBY3Rpb25Nb2RlLCBNZW51SXRlbSl9IGFueSB0aW1lIGEKKyAgICAgKiBjb250ZXh0dWFsIGFjdGlvbiBidXR0b24gaXMgY2xpY2tlZDwvbGk+CisgICAgICogPGxpPntAbGluayBDYWxsYmFjayNvbkRlc3Ryb3lBY3Rpb25Nb2RlKEFjdGlvbk1vZGUpfSB3aGVuIHRoZSBhY3Rpb24gbW9kZQorICAgICAqIGlzIGNsb3NlZDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGFjdGlvbiBtb2RlIGlzIGZpcnN0IGNyZWF0ZWQuIFRoZSBtZW51IHN1cHBsaWVkIHdpbGwgYmUgdXNlZCB0bworICAgICAgICAgKiBnZW5lcmF0ZSBhY3Rpb24gYnV0dG9ucyBmb3IgdGhlIGFjdGlvbiBtb2RlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbW9kZSBBY3Rpb25Nb2RlIGJlaW5nIGNyZWF0ZWQKKyAgICAgICAgICogQHBhcmFtIG1lbnUgTWVudSB1c2VkIHRvIHBvcHVsYXRlIGFjdGlvbiBidXR0b25zCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYWN0aW9uIG1vZGUgc2hvdWxkIGJlIGNyZWF0ZWQsIGZhbHNlIGlmIGVudGVyaW5nIHRoaXMKKyAgICAgICAgICogICAgICAgICAgICAgIG1vZGUgc2hvdWxkIGJlIGFib3J0ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgdG8gcmVmcmVzaCBhbiBhY3Rpb24gbW9kZSdzIGFjdGlvbiBtZW51IHdoZW5ldmVyIGl0IGlzIGludmFsaWRhdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbW9kZSBBY3Rpb25Nb2RlIGJlaW5nIHByZXBhcmVkCisgICAgICAgICAqIEBwYXJhbSBtZW51IE1lbnUgdXNlZCB0byBwb3B1bGF0ZSBhY3Rpb24gYnV0dG9ucworICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1lbnUgb3IgYWN0aW9uIG1vZGUgd2FzIHVwZGF0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgdG8gcmVwb3J0IGEgdXNlciBjbGljayBvbiBhbiBhY3Rpb24gYnV0dG9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbW9kZSBUaGUgY3VycmVudCBBY3Rpb25Nb2RlCisgICAgICAgICAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRoYXQgd2FzIGNsaWNrZWQKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgY2FsbGJhY2sgaGFuZGxlZCB0aGUgZXZlbnQsIGZhbHNlIGlmIHRoZSBzdGFuZGFyZCBNZW51SXRlbQorICAgICAgICAgKiAgICAgICAgICBpbnZvY2F0aW9uIHNob3VsZCBjb250aW51ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aW9uSXRlbUNsaWNrZWQoQWN0aW9uTW9kZSBtb2RlLCBNZW51SXRlbSBpdGVtKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYW4gYWN0aW9uIG1vZGUgaXMgYWJvdXQgdG8gYmUgZXhpdGVkIGFuZCBkZXN0cm95ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtb2RlIFRoZSBjdXJyZW50IEFjdGlvbk1vZGUgYmVpbmcgZGVzdHJveWVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwQ2FudmFzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMENhbnZhcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1Y2IxODIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMENhbnZhcy5qYXZhCkBAIC0wLDAgKzEsODI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXc7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuRHJhd0ZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVGVtcG9yYXJ5QnVmZmVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5HcmFwaGljc09wZXJhdGlvbnM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZFN0cmluZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworCitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0w7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgQ2FudmFzIG9uIHRvcCBvZiBPcGVuR0wgRVMgMi4wLgorICovCitjbGFzcyBHTEVTMjBDYW52YXMgZXh0ZW5kcyBDYW52YXMgeworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIiwgIlVudXNlZERlY2xhcmF0aW9uIn0pCisgICAgcHJpdmF0ZSBmaW5hbCBHTCBtR2w7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1PcGFxdWU7CisgICAgcHJpdmF0ZSBpbnQgbVJlbmRlcmVyOworICAgIAorICAgIHByaXZhdGUgaW50IG1XaWR0aDsKKyAgICBwcml2YXRlIGludCBtSGVpZ2h0OworICAgIAorICAgIHByaXZhdGUgZmluYWwgZmxvYXRbXSBtUG9pbnQgPSBuZXcgZmxvYXRbMl07CisgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1MaW5lID0gbmV3IGZsb2F0WzRdOworICAgIAorICAgIHByaXZhdGUgZmluYWwgUmVjdCBtQ2xpcEJvdW5kcyA9IG5ldyBSZWN0KCk7CisKKyAgICBwcml2YXRlIERyYXdGaWx0ZXIgbUZpbHRlcjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtQ29udGV4dExvY2tlZDsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEpOSQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbklzQXZhaWxhYmxlKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzSXNBdmFpbGFibGUgPSBuSXNBdmFpbGFibGUoKTsKKworICAgIHN0YXRpYyBib29sZWFuIGlzQXZhaWxhYmxlKCkgeworICAgICAgICByZXR1cm4gc0lzQXZhaWxhYmxlOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIENvbnN0cnVjdG9ycworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIAorICAgIEdMRVMyMENhbnZhcyhHTCBnbCwgYm9vbGVhbiB0cmFuc2x1Y2VudCkgeworICAgICAgICBtR2wgPSBnbDsKKyAgICAgICAgbU9wYXF1ZSA9ICF0cmFuc2x1Y2VudDsKKworICAgICAgICBtUmVuZGVyZXIgPSBuQ3JlYXRlUmVuZGVyZXIoKTsKKyAgICAgICAgaWYgKG1SZW5kZXJlciA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIEdMRVMyMENhbnZhcyByZW5kZXJlciIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIGludCBuQ3JlYXRlUmVuZGVyZXIoKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIDxzdHJvbmc+bXVzdDwvc3Ryb25nPiBiZSBjYWxsZWQgYmVmb3JlIHJlbGVhc2luZyBhCisgICAgICogcmVmZXJlbmNlIHRvIGEgR0xFUzIwQ2FudmFzLiBUaGlzIG1ldGhvZCBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZworICAgICAqIG5hdGl2ZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYXJkd2FyZS4gTm90IGludm9raW5nIHRoaXMKKyAgICAgKiBtZXRob2QgcHJvcGVybHkgY2FuIHJlc3VsdCBpbiBtZW1vcnkgbGVha3MuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgaWYgKG1SZW5kZXJlciAhPSAwKSB7CisgICAgICAgICAgICBuRGVzdHJveVJlbmRlcmVyKG1SZW5kZXJlcik7CisgICAgICAgICAgICBtUmVuZGVyZXIgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRGVzdHJveVJlbmRlcmVyKGludCByZW5kZXJlcik7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBDYW52YXMgbWFuYWdlbWVudAorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Qml0bWFwKEJpdG1hcCBiaXRtYXApIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNPcGFxdWUoKSB7CisgICAgICAgIHJldHVybiBtT3BhcXVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7CisgICAgICAgIHJldHVybiBtV2lkdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRIZWlnaHQoKSB7CisgICAgICAgIHJldHVybiBtSGVpZ2h0OworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFNldHVwCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRWaWV3cG9ydChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgbVdpZHRoID0gd2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisKKyAgICAgICAgblNldFZpZXdwb3J0KG1SZW5kZXJlciwgd2lkdGgsIGhlaWdodCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblNldFZpZXdwb3J0KGludCByZW5kZXJlciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworICAgIHZvaWQgb25QcmVEcmF3KCkgeworICAgICAgICBuUHJlcGFyZShtUmVuZGVyZXIpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5QcmVwYXJlKGludCByZW5kZXJlcik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBhY3F1aXJlQ29udGV4dCgpIHsKKyAgICAgICAgaWYgKCFtQ29udGV4dExvY2tlZCkgeworICAgICAgICAgICAgbkFjcXVpcmVDb250ZXh0KG1SZW5kZXJlcik7CisgICAgICAgICAgICBtQ29udGV4dExvY2tlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Db250ZXh0TG9ja2VkOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkFjcXVpcmVDb250ZXh0KGludCByZW5kZXJlcik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlQ29udGV4dCgpIHsKKyAgICAgICAgaWYgKG1Db250ZXh0TG9ja2VkKSB7CisgICAgICAgICAgICBuUmVsZWFzZUNvbnRleHQobVJlbmRlcmVyKTsKKyAgICAgICAgICAgIG1Db250ZXh0TG9ja2VkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5SZWxlYXNlQ29udGV4dChpbnQgcmVuZGVyZXIpOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ2xpcHBpbmcKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBQYXRoKFBhdGggcGF0aCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUGF0aChQYXRoIHBhdGgsIFJlZ2lvbi5PcCBvcCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgUmVnaW9uLk9wLklOVEVSU0VDVC5uYXRpdmVJbnQpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5DbGlwUmVjdChpbnQgcmVuZGVyZXIsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwKKyAgICAgICAgICAgIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBvcCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIFJlZ2lvbi5PcCBvcCkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBvcC5uYXRpdmVJbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgUmVnaW9uLk9wLklOVEVSU0VDVC5uYXRpdmVJbnQpOyAgICAgICAgCisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbkNsaXBSZWN0KGludCByZW5kZXJlciwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSwgaW50IG9wKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KFJlY3QgcmVjdCkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sCisgICAgICAgICAgICAgICAgUmVnaW9uLk9wLklOVEVSU0VDVC5uYXRpdmVJbnQpOyAgICAgICAgCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoUmVjdCByZWN0LCBSZWdpb24uT3Agb3ApIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCBvcC5uYXRpdmVJbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KFJlY3RGIHJlY3QpIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLAorICAgICAgICAgICAgICAgIFJlZ2lvbi5PcC5JTlRFUlNFQ1QubmF0aXZlSW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChSZWN0RiByZWN0LCBSZWdpb24uT3Agb3ApIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCBvcC5uYXRpdmVJbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWdpb24oUmVnaW9uIHJlZ2lvbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVnaW9uKFJlZ2lvbiByZWdpb24sIFJlZ2lvbi5PcCBvcCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDbGlwQm91bmRzKFJlY3QgYm91bmRzKSB7CisgICAgICAgIHJldHVybiBuR2V0Q2xpcEJvdW5kcyhtUmVuZGVyZXIsIGJvdW5kcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuR2V0Q2xpcEJvdW5kcyhpbnQgcmVuZGVyZXIsIFJlY3QgYm91bmRzKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHF1aWNrUmVqZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgRWRnZVR5cGUgdHlwZSkgeworICAgICAgICByZXR1cm4gblF1aWNrUmVqZWN0KG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCB0eXBlLm5hdGl2ZUludCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gblF1aWNrUmVqZWN0KGludCByZW5kZXJlciwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLAorICAgICAgICAgICAgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IGVkZ2UpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcXVpY2tSZWplY3QoUGF0aCBwYXRoLCBFZGdlVHlwZSB0eXBlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHF1aWNrUmVqZWN0KFJlY3RGIHJlY3QsIEVkZ2VUeXBlIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHF1aWNrUmVqZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCB0eXBlKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBUcmFuc2Zvcm1hdGlvbnMKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRyYW5zbGF0ZShmbG9hdCBkeCwgZmxvYXQgZHkpIHsKKyAgICAgICAgblRyYW5zbGF0ZShtUmVuZGVyZXIsIGR4LCBkeSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblRyYW5zbGF0ZShpbnQgcmVuZGVyZXIsIGZsb2F0IGR4LCBmbG9hdCBkeSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBza2V3KGZsb2F0IHN4LCBmbG9hdCBzeSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByb3RhdGUoZmxvYXQgZGVncmVlcykgeworICAgICAgICBuUm90YXRlKG1SZW5kZXJlciwgZGVncmVlcyk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblJvdGF0ZShpbnQgcmVuZGVyZXIsIGZsb2F0IGRlZ3JlZXMpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5KSB7CisgICAgICAgIG5TY2FsZShtUmVuZGVyZXIsIHN4LCBzeSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblNjYWxlKGludCByZW5kZXJlciwgZmxvYXQgc3gsIGZsb2F0IHN5KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1hdHJpeChNYXRyaXggbWF0cml4KSB7CisgICAgICAgIG5TZXRNYXRyaXgobVJlbmRlcmVyLCBtYXRyaXgubmF0aXZlX2luc3RhbmNlKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0TWF0cml4KGludCByZW5kZXJlciwgaW50IG1hdHJpeCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBnZXRNYXRyaXgoTWF0cml4IG1hdHJpeCkgeworICAgICAgICBuR2V0TWF0cml4KG1SZW5kZXJlciwgbWF0cml4Lm5hdGl2ZV9pbnN0YW5jZSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkdldE1hdHJpeChpbnQgcmVuZGVyZXIsIGludCBtYXRyaXgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29uY2F0KE1hdHJpeCBtYXRyaXgpIHsKKyAgICAgICAgbkNvbmNhdE1hdHJpeChtUmVuZGVyZXIsIG1hdHJpeC5uYXRpdmVfaW5zdGFuY2UpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5Db25jYXRNYXRyaXgoaW50IHJlbmRlcmVyLCBpbnQgbWF0cml4KTsKKyAgICAKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBTdGF0ZSBtYW5hZ2VtZW50CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmUoKSB7CisgICAgICAgIHJldHVybiBuU2F2ZShtUmVuZGVyZXIsIDApOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmUoaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gblNhdmUobVJlbmRlcmVyLCBzYXZlRmxhZ3MpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIGludCBuU2F2ZShpbnQgcmVuZGVyZXIsIGludCBmbGFncyk7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzYXZlTGF5ZXIoUmVjdEYgYm91bmRzLCBQYWludCBwYWludCwgaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gc2F2ZUxheWVyKGJvdW5kcy5sZWZ0LCBib3VuZHMudG9wLCBib3VuZHMucmlnaHQsIGJvdW5kcy5ib3R0b20sIHBhaW50LCBzYXZlRmxhZ3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2F2ZUxheWVyKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgUGFpbnQgcGFpbnQsCisgICAgICAgICAgICBpbnQgc2F2ZUZsYWdzKSB7CisgICAgICAgIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OworICAgICAgICByZXR1cm4gblNhdmVMYXllcihtUmVuZGVyZXIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgbmF0aXZlUGFpbnQsIHNhdmVGbGFncyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5TYXZlTGF5ZXIoaW50IHJlbmRlcmVyLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBpbnQgcGFpbnQsIGludCBzYXZlRmxhZ3MpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzYXZlTGF5ZXJBbHBoYShSZWN0RiBib3VuZHMsIGludCBhbHBoYSwgaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gc2F2ZUxheWVyQWxwaGEoYm91bmRzLmxlZnQsIGJvdW5kcy50b3AsIGJvdW5kcy5yaWdodCwgYm91bmRzLmJvdHRvbSwKKyAgICAgICAgICAgICAgICBhbHBoYSwgc2F2ZUZsYWdzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmVMYXllckFscGhhKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IGFscGhhLAorICAgICAgICAgICAgaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gblNhdmVMYXllckFscGhhKG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBhbHBoYSwgc2F2ZUZsYWdzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgblNhdmVMYXllckFscGhhKGludCByZW5kZXJlciwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwKKyAgICAgICAgICAgIGZsb2F0IGJvdHRvbSwgaW50IGFscGhhLCBpbnQgc2F2ZUZsYWdzKTsKKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXN0b3JlKCkgeworICAgICAgICBuUmVzdG9yZShtUmVuZGVyZXIpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5SZXN0b3JlKGludCByZW5kZXJlcik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXN0b3JlVG9Db3VudChpbnQgc2F2ZUNvdW50KSB7CisgICAgICAgIG5SZXN0b3JlVG9Db3VudChtUmVuZGVyZXIsIHNhdmVDb3VudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUmVzdG9yZVRvQ291bnQoaW50IHJlbmRlcmVyLCBpbnQgc2F2ZUNvdW50KTsKKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFNhdmVDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG5HZXRTYXZlQ291bnQobVJlbmRlcmVyKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5HZXRTYXZlQ291bnQoaW50IHJlbmRlcmVyKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEZpbHRlcmluZworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RHJhd0ZpbHRlcihEcmF3RmlsdGVyIGZpbHRlcikgeworICAgICAgICBtRmlsdGVyID0gZmlsdGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEcmF3RmlsdGVyIGdldERyYXdGaWx0ZXIoKSB7CisgICAgICAgIHJldHVybiBtRmlsdGVyOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIERyYXdpbmcKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdBcmMoUmVjdEYgb3ZhbCwgZmxvYXQgc3RhcnRBbmdsZSwgZmxvYXQgc3dlZXBBbmdsZSwgYm9vbGVhbiB1c2VDZW50ZXIsCisgICAgICAgICAgICBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3QVJHQihpbnQgYSwgaW50IHIsIGludCBnLCBpbnQgYikgeworICAgICAgICBkcmF3Q29sb3IoKGEgJiAweEZGKSA8PCAyNCB8IChyICYgMHhGRikgPDwgMTYgfCAoZyAmIDB4RkYpIDw8IDggfCAoYiAmIDB4RkYpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGF0Y2goQml0bWFwIGJpdG1hcCwgYnl0ZVtdIGNodW5rcywgUmVjdEYgZHN0LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBTaGFkZXJzIGFyZSBpZ25vcmVkIHdoZW4gZHJhd2luZyBwYXRjaGVzCisgICAgICAgIGJvb2xlYW4gaGFzQ29sb3JGaWx0ZXIgPSBwYWludCAhPSBudWxsICYmIHNldHVwQ29sb3JGaWx0ZXIocGFpbnQpOworICAgICAgICBmaW5hbCBpbnQgbmF0aXZlUGFpbnQgPSBwYWludCA9PSBudWxsID8gMCA6IHBhaW50Lm1OYXRpdmVQYWludDsKKyAgICAgICAgbkRyYXdQYXRjaChtUmVuZGVyZXIsIGJpdG1hcC5tTmF0aXZlQml0bWFwLCBjaHVua3MsIGRzdC5sZWZ0LCBkc3QudG9wLAorICAgICAgICAgICAgICAgIGRzdC5yaWdodCwgZHN0LmJvdHRvbSwgbmF0aXZlUGFpbnQpOworICAgICAgICBpZiAoaGFzQ29sb3JGaWx0ZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdQYXRjaChpbnQgcmVuZGVyZXIsIGludCBiaXRtYXAsIGJ5dGVbXSBjaHVua3MsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwKKyAgICAgICAgICAgIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gU2hhZGVycyBhcmUgaWdub3JlZCB3aGVuIGRyYXdpbmcgYml0bWFwcworICAgICAgICBib29sZWFuIGhhc0NvbG9yRmlsdGVyID0gcGFpbnQgIT0gbnVsbCAmJiBzZXR1cENvbG9yRmlsdGVyKHBhaW50KTsKKyAgICAgICAgZmluYWwgaW50IG5hdGl2ZVBhaW50ID0gcGFpbnQgPT0gbnVsbCA/IDAgOiBwYWludC5tTmF0aXZlUGFpbnQ7CisgICAgICAgIG5EcmF3Qml0bWFwKG1SZW5kZXJlciwgYml0bWFwLm1OYXRpdmVCaXRtYXAsIGxlZnQsIHRvcCwgbmF0aXZlUGFpbnQpOworICAgICAgICBpZiAoaGFzQ29sb3JGaWx0ZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdCaXRtYXAoaW50IHJlbmRlcmVyLCBpbnQgYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIE1hdHJpeCBtYXRyaXgsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFNoYWRlcnMgYXJlIGlnbm9yZWQgd2hlbiBkcmF3aW5nIGJpdG1hcHMKKyAgICAgICAgYm9vbGVhbiBoYXNDb2xvckZpbHRlciA9IHBhaW50ICE9IG51bGwgJiYgc2V0dXBDb2xvckZpbHRlcihwYWludCk7CisgICAgICAgIGZpbmFsIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OworICAgICAgICBuRHJhd0JpdG1hcChtUmVuZGVyZXIsIGJpdG1hcC5tTmF0aXZlQml0bWFwLCBtYXRyaXgubmF0aXZlX2luc3RhbmNlLCBuYXRpdmVQYWludCk7CisgICAgICAgIGlmIChoYXNDb2xvckZpbHRlcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd0JpdG1hcChpbnQgcmVuZGVyZXIsIGludCBiaXRtYXAsIGludCBtYXRyaXgsIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIFJlY3Qgc3JjLCBSZWN0IGRzdCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gU2hhZGVycyBhcmUgaWdub3JlZCB3aGVuIGRyYXdpbmcgYml0bWFwcworICAgICAgICBib29sZWFuIGhhc0NvbG9yRmlsdGVyID0gcGFpbnQgIT0gbnVsbCAmJiBzZXR1cENvbG9yRmlsdGVyKHBhaW50KTsKKyAgICAgICAgZmluYWwgaW50IG5hdGl2ZVBhaW50ID0gcGFpbnQgPT0gbnVsbCA/IDAgOiBwYWludC5tTmF0aXZlUGFpbnQ7CisKKyAgICAgICAgaW50IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKKyAgICAgICAgaWYgKHNyYyA9PSBudWxsKSB7CisgICAgICAgICAgICBsZWZ0ID0gdG9wID0gMDsKKyAgICAgICAgICAgIHJpZ2h0ID0gYml0bWFwLmdldFdpZHRoKCk7CisgICAgICAgICAgICBib3R0b20gPSBiaXRtYXAuZ2V0SGVpZ2h0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZWZ0ID0gc3JjLmxlZnQ7CisgICAgICAgICAgICByaWdodCA9IHNyYy5yaWdodDsKKyAgICAgICAgICAgIHRvcCA9IHNyYy50b3A7CisgICAgICAgICAgICBib3R0b20gPSBzcmMuYm90dG9tOworICAgICAgICB9CisKKyAgICAgICAgbkRyYXdCaXRtYXAobVJlbmRlcmVyLCBiaXRtYXAubU5hdGl2ZUJpdG1hcCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLAorICAgICAgICAgICAgICAgIGRzdC5sZWZ0LCBkc3QudG9wLCBkc3QucmlnaHQsIGRzdC5ib3R0b20sIG5hdGl2ZVBhaW50KTsKKyAgICAgICAgaWYgKGhhc0NvbG9yRmlsdGVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIFJlY3Qgc3JjLCBSZWN0RiBkc3QsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFNoYWRlcnMgYXJlIGlnbm9yZWQgd2hlbiBkcmF3aW5nIGJpdG1hcHMKKyAgICAgICAgYm9vbGVhbiBoYXNDb2xvckZpbHRlciA9IHBhaW50ICE9IG51bGwgJiYgc2V0dXBDb2xvckZpbHRlcihwYWludCk7CisgICAgICAgIGZpbmFsIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OworICAgICAgICBuRHJhd0JpdG1hcChtUmVuZGVyZXIsIGJpdG1hcC5tTmF0aXZlQml0bWFwLCBzcmMubGVmdCwgc3JjLnRvcCwgc3JjLnJpZ2h0LCBzcmMuYm90dG9tLAorICAgICAgICAgICAgICAgIGRzdC5sZWZ0LCBkc3QudG9wLCBkc3QucmlnaHQsIGRzdC5ib3R0b20sIG5hdGl2ZVBhaW50KTsKKyAgICAgICAgaWYgKGhhc0NvbG9yRmlsdGVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3Qml0bWFwKGludCByZW5kZXJlciwgaW50IGJpdG1hcCwKKyAgICAgICAgICAgIGZsb2F0IHNyY0xlZnQsIGZsb2F0IHNyY1RvcCwgZmxvYXQgc3JjUmlnaHQsIGZsb2F0IHNyY0JvdHRvbSwKKyAgICAgICAgICAgIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IHBhaW50KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdCaXRtYXAoaW50W10gY29sb3JzLCBpbnQgb2Zmc2V0LCBpbnQgc3RyaWRlLCBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sZWFuIGhhc0FscGhhLCBQYWludCBwYWludCkgeworICAgICAgICAvLyBTaGFkZXJzIGFyZSBpZ25vcmVkIHdoZW4gZHJhd2luZyBiaXRtYXBzCisgICAgICAgIGJvb2xlYW4gaGFzQ29sb3JGaWx0ZXIgPSBwYWludCAhPSBudWxsICYmIHNldHVwQ29sb3JGaWx0ZXIocGFpbnQpOworICAgICAgICBmaW5hbCBCaXRtYXAuQ29uZmlnIGNvbmZpZyA9IGhhc0FscGhhID8gQml0bWFwLkNvbmZpZy5BUkdCXzg4ODggOiBCaXRtYXAuQ29uZmlnLlJHQl81NjU7CisgICAgICAgIGZpbmFsIEJpdG1hcCBiID0gQml0bWFwLmNyZWF0ZUJpdG1hcChjb2xvcnMsIG9mZnNldCwgc3RyaWRlLCB3aWR0aCwgaGVpZ2h0LCBjb25maWcpOworICAgICAgICBmaW5hbCBpbnQgbmF0aXZlUGFpbnQgPSBwYWludCA9PSBudWxsID8gMCA6IHBhaW50Lm1OYXRpdmVQYWludDsKKyAgICAgICAgbkRyYXdCaXRtYXAobVJlbmRlcmVyLCBiLm1OYXRpdmVCaXRtYXAsIHgsIHksIG5hdGl2ZVBhaW50KTsKKyAgICAgICAgYi5yZWN5Y2xlKCk7CisgICAgICAgIGlmIChoYXNDb2xvckZpbHRlcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChpbnRbXSBjb2xvcnMsIGludCBvZmZzZXQsIGludCBzdHJpZGUsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiBoYXNBbHBoYSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gU2hhZGVycyBhcmUgaWdub3JlZCB3aGVuIGRyYXdpbmcgYml0bWFwcworICAgICAgICBkcmF3Qml0bWFwKGNvbG9ycywgb2Zmc2V0LCBzdHJpZGUsIChmbG9hdCkgeCwgKGZsb2F0KSB5LCB3aWR0aCwgaGVpZ2h0LCBoYXNBbHBoYSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdCaXRtYXBNZXNoKEJpdG1hcCBiaXRtYXAsIGludCBtZXNoV2lkdGgsIGludCBtZXNoSGVpZ2h0LCBmbG9hdFtdIHZlcnRzLAorICAgICAgICAgICAgaW50IHZlcnRPZmZzZXQsIGludFtdIGNvbG9ycywgaW50IGNvbG9yT2Zmc2V0LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Q2lyY2xlKGZsb2F0IGN4LCBmbG9hdCBjeSwgZmxvYXQgcmFkaXVzLCBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Q29sb3IoaW50IGNvbG9yKSB7CisgICAgICAgIGRyYXdDb2xvcihjb2xvciwgUG9ydGVyRHVmZi5Nb2RlLlNSQ19PVkVSKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Q29sb3IoaW50IGNvbG9yLCBQb3J0ZXJEdWZmLk1vZGUgbW9kZSkgeworICAgICAgICBuRHJhd0NvbG9yKG1SZW5kZXJlciwgY29sb3IsIG1vZGUubmF0aXZlSW50KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd0NvbG9yKGludCByZW5kZXJlciwgaW50IGNvbG9yLCBpbnQgbW9kZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3TGluZShmbG9hdCBzdGFydFgsIGZsb2F0IHN0YXJ0WSwgZmxvYXQgc3RvcFgsIGZsb2F0IHN0b3BZLCBQYWludCBwYWludCkgeworICAgICAgICBtTGluZVswXSA9IHN0YXJ0WDsKKyAgICAgICAgbUxpbmVbMV0gPSBzdGFydFk7CisgICAgICAgIG1MaW5lWzJdID0gc3RvcFg7CisgICAgICAgIG1MaW5lWzNdID0gc3RvcFk7CisgICAgICAgIGRyYXdMaW5lcyhtTGluZSwgMCwgMSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdMaW5lcyhmbG9hdFtdIHB0cywgaW50IG9mZnNldCwgaW50IGNvdW50LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3TGluZXMoZmxvYXRbXSBwdHMsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGRyYXdMaW5lcyhwdHMsIDAsIHB0cy5sZW5ndGggLyA0LCBwYWludCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd092YWwoUmVjdEYgb3ZhbCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BhaW50KFBhaW50IHBhaW50KSB7CisgICAgICAgIGZpbmFsIFJlY3QgciA9IG1DbGlwQm91bmRzOworICAgICAgICBuR2V0Q2xpcEJvdW5kcyhtUmVuZGVyZXIsIHIpOworICAgICAgICBkcmF3UmVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQYXRoKFBhdGggcGF0aCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgaWYgKHBhdGguaXNTaW1wbGVQYXRoKSB7CisgICAgICAgICAgICBpZiAocGF0aC5yZWN0cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbkRyYXdSZWN0cyhtUmVuZGVyZXIsIHBhdGgucmVjdHMubU5hdGl2ZVJlZ2lvbiwgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5EcmF3UGF0aChtUmVuZGVyZXIsIHBhdGgubU5hdGl2ZVBhdGgsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhc01vZGlmaWVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3UGF0aChpbnQgcmVuZGVyZXIsIGludCBwYXRoLCBpbnQgcGFpbnQpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdSZWN0cyhpbnQgcmVuZGVyZXIsIGludCByZWdpb24sIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGljdHVyZShQaWN0dXJlIHBpY3R1cmUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BpY3R1cmUoUGljdHVyZSBwaWN0dXJlLCBSZWN0IGRzdCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGljdHVyZShQaWN0dXJlIHBpY3R1cmUsIFJlY3RGIGRzdCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9pbnQoZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgbVBvaW50WzBdID0geDsKKyAgICAgICAgbVBvaW50WzFdID0geTsKKyAgICAgICAgZHJhd1BvaW50cyhtUG9pbnQsIDAsIDEsIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9pbnRzKGZsb2F0W10gcHRzLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQb2ludHMoZmxvYXRbXSBwdHMsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGRyYXdQb2ludHMocHRzLCAwLCBwdHMubGVuZ3RoIC8gMiwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQb3NUZXh0KGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgZmxvYXRbXSBwb3MsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQb3NUZXh0KFN0cmluZyB0ZXh0LCBmbG9hdFtdIHBvcywgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1JlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBQYWludCBwYWludCkgeworICAgICAgICBib29sZWFuIGhhc01vZGlmaWVyID0gc2V0dXBNb2RpZmllcnMocGFpbnQpOworICAgICAgICBuRHJhd1JlY3QobVJlbmRlcmVyLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1JlY3QoaW50IHJlbmRlcmVyLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1JlY3QoUmVjdCByLCBQYWludCBwYWludCkgeworICAgICAgICBkcmF3UmVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSZWN0KFJlY3RGIHIsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGRyYXdSZWN0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tLCBwYWludCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1JHQihpbnQgciwgaW50IGcsIGludCBiKSB7CisgICAgICAgIGRyYXdDb2xvcigweEZGMDAwMDAwIHwgKHIgJiAweEZGKSA8PCAxNiB8IChnICYgMHhGRikgPDwgOCB8IChiICYgMHhGRikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSb3VuZFJlY3QoUmVjdEYgcmVjdCwgZmxvYXQgcngsIGZsb2F0IHJ5LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0IHgsIGZsb2F0IHksIFBhaW50IHBhaW50KSB7CisgICAgICAgIGlmICgoaW5kZXggfCBjb3VudCB8IChpbmRleCArIGNvdW50KSB8ICh0ZXh0Lmxlbmd0aCAtIGluZGV4IC0gY291bnQpKSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGhhc01vZGlmaWVyID0gc2V0dXBNb2RpZmllcnMocGFpbnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbkRyYXdUZXh0KG1SZW5kZXJlciwgdGV4dCwgaW5kZXgsIGNvdW50LCB4LCB5LCBwYWludC5tQmlkaUZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGhhc01vZGlmaWVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3VGV4dChpbnQgcmVuZGVyZXIsIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgIGludCBiaWRpRmxhZ3MsIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICBib29sZWFuIGhhc01vZGlmaWVyID0gc2V0dXBNb2RpZmllcnMocGFpbnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWRTdHJpbmcgfHwKKyAgICAgICAgICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgeworICAgICAgICAgICAgICAgIG5EcmF3VGV4dChtUmVuZGVyZXIsIHRleHQudG9TdHJpbmcoKSwgc3RhcnQsIGVuZCwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAoKEdyYXBoaWNzT3BlcmF0aW9ucykgdGV4dCkuZHJhd1RleHQodGhpcywgc3RhcnQsIGVuZCwgeCwgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oZW5kIC0gc3RhcnQpOworICAgICAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOworICAgICAgICAgICAgICAgIG5EcmF3VGV4dChtUmVuZGVyZXIsIGJ1ZiwgMCwgZW5kIC0gc3RhcnQsIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICBpZiAoKHN0YXJ0IHwgZW5kIHwgKGVuZCAtIHN0YXJ0KSB8ICh0ZXh0Lmxlbmd0aCgpIC0gZW5kKSkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5EcmF3VGV4dChtUmVuZGVyZXIsIHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1RleHQoaW50IHJlbmRlcmVyLCBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgaW50IGJpZGlGbGFncywgaW50IHBhaW50KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0KFN0cmluZyB0ZXh0LCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICBib29sZWFuIGhhc01vZGlmaWVyID0gc2V0dXBNb2RpZmllcnMocGFpbnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbkRyYXdUZXh0KG1SZW5kZXJlciwgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dE9uUGF0aChjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIFBhdGggcGF0aCwgZmxvYXQgaE9mZnNldCwKKyAgICAgICAgICAgIGZsb2F0IHZPZmZzZXQsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0T25QYXRoKFN0cmluZyB0ZXh0LCBQYXRoIHBhdGgsIGZsb2F0IGhPZmZzZXQsIGZsb2F0IHZPZmZzZXQsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0UnVuKGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgaW50IGNvbnRleHRJbmRleCwgaW50IGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGlmICgoaW5kZXggfCBjb3VudCB8IHRleHQubGVuZ3RoIC0gaW5kZXggLSBjb3VudCkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChkaXIgIT0gRElSRUNUSU9OX0xUUiAmJiBkaXIgIT0gRElSRUNUSU9OX1JUTCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBkaXJlY3Rpb246ICIgKyBkaXIpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5EcmF3VGV4dFJ1bihtUmVuZGVyZXIsIHRleHQsIGluZGV4LCBjb3VudCwgY29udGV4dEluZGV4LCBjb250ZXh0Q291bnQsIHgsIHksIGRpciwKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3VGV4dFJ1bihpbnQgcmVuZGVyZXIsIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwKKyAgICAgICAgICAgIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsIGludCBuYXRpdmVQYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGlmICgoc3RhcnQgfCBlbmQgfCBlbmQgLSBzdGFydCB8IHRleHQubGVuZ3RoKCkgLSBlbmQpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaGFzTW9kaWZpZXIgPSBzZXR1cE1vZGlmaWVycyhwYWludCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgZmxhZ3MgPSBkaXIgPT0gMCA/IDAgOiAxOworICAgICAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWRTdHJpbmcgfHwKKyAgICAgICAgICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgeworICAgICAgICAgICAgICAgIG5EcmF3VGV4dFJ1bihtUmVuZGVyZXIsIHRleHQudG9TdHJpbmcoKSwgc3RhcnQsIGVuZCwgY29udGV4dFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dEVuZCwgeCwgeSwgZmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAoKEdyYXBoaWNzT3BlcmF0aW9ucykgdGV4dCkuZHJhd1RleHRSdW4odGhpcywgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgeCwgeSwgZmxhZ3MsIHBhaW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICAgICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgICAgICAgICBjaGFyW10gYnVmID0gVGVtcG9yYXJ5QnVmZmVyLm9idGFpbihjb250ZXh0TGVuKTsKKyAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOworICAgICAgICAgICAgICAgIG5EcmF3VGV4dFJ1bihtUmVuZGVyZXIsIGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwgMCwgY29udGV4dExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIGZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgICAgIFRlbXBvcmFyeUJ1ZmZlci5yZWN5Y2xlKGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1RleHRSdW4oaW50IHJlbmRlcmVyLCBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgaW50IG5hdGl2ZVBhaW50KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdWZXJ0aWNlcyhWZXJ0ZXhNb2RlIG1vZGUsIGludCB2ZXJ0ZXhDb3VudCwgZmxvYXRbXSB2ZXJ0cywgaW50IHZlcnRPZmZzZXQsCisgICAgICAgICAgICBmbG9hdFtdIHRleHMsIGludCB0ZXhPZmZzZXQsIGludFtdIGNvbG9ycywgaW50IGNvbG9yT2Zmc2V0LCBzaG9ydFtdIGluZGljZXMsCisgICAgICAgICAgICBpbnQgaW5kZXhPZmZzZXQsIGludCBpbmRleENvdW50LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2V0dXBNb2RpZmllcnMoUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IGZhbHNlOworCisgICAgICAgIGlmIChwYWludC5oYXNTaGFkb3cpIHsKKyAgICAgICAgICAgIG5TZXR1cFNoYWRvdyhtUmVuZGVyZXIsIHBhaW50LnNoYWRvd1JhZGl1cywgcGFpbnQuc2hhZG93RHgsIHBhaW50LnNoYWRvd0R5LAorICAgICAgICAgICAgICAgICAgICBwYWludC5zaGFkb3dDb2xvcik7CisgICAgICAgICAgICBoYXNNb2RpZmllciA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTaGFkZXIgc2hhZGVyID0gcGFpbnQuZ2V0U2hhZGVyKCk7CisgICAgICAgIGlmIChzaGFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgblNldHVwU2hhZGVyKG1SZW5kZXJlciwgc2hhZGVyLm5hdGl2ZV9zaGFkZXIpOworICAgICAgICAgICAgaGFzTW9kaWZpZXIgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ29sb3JGaWx0ZXIgZmlsdGVyID0gcGFpbnQuZ2V0Q29sb3JGaWx0ZXIoKTsKKyAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBuU2V0dXBDb2xvckZpbHRlcihtUmVuZGVyZXIsIGZpbHRlci5uYXRpdmVDb2xvckZpbHRlcik7CisgICAgICAgICAgICBoYXNNb2RpZmllciA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaGFzTW9kaWZpZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNldHVwQ29sb3JGaWx0ZXIoUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgZmluYWwgQ29sb3JGaWx0ZXIgZmlsdGVyID0gcGFpbnQuZ2V0Q29sb3JGaWx0ZXIoKTsKKyAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBuU2V0dXBDb2xvckZpbHRlcihtUmVuZGVyZXIsIGZpbHRlci5uYXRpdmVDb2xvckZpbHRlcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0dXBTaGFkZXIoaW50IHJlbmRlcmVyLCBpbnQgc2hhZGVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5TZXR1cENvbG9yRmlsdGVyKGludCByZW5kZXJlciwgaW50IGNvbG9yRmlsdGVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5TZXR1cFNoYWRvdyhpbnQgcmVuZGVyZXIsIGZsb2F0IHJhZGl1cywgZmxvYXQgZHgsIGZsb2F0IGR5LCBpbnQgY29sb3IpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUmVzZXRNb2RpZmllcnMoaW50IHJlbmRlcmVyKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9IYXJkd2FyZVJlbmRlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlMzY0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsNTY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIGFuZHJvaWQudmlldzsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTE7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIHJlbmRlcmluZyBhIFZpZXdSb290IHVzaW5nIGhhcmR3YXJlIGFjY2VsZXJhdGlvbi4KKyAqIAorICogQGhpZGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEhhcmR3YXJlUmVuZGVyZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkhhcmR3YXJlUmVuZGVyZXIiOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVxdWVzdGVkID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBhdmFpbGFibGUgdW5kZXIgYW55IGZvcm0gZm9yCisgICAgICogdGhlIHZpZXcgaGllcmFyY2h5LgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdmlldyBoaWVyYXJjaHkgY2FuIHBvdGVudGlhbGx5IGJlIGhhcmR3YXJlIGFjY2VsZXJhdGVkLAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXZhaWxhYmxlKCkgeworICAgICAgICByZXR1cm4gR0xFUzIwQ2FudmFzLmlzQXZhaWxhYmxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIGhhcmR3YXJlIHJlbmRlcmluZyBjb250ZXh0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBmdWxsIElmIHRydWUsIGRlc3Ryb3lzIGFsbCBhc3NvY2lhdGVkIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCB2b2lkIGRlc3Ryb3koYm9vbGVhbiBmdWxsKTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBoYXJkd2FyZSByZW5kZXJlciBmb3IgdGhlIHNwZWNpZmllZCBzdXJmYWNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBob2xkZXIgVGhlIGhvbGRlciBmb3IgdGhlIHN1cmZhY2UgdG8gaGFyZHdhcmUgYWNjZWxlcmF0ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYWJzdHJhY3QgYm9vbGVhbiBpbml0aWFsaXplKFN1cmZhY2VIb2xkZXIgaG9sZGVyKTsKKworICAgIC8qKgorICAgICAqIFNldHVwIHRoZSBoYXJkd2FyZSByZW5kZXJlciBmb3IgZHJhd2luZy4gVGhpcyBpcyBjYWxsZWQgZm9yIGV2ZXJ5CisgICAgICogZnJhbWUgdG8gZHJhdy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGggV2lkdGggb2YgdGhlIGRyYXdpbmcgc3VyZmFjZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0IEhlaWdodCBvZiB0aGUgZHJhd2luZyBzdXJmYWNlLgorICAgICAqLworICAgIGFic3RyYWN0IHZvaWQgc2V0dXAoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworICAgIC8qKgorICAgICAqIERyYXdzIHRoZSBzcGVjaWZpZWQgdmlldy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0byBkcmF3LgorICAgICAqIEBwYXJhbSBhdHRhY2hJbmZvIEF0dGFjaEluZm8gdGllZCB0byB0aGUgc3BlY2lmaWVkIHZpZXcuCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCBkcmF3KFZpZXcgdmlldywgVmlldy5BdHRhY2hJbmZvIGF0dGFjaEluZm8sIGludCB5T2Zmc2V0KTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBoYXJkd2FyZSByZW5kZXJlciBmb3IgdGhlIHNwZWNpZmllZCBzdXJmYWNlIGFuZCBzZXR1cCB0aGUKKyAgICAgKiByZW5kZXJlciBmb3IgZHJhd2luZywgaWYgbmVlZGVkLiBUaGlzIGlzIGludm9rZWQgd2hlbiB0aGUgVmlld1Jvb3QgaGFzCisgICAgICogcG90ZW50aWFsbHkgbG9zdCB0aGUgaGFyZHdhcmUgcmVuZGVyZXIuIFRoZSBoYXJkd2FyZSByZW5kZXJlciBzaG91bGQgYmUKKyAgICAgKiByZWluaXRpYWxpemVkIGFuZCBzZXR1cCB3aGVuIHRoZSByZW5kZXIge0BsaW5rICNpc1JlcXVlc3RlZCgpfSBhbmQKKyAgICAgKiB7QGxpbmsgI2lzRW5hYmxlZCgpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSBkcmF3aW5nIHN1cmZhY2UuCisgICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBkcmF3aW5nIHN1cmZhY2UuCisgICAgICogQHBhcmFtIGF0dGFjaEluZm8gVGhlIAorICAgICAqIEBwYXJhbSBob2xkZXIKKyAgICAgKi8KKyAgICB2b2lkIGluaXRpYWxpemVJZk5lZWRlZChpbnQgd2lkdGgsIGludCBoZWlnaHQsIFZpZXcuQXR0YWNoSW5mbyBhdHRhY2hJbmZvLAorICAgICAgICAgICAgU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKKyAgICAgICAgaWYgKGlzUmVxdWVzdGVkKCkpIHsKKyAgICAgICAgICAgIC8vIFdlIGxvc3QgdGhlIGdsIGNvbnRleHQsIHNvIHJlY3JlYXRlIGl0LgorICAgICAgICAgICAgaWYgKCFpc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGlmIChpbml0aWFsaXplKGhvbGRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0dXAod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgaGFyZHdhcmUgcmVuZGVyZXIgdXNpbmcgT3BlbkdMLgorICAgICAqIAorICAgICAqIEBwYXJhbSBnbFZlcnNpb24gVGhlIHZlcnNpb24gb2YgT3BlbkdMIHRvIHVzZSAoMSBmb3IgT3BlbkdMIDEsIDExIGZvciBPcGVuR0wgMS4xLCBldGMuKQorICAgICAqIEBwYXJhbSB0cmFuc2x1Y2VudCBUcnVlIGlmIHRoZSBzdXJmYWNlIGlzIHRyYW5zbHVjZW50LCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEEgaGFyZHdhcmUgcmVuZGVyZXIgYmFja2VkIGJ5IE9wZW5HTC4KKyAgICAgKi8KKyAgICBzdGF0aWMgSGFyZHdhcmVSZW5kZXJlciBjcmVhdGVHbFJlbmRlcmVyKGludCBnbFZlcnNpb24sIGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKKyAgICAgICAgc3dpdGNoIChnbFZlcnNpb24pIHsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gR2wyMFJlbmRlcmVyLmNyZWF0ZSh0cmFuc2x1Y2VudCk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBHTCB2ZXJzaW9uOiAiICsgZ2xWZXJzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaXMgY3VycmVudGx5IGVuYWJsZWQuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBpbiB1c2UsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1FbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBjdXJyZW50bHkgZW5hYmxlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCBUcnVlIGlmIHRoZSBoYXJkd2FyZSByZW5kZXJlciBpcyBpbiB1c2UsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1FbmFibGVkID0gZW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaXMgY3VycmVudGx5IHJlcXVlc3QgYnV0IG5vdAorICAgICAqIG5lY2Vzc2FyaWx5IGVuYWJsZWQgeWV0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiByZXF1ZXN0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzUmVxdWVzdGVkKCkgeworICAgICAgICByZXR1cm4gbVJlcXVlc3RlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaXMgY3VycmVudGx5IHJlcXVlc3QgYnV0IG5vdAorICAgICAqIG5lY2Vzc2FyaWx5IGVuYWJsZWQgeWV0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSB0byByZXF1ZXN0IGhhcmR3YXJlIGFjY2VsZXJhdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZvaWQgc2V0UmVxdWVzdGVkKGJvb2xlYW4gcmVxdWVzdGVkKSB7CisgICAgICAgIG1SZXF1ZXN0ZWQgPSByZXF1ZXN0ZWQ7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJkZXByZWNhdGlvbiJ9KQorICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBHbFJlbmRlcmVyIGV4dGVuZHMgSGFyZHdhcmVSZW5kZXJlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiA9IDB4MzA5ODsKKworICAgICAgICBzdGF0aWMgRUdMQ29udGV4dCBzRWdsQ29udGV4dDsKKyAgICAgICAgc3RhdGljIEVHTDEwIHNFZ2w7CisgICAgICAgIHN0YXRpYyBFR0xEaXNwbGF5IHNFZ2xEaXNwbGF5OworICAgICAgICBzdGF0aWMgRUdMQ29uZmlnIHNFZ2xDb25maWc7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkIHNFZ2xUaHJlYWQ7ICAgICAgICAKKworICAgICAgICBFR0xTdXJmYWNlIG1FZ2xTdXJmYWNlOworICAgICAgICAKKyAgICAgICAgR0wgbUdsOworICAgICAgICBHTEVTMjBDYW52YXMgbUNhbnZhczsKKworICAgICAgICBmaW5hbCBpbnQgbUdsVmVyc2lvbjsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBtVHJhbnNsdWNlbnQ7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1EZXN0cm95ZWQ7CisKKyAgICAgICAgR2xSZW5kZXJlcihpbnQgZ2xWZXJzaW9uLCBib29sZWFuIHRyYW5zbHVjZW50KSB7CisgICAgICAgICAgICBtR2xWZXJzaW9uID0gZ2xWZXJzaW9uOworICAgICAgICAgICAgbVRyYW5zbHVjZW50ID0gdHJhbnNsdWNlbnQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGZvciBPcGVuR0wgZXJyb3JzLiBJZiBhbiBlcnJvciBoYXMgb2NjdXJlZCwge0BsaW5rICNkZXN0cm95KGJvb2xlYW4pfQorICAgICAgICAgKiBpcyBpbnZva2VkIGFuZCB0aGUgcmVxdWVzdGVkIGZsYWcgaXMgdHVybmVkIG9mZi4gVGhlIGVycm9yIGNvZGUgaXMKKyAgICAgICAgICogYWxzbyBsb2dnZWQgYXMgYSB3YXJuaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBjaGVja0Vycm9ycygpIHsKKyAgICAgICAgICAgIGlmIChpc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGludCBlcnJvciA9IHNFZ2wuZWdsR2V0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGJhZCBoYXMgaGFwcGVuZWQgcmV2ZXJ0IHRvCisgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbCByZW5kZXJpbmcuCisgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3kodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSBFR0wxMS5FR0xfQ09OVEVYVF9MT1NUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSdsbCB0cnkgYWdhaW4gaWYgaXQgd2FzIGNvbnRleHQgbG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVxdWVzdGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiT3BlbkdMIGVycm9yOiAiICsgZXJyb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGJvb2xlYW4gaW5pdGlhbGl6ZShTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworICAgICAgICAgICAgaWYgKGlzUmVxdWVzdGVkKCkgJiYgIWlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUVnbCgpOworICAgICAgICAgICAgICAgIG1HbCA9IGNyZWF0ZUVnbFN1cmZhY2UoaG9sZGVyKTsKKyAgICAgICAgICAgICAgICBtRGVzdHJveWVkID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBpZiAobUdsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVyciA9IHNFZ2wuZWdsR2V0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJveSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlcXVlc3RlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNhbnZhcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbnZhcyA9IGNyZWF0ZUNhbnZhcygpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DYW52YXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJIYXJkd2FyZSBhY2NlbGVyYXRlZCBDYW52YXMgY291bGQgbm90IGJlIGNyZWF0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQ2FudmFzICE9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgYWJzdHJhY3QgR0xFUzIwQ2FudmFzIGNyZWF0ZUNhbnZhcygpOworCisgICAgICAgIHZvaWQgaW5pdGlhbGl6ZUVnbCgpIHsKKyAgICAgICAgICAgIGlmIChzRWdsQ29udGV4dCAhPSBudWxsKSByZXR1cm47CisKKyAgICAgICAgICAgIHNFZ2xUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworICAgICAgICAgICAgc0VnbCA9IChFR0wxMCkgRUdMQ29udGV4dC5nZXRFR0woKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gR2V0IHRvIHRoZSBkZWZhdWx0IGRpc3BsYXkuCisgICAgICAgICAgICBzRWdsRGlzcGxheSA9IHNFZ2wuZWdsR2V0RGlzcGxheShFR0wxMC5FR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHNFZ2xEaXNwbGF5ID09IEVHTDEwLkVHTF9OT19ESVNQTEFZKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbEdldERpc3BsYXkgZmFpbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdlIGNhbiBub3cgaW5pdGlhbGl6ZSBFR0wgZm9yIHRoYXQgZGlzcGxheQorICAgICAgICAgICAgaW50W10gdmVyc2lvbiA9IG5ldyBpbnRbMl07CisgICAgICAgICAgICBpZiAoIXNFZ2wuZWdsSW5pdGlhbGl6ZShzRWdsRGlzcGxheSwgdmVyc2lvbikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsSW5pdGlhbGl6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNFZ2xDb25maWcgPSBnZXRDb25maWdDaG9vc2VyKG1HbFZlcnNpb24pLmNob29zZUNvbmZpZyhzRWdsLCBzRWdsRGlzcGxheSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIENyZWF0ZSBhbiBFR0wgY29udGV4dC4gV2Ugd2FudCB0byBkbyB0aGlzIGFzIHJhcmVseSBhcyB3ZSBjYW4sIGJlY2F1c2UgYW4KKyAgICAgICAgICAgICogRUdMIGNvbnRleHQgaXMgYSBzb21ld2hhdCBoZWF2eSBvYmplY3QuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgc0VnbENvbnRleHQgPSBjcmVhdGVDb250ZXh0KHNFZ2wsIHNFZ2xEaXNwbGF5LCBzRWdsQ29uZmlnKTsKKyAgICAgICAgfQorCisgICAgICAgIEdMIGNyZWF0ZUVnbFN1cmZhY2UoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIHByZWNvbmRpdGlvbnMuCisgICAgICAgICAgICBpZiAoc0VnbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbCBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzRWdsRGlzcGxheSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbERpc3BsYXkgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc0VnbENvbmZpZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm1FZ2xDb25maWcgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSAhPSBzRWdsVGhyZWFkKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSGFyZHdhcmVSZW5kZXJlciBjYW5ub3QgYmUgdXNlZCAiIAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZnJvbSBtdWx0aXBsZSB0aHJlYWRzIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiAgVGhlIHdpbmRvdyBzaXplIGhhcyBjaGFuZ2VkLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldworICAgICAgICAgICAgICogIHN1cmZhY2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChtRWdsU3VyZmFjZSAhPSBudWxsICYmIG1FZ2xTdXJmYWNlICE9IEVHTDEwLkVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBVbmJpbmQgYW5kIGRlc3Ryb3kgdGhlIG9sZCBFR0wgc3VyZmFjZSwgaWYKKyAgICAgICAgICAgICAgICAgKiB0aGVyZSBpcyBvbmUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgc0VnbC5lZ2xNYWtlQ3VycmVudChzRWdsRGlzcGxheSwgRUdMMTAuRUdMX05PX1NVUkZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fU1VSRkFDRSwgRUdMMTAuRUdMX05PX0NPTlRFWFQpOworICAgICAgICAgICAgICAgIHNFZ2wuZWdsRGVzdHJveVN1cmZhY2Uoc0VnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIEVHTCBzdXJmYWNlIHdlIGNhbiByZW5kZXIgaW50by4KKyAgICAgICAgICAgIG1FZ2xTdXJmYWNlID0gc0VnbC5lZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKHNFZ2xEaXNwbGF5LCBzRWdsQ29uZmlnLCBob2xkZXIsIG51bGwpOworCisgICAgICAgICAgICBpZiAobUVnbFN1cmZhY2UgPT0gbnVsbCB8fCBtRWdsU3VyZmFjZSA9PSBFR0wxMC5FR0xfTk9fU1VSRkFDRSkgeworICAgICAgICAgICAgICAgIGludCBlcnJvciA9IHNFZ2wuZWdsR2V0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPT0gRUdMMTAuRUdMX0JBRF9OQVRJVkVfV0lORE9XKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKCJFZ2xIZWxwZXIiLCAiY3JlYXRlV2luZG93U3VyZmFjZSByZXR1cm5lZCBFR0xfQkFEX05BVElWRV9XSU5ET1cuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY3JlYXRlV2luZG93U3VyZmFjZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEJlZm9yZSB3ZSBjYW4gaXNzdWUgR0wgY29tbWFuZHMsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisgICAgICAgICAgICAgKiB0aGUgY29udGV4dCBpcyBjdXJyZW50IGFuZCBib3VuZCB0byBhIHN1cmZhY2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICghc0VnbC5lZ2xNYWtlQ3VycmVudChzRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIG1FZ2xTdXJmYWNlLCBzRWdsQ29udGV4dCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsTWFrZUN1cnJlbnQgZmFpbGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzRWdsQ29udGV4dC5nZXRHTCgpOworICAgICAgICB9CisKKyAgICAgICAgRUdMQ29udGV4dCBjcmVhdGVDb250ZXh0KEVHTDEwIGVnbCwgRUdMRGlzcGxheSBlZ2xEaXNwbGF5LCBFR0xDb25maWcgZWdsQ29uZmlnKSB7CisgICAgICAgICAgICBpbnRbXSBhdHRyaWJfbGlzdCA9IHsgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sIG1HbFZlcnNpb24sIEVHTDEwLkVHTF9OT05FIH07CisKKyAgICAgICAgICAgIHJldHVybiBlZ2wuZWdsQ3JlYXRlQ29udGV4dChlZ2xEaXNwbGF5LCBlZ2xDb25maWcsIEVHTDEwLkVHTF9OT19DT05URVhULAorICAgICAgICAgICAgICAgICAgICBtR2xWZXJzaW9uICE9IDAgPyBhdHRyaWJfbGlzdCA6IG51bGwpOyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgaW5pdGlhbGl6ZUlmTmVlZGVkKGludCB3aWR0aCwgaW50IGhlaWdodCwgVmlldy5BdHRhY2hJbmZvIGF0dGFjaEluZm8sCisgICAgICAgICAgICAgICAgU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKKyAgICAgICAgICAgIGlmIChpc1JlcXVlc3RlZCgpKSB7CisgICAgICAgICAgICAgICAgY2hlY2tFcnJvcnMoKTsKKyAgICAgICAgICAgICAgICBzdXBlci5pbml0aWFsaXplSWZOZWVkZWQod2lkdGgsIGhlaWdodCwgYXR0YWNoSW5mbywgaG9sZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgZGVzdHJveShib29sZWFuIGZ1bGwpIHsKKyAgICAgICAgICAgIGlmIChmdWxsICYmIG1DYW52YXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DYW52YXMuZGVzdHJveSgpOworICAgICAgICAgICAgICAgIG1DYW52YXMgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIWlzRW5hYmxlZCgpIHx8IG1EZXN0cm95ZWQpIHJldHVybjsKKworICAgICAgICAgICAgbURlc3Ryb3llZCA9IHRydWU7CisKKyAgICAgICAgICAgIHNFZ2wuZWdsTWFrZUN1cnJlbnQoc0VnbERpc3BsYXksIEVHTDEwLkVHTF9OT19TVVJGQUNFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fU1VSRkFDRSwgRUdMMTAuRUdMX05PX0NPTlRFWFQpOworICAgICAgICAgICAgc0VnbC5lZ2xEZXN0cm95U3VyZmFjZShzRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOworCisgICAgICAgICAgICBtRWdsU3VyZmFjZSA9IG51bGw7CisgICAgICAgICAgICBtR2wgPSBudWxsOworCisgICAgICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIHNldHVwKGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICAgICAgbUNhbnZhcy5zZXRWaWV3cG9ydCh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYm9vbGVhbiBjYW5EcmF3KCkgeworICAgICAgICAgICAgcmV0dXJuIG1HbCAhPSBudWxsICYmIG1DYW52YXMgIT0gbnVsbDsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIAorICAgICAgICB2b2lkIG9uUHJlRHJhdygpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZWZpbmVzIHRoZSBFR0wgY29uZmlndXJhdGlvbiBmb3IgdGhpcyByZW5kZXJlci4gVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgICAgICAgKiBpcyBSR0JYLCBubyBkZXB0aCwgbm8gc3RlbmNpbC4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gQW4ge0BsaW5rIGFuZHJvaWQudmlldy5IYXJkd2FyZVJlbmRlcmVyLkdsUmVuZGVyZXIuRWdsQ29uZmlnQ2hvb3Nlcn0uCisgICAgICAgICAqIEBwYXJhbSBnbFZlcnNpb24KKyAgICAgICAgICovCisgICAgICAgIEVnbENvbmZpZ0Nob29zZXIgZ2V0Q29uZmlnQ2hvb3NlcihpbnQgZ2xWZXJzaW9uKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBDaGVjayBmb3IgbVRyYW5zbHVjZW50IGhlcmUsIHdoaWNoIG1lYW5zIGF0IGxlYXN0IDIgRUdMIGNvbnRleHRzCisgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudFNpemVDaG9vc2VyKGdsVmVyc2lvbiwgOCwgOCwgOCwgOCwgMCwgMCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBkcmF3KFZpZXcgdmlldywgVmlldy5BdHRhY2hJbmZvIGF0dGFjaEluZm8sIGludCB5T2Zmc2V0KSB7CisgICAgICAgICAgICBpZiAoY2FuRHJhdygpKSB7CisgICAgICAgICAgICAgICAgYXR0YWNoSW5mby5tRHJhd2luZ1RpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBhdHRhY2hJbmZvLm1JZ25vcmVEaXJ0eVN0YXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB2aWV3Lm1Qcml2YXRlRmxhZ3MgfD0gVmlldy5EUkFXTjsKKworICAgICAgICAgICAgICAgIGNoZWNrQ3VycmVudCgpOworCisgICAgICAgICAgICAgICAgb25QcmVEcmF3KCk7CisKKyAgICAgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbUNhbnZhczsKKyAgICAgICAgICAgICAgICBpbnQgc2F2ZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAsIC15T2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHZpZXcuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF0dGFjaEluZm8ubUlnbm9yZURpcnR5U3RhdGUgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIHNFZ2wuZWdsU3dhcEJ1ZmZlcnMoc0VnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKKyAgICAgICAgICAgICAgICBjaGVja0Vycm9ycygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ3VycmVudCgpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IERvbid0IGNoZWNrIHRoZSBjdXJyZW50IGNvbnRleHQgd2hlbiB3ZSBoYXZlIG9uZSBwZXIgVUkgdGhyZWFkCisgICAgICAgICAgICAvLyBUT0RPOiBVc2UgYSB0aHJlYWRsb2NhbCBmbGFnIHRvIGtub3cgd2hldGhlciB0aGUgc3VyZmFjZSBoYXMgY2hhbmdlZAorICAgICAgICAgICAgaWYgKHNFZ2wuZWdsR2V0Q3VycmVudENvbnRleHQoKSAhPSBzRWdsQ29udGV4dCB8fAorICAgICAgICAgICAgICAgICAgICBzRWdsLmVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTDEwLkVHTF9EUkFXKSAhPSBtRWdsU3VyZmFjZSkgeworICAgICAgICAgICAgICAgIGlmICghc0VnbC5lZ2xNYWtlQ3VycmVudChzRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIG1FZ2xTdXJmYWNlLCBzRWdsQ29udGV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbE1ha2VDdXJyZW50IGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBFZ2xDb25maWdDaG9vc2VyIHsKKyAgICAgICAgICAgIGZpbmFsIGludFtdIG1Db25maWdTcGVjOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUdsVmVyc2lvbjsKKworICAgICAgICAgICAgRWdsQ29uZmlnQ2hvb3NlcihpbnQgZ2xWZXJzaW9uLCBpbnRbXSBjb25maWdTcGVjKSB7CisgICAgICAgICAgICAgICAgbUdsVmVyc2lvbiA9IGdsVmVyc2lvbjsKKyAgICAgICAgICAgICAgICBtQ29uZmlnU3BlYyA9IGZpbHRlckNvbmZpZ1NwZWMoY29uZmlnU3BlYyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEVHTENvbmZpZyBjaG9vc2VDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXkpIHsKKyAgICAgICAgICAgICAgICBpbnRbXSBpbmRleCA9IG5ldyBpbnRbMV07CisgICAgICAgICAgICAgICAgaWYgKCFlZ2wuZWdsQ2hvb3NlQ29uZmlnKGRpc3BsYXksIG1Db25maWdTcGVjLCBudWxsLCAwLCBpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZWdsQ2hvb3NlQ29uZmlnIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBudW1Db25maWdzID0gaW5kZXhbMF07CisgICAgICAgICAgICAgICAgaWYgKG51bUNvbmZpZ3MgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJObyBjb25maWdzIG1hdGNoIGNvbmZpZ1NwZWMiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzID0gbmV3IEVHTENvbmZpZ1tudW1Db25maWdzXTsKKyAgICAgICAgICAgICAgICBpZiAoIWVnbC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgbUNvbmZpZ1NwZWMsIGNvbmZpZ3MsIG51bUNvbmZpZ3MsIGluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJlZ2xDaG9vc2VDb25maWcgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZyA9IGNob29zZUNvbmZpZyhlZ2wsIGRpc3BsYXksIGNvbmZpZ3MpOworICAgICAgICAgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJObyBjb25maWcgY2hvc2VuIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWJzdHJhY3QgRUdMQ29uZmlnIGNob29zZUNvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnW10gY29uZmlncyk7CisKKyAgICAgICAgICAgIHByaXZhdGUgaW50W10gZmlsdGVyQ29uZmlnU3BlYyhpbnRbXSBjb25maWdTcGVjKSB7CisgICAgICAgICAgICAgICAgaWYgKG1HbFZlcnNpb24gIT0gMikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnU3BlYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogV2Uga25vdyBub25lIG9mIHRoZSBzdWJjbGFzc2VzIGRlZmluZSBFR0xfUkVOREVSQUJMRV9UWVBFLgorICAgICAgICAgICAgICAgICAqIEFuZCB3ZSBrbm93IHRoZSBjb25maWdTcGVjIGlzIHdlbGwgZm9ybWVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGludCBsZW4gPSBjb25maWdTcGVjLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBpbnRbXSBuZXdDb25maWdTcGVjID0gbmV3IGludFtsZW4gKyAyXTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNvbmZpZ1NwZWMsIDAsIG5ld0NvbmZpZ1NwZWMsIDAsIGxlbiAtIDEpOworICAgICAgICAgICAgICAgIG5ld0NvbmZpZ1NwZWNbbGVuIC0gMV0gPSBFR0wxMC5FR0xfUkVOREVSQUJMRV9UWVBFOworICAgICAgICAgICAgICAgIG5ld0NvbmZpZ1NwZWNbbGVuXSA9IDQ7IC8qIEVHTF9PUEVOR0xfRVMyX0JJVCAqLworICAgICAgICAgICAgICAgIG5ld0NvbmZpZ1NwZWNbbGVuICsgMV0gPSBFR0wxMC5FR0xfTk9ORTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3Q29uZmlnU3BlYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaG9vc2UgYSBjb25maWd1cmF0aW9uIHdpdGggZXhhY3RseSB0aGUgc3BlY2lmaWVkIHIsZyxiLGEgc2l6ZXMsCisgICAgICAgICAqIGFuZCBhdCBsZWFzdCB0aGUgc3BlY2lmaWVkIGRlcHRoIGFuZCBzdGVuY2lsIHNpemVzLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGNsYXNzIENvbXBvbmVudFNpemVDaG9vc2VyIGV4dGVuZHMgRWdsQ29uZmlnQ2hvb3NlciB7CisgICAgICAgICAgICBwcml2YXRlIGludFtdIG1WYWx1ZTsKKworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbVJlZFNpemU7CisgICAgICAgICAgICBwcml2YXRlIGludCBtR3JlZW5TaXplOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbUJsdWVTaXplOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbUFscGhhU2l6ZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1EZXB0aFNpemU7CisgICAgICAgICAgICBwcml2YXRlIGludCBtU3RlbmNpbFNpemU7CisKKyAgICAgICAgICAgIENvbXBvbmVudFNpemVDaG9vc2VyKGludCBnbFZlcnNpb24sIGludCByZWRTaXplLCBpbnQgZ3JlZW5TaXplLCBpbnQgYmx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYVNpemUsIGludCBkZXB0aFNpemUsIGludCBzdGVuY2lsU2l6ZSkgeworICAgICAgICAgICAgICAgIHN1cGVyKGdsVmVyc2lvbiwgbmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwgcmVkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9HUkVFTl9TSVpFLCBncmVlblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLCBibHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9BTFBIQV9TSVpFLCBhbHBoYVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfREVQVEhfU0laRSwgZGVwdGhTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NURU5DSUxfU0laRSwgc3RlbmNpbFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9ORSB9KTsKKyAgICAgICAgICAgICAgICBtVmFsdWUgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgICAgIG1SZWRTaXplID0gcmVkU2l6ZTsKKyAgICAgICAgICAgICAgICBtR3JlZW5TaXplID0gZ3JlZW5TaXplOworICAgICAgICAgICAgICAgIG1CbHVlU2l6ZSA9IGJsdWVTaXplOworICAgICAgICAgICAgICAgIG1BbHBoYVNpemUgPSBhbHBoYVNpemU7CisgICAgICAgICAgICAgICAgbURlcHRoU2l6ZSA9IGRlcHRoU2l6ZTsKKyAgICAgICAgICAgICAgICBtU3RlbmNpbFNpemUgPSBzdGVuY2lsU2l6ZTsKKyAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEVHTENvbmZpZyBjaG9vc2VDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZ1tdIGNvbmZpZ3MpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEVHTENvbmZpZyBjb25maWcgOiBjb25maWdzKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBkID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywgRUdMMTAuRUdMX0RFUFRIX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICBpbnQgcyA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9TVEVOQ0lMX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICBpZiAoZCA+PSBtRGVwdGhTaXplICYmIHMgPj0gbVN0ZW5jaWxTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgciA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9SRURfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZyA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9HUkVFTl9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBiID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywgRUdMMTAuRUdMX0JMVUVfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYSA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9BTFBIQV9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID49IG1SZWRTaXplICYmIGcgPj0gbUdyZWVuU2l6ZSAmJiBiID49IG1CbHVlU2l6ZSAmJiBhID49IG1BbHBoYVNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIGludCBmaW5kQ29uZmlnQXR0cmliKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICBpbnQgYXR0cmlidXRlLCBpbnQgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgICAgICAgICAgaWYgKGVnbC5lZ2xHZXRDb25maWdBdHRyaWIoZGlzcGxheSwgY29uZmlnLCBhdHRyaWJ1dGUsIG1WYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZVswXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFyZHdhcmUgcmVuZGVyZXIgdXNpbmcgT3BlbkdMIEVTIDIuMC4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgR2wyMFJlbmRlcmVyIGV4dGVuZHMgR2xSZW5kZXJlciB7CisgICAgICAgIHByaXZhdGUgR0xFUzIwQ2FudmFzIG1HbENhbnZhczsKKworICAgICAgICBHbDIwUmVuZGVyZXIoYm9vbGVhbiB0cmFuc2x1Y2VudCkgeworICAgICAgICAgICAgc3VwZXIoMiwgdHJhbnNsdWNlbnQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEdMRVMyMENhbnZhcyBjcmVhdGVDYW52YXMoKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBQYXNzIG1UcmFuc2x1Y2VudCBpbnN0ZWFkIG9mIHRydWUKKyAgICAgICAgICAgIHJldHVybiBtR2xDYW52YXMgPSBuZXcgR0xFUzIwQ2FudmFzKG1HbCwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBvblByZURyYXcoKSB7CisgICAgICAgICAgICBtR2xDYW52YXMub25QcmVEcmF3KCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgSGFyZHdhcmVSZW5kZXJlciBjcmVhdGUoYm9vbGVhbiB0cmFuc2x1Y2VudCkgeworICAgICAgICAgICAgaWYgKEdMRVMyMENhbnZhcy5pc0F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHbDIwUmVuZGVyZXIodHJhbnNsdWNlbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyLmphdmEKaW5kZXggMTk0YzAxMy4uNDU4Mjc0ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXIuamF2YQpAQCAtMTYsMTUgKzE2LDE1IEBACiAKIHBhY2thZ2UgYW5kcm9pZC52aWV3OwogCitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogCi1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwotCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTcxLDExICs3MSwxMSBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBtQ29uc3RydWN0b3JBcmdzID0gbmV3IE9iamVjdFsyXTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gbUNvbnN0cnVjdG9yU2lnbmF0dXJlID0gbmV3IENsYXNzW10geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+W10gbUNvbnN0cnVjdG9yU2lnbmF0dXJlID0gbmV3IENsYXNzW10gewogICAgICAgICAgICAgQ29udGV4dC5jbGFzcywgQXR0cmlidXRlU2V0LmNsYXNzfTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBDb25zdHJ1Y3Rvcj4gc0NvbnN0cnVjdG9yTWFwID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQ29uc3RydWN0b3I+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBWaWV3Pj4gc0NvbnN0cnVjdG9yTWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQ29uc3RydWN0b3I8PyBleHRlbmRzIFZpZXc+PigpOwogICAgIAogICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+IG1GaWx0ZXJNYXA7CiAKQEAgLTk3LDYgKzk3LDcgQEAKICAgICAgICAgICogCiAgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIGNsYXNzIGlzIGFsbG93ZWQgdG8gYmUgaW5mbGF0ZWQsIG9yIGZhbHNlIG90aGVyd2lzZQogICAgICAgICAgKi8KKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgICAgIGJvb2xlYW4gb25Mb2FkQ2xhc3MoQ2xhc3MgY2xhenopOwogICAgIH0KICAgICAKQEAgLTM4MCw3ICszODEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJWaWV3R3JvdXAgcm9vdCBhbmQgYXR0YWNoVG9Sb290PXRydWUiKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKHBhcnNlciwgcm9vdCwgYXR0cnMpOworICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHJvb3QsIGF0dHJzLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGVtcCBpcyB0aGUgcm9vdCB2aWV3IHRoYXQgd2FzIGZvdW5kIGluIHRoZSB4bWwKICAgICAgICAgICAgICAgICAgICAgVmlldyB0ZW1wID0gY3JlYXRlVmlld0Zyb21UYWcobmFtZSwgYXR0cnMpOwpAQCAtNDA1LDcgKzQwNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tPiBzdGFydCBpbmZsYXRpbmcgY2hpbGRyZW4iKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAvLyBJbmZsYXRlIGFsbCBjaGlsZHJlbiB1bmRlciB0ZW1wCi0gICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKHBhcnNlciwgdGVtcCwgYXR0cnMpOworICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHRlbXAsIGF0dHJzLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tPiBkb25lIGluZmxhdGluZyBjaGlsZHJlbiIpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC00NTgsMTggKzQ1OSwxOCBAQAogICAgICAqIEBwYXJhbSBuYW1lIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIGluc3RhbnRpYXRlZC4KICAgICAgKiBAcGFyYW0gYXR0cnMgVGhlIFhNTCBhdHRyaWJ1dGVzIHN1cHBsaWVkIGZvciB0aGlzIGluc3RhbmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVmlldyBUaGUgbmV3bHkgaW5zdGFudGllZCB2aWV3LCBvciBudWxsLgorICAgICAqIEByZXR1cm4gVmlldyBUaGUgbmV3bHkgaW5zdGFudGlhdGVkIHZpZXcsIG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFZpZXcgY3JlYXRlVmlldyhTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCwgQXR0cmlidXRlU2V0IGF0dHJzKQogICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEluZmxhdGVFeGNlcHRpb24gewotICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHNDb25zdHJ1Y3Rvck1hcC5nZXQobmFtZSk7Ci0gICAgICAgIENsYXNzIGNsYXp6ID0gbnVsbDsKKyAgICAgICAgQ29uc3RydWN0b3I8PyBleHRlbmRzIFZpZXc+IGNvbnN0cnVjdG9yID0gc0NvbnN0cnVjdG9yTWFwLmdldChuYW1lKTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZpZXc+IGNsYXp6ID0gbnVsbDsKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBDbGFzcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlLCBzZWUgaWYgaXQncyByZWFsLCBhbmQgdHJ5IHRvIGFkZCBpdAogICAgICAgICAgICAgICAgIGNsYXp6ID0gbUNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggIT0gbnVsbCA/IChwcmVmaXggKyBuYW1lKSA6IG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgbmFtZSkgOiBuYW1lKS5hc1N1YmNsYXNzKFZpZXcuY2xhc3MpOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIGlmIChtRmlsdGVyICE9IG51bGwgJiYgY2xhenogIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFsbG93ZWQgPSBtRmlsdGVyLm9uTG9hZENsYXNzKGNsYXp6KTsKQEAgLTQ4Nyw3ICs0ODgsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZFN0YXRlID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBjbGFzcyAtLSByZW1lbWJlciB3aGV0aGVyIGl0IGlzIGFsbG93ZWQKICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6ID0gbUNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSkuYXNTdWJjbGFzcyhWaWV3LmNsYXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbGxvd2VkID0gY2xhenogIT0gbnVsbCAmJiBtRmlsdGVyLm9uTG9hZENsYXNzKGNsYXp6KTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWx0ZXJNYXAucHV0KG5hbWUsIGFsbG93ZWQpOwpAQCAtNTAyLDcgKzUwMyw3IEBACiAKICAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBtQ29uc3RydWN0b3JBcmdzOwogICAgICAgICAgICAgYXJnc1sxXSA9IGF0dHJzOwotICAgICAgICAgICAgcmV0dXJuIChWaWV3KSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShhcmdzKTsKKyAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShhcmdzKTsKIAogICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgSW5mbGF0ZUV4Y2VwdGlvbiBpZSA9IG5ldyBJbmZsYXRlRXhjZXB0aW9uKGF0dHJzLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQpAQCAtNTExLDYgKzUxMiwxMyBAQAogICAgICAgICAgICAgaWUuaW5pdENhdXNlKGUpOwogICAgICAgICAgICAgdGhyb3cgaWU7CiAKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIElmIGxvYWRlZCBjbGFzcyBpcyBub3QgYSBWaWV3IHN1YmNsYXNzCisgICAgICAgICAgICBJbmZsYXRlRXhjZXB0aW9uIGllID0gbmV3IEluZmxhdGVFeGNlcHRpb24oYXR0cnMuZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpCisgICAgICAgICAgICAgICAgICAgICsgIjogQ2xhc3MgaXMgbm90IGEgVmlldyAiCisgICAgICAgICAgICAgICAgICAgICsgKHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSkpOworICAgICAgICAgICAgaWUuaW5pdENhdXNlKGUpOworICAgICAgICAgICAgdGhyb3cgaWU7CiAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gSWYgbG9hZENsYXNzIGZhaWxzLCB3ZSBzaG91bGQgcHJvcGFnYXRlIHRoZSBleGNlcHRpb24uCiAgICAgICAgICAgICB0aHJvdyBlOwpAQCAtNTI0LDcgKzUzMiw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhyb3cgYW4gZXhjcGV0aW9uIGJlY2F1c2UgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBub3QgYWxsb3dlZCB0byBiZSBpbmZsYXRlZC4KKyAgICAgKiBUaHJvdyBhbiBleGNlcHRpb24gYmVjYXVzZSB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIG5vdCBhbGxvd2VkIHRvIGJlIGluZmxhdGVkLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBmYWlsTm90QWxsb3dlZChTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CiAgICAgICAgIEluZmxhdGVFeGNlcHRpb24gaWUgPSBuZXcgSW5mbGF0ZUV4Y2VwdGlvbihhdHRycy5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkKQEAgLTU5NSw4ICs2MDMsOCBAQAogICAgICAqIFJlY3Vyc2l2ZSBtZXRob2QgdXNlZCB0byBkZXNjZW5kIGRvd24gdGhlIHhtbCBoaWVyYXJjaHkgYW5kIGluc3RhbnRpYXRlCiAgICAgICogdmlld3MsIGluc3RhbnRpYXRlIHRoZWlyIGNoaWxkcmVuLCBhbmQgdGhlbiBjYWxsIG9uRmluaXNoSW5mbGF0ZSgpLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBySW5mbGF0ZShYbWxQdWxsUGFyc2VyIHBhcnNlciwgVmlldyBwYXJlbnQsIGZpbmFsIEF0dHJpYnV0ZVNldCBhdHRycykKLSAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSB2b2lkIHJJbmZsYXRlKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBWaWV3IHBhcmVudCwgZmluYWwgQXR0cmlidXRlU2V0IGF0dHJzLAorICAgICAgICAgICAgYm9vbGVhbiBmaW5pc2hJbmZsYXRlKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCiAgICAgICAgIGZpbmFsIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOwogICAgICAgICBpbnQgdHlwZTsKQEAgLTYyMywxMiArNjMxLDEyIEBACiAgICAgICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gY3JlYXRlVmlld0Zyb21UYWcobmFtZSwgYXR0cnMpOwogICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdHcm91cCB2aWV3R3JvdXAgPSAoVmlld0dyb3VwKSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgZmluYWwgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMgPSB2aWV3R3JvdXAuZ2VuZXJhdGVMYXlvdXRQYXJhbXMoYXR0cnMpOwotICAgICAgICAgICAgICAgIHJJbmZsYXRlKHBhcnNlciwgdmlldywgYXR0cnMpOworICAgICAgICAgICAgICAgIHJJbmZsYXRlKHBhcnNlciwgdmlldywgYXR0cnMsIHRydWUpOwogICAgICAgICAgICAgICAgIHZpZXdHcm91cC5hZGRWaWV3KHZpZXcsIHBhcmFtcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwYXJlbnQub25GaW5pc2hJbmZsYXRlKCk7CisgICAgICAgIGlmIChmaW5pc2hJbmZsYXRlKSBwYXJlbnQub25GaW5pc2hJbmZsYXRlKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUmVxdWVzdEZvY3VzKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBWaWV3IHBhcmVudCkKQEAgLTY3OSw3ICs2ODcsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgIGlmIChUQUdfTUVSR0UuZXF1YWxzKGNoaWxkTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZmxhdGUgYWxsIGNoaWxkcmVuLgotICAgICAgICAgICAgICAgICAgICAgICAgckluZmxhdGUoY2hpbGRQYXJzZXIsIHBhcmVudCwgY2hpbGRBdHRycyk7CisgICAgICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShjaGlsZFBhcnNlciwgcGFyZW50LCBjaGlsZEF0dHJzLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBjcmVhdGVWaWV3RnJvbVRhZyhjaGlsZE5hbWUsIGNoaWxkQXR0cnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlld0dyb3VwIGdyb3VwID0gKFZpZXdHcm91cCkgcGFyZW50OwpAQCAtNzA0LDcgKzcxMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZmxhdGUgYWxsIGNoaWxkcmVuLgotICAgICAgICAgICAgICAgICAgICAgICAgckluZmxhdGUoY2hpbGRQYXJzZXIsIHZpZXcsIGNoaWxkQXR0cnMpOworICAgICAgICAgICAgICAgICAgICAgICAgckluZmxhdGUoY2hpbGRQYXJzZXIsIHZpZXcsIGNoaWxkQXR0cnMsIHRydWUpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIG92ZXJyaWRlIHRoZSBpbmNsdWRlZCBsYXlvdXQncyBhbmRyb2lkOmlkIHdpdGggdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmUgc2V0IG9uIHRoZSA8aW5jbHVkZSAvPiB0YWcgaXRzZWxmLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SW5mbGF0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUluZmxhdGVyLmphdmEKaW5kZXggNDZjODA1Yy4uZDA5ODVkOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SW5mbGF0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01lbnVJbmZsYXRlci5qYXZhCkBAIC0xNiw5ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC52aWV3OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVJdGVtSW1wbDsKLQogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogCiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwpAQCAtMzAsNiArMjksOCBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51SXRlbUltcGw7CisKIC8qKgogICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGluc3RhbnRpYXRlIG1lbnUgWE1MIGZpbGVzIGludG8gTWVudSBvYmplY3RzLgogICogPHA+CkBAIC0xNjYsNiArMTY3LDQxIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5mbGF0ZWRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcgorICAgICAgICAgICAgaW1wbGVtZW50cyBNZW51SXRlbS5Pbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gUEFSQU1fVFlQRVMgPSBuZXcgQ2xhc3NbXSB7IE1lbnVJdGVtLmNsYXNzIH07CisgICAgICAgIAorICAgICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgICAgIHByaXZhdGUgTWV0aG9kIG1NZXRob2Q7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgSW5mbGF0ZWRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICBDbGFzcyBjID0gY29udGV4dC5nZXRDbGFzcygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtTWV0aG9kID0gYy5nZXRNZXRob2QobWV0aG9kTmFtZSwgUEFSQU1fVFlQRVMpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBJbmZsYXRlRXhjZXB0aW9uIGV4ID0gbmV3IEluZmxhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgcmVzb2x2ZSBtZW51IGl0ZW0gb25DbGljayBoYW5kbGVyICIgKyBtZXRob2ROYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgaW4gY2xhc3MgIiArIGMuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBleC5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1DbGljayhNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChtTWV0aG9kLmdldFJldHVyblR5cGUoKSA9PSBCb29sZWFuLlRZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChCb29sZWFuKSBtTWV0aG9kLmludm9rZShtQ29udGV4dCwgaXRlbSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU1ldGhvZC5pbnZva2UobUNvbnRleHQsIGl0ZW0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAogICAgIC8qKgogICAgICAqIFN0YXRlIGZvciB0aGUgY3VycmVudCBtZW51LgogICAgICAqIDxwPgpAQCAtMjA1LDYgKzI0MSwxNyBAQAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXRlbVZpc2libGU7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpdGVtRW5hYmxlZDsKICAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBTeW5jIHRvIGF0dHJzLnhtbCBlbnVtLCB2YWx1ZXMgaW4gTWVudUl0ZW06CisgICAgICAgICAqIC0gMDogbmV2ZXIKKyAgICAgICAgICogLSAxOiBpZlJvb20KKyAgICAgICAgICogLSAyOiBhbHdheXMKKyAgICAgICAgICogLSAtMTogU2FmZSBzZW50aW5lbCBmb3IgIm5vIHZhbHVlIi4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgaW50IGl0ZW1TaG93QXNBY3Rpb247CisgICAgICAgIAorICAgICAgICBwcml2YXRlIFN0cmluZyBpdGVtTGlzdGVuZXJNZXRob2ROYW1lOworICAgICAgICAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGRlZmF1bHRHcm91cElkID0gTk9fSUQ7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0SXRlbUlkID0gTk9fSUQ7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0SXRlbUNhdGVnb3J5ID0gMDsKQEAgLTI3Niw2ICszMjMsOCBAQAogICAgICAgICAgICAgaXRlbUNoZWNrZWQgPSBhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTWVudUl0ZW1fY2hlY2tlZCwgZGVmYXVsdEl0ZW1DaGVja2VkKTsKICAgICAgICAgICAgIGl0ZW1WaXNpYmxlID0gYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1lbnVJdGVtX3Zpc2libGUsIGdyb3VwVmlzaWJsZSk7CiAgICAgICAgICAgICBpdGVtRW5hYmxlZCA9IGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV9lbmFibGVkLCBncm91cEVuYWJsZWQpOworICAgICAgICAgICAgaXRlbVNob3dBc0FjdGlvbiA9IGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1lbnVJdGVtX3Nob3dBc0FjdGlvbiwgLTEpOworICAgICAgICAgICAgaXRlbUxpc3RlbmVyTWV0aG9kTmFtZSA9IGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1lbnVJdGVtX29uQ2xpY2spOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBhLnJlY3ljbGUoKTsKICAgICAgICAgICAgIApAQCAtMjk5LDkgKzM0OCwyNSBAQAogICAgICAgICAgICAgICAgIC5zZXRJY29uKGl0ZW1JY29uUmVzSWQpCiAgICAgICAgICAgICAgICAgLnNldEFscGhhYmV0aWNTaG9ydGN1dChpdGVtQWxwaGFiZXRpY1Nob3J0Y3V0KQogICAgICAgICAgICAgICAgIC5zZXROdW1lcmljU2hvcnRjdXQoaXRlbU51bWVyaWNTaG9ydGN1dCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpdGVtU2hvd0FzQWN0aW9uID49IDApIHsKKyAgICAgICAgICAgICAgICBpdGVtLnNldFNob3dBc0FjdGlvbihpdGVtU2hvd0FzQWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGl0ZW1MaXN0ZW5lck1ldGhvZE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtQ29udGV4dC5pc1Jlc3RyaWN0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgYW5kcm9pZDpvbkNsaWNrIGF0dHJpYnV0ZSBjYW5ub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImJlIHVzZWQgd2l0aGluIGEgcmVzdHJpY3RlZCBjb250ZXh0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGl0ZW0uc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5mbGF0ZWRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihtQ29udGV4dCwgaXRlbUxpc3RlbmVyTWV0aG9kTmFtZSkpOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoaXRlbUNoZWNrYWJsZSA+PSAyKSB7Ci0gICAgICAgICAgICAgICAgKChNZW51SXRlbUltcGwpIGl0ZW0pLnNldEV4Y2x1c2l2ZUNoZWNrYWJsZSh0cnVlKTsKKyAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgTWVudUl0ZW1JbXBsKSB7CisgICAgICAgICAgICAgICAgTWVudUl0ZW1JbXBsIGltcGwgPSAoTWVudUl0ZW1JbXBsKSBpdGVtOworICAgICAgICAgICAgICAgIGlmIChpdGVtQ2hlY2thYmxlID49IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRFeGNsdXNpdmVDaGVja2FibGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SXRlbS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SXRlbS5qYXZhCmluZGV4IGZjZWJlYzVkLi4yNjA0Y2Y5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01lbnVJdGVtLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SXRlbS5qYXZhCkBAIC0zMSw2ICszMSwyMSBAQAogICogRm9yIGEgZmVhdHVyZSBzZXQgb2Ygc3BlY2lmaWMgbWVudSB0eXBlcywgc2VlIHtAbGluayBNZW51fS4KICAqLwogcHVibGljIGludGVyZmFjZSBNZW51SXRlbSB7CisgICAgLyoKKyAgICAgKiBUaGVzZSBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggYXR0cnMueG1sIGVudW0gY29uc3RhbnRzIGZvciBzaG93QXNBY3Rpb24KKyAgICAgKi8KKyAgICAvKiogTmV2ZXIgc2hvdyB0aGlzIGl0ZW0gYXMgYSBidXR0b24gaW4gYW4gQWN0aW9uIEJhci4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0FTX0FDVElPTl9ORVZFUiA9IDA7CisgICAgLyoqIFNob3cgdGhpcyBpdGVtIGFzIGEgYnV0dG9uIGluIGFuIEFjdGlvbiBCYXIgaWYgdGhlIHN5c3RlbSBkZWNpZGVzIHRoZXJlIGlzIHJvb20gZm9yIGl0LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfQVNfQUNUSU9OX0lGX1JPT00gPSAxOworICAgIC8qKgorICAgICAqIEFsd2F5cyBzaG93IHRoaXMgaXRlbSBhcyBhIGJ1dHRvbiBpbiBhbiBBY3Rpb24gQmFyLgorICAgICAqIFVzZSBzcGFyaW5nbHkhIElmIHRvbyBtYW55IGl0ZW1zIGFyZSBzZXQgdG8gYWx3YXlzIHNob3cgaW4gdGhlIEFjdGlvbiBCYXIgaXQgY2FuCisgICAgICogY3Jvd2QgdGhlIEFjdGlvbiBCYXIgYW5kIGRlZ3JhZGUgdGhlIHVzZXIgZXhwZXJpZW5jZSBvbiBkZXZpY2VzIHdpdGggc21hbGxlciBzY3JlZW5zLgorICAgICAqIEEgZ29vZCBydWxlIG9mIHRodW1iIGlzIHRvIGhhdmUgbm8gbW9yZSB0aGFuIDIgaXRlbXMgc2V0IHRvIGFsd2F5cyBzaG93IGF0IGEgdGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0FTX0FDVElPTl9BTFdBWVMgPSAyOworICAgIAogICAgIC8qKgogICAgICAqIEludGVyZmFjZSBkZWZpbml0aW9uIGZvciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhIG1lbnUgaXRlbSBpcwogICAgICAqIGNsaWNrZWQuCkBAIC0zODEsNCArMzk2LDE1IEBACiAgICAgICogICAgICAgICBtZW51IGl0ZW0gdG8gdGhlIG1lbnUuIFRoaXMgY2FuIGJlIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIENvbnRleHRNZW51SW5mbyBnZXRNZW51SW5mbygpOworICAgIAorICAgIC8qKgorICAgICAqIFNldHMgaG93IHRoaXMgaXRlbSBzaG91bGQgZGlzcGxheSBpbiB0aGUgcHJlc2VuY2Ugb2YgYW4gQWN0aW9uIEJhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY3Rpb25FbnVtIEhvdyB0aGUgaXRlbSBzaG91bGQgZGlzcGxheS4gT25lIG9mCisgICAgICoge0BsaW5rICNTSE9XX0FTX0FDVElPTl9BTFdBWVN9LCB7QGxpbmsgI1NIT1dfQVNfQUNUSU9OX0lGX1JPT019LCBvcgorICAgICAqIHtAbGluayAjU0hPV19BU19BQ1RJT05fTkVWRVJ9LiBTSE9XX0FTX0FDVElPTl9ORVZFUiBpcyB0aGUgZGVmYXVsdC4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGFuZHJvaWQuYXBwLkFjdGlvbkJhcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNob3dBc0FjdGlvbihpbnQgYWN0aW9uRW51bSk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YQppbmRleCA3MzMyYzE2Li42MTYxMjhkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbWVyYTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkludGVycG9sYXRvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50OwpAQCAtMzQsNiArMzUsNyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZYZmVybW9kZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CkBAIC01Niw2ICs1OCw3IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLlBvb2xzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk1lYXN1cmVTcGVjOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnRTb3VyY2U7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7CkBAIC02Niw3ICs2OSw2IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TY3JvbGxCYXJEcmF3YWJsZTsKIAotaW1wb3J0IGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMjYwLDcgKzI2Miw4IEBACiAgKiA8dWw+CiAgKiA8bGk+RGVmaW5lIGEgQnV0dG9uIGluIHRoZSBsYXlvdXQgZmlsZSBhbmQgYXNzaWduIGl0IGEgdW5pcXVlIElELgogICogPHByZT4KLSAqICZsdDtCdXR0b24gaWQ9IkAraWQvbXlfYnV0dG9uIgorICogJmx0O0J1dHRvbgorICogICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXlfYnV0dG9uIgogICogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgKiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgKiAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL215X2J1dHRvbl90ZXh0Ii8mZ3Q7CkBAIC04ODcsNiArODkwLDIwIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFQVElDX0ZFRURCQUNLX0VOQUJMRUQgPSAweDEwMDAwMDAwOwogCiAgICAgLyoqCisgICAgICogPHA+SW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgaGllcmFyY2h5IHNob3VsZCBzdG9wIHNhdmluZyBzdGF0ZSB3aGVuCisgICAgICogaXQgcmVhY2hlcyB0aGlzIHZpZXcuICBJZiBzdGF0ZSBzYXZpbmcgaXMgaW5pdGlhdGVkIGltbWVkaWF0ZWx5IGF0CisgICAgICogdGhlIHZpZXcsIGl0IHdpbGwgYmUgYWxsb3dlZC4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBQQVJFTlRfU0FWRV9ESVNBQkxFRCA9IDB4MjAwMDAwMDA7CisKKyAgICAvKioKKyAgICAgKiA8cD5NYXNrIGZvciB1c2Ugd2l0aCBzZXRGbGFncyBpbmRpY2F0aW5nIGJpdHMgdXNlZCBmb3IgUEFSRU5UX1NBVkVfRElTQUJMRUQuPC9wPgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFBBUkVOVF9TQVZFX0RJU0FCTEVEX01BU0sgPSAweDIwMDAwMDAwOworCisgICAgLyoqCiAgICAgICogVmlldyBmbGFnIGluZGljYXRpbmcgd2hldGhlciB7QGxpbmsgI2FkZEZvY3VzYWJsZXMoQXJyYXlMaXN0LCBpbnQsIGludCl9CiAgICAgICogc2hvdWxkIGFkZCBhbGwgZm9jdXNhYmxlIFZpZXdzIHJlZ2FyZGxlc3MgaWYgdGhleSBhcmUgZm9jdXNhYmxlIGluIHRvdWNoIG1vZGUuCiAgICAgICovCkBAIC0xNTIxLDM4ICsxNTM4LDEyIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFXQUtFTl9TQ1JPTExfQkFSU19PTl9BVFRBQ0ggPSAweDA4MDAwMDAwOwogCiAgICAgLyoqCi0gICAgICogQWx3YXlzIGFsbG93IGEgdXNlciB0byBvdmVyc2Nyb2xsIHRoaXMgdmlldywgcHJvdmlkZWQgaXQgaXMgYQotICAgICAqIHZpZXcgdGhhdCBjYW4gc2Nyb2xsLgorICAgICAqIEluZGljYXRlcyB0aGF0IHBpdm90WCBvciBwaXZvdFkgd2VyZSBleHBsaWNpdGx5IHNldCBhbmQgd2Ugc2hvdWxkIG5vdCBhc3N1bWUgdGhlIGNlbnRlcgorICAgICAqIGZvciB0cmFuc2Zvcm0gb3BlcmF0aW9ucwogICAgICAqCi0gICAgICogQHNlZSAjZ2V0T3ZlcnNjcm9sbE1vZGUoKQotICAgICAqIEBzZWUgI3NldE92ZXJzY3JvbGxNb2RlKGludCkKKyAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9WRVJTQ1JPTExfQUxXQVlTID0gMDsKLQotICAgIC8qKgotICAgICAqIEFsbG93IGEgdXNlciB0byBvdmVyc2Nyb2xsIHRoaXMgdmlldyBvbmx5IGlmIHRoZSBjb250ZW50IGlzIGxhcmdlCi0gICAgICogZW5vdWdoIHRvIG1lYW5pbmdmdWxseSBzY3JvbGwsIHByb3ZpZGVkIGl0IGlzIGEgdmlldyB0aGF0IGNhbiBzY3JvbGwuCi0gICAgICoKLSAgICAgKiBAc2VlICNnZXRPdmVyc2Nyb2xsTW9kZSgpCi0gICAgICogQHNlZSAjc2V0T3ZlcnNjcm9sbE1vZGUoaW50KQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTID0gMTsKLQotICAgIC8qKgotICAgICAqIE5ldmVyIGFsbG93IGEgdXNlciB0byBvdmVyc2Nyb2xsIHRoaXMgdmlldy4KLSAgICAgKgotICAgICAqIEBzZWUgI2dldE92ZXJzY3JvbGxNb2RlKCkKLSAgICAgKiBAc2VlICNzZXRPdmVyc2Nyb2xsTW9kZShpbnQpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUlNDUk9MTF9ORVZFUiA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBDb250cm9scyB0aGUgb3ZlcnNjcm9sbCBtb2RlIGZvciB0aGlzIHZpZXcuCi0gICAgICogU2VlIHtAbGluayAjb3ZlcnNjcm9sbEJ5KGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBib29sZWFuKX0sCi0gICAgICoge0BsaW5rICNPVkVSU0NST0xMX0FMV0FZU30sIHtAbGluayAjT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFN9LAotICAgICAqIGFuZCB7QGxpbmsgI09WRVJTQ1JPTExfTkVWRVJ9LgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1PdmVyc2Nyb2xsTW9kZSA9IE9WRVJTQ1JPTExfQUxXQVlTOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSVZPVF9FWFBMSUNJVExZX1NFVCA9IDB4MTAwMDAwMDA7CiAKICAgICAvKioKICAgICAgKiBUaGUgcGFyZW50IHRoaXMgdmlldyBpcyBhdHRhY2hlZCB0by4KQEAgLTE2MDUsNiArMTU5NiwxMzUgQEAKICAgICBpbnQgbVZpZXdGbGFnczsKIAogICAgIC8qKgorICAgICAqIFRoZSB0cmFuc2Zvcm0gbWF0cml4IGZvciB0aGUgVmlldy4gVGhpcyB0cmFuc2Zvcm0gaXMgY2FsY3VsYXRlZCBpbnRlcm5hbGx5CisgICAgICogYmFzZWQgb24gdGhlIHJvdGF0aW9uLCBzY2FsZVgsIGFuZCBzY2FsZVkgcHJvcGVydGllcy4gVGhlIGlkZW50aXR5IG1hdHJpeAorICAgICAqIGlzIHVzZWQgYnkgZGVmYXVsdC4gRG8gKm5vdCogdXNlIHRoaXMgdmFyaWFibGUgZGlyZWN0bHk7IGluc3RlYWQgY2FsbAorICAgICAqIGdldE1hdHJpeCgpLCB3aGljaCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVjYWxjdWxhdGUgdGhlIG1hdHJpeCBpZiBuZWNlc3NhcnkKKyAgICAgKiB0byBnZXQgdGhlIGNvcnJlY3QgbWF0cml4IGJhc2VkIG9uIHRoZSBsYXRlc3Qgcm90YXRpb24gYW5kIHNjYWxlIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBNYXRyaXggbU1hdHJpeCA9IG5ldyBNYXRyaXgoKTsKKworICAgIC8qKgorICAgICAqIFRoZSB0cmFuc2Zvcm0gbWF0cml4IGZvciB0aGUgVmlldy4gVGhpcyB0cmFuc2Zvcm0gaXMgY2FsY3VsYXRlZCBpbnRlcm5hbGx5CisgICAgICogYmFzZWQgb24gdGhlIHJvdGF0aW9uLCBzY2FsZVgsIGFuZCBzY2FsZVkgcHJvcGVydGllcy4gVGhlIGlkZW50aXR5IG1hdHJpeAorICAgICAqIGlzIHVzZWQgYnkgZGVmYXVsdC4gRG8gKm5vdCogdXNlIHRoaXMgdmFyaWFibGUgZGlyZWN0bHk7IGluc3RlYWQgY2FsbAorICAgICAqIGdldE1hdHJpeCgpLCB3aGljaCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVjYWxjdWxhdGUgdGhlIG1hdHJpeCBpZiBuZWNlc3NhcnkKKyAgICAgKiB0byBnZXQgdGhlIGNvcnJlY3QgbWF0cml4IGJhc2VkIG9uIHRoZSBsYXRlc3Qgcm90YXRpb24gYW5kIHNjYWxlIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBNYXRyaXggbUludmVyc2VNYXRyaXg7CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlcm5hbCB2YXJpYWJsZSB0aGF0IHRyYWNrcyB3aGV0aGVyIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlCisgICAgICogdHJhbnNmb3JtIG1hdHJpeCwgYmFzZWQgb24gd2hldGhlciB0aGUgcm90YXRpb24gb3Igc2NhbGVYL1kgcHJvcGVydGllcworICAgICAqIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbWF0cml4IHdhcyBsYXN0IGNhbGN1bGF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1NYXRyaXhEaXJ0eSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQW4gaW50ZXJuYWwgdmFyaWFibGUgdGhhdCB0cmFja3Mgd2hldGhlciB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZQorICAgICAqIHRyYW5zZm9ybSBtYXRyaXgsIGJhc2VkIG9uIHdoZXRoZXIgdGhlIHJvdGF0aW9uIG9yIHNjYWxlWC9ZIHByb3BlcnRpZXMKKyAgICAgKiBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIG1hdHJpeCB3YXMgbGFzdCBjYWxjdWxhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtSW52ZXJzZU1hdHJpeERpcnR5ID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIEEgdmFyaWFibGUgdGhhdCB0cmFja3Mgd2hldGhlciB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZQorICAgICAqIHRyYW5zZm9ybSBtYXRyaXgsIGJhc2VkIG9uIHdoZXRoZXIgdGhlIHJvdGF0aW9uIG9yIHNjYWxlWC9ZIHByb3BlcnRpZXMKKyAgICAgKiBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIG1hdHJpeCB3YXMgbGFzdCBjYWxjdWxhdGVkLiBUaGlzIHZhcmlhYmxlCisgICAgICogaXMgb25seSB2YWxpZCBhZnRlciBhIGNhbGwgdG8gZ2V0TWF0cml4KCkuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1NYXRyaXhJc0lkZW50aXR5ID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFRoZSBDYW1lcmEgb2JqZWN0IGlzIHVzZWQgdG8gY29tcHV0ZSBhIDNEIG1hdHJpeCB3aGVuIHJvdGF0aW9uWCBvciByb3RhdGlvblkgYXJlIHNldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIENhbWVyYSBtQ2FtZXJhID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWF0cml4IGlzIHVzZWQgd2hlbiBjb21wdXRpbmcgdGhlIG1hdHJpeCBmb3IgM0Qgcm90YXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgTWF0cml4IG1hdHJpeDNEID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZXNlIHByZXYgdmFsdWVzIGFyZSB1c2VkIHRvIHJlY2FsY3VsYXRlIGEgY2VudGVyZWQgcGl2b3QgcG9pbnQgd2hlbiBuZWNlc3NhcnkuIFRoZQorICAgICAqIHBpdm90IHBvaW50IGlzIG9ubHkgdXNlZCBpbiBtYXRyaXggb3BlcmF0aW9ucyAod2hlbiByb3RhdGlvbiwgc2NhbGUsIG9yIHRyYW5zbGF0aW9uIGFyZQorICAgICAqIHNldCksIHNvIHRoZXMgdmFsdWVzIGFyZSBvbmx5IHVzZWQgdGhlbiBhcyB3ZWxsLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1QcmV2V2lkdGggPSAtMTsKKyAgICBwcml2YXRlIGludCBtUHJldkhlaWdodCA9IC0xOworCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgdmFsdWUgdG8gY2hlY2sgZm9yIGZsb2F0IHZhbHVlcyB0aGF0IGFyZSBjbG9zZSBlbm91Z2ggdG8gemVybyB0byBiZSBjb25zaWRlcmVkCisgICAgICogemVyby4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBOT05aRVJPX0VQU0lMT04gPSAuMDAxZjsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWdyZWVzIHJvdGF0aW9uIGFyb3VuZCB0aGUgdmVydGljYWwgYXhpcyB0aHJvdWdoIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1Sb3RhdGlvblkgPSAwZjsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWdyZWVzIHJvdGF0aW9uIGFyb3VuZCB0aGUgaG9yaXpvbnRhbCBheGlzIHRocm91Z2ggdGhlIHBpdm90IHBvaW50LgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVJvdGF0aW9uWCA9IDBmOworCisgICAgLyoqCisgICAgICogVGhlIGRlZ3JlZXMgcm90YXRpb24gYXJvdW5kIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1Sb3RhdGlvbiA9IDBmOworCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0cmFuc2xhdGlvbiBvZiB0aGUgb2JqZWN0IGF3YXkgZnJvbSBpdHMgbGVmdCBwcm9wZXJ0eSAocG9zdC1sYXlvdXQpLgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVRyYW5zbGF0aW9uWCA9IDBmOworCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0cmFuc2xhdGlvbiBvZiB0aGUgb2JqZWN0IGF3YXkgZnJvbSBpdHMgdG9wIHByb3BlcnR5IChwb3N0LWxheW91dCkuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtVHJhbnNsYXRpb25ZID0gMGY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHNjYWxlIGluIHRoZSB4IGRpcmVjdGlvbiBhcm91bmQgdGhlIHBpdm90IHBvaW50LiBBCisgICAgICogdmFsdWUgb2YgMSBtZWFucyBubyBzY2FsaW5nIGlzIGFwcGxpZWQuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtU2NhbGVYID0gMWY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHNjYWxlIGluIHRoZSB5IGRpcmVjdGlvbiBhcm91bmQgdGhlIHBpdm90IHBvaW50LiBBCisgICAgICogdmFsdWUgb2YgMSBtZWFucyBubyBzY2FsaW5nIGlzIGFwcGxpZWQuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtU2NhbGVZID0gMWY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHNjYWxlIGluIHRoZSB4IGRpcmVjdGlvbiBhcm91bmQgdGhlIHBpdm90IHBvaW50LiBBCisgICAgICogdmFsdWUgb2YgMSBtZWFucyBubyBzY2FsaW5nIGlzIGFwcGxpZWQuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtUGl2b3RYID0gMGY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHNjYWxlIGluIHRoZSB5IGRpcmVjdGlvbiBhcm91bmQgdGhlIHBpdm90IHBvaW50LiBBCisgICAgICogdmFsdWUgb2YgMSBtZWFucyBubyBzY2FsaW5nIGlzIGFwcGxpZWQuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtUGl2b3RZID0gMGY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3BhY2l0eSBvZiB0aGUgVmlldy4gVGhpcyBpcyBhIHZhbHVlIGZyb20gMCB0byAxLCB3aGVyZSAwIG1lYW5zCisgICAgICogY29tcGxldGVseSB0cmFuc3BhcmVudCBhbmQgMSBtZWFucyBjb21wbGV0ZWx5IG9wYXF1ZS4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1BbHBoYSA9IDFmOworCisgICAgLyoqCiAgICAgICogVGhlIGRpc3RhbmNlIGluIHBpeGVscyBmcm9tIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhpcyB2aWV3J3MgcGFyZW50CiAgICAgICogdG8gdGhlIGxlZnQgZWRnZSBvZiB0aGlzIHZpZXcuCiAgICAgICoge0BoaWRlfQpAQCAtMTc1Myw4ICsxODczLDggQEAKIAogICAgIHByaXZhdGUgaW50W10gbURyYXdhYmxlU3RhdGUgPSBudWxsOwogCi0gICAgcHJpdmF0ZSBTb2Z0UmVmZXJlbmNlPEJpdG1hcD4gbURyYXdpbmdDYWNoZTsKLSAgICBwcml2YXRlIFNvZnRSZWZlcmVuY2U8Qml0bWFwPiBtVW5zY2FsZWREcmF3aW5nQ2FjaGU7CisgICAgcHJpdmF0ZSBCaXRtYXAgbURyYXdpbmdDYWNoZTsKKyAgICBwcml2YXRlIEJpdG1hcCBtVW5zY2FsZWREcmF3aW5nQ2FjaGU7CiAKICAgICAvKioKICAgICAgKiBXaGVuIHRoaXMgdmlldyBoYXMgZm9jdXMgYW5kIHRoZSBuZXh0IGZvY3VzIGlzIHtAbGluayAjRk9DVVNfTEVGVH0sCkBAIC0xOTExLDcgKzIwMzEsNiBAQAogCiAgICAgICAgIGludCBzY3JvbGxiYXJTdHlsZSA9IFNDUk9MTEJBUlNfSU5TSURFX09WRVJMQVk7CiAKLSAgICAgICAgaW50IG92ZXJzY3JvbGxNb2RlID0gbU92ZXJzY3JvbGxNb2RlOwogICAgICAgICBmaW5hbCBpbnQgTiA9IGEuZ2V0SW5kZXhDb3VudCgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgICAgICAgaW50IGF0dHIgPSBhLmdldEluZGV4KGkpOwpAQCAtMjExMSwxNCArMjIzMCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFIuc3R5bGVhYmxlLlZpZXdfb3ZlcnNjcm9sbE1vZGU6Ci0gICAgICAgICAgICAgICAgICAgIG92ZXJzY3JvbGxNb2RlID0gYS5nZXRJbnQoYXR0ciwgT1ZFUlNDUk9MTF9BTFdBWVMpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHNldE92ZXJzY3JvbGxNb2RlKG92ZXJzY3JvbGxNb2RlKTsKLQogICAgICAgICBpZiAoYmFja2dyb3VuZCAhPSBudWxsKSB7CiAgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kRHJhd2FibGUoYmFja2dyb3VuZCk7CiAgICAgICAgIH0KQEAgLTI0ODQsNiArMjU5OCwxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFN0YXJ0IGFuIGFjdGlvbiBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIENhbGxiYWNrIHRoYXQgd2lsbCBjb250cm9sIHRoZSBsaWZlY3ljbGUgb2YgdGhlIGFjdGlvbiBtb2RlCisgICAgICogQHJldHVybiBUaGUgbmV3IGFjdGlvbiBtb2RlIGlmIGl0IGlzIHN0YXJ0ZWQsIG51bGwgb3RoZXJ3aXNlCisgICAgICoKKyAgICAgKiBAc2VlIEFjdGlvbk1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGUoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQodGhpcywgY2FsbGJhY2spOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGEga2V5IGlzIHByZXNzZWQgaW4gdGhpcyB2aWV3LgogICAgICAqIEBwYXJhbSBsIHRoZSBrZXkgbGlzdGVuZXIgdG8gYXR0YWNoIHRvIHRoaXMgdmlldwogICAgICAqLwpAQCAtMzMxMyw3ICszNDM5LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwcmVzc2VkIHRoYXQgZm9yIHRoaXMgdmlldy4KKyAgICAgKiBTZXRzIHRoZSBwcmVzc2VkIHN0YXRlIGZvciB0aGlzIHZpZXcuCiAgICAgICoKICAgICAgKiBAc2VlICNpc0NsaWNrYWJsZSgpCiAgICAgICogQHNlZSAjc2V0Q2xpY2thYmxlKGJvb2xlYW4pCkBAIC0zMzkxLDYgKzM1MTcsMzggQEAKIAogCiAgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVudGlyZSBoaWVyYXJjaHkgdW5kZXIgdGhpcyB2aWV3IHdpbGwgc2F2ZSBpdHMKKyAgICAgKiBzdGF0ZSB3aGVuIGEgc3RhdGUgc2F2aW5nIHRyYXZlcnNhbCBvY2N1cnMgZnJvbSBpdHMgcGFyZW50LiAgVGhlIGRlZmF1bHQKKyAgICAgKiBpcyB0cnVlOyBpZiBmYWxzZSwgdGhlc2Ugdmlld3Mgd2lsbCBub3QgYmUgc2F2ZWQgdW5sZXNzCisgICAgICoge0BsaW5rICNzYXZlSGllcmFyY2h5U3RhdGUoU3BhcnNlQXJyYXkpfSBpcyBjYWxsZWQgZGlyZWN0bHkgb24gdGhpcyB2aWV3LgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIHZpZXcgc3RhdGUgc2F2aW5nIGZyb20gcGFyZW50IGlzIGVuYWJsZWQsIGVsc2UgZmFsc2UuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTYXZlRnJvbVBhcmVudEVuYWJsZWQoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVGcm9tUGFyZW50RW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIChtVmlld0ZsYWdzICYgUEFSRU5UX1NBVkVfRElTQUJMRURfTUFTSykgIT0gUEFSRU5UX1NBVkVfRElTQUJMRUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgZW50aXJlIGhpZXJhcmNoeSB1bmRlciB0aGlzIHZpZXcgd2lsbCBzYXZlIGl0cworICAgICAqIHN0YXRlIHdoZW4gYSBzdGF0ZSBzYXZpbmcgdHJhdmVyc2FsIG9jY3VycyBmcm9tIGl0cyBwYXJlbnQuICBUaGUgZGVmYXVsdAorICAgICAqIGlzIHRydWU7IGlmIGZhbHNlLCB0aGVzZSB2aWV3cyB3aWxsIG5vdCBiZSBzYXZlZCB1bmxlc3MKKyAgICAgKiB7QGxpbmsgI3NhdmVIaWVyYXJjaHlTdGF0ZShTcGFyc2VBcnJheSl9IGlzIGNhbGxlZCBkaXJlY3RseSBvbiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCBTZXQgdG8gZmFsc2UgdG8gPGVtPmRpc2FibGU8L2VtPiBzdGF0ZSBzYXZpbmcsIG9yIHRydWUKKyAgICAgKiAodGhlIGRlZmF1bHQpIHRvIGFsbG93IGl0LgorICAgICAqCisgICAgICogQHNlZSAjaXNTYXZlRnJvbVBhcmVudEVuYWJsZWQoKQorICAgICAqIEBzZWUgI3NldElkKGludCkKKyAgICAgKiBAc2VlICNvblNhdmVJbnN0YW5jZVN0YXRlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTYXZlRnJvbVBhcmVudEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIHNldEZsYWdzKGVuYWJsZWQgPyAwIDogUEFSRU5UX1NBVkVfRElTQUJMRUQsIFBBUkVOVF9TQVZFX0RJU0FCTEVEX01BU0spOworICAgIH0KKworCisgICAgLyoqCiAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgVmlldyBpcyBhYmxlIHRvIHRha2UgZm9jdXMuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyB2aWV3IGNhbiB0YWtlIGZvY3VzLCBvciBmYWxzZSBvdGhlcndpc2UuCkBAIC00NDEzLDkgKzQ1NzEsNyBAQAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgeSA9IChpbnQpIGV2ZW50LmdldFkoKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBCZSBsZW5pZW50IGFib3V0IG1vdmluZyBvdXRzaWRlIG9mIGJ1dHRvbnMKLSAgICAgICAgICAgICAgICAgICAgaW50IHNsb3AgPSBtVG91Y2hTbG9wOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHggPCAwIC0gc2xvcCkgfHwgKHggPj0gZ2V0V2lkdGgoKSArIHNsb3ApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHkgPCAwIC0gc2xvcCkgfHwgKHkgPj0gZ2V0SGVpZ2h0KCkgKyBzbG9wKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXBvaW50SW5WaWV3KHgsIHksIG1Ub3VjaFNsb3ApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdXRzaWRlIGJ1dHRvbgogICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVGFwQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobVByaXZhdGVGbGFncyAmIFBSRVNTRUQpICE9IDApIHsKQEAgLTQ3NjEsNiArNDkxNywzNDQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNmb3JtIG1hdHJpeCBvZiB0aGlzIHZpZXcsIHdoaWNoIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQKKyAgICAgKiByb2F0aW9uLCBzY2FsZSwgYW5kIHBpdm90IHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRSb3RhdGlvbigpCisgICAgICogQHNlZSAjZ2V0U2NhbGVYKCkKKyAgICAgKiBAc2VlICNnZXRTY2FsZVkoKQorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHRyYW5zZm9ybSBtYXRyaXggZm9yIHRoZSB2aWV3CisgICAgICovCisgICAgcHVibGljIE1hdHJpeCBnZXRNYXRyaXgoKSB7CisgICAgICAgIGhhc0lkZW50aXR5TWF0cml4KCk7CisgICAgICAgIHJldHVybiBtTWF0cml4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBpcyBmYXIgZW5vdWdoIGF3YXkgZnJvbSB6ZXJvIHRvIGJlCisgICAgICogY29uc2lkZXJlZCBub24temVyby4KKyAgICAgKiBAcGFyYW0gdmFsdWUgQSBmbG9hdGluZyBwb2ludCB2YWx1ZSB0byBjaGVjayBmb3IgemVyby1uZXNzCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBwYXNzZWQtaW4gdmFsdWUgaXMgZmFyIGVub3VnaCBhd2F5IGZyb20gemVybyB0byBiZSBjb25zaWRlcmVkIG5vbi16ZXJvCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBub256ZXJvKGZsb2F0IHZhbHVlKSB7CisgICAgICAgIHJldHVybiAodmFsdWUgPCAtTk9OWkVST19FUFNJTE9OIHx8IHZhbHVlID4gTk9OWkVST19FUFNJTE9OKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNvbXB1dGVzIHRoZSB0cmFuc2Zvcm0gbWF0cml4IGlmIG5lY2Vzc2FyeS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHRyYW5zZm9ybSBtYXRyaXggaXMgdGhlIGlkZW50aXR5IG1hdHJpeCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gaGFzSWRlbnRpdHlNYXRyaXgoKSB7CisgICAgICAgIGlmIChtTWF0cml4RGlydHkpIHsKKyAgICAgICAgICAgIC8vIHRyYW5zZm9ybS1yZWxhdGVkIHByb3BlcnRpZXMgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgc29tZW9uZQorICAgICAgICAgICAgLy8gYXNrZWQgZm9yIHRoZSBtYXRyaXg7IHJlY2FsY3VsYXRlIGl0IHdpdGggdGhlIGN1cnJlbnQgdmFsdWVzCisKKyAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHBpdm90IHBvaW50CisgICAgICAgICAgICBpZiAoKG1Qcml2YXRlRmxhZ3MgJiBQSVZPVF9FWFBMSUNJVExZX1NFVCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICgobVJpZ2h0IC0gbUxlZnQpICE9IG1QcmV2V2lkdGggJiYgKG1Cb3R0b20gLSBtVG9wKSAhPSBtUHJldkhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBtUHJldldpZHRoID0gbVJpZ2h0IC0gbUxlZnQ7CisgICAgICAgICAgICAgICAgICAgIG1QcmV2SGVpZ2h0ID0gbUJvdHRvbSAtIG1Ub3A7CisgICAgICAgICAgICAgICAgICAgIG1QaXZvdFggPSAoZmxvYXQpIG1QcmV2V2lkdGggLyAyZjsKKyAgICAgICAgICAgICAgICAgICAgbVBpdm90WSA9IChmbG9hdCkgbVByZXZIZWlnaHQgLyAyZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWF0cml4LnJlc2V0KCk7CisgICAgICAgICAgICBtTWF0cml4LnNldFRyYW5zbGF0ZShtVHJhbnNsYXRpb25YLCBtVHJhbnNsYXRpb25ZKTsKKyAgICAgICAgICAgIG1NYXRyaXgucHJlUm90YXRlKG1Sb3RhdGlvbiwgbVBpdm90WCwgbVBpdm90WSk7CisgICAgICAgICAgICBtTWF0cml4LnByZVNjYWxlKG1TY2FsZVgsIG1TY2FsZVksIG1QaXZvdFgsIG1QaXZvdFkpOworICAgICAgICAgICAgaWYgKG5vbnplcm8obVJvdGF0aW9uWCkgfHwgbm9uemVybyhtUm90YXRpb25ZKSkgeworICAgICAgICAgICAgICAgIGlmIChtQ2FtZXJhID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYSA9IG5ldyBDYW1lcmEoKTsKKyAgICAgICAgICAgICAgICAgICAgbWF0cml4M0QgPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYW1lcmEuc2F2ZSgpOworICAgICAgICAgICAgICAgIG1DYW1lcmEucm90YXRlWChtUm90YXRpb25YKTsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLnJvdGF0ZVkobVJvdGF0aW9uWSk7CisgICAgICAgICAgICAgICAgbUNhbWVyYS5nZXRNYXRyaXgobWF0cml4M0QpOworICAgICAgICAgICAgICAgIG1hdHJpeDNELnByZVRyYW5zbGF0ZSgtbVBpdm90WCwgLW1QaXZvdFkpOworICAgICAgICAgICAgICAgIG1hdHJpeDNELnBvc3RUcmFuc2xhdGUobVBpdm90WCwgbVBpdm90WSk7CisgICAgICAgICAgICAgICAgbU1hdHJpeC5wb3N0Q29uY2F0KG1hdHJpeDNEKTsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IGZhbHNlOworICAgICAgICAgICAgbU1hdHJpeElzSWRlbnRpdHkgPSBtTWF0cml4LmlzSWRlbnRpdHkoKTsKKyAgICAgICAgICAgIG1JbnZlcnNlTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtTWF0cml4SXNJZGVudGl0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byByZXRyaWV2ZSB0aGUgaW52ZXJzZSBvZiB0aGUgY3VycmVudCBtTWF0cml4IHByb3BlcnR5LgorICAgICAqIFdlIGNhY2hlIHRoZSBtYXRyaXggdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdCB3aGVuIHRyYW5zZm9ybSBwcm9wZXJ0aWVzCisgICAgICogaGF2ZSBub3QgY2hhbmdlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGludmVyc2Ugb2YgdGhlIGN1cnJlbnQgbWF0cml4IG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBNYXRyaXggZ2V0SW52ZXJzZU1hdHJpeCgpIHsKKyAgICAgICAgaWYgKG1JbnZlcnNlTWF0cml4RGlydHkpIHsKKyAgICAgICAgICAgIGlmIChtSW52ZXJzZU1hdHJpeCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUludmVyc2VNYXRyaXggPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWF0cml4LmludmVydChtSW52ZXJzZU1hdHJpeCk7CisgICAgICAgICAgICBtSW52ZXJzZU1hdHJpeERpcnR5ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JbnZlcnNlTWF0cml4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWdyZWVzIHRoYXQgdGhlIHZpZXcgaXMgcm90YXRlZCBhcm91bmQgdGhlIHBpdm90IHBvaW50LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIGRlZ3JlZXMgb2Ygcm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFJvdGF0aW9uKCkgeworICAgICAgICByZXR1cm4gbVJvdGF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlZ3JlZXMgdGhhdCB0aGUgdmlldyBpcyByb3RhdGVkIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm90YXRpb24gVGhlIGRlZ3JlZXMgb2Ygcm90YXRpb24uCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvdGF0aW9uKGZsb2F0IHJvdGF0aW9uKSB7CisgICAgICAgIGlmIChtUm90YXRpb24gIT0gcm90YXRpb24pIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtUm90YXRpb24gPSByb3RhdGlvbjsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWdyZWVzIHRoYXQgdGhlIHZpZXcgaXMgcm90YXRlZCBhcm91bmQgdGhlIHZlcnRpY2FsIGF4aXMgdGhyb3VnaCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICogQHJldHVybiBUaGUgZGVncmVlcyBvZiBZIHJvdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRSb3RhdGlvblkoKSB7CisgICAgICAgIHJldHVybiBtUm90YXRpb25ZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlZ3JlZXMgdGhhdCB0aGUgdmlldyBpcyByb3RhdGVkIGFyb3VuZCB0aGUgdmVydGljYWwgYXhpcyB0aHJvdWdoIHBpdm90IHBvaW50LgorICAgICAqCisgICAgICogQHBhcmFtIHJvdGF0aW9uWSBUaGUgZGVncmVlcyBvZiBZIHJvdGF0aW9uLgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb3RhdGlvblkoZmxvYXQgcm90YXRpb25ZKSB7CisgICAgICAgIGlmIChtUm90YXRpb25ZICE9IHJvdGF0aW9uWSkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG1Sb3RhdGlvblkgPSByb3RhdGlvblk7CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVncmVlcyB0aGF0IHRoZSB2aWV3IGlzIHJvdGF0ZWQgYXJvdW5kIHRoZSBob3Jpem9udGFsIGF4aXMgdGhyb3VnaCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICogQHJldHVybiBUaGUgZGVncmVlcyBvZiBYIHJvdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRSb3RhdGlvblgoKSB7CisgICAgICAgIHJldHVybiBtUm90YXRpb25YOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlZ3JlZXMgdGhhdCB0aGUgdmlldyBpcyByb3RhdGVkIGFyb3VuZCB0aGUgaG9yaXpvbnRhbCBheGlzIHRocm91Z2ggcGl2b3QgcG9pbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm90YXRpb25YIFRoZSBkZWdyZWVzIG9mIFggcm90YXRpb24uCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvdGF0aW9uWChmbG9hdCByb3RhdGlvblgpIHsKKyAgICAgICAgaWYgKG1Sb3RhdGlvblggIT0gcm90YXRpb25YKSB7CisgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVJvdGF0aW9uWCA9IHJvdGF0aW9uWDsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgdGhhdCB0aGUgdmlldyBpcyBzY2FsZWQgaW4geCBhcm91bmQgdGhlIHBpdm90IHBvaW50LCBhcyBhIHByb3BvcnRpb24gb2YKKyAgICAgKiB0aGUgdmlldydzIHVuc2NhbGVkIHdpZHRoLiBBIHZhbHVlIG9mIDEsIHRoZSBkZWZhdWx0LCBtZWFucyB0aGF0IG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKgorICAgICAqIEBkZWZhdWx0IDEuMGYKKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICogQHJldHVybiBUaGUgc2NhbGluZyBmYWN0b3IuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFNjYWxlWCgpIHsKKyAgICAgICAgcmV0dXJuIG1TY2FsZVg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYW1vdW50IHRoYXQgdGhlIHZpZXcgaXMgc2NhbGVkIGluIHggYXJvdW5kIHRoZSBwaXZvdCBwb2ludCwgYXMgYSBwcm9wb3J0aW9uIG9mCisgICAgICogdGhlIHZpZXcncyB1bnNjYWxlZCB3aWR0aC4gQSB2YWx1ZSBvZiAxIG1lYW5zIHRoYXQgbm8gc2NhbGluZyBpcyBhcHBsaWVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNjYWxlWCBUaGUgc2NhbGluZyBmYWN0b3IuCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjYWxlWChmbG9hdCBzY2FsZVgpIHsKKyAgICAgICAgaWYgKG1TY2FsZVggIT0gc2NhbGVYKSB7CisgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVNjYWxlWCA9IHNjYWxlWDsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgdGhhdCB0aGUgdmlldyBpcyBzY2FsZWQgaW4geSBhcm91bmQgdGhlIHBpdm90IHBvaW50LCBhcyBhIHByb3BvcnRpb24gb2YKKyAgICAgKiB0aGUgdmlldydzIHVuc2NhbGVkIGhlaWdodC4gQSB2YWx1ZSBvZiAxLCB0aGUgZGVmYXVsdCwgbWVhbnMgdGhhdCBubyBzY2FsaW5nIGlzIGFwcGxpZWQuCisgICAgICoKKyAgICAgKiBAZGVmYXVsdCAxLjBmCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIHNjYWxpbmcgZmFjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRTY2FsZVkoKSB7CisgICAgICAgIHJldHVybiBtU2NhbGVZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGFtb3VudCB0aGF0IHRoZSB2aWV3IGlzIHNjYWxlZCBpbiBZIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQsIGFzIGEgcHJvcG9ydGlvbiBvZgorICAgICAqIHRoZSB2aWV3J3MgdW5zY2FsZWQgd2lkdGguIEEgdmFsdWUgb2YgMSBtZWFucyB0aGF0IG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY2FsZVkgVGhlIHNjYWxpbmcgZmFjdG9yLgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2FsZVkoZmxvYXQgc2NhbGVZKSB7CisgICAgICAgIGlmIChtU2NhbGVZICE9IHNjYWxlWSkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG1TY2FsZVkgPSBzY2FsZVk7CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgeCBsb2NhdGlvbiBvZiB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSB2aWV3IGlzIHtAbGluayAjc2V0Um90YXRpb24oZmxvYXQpIHJvdGF0ZWR9CisgICAgICogYW5kIHtAbGluayAjc2V0U2NhbGVYKGZsb2F0KSBzY2FsZWR9LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Um90YXRpb24oKQorICAgICAqIEBzZWUgI2dldFNjYWxlWCgpCisgICAgICogQHNlZSAjZ2V0U2NhbGVZKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIHggbG9jYXRpb24gb2YgdGhlIHBpdm90IHBvaW50LgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRQaXZvdFgoKSB7CisgICAgICAgIHJldHVybiBtUGl2b3RYOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHggbG9jYXRpb24gb2YgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB0aGUgdmlldyBpcworICAgICAqIHtAbGluayAjc2V0Um90YXRpb24oZmxvYXQpIHJvdGF0ZWR9IGFuZCB7QGxpbmsgI3NldFNjYWxlWChmbG9hdCkgc2NhbGVkfS4KKyAgICAgKiBCeSBkZWZhdWx0LCB0aGUgcGl2b3QgcG9pbnQgaXMgY2VudGVyZWQgb24gdGhlIG9iamVjdC4KKyAgICAgKiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgZGlzYWJsZXMgdGhpcyBiZWhhdmlvciBhbmQgY2F1c2VzIHRoZSB2aWV3IHRvIHVzZSBvbmx5IHRoZQorICAgICAqIGV4cGxpY2l0bHkgc2V0IHBpdm90WCBhbmQgcGl2b3RZIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwaXZvdFggVGhlIHggbG9jYXRpb24gb2YgdGhlIHBpdm90IHBvaW50LgorICAgICAqIEBzZWUgI2dldFJvdGF0aW9uKCkKKyAgICAgKiBAc2VlICNnZXRTY2FsZVgoKQorICAgICAqIEBzZWUgI2dldFNjYWxlWSgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQaXZvdFgoZmxvYXQgcGl2b3RYKSB7CisgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gUElWT1RfRVhQTElDSVRMWV9TRVQ7CisgICAgICAgIGlmIChtUGl2b3RYICE9IHBpdm90WCkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG1QaXZvdFggPSBwaXZvdFg7CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgeSBsb2NhdGlvbiBvZiB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSB2aWV3IGlzIHtAbGluayAjc2V0Um90YXRpb24oZmxvYXQpIHJvdGF0ZWR9CisgICAgICogYW5kIHtAbGluayAjc2V0U2NhbGVZKGZsb2F0KSBzY2FsZWR9LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Um90YXRpb24oKQorICAgICAqIEBzZWUgI2dldFNjYWxlWCgpCisgICAgICogQHNlZSAjZ2V0U2NhbGVZKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIHkgbG9jYXRpb24gb2YgdGhlIHBpdm90IHBvaW50LgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRQaXZvdFkoKSB7CisgICAgICAgIHJldHVybiBtUGl2b3RZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHkgbG9jYXRpb24gb2YgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB0aGUgdmlldyBpcyB7QGxpbmsgI3NldFJvdGF0aW9uKGZsb2F0KSByb3RhdGVkfQorICAgICAqIGFuZCB7QGxpbmsgI3NldFNjYWxlWShmbG9hdCkgc2NhbGVkfS4gQnkgZGVmYXVsdCwgdGhlIHBpdm90IHBvaW50IGlzIGNlbnRlcmVkIG9uIHRoZSBvYmplY3QuCisgICAgICogU2V0dGluZyB0aGlzIHByb3BlcnR5IGRpc2FibGVzIHRoaXMgYmVoYXZpb3IgYW5kIGNhdXNlcyB0aGUgdmlldyB0byB1c2Ugb25seSB0aGUKKyAgICAgKiBleHBsaWNpdGx5IHNldCBwaXZvdFggYW5kIHBpdm90WSB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGl2b3RZIFRoZSB5IGxvY2F0aW9uIG9mIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKiBAc2VlICNnZXRSb3RhdGlvbigpCisgICAgICogQHNlZSAjZ2V0U2NhbGVYKCkKKyAgICAgKiBAc2VlICNnZXRTY2FsZVkoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGl2b3RZKGZsb2F0IHBpdm90WSkgeworICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IFBJVk9UX0VYUExJQ0lUTFlfU0VUOworICAgICAgICBpZiAobVBpdm90WSAhPSBwaXZvdFkpIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtUGl2b3RZID0gcGl2b3RZOworICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG9wYWNpdHkgb2YgdGhlIHZpZXcuIFRoaXMgaXMgYSB2YWx1ZSBmcm9tIDAgdG8gMSwgd2hlcmUgMCBtZWFucyB0aGUgdmlldyBpcworICAgICAqIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgYW5kIDEgbWVhbnMgdGhlIHZpZXcgaXMgY29tcGxldGVseSBvcGFxdWUuCisgICAgICoKKyAgICAgKiBAZGVmYXVsdCAxLjBmCisgICAgICogQHJldHVybiBUaGUgb3BhY2l0eSBvZiB0aGUgdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0QWxwaGEoKSB7CisgICAgICAgIHJldHVybiBtQWxwaGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3BhY2l0eSBvZiB0aGUgdmlldy4gVGhpcyBpcyBhIHZhbHVlIGZyb20gMCB0byAxLCB3aGVyZSAwIG1lYW5zIHRoZSB2aWV3IGlzCisgICAgICogY29tcGxldGVseSB0cmFuc3BhcmVudCBhbmQgMSBtZWFucyB0aGUgdmlldyBpcyBjb21wbGV0ZWx5IG9wYXF1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbHBoYSBUaGUgb3BhY2l0eSBvZiB0aGUgdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbHBoYShmbG9hdCBhbHBoYSkgeworICAgICAgICBtQWxwaGEgPSBhbHBoYTsKKyAgICAgICAgaW52YWxpZGF0ZSgpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFRvcCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHBhcmVudC4KICAgICAgKgogICAgICAqIEByZXR1cm4gVGhlIHRvcCBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4KQEAgLTQ4MDEsMTIgKzUyOTUsMTM4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogVGhlIHZpc3VhbCB4IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlCisgICAgICoge0BsaW5rICNzZXRUcmFuc2xhdGlvblgoZmxvYXQpIHRyYW5zbGF0aW9uWH0gcHJvcGVydHkgcGx1cyB0aGUgY3VycmVudAorICAgICAqIHtAbGluayAjZ2V0TGVmdCgpIGxlZnR9IHByb3BlcnR5LiAKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHZpc3VhbCB4IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRYKCkgeworICAgICAgICByZXR1cm4gbUxlZnQgKyBtVHJhbnNsYXRpb25YOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZpc3VhbCB4IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gc2V0dGluZyB0aGUKKyAgICAgKiB7QGxpbmsgI3NldFRyYW5zbGF0aW9uWChmbG9hdCkgdHJhbnNsYXRpb25YfSBwcm9wZXJ0eSB0byBiZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCisgICAgICogdGhlIHggdmFsdWUgcGFzc2VkIGluIGFuZCB0aGUgY3VycmVudCB7QGxpbmsgI2dldExlZnQoKSBsZWZ0fSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4IFRoZSB2aXN1YWwgeCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRYKGZsb2F0IHgpIHsKKyAgICAgICAgc2V0VHJhbnNsYXRpb25YKHggLSBtTGVmdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHZpc3VhbCB5IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlCisgICAgICoge0BsaW5rICNzZXRUcmFuc2xhdGlvblkoZmxvYXQpIHRyYW5zbGF0aW9uWX0gcHJvcGVydHkgcGx1cyB0aGUgY3VycmVudAorICAgICAqIHtAbGluayAjZ2V0VG9wKCkgdG9wfSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHZpc3VhbCB5IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRZKCkgeworICAgICAgICByZXR1cm4gbVRvcCArIG1UcmFuc2xhdGlvblk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmlzdWFsIHkgcG9zaXRpb24gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIHRoZQorICAgICAqIHtAbGluayAjc2V0VHJhbnNsYXRpb25ZKGZsb2F0KSB0cmFuc2xhdGlvbll9IHByb3BlcnR5IHRvIGJlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKyAgICAgKiB0aGUgeSB2YWx1ZSBwYXNzZWQgaW4gYW5kIHRoZSBjdXJyZW50IHtAbGluayAjZ2V0VG9wKCkgdG9wfSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB5IFRoZSB2aXN1YWwgeSBwb3NpdGlvbiBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRZKGZsb2F0IHkpIHsKKyAgICAgICAgc2V0VHJhbnNsYXRpb25ZKHkgLSBtVG9wKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBob3Jpem9udGFsIGxvY2F0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMge0BsaW5rICNnZXRMZWZ0KCkgbGVmdH0gcG9zaXRpb24uCisgICAgICogVGhpcyBwb3NpdGlvbiBpcyBwb3N0LWxheW91dCwgaW4gYWRkaXRpb24gdG8gd2hlcmV2ZXIgdGhlIG9iamVjdCdzCisgICAgICogbGF5b3V0IHBsYWNlZCBpdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyBsZWZ0IHBvc2l0aW9uLCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFRyYW5zbGF0aW9uWCgpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFuc2xhdGlvblg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgaG9yaXpvbnRhbCBsb2NhdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHtAbGluayAjZ2V0TGVmdCgpIGxlZnR9IHBvc2l0aW9uLgorICAgICAqIFRoaXMgZWZmZWN0aXZlbHkgcG9zaXRpb25zIHRoZSBvYmplY3QgcG9zdC1sYXlvdXQsIGluIGFkZGl0aW9uIHRvIHdoZXJldmVyIHRoZSBvYmplY3QncworICAgICAqIGxheW91dCBwbGFjZWQgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNsYXRpb25YIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgbGVmdCBwb3NpdGlvbiwKKyAgICAgKiBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNsYXRpb25YKGZsb2F0IHRyYW5zbGF0aW9uWCkgeworICAgICAgICBpZiAobVRyYW5zbGF0aW9uWCAhPSB0cmFuc2xhdGlvblgpIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtVHJhbnNsYXRpb25YID0gdHJhbnNsYXRpb25YOworICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGhvcml6b250YWwgbG9jYXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyB7QGxpbmsgI2dldFRvcCgpIHRvcH0gcG9zaXRpb24uCisgICAgICogVGhpcyBwb3NpdGlvbiBpcyBwb3N0LWxheW91dCwgaW4gYWRkaXRpb24gdG8gd2hlcmV2ZXIgdGhlIG9iamVjdCdzCisgICAgICogbGF5b3V0IHBsYWNlZCBpdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgdG9wIHBvc2l0aW9uLAorICAgICAqIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0VHJhbnNsYXRpb25ZKCkgeworICAgICAgICByZXR1cm4gbVRyYW5zbGF0aW9uWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2ZXJ0aWNhbCBsb2NhdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHtAbGluayAjZ2V0VG9wKCkgdG9wfSBwb3NpdGlvbi4KKyAgICAgKiBUaGlzIGVmZmVjdGl2ZWx5IHBvc2l0aW9ucyB0aGUgb2JqZWN0IHBvc3QtbGF5b3V0LCBpbiBhZGRpdGlvbiB0byB3aGVyZXZlciB0aGUgb2JqZWN0J3MKKyAgICAgKiBsYXlvdXQgcGxhY2VkIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zbGF0aW9uWSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyB0b3AgcG9zaXRpb24sCisgICAgICogaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zbGF0aW9uWShmbG9hdCB0cmFuc2xhdGlvblkpIHsKKyAgICAgICAgaWYgKG1UcmFuc2xhdGlvblkgIT0gdHJhbnNsYXRpb25ZKSB7CisgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVRyYW5zbGF0aW9uWSA9IHRyYW5zbGF0aW9uWTsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIEhpdCByZWN0YW5nbGUgaW4gcGFyZW50J3MgY29vcmRpbmF0ZXMKICAgICAgKgogICAgICAqIEBwYXJhbSBvdXRSZWN0IFRoZSBoaXQgcmVjdGFuZ2xlIG9mIHRoZSB2aWV3LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldEhpdFJlY3QoUmVjdCBvdXRSZWN0KSB7Ci0gICAgICAgIG91dFJlY3Quc2V0KG1MZWZ0LCBtVG9wLCBtUmlnaHQsIG1Cb3R0b20pOworICAgICAgICBpZiAoaGFzSWRlbnRpdHlNYXRyaXgoKSB8fCBtQXR0YWNoSW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXRSZWN0LnNldChtTGVmdCwgbVRvcCwgbVJpZ2h0LCBtQm90dG9tKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE1hdHJpeCBtID0gZ2V0TWF0cml4KCk7CisgICAgICAgICAgICBmaW5hbCBSZWN0RiB0bXBSZWN0ID0gbUF0dGFjaEluZm8ubVRtcFRyYW5zZm9ybVJlY3Q7CisgICAgICAgICAgICB0bXBSZWN0LnNldCgtbVBpdm90WCwgLW1QaXZvdFksIGdldFdpZHRoKCkgLSBtUGl2b3RYLCBnZXRIZWlnaHQoKSAtIG1QaXZvdFkpOworICAgICAgICAgICAgbS5tYXBSZWN0KHRtcFJlY3QpOworICAgICAgICAgICAgb3V0UmVjdC5zZXQoKGludCkgdG1wUmVjdC5sZWZ0ICsgbUxlZnQsIChpbnQpIHRtcFJlY3QudG9wICsgbVRvcCwKKyAgICAgICAgICAgICAgICAgICAgKGludCkgdG1wUmVjdC5yaWdodCArIG1MZWZ0LCAoaW50KSB0bXBSZWN0LmJvdHRvbSArIG1Ub3ApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIHBvaW50LCBpbiBsb2NhbCBjb29yZGluYXRlcywKKyAgICAgKiBpcyBpbnNpZGUgdGhlIHZpZXcsIHdoZXJlIHRoZSBhcmVhIG9mIHRoZSB2aWV3IGlzIGV4cGFuZGVkIGJ5IHRoZSBzbG9wIGZhY3Rvci4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hpbGUgcHJvY2Vzc2luZyB0b3VjaC1tb3ZlIGV2ZW50cyB0byBkZXRlcm1pbmUgaWYgdGhlIGV2ZW50CisgICAgICogaXMgc3RpbGwgd2l0aGluIHRoZSB2aWV3LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwb2ludEluVmlldyhmbG9hdCBsb2NhbFgsIGZsb2F0IGxvY2FsWSwgZmxvYXQgc2xvcCkgeworICAgICAgICByZXR1cm4gbG9jYWxYID4gLXNsb3AgJiYgbG9jYWxZID4gLXNsb3AgJiYgbG9jYWxYIDwgKChtUmlnaHQgLSBtTGVmdCkgKyBzbG9wKSAmJgorICAgICAgICAgICAgICAgIGxvY2FsWSA8ICgobUJvdHRvbSAtIG1Ub3ApICsgc2xvcCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00ODY5LDggKzU0ODksMzggQEAKICAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBudW1iZXIgb2YgcGl4ZWxzIHRvIG9mZnNldCB0aGUgdmlldyBieQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG9mZnNldFRvcEFuZEJvdHRvbShpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIG1Ub3AgKz0gb2Zmc2V0OwotICAgICAgICBtQm90dG9tICs9IG9mZnNldDsKKyAgICAgICAgaWYgKG9mZnNldCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoaGFzSWRlbnRpdHlNYXRyaXgoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdQYXJlbnQgcCA9IG1QYXJlbnQ7CisgICAgICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCAmJiBtQXR0YWNoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgciA9IG1BdHRhY2hJbmZvLm1UbXBJbnZhbFJlY3Q7CisgICAgICAgICAgICAgICAgICAgIGludCBtaW5Ub3A7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXhCb3R0b207CisgICAgICAgICAgICAgICAgICAgIGludCB5TG9jOworICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluVG9wID0gbVRvcCArIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdHRvbSA9IG1Cb3R0b207CisgICAgICAgICAgICAgICAgICAgICAgICB5TG9jID0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluVG9wID0gbVRvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdHRvbSA9IG1Cb3R0b20gKyBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB5TG9jID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByLnNldCgwLCB5TG9jLCBtUmlnaHQgLSBtTGVmdCwgbWF4Qm90dG9tIC0gbWluVG9wKTsKKyAgICAgICAgICAgICAgICAgICAgcC5pbnZhbGlkYXRlQ2hpbGQodGhpcywgcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Ub3AgKz0gb2Zmc2V0OworICAgICAgICAgICAgbUJvdHRvbSArPSBvZmZzZXQ7CisKKyAgICAgICAgICAgIGlmICghbU1hdHJpeElzSWRlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTQ4NzksOCArNTUyOSwzOCBAQAogICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG51bWVyIG9mIHBpeGVscyB0byBvZmZzZXQgdGhlIHZpZXcgYnkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBvZmZzZXRMZWZ0QW5kUmlnaHQoaW50IG9mZnNldCkgewotICAgICAgICBtTGVmdCArPSBvZmZzZXQ7Ci0gICAgICAgIG1SaWdodCArPSBvZmZzZXQ7CisgICAgICAgIGlmIChvZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGhhc0lkZW50aXR5TWF0cml4KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHAgPSBtUGFyZW50OworICAgICAgICAgICAgICAgIGlmIChwICE9IG51bGwgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IHIgPSBtQXR0YWNoSW5mby5tVG1wSW52YWxSZWN0OworICAgICAgICAgICAgICAgICAgICBpbnQgbWluTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1heFJpZ2h0OworICAgICAgICAgICAgICAgICAgICBpbnQgeExvYzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbkxlZnQgPSBtTGVmdCArIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFJpZ2h0ID0gbVJpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgeExvYyA9IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbkxlZnQgPSBtTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFJpZ2h0ID0gbVJpZ2h0ICsgb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgeExvYyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgci5zZXQoMCwgMCwgbWF4UmlnaHQgLSBtaW5MZWZ0LCBtQm90dG9tIC0gbVRvcCk7CisgICAgICAgICAgICAgICAgICAgIHAuaW52YWxpZGF0ZUNoaWxkKHRoaXMsIHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTGVmdCArPSBvZmZzZXQ7CisgICAgICAgICAgICBtUmlnaHQgKz0gb2Zmc2V0OworCisgICAgICAgICAgICBpZiAoIW1NYXRyaXhJc0lkZW50aXR5KSB7CisgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC01OTE5LDkgKzY1OTksOCBAQAogICAgICAqIEBzZWUgYW5kcm9pZC53aWRnZXQuU2Nyb2xsQmFyRHJhd2FibGUKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhd0hvcml6b250YWxTY3JvbGxCYXIoQ2FudmFzIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIHNjcm9sbEJhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3SG9yaXpvbnRhbFNjcm9sbEJhcihDYW52YXMgY2FudmFzLCBEcmF3YWJsZSBzY3JvbGxCYXIsCisgICAgICAgICAgICBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewogICAgICAgICBzY3JvbGxCYXIuc2V0Qm91bmRzKGwsIHQsIHIsIGIpOwogICAgICAgICBzY3JvbGxCYXIuZHJhdyhjYW52YXMpOwogICAgIH0KQEAgLTU5NDAsOSArNjYxOSw4IEBACiAgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5TY3JvbGxCYXJEcmF3YWJsZQogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3VmVydGljYWxTY3JvbGxCYXIoQ2FudmFzIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcmF3YWJsZSBzY3JvbGxCYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXdWZXJ0aWNhbFNjcm9sbEJhcihDYW52YXMgY2FudmFzLCBEcmF3YWJsZSBzY3JvbGxCYXIsCisgICAgICAgICAgICBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewogICAgICAgICBzY3JvbGxCYXIuc2V0Qm91bmRzKGwsIHQsIHIsIGIpOwogICAgICAgICBzY3JvbGxCYXIuZHJhdyhjYW52YXMpOwogICAgIH0KQEAgLTYzNDAsOCArNzAxOCw3IEBACiAgICAgICAgIGlmICgobVZpZXdGbGFncyAmIERSQVdJTkdfQ0FDSEVfRU5BQkxFRCkgPT0gRFJBV0lOR19DQUNIRV9FTkFCTEVEKSB7CiAgICAgICAgICAgICBidWlsZERyYXdpbmdDYWNoZShhdXRvU2NhbGUpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhdXRvU2NhbGUgPyAobURyYXdpbmdDYWNoZSA9PSBudWxsID8gbnVsbCA6IG1EcmF3aW5nQ2FjaGUuZ2V0KCkpIDoKLSAgICAgICAgICAgICAgICAobVVuc2NhbGVkRHJhd2luZ0NhY2hlID09IG51bGwgPyBudWxsIDogbVVuc2NhbGVkRHJhd2luZ0NhY2hlLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIGF1dG9TY2FsZSA/IG1EcmF3aW5nQ2FjaGUgOiBtVW5zY2FsZWREcmF3aW5nQ2FjaGU7CiAgICAgfQogCiAgICAgLyoqCkBAIC02MzU2LDEzICs3MDMzLDExIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGVzdHJveURyYXdpbmdDYWNoZSgpIHsKICAgICAgICAgaWYgKG1EcmF3aW5nQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgQml0bWFwIGJpdG1hcCA9IG1EcmF3aW5nQ2FjaGUuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoYml0bWFwICE9IG51bGwpIGJpdG1hcC5yZWN5Y2xlKCk7CisgICAgICAgICAgICBtRHJhd2luZ0NhY2hlLnJlY3ljbGUoKTsKICAgICAgICAgICAgIG1EcmF3aW5nQ2FjaGUgPSBudWxsOwogICAgICAgICB9CiAgICAgICAgIGlmIChtVW5zY2FsZWREcmF3aW5nQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgQml0bWFwIGJpdG1hcCA9IG1VbnNjYWxlZERyYXdpbmdDYWNoZS5nZXQoKTsKLSAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgYml0bWFwLnJlY3ljbGUoKTsKKyAgICAgICAgICAgIG1VbnNjYWxlZERyYXdpbmdDYWNoZS5yZWN5Y2xlKCk7CiAgICAgICAgICAgICBtVW5zY2FsZWREcmF3aW5nQ2FjaGUgPSBudWxsOwogICAgICAgICB9CiAgICAgfQpAQCAtNjQyMyw4ICs3MDk4LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBidWlsZERyYXdpbmdDYWNoZShib29sZWFuIGF1dG9TY2FsZSkgewogICAgICAgICBpZiAoKG1Qcml2YXRlRmxhZ3MgJiBEUkFXSU5HX0NBQ0hFX1ZBTElEKSA9PSAwIHx8IChhdXRvU2NhbGUgPwotICAgICAgICAgICAgICAgIChtRHJhd2luZ0NhY2hlID09IG51bGwgfHwgbURyYXdpbmdDYWNoZS5nZXQoKSA9PSBudWxsKSA6Ci0gICAgICAgICAgICAgICAgKG1VbnNjYWxlZERyYXdpbmdDYWNoZSA9PSBudWxsIHx8IG1VbnNjYWxlZERyYXdpbmdDYWNoZS5nZXQoKSA9PSBudWxsKSkpIHsKKyAgICAgICAgICAgICAgICBtRHJhd2luZ0NhY2hlID09IG51bGwgOiBtVW5zY2FsZWREcmF3aW5nQ2FjaGUgPT0gbnVsbCkpIHsKIAogICAgICAgICAgICAgaWYgKFZpZXdEZWJ1Zy5UUkFDRV9ISUVSQVJDSFkpIHsKICAgICAgICAgICAgICAgICBWaWV3RGVidWcudHJhY2UodGhpcywgVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZS5CVUlMRF9DQUNIRSk7CkBAIC02NDU3LDggKzcxMzEsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBib29sZWFuIGNsZWFyID0gdHJ1ZTsKLSAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBhdXRvU2NhbGUgPyAobURyYXdpbmdDYWNoZSA9PSBudWxsID8gbnVsbCA6IG1EcmF3aW5nQ2FjaGUuZ2V0KCkpIDoKLSAgICAgICAgICAgICAgICAgICAgKG1VbnNjYWxlZERyYXdpbmdDYWNoZSA9PSBudWxsID8gbnVsbCA6IG1VbnNjYWxlZERyYXdpbmdDYWNoZS5nZXQoKSk7CisgICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gYXV0b1NjYWxlID8gbURyYXdpbmdDYWNoZSA6IG1VbnNjYWxlZERyYXdpbmdDYWNoZTsKIAogICAgICAgICAgICAgaWYgKGJpdG1hcCA9PSBudWxsIHx8IGJpdG1hcC5nZXRXaWR0aCgpICE9IHdpZHRoIHx8IGJpdG1hcC5nZXRIZWlnaHQoKSAhPSBoZWlnaHQpIHsKICAgICAgICAgICAgICAgICBCaXRtYXAuQ29uZmlnIHF1YWxpdHk7CkBAIC02NDkwLDkgKzcxNjMsOSBAQAogICAgICAgICAgICAgICAgICAgICBiaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHdpZHRoLCBoZWlnaHQsIHF1YWxpdHkpOwogICAgICAgICAgICAgICAgICAgICBiaXRtYXAuc2V0RGVuc2l0eShnZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHlEcGkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b1NjYWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRHJhd2luZ0NhY2hlID0gbmV3IFNvZnRSZWZlcmVuY2U8Qml0bWFwPihiaXRtYXApOworICAgICAgICAgICAgICAgICAgICAgICAgbURyYXdpbmdDYWNoZSA9IGJpdG1hcDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VbnNjYWxlZERyYXdpbmdDYWNoZSA9IG5ldyBTb2Z0UmVmZXJlbmNlPEJpdG1hcD4oYml0bWFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VbnNjYWxlZERyYXdpbmdDYWNoZSA9IGJpdG1hcDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAob3BhcXVlICYmIHRyYW5zbHVjZW50V2luZG93KSBiaXRtYXAuc2V0SGFzQWxwaGEoZmFsc2UpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgewpAQCAtNjg1NSwxNiArNzUyOCwxNiBAQAogCiAgICAgICAgIGlmICh2ZXJ0aWNhbEVkZ2VzKSB7CiAgICAgICAgICAgICB0b3BGYWRlU3RyZW5ndGggPSBNYXRoLm1heCgwLjBmLCBNYXRoLm1pbigxLjBmLCBnZXRUb3BGYWRpbmdFZGdlU3RyZW5ndGgoKSkpOwotICAgICAgICAgICAgZHJhd1RvcCA9IHRvcEZhZGVTdHJlbmd0aCA+PSAwLjBmOworICAgICAgICAgICAgZHJhd1RvcCA9IHRvcEZhZGVTdHJlbmd0aCA+IDAuMGY7CiAgICAgICAgICAgICBib3R0b21GYWRlU3RyZW5ndGggPSBNYXRoLm1heCgwLjBmLCBNYXRoLm1pbigxLjBmLCBnZXRCb3R0b21GYWRpbmdFZGdlU3RyZW5ndGgoKSkpOwotICAgICAgICAgICAgZHJhd0JvdHRvbSA9IGJvdHRvbUZhZGVTdHJlbmd0aCA+PSAwLjBmOworICAgICAgICAgICAgZHJhd0JvdHRvbSA9IGJvdHRvbUZhZGVTdHJlbmd0aCA+IDAuMGY7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaG9yaXpvbnRhbEVkZ2VzKSB7CiAgICAgICAgICAgICBsZWZ0RmFkZVN0cmVuZ3RoID0gTWF0aC5tYXgoMC4wZiwgTWF0aC5taW4oMS4wZiwgZ2V0TGVmdEZhZGluZ0VkZ2VTdHJlbmd0aCgpKSk7Ci0gICAgICAgICAgICBkcmF3TGVmdCA9IGxlZnRGYWRlU3RyZW5ndGggPj0gMC4wZjsKKyAgICAgICAgICAgIGRyYXdMZWZ0ID0gbGVmdEZhZGVTdHJlbmd0aCA+IDAuMGY7CiAgICAgICAgICAgICByaWdodEZhZGVTdHJlbmd0aCA9IE1hdGgubWF4KDAuMGYsIE1hdGgubWluKDEuMGYsIGdldFJpZ2h0RmFkaW5nRWRnZVN0cmVuZ3RoKCkpKTsKLSAgICAgICAgICAgIGRyYXdSaWdodCA9IHJpZ2h0RmFkZVN0cmVuZ3RoID49IDAuMGY7CisgICAgICAgICAgICBkcmF3UmlnaHQgPSByaWdodEZhZGVTdHJlbmd0aCA+IDAuMGY7CiAgICAgICAgIH0KIAogICAgICAgICBzYXZlQ291bnQgPSBjYW52YXMuZ2V0U2F2ZUNvdW50KCk7CkBAIC04NjAzLDEzICs5Mjc2LDEyIEBACiAgICAgICAgIGlmIChtQXR0YWNoSW5mbyA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKChmbGFncyZIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5GTEFHX0lHTk9SRV9WSUVXX1NFVFRJTkcpID09IDAKKyAgICAgICAgaWYgKChmbGFncyAmIEhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkZMQUdfSUdOT1JFX1ZJRVdfU0VUVElORykgPT0gMAogICAgICAgICAgICAgICAgICYmICFpc0hhcHRpY0ZlZWRiYWNrRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1BdHRhY2hJbmZvLm1Sb290Q2FsbGJhY2tzLnBlcmZvcm1IYXB0aWNGZWVkYmFjaygKLSAgICAgICAgICAgICAgICBmZWVkYmFja0NvbnN0YW50LAotICAgICAgICAgICAgICAgIChmbGFncyZIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5GTEFHX0lHTk9SRV9HTE9CQUxfU0VUVElORykgIT0gMCk7CisgICAgICAgIHJldHVybiBtQXR0YWNoSW5mby5tUm9vdENhbGxiYWNrcy5wZXJmb3JtSGFwdGljRmVlZGJhY2soZmVlZGJhY2tDb25zdGFudCwKKyAgICAgICAgICAgICAgICAoZmxhZ3MgJiBIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5GTEFHX0lHTk9SRV9HTE9CQUxfU0VUVElORykgIT0gMCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NjgwLDggKzkzNTIsNyBAQAogICAgICAgICAgICAgICAgIFZpZXdDb25maWd1cmF0aW9uLmdldExvbmdQcmVzc1RpbWVvdXQoKSAtIGRlbGF5T2Zmc2V0KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBzdGF0ZVNldFVuaW9uKGZpbmFsIGludFtdIHN0YXRlU2V0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludFtdIHN0YXRlU2V0MikgeworICAgIHByaXZhdGUgc3RhdGljIGludFtdIHN0YXRlU2V0VW5pb24oZmluYWwgaW50W10gc3RhdGVTZXQxLCBmaW5hbCBpbnRbXSBzdGF0ZVNldDIpIHsKICAgICAgICAgZmluYWwgaW50IHN0YXRlU2V0MUxlbmd0aCA9IHN0YXRlU2V0MS5sZW5ndGg7CiAgICAgICAgIGZpbmFsIGludCBzdGF0ZVNldDJMZW5ndGggPSBzdGF0ZVNldDIubGVuZ3RoOwogICAgICAgICBmaW5hbCBpbnRbXSBuZXdTZXQgPSBuZXcgaW50W3N0YXRlU2V0MUxlbmd0aCArIHN0YXRlU2V0Mkxlbmd0aF07CkBAIC04NzIxLDEyOCArOTM5Miw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2Nyb2xsIHRoZSB2aWV3IHdpdGggc3RhbmRhcmQgYmVoYXZpb3IgZm9yIHNjcm9sbGluZyBiZXlvbmQgdGhlIG5vcm1hbAotICAgICAqIGNvbnRlbnQgYm91bmRhcmllcy4gVmlld3MgdGhhdCBjYWxsIHRoaXMgbWV0aG9kIHNob3VsZCBvdmVycmlkZQotICAgICAqIHtAbGluayAjb25PdmVyc2Nyb2xsZWQoaW50LCBpbnQsIGJvb2xlYW4sIGJvb2xlYW4pfSB0byByZXNwb25kIHRvIHRoZQotICAgICAqIHJlc3VsdHMgb2YgYW4gb3ZlcnNjcm9sbCBvcGVyYXRpb24uCi0gICAgICoKLSAgICAgKiBWaWV3cyBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBhbnkgdG91Y2ggb3IgZmxpbmctYmFzZWQgc2Nyb2xsaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIGRlbHRhWCBDaGFuZ2UgaW4gWCBpbiBwaXhlbHMKLSAgICAgKiBAcGFyYW0gZGVsdGFZIENoYW5nZSBpbiBZIGluIHBpeGVscwotICAgICAqIEBwYXJhbSBzY3JvbGxYIEN1cnJlbnQgWCBzY3JvbGwgdmFsdWUgaW4gcGl4ZWxzIGJlZm9yZSBhcHBseWluZyBkZWx0YVgKLSAgICAgKiBAcGFyYW0gc2Nyb2xsWSBDdXJyZW50IFkgc2Nyb2xsIHZhbHVlIGluIHBpeGVscyBiZWZvcmUgYXBwbHlpbmcgZGVsdGFZCi0gICAgICogQHBhcmFtIHNjcm9sbFJhbmdlWCBNYXhpbXVtIGNvbnRlbnQgc2Nyb2xsIHJhbmdlIGFsb25nIHRoZSBYIGF4aXMKLSAgICAgKiBAcGFyYW0gc2Nyb2xsUmFuZ2VZIE1heGltdW0gY29udGVudCBzY3JvbGwgcmFuZ2UgYWxvbmcgdGhlIFkgYXhpcwotICAgICAqIEBwYXJhbSBtYXhPdmVyc2Nyb2xsWCBOdW1iZXIgb2YgcGl4ZWxzIHRvIG92ZXJzY3JvbGwgYnkgaW4gZWl0aGVyIGRpcmVjdGlvbgotICAgICAqICAgICAgICAgIGFsb25nIHRoZSBYIGF4aXMuCi0gICAgICogQHBhcmFtIG1heE92ZXJzY3JvbGxZIE51bWJlciBvZiBwaXhlbHMgdG8gb3ZlcnNjcm9sbCBieSBpbiBlaXRoZXIgZGlyZWN0aW9uCi0gICAgICogICAgICAgICAgYWxvbmcgdGhlIFkgYXhpcy4KLSAgICAgKiBAcGFyYW0gaXNUb3VjaEV2ZW50IHRydWUgaWYgdGhpcyBzY3JvbGwgb3BlcmF0aW9uIGlzIHRoZSByZXN1bHQgb2YgYSB0b3VjaCBldmVudC4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgc2Nyb2xsaW5nIHdhcyBjbGFtcGVkIHRvIGFuIG92ZXJzY3JvbGwgYm91bmRhcnkgYWxvbmcgZWl0aGVyCi0gICAgICogICAgICAgICAgYXhpcywgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIG92ZXJzY3JvbGxCeShpbnQgZGVsdGFYLCBpbnQgZGVsdGFZLAotICAgICAgICAgICAgaW50IHNjcm9sbFgsIGludCBzY3JvbGxZLAotICAgICAgICAgICAgaW50IHNjcm9sbFJhbmdlWCwgaW50IHNjcm9sbFJhbmdlWSwKLSAgICAgICAgICAgIGludCBtYXhPdmVyc2Nyb2xsWCwgaW50IG1heE92ZXJzY3JvbGxZLAotICAgICAgICAgICAgYm9vbGVhbiBpc1RvdWNoRXZlbnQpIHsKLSAgICAgICAgZmluYWwgaW50IG92ZXJzY3JvbGxNb2RlID0gbU92ZXJzY3JvbGxNb2RlOwotICAgICAgICBmaW5hbCBib29sZWFuIGNhblNjcm9sbEhvcml6b250YWwgPQotICAgICAgICAgICAgICAgIGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSA+IGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsRXh0ZW50KCk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gY2FuU2Nyb2xsVmVydGljYWwgPQotICAgICAgICAgICAgICAgIGNvbXB1dGVWZXJ0aWNhbFNjcm9sbFJhbmdlKCkgPiBjb21wdXRlVmVydGljYWxTY3JvbGxFeHRlbnQoKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBvdmVyc2Nyb2xsSG9yaXpvbnRhbCA9IG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfQUxXQVlTIHx8Ci0gICAgICAgICAgICAgICAgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTICYmIGNhblNjcm9sbEhvcml6b250YWwpOwotICAgICAgICBmaW5hbCBib29sZWFuIG92ZXJzY3JvbGxWZXJ0aWNhbCA9IG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfQUxXQVlTIHx8Ci0gICAgICAgICAgICAgICAgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTICYmIGNhblNjcm9sbFZlcnRpY2FsKTsKLQotICAgICAgICBpbnQgbmV3U2Nyb2xsWCA9IHNjcm9sbFggKyBkZWx0YVg7Ci0gICAgICAgIGlmICghb3ZlcnNjcm9sbEhvcml6b250YWwpIHsKLSAgICAgICAgICAgIG1heE92ZXJzY3JvbGxYID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBuZXdTY3JvbGxZID0gc2Nyb2xsWSArIGRlbHRhWTsKLSAgICAgICAgaWYgKCFvdmVyc2Nyb2xsVmVydGljYWwpIHsKLSAgICAgICAgICAgIG1heE92ZXJzY3JvbGxZID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENsYW1wIHZhbHVlcyBpZiBhdCB0aGUgbGltaXRzIGFuZCByZWNvcmQKLSAgICAgICAgZmluYWwgaW50IGxlZnQgPSAtbWF4T3ZlcnNjcm9sbFg7Ci0gICAgICAgIGZpbmFsIGludCByaWdodCA9IG1heE92ZXJzY3JvbGxYICsgc2Nyb2xsUmFuZ2VYOwotICAgICAgICBmaW5hbCBpbnQgdG9wID0gLW1heE92ZXJzY3JvbGxZOwotICAgICAgICBmaW5hbCBpbnQgYm90dG9tID0gbWF4T3ZlcnNjcm9sbFkgKyBzY3JvbGxSYW5nZVk7Ci0KLSAgICAgICAgYm9vbGVhbiBjbGFtcGVkWCA9IGZhbHNlOwotICAgICAgICBpZiAobmV3U2Nyb2xsWCA+IHJpZ2h0KSB7Ci0gICAgICAgICAgICBuZXdTY3JvbGxYID0gcmlnaHQ7Ci0gICAgICAgICAgICBjbGFtcGVkWCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAobmV3U2Nyb2xsWCA8IGxlZnQpIHsKLSAgICAgICAgICAgIG5ld1Njcm9sbFggPSBsZWZ0OwotICAgICAgICAgICAgY2xhbXBlZFggPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBjbGFtcGVkWSA9IGZhbHNlOwotICAgICAgICBpZiAobmV3U2Nyb2xsWSA+IGJvdHRvbSkgewotICAgICAgICAgICAgbmV3U2Nyb2xsWSA9IGJvdHRvbTsKLSAgICAgICAgICAgIGNsYW1wZWRZID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChuZXdTY3JvbGxZIDwgdG9wKSB7Ci0gICAgICAgICAgICBuZXdTY3JvbGxZID0gdG9wOwotICAgICAgICAgICAgY2xhbXBlZFkgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgb25PdmVyc2Nyb2xsZWQobmV3U2Nyb2xsWCwgbmV3U2Nyb2xsWSwgY2xhbXBlZFgsIGNsYW1wZWRZKTsKLQotICAgICAgICByZXR1cm4gY2xhbXBlZFggfHwgY2xhbXBlZFk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHtAbGluayAjb3ZlcnNjcm9sbEJ5KGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBib29sZWFuKX0gdG8KLSAgICAgKiByZXNwb25kIHRvIHRoZSByZXN1bHRzIG9mIGFuIG92ZXJzY3JvbGwgb3BlcmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHNjcm9sbFggTmV3IFggc2Nyb2xsIHZhbHVlIGluIHBpeGVscwotICAgICAqIEBwYXJhbSBzY3JvbGxZIE5ldyBZIHNjcm9sbCB2YWx1ZSBpbiBwaXhlbHMKLSAgICAgKiBAcGFyYW0gY2xhbXBlZFggVHJ1ZSBpZiBzY3JvbGxYIHdhcyBjbGFtcGVkIHRvIGFuIG92ZXJzY3JvbGwgYm91bmRhcnkKLSAgICAgKiBAcGFyYW0gY2xhbXBlZFkgVHJ1ZSBpZiBzY3JvbGxZIHdhcyBjbGFtcGVkIHRvIGFuIG92ZXJzY3JvbGwgYm91bmRhcnkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBvbk92ZXJzY3JvbGxlZChpbnQgc2Nyb2xsWCwgaW50IHNjcm9sbFksCi0gICAgICAgICAgICBib29sZWFuIGNsYW1wZWRYLCBib29sZWFuIGNsYW1wZWRZKSB7Ci0gICAgICAgIC8vIEludGVudGlvbmFsbHkgZW1wdHkuCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb3ZlcnNjcm9sbCBtb2RlIGZvciB0aGlzIHZpZXcuIFRoZSByZXN1bHQgd2lsbCBiZQotICAgICAqIG9uZSBvZiB7QGxpbmsgI09WRVJTQ1JPTExfQUxXQVlTfSAoZGVmYXVsdCksIHtAbGluayAjT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFN9Ci0gICAgICogKGFsbG93IG92ZXJzY3JvbGxpbmcgb25seSBpZiB0aGUgdmlldyBjb250ZW50IGlzIGxhcmdlciB0aGFuIHRoZSBjb250YWluZXIpLAotICAgICAqIG9yIHtAbGluayAjT1ZFUlNDUk9MTF9ORVZFUn0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoaXMgdmlldydzIG92ZXJzY3JvbGwgbW9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE92ZXJzY3JvbGxNb2RlKCkgewotICAgICAgICByZXR1cm4gbU92ZXJzY3JvbGxNb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgb3ZlcnNjcm9sbCBtb2RlIGZvciB0aGlzIHZpZXcuIFZhbGlkIG92ZXJzY3JvbGwgbW9kZXMgYXJlCi0gICAgICoge0BsaW5rICNPVkVSU0NST0xMX0FMV0FZU30gKGRlZmF1bHQpLCB7QGxpbmsgI09WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTfQotICAgICAqIChhbGxvdyBvdmVyc2Nyb2xsaW5nIG9ubHkgaWYgdGhlIHZpZXcgY29udGVudCBpcyBsYXJnZXIgdGhhbiB0aGUgY29udGFpbmVyKSwKLSAgICAgKiBvciB7QGxpbmsgI09WRVJTQ1JPTExfTkVWRVJ9LgotICAgICAqCi0gICAgICogU2V0dGluZyB0aGUgb3ZlcnNjcm9sbCBtb2RlIG9mIGEgdmlldyB3aWxsIGhhdmUgYW4gZWZmZWN0IG9ubHkgaWYgdGhlCi0gICAgICogdmlldyBpcyBjYXBhYmxlIG9mIHNjcm9sbGluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdmVyc2Nyb2xsTW9kZSBUaGUgbmV3IG92ZXJzY3JvbGwgbW9kZSBmb3IgdGhpcyB2aWV3LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJzY3JvbGxNb2RlKGludCBvdmVyc2Nyb2xsTW9kZSkgewotICAgICAgICBpZiAob3ZlcnNjcm9sbE1vZGUgIT0gT1ZFUlNDUk9MTF9BTFdBWVMgJiYKLSAgICAgICAgICAgICAgICBvdmVyc2Nyb2xsTW9kZSAhPSBPVkVSU0NST0xMX0lGX0NPTlRFTlRfU0NST0xMUyAmJgotICAgICAgICAgICAgICAgIG92ZXJzY3JvbGxNb2RlICE9IE9WRVJTQ1JPTExfTkVWRVIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgb3ZlcnNjcm9sbCBtb2RlICIgKyBvdmVyc2Nyb2xsTW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbU92ZXJzY3JvbGxNb2RlID0gb3ZlcnNjcm9sbE1vZGU7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogQSBNZWFzdXJlU3BlYyBlbmNhcHN1bGF0ZXMgdGhlIGxheW91dCByZXF1aXJlbWVudHMgcGFzc2VkIGZyb20gcGFyZW50IHRvIGNoaWxkLgogICAgICAqIEVhY2ggTWVhc3VyZVNwZWMgcmVwcmVzZW50cyBhIHJlcXVpcmVtZW50IGZvciBlaXRoZXIgdGhlIHdpZHRoIG9yIHRoZSBoZWlnaHQuCiAgICAgICogQSBNZWFzdXJlU3BlYyBpcyBjb21wcmlzZWQgb2YgYSBzaXplIGFuZCBhIG1vZGUuIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZQpAQCAtOTMyNCw2ICs5ODczLDEzIEBACiAgICAgICAgICAqLwogICAgICAgICBmaW5hbCBpbnRbXSBtSW52YWxpZGF0ZUNoaWxkTG9jYXRpb24gPSBuZXcgaW50WzJdOwogCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdsb2JhbCB0byB0aGUgdmlldyBoaWVyYXJjaHkgdXNlZCBhcyBhIHRlbXBvcmFyeSBmb3IgZGVhbGluZyB3aXRoCisgICAgICAgICAqIHgveSBsb2NhdGlvbiB3aGVuIHZpZXcgaXMgdHJhbnNmb3JtZWQuCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBmbG9hdFtdIG1UbXBUcmFuc2Zvcm1Mb2NhdGlvbiA9IG5ldyBmbG9hdFsyXTsKKwogICAgICAgICAvKioKICAgICAgICAgICogVGhlIHZpZXcgdHJlZSBvYnNlcnZlciB1c2VkIHRvIGRpc3BhdGNoIGdsb2JhbCBldmVudHMgbGlrZQogICAgICAgICAgKiBsYXlvdXQsIHByZS1kcmF3LCB0b3VjaCBtb2RlIGNoYW5nZSwgZXRjLgpAQCAtOTM2MCw2ICs5OTE2LDE2IEBACiAgICAgICAgIGZpbmFsIFJlY3QgbVRtcEludmFsUmVjdCA9IG5ldyBSZWN0KCk7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRlbXBvcmFyeSBmb3IgdXNlIGluIGNvbXB1dGluZyBoaXQgYXJlYXMgd2l0aCB0cmFuc2Zvcm1lZCB2aWV3cworICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgUmVjdEYgbVRtcFRyYW5zZm9ybVJlY3QgPSBuZXcgUmVjdEYoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGVtcG9yYXJ5IGZvciB1c2UgaW4gY29tcHV0aW5nIGludmFsaWRhdGlvbiBhcmVhcyB3aXRoIHRyYW5zZm9ybWVkIHZpZXdzCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBmbG9hdFtdIG1UbXBUcmFuc2Zvcm1Cb3VuZHMgPSBuZXcgZmxvYXRbOF07CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFRlbXBvcmFyeSBsaXN0IGZvciB1c2UgaW4gY29sbGVjdGluZyBmb2N1c2FibGUgZGVzY2VuZGVudHMgb2YgYSB2aWV3LgogICAgICAgICAgKi8KICAgICAgICAgZmluYWwgQXJyYXlMaXN0PFZpZXc+IG1Gb2N1c2FibGVzVGVtcExpc3QgPSBuZXcgQXJyYXlMaXN0PFZpZXc+KDI0KTsKQEAgLTk0MTksOCArOTk4NSw4IEBACiAKICAgICAgICAgcHVibGljIGZpbmFsIEludGVycG9sYXRvciBzY3JvbGxCYXJJbnRlcnBvbGF0b3IgPSBuZXcgSW50ZXJwb2xhdG9yKDEsIDIpOwogCi0gICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXRbXSBtT3BhcXVlID0gezI1NS4wZn07Ci0gICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXRbXSBtVHJhbnNwYXJlbnQgPSB7MC4wZn07CisgICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXRbXSBtT3BhcXVlID0geyAyNTUuMGYgfTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1UcmFuc3BhcmVudCA9IHsgMC4wZiB9OwogICAgICAgICAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFdoZW4gZmFkaW5nIHNob3VsZCBzdGFydC4gVGhpcyB0aW1lIG1vdmVzIGludG8gdGhlIGZ1dHVyZSBldmVyeSB0aW1lCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdDb25maWd1cmF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdDb25maWd1cmF0aW9uLmphdmEKaW5kZXggYWE5ZmU3Ni4uYWNkZmMyOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Q29uZmlndXJhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0NvbmZpZ3VyYXRpb24uamF2YQpAQCAtMTQwLDE2ICsxNDAsNiBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IFNDUk9MTF9GUklDVElPTiA9IDAuMDE1ZjsKIAotICAgIC8qKgotICAgICAqIE1heCBkaXN0YW5jZSB0byBvdmVyc2Nyb2xsIGZvciBlZGdlIGVmZmVjdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUlNDUk9MTF9ESVNUQU5DRSA9IDQ7Ci0KLSAgICAvKioKLSAgICAgKiBNYXggZGlzdGFuY2UgdG8gb3ZlcmZsaW5nIGZvciBlZGdlIGVmZmVjdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUkZMSU5HX0RJU1RBTkNFID0gODsKLQogICAgIHByaXZhdGUgZmluYWwgaW50IG1FZGdlU2xvcDsKICAgICBwcml2YXRlIGZpbmFsIGludCBtRmFkaW5nRWRnZUxlbmd0aDsKICAgICBwcml2YXRlIGZpbmFsIGludCBtTWluaW11bUZsaW5nVmVsb2NpdHk7CkBAIC0xNjAsOCArMTUwLDYgQEAKICAgICBwcml2YXRlIGZpbmFsIGludCBtRG91YmxlVGFwU2xvcDsKICAgICBwcml2YXRlIGZpbmFsIGludCBtV2luZG93VG91Y2hTbG9wOwogICAgIHByaXZhdGUgZmluYWwgaW50IG1NYXhpbXVtRHJhd2luZ0NhY2hlU2l6ZTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtT3ZlcnNjcm9sbERpc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1PdmVyZmxpbmdEaXN0YW5jZTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNwYXJzZUFycmF5PFZpZXdDb25maWd1cmF0aW9uPiBzQ29uZmlndXJhdGlvbnMgPQogICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PFZpZXdDb25maWd1cmF0aW9uPigyKTsKQEAgLTE4Miw4ICsxNzAsNiBAQAogICAgICAgICBtV2luZG93VG91Y2hTbG9wID0gV0lORE9XX1RPVUNIX1NMT1A7CiAgICAgICAgIC8vbm9pbnNwZWN0aW9uIGRlcHJlY2F0aW9uCiAgICAgICAgIG1NYXhpbXVtRHJhd2luZ0NhY2hlU2l6ZSA9IE1BWElNVU1fRFJBV0lOR19DQUNIRV9TSVpFOwotICAgICAgICBtT3ZlcnNjcm9sbERpc3RhbmNlID0gT1ZFUlNDUk9MTF9ESVNUQU5DRTsKLSAgICAgICAgbU92ZXJmbGluZ0Rpc3RhbmNlID0gT1ZFUkZMSU5HX0RJU1RBTkNFOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjEyLDkgKzE5OCw2IEBACiAKICAgICAgICAgLy8gU2l6ZSBvZiB0aGUgc2NyZWVuIGluIGJ5dGVzLCBpbiBBUkdCXzg4ODggZm9ybWF0CiAgICAgICAgIG1NYXhpbXVtRHJhd2luZ0NhY2hlU2l6ZSA9IDQgKiBtZXRyaWNzLndpZHRoUGl4ZWxzICogbWV0cmljcy5oZWlnaHRQaXhlbHM7Ci0KLSAgICAgICAgbU92ZXJzY3JvbGxEaXN0YW5jZSA9IChpbnQpIChkZW5zaXR5ICogT1ZFUlNDUk9MTF9ESVNUQU5DRSArIDAuNWYpOwotICAgICAgICBtT3ZlcmZsaW5nRGlzdGFuY2UgPSAoaW50KSAoZGVuc2l0eSAqIE9WRVJGTElOR19ESVNUQU5DRSArIDAuNWYpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDcyLDIwICs0NTUsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIG1heGltdW0gZGlzdGFuY2UgYSBWaWV3IHNob3VsZCBvdmVyc2Nyb2xsIGJ5IHdoZW4gc2hvd2luZyBlZGdlIGVmZmVjdHMuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTY2FsZWRPdmVyc2Nyb2xsRGlzdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtT3ZlcnNjcm9sbERpc3RhbmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIG1heGltdW0gZGlzdGFuY2UgYSBWaWV3IHNob3VsZCBvdmVyZmxpbmcgYnkgd2hlbiBzaG93aW5nIGVkZ2UgZWZmZWN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNjYWxlZE92ZXJmbGluZ0Rpc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbU92ZXJmbGluZ0Rpc3RhbmNlOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSB6b29tIGNvbnRyb2xzIHNob3VsZCBiZQogICAgICAqIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuIGV4cHJlc3NlZCBpbiBtaWxsaXNlY29uZHMuCiAgICAgICogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdHcm91cC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YQppbmRleCA3MTU5OTI5Li45NzcwMzEzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdHcm91cC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0dyb3VwLmphdmEKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKQEAgLTM0LDYgKzM1LDcgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CkBAIC00MSw2ICs0Myw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2Zvcm1hdGlvbjsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAogLyoqCiAgKiA8cD4KQEAgLTg2LDEzICs4OSwyOCBAQAogICAgIC8vIFRoZSB2aWV3IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBWaWV3R3JvdXAgdGhhdCBoYXMgb3IgY29udGFpbnMgZm9jdXMuCiAgICAgcHJpdmF0ZSBWaWV3IG1Gb2N1c2VkOwogCi0gICAgLy8gVGhlIGN1cnJlbnQgdHJhbnNmb3JtYXRpb24gdG8gYXBwbHkgb24gdGhlIGNoaWxkIGJlaW5nIGRyYXduCi0gICAgcHJpdmF0ZSBUcmFuc2Zvcm1hdGlvbiBtQ2hpbGRUcmFuc2Zvcm1hdGlvbjsKKyAgICAvKioKKyAgICAgKiBBIFRyYW5zZm9ybWF0aW9uIHVzZWQgd2hlbiBkcmF3aW5nIGNoaWxkcmVuLCB0bworICAgICAqIGFwcGx5IG9uIHRoZSBjaGlsZCBiZWluZyBkcmF3bi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWF0aW9uIG1DaGlsZFRyYW5zZm9ybWF0aW9uID0gbmV3IFRyYW5zZm9ybWF0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHRyYWNrIHRoZSBjdXJyZW50IGludmFsaWRhdGlvbiByZWdpb24uCisgICAgICovCiAgICAgcHJpdmF0ZSBSZWN0RiBtSW52YWxpZGF0ZVJlZ2lvbjsKIAorICAgIC8qKgorICAgICAqIEEgVHJhbnNmb3JtYXRpb24gdXNlZCB0byBjYWxjdWxhdGUgYSBjb3JyZWN0CisgICAgICogaW52YWxpZGF0aW9uIGFyZWEgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgYXV0b3NjYWxlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFRyYW5zZm9ybWF0aW9uIG1JbnZhbGlkYXRpb25UcmFuc2Zvcm1hdGlvbjsKKwogICAgIC8vIFRhcmdldCBvZiBNb3Rpb24gZXZlbnRzCiAgICAgcHJpdmF0ZSBWaWV3IG1Nb3Rpb25UYXJnZXQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7CisKKyAgICAvLyBUYXJnZXRzIG9mIE1vdGlvbkV2ZW50cyBpbiBzcGxpdCBtb2RlCisgICAgcHJpdmF0ZSBTcGxpdE1vdGlvblRhcmdldHMgbVNwbGl0TW90aW9uVGFyZ2V0czsKIAogICAgIC8vIExheW91dCBhbmltYXRpb24KICAgICBwcml2YXRlIExheW91dEFuaW1hdGlvbkNvbnRyb2xsZXIgbUxheW91dEFuaW1hdGlvbkNvbnRyb2xsZXI7CkBAIC0yMjgsNiArMjQ2LDExIEBACiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ESVNBTExPV19JTlRFUkNFUFQgPSAweDgwMDAwOwogCiAgICAgLyoqCisgICAgICogV2hlbiBzZXQsIHRoaXMgVmlld0dyb3VwIHdpbGwgc3BsaXQgTW90aW9uRXZlbnRzIHRvIG11bHRpcGxlIGNoaWxkIFZpZXdzIHdoZW4gYXBwcm9wcmlhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfU1BMSVRfTU9USU9OX0VWRU5UUyA9IDB4MTAwMDAwOworCisgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHdoaWNoIHR5cGVzIG9mIGRyYXdpbmcgY2FjaGVzIGFyZSB0byBiZSBrZXB0IGluIG1lbW9yeS4KICAgICAgKiBUaGlzIGZpZWxkIHNob3VsZCBiZSBtYWRlIHByaXZhdGUsIHNvIGl0IGlzIGhpZGRlbiBmcm9tIHRoZSBTREsuCiAgICAgICoge0BoaWRlfQpAQCAtMzQ4LDYgKzM3MSw5IEBACiAgICAgICAgICAgICAgICAgY2FzZSBSLnN0eWxlYWJsZS5WaWV3R3JvdXBfZGVzY2VuZGFudEZvY3VzYWJpbGl0eToKICAgICAgICAgICAgICAgICAgICAgc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShERVNDRU5EQU5UX0ZPQ1VTQUJJTElUWV9GTEFHU1thLmdldEludChhdHRyLCAwKV0pOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFIuc3R5bGVhYmxlLlZpZXdHcm91cF9zcGxpdE1vdGlvbkV2ZW50czoKKyAgICAgICAgICAgICAgICAgICAgc2V0TW90aW9uRXZlbnRTcGxpdHRpbmdFbmFibGVkKGEuZ2V0Qm9vbGVhbihhdHRyLCBmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC00NjEsNiArNDg3LDEzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKFZpZXcgb3JpZ2luYWxWaWV3LCBBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiBtUGFyZW50ICE9IG51bGwgPyBtUGFyZW50LnN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKG9yaWdpbmFsVmlldywgY2FsbGJhY2spIDogbnVsbDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBGaW5kIHRoZSBuZWFyZXN0IHZpZXcgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rpb24gdGhhdCB3YW50cyB0byB0YWtlCiAgICAgICogZm9jdXMuCiAgICAgICoKQEAgLTgyMiwxMiArODU1LDE4IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hUb3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIGlmICgobUdyb3VwRmxhZ3MgJiBGTEFHX1NQTElUX01PVElPTl9FVkVOVFMpID09IEZMQUdfU1BMSVRfTU9USU9OX0VWRU5UUykgeworICAgICAgICAgICAgaWYgKG1TcGxpdE1vdGlvblRhcmdldHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TcGxpdE1vdGlvblRhcmdldHMgPSBuZXcgU3BsaXRNb3Rpb25UYXJnZXRzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGlzcGF0Y2hTcGxpdFRvdWNoRXZlbnQoZXYpOworICAgICAgICB9CisKICAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOwogICAgICAgICBmaW5hbCBmbG9hdCB4ZiA9IGV2LmdldFgoKTsKICAgICAgICAgZmluYWwgZmxvYXQgeWYgPSBldi5nZXRZKCk7CiAgICAgICAgIGZpbmFsIGZsb2F0IHNjcm9sbGVkWEZsb2F0ID0geGYgKyBtU2Nyb2xsWDsKICAgICAgICAgZmluYWwgZmxvYXQgc2Nyb2xsZWRZRmxvYXQgPSB5ZiArIG1TY3JvbGxZOwotICAgICAgICBmaW5hbCBSZWN0IGZyYW1lID0gbVRlbXBSZWN0OwogCiAgICAgICAgIGJvb2xlYW4gZGlzYWxsb3dJbnRlcmNlcHQgPSAobUdyb3VwRmxhZ3MgJiBGTEFHX0RJU0FMTE9XX0lOVEVSQ0VQVCkgIT0gMDsKIApAQCAtODQ2LDI5ICs4ODUsMTcgQEAKICAgICAgICAgICAgICAgICBldi5zZXRBY3Rpb24oTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pOwogICAgICAgICAgICAgICAgIC8vIFdlIGtub3cgd2Ugd2FudCB0byBkaXNwYXRjaCB0aGUgZXZlbnQgZG93biwgZmluZCBhIGNoaWxkCiAgICAgICAgICAgICAgICAgLy8gd2hvIGNhbiBoYW5kbGUgaXQsIHN0YXJ0IHdpdGggdGhlIGZyb250LW1vc3QgY2hpbGQuCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHNjcm9sbGVkWEludCA9IChpbnQpIHNjcm9sbGVkWEZsb2F0OwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzY3JvbGxlZFlJbnQgPSAoaW50KSBzY3JvbGxlZFlGbG9hdDsKICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3W10gY2hpbGRyZW4gPSBtQ2hpbGRyZW47CiAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgICBpZiAoKGNoaWxkLm1WaWV3RmxhZ3MgJiBWSVNJQklMSVRZX01BU0spID09IFZJU0lCTEUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjaGlsZC5nZXRBbmltYXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRIaXRSZWN0KGZyYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZS5jb250YWlucyhzY3JvbGxlZFhJbnQsIHNjcm9sbGVkWUludCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgdGhlIGV2ZW50IHRvIHRoZSB2aWV3J3MgY29vcmRpbmF0ZSBzeXN0ZW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCB4YyA9IHNjcm9sbGVkWEZsb2F0IC0gY2hpbGQubUxlZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgeWMgPSBzY3JvbGxlZFlGbG9hdCAtIGNoaWxkLm1Ub3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuc2V0TG9jYXRpb24oeGMsIHljKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5tUHJpdmF0ZUZsYWdzICY9IH5DQU5DRUxfTkVYVF9VUF9FVkVOVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2KSkgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgaGFuZGxlZCwgd2UgaGF2ZSBhIHRhcmdldCBub3cuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25UYXJnZXQgPSBjaGlsZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBldmVudCBkaWRuJ3QgZ2V0IGhhbmRsZWQsIHRyeSB0aGUgbmV4dCB2aWV3LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHJlc2V0IHRoZSBldmVudCdzIGxvY2F0aW9uLCBpdCdzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lY2Vzc2FyeSBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlIGRpc3BhdGNoIGFsd2F5cyBwaWNrcyBpdHMgdGFyZ2V0IGJhc2VkIG9uIHRoZSBpbml0aWFsIGRvd24KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50J3MgcG9zaXRpb24gLSBpbmRleCAwCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcGF0Y2hUb3VjaEV2ZW50SWZJblZpZXcoY2hpbGQsIGV2LCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25UYXJnZXQgPSBjaGlsZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTg5OCwxMSArOTI1LDIyIEBACiAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2KTsKICAgICAgICAgfQogCisgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgb2Zmc2V0IHBvaW50IGludG8gdGhlIHRhcmdldCdzIGxvY2FsIGNvb3JkaW5hdGVzCisgICAgICAgIGZsb2F0IHhjID0gc2Nyb2xsZWRYRmxvYXQgLSAoZmxvYXQpIHRhcmdldC5tTGVmdDsKKyAgICAgICAgZmxvYXQgeWMgPSBzY3JvbGxlZFlGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1Ub3A7CisgICAgICAgIGlmICghdGFyZ2V0Lmhhc0lkZW50aXR5TWF0cml4KCkgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbm9uLWlkZW50aXR5IG1hdHJpeDogdHJhbnNmb3JtIHRoZSBwb2ludCBpbnRvIHRoZSB2aWV3J3MgY29vcmRpbmF0ZXMKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0W10gbG9jYWxYWSA9IG1BdHRhY2hJbmZvLm1UbXBUcmFuc2Zvcm1Mb2NhdGlvbjsKKyAgICAgICAgICAgIGxvY2FsWFlbMF0gPSB4YzsKKyAgICAgICAgICAgIGxvY2FsWFlbMV0gPSB5YzsKKyAgICAgICAgICAgIHRhcmdldC5nZXRJbnZlcnNlTWF0cml4KCkubWFwUG9pbnRzKGxvY2FsWFkpOworICAgICAgICAgICAgeGMgPSBsb2NhbFhZWzBdOworICAgICAgICAgICAgeWMgPSBsb2NhbFhZWzFdOworICAgICAgICB9CisKICAgICAgICAgLy8gaWYgaGF2ZSBhIHRhcmdldCwgc2VlIGlmIHdlJ3JlIGFsbG93ZWQgdG8gYW5kIHdhbnQgdG8gaW50ZXJjZXB0IGl0cwogICAgICAgICAvLyBldmVudHMKICAgICAgICAgaWYgKCFkaXNhbGxvd0ludGVyY2VwdCAmJiBvbkludGVyY2VwdFRvdWNoRXZlbnQoZXYpKSB7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCB4YyA9IHNjcm9sbGVkWEZsb2F0IC0gKGZsb2F0KSB0YXJnZXQubUxlZnQ7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCB5YyA9IHNjcm9sbGVkWUZsb2F0IC0gKGZsb2F0KSB0YXJnZXQubVRvcDsKICAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgJj0gfkNBTkNFTF9ORVhUX1VQX0VWRU5UOwogICAgICAgICAgICAgZXYuc2V0QWN0aW9uKE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpOwogICAgICAgICAgICAgZXYuc2V0TG9jYXRpb24oeGMsIHljKTsKQEAgLTkyNCw4ICs5NjIsNiBAQAogCiAgICAgICAgIC8vIGZpbmFsbHkgb2Zmc2V0IHRoZSBldmVudCB0byB0aGUgdGFyZ2V0J3MgY29vcmRpbmF0ZSBzeXN0ZW0gYW5kCiAgICAgICAgIC8vIGRpc3BhdGNoIHRoZSBldmVudC4KLSAgICAgICAgZmluYWwgZmxvYXQgeGMgPSBzY3JvbGxlZFhGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1MZWZ0OwotICAgICAgICBmaW5hbCBmbG9hdCB5YyA9IHNjcm9sbGVkWUZsb2F0IC0gKGZsb2F0KSB0YXJnZXQubVRvcDsKICAgICAgICAgZXYuc2V0TG9jYXRpb24oeGMsIHljKTsKIAogICAgICAgICBpZiAoKHRhcmdldC5tUHJpdmF0ZUZsYWdzICYgQ0FOQ0VMX05FWFRfVVBfRVZFTlQpICE9IDApIHsKQEAgLTkzNCw3ICs5NzAsMjk1IEBACiAgICAgICAgICAgICBtTW90aW9uVGFyZ2V0ID0gbnVsbDsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiB0YXJnZXQuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2KTsKKyAgICAgICAgaWYgKHRhcmdldC5kaXNwYXRjaFRvdWNoRXZlbnQoZXYpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV2LnNldExvY2F0aW9uKHhmLCB5Zik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGRldGVjdHMgd2hldGhlciB0aGUgcG9pbnRlciBsb2NhdGlvbiBhdCA8Y29kZT5wb2ludGVySW5kZXg8L2NvZGU+IHdpdGhpbgorICAgICAqIDxjb2RlPmV2PC9jb2RlPiBpcyBpbnNpZGUgdGhlIHNwZWNpZmllZCB2aWV3LiBJZiBzbywgdGhlIHRyYW5zZm9ybWVkIGV2ZW50IGlzIGRpc3BhdGNoZWQgdG8KKyAgICAgKiA8Y29kZT5jaGlsZDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGQgVmlldyB0byBoaXQgdGVzdCBhZ2FpbnN0CisgICAgICogQHBhcmFtIGV2IE1vdGlvbkV2ZW50IHRvIHRlc3QKKyAgICAgKiBAcGFyYW0gcG9pbnRlckluZGV4IEluZGV4IG9mIHRoZSBwb2ludGVyIHdpdGhpbiA8Y29kZT5ldjwvY29kZT4gdG8gdGVzdAorICAgICAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBoaXQgdGVzdCBmYWlsZWQsIG9yIHRoZSByZXN1bHQgb2YKKyAgICAgKiAgICAgICAgIDxjb2RlPmNoaWxkLmRpc3BhdGNoVG91Y2hFdmVudDwvY29kZT4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGlzcGF0Y2hUb3VjaEV2ZW50SWZJblZpZXcoVmlldyBjaGlsZCwgTW90aW9uRXZlbnQgZXYsIGludCBwb2ludGVySW5kZXgpIHsKKyAgICAgICAgZmluYWwgZmxvYXQgeCA9IGV2LmdldFgocG9pbnRlckluZGV4KTsKKyAgICAgICAgZmluYWwgZmxvYXQgeSA9IGV2LmdldFkocG9pbnRlckluZGV4KTsKKyAgICAgICAgZmluYWwgZmxvYXQgc2Nyb2xsZWRYID0geCArIG1TY3JvbGxYOworICAgICAgICBmaW5hbCBmbG9hdCBzY3JvbGxlZFkgPSB5ICsgbVNjcm9sbFk7CisgICAgICAgIGZsb2F0IGxvY2FsWCA9IHNjcm9sbGVkWCAtIGNoaWxkLm1MZWZ0OworICAgICAgICBmbG9hdCBsb2NhbFkgPSBzY3JvbGxlZFkgLSBjaGlsZC5tVG9wOworICAgICAgICBpZiAoIWNoaWxkLmhhc0lkZW50aXR5TWF0cml4KCkgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbm9uLWlkZW50aXR5IG1hdHJpeDogdHJhbnNmb3JtIHRoZSBwb2ludCBpbnRvIHRoZSB2aWV3J3MgY29vcmRpbmF0ZXMKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0W10gbG9jYWxYWSA9IG1BdHRhY2hJbmZvLm1UbXBUcmFuc2Zvcm1Mb2NhdGlvbjsKKyAgICAgICAgICAgIGxvY2FsWFlbMF0gPSBsb2NhbFg7CisgICAgICAgICAgICBsb2NhbFhZWzFdID0gbG9jYWxZOworICAgICAgICAgICAgY2hpbGQuZ2V0SW52ZXJzZU1hdHJpeCgpLm1hcFBvaW50cyhsb2NhbFhZKTsKKyAgICAgICAgICAgIGxvY2FsWCA9IGxvY2FsWFlbMF07CisgICAgICAgICAgICBsb2NhbFkgPSBsb2NhbFhZWzFdOworICAgICAgICB9CisgICAgICAgIGlmIChsb2NhbFggPj0gMCAmJiBsb2NhbFkgPj0gMCAmJiBsb2NhbFggPCAoY2hpbGQubVJpZ2h0IC0gY2hpbGQubUxlZnQpICYmCisgICAgICAgICAgICAgICAgbG9jYWxZIDwgKGNoaWxkLm1Cb3R0b20gLSBjaGlsZC5tVG9wKSkgeworICAgICAgICAgICAgLy8gSXQgd291bGQgYmUgc2FmZXIgdG8gY2xvbmUgdGhlIGV2ZW50IGhlcmUgYnV0IHdlIGRvbid0IGZvciBwZXJmb3JtYW5jZS4KKyAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBtYW55IHN1YnRsZSBpbnRlcmFjdGlvbnMgaW4gdG91Y2ggZXZlbnQgZGlzcGF0Y2g7IGNoYW5nZSBhdCB5b3VyIG93biByaXNrLgorICAgICAgICAgICAgY2hpbGQubVByaXZhdGVGbGFncyAmPSB+Q0FOQ0VMX05FWFRfVVBfRVZFTlQ7CisgICAgICAgICAgICBldi5vZmZzZXRMb2NhdGlvbihsb2NhbFggLSB4LCBsb2NhbFkgLSB5KTsKKyAgICAgICAgICAgIGlmIChjaGlsZC5kaXNwYXRjaFRvdWNoRXZlbnQoZXYpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV2Lm9mZnNldExvY2F0aW9uKHggLSBsb2NhbFgsIHkgLSBsb2NhbFkpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGRpc3BhdGNoU3BsaXRUb3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIGZpbmFsIFNwbGl0TW90aW9uVGFyZ2V0cyB0YXJnZXRzID0gbVNwbGl0TW90aW9uVGFyZ2V0czsKKyAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBmaW5hbCBpbnQgbWFza2VkQWN0aW9uID0gZXYuZ2V0QWN0aW9uTWFza2VkKCk7CisgICAgICAgIGZsb2F0IHhmID0gZXYuZ2V0WCgpOworICAgICAgICBmbG9hdCB5ZiA9IGV2LmdldFkoKTsKKyAgICAgICAgZmxvYXQgc2Nyb2xsZWRYRmxvYXQgPSB4ZiArIG1TY3JvbGxYOworICAgICAgICBmbG9hdCBzY3JvbGxlZFlGbG9hdCA9IHlmICsgbVNjcm9sbFk7CisKKyAgICAgICAgYm9vbGVhbiBkaXNhbGxvd0ludGVyY2VwdCA9IChtR3JvdXBGbGFncyAmIEZMQUdfRElTQUxMT1dfSU5URVJDRVBUKSAhPSAwOworCisgICAgICAgIGlmIChtYXNrZWRBY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04gfHwKKyAgICAgICAgICAgICAgICBtYXNrZWRBY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTikgeworICAgICAgICAgICAgZmluYWwgaW50IGFjdGlvbkluZGV4ID0gZXYuZ2V0QWN0aW9uSW5kZXgoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBhY3Rpb25JZCA9IGV2LmdldFBvaW50ZXJJZChhY3Rpb25JbmRleCk7CisKKyAgICAgICAgICAgIC8vIENsZWFyIG91dCBhbnkgY3VycmVudCB0YXJnZXQgZm9yIHRoaXMgSUQuCisgICAgICAgICAgICAvLyBYWFg6IFdlIHNob3VsZCBwcm9iYWJseSBzZW5kIGFuIEFDVElPTl9VUCB0byB0aGUgY3VycmVudAorICAgICAgICAgICAgLy8gdGFyZ2V0IGlmIHByZXNlbnQuCisgICAgICAgICAgICB0YXJnZXRzLnJlbW92ZUJ5SWQoYWN0aW9uSWQpOworCisgICAgICAgICAgICAvLyBJZiB3ZSdyZSBkaXNhbGxvd2luZyBpbnRlcmNlcHQgb3IgaWYgd2UncmUgYWxsb3dpbmcgYW5kIHdlIGRpZG4ndAorICAgICAgICAgICAgLy8gaW50ZXJjZXB0CisgICAgICAgICAgICBpZiAoZGlzYWxsb3dJbnRlcmNlcHQgfHwgIW9uSW50ZXJjZXB0VG91Y2hFdmVudChldikpIHsKKyAgICAgICAgICAgICAgICAvLyByZXNldCB0aGlzIGV2ZW50J3MgYWN0aW9uIChqdXN0IHRvIHByb3RlY3Qgb3Vyc2VsdmVzKQorICAgICAgICAgICAgICAgIGV2LnNldEFjdGlvbihhY3Rpb24pOworICAgICAgICAgICAgICAgIC8vIFdlIGtub3cgd2Ugd2FudCB0byBkaXNwYXRjaCB0aGUgZXZlbnQgZG93biwgdHJ5IHRvIGZpbmQgYSBjaGlsZAorICAgICAgICAgICAgICAgIC8vIHdobyBjYW4gaGFuZGxlIGl0LCBzdGFydCB3aXRoIHRoZSBmcm9udC1tb3N0IGNoaWxkLgorICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZG93blRpbWUgPSBldi5nZXRFdmVudFRpbWUoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3W10gY2hpbGRyZW4gPSBtQ2hpbGRyZW47CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGNoaWxkcmVuW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoKGNoaWxkLm1WaWV3RmxhZ3MgJiBWSVNJQklMSVRZX01BU0spID09IFZJU0lCTEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjaGlsZC5nZXRBbmltYXRpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNb3Rpb25FdmVudCBjaGlsZEV2ZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cy5maWx0ZXJNb3Rpb25FdmVudEZvckNoaWxkKGV2LCBjaGlsZCwgZG93blRpbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRXZlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZEFjdGlvbkluZGV4ID0gY2hpbGRFdmVudC5maW5kUG9pbnRlckluZGV4KGFjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3BhdGNoVG91Y2hFdmVudElmSW5WaWV3KGNoaWxkLCBjaGlsZEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkQWN0aW9uSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLmFkZChhY3Rpb25JZCwgY2hpbGQsIGRvd25UaW1lKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEV2ZW50LnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBEaWRuJ3QgZmluZCBhIG5ldyB0YXJnZXQuIERvIHdlIGhhdmUgYSAicHJpbWFyeSIgdGFyZ2V0IHRvIHNlbmQgdG8/CisgICAgICAgICAgICAgICAgZmluYWwgU3BsaXRNb3Rpb25UYXJnZXRzLlRhcmdldEluZm8gcHJpbWFyeVRhcmdldEluZm8gPSB0YXJnZXRzLmdldFByaW1hcnlUYXJnZXQoKTsKKyAgICAgICAgICAgICAgICBpZiAocHJpbWFyeVRhcmdldEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHByaW1hcnlUYXJnZXQgPSBwcmltYXJ5VGFyZ2V0SW5mby52aWV3OworICAgICAgICAgICAgICAgICAgICBmaW5hbCBNb3Rpb25FdmVudCBjaGlsZEV2ZW50ID0gdGFyZ2V0cy5maWx0ZXJNb3Rpb25FdmVudEZvckNoaWxkKGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlUYXJnZXQsIHByaW1hcnlUYXJnZXRJbmZvLmRvd25UaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRXZlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG9mZnNldCBwb2ludCBpbnRvIHRoZSB0YXJnZXQncyBsb2NhbCBjb29yZGluYXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHhjID0gc2Nyb2xsZWRYRmxvYXQgLSAoZmxvYXQpIHByaW1hcnlUYXJnZXQubUxlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeWMgPSBzY3JvbGxlZFlGbG9hdCAtIChmbG9hdCkgcHJpbWFyeVRhcmdldC5tVG9wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJpbWFyeVRhcmdldC5oYXNJZGVudGl0eU1hdHJpeCgpICYmIG1BdHRhY2hJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLWlkZW50aXR5IG1hdHJpeDogdHJhbnNmb3JtIHRoZSBwb2ludCBpbnRvIHRoZSB2aWV3J3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29vcmRpbmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXRbXSBsb2NhbFhZID0gbUF0dGFjaEluZm8ubVRtcFRyYW5zZm9ybUxvY2F0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFhZWzBdID0geGM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsWFlbMV0gPSB5YzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeVRhcmdldC5nZXRJbnZlcnNlTWF0cml4KCkubWFwUG9pbnRzKGxvY2FsWFkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4YyA9IGxvY2FsWFlbMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHljID0gbG9jYWxYWVsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFdmVudC5zZXRMb2NhdGlvbih4YywgeWMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmltYXJ5VGFyZ2V0LmRpc3BhdGNoVG91Y2hFdmVudChjaGlsZEV2ZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLmFkZChhY3Rpb25JZCwgcHJpbWFyeVRhcmdldCwgcHJpbWFyeVRhcmdldEluZm8uZG93blRpbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRXZlbnQucmVjeWNsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpc1VwT3JDYW5jZWwgPSAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgfHwKKyAgICAgICAgICAgICAgICAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpOworCisgICAgICAgIGlmIChpc1VwT3JDYW5jZWwpIHsKKyAgICAgICAgICAgIC8vIE5vdGUsIHdlJ3ZlIGFscmVhZHkgY29waWVkIHRoZSBwcmV2aW91cyBzdGF0ZSB0byBvdXIgbG9jYWwKKyAgICAgICAgICAgIC8vIHZhcmlhYmxlLCBzbyB0aGlzIHRha2VzIGVmZmVjdCBvbiB0aGUgbmV4dCBldmVudAorICAgICAgICAgICAgbUdyb3VwRmxhZ3MgJj0gfkZMQUdfRElTQUxMT1dfSU5URVJDRVBUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRhcmdldHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBXZSBkb24ndCBoYXZlIGFueSB0YXJnZXRzLCB0aGlzIG1lYW5zIHdlJ3JlIGhhbmRsaW5nIHRoZQorICAgICAgICAgICAgLy8gZXZlbnQgYXMgYSByZWd1bGFyIHZpZXcuCisgICAgICAgICAgICBldi5zZXRMb2NhdGlvbih4ZiwgeWYpOworICAgICAgICAgICAgaWYgKChtUHJpdmF0ZUZsYWdzICYgQ0FOQ0VMX05FWFRfVVBfRVZFTlQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBldi5zZXRBY3Rpb24oTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTCk7CisgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFncyAmPSB+Q0FOQ0VMX05FWFRfVVBfRVZFTlQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHdlIGhhdmUgdGFyZ2V0cywgc2VlIGlmIHdlJ3JlIGFsbG93ZWQgdG8gYW5kIHdhbnQgdG8gaW50ZXJjZXB0IHRoZWlyCisgICAgICAgIC8vIGV2ZW50cworICAgICAgICBpbnQgdW5pcXVlVGFyZ2V0Q291bnQgPSB0YXJnZXRzLmdldFVuaXF1ZVRhcmdldENvdW50KCk7CisgICAgICAgIGlmICghZGlzYWxsb3dJbnRlcmNlcHQgJiYgb25JbnRlcmNlcHRUb3VjaEV2ZW50KGV2KSkgeworICAgICAgICAgICAgbVByaXZhdGVGbGFncyAmPSB+Q0FOQ0VMX05FWFRfVVBfRVZFTlQ7CisKKyAgICAgICAgICAgIGZvciAoaW50IHVuaXF1ZUluZGV4ID0gMDsgdW5pcXVlSW5kZXggPCB1bmlxdWVUYXJnZXRDb3VudDsgdW5pcXVlSW5kZXgrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgdGFyZ2V0ID0gdGFyZ2V0cy5nZXRVbmlxdWVUYXJnZXRBdCh1bmlxdWVJbmRleCkudmlldzsKKworICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgb2Zmc2V0IHBvaW50IGludG8gdGhlIHRhcmdldCdzIGxvY2FsIGNvb3JkaW5hdGVzCisgICAgICAgICAgICAgICAgZmxvYXQgeGMgPSBzY3JvbGxlZFhGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1MZWZ0OworICAgICAgICAgICAgICAgIGZsb2F0IHljID0gc2Nyb2xsZWRZRmxvYXQgLSAoZmxvYXQpIHRhcmdldC5tVG9wOworICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0Lmhhc0lkZW50aXR5TWF0cml4KCkgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBub24taWRlbnRpdHkgbWF0cml4OiB0cmFuc2Zvcm0gdGhlIHBvaW50IGludG8gdGhlIHZpZXcncyBjb29yZGluYXRlcworICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdFtdIGxvY2FsWFkgPSBtQXR0YWNoSW5mby5tVG1wVHJhbnNmb3JtTG9jYXRpb247CisgICAgICAgICAgICAgICAgICAgIGxvY2FsWFlbMF0gPSB4YzsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxYWVsxXSA9IHljOworICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZ2V0SW52ZXJzZU1hdHJpeCgpLm1hcFBvaW50cyhsb2NhbFhZKTsKKyAgICAgICAgICAgICAgICAgICAgeGMgPSBsb2NhbFhZWzBdOworICAgICAgICAgICAgICAgICAgICB5YyA9IGxvY2FsWFlbMV07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZXYuc2V0QWN0aW9uKE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpOworICAgICAgICAgICAgICAgIGV2LnNldExvY2F0aW9uKHhjLCB5Yyk7CisgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2KSkgeworICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQgZGlkbid0IGhhbmRsZSBBQ1RJT05fQ0FOQ0VMLiBub3QgbXVjaCB3ZSBjYW4gZG8KKyAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHRoZXkgc2hvdWxkIGhhdmUuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGFyZ2V0cy5jbGVhcigpOworICAgICAgICAgICAgLy8gRG9uJ3QgZGlzcGF0Y2ggdGhpcyBldmVudCB0byBvdXIgb3duIHZpZXcsIGJlY2F1c2Ugd2UgYWxyZWFkeQorICAgICAgICAgICAgLy8gc2F3IGl0IHdoZW4gaW50ZXJjZXB0aW5nOyB3ZSBqdXN0IHdhbnQgdG8gZ2l2ZSB0aGUgZm9sbG93aW5nCisgICAgICAgICAgICAvLyBldmVudCB0byB0aGUgbm9ybWFsIG9uVG91Y2hFdmVudCgpLgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgdW5pcXVlSW5kZXggPSAwOyB1bmlxdWVJbmRleCA8IHVuaXF1ZVRhcmdldENvdW50OyB1bmlxdWVJbmRleCsrKSB7CisgICAgICAgICAgICBmaW5hbCBTcGxpdE1vdGlvblRhcmdldHMuVGFyZ2V0SW5mbyB0YXJnZXRJbmZvID0gdGFyZ2V0cy5nZXRVbmlxdWVUYXJnZXRBdCh1bmlxdWVJbmRleCk7CisgICAgICAgICAgICBmaW5hbCBWaWV3IHRhcmdldCA9IHRhcmdldEluZm8udmlldzsKKworICAgICAgICAgICAgZmluYWwgTW90aW9uRXZlbnQgdGFyZ2V0RXZlbnQgPQorICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLmZpbHRlck1vdGlvbkV2ZW50Rm9yQ2hpbGQoZXYsIHRhcmdldCwgdGFyZ2V0SW5mby5kb3duVGltZSk7CisgICAgICAgICAgICBpZiAodGFyZ2V0RXZlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgb2Zmc2V0IHBvaW50IGludG8gdGhlIHRhcmdldCdzIGxvY2FsIGNvb3JkaW5hdGVzCisgICAgICAgICAgICAgICAgeGYgPSB0YXJnZXRFdmVudC5nZXRYKCk7CisgICAgICAgICAgICAgICAgeWYgPSB0YXJnZXRFdmVudC5nZXRZKCk7CisgICAgICAgICAgICAgICAgc2Nyb2xsZWRYRmxvYXQgPSB4ZiArIG1TY3JvbGxYOworICAgICAgICAgICAgICAgIHNjcm9sbGVkWUZsb2F0ID0geWYgKyBtU2Nyb2xsWTsKKyAgICAgICAgICAgICAgICBmbG9hdCB4YyA9IHNjcm9sbGVkWEZsb2F0IC0gKGZsb2F0KSB0YXJnZXQubUxlZnQ7CisgICAgICAgICAgICAgICAgZmxvYXQgeWMgPSBzY3JvbGxlZFlGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1Ub3A7CisgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuaGFzSWRlbnRpdHlNYXRyaXgoKSAmJiBtQXR0YWNoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1pZGVudGl0eSBtYXRyaXg6IHRyYW5zZm9ybSB0aGUgcG9pbnQgaW50byB0aGUgdmlldydzIGNvb3JkaW5hdGVzCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0W10gbG9jYWxYWSA9IG1BdHRhY2hJbmZvLm1UbXBUcmFuc2Zvcm1Mb2NhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxYWVswXSA9IHhjOworICAgICAgICAgICAgICAgICAgICBsb2NhbFhZWzFdID0geWM7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldC5nZXRJbnZlcnNlTWF0cml4KCkubWFwUG9pbnRzKGxvY2FsWFkpOworICAgICAgICAgICAgICAgICAgICB4YyA9IGxvY2FsWFlbMF07CisgICAgICAgICAgICAgICAgICAgIHljID0gbG9jYWxYWVsxXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBmaW5hbGx5IG9mZnNldCB0aGUgZXZlbnQgdG8gdGhlIHRhcmdldCdzIGNvb3JkaW5hdGUgc3lzdGVtIGFuZAorICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIHRoZSBldmVudC4KKyAgICAgICAgICAgICAgICB0YXJnZXRFdmVudC5zZXRMb2NhdGlvbih4YywgeWMpOworCisgICAgICAgICAgICAgICAgaWYgKCh0YXJnZXQubVByaXZhdGVGbGFncyAmIENBTkNFTF9ORVhUX1VQX0VWRU5UKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldEV2ZW50LnNldEFjdGlvbihNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMKTsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lm1Qcml2YXRlRmxhZ3MgJj0gfkNBTkNFTF9ORVhUX1VQX0VWRU5UOworICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLnJlbW92ZVZpZXcodGFyZ2V0KTsKKyAgICAgICAgICAgICAgICAgICAgdW5pcXVlSW5kZXgtLTsKKyAgICAgICAgICAgICAgICAgICAgdW5pcXVlVGFyZ2V0Q291bnQtLTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGNoaWxkSGFuZGxlZCA9IHRhcmdldC5kaXNwYXRjaFRvdWNoRXZlbnQodGFyZ2V0RXZlbnQpOworICAgICAgICAgICAgICAgIGhhbmRsZWQgfD0gY2hpbGRIYW5kbGVkOworICAgICAgICAgICAgICAgIGlmICghY2hpbGRIYW5kbGVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENoaWxkIGRvZXNuJ3Qgd2FudCB0aGVzZSBldmVudHMgYW55bW9yZSwgYnV0IHdlJ3JlIHN0aWxsIGRpc3BhdGNoaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyIHNwbGl0IGV2ZW50cyB0byBjaGlsZHJlbi4KKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cy5yZW1vdmVWaWV3KHRhcmdldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0YXJnZXRFdmVudC5yZWN5Y2xlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobWFza2VkQWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgcmVtb3ZlSWQgPSBldi5nZXRQb2ludGVySWQoZXYuZ2V0QWN0aW9uSW5kZXgoKSk7CisgICAgICAgICAgICB0YXJnZXRzLnJlbW92ZUJ5SWQocmVtb3ZlSWQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzVXBPckNhbmNlbCkgeworICAgICAgICAgICAgdGFyZ2V0cy5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGhhbmRsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlIG9yIGRpc2FibGUgdGhlIHNwbGl0dGluZyBvZiBNb3Rpb25FdmVudHMgdG8gbXVsdGlwbGUgY2hpbGRyZW4gZHVyaW5nIHRvdWNoIGV2ZW50CisgICAgICogZGlzcGF0Y2guIFRoaXMgYmVoYXZpb3IgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIDxwPldoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZCBNb3Rpb25FdmVudHMgbWF5IGJlIHNwbGl0IGFuZCBkaXNwYXRjaGVkIHRvIGRpZmZlcmVudCBjaGlsZAorICAgICAqIHZpZXdzIGRlcGVuZGluZyBvbiB3aGVyZSBlYWNoIHBvaW50ZXIgaW5pdGlhbGx5IHdlbnQgZG93bi4gVGhpcyBhbGxvd3MgZm9yIHVzZXIgaW50ZXJhY3Rpb25zCisgICAgICogc3VjaCBhcyBzY3JvbGxpbmcgdHdvIHBhbmVzIG9mIGNvbnRlbnQgaW5kZXBlbmRlbnRseSwgY2hvcmRpbmcgb2YgYnV0dG9ucywgYW5kIHBlcmZvcm1pbmcKKyAgICAgKiBpbmRlcGVuZGVudCBnZXN0dXJlcyBvbiBkaWZmZXJlbnQgcGllY2VzIG9mIGNvbnRlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3BsaXQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gYWxsb3cgTW90aW9uRXZlbnRzIHRvIGJlIHNwbGl0IGFuZCBkaXNwYXRjaGVkIHRvIG11bHRpcGxlCisgICAgICogICAgICAgICAgICAgIGNoaWxkIHZpZXdzLiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gb25seSBhbGxvdyBvbmUgY2hpbGQgdmlldyB0byBiZSB0aGUgdGFyZ2V0IG9mCisgICAgICogICAgICAgICAgICAgIGFueSBNb3Rpb25FdmVudCByZWNlaXZlZCBieSB0aGlzIFZpZXdHcm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb3Rpb25FdmVudFNwbGl0dGluZ0VuYWJsZWQoYm9vbGVhbiBzcGxpdCkgeworICAgICAgICAvLyBUT0RPIEFwcGxpY2F0aW9ucyByZWFsbHkgc2hvdWxkbid0IGNoYW5nZSB0aGlzIHNldHRpbmcgbWlkLXRvdWNoIGV2ZW50LAorICAgICAgICAvLyBidXQgcGVyaGFwcyB0aGlzIHNob3VsZCBoYW5kbGUgdGhhdCBjYXNlIGFuZCBzZW5kIEFDVElPTl9DQU5DRUxzIHRvIGFueSBjaGlsZCB2aWV3cworICAgICAgICAvLyB3aXRoIGdlc3R1cmVzIGluIHByb2dyZXNzIHdoZW4gdGhpcyBpcyBjaGFuZ2VkLgorICAgICAgICBpZiAoc3BsaXQpIHsKKyAgICAgICAgICAgIG1Hcm91cEZsYWdzIHw9IEZMQUdfU1BMSVRfTU9USU9OX0VWRU5UUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Hcm91cEZsYWdzICY9IH5GTEFHX1NQTElUX01PVElPTl9FVkVOVFM7CisgICAgICAgICAgICBtU3BsaXRNb3Rpb25UYXJnZXRzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBNb3Rpb25FdmVudHMgZGlzcGF0Y2hlZCB0byB0aGlzIFZpZXdHcm91cCBjYW4gYmUgc3BsaXQgdG8gbXVsdGlwbGUgY2hpbGRyZW4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNNb3Rpb25FdmVudFNwbGl0dGluZ0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiAobUdyb3VwRmxhZ3MgJiBGTEFHX1NQTElUX01PVElPTl9FVkVOVFMpID09IEZMQUdfU1BMSVRfTU9USU9OX0VWRU5UUzsKICAgICB9CiAKICAgICAvKioKQEAgLTExODIsNyArMTUwNiwxMCBAQAogICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2hpbGRyZW5Db3VudDsKICAgICAgICAgZmluYWwgVmlld1tdIGNoaWxkcmVuID0gbUNoaWxkcmVuOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGNoaWxkcmVuW2ldLmRpc3BhdGNoU2F2ZUluc3RhbmNlU3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgIFZpZXcgYyA9IGNoaWxkcmVuW2ldOworICAgICAgICAgICAgaWYgKChjLm1WaWV3RmxhZ3MgJiBQQVJFTlRfU0FWRV9ESVNBQkxFRF9NQVNLKSAhPSBQQVJFTlRfU0FWRV9ESVNBQkxFRCkgeworICAgICAgICAgICAgICAgIGMuZGlzcGF0Y2hTYXZlSW5zdGFuY2VTdGF0ZShjb250YWluZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjA3LDcgKzE1MzQsMTAgQEAKICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CiAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGlsZHJlbltpXS5kaXNwYXRjaFJlc3RvcmVJbnN0YW5jZVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICBWaWV3IGMgPSBjaGlsZHJlbltpXTsKKyAgICAgICAgICAgIGlmICgoYy5tVmlld0ZsYWdzICYgUEFSRU5UX1NBVkVfRElTQUJMRURfTUFTSykgIT0gUEFSRU5UX1NBVkVfRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBjLmRpc3BhdGNoUmVzdG9yZUluc3RhbmNlU3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTQ3NywyMiArMTgwNywyNSBAQAogICAgICAgICBmaW5hbCBpbnQgZmxhZ3MgPSBtR3JvdXBGbGFnczsKIAogICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19DTEVBUl9UUkFOU0ZPUk1BVElPTikgPT0gRkxBR19DTEVBUl9UUkFOU0ZPUk1BVElPTikgewotICAgICAgICAgICAgaWYgKG1DaGlsZFRyYW5zZm9ybWF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ2hpbGRUcmFuc2Zvcm1hdGlvbi5jbGVhcigpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNoaWxkVHJhbnNmb3JtYXRpb24uY2xlYXIoKTsKICAgICAgICAgICAgIG1Hcm91cEZsYWdzICY9IH5GTEFHX0NMRUFSX1RSQU5TRk9STUFUSU9OOwogICAgICAgICB9CiAKICAgICAgICAgVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtVG9BcHBseSA9IG51bGw7CisgICAgICAgIFRyYW5zZm9ybWF0aW9uIGludmFsaWRhdGlvblRyYW5zZm9ybTsKICAgICAgICAgZmluYWwgQW5pbWF0aW9uIGEgPSBjaGlsZC5nZXRBbmltYXRpb24oKTsKICAgICAgICAgYm9vbGVhbiBjb25jYXRNYXRyaXggPSBmYWxzZTsKIAotICAgICAgICBpZiAoYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobUludmFsaWRhdGVSZWdpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRlUmVnaW9uID0gbmV3IFJlY3RGKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBSZWN0RiByZWdpb24gPSBtSW52YWxpZGF0ZVJlZ2lvbjsKKyAgICAgICAgYm9vbGVhbiBzY2FsaW5nUmVxdWlyZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBjYWNoaW5nID0gZmFsc2U7CisgICAgICAgIGlmICghY2FudmFzLmlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpICYmCisgICAgICAgICAgICAgICAgKGZsYWdzICYgRkxBR19DSElMRFJFTl9EUkFXTl9XSVRIX0NBQ0hFKSA9PSBGTEFHX0NISUxEUkVOX0RSQVdOX1dJVEhfQ0FDSEUgfHwKKyAgICAgICAgICAgICAgICAoZmxhZ3MgJiBGTEFHX0FMV0FZU19EUkFXTl9XSVRIX0NBQ0hFKSA9PSBGTEFHX0FMV0FZU19EUkFXTl9XSVRIX0NBQ0hFKSB7CisgICAgICAgICAgICBjYWNoaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChtQXR0YWNoSW5mbyAhPSBudWxsKSBzY2FsaW5nUmVxdWlyZWQgPSBtQXR0YWNoSW5mby5tU2NhbGluZ1JlcXVpcmVkOworICAgICAgICB9CiAKKyAgICAgICAgaWYgKGEgIT0gbnVsbCkgewogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpbml0aWFsaXplZCA9IGEuaXNJbml0aWFsaXplZCgpOwogICAgICAgICAgICAgaWYgKCFpbml0aWFsaXplZCkgewogICAgICAgICAgICAgICAgIGEuaW5pdGlhbGl6ZShjciAtIGNsLCBjYiAtIGN0LCBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSk7CkBAIC0xNTAwLDEwICsxODMzLDE3IEBACiAgICAgICAgICAgICAgICAgY2hpbGQub25BbmltYXRpb25TdGFydCgpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobUNoaWxkVHJhbnNmb3JtYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DaGlsZFRyYW5zZm9ybWF0aW9uID0gbmV3IFRyYW5zZm9ybWF0aW9uKCk7CisgICAgICAgICAgICBtb3JlID0gYS5nZXRUcmFuc2Zvcm1hdGlvbihkcmF3aW5nVGltZSwgbUNoaWxkVHJhbnNmb3JtYXRpb24sCisgICAgICAgICAgICAgICAgICAgIHNjYWxpbmdSZXF1aXJlZCA/IG1BdHRhY2hJbmZvLm1BcHBsaWNhdGlvblNjYWxlIDogMWYpOworICAgICAgICAgICAgaWYgKHNjYWxpbmdSZXF1aXJlZCAmJiBtQXR0YWNoSW5mby5tQXBwbGljYXRpb25TY2FsZSAhPSAxZikgeworICAgICAgICAgICAgICAgIGlmIChtSW52YWxpZGF0aW9uVHJhbnNmb3JtYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uVHJhbnNmb3JtYXRpb24gPSBuZXcgVHJhbnNmb3JtYXRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW52YWxpZGF0aW9uVHJhbnNmb3JtID0gbUludmFsaWRhdGlvblRyYW5zZm9ybWF0aW9uOworICAgICAgICAgICAgICAgIGEuZ2V0VHJhbnNmb3JtYXRpb24oZHJhd2luZ1RpbWUsIGludmFsaWRhdGlvblRyYW5zZm9ybSwgMWYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRpb25UcmFuc2Zvcm0gPSBtQ2hpbGRUcmFuc2Zvcm1hdGlvbjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1vcmUgPSBhLmdldFRyYW5zZm9ybWF0aW9uKGRyYXdpbmdUaW1lLCBtQ2hpbGRUcmFuc2Zvcm1hdGlvbik7CiAgICAgICAgICAgICB0cmFuc2Zvcm1Ub0FwcGx5ID0gbUNoaWxkVHJhbnNmb3JtYXRpb247CiAKICAgICAgICAgICAgIGNvbmNhdE1hdHJpeCA9IGEud2lsbENoYW5nZVRyYW5zZm9ybWF0aW9uTWF0cml4KCk7CkBAIC0xNTIwLDcgKzE4NjAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoY2wsIGN0LCBjciwgY2IpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYS5nZXRJbnZhbGlkYXRlUmVnaW9uKDAsIDAsIGNyIC0gY2wsIGNiIC0gY3QsIHJlZ2lvbiwgdHJhbnNmb3JtVG9BcHBseSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtSW52YWxpZGF0ZVJlZ2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW52YWxpZGF0ZVJlZ2lvbiA9IG5ldyBSZWN0RigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlY3RGIHJlZ2lvbiA9IG1JbnZhbGlkYXRlUmVnaW9uOworICAgICAgICAgICAgICAgICAgICBhLmdldEludmFsaWRhdGVSZWdpb24oMCwgMCwgY3IgLSBjbCwgY2IgLSBjdCwgcmVnaW9uLCBpbnZhbGlkYXRpb25UcmFuc2Zvcm0pOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjaGlsZCBuZWVkIHRvIGRyYXcgYW4gYW5pbWF0aW9uLCBwb3RlbnRpYWxseSBvZmZzY3JlZW4sIHNvCiAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBkbyBub3QgY2FuY2VsIGludmFsaWRhdGUgcmVxdWVzdHMKQEAgLTE1MzMsOSArMTg3Nyw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgRkxBR19TVVBQT1JUX1NUQVRJQ19UUkFOU0ZPUk1BVElPTlMpID09CiAgICAgICAgICAgICAgICAgRkxBR19TVVBQT1JUX1NUQVRJQ19UUkFOU0ZPUk1BVElPTlMpIHsKLSAgICAgICAgICAgIGlmIChtQ2hpbGRUcmFuc2Zvcm1hdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNoaWxkVHJhbnNmb3JtYXRpb24gPSBuZXcgVHJhbnNmb3JtYXRpb24oKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzVHJhbnNmb3JtID0gZ2V0Q2hpbGRTdGF0aWNUcmFuc2Zvcm1hdGlvbihjaGlsZCwgbUNoaWxkVHJhbnNmb3JtYXRpb24pOwogICAgICAgICAgICAgaWYgKGhhc1RyYW5zZm9ybSkgewogICAgICAgICAgICAgICAgIGZpbmFsIGludCB0cmFuc2Zvcm1UeXBlID0gbUNoaWxkVHJhbnNmb3JtYXRpb24uZ2V0VHJhbnNmb3JtYXRpb25UeXBlKCk7CkBAIC0xNTQ1LDYgKzE4ODYsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgY29uY2F0TWF0cml4IHw9ICFjaGlsZC5oYXNJZGVudGl0eU1hdHJpeCgpOworCiAgICAgICAgIC8vIFNldHMgdGhlIGZsYWcgYXMgZWFybHkgYXMgcG9zc2libGUgdG8gYWxsb3cgZHJhdygpIGltcGxlbWVudGF0aW9ucwogICAgICAgICAvLyB0byBjYWxsIGludmFsaWRhdGUoKSBzdWNjZXNzZnVsbHkgd2hlbiBkb2luZyBhbmltYXRpb25zCiAgICAgICAgIGNoaWxkLm1Qcml2YXRlRmxhZ3MgfD0gRFJBV047CkBAIC0xNTU5LDEyICsxOTAyLDkgQEAKICAgICAgICAgZmluYWwgaW50IHN4ID0gY2hpbGQubVNjcm9sbFg7CiAgICAgICAgIGZpbmFsIGludCBzeSA9IGNoaWxkLm1TY3JvbGxZOwogCi0gICAgICAgIGJvb2xlYW4gc2NhbGluZ1JlcXVpcmVkID0gZmFsc2U7CiAgICAgICAgIEJpdG1hcCBjYWNoZSA9IG51bGw7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0NISUxEUkVOX0RSQVdOX1dJVEhfQ0FDSEUpID09IEZMQUdfQ0hJTERSRU5fRFJBV05fV0lUSF9DQUNIRSB8fAotICAgICAgICAgICAgICAgIChmbGFncyAmIEZMQUdfQUxXQVlTX0RSQVdOX1dJVEhfQ0FDSEUpID09IEZMQUdfQUxXQVlTX0RSQVdOX1dJVEhfQ0FDSEUpIHsKKyAgICAgICAgaWYgKGNhY2hpbmcpIHsKICAgICAgICAgICAgIGNhY2hlID0gY2hpbGQuZ2V0RHJhd2luZ0NhY2hlKHRydWUpOwotICAgICAgICAgICAgaWYgKG1BdHRhY2hJbmZvICE9IG51bGwpIHNjYWxpbmdSZXF1aXJlZCA9IG1BdHRhY2hJbmZvLm1TY2FsaW5nUmVxdWlyZWQ7CiAgICAgICAgIH0KIAogICAgICAgICBmaW5hbCBib29sZWFuIGhhc05vQ2FjaGUgPSBjYWNoZSA9PSBudWxsOwpAQCAtMTU4MSwzNiArMTkyMSw1MSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgZmxvYXQgYWxwaGEgPSAxLjBmOworICAgICAgICBmbG9hdCBhbHBoYSA9IGNoaWxkLmdldEFscGhhKCk7CiAKLSAgICAgICAgaWYgKHRyYW5zZm9ybVRvQXBwbHkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNvbmNhdE1hdHJpeCkgewotICAgICAgICAgICAgICAgIGludCB0cmFuc1ggPSAwOwotICAgICAgICAgICAgICAgIGludCB0cmFuc1kgPSAwOwotICAgICAgICAgICAgICAgIGlmIChoYXNOb0NhY2hlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zWCA9IC1zeDsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNZID0gLXN5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBVbmRvIHRoZSBzY3JvbGwgdHJhbnNsYXRpb24sIGFwcGx5IHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgLy8gdGhlbiByZWRvIHRoZSBzY3JvbGwgdHJhbnNsYXRlIHRvIGdldCB0aGUgY29ycmVjdCByZXN1bHQuCi0gICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtdHJhbnNYLCAtdHJhbnNZKTsKLSAgICAgICAgICAgICAgICBjYW52YXMuY29uY2F0KHRyYW5zZm9ybVRvQXBwbHkuZ2V0TWF0cml4KCkpOwotICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUodHJhbnNYLCB0cmFuc1kpOwotICAgICAgICAgICAgICAgIG1Hcm91cEZsYWdzIHw9IEZMQUdfQ0xFQVJfVFJBTlNGT1JNQVRJT047CisgICAgICAgIGlmICh0cmFuc2Zvcm1Ub0FwcGx5ICE9IG51bGwgfHwgYWxwaGEgPCAxLjBmIHx8ICFjaGlsZC5oYXNJZGVudGl0eU1hdHJpeCgpKSB7CisgICAgICAgICAgICBpbnQgdHJhbnNYID0gMDsKKyAgICAgICAgICAgIGludCB0cmFuc1kgPSAwOworCisgICAgICAgICAgICBpZiAoaGFzTm9DYWNoZSkgeworICAgICAgICAgICAgICAgIHRyYW5zWCA9IC1zeDsKKyAgICAgICAgICAgICAgICB0cmFuc1kgPSAtc3k7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGFscGhhID0gdHJhbnNmb3JtVG9BcHBseS5nZXRBbHBoYSgpOworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVRvQXBwbHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChjb25jYXRNYXRyaXgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVW5kbyB0aGUgc2Nyb2xsIHRyYW5zbGF0aW9uLCBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHJlZG8gdGhlIHNjcm9sbCB0cmFuc2xhdGUgdG8gZ2V0IHRoZSBjb3JyZWN0IHJlc3VsdC4KKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtdHJhbnNYLCAtdHJhbnNZKTsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLmNvbmNhdCh0cmFuc2Zvcm1Ub0FwcGx5LmdldE1hdHJpeCgpKTsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSh0cmFuc1gsIHRyYW5zWSk7CisgICAgICAgICAgICAgICAgICAgIG1Hcm91cEZsYWdzIHw9IEZMQUdfQ0xFQVJfVFJBTlNGT1JNQVRJT047CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmxvYXQgdHJhbnNmb3JtQWxwaGEgPSB0cmFuc2Zvcm1Ub0FwcGx5LmdldEFscGhhKCk7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUFscGhhIDwgMS4wZikgeworICAgICAgICAgICAgICAgICAgICBhbHBoYSAqPSB0cmFuc2Zvcm1Ub0FwcGx5LmdldEFscGhhKCk7CisgICAgICAgICAgICAgICAgICAgIG1Hcm91cEZsYWdzIHw9IEZMQUdfQ0xFQVJfVFJBTlNGT1JNQVRJT047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWNoaWxkLmhhc0lkZW50aXR5TWF0cml4KCkpIHsKKyAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC10cmFuc1gsIC10cmFuc1kpOworICAgICAgICAgICAgICAgIGNhbnZhcy5jb25jYXQoY2hpbGQuZ2V0TWF0cml4KCkpOworICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUodHJhbnNYLCB0cmFuc1kpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoYWxwaGEgPCAxLjBmKSB7CiAgICAgICAgICAgICAgICAgbUdyb3VwRmxhZ3MgfD0gRkxBR19DTEVBUl9UUkFOU0ZPUk1BVElPTjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGFscGhhIDwgMS4wZiAmJiBoYXNOb0NhY2hlKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IG11bHRpcGxpZWRBbHBoYSA9IChpbnQpICgyNTUgKiBhbHBoYSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFjaGlsZC5vblNldEFscGhhKG11bHRpcGxpZWRBbHBoYSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLnNhdmVMYXllckFscGhhKHN4LCBzeSwgc3ggKyBjciAtIGNsLCBzeSArIGNiIC0gY3QsIG11bHRpcGxpZWRBbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXMuSEFTX0FMUEhBX0xBWUVSX1NBVkVfRkxBRyB8IENhbnZhcy5DTElQX1RPX0xBWUVSX1NBVkVfRkxBRyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQubVByaXZhdGVGbGFncyB8PSBBTFBIQV9TRVQ7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoaGFzTm9DYWNoZSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbXVsdGlwbGllZEFscGhhID0gKGludCkgKDI1NSAqIGFscGhhKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZC5vblNldEFscGhhKG11bHRpcGxpZWRBbHBoYSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zYXZlTGF5ZXJBbHBoYShzeCwgc3ksIHN4ICsgY3IgLSBjbCwgc3kgKyBjYiAtIGN0LCBtdWx0aXBsaWVkQWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhcy5IQVNfQUxQSEFfTEFZRVJfU0FWRV9GTEFHIHwgQ2FudmFzLkNMSVBfVE9fTEFZRVJfU0FWRV9GTEFHKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLm1Qcml2YXRlRmxhZ3MgfD0gQUxQSEFfU0VUOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKChjaGlsZC5tUHJpdmF0ZUZsYWdzICYgQUxQSEFfU0VUKSA9PSBBTFBIQV9TRVQpIHsKQEAgLTE2OTcsNiArMjA1Miw3IEBACiAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgCiAgICAgICAgICAgICBjaGlsZHJlbltpXS5zZXRTZWxlY3RlZChzZWxlY3RlZCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0yNDcwLDYgKzI4MjYsMTUgQEAKICAgICAgICAgICAgIGZpbmFsIGludFtdIGxvY2F0aW9uID0gYXR0YWNoSW5mby5tSW52YWxpZGF0ZUNoaWxkTG9jYXRpb247CiAgICAgICAgICAgICBsb2NhdGlvbltDSElMRF9MRUZUX0lOREVYXSA9IGNoaWxkLm1MZWZ0OwogICAgICAgICAgICAgbG9jYXRpb25bQ0hJTERfVE9QX0lOREVYXSA9IGNoaWxkLm1Ub3A7CisgICAgICAgICAgICBNYXRyaXggY2hpbGRNYXRyaXggPSBjaGlsZC5nZXRNYXRyaXgoKTsKKyAgICAgICAgICAgIGlmICghY2hpbGRNYXRyaXguaXNJZGVudGl0eSgpKSB7CisgICAgICAgICAgICAgICAgUmVjdEYgYm91bmRpbmdSZWN0ID0gYXR0YWNoSW5mby5tVG1wVHJhbnNmb3JtUmVjdDsKKyAgICAgICAgICAgICAgICBib3VuZGluZ1JlY3Quc2V0KGRpcnR5KTsKKyAgICAgICAgICAgICAgICBjaGlsZE1hdHJpeC5tYXBSZWN0KGJvdW5kaW5nUmVjdCk7CisgICAgICAgICAgICAgICAgZGlydHkuc2V0KChpbnQpIGJvdW5kaW5nUmVjdC5sZWZ0LCAoaW50KSBib3VuZGluZ1JlY3QudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGJvdW5kaW5nUmVjdC5yaWdodCArIDAuNWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGJvdW5kaW5nUmVjdC5ib3R0b20gKyAwLjVmKSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIElmIHRoZSBjaGlsZCBpcyBkcmF3aW5nIGFuIGFuaW1hdGlvbiwgd2Ugd2FudCB0byBjb3B5IHRoaXMgZmxhZyBvbnRvCiAgICAgICAgICAgICAvLyBvdXJzZWx2ZXMgYW5kIHRoZSBwYXJlbnQgdG8gbWFrZSBzdXJlIHRoZSBpbnZhbGlkYXRlIHJlcXVlc3QgZ29lcwpAQCAtMjUwNCw2ICsyODY5LDE4IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LmludmFsaWRhdGVDaGlsZEluUGFyZW50KGxvY2F0aW9uLCBkaXJ0eSk7CisgICAgICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBBY2NvdW50IGZvciB0cmFuc2Zvcm0gb24gY3VycmVudCBwYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgTWF0cml4IG0gPSB2aWV3LmdldE1hdHJpeCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIW0uaXNJZGVudGl0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZWN0RiBib3VuZGluZ1JlY3QgPSBhdHRhY2hJbmZvLm1UbXBUcmFuc2Zvcm1SZWN0OworICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRpbmdSZWN0LnNldChkaXJ0eSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtLm1hcFJlY3QoYm91bmRpbmdSZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcnR5LnNldCgoaW50KSBib3VuZGluZ1JlY3QubGVmdCwgKGludCkgYm91bmRpbmdSZWN0LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGJvdW5kaW5nUmVjdC5yaWdodCArIDAuNWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoYm91bmRpbmdSZWN0LmJvdHRvbSArIDAuNWYpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHBhcmVudCAhPSBudWxsKTsKICAgICAgICAgfQogICAgIH0KQEAgLTI4NzAsNyArMzI0Nyw3IEBACiAgICAgICovCiAgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5KGNhdGVnb3J5ID0gImRyYXdpbmciLCBtYXBwaW5nID0gewogICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBQRVJTSVNURU5UX05PX0NBQ0hFLCAgICAgICAgdG8gPSAiTk9ORSIpLAotICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBQRVJTSVNURU5UX0FMTF9DQUNIRVMsICAgICAgdG8gPSAiQU5JTUFUSU9OIiksCisgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IFBFUlNJU1RFTlRfQU5JTUFUSU9OX0NBQ0hFLCB0byA9ICJBTklNQVRJT04iKSwKICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gUEVSU0lTVEVOVF9TQ1JPTExJTkdfQ0FDSEUsIHRvID0gIlNDUk9MTElORyIpLAogICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBQRVJTSVNURU5UX0FMTF9DQUNIRVMsICAgICAgdG8gPSAiQUxMIikKICAgICB9KQpAQCAtMzc0NCw0ICs0MTIxLDMxMiBAQAogICAgICAgICAgICAgYm90dG9tTWFyZ2luID0gYm90dG9tOwogICAgICAgICB9CiAgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3BsaXRNb3Rpb25UYXJnZXRzIHsKKyAgICAgICAgcHJpdmF0ZSBTcGFyc2VBcnJheTxWaWV3PiBtVGFyZ2V0czsKKyAgICAgICAgcHJpdmF0ZSBUYXJnZXRJbmZvW10gbVVuaXF1ZVRhcmdldHM7CisgICAgICAgIHByaXZhdGUgaW50IG1VbmlxdWVUYXJnZXRDb3VudDsKKyAgICAgICAgcHJpdmF0ZSBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzW10gbVBvaW50ZXJDb29yZHM7CisgICAgICAgIHByaXZhdGUgaW50W10gbVBvaW50ZXJJZHM7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfVU5JUVVFX01PVElPTl9UQVJHRVRTX1NJWkUgPSA1OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9CVUNLRVRfU0laRSA9IDU7CisKKyAgICAgICAgcHVibGljIFNwbGl0TW90aW9uVGFyZ2V0cygpIHsKKyAgICAgICAgICAgIG1UYXJnZXRzID0gbmV3IFNwYXJzZUFycmF5PFZpZXc+KCk7CisgICAgICAgICAgICBtVW5pcXVlVGFyZ2V0cyA9IG5ldyBUYXJnZXRJbmZvW0lOSVRJQUxfVU5JUVVFX01PVElPTl9UQVJHRVRTX1NJWkVdOworICAgICAgICAgICAgbVBvaW50ZXJJZHMgPSBuZXcgaW50W0lOSVRJQUxfQlVDS0VUX1NJWkVdOworICAgICAgICAgICAgbVBvaW50ZXJDb29yZHMgPSBuZXcgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tJTklUSUFMX0JVQ0tFVF9TSVpFXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5JVElBTF9CVUNLRVRfU0laRTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbVBvaW50ZXJDb29yZHNbaV0gPSBuZXcgTW90aW9uRXZlbnQuUG9pbnRlckNvb3JkcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICBtVGFyZ2V0cy5jbGVhcigpOworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVVuaXF1ZVRhcmdldENvdW50OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbVVuaXF1ZVRhcmdldHNbaV0ucmVjeWNsZSgpOworICAgICAgICAgICAgICAgIG1VbmlxdWVUYXJnZXRzW2ldID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1VbmlxdWVUYXJnZXRDb3VudCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGQoaW50IHBvaW50ZXJJZCwgVmlldyB0YXJnZXQsIGxvbmcgZG93blRpbWUpIHsKKyAgICAgICAgICAgIG1UYXJnZXRzLnB1dChwb2ludGVySWQsIHRhcmdldCk7CisKKyAgICAgICAgICAgIGZpbmFsIGludCB1bmlxdWVDb3VudCA9IG1VbmlxdWVUYXJnZXRDb3VudDsKKyAgICAgICAgICAgIGJvb2xlYW4gYWRkVW5pcXVlID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pcXVlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtVW5pcXVlVGFyZ2V0c1tpXS52aWV3ID09IHRhcmdldCkgeworICAgICAgICAgICAgICAgICAgICBhZGRVbmlxdWUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWRkVW5pcXVlKSB7CisgICAgICAgICAgICAgICAgaWYgKG1VbmlxdWVUYXJnZXRzLmxlbmd0aCA9PSB1bmlxdWVDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBUYXJnZXRJbmZvW10gbmV3VGFyZ2V0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGFyZ2V0SW5mb1t1bmlxdWVDb3VudCArIElOSVRJQUxfVU5JUVVFX01PVElPTl9UQVJHRVRTX1NJWkVdOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1VbmlxdWVUYXJnZXRzLCAwLCBuZXdUYXJnZXRzLCAwLCB1bmlxdWVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIG1VbmlxdWVUYXJnZXRzID0gbmV3VGFyZ2V0czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVVuaXF1ZVRhcmdldHNbdW5pcXVlQ291bnRdID0gVGFyZ2V0SW5mby5vYnRhaW4odGFyZ2V0LCBkb3duVGltZSk7CisgICAgICAgICAgICAgICAgbVVuaXF1ZVRhcmdldENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldElkQ291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVRhcmdldHMuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRVbmlxdWVUYXJnZXRDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVW5pcXVlVGFyZ2V0Q291bnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGFyZ2V0SW5mbyBnZXRVbmlxdWVUYXJnZXRBdChpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVW5pcXVlVGFyZ2V0c1tpbmRleF07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVmlldyBnZXQoaW50IGlkKSB7CisgICAgICAgICAgICByZXR1cm4gbVRhcmdldHMuZ2V0KGlkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaW5kZXhPZklkKGludCBpZCkgeworICAgICAgICAgICAgcmV0dXJuIG1UYXJnZXRzLmluZGV4T2ZLZXkoaWQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBpbmRleE9mVGFyZ2V0KFZpZXcgdGFyZ2V0KSB7CisgICAgICAgICAgICByZXR1cm4gbVRhcmdldHMuaW5kZXhPZlZhbHVlKHRhcmdldCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGlkQXQoaW50IGluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gbVRhcmdldHMua2V5QXQoaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFZpZXcgdGFyZ2V0QXQoaW50IGluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gbVRhcmdldHMudmFsdWVBdChpbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGFyZ2V0SW5mbyBnZXRQcmltYXJ5VGFyZ2V0KCkgeworICAgICAgICAgICAgaWYgKCFpc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBsb25nZXN0LWxpdmVkIHRhcmdldAorICAgICAgICAgICAgICAgIGxvbmcgZmlyc3RUaW1lID0gTG9uZy5NQVhfVkFMVUU7CisgICAgICAgICAgICAgICAgaW50IGZpcnN0SW5kZXggPSAwOworICAgICAgICAgICAgICAgIGZpbmFsIGludCB1bmlxdWVDb3VudCA9IG1VbmlxdWVUYXJnZXRDb3VudDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXF1ZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgVGFyZ2V0SW5mbyBpbmZvID0gbVVuaXF1ZVRhcmdldHNbaV07CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLmRvd25UaW1lIDwgZmlyc3RUaW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFRpbWUgPSBpbmZvLmRvd25UaW1lOworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJbmRleCA9IGk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1VbmlxdWVUYXJnZXRzW2ZpcnN0SW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNUYXJnZXQoVmlldyB0YXJnZXQpIHsKKyAgICAgICAgICAgIGZpbmFsIFRhcmdldEluZm9bXSB1bmlxdWUgPSBtVW5pcXVlVGFyZ2V0czsKKyAgICAgICAgICAgIGZpbmFsIGludCB1bmlxdWVDb3VudCA9IG1VbmlxdWVUYXJnZXRDb3VudDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pcXVlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh1bmlxdWVbaV0udmlldyA9PSB0YXJnZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVW5pcXVlVGFyZ2V0Q291bnQgPT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUJ5SWQoaW50IGlkKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBtVGFyZ2V0cy5pbmRleE9mS2V5KGlkKTsKKyAgICAgICAgICAgIHJlbW92ZUF0KGluZGV4KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlVmlldyhWaWV3IHZpZXcpIHsKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChpIDwgbVRhcmdldHMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1UYXJnZXRzLnZhbHVlQXQoaSkgPT0gdmlldykgeworICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0cy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVtb3ZlVW5pcXVlKHZpZXcpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlQXQoaW50IGluZGV4KSB7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG1UYXJnZXRzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgVmlldyByZW1vdmVWaWV3ID0gbVRhcmdldHMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICBtVGFyZ2V0cy5yZW1vdmVBdChpbmRleCk7CisgICAgICAgICAgICBpZiAobVRhcmdldHMuaW5kZXhPZlZhbHVlKHJlbW92ZVZpZXcpIDwgMCkgeworICAgICAgICAgICAgICAgIHJlbW92ZVVuaXF1ZShyZW1vdmVWaWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCByZW1vdmVVbmlxdWUoVmlldyByZW1vdmVWaWV3KSB7CisgICAgICAgICAgICBUYXJnZXRJbmZvW10gdW5pcXVlID0gbVVuaXF1ZVRhcmdldHM7CisgICAgICAgICAgICBpbnQgdW5pcXVlQ291bnQgPSBtVW5pcXVlVGFyZ2V0Q291bnQ7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVuaXF1ZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodW5pcXVlW2ldLnZpZXcgPT0gcmVtb3ZlVmlldykgeworICAgICAgICAgICAgICAgICAgICB1bmlxdWVbaV0ucmVjeWNsZSgpOworICAgICAgICAgICAgICAgICAgICB1bmlxdWVbaV0gPSB1bmlxdWVbLS11bmlxdWVDb3VudF07CisgICAgICAgICAgICAgICAgICAgIHVuaXF1ZVt1bmlxdWVDb3VudF0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1VbmlxdWVUYXJnZXRDb3VudCA9IHVuaXF1ZUNvdW50OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiBhIG5ldyAob2J0YWluKCllZCkgTW90aW9uRXZlbnQgY29udGFpbmluZyBvbmx5IGRhdGEgZm9yIHBvaW50ZXJzIHRoYXQgc2hvdWxkCisgICAgICAgICAqIGJlIGRpc3BhdGNoZWQgdG8gY2hpbGQuIERvbid0IGZvcmdldCB0byByZWN5Y2xlIGl0IQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE1vdGlvbkV2ZW50IGZpbHRlck1vdGlvbkV2ZW50Rm9yQ2hpbGQoTW90aW9uRXZlbnQgZXYsIFZpZXcgY2hpbGQsIGxvbmcgZG93blRpbWUpIHsKKyAgICAgICAgICAgIGludCBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBtYXNrZWRBY3Rpb24gPSBhY3Rpb24gJiBNb3Rpb25FdmVudC5BQ1RJT05fTUFTSzsKKworICAgICAgICAgICAgLy8gT25seSBzZW5kIHBvaW50ZXIgdXAgZXZlbnRzIGlmIHRoaXMgY2hpbGQgd2FzIHRoZSB0YXJnZXQuIERyb3AgaXQgb3RoZXJ3aXNlLgorICAgICAgICAgICAgaWYgKG1hc2tlZEFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUCAmJgorICAgICAgICAgICAgICAgICAgICBnZXQoZXYuZ2V0UG9pbnRlcklkKGV2LmdldEFjdGlvbkluZGV4KCkpKSAhPSBjaGlsZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgcG9pbnRlckNvdW50ID0gMDsKKyAgICAgICAgICAgIGZpbmFsIGludCBpZENvdW50ID0gZ2V0SWRDb3VudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0QXQoaSkgPT0gY2hpbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9pbnRlckNvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgYWN0aW9uSWQgPSAtMTsKKyAgICAgICAgICAgIGJvb2xlYW4gbmVlZHNOZXdJbmRleCA9IGZhbHNlOyAvLyBUcnVlIGlmIHdlIHNob3VsZCBmaWxsIGluIHRoZSBhY3Rpb24ncyBtYXNrZWQgaW5kZXgKKworICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGRvd24gZXZlbnQsIGl0IHdhc24ndCBjb3VudGVkIGFib3ZlLgorICAgICAgICAgICAgaWYgKG1hc2tlZEFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgeworICAgICAgICAgICAgICAgIHBvaW50ZXJDb3VudCsrOworICAgICAgICAgICAgICAgIGFjdGlvbklkID0gZXYuZ2V0UG9pbnRlcklkKDApOworICAgICAgICAgICAgfSBlbHNlIGlmIChtYXNrZWRBY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTikgeworICAgICAgICAgICAgICAgIHBvaW50ZXJDb3VudCsrOworCisgICAgICAgICAgICAgICAgYWN0aW9uSWQgPSBldi5nZXRQb2ludGVySWQoZXYuZ2V0QWN0aW9uSW5kZXgoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXhPZlRhcmdldChjaGlsZCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBuZXcgYWN0aW9uIHNob3VsZCBiZSBBQ1RJT05fRE9XTiBpZiB0aGlzIGNoaWxkIGlzbid0IGN1cnJlbnRseSBnZXR0aW5nCisgICAgICAgICAgICAgICAgICAgIC8vIGFueSBldmVudHMuCisgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpbGwgaW4gdGhlIGluZGV4IHBvcnRpb24gb2YgdGhlIGFjdGlvbiBsYXRlci4KKyAgICAgICAgICAgICAgICAgICAgbmVlZHNOZXdJbmRleCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtYXNrZWRBY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVApIHsKKyAgICAgICAgICAgICAgICBhY3Rpb25JZCA9IGV2LmdldFBvaW50ZXJJZChldi5nZXRBY3Rpb25JbmRleCgpKTsKKyAgICAgICAgICAgICAgICBpZiAocG9pbnRlckNvdW50ID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5ldyBhY3Rpb24gc2hvdWxkIGJlIEFDVElPTl9VUCBpZiB0aGVyZSdzIG9ubHkgb25lIHBvaW50ZXIgbGVmdCBmb3IKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB0YXJnZXQuCisgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IE1vdGlvbkV2ZW50LkFDVElPTl9VUDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBGaWxsIGluIHRoZSBpbmRleCBwb3J0aW9uIG9mIHRoZSBhY3Rpb24gbGF0ZXIuCisgICAgICAgICAgICAgICAgICAgIG5lZWRzTmV3SW5kZXggPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBvaW50ZXJDb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZpbGwgdGhlIGJ1Y2tldHMgd2l0aCBwb2ludGVyIGRhdGEhCisgICAgICAgICAgICBmaW5hbCBpbnQgZXZlbnRQb2ludGVyQ291bnQgPSBldi5nZXRQb2ludGVyQ291bnQoKTsKKyAgICAgICAgICAgIGludCBidWNrZXRJbmRleCA9IDA7CisgICAgICAgICAgICBpbnQgbmV3QWN0aW9uSW5kZXggPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGV2cCA9IDA7IGV2cCA8IGV2ZW50UG9pbnRlckNvdW50OyBldnArKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBpZCA9IGV2LmdldFBvaW50ZXJJZChldnApOworCisgICAgICAgICAgICAgICAgLy8gQWRkIHRoaXMgcG9pbnRlciB0byB0aGUgYnVja2V0IGlmIGl0IGlzIG5ldyBvciB0YXJnZXRlZCBhdCBjaGlsZAorICAgICAgICAgICAgICAgIGlmIChpZCA9PSBhY3Rpb25JZCB8fCBnZXQoaWQpID09IGNoaWxkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEV4cGFuZCBzY3JhdGNoIGFycmF5cyBpZiBuZWVkZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb2ludGVyQ29vcmRzLmxlbmd0aCA8PSBidWNrZXRJbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gcG9pbnRlcklkcyA9IG5ldyBpbnRbcG9pbnRlckNvdW50XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHNbXSBwb2ludGVyQ29vcmRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHNbcG9pbnRlckNvdW50XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUG9pbnRlckNvb3Jkcy5sZW5ndGg7IGkgPCBwb2ludGVyQ29vcmRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlckNvb3Jkc1tpXSA9IG5ldyBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobVBvaW50ZXJDb29yZHMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJDb29yZHMsIDAsIG1Qb2ludGVyQ29vcmRzLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1Qb2ludGVySWRzLCAwLCBwb2ludGVySWRzLCAwLCBtUG9pbnRlcklkcy5sZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBtUG9pbnRlckNvb3JkcyA9IHBvaW50ZXJDb29yZHM7CisgICAgICAgICAgICAgICAgICAgICAgICBtUG9pbnRlcklkcyA9IHBvaW50ZXJJZHM7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtUG9pbnRlcklkc1tidWNrZXRJbmRleF0gPSBpZDsKKyAgICAgICAgICAgICAgICAgICAgZXYuZ2V0UG9pbnRlckNvb3JkcyhldnAsIG1Qb2ludGVyQ29vcmRzW2J1Y2tldEluZGV4XSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRzTmV3SW5kZXggJiYgaWQgPT0gYWN0aW9uSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0FjdGlvbkluZGV4ID0gYnVja2V0SW5kZXg7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBidWNrZXRJbmRleCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRW5jb2RlIHRoZSBuZXcgYWN0aW9uIGluZGV4IGlmIHdlIGhhdmUgb25lCisgICAgICAgICAgICBpZiAobmV3QWN0aW9uSW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIGFjdGlvbiA9IChhY3Rpb24gJiBNb3Rpb25FdmVudC5BQ1RJT05fTUFTSykgfAorICAgICAgICAgICAgICAgICAgICAgICAgKG5ld0FjdGlvbkluZGV4IDw8IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0lOREVYX1NISUZUKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTW90aW9uRXZlbnQgcmVzdWx0ID0gTW90aW9uRXZlbnQub2J0YWluKGRvd25UaW1lLCBldi5nZXRFdmVudFRpbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uLCBwb2ludGVyQ291bnQsIG1Qb2ludGVySWRzLCBtUG9pbnRlckNvb3JkcywgZXYuZ2V0TWV0YVN0YXRlKCksCisgICAgICAgICAgICAgICAgICAgIGV2LmdldFhQcmVjaXNpb24oKSwgZXYuZ2V0WVByZWNpc2lvbigpLCBldi5nZXREZXZpY2VJZCgpLCBldi5nZXRFZGdlRmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgZXYuZ2V0U291cmNlKCkpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBjbGFzcyBUYXJnZXRJbmZvIHsKKyAgICAgICAgICAgIHB1YmxpYyBWaWV3IHZpZXc7CisgICAgICAgICAgICBwdWJsaWMgbG9uZyBkb3duVGltZTsKKworICAgICAgICAgICAgcHJpdmF0ZSBUYXJnZXRJbmZvIG1OZXh0UmVjeWNsZWQ7CisKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIFRhcmdldEluZm8gc1JlY3ljbGVCaW47CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgc1JlY3ljbGVkQ291bnQ7CisKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBNQVhfUkVDWUNMRUQgPSAxNTsKKworICAgICAgICAgICAgcHJpdmF0ZSBUYXJnZXRJbmZvKCkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFRhcmdldEluZm8gb2J0YWluKFZpZXcgdiwgbG9uZyB0aW1lKSB7CisgICAgICAgICAgICAgICAgVGFyZ2V0SW5mbyBpbmZvOworICAgICAgICAgICAgICAgIGlmIChzUmVjeWNsZUJpbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8gPSBuZXcgVGFyZ2V0SW5mbygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8gPSBzUmVjeWNsZUJpbjsKKyAgICAgICAgICAgICAgICAgICAgc1JlY3ljbGVCaW4gPSBpbmZvLm1OZXh0UmVjeWNsZWQ7CisgICAgICAgICAgICAgICAgICAgIHNSZWN5Y2xlZENvdW50LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZm8udmlldyA9IHY7CisgICAgICAgICAgICAgICAgaW5mby5kb3duVGltZSA9IHRpbWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZm87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlY3ljbGUoKSB7CisgICAgICAgICAgICAgICAgaWYgKHNSZWN5Y2xlZENvdW50ID49IE1BWF9SRUNZQ0xFRCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1OZXh0UmVjeWNsZWQgPSBzUmVjeWNsZUJpbjsKKyAgICAgICAgICAgICAgICBzUmVjeWNsZUJpbiA9IHRoaXM7CisgICAgICAgICAgICAgICAgc1JlY3ljbGVkQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1BhcmVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3UGFyZW50LmphdmEKaW5kZXggYjQ1NmM1ZC4uZDdkNGMzZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3UGFyZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3UGFyZW50LmphdmEKQEAgLTE2Miw2ICsxNjIsMjAgQEAKICAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51KTsKIAogICAgIC8qKgorICAgICAqIFN0YXJ0IGFuIGFjdGlvbiBtb2RlIGZvciB0aGUgc3BlY2lmaWVkIHZpZXcuCisgICAgICogPHA+CisgICAgICogSW4gbW9zdCBjYXNlcywgYSBzdWJjbGFzcyBkb2VzIG5vdCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMuIEhvd2V2ZXIsIGlmIHRoZQorICAgICAqIHN1YmNsYXNzIGlzIGFkZGVkIGRpcmVjdGx5IHRvIHRoZSB3aW5kb3cgbWFuYWdlciAoZm9yIGV4YW1wbGUsCisgICAgICoge0BsaW5rIFZpZXdNYW5hZ2VyI2FkZFZpZXcoVmlldywgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXMpfSkKKyAgICAgKiB0aGVuIGl0IHNob3VsZCBvdmVycmlkZSB0aGlzIGFuZCBzdGFydCB0aGUgYWN0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3JpZ2luYWxWaWV3IFRoZSBzb3VyY2UgdmlldyB3aGVyZSB0aGUgYWN0aW9uIG1vZGUgd2FzIGZpcnN0IGludm9rZWQKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRoYXQgd2lsbCBoYW5kbGUgbGlmZWN5Y2xlIGV2ZW50cyBmb3IgdGhlIGFjdGlvbiBtb2RlCisgICAgICogQHJldHVybiBUaGUgbmV3IGFjdGlvbiBtb2RlIGlmIGl0IHdhcyBzdGFydGVkLCBudWxsIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKFZpZXcgb3JpZ2luYWxWaWV3LCBBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKTsKKworICAgIC8qKgogICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiB0aGUgcGFyZW50IHdoZW4gYSBjaGlsZCdzIGRyYXdhYmxlIHN0YXRlCiAgICAgICogaGFzIGNoYW5nZWQuCiAgICAgICoKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YQppbmRleCA1N2M5MDU1Li43ZjFjMGZiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Um9vdC5qYXZhCkBAIC01NiwxMCArNTYsNiBAQAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuKjsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy4qOwotaW1wb3J0IHN0YXRpYyBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwLio7Ci0KIC8qKgogICogVGhlIHRvcCBvZiBhIHZpZXcgaGllcmFyY2h5LCBpbXBsZW1lbnRpbmcgdGhlIG5lZWRlZCBwcm90b2NvbCBiZXR3ZWVuIFZpZXcKICAqIGFuZCB0aGUgV2luZG93TWFuYWdlci4gIFRoaXMgaXMgZm9yIHRoZSBtb3N0IHBhcnQgYW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24KQEAgLTY3LDE0ICs2MywxMiBAQAogICoKICAqIHtAaGlkZX0KICAqLwotQFN1cHByZXNzV2FybmluZ3MoeyJFbXB0eUNhdGNoQmxvY2sifSkKLXB1YmxpYyBmaW5hbCBjbGFzcyBWaWV3Um9vdCBleHRlbmRzIEhhbmRsZXIgaW1wbGVtZW50cyBWaWV3UGFyZW50LAotICAgICAgICBWaWV3LkF0dGFjaEluZm8uQ2FsbGJhY2tzIHsKK0BTdXBwcmVzc1dhcm5pbmdzKHsiRW1wdHlDYXRjaEJsb2NrIiwgIlBvaW50bGVzc0Jvb2xlYW5FeHByZXNzaW9uIn0pCitwdWJsaWMgZmluYWwgY2xhc3MgVmlld1Jvb3QgZXh0ZW5kcyBIYW5kbGVyIGltcGxlbWVudHMgVmlld1BhcmVudCwgVmlldy5BdHRhY2hJbmZvLkNhbGxiYWNrcyB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWaWV3Um9vdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFNIT1dfRlBTID0gZmFsc2U7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJDb25zdGFudENvbmRpdGlvbmFsRXhwcmVzc2lvbiJ9KQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HViA9IGZhbHNlID8gQ29uZmlnLkxPR0QgOiBDb25maWcuTE9HVjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMX0xPR1YgPSBmYWxzZTsKICAgICAvKiogQG5vaW5zcGVjdGlvbiBQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbiovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19EUkFXID0gZmFsc2UgfHwgTE9DQUxfTE9HVjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0xBWU9VVCA9IGZhbHNlIHx8IExPQ0FMX0xPR1Y7CkBAIC0yMDQsMTQgKzE5OCw3IEBACiAgICAgaW50IG1DdXJTY3JvbGxZOwogICAgIFNjcm9sbGVyIG1TY3JvbGxlcjsKIAotICAgIEVHTDEwIG1FZ2w7Ci0gICAgRUdMRGlzcGxheSBtRWdsRGlzcGxheTsKLSAgICBFR0xDb250ZXh0IG1FZ2xDb250ZXh0OwotICAgIEVHTFN1cmZhY2UgbUVnbFN1cmZhY2U7Ci0gICAgR0wxMSBtR0w7Ci0gICAgQ2FudmFzIG1HbENhbnZhczsKLSAgICBib29sZWFuIG1Vc2VHTDsKLSAgICBib29sZWFuIG1HbFdhbnRlZDsKKyAgICBIYXJkd2FyZVJlbmRlcmVyIG1Id1JlbmRlcmVyOwogCiAgICAgZmluYWwgVmlld0NvbmZpZ3VyYXRpb24gbVZpZXdDb25maWd1cmF0aW9uOwogCkBAIC0yNDEsOCArMjI4LDEwIEBACiAgICAgcHVibGljIFZpZXdSb290KENvbnRleHQgY29udGV4dCkgewogICAgICAgICBzdXBlcigpOwogCi0gICAgICAgIGlmIChNRUFTVVJFX0xBVEVOQ1kgJiYgbHQgPT0gbnVsbCkgewotICAgICAgICAgICAgbHQgPSBuZXcgTGF0ZW5jeVRpbWVyKDEwMCwgMTAwMCk7CisgICAgICAgIGlmIChNRUFTVVJFX0xBVEVOQ1kpIHsKKyAgICAgICAgICAgIGlmIChsdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbHQgPSBuZXcgTGF0ZW5jeVRpbWVyKDEwMCwgMTAwMCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBGb3IgZGVidWcgb25seQpAQCAtMjYyLDcgKzI1MSw3IEBACiAgICAgICAgIG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7CiAgICAgICAgIG1WaXNSZWN0ID0gbmV3IFJlY3QoKTsKICAgICAgICAgbVdpbkZyYW1lID0gbmV3IFJlY3QoKTsKLSAgICAgICAgbVdpbmRvdyA9IG5ldyBXKHRoaXMsIGNvbnRleHQpOworICAgICAgICBtV2luZG93ID0gbmV3IFcodGhpcyk7CiAgICAgICAgIG1JbnB1dE1ldGhvZENhbGxiYWNrID0gbmV3IElucHV0TWV0aG9kQ2FsbGJhY2sodGhpcyk7CiAgICAgICAgIG1WaWV3VmlzaWJpbGl0eSA9IFZpZXcuR09ORTsKICAgICAgICAgbVRyYW5zcGFyZW50UmVnaW9uID0gbmV3IFJlZ2lvbigpOwpAQCAtMzMwLDEyMiArMzE5LDE4IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUdMKCkgewotICAgICAgICBpbml0aWFsaXplR0xJbm5lcigpOwotICAgICAgICBpbnQgZXJyID0gbUVnbC5lZ2xHZXRFcnJvcigpOwotICAgICAgICBpZiAoZXJyICE9IEVHTDEwLkVHTF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAvLyBnaXZlLXVwIG9uIHVzaW5nIEdMCi0gICAgICAgICAgICBkZXN0cm95R0woKTsKLSAgICAgICAgICAgIG1HbFdhbnRlZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVHTElubmVyKCkgewotICAgICAgICBmaW5hbCBFR0wxMCBlZ2wgPSAoRUdMMTApIEVHTENvbnRleHQuZ2V0RUdMKCk7Ci0gICAgICAgIG1FZ2wgPSBlZ2w7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRvIHRoZSBkZWZhdWx0IGRpc3BsYXkuCi0gICAgICAgICAqLwotICAgICAgICBmaW5hbCBFR0xEaXNwbGF5IGVnbERpc3BsYXkgPSBlZ2wuZWdsR2V0RGlzcGxheShFR0wxMC5FR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICAgICAgbUVnbERpc3BsYXkgPSBlZ2xEaXNwbGF5OwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdlIGNhbiBub3cgaW5pdGlhbGl6ZSBFR0wgZm9yIHRoYXQgZGlzcGxheQotICAgICAgICAgKi8KLSAgICAgICAgaW50W10gdmVyc2lvbiA9IG5ldyBpbnRbMl07Ci0gICAgICAgIGVnbC5lZ2xJbml0aWFsaXplKGVnbERpc3BsYXksIHZlcnNpb24pOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNwZWNpZnkgYSBjb25maWd1cmF0aW9uIGZvciBvdXIgb3BlbmdsIHNlc3Npb24KLSAgICAgICAgICogYW5kIGdyYWIgdGhlIGZpcnN0IGNvbmZpZ3VyYXRpb24gdGhhdCBtYXRjaGVzIGlzCi0gICAgICAgICAqLwotICAgICAgICBmaW5hbCBpbnRbXSBjb25maWdTcGVjID0gewotICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwgICAgICA1LAotICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9HUkVFTl9TSVpFLCAgICA2LAotICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9CTFVFX1NJWkUsICAgICA1LAotICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9ERVBUSF9TSVpFLCAgICAwLAotICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OT05FCi0gICAgICAgIH07Ci0gICAgICAgIGZpbmFsIEVHTENvbmZpZ1tdIGNvbmZpZ3MgPSBuZXcgRUdMQ29uZmlnWzFdOwotICAgICAgICBmaW5hbCBpbnRbXSBudW1fY29uZmlnID0gbmV3IGludFsxXTsKLSAgICAgICAgZWdsLmVnbENob29zZUNvbmZpZyhlZ2xEaXNwbGF5LCBjb25maWdTcGVjLCBjb25maWdzLCAxLCBudW1fY29uZmlnKTsKLSAgICAgICAgZmluYWwgRUdMQ29uZmlnIGNvbmZpZyA9IGNvbmZpZ3NbMF07Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ3JlYXRlIGFuIE9wZW5HTCBFUyBjb250ZXh0LiBUaGlzIG11c3QgYmUgZG9uZSBvbmx5IG9uY2UsIGFuCi0gICAgICAgICAqIE9wZW5HTCBjb250ZXh0IGlzIGEgc29tZXdoYXQgaGVhdnkgb2JqZWN0LgotICAgICAgICAgKi8KLSAgICAgICAgZmluYWwgRUdMQ29udGV4dCBjb250ZXh0ID0gZWdsLmVnbENyZWF0ZUNvbnRleHQoZWdsRGlzcGxheSwgY29uZmlnLAotICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OT19DT05URVhULCBudWxsKTsKLSAgICAgICAgbUVnbENvbnRleHQgPSBjb250ZXh0OwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENyZWF0ZSBhbiBFR0wgc3VyZmFjZSB3ZSBjYW4gcmVuZGVyIGludG8uCi0gICAgICAgICAqLwotICAgICAgICBmaW5hbCBFR0xTdXJmYWNlIHN1cmZhY2UgPSBlZ2wuZWdsQ3JlYXRlV2luZG93U3VyZmFjZShlZ2xEaXNwbGF5LCBjb25maWcsIG1Ib2xkZXIsIG51bGwpOwotICAgICAgICBtRWdsU3VyZmFjZSA9IHN1cmZhY2U7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQmVmb3JlIHdlIGNhbiBpc3N1ZSBHTCBjb21tYW5kcywgd2UgbmVlZCB0byBtYWtlIHN1cmUKLSAgICAgICAgICogdGhlIGNvbnRleHQgaXMgY3VycmVudCBhbmQgYm91bmQgdG8gYSBzdXJmYWNlLgotICAgICAgICAgKi8KLSAgICAgICAgZWdsLmVnbE1ha2VDdXJyZW50KGVnbERpc3BsYXksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0byB0aGUgYXBwcm9wcmlhdGUgR0wgaW50ZXJmYWNlLgotICAgICAgICAgKiBUaGlzIGlzIHNpbXBseSBkb25lIGJ5IGNhc3RpbmcgdGhlIEdMIGNvbnRleHQgdG8gZWl0aGVyCi0gICAgICAgICAqIEdMMTAgb3IgR0wxMS4KLSAgICAgICAgICovCi0gICAgICAgIGZpbmFsIEdMMTEgZ2wgPSAoR0wxMSkgY29udGV4dC5nZXRHTCgpOwotICAgICAgICBtR0wgPSBnbDsKLSAgICAgICAgbUdsQ2FudmFzID0gbmV3IENhbnZhcyhnbCk7Ci0gICAgICAgIG1Vc2VHTCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRlc3Ryb3lHTCgpIHsKLSAgICAgICAgLy8gaW5mb3JtIHNraWEgdGhhdCB0aGUgY29udGV4dCBpcyBnb25lCi0gICAgICAgIG5hdGl2ZUFiYW5kb25HbENhY2hlcygpOwotCi0gICAgICAgIG1FZ2wuZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIEVHTDEwLkVHTF9OT19TVVJGQUNFLAotICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OT19TVVJGQUNFLCBFR0wxMC5FR0xfTk9fQ09OVEVYVCk7Ci0gICAgICAgIG1FZ2wuZWdsRGVzdHJveUNvbnRleHQobUVnbERpc3BsYXksIG1FZ2xDb250ZXh0KTsKLSAgICAgICAgbUVnbC5lZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOwotICAgICAgICBtRWdsLmVnbFRlcm1pbmF0ZShtRWdsRGlzcGxheSk7Ci0gICAgICAgIG1FZ2xDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgbUVnbFN1cmZhY2UgPSBudWxsOwotICAgICAgICBtRWdsRGlzcGxheSA9IG51bGw7Ci0gICAgICAgIG1FZ2wgPSBudWxsOwotICAgICAgICBtR2xDYW52YXMgPSBudWxsOwotICAgICAgICBtR0wgPSBudWxsOwotICAgICAgICBtVXNlR0wgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tFZ2xFcnJvcnMoKSB7Ci0gICAgICAgIGlmIChtVXNlR0wpIHsKLSAgICAgICAgICAgIGludCBlcnIgPSBtRWdsLmVnbEdldEVycm9yKCk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IEVHTDEwLkVHTF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGJhZCBoYXMgaGFwcGVuZWQgcmV2ZXJ0IHRvCi0gICAgICAgICAgICAgICAgLy8gbm9ybWFsIHJlbmRlcmluZy4KLSAgICAgICAgICAgICAgICBkZXN0cm95R0woKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEVHTDExLkVHTF9DT05URVhUX0xPU1QpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UnbGwgdHJ5IGFnYWluIGlmIGl0IHdhcyBjb250ZXh0IGxvc3QKLSAgICAgICAgICAgICAgICAgICAgbUdsV2FudGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogV2UgaGF2ZSBvbmUgY2hpbGQKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWaWV3KFZpZXcgdmlldywgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgYXR0cnMsCi0gICAgICAgICAgICBWaWV3IHBhbmVsUGFyZW50VmlldykgeworICAgIHB1YmxpYyB2b2lkIHNldFZpZXcoVmlldyB2aWV3LCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBhdHRycywgVmlldyBwYW5lbFBhcmVudFZpZXcpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAobVZpZXcgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1WaWV3ID0gdmlldzsKICAgICAgICAgICAgICAgICBtV2luZG93QXR0cmlidXRlcy5jb3B5RnJvbShhdHRycyk7CiAgICAgICAgICAgICAgICAgYXR0cnMgPSBtV2luZG93QXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBlbmFibGVIYXJkd2FyZUFjY2VsZXJhdGlvbihhdHRycyk7CisKICAgICAgICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIFJvb3RWaWV3U3VyZmFjZVRha2VyKSB7CiAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlSG9sZGVyQ2FsbGJhY2sgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUm9vdFZpZXdTdXJmYWNlVGFrZXIpdmlldykud2lsbFlvdVRha2VUaGVTdXJmYWNlKCk7CkBAIC01NzUsNiArNDYwLDIzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgZW5hYmxlSGFyZHdhcmVBY2NlbGVyYXRpb24oV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgYXR0cnMpIHsKKyAgICAgICAgLy8gT25seSBlbmFibGUgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlmIHdlIGFyZSBub3QgaW4gdGhlIHN5c3RlbSBwcm9jZXNzCisgICAgICAgIC8vIFRoZSB3aW5kb3cgbWFuYWdlciBjcmVhdGVzIFZpZXdSb290cyB0byBkaXNwbGF5IGFuaW1hdGVkIHByZXZpZXcgd2luZG93cworICAgICAgICAvLyBvZiBsYXVuY2hpbmcgYXBwcyBhbmQgd2UgZG9uJ3Qgd2FudCB0aG9zZSB0byBiZSBoYXJkd2FyZSBhY2NlbGVyYXRlZAorICAgICAgICBpZiAoUHJvY2Vzcy5teVVpZCgpICE9IFByb2Nlc3MuU1lTVEVNX1VJRCkgeworICAgICAgICAgICAgLy8gVHJ5IHRvIGVuYWJsZSBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaWYgcmVxdWVzdGVkCisgICAgICAgICAgICBpZiAoYXR0cnMgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAoYXR0cnMuZmxhZ3MgJiBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB0cmFuc2x1Y2VudCA9IGF0dHJzLmZvcm1hdCAhPSBQaXhlbEZvcm1hdC5PUEFRVUU7CisgICAgICAgICAgICAgICAgaWYgKG1Id1JlbmRlcmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUh3UmVuZGVyZXIuZGVzdHJveSh0cnVlKTsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1Id1JlbmRlcmVyID0gSGFyZHdhcmVSZW5kZXJlci5jcmVhdGVHbFJlbmRlcmVyKDIsIHRyYW5zbHVjZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoKSB7CiAgICAgICAgIHJldHVybiBtVmlldzsKICAgICB9CkBAIC03MzEsOCArNjMzLDYgQEAKICAgICAgICAgYm9vbGVhbiB2aWV3VmlzaWJpbGl0eUNoYW5nZWQgPSBtVmlld1Zpc2liaWxpdHkgIT0gdmlld1Zpc2liaWxpdHkKICAgICAgICAgICAgICAgICB8fCBtTmV3U3VyZmFjZU5lZWRlZDsKIAotICAgICAgICBmbG9hdCBhcHBTY2FsZSA9IG1BdHRhY2hJbmZvLm1BcHBsaWNhdGlvblNjYWxlOwotCiAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IG51bGw7CiAgICAgICAgIGlmIChtV2luZG93QXR0cmlidXRlc0NoYW5nZWQpIHsKICAgICAgICAgICAgIG1XaW5kb3dBdHRyaWJ1dGVzQ2hhbmdlZCA9IGZhbHNlOwpAQCAtNzgwLDkgKzY4MCw5IEBACiAgICAgICAgICAgICBhdHRhY2hJbmZvLm1XaW5kb3dWaXNpYmlsaXR5ID0gdmlld1Zpc2liaWxpdHk7CiAgICAgICAgICAgICBob3N0LmRpc3BhdGNoV2luZG93VmlzaWJpbGl0eUNoYW5nZWQodmlld1Zpc2liaWxpdHkpOwogICAgICAgICAgICAgaWYgKHZpZXdWaXNpYmlsaXR5ICE9IFZpZXcuVklTSUJMRSB8fCBtTmV3U3VyZmFjZU5lZWRlZCkgewotICAgICAgICAgICAgICAgIGlmIChtVXNlR0wpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdHJveUdMKCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtSHdSZW5kZXJlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1Id1JlbmRlcmVyLmRlc3Ryb3koZmFsc2UpOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodmlld1Zpc2liaWxpdHkgPT0gVmlldy5HT05FKSB7CiAgICAgICAgICAgICAgICAgLy8gQWZ0ZXIgbWFraW5nIGEgd2luZG93IGdvbmUsIHdlIHdpbGwgY291bnQgaXQgYXMgYmVpbmcKQEAgLTg5NywxMCArNzk3LDEyIEBACiAKICAgICAgICAgZmluYWwgYm9vbGVhbiBjb21wdXRlc0ludGVybmFsSW5zZXRzID0KICAgICAgICAgICAgICAgICBhdHRhY2hJbmZvLm1UcmVlT2JzZXJ2ZXIuaGFzQ29tcHV0ZUludGVybmFsSW5zZXRzTGlzdGVuZXJzKCk7CisKICAgICAgICAgYm9vbGVhbiBpbnNldHNQZW5kaW5nID0gZmFsc2U7CiAgICAgICAgIGludCByZWxheW91dFJlc3VsdCA9IDA7Ci0gICAgICAgIGlmIChtRmlyc3QgfHwgd2luZG93U2hvdWxkUmVzaXplIHx8IGluc2V0c0NoYW5nZWQKLSAgICAgICAgICAgICAgICB8fCB2aWV3VmlzaWJpbGl0eUNoYW5nZWQgfHwgcGFyYW1zICE9IG51bGwpIHsKKworICAgICAgICBpZiAobUZpcnN0IHx8IHdpbmRvd1Nob3VsZFJlc2l6ZSB8fCBpbnNldHNDaGFuZ2VkIHx8CisgICAgICAgICAgICAgICAgdmlld1Zpc2liaWxpdHlDaGFuZ2VkIHx8IHBhcmFtcyAhPSBudWxsKSB7CiAKICAgICAgICAgICAgIGlmICh2aWV3VmlzaWJpbGl0eSA9PSBWaWV3LlZJU0lCTEUpIHsKICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHdpbmRvdyBpcyBnaXZpbmcgaW50ZXJuYWwgaW5zZXRzIHRvIHRoZSB3aW5kb3cKQEAgLTkxMiwyNiArODE0LDE5IEBACiAgICAgICAgICAgICAgICAgLy8gd2luZG93LCB3YWl0aW5nIHVudGlsIHdlIGNhbiBmaW5pc2ggbGF5aW5nIG91dCB0aGlzIHdpbmRvdwogICAgICAgICAgICAgICAgIC8vIGFuZCBnZXQgYmFjayB0byB0aGUgd2luZG93IG1hbmFnZXIgd2l0aCB0aGUgdWx0aW1hdGVseQogICAgICAgICAgICAgICAgIC8vIGNvbXB1dGVkIGluc2V0cy4KLSAgICAgICAgICAgICAgICBpbnNldHNQZW5kaW5nID0gY29tcHV0ZXNJbnRlcm5hbEluc2V0cwotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1GaXJzdCB8fCB2aWV3VmlzaWJpbGl0eUNoYW5nZWQpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1XaW5kb3dBdHRyaWJ1dGVzLm1lbW9yeVR5cGUgPT0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuTUVNT1JZX1RZUEVfR1BVKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gbVdpbmRvd0F0dHJpYnV0ZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUdsV2FudGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5zZXRzUGVuZGluZyA9IGNvbXB1dGVzSW50ZXJuYWxJbnNldHMgJiYgKG1GaXJzdCB8fCB2aWV3VmlzaWJpbGl0eUNoYW5nZWQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVN1cmZhY2VIb2xkZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1TdXJmYWNlSG9sZGVyLm1TdXJmYWNlTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgbURyYXdpbmdBbGxvd2VkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgICAgICAgICBib29sZWFuIGh3SW50aWFsaXplZCA9IGZhbHNlOwogICAgICAgICAgICAgYm9vbGVhbiBjb250ZW50SW5zZXRzQ2hhbmdlZCA9IGZhbHNlOwogICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlSW5zZXRzQ2hhbmdlZDsKICAgICAgICAgICAgIGJvb2xlYW4gaGFkU3VyZmFjZSA9IG1TdXJmYWNlLmlzVmFsaWQoKTsKKwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBpbnQgZmwgPSAwOwogICAgICAgICAgICAgICAgIGlmIChwYXJhbXMgIT0gbnVsbCkgewpAQCAtOTkxLDkgKzg4Niw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsUmVkcmF3TmVlZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1RyYW5zcGFyZW50UmVnaW9uLnNldEVtcHR5KCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtR2xXYW50ZWQgJiYgIW1Vc2VHTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVHTCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkID0gbUdsQ2FudmFzICE9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUh3UmVuZGVyZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3SW50aWFsaXplZCA9IG1Id1JlbmRlcmVyLmluaXRpYWxpemUobUhvbGRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtU3VyZmFjZS5pc1ZhbGlkKCkpIHsKQEAgLTEwNzEsOSArOTY1LDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpbml0aWFsaXplZCkgewotICAgICAgICAgICAgICAgIG1HbENhbnZhcy5zZXRWaWV3cG9ydCgoaW50KSAobVdpZHRoICogYXBwU2NhbGUgKyAwLjVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChtSGVpZ2h0ICogYXBwU2NhbGUgKyAwLjVmKSk7CisgICAgICAgICAgICBpZiAoaHdJbnRpYWxpemVkKSB7CisgICAgICAgICAgICAgICAgbUh3UmVuZGVyZXIuc2V0dXAobVdpZHRoLCBtSGVpZ2h0KTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYm9vbGVhbiBmb2N1c0NoYW5nZWREdWVUb1RvdWNoTW9kZSA9IGVuc3VyZVRvdWNoTW9kZUxvY2FsbHkoCkBAIC0xMTMzLDcgKzEwMjYsNyBAQAogICAgICAgICAgICAgICAgIFRBRywgIkxheWluZyBvdXQgIiArIGhvc3QgKyAiIHRvICgiICsKICAgICAgICAgICAgICAgICBob3N0Lm1NZWFzdXJlZFdpZHRoICsgIiwgIiArIGhvc3QubU1lYXN1cmVkSGVpZ2h0ICsgIikiKTsKICAgICAgICAgICAgIGxvbmcgc3RhcnRUaW1lID0gMEw7Ci0gICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5wcm9maWxlTGF5b3V0KSB7CisgICAgICAgICAgICBpZiAoVmlld0RlYnVnLnByb2ZpbGVMYXlvdXQpIHsKICAgICAgICAgICAgICAgICBzdGFydFRpbWUgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGhvc3QubGF5b3V0KDAsIDAsIGhvc3QubU1lYXN1cmVkV2lkdGgsIGhvc3QubU1lYXN1cmVkSGVpZ2h0KTsKQEAgLTExNDYsNyArMTAzOSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5wcm9maWxlTGF5b3V0KSB7CisgICAgICAgICAgICBpZiAoVmlld0RlYnVnLnByb2ZpbGVMYXlvdXQpIHsKICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KDYwMDAxLCBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSAtIHN0YXJ0VGltZSk7CiAgICAgICAgICAgICB9CiAKQEAgLTEzNDYsNyArMTIzOSw4IEBACiAgICAgICAgIGlmICghc0ZpcnN0RHJhd0NvbXBsZXRlKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNGaXJzdERyYXdIYW5kbGVycykgewogICAgICAgICAgICAgICAgIHNGaXJzdERyYXdDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNGaXJzdERyYXdIYW5kbGVycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHNGaXJzdERyYXdIYW5kbGVycy5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgcG9zdChzRmlyc3REcmF3SGFuZGxlcnMuZ2V0KGkpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xMzgwLDUzICsxMjc0LDE2IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGlmIChtVXNlR0wpIHsKKyAgICAgICAgaWYgKG1Id1JlbmRlcmVyICE9IG51bGwgJiYgbUh3UmVuZGVyZXIuaXNFbmFibGVkKCkpIHsKICAgICAgICAgICAgIGlmICghZGlydHkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG1HbENhbnZhczsKLSAgICAgICAgICAgICAgICBpZiAobUdMICE9IG51bGwgJiYgY2FudmFzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUdMLmdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgICAgICAgICAgICAgICAgICBtR0wuZ2xDbGVhckNvbG9yKDAsIDAsIDAsIDApOwotICAgICAgICAgICAgICAgICAgICBtR0wuZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgICAgICAgICAgICAgbUdMLmdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubURyYXdpbmdUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1JZ25vcmVEaXJ0eVN0YXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZXcubVByaXZhdGVGbGFncyB8PSBWaWV3LkRSQVdOOwotCi0gICAgICAgICAgICAgICAgICAgIGludCBzYXZlQ291bnQgPSBjYW52YXMuc2F2ZShDYW52YXMuTUFUUklYX1NBVkVfRkxBRyk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAsIC15b2ZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVHJhbnNsYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zbGF0b3IudHJhbnNsYXRlQ2FudmFzKGNhbnZhcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuc2V0U2NyZWVuRGVuc2l0eShzY2FsaW5nUmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFVklDRSA6IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXcuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRyAmJiBWaWV3RGVidWcuY29uc2lzdGVuY3lDaGVja0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlldy5kaXNwYXRjaENvbnNpc3RlbmN5Q2hlY2soVmlld0RlYnVnLkNPTlNJU1RFTkNZX0RSQVdJTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHNhdmVDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tSWdub3JlRGlydHlTdGF0ZSA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZ2wuZWdsU3dhcEJ1ZmZlcnMobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcnMoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoU0hPV19GUFMgfHwgQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5zaG93RnBzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm93ID0gKGludClTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzRHJhd1RpbWUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNob3dGUFMoY2FudmFzLCBub3cgLSBzRHJhd1RpbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc0RyYXdUaW1lID0gbm93OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Id1JlbmRlcmVyLmRyYXcobVZpZXcsIG1BdHRhY2hJbmZvLCB5b2ZmKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHNjcm9sbGluZykgewogICAgICAgICAgICAgICAgIG1GdWxsUmVkcmF3TmVlZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBzY2hlZHVsZVRyYXZlcnNhbHMoKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTE0ODIsNyArMTMzOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvL2NhbnZhcy5kcmF3QVJHQigyNTUsIDI1NSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5wcm9maWxlRHJhd2luZykgeworICAgICAgICAgICAgICAgICAgICBpZiAoVmlld0RlYnVnLnByb2ZpbGVEcmF3aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0xNTA5LDcgKzEzNjYsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBtZXRyaWNzPSIgKyBjeHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGNvbXBhdGliaWxpdHlJbmZvPSIgKyBjeHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29tcGF0aWJpbGl0eUluZm8oKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW50IHNhdmVDb3VudCA9IGNhbnZhcy5zYXZlKENhbnZhcy5NQVRSSVhfU0FWRV9GTEFHKTsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMCwgLXlvZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1UcmFuc2xhdG9yICE9IG51bGwpIHsKQEAgLTE1MjAsMTQgKzEzNzYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3LmRyYXcoY2FudmFzKTsKICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1JZ25vcmVEaXJ0eVN0YXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoc2F2ZUNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcgJiYgVmlld0RlYnVnLmNvbnNpc3RlbmN5Q2hlY2tFbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmlldy5kaXNwYXRjaENvbnNpc3RlbmN5Q2hlY2soVmlld0RlYnVnLkNPTlNJU1RFTkNZX0RSQVdJTkcpOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKFNIT1dfRlBTIHx8IENvbmZpZy5ERUJVRyAmJiBWaWV3RGVidWcuc2hvd0ZwcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoU0hPV19GUFMgfHwgVmlld0RlYnVnLnNob3dGcHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3cgPSAoaW50KVN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNEcmF3VGltZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlU2hvd0ZQUyhjYW52YXMsIG5vdyAtIHNEcmF3VGltZSk7CkBAIC0xNTM1LDcgKzEzOTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc0RyYXdUaW1lID0gbm93OwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRyAmJiBWaWV3RGVidWcucHJvZmlsZURyYXdpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZpZXdEZWJ1Zy5wcm9maWxlRHJhd2luZykgewogICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudCg2MDAwMCwgU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgLSBzdGFydFRpbWUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMTczOCw4ICsxNTkzLDYgQEAKICAgICB9CiAKICAgICB2b2lkIGRpc3BhdGNoRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIExvZy52KFRBRywgIkRldGFjaGluZyBpbiAiICsgdGhpcyArICIgb2YgIiArIG1TdXJmYWNlKTsKLQogICAgICAgICBpZiAobVZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgbVZpZXcuZGlzcGF0Y2hEZXRhY2hlZEZyb21XaW5kb3coKTsKICAgICAgICAgfQpAQCAtMTc0OCw5ICsxNjAxLDExIEBACiAgICAgICAgIG1BdHRhY2hJbmZvLm1Sb290VmlldyA9IG51bGw7CiAgICAgICAgIG1BdHRhY2hJbmZvLm1TdXJmYWNlID0gbnVsbDsKIAotICAgICAgICBpZiAobVVzZUdMKSB7Ci0gICAgICAgICAgICBkZXN0cm95R0woKTsKKyAgICAgICAgaWYgKG1Id1JlbmRlcmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Id1JlbmRlcmVyLmRlc3Ryb3kodHJ1ZSk7CisgICAgICAgICAgICBtSHdSZW5kZXJlciA9IG51bGw7CiAgICAgICAgIH0KKwogICAgICAgICBtU3VyZmFjZS5yZWxlYXNlKCk7CiAKICAgICAgICAgaWYgKG1JbnB1dENoYW5uZWwgIT0gbnVsbCkgewpAQCAtMTkzMywxOCArMTc4OCw4IEBACiAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5Ub3VjaE1vZGUgPSBtc2cuYXJnMiAhPSAwOwogICAgICAgICAgICAgICAgICAgICBlbnN1cmVUb3VjaE1vZGVMb2NhbGx5KGluVG91Y2hNb2RlKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAobUdsV2FudGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0VnbEVycm9ycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbG9zdCB0aGUgZ2wgY29udGV4dCwgc28gcmVjcmVhdGUgaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUdsV2FudGVkICYmICFtVXNlR0wpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplR0woKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUdsQ2FudmFzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYXBwU2NhbGUgPSBtQXR0YWNoSW5mby5tQXBwbGljYXRpb25TY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUdsQ2FudmFzLnNldFZpZXdwb3J0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChtV2lkdGggKiBhcHBTY2FsZSArIDAuNWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChtSGVpZ2h0ICogYXBwU2NhbGUgKyAwLjVmKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobUh3UmVuZGVyZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUh3UmVuZGVyZXIuaW5pdGlhbGl6ZUlmTmVlZGVkKG1XaWR0aCwgbUhlaWdodCwgbUF0dGFjaEluZm8sIG1Ib2xkZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC0xOTk0LDggKzE4MzksNyBAQAogICAgICAgICAgICAgaWYgKChldmVudC5nZXRGbGFncygpJktleUV2ZW50LkZMQUdfRlJPTV9TWVNURU0pICE9IDApIHsKICAgICAgICAgICAgICAgICAvLyBUaGUgSU1FIGlzIHRyeWluZyB0byBzYXkgdGhpcyBldmVudCBpcyBmcm9tIHRoZQogICAgICAgICAgICAgICAgIC8vIHN5c3RlbSEgIEJhZCBiYWQgYmFkIQotICAgICAgICAgICAgICAgIGV2ZW50ID0gS2V5RXZlbnQuY2hhbmdlRmxhZ3MoZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRGbGFncygpJn5LZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNKTsKKyAgICAgICAgICAgICAgICBldmVudCA9IEtleUV2ZW50LmNoYW5nZUZsYWdzKGV2ZW50LCBldmVudC5nZXRGbGFncygpICYgfktleUV2ZW50LkZMQUdfRlJPTV9TWVNURU0pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZGVsaXZlcktleUV2ZW50VG9WaWV3SGllcmFyY2h5KChLZXlFdmVudCltc2cub2JqLCBmYWxzZSk7CiAgICAgICAgIH0gYnJlYWs7CkBAIC0yNDgzLDggKzIzMjcsNyBAQAogICAgIHByaXZhdGUgdm9pZCBkZWxpdmVyS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQsIGJvb2xlYW4gc2VuZERvbmUpIHsKICAgICAgICAgLy8gSWYgbVZpZXcgaXMgbnVsbCwgd2UganVzdCBjb25zdW1lIHRoZSBrZXkgZXZlbnQgYmVjYXVzZSBpdCBkb2Vzbid0CiAgICAgICAgIC8vIG1ha2Ugc2Vuc2UgdG8gZG8gYW55dGhpbmcgZWxzZSB3aXRoIGl0LgotICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBtVmlldyAhPSBudWxsCi0gICAgICAgICAgICAgICAgPyBtVmlldy5kaXNwYXRjaEtleUV2ZW50UHJlSW1lKGV2ZW50KSA6IHRydWU7CisgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IG1WaWV3ID09IG51bGwgfHwgbVZpZXcuZGlzcGF0Y2hLZXlFdmVudFByZUltZShldmVudCk7CiAgICAgICAgIGlmIChoYW5kbGVkKSB7CiAgICAgICAgICAgICBpZiAoc2VuZERvbmUpIHsKICAgICAgICAgICAgICAgICBmaW5pc2hLZXlFdmVudChldmVudCk7CkBAIC0yNTE2LDcgKzIzNTksNiBAQAogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzZW5kRG9uZSA9IHNlcSA+PSAwOwogICAgICAgICAgICAgaWYgKCFoYW5kbGVkKSB7CiAgICAgICAgICAgICAgICAgZGVsaXZlcktleUV2ZW50VG9WaWV3SGllcmFyY2h5KGV2ZW50LCBzZW5kRG9uZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzZW5kRG9uZSkgewogICAgICAgICAgICAgICAgIGZpbmlzaEtleUV2ZW50KGV2ZW50KTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0yNzEzLDcgKzI1NTUsNyBAQAogCiAgICAgdm9pZCBkb0RpZSgpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKLSAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBMb2cudihUQUcsICJESUUgaW4gIiArIHRoaXMgKyAiIG9mICIgKyBtU3VyZmFjZSk7CisgICAgICAgIGlmIChMT0NBTF9MT0dWKSBMb2cudihUQUcsICJESUUgaW4gIiArIHRoaXMgKyAiIG9mICIgKyBtU3VyZmFjZSk7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1BZGRlZCAmJiAhbUZpcnN0KSB7CiAgICAgICAgICAgICAgICAgaW50IHZpZXdWaXNpYmlsaXR5ID0gbVZpZXcuZ2V0VmlzaWJpbGl0eSgpOwpAQCAtMjc5OSwxMyArMjY0MSwxMiBAQAogICAgICAgICAvL25vaW5zcGVjdGlvbiBDb25zdGFudENvbmRpdGlvbnMKICAgICAgICAgaWYgKGZhbHNlICYmIGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9ET1dOKSB7CiAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0S2V5Q29kZSgpID09IEtleUV2ZW50LktFWUNPREVfQ0FNRVJBKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dEKSBMb2cuZCgia2V5ZGlzcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dEKSBMb2cuZCgia2V5ZGlzcCIsICJGb2N1c2VkIHZpZXcgSGllcmFyY2h5IGlzOiIpOworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKCJrZXlkaXNwIiwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKCJrZXlkaXNwIiwgIkZvY3VzZWQgdmlldyBIaWVyYXJjaHkgaXM6Iik7CisKICAgICAgICAgICAgICAgICBkZWJ1ZygpOwogCi0gICAgICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dEKSBMb2cuZCgia2V5ZGlzcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoImtleWRpc3AiLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjg4OCwxNiArMjcyOSwxNiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQoVmlldyBvcmlnaW5hbFZpZXcsIEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgY3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUgbWVudSkgewogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNoaWxkRHJhd2FibGVTdGF0ZUNoYW5nZWQoVmlldyBjaGlsZCkgewogICAgIH0KIAotICAgIHByb3RlY3RlZCBSZWN0IGdldFdpbmRvd0ZyYW1lKCkgewotICAgICAgICByZXR1cm4gbVdpbkZyYW1lOwotICAgIH0KLQogICAgIHZvaWQgY2hlY2tUaHJlYWQoKSB7CiAgICAgICAgIGlmIChtVGhyZWFkICE9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBDYWxsZWRGcm9tV3JvbmdUaHJlYWRFeGNlcHRpb24oCkBAIC0yOTc2LDE2ICsyODE3LDE1IEBACiAgICAgc3RhdGljIGNsYXNzIFcgZXh0ZW5kcyBJV2luZG93LlN0dWIgewogICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8Vmlld1Jvb3Q+IG1WaWV3Um9vdDsKIAotICAgICAgICBwdWJsaWMgVyhWaWV3Um9vdCB2aWV3Um9vdCwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIFcoVmlld1Jvb3Qgdmlld1Jvb3QpIHsKICAgICAgICAgICAgIG1WaWV3Um9vdCA9IG5ldyBXZWFrUmVmZXJlbmNlPFZpZXdSb290Pih2aWV3Um9vdCk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCByZXNpemVkKGludCB3LCBpbnQgaCwgUmVjdCBjb3ZlcmVkSW5zZXRzLAotICAgICAgICAgICAgICAgIFJlY3QgdmlzaWJsZUluc2V0cywgYm9vbGVhbiByZXBvcnREcmF3LCBDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBwdWJsaWMgdm9pZCByZXNpemVkKGludCB3LCBpbnQgaCwgUmVjdCBjb3ZlcmVkSW5zZXRzLCBSZWN0IHZpc2libGVJbnNldHMsCisgICAgICAgICAgICAgICAgYm9vbGVhbiByZXBvcnREcmF3LCBDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewogICAgICAgICAgICAgZmluYWwgVmlld1Jvb3Qgdmlld1Jvb3QgPSBtVmlld1Jvb3QuZ2V0KCk7CiAgICAgICAgICAgICBpZiAodmlld1Jvb3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZpZXdSb290LmRpc3BhdGNoUmVzaXplZCh3LCBoLCBjb3ZlcmVkSW5zZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZUluc2V0cywgcmVwb3J0RHJhdywgbmV3Q29uZmlnKTsKKyAgICAgICAgICAgICAgICB2aWV3Um9vdC5kaXNwYXRjaFJlc2l6ZWQodywgaCwgY292ZXJlZEluc2V0cywgdmlzaWJsZUluc2V0cywgcmVwb3J0RHJhdywgbmV3Q29uZmlnKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zMzg4LDggKzMyMjgsNCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVNob3dGUFMoQ2FudmFzIGNhbnZhcywgaW50IGR1cmF0aW9uTWlsbGlzKTsKLQotICAgIC8vIGluZm9ybSBza2lhIHRvIGp1c3QgYWJhbmRvbiBpdHMgdGV4dHVyZSBjYWNoZSBJRHMKLSAgICAvLyBkb2Vzbid0IGNhbGwgZ2xEZWxldGVUZXh0dXJlcwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUFiYW5kb25HbENhY2hlcygpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93LmphdmEKaW5kZXggMTFjMDljMS4uNjYzMzM2NyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvdy5qYXZhCkBAIC01NiwxMSArNTYsMzIgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX0NPTlRFWFRfTUVOVSA9IDY7CiAgICAgLyoqIEZsYWcgZm9yIGN1c3RvbSB0aXRsZS4gWW91IGNhbm5vdCBjb21iaW5lIHRoaXMgZmVhdHVyZSB3aXRoIG90aGVyIHRpdGxlIGZlYXR1cmVzLiAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfQ1VTVE9NX1RJVExFID0gNzsKLSAgICAvKiogRmxhZyBmb3IgYXNraW5nIGZvciBhbiBPcGVuR0wgZW5hYmxlZCB3aW5kb3cuCi0gICAgICAgIEFsbCAyRCBncmFwaGljcyB3aWxsIGJlIGhhbmRsZWQgYnkgT3BlbkdMIEVTLgotICAgICAgICBAaGlkZQotICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9PUEVOR0wgPSA4OworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIGVuYWJsaW5nIHRoZSBBY3Rpb24gQmFyLgorICAgICAqIFRoaXMgaXMgZW5hYmxlZCBieSBkZWZhdWx0IGZvciBzb21lIGRldmljZXMuIFRoZSBBY3Rpb24gQmFyCisgICAgICogcmVwbGFjZXMgdGhlIHRpdGxlIGJhciBhbmQgcHJvdmlkZXMgYW4gYWx0ZXJuYXRlIGxvY2F0aW9uCisgICAgICogZm9yIGFuIG9uLXNjcmVlbiBtZW51IGJ1dHRvbiBvbiBzb21lIGRldmljZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9BQ1RJT05fQkFSID0gODsKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciByZXF1ZXN0aW5nIGFuIEFjdGlvbiBCYXIgdGhhdCBvdmVybGF5cyB3aW5kb3cgY29udGVudC4KKyAgICAgKiBOb3JtYWxseSBhbiBBY3Rpb24gQmFyIHdpbGwgc2l0IGluIHRoZSBzcGFjZSBhYm92ZSB3aW5kb3cgY29udGVudCwgYnV0IGlmIHRoaXMKKyAgICAgKiBmZWF0dXJlIGlzIHJlcXVlc3RlZCBhbG9uZyB3aXRoIHtAbGluayAjRkVBVFVSRV9BQ1RJT05fQkFSfSBpdCB3aWxsIGJlIGxheWVyZWQgb3ZlcgorICAgICAqIHRoZSB3aW5kb3cgY29udGVudCBpdHNlbGYuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3b3VsZCBsaWtlIHlvdXIgYXBwIHRvIGhhdmUgbW9yZSBjb250cm9sCisgICAgICogb3ZlciBob3cgdGhlIEFjdGlvbiBCYXIgaXMgZGlzcGxheWVkLCBzdWNoIGFzIGxldHRpbmcgYXBwbGljYXRpb24gY29udGVudCBzY3JvbGwgYmVuZWF0aAorICAgICAqIGFuIEFjdGlvbiBCYXIgd2l0aCBhIHRyYW5zcGFyZW50IGJhY2tncm91bmQgb3Igb3RoZXJ3aXNlIGRpc3BsYXlpbmcgYSB0cmFuc3BhcmVudC90cmFuc2x1Y2VudAorICAgICAqIEFjdGlvbiBCYXIgb3ZlciBhcHBsaWNhdGlvbiBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfQUNUSU9OX0JBUl9PVkVSTEFZID0gOTsKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciBzcGVjaWZ5aW5nIHRoZSBiZWhhdmlvciBvZiBhY3Rpb24gbW9kZXMgd2hlbiBhbiBBY3Rpb24gQmFyIGlzIG5vdCBwcmVzZW50LgorICAgICAqIElmIG92ZXJsYXkgaXMgZW5hYmxlZCwgdGhlIGFjdGlvbiBtb2RlIFVJIHdpbGwgYmUgYWxsb3dlZCB0byBjb3ZlciBleGlzdGluZyB3aW5kb3cgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX0FDVElPTl9NT0RFX09WRVJMQVkgPSAxMDsKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciByZXF1ZXN0aW5nIHRoaXMgd2luZG93IHRvIGJlIGhhcmR3YXJlIGFjY2VsZXJhdGVkLCBpZiBwb3NzaWJsZS4gCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9IQVJEV0FSRV9BQ0NFTEVSQVRFRCA9IDExOwogICAgIC8qKiBGbGFnIGZvciBzZXR0aW5nIHRoZSBwcm9ncmVzcyBiYXIncyB2aXNpYmlsaXR5IHRvIFZJU0lCTEUgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9HUkVTU19WSVNJQklMSVRZX09OID0gLTE7CiAgICAgLyoqIEZsYWcgZm9yIHNldHRpbmcgdGhlIHByb2dyZXNzIGJhcidzIHZpc2liaWxpdHkgdG8gR09ORSAqLwpAQCAtMTA5LDYgKzEzMCw4IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gbUhhc1NvZnRJbnB1dE1vZGUgPSBmYWxzZTsKICAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gbURlc3Ryb3llZDsKKwogICAgIC8vIFRoZSBjdXJyZW50IHdpbmRvdyBhdHRyaWJ1dGVzLgogICAgIHByaXZhdGUgZmluYWwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbVdpbmRvd0F0dHJpYnV0ZXMgPQogICAgICAgICBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoKTsKQEAgLTI5Miw2ICszMTUsMTQgQEAKICAgICAgICAgICogQHNlZSBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblNlYXJjaFJlcXVlc3RlZCgpIAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGJvb2xlYW4gb25TZWFyY2hSZXF1ZXN0ZWQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYW4gYWN0aW9uIG1vZGUgaXMgYmVpbmcgc3RhcnRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIENhbGxiYWNrIHRvIGNvbnRyb2wgdGhlIGxpZmVjeWNsZSBvZiB0aGlzIGFjdGlvbiBtb2RlCisgICAgICAgICAqIEByZXR1cm4gVGhlIEFjdGlvbk1vZGUgdGhhdCB3YXMgc3RhcnRlZCwgb3IgbnVsbCBpZiBpdCB3YXMgY2FuY2VsZWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBY3Rpb25Nb2RlIG9uU3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spOwogICAgIH0KIAogICAgIHB1YmxpYyBXaW5kb3coQ29udGV4dCBjb250ZXh0KSB7CkBAIC0zNTMsNiArMzg0LDE2IEBACiAgICAgICAgIHJldHVybiBtSGFzQ2hpbGRyZW47CiAgICAgfQogICAgIAorICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgIG1EZXN0cm95ZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGVzdHJveWVkKCkgeworICAgICAgICByZXR1cm4gbURlc3Ryb3llZDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBTZXQgdGhlIHdpbmRvdyBtYW5hZ2VyIGZvciB1c2UgYnkgdGhpcyBXaW5kb3cgdG8sIGZvciBleGFtcGxlLAogICAgICAqIGRpc3BsYXkgcGFuZWxzLiAgVGhpcyBpcyA8ZW0+bm90PC9lbT4gdXNlZCBmb3IgZGlzcGxheWluZyB0aGUKQEAgLTM2MCwyMSArNDAxLDM1IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gd20gVGhlIFZpZXdNYW5hZ2VyIGZvciBhZGRpbmcgbmV3IHdpbmRvd3MuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V2luZG93TWFuYWdlcihXaW5kb3dNYW5hZ2VyIHdtLAotICAgICAgICAgICAgSUJpbmRlciBhcHBUb2tlbiwgU3RyaW5nIGFwcE5hbWUpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRXaW5kb3dNYW5hZ2VyKFdpbmRvd01hbmFnZXIgd20sIElCaW5kZXIgYXBwVG9rZW4sIFN0cmluZyBhcHBOYW1lKSB7CisgICAgICAgIHNldFdpbmRvd01hbmFnZXIod20sIGFwcFRva2VuLCBhcHBOYW1lLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB3aW5kb3cgbWFuYWdlciBmb3IgdXNlIGJ5IHRoaXMgV2luZG93IHRvLCBmb3IgZXhhbXBsZSwKKyAgICAgKiBkaXNwbGF5IHBhbmVscy4gIFRoaXMgaXMgPGVtPm5vdDwvZW0+IHVzZWQgZm9yIGRpc3BsYXlpbmcgdGhlCisgICAgICogV2luZG93IGl0c2VsZiAtLSB0aGF0IG11c3QgYmUgZG9uZSBieSB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHdtIFRoZSBWaWV3TWFuYWdlciBmb3IgYWRkaW5nIG5ldyB3aW5kb3dzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdpbmRvd01hbmFnZXIoV2luZG93TWFuYWdlciB3bSwgSUJpbmRlciBhcHBUb2tlbiwgU3RyaW5nIGFwcE5hbWUsCisgICAgICAgICAgICBib29sZWFuIGhhcmR3YXJlQWNjZWxlcmF0ZWQpIHsKICAgICAgICAgbUFwcFRva2VuID0gYXBwVG9rZW47CiAgICAgICAgIG1BcHBOYW1lID0gYXBwTmFtZTsKICAgICAgICAgaWYgKHdtID09IG51bGwpIHsKICAgICAgICAgICAgIHdtID0gV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpOwogICAgICAgICB9Ci0gICAgICAgIG1XaW5kb3dNYW5hZ2VyID0gbmV3IExvY2FsV2luZG93TWFuYWdlcih3bSk7CisgICAgICAgIG1XaW5kb3dNYW5hZ2VyID0gbmV3IExvY2FsV2luZG93TWFuYWdlcih3bSwgaGFyZHdhcmVBY2NlbGVyYXRlZCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBjbGFzcyBMb2NhbFdpbmRvd01hbmFnZXIgaW1wbGVtZW50cyBXaW5kb3dNYW5hZ2VyIHsKLSAgICAgICAgTG9jYWxXaW5kb3dNYW5hZ2VyKFdpbmRvd01hbmFnZXIgd20pIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1IYXJkd2FyZUFjY2VsZXJhdGVkOworCisgICAgICAgIExvY2FsV2luZG93TWFuYWdlcihXaW5kb3dNYW5hZ2VyIHdtLCBib29sZWFuIGhhcmR3YXJlQWNjZWxlcmF0ZWQpIHsKICAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VyID0gd207CiAgICAgICAgICAgICBtRGVmYXVsdERpc3BsYXkgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREZWZhdWx0RGlzcGxheSgKICAgICAgICAgICAgICAgICAgICAgbVdpbmRvd01hbmFnZXIuZ2V0RGVmYXVsdERpc3BsYXkoKSk7CisgICAgICAgICAgICBtSGFyZHdhcmVBY2NlbGVyYXRlZCA9IGhhcmR3YXJlQWNjZWxlcmF0ZWQ7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBhZGRWaWV3KFZpZXcgdmlldywgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMpIHsKQEAgLTQyMSw2ICs0NzYsOSBAQAogICAgICAgICAgICAgaWYgKHdwLnBhY2thZ2VOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICB3cC5wYWNrYWdlTmFtZSA9IG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUhhcmR3YXJlQWNjZWxlcmF0ZWQpIHsKKyAgICAgICAgICAgICAgICB3cC5mbGFncyB8PSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbVdpbmRvd01hbmFnZXIuYWRkVmlldyh2aWV3LCBwYXJhbXMpOwogICAgICAgICB9CiAKQEAgLTcxMyw2ICs3NzEsMTUgQEAKICAgICAgICAgcmV0dXJuIChtRmVhdHVyZXMmZmxhZykgIT0gMDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAaGlkZSBVc2VkIGludGVybmFsbHkgdG8gaGVscCByZXNvbHZlIGNvbmZsaWN0aW5nIGZlYXR1cmVzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUZlYXR1cmUoaW50IGZlYXR1cmVJZCkgeworICAgICAgICBmaW5hbCBpbnQgZmxhZyA9IDE8PGZlYXR1cmVJZDsKKyAgICAgICAgbUZlYXR1cmVzICY9IH5mbGFnOworICAgICAgICBtTG9jYWxGZWF0dXJlcyAmPSB+KG1Db250YWluZXIgIT0gbnVsbCA/IChmbGFnJn5tQ29udGFpbmVyLm1GZWF0dXJlcykgOiBmbGFnKTsKKyAgICB9CisKICAgICBwdWJsaWMgZmluYWwgdm9pZCBtYWtlQWN0aXZlKCkgewogICAgICAgICBpZiAobUNvbnRhaW5lciAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAobUNvbnRhaW5lci5tQWN0aXZlQ2hpbGQgIT0gbnVsbCkgewpAQCAtODE3LDYgKzg4NCw4IEBACiAKICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0b2dnbGVQYW5lbChpbnQgZmVhdHVyZUlkLCBLZXlFdmVudCBldmVudCk7CiAKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbnZhbGlkYXRlUGFuZWxNZW51KGludCBmZWF0dXJlSWQpOworICAgIAogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHBlcmZvcm1QYW5lbFNob3J0Y3V0KGludCBmZWF0dXJlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleUNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQgZXZlbnQsCkBAIC05OTYsNiArMTA2NSwxNiBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIG1GZWF0dXJlczsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUXVlcnkgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgYSBjZXJ0YWluIGZlYXR1cmUuCisgICAgICogCisgICAgICogQHBhcmFtIGZlYXR1cmUgVGhlIGZlYXR1cmUgSUQgdG8gY2hlY2sKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZlYXR1cmUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0ZlYXR1cmUoaW50IGZlYXR1cmUpIHsKKyAgICAgICAgcmV0dXJuIChnZXRGZWF0dXJlcygpICYgKDEgPDwgZmVhdHVyZSkpICE9IDA7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBmZWF0dXJlIGJpdHMgdGhhdCBhcmUgYmVpbmcgaW1wbGVtZW50ZWQgYnkgdGhpcyBXaW5kb3cuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlci5qYXZhCmluZGV4IGVlYmJjOTMuLmMxNDdiNzQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlci5qYXZhCkBAIC03Miw2ICs3Miw3IEBACiAgICAgICAgICAqIFdoZW4gdXNpbmcge0BsaW5rIEdyYXZpdHkjTEVGVH0gb3Ige0BsaW5rIEdyYXZpdHkjUklHSFR9IGl0IHByb3ZpZGVzCiAgICAgICAgICAqIGFuIG9mZnNldCBmcm9tIHRoZSBnaXZlbiBlZGdlLgogICAgICAgICAgKi8KKyAgICAgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CiAgICAgICAgIHB1YmxpYyBpbnQgeDsKICAgICAgICAgCiAgICAgICAgIC8qKgpAQCAtNzksNiArODAsNyBAQAogICAgICAgICAgKiBXaGVuIHVzaW5nIHtAbGluayBHcmF2aXR5I1RPUH0gb3Ige0BsaW5rIEdyYXZpdHkjQk9UVE9NfSBpdCBwcm92aWRlcwogICAgICAgICAgKiBhbiBvZmZzZXQgZnJvbSB0aGUgZ2l2ZW4gZWRnZS4KICAgICAgICAgICovCisgICAgICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQogICAgICAgICBwdWJsaWMgaW50IHk7CiAKICAgICAgICAgLyoqCkBAIC04Nyw2ICs4OSw3IEBACiAgICAgICAgICAqIHNob3VsZCBub3QgYmUgc3RyZXRjaGVkLiBPdGhlcndpc2UgdGhlIGV4dHJhIHBpeGVscyB3aWxsIGJlIHByby1yYXRlZAogICAgICAgICAgKiBhbW9uZyBhbGwgdmlld3Mgd2hvc2Ugd2VpZ2h0IGlzIGdyZWF0ZXIgdGhhbiAwLgogICAgICAgICAgKi8KKyAgICAgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CiAgICAgICAgIHB1YmxpYyBmbG9hdCBob3Jpem9udGFsV2VpZ2h0OwogCiAgICAgICAgIC8qKgpAQCAtOTUsOCArOTgsOSBAQAogICAgICAgICAgKiBzaG91bGQgbm90IGJlIHN0cmV0Y2hlZC4gT3RoZXJ3aXNlIHRoZSBleHRyYSBwaXhlbHMgd2lsbCBiZSBwcm8tcmF0ZWQKICAgICAgICAgICogYW1vbmcgYWxsIHZpZXdzIHdob3NlIHdlaWdodCBpcyBncmVhdGVyIHRoYW4gMC4KICAgICAgICAgICovCisgICAgICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQogICAgICAgICBwdWJsaWMgZmxvYXQgdmVydGljYWxXZWlnaHQ7Ci0gICAgICAgIAorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgZ2VuZXJhbCB0eXBlIG9mIHdpbmRvdy4gIFRoZXJlIGFyZSB0aHJlZSBtYWluIGNsYXNzZXMgb2YKICAgICAgICAgICogd2luZG93IHR5cGVzOgpAQCAtMzg5LDYgKzM5Myw3IEBACiAgICAgICAgICAqIEBzZWUgI0ZMQUdfRlVMTFNDUkVFTgogICAgICAgICAgKiBAc2VlICNGTEFHX0ZPUkNFX05PVF9GVUxMU0NSRUVOCiAgICAgICAgICAqIEBzZWUgI0ZMQUdfSUdOT1JFX0NIRUVLX1BSRVNTRVMKKyAgICAgICAgICogQHNlZSAjRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRAogICAgICAgICAgKi8KICAgICAgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5KGZsYWdNYXBwaW5nID0gewogICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEZMQUdfQkxVUl9CRUhJTkQsIGVxdWFscyA9IEZMQUdfQkxVUl9CRUhJTkQsCkBAIC00MjAsNyArNDI1LDkgQEAKICAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBGTEFHX0ZPUkNFX05PVF9GVUxMU0NSRUVOLAogICAgICAgICAgICAgICAgICAgICBlcXVhbHMgPSBGTEFHX0ZPUkNFX05PVF9GVUxMU0NSRUVOLCBuYW1lID0gIkZMQUdfRk9SQ0VfTk9UX0ZVTExTQ1JFRU4iKSwKICAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBGTEFHX0lHTk9SRV9DSEVFS19QUkVTU0VTLAotICAgICAgICAgICAgICAgICAgICBlcXVhbHMgPSBGTEFHX0lHTk9SRV9DSEVFS19QUkVTU0VTLCBuYW1lID0gIkZMQUdfSUdOT1JFX0NIRUVLX1BSRVNTRVMiKQorICAgICAgICAgICAgICAgICAgICBlcXVhbHMgPSBGTEFHX0lHTk9SRV9DSEVFS19QUkVTU0VTLCBuYW1lID0gIkZMQUdfSUdOT1JFX0NIRUVLX1BSRVNTRVMiKSwKKyAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBGTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVELAorICAgICAgICAgICAgICAgICAgICBlcXVhbHMgPSBGTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVELCBuYW1lID0gIkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQiKQogICAgICAgICB9KQogICAgICAgICBwdWJsaWMgaW50IGZsYWdzOwogICAgICAgICAKQEAgLTYwMyw2ICs2MTAsMTIgQEAKICAgICAgICAgICogaXQgaXMgY3JlYXRlZC4KICAgICAgICAgICoge0BoaWRlfSAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1NZU1RFTV9FUlJPUiA9IDB4NDAwMDAwMDA7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB3aW5kb3cgc2hvdWxkIGJlIGhhcmR3YXJlIGFjY2VsZXJhdGVkLgorICAgICAgICAgKiBSZXF1ZXN0aW5nIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBkb2VzIG5vdCBndWFyYW50ZWUgaXQgd2lsbCBoYXBwZW4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEID0gMHg4MDAwMDAwMDsgICAgICAgIAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBHaXZlbiBhIHBhcnRpY3VsYXIgc2V0IG9mIHdpbmRvdyBtYW5hZ2VyIGZsYWdzLCBkZXRlcm1pbmUgd2hldGhlcgpAQCAtMTA3NSw2ICsxMDg4LDcgQEAKICAgICAgICAgICAgICAgICBzY3JlZW5PcmllbnRhdGlvbiA9IG8uc2NyZWVuT3JpZW50YXRpb247CiAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBTQ1JFRU5fT1JJRU5UQVRJT05fQ0hBTkdFRDsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcmV0dXJuIGNoYW5nZXM7CiAgICAgICAgIH0KICAgICAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlNYW5hZ2VyLmphdmEKaW5kZXggMDE4NjI3MC4uZjQwNmRhOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlNYW5hZ2VyLmphdmEKQEAgLTk0LDcgKzk0LDkgQEAKICAgICBwdWJsaWMgc3RhdGljIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIGdldEluc3RhbmNlKENvbnRleHQgY29udGV4dCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHNJbnN0YW5jZVN5bmMpIHsKICAgICAgICAgICAgIGlmIChzSW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihjb250ZXh0KTsKKyAgICAgICAgICAgICAgICBJQmluZGVyIGlCaW5kZXIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuQUNDRVNTSUJJTElUWV9TRVJWSUNFKTsKKyAgICAgICAgICAgICAgICBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgc2VydmljZSA9IElBY2Nlc3NpYmlsaXR5TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKGlCaW5kZXIpOworICAgICAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihjb250ZXh0LCBzZXJ2aWNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gc0luc3RhbmNlOwpAQCAtMTA0LDEzICsxMDYsMTYgQEAKICAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY29udGV4dCBBIHtAbGluayBDb250ZXh0fS4KKyAgICAgKiBAcGFyYW0gc2VydmljZSBBbiBpbnRlcmZhY2UgdG8gdGhlIGJhY2tpbmcgc2VydmljZS4KKyAgICAgKgorICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5TWFuYWdlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eU1hbmFnZXIoQ29udGV4dCBjb250ZXh0LCBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgc2VydmljZSkgewogICAgICAgICBtSGFuZGxlciA9IG5ldyBNeUhhbmRsZXIoY29udGV4dC5nZXRNYWluTG9vcGVyKCkpOwotICAgICAgICBJQmluZGVyIGlCaW5kZXIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuQUNDRVNTSUJJTElUWV9TRVJWSUNFKTsKLSAgICAgICAgbVNlcnZpY2UgPSBJQWNjZXNzaWJpbGl0eU1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZShpQmluZGVyKTsKKyAgICAgICAgbVNlcnZpY2UgPSBzZXJ2aWNlOworCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtU2VydmljZS5hZGRDbGllbnQobUNsaWVudCk7CisgICAgICAgICAgICBtSXNFbmFibGVkID0gbVNlcnZpY2UuYWRkQ2xpZW50KG1DbGllbnQpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gcmUpIHsKICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJBY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2UgaXMgZGVhZCIsIHJlKTsKICAgICAgICAgfQpAQCAtMTI4LDYgKzEzMywxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNsaWVudCBpbnRlcmZhY2UgdGhpcyBpbnN0YW5jZSByZWdpc3RlcnMgaW4KKyAgICAgKiB0aGUgY2VudHJhbGl6ZWQgYWNjZXNzaWJpbGl0eSBtYW5hZ2VyIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgZ2V0Q2xpZW50KCkgeworICAgICAgIHJldHVybiAoSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KSBtQ2xpZW50LmFzQmluZGVyKCk7IAorICAgIH0KKworICAgIC8qKgogICAgICAqIFNlbmRzIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnR9LiBJZiB0aGlzIHtAbGluayBBY2Nlc3NpYmlsaXR5TWFuYWdlcn0gaXMgbm90CiAgICAgICogZW5hYmxlZCB0aGUgY2FsbCBpcyBhIE5PT1AuCiAgICAgICoKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eU1hbmFnZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eU1hbmFnZXIuYWlkbAppbmRleCAzMjc4OGJlLi43NjMzNTY5ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eU1hbmFnZXIuYWlkbApAQCAtMjksNyArMjksNyBAQAogICovCiBpbnRlcmZhY2UgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIHsKIAotICAgIHZvaWQgYWRkQ2xpZW50KElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBjbGllbnQpOworICAgIGJvb2xlYW4gYWRkQ2xpZW50KElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBjbGllbnQpOwogCiAgICAgYm9vbGVhbiBzZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGluIEFjY2Vzc2liaWxpdHlFdmVudCB1aUV2ZW50KTsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb24uamF2YQppbmRleCAzNDliN2U1Li45YTFlNDFjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb24uamF2YQpAQCAtMTc0LDcgKzE3NCwxMyBAQAogICAgICAqIERlc2lyZWQgWiBvcmRlciBtb2RlIGR1cmluZyBhbmltYXRpb24uCiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgbVpBZGp1c3RtZW50OwotICAgIAorCisgICAgLyoqCisgICAgICogc2NhbGVmYWN0b3IgdG8gYXBwbHkgdG8gcGl2b3QgcG9pbnRzLCBldGMuIGR1cmluZyBhbmltYXRpb24uIFN1YmNsYXNzZXMgcmV0cmlldmUgdGhlCisgICAgICogdmFsdWUgdmlhIGdldFNjYWxlRmFjdG9yKCkuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtU2NhbGVGYWN0b3IgPSAxZjsKKwogICAgIC8qKgogICAgICAqIERvbid0IGFuaW1hdGUgdGhlIHdhbGxwYXBlci4KICAgICAgKi8KQEAgLTMwMSw3ICszMDcsNyBAQAogICAgICAqIGFuaW1hdGVkIGFzIHdlbGwgYXMgdGhlIG9iamVjdHMgcGFyZW50cy4gKFRoaXMgaXMgdG8gc3VwcG9ydCBhbmltYXRpb24KICAgICAgKiBzaXplcyBiZWluZyBzcGVjaWZlZCByZWxhdGl2ZSB0byB0aGVzZSBkaW1lbnNpb25zLikKICAgICAgKgotICAgICAqIDxwPk9iamVjdHMgdGhhdCBpbnRlcnByZXQgYSBBbmltYXRpb25zIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4KKyAgICAgKiA8cD5PYmplY3RzIHRoYXQgaW50ZXJwcmV0IEFuaW1hdGlvbnMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2Qgd2hlbgogICAgICAqIHRoZSBzaXplcyBvZiB0aGUgb2JqZWN0IGJlaW5nIGFuaW1hdGVkIGFuZCBpdHMgcGFyZW50IGFyZSBrbm93biwgYW5kCiAgICAgICogYmVmb3JlIGNhbGxpbmcge0BsaW5rICNnZXRUcmFuc2Zvcm1hdGlvbn0uCiAgICAgICoKQEAgLTU1Myw2ICs1NTksMTkgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCisgICAgICogVGhlIHNjYWxlIGZhY3RvciBpcyBzZXQgYnkgdGhlIGNhbGwgdG8gPGNvZGU+Z2V0VHJhbnNmb3JtYXRpb248L2NvZGU+LiBPdmVycmlkZXMgb2YgCisgICAgICoge0BsaW5rICNnZXRUcmFuc2Zvcm1hdGlvbihsb25nLCBUcmFuc2Zvcm1hdGlvbiwgZmxvYXQpfSB3aWxsIGdldCB0aGlzIHZhbHVlCisgICAgICogZGlyZWN0bHkuIE92ZXJyaWRlcyBvZiB7QGxpbmsgI2FwcGx5VHJhbnNmb3JtYXRpb24oZmxvYXQsIFRyYW5zZm9ybWF0aW9uKX0gY2FuCisgICAgICogY2FsbCB0aGlzIG1ldGhvZCB0byBnZXQgdGhlIHZhbHVlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gZmxvYXQgVGhlIHNjYWxlIGZhY3RvciB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHByZS1zY2FsZWQgdmFsdWVzIGluCisgICAgICogYW4gQW5pbWF0aW9uIHN1Y2ggYXMgdGhlIHBpdm90IHBvaW50cyBpbiB7QGxpbmsgU2NhbGVBbmltYXRpb259IGFuZCB7QGxpbmsgUm90YXRlQW5pbWF0aW9ufS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmxvYXQgZ2V0U2NhbGVGYWN0b3IoKSB7CisgICAgICAgIHJldHVybiBtU2NhbGVGYWN0b3I7CisgICAgfQorCisgICAgLyoqCiAgICAgICogSWYgZGV0YWNoV2FsbHBhcGVyIGlzIHRydWUsIGFuZCB0aGlzIGlzIGEgd2luZG93IGFuaW1hdGlvbiBvZiBhIHdpbmRvdwogICAgICAqIHRoYXQgaGFzIGEgd2FsbHBhcGVyIGJhY2tncm91bmQsIHRoZW4gdGhlIHdpbmRvdyB3aWxsIGJlIGRldGFjaGVkIGZyb20KICAgICAgKiB0aGUgd2FsbHBhcGVyIHdoaWxlIGl0IHJ1bnMuICBUaGF0IGlzLCB0aGUgYW5pbWF0aW9uIHdpbGwgb25seSBiZSBhcHBsaWVkCkBAIC03MzUsNiArNzU0LDcgQEAKICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGFuaW1hdGlvbiBpcyBzdGlsbCBydW5uaW5nCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0VHJhbnNmb3JtYXRpb24obG9uZyBjdXJyZW50VGltZSwgVHJhbnNmb3JtYXRpb24gb3V0VHJhbnNmb3JtYXRpb24pIHsKKwogICAgICAgICBpZiAobVN0YXJ0VGltZSA9PSAtMSkgewogICAgICAgICAgICAgbVN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lOwogICAgICAgICB9CkBAIC04MDYsNiArODI2LDI0IEBACiAKICAgICAgICAgcmV0dXJuIG1Nb3JlOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBhcHBseSBhdCBhIHNwZWNpZmllZCBwb2ludCBpbiB0aW1lLiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcworICAgICAqIG1ldGhvZCBzaG91bGQgYWx3YXlzIHJlcGxhY2UgdGhlIHNwZWNpZmllZCBUcmFuc2Zvcm1hdGlvbiBvciBkb2N1bWVudCB0aGV5IGFyZSBkb2luZworICAgICAqIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdXJyZW50VGltZSBXaGVyZSB3ZSBhcmUgaW4gdGhlIGFuaW1hdGlvbi4gVGhpcyBpcyB3YWxsIGNsb2NrIHRpbWUuCisgICAgICogQHBhcmFtIG91dFRyYW5zZm9ybWF0aW9uIEEgdHJhbmZvcm1hdGlvbiBvYmplY3QgdGhhdCBpcyBwcm92aWRlZCBieSB0aGUKKyAgICAgKiAgICAgICAgY2FsbGVyIGFuZCB3aWxsIGJlIGZpbGxlZCBpbiBieSB0aGUgYW5pbWF0aW9uLgorICAgICAqIEBwYXJhbSBzY2FsZSBTY2FsaW5nIGZhY3RvciB0byBhcHBseSB0byBhbnkgaW5wdXRzIHRvIHRoZSB0cmFuc2Zvcm0gb3BlcmF0aW9uLCBzdWNoCisgICAgICogICAgICAgIHBpdm90IHBvaW50cyBiZWluZyByb3RhdGVkIG9yIHNjYWxlZCBhcm91bmQuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBhbmltYXRpb24gaXMgc3RpbGwgcnVubmluZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFRyYW5zZm9ybWF0aW9uKGxvbmcgY3VycmVudFRpbWUsIFRyYW5zZm9ybWF0aW9uIG91dFRyYW5zZm9ybWF0aW9uLAorICAgICAgICAgICAgZmxvYXQgc2NhbGUpIHsKKyAgICAgICAgbVNjYWxlRmFjdG9yID0gc2NhbGU7CisgICAgICAgIHJldHVybiBnZXRUcmFuc2Zvcm1hdGlvbihjdXJyZW50VGltZSwgb3V0VHJhbnNmb3JtYXRpb24pOworICAgIH0KIAogICAgIC8qKgogICAgICAqIDxwPkluZGljYXRlcyB3aGV0aGVyIHRoaXMgYW5pbWF0aW9uIGhhcyBzdGFydGVkIG9yIG5vdC48L3A+CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25TZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblNldC5qYXZhCmluZGV4IDE1NDZkY2QuLjg3M2NlNTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblNldC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblNldC5qYXZhCkBAIC0zMTIsNyArMzEyLDcgQEAKICAgICAgICAgICAgIGZpbmFsIEFuaW1hdGlvbiBhID0gYW5pbWF0aW9ucy5nZXQoaSk7CiAKICAgICAgICAgICAgIHRlbXAuY2xlYXIoKTsKLSAgICAgICAgICAgIG1vcmUgPSBhLmdldFRyYW5zZm9ybWF0aW9uKGN1cnJlbnRUaW1lLCB0ZW1wKSB8fCBtb3JlOworICAgICAgICAgICAgbW9yZSA9IGEuZ2V0VHJhbnNmb3JtYXRpb24oY3VycmVudFRpbWUsIHRlbXAsIGdldFNjYWxlRmFjdG9yKCkpIHx8IG1vcmU7CiAgICAgICAgICAgICB0LmNvbXBvc2UodGVtcCk7CiAKICAgICAgICAgICAgIHN0YXJ0ZWQgPSBzdGFydGVkIHx8IGEuaGFzU3RhcnRlZCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblV0aWxzLmphdmEKaW5kZXggMzA4ODM4Mi4uYzA5MGY4ZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25VdGlscy5qYXZhCkBAIC0zMyw2ICszMywxNCBAQAogICoKICAqLwogcHVibGljIGNsYXNzIEFuaW1hdGlvblV0aWxzIHsKKworICAgIC8qKgorICAgICAqIFRoZXNlIGZsYWdzIGFyZSB1c2VkIHdoZW4gcGFyc2luZyBTZXF1ZW5jZXIgb2JqZWN0cworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT0dFVEhFUiA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFUVVFTlRJQUxMWSA9IDE7CisKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHRpbWUgc2hvdWxkIGJlIHVzZWQgd2hlbiBpbnZva2luZwogICAgICAqIHtAbGluayBBbmltYXRpb24jc2V0U3RhcnRUaW1lKGxvbmcpfS4gUmVmZXIgdG8ge0BsaW5rIGFuZHJvaWQub3MuU3lzdGVtQ2xvY2t9IGZvciBtb3JlCkBAIC00OSw3ICs1Nyw3IEBACiAKICAgICAvKioKICAgICAgKiBMb2FkcyBhbiB7QGxpbmsgQW5pbWF0aW9ufSBvYmplY3QgZnJvbSBhIHJlc291cmNlCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gY29udGV4dCBBcHBsaWNhdGlvbiBjb250ZXh0IHVzZWQgdG8gYWNjZXNzIHJlc291cmNlcwogICAgICAqIEBwYXJhbSBpZCBUaGUgcmVzb3VyY2UgaWQgb2YgdGhlIGFuaW1hdGlvbiB0byBsb2FkCiAgICAgICogQHJldHVybiBUaGUgYW5pbWF0aW9uIG9iamVjdCByZWZlcmVuY2UgYnkgdGhlIHNwZWNpZmllZCBpZApAQCAtODIsMTIgKzkwLDEyIEBACiAKICAgICAgICAgcmV0dXJuIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoYywgcGFyc2VyLCBudWxsLCBYbWwuYXNBdHRyaWJ1dGVTZXQocGFyc2VyKSk7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSBzdGF0aWMgQW5pbWF0aW9uIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoQ29udGV4dCBjLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwKICAgICAgICAgICAgIEFuaW1hdGlvblNldCBwYXJlbnQsIEF0dHJpYnV0ZVNldCBhdHRycykgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgCisKICAgICAgICAgQW5pbWF0aW9uIGFuaW0gPSBudWxsOwotIAorCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgb24gYSBzdGFydCB0YWcuCiAgICAgICAgIGludCB0eXBlOwogICAgICAgICBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKQEAgLTEwMCw3ICsxMDgsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmcgIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwotICAgIAorCiAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoInNldCIpKSB7CiAgICAgICAgICAgICAgICAgYW5pbSA9IG5ldyBBbmltYXRpb25TZXQoYywgYXR0cnMpOwogICAgICAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoYywgcGFyc2VyLCAoQW5pbWF0aW9uU2V0KWFuaW0sIGF0dHJzKTsKQEAgLTEyMCw3ICsxMjgsNyBAQAogICAgICAgICAgICAgICAgIHBhcmVudC5hZGRBbmltYXRpb24oYW5pbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAKKwogICAgICAgICByZXR1cm4gYW5pbTsKIAogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1JvdGF0ZUFuaW1hdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEKaW5kZXggMjg0Y2NjZS4uNThiZjA4NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEKQEAgLTE0OCwxMSArMTQ4LDEyIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbihmbG9hdCBpbnRlcnBvbGF0ZWRUaW1lLCBUcmFuc2Zvcm1hdGlvbiB0KSB7CiAgICAgICAgIGZsb2F0IGRlZ3JlZXMgPSBtRnJvbURlZ3JlZXMgKyAoKG1Ub0RlZ3JlZXMgLSBtRnJvbURlZ3JlZXMpICogaW50ZXJwb2xhdGVkVGltZSk7Ci0KKyAgICAgICAgZmxvYXQgc2NhbGUgPSBnZXRTY2FsZUZhY3RvcigpOworICAgICAgICAKICAgICAgICAgaWYgKG1QaXZvdFggPT0gMC4wZiAmJiBtUGl2b3RZID09IDAuMGYpIHsKICAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0Um90YXRlKGRlZ3JlZXMpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdC5nZXRNYXRyaXgoKS5zZXRSb3RhdGUoZGVncmVlcywgbVBpdm90WCwgbVBpdm90WSk7CisgICAgICAgICAgICB0LmdldE1hdHJpeCgpLnNldFJvdGF0ZShkZWdyZWVzLCBtUGl2b3RYICogc2NhbGUsIG1QaXZvdFkgKiBzY2FsZSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1NjYWxlQW5pbWF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9TY2FsZUFuaW1hdGlvbi5qYXZhCmluZGV4IDFhNTZjOGIuLjg1MzdkNDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1NjYWxlQW5pbWF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vU2NhbGVBbmltYXRpb24uamF2YQpAQCAtMTYxLDYgKzE2MSw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbihmbG9hdCBpbnRlcnBvbGF0ZWRUaW1lLCBUcmFuc2Zvcm1hdGlvbiB0KSB7CiAgICAgICAgIGZsb2F0IHN4ID0gMS4wZjsKICAgICAgICAgZmxvYXQgc3kgPSAxLjBmOworICAgICAgICBmbG9hdCBzY2FsZSA9IGdldFNjYWxlRmFjdG9yKCk7CiAKICAgICAgICAgaWYgKG1Gcm9tWCAhPSAxLjBmIHx8IG1Ub1ggIT0gMS4wZikgewogICAgICAgICAgICAgc3ggPSBtRnJvbVggKyAoKG1Ub1ggLSBtRnJvbVgpICogaW50ZXJwb2xhdGVkVGltZSk7CkBAIC0xNzIsNyArMTczLDcgQEAKICAgICAgICAgaWYgKG1QaXZvdFggPT0gMCAmJiBtUGl2b3RZID09IDApIHsKICAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0U2NhbGUoc3gsIHN5KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0U2NhbGUoc3gsIHN5LCBtUGl2b3RYLCBtUGl2b3RZKTsKKyAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0U2NhbGUoc3gsIHN5LCBzY2FsZSAqIG1QaXZvdFgsIHNjYWxlICogbVBpdm90WSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kSW5mby5qYXZhCmluZGV4IDM1N2NiNWZlLi42OGUyMzFjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RJbmZvLmphdmEKQEAgLTM3LDYgKzM3LDcgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzcGVjaWZ5IG1ldGEgaW5mb3JtYXRpb24gb2YgYW4gaW5wdXQgbWV0aG9kLgpAQCAtNjgsNyArNjksMTA4IEBACiAgICAgICogY2FuIGNoYW5nZSBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiAoaW4gcGFydGljdWxhciBsb2NhbGUpLgogICAgICAqLwogICAgIGZpbmFsIGludCBtSXNEZWZhdWx0UmVzSWQ7Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBJbnB1dE1ldGhvZFN1YnR5cGUgaXMgYSBzdWJ0eXBlIGNvbnRhaW5lZCBpbiB0aGUgaW5wdXQgbWV0aG9kLiBTdWJ0eXBlIGNhbiBkZXNjcmliZQorICAgICAqIGxvY2FsZXMgKGUuZy4gZW5fVVMsIGZyX0ZSLi4uKSBhbmQgbW9kZXMgKGUuZy4gdm9pY2UsIGtleWJvYXJkLi4uKSwgYW5kIGlzIHVzZWQgZm9yCisgICAgICogSU1FIHN3aXRjaC4gVGhlIHN1YnR5cGUgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gY2FsbCB0aGUgc3BlY2lmaWVkIHN1YnR5cGUgb2YgSU1FIGRpcmVjdGx5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5wdXRNZXRob2RTdWJ0eXBlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TdWJ0eXBlTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVN1YnR5cGVJY29uSWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TdWJ0eXBlTG9jYWxlOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtU3VidHlwZU1vZGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TdWJ0eXBlRXh0cmFWYWx1ZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IKKyAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN1YnR5cGUKKyAgICAgICAgICogQHBhcmFtIGljb25JZCBUaGUgaWNvbiBvZiB0aGUgc3VidHlwZQorICAgICAgICAgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUgc3VwcG9ydGVkIGJ5IHRoZSBzdWJ0eXBlCisgICAgICAgICAqIEBwYXJhbSBtb2RlIFRoZSBtb2RlIHN1cHBvcnRlZCBieSB0aGUgc3VidHlwZQorICAgICAgICAgKiBAcGFyYW0gZXh0cmFWYWx1ZSBUaGUgZXh0cmEgdmFsdWUgb2YgdGhlIHN1YnR5cGUKKyAgICAgICAgICovCisgICAgICAgIElucHV0TWV0aG9kU3VidHlwZShTdHJpbmcgbmFtZSwgaW50IGljb25JZCwgU3RyaW5nIGxvY2FsZSwgU3RyaW5nIG1vZGUsCisgICAgICAgICAgICAgICAgU3RyaW5nIGV4dHJhVmFsdWUpIHsKKyAgICAgICAgICAgIG1TdWJ0eXBlTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBtU3VidHlwZUljb25JZCA9IGljb25JZDsKKyAgICAgICAgICAgIG1TdWJ0eXBlTG9jYWxlID0gbG9jYWxlOworICAgICAgICAgICAgbVN1YnR5cGVNb2RlID0gbW9kZTsKKyAgICAgICAgICAgIG1TdWJ0eXBlRXh0cmFWYWx1ZSA9IGV4dHJhVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBJbnB1dE1ldGhvZFN1YnR5cGUoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgICAgbVN1YnR5cGVOYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIG1TdWJ0eXBlSWNvbklkID0gc291cmNlLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIG1TdWJ0eXBlTG9jYWxlID0gc291cmNlLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIG1TdWJ0eXBlTW9kZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBtU3VidHlwZUV4dHJhVmFsdWUgPSBzb3VyY2UucmVhZFN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHN1YnR5cGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3VidHlwZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgaWNvbiBvZiB0aGUgc3VidHlwZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRJY29uSWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVN1YnR5cGVJY29uSWQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgbG9jYWxlIG9mIHRoZSBzdWJ0eXBlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3VidHlwZUxvY2FsZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBtb2RlIG9mIHRoZSBzdWJ0eXBlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1vZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVN1YnR5cGVNb2RlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGV4dHJhIHZhbHVlIG9mIHRoZSBzdWJ0eXBlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEV4dHJhVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVN1YnR5cGVFeHRyYVZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgcGFyY2VsYWJsZUZsYWdzKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TdWJ0eXBlTmFtZSk7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1TdWJ0eXBlSWNvbklkKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVN1YnR5cGVMb2NhbGUpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3VidHlwZU1vZGUpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3VidHlwZUV4dHJhVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8SW5wdXRNZXRob2RTdWJ0eXBlPiBDUkVBVE9SCisgICAgICAgICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPElucHV0TWV0aG9kU3VidHlwZT4oKSB7CisgICAgICAgICAgICBwdWJsaWMgSW5wdXRNZXRob2RTdWJ0eXBlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRNZXRob2RTdWJ0eXBlKHNvdXJjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBJbnB1dE1ldGhvZFN1YnR5cGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRNZXRob2RTdWJ0eXBlW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhcnJheSBvZiB0aGUgc3VidHlwZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPiBtU3VidHlwZXMgPSBuZXcgQXJyYXlMaXN0PElucHV0TWV0aG9kU3VidHlwZT4oKTsKKwogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yLgogICAgICAqIApAQCAtODEsMTEgKzE4MywxMSBAQAogICAgICAgICBtU2VydmljZSA9IHNlcnZpY2U7CiAgICAgICAgIFNlcnZpY2VJbmZvIHNpID0gc2VydmljZS5zZXJ2aWNlSW5mbzsKICAgICAgICAgbUlkID0gbmV3IENvbXBvbmVudE5hbWUoc2kucGFja2FnZU5hbWUsIHNpLm5hbWUpLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7Ci0gICAgICAgIAorCiAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwogICAgICAgICBTdHJpbmcgc2V0dGluZ3NBY3Rpdml0eUNvbXBvbmVudCA9IG51bGw7CiAgICAgICAgIGludCBpc0RlZmF1bHRSZXNJZCA9IDA7Ci0gICAgICAgIAorCiAgICAgICAgIFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBwYXJzZXIgPSBzaS5sb2FkWG1sTWV0YURhdGEocG0sIElucHV0TWV0aG9kLlNFUlZJQ0VfTUVUQV9EQVRBKTsKQEAgLTExNiwxMyArMjE4LDM2IEBACiAgICAgICAgICAgICBpc0RlZmF1bHRSZXNJZCA9IHNhLmdldFJlc291cmNlSWQoCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLklucHV0TWV0aG9kX2lzRGVmYXVsdCwgMCk7CiAgICAgICAgICAgICBzYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOworICAgICAgICAgICAgLy8gUGFyc2UgYWxsIHN1YnR5cGVzCisgICAgICAgICAgICB3aGlsZSAoKCh0eXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gZGVwdGgpCisgICAgICAgICAgICAgICAgICAgICYmIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKyAgICAgICAgICAgICAgICBub2RlTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKCEic3VidHlwZSIuZXF1YWxzKG5vZGVOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJNZXRhLWRhdGEgaW4gaW5wdXQtbWV0aG9kIGRvZXMgbm90IHN0YXJ0IHdpdGggc3VidHlwZSB0YWciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgVHlwZWRBcnJheSBhID0gcmVzLm9idGFpbkF0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuSW5wdXRNZXRob2RfU3VidHlwZSk7CisgICAgICAgICAgICAgICAgSW5wdXRNZXRob2RTdWJ0eXBlIHN1YnR5cGUgPSBuZXcgSW5wdXRNZXRob2RTdWJ0eXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuSW5wdXRNZXRob2RfU3VidHlwZV9sYWJlbCksCisgICAgICAgICAgICAgICAgICAgICAgICBhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLklucHV0TWV0aG9kX1N1YnR5cGVfaWNvbiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSW5wdXRNZXRob2RfU3VidHlwZV9pbWVTdWJ0eXBlTG9jYWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5JbnB1dE1ldGhvZF9TdWJ0eXBlX2ltZVN1YnR5cGVNb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5JbnB1dE1ldGhvZF9TdWJ0eXBlX2ltZVN1YnR5cGVFeHRyYVZhbHVlKSk7CisgICAgICAgICAgICAgICAgbVN1YnR5cGVzLmFkZChzdWJ0eXBlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGNyZWF0ZSBjb250ZXh0IGZvcjogIiArIHNpLnBhY2thZ2VOYW1lKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGlmIChwYXJzZXIgIT0gbnVsbCkgcGFyc2VyLmNsb3NlKCk7CiAgICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIG1TZXR0aW5nc0FjdGl2aXR5TmFtZSA9IHNldHRpbmdzQWN0aXZpdHlDb21wb25lbnQ7CiAgICAgICAgIG1Jc0RlZmF1bHRSZXNJZCA9IGlzRGVmYXVsdFJlc0lkOwogICAgIH0KQEAgLTEzMiw4ICsyNTcsOSBAQAogICAgICAgICBtU2V0dGluZ3NBY3Rpdml0eU5hbWUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICAgICBtSXNEZWZhdWx0UmVzSWQgPSBzb3VyY2UucmVhZEludCgpOwogICAgICAgICBtU2VydmljZSA9IFJlc29sdmVJbmZvLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChzb3VyY2UpOworICAgICAgICBzb3VyY2UucmVhZFR5cGVkTGlzdChtU3VidHlwZXMsIElucHV0TWV0aG9kU3VidHlwZS5DUkVBVE9SKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBUZW1wb3JhcnkgQVBJIGZvciBjcmVhdGluZyBhIGJ1aWx0LWluIGlucHV0IG1ldGhvZC4KICAgICAgKi8KQEAgLTE1Niw3ICsyODIsNyBAQAogICAgICAgICBtU2V0dGluZ3NBY3Rpdml0eU5hbWUgPSBzZXR0aW5nc0FjdGl2aXR5OwogICAgICAgICBtSXNEZWZhdWx0UmVzSWQgPSAwOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBpbnB1dCBtZXRob2QuICBUaGUgSUQgaXMgZ2VuZXJhdGVkIGZyb20KICAgICAgKiB0aGUgcGFja2FnZSBhbmQgY2xhc3MgbmFtZSBpbXBsZW1lbnRpbmcgdGhlIG1ldGhvZC4KQEAgLTE2NCwxNCArMjkwLDE0IEBACiAgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKICAgICAgICAgcmV0dXJuIG1JZDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIC5hcGsgcGFja2FnZSB0aGF0IGltcGxlbWVudHMgdGhpcyBpbnB1dCBtZXRob2QuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnNlcnZpY2VJbmZvLnBhY2thZ2VOYW1lOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgc2VydmljZSBjb21wb25lbnQgdGhhdCBpbXBsZW1lbnRzCiAgICAgICogdGhpcyBpbnB1dCBtZXRob2QuCkBAIC0xOTYsNyArMzIyLDcgQEAKICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnROYW1lKG1TZXJ2aWNlLnNlcnZpY2VJbmZvLnBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNlcnZpY2VJbmZvLm5hbWUpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIExvYWQgdGhlIHVzZXItZGlzcGxheWVkIGxhYmVsIGZvciB0aGlzIGlucHV0IG1ldGhvZC4KICAgICAgKiAKQEAgLTIwNiw3ICszMzIsNyBAQAogICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgbG9hZExhYmVsKFBhY2thZ2VNYW5hZ2VyIHBtKSB7CiAgICAgICAgIHJldHVybiBtU2VydmljZS5sb2FkTGFiZWwocG0pOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIExvYWQgdGhlIHVzZXItZGlzcGxheWVkIGljb24gZm9yIHRoaXMgaW5wdXQgbWV0aG9kLgogICAgICAqIApAQCAtMjE2LDcgKzM0Miw3IEBACiAgICAgcHVibGljIERyYXdhYmxlIGxvYWRJY29uKFBhY2thZ2VNYW5hZ2VyIHBtKSB7CiAgICAgICAgIHJldHVybiBtU2VydmljZS5sb2FkSWNvbihwbSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIG9mIGFuIGFjdGl2aXR5IHRoYXQgcHJvdmlkZXMgYSBzZXR0aW5ncyBVSSBmb3IKICAgICAgKiB0aGUgaW5wdXQgbWV0aG9kLiAgWW91IGNhbiBsYXVuY2ggdGhpcyBhY3Rpdml0eSBiZSBzdGFydGluZyBpdCB3aXRoCkBAIC0yMzAsNyArMzU2LDE0IEBACiAgICAgcHVibGljIFN0cmluZyBnZXRTZXR0aW5nc0FjdGl2aXR5KCkgewogICAgICAgICByZXR1cm4gbVNldHRpbmdzQWN0aXZpdHlOYW1lOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3VidHlwZXMgb2YgSW5wdXQgTWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBBcnJheUxpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPiBnZXRTdWJ0eXBlcygpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJ0eXBlczsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHJlc291cmNlIGlkZW50aWZpZXIgb2YgYSByZXNvdXJjZSBpbnNpZGUgb2YgdGhpcyBpbnB1dAogICAgICAqIG1ldGhvZCdzIC5hcGsgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYQpAQCAtMjM5LDcgKzM3Miw3IEBACiAgICAgcHVibGljIGludCBnZXRJc0RlZmF1bHRSZXNvdXJjZUlkKCkgewogICAgICAgICByZXR1cm4gbUlzRGVmYXVsdFJlc0lkOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIGR1bXAoUHJpbnRlciBwdywgU3RyaW5nIHByZWZpeCkgewogICAgICAgICBwdy5wcmludGxuKHByZWZpeCArICJtSWQ9IiArIG1JZAogICAgICAgICAgICAgICAgICsgIiBtU2V0dGluZ3NBY3Rpdml0eU5hbWU9IiArIG1TZXR0aW5nc0FjdGl2aXR5TmFtZSk7CkBAIC0yODUsMTIgKzQxOCwxNCBAQAogICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TZXR0aW5nc0FjdGl2aXR5TmFtZSk7CiAgICAgICAgIGRlc3Qud3JpdGVJbnQobUlzRGVmYXVsdFJlc0lkKTsKICAgICAgICAgbVNlcnZpY2Uud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgIGRlc3Qud3JpdGVUeXBlZExpc3QobVN1YnR5cGVzKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBVc2VkIHRvIG1ha2UgdGhpcyBjbGFzcyBwYXJjZWxhYmxlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPElucHV0TWV0aG9kSW5mbz4gQ1JFQVRPUiA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8SW5wdXRNZXRob2RJbmZvPigpIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxJbnB1dE1ldGhvZEluZm8+IENSRUFUT1IKKyAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxJbnB1dE1ldGhvZEluZm8+KCkgewogICAgICAgICBwdWJsaWMgSW5wdXRNZXRob2RJbmZvIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHNvdXJjZSkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dE1ldGhvZEluZm8oc291cmNlKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0FjY2Vzc2liaWxpdHlJbmplY3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0FjY2Vzc2liaWxpdHlJbmplY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZGRjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQWNjZXNzaWJpbGl0eUluamVjdG9yLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLkV2ZW50SHViOworCisvKioKKyAqIFRoaXMgY2xhc3MgaW5qZWN0cyBhY2Nlc3NpYmlsaXR5IGludG8gV2ViVmlld3Mgd2l0aCBkaXNhYmxlZCBKYXZhU2NyaXB0IG9yCisgKiBXZWJWaWV3cyB3aXRoIGVuYWJsZWQgSmF2YVNjcmlwdCBidXQgZm9yIHdoaWNoIHdlIGhhdmUgbm8gYWNjZXNzaWJpbGl0eQorICogc2NyaXB0IHRvIGluamVjdC4KKyAqLworY2xhc3MgQWNjZXNzaWJpbGl0eUluamVjdG9yIHsKKworICAgIC8vIEhhbmRsZSB0byB0aGUgV2ViVmlldyB0aGlzIGluamVjdG9yIGlzIGFzc29jaWF0ZWQgd2l0aC4KKyAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluamVjdG9yIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIFZ3ZWJWaWV3LgorICAgICAqCisgICAgICogQHBhcmFtIHdlYlZpZXcgVGhlIGFzc29jaWF0ZWQgV2ViVmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eUluamVjdG9yKFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIGEga2V5IGRvd24gPGNvZGU+ZXZlbnQ8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBldmVudCB3YXMgcHJvY2Vzc2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKKworICAgICAgICAvLyBhcyBhIHByb29mIG9mIGNvbmNlcHQgbGV0IHVzIGRvIHRoZSBzaW1wbGVzdCBleGFtcGxlCisKKyAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpICE9IEtleUV2ZW50LkFDVElPTl9VUCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaW50IGtleUNvZGUgPSBldmVudC5nZXRLZXlDb2RlKCk7CisKKyAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfTjoKKyAgICAgICAgICAgICAgICBtb2RpZnlTZWxlY3Rpb24oImV4dGVuZCIsICJmb3J3YXJkIiwgInNlbnRlbmNlIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfUDoKKyAgICAgICAgICAgICAgICBtb2RpZnlTZWxlY3Rpb24oImV4dGVuZCIsICJiYWNrd2FyZCIsICJzZW50ZW5jZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSA8Y29kZT5zZWxlY3Rpb25TdHJpbmc8L2NvZGU+IGhhcyBjaGFuZ2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU2VsZWN0aW9uU3RyaW5nQ2hhbmdlKFN0cmluZyBzZWxlY3Rpb25TdHJpbmcpIHsKKyAgICAgICAgLy8gcHV0IHRoZSBzZWxlY3Rpb24gc3RyaW5nIGluIGFuIEFjY2Vzc2liaWxpdHlFdmVudCBhbmQgc2VuZCBpdAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfRk9DVVNFRCk7CisgICAgICAgIGV2ZW50LmdldFRleHQoKS5hZGQoc2VsZWN0aW9uU3RyaW5nKTsKKyAgICAgICAgbVdlYlZpZXcuc2VuZEFjY2Vzc2liaWxpdHlFdmVudFVuY2hlY2tlZChldmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTW9kaWZpZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGFsdGVyIFNwZWNpZmllcyBob3cgdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZ3JhbnVsYXJpdHkgVGhlIGdyYW51bGFyaXR5IG9mIHRoZSBzZWxlY3Rpb24gbW9kaWZpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBtb2RpZnlTZWxlY3Rpb24oU3RyaW5nIGFsdGVyLCBTdHJpbmcgZGlyZWN0aW9uLCBTdHJpbmcgZ3JhbnVsYXJpdHkpIHsKKyAgICAgICAgV2ViVmlld0NvcmUgd2ViVmlld0NvcmUgPSBtV2ViVmlldy5nZXRXZWJWaWV3Q29yZSgpOworCisgICAgICAgIGlmICh3ZWJWaWV3Q29yZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBXZWJWaWV3Q29yZS5Nb2RpZnlTZWxlY3Rpb25EYXRhIGRhdGEgPSBuZXcgV2ViVmlld0NvcmUuTW9kaWZ5U2VsZWN0aW9uRGF0YSgpOworICAgICAgICBkYXRhLm1BbHRlciA9IGFsdGVyOworICAgICAgICBkYXRhLm1EaXJlY3Rpb24gPSBkaXJlY3Rpb247CisgICAgICAgIGRhdGEubUdyYW51bGFyaXR5ID0gZ3JhbnVsYXJpdHk7CisgICAgICAgIHdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLk1PRElGWV9TRUxFQ1RJT04sIGRhdGEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YQppbmRleCBhMmM4MGYyLi5lOTcyYzI0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQnJvd3NlckZyYW1lLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0Jyb3dzZXJGcmFtZS5qYXZhCkBAIC0zOCw2ICszOCw4IEBACiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwogCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOwpAQCAtNzIsNiArNzQsOCBAQAogICAgIC8vIHF1ZXVlIGhhcyBiZWVuIGNsZWFyZWQsdGhleSBhcmUgaWdub3JlZC4KICAgICBwcml2YXRlIGJvb2xlYW4gbUJsb2NrTWVzc2FnZXMgPSBmYWxzZTsKIAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzRGF0YURpcmVjdG9yeSA9ICIiOworCiAgICAgLy8gSXMgdGhpcyBmcmFtZSB0aGUgbWFpbiBmcmFtZT8KICAgICBwcml2YXRlIGJvb2xlYW4gbUlzTWFpbkZyYW1lOwogCkBAIC0yMjQsNiArMjI4LDExIEBACiAgICAgICAgIEFzc2V0TWFuYWdlciBhbSA9IGNvbnRleHQuZ2V0QXNzZXRzKCk7CiAgICAgICAgIG5hdGl2ZUNyZWF0ZUZyYW1lKHcsIGFtLCBwcm94eS5nZXRCYWNrRm9yd2FyZExpc3QoKSk7CiAKKyAgICAgICAgaWYgKHNEYXRhRGlyZWN0b3J5Lmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIFN0cmluZyBkaXIgPSBhcHBDb250ZXh0LmdldEZpbGVzRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICBzRGF0YURpcmVjdG9yeSA9ICBkaXIuc3Vic3RyaW5nKDAsIGRpci5sYXN0SW5kZXhPZignLycpKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLkJST1dTRVJfRlJBTUUpIHsKICAgICAgICAgICAgIExvZy52KExPR1RBRywgIkJyb3dzZXJGcmFtZSBjb25zdHJ1Y3RvcjogdGhpcz0iICsgdGhpcyk7CiAgICAgICAgIH0KQEAgLTI5NCw2ICszMDMsMTggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTYXZlcyB0aGUgY29udGVudHMgb2YgdGhlIGZyYW1lIGFzIGEgd2ViIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZW5hbWUgVGhlIGZpbGVuYW1lIHdoZXJlIHRoZSBhcmNoaXZlIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICogQHBhcmFtIGF1dG9uYW1lIElmIGZhbHNlLCB0YWtlcyBmaWxlbmFtZSB0byBiZSBhIGZpbGUuIElmIHRydWUsIGZpbGVuYW1lCisgICAgICogICAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gYmUgYSBkaXJlY3RvcnkgaW4gd2hpY2ggYSBmaWxlbmFtZSB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgIGNob3NlbiBhY2NvcmRpbmcgdG8gdGhlIHVybCBvZiB0aGUgY3VycmVudCBwYWdlLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gU3RyaW5nIHNhdmVXZWJBcmNoaXZlKFN0cmluZyBiYXNlbmFtZSwgYm9vbGVhbiBhdXRvbmFtZSkgeworICAgICAgICByZXR1cm4gbmF0aXZlU2F2ZVdlYkFyY2hpdmUoYmFzZW5hbWUsIGF1dG9uYW1lKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBHbyBiYWNrIG9yIGZvcndhcmQgdGhlIG51bWJlciBvZiBzdGVwcyBnaXZlbi4KICAgICAgKiBAcGFyYW0gc3RlcHMgQSBuZWdhdGl2ZSBvciBwb3NpdGl2ZSBudW1iZXIgaW5kaWNhdGluZyB0aGUgZGlyZWN0aW9uCiAgICAgICogICAgICAgICAgICAgIGFuZCBudW1iZXIgb2Ygc3RlcHMgdG8gbW92ZS4KQEAgLTUxMCwxMiArNTMxLDIxIEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIGV4dGVybmFsUmVwcmVzZW50YXRpb24oKTsKIAogICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgdmlzdWFsIHRleHQgb2YgdGhlIGN1cnJlbnQgZnJhbWUsIHB1dHMgaXQgYXMgdGhlIG9iamVjdCBmb3IKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHZpc3VhbCB0ZXh0IG9mIHRoZSBmcmFtZXMsIHB1dHMgaXQgYXMgdGhlIG9iamVjdCBmb3IKICAgICAgKiB0aGUgbWVzc2FnZSBhbmQgc2VuZHMgdGhlIG1lc3NhZ2UuCiAgICAgICogQHBhcmFtIGNhbGxiYWNrIHRoZSBtZXNzYWdlIHRvIHVzZSB0byBzZW5kIHRoZSB2aXN1YWwgdGV4dAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRvY3VtZW50QXNUZXh0KE1lc3NhZ2UgY2FsbGJhY2spIHsKLSAgICAgICAgY2FsbGJhY2sub2JqID0gZG9jdW1lbnRBc1RleHQoKTs7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGlmIChjYWxsYmFjay5hcmcxICE9IDApIHsKKyAgICAgICAgICAgIC8vIER1bXAgdG9wIGZyYW1lIGFzIHRleHQuCisgICAgICAgICAgICB0ZXh0LmFwcGVuZChkb2N1bWVudEFzVGV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbGJhY2suYXJnMiAhPSAwKSB7CisgICAgICAgICAgICAvLyBEdW1wIGNoaWxkIGZyYW1lcyBhcyB0ZXh0LgorICAgICAgICAgICAgdGV4dC5hcHBlbmQoY2hpbGRGcmFtZXNBc1RleHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2FsbGJhY2sub2JqID0gdGV4dC50b1N0cmluZygpOwogICAgICAgICBjYWxsYmFjay5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKQEAgLTUyNCw2ICs1NTQsMTEgQEAKICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgZG9jdW1lbnRBc1RleHQoKTsKIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGV4dCBkcmF3biBvbiB0aGUgY2hpbGQgZnJhbWVzIGFzIGEgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIGNoaWxkRnJhbWVzQXNUZXh0KCk7CisKICAgICAvKgogICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBXZWJDb3JlIHRvIGluZm9ybSB0aGUgZnJhbWUgdGhhdAogICAgICAqIHRoZSBKYXZhc2NyaXB0IHdpbmRvdyBvYmplY3QgaGFzIGJlZW4gY2xlYXJlZC4KQEAgLTYxNyw2ICs2NTIsMTA0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IEpOSS4gR2V0cyB0aGUgYXBwbGljYXRpb25zIGRhdGEgZGlyZWN0b3J5CisgICAgICogQHJldHVybiBTdHJpbmcgVGhlIGFwcGxpY2F0aW9ucyBkYXRhIGRpcmVjdG9yeQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREYXRhRGlyZWN0b3J5KCkgeworICAgICAgICByZXR1cm4gc0RhdGFEaXJlY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IEpOSS4KKyAgICAgKiBSZWFkIGZyb20gYW4gSW5wdXRTdHJlYW0gaW50byBhIHN1cHBsaWVkIGJ5dGVbXQorICAgICAqIFRoaXMgbWV0aG9kIGNhdGNoZXMgYW55IGV4Y2VwdGlvbnMgc28gdGhleSBkb24ndCBjcmFzaCB0aGUgSlZNLgorICAgICAqIEBwYXJhbSBpbnB1dFN0cmVhbSBJbnB1dFN0cmVhbSB0byByZWFkIGZyb20uCisgICAgICogQHBhcmFtIG91dHB1dCBCeXRlYXJyYXkgdGhhdCBnZXRzIHRoZSBvdXRwdXQuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC1pIGlmIHRoZW4gZW5kIG9mIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHJlYWRGcm9tU3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBieXRlW10gb3V0cHV0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW0ucmVhZChvdXRwdXQpOworICAgICAgICB9IGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSWYgd2UgZ2V0IGFuIGV4Y2VwdGlvbiwgcmV0dXJuIGVuZCBvZiBzdHJlYW0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgSW5wdXRTdHJlYW0gZm9yIGFuIEFuZHJvaWQgcmVzb3VyY2UKKyAgICAgKiBUaGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IGtpbmRzIG9mIGFuZHJvaWQgcmVzb3VyY2VzOgorICAgICAqIC0gZmlsZTovLy9hbmRyb2lkX3JlcworICAgICAqIC0gZmlsZTovLy9hbmRyb2lkX2Fzc2V0CisgICAgICogLSBjb250ZW50Oi8vCisgICAgICogQHBhcmFtIHVybCBUaGUgdXJsIHRvIGxvYWQuCisgICAgICogQHJldHVybiBBbiBJbnB1dFN0cmVhbSB0byB0aGUgYW5kcm9pZCByZXNvdXJjZQorICAgICAqLworICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW1Gb3JBbmRyb2lkUmVzb3VyY2UoU3RyaW5nIHVybCwgaW50IHR5cGUpIHsKKyAgICAgICAgZmluYWwgaW50IFJFU09VUkNFID0gMTsKKyAgICAgICAgZmluYWwgaW50IEFTU0VUID0gMjsKKyAgICAgICAgZmluYWwgaW50IENPTlRFTlQgPSAzOworCisgICAgICAgIGlmICh0eXBlID09IFJFU09VUkNFKSB7CisgICAgICAgICAgICAvLyBmaWxlOi8vL2FuZHJvaWRfcmVzCisgICAgICAgICAgICBpZiAodXJsID09IG51bGwgfHwgdXJsLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJ1cmwgaGFzIGxlbmd0aCAwICIgKyB1cmwpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHNsYXNoID0gdXJsLmluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgIGludCBkb3QgPSB1cmwuaW5kZXhPZignLicsIHNsYXNoKTsKKyAgICAgICAgICAgIGlmIChzbGFzaCA9PSAtMSB8fCBkb3QgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJJbmNvcnJlY3QgcmVzIHBhdGg6ICIgKyB1cmwpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHN1YkNsYXNzTmFtZSA9IHVybC5zdWJzdHJpbmcoMCwgc2xhc2gpOworICAgICAgICAgICAgU3RyaW5nIGZpZWxkTmFtZSA9IHVybC5zdWJzdHJpbmcoc2xhc2ggKyAxLCBkb3QpOworICAgICAgICAgICAgU3RyaW5nIGVycm9yTXNnID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gZCA9IG1Db250ZXh0LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkgKyAiLlIkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3ViQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCA9IGQuZ2V0RmllbGQoZmllbGROYW1lKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaWQgPSBmaWVsZC5nZXRJbnQobnVsbCk7CisgICAgICAgICAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7CisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0VmFsdWUoaWQsIHZhbHVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUudHlwZSA9PSBUeXBlZFZhbHVlLlRZUEVfU1RSSU5HKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRBc3NldHMoKS5vcGVuTm9uQXNzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuYXNzZXRDb29raWUsIHZhbHVlLnN0cmluZy50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2V0TWFuYWdlci5BQ0NFU1NfU1RSRUFNSU5HKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBPbGQgc3RhY2sgb25seSBzdXBwb3J0cyBUWVBFX1NUUklORyBmb3IgcmVzIGZpbGVzCisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgIm5vdCBvZiB0eXBlIHN0cmluZzogIiArIHVybCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiRXhjZXB0aW9uOiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQVNTRVQpIHsKKyAgICAgICAgICAgIC8vIGZpbGU6Ly8vYW5kcm9pZF9hc3NldAorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBBc3NldE1hbmFnZXIgYXNzZXRzID0gbUNvbnRleHQuZ2V0QXNzZXRzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFzc2V0cy5vcGVuKHVybCwgQXNzZXRNYW5hZ2VyLkFDQ0VTU19TVFJFQU1JTkcpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQ09OVEVOVCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKHVybCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbSh1cmkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJFeGNlcHRpb246ICIgKyB1cmwpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTdGFydCBsb2FkaW5nIGEgcmVzb3VyY2UuCiAgICAgICogQHBhcmFtIGxvYWRlckhhbmRsZSBUaGUgbmF0aXZlIFJlc291cmNlTG9hZGVyIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGRhdGEuCkBAIC04NDIsNiArOTc1LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9VUExPQURfTEFCRUwgPSA0OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNFVF9MQUJFTCA9IDU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNVQk1JVF9MQUJFTCA9IDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTEVfVVBMT0FEX05PX0ZJTEVfQ0hPU0VOID0gNzsKIAogICAgIFN0cmluZyBnZXRSYXdSZXNGaWxlbmFtZShpbnQgaWQpIHsKICAgICAgICAgaW50IHJlc2lkOwpAQCAtODcxLDYgKzEwMDUsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuc3VibWl0KTsKIAorICAgICAgICAgICAgY2FzZSBGSUxFX1VQTE9BRF9OT19GSUxFX0NIT1NFTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcubm9fZmlsZV9jaG9zZW4pOworCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgImdldFJhd1Jlc0ZpbGVuYW1lIGdvdCBpbmNvbXBhdGlibGUgcmVzb3VyY2UgSUQiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gIiI7CkBAIC0xMDA2LDUgKzExNDQsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIEhhc2hNYXAgZ2V0Rm9ybVRleHREYXRhKCk7CiAKKyAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgbmF0aXZlU2F2ZVdlYkFyY2hpdmUoU3RyaW5nIGJhc2VuYW1lLCBib29sZWFuIGF1dG9uYW1lKTsKKwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlT3JpZW50YXRpb25DaGFuZ2VkKGludCBvcmllbnRhdGlvbik7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQ2FsbGJhY2tQcm94eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0NhbGxiYWNrUHJveHkuamF2YQppbmRleCBkNjVjMTA2Li4xYjU2NTFiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQ2FsbGJhY2tQcm94eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9DYWxsYmFja1Byb3h5LmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKIAoraW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwpAQCAtNDEsNiArNDIsNyBAQAogaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqCiAgKiBUaGlzIGNsYXNzIGlzIGEgcHJveHkgY2xhc3MgZm9yIGhhbmRsaW5nIFdlYkNvcmUgLT4gVUkgdGhyZWFkIG1lc3NhZ2luZy4gQWxsCkBAIC0xMTIsNiArMTE0LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUREX0hJU1RPUllfSVRFTSAgICAgICAgICAgICAgICAgICAgPSAxMzU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhJU1RPUllfSU5ERVhfQ0hBTkdFRCAgICAgICAgICAgICAgID0gMTM2OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVVRIX0NSRURFTlRJQUxTICAgICAgICAgICAgICAgICAgICA9IDEzNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUX0lOU1RBTExBQkxFX1dFQkFQUCAgICAgICAgICAgICAgPSAxMzg7CiAKICAgICAvLyBNZXNzYWdlIHRyaWdnZXJlZCBieSB0aGUgY2xpZW50IHRvIHJlc3VtZSBleGVjdXRpb24KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9USUZZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDA7CkBAIC01MDAsMTggKzUwMywzMiBAQAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbXNnLmdldERhdGEoKS5nZXRTdHJpbmcoInVybCIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1XZWJDaHJvbWVDbGllbnQub25Kc0FsZXJ0KG1XZWJWaWV3LCB1cmwsIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBkaXNwbGF5IHRoZSBhbGVydCBkaWFsb2cgaWYgdGhlIG1Db250ZXh0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eSBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobUNvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgISgoQWN0aXZpdHkpIG1Db250ZXh0KS5oYXNXaW5kb3dGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zZXRSZWFkeSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIobUNvbnRleHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUaXRsZShnZXRKc0RpYWxvZ1RpdGxlKHVybCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNZXNzYWdlKG1lc3NhZ2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQb3NpdGl2ZUJ1dHRvbihSLnN0cmluZy5vaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWxlcnREaWFsb2cuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWxvZ0ludGVyZmFjZSBkaWFsb2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoaWNoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuY29uZmlybSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENhbmNlbGFibGUoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRPbkNhbmNlbExpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DYW5jZWxMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DYW5jZWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhbG9nSW50ZXJmYWNlIGRpYWxvZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXMuc2V0UmVhZHkoKTsKQEAgLTUyNSw2ICs1NDIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJ1cmwiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtV2ViQ2hyb21lQ2xpZW50Lm9uSnNDb25maXJtKG1XZWJWaWV3LCB1cmwsIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBkaXNwbGF5IHRoZSBhbGVydCBkaWFsb2cgaWYgdGhlIG1Db250ZXh0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eSBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobUNvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgISgoQWN0aXZpdHkpIG1Db250ZXh0KS5oYXNXaW5kb3dGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zZXRSZWFkeSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIobUNvbnRleHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUaXRsZShnZXRKc0RpYWxvZ1RpdGxlKHVybCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNZXNzYWdlKG1lc3NhZ2UpCkBAIC01NjUsNiArNTkwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtc2cuZ2V0RGF0YSgpLmdldFN0cmluZygidXJsIik7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbVdlYkNocm9tZUNsaWVudC5vbkpzUHJvbXB0KG1XZWJWaWV3LCB1cmwsIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWwsIHJlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZGlzcGxheSB0aGUgYWxlcnQgZGlhbG9nIGlmIHRoZSBtQ29udGV4dCBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHkgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG1Db250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEoKEFjdGl2aXR5KSBtQ29udGV4dCkuaGFzV2luZG93Rm9jdXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc2V0UmVhZHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExheW91dEluZmxhdGVyIGZhY3RvcnkgPSBMYXlvdXRJbmZsYXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbShtQ29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBmYWN0b3J5LmluZmxhdGUoUi5sYXlvdXQuanNfcHJvbXB0LApAQCAtNjE2LDYgKzY0OSwxNCBAQAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbXNnLmdldERhdGEoKS5nZXRTdHJpbmcoInVybCIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1XZWJDaHJvbWVDbGllbnQub25Kc0JlZm9yZVVubG9hZChtV2ViVmlldywgdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHJlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZGlzcGxheSB0aGUgYWxlcnQgZGlhbG9nIGlmIHRoZSBtQ29udGV4dCBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHkgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG1Db250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEoKEFjdGl2aXR5KSBtQ29udGV4dCkuaGFzV2luZG93Rm9jdXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc2V0UmVhZHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtID0gbUNvbnRleHQuZ2V0U3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5qc19kaWFsb2dfYmVmb3JlX3VubG9hZCwgbWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihtQ29udGV4dCkKQEAgLTcyNSw3ICs3NjYsOCBAQAogCiAgICAgICAgICAgICBjYXNlIE9QRU5fRklMRV9DSE9PU0VSOgogICAgICAgICAgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVdlYkNocm9tZUNsaWVudC5vcGVuRmlsZUNob29zZXIoKFVwbG9hZEZpbGUpIG1zZy5vYmopOworICAgICAgICAgICAgICAgICAgICBVcGxvYWRGaWxlTWVzc2FnZURhdGEgZGF0YSA9IChVcGxvYWRGaWxlTWVzc2FnZURhdGEpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgbVdlYkNocm9tZUNsaWVudC5vcGVuRmlsZUNob29zZXIoZGF0YS5nZXRVcGxvYWRGaWxlKCksIGRhdGEuZ2V0QWNjZXB0VHlwZSgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTc1MCw2ICs3OTIsOSBAQAogICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNldEh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgKICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QsIHJlYWxtLCB1c2VybmFtZSwgcGFzc3dvcmQpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRVRfSU5TVEFMTEFCTEVfV0VCQVBQOgorICAgICAgICAgICAgICAgIG1XZWJDaHJvbWVDbGllbnQuc2V0SW5zdGFsbGFibGVXZWJBcHAoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTA4NywxMCArMTEzMiwxNSBAQAogICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKGludCBuZXdQcm9ncmVzcykgewogICAgICAgICAvLyBTeW5jaHJvbml6ZSBzbyB0aGF0IG1MYXRlc3RQcm9ncmVzcyBpcyB1cC10by1kYXRlLgogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ID09IG51bGwgfHwgbUxhdGVzdFByb2dyZXNzID09IG5ld1Byb2dyZXNzKSB7CisgICAgICAgICAgICAvLyB1cGRhdGUgbUxhdGVzdFByb2dyZXNzIGV2ZW4gbVdlYkNocm9tZUNsaWVudCBpcyBudWxsIGFzCisgICAgICAgICAgICAvLyBXZWJWaWV3LmdldFByb2dyZXNzKCkgbmVlZHMgaXQKKyAgICAgICAgICAgIGlmIChtTGF0ZXN0UHJvZ3Jlc3MgPT0gbmV3UHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtTGF0ZXN0UHJvZ3Jlc3MgPSBuZXdQcm9ncmVzczsKKyAgICAgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIW1Qcm9ncmVzc1VwZGF0ZVBlbmRpbmcpIHsKICAgICAgICAgICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKFBST0dSRVNTKTsKICAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NVcGRhdGVQZW5kaW5nID0gdHJ1ZTsKQEAgLTExNzIsOSArMTIyMiw3IEBACiAgICAgICAgIC8vIGZvciBudWxsLgogICAgICAgICBXZWJIaXN0b3J5SXRlbSBpID0gbUJhY2tGb3J3YXJkTGlzdC5nZXRDdXJyZW50SXRlbSgpOwogICAgICAgICBpZiAoaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocHJlY29tcG9zZWQgfHwgaS5nZXRUb3VjaEljb25VcmwoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaS5zZXRUb3VjaEljb25VcmwodXJsKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkuc2V0VG91Y2hJY29uVXJsKHVybCwgcHJlY29tcG9zZWQpOwogICAgICAgICB9CiAgICAgICAgIC8vIERvIGFuIHVuc3luY2hyb25pemVkIHF1aWNrIGNoZWNrIHRvIGF2b2lkIHBvc3RpbmcgaWYgbm8gY2FsbGJhY2sgaGFzCiAgICAgICAgIC8vIGJlZW4gc2V0LgpAQCAtMTQzMiw2ICsxNDgwLDI0IEBACiAgICAgICAgIHNlbmRNZXNzYWdlKG1zZyk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVXBsb2FkRmlsZU1lc3NhZ2VEYXRhIHsKKyAgICAgICAgcHJpdmF0ZSBVcGxvYWRGaWxlIG1DYWxsYmFjazsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUFjY2VwdFR5cGU7CisKKyAgICAgICAgcHVibGljIFVwbG9hZEZpbGVNZXNzYWdlRGF0YShVcGxvYWRGaWxlIHVwbG9hZEZpbGUsIFN0cmluZyBhY2NlcHRUeXBlKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSB1cGxvYWRGaWxlOworICAgICAgICAgICAgbUFjY2VwdFR5cGUgPSBhY2NlcHRUeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFVwbG9hZEZpbGUgZ2V0VXBsb2FkRmlsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FsbGJhY2s7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2VwdFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjY2VwdFR5cGU7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIGNsYXNzIFVwbG9hZEZpbGUgaW1wbGVtZW50cyBWYWx1ZUNhbGxiYWNrPFVyaT4gewogICAgICAgICBwcml2YXRlIFVyaSBtVmFsdWU7CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZVZhbHVlKFVyaSB2YWx1ZSkgewpAQCAtMTQ0OCwxMyArMTUxNCwxNCBAQAogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBXZWJWaWV3Q29yZSB0byBvcGVuIGEgZmlsZSBjaG9vc2VyLgogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gVXJpIG9wZW5GaWxlQ2hvb3NlcigpIHsKKyAgICAvKiBwYWNrYWdlICovIFVyaSBvcGVuRmlsZUNob29zZXIoU3RyaW5nIGFjY2VwdFR5cGUpIHsKICAgICAgICAgaWYgKG1XZWJDaHJvbWVDbGllbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICAgICAgTWVzc2FnZSBteU1lc3NhZ2UgPSBvYnRhaW5NZXNzYWdlKE9QRU5fRklMRV9DSE9PU0VSKTsKICAgICAgICAgVXBsb2FkRmlsZSB1cGxvYWRGaWxlID0gbmV3IFVwbG9hZEZpbGUoKTsKLSAgICAgICAgbXlNZXNzYWdlLm9iaiA9IHVwbG9hZEZpbGU7CisgICAgICAgIFVwbG9hZEZpbGVNZXNzYWdlRGF0YSBkYXRhID0gbmV3IFVwbG9hZEZpbGVNZXNzYWdlRGF0YSh1cGxvYWRGaWxlLCBhY2NlcHRUeXBlKTsKKyAgICAgICAgbXlNZXNzYWdlLm9iaiA9IGRhdGE7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgc2VuZE1lc3NhZ2UobXlNZXNzYWdlKTsKICAgICAgICAgICAgIHRyeSB7CkBAIC0xNDgzLDQgKzE1NTAsMTEgQEAKICAgICAgICAgTWVzc2FnZSBtc2cgPSBvYnRhaW5NZXNzYWdlKEhJU1RPUllfSU5ERVhfQ0hBTkdFRCwgaW5kZXgsIDAsIGl0ZW0pOwogICAgICAgICBzZW5kTWVzc2FnZShtc2cpOwogICAgIH0KKworICAgIHZvaWQgc2V0SW5zdGFsbGFibGVXZWJBcHAoKSB7CisgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKFNFVF9JTlNUQUxMQUJMRV9XRUJBUFApKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjMmY0MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHNpbXBseSBhIGNvbnRhaW5lciBmb3IgdGhlIG1ldGhvZHMgdXNlZCB0byBpbXBsZW1lbnQgRGV2aWNlT3JpZW50YXRpb24sCisgKiBpbmNsdWRpbmcgdGhlIG1vY2sgRGV2aWNlT3JpZW50YXRpb25DbGllbnQgZm9yIHVzZSBpbiBMYXlvdXRUZXN0cy4KKyAqCisgKiBUaGlzIGNvdWxkIGJlIHBhcnQgb2YgV2ViVmlld0NvcmUsIGJ1dCBoYXZlIG1vdmVkIGl0IHRvIGl0cyBvd24gY2xhc3MgdG8KKyAqIGF2b2lkIGJsb2F0IHRoZXJlLgorICogQGhpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERldmljZU9yaWVudGF0aW9uTWFuYWdlciB7CisgICAgcHJpdmF0ZSBXZWJWaWV3Q29yZSBtV2ViVmlld0NvcmU7CisgICAgcHJpdmF0ZSBEZXZpY2VPcmllbnRhdGlvblNlcnZpY2UgbVNlcnZpY2U7CisKKyAgICBwdWJsaWMgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyKFdlYlZpZXdDb3JlIHdlYlZpZXdDb3JlKSB7CisgICAgICAgIG1XZWJWaWV3Q29yZSA9IHdlYlZpZXdDb3JlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGUgUGFnZSBmb3IgdGhpcyBXZWJWaWV3Q29yZSBzaG91bGQgdXNlIGEgbW9jayBEZXZpY2VPcmllbnRhdGlvbgorICAgICAqIGNsaWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1c2VNb2NrKCkgeworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgbmF0aXZlVXNlTW9jayhtV2ViVmlld0NvcmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcG9zaXRpb24gZm9yIHRoZSBtb2NrIERldmljZU9yaWVudGF0aW9uIHNlcnZpY2UgZm9yIHRoaXMgV2ViVmlld0NvcmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9ja09yaWVudGF0aW9uKGJvb2xlYW4gY2FuUHJvdmlkZUFscGhhLCBkb3VibGUgYWxwaGEsIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsCisgICAgICAgICAgICBkb3VibGUgYmV0YSwgYm9vbGVhbiBjYW5Qcm92aWRlR2FtbWEsIGRvdWJsZSBnYW1tYSkgeworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgbmF0aXZlU2V0TW9ja09yaWVudGF0aW9uKG1XZWJWaWV3Q29yZSwgY2FuUHJvdmlkZUFscGhhLCBhbHBoYSwgY2FuUHJvdmlkZUJldGEsIGJldGEsCisgICAgICAgICAgICAgICAgY2FuUHJvdmlkZUdhbW1hLCBnYW1tYSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25PcmllbnRhdGlvbkNoYW5nZShEb3VibGUgYWxwaGEsIERvdWJsZSBiZXRhLCBEb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgbmF0aXZlT25PcmllbnRhdGlvbkNoYW5nZShtV2ViVmlld0NvcmUsCisgICAgICAgICAgICAgICAgYWxwaGEgIT0gbnVsbCwgYWxwaGEgIT0gbnVsbCA/IGFscGhhLmRvdWJsZVZhbHVlKCkgOiAwLjAsCisgICAgICAgICAgICAgICAgYmV0YSAhPSBudWxsLCBiZXRhICE9IG51bGwgPyBiZXRhLmRvdWJsZVZhbHVlKCkgOiAwLjAsCisgICAgICAgICAgICAgICAgZ2FtbWEgIT0gbnVsbCwgZ2FtbWEgIT0gbnVsbCA/IGdhbW1hLmRvdWJsZVZhbHVlKCkgOiAwLjApOworICAgIH0KKworICAgIC8vIE5hdGl2ZSBmdW5jdGlvbnMKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVVc2VNb2NrKFdlYlZpZXdDb3JlIHdlYlZpZXdDb3JlKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTZXRNb2NrT3JpZW50YXRpb24oV2ViVmlld0NvcmUgd2ViVmlld0NvcmUsCisgICAgICAgICAgICBib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLCBib29sZWFuIGNhblByb3ZpZGVCZXRhLCBkb3VibGUgYmV0YSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZU9uT3JpZW50YXRpb25DaGFuZ2UoV2ViVmlld0NvcmUgd2ViVmlld0NvcmUsCisgICAgICAgICAgICBib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLCBib29sZWFuIGNhblByb3ZpZGVCZXRhLCBkb3VibGUgYmV0YSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0RldmljZU9yaWVudGF0aW9uU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0RldmljZU9yaWVudGF0aW9uU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmZjg0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3I7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JFdmVudDsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckV2ZW50TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXI7CitpbXBvcnQgamF2YS5sYW5nLlJ1bm5hYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisKK2ZpbmFsIGNsYXNzIERldmljZU9yaWVudGF0aW9uU2VydmljZSBpbXBsZW1lbnRzIFNlbnNvckV2ZW50TGlzdGVuZXIgeworICAgIC8vIFRoZSBncmF2aXR5IHZlY3RvciBleHByZXNzZWQgaW4gdGhlIGJvZHkgZnJhbWUuCisgICAgcHJpdmF0ZSBmbG9hdFtdIG1HcmF2aXR5VmVjdG9yOworICAgIC8vIFRoZSBnZW9tYWduZXRpYyB2ZWN0b3IgZXhwcmVzc2VkIGluIHRoZSBib2R5IGZyYW1lLgorICAgIHByaXZhdGUgZmxvYXRbXSBtTWFnbmV0aWNGaWVsZFZlY3RvcjsKKworICAgIHByaXZhdGUgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyIG1NYW5hZ2VyOworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNSdW5uaW5nOworICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKKyAgICBwcml2YXRlIFNlbnNvck1hbmFnZXIgbVNlbnNvck1hbmFnZXI7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgRG91YmxlIG1BbHBoYTsKKyAgICBwcml2YXRlIERvdWJsZSBtQmV0YTsKKyAgICBwcml2YXRlIERvdWJsZSBtR2FtbWE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgREVMVEFfREVHUkVTUyA9IDEuMDsKKworICAgIHB1YmxpYyBEZXZpY2VPcmllbnRhdGlvblNlcnZpY2UoRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICBtTWFuYWdlciA9IG1hbmFnZXI7CisgICAgICAgIGFzc2VydChtTWFuYWdlciAhPSBudWxsKTsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBhc3NlcnQobUNvbnRleHQgIT0gbnVsbCk7CisgICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICBtSXNSdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgcmVnaXN0ZXJGb3JTZW5zb3JzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgbUlzUnVubmluZyA9IGZhbHNlOworICAgICAgICB1bnJlZ2lzdGVyRnJvbVNlbnNvcnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdXNwZW5kKCkgeworICAgICAgICBpZiAobUlzUnVubmluZykgeworICAgICAgICAgICAgdW5yZWdpc3RlckZyb21TZW5zb3JzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXN1bWUoKSB7CisgICAgICAgIGlmIChtSXNSdW5uaW5nKSB7CisgICAgICAgICAgICByZWdpc3RlckZvclNlbnNvcnMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kRXJyb3JFdmVudCgpIHsKKyAgICAgICAgYXNzZXJ0IFdlYlZpZXdDb3JlLlRIUkVBRF9OQU1FLmVxdWFscyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IFdlYlZpZXdDb3JlLlRIUkVBRF9OQU1FLmVxdWFscyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKG1Jc1J1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIub25PcmllbnRhdGlvbkNoYW5nZShudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckZvclNlbnNvcnMoKSB7CisgICAgICAgIGlmIChtSGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZWdpc3RlckZvckFjY2VsZXJvbWV0ZXJTZW5zb3IoKSB8fCAhcmVnaXN0ZXJGb3JNYWduZXRpY0ZpZWxkU2Vuc29yKCkpIHsKKyAgICAgICAgICAgIHVucmVnaXN0ZXJGcm9tU2Vuc29ycygpOworICAgICAgICAgICAgc2VuZEVycm9yRXZlbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRPcmllbnRhdGlvblVzaW5nR2V0Um90YXRpb25NYXRyaXgoKSB7CisgICAgICAgIGlmIChtR3Jhdml0eVZlY3RvciA9PSBudWxsIHx8IG1NYWduZXRpY0ZpZWxkVmVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldCB0aGUgcm90YXRpb24gbWF0cml4LgorICAgICAgICAvLyBUaGUgcm90YXRpb24gbWF0cml4IHRoYXQgdHJhbnNmb3JtcyBmcm9tIHRoZSBib2R5IGZyYW1lIHRvIHRoZSBlYXJ0aCBmcmFtZS4KKyAgICAgICAgZmxvYXRbXSBkZXZpY2VSb3RhdGlvbk1hdHJpeCA9IG5ldyBmbG9hdFs5XTsKKyAgICAgICAgaWYgKCFTZW5zb3JNYW5hZ2VyLmdldFJvdGF0aW9uTWF0cml4KAorICAgICAgICAgICAgICAgIGRldmljZVJvdGF0aW9uTWF0cml4LCBudWxsLCBtR3Jhdml0eVZlY3RvciwgbU1hZ25ldGljRmllbGRWZWN0b3IpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBDb252ZXJ0IHJvdGF0aW9uIG1hdHJpeCB0byByb3RhdGlvbiBhbmdsZXMuCisgICAgICAgIC8vIEFzc3VtaW5nIHRoYXQgdGhlIHJvdGF0aW9ucyBhcmUgYXBwaWVkIGluIHRoZSBvcmRlciBsaXN0ZWQgYXQKKyAgICAgICAgLy8gaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JFdmVudC5odG1sI3ZhbHVlcworICAgICAgICAvLyB0aGUgcm90YXRpb25zIGFyZSBhcHBsaWVkIGFib3V0IHRoZSBzYW1lIGF4ZXMgYW5kIGluIHRoZSBzYW1lIG9yZGVyIGFzIHJlcXVpcmVkIGJ5IHRoZQorICAgICAgICAvLyBBUEkuIFRoZSBvbmx5IGNvbnZlcnNpb25zIGFyZSBzaWduIGNoYW5nZXMgYXMgZm9sbG93cy4KKyAgICAgICAgLy8gVGhlIGFuZ2xlcyBhcmUgaW4gcmFkaWFucworICAgICAgICBmbG9hdFtdIHJvdGF0aW9uQW5nbGVzID0gbmV3IGZsb2F0WzNdOworICAgICAgICBTZW5zb3JNYW5hZ2VyLmdldE9yaWVudGF0aW9uKGRldmljZVJvdGF0aW9uTWF0cml4LCByb3RhdGlvbkFuZ2xlcyk7CisgICAgICAgIGRvdWJsZSBhbHBoYSA9IE1hdGgudG9EZWdyZWVzKC1yb3RhdGlvbkFuZ2xlc1swXSkgLSA5MC4wOworICAgICAgICB3aGlsZSAoYWxwaGEgPCAwLjApIHsgYWxwaGEgKz0gMzYwLjA7IH0gLy8gWzAsIDM2MCkKKyAgICAgICAgZG91YmxlIGJldGEgPSBNYXRoLnRvRGVncmVlcygtcm90YXRpb25BbmdsZXNbMV0pOworICAgICAgICB3aGlsZSAoYmV0YSA8IC0xODAuMCkgeyBiZXRhICs9IDM2MC4wOyB9IC8vIFstMTgwLCAxODApCisgICAgICAgIGRvdWJsZSBnYW1tYSA9IE1hdGgudG9EZWdyZWVzKHJvdGF0aW9uQW5nbGVzWzJdKTsKKyAgICAgICAgd2hpbGUgKGdhbW1hIDwgLTkwLjApIHsgZ2FtbWEgKz0gMzYwLjA7IH0gLy8gWy05MCwgOTApCisKKyAgICAgICAgbWF5YmVTZW5kQ2hhbmdlKGFscGhhLCBiZXRhLCBnYW1tYSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZW5zb3JNYW5hZ2VyIGdldFNlbnNvck1hbmFnZXIoKSB7CisgICAgICAgIGFzc2VydCBXZWJWaWV3Q29yZS5USFJFQURfTkFNRS5lcXVhbHMoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICBpZiAobVNlbnNvck1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbnNvck1hbmFnZXIgPSAoU2Vuc29yTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlNFTlNPUl9TRVJWSUNFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVNlbnNvck1hbmFnZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHJlZ2lzdGVyRm9yQWNjZWxlcm9tZXRlclNlbnNvcigpIHsKKyAgICAgICAgTGlzdDxTZW5zb3I+IHNlbnNvcnMgPSBnZXRTZW5zb3JNYW5hZ2VyKCkuZ2V0U2Vuc29yTGlzdChTZW5zb3IuVFlQRV9BQ0NFTEVST01FVEVSKTsKKyAgICAgICAgaWYgKHNlbnNvcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgaGFuZGxpbmcgbXVsdGlwbGUgc2Vuc29ycy4KKyAgICAgICAgcmV0dXJuIGdldFNlbnNvck1hbmFnZXIoKS5yZWdpc3Rlckxpc3RlbmVyKAorICAgICAgICAgICAgICAgIHRoaXMsIHNlbnNvcnMuZ2V0KDApLCBTZW5zb3JNYW5hZ2VyLlNFTlNPUl9ERUxBWV9GQVNURVNULCBtSGFuZGxlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHJlZ2lzdGVyRm9yTWFnbmV0aWNGaWVsZFNlbnNvcigpIHsKKyAgICAgICAgTGlzdDxTZW5zb3I+IHNlbnNvcnMgPSBnZXRTZW5zb3JNYW5hZ2VyKCkuZ2V0U2Vuc29yTGlzdChTZW5zb3IuVFlQRV9NQUdORVRJQ19GSUVMRCk7CisgICAgICAgIGlmIChzZW5zb3JzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IENvbnNpZGVyIGhhbmRsaW5nIG11bHRpcGxlIHNlbnNvcnMuCisgICAgICAgIHJldHVybiBnZXRTZW5zb3JNYW5hZ2VyKCkucmVnaXN0ZXJMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICB0aGlzLCBzZW5zb3JzLmdldCgwKSwgU2Vuc29yTWFuYWdlci5TRU5TT1JfREVMQVlfRkFTVEVTVCwgbUhhbmRsZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyRnJvbVNlbnNvcnMoKSB7CisgICAgICAgIGdldFNlbnNvck1hbmFnZXIoKS51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1heWJlU2VuZENoYW5nZShkb3VibGUgYWxwaGEsIGRvdWJsZSBiZXRhLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgYXNzZXJ0IFdlYlZpZXdDb3JlLlRIUkVBRF9OQU1FLmVxdWFscyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgIGlmIChtQWxwaGEgPT0gbnVsbCB8fCBtQmV0YSA9PSBudWxsIHx8IG1HYW1tYSA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgTWF0aC5hYnMoYWxwaGEgLSBtQWxwaGEpID4gREVMVEFfREVHUkVTUworICAgICAgICAgICAgICAgIHx8IE1hdGguYWJzKGJldGEgLSBtQmV0YSkgPiBERUxUQV9ERUdSRVNTCisgICAgICAgICAgICAgICAgfHwgTWF0aC5hYnMoZ2FtbWEgLSBtR2FtbWEpID4gREVMVEFfREVHUkVTUykgeworICAgICAgICAgICAgbUFscGhhID0gYWxwaGE7CisgICAgICAgICAgICBtQmV0YSA9IGJldGE7CisgICAgICAgICAgICBtR2FtbWEgPSBnYW1tYTsKKyAgICAgICAgICAgIG1NYW5hZ2VyLm9uT3JpZW50YXRpb25DaGFuZ2UobUFscGhhLCBtQmV0YSwgbUdhbW1hKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbnNvckV2ZW50TGlzdGVuZXIgaW1wbGVtZW50YXRpb24uCisgICAgICogQ2FsbGJhY2tzIGhhcHBlbiBvbiB0aGUgdGhyZWFkIG9uIHdoaWNoIHdlIHJlZ2lzdGVyZWQgLSB0aGUgV2ViQ29yZSB0aHJlYWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TZW5zb3JDaGFuZ2VkKFNlbnNvckV2ZW50IGV2ZW50KSB7CisgICAgICAgIGFzc2VydChldmVudC52YWx1ZXMubGVuZ3RoID09IDMpOworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKworICAgICAgICBpZiAoIW1Jc1J1bm5pbmcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoZXZlbnQuc2Vuc29yLmdldFR5cGUoKSkgeworICAgICAgICAgIGNhc2UgU2Vuc29yLlRZUEVfQUNDRUxFUk9NRVRFUjoKKyAgICAgICAgICAgIGlmIChtR3Jhdml0eVZlY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUdyYXZpdHlWZWN0b3IgPSBuZXcgZmxvYXRbM107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtR3Jhdml0eVZlY3RvclswXSA9IGV2ZW50LnZhbHVlc1swXTsKKyAgICAgICAgICAgIG1HcmF2aXR5VmVjdG9yWzFdID0gZXZlbnQudmFsdWVzWzFdOworICAgICAgICAgICAgbUdyYXZpdHlWZWN0b3JbMl0gPSBldmVudC52YWx1ZXNbMl07CisgICAgICAgICAgICBnZXRPcmllbnRhdGlvblVzaW5nR2V0Um90YXRpb25NYXRyaXgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgU2Vuc29yLlRZUEVfTUFHTkVUSUNfRklFTEQ6CisgICAgICAgICAgICBpZiAobU1hZ25ldGljRmllbGRWZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1NYWduZXRpY0ZpZWxkVmVjdG9yID0gbmV3IGZsb2F0WzNdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1hZ25ldGljRmllbGRWZWN0b3JbMF0gPSBldmVudC52YWx1ZXNbMF07CisgICAgICAgICAgICBtTWFnbmV0aWNGaWVsZFZlY3RvclsxXSA9IGV2ZW50LnZhbHVlc1sxXTsKKyAgICAgICAgICAgIG1NYWduZXRpY0ZpZWxkVmVjdG9yWzJdID0gZXZlbnQudmFsdWVzWzJdOworICAgICAgICAgICAgZ2V0T3JpZW50YXRpb25Vc2luZ0dldFJvdGF0aW9uTWF0cml4KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQWNjdXJhY3lDaGFuZ2VkKFNlbnNvciBzZW5zb3IsIGludCBhY2N1cmFjeSkgeworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvR2VvbG9jYXRpb25TZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvR2VvbG9jYXRpb25TZXJ2aWNlLmphdmEKaW5kZXggMjQzMDZmNC4uOTFkZTFkOCAxMDA3NTUKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0dlb2xvY2F0aW9uU2VydmljZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9HZW9sb2NhdGlvblNlcnZpY2UuamF2YQpAQCAtNDUsMTQgKzQ1LDEzIEBACiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGZyb20gd2hpY2ggd2Ugb2J0YWluIHRoZSBzeXN0ZW0gc2VydmljZS4KICAgICAgKiBAcGFyYW0gbmF0aXZlT2JqZWN0IFRoZSBuYXRpdmUgb2JqZWN0IHRvIHdoaWNoIHRoaXMgb2JqZWN0IHdpbGwgcmVwb3J0IHBvc2l0aW9uIHVwZGF0ZXMgYW5kCiAgICAgICogICAgIGVycm9ycy4KICAgICAgKi8KLSAgICBwdWJsaWMgR2VvbG9jYXRpb25TZXJ2aWNlKGxvbmcgbmF0aXZlT2JqZWN0KSB7CisgICAgcHVibGljIEdlb2xvY2F0aW9uU2VydmljZShDb250ZXh0IGNvbnRleHQsIGxvbmcgbmF0aXZlT2JqZWN0KSB7CiAgICAgICAgIG1OYXRpdmVPYmplY3QgPSBuYXRpdmVPYmplY3Q7CiAgICAgICAgIC8vIFJlZ2lzdGVyIG5ld0xvY2F0aW9uQXZhaWxhYmxlIHdpdGggcGxhdGZvcm0gc2VydmljZS4KLSAgICAgICAgQWN0aXZpdHlUaHJlYWQgdGhyZWFkID0gQWN0aXZpdHlUaHJlYWQuc3lzdGVtTWFpbigpOwotICAgICAgICBDb250ZXh0IGNvbnRleHQgPSB0aHJlYWQuZ2V0QXBwbGljYXRpb24oKTsKICAgICAgICAgbUxvY2F0aW9uTWFuYWdlciA9IChMb2NhdGlvbk1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxPQ0FUSU9OX1NFUlZJQ0UpOwogICAgICAgICBpZiAobUxvY2F0aW9uTWFuYWdlciA9PSBudWxsKSB7CiAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgZ2V0IGxvY2F0aW9uIG1hbmFnZXIuIik7CkBAIC02Miw5ICs2MSwxMCBAQAogICAgIC8qKgogICAgICAqIFN0YXJ0IGxpc3RlbmluZyBmb3IgbG9jYXRpb24gdXBkYXRlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdGFydCgpIHsKICAgICAgICAgcmVnaXN0ZXJGb3JMb2NhdGlvblVwZGF0ZXMoKTsKICAgICAgICAgbUlzUnVubmluZyA9IHRydWU7CisgICAgICAgIHJldHVybiBtSXNOZXR3b3JrUHJvdmlkZXJBdmFpbGFibGUgfHwgbUlzR3BzUHJvdmlkZXJBdmFpbGFibGU7CiAgICAgfQogCiAgICAgLyoqCkBAIC04Nyw2ICs4Nyw4IEBACiAgICAgICAgICAgICAgICAgLy8gb25seSB1bnJlZ2lzdGVyIGZyb20gYWxsLCB0aGVuIHJlcmVnaXN0ZXIgd2l0aCBhbGwgYnV0IHRoZSBHUFMuCiAgICAgICAgICAgICAgICAgdW5yZWdpc3RlckZyb21Mb2NhdGlvblVwZGF0ZXMoKTsKICAgICAgICAgICAgICAgICByZWdpc3RlckZvckxvY2F0aW9uVXBkYXRlcygpOworICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHByb3ZpZGVycyBhcmUgc3RpbGwgYXZhaWxhYmxlIGFmdGVyIHdlIHJlLXJlZ2lzdGVyLgorICAgICAgICAgICAgICAgIG1heWJlUmVwb3J0RXJyb3IoIlRoZSBsYXN0IGxvY2F0aW9uIHByb3ZpZGVyIGlzIG5vIGxvbmdlciBhdmFpbGFibGUiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE1NiwxMSArMTU4LDE2IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRm9yTG9jYXRpb25VcGRhdGVzKCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgbUxvY2F0aW9uTWFuYWdlci5yZXF1ZXN0TG9jYXRpb25VcGRhdGVzKExvY2F0aW9uTWFuYWdlci5ORVRXT1JLX1BST1ZJREVSLCAwLCAwLCB0aGlzKTsKLSAgICAgICAgICAgIG1Jc05ldHdvcmtQcm92aWRlckF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICAvLyBSZWdpc3RyYXRpb24gbWF5IGZhaWwgaWYgcHJvdmlkZXJzIGFyZSBub3QgcHJlc2VudCBvbiB0aGUgZGV2aWNlLgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlcXVlc3RMb2NhdGlvblVwZGF0ZXMoTG9jYXRpb25NYW5hZ2VyLk5FVFdPUktfUFJPVklERVIsIDAsIDAsIHRoaXMpOworICAgICAgICAgICAgICAgIG1Jc05ldHdvcmtQcm92aWRlckF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7IH0KICAgICAgICAgICAgIGlmIChtSXNHcHNFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgbUxvY2F0aW9uTWFuYWdlci5yZXF1ZXN0TG9jYXRpb25VcGRhdGVzKExvY2F0aW9uTWFuYWdlci5HUFNfUFJPVklERVIsIDAsIDAsIHRoaXMpOwotICAgICAgICAgICAgICAgIG1Jc0dwc1Byb3ZpZGVyQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlcXVlc3RMb2NhdGlvblVwZGF0ZXMoTG9jYXRpb25NYW5hZ2VyLkdQU19QUk9WSURFUiwgMCwgMCwgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIG1Jc0dwc1Byb3ZpZGVyQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7IH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBMb2cuZShUQUcsICJDYXVnaHQgc2VjdXJpdHkgZXhjZXB0aW9uIHJlZ2lzdGVyaW5nIGZvciBsb2NhdGlvbiB1cGRhdGVzIGZyb20gc3lzdGVtLiAiICsKQEAgLTE3Myw2ICsxODAsOCBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyRnJvbUxvY2F0aW9uVXBkYXRlcygpIHsKICAgICAgICAgbUxvY2F0aW9uTWFuYWdlci5yZW1vdmVVcGRhdGVzKHRoaXMpOworICAgICAgICBtSXNOZXR3b3JrUHJvdmlkZXJBdmFpbGFibGUgPSBmYWxzZTsKKyAgICAgICAgbUlzR3BzUHJvdmlkZXJBdmFpbGFibGUgPSBmYWxzZTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNUF1ZGlvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSFRNTDVBdWRpby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOTI4ODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSFRNTDVBdWRpby5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllci5PbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIuT25Db21wbGV0aW9uTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllci5PbkVycm9yTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllci5PblByZXBhcmVkTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllci5PblNlZWtDb21wbGV0ZUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CisKKy8qKgorICogPHA+SFRNTDUgc3VwcG9ydCBjbGFzcyBmb3IgQXVkaW8uCisgKi8KK2NsYXNzIEhUTUw1QXVkaW8gZXh0ZW5kcyBIYW5kbGVyCisgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgTWVkaWFQbGF5ZXIuT25CdWZmZXJpbmdVcGRhdGVMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllci5PbkNvbXBsZXRpb25MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllci5PbkVycm9yTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIuT25QcmVwYXJlZExpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyLk9uU2Vla0NvbXBsZXRlTGlzdGVuZXIgeworICAgIC8vIExvZ2dpbmcgdGFnLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dUQUcgPSAiSFRNTDVBdWRpbyI7CisKKyAgICBwcml2YXRlIE1lZGlhUGxheWVyIG1NZWRpYVBsYXllcjsKKworICAgIC8vIFRoZSBDKysgTWVkaWFQbGF5ZXJQcml2YXRlQW5kcm9pZCBvYmplY3QuCisgICAgcHJpdmF0ZSBpbnQgbU5hdGl2ZVBvaW50ZXI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgSURMRSAgICAgICAgPSAgMDsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgSU5JVElBTElaRUQgPSAgMTsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgUFJFUEFSRUQgICAgPSAgMjsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgU1RBUlRFRCAgICAgPSAgNDsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgQ09NUExFVEUgICAgPSAgNTsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgUEFVU0VEICAgICAgPSAgNjsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgU1RPUFBFRCAgICAgPSAtMjsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgRVJST1IgICAgICAgPSAtMTsKKworICAgIHByaXZhdGUgaW50IG1TdGF0ZSA9IElETEU7CisKKyAgICBwcml2YXRlIFN0cmluZyBtVXJsOworICAgIHByaXZhdGUgYm9vbGVhbiBtQXNrVG9QbGF5ID0gZmFsc2U7CisKKyAgICAvLyBUaW1lciB0aHJlYWQgLT4gVUkgdGhyZWFkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVVUERBVEUgPSAxMDA7CisKKyAgICAvLyBUaGUgc3BlYyBzYXlzIHRoZSB0aW1lciBzaG91bGQgZmlyZSBldmVyeSAyNTAgbXMgb3IgbGVzcy4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRVVQREFURV9QRVJJT0QgPSAyNTA7ICAvLyBtcworICAgIC8vIFRoZSB0aW1lciBmb3IgdGltZXVwYXRlIGV2ZW50cy4KKyAgICAvLyBTZWUgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jZXZlbnQtbWVkaWEtdGltZXVwZGF0ZQorICAgIHByaXZhdGUgVGltZXIgbVRpbWVyOworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgVGltZXVwZGF0ZVRhc2sgZXh0ZW5kcyBUaW1lclRhc2sgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBIVE1MNUF1ZGlvLnRoaXMub2J0YWluTWVzc2FnZShUSU1FVVBEQVRFKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgY2FzZSBUSU1FVVBEQVRFOiB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBFUlJPUiAmJiBtTWVkaWFQbGF5ZXIuaXNQbGF5aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IG1NZWRpYVBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZU9uVGltZXVwZGF0ZShwb3NpdGlvbiwgbU5hdGl2ZVBvaW50ZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gZXZlbnQgbGlzdGVuZXJzIGZvciBNZWRpYVBsYXllcgorICAgIC8vIFRob3NlIGFyZSBjYWxsZWQgZnJvbSB0aGUgc2FtZSB0aHJlYWQgd2UgY3JlYXRlZCB0aGUgTWVkaWFQbGF5ZXIKKyAgICAvLyAoaS5lLiB0aGUgd2Vidmlld2NvcmUgdGhyZWFkIGhlcmUpCisKKyAgICAvLyBNZWRpYVBsYXllci5PbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyCisgICAgcHVibGljIHZvaWQgb25CdWZmZXJpbmdVcGRhdGUoTWVkaWFQbGF5ZXIgbXAsIGludCBwZXJjZW50KSB7CisgICAgICAgIG5hdGl2ZU9uQnVmZmVyaW5nKHBlcmNlbnQsIG1OYXRpdmVQb2ludGVyKTsKKyAgICB9CisKKyAgICAvLyBNZWRpYVBsYXllci5PbkNvbXBsZXRpb25MaXN0ZW5lcjsKKyAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRpb24oTWVkaWFQbGF5ZXIgbXApIHsKKyAgICAgICAgcmVzZXRNZWRpYVBsYXllcigpOworICAgICAgICBtU3RhdGUgPSBJRExFOworICAgICAgICBuYXRpdmVPbkVuZGVkKG1OYXRpdmVQb2ludGVyKTsKKyAgICB9CisKKyAgICAvLyBNZWRpYVBsYXllci5PbkVycm9yTGlzdGVuZXIKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkVycm9yKE1lZGlhUGxheWVyIG1wLCBpbnQgd2hhdCwgaW50IGV4dHJhKSB7CisgICAgICAgIG1TdGF0ZSA9IEVSUk9SOworICAgICAgICByZXNldE1lZGlhUGxheWVyKCk7CisgICAgICAgIG1TdGF0ZSA9IElETEU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBNZWRpYVBsYXllci5PblByZXBhcmVkTGlzdGVuZXIKKyAgICBwdWJsaWMgdm9pZCBvblByZXBhcmVkKE1lZGlhUGxheWVyIG1wKSB7CisgICAgICAgIG1TdGF0ZSA9IFBSRVBBUkVEOworICAgICAgICBpZiAobVRpbWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaW1lci5zY2hlZHVsZShuZXcgVGltZXVwZGF0ZVRhc2soKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FVVBEQVRFX1BFUklPRCwgVElNRVVQREFURV9QRVJJT0QpOworICAgICAgICB9CisgICAgICAgIG5hdGl2ZU9uUHJlcGFyZWQobXAuZ2V0RHVyYXRpb24oKSwgMCwgMCwgbU5hdGl2ZVBvaW50ZXIpOworICAgICAgICBpZiAobUFza1RvUGxheSkgeworICAgICAgICAgICAgbUFza1RvUGxheSA9IGZhbHNlOworICAgICAgICAgICAgcGxheSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTWVkaWFQbGF5ZXIuT25TZWVrQ29tcGxldGVMaXN0ZW5lcgorICAgIHB1YmxpYyB2b2lkIG9uU2Vla0NvbXBsZXRlKE1lZGlhUGxheWVyIG1wKSB7CisgICAgICAgIG5hdGl2ZU9uVGltZXVwZGF0ZShtcC5nZXRDdXJyZW50UG9zaXRpb24oKSwgbU5hdGl2ZVBvaW50ZXIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQHBhcmFtIG5hdGl2ZVB0ciBpcyB0aGUgQysrIHBvaW50ZXIgdG8gdGhlIE1lZGlhUGxheWVyUHJpdmF0ZSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIEhUTUw1QXVkaW8oaW50IG5hdGl2ZVB0cikgeworICAgICAgICAvLyBTYXZlIHRoZSBuYXRpdmUgcHRyCisgICAgICAgIG1OYXRpdmVQb2ludGVyID0gbmF0aXZlUHRyOworICAgICAgICByZXNldE1lZGlhUGxheWVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0TWVkaWFQbGF5ZXIoKSB7CisgICAgICAgIGlmIChtTWVkaWFQbGF5ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbU1lZGlhUGxheWVyID0gbmV3IE1lZGlhUGxheWVyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIucmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0T25CdWZmZXJpbmdVcGRhdGVMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uQ29tcGxldGlvbkxpc3RlbmVyKHRoaXMpOworICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0T25FcnJvckxpc3RlbmVyKHRoaXMpOworICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0T25QcmVwYXJlZExpc3RlbmVyKHRoaXMpOworICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0T25TZWVrQ29tcGxldGVMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICBpZiAobVRpbWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaW1lci5jYW5jZWwoKTsKKyAgICAgICAgfQorICAgICAgICBtVGltZXIgPSBuZXcgVGltZXIoKTsKKyAgICAgICAgbVN0YXRlID0gSURMRTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0RGF0YVNvdXJjZShTdHJpbmcgdXJsKSB7CisgICAgICAgIG1VcmwgPSB1cmw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobVN0YXRlICE9IElETEUpIHsKKyAgICAgICAgICAgICAgICByZXNldE1lZGlhUGxheWVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0RGF0YVNvdXJjZSh1cmwpOworICAgICAgICAgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIucHJlcGFyZUFzeW5jKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR1RBRywgImNvdWxkbid0IGxvYWQgdGhlIHJlc291cmNlOiAiICsgdXJsICsgIiBleGM6ICIgKyBlKTsKKyAgICAgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwbGF5KCkgeworICAgICAgICBpZiAoKG1TdGF0ZSA9PSBFUlJPUiB8fCBtU3RhdGUgPT0gSURMRSkgJiYgbVVybCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNldE1lZGlhUGxheWVyKCk7CisgICAgICAgICAgICBzZXREYXRhU291cmNlKG1VcmwpOworICAgICAgICAgICAgbUFza1RvUGxheSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVN0YXRlID49IFBSRVBBUkVEKSB7CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVJURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGF1c2UoKSB7CisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBUlRFRCkgeworICAgICAgICAgICAgaWYgKG1UaW1lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRpbWVyLnB1cmdlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIucGF1c2UoKTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFBBVVNFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZWVrKGludCBtc2VjKSB7CisgICAgICAgIGlmIChtU3RhdGUgPj0gUFJFUEFSRUQpIHsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZWVrVG8obXNlYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVhcmRvd24oKSB7CisgICAgICAgIG1NZWRpYVBsYXllci5yZWxlYXNlKCk7CisgICAgICAgIG1TdGF0ZSA9IEVSUk9SOworICAgICAgICBtTmF0aXZlUG9pbnRlciA9IDA7CisgICAgfQorCisgICAgcHJpdmF0ZSBmbG9hdCBnZXRNYXhUaW1lU2Vla2FibGUoKSB7CisgICAgICAgIHJldHVybiBtTWVkaWFQbGF5ZXIuZ2V0RHVyYXRpb24oKSAvIDEwMDAuMGY7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVPbkJ1ZmZlcmluZyhpbnQgcGVyY2VudCwgaW50IG5hdGl2ZVBvaW50ZXIpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlT25FbmRlZChpbnQgbmF0aXZlUG9pbnRlcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVPblByZXBhcmVkKGludCBkdXJhdGlvbiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbmF0aXZlUG9pbnRlcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVPblRpbWV1cGRhdGUoaW50IHBvc2l0aW9uLCBpbnQgbmF0aXZlUG9pbnRlcik7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSldlYkNvcmVKYXZhQnJpZGdlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSldlYkNvcmVKYXZhQnJpZGdlLmphdmEKaW5kZXggZTc2NjY5My4uOTA4NTI2ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0pXZWJDb3JlSmF2YUJyaWRnZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9KV2ViQ29yZUphdmFCcmlkZ2UuamF2YQpAQCAtMTYsMTAgKzE2LDEzIEBACiAKIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGZpbmFsIGNsYXNzIEpXZWJDb3JlSmF2YUJyaWRnZSBleHRlbmRzIEhhbmRsZXIgewpAQCAtNDQsMTcgKzQ3LDIxIEBACiAKICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBtYWluIFdlYlZpZXcgYXR0YWNoZWQgdG8gdGhlIGN1cnJlbnQgd2luZG93IHNvIHRoYXQgd2UKICAgICAvLyBjYW4gZ2V0IHRoZSBwcm9wZXIgQ29udGV4dC4KLSAgICBwcml2YXRlIFdlYlZpZXcgbUN1cnJlbnRNYWluV2ViVmlldzsKKyAgICBwcml2YXRlIHN0YXRpYyBXZWFrUmVmZXJlbmNlPFdlYlZpZXc+IHNDdXJyZW50TWFpbldlYlZpZXcgPQorICAgICAgICAgICAgbmV3IFdlYWtSZWZlcmVuY2U8V2ViVmlldz4obnVsbCk7CiAKICAgICAvKiBwYWNrYWdlICovCiAgICAgc3RhdGljIGZpbmFsIGludCBSRUZSRVNIX1BMVUdJTlMgPSAxMDA7CiAKKyAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1Db250ZW50VXJpVG9GaWxlUGF0aE1hcDsKKwogICAgIC8qKgogICAgICAqIENvbnN0cnVjdCBhIG5ldyBKV2ViQ29yZUphdmFCcmlkZ2UgdG8gaW50ZXJmYWNlIHdpdGgKICAgICAgKiBXZWJDb3JlIHRpbWVycyBhbmQgY29va2llcy4KICAgICAgKi8KICAgICBwdWJsaWMgSldlYkNvcmVKYXZhQnJpZGdlKCkgewogICAgICAgICBuYXRpdmVDb25zdHJ1Y3RvcigpOworCiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC02MiwyMCArNjksMjAgQEAKICAgICAgICAgbmF0aXZlRmluYWxpemUoKTsKICAgICB9CiAKLSAgICBzeW5jaHJvbml6ZWQgdm9pZCBzZXRBY3RpdmVXZWJWaWV3KFdlYlZpZXcgd2VidmlldykgewotICAgICAgICBpZiAobUN1cnJlbnRNYWluV2ViVmlldyAhPSBudWxsKSB7CisgICAgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNldEFjdGl2ZVdlYlZpZXcoV2ViVmlldyB3ZWJ2aWV3KSB7CisgICAgICAgIGlmIChzQ3VycmVudE1haW5XZWJWaWV3LmdldCgpICE9IG51bGwpIHsKICAgICAgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIGlmIHRoZXJlIGlzIGEgc3ViLVdlYlZpZXcuIERvIG5vdGhpbmcuCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRNYWluV2ViVmlldyA9IHdlYnZpZXc7CisgICAgICAgIHNDdXJyZW50TWFpbldlYlZpZXcgPSBuZXcgV2Vha1JlZmVyZW5jZTxXZWJWaWV3Pih3ZWJ2aWV3KTsKICAgICB9CiAKLSAgICBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVBY3RpdmVXZWJWaWV3KFdlYlZpZXcgd2VidmlldykgewotICAgICAgICBpZiAobUN1cnJlbnRNYWluV2ViVmlldyAhPSB3ZWJ2aWV3KSB7CisgICAgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUFjdGl2ZVdlYlZpZXcoV2ViVmlldyB3ZWJ2aWV3KSB7CisgICAgICAgIGlmIChzQ3VycmVudE1haW5XZWJWaWV3LmdldCgpICE9IHdlYnZpZXcpIHsKICAgICAgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIGlmIHRoZXJlIGlzIGEgc3ViLVdlYlZpZXcuIERvIG5vdGhpbmcuCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRNYWluV2ViVmlldyA9IG51bGw7CisgICAgICAgIHNDdXJyZW50TWFpbldlYlZpZXcuY2xlYXIoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI1NiwxNyArMjYzLDQwIEBACiAKICAgICBzeW5jaHJvbml6ZWQgcHJpdmF0ZSBTdHJpbmcgZ2V0U2lnbmVkUHVibGljS2V5KGludCBpbmRleCwgU3RyaW5nIGNoYWxsZW5nZSwKICAgICAgICAgICAgIFN0cmluZyB1cmwpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50TWFpbldlYlZpZXcgIT0gbnVsbCkgeworICAgICAgICBXZWJWaWV3IGN1cnJlbnQgPSBzQ3VycmVudE1haW5XZWJWaWV3LmdldCgpOworICAgICAgICBpZiAoY3VycmVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyBnZW5lcmF0ZUtleVBhaXIgZXhwZWN0cyBvcmdhbml6YXRpb25zIHdoaWNoIHdlIGRvbid0IGhhdmUuIElnbm9yZQogICAgICAgICAgICAgLy8gdXJsLgogICAgICAgICAgICAgcmV0dXJuIENlcnRUb29sLmdldFNpZ25lZFB1YmxpY0tleSgKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRNYWluV2ViVmlldy5nZXRDb250ZXh0KCksIGluZGV4LCBjaGFsbGVuZ2UpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmdldENvbnRleHQoKSwgaW5kZXgsIGNoYWxsZW5nZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJUaGVyZSBpcyBubyBhY3RpdmUgV2ViVmlldyBmb3IgZ2V0U2lnbmVkUHVibGljS2V5Iik7CiAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBDYWxsZWQgb24gdGhlIFdlYkNvcmUgdGhyZWFkIHRocm91Z2ggSk5JLgorICAgIHByaXZhdGUgU3RyaW5nIHJlc29sdmVGaWxlUGF0aEZvckNvbnRlbnRVcmkoU3RyaW5nIHVyaSkgeworICAgICAgICBpZiAobUNvbnRlbnRVcmlUb0ZpbGVQYXRoTWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IG1Db250ZW50VXJpVG9GaWxlUGF0aE1hcC5nZXQodXJpKTsKKyAgICAgICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRmFpbHNhZmUgZmFsbGJhY2sgdG8ganVzdCB1c2UgdGhlIGxhc3QgcGF0aCBzZWdtZW50LgorICAgICAgICAvLyAoU2VlIE9wZW5hYmxlQ29sdW1ucyBkb2N1bWVudGF0aW9uIGluIHRoZSBTREspCisgICAgICAgIFVyaSBqVXJpID0gVXJpLnBhcnNlKHVyaSk7CisgICAgICAgIHJldHVybiBqVXJpLmdldExhc3RQYXRoU2VnbWVudCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlRmlsZVBhdGhGb3JDb250ZW50VXJpKFN0cmluZyBwYXRoLCBTdHJpbmcgY29udGVudFVyaSkgeworICAgICAgICBpZiAobUNvbnRlbnRVcmlUb0ZpbGVQYXRoTWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Db250ZW50VXJpVG9GaWxlUGF0aE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICB9CisgICAgICAgIG1Db250ZW50VXJpVG9GaWxlUGF0aE1hcC5wdXQoY29udGVudFVyaSwgcGF0aCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVDb25zdHJ1Y3RvcigpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlRmluYWxpemUoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIHNoYXJlZFRpbWVyRmlyZWQoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Mb2FkTGlzdGVuZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Mb2FkTGlzdGVuZXIuamF2YQppbmRleCBlNmZhNDA1Li41YjI1NmYyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTG9hZExpc3RlbmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0xvYWRMaXN0ZW5lci5qYXZhCkBAIC0xMTAsNiArMTEwLDcgQEAKICAgICBwcml2YXRlIFJlcXVlc3RIYW5kbGUgbVJlcXVlc3RIYW5kbGU7CiAgICAgcHJpdmF0ZSBSZXF1ZXN0SGFuZGxlIG1Tc2xFcnJvclJlcXVlc3RIYW5kbGU7CiAgICAgcHJpdmF0ZSBsb25nICAgICBtUG9zdElkZW50aWZpZXI7CisgICAgcHJpdmF0ZSBib29sZWFuICBtU2V0TmF0aXZlUmVzcG9uc2U7CiAKICAgICAvLyBSZXF1ZXN0IGRhdGEuIEl0IGlzIG9ubHkgdmFsaWQgd2hlbiB3ZSBhcmUgZG9pbmcgYSBsb2FkIGZyb20gdGhlCiAgICAgLy8gY2FjaGUuIEl0IGlzIG5lZWRlZCBpZiB0aGUgY2FjaGUgcmV0dXJucyBhIHJlZGlyZWN0CkBAIC0xODEsNiArMTgyLDcgQEAKICAgICBwcml2YXRlIHZvaWQgY2xlYXJOYXRpdmVMb2FkZXIoKSB7CiAgICAgICAgIHNOYXRpdmVMb2FkZXJDb3VudCAtPSAxOwogICAgICAgICBtTmF0aXZlTG9hZGVyID0gMDsKKyAgICAgICAgbVNldE5hdGl2ZVJlc3BvbnNlID0gZmFsc2U7CiAgICAgfQogCiAgICAgLyoKQEAgLTEwODYsMTMgKzEwODgsMTggQEAKICAgICAgICAgLy8gcmVxdWVzdCB3aXRoIHNvbWUgY3JlZGVudGlhbHMgdGhlbiBkb24ndCBjb21taXQgdGhlIGhlYWRlcnMKICAgICAgICAgLy8gb2YgdGhpcyByZXNwb25zZTsgd2FpdCBmb3IgdGhlIHJlc3BvbnNlIHRvIHRoZSByZXF1ZXN0IHdpdGggdGhlCiAgICAgICAgIC8vIGNyZWRlbnRpYWxzLgotICAgICAgICBpZiAobUF1dGhIZWFkZXIgIT0gbnVsbCkKKyAgICAgICAgaWYgKG1BdXRoSGVhZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0gICAgICAgIC8vIENvbW1pdCB0aGUgaGVhZGVycyB0byBXZWJDb3JlCisgICAgICAgIHNldE5hdGl2ZVJlc3BvbnNlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldE5hdGl2ZVJlc3BvbnNlKCkgewogICAgICAgICBpbnQgbmF0aXZlUmVzcG9uc2UgPSBjcmVhdGVOYXRpdmVSZXNwb25zZSgpOwogICAgICAgICAvLyBUaGUgbmF0aXZlIGNvZGUgZGVsZXRlcyB0aGUgbmF0aXZlIHJlc3BvbnNlIG9iamVjdC4KICAgICAgICAgbmF0aXZlUmVjZWl2ZWRSZXNwb25zZShuYXRpdmVSZXNwb25zZSk7CisgICAgICAgIG1TZXROYXRpdmVSZXNwb25zZSA9IHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTI3LDYgKzExMzQsOSBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBjb21taXRMb2FkKCkgewogICAgICAgICBpZiAobUNhbmNlbGxlZCkgcmV0dXJuOworICAgICAgICBpZiAoIW1TZXROYXRpdmVSZXNwb25zZSkgeworICAgICAgICAgICAgc2V0TmF0aXZlUmVzcG9uc2UoKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChtSXNNYWluUGFnZUxvYWRlcikgewogICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBzQ2VydGlmaWNhdGVUeXBlTWFwLmdldChtTWltZVR5cGUpOwpAQCAtMTE5Nyw2ICsxMjA3LDEwIEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKG1OYXRpdmVMb2FkZXIgIT0gMCkgewogICAgICAgICAgICAgUGVyZkNoZWNrZXIgY2hlY2tlciA9IG5ldyBQZXJmQ2hlY2tlcigpOworICAgICAgICAgICAgaWYgKCFtU2V0TmF0aXZlUmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICBzZXROYXRpdmVSZXNwb25zZSgpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBuYXRpdmVGaW5pc2hlZCgpOwogICAgICAgICAgICAgY2hlY2tlci5yZXNwb25zZUFsZXJ0KCJyZXMgbmF0aXZlRmluaXNoZWQiKTsKICAgICAgICAgICAgIGNsZWFyTmF0aXZlTG9hZGVyKCk7CkBAIC0xMzEyLDYgKzEzMjYsOSBAQAogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gbUNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoUi5zdHJpbmcub3Blbl9wZXJtaXNzaW9uX2RlbnkpCiAgICAgICAgICAgICAgICAgICAgICAgICArICJcbiIgKyByZWRpcmVjdFRvOworICAgICAgICAgICAgICAgIGlmICghbVNldE5hdGl2ZVJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgIHNldE5hdGl2ZVJlc3BvbnNlKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG5hdGl2ZUFkZERhdGEodGV4dC5nZXRCeXRlcygpLCB0ZXh0Lmxlbmd0aCgpKTsKICAgICAgICAgICAgICAgICBuYXRpdmVGaW5pc2hlZCgpOwogICAgICAgICAgICAgICAgIGNsZWFyTmF0aXZlTG9hZGVyKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9NaW1lVHlwZU1hcC5qYXZhCmluZGV4IGMxYWMxODAuLmYwMDAwNWIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9NaW1lVHlwZU1hcC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9NaW1lVHlwZU1hcC5qYXZhCkBAIC0xNiwzNSArMTYsMjIgQEAKIAogcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKIAoraW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgbGliY29yZS5uZXQuTWltZVV0aWxzOwogCiAvKioKICAqIFR3by13YXkgbWFwIHRoYXQgbWFwcyBNSU1FLXR5cGVzIHRvIGZpbGUgZXh0ZW5zaW9ucyBhbmQgdmljZSB2ZXJzYS4KKyAqCisgKiA8cD5TZWUgYWxzbyB7QGxpbmsgamF2YS5uZXQuVVJMQ29ubmVjdGlvbiNndWVzc0NvbnRlbnRUeXBlRnJvbU5hbWV9CisgKiBhbmQge0BsaW5rIGphdmEubmV0LlVSTENvbm5lY3Rpb24jZ3Vlc3NDb250ZW50VHlwZUZyb21TdHJlYW19LiBUaGlzCisgKiBjbGFzcyBhbmQge0Bjb2RlIFVSTENvbm5lY3Rpb259IHNoYXJlIHRoZSBzYW1lIE1JTUUtdHlwZSBkYXRhYmFzZS4KICAqLwogcHVibGljIGNsYXNzIE1pbWVUeXBlTWFwIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNaW1lVHlwZU1hcCBzTWltZVR5cGVNYXAgPSBuZXcgTWltZVR5cGVNYXAoKTsKIAotICAgIC8qKgotICAgICAqIFNpbmdsZXRvbiBNSU1FLXR5cGUgbWFwIGluc3RhbmNlOgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE1pbWVUeXBlTWFwIHNNaW1lVHlwZU1hcDsKLQotICAgIC8qKgotICAgICAqIE1JTUUtdHlwZSB0byBmaWxlIGV4dGVuc2lvbiBtYXBwaW5nOgotICAgICAqLwotICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbU1pbWVUeXBlVG9FeHRlbnNpb25NYXA7Ci0KLSAgICAvKioKLSAgICAgKiBGaWxlIGV4dGVuc2lvbiB0byBNSU1FIHR5cGUgbWFwcGluZzoKLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBNSU1FLXR5cGUgbWFwLgotICAgICAqLwogICAgIHByaXZhdGUgTWltZVR5cGVNYXAoKSB7Ci0gICAgICAgIG1NaW1lVHlwZVRvRXh0ZW5zaW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01NSw3ICs0Miw3IEBACiAgICAgICogQHJldHVybiBUaGUgZmlsZSBleHRlbnNpb24gb2YgdGhlIGdpdmVuIHVybC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uRnJvbVVybChTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGlmICh1cmwgIT0gbnVsbCAmJiB1cmwubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodXJsKSkgewogICAgICAgICAgICAgaW50IHF1ZXJ5ID0gdXJsLmxhc3RJbmRleE9mKCc/Jyk7CiAgICAgICAgICAgICBpZiAocXVlcnkgPiAwKSB7CiAgICAgICAgICAgICAgICAgdXJsID0gdXJsLnN1YnN0cmluZygwLCBxdWVyeSk7CkBAIC02Niw3ICs1Myw3IEBACiAKICAgICAgICAgICAgIC8vIGlmIHRoZSBmaWxlbmFtZSBjb250YWlucyBzcGVjaWFsIGNoYXJhY3RlcnMsIHdlIGRvbid0CiAgICAgICAgICAgICAvLyBjb25zaWRlciBpdCB2YWxpZCBmb3Igb3VyIG1hdGNoaW5nIHB1cnBvc2VzOgotICAgICAgICAgICAgaWYgKGZpbGVuYW1lLmxlbmd0aCgpID4gMCAmJgorICAgICAgICAgICAgaWYgKCFmaWxlbmFtZS5pc0VtcHR5KCkgJiYKICAgICAgICAgICAgICAgICBQYXR0ZXJuLm1hdGNoZXMoIlthLXpBLVpfMC05XFwuXFwtXFwoXFwpXFwlXSsiLCBmaWxlbmFtZSkpIHsKICAgICAgICAgICAgICAgICBpbnQgZG90UG9zID0gZmlsZW5hbWUubGFzdEluZGV4T2YoJy4nKTsKICAgICAgICAgICAgICAgICBpZiAoMCA8PSBkb3RQb3MpIHsKQEAgLTc5LDM2ICs2NiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvYWQgYW4gZW50cnkgaW50byB0aGUgbWFwLiBUaGlzIGRvZXMgbm90IGNoZWNrIGlmIHRoZSBpdGVtIGFscmVhZHkKLSAgICAgKiBleGlzdHMsIGl0IHRydXN0cyB0aGUgY2FsbGVyIQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsb2FkRW50cnkoU3RyaW5nIG1pbWVUeXBlLCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gZXhpc3RpbmcgeCAtLT4geSBtYXBwaW5nLCB3ZSBkbyBub3Qgd2FudCB0bwotICAgICAgICAvLyBvdmVycmlkZSBpdCB3aXRoIGFub3RoZXIgbWFwcGluZyB4IC0tPiA/Ci0gICAgICAgIC8vIHRoaXMgaXMgbW9zdGx5IGJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgbWltZS10eXBlIG1hcCBiZWxvdwotICAgICAgICAvLyBpcyBjb25zdHJ1Y3RlZCAoaWYgYSBtaW1lIHR5cGUgbWFwcyB0byBzZXZlcmFsIGV4dGVuc2lvbnMKLSAgICAgICAgLy8gdGhlIGZpcnN0IGV4dGVuc2lvbiBpcyBjb25zaWRlcmVkIHRoZSBtb3N0IHBvcHVsYXIgYW5kIGlzCi0gICAgICAgIC8vIGFkZGVkIGZpcnN0OyB3ZSBkbyBub3Qgd2FudCB0byBvdmVyd3JpdGUgaXQgbGF0ZXIpLgotICAgICAgICAvLwotICAgICAgICBpZiAoIW1NaW1lVHlwZVRvRXh0ZW5zaW9uTWFwLmNvbnRhaW5zS2V5KG1pbWVUeXBlKSkgewotICAgICAgICAgICAgbU1pbWVUeXBlVG9FeHRlbnNpb25NYXAucHV0KG1pbWVUeXBlLCBleHRlbnNpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgbUV4dGVuc2lvblRvTWltZVR5cGVNYXAucHV0KGV4dGVuc2lvbiwgbWltZVR5cGUpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBNSU1FIHR5cGUgaGFzIGFuIGVudHJ5IGluIHRoZSBtYXAuCiAgICAgICogQHBhcmFtIG1pbWVUeXBlIEEgTUlNRSB0eXBlIChpLmUuIHRleHQvcGxhaW4pCiAgICAgICogQHJldHVybiBUcnVlIGlmZiB0aGVyZSBpcyBhIG1pbWVUeXBlIGVudHJ5IGluIHRoZSBtYXAuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7Ci0gICAgICAgIGlmIChtaW1lVHlwZSAhPSBudWxsICYmIG1pbWVUeXBlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1NaW1lVHlwZVRvRXh0ZW5zaW9uTWFwLmNvbnRhaW5zS2V5KG1pbWVUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE1pbWVVdGlscy5oYXNNaW1lVHlwZShtaW1lVHlwZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTcsMTYgKzgwLDEyIEBACiAgICAgICogQHJldHVybiBUaGUgTUlNRSB0eXBlIGZvciB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIG9yIG51bGwgaWZmIHRoZXJlIGlzIG5vbmUuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZUZyb21FeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwgJiYgZXh0ZW5zaW9uLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwLmdldChleHRlbnNpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBNaW1lVXRpbHMuZ3Vlc3NNaW1lVHlwZUZyb21FeHRlbnNpb24oZXh0ZW5zaW9uKTsKICAgICB9CiAKICAgICAvLyBTdGF0aWMgbWV0aG9kIGNhbGxlZCBieSBqbmkuCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1pbWVUeXBlRnJvbUV4dGVuc2lvbihTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRTaW5nbGV0b24oKS5nZXRNaW1lVHlwZUZyb21FeHRlbnNpb24oZXh0ZW5zaW9uKTsKKyAgICAgICAgcmV0dXJuIE1pbWVVdGlscy5ndWVzc01pbWVUeXBlRnJvbUV4dGVuc2lvbihleHRlbnNpb24pOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM1LDEwICs5NCw3IEBACiAgICAgICogQHJldHVybiBUcnVlIGlmZiB0aGVyZSBpcyBhbiBleHRlbnNpb24gZW50cnkgaW4gdGhlIG1hcC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNFeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwgJiYgZXh0ZW5zaW9uLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwLmNvbnRhaW5zS2V5KGV4dGVuc2lvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gTWltZVV0aWxzLmhhc0V4dGVuc2lvbihleHRlbnNpb24pOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ5LDExICsxMDUsNyBAQAogICAgICAqIEByZXR1cm4gVGhlIGV4dGVuc2lvbiBmb3IgdGhlIGdpdmVuIE1JTUUgdHlwZSBvciBudWxsIGlmZiB0aGVyZSBpcyBub25lLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uRnJvbU1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCAmJiBtaW1lVHlwZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBtTWltZVR5cGVUb0V4dGVuc2lvbk1hcC5nZXQobWltZVR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBNaW1lVXRpbHMuZ3Vlc3NFeHRlbnNpb25Gcm9tTWltZVR5cGUobWltZVR5cGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTYxLDM2MyArMTEzLDYgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIE1JTUUtdHlwZSBtYXAuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBNaW1lVHlwZU1hcCBnZXRTaW5nbGV0b24oKSB7Ci0gICAgICAgIGlmIChzTWltZVR5cGVNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgc01pbWVUeXBlTWFwID0gbmV3IE1pbWVUeXBlTWFwKCk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgdGFibGUgaXMgYmFzZWQgb24gL2V0Yy9taW1lLnR5cGVzIGRhdGEgbWludXMKLSAgICAgICAgICAgIC8vIGNoZW1pY2FsLyogTUlNRSB0eXBlcyBhbmQgTUlNRSB0eXBlcyB0aGF0IGRvbid0IG1hcCB0byBhbnkKLSAgICAgICAgICAgIC8vIGZpbGUgZXh0ZW5zaW9ucy4gV2UgYWxzbyBleGNsdWRlIHRvcC1sZXZlbCBkb21haW4gbmFtZXMgdG8KLSAgICAgICAgICAgIC8vIGRlYWwgd2l0aCBjYXNlcyBsaWtlOgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIG1haWwuZ29vZ2xlLmNvbS9hL2dvb2dsZS5jb20KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBhbmQgImFjdGl2ZSIgTUlNRSB0eXBlcyAoZHVlIHRvIHBvdGVudGlhbCBzZWN1cml0eSBpc3N1ZXMpLgotCi0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9hbmRyZXctaW5zZXQiLCAiZXoiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL2RzcHR5cGUiLCAidHNwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9mdXR1cmVzcGxhc2giLCAic3BsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9odGEiLCAiaHRhIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tYWMtYmluaGV4NDAiLCAiaHF4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tYWMtY29tcGFjdHBybyIsICJjcHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL21hdGhlbWF0aWNhIiwgIm5iIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tc2FjY2VzcyIsICJtZGIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL29kYSIsICJvZGEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL29nZyIsICJvZ2ciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3BkZiIsICJwZGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3BncC1rZXlzIiwgImtleSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vcGdwLXNpZ25hdHVyZSIsICJwZ3AiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3BpY3MtcnVsZXMiLCAicHJmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9yYXIiLCAicmFyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9yZGYreG1sIiwgInJkZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vcnNzK3htbCIsICJyc3MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ppcCIsICJ6aXAiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5hbmRyb2lkLnBhY2thZ2UtYXJjaGl2ZSIsIAotICAgICAgICAgICAgICAgICAgICAiYXBrIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuY2luZGVyZWxsYSIsICJjZHkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5tcy1wa2kuc3RsIiwgInN0bCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZGF0YWJhc2UiLCAib2RiIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhIiwgIm9kZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3MiLCAib2RnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5ncmFwaGljcy10ZW1wbGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICJvdGciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmltYWdlIiwgIm9kaSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQiLCAib2RzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldC10ZW1wbGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICJvdHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQiLCAib2R0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LW1hc3RlciIsICJvZG0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtdGVtcGxhdGUiLCAib3R0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXdlYiIsICJvdGgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL21zd29yZCIsICJkb2MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL21zd29yZCIsICJkb3QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCIsCi0gICAgICAgICAgICAgICAgICAgICJkb2N4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwudGVtcGxhdGUiLAotICAgICAgICAgICAgICAgICAgICAiZG90eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIiwgInhscyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIiwgInhsdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0IiwKLSAgICAgICAgICAgICAgICAgICAgInhsc3giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50ZW1wbGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICJ4bHR4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCIsICJwcHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50IiwgInBvdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQiLCAicHBzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnByZXNlbnRhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICJwcHR4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgInBvdHgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVzaG93IiwKLSAgICAgICAgICAgICAgICAgICAgInBwc3giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5yaW0uY29kIiwgImNvZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnNtYWYiLCAibW1mIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmNhbGMiLCAic2RjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmRyYXciLCAic2RhIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5pbXByZXNzIiwgInNkZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uaW1wcmVzcyIsICJzZHAiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ubWF0aCIsICJzbWYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ud3JpdGVyIiwKLSAgICAgICAgICAgICAgICAgICAgInNkdyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXIiLAotICAgICAgICAgICAgICAgICAgICAidm9yIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXItZ2xvYmFsIiwgInNnbCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuY2FsYyIsICJzeGMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5jYWxjLnRlbXBsYXRlIiwgInN0YyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuZHJhdyIsICJzeGQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5kcmF3LnRlbXBsYXRlIiwgInN0ZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuaW1wcmVzcyIsICJzeGkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5pbXByZXNzLnRlbXBsYXRlIiwgInN0aSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN1bi54bWwubWF0aCIsICJzeG0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlciIsICJzeHciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIuZ2xvYmFsIiwgInN4ZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlci50ZW1wbGF0ZSIsICJzdHciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC52aXNpbyIsICJ2c2QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtYWJpd29yZCIsICJhYnciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtYXBwbGUtZGlza2ltYWdlIiwgImRtZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1iY3BpbyIsICJiY3BpbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1iaXR0b3JyZW50IiwgInRvcnJlbnQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtY2RmIiwgImNkZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1jZGxpbmsiLCAidmNkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWNoZXNzLXBnbiIsICJwZ24iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtY3BpbyIsICJjcGlvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWRlYmlhbi1wYWNrYWdlIiwgImRlYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1kZWJpYW4tcGFja2FnZSIsICJ1ZGViIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWRpcmVjdG9yIiwgImRjciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1kaXJlY3RvciIsICJkaXIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZGlyZWN0b3IiLCAiZHhyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWRtcyIsICJkbXMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZG9vbSIsICJ3YWQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZHZpIiwgImR2aSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1mbGFjIiwgImZsYWMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJwZmEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJwZmIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJnc2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJwY2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJwY2YuWiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1mcmVlbWluZCIsICJtbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1mdXR1cmVzcGxhc2giLCAic3BsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWdudW1lcmljIiwgImdudW1lcmljIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWdvLXNnZiIsICJzZ2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZ3JhcGhpbmctY2FsY3VsYXRvciIsICJnY2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZ3RhciIsICJndGFyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWd0YXIiLCAidGd6Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWd0YXIiLCAidGF6Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWhkZiIsICJoZGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtaWNhIiwgImljYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1pbnRlcm5ldC1zaWdudXAiLCAiaW5zIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWludGVybmV0LXNpZ251cCIsICJpc3AiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtaXBob25lIiwgImlpaSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1pc285NjYwLWltYWdlIiwgImlzbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1qbW9sIiwgImpteiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rY2hhcnQiLCAiY2hydCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1raWxsdXN0cmF0b3IiLCAia2lsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtvYW4iLCAic2twIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtvYW4iLCAic2tkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtvYW4iLCAic2t0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtvYW4iLCAic2ttIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtwcmVzZW50ZXIiLCAia3ByIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtwcmVzZW50ZXIiLCAia3B0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtzcHJlYWQiLCAia3NwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWt3b3JkIiwgImt3ZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rd29yZCIsICJrd3QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbGF0ZXgiLCAibGF0ZXgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbGhhIiwgImxoYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1semgiLCAibHpoIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWx6eCIsICJsengiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbWFrZXIiLCAiZnJtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgIm1ha2VyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgImZyYW1lIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgImZiIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgImJvb2siKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbWFrZXIiLCAiZmJkb2MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbWlmIiwgIm1pZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1tcy13bWQiLCAid21kIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1zLXdteiIsICJ3bXoiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbXNpIiwgIm1zaSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1ucy1wcm94eS1hdXRvY29uZmlnIiwgInBhYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1ud2MiLCAibndjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW9iamVjdCIsICJvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW96LWFwcGxpY2F0aW9uIiwgIm96YSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1wa2NzMTIiLCAicDEyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXBrY3M3LWNlcnRyZXFyZXNwIiwgInA3ciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1wa2NzNy1jcmwiLCAiY3JsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXF1aWNrdGltZXBsYXllciIsICJxdGwiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtc2hhciIsICJzaGFyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIsICJzd2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtc3R1ZmZpdCIsICJzaXQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtc3Y0Y3BpbyIsICJzdjRjcGlvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXN2NGNyYyIsICJzdjRjcmMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtdGFyIiwgInRhciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC10ZXhpbmZvIiwgInRleGluZm8iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtdGV4aW5mbyIsICJ0ZXhpIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXRyb2ZmIiwgInQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtdHJvZmYiLCAicm9mZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC10cm9mZi1tYW4iLCAibWFuIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXVzdGFyIiwgInVzdGFyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXdhaXMtc291cmNlIiwgInNyYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC13aW5neiIsICJ3eiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC13ZWJhcmNoaXZlIiwgIndlYmFyY2hpdmUiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gteDUwOS1jYS1jZXJ0IiwgImNydCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC14NTA5LXVzZXItY2VydCIsICJjcnQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gteGNmIiwgInhjZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC14ZmlnIiwgImZpZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veGh0bWwreG1sIiwgInhodG1sIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby8zZ3BwIiwgIjNncHAiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL2FtciIsICJhbXIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL2Jhc2ljIiwgInNuZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbWlkaSIsICJtaWQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21pZGkiLCAibWlkaSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbWlkaSIsICJrYXIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21pZGkiLCAieG1mIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9tb2JpbGUteG1mIiwgIm14bWYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWciLCAibXBnYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbXBlZyIsICJtcGVnYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbXBlZyIsICJtcDIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWciLCAibXAzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9tcGVnIiwgIm00YSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbXBlZ3VybCIsICJtM3UiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3Bycy5zaWQiLCAic2lkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LWFpZmYiLCAiYWlmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LWFpZmYiLCAiYWlmZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1haWZmIiwgImFpZmMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtZ3NtIiwgImdzbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1tcGVndXJsIiwgIm0zdSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1tcy13bWEiLCAid21hIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LW1zLXdheCIsICJ3YXgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtcG4tcmVhbGF1ZGlvIiwgInJhIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LXBuLXJlYWxhdWRpbyIsICJybSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1wbi1yZWFsYXVkaW8iLCAicmFtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LXJlYWxhdWRpbyIsICJyYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1zY3BscyIsICJwbHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtc2QyIiwgInNkMiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC13YXYiLCAid2F2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9ibXAiLCAiYm1wIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9naWYiLCAiZ2lmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9pY28iLCAiY3VyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9pY28iLCAiaWNvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9pZWYiLCAiaWVmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9qcGVnIiwgImpwZWciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL2pwZWciLCAianBnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9qcGVnIiwgImpwZSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvcGN4IiwgInBjeCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvcG5nIiwgInBuZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2Uvc3ZnK3htbCIsICJzdmciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3N2Zyt4bWwiLCAic3ZneiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvdGlmZiIsICJ0aWZmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS90aWZmIiwgInRpZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2Uvdm5kLmRqdnUiLCAiZGp2dSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2Uvdm5kLmRqdnUiLCAiZGp2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS92bmQud2FwLndibXAiLCAid2JtcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1jbXUtcmFzdGVyIiwgInJhcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1jb3JlbGRyYXciLCAiY2RyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LWNvcmVsZHJhd3BhdHRlcm4iLCAicGF0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LWNvcmVsZHJhd3RlbXBsYXRlIiwgImNkdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1jb3JlbHBob3RvcGFpbnQiLCAiY3B0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LWljb24iLCAiaWNvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LWpnIiwgImFydCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1qbmciLCAiam5nIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LW1zLWJtcCIsICJibXAiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtcGhvdG9zaG9wIiwgInBzZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAiLCAicG5tIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXBvcnRhYmxlLWJpdG1hcCIsICJwYm0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtcG9ydGFibGUtZ3JheW1hcCIsICJwZ20iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtcG9ydGFibGUtcGl4bWFwIiwgInBwbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1yZ2IiLCAicmdiIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXhiaXRtYXAiLCAieGJtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXhwaXhtYXAiLCAieHBtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXh3aW5kb3dkdW1wIiwgInh3ZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgibW9kZWwvaWdlcyIsICJpZ3MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIm1vZGVsL2lnZXMiLCAiaWdlcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgibW9kZWwvbWVzaCIsICJtc2giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIm1vZGVsL21lc2giLCAibWVzaCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgibW9kZWwvbWVzaCIsICJzaWxvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L2NhbGVuZGFyIiwgImljcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9jYWxlbmRhciIsICJpY3oiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvY29tbWEtc2VwYXJhdGVkLXZhbHVlcyIsICJjc3YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvY3NzIiwgImNzcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9odG1sIiwgImh0bSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9odG1sIiwgImh0bWwiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvaDMyMyIsICIzMjMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvaXVscyIsICJ1bHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvbWF0aG1sIiwgIm1tbCIpOwotICAgICAgICAgICAgLy8gYWRkIGl0IGZpcnN0IHNvIGl0IHdpbGwgYmUgdGhlIGRlZmF1bHQgZm9yIEV4dGVuc2lvbkZyb21NaW1lVHlwZQotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9wbGFpbiIsICJ0eHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvcGxhaW4iLCAiYXNjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3BsYWluIiwgInRleHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvcGxhaW4iLCAiZGlmZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9wbGFpbiIsICJwbyIpOyAgICAgLy8gcmVzZXJ2ZSAicG90IiBmb3Igdm5kLm1zLXBvd2VycG9pbnQKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvcmljaHRleHQiLCAicnR4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3J0ZiIsICJydGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvdGV4bWFjcyIsICJ0cyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC90ZXh0IiwgInBocHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXMiLCAidHN2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3htbCIsICJ4bWwiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1iaWJ0ZXgiLCAiYmliIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYm9vIiwgImJvbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWMrK2hkciIsICJoKysiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jKytoZHIiLCAiaHBwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYysraGRyIiwgImh4eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWMrK2hkciIsICJoaCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWMrK3NyYyIsICJjKysiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jKytzcmMiLCAiY3BwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYysrc3JjIiwgImN4eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWNoZHIiLCAiaCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWNvbXBvbmVudCIsICJodGMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jc2giLCAiY3NoIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtY3NyYyIsICJjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtZHNyYyIsICJkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtaGFza2VsbCIsICJocyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWphdmEiLCAiamF2YSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWxpdGVyYXRlLWhhc2tlbGwiLCAibGhzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtbW9jIiwgIm1vYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXBhc2NhbCIsICJwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtcGFzY2FsIiwgInBhcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXBjcy1nY2QiLCAiZ2NkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtc2V0ZXh0IiwgImV0eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXRjbCIsICJ0Y2wiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC10ZXgiLCAidGV4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtdGV4IiwgImx0eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXRleCIsICJzdHkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC10ZXgiLCAiY2xzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtdmNhbGVuZGFyIiwgInZjcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXZjYXJkIiwgInZjZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vM2dwcCIsICIzZ3BwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby8zZ3BwIiwgIjNncCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vM2dwcCIsICIzZzIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL2RsIiwgImRsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9kdiIsICJkaWYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL2R2IiwgImR2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9mbGkiLCAiZmxpIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9tNHYiLCAibTR2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9tcGVnIiwgIm1wZWciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL21wZWciLCAibXBnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9tcGVnIiwgIm1wZSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vbXA0IiwgIm1wNCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vbXBlZyIsICJWT0IiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3F1aWNrdGltZSIsICJxdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vcXVpY2t0aW1lIiwgIm1vdiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vdm5kLm1wZWd1cmwiLCAibXh1Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LWxhLWFzZiIsICJsc2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbGEtYXNmIiwgImxzeCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tbmciLCAibW5nIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LW1zLWFzZiIsICJhc2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbXMtYXNmIiwgImFzeCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tcy13bSIsICJ3bSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tcy13bXYiLCAid212Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LW1zLXdteCIsICJ3bXgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbXMtd3Z4IiwgInd2eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tc3ZpZGVvIiwgImF2aSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1zZ2ktbW92aWUiLCAibW92aWUiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIngtY29uZmVyZW5jZS94LWNvb2x0YWxrIiwgImljZSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgieC1lcG9jL3gtc2lzeC1hcHAiLCAic2lzeCIpOwotICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIHNNaW1lVHlwZU1hcDsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTmV0d29yay5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L05ldHdvcmsuamF2YQppbmRleCA1OThmMjBkLi4wZjAzMjU4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTmV0d29yay5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9OZXR3b3JrLmphdmEKQEAgLTE2LDcgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQuaHR0cC4qOwogaW1wb3J0IGFuZHJvaWQub3MuKjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtNzYsNiArODEsMTkgQEAKICAgICAgKi8KICAgICBwcml2YXRlIEh0dHBBdXRoSGFuZGxlciBtSHR0cEF1dGhIYW5kbGVyOwogCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGUgY3VycmVudGx5IHVzZWQgbmV0d29yayBjb25uZWN0aW9uIGlzIGEgcm9hbWluZyBwaG9uZQorICAgICAqIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1Sb2FtaW5nOworCisgICAgLyoqCisgICAgICogVHJhY2tzIGlmIHdlIGFyZSByb2FtaW5nLgorICAgICAqLworICAgIHByaXZhdGUgUm9hbWluZ01vbml0b3IgbVJvYW1pbmdNb25pdG9yOworCiAgICAgLyoqCiAgICAgICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBuZXR3b3JrLgogICAgICAqLwpAQCAtMTA3LDYgKzEyNSw3IEBACiAgICAgICAgIGlmICgrK3NQbGF0Zm9ybU5vdGlmaWNhdGlvbkVuYWJsZVJlZkNvdW50ID09IDEpIHsKICAgICAgICAgICAgIGlmIChzTmV0d29yayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgc05ldHdvcmsubVJlcXVlc3RRdWV1ZS5lbmFibGVQbGF0Zm9ybU5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgICAgICAgICBzTmV0d29yay5tb25pdG9yUm9hbWluZygpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzUGxhdGZvcm1Ob3RpZmljYXRpb25zID0gdHJ1ZTsKICAgICAgICAgICAgIH0KQEAgLTEyMSw2ICsxNDAsNyBAQAogICAgICAgICBpZiAoLS1zUGxhdGZvcm1Ob3RpZmljYXRpb25FbmFibGVSZWZDb3VudCA9PSAwKSB7CiAgICAgICAgICAgICBpZiAoc05ldHdvcmsgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHNOZXR3b3JrLm1SZXF1ZXN0UXVldWUuZGlzYWJsZVBsYXRmb3JtTm90aWZpY2F0aW9ucygpOworICAgICAgICAgICAgICAgIHNOZXR3b3JrLnN0b3BNb25pdG9yaW5nUm9hbWluZygpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzUGxhdGZvcm1Ob3RpZmljYXRpb25zID0gZmFsc2U7CiAgICAgICAgICAgICB9CkBAIC0xMzYsMTIgKzE1NiwzOSBAQAogICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS4KICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpLmVxdWFscyhXZWJWaWV3Q29yZS5USFJFQURfTkFNRSkpOwogICAgICAgICB9CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVNzbEVycm9ySGFuZGxlciA9IG5ldyBTc2xFcnJvckhhbmRsZXIoKTsKICAgICAgICAgbUh0dHBBdXRoSGFuZGxlciA9IG5ldyBIdHRwQXV0aEhhbmRsZXIodGhpcyk7CiAKICAgICAgICAgbVJlcXVlc3RRdWV1ZSA9IG5ldyBSZXF1ZXN0UXVldWUoY29udGV4dCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBjbGFzcyBSb2FtaW5nTW9uaXRvciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIGlmICghQ29ubmVjdGl2aXR5TWFuYWdlci5DT05ORUNUSVZJVFlfQUNUSU9OLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgTmV0d29ya0luZm8gaW5mbyA9IChOZXR3b3JrSW5mbylpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKENvbm5lY3Rpdml0eU1hbmFnZXIuRVhUUkFfTkVUV09SS19JTkZPKTsKKyAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpCisgICAgICAgICAgICAgICAgbVJvYW1pbmcgPSBpbmZvLmlzUm9hbWluZygpOworICAgICAgICB9OworICAgIH07CisKKyAgICBwcml2YXRlIHZvaWQgbW9uaXRvclJvYW1pbmcoKSB7CisgICAgICAgIG1Sb2FtaW5nTW9uaXRvciA9IG5ldyBSb2FtaW5nTW9uaXRvcigpOworICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKENvbm5lY3Rpdml0eU1hbmFnZXIuQ09OTkVDVElWSVRZX0FDVElPTik7CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIoc05ldHdvcmsubVJvYW1pbmdNb25pdG9yLCBmaWx0ZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdG9wTW9uaXRvcmluZ1JvYW1pbmcoKSB7CisgICAgICAgIGlmIChtUm9hbWluZ01vbml0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1Sb2FtaW5nTW9uaXRvcik7CisgICAgICAgICAgICBtUm9hbWluZ01vbml0b3IgPSBudWxsOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmVxdWVzdCBhIHVybCBmcm9tIGVpdGhlciB0aGUgbmV0d29yayBvciB0aGUgZmlsZSBzeXN0ZW0uCiAgICAgICogQHBhcmFtIHVybCBUaGUgdXJsIHRvIGxvYWQuCkBAIC0xNzAsNiArMjE3LDExIEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcHJlZmV0Y2gsIGFib3J0IGl0IGlmIHdlJ3JlIHJvYW1pbmcuCisgICAgICAgIGlmIChtUm9hbWluZyAmJiBoZWFkZXJzLmNvbnRhaW5zS2V5KCJYLU1veiIpICYmICJwcmVmZXRjaCIuZXF1YWxzKGhlYWRlcnMuZ2V0KCJYLU1veiIpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKICAgICAgICAgLyogRklYTUU6IHRoaXMgaXMgbGFtZS4gIFBhc3MgYW4gSW5wdXRTdHJlYW0gaW4sIHJhdGhlciB0aGFuCiAgICAgICAgICAgIG1ha2luZyB0aGlzIGxhbWUgb25lIGhlcmUgKi8KICAgICAgICAgSW5wdXRTdHJlYW0gYm9keVByb3ZpZGVyID0gbnVsbDsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9QbHVnaW5NYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvUGx1Z2luTWFuYWdlci5qYXZhCmluZGV4IGU1ZWViOGMuLmFiM2I2ZDUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9QbHVnaW5NYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1BsdWdpbk1hbmFnZXIuamF2YQpAQCAtMTU5LDQxICsxNTksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gUExVR0lOX1NZU1RFTV9MSUIgKyBwa2dJbmZvLnBhY2thZ2VOYW1lOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucwotICAgICAgICAgICAgICAgIFN0cmluZyBwZXJtaXNzaW9uc1tdID0gcGtnSW5mby5yZXF1ZXN0ZWRQZXJtaXNzaW9uczsKLSAgICAgICAgICAgICAgICBpZiAocGVybWlzc2lvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucyBhbmQKKyAgICAgICAgICAgICAgICAvLyBzaWduYXR1cmVzCisgICAgICAgICAgICAgICAgaWYgKCFjb250YWluc1BsdWdpblBlcm1pc3Npb25BbmRTaWduYXR1cmVzKHBrZ0luZm8pKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBib29sZWFuIHBlcm1pc3Npb25PayA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHBlcm1pdCA6IHBlcm1pc3Npb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChQTFVHSU5fUEVSTUlTU0lPTi5lcXVhbHMocGVybWl0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbk9rID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghcGVybWlzc2lvbk9rKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRvIGVuc3VyZSB0aGUgcGx1Z2luIGlzIHByb3Blcmx5IHNpZ25lZAotICAgICAgICAgICAgICAgIFNpZ25hdHVyZSBzaWduYXR1cmVzW10gPSBwa2dJbmZvLnNpZ25hdHVyZXM7Ci0gICAgICAgICAgICAgICAgaWYgKHNpZ25hdHVyZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigicm8uc2VjdXJlIiwgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2lnbmF0dXJlTWF0Y2ggPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTaWduYXR1cmUgc2lnbmF0dXJlIDogc2lnbmF0dXJlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSUdOQVRVUkVTLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNJR05BVFVSRVNbaV0uZXF1YWxzKHNpZ25hdHVyZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlTWF0Y2ggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzaWduYXR1cmVNYXRjaCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgcGx1Z2luIGZyb20gdGhlIG1hbmlmZXN0CiAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VJbmZvLm1ldGFEYXRhID09IG51bGwpIHsKQEAgLTIzNiw2ICsyMDYsNjQgQEAKICAgICB9CiAKICAgICAvKiBwYWNrYWdlICovCisgICAgYm9vbGVhbiBjb250YWluc1BsdWdpblBlcm1pc3Npb25BbmRTaWduYXR1cmVzKFN0cmluZyBwbHVnaW5BUEtOYW1lKSB7CisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKworICAgICAgICAvLyByZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwbHVnaW4ncyBtYW5pZmVzdAorICAgICAgICB0cnkgeworICAgICAgICAgICAgUGFja2FnZUluZm8gcGtnSW5mbyA9IHBtLmdldFBhY2thZ2VJbmZvKHBsdWdpbkFQS05hbWUsIFBhY2thZ2VNYW5hZ2VyLkdFVF9QRVJNSVNTSU9OUworICAgICAgICAgICAgICAgICAgICB8IFBhY2thZ2VNYW5hZ2VyLkdFVF9TSUdOQVRVUkVTKTsKKyAgICAgICAgICAgIGlmIChwa2dJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNQbHVnaW5QZXJtaXNzaW9uQW5kU2lnbmF0dXJlcyhwa2dJbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR1RBRywgIkNhbid0IGZpbmQgcGx1Z2luOiAiICsgcGx1Z2luQVBLTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnNQbHVnaW5QZXJtaXNzaW9uQW5kU2lnbmF0dXJlcyhQYWNrYWdlSW5mbyBwa2dJbmZvKSB7CisKKyAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zCisgICAgICAgIFN0cmluZyBwZXJtaXNzaW9uc1tdID0gcGtnSW5mby5yZXF1ZXN0ZWRQZXJtaXNzaW9uczsKKyAgICAgICAgaWYgKHBlcm1pc3Npb25zID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHBlcm1pc3Npb25PayA9IGZhbHNlOworICAgICAgICBmb3IgKFN0cmluZyBwZXJtaXQgOiBwZXJtaXNzaW9ucykgeworICAgICAgICAgICAgaWYgKFBMVUdJTl9QRVJNSVNTSU9OLmVxdWFscyhwZXJtaXQpKSB7CisgICAgICAgICAgICAgICAgcGVybWlzc2lvbk9rID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXBlcm1pc3Npb25PaykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgdG8gZW5zdXJlIHRoZSBwbHVnaW4gaXMgcHJvcGVybHkgc2lnbmVkCisgICAgICAgIFNpZ25hdHVyZSBzaWduYXR1cmVzW10gPSBwa2dJbmZvLnNpZ25hdHVyZXM7CisgICAgICAgIGlmIChzaWduYXR1cmVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJyby5zZWN1cmUiLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gc2lnbmF0dXJlTWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoU2lnbmF0dXJlIHNpZ25hdHVyZSA6IHNpZ25hdHVyZXMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJR05BVFVSRVMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFNJR05BVFVSRVNbaV0uZXF1YWxzKHNpZ25hdHVyZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZU1hdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzaWduYXR1cmVNYXRjaCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8KICAgICBTdHJpbmcgZ2V0UGx1Z2luc0FQS05hbWUoU3RyaW5nIHBsdWdpbkxpYikgewogCiAgICAgICAgIC8vIGJhc2ljIGVycm9yIGNoZWNraW5nIG9uIGlucHV0IHBhcmFtcwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkNocm9tZUNsaWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkNocm9tZUNsaWVudC5qYXZhCmluZGV4IDlmNjQyYzAuLmU4M2JlZjAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJDaHJvbWVDbGllbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViQ2hyb21lQ2xpZW50LmphdmEKQEAgLTMxNCwxMCArMzE0LDEyIEBACiAgICAgLyoqCiAgICAgICogVGVsbCB0aGUgY2xpZW50IHRvIG9wZW4gYSBmaWxlIGNob29zZXIuCiAgICAgICogQHBhcmFtIHVwbG9hZEZpbGUgQSBWYWx1ZUNhbGxiYWNrIHRvIHNldCB0aGUgVVJJIG9mIHRoZSBmaWxlIHRvIHVwbG9hZC4KLSAgICAgKiAgICAgIG9uUmVjZWl2ZVZhbHVlIG11c3QgYmUgY2FsbGVkIHRvIHdha2UgdXAgdGhlIHRocmVhZC4KKyAgICAgKiAgICAgIG9uUmVjZWl2ZVZhbHVlIG11c3QgYmUgY2FsbGVkIHRvIHdha2UgdXAgdGhlIHRocmVhZC5hCisgICAgICogQHBhcmFtIGFjY2VwdFR5cGUgVGhlIHZhbHVlIG9mIHRoZSAnYWNjZXB0JyBhdHRyaWJ1dGUgb2YgdGhlIGlucHV0IHRhZworICAgICAqICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlsZSBwaWNrZXIuCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvcGVuRmlsZUNob29zZXIoVmFsdWVDYWxsYmFjazxVcmk+IHVwbG9hZEZpbGUpIHsKKyAgICBwdWJsaWMgdm9pZCBvcGVuRmlsZUNob29zZXIoVmFsdWVDYWxsYmFjazxVcmk+IHVwbG9hZEZpbGUsIFN0cmluZyBhY2NlcHRUeXBlKSB7CiAgICAgICAgIHVwbG9hZEZpbGUub25SZWNlaXZlVmFsdWUobnVsbCk7CiAgICAgfQogCkBAIC0zMzgsNCArMzQwLDExIEBACiAgICAgcHVibGljIHZvaWQgb25TZWxlY3Rpb25Eb25lKFdlYlZpZXcgdmlldykgewogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRlbGwgdGhlIGNsaWVudCB0aGF0IHRoZSBwYWdlIGJlaW5nIHZpZXdlZCBpcyB3ZWIgYXBwIGNhcGFibGUsCisgICAgICogaS5lLiBoYXMgc3BlY2lmaWVkIHRoZSBmdWxsc2NyZWVuLXdlYi1hcHAtY2FwYWJsZSBtZXRhIHRhZy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluc3RhbGxhYmxlV2ViQXBwKCkgeyB9CisKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJIaXN0b3J5SXRlbS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkhpc3RvcnlJdGVtLmphdmEKaW5kZXggNDI4YTU5Yy4uN2MwZTQ3OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkhpc3RvcnlJdGVtLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkhpc3RvcnlJdGVtLmphdmEKQEAgLTE4LDYgKzE4LDkgQEAKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKwogLyoqCiAgKiBBIGNvbnZlbmllbmNlIGNsYXNzIGZvciBhY2Nlc3NpbmcgZmllbGRzIGluIGFuIGVudHJ5IGluIHRoZSBiYWNrL2ZvcndhcmQgbGlzdAogICogb2YgYSBXZWJWaWV3LiBFYWNoIFdlYkhpc3RvcnlJdGVtIGlzIGEgc25hcHNob3Qgb2YgdGhlIHJlcXVlc3RlZCBoaXN0b3J5CkBAIC0zOSw4ICs0MiwxMiBAQAogICAgIHByaXZhdGUgQml0bWFwIG1GYXZpY29uOwogICAgIC8vIFRoZSBwcmUtZmxhdHRlbmVkIGRhdGEgdXNlZCBmb3Igc2F2aW5nIHRoZSBzdGF0ZS4KICAgICBwcml2YXRlIGJ5dGVbXSBtRmxhdHRlbmVkRGF0YTsKLSAgICAvLyBUaGUgYXBwbGUtdG91Y2gtaWNvbiB1cmwgZm9yIHVzZSB3aGVuIGFkZGluZyB0aGUgc2l0ZSB0byB0aGUgaG9tZSBzY3JlZW4KLSAgICBwcml2YXRlIFN0cmluZyBtVG91Y2hJY29uVXJsOworICAgIC8vIFRoZSBhcHBsZS10b3VjaC1pY29uIHVybCBmb3IgdXNlIHdoZW4gYWRkaW5nIHRoZSBzaXRlIHRvIHRoZSBob21lIHNjcmVlbiwKKyAgICAvLyBhcyBvYnRhaW5lZCBmcm9tIGEgPGxpbms+IGVsZW1lbnQgaW4gdGhlIHBhZ2UuCisgICAgcHJpdmF0ZSBTdHJpbmcgbVRvdWNoSWNvblVybEZyb21MaW5rOworICAgIC8vIElmIG5vIDxsaW5rPiBpcyBzcGVjaWZpZWQsIHRoaXMgaG9sZHMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlCisgICAgLy8gYXBwbGUtdG91Y2gtaWNvbi4KKyAgICBwcml2YXRlIFN0cmluZyBtVG91Y2hJY29uVXJsU2VydmVyRGVmYXVsdDsKICAgICAvLyBDdXN0b20gY2xpZW50IGRhdGEgdGhhdCBpcyBub3QgZmxhdHRlbmVkIG9yIHJlYWQgYnkgbmF0aXZlIGNvZGUuCiAgICAgcHJpdmF0ZSBPYmplY3QgbUN1c3RvbURhdGE7CiAKQEAgLTEzMiwxMCArMTM5LDI4IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHRvdWNoIGljb24gdXJsLgorICAgICAqIElmIG5vIHRvdWNoIGljb24gPGxpbms+IHRhZyB3YXMgc3BlY2lmaWVkLCByZXR1cm5zCisgICAgICogPGhvc3Q+L2FwcGxlLXRvdWNoLWljb24ucG5nLiBUaGUgRG93bmxvYWRUb3VjaEljb24gY2xhc3MgdGhhdAorICAgICAqIGF0dGVtcHRzIHRvIHJldHJpZXZlIHRoZSB0b3VjaCBpY29uIHdpbGwgaGFuZGxlIHRoZSBjYXNlIHdoZXJlCisgICAgICogdGhhdCBmaWxlIGRvZXMgbm90IGV4aXN0LiBBbiBpY29uIHNldCBieSBhIDxsaW5rPiB0YWcgaXMgYWx3YXlzCisgICAgICogdXNlZCBpbiBwcmVmZXJlbmNlIHRvIGFuIGljb24gc2F2ZWQgb24gdGhlIHNlcnZlci4KICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG91Y2hJY29uVXJsKCkgewotICAgICAgICByZXR1cm4gbVRvdWNoSWNvblVybDsKKyAgICAgICAgaWYgKG1Ub3VjaEljb25VcmxGcm9tTGluayAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbVRvdWNoSWNvblVybEZyb21MaW5rOworICAgICAgICB9IGVsc2UgaWYgKG1Ub3VjaEljb25VcmxTZXJ2ZXJEZWZhdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtVG91Y2hJY29uVXJsU2VydmVyRGVmYXVsdDsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChtT3JpZ2luYWxVcmwpOworICAgICAgICAgICAgbVRvdWNoSWNvblVybFNlcnZlckRlZmF1bHQgPSBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLAorICAgICAgICAgICAgICAgICAgICAiL2FwcGxlLXRvdWNoLWljb24ucG5nIikudG9TdHJpbmcoKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtVG91Y2hJY29uVXJsU2VydmVyRGVmYXVsdDsKICAgICB9CiAKICAgICAvKioKQEAgLTE3MSwxMSArMTk2LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSB0b3VjaCBpY29uIHVybC4KKyAgICAgKiBTZXQgdGhlIHRvdWNoIGljb24gdXJsLiBXaWxsIG5vdCBvdmVyd3JpdGUgYW4gaWNvbiB0aGF0IGhhcyBiZWVuCisgICAgICogc2V0IGFscmVhZHkgZnJvbSBhIDxsaW5rPiB0YWcsIHVubGVzcyB0aGUgbmV3IGljb24gaXMgcHJlY29tcG9zZWQuCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICAvKnBhY2thZ2UqLyB2b2lkIHNldFRvdWNoSWNvblVybChTdHJpbmcgdXJsKSB7Ci0gICAgICAgIG1Ub3VjaEljb25VcmwgPSB1cmw7CisgICAgLypwYWNrYWdlKi8gdm9pZCBzZXRUb3VjaEljb25VcmwoU3RyaW5nIHVybCwgYm9vbGVhbiBwcmVjb21wb3NlZCkgeworICAgICAgICBpZiAocHJlY29tcG9zZWQgfHwgbVRvdWNoSWNvblVybEZyb21MaW5rID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Ub3VjaEljb25VcmxGcm9tTGluayA9IHVybDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlNldHRpbmdzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViU2V0dGluZ3MuamF2YQppbmRleCAxYjgwMWQ0Li5hYmQxZTVkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViU2V0dGluZ3MuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViU2V0dGluZ3MuamF2YQpAQCAtMjIsOCArMjIsOSBAQAogaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwotaW1wb3J0IGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbjsKKwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIC8qKgpAQCAtMTA3LDcgKzEwOCw3IEBACiAgICAgICogVXNlIHdpdGgge0BsaW5rICNzZXRDYWNoZU1vZGV9LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQURfTk9fQ0FDSEUgPSAyOwotICAgIAorCiAgICAgLyoqCiAgICAgICogRG9uJ3QgdXNlIHRoZSBuZXR3b3JrLCBsb2FkIGZyb20gY2FjaGUgb25seS4KICAgICAgKiBVc2Ugd2l0aCB7QGxpbmsgI3NldENhY2hlTW9kZX0uCkBAIC0xNzYsMTQgKzE3NywxOCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1KYXZhU2NyaXB0Q2FuT3BlbldpbmRvd3NBdXRvbWF0aWNhbGx5ID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVVzZURvdWJsZVRyZWUgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtVXNlV2lkZVZpZXdwb3J0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVVzZUZpeGVkVmlld3BvcnQgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtU3VwcG9ydE11bHRpcGxlV2luZG93cyA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1TaHJpbmtzU3RhbmRhbG9uZUltYWdlc1RvRml0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBsb25nICAgICAgICAgICAgbU1heGltdW1EZWNvZGVkSW1hZ2VTaXplID0gMDsgLy8gMCBtZWFucyBkZWZhdWx0CisgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVByaXZhdGVCcm93c2luZ0VuYWJsZWQgPSBmYWxzZTsKICAgICAvLyBIVE1MNSBBUEkgZmxhZ3MKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtQXBwQ2FjaGVFbmFibGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbURhdGFiYXNlRW5hYmxlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1Eb21TdG9yYWdlRW5hYmxlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1Xb3JrZXJzRW5hYmxlZCA9IGZhbHNlOyAgLy8gb25seSBhZmZlY3RzIFY4LgogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1HZW9sb2NhdGlvbkVuYWJsZWQgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1YU1NBdWRpdG9yRW5hYmxlZCA9IGZhbHNlOwogICAgIC8vIEhUTUw1IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwogICAgIHByaXZhdGUgbG9uZyAgICAgICAgICAgIG1BcHBDYWNoZU1heFNpemUgPSBMb25nLk1BWF9WQUxVRTsKICAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICBtQXBwQ2FjaGVQYXRoID0gIiI7CkBAIC0yMDcsNyArMjEyLDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtQnVpbHRJblpvb21Db250cm9scyA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1BbGxvd0ZpbGVBY2Nlc3MgPSB0cnVlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1Mb2FkV2l0aE92ZXJ2aWV3TW9kZSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1Vc2VXZWJWaWV3QmFja2dyb3VuZE92ZXJzY3JvbGxCYWNrZ3JvdW5kID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtRW5hYmxlU21vb3RoVHJhbnNpdGlvbiA9IGZhbHNlOwogCiAgICAgLy8gcHJpdmF0ZSBXZWJTZXR0aW5ncywgbm90IGFjY2Vzc2libGUgYnkgdGhlIGhvc3QgYWN0aXZpdHkKICAgICBzdGF0aWMgcHJpdmF0ZSBpbnQgICAgICBtRG91YmxlVGFwVG9hc3RDb3VudCA9IDM7CkBAIC0yOTcsMTMgKzMwMiwxMyBAQAogICAgICAgICAgICAgIk1vemlsbGEvNS4wIChNYWNpbnRvc2g7IFU7IEludGVsIE1hYyBPUyBYIDEwXzVfNzsgZW4tdXMpIgogICAgICAgICAgICAgKyAiIEFwcGxlV2ViS2l0LzUzMC4xNyAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIgogICAgICAgICAgICAgKyAiIFNhZmFyaS81MzAuMTciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJUEhPTkVfVVNFUkFHRU5UID0gCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElQSE9ORV9VU0VSQUdFTlQgPQogICAgICAgICAgICAgIk1vemlsbGEvNS4wIChpUGhvbmU7IFU7IENQVSBpUGhvbmUgT1MgM18wIGxpa2UgTWFjIE9TIFg7IGVuLXVzKSIKICAgICAgICAgICAgICsgIiBBcHBsZVdlYktpdC81MjguMTggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCIKICAgICAgICAgICAgICsgIiBNb2JpbGUvN0EzNDEgU2FmYXJpLzUyOC4xNiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgTG9jYWxlIHNMb2NhbGU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IHNMb2NrRm9yTG9jYWxlU2V0dGluZ3M7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBQYWNrYWdlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgY2xpZW50cyBmcm9tIGNyZWF0aW5nIGEgbmV3IHNldHRpbmdzCiAgICAgICogaW5zdGFuY2UuCkBAIC0zMTUsNiArMzIwLDExIEBACiAgICAgICAgIG1EZWZhdWx0VGV4dEVuY29kaW5nID0gY29udGV4dC5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuZGVmYXVsdF90ZXh0X2VuY29kaW5nKTsKIAorICAgICAgICAvLyBEZXRlY3QgdGFibGV0IGRldmljZSBmb3IgZml4ZWQgdmlld3BvcnQgbW9kZS4KKyAgICAgICAgZmluYWwgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKTsKKyAgICAgICAgbVVzZUZpeGVkVmlld3BvcnQgPSAobWV0cmljcy5kZW5zaXR5ID09IDEuMGYgCisgICAgICAgICAgICAmJiAobWV0cmljcy53aWR0aFBpeGVscyA+PSA4MDAgfHxtZXRyaWNzLmhlaWdodFBpeGVscyA+PSA4MDApKTsKKwogICAgICAgICBpZiAoc0xvY2tGb3JMb2NhbGVTZXR0aW5ncyA9PSBudWxsKSB7CiAgICAgICAgICAgICBzTG9ja0ZvckxvY2FsZVNldHRpbmdzID0gbmV3IE9iamVjdCgpOwogICAgICAgICAgICAgc0xvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7CkBAIC0zMjgsNiArMzM4LDggQEAKICAgICAgICAgICAgICAgICBhbmRyb2lkLm9zLlByb2Nlc3MubXlVaWQoKSkgIT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NFUFRfTEFOR19GT1JfVVNfTE9DQUxFID0gImVuLVVTIjsKKwogICAgIC8qKgogICAgICAqIExvb2tzIGF0IHNMb2NhbGUgYW5kIHJldHVybnMgY3VycmVudCBBY2NlcHRMYW5ndWFnZSBTdHJpbmcuCiAgICAgICogQHJldHVybiBDdXJyZW50IEFjY2VwdExhbmd1YWdlIFN0cmluZy4KQEAgLTMzNywzMiArMzQ5LDUzIEBACiAgICAgICAgIHN5bmNocm9uaXplZChzTG9ja0ZvckxvY2FsZVNldHRpbmdzKSB7CiAgICAgICAgICAgICBsb2NhbGUgPSBzTG9jYWxlOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBsYW5ndWFnZSA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpOwotICAgICAgICBpZiAobGFuZ3VhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChsYW5ndWFnZSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9IGxvY2FsZS5nZXRDb3VudHJ5KCk7Ci0gICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLSIpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoY291bnRyeSk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYWRkTG9jYWxlVG9IdHRwQWNjZXB0TGFuZ3VhZ2UoYnVmZmVyLCBsb2NhbGUpOworCisgICAgICAgIGlmICghTG9jYWxlLlVTLmVxdWFscyhsb2NhbGUpKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFsb2NhbGUuZXF1YWxzKExvY2FsZS5VUykpIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICBqYXZhLnV0aWwuTG9jYWxlIHVzID0gTG9jYWxlLlVTOwotICAgICAgICAgICAgaWYgKHVzLmdldExhbmd1YWdlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQodXMuZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSB1cy5nZXRDb3VudHJ5KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCItIik7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoY291bnRyeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChBQ0NFUFRfTEFOR19GT1JfVVNfTE9DQUxFKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICAgICB9Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IG9ic29sZXRlIGxhbmd1YWdlIGNvZGVzLCBpbmNsdWRpbmcgSGVicmV3L0luZG9uZXNpYW4vWWlkZGlzaCwKKyAgICAgKiB0byBuZXcgc3RhbmRhcmQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRPYnNvbGV0ZUxhbmd1YWdlQ29kZVRvTmV3KFN0cmluZyBsYW5nQ29kZSkgeworICAgICAgICBpZiAobGFuZ0NvZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCJpdyIuZXF1YWxzKGxhbmdDb2RlKSkgeworICAgICAgICAgICAgLy8gSGVicmV3CisgICAgICAgICAgICByZXR1cm4gImhlIjsKKyAgICAgICAgfSBlbHNlIGlmICgiaW4iLmVxdWFscyhsYW5nQ29kZSkpIHsKKyAgICAgICAgICAgIC8vIEluZG9uZXNpYW4KKyAgICAgICAgICAgIHJldHVybiAiaWQiOworICAgICAgICB9IGVsc2UgaWYgKCJqaSIuZXF1YWxzKGxhbmdDb2RlKSkgeworICAgICAgICAgICAgLy8gWWlkZGlzaAorICAgICAgICAgICAgcmV0dXJuICJ5aSI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxhbmdDb2RlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkTG9jYWxlVG9IdHRwQWNjZXB0TGFuZ3VhZ2UoU3RyaW5nQnVpbGRlciBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlIGxvY2FsZSkgeworICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBjb252ZXJ0T2Jzb2xldGVMYW5ndWFnZUNvZGVUb05ldyhsb2NhbGUuZ2V0TGFuZ3VhZ2UoKSk7CisgICAgICAgIGlmIChsYW5ndWFnZSAhPSBudWxsKSB7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsYW5ndWFnZSk7CisgICAgICAgICAgICBTdHJpbmcgY291bnRyeSA9IGxvY2FsZS5nZXRDb3VudHJ5KCk7CisgICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjb3VudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIExvb2tzIGF0IHNMb2NhbGUgYW5kIG1Db250ZXh0IGFuZCByZXR1cm5zIGN1cnJlbnQgVXNlckFnZW50IFN0cmluZy4KICAgICAgKiBAcmV0dXJuIEN1cnJlbnQgVXNlckFnZW50IFN0cmluZy4KQEAgLTM4MCwxMSArNDEzLDExIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvICIxLjAiCiAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIxLjAiKTsKLSAgICAgICAgfSAgCisgICAgICAgIH0KICAgICAgICAgYnVmZmVyLmFwcGVuZCgiOyAiKTsKICAgICAgICAgZmluYWwgU3RyaW5nIGxhbmd1YWdlID0gbG9jYWxlLmdldExhbmd1YWdlKCk7CiAgICAgICAgIGlmIChsYW5ndWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKGxhbmd1YWdlLnRvTG93ZXJDYXNlKCkpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjb252ZXJ0T2Jzb2xldGVMYW5ndWFnZUNvZGVUb05ldyhsYW5ndWFnZSkpOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSBsb2NhbGUuZ2V0Q291bnRyeSgpOwogICAgICAgICAgICAgaWYgKGNvdW50cnkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIi0iKTsKQEAgLTQwNywxMSArNDQwLDEzIEBACiAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgQnVpbGQvIik7CiAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGlkKTsKICAgICAgICAgfQorICAgICAgICBTdHJpbmcgbW9iaWxlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0VGV4dCgKKyAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLndlYl91c2VyX2FnZW50X3RhcmdldF9jb250ZW50KS50b1N0cmluZygpOwogICAgICAgICBmaW5hbCBTdHJpbmcgYmFzZSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFRleHQoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcud2ViX3VzZXJfYWdlbnQpLnRvU3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KGJhc2UsIGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KGJhc2UsIGJ1ZmZlciwgbW9iaWxlKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBFbmFibGVzIGR1bXBpbmcgdGhlIHBhZ2VzIG5hdmlnYXRpb24gY2FjaGUgdG8gYSB0ZXh0IGZpbGUuCiAgICAgICovCkBAIC00MjcsNiArNDYyLDIxIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogSWYgV2ViVmlldyBvbmx5IHN1cHBvcnRzIHRvdWNoLCBhIGRpZmZlcmVudCBuYXZpZ2F0aW9uIG1vZGVsIHdpbGwgYmUKKyAgICAgKiBhcHBsaWVkLiBPdGhlcndpc2UsIHRoZSBuYXZpZ2F0aW9uIHRvIHN1cHBvcnQgYm90aCB0b3VjaCBhbmQga2V5Ym9hcmQKKyAgICAgKiB3aWxsIGJlIHVzZWQuCisgICAgICogQGhpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdXBwb3J0VG91Y2hPbmx5KGJvb2xlYW4gdG91Y2hPbmx5KSB7CisgICAgICAgIG1TdXBwb3J0VG91bmNoT25seSA9IHRvdWNoT25seTsKKyAgICB9CisgICAgICovCisKKyAgICBib29sZWFuIHN1cHBvcnRUb3VjaE9ubHkoKSB7CisgICAgICAgIC8vIGZvciBkZWJ1ZyBvbmx5LCB1c2UgbUxpZ2h0VG91Y2hFbmFibGVkIGZvciBtU3VwcG9ydFRvdW5jaE9ubHkKKyAgICAgICAgcmV0dXJuIG1MaWdodFRvdWNoRW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZXQgd2hldGhlciB0aGUgV2ViVmlldyBzdXBwb3J0cyB6b29tCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U3VwcG9ydFpvb20oYm9vbGVhbiBzdXBwb3J0KSB7CkBAIC00NDgsMTQgKzQ5OCwxNCBAQAogICAgICAgICBtQnVpbHRJblpvb21Db250cm9scyA9IGVuYWJsZWQ7CiAgICAgICAgIG1XZWJWaWV3LnVwZGF0ZU11bHRpVG91Y2hTdXBwb3J0KG1Db250ZXh0KTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHpvb20gbWVjaGFuaXNtIGJ1aWx0IGludG8gV2ViVmlldyBpcyBiZWluZyB1c2VkLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGdldEJ1aWx0SW5ab29tQ29udHJvbHMoKSB7CiAgICAgICAgIHJldHVybiBtQnVpbHRJblpvb21Db250cm9sczsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBFbmFibGUgb3IgZGlzYWJsZSBmaWxlIGFjY2VzcyB3aXRoaW4gV2ViVmlldy4gRmlsZSBhY2Nlc3MgaXMgZW5hYmxlZCBieQogICAgICAqIGRlZmF1bHQuCkBAIC00ODYsMjAgKzUzNiwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB3aGV0aGVyIHRoZSBXZWJWaWV3IHVzZXMgaXRzIGJhY2tncm91bmQgZm9yIG92ZXIgc2Nyb2xsIGJhY2tncm91bmQuCi0gICAgICogSWYgdHJ1ZSwgaXQgd2lsbCB1c2UgdGhlIFdlYlZpZXcncyBiYWNrZ3JvdW5kLiBJZiBmYWxzZSwgaXQgd2lsbCB1c2UgYW4KLSAgICAgKiBpbnRlcm5hbCBwYXR0ZXJuLiBEZWZhdWx0IGlzIHRydWUuCisgICAgICogU2V0IHdoZXRoZXIgdGhlIFdlYlZpZXcgd2lsbCBlbmFibGUgc21vb3RoIHRyYW5zaXRpb24gd2hpbGUgcGFubmluZyBvcgorICAgICAqIHpvb21pbmcuIElmIGl0IGlzIHRydWUsIFdlYlZpZXcgd2lsbCBjaG9vc2UgYSBzb2x1dGlvbiB0byBtYXhpbWl6ZSB0aGUKKyAgICAgKiBwZXJmb3JtYW5jZS4gZS5nLiB0aGUgV2ViVmlldydzIGNvbnRlbnQgbWF5IG5vdCBiZSB1cGRhdGVkIGR1cmluZyB0aGUKKyAgICAgKiB0cmFuc2l0aW9uLiBJZiBpdCBpcyBmYWxzZSwgV2ViVmlldyB3aWxsIGtlZXAgaXRzIGZpZGVsaXR5LiBUaGUgZGVmYXVsdAorICAgICAqIHZhbHVlIGlzIGZhbHNlLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVzZVdlYlZpZXdCYWNrZ3JvdW5kRm9yT3ZlcnNjcm9sbEJhY2tncm91bmQoYm9vbGVhbiB2aWV3KSB7Ci0gICAgICAgIG1Vc2VXZWJWaWV3QmFja2dyb3VuZE92ZXJzY3JvbGxCYWNrZ3JvdW5kID0gdmlldzsKKyAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVTbW9vdGhUcmFuc2l0aW9uKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIG1FbmFibGVTbW9vdGhUcmFuc2l0aW9uID0gZW5hYmxlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIFdlYlZpZXcgdXNlcyBXZWJWaWV3J3MgYmFja2dyb3VuZCBpbnN0ZWFkIG9mCi0gICAgICogaW50ZXJuYWwgcGF0dGVybiBmb3Igb3ZlciBzY3JvbGwgYmFja2dyb3VuZC4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFdlYlZpZXcgZW5hYmxlcyBzbW9vdGggdHJhbnNpdGlvbiB3aGlsZSBwYW5uaW5nIG9yCisgICAgICogem9vbWluZy4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRVc2VXZWJWaWV3QmFja2dyb3VuZEZvck92ZXJzY3JvbGxCYWNrZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbVVzZVdlYlZpZXdCYWNrZ3JvdW5kT3ZlcnNjcm9sbEJhY2tncm91bmQ7CisgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlU21vb3RoVHJhbnNpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1FbmFibGVTbW9vdGhUcmFuc2l0aW9uOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTAwMiw4ICsxMDU0LDggQEAKIAogICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlOZXR3b3JrQWNjZXNzKCkgewogICAgICAgICBpZiAoIW1CbG9ja05ldHdvcmtMb2FkcykgewotICAgICAgICAgICAgaWYgKG1Db250ZXh0LmNoZWNrUGVybWlzc2lvbigiYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiwgCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQub3MuUHJvY2Vzcy5teVBpZCgpLCBhbmRyb2lkLm9zLlByb2Nlc3MubXlVaWQoKSkgIT0gCisgICAgICAgICAgICBpZiAobUNvbnRleHQuY2hlY2tQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm9zLlByb2Nlc3MubXlQaWQoKSwgYW5kcm9pZC5vcy5Qcm9jZXNzLm15VWlkKCkpICE9CiAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICgiUGVybWlzc2lvbiBkZW5pZWQgLSAiICsKQEAgLTEwMjksNiArMTA4MSw3IEBACiAgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZgogICAgICAqICAgICAgICAgICAgIHtAbGluayAjc2V0UGx1Z2luU3RhdGV9CiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UGx1Z2luc0VuYWJsZWQoYm9vbGVhbiBmbGFnKSB7CiAgICAgICAgIHNldFBsdWdpblN0YXRlKFBsdWdpblN0YXRlLk9OKTsKICAgICB9CkBAIC0xMTk0LDYgKzEyNDcsMTggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgWFNTIEF1ZGl0b3IgaXMgZW5hYmxlZC4KKyAgICAgKiBAcGFyYW0gZmxhZyBXaGV0aGVyIFhTUyBBdWRpdG9yIHNob3VsZCBiZSBlbmFibGVkLgorICAgICAqIEBoaWRlIE9ubHkgdXNlZCBieSBMYXlvdXRUZXN0Q29udHJvbGxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0WFNTQXVkaXRvckVuYWJsZWQoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIGlmIChtWFNTQXVkaXRvckVuYWJsZWQgIT0gZmxhZykgeworICAgICAgICAgICAgbVhTU0F1ZGl0b3JFbmFibGVkID0gZmxhZzsKKyAgICAgICAgICAgIHBvc3RTeW5jKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBqYXZhc2NyaXB0IGlzIGVuYWJsZWQuIDxiPk5vdGU6IFRoZSBkZWZhdWx0IGlzIGZhbHNlLjwvYj4KICAgICAgKiBAcmV0dXJuIFRydWUgaWYgamF2YXNjcmlwdCBpcyBlbmFibGVkLgogICAgICAqLwpAQCAtMTIwNiw2ICsxMjcxLDcgQEAKICAgICAgKiBAcmV0dXJuIFRydWUgaWYgcGx1Z2lucyBhcmUgZW5hYmxlZC4KICAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBoYXMgYmVlbiByZXBsYWNlZCBieSB7QGxpbmsgI2dldFBsdWdpblN0YXRlfQogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGdldFBsdWdpbnNFbmFibGVkKCkgewogICAgICAgICByZXR1cm4gbVBsdWdpblN0YXRlID09IFBsdWdpblN0YXRlLk9OOwogICAgIH0KQEAgLTEyNzQsNyArMTM0MCw3IEBACiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFVzZXJBZ2VudFN0cmluZyhTdHJpbmcgdWEpIHsKICAgICAgICAgaWYgKHVhID09IG51bGwgfHwgdWEubGVuZ3RoKCkgPT0gMCkgewogICAgICAgICAgICAgc3luY2hyb25pemVkKHNMb2NrRm9yTG9jYWxlU2V0dGluZ3MpIHsKLSAgICAgICAgICAgICAgICBMb2NhbGUgY3VycmVudExvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7IAorICAgICAgICAgICAgICAgIExvY2FsZSBjdXJyZW50TG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICBpZiAoIXNMb2NhbGUuZXF1YWxzKGN1cnJlbnRMb2NhbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgIHNMb2NhbGUgPSBjdXJyZW50TG9jYWxlOwogICAgICAgICAgICAgICAgICAgICBtQWNjZXB0TGFuZ3VhZ2UgPSBnZXRDdXJyZW50QWNjZXB0TGFuZ3VhZ2UoKTsKQEAgLTEzMjksMTEgKzEzOTUsMTEgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbUFjY2VwdExhbmd1YWdlOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFRlbGwgdGhlIFdlYlZpZXcgd2hldGhlciBpdCBuZWVkcyB0byBzZXQgYSBub2RlIHRvIGhhdmUgZm9jdXMgd2hlbgogICAgICAqIHtAbGluayBXZWJWaWV3I3JlcXVlc3RGb2N1cyhpbnQsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCl9IGlzIGNhbGxlZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBmbGFnCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TmVlZEluaXRpYWxGb2N1cyhib29sZWFuIGZsYWcpIHsKQEAgLTEzNjAsNyArMTQyNiw3IEBACiAgICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlci5QUklPUklUWSkpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogT3ZlcnJpZGUgdGhlIHdheSB0aGUgY2FjaGUgaXMgdXNlZC4gVGhlIHdheSB0aGUgY2FjaGUgaXMgdXNlZCBpcyBiYXNlZAogICAgICAqIG9uIHRoZSBuYXZpZ2F0aW9uIG9wdGlvbi4gRm9yIGEgbm9ybWFsIHBhZ2UgbG9hZCwgdGhlIGNhY2hlIGlzIGNoZWNrZWQKQEAgLTEzNzQsNyArMTQ0MCw3IEBACiAgICAgICAgICAgICBtT3ZlcnJpZGVDYWNoZU1vZGUgPSBtb2RlOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yIG92ZXJyaWRpbmcgdGhlIGNhY2hlIG1vZGUuIEZvciBhIGZ1bGwKICAgICAgKiBkZXNjcmlwdGlvbiwgc2VlIHRoZSB7QGxpbmsgI3NldENhY2hlTW9kZShpbnQpfSBmdW5jdGlvbi4KQEAgLTEzODIsNyArMTQ0OCw3IEBACiAgICAgcHVibGljIGludCBnZXRDYWNoZU1vZGUoKSB7CiAgICAgICAgIHJldHVybiBtT3ZlcnJpZGVDYWNoZU1vZGU7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogSWYgc2V0LCB3ZWJraXQgYWx0ZXJuYXRlbHkgc2hyaW5rcyBhbmQgZXhwYW5kcyBpbWFnZXMgdmlld2VkIG91dHNpZGUKICAgICAgKiBvZiBhbiBIVE1MIHBhZ2UgdG8gZml0IHRoZSBzY3JlZW4uIFRoaXMgY29uZmxpY3RzIHdpdGggYXR0ZW1wdHMgYnkKQEAgLTEzOTcsNiArMTQ2Myw0NCBAQAogICAgICAgICB9CiAgICAgIH0KIAorICAgIC8qKgorICAgICAqIFNwZWNpZnkgdGhlIG1heGltdW0gZGVjb2RlZCBpbWFnZSBzaXplLiBUaGUgZGVmYXVsdCBpcworICAgICAqIDIgbWVncyBmb3Igc21hbGwgbWVtb3J5IGRldmljZXMgYW5kIDggbWVncyBmb3IgbGFyZ2UgbWVtb3J5IGRldmljZXMuCisgICAgICogQHBhcmFtIHNpemUgVGhlIG1heGltdW0gZGVjb2RlZCBzaXplLCBvciB6ZXJvIHRvIHNldCB0byB0aGUgZGVmYXVsdC4KKyAgICAgKiBAaGlkZSBwZW5kaW5nIGFwaSBjb3VuY2lsIGFwcHJvdmFsCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWF4aW11bURlY29kZWRJbWFnZVNpemUobG9uZyBzaXplKSB7CisgICAgICAgIGlmIChtTWF4aW11bURlY29kZWRJbWFnZVNpemUgIT0gc2l6ZSkgeworICAgICAgICAgICAgbU1heGltdW1EZWNvZGVkSW1hZ2VTaXplID0gc2l6ZTsKKyAgICAgICAgICAgIHBvc3RTeW5jKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdG8gdXNlIGZpeGVkIHZpZXdwb3J0LgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBnZXRVc2VGaXhlZFZpZXdwb3J0KCkgeworICAgICAgICByZXR1cm4gbVVzZUZpeGVkVmlld3BvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHByaXZhdGUgYnJvd3NpbmcgaXMgZW5hYmxlZC4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gaXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gbVByaXZhdGVCcm93c2luZ0VuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHByaXZhdGUgYnJvd3NpbmcgaXMgZW5hYmxlZC4KKyAgICAgKiBAcGFyYW0gZmxhZyBXaGV0aGVyIHByaXZhdGUgYnJvd3Npbmcgc2hvdWxkIGJlIGVuYWJsZWQuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKGJvb2xlYW4gZmxhZykgeworICAgICAgICBpZiAobVByaXZhdGVCcm93c2luZ0VuYWJsZWQgIT0gZmxhZykgeworICAgICAgICAgICAgbVByaXZhdGVCcm93c2luZ0VuYWJsZWQgPSBmbGFnOworICAgICAgICAgICAgcG9zdFN5bmMoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGludCBnZXREb3VibGVUYXBUb2FzdENvdW50KCkgewogICAgICAgICByZXR1cm4gbURvdWJsZVRhcFRvYXN0Q291bnQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlRleHRWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVGV4dFZpZXcuamF2YQppbmRleCAxOWFiZWMxLi40OGMwNjVhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVGV4dFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVGV4dFZpZXcuamF2YQpAQCAtMjgsNiArMjgsNyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5JbnB1dEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFBhaW50OwpAQCAtMzAwLDYgKzMwMSwzMyBAQAogICAgICAgICByZXR1cm4gY29ubmVjdGlvbjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBJbiBnZW5lcmFsLCBUZXh0VmlldyBtYWtlcyBhIGNhbGwgdG8gSW5wdXRNZXRob2RNYW5hZ2VyLnVwZGF0ZVNlbGVjdGlvbgorICAgICAqIGluIG9uRHJhdy4gIEhvd2V2ZXIsIGluIHRoZSBnZW5lcmFsIGNhc2Ugb2YgV2ViVGV4dFZpZXcsIHdlIGRvIG5vdCBkcmF3LgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBXZWJWaWV3Lm9uRHJhdyB0byB0YWtlIGNhcmUgb2YgdGhlIHBhcnQgdGhhdAorICAgICAqIG5lZWRzIHRvIGJlIGNhbGxlZC4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHZvaWQgb25EcmF3U3Vic3RpdHV0ZSgpIHsKKyAgICAgICAgaWYgKCF3aWxsTm90RHJhdygpKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgV2ViVGV4dFZpZXcgaXMgc2V0IHRvIGRyYXcsIHN1Y2ggYXMgaW4gdGhlIGNhc2Ugb2YgYQorICAgICAgICAgICAgLy8gcGFzc3dvcmQsIG9uRHJhdyBjYWxscyB1cGRhdGVTZWxlY3Rpb24oKSwgc28gdGhpcyBjb2RlIHBhdGggaXMKKyAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5LgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFRoaXMgY29kZSBpcyBjb3BpZWQgZnJvbSBUZXh0Vmlldy5vbkRyYXcoKS4gIFRoYXQgY29kZSBkb2VzIG5vdCBnZXQKKyAgICAgICAgLy8gZXhlY3V0ZWQsIGhvd2V2ZXIsIGJlY2F1c2UgdGhlIFdlYlRleHRWaWV3IGRvZXMgbm90IGRyYXcsIGFsbG93aW5nCisgICAgICAgIC8vIHdlYmtpdCdzIGRyYXdpbmcgdG8gc2hvdyB0aHJvdWdoLgorICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5wdXRNZXRob2RNYW5hZ2VyLnBlZWtJbnN0YW5jZSgpOworICAgICAgICBpZiAoaW1tICE9IG51bGwgJiYgaW1tLmlzQWN0aXZlKHRoaXMpKSB7CisgICAgICAgICAgICBTcGFubmFibGUgc3AgPSAoU3Bhbm5hYmxlKSBnZXRUZXh0KCk7CisgICAgICAgICAgICBpbnQgc2VsU3RhcnQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoc3ApOworICAgICAgICAgICAgaW50IHNlbEVuZCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoc3ApOworICAgICAgICAgICAgaW50IGNhbmRTdGFydCA9IEVkaXRhYmxlSW5wdXRDb25uZWN0aW9uLmdldENvbXBvc2luZ1NwYW5TdGFydChzcCk7CisgICAgICAgICAgICBpbnQgY2FuZEVuZCA9IEVkaXRhYmxlSW5wdXRDb25uZWN0aW9uLmdldENvbXBvc2luZ1NwYW5FbmQoc3ApOworICAgICAgICAgICAgaW1tLnVwZGF0ZVNlbGVjdGlvbih0aGlzLCBzZWxTdGFydCwgc2VsRW5kLCBjYW5kU3RhcnQsIGNhbmRFbmQpOworICAgICAgICB9CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKICAgICAgICAgLy8gb25EcmF3IHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3IgcGFzc3dvcmQgZmllbGRzLiAgSWYgV2ViVGV4dFZpZXcgaXMKQEAgLTMyMiw5ICszNTAsNiBAQAogICAgICAgICBzd2l0Y2ggKGFjdGlvbkNvZGUpIHsKICAgICAgICAgY2FzZSBFZGl0b3JJbmZvLklNRV9BQ1RJT05fTkVYVDoKICAgICAgICAgICAgIGlmIChtV2ViVmlldy5uYXRpdmVNb3ZlQ3Vyc29yVG9OZXh0VGV4dElucHV0KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgY3Vyc29yIHdpbGwgbm8gbG9uZ2VyIGJlIGluIHRoZSBzYW1lIHBsYWNlIGFzIHRoZQotICAgICAgICAgICAgICAgIC8vIGZvY3VzLCBzZXQgdGhlIGZvY3VzIGNvbnRyb2xsZXIgYmFjayB0byBpbmFjdGl2ZQotICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNldEZvY3VzQ29udHJvbGxlckluYWN0aXZlKCk7CiAgICAgICAgICAgICAgICAgLy8gUHJlZW1wdGl2ZWx5IHJlYnVpbGQgdGhlIFdlYlRleHRWaWV3LCBzbyB0aGF0IHRoZSBhY3Rpb24gd2lsbAogICAgICAgICAgICAgICAgIC8vIGJlIHNldCBwcm9wZXJseS4KICAgICAgICAgICAgICAgICBtV2ViVmlldy5yZWJ1aWxkV2ViVGV4dFZpZXcoKTsKQEAgLTM2MCwxOSArMzg1LDggQEAKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU2VsZWN0aW9uQ2hhbmdlZChpbnQgc2VsU3RhcnQsIGludCBzZWxFbmQpIHsKLSAgICAgICAgaWYgKG1JblNldFRleHRBbmRLZWVwU2VsZWN0aW9uKSByZXR1cm47Ci0gICAgICAgIC8vIFRoaXMgY29kZSBpcyBjb3BpZWQgZnJvbSBUZXh0Vmlldy5vbkRyYXcoKS4gIFRoYXQgY29kZSBkb2VzIG5vdCBnZXQKLSAgICAgICAgLy8gZXhlY3V0ZWQsIGhvd2V2ZXIsIGJlY2F1c2UgdGhlIFdlYlRleHRWaWV3IGRvZXMgbm90IGRyYXcsIGFsbG93aW5nCi0gICAgICAgIC8vIHdlYmtpdCdzIGRyYXdpbmcgdG8gc2hvdyB0aHJvdWdoLgotICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5wdXRNZXRob2RNYW5hZ2VyLnBlZWtJbnN0YW5jZSgpOwotICAgICAgICBpZiAoaW1tICE9IG51bGwgJiYgaW1tLmlzQWN0aXZlKHRoaXMpKSB7Ci0gICAgICAgICAgICBTcGFubmFibGUgc3AgPSAoU3Bhbm5hYmxlKSBnZXRUZXh0KCk7Ci0gICAgICAgICAgICBpbnQgY2FuZFN0YXJ0ID0gRWRpdGFibGVJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhblN0YXJ0KHNwKTsKLSAgICAgICAgICAgIGludCBjYW5kRW5kID0gRWRpdGFibGVJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhbkVuZChzcCk7Ci0gICAgICAgICAgICBpbW0udXBkYXRlU2VsZWN0aW9uKHRoaXMsIHNlbFN0YXJ0LCBzZWxFbmQsIGNhbmRTdGFydCwgY2FuZEVuZCk7Ci0gICAgICAgIH0KICAgICAgICAgaWYgKCFtRnJvbVdlYktpdCAmJiAhbUZyb21Gb2N1c0NoYW5nZSAmJiAhbUZyb21TZXRJbnB1dFR5cGUKLSAgICAgICAgICAgICAgICAmJiBtV2ViVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgJiYgbVdlYlZpZXcgIT0gbnVsbCAmJiAhbUluU2V0VGV4dEFuZEtlZXBTZWxlY3Rpb24pIHsKICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9URVhUX1ZJRVcpIHsKICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJvblNlbGVjdGlvbkNoYW5nZWQgc2VsU3RhcnQ9IiArIHNlbFN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICArICIgc2VsRW5kPSIgKyBzZWxFbmQpOwpAQCAtNDgxLDkgKzQ5NSwxMCBAQAogICAgICAgICAgICAgLy8gdG8gYmlnIGZvciB0aGUgY2FzZSBvZiBhIHNtYWxsIHRleHRmaWVsZC4KICAgICAgICAgICAgIGludCBzbWFsbGVyU2xvcCA9IHNsb3AvMjsKICAgICAgICAgICAgIGlmIChkeCA+IHNtYWxsZXJTbG9wIHx8IGR5ID4gc21hbGxlclNsb3ApIHsKLSAgICAgICAgICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhTY3JvbGxYID0gKGZsb2F0KSBUb3VjaC5nZXRNYXhTY3JvbGxYKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExheW91dCgpLCBtU2Nyb2xsWSk7CisgICAgICAgICAgICAgICAgTGF5b3V0IGxheW91dCA9IGdldExheW91dCgpOworICAgICAgICAgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsICYmIGxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFNjcm9sbFggPSAoZmxvYXQpIFRvdWNoLmdldE1heFNjcm9sbFgodGhpcywgbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TY3JvbGxZKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1RFWFRfVklFVykgewogICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAib25Ub3VjaEV2ZW50IHg9IiArIG1TY3JvbGxYICsgIiB5PSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtU2Nyb2xsWSArICIgbWF4WD0iICsgbWF4U2Nyb2xsWCk7CkBAIC02NjcsNiArNjgyLDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24odGV4dCwgc2VsZWN0aW9uLCBzZWxlY3Rpb24pOwogICAgICAgICB9CisgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsKSBtV2ViVmlldy5pbmNyZW1lbnRUZXh0R2VuZXJhdGlvbigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTE5LDE0ICs5MzUsNCBAQAogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCB1cGRhdGVDYWNoZWRUZXh0ZmllbGQoKSB7CiAgICAgICAgIG1XZWJWaWV3LnVwZGF0ZUNhY2hlZFRleHRmaWVsZChnZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdFJlY3RhbmdsZU9uU2NyZWVuKFJlY3QgcmVjdGFuZ2xlKSB7Ci0gICAgICAgIC8vIGRvbid0IHNjcm9sbCB3aGlsZSBpbiB6b29tIGFuaW1hdGlvbi4gV2hlbiBpdCBpcyBkb25lLCB3ZSB3aWxsIGFkanVzdAotICAgICAgICAvLyB0aGUgV2ViVGV4dFZpZXcgaWYgaXQgaXMgaW4gZWRpdGluZyBtb2RlLgotICAgICAgICBpZiAoIW1XZWJWaWV3LmluQW5pbWF0ZVpvb20oKSkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlcXVlc3RSZWN0YW5nbGVPblNjcmVlbihyZWN0YW5nbGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXcuamF2YQppbmRleCA4ZDJkN2IwLi45NTk3ZDhjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3LmphdmEKQEAgLTE4LDM1ICsxOCwzOCBAQAogCiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLldpZGdldDsKIGltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBib2FyZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZS5PbkNhbmNlbExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBTaGFkZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvcm5lclBhdGhFZmZlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5EcmF3RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuSW50ZXJwb2xhdG9yOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludEZsYWdzRHJhd0ZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubmV0Lmh0dHAuU3NsQ2VydGlmaWNhdGU7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQubmV0Lmh0dHAuU3NsQ2VydGlmaWNhdGU7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LklDbGlwYm9hcmQ7CitpbXBvcnQgYW5kcm9pZC5zcGVlY2gudHRzLlRleHRUb1NwZWVjaDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKQEAgLTY0LDQxICs2Nyw0MSBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlRleHRWaWV3LkF1dG9Db21wbGV0ZUFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUuRXZlbnRIdWI7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUuVG91Y2hFdmVudERhdGE7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUuVG91Y2hIaWdobGlnaHREYXRhOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFic29sdXRlTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQ2hlY2tlZFRleHRWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5PdmVyU2Nyb2xsZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Nyb2xsZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuWm9vbUJ1dHRvbnNDb250cm9sbGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Llpvb21Db250cm9sczsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCiAvKioKICAqIDxwPkEgVmlldyB0aGF0IGRpc3BsYXlzIHdlYiBwYWdlcy4gVGhpcyBjbGFzcyBpcyB0aGUgYmFzaXMgdXBvbiB3aGljaCB5b3UKICAqIGNhbiByb2xsIHlvdXIgb3duIHdlYiBicm93c2VyIG9yIHNpbXBseSBkaXNwbGF5IHNvbWUgb25saW5lIGNvbnRlbnQgd2l0aGluIHlvdXIgQWN0aXZpdHkuCkBAIC0xMTQsNyArMTE3LDcgQEAKICAqIDxwcmU+Jmx0O3VzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz48L3ByZT4KICAqCiAgKiA8cD5UaGlzIG11c3QgYmUgYSBjaGlsZCBvZiB0aGUgPGEKLSAqIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvbWFuaWZlc3QtZWxlbWVudC5odG1sIj57QGNvZGUgJmx0O21hbmlmZXN0Jmd0O308L2E+CisgKiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L21hbmlmZXN0LWVsZW1lbnQuaHRtbCI+e0Bjb2RlIDxtYW5pZmVzdD59PC9hPgogICogZWxlbWVudC48L3A+CiAgKgogICogPHA+U2VlIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy92aWV3cy9oZWxsby13ZWJ2aWV3Lmh0bWwiPldlYiBWaWV3CkBAIC0xMzcsNyArMTQwLDcgQEAKICAqIDwvcHJlPgogICogPHA+U2VlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50fSBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+CiAgKgotICogPHA+VG8gcHJvdmlkZSBhIFdlYlZpZXcgaW4geW91ciBvd24gQWN0aXZpdHksIGluY2x1ZGUgYSB7QGNvZGUgJmx0O1dlYlZpZXcmZ3Q7fSBpbiB5b3VyIGxheW91dCwKKyAqIDxwPlRvIHByb3ZpZGUgYSBXZWJWaWV3IGluIHlvdXIgb3duIEFjdGl2aXR5LCBpbmNsdWRlIGEge0Bjb2RlIDxXZWJWaWV3Pn0gaW4geW91ciBsYXlvdXQsCiAgKiBvciBzZXQgdGhlIGVudGlyZSBBY3Rpdml0eSB3aW5kb3cgYXMgYSBXZWJWaWV3IGR1cmluZyB7QGxpbmsKICAqIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uQ3JlYXRlKEJ1bmRsZSkgb25DcmVhdGUoKX06PC9wPgogICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPgpAQCAtMjg0LDcgKzI4Nyw3IEBACiAgKiBsb3cgZGVuc2l0eSBzY3JlZW5zIHNjYWxlIGRvd24uIFRoaXMgaXMgYWxzbyB0aGUgZGVmYXVsdCBiZWhhdmlvci48L2xpPgogICogPGxpPntAY29kZSBsb3ctZHBpfSAtIFVzZSBsZHBpIGFzIHRoZSB0YXJnZXQgZHBpLiBNZWRpdW0gYW5kIGhpZ2ggZGVuc2l0eSBzY3JlZW5zIHNjYWxlIHVwCiAgKiBhcyBhcHByb3ByaWF0ZS48L2xpPgotICogPGxpPjxlbT57QGNvZGUgJmx0O3ZhbHVlJmd0O308L2VtPiAtIFNwZWNpZnkgYSBkcGkgdmFsdWUgdG8gdXNlIGFzIHRoZSB0YXJnZXQgZHBpIChhY2NlcHRlZAorICogPGxpPjxlbT57QGNvZGUgPHZhbHVlPn08L2VtPiAtIFNwZWNpZnkgYSBkcGkgdmFsdWUgdG8gdXNlIGFzIHRoZSB0YXJnZXQgZHBpIChhY2NlcHRlZAogICogdmFsdWVzIGFyZSA3MC00MDApLjwvbGk+CiAgKiA8L3VsPgogICogPHA+SGVyZSdzIGFuIGV4YW1wbGUgbWV0YSB0YWcgdG8gc3BlY2lmeSB0aGUgdGFyZ2V0IGRlbnNpdHk6PC9wPgpAQCAtMjk2LDcgKzI5OSw3IEBACiAgKiBwcm9wZXJ0eSB0byB7QGNvZGUgZGV2aWNlLWRwaX0uIFRoaXMgc3RvcHMgQW5kcm9pZCBmcm9tIHBlcmZvcm1pbmcgc2NhbGluZyBpbiB5b3VyIHdlYiBwYWdlIGFuZAogICogYWxsb3dzIHlvdSB0byBtYWtlIHRoZSBuZWNlc3NhcnkgYWRqdXN0bWVudHMgZm9yIGVhY2ggZGVuc2l0eSB2aWEgQ1NTIGFuZCBKYXZhU2NyaXB0LjwvcD4KICAqCi0gKiAKKyAqCiAgKi8KIEBXaWRnZXQKIHB1YmxpYyBjbGFzcyBXZWJWaWV3IGV4dGVuZHMgQWJzb2x1dGVMYXlvdXQKQEAgLTMxMyw0OSArMzE2LDcgQEAKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVEFHID0gIndlYnZpZXciOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXh0ZW5kZWRab29tQ29udHJvbHMgZXh0ZW5kcyBGcmFtZUxheW91dCB7Ci0gICAgICAgIHB1YmxpYyBFeHRlbmRlZFpvb21Db250cm9scyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKLSAgICAgICAgICAgIGluZmxhdGVyLmluZmxhdGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuem9vbV9tYWduaWZ5LCB0aGlzLCB0cnVlKTsKLSAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMgPSAoWm9vbUNvbnRyb2xzKSBmaW5kVmlld0J5SWQoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuem9vbUNvbnRyb2xzKTsKLSAgICAgICAgICAgIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnpvb21NYWduaWZ5KS5zZXRWaXNpYmlsaXR5KAotICAgICAgICAgICAgICAgICAgICBWaWV3LkdPTkUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2hvdyhib29sZWFuIHNob3dab29tLCBib29sZWFuIGNhblpvb21PdXQpIHsKLSAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0VmlzaWJpbGl0eSgKLSAgICAgICAgICAgICAgICAgICAgc2hvd1pvb20gPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgICAgICAgICAgZmFkZShWaWV3LlZJU0lCTEUsIDAuMGYsIDEuMGYpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaGlkZSgpIHsKLSAgICAgICAgICAgIGZhZGUoVmlldy5HT05FLCAxLjBmLCAwLjBmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBmYWRlKGludCB2aXNpYmlsaXR5LCBmbG9hdCBzdGFydEFscGhhLCBmbG9hdCBlbmRBbHBoYSkgewotICAgICAgICAgICAgQWxwaGFBbmltYXRpb24gYW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbihzdGFydEFscGhhLCBlbmRBbHBoYSk7Ci0gICAgICAgICAgICBhbmltLnNldER1cmF0aW9uKDUwMCk7Ci0gICAgICAgICAgICBzdGFydEFuaW1hdGlvbihhbmltKTsKLSAgICAgICAgICAgIHNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNGb2N1cygpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLmhhc0ZvY3VzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRPblpvb21JbkNsaWNrTGlzdGVuZXIoT25DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLnNldE9uWm9vbUluQ2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRPblpvb21PdXRDbGlja0xpc3RlbmVyKE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scy5zZXRPblpvb21PdXRDbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFpvb21Db250cm9scyAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzOwotICAgIH0KKyAgICBwcml2YXRlIFpvb21NYW5hZ2VyIG1ab29tTWFuYWdlcjsKIAogICAgIC8qKgogICAgICAqICBUcmFuc3BvcnRhdGlvbiBvYmplY3QgZm9yIHJldHVybmluZyBXZWJWaWV3IGFjcm9zcyB0aHJlYWQgYm91bmRhcmllcy4KQEAgLTQwMSw2ICszNjIsOCBAQAogICAgIC8vIG1vcmUga2V5IGV2ZW50cy4KICAgICBwcml2YXRlIGludCBtVGV4dEdlbmVyYXRpb247CiAKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgaW5jcmVtZW50VGV4dEdlbmVyYXRpb24oKSB7IG1UZXh0R2VuZXJhdGlvbisrOyB9CisKICAgICAvLyBVc2VkIGJ5IFdlYlZpZXdDb3JlIHRvIGNyZWF0ZSBjaGlsZCB2aWV3cy4KICAgICAvKiBwYWNrYWdlICovIGZpbmFsIFZpZXdNYW5hZ2VyIG1WaWV3TWFuYWdlcjsKIApAQCAtNDQ4LDYgKzQxMSwxNCBAQAogICAgIHByaXZhdGUgZmxvYXQgbUxhc3RWZWxYOwogICAgIHByaXZhdGUgZmxvYXQgbUxhc3RWZWxZOwogCisgICAgLy8gQSBwb2ludGVyIHRvIHRoZSBuYXRpdmUgc2Nyb2xsYWJsZSBsYXllciB3aGVuIGRyYWdnaW5nIGxheWVycy4gIE9ubHkKKyAgICAvLyB2YWxpZCB3aGVuIG1Ub3VjaE1vZGUgaXMgVE9VQ0hfRFJBR19MQVlFUl9NT0RFLgorICAgIHByaXZhdGUgaW50IG1TY3JvbGxpbmdMYXllcjsKKworICAgIC8vIG9ubHkgdHJpZ2dlciBhY2NlbGVyYXRlZCBmbGluZyBpZiB0aGUgbmV3IHZlbG9jaXR5IGlzIGF0IGxlYXN0CisgICAgLy8gTUlOSU1VTV9WRUxPQ0lUWV9SQVRJT19GT1JfQUNDRUxFUkFUSU9OIHRpbWVzIG9mIHRoZSBwcmV2aW91cyB2ZWxvY2l0eQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1JTklNVU1fVkVMT0NJVFlfUkFUSU9fRk9SX0FDQ0VMRVJBVElPTiA9IDAuMmY7CisKICAgICAvKioKICAgICAgKiBUb3VjaCBtb2RlCiAgICAgICovCkBAIC00NjAsNiArNDMxLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfRE9VQkxFX1RBUF9NT0RFID0gNjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfRE9ORV9NT0RFID0gNzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfUElOQ0hfRFJBRyA9IDg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX0RSQUdfTEFZRVJfTU9ERSA9IDk7CiAKICAgICAvLyBXaGV0aGVyIHRvIGZvcndhcmQgdGhlIHRvdWNoIGV2ZW50cyB0byBXZWJDb3JlCiAgICAgcHJpdmF0ZSBib29sZWFuIG1Gb3J3YXJkVG91Y2hFdmVudHMgPSBmYWxzZTsKQEAgLTQ5OCwxMCArNDcwLDYgQEAKICAgICAvLyB0cnVlIGlmIG9uUGF1c2UgaGFzIGJlZW4gY2FsbGVkIChhbmQgbm90IG9uUmVzdW1lKQogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNQYXVzZWQ7CiAKLSAgICAvLyB0cnVlIGlmLCBkdXJpbmcgYSB0cmFuc2l0aW9uIHRvIGEgbmV3IHBhZ2UsIHdlJ3JlIGRlbGF5aW5nCi0gICAgLy8gZGVsZXRpbmcgYSByb290IGxheWVyIHVudGlsIHRoZXJlJ3Mgc29tZXRoaW5nIHRvIGRyYXcgb2YgdGhlIG5ldyBwYWdlLgotICAgIHByaXZhdGUgYm9vbGVhbiBtRGVsYXllZERlbGV0ZVJvb3RMYXllcjsKLQogICAgIC8qKgogICAgICAqIEN1c3RvbWl6YWJsZSBjb25zdGFudAogICAgICAqLwpAQCAtNTIzLDkgKzQ5MSw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9GTElOR19USU1FID0gMjUwOwogICAgIC8vIGRyYXcgdW5maWx0ZXJlZCBhZnRlciBkcmFnIGlzIGhlbGQgd2l0aG91dCBtb3ZlbWVudAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1RJT05MRVNTX1RJTUUgPSAxMDA7Ci0gICAgLy8gVGhlIHRpbWUgdGhhdCB0aGUgWm9vbSBDb250cm9scyBhcmUgdmlzaWJsZSBiZWZvcmUgZmFkaW5nIGF3YXkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFpPT01fQ09OVFJPTFNfVElNRU9VVCA9Ci0gICAgICAgICAgICBWaWV3Q29uZmlndXJhdGlvbi5nZXRab29tQ29udHJvbHNUaW1lb3V0KCk7CiAgICAgLy8gVGhlIGFtb3VudCBvZiBjb250ZW50IHRvIG92ZXJsYXAgYmV0d2VlbiB0d28gc2NyZWVucyB3aGVuIGdvaW5nIHRocm91Z2gKICAgICAvLyBwYWdlcyB3aXRoIHRoZSBzcGFjZSBiYXIsIGluIHBpeGVscy4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFHRV9TQ1JPTExfT1ZFUkxBUCA9IDI0OwpAQCAtNTU3LDEwICs1MjIsNyBAQAogICAgIC8vIHRpbWUgZm9yIHRoZSBsb25nZXN0IHNjcm9sbCBhbmltYXRpb24KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0RVUkFUSU9OID0gNzUwOyAgIC8vIG1pbGxpc2Vjb25kcwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTElERV9USVRMRV9EVVJBVElPTiA9IDUwMDsgICAvLyBtaWxsaXNlY29uZHMKLSAgICBwcml2YXRlIE92ZXJTY3JvbGxlciBtU2Nyb2xsZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jbk92ZXJTY3JvbGxNb2RlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgUGFpbnQgbU92ZXJTY3JvbGxCYWNrZ3JvdW5kOwotICAgIHByaXZhdGUgc3RhdGljIFBhaW50IG1PdmVyU2Nyb2xsQm9yZGVyOworICAgIHByaXZhdGUgU2Nyb2xsZXIgbVNjcm9sbGVyOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1XcmFwQ29udGVudDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9USU9OTEVTU19GQUxTRSAgICAgICAgICAgPSAwOwpAQCAtNTY5LDE1ICs1MzEsMjQgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9USU9OTEVTU19JR05PUkUgICAgICAgICAgPSAzOwogICAgIHByaXZhdGUgaW50IG1IZWxkTW90aW9ubGVzczsKIAotICAgIC8vIHdoZXRoZXIgc3VwcG9ydCBtdWx0aS10b3VjaAotICAgIHByaXZhdGUgYm9vbGVhbiBtU3VwcG9ydE11bHRpVG91Y2g7Ci0gICAgLy8gdXNlIHRoZSBmcmFtZXdvcmsncyBTY2FsZUdlc3R1cmVEZXRlY3RvciB0byBoYW5kbGUgbXVsdGktdG91Y2gKLSAgICBwcml2YXRlIFNjYWxlR2VzdHVyZURldGVjdG9yIG1TY2FsZURldGVjdG9yOworICAgIC8vIEFuIGluc3RhbmNlIGZvciBpbmplY3RpbmcgYWNjZXNzaWJpbGl0eSBpbiBXZWJWaWV3cyB3aXRoIGRpc2FibGVkCisgICAgLy8gSmF2YVNjcmlwdCBvciBvbmVzIGZvciB3aGljaCBubyBhY2Nlc3NpYmlsaXR5IHNjcmlwdCBleGlzdHMKKyAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlJbmplY3RvciBtQWNjZXNzaWJpbGl0eUluamVjdG9yOwogCi0gICAgLy8gdGhlIGFuY2hvciBwb2ludCBpbiB0aGUgZG9jdW1lbnQgc3BhY2Ugd2hlcmUgVklFV19TSVpFX0NIQU5HRUQgc2hvdWxkCi0gICAgLy8gYXBwbHkgdG8KLSAgICBwcml2YXRlIGludCBtQW5jaG9yWDsKLSAgICBwcml2YXRlIGludCBtQW5jaG9yWTsKKyAgICAvLyB0aGUgY29sb3IgdXNlZCB0byBoaWdobGlnaHQgdGhlIHRvdWNoIHJlY3RhbmdsZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbUhpZ2h0bGlnaHRDb2xvciA9IDB4MzMwMDAwMDA7CisgICAgLy8gdGhlIHJvdW5kIGNvcm5lciBmb3IgdGhlIGhpZ2hsaWdodCBwYXRoCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgVE9VQ0hfSElHSExJR0hUX0FSQyA9IDUuMGY7CisgICAgLy8gdGhlIHJlZ2lvbiBpbmRpY2F0aW5nIHdoZXJlIHRoZSB1c2VyIHRvdWNoZWQgb24gdGhlIHNjcmVlbgorICAgIHByaXZhdGUgUmVnaW9uIG1Ub3VjaEhpZ2hsaWdodFJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKKyAgICAvLyB0aGUgcGFpbnQgZm9yIHRoZSB0b3VjaCBoaWdobGlnaHQKKyAgICBwcml2YXRlIFBhaW50IG1Ub3VjaEhpZ2h0bGlnaHRQYWludDsKKyAgICAvLyBkZWJ1ZyBvbmx5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19UT1VDSF9ISUdITElHSFQgPSB0cnVlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9ISUdITElHSFRfRUxBUFNFX1RJTUUgPSAyMDAwOworICAgIHByaXZhdGUgUGFpbnQgbVRvdWNoQ3Jvc3NIYWlyQ29sb3I7CisgICAgcHJpdmF0ZSBpbnQgbVRvdWNoSGlnaGxpZ2h0WDsKKyAgICBwcml2YXRlIGludCBtVG91Y2hIaWdobGlnaHRZOwogCiAgICAgLyoKICAgICAgKiBQcml2YXRlIG1lc3NhZ2UgaWRzCkBAIC02MTEsNyArNTgyLDcgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IFdFQkNPUkVfSU5JVElBTElaRURfTVNHX0lEICAgICAgICAgPSAxMDc7CiAgICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfVEVYVEZJRUxEX1RFWFRfTVNHX0lEICAgICAgID0gMTA4OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX1pPT01fUkFOR0UgICAgICAgICAgICAgICAgICA9IDEwOTsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1PVkVfT1VUX09GX1BMVUdJTiAgICAgICAgICAgICAgICAgPSAxMTA7CisgICAgc3RhdGljIGZpbmFsIGludCBVTkhBTkRMRURfTkFWX0tFWSAgICAgICAgICAgICAgICAgID0gMTEwOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0xFQVJfVEVYVF9FTlRSWSAgICAgICAgICAgICAgICAgICA9IDExMTsKICAgICBzdGF0aWMgZmluYWwgaW50IFVQREFURV9URVhUX1NFTEVDVElPTl9NU0dfSUQgICAgICAgPSAxMTI7CiAgICAgc3RhdGljIGZpbmFsIGludCBTSE9XX1JFQ1RfTVNHX0lEICAgICAgICAgICAgICAgICAgID0gMTEzOwpAQCAtNjI1LDE2ICs1OTYsMTkgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IFNIT1dfRlVMTFNDUkVFTiAgICAgICAgICAgICAgICAgICAgPSAxMjA7CiAgICAgc3RhdGljIGZpbmFsIGludCBISURFX0ZVTExTQ1JFRU4gICAgICAgICAgICAgICAgICAgID0gMTIxOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgRE9NX0ZPQ1VTX0NIQU5HRUQgICAgICAgICAgICAgICAgICA9IDEyMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IElNTUVESUFURV9SRVBBSU5UX01TR19JRCAgICAgICAgICAgPSAxMjM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBTRVRfUk9PVF9MQVlFUl9NU0dfSUQgICAgICAgICAgICAgID0gMTI0OworICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVQTEFDRV9CQVNFX0NPTlRFTlQgICAgICAgICAgICAgICA9IDEyMzsKKyAgICAvLyAxMjQ7CiAgICAgc3RhdGljIGZpbmFsIGludCBSRVRVUk5fTEFCRUwgICAgICAgICAgICAgICAgICAgICAgID0gMTI1OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgRklORF9BR0FJTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyNjsKICAgICBzdGF0aWMgZmluYWwgaW50IENFTlRFUl9GSVRfUkVDVCAgICAgICAgICAgICAgICAgICAgPSAxMjc7CiAgICAgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0tFWUJPQVJEX1dJVEhfU0VMRUNUSU9OX01TR19JRCA9IDEyODsKICAgICBzdGF0aWMgZmluYWwgaW50IFNFVF9TQ1JPTExCQVJfTU9ERVMgICAgICAgICAgICAgICAgPSAxMjk7CisgICAgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RJT05fU1RSSU5HX0NIQU5HRUQgICAgICAgICAgID0gMTMwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUyAgICAgICAgICA9IDEzMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFNBVkVfV0VCQVJDSElWRV9GSU5JU0hFRCAgICAgICAgICAgPSAxMzI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfUEFDS0FHRV9NU0dfSUQgPSBTQ1JPTExfVE9fTVNHX0lEOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVNUX1BBQ0tBR0VfTVNHX0lEID0gU0VUX1NDUk9MTEJBUl9NT0RFUzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9QQUNLQUdFX01TR19JRCA9IFNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFM7CiAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gSGFuZGxlclByaXZhdGVEZWJ1Z1N0cmluZyA9IHsKICAgICAgICAgIlJFTUVNQkVSX1BBU1NXT1JEIiwgLy8gICAgICAgICAgICAgID0gMTsKQEAgLTY1OSw3ICs2MzMsNyBAQAogICAgICAgICAiV0VCQ09SRV9JTklUSUFMSVpFRF9NU0dfSUQiLCAvLyAgICAgPSAxMDc7CiAgICAgICAgICJVUERBVEVfVEVYVEZJRUxEX1RFWFRfTVNHX0lEIiwgLy8gICA9IDEwODsKICAgICAgICAgIlVQREFURV9aT09NX1JBTkdFIiwgLy8gICAgICAgICAgICAgID0gMTA5OwotICAgICAgICAiTU9WRV9PVVRfT0ZfUExVR0lOIiwgLy8gICAgICAgICAgICAgPSAxMTA7CisgICAgICAgICJVTkhBTkRMRURfTkFWX0tFWSIsIC8vICAgICAgICAgICAgICA9IDExMDsKICAgICAgICAgIkNMRUFSX1RFWFRfRU5UUlkiLCAvLyAgICAgICAgICAgICAgID0gMTExOwogICAgICAgICAiVVBEQVRFX1RFWFRfU0VMRUNUSU9OX01TR19JRCIsIC8vICAgPSAxMTI7CiAgICAgICAgICJTSE9XX1JFQ1RfTVNHX0lEIiwgLy8gICAgICAgICAgICAgICA9IDExMzsKQEAgLTY3MiwxOCArNjQ2LDIxIEBACiAgICAgICAgICJTSE9XX0ZVTExTQ1JFRU4iLCAvLyAgICAgICAgICAgICAgICA9IDEyMDsKICAgICAgICAgIkhJREVfRlVMTFNDUkVFTiIsIC8vICAgICAgICAgICAgICAgID0gMTIxOwogICAgICAgICAiRE9NX0ZPQ1VTX0NIQU5HRUQiLCAvLyAgICAgICAgICAgICAgPSAxMjI7Ci0gICAgICAgICJJTU1FRElBVEVfUkVQQUlOVF9NU0dfSUQiLCAvLyAgICAgICA9IDEyMzsKLSAgICAgICAgIlNFVF9ST09UX0xBWUVSX01TR19JRCIsIC8vICAgICAgICAgID0gMTI0OworICAgICAgICAiUkVQTEFDRV9CQVNFX0NPTlRFTlQiLCAvLyAgICAgICAgICAgPSAxMjM7CisgICAgICAgICIxMjQiLCAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyNDsKICAgICAgICAgIlJFVFVSTl9MQUJFTCIsIC8vICAgICAgICAgICAgICAgICAgID0gMTI1OwogICAgICAgICAiRklORF9BR0FJTiIsIC8vICAgICAgICAgICAgICAgICAgICAgPSAxMjY7CiAgICAgICAgICJDRU5URVJfRklUX1JFQ1QiLCAvLyAgICAgICAgICAgICAgICA9IDEyNzsKICAgICAgICAgIlJFUVVFU1RfS0VZQk9BUkRfV0lUSF9TRUxFQ1RJT05fTVNHX0lEIiwgLy8gPSAxMjg7Ci0gICAgICAgICJTRVRfU0NST0xMQkFSX01PREVTIiAvLyAgICAgICAgICAgICA9IDEyOTsKKyAgICAgICAgIlNFVF9TQ1JPTExCQVJfTU9ERVMiLCAvLyAgICAgICAgICAgID0gMTI5OworICAgICAgICAiU0VMRUNUSU9OX1NUUklOR19DSEFOR0VEIiwgLy8gICAgICAgPSAxMzA7CisgICAgICAgICJTRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTIiwgLy8gICAgICA9IDEzMTsKKyAgICAgICAgIlNBVkVfV0VCQVJDSElWRV9GSU5JU0hFRCIgLy8gICAgICAgID0gMTMyOwogICAgIH07CiAKICAgICAvLyBJZiB0aGUgc2l0ZSBkb2Vzbid0IHVzZSB0aGUgdmlld3BvcnQgbWV0YSB0YWcgdG8gc3BlY2lmeSB0aGUgdmlld3BvcnQsCiAgICAgLy8gdXNlIERFRkFVTFRfVklFV1BPUlRfV0lEVEggYXMgdGhlIGRlZmF1bHQgdmlld3BvcnQgd2lkdGgKLSAgICBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVklFV1BPUlRfV0lEVEggPSA4MDA7CisgICAgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1ZJRVdQT1JUX1dJRFRIID0gMTA0MDsKIAogICAgIC8vIG5vcm1hbGx5IHdlIHRyeSB0byBmaXQgdGhlIGNvbnRlbnQgdG8gdGhlIG1pbmltdW0gcHJlZmVycmVkIHdpZHRoCiAgICAgLy8gY2FsY3VsYXRlZCBieSB0aGUgV2Via2l0LiBUbyBhdm9pZCB0aGUgYmFkIGJlaGF2aW9yIHdoZW4gc29tZSBzaXRlJ3MKQEAgLTY5MSw0OSArNjY4LDkgQEAKICAgICAvLyB0aGUgbWluaW11bSBwcmVmZXJyZWQgd2lkdGggaXMgaHVnZSwgYW4gdXBwZXIgbGltaXQgaXMgbmVlZGVkLgogICAgIHN0YXRpYyBpbnQgc01heFZpZXdwb3J0V2lkdGggPSBERUZBVUxUX1ZJRVdQT1JUX1dJRFRIOwogCi0gICAgLy8gZGVmYXVsdCBzY2FsZSBsaW1pdC4gRGVwZW5kaW5nIG9uIHRoZSBkaXNwbGF5IGRlbnNpdHkKLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBERUZBVUxUX01BWF9aT09NX1NDQUxFOwotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IERFRkFVTFRfTUlOX1pPT01fU0NBTEU7Ci0gICAgLy8gc2NhbGUgbGltaXQsIHdoaWNoIGNhbiBiZSBzZXQgdGhyb3VnaCB2aWV3cG9ydCBtZXRhIHRhZyBpbiB0aGUgd2ViIHBhZ2UKLSAgICBwcml2YXRlIGZsb2F0IG1NYXhab29tU2NhbGU7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtTWluWm9vbVNjYWxlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtTWluWm9vbVNjYWxlRml4ZWQgPSB0cnVlOwotCiAgICAgLy8gaW5pdGlhbCBzY2FsZSBpbiBwZXJjZW50LiAwIG1lYW5zIHVzaW5nIGRlZmF1bHQuCiAgICAgcHJpdmF0ZSBpbnQgbUluaXRpYWxTY2FsZUluUGVyY2VudCA9IDA7CiAKLSAgICAvLyB3aGlsZSBpbiB0aGUgem9vbSBvdmVydmlldyBtb2RlLCB0aGUgcGFnZSdzIHdpZHRoIGlzIGZ1bGx5IGZpdCB0byB0aGUKLSAgICAvLyBjdXJyZW50IHdpbmRvdy4gVGhlIHBhZ2UgaXMgYWxpdmUsIGluIGFub3RoZXIgd29yZHMsIHlvdSBjYW4gY2xpY2sgdG8KLSAgICAvLyBmb2xsb3cgdGhlIGxpbmtzLiBEb3VibGUgdGFwIHdpbGwgdG9nZ2xlIGJldHdlZW4gem9vbSBvdmVydmlldyBtb2RlIGFuZAotICAgIC8vIHRoZSBsYXN0IHpvb20gc2NhbGUuCi0gICAgYm9vbGVhbiBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLQotICAgIC8vIGlkZWFsbHkgbVpvb21PdmVydmlld1dpZHRoIHNob3VsZCBiZSBtQ29udGVudFdpZHRoLiBCdXQgc2l0ZXMgbGlrZSBlc3BuLAotICAgIC8vIGVuZ2FkZ2V0IGFsd2F5cyBoYXZlIHdpZGVyIG1Db250ZW50V2lkdGggbm8gbWF0dGVyIHdoYXQgdmlld3BvcnQgc2l6ZSBpcy4KLSAgICBpbnQgbVpvb21PdmVydmlld1dpZHRoID0gREVGQVVMVF9WSUVXUE9SVF9XSURUSDsKLSAgICBmbG9hdCBtVGV4dFdyYXBTY2FsZTsKLQotICAgIC8vIGRlZmF1bHQgc2NhbGUuIERlcGVuZGluZyBvbiB0aGUgZGlzcGxheSBkZW5zaXR5LgotICAgIHN0YXRpYyBpbnQgREVGQVVMVF9TQ0FMRV9QRVJDRU5UOwotICAgIHByaXZhdGUgZmxvYXQgbURlZmF1bHRTY2FsZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UID0gMC4wMWY7Ci0KLSAgICAvLyBzZXQgdG8gdHJ1ZSB0ZW1wb3JhcmlseSBkdXJpbmcgU2NhbGVHZXN0dXJlIHRyaWdnZXJlZCB6b29tCi0gICAgcHJpdmF0ZSBib29sZWFuIG1QcmV2aWV3Wm9vbU9ubHkgPSBmYWxzZTsKLQotICAgIC8vIGNvbXB1dGVkIHNjYWxlIGFuZCBpbnZlcnNlLCBmcm9tIG1ab29tV2lkdGguCi0gICAgcHJpdmF0ZSBmbG9hdCBtQWN0dWFsU2NhbGU7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtSW52QWN0dWFsU2NhbGU7Ci0gICAgLy8gaWYgdGhpcyBpcyBub24temVybywgaXQgaXMgdXNlZCBvbiBkcmF3aW5nIHJhdGhlciB0aGFuIG1BY3R1YWxTY2FsZQotICAgIHByaXZhdGUgZmxvYXQgbVpvb21TY2FsZTsKLSAgICBwcml2YXRlIGZsb2F0IG1JbnZJbml0aWFsWm9vbVNjYWxlOwotICAgIHByaXZhdGUgZmxvYXQgbUludkZpbmFsWm9vbVNjYWxlOwotICAgIHByaXZhdGUgaW50IG1Jbml0aWFsU2Nyb2xsWDsKLSAgICBwcml2YXRlIGludCBtSW5pdGlhbFNjcm9sbFk7Ci0gICAgcHJpdmF0ZSBsb25nIG1ab29tU3RhcnQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpPT01fQU5JTUFUSU9OX0xFTkdUSCA9IDUwMDsKLQogICAgIHByaXZhdGUgYm9vbGVhbiBtVXNlclNjcm9sbCA9IGZhbHNlOwogCiAgICAgcHJpdmF0ZSBpbnQgbVNuYXBTY3JvbGxNb2RlID0gU05BUF9OT05FOwpAQCAtNzU3LDYgKzY5NCwxOSBAQAogICAgIHByaXZhdGUgaW50IG1Ib3Jpem9udGFsU2Nyb2xsQmFyTW9kZSA9IFNDUk9MTEJBUl9BVVRPOwogICAgIHByaXZhdGUgaW50IG1WZXJ0aWNhbFNjcm9sbEJhck1vZGUgPSBTQ1JPTExCQVJfQVVUTzsKIAorICAgIC8vIHRoZSBhbGlhcyB2aWEgd2hpY2ggYWNjZXNzaWJpbGl0eSBKYXZhU2NyaXB0IGludGVyZmFjZSBpcyBleHBvc2VkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUFTX0FDQ0VTU0lCSUxJVFlfSlNfSU5URVJGQUNFID0gImFjY2Vzc2liaWxpdHkiOworCisgICAgLy8gSmF2YVNjcmlwdCB0byBpbmplY3QgdGhlIHNjcmlwdCBjaG9vc2VyIHdoaWNoIHdpbGwKKyAgICAvLyBwaWNrIHRoZSByaWdodCBzY3JpcHQgZm9yIHRoZSBjdXJyZW50IFVSTAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NFU1NJQklMSVRZX1NDUklQVF9DSE9PU0VSX0pBVkFTQ1JJUFQgPQorICAgICAgICAiamF2YXNjcmlwdDooZnVuY3Rpb24oKSB7IiArCisgICAgICAgICIgICAgdmFyIGNob29zZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsiICsKKyAgICAgICAgIiAgICBjaG9vc2VyLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsiICsKKyAgICAgICAgIiAgICBjaG9vc2VyLnNyYyA9ICdodHRwczovL3NzbC5nc3RhdGljLmNvbS9hY2Nlc3NpYmlsaXR5L2phdmFzY3JpcHQvYW5kcm9pZC9BbmRyb2lkU2NyaXB0Q2hvb3Nlci51c2VyLmpzJzsiICsKKyAgICAgICAgIiAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKGNob29zZXIpOyIgKworICAgICAgICAiICB9KSgpOyI7CisKICAgICAvLyBVc2VkIHRvIG1hdGNoIGtleSBkb3ducyBhbmQga2V5IHVwcwogICAgIHByaXZhdGUgYm9vbGVhbiBtR290S2V5RG93bjsKIApAQCAtODYxLDQzICs4MTEsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gVGhlIFZpZXcgY29udGFpbmluZyB0aGUgem9vbSBjb250cm9scwotICAgIHByaXZhdGUgRXh0ZW5kZWRab29tQ29udHJvbHMgbVpvb21Db250cm9sczsKLSAgICBwcml2YXRlIFJ1bm5hYmxlIG1ab29tQ29udHJvbFJ1bm5hYmxlOwotCi0gICAgLy8gbVpvb21CdXR0b25zQ29udHJvbGxlciB3aWxsIGJlIGxhenkgaW5pdGlhbGl6ZWQgaW4KLSAgICAvLyBnZXRab29tQnV0dG9uc0NvbnRyb2xsZXIoKSB0byBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlLgotICAgIHByaXZhdGUgWm9vbUJ1dHRvbnNDb250cm9sbGVyIG1ab29tQnV0dG9uc0NvbnRyb2xsZXI7Ci0KLSAgICAvLyBUaGVzZSBrZWVwIHRyYWNrIG9mIHRoZSBjZW50ZXIgcG9pbnQgb2YgdGhlIHpvb20uICBUaGV5IGFyZSB1c2VkIHRvCi0gICAgLy8gZGV0ZXJtaW5lIHRoZSBwb2ludCBhcm91bmQgd2hpY2ggd2Ugc2hvdWxkIHpvb20uCi0gICAgcHJpdmF0ZSBmbG9hdCBtWm9vbUNlbnRlclg7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtWm9vbUNlbnRlclk7Ci0KLSAgICBwcml2YXRlIFpvb21CdXR0b25zQ29udHJvbGxlci5Pblpvb21MaXN0ZW5lciBtWm9vbUxpc3RlbmVyID0KLSAgICAgICAgICAgIG5ldyBab29tQnV0dG9uc0NvbnRyb2xsZXIuT25ab29tTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5Q2hhbmdlZChib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKLSAgICAgICAgICAgICAgICAvLyBCcmluZyBiYWNrIHRoZSBoaWRkZW4gem9vbSBjb250cm9scy4KLSAgICAgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpLnNldFZpc2liaWxpdHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVpvb21CdXR0b25zRW5hYmxlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25ab29tKGJvb2xlYW4gem9vbUluKSB7Ci0gICAgICAgICAgICBpZiAoem9vbUluKSB7Ci0gICAgICAgICAgICAgICAgem9vbUluKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHpvb21PdXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXBkYXRlWm9vbUJ1dHRvbnNFbmFibGVkKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0IGEgbmV3IFdlYlZpZXcgd2l0aCBhIENvbnRleHQgb2JqZWN0LgogICAgICAqIEBwYXJhbSBjb250ZXh0IEEgQ29udGV4dCBvYmplY3QgdXNlZCB0byBhY2Nlc3MgYXBwbGljYXRpb24gYXNzZXRzLgpAQCAtOTIyLDcgKzgzNSwxOCBAQAogICAgICAqIEBwYXJhbSBkZWZTdHlsZSBUaGUgZGVmYXVsdCBzdHlsZSByZXNvdXJjZSBJRC4KICAgICAgKi8KICAgICBwdWJsaWMgV2ViVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCBudWxsKTsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgV2ViVmlldyB3aXRoIGxheW91dCBwYXJhbWV0ZXJzIGFuZCBhIGRlZmF1bHQgc3R5bGUuCisgICAgICogQHBhcmFtIGNvbnRleHQgQSBDb250ZXh0IG9iamVjdCB1c2VkIHRvIGFjY2VzcyBhcHBsaWNhdGlvbiBhc3NldHMuCisgICAgICogQHBhcmFtIGF0dHJzIEFuIEF0dHJpYnV0ZVNldCBwYXNzZWQgdG8gb3VyIHBhcmVudC4KKyAgICAgKiBAcGFyYW0gZGVmU3R5bGUgVGhlIGRlZmF1bHQgc3R5bGUgcmVzb3VyY2UgSUQuCisgICAgICovCisgICAgcHVibGljIFdlYlZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSwKKyAgICAgICAgICAgIGJvb2xlYW4gcHJpdmF0ZUJyb3dzaW5nKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCBudWxsLCBwcml2YXRlQnJvd3NpbmcpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTMzLDUxICs4NTcsMTMyIEBACiAgICAgICogQHBhcmFtIGNvbnRleHQgQSBDb250ZXh0IG9iamVjdCB1c2VkIHRvIGFjY2VzcyBhcHBsaWNhdGlvbiBhc3NldHMuCiAgICAgICogQHBhcmFtIGF0dHJzIEFuIEF0dHJpYnV0ZVNldCBwYXNzZWQgdG8gb3VyIHBhcmVudC4KICAgICAgKiBAcGFyYW0gZGVmU3R5bGUgVGhlIGRlZmF1bHQgc3R5bGUgcmVzb3VyY2UgSUQuCi0gICAgICogQHBhcmFtIGphdmFzY3JpcHRJbnRlcmZhY2VzIGlzIGEgTWFwIG9mIGludGFyZWZhY2UgbmFtZXMsIGFzIGtleXMsIGFuZAorICAgICAqIEBwYXJhbSBqYXZhc2NyaXB0SW50ZXJmYWNlcyBpcyBhIE1hcCBvZiBpbnRlcmZhY2UgbmFtZXMsIGFzIGtleXMsIGFuZAogICAgICAqIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhvc2UgaW50ZXJmYWNlcywgYXMgdmFsdWVzLgogICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFdlYlZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSwKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gamF2YXNjcmlwdEludGVyZmFjZXMpIHsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gamF2YXNjcmlwdEludGVyZmFjZXMsIGJvb2xlYW4gcHJpdmF0ZUJyb3dzaW5nKSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7Ci0gICAgICAgIGluaXQoKTsKKworICAgICAgICBpZiAoQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UoY29udGV4dCkuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChqYXZhc2NyaXB0SW50ZXJmYWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgamF2YXNjcmlwdEludGVyZmFjZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4cG9zZUFjY2Vzc2liaWxpdHlKYXZhU2NyaXB0QXBpKGphdmFzY3JpcHRJbnRlcmZhY2VzKTsKKyAgICAgICAgfQogCiAgICAgICAgIG1DYWxsYmFja1Byb3h5ID0gbmV3IENhbGxiYWNrUHJveHkoY29udGV4dCwgdGhpcyk7CiAgICAgICAgIG1WaWV3TWFuYWdlciA9IG5ldyBWaWV3TWFuYWdlcih0aGlzKTsKICAgICAgICAgbVdlYlZpZXdDb3JlID0gbmV3IFdlYlZpZXdDb3JlKGNvbnRleHQsIHRoaXMsIG1DYWxsYmFja1Byb3h5LCBqYXZhc2NyaXB0SW50ZXJmYWNlcyk7CiAgICAgICAgIG1EYXRhYmFzZSA9IFdlYlZpZXdEYXRhYmFzZS5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgICAgbVNjcm9sbGVyID0gbmV3IE92ZXJTY3JvbGxlcihjb250ZXh0KTsKKyAgICAgICAgbVNjcm9sbGVyID0gbmV3IFNjcm9sbGVyKGNvbnRleHQpOworICAgICAgICBtWm9vbU1hbmFnZXIgPSBuZXcgWm9vbU1hbmFnZXIodGhpcywgbUNhbGxiYWNrUHJveHkpOwogCisgICAgICAgIC8qIFRoZSBpbml0IG1ldGhvZCBtdXN0IGZvbGxvdyB0aGUgY3JlYXRpb24gb2YgY2VydGFpbiBtZW1iZXIgdmFyaWFibGVzLAorICAgICAgICAgKiBzdWNoIGFzIHRoZSBtWm9vbU1hbmFnZXIuCisgICAgICAgICAqLworICAgICAgICBpbml0KCk7CisgICAgICAgIHNldHVwUGFja2FnZUxpc3RlbmVyKGNvbnRleHQpOwogICAgICAgICB1cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChjb250ZXh0KTsKKworICAgICAgICBpZiAocHJpdmF0ZUJyb3dzaW5nKSB7CisgICAgICAgICAgICBzdGFydFByaXZhdGVCcm93c2luZygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGUgaW50ZW50IHJlY2VpdmVyIHRoYXQgbW9uaXRvcnMgZm9yIGNoYW5nZXMgdG8gcmVsZXZhbnQgcGFja2FnZXMgKGUuZy4sCisgICAgICogc0dvb2dsZUFwcHMpIGFuZCBub3RpZmllcyBXZWJWaWV3Q29yZSBvZiB0aGVpciBleGlzdGVuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQnJvYWRjYXN0UmVjZWl2ZXIgc1BhY2thZ2VJbnN0YWxsYXRpb25SZWNlaXZlciA9IG51bGw7CisKKyAgICAvKgorICAgICAqIEEgc2V0IG9mIEdvb2dsZSBwYWNrYWdlcyB3ZSBtb25pdG9yIGZvciB0aGUKKyAgICAgKiBuYXZpZ2F0b3IuaXNBcHBsaWNhdGlvbkluc3RhbGxlZCgpIEFQSS4gQWRkIGFkZGl0aW9uYWwgcGFja2FnZXMgYXMKKyAgICAgKiBuZWVkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gc0dvb2dsZUFwcHM7CisgICAgc3RhdGljIHsKKyAgICAgICAgc0dvb2dsZUFwcHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIHNHb29nbGVBcHBzLmFkZCgiY29tLmdvb2dsZS5hbmRyb2lkLnlvdXR1YmUiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0dXBQYWNrYWdlTGlzdGVuZXIoQ29udGV4dCBjb250ZXh0KSB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogd2UgbXVzdCBzeW5jaHJvbml6ZSB0aGUgaW5zdGFuY2UgY2hlY2sgYW5kIHRoZSBjcmVhdGlvbiBvZiB0aGUKKyAgICAgICAgICogcmVjZWl2ZXIgdG8gZW5zdXJlIHRoYXQgb25seSBPTkUgcmVjZWl2ZXIgZXhpc3RzIGZvciBhbGwgV2ViVmlldworICAgICAgICAgKiBpbnN0YW5jZXMuCisgICAgICAgICAqLworICAgICAgICBzeW5jaHJvbml6ZWQgKFdlYlZpZXcuY2xhc3MpIHsKKworICAgICAgICAgICAgLy8gaWYgdGhlIHJlY2VpdmVyIGFscmVhZHkgZXhpc3RzIHRoZW4gd2UgZG8gbm90IG5lZWQgdG8gcmVnaXN0ZXIgaXQKKyAgICAgICAgICAgIC8vIGFnYWluCisgICAgICAgICAgICBpZiAoc1BhY2thZ2VJbnN0YWxsYXRpb25SZWNlaXZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfQURERUQpOworICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfUkVNT1ZFRCk7CisgICAgICAgICAgICBmaWx0ZXIuYWRkRGF0YVNjaGVtZSgicGFja2FnZSIpOworICAgICAgICAgICAgc1BhY2thZ2VJbnN0YWxsYXRpb25SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lID0gaW50ZW50LmdldERhdGEoKS5nZXRTY2hlbWVTcGVjaWZpY1BhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZXBsYWNpbmcgPSBpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKEludGVudC5FWFRSQV9SRVBMQUNJTkcsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRU1PVkVELmVxdWFscyhhY3Rpb24pICYmIHJlcGxhY2luZykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXQgaXMgcmVwbGFjaW5nLCByZWZyZXNoUGx1Z2lucygpIHdoZW4gYWRkaW5nCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoc0dvb2dsZUFwcHMuY29udGFpbnMocGFja2FnZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSW50ZW50LkFDVElPTl9QQUNLQUdFX0FEREVELmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkFERF9QQUNLQUdFX05BTUUsIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlJFTU9WRV9QQUNLQUdFX05BTUUsIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIFBsdWdpbk1hbmFnZXIgcG0gPSBQbHVnaW5NYW5hZ2VyLmdldEluc3RhbmNlKGNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICBpZiAocG0uY29udGFpbnNQbHVnaW5QZXJtaXNzaW9uQW5kU2lnbmF0dXJlcyhwYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBtLnJlZnJlc2hQbHVnaW5zKEludGVudC5BQ1RJT05fUEFDS0FHRV9BRERFRC5lcXVhbHMoYWN0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBjb250ZXh0LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpLnJlZ2lzdGVyUmVjZWl2ZXIoc1BhY2thZ2VJbnN0YWxsYXRpb25SZWNlaXZlciwgZmlsdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGlmIGFueSBvZiB0aGUgbW9uaXRvcmVkIGFwcHMgYXJlIGFscmVhZHkgaW5zdGFsbGVkCisgICAgICAgIEFzeW5jVGFzazxWb2lkLCBWb2lkLCBTZXQ8U3RyaW5nPj4gdGFzayA9IG5ldyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgU2V0PFN0cmluZz4+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBkb0luQmFja2dyb3VuZChWb2lkLi4uIHVudXNlZCkgeworICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGluc3RhbGxlZFBhY2thZ2VzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgICAgICAgICBMaXN0PFBhY2thZ2VJbmZvPiBwYWNrYWdlcyA9IHBtLmdldEluc3RhbGxlZFBhY2thZ2VzKDApOworICAgICAgICAgICAgICAgIGZvciAoUGFja2FnZUluZm8gcCA6IHBhY2thZ2VzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzR29vZ2xlQXBwcy5jb250YWlucyhwLnBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkUGFja2FnZXMuYWRkKHAucGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YWxsZWRQYWNrYWdlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRXhlY3V0ZXMgb24gdGhlIFVJIHRocmVhZAorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKFNldDxTdHJpbmc+IGluc3RhbGxlZFBhY2thZ2VzKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkFERF9QQUNLQUdFX05BTUVTLCBpbnN0YWxsZWRQYWNrYWdlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHRhc2suZXhlY3V0ZSgpOwogICAgIH0KIAogICAgIHZvaWQgdXBkYXRlTXVsdGlUb3VjaFN1cHBvcnQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgbVN1cHBvcnRNdWx0aVRvdWNoID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoCi0gICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9UT1VDSFNDUkVFTl9NVUxUSVRPVUNIKQotICAgICAgICAgICAgICAgICYmIHNldHRpbmdzLnN1cHBvcnRab29tKCkgJiYgc2V0dGluZ3MuZ2V0QnVpbHRJblpvb21Db250cm9scygpOwotICAgICAgICBpZiAobVN1cHBvcnRNdWx0aVRvdWNoICYmIChtU2NhbGVEZXRlY3RvciA9PSBudWxsKSkgewotICAgICAgICAgICAgbVNjYWxlRGV0ZWN0b3IgPSBuZXcgU2NhbGVHZXN0dXJlRGV0ZWN0b3IoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFNjYWxlRGV0ZWN0b3JMaXN0ZW5lcigpKTsKLSAgICAgICAgfSBlbHNlIGlmICghbVN1cHBvcnRNdWx0aVRvdWNoICYmIChtU2NhbGVEZXRlY3RvciAhPSBudWxsKSkgewotICAgICAgICAgICAgbVNjYWxlRGV0ZWN0b3IgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVpvb21CdXR0b25zRW5hYmxlZCgpIHsKLSAgICAgICAgaWYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICBib29sZWFuIGNhblpvb21JbiA9IG1BY3R1YWxTY2FsZSA8IG1NYXhab29tU2NhbGU7Ci0gICAgICAgIGJvb2xlYW4gY2FuWm9vbU91dCA9IG1BY3R1YWxTY2FsZSA+IG1NaW5ab29tU2NhbGUgJiYgIW1Jblpvb21PdmVydmlldzsKLSAgICAgICAgaWYgKCFjYW5ab29tSW4gJiYgIWNhblpvb21PdXQpIHsKLSAgICAgICAgICAgIC8vIEhpZGUgdGhlIHpvb20gaW4gYW5kIG91dCBidXR0b25zLCBhcyB3ZWxsIGFzIHRoZSBmaXQgdG8gcGFnZQotICAgICAgICAgICAgLy8gYnV0dG9uLCBpZiB0aGUgcGFnZSBjYW5ub3Qgem9vbQotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5nZXRab29tQ29udHJvbHMoKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTZXQgZWFjaCBvbmUgaW5kaXZpZHVhbGx5LCBhcyBhIHBhZ2UgbWF5IGJlIGFibGUgdG8gem9vbSBpbgotICAgICAgICAgICAgLy8gb3Igb3V0LgotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRab29tSW5FbmFibGVkKGNhblpvb21Jbik7Ci0gICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFpvb21PdXRFbmFibGVkKGNhblpvb21PdXQpOwotICAgICAgICB9CisgICAgICAgIG1ab29tTWFuYWdlci51cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChjb250ZXh0KTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKQEAgLTk4Niw3ICs5OTEsNiBAQAogICAgICAgICBzZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKICAgICAgICAgc2V0Q2xpY2thYmxlKHRydWUpOwogICAgICAgICBzZXRMb25nQ2xpY2thYmxlKHRydWUpOwotICAgICAgICBzZXRPdmVyc2Nyb2xsTW9kZShPVkVSU0NST0xMX05FVkVSKTsKIAogICAgICAgICBmaW5hbCBWaWV3Q29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gVmlld0NvbmZpZ3VyYXRpb24uZ2V0KGdldENvbnRleHQoKSk7CiAgICAgICAgIGludCBzbG9wID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRUb3VjaFNsb3AoKTsKQEAgLTk5OCwzNCArMTAwMiwzOCBAQAogICAgICAgICAvLyB1c2Ugb25lIGxpbmUgaGVpZ2h0LCAxNiBiYXNlZCBvbiBvdXIgY3VycmVudCBkZWZhdWx0IGZvbnQsIGZvciBob3cKICAgICAgICAgLy8gZmFyIHdlIGFsbG93IGEgdG91Y2ggYmUgYXdheSBmcm9tIHRoZSBlZGdlIG9mIGEgbGluawogICAgICAgICBtTmF2U2xvcCA9IChpbnQpICgxNiAqIGRlbnNpdHkpOwotICAgICAgICAvLyBkZW5zaXR5IGFkanVzdGVkIHNjYWxlIGZhY3RvcnMKLSAgICAgICAgREVGQVVMVF9TQ0FMRV9QRVJDRU5UID0gKGludCkgKDEwMCAqIGRlbnNpdHkpOwotICAgICAgICBtRGVmYXVsdFNjYWxlID0gZGVuc2l0eTsKLSAgICAgICAgbUFjdHVhbFNjYWxlID0gZGVuc2l0eTsKLSAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIGRlbnNpdHk7Ci0gICAgICAgIG1UZXh0V3JhcFNjYWxlID0gZGVuc2l0eTsKLSAgICAgICAgREVGQVVMVF9NQVhfWk9PTV9TQ0FMRSA9IDQuMGYgKiBkZW5zaXR5OwotICAgICAgICBERUZBVUxUX01JTl9aT09NX1NDQUxFID0gMC4yNWYgKiBkZW5zaXR5OwotICAgICAgICBtTWF4Wm9vbVNjYWxlID0gREVGQVVMVF9NQVhfWk9PTV9TQ0FMRTsKLSAgICAgICAgbU1pblpvb21TY2FsZSA9IERFRkFVTFRfTUlOX1pPT01fU0NBTEU7CisgICAgICAgIG1ab29tTWFuYWdlci5pbml0KGRlbnNpdHkpOwogICAgICAgICBtTWF4aW11bUZsaW5nID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRNYXhpbXVtRmxpbmdWZWxvY2l0eSgpOworCisgICAgICAgIC8vIENvbXB1dGUgdGhlIGludmVyc2Ugb2YgdGhlIGRlbnNpdHkgc3F1YXJlZC4KKyAgICAgICAgRFJBR19MQVlFUl9JTlZFUlNFX0RFTlNJVFlfU1FVQVJFRCA9IDEgLyAoZGVuc2l0eSAqIGRlbnNpdHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4cG9zZXMgYWNjZXNzaWJpbGl0eSBBUElzIHRvIEphdmFTY3JpcHQgYnkgYXBwZW5kaW5nIHRoZW0gdG8gdGhlIEphdmFTY3JpcHQKKyAgICAgKiBpbnRlcmZhY2VzIG1hcCBwcm92aWRlZCBieSB0aGUgV2ViVmlldyBjbGllbnQuIEluIGNhc2Ugb2YgY29uZmxpY3RpbmcKKyAgICAgKiBhbGlhcyB3aXRoIHRoZSBvbmUgb2YgdGhlIGFjY2Vzc2liaWxpdHkgQVBJIHRoZSB1c2VyIHNwZWNpZmllZCBvbmUgd2lucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXZhc2NyaXB0SW50ZXJmYWNlcyBBIG1hcCB3aXRoIGludGVyZmFjZXMgdG8gYmUgZXhwb3NlZCB0byBKYXZhU2NyaXB0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBleHBvc2VBY2Nlc3NpYmlsaXR5SmF2YVNjcmlwdEFwaShNYXA8U3RyaW5nLCBPYmplY3Q+IGphdmFzY3JpcHRJbnRlcmZhY2VzKSB7CisgICAgICAgIGlmIChqYXZhc2NyaXB0SW50ZXJmYWNlcy5jb250YWluc0tleShBTElBU19BQ0NFU1NJQklMSVRZX0pTX0lOVEVSRkFDRSkpIHsKKyAgICAgICAgICAgIExvZy53KExPR1RBRywgIkphdmFTY3JpcHQgaW50ZXJmYWNlIG1hcHBlZCB0byBcIiIgKyBBTElBU19BQ0NFU1NJQklMSVRZX0pTX0lOVEVSRkFDRQorICAgICAgICAgICAgICAgICAgICArICJcIiBvdmVycmlkZXMgdGhlIGFjY2Vzc2liaWxpdHkgQVBJIEphdmFTY3JpcHQgaW50ZXJmYWNlLiBObyBhY2Nlc3NpYmlsaXR5IgorICAgICAgICAgICAgICAgICAgICArICJBUEkgd2lsbCBiZSBleHBvc2VkIHRvIEphdmFTY3JpcHQhIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBleHBvc2UgdGhlIFRUUyBmb3Igbm93IC4uLgorICAgICAgICBqYXZhc2NyaXB0SW50ZXJmYWNlcy5wdXQoQUxJQVNfQUNDRVNTSUJJTElUWV9KU19JTlRFUkZBQ0UsCisgICAgICAgICAgICAgICAgbmV3IFRleHRUb1NwZWVjaChnZXRDb250ZXh0KCksIG51bGwpKTsKICAgICB9CiAKICAgICAvKiBwYWNrYWdlICovdm9pZCB1cGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoaW50IHpvb21EZW5zaXR5KSB7Ci0gICAgICAgIGZpbmFsIGZsb2F0IGRlbnNpdHkgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5CisgICAgICAgIGZpbmFsIGZsb2F0IGRlbnNpdHkgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHkKICAgICAgICAgICAgICAgICAqIDEwMCAvIHpvb21EZW5zaXR5OwotICAgICAgICBpZiAoTWF0aC5hYnMoZGVuc2l0eSAtIG1EZWZhdWx0U2NhbGUpID4gMC4wMSkgewotICAgICAgICAgICAgZmxvYXQgc2NhbGVGYWN0b3IgPSBkZW5zaXR5IC8gbURlZmF1bHRTY2FsZTsKLSAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgbGltaXRzCi0gICAgICAgICAgICBtTmF2U2xvcCA9IChpbnQpICgxNiAqIGRlbnNpdHkpOwotICAgICAgICAgICAgREVGQVVMVF9TQ0FMRV9QRVJDRU5UID0gKGludCkgKDEwMCAqIGRlbnNpdHkpOwotICAgICAgICAgICAgREVGQVVMVF9NQVhfWk9PTV9TQ0FMRSA9IDQuMGYgKiBkZW5zaXR5OwotICAgICAgICAgICAgREVGQVVMVF9NSU5fWk9PTV9TQ0FMRSA9IDAuMjVmICogZGVuc2l0eTsKLSAgICAgICAgICAgIG1EZWZhdWx0U2NhbGUgPSBkZW5zaXR5OwotICAgICAgICAgICAgbU1heFpvb21TY2FsZSAqPSBzY2FsZUZhY3RvcjsKLSAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgKj0gc2NhbGVGYWN0b3I7Ci0gICAgICAgICAgICBzZXROZXdab29tU2NhbGUobUFjdHVhbFNjYWxlICogc2NhbGVGYWN0b3IsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgfQorICAgICAgICBtTmF2U2xvcCA9IChpbnQpICgxNiAqIGRlbnNpdHkpOworICAgICAgICBtWm9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGRlbnNpdHkpOwogICAgIH0KIAogICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBvblNhdmVQYXNzd29yZChTdHJpbmcgc2NoZW1lUGx1c0hvc3QsIFN0cmluZyB1c2VybmFtZSwKQEAgLTExNDIsMTYgKzExNTAsMTcgQEAKICAgICAgKiByZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHRpdGxlYmFydmlldyAoaWYgYW55KS4gRG9lcyBub3QgY2FyZSBhYm91dAogICAgICAqIHNjcm9sbGluZwogICAgICAqLwotICAgIHByaXZhdGUgaW50IGdldFRpdGxlSGVpZ2h0KCkgeworICAgIGludCBnZXRUaXRsZUhlaWdodCgpIHsKICAgICAgICAgcmV0dXJuIG1UaXRsZUJhciAhPSBudWxsID8gbVRpdGxlQmFyLmdldEhlaWdodCgpIDogMDsKICAgICB9CiAKICAgICAvKgogICAgICAqIFJldHVybiB0aGUgYW1vdW50IG9mIHRoZSB0aXRsZWJhcnZpZXcgKGlmIGFueSkgdGhhdCBpcyB2aXNpYmxlCisgICAgICoKKyAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHByaXZhdGUgaW50IGdldFZpc2libGVUaXRsZUhlaWdodCgpIHsKLSAgICAgICAgLy8gbmVlZCB0byByZXN0cmljdCBtU2Nyb2xsWSBkdWUgdG8gb3ZlciBzY3JvbGwKLSAgICAgICAgcmV0dXJuIE1hdGgubWF4KGdldFRpdGxlSGVpZ2h0KCkgLSBNYXRoLm1heCgwLCBtU2Nyb2xsWSksIDApOworICAgIHB1YmxpYyBpbnQgZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCkgeworICAgICAgICByZXR1cm4gTWF0aC5tYXgoZ2V0VGl0bGVIZWlnaHQoKSAtIG1TY3JvbGxZLCAwKTsKICAgICB9CiAKICAgICAvKgpAQCAtMTIzOCw3ICsxMjQ3LDcgQEAKICAgICAgKiBtZXRob2RzIG1heSBiZSBjYWxsZWQgb24gYSBXZWJWaWV3IGFmdGVyIGRlc3Ryb3kuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLSAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOworICAgICAgICBjbGVhclRleHRFbnRyeSgpOwogICAgICAgICBpZiAobVdlYlZpZXdDb3JlICE9IG51bGwpIHsKICAgICAgICAgICAgIC8vIFNldCB0aGUgaGFuZGxlcnMgdG8gbnVsbCBiZWZvcmUgZGVzdHJveWluZyBXZWJWaWV3Q29yZSBzbyBubwogICAgICAgICAgICAgLy8gbW9yZSBtZXNzYWdlcyB3aWxsIGJlIHBvc3RlZC4KQEAgLTEzNjYsNiArMTM3NSw4IEBACiAgICAgICAgICAgICBvdXRTdGF0ZS5wdXRCdW5kbGUoImNlcnRpZmljYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTc2xDZXJ0aWZpY2F0ZS5zYXZlU3RhdGUobUNlcnRpZmljYXRlKSk7CiAgICAgICAgIH0KKyAgICAgICAgb3V0U3RhdGUucHV0Qm9vbGVhbigicHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCIsIGlzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCgpKTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLnNhdmVab29tU3RhdGUob3V0U3RhdGUpOwogICAgICAgICByZXR1cm4gbGlzdDsKICAgICB9CiAKQEAgLTE0MTEsMjkgKzE0MjIsMjMgQEAKICAgICAgICAgLy8gbm93IHVwZGF0ZSB0aGUgYnVuZGxlCiAgICAgICAgIGIucHV0SW50KCJzY3JvbGxYIiwgbVNjcm9sbFgpOwogICAgICAgICBiLnB1dEludCgic2Nyb2xsWSIsIG1TY3JvbGxZKTsKLSAgICAgICAgYi5wdXRGbG9hdCgic2NhbGUiLCBtQWN0dWFsU2NhbGUpOwotICAgICAgICBiLnB1dEZsb2F0KCJ0ZXh0d3JhcFNjYWxlIiwgbVRleHRXcmFwU2NhbGUpOwotICAgICAgICBiLnB1dEJvb2xlYW4oIm92ZXJ2aWV3IiwgbUluWm9vbU92ZXJ2aWV3KTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLnNhdmVab29tU3RhdGUoYik7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZXN0b3JlSGlzdG9yeVBpY3R1cmVGaWVsZHMoUGljdHVyZSBwLCBCdW5kbGUgYikgewogICAgICAgICBpbnQgc3ggPSBiLmdldEludCgic2Nyb2xsWCIsIDApOwogICAgICAgICBpbnQgc3kgPSBiLmdldEludCgic2Nyb2xsWSIsIDApOwotICAgICAgICBmbG9hdCBzY2FsZSA9IGIuZ2V0RmxvYXQoInNjYWxlIiwgMS4wZik7CisKICAgICAgICAgbURyYXdIaXN0b3J5ID0gdHJ1ZTsKICAgICAgICAgbUhpc3RvcnlQaWN0dXJlID0gcDsKICAgICAgICAgbVNjcm9sbFggPSBzeDsKICAgICAgICAgbVNjcm9sbFkgPSBzeTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLnJlc3RvcmVab29tU3RhdGUoYik7CisgICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlID0gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCk7CiAgICAgICAgIG1IaXN0b3J5V2lkdGggPSBNYXRoLnJvdW5kKHAuZ2V0V2lkdGgoKSAqIHNjYWxlKTsKICAgICAgICAgbUhpc3RvcnlIZWlnaHQgPSBNYXRoLnJvdW5kKHAuZ2V0SGVpZ2h0KCkgKiBzY2FsZSk7Ci0gICAgICAgIC8vIGFzIGdldFdpZHRoKCkgLyBnZXRIZWlnaHQoKSBvZiB0aGUgdmlldyBhcmUgbm90IGF2YWlsYWJsZSB5ZXQsIHNldCB1cAotICAgICAgICAvLyBtQWN0dWFsU2NhbGUsIHNvIHRoYXQgd2hlbiBvblNpemVDaGFuZ2VkKCkgaXMgY2FsbGVkLCB0aGUgcmVzdCB3aWxsCi0gICAgICAgIC8vIGJlIHNldCBjb3JyZWN0bHkKLSAgICAgICAgbUFjdHVhbFNjYWxlID0gc2NhbGU7Ci0gICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBzY2FsZTsKLSAgICAgICAgbVRleHRXcmFwU2NhbGUgPSBiLmdldEZsb2F0KCJ0ZXh0d3JhcFNjYWxlIiwgc2NhbGUpOwotICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBiLmdldEJvb2xlYW4oIm92ZXJ2aWV3Iik7CisKICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgIH0KIApAQCAtMTUzNCw2ICsxNTM5LDExIEBACiAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBjb3B5IHRvIGhhdmUgdGhlIGNvcnJlY3QgaW5kZXguCiAgICAgICAgICAgICAgICAgcmV0dXJuTGlzdC5zZXRDdXJyZW50SW5kZXgoaW5kZXgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUmVzdG9yZSBwcml2YXRlIGJyb3dzaW5nIHNldHRpbmcuCisgICAgICAgICAgICBpZiAoaW5TdGF0ZS5nZXRCb29sZWFuKCJwcml2YXRlQnJvd3NpbmdFbmFibGVkIikpIHsKKyAgICAgICAgICAgICAgICBnZXRTZXR0aW5ncygpLnNldFByaXZhdGVCcm93c2luZ0VuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIucmVzdG9yZVpvb21TdGF0ZShpblN0YXRlKTsKICAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgcGVuZGluZyBtZXNzYWdlcyBiZWNhdXNlIHdlIGFyZSByZXN0b3JpbmcgcHJldmlvdXMKICAgICAgICAgICAgIC8vIHN0YXRlLgogICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnJlbW92ZU1lc3NhZ2VzKCk7CkBAIC0xNTU2LDcgKzE1NjYsNyBAQAogICAgICAgICBhcmcubVVybCA9IHVybDsKICAgICAgICAgYXJnLm1FeHRyYUhlYWRlcnMgPSBleHRyYUhlYWRlcnM7CiAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5MT0FEX1VSTCwgYXJnKTsKLSAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOworICAgICAgICBjbGVhclRleHRFbnRyeSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTU4NSw3ICsxNTk1LDcgQEAKICAgICAgICAgICAgIGFyZy5tVXJsID0gdXJsOwogICAgICAgICAgICAgYXJnLm1Qb3N0RGF0YSA9IHBvc3REYXRhOwogICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlBPU1RfVVJMLCBhcmcpOwotICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOworICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGxvYWRVcmwodXJsKTsKICAgICAgICAgfQpAQCAtMTY0MSw3ICsxNjUxLDQ2IEBACiAgICAgICAgIGFyZy5tRW5jb2RpbmcgPSBlbmNvZGluZzsKICAgICAgICAgYXJnLm1IaXN0b3J5VXJsID0gaGlzdG9yeVVybDsKICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkxPQURfREFUQSwgYXJnKTsKLSAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOworICAgICAgICBjbGVhclRleHRFbnRyeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmVzIHRoZSBjdXJyZW50IHZpZXcgYXMgYSB3ZWIgYXJjaGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgZmlsZW5hbWUgd2hlcmUgdGhlIGFyY2hpdmUgc2hvdWxkIGJlIHBsYWNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzYXZlV2ViQXJjaGl2ZShTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICAgICAgc2F2ZVdlYkFyY2hpdmUoZmlsZW5hbWUsIGZhbHNlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBTYXZlV2ViQXJjaGl2ZU1lc3NhZ2UgeworICAgICAgICBTYXZlV2ViQXJjaGl2ZU1lc3NhZ2UgKFN0cmluZyBiYXNlbmFtZSwgYm9vbGVhbiBhdXRvbmFtZSwgVmFsdWVDYWxsYmFjazxTdHJpbmc+IGNhbGxiYWNrKSB7CisgICAgICAgICAgICBtQmFzZW5hbWUgPSBiYXNlbmFtZTsKKyAgICAgICAgICAgIG1BdXRvbmFtZSA9IGF1dG9uYW1lOworICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgIH0KKworICAgICAgICAvKiBwYWNrYWdlICovIGZpbmFsIFN0cmluZyBtQmFzZW5hbWU7CisgICAgICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgYm9vbGVhbiBtQXV0b25hbWU7CisgICAgICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgVmFsdWVDYWxsYmFjazxTdHJpbmc+IG1DYWxsYmFjazsKKyAgICAgICAgLyogcGFja2FnZSAqLyBTdHJpbmcgbVJlc3VsdEZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZXMgdGhlIGN1cnJlbnQgdmlldyBhcyBhIHdlYiBhcmNoaXZlLgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2VuYW1lIFRoZSBmaWxlbmFtZSB3aGVyZSB0aGUgYXJjaGl2ZSBzaG91bGQgYmUgcGxhY2VkLgorICAgICAqIEBwYXJhbSBhdXRvbmFtZSBJZiBmYWxzZSwgdGFrZXMgYmFzZW5hbWUgdG8gYmUgYSBmaWxlLiBJZiB0cnVlLCBiYXNlbmFtZQorICAgICAqICAgICAgICAgICAgICAgICBpcyBhc3N1bWVkIHRvIGJlIGEgZGlyZWN0b3J5IGluIHdoaWNoIGEgZmlsZW5hbWUgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICBjaG9zZW4gYWNjb3JkaW5nIHRvIHRoZSB1cmwgb2YgdGhlIGN1cnJlbnQgcGFnZS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHRoZSB3ZWIgYXJjaGl2ZSBoYXMgYmVlbiBzYXZlZC4gVGhlCisgICAgICogICAgICAgICAgICAgICAgIHBhcmFtZXRlciBmb3Igb25SZWNlaXZlVmFsdWUgd2lsbCBlaXRoZXIgYmUgdGhlIGZpbGVuYW1lCisgICAgICogICAgICAgICAgICAgICAgIHVuZGVyIHdoaWNoIHRoZSBmaWxlIHdhcyBzYXZlZCwgb3IgbnVsbCBpZiBzYXZpbmcgdGhlCisgICAgICogICAgICAgICAgICAgICAgIGZpbGUgZmFpbGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNhdmVXZWJBcmNoaXZlKFN0cmluZyBiYXNlbmFtZSwgYm9vbGVhbiBhdXRvbmFtZSwgVmFsdWVDYWxsYmFjazxTdHJpbmc+IGNhbGxiYWNrKSB7CisgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TQVZFX1dFQkFSQ0hJVkUsCisgICAgICAgICAgICBuZXcgU2F2ZVdlYkFyY2hpdmVNZXNzYWdlKGJhc2VuYW1lLCBhdXRvbmFtZSwgY2FsbGJhY2spKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE2NTgsNyArMTcwNyw3IEBACiAgICAgICogUmVsb2FkIHRoZSBjdXJyZW50IHVybC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWxvYWQoKSB7Ci0gICAgICAgIGNsZWFyVGV4dEVudHJ5KGZhbHNlKTsKKyAgICAgICAgY2xlYXJUZXh0RW50cnkoKTsKICAgICAgICAgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlJFTE9BRCk7CiAgICAgfQpAQCAtMTczOCwxMiArMTc4NywyOSBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIGdvQmFja09yRm9yd2FyZChpbnQgc3RlcHMsIGJvb2xlYW4gaWdub3JlU25hcHNob3QpIHsKICAgICAgICAgaWYgKHN0ZXBzICE9IDApIHsKLSAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KGZhbHNlKTsKKyAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CiAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuR09fQkFDS19GT1JXQVJELCBzdGVwcywKICAgICAgICAgICAgICAgICAgICAgaWdub3JlU25hcHNob3QgPyAxIDogMCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgcHJpdmF0ZSBicm93c2luZyBpcyBlbmFibGVkIGluIHRoaXMgV2ViVmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQgKCkgeworICAgICAgICByZXR1cm4gZ2V0U2V0dGluZ3MoKS5pc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRQcml2YXRlQnJvd3NpbmcgKCkgeworICAgICAgICBib29sZWFuIHdhc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQgPSBpc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQoKTsKKworICAgICAgICBnZXRTZXR0aW5ncygpLnNldFByaXZhdGVCcm93c2luZ0VuYWJsZWQodHJ1ZSk7CisKKyAgICAgICAgaWYgKCF3YXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKSB7CisgICAgICAgICAgICBsb2FkVXJsKCJicm93c2VyOmluY29nbml0byIpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBib29sZWFuIGV4dGVuZFNjcm9sbChpbnQgeSkgewogICAgICAgICBpbnQgZmluYWxZID0gbVNjcm9sbGVyLmdldEZpbmFsWSgpOwogICAgICAgICBpbnQgbmV3WSA9IHBpbkxvY1koZmluYWxZICsgeSk7CkBAIC0xNzkxLDcgKzE4NTcsNyBAQAogICAgICAgICB9CiAgICAgICAgIG5hdGl2ZUNsZWFyQ3Vyc29yKCk7IC8vIHN0YXJ0IG5leHQgdHJhY2tiYWxsIG1vdmVtZW50IGZyb20gcGFnZSBlZGdlCiAgICAgICAgIGlmIChib3R0b20pIHsKLSAgICAgICAgICAgIHJldHVybiBwaW5TY3JvbGxUbyhtU2Nyb2xsWCwgY29tcHV0ZVJlYWxWZXJ0aWNhbFNjcm9sbFJhbmdlKCksIHRydWUsIDApOworICAgICAgICAgICAgcmV0dXJuIHBpblNjcm9sbFRvKG1TY3JvbGxYLCBjb21wdXRlVmVydGljYWxTY3JvbGxSYW5nZSgpLCB0cnVlLCAwKTsKICAgICAgICAgfQogICAgICAgICAvLyBQYWdlIGRvd24uCiAgICAgICAgIGludCBoID0gZ2V0SGVpZ2h0KCk7CkBAIC0xODEzLDYgKzE4NzksNyBAQAogICAgIHB1YmxpYyB2b2lkIGNsZWFyVmlldygpIHsKICAgICAgICAgbUNvbnRlbnRXaWR0aCA9IDA7CiAgICAgICAgIG1Db250ZW50SGVpZ2h0ID0gMDsKKyAgICAgICAgbmF0aXZlU2V0QmFzZUxheWVyKDApOwogICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuQ0xFQVJfQ09OVEVOVCk7CiAgICAgfQogCkBAIC0xODI2LDggKzE4OTMsOSBAQAogICAgICAqICAgICAgICAgYm91bmRzIG9mIHRoZSB2aWV3LgogICAgICAqLwogICAgIHB1YmxpYyBQaWN0dXJlIGNhcHR1cmVQaWN0dXJlKCkgewotICAgICAgICBpZiAobnVsbCA9PSBtV2ViVmlld0NvcmUpIHJldHVybiBudWxsOyAvLyBjaGVjayBmb3Igb3V0IG9mIG1lbW9yeSB0YWIKLSAgICAgICAgcmV0dXJuIG1XZWJWaWV3Q29yZS5jb3B5Q29udGVudFBpY3R1cmUoKTsKKyAgICAgICAgUGljdHVyZSByZXN1bHQgPSBuZXcgUGljdHVyZSgpOworICAgICAgICBuYXRpdmVDb3B5QmFzZUNvbnRlbnRUb1BpY3R1cmUocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICAvKioKQEAgLTE4MzksMTUgKzE5MDcsMTMgQEAKIAogICAgIC8qKgogICAgICAqIFJlbW92ZSB0aGUgV2ViVGV4dFZpZXcuCi0gICAgICogQHBhcmFtIGRpc2FibGVGb2N1c0NvbnRyb2xsZXIgSWYgdHJ1ZSwgc2VuZCBhIG1lc3NhZ2UgdG8gd2Via2l0Ci0gICAgICogICAgIGRpc2FibGluZyB0aGUgZm9jdXMgY29udHJvbGxlciwgc28gdGhlIGNhcmV0IHN0b3BzIGJsaW5raW5nLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjbGVhclRleHRFbnRyeShib29sZWFuIGRpc2FibGVGb2N1c0NvbnRyb2xsZXIpIHsKKyAgICBwcml2YXRlIHZvaWQgY2xlYXJUZXh0RW50cnkoKSB7CiAgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkpIHsKICAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5yZW1vdmUoKTsKLSAgICAgICAgICAgIGlmIChkaXNhYmxlRm9jdXNDb250cm9sbGVyKSB7Ci0gICAgICAgICAgICAgICAgc2V0Rm9jdXNDb250cm9sbGVySW5hY3RpdmUoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoZSBrZXlib2FyZCBtYXkgYmUgb3BlbiB3aXRoIHRoZSBXZWJWaWV3IGFzIHRoZSBzZXJ2ZWQgdmlldworICAgICAgICAgICAgaGlkZVNvZnRLZXlib2FyZCgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xODU2LDcgKzE5MjIsNyBAQAogICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2NhbGUuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFNjYWxlKCkgewotICAgICAgICByZXR1cm4gbUFjdHVhbFNjYWxlOworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xODY4LDcgKzE5MzQsNyBAQAogICAgICAqIEBwYXJhbSBzY2FsZUluUGVyY2VudCBUaGUgaW5pdGlhbCBzY2FsZSBpbiBwZXJjZW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTY2FsZShpbnQgc2NhbGVJblBlcmNlbnQpIHsKLSAgICAgICAgbUluaXRpYWxTY2FsZUluUGVyY2VudCA9IHNjYWxlSW5QZXJjZW50OworICAgICAgICBtWm9vbU1hbmFnZXIuc2V0SW5pdGlhbFNjYWxlSW5QZXJjZW50KHNjYWxlSW5QZXJjZW50KTsKICAgICB9CiAKICAgICAvKioKQEAgLTE4ODEsMTQgKzE5NDcsOCBAQAogICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiVGhpcyBXZWJWaWV3IGRvZXNuJ3Qgc3VwcG9ydCB6b29tLiIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGNsZWFyVGV4dEVudHJ5KGZhbHNlKTsKLSAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7Ci0gICAgICAgICAgICBnZXRab29tQnV0dG9uc0NvbnRyb2xsZXIoKS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7Ci0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsCi0gICAgICAgICAgICAgICAgICAgIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7Ci0gICAgICAgIH0KKyAgICAgICAgY2xlYXJUZXh0RW50cnkoKTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLmludm9rZVpvb21QaWNrZXIoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIwMDMsNyArMjA2Myw3IEBACiAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcGluTG9jKGludCB4LCBpbnQgdmlld01heCwgaW50IGRvY01heCkgeworICAgIHN0YXRpYyBpbnQgcGluTG9jKGludCB4LCBpbnQgdmlld01heCwgaW50IGRvY01heCkgewogLy8gICAgICAgIExvZy5kKExPR1RBRywgIi0tIHBpbkxvYyAiICsgeCArICIgIiArIHZpZXdNYXggKyAiICIgKyBkb2NNYXgpOwogICAgICAgICBpZiAoZG9jTWF4IDwgdmlld01heCkgeyAgIC8vIHRoZSBkb2MgaGFzIHJvb20gb24gdGhlIHNpZGVzIGZvciAiYmxhbmsiCiAgICAgICAgICAgICAvLyBwaW4gdGhlIHNob3J0IGRvY3VtZW50IHRvIHRoZSB0b3AvbGVmdCBvZiB0aGUgc2NyZWVuCkBAIC0yMDIwLDE2ICsyMDgwLDE0IEBACiAgICAgfQogCiAgICAgLy8gRXhwZWN0cyB4IGluIHZpZXcgY29vcmRpbmF0ZXMKLSAgICBwcml2YXRlIGludCBwaW5Mb2NYKGludCB4KSB7Ci0gICAgICAgIGlmIChtSW5PdmVyU2Nyb2xsTW9kZSkgcmV0dXJuIHg7Ci0gICAgICAgIHJldHVybiBwaW5Mb2MoeCwgZ2V0Vmlld1dpZHRoKCksIGNvbXB1dGVSZWFsSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCkpOworICAgIGludCBwaW5Mb2NYKGludCB4KSB7CisgICAgICAgIHJldHVybiBwaW5Mb2MoeCwgZ2V0Vmlld1dpZHRoKCksIGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSk7CiAgICAgfQogCiAgICAgLy8gRXhwZWN0cyB5IGluIHZpZXcgY29vcmRpbmF0ZXMKLSAgICBwcml2YXRlIGludCBwaW5Mb2NZKGludCB5KSB7Ci0gICAgICAgIGlmIChtSW5PdmVyU2Nyb2xsTW9kZSkgcmV0dXJuIHk7CisgICAgaW50IHBpbkxvY1koaW50IHkpIHsKICAgICAgICAgcmV0dXJuIHBpbkxvYyh5LCBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZVJlYWxWZXJ0aWNhbFNjcm9sbFJhbmdlKCkgKyBnZXRUaXRsZUhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlVmVydGljYWxTY3JvbGxSYW5nZSgpICsgZ2V0VGl0bGVIZWlnaHQoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMDc3LDcgKzIxMzUsNyBAQAogICAgICAqIGhlaWdodC4KICAgICAgKi8KICAgICBwcml2YXRlIGludCB2aWV3VG9Db250ZW50RGltZW5zaW9uKGludCBkKSB7Ci0gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGQgKiBtSW52QWN0dWFsU2NhbGUpOworICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjEwMyw3ICsyMTYxLDcgQEAKICAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBmbG9hdC4KICAgICAgKi8KICAgICBwcml2YXRlIGZsb2F0IHZpZXdUb0NvbnRlbnRYZihpbnQgeCkgewotICAgICAgICByZXR1cm4geCAqIG1JbnZBY3R1YWxTY2FsZTsKKyAgICAgICAgcmV0dXJuIHggKiBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxMTIsNyArMjE3MCw3IEBACiAgICAgICogZW1iZWRkZWQgaW50byB0aGUgV2ViVmlldy4gUmV0dXJucyB0aGUgcmVzdWx0IGFzIGEgZmxvYXQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdCB2aWV3VG9Db250ZW50WWYoaW50IHkpIHsKLSAgICAgICAgcmV0dXJuICh5IC0gZ2V0VGl0bGVIZWlnaHQoKSkgKiBtSW52QWN0dWFsU2NhbGU7CisgICAgICAgIHJldHVybiAoeSAtIGdldFRpdGxlSGVpZ2h0KCkpICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTIyLDcgKzIxODAsNyBAQAogICAgICAqIGhlaWdodC4KICAgICAgKi8KICAgICAvKnBhY2thZ2UqLyBpbnQgY29udGVudFRvVmlld0RpbWVuc2lvbihpbnQgZCkgewotICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkICogbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoZCAqIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxNjMsNyArMjIyMSw3IEBACiAgICAgLy8gQ2FsbGVkIGJ5IEpOSSB0byBpbnZhbGlkYXRlIHRoZSBWaWV3LCBnaXZlbiByZWN0YW5nbGUgY29vcmRpbmF0ZXMgaW4KICAgICAvLyBjb250ZW50IHNwYWNlCiAgICAgcHJpdmF0ZSB2b2lkIHZpZXdJbnZhbGlkYXRlKGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7Ci0gICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlID0gbUFjdHVhbFNjYWxlOworICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZSA9IG1ab29tTWFuYWdlci5nZXRTY2FsZSgpOwogICAgICAgICBmaW5hbCBpbnQgZHkgPSBnZXRUaXRsZUhlaWdodCgpOwogICAgICAgICBpbnZhbGlkYXRlKChpbnQpTWF0aC5mbG9vcihsICogc2NhbGUpLAogICAgICAgICAgICAgICAgICAgIChpbnQpTWF0aC5mbG9vcih0ICogc2NhbGUpICsgZHksCkBAIC0yMTc0LDcgKzIyMzIsNyBAQAogICAgIC8vIENhbGxlZCBieSBKTkkgdG8gaW52YWxpZGF0ZSB0aGUgVmlldyBhZnRlciBhIGRlbGF5LCBnaXZlbiByZWN0YW5nbGUKICAgICAvLyBjb29yZGluYXRlcyBpbiBjb250ZW50IHNwYWNlCiAgICAgcHJpdmF0ZSB2b2lkIHZpZXdJbnZhbGlkYXRlRGVsYXllZChsb25nIGRlbGF5LCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewotICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZSA9IG1BY3R1YWxTY2FsZTsKKyAgICAgICAgZmluYWwgZmxvYXQgc2NhbGUgPSBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKTsKICAgICAgICAgZmluYWwgaW50IGR5ID0gZ2V0VGl0bGVIZWlnaHQoKTsKICAgICAgICAgcG9zdEludmFsaWRhdGVEZWxheWVkKGRlbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClNYXRoLmZsb29yKGwgKiBzY2FsZSksCkBAIC0yMjEyLDEzICsyMjcwLDcgQEAKICAgICAgICAgICAgIC8vIHVwZGF0ZWQgd2hlbiB3ZSBnZXQgb3V0IG9mIHRoYXQgbW9kZS4KICAgICAgICAgICAgIGlmICghbURyYXdIaXN0b3J5KSB7CiAgICAgICAgICAgICAgICAgLy8gcmVwaW4gb3VyIHNjcm9sbCwgdGFraW5nIGludG8gYWNjb3VudCB0aGUgbmV3IGNvbnRlbnQgc2l6ZQotICAgICAgICAgICAgICAgIGludCBvbGRYID0gbVNjcm9sbFg7Ci0gICAgICAgICAgICAgICAgaW50IG9sZFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgICAgICBtU2Nyb2xsWCA9IHBpbkxvY1gobVNjcm9sbFgpOwotICAgICAgICAgICAgICAgIG1TY3JvbGxZID0gcGluTG9jWShtU2Nyb2xsWSk7Ci0gICAgICAgICAgICAgICAgaWYgKG9sZFggIT0gbVNjcm9sbFggfHwgb2xkWSAhPSBtU2Nyb2xsWSkgewotICAgICAgICAgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQobVNjcm9sbFgsIG1TY3JvbGxZLCBvbGRYLCBvbGRZKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXBkYXRlU2Nyb2xsQ29vcmRpbmF0ZXMocGluTG9jWChtU2Nyb2xsWCksIHBpbkxvY1kobVNjcm9sbFkpKTsKICAgICAgICAgICAgICAgICBpZiAoIW1TY3JvbGxlci5pc0ZpbmlzaGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBzY3JvbGwuICBSZXBpbiB0aGUgZmluYWwgc2Nyb2xsCiAgICAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uLgpAQCAtMjIzMCw3NyArMjI4MiwxMiBAQAogICAgICAgICBjb250ZW50U2l6ZUNoYW5nZWQodXBkYXRlTGF5b3V0KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0TmV3Wm9vbVNjYWxlKGZsb2F0IHNjYWxlLCBib29sZWFuIHVwZGF0ZVRleHRXcmFwU2NhbGUsCi0gICAgICAgICAgICBib29sZWFuIGZvcmNlKSB7Ci0gICAgICAgIGlmIChzY2FsZSA8IG1NaW5ab29tU2NhbGUpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbU1pblpvb21TY2FsZTsKLSAgICAgICAgICAgIC8vIHNldCBtSW5ab29tT3ZlcnZpZXcgZm9yIG5vbiBtb2JpbGUgc2l0ZXMKLSAgICAgICAgICAgIGlmIChzY2FsZSA8IG1EZWZhdWx0U2NhbGUpIG1Jblpvb21PdmVydmlldyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2NhbGUgPiBtTWF4Wm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1NYXhab29tU2NhbGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVwZGF0ZVRleHRXcmFwU2NhbGUpIHsKLSAgICAgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gc2NhbGU7Ci0gICAgICAgICAgICAvLyByZXNldCBtTGFzdEhlaWdodFNlbnQgdG8gZm9yY2UgVklFV19TSVpFX0NIQU5HRUQgc2VudCB0byBXZWJLaXQKLSAgICAgICAgICAgIG1MYXN0SGVpZ2h0U2VudCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNjYWxlICE9IG1BY3R1YWxTY2FsZSB8fCBmb3JjZSkgewotICAgICAgICAgICAgaWYgKG1EcmF3SGlzdG9yeSkgewotICAgICAgICAgICAgICAgIC8vIElmIGhpc3RvcnkgUGljdHVyZSBpcyBkcmF3biwgZG9uJ3QgdXBkYXRlIHNjcm9sbC4gVGhleSB3aWxsCi0gICAgICAgICAgICAgICAgLy8gYmUgdXBkYXRlZCB3aGVuIHdlIGdldCBvdXQgb2YgdGhhdCBtb2RlLgotICAgICAgICAgICAgICAgIGlmIChzY2FsZSAhPSBtQWN0dWFsU2NhbGUgJiYgIW1QcmV2aWV3Wm9vbU9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrUHJveHkub25TY2FsZUNoYW5nZWQobUFjdHVhbFNjYWxlLCBzY2FsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BY3R1YWxTY2FsZSA9IHNjYWxlOwotICAgICAgICAgICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBzY2FsZTsKLSAgICAgICAgICAgICAgICBzZW5kVmlld1NpemVab29tKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBvdXIgc2Nyb2xsIHNvIHdlIGRvbid0IGFwcGVhciB0byBqdW1wCi0gICAgICAgICAgICAgICAgLy8gaS5lLiBrZWVwIHRoZSBjZW50ZXIgb2YgdGhlIGRvYyBpbiB0aGUgY2VudGVyIG9mIHRoZSB2aWV3Ci0KLSAgICAgICAgICAgICAgICBpbnQgb2xkWCA9IG1TY3JvbGxYOwotICAgICAgICAgICAgICAgIGludCBvbGRZID0gbVNjcm9sbFk7Ci0gICAgICAgICAgICAgICAgZmxvYXQgcmF0aW8gPSBzY2FsZSAqIG1JbnZBY3R1YWxTY2FsZTsgICAvLyBvbGQgaW52ZXJzZQotICAgICAgICAgICAgICAgIGZsb2F0IHN4ID0gcmF0aW8gKiBvbGRYICsgKHJhdGlvIC0gMSkgKiBtWm9vbUNlbnRlclg7Ci0gICAgICAgICAgICAgICAgZmxvYXQgc3kgPSByYXRpbyAqIG9sZFkgKyAocmF0aW8gLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgKiAobVpvb21DZW50ZXJZIC0gZ2V0VGl0bGVIZWlnaHQoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBub3cgdXBkYXRlIG91ciBuZXcgc2NhbGUgYW5kIGludmVyc2UKLSAgICAgICAgICAgICAgICBpZiAoc2NhbGUgIT0gbUFjdHVhbFNjYWxlICYmICFtUHJldmlld1pvb21Pbmx5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja1Byb3h5Lm9uU2NhbGVDaGFuZ2VkKG1BY3R1YWxTY2FsZSwgc2NhbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQWN0dWFsU2NhbGUgPSBzY2FsZTsKLSAgICAgICAgICAgICAgICBtSW52QWN0dWFsU2NhbGUgPSAxIC8gc2NhbGU7Ci0KLSAgICAgICAgICAgICAgICAvLyBTY2FsZSBhbGwgdGhlIGNoaWxkIHZpZXdzCi0gICAgICAgICAgICAgICAgbVZpZXdNYW5hZ2VyLnNjYWxlQWxsKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhcyB3ZSBkb24ndCBoYXZlIGFuaW1hdGlvbiBmb3Igc2NhbGluZywgZG9uJ3QgZG8gYW5pbWF0aW9uCi0gICAgICAgICAgICAgICAgLy8gZm9yIHNjcm9sbGluZywgYXMgaXQgY2F1c2VzIHdlaXJkIGludGVybWVkaWF0ZSBzdGF0ZQotICAgICAgICAgICAgICAgIC8vICAgICAgICBwaW5TY3JvbGxUbyhNYXRoLnJvdW5kKHN4KSwgTWF0aC5yb3VuZChzeSkpOwotICAgICAgICAgICAgICAgIG1TY3JvbGxYID0gcGluTG9jWChNYXRoLnJvdW5kKHN4KSk7Ci0gICAgICAgICAgICAgICAgbVNjcm9sbFkgPSBwaW5Mb2NZKE1hdGgucm91bmQoc3kpKTsKLQotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB3ZWJraXQKLSAgICAgICAgICAgICAgICBpZiAob2xkWCAhPSBtU2Nyb2xsWCB8fCBvbGRZICE9IG1TY3JvbGxZKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzY3JvbGwgcG9zaXRpb24gaXMgYWRqdXN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gem9vbSBhbmltYXRpb24uIEJ1dCB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgV2ViS2l0IGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgdGhlIHpvb20gYW5pbWF0aW9uLiBTZWUgY29tbWVudHMgaW4gb25TY2FsZUVuZCgpLgotICAgICAgICAgICAgICAgICAgICBzZW5kT3VyVmlzaWJsZVJlY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgLy8gVXNlZCB0byBhdm9pZCBzZW5kaW5nIG1hbnkgdmlzaWJsZSByZWN0IG1lc3NhZ2VzLgogICAgIHByaXZhdGUgUmVjdCBtTGFzdFZpc2libGVSZWN0U2VudDsKICAgICBwcml2YXRlIFJlY3QgbUxhc3RHbG9iYWxSZWN0OwogCi0gICAgcHJpdmF0ZSBSZWN0IHNlbmRPdXJWaXNpYmxlUmVjdCgpIHsKLSAgICAgICAgaWYgKG1QcmV2aWV3Wm9vbU9ubHkpIHJldHVybiBtTGFzdFZpc2libGVSZWN0U2VudDsKKyAgICBSZWN0IHNlbmRPdXJWaXNpYmxlUmVjdCgpIHsKKyAgICAgICAgaWYgKG1ab29tTWFuYWdlci5pc1ByZXZlbnRpbmdXZWJraXRVcGRhdGVzKCkpIHJldHVybiBtTGFzdFZpc2libGVSZWN0U2VudDsKIAogICAgICAgICBSZWN0IHJlY3QgPSBuZXcgUmVjdCgpOwogICAgICAgICBjYWxjT3VyQ29udGVudFZpc2libGVSZWN0KHJlY3QpOwpAQCAtMjMzMywxNSArMjMyMCwxMiBAQAogICAgICAgICBQb2ludCBwID0gbmV3IFBvaW50KCk7CiAgICAgICAgIGdldEdsb2JhbFZpc2libGVSZWN0KHIsIHApOwogICAgICAgICByLm9mZnNldCgtcC54LCAtcC55KTsKLSAgICAgICAgaWYgKG1GaW5kSXNVcCkgewotICAgICAgICAgICAgci5ib3R0b20gLT0gbUZpbmRIZWlnaHQ7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICAvLyBTZXRzIHIgdG8gYmUgb3VyIHZpc2libGUgcmVjdGFuZ2xlIGluIGNvbnRlbnQgY29vcmRpbmF0ZXMKICAgICBwcml2YXRlIHZvaWQgY2FsY091ckNvbnRlbnRWaXNpYmxlUmVjdChSZWN0IHIpIHsKICAgICAgICAgY2FsY091clZpc2libGVSZWN0KHIpOwotICAgICAgICAvLyBzaW5jZSB3ZSBtaWdodCBvdmVyc2Nyb2xsLCBwaW4gdGhlIHJlY3QgdG8gdGhlIGJvdW5kcyBvZiB0aGUgY29udGVudAorICAgICAgICAvLyBwaW4gdGhlIHJlY3QgdG8gdGhlIGJvdW5kcyBvZiB0aGUgY29udGVudAogICAgICAgICByLmxlZnQgPSBNYXRoLm1heCh2aWV3VG9Db250ZW50WChyLmxlZnQpLCAwKTsKICAgICAgICAgLy8gdmlld1RvQ29udGVudFkgd2lsbCByZW1vdmUgdGhlIHRvdGFsIGhlaWdodCBvZiB0aGUgdGl0bGUgYmFyLiAgQWRkCiAgICAgICAgIC8vIHRoZSB2aXNpYmxlIGhlaWdodCBiYWNrIGluIHRvIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQgaWYgdGhlIHRpdGxlCkBAIC0yMzgyLDE2ICsyMzY2LDE5IEBACiAKICAgICAvKioKICAgICAgKiBDb21wdXRlIHVuem9vbWVkIHdpZHRoIGFuZCBoZWlnaHQsIGFuZCBpZiB0aGV5IGRpZmZlciBmcm9tIHRoZSBsYXN0Ci0gICAgICogdmFsdWVzIHdlIHNlbnQsIHNlbmQgdGhlbSB0byB3ZWJraXQgKHRvIGJlIHVzZWQgaGFzIG5ldyB2aWV3cG9ydCkKKyAgICAgKiB2YWx1ZXMgd2Ugc2VudCwgc2VuZCB0aGVtIHRvIHdlYmtpdCAodG8gYmUgdXNlZCBhcyBuZXcgdmlld3BvcnQpCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm9yY2UgZW5zdXJlcyB0aGF0IHRoZSBtZXNzYWdlIGlzIHNlbnQgdG8gd2Via2l0IGV2ZW4gaWYgdGhlIHdpZHRoCisgICAgICogb3IgaGVpZ2h0IGhhcyBub3QgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBtZXNzYWdlCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgbmV3IHZhbHVlcyB3ZXJlIHNlbnQKICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2VuZFZpZXdTaXplWm9vbSgpIHsKLSAgICAgICAgaWYgKG1QcmV2aWV3Wm9vbU9ubHkpIHJldHVybiBmYWxzZTsKKyAgICBib29sZWFuIHNlbmRWaWV3U2l6ZVpvb20oYm9vbGVhbiBmb3JjZSkgeworICAgICAgICBpZiAobVpvb21NYW5hZ2VyLmlzUHJldmVudGluZ1dlYmtpdFVwZGF0ZXMoKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKLSAgICAgICAgaW50IG5ld1dpZHRoID0gTWF0aC5yb3VuZCh2aWV3V2lkdGggKiBtSW52QWN0dWFsU2NhbGUpOwotICAgICAgICBpbnQgbmV3SGVpZ2h0ID0gTWF0aC5yb3VuZChnZXRWaWV3SGVpZ2h0KCkgKiBtSW52QWN0dWFsU2NhbGUpOworICAgICAgICBpbnQgbmV3V2lkdGggPSBNYXRoLnJvdW5kKHZpZXdXaWR0aCAqIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpKTsKKyAgICAgICAgaW50IG5ld0hlaWdodCA9IE1hdGgucm91bmQoZ2V0Vmlld0hlaWdodCgpICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCkpOwogICAgICAgICAvKgogICAgICAgICAgKiBCZWNhdXNlIHRoZSBuYXRpdmUgc2lkZSBtYXkgaGF2ZSBhbHJlYWR5IGRvbmUgYSBsYXlvdXQgYmVmb3JlIHRoZQogICAgICAgICAgKiBWaWV3IHN5c3RlbSB3YXMgYWJsZSB0byBtZWFzdXJlIHVzLCB3ZSBoYXZlIHRvIHNlbmQgYSBoZWlnaHQgb2YgMCB0bwpAQCAtMjQwNCw4NSArMjM5MSw1MSBAQAogICAgICAgICAgICAgbmV3SGVpZ2h0ID0gMDsKICAgICAgICAgfQogICAgICAgICAvLyBBdm9pZCBzZW5kaW5nIGFub3RoZXIgbWVzc2FnZSBpZiB0aGUgZGltZW5zaW9ucyBoYXZlIG5vdCBjaGFuZ2VkLgotICAgICAgICBpZiAobmV3V2lkdGggIT0gbUxhc3RXaWR0aFNlbnQgfHwgbmV3SGVpZ2h0ICE9IG1MYXN0SGVpZ2h0U2VudCkgeworICAgICAgICBpZiAobmV3V2lkdGggIT0gbUxhc3RXaWR0aFNlbnQgfHwgbmV3SGVpZ2h0ICE9IG1MYXN0SGVpZ2h0U2VudCB8fCBmb3JjZSkgewogICAgICAgICAgICAgVmlld1NpemVEYXRhIGRhdGEgPSBuZXcgVmlld1NpemVEYXRhKCk7CiAgICAgICAgICAgICBkYXRhLm1XaWR0aCA9IG5ld1dpZHRoOwogICAgICAgICAgICAgZGF0YS5tSGVpZ2h0ID0gbmV3SGVpZ2h0OwotICAgICAgICAgICAgZGF0YS5tVGV4dFdyYXBXaWR0aCA9IE1hdGgucm91bmQodmlld1dpZHRoIC8gbVRleHRXcmFwU2NhbGUpOzsKLSAgICAgICAgICAgIGRhdGEubVNjYWxlID0gbUFjdHVhbFNjYWxlOwotICAgICAgICAgICAgZGF0YS5tSWdub3JlSGVpZ2h0ID0gbVpvb21TY2FsZSAhPSAwICYmICFtSGVpZ2h0Q2FuTWVhc3VyZTsKLSAgICAgICAgICAgIGRhdGEubUFuY2hvclggPSBtQW5jaG9yWDsKLSAgICAgICAgICAgIGRhdGEubUFuY2hvclkgPSBtQW5jaG9yWTsKKyAgICAgICAgICAgIGRhdGEubVRleHRXcmFwV2lkdGggPSBNYXRoLnJvdW5kKHZpZXdXaWR0aCAvIG1ab29tTWFuYWdlci5nZXRUZXh0V3JhcFNjYWxlKCkpOworICAgICAgICAgICAgZGF0YS5tU2NhbGUgPSBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKTsKKyAgICAgICAgICAgIGRhdGEubUlnbm9yZUhlaWdodCA9IG1ab29tTWFuYWdlci5pc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpCisgICAgICAgICAgICAgICAgICAgICYmICFtSGVpZ2h0Q2FuTWVhc3VyZTsKKyAgICAgICAgICAgIGRhdGEubUFuY2hvclggPSBtWm9vbU1hbmFnZXIuZ2V0RG9jdW1lbnRBbmNob3JYKCk7CisgICAgICAgICAgICBkYXRhLm1BbmNob3JZID0gbVpvb21NYW5hZ2VyLmdldERvY3VtZW50QW5jaG9yWSgpOwogICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlZJRVdfU0laRV9DSEFOR0VELCBkYXRhKTsKICAgICAgICAgICAgIG1MYXN0V2lkdGhTZW50ID0gbmV3V2lkdGg7CiAgICAgICAgICAgICBtTGFzdEhlaWdodFNlbnQgPSBuZXdIZWlnaHQ7Ci0gICAgICAgICAgICBtQW5jaG9yWCA9IG1BbmNob3JZID0gMDsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5jbGVhckRvY3VtZW50QW5jaG9yKCk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBpbnQgY29tcHV0ZVJlYWxIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBjb21wdXRlSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCkgewogICAgICAgICBpZiAobURyYXdIaXN0b3J5KSB7CiAgICAgICAgICAgICByZXR1cm4gbUhpc3RvcnlXaWR0aDsKICAgICAgICAgfSBlbHNlIGlmIChtSG9yaXpvbnRhbFNjcm9sbEJhck1vZGUgPT0gU0NST0xMQkFSX0FMV0FZU09GRgotICAgICAgICAgICAgICAgICYmIChtQWN0dWFsU2NhbGUgLSBtTWluWm9vbVNjYWxlIDw9IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSkgeworICAgICAgICAgICAgICAgICYmICFtWm9vbU1hbmFnZXIuY2FuWm9vbU91dCgpKSB7CiAgICAgICAgICAgICAvLyBvbmx5IGhvbm9yIHRoZSBzY3JvbGxiYXIgbW9kZSB3aGVuIGl0IGlzIGF0IG1pbmltdW0gem9vbSBsZXZlbAogICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsRXh0ZW50KCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyB0byBhdm9pZCByb3VuZGluZyBlcnJvciBjYXVzZWQgdW5uZWNlc3Nhcnkgc2Nyb2xsYmFyLCB1c2UgZmxvb3IKLSAgICAgICAgICAgIHJldHVybiAoaW50KSBNYXRoLmZsb29yKG1Db250ZW50V2lkdGggKiBtQWN0dWFsU2NhbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludCBjb21wdXRlSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCkgewotICAgICAgICBpbnQgcmFuZ2UgPSBjb21wdXRlUmVhbEhvcml6b250YWxTY3JvbGxSYW5nZSgpOwotCi0gICAgICAgIC8vIEFkanVzdCByZXBvcnRlZCByYW5nZSBpZiBvdmVyc2Nyb2xsZWQgdG8gY29tcHJlc3MgdGhlIHNjcm9sbCBiYXJzCi0gICAgICAgIGZpbmFsIGludCBzY3JvbGxYID0gbVNjcm9sbFg7Ci0gICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsUmlnaHQgPSBjb21wdXRlTWF4U2Nyb2xsWCgpOwotICAgICAgICBpZiAoc2Nyb2xsWCA8IDApIHsKLSAgICAgICAgICAgIHJhbmdlIC09IHNjcm9sbFg7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2Nyb2xsWCA+IG92ZXJzY3JvbGxSaWdodCkgewotICAgICAgICAgICAgcmFuZ2UgKz0gc2Nyb2xsWCAtIG92ZXJzY3JvbGxSaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByYW5nZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgaW50IGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsT2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gTWF0aC5tYXgobVNjcm9sbFgsIDApOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNvbXB1dGVSZWFsVmVydGljYWxTY3JvbGxSYW5nZSgpIHsKLSAgICAgICAgaWYgKG1EcmF3SGlzdG9yeSkgewotICAgICAgICAgICAgcmV0dXJuIG1IaXN0b3J5SGVpZ2h0OwotICAgICAgICB9IGVsc2UgaWYgKG1WZXJ0aWNhbFNjcm9sbEJhck1vZGUgPT0gU0NST0xMQkFSX0FMV0FZU09GRgotICAgICAgICAgICAgICAgICYmIChtQWN0dWFsU2NhbGUgLSBtTWluWm9vbVNjYWxlIDw9IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSkgewotICAgICAgICAgICAgLy8gb25seSBob25vciB0aGUgc2Nyb2xsYmFyIG1vZGUgd2hlbiBpdCBpcyBhdCBtaW5pbXVtIHpvb20gbGV2ZWwKLSAgICAgICAgICAgIHJldHVybiBjb21wdXRlVmVydGljYWxTY3JvbGxFeHRlbnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRvIGF2b2lkIHJvdW5kaW5nIGVycm9yIGNhdXNlZCB1bm5lY2Vzc2FyeSBzY3JvbGxiYXIsIHVzZSBmbG9vcgotICAgICAgICAgICAgcmV0dXJuIChpbnQpIE1hdGguZmxvb3IobUNvbnRlbnRIZWlnaHQgKiBtQWN0dWFsU2NhbGUpOworICAgICAgICAgICAgcmV0dXJuIChpbnQpIE1hdGguZmxvb3IobUNvbnRlbnRXaWR0aCAqIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBpbnQgY29tcHV0ZVZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSB7Ci0gICAgICAgIGludCByYW5nZSA9IGNvbXB1dGVSZWFsVmVydGljYWxTY3JvbGxSYW5nZSgpOwotCi0gICAgICAgIC8vIEFkanVzdCByZXBvcnRlZCByYW5nZSBpZiBvdmVyc2Nyb2xsZWQgdG8gY29tcHJlc3MgdGhlIHNjcm9sbCBiYXJzCi0gICAgICAgIGZpbmFsIGludCBzY3JvbGxZID0gbVNjcm9sbFk7Ci0gICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsQm90dG9tID0gY29tcHV0ZU1heFNjcm9sbFkoKTsKLSAgICAgICAgaWYgKHNjcm9sbFkgPCAwKSB7Ci0gICAgICAgICAgICByYW5nZSAtPSBzY3JvbGxZOwotICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbFkgPiBvdmVyc2Nyb2xsQm90dG9tKSB7Ci0gICAgICAgICAgICByYW5nZSArPSBzY3JvbGxZIC0gb3ZlcnNjcm9sbEJvdHRvbTsKKyAgICAgICAgaWYgKG1EcmF3SGlzdG9yeSkgeworICAgICAgICAgICAgcmV0dXJuIG1IaXN0b3J5SGVpZ2h0OworICAgICAgICB9IGVsc2UgaWYgKG1WZXJ0aWNhbFNjcm9sbEJhck1vZGUgPT0gU0NST0xMQkFSX0FMV0FZU09GRgorICAgICAgICAgICAgICAgICYmICFtWm9vbU1hbmFnZXIuY2FuWm9vbU91dCgpKSB7CisgICAgICAgICAgICAvLyBvbmx5IGhvbm9yIHRoZSBzY3JvbGxiYXIgbW9kZSB3aGVuIGl0IGlzIGF0IG1pbmltdW0gem9vbSBsZXZlbAorICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVWZXJ0aWNhbFNjcm9sbEV4dGVudCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdG8gYXZvaWQgcm91bmRpbmcgZXJyb3IgY2F1c2VkIHVubmVjZXNzYXJ5IHNjcm9sbGJhciwgdXNlIGZsb29yCisgICAgICAgICAgICByZXR1cm4gKGludCkgTWF0aC5mbG9vcihtQ29udGVudEhlaWdodCAqIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByYW5nZTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTI1MDQsMjMgKzI0NTcsNiBAQAogICAgICAgICBzY3JvbGxCYXIuZHJhdyhjYW52YXMpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uT3ZlcnNjcm9sbGVkKGludCBzY3JvbGxYLCBpbnQgc2Nyb2xsWSwgYm9vbGVhbiBjbGFtcGVkWCwKLSAgICAgICAgICAgIGJvb2xlYW4gY2xhbXBlZFkpIHsKLSAgICAgICAgbUluT3ZlclNjcm9sbE1vZGUgPSBmYWxzZTsKLSAgICAgICAgaW50IG1heFggPSBjb21wdXRlTWF4U2Nyb2xsWCgpOwotICAgICAgICBpZiAobWF4WCA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBkbyBub3Qgb3ZlciBzY3JvbGwgeCBpZiB0aGUgcGFnZSBqdXN0IGZpdHMgdGhlIHNjcmVlbgotICAgICAgICAgICAgc2Nyb2xsWCA9IHBpbkxvY1goc2Nyb2xsWCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2Nyb2xsWCA8IDAgfHwgc2Nyb2xsWCA+IG1heFgpIHsKLSAgICAgICAgICAgIG1Jbk92ZXJTY3JvbGxNb2RlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2Nyb2xsWSA8IDAgfHwgc2Nyb2xsWSA+IGNvbXB1dGVNYXhTY3JvbGxZKCkpIHsKLSAgICAgICAgICAgIG1Jbk92ZXJTY3JvbGxNb2RlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5zY3JvbGxUbyhzY3JvbGxYLCBzY3JvbGxZKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBHZXQgdGhlIHVybCBmb3IgdGhlIGN1cnJlbnQgcGFnZS4gVGhpcyBpcyBub3QgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSB1cmwKICAgICAgKiBwYXNzZWQgdG8gV2ViVmlld0NsaWVudC5vblBhZ2VTdGFydGVkIGJlY2F1c2UgYWx0aG91Z2ggdGhlIGxvYWQgZm9yCkBAIC0yNTY2LDcgKzI1MDIsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgdG91Y2ggaWNvbiB1cmwgZm9yIHRoZSBhcHBsZS10b3VjaC1pY29uIDxsaW5rPiBlbGVtZW50LgorICAgICAqIEdldCB0aGUgdG91Y2ggaWNvbiB1cmwgZm9yIHRoZSBhcHBsZS10b3VjaC1pY29uIDxsaW5rPiBlbGVtZW50LCBvcgorICAgICAqIGEgVVJMIG9uIHRoaXMgc2l0ZSdzIHNlcnZlciBwb2ludGluZyB0byB0aGUgc3RhbmRhcmQgbG9jYXRpb24gb2YgYQorICAgICAqIHRvdWNoIGljb24uCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFRvdWNoSWNvblVybCgpIHsKQEAgLTI3NDMsMTAgKzI2ODEsNiBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZpbmRJc1VwKGJvb2xlYW4gaXNVcCkgewogICAgICAgICBtRmluZElzVXAgPSBpc1VwOwotICAgICAgICBpZiAoaXNVcCkgewotICAgICAgICAgICAgcmVjb3JkTmV3Q29udGVudFNpemUobUNvbnRlbnRXaWR0aCwgbUNvbnRlbnRIZWlnaHQgKyBtRmluZEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICB9CiAgICAgICAgIGlmICgwID09IG1OYXRpdmVDbGFzcykgcmV0dXJuOyAvLyBjbGllbnQgaXNuJ3QgaW5pdGlhbGl6ZWQKICAgICAgICAgbmF0aXZlU2V0RmluZElzVXAoaXNVcCk7CiAgICAgfQpAQCAtMjc2Myw3ICsyNjk3LDYgQEAKICAgICAvLyBvciBub3Qgd2UgZHJhdyB0aGUgaGlnaGxpZ2h0cyBmb3IgbWF0Y2hlcy4KICAgICBwcml2YXRlIGJvb2xlYW4gbUZpbmRJc1VwOwogCi0gICAgcHJpdmF0ZSBpbnQgbUZpbmRIZWlnaHQ7CiAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgbGFzdCBzdHJpbmcgc2VudCwgc28gd2UgY2FuIHNlYXJjaCBhZ2FpbiBhZnRlciBhbgogICAgIC8vIG9yaWVudGF0aW9uIGNoYW5nZSBvciB0aGUgZGlzbWlzc2FsIG9mIHRoZSBzb2Z0IGtleWJvYXJkLgogICAgIHByaXZhdGUgU3RyaW5nIG1MYXN0RmluZDsKQEAgLTI4MzgsOCArMjc3MSw2IEBACiAgICAgICAgIH0KICAgICAgICAgY2xlYXJNYXRjaGVzKCk7CiAgICAgICAgIHNldEZpbmRJc1VwKGZhbHNlKTsKLSAgICAgICAgcmVjb3JkTmV3Q29udGVudFNpemUobUNvbnRlbnRXaWR0aCwgbUNvbnRlbnRIZWlnaHQgLSBtRmluZEhlaWdodCwKLSAgICAgICAgICAgICAgICBmYWxzZSk7CiAgICAgICAgIC8vIE5vdyB0aGF0IHRoZSBkaWFsb2cgaGFzIGJlZW4gcmVtb3ZlZCwgZW5zdXJlIHRoYXQgd2Ugc2Nyb2xsIHRvIGEKICAgICAgICAgLy8gbG9jYXRpb24gdGhhdCBpcyBub3QgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHBhZ2UuCiAgICAgICAgIHBpblNjcm9sbFRvKG1TY3JvbGxYLCBtU2Nyb2xsWSwgZmFsc2UsIDApOwpAQCAtMjg0NywxNiArMjc3OCw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5kRGlhbG9nSGVpZ2h0KGludCBoZWlnaHQpIHsKLSAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKLSAgICAgICAgICAgIExvZy52KExPR1RBRywgInNldEZpbmREaWFsb2dIZWlnaHQgaGVpZ2h0PSIgKyBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIG1GaW5kSGVpZ2h0ID0gaGVpZ2h0OwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFF1ZXJ5IHRoZSBkb2N1bWVudCB0byBzZWUgaWYgaXQgY29udGFpbnMgYW55IGltYWdlIHJlZmVyZW5jZXMuIFRoZQogICAgICAqIG1lc3NhZ2Ugb2JqZWN0IHdpbGwgYmUgZGlzcGF0Y2hlZCB3aXRoIGFyZzEgYmVpbmcgc2V0IHRvIDEgaWYgaW1hZ2VzCiAgICAgICogd2VyZSBmb3VuZCBhbmQgMCBpZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgcmVmZXJlbmNlIGFueSBpbWFnZXMuCkBAIC0yODY5LDE5ICsyNzkwLDMxIEBACiAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5ET0NfSEFTX0lNQUdFUywgcmVzcG9uc2UpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJlcXVlc3QgdGhlIHNjcm9sbGVyIHRvIGFib3J0IGFueSBvbmdvaW5nIGFuaW1hdGlvbgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wU2Nyb2xsKCkgeworICAgICAgICBtU2Nyb2xsZXIuZm9yY2VGaW5pc2hlZCh0cnVlKTsKKyAgICAgICAgbUxhc3RWZWxvY2l0eSA9IDA7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY29tcHV0ZVNjcm9sbCgpIHsKICAgICAgICAgaWYgKG1TY3JvbGxlci5jb21wdXRlU2Nyb2xsT2Zmc2V0KCkpIHsKICAgICAgICAgICAgIGludCBvbGRYID0gbVNjcm9sbFg7CiAgICAgICAgICAgICBpbnQgb2xkWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgaW50IHggPSBtU2Nyb2xsZXIuZ2V0Q3VyclgoKTsKLSAgICAgICAgICAgIGludCB5ID0gbVNjcm9sbGVyLmdldEN1cnJZKCk7CisgICAgICAgICAgICBtU2Nyb2xsWCA9IG1TY3JvbGxlci5nZXRDdXJyWCgpOworICAgICAgICAgICAgbVNjcm9sbFkgPSBtU2Nyb2xsZXIuZ2V0Q3VyclkoKTsKICAgICAgICAgICAgIHBvc3RJbnZhbGlkYXRlKCk7ICAvLyBTbyB3ZSBkcmF3IGFnYWluCi0KLSAgICAgICAgICAgIGlmIChvbGRYICE9IHggfHwgb2xkWSAhPSB5KSB7Ci0gICAgICAgICAgICAgICAgb3ZlcnNjcm9sbEJ5KHggLSBvbGRYLCB5IC0gb2xkWSwgb2xkWCwgb2xkWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVNYXhTY3JvbGxYKCksIGNvbXB1dGVNYXhTY3JvbGxZKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRWaWV3V2lkdGgoKSAvIDMsIGdldFZpZXdIZWlnaHQoKSAvIDMsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChvbGRYICE9IG1TY3JvbGxYIHx8IG9sZFkgIT0gbVNjcm9sbFkpIHsKKyAgICAgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQobVNjcm9sbFgsIG1TY3JvbGxZLCBvbGRYLCBvbGRZKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWJvcnRBbmltYXRpb24oKTsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoUkVTVU1FX1dFQkNPUkVfUFJJT1JJVFkpOworICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVByaW9yaXR5KCk7CisgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3VwZXIuY29tcHV0ZVNjcm9sbCgpOwpAQCAtMjk3MCw2ICsyOTAzLDI5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUGFnZVRoYXROZWVkc1RvU2xpZGVUaXRsZUJhck9mZlNjcmVlbiA9IG51bGw7CiAgICAgICAgIH0KKworICAgICAgICBpbmplY3RBY2Nlc3NpYmlsaXR5Rm9yVXJsKHVybCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaW5qZWN0cyBhY2Nlc3NpYmlsaXR5IGluIHRoZSBsb2FkZWQgZG9jdW1lbnQgaWYgYWNjZXNzaWJpbGl0eQorICAgICAqIGlzIGVuYWJsZWQuIElmIEphdmFTY3JpcHQgaXMgZW5hYmxlZCB3ZSB0cnkgdG8gaW5qZWN0IGEgVVJMIHNwZWNpZmljIHNjcmlwdC4KKyAgICAgKiBJZiBubyBVUkwgc3BlY2lmaWMgc2NyaXB0IGlzIGZvdW5kIG9yIEphdmFTY3JpcHQgaXMgZGlzYWJsZWQgd2UgZmFsbGJhY2sgdG8KKyAgICAgKiB0aGUgZGVmYXVsdCB7QGxpbmsgQWNjZXNzaWJpbGl0eUluamVjdG9yfSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBsb2FkZWQgYnkgdGhpcyB7QGxpbmsgV2ViVmlld30uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluamVjdEFjY2Vzc2liaWxpdHlGb3JVcmwoU3RyaW5nIHVybCkgeworICAgICAgICBpZiAoQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UobUNvbnRleHQpLmlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXRKYXZhU2NyaXB0RW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9hZFVybChBQ0NFU1NJQklMSVRZX1NDUklQVF9DSE9PU0VSX0pBVkFTQ1JJUFQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtQWNjZXNzaWJpbGl0eUluamVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eUluamVjdG9yID0gbmV3IEFjY2Vzc2liaWxpdHlJbmplY3Rvcih0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRoYXQgYWNjZXNzaWJpbGl0eSB3YXMgdHVybmVkIG9mZiBiZXR3ZWVuIHJlbG9hZHMKKyAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3IgPSBudWxsOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMDg2LDcgKzMwNDIsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgcmVxdWVzdCBhIGxheW91dCwgdHJ5IHRvIHNlbmQgb3VyIHZpZXcgc2l6ZSB0byB0aGUKICAgICAgICAgICAgIC8vIG5hdGl2ZSBzaWRlIHRvIGVuc3VyZSB0aGF0IFdlYkNvcmUgaGFzIHRoZSBjb3JyZWN0IGRpbWVuc2lvbnMuCi0gICAgICAgICAgICBzZW5kVmlld1NpemVab29tKCk7CisgICAgICAgICAgICBzZW5kVmlld1NpemVab29tKGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzIxNiw0NiArMzE3Miw3IEBACiAgICAgICogICAgICAgICBzZXR0aW5ncy4KICAgICAgKi8KICAgICBwdWJsaWMgV2ViU2V0dGluZ3MgZ2V0U2V0dGluZ3MoKSB7Ci0gICAgICAgIHJldHVybiBtV2ViVmlld0NvcmUuZ2V0U2V0dGluZ3MoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gaW5mb3JtIHRoZSB3ZWJ2aWV3IGFib3V0IHBhY2thZ2VzIHRoYXQgYXJlIGluc3RhbGxlZAotICAgICAqIGluIHRoZSBzeXN0ZW0uIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSB1c2VkIGJ5IHRoZQotICAgICAqIG5hdmlnYXRvci5pc0FwcGxpY2F0aW9uSW5zdGFsbGVkKCkgQVBJLgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZXMgaXMgYSBzZXQgb2YgcGFja2FnZSBuYW1lcyB0aGF0IGFyZSBrbm93biB0byBiZQotICAgICAqIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtLgotICAgICAqCi0gICAgICogQGhpZGUgbm90IGEgcHVibGljIEFQSQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhY2thZ2VOYW1lcyhTZXQ8U3RyaW5nPiBwYWNrYWdlTmFtZXMpIHsKLSAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkFERF9QQUNLQUdFX05BTUVTLCBwYWNrYWdlTmFtZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZSB0aGlzIG1ldGhvZCB0byBpbmZvcm0gdGhlIHdlYnZpZXcgYWJvdXQgc2luZ2xlIHBhY2thZ2VzIHRoYXQgYXJlCi0gICAgICogaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0uIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSB1c2VkIGJ5IHRoZQotICAgICAqIG5hdmlnYXRvci5pc0FwcGxpY2F0aW9uSW5zdGFsbGVkKCkgQVBJLgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBpcyB0aGUgbmFtZSBvZiBhIHBhY2thZ2UgdGhhdCBpcyBrbm93biB0byBiZQotICAgICAqIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtLgotICAgICAqCi0gICAgICogQGhpZGUgbm90IGEgcHVibGljIEFQSQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuQUREX1BBQ0tBR0VfTkFNRSwgcGFja2FnZU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZSB0aGlzIG1ldGhvZCB0byBpbmZvcm0gdGhlIHdlYnZpZXcgYWJvdXQgcGFja2FnZXMgdGhhdCBhcmUgdW5pbnN0YWxsZWQKLSAgICAgKiBpbiB0aGUgc3lzdGVtLiBUaGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBieSB0aGUKLSAgICAgKiBuYXZpZ2F0b3IuaXNBcHBsaWNhdGlvbkluc3RhbGxlZCgpIEFQSS4KLSAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgaXMgdGhlIG5hbWUgb2YgYSBwYWNrYWdlIHRoYXQgaGFzIGJlZW4gdW5pbnN0YWxsZWQgaW4KLSAgICAgKiB0aGUgc3lzdGVtLgotICAgICAqCi0gICAgICogQGhpZGUgbm90IGEgcHVibGljIEFQSQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuUkVNT1ZFX1BBQ0tBR0VfTkFNRSwgcGFja2FnZU5hbWUpOworICAgICAgICByZXR1cm4gKG1XZWJWaWV3Q29yZSAhPSBudWxsKSA/IG1XZWJWaWV3Q29yZS5nZXRTZXR0aW5ncygpIDogbnVsbDsKICAgICB9CiAKICAgIC8qKgpAQCAtMzI5MiwxMyArMzIwOSw4IEBACiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gZHJhd0NoaWxkKENhbnZhcyBjYW52YXMsIFZpZXcgY2hpbGQsIGxvbmcgZHJhd2luZ1RpbWUpIHsKICAgICAgICAgaWYgKGNoaWxkID09IG1UaXRsZUJhcikgewogICAgICAgICAgICAgLy8gV2hlbiBkcmF3aW5nIHRoZSB0aXRsZSBiYXIsIG1vdmUgaXQgaG9yaXpvbnRhbGx5IHRvIGFsd2F5cyBzaG93Ci0gICAgICAgICAgICAvLyBhdCB0aGUgdG9wIG9mIHRoZSBXZWJWaWV3LiBXaGlsZSBvdmVyc2Nyb2xsLCBzdGljayB0aGUgdGl0bGUgYmFyCi0gICAgICAgICAgICAvLyBvbiB0aGUgdG9wIG90aGVyd2lzZSB3ZSBtYXkgaGF2ZSB0d28gZHVyaW5nIGxvYWRpbmcsIG9uZSBpcyBkcmF3bgotICAgICAgICAgICAgLy8gaGVyZSwgYW5vdGhlciBpcyBkcmF3biBieSB0aGUgQnJvd3Nlci4KKyAgICAgICAgICAgIC8vIGF0IHRoZSB0b3Agb2YgdGhlIFdlYlZpZXcuCiAgICAgICAgICAgICBtVGl0bGVCYXIub2Zmc2V0TGVmdEFuZFJpZ2h0KG1TY3JvbGxYIC0gbVRpdGxlQmFyLmdldExlZnQoKSk7Ci0gICAgICAgICAgICBpZiAobVNjcm9sbFkgPD0gMCkgewotICAgICAgICAgICAgICAgIG1UaXRsZUJhci5vZmZzZXRUb3BBbmRCb3R0b20obVNjcm9sbFkgLSBtVGl0bGVCYXIuZ2V0VG9wKCkpOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdXBlci5kcmF3Q2hpbGQoY2FudmFzLCBjaGlsZCwgZHJhd2luZ1RpbWUpOwogICAgIH0KQEAgLTMzMzQsMzYgKzMyNDYsNiBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50IHNhdmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgIGlmIChtSW5PdmVyU2Nyb2xsTW9kZSAmJiAhZ2V0U2V0dGluZ3MoKQotICAgICAgICAgICAgICAgIC5nZXRVc2VXZWJWaWV3QmFja2dyb3VuZEZvck92ZXJzY3JvbGxCYWNrZ3JvdW5kKCkpIHsKLSAgICAgICAgICAgIGlmIChtT3ZlclNjcm9sbEJhY2tncm91bmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1PdmVyU2Nyb2xsQmFja2dyb3VuZCA9IG5ldyBQYWludCgpOwotICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuc3RhdHVzX2Jhcl9iYWNrZ3JvdW5kKTsKLSAgICAgICAgICAgICAgICBtT3ZlclNjcm9sbEJhY2tncm91bmQuc2V0U2hhZGVyKG5ldyBCaXRtYXBTaGFkZXIoYm0sCi0gICAgICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuUkVQRUFULCBTaGFkZXIuVGlsZU1vZGUuUkVQRUFUKSk7Ci0gICAgICAgICAgICAgICAgbU92ZXJTY3JvbGxCb3JkZXIgPSBuZXcgUGFpbnQoKTsKLSAgICAgICAgICAgICAgICBtT3ZlclNjcm9sbEJvcmRlci5zZXRTdHlsZShQYWludC5TdHlsZS5TVFJPS0UpOwotICAgICAgICAgICAgICAgIG1PdmVyU2Nyb2xsQm9yZGVyLnNldFN0cm9rZVdpZHRoKDApOwotICAgICAgICAgICAgICAgIG1PdmVyU2Nyb2xsQm9yZGVyLnNldENvbG9yKDB4ZmZiYmJiYmIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgdG9wID0gZ2V0VGl0bGVIZWlnaHQoKTsKLSAgICAgICAgICAgIGludCByaWdodCA9IGNvbXB1dGVSZWFsSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCk7Ci0gICAgICAgICAgICBpbnQgYm90dG9tID0gdG9wICsgY29tcHV0ZVJlYWxWZXJ0aWNhbFNjcm9sbFJhbmdlKCk7Ci0gICAgICAgICAgICAvLyBmaXJzdCBkcmF3IHRoZSBiYWNrZ3JvdW5kIGFuZCBhbmNob3IgdG8gdGhlIHRvcCBvZiB0aGUgdmlldwotICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKLSAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUobVNjcm9sbFgsIG1TY3JvbGxZKTsKLSAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgtbVNjcm9sbFgsIHRvcCAtIG1TY3JvbGxZLCByaWdodCAtIG1TY3JvbGxYLCBib3R0b20KLSAgICAgICAgICAgICAgICAgICAgLSBtU2Nyb2xsWSwgUmVnaW9uLk9wLkRJRkZFUkVOQ0UpOwotICAgICAgICAgICAgY2FudmFzLmRyYXdQYWludChtT3ZlclNjcm9sbEJhY2tncm91bmQpOwotICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKLSAgICAgICAgICAgIC8vIHRoZW4gZHJhdyB0aGUgYm9yZGVyCi0gICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoLTEsIHRvcCAtIDEsIHJpZ2h0LCBib3R0b20sIG1PdmVyU2Nyb2xsQm9yZGVyKTsKLSAgICAgICAgICAgIC8vIG5leHQgY2xpcCB0aGUgcmVnaW9uIGZvciB0aGUgY29udGVudAotICAgICAgICAgICAgY2FudmFzLmNsaXBSZWN0KDAsIHRvcCwgcmlnaHQsIGJvdHRvbSk7Ci0gICAgICAgIH0KICAgICAgICAgaWYgKG1UaXRsZUJhciAhPSBudWxsKSB7CiAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAsIChpbnQpIG1UaXRsZUJhci5nZXRIZWlnaHQoKSk7CiAgICAgICAgIH0KQEAgLTMzOTIsNyArMzI3NCw0NyBAQAogICAgICAgICBpZiAoQVVUT19SRURSQVdfSEFDSyAmJiBtQXV0b1JlZHJhdykgewogICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICB9CisgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkpIG1XZWJUZXh0Vmlldy5vbkRyYXdTdWJzdGl0dXRlKCk7CiAgICAgICAgIG1XZWJWaWV3Q29yZS5zaWduYWxSZXBhaW50RG9uZSgpOworCisgICAgICAgIC8vIHBhaW50IHRoZSBoaWdobGlnaHQgaW4gdGhlIGVuZAorICAgICAgICBpZiAoIW1Ub3VjaEhpZ2hsaWdodFJlZ2lvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChtVG91Y2hIaWdodGxpZ2h0UGFpbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2h0bGlnaHRQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2h0bGlnaHRQYWludC5zZXRDb2xvcihtSGlnaHRsaWdodENvbG9yKTsKKyAgICAgICAgICAgICAgICBtVG91Y2hIaWdodGxpZ2h0UGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2h0bGlnaHRQYWludC5zZXRQYXRoRWZmZWN0KG5ldyBDb3JuZXJQYXRoRWZmZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgVE9VQ0hfSElHSExJR0hUX0FSQykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRoKG1Ub3VjaEhpZ2hsaWdodFJlZ2lvbi5nZXRCb3VuZGFyeVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaHRsaWdodFBhaW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoREVCVUdfVE9VQ0hfSElHSExJR0hUKSB7CisgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXROYXZEdW1wKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKG1Ub3VjaEhpZ2hsaWdodFggfCBtVG91Y2hIaWdobGlnaHRZKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hDcm9zc0hhaXJDb2xvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hDcm9zc0hhaXJDb2xvciA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoQ3Jvc3NIYWlyQ29sb3Iuc2V0Q29sb3IoQ29sb3IuUkVEKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmUobVRvdWNoSGlnaGxpZ2h0WCAtIG1OYXZTbG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFkgLSBtTmF2U2xvcCwgbVRvdWNoSGlnaGxpZ2h0WAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtTmF2U2xvcCArIDEsIG1Ub3VjaEhpZ2hsaWdodFkgKyBtTmF2U2xvcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxLCBtVG91Y2hDcm9zc0hhaXJDb2xvcik7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZShtVG91Y2hIaWdobGlnaHRYICsgbU5hdlNsb3AgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFkgLSBtTmF2U2xvcCwgbVRvdWNoSGlnaGxpZ2h0WAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtTmF2U2xvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRZICsgbU5hdlNsb3AgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaENyb3NzSGFpckNvbG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlVG91Y2hIaWdobGlnaHQoYm9vbGVhbiByZW1vdmVQZW5kaW5nTWVzc2FnZSkgeworICAgICAgICBpZiAocmVtb3ZlUGVuZGluZ01lc3NhZ2UpIHsKKyAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5yZW1vdmVNZXNzYWdlcyhFdmVudEh1Yi5HRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTKTsKKyAgICAgICAgfQorICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuUkVNT1ZFX1RPVUNIX0hJR0hMSUdIVF9SRUNUUyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zNDE0LDcgKzMzMzYsNyBAQAogICAgICAgICAgICAgY2VudGVyS2V5UHJlc3NPblRleHRGaWVsZCgpOwogICAgICAgICAgICAgcmVidWlsZFdlYlRleHRWaWV3KCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjbGVhclRleHRFbnRyeSh0cnVlKTsKKyAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSkgewogICAgICAgICAgICAgcmV0dXJuIG1XZWJUZXh0Vmlldy5wZXJmb3JtTG9uZ0NsaWNrKCk7CkBAIC0zNDQzLDE5ICszMzY1LDYgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGJvb2xlYW4gaW5BbmltYXRlWm9vbSgpIHsKLSAgICAgICAgcmV0dXJuIG1ab29tU2NhbGUgIT0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOZWVkIHRvIGFkanVzdCB0aGUgV2ViVGV4dFZpZXcgYWZ0ZXIgYSBjaGFuZ2UgaW4gem9vbSwgc2luY2UgbUFjdHVhbFNjYWxlCi0gICAgICogaGFzIGNoYW5nZWQuICBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciBwYXNzd29yZCBmaWVsZHMsIHdoaWNoIGFyZQotICAgICAqIGRyYXduIGJ5IHRoZSBXZWJUZXh0Vmlldywgc2luY2UgaXQgY29udmV5cyBtb3JlIGluZm9ybWF0aW9uIHRoYW4gd2hhdAotICAgICAqIHdlYmtpdCBkcmF3cy4gIFRodXMgd2UgbmVlZCB0byByZXBvc2l0aW9uIGl0IHRvIHNob3cgaW4gdGhlIGNvcnJlY3QKLSAgICAgKiBwbGFjZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRUb0FkanVzdFdlYlRleHRWaWV3OwotCiAgICAgcHJpdmF0ZSBib29sZWFuIGRpZFVwZGF0ZVRleHRWaWV3Qm91bmRzKGJvb2xlYW4gYWxsb3dJbnRlcnNlY3QpIHsKICAgICAgICAgUmVjdCBjb250ZW50Qm91bmRzID0gbmF0aXZlRm9jdXNDYW5kaWRhdGVOb2RlQm91bmRzKCk7CiAgICAgICAgIFJlY3QgdkJveCA9IGNvbnRlbnRUb1ZpZXdSZWN0KGNvbnRlbnRCb3VuZHMpOwpAQCAtMzQ4MywyNSArMzM5Miw1NCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGRyYXdFeHRyYXMoQ2FudmFzIGNhbnZhcywgaW50IGV4dHJhcywgYm9vbGVhbiBhbmltYXRpb25zUnVubmluZykgewotICAgICAgICAvLyBJZiBtTmF0aXZlQ2xhc3MgaXMgMCwgd2Ugc2hvdWxkIG5vdCByZWFjaCBoZXJlLCBzbyB3ZSBkbyBub3QKLSAgICAgICAgLy8gbmVlZCB0byBjaGVjayBpdCBhZ2Fpbi4KLSAgICAgICAgaWYgKGFuaW1hdGlvbnNSdW5uaW5nKSB7Ci0gICAgICAgICAgICBjYW52YXMuc2V0RHJhd0ZpbHRlcihtV2ViVmlld0NvcmUubVpvb21GaWx0ZXIpOworICAgIHByaXZhdGUgdm9pZCBvblpvb21BbmltYXRpb25TdGFydCgpIHsKKyAgICAgICAgLy8gSWYgaXQgaXMgaW4gcGFzc3dvcmQgbW9kZSwgdHVybiBpdCBvZmYgc28gaXQgZG9lcyBub3QgZHJhdyBtaXNwbGFjZWQuCisgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkgJiYgbmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKKyAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRJblBhc3N3b3JkKGZhbHNlKTsKICAgICAgICAgfQotICAgICAgICBuYXRpdmVEcmF3RXh0cmFzKGNhbnZhcywgZXh0cmFzKTsKLSAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIobnVsbCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIG9uWm9vbUFuaW1hdGlvbkVuZCgpIHsKKyAgICAgICAgLy8gYWRqdXN0IHRoZSBlZGl0IHRleHQgdmlldyBpZiBuZWVkZWQKKyAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiBkaWRVcGRhdGVUZXh0Vmlld0JvdW5kcyhmYWxzZSkgJiYgbmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKKyAgICAgICAgICAgIC8vIElmIGl0IGlzIGEgcGFzc3dvcmQgZmllbGQsIHN0YXJ0IGRyYXdpbmcgdGhlIFdlYlRleHRWaWV3IG9uY2UKKyAgICAgICAgICAgIC8vIGFnYWluLgorICAgICAgICAgICAgbVdlYlRleHRWaWV3LnNldEluUGFzc3dvcmQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG9uRml4ZWRMZW5ndGhab29tQW5pbWF0aW9uU3RhcnQoKSB7CisgICAgICAgIFdlYlZpZXdDb3JlLnBhdXNlVXBkYXRlUGljdHVyZShnZXRXZWJWaWV3Q29yZSgpKTsKKyAgICAgICAgb25ab29tQW5pbWF0aW9uU3RhcnQoKTsKKyAgICB9CisKKyAgICB2b2lkIG9uRml4ZWRMZW5ndGhab29tQW5pbWF0aW9uRW5kKCkgeworICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7CisgICAgICAgIG9uWm9vbUFuaW1hdGlvbkVuZCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaT09NX0JJVFMgPSBQYWludC5GSUxURVJfQklUTUFQX0ZMQUcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5ESVRIRVJfRkxBRyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LlNVQlBJWEVMX1RFWFRfRkxBRzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX0JJVFMgPSBQYWludC5GSUxURVJfQklUTUFQX0ZMQUcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkRJVEhFUl9GTEFHOworCisgICAgcHJpdmF0ZSBmaW5hbCBEcmF3RmlsdGVyIG1ab29tRmlsdGVyID0KKyAgICAgICAgICAgIG5ldyBQYWludEZsYWdzRHJhd0ZpbHRlcihaT09NX0JJVFMsIFBhaW50LkxJTkVBUl9URVhUX0ZMQUcpOworICAgIC8vIElmIHdlIG5lZWQgdG8gdHJhZGUgYmV0dGVyIHF1YWxpdHkgZm9yIHNwZWVkLCBzZXQgbVNjcm9sbEZpbHRlciB0byBudWxsCisgICAgcHJpdmF0ZSBmaW5hbCBEcmF3RmlsdGVyIG1TY3JvbGxGaWx0ZXIgPQorICAgICAgICAgICAgbmV3IFBhaW50RmxhZ3NEcmF3RmlsdGVyKFNDUk9MTF9CSVRTLCAwKTsKKwogICAgIHByaXZhdGUgdm9pZCBkcmF3Q29yZUFuZEN1cnNvclJpbmcoQ2FudmFzIGNhbnZhcywgaW50IGNvbG9yLAogICAgICAgICBib29sZWFuIGRyYXdDdXJzb3JSaW5nKSB7CiAgICAgICAgIGlmIChtRHJhd0hpc3RvcnkpIHsKLSAgICAgICAgICAgIGNhbnZhcy5zY2FsZShtQWN0dWFsU2NhbGUsIG1BY3R1YWxTY2FsZSk7CisgICAgICAgICAgICBjYW52YXMuc2NhbGUobVpvb21NYW5hZ2VyLmdldFNjYWxlKCksIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICAgICAgICAgIGNhbnZhcy5kcmF3UGljdHVyZShtSGlzdG9yeVBpY3R1cmUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgPT0gMCkgcmV0dXJuOwogCi0gICAgICAgIGJvb2xlYW4gYW5pbWF0ZVpvb20gPSBtWm9vbVNjYWxlICE9IDA7CisgICAgICAgIGJvb2xlYW4gYW5pbWF0ZVpvb20gPSBtWm9vbU1hbmFnZXIuaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKTsKICAgICAgICAgYm9vbGVhbiBhbmltYXRlU2Nyb2xsID0gKCghbVNjcm9sbGVyLmlzRmluaXNoZWQoKQogICAgICAgICAgICAgICAgIHx8IG1WZWxvY2l0eVRyYWNrZXIgIT0gbnVsbCkKICAgICAgICAgICAgICAgICAmJiAobVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX01PREUgfHwKQEAgLTM1MjAsNTkgKzM0NTgsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChhbmltYXRlWm9vbSkgewotICAgICAgICAgICAgZmxvYXQgem9vbVNjYWxlOwotICAgICAgICAgICAgaW50IGludGVydmFsID0gKGludCkgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gbVpvb21TdGFydCk7Ci0gICAgICAgICAgICBpZiAoaW50ZXJ2YWwgPCBaT09NX0FOSU1BVElPTl9MRU5HVEgpIHsKLSAgICAgICAgICAgICAgICBmbG9hdCByYXRpbyA9IChmbG9hdCkgaW50ZXJ2YWwgLyBaT09NX0FOSU1BVElPTl9MRU5HVEg7Ci0gICAgICAgICAgICAgICAgem9vbVNjYWxlID0gMS4wZiAvIChtSW52SW5pdGlhbFpvb21TY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAobUludkZpbmFsWm9vbVNjYWxlIC0gbUludkluaXRpYWxab29tU2NhbGUpICogcmF0aW8pOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgem9vbVNjYWxlID0gbVpvb21TY2FsZTsKLSAgICAgICAgICAgICAgICAvLyBzZXQgbVpvb21TY2FsZSB0byBiZSAwIGFzIHdlIGhhdmUgZG9uZSBhbmltYXRpb24KLSAgICAgICAgICAgICAgICBtWm9vbVNjYWxlID0gMDsKLSAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7Ci0gICAgICAgICAgICAgICAgLy8gY2FsbCBpbnZhbGlkYXRlKCkgYWdhaW4gdG8gZHJhdyB3aXRoIHRoZSBmaW5hbCBmaWx0ZXJzCi0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIGlmIChtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXcpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5lZWRUb0FkanVzdFdlYlRleHRWaWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkaWRVcGRhdGVUZXh0Vmlld0JvdW5kcyhmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQgaXMgYSBwYXNzd29yZCBmaWVsZCwgc3RhcnQgZHJhd2luZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlYlRleHRWaWV3IG9uY2UgYWdhaW4uCi0gICAgICAgICAgICAgICAgICAgICAgICBtV2ViVGV4dFZpZXcuc2V0SW5QYXNzd29yZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgaW50ZXJtZWRpYXRlIHNjcm9sbCBwb3NpdGlvbi4gQXMgd2UgbmVlZCB0byB1c2UKLSAgICAgICAgICAgIC8vIHpvb21TY2FsZSwgd2UgY2FuJ3QgdXNlIHBpbkxvY1gvWSBkaXJlY3RseS4gQ29weSB0aGUgbG9naWMgaGVyZS4KLSAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gem9vbVNjYWxlICogbUludkluaXRpYWxab29tU2NhbGU7Ci0gICAgICAgICAgICBpbnQgdHggPSBNYXRoLnJvdW5kKHNjYWxlICogKG1Jbml0aWFsU2Nyb2xsWCArIG1ab29tQ2VudGVyWCkKLSAgICAgICAgICAgICAgICAgICAgLSBtWm9vbUNlbnRlclgpOwotICAgICAgICAgICAgdHggPSAtcGluTG9jKHR4LCBnZXRWaWV3V2lkdGgoKSwgTWF0aC5yb3VuZChtQ29udGVudFdpZHRoCi0gICAgICAgICAgICAgICAgICAgICogem9vbVNjYWxlKSkgKyBtU2Nyb2xsWDsKLSAgICAgICAgICAgIGludCB0aXRsZUhlaWdodCA9IGdldFRpdGxlSGVpZ2h0KCk7Ci0gICAgICAgICAgICBpbnQgdHkgPSBNYXRoLnJvdW5kKHNjYWxlCi0gICAgICAgICAgICAgICAgICAgICogKG1Jbml0aWFsU2Nyb2xsWSArIG1ab29tQ2VudGVyWSAtIHRpdGxlSGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAtIChtWm9vbUNlbnRlclkgLSB0aXRsZUhlaWdodCkpOwotICAgICAgICAgICAgdHkgPSAtKHR5IDw9IHRpdGxlSGVpZ2h0ID8gTWF0aC5tYXgodHksIDApIDogcGluTG9jKHR5Ci0gICAgICAgICAgICAgICAgICAgIC0gdGl0bGVIZWlnaHQsIGdldFZpZXdIZWlnaHQoKSwgTWF0aC5yb3VuZChtQ29udGVudEhlaWdodAotICAgICAgICAgICAgICAgICAgICAqIHpvb21TY2FsZSkpICsgdGl0bGVIZWlnaHQpICsgbVNjcm9sbFk7Ci0gICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKHR4LCB0eSk7Ci0gICAgICAgICAgICBjYW52YXMuc2NhbGUoem9vbVNjYWxlLCB6b29tU2NhbGUpOwotICAgICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiAhbU5lZWRUb0FkanVzdFdlYlRleHRWaWV3Ci0gICAgICAgICAgICAgICAgICAgICYmIG1ab29tU2NhbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBXZWJUZXh0VmlldyBpcyB1cC4gIEtlZXAgdHJhY2sgb2YgdGhpcyBzbyB3ZSBjYW4gYWRqdXN0Ci0gICAgICAgICAgICAgICAgLy8gaXRzIHNpemUgYW5kIHBsYWNlbWVudCB3aGVuIHdlIGZpbmlzaCB6b29taW5nCi0gICAgICAgICAgICAgICAgbU5lZWRUb0FkanVzdFdlYlRleHRWaWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBpbiBwYXNzd29yZCBtb2RlLCB0dXJuIGl0IG9mZiBzbyBpdCBkb2VzIG5vdCBkcmF3Ci0gICAgICAgICAgICAgICAgLy8gbWlzcGxhY2VkLgotICAgICAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICBtV2ViVGV4dFZpZXcuc2V0SW5QYXNzd29yZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmFuaW1hdGVab29tKGNhbnZhcyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjYW52YXMuc2NhbGUobUFjdHVhbFNjYWxlLCBtQWN0dWFsU2NhbGUpOworICAgICAgICAgICAgY2FudmFzLnNjYWxlKG1ab29tTWFuYWdlci5nZXRTY2FsZSgpLCBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBib29sZWFuIFVJQW5pbWF0aW9uc1J1bm5pbmcgPSBmYWxzZTsKQEAgLTM1ODQsMjMgKzM0NzIsMzggQEAKICAgICAgICAgICAgIC8vIHdlIGFzayBmb3IgYSByZXBhaW50LgogICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICB9Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5kcmF3Q29udGVudFBpY3R1cmUoY2FudmFzLCBjb2xvciwKLSAgICAgICAgICAgICAgICAoYW5pbWF0ZVpvb20gfHwgbVByZXZpZXdab29tT25seSB8fCBVSUFuaW1hdGlvbnNSdW5uaW5nKSwKLSAgICAgICAgICAgICAgICBhbmltYXRlU2Nyb2xsKTsKLSAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwKSByZXR1cm47CisKICAgICAgICAgLy8gZGVjaWRlIHdoaWNoIGFkb3JubWVudHMgdG8gZHJhdwogICAgICAgICBpbnQgZXh0cmFzID0gRFJBV19FWFRSQVNfTk9ORTsKKyAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKKyAgICAgICAgICAgIExvZy52KExPR1RBRywgIm1GaW5kSXNVcD0iICsgbUZpbmRJc1VwCisgICAgICAgICAgICAgICAgICAgICsgIiBtU2VsZWN0aW5nVGV4dD0iICsgbVNlbGVjdGluZ1RleHQKKyAgICAgICAgICAgICAgICAgICAgKyAiIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpPSIKKyAgICAgICAgICAgICAgICAgICAgKyBuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKQorICAgICAgICAgICAgICAgICAgICArICIgYW5pbWF0ZVpvb209IiArIGFuaW1hdGVab29tKTsKKyAgICAgICAgfQogICAgICAgICBpZiAobUZpbmRJc1VwKSB7Ci0gICAgICAgICAgICAgICAgZXh0cmFzID0gRFJBV19FWFRSQVNfRklORDsKKyAgICAgICAgICAgIGV4dHJhcyA9IERSQVdfRVhUUkFTX0ZJTkQ7CiAgICAgICAgIH0gZWxzZSBpZiAobVNlbGVjdGluZ1RleHQpIHsKICAgICAgICAgICAgIGV4dHJhcyA9IERSQVdfRVhUUkFTX1NFTEVDVElPTjsKICAgICAgICAgICAgIG5hdGl2ZVNldFNlbGVjdGlvblBvaW50ZXIobURyYXdTZWxlY3Rpb25Qb2ludGVyLAotICAgICAgICAgICAgICAgICAgICBtSW52QWN0dWFsU2NhbGUsCisgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpLAogICAgICAgICAgICAgICAgICAgICBtU2VsZWN0WCwgbVNlbGVjdFkgLSBnZXRUaXRsZUhlaWdodCgpKTsKICAgICAgICAgfSBlbHNlIGlmIChkcmF3Q3Vyc29yUmluZykgewogICAgICAgICAgICAgZXh0cmFzID0gRFJBV19FWFRSQVNfQ1VSU09SX1JJTkc7CiAgICAgICAgIH0KLSAgICAgICAgZHJhd0V4dHJhcyhjYW52YXMsIGV4dHJhcywgVUlBbmltYXRpb25zUnVubmluZyk7CisgICAgICAgIERyYXdGaWx0ZXIgZGYgPSBudWxsOworICAgICAgICBpZiAobVpvb21NYW5hZ2VyLmlzWm9vbUFuaW1hdGluZygpIHx8IFVJQW5pbWF0aW9uc1J1bm5pbmcpIHsKKyAgICAgICAgICAgIGRmID0gbVpvb21GaWx0ZXI7CisgICAgICAgIH0gZWxzZSBpZiAoYW5pbWF0ZVNjcm9sbCkgeworICAgICAgICAgICAgZGYgPSBtU2Nyb2xsRmlsdGVyOworICAgICAgICB9CisgICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKGRmKTsKKyAgICAgICAgaW50IGNvbnRlbnQgPSBuYXRpdmVEcmF3KGNhbnZhcywgY29sb3IsIGV4dHJhcywgdHJ1ZSk7CisgICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKG51bGwpOworICAgICAgICBpZiAoY29udGVudCAhPSAwKSB7CisgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU1BMSVRfUElDVFVSRV9TRVQsIGNvbnRlbnQsIDApOworICAgICAgICB9CiAKICAgICAgICAgaWYgKGV4dHJhcyA9PSBEUkFXX0VYVFJBU19DVVJTT1JfUklORykgewogICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfU0hPUlRQUkVTU19TVEFSVF9NT0RFKSB7CkBAIC0zNjI5LDEwICszNTMyLDE0IEBACiAgICAgICAgIHJldHVybiBtRHJhd0hpc3Rvcnk7CiAgICAgfQogCisgICAgaW50IGdldEhpc3RvcnlQaWN0dXJlV2lkdGgoKSB7CisgICAgICAgIHJldHVybiAobUhpc3RvcnlQaWN0dXJlICE9IG51bGwpID8gbUhpc3RvcnlQaWN0dXJlLmdldFdpZHRoKCkgOiAwOworICAgIH0KKwogICAgIC8vIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiBVSSB0aHJlYWQKICAgICB2b2lkIHN3aXRjaE91dERyYXdIaXN0b3J5KCkgewogICAgICAgICBpZiAobnVsbCA9PSBtV2ViVmlld0NvcmUpIHJldHVybjsgLy8gQ2FsbGJhY2tQcm94eSBtYXkgdHJpZ2dlciB0aGlzCi0gICAgICAgIGlmIChtRHJhd0hpc3RvcnkgJiYgbVdlYlZpZXdDb3JlLnBpY3R1cmVSZWFkeSgpKSB7CisgICAgICAgIGlmIChtRHJhd0hpc3RvcnkgJiYgKGdldFByb2dyZXNzKCkgPT0gMTAwIHx8IG5hdGl2ZUhhc0NvbnRlbnQoKSkpIHsKICAgICAgICAgICAgIG1EcmF3SGlzdG9yeSA9IGZhbHNlOwogICAgICAgICAgICAgbUhpc3RvcnlQaWN0dXJlID0gbnVsbDsKICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKQEAgLTM2ODMsNyArMzU5MCw5IEBACiAgICAgICogIEBwYXJhbSAgZW5kICAgICBFbmQgb2Ygc2VsZWN0aW9uLgogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBzZXRTZWxlY3Rpb24oaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfU0VMRUNUSU9OLCBzdGFydCwgZW5kKTsKKyAgICAgICAgaWYgKG1XZWJWaWV3Q29yZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0VUX1NFTEVDVElPTiwgc3RhcnQsIGVuZCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTM3MDEsMTQgKzM2MTAsMTEgQEAKICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IChJbnB1dE1ldGhvZE1hbmFnZXIpCiAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5JTlBVVF9NRVRIT0RfU0VSVklDRSk7CiAKLSAgICAgICAgLy8gYnJpbmcgaXQgYmFjayB0byB0aGUgZGVmYXVsdCBzY2FsZSBzbyB0aGF0IHVzZXIgY2FuIGVudGVyIHRleHQKLSAgICAgICAgYm9vbGVhbiB6b29tID0gbUFjdHVhbFNjYWxlIDwgbURlZmF1bHRTY2FsZTsKKyAgICAgICAgLy8gYnJpbmcgaXQgYmFjayB0byB0aGUgcmVhZGluZyBsZXZlbCBzY2FsZSBzbyB0aGF0IHVzZXIgY2FuIGVudGVyIHRleHQKKyAgICAgICAgYm9vbGVhbiB6b29tID0gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCkgPCBtWm9vbU1hbmFnZXIuZ2V0UmVhZGluZ0xldmVsU2NhbGUoKTsKICAgICAgICAgaWYgKHpvb20pIHsKLSAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gbUxhc3RUb3VjaFg7Ci0gICAgICAgICAgICBtWm9vbUNlbnRlclkgPSBtTGFzdFRvdWNoWTsKLSAgICAgICAgICAgIC8vIGRvIG5vdCBjaGFuZ2UgdGV4dCB3cmFwIHNjYWxlIHNvIHRoYXQgdGhlcmUgaXMgbm8gcmVmbG93Ci0gICAgICAgICAgICBzZXROZXdab29tU2NhbGUobURlZmF1bHRTY2FsZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5zZXRab29tQ2VudGVyKG1MYXN0VG91Y2hYLCBtTGFzdFRvdWNoWSk7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuc2V0Wm9vbVNjYWxlKG1ab29tTWFuYWdlci5nZXRSZWFkaW5nTGV2ZWxTY2FsZSgpLCBmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlzVGV4dFZpZXcpIHsKICAgICAgICAgICAgIHJlYnVpbGRXZWJUZXh0VmlldygpOwpAQCAtMzg5Nyw2ICszODAzLDI2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IERSVCBvbiBVSSB0aHJlYWQsIG5lZWQgdG8gcHJveHkgdG8gV2ViQ29yZSB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAaGlkZSBkZWJ1ZyBvbmx5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdXNlTW9ja0RldmljZU9yaWVudGF0aW9uKCkgeworICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVVNFX01PQ0tfREVWSUNFX09SSUVOVEFUSU9OKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgRFJUIG9uIFdlYkNvcmUgdGhyZWFkLgorICAgICAqCisgICAgICogQGhpZGUgZGVidWcgb25seQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgbVdlYlZpZXdDb3JlLnNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihjYW5Qcm92aWRlQWxwaGEsIGFscGhhLCBjYW5Qcm92aWRlQmV0YSwgYmV0YSwKKyAgICAgICAgICAgICAgICBjYW5Qcm92aWRlR2FtbWEsIGdhbW1hKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBEdW1wIHRoZSBWOCBjb3VudGVycyB0byBzdGFuZGFyZCBvdXRwdXQuCiAgICAgICogTm90ZSB0aGF0IHlvdSBuZWVkIGEgYnVpbGQgd2l0aCBWOCBhbmQgV0VCQ09SRV9JTlNUUlVNRU5UQVRJT04gc2V0IHRvCiAgICAgICogdHJ1ZS4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgZG8gbm90aGluZy4KQEAgLTM5MTIsNiArMzgzOCwxOSBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtR290Q2VudGVyRG93biA9IGZhbHNlOwogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlNdWx0aXBsZShpbnQga2V5Q29kZSwgaW50IHJlcGVhdENvdW50LCBLZXlFdmVudCBldmVudCkgeworICAgICAgICAvLyBzZW5kIGNvbXBsZXggY2hhcmFjdGVycyB0byB3ZWJraXQgZm9yIHVzZSBieSBKUyBhbmQgcGx1Z2lucworICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1VOS05PV04gJiYgZXZlbnQuZ2V0Q2hhcmFjdGVycygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHBhc3MgdGhlIGtleSB0byBET00KKyAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5LRVlfRE9XTiwgZXZlbnQpOworICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLktFWV9VUCwgZXZlbnQpOworICAgICAgICAgICAgLy8gcmV0dXJuIHRydWUgYXMgRE9NIGhhbmRsZXMgdGhlIGtleQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKICAgICAgICAgICAgIExvZy52KExPR1RBRywgImtleURvd24gYXQgIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCkBAIC0zOTM0LDE0ICszODczLDE2IEBACiAgICAgICAgIC8vIEJ1YmJsZSB1cCB0aGUga2V5IGV2ZW50IGlmCiAgICAgICAgIC8vIDEuIGl0IGlzIGEgc3lzdGVtIGtleTsgb3IKICAgICAgICAgLy8gMi4gdGhlIGhvc3QgYXBwbGljYXRpb24gd2FudHMgdG8gaGFuZGxlIGl0OworICAgICAgICAvLyAzLiB0aGUgYWNjZXNzaWJpbGl0eSBpbmplY3RvciBpcyBwcmVzZW50IGFuZCB3YW50cyB0byBoYW5kbGUgaXQ7CiAgICAgICAgIGlmIChldmVudC5pc1N5c3RlbSgpCi0gICAgICAgICAgICAgICAgfHwgbUNhbGxiYWNrUHJveHkudWlPdmVycmlkZUtleUV2ZW50KGV2ZW50KSkgeworICAgICAgICAgICAgICAgIHx8IG1DYWxsYmFja1Byb3h5LnVpT3ZlcnJpZGVLZXlFdmVudChldmVudCkKKyAgICAgICAgICAgICAgICB8fCAobUFjY2Vzc2liaWxpdHlJbmplY3RvciAhPSBudWxsICYmIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3Iub25LZXlFdmVudChldmVudCkpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1NISUZUX0xFRlQKICAgICAgICAgICAgICAgICB8fCBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfU0hJRlRfUklHSFQpIHsKLSAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKKyAgICAgICAgICAgIGlmIChuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgewogICAgICAgICAgICAgICAgIG1TaGlmdElzUHJlc3NlZCA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFuYXRpdmVDdXJzb3JXYW50c0tleUV2ZW50cygpICYmICFtU2VsZWN0aW5nVGV4dCkgewogICAgICAgICAgICAgICAgIHNldFVwU2VsZWN0KCk7CkBAIC0zOTYxLDggKzM5MDIsOCBAQAogICAgICAgICBpZiAoa2V5Q29kZSA+PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAKICAgICAgICAgICAgICAgICAmJiBrZXlDb2RlIDw9IEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVCkgewogICAgICAgICAgICAgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKLSAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKLSAgICAgICAgICAgICAgICBsZXRQbHVnaW5IYW5kbGVOYXZLZXkoa2V5Q29kZSwgZXZlbnQuZ2V0RXZlbnRUaW1lKCksIHRydWUpOworICAgICAgICAgICAgaWYgKG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpKSB7CisgICAgICAgICAgICAgICAgbGV0UGFnZUhhbmRsZU5hdktleShrZXlDb2RlLCBldmVudC5nZXRFdmVudFRpbWUoKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobVNlbGVjdGluZ1RleHQpIHsKQEAgLTQwODYsMTMgKzQwMjcsMTYgQEAKICAgICAgICAgLy8gQnViYmxlIHVwIHRoZSBrZXkgZXZlbnQgaWYKICAgICAgICAgLy8gMS4gaXQgaXMgYSBzeXN0ZW0ga2V5OyBvcgogICAgICAgICAvLyAyLiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB3YW50cyB0byBoYW5kbGUgaXQ7Ci0gICAgICAgIGlmIChldmVudC5pc1N5c3RlbSgpIHx8IG1DYWxsYmFja1Byb3h5LnVpT3ZlcnJpZGVLZXlFdmVudChldmVudCkpIHsKKyAgICAgICAgLy8gMy4gdGhlIGFjY2Vzc2liaWxpdHkgaW5qZWN0b3IgaXMgcHJlc2VudCBhbmQgd2FudHMgdG8gaGFuZGxlIGl0OworICAgICAgICBpZiAoZXZlbnQuaXNTeXN0ZW0oKQorICAgICAgICAgICAgICAgIHx8IG1DYWxsYmFja1Byb3h5LnVpT3ZlcnJpZGVLZXlFdmVudChldmVudCkKKyAgICAgICAgICAgICAgICB8fCAobUFjY2Vzc2liaWxpdHlJbmplY3RvciAhPSBudWxsICYmIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3Iub25LZXlFdmVudChldmVudCkpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1NISUZUX0xFRlQKICAgICAgICAgICAgICAgICB8fCBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfU0hJRlRfUklHSFQpIHsKLSAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKKyAgICAgICAgICAgIGlmIChuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgewogICAgICAgICAgICAgICAgIG1TaGlmdElzUHJlc3NlZCA9IGZhbHNlOwogICAgICAgICAgICAgfSBlbHNlIGlmIChjb3B5U2VsZWN0aW9uKCkpIHsKICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Eb25lKCk7CkBAIC00MTAyLDggKzQwNDYsOCBAQAogCiAgICAgICAgIGlmIChrZXlDb2RlID49IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUAogICAgICAgICAgICAgICAgICYmIGtleUNvZGUgPD0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hUKSB7Ci0gICAgICAgICAgICBpZiAobmF0aXZlRm9jdXNJc1BsdWdpbigpKSB7Ci0gICAgICAgICAgICAgICAgbGV0UGx1Z2luSGFuZGxlTmF2S2V5KGtleUNvZGUsIGV2ZW50LmdldEV2ZW50VGltZSgpLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAobmF0aXZlUGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCkpIHsKKyAgICAgICAgICAgICAgICBsZXRQYWdlSGFuZGxlTmF2S2V5KGtleUNvZGUsIGV2ZW50LmdldEV2ZW50VGltZSgpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBhbHdheXMgaGFuZGxlIHRoZSBuYXZpZ2F0aW9uIGtleXMgaW4gdGhlIFVJIHRocmVhZApAQCAtNDE0Niw4ICs0MDkwLDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGVhclRleHRFbnRyeSh0cnVlKTsKLSAgICAgICAgICAgIG5hdGl2ZVNldEZvbGxvd2VkTGluayh0cnVlKTsKKyAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CisgICAgICAgICAgICBuYXRpdmVTaG93Q3Vyc29yVGltZWQoKTsKICAgICAgICAgICAgIGlmICghbUNhbGxiYWNrUHJveHkudWlPdmVycmlkZVVybExvYWRpbmcobmF0aXZlQ3Vyc29yVGV4dCgpKSkgewogICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5DTElDSywgZGF0YS5tRnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDdXJzb3JOb2RlUG9pbnRlcigpKTsKQEAgLTQyNTUsMTMgKzQxOTksOSBAQAogICAgICAgICAgICAgICAgICAgICAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnRleHRfY29waWVkCiAgICAgICAgICAgICAgICAgICAgICwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CiAgICAgICAgICAgICBjb3BpZWRTb21ldGhpbmcgPSB0cnVlOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJQ2xpcGJvYXJkIGNsaXAgPSBJQ2xpcGJvYXJkLlN0dWIuYXNJbnRlcmZhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKCJjbGlwYm9hcmQiKSk7Ci0gICAgICAgICAgICAgICAgY2xpcC5zZXRDbGlwYm9hcmRUZXh0KHNlbGVjdGlvbik7Ci0gICAgICAgICAgICB9IGNhdGNoIChhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiQ2xpcGJvYXJkIGZhaWxlZCIsIGUpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgQ2xpcGJvYXJkTWFuYWdlciBjbSA9IChDbGlwYm9hcmRNYW5hZ2VyKWdldENvbnRleHQoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNMSVBCT0FSRF9TRVJWSUNFKTsKKyAgICAgICAgICAgIGNtLnNldFRleHQoc2VsZWN0aW9uKTsKICAgICAgICAgfQogICAgICAgICBpbnZhbGlkYXRlKCk7IC8vIHJlbW92ZSBzZWxlY3Rpb24gcmVnaW9uIGFuZCBwb2ludGVyCiAgICAgICAgIHJldHVybiBjb3BpZWRTb21ldGhpbmc7CkBAIC00MjgzLDEyICs0MjIzLDIyIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOwotICAgICAgICBkaXNtaXNzWm9vbUNvbnRyb2woKTsKKyAgICAgICAgY2xlYXJUZXh0RW50cnkoKTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLmRpc21pc3Nab29tUGlja2VyKCk7CiAgICAgICAgIGlmIChoYXNXaW5kb3dGb2N1cygpKSBzZXRBY3RpdmUoZmFsc2UpOwogICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uVmlzaWJpbGl0eUNoYW5nZWQoVmlldyBjaGFuZ2VkVmlldywgaW50IHZpc2liaWxpdHkpIHsKKyAgICAgICAgc3VwZXIub25WaXNpYmlsaXR5Q2hhbmdlZChjaGFuZ2VkVmlldywgdmlzaWJpbGl0eSk7CisgICAgICAgIC8vIFRoZSB6b29tTWFuYWdlciBtYXkgYmUgbnVsbCBpZiB0aGUgd2VidmlldyBpcyBjcmVhdGVkIGZyb20gWE1MIHRoYXQKKyAgICAgICAgLy8gc3BlY2lmaWVzIHRoZSB2aWV3J3MgdmlzaWJpbGl0eSBwYXJhbSBhcyBub3QgdmlzaWJsZSAoc2VlIGh0dHA6Ly9iLzI3OTQ4NDEpCisgICAgICAgIGlmICh2aXNpYmlsaXR5ICE9IFZpZXcuVklTSUJMRSAmJiBtWm9vbU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmRpc21pc3Nab29tUGlja2VyKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBAZGVwcmVjYXRlZCBXZWJWaWV3IG5vIGxvbmdlciBuZWVkcyB0byBpbXBsZW1lbnQKICAgICAgKiBWaWV3R3JvdXAuT25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lci4gIFRoaXMgbWV0aG9kIGRvZXMgbm90aGluZyBub3cuCkBAIC00MzE4LDMyICs0MjY4LDMwIEBACiAgICAgICAgICAgICAgICAgLy8gSWYgb3VyIHdpbmRvdyByZWdhaW5lZCBmb2N1cywgYW5kIHdlIGhhdmUgZm9jdXMsIHRoZW4gYmVnaW4KICAgICAgICAgICAgICAgICAvLyBkcmF3aW5nIHRoZSBjdXJzb3IgcmluZwogICAgICAgICAgICAgICAgIG1EcmF3Q3Vyc29yUmluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgc2V0Rm9jdXNDb250cm9sbGVyQWN0aXZlKHRydWUpOwogICAgICAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBuYXRpdmVSZWNvcmRCdXR0b25zKHRydWUsIGZhbHNlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNFVF9BQ1RJVkUsIDEsIDApOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBvdXIgd2luZG93IGdhaW5lZCBmb2N1cywgYnV0IHdlIGRvIG5vdCBoYXZlIGl0LCBkbyBub3QKLSAgICAgICAgICAgICAgICAvLyBkcmF3IHRoZSBjdXJzb3IgcmluZy4KLSAgICAgICAgICAgICAgICBtRHJhd0N1cnNvclJpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoIWluRWRpdGluZ01vZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiBvdXIgd2luZG93IGdhaW5lZCBmb2N1cywgYnV0IHdlIGRvIG5vdCBoYXZlIGl0LCBkbyBub3QKKyAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgY3Vyc29yIHJpbmcuCisgICAgICAgICAgICAgICAgICAgIG1EcmF3Q3Vyc29yUmluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBzZXRGb2N1c0NvbnRyb2xsZXJBY3RpdmUoZmFsc2UpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBXZSBkbyBub3QgY2FsbCBuYXRpdmVSZWNvcmRCdXR0b25zIGhlcmUgYmVjYXVzZSB3ZSBhc3N1bWUKICAgICAgICAgICAgICAgICAvLyB0aGF0IHdoZW4gd2UgbG9zdCBmb2N1cywgb3Igd2luZG93IGZvY3VzLCBpdCBnb3QgY2FsbGVkIHdpdGgKICAgICAgICAgICAgICAgICAvLyBmYWxzZSBmb3IgdGhlIGZpcnN0IHBhcmFtZXRlcgogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1XZWJWaWV3Q29yZSAhPSBudWxsICYmIGdldFNldHRpbmdzKCkuZ2V0QnVpbHRJblpvb21Db250cm9scygpCi0gICAgICAgICAgICAgICAgICAgICYmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbVpvb21CdXR0b25zQ29udHJvbGxlci5pc1Zpc2libGUoKSkpIHsKKyAgICAgICAgICAgIGlmICghbVpvb21NYW5hZ2VyLmlzWm9vbVBpY2tlclZpc2libGUoKSkgewogICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogVGhlIHpvb20gY29udHJvbHMgY29tZSBpbiB0aGVpciBvd24gd2luZG93LCBzbyBvdXIgd2luZG93Ci0gICAgICAgICAgICAgICAgICogbG9zZXMgZm9jdXMuIE91ciBwb2xpY3kgaXMgdG8gbm90IGRyYXcgdGhlIGN1cnNvciByaW5nIGlmCi0gICAgICAgICAgICAgICAgICogb3VyIHdpbmRvdyBpcyBub3QgZm9jdXNlZCwgYnV0IHRoaXMgaXMgYW4gZXhjZXB0aW9uIHNpbmNlCisgICAgICAgICAgICAgICAgICogVGhlIGV4dGVybmFsIHpvb20gY29udHJvbHMgY29tZSBpbiB0aGVpciBvd24gd2luZG93LCBzbyBvdXIKKyAgICAgICAgICAgICAgICAgKiB3aW5kb3cgbG9zZXMgZm9jdXMuIE91ciBwb2xpY3kgaXMgdG8gbm90IGRyYXcgdGhlIGN1cnNvciByaW5nCisgICAgICAgICAgICAgICAgICogaWYgb3VyIHdpbmRvdyBpcyBub3QgZm9jdXNlZCwgYnV0IHRoaXMgaXMgYW4gZXhjZXB0aW9uIHNpbmNlCiAgICAgICAgICAgICAgICAgICogdGhlIHVzZXIgY2FuIHN0aWxsIG5hdmlnYXRlIHRoZSB3ZWIgcGFnZSB3aXRoIHRoZSB6b29tCiAgICAgICAgICAgICAgICAgICogY29udHJvbHMgc2hvd2luZy4KICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAvLyBJZiBvdXIgd2luZG93IGhhcyBsb3N0IGZvY3VzLCBzdG9wIGRyYXdpbmcgdGhlIGN1cnNvciByaW5nCiAgICAgICAgICAgICAgICAgbURyYXdDdXJzb3JSaW5nID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtR290S2V5RG93biA9IGZhbHNlOwpAQCAtNDM1Myw3ICs0MzAxLDcgQEAKICAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCkgewogICAgICAgICAgICAgICAgIG5hdGl2ZVJlY29yZEJ1dHRvbnMoZmFsc2UsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldEZvY3VzQ29udHJvbGxlckluYWN0aXZlKCk7CisgICAgICAgICAgICBzZXRGb2N1c0NvbnRyb2xsZXJBY3RpdmUoZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICB9CkBAIC00MzY0LDkgKzQzMTIsOSBAQAogICAgIHB1YmxpYyB2b2lkIG9uV2luZG93Rm9jdXNDaGFuZ2VkKGJvb2xlYW4gaGFzV2luZG93Rm9jdXMpIHsKICAgICAgICAgc2V0QWN0aXZlKGhhc1dpbmRvd0ZvY3VzKTsKICAgICAgICAgaWYgKGhhc1dpbmRvd0ZvY3VzKSB7Ci0gICAgICAgICAgICBCcm93c2VyRnJhbWUuc0phdmFCcmlkZ2Uuc2V0QWN0aXZlV2ViVmlldyh0aGlzKTsKKyAgICAgICAgICAgIEpXZWJDb3JlSmF2YUJyaWRnZS5zZXRBY3RpdmVXZWJWaWV3KHRoaXMpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQnJvd3NlckZyYW1lLnNKYXZhQnJpZGdlLnJlbW92ZUFjdGl2ZVdlYlZpZXcodGhpcyk7CisgICAgICAgICAgICBKV2ViQ29yZUphdmFCcmlkZ2UucmVtb3ZlQWN0aXZlV2ViVmlldyh0aGlzKTsKICAgICAgICAgfQogICAgICAgICBzdXBlci5vbldpbmRvd0ZvY3VzQ2hhbmdlZChoYXNXaW5kb3dGb2N1cyk7CiAgICAgfQpAQCAtNDM3NywxMSArNDMyNSw5IEBACiAgICAgICogbm90IGRyYXcgdGhlIGJsaW5raW5nIGN1cnNvci4gIEl0IGdldHMgc2V0IHRvICJhY3RpdmUiIHRvIGRyYXcgdGhlIGN1cnNvcgogICAgICAqIGluIFdlYlZpZXdDb3JlLmNwcCwgd2hlbiB0aGUgV2ViQ29yZSB0aHJlYWQgcmVjZWl2ZXMga2V5IGV2ZW50cy9jbGlja3MuCiAgICAgICovCi0gICAgLyogcGFja2FnZSAqLyB2b2lkIHNldEZvY3VzQ29udHJvbGxlckluYWN0aXZlKCkgewotICAgICAgICAvLyBEbyBub3QgbmVlZCB0byBhbHNvIGNoZWNrIHdoZXRoZXIgbVdlYlZpZXdDb3JlIGlzIG51bGwsIGJlY2F1c2UKLSAgICAgICAgLy8gbU5hdGl2ZUNsYXNzIGlzIG9ubHkgc2V0IGlmIG1XZWJWaWV3Q29yZSBpcyBub24gbnVsbAotICAgICAgICBpZiAobU5hdGl2ZUNsYXNzID09IDApIHJldHVybjsKLSAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNFVF9BQ1RJVkUsIDAsIDApOworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBzZXRGb2N1c0NvbnRyb2xsZXJBY3RpdmUoYm9vbGVhbiBhY3RpdmUpIHsKKyAgICAgICAgaWYgKG1XZWJWaWV3Q29yZSA9PSBudWxsKSByZXR1cm47CisgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfQUNUSVZFLCBhY3RpdmUgPyAxIDogMCwgMCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC00Mzk4LDYgKzQzNDQsNyBAQAogICAgICAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBuYXRpdmVSZWNvcmRCdXR0b25zKHRydWUsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0Rm9jdXNDb250cm9sbGVyQWN0aXZlKHRydWUpOwogICAgICAgICAgICAgLy99IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIFRoZSBXZWJWaWV3IGhhcyBnYWluZWQgZm9jdXMgd2hpbGUgd2UgZG8gbm90IGhhdmUKICAgICAgICAgICAgICAgICAvLyB3aW5kb3dmb2N1cy4gIFdoZW4gb3VyIHdpbmRvdyBsb3N0IGZvY3VzLCB3ZSBzaG91bGQgaGF2ZQpAQCAtNDQxMSw3ICs0MzU4LDcgQEAKICAgICAgICAgICAgICAgICBpZiAobU5hdGl2ZUNsYXNzICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgbmF0aXZlUmVjb3JkQnV0dG9ucyhmYWxzZSwgZmFsc2UsIHRydWUpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXRGb2N1c0NvbnRyb2xsZXJJbmFjdGl2ZSgpOworICAgICAgICAgICAgICAgIHNldEZvY3VzQ29udHJvbGxlckFjdGl2ZShmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtR290S2V5RG93biA9IGZhbHNlOwogICAgICAgICB9CkBAIC00NDMyLDk0ICs0Mzc5LDM1IEBACiAgICAgICAgICAgICAvLyBzeXN0ZW0gd29uJ3QgY2FsbCBvblNpemVDaGFuZ2VkIGlmIHRoZSBkaW1lbnNpb24gaXMgbm90IGNoYW5nZWQuCiAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gY2FsbCBzZW5kVmlld1NpemVab29tKCkgZXhwbGljaXRseSB0bwogICAgICAgICAgICAgLy8gbm90aWZ5IHRoZSBXZWJLaXQgYWJvdXQgdGhlIG5ldyBkaW1lbnNpb25zLgotICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbSgpOworICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbShmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUG9zdFNjYWxlIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBmaW5hbCBXZWJWaWV3IG1XZWJWaWV3OwotICAgICAgICBmaW5hbCBib29sZWFuIG1VcGRhdGVUZXh0V3JhcDsKLQotICAgICAgICBwdWJsaWMgUG9zdFNjYWxlKFdlYlZpZXcgd2ViVmlldywgYm9vbGVhbiB1cGRhdGVUZXh0V3JhcCkgewotICAgICAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OwotICAgICAgICAgICAgbVVwZGF0ZVRleHRXcmFwID0gdXBkYXRlVGV4dFdyYXA7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAobVdlYlZpZXcubVdlYlZpZXdDb3JlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBhbHdheXMgZm9yY2UsIGluIGNhc2Ugb3VyIGhlaWdodCBjaGFuZ2VkLCBpbiB3aGljaCBjYXNlIHdlCi0gICAgICAgICAgICAgICAgLy8gc3RpbGwgd2FudCB0byBzZW5kIHRoZSBub3RpZmljYXRpb24gb3ZlciB0byB3ZWJraXQuCi0gICAgICAgICAgICAgICAgbVdlYlZpZXcuc2V0TmV3Wm9vbVNjYWxlKG1XZWJWaWV3Lm1BY3R1YWxTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVUZXh0V3JhcCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB6b29tIGJ1dHRvbnMgYXMgdGhlIHNjYWxlIGNhbiBiZSBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgaWYgKG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3LnVwZGF0ZVpvb21CdXR0b25zRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU2l6ZUNoYW5nZWQoaW50IHcsIGludCBoLCBpbnQgb3csIGludCBvaCkgewogICAgICAgICBzdXBlci5vblNpemVDaGFuZ2VkKHcsIGgsIG93LCBvaCk7Ci0gICAgICAgIC8vIENlbnRlciB6b29taW5nIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbi4KLSAgICAgICAgaWYgKG1ab29tU2NhbGUgPT0gMCkgeyAvLyB1bmxlc3Mgd2UncmUgYWxyZWFkeSB6b29taW5nCi0gICAgICAgICAgICAvLyBUbyBhbmNob3IgYXQgdG9wIGxlZnQgY29ybmVyLgotICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gMDsKLSAgICAgICAgICAgIG1ab29tQ2VudGVyWSA9IGdldFZpc2libGVUaXRsZUhlaWdodCgpOwotICAgICAgICAgICAgbUFuY2hvclggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtU2Nyb2xsWCk7Ci0gICAgICAgICAgICBtQW5jaG9yWSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIG1ab29tQ2VudGVyWSArIG1TY3JvbGxZKTsKLSAgICAgICAgfQogCiAgICAgICAgIC8vIGFkanVzdCB0aGUgbWF4IHZpZXdwb3J0IHdpZHRoIGRlcGVuZGluZyBvbiB0aGUgdmlldyBkaW1lbnNpb25zLiBUaGlzCiAgICAgICAgIC8vIGlzIHRvIGVuc3VyZSB0aGUgc2NhbGluZyBpcyBub3QgZ29pbmcgaW5zYW5lLiBTbyBkbyBub3Qgc2hyaW5rIGl0IGlmCiAgICAgICAgIC8vIHRoZSB2aWV3IHNpemUgaXMgdGVtcG9yYXJpbHkgc21hbGxlciwgZS5nLiB3aGVuIHNvZnQga2V5Ym9hcmQgaXMgdXAuCi0gICAgICAgIGludCBuZXdNYXhWaWV3cG9ydFdpZHRoID0gKGludCkgKE1hdGgubWF4KHcsIGgpIC8gREVGQVVMVF9NSU5fWk9PTV9TQ0FMRSk7CisgICAgICAgIGludCBuZXdNYXhWaWV3cG9ydFdpZHRoID0gKGludCkgKE1hdGgubWF4KHcsIGgpIC8gbVpvb21NYW5hZ2VyLmdldERlZmF1bHRNaW5ab29tU2NhbGUoKSk7CiAgICAgICAgIGlmIChuZXdNYXhWaWV3cG9ydFdpZHRoID4gc01heFZpZXdwb3J0V2lkdGgpIHsKICAgICAgICAgICAgIHNNYXhWaWV3cG9ydFdpZHRoID0gbmV3TWF4Vmlld3BvcnRXaWR0aDsKICAgICAgICAgfQogCi0gICAgICAgIC8vIHVwZGF0ZSBtTWluWm9vbVNjYWxlIGlmIHRoZSBtaW5pbXVtIHpvb20gc2NhbGUgaXMgbm90IGZpeGVkCi0gICAgICAgIGlmICghbU1pblpvb21TY2FsZUZpeGVkKSB7Ci0gICAgICAgICAgICAvLyB3aGVuIGNoYW5nZSBmcm9tIG5hcnJvdyBzY3JlZW4gdG8gd2lkZSBzY3JlZW4sIHRoZSBuZXcgdmlld1dpZHRoCi0gICAgICAgICAgICAvLyBjYW4gYmUgd2lkZXIgdGhhbiB0aGUgb2xkIGNvbnRlbnQgd2lkdGguIFdlIGxpbWl0IHRoZSBtaW5pbXVtCi0gICAgICAgICAgICAvLyBzY2FsZSB0byAxLjBmLiBUaGUgcHJvcGVyIG1pbmltdW0gc2NhbGUgd2lsbCBiZSBjYWxjdWxhdGVkIHdoZW4KLSAgICAgICAgICAgIC8vIHRoZSBuZXcgcGljdHVyZSBzaG93cyB1cC4KLSAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBNYXRoLm1pbigxLjBmLCAoZmxvYXQpIGdldFZpZXdXaWR0aCgpCi0gICAgICAgICAgICAgICAgICAgIC8gKG1EcmF3SGlzdG9yeSA/IG1IaXN0b3J5UGljdHVyZS5nZXRXaWR0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtWm9vbU92ZXJ2aWV3V2lkdGgpKTsKLSAgICAgICAgICAgIGlmIChtSW5pdGlhbFNjYWxlSW5QZXJjZW50ID4gMCkgewotICAgICAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBtaW5ab29tU2NhbGUgdG8gdGhlIGluaXRpYWxTY2FsZSBpZiBpdCBpcyBzZXQKLSAgICAgICAgICAgICAgICBmbG9hdCBpbml0aWFsU2NhbGUgPSBtSW5pdGlhbFNjYWxlSW5QZXJjZW50IC8gMTAwLjBmOwotICAgICAgICAgICAgICAgIGlmIChtTWluWm9vbVNjYWxlID4gaW5pdGlhbFNjYWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBpbml0aWFsU2NhbGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZGlzbWlzc1pvb21Db250cm9sKCk7Ci0KLSAgICAgICAgLy8gb25TaXplQ2hhbmdlZCgpIGlzIGNhbGxlZCBkdXJpbmcgV2ViVmlldyBsYXlvdXQuIEFuZCBhbnkKLSAgICAgICAgLy8gcmVxdWVzdExheW91dCgpIGlzIGJsb2NrZWQgZHVyaW5nIGxheW91dC4gQXMgc2V0TmV3Wm9vbVNjYWxlKCkgd2lsbAotICAgICAgICAvLyBjYWxsIGl0cyBjaGlsZCBWaWV3IHRvIHJlcG9zaXRpb24gaXRzZWxmIHRocm91Z2ggVmlld01hbmFnZXIncwotICAgICAgICAvLyBzY2FsZUFsbCgpLCB3ZSBuZWVkIHRvIHBvc3QgYSBSdW5uYWJsZSB0byBlbnN1cmUgcmVxdWVzdExheW91dCgpLgotICAgICAgICAvLyA8Yi8+Ci0gICAgICAgIC8vIG9ubHkgdXBkYXRlIHRoZSB0ZXh0IHdyYXAgc2NhbGUgaWYgd2lkdGggY2hhbmdlZC4KLSAgICAgICAgcG9zdChuZXcgUG9zdFNjYWxlKHRoaXMsIHcgIT0gb3cpKTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLm9uU2l6ZUNoYW5nZWQodywgaCwgb3csIG9oKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvblNjcm9sbENoYW5nZWQoaW50IGwsIGludCB0LCBpbnQgb2xkbCwgaW50IG9sZHQpIHsKICAgICAgICAgc3VwZXIub25TY3JvbGxDaGFuZ2VkKGwsIHQsIG9sZGwsIG9sZHQpOwotICAgICAgICBpZiAoIW1Jbk92ZXJTY3JvbGxNb2RlKSB7Ci0gICAgICAgICAgICBzZW5kT3VyVmlzaWJsZVJlY3QoKTsKLSAgICAgICAgICAgIC8vIHVwZGF0ZSBXZWJLaXQgaWYgdmlzaWJsZSB0aXRsZSBiYXIgaGVpZ2h0IGNoYW5nZWQuIFRoZSBsb2dpYyBpcyBzYW1lCi0gICAgICAgICAgICAvLyBhcyBnZXRWaXNpYmxlVGl0bGVIZWlnaHQuCi0gICAgICAgICAgICBpbnQgdGl0bGVIZWlnaHQgPSBnZXRUaXRsZUhlaWdodCgpOwotICAgICAgICAgICAgaWYgKE1hdGgubWF4KHRpdGxlSGVpZ2h0IC0gdCwgMCkgIT0gTWF0aC5tYXgodGl0bGVIZWlnaHQgLSBvbGR0LCAwKSkgewotICAgICAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgc2VuZE91clZpc2libGVSZWN0KCk7CisgICAgICAgIC8vIHVwZGF0ZSBXZWJLaXQgaWYgdmlzaWJsZSB0aXRsZSBiYXIgaGVpZ2h0IGNoYW5nZWQuIFRoZSBsb2dpYyBpcyBzYW1lCisgICAgICAgIC8vIGFzIGdldFZpc2libGVUaXRsZUhlaWdodC4KKyAgICAgICAgaW50IHRpdGxlSGVpZ2h0ID0gZ2V0VGl0bGVIZWlnaHQoKTsKKyAgICAgICAgaWYgKE1hdGgubWF4KHRpdGxlSGVpZ2h0IC0gdCwgMCkgIT0gTWF0aC5tYXgodGl0bGVIZWlnaHQgLSBvbGR0LCAwKSkgeworICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbShmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ1MjcsOSArNDQxNSwxMSBAQAogICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgYm9vbGVhbiBkaXNwYXRjaCA9IHRydWU7CiAKLSAgICAgICAgLy8gVGV4dGZpZWxkcyBhbmQgcGx1Z2lucyBuZWVkIHRvIHJlY2VpdmUgdGhlIHNoaWZ0IHVwIGtleSBldmVuIGlmCi0gICAgICAgIC8vIGFub3RoZXIga2V5IHdhcyByZWxlYXNlZCB3aGlsZSB0aGUgc2hpZnQga2V5IHdhcyBoZWxkIGRvd24uCi0gICAgICAgIGlmICghaW5FZGl0aW5nTW9kZSgpICYmIChtTmF0aXZlQ2xhc3MgPT0gMCB8fCAhbmF0aXZlRm9jdXNJc1BsdWdpbigpKSkgeworICAgICAgICAvLyBUZXh0ZmllbGRzLCBwbHVnaW5zLCBhbmQgY29udGVudEVkaXRhYmxlIG5vZGVzIG5lZWQgdG8gcmVjZWl2ZSB0aGUKKyAgICAgICAgLy8gc2hpZnQgdXAga2V5IGV2ZW4gaWYgYW5vdGhlciBrZXkgd2FzIHJlbGVhc2VkIHdoaWxlIHRoZSBzaGlmdCBrZXkKKyAgICAgICAgLy8gd2FzIGhlbGQgZG93bi4KKyAgICAgICAgaWYgKCFpbkVkaXRpbmdNb2RlKCkgJiYgKG1OYXRpdmVDbGFzcyA9PSAwCisgICAgICAgICAgICAgICAgfHwgIW5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpKSkgewogICAgICAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9ET1dOKSB7CiAgICAgICAgICAgICAgICAgbUdvdEtleURvd24gPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTQ1ODksNyArNDQ3OSw3IEBACiAgICAgICAgIHB1YmxpYyBEcmFnVHJhY2tlckhhbmRsZXIoZmxvYXQgeCwgZmxvYXQgeSwgRHJhZ1RyYWNrZXIgcHJveHkpIHsKICAgICAgICAgICAgIG1Qcm94eSA9IHByb3h5OwogCi0gICAgICAgICAgICBpbnQgZG9jQm90dG9tID0gY29tcHV0ZVJlYWxWZXJ0aWNhbFNjcm9sbFJhbmdlKCkgKyBnZXRUaXRsZUhlaWdodCgpOworICAgICAgICAgICAgaW50IGRvY0JvdHRvbSA9IGNvbXB1dGVWZXJ0aWNhbFNjcm9sbFJhbmdlKCkgKyBnZXRUaXRsZUhlaWdodCgpOwogICAgICAgICAgICAgaW50IHZpZXdUb3AgPSBnZXRTY3JvbGxZKCk7CiAgICAgICAgICAgICBpbnQgdmlld0JvdHRvbSA9IHZpZXdUb3AgKyBnZXRIZWlnaHQoKTsKIApAQCAtNDYwMiw3ICs0NDkyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAiIHVwL2Rvd249ICIgKyBtTWluRFkgKyAiICIgKyBtTWF4RFkpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbnQgZG9jUmlnaHQgPSBjb21wdXRlUmVhbEhvcml6b250YWxTY3JvbGxSYW5nZSgpOworICAgICAgICAgICAgaW50IGRvY1JpZ2h0ID0gY29tcHV0ZUhvcml6b250YWxTY3JvbGxSYW5nZSgpOwogICAgICAgICAgICAgaW50IHZpZXdMZWZ0ID0gZ2V0U2Nyb2xsWCgpOwogICAgICAgICAgICAgaW50IHZpZXdSaWdodCA9IHZpZXdMZWZ0ICsgZ2V0V2lkdGgoKTsKICAgICAgICAgICAgIG1TdGFydFggPSB4OwpAQCAtNDc2Myw4MSArNDY1Myw2IEBACiAgICAgcHJpdmF0ZSBEcmFnVHJhY2tlciBtRHJhZ1RyYWNrZXI7CiAgICAgcHJpdmF0ZSBEcmFnVHJhY2tlckhhbmRsZXIgbURyYWdUcmFja2VySGFuZGxlcjsKIAotICAgIHByaXZhdGUgY2xhc3MgU2NhbGVEZXRlY3Rvckxpc3RlbmVyIGltcGxlbWVudHMKLSAgICAgICAgICAgIFNjYWxlR2VzdHVyZURldGVjdG9yLk9uU2NhbGVHZXN0dXJlTGlzdGVuZXIgewotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uU2NhbGVCZWdpbihTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvcikgewotICAgICAgICAgICAgLy8gY2FuY2VsIHRoZSBzaW5nbGUgdG91Y2ggaGFuZGxpbmcKLSAgICAgICAgICAgIGNhbmNlbFRvdWNoKCk7Ci0gICAgICAgICAgICBkaXNtaXNzWm9vbUNvbnRyb2woKTsKLSAgICAgICAgICAgIC8vIHJlc2V0IHRoZSB6b29tIG92ZXJ2aWV3IG1vZGUgc28gdGhhdCB0aGUgcGFnZSB3b24ndCBhdXRvIGdyb3cKLSAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotICAgICAgICAgICAgLy8gSWYgaXQgaXMgaW4gcGFzc3dvcmQgbW9kZSwgdHVybiBpdCBvZmYgc28gaXQgZG9lcyBub3QgZHJhdwotICAgICAgICAgICAgLy8gbWlzcGxhY2VkLgotICAgICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiBuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgewotICAgICAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRJblBhc3N3b3JkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVZpZXdNYW5hZ2VyLnN0YXJ0Wm9vbSgpOwotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2NhbGVFbmQoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKLSAgICAgICAgICAgIGlmIChtUHJldmlld1pvb21Pbmx5KSB7Ci0gICAgICAgICAgICAgICAgbVByZXZpZXdab29tT25seSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1BbmNob3JYID0gdmlld1RvQ29udGVudFgoKGludCkgbVpvb21DZW50ZXJYICsgbVNjcm9sbFgpOwotICAgICAgICAgICAgICAgIG1BbmNob3JZID0gdmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVNjcm9sbFkpOwotICAgICAgICAgICAgICAgIC8vIGRvbid0IHJlZmxvdyB3aGVuIHpvb20gaW47IHdoZW4gem9vbSBvdXQsIGRvIHJlZmxvdyBpZiB0aGUKLSAgICAgICAgICAgICAgICAvLyBuZXcgc2NhbGUgaXMgYWxtb3N0IG1pbmltdW0gc2NhbGU7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiByZWZsb3dOb3cgPSAobUFjdHVhbFNjYWxlIC0gbU1pblpvb21TY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgPD0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoKG1BY3R1YWxTY2FsZSA8PSAwLjggKiBtVGV4dFdyYXBTY2FsZSkpOwotICAgICAgICAgICAgICAgIC8vIGZvcmNlIHpvb20gYWZ0ZXIgbVByZXZpZXdab29tT25seSBpcyBzZXQgdG8gZmFsc2Ugc28gdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAvLyBuZXcgdmlldyBzaXplIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBXZWJLaXQKLSAgICAgICAgICAgICAgICBzZXROZXdab29tU2NhbGUobUFjdHVhbFNjYWxlLCByZWZsb3dOb3csIHRydWUpOwotICAgICAgICAgICAgICAgIC8vIGNhbGwgaW52YWxpZGF0ZSgpIHRvIGRyYXcgd2l0aG91dCB6b29tIGZpbHRlcgotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgZWRpdCB0ZXh0IHZpZXcgaWYgbmVlZGVkCi0gICAgICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpICYmIGRpZFVwZGF0ZVRleHRWaWV3Qm91bmRzKGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAmJiBuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgewotICAgICAgICAgICAgICAgIC8vIElmIGl0IGlzIGEgcGFzc3dvcmQgZmllbGQsIHN0YXJ0IGRyYXdpbmcgdGhlCi0gICAgICAgICAgICAgICAgLy8gV2ViVGV4dFZpZXcgb25jZSBhZ2Fpbi4KLSAgICAgICAgICAgICAgICBtV2ViVGV4dFZpZXcuc2V0SW5QYXNzd29yZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHN0YXJ0IGEgZHJhZywgVE9VQ0hfUElOQ0hfRFJBRywgY2FuJ3QgdXNlIFRPVUNIX0lOSVRfTU9ERSBhcyBpdAotICAgICAgICAgICAgLy8gbWF5IHRyaWdnZXIgdGhlIHVud2FudGVkIGNsaWNrLCBjYW4ndCB1c2UgVE9VQ0hfRFJBR19NT0RFIGFzIGl0Ci0gICAgICAgICAgICAvLyBtYXkgdHJpZ2dlciB0aGUgdW53YW50ZWQgZmxpbmcuCi0gICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfUElOQ0hfRFJBRzsKLSAgICAgICAgICAgIG1Db25maXJtTW92ZSA9IHRydWU7Ci0gICAgICAgICAgICBzdGFydFRvdWNoKGRldGVjdG9yLmdldEZvY3VzWCgpLCBkZXRlY3Rvci5nZXRGb2N1c1koKSwKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFRpbWUpOwotCi0gICAgICAgICAgICBtVmlld01hbmFnZXIuZW5kWm9vbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25TY2FsZShTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvcikgewotICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSAoZmxvYXQpIChNYXRoLnJvdW5kKGRldGVjdG9yLmdldFNjYWxlRmFjdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgKiBtQWN0dWFsU2NhbGUgKiAxMDApIC8gMTAwLjApOwotICAgICAgICAgICAgaWYgKE1hdGguYWJzKHNjYWxlIC0gbUFjdHVhbFNjYWxlKSA+PSBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgewotICAgICAgICAgICAgICAgIG1QcmV2aWV3Wm9vbU9ubHkgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBzY2FsZSBjaGFuZ2UgcGVyIHN0ZXAKLSAgICAgICAgICAgICAgICBpZiAoc2NhbGUgPiBtQWN0dWFsU2NhbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBNYXRoLm1pbihzY2FsZSwgbUFjdHVhbFNjYWxlICogMS4yNWYpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjYWxlID0gTWF0aC5tYXgoc2NhbGUsIG1BY3R1YWxTY2FsZSAqIDAuOGYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtWm9vbUNlbnRlclggPSBkZXRlY3Rvci5nZXRGb2N1c1goKTsKLSAgICAgICAgICAgICAgICBtWm9vbUNlbnRlclkgPSBkZXRlY3Rvci5nZXRGb2N1c1koKTsKLSAgICAgICAgICAgICAgICBzZXROZXdab29tU2NhbGUoc2NhbGUsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBib29sZWFuIGhpdEZvY3VzZWRQbHVnaW4oaW50IGNvbnRlbnRYLCBpbnQgY29udGVudFkpIHsKICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKICAgICAgICAgICAgIExvZy52KExPR1RBRywgIm5hdGl2ZUZvY3VzSXNQbHVnaW4oKT0iICsgbmF0aXZlRm9jdXNJc1BsdWdpbigpKTsKQEAgLTQ4NTksNiArNDY3NCw0MSBAQAogICAgICAgICByZXR1cm4gbUZ1bGxTY3JlZW5Ib2xkZXIgIT0gbnVsbDsKICAgICB9CiAKKyAgICB2b2lkIG9uUGluY2hUb1pvb21BbmltYXRpb25TdGFydCgpIHsKKyAgICAgICAgLy8gY2FuY2VsIHRoZSBzaW5nbGUgdG91Y2ggaGFuZGxpbmcKKyAgICAgICAgY2FuY2VsVG91Y2goKTsKKyAgICAgICAgb25ab29tQW5pbWF0aW9uU3RhcnQoKTsKKyAgICB9CisKKyAgICB2b2lkIG9uUGluY2hUb1pvb21BbmltYXRpb25FbmQoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKKyAgICAgICAgb25ab29tQW5pbWF0aW9uRW5kKCk7CisgICAgICAgIC8vIHN0YXJ0IGEgZHJhZywgVE9VQ0hfUElOQ0hfRFJBRywgY2FuJ3QgdXNlIFRPVUNIX0lOSVRfTU9ERSBhcworICAgICAgICAvLyBpdCBtYXkgdHJpZ2dlciB0aGUgdW53YW50ZWQgY2xpY2ssIGNhbid0IHVzZSBUT1VDSF9EUkFHX01PREUKKyAgICAgICAgLy8gYXMgaXQgbWF5IHRyaWdnZXIgdGhlIHVud2FudGVkIGZsaW5nLgorICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfUElOQ0hfRFJBRzsKKyAgICAgICAgbUNvbmZpcm1Nb3ZlID0gdHJ1ZTsKKyAgICAgICAgc3RhcnRUb3VjaChkZXRlY3Rvci5nZXRGb2N1c1goKSwgZGV0ZWN0b3IuZ2V0Rm9jdXNZKCksIG1MYXN0VG91Y2hUaW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRTY3JvbGxpbmdMYXllcihmbG9hdCBnZXN0dXJlWCwgZmxvYXQgZ2VzdHVyZVkpIHsKKyAgICAgICAgaWYgKG1Ub3VjaE1vZGUgIT0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFKSB7CisgICAgICAgICAgICBpbnQgY29udGVudFggPSB2aWV3VG9Db250ZW50WCgoaW50KSBnZXN0dXJlWCArIG1TY3JvbGxYKTsKKyAgICAgICAgICAgIGludCBjb250ZW50WSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIGdlc3R1cmVZICsgbVNjcm9sbFkpOworICAgICAgICAgICAgbVNjcm9sbGluZ0xheWVyID0gbmF0aXZlU2Nyb2xsYWJsZUxheWVyKGNvbnRlbnRYLCBjb250ZW50WSk7CisgICAgICAgICAgICBpZiAobVNjcm9sbGluZ0xheWVyICE9IDApIHsKKyAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gMS8oZGVuc2l0eSAqIGRlbnNpdHkpIHVzZWQgdG8gY29tcHV0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiBwb2ludHMuCisgICAgLy8gQ29tcHV0ZWQgaW4gaW5pdCgpLgorICAgIHByaXZhdGUgZmxvYXQgRFJBR19MQVlFUl9JTlZFUlNFX0RFTlNJVFlfU1FVQVJFRDsKKworICAgIC8vIFRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMgcmVwb3J0ZWQgaW4gb25Ub3VjaEV2ZW50IHNjYWxlZCBieSB0aGUKKyAgICAvLyBkZW5zaXR5IG9mIHRoZSBzY3JlZW4uCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSQUdfTEFZRVJfRklOR0VSX0RJU1RBTkNFID0gMjAwMDA7CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpIHsKICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwIHx8ICFpc0NsaWNrYWJsZSgpIHx8ICFpc0xvbmdDbGlja2FibGUoKSkgewpAQCAtNDg3MCw1NSArNDcyMCwxMDQgQEAKICAgICAgICAgICAgICAgICAgICAgKyBtVG91Y2hNb2RlKTsKICAgICAgICAgfQogCi0gICAgICAgIGludCBhY3Rpb247Ci0gICAgICAgIGZsb2F0IHgsIHk7CisgICAgICAgIGludCBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgZmxvYXQgeCA9IGV2LmdldFgoKTsKKyAgICAgICAgZmxvYXQgeSA9IGV2LmdldFkoKTsKICAgICAgICAgbG9uZyBldmVudFRpbWUgPSBldi5nZXRFdmVudFRpbWUoKTsKIAorICAgICAgICBmaW5hbCBTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvciA9CisgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmdldE11bHRpVG91Y2hHZXN0dXJlRGV0ZWN0b3IoKTsKKyAgICAgICAgYm9vbGVhbiBza2lwU2NhbGVHZXN0dXJlID0gZmFsc2U7CisgICAgICAgIC8vIFNldCB0byB0aGUgbWlkLXBvaW50IG9mIGEgdHdvLWZpbmdlciBnZXN0dXJlIHVzZWQgdG8gZGV0ZWN0IGlmIHRoZQorICAgICAgICAvLyB1c2VyIGhhcyB0b3VjaGVkIGEgbGF5ZXIuCisgICAgICAgIGZsb2F0IGdlc3R1cmVYID0geDsKKyAgICAgICAgZmxvYXQgZ2VzdHVyZVkgPSB5OworICAgICAgICBpZiAoZGV0ZWN0b3IgPT0gbnVsbCB8fCAhZGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKKyAgICAgICAgICAgIC8vIFRoZSBnZXN0dXJlIGZvciBzY3JvbGxpbmcgYSBsYXllciBpcyB0d28gZmluZ2VycyBjbG9zZSB0b2dldGhlci4KKyAgICAgICAgICAgIC8vIEZJWE1FOiB3ZSBtYXkgY29uc2lkZXIgZ2l2aW5nIFdlYktpdCBhbiBvcHRpb24gdG8gaGFuZGxlCisgICAgICAgICAgICAvLyBtdWx0aS10b3VjaCBldmVudHMgbGF0ZXIuCisgICAgICAgICAgICBpZiAoZXYuZ2V0UG9pbnRlckNvdW50KCkgPiAxKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgZHggPSBldi5nZXRYKDEpIC0gZXYuZ2V0WCgwKTsKKyAgICAgICAgICAgICAgICBmbG9hdCBkeSA9IGV2LmdldFkoMSkgLSBldi5nZXRZKDApOworICAgICAgICAgICAgICAgIGZsb2F0IGRpc3QgPSAoZHggKiBkeCArIGR5ICogZHkpICoKKyAgICAgICAgICAgICAgICAgICAgICAgIERSQUdfTEFZRVJfSU5WRVJTRV9ERU5TSVRZX1NRVUFSRUQ7CisgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBhcHByb3hpbWF0ZSBjZW50ZXIgdG8gZGV0ZXJtaW5lIGlmIHRoZSBnZXN0dXJlIGlzIGluCisgICAgICAgICAgICAgICAgLy8gYSBsYXllci4KKyAgICAgICAgICAgICAgICBnZXN0dXJlWCA9IGV2LmdldFgoMCkgKyAoZHggKiAuNWYpOworICAgICAgICAgICAgICAgIGdlc3R1cmVZID0gZXYuZ2V0WSgwKSArIChkeSAqIC41Zik7CisgICAgICAgICAgICAgICAgLy8gTm93IHVzZSBhIGNvbnNpc3RlbnQgcG9pbnQgZm9yIHRyYWNraW5nIG1vdmVtZW50LgorICAgICAgICAgICAgICAgIGlmIChldi5nZXRYKDApIDwgZXYuZ2V0WCgxKSkgeworICAgICAgICAgICAgICAgICAgICB4ID0gZXYuZ2V0WCgwKTsKKyAgICAgICAgICAgICAgICAgICAgeSA9IGV2LmdldFkoMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IGV2LmdldFgoMSk7CisgICAgICAgICAgICAgICAgICAgIHkgPSBldi5nZXRZKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBldi5nZXRBY3Rpb25NYXNrZWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZGlzdCA8IERSQUdfTEFZRVJfRklOR0VSX0RJU1RBTkNFKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXBTY2FsZUdlc3R1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmluZ2VycyBtb3ZlZCB0b28gZmFyIGFwYXJ0IHdoaWxlIGRyYWdnaW5nLCB0aGUgdXNlcgorICAgICAgICAgICAgICAgICAgICAvLyBtaWdodCBiZSB0cnlpbmcgdG8gem9vbS4KKyAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0lOSVRfTU9ERTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICAvLyBGSVhNRTogd2UgbWF5IGNvbnNpZGVyIHRvIGdpdmUgV2ViS2l0IGFuIG9wdGlvbiB0byBoYW5kbGUgbXVsdGktdG91Y2gKICAgICAgICAgLy8gZXZlbnRzIGxhdGVyLgotICAgICAgICBpZiAobVN1cHBvcnRNdWx0aVRvdWNoICYmIGV2LmdldFBvaW50ZXJDb3VudCgpID4gMSkgewotICAgICAgICAgICAgaWYgKG1NaW5ab29tU2NhbGUgPCBtTWF4Wm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICAgICAgbVNjYWxlRGV0ZWN0b3Iub25Ub3VjaEV2ZW50KGV2KTsKLSAgICAgICAgICAgICAgICBpZiAobVNjYWxlRGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFRpbWUgPSBldmVudFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4ID0gbVNjYWxlRGV0ZWN0b3IuZ2V0Rm9jdXNYKCk7Ci0gICAgICAgICAgICAgICAgeSA9IG1TY2FsZURldGVjdG9yLmdldEZvY3VzWSgpOwotICAgICAgICAgICAgICAgIGFjdGlvbiA9IGV2LmdldEFjdGlvbigpICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0s7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9ET1dOKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbmNlbFRvdWNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNldCBtTGFzdFRvdWNoWC9ZIHRvIHRoZSByZW1haW5pbmcgcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFggPSB4OwotICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IHk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgeCBvciB5IGluZGljYXRlIGl0IGlzIG9uIHRoZSBlZGdlLCBza2lwIGl0LgotICAgICAgICAgICAgICAgICAgICBpZiAoeCA8IDAgfHwgeSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGFnZSBkaXNhbGxvdyB6b29tLCBza2lwIG11bHRpLXBvaW50ZXIgYWN0aW9uCisgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuc3VwcG9ydHNNdWx0aVRvdWNoWm9vbSgpICYmIGV2LmdldFBvaW50ZXJDb3VudCgpID4gMSAmJgorICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgIT0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFICYmICFza2lwU2NhbGVHZXN0dXJlKSB7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSBwYWdlIGRpc2FsbG93cyB6b29tLCBza2lwIG11bHRpLXBvaW50ZXIgYWN0aW9uCisgICAgICAgICAgICBpZiAobVpvb21NYW5hZ2VyLmlzWm9vbVNjYWxlRml4ZWQoKSkgewogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7Ci0gICAgICAgICAgICB4ID0gZXYuZ2V0WCgpOwotICAgICAgICAgICAgeSA9IGV2LmdldFkoKTsKKworICAgICAgICAgICAgaWYgKCFkZXRlY3Rvci5pc0luUHJvZ3Jlc3MoKSAmJgorICAgICAgICAgICAgICAgICAgICBldi5nZXRBY3Rpb25NYXNrZWQoKSAhPSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9ET1dOKSB7CisgICAgICAgICAgICAgICAgLy8gSW5zZXJ0IGEgZmFrZSBwb2ludGVyIGRvd24gZXZlbnQgaW4gb3JkZXIgdG8gc3RhcnQKKyAgICAgICAgICAgICAgICAvLyB0aGUgem9vbSBzY2FsZSBkZXRlY3Rvci4KKyAgICAgICAgICAgICAgICBNb3Rpb25FdmVudCB0ZW1wID0gTW90aW9uRXZlbnQub2J0YWluKGV2KTsKKyAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgb3JpZ2luYWwgZXZlbnQgYW5kIHNldCBpdCB0bworICAgICAgICAgICAgICAgIC8vIEFDVElPTl9QT0lOVEVSX0RPV04uCisgICAgICAgICAgICAgICAgdGVtcC5zZXRBY3Rpb24odGVtcC5nZXRBY3Rpb24oKSAmCisgICAgICAgICAgICAgICAgICAgICAgICB+TW90aW9uRXZlbnQuQUNUSU9OX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTik7CisgICAgICAgICAgICAgICAgZGV0ZWN0b3Iub25Ub3VjaEV2ZW50KHRlbXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZXRlY3Rvci5vblRvdWNoRXZlbnQoZXYpOworCisgICAgICAgICAgICBpZiAoZGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKKyAgICAgICAgICAgICAgICBtTGFzdFRvdWNoVGltZSA9IGV2ZW50VGltZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeCA9IGRldGVjdG9yLmdldEZvY3VzWCgpOworICAgICAgICAgICAgeSA9IGRldGVjdG9yLmdldEZvY3VzWSgpOworICAgICAgICAgICAgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCkgJiBNb3Rpb25FdmVudC5BQ1RJT05fTUFTSzsKKyAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTikgeworICAgICAgICAgICAgICAgIGNhbmNlbFRvdWNoKCk7CisgICAgICAgICAgICAgICAgYWN0aW9uID0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV047CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUCkgeworICAgICAgICAgICAgICAgIC8vIHNldCBtTGFzdFRvdWNoWC9ZIHRvIHRoZSByZW1haW5pbmcgcG9pbnQKKyAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWCA9IHg7CisgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFkgPSB5OworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpIHsKKyAgICAgICAgICAgICAgICAvLyBuZWdhdGl2ZSB4IG9yIHkgaW5kaWNhdGUgaXQgaXMgb24gdGhlIGVkZ2UsIHNraXAgaXQuCisgICAgICAgICAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIER1ZSB0byB0aGUgdG91Y2ggc2NyZWVuIGVkZ2UgZWZmZWN0LCBhIHRvdWNoIGNsb3NlciB0byB0aGUgZWRnZQogICAgICAgICAvLyBhbHdheXMgc25hcHBlZCB0byB0aGUgZWRnZS4gQXMgZ2V0Vmlld1dpZHRoKCkgY2FuIGJlIGRpZmZlcmVudCBmcm9tCiAgICAgICAgIC8vIGdldFdpZHRoKCkgZHVlIHRvIHRoZSBzY3JvbGxiYXIsIGFkanVzdGluZyB0aGUgcG9pbnQgdG8gbWF0Y2gKICAgICAgICAgLy8gZ2V0Vmlld1dpZHRoKCkuIFNhbWUgYXBwbGllZCB0byB0aGUgaGVpZ2h0LgotICAgICAgICBpZiAoeCA+IGdldFZpZXdXaWR0aCgpIC0gMSkgewotICAgICAgICAgICAgeCA9IGdldFZpZXdXaWR0aCgpIC0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoeSA+IGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSAtIDEpIHsKLSAgICAgICAgICAgIHkgPSBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCkgLSAxOwotICAgICAgICB9CisgICAgICAgIHggPSBNYXRoLm1pbih4LCBnZXRWaWV3V2lkdGgoKSAtIDEpOworICAgICAgICB5ID0gTWF0aC5taW4oeSwgZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpIC0gMSk7CiAKICAgICAgICAgZmxvYXQgZkRlbHRhWCA9IG1MYXN0VG91Y2hYIC0geDsKICAgICAgICAgZmxvYXQgZkRlbHRhWSA9IG1MYXN0VG91Y2hZIC0geTsKQEAgLTQ5NDEsNiArNDg0MCw5IEBACiAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhSRVNVTUVfV0VCQ09SRV9QUklPUklUWSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJpdmF0ZUhhbmRsZXIuaGFzTWVzc2FnZXMoUkVMRUFTRV9TSU5HTEVfVEFQKSkgewogICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoUkVMRUFTRV9TSU5HTEVfVEFQKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZIDwgbURvdWJsZVRhcFNsb3BTcXVhcmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9ET1VCTEVfVEFQX01PREU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC00OTUyLDEzICs0ODU0LDMzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRYLCBjb250ZW50WSkgOiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRoZSBub3JtYWwgY2FzZQotICAgICAgICAgICAgICAgICAgICBtUHJldmlld1pvb21Pbmx5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7CiAgICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoUHJvY2VzcyA9ICghaW5GdWxsU2NyZWVuTW9kZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUZvcndhcmRUb3VjaEV2ZW50cykgPyBoaXRGb2N1c2VkUGx1Z2luKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRYLCBjb250ZW50WSkgOiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SHViLlVQREFURV9GUkFNRV9DQUNIRV9JRl9MT0FESU5HKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUb3VjaEhpZ2hsaWdodERhdGEgZGF0YSA9IG5ldyBUb3VjaEhpZ2hsaWdodERhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVggPSBjb250ZW50WDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVkgPSBjb250ZW50WTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVNsb3AgPSB2aWV3VG9Db250ZW50RGltZW5zaW9uKG1OYXZTbG9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZURlbGF5ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SHViLkdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdDb25maWd1cmF0aW9uLmdldFRhcFRpbWVvdXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfVE9VQ0hfSElHSExJR0hUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuZ2V0TmF2RHVtcCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFggPSAoaW50KSB4ICsgbVNjcm9sbFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFkgPSAoaW50KSB5ICsgbVNjcm9sbFk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WCA9IG1Ub3VjaEhpZ2hsaWdodFkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgVE9VQ0hfSElHSExJR0hUX0VMQVBTRV9USU1FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKG1Mb2dFdmVudCAmJiBldmVudFRpbWUgLSBtTGFzdFRvdWNoVXBUaW1lIDwgMTAwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFdmVudExvZ1RhZ3MuQlJPV1NFUl9ET1VCTEVfVEFQX0RVUkFUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnRUaW1lIC0gbUxhc3RUb3VjaFVwVGltZSksIGV2ZW50VGltZSk7CkBAIC00OTk0LDE3ICs0OTE2LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVkgPSBjb250ZW50WTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gZXYuZ2V0TWV0YVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9FVkVOVCwgdGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCBuZWVkcyB0byBzZXQgdGhlbSBmb3IgY29tcHV0ZSBkZWx0YVgvWQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hYID0geDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbkZ1bGxTY3JlZW5Nb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoUFJFVkVOVF9ERUZBVUxUX1RJTUVPVVQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobVByaXZhdGVIYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2J0YWluTWVzc2FnZShQUkVWRU5UX0RFRkFVTFRfVElNRU9VVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLCAwKSwgVEFQX1RJTUVPVVQpOwpAQCAtNTAyNSwyNCArNDk0NSwyNCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9ET1VCTEVfVEFQX01PREUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBwYXNzIHRoZSB0b3VjaCBldmVudHMgZnJvbSBVSSB0aHJlYWQgdG8gV2ViQ29yZSB0aHJlYWQKICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRm9yd2FyZFRvdWNoRXZlbnQoKSAmJiBtQ29uZmlybU1vdmUgJiYgKGZpcnN0TW92ZQogICAgICAgICAgICAgICAgICAgICAgICAgfHwgZXZlbnRUaW1lIC0gbUxhc3RTZW50VG91Y2hUaW1lID4gbUN1cnJlbnRUb3VjaEludGVydmFsKSkgewotICAgICAgICAgICAgICAgICAgICBtTGFzdFNlbnRUb3VjaFRpbWUgPSBldmVudFRpbWU7CiAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IG5ldyBUb3VjaEV2ZW50RGF0YSgpOwogICAgICAgICAgICAgICAgICAgICB0ZWQubUFjdGlvbiA9IGFjdGlvbjsKICAgICAgICAgICAgICAgICAgICAgdGVkLm1YID0gY29udGVudFg7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tWSA9IGNvbnRlbnRZOwogICAgICAgICAgICAgICAgICAgICB0ZWQubU1ldGFTdGF0ZSA9IGV2LmdldE1ldGFTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKKyAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOworICAgICAgICAgICAgICAgICAgICBtTGFzdFNlbnRUb3VjaFRpbWUgPSBldmVudFRpbWU7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1ggPSB4OwotICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdE1vdmUgJiYgIWluRnVsbFNjcmVlbk1vZGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtUHJpdmF0ZUhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9idGFpbk1lc3NhZ2UoUFJFVkVOVF9ERUZBVUxUX1RJTUVPVVQsCkBAIC01MDcxLDExICs0OTkxLDEzIEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSkgeworICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoIW1Db25maXJtTW92ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBpZiAobVByZXZlbnREZWZhdWx0ID09IFBSRVZFTlRfREVGQVVMVF9NQVlCRV9ZRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtUHJldmVudERlZmF1bHQgPT0gUFJFVkVOVF9ERUZBVUxUX05PX0ZST01fVE9VQ0hfRE9XTikgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2sgbUxhc3RUb3VjaFRpbWUgYXMgd2UgbWF5IG5lZWQgdG8gZG8gZmxpbmcgYXQKQEAgLTUxMDIsNiArNTAyNCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGRlbHRhWCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIGRlbHRhWSA9IDA7CiAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBTY2FsZUdlc3R1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2Nyb2xsaW5nTGF5ZXIoZ2VzdHVyZVgsIGdlc3R1cmVZKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzdGFydERyYWcoKTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTUxMTAsNiArNTAzNSwyMCBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIGRvIHBhbgorICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTEFZRVJfTU9ERSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgbmV3U2Nyb2xsWCA9IHBpbkxvY1gobVNjcm9sbFggKyBkZWx0YVgpOworICAgICAgICAgICAgICAgICAgICBpbnQgbmV3RGVsdGFYID0gbmV3U2Nyb2xsWCAtIG1TY3JvbGxYOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYICE9IG5ld0RlbHRhWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFYID0gbmV3RGVsdGFYOworICAgICAgICAgICAgICAgICAgICAgICAgZkRlbHRhWCA9IChmbG9hdCkgbmV3RGVsdGFYOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBuZXdTY3JvbGxZID0gcGluTG9jWShtU2Nyb2xsWSArIGRlbHRhWSk7CisgICAgICAgICAgICAgICAgICAgIGludCBuZXdEZWx0YVkgPSBuZXdTY3JvbGxZIC0gbVNjcm9sbFk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVkgIT0gbmV3RGVsdGFZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVkgPSBuZXdEZWx0YVk7CisgICAgICAgICAgICAgICAgICAgICAgICBmRGVsdGFZID0gKGZsb2F0KSBuZXdEZWx0YVk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBkb25lID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBrZWVwU2Nyb2xsQmFyc1Zpc2libGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoZkRlbHRhWCkgPCAxLjBmICYmIE1hdGguYWJzKGZEZWx0YVkpIDwgMS4wZikgewpAQCAtNTE3Niw3ICs1MTE1LDkgQEAKIAogICAgICAgICAgICAgICAgIGRvRHJhZyhkZWx0YVgsIGRlbHRhWSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoa2VlcFNjcm9sbEJhcnNWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgLy8gVHVybiBvZmYgc2Nyb2xsYmFycyB3aGVuIGRyYWdnaW5nIGEgbGF5ZXIuCisgICAgICAgICAgICAgICAgaWYgKGtlZXBTY3JvbGxCYXJzVmlzaWJsZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1IZWxkTW90aW9ubGVzcyAhPSBNT1RJT05MRVNTX1RSVUUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWxkTW90aW9ubGVzcyA9IE1PVElPTkxFU1NfVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKQEAgLTUxOTEsNiArNTEzMiw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDogeworICAgICAgICAgICAgICAgIGlmICghaXNGb2N1c2VkKCkpIHJlcXVlc3RGb2N1cygpOwogICAgICAgICAgICAgICAgIC8vIHBhc3MgdGhlIHRvdWNoIGV2ZW50cyBmcm9tIFVJIHRocmVhZCB0byBXZWJDb3JlIHRocmVhZAogICAgICAgICAgICAgICAgIGlmIChzaG91bGRGb3J3YXJkVG91Y2hFdmVudCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IG5ldyBUb3VjaEV2ZW50RGF0YSgpOwpAQCAtNTE5OSwxMCArNTE0MSw2IEBACiAgICAgICAgICAgICAgICAgICAgIHRlZC5tWSA9IGNvbnRlbnRZOwogICAgICAgICAgICAgICAgICAgICB0ZWQubU1ldGFTdGF0ZSA9IGV2LmdldE1ldGFTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWZlclRvdWNoUHJvY2VzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdZID0geTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hVcFRpbWUgPSBldmVudFRpbWU7CkBAIC01MjE3LDEzICs1MTU1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVkgPSBjb250ZW50WTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubU1ldGFTdGF0ZSA9IGV2LmdldE1ldGFTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1kgPSB5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmV2ZW50RGVmYXVsdCAhPSBQUkVWRU5UX0RFRkFVTFRfWUVTKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0RvdWJsZVRhcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5oYW5kbGVEb3VibGVUYXAobUxhc3RUb3VjaFgsIG1MYXN0VG91Y2hZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfRE9ORV9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC01MjM4LDkgKzUxNzIsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVByZXZlbnREZWZhdWx0ICE9IFBSRVZFTlRfREVGQVVMVF9ZRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChjb21wdXRlTWF4U2Nyb2xsWCgpID4gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjb21wdXRlTWF4U2Nyb2xsWSgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVUkgdGFrZXMgY29udHJvbCBiYWNrLCBjYW5jZWwgV2ViQ29yZSB0b3VjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxXZWJDb3JlVG91Y2hFdmVudChjb250ZW50WCwgY29udGVudFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB1c2VyIGhhcyBwZXJmb3JtZWQgYSB2ZXJ5IHF1aWNrIHRvdWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcXVlbmNlIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgbWF5IGdldCBoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBXZWJDb3JlIGhhcyBoYWQgYSBjaGFuY2UgdG8gcHJvY2VzcyB0aGUgZXZlbnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIGFueSBjYWxsIHRvIHByZXZlbnREZWZhdWx0IGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKUyB0b3VjaCBoYW5kbGVyIHdpbGwgbm90IGhhdmUgYmVlbiBleGVjdXRlZCB5ZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlbmNlIHdlIHdpbGwgc2VlIGJvdGggdGhlIFVJIChub3cpIGFuZCBXZWJDb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh3aGVuIGNvbnRleHQgc3dpdGNoZXMpIGhhbmRsaW5nIHRoZSBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSB3ZWIgZGV2ZWxvcGVyIGFjdHVhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXNlcyBwcmV2ZW50RGVmYXVsdCBpbiB0aGVpciB0b3VjaCBoYW5kbGVyLiBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBuYXR1cmUgb2Ygb3VyIGFzeW5jaHJvbm91cyB0b3VjaCBtb2RlbC4KKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIG5vdCByZXdyaXRlIGRyYWcgY29kZSBoZXJlLCBidXQgd2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCB0cnkgZmxpbmcgaWYgaXQgYXBwbGllcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUucmVkdWNlUHJpb3JpdHkoKTsKQEAgLTUyNTgsMTMgKzUyMDAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0aW5nVGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF0aXZlSGl0U2VsZWN0aW9uKGNvbnRlbnRYLCBjb250ZW50WSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFwcGluZyBvbiBzZWxlY3Rpb24gb3IgY29udHJvbHMgZG9lcyBub3RoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmF0aXZlSGl0U2VsZWN0aW9uKGNvbnRlbnRYLCBjb250ZW50WSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Eb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9JTklUX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHRyaWdnZXIgZG91YmxlIHRhcCBpZiB0aGUgV2ViVmlldyBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfSU5JVF9NT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY2FuWm9vbUluKCkgfHwgY2FuWm9vbU91dCgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVMRUFTRV9TSU5HTEVfVEFQLCBWaWV3Q29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERvdWJsZVRhcFRpbWVvdXQoKSk7CkBAIC01MjkzLDE4ICs1MjM4LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlbGRNb3Rpb25sZXNzID0gTU9USU9OTEVTU19JR05PUkU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9GbGluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ2JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZU1heFNjcm9sbFgoKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVNYXhTY3JvbGxZKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWRyYXcgaW4gaGlnaC1xdWFsaXR5LCBhcyB3ZSdyZSBkb25lIGRyYWdnaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICBtSGVsZE1vdGlvbmxlc3MgPSBNT1RJT05MRVNTX1RSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICAgICAgICAgICAgICAgICAgY2FzZSBUT1VDSF9EUkFHX1NUQVJUX01PREU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVE9VQ0hfRFJBR19MQVlFUl9NT0RFOgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9VQ0hfRFJBR19TVEFSVF9NT0RFIHNob3VsZCBub3QgaGFwcGVuIGZvciB0aGUgcmVhbAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIGFzIHdlIGFsbW9zdCBjZXJ0YWluIHdpbGwgZ2V0IGEgTU9WRS4gQnV0IHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHBvc3NpYmxlIG9uIGVtdWxhdG9yLgpAQCAtNTMxOCw4ICs1MjU4LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDogewogICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX0RSQUdfTU9ERSkgewotICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsZXIuc3ByaW5nYmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZU1heFNjcm9sbFgoKSwgMCwgY29tcHV0ZU1heFNjcm9sbFkoKSk7CiAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FuY2VsV2ViQ29yZVRvdWNoRXZlbnQoY29udGVudFgsIGNvbnRlbnRZLCBmYWxzZSk7CkBAIC01MzYzLDQyICs1MzAxLDI2IEBACiAgICAgICAgIGlmICghbURyYWdGcm9tVGV4dElucHV0KSB7CiAgICAgICAgICAgICBuYXRpdmVIaWRlQ3Vyc29yKCk7CiAgICAgICAgIH0KLSAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpOwotICAgICAgICBpZiAoc2V0dGluZ3Muc3VwcG9ydFpvb20oKQotICAgICAgICAgICAgICAgICYmIHNldHRpbmdzLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKQotICAgICAgICAgICAgICAgICYmICFnZXRab29tQnV0dG9uc0NvbnRyb2xsZXIoKS5pc1Zpc2libGUoKQotICAgICAgICAgICAgICAgICYmIG1NaW5ab29tU2NhbGUgPCBtTWF4Wm9vbVNjYWxlCi0gICAgICAgICAgICAgICAgJiYgKG1Ib3Jpem9udGFsU2Nyb2xsQmFyTW9kZSAhPSBTQ1JPTExCQVJfQUxXQVlTT0ZGCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtVmVydGljYWxTY3JvbGxCYXJNb2RlICE9IFNDUk9MTEJBUl9BTFdBWVNPRkYpKSB7Ci0gICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBzZXR0aW5ncy5nZXREb3VibGVUYXBUb2FzdENvdW50KCk7Ci0gICAgICAgICAgICBpZiAobUluWm9vbU92ZXJ2aWV3ICYmIGNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIHNldHRpbmdzLnNldERvdWJsZVRhcFRvYXN0Q291bnQoLS1jb3VudCk7Ci0gICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5kb3VibGVfdGFwX3RvYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX0xPTkcpLnNob3coKTsKLSAgICAgICAgICAgIH0KKworICAgICAgICBpZiAobUhvcml6b250YWxTY3JvbGxCYXJNb2RlICE9IFNDUk9MTEJBUl9BTFdBWVNPRkYKKyAgICAgICAgICAgICAgICB8fCBtVmVydGljYWxTY3JvbGxCYXJNb2RlICE9IFNDUk9MTEJBUl9BTFdBWVNPRkYpIHsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5pbnZva2Vab29tUGlja2VyKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZG9EcmFnKGludCBkZWx0YVgsIGludCBkZWx0YVkpIHsKICAgICAgICAgaWYgKChkZWx0YVggfCBkZWx0YVkpICE9IDApIHsKLSAgICAgICAgICAgIG92ZXJzY3JvbGxCeShkZWx0YVgsIGRlbHRhWSwgbVNjcm9sbFgsIG1TY3JvbGxZLAotICAgICAgICAgICAgICAgICAgICBjb21wdXRlTWF4U2Nyb2xsWCgpLCBjb21wdXRlTWF4U2Nyb2xsWSgpLAotICAgICAgICAgICAgICAgICAgICBnZXRWaWV3V2lkdGgoKSAvIDMsIGdldFZpZXdIZWlnaHQoKSAvIDMsIHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gc2hvd1BsdXNNaW51cyA9IG1NaW5ab29tU2NhbGUgPCBtTWF4Wm9vbVNjYWxlOwotICAgICAgICAgICAgaWYgKG1ab29tQ29udHJvbHMgIT0gbnVsbCAmJiBzaG93UGx1c01pbnVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1ab29tQ29udHJvbHMuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtWm9vbUNvbnRyb2xzLnNob3coc2hvd1BsdXNNaW51cywgZmFsc2UpOworICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFKSB7CisgICAgICAgICAgICAgICAgZGVsdGFYID0gdmlld1RvQ29udGVudERpbWVuc2lvbihkZWx0YVgpOworICAgICAgICAgICAgICAgIGRlbHRhWSA9IHZpZXdUb0NvbnRlbnREaW1lbnNpb24oZGVsdGFZKTsKKyAgICAgICAgICAgICAgICBpZiAobmF0aXZlU2Nyb2xsTGF5ZXIobVNjcm9sbGluZ0xheWVyLCBkZWx0YVgsIGRlbHRhWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBaT09NX0NPTlRST0xTX1RJTUVPVVQpOworICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjcm9sbEJ5KGRlbHRhWCwgZGVsdGFZKTsKICAgICAgICAgfQorICAgICAgICBtWm9vbU1hbmFnZXIua2VlcFpvb21QaWNrZXJWaXNpYmxlKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHN0b3BUb3VjaCgpIHsKQEAgLTU0MjUsNyArNTM0Nyw4IEBACiAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLnJlY3ljbGUoKTsKICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBudWxsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX0RSQUdfTU9ERSkgeworICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX01PREUgfHwKKyAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID09IFRPVUNIX0RSQUdfTEFZRVJfTU9ERSkgewogICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lUHJpb3JpdHkoKTsKICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKICAgICAgICAgfQpAQCAtNTQzMyw2ICs1MzU2LDkgQEAKICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKFNXSVRDSF9UT19MT05HUFJFU1MpOwogICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoRFJBR19IRUxEX01PVElPTkxFU1MpOwogICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoQVdBS0VOX1NDUk9MTF9CQVJTKTsKKyAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodCh0cnVlKTsKKyAgICAgICAgfQogICAgICAgICBtSGVsZE1vdGlvbmxlc3MgPSBNT1RJT05MRVNTX1RSVUU7CiAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9ET05FX01PREU7CiAgICAgICAgIG5hdGl2ZUhpZGVDdXJzb3IoKTsKQEAgLTU2OTgsMTEgKzU2MjQsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tiYWxsUmVtYWluc1g9IiArIG1UcmFja2JhbGxSZW1haW5zWAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2JhbGxSZW1haW5zWT0iICsgbVRyYWNrYmFsbFJlbWFpbnNZKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCAmJiBuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKKyAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCAmJiBuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgewogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBsZXRQbHVnaW5IYW5kbGVOYXZLZXkoc2VsZWN0S2V5Q29kZSwgdGltZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGxldFBhZ2VIYW5kbGVOYXZLZXkoc2VsZWN0S2V5Q29kZSwgdGltZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxldFBsdWdpbkhhbmRsZU5hdktleShzZWxlY3RLZXlDb2RlLCB0aW1lLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgbGV0UGFnZUhhbmRsZU5hdktleShzZWxlY3RLZXlDb2RlLCB0aW1lLCBmYWxzZSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hdkhhbmRsZWRLZXkoc2VsZWN0S2V5Q29kZSwgY291bnQsIGZhbHNlLCB0aW1lKSkgewogICAgICAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdChrZXlDb2RlVG9Tb3VuZHNFZmZlY3Qoc2VsZWN0S2V5Q29kZSkpOwogICAgICAgICAgICAgfQpAQCAtNTczMywxNyArNTY1OSwzMCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGNvbXB1dGVNYXhTY3JvbGxYKCkgewotICAgICAgICByZXR1cm4gTWF0aC5tYXgoY29tcHV0ZVJlYWxIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSAtIGdldFZpZXdXaWR0aCgpLCAwKTsKKyAgICAgICAgcmV0dXJuIE1hdGgubWF4KGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSAtIGdldFZpZXdXaWR0aCgpLCAwKTsKICAgICB9CiAKICAgICBwcml2YXRlIGludCBjb21wdXRlTWF4U2Nyb2xsWSgpIHsKLSAgICAgICAgcmV0dXJuIE1hdGgubWF4KGNvbXB1dGVSZWFsVmVydGljYWxTY3JvbGxSYW5nZSgpICsgZ2V0VGl0bGVIZWlnaHQoKQorICAgICAgICByZXR1cm4gTWF0aC5tYXgoY29tcHV0ZVZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSArIGdldFRpdGxlSGVpZ2h0KCkKICAgICAgICAgICAgICAgICAtIGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSwgMCk7CiAgICAgfQogCisgICAgYm9vbGVhbiB1cGRhdGVTY3JvbGxDb29yZGluYXRlcyhpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgaW50IG9sZFggPSBtU2Nyb2xsWDsKKyAgICAgICAgaW50IG9sZFkgPSBtU2Nyb2xsWTsKKyAgICAgICAgbVNjcm9sbFggPSB4OworICAgICAgICBtU2Nyb2xsWSA9IHk7CisgICAgICAgIGlmIChvbGRYICE9IG1TY3JvbGxYIHx8IG9sZFkgIT0gbVNjcm9sbFkpIHsKKyAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBmbGluZ1Njcm9sbChpbnQgdngsIGludCB2eSkgewogICAgICAgICBtU2Nyb2xsZXIuZmxpbmcobVNjcm9sbFgsIG1TY3JvbGxZLCB2eCwgdnksIDAsIGNvbXB1dGVNYXhTY3JvbGxYKCksIDAsCi0gICAgICAgICAgICAgICAgY29tcHV0ZU1heFNjcm9sbFkoKSwgZ2V0Vmlld1dpZHRoKCkgLyAzLCBnZXRWaWV3SGVpZ2h0KCkgLyAzKTsKKyAgICAgICAgICAgICAgICBjb21wdXRlTWF4U2Nyb2xsWSgpKTsKICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgIH0KIApAQCAtNTc3MywyMCArNTcxMiwxOSBAQAogICAgICAgICBpZiAoKG1heFggPT0gMCAmJiB2eSA9PSAwKSB8fCAobWF4WSA9PSAwICYmIHZ4ID09IDApKSB7CiAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVQcmlvcml0eSgpOwogICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOwotICAgICAgICAgICAgaWYgKG1TY3JvbGxlci5zcHJpbmdiYWNrKG1TY3JvbGxYLCBtU2Nyb2xsWSwgMCwgY29tcHV0ZU1heFNjcm9sbFgoKSwKLSAgICAgICAgICAgICAgICAgICAgMCwgY29tcHV0ZU1heFNjcm9sbFkoKSkpIHsKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgZmxvYXQgY3VycmVudFZlbG9jaXR5ID0gbVNjcm9sbGVyLmdldEN1cnJWZWxvY2l0eSgpOwotICAgICAgICBpZiAobUxhc3RWZWxvY2l0eSA+IDAgJiYgY3VycmVudFZlbG9jaXR5ID4gMCkgeworICAgICAgICBmbG9hdCB2ZWxvY2l0eSA9IChmbG9hdCkgTWF0aC5oeXBvdCh2eCwgdnkpOworICAgICAgICBpZiAobUxhc3RWZWxvY2l0eSA+IDAgJiYgY3VycmVudFZlbG9jaXR5ID4gMCAmJiB2ZWxvY2l0eQorICAgICAgICAgICAgICAgID4gbUxhc3RWZWxvY2l0eSAqIE1JTklNVU1fVkVMT0NJVFlfUkFUSU9fRk9SX0FDQ0VMRVJBVElPTikgewogICAgICAgICAgICAgZmxvYXQgZGVsdGFSID0gKGZsb2F0KSAoTWF0aC5hYnMoTWF0aC5hdGFuMihtTGFzdFZlbFksIG1MYXN0VmVsWCkKICAgICAgICAgICAgICAgICAgICAgLSBNYXRoLmF0YW4yKHZ5LCB2eCkpKTsKICAgICAgICAgICAgIGZpbmFsIGZsb2F0IGNpcmNsZSA9IChmbG9hdCkgKE1hdGguUEkpICogMi4wZjsKICAgICAgICAgICAgIGlmIChkZWx0YVIgPiBjaXJjbGUgKiAwLjlmIHx8IGRlbHRhUiA8IGNpcmNsZSAqIDAuMWYpIHsKICAgICAgICAgICAgICAgICB2eCArPSBjdXJyZW50VmVsb2NpdHkgKiBtTGFzdFZlbFggLyBtTGFzdFZlbG9jaXR5OwogICAgICAgICAgICAgICAgIHZ5ICs9IGN1cnJlbnRWZWxvY2l0eSAqIG1MYXN0VmVsWSAvIG1MYXN0VmVsb2NpdHk7CisgICAgICAgICAgICAgICAgdmVsb2NpdHkgPSAoZmxvYXQpIE1hdGguaHlwb3QodngsIHZ5KTsKICAgICAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgewogICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJkb0ZsaW5nIHZ4PSAiICsgdnggKyAiIHZ5PSIgKyB2eSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTgwMiw0NyArNTc0MCwxNSBAQAogICAgICAgICB9CiAgICAgICAgIG1MYXN0VmVsWCA9IHZ4OwogICAgICAgICBtTGFzdFZlbFkgPSB2eTsKLSAgICAgICAgbUxhc3RWZWxvY2l0eSA9IChmbG9hdCkgTWF0aC5oeXBvdCh2eCwgdnkpOworICAgICAgICBtTGFzdFZlbG9jaXR5ID0gdmVsb2NpdHk7CiAKLSAgICAgICAgLy8gbm8gaG9yaXpvbnRhbCBvdmVyc2Nyb2xsIGlmIHRoZSBjb250ZW50IGp1c3QgZml0cwotICAgICAgICBtU2Nyb2xsZXIuZmxpbmcobVNjcm9sbFgsIG1TY3JvbGxZLCAtdngsIC12eSwgMCwgbWF4WCwgMCwgbWF4WSwKLSAgICAgICAgICAgICAgICBtYXhYID09IDAgPyAwIDogZ2V0Vmlld1dpZHRoKCkgLyAzLCBnZXRWaWV3SGVpZ2h0KCkgLyAzKTsKLSAgICAgICAgLy8gVE9ETzogZHVyYXRpb24gaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB2ZWxvY2l0eSwgaWYgdGhlIHJhbmdlIGlzCi0gICAgICAgIC8vIHNtYWxsLCB0aGUgYW5pbWF0aW9uIHdpbGwgc3RvcCBiZWZvcmUgZHVyYXRpb24gaXMgdXAuIFdlIG1heQotICAgICAgICAvLyB3YW50IHRvIGNhbGN1bGF0ZSBob3cgbG9uZyB0aGUgYW5pbWF0aW9uIGlzIGdvaW5nIHRvIHJ1biB0byBwcmVjaXNlbHkKLSAgICAgICAgLy8gcmVzdW1lIHRoZSB3ZWJjb3JlIHVwZGF0ZS4KKyAgICAgICAgbVNjcm9sbGVyLmZsaW5nKG1TY3JvbGxYLCBtU2Nyb2xsWSwgLXZ4LCAtdnksIDAsIG1heFgsIDAsIG1heFkpOwogICAgICAgICBmaW5hbCBpbnQgdGltZSA9IG1TY3JvbGxlci5nZXREdXJhdGlvbigpOwogICAgICAgICBtUHJpdmF0ZUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoUkVTVU1FX1dFQkNPUkVfUFJJT1JJVFksIHRpbWUpOwogICAgICAgICBhd2FrZW5TY3JvbGxCYXJzKHRpbWUpOwogICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIHpvb21XaXRoUHJldmlldyhmbG9hdCBzY2FsZSwgYm9vbGVhbiB1cGRhdGVUZXh0V3JhcFNjYWxlKSB7Ci0gICAgICAgIGZsb2F0IG9sZFNjYWxlID0gbUFjdHVhbFNjYWxlOwotICAgICAgICBtSW5pdGlhbFNjcm9sbFggPSBtU2Nyb2xsWDsKLSAgICAgICAgbUluaXRpYWxTY3JvbGxZID0gbVNjcm9sbFk7Ci0KLSAgICAgICAgLy8gc25hcCB0byBERUZBVUxUX1NDQUxFIGlmIGl0IGlzIGNsb3NlCi0gICAgICAgIGlmIChNYXRoLmFicyhzY2FsZSAtIG1EZWZhdWx0U2NhbGUpIDwgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbURlZmF1bHRTY2FsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldE5ld1pvb21TY2FsZShzY2FsZSwgdXBkYXRlVGV4dFdyYXBTY2FsZSwgZmFsc2UpOwotCi0gICAgICAgIGlmIChvbGRTY2FsZSAhPSBtQWN0dWFsU2NhbGUpIHsKLSAgICAgICAgICAgIC8vIHVzZSBtWm9vbVBpY2tlclNjYWxlIHRvIHNlZSB6b29tIHByZXZpZXcgZmlyc3QKLSAgICAgICAgICAgIG1ab29tU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1JbnZJbml0aWFsWm9vbVNjYWxlID0gMS4wZiAvIG9sZFNjYWxlOwotICAgICAgICAgICAgbUludkZpbmFsWm9vbVNjYWxlID0gMS4wZiAvIG1BY3R1YWxTY2FsZTsKLSAgICAgICAgICAgIG1ab29tU2NhbGUgPSBtQWN0dWFsU2NhbGU7Ci0gICAgICAgICAgICBXZWJWaWV3Q29yZS5wYXVzZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKLSAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHZpZXcgY29udGFpbmluZyB6b29tIGNvbnRyb2xzIGkuZS4gKy8tIGJ1dHRvbnMuIFRoZSBjYWxsZXIgaXMKICAgICAgKiBpbiBjaGFyZ2Ugb2YgaW5zdGFsbGluZyB0aGlzIHZpZXcgdG8gdGhlIHZpZXcgaGllcmFyY2h5LiBUaGlzIHZpZXcgd2lsbApAQCAtNTg2Miw4MSArNTc2OCwyOSBAQAogICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiVGhpcyBXZWJWaWV3IGRvZXNuJ3Qgc3VwcG9ydCB6b29tLiIpOwogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1ab29tQ29udHJvbHMgPT0gbnVsbCkgewotICAgICAgICAgICAgbVpvb21Db250cm9scyA9IGNyZWF0ZVpvb21Db250cm9scygpOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogbmVlZCB0byBiZSBzZXQgdG8gVklTSUJMRSBmaXJzdCBzbyB0aGF0IGdldE1lYXN1cmVkSGVpZ2h0KCkgaW4KLSAgICAgICAgICAgICAqIHtAbGluayAjb25TaXplQ2hhbmdlZCgpfSBjYW4gcmV0dXJuIHRoZSBtZWFzdXJlZCB2YWx1ZSBmb3IgcHJvcGVyCi0gICAgICAgICAgICAgKiBsYXlvdXQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1ab29tQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVpvb21Db250cm9sUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotCi0gICAgICAgICAgICAgICAgICAgIC8qIERvbid0IGRpc21pc3MgdGhlIGNvbnRyb2xzIGlmIHRoZSB1c2VyIGhhcwotICAgICAgICAgICAgICAgICAgICAgKiBmb2N1cyBvbiB0aGVtLiBXYWl0IGFuZCBjaGVjayBhZ2FpbiBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmICghbVpvb21Db250cm9scy5oYXNGb2N1cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtWm9vbUNvbnRyb2xzLmhpZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaT09NX0NPTlRST0xTX1RJTUVPVVQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVpvb21Db250cm9sczsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5nZXRFeHRlcm5hbFpvb21QaWNrZXIoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGNyZWF0ZVpvb21Db250cm9scygpIHsKLSAgICAgICAgRXh0ZW5kZWRab29tQ29udHJvbHMgem9vbUNvbnRyb2xzID0gbmV3IEV4dGVuZGVkWm9vbUNvbnRyb2xzKG1Db250ZXh0Ci0gICAgICAgICAgICAsIG51bGwpOwotICAgICAgICB6b29tQ29udHJvbHMuc2V0T25ab29tSW5DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRpbWUgb3V0Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKLSAgICAgICAgICAgICAgICB6b29tSW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHpvb21Db250cm9scy5zZXRPblpvb21PdXRDbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRpbWUgb3V0Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKLSAgICAgICAgICAgICAgICB6b29tT3V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gem9vbUNvbnRyb2xzOworICAgIHZvaWQgZGlzbWlzc1pvb21Db250cm9sKCkgeworICAgICAgICBtWm9vbU1hbmFnZXIuZGlzbWlzc1pvb21QaWNrZXIoKTsKKyAgICB9CisKKyAgICBmbG9hdCBnZXREZWZhdWx0Wm9vbVNjYWxlKCkgeworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLmdldERlZmF1bHRTY2FsZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHtAbGluayBab29tQnV0dG9uc0NvbnRyb2xsZXJ9IHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFkZAotICAgICAqIGFkZGl0aW9uYWwgYnV0dG9ucyB0byB0aGUgem9vbSBjb250cm9scyB3aW5kb3cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgWm9vbUJ1dHRvbnNDb250cm9sbGVyfSB1c2VkIGJ5IHRoaXMgY2xhc3MsCi0gICAgICogICAgICAgICBvciBudWxsIGlmIGl0IGlzIHVuYXZhaWxhYmxlLgotICAgICAqIEBoaWRlCisgICAgICogQHJldHVybiBUUlVFIGlmIHRoZSBXZWJWaWV3IGNhbiBiZSB6b29tZWQgaW4uCiAgICAgICovCi0gICAgcHVibGljIFpvb21CdXR0b25zQ29udHJvbGxlciBnZXRab29tQnV0dG9uc0NvbnRyb2xsZXIoKSB7Ci0gICAgICAgIGlmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPSBuZXcgWm9vbUJ1dHRvbnNDb250cm9sbGVyKHRoaXMpOwotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRPblpvb21MaXN0ZW5lcihtWm9vbUxpc3RlbmVyKTsKLSAgICAgICAgICAgIC8vIFpvb21CdXR0b25zQ29udHJvbGxlciBwb3NpdGlvbnMgdGhlIGJ1dHRvbnMgYXQgdGhlIGJvdHRvbSwgYnV0IGluCi0gICAgICAgICAgICAvLyB0aGUgbWlkZGxlLiBDaGFuZ2UgdGhlaXIgbGF5b3V0IHBhcmFtZXRlcnMgc28gdGhleSBhcHBlYXIgb24gdGhlCi0gICAgICAgICAgICAvLyByaWdodC4KLSAgICAgICAgICAgIFZpZXcgY29udHJvbHMgPSBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpOwotICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMgPSBjb250cm9scy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgICAgIGlmIChwYXJhbXMgaW5zdGFuY2VvZiBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMpIHsKLSAgICAgICAgICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMgZnJhbWVQYXJhbXMgPSAoRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKSBwYXJhbXM7Ci0gICAgICAgICAgICAgICAgZnJhbWVQYXJhbXMuZ3Jhdml0eSA9IEdyYXZpdHkuUklHSFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ab29tQnV0dG9uc0NvbnRyb2xsZXI7CisgICAgcHVibGljIGJvb2xlYW4gY2FuWm9vbUluKCkgeworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLmNhblpvb21JbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgV2ViVmlldyBjYW4gYmUgem9vbWVkIG91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5ab29tT3V0KCkgeworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLmNhblpvb21PdXQoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTU5NDQsMTUgKzU3OTgsNyBAQAogICAgICAqIEByZXR1cm4gVFJVRSBpZiB6b29tIGluIHN1Y2NlZWRzLiBGQUxTRSBpZiBubyB6b29tIGNoYW5nZXMuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gem9vbUluKCkgewotICAgICAgICAvLyBUT0RPOiBhbHRlcm5hdGl2ZWx5IHdlIGNhbiBkaXNhbGxvdyB0aGlzIGR1cmluZyBkcmF3IGhpc3RvcnkgbW9kZQotICAgICAgICBzd2l0Y2hPdXREcmF3SGlzdG9yeSgpOwotICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLSAgICAgICAgLy8gQ2VudGVyIHpvb21pbmcgdG8gdGhlIGNlbnRlciBvZiB0aGUgc2NyZWVuLgotICAgICAgICBtWm9vbUNlbnRlclggPSBnZXRWaWV3V2lkdGgoKSAqIC41ZjsKLSAgICAgICAgbVpvb21DZW50ZXJZID0gZ2V0Vmlld0hlaWdodCgpICogLjVmOwotICAgICAgICBtQW5jaG9yWCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1TY3JvbGxYKTsKLSAgICAgICAgbUFuY2hvclkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtU2Nyb2xsWSk7Ci0gICAgICAgIHJldHVybiB6b29tV2l0aFByZXZpZXcobUFjdHVhbFNjYWxlICogMS4yNWYsIHRydWUpOworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLnpvb21JbigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTk2MCwxNCArNTgwNiw3IEBACiAgICAgICogQHJldHVybiBUUlVFIGlmIHpvb20gb3V0IHN1Y2NlZWRzLiBGQUxTRSBpZiBubyB6b29tIGNoYW5nZXMuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gem9vbU91dCgpIHsKLSAgICAgICAgLy8gVE9ETzogYWx0ZXJuYXRpdmVseSB3ZSBjYW4gZGlzYWxsb3cgdGhpcyBkdXJpbmcgZHJhdyBoaXN0b3J5IG1vZGUKLSAgICAgICAgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKLSAgICAgICAgLy8gQ2VudGVyIHpvb21pbmcgdG8gdGhlIGNlbnRlciBvZiB0aGUgc2NyZWVuLgotICAgICAgICBtWm9vbUNlbnRlclggPSBnZXRWaWV3V2lkdGgoKSAqIC41ZjsKLSAgICAgICAgbVpvb21DZW50ZXJZID0gZ2V0Vmlld0hlaWdodCgpICogLjVmOwotICAgICAgICBtQW5jaG9yWCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1TY3JvbGxYKTsKLSAgICAgICAgbUFuY2hvclkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtU2Nyb2xsWSk7Ci0gICAgICAgIHJldHVybiB6b29tV2l0aFByZXZpZXcobUFjdHVhbFNjYWxlICogMC44ZiwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuem9vbU91dCgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTZWxlY3Rpb24oKSB7CkBAIC02MDY4LDcgKzU5MDcsMTQgQEAKICAgICAgICAgLy8gbUxhc3RUb3VjaFggYW5kIG1MYXN0VG91Y2hZIGFyZSB0aGUgcG9pbnQgaW4gdGhlIGN1cnJlbnQgdmlld3BvcnQKICAgICAgICAgaW50IGNvbnRlbnRYID0gdmlld1RvQ29udGVudFgoKGludCkgbUxhc3RUb3VjaFggKyBtU2Nyb2xsWCk7CiAgICAgICAgIGludCBjb250ZW50WSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIG1MYXN0VG91Y2hZICsgbVNjcm9sbFkpOwotICAgICAgICBpZiAobmF0aXZlUG9pbnRJbk5hdkNhY2hlKGNvbnRlbnRYLCBjb250ZW50WSwgbU5hdlNsb3ApKSB7CisgICAgICAgIGlmIChnZXRTZXR0aW5ncygpLnN1cHBvcnRUb3VjaE9ubHkoKSkgeworICAgICAgICAgICAgcmVtb3ZlVG91Y2hIaWdobGlnaHQoZmFsc2UpOworICAgICAgICAgICAgV2ViVmlld0NvcmUuVG91Y2hVcERhdGEgdG91Y2hVcERhdGEgPSBuZXcgV2ViVmlld0NvcmUuVG91Y2hVcERhdGEoKTsKKyAgICAgICAgICAgIC8vIHVzZSAiMCIgYXMgZ2VuZXJhdGlvbiBpZCB0byBpbmZvcm0gV2ViS2l0IHRvIHVzZSB0aGUgc2FtZSB4L3kgYXMKKyAgICAgICAgICAgIC8vIGl0IHVzZWQgd2hlbiBwcm9jZXNzaW5nIEdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMKKyAgICAgICAgICAgIHRvdWNoVXBEYXRhLm1Nb3ZlR2VuZXJhdGlvbiA9IDA7CisgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfVVAsIHRvdWNoVXBEYXRhKTsKKyAgICAgICAgfSBlbHNlIGlmIChuYXRpdmVQb2ludEluTmF2Q2FjaGUoY29udGVudFgsIGNvbnRlbnRZLCBtTmF2U2xvcCkpIHsKICAgICAgICAgICAgIFdlYlZpZXdDb3JlLk1vdGlvblVwRGF0YSBtb3Rpb25VcERhdGEgPSBuZXcgV2ViVmlld0NvcmUKICAgICAgICAgICAgICAgICAgICAgLk1vdGlvblVwRGF0YSgpOwogICAgICAgICAgICAgbW90aW9uVXBEYXRhLm1GcmFtZSA9IG5hdGl2ZUNhY2hlSGl0RnJhbWVQb2ludGVyKCk7CkBAIC02MDk2LDI3ICs1OTQyLDE2IEBACiAgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHZpZXcgKFBsdWdpbikgaXMgZnVsbHkgdmlzaWJsZSBhbmQgbWF4aW1pemVkIGluc2lkZQogICAgICAqIHRoZSBXZWJWaWV3LgogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BsdWdpbkZpdE9uU2NyZWVuKFZpZXdNYW5hZ2VyLkNoaWxkVmlldyB2aWV3KSB7Ci0gICAgICAgIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKLSAgICAgICAgaW50IHZpZXdIZWlnaHQgPSBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCk7Ci0gICAgICAgIGZsb2F0IHNjYWxlID0gTWF0aC5taW4oKGZsb2F0KSB2aWV3V2lkdGggLyB2aWV3LndpZHRoLAotICAgICAgICAgICAgICAgIChmbG9hdCkgdmlld0hlaWdodCAvIHZpZXcuaGVpZ2h0KTsKLSAgICAgICAgaWYgKHNjYWxlIDwgbU1pblpvb21TY2FsZSkgewotICAgICAgICAgICAgc2NhbGUgPSBtTWluWm9vbVNjYWxlOwotICAgICAgICB9IGVsc2UgaWYgKHNjYWxlID4gbU1heFpvb21TY2FsZSkgewotICAgICAgICAgICAgc2NhbGUgPSBtTWF4Wm9vbVNjYWxlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNYXRoLmFicyhzY2FsZSAtIG1BY3R1YWxTY2FsZSkgPCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnRUb1ZpZXdYKHZpZXcueCkgPj0gbVNjcm9sbFgKLSAgICAgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1godmlldy54ICsgdmlldy53aWR0aCkgPD0gbVNjcm9sbFgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZpZXdXaWR0aAotICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WSh2aWV3LnkpID49IG1TY3JvbGxZCi0gICAgICAgICAgICAgICAgICAgICYmIGNvbnRlbnRUb1ZpZXdZKHZpZXcueSArIHZpZXcuaGVpZ2h0KSA8PSBtU2Nyb2xsWQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmlld0hlaWdodCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBib29sZWFuIGlzUGx1Z2luRml0T25TY3JlZW4oVmlld01hbmFnZXIuQ2hpbGRWaWV3IHZpZXcpIHsKKyAgICAgICAgZmluYWwgaW50IHZpZXdXaWR0aCA9IGdldFZpZXdXaWR0aCgpOworICAgICAgICBmaW5hbCBpbnQgdmlld0hlaWdodCA9IGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKTsKKyAgICAgICAgZmxvYXQgc2NhbGUgPSBNYXRoLm1pbigoZmxvYXQpIHZpZXdXaWR0aCAvIHZpZXcud2lkdGgsIChmbG9hdCkgdmlld0hlaWdodCAvIHZpZXcuaGVpZ2h0KTsKKyAgICAgICAgc2NhbGUgPSBtWm9vbU1hbmFnZXIuY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhzY2FsZSk7CisgICAgICAgIHJldHVybiAhbVpvb21NYW5hZ2VyLndpbGxTY2FsZVRyaWdnZXJab29tKHNjYWxlKQorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRUb1ZpZXdYKHZpZXcueCkgPj0gbVNjcm9sbFgKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WCh2aWV3LnggKyB2aWV3LndpZHRoKSA8PSBtU2Nyb2xsWCArIHZpZXdXaWR0aAorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRUb1ZpZXdZKHZpZXcueSkgPj0gbVNjcm9sbFkKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WSh2aWV3LnkgKyB2aWV3LmhlaWdodCkgPD0gbVNjcm9sbFkgKyB2aWV3SGVpZ2h0OwogICAgIH0KIAogICAgIC8qCkBAIC02MTI1LDIyICs1OTYwLDE5IEBACiAgICAgICogYW5pbWF0ZWQgc2Nyb2xsIHRvIGNlbnRlciBpdC4gSWYgdGhlIHpvb20gbmVlZHMgdG8gYmUgY2hhbmdlZCwgZmluZCB0aGUKICAgICAgKiB6b29tIGNlbnRlciBhbmQgZG8gYSBzbW9vdGggem9vbSB0cmFuc2l0aW9uLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjZW50ZXJGaXRSZWN0KGludCBkb2NYLCBpbnQgZG9jWSwgaW50IGRvY1dpZHRoLCBpbnQgZG9jSGVpZ2h0KSB7CisgICAgdm9pZCBjZW50ZXJGaXRSZWN0KGludCBkb2NYLCBpbnQgZG9jWSwgaW50IGRvY1dpZHRoLCBpbnQgZG9jSGVpZ2h0KSB7CiAgICAgICAgIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKICAgICAgICAgaW50IHZpZXdIZWlnaHQgPSBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCk7CiAgICAgICAgIGZsb2F0IHNjYWxlID0gTWF0aC5taW4oKGZsb2F0KSB2aWV3V2lkdGggLyBkb2NXaWR0aCwgKGZsb2F0KSB2aWV3SGVpZ2h0CiAgICAgICAgICAgICAgICAgLyBkb2NIZWlnaHQpOwotICAgICAgICBpZiAoc2NhbGUgPCBtTWluWm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1NaW5ab29tU2NhbGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2NhbGUgPiBtTWF4Wm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1NYXhab29tU2NhbGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE1hdGguYWJzKHNjYWxlIC0gbUFjdHVhbFNjYWxlKSA8IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7CisgICAgICAgIHNjYWxlID0gbVpvb21NYW5hZ2VyLmNvbXB1dGVTY2FsZVdpdGhMaW1pdHMoc2NhbGUpOworICAgICAgICBpZiAoIW1ab29tTWFuYWdlci53aWxsU2NhbGVUcmlnZ2VyWm9vbShzY2FsZSkpIHsKICAgICAgICAgICAgIHBpblNjcm9sbFRvKGNvbnRlbnRUb1ZpZXdYKGRvY1ggKyBkb2NXaWR0aCAvIDIpIC0gdmlld1dpZHRoIC8gMiwKICAgICAgICAgICAgICAgICAgICAgY29udGVudFRvVmlld1koZG9jWSArIGRvY0hlaWdodCAvIDIpIC0gdmlld0hlaWdodCAvIDIsCiAgICAgICAgICAgICAgICAgICAgIHRydWUsIDApOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmxvYXQgb2xkU2NyZWVuWCA9IGRvY1ggKiBtQWN0dWFsU2NhbGUgLSBtU2Nyb2xsWDsKKyAgICAgICAgICAgIGZsb2F0IGFjdHVhbFNjYWxlID0gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCk7CisgICAgICAgICAgICBmbG9hdCBvbGRTY3JlZW5YID0gZG9jWCAqIGFjdHVhbFNjYWxlIC0gbVNjcm9sbFg7CiAgICAgICAgICAgICBmbG9hdCByZWN0Vmlld1ggPSBkb2NYICogc2NhbGU7CiAgICAgICAgICAgICBmbG9hdCByZWN0Vmlld1dpZHRoID0gZG9jV2lkdGggKiBzY2FsZTsKICAgICAgICAgICAgIGZsb2F0IG5ld01heFdpZHRoID0gbUNvbnRlbnRXaWR0aCAqIHNjYWxlOwpAQCAtNjE1MSw5ICs1OTgzLDkgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U2NyZWVuWCA+IChuZXdNYXhXaWR0aCAtIHJlY3RWaWV3WCAtIHJlY3RWaWV3V2lkdGgpKSB7CiAgICAgICAgICAgICAgICAgbmV3U2NyZWVuWCA9IHZpZXdXaWR0aCAtIChuZXdNYXhXaWR0aCAtIHJlY3RWaWV3WCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtWm9vbUNlbnRlclggPSAob2xkU2NyZWVuWCAqIHNjYWxlIC0gbmV3U2NyZWVuWCAqIG1BY3R1YWxTY2FsZSkKLSAgICAgICAgICAgICAgICAgICAgLyAoc2NhbGUgLSBtQWN0dWFsU2NhbGUpOwotICAgICAgICAgICAgZmxvYXQgb2xkU2NyZWVuWSA9IGRvY1kgKiBtQWN0dWFsU2NhbGUgKyBnZXRUaXRsZUhlaWdodCgpCisgICAgICAgICAgICBmbG9hdCB6b29tQ2VudGVyWCA9IChvbGRTY3JlZW5YICogc2NhbGUgLSBuZXdTY3JlZW5YICogYWN0dWFsU2NhbGUpCisgICAgICAgICAgICAgICAgICAgIC8gKHNjYWxlIC0gYWN0dWFsU2NhbGUpOworICAgICAgICAgICAgZmxvYXQgb2xkU2NyZWVuWSA9IGRvY1kgKiBhY3R1YWxTY2FsZSArIGdldFRpdGxlSGVpZ2h0KCkKICAgICAgICAgICAgICAgICAgICAgLSBtU2Nyb2xsWTsKICAgICAgICAgICAgIGZsb2F0IHJlY3RWaWV3WSA9IGRvY1kgKiBzY2FsZSArIGdldFRpdGxlSGVpZ2h0KCk7CiAgICAgICAgICAgICBmbG9hdCByZWN0Vmlld0hlaWdodCA9IGRvY0hlaWdodCAqIHNjYWxlOwpAQCAtNjE2NSwxMDkgKzU5OTcsMTAgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U2NyZWVuWSA+IChuZXdNYXhIZWlnaHQgLSByZWN0Vmlld1kgLSByZWN0Vmlld0hlaWdodCkpIHsKICAgICAgICAgICAgICAgICBuZXdTY3JlZW5ZID0gdmlld0hlaWdodCAtIChuZXdNYXhIZWlnaHQgLSByZWN0Vmlld1kpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbVpvb21DZW50ZXJZID0gKG9sZFNjcmVlblkgKiBzY2FsZSAtIG5ld1NjcmVlblkgKiBtQWN0dWFsU2NhbGUpCi0gICAgICAgICAgICAgICAgICAgIC8gKHNjYWxlIC0gbUFjdHVhbFNjYWxlKTsKLSAgICAgICAgICAgIHpvb21XaXRoUHJldmlldyhzY2FsZSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBkaXNtaXNzWm9vbUNvbnRyb2woKSB7Ci0gICAgICAgIGlmIChtV2ViVmlld0NvcmUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gbWF5YmUgY2FsbGVkIGFmdGVyIFdlYlZpZXcncyBkZXN0cm95KCkuIEFzIHdlIGNhbid0IGdldCBzZXR0aW5ncywKLSAgICAgICAgICAgIC8vIGp1c3QgaGlkZSB6b29tIGNvbnRyb2wgZm9yIGJvdGggc3R5bGVzLgotICAgICAgICAgICAgaWYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVpvb21Db250cm9scyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVpvb21Db250cm9scy5oaWRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpOwotICAgICAgICBpZiAoc2V0dGluZ3MuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7Ci0gICAgICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtWm9vbUNvbnRyb2xSdW5uYWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVpvb21Db250cm9scyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVpvb21Db250cm9scy5oaWRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSdWxlIGZvciBkb3VibGUgdGFwOgotICAgIC8vIDEuIGlmIHRoZSBjdXJyZW50IHNjYWxlIGlzIG5vdCBzYW1lIGFzIHRoZSB0ZXh0IHdyYXAgc2NhbGUgYW5kIGxheW91dAotICAgIC8vICAgIGFsZ29yaXRobSBpcyBOQVJST1dfQ09MVU1OUywgZml0IHRvIGNvbHVtbjsKLSAgICAvLyAyLiBpZiB0aGUgY3VycmVudCBzdGF0ZSBpcyBub3Qgb3ZlcnZpZXcgbW9kZSwgY2hhbmdlIHRvIG92ZXJ2aWV3IG1vZGU7Ci0gICAgLy8gMy4gaWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgb3ZlcnZpZXcgbW9kZSwgY2hhbmdlIHRvIGRlZmF1bHQgc2NhbGUuCi0gICAgcHJpdmF0ZSB2b2lkIGRvRG91YmxlVGFwKCkgewotICAgICAgICBpZiAobVdlYlZpZXdDb3JlLmdldFNldHRpbmdzKCkuZ2V0VXNlV2lkZVZpZXdQb3J0KCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtWm9vbUNlbnRlclggPSBtTGFzdFRvdWNoWDsKLSAgICAgICAgbVpvb21DZW50ZXJZID0gbUxhc3RUb3VjaFk7Ci0gICAgICAgIG1BbmNob3JYID0gdmlld1RvQ29udGVudFgoKGludCkgbVpvb21DZW50ZXJYICsgbVNjcm9sbFgpOwotICAgICAgICBtQW5jaG9yWSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIG1ab29tQ2VudGVyWSArIG1TY3JvbGxZKTsKLSAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpOwotICAgICAgICBzZXR0aW5ncy5zZXREb3VibGVUYXBUb2FzdENvdW50KDApOwotICAgICAgICAvLyByZW1vdmUgdGhlIHpvb20gY29udHJvbCBhZnRlciBkb3VibGUgdGFwCi0gICAgICAgIGRpc21pc3Nab29tQ29udHJvbCgpOwotICAgICAgICBWaWV3TWFuYWdlci5DaGlsZFZpZXcgcGx1Z2luID0gbVZpZXdNYW5hZ2VyLmhpdFRlc3QobUFuY2hvclgsIG1BbmNob3JZKTsKLSAgICAgICAgaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoaXNQbHVnaW5GaXRPblNjcmVlbihwbHVnaW4pKSB7Ci0gICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBGb3JjZSB0aGUgdGl0bGViYXIgZnVsbHkgcmV2ZWFsIGluIG92ZXJ2aWV3IG1vZGUKLSAgICAgICAgICAgICAgICBpZiAobVNjcm9sbFkgPCBnZXRUaXRsZUhlaWdodCgpKSBtU2Nyb2xsWSA9IDA7Ci0gICAgICAgICAgICAgICAgem9vbVdpdGhQcmV2aWV3KChmbG9hdCkgZ2V0Vmlld1dpZHRoKCkgLyBtWm9vbU92ZXJ2aWV3V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgY2VudGVyRml0UmVjdChwbHVnaW4ueCwgcGx1Z2luLnksIHBsdWdpbi53aWR0aCwgcGx1Z2luLmhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiB6b29tVG9EZWZhdWx0ID0gZmFsc2U7Ci0gICAgICAgIGlmICgoc2V0dGluZ3MuZ2V0TGF5b3V0QWxnb3JpdGhtKCkgPT0gV2ViU2V0dGluZ3MuTGF5b3V0QWxnb3JpdGhtLk5BUlJPV19DT0xVTU5TKQotICAgICAgICAgICAgICAgICYmIChNYXRoLmFicyhtQWN0dWFsU2NhbGUgLSBtVGV4dFdyYXBTY2FsZSkgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpKSB7Ci0gICAgICAgICAgICBzZXROZXdab29tU2NhbGUobUFjdHVhbFNjYWxlLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgICAgIGZsb2F0IG92ZXJ2aWV3U2NhbGUgPSAoZmxvYXQpIGdldFZpZXdXaWR0aCgpIC8gbVpvb21PdmVydmlld1dpZHRoOwotICAgICAgICAgICAgaWYgKE1hdGguYWJzKG1BY3R1YWxTY2FsZSAtIG92ZXJ2aWV3U2NhbGUpIDwgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFtSW5ab29tT3ZlcnZpZXcpIHsKLSAgICAgICAgICAgIGZsb2F0IG5ld1NjYWxlID0gKGZsb2F0KSBnZXRWaWV3V2lkdGgoKSAvIG1ab29tT3ZlcnZpZXdXaWR0aDsKLSAgICAgICAgICAgIGlmIChNYXRoLmFicyhtQWN0dWFsU2NhbGUgLSBuZXdTY2FsZSkgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vIEZvcmNlIHRoZSB0aXRsZWJhciBmdWxseSByZXZlYWwgaW4gb3ZlcnZpZXcgbW9kZQotICAgICAgICAgICAgICAgIGlmIChtU2Nyb2xsWSA8IGdldFRpdGxlSGVpZ2h0KCkpIG1TY3JvbGxZID0gMDsKLSAgICAgICAgICAgICAgICB6b29tV2l0aFByZXZpZXcobmV3U2NhbGUsIHRydWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChNYXRoLmFicyhtQWN0dWFsU2NhbGUgLSBtRGVmYXVsdFNjYWxlKSA+PSBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgewotICAgICAgICAgICAgICAgIHpvb21Ub0RlZmF1bHQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgem9vbVRvRGVmYXVsdCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHpvb21Ub0RlZmF1bHQpIHsKLSAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotICAgICAgICAgICAgaW50IGxlZnQgPSBuYXRpdmVHZXRCbG9ja0xlZnRFZGdlKG1BbmNob3JYLCBtQW5jaG9yWSwgbUFjdHVhbFNjYWxlKTsKLSAgICAgICAgICAgIGlmIChsZWZ0ICE9IE5PX0xFRlRFREdFKSB7Ci0gICAgICAgICAgICAgICAgLy8gYWRkIGEgNXB0IHBhZGRpbmcgdG8gdGhlIGxlZnQgZWRnZS4KLSAgICAgICAgICAgICAgICBpbnQgdmlld0xlZnQgPSBjb250ZW50VG9WaWV3WChsZWZ0IDwgNSA/IDAgOiAobGVmdCAtIDUpKQotICAgICAgICAgICAgICAgICAgICAgICAgLSBtU2Nyb2xsWDsKLSAgICAgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgdGhlIHpvb20gY2VudGVyIHNvIHRoYXQgdGhlIG5ldyBzY3JvbGwgeCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgLy8gb24gdGhlIGxlZnQgZWRnZS4KLSAgICAgICAgICAgICAgICBpZiAodmlld0xlZnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IHZpZXdMZWZ0ICogbURlZmF1bHRTY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKG1EZWZhdWx0U2NhbGUgLSBtQWN0dWFsU2NhbGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjcm9sbEJ5KHZpZXdMZWZ0LCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB6b29tV2l0aFByZXZpZXcobURlZmF1bHRTY2FsZSwgdHJ1ZSk7CisgICAgICAgICAgICBmbG9hdCB6b29tQ2VudGVyWSA9IChvbGRTY3JlZW5ZICogc2NhbGUgLSBuZXdTY3JlZW5ZICogYWN0dWFsU2NhbGUpCisgICAgICAgICAgICAgICAgICAgIC8gKHNjYWxlIC0gYWN0dWFsU2NhbGUpOworICAgICAgICAgICAgbVpvb21NYW5hZ2VyLnNldFpvb21DZW50ZXIoem9vbUNlbnRlclgsIHpvb21DZW50ZXJZKTsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5zdGFydFpvb21BbmltYXRpb24oc2NhbGUsIGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjI3OSw2ICs2MDEyLDkgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RGb2N1cyhpbnQgZGlyZWN0aW9uLCBSZWN0IHByZXZpb3VzbHlGb2N1c2VkUmVjdCkgeworICAgICAgICAvLyBGSVhNRTogSWYgYSBzdWJ3aW5kb3cgaXMgc2hvd2luZyBmaW5kLCBhbmQgdGhlIHVzZXIgdG91Y2hlcyB0aGUKKyAgICAgICAgLy8gYmFja2dyb3VuZCB3aW5kb3csIGl0IGNhbiBzdGVhbCBmb2N1cy4KKyAgICAgICAgaWYgKG1GaW5kSXNVcCkgcmV0dXJuIGZhbHNlOwogICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwogICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpKSB7CiAgICAgICAgICAgICByZXN1bHQgPSBtV2ViVGV4dFZpZXcucmVxdWVzdEZvY3VzKGRpcmVjdGlvbiwKQEAgLTYzNjYsNiArNjEwMiwxMiBAQAogICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RDaGlsZFJlY3RhbmdsZU9uU2NyZWVuKFZpZXcgY2hpbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdCByZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW1tZWRpYXRlKSB7CisgICAgICAgIC8vIGRvbid0IHNjcm9sbCB3aGlsZSBpbiB6b29tIGFuaW1hdGlvbi4gV2hlbiBpdCBpcyBkb25lLCB3ZSB3aWxsIGFkanVzdAorICAgICAgICAvLyB0aGUgbmVjZXNzYXJ5IGNvbXBvbmVudHMgKGUuZy4sIFdlYlRleHRWaWV3IGlmIGl0IGlzIGluIGVkaXRpbmcgbW9kZSkKKyAgICAgICAgaWYgKG1ab29tTWFuYWdlci5pc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKwogICAgICAgICByZWN0Lm9mZnNldChjaGlsZC5nZXRMZWZ0KCkgLSBjaGlsZC5nZXRTY3JvbGxYKCksCiAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0VG9wKCkgLSBjaGlsZC5nZXRTY3JvbGxZKCkpOwogCkBAIC02NTA4LDcgKzYyNTAsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIFNXSVRDSF9UT19TSE9SVFBSRVNTOiB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX0lOSVRfTU9ERSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QcmV2ZW50RGVmYXVsdCAhPSBQUkVWRU5UX0RFRkFVTFRfWUVTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1QcmV2ZW50RGVmYXVsdCAhPSBQUkVWRU5UX0RFRkFVTFRfWUVTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX1NIT1JUUFJFU1NfU1RBUlRfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTZWxlY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC02NTIyLDYgKzYyNjUsOSBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBTV0lUQ0hfVE9fTE9OR1BSRVNTOiB7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRTZXR0aW5ncygpLnN1cHBvcnRUb3VjaE9ubHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVG91Y2hIaWdobGlnaHQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChpbkZ1bGxTY3JlZW5Nb2RlKCkgfHwgbURlZmVyVG91Y2hQcm9jZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBUb3VjaEV2ZW50RGF0YSB0ZWQgPSBuZXcgVG91Y2hFdmVudERhdGEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tQWN0aW9uID0gV2ViVmlld0NvcmUuQUNUSU9OX0xPTkdQUkVTUzsKQEAgLTY1MzMsMTUgKzYyNzksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbXBsaWNpdHkgZm9yIG5vdywgd2UgZG9uJ3Qgc2V0IGl0LgogICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1NZXRhU3RhdGUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1SZXByb2Nlc3MgPSBtRGVmZXJUb3VjaFByb2Nlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobURlZmVyVG91Y2hQcm9jZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WCA9IG1MYXN0VG91Y2hYOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1kgPSBtTGFzdFRvdWNoWTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9FVkVOVCwgdGVkKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJldmVudERlZmF1bHQgIT0gUFJFVkVOVF9ERUZBVUxUX1lFUykgewogICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0RPTkVfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1Mb25nQ2xpY2soKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYnVpbGRXZWJUZXh0VmlldygpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTY1NzQsNzAgKzYzMTUsMzYgQEAKICAgICAgICAgICAgICAgICAgICAgc3Bhd25Db250ZW50U2Nyb2xsVG8obXNnLmFyZzEsIG1zZy5hcmcyKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfWk9PTV9SQU5HRTogewotICAgICAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5SZXN0b3JlU3RhdGUgcmVzdG9yZVN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoV2ViVmlld0NvcmUuUmVzdG9yZVN0YXRlKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5WaWV3U3RhdGUgdmlld1N0YXRlID0gKFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSkgbXNnLm9iajsKICAgICAgICAgICAgICAgICAgICAgLy8gbVNjcm9sbFggY29udGFpbnMgdGhlIG5ldyBtaW5QcmVmV2lkdGgKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlWm9vbVJhbmdlKHJlc3RvcmVTdGF0ZSwgZ2V0Vmlld1dpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZVN0YXRlLm1TY3JvbGxYLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci51cGRhdGVab29tUmFuZ2Uodmlld1N0YXRlLCBnZXRWaWV3V2lkdGgoKSwgdmlld1N0YXRlLm1TY3JvbGxYKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgUkVQTEFDRV9CQVNFX0NPTlRFTlQ6IHsKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlUmVwbGFjZUJhc2VDb250ZW50KG1zZy5hcmcxKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgTkVXX1BJQ1RVUkVfTVNHX0lEOiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlJ3ZlIHByZXZpb3VzbHkgZGVsYXllZCBkZWxldGluZyBhIHJvb3QKLSAgICAgICAgICAgICAgICAgICAgLy8gbGF5ZXIsIGRvIGl0IG5vdy4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWxheWVkRGVsZXRlUm9vdExheWVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGVsYXllZERlbGV0ZVJvb3RMYXllciA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlU2V0Um9vdExheWVyKDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gbVdlYlZpZXdDb3JlLmdldFNldHRpbmdzKCk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlZCBmb3IgbmV3IGNvbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHZpZXdXaWR0aCA9IGdldFZpZXdXaWR0aCgpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBXZWJWaWV3Q29yZS5EcmF3RGF0YSBkcmF3ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2ViVmlld0NvcmUuRHJhd0RhdGEpIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFdlYlZpZXdDb3JlLkRyYXdEYXRhIGRyYXcgPSAoV2ViVmlld0NvcmUuRHJhd0RhdGEpIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNldEJhc2VMYXllcihkcmF3Lm1CYXNlTGF5ZXIpOwogICAgICAgICAgICAgICAgICAgICBmaW5hbCBQb2ludCB2aWV3U2l6ZSA9IGRyYXcubVZpZXdQb2ludDsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VXaWRlVmlld3BvcnQgPSBzZXR0aW5ncy5nZXRVc2VXaWRlVmlld1BvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuUmVzdG9yZVN0YXRlIHJlc3RvcmVTdGF0ZSA9IGRyYXcubVJlc3RvcmVTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNSZXN0b3JlU3RhdGUgPSByZXN0b3JlU3RhdGUgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1Jlc3RvcmVTdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlWm9vbVJhbmdlKHJlc3RvcmVTdGF0ZSwgdmlld1NpemUueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy5tTWluUHJlZldpZHRoLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIHZpZXdTdGF0ZSA9IGRyYXcubVZpZXdTdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1BpY3R1cmVBZnRlckZpcnN0TGF5b3V0ID0gdmlld1N0YXRlICE9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1BpY3R1cmVBZnRlckZpcnN0TGF5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgbGFzdCBzZW50IGRhdGEgaGVyZSBzaW5jZSBkZWFsaW5nIHdpdGggbmV3IHBhZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFdpZHRoU2VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtWm9vbU1hbmFnZXIub25GaXJzdExheW91dChkcmF3KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbURyYXdIaXN0b3J5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUluaXRpYWxTY2FsZUluUGVyY2VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgLyAxMDAuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbFNjYWxlSW5QZXJjZW50ICE9IG1UZXh0V3JhcFNjYWxlICogMTAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdG9yZVN0YXRlLm1WaWV3U2NhbGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gcmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXROZXdab29tU2NhbGUocmVzdG9yZVN0YXRlLm1WaWV3U2NhbGUsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IHVzZVdpZGVWaWV3cG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2V0dGluZ3MuZ2V0TG9hZFdpdGhPdmVydmlld01vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSW5ab29tT3ZlcnZpZXcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gKGZsb2F0KSB2aWV3V2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIERFRkFVTFRfVklFV1BPUlRfV0lEVEg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IHJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXROZXdab29tU2NhbGUoc2NhbGUsIE1hdGguYWJzKHNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1UZXh0V3JhcFNjYWxlKSA+PSBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudFNjcm9sbFRvKHJlc3RvcmVTdGF0ZS5tU2Nyb2xsWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZVN0YXRlLm1TY3JvbGxZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb250ZW50U2Nyb2xsVG8odmlld1N0YXRlLm1TY3JvbGxYLCB2aWV3U3RhdGUubVNjcm9sbFkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzIHdlIGFyZSBvbiBhIG5ldyBwYWdlLCByZW1vdmUgdGhlIFdlYlRleHRWaWV3LiBUaGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbmVjZXNzYXJ5IGZvciBwYWdlIGxvYWRzIGRyaXZlbiBieSB3ZWJraXQsIGFuZCBpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcnRpY3VsYXIgd2hlbiB0aGUgdXNlciB3YXMgb24gYSBwYXNzd29yZCBmaWVsZCwgc28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgV2ViVGV4dFZpZXcgd2FzIHZpc2libGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgem9vbSBidXR0b25zIGFzIHRoZSBzY2FsZSBjYW4gYmUgY2hhbmdlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRTZXR0aW5ncygpLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVab29tQnV0dG9uc0VuYWJsZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHVwZGF0ZSB0aGUgbGF5b3V0IChpLmUuIHJlcXVlc3QgYSBsYXlvdXQgZnJvbSB0aGUKICAgICAgICAgICAgICAgICAgICAgLy8gdmlldyBzeXN0ZW0pIGlmIHRoZSBsYXN0IHZpZXcgc2l6ZSB0aGF0IHdlIHNlbnQgdG8KICAgICAgICAgICAgICAgICAgICAgLy8gV2ViQ29yZSBtYXRjaGVzIHRoZSB2aWV3IHNpemUgb2YgdGhlIHBpY3R1cmUgd2UganVzdApAQCAtNjY0NSw0NSArNjM1MiwyNSBAQAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHVwZGF0ZUxheW91dCA9IHZpZXdTaXplLnggPT0gbUxhc3RXaWR0aFNlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB2aWV3U2l6ZS55ID09IG1MYXN0SGVpZ2h0U2VudDsKICAgICAgICAgICAgICAgICAgICAgcmVjb3JkTmV3Q29udGVudFNpemUoZHJhdy5tV2lkdGhIZWlnaHQueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Lm1XaWR0aEhlaWdodC55Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAobUZpbmRJc1VwID8gbUZpbmRIZWlnaHQgOiAwKSwgdXBkYXRlTGF5b3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Lm1XaWR0aEhlaWdodC55LCB1cGRhdGVMYXlvdXQpOwogICAgICAgICAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgewogICAgICAgICAgICAgICAgICAgICAgICAgUmVjdCBiID0gZHJhdy5tSW52YWxSZWdpb24uZ2V0Qm91bmRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJORVdfUElDVFVSRV9NU0dfSUQgeyIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmxlZnQrIiwiK2IudG9wKyIsIitiLnJpZ2h0KyIsIitiLmJvdHRvbSsifSIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVDb250ZW50UmVjdChkcmF3Lm1JbnZhbFJlZ2lvbi5nZXRCb3VuZHMoKSk7CisKICAgICAgICAgICAgICAgICAgICAgaWYgKG1QaWN0dXJlTGlzdGVuZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVBpY3R1cmVMaXN0ZW5lci5vbk5ld1BpY3R1cmUoV2ViVmlldy50aGlzLCBjYXB0dXJlUGljdHVyZSgpKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodXNlV2lkZVZpZXdwb3J0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW1pdCBtWm9vbU92ZXJ2aWV3V2lkdGggdXBwZXIgYm91bmQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNNYXhWaWV3cG9ydFdpZHRoIHNvIHRoYXQgaWYgdGhlIHBhZ2UgZG9lc24ndCBiZWhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlbGwsIHRoZSBXZWJWaWV3IHdvbid0IGdvIGluc2FuZS4gbGltaXQgdGhlIGxvd2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBib3VuZCB0byBtYXRjaCB0aGUgZGVmYXVsdCBzY2FsZSBmb3IgbW9iaWxlIHNpdGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21PdmVydmlld1dpZHRoID0gTWF0aC5taW4oc01heFZpZXdwb3J0V2lkdGgsIE1hdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heCgoaW50KSAodmlld1dpZHRoIC8gbURlZmF1bHRTY2FsZSksIE1hdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4KGRyYXcubU1pblByZWZXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXcubVZpZXdQb2ludC54KSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbU1pblpvb21TY2FsZUZpeGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gKGZsb2F0KSB2aWV3V2lkdGggLyBtWm9vbU92ZXJ2aWV3V2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtRHJhd0hpc3RvcnkgJiYgbUluWm9vbU92ZXJ2aWV3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXQgdGhlIGNvbnRlbnQgd2lkdGggdG8gdGhlIGN1cnJlbnQgdmlldy4gSWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcm91bmRpbmcgZXJyb3IgY2FzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicygodmlld1dpZHRoICogbUludkFjdHVhbFNjYWxlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1ab29tT3ZlcnZpZXdXaWR0aCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKChmbG9hdCkgdmlld1dpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIG1ab29tT3ZlcnZpZXdXaWR0aCwgTWF0aC5hYnMobUFjdHVhbFNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1UZXh0V3JhcFNjYWxlKSA8IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB6b29tIGluZm9ybWF0aW9uIGJhc2VkIG9uIHRoZSBuZXcgcGljdHVyZQorICAgICAgICAgICAgICAgICAgICBtWm9vbU1hbmFnZXIub25OZXdQaWN0dXJlKGRyYXcpOworCiAgICAgICAgICAgICAgICAgICAgIGlmIChkcmF3Lm1Gb2N1c1NpemVDaGFuZ2VkICYmIGluRWRpdGluZ01vZGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUZvY3VzU2l6ZUNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZXN0b3JlU3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGljdHVyZUFmdGVyRmlyc3RMYXlvdXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3TWFuYWdlci5wb3N0UmVhZHlUb0RyYXdBbGwoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTY3MTcsMTQgKzY0MDQsOCBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFJFUVVFU1RfS0VZQk9BUkRfV0lUSF9TRUxFQ1RJT05fTVNHX0lEOgogICAgICAgICAgICAgICAgICAgICBkaXNwbGF5U29mdEtleWJvYXJkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVUZXh0U2VsZWN0aW9uRnJvbU1lc3NhZ2UobXNnLmFyZzEsIG1zZy5hcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXZWJWaWV3Q29yZS5UZXh0U2VsZWN0aW9uRGF0YSkgbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gVVBEQVRFX1RFWFRfU0VMRUNUSU9OX01TR19JRAogICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX1RFWFRfU0VMRUNUSU9OX01TR19JRDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm8gdGV4dGZpZWxkIHdhcyBpbiBmb2N1cywgYW5kIHRoZSB1c2VyIHRvdWNoZWQgb25lLAotICAgICAgICAgICAgICAgICAgICAvLyBjYXVzaW5nIGl0IHRvIHNlbmQgdGhpcyBtZXNzYWdlLCB0aGVuIFdlYlRleHRWaWV3IGhhcyBub3QKLSAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBzZXQgdXAgeWV0LiAgUmVidWlsZCBpdCBzbyBpdCBjYW4gc2V0IGl0cyBzZWxlY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgIHJlYnVpbGRXZWJUZXh0VmlldygpOwogICAgICAgICAgICAgICAgICAgICB1cGRhdGVUZXh0U2VsZWN0aW9uRnJvbU1lc3NhZ2UobXNnLmFyZzEsIG1zZy5hcmcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXZWJWaWV3Q29yZS5UZXh0U2VsZWN0aW9uRGF0YSkgbXNnLm9iaik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjc0Miw3ICs2NDIzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1PVkVfT1VUX09GX1BMVUdJTjoKKyAgICAgICAgICAgICAgICBjYXNlIFVOSEFORExFRF9OQVZfS0VZOgogICAgICAgICAgICAgICAgICAgICBuYXZIYW5kbGVkS2V5KG1zZy5hcmcxLCAxLCBmYWxzZSwgMCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX1RFWFRfRU5UUllfTVNHX0lEOgpAQCAtNjc1NCw3ICs2NDM1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIENMRUFSX1RFWFRfRU5UUlk6Ci0gICAgICAgICAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBJTlZBTF9SRUNUX01TR19JRDogewogICAgICAgICAgICAgICAgICAgICBSZWN0IHIgPSAoUmVjdCltc2cub2JqOwpAQCAtNjc2NywyMyArNjQ0OCw2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgSU1NRURJQVRFX1JFUEFJTlRfTVNHX0lEOiB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgU0VUX1JPT1RfTEFZRVJfTVNHX0lEOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgwID09IG1zZy5hcmcxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOdWxsIGluZGljYXRlcyBkZWxldGluZyB0aGUgb2xkIGxheWVyLCBidXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGFjdHVhbGx5IGRvIHNvIHVudGlsIHdlJ3ZlIGdvdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBwYWdlIHRvIGRpc3BsYXkuCi0gICAgICAgICAgICAgICAgICAgICAgICBtRGVsYXllZERlbGV0ZVJvb3RMYXllciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGVsYXllZERlbGV0ZVJvb3RMYXllciA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlU2V0Um9vdExheWVyKG1zZy5hcmcxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBSRVFVRVNUX0ZPUk1fREFUQToKICAgICAgICAgICAgICAgICAgICAgQXV0b0NvbXBsZXRlQWRhcHRlciBhZGFwdGVyID0gKEF1dG9Db21wbGV0ZUFkYXB0ZXIpIG1zZy5vYmo7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtV2ViVGV4dFZpZXcuaXNTYW1lVGV4dEZpZWxkKG1zZy5hcmcxKSkgewpAQCAtNjgyNyw0MyArNjQ5MSw0NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2ZW50RGVmYXVsdCA9IG1zZy5hcmcyID09IDEgPyBQUkVWRU5UX0RFRkFVTFRfWUVTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFBSRVZFTlRfREVGQVVMVF9OTzsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUHJldmVudERlZmF1bHQgPT0gUFJFVkVOVF9ERUZBVUxUX1lFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFJlZ2lvbi5zZXRFbXB0eSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1zZy5hcmcyID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgZGVmYXVsdCBpcyBub3QgY2FsbGVkIGluIFdlYkNvcmUsIHNvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBuZWVkcyB0byBiZSByZXByb2Nlc3NlZCBpbiBVSQogICAgICAgICAgICAgICAgICAgICAgICAgVG91Y2hFdmVudERhdGEgdGVkID0gKFRvdWNoRXZlbnREYXRhKSBtc2cub2JqOwogICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0ZWQubUFjdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFggPSB0ZWQubVZpZXdYOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hZID0gdGVkLm1WaWV3WTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWCA9IGNvbnRlbnRUb1ZpZXdYKHRlZC5tWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1TY3JvbGxYOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hZID0gY29udGVudFRvVmlld1kodGVkLm1ZKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoTW9kZSA9IFRPVUNIX0lOSVRfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzbmFwcGluZyBpbiBkZWZlciBwcm9jZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4ID0gY29udGVudFRvVmlld1godGVkLm1YKSAtIG1TY3JvbGxYOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSA9IGNvbnRlbnRUb1ZpZXdZKHRlZC5tWSkgLSBtU2Nyb2xsWTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWZlclRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX01PREUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoTW9kZSA9IFRPVUNIX0RSQUdfTU9ERTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFggPSB0ZWQubVZpZXdYOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWSA9IHRlZC5tVmlld1k7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hYID0geDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFkgPSB5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREcmFnKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhWCA9IHBpbkxvY1goKGludCkgKG1TY3JvbGxYCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtTGFzdERlZmVyVG91Y2hYIC0gdGVkLm1WaWV3WCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtTGFzdERlZmVyVG91Y2hYIC0geCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtU2Nyb2xsWDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhWSA9IHBpbkxvY1koKGludCkgKG1TY3JvbGxZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtTGFzdERlZmVyVG91Y2hZIC0gdGVkLm1WaWV3WSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtTGFzdERlZmVyVG91Y2hZIC0geSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtU2Nyb2xsWTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9EcmFnKGRlbHRhWCwgZGVsdGFZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhWCAhPSAwKSBtTGFzdERlZmVyVG91Y2hYID0gdGVkLm1WaWV3WDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhWSAhPSAwKSBtTGFzdERlZmVyVG91Y2hZID0gdGVkLm1WaWV3WTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhWCAhPSAwKSBtTGFzdERlZmVyVG91Y2hYID0geDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhWSAhPSAwKSBtTGFzdERlZmVyVG91Y2hZID0geTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWZlclRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX01PREUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGZsaW5nIGluIGRlZmVyIHByb2Nlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TY3JvbGxlci5zcHJpbmdiYWNrKG1TY3JvbGxYLCBtU2Nyb2xsWSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZU1heFNjcm9sbFgoKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZU1heFNjcm9sbFkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVQcmlvcml0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC02ODcxLDkgKzY1MzgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdlYlZpZXdDb3JlLkFDVElPTl9ET1VCTEVUQVA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvRG91YmxlVGFwKCkgbmVlZHMgbUxhc3RUb3VjaFgvWSBhcyBhbmNob3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFggPSB0ZWQubVZpZXdYOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IHRlZC5tVmlld1k7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRG91YmxlVGFwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hYID0gY29udGVudFRvVmlld1godGVkLm1YKSAtIG1TY3JvbGxYOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IGNvbnRlbnRUb1ZpZXdZKHRlZC5tWSkgLSBtU2Nyb2xsWTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmhhbmRsZURvdWJsZVRhcChtTGFzdFRvdWNoWCwgbUxhc3RUb3VjaFkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJUb3VjaE1vZGUgPSBUT1VDSF9ET05FX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2ViVmlld0NvcmUuQUNUSU9OX0xPTkdQUkVTUzoKQEAgLTY4ODEsNyArNjU0OCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaXRUZXN0ICE9IG51bGwgJiYgaGl0VGVzdC5tVHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IEhpdFRlc3RSZXN1bHQuVU5LTk9XTl9UWVBFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtTG9uZ0NsaWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkV2ViVGV4dFZpZXcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJUb3VjaE1vZGUgPSBUT1VDSF9ET05FX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzAwNSw3ICs2NjcxLDYgQEAKIAogICAgICAgICAgICAgICAgIGNhc2UgQ0VOVEVSX0ZJVF9SRUNUOgogICAgICAgICAgICAgICAgICAgICBSZWN0IHIgPSAoUmVjdCltc2cub2JqOwotICAgICAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgY2VudGVyRml0UmVjdChyLmxlZnQsIHIudG9wLCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNzAxNCw2ICs2Njc5LDQzIEBACiAgICAgICAgICAgICAgICAgICAgIG1WZXJ0aWNhbFNjcm9sbEJhck1vZGUgPSBtc2cuYXJnMjsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICAgICAgICBjYXNlIFNFTEVDVElPTl9TVFJJTkdfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvblN0cmluZyA9IChTdHJpbmcpIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eUluamVjdG9yLm9uU2VsZWN0aW9uU3RyaW5nQ2hhbmdlKHNlbGVjdGlvblN0cmluZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFM6CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUobVRvdWNoSGlnaGxpZ2h0UmVnaW9uLmdldEJvdW5kcygpKTsKKyAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0UmVnaW9uLnNldEVtcHR5KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cub2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxSZWN0PiByZWN0cyA9IChBcnJheUxpc3Q8UmVjdD4pIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFJlY3QgcmVjdCA6IHJlY3RzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdCB2aWV3UmVjdCA9IGNvbnRlbnRUb1ZpZXdSZWN0KHJlY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWUgc2l0ZXMsIGxpa2Ugc3RvcmllcyBpbiBueXRpbWVzLmNvbSwgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW91c2UgZXZlbnQgaGFuZGxlciBpbiB0aGUgdG9wIGRpdi4gSXQgaXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlciBmcmllbmRseSB0byBoaWdobGlnaHQgdGhlIGRpdiBpZiBpdCBjb3ZlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3JlIHRoYW4gaGFsZiBvZiB0aGUgc2NyZWVuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3UmVjdC53aWR0aCgpIDwgZ2V0V2lkdGgoKSA+PiAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB2aWV3UmVjdC5oZWlnaHQoKSA8IGdldEhlaWdodCgpID4+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0UmVnaW9uLnVuaW9uKHZpZXdSZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSh2aWV3UmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiU2tpcCB0aGUgaHVnZSBzZWxlY3Rpb24gcmVjdDoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2aWV3UmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTQVZFX1dFQkFSQ0hJVkVfRklOSVNIRUQ6CisgICAgICAgICAgICAgICAgICAgIFNhdmVXZWJBcmNoaXZlTWVzc2FnZSBzYXZlTWVzc2FnZSA9IChTYXZlV2ViQXJjaGl2ZU1lc3NhZ2UpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNhdmVNZXNzYWdlLm1DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYXZlTWVzc2FnZS5tQ2FsbGJhY2sub25SZWNlaXZlVmFsdWUoc2F2ZU1lc3NhZ2UubVJlc3VsdEZpbGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgc3VwZXIuaGFuZGxlTWVzc2FnZShtc2cpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTczMjEsMzcgKzcwMjMsNiBAQAogICAgICAgICAgICAgICAgIG5ldyBJbnZva2VMaXN0Qm94KGFycmF5LCBlbmFibGVkQXJyYXksIHNlbGVjdGVkQXJyYXkpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlWm9vbVJhbmdlKFdlYlZpZXdDb3JlLlJlc3RvcmVTdGF0ZSByZXN0b3JlU3RhdGUsCi0gICAgICAgICAgICBpbnQgdmlld1dpZHRoLCBpbnQgbWluUHJlZldpZHRoLCBib29sZWFuIHVwZGF0ZVpvb21PdmVydmlldykgewotICAgICAgICBpZiAocmVzdG9yZVN0YXRlLm1NaW5TY2FsZSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAocmVzdG9yZVN0YXRlLm1Nb2JpbGVTaXRlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1pblByZWZXaWR0aCA+IE1hdGgubWF4KDAsIHZpZXdXaWR0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IChmbG9hdCkgdmlld1dpZHRoIC8gbWluUHJlZldpZHRoOwotICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZVpvb21PdmVydmlldykgewotICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gc2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0TG9hZFdpdGhPdmVydmlld01vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSByZXN0b3JlU3RhdGUubURlZmF1bHRTY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBERUZBVUxUX01JTl9aT09NX1NDQUxFOwotICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IHJlc3RvcmVTdGF0ZS5tTWluU2NhbGU7Ci0gICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN0b3JlU3RhdGUubU1heFNjYWxlID09IDApIHsKLSAgICAgICAgICAgIG1NYXhab29tU2NhbGUgPSBERUZBVUxUX01BWF9aT09NX1NDQUxFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU1heFpvb21TY2FsZSA9IHJlc3RvcmVTdGF0ZS5tTWF4U2NhbGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKgogICAgICAqIFJlcXVlc3QgYSBkcm9wZG93biBtZW51IGZvciBhIGxpc3Rib3ggd2l0aCBzaW5nbGUgc2VsZWN0aW9uIG9yIGEgc2luZ2xlCiAgICAgICogPHNlbGVjdD4gZWxlbWVudC4KQEAgLTczOTAsNyArNzA2MSw3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHNlbmRNb3ZlTW91c2VJZkxhdGVzdChib29sZWFuIHJlbW92ZUZvY3VzKSB7CiAgICAgICAgIGlmIChyZW1vdmVGb2N1cykgewotICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkodHJ1ZSk7CisgICAgICAgICAgICBjbGVhclRleHRFbnRyeSgpOwogICAgICAgICB9CiAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfTU9WRV9NT1VTRV9JRl9MQVRFU1QsCiAgICAgICAgICAgICAgICAgY3Vyc29yRGF0YSgpKTsKQEAgLTc0MzQsNyArNzEwNSw3IEBACiAgICAgICAgIC8vIEZJWE1FIHRoZSBkaXZpc29yIHNob3VsZCBiZSByZXRyaWV2ZWQgZnJvbSBzb21ld2hlcmUKICAgICAgICAgLy8gdGhlIGNsb3Nlc3QgdGhpbmcgdG9kYXkgaXMgaGFyZC1jb2RlZCBpbnRvIFNjcm9sbFZpZXcuamF2YQogICAgICAgICAvLyAoZnJvbSBTY3JvbGxWaWV3LmphdmEsIGxpbmUgMzYzKSAgIGludCBtYXhKdW1wID0gaGVpZ2h0LzI7Ci0gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGhlaWdodCAqIG1JbnZBY3R1YWxTY2FsZSk7CisgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGhlaWdodCAqIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTc0NDUsMTAgKzcxMTYsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQYXNzIHRoZSBrZXkgdG8gdGhlIHBsdWdpbi4gIFRoaXMgYXNzdW1lcyB0aGF0IG5hdGl2ZUZvY3VzSXNQbHVnaW4oKQotICAgICAqIHJldHVybmVkIHRydWUuCisgICAgICogUGFzcyB0aGUga2V5IGRpcmVjdGx5IHRvIHRoZSBwYWdlLiAgVGhpcyBhc3N1bWVzIHRoYXQKKyAgICAgKiBuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSByZXR1cm5lZCB0cnVlLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsZXRQbHVnaW5IYW5kbGVOYXZLZXkoaW50IGtleUNvZGUsIGxvbmcgdGltZSwgYm9vbGVhbiBkb3duKSB7CisgICAgcHJpdmF0ZSB2b2lkIGxldFBhZ2VIYW5kbGVOYXZLZXkoaW50IGtleUNvZGUsIGxvbmcgdGltZSwgYm9vbGVhbiBkb3duKSB7CiAgICAgICAgIGludCBrZXlFdmVudEFjdGlvbjsKICAgICAgICAgaW50IGV2ZW50SHViQWN0aW9uOwogICAgICAgICBpZiAoZG93bikgewpAQCAtNzU0NSw3ICs3MjE2LDcgQEAKICAgICAgKiBAaGlkZSBvbmx5IG5lZWRzIHRvIGJlIGFjY2Vzc2libGUgdG8gQnJvd3NlciBhbmQgdGVzdGluZwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRyYXdQYWdlKENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgbVdlYlZpZXdDb3JlLmRyYXdDb250ZW50UGljdHVyZShjYW52YXMsIDAsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG5hdGl2ZURyYXcoY2FudmFzLCAwLCAwLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03NTg5LDEwICs3MjYwLDE4IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlQ3Vyc29yV2FudHNLZXlFdmVudHMoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEZWJ1Z0R1bXAoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEZXN0cm95KCk7CisKKyAgICAvKioKKyAgICAgKiBEcmF3IHRoZSBwaWN0dXJlIHNldCB3aXRoIGEgYmFja2dyb3VuZCBjb2xvciBhbmQgZXh0cmEuIElmCisgICAgICogInNwbGl0SWZOZWVkZWQiIGlzIHRydWUgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgbm90IDAsIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgKiBNVVNUIGJlIHBhc3NlZCB0byBXZWJWaWV3Q29yZSB3aXRoIFNQTElUX1BJQ1RVUkVfU0VUIG1lc3NhZ2Ugc28gdGhhdCB0aGUKKyAgICAgKiBuYXRpdmUgYWxsb2NhdGlvbiBjYW4gYmUgZnJlZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZURyYXcoQ2FudmFzIGNhbnZhcywgaW50IGNvbG9yLCBpbnQgZXh0cmEsCisgICAgICAgICAgICBib29sZWFuIHNwbGl0SWZOZWVkZWQpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUR1bXBEaXNwbGF5VHJlZShTdHJpbmcgdXJsT3JOdWxsKTsKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVFdmFsdWF0ZUxheWVyc0FuaW1hdGlvbnMoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVFeHRlbmRTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEcmF3RXh0cmFzKENhbnZhcyBjYW52YXMsIGludCBleHRyYSk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlRHVtcERpc3BsYXlUcmVlKFN0cmluZyB1cmxPck51bGwpOwogICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZUZpbmRBbGwoU3RyaW5nIGZpbmRMb3dlciwgU3RyaW5nIGZpbmRVcHBlcik7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlRmluZE5leHQoYm9vbGVhbiBmb3J3YXJkKTsKICAgICAvKiBwYWNrYWdlICovIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVGb2N1c0NhbmRpZGF0ZUZyYW1lUG9pbnRlcigpOwpAQCAtNzYzMCw2ICs3MzA5LDE0IEBACiAgICAgICAgICAgICBib29sZWFuIG5vU2Nyb2xsKTsKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVNb3ZlR2VuZXJhdGlvbigpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZU1vdmVTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhZ2Ugc2hvdWxkIGdldCB0aGUgc2hpZnQgYW5kIGFycm93IGtleXMsIHJhdGhlcgorICAgICAqIHRoYW4gc2VsZWN0IHRleHQvbmF2aWdhdGlvbi4KKyAgICAgKgorICAgICAqIElmIHRoZSBmb2N1cyBpcyBhIHBsdWdpbiwgb3IgaWYgdGhlIGZvY3VzIGFuZCBjdXJzb3IgbWF0Y2ggYW5kIGFyZQorICAgICAqIGEgY29udGVudEVkaXRhYmxlIGVsZW1lbnQsIHRoZW4gdGhlIHBhZ2Ugc2hvdWxkIGhhbmRsZSB0aGVzZSBrZXlzLgorICAgICAqLworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpOwogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVBvaW50SW5OYXZDYWNoZShpbnQgeCwgaW50IHksIGludCBzbG9wKTsKICAgICAvLyBMaWtlIG1hbnkgb3RoZXIgb2Ygb3VyIG5hdGl2ZSBtZXRob2RzLCB5b3UgbXVzdCBtYWtlIHN1cmUgdGhhdAogICAgIC8vIG1OYXRpdmVDbGFzcyBpcyBub3QgbnVsbCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC4KQEAgLTc2NDQsMTMgKzczMzEsMTUgQEAKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRFeHRlbmRTZWxlY3Rpb24oKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRGaW5kSXNFbXB0eSgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNldEZpbmRJc1VwKGJvb2xlYW4gaXNVcCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0Rm9sbG93ZWRMaW5rKGJvb2xlYW4gZm9sbG93ZWQpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNldEhlaWdodENhbk1lYXN1cmUoYm9vbGVhbiBtZWFzdXJlKTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRSb290TGF5ZXIoaW50IGxheWVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRCYXNlTGF5ZXIoaW50IGxheWVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTaG93Q3Vyc29yVGltZWQoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVSZXBsYWNlQmFzZUNvbnRlbnQoaW50IGNvbnRlbnQpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUNvcHlCYXNlQ29udGVudFRvUGljdHVyZShQaWN0dXJlIHBpY3QpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZUhhc0NvbnRlbnQoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRTZWxlY3Rpb25Qb2ludGVyKGJvb2xlYW4gc2V0LAogICAgICAgICAgICAgZmxvYXQgc2NhbGUsIGludCB4LCBpbnQgeSk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlU3RhcnRTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRTZWxlY3Rpb25SZWdpb24oYm9vbGVhbiBzZXQpOwogICAgIHByaXZhdGUgbmF0aXZlIFJlY3QgICAgIG5hdGl2ZVN1YnRyYWN0TGF5ZXJzKFJlY3QgY29udGVudCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgaW50ICAgICAgbmF0aXZlVGV4dEdlbmVyYXRpb24oKTsKICAgICAvLyBOZXZlciBjYWxsIHRoaXMgdmVyc2lvbiBleGNlcHQgYnkgdXBkYXRlQ2FjaGVkVGV4dGZpZWxkKFN0cmluZykgLQpAQCAtNzY1OSw2ICs3MzQ4LDEwIEBACiAgICAgICAgICAgICBpbnQgZ2VuZXJhdGlvbik7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlV29yZFNlbGVjdGlvbihpbnQgeCwgaW50IHkpOwogICAgIC8vIHJldHVybiBOT19MRUZURURHRSBtZWFucyBmYWlsdXJlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT19MRUZURURHRSA9IC0xOwotICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZUdldEJsb2NrTGVmdEVkZ2UoaW50IHgsIGludCB5LCBmbG9hdCBzY2FsZSk7CisgICAgc3RhdGljIGZpbmFsIGludCBOT19MRUZURURHRSA9IC0xOworICAgIG5hdGl2ZSBpbnQgbmF0aXZlR2V0QmxvY2tMZWZ0RWRnZShpbnQgeCwgaW50IHksIGZsb2F0IHNjYWxlKTsKKworICAgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzY3JvbGxhYmxlIExheWVyQW5kcm9pZCBhdCB0aGUgZ2l2ZW4gcG9pbnQuCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50ICAgICAgbmF0aXZlU2Nyb2xsYWJsZUxheWVyKGludCB4LCBpbnQgeSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlU2Nyb2xsTGF5ZXIoaW50IGxheWVyLCBpbnQgZHgsIGludCBkeSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhCmluZGV4IDQxMTgxMTkuLmZhZDQzMjMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhCkBAIC0xNywxNCArMTcsOCBAQAogcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkRyYXdGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50RmxhZ3NEcmF3RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKQEAgLTMzLDE0ICsyNywxNCBAQAogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Ccm93c2VyOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuT3BlbmFibGVDb2x1bW5zOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTExNywxMyArMTExLDE2IEBACiAgICAgcHJpdmF0ZSBpbnQgbVZpZXdwb3J0RGVuc2l0eURwaSA9IC0xOwogCiAgICAgcHJpdmF0ZSBpbnQgbVJlc3RvcmVkU2NhbGUgPSAwOwotICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFNjcmVlbldpZHRoU2NhbGUgPSAwOworICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFRleHRXcmFwU2NhbGUgPSAwOwogICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFggPSAwOwogICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFkgPSAwOwogCiAgICAgcHJpdmF0ZSBpbnQgbVdlYmtpdFNjcm9sbFggPSAwOwogICAgIHByaXZhdGUgaW50IG1XZWJraXRTY3JvbGxZID0gMDsKIAorICAgIHByaXZhdGUgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyIG1EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIgPSBuZXcgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyKHRoaXMpOworICAgIHByaXZhdGUgRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlIG1EZXZpY2VPcmllbnRhdGlvblNlcnZpY2U7CisKICAgICAvLyBUaGUgdGhyZWFkIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGUgV2ViQ29yZSB0aHJlYWQgYW5kIGZvciB1c2UgaW4KICAgICAvLyBkZWJ1Z2dpbmcgb3RoZXIgY2xhc3NlcyB0aGF0IHJlcXVpcmUgb3BlcmF0aW9uIHdpdGhpbiB0aGUgV2ViQ29yZSB0aHJlYWQuCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIUkVBRF9OQU1FID0gIldlYlZpZXdDb3JlVGhyZWFkIjsKQEAgLTI3OSwzNCArMjc2LDM2IEBACiAKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgSk5JLiAgT3BlbiBhIGZpbGUgY2hvb3NlciB0byB1cGxvYWQgYSBmaWxlLgotICAgICAqIEByZXR1cm4gU3RyaW5nIHZlcnNpb24gb2YgdGhlIFVSSSBwbHVzIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICAgICAqIEZJWE1FOiBKdXN0IHJldHVybiB0aGUgVVJJIGhlcmUsIGFuZCBpbiBGaWxlU3lzdGVtOjpwYXRoR2V0RmlsZU5hbWUsIGNhbGwKLSAgICAgKiBpbnRvIEphdmEgdG8gZ2V0IHRoZSBmaWxlbmFtZS4KKyAgICAgKiBAcGFyYW0gYWNjZXB0VHlwZSBUaGUgdmFsdWUgb2YgdGhlICdhY2NlcHQnIGF0dHJpYnV0ZSBvZiB0aGUKKyAgICAgKiAgICAgICAgIGlucHV0IHRhZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWxlIHBpY2tlci4KKyAgICAgKiBAcmV0dXJuIFN0cmluZyB2ZXJzaW9uIG9mIHRoZSBVUkkuCiAgICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgb3BlbkZpbGVDaG9vc2VyKCkgewotICAgICAgICBVcmkgdXJpID0gbUNhbGxiYWNrUHJveHkub3BlbkZpbGVDaG9vc2VyKCk7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgcmV0dXJuICIiOwotICAgICAgICAvLyBGaW5kIG91dCB0aGUgbmFtZSwgYW5kIGFwcGVuZCBpdCB0byB0aGUgVVJJLgotICAgICAgICAvLyBXZWJraXQgd2lsbCB0cmVhdCB0aGUgbmFtZSBhcyB0aGUgZmlsZW5hbWUsIGFuZAotICAgICAgICAvLyB0aGUgVVJJIGFzIHRoZSBwYXRoLiAgVGhlIFVSSSB3aWxsIGJlIHVzZWQKLSAgICAgICAgLy8gaW4gQnJvd3NlckZyYW1lIHRvIGdldCB0aGUgYWN0dWFsIGRhdGEuCi0gICAgICAgIEN1cnNvciBjdXJzb3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKLSAgICAgICAgICAgICAgICB1cmksCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgT3BlbmFibGVDb2x1bW5zLkRJU1BMQVlfTkFNRSB9LAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAiIjsKLSAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChjdXJzb3IubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBjdXJzb3IuZ2V0U3RyaW5nKDApOworICAgIHByaXZhdGUgU3RyaW5nIG9wZW5GaWxlQ2hvb3NlcihTdHJpbmcgYWNjZXB0VHlwZSkgeworICAgICAgICBVcmkgdXJpID0gbUNhbGxiYWNrUHJveHkub3BlbkZpbGVDaG9vc2VyKGFjY2VwdFR5cGUpOworICAgICAgICBpZiAodXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9ICIiOworICAgICAgICAgICAgLy8gTm90ZSAtIHF1ZXJ5aW5nIGZvciBNZWRpYVN0b3JlLkltYWdlcy5NZWRpYS5EQVRBCisgICAgICAgICAgICAvLyBzZWVtcyB0byB3b3JrIGZvciBhbGwgY29udGVudCBVUklzLCBub3QganVzdCBpbWFnZXMKKyAgICAgICAgICAgIEN1cnNvciBjdXJzb3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgdXJpLAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBNZWRpYVN0b3JlLkltYWdlcy5NZWRpYS5EQVRBIH0sCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gY3Vyc29yLmdldFN0cmluZygwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gdXJpLmdldExhc3RQYXRoU2VnbWVudCgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHVyaVN0cmluZyA9IHVyaS50b1N0cmluZygpOworICAgICAgICAgICAgQnJvd3NlckZyYW1lLnNKYXZhQnJpZGdlLnN0b3JlRmlsZVBhdGhGb3JDb250ZW50VXJpKGZpbGVQYXRoLCB1cmlTdHJpbmcpOworICAgICAgICAgICAgcmV0dXJuIHVyaVN0cmluZzsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdXJpLnRvU3RyaW5nKCkgKyAiLyIgKyBuYW1lOworICAgICAgICByZXR1cm4gIiI7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MjQsNiArNDIzLDEzIEBACiAgICAgICAgIHJldHVybiBtQ2FsbGJhY2tQcm94eS5vbkpzVGltZW91dCgpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgd2VidmlldyB0aGF0IHRoaXMgaXMgYW4gaW5zdGFsbGFibGUgd2ViIGFwcC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnN0YWxsYWJsZVdlYkFwcCgpIHsKKyAgICAgICAgbUNhbGxiYWNrUHJveHkuc2V0SW5zdGFsbGFibGVXZWJBcHAoKTsKKyAgICB9CisKICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLyBKTkkgbWV0aG9kcwogICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDM1LDM2ICs0NDEsMjEgQEAKICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUNsZWFyQ29udGVudCgpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgZmxhdCBwaWN0dXJlIGZyb20gdGhlIHNldCBvZiBwaWN0dXJlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvcHlDb250ZW50VG9QaWN0dXJlKFBpY3R1cmUgcGljdHVyZSk7Ci0KLSAgICAvKioKLSAgICAgKiBEcmF3IHRoZSBwaWN0dXJlIHNldCB3aXRoIGEgYmFja2dyb3VuZCBjb2xvci4gUmV0dXJucyB0cnVlCi0gICAgICogaWYgc29tZSBpbmRpdmlkdWFsIHBpY3R1cmUgdG9vayB0b28gbG9uZyB0byBkcmF3IGFuZCBjYW4gYmUKLSAgICAgKiBzcGxpdCBpbnRvIHBhcnRzLiBDYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLgotICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlRHJhd0NvbnRlbnQoQ2FudmFzIGNhbnZhcywgaW50IGNvbG9yKTsKLQotICAgIC8qKgotICAgICAqIGNoZWNrIHRvIHNlZSBpZiBwaWN0dXJlIGlzIGJsYW5rIGFuZCBpbiBwcm9ncmVzcwotICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlUGljdHVyZVJlYWR5KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVDb250ZW50SW52YWxpZGF0ZUFsbCgpOwogCiAgICAgLyoqCiAgICAgICogUmVkcmF3IGEgcG9ydGlvbiBvZiB0aGUgcGljdHVyZSBzZXQuIFRoZSBQb2ludCB3aCByZXR1cm5zIHRoZQogICAgICAqIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIG92ZXJhbGwgcGljdHVyZS4KICAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZVJlY29yZENvbnRlbnQoUmVnaW9uIGludmFsUmVnaW9uLCBQb2ludCB3aCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZVJlY29yZENvbnRlbnQoUmVnaW9uIGludmFsUmVnaW9uLCBQb2ludCB3aCk7CiAKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZUZvY3VzQm91bmRzQ2hhbmdlZCgpOwogCiAgICAgLyoqCi0gICAgICogU3BsaXRzIHNsb3cgcGFydHMgb2YgdGhlIHBpY3R1cmUgc2V0LiBDYWxsZWQgZnJvbSB0aGUgd2Via2l0Ci0gICAgICogdGhyZWFkIGFmdGVyIG5hdGl2ZURyYXdDb250ZW50IHJldHVybnMgdHJ1ZS4KKyAgICAgKiBTcGxpdHMgc2xvdyBwYXJ0cyBvZiB0aGUgcGljdHVyZSBzZXQuIENhbGxlZCBmcm9tIHRoZSB3ZWJraXQgdGhyZWFkIGFmdGVyCisgICAgICogV2ViVmlldy5uYXRpdmVEcmF3KCkgcmV0dXJucyBjb250ZW50IHRvIGJlIHNwbGl0LgogICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlU3BsaXRDb250ZW50KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTcGxpdENvbnRlbnQoaW50IGNvbnRlbnQpOwogCiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVLZXkoaW50IGtleUNvZGUsIGludCB1bmljaGFyLAogICAgICAgICAgICAgaW50IHJlcGVhdENvdW50LCBib29sZWFuIGlzU2hpZnQsIGJvb2xlYW4gaXNBbHQsIGJvb2xlYW4gaXNTeW0sCkBAIC00ODAsMTIgKzQ3MSwxMiBAQAogICAgICAgICBvZiBsYXlvdXQvbGluZS1icmVha2luZy4gVGhlc2UgY29vcmRpbmF0ZXMgYXJlIGluIGRvY3VtZW50IHNwYWNlLAogICAgICAgICB3aGljaCBpcyB0aGUgc2FtZSBhcyBWaWV3IGNvb3JkcyB1bmxlc3Mgd2UgaGF2ZSB6b29tZWQgdGhlIGRvY3VtZW50CiAgICAgICAgIChzZWUgbmF0aXZlU2V0Wm9vbSkuCi0gICAgICAgIHNjcmVlbldpZHRoIGlzIHVzZWQgYnkgbGF5b3V0IHRvIHdyYXAgY29sdW1uIGFyb3VuZC4gSWYgdmlld3BvcnQgdXNlcwotICAgICAgICBmaXhlZCBzaXplLCBzY3JlZW5XaWR0aCBjYW4gYmUgZGlmZmVyZW50IGZyb20gd2lkdGggd2l0aCB6b29taW5nLgorICAgICAgICB0ZXh0V3JhcFdpZHRoIGlzIHVzZWQgYnkgbGF5b3V0IHRvIHdyYXAgY29sdW1uIGFyb3VuZC4gSWYgdmlld3BvcnQgdXNlcworICAgICAgICBmaXhlZCBzaXplLCB0ZXh0V3JhcFdpZHRoIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSB3aWR0aCB3aXRoIHpvb21pbmcuCiAgICAgICAgIHNob3VsZCB0aGlzIGJlIGNhbGxlZCBuYXRpdmVTZXRWaWV3UG9ydFNpemU/CiAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2NyZWVuV2lkdGgsCi0gICAgICAgICAgICBmbG9hdCBzY2FsZSwgaW50IHJlYWxTY3JlZW5XaWR0aCwgaW50IHNjcmVlbkhlaWdodCwgaW50IGFuY2hvclgsCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHRleHRXcmFwV2lkdGgsCisgICAgICAgICAgICBmbG9hdCBzY2FsZSwgaW50IHNjcmVlbldpZHRoLCBpbnQgc2NyZWVuSGVpZ2h0LCBpbnQgYW5jaG9yWCwKICAgICAgICAgICAgIGludCBhbmNob3JZLCBib29sZWFuIGlnbm9yZUhlaWdodCk7CiAKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlR2V0Q29udGVudE1pblByZWZXaWR0aCgpOwpAQCAtNTc2LDcgKzU2NywxOCBAQAogICAgIC8qKgogICAgICAqIFByb3ZpZGUgV2ViQ29yZSB3aXRoIHRoZSBwcmV2aW91c2x5IHZpc3RlZCBsaW5rcyBmcm9tIHRoZSBoaXN0b3J5IGRhdGFiYXNlCiAgICAgICovCi0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgbmF0aXZlUHJvdmlkZVZpc2l0ZWRIaXN0b3J5KFN0cmluZ1tdIGhpc3RvcnkpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlUHJvdmlkZVZpc2l0ZWRIaXN0b3J5KFN0cmluZ1tdIGhpc3RvcnkpOworCisgICAgLyoqCisgICAgICogTW9kaWZpZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGFsdGVyIFNwZWNpZmllcyBob3cgdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZ3JhbnVsYXJpdHkgVGhlIGdyYW51bGFyaXR5IG9mIHRoZSBzZWxlY3Rpb24gbW9kaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgc2VsZWN0aW9uIHN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgbmF0aXZlTW9kaWZ5U2VsZWN0aW9uKFN0cmluZyBhbHRlciwgU3RyaW5nIGRpcmVjdGlvbiwgU3RyaW5nIGdyYW51bGFyaXR5KTsKIAogICAgIC8vIEV2ZW50SHViIGZvciBwcm9jZXNzaW5nIG1lc3NhZ2VzCiAgICAgcHJpdmF0ZSBmaW5hbCBFdmVudEh1YiBtRXZlbnRIdWI7CkBAIC02OTcsNiArNjk5LDEyIEBACiAgICAgICAgIGludCBtWTsKICAgICB9CiAKKyAgICBzdGF0aWMgY2xhc3MgVG91Y2hIaWdobGlnaHREYXRhIHsKKyAgICAgICAgaW50IG1YOworICAgICAgICBpbnQgbVk7CisgICAgICAgIGludCBtU2xvcDsKKyAgICB9CisKICAgICAvLyBtQWN0aW9uIG9mIFRvdWNoRXZlbnREYXRhIGNhbiBiZSBNb3Rpb25FdmVudC5nZXRBY3Rpb24oKSB3aGljaCB1c2VzIHRoZQogICAgIC8vIGxhc3QgdHdvIGJ5dGVzIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0xPTkdQUkVTUyA9IDB4MTAwOwpAQCAtNzA4LDggKzcxNiw2IEBACiAgICAgICAgIGludCBtWTsKICAgICAgICAgaW50IG1NZXRhU3RhdGU7CiAgICAgICAgIGJvb2xlYW4gbVJlcHJvY2VzczsKLSAgICAgICAgZmxvYXQgbVZpZXdYOwotICAgICAgICBmbG9hdCBtVmlld1k7CiAgICAgfQogCiAgICAgc3RhdGljIGNsYXNzIEdlb2xvY2F0aW9uUGVybWlzc2lvbnNEYXRhIHsKQEAgLTcxOCw3ICs3MjQsMTEgQEAKICAgICAgICAgYm9vbGVhbiBtUmVtZW1iZXI7CiAgICAgfQogCi0KKyAgICBzdGF0aWMgY2xhc3MgTW9kaWZ5U2VsZWN0aW9uRGF0YSB7CisgICAgICAgIFN0cmluZyBtQWx0ZXI7CisgICAgICAgIFN0cmluZyBtRGlyZWN0aW9uOworICAgICAgICBTdHJpbmcgbUdyYW51bGFyaXR5OworICAgIH0KIAogICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gSGFuZGxlckRlYnVnU3RyaW5nID0gewogICAgICAgICAgICAgIlJFUVVFU1RfTEFCRUwiLCAvLyA5NwpAQCAtNzcxLDYgKzc4MSw3IEBACiAgICAgICAgICAgICAiT05fUkVTVU1FIiwgICAgLy8gPSAxNDQKICAgICAgICAgICAgICJGUkVFX01FTU9SWSIsICAvLyA9IDE0NQogICAgICAgICAgICAgIlZBTElEX05PREVfQk9VTkRTIiwgLy8gPSAxNDYKKyAgICAgICAgICAgICJTQVZFX1dFQkFSQ0hJVkUiLCAvLyA9IDE0NwogICAgICAgICB9OwogCiAgICAgY2xhc3MgRXZlbnRIdWIgewpAQCAtODM3LDYgKzg0OCw5IEBACiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgRlJFRV9NRU1PUlkgPSAxNDU7CiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURfTk9ERV9CT1VORFMgPSAxNDY7CiAKKyAgICAgICAgLy8gTG9hZCBhbmQgc2F2ZSB3ZWIgYXJjaGl2ZXMKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBTQVZFX1dFQkFSQ0hJVkUgPSAxNDc7CisKICAgICAgICAgLy8gTmV0d29yay1iYXNlZCBtZXNzYWdpbmcKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBDTEVBUl9TU0xfUFJFRl9UQUJMRSA9IDE1MDsKIApAQCAtODY1LDYgKzg3OSwxNCBAQAogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEFERF9QQUNLQUdFX05BTUUgPSAxODU7CiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX1BBQ0tBR0VfTkFNRSA9IDE4NjsKIAorICAgICAgICBzdGF0aWMgZmluYWwgaW50IEdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMgPSAxODc7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX1RPVUNIX0hJR0hMSUdIVF9SRUNUUyA9IDE4ODsKKworICAgICAgICAvLyBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBNT0RJRllfU0VMRUNUSU9OID0gMTkwOworCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVVNFX01PQ0tfREVWSUNFX09SSUVOVEFUSU9OID0gMTkxOworCiAgICAgICAgIC8vIHByaXZhdGUgbWVzc2FnZSBpZHMKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFU1RST1kgPSAgICAgMjAwOwogCkBAIC0xMjM4LDYgKzEyNjAsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTZXRTZWxlY3Rpb24obXNnLmFyZzEsIG1zZy5hcmcyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNT0RJRllfU0VMRUNUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmeVNlbGVjdGlvbkRhdGEgbW9kaWZ5U2VsZWN0aW9uRGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNb2RpZnlTZWxlY3Rpb25EYXRhKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb25TdHJpbmcgPSBuYXRpdmVNb2RpZnlTZWxlY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlTZWxlY3Rpb25EYXRhLm1BbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeVNlbGVjdGlvbkRhdGEubURpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeVNlbGVjdGlvbkRhdGEubUdyYW51bGFyaXR5KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5TRUxFQ1RJT05fU1RSSU5HX0NIQU5HRUQsIHNlbGVjdGlvblN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMSVNUQk9YX0NIT0lDRVM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BhcnNlQm9vbGVhbkFycmF5IGNob2ljZXMgPSAoU3BhcnNlQm9vbGVhbkFycmF5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLm9iajsKQEAgLTEyNzgsNiArMTMxMywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNldEpzRmxhZ3MoKFN0cmluZyltc2cub2JqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTQVZFX1dFQkFSQ0hJVkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5TYXZlV2ViQXJjaGl2ZU1lc3NhZ2Ugc2F2ZU1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2ViVmlldy5TYXZlV2ViQXJjaGl2ZU1lc3NhZ2UpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlTWVzc2FnZS5tUmVzdWx0RmlsZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVXZWJBcmNoaXZlKHNhdmVNZXNzYWdlLm1CYXNlbmFtZSwgc2F2ZU1lc3NhZ2UubUF1dG9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5TQVZFX1dFQkFSQ0hJVkVfRklOSVNIRUQsIHNhdmVNZXNzYWdlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHRU9MT0NBVElPTl9QRVJNSVNTSU9OU19QUk9WSURFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlb2xvY2F0aW9uUGVybWlzc2lvbnNEYXRhIGRhdGEgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdlb2xvY2F0aW9uUGVybWlzc2lvbnNEYXRhKSBtc2cub2JqOwpAQCAtMTI5MSw3ICsxMzM1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTUExJVF9QSUNUVVJFX1NFVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTcGxpdENvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTcGxpdENvbnRlbnQobXNnLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5SRVBMQUNFX0JBU0VfQ09OVEVOVCwgbXNnLmFyZzEsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TcGxpdFBpY3R1cmVJc1NjaGVkdWxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC0xMzU3LDYgKzE0MDMsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcm93c2VyRnJhbWUuc0phdmFCcmlkZ2UucmVtb3ZlUGFja2FnZU5hbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBtc2cub2JqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdWNoSGlnaGxpZ2h0RGF0YSBkID0gKFRvdWNoSGlnaGxpZ2h0RGF0YSkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8UmVjdD4gcmVjdHMgPSBuYXRpdmVHZXRUb3VjaEhpZ2hsaWdodFJlY3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZC5tWCwgZC5tWSwgZC5tU2xvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLm9idGFpbk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMsIHJlY3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJFTU9WRV9UT1VDSF9ISUdITElHSFRfUkVDVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLm9idGFpbk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMsIG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVVNFX01PQ0tfREVWSUNFX09SSUVOVEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZU1vY2tEZXZpY2VPcmllbnRhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKQEAgLTE1NjIsMjQgKzE2MjcsMzkgQEAKICAgICAgICAgbUJyb3dzZXJGcmFtZS5sb2FkVXJsKHVybCwgZXh0cmFIZWFkZXJzKTsKICAgICB9CiAKKyAgICBwcml2YXRlIFN0cmluZyBzYXZlV2ViQXJjaGl2ZShTdHJpbmcgZmlsZW5hbWUsIGJvb2xlYW4gYXV0b25hbWUpIHsKKyAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgeworICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiIENPUkUgc2F2ZVdlYkFyY2hpdmUgIiArIGZpbGVuYW1lICsgIiAiICsgYXV0b25hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQnJvd3NlckZyYW1lLnNhdmVXZWJBcmNoaXZlKGZpbGVuYW1lLCBhdXRvbmFtZSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGtleShLZXlFdmVudCBldnQsIGJvb2xlYW4gaXNEb3duKSB7CiAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXX0NPUkUpIHsKICAgICAgICAgICAgIExvZy52KExPR1RBRywgIkNPUkUga2V5IGF0ICIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIsICIKICAgICAgICAgICAgICAgICAgICAgKyBldnQpOwogICAgICAgICB9CiAgICAgICAgIGludCBrZXlDb2RlID0gZXZ0LmdldEtleUNvZGUoKTsKLSAgICAgICAgaWYgKCFuYXRpdmVLZXkoa2V5Q29kZSwgZXZ0LmdldFVuaWNvZGVDaGFyKCksCi0gICAgICAgICAgICAgICAgZXZ0LmdldFJlcGVhdENvdW50KCksIGV2dC5pc1NoaWZ0UHJlc3NlZCgpLCBldnQuaXNBbHRQcmVzc2VkKCksCi0gICAgICAgICAgICAgICAgZXZ0LmlzU3ltUHJlc3NlZCgpLAorICAgICAgICBpbnQgdW5pY29kZUNoYXIgPSBldnQuZ2V0VW5pY29kZUNoYXIoKTsKKworICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1VOS05PV04gJiYgZXZ0LmdldENoYXJhY3RlcnMoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgZXZ0LmdldENoYXJhY3RlcnMoKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIC8vIHdlIHNob3VsZCBvbmx5IHJlY2VpdmUgaW5kaXZpZHVhbCBjb21wbGV4IGNoYXJhY3RlcnMKKyAgICAgICAgICAgIHVuaWNvZGVDaGFyID0gZXZ0LmdldENoYXJhY3RlcnMoKS5jb2RlUG9pbnRBdCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbmF0aXZlS2V5KGtleUNvZGUsIHVuaWNvZGVDaGFyLCBldnQuZ2V0UmVwZWF0Q291bnQoKSwgZXZ0LmlzU2hpZnRQcmVzc2VkKCksCisgICAgICAgICAgICAgICAgZXZ0LmlzQWx0UHJlc3NlZCgpLCBldnQuaXNTeW1QcmVzc2VkKCksCiAgICAgICAgICAgICAgICAgaXNEb3duKSAmJiBrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfRU5URVIpIHsKICAgICAgICAgICAgIGlmIChrZXlDb2RlID49IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUAogICAgICAgICAgICAgICAgICAgICAmJiBrZXlDb2RlIDw9IEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVCkgewogICAgICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXX0NPUkUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAia2V5OiBhcnJvdyB1bnVzZWQgYnkgcGx1Z2luOiAiICsga2V5Q29kZSk7CisgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgImtleTogYXJyb3cgdW51c2VkIGJ5IHBhZ2U6ICIgKyBrZXlDb2RlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwgJiYgZXZ0LmlzRG93bigpKSB7CiAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3Lk1PVkVfT1VUX09GX1BMVUdJTiwga2V5Q29kZSkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5VTkhBTkRMRURfTkFWX0tFWSwga2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKS5zZW5kVG9UYXJnZXQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQpAQCAtMTYxMCw3ICsxNjkwLDcgQEAKICAgICAgICAgaWYgKG1TZXR0aW5ncy5nZXRVc2VXaWRlVmlld1BvcnQoKSkgewogICAgICAgICAgICAgaWYgKG1WaWV3cG9ydFdpZHRoID09IC0xKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1TZXR0aW5ncy5nZXRMYXlvdXRBbGdvcml0aG0oKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2V0dGluZ3MuTGF5b3V0QWxnb3JpdGhtLk5PUk1BTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2V0dGluZ3MuTGF5b3V0QWxnb3JpdGhtLk5PUk1BTCB8fCBtU2V0dGluZ3MuZ2V0VXNlRml4ZWRWaWV3cG9ydCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gV2ViVmlldy5ERUZBVUxUX1ZJRVdQT1JUX1dJRFRIOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8qCkBAIC0xNjc1LDYgKzE3NTUsMTQgQEAKICAgICAgICAgcmV0dXJuIHVzZWRRdW90YTsKICAgICB9CiAKKyAgICAvLyBjYWxsZWQgZnJvbSBVSSB0aHJlYWQKKyAgICB2b2lkIHNwbGl0Q29udGVudChpbnQgY29udGVudCkgeworICAgICAgICBpZiAoIW1TcGxpdFBpY3R1cmVJc1NjaGVkdWxlZCkgeworICAgICAgICAgICAgbVNwbGl0UGljdHVyZUlzU2NoZWR1bGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKEV2ZW50SHViLlNQTElUX1BJQ1RVUkVfU0VULCBjb250ZW50LCAwKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIFVzZWQgdG8gYXZvaWQgcG9zdGluZyBtb3JlIHRoYW4gb25lIGRyYXcgbWVzc2FnZS4KICAgICBwcml2YXRlIGJvb2xlYW4gbURyYXdJc1NjaGVkdWxlZDsKIApAQCAtMTY4NCwxMSArMTc3MiwxMSBAQAogICAgIC8vIFVzZWQgdG8gc3VzcGVuZCBkcmF3aW5nLgogICAgIHByaXZhdGUgYm9vbGVhbiBtRHJhd0lzUGF1c2VkOwogCi0gICAgLy8gbVJlc3RvcmVTdGF0ZSBpcyBzZXQgaW4gZGlkRmlyc3RMYXlvdXQoKSwgYW5kIHJlc2V0IGluIHRoZSBuZXh0Ci0gICAgLy8gd2Via2l0RHJhdyBhZnRlciBwYXNzaW5nIGl0IHRvIHRoZSBVSSB0aHJlYWQuCi0gICAgcHJpdmF0ZSBSZXN0b3JlU3RhdGUgbVJlc3RvcmVTdGF0ZSA9IG51bGw7CisgICAgLy8gbUluaXRpYWxWaWV3U3RhdGUgaXMgc2V0IGJ5IGRpZEZpcnN0TGF5b3V0KCkgYW5kIHRoZW4gcmVzZXQgaW4gdGhlCisgICAgLy8gbmV4dCB3ZWJraXREcmF3IGFmdGVyIHBhc3NpbmcgdGhlIHN0YXRlIHRvIHRoZSBVSSB0aHJlYWQuCisgICAgcHJpdmF0ZSBWaWV3U3RhdGUgbUluaXRpYWxWaWV3U3RhdGUgPSBudWxsOwogCi0gICAgc3RhdGljIGNsYXNzIFJlc3RvcmVTdGF0ZSB7CisgICAgc3RhdGljIGNsYXNzIFZpZXdTdGF0ZSB7CiAgICAgICAgIGZsb2F0IG1NaW5TY2FsZTsKICAgICAgICAgZmxvYXQgbU1heFNjYWxlOwogICAgICAgICBmbG9hdCBtVmlld1NjYWxlOwpAQCAtMTcwMSwxNSArMTc4OSwxNyBAQAogCiAgICAgc3RhdGljIGNsYXNzIERyYXdEYXRhIHsKICAgICAgICAgRHJhd0RhdGEoKSB7CisgICAgICAgICAgICBtQmFzZUxheWVyID0gMDsKICAgICAgICAgICAgIG1JbnZhbFJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKICAgICAgICAgICAgIG1XaWR0aEhlaWdodCA9IG5ldyBQb2ludCgpOwogICAgICAgICB9CisgICAgICAgIGludCBtQmFzZUxheWVyOwogICAgICAgICBSZWdpb24gbUludmFsUmVnaW9uOwogICAgICAgICBQb2ludCBtVmlld1BvaW50OwogICAgICAgICBQb2ludCBtV2lkdGhIZWlnaHQ7CiAgICAgICAgIGludCBtTWluUHJlZldpZHRoOwotICAgICAgICBSZXN0b3JlU3RhdGUgbVJlc3RvcmVTdGF0ZTsgLy8gb25seSBub24tbnVsbCBpZiBpdCBpcyBmb3IgdGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaWN0dXJlIHNldCBhZnRlciB0aGUgZmlyc3QgbGF5b3V0CisgICAgICAgIC8vIG9ubHkgbm9uLW51bGwgaWYgaXQgaXMgZm9yIHRoZSBmaXJzdCBwaWN0dXJlIHNldCBhZnRlciB0aGUgZmlyc3QgbGF5b3V0CisgICAgICAgIFZpZXdTdGF0ZSBtVmlld1N0YXRlOwogICAgICAgICBib29sZWFuIG1Gb2N1c1NpemVDaGFuZ2VkOwogICAgIH0KIApAQCAtMTcxNyw4ICsxODA3LDggQEAKICAgICAgICAgbURyYXdJc1NjaGVkdWxlZCA9IGZhbHNlOwogICAgICAgICBEcmF3RGF0YSBkcmF3ID0gbmV3IERyYXdEYXRhKCk7CiAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXX0NPUkUpIExvZy52KExPR1RBRywgIndlYmtpdERyYXcgc3RhcnQiKTsKLSAgICAgICAgaWYgKG5hdGl2ZVJlY29yZENvbnRlbnQoZHJhdy5tSW52YWxSZWdpb24sIGRyYXcubVdpZHRoSGVpZ2h0KQotICAgICAgICAgICAgICAgID09IGZhbHNlKSB7CisgICAgICAgIGRyYXcubUJhc2VMYXllciA9IG5hdGl2ZVJlY29yZENvbnRlbnQoZHJhdy5tSW52YWxSZWdpb24sIGRyYXcubVdpZHRoSGVpZ2h0KTsKKyAgICAgICAgaWYgKGRyYXcubUJhc2VMYXllciA9PSAwKSB7CiAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFV19DT1JFKSBMb2cudihMT0dUQUcsICJ3ZWJraXREcmF3IGFib3J0Iik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTE3MzQsOSArMTgyNCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtVmlld3BvcnRXaWR0aCksCiAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVHZXRDb250ZW50TWluUHJlZldpZHRoKCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1SZXN0b3JlU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRyYXcubVJlc3RvcmVTdGF0ZSA9IG1SZXN0b3JlU3RhdGU7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZSA9IG51bGw7CisgICAgICAgICAgICBpZiAobUluaXRpYWxWaWV3U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRyYXcubVZpZXdTdGF0ZSA9IG1Jbml0aWFsVmlld1N0YXRlOworICAgICAgICAgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXX0NPUkUpIExvZy52KExPR1RBRywgIndlYmtpdERyYXcgTkVXX1BJQ1RVUkVfTVNHX0lEIik7CiAgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIsCkBAIC0xNzUxLDUxICsxODQxLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIFRoZXNlIGFyZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLCBub3Qgb3VyIHRocmVhZAotCi0gICAgc3RhdGljIGZpbmFsIGludCBaT09NX0JJVFMgPSBQYWludC5GSUxURVJfQklUTUFQX0ZMQUcgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5ESVRIRVJfRkxBRyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LlNVQlBJWEVMX1RFWFRfRkxBRzsKLSAgICBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9CSVRTID0gUGFpbnQuRklMVEVSX0JJVE1BUF9GTEFHIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5ESVRIRVJfRkxBRzsKLQotICAgIGZpbmFsIERyYXdGaWx0ZXIgbVpvb21GaWx0ZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgUGFpbnRGbGFnc0RyYXdGaWx0ZXIoWk9PTV9CSVRTLCBQYWludC5MSU5FQVJfVEVYVF9GTEFHKTsKLSAgICAvLyBJZiB3ZSBuZWVkIHRvIHRyYWRlIGJldHRlciBxdWFsaXR5IGZvciBzcGVlZCwgc2V0IG1TY3JvbGxGaWx0ZXIgdG8gbnVsbAotICAgIGZpbmFsIERyYXdGaWx0ZXIgbVNjcm9sbEZpbHRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IFBhaW50RmxhZ3NEcmF3RmlsdGVyKFNDUk9MTF9CSVRTLCAwKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBkcmF3Q29udGVudFBpY3R1cmUoQ2FudmFzIGNhbnZhcywgaW50IGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbmltYXRpbmdab29tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbmltYXRpbmdTY3JvbGwpIHsKLSAgICAgICAgRHJhd0ZpbHRlciBkZiA9IG51bGw7Ci0gICAgICAgIGlmIChhbmltYXRpbmdab29tKSB7Ci0gICAgICAgICAgICBkZiA9IG1ab29tRmlsdGVyOwotICAgICAgICB9IGVsc2UgaWYgKGFuaW1hdGluZ1Njcm9sbCkgewotICAgICAgICAgICAgZGYgPSBtU2Nyb2xsRmlsdGVyOwotICAgICAgICB9Ci0gICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKGRmKTsKLSAgICAgICAgYm9vbGVhbiB0b29rVG9vTG9uZyA9IG5hdGl2ZURyYXdDb250ZW50KGNhbnZhcywgY29sb3IpOwotICAgICAgICBjYW52YXMuc2V0RHJhd0ZpbHRlcihudWxsKTsKLSAgICAgICAgaWYgKHRvb2tUb29Mb25nICYmIG1TcGxpdFBpY3R1cmVJc1NjaGVkdWxlZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgbVNwbGl0UGljdHVyZUlzU2NoZWR1bGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHNlbmRNZXNzYWdlKEV2ZW50SHViLlNQTElUX1BJQ1RVUkVfU0VUKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIGJvb2xlYW4gcGljdHVyZVJlYWR5KCkgewotICAgICAgICByZXR1cm4gMCAhPSBtTmF0aXZlQ2xhc3MgPyBuYXRpdmVQaWN0dXJlUmVhZHkoKSA6IGZhbHNlOwotICAgIH0KLQotICAgIC8qcGFja2FnZSovIHN5bmNocm9uaXplZCBQaWN0dXJlIGNvcHlDb250ZW50UGljdHVyZSgpIHsKLSAgICAgICAgUGljdHVyZSByZXN1bHQgPSBuZXcgUGljdHVyZSgpOwotICAgICAgICBpZiAoMCAhPSBtTmF0aXZlQ2xhc3MpIHsKLSAgICAgICAgICAgIG5hdGl2ZUNvcHlDb250ZW50VG9QaWN0dXJlKHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KICAgICBzdGF0aWMgdm9pZCByZWR1Y2VQcmlvcml0eSgpIHsKICAgICAgICAgLy8gcmVtb3ZlIHRoZSBwZW5kaW5nIFJFRFVDRV9QUklPUklUWSBhbmQgUkVTVU1FX1BSSU9SSVRZIG1lc3NhZ2VzCiAgICAgICAgIHNXZWJDb3JlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhXZWJDb3JlVGhyZWFkLlJFRFVDRV9QUklPUklUWSk7CkBAIC0xODE3LDYgKzE4NjIsOCBAQAogICAgICAgICAvLyBjYWxsZWQgZnJvbSBVSSB0aHJlYWQgd2hpbGUgV0VCS0lUX0RSQVcgaXMganVzdCBwdWxsZWQgb3V0IG9mIHRoZQogICAgICAgICAvLyBxdWV1ZSBpbiBXZWJDb3JlIHRocmVhZCB0byBiZSBleGVjdXRlZC4gVGhlbiB1cGRhdGUgd29uJ3QgYmUgYmxvY2tlZC4KICAgICAgICAgaWYgKGNvcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFjb3JlLmdldFNldHRpbmdzKCkuZW5hYmxlU21vb3RoVHJhbnNpdGlvbigpKSByZXR1cm47CisKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY29yZSkgewogICAgICAgICAgICAgICAgIGNvcmUubURyYXdJc1BhdXNlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgaWYgKGNvcmUubURyYXdJc1NjaGVkdWxlZCkgewpAQCAtMTgyOSwxMiArMTg3NiwxNiBAQAogCiAgICAgc3RhdGljIHZvaWQgcmVzdW1lVXBkYXRlUGljdHVyZShXZWJWaWV3Q29yZSBjb3JlKSB7CiAgICAgICAgIGlmIChjb3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGlmIG1EcmF3SXNQYXVzZWQgaXMgdHJ1ZSwgaWdub3JlIHRoZSBzZXR0aW5nLCBjb250aW51ZSB0byByZXN1bWUKKyAgICAgICAgICAgIGlmICghY29yZS5tRHJhd0lzUGF1c2VkCisgICAgICAgICAgICAgICAgICAgICYmICFjb3JlLmdldFNldHRpbmdzKCkuZW5hYmxlU21vb3RoVHJhbnNpdGlvbigpKSByZXR1cm47CisKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY29yZSkgewogICAgICAgICAgICAgICAgIGNvcmUubURyYXdJc1BhdXNlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChjb3JlLm1EcmF3SXNTY2hlZHVsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgY29yZS5tRHJhd0lzU2NoZWR1bGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGNvcmUuY29udGVudERyYXcoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gYWx3YXlzIHJlZHJhdyBvbiByZXN1bWUgdG8gcmVlbmFibGUgZ2lmIGFuaW1hdGlvbnMKKyAgICAgICAgICAgICAgICBjb3JlLm1EcmF3SXNTY2hlZHVsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb3JlLm5hdGl2ZUNvbnRlbnRJbnZhbGlkYXRlQWxsKCk7CisgICAgICAgICAgICAgICAgY29yZS5jb250ZW50RHJhdygpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTk3MSwyNCArMjAyMiw2IEBACiAgICAgICAgIG1SZXBhaW50U2NoZWR1bGVkID0gZmFsc2U7CiAgICAgfQogCi0gICAgLy8gY2FsbGVkIGJ5IEpOSQotICAgIHByaXZhdGUgdm9pZCBzZW5kSW1tZWRpYXRlUmVwYWludCgpIHsKLSAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwgJiYgIW1SZXBhaW50U2NoZWR1bGVkKSB7Ci0gICAgICAgICAgICBtUmVwYWludFNjaGVkdWxlZCA9IHRydWU7Ci0gICAgICAgICAgICBNZXNzYWdlLm9idGFpbihtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LklNTUVESUFURV9SRVBBSU5UX01TR19JRCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBjYWxsZWQgYnkgSk5JCi0gICAgcHJpdmF0ZSB2b2lkIHNldFJvb3RMYXllcihpbnQgbGF5ZXIpIHsKLSAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuU0VUX1JPT1RfTEFZRVJfTVNHX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIsIDApLnNlbmRUb1RhcmdldCgpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyogcGFja2FnZSAqLyBXZWJWaWV3IGdldFdlYlZpZXcoKSB7CiAgICAgICAgIHJldHVybiBtV2ViVmlldzsKICAgICB9CkBAIC0yMDA1LDE4ICsyMDM4LDI0IEBACiAKICAgICAgICAgaWYgKG1XZWJWaWV3ID09IG51bGwpIHJldHVybjsKIAotICAgICAgICBib29sZWFuIHVwZGF0ZVJlc3RvcmVTdGF0ZSA9IHN0YW5kYXJkTG9hZCB8fCBtUmVzdG9yZWRTY2FsZSA+IDA7Ci0gICAgICAgIHNldHVwVmlld3BvcnQodXBkYXRlUmVzdG9yZVN0YXRlKTsKKyAgICAgICAgYm9vbGVhbiB1cGRhdGVWaWV3U3RhdGUgPSBzdGFuZGFyZExvYWQgfHwgbVJlc3RvcmVkU2NhbGUgPiAwOworICAgICAgICBzZXR1cFZpZXdwb3J0KHVwZGF0ZVZpZXdTdGF0ZSk7CiAgICAgICAgIC8vIGlmIHVwZGF0ZVJlc3RvcmVTdGF0ZSBpcyB0cnVlLCBWaWV3TWFuYWdlci5wb3N0UmVhZHlUb0RyYXdBbGwoKSB3aWxsCi0gICAgICAgIC8vIGJlIGNhbGxlZCBhZnRlciB0aGUgV2ViVmlldyByZXN0b3JlIHRoZSBzdGF0ZS4gSWYgdXBkYXRlUmVzdG9yZVN0YXRlCisgICAgICAgIC8vIGJlIGNhbGxlZCBhZnRlciB0aGUgV2ViVmlldyB1cGRhdGVzIGl0cyBzdGF0ZS4gSWYgdXBkYXRlUmVzdG9yZVN0YXRlCiAgICAgICAgIC8vIGlzIGZhbHNlLCBzdGFydCB0byBkcmF3IG5vdyBhcyBpdCBpcyByZWFkeS4KLSAgICAgICAgaWYgKCF1cGRhdGVSZXN0b3JlU3RhdGUpIHsKKyAgICAgICAgaWYgKCF1cGRhdGVWaWV3U3RhdGUpIHsKICAgICAgICAgICAgIG1XZWJWaWV3Lm1WaWV3TWFuYWdlci5wb3N0UmVhZHlUb0RyYXdBbGwoKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIHJlbW92ZSB0aGUgdG91Y2ggaGlnaGxpZ2h0IHdoZW4gbW92aW5nIHRvIGEgbmV3IHBhZ2UKKyAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICBtRXZlbnRIdWIuc2VuZE1lc3NhZ2UoTWVzc2FnZS5vYnRhaW4obnVsbCwKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRIdWIuUkVNT1ZFX1RPVUNIX0hJR0hMSUdIVF9SRUNUUykpOworICAgICAgICB9CisKICAgICAgICAgLy8gcmVzZXQgdGhlIHNjcm9sbCBwb3NpdGlvbiwgdGhlIHJlc3RvcmVkIG9mZnNldCBhbmQgc2NhbGVzCiAgICAgICAgIG1XZWJraXRTY3JvbGxYID0gbVdlYmtpdFNjcm9sbFkgPSBtUmVzdG9yZWRYID0gbVJlc3RvcmVkWQotICAgICAgICAgICAgICAgID0gbVJlc3RvcmVkU2NhbGUgPSBtUmVzdG9yZWRTY3JlZW5XaWR0aFNjYWxlID0gMDsKKyAgICAgICAgICAgICAgICA9IG1SZXN0b3JlZFNjYWxlID0gbVJlc3RvcmVkVGV4dFdyYXBTY2FsZSA9IDA7CiAgICAgfQogCiAgICAgLy8gY2FsbGVkIGJ5IEpOSQpAQCAtMjAzMCwxNSArMjA2OSwxNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwVmlld3BvcnQoYm9vbGVhbiB1cGRhdGVSZXN0b3JlU3RhdGUpIHsKKyAgICBwcml2YXRlIHZvaWQgc2V0dXBWaWV3cG9ydChib29sZWFuIHVwZGF0ZVZpZXdTdGF0ZSkgewogICAgICAgICAvLyBzZXQgdGhlIHZpZXdwb3J0IHNldHRpbmdzIGZyb20gV2ViS2l0CiAgICAgICAgIHNldFZpZXdwb3J0U2V0dGluZ3NGcm9tTmF0aXZlKCk7CiAKICAgICAgICAgLy8gYWRqdXN0IHRoZSBkZWZhdWx0IHNjYWxlIHRvIG1hdGNoIHRoZSBkZW5zaXR5RHBpCiAgICAgICAgIGZsb2F0IGFkanVzdCA9IDEuMGY7CiAgICAgICAgIGlmIChtVmlld3BvcnREZW5zaXR5RHBpID09IC0xKSB7Ci0gICAgICAgICAgICBpZiAoV2ViVmlldy5ERUZBVUxUX1NDQUxFX1BFUkNFTlQgIT0gMTAwKSB7Ci0gICAgICAgICAgICAgICAgYWRqdXN0ID0gV2ViVmlldy5ERUZBVUxUX1NDQUxFX1BFUkNFTlQgLyAxMDAuMGY7CisgICAgICAgICAgICAvLyBjb252ZXJ0IGRlZmF1bHQgem9vbSBzY2FsZSB0byBhIGludGVnZXIgKHBlcmNlbnRhZ2UpIHRvIGF2b2lkIGFueQorICAgICAgICAgICAgLy8gaXNzdWVzIHdpdGggZmxvYXRpbmcgcG9pbnQgY29tcGFyaXNvbnMKKyAgICAgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsICYmIChpbnQpKG1XZWJWaWV3LmdldERlZmF1bHRab29tU2NhbGUoKSAqIDEwMCkgIT0gMTAwKSB7CisgICAgICAgICAgICAgICAgYWRqdXN0ID0gbVdlYlZpZXcuZ2V0RGVmYXVsdFpvb21TY2FsZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG1WaWV3cG9ydERlbnNpdHlEcGkgPiAwKSB7CiAgICAgICAgICAgICBhZGp1c3QgPSAoZmxvYXQpIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eURwaQpAQCAtMjA4MCwxNyArMjEyMSwxNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gaWYgbVZpZXdwb3J0V2lkdGggaXMgMCwgaXQgbWVhbnMgZGV2aWNlLXdpZHRoLCBhbHdheXMgdXBkYXRlLgotICAgICAgICBpZiAobVZpZXdwb3J0V2lkdGggIT0gMCAmJiAhdXBkYXRlUmVzdG9yZVN0YXRlKSB7Ci0gICAgICAgICAgICBSZXN0b3JlU3RhdGUgcmVzdG9yZVN0YXRlID0gbmV3IFJlc3RvcmVTdGF0ZSgpOwotICAgICAgICAgICAgcmVzdG9yZVN0YXRlLm1NaW5TY2FsZSA9IG1WaWV3cG9ydE1pbmltdW1TY2FsZSAvIDEwMC4wZjsKLSAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tTWF4U2NhbGUgPSBtVmlld3BvcnRNYXhpbXVtU2NhbGUgLyAxMDAuMGY7Ci0gICAgICAgICAgICByZXN0b3JlU3RhdGUubURlZmF1bHRTY2FsZSA9IGFkanVzdDsKKyAgICAgICAgaWYgKG1WaWV3cG9ydFdpZHRoICE9IDAgJiYgIXVwZGF0ZVZpZXdTdGF0ZSkgeworICAgICAgICAgICAgVmlld1N0YXRlIHZpZXdTdGF0ZSA9IG5ldyBWaWV3U3RhdGUoKTsKKyAgICAgICAgICAgIHZpZXdTdGF0ZS5tTWluU2NhbGUgPSBtVmlld3BvcnRNaW5pbXVtU2NhbGUgLyAxMDAuMGY7CisgICAgICAgICAgICB2aWV3U3RhdGUubU1heFNjYWxlID0gbVZpZXdwb3J0TWF4aW11bVNjYWxlIC8gMTAwLjBmOworICAgICAgICAgICAgdmlld1N0YXRlLm1EZWZhdWx0U2NhbGUgPSBhZGp1c3Q7CiAgICAgICAgICAgICAvLyBhcyBtVmlld3BvcnRXaWR0aCBpcyBub3QgMCwgaXQgaXMgbm90IG1vYmlsZSBzaXRlLgotICAgICAgICAgICAgcmVzdG9yZVN0YXRlLm1Nb2JpbGVTaXRlID0gZmFsc2U7CisgICAgICAgICAgICB2aWV3U3RhdGUubU1vYmlsZVNpdGUgPSBmYWxzZTsKICAgICAgICAgICAgIC8vIGZvciBub24tbW9iaWxlIHNpdGUsIHdlIGRvbid0IG5lZWQgbWluUHJlZldpZHRoLCBzZXQgaXQgYXMgMAotICAgICAgICAgICAgcmVzdG9yZVN0YXRlLm1TY3JvbGxYID0gMDsKKyAgICAgICAgICAgIHZpZXdTdGF0ZS5tU2Nyb2xsWCA9IDA7CiAgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuVVBEQVRFX1pPT01fUkFOR0UsIHJlc3RvcmVTdGF0ZSkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuVVBEQVRFX1pPT01fUkFOR0UsIHZpZXdTdGF0ZSkuc2VuZFRvVGFyZ2V0KCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMjExMSwzMiArMjE1MiwzMSBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgd2ViVmlld1dpZHRoID0gTWF0aC5yb3VuZCh2aWV3cG9ydFdpZHRoICogbUN1cnJlbnRWaWV3U2NhbGUpOwogICAgICAgICB9Ci0gICAgICAgIG1SZXN0b3JlU3RhdGUgPSBuZXcgUmVzdG9yZVN0YXRlKCk7Ci0gICAgICAgIG1SZXN0b3JlU3RhdGUubU1pblNjYWxlID0gbVZpZXdwb3J0TWluaW11bVNjYWxlIC8gMTAwLjBmOwotICAgICAgICBtUmVzdG9yZVN0YXRlLm1NYXhTY2FsZSA9IG1WaWV3cG9ydE1heGltdW1TY2FsZSAvIDEwMC4wZjsKLSAgICAgICAgbVJlc3RvcmVTdGF0ZS5tRGVmYXVsdFNjYWxlID0gYWRqdXN0OwotICAgICAgICBtUmVzdG9yZVN0YXRlLm1TY3JvbGxYID0gbVJlc3RvcmVkWDsKLSAgICAgICAgbVJlc3RvcmVTdGF0ZS5tU2Nyb2xsWSA9IG1SZXN0b3JlZFk7Ci0gICAgICAgIG1SZXN0b3JlU3RhdGUubU1vYmlsZVNpdGUgPSAoMCA9PSBtVmlld3BvcnRXaWR0aCk7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlID0gbmV3IFZpZXdTdGF0ZSgpOworICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tTWluU2NhbGUgPSBtVmlld3BvcnRNaW5pbXVtU2NhbGUgLyAxMDAuMGY7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1NYXhTY2FsZSA9IG1WaWV3cG9ydE1heGltdW1TY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubURlZmF1bHRTY2FsZSA9IGFkanVzdDsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVNjcm9sbFggPSBtUmVzdG9yZWRYOworICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tU2Nyb2xsWSA9IG1SZXN0b3JlZFk7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1Nb2JpbGVTaXRlID0gKDAgPT0gbVZpZXdwb3J0V2lkdGgpOwogICAgICAgICBpZiAobVJlc3RvcmVkU2NhbGUgPiAwKSB7Ci0gICAgICAgICAgICBtUmVzdG9yZVN0YXRlLm1WaWV3U2NhbGUgPSBtUmVzdG9yZWRTY2FsZSAvIDEwMC4wZjsKLSAgICAgICAgICAgIGlmIChtUmVzdG9yZWRTY3JlZW5XaWR0aFNjYWxlID4gMCkgewotICAgICAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc3RvcmVkU2NyZWVuV2lkdGhTY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGUgPSBtUmVzdG9yZWRTY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgICAgIGlmIChtUmVzdG9yZWRUZXh0V3JhcFNjYWxlID4gMCkgeworICAgICAgICAgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlID0gbVJlc3RvcmVkVGV4dFdyYXBTY2FsZSAvIDEwMC4wZjsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9IG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZTsKKyAgICAgICAgICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9IG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobVZpZXdwb3J0SW5pdGlhbFNjYWxlID4gMCkgewotICAgICAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZSA9IG1SZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGUgPQorICAgICAgICAgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGUgPSBtSW5pdGlhbFZpZXdTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmlld3BvcnRJbml0aWFsU2NhbGUgLyAxMDAuMGY7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1WaWV3cG9ydFdpZHRoID4gMCAmJiBtVmlld3BvcnRXaWR0aCA8IHdlYlZpZXdXaWR0aCkgewotICAgICAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZSA9IG1SZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGUgPQorICAgICAgICAgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGUgPSBtSW5pdGlhbFZpZXdTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpIHdlYlZpZXdXaWR0aCAvIG1WaWV3cG9ydFdpZHRoOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlID0gYWRqdXN0OworICAgICAgICAgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlID0gYWRqdXN0OwogICAgICAgICAgICAgICAgIC8vIDAgd2lsbCB0cmlnZ2VyIFdlYlZpZXcgdG8gdHVybiBvbiB6b29tIG92ZXJ2aWV3IG1vZGUKLSAgICAgICAgICAgICAgICBtUmVzdG9yZVN0YXRlLm1WaWV3U2NhbGUgPSAwOworICAgICAgICAgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGUgPSAwOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTIxNzcsMTUgKzIyMTcsMTUgQEAKICAgICAgICAgICAgICAgICAvLyBtVmlld1NjYWxlIGFzIDAgbWVhbnMgaXQgaXMgaW4gem9vbSBvdmVydmlldyBtb2RlLiBTbyB3ZSBkb24ndAogICAgICAgICAgICAgICAgIC8vIGtub3cgdGhlIGV4YWN0IHNjYWxlLiBJZiBtUmVzdG9yZWRTY2FsZSBpcyBub24temVybywgdXNlIGl0OwogICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBqdXN0IHVzZSBtVGV4dFdyYXBTY2FsZSBhcyB0aGUgaW5pdGlhbCBzY2FsZS4KLSAgICAgICAgICAgICAgICBkYXRhLm1TY2FsZSA9IG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZSA9PSAwCisgICAgICAgICAgICAgICAgZGF0YS5tU2NhbGUgPSBtSW5pdGlhbFZpZXdTdGF0ZS5tVmlld1NjYWxlID09IDAKICAgICAgICAgICAgICAgICAgICAgICAgID8gKG1SZXN0b3JlZFNjYWxlID4gMCA/IG1SZXN0b3JlZFNjYWxlIC8gMTAwLjBmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBtSW5pdGlhbFZpZXdTdGF0ZS5tVmlld1NjYWxlOwogICAgICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXX0NPUkUpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAic2V0dXBWaWV3cG9ydCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1SZXN0b3JlZFNjYWxlPSIgKyBtUmVzdG9yZWRTY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbVZpZXdTY2FsZT0iICsgbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVGV4dFdyYXBTY2FsZT0iICsgbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbVZpZXdTY2FsZT0iICsgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbVRleHRXcmFwU2NhbGU9IiArIG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGRhdGEubVdpZHRoID0gTWF0aC5yb3VuZCh3ZWJWaWV3V2lkdGggLyBkYXRhLm1TY2FsZSk7CkBAIC0yMTk4LDcgKzIyMzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZChtV2ViVmlldy5nZXRWaWV3SGVpZ2h0KCkgLyBkYXRhLm1TY2FsZSkKICAgICAgICAgICAgICAgICAgICAgICAgIDogbUN1cnJlbnRWaWV3SGVpZ2h0ICogZGF0YS5tV2lkdGggLyB2aWV3cG9ydFdpZHRoOwogICAgICAgICAgICAgICAgIGRhdGEubVRleHRXcmFwV2lkdGggPSBNYXRoLnJvdW5kKHdlYlZpZXdXaWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgLyBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUpOwogICAgICAgICAgICAgICAgIGRhdGEubUlnbm9yZUhlaWdodCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGRhdGEubUFuY2hvclggPSBkYXRhLm1BbmNob3JZID0gMDsKICAgICAgICAgICAgICAgICAvLyBzZW5kIFZJRVdfU0laRV9DSEFOR0VEIHRvIHRoZSBmcm9udCBvZiB0aGUgcXVldWUgc28gdGhhdCB3ZQpAQCAtMjIxMSwyMCArMjI1MSwxMiBAQAogICAgIH0KIAogICAgIC8vIGNhbGxlZCBieSBKTkkKLSAgICBwcml2YXRlIHZvaWQgcmVzdG9yZVNjYWxlKGludCBzY2FsZSkgeworICAgIHByaXZhdGUgdm9pZCByZXN0b3JlU2NhbGUoaW50IHNjYWxlLCBpbnQgdGV4dFdyYXBTY2FsZSkgewogICAgICAgICBpZiAobUJyb3dzZXJGcmFtZS5maXJzdExheW91dERvbmUoKSA9PSBmYWxzZSkgewogICAgICAgICAgICAgbVJlc3RvcmVkU2NhbGUgPSBzY2FsZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGNhbGxlZCBieSBKTkkKLSAgICBwcml2YXRlIHZvaWQgcmVzdG9yZVNjcmVlbldpZHRoU2NhbGUoaW50IHNjYWxlKSB7Ci0gICAgICAgIGlmICghbVNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUJyb3dzZXJGcmFtZS5maXJzdExheW91dERvbmUoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgbVJlc3RvcmVkU2NyZWVuV2lkdGhTY2FsZSA9IHNjYWxlOworICAgICAgICAgICAgaWYgKG1TZXR0aW5ncy5nZXRVc2VXaWRlVmlld1BvcnQoKSkgeworICAgICAgICAgICAgICAgIG1SZXN0b3JlZFRleHRXcmFwU2NhbGUgPSB0ZXh0V3JhcFNjYWxlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0yNDYyLDYgKzI0OTQsMjQgQEAKICAgICAgICAgICAgICAgICBoTW9kZSwgdk1vZGUpLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCB1c2VNb2NrRGV2aWNlT3JpZW50YXRpb24oKSB7CisgICAgICAgIG1EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIudXNlTW9jaygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgbURldmljZU9yaWVudGF0aW9uTWFuYWdlci5zZXRNb2NrT3JpZW50YXRpb24oY2FuUHJvdmlkZUFscGhhLCBhbHBoYSwgY2FuUHJvdmlkZUJldGEsIGJldGEsCisgICAgICAgICAgICAgICAgY2FuUHJvdmlkZUdhbW1hLCBnYW1tYSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIERldmljZU9yaWVudGF0aW9uU2VydmljZSBnZXREZXZpY2VPcmllbnRhdGlvblNlcnZpY2UoKSB7CisgICAgICAgIGlmIChtRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgIG1EZXZpY2VPcmllbnRhdGlvblNlcnZpY2UgPQorICAgICAgICAgICAgICAgICAgICBuZXcgRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlKG1EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIsIG1Db250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURldmljZU9yaWVudGF0aW9uU2VydmljZTsKKyAgICB9CisKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVBhdXNlKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVSZXN1bWUoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUZyZWVNZW1vcnkoKTsKQEAgLTI0NjksNCArMjUxOSw2IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVWYWxpZE5vZGVBbmRCb3VuZHMoaW50IGZyYW1lLCBpbnQgbm9kZSwKICAgICAgICAgICAgIFJlY3QgYm91bmRzKTsKIAorICAgIHByaXZhdGUgbmF0aXZlIEFycmF5TGlzdDxSZWN0PiBuYXRpdmVHZXRUb3VjaEhpZ2hsaWdodFJlY3RzKGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgIGludCBzbG9wKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3RGF0YWJhc2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3RGF0YWJhc2UuamF2YQppbmRleCA3YWNkOWJhLi5kN2I0NDUyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0RhdGFiYXNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdEYXRhYmFzZS5qYXZhCkBAIC0xNzMsMTEyICsxNzMsMTQwIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBpbnQgbUNhY2hlVHJhbnNhY3Rpb25SZWZjb3VudDsKIAotICAgIHByaXZhdGUgV2ViVmlld0RhdGFiYXNlKCkgeworICAgIC8vIEluaXRpYWxseSB0cnVlIHVudGlsIHRoZSBiYWNrZ3JvdW5kIHRocmVhZCBjb21wbGV0ZXMuCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBXZWJWaWV3RGF0YWJhc2UoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBpbml0KGNvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICB9LnN0YXJ0KCk7CisKICAgICAgICAgLy8gU2luZ2xldG9uIG9ubHksIHVzZSBnZXRJbnN0YW5jZSgpCiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgV2ViVmlld0RhdGFiYXNlIGdldEluc3RhbmNlKENvbnRleHQgY29udGV4dCkgewogICAgICAgICBpZiAobUluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBXZWJWaWV3RGF0YWJhc2UoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlID0gY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PckNyZWF0ZURhdGFiYXNlKERBVEFCQVNFX0ZJTEUsIDAsIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyB0cnkgYWdhaW4gYnkgZGVsZXRpbmcgdGhlIG9sZCBkYiBhbmQgY3JlYXRlIGEgbmV3IG9uZQotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmRlbGV0ZURhdGFiYXNlKERBVEFCQVNFX0ZJTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoREFUQUJBU0VfRklMRSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgV2ViVmlld0RhdGFiYXNlKGNvbnRleHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgfQogCi0gICAgICAgICAgICAvLyBtRGF0YWJhc2Ugc2hvdWxkIG5vdCBiZSBudWxsLCAKLSAgICAgICAgICAgIC8vIHRoZSBvbmx5IGNhc2UgaXMgUmVxdWVzdEFQSSB0ZXN0IGhhcyBwcm9ibGVtIHRvIGNyZWF0ZSBkYiAKLSAgICAgICAgICAgIGlmIChtRGF0YWJhc2UgIT0gbnVsbCAmJiBtRGF0YWJhc2UuZ2V0VmVyc2lvbigpICE9IERBVEFCQVNFX1ZFUlNJT04pIHsKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZ3JhZGVEYXRhYmFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChtRGF0YWJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHVzZSBwZXIgdGFibGUgTXV0ZXggbG9jaywgdHVybiBvZmYgZGF0YWJhc2UgbG9jaywgdGhpcwotICAgICAgICAgICAgICAgIC8vIGltcHJvdmVzIHBlcmZvcm1hbmNlIGFzIGRhdGFiYXNlJ3MgUmVlbnRyYW50TG9jayBpcyBleHBhbnNpdmUKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0TG9ja2luZ0VuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIENBQ0hFX0RBVEFCQVNFX0ZJTEUsIDAsIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyB0cnkgYWdhaW4gYnkgZGVsZXRpbmcgdGhlIG9sZCBkYiBhbmQgY3JlYXRlIGEgbmV3IG9uZQotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmRlbGV0ZURhdGFiYXNlKENBQ0hFX0RBVEFCQVNFX0ZJTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRV9EQVRBQkFTRV9GSUxFLCAwLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG1DYWNoZURhdGFiYXNlIHNob3VsZCBub3QgYmUgbnVsbCwgCi0gICAgICAgICAgICAvLyB0aGUgb25seSBjYXNlIGlzIFJlcXVlc3RBUEkgdGVzdCBoYXMgcHJvYmxlbSB0byBjcmVhdGUgZGIgCi0gICAgICAgICAgICBpZiAobUNhY2hlRGF0YWJhc2UgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBtQ2FjaGVEYXRhYmFzZS5nZXRWZXJzaW9uKCkgIT0gQ0FDSEVfREFUQUJBU0VfVkVSU0lPTikgewotICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB1cGdyYWRlQ2FjaGVEYXRhYmFzZSgpOwotICAgICAgICAgICAgICAgICAgICBib290c3RyYXBDYWNoZURhdGFiYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIEVyYXNlIHRoZSBmaWxlcyBmcm9tIHRoZSBmaWxlIHN5c3RlbSBpbiB0aGUgCi0gICAgICAgICAgICAgICAgLy8gY2FzZSB0aGF0IHRoZSBkYXRhYmFzZSB3YXMgdXBkYXRlZCBhbmQgdGhlIAotICAgICAgICAgICAgICAgIC8vIHRoZXJlIHdlcmUgZXhpc3RpbmcgY2FjaGUgY29udGVudAotICAgICAgICAgICAgICAgIENhY2hlTWFuYWdlci5yZW1vdmVBbGxDYWNoZUZpbGVzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtQ2FjaGVEYXRhYmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gdXNlIHJlYWRfdW5jb21taXR0ZWQgdG8gc3BlZWQgdXAgUkVBRAotICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmV4ZWNTUUwoIlBSQUdNQSByZWFkX3VuY29tbWl0dGVkID0gdHJ1ZTsiKTsKLSAgICAgICAgICAgICAgICAvLyBhcyBvbmx5IFJFQUQgY2FuIGJlIGNhbGxlZCBpbiB0aGUgbm9uLVdlYlZpZXdXb3JrZXJUaHJlYWQsCi0gICAgICAgICAgICAgICAgLy8gYW5kIHJlYWRfdW5jb21taXR0ZWQgaXMgdXNlZCwgd2UgY2FuIHR1cm4gb2ZmIGRhdGFiYXNlIGxvY2sKLSAgICAgICAgICAgICAgICAvLyB0byB1c2UgdHJhbnNhY3Rpb24uCi0gICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2Uuc2V0TG9ja2luZ0VuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgLy8gdXNlIEluc2VydEhlbHBlciBmb3IgZmFzdGVyIGluc2VydGlvbgotICAgICAgICAgICAgICAgIG1DYWNoZUluc2VydGVyID0gbmV3IERhdGFiYXNlVXRpbHMuSW5zZXJ0SGVscGVyKG1DYWNoZURhdGFiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlIik7Ci0gICAgICAgICAgICAgICAgbUNhY2hlVXJsQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX1VSTF9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUZpbGVQYXRoQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0ZJTEVfUEFUSF9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUxhc3RNb2RpZnlDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfTEFTVF9NT0RJRllfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVFVGFnQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VUQUdfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVFeHBpcmVzQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VYUElSRVNfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVFeHBpcmVzU3RyaW5nQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VYUElSRVNfU1RSSU5HX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlTWltZVR5cGVDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfTUlNRVRZUEVfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVFbmNvZGluZ0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FTkNPRElOR19DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUh0dHBTdGF0dXNDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfSFRUUF9TVEFUVVNfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVMb2NhdGlvbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9MT0NBVElPTl9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUNvbnRlbnRMZW5ndGhDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfQ09OVEVOVExFTkdUSF9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUNvbnRlbnREaXNwb3NpdGlvbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DT05URU5URElTUE9TSVRJT05fQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVDcm9zc0RvbWFpbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DUk9TU0RPTUFJTl9DT0wpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShEQVRBQkFTRV9GSUxFLCAwLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHRyeSBhZ2FpbiBieSBkZWxldGluZyB0aGUgb2xkIGRiIGFuZCBjcmVhdGUgYSBuZXcgb25lCisgICAgICAgICAgICBpZiAoY29udGV4dC5kZWxldGVEYXRhYmFzZShEQVRBQkFTRV9GSUxFKSkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoREFUQUJBU0VfRklMRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgLy8gbURhdGFiYXNlIHNob3VsZCBub3QgYmUgbnVsbCwKKyAgICAgICAgLy8gdGhlIG9ubHkgY2FzZSBpcyBSZXF1ZXN0QVBJIHRlc3QgaGFzIHByb2JsZW0gdG8gY3JlYXRlIGRiCisgICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG5vdGlmeSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EYXRhYmFzZS5nZXRWZXJzaW9uKCkgIT0gREFUQUJBU0VfVkVSU0lPTikgeworICAgICAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdXBncmFkZURhdGFiYXNlKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHVzZSBwZXIgdGFibGUgTXV0ZXggbG9jaywgdHVybiBvZmYgZGF0YWJhc2UgbG9jaywgdGhpcworICAgICAgICAvLyBpbXByb3ZlcyBwZXJmb3JtYW5jZSBhcyBkYXRhYmFzZSdzIFJlZW50cmFudExvY2sgaXMKKyAgICAgICAgLy8gZXhwYW5zaXZlCisgICAgICAgIG1EYXRhYmFzZS5zZXRMb2NraW5nRW5hYmxlZChmYWxzZSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZSgKKyAgICAgICAgICAgICAgICAgICAgQ0FDSEVfREFUQUJBU0VfRklMRSwgMCwgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyB0cnkgYWdhaW4gYnkgZGVsZXRpbmcgdGhlIG9sZCBkYiBhbmQgY3JlYXRlIGEgbmV3IG9uZQorICAgICAgICAgICAgaWYgKGNvbnRleHQuZGVsZXRlRGF0YWJhc2UoQ0FDSEVfREFUQUJBU0VfRklMRSkpIHsKKyAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRV9EQVRBQkFTRV9GSUxFLCAwLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG1DYWNoZURhdGFiYXNlIHNob3VsZCBub3QgYmUgbnVsbCwKKyAgICAgICAgLy8gdGhlIG9ubHkgY2FzZSBpcyBSZXF1ZXN0QVBJIHRlc3QgaGFzIHByb2JsZW0gdG8gY3JlYXRlIGRiCisgICAgICAgIGlmIChtQ2FjaGVEYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobUNhY2hlRGF0YWJhc2UuZ2V0VmVyc2lvbigpICE9IENBQ0hFX0RBVEFCQVNFX1ZFUlNJT04pIHsKKyAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdXBncmFkZUNhY2hlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgICAgICBib290c3RyYXBDYWNoZURhdGFiYXNlKCk7CisgICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBFcmFzZSB0aGUgZmlsZXMgZnJvbSB0aGUgZmlsZSBzeXN0ZW0gaW4gdGhlCisgICAgICAgICAgICAvLyBjYXNlIHRoYXQgdGhlIGRhdGFiYXNlIHdhcyB1cGRhdGVkIGFuZCB0aGUKKyAgICAgICAgICAgIC8vIHRoZXJlIHdlcmUgZXhpc3RpbmcgY2FjaGUgY29udGVudAorICAgICAgICAgICAgQ2FjaGVNYW5hZ2VyLnJlbW92ZUFsbENhY2hlRmlsZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVzZSByZWFkX3VuY29tbWl0dGVkIHRvIHNwZWVkIHVwIFJFQUQKKyAgICAgICAgbUNhY2hlRGF0YWJhc2UuZXhlY1NRTCgiUFJBR01BIHJlYWRfdW5jb21taXR0ZWQgPSB0cnVlOyIpOworICAgICAgICAvLyBhcyBvbmx5IFJFQUQgY2FuIGJlIGNhbGxlZCBpbiB0aGUKKyAgICAgICAgLy8gbm9uLVdlYlZpZXdXb3JrZXJUaHJlYWQsIGFuZCByZWFkX3VuY29tbWl0dGVkIGlzIHVzZWQsCisgICAgICAgIC8vIHdlIGNhbiB0dXJuIG9mZiBkYXRhYmFzZSBsb2NrIHRvIHVzZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgbUNhY2hlRGF0YWJhc2Uuc2V0TG9ja2luZ0VuYWJsZWQoZmFsc2UpOworCisgICAgICAgIC8vIHVzZSBJbnNlcnRIZWxwZXIgZm9yIGZhc3RlciBpbnNlcnRpb24KKyAgICAgICAgbUNhY2hlSW5zZXJ0ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBEYXRhYmFzZVV0aWxzLkluc2VydEhlbHBlcihtQ2FjaGVEYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZSIpOworICAgICAgICBtQ2FjaGVVcmxDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX1VSTF9DT0wpOworICAgICAgICBtQ2FjaGVGaWxlUGF0aENvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRklMRV9QQVRIX0NPTCk7CisgICAgICAgIG1DYWNoZUxhc3RNb2RpZnlDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0xBU1RfTU9ESUZZX0NPTCk7CisgICAgICAgIG1DYWNoZUVUYWdDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VUQUdfQ09MKTsKKyAgICAgICAgbUNhY2hlRXhwaXJlc0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRVhQSVJFU19DT0wpOworICAgICAgICBtQ2FjaGVFeHBpcmVzU3RyaW5nQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FWFBJUkVTX1NUUklOR19DT0wpOworICAgICAgICBtQ2FjaGVNaW1lVHlwZUNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfTUlNRVRZUEVfQ09MKTsKKyAgICAgICAgbUNhY2hlRW5jb2RpbmdDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VOQ09ESU5HX0NPTCk7CisgICAgICAgIG1DYWNoZUh0dHBTdGF0dXNDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0hUVFBfU1RBVFVTX0NPTCk7CisgICAgICAgIG1DYWNoZUxvY2F0aW9uQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9MT0NBVElPTl9DT0wpOworICAgICAgICBtQ2FjaGVDb250ZW50TGVuZ3RoQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DT05URU5UTEVOR1RIX0NPTCk7CisgICAgICAgIG1DYWNoZUNvbnRlbnREaXNwb3NpdGlvbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfQ09OVEVOVERJU1BPU0lUSU9OX0NPTCk7CisgICAgICAgIG1DYWNoZUNyb3NzRG9tYWluQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DUk9TU0RPTUFJTl9DT0wpOworCisgICAgICAgIC8vIFRocmVhZCBkb25lLCBub3RpZnkuCisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgIG5vdGlmeSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdXBncmFkZURhdGFiYXNlKCkgewpAQCAtMzkxLDggKzQxOSwyNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gV2FpdCBmb3IgdGhlIGJhY2tncm91bmQgaW5pdGlhbGl6YXRpb24gdGhyZWFkIHRvIGNvbXBsZXRlIGFuZCBjaGVjayB0aGUKKyAgICAvLyBkYXRhYmFzZSBjcmVhdGlvbiBzdGF0dXMuCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrSW5pdGlhbGl6ZWQoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgd2hpbGUgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3YWl0KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJDYXVnaHQgZXhjZXB0aW9uIHdoaWxlIGNoZWNraW5nICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0aWFsaXphdGlvbiIpOworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1EYXRhYmFzZSAhPSBudWxsOworICAgIH0KKwogICAgIHByaXZhdGUgYm9vbGVhbiBoYXNFbnRyaWVzKGludCB0YWJsZUlkKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKQEAgLTQyMiw3ICs0NjcsNyBAQAogICAgICAqLwogICAgIEFycmF5TGlzdDxDb29raWU+IGdldENvb2tpZXNGb3JEb21haW4oU3RyaW5nIGRvbWFpbikgewogICAgICAgICBBcnJheUxpc3Q8Q29va2llPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxDb29raWU+KCk7Ci0gICAgICAgIGlmIChkb21haW4gPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoZG9tYWluID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CiAgICAgICAgIH0KIApAQCAtNDgxLDcgKzUyNiw3IEBACiAgICAgICogICAgICAgICAgICBkZWxldGVkLgogICAgICAqLwogICAgIHZvaWQgZGVsZXRlQ29va2llcyhTdHJpbmcgZG9tYWluLCBTdHJpbmcgcGF0aCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNTAxLDcgKzU0Niw3IEBACiAgICAgICovCiAgICAgdm9pZCBhZGRDb29raWUoQ29va2llIGNvb2tpZSkgewogICAgICAgICBpZiAoY29va2llLmRvbWFpbiA9PSBudWxsIHx8IGNvb2tpZS5wYXRoID09IG51bGwgfHwgY29va2llLm5hbWUgPT0gbnVsbAotICAgICAgICAgICAgICAgIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTUzNCw3ICs1NzksNyBAQAogICAgICAqIENsZWFyIGNvb2tpZSBkYXRhYmFzZQogICAgICAqLwogICAgIHZvaWQgY2xlYXJDb29raWVzKCkgewotICAgICAgICBpZiAobURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC01NDcsNyArNTkyLDcgQEAKICAgICAgKiBDbGVhciBzZXNzaW9uIGNvb2tpZXMsIHdoaWNoIG1lYW5zIGNvb2tpZSBkb2Vzbid0IGhhdmUgRVhQSVJFUy4KICAgICAgKi8KICAgICB2b2lkIGNsZWFyU2Vzc2lvbkNvb2tpZXMoKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTU2NCw3ICs2MDksNyBAQAogICAgICAqIEBwYXJhbSBub3cgVGltZSBmb3Igbm93CiAgICAgICovCiAgICAgdm9pZCBjbGVhckV4cGlyZWRDb29raWVzKGxvbmcgbm93KSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTYyMCw3ICs2NjUsNyBAQAogICAgICAqIEByZXR1cm4gQ2FjaGVSZXN1bHQgVGhlIENhY2hlTWFuYWdlci5DYWNoZVJlc3VsdAogICAgICAqLwogICAgIENhY2hlUmVzdWx0IGdldENhY2hlKFN0cmluZyB1cmwpIHsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IG1DYWNoZURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKQEAgLTY2MCw3ICs3MDUsNyBAQAogICAgICAqIEBwYXJhbSB1cmwgVGhlIHVybAogICAgICAqLwogICAgIHZvaWQgcmVtb3ZlQ2FjaGUoU3RyaW5nIHVybCkgewotICAgICAgICBpZiAodXJsID09IG51bGwgfHwgbUNhY2hlRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTY3NCw3ICs3MTksNyBAQAogICAgICAqIEBwYXJhbSBjIFRoZSBDYWNoZU1hbmFnZXIuQ2FjaGVSZXN1bHQKICAgICAgKi8KICAgICB2b2lkIGFkZENhY2hlKFN0cmluZyB1cmwsIENhY2hlUmVzdWx0IGMpIHsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IG1DYWNoZURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC03MDAsNyArNzQ1LDcgQEAKICAgICAgKiBDbGVhciBjYWNoZSBkYXRhYmFzZQogICAgICAqLwogICAgIHZvaWQgY2xlYXJDYWNoZSgpIHsKLSAgICAgICAgaWYgKG1DYWNoZURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC03MDgsNyArNzUzLDcgQEAKICAgICB9CiAKICAgICBib29sZWFuIGhhc0NhY2hlKCkgewotICAgICAgICBpZiAobUNhY2hlRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKQEAgLTgzNCw3ICs4NzksNyBAQAogICAgICAqLwogICAgIHZvaWQgc2V0VXNlcm5hbWVQYXNzd29yZChTdHJpbmcgc2NoZW1lUGx1c0hvc3QsIFN0cmluZyB1c2VybmFtZSwKICAgICAgICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgaWYgKHNjaGVtZVBsdXNIb3N0ID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHNjaGVtZVBsdXNIb3N0ID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTg1Niw3ICs5MDEsNyBAQAogICAgICAqICAgICAgICAgU3RyaW5nWzFdIGlzIHBhc3N3b3JkLiBSZXR1cm4gbnVsbCBpZiBpdCBjYW4ndCBmaW5kIGFueXRoaW5nLgogICAgICAqLwogICAgIFN0cmluZ1tdIGdldFVzZXJuYW1lUGFzc3dvcmQoU3RyaW5nIHNjaGVtZVBsdXNIb3N0KSB7Ci0gICAgICAgIGlmIChzY2hlbWVQbHVzSG9zdCA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChzY2hlbWVQbHVzSG9zdCA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKQEAgLTkwMiw3ICs5NDcsNyBAQAogICAgICAqIENsZWFyIHBhc3N3b3JkIGRhdGFiYXNlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJVc2VybmFtZVBhc3N3b3JkKCkgewotICAgICAgICBpZiAobURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC05MjcsNyArOTcyLDcgQEAKICAgICAgKi8KICAgICB2b2lkIHNldEh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZChTdHJpbmcgaG9zdCwgU3RyaW5nIHJlYWxtLCBTdHJpbmcgdXNlcm5hbWUsCiAgICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByZWFsbSA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChob3N0ID09IG51bGwgfHwgcmVhbG0gPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtOTUyLDcgKzk5Nyw3IEBACiAgICAgICogICAgICAgICBTdHJpbmdbMV0gaXMgcGFzc3dvcmQuIFJldHVybiBudWxsIGlmIGl0IGNhbid0IGZpbmQgYW55dGhpbmcuCiAgICAgICovCiAgICAgU3RyaW5nW10gZ2V0SHR0cEF1dGhVc2VybmFtZVBhc3N3b3JkKFN0cmluZyBob3N0LCBTdHJpbmcgcmVhbG0pIHsKLSAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByZWFsbSA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKXsKKyAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByZWFsbSA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIApAQCAtOTk5LDcgKzEwNDQsNyBAQAogICAgICAqIENsZWFyIEhUVFAgYXV0aGVudGljYXRpb24gcGFzc3dvcmQgZGF0YWJhc2UKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhckh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMTAyMCw3ICsxMDY1LDcgQEAKICAgICAgKiBAcGFyYW0gZm9ybWRhdGEgVGhlIGZvcm0gZGF0YSBpbiBIYXNoTWFwCiAgICAgICovCiAgICAgdm9pZCBzZXRGb3JtRGF0YShTdHJpbmcgdXJsLCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBmb3JtZGF0YSkgewotICAgICAgICBpZiAodXJsID09IG51bGwgfHwgZm9ybWRhdGEgPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgZm9ybWRhdGEgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMTA2OSw3ICsxMTE0LDcgQEAKICAgICAgKi8KICAgICBBcnJheUxpc3Q8U3RyaW5nPiBnZXRGb3JtRGF0YShTdHJpbmcgdXJsLCBTdHJpbmcgbmFtZSkgewogICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IG5hbWUgPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgbmFtZSA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7CiAgICAgICAgIH0KIApAQCAtMTEyOSw3ICsxMTc0LDcgQEAKICAgICAgKiBDbGVhciBmb3JtIGRhdGFiYXNlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJGb3JtRGF0YSgpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sQmFzZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOWU4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xCYXNlLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbnRlcmZhY2UgWm9vbUNvbnRyb2xCYXNlIHsKKworICAgIC8qKgorICAgICAqIENhdXNlcyB0aGUgb24tc2NyZWVuIHpvb20gY29udHJvbCB0byBiZSBtYWRlIHZpc2libGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93KCk7CisKKyAgICAvKioKKyAgICAgKiBDYXVzZXMgdGhlIG9uLXNjcmVlbiB6b29tIGNvbnRyb2wgdG8gZGlzYXBwZWFyCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGlkZSgpOworCisgICAgLyoqCisgICAgICogRW5hYmxlcyB0aGUgY29udHJvbCB0byB1cGRhdGUgaXRzIHN0YXRlIGlmIG5lY2Vzc2FyeSBpbiByZXNwb25zZSB0byBhCisgICAgICogY2hhbmdlIGluIHRoZSBwYWdlcyB6b29tIGxldmVsLiBGb3IgZXhhbXBsZSwgaWYgdGhlIG1heCB6b29tIGxldmVsIGlzCisgICAgICogcmVhY2hlZCB0aGVuIHRoZSBjb250cm9sIGNhbiBkaXNhYmxlIHRoZSBidXR0b24gZm9yIHpvb21pbmcgaW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBjb250cm9sIGlzIGN1cnJlbnRseSB2aXNpYmxlIHRvIHRoZSB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sRW1iZWRkZWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEVtYmVkZGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI5ZTcyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEVtYmVkZGVkLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuWm9vbUJ1dHRvbnNDb250cm9sbGVyOworCitjbGFzcyBab29tQ29udHJvbEVtYmVkZGVkIGltcGxlbWVudHMgWm9vbUNvbnRyb2xCYXNlIHsKKworICAgIHByaXZhdGUgZmluYWwgWm9vbU1hbmFnZXIgbVpvb21NYW5hZ2VyOworICAgIHByaXZhdGUgZmluYWwgV2ViVmlldyBtV2ViVmlldzsKKworICAgIC8vIFRoZSBjb250cm9sbGVyIGlzIGxhemlseSBpbml0aWFsaXplZCBpbiBnZXRDb250cm9scygpIGZvciBwZXJmb3JtYW5jZS4KKyAgICBwcml2YXRlIFpvb21CdXR0b25zQ29udHJvbGxlciBtWm9vbUJ1dHRvbnNDb250cm9sbGVyOworCisgICAgcHVibGljIFpvb21Db250cm9sRW1iZWRkZWQoWm9vbU1hbmFnZXIgem9vbU1hbmFnZXIsIFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtWm9vbU1hbmFnZXIgPSB6b29tTWFuYWdlcjsKKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIGlmICghZ2V0Q29udHJvbHMoKS5pc1Zpc2libGUoKSAmJiAhbVpvb21NYW5hZ2VyLmlzWm9vbVNjYWxlRml4ZWQoKSkgeworCisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUodHJ1ZSk7CisKKyAgICAgICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IHNldHRpbmdzLmdldERvdWJsZVRhcFRvYXN0Q291bnQoKTsKKyAgICAgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuaXNJblpvb21PdmVydmlldygpICYmIGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIHNldHRpbmdzLnNldERvdWJsZVRhcFRvYXN0Q291bnQoLS1jb3VudCk7CisgICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQobVdlYlZpZXcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZG91YmxlX3RhcF90b2FzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9MT05HKS5zaG93KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gbVpvb21CdXR0b25zQ29udHJvbGxlciAhPSBudWxsICYmIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuaXNWaXNpYmxlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlKCkgeworICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGNhblpvb21JbiA9IG1ab29tTWFuYWdlci5jYW5ab29tSW4oKTsKKyAgICAgICAgYm9vbGVhbiBjYW5ab29tT3V0ID0gbVpvb21NYW5hZ2VyLmNhblpvb21PdXQoKSAmJiAhbVpvb21NYW5hZ2VyLmlzSW5ab29tT3ZlcnZpZXcoKTsKKyAgICAgICAgaWYgKCFjYW5ab29tSW4gJiYgIWNhblpvb21PdXQpIHsKKyAgICAgICAgICAgIC8vIEhpZGUgdGhlIHpvb20gaW4gYW5kIG91dCBidXR0b25zIGlmIHRoZSBwYWdlIGNhbm5vdCB6b29tCisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFNldCBlYWNoIG9uZSBpbmRpdmlkdWFsbHksIGFzIGEgcGFnZSBtYXkgYmUgYWJsZSB0byB6b29tIGluIG9yIG91dAorICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRab29tSW5FbmFibGVkKGNhblpvb21Jbik7CisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFpvb21PdXRFbmFibGVkKGNhblpvb21PdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBab29tQnV0dG9uc0NvbnRyb2xsZXIgZ2V0Q29udHJvbHMoKSB7CisgICAgICAgIGlmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPSBuZXcgWm9vbUJ1dHRvbnNDb250cm9sbGVyKG1XZWJWaWV3KTsKKyAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0T25ab29tTGlzdGVuZXIobmV3IFpvb21MaXN0ZW5lcigpKTsKKyAgICAgICAgICAgIC8vIFpvb21CdXR0b25zQ29udHJvbGxlciBwb3NpdGlvbnMgdGhlIGJ1dHRvbnMgYXQgdGhlIGJvdHRvbSwgYnV0IGluCisgICAgICAgICAgICAvLyB0aGUgbWlkZGxlLiBDaGFuZ2UgdGhlaXIgbGF5b3V0IHBhcmFtZXRlcnMgc28gdGhleSBhcHBlYXIgb24gdGhlCisgICAgICAgICAgICAvLyByaWdodC4KKyAgICAgICAgICAgIFZpZXcgY29udHJvbHMgPSBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpOworICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMgPSBjb250cm9scy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgIGlmIChwYXJhbXMgaW5zdGFuY2VvZiBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAoKEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcykgcGFyYW1zKS5ncmF2aXR5ID0gR3Jhdml0eS5SSUdIVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVpvb21CdXR0b25zQ29udHJvbGxlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFpvb21MaXN0ZW5lciBpbXBsZW1lbnRzIFpvb21CdXR0b25zQ29udHJvbGxlci5Pblpvb21MaXN0ZW5lciB7CisKKyAgICAgICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5Q2hhbmdlZChib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKKyAgICAgICAgICAgICAgICAvLyBCcmluZyBiYWNrIHRoZSBoaWRkZW4gem9vbSBjb250cm9scy4KKyAgICAgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uWm9vbShib29sZWFuIHpvb21JbikgeworICAgICAgICAgICAgaWYgKHpvb21JbikgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3Lnpvb21JbigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy56b29tT3V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEV4dGVybmFsLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xFeHRlcm5hbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NTMxM2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xFeHRlcm5hbC5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbHBoYUFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworQERlcHJlY2F0ZWQKK2NsYXNzIFpvb21Db250cm9sRXh0ZXJuYWwgaW1wbGVtZW50cyBab29tQ29udHJvbEJhc2UgeworCisgICAgLy8gVGhlIHRpbWUgdGhhdCB0aGUgZXh0ZXJuYWwgY29udHJvbHMgYXJlIHZpc2libGUgYmVmb3JlIGZhZGluZyBhd2F5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBaT09NX0NPTlRST0xTX1RJTUVPVVQgPQorICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0Wm9vbUNvbnRyb2xzVGltZW91dCgpOworICAgIC8vIFRoZSB2aWV3IGNvbnRhaW5pbmcgdGhlIGV4dGVybmFsIHpvb20gY29udHJvbHMKKyAgICBwcml2YXRlIEV4dGVuZGVkWm9vbUNvbnRyb2xzIG1ab29tQ29udHJvbHM7CisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtWm9vbUNvbnRyb2xSdW5uYWJsZTsKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbVByaXZhdGVIYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKworICAgIHByaXZhdGUgZmluYWwgV2ViVmlldyBtV2ViVmlldzsKKworICAgIHB1YmxpYyBab29tQ29udHJvbEV4dGVybmFsKFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgaWYobVpvb21Db250cm9sUnVubmFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgZ2V0Q29udHJvbHMoKS5zaG93KHRydWUpOworICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGlkZSgpIHsKKyAgICAgICAgaWYgKG1ab29tQ29udHJvbFJ1bm5hYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtWm9vbUNvbnRyb2xzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1ab29tQ29udHJvbHMuaGlkZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gbVpvb21Db250cm9scyAhPSBudWxsICYmIG1ab29tQ29udHJvbHMuaXNTaG93bigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsgfQorCisgICAgcHVibGljIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGdldENvbnRyb2xzKCkgeworICAgICAgICBpZiAobVpvb21Db250cm9scyA9PSBudWxsKSB7CisgICAgICAgICAgICBtWm9vbUNvbnRyb2xzID0gY3JlYXRlWm9vbUNvbnRyb2xzKCk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBuZWVkIHRvIGJlIHNldCB0byBWSVNJQkxFIGZpcnN0IHNvIHRoYXQgZ2V0TWVhc3VyZWRIZWlnaHQoKSBpbgorICAgICAgICAgICAgICoge0BsaW5rICNvblNpemVDaGFuZ2VkKCl9IGNhbiByZXR1cm4gdGhlIG1lYXN1cmVkIHZhbHVlIGZvciBwcm9wZXIKKyAgICAgICAgICAgICAqIGxheW91dC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbVpvb21Db250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtWm9vbUNvbnRyb2xSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IGRpc21pc3MgdGhlIGNvbnRyb2xzIGlmIHRoZSB1c2VyIGhhcworICAgICAgICAgICAgICAgICAgICAgKiBmb2N1cyBvbiB0aGVtLiBXYWl0IGFuZCBjaGVjayBhZ2FpbiBsYXRlci4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmICghbVpvb21Db250cm9scy5oYXNGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtWm9vbUNvbnRyb2xzLmhpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaT09NX0NPTlRST0xTX1RJTUVPVVQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVpvb21Db250cm9sczsKKyAgICB9CisKKyAgICBwcml2YXRlIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGNyZWF0ZVpvb21Db250cm9scygpIHsKKyAgICAgICAgRXh0ZW5kZWRab29tQ29udHJvbHMgem9vbUNvbnRyb2xzID0gbmV3IEV4dGVuZGVkWm9vbUNvbnRyb2xzKG1XZWJWaWV3LmdldENvbnRleHQoKSk7CisgICAgICAgIHpvb21Db250cm9scy5zZXRPblpvb21JbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGltZSBvdXQKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuem9vbUluKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB6b29tQ29udHJvbHMuc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAvLyByZXNldCB0aW1lIG91dAorICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy56b29tT3V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gem9vbUNvbnRyb2xzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGV4dGVuZHMgRnJhbWVMYXlvdXQgeworCisgICAgICAgIHByaXZhdGUgYW5kcm9pZC53aWRnZXQuWm9vbUNvbnRyb2xzIG1QbHVzTWludXNab29tQ29udHJvbHM7CisKKyAgICAgICAgcHVibGljIEV4dGVuZGVkWm9vbUNvbnRyb2xzKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCk7CisgICAgICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcikKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC56b29tX21hZ25pZnksIHRoaXMsIHRydWUpOworICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scyA9IChhbmRyb2lkLndpZGdldC5ab29tQ29udHJvbHMpIGZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC56b29tQ29udHJvbHMpOworICAgICAgICAgICAgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuem9vbU1hZ25pZnkpLnNldFZpc2liaWxpdHkoCisgICAgICAgICAgICAgICAgICAgIFZpZXcuR09ORSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzaG93KGJvb2xlYW4gc2hvd1pvb20pIHsKKyAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0VmlzaWJpbGl0eShzaG93Wm9vbSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgICAgICAgICBmYWRlKFZpZXcuVklTSUJMRSwgMC4wZiwgMS4wZik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICAgICAgZmFkZShWaWV3LkdPTkUsIDEuMGYsIDAuMGYpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGZhZGUoaW50IHZpc2liaWxpdHksIGZsb2F0IHN0YXJ0QWxwaGEsIGZsb2F0IGVuZEFscGhhKSB7CisgICAgICAgICAgICBBbHBoYUFuaW1hdGlvbiBhbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKHN0YXJ0QWxwaGEsIGVuZEFscGhhKTsKKyAgICAgICAgICAgIGFuaW0uc2V0RHVyYXRpb24oNTAwKTsKKyAgICAgICAgICAgIHN0YXJ0QW5pbWF0aW9uKGFuaW0pOworICAgICAgICAgICAgc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1QbHVzTWludXNab29tQ29udHJvbHMuaGFzRm9jdXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE9uWm9vbUluQ2xpY2tMaXN0ZW5lcihPbkNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0T25ab29tSW5DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIoT25DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLnNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2ViY2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw5MTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TY2FsZUdlc3R1cmVEZXRlY3RvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworLyoqCisgKiBUaGUgWm9vbU1hbmFnZXIgaXMgcmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nIHRoZSBXZWJWaWV3J3MgY3VycmVudCB6b29tCisgKiBsZXZlbCBzdGF0ZS4gIEl0IGlzIGFsc28gcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSBvbi1zY3JlZW4gem9vbSBjb250cm9scworICogYXMgd2VsbCBhcyBhbnkgYW5pbWF0aW9uIG9mIHRoZSBXZWJWaWV3IGR1ZSB0byB6b29taW5nLgorICoKKyAqIEN1cnJlbnRseSwgdGhlcmUgYXJlIHR3byBtZXRob2RzIGZvciBhbmltYXRpbmcgdGhlIHpvb20gb2YgYSBXZWJWaWV3LgorICoKKyAqICgxKSBUaGUgZmlyc3QgbWV0aG9kIGlzIHRyaWdnZXJlZCBieSBzdGFydFpvb21BbmltYXRpb24oLi4uKSBhbmQgaXMgYSBmaXhlZAorICogbGVuZ3RoIGFuaW1hdGlvbiB3aGVyZSB0aGUgZmluYWwgem9vbSBzY2FsZSBpcyBrbm93biBhdCBzdGFydHVwLiAgVGhpcyB0eXBlIG9mCisgKiBhbmltYXRpb24gbm90aWZpZXMgd2Via2l0IG9mIHRoZSBmaW5hbCBzY2FsZSBCRUZPUkUgaXQgYW5pbWF0ZXMuIFRoZSBhbmltYXRpb24KKyAqIGlzIHRoZW4gZG9uZSBieSBzY2FsaW5nIHRoZSBDQU5WQVMgaW5jcmVtZW50YWxseSBiYXNlZCBvbiBhIHN0ZXBwaW5nIGZ1bmN0aW9uLgorICoKKyAqICgyKSBUaGUgc2Vjb25kIG1ldGhvZCBpcyB0cmlnZ2VyZWQgYnkgYSBtdWx0aS10b3VjaCBwaW5jaCBhbmQgdGhlIG5ldyBzY2FsZQorICogaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgdXNlcidzIGdlc3R1cmUuIFRoaXMgdHlwZSBvZiBhbmltYXRpb24KKyAqIG9ubHkgbm90aWZpZXMgd2Via2l0IG9mIG5ldyBzY2FsZSBBRlRFUiB0aGUgZ2VzdHVyZSBpcyBjb21wbGV0ZS4gVGhlIGFuaW1hdGlvbgorICogZWZmZWN0IGlzIGFjaGlldmVkIGJ5IHNjYWxpbmcgdGhlIFZJRVdTIChib3RoIFdlYlZpZXcgYW5kIFZpZXdNYW5hZ2VyLkNoaWxkVmlldykKKyAqIHRvIHRoZSBuZXcgc2NhbGUgaW4gcmVzcG9uc2UgdG8gZXZlbnRzIHJlbGF0ZWQgdG8gdGhlIHVzZXIncyBnZXN0dXJlLgorICovCitjbGFzcyBab29tTWFuYWdlciB7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJ3ZWJ2aWV3Wm9vbSI7CisKKyAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7CisgICAgcHJpdmF0ZSBmaW5hbCBDYWxsYmFja1Byb3h5IG1DYWxsYmFja1Byb3h5OworCisgICAgLy8gV2lkZ2V0cyByZXNwb25zaWJsZSBmb3IgdGhlIG9uLXNjcmVlbiB6b29tIGZ1bmN0aW9ucyBvZiB0aGUgV2ViVmlldy4KKyAgICBwcml2YXRlIFpvb21Db250cm9sRW1iZWRkZWQgbUVtYmVkZGVkWm9vbUNvbnRyb2w7CisgICAgcHJpdmF0ZSBab29tQ29udHJvbEV4dGVybmFsIG1FeHRlcm5hbFpvb21Db250cm9sOworCisgICAgLyoKKyAgICAgKiBGb3IgbGFyZ2Ugc2NyZWVuIGRldmljZXMsIHRoZSBkZWZhdWx0U2NhbGUgdXN1YWxseSBzZXQgdG8gMS4wIGFuZAorICAgICAqIGVxdWFsIHRvIHRoZSBvdmVydmlldyBzY2FsZSwgdG8gZGlmZmVyZW50aWF0ZSB0aGUgem9vbSBsZXZlbCBmb3IgZG91YmxlIHRhcHBpbmcsCisgICAgICogYSBtaW5pbXVtIHJlYWRpbmcgbGV2ZWwgc2NhbGUgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBNSU5fUkVBRElOR19MRVZFTF9TQ0FMRSA9IDEuNWY7CisKKyAgICAvKgorICAgICAqIFRoZSBzY2FsZSBmYWN0b3JzIHRoYXQgZGV0ZXJtaW5lIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIGZvciB0aGUKKyAgICAgKiBkZWZhdWx0IHpvb20gc2NhbGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX01BWF9aT09NX1NDQUxFX0ZBQ1RPUiA9IDQuMDBmOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9NSU5fWk9PTV9TQ0FMRV9GQUNUT1IgPSAwLjI1ZjsKKworICAgIC8vIFRoZSBkZWZhdWx0IHNjYWxlIGxpbWl0cywgd2hpY2ggYXJlIGRlcGVuZGVudCBvbiB0aGUgZGlzcGxheSBkZW5zaXR5LgorICAgIHByaXZhdGUgZmxvYXQgbURlZmF1bHRNYXhab29tU2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtRGVmYXVsdE1pblpvb21TY2FsZTsKKworICAgIC8vIFRoZSBhY3R1YWwgc2NhbGUgbGltaXRzLCB3aGljaCBjYW4gYmUgc2V0IHRocm91Z2ggYSB3ZWJwYWdlJ3Mgdmlld3BvcnQKKyAgICAvLyBtZXRhLXRhZy4KKyAgICBwcml2YXRlIGZsb2F0IG1NYXhab29tU2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtTWluWm9vbVNjYWxlOworCisgICAgLy8gTG9ja3MgdGhlIG1pbmltdW0gWm9vbVNjYWxlIHRvIHRoZSB2YWx1ZSBjdXJyZW50bHkgc2V0IGluIG1NaW5ab29tU2NhbGUuCisgICAgcHJpdmF0ZSBib29sZWFuIG1NaW5ab29tU2NhbGVGaXhlZCA9IHRydWU7CisKKyAgICAvKgorICAgICAqIFdoZW4gbG9hZGluZyBhIG5ldyBwYWdlIHRoZSBXZWJWaWV3IGRvZXMgbm90IGluaXRpYWxseSBrbm93IHRoZSBmaW5hbAorICAgICAqIHdpZHRoIG9mIHRoZSBwYWdlLiBUaGVyZWZvcmUsIHdoZW4gYSBuZXcgcGFnZSBpcyBsb2FkZWQgaW4gb3ZlcnZpZXcgbW9kZQorICAgICAqIHRoZSBvdmVydmlldyBzY2FsZSBpcyBpbml0aWFsaXplZCB0byBhIGRlZmF1bHQgdmFsdWUuIFRoaXMgZmxhZyBpcyB0aGVuCisgICAgICogc2V0IGFuZCB1c2VkIHRvIG5vdGlmeSB0aGUgWm9vbU1hbmFnZXIgdG8gdGFrZSB0aGUgd2lkdGggb2YgdGhlIG5leHQKKyAgICAgKiBwaWN0dXJlIGZyb20gd2Via2l0IGFuZCB1c2UgdGhhdCB3aWR0aCB0byBlbnRlciBpbnRvIHpvb20gb3ZlcnZpZXcgbW9kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUluaXRpYWxab29tT3ZlcnZpZXcgPSBmYWxzZTsKKworICAgIC8qCisgICAgICogV2hlbiBpbiB0aGUgem9vbSBvdmVydmlldyBtb2RlLCB0aGUgcGFnZSdzIHdpZHRoIGlzIGZ1bGx5IGZpdCB0byB0aGUKKyAgICAgKiBjdXJyZW50IHdpbmRvdy4gQWRkaXRpb25hbGx5IHdoaWxlIHRoZSBwYWdlIGlzIGluIHRoaXMgc3RhdGUgaXQgaXMKKyAgICAgKiBhY3RpdmUsIGluIG90aGVyIHdvcmRzLCB5b3UgY2FuIGNsaWNrIHRvIGZvbGxvdyB0aGUgbGlua3MuIFdlIGNhY2hlIGEKKyAgICAgKiBib29sZWFuIHRvIGVuYWJsZSB1cyB0byBxdWlja2x5IGNoZWNrIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBpbiBvdmVydmlldworICAgICAqIG1vZGUsIGJ1dCB0aGlzIHZhbHVlIHNob3VsZCBvbmx5IGJlIG1vZGlmaWVkIGJ5IGNoYW5nZXMgdG8gdGhlIHpvb20KKyAgICAgKiBzY2FsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgbVpvb21PdmVydmlld1dpZHRoOworICAgIHByaXZhdGUgZmxvYXQgbUludlpvb21PdmVydmlld1dpZHRoOworCisgICAgLyoKKyAgICAgKiBUaGVzZSB2YXJpYWJsZXMgdHJhY2sgdGhlIGNlbnRlciBwb2ludCBvZiB0aGUgem9vbSBhbmQgdGhleSBhcmUgdXNlZCB0bworICAgICAqIGRldGVybWluZSB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHdlIHNob3VsZCB6b29tLiBUaGV5IGFyZSBzdG9yZWQgaW4gdmlldworICAgICAqIGNvb3JkaW5hdGVzLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbVpvb21DZW50ZXJYOworICAgIHByaXZhdGUgZmxvYXQgbVpvb21DZW50ZXJZOworCisgICAgLyoKKyAgICAgKiBUaGVzZSB2YWx1ZXMgcmVwcmVzZW50IHRoZSBwb2ludCBhcm91bmQgd2hpY2ggdGhlIHNjcmVlbiBzaG91bGQgYmUKKyAgICAgKiBjZW50ZXJlZCBhZnRlciB6b29taW5nLiBJbiBvdGhlciB3b3JkcyBpdCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgY2VudGVyCisgICAgICogcG9pbnQgb2YgdGhlIHZpc2libGUgZG9jdW1lbnQgYWZ0ZXIgdGhlIHBhZ2UgaGFzIGZpbmlzaGVkIHpvb21pbmcuIFRoaXMKKyAgICAgKiBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGUgem9vbSBtYXkgaGF2ZSBwb3RlbnRpYWxseSByZWZsb3dlZCB0aGUgdGV4dCBhbmQKKyAgICAgKiB3ZSBuZWVkIHRvIGVuc3VyZSB0aGUgcHJvcGVyIHBvcnRpb24gb2YgdGhlIGRvY3VtZW50IHJlbWFpbnMgb24gdGhlCisgICAgICogc2NyZWVuLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1BbmNob3JYOworICAgIHByaXZhdGUgaW50IG1BbmNob3JZOworCisgICAgLy8gVGhlIHNjYWxlIGZhY3RvciB0aGF0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjb2x1bW4gd2lkdGggZm9yIHRleHQKKyAgICBwcml2YXRlIGZsb2F0IG1UZXh0V3JhcFNjYWxlOworCisgICAgLyoKKyAgICAgKiBUaGUgZGVmYXVsdCB6b29tIHNjYWxlIGlzIHRoZSBzY2FsZSBmYWN0b3IgdXNlZCB3aGVuIHRoZSB1c2VyIHRyaWdnZXJzIGEKKyAgICAgKiB6b29tIGluIGJ5IGRvdWJsZSB0YXBwaW5nIG9uIHRoZSBXZWJWaWV3LiBUaGUgdmFsdWUgaXMgaW5pdGlhbGx5IHNldAorICAgICAqIGJhc2VkIG9uIHRoZSBkaXNwbGF5IGRlbnNpdHksIGJ1dCBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZSB2aWEgdGhlCisgICAgICogV2ViU2V0dGluZ3MuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtRGVmYXVsdFNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbUludkRlZmF1bHRTY2FsZTsKKworICAgIC8vIHRoZSBjdXJyZW50IGNvbXB1dGVkIHpvb20gc2NhbGUgYW5kIGl0cyBpbnZlcnNlLgorICAgIHByaXZhdGUgZmxvYXQgbUFjdHVhbFNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbUludkFjdHVhbFNjYWxlOworICAgIAorICAgIC8qCisgICAgICogVGhlIGluaXRpYWwgc2NhbGUgZm9yIHRoZSBXZWJWaWV3LiAwIG1lYW5zIGRlZmF1bHQuIElmIGluaXRpYWwgc2NhbGUgaXMKKyAgICAgKiBncmVhdGVyIHRoYW4gMCB0aGUgV2ViVmlldyBzdGFydHMgd2l0aCB0aGlzIHZhbHVlIGFzIGl0cyBpbml0aWFsIHNjYWxlLiBUaGUKKyAgICAgKiB2YWx1ZSBpcyBjb252ZXJ0ZWQgZnJvbSBhbiBpbnRlZ2VyIHBlcmNlbnRhZ2Ugc28gaXQgaXMgZ3VhcmVudGVlZCB0byBoYXZlCisgICAgICogbm8gbW9yZSB0aGFuIDIgc2lnbmlmaWNhbnQgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsLiAgVGhpcyByZXN0cmljdGlvbgorICAgICAqIGFsbG93cyB1cyB0byBjb252ZXJ0IHRoZSBzY2FsZSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBwZXJjZW50YWdlIGJ5IHNpbXBseQorICAgICAqIG11bHRpcGx5aW5nIHRoZSB2YWx1ZSBieSAxMDAuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtSW5pdGlhbFNjYWxlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQgPSAwLjAxZjsKKworICAgIC8qCisgICAgICogVGhlIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzIGFyZSBvbmx5IHRvIGJlIHVzZWQgZm9yIGFuaW1hdGluZyB6b29tLiBJZgorICAgICAqIG1ab29tU2NhbGUgaXMgbm9uLXplcm8gdGhlbiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIHpvb20gYW5pbWF0aW9uLiBUaGUKKyAgICAgKiBvdGhlciB2YXJpYWJsZXMgYXJlIHVzZWQgYXMgYSBjYWNoZSAoZS5nLiBpbnZlcnNlKSBvciBhcyBhIHdheSB0byBzdG9yZQorICAgICAqIHRoZSBzdGF0ZSBvZiB0aGUgdmlldyBwcmlvciB0byBhbmltYXRpbmcgKGUuZy4gaW5pdGlhbCBzY3JvbGwgY29vcmRzKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1ab29tU2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtSW52SW5pdGlhbFpvb21TY2FsZTsKKyAgICBwcml2YXRlIGZsb2F0IG1JbnZGaW5hbFpvb21TY2FsZTsKKyAgICBwcml2YXRlIGludCBtSW5pdGlhbFNjcm9sbFg7CisgICAgcHJpdmF0ZSBpbnQgbUluaXRpYWxTY3JvbGxZOworICAgIHByaXZhdGUgbG9uZyBtWm9vbVN0YXJ0OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpPT01fQU5JTUFUSU9OX0xFTkdUSCA9IDUwMDsKKworICAgIC8vIHdoZXRoZXIgc3VwcG9ydCBtdWx0aS10b3VjaAorICAgIHByaXZhdGUgYm9vbGVhbiBtU3VwcG9ydE11bHRpVG91Y2g7CisKKyAgICAvLyB1c2UgdGhlIGZyYW1ld29yaydzIFNjYWxlR2VzdHVyZURldGVjdG9yIHRvIGhhbmRsZSBtdWx0aS10b3VjaAorICAgIHByaXZhdGUgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgbVNjYWxlRGV0ZWN0b3I7CisgICAgcHJpdmF0ZSBib29sZWFuIG1QaW5jaFRvWm9vbUFuaW1hdGluZyA9IGZhbHNlOworCisgICAgcHVibGljIFpvb21NYW5hZ2VyKFdlYlZpZXcgd2ViVmlldywgQ2FsbGJhY2tQcm94eSBjYWxsYmFja1Byb3h5KSB7CisgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKKyAgICAgICAgbUNhbGxiYWNrUHJveHkgPSBjYWxsYmFja1Byb3h5OworCisgICAgICAgIC8qCisgICAgICAgICAqIElkZWFsbHkgbVpvb21PdmVydmlld1dpZHRoIHNob3VsZCBiZSBtQ29udGVudFdpZHRoLiBCdXQgc2l0ZXMgbGlrZQorICAgICAgICAgKiBFU1BOIGFuZCBFbmdhZGdldCBhbHdheXMgaGF2ZSB3aWRlciBtQ29udGVudFdpZHRoIG5vIG1hdHRlciB3aGF0IHRoZQorICAgICAgICAgKiB2aWV3cG9ydCBzaXplIGlzLgorICAgICAgICAgKi8KKyAgICAgICAgc2V0Wm9vbU92ZXJ2aWV3V2lkdGgoV2ViVmlldy5ERUZBVUxUX1ZJRVdQT1JUX1dJRFRIKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGJvdGggdGhlIGRlZmF1bHQgYW5kIGFjdHVhbCB6b29tIHNjYWxlIHRvIHRoZSBnaXZlbiBkZW5zaXR5LgorICAgICAqCisgICAgICogQHBhcmFtIGRlbnNpdHkgVGhlIGxvZ2ljYWwgZGVuc2l0eSBvZiB0aGUgZGlzcGxheS4gVGhpcyBpcyBhIHNjYWxpbmcgZmFjdG9yCisgICAgICogZm9yIHRoZSBEZW5zaXR5IEluZGVwZW5kZW50IFBpeGVsIHVuaXQsIHdoZXJlIG9uZSBESVAgaXMgb25lIHBpeGVsIG9uIGFuCisgICAgICogYXBwcm94aW1hdGVseSAxNjAgZHBpIHNjcmVlbiAoc2VlIGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljcy5kZW5zaXR5KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KGZsb2F0IGRlbnNpdHkpIHsKKyAgICAgICAgYXNzZXJ0IGRlbnNpdHkgPiAwOworCisgICAgICAgIHNldERlZmF1bHRab29tU2NhbGUoZGVuc2l0eSk7CisgICAgICAgIG1BY3R1YWxTY2FsZSA9IGRlbnNpdHk7CisgICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBkZW5zaXR5OworICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IGRlbnNpdHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBkZWZhdWx0IHpvb20gc2NhbGUgdXNpbmcgdGhlIGdpdmVuIGRlbnNpdHkuIEl0IHdpbGwgYWxzbyByZXNldAorICAgICAqIHRoZSBjdXJyZW50IG1pbiBhbmQgbWF4IHpvb20gc2NhbGVzIHRvIHRoZSBkZWZhdWx0IGJvdW5kYXJpZXMgYXMgd2VsbCBhcworICAgICAqIGVuc3VyZSB0aGF0IHRoZSBhY3R1YWwgc2NhbGUgZmFsbHMgd2l0aGluIHRob3NlIGJvdW5kYXJpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVuc2l0eSBUaGUgbG9naWNhbCBkZW5zaXR5IG9mIHRoZSBkaXNwbGF5LiBUaGlzIGlzIGEgc2NhbGluZyBmYWN0b3IKKyAgICAgKiBmb3IgdGhlIERlbnNpdHkgSW5kZXBlbmRlbnQgUGl4ZWwgdW5pdCwgd2hlcmUgb25lIERJUCBpcyBvbmUgcGl4ZWwgb24gYW4KKyAgICAgKiBhcHByb3hpbWF0ZWx5IDE2MCBkcGkgc2NyZWVuIChzZWUgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzLmRlbnNpdHkpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShmbG9hdCBkZW5zaXR5KSB7CisgICAgICAgIGFzc2VydCBkZW5zaXR5ID4gMDsKKworICAgICAgICBpZiAoTWF0aC5hYnMoZGVuc2l0eSAtIG1EZWZhdWx0U2NhbGUpID4gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKKyAgICAgICAgICAgIC8vIHNldCB0aGUgbmV3IGRlZmF1bHQgZGVuc2l0eQorICAgICAgICAgICAgc2V0RGVmYXVsdFpvb21TY2FsZShkZW5zaXR5KTsKKyAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgc2NhbGUgaWYgaXQgZmFsbHMgb3V0c2lkZSB0aGUgbmV3IHpvb20gYm91bmRzCisgICAgICAgICAgICBzZXRab29tU2NhbGUobUFjdHVhbFNjYWxlLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0Wm9vbVNjYWxlKGZsb2F0IGRlZmF1bHRTY2FsZSkgeworICAgICAgICBtRGVmYXVsdFNjYWxlID0gZGVmYXVsdFNjYWxlOworICAgICAgICBtSW52RGVmYXVsdFNjYWxlID0gMSAvIGRlZmF1bHRTY2FsZTsKKyAgICAgICAgbURlZmF1bHRNYXhab29tU2NhbGUgPSBkZWZhdWx0U2NhbGUgKiBERUZBVUxUX01BWF9aT09NX1NDQUxFX0ZBQ1RPUjsKKyAgICAgICAgbURlZmF1bHRNaW5ab29tU2NhbGUgPSBkZWZhdWx0U2NhbGUgKiBERUZBVUxUX01JTl9aT09NX1NDQUxFX0ZBQ1RPUjsKKyAgICAgICAgbU1heFpvb21TY2FsZSA9IG1EZWZhdWx0TWF4Wm9vbVNjYWxlOworICAgICAgICBtTWluWm9vbVNjYWxlID0gbURlZmF1bHRNaW5ab29tU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldFNjYWxlKCkgeworICAgICAgICByZXR1cm4gbUFjdHVhbFNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXRJbnZTY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnZBY3R1YWxTY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0VGV4dFdyYXBTY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UZXh0V3JhcFNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXRNYXhab29tU2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtTWF4Wm9vbVNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXRNaW5ab29tU2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtTWluWm9vbVNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXREZWZhdWx0U2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdFNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXRSZWFkaW5nTGV2ZWxTY2FsZSgpIHsKKyAgICAgIHJldHVybiBNYXRoLm1heChtRGVmYXVsdFNjYWxlLCBNSU5fUkVBRElOR19MRVZFTF9TQ0FMRSk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldEludkRlZmF1bHRTY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnZEZWZhdWx0U2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldERlZmF1bHRNYXhab29tU2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdE1heFpvb21TY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0RGVmYXVsdE1pblpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0TWluWm9vbVNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RG9jdW1lbnRBbmNob3JYKCkgeworICAgICAgICByZXR1cm4gbUFuY2hvclg7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGludCBnZXREb2N1bWVudEFuY2hvclkoKSB7CisgICAgICAgIHJldHVybiBtQW5jaG9yWTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBjbGVhckRvY3VtZW50QW5jaG9yKCkgeworICAgICAgICBtQW5jaG9yWCA9IG1BbmNob3JZID0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRab29tQ2VudGVyKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgbVpvb21DZW50ZXJYID0geDsKKyAgICAgICAgbVpvb21DZW50ZXJZID0geTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRJbml0aWFsU2NhbGVJblBlcmNlbnQoaW50IHNjYWxlSW5QZXJjZW50KSB7CisgICAgICAgIG1Jbml0aWFsU2NhbGUgPSBzY2FsZUluUGVyY2VudCAqIDAuMDFmOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBjb21wdXRlU2NhbGVXaXRoTGltaXRzKGZsb2F0IHNjYWxlKSB7CisgICAgICAgIGlmIChzY2FsZSA8IG1NaW5ab29tU2NhbGUpIHsKKyAgICAgICAgICAgIHNjYWxlID0gbU1pblpvb21TY2FsZTsKKyAgICAgICAgfSBlbHNlIGlmIChzY2FsZSA+IG1NYXhab29tU2NhbGUpIHsKKyAgICAgICAgICAgIHNjYWxlID0gbU1heFpvb21TY2FsZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNab29tU2NhbGVGaXhlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1NaW5ab29tU2NhbGUgPj0gbU1heFpvb21TY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KGZsb2F0IHNjYWxlQSwgZmxvYXQgc2NhbGVCKSB7CisgICAgICAgIHJldHVybiBNYXRoLmFicyhzY2FsZUEgLSBzY2FsZUIpID49IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHdpbGxTY2FsZVRyaWdnZXJab29tKGZsb2F0IHNjYWxlKSB7CisgICAgICAgIHJldHVybiBleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQoc2NhbGUsIG1BY3R1YWxTY2FsZSk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gY2FuWm9vbUluKCkgeworICAgICAgICByZXR1cm4gbU1heFpvb21TY2FsZSAtIG1BY3R1YWxTY2FsZSA+IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGNhblpvb21PdXQoKSB7CisgICAgICAgIHJldHVybiBtQWN0dWFsU2NhbGUgLSBtTWluWm9vbVNjYWxlID4gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gem9vbUluKCkgeworICAgICAgICByZXR1cm4gem9vbSgxLjI1Zik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gem9vbU91dCgpIHsKKyAgICAgICAgcmV0dXJuIHpvb20oMC44Zik7CisgICAgfQorCisgICAgLy8gcmV0dXJucyBUUlVFIGlmIHpvb20gb3V0IHN1Y2NlZWRzIGFuZCBGQUxTRSBpZiBubyB6b29tIGNoYW5nZXMuCisgICAgcHJpdmF0ZSBib29sZWFuIHpvb20oZmxvYXQgem9vbU11bHRpcGxpZXIpIHsKKyAgICAgICAgLy8gVE9ETzogYWx0ZXJuYXRpdmVseSB3ZSBjYW4gZGlzYWxsb3cgdGhpcyBkdXJpbmcgZHJhdyBoaXN0b3J5IG1vZGUKKyAgICAgICAgbVdlYlZpZXcuc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKKyAgICAgICAgLy8gQ2VudGVyIHpvb21pbmcgdG8gdGhlIGNlbnRlciBvZiB0aGUgc2NyZWVuLgorICAgICAgICBtWm9vbUNlbnRlclggPSBtV2ViVmlldy5nZXRWaWV3V2lkdGgoKSAqIC41ZjsKKyAgICAgICAgbVpvb21DZW50ZXJZID0gbVdlYlZpZXcuZ2V0Vmlld0hlaWdodCgpICogLjVmOworICAgICAgICBtQW5jaG9yWCA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1XZWJWaWV3LmdldFNjcm9sbFgoKSk7CisgICAgICAgIG1BbmNob3JZID0gbVdlYlZpZXcudmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpKTsKKyAgICAgICAgcmV0dXJuIHN0YXJ0Wm9vbUFuaW1hdGlvbihtQWN0dWFsU2NhbGUgKiB6b29tTXVsdGlwbGllciwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhdGVzIGFuIGFuaW1hdGVkIHpvb20gb2YgdGhlIFdlYlZpZXcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5ldyBzY2FsZSB0cmlnZ2VyZWQgYW4gYW5pbWF0aW9uIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3RhcnRab29tQW5pbWF0aW9uKGZsb2F0IHNjYWxlLCBib29sZWFuIHJlZmxvd1RleHQpIHsKKyAgICAgICAgZmxvYXQgb2xkU2NhbGUgPSBtQWN0dWFsU2NhbGU7CisgICAgICAgIG1Jbml0aWFsU2Nyb2xsWCA9IG1XZWJWaWV3LmdldFNjcm9sbFgoKTsKKyAgICAgICAgbUluaXRpYWxTY3JvbGxZID0gbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpOworCisgICAgICAgIC8vIHNuYXAgdG8gcmVhZGluZyBsZXZlbCBzY2FsZSBpZiBpdCBpcyBjbG9zZQorICAgICAgICBpZiAoIWV4Y2VlZHNNaW5TY2FsZUluY3JlbWVudChzY2FsZSwgZ2V0UmVhZGluZ0xldmVsU2NhbGUoKSkpIHsKKyAgICAgICAgICAgIHNjYWxlID0gZ2V0UmVhZGluZ0xldmVsU2NhbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHNldFpvb21TY2FsZShzY2FsZSwgcmVmbG93VGV4dCk7CisKKyAgICAgICAgaWYgKG9sZFNjYWxlICE9IG1BY3R1YWxTY2FsZSkgeworICAgICAgICAgICAgLy8gdXNlIG1ab29tUGlja2VyU2NhbGUgdG8gc2VlIHpvb20gcHJldmlldyBmaXJzdAorICAgICAgICAgICAgbVpvb21TdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgbUludkluaXRpYWxab29tU2NhbGUgPSAxLjBmIC8gb2xkU2NhbGU7CisgICAgICAgICAgICBtSW52RmluYWxab29tU2NhbGUgPSAxLjBmIC8gbUFjdHVhbFNjYWxlOworICAgICAgICAgICAgbVpvb21TY2FsZSA9IG1BY3R1YWxTY2FsZTsKKyAgICAgICAgICAgIG1XZWJWaWV3Lm9uRml4ZWRMZW5ndGhab29tQW5pbWF0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgIG1XZWJWaWV3LmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBXZWJWaWV3J3MgZHJhd2luZyBjb2RlIHdoZW4gYSBmaXhlZCBsZW5ndGggem9vbQorICAgICAqIGFuaW1hdGlvbiBpcyBvY2N1cnJpbmcuIEl0cyBwdXJwb3NlIGlzIHRvIGFuaW1hdGUgdGhlIHpvb21pbmcgb2YgdGhlIGNhbnZhcworICAgICAqIHRvIHRoZSBkZXNpcmVkIHNjYWxlIHdoaWNoIHdhcyBzcGVjaWZpZWQgaW4gc3RhcnRab29tQW5pbWF0aW9uKC4uLikuCisgICAgICoKKyAgICAgKiBBIGZpeGVkIGxlbmd0aCBhbmltYXRpb24gYmVnaW5zIHdoZW4gc3RhcnRab29tQW5pbWF0aW9uKC4uLikgaXMgY2FsbGVkIGFuZAorICAgICAqIGNvbnRpbnVlcyB1bnRpbCB0aGUgWk9PTV9BTklNQVRJT05fTEVOR1RIIHRpbWUgaGFzIGVsYXBzZWQuIER1cmluZyB0aGF0CisgICAgICogaW50ZXJ2YWwgZWFjaCB0aW1lIHRoZSBXZWJWaWV3IGRyYXdzIGl0IGNhbGxzIHRoaXMgZnVuY3Rpb24gd2hpY2ggaXMgCisgICAgICogcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEFkZGl0aW9uYWxseSwgdGhlIFdlYlZpZXcgY2FuIGNoZWNrIHRvIHNlZSBpZiBzdWNoIGFuIGFuaW1hdGlvbiBpcyBjdXJyZW50bHkKKyAgICAgKiBpbiBwcm9ncmVzcyBieSBjYWxsaW5nIGlzRml4ZWRMZW5ndGhBbmltYXRpb25JblByb2dyZXNzKCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYW5pbWF0ZVpvb20oQ2FudmFzIGNhbnZhcykgeworICAgICAgICBpZiAobVpvb21TY2FsZSA9PSAwKSB7CisgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJBIFdlYlZpZXcgaXMgYXR0ZW1wdGluZyB0byBwZXJmb3JtIGEgZml4ZWQgbGVuZ3RoICIKKyAgICAgICAgICAgICAgICAgICAgKyAiem9vbSBhbmltYXRpb24gd2hlbiBubyB6b29tIGlzIGluIHByb2dyZXNzIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCB6b29tU2NhbGU7CisgICAgICAgIGludCBpbnRlcnZhbCA9IChpbnQpIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIG1ab29tU3RhcnQpOworICAgICAgICBpZiAoaW50ZXJ2YWwgPCBaT09NX0FOSU1BVElPTl9MRU5HVEgpIHsKKyAgICAgICAgICAgIGZsb2F0IHJhdGlvID0gKGZsb2F0KSBpbnRlcnZhbCAvIFpPT01fQU5JTUFUSU9OX0xFTkdUSDsKKyAgICAgICAgICAgIHpvb21TY2FsZSA9IDEuMGYgLyAobUludkluaXRpYWxab29tU2NhbGUKKyAgICAgICAgICAgICAgICAgICAgKyAobUludkZpbmFsWm9vbVNjYWxlIC0gbUludkluaXRpYWxab29tU2NhbGUpICogcmF0aW8pOworICAgICAgICAgICAgbVdlYlZpZXcuaW52YWxpZGF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgem9vbVNjYWxlID0gbVpvb21TY2FsZTsKKyAgICAgICAgICAgIC8vIHNldCBtWm9vbVNjYWxlIHRvIGJlIDAgYXMgd2UgaGF2ZSBmaW5pc2hlZCBhbmltYXRpbmcKKyAgICAgICAgICAgIG1ab29tU2NhbGUgPSAwOworICAgICAgICAgICAgbVdlYlZpZXcub25GaXhlZExlbmd0aFpvb21BbmltYXRpb25FbmQoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGludGVybWVkaWF0ZSBzY3JvbGwgcG9zaXRpb24uIFNpbmNlIHdlIG5lZWQgdG8gdXNlCisgICAgICAgIC8vIHpvb21TY2FsZSwgd2UgY2FuJ3QgdXNlIHRoZSBXZWJWaWV3J3MgcGluTG9jWC9ZIGZ1bmN0aW9ucyBkaXJlY3RseS4KKyAgICAgICAgZmxvYXQgc2NhbGUgPSB6b29tU2NhbGUgKiBtSW52SW5pdGlhbFpvb21TY2FsZTsKKyAgICAgICAgaW50IHR4ID0gTWF0aC5yb3VuZChzY2FsZSAqIChtSW5pdGlhbFNjcm9sbFggKyBtWm9vbUNlbnRlclgpIC0gbVpvb21DZW50ZXJYKTsKKyAgICAgICAgdHggPSAtV2ViVmlldy5waW5Mb2ModHgsIG1XZWJWaWV3LmdldFZpZXdXaWR0aCgpLCBNYXRoLnJvdW5kKG1XZWJWaWV3LmdldENvbnRlbnRXaWR0aCgpCisgICAgICAgICAgICAgICAgKiB6b29tU2NhbGUpKSArIG1XZWJWaWV3LmdldFNjcm9sbFgoKTsKKyAgICAgICAgaW50IHRpdGxlSGVpZ2h0ID0gbVdlYlZpZXcuZ2V0VGl0bGVIZWlnaHQoKTsKKyAgICAgICAgaW50IHR5ID0gTWF0aC5yb3VuZChzY2FsZQorICAgICAgICAgICAgICAgICogKG1Jbml0aWFsU2Nyb2xsWSArIG1ab29tQ2VudGVyWSAtIHRpdGxlSGVpZ2h0KQorICAgICAgICAgICAgICAgIC0gKG1ab29tQ2VudGVyWSAtIHRpdGxlSGVpZ2h0KSk7CisgICAgICAgIHR5ID0gLSh0eSA8PSB0aXRsZUhlaWdodCA/IE1hdGgubWF4KHR5LCAwKSA6IFdlYlZpZXcucGluTG9jKHR5CisgICAgICAgICAgICAgICAgLSB0aXRsZUhlaWdodCwgbVdlYlZpZXcuZ2V0Vmlld0hlaWdodCgpLCBNYXRoLnJvdW5kKG1XZWJWaWV3LmdldENvbnRlbnRIZWlnaHQoKQorICAgICAgICAgICAgICAgICogem9vbVNjYWxlKSkgKyB0aXRsZUhlaWdodCkgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCk7CisKKyAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSh0eCwgdHkpOworICAgICAgICBjYW52YXMuc2NhbGUoem9vbVNjYWxlLCB6b29tU2NhbGUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzWm9vbUFuaW1hdGluZygpIHsKKyAgICAgICAgcmV0dXJuIGlzRml4ZWRMZW5ndGhBbmltYXRpb25JblByb2dyZXNzKCkgfHwgbVBpbmNoVG9ab29tQW5pbWF0aW5nOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRml4ZWRMZW5ndGhBbmltYXRpb25JblByb2dyZXNzKCkgeworICAgICAgICByZXR1cm4gbVpvb21TY2FsZSAhPSAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hab29tU2NhbGUoYm9vbGVhbiByZWZsb3dUZXh0KSB7CisgICAgICAgIHNldFpvb21TY2FsZShtQWN0dWFsU2NhbGUsIHJlZmxvd1RleHQsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFpvb21TY2FsZShmbG9hdCBzY2FsZSwgYm9vbGVhbiByZWZsb3dUZXh0KSB7CisgICAgICAgIHNldFpvb21TY2FsZShzY2FsZSwgcmVmbG93VGV4dCwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRab29tU2NhbGUoZmxvYXQgc2NhbGUsIGJvb2xlYW4gcmVmbG93VGV4dCwgYm9vbGVhbiBmb3JjZSkgeworICAgICAgICBmaW5hbCBib29sZWFuIGlzU2NhbGVMZXNzVGhhbk1pblpvb20gPSBzY2FsZSA8IG1NaW5ab29tU2NhbGU7CisgICAgICAgIHNjYWxlID0gY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhzY2FsZSk7CisKKyAgICAgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBpbiB0aGUgem9vbSBvdmVydmlldyBtb2RlCisgICAgICAgIGlmIChpc1NjYWxlTGVzc1RoYW5NaW5ab29tICYmIG1NaW5ab29tU2NhbGUgPCBtRGVmYXVsdFNjYWxlKSB7CisgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gIWV4Y2VlZHNNaW5TY2FsZUluY3JlbWVudChzY2FsZSwgZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVmbG93VGV4dCkgeworICAgICAgICAgICAgbVRleHRXcmFwU2NhbGUgPSBzY2FsZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzY2FsZSAhPSBtQWN0dWFsU2NhbGUgfHwgZm9yY2UpIHsKKyAgICAgICAgICAgIGZsb2F0IG9sZFNjYWxlID0gbUFjdHVhbFNjYWxlOworICAgICAgICAgICAgZmxvYXQgb2xkSW52U2NhbGUgPSBtSW52QWN0dWFsU2NhbGU7CisKKyAgICAgICAgICAgIGlmIChzY2FsZSAhPSBtQWN0dWFsU2NhbGUgJiYgIW1QaW5jaFRvWm9vbUFuaW1hdGluZykgeworICAgICAgICAgICAgICAgIG1DYWxsYmFja1Byb3h5Lm9uU2NhbGVDaGFuZ2VkKG1BY3R1YWxTY2FsZSwgc2NhbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQWN0dWFsU2NhbGUgPSBzY2FsZTsKKyAgICAgICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBzY2FsZTsKKworICAgICAgICAgICAgaWYgKCFtV2ViVmlldy5kcmF3SGlzdG9yeSgpKSB7CisKKyAgICAgICAgICAgICAgICAvLyBJZiBoaXN0b3J5IFBpY3R1cmUgaXMgZHJhd24sIGRvbid0IHVwZGF0ZSBzY3JvbGwuIFRoZXkgd2lsbAorICAgICAgICAgICAgICAgIC8vIGJlIHVwZGF0ZWQgd2hlbiB3ZSBnZXQgb3V0IG9mIHRoYXQgbW9kZS4KKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgb3VyIHNjcm9sbCBzbyB3ZSBkb24ndCBhcHBlYXIgdG8ganVtcAorICAgICAgICAgICAgICAgIC8vIGkuZS4ga2VlcCB0aGUgY2VudGVyIG9mIHRoZSBkb2MgaW4gdGhlIGNlbnRlciBvZiB0aGUgdmlldworICAgICAgICAgICAgICAgIGludCBvbGRYID0gbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICAgICAgICAgIGludCBvbGRZID0gbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpOworICAgICAgICAgICAgICAgIGZsb2F0IHJhdGlvID0gc2NhbGUgKiBvbGRJbnZTY2FsZTsKKyAgICAgICAgICAgICAgICBmbG9hdCBzeCA9IHJhdGlvICogb2xkWCArIChyYXRpbyAtIDEpICogbVpvb21DZW50ZXJYOworICAgICAgICAgICAgICAgIGZsb2F0IHN5ID0gcmF0aW8gKiBvbGRZICsgKHJhdGlvIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICogKG1ab29tQ2VudGVyWSAtIG1XZWJWaWV3LmdldFRpdGxlSGVpZ2h0KCkpOworCisgICAgICAgICAgICAgICAgLy8gU2NhbGUgYWxsIHRoZSBjaGlsZCB2aWV3cworICAgICAgICAgICAgICAgIG1XZWJWaWV3Lm1WaWV3TWFuYWdlci5zY2FsZUFsbCgpOworCisgICAgICAgICAgICAgICAgLy8gYXMgd2UgZG9uJ3QgaGF2ZSBhbmltYXRpb24gZm9yIHNjYWxpbmcsIGRvbid0IGRvIGFuaW1hdGlvbgorICAgICAgICAgICAgICAgIC8vIGZvciBzY3JvbGxpbmcsIGFzIGl0IGNhdXNlcyB3ZWlyZCBpbnRlcm1lZGlhdGUgc3RhdGUKKyAgICAgICAgICAgICAgICBpbnQgc2Nyb2xsWCA9IG1XZWJWaWV3LnBpbkxvY1goTWF0aC5yb3VuZChzeCkpOworICAgICAgICAgICAgICAgIGludCBzY3JvbGxZID0gbVdlYlZpZXcucGluTG9jWShNYXRoLnJvdW5kKHN5KSk7CisgICAgICAgICAgICAgICAgaWYoIW1XZWJWaWV3LnVwZGF0ZVNjcm9sbENvb3JkaW5hdGVzKHNjcm9sbFgsIHNjcm9sbFkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzY3JvbGwgcG9zaXRpb24gaXMgYWRqdXN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gem9vbSBhbmltYXRpb24uIEJ1dCB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgV2ViS2l0IGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgdGhlIHpvb20gYW5pbWF0aW9uLiBTZWUgY29tbWVudHMgaW4gb25TY2FsZUVuZCgpLgorICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5zZW5kT3VyVmlzaWJsZVJlY3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSB3ZSBuZWVkIHRvIHJlZmxvdyB0aGUgdGV4dCB0aGVuIGZvcmNlIHRoZSBWSUVXX1NJWkVfQ0hBTkdFRAorICAgICAgICAgICAgLy8gZXZlbnQgdG8gYmUgc2VudCB0byBXZWJLaXQKKyAgICAgICAgICAgIG1XZWJWaWV3LnNlbmRWaWV3U2l6ZVpvb20ocmVmbG93VGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZG91YmxlIHRhcCBnZXN0dXJlIGNhbiByZXN1bHQgaW4gZGlmZmVyZW50IGJlaGF2aW9ycyBkZXBlbmRpbmcgb24gdGhlCisgICAgICogY29udGVudCB0aGF0IGlzIHRhcHBlZC4KKyAgICAgKgorICAgICAqICgxKSBQTFVHSU5TOiBJZiB0aGUgdGFwcyBvY2N1ciBvbiBhIHBsdWdpbiB0aGVuIHdlIG1heGltaXplIHRoZSBwbHVnaW4gb24KKyAgICAgKiB0aGUgc2NyZWVuLiBJZiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbWF4aW1pemVkIHRoZW4gem9vbSB0aGUgdXNlciBpbnRvCisgICAgICogb3ZlcnZpZXcgbW9kZS4KKyAgICAgKgorICAgICAqICgyKSBIVE1ML09USEVSOiBJZiB0aGUgdGFwcyBvY2N1ciBvdXRzaWRlIGEgcGx1Z2luIHRoZW4gdGhlIGZvbGxvd2luZworICAgICAqIGhldXJpc3RpYyBpcyB1c2VkLgorICAgICAqICAgQS4gSWYgdGhlIGN1cnJlbnQgc2NhbGUgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSB0ZXh0IHdyYXAgc2NhbGUgYW5kIHRoZQorICAgICAqICAgICAgbGF5b3V0IGFsZ29yaXRobSBzcGVjaWZpZXMgdGhlIHVzZSBvZiBOQVJST1dfQ09MVU1OUywgdGhlbiBmaXQgdG8KKyAgICAgKiAgICAgIGNvbHVtbiBieSByZWZsb3dpbmcgdGhlIHRleHQuCisgICAgICogICBCLiBJZiB0aGUgcGFnZSBpcyBub3QgaW4gb3ZlcnZpZXcgbW9kZSB0aGVuIGNoYW5nZSB0byBvdmVydmlldyBtb2RlLgorICAgICAqICAgQy4gSWYgdGhlIHBhZ2UgaXMgaW4gb3Zlcm1vZGUgdGhlbiBjaGFuZ2UgdG8gdGhlIGRlZmF1bHQgc2NhbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGFuZGxlRG91YmxlVGFwKGZsb2F0IGxhc3RUb3VjaFgsIGZsb2F0IGxhc3RUb3VjaFkpIHsKKyAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBtV2ViVmlldy5nZXRTZXR0aW5ncygpOworICAgICAgICBpZiAoc2V0dGluZ3MgPT0gbnVsbCB8fCBzZXR0aW5ncy5nZXRVc2VXaWRlVmlld1BvcnQoKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc2V0Wm9vbUNlbnRlcihsYXN0VG91Y2hYLCBsYXN0VG91Y2hZKTsKKyAgICAgICAgbUFuY2hvclggPSBtV2ViVmlldy52aWV3VG9Db250ZW50WCgoaW50KSBsYXN0VG91Y2hYICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpKTsKKyAgICAgICAgbUFuY2hvclkgPSBtV2ViVmlldy52aWV3VG9Db250ZW50WSgoaW50KSBsYXN0VG91Y2hZICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpKTsKKyAgICAgICAgc2V0dGluZ3Muc2V0RG91YmxlVGFwVG9hc3RDb3VudCgwKTsKKworICAgICAgICAvLyByZW1vdmUgdGhlIHpvb20gY29udHJvbCBhZnRlciBkb3VibGUgdGFwCisgICAgICAgIGRpc21pc3Nab29tUGlja2VyKCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlIGRvdWJsZSB0YXAgd2FzIG9uIGEgcGx1Z2luIHRoZW4gZWl0aGVyIHpvb20gdG8gbWF4aW1pemUgdGhlCisgICAgICAgICAqIHBsdWdpbiBvbiB0aGUgc2NyZWVuIG9yIHNjYWxlIHRvIG92ZXJ2aWV3IG1vZGUuCisgICAgICAgICAqLworICAgICAgICBWaWV3TWFuYWdlci5DaGlsZFZpZXcgcGx1Z2luID0gbVdlYlZpZXcubVZpZXdNYW5hZ2VyLmhpdFRlc3QobUFuY2hvclgsIG1BbmNob3JZKTsKKyAgICAgICAgaWYgKHBsdWdpbiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobVdlYlZpZXcuaXNQbHVnaW5GaXRPblNjcmVlbihwbHVnaW4pKSB7CisgICAgICAgICAgICAgICAgem9vbVRvT3ZlcnZpZXcoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuY2VudGVyRml0UmVjdChwbHVnaW4ueCwgcGx1Z2luLnksIHBsdWdpbi53aWR0aCwgcGx1Z2luLmhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2V0dGluZ3MuZ2V0TGF5b3V0QWxnb3JpdGhtKCkgPT0gV2ViU2V0dGluZ3MuTGF5b3V0QWxnb3JpdGhtLk5BUlJPV19DT0xVTU5TCisgICAgICAgICAgICAgICAgJiYgd2lsbFNjYWxlVHJpZ2dlclpvb20obVRleHRXcmFwU2NhbGUpCisgICAgICAgICAgICAgICAgLy8gRm9yIHRhYmxldCwgbm90IG11Y2ggbmVlZCB0byByZWZsb3cgdGV4dCB3L28gZG91YmxlIHRhcHBpbmcuCisgICAgICAgICAgICAgICAgJiYgIXNldHRpbmdzLmdldFVzZUZpeGVkVmlld3BvcnQoKSkgeworICAgICAgICAgICAgcmVmcmVzaFpvb21TY2FsZSh0cnVlKTsKKyAgICAgICAgfSBlbHNlIGlmICghbUluWm9vbU92ZXJ2aWV3KSB7CisgICAgICAgICAgICB6b29tVG9PdmVydmlldygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgem9vbVRvUmVhZGluZ0xldmVsKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0Wm9vbU92ZXJ2aWV3V2lkdGgoaW50IHdpZHRoKSB7CisgICAgICAgIG1ab29tT3ZlcnZpZXdXaWR0aCA9IHdpZHRoOworICAgICAgICBtSW52Wm9vbU92ZXJ2aWV3V2lkdGggPSAxLjBmIC8gd2lkdGg7CisgICAgfQorCisgICAgcHJpdmF0ZSBmbG9hdCBnZXRab29tT3ZlcnZpZXdTY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1XZWJWaWV3LmdldFZpZXdXaWR0aCgpICogbUludlpvb21PdmVydmlld1dpZHRoOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW5ab29tT3ZlcnZpZXcoKSB7CisgICAgICAgIHJldHVybiBtSW5ab29tT3ZlcnZpZXc7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHpvb21Ub092ZXJ2aWV3KCkgeworICAgICAgICBpZiAoIXdpbGxTY2FsZVRyaWdnZXJab29tKGdldFpvb21PdmVydmlld1NjYWxlKCkpKSByZXR1cm47CisKKyAgICAgICAgLy8gRm9yY2UgdGhlIHRpdGxlYmFyIGZ1bGx5IHJldmVhbCBpbiBvdmVydmlldyBtb2RlCisgICAgICAgIGludCBzY3JvbGxZID0gbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpOworICAgICAgICBpZiAoc2Nyb2xsWSA8IG1XZWJWaWV3LmdldFRpdGxlSGVpZ2h0KCkpIHsKKyAgICAgICAgICAgIG1XZWJWaWV3LnVwZGF0ZVNjcm9sbENvb3JkaW5hdGVzKG1XZWJWaWV3LmdldFNjcm9sbFgoKSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhcnRab29tQW5pbWF0aW9uKGdldFpvb21PdmVydmlld1NjYWxlKCksIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB6b29tVG9SZWFkaW5nTGV2ZWwoKSB7CisgICAgICAgIGZpbmFsIGZsb2F0IHJlYWRpbmdTY2FsZSA9IGdldFJlYWRpbmdMZXZlbFNjYWxlKCk7CisgICAgICAgIGludCBsZWZ0ID0gbVdlYlZpZXcubmF0aXZlR2V0QmxvY2tMZWZ0RWRnZShtQW5jaG9yWCwgbUFuY2hvclksIG1BY3R1YWxTY2FsZSk7CisgICAgICAgIGlmIChsZWZ0ICE9IFdlYlZpZXcuTk9fTEVGVEVER0UpIHsKKyAgICAgICAgICAgIC8vIGFkZCBhIDVwdCBwYWRkaW5nIHRvIHRoZSBsZWZ0IGVkZ2UuCisgICAgICAgICAgICBpbnQgdmlld0xlZnQgPSBtV2ViVmlldy5jb250ZW50VG9WaWV3WChsZWZ0IDwgNSA/IDAgOiAobGVmdCAtIDUpKQorICAgICAgICAgICAgICAgICAgICAtIG1XZWJWaWV3LmdldFNjcm9sbFgoKTsKKyAgICAgICAgICAgIC8vIFJlLWNhbGN1bGF0ZSB0aGUgem9vbSBjZW50ZXIgc28gdGhhdCB0aGUgbmV3IHNjcm9sbCB4IHdpbGwgYmUKKyAgICAgICAgICAgIC8vIG9uIHRoZSBsZWZ0IGVkZ2UuCisgICAgICAgICAgICBpZiAodmlld0xlZnQgPiAwKSB7CisgICAgICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gdmlld0xlZnQgKiByZWFkaW5nU2NhbGUgLyAocmVhZGluZ1NjYWxlIC0gbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuc2Nyb2xsQnkodmlld0xlZnQsIDApOworICAgICAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhcnRab29tQW5pbWF0aW9uKHJlYWRpbmdTY2FsZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlTXVsdGlUb3VjaFN1cHBvcnQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIC8vIGNoZWNrIHRoZSBwcmVjb25kaXRpb25zCisgICAgICAgIGFzc2VydCBtV2ViVmlldy5nZXRTZXR0aW5ncygpICE9IG51bGw7CisKKyAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBtV2ViVmlldy5nZXRTZXR0aW5ncygpOworICAgICAgICBtU3VwcG9ydE11bHRpVG91Y2ggPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuaGFzU3lzdGVtRmVhdHVyZSgKKyAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RPVUNIU0NSRUVOX01VTFRJVE9VQ0gpCisgICAgICAgICAgICAgICAgJiYgc2V0dGluZ3Muc3VwcG9ydFpvb20oKSAmJiBzZXR0aW5ncy5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCk7CisgICAgICAgIGlmIChtU3VwcG9ydE11bHRpVG91Y2ggJiYgKG1TY2FsZURldGVjdG9yID09IG51bGwpKSB7CisgICAgICAgICAgICBtU2NhbGVEZXRlY3RvciA9IG5ldyBTY2FsZUdlc3R1cmVEZXRlY3Rvcihjb250ZXh0LCBuZXcgU2NhbGVEZXRlY3Rvckxpc3RlbmVyKCkpOworICAgICAgICB9IGVsc2UgaWYgKCFtU3VwcG9ydE11bHRpVG91Y2ggJiYgKG1TY2FsZURldGVjdG9yICE9IG51bGwpKSB7CisgICAgICAgICAgICBtU2NhbGVEZXRlY3RvciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c011bHRpVG91Y2hab29tKCkgeworICAgICAgICByZXR1cm4gbVN1cHBvcnRNdWx0aVRvdWNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoZSBjYWxsZXIgdGhhdCB0aGUgWm9vbU1hbmFnZXIgaXMgcmVxdWVzdGluZyB0aGF0IHNjYWxlIHJlbGF0ZWQKKyAgICAgKiB1cGRhdGVzIHNob3VsZCBub3QgYmUgc2VudCB0byB3ZWJraXQuIFRoaXMgY2FuIG9jY3VyIGluIGNhc2VzIHdoZXJlIHRoZQorICAgICAqIFpvb21NYW5hZ2VyIGlzIHBlcmZvcm1pbmcgYW4gYW5pbWF0aW9uIGFuZCBkb2VzIG5vdCB3YW50IHdlYmtpdCB0byB1cGRhdGUKKyAgICAgKiB1bnRpbCB0aGUgYW5pbWF0aW9uIGlzIGNvbXBsZXRlLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHNjYWxlIHJlbGF0ZWQgdXBkYXRlcyBzaG91bGQgbm90IGJlIHNlbnQgdG8gd2Via2l0IGFuZAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUHJldmVudGluZ1dlYmtpdFVwZGF0ZXMoKSB7CisgICAgICAgIC8vIGN1cnJlbnRseSBvbmx5IGFuaW1hdGluZyBhIG11bHRpLXRvdWNoIHpvb20gcHJldmVudHMgdXBkYXRlcywgYnV0CisgICAgICAgIC8vIG90aGVycyBjYW4gYWRkIHRoZWlyIG93biBjb25kaXRpb25zIHRvIHRoaXMgbWV0aG9kIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgcmV0dXJuIG1QaW5jaFRvWm9vbUFuaW1hdGluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZ2V0TXVsdGlUb3VjaEdlc3R1cmVEZXRlY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIG1TY2FsZURldGVjdG9yOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2NhbGVEZXRlY3Rvckxpc3RlbmVyIGltcGxlbWVudHMgU2NhbGVHZXN0dXJlRGV0ZWN0b3IuT25TY2FsZUdlc3R1cmVMaXN0ZW5lciB7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25TY2FsZUJlZ2luKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgICAgICBkaXNtaXNzWm9vbVBpY2tlcigpOworICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLnN0YXJ0Wm9vbSgpOworICAgICAgICAgICAgbVdlYlZpZXcub25QaW5jaFRvWm9vbUFuaW1hdGlvblN0YXJ0KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uU2NhbGUoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKKyAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gTWF0aC5yb3VuZChkZXRlY3Rvci5nZXRTY2FsZUZhY3RvcigpICogbUFjdHVhbFNjYWxlICogMTAwKSAqIDAuMDFmOworICAgICAgICAgICAgaWYgKHdpbGxTY2FsZVRyaWdnZXJab29tKHNjYWxlKSkgeworICAgICAgICAgICAgICAgIG1QaW5jaFRvWm9vbUFuaW1hdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgLy8gbGltaXQgdGhlIHNjYWxlIGNoYW5nZSBwZXIgc3RlcAorICAgICAgICAgICAgICAgIGlmIChzY2FsZSA+IG1BY3R1YWxTY2FsZSkgeworICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IE1hdGgubWluKHNjYWxlLCBtQWN0dWFsU2NhbGUgKiAxLjI1Zik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBNYXRoLm1heChzY2FsZSwgbUFjdHVhbFNjYWxlICogMC44Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldFpvb21DZW50ZXIoZGV0ZWN0b3IuZ2V0Rm9jdXNYKCksIGRldGVjdG9yLmdldEZvY3VzWSgpKTsKKyAgICAgICAgICAgICAgICBzZXRab29tU2NhbGUoc2NhbGUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblNjYWxlRW5kKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgICAgICBpZiAobVBpbmNoVG9ab29tQW5pbWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbVBpbmNoVG9ab29tQW5pbWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbUFuY2hvclggPSBtV2ViVmlldy52aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtV2ViVmlldy5nZXRTY3JvbGxYKCkpOworICAgICAgICAgICAgICAgIG1BbmNob3JZID0gbVdlYlZpZXcudmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpKTsKKyAgICAgICAgICAgICAgICAvLyBkb24ndCByZWZsb3cgd2hlbiB6b29tIGluOyB3aGVuIHpvb20gb3V0LCBkbyByZWZsb3cgaWYgdGhlCisgICAgICAgICAgICAgICAgLy8gbmV3IHNjYWxlIGlzIGFsbW9zdCBtaW5pbXVtIHNjYWxlOworICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVmbG93Tm93ID0gIWNhblpvb21PdXQoKSB8fCAobUFjdHVhbFNjYWxlIDw9IDAuOCAqIG1UZXh0V3JhcFNjYWxlKTsKKyAgICAgICAgICAgICAgICAvLyBmb3JjZSB6b29tIGFmdGVyIG1QcmV2aWV3Wm9vbU9ubHkgaXMgc2V0IHRvIGZhbHNlIHNvIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgLy8gbmV3IHZpZXcgc2l6ZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgV2ViS2l0CisgICAgICAgICAgICAgICAgcmVmcmVzaFpvb21TY2FsZShyZWZsb3dOb3cpOworICAgICAgICAgICAgICAgIC8vIGNhbGwgaW52YWxpZGF0ZSgpIHRvIGRyYXcgd2l0aG91dCB6b29tIGZpbHRlcgorICAgICAgICAgICAgICAgIG1XZWJWaWV3LmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLmVuZFpvb20oKTsKKyAgICAgICAgICAgIG1XZWJWaWV3Lm9uUGluY2hUb1pvb21BbmltYXRpb25FbmQoZGV0ZWN0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TaXplQ2hhbmdlZChpbnQgdywgaW50IGgsIGludCBvdywgaW50IG9oKSB7CisgICAgICAgIC8vIHJlc2V0IHpvb20gYW5kIGFuY2hvciB0byB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBzY3JlZW4KKyAgICAgICAgLy8gdW5sZXNzIHdlIGFyZSBhbHJlYWR5IHpvb21pbmcKKyAgICAgICAgaWYgKCFpc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpKSB7CisgICAgICAgICAgICBpbnQgdmlzaWJsZVRpdGxlSGVpZ2h0ID0gbVdlYlZpZXcuZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCk7CisgICAgICAgICAgICBtWm9vbUNlbnRlclggPSAwOworICAgICAgICAgICAgbVpvb21DZW50ZXJZID0gdmlzaWJsZVRpdGxlSGVpZ2h0OworICAgICAgICAgICAgbUFuY2hvclggPSBtV2ViVmlldy52aWV3VG9Db250ZW50WChtV2ViVmlldy5nZXRTY3JvbGxYKCkpOworICAgICAgICAgICAgbUFuY2hvclkgPSBtV2ViVmlldy52aWV3VG9Db250ZW50WSh2aXNpYmxlVGl0bGVIZWlnaHQgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdXBkYXRlIG1NaW5ab29tU2NhbGUgaWYgdGhlIG1pbmltdW0gem9vbSBzY2FsZSBpcyBub3QgZml4ZWQKKyAgICAgICAgaWYgKCFtTWluWm9vbVNjYWxlRml4ZWQpIHsKKyAgICAgICAgICAgIC8vIHdoZW4gY2hhbmdlIGZyb20gbmFycm93IHNjcmVlbiB0byB3aWRlIHNjcmVlbiwgdGhlIG5ldyB2aWV3V2lkdGgKKyAgICAgICAgICAgIC8vIGNhbiBiZSB3aWRlciB0aGFuIHRoZSBvbGQgY29udGVudCB3aWR0aC4gV2UgbGltaXQgdGhlIG1pbmltdW0KKyAgICAgICAgICAgIC8vIHNjYWxlIHRvIDEuMGYuIFRoZSBwcm9wZXIgbWluaW11bSBzY2FsZSB3aWxsIGJlIGNhbGN1bGF0ZWQgd2hlbgorICAgICAgICAgICAgLy8gdGhlIG5ldyBwaWN0dXJlIHNob3dzIHVwLgorICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IE1hdGgubWluKDEuMGYsIChmbG9hdCkgbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCkKKyAgICAgICAgICAgICAgICAgICAgLyAobVdlYlZpZXcuZHJhd0hpc3RvcnkoKSA/IG1XZWJWaWV3LmdldEhpc3RvcnlQaWN0dXJlV2lkdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbVpvb21PdmVydmlld1dpZHRoKSk7CisgICAgICAgICAgICAvLyBsaW1pdCB0aGUgbWluWm9vbVNjYWxlIHRvIHRoZSBpbml0aWFsU2NhbGUgaWYgaXQgaXMgc2V0CisgICAgICAgICAgICBpZiAobUluaXRpYWxTY2FsZSA+IDAgJiYgbUluaXRpYWxTY2FsZSA8IG1NaW5ab29tU2NhbGUpIHsKKyAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gbUluaXRpYWxTY2FsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRpc21pc3Nab29tUGlja2VyKCk7CisKKyAgICAgICAgLy8gb25TaXplQ2hhbmdlZCgpIGlzIGNhbGxlZCBkdXJpbmcgV2ViVmlldyBsYXlvdXQuIEFuZCBhbnkKKyAgICAgICAgLy8gcmVxdWVzdExheW91dCgpIGlzIGJsb2NrZWQgZHVyaW5nIGxheW91dC4gQXMgcmVmcmVzaFpvb21TY2FsZSgpIHdpbGwKKyAgICAgICAgLy8gY2F1c2UgaXRzIGNoaWxkIFZpZXcgdG8gcmVwb3NpdGlvbiBpdHNlbGYgdGhyb3VnaCBWaWV3TWFuYWdlcidzCisgICAgICAgIC8vIHNjYWxlQWxsKCksIHdlIG5lZWQgdG8gcG9zdCBhIFJ1bm5hYmxlIHRvIGVuc3VyZSByZXF1ZXN0TGF5b3V0KCkuCisgICAgICAgIC8vIEFkZGl0aW9uYWxseSwgb25seSB1cGRhdGUgdGhlIHRleHQgd3JhcCBzY2FsZSBpZiB0aGUgd2lkdGggY2hhbmdlZC4KKyAgICAgICAgbVdlYlZpZXcucG9zdChuZXcgUG9zdFNjYWxlKHcgIT0gb3cpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBvc3RTY2FsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBtVXBkYXRlVGV4dFdyYXA7CisKKyAgICAgICAgcHVibGljIFBvc3RTY2FsZShib29sZWFuIHVwZGF0ZVRleHRXcmFwKSB7CisgICAgICAgICAgICBtVXBkYXRlVGV4dFdyYXAgPSB1cGRhdGVUZXh0V3JhcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGlmIChtV2ViVmlldy5nZXRXZWJWaWV3Q29yZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBhbHdheXMgZm9yY2UsIGluIGNhc2Ugb3VyIGhlaWdodCBjaGFuZ2VkLCBpbiB3aGljaCBjYXNlIHdlCisgICAgICAgICAgICAgICAgLy8gc3RpbGwgd2FudCB0byBzZW5kIHRoZSBub3RpZmljYXRpb24gb3ZlciB0byB3ZWJraXQuCisgICAgICAgICAgICAgICAgc2V0Wm9vbVNjYWxlKE1hdGgubWF4KG1BY3R1YWxTY2FsZSwgZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKSksCisgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVUZXh0V3JhcCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB6b29tIGJ1dHRvbnMgYXMgdGhlIHNjYWxlIGNhbiBiZSBjaGFuZ2VkCisgICAgICAgICAgICAgICAgdXBkYXRlWm9vbVBpY2tlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlWm9vbVJhbmdlKFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSB2aWV3U3RhdGUsCisgICAgICAgICAgICBpbnQgdmlld1dpZHRoLCBpbnQgbWluUHJlZldpZHRoKSB7CisgICAgICAgIGlmICh2aWV3U3RhdGUubU1pblNjYWxlID09IDApIHsKKyAgICAgICAgICAgIGlmICh2aWV3U3RhdGUubU1vYmlsZVNpdGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobWluUHJlZldpZHRoID4gTWF0aC5tYXgoMCwgdmlld1dpZHRoKSkgeworICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gKGZsb2F0KSB2aWV3V2lkdGggLyBtaW5QcmVmV2lkdGg7CisgICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSB2aWV3U3RhdGUubURlZmF1bHRTY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBtRGVmYXVsdE1pblpvb21TY2FsZTsKKyAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSB2aWV3U3RhdGUubU1pblNjYWxlOworICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlld1N0YXRlLm1NYXhTY2FsZSA9PSAwKSB7CisgICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gbURlZmF1bHRNYXhab29tU2NhbGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gdmlld1N0YXRlLm1NYXhTY2FsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgem9vbSB2YWx1ZXMgd2hlbiBXZWJraXQgcHJvZHVjZXMgYSBuZXcgcGljdHVyZS4gVGhpcyBtZXRob2QKKyAgICAgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkJ3MgbWVzc2FnZSBoYW5kbGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uTmV3UGljdHVyZShXZWJWaWV3Q29yZS5EcmF3RGF0YSBkcmF3RGF0YSkgeworICAgICAgICBmaW5hbCBpbnQgdmlld1dpZHRoID0gbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCk7CisKKyAgICAgICAgaWYgKCFtV2ViVmlldy5nZXRTZXR0aW5ncygpLmdldFVzZUZpeGVkVmlld3BvcnQoKQorICAgICAgICAgICAgJiYgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5nZXRVc2VXaWRlVmlld1BvcnQoKSkgeworICAgICAgICAgICAgLy8gbGltaXQgbVpvb21PdmVydmlld1dpZHRoIHVwcGVyIGJvdW5kIHRvCisgICAgICAgICAgICAvLyBzTWF4Vmlld3BvcnRXaWR0aCBzbyB0aGF0IGlmIHRoZSBwYWdlIGRvZXNuJ3QgYmVoYXZlCisgICAgICAgICAgICAvLyB3ZWxsLCB0aGUgV2ViVmlldyB3b24ndCBnbyBpbnNhbmUuIGxpbWl0IHRoZSBsb3dlcgorICAgICAgICAgICAgLy8gYm91bmQgdG8gbWF0Y2ggdGhlIGRlZmF1bHQgc2NhbGUgZm9yIG1vYmlsZSBzaXRlcy4KKyAgICAgICAgICAgIHNldFpvb21PdmVydmlld1dpZHRoKE1hdGgubWluKFdlYlZpZXcuc01heFZpZXdwb3J0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KChpbnQpICh2aWV3V2lkdGggKiBtSW52RGVmYXVsdFNjYWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChkcmF3RGF0YS5tTWluUHJlZldpZHRoLCBkcmF3RGF0YS5tVmlld1BvaW50LngpKSkpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgZmxvYXQgem9vbU92ZXJ2aWV3U2NhbGUgPSBnZXRab29tT3ZlcnZpZXdTY2FsZSgpOworICAgICAgICBpZiAoIW1NaW5ab29tU2NhbGVGaXhlZCkgeworICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IHpvb21PdmVydmlld1NjYWxlOworICAgICAgICB9CisgICAgICAgIC8vIGZpdCB0aGUgY29udGVudCB3aWR0aCB0byB0aGUgY3VycmVudCB2aWV3LiBJZ25vcmUgdGhlIHJvdW5kaW5nIGVycm9yIGNhc2UuCisgICAgICAgIGlmICghbVdlYlZpZXcuZHJhd0hpc3RvcnkoKSAmJiAobUluaXRpYWxab29tT3ZlcnZpZXcgfHwgKG1Jblpvb21PdmVydmlldworICAgICAgICAgICAgICAgICYmIE1hdGguYWJzKCh2aWV3V2lkdGggKiBtSW52QWN0dWFsU2NhbGUpIC0gbVpvb21PdmVydmlld1dpZHRoKSA+IDEpKSkgeworICAgICAgICAgICAgbUluaXRpYWxab29tT3ZlcnZpZXcgPSBmYWxzZTsKKyAgICAgICAgICAgIHNldFpvb21TY2FsZSh6b29tT3ZlcnZpZXdTY2FsZSwgIXdpbGxTY2FsZVRyaWdnZXJab29tKG1UZXh0V3JhcFNjYWxlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHpvb20gdmFsdWVzIGFmdGVyIFdlYmtpdCBjb21wbGV0ZXMgdGhlIGluaXRpYWwgcGFnZSBsYXlvdXQuIEl0CisgICAgICogaXMgY2FsbGVkIHdoZW4gdmlzaXRpbmcgYSBwYWdlIGZvciB0aGUgZmlyc3QgdGltZSBhcyB3ZWxsIGFzIHdoZW4gdGhlCisgICAgICogdXNlciBuYXZpZ2F0ZXMgYmFjayB0byBhIHBhZ2UgKGluIHdoaWNoIGNhc2Ugd2UgbWF5IG5lZWQgdG8gcmVzdG9yZSB0aGUKKyAgICAgKiB6b29tIGxldmVscyB0byB0aGUgc3RhdGUgdGhleSB3ZXJlIHdoZW4geW91IGxlZnQgdGhlIHBhZ2UpLiBUaGlzIG1ldGhvZAorICAgICAqIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQncyBtZXNzYWdlIGhhbmRsZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25GaXJzdExheW91dChXZWJWaWV3Q29yZS5EcmF3RGF0YSBkcmF3RGF0YSkgeworICAgICAgICAvLyBwcmVjb25kaXRpb24gY2hlY2sKKyAgICAgICAgYXNzZXJ0IGRyYXdEYXRhICE9IG51bGw7CisgICAgICAgIGFzc2VydCBkcmF3RGF0YS5tVmlld1N0YXRlICE9IG51bGw7CisgICAgICAgIGFzc2VydCBtV2ViVmlldy5nZXRTZXR0aW5ncygpICE9IG51bGw7CisKKyAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIHZpZXdTdGF0ZSA9IGRyYXdEYXRhLm1WaWV3U3RhdGU7CisgICAgICAgIGZpbmFsIFBvaW50IHZpZXdTaXplID0gZHJhd0RhdGEubVZpZXdQb2ludDsKKyAgICAgICAgdXBkYXRlWm9vbVJhbmdlKHZpZXdTdGF0ZSwgdmlld1NpemUueCwgZHJhd0RhdGEubU1pblByZWZXaWR0aCk7CisKKyAgICAgICAgaWYgKCFtV2ViVmlldy5kcmF3SGlzdG9yeSgpKSB7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVmbG93VGV4dDsKKworICAgICAgICAgICAgaWYgKG1Jbml0aWFsU2NhbGUgPiAwKSB7CisgICAgICAgICAgICAgICAgc2NhbGUgPSBtSW5pdGlhbFNjYWxlOworICAgICAgICAgICAgICAgIHJlZmxvd1RleHQgPSBleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQobVRleHRXcmFwU2NhbGUsIHNjYWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmlld1N0YXRlLm1WaWV3U2NhbGUgPiAwKSB7CisgICAgICAgICAgICAgICAgbVRleHRXcmFwU2NhbGUgPSB2aWV3U3RhdGUubVRleHRXcmFwU2NhbGU7CisgICAgICAgICAgICAgICAgc2NhbGUgPSB2aWV3U3RhdGUubVZpZXdTY2FsZTsKKyAgICAgICAgICAgICAgICByZWZsb3dUZXh0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHNldHRpbmdzLmdldExvYWRXaXRoT3ZlcnZpZXdNb2RlKCkgfHwgc2V0dGluZ3MuZ2V0VXNlRml4ZWRWaWV3cG9ydCgpKSkgeworICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbFpvb21PdmVydmlldyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gKGZsb2F0KSBtV2ViVmlldy5nZXRWaWV3V2lkdGgoKSAvIFdlYlZpZXcuREVGQVVMVF9WSUVXUE9SVF9XSURUSDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IHZpZXdTdGF0ZS5tVGV4dFdyYXBTY2FsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVmbG93VGV4dCA9IGV4Y2VlZHNNaW5TY2FsZUluY3JlbWVudChtVGV4dFdyYXBTY2FsZSwgc2NhbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0Wm9vbVNjYWxlKHNjYWxlLCByZWZsb3dUZXh0KTsKKworICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB6b29tIGJ1dHRvbnMgYXMgdGhlIHNjYWxlIGNhbiBiZSBjaGFuZ2VkCisgICAgICAgICAgICB1cGRhdGVab29tUGlja2VyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlWm9vbVN0YXRlKEJ1bmRsZSBiKSB7CisgICAgICAgIGIucHV0RmxvYXQoInNjYWxlIiwgbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgYi5wdXRGbG9hdCgidGV4dHdyYXBTY2FsZSIsIG1UZXh0V3JhcFNjYWxlKTsKKyAgICAgICAgYi5wdXRCb29sZWFuKCJvdmVydmlldyIsIG1Jblpvb21PdmVydmlldyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzdG9yZVpvb21TdGF0ZShCdW5kbGUgYikgeworICAgICAgICAvLyBhcyBnZXRXaWR0aCgpIC8gZ2V0SGVpZ2h0KCkgb2YgdGhlIHZpZXcgYXJlIG5vdCBhdmFpbGFibGUgeWV0LCBzZXQgdXAKKyAgICAgICAgLy8gbUFjdHVhbFNjYWxlLCBzbyB0aGF0IHdoZW4gb25TaXplQ2hhbmdlZCgpIGlzIGNhbGxlZCwgdGhlIHJlc3Qgd2lsbAorICAgICAgICAvLyBiZSBzZXQgY29ycmVjdGx5CisgICAgICAgIG1BY3R1YWxTY2FsZSA9IGIuZ2V0RmxvYXQoInNjYWxlIiwgMS4wZik7CisgICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBtQWN0dWFsU2NhbGU7CisgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gYi5nZXRGbG9hdCgidGV4dHdyYXBTY2FsZSIsIG1BY3R1YWxTY2FsZSk7CisgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGIuZ2V0Qm9vbGVhbigib3ZlcnZpZXciKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFpvb21Db250cm9sQmFzZSBnZXRDdXJyZW50Wm9vbUNvbnRyb2woKSB7CisgICAgICAgIGlmIChtV2ViVmlldy5nZXRTZXR0aW5ncygpICE9IG51bGwgJiYgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zdXBwb3J0Wm9vbSgpKSB7CisgICAgICAgICAgICBpZiAobVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUVtYmVkZGVkWm9vbUNvbnRyb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtRW1iZWRkZWRab29tQ29udHJvbCA9IG5ldyBab29tQ29udHJvbEVtYmVkZGVkKHRoaXMsIG1XZWJWaWV3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1FbWJlZGRlZFpvb21Db250cm9sOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobUV4dGVybmFsWm9vbUNvbnRyb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtRXh0ZXJuYWxab29tQ29udHJvbCA9IG5ldyBab29tQ29udHJvbEV4dGVybmFsKG1XZWJWaWV3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1FeHRlcm5hbFpvb21Db250cm9sOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGludm9rZVpvb21QaWNrZXIoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRyb2wuc2hvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGlzbWlzc1pvb21QaWNrZXIoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRyb2wuaGlkZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNab29tUGlja2VyVmlzaWJsZSgpIHsKKyAgICAgICAgWm9vbUNvbnRyb2xCYXNlIGNvbnRyb2wgPSBnZXRDdXJyZW50Wm9vbUNvbnRyb2woKTsKKyAgICAgICAgcmV0dXJuIChjb250cm9sICE9IG51bGwpID8gY29udHJvbC5pc1Zpc2libGUoKSA6IGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVpvb21QaWNrZXIoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRyb2wudXBkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZW1iZWRkZWQgem9vbSBjb250cm9sIGludGVyY2VwdHMgdG91Y2ggZXZlbnRzIGFuZCBhdXRvbWF0aWNhbGx5IHN0YXlzCisgICAgICogdmlzaWJsZS4gVGhlIGV4dGVybmFsIGNvbnRyb2wgbmVlZHMgdG8gY29uc3RhbnRseSByZWZyZXNoIGl0cyBpbnRlcm5hbAorICAgICAqIHRpbWVyIHRvIHN0YXkgdmlzaWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBrZWVwWm9vbVBpY2tlclZpc2libGUoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIGlmIChjb250cm9sICE9IG51bGwgJiYgY29udHJvbCA9PSBtRXh0ZXJuYWxab29tQ29udHJvbCkgeworICAgICAgICAgICAgY29udHJvbC5zaG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRFeHRlcm5hbFpvb21QaWNrZXIoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIGlmIChjb250cm9sICE9IG51bGwgJiYgY29udHJvbCA9PSBtRXh0ZXJuYWxab29tQ29udHJvbCkgeworICAgICAgICAgICAgcmV0dXJuIG1FeHRlcm5hbFpvb21Db250cm9sLmdldENvbnRyb2xzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYnJ1bnRpbWUvV2ViUnVudGltZUFjdGl2aXR5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJydW50aW1lL1dlYlJ1bnRpbWVBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOGM2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJydW50aW1lL1dlYlJ1bnRpbWVBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndlYnJ1bnRpbWU7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2Via2l0Lkdlb2xvY2F0aW9uUGVybWlzc2lvbnM7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViQ2hyb21lQ2xpZW50OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NsaWVudDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiBUaGUgcnVudGltZSB1c2VkIHRvIGRpc3BsYXkgaW5zdGFsbGVkIHdlYiBhcHBsaWNhdGlvbnMuCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgV2ViUnVudGltZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkKK3sKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HVEFHID0gIldlYlJ1bnRpbWVBY3Rpdml0eSI7CisKKyAgICBwcml2YXRlIFdlYlZpZXcgbVdlYlZpZXc7CisgICAgcHJpdmF0ZSBVUkwgbUJhc2VVcmw7CisgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbVNwbGFzaFNjcmVlbjsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2Vuc2l0aXZlRmVhdHVyZXMgeworICAgICAgICAvLyBBbGwgb2YgdGhlIHNlbnNpdGl2ZSBmZWF0dXJlcworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUdlb2xvY2F0aW9uOworICAgICAgICAvLyBPbiBBbmRyb2lkLCB0aGUgQnJvd3NlciBkb2Vzbid0IHByb21wdCBmb3IgZGF0YWJhc2UgYWNjZXNzLCBzbyB3ZSBkb24ndCByZXF1aXJlIGFuCisgICAgICAgIC8vIGV4cGxpY2l0IHBlcm1pc3Npb24gaGVyZSBpbiB0aGUgV2ViUnVudGltZUFjdGl2aXR5LCBhbmQgdGhlcmUncyBubyBBbmRyb2lkIHN5c3RlbQorICAgICAgICAvLyBwZXJtaXNzaW9uIHJlcXVpcmVkIGZvciBpdCBlaXRoZXIuCisgICAgICAgIC8vcHJpdmF0ZSBib29sZWFuIG1EYXRhYmFzZTsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRHZW9sb2NhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtR2VvbG9jYXRpb247CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgc2V0R2VvbG9jYXRpb24oYm9vbGVhbiBnZW9sb2NhdGlvbikgeworICAgICAgICAgICAgbUdlb2xvY2F0aW9uID0gZ2VvbG9jYXRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIGZpcnN0IGNyZWF0ZWQuICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkKKyAgICB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgLy8gQ2FuJ3QgZ2V0IG1ldGEgZGF0YSB1c2luZyBnZXRBcHBsaWNhdGlvbkluZm8oKSBhcyBpdCBkb2Vzbid0IHBhc3MgR0VUX01FVEFfREFUQQorICAgICAgICBQYWNrYWdlTWFuYWdlciBwYWNrYWdlTWFuYWdlciA9IGdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSA9IG5ldyBDb21wb25lbnROYW1lKHRoaXMsIGdldENsYXNzKCkpOworICAgICAgICBBY3Rpdml0eUluZm8gYWN0aXZpdHlJbmZvID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFjdGl2aXR5SW5mbyA9IHBhY2thZ2VNYW5hZ2VyLmdldEFjdGl2aXR5SW5mbyhjb21wb25lbnROYW1lLCBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKKyAgICAgICAgfSBjYXRjaCAoUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5kKExPR1RBRywgIkZhaWxlZCB0byBmaW5kIGNvbXBvbmVudCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChhY3Rpdml0eUluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAiRmFpbGVkIHRvIGdldCBhY3Rpdml0eSBpbmZvIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBCdW5kbGUgbWV0YURhdGEgPSBhY3Rpdml0eUluZm8ubWV0YURhdGE7CisgICAgICAgIGlmIChtZXRhRGF0YSA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZChMT0dUQUcsICJObyBtZXRhIGRhdGEiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyB1cmwgPSBtZXRhRGF0YS5nZXRTdHJpbmcoImFuZHJvaWQud2VicnVudGltZS51cmwiKTsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZChMT0dUQUcsICJObyBVUkwiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmFzZVVybCA9IG5ldyBVUkwodXJsKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5kKExPR1RBRywgIkludmFsaWQgVVJMIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBBbGwgZmFsc2UgYnkgZGVmYXVsdCwgYW5kIHJlYWRpbmcgbm9uLWV4aXN0ZW50IGJ1bmRsZSBwcm9wZXJ0aWVzIGdpdmVzIGZhbHNlIHRvby4KKyAgICAgICAgZmluYWwgU2Vuc2l0aXZlRmVhdHVyZXMgc2Vuc2l0aXZlRmVhdHVyZXMgPSBuZXcgU2Vuc2l0aXZlRmVhdHVyZXMoKTsKKyAgICAgICAgc2Vuc2l0aXZlRmVhdHVyZXMuc2V0R2VvbG9jYXRpb24obWV0YURhdGEuZ2V0Qm9vbGVhbigiYW5kcm9pZC53ZWJydW50aW1lLlNlbnNpdGl2ZUZlYXR1cmVzR2VvbG9jYXRpb24iKSk7CisKKyAgICAgICAgZ2V0V2luZG93KCkucmVxdWVzdEZlYXR1cmUoV2luZG93LkZFQVRVUkVfTk9fVElUTEUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC53ZWJfcnVudGltZSk7CisgICAgICAgIG1XZWJWaWV3ID0gKFdlYlZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLndlYnZpZXcpOworICAgICAgICBtU3BsYXNoU2NyZWVuID0gKEltYWdlVmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3BsYXNoc2NyZWVuKTsKKyAgICAgICAgbVNwbGFzaFNjcmVlbi5zZXRJbWFnZVJlc291cmNlKAorICAgICAgICAgICAgICAgIGdldFJlc291cmNlcygpLmdldElkZW50aWZpZXIoInNwbGFzaF9zY3JlZW4iLCAiZHJhd2FibGUiLCBnZXRQYWNrYWdlTmFtZSgpKSk7CisgICAgICAgIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuc2V0SmF2YVNjcmlwdEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIG1XZWJWaWV3LnNldFdlYlZpZXdDbGllbnQobmV3IFdlYlZpZXdDbGllbnQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHNob3VsZE92ZXJyaWRlVXJsTG9hZGluZyhXZWJWaWV3IHZpZXcsIFN0cmluZyB1cmwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBVUkwgbmV3T3JpZ2luID0gbmV3IFVSTCh1cmwpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXJlU2FtZU9yaWdpbihtQmFzZVVybCwgbmV3T3JpZ2luKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgc2ltcGxlIHNhbWUgb3JpZ2luIHRlc3QgcGFzc2VzLCBsb2FkIGluIHRoZSB3ZWJ2aWV3LgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBsb2FkIGFueXRoaW5nIGlmIHRoaXMgd2Fzbid0IGEgcHJvcGVyIFVSTC4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHRoaXMgaXMgYSBVUkwgdGhhdCBpcyBub3Qgc2FtZSBvcmlnaW4gc28gcGFzcyBpdCB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyBCcm93c2VyIHRvIGxvYWQuCisgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShuZXcgSW50ZW50KEludGVudC5BQ1RJT05fVklFVywgVXJpLnBhcnNlKHVybCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblBhZ2VGaW5pc2hlZChXZWJWaWV3IHZpZXcsIFN0cmluZyB1cmwpIHsKKyAgICAgICAgICAgICAgICBpZiAobVNwbGFzaFNjcmVlbiAhPSBudWxsICYmIG1TcGxhc2hTY3JlZW4uZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgeworICAgICAgICAgICAgICAgICAgICBtU3BsYXNoU2NyZWVuLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICAgICAgbVNwbGFzaFNjcmVlbiA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBVc2UgYSBjdXN0b20gV2ViQ2hyb21lQ2xpZW50IHdpdGggZ2VvbG9jYXRpb24gcGVybWlzc2lvbnMgaGFuZGxpbmcuCisgICAgICAgIG1XZWJWaWV3LnNldFdlYkNocm9tZUNsaWVudChuZXcgV2ViQ2hyb21lQ2xpZW50KCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25HZW9sb2NhdGlvblBlcm1pc3Npb25zU2hvd1Byb21wdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcmlnaW4sIEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICAvLyBBbGxvdyB0aGlzIG9yaWdpbiBpZiBpdCBoYXMgR2VvbG9jYXRpb24gcGVybWlzc2lvbnMsIG90aGVyd2lzZSBkZW55LgorICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsb3dlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChzZW5zaXRpdmVGZWF0dXJlcy5nZXRHZW9sb2NhdGlvbigpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBVUkwgb3JpZ2luVXJsID0gbmV3IFVSTChvcmlnaW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCA9IGFyZVNhbWVPcmlnaW4obUJhc2VVcmwsIG9yaWdpblVybCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYWxsYmFjay5pbnZva2Uob3JpZ2luLCBhbGxvd2VkLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIFNldCB0aGUgREIgbG9jYXRpb24uIE9wdGlvbmFsLiBHZW9sb2NhdGlvbiB3b3JrcyB3aXRob3V0IERCcy4KKyAgICAgICAgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zZXRHZW9sb2NhdGlvbkRhdGFiYXNlUGF0aCgKKyAgICAgICAgICAgICAgICBnZXREaXIoImdlb2xvY2F0aW9uIiwgTU9ERV9QUklWQVRFKS5nZXRQYXRoKCkpOworCisgICAgICAgIFN0cmluZyB0aXRsZSA9IG1ldGFEYXRhLmdldFN0cmluZygiYW5kcm9pZC53ZWJydW50aW1lLnRpdGxlIik7CisgICAgICAgIC8vIFdlIHR1cm5lZCBvZmYgdGhlIHRpdGxlIGJhciB0byBnbyBmdWxsIHNjcmVlbiBzbyBkaXNwbGF5IHRoZQorICAgICAgICAvLyB3ZWJhcHAncyB0aXRsZSBhcyBhIHRvYXN0LgorICAgICAgICBpZiAodGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgdGl0bGUsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTG9hZCB0aGUgd2ViYXBwJ3MgYmFzZSBVUkwuCisgICAgICAgIG1XZWJWaWV3LmxvYWRVcmwodXJsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfQkFDSyAmJiBtV2ViVmlldy5jYW5Hb0JhY2soKSkgeworICAgICAgICAgICAgbVdlYlZpZXcuZ29CYWNrKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgICAgICBtZW51LmFkZCgwLCAwLCAwLCAiTWVudSBpdGVtIDEiKTsKKyAgICAgICAgbWVudS5hZGQoMCwgMSwgMCwgIk1lbnUgaXRlbSAyIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYXJlU2FtZU9yaWdpbihVUkwgYSwgVVJMIGIpIHsKKyAgICAgICAgaW50IGFQb3J0ID0gYS5nZXRQb3J0KCkgPT0gLTEgPyBhLmdldERlZmF1bHRQb3J0KCkgOiBhLmdldFBvcnQoKTsKKyAgICAgICAgaW50IGJQb3J0ID0gYi5nZXRQb3J0KCkgPT0gLTEgPyBiLmdldERlZmF1bHRQb3J0KCkgOiBiLmdldFBvcnQoKTsKKyAgICAgICAgcmV0dXJuIGEuZ2V0UHJvdG9jb2woKS5lcXVhbHMoYi5nZXRQcm90b2NvbCgpKSAmJiBhUG9ydCA9PSBiUG9ydCAmJiBhLmdldEhvc3QoKS5lcXVhbHMoYi5nZXRIb3N0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3LmphdmEKaW5kZXggZGI1MGNhMS4uMTk3YWQ5ZWUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKQEAgLTM0LDExICszNCwxNiBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvbmdTcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQm9vbGVhbkFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmVsb2NpdHlUcmFja2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtNDYsNyArNTEsNiBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3RGVidWc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5CYXNlSW5wdXRDb25uZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FZGl0b3JJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb247CkBAIC03MCwxMCArNzQsMTIgQEAKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0Fic0xpc3RWaWV3X2NhY2hlQ29sb3JIaW50CiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBYnNMaXN0Vmlld19mYXN0U2Nyb2xsRW5hYmxlZAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQWJzTGlzdFZpZXdfc21vb3RoU2Nyb2xsYmFyCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBYnNMaXN0Vmlld19jaG9pY2VNb2RlCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnNMaXN0VmlldyBleHRlbmRzIEFkYXB0ZXJWaWV3PExpc3RBZGFwdGVyPiBpbXBsZW1lbnRzIFRleHRXYXRjaGVyLAogICAgICAgICBWaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXIsIEZpbHRlci5GaWx0ZXJMaXN0ZW5lciwKLSAgICAgICAgVmlld1RyZWVPYnNlcnZlci5PblRvdWNoTW9kZUNoYW5nZUxpc3RlbmVyIHsKKyAgICAgICAgVmlld1RyZWVPYnNlcnZlci5PblRvdWNoTW9kZUNoYW5nZUxpc3RlbmVyLAorICAgICAgICBSZW1vdGVWaWV3c0FkYXB0ZXIuUmVtb3RlQWRhcHRlckNvbm5lY3Rpb25DYWxsYmFjayB7CiAKICAgICAvKioKICAgICAgKiBEaXNhYmxlcyB0aGUgdHJhbnNjcmlwdCBtb2RlLgpAQCAtMTMwLDE3ICsxMzYsNiBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfTU9ERV9GTElORyA9IDQ7CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhlIHRvdWNoIGdlc3R1cmUgaXMgYW4gb3ZlcnNjcm9sbCAtIGEgc2Nyb2xsIGJleW9uZCB0aGUgYmVnaW5uaW5nIG9yIGVuZC4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFRPVUNIX01PREVfT1ZFUlNDUk9MTCA9IDU7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgYmVpbmcgZmx1bmcgb3V0c2lkZSBvZiBub3JtYWwgY29udGVudCBib3VuZHMKLSAgICAgKiBhbmQgd2lsbCBzcHJpbmcgYmFjay4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFRPVUNIX01PREVfT1ZFUkZMSU5HID0gNjsKLQotICAgIC8qKgogICAgICAqIFJlZ3VsYXIgbGF5b3V0IC0gdXN1YWxseSBhbiB1bnNvbGljaXRlZCBsYXlvdXQgZnJvbSB0aGUgdmlldyBzeXN0ZW0KICAgICAgKi8KICAgICBzdGF0aWMgZmluYWwgaW50IExBWU9VVF9OT1JNQUwgPSAwOwpAQCAtMTc4LDYgKzE3Myw1NyBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX01PVkVfU0VMRUNUSU9OID0gNjsKIAogICAgIC8qKgorICAgICAqIE5vcm1hbCBsaXN0IHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2hvaWNlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIT0lDRV9NT0RFX05PTkUgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIGxpc3QgYWxsb3dzIHVwIHRvIG9uZSBjaG9pY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9TSU5HTEUgPSAxOworCisgICAgLyoqCisgICAgICogVGhlIGxpc3QgYWxsb3dzIG11bHRpcGxlIGNob2ljZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9NVUxUSVBMRSA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBhbGxvd3MgbXVsdGlwbGUgY2hvaWNlcyBpbiBhIG1vZGFsIHNlbGVjdGlvbiBtb2RlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwgPSAzOworCisgICAgLyoqCisgICAgICogQ29udHJvbHMgaWYvaG93IHRoZSB1c2VyIG1heSBjaG9vc2UvY2hlY2sgaXRlbXMgaW4gdGhlIGxpc3QKKyAgICAgKi8KKyAgICBpbnQgbUNob2ljZU1vZGUgPSBDSE9JQ0VfTU9ERV9OT05FOworCisgICAgLyoqCisgICAgICogQ29udHJvbHMgQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwuIG51bGwgd2hlbiBpbmFjdGl2ZS4KKyAgICAgKi8KKyAgICBBY3Rpb25Nb2RlIG1DaG9pY2VBY3Rpb25Nb2RlOworCisgICAgLyoqCisgICAgICogV3JhcHBlciBmb3IgdGhlIG11bHRpcGxlIGNob2ljZSBtb2RlIGNhbGxiYWNrOyBBYnNMaXN0VmlldyBuZWVkcyB0byBwZXJmb3JtCisgICAgICogYSBmZXcgZXh0cmEgYWN0aW9ucyBhcm91bmQgd2hhdCBhcHBsaWNhdGlvbiBjb2RlIGRvZXMuCisgICAgICovCisgICAgTXVsdGlDaG9pY2VNb2RlV3JhcHBlciBtTXVsdGlDaG9pY2VNb2RlQ2FsbGJhY2s7CisKKyAgICAvKioKKyAgICAgKiBSdW5uaW5nIGNvdW50IG9mIGhvdyBtYW55IGl0ZW1zIGFyZSBjdXJyZW50bHkgY2hlY2tlZAorICAgICAqLworICAgIGludCBtQ2hlY2tlZEl0ZW1Db3VudDsKKworICAgIC8qKgorICAgICAqIFJ1bm5pbmcgc3RhdGUgb2Ygd2hpY2ggcG9zaXRpb25zIGFyZSBjdXJyZW50bHkgY2hlY2tlZAorICAgICAqLworICAgIFNwYXJzZUJvb2xlYW5BcnJheSBtQ2hlY2tTdGF0ZXM7CisKKyAgICAvKioKKyAgICAgKiBSdW5uaW5nIHN0YXRlIG9mIHdoaWNoIElEcyBhcmUgY3VycmVudGx5IGNoZWNrZWQKKyAgICAgKi8KKyAgICBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4gbUNoZWNrZWRJZFN0YXRlczsKKworICAgIC8qKgogICAgICAqIENvbnRyb2xzIGhvdyB0aGUgbmV4dCBsYXlvdXQgd2lsbCBoYXBwZW4KICAgICAgKi8KICAgICBpbnQgbUxheW91dE1vZGUgPSBMQVlPVVRfTk9STUFMOwpAQCAtMTkzLDYgKzIzOSwxMSBAQAogICAgIExpc3RBZGFwdGVyIG1BZGFwdGVyOwogCiAgICAgLyoqCisgICAgICogVGhlIHJlbW90ZSBhZGFwdGVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgZGlzcGxheWVkIGJ5IHRoaXMgdmlldyB0byBiZSBzZXQKKyAgICAgKi8KKyAgICBwcml2YXRlIFJlbW90ZVZpZXdzQWRhcHRlciBtUmVtb3RlQWRhcHRlcjsKKworICAgIC8qKgogICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBsaXN0IHNlbGVjdG9yIHNob3VsZCBiZSBkcmF3biBvbiB0b3Agb2YgdGhlIGNoaWxkcmVuIG9yIGJlaGluZAogICAgICAqLwogICAgIGJvb2xlYW4gbURyYXdTZWxlY3Rvck9uVG9wID0gZmFsc2U7CkBAIC0zODIsMTYgKzQzMyw2IEBACiAgICAgcHJpdmF0ZSBDb250ZXh0TWVudUluZm8gbUNvbnRleHRNZW51SW5mbyA9IG51bGw7CiAgICAgCiAgICAgLyoqCi0gICAgICogTWF4aW11bSBkaXN0YW5jZSB0byByZWNvcmQgb3ZlcnNjcm9sbAotICAgICAqLwotICAgIGludCBtT3ZlcnNjcm9sbE1heDsKLQotICAgIC8qKgotICAgICAqIENvbnRlbnQgaGVpZ2h0IGRpdmlkZWQgYnkgdGhpcyBpcyB0aGUgb3ZlcnNjcm9sbCBsaW1pdC4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IE9WRVJTQ1JPTExfTElNSVRfRElWSVNPUiA9IDM7Ci0KLSAgICAvKioKICAgICAgKiBVc2VkIHRvIHJlcXVlc3QgYSBsYXlvdXQgd2hlbiB3ZSBjaGFuZ2VkIHRvdWNoIG1vZGUKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfTU9ERV9VTktOT1dOID0gLTE7CkBAIC00ODQsMjkgKzUyNSw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUE9JTlRFUiA9IC0xOwogCiAgICAgLyoqCi0gICAgICogTWF4aW11bSBkaXN0YW5jZSB0byBvdmVyc2Nyb2xsIGJ5IGR1cmluZyBlZGdlIGVmZmVjdHMKLSAgICAgKi8KLSAgICBpbnQgbU92ZXJzY3JvbGxEaXN0YW5jZTsKLQotICAgIC8qKgotICAgICAqIE1heGltdW0gZGlzdGFuY2UgdG8gb3ZlcmZsaW5nIGR1cmluZyBlZGdlIGVmZmVjdHMKLSAgICAgKi8KLSAgICBpbnQgbU92ZXJmbGluZ0Rpc3RhbmNlOwotCi0gICAgLy8gVGhlc2UgdHdvIEVkZ2VHbG93cyBhcmUgYWx3YXlzIHNldCBhbmQgdXNlZCB0b2dldGhlci4KLSAgICAvLyBDaGVja2luZyBvbmUgZm9yIG51bGwgaXMgYXMgZ29vZCBhcyBjaGVja2luZyBib3RoLgotCi0gICAgLyoqCi0gICAgICogVHJhY2tzIHRoZSBzdGF0ZSBvZiB0aGUgdG9wIGVkZ2UgZ2xvdy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVkZ2VHbG93IG1FZGdlR2xvd1RvcDsKLQotICAgIC8qKgotICAgICAqIFRyYWNrcyB0aGUgc3RhdGUgb2YgdGhlIGJvdHRvbSBlZGdlIGdsb3cuCi0gICAgICovCi0gICAgcHJpdmF0ZSBFZGdlR2xvdyBtRWRnZUdsb3dCb3R0b207Ci0KLSAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGxpc3Qgb3IgZ3JpZAogICAgICAqIGhhcyBiZWVuIHNjcm9sbGVkLgogICAgICAqLwpAQCAtNjA1LDYgKzYyMywxOCBAQAogCiAgICAgICAgIGJvb2xlYW4gc21vb3RoU2Nyb2xsYmFyID0gYS5nZXRCb29sZWFuKFIuc3R5bGVhYmxlLkFic0xpc3RWaWV3X3Ntb290aFNjcm9sbGJhciwgdHJ1ZSk7CiAgICAgICAgIHNldFNtb290aFNjcm9sbGJhckVuYWJsZWQoc21vb3RoU2Nyb2xsYmFyKTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIGludCBhZGFwdGVySWQgPSBhLmdldFJlc291cmNlSWQoUi5zdHlsZWFibGUuQWJzTGlzdFZpZXdfYWRhcHRlciwgMCk7CisgICAgICAgIGlmIChhZGFwdGVySWQgIT0gMCkgeworICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjID0gY29udGV4dDsKKyAgICAgICAgICAgIHBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0QWRhcHRlcihBZGFwdGVycy5sb2FkQWRhcHRlcihjLCBhZGFwdGVySWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHNldENob2ljZU1vZGUoYS5nZXRJbnQoUi5zdHlsZWFibGUuQWJzTGlzdFZpZXdfY2hvaWNlTW9kZSwgQ0hPSUNFX01PREVfTk9ORSkpOwogCiAgICAgICAgIGEucmVjeWNsZSgpOwogICAgIH0KQEAgLTYyMSwyNyArNjUxLDMxMiBAQAogICAgICAgICBtVG91Y2hTbG9wID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRUb3VjaFNsb3AoKTsKICAgICAgICAgbU1pbmltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWluaW11bUZsaW5nVmVsb2NpdHkoKTsKICAgICAgICAgbU1heGltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWF4aW11bUZsaW5nVmVsb2NpdHkoKTsKLSAgICAgICAgbU92ZXJzY3JvbGxEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcnNjcm9sbERpc3RhbmNlKCk7Ci0gICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcmZsaW5nRGlzdGFuY2UoKTsKLQogICAgICAgICBtRGVuc2l0eVNjYWxlID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcnNjcm9sbE1vZGUoaW50IG1vZGUpIHsKLSAgICAgICAgaWYgKG1vZGUgIT0gT1ZFUlNDUk9MTF9ORVZFUikgewotICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBlZGdlID0gcmVzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuZWRnZV9saWdodCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgZ2xvdyA9IHJlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLm92ZXJzY3JvbGxfZ2xvdyk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wID0gbmV3IEVkZ2VHbG93KGVkZ2UsIGdsb3cpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbSA9IG5ldyBFZGdlR2xvdyhlZGdlLCBnbG93KTsKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQ2hlY2tTdGF0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNoZWNrU3RhdGVzLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUNoZWNrZWRJZFN0YXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgY3VycmVudGx5IHNlbGVjdGVkLiBUaGlzIHdpbGwgb25seSBiZSB2YWxpZAorICAgICAqIGlmIHRoZSBjaG9pY2UgbW9kZSBpcyBub3Qge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSAoZGVmYXVsdCkuCisgICAgICoKKyAgICAgKiA8cD5UbyBkZXRlcm1pbmUgdGhlIHNwZWNpZmljIGl0ZW1zIHRoYXQgYXJlIGN1cnJlbnRseSBzZWxlY3RlZCwgdXNlIG9uZSBvZgorICAgICAqIHRoZSA8Y29kZT5nZXRDaGVja2VkKjwvY29kZT4gbWV0aG9kcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBpdGVtcyBjdXJyZW50bHkgc2VsZWN0ZWQKKyAgICAgKgorICAgICAqIEBzZWUgI2dldENoZWNrZWRJdGVtUG9zaXRpb24oKQorICAgICAqIEBzZWUgI2dldENoZWNrZWRJdGVtUG9zaXRpb25zKCkKKyAgICAgKiBAc2VlICNnZXRDaGVja2VkSXRlbUlkcygpCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDaGVja2VkSXRlbUNvdW50KCkgeworICAgICAgICByZXR1cm4gbUNoZWNrZWRJdGVtQ291bnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2hlY2tlZCBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiBUaGUgcmVzdWx0IGlzIG9ubHkKKyAgICAgKiB2YWxpZCBpZiB0aGUgY2hvaWNlIG1vZGUgaGFzIGJlZW4gc2V0IHRvIHtAbGluayAjQ0hPSUNFX01PREVfU0lOR0xFfQorICAgICAqIG9yIHtAbGluayAjQ0hPSUNFX01PREVfTVVMVElQTEV9LgorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBpdGVtIHdob3NlIGNoZWNrZWQgc3RhdGUgdG8gcmV0dXJuCisgICAgICogQHJldHVybiBUaGUgaXRlbSdzIGNoZWNrZWQgc3RhdGUgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGNob2ljZSBtb2RlCisgICAgICogICAgICAgICBpcyBpbnZhbGlkCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRDaG9pY2VNb2RlKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0l0ZW1DaGVja2VkKGludCBwb3NpdGlvbikgeworICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSAmJiBtQ2hlY2tTdGF0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBjaGVja2VkIGl0ZW0uIFRoZSByZXN1bHQgaXMgb25seSB2YWxpZCBpZiB0aGUgY2hvaWNlCisgICAgICogbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnRseSBjaGVja2VkIGl0ZW0gb3IKKyAgICAgKiAgICAgICAgIHtAbGluayAjSU5WQUxJRF9QT1NJVElPTn0gaWYgbm90aGluZyBpcyBzZWxlY3RlZAorICAgICAqCisgICAgICogQHNlZSAjc2V0Q2hvaWNlTW9kZShpbnQpCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDaGVja2VkSXRlbVBvc2l0aW9uKCkgeworICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfU0lOR0xFICYmIG1DaGVja1N0YXRlcyAhPSBudWxsICYmIG1DaGVja1N0YXRlcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIG1DaGVja1N0YXRlcy5rZXlBdCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBJTlZBTElEX1BPU0lUSU9OOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBjaGVja2VkIGl0ZW1zIGluIHRoZSBsaXN0LiBUaGUgcmVzdWx0IGlzIG9ubHkgdmFsaWQgaWYKKyAgICAgKiB0aGUgY2hvaWNlIG1vZGUgaGFzIG5vdCBiZWVuIHNldCB0byB7QGxpbmsgI0NIT0lDRV9NT0RFX05PTkV9LgorICAgICAqCisgICAgICogQHJldHVybiAgQSBTcGFyc2VCb29sZWFuQXJyYXkgd2hpY2ggd2lsbCByZXR1cm4gdHJ1ZSBmb3IgZWFjaCBjYWxsIHRvCisgICAgICogICAgICAgICAgZ2V0KGludCBwb3NpdGlvbikgd2hlcmUgcG9zaXRpb24gaXMgYSBwb3NpdGlvbiBpbiB0aGUgbGlzdCwKKyAgICAgKiAgICAgICAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY2hvaWNlIG1vZGUgaXMgc2V0IHRvCisgICAgICogICAgICAgICAge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3BhcnNlQm9vbGVhbkFycmF5IGdldENoZWNrZWRJdGVtUG9zaXRpb25zKCkgeworICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSkgeworICAgICAgICAgICAgcmV0dXJuIG1DaGVja1N0YXRlczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgY2hlY2tlZCBpdGVtcyBpZHMuIFRoZSByZXN1bHQgaXMgb25seSB2YWxpZCBpZiB0aGUKKyAgICAgKiBjaG9pY2UgbW9kZSBoYXMgbm90IGJlZW4gc2V0IHRvIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0gYW5kIHRoZSBhZGFwdGVyCisgICAgICogaGFzIHN0YWJsZSBJRHMuICh7QGxpbmsgTGlzdEFkYXB0ZXIjaGFzU3RhYmxlSWRzKCl9ID09IHtAY29kZSB0cnVlfSkKKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBuZXcgYXJyYXkgd2hpY2ggY29udGFpbnMgdGhlIGlkIG9mIGVhY2ggY2hlY2tlZCBpdGVtIGluIHRoZQorICAgICAqICAgICAgICAgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZ1tdIGdldENoZWNrZWRJdGVtSWRzKCkgeworICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTk9ORSB8fCBtQ2hlY2tlZElkU3RhdGVzID09IG51bGwgfHwgbUFkYXB0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBsb25nWzBdOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTG9uZ1NwYXJzZUFycmF5PEJvb2xlYW4+IGlkU3RhdGVzID0gbUNoZWNrZWRJZFN0YXRlczsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gaWRTdGF0ZXMuc2l6ZSgpOworICAgICAgICBmaW5hbCBsb25nW10gaWRzID0gbmV3IGxvbmdbY291bnRdOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWRzW2ldID0gaWRTdGF0ZXMua2V5QXQoaSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaWRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIGFueSBjaG9pY2VzIHByZXZpb3VzbHkgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJDaG9pY2VzKCkgeworICAgICAgICBpZiAobUNoZWNrU3RhdGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudCA9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY2hlY2tlZCBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiBUaGUgaXMgb25seSB2YWxpZCBpZgorICAgICAqIHRoZSBjaG9pY2UgbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9IG9yCisgICAgICoge0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIGl0ZW0gd2hvc2UgY2hlY2tlZCBzdGF0ZSBpcyB0byBiZSBjaGVja2VkCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgY2hlY2tlZCBzdGF0ZSBmb3IgdGhlIGl0ZW0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJdGVtQ2hlY2tlZChpbnQgcG9zaXRpb24sIGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX05PTkUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXJ0IHNlbGVjdGlvbiBtb2RlIGlmIG5lZWRlZC4gV2UgZG9uJ3QgbmVlZCB0byBpZiB3ZSdyZSB1bmNoZWNraW5nIHNvbWV0aGluZy4KKyAgICAgICAgaWYgKHZhbHVlICYmIG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX01VTFRJUExFX01PREFMICYmIG1DaG9pY2VBY3Rpb25Nb2RlID09IG51bGwpIHsKKyAgICAgICAgICAgIG1DaG9pY2VBY3Rpb25Nb2RlID0gc3RhcnRBY3Rpb25Nb2RlKG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEUgfHwgbUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gb2xkVmFsdWUgPSBtQ2hlY2tTdGF0ZXMuZ2V0KHBvc2l0aW9uKTsKKyAgICAgICAgICAgIG1DaGVja1N0YXRlcy5wdXQocG9zaXRpb24sIHZhbHVlKTsKKyAgICAgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmRlbGV0ZShtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQ2hvaWNlQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBpZCA9IG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgbU11bHRpQ2hvaWNlTW9kZUNhbGxiYWNrLm9uSXRlbUNoZWNrZWRTdGF0ZUNoYW5nZWQobUNob2ljZUFjdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiwgaWQsIHZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1FZGdlR2xvd1RvcCA9IG51bGw7Ci0gICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20gPSBudWxsOworICAgICAgICAgICAgYm9vbGVhbiB1cGRhdGVJZHMgPSBtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCk7CisgICAgICAgICAgICAvLyBDbGVhciBhbGwgdmFsdWVzIGlmIHdlJ3JlIGNoZWNraW5nIHNvbWV0aGluZywgb3IgdW5jaGVja2luZyB0aGUgY3VycmVudGx5CisgICAgICAgICAgICAvLyBzZWxlY3RlZCBpdGVtCisgICAgICAgICAgICBpZiAodmFsdWUgfHwgaXNJdGVtQ2hlY2tlZChwb3NpdGlvbikpIHsKKyAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBpZiAodXBkYXRlSWRzKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB0aGlzIG1heSBlbmQgdXAgc2VsZWN0aW5nIHRoZSB2YWx1ZSB3ZSBqdXN0IGNsZWFyZWQgYnV0IHRoaXMgd2F5CisgICAgICAgICAgICAvLyB3ZSBlbnN1cmUgbGVuZ3RoIG9mIG1DaGVja1N0YXRlcyBpcyAxLCBhIGZhY3QgZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbiByZWxpZXMgb24KKyAgICAgICAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5wdXQocG9zaXRpb24sIHRydWUpOworICAgICAgICAgICAgICAgIGlmICh1cGRhdGVJZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQgPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChtQ2hlY2tTdGF0ZXMuc2l6ZSgpID09IDAgfHwgIW1DaGVja1N0YXRlcy52YWx1ZUF0KDApKSB7CisgICAgICAgICAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQgPSAwOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHN1cGVyLnNldE92ZXJzY3JvbGxNb2RlKG1vZGUpOworCisgICAgICAgIC8vIERvIG5vdCBnZW5lcmF0ZSBhIGRhdGEgY2hhbmdlIHdoaWxlIHdlIGFyZSBpbiB0aGUgbGF5b3V0IHBoYXNlCisgICAgICAgIGlmICghbUluTGF5b3V0ICYmICFtQmxvY2tMYXlvdXRSZXF1ZXN0cykgeworICAgICAgICAgICAgbURhdGFDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIHJlbWVtYmVyU3luY1N0YXRlKCk7CisgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtSXRlbUNsaWNrKFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOworCisgICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FKSB7CisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX01VTFRJUExFIHx8CisgICAgICAgICAgICAgICAgICAgIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCAmJiBtQ2hvaWNlQWN0aW9uTW9kZSAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gbmV3VmFsdWUgPSAhbUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbiwgZmFsc2UpOworICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5wdXQocG9zaXRpb24sIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAobUNoZWNrZWRJZFN0YXRlcyAhPSBudWxsICYmIG1BZGFwdGVyLmhhc1N0YWJsZUlkcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuZGVsZXRlKG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudCsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSXRlbUNvdW50LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtQ2hvaWNlQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjay5vbkl0ZW1DaGVja2VkU3RhdGVDaGFuZ2VkKG1DaG9pY2VBY3Rpb25Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLCBpZCwgbmV3VmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfU0lOR0xFKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBuZXdWYWx1ZSA9ICFtQ2hlY2tTdGF0ZXMuZ2V0KHBvc2l0aW9uLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudCA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQ2hlY2tTdGF0ZXMuc2l6ZSgpID09IDAgfHwgIW1DaGVja1N0YXRlcy52YWx1ZUF0KDApKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSXRlbUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1EYXRhQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICByZW1lbWJlclN5bmNTdGF0ZSgpOworICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgICAgICB9CisKKyAgICAgICAgaGFuZGxlZCB8PSBzdXBlci5wZXJmb3JtSXRlbUNsaWNrKHZpZXcsIHBvc2l0aW9uLCBpZCk7CisKKyAgICAgICAgcmV0dXJuIGhhbmRsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSAjc2V0Q2hvaWNlTW9kZShpbnQpCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGNob2ljZSBtb2RlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDaG9pY2VNb2RlKCkgeworICAgICAgICByZXR1cm4gbUNob2ljZU1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lcyB0aGUgY2hvaWNlIGJlaGF2aW9yIGZvciB0aGUgTGlzdC4gQnkgZGVmYXVsdCwgTGlzdHMgZG8gbm90IGhhdmUgYW55IGNob2ljZSBiZWhhdmlvcgorICAgICAqICh7QGxpbmsgI0NIT0lDRV9NT0RFX05PTkV9KS4gQnkgc2V0dGluZyB0aGUgY2hvaWNlTW9kZSB0byB7QGxpbmsgI0NIT0lDRV9NT0RFX1NJTkdMRX0sIHRoZQorICAgICAqIExpc3QgYWxsb3dzIHVwIHRvIG9uZSBpdGVtIHRvICBiZSBpbiBhIGNob3NlbiBzdGF0ZS4gQnkgc2V0dGluZyB0aGUgY2hvaWNlTW9kZSB0bworICAgICAqIHtAbGluayAjQ0hPSUNFX01PREVfTVVMVElQTEV9LCB0aGUgbGlzdCBhbGxvd3MgYW55IG51bWJlciBvZiBpdGVtcyB0byBiZSBjaG9zZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hvaWNlTW9kZSBPbmUgb2Yge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSwge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9LCBvcgorICAgICAqIHtAbGluayAjQ0hPSUNFX01PREVfTVVMVElQTEV9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hvaWNlTW9kZShpbnQgY2hvaWNlTW9kZSkgeworICAgICAgICBtQ2hvaWNlTW9kZSA9IGNob2ljZU1vZGU7CisgICAgICAgIGlmIChtQ2hvaWNlQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2hvaWNlQWN0aW9uTW9kZS5maW5pc2goKTsKKyAgICAgICAgICAgIG1DaG9pY2VBY3Rpb25Nb2RlID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSkgeworICAgICAgICAgICAgaWYgKG1DaGVja1N0YXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzID0gbmV3IFNwYXJzZUJvb2xlYW5BcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgPT0gbnVsbCAmJiBtQWRhcHRlciAhPSBudWxsICYmIG1BZGFwdGVyLmhhc1N0YWJsZUlkcygpKSB7CisgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE1vZGFsIG11bHRpLWNob2ljZSBtb2RlIG9ubHkgaGFzIGNob2ljZXMgd2hlbiB0aGUgbW9kZSBpcyBhY3RpdmUuIENsZWFyIHRoZW0uCisgICAgICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwpIHsKKyAgICAgICAgICAgICAgICBjbGVhckNob2ljZXMoKTsKKyAgICAgICAgICAgICAgICBzZXRMb25nQ2xpY2thYmxlKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEge0BsaW5rIE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyfSB0aGF0IHdpbGwgbWFuYWdlIHRoZSBsaWZlY3ljbGUgb2YgdGhlCisgICAgICogc2VsZWN0aW9uIHtAbGluayBBY3Rpb25Nb2RlfS4gT25seSB1c2VkIHdoZW4gdGhlIGNob2ljZSBtb2RlIGlzIHNldCB0bworICAgICAqIHtAbGluayAjQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUx9LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIExpc3RlbmVyIHRoYXQgd2lsbCBtYW5hZ2UgdGhlIHNlbGVjdGlvbiBtb2RlCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRDaG9pY2VNb2RlKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNdWx0aUNob2ljZU1vZGVMaXN0ZW5lcihNdWx0aUNob2ljZU1vZGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobU11bHRpQ2hvaWNlTW9kZUNhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjayA9IG5ldyBNdWx0aUNob2ljZU1vZGVXcmFwcGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgbU11bHRpQ2hvaWNlTW9kZUNhbGxiYWNrLnNldFdyYXBwZWQobGlzdGVuZXIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtODYyLDYgKzExNzcsOCBAQAogICAgICAgICBpbnQgcG9zaXRpb247CiAgICAgICAgIGludCBoZWlnaHQ7CiAgICAgICAgIFN0cmluZyBmaWx0ZXI7CisgICAgICAgIFNwYXJzZUJvb2xlYW5BcnJheSBjaGVja1N0YXRlOworICAgICAgICBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4gY2hlY2tJZFN0YXRlOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBDb25zdHJ1Y3RvciBjYWxsZWQgZnJvbSB7QGxpbmsgQWJzTGlzdFZpZXcjb25TYXZlSW5zdGFuY2VTdGF0ZSgpfQpAQCAtODgxLDYgKzExOTgsMTMgQEAKICAgICAgICAgICAgIHBvc2l0aW9uID0gaW4ucmVhZEludCgpOwogICAgICAgICAgICAgaGVpZ2h0ID0gaW4ucmVhZEludCgpOwogICAgICAgICAgICAgZmlsdGVyID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICAgICAgY2hlY2tTdGF0ZSA9IGluLnJlYWRTcGFyc2VCb29sZWFuQXJyYXkoKTsKKyAgICAgICAgICAgIGxvbmdbXSBpZFN0YXRlID0gaW4uY3JlYXRlTG9uZ0FycmF5KCk7CisKKyAgICAgICAgICAgIGlmIChpZFN0YXRlLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBjaGVja0lkU3RhdGUgPSBuZXcgTG9uZ1NwYXJzZUFycmF5PEJvb2xlYW4+KCk7CisgICAgICAgICAgICAgICAgY2hlY2tJZFN0YXRlLnNldFZhbHVlcyhpZFN0YXRlLCBCb29sZWFuLlRSVUUpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC04OTIsNiArMTIxNiw4IEBACiAgICAgICAgICAgICBvdXQud3JpdGVJbnQocG9zaXRpb24pOwogICAgICAgICAgICAgb3V0LndyaXRlSW50KGhlaWdodCk7CiAgICAgICAgICAgICBvdXQud3JpdGVTdHJpbmcoZmlsdGVyKTsKKyAgICAgICAgICAgIG91dC53cml0ZVNwYXJzZUJvb2xlYW5BcnJheShjaGVja1N0YXRlKTsKKyAgICAgICAgICAgIG91dC53cml0ZUxvbmdBcnJheShjaGVja0lkU3RhdGUgIT0gbnVsbCA/IGNoZWNrSWRTdGF0ZS5nZXRLZXlzKCkgOiBuZXcgbG9uZ1swXSk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTkwMyw3ICsxMjI5LDggQEAKICAgICAgICAgICAgICAgICAgICAgKyAiIHZpZXdUb3A9IiArIHZpZXdUb3AKICAgICAgICAgICAgICAgICAgICAgKyAiIHBvc2l0aW9uPSIgKyBwb3NpdGlvbgogICAgICAgICAgICAgICAgICAgICArICIgaGVpZ2h0PSIgKyBoZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgKyAiIGZpbHRlcj0iICsgZmlsdGVyICsgIn0iOworICAgICAgICAgICAgICAgICAgICArICIgZmlsdGVyPSIgKyBmaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGNoZWNrU3RhdGU9IiArIGNoZWNrU3RhdGUgKyAifSI7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPiBDUkVBVE9SCkBAIC05NjcsNiArMTI5NCw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBzcy5jaGVja1N0YXRlID0gbUNoZWNrU3RhdGVzOworICAgICAgICBzcy5jaGVja0lkU3RhdGUgPSBtQ2hlY2tlZElkU3RhdGVzOworCiAgICAgICAgIHJldHVybiBzczsKICAgICB9CiAKQEAgLTk5OCw2ICsxMzI4LDE0IEBACiAKICAgICAgICAgc2V0RmlsdGVyVGV4dChzcy5maWx0ZXIpOwogCisgICAgICAgIGlmIChzcy5jaGVja1N0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DaGVja1N0YXRlcyA9IHNzLmNoZWNrU3RhdGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3MuY2hlY2tJZFN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMgPSBzcy5jaGVja0lkU3RhdGU7CisgICAgICAgIH0KKwogICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CiAgICAgfQogCkBAIC0xMTQwLDEwICsxNDc4LDYgQEAKICAgICAgICAgaW50IHJlc3VsdDsKICAgICAgICAgaWYgKG1TbW9vdGhTY3JvbGxiYXJFbmFibGVkKSB7CiAgICAgICAgICAgICByZXN1bHQgPSBNYXRoLm1heChtSXRlbUNvdW50ICogMTAwLCAwKTsKLSAgICAgICAgICAgIGlmIChtU2Nyb2xsWSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ29tcGVuc2F0ZSBmb3Igb3ZlcnNjcm9sbAotICAgICAgICAgICAgICAgIHJlc3VsdCArPSBNYXRoLmFicygoaW50KSAoKGZsb2F0KSBtU2Nyb2xsWSAvIGdldEhlaWdodCgpICogbUl0ZW1Db3VudCAqIDEwMCkpOwotICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmVzdWx0ID0gbUl0ZW1Db3VudDsKICAgICAgICAgfQpAQCAtMTIxNiw4ICsxNTUwLDYgQEAKIAogICAgICAgICBsYXlvdXRDaGlsZHJlbigpOwogICAgICAgICBtSW5MYXlvdXQgPSBmYWxzZTsKLQotICAgICAgICBtT3ZlcnNjcm9sbE1heCA9IChiIC0gdCkgLyBPVkVSU0NST0xMX0xJTUlUX0RJVklTT1I7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjQ3LDYgKzE5NzksMTEgQEAKICAgICAgICAgICAgICAgICB0cmVlT2JzZXJ2ZXIuYWRkT25HbG9iYWxMYXlvdXRMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbURhdGFTZXRPYnNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtRGF0YVNldE9ic2VydmVyID0gbmV3IEFkYXB0ZXJEYXRhU2V0T2JzZXJ2ZXIoKTsKKyAgICAgICAgICAgIG1BZGFwdGVyLnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNjY3LDYgKzIwMDQsMTEgQEAKICAgICAgICAgICAgICAgICBtR2xvYmFsTGF5b3V0TGlzdGVuZXJBZGRlZEZpbHRlciA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BZGFwdGVyLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CisgICAgICAgICAgICBtRGF0YVNldE9ic2VydmVyID0gbnVsbDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTgxNywxMCArMjE1OSwyMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIHBlcmZvcm1Mb25nUHJlc3MoZmluYWwgVmlldyBjaGlsZCwKKyAgICBib29sZWFuIHBlcmZvcm1Mb25nUHJlc3MoZmluYWwgVmlldyBjaGlsZCwKICAgICAgICAgICAgIGZpbmFsIGludCBsb25nUHJlc3NQb3NpdGlvbiwgZmluYWwgbG9uZyBsb25nUHJlc3NJZCkgewotICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKKyAgICAgICAgLy8gQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwgdGFrZXMgb3ZlciBsb25nIHByZXNzLgorICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwpIHsKKyAgICAgICAgICAgIGlmIChtQ2hvaWNlQWN0aW9uTW9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNob2ljZUFjdGlvbk1vZGUgPSBzdGFydEFjdGlvbk1vZGUobU11bHRpQ2hvaWNlTW9kZUNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICBzZXRJdGVtQ2hlY2tlZChsb25nUHJlc3NQb3NpdGlvbiwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUT0RPIFNob3VsZCB3ZSBzZWxlY3QgdGhlIGxvbmcgcHJlc3NlZCBpdGVtIGlmIHdlIHdlcmUgYWxyZWFkeSBpbgorICAgICAgICAgICAgLy8gc2VsZWN0aW9uIG1vZGU/IChpLmUuIHRyZWF0IGl0IGxpa2UgYW4gaXRlbSBjbGljaz8pCisgICAgICAgICAgICBwZXJmb3JtSGFwdGljRmVlZGJhY2soSGFwdGljRmVlZGJhY2tDb25zdGFudHMuTE9OR19QUkVTUyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQogCisgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOwogICAgICAgICBpZiAobU9uSXRlbUxvbmdDbGlja0xpc3RlbmVyICE9IG51bGwpIHsKICAgICAgICAgICAgIGhhbmRsZWQgPSBtT25JdGVtTG9uZ0NsaWNrTGlzdGVuZXIub25JdGVtTG9uZ0NsaWNrKEFic0xpc3RWaWV3LnRoaXMsIGNoaWxkLAogICAgICAgICAgICAgICAgICAgICBsb25nUHJlc3NQb3NpdGlvbiwgbG9uZ1ByZXNzSWQpOwpAQCAtMTk5MywxMCArMjM0Niw5IEBACiAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbW92ZWQgZmFyIGVub3VnaCB0aGF0IGl0IGxvb2tzIG1vcmUgbGlrZSBhCiAgICAgICAgIC8vIHNjcm9sbCB0aGFuIGEgdGFwCiAgICAgICAgIGZpbmFsIGludCBkaXN0YW5jZSA9IE1hdGguYWJzKGRlbHRhWSk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gb3ZlcnNjcm9sbCA9IG1TY3JvbGxZICE9IDA7Ci0gICAgICAgIGlmIChvdmVyc2Nyb2xsIHx8IGRpc3RhbmNlID4gbVRvdWNoU2xvcCkgeworICAgICAgICBpZiAoZGlzdGFuY2UgPiBtVG91Y2hTbG9wKSB7CiAgICAgICAgICAgICBjcmVhdGVTY3JvbGxpbmdDYWNoZSgpOwotICAgICAgICAgICAgbVRvdWNoTW9kZSA9IG92ZXJzY3JvbGwgPyBUT1VDSF9NT0RFX09WRVJTQ1JPTEwgOiBUT1VDSF9NT0RFX1NDUk9MTDsKKyAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1NDUk9MTDsKICAgICAgICAgICAgIG1Nb3Rpb25Db3JyZWN0aW9uID0gZGVsdGFZOwogICAgICAgICAgICAgZmluYWwgSGFuZGxlciBoYW5kbGVyID0gZ2V0SGFuZGxlcigpOwogICAgICAgICAgICAgLy8gSGFuZGxlciBzaG91bGQgbm90IGJlIG51bGwgdW5sZXNzIHRoZSBBYnNMaXN0VmlldyBpcyBub3QgYXR0YWNoZWQgdG8gYQpAQCAtMjAzMiwxOCArMjM4NCw2IEBACiAgICAgICAgICAgICAgICAgLy8gdG91Y2ggbW9kZSkuIEZvcmNlIGFuIGluaXRpYWwgbGF5b3V0IHRvIGdldCByaWQgb2YgdGhlIHNlbGVjdGlvbi4KICAgICAgICAgICAgICAgICBsYXlvdXRDaGlsZHJlbigpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IHRvdWNoTW9kZSA9IG1Ub3VjaE1vZGU7Ci0gICAgICAgICAgICBpZiAodG91Y2hNb2RlID09IFRPVUNIX01PREVfT1ZFUlNDUk9MTCB8fCB0b3VjaE1vZGUgPT0gVE9VQ0hfTU9ERV9PVkVSRkxJTkcpIHsKLSAgICAgICAgICAgICAgICBpZiAobUZsaW5nUnVubmFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtRmxpbmdSdW5uYWJsZS5lbmRGbGluZygpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtU2Nyb2xsWSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TY3JvbGxZID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjA3NCw2MyArMjQxNCw0OSBAQAogCiAgICAgICAgIHN3aXRjaCAoYWN0aW9uICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0spIHsKICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjogewotICAgICAgICAgICAgc3dpdGNoIChtVG91Y2hNb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIFRPVUNIX01PREVfT1ZFUkZMSU5HOiB7Ci0gICAgICAgICAgICAgICAgbUZsaW5nUnVubmFibGUuZW5kRmxpbmcoKTsKLSAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9PVkVSU0NST0xMOwotICAgICAgICAgICAgICAgIG1Nb3Rpb25ZID0gbUxhc3RZID0gKGludCkgZXYuZ2V0WSgpOwotICAgICAgICAgICAgICAgIG1Nb3Rpb25Db3JyZWN0aW9uID0gMDsKLSAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gZXYuZ2V0UG9pbnRlcklkKDApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZCgwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB4ID0gKGludCkgZXYuZ2V0WCgpOworICAgICAgICAgICAgZmluYWwgaW50IHkgPSAoaW50KSBldi5nZXRZKCk7CisgICAgICAgICAgICBpbnQgbW90aW9uUG9zaXRpb24gPSBwb2ludFRvUG9zaXRpb24oeCwgeSk7CisgICAgICAgICAgICBpZiAoIW1EYXRhQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgIGlmICgobVRvdWNoTW9kZSAhPSBUT1VDSF9NT0RFX0ZMSU5HKSAmJiAobW90aW9uUG9zaXRpb24gPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChnZXRBZGFwdGVyKCkuaXNFbmFibGVkKG1vdGlvblBvc2l0aW9uKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlciBjbGlja2VkIG9uIGFuIGFjdHVhbCB2aWV3IChhbmQgd2FzIG5vdCBzdG9wcGluZyBhIGZsaW5nKS4gSXQgbWlnaHQgYmUgYQorICAgICAgICAgICAgICAgICAgICAvLyBjbGljayBvciBhIHNjcm9sbC4gQXNzdW1lIGl0IGlzIGEgY2xpY2sgdW50aWwgcHJvdmVuIG90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9ET1dOOworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBEZWJvdW5jZQorICAgICAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdDaGVja0ZvclRhcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0NoZWNrRm9yVGFwID0gbmV3IENoZWNrRm9yVGFwKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcG9zdERlbGF5ZWQobVBlbmRpbmdDaGVja0ZvclRhcCwgVmlld0NvbmZpZ3VyYXRpb24uZ2V0VGFwVGltZW91dCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXYuZ2V0RWRnZUZsYWdzKCkgIT0gMCAmJiBtb3Rpb25Qb3NpdGlvbiA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGNvdWxkbid0IGZpbmQgYSB2aWV3IHRvIGNsaWNrIG9uLCBidXQgdGhlIGRvd24gZXZlbnQgd2FzIHRvdWNoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWRnZSwgd2Ugd2lsbCBiYWlsIG91dCBhbmQgdHJ5IGFnYWluLiBUaGlzIGFsbG93cyB0aGUgZWRnZSBjb3JyZWN0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2RlIGluIFZpZXdSb290IHRvIHRyeSB0byBmaW5kIGEgbmVhcmJ5IHZpZXcgdG8gc2VsZWN0CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQoMCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHggPSAoaW50KSBldi5nZXRYKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHkgPSAoaW50KSBldi5nZXRZKCk7Ci0gICAgICAgICAgICAgICAgaW50IG1vdGlvblBvc2l0aW9uID0gcG9pbnRUb1Bvc2l0aW9uKHgsIHkpOwotICAgICAgICAgICAgICAgIGlmICghbURhdGFDaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobVRvdWNoTW9kZSAhPSBUT1VDSF9NT0RFX0ZMSU5HKSAmJiAobW90aW9uUG9zaXRpb24gPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoZ2V0QWRhcHRlcigpLmlzRW5hYmxlZChtb3Rpb25Qb3NpdGlvbikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2VyIGNsaWNrZWQgb24gYW4gYWN0dWFsIHZpZXcgKGFuZCB3YXMgbm90IHN0b3BwaW5nIGEgZmxpbmcpLiBJdCBtaWdodCBiZSBhCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGljayBvciBhIHNjcm9sbC4gQXNzdW1lIGl0IGlzIGEgY2xpY2sgdW50aWwgcHJvdmVuIG90aGVyd2lzZQotICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfRE9XTjsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIERlYm91bmNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdDaGVja0ZvclRhcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdDaGVja0ZvclRhcCA9IG5ldyBDaGVja0ZvclRhcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcG9zdERlbGF5ZWQobVBlbmRpbmdDaGVja0ZvclRhcCwgVmlld0NvbmZpZ3VyYXRpb24uZ2V0VGFwVGltZW91dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldi5nZXRFZGdlRmxhZ3MoKSAhPSAwICYmIG1vdGlvblBvc2l0aW9uIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGNvdWxkbid0IGZpbmQgYSB2aWV3IHRvIGNsaWNrIG9uLCBidXQgdGhlIGRvd24gZXZlbnQgd2FzIHRvdWNoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGVkZ2UsIHdlIHdpbGwgYmFpbCBvdXQgYW5kIHRyeSBhZ2Fpbi4gVGhpcyBhbGxvd3MgdGhlIGVkZ2UgY29ycmVjdGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGUgaW4gVmlld1Jvb3QgdG8gdHJ5IHRvIGZpbmQgYSBuZWFyYnkgdmlldyB0byBzZWxlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX01PREVfRkxJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdG9wcGVkIGEgZmxpbmcuIEl0IGlzIGEgc2Nyb2xsLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNjcm9sbGluZ0NhY2hlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfU0NST0xMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25Db3JyZWN0aW9uID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25Qb3NpdGlvbiA9IGZpbmRNb3Rpb25Sb3coeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0U2Nyb2xsU3RhdGVDaGFuZ2UoT25TY3JvbGxMaXN0ZW5lci5TQ1JPTExfU1RBVEVfVE9VQ0hfU0NST0xMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfTU9ERV9GTElORykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RvcHBlZCBhIGZsaW5nLiBJdCBpcyBhIHNjcm9sbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNjcm9sbGluZ0NhY2hlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9TQ1JPTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uQ29ycmVjdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25Qb3NpdGlvbiA9IGZpbmRNb3Rpb25Sb3coeSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRTY3JvbGxTdGF0ZUNoYW5nZShPblNjcm9sbExpc3RlbmVyLlNDUk9MTF9TVEFURV9UT1VDSF9TQ1JPTEwpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1vdGlvblBvc2l0aW9uID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgd2hlcmUgdGhlIG1vdGlvbiBldmVudCBzdGFydGVkCi0gICAgICAgICAgICAgICAgICAgIHYgPSBnZXRDaGlsZEF0KG1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICBtTW90aW9uVmlld09yaWdpbmFsVG9wID0gdi5nZXRUb3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU1vdGlvblggPSB4OwotICAgICAgICAgICAgICAgIG1Nb3Rpb25ZID0geTsKLSAgICAgICAgICAgICAgICBtTW90aW9uUG9zaXRpb24gPSBtb3Rpb25Qb3NpdGlvbjsKLSAgICAgICAgICAgICAgICBtTGFzdFkgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChtb3Rpb25Qb3NpdGlvbiA+PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgd2hlcmUgdGhlIG1vdGlvbiBldmVudCBzdGFydGVkCisgICAgICAgICAgICAgICAgdiA9IGdldENoaWxkQXQobW90aW9uUG9zaXRpb24gLSBtRmlyc3RQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgbU1vdGlvblZpZXdPcmlnaW5hbFRvcCA9IHYuZ2V0VG9wKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtTW90aW9uWCA9IHg7CisgICAgICAgICAgICBtTW90aW9uWSA9IHk7CisgICAgICAgICAgICBtTW90aW9uUG9zaXRpb24gPSBtb3Rpb25Qb3NpdGlvbjsKKyAgICAgICAgICAgIG1MYXN0WSA9IEludGVnZXIuTUlOX1ZBTFVFOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjE2MywyNSArMjQ4OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RGlzYWxsb3dJbnRlcmNlcHRUb3VjaEV2ZW50KHRydWUpOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJhd0RlbHRhWSA9IGRlbHRhWTsKICAgICAgICAgICAgICAgICAgICAgZGVsdGFZIC09IG1Nb3Rpb25Db3JyZWN0aW9uOwogICAgICAgICAgICAgICAgICAgICBpbnQgaW5jcmVtZW50YWxEZWx0YVkgPSBtTGFzdFkgIT0gSW50ZWdlci5NSU5fVkFMVUUgPyB5IC0gbUxhc3RZIDogZGVsdGFZOwogICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1vdGlvbkluZGV4OwotICAgICAgICAgICAgICAgICAgICBpZiAobU1vdGlvblBvc2l0aW9uID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbkluZGV4ID0gbU1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgbW90aW9uIHBvc2l0aW9uIHRoYXQgd2UgY2FuIHJlbGlhYmx5IHRyYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGljayBzb21ldGhpbmcgaW4gdGhlIG1pZGRsZSB0byBtYWtlIGEgYmVzdCBndWVzcyBhdCB0aGluZ3MgYmVsb3cuCi0gICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25JbmRleCA9IGdldENoaWxkQ291bnQoKSAvIDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpbnQgbW90aW9uVmlld1ByZXZUb3AgPSAwOwotICAgICAgICAgICAgICAgICAgICBWaWV3IG1vdGlvblZpZXcgPSB0aGlzLmdldENoaWxkQXQobW90aW9uSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobW90aW9uVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25WaWV3UHJldlRvcCA9IG1vdGlvblZpZXcuZ2V0VG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGRvIGFsbCB0aGlzIHdvcmsgaWYgd2UncmUgbm90IGdvaW5nIHRvIG1vdmUgYW55d2F5CiAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXRFZGdlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpbmNyZW1lbnRhbERlbHRhWSAhPSAwKSB7CkBAIC0yMTg5LDkyICsyNDk5LDIzIEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBidW1wZWQgaW50byB0aGUgc2Nyb2xsIGxpbWl0Ci0gICAgICAgICAgICAgICAgICAgIG1vdGlvblZpZXcgPSB0aGlzLmdldENoaWxkQXQobW90aW9uSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobW90aW9uVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdG9wIG9mIHRoZSBtb3Rpb24gdmlldyBpcyB3aGVyZSBpdCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9zZWQgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBtb3Rpb25WaWV3UmVhbFRvcCA9IG1vdGlvblZpZXcuZ2V0VG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXRFZGdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgb3ZlcnNjcm9sbAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG92ZXJzY3JvbGwgPSAtaW5jcmVtZW50YWxEZWx0YVkgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdGlvblZpZXdSZWFsVG9wIC0gbW90aW9uVmlld1ByZXZUb3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJzY3JvbGxCeSgwLCBvdmVyc2Nyb2xsLCAwLCBtU2Nyb2xsWSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIG1PdmVyc2Nyb2xsRGlzdGFuY2UsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhtT3ZlcnNjcm9sbERpc3RhbmNlKSA9PSBNYXRoLmFicyhtU2Nyb2xsWSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgb3ZlcmZsaW5nIGlmIHdlJ3JlIGF0IHRoZSBlZGdlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX09WRVJTQ1JPTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdEZWx0YVkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25QdWxsKChmbG9hdCkgb3ZlcnNjcm9sbCAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyYXdEZWx0YVkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25QdWxsKChmbG9hdCkgb3ZlcnNjcm9sbCAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0RWRnZSAmJiBnZXRDaGlsZENvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmVhdCB0aGlzIGxpa2Ugd2UncmUgc3RhcnRpbmcgYSBuZXcgc2Nyb2xsIGZyb20gdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uLiBUaGlzIHdpbGwgbGV0IHRoZSB1c2VyIHN0YXJ0IHNjcm9sbGluZyBiYWNrIGludG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRlbnQgaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gbmVlZGluZyB0byBzY3JvbGwgYmFjayB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHdoZXJlIHRoZXkgaGl0IHRoZSBsaW1pdCBmaXJzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb3Rpb25Qb3NpdGlvbiA9IGZpbmRNb3Rpb25Sb3coeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW90aW9uUG9zaXRpb24gPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgbW90aW9uVmlldyA9IGdldENoaWxkQXQobW90aW9uUG9zaXRpb24gLSBtRmlyc3RQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vdGlvblZpZXdPcmlnaW5hbFRvcCA9IG1vdGlvblZpZXcuZ2V0VG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uWSA9IHk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uUG9zaXRpb24gPSBtb3Rpb25Qb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTGFzdFkgPSB5OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBUT1VDSF9NT0RFX09WRVJTQ1JPTEw6Ci0gICAgICAgICAgICAgICAgaWYgKHkgIT0gbUxhc3RZKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCByYXdEZWx0YVkgPSBkZWx0YVk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhWSAtPSBtTW90aW9uQ29ycmVjdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgaW50IGluY3JlbWVudGFsRGVsdGFZID0gbUxhc3RZICE9IEludGVnZXIuTUlOX1ZBTFVFID8geSAtIG1MYXN0WSA6IGRlbHRhWTsKLQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb2xkU2Nyb2xsID0gbVNjcm9sbFk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBuZXdTY3JvbGwgPSBvbGRTY3JvbGwgLSBpbmNyZW1lbnRhbERlbHRhWTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG9sZFNjcm9sbCA+PSAwICYmIG5ld1Njcm9sbCA8PSAwKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbGRTY3JvbGwgPD0gMCAmJiBuZXdTY3JvbGwgPj0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbWluZyBiYWNrIHRvICdyZWFsJyBsaXN0IHNjcm9sbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50YWxEZWx0YVkgPSAtbmV3U2Nyb2xsOwotICAgICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFkgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGRvIGFsbCB0aGlzIHdvcmsgaWYgd2UncmUgbm90IGdvaW5nIHRvIG1vdmUgYW55d2F5Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jcmVtZW50YWxEZWx0YVkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrTW90aW9uU2Nyb2xsKGluY3JlbWVudGFsRGVsdGFZLCBpbmNyZW1lbnRhbERlbHRhWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgYmFjayBpbgotICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBtb3Rpb25WaWV3ID0gdGhpcy5nZXRDaGlsZEF0KG1Nb3Rpb25Qb3NpdGlvbiAtIG1GaXJzdFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb3Rpb25WaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9TQ1JPTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkaWQgbm90IHNjcm9sbCB0aGUgZnVsbCBhbW91bnQuIFRyZWF0IHRoaXMgZXNzZW50aWFsbHkgbGlrZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBvZiBhIG5ldyB0b3VjaCBzY3JvbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbW90aW9uUG9zaXRpb24gPSBmaW5kQ2xvc2VzdE1vdGlvblJvdyh5KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25Db3JyZWN0aW9uID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25WaWV3ID0gZ2V0Q2hpbGRBdChtb3Rpb25Qb3NpdGlvbiAtIG1GaXJzdFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uVmlld09yaWdpbmFsVG9wID0gbW90aW9uVmlldy5nZXRUb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uWSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vdGlvblBvc2l0aW9uID0gbW90aW9uUG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2Nyb2xsQnkoMCwgLWluY3JlbWVudGFsRGVsdGFZLCAwLCBtU2Nyb2xsWSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbU92ZXJzY3JvbGxEaXN0YW5jZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3RGVsdGFZID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25QdWxsKChmbG9hdCkgLWluY3JlbWVudGFsRGVsdGFZIC8gZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3RGVsdGFZIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25QdWxsKChmbG9hdCkgLWluY3JlbWVudGFsRGVsdGFZIC8gZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMobU92ZXJzY3JvbGxEaXN0YW5jZSkgPT0gTWF0aC5hYnMobVNjcm9sbFkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgb3ZlcmZsaW5nIGlmIHdlJ3JlIGF0IHRoZSBlZGdlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtTGFzdFkgPSB5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnJlYWs7CkBAIC0yMzQ2LDI5ICsyNTg3LDE4IEBACiAgICAgICAgICAgICBjYXNlIFRPVUNIX01PREVfU0NST0xMOgogICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOwogICAgICAgICAgICAgICAgIGlmIChjaGlsZENvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmlyc3RDaGlsZFRvcCA9IGdldENoaWxkQXQoMCkuZ2V0VG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBsYXN0Q2hpbGRCb3R0b20gPSBnZXRDaGlsZEF0KGNoaWxkQ291bnQgLSAxKS5nZXRCb3R0b20oKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvbnRlbnRUb3AgPSBtTGlzdFBhZGRpbmcudG9wOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY29udGVudEJvdHRvbSA9IGdldEhlaWdodCgpIC0gbUxpc3RQYWRkaW5nLmJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GaXJzdFBvc2l0aW9uID09IDAgJiYgZmlyc3RDaGlsZFRvcCA+PSBjb250ZW50VG9wICYmCisgICAgICAgICAgICAgICAgICAgIGlmIChtRmlyc3RQb3NpdGlvbiA9PSAwICYmIGdldENoaWxkQXQoMCkuZ2V0VG9wKCkgPj0gbUxpc3RQYWRkaW5nLnRvcCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdFBvc2l0aW9uICsgY2hpbGRDb3VudCA8IG1JdGVtQ291bnQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q2hpbGRCb3R0b20gPD0gZ2V0SGVpZ2h0KCkgLSBjb250ZW50Qm90dG9tKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2hpbGRBdChjaGlsZENvdW50IC0gMSkuZ2V0Qm90dG9tKCkgPD0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEhlaWdodCgpIC0gbUxpc3RQYWRkaW5nLmJvdHRvbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfUkVTVDsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFNjcm9sbFN0YXRlQ2hhbmdlKE9uU2Nyb2xsTGlzdGVuZXIuU0NST0xMX1NUQVRFX0lETEUpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmVsb2NpdHlUcmFja2VyIHZlbG9jaXR5VHJhY2tlciA9IG1WZWxvY2l0eVRyYWNrZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eVRyYWNrZXIuY29tcHV0ZUN1cnJlbnRWZWxvY2l0eSgxMDAwLCBtTWF4aW11bVZlbG9jaXR5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbml0aWFsVmVsb2NpdHkgPSAoaW50KSB2ZWxvY2l0eVRyYWNrZXIuZ2V0WVZlbG9jaXR5KG1BY3RpdmVQb2ludGVySWQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGbGluZyBpZiB3ZSBoYXZlIGVub3VnaCB2ZWxvY2l0eSBhbmQgd2UgYXJlbid0IGF0IGEgYm91bmRhcnkuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBjYW4gcG90ZW50aWFsbHkgb3ZlcmZsaW5nIG1vcmUgdGhhbiB3ZSBjYW4gb3ZlcnNjcm9sbCwgZG9uJ3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IHRoZSB3ZWlyZCBiZWhhdmlvciB3aGVyZSB5b3UgY2FuIHNjcm9sbCB0byBhIGJvdW5kYXJ5IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsaW5nIGZ1cnRoZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoaW5pdGlhbFZlbG9jaXR5KSA+IG1NaW5pbXVtVmVsb2NpdHkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISgobUZpcnN0UG9zaXRpb24gPT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2hpbGRUb3AgPT0gY29udGVudFRvcCAtIG1PdmVyc2Nyb2xsRGlzdGFuY2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1GaXJzdFBvc2l0aW9uICsgY2hpbGRDb3VudCA9PSBtSXRlbUNvdW50ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdENoaWxkQm90dG9tID09IGNvbnRlbnRCb3R0b20gKyBtT3ZlcnNjcm9sbERpc3RhbmNlKSkpIHsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhpbml0aWFsVmVsb2NpdHkpID4gbU1pbmltdW1WZWxvY2l0eSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxpbmdSdW5uYWJsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGluZ1J1bm5hYmxlID0gbmV3IEZsaW5nUnVubmFibGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0yMzg1LDMyICsyNjE1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFNjcm9sbFN0YXRlQ2hhbmdlKE9uU2Nyb2xsTGlzdGVuZXIuU0NST0xMX1NUQVRFX0lETEUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBUT1VDSF9NT0RFX09WRVJTQ1JPTEw6Ci0gICAgICAgICAgICAgICAgaWYgKG1GbGluZ1J1bm5hYmxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZsaW5nUnVubmFibGUgPSBuZXcgRmxpbmdSdW5uYWJsZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBWZWxvY2l0eVRyYWNrZXIgdmVsb2NpdHlUcmFja2VyID0gbVZlbG9jaXR5VHJhY2tlcjsKLSAgICAgICAgICAgICAgICB2ZWxvY2l0eVRyYWNrZXIuY29tcHV0ZUN1cnJlbnRWZWxvY2l0eSgxMDAwLCBtTWF4aW11bVZlbG9jaXR5KTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5pdGlhbFZlbG9jaXR5ID0gKGludCkgdmVsb2NpdHlUcmFja2VyLmdldFlWZWxvY2l0eShtQWN0aXZlUG9pbnRlcklkKTsKLQotICAgICAgICAgICAgICAgIHJlcG9ydFNjcm9sbFN0YXRlQ2hhbmdlKE9uU2Nyb2xsTGlzdGVuZXIuU0NST0xMX1NUQVRFX0ZMSU5HKTsKLSAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoaW5pdGlhbFZlbG9jaXR5KSA+IG1NaW5pbXVtVmVsb2NpdHkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZsaW5nUnVubmFibGUuc3RhcnRPdmVyZmxpbmcoLWluaXRpYWxWZWxvY2l0eSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUZsaW5nUnVubmFibGUuc3RhcnRTcHJpbmdiYWNrKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNldFByZXNzZWQoZmFsc2UpOwogCi0gICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAvLyBOZWVkIHRvIHJlZHJhdyBzaW5jZSB3ZSBwcm9iYWJseSBhcmVuJ3QgZHJhd2luZyB0aGUgc2VsZWN0b3IgYW55bW9yZQogICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogCkBAIC0yNDM2LDQyICsyNjQ0LDI0IEBACiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6IHsKLSAgICAgICAgICAgIHN3aXRjaCAobVRvdWNoTW9kZSkgewotICAgICAgICAgICAgY2FzZSBUT1VDSF9NT0RFX09WRVJTQ1JPTEw6Ci0gICAgICAgICAgICAgICAgaWYgKG1GbGluZ1J1bm5hYmxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZsaW5nUnVubmFibGUgPSBuZXcgRmxpbmdSdW5uYWJsZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtRmxpbmdSdW5uYWJsZS5zdGFydFNwcmluZ2JhY2soKTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1JFU1Q7CisgICAgICAgICAgICBzZXRQcmVzc2VkKGZhbHNlKTsKKyAgICAgICAgICAgIFZpZXcgbW90aW9uVmlldyA9IHRoaXMuZ2V0Q2hpbGRBdChtTW90aW9uUG9zaXRpb24gLSBtRmlyc3RQb3NpdGlvbik7CisgICAgICAgICAgICBpZiAobW90aW9uVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbW90aW9uVmlldy5zZXRQcmVzc2VkKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsZWFyU2Nyb2xsaW5nQ2FjaGUoKTsKIAotICAgICAgICAgICAgY2FzZSBUT1VDSF9NT0RFX09WRVJGTElORzoKLSAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nIC0gbGV0IGl0IHBsYXkgb3V0LgotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZmluYWwgSGFuZGxlciBoYW5kbGVyID0gZ2V0SGFuZGxlcigpOworICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1QZW5kaW5nQ2hlY2tGb3JMb25nUHJlc3MpOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1JFU1Q7Ci0gICAgICAgICAgICAgICAgc2V0UHJlc3NlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgVmlldyBtb3Rpb25WaWV3ID0gdGhpcy5nZXRDaGlsZEF0KG1Nb3Rpb25Qb3NpdGlvbiAtIG1GaXJzdFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAobW90aW9uVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vdGlvblZpZXcuc2V0UHJlc3NlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNsZWFyU2Nyb2xsaW5nQ2FjaGUoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIEhhbmRsZXIgaGFuZGxlciA9IGdldEhhbmRsZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1QZW5kaW5nQ2hlY2tGb3JMb25nUHJlc3MpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjQ5Niw2MCArMjY4NiwxMCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uT3ZlcnNjcm9sbGVkKGludCBzY3JvbGxYLCBpbnQgc2Nyb2xsWSwKLSAgICAgICAgICAgIGJvb2xlYW4gY2xhbXBlZFgsIGJvb2xlYW4gY2xhbXBlZFkpIHsKLSAgICAgICAgbVNjcm9sbFkgPSBzY3JvbGxZOwotCi0gICAgICAgIGlmIChjbGFtcGVkWSkgewotICAgICAgICAgICAgLy8gVmVsb2NpdHkgaXMgYnJva2VuIGJ5IGhpdHRpbmcgdGhlIGxpbWl0OyBkb24ndCBzdGFydCBhIGZsaW5nIG9mZiBvZiB0aGlzLgotICAgICAgICAgICAgaWYgKG1WZWxvY2l0eVRyYWNrZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhd2FrZW5TY3JvbGxCYXJzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7CiAgICAgICAgIHN1cGVyLmRyYXcoY2FudmFzKTsKLSAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dUb3AuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gZ2V0V2lkdGgoKTsKLQotICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXdpZHRoIC8gMiwgc2Nyb2xsWSk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLnNldFNpemUod2lkdGggKiAyLCBnZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcC5kcmF3KGNhbnZhcykpIHsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQocmVzdG9yZUNvdW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUVkZ2VHbG93Qm90dG9tLmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGdldFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGdldEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtd2lkdGggLyAyLCBzY3JvbGxZICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBjYW52YXMucm90YXRlKDE4MCwgd2lkdGgsIDApOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5zZXRTaXplKHdpZHRoICogMiwgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBpZiAobUVkZ2VHbG93Qm90dG9tLmRyYXcoY2FudmFzKSkgewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlQ291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgICAgIGlmIChtRmFzdFNjcm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBzY3JvbGxZID0gbVNjcm9sbFk7Ci0gICAgICAgICAgICBpZiAoc2Nyb2xsWSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gUGluIHRvIHRoZSB0b3AvYm90dG9tIGR1cmluZyBvdmVyc2Nyb2xsCi0gICAgICAgICAgICAgICAgaW50IHJlc3RvcmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLCAoZmxvYXQpIHNjcm9sbFkpOwotICAgICAgICAgICAgICAgIG1GYXN0U2Nyb2xsZXIuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlQ291bnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRmFzdFNjcm9sbGVyLmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1GYXN0U2Nyb2xsZXIuZHJhdyhjYW52YXMpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNTY4LDEwICsyNzA4LDYgQEAKICAgICAgICAgc3dpdGNoIChhY3Rpb24gJiBNb3Rpb25FdmVudC5BQ1RJT05fTUFTSykgewogICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOiB7CiAgICAgICAgICAgICBpbnQgdG91Y2hNb2RlID0gbVRvdWNoTW9kZTsKLSAgICAgICAgICAgIGlmICh0b3VjaE1vZGUgPT0gVE9VQ0hfTU9ERV9PVkVSRkxJTkcgfHwgdG91Y2hNb2RlID09IFRPVUNIX01PREVfT1ZFUlNDUk9MTCkgewotICAgICAgICAgICAgICAgIG1Nb3Rpb25Db3JyZWN0aW9uID0gMDsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICAgICAgZmluYWwgaW50IHggPSAoaW50KSBldi5nZXRYKCk7CiAgICAgICAgICAgICBmaW5hbCBpbnQgeSA9IChpbnQpIGV2LmdldFkoKTsKQEAgLTI2MzYsNyArMjc3Miw2IEBACiAgICAgICAgICAgICBmaW5hbCBpbnQgbmV3UG9pbnRlckluZGV4ID0gcG9pbnRlckluZGV4ID09IDAgPyAxIDogMDsKICAgICAgICAgICAgIG1Nb3Rpb25YID0gKGludCkgZXYuZ2V0WChuZXdQb2ludGVySW5kZXgpOwogICAgICAgICAgICAgbU1vdGlvblkgPSAoaW50KSBldi5nZXRZKG5ld1BvaW50ZXJJbmRleCk7Ci0gICAgICAgICAgICBtTW90aW9uQ29ycmVjdGlvbiA9IDA7CiAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gZXYuZ2V0UG9pbnRlcklkKG5ld1BvaW50ZXJJbmRleCk7CiAgICAgICAgICAgICBpZiAobVZlbG9jaXR5VHJhY2tlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5jbGVhcigpOwpAQCAtMjY5Miw3ICsyODI3LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRyYWNrcyB0aGUgZGVjYXkgb2YgYSBmbGluZyBzY3JvbGwKICAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgZmluYWwgT3ZlclNjcm9sbGVyIG1TY3JvbGxlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTY3JvbGxlciBtU2Nyb2xsZXI7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFkgdmFsdWUgcmVwb3J0ZWQgYnkgbVNjcm9sbGVyIG9uIHRoZSBwcmV2aW91cyBmbGluZwpAQCAtMjcwMCw3ICsyODM1LDcgQEAKICAgICAgICAgcHJpdmF0ZSBpbnQgbUxhc3RGbGluZ1k7CiAKICAgICAgICAgRmxpbmdSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIG1TY3JvbGxlciA9IG5ldyBPdmVyU2Nyb2xsZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgIG1TY3JvbGxlciA9IG5ldyBTY3JvbGxlcihnZXRDb250ZXh0KCkpOwogICAgICAgICB9CiAKICAgICAgICAgdm9pZCBzdGFydChpbnQgaW5pdGlhbFZlbG9jaXR5KSB7CkBAIC0yNzE5LDQwICsyODU0LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHZvaWQgc3RhcnRTcHJpbmdiYWNrKCkgewotICAgICAgICAgICAgaWYgKG1TY3JvbGxlci5zcHJpbmdiYWNrKDAsIG1TY3JvbGxZLCAwLCAwLCAwLCAwKSkgewotICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX09WRVJGTElORzsKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgcG9zdCh0aGlzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfUkVTVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc3RhcnRPdmVyZmxpbmcoaW50IGluaXRpYWxWZWxvY2l0eSkgewotICAgICAgICAgICAgZmluYWwgaW50IG1pbiA9IG1TY3JvbGxZID4gMCA/IEludGVnZXIuTUlOX1ZBTFVFIDogMDsKLSAgICAgICAgICAgIGZpbmFsIGludCBtYXggPSBtU2Nyb2xsWSA+IDAgPyAwIDogSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgICAgICBtU2Nyb2xsZXIuZmxpbmcoMCwgbVNjcm9sbFksIDAsIGluaXRpYWxWZWxvY2l0eSwgMCwgMCwgbWluLCBtYXgsIDAsIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX09WRVJGTElORzsKLSAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgIHBvc3QodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGVkZ2VSZWFjaGVkKGludCBkZWx0YSkgewotICAgICAgICAgICAgbVNjcm9sbGVyLm5vdGlmeVZlcnRpY2FsRWRnZVJlYWNoZWQobVNjcm9sbFksIDAsIG1PdmVyZmxpbmdEaXN0YW5jZSk7Ci0gICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9PVkVSRkxJTkc7Ci0gICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdmVsID0gKGludCkgbVNjcm9sbGVyLmdldEN1cnJWZWxvY2l0eSgpOwotICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uQWJzb3JiKHZlbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uQWJzb3JiKHZlbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgcG9zdCh0aGlzKTsKLSAgICAgICAgfQotCiAgICAgICAgIHZvaWQgc3RhcnRTY3JvbGwoaW50IGRpc3RhbmNlLCBpbnQgZHVyYXRpb24pIHsKICAgICAgICAgICAgIGludCBpbml0aWFsWSA9IGRpc3RhbmNlIDwgMCA/IEludGVnZXIuTUFYX1ZBTFVFIDogMDsKICAgICAgICAgICAgIG1MYXN0RmxpbmdZID0gaW5pdGlhbFk7CkBAIC0yNzg1LDcgKzI4ODYsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgZmluYWwgT3ZlclNjcm9sbGVyIHNjcm9sbGVyID0gbVNjcm9sbGVyOworICAgICAgICAgICAgICAgIGZpbmFsIFNjcm9sbGVyIHNjcm9sbGVyID0gbVNjcm9sbGVyOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gbW9yZSA9IHNjcm9sbGVyLmNvbXB1dGVTY3JvbGxPZmZzZXQoKTsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgeSA9IHNjcm9sbGVyLmdldEN1cnJZKCk7CiAKQEAgLTI4MTQsMjQgKzI5MTUsNyBAQAogICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IE1hdGgubWF4KC0oZ2V0SGVpZ2h0KCkgLSBtUGFkZGluZ0JvdHRvbSAtIG1QYWRkaW5nVG9wIC0gMSksIGRlbHRhKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBidW1wZWQgaW50byB0aGUgc2Nyb2xsIGxpbWl0Ci0gICAgICAgICAgICAgICAgVmlldyBtb3Rpb25WaWV3ID0gZ2V0Q2hpbGRBdChtTW90aW9uUG9zaXRpb24gLSBtRmlyc3RQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgaW50IG9sZFRvcCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKG1vdGlvblZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBvbGRUb3AgPSBtb3Rpb25WaWV3LmdldFRvcCgpOwotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXRFbmQgPSB0cmFja01vdGlvblNjcm9sbChkZWx0YSwgZGVsdGEpOwotICAgICAgICAgICAgICAgIGlmIChhdEVuZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobW90aW9uVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUd2VhayB0aGUgc2Nyb2xsIGZvciBob3cgZmFyIHdlIG92ZXJzaG90Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3ZlcnNob290ID0gLShkZWx0YSAtIChtb3Rpb25WaWV3LmdldFRvcCgpIC0gb2xkVG9wKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2Nyb2xsQnkoMCwgb3ZlcnNob290LCAwLCBtU2Nyb2xsWSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbU92ZXJmbGluZ0Rpc3RhbmNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWRnZVJlYWNoZWQoZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAobW9yZSAmJiAhYXRFbmQpIHsKICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwpAQCAtMjg0OSwyNCArMjkzMyw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFRPVUNIX01PREVfT1ZFUkZMSU5HOiB7Ci0gICAgICAgICAgICAgICAgZmluYWwgT3ZlclNjcm9sbGVyIHNjcm9sbGVyID0gbVNjcm9sbGVyOwotICAgICAgICAgICAgICAgIGlmIChzY3JvbGxlci5jb21wdXRlU2Nyb2xsT2Zmc2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNjcm9sbFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGRlbHRhWSA9IHNjcm9sbGVyLmdldEN1cnJZKCkgLSBzY3JvbGxZOwotICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcnNjcm9sbEJ5KDAsIGRlbHRhWSwgMCwgc2Nyb2xsWSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBtT3ZlcmZsaW5nRGlzdGFuY2UsIGZhbHNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTcHJpbmdiYWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3N0KHRoaXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kRmxpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgfQpAQCAtMjg4MCw2ICsyOTQ2LDcgQEAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVkVfVVBfUE9TID0gMjsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVkVfRE9XTl9CT1VORCA9IDM7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1ZFX1VQX0JPVU5EID0gNDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVkVfT0ZGU0VUID0gNTsKICAgICAgICAgCiAgICAgICAgIHByaXZhdGUgaW50IG1Nb2RlOwogICAgICAgICBwcml2YXRlIGludCBtVGFyZ2V0UG9zOwpAQCAtMjg4Nyw2ICsyOTU0LDggQEAKICAgICAgICAgcHJpdmF0ZSBpbnQgbUxhc3RTZWVuUG9zOwogICAgICAgICBwcml2YXRlIGludCBtU2Nyb2xsRHVyYXRpb247CiAgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1FeHRyYVNjcm9sbDsKKworICAgICAgICBwcml2YXRlIGludCBtT2Zmc2V0RnJvbVRvcDsKICAgICAgICAgCiAgICAgICAgIFBvc2l0aW9uU2Nyb2xsZXIoKSB7CiAgICAgICAgICAgICBtRXh0cmFTY3JvbGwgPSBWaWV3Q29uZmlndXJhdGlvbi5nZXQobUNvbnRleHQpLmdldFNjYWxlZEZhZGluZ0VkZ2VMZW5ndGgoKTsKQEAgLTI5NzgsMTIgKzMwNDcsNDYgQEAKICAgICAgICAgICAgIAogICAgICAgICAgICAgcG9zdCh0aGlzKTsKICAgICAgICAgfQotICAgICAgICAKKworICAgICAgICB2b2lkIHN0YXJ0V2l0aE9mZnNldChpbnQgcG9zaXRpb24sIGludCBvZmZzZXQpIHsKKyAgICAgICAgICAgIG1UYXJnZXRQb3MgPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIG1PZmZzZXRGcm9tVG9wID0gb2Zmc2V0OworICAgICAgICAgICAgbUJvdW5kUG9zID0gSU5WQUxJRF9QT1NJVElPTjsKKyAgICAgICAgICAgIG1MYXN0U2VlblBvcyA9IElOVkFMSURfUE9TSVRJT047CisgICAgICAgICAgICBtTW9kZSA9IE1PVkVfT0ZGU0VUOworCisgICAgICAgICAgICBmaW5hbCBpbnQgZmlyc3RQb3MgPSBtRmlyc3RQb3NpdGlvbjsKKyAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgZmluYWwgaW50IGxhc3RQb3MgPSBmaXJzdFBvcyArIGNoaWxkQ291bnQgLSAxOworCisgICAgICAgICAgICBpbnQgdmlld1RyYXZlbENvdW50ID0gMDsKKyAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IGZpcnN0UG9zKSB7CisgICAgICAgICAgICAgICAgdmlld1RyYXZlbENvdW50ID0gZmlyc3RQb3MgLSBwb3NpdGlvbjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPiBsYXN0UG9zKSB7CisgICAgICAgICAgICAgICAgdmlld1RyYXZlbENvdW50ID0gcG9zaXRpb24gLSBsYXN0UG9zOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBPbi1zY3JlZW4sIGp1c3Qgc2Nyb2xsLgorICAgICAgICAgICAgICAgIGZpbmFsIGludCB0YXJnZXRUb3AgPSBnZXRDaGlsZEF0KHBvc2l0aW9uIC0gZmlyc3RQb3MpLmdldFRvcCgpOworICAgICAgICAgICAgICAgIHNtb290aFNjcm9sbEJ5KHRhcmdldFRvcCAtIG9mZnNldCwgU0NST0xMX0RVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEVzdGltYXRlIGhvdyBtYW55IHNjcmVlbnMgd2Ugc2hvdWxkIHRyYXZlbAorICAgICAgICAgICAgZmluYWwgZmxvYXQgc2NyZWVuVHJhdmVsQ291bnQgPSAoZmxvYXQpIHZpZXdUcmF2ZWxDb3VudCAvIGNoaWxkQ291bnQ7CisgICAgICAgICAgICBtU2Nyb2xsRHVyYXRpb24gPSAoaW50KSAoU0NST0xMX0RVUkFUSU9OIC8gc2NyZWVuVHJhdmVsQ291bnQpOworICAgICAgICAgICAgbUxhc3RTZWVuUG9zID0gSU5WQUxJRF9QT1NJVElPTjsKKyAgICAgICAgICAgIHBvc3QodGhpcyk7CisgICAgICAgIH0KKwogICAgICAgICB2b2lkIHN0b3AoKSB7CiAgICAgICAgICAgICByZW1vdmVDYWxsYmFja3ModGhpcyk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgIT0gVE9VQ0hfTU9ERV9GTElORyAmJiBtTGFzdFNlZW5Qb3MgIT0gSU5WQUxJRF9QT1NJVElPTikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZmluYWwgaW50IGxpc3RIZWlnaHQgPSBnZXRIZWlnaHQoKTsKICAgICAgICAgICAgIGZpbmFsIGludCBmaXJzdFBvcyA9IG1GaXJzdFBvc2l0aW9uOwogICAgICAgICAgICAgCkBAIC0zMTA4LDYgKzMyMTEsMjcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSBNT1ZFX09GRlNFVDogeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworCisgICAgICAgICAgICAgICAgbUxhc3RTZWVuUG9zID0gZmlyc3RQb3M7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHBvc2l0aW9uID0gbVRhcmdldFBvczsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGFzdFBvcyA9IGZpcnN0UG9zICsgY2hpbGRDb3VudCAtIDE7CisKKyAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBmaXJzdFBvcykgeworICAgICAgICAgICAgICAgICAgICBzbW9vdGhTY3JvbGxCeSgtZ2V0SGVpZ2h0KCksIG1TY3JvbGxEdXJhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIHBvc3QodGhpcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA+IGxhc3RQb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgc21vb3RoU2Nyb2xsQnkoZ2V0SGVpZ2h0KCksIG1TY3JvbGxEdXJhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIHBvc3QodGhpcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gT24tc2NyZWVuLCBqdXN0IHNjcm9sbC4KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRhcmdldFRvcCA9IGdldENoaWxkQXQocG9zaXRpb24gLSBmaXJzdFBvcykuZ2V0VG9wKCk7CisgICAgICAgICAgICAgICAgICAgIHNtb290aFNjcm9sbEJ5KHRhcmdldFRvcCAtIG1PZmZzZXRGcm9tVG9wLCBtU2Nyb2xsRHVyYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTMxMjcsNiArMzI1MSwyNCBAQAogICAgIH0KICAgICAKICAgICAvKioKKyAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uLiBUaGUgdmlldyB3aWxsIHNjcm9sbAorICAgICAqIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZCA8Y29kZT5vZmZzZXQ8L2NvZGU+IHBpeGVscyBmcm9tCisgICAgICogdGhlIHRvcCBlZGdlIG9mIHRoZSB2aWV3LiBJZiB0aGlzIGlzIGltcG9zc2libGUsIChlLmcuIHRoZSBvZmZzZXQgd291bGQgc2Nyb2xsCisgICAgICogdGhlIGZpcnN0IG9yIGxhc3QgaXRlbSBiZXlvbmQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGxpc3QpIGl0IHdpbGwgZ2V0IGFzIGNsb3NlCisgICAgICogYXMgcG9zc2libGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gUG9zaXRpb24gdG8gc2Nyb2xsIHRvCisgICAgICogQHBhcmFtIG9mZnNldCBEZXNpcmVkIGRpc3RhbmNlIGluIHBpeGVscyBvZiA8Y29kZT5wb3NpdGlvbjwvY29kZT4gZnJvbSB0aGUgdG9wCisgICAgICogICAgICAgICAgICAgICBvZiB0aGUgdmlldyB3aGVuIHNjcm9sbGluZyBpcyBmaW5pc2hlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNtb290aFNjcm9sbFRvUG9zaXRpb25Gcm9tVG9wKGludCBwb3NpdGlvbiwgaW50IG9mZnNldCkgeworICAgICAgICBpZiAobVBvc2l0aW9uU2Nyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbVBvc2l0aW9uU2Nyb2xsZXIgPSBuZXcgUG9zaXRpb25TY3JvbGxlcigpOworICAgICAgICB9CisgICAgICAgIG1Qb3NpdGlvblNjcm9sbGVyLnN0YXJ0V2l0aE9mZnNldChwb3NpdGlvbiwgb2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uLiBUaGUgdmlldyB3aWxsCiAgICAgICogc2Nyb2xsIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZCwgYnV0IGl0IHdpbGwKICAgICAgKiBzdG9wIGVhcmx5IGlmIHNjcm9sbGluZyBmdXJ0aGVyIHdvdWxkIHNjcm9sbCBib3VuZFBvc2l0aW9uIG91dCBvZgpAQCAtMzE1Niw2ICszMjk4LDQyIEBACiAgICAgICAgIG1GbGluZ1J1bm5hYmxlLnN0YXJ0U2Nyb2xsKGRpc3RhbmNlLCBkdXJhdGlvbik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQWxsb3dzIFJlbW90ZVZpZXdzIHRvIHNjcm9sbCByZWxhdGl2ZWx5IHRvIGEgcG9zaXRpb24uCisgICAgICovCisgICAgdm9pZCBzbW9vdGhTY3JvbGxCeU9mZnNldChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgaW50IGluZGV4ID0gLTE7CisgICAgICAgIGlmIChwb3NpdGlvbiA8IDApIHsKKyAgICAgICAgICAgIGluZGV4ID0gZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKKyAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA+IDApIHsKKyAgICAgICAgICAgIGluZGV4ID0gZ2V0TGFzdFZpc2libGVQb3NpdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluZGV4ID4gLTEpIHsKKyAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGluZGV4IC0gZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7CisgICAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFJlY3QgdmlzaWJsZVJlY3QgPSBuZXcgUmVjdCgpOworICAgICAgICAgICAgICAgIGlmIChjaGlsZC5nZXRHbG9iYWxWaXNpYmxlUmVjdCh2aXNpYmxlUmVjdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNoaWxkIGlzIHBhcnRpYWxseSB2aXNpYmxlCisgICAgICAgICAgICAgICAgICAgIGludCBjaGlsZFJlY3RBcmVhID0gY2hpbGQuZ2V0V2lkdGgoKSAqIGNoaWxkLmdldEhlaWdodCgpOworICAgICAgICAgICAgICAgICAgICBpbnQgdmlzaWJsZVJlY3RBcmVhID0gdmlzaWJsZVJlY3Qud2lkdGgoKSAqIHZpc2libGVSZWN0LmhlaWdodCgpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCB2aXNpYmxlQXJlYSA9ICh2aXNpYmxlUmVjdEFyZWEgLyAoZmxvYXQpIGNoaWxkUmVjdEFyZWEpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCB2aXNpYmxlVGhyZXNob2xkID0gMC43NWY7CisgICAgICAgICAgICAgICAgICAgIGlmICgocG9zaXRpb24gPCAwKSAmJiAodmlzaWJsZUFyZWEgPCB2aXNpYmxlVGhyZXNob2xkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRvcCBpbmRleCBpcyBub3QgcGVyY2VpdmFibHkgdmlzaWJsZSBzbyBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGFjY291bnQgZm9yIHNob3dpbmcgdGhhdCB0b3AgaW5kZXggYXMgd2VsbAorICAgICAgICAgICAgICAgICAgICAgICAgKytpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgocG9zaXRpb24gPiAwKSAmJiAodmlzaWJsZUFyZWEgPCB2aXNpYmxlVGhyZXNob2xkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJvdHRvbSBpbmRleCBpcyBub3QgcGVyY2VpdmFibHkgdmlzaWJsZSBzbyBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGFjY291bnQgZm9yIHNob3dpbmcgdGhhdCBib3R0b20gaW5kZXggYXMgd2VsbAorICAgICAgICAgICAgICAgICAgICAgICAgLS1pbmRleDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKE1hdGgubWF4KDAsIE1hdGgubWluKGdldENvdW50KCksIGluZGV4ICsgcG9zaXRpb24pKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgY3JlYXRlU2Nyb2xsaW5nQ2FjaGUoKSB7CiAgICAgICAgIGlmIChtU2Nyb2xsaW5nQ2FjaGVFbmFibGVkICYmICFtQ2FjaGluZ1N0YXJ0ZWQpIHsKICAgICAgICAgICAgIHNldENoaWxkcmVuRHJhd25XaXRoQ2FjaGVFbmFibGVkKHRydWUpOwpAQCAtMzIyMywxNyArMzQwMSwxNiBAQAogCiAgICAgICAgIGZpbmFsIGludCBmaXJzdFBvc2l0aW9uID0gbUZpcnN0UG9zaXRpb247CiAKLSAgICAgICAgaWYgKGZpcnN0UG9zaXRpb24gPT0gMCAmJiBmaXJzdFRvcCA+PSBsaXN0UGFkZGluZy50b3AgJiYgaW5jcmVtZW50YWxEZWx0YVkgPj0gMCkgeworICAgICAgICBpZiAoZmlyc3RQb3NpdGlvbiA9PSAwICYmIGZpcnN0VG9wID49IGxpc3RQYWRkaW5nLnRvcCAmJiBkZWx0YVkgPj0gMCkgewogICAgICAgICAgICAgLy8gRG9uJ3QgbmVlZCB0byBtb3ZlIHZpZXdzIGRvd24gaWYgdGhlIHRvcCBvZiB0aGUgZmlyc3QgcG9zaXRpb24KICAgICAgICAgICAgIC8vIGlzIGFscmVhZHkgdmlzaWJsZQotICAgICAgICAgICAgcmV0dXJuIGluY3JlbWVudGFsRGVsdGFZICE9IDA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChmaXJzdFBvc2l0aW9uICsgY2hpbGRDb3VudCA9PSBtSXRlbUNvdW50ICYmIGxhc3RCb3R0b20gPD0gZW5kICYmCi0gICAgICAgICAgICAgICAgaW5jcmVtZW50YWxEZWx0YVkgPD0gMCkgeworICAgICAgICBpZiAoZmlyc3RQb3NpdGlvbiArIGNoaWxkQ291bnQgPT0gbUl0ZW1Db3VudCAmJiBsYXN0Qm90dG9tIDw9IGVuZCAmJiBkZWx0YVkgPD0gMCkgewogICAgICAgICAgICAgLy8gRG9uJ3QgbmVlZCB0byBtb3ZlIHZpZXdzIHVwIGlmIHRoZSBib3R0b20gb2YgdGhlIGxhc3QgcG9zaXRpb24KICAgICAgICAgICAgIC8vIGlzIGFscmVhZHkgdmlzaWJsZQotICAgICAgICAgICAgcmV0dXJuIGluY3JlbWVudGFsRGVsdGFZICE9IDA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIGJvb2xlYW4gZG93biA9IGluY3JlbWVudGFsRGVsdGFZIDwgMDsKQEAgLTM1MTUsNiArMzY5Miw3IEBACiAKICAgICAgICAgbVJlc3VycmVjdFRvUG9zaXRpb24gPSBJTlZBTElEX1BPU0lUSU9OOwogICAgICAgICByZW1vdmVDYWxsYmFja3MobUZsaW5nUnVubmFibGUpOworICAgICAgICByZW1vdmVDYWxsYmFja3MobVBvc2l0aW9uU2Nyb2xsZXIpOwogICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9SRVNUOwogICAgICAgICBjbGVhclNjcm9sbGluZ0NhY2hlKCk7CiAgICAgICAgIG1TcGVjaWZpY1RvcCA9IHNlbGVjdGVkVG9wOwpAQCAtNDE2OCw2ICs0MzQ2LDM0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGlzIEFic0xpc3RWaWV3IHRvIHVzZSBhIHJlbW90ZSB2aWV3cyBhZGFwdGVyIHdoaWNoIGNvbm5lY3RzIHRvIGEgUmVtb3RlVmlld3NTZXJ2aWNlCisgICAgICogdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGludGVudC4KKyAgICAgKiBAcGFyYW0gaW50ZW50IHRoZSBpbnRlbnQgdXNlZCB0byBpZGVudGlmeSB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlIGZvciB0aGUgYWRhcHRlciB0byBjb25uZWN0IHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZVZpZXdzQWRhcHRlcihJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIG1SZW1vdGVBZGFwdGVyID0gbmV3IFJlbW90ZVZpZXdzQWRhcHRlcihnZXRDb250ZXh0KCksIGludGVudCwgdGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJhY2sgd2hlbiB0aGUgYWRhcHRlciBjb25uZWN0cyB0byB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCgpIHsKKyAgICAgICAgaWYgKG1SZW1vdGVBZGFwdGVyICE9IG1BZGFwdGVyKSB7CisgICAgICAgICAgICBzZXRBZGFwdGVyKG1SZW1vdGVBZGFwdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBiYWNrIHdoZW4gdGhlIGFkYXB0ZXIgZGlzY29ubmVjdHMgZnJvbSB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVtb3RlQWRhcHRlckRpc2Nvbm5lY3RlZCgpIHsKKyAgICAgICAgaWYgKG1SZW1vdGVBZGFwdGVyID09IG1BZGFwdGVyKSB7CisgICAgICAgICAgICBtUmVtb3RlQWRhcHRlciA9IG51bGw7CisgICAgICAgICAgICBzZXRBZGFwdGVyKG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcmVjeWNsZXIgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgd2hlbmV2ZXIgYSBWaWV3IGlzIHNldCBhc2lkZSBpbgogICAgICAqIHRoZSByZWN5Y2xlciBmb3IgbGF0ZXIgcmV1c2UuIFRoaXMgbGlzdGVuZXIgY2FuIGJlIHVzZWQgdG8gZnJlZSByZXNvdXJjZXMKICAgICAgKiBhc3NvY2lhdGVkIHRvIHRoZSBWaWV3LgpAQCAtNDE4Myw2ICs0Mzg5LDc1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQSBNdWx0aUNob2ljZU1vZGVMaXN0ZW5lciByZWNlaXZlcyBldmVudHMgZm9yIHtAbGluayBBYnNMaXN0VmlldyNDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTH0uCisgICAgICogSXQgYWN0cyBhcyB0aGUge0BsaW5rIEFjdGlvbk1vZGUuQ2FsbGJhY2t9IGZvciB0aGUgc2VsZWN0aW9uIG1vZGUgYW5kIGFsc28gcmVjZWl2ZXMKKyAgICAgKiB7QGxpbmsgI29uSXRlbUNoZWNrZWRTdGF0ZUNoYW5nZWQoQWN0aW9uTW9kZSwgaW50LCBsb25nLCBib29sZWFuKX0gZXZlbnRzIHdoZW4gdGhlIHVzZXIKKyAgICAgKiBzZWxlY3RzIGFuZCBkZXNlbGVjdHMgbGlzdCBpdGVtcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIGV4dGVuZHMgQWN0aW9uTW9kZS5DYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhbiBpdGVtIGlzIGNoZWNrZWQgb3IgdW5jaGVja2VkIGR1cmluZyBzZWxlY3Rpb24gbW9kZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1vZGUgVGhlIHtAbGluayBBY3Rpb25Nb2RlfSBwcm92aWRpbmcgdGhlIHNlbGVjdGlvbiBtb2RlCisgICAgICAgICAqIEBwYXJhbSBwb3NpdGlvbiBBZGFwdGVyIHBvc2l0aW9uIG9mIHRoZSBpdGVtIHRoYXQgd2FzIGNoZWNrZWQgb3IgdW5jaGVja2VkCisgICAgICAgICAqIEBwYXJhbSBpZCBBZGFwdGVyIElEIG9mIHRoZSBpdGVtIHRoYXQgd2FzIGNoZWNrZWQgb3IgdW5jaGVja2VkCisgICAgICAgICAqIEBwYXJhbSBjaGVja2VkIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBpdGVtIGlzIG5vdyBjaGVja2VkLCA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGl0ZW0gaXMgbm93IHVuY2hlY2tlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNoZWNrZWRTdGF0ZUNoYW5nZWQoQWN0aW9uTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiwgbG9uZyBpZCwgYm9vbGVhbiBjaGVja2VkKTsKKyAgICB9CisKKyAgICBjbGFzcyBNdWx0aUNob2ljZU1vZGVXcmFwcGVyIGltcGxlbWVudHMgTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIG1XcmFwcGVkOworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFdyYXBwZWQoTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgd3JhcHBlZCkgeworICAgICAgICAgICAgbVdyYXBwZWQgPSB3cmFwcGVkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICBpZiAobVdyYXBwZWQub25DcmVhdGVBY3Rpb25Nb2RlKG1vZGUsIG1lbnUpKSB7CisgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBjaGVja2VkIGdyYXBoaWMgc3RhdGU/CisgICAgICAgICAgICAgICAgc2V0TG9uZ0NsaWNrYWJsZShmYWxzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZWQub25QcmVwYXJlQWN0aW9uTW9kZShtb2RlLCBtZW51KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aW9uSXRlbUNsaWNrZWQoQWN0aW9uTW9kZSBtb2RlLCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZWQub25BY3Rpb25JdGVtQ2xpY2tlZChtb2RlLCBpdGVtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBtV3JhcHBlZC5vbkRlc3Ryb3lBY3Rpb25Nb2RlKG1vZGUpOworICAgICAgICAgICAgbUNob2ljZUFjdGlvbk1vZGUgPSBudWxsOworCisgICAgICAgICAgICAvLyBFbmRpbmcgc2VsZWN0aW9uIG1vZGUgbWVhbnMgZGVzZWxlY3RpbmcgZXZlcnl0aGluZy4KKyAgICAgICAgICAgIGNsZWFyQ2hvaWNlcygpOworCisgICAgICAgICAgICBtRGF0YUNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgcmVtZW1iZXJTeW5jU3RhdGUoKTsKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKworICAgICAgICAgICAgc2V0TG9uZ0NsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNoZWNrZWRTdGF0ZUNoYW5nZWQoQWN0aW9uTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiwgbG9uZyBpZCwgYm9vbGVhbiBjaGVja2VkKSB7CisgICAgICAgICAgICBtV3JhcHBlZC5vbkl0ZW1DaGVja2VkU3RhdGVDaGFuZ2VkKG1vZGUsIHBvc2l0aW9uLCBpZCwgY2hlY2tlZCk7CisKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBpdGVtcyBzZWxlY3RlZCB3ZSBubyBsb25nZXIgbmVlZCB0aGUgc2VsZWN0aW9uIG1vZGUuCisgICAgICAgICAgICBpZiAoZ2V0Q2hlY2tlZEl0ZW1Db3VudCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBtb2RlLmZpbmlzaCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQWJzTGlzdFZpZXcgZXh0ZW5kcyBMYXlvdXRQYXJhbXMgdG8gcHJvdmlkZSBhIHBsYWNlIHRvIGhvbGQgdGhlIHZpZXcgdHlwZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExheW91dFBhcmFtcyBleHRlbmRzIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgewpAQCAtNDU1MCw3ICs0ODI1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PFZpZXc+IHNjcmFwID0gbVNjcmFwVmlld3NbaV07CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzY3JhcENvdW50ID0gc2NyYXAuc2l6ZSgpOwogICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNjcmFwQ291bnQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXAuZ2V0KGkpLnNldERyYXdpbmdDYWNoZUJhY2tncm91bmRDb2xvcihjb2xvcik7CisgICAgICAgICAgICAgICAgICAgICAgICBzY3JhcC5nZXQoaikuc2V0RHJhd2luZ0NhY2hlQmFja2dyb3VuZENvbG9yKGNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3LmphdmEKaW5kZXggOGZjYzJlOC4uYWI3NTQyMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3LmphdmEKQEAgLTIyOCw3ICsyMjgsNiBAQAogICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogSW50ZXJmYWNlIGRlZmluaXRpb24gZm9yIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGFuIGl0ZW0gaW4gdGhpcwogICAgICAqIEFkYXB0ZXJWaWV3IGhhcyBiZWVuIGNsaWNrZWQuCkBAIC02MjksNiArNjI4LDcgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB2aWV3IHRvIHNob3cgaWYgdGhlIGFkYXB0ZXIgaXMgZW1wdHkKICAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKICAgICBwdWJsaWMgdm9pZCBzZXRFbXB0eVZpZXcoVmlldyBlbXB0eVZpZXcpIHsKICAgICAgICAgbUVtcHR5VmlldyA9IGVtcHR5VmlldzsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3QW5pbWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlld0FuaW1hdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYzNmQ3MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlld0FuaW1hdG9yLmphdmEKQEAgLTAsMCArMSw3NDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBhIHtAbGluayBBZGFwdGVyVmlld30gdGhhdCB3aWxsIHBlcmZvcm0gYW5pbWF0aW9ucworICogd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBpdHMgdmlld3MuCisgKgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQWRhcHRlclZpZXdBbmltYXRvcl9pbkFuaW1hdGlvbgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQWRhcHRlclZpZXdBbmltYXRvcl9vdXRBbmltYXRpb24KKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0FkYXB0ZXJWaWV3QW5pbWF0b3JfYW5pbWF0ZUZpcnN0VmlldworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWRhcHRlclZpZXdBbmltYXRvciBleHRlbmRzIEFkYXB0ZXJWaWV3PEFkYXB0ZXI+CisgICAgICAgIGltcGxlbWVudHMgUmVtb3RlVmlld3NBZGFwdGVyLlJlbW90ZUFkYXB0ZXJDb25uZWN0aW9uQ2FsbGJhY2t7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSZW1vdGVWaWV3QW5pbWF0b3IiOworCisgICAgLyoqCisgICAgICogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGNoaWxkLCB3aGljaCBhcHBlYXJzIGFueXdoZXJlIGZyb20gdGhlIGJlZ2lubmluZworICAgICAqIHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc2V0IG9mIGNoaWxkcmVuLCBhcyBzcGVjaWZpZWQgYnkge0BsaW5rICNtQWN0aXZlT2Zmc2V0fQorICAgICAqLworICAgIGludCBtV2hpY2hDaGlsZCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgZmlyc3QgdmlldyhzKSBzaG91bGQgYmUgYW5pbWF0ZWQgaW4KKyAgICAgKi8KKyAgICBib29sZWFuIG1BbmltYXRlRmlyc3RUaW1lID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqICBSZXByZXNlbnRzIHdoZXJlIHRoZSBpbiB0aGUgY3VycmVudCB3aW5kb3cgb2YKKyAgICAgKiAgdmlld3MgdGhlIGN1cnJlbnQgPGNvZGU+bURpc3BsYXllZENoaWxkPC9jb2RlPiBzaXRzCisgICAgICovCisgICAgaW50IG1BY3RpdmVPZmZzZXQgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiB2aWV3cyB0aGF0IHRoZSB7QGxpbmsgQWRhcHRlclZpZXdBbmltYXRvcn0ga2VlcHMgYXMgY2hpbGRyZW4gYXQgYW55CisgICAgICogZ2l2ZW4gdGltZSAobm90IGNvdW50aW5nIHZpZXdzIHRoYXQgYXJlIHBlbmRpbmcgcmVtb3ZhbCwgc2VlIHtAbGluayAjbVByZXZpb3VzVmlld3N9KS4KKyAgICAgKi8KKyAgICBpbnQgbU51bUFjdGl2ZVZpZXdzID0gMTsKKworICAgIC8qKgorICAgICAqIEFycmF5IG9mIHRoZSBjaGlsZHJlbiBvZiB0aGUge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3J9LiBUaGlzIGFycmF5CisgICAgICogaXMgYWNjZXNzZWQgaW4gYSBjaXJjdWxhciBmYXNoaW9uCisgICAgICovCisgICAgVmlld1tdIG1BY3RpdmVWaWV3czsKKworICAgIC8qKgorICAgICAqIExpc3Qgb2Ygdmlld3MgcGVuZGluZyByZW1vdmFsIGZyb20gdGhlIHtAbGluayBBZGFwdGVyVmlld0FuaW1hdG9yfQorICAgICAqLworICAgIEFycmF5TGlzdDxWaWV3PiBtUHJldmlvdXNWaWV3czsKKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCwgcmVsYXRpdmUgdG8gdGhlIGFkYXB0ZXIsIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHdpbmRvdyBvZiB2aWV3cworICAgICAqLworICAgIGludCBtQ3VycmVudFdpbmRvd1N0YXJ0ID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCwgcmVsYXRpdmUgdG8gdGhlIGFkYXB0ZXIsIG9mIHRoZSBlbmQgb2YgdGhlIHdpbmRvdyBvZiB2aWV3cworICAgICAqLworICAgIGludCBtQ3VycmVudFdpbmRvd0VuZCA9IC0xOworCisgICAgLyoqCisgICAgICogVGhlIHNhbWUgYXMge0BsaW5rICNtQ3VycmVudFdpbmRvd1N0YXJ0fSwgZXhjZXB0IHdoZW4gdGhlIHdlIGhhdmUgYm91bmRlZAorICAgICAqIHtAbGluayAjbUN1cnJlbnRXaW5kb3dTdGFydH0gdG8gYmUgbm9uLW5lZ2F0aXZlCisgICAgICovCisgICAgaW50IG1DdXJyZW50V2luZG93U3RhcnRVbmJvdW5kZWQgPSAwOworCisgICAgLyoqCisgICAgICogSGFuZGxlciB0byBwb3N0IGV2ZW50cyB0byB0aGUgbWFpbiB0aHJlYWQKKyAgICAgKi8KKyAgICBIYW5kbGVyIG1NYWluUXVldWU7CisKKyAgICAvKioKKyAgICAgKiBMaXN0ZW5zIGZvciBkYXRhIGNoYW5nZXMgZnJvbSB0aGUgYWRhcHRlcgorICAgICAqLworICAgIEFkYXB0ZXJEYXRhU2V0T2JzZXJ2ZXIgbURhdGFTZXRPYnNlcnZlcjsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgQWRhcHRlcn0gZm9yIHRoaXMge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3J9CisgICAgICovCisgICAgQWRhcHRlciBtQWRhcHRlcjsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgUmVtb3RlVmlld3NBZGFwdGVyfSBmb3IgdGhpcyB7QGxpbmsgQWRhcHRlclZpZXdBbmltYXRvcn0KKyAgICAgKi8KKyAgICBSZW1vdGVWaWV3c0FkYXB0ZXIgbVJlbW90ZVZpZXdzQWRhcHRlcjsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIGFuaW1hdG9yIGlzIHNob3dpbmcgdmlld3MKKyAgICAgKi8KKyAgICBib29sZWFuIG1GaXJzdFRpbWUgPSB0cnVlOworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIGlmIHRoZSBhbmltYXRvciBzaG91bGQgd3JhcCBmcm9tIDAgdG8gdGhlIGVuZCBhbmQgdmljZSB2ZXJzYQorICAgICAqIG9yIGhhdmUgaGFyZCBib3VuZGFyaWVzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZAorICAgICAqLworICAgIGJvb2xlYW4gbVNob3VsZExvb3AgPSB0cnVlOworCisgICAgLyoqCisgICAgICogVE9ETzogQW5pbWF0aW9uIHN0dWZmIGlzIHN0aWxsIGluIGZsdXgsIHdhaXRpbmcgb24gdGhlIG5ldyBmcmFtZXdvcmsgdG8gc2V0dGxlIGEgYml0LgorICAgICAqLworICAgIEFuaW1hdGlvbiBtSW5BbmltYXRpb247CisgICAgQW5pbWF0aW9uIG1PdXRBbmltYXRpb247CisgICAgcHJpdmF0ZSAgQXJyYXlMaXN0PFZpZXc+IG1WaWV3c1RvQnJpbmdUb0Zyb250OworCisgICAgcHVibGljIEFkYXB0ZXJWaWV3QW5pbWF0b3IoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBpbml0Vmlld0FuaW1hdG9yKCk7CisgICAgfQorCisgICAgcHVibGljIEFkYXB0ZXJWaWV3QW5pbWF0b3IoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5WaWV3QW5pbWF0b3IpOworICAgICAgICBpbnQgcmVzb3VyY2UgPSBhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0FuaW1hdG9yX2luQW5pbWF0aW9uLCAwKTsKKyAgICAgICAgaWYgKHJlc291cmNlID4gMCkgeworICAgICAgICAgICAgc2V0SW5BbmltYXRpb24oY29udGV4dCwgcmVzb3VyY2UpOworICAgICAgICB9CisKKyAgICAgICAgcmVzb3VyY2UgPSBhLmdldFJlc291cmNlSWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0FuaW1hdG9yX291dEFuaW1hdGlvbiwgMCk7CisgICAgICAgIGlmIChyZXNvdXJjZSA+IDApIHsKKyAgICAgICAgICAgIHNldE91dEFuaW1hdGlvbihjb250ZXh0LCByZXNvdXJjZSk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGZsYWcgPSBhLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0FuaW1hdG9yX2FuaW1hdGVGaXJzdFZpZXcsIHRydWUpOworICAgICAgICBzZXRBbmltYXRlRmlyc3RWaWV3KGZsYWcpOworCisgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIGluaXRWaWV3QW5pbWF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoaXMge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3J9CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRWaWV3QW5pbWF0b3IoKSB7CisgICAgICAgIG1NYWluUXVldWUgPSBuZXcgSGFuZGxlcihMb29wZXIubXlMb29wZXIoKSk7CisgICAgICAgIG1BY3RpdmVWaWV3cyA9IG5ldyBWaWV3W21OdW1BY3RpdmVWaWV3c107CisgICAgICAgIG1QcmV2aW91c1ZpZXdzID0gbmV3IEFycmF5TGlzdDxWaWV3PigpOworICAgICAgICBtVmlld3NUb0JyaW5nVG9Gcm9udCA9IG5ldyBBcnJheUxpc3Q8Vmlldz4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHN1YmNsYXNzZXMgdG8gY29uZmlndXJlIHRoZSBhbmltYXRvciB0byBkaXNwbGF5IHRoZQorICAgICAqIGRlc2lyZWQgbnVtYmVyIG9mIHZpZXdzLCBhbmQgc3BlY2lmeSB0aGUgb2Zmc2V0CisgICAgICoKKyAgICAgKiBAcGFyYW0gbnVtVmlzaWJsZVZpZXdzIFRoZSBudW1iZXIgb2Ygdmlld3MgdGhlIGFuaW1hdG9yIGtlZXBzIGluIHRoZSB7QGxpbmsgVmlld0dyb3VwfQorICAgICAqIEBwYXJhbSBhY3RpdmVPZmZzZXQgVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoZXJlIHRoZSBjdXJyZW50IGluZGV4ICh7QGxpbmsgI21XaGljaENoaWxkfSkKKyAgICAgKiAgICAgICAgc2l0cyB3aXRoaW4gdGhlIHdpbmRvdy4gRm9yIGV4YW1wbGUgaWYgYWN0aXZlT2Zmc2V0IGlzIDEsIGFuZCBudW1WaXNpYmxlVmlld3MgaXMgMywKKyAgICAgKiAgICAgICAgYW5kIHtAbGluayAjc2V0RGlzcGxheWVkQ2hpbGQoaW50KX0gaXMgY2FsbGVkIHdpdGggMTAsIHRoZW4gdGhlIGVmZmVjdGl2ZSB3aW5kb3cgd2lsbAorICAgICAqICAgICAgICBiZSB0aGUgaW5kZXhlcyA5LCAxMCwgYW5kIDExLiBJbiB0aGUgc2FtZSBleGFtcGxlLCBpZiBhY3RpdmVPZmZzZXQgd2VyZSAwLCB0aGVuIHRoZQorICAgICAqICAgICAgICB3aW5kb3cgd291bGQgaW5zdGVhZCBjb250YWluIGluZGV4ZXMgMTAsIDExIGFuZCAxMi4KKyAgICAgKiBAcGFyYW0gc2hvdWxkTG9vcCBJZiB0aGUgYW5pbWF0b3IgaXMgc2hvdyB2aWV3IDAsIGFuZCBzZXRQcmV2aW91cygpIGlzIGNhbGxlZCwgZG8gd2UKKyAgICAgKiAgICAgICAgd2UgbG9vcCBiYWNrIHRvIHRoZSBlbmQsIG9yIGRvIHdlIGRvIG5vdGhpbmcKKyAgICAgKi8KKyAgICAgdm9pZCBjb25maWd1cmVWaWV3QW5pbWF0b3IoaW50IG51bVZpc2libGVWaWV3cywgaW50IGFjdGl2ZU9mZnNldCwgYm9vbGVhbiBzaG91bGRMb29wKSB7CisgICAgICAgIGlmIChhY3RpdmVPZmZzZXQgPiBudW1WaXNpYmxlVmlld3MgLSAxKSB7CisgICAgICAgICAgICAvLyBUaHJvdyBhbiBleGNlcHRpb24gaGVyZS4KKyAgICAgICAgfQorICAgICAgICBtTnVtQWN0aXZlVmlld3MgPSBudW1WaXNpYmxlVmlld3M7CisgICAgICAgIG1BY3RpdmVPZmZzZXQgPSBhY3RpdmVPZmZzZXQ7CisgICAgICAgIG1BY3RpdmVWaWV3cyA9IG5ldyBWaWV3W21OdW1BY3RpdmVWaWV3c107CisgICAgICAgIG1QcmV2aW91c1ZpZXdzLmNsZWFyKCk7CisgICAgICAgIHJlbW92ZUFsbFZpZXdzSW5MYXlvdXQoKTsKKyAgICAgICAgbUN1cnJlbnRXaW5kb3dTdGFydCA9IDA7CisgICAgICAgIG1DdXJyZW50V2luZG93RW5kID0gLTE7CisgICAgICAgIG1TaG91bGRMb29wID0gc2hvdWxkTG9vcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdG8gY3VzdG9taXplIHZpZXcgdHJhbnNpdGlvbnMgd2l0aGluCisgICAgICogdGhlIHNldCBvZiB2aXNpYmxlIHZpZXdzCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbUluZGV4IFRoZSByZWxhdGl2ZSBpbmRleCB3aXRoaW4gdGhlIHdpbmRvdyB0aGF0IHRoZSB2aWV3IHdhcyBpbiwgLTEgaWYgaXQgd2Fzbid0CisgICAgICogICAgICAgIGluIHRoZSB3aW5kb3cKKyAgICAgKiBAcGFyYW0gdG9JbmRleCBUaGUgcmVsYXRpdmUgaW5kZXggd2l0aGluIHRoZSB3aW5kb3cgdGhhdCB0aGUgdmlldyBpcyBnb2luZyB0bywgLTEgaWYgaXQgaXMKKyAgICAgKiAgICAgICAgYmVpbmcgcmVtb3ZlZAorICAgICAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgaXMgYmVpbmcgYW5pbWF0ZWQKKyAgICAgKi8KKyAgICB2b2lkIGFuaW1hdGVWaWV3Rm9yVHJhbnNpdGlvbihpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgVmlldyB2aWV3KSB7CisgICAgICAgIFByb3BlcnR5QW5pbWF0b3IgcGE7CisgICAgICAgIGlmIChmcm9tSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIHZpZXcuc2V0QWxwaGEoMC4wZik7CisgICAgICAgICAgICBwYSA9IG5ldyBQcm9wZXJ0eUFuaW1hdG9yKDQwMCwgdmlldywgImFscGhhIiwgMC4wZiwgMS4wZik7CisgICAgICAgICAgICBwYS5zdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKHRvSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIHBhID0gbmV3IFByb3BlcnR5QW5pbWF0b3IoNDAwLCB2aWV3LCAiYWxwaGEiLCAxLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIHBhLnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoaWNoIGNoaWxkIHZpZXcgd2lsbCBiZSBkaXNwbGF5ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2hpY2hDaGlsZCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHZpZXcgdG8gZGlzcGxheQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXllZENoaWxkKGludCB3aGljaENoaWxkKSB7CisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtV2hpY2hDaGlsZCA9IHdoaWNoQ2hpbGQ7CisgICAgICAgICAgICBpZiAod2hpY2hDaGlsZCA+PSBtQWRhcHRlci5nZXRDb3VudCgpKSB7CisgICAgICAgICAgICAgICAgbVdoaWNoQ2hpbGQgPSBtU2hvdWxkTG9vcCA/IDAgOiBtQWRhcHRlci5nZXRDb3VudCgpIC0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hpY2hDaGlsZCA8IDApIHsKKyAgICAgICAgICAgICAgICBtV2hpY2hDaGlsZCA9IG1TaG91bGRMb29wID8gbUFkYXB0ZXIuZ2V0Q291bnQoKSAtIDEgOiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sZWFuIGhhc0ZvY3VzID0gZ2V0Rm9jdXNlZENoaWxkKCkgIT0gbnVsbDsKKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBjbGVhciBvbGQgZm9jdXMgaWYgd2UgaGFkIGl0CisgICAgICAgICAgICBzaG93T25seShtV2hpY2hDaGlsZCk7CisgICAgICAgICAgICBpZiAoaGFzRm9jdXMpIHsKKyAgICAgICAgICAgICAgICAvLyBUcnkgdG8gcmV0YWtlIGZvY3VzIGlmIHdlIGhhZCBpdAorICAgICAgICAgICAgICAgIHJlcXVlc3RGb2N1cyhGT0NVU19GT1JXQVJEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBkZWZhdWx0IGluQW5pbWF0aW9uLiBUbyBiZSBvdmVycmlkZW4gYnkgc3ViY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBBbmltYXRpb24gZ2V0RGVmYXVsdEluQW5pbWF0aW9uKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVmYXVsdCBvdXRBbmltYXRpb24uIFRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBBbmltYXRpb24gZ2V0RGVmYXVsdE91dEFuaW1hdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLiBUaGlzIG1ldGhvZCBhcHBsaWVzIGEgdmlldyAvIGluZGV4IHNwZWNpZmljCisgICAgICogdHJhbnNmb3JtIHRvIHRoZSBjaGlsZCB2aWV3LgorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkCisgICAgICogQHBhcmFtIHJlbGF0aXZlSW5kZXgKKyAgICAgKi8KKyAgICB2b2lkIGFwcGx5VHJhbnNmb3JtRm9yQ2hpbGRBdEluZGV4KFZpZXcgY2hpbGQsIGludCByZWxhdGl2ZUluZGV4KSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgY2hpbGQgdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldERpc3BsYXllZENoaWxkKCkgeworICAgICAgICByZXR1cm4gbVdoaWNoQ2hpbGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFudWFsbHkgc2hvd3MgdGhlIG5leHQgY2hpbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hvd05leHQoKSB7CisgICAgICAgIHNldERpc3BsYXllZENoaWxkKG1XaGljaENoaWxkICsgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFudWFsbHkgc2hvd3MgdGhlIHByZXZpb3VzIGNoaWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3dQcmV2aW91cygpIHsKKyAgICAgICAgc2V0RGlzcGxheWVkQ2hpbGQobVdoaWNoQ2hpbGQgLSAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93cyBvbmx5IHRoZSBzcGVjaWZpZWQgY2hpbGQuIFRoZSBvdGhlciBkaXNwbGF5cyBWaWV3cyBleGl0IHRoZSBzY3JlZW4sCisgICAgICogb3B0aW9uYWxseSB3aXRoIHRoZSB3aXRoIHRoZSB7QGxpbmsgI2dldE91dEFuaW1hdGlvbigpIG91dCBhbmltYXRpb259IGFuZAorICAgICAqIHRoZSBzcGVjaWZpZWQgY2hpbGQgZW50ZXJzIHRoZSBzY3JlZW4sIG9wdGlvbmFsbHkgd2l0aCB0aGUKKyAgICAgKiB7QGxpbmsgI2dldEluQW5pbWF0aW9uKCkgaW4gYW5pbWF0aW9ufS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZEluZGV4IFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgc2hvd24uCisgICAgICogQHBhcmFtIGFuaW1hdGUgV2hldGhlciBvciBub3QgdG8gdXNlIHRoZSBpbiBhbmQgb3V0IGFuaW1hdGlvbnMsIGRlZmF1bHRzCisgICAgICogICAgICAgICAgICB0byB0cnVlLgorICAgICAqLworICAgIHZvaWQgc2hvd09ubHkoaW50IGNoaWxkSW5kZXgsIGJvb2xlYW4gYW5pbWF0ZSkgeworICAgICAgICBzaG93T25seShjaGlsZEluZGV4LCBhbmltYXRlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgbW9kdWxvKGludCBwb3MsIGludCBzaXplKSB7CisgICAgICAgIHJldHVybiAoc2l6ZSArIChwb3MgJSBzaXplKSkgJSBzaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmlldyBhdCB0aGlzIGluZGV4IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdpbmRvdydzIHN0YXJ0CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVsYXRpdmVJbmRleCBQb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3aW5kb3cncyBzdGFydAorICAgICAqIEByZXR1cm4gVmlldyBhdCB0aGlzIGluZGV4LCBudWxsIGlmIHRoZSBpbmRleCBpcyBvdXRzaWRlIHRoZSBib3VuZHMKKyAgICAgKi8KKyAgICBWaWV3IGdldFZpZXdBdFJlbGF0aXZlSW5kZXgoaW50IHJlbGF0aXZlSW5kZXgpIHsKKyAgICAgICAgaWYgKHJlbGF0aXZlSW5kZXggPj0gMCAmJiByZWxhdGl2ZUluZGV4IDw9IG1OdW1BY3RpdmVWaWV3cyAtIDEpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IG1DdXJyZW50V2luZG93U3RhcnRVbmJvdW5kZWQgKyByZWxhdGl2ZUluZGV4OworICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVWaWV3c1ttb2R1bG8oaW5kZXgsIG1OdW1BY3RpdmVWaWV3cyldOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIExheW91dFBhcmFtcyBjcmVhdGVPclJldXNlTGF5b3V0UGFyYW1zKFZpZXcgdikgeworICAgICAgICBmaW5hbCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGN1cnJlbnRMcCA9IHYuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgIGlmIChjdXJyZW50THAgaW5zdGFuY2VvZiBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zKSB7CisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSAoTGF5b3V0UGFyYW1zKSBjdXJyZW50THA7CisgICAgICAgICAgICByZXR1cm4gbHA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zKDAsIDApOworICAgIH0KKworICAgIHZvaWQgc2hvd09ubHkoaW50IGNoaWxkSW5kZXgsIGJvb2xlYW4gYW5pbWF0ZSwgYm9vbGVhbiBvbkxheW91dCkgeworICAgICAgICBpZiAobUFkYXB0ZXIgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVByZXZpb3VzVmlld3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFZpZXcgdmlld1RvUmVtb3ZlID0gbVByZXZpb3VzVmlld3MuZ2V0KGkpOworICAgICAgICAgICAgdmlld1RvUmVtb3ZlLmNsZWFyQW5pbWF0aW9uKCk7CisgICAgICAgICAgICBpZiAodmlld1RvUmVtb3ZlIGluc3RhbmNlb2YgVmlld0dyb3VwKSB7CisgICAgICAgICAgICAgICAgVmlld0dyb3VwIHZnID0gKFZpZXdHcm91cCkgdmlld1RvUmVtb3ZlOworICAgICAgICAgICAgICAgIHZnLnJlbW92ZUFsbFZpZXdzSW5MYXlvdXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFwcGx5VHJhbnNmb3JtRm9yQ2hpbGRBdEluZGV4IGhlcmUganVzdCBhbGxvd3MgZm9yIGFueSBjbGVhbnVwCisgICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggdGhpcyB2aWV3IHRoYXQgbWF5IG5lZWQgdG8gYmUgZG9uZSBieSBhIHN1YmNsYXNzCisgICAgICAgICAgICBhcHBseVRyYW5zZm9ybUZvckNoaWxkQXRJbmRleCh2aWV3VG9SZW1vdmUsIC0xKTsKKworICAgICAgICAgICAgcmVtb3ZlVmlld0luTGF5b3V0KHZpZXdUb1JlbW92ZSk7CisgICAgICAgIH0KKyAgICAgICAgbVByZXZpb3VzVmlld3MuY2xlYXIoKTsKKyAgICAgICAgaW50IG5ld1dpbmRvd1N0YXJ0VW5ib3VuZGVkID0gY2hpbGRJbmRleCAtIG1BY3RpdmVPZmZzZXQ7CisgICAgICAgIGludCBuZXdXaW5kb3dFbmRVbmJvdW5kZWQgPSBuZXdXaW5kb3dTdGFydFVuYm91bmRlZCArIG1OdW1BY3RpdmVWaWV3cyAtIDE7CisgICAgICAgIGludCBuZXdXaW5kb3dTdGFydCA9IE1hdGgubWF4KDAsIG5ld1dpbmRvd1N0YXJ0VW5ib3VuZGVkKTsKKyAgICAgICAgaW50IG5ld1dpbmRvd0VuZCA9IE1hdGgubWluKG1BZGFwdGVyLmdldENvdW50KCksIG5ld1dpbmRvd0VuZFVuYm91bmRlZCk7CisKKyAgICAgICAgLy8gVGhpcyBzZWN0aW9uIGNsZWFycyBvdXQgYW55IGl0ZW1zIHRoYXQgYXJlIGluIG91ciBtQWN0aXZlVmlld3MgbGlzdAorICAgICAgICAvLyBidXQgYXJlIG91dHNpZGUgdGhlIGVmZmVjdGl2ZSBib3VuZHMgb2Ygb3VyIHdpbmRvdyAodGhpcyBpcyBiZWNvbWVzIGFuIGlzc3VlCisgICAgICAgIC8vIGF0IHRoZSBleHRyZW1pdGllcyBvZiB0aGUgbGlzdCwgZWcuIHdoZXJlIG5ld1dpbmRvd1N0YXJ0VW5ib3VuZGVkIDwgMCBvcgorICAgICAgICAvLyBuZXdXaW5kb3dFbmRVbmJvdW5kZWQgPiBtQWRhcHRlci5nZXRDb3VudCgpIC0gMQorICAgICAgICBmb3IgKGludCBpID0gbmV3V2luZG93U3RhcnRVbmJvdW5kZWQ7IGkgPCBuZXdXaW5kb3dFbmRVbmJvdW5kZWQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgPCBuZXdXaW5kb3dTdGFydCB8fCBpID4gbmV3V2luZG93RW5kKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbW9kdWxvKGksIG1OdW1BY3RpdmVWaWV3cyk7CisgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVWaWV3c1tpbmRleF0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBWaWV3IHByZXZpb3VzVmlldyA9IG1BY3RpdmVWaWV3c1tpbmRleF07CisgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1ZpZXdzLmFkZChwcmV2aW91c1ZpZXcpOworICAgICAgICAgICAgICAgICAgICBpbnQgcHJldmlvdXNWaWV3UmVsYXRpdmVJbmRleCA9IG1vZHVsbyhpbmRleCAtIG1DdXJyZW50V2luZG93U3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bUFjdGl2ZVZpZXdzKTsKKyAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZVZpZXdGb3JUcmFuc2l0aW9uKHByZXZpb3VzVmlld1JlbGF0aXZlSW5kZXgsIC0xLCBwcmV2aW91c1ZpZXcpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVmlld3NbaW5kZXhdID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgd2luZG93IGhhcyBjaGFuZ2VkCisgICAgICAgIGlmICghIChuZXdXaW5kb3dTdGFydCA9PSBtQ3VycmVudFdpbmRvd1N0YXJ0ICYmIG5ld1dpbmRvd0VuZCA9PSBtQ3VycmVudFdpbmRvd0VuZCkpIHsKKyAgICAgICAgICAgIC8vIFJ1biB0aHJvdWdoIHRoZSBpbmRpY2VzIGluIHRoZSBuZXcgcmFuZ2UKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBuZXdXaW5kb3dTdGFydDsgaSA8PSBuZXdXaW5kb3dFbmQ7IGkrKykgeworCisgICAgICAgICAgICAgICAgaW50IG9sZFJlbGF0aXZlSW5kZXggPSBpIC0gbUN1cnJlbnRXaW5kb3dTdGFydFVuYm91bmRlZDsKKyAgICAgICAgICAgICAgICBpbnQgbmV3UmVsYXRpdmVJbmRleCA9IGkgLSBuZXdXaW5kb3dTdGFydFVuYm91bmRlZDsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBtb2R1bG8oaSwgbU51bUFjdGl2ZVZpZXdzKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXRlbSBpcyBpbiB0aGUgY3VycmVudCB3aW5kb3csIGdyZWF0LCB3ZSBqdXN0IG5lZWQgdG8gYXBwbHkKKyAgICAgICAgICAgICAgICAvLyB0aGUgdHJhbnNmb3JtIGZvciBpdCdzIG5ldyByZWxhdGl2ZSBwb3NpdGlvbiBpbiB0aGUgd2luZG93LCBhbmQgYW5pbWF0ZQorICAgICAgICAgICAgICAgIC8vIGJldHdlZW4gaXQncyBjdXJyZW50IGFuZCBuZXcgcmVsYXRpdmUgcG9zaXRpb25zCisgICAgICAgICAgICAgICAgaWYgKGkgPj0gbUN1cnJlbnRXaW5kb3dTdGFydCAmJiBpIDw9IG1DdXJyZW50V2luZG93RW5kKSB7CisgICAgICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IG1BY3RpdmVWaWV3c1tpbmRleF07CisgICAgICAgICAgICAgICAgICAgIGFwcGx5VHJhbnNmb3JtRm9yQ2hpbGRBdEluZGV4KHZpZXcsIG5ld1JlbGF0aXZlSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBhbmltYXRlVmlld0ZvclRyYW5zaXRpb24ob2xkUmVsYXRpdmVJbmRleCwgbmV3UmVsYXRpdmVJbmRleCwgdmlldyk7CisKKyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgdGhpcyB2aWV3IGlzIG5ldywgc28gZmlyc3Qgd2UgaGF2ZSB0byBkaXNwbGFjZSB0aGUgdmlldyB0aGF0J3MKKyAgICAgICAgICAgICAgICAvLyB0YWtpbmcgdGhlIG5ldyB2aWV3J3MgcGxhY2Ugd2l0aGluIG91ciBjYWNoZSAoYSBjaXJjdWxhciBhcnJheSkKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZVZpZXdzW2luZGV4XSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IHByZXZpb3VzVmlldyA9IG1BY3RpdmVWaWV3c1tpbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNWaWV3cy5hZGQocHJldmlvdXNWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmV2aW91c1ZpZXdSZWxhdGl2ZUluZGV4ID0gbW9kdWxvKGluZGV4IC0gbUN1cnJlbnRXaW5kb3dTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bUFjdGl2ZVZpZXdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVWaWV3Rm9yVHJhbnNpdGlvbihwcmV2aW91c1ZpZXdSZWxhdGl2ZUluZGV4LCAtMSwgcHJldmlvdXNWaWV3KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50V2luZG93U3RhcnQgPiBuZXdXaW5kb3dTdGFydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3c1RvQnJpbmdUb0Zyb250LmFkZChwcmV2aW91c1ZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UndmUgY2xlYXJlZCBhIHNwb3QgZm9yIHRoZSBuZXcgdmlldy4gR2V0IGl0IGZyb20gdGhlIGFkYXB0ZXIsIGFkZCBpdAorICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYXBwbHkgYW55IHRyYW5zZm9ybSAvIGFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICBWaWV3IG5ld1ZpZXcgPSBtQWRhcHRlci5nZXRWaWV3KGksIG51bGwsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSB3cmFwIHRoZSBuZXcgdmlldyBpbiBhIEZyYW1lTGF5b3V0IHNvIGFzIHRvIHJlc3BlY3QgdGhlIGNvbnRyYWN0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSBhZGFwdGVyLCB0aGF0IGlzLCB0aGF0IHdlIGRvbid0IG1vZGlmeSB0aGlzIHZpZXcgZGlyZWN0bHkKKyAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0IGZsID0gbmV3IEZyYW1lTGF5b3V0KG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsLmFkZFZpZXcobmV3Vmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVmlld3NbaW5kZXhdID0gZmw7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRWaWV3SW5MYXlvdXQoZmwsIC0xLCBjcmVhdGVPclJldXNlTGF5b3V0UGFyYW1zKGZsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVRyYW5zZm9ybUZvckNoaWxkQXRJbmRleChmbCwgbmV3UmVsYXRpdmVJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlVmlld0ZvclRyYW5zaXRpb24oLTEsIG5ld1JlbGF0aXZlSW5kZXgsIGZsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQWN0aXZlVmlld3NbaW5kZXhdLmJyaW5nVG9Gcm9udCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1WaWV3c1RvQnJpbmdUb0Zyb250LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgVmlldyB2ID0gbVZpZXdzVG9CcmluZ1RvRnJvbnQuZ2V0KGkpOworICAgICAgICAgICAgICAgIHYuYnJpbmdUb0Zyb250KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVmlld3NUb0JyaW5nVG9Gcm9udC5jbGVhcigpOworCisgICAgICAgICAgICBtQ3VycmVudFdpbmRvd1N0YXJ0ID0gbmV3V2luZG93U3RhcnQ7CisgICAgICAgICAgICBtQ3VycmVudFdpbmRvd0VuZCA9IG5ld1dpbmRvd0VuZDsKKyAgICAgICAgICAgIG1DdXJyZW50V2luZG93U3RhcnRVbmJvdW5kZWQgPSBuZXdXaW5kb3dTdGFydFVuYm91bmRlZDsKKyAgICAgICAgfQorCisgICAgICAgIG1GaXJzdFRpbWUgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFvbkxheW91dCkgeworICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSWYgdGhlIEFkYXB0ZXIgdHJpZXMgdG8gbGF5b3V0IHRoZSBjdXJyZW50IHZpZXcgd2hlbiB3ZSBnZXQgaXQgdXNpbmcgZ2V0VmlldworICAgICAgICAgICAgLy8gYWJvdmUgdGhlIGxheW91dCB3aWxsIGVuZCB1cCBiZWluZyBpZ25vcmVkIHNpbmNlIHdlIGFyZSBjdXJyZW50bHkgbGF5aW5nIG91dCwgc28KKyAgICAgICAgICAgIC8vIHdlIHBvc3QgYSBkZWxheWVkIHJlcXVlc3RMYXlvdXQgYW5kIGludmFsaWRhdGUKKyAgICAgICAgICAgIG1NYWluUXVldWUucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgeworICAgICAgICBib29sZWFuIGRhdGFDaGFuZ2VkID0gbURhdGFDaGFuZ2VkOworICAgICAgICBpZiAoZGF0YUNoYW5nZWQpIHsKKyAgICAgICAgICAgIGhhbmRsZURhdGFDaGFuZ2VkKCk7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSBkYXRhIGNoYW5nZXMsIG1XaGljaENoaWxkIG1pZ2h0IGJlIG91dCBvZiB0aGUgYm91bmRzIG9mIHRoZSBhZGFwdGVyCisgICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2UsIHdlIHJlc2V0IG1XaGljaENoaWxkIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgICAgICAgIGlmIChtV2hpY2hDaGlsZCA+PSBtQWRhcHRlci5nZXRDb3VudCgpKQorICAgICAgICAgICAgICAgIG1XaGljaENoaWxkID0gMDsKKworICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQsIHRydWUsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKworICAgICAgICAgICAgaW50IGNoaWxkUmlnaHQgPSBtUGFkZGluZ0xlZnQgKyBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgICAgICBpbnQgY2hpbGRCb3R0b20gPSBtUGFkZGluZ1RvcCArIGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCk7CisKKyAgICAgICAgICAgIGNoaWxkLmxheW91dChtUGFkZGluZ0xlZnQsIG1QYWRkaW5nVG9wLAorICAgICAgICAgICAgICAgICAgICBjaGlsZFJpZ2h0LCBjaGlsZEJvdHRvbSk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFDaGFuZ2VkID0gZmFsc2U7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFNhdmVkU3RhdGUgZXh0ZW5kcyBCYXNlU2F2ZWRTdGF0ZSB7CisgICAgICAgIGludCB3aGljaENoaWxkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RvciBjYWxsZWQgZnJvbSB7QGxpbmsgQWRhcHRlclZpZXdBbmltYXRvciNvblNhdmVJbnN0YW5jZVN0YXRlKCl9CisgICAgICAgICAqLworICAgICAgICBTYXZlZFN0YXRlKFBhcmNlbGFibGUgc3VwZXJTdGF0ZSwgaW50IHdoaWNoQ2hpbGQpIHsKKyAgICAgICAgICAgIHN1cGVyKHN1cGVyU3RhdGUpOworICAgICAgICAgICAgdGhpcy53aGljaENoaWxkID0gd2hpY2hDaGlsZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RvciBjYWxsZWQgZnJvbSB7QGxpbmsgI0NSRUFUT1J9CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFNhdmVkU3RhdGUoUGFyY2VsIGluKSB7CisgICAgICAgICAgICBzdXBlcihpbik7CisgICAgICAgICAgICB3aGljaENoaWxkID0gaW4ucmVhZEludCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIG91dCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBzdXBlci53cml0ZVRvUGFyY2VsKG91dCwgZmxhZ3MpOworICAgICAgICAgICAgb3V0LndyaXRlSW50KHdoaWNoQ2hpbGQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkFkYXB0ZXJWaWV3QW5pbWF0b3IuU2F2ZWRTdGF0ZXsgd2hpY2hDaGlsZCA9ICIgKyB3aGljaENoaWxkICsgIiB9IjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFNhdmVkU3RhdGU+IENSRUFUT1IKKyAgICAgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4oKSB7CisgICAgICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZShpbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhdmVkU3RhdGVbc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBhcmNlbGFibGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpIHsKKyAgICAgICAgUGFyY2VsYWJsZSBzdXBlclN0YXRlID0gc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZSgpOworICAgICAgICByZXR1cm4gbmV3IFNhdmVkU3RhdGUoc3VwZXJTdGF0ZSwgbVdoaWNoQ2hpbGQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoUGFyY2VsYWJsZSBzdGF0ZSkgeworICAgICAgICBTYXZlZFN0YXRlIHNzID0gKFNhdmVkU3RhdGUpIHN0YXRlOworICAgICAgICBzdXBlci5vblJlc3RvcmVJbnN0YW5jZVN0YXRlKHNzLmdldFN1cGVyU3RhdGUoKSk7CisKKyAgICAgICAgLy8gSGVyZSB3ZSBzZXQgbVdoaWNoQ2hpbGQgaW4gYWRkaXRpb24gdG8gc2V0RGlzcGxheWVkQ2hpbGQKKyAgICAgICAgLy8gV2UgZG8gdGhlIGZvcm1lciBpbiBjYXNlIG1BZGFwdGVyIGlzIG51bGwsIGFuZCBoZW5jZSBzZXREaXNwbGF5ZWRDaGlsZCB3b24ndAorICAgICAgICAvLyBzZXQgbVdoaWNoQ2hpbGQKKyAgICAgICAgbVdoaWNoQ2hpbGQgPSBzcy53aGljaENoaWxkOworICAgICAgICBzZXREaXNwbGF5ZWRDaGlsZChtV2hpY2hDaGlsZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworCisgICAgICAgIGludCB3aWR0aFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaW50IGhlaWdodFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKworICAgICAgICAgICAgZmluYWwgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgY2hpbGQuZ2V0TGF5b3V0UGFyYW1zKCk7CisKKyAgICAgICAgICAgIGxwLndpZHRoID0gd2lkdGhTcGVjU2l6ZSAtIG1QYWRkaW5nTGVmdCAtIG1QYWRkaW5nUmlnaHQ7CisgICAgICAgICAgICBscC5oZWlnaHQgPSBoZWlnaHRTcGVjU2l6ZSAtIG1QYWRkaW5nVG9wIC0gbVBhZGRpbmdCb3R0b207CisKKyAgICAgICAgICAgIGludCBjaGlsZFdpZHRoTWVhc3VyZVNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMobHAud2lkdGgsCisgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLkVYQUNUTFkpOworICAgICAgICAgICAgaW50IGNoaWxkaGVpZ2h0TWVhc3VyZVNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMobHAuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5FWEFDVExZKTsKKworICAgICAgICAgICAgY2hpbGQubWVhc3VyZShjaGlsZFdpZHRoTWVhc3VyZVNwZWMsIGNoaWxkaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICB9CisgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHdpZHRoU3BlY1NpemUsIGhlaWdodFNwZWNTaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93cyBvbmx5IHRoZSBzcGVjaWZpZWQgY2hpbGQuIFRoZSBvdGhlciBkaXNwbGF5cyBWaWV3cyBleGl0IHRoZSBzY3JlZW4KKyAgICAgKiB3aXRoIHRoZSB7QGxpbmsgI2dldE91dEFuaW1hdGlvbigpIG91dCBhbmltYXRpb259IGFuZCB0aGUgc3BlY2lmaWVkIGNoaWxkCisgICAgICogZW50ZXJzIHRoZSBzY3JlZW4gd2l0aCB0aGUge0BsaW5rICNnZXRJbkFuaW1hdGlvbigpIGluIGFuaW1hdGlvbn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGRJbmRleCBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIHNob3duLgorICAgICAqLworICAgIHZvaWQgc2hvd09ubHkoaW50IGNoaWxkSW5kZXgpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBhbmltYXRlID0gKCFtRmlyc3RUaW1lIHx8IG1BbmltYXRlRmlyc3RUaW1lKTsKKyAgICAgICAgc2hvd09ubHkoY2hpbGRJbmRleCwgYW5pbWF0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgVmlldyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGNoaWxkLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgVmlldyBjdXJyZW50bHkgZGlzcGxheWVkLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0RGlzcGxheWVkQ2hpbGQoKQorICAgICAqLworICAgIHB1YmxpYyBWaWV3IGdldEN1cnJlbnRWaWV3KCkgeworICAgICAgICByZXR1cm4gZ2V0Vmlld0F0UmVsYXRpdmVJbmRleChtQWN0aXZlT2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFuaW1hdGlvbiB1c2VkIHRvIGFuaW1hdGUgYSBWaWV3IHRoYXQgZW50ZXJzIHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFuIEFuaW1hdGlvbiBvciBudWxsIGlmIG5vbmUgaXMgc2V0LgorICAgICAqCisgICAgICogQHNlZSAjc2V0SW5BbmltYXRpb24oYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24pCisgICAgICogQHNlZSAjc2V0SW5BbmltYXRpb24oYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQW5pbWF0aW9uIGdldEluQW5pbWF0aW9uKCkgeworICAgICAgICByZXR1cm4gbUluQW5pbWF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgYW5pbWF0aW9uIHVzZWQgdG8gYW5pbWF0ZSBhIFZpZXcgdGhhdCBlbnRlcnMgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbkFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHN0YXJ0ZWQgd2hlbiBhIFZpZXcgZW50ZXJzIHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRJbkFuaW1hdGlvbigpCisgICAgICogQHNlZSAjc2V0SW5BbmltYXRpb24oYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbkFuaW1hdGlvbihBbmltYXRpb24gaW5BbmltYXRpb24pIHsKKyAgICAgICAgbUluQW5pbWF0aW9uID0gaW5BbmltYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBhbmltYXRpb24gdXNlZCB0byBhbmltYXRlIGEgVmlldyB0aGF0IGV4aXRzIHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFuIEFuaW1hdGlvbiBvciBudWxsIGlmIG5vbmUgaXMgc2V0LgorICAgICAqCisgICAgICogQHNlZSAjc2V0T3V0QW5pbWF0aW9uKGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uKQorICAgICAqIEBzZWUgI3NldE91dEFuaW1hdGlvbihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50KQorICAgICAqLworICAgIHB1YmxpYyBBbmltYXRpb24gZ2V0T3V0QW5pbWF0aW9uKCkgeworICAgICAgICByZXR1cm4gbU91dEFuaW1hdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIGFuaW1hdGlvbiB1c2VkIHRvIGFuaW1hdGUgYSBWaWV3IHRoYXQgZXhpdCB0aGUgc2NyZWVuLgorICAgICAqCisgICAgICogQHBhcmFtIG91dEFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHN0YXJ0ZWQgd2hlbiBhIFZpZXcgZXhpdCB0aGUgc2NyZWVuLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0T3V0QW5pbWF0aW9uKCkKKyAgICAgKiBAc2VlICNzZXRPdXRBbmltYXRpb24oYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRBbmltYXRpb24oQW5pbWF0aW9uIG91dEFuaW1hdGlvbikgeworICAgICAgICBtT3V0QW5pbWF0aW9uID0gb3V0QW5pbWF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgYW5pbWF0aW9uIHVzZWQgdG8gYW5pbWF0ZSBhIFZpZXcgdGhhdCBlbnRlcnMgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50LgorICAgICAqIEBwYXJhbSByZXNvdXJjZUlEIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0SW5BbmltYXRpb24oKQorICAgICAqIEBzZWUgI3NldEluQW5pbWF0aW9uKGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluQW5pbWF0aW9uKENvbnRleHQgY29udGV4dCwgaW50IHJlc291cmNlSUQpIHsKKyAgICAgICAgc2V0SW5BbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbihjb250ZXh0LCByZXNvdXJjZUlEKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBhbmltYXRpb24gdXNlZCB0byBhbmltYXRlIGEgVmlldyB0aGF0IGV4aXQgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50LgorICAgICAqIEBwYXJhbSByZXNvdXJjZUlEIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0T3V0QW5pbWF0aW9uKCkKKyAgICAgKiBAc2VlICNzZXRPdXRBbmltYXRpb24oYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24pCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0QW5pbWF0aW9uKENvbnRleHQgY29udGV4dCwgaW50IHJlc291cmNlSUQpIHsKKyAgICAgICAgc2V0T3V0QW5pbWF0aW9uKEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oY29udGV4dCwgcmVzb3VyY2VJRCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXJyZW50IFZpZXcgc2hvdWxkIGJlIGFuaW1hdGVkIHRoZSBmaXJzdCB0aW1lCisgICAgICogdGhlIFZpZXdBbmltYXRpb24gaXMgZGlzcGxheWVkLgorICAgICAqCisgICAgICogQHBhcmFtIGFuaW1hdGUgVHJ1ZSB0byBhbmltYXRlIHRoZSBjdXJyZW50IFZpZXcgdGhlIGZpcnN0IHRpbWUgaXQgaXMgZGlzcGxheWVkLAorICAgICAqICAgICAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbmltYXRlRmlyc3RWaWV3KGJvb2xlYW4gYW5pbWF0ZSkgeworICAgICAgICBtQW5pbWF0ZUZpcnN0VGltZSA9IGFuaW1hdGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRCYXNlbGluZSgpIHsKKyAgICAgICAgcmV0dXJuIChnZXRDdXJyZW50VmlldygpICE9IG51bGwpID8gZ2V0Q3VycmVudFZpZXcoKS5nZXRCYXNlbGluZSgpIDogc3VwZXIuZ2V0QmFzZWxpbmUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWRhcHRlciBnZXRBZGFwdGVyKCkgeworICAgICAgICByZXR1cm4gbUFkYXB0ZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbURhdGFTZXRPYnNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWRhcHRlci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOworICAgICAgICB9CisKKyAgICAgICAgbUFkYXB0ZXIgPSBhZGFwdGVyOworICAgICAgICBjaGVja0ZvY3VzKCk7CisKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EYXRhU2V0T2JzZXJ2ZXIgPSBuZXcgQWRhcHRlckRhdGFTZXRPYnNlcnZlcigpOworICAgICAgICAgICAgbUFkYXB0ZXIucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CisgICAgICAgIH0KKyAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhpcyBBZGFwdGVyVmlld0FuaW1hdG9yIHRvIHVzZSBhIHJlbW90ZSB2aWV3cyBhZGFwdGVyIHdoaWNoIGNvbm5lY3RzIHRvIGEKKyAgICAgKiBSZW1vdGVWaWV3c1NlcnZpY2UgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGludGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlbnQgdGhlIGludGVudCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UgZm9yIHRoZSBhZGFwdGVyIHRvCisgICAgICogICAgICAgIGNvbm5lY3QgdG8uCisgICAgICovCisgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlVmlld3NBZGFwdGVyKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgbVJlbW90ZVZpZXdzQWRhcHRlciA9IG5ldyBSZW1vdGVWaWV3c0FkYXB0ZXIoZ2V0Q29udGV4dCgpLCBpbnRlbnQsIHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgc2V0RGlzcGxheWVkQ2hpbGQocG9zaXRpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3IGdldFNlbGVjdGVkVmlldygpIHsKKyAgICAgICAgcmV0dXJuIGdldFZpZXdBdFJlbGF0aXZlSW5kZXgobUFjdGl2ZU9mZnNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJhY2sgd2hlbiB0aGUgYWRhcHRlciBjb25uZWN0cyB0byB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCgpIHsKKyAgICAgICAgaWYgKG1SZW1vdGVWaWV3c0FkYXB0ZXIgIT0gbUFkYXB0ZXIpIHsKKyAgICAgICAgICAgIHNldEFkYXB0ZXIobVJlbW90ZVZpZXdzQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmFjayB3aGVuIHRoZSBhZGFwdGVyIGRpc2Nvbm5lY3RzIGZyb20gdGhlIFJlbW90ZVZpZXdzU2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlbW90ZUFkYXB0ZXJEaXNjb25uZWN0ZWQoKSB7CisgICAgICAgIGlmIChtUmVtb3RlVmlld3NBZGFwdGVyICE9IG1BZGFwdGVyKSB7CisgICAgICAgICAgICBtUmVtb3RlVmlld3NBZGFwdGVyID0gbnVsbDsKKyAgICAgICAgICAgIHNldEFkYXB0ZXIobVJlbW90ZVZpZXdzQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXdGbGlwcGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXdGbGlwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk1NjgzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlld0ZsaXBwZXIuamF2YQpAQCAtMCwwICsxLDI3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFscGhhQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzLlJlbW90ZVZpZXc7CisKKy8qKgorICogU2ltcGxlIHtAbGluayBWaWV3QW5pbWF0b3J9IHRoYXQgd2lsbCBhbmltYXRlIGJldHdlZW4gdHdvIG9yIG1vcmUgdmlld3MKKyAqIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIGl0LiAgT25seSBvbmUgY2hpbGQgaXMgc2hvd24gYXQgYSB0aW1lLiAgSWYKKyAqIHJlcXVlc3RlZCwgY2FuIGF1dG9tYXRpY2FsbHkgZmxpcCBiZXR3ZWVuIGVhY2ggY2hpbGQgYXQgYSByZWd1bGFyIGludGVydmFsLgorICoKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0FkYXB0ZXJWaWV3RmxpcHBlcl9mbGlwSW50ZXJ2YWwKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0FkYXB0ZXJWaWV3RmxpcHBlcl9hdXRvU3RhcnQKKyAqLworQFJlbW90ZVZpZXcKK3B1YmxpYyBjbGFzcyBBZGFwdGVyVmlld0ZsaXBwZXIgZXh0ZW5kcyBBZGFwdGVyVmlld0FuaW1hdG9yIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZXdGbGlwcGVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPR0QgPSBmYWxzZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0lOVEVSVkFMID0gMTAwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQU5JTUFUSU9OX0RVUkFUSU9OID0gMjAwOworCisgICAgcHJpdmF0ZSBpbnQgbUZsaXBJbnRlcnZhbCA9IERFRkFVTFRfSU5URVJWQUw7CisgICAgcHJpdmF0ZSBpbnQgbUFuaW1hdGlvbkR1cmF0aW9uID0gREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT047CisgICAgcHJpdmF0ZSBib29sZWFuIG1BdXRvU3RhcnQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtUnVubmluZyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhcnRlZCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtVmlzaWJsZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtVXNlclByZXNlbnQgPSB0cnVlOworCisgICAgcHVibGljIEFkYXB0ZXJWaWV3RmxpcHBlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIGluaXREZWZhdWx0QW5pbWF0aW9ucygpOworICAgIH0KKworICAgIHB1YmxpYyBBZGFwdGVyVmlld0ZsaXBwZXIoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5WaWV3RmxpcHBlcik7CisgICAgICAgIG1GbGlwSW50ZXJ2YWwgPSBhLmdldEludCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5WaWV3RmxpcHBlcl9mbGlwSW50ZXJ2YWwsIERFRkFVTFRfSU5URVJWQUwpOworICAgICAgICBtQXV0b1N0YXJ0ID0gYS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdGbGlwcGVyX2F1dG9TdGFydCwgZmFsc2UpOworICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICAgICAgaW5pdERlZmF1bHRBbmltYXRpb25zKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXREZWZhdWx0QW5pbWF0aW9ucygpIHsKKyAgICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IGFuaW1hdGlvbnMgdG8gYmUgZmFkZSBpbi9vdXQKKyAgICAgICAgaWYgKG1JbkFuaW1hdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBtSW5BbmltYXRpb24gPSBuZXcgQWxwaGFBbmltYXRpb24oMC4wZiwgMS4wZik7CisgICAgICAgICAgICBtSW5BbmltYXRpb24uc2V0RHVyYXRpb24obUFuaW1hdGlvbkR1cmF0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobU91dEFuaW1hdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBtT3V0QW5pbWF0aW9uID0gbmV3IEFscGhhQW5pbWF0aW9uKDEuMGYsIDAuMGYpOworICAgICAgICAgICAgbU91dEFuaW1hdGlvbi5zZXREdXJhdGlvbihtQW5pbWF0aW9uRHVyYXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBCcm9hZGNhc3RSZWNlaXZlciBtUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOworICAgICAgICAgICAgaWYgKEludGVudC5BQ1RJT05fU0NSRUVOX09GRi5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIG1Vc2VyUHJlc2VudCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoSW50ZW50LkFDVElPTl9VU0VSX1BSRVNFTlQuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICBtVXNlclByZXNlbnQgPSB0cnVlOworICAgICAgICAgICAgICAgIHVwZGF0ZVJ1bm5pbmcoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKKyAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7CisKKyAgICAgICAgLy8gTGlzdGVuIGZvciBicm9hZGNhc3RzIHJlbGF0ZWQgdG8gdXNlci1wcmVzZW5jZQorICAgICAgICBmaW5hbCBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fU0NSRUVOX09GRik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9VU0VSX1BSRVNFTlQpOworICAgICAgICBnZXRDb250ZXh0KCkucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGZpbHRlcik7CisKKyAgICAgICAgaWYgKG1BdXRvU3RhcnQpIHsKKyAgICAgICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgc3RhcnQgd2hlbiByZXF1ZXN0ZWQKKyAgICAgICAgICAgIHN0YXJ0RmxpcHBpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOworICAgICAgICBtVmlzaWJsZSA9IGZhbHNlOworCisgICAgICAgIGdldENvbnRleHQoKS51bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyKTsKKyAgICAgICAgdXBkYXRlUnVubmluZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uV2luZG93VmlzaWJpbGl0eUNoYW5nZWQoaW50IHZpc2liaWxpdHkpIHsKKyAgICAgICAgc3VwZXIub25XaW5kb3dWaXNpYmlsaXR5Q2hhbmdlZCh2aXNpYmlsaXR5KTsKKyAgICAgICAgbVZpc2libGUgPSAodmlzaWJpbGl0eSA9PSBWSVNJQkxFKTsKKyAgICAgICAgdXBkYXRlUnVubmluZyhmYWxzZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgc3VwZXIuc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgdXBkYXRlUnVubmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIGZsaXBwaW5nIHRvIHRoZSBuZXh0IHZpZXcKKyAgICAgKgorICAgICAqIEBwYXJhbSBtaWxsaXNlY29uZHMKKyAgICAgKiAgICAgICAgICAgIHRpbWUgaW4gbWlsbGlzZWNvbmRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmxpcEludGVydmFsKGludCBtaWxsaXNlY29uZHMpIHsKKyAgICAgICAgbUZsaXBJbnRlcnZhbCA9IG1pbGxpc2Vjb25kczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBhIHRpbWVyIHRvIGN5Y2xlIHRocm91Z2ggY2hpbGQgdmlld3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEZsaXBwaW5nKCkgeworICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBObyBtb3JlIGZsaXBzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcEZsaXBwaW5nKCkgeworICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgKiB7QGluaGVyaXREb2N9CisgICAgKi8KKyAgIEBPdmVycmlkZQorICAgQFJlbW90YWJsZVZpZXdNZXRob2QKKyAgIHB1YmxpYyB2b2lkIHNob3dOZXh0KCkgeworICAgICAgIC8vIGlmIHRoZSBmbGlwcGVyIGlzIGN1cnJlbnRseSBmbGlwcGluZyBhdXRvbWF0aWNhbGx5LCBhbmQgc2hvd05leHQoKSBpcyBjYWxsZWQKKyAgICAgICAvLyB3ZSBzaG91bGQgd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0byByZXNldCB0aGUgdGltZXIKKyAgICAgICBpZiAobVJ1bm5pbmcpIHsKKyAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoRkxJUF9NU0cpOworICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRkxJUF9NU0cpOworICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCBtRmxpcEludGVydmFsKTsKKyAgICAgICB9CisgICAgICAgc3VwZXIuc2hvd05leHQoKTsKKyAgIH0KKworICAgLyoqCisgICAgKiB7QGluaGVyaXREb2N9CisgICAgKi8KKyAgIEBPdmVycmlkZQorICAgQFJlbW90YWJsZVZpZXdNZXRob2QKKyAgIHB1YmxpYyB2b2lkIHNob3dQcmV2aW91cygpIHsKKyAgICAgICAvLyBpZiB0aGUgZmxpcHBlciBpcyBjdXJyZW50bHkgZmxpcHBpbmcgYXV0b21hdGljYWxseSwgYW5kIHNob3dQcmV2aW91cygpIGlzIGNhbGxlZAorICAgICAgIC8vIHdlIHNob3VsZCB3ZSBzaG91bGQgbWFrZSBzdXJlIHRvIHJlc2V0IHRoZSB0aW1lcgorICAgICAgIGlmIChtUnVubmluZykgeworICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhGTElQX01TRyk7CisgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShGTElQX01TRyk7CisgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtc2csIG1GbGlwSW50ZXJ2YWwpOworICAgICAgIH0KKyAgICAgICBzdXBlci5zaG93UHJldmlvdXMoKTsKKyAgIH0KKworICAgLyoqCisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gc3RhcnQgb3Igc3RvcCBkaXNwYXRjaGluZyBmbGlwIHtAbGluayBNZXNzYWdlfSBiYXNlZAorICAgICAqIG9uIHtAbGluayAjbVJ1bm5pbmd9IGFuZCB7QGxpbmsgI21WaXNpYmxlfSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUnVubmluZygpIHsKKyAgICAgICAgLy8gYnkgZGVmYXVsdCB3aGVuIHdlIHVwZGF0ZSBydW5uaW5nLCB3ZSB3YW50IHRoZQorICAgICAgICAvLyBjdXJyZW50IHZpZXcgdG8gYW5pbWF0ZSBpbgorICAgICAgICB1cGRhdGVSdW5uaW5nKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIG1ldGhvZCB0byBzdGFydCBvciBzdG9wIGRpc3BhdGNoaW5nIGZsaXAge0BsaW5rIE1lc3NhZ2V9IGJhc2VkCisgICAgICogb24ge0BsaW5rICNtUnVubmluZ30gYW5kIHtAbGluayAjbVZpc2libGV9IHN0YXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGZsaXBOb3cgRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0byBleGVjdXRlIHRoZSBhbmltYXRpb24gbm93LCBpbgorICAgICAqICAgICAgICAgICAgYWRkaXRpb24gdG8gcXVldWluZyBmdXR1cmUgZmxpcHMuIElmIG9taXR0ZWQsIGRlZmF1bHRzIHRvCisgICAgICogICAgICAgICAgICB0cnVlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSdW5uaW5nKGJvb2xlYW4gZmxpcE5vdykgeworICAgICAgICBib29sZWFuIHJ1bm5pbmcgPSBtVmlzaWJsZSAmJiBtU3RhcnRlZCAmJiBtVXNlclByZXNlbnQgJiYgbUFkYXB0ZXIgIT0gbnVsbDsKKyAgICAgICAgaWYgKHJ1bm5pbmcgIT0gbVJ1bm5pbmcpIHsKKyAgICAgICAgICAgIGlmIChydW5uaW5nKSB7CisgICAgICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQsIGZsaXBOb3cpOworICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShGTElQX01TRyk7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1zZywgbUZsaXBJbnRlcnZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEZMSVBfTVNHKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SdW5uaW5nID0gcnVubmluZzsKKyAgICAgICAgfQorICAgICAgICBpZiAoTE9HRCkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAidXBkYXRlUnVubmluZygpIG1WaXNpYmxlPSIgKyBtVmlzaWJsZSArICIsIG1TdGFydGVkPSIgKyBtU3RhcnRlZAorICAgICAgICAgICAgICAgICAgICArICIsIG1Vc2VyUHJlc2VudD0iICsgbVVzZXJQcmVzZW50ICsgIiwgbVJ1bm5pbmc9IiArIG1SdW5uaW5nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2hpbGQgdmlld3MgYXJlIGZsaXBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRmxpcHBpbmcoKSB7CisgICAgICAgIHJldHVybiBtU3RhcnRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgaWYgdGhpcyB2aWV3IGF1dG9tYXRpY2FsbHkgY2FsbHMge0BsaW5rICNzdGFydEZsaXBwaW5nKCl9IHdoZW4gaXQKKyAgICAgKiBiZWNvbWVzIGF0dGFjaGVkIHRvIGEgd2luZG93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9TdGFydChib29sZWFuIGF1dG9TdGFydCkgeworICAgICAgICBtQXV0b1N0YXJ0ID0gYXV0b1N0YXJ0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZpZXcgYXV0b21hdGljYWxseSBjYWxscyB7QGxpbmsgI3N0YXJ0RmxpcHBpbmcoKX0KKyAgICAgKiB3aGVuIGl0IGJlY29tZXMgYXR0YWNoZWQgdG8gYSB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBdXRvU3RhcnQoKSB7CisgICAgICAgIHJldHVybiBtQXV0b1N0YXJ0OworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgaW50IEZMSVBfTVNHID0gMTsKKworICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IEZMSVBfTVNHKSB7CisgICAgICAgICAgICAgICAgaWYgKG1SdW5uaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHNob3dOZXh0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVycy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkN2ZiNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVycy5qYXZhCkBAIC0wLDAgKzEsMTIzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIDxwPlRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gbG9hZCB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlciBhZGFwdGVyc30gZGVmaW5lZCBpbgorICogWE1MIHJlc291cmNlcy4gWE1MLWRlZmluZWQgYWRhcHRlcnMgY2FuIGJlIHVzZWQgdG8gZWFzaWx5IGNyZWF0ZSBhZGFwdGVycyBpbiB5b3VyCisgKiBvd24gYXBwbGljYXRpb24gb3IgdG8gcGFzcyBhZGFwdGVycyB0byBvdGhlciBwcm9jZXNzZXMuPC9wPgorICogCisgKiA8aDI+VHlwZXMgb2YgYWRhcHRlcnM8L2gyPgorICogPHA+QWRhcHRlcnMgZGVmaW5lZCB1c2luZyBYTUwgcmVzb3VyY2VzIGNhbiBvbmx5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN1cHBvcnRlZAorICogdHlwZXMuIEFyYml0cmFyeSBhZGFwdGVycyBhcmUgbm90IHN1cHBvcnRlZCB0byBndWFyYW50ZWUgdGhlIHNhZmV0eSBvZiB0aGUgbG9hZGVkCisgKiBjb2RlIHdoZW4gYWRhcHRlcnMgYXJlIGxvYWRlZCBhY3Jvc3MgcGFja2FnZXMuPC9wPgorICogPHVsPgorICogIDxsaT48YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyIj5DdXJzb3IgYWRhcHRlcjwvYT46IGEgY3Vyc29yIGFkYXB0ZXIgY2FuIGJlIHVzZWQKKyAqICB0byBkaXNwbGF5IHRoZSBjb250ZW50IG9mIGEgY3Vyc29yLCBtb3N0IG9mdGVuIGNvbWluZyBmcm9tIGEgY29udGVudCBwcm92aWRlcjwvbGk+CisgKiA8L3VsPgorICogPHA+VGhlIGNvbXBsZXRlIFhNTCBmb3JtYXQgZGVmaW5pdGlvbiBvZiBlYWNoIGFkYXB0ZXIgdHlwZSBpcyBhdmFpbGFibGUgYmVsb3cuPC9wPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXIiIC8+CisgKiA8aDI+Q3Vyc29yIGFkYXB0ZXI8L2gyPgorICogPHA+QSBjdXJzb3IgYWRhcHRlciBYTUwgZGVmaW5pdGlvbiBzdGFydHMgd2l0aCB0aGUKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItdGFnIj48Y29kZT4mbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDs8L2NvZGU+PC9hPgorICogdGFnIGFuZCBtYXkgY29udGFpbiBvbmUgb3IgbW9yZSBpbnN0YW5jZXMgb2YgdGhlIGZvbGxvd2luZyB0YWdzOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIj48Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPjwvYT48L2xpPgorICogIDxsaT48YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdGFnIj48Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT48L2E+PC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci10YWciIC8+CisgKiA8aDM+Jmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7PC9oMz4KKyAqIDxwPlRoZSA8Y29kZT4mbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDs8L2NvZGU+IGVsZW1lbnQgZGVmaW5lcyB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICogZG9jdW1lbnQgYW5kIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6bGF5b3V0PC9jb2RlPjogUmVmZXJlbmNlIHRvIHRoZSBYTUwgbGF5b3V0IHRvIGJlIGluZmxhdGVkIGZvcgorICogIGVhY2ggaXRlbSBvZiB0aGUgYWRhcHRlci4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6c2VsZWN0aW9uPC9jb2RlPjogU2VsZWN0aW9uIGV4cHJlc3Npb24sIHVzZWQgd2hlbiB0aGUKKyAqICA8Y29kZT5hbmRyb2lkOnVyaTwvY29kZT4gYXR0cmlidXRlIGlzIGRlZmluZWQgb3Igd2hlbiB0aGUgYWRhcHRlciBpcyBsb2FkZWQgd2l0aAorICogIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycyNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBTdHJpbmcsIE9iamVjdFtdKX0uCisgKiAgVGhpcyBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpzb3J0T3JkZXI8L2NvZGU+OiBTb3J0IGV4cHJlc3Npb24sIHVzZWQgd2hlbiB0aGUKKyAqICA8Y29kZT5hbmRyb2lkOnVyaTwvY29kZT4gYXR0cmlidXRlIGlzIGRlZmluZWQgb3Igd2hlbiB0aGUgYWRhcHRlciBpcyBsb2FkZWQgd2l0aAorICogIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycyNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBTdHJpbmcsIE9iamVjdFtdKX0uCisgKiAgVGhpcyBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDp1cmk8L2NvZGU+OiBVUkkgb2YgdGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8gcXVlcnkgdG8gcmV0cmlldmUgYSBjdXJzb3IuCisgKiAgU3BlY2lmeWluZyB0aGlzIGF0dHJpYnV0ZSBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAqICB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgU3RyaW5nLCBPYmplY3RbXSl9LgorICogIElmIHlvdSBjYWxsIHRoaXMgbWV0aG9kLCB0aGUgdmFsdWUgb2YgdGhlIFhNTCBhdHRyaWJ1dGUgaXMgaWdub3JlZC4gVGhpcyBhdHRyaWJ1dGUgaXMKKyAqICBvcHRpb25hbC48L2xpPgorICogPC91bD4KKyAqIDxwPkluIGFkZGl0aW9uLCB5b3UgY2FuIHNwZWNpZnkgb25lIG9yIG1vcmUgaW5zdGFuY2VzIG9mCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLXNlbGVjdC10YWciPjxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+PC9hPiBhbmQKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC10YWciPjxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPjwvYT4gdGFncyBhcyBjaGlsZHJlbgorICogb2YgPGNvZGU+Jmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7PC9jb2RlPi48L3A+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIiAvPgorICogPGgzPiZsdDtzZWxlY3QgLyZndDs8L2gzPgorICogPHA+VGhlIDxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+IHRhZyBpcyB1c2VkIHRvIHNlbGVjdCBjb2x1bW5zIGZyb20gdGhlIGN1cnNvcgorICogd2hlbiBkb2luZyB0aGUgcXVlcnkuIFRoaXMgY2FuIGJlIHZlcnkgdXNlZnVsIHdoZW4gdXNpbmcgdHJhbnNmb3JtYXRpb25zIGluIHRoZQorICogPGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+IGVsZW1lbnRzLiBJdCBjYW4gYWxzbyBiZSB2ZXJ5IHVzZWZ1bCBpZiB5b3UgYXJlIHByb3ZpZGluZworICogeW91ciBvd24gPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHlwZXMiPmJpbmRlcjwvYT4gb3IKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXR5cGVzIj50cmFuc2Zvcm1hdGlvbjwvYT4gY2xhc3Nlcy4KKyAqIDxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZSBpZ25vcmVkIGlmIHlvdSBzdXBwbHkgdGhlIGN1cnNvciB5b3Vyc2VsZi48L3A+CisgKiA8cD5UaGUgPGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT4gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpjb2x1bW48L2NvZGU+OiBOYW1lIG9mIHRoZSBjb2x1bW4gdG8gc2VsZWN0IGluIHRoZSBjdXJzb3IgZHVyaW5nIHRoZQorICogIHF1ZXJ5IG9wZXJhdGlvbjwvbGk+CisgKiA8L3VsPgorICogPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgY29sdW1uIG5hbWVkIDxjb2RlPl9pZDwvY29kZT4gaXMgYWx3YXlzIGltcGxpY2l0bHkKKyAqIHNlbGVjdGVkLjwvcD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdGFnIiAvPgorICogPGgzPiZsdDtiaW5kIC8mZ3Q7PC9oMz4KKyAqIDxwPlRoZSA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gdGFnIGlzIHVzZWQgdG8gYmluZCBhIGNvbHVtbiBmcm9tIHRoZSBjdXJzb3IgdG8KKyAqIGEge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3fS4gQSBjb2x1bW4gYm91bmQgdXNpbmcgdGhpcyB0YWcgaXMgYXV0b21hdGljYWxseSBzZWxlY3RlZAorICogZHVyaW5nIHRoZSBxdWVyeSBhbmQgYSBtYXRjaGluZworICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIj48Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPiB0YWcgaXMgdGhlcmVmb3JlCisgKiBub3QgcmVxdWlyZWQuPC9wPgorICogCisgKiA8cD5FYWNoIGJpbmRpbmcgaXMgZGVjbGFyZWQgYXMgYSBvbmUgdG8gb25lIG1hdGNoaW5nIGJ1dAorICogY3VzdG9tIGJpbmRlciBjbGFzc2VzIG9yIHNwZWNpYWwKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXRyYW5zZm9ybWF0aW9uIj5kYXRhIHRyYW5zZm9ybWF0aW9uczwvYT4gY2FuCisgKiBhbGxvdyB5b3UgdG8gYmluZCBzZXZlcmFsIGNvbHVtbnMgdG8gYSBzaW5nbGUgdmlldy4gSW4gdGhpcyBjYXNlIHlvdSBtdXN0IHVzZSB0aGUKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItc2VsZWN0LXRhZyI+PGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT4gdGFnIHRvIG1ha2UKKyAqIHN1cmUgYW55IHJlcXVpcmVkIGNvbHVtbiBpcyBwYXJ0IG9mIHRoZSBxdWVyeS48L3A+CisgKiAKKyAqIDxwPlRoZSA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gdGFnIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6ZnJvbTwvY29kZT46IFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gYmluZCBmcm9tLgorICogIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS4gTm90ZSB0aGF0IDxjb2RlPkA8L2NvZGU+IHdoaWNoIGFyZSBub3QgdXNlZCB0byByZWZlcmVuY2UgcmVzb3VyY2VzCisgKiAgc2hvdWxkIGJlIGJhY2tzbGFzaCBwcm90ZWN0ZWQgYXMgaW4gPGNvZGU+XEA8L2NvZGU+LjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6dG88L2NvZGU+OiBUaGUgaWQgb2YgdGhlIHZpZXcgdG8gYmluZCB0by4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6YXM8L2NvZGU+OiBUaGUgPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHlwZXMiPmRhdGEgdHlwZTwvYT4KKyAqICBvZiB0aGUgYmluZGluZy4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LjwvbGk+CisgKiA8L3VsPgorICogCisgKiA8cD5JbiBhZGRpdGlvbiwgYSA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gY2FuIGNvbnRhaW4gemVybyBvciBtb3JlIGluc3RhbmNlcyBvZgorICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHJhbnNmb3JtYXRpb24iPmRhdGEgdHJhbnNmb3JtYXRpb25zPC9hPiBjaGlsZHJlbgorICogdGFncy48L3A+CisgKgorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtZGF0YS10eXBlcyIgLz4KKyAqIDxoND5CaW5kaW5nIGRhdGEgdHlwZXM8L2g0PgorICogPHA+Rm9yIGEgYmluZGluZyB0byBvY2N1ciB0aGUgZGF0YSB0eXBlIG9mIHRoZSBib3VuZCBjb2x1bW4vdmlldyBwYWlyIG11c3QgYmUgc3BlY2lmaWVkLgorICogVGhlIGZvbGxvd2luZyBkYXRhIHR5cGVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+c3RyaW5nPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHN0cmluZyBhbmQgbXVzdCBiZQorICogIGJvdW5kIHRvIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3fTwvbGk+CisgKiAgPGxpPjxjb2RlPmltYWdlPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIGJsb2IgZGVzY3JpYmluZyBhbgorICogIGltYWdlIGFuZCBtdXN0IGJlIGJvdW5kIHRvIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+aW1hZ2UtdXJpPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIFVSSSB0byBhbiBpbWFnZQorICogIGFuZCBtdXN0IGJlIGJvdW5kIHRvIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+ZHJhd2FibGU8L2NvZGU+OiBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgcmVzb3VyY2UgaWQgdG8gYQorICogIGRyYXdhYmxlIGFuZCBtdXN0IGJlIGJvdW5kIHRvIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+dGFnPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHN0cmluZyBhbmQgd2lsbCBiZSBzZXQgYXMKKyAqICB0aGUgdGFnICh1c2luZyB7QGxpbmsgVmlldyNzZXRUYWcoT2JqZWN0KX0gb2YgdGhlIGFzc29jaWF0ZWQgVmlldy4gVGhpcyBjYW4gYmUgdXNlZCB0bworICogIGFzc29jaWF0ZSBtZXRhLWRhdGEgdG8geW91ciB2aWV3LCB0aGF0IGNhbiBiZSB1c2VkIGZvciBpbnN0YW5jZSBieSBhIGxpc3RlbmVyLjwvbGk+CisgKiAgPGxpPkEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWU6IFRoZSBuYW1lIG9mIGEgY2xhc3MgY29ycmVzcG9uZGluZyB0byBhbiBpbXBsZW1lbnRhdGlvbiBvZgorICogIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JCaW5kZXJ9LiBDdXJzb3IgYmluZGVycyBjYW4gYmUgdXNlZCB0byBwcm92aWRlCisgKiAgYmluZGluZ3Mgbm90IHN1cHBvcnRlZCBieSBkZWZhdWx0LiBDdXN0b20gYmluZGVycyBjYW5ub3QgYmUgdXNlZCB3aXRoCisgKiAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2lzUmVzdHJpY3RlZCgpIHJlc3RyaWN0ZWQgY29udGV4dHN9LCBmb3IgaW5zdGFuY2UgaW4gYW4KKyAqICBhcHBsaWNhdGlvbiB3aWRnZXQ8L2xpPgorICogPC91bD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdHJhbnNmb3JtYXRpb24iIC8+CisgKiA8aDQ+QmluZGluZyB0cmFuc2Zvcm1hdGlvbnM8L2g0PgorICogPHA+V2hlbiBkZWZpbmluZyBhIGRhdGEgYmluZGluZyB5b3UgY2FuIHNwZWNpZnkgYW4gb3B0aW9uYWwgdHJhbnNmb3JtYXRpb24gYnkgdXNpbmcgb25lCisgKiBvZiB0aGUgZm9sbG93aW5nIHRhZ3MgYXMgYSBjaGlsZCBvZiBhIDxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPiBlbGVtZW50czo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPiZsdDttYXAgLyZndDs8L2NvZGU+OiBNYXBzIGEgY29uc3RhbnQgc3RyaW5nIHRvIGEgc3RyaW5nIG9yIGEgcmVzb3VyY2UuIFVzZQorICogIG9uZSBpbnN0YW5jZSBvZiB0aGlzIHRhZyBwZXIgdmFsdWUgeW91IHdhbnQgdG8gbWFwPC9saT4KKyAqICA8bGk+PGNvZGU+Jmx0O3RyYW5zZm9ybSAvJmd0OzwvY29kZT46IFRyYW5zZm9ybXMgYSBjb2x1bW4ncyB2YWx1ZSB1c2luZyBhbiBleHByZXNzaW9uCisgKiAgb3IgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9ufTwvbGk+CisgKiA8L3VsPgorICogPHA+V2hpbGUgc2V2ZXJhbCA8Y29kZT4mbHQ7bWFwIC8mZ3Q7PC9jb2RlPiB0YWdzIGNhbiBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUsIHlvdSBjYW5ub3QKKyAqIG1peCA8Y29kZT4mbHQ7bWFwIC8mZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O3RyYW5zZm9ybSAvJmd0OzwvY29kZT4gdGFncy4gSWYgc2V2ZXJhbAorICogPGNvZGU+Jmx0O3RyYW5zZm9ybSAvJmd0OzwvY29kZT4gdGFncyBhcmUgc3BlY2lmaWVkLCBvbmx5IHRoZSBsYXN0IG9uZSBpcyByZXRhaW5lZC48L3A+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1iaW5kLXRyYW5zZm9ybWF0aW9uLW1hcCIgLz4KKyAqIDxwPjxzdHJvbmc+Jmx0O21hcCAvJmd0Ozwvc3Ryb25nPjwvcD4KKyAqIDxwPkEgbWFwIGVsZW1lbnQgc2ltcGx5IHNwZWNpZmllcyBhIHZhbHVlIHRvIG1hdGNoIGZyb20gYW5kIGEgdmFsdWUgdG8gbWF0Y2ggdG8uIFdoZW4KKyAqIGEgY29sdW1uJ3MgdmFsdWUgZXF1YWxzIHRoZSB2YWx1ZSB0byBtYXRjaCBmcm9tLCBpdCBpcyByZXBsYWNlZCB3aXRoIHRoZSB2YWx1ZSB0byBtYXRjaAorICogdG8uIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgc3VwcG9ydGVkOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpmcm9tVmFsdWU8L2NvZGU+OiBUaGUgdmFsdWUgdG8gbWF0Y2ggZnJvbS4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5PC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDp0b1ZhbHVlPC9jb2RlPjogVGhlIHZhbHVlIHRvIG1hdGNoIHRvLiBUaGlzIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcKKyAqICBvciBhIHJlc291cmNlIGlkZW50aWZpZXIuIFRoaXMgdmFsdWUgaXMgaW50ZXJwcmV0ZWQgYXMgYSByZXNvdXJjZSBpZGVudGlmaWVyIHdoZW4gdGhlCisgKiAgZGF0YSBiaW5kaW5nIGlzIG9mIHR5cGUgPGNvZGU+ZHJhd2FibGU8L2NvZGU+LiBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnk8L2xpPgorICogPC91bD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdHJhbnNmb3JtYXRpb24tdHJhbnNmb3JtIiAvPgorICogPHA+PHN0cm9uZz4mbHQ7dHJhbnNmb3JtIC8mZ3Q7PC9zdHJvbmc+PC9wPgorICogPHA+QSBzaW1wbGUgdHJhbnNmb3JtIHRoYXQgb2NjdXJzIGVpdGhlciBieSBjYWxsaW5nIGEgc3BlY2lmaWVkIGNsYXNzIG9yIGJ5IHBlcmZvcm1pbmcKKyAqIHNpbXBsZSB0ZXh0IHN1YnN0aXR1dGlvbi4gVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQ6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT5hbmRyb2lkOndpdGhFeHByZXNzaW9uPC9jb2RlPjogVGhlIHRyYW5zZm9ybWF0aW9uIGV4cHJlc3Npb24uIFRoZSBleHByZXNzaW9uIGlzCisgKiAgYSBzdHJpbmcgY29udGFpbmluZyBjb2x1bW4gbmFtZXMgc3Vycm91bmRlZCB3aXRoIGN1cmx5IGJyYWNlcyB7IGFuZCB9LiBEdXJpbmcgdGhlCisgKiAgdHJhbnNmb3JtYXRpb24gZWFjaCBjb2x1bW4gbmFtZSBpcyByZXBsYWNlZCBieSBpdHMgdmFsdWUuIEFsbCBjb2x1bW5zIG11c3QgaGF2ZSBiZWVuCisgKiAgc2VsZWN0ZWQgaW4gdGhlIHF1ZXJ5LiBBbiBleGFtcGxlIG9mIGV4cHJlc3Npb24gaXMgPGNvZGU+IkZpcnN0IG5hbWU6IHtmaXJzdF9uYW1lfSwKKyAqICBsYXN0IG5hbWU6IHtsYXN0X25hbWV9IjwvY29kZT4uIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeQorICogIGlmIDxjb2RlPmFuZHJvaWQ6d2l0aENsYXNzPC9jb2RlPiBpcyBub3Qgc3BlY2lmaWVkIGFuZCBpZ25vcmVkIGlmIDxjb2RlPmFuZHJvaWQ6d2l0aENsYXNzPC9jb2RlPgorICogIGlzIHNwZWNpZmllZDwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6d2l0aENsYXNzPC9jb2RlPjogQSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBjb3JyZXNwb25kaW5nIHRvIGFuCisgKiAgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9ufS4gQ3VzdG9tCisgKiAgdHJhbnNmb3JtYXRpb25zIGNhbm5vdCBiZSB1c2VkIHdpdGgKKyAqICB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjaXNSZXN0cmljdGVkKCkgcmVzdHJpY3RlZCBjb250ZXh0c30sIGZvciBpbnN0YW5jZSBpbgorICogIGFuIGFwcCB3aWRnZXQgVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5IGlmIDxjb2RlPmFuZHJvaWQ6d2l0aEV4cHJlc3Npb248L2NvZGU+IGlzCisgKiAgbm90IHNwZWNpZmllZDwvbGk+CisgKiA8L3VsPgorICogCisgKiA8aDM+RXhhbXBsZTwvaDM+CisgKiA8cD5UaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVmaW5lcyBhIGN1cnNvciBhZGFwdGVyIHRoYXQgcXVlcmllcyBhbGwgdGhlIGNvbnRhY3RzIHdpdGgKKyAqIGEgcGhvbmUgbnVtYmVyIHVzaW5nIHRoZSBjb250YWN0cyBjb250ZW50IHByb3ZpZGVyLiBFYWNoIGNvbnRhY3QgaXMgZGlzcGxheWVkIHdpdGgKKyAqIGl0cyBkaXNwbGF5IG5hbWUsIGl0cyBmYXZvcml0ZSBzdGF0dXMgYW5kIGl0cyBwaG90by4gVG8gZGlzcGxheSBwaG90b3MsIGEgY3VzdG9tIGRhdGEKKyAqIGJpbmRlciBpcyBkZWNsYXJlZDo8L3A+CisgKiAKKyAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KKyAqICZsdDtjdXJzb3ItYWRhcHRlciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgKiAgICAgYW5kcm9pZDp1cmk9ImNvbnRlbnQ6Ly9jb20uYW5kcm9pZC5jb250YWN0cy9jb250YWN0cyIKKyAqICAgICBhbmRyb2lkOnNlbGVjdGlvbj0iaGFzX3Bob25lX251bWJlcj0xIgorICogICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2NvbnRhY3RfaXRlbSImZ3Q7CisgKgorICogICAgICZsdDtiaW5kIGFuZHJvaWQ6ZnJvbT0iZGlzcGxheV9uYW1lIiBhbmRyb2lkOnRvPSJAaWQvbmFtZSIgYW5kcm9pZDphcz0ic3RyaW5nIiAvJmd0OworICogICAgICZsdDtiaW5kIGFuZHJvaWQ6ZnJvbT0ic3RhcnJlZCIgYW5kcm9pZDp0bz0iQGlkL3N0YXIiIGFuZHJvaWQ6YXM9ImRyYXdhYmxlIiZndDsKKyAqICAgICAgICAgJmx0O21hcCBhbmRyb2lkOmZyb21WYWx1ZT0iMCIgYW5kcm9pZDp0b1ZhbHVlPSJAYW5kcm9pZDpkcmF3YWJsZS9zdGFyX2JpZ19vZmYiIC8mZ3Q7CisgKiAgICAgICAgICZsdDttYXAgYW5kcm9pZDpmcm9tVmFsdWU9IjEiIGFuZHJvaWQ6dG9WYWx1ZT0iQGFuZHJvaWQ6ZHJhd2FibGUvc3Rhcl9iaWdfb24iIC8mZ3Q7CisgKiAgICAgJmx0Oy9iaW5kJmd0OworICogICAgICZsdDtiaW5kIGFuZHJvaWQ6ZnJvbT0iX2lkIiBhbmRyb2lkOnRvPSJAaWQvbmFtZSIKKyAqICAgICAgICAgICAgICBhbmRyb2lkOmFzPSJjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5hZGFwdGVycy5Db250YWN0UGhvdG9CaW5kZXIiIC8mZ3Q7CisgKgorICogJmx0Oy9jdXJzb3ItYWRhcHRlciZndDsKKyAqIDwvcHJlPgorICogCisgKiA8aDM+UmVsYXRlZCBBUElzPC9oMz4KKyAqIDx1bD4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzI2xvYWRBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIE9iamVjdFtdKX08L2xpPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IsIE9iamVjdFtdKX08L2xpPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgU3RyaW5nLCBPYmplY3RbXSl9PC9saT4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvckJpbmRlcn08L2xpPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb259PC9saT4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9PC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQWRhcHRlcgorICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyCisgKiAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfbGF5b3V0IAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9zZWxlY3Rpb24gCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX3NvcnRPcmRlciAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfdXJpIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbV9hcyAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfQmluZEl0ZW1fZnJvbSAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfQmluZEl0ZW1fdG8KKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfTWFwSXRlbV9mcm9tVmFsdWUgCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX01hcEl0ZW1fdG9WYWx1ZSAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfU2VsZWN0SXRlbV9jb2x1bW4gCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW1fd2l0aENsYXNzIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9UcmFuc2Zvcm1JdGVtX3dpdGhFeHByZXNzaW9uIAorICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IkphdmFkb2NSZWZlcmVuY2UifSkKK3B1YmxpYyBjbGFzcyBBZGFwdGVycyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SID0gImN1cnNvci1hZGFwdGVyIjsKKworICAgIC8qKgorICAgICAqIDxwPkludGVyZmFjZSB1c2VkIHRvIGJpbmQgYSB7QGxpbmsgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3J9IGNvbHVtbiB0byBhIFZpZXcuIFRoaXMKKyAgICAgKiBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBiaW5kaW5ncyBmb3IgZGF0YSB0eXBlcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZQorICAgICAqIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVyc30uPC9wPgorICAgICAqIAorICAgICAqIDxwPkEgYmluZGVyIGlzIHByb3ZpZGVkIHdpdGggYSBjdXJzb3IgdHJhbnNmb3JtYXRpb24gd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgdXNlZAorICAgICAqIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUgcmV0cmlldmVkIGZyb20gdGhlIGN1cnNvci4gVGhlIHRyYW5zZm9ybWF0aW9uIGlzIGd1YXJhbnRlZWQKKyAgICAgKiB0byBuZXZlciBiZSBudWxsIHNvIGl0J3MgYWx3YXlzIHNhZmUgdG8gYXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgYmluZGVyIGlzIGFzc29jaWF0ZWQgd2l0aCBhIENvbnRleHQgYnV0IGNhbiBiZSByZS11c2VkIHdpdGggbXVsdGlwbGUgY3Vyc29ycy4KKyAgICAgKiBBcyBzdWNoLCB0aGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIG1ha2Ugbm8gYXNzdW1wdGlvbiBhYm91dCB0aGUgQ3Vyc29yIGluIHVzZS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5WaWV3IAorICAgICAqIEBzZWUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDdXJzb3JCaW5kZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogPHA+VGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmluZGVyLjwvcD4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5UaGUgdHJhbnNmb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmluZGVyLiBUaGlzIHRyYW5zZm9ybWF0aW9uIGlzIG5ldmVyCisgICAgICAgICAqIG51bGwgYW5kIG1heSBvciBtYXkgbm90IGJlIGFwcGxpZWQgdG8gdGhlIEN1cnNvciBkYXRhIGR1cmluZyB0aGUKKyAgICAgICAgICoge0BsaW5rICNiaW5kKGFuZHJvaWQudmlldy5WaWV3LCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciwgaW50KX0gb3BlcmF0aW9uLjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzZWUgI2JpbmQoYW5kcm9pZC52aWV3LlZpZXcsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yLCBpbnQpIAorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEN1cnNvclRyYW5zZm9ybWF0aW9uIG1UcmFuc2Zvcm1hdGlvbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Q3JlYXRlcyBhIG5ldyBDdXJzb3IgYmluZGVyLjwvcD4gCisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBiaW5kZXIuCisgICAgICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1hdGlvbiBUaGUgdHJhbnNmb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmluZGVyLiBUaGlzCisgICAgICAgICAqICAgICAgICB0cmFuc2Zvcm1hdGlvbiBtYXkgb3IgbWF5IG5vdCBiZSBhcHBsaWVkIGJ5IHRoZSBiaW5kZXIgYW5kIGlzIGd1YXJhbnRlZWQKKyAgICAgICAgICogICAgICAgIHRvIG5vdCBiZSBudWxsLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEN1cnNvckJpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICBtVHJhbnNmb3JtYXRpb24gPSB0cmFuc2Zvcm1hdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5CaW5kcyB0aGUgc3BlY2lmaWVkIEN1cnNvciBjb2x1bW4gdG8gdGhlIHN1cHBsaWVkIFZpZXcuIFRoZSBiaW5kaW5nIG9wZXJhdGlvbgorICAgICAgICAgKiBjYW4gcXVlcnkgb3RoZXIgQ3Vyc29yIGNvbHVtbnMgYXMgbmVlZGVkLiBEdXJpbmcgdGhlIGJpbmRpbmcgb3BlcmF0aW9uLCB2YWx1ZXMKKyAgICAgICAgICogcmV0cmlldmVkIGZyb20gdGhlIEN1cnNvciBtYXkgb3IgbWF5IG5vdCBiZSB0cmFuc2Zvcm1lZCB1c2luZyB0aGlzIGJpbmRlcidzCisgICAgICAgICAqIGN1cnNvciB0cmFuc2Zvcm1hdGlvbi48L3A+CisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0byBiaW5kIGRhdGEgdG8uCisgICAgICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciB0byBiaW5kIGRhdGEgZnJvbS4KKyAgICAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IFRoZSBjb2x1bW4gaW5kZXggaW4gdGhlIGN1cnNvciB3aGVyZSB0aGUgZGF0YSB0byBiaW5kIHJlc2lkZXMuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2VlICNtVHJhbnNmb3JtYXRpb24KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29sdW1uIHdhcyBzdWNjZXNzZnVsbHkgYm91bmQgdG8gdGhlIFZpZXcsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkludGVyZmFjZSB1c2VkIHRvIHRyYW5zZm9ybSBkYXRhIGNvbWluZyBvdXQgb2YgYSB7QGxpbmsgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3J9CisgICAgICogYmVmb3JlIGl0IGlzIGJvdW5kIHRvIGEge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3fS48L3A+CisgICAgICogCisgICAgICogPHA+VHJhbnNmb3JtYXRpb25zIGFyZSB1c2VkIHRvIHRyYW5zZm9ybSB0ZXh0LWJhc2VkIGRhdGEgKGluIHRoZSBmb3JtIG9mIGEgU3RyaW5nKSwKKyAgICAgKiBvciB0byB0cmFuc2Zvcm0gZGF0YSBpbnRvIGEgcmVzb3VyY2UgaWRlbnRpZmllci4gQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkCisgICAgICogdG8gZ2VuZXJhdGUgcmVzb3VyY2UgaWRlbnRpZmllcnMuPC9wPgorICAgICAqIAorICAgICAqIEBzZWUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvckJpbmRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ3Vyc29yVHJhbnNmb3JtYXRpb24geworICAgICAgICAvKioKKyAgICAgICAgICogPHA+VGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNmb3JtYXRpb24uPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPkNyZWF0ZXMgYSBuZXcgQ3Vyc29yIHRyYW5zZm9ybWF0aW9uLjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zZm9ybWF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEN1cnNvclRyYW5zZm9ybWF0aW9uKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlRyYW5zZm9ybXMgdGhlIHNwZWNpZmllZCBDdXJzb3IgY29sdW1uIGludG8gYSBTdHJpbmcuIFRoZSB0cmFuc2Zvcm1hdGlvbgorICAgICAgICAgKiBjYW4gc2ltcGx5IHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgY29sdW1uIGFzIGEgU3RyaW5nICh0aGlzIGlzIGtub3duCisgICAgICAgICAqIGFzIHRoZSBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbikgb3IgbWFuaXB1bGF0ZSB0aGUgY29udGVudC4gRm9yIGluc3RhbmNlLAorICAgICAgICAgKiBhIHRyYW5zZm9ybWF0aW9uIGNhbiBwZXJmb3JtIHRleHQgc3Vic3RpdHV0aW9ucyBvciBjb25jYXRlbmF0ZSBvdGhlcgorICAgICAgICAgKiBjb2x1bW5zIHdpdGggdGhlIHNwZWNpZmllZCBjb2x1bW4uPC9wPgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRoYXQgY29udGFpbnMgdGhlIGRhdGEgdG8gdHJhbnNmb3JtLiAKKyAgICAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHRyYW5zZm9ybS4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gQSBTdHJpbmcgY29udGFpbmluZyB0aGUgdHJhbnNmb3JtZWQgdmFsdWUgb2YgdGhlIGNvbHVtbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdHJhbnNmb3JtKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlRyYW5zZm9ybXMgdGhlIHNwZWNpZmllZCBDdXJzb3IgY29sdW1uIGludG8gYSByZXNvdXJjZSBpZGVudGlmaWVyLgorICAgICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgaW50ZXJwcmV0cyB0aGUgY29udGVudCBvZiB0aGUgY29sdW1uCisgICAgICAgICAqIGFzIGFuIGludGVnZXIuPC9wPgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRoYXQgY29udGFpbnMgdGhlIGRhdGEgdG8gdHJhbnNmb3JtLiAKKyAgICAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHRyYW5zZm9ybS4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gQSByZXNvdXJjZSBpZGVudGlmaWVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCB0cmFuc2Zvcm1Ub1Jlc291cmNlKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRJbnQoY29sdW1uSW5kZXgpOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5Mb2FkcyB0aGUge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9IGRlZmluZWQgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIFhNTCByZXNvdXJjZS4gVGhlIGNvbnRlbnQgb2YgdGhlIGFkYXB0ZXIgaXMgbG9hZGVkIGZyb20gdGhlIGNvbnRlbnQgcHJvdmlkZXIKKyAgICAgKiBpZGVudGlmaWVkIGJ5IHRoZSBzdXBwbGllZCBVUkkuPC9wPgorICAgICAqIAorICAgICAqIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgdGhlIHN1cHBsaWVkIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dH0gaXMKKyAgICAgKiBhbiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHl9LCB0aGUgY3Vyc29yIHJldHVybmVkIGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyCisgICAgICogd2lsbCBiZSBhdXRvbWF0aWNhbGx5IG1hbmFnZWQuIE90aGVyd2lzZSwgeW91IGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlCisgICAgICogY3Vyc29yIHlvdXJzZWxmLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgZm9ybWF0IG9mIHRoZSBYTUwgZGVmaW5pdGlvbiBvZiB0aGUgY3Vyc29yIGFkYXB0ZXIgaXMgZG9jdW1lbnRlZCBhdAorICAgICAqIHRoZSB0b3Agb2YgdGhpcyBwYWdlLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBsb2FkIHRoZSBYTUwgcmVzb3VyY2UgZnJvbS4KKyAgICAgKiBAcGFyYW0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIFhNTCByZXNvdXJjZSBkZWNsYXJpbmcgdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBjb250ZW50IHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgQ3Vyc29yQWRhcHRlciwgdXNlZAorICAgICAqICAgICAgICB0byBzdWJzdGl0dXRlIHZhbHVlcyBpbiB0aGUgc2VsZWN0aW9uIGV4cHJlc3Npb24uCisgICAgICogCisgICAgICogQHJldHVybiBBIHtAbGluayBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyfQorICAgICAqIAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSBYTUwgcmVzb3VyY2UgZG9lcyBub3QgY29udGFpbgorICAgICAqICAgICAgICAgYSB2YWxpZCAmbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDsgZGVmaW5pdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIKKyAgICAgKiBAc2VlICNsb2FkQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBPYmplY3RbXSkgCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDdXJzb3JBZGFwdGVyIGxvYWRDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGlkLCBTdHJpbmcgdXJpLAorICAgICAgICAgICAgT2JqZWN0Li4uIHBhcmFtZXRlcnMpIHsKKworICAgICAgICBYbWxDdXJzb3JBZGFwdGVyIGFkYXB0ZXIgPSAoWG1sQ3Vyc29yQWRhcHRlcikgbG9hZEFkYXB0ZXIoY29udGV4dCwgaWQsIEFEQVBURVJfQ1VSU09SLAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMpOworCisgICAgICAgIGlmICh1cmkgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRhcHRlci5zZXRVcmkodXJpKTsKKyAgICAgICAgfQorICAgICAgICBhZGFwdGVyLmxvYWQoKTsKKworICAgICAgICByZXR1cm4gYWRhcHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5Mb2FkcyB0aGUge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9IGRlZmluZWQgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIFhNTCByZXNvdXJjZS4gVGhlIGNvbnRlbnQgb2YgdGhlIGFkYXB0ZXIgaXMgbG9hZGVkIGZyb20gdGhlIHNwZWNpZmllZCBjdXJzb3IuCisgICAgICogWW91IGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIHN1cHBsaWVkIGN1cnNvci48L3A+CisgICAgICogCisgICAgICogPHA+VGhlIGZvcm1hdCBvZiB0aGUgWE1MIGRlZmluaXRpb24gb2YgdGhlIGN1cnNvciBhZGFwdGVyIGlzIGRvY3VtZW50ZWQgYXQKKyAgICAgKiB0aGUgdG9wIG9mIHRoaXMgcGFnZS48L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gbG9hZCB0aGUgWE1MIHJlc291cmNlIGZyb20uCisgICAgICogQHBhcmFtIGlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBYTUwgcmVzb3VyY2UgZGVjbGFyaW5nIHRoZSBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciBjb250YWluaW5nIHRoZSBkYXRhIGZvciB0aGUgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIEN1cnNvckFkYXB0ZXIsIHVzZWQKKyAgICAgKiAgICAgICAgdG8gc3Vic3RpdHV0ZSB2YWx1ZXMgaW4gdGhlIHNlbGVjdGlvbiBleHByZXNzaW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gQSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcn0KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiB0aGUgWE1MIHJlc291cmNlIGRvZXMgbm90IGNvbnRhaW4KKyAgICAgKiAgICAgICAgIGEgdmFsaWQgJmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7IGRlZmluaXRpb24uCisgICAgICogCisgICAgICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyCisgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyCisgICAgICogQHNlZSBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgorICAgICAqIEBzZWUgI2xvYWRBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIE9iamVjdFtdKSAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEN1cnNvckFkYXB0ZXIgbG9hZEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQsIEN1cnNvciBjdXJzb3IsCisgICAgICAgICAgICBPYmplY3QuLi4gcGFyYW1ldGVycykgeworCisgICAgICAgIFhtbEN1cnNvckFkYXB0ZXIgYWRhcHRlciA9IChYbWxDdXJzb3JBZGFwdGVyKSBsb2FkQWRhcHRlcihjb250ZXh0LCBpZCwgQURBUFRFUl9DVVJTT1IsCisgICAgICAgICAgICAgICAgcGFyYW1ldGVycyk7CisKKyAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGFwdGVyLmNoYW5nZUN1cnNvcihjdXJzb3IpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFkYXB0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+TG9hZHMgdGhlIGFkYXB0ZXIgZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWVkIFhNTCByZXNvdXJjZS4gVGhlIFhNTCBkZWZpbml0aW9uIG9mCisgICAgICogdGhlIGFkYXB0ZXIgbXVzdCBmb2xsb3cgdGhlIGZvcm1hdCBkZWZpbml0aW9uIG9mIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGFkYXB0ZXIKKyAgICAgKiB0eXBlcyBkZXNjcmliZWQgYXQgdGhlIHRvcCBvZiB0aGlzIHBhZ2UuPC9wPgorICAgICAqIAorICAgICAqIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgdGhlIGxvYWRlZCBhZGFwdGVyIGlzIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9CisgICAgICogYW5kIHRoZSBzdXBwbGllZCB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHR9IGlzIGFuIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eX0sCisgICAgICogdGhlIGN1cnNvciByZXR1cm5lZCBieSB0aGUgY29udGVudCBwcm92aWRlciB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgbWFuYWdlZC4gT3RoZXJ3aXNlLAorICAgICAqIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSBjdXJzb3IgeW91cnNlbGYuPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGxvYWQgdGhlIFhNTCByZXNvdXJjZSBmcm9tLgorICAgICAqIEBwYXJhbSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgWE1MIHJlc291cmNlIGRlY2xhcmluZyB0aGUgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGFkYXB0ZXIuCisgICAgICogIAorICAgICAqIEByZXR1cm4gQW4gYWRhcHRlciBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciwgT2JqZWN0W10pIAorICAgICAqIEBzZWUgI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIFN0cmluZywgT2JqZWN0W10pIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQmFzZUFkYXB0ZXIgbG9hZEFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQsIE9iamVjdC4uLiBwYXJhbWV0ZXJzKSB7CisgICAgICAgIGZpbmFsIEJhc2VBZGFwdGVyIGFkYXB0ZXIgPSBsb2FkQWRhcHRlcihjb250ZXh0LCBpZCwgbnVsbCwgcGFyYW1ldGVycyk7CisgICAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgTWFuYWdlZEFkYXB0ZXIpIHsKKyAgICAgICAgICAgICgoTWFuYWdlZEFkYXB0ZXIpIGFkYXB0ZXIpLmxvYWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWRhcHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbiBhZGFwdGVyIGZyb20gdGhlIHNwZWNpZmllZCBYTUwgcmVzb3VyY2UuIFRoZSBvcHRpb25hbCBhc3NlcnROYW1lIGNhbgorICAgICAqIGJlIHVzZWQgdG8gZXhpdCBlYXJseSBpZiB0aGUgYWRhcHRlciBkZWZpbmVkIGluIHRoZSBYTUwgcmVzb3VyY2UgaXMgbm90IG9mIHRoZQorICAgICAqIGV4cGVjdGVkIHR5cGUuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIGlkIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgWE1MIGRvY3VtZW50IGRlZmluaW5nIHRoZSBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBhc3NlcnROYW1lIFRoZSBtYW5kYXRvcnkgbmFtZSBvZiB0aGUgYWRhcHRlciBpbiB0aGUgWE1MIGRvY3VtZW50LgorICAgICAqICAgICAgICBJZ25vcmVkIGlmIG51bGwuCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIGFkYXB0ZXIuCisgICAgICogCisgICAgICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXJ9LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEJhc2VBZGFwdGVyIGxvYWRBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGlkLCBTdHJpbmcgYXNzZXJ0TmFtZSwKKyAgICAgICAgICAgIE9iamVjdC4uLiBwYXJhbWV0ZXJzKSB7CisKKyAgICAgICAgWG1sUmVzb3VyY2VQYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlciA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0WG1sKGlkKTsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRnJvbVhtbChjb250ZXh0LCBwYXJzZXIsIFhtbC5hc0F0dHJpYnV0ZVNldChwYXJzZXIpLAorICAgICAgICAgICAgICAgICAgICBpZCwgcGFyYW1ldGVycywgYXNzZXJ0TmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiBybmYgPSBuZXcgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgbG9hZCBhZGFwdGVyIHJlc291cmNlIElEICIgKworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKGlkKSk7CisgICAgICAgICAgICBybmYuaW5pdENhdXNlKGV4KTsKKyAgICAgICAgICAgIHRocm93IHJuZjsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiBybmYgPSBuZXcgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgbG9hZCBhZGFwdGVyIHJlc291cmNlIElEICIgKworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKGlkKSk7CisgICAgICAgICAgICBybmYuaW5pdENhdXNlKGV4KTsKKyAgICAgICAgICAgIHRocm93IHJuZjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChwYXJzZXIgIT0gbnVsbCkgcGFyc2VyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgYW4gYWRhcHRlciB1c2luZyB0aGUgc3BlY2lmaWVkIFhNTCBwYXJzZXIuIFRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlCisgICAgICogZm9yIGNob29zaW5nIHRoZSB0eXBlIG9mIHRoZSBhZGFwdGVyIHRvIGNyZWF0ZSBiYXNlZCBvbiB0aGUgY29udGVudCBvZiB0aGUKKyAgICAgKiBYTUwgcGFyc2VyLgorICAgICAqIAorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZ2VuZXJhdGUgYW4ge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gaWYKKyAgICAgKiA8Y29kZT5hc3NlcnROYW1lPC9jb2RlPiBpcyBub3QgbnVsbCBhbmQgZG9lcyBub3QgbWF0Y2ggdGhlIHJvb3QgdGFnIG9mIHRoZSBYTUwKKyAgICAgKiBkb2N1bWVudC4gCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQmFzZUFkYXB0ZXIgY3JlYXRlQWRhcHRlckZyb21YbWwoQ29udGV4dCBjLAorICAgICAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGlkLCBPYmplY3RbXSBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgU3RyaW5nIGFzc2VydE5hbWUpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgQmFzZUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSBvbiBhIHN0YXJ0IHRhZy4KKyAgICAgICAgaW50IHR5cGU7CisgICAgICAgIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOworCisgICAgICAgIHdoaWxlICgoKHR5cGUgPSBwYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBkZXB0aCkgJiYKKyAgICAgICAgICAgICAgICB0eXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisKKyAgICAgICAgICAgIGlmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChhc3NlcnROYW1lICE9IG51bGwgJiYgIWFzc2VydE5hbWUuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGFkYXB0ZXIgZGVmaW5lZCBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUoaWQpICsgIiBtdXN0IGJlIGEgPCIgKyBuYW1lICsgIiAvPiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoQURBUFRFUl9DVVJTT1IuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgYWRhcHRlciA9IGNyZWF0ZUN1cnNvckFkYXB0ZXIoYywgcGFyc2VyLCBhdHRycywgaWQsIHBhcmFtZXRlcnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGFkYXB0ZXIgbmFtZSAiICsgcGFyc2VyLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGluICIgKyBjLmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKGlkKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYWRhcHRlcjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gWG1sQ3Vyc29yQWRhcHRlciB1c2luZyBhbiBYbWxDdXJzb3JBZGFwdGVyUGFyc2VyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFhtbEN1cnNvckFkYXB0ZXIgY3JlYXRlQ3Vyc29yQWRhcHRlcihDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgaWQsIE9iamVjdFtdIHBhcmFtZXRlcnMpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworCisgICAgICAgIHJldHVybiBuZXcgWG1sQ3Vyc29yQWRhcHRlclBhcnNlcihjLCBwYXJzZXIsIGF0dHJzLCBpZCkucGFyc2UocGFyYW1ldGVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VyIHRoYXQgY2FuIGdlbmVyYXRlIFhtbEN1cnNvckFkYXB0ZXIgaW5zdGFuY2VzLiBUaGlzIHBhcnNlciBpcyByZXNwb25zaWJsZSBmb3IKKyAgICAgKiBoYW5kbGluZyBhbGwgdGhlIGF0dHJpYnV0ZXMgYW5kIGNoaWxkIG5vZGVzIGZvciBhICZsdDtjdXJzb3ItYWRhcHRlciAvJmd0Oy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBYbWxDdXJzb3JBZGFwdGVyUGFyc2VyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0JJTkQgPSAiYmluZCI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9TRUxFQ1QgPSAic2VsZWN0IjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0FTX1NUUklORyA9ICJzdHJpbmciOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfQVNfSU1BR0UgPSAiaW1hZ2UiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfQVNfVEFHID0gInRhZyI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9BU19JTUFHRV9VUkkgPSAiaW1hZ2UtdXJpIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0FTX0RSQVdBQkxFID0gImRyYXdhYmxlIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX01BUCA9ICJtYXAiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfVFJBTlNGT1JNID0gInRyYW5zZm9ybSI7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgICAgICBwcml2YXRlIGZpbmFsIFhtbFB1bGxQYXJzZXIgbVBhcnNlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdHRyaWJ1dGVTZXQgbUF0dHJzOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtSWQ7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgQ3Vyc29yQmluZGVyPiBtQmluZGVyczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBtRnJvbTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW50ZWdlcj4gbVRvOworICAgICAgICBwcml2YXRlIGZpbmFsIEN1cnNvclRyYW5zZm9ybWF0aW9uIG1JZGVudGl0eTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZXMgbVJlc291cmNlczsKKworICAgICAgICBwdWJsaWMgWG1sQ3Vyc29yQWRhcHRlclBhcnNlcihDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBpZCkgeworICAgICAgICAgICAgbUNvbnRleHQgPSBjOworICAgICAgICAgICAgbVBhcnNlciA9IHBhcnNlcjsKKyAgICAgICAgICAgIG1BdHRycyA9IGF0dHJzOworICAgICAgICAgICAgbUlkID0gaWQ7CisKKyAgICAgICAgICAgIG1SZXNvdXJjZXMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIG1CaW5kZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDdXJzb3JCaW5kZXI+KCk7CisgICAgICAgICAgICBtRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgbVRvID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICAgICAgbUlkZW50aXR5ID0gbmV3IElkZW50aXR5VHJhbnNmb3JtYXRpb24obUNvbnRleHQpOyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFhtbEN1cnNvckFkYXB0ZXIgcGFyc2UoT2JqZWN0W10gcGFyYW1ldGVycykKKyAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtUmVzb3VyY2VzOworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gcmVzb3VyY2VzLm9idGFpbkF0dHJpYnV0ZXMobUF0dHJzLCBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXIpOworCisgICAgICAgICAgICBTdHJpbmcgdXJpID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX3VyaSk7CisgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX3NlbGVjdGlvbik7CisgICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX3NvcnRPcmRlcik7CisgICAgICAgICAgICBpbnQgbGF5b3V0ID0gYS5nZXRSZXNvdXJjZUlkKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9sYXlvdXQsIDApOworICAgICAgICAgICAgaWYgKGxheW91dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGxheW91dCBzcGVjaWZpZWQgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICIgZG9lcyBub3QgZXhpc3QiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gbVBhcnNlcjsKKyAgICAgICAgICAgIGludCB0eXBlOworICAgICAgICAgICAgaW50IGRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisKKyAgICAgICAgICAgIHdoaWxlICgoKHR5cGUgPSBwYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBkZXB0aCkgJiYKKyAgICAgICAgICAgICAgICAgICAgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkgeworCisgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOworCisgICAgICAgICAgICAgICAgaWYgKEFEQVBURVJfQ1VSU09SX0JJTkQuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcnNlQmluZFRhZygpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfU0VMRUNULmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBwYXJzZVNlbGVjdFRhZygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHRhZyBuYW1lICIgKyBwYXJzZXIuZ2V0TmFtZSgpICsgIiBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmdbXSBmcm9tQXJyYXkgPSBtRnJvbS50b0FycmF5KG5ldyBTdHJpbmdbbUZyb20uc2l6ZSgpXSk7CisgICAgICAgICAgICBpbnRbXSB0b0FycmF5ID0gbmV3IGludFttVG8uc2l6ZSgpXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9BcnJheS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHRvQXJyYXlbaV0gPSBtVG8uZ2V0KGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZWxlY3Rpb25BcmdzID0gbmV3IFN0cmluZ1twYXJhbWV0ZXJzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb25BcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3NbaV0gPSAoU3RyaW5nKSBwYXJhbWV0ZXJzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxDdXJzb3JBZGFwdGVyKG1Db250ZXh0LCBsYXlvdXQsIHVyaSwgZnJvbUFycmF5LCB0b0FycmF5LCBzZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3MsIHNvcnRPcmRlciwgbUJpbmRlcnMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlU2VsZWN0VGFnKCkgeworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gbVJlc291cmNlcy5vYnRhaW5BdHRyaWJ1dGVzKG1BdHRycywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1NlbGVjdEl0ZW0pOworCisgICAgICAgICAgICBTdHJpbmcgZnJvbU5hbWUgPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfU2VsZWN0SXRlbV9jb2x1bW4pOworICAgICAgICAgICAgaWYgKGZyb21OYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIHNlbGVjdCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgaGF2ZSBhICdjb2x1bW4nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgbUZyb20uYWRkKGZyb21OYW1lKTsKKyAgICAgICAgICAgIG1Uby5hZGQoVmlldy5OT19JRCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcGFyc2VCaW5kVGFnKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtUmVzb3VyY2VzOworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gcmVzb3VyY2VzLm9idGFpbkF0dHJpYnV0ZXMobUF0dHJzLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfQmluZEl0ZW0pOworCisgICAgICAgICAgICBTdHJpbmcgZnJvbU5hbWUgPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfQmluZEl0ZW1fZnJvbSk7CisgICAgICAgICAgICBpZiAoZnJvbU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgYmluZCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGhhdmUgYSAnZnJvbScgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCB0b05hbWUgPSBhLmdldFJlc291cmNlSWQoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX0JpbmRJdGVtX3RvLCAwKTsKKyAgICAgICAgICAgIGlmICh0b05hbWUgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgYmluZCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGhhdmUgYSAndG8nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYXNUeXBlID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX0JpbmRJdGVtX2FzKTsKKyAgICAgICAgICAgIGlmIChhc1R5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgYmluZCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGhhdmUgYW4gJ2FzJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUZyb20uYWRkKGZyb21OYW1lKTsKKyAgICAgICAgICAgIG1Uby5hZGQodG9OYW1lKTsKKyAgICAgICAgICAgIG1CaW5kZXJzLnB1dChmcm9tTmFtZSwgZmluZEJpbmRlcihhc1R5cGUpKTsKKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEN1cnNvckJpbmRlciBmaW5kQmluZGVyKFN0cmluZyB0eXBlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBtUGFyc2VyOworICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gbUNvbnRleHQ7CisgICAgICAgICAgICBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbiA9IG1JZGVudGl0eTsKKworICAgICAgICAgICAgaW50IHRhZ1R5cGU7CisgICAgICAgICAgICBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKKworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0RyYXdhYmxlID0gQURBUFRFUl9DVVJTT1JfQVNfRFJBV0FCTEUuZXF1YWxzKHR5cGUpOyAgICAgICAgICAgIAorCisgICAgICAgICAgICB3aGlsZSAoKCh0YWdUeXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gZGVwdGgpCisgICAgICAgICAgICAgICAgICAgICYmIHRhZ1R5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKworICAgICAgICAgICAgICAgIGlmICh0YWdUeXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKworICAgICAgICAgICAgICAgIGlmIChBREFQVEVSX0NVUlNPUl9UUkFOU0ZPUk0uZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uID0gZmluZFRyYW5zZm9ybWF0aW9uKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBREFQVEVSX0NVUlNPUl9NQVAuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKHRyYW5zZm9ybWF0aW9uIGluc3RhbmNlb2YgTWFwVHJhbnNmb3JtYXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiA9IG5ldyBNYXBUcmFuc2Zvcm1hdGlvbihjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5kTWFwKCgoTWFwVHJhbnNmb3JtYXRpb24pIHRyYW5zZm9ybWF0aW9uKSwgaXNEcmF3YWJsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gdGFnIG5hbWUgIiArIHBhcnNlci5nZXROYW1lKCkgKyAiIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoQURBUFRFUl9DVVJTT1JfQVNfU1RSSU5HLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfQVNfVEFHLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGFnQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfQVNfSU1BR0UuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUJpbmRlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7ICAgICAgICAgICAgCisgICAgICAgICAgICB9IGVsc2UgaWYgKEFEQVBURVJfQ1VSU09SX0FTX0lNQUdFX1VSSS5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEltYWdlVXJpQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNEcmF3YWJsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRHJhd2FibGVCaW5kZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQmluZGVyKHR5cGUsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQ3Vyc29yQmluZGVyIGNyZWF0ZUJpbmRlcihTdHJpbmcgdHlwZSwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChtQ29udGV4dC5pc1Jlc3RyaWN0ZWQoKSkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4ga2xhc3MgPSBDbGFzcy5mb3JOYW1lKHR5cGUsIHRydWUsIG1Db250ZXh0LmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgIGlmIChDdXJzb3JCaW5kZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShrbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uc3RydWN0b3I8Pz4gYyA9IGtsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5jbGFzcywgQ3Vyc29yVHJhbnNmb3JtYXRpb24uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEN1cnNvckJpbmRlcikgYy5uZXdJbnN0YW5jZShtQ29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgYmluZGVyIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIHR5cGUsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIGJpbmRlciB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyB0eXBlLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGZpbmRNYXAoTWFwVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24sIGJvb2xlYW4gZHJhd2FibGUpIHsKKyAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtUmVzb3VyY2VzOworCisgICAgICAgICAgICBUeXBlZEFycmF5IGEgPSByZXNvdXJjZXMub2J0YWluQXR0cmlidXRlcyhtQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9NYXBJdGVtKTsKKworICAgICAgICAgICAgU3RyaW5nIGZyb20gPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfTWFwSXRlbV9mcm9tVmFsdWUpOworICAgICAgICAgICAgaWYgKGZyb20gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgbWFwIGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGhhdmUgYSAnZnJvbVZhbHVlJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFkcmF3YWJsZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0byA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9NYXBJdGVtX3RvVmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0byA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgbWFwIGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgaGF2ZSBhICd0b1ZhbHVlJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24uYWRkU3RyaW5nTWFwcGluZyhmcm9tLCB0byk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCB0byA9IGEuZ2V0UmVzb3VyY2VJZChhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfTWFwSXRlbV90b1ZhbHVlLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAodG8gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIG1hcCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGhhdmUgYSAndG9WYWx1ZScgYXR0cmlidXRlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLmFkZFJlc291cmNlTWFwcGluZyhmcm9tLCB0byk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBDdXJzb3JUcmFuc2Zvcm1hdGlvbiBmaW5kVHJhbnNmb3JtYXRpb24oKSB7CisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbVJlc291cmNlczsKKyAgICAgICAgICAgIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IHJlc291cmNlcy5vYnRhaW5BdHRyaWJ1dGVzKG1BdHRycywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW0pOworCisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW1fd2l0aENsYXNzKTsKKyAgICAgICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBleHByZXNzaW9uID0gYS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfVHJhbnNmb3JtSXRlbV93aXRoRXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gPSBjcmVhdGVFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24oZXhwcmVzc2lvbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFtQ29udGV4dC5pc1Jlc3RyaWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGtsYXMgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgbUNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChDdXJzb3JUcmFuc2Zvcm1hdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGtsYXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25zdHJ1Y3Rvcjw/PiBjID0ga2xhcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKENvbnRleHQuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gPSAoQ3Vyc29yVHJhbnNmb3JtYXRpb24pIGMubmV3SW5zdGFuY2UobUNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSB0cmFuc2Zvcm0gdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgY2xhc3NOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgdHJhbnNmb3JtIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIGNsYXNzTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSB0cmFuc2Zvcm0gdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgY2xhc3NOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIHRyYW5zZm9ybSB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyBjbGFzc05hbWUsIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgdHJhbnNmb3JtIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIGNsYXNzTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIHRyYW5zZm9ybSBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICIgbXVzdCBoYXZlIGEgJ3dpdGhDbGFzcycgb3IgIiArCisgICAgICAgICAgICAgICAgICAgICInd2l0aEV4cHJlc3Npb24nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtYXRpb247CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEN1cnNvclRyYW5zZm9ybWF0aW9uIGNyZWF0ZUV4cHJlc3Npb25UcmFuc2Zvcm1hdGlvbihTdHJpbmcgZXhwcmVzc2lvbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24obUNvbnRleHQsIGV4cHJlc3Npb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHVzZWQgYnkgYWRhcHRlcnMgdGhhdCByZXF1aXJlIHRvIGJlIGxvYWRlZCBhZnRlciBjcmVhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgTWFuYWdlZEFkYXB0ZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogTG9hZHMgdGhlIGNvbnRlbnQgb2YgdGhlIGFkYXB0ZXIsIGFzeW5jaHJvbm91c2x5LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBsb2FkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYSBDdXJzb3IgYWRhcHRlciBkZWZpbmVkIGluIFhNTC4gVGhpcyBjbGFzcyBpcyBhIHRoaW4gd3JhcHBlcgorICAgICAqIG9mIGEgU2ltcGxlQ3Vyc29yQWRhcHRlci4gVGhlIG1haW4gZGlmZmVyZW5jZSBpcyB0aGUgYWJpbGl0eSB0byBoYW5kbGUgQ3Vyc29yQmluZGVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBYbWxDdXJzb3JBZGFwdGVyIGV4dGVuZHMgU2ltcGxlQ3Vyc29yQWRhcHRlciBpbXBsZW1lbnRzIE1hbmFnZWRBZGFwdGVyIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVVyaTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVNlbGVjdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtU2VsZWN0aW9uQXJnczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVNvcnRPcmRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtQ29sdW1uczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDdXJzb3JCaW5kZXJbXSBtQmluZGVyczsKKyAgICAgICAgcHJpdmF0ZSBBc3luY1Rhc2s8Vm9pZCxWb2lkLEN1cnNvcj4gbUxvYWRUYXNrOworCisgICAgICAgIFhtbEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgbGF5b3V0LCBTdHJpbmcgdXJpLCBTdHJpbmdbXSBmcm9tLCBpbnRbXSB0bywKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgc29ydE9yZGVyLAorICAgICAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBDdXJzb3JCaW5kZXI+IGJpbmRlcnMpIHsKKworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbGF5b3V0LCBudWxsLCBmcm9tLCB0byk7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICBtVXJpID0gdXJpOworICAgICAgICAgICAgbVNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKyAgICAgICAgICAgIG1TZWxlY3Rpb25BcmdzID0gc2VsZWN0aW9uQXJnczsKKyAgICAgICAgICAgIG1Tb3J0T3JkZXIgPSBzb3J0T3JkZXI7CisgICAgICAgICAgICBtQ29sdW1ucyA9IG5ldyBTdHJpbmdbZnJvbS5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgbWFuZGF0b3J5IGluIEN1cnNvckFkYXB0ZXIKKyAgICAgICAgICAgIG1Db2x1bW5zWzBdID0gIl9pZCI7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGZyb20sIDAsIG1Db2x1bW5zLCAxLCBmcm9tLmxlbmd0aCk7CisKKyAgICAgICAgICAgIEN1cnNvckJpbmRlciBiYXNpYyA9IG5ldyBTdHJpbmdCaW5kZXIoY29udGV4dCwgbmV3IElkZW50aXR5VHJhbnNmb3JtYXRpb24oY29udGV4dCkpOworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZnJvbS5sZW5ndGg7CisgICAgICAgICAgICBtQmluZGVycyA9IG5ldyBDdXJzb3JCaW5kZXJbY291bnRdOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBDdXJzb3JCaW5kZXIgYmluZGVyID0gYmluZGVycy5nZXQoZnJvbVtpXSk7CisgICAgICAgICAgICAgICAgaWYgKGJpbmRlciA9PSBudWxsKSBiaW5kZXIgPSBiYXNpYzsKKyAgICAgICAgICAgICAgICBtQmluZGVyc1tpXSA9IGJpbmRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBiaW5kVmlldyhWaWV3IHZpZXcsIENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGN1cnNvcikgeworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVRvLmxlbmd0aDsKKyAgICAgICAgICAgIGZpbmFsIGludFtdIGZyb20gPSBtRnJvbTsKKyAgICAgICAgICAgIGZpbmFsIGludFtdIHRvID0gbVRvOworICAgICAgICAgICAgZmluYWwgQ3Vyc29yQmluZGVyW10gYmluZGVycyA9IG1CaW5kZXJzOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHYgPSB2aWV3LmZpbmRWaWV3QnlJZCh0b1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBiaW5kZXJzW2ldLmJpbmQodiwgY3Vyc29yLCBmcm9tW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBsb2FkKCkgeworICAgICAgICAgICAgaWYgKG1VcmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Mb2FkVGFzayA9IG5ldyBRdWVyeVRhc2soKS5leGVjdXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldFVyaShTdHJpbmcgdXJpKSB7CisgICAgICAgICAgICBtVXJpID0gdXJpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNoYW5nZUN1cnNvcihDdXJzb3IgYykgeworICAgICAgICAgICAgaWYgKG1Mb2FkVGFzayAhPSBudWxsICYmIG1Mb2FkVGFzay5nZXRTdGF0dXMoKSAhPSBRdWVyeVRhc2suU3RhdHVzLkZJTklTSEVEKSB7CisgICAgICAgICAgICAgICAgbUxvYWRUYXNrLmNhbmNlbCh0cnVlKTsKKyAgICAgICAgICAgICAgICBtTG9hZFRhc2sgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXIuY2hhbmdlQ3Vyc29yKGMpOworICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgUXVlcnlUYXNrIGV4dGVuZHMgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIEN1cnNvcj4geworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgQ3Vyc29yIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Db250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQWN0aXZpdHkpIG1Db250ZXh0KS5tYW5hZ2VkUXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpLnBhcnNlKG1VcmkpLCBtQ29sdW1ucywgbVNlbGVjdGlvbiwgbVNlbGVjdGlvbkFyZ3MsIG1Tb3J0T3JkZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcmkucGFyc2UobVVyaSksIG1Db2x1bW5zLCBtU2VsZWN0aW9uLCBtU2VsZWN0aW9uQXJncywgbVNvcnRPcmRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICAgICAgICAgIGlmICghaXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBYbWxDdXJzb3JBZGFwdGVyLnN1cGVyLmNoYW5nZUN1cnNvcihjdXJzb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElkZW50aXR5IHRyYW5zZm9ybWF0aW9uLCByZXR1cm5zIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgY29sdW1uIGFzIGEgU3RyaW5nLAorICAgICAqIHdpdGhvdXQgcGVyZm9ybWluZyBhbnkgbWFuaXB1bGF0aW9uLiBUaGlzIGlzIHVzZWQgd2hlbiBubyB0cmFuc2Zvcm1hdGlvbiBpcyBzcGVjaWZpZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWRlbnRpdHlUcmFuc2Zvcm1hdGlvbiBleHRlbmRzIEN1cnNvclRyYW5zZm9ybWF0aW9uIHsKKyAgICAgICAgcHVibGljIElkZW50aXR5VHJhbnNmb3JtYXRpb24oQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbkluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGV4cHJlc3Npb24gdHJhbnNmb3JtYXRpb24gaXMgYSBzaW1wbGUgdGVtcGxhdGUgYmFzZWQgcmVwbGFjZW1lbnQgdXRpbGl0eS4KKyAgICAgKiBJbiBhbiBleHByZXNzaW9uLCBlYWNoIHNlZ21lbnQgb2YgdGhlIGZvcm0gPGNvZGU+eyhbXn1dKyl9PC9jb2RlPiBpcyByZXBsYWNlZAorICAgICAqIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4gb2YgbmFtZSAkMS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24gZXh0ZW5kcyBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgRXhwcmVzc2lvbk5vZGUgbUZpcnN0Tm9kZSA9IG5ldyBDb25zdGFudEV4cHJlc3Npb25Ob2RlKCIiKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyIG1CdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBwdWJsaWMgRXhwcmVzc2lvblRyYW5zZm9ybWF0aW9uKENvbnRleHQgY29udGV4dCwgU3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworCisgICAgICAgICAgICBwYXJzZShleHByZXNzaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwYXJzZShTdHJpbmcgZXhwcmVzc2lvbikgeworICAgICAgICAgICAgRXhwcmVzc2lvbk5vZGUgbm9kZSA9IG1GaXJzdE5vZGU7CisgICAgICAgICAgICBpbnQgc2VnbWVudFN0YXJ0OworICAgICAgICAgICAgaW50IGNvdW50ID0gZXhwcmVzc2lvbi5sZW5ndGgoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gZXhwcmVzc2lvbi5jaGFyQXQoaSk7CisgICAgICAgICAgICAgICAgLy8gU3RhcnQgYSBjb2x1bW4gbmFtZSBzZWdtZW50CisgICAgICAgICAgICAgICAgc2VnbWVudFN0YXJ0ID0gaTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAneycpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBjb3VudCAmJiAoYyA9IGV4cHJlc3Npb24uY2hhckF0KGkpKSAhPSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQsIGJ1dCB0aGUgZXhwcmVzc2lvbiBkaWRuJ3QgY2xvc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgdHJhbnNmb3JtIGV4cHJlc3Npb24gY29udGFpbnMgYSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1jbG9zZWQgY29sdW1uIG5hbWU6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLnN1YnN0cmluZyhzZWdtZW50U3RhcnQgKyAxLCBpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbm9kZS5uZXh0ID0gbmV3IENvbHVtbkV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb24uc3Vic3RyaW5nKHNlZ21lbnRTdGFydCArIDEsIGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGNvdW50ICYmIChjID0gZXhwcmVzc2lvbi5jaGFyQXQoaSkpICE9ICd7JykgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5vZGUubmV4dCA9IG5ldyBDb25zdGFudEV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb24uc3Vic3RyaW5nKHNlZ21lbnRTdGFydCwgaSkpOworICAgICAgICAgICAgICAgICAgICAvLyBSZXdpbmQgaWYgd2UndmUgcmVhY2hlZCBhIGNvbHVtbiBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICd7JykgaS0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbUJ1aWxkZXI7CisgICAgICAgICAgICBidWlsZGVyLmRlbGV0ZSgwLCBidWlsZGVyLmxlbmd0aCgpKTsKKworICAgICAgICAgICAgRXhwcmVzc2lvbk5vZGUgbm9kZSA9IG1GaXJzdE5vZGU7CisgICAgICAgICAgICAvLyBTa2lwIHRoZSBmaXJzdCBub2RlCisgICAgICAgICAgICB3aGlsZSAoKG5vZGUgPSBub2RlLm5leHQpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChub2RlLmFzU3RyaW5nKGN1cnNvcikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb25Ob2RlIHsKKyAgICAgICAgICAgIHB1YmxpYyBFeHByZXNzaW9uTm9kZSBuZXh0OworCisgICAgICAgICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGFzU3RyaW5nKEN1cnNvciBjdXJzb3IpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNsYXNzIENvbnN0YW50RXhwcmVzc2lvbk5vZGUgZXh0ZW5kcyBFeHByZXNzaW9uTm9kZSB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ29uc3RhbnQ7CisKKyAgICAgICAgICAgIENvbnN0YW50RXhwcmVzc2lvbk5vZGUoU3RyaW5nIGNvbnN0YW50KSB7CisgICAgICAgICAgICAgICAgbUNvbnN0YW50ID0gY29uc3RhbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBhc1N0cmluZyhDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Db25zdGFudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBjbGFzcyBDb2x1bW5FeHByZXNzaW9uTm9kZSBleHRlbmRzIEV4cHJlc3Npb25Ob2RlIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Db2x1bW5OYW1lOworICAgICAgICAgICAgcHJpdmF0ZSBDdXJzb3IgbVNpZ25hdHVyZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1Db2x1bW5JbmRleCA9IC0xOworCisgICAgICAgICAgICBDb2x1bW5FeHByZXNzaW9uTm9kZShTdHJpbmcgY29sdW1uTmFtZSkgeworICAgICAgICAgICAgICAgIG1Db2x1bW5OYW1lID0gY29sdW1uTmFtZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGFzU3RyaW5nKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG1TaWduYXR1cmUgfHwgbUNvbHVtbkluZGV4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db2x1bW5JbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChtQ29sdW1uTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYXR1cmUgPSBjdXJzb3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRTdHJpbmcobUNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbWFwIHRyYW5zZm9ybWF0aW9uIG9mZmVycyBhIHNpbXBsZSBtYXBwaW5nIGJldHdlZW4gc3BlY2lmaWVkIFN0cmluZyB2YWx1ZXMKKyAgICAgKiB0byBTdHJpbmdzIG9yIGludGVnZXJzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1hcFRyYW5zZm9ybWF0aW9uIGV4dGVuZHMgQ3Vyc29yVHJhbnNmb3JtYXRpb24geworICAgICAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1TdHJpbmdNYXBwaW5nczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gbVJlc291cmNlTWFwcGluZ3M7CisKKyAgICAgICAgcHVibGljIE1hcFRyYW5zZm9ybWF0aW9uKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgICAgICBtU3RyaW5nTWFwcGluZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgICAgIG1SZXNvdXJjZU1hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhZGRTdHJpbmdNYXBwaW5nKFN0cmluZyBmcm9tLCBTdHJpbmcgdG8pIHsKKyAgICAgICAgICAgIG1TdHJpbmdNYXBwaW5ncy5wdXQoZnJvbSwgdG8pOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhZGRSZXNvdXJjZU1hcHBpbmcoU3RyaW5nIGZyb20sIGludCB0bykgeworICAgICAgICAgICAgbVJlc291cmNlTWFwcGluZ3MucHV0KGZyb20sIHRvKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGN1cnNvci5nZXRTdHJpbmcoY29sdW1uSW5kZXgpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRyYW5zZm9ybWVkID0gbVN0cmluZ01hcHBpbmdzLmdldCh2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWQgPT0gbnVsbCA/IHZhbHVlIDogdHJhbnNmb3JtZWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCB0cmFuc2Zvcm1Ub1Jlc291cmNlKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gY3Vyc29yLmdldFN0cmluZyhjb2x1bW5JbmRleCk7CisgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHRyYW5zZm9ybWVkID0gbVJlc291cmNlTWFwcGluZ3MuZ2V0KHZhbHVlKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkID09IG51bGwgPyBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSA6IHRyYW5zZm9ybWVkOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgU3RyaW5nIHRvIGEgVGV4dFZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RyaW5nQmluZGVyIGV4dGVuZHMgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgcHVibGljIFN0cmluZ0JpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBUZXh0VmlldykgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gbVRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShjdXJzb3IsIGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgICAgICAoKFRleHRWaWV3KSB2aWV3KS5zZXRUZXh0KHRleHQpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQmluZHMgYW4gaW1hZ2UgYmxvYiB0byBhbiBJbWFnZVZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW1hZ2VCaW5kZXIgZXh0ZW5kcyBDdXJzb3JCaW5kZXIgeworICAgICAgICBwdWJsaWMgSW1hZ2VCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgSW1hZ2VWaWV3KSB7CisgICAgICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGRhdGEgPSBjdXJzb3IuZ2V0QmxvYihjb2x1bW5JbmRleCk7CisgICAgICAgICAgICAgICAgKChJbWFnZVZpZXcpIHZpZXcpLnNldEltYWdlQml0bWFwKEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KGRhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmxlbmd0aCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGFnQmluZGVyIGV4dGVuZHMgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgcHVibGljIFRhZ0JpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRleHQgPSBtVHJhbnNmb3JtYXRpb24udHJhbnNmb3JtKGN1cnNvciwgY29sdW1uSW5kZXgpOworICAgICAgICAgICAgdmlldy5zZXRUYWcodGV4dCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIGFuIGltYWdlIFVSSSB0byBhbiBJbWFnZVZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW1hZ2VVcmlCaW5kZXIgZXh0ZW5kcyBDdXJzb3JCaW5kZXIgeworICAgICAgICBwdWJsaWMgSW1hZ2VVcmlCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgSW1hZ2VWaWV3KSB7CisgICAgICAgICAgICAgICAgKChJbWFnZVZpZXcpIHZpZXcpLnNldEltYWdlVVJJKFVyaS5wYXJzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2Zvcm1hdGlvbi50cmFuc2Zvcm0oY3Vyc29yLCBjb2x1bW5JbmRleCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgZHJhd2FibGUgcmVzb3VyY2UgaWRlbnRpZmllciB0byBhbiBJbWFnZVZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRHJhd2FibGVCaW5kZXIgZXh0ZW5kcyBDdXJzb3JCaW5kZXIgeworICAgICAgICBwdWJsaWMgRHJhd2FibGVCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgSW1hZ2VWaWV3KSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHJlc291cmNlID0gbVRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybVRvUmVzb3VyY2UoY3Vyc29yLCBjb2x1bW5JbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlID09IDApIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgICgoSW1hZ2VWaWV3KSB2aWV3KS5zZXRJbWFnZVJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BcnJheUFkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BcnJheUFkYXB0ZXIuamF2YQppbmRleCAwM2FkYTk0Li5iNGVjZTI0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXJyYXlBZGFwdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FycmF5QWRhcHRlci5qYXZhCkBAIC0zMCwxNyArMzAsMTcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiAKIC8qKgotICogQSBMaXN0QWRhcHRlciB0aGF0IG1hbmFnZXMgYSBMaXN0VmlldyBiYWNrZWQgYnkgYW4gYXJyYXkgb2YgYXJiaXRyYXJ5CisgKiBBIGNvbmNyZXRlIEJhc2VBZGFwdGVyIHRoYXQgaXMgYmFja2VkIGJ5IGFuIGFycmF5IG9mIGFyYml0cmFyeQogICogb2JqZWN0cy4gIEJ5IGRlZmF1bHQgdGhpcyBjbGFzcyBleHBlY3RzIHRoYXQgdGhlIHByb3ZpZGVkIHJlc291cmNlIGlkIHJlZmVyZW5jZXMKICAqIGEgc2luZ2xlIFRleHRWaWV3LiAgSWYgeW91IHdhbnQgdG8gdXNlIGEgbW9yZSBjb21wbGV4IGxheW91dCwgdXNlIHRoZSBjb25zdHJ1Y3RvcnMgdGhhdAogICogYWxzbyB0YWtlcyBhIGZpZWxkIGlkLiAgVGhhdCBmaWVsZCBpZCBzaG91bGQgcmVmZXJlbmNlIGEgVGV4dFZpZXcgaW4gdGhlIGxhcmdlciBsYXlvdXQKICAqIHJlc291cmNlLgogICoKLSAqIEhvd2V2ZXIgdGhlIFRleHRWaWV3IGlzIHJlZmVyZW5jZWQsIGl0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHRvU3RyaW5nKCkgb2YgZWFjaCBvYmplY3QgaW4KKyAqIDxwPkhvd2V2ZXIgdGhlIFRleHRWaWV3IGlzIHJlZmVyZW5jZWQsIGl0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHRvU3RyaW5nKCkgb2YgZWFjaCBvYmplY3QgaW4KICAqIHRoZSBhcnJheS4gWW91IGNhbiBhZGQgbGlzdHMgb3IgYXJyYXlzIG9mIGN1c3RvbSBvYmplY3RzLiBPdmVycmlkZSB0aGUgdG9TdHJpbmcoKSBtZXRob2QKICAqIG9mIHlvdXIgb2JqZWN0cyB0byBkZXRlcm1pbmUgd2hhdCB0ZXh0IHdpbGwgYmUgZGlzcGxheWVkIGZvciB0aGUgaXRlbSBpbiB0aGUgbGlzdC4KICAqCi0gKiBUbyB1c2Ugc29tZXRoaW5nIG90aGVyIHRoYW4gVGV4dFZpZXdzIGZvciB0aGUgYXJyYXkgZGlzcGxheSwgZm9yIGluc3RhbmNlLCBJbWFnZVZpZXdzLAorICogPHA+VG8gdXNlIHNvbWV0aGluZyBvdGhlciB0aGFuIFRleHRWaWV3cyBmb3IgdGhlIGFycmF5IGRpc3BsYXksIGZvciBpbnN0YW5jZSwgSW1hZ2VWaWV3cywKICAqIG9yIHRvIGhhdmUgc29tZSBvZiBkYXRhIGJlc2lkZXMgdG9TdHJpbmcoKSByZXN1bHRzIGZpbGwgdGhlIHZpZXdzLAogICogb3ZlcnJpZGUge0BsaW5rICNnZXRWaWV3KGludCwgVmlldywgVmlld0dyb3VwKX0gdG8gcmV0dXJuIHRoZSB0eXBlIG9mIHZpZXcgeW91IHdhbnQuCiAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BdXRvQ29tcGxldGVUZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0F1dG9Db21wbGV0ZVRleHRWaWV3LmphdmEKaW5kZXggMzk3MTQ4Ny4uZTA3YmVmYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0F1dG9Db21wbGV0ZVRleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0F1dG9Db21wbGV0ZVRleHRWaWV3LmphdmEKQEAgLTI5LDEzICsyOSwxMiBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuQ29tcGxldGlvbkluZm87Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIApAQCAtOTMsNDUgKzkyLDIxIEBACiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBdXRvQ29tcGxldGVUZXh0VmlldyI7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElOVF9WSUVXX0lEID0gMHgxNzsKLQotICAgIC8qKgotICAgICAqIFRoaXMgdmFsdWUgY29udHJvbHMgdGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIHVzZXIKLSAgICAgKiBtdXN0IGxlYXZlIGEgcG9pbnRlciBkb3duIHdpdGhvdXQgc2Nyb2xsaW5nIHRvIGV4cGFuZAotICAgICAqIHRoZSBhdXRvY29tcGxldGUgZHJvcGRvd24gbGlzdCB0byBjb3ZlciB0aGUgSU1FLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfTElTVF9USU1FT1VUID0gMjUwOwotCiAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbUhpbnRUZXh0OworICAgIHByaXZhdGUgVGV4dFZpZXcgbUhpbnRWaWV3OwogICAgIHByaXZhdGUgaW50IG1IaW50UmVzb3VyY2U7CiAKICAgICBwcml2YXRlIExpc3RBZGFwdGVyIG1BZGFwdGVyOwogICAgIHByaXZhdGUgRmlsdGVyIG1GaWx0ZXI7CiAgICAgcHJpdmF0ZSBpbnQgbVRocmVzaG9sZDsKIAotICAgIHByaXZhdGUgUG9wdXBXaW5kb3cgbVBvcHVwOwotICAgIHByaXZhdGUgRHJvcERvd25MaXN0VmlldyBtRHJvcERvd25MaXN0OwotICAgIHByaXZhdGUgaW50IG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0OwotICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQ7CisgICAgcHJpdmF0ZSBMaXN0UG9wdXBXaW5kb3cgbVBvcHVwOwogICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkFuY2hvcklkOwotICAgIHByaXZhdGUgVmlldyBtRHJvcERvd25BbmNob3JWaWV3OyAgLy8gdmlldyBpcyByZXRyaWV2ZWQgbGF6aWx5IGZyb20gaWQgb25jZSBuZWVkZWQKLSAgICBwcml2YXRlIGludCBtRHJvcERvd25XaWR0aDsKLSAgICBwcml2YXRlIGludCBtRHJvcERvd25IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7Ci0KLSAgICBwcml2YXRlIERyYXdhYmxlIG1Ecm9wRG93bkxpc3RIaWdobGlnaHQ7CiAKICAgICBwcml2YXRlIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgbUl0ZW1DbGlja0xpc3RlbmVyOwogICAgIHByaXZhdGUgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBtSXRlbVNlbGVjdGVkTGlzdGVuZXI7CiAKLSAgICBwcml2YXRlIGZpbmFsIERyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIgbURyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIgPQotICAgICAgICAgICAgbmV3IERyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIoKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtRHJvcERvd25BbHdheXNWaXNpYmxlID0gZmFsc2U7Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gbURyb3BEb3duRGlzbWlzc2VkT25Db21wbGV0aW9uID0gdHJ1ZTsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoID0gZmFsc2U7CiAKICAgICBwcml2YXRlIGludCBtTGFzdEtleUNvZGUgPSBLZXlFdmVudC5LRVlDT0RFX1VOS05PV047CiAgICAgcHJpdmF0ZSBib29sZWFuIG1PcGVuQmVmb3JlOwpAQCAtMTQwLDEwICsxMTUsNiBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1CbG9ja0NvbXBsZXRpb247CiAKLSAgICBwcml2YXRlIExpc3RTZWxlY3RvckhpZGVyIG1IaWRlU2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBSdW5uYWJsZSBtU2hvd0Ryb3BEb3duUnVubmFibGU7Ci0gICAgcHJpdmF0ZSBSdW5uYWJsZSBtUmVzaXplUG9wdXBSdW5uYWJsZSA9IG5ldyBSZXNpemVQb3B1cFJ1bm5hYmxlKCk7Ci0KICAgICBwcml2YXRlIFBhc3NUaHJvdWdoQ2xpY2tMaXN0ZW5lciBtUGFzc1Rocm91Z2hDbGlja0xpc3RlbmVyOwogICAgIHByaXZhdGUgUG9wdXBEYXRhU2V0T2JzZXJ2ZXIgbU9ic2VydmVyOwogCkBAIC0xNTgsOSArMTI5LDEwIEBACiAgICAgcHVibGljIEF1dG9Db21wbGV0ZVRleHRWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKIAotICAgICAgICBtUG9wdXAgPSBuZXcgUG9wdXBXaW5kb3coY29udGV4dCwgYXR0cnMsCisgICAgICAgIG1Qb3B1cCA9IG5ldyBMaXN0UG9wdXBXaW5kb3coY29udGV4dCwgYXR0cnMsCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmF1dG9Db21wbGV0ZVRleHRWaWV3U3R5bGUpOwogICAgICAgICBtUG9wdXAuc2V0U29mdElucHV0TW9kZShXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX0FESlVTVF9SRVNJWkUpOworICAgICAgICBtUG9wdXAuc2V0UHJvbXB0UG9zaXRpb24oTGlzdFBvcHVwV2luZG93LlBPU0lUSU9OX1BST01QVF9CRUxPVyk7CiAKICAgICAgICAgVHlwZWRBcnJheSBhID0KICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcygKQEAgLTE2OSwxNCArMTQxLDExIEBACiAgICAgICAgIG1UaHJlc2hvbGQgPSBhLmdldEludCgKICAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19jb21wbGV0aW9uVGhyZXNob2xkLCAyKTsKIAotICAgICAgICBtSGludFRleHQgPSBhLmdldFRleHQoUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvbkhpbnQpOwotCi0gICAgICAgIG1Ecm9wRG93bkxpc3RIaWdobGlnaHQgPSBhLmdldERyYXdhYmxlKAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duU2VsZWN0b3IpOwotICAgICAgICBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCA9IChpbnQpCi0gICAgICAgICAgICAgICAgYS5nZXREaW1lbnNpb24oUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25WZXJ0aWNhbE9mZnNldCwgMC4wZik7Ci0gICAgICAgIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQgPSAoaW50KQotICAgICAgICAgICAgICAgIGEuZ2V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duSG9yaXpvbnRhbE9mZnNldCwgMC4wZik7CisgICAgICAgIG1Qb3B1cC5zZXRMaXN0U2VsZWN0b3IoYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93blNlbGVjdG9yKSk7CisgICAgICAgIG1Qb3B1cC5zZXRWZXJ0aWNhbE9mZnNldCgoaW50KQorICAgICAgICAgICAgICAgIGEuZ2V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duVmVydGljYWxPZmZzZXQsIDAuMGYpKTsKKyAgICAgICAgbVBvcHVwLnNldEhvcml6b250YWxPZmZzZXQoKGludCkKKyAgICAgICAgICAgICAgICBhLmdldERpbWVuc2lvbihSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bkhvcml6b250YWxPZmZzZXQsIDAuMGYpKTsKICAgICAgICAgCiAgICAgICAgIC8vIEdldCB0aGUgYW5jaG9yJ3MgaWQgbm93LCBidXQgdGhlIHZpZXcgd29uJ3QgYmUgcmVhZHksIHNvIHdhaXQgdG8gYWN0dWFsbHkgZ2V0IHRoZQogICAgICAgICAvLyB2aWV3IGFuZCBzdG9yZSBpdCBpbiBtRHJvcERvd25BbmNob3JWaWV3IGxhemlseSBpbiBnZXREcm9wRG93bkFuY2hvclZpZXcgbGF0ZXIuCkBAIC0xODcsMTMgKzE1NiwxOCBAQAogICAgICAgICAKICAgICAgICAgLy8gRm9yIGRyb3Bkb3duIHdpZHRoLCB0aGUgZGV2ZWxvcGVyIGNhbiBzcGVjaWZ5IGEgc3BlY2lmaWMgd2lkdGgsIG9yIE1BVENIX1BBUkVOVAogICAgICAgICAvLyAoZm9yIGZ1bGwgc2NyZWVuIHdpZHRoKSBvciBXUkFQX0NPTlRFTlQgKHRvIG1hdGNoIHRoZSB3aWR0aCBvZiB0aGUgYW5jaG9yZWQgdmlldykuCi0gICAgICAgIG1Ecm9wRG93bldpZHRoID0gYS5nZXRMYXlvdXREaW1lbnNpb24oUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25XaWR0aCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0gICAgICAgIG1Ecm9wRG93bkhlaWdodCA9IGEuZ2V0TGF5b3V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duSGVpZ2h0LAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICAgICAgbVBvcHVwLnNldFdpZHRoKGEuZ2V0TGF5b3V0RGltZW5zaW9uKAorICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duV2lkdGgsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKKyAgICAgICAgbVBvcHVwLnNldEhlaWdodChhLmdldExheW91dERpbWVuc2lvbigKKyAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bkhlaWdodCwKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkpOwogCiAgICAgICAgIG1IaW50UmVzb3VyY2UgPSBhLmdldFJlc291cmNlSWQoUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvbkhpbnRWaWV3LAogICAgICAgICAgICAgICAgIFIubGF5b3V0LnNpbXBsZV9kcm9wZG93bl9oaW50KTsKKyAgICAgICAgCisgICAgICAgIG1Qb3B1cC5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG5ldyBEcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyKCkpOworICAgICAgICBzZXRDb21wbGV0aW9uSGludChhLmdldFRleHQoUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvbkhpbnQpKTsKIAogICAgICAgICAvLyBBbHdheXMgdHVybiBvbiB0aGUgYXV0byBjb21wbGV0ZSBpbnB1dCB0eXBlIGZsYWcsIHNpbmNlIGl0CiAgICAgICAgIC8vIG1ha2VzIG5vIHNlbnNlIHRvIHVzZSB0aGlzIHdpZGdldCB3aXRob3V0IGl0LgpAQCAtMjQxLDYgKzIxNSwyMCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbXBsZXRpb25IaW50KENoYXJTZXF1ZW5jZSBoaW50KSB7CiAgICAgICAgIG1IaW50VGV4dCA9IGhpbnQ7CisgICAgICAgIGlmIChoaW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtSGludFZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFRleHRWaWV3IGhpbnRWaWV3ID0gKFRleHRWaWV3KSBMYXlvdXRJbmZsYXRlci5mcm9tKGdldENvbnRleHQoKSkuaW5mbGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1IaW50UmVzb3VyY2UsIG51bGwpLmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnRleHQxKTsKKyAgICAgICAgICAgICAgICBoaW50Vmlldy5zZXRUZXh0KG1IaW50VGV4dCk7CisgICAgICAgICAgICAgICAgbUhpbnRWaWV3ID0gaGludFZpZXc7CisgICAgICAgICAgICAgICAgbVBvcHVwLnNldFByb21wdFZpZXcoaGludFZpZXcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSGludFZpZXcuc2V0VGV4dChoaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRQcm9tcHRWaWV3KG51bGwpOworICAgICAgICAgICAgbUhpbnRWaWV3ID0gbnVsbDsKKyAgICAgICAgfQogICAgIH0KICAgICAKICAgICAvKioKQEAgLTI1Myw3ICsyNDEsNyBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0F1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duV2lkdGgKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERyb3BEb3duV2lkdGgoKSB7Ci0gICAgICAgIHJldHVybiBtRHJvcERvd25XaWR0aDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRXaWR0aCgpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTI2Niw3ICsyNTQsNyBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0F1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duV2lkdGgKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREcm9wRG93bldpZHRoKGludCB3aWR0aCkgewotICAgICAgICBtRHJvcERvd25XaWR0aCA9IHdpZHRoOworICAgICAgICBtUG9wdXAuc2V0V2lkdGgod2lkdGgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjgwLDcgKzI2OCw3IEBACiAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25IZWlnaHQKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERyb3BEb3duSGVpZ2h0KCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duSGVpZ2h0OworICAgICAgICByZXR1cm4gbVBvcHVwLmdldEhlaWdodCgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjk0LDcgKzI4Miw3IEBACiAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25IZWlnaHQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREcm9wRG93bkhlaWdodChpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIG1Ecm9wRG93bkhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgbVBvcHVwLnNldEhlaWdodChoZWlnaHQpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTMxOSw3ICszMDcsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duQW5jaG9yKGludCBpZCkgewogICAgICAgICBtRHJvcERvd25BbmNob3JJZCA9IGlkOwotICAgICAgICBtRHJvcERvd25BbmNob3JWaWV3ID0gbnVsbDsKKyAgICAgICAgbVBvcHVwLnNldEFuY2hvclZpZXcobnVsbCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMzYxLDcgKzM0OSw3IEBACiAgICAgICogQHBhcmFtIG9mZnNldCB0aGUgdmVydGljYWwgb2Zmc2V0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25WZXJ0aWNhbE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBtUG9wdXAuc2V0VmVydGljYWxPZmZzZXQob2Zmc2V0KTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zNzAsNyArMzU4LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSB2ZXJ0aWNhbCBvZmZzZXQKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERyb3BEb3duVmVydGljYWxPZmZzZXQoKSB7Ci0gICAgICAgIHJldHVybiBtRHJvcERvd25WZXJ0aWNhbE9mZnNldDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRWZXJ0aWNhbE9mZnNldCgpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTM3OSw3ICszNjcsNyBAQAogICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIGhvcml6b250YWwgb2Zmc2V0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0KGludCBvZmZzZXQpIHsKLSAgICAgICAgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgbVBvcHVwLnNldEhvcml6b250YWxPZmZzZXQob2Zmc2V0KTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zODgsNyArMzc2LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBob3Jpem9udGFsIG9mZnNldAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRIb3Jpem9udGFsT2Zmc2V0KCk7CiAgICAgfQogCiAgICAgIC8qKgpAQCAtNDI1LDcgKzQxMyw3IEBACiAgICAgICogQGhpZGUgUGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duQWx3YXlzVmlzaWJsZTsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDQyLDcgKzQzMCw3IEBACiAgICAgICogQGhpZGUgUGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duQWx3YXlzVmlzaWJsZShib29sZWFuIGRyb3BEb3duQWx3YXlzVmlzaWJsZSkgewotICAgICAgICBtRHJvcERvd25BbHdheXNWaXNpYmxlID0gZHJvcERvd25BbHdheXNWaXNpYmxlOworICAgICAgICBtUG9wdXAuc2V0RHJvcERvd25BbHdheXNWaXNpYmxlKGRyb3BEb3duQWx3YXlzVmlzaWJsZSk7CiAgICAgfQogICAgCiAgICAgLyoqCkBAIC02MDksMTUgKzU5NywxMyBAQAogICAgICAgICAgICAgbUZpbHRlciA9IG51bGw7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobURyb3BEb3duTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIobUFkYXB0ZXIpOwotICAgICAgICB9CisgICAgICAgIG1Qb3B1cC5zZXRBZGFwdGVyKG1BZGFwdGVyKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbktleVByZUltZShpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9CQUNLICYmIGlzUG9wdXBTaG93aW5nKCkKLSAgICAgICAgICAgICAgICAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICAgICAgICAgICYmICFtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKSkgewogICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB0aGUgYmFjayBrZXksIHdlIGRvIG5vdCBldmVuIHRyeSB0byBzZW5kIGl0CiAgICAgICAgICAgICAvLyB0byB0aGUgZHJvcCBkb3duIGxpc3QgYnV0IGluc3RlYWQsIGNvbnN1bWUgaXQgaW1tZWRpYXRlbHkKICAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTiAmJiBldmVudC5nZXRSZXBlYXRDb3VudCgpID09IDApIHsKQEAgLTYzNiwxOCArNjIyLDE2IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICBpZiAoaXNQb3B1cFNob3dpbmcoKSAmJiBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkgPj0gMCkgewotICAgICAgICAgICAgYm9vbGVhbiBjb25zdW1lZCA9IG1Ecm9wRG93bkxpc3Qub25LZXlVcChrZXlDb2RlLCBldmVudCk7Ci0gICAgICAgICAgICBpZiAoY29uc3VtZWQpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGxpc3QgYWNjZXB0cyB0aGUga2V5IGV2ZW50cyBhbmQgdGhlIGtleSBldmVudAotICAgICAgICAgICAgICAgICAgICAvLyB3YXMgYSBjbGljaywgdGhlIHRleHQgdmlldyBnZXRzIHRoZSBzZWxlY3RlZCBpdGVtCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGRyb3AgZG93biBhcyBpdHMgY29udGVudAotICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1Db21wbGV0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gY29uc3VtZWQgPSBtUG9wdXAub25LZXlVcChrZXlDb2RlLCBldmVudCk7CisgICAgICAgIGlmIChjb25zdW1lZCkgeworICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICAvLyBpZiB0aGUgbGlzdCBhY2NlcHRzIHRoZSBrZXkgZXZlbnRzIGFuZCB0aGUga2V5IGV2ZW50CisgICAgICAgICAgICAvLyB3YXMgYSBjbGljaywgdGhlIHRleHQgdmlldyBnZXRzIHRoZSBzZWxlY3RlZCBpdGVtCisgICAgICAgICAgICAvLyBmcm9tIHRoZSBkcm9wIGRvd24gYXMgaXRzIGNvbnRlbnQKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9FTlRFUjoKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKKyAgICAgICAgICAgICAgICBwZXJmb3JtQ29tcGxldGlvbigpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdXBlci5vbktleVVwKGtleUNvZGUsIGV2ZW50KTsKQEAgLTY1NSw4NyArNjM5LDExIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIC8vIHdoZW4gdGhlIGRyb3AgZG93biBpcyBzaG93biwgd2UgZHJpdmUgaXQgZGlyZWN0bHkKLSAgICAgICAgaWYgKGlzUG9wdXBTaG93aW5nKCkpIHsKLSAgICAgICAgICAgIC8vIHRoZSBrZXkgZXZlbnRzIGFyZSBmb3J3YXJkZWQgdG8gdGhlIGxpc3QgaW4gdGhlIGRyb3AgZG93biB2aWV3Ci0gICAgICAgICAgICAvLyBub3RlIHRoYXQgTGlzdFZpZXcgaGFuZGxlcyBzcGFjZSBidXQgd2UgZG9uJ3Qgd2FudCB0aGF0IHRvIGhhcHBlbgotICAgICAgICAgICAgLy8gYWxzbyBpZiBzZWxlY3Rpb24gaXMgbm90IGN1cnJlbnRseSBpbiB0aGUgZHJvcCBkb3duLCB0aGVuIGRvbid0Ci0gICAgICAgICAgICAvLyBsZXQgY2VudGVyIG9yIGVudGVyIHByZXNzZXMgZ28gdGhlcmUgc2luY2UgdGhhdCB3b3VsZCBjYXVzZSBpdAotICAgICAgICAgICAgLy8gdG8gc2VsZWN0IG9uZSBvZiBpdHMgaXRlbXMKLSAgICAgICAgICAgIGlmIChrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfU1BBQ0UKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSA+PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9FTlRFUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYga2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKSkpIHsKLSAgICAgICAgICAgICAgICBpbnQgY3VySW5kZXggPSBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBjb25zdW1lZDsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYmVsb3cgPSAhbVBvcHVwLmlzQWJvdmVBbmNob3IoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIExpc3RBZGFwdGVyIGFkYXB0ZXIgPSBtQWRhcHRlcjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBib29sZWFuIGFsbEVuYWJsZWQ7Ci0gICAgICAgICAgICAgICAgaW50IGZpcnN0SXRlbSA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICAgICAgICAgIGludCBsYXN0SXRlbSA9IEludGVnZXIuTUlOX1ZBTFVFOwotCi0gICAgICAgICAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhbGxFbmFibGVkID0gYWRhcHRlci5hcmVBbGxJdGVtc0VuYWJsZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RJdGVtID0gYWxsRW5hYmxlZCA/IDAgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QubG9va0ZvclNlbGVjdGFibGVQb3NpdGlvbigwLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgbGFzdEl0ZW0gPSBhbGxFbmFibGVkID8gYWRhcHRlci5nZXRDb3VudCgpIC0gMSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5sb29rRm9yU2VsZWN0YWJsZVBvc2l0aW9uKGFkYXB0ZXIuZ2V0Q291bnQoKSAtIDEsIGZhbHNlKTsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoKGJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQICYmIGN1ckluZGV4IDw9IGZpcnN0SXRlbSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICghYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiAmJiBjdXJJbmRleCA+PSBsYXN0SXRlbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgc2VsZWN0aW9uIGlzIGF0IHRoZSB0b3AsIHdlIGJsb2NrIHRoZSBrZXkKLSAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgdG8gcHJldmVudCBmb2N1cyBmcm9tIG1vdmluZy4KLSAgICAgICAgICAgICAgICAgICAgY2xlYXJMaXN0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUoUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBXQVJOSU5HOiBQbGVhc2UgcmVhZCB0aGUgY29tbWVudCB3aGVyZSBtTGlzdFNlbGVjdGlvbkhpZGRlbgotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBpcyBkZWNsYXJlZAotICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJLZXkgZG93bjogY29kZT0iICsga2V5Q29kZSArICIgbGlzdCBjb25zdW1lZD0iICsgY29uc3VtZWQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIGl0IGhhbmRsZWQgdGhlIGtleSBldmVudCwgdGhlbiB0aGUgdXNlciBpcwotICAgICAgICAgICAgICAgICAgICAvLyBuYXZpZ2F0aW5nIGluIHRoZSBsaXN0LCBzbyB3ZSBzaG91bGQgcHV0IGl0IGluIGZyb250LgotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSGVyZSdzIGEgbGl0dGxlIHRyaWNrIHdlIG5lZWQgdG8gZG8gdG8gbWFrZSBzdXJlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxpc3QgdmlldyBpcyBhY3R1YWxseSBzaG93aW5nIGl0cyBmb2N1cyBpbmRpY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgIC8vIGJ5IGVuc3VyaW5nIGl0IGhhcyBmb2N1cyBhbmQgZ2V0dGluZyBpdHMgd2luZG93IG91dAotICAgICAgICAgICAgICAgICAgICAvLyBvZiB0b3VjaCBtb2RlLgotICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnJlcXVlc3RGb2N1c0Zyb21Ub3VjaCgpOwotICAgICAgICAgICAgICAgICAgICBzaG93RHJvcERvd24oKTsKLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF2b2lkIHBhc3NpbmcgdGhlIGZvY3VzIGZyb20gdGhlIHRleHQgdmlldyB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgY29tcG9uZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTikgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgc2VsZWN0aW9uIGlzIGF0IHRoZSBib3R0b20sIHdlIGJsb2NrIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgdG8gYXZvaWQgZ29pbmcgdG8gdGhlIG5leHQgZm9jdXNhYmxlIHdpZGdldAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckluZGV4ID09IGxhc3RJdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VySW5kZXggPT0gZmlyc3RJdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1Qb3B1cC5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFpc1BvcHVwU2hvd2luZygpKSB7CiAgICAgICAgICAgICBzd2l0Y2goa2V5Q29kZSkgewogICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTjoKICAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbigpOwpAQCAtNzQ2LDcgKzY1NCw3IEBACiAgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CiAgICAgICAgIG1MYXN0S2V5Q29kZSA9IEtleUV2ZW50LktFWUNPREVfVU5LTk9XTjsKIAotICAgICAgICBpZiAoaGFuZGxlZCAmJiBpc1BvcHVwU2hvd2luZygpICYmIG1Ecm9wRG93bkxpc3QgIT0gbnVsbCkgeworICAgICAgICBpZiAoaGFuZGxlZCAmJiBpc1BvcHVwU2hvd2luZygpKSB7CiAgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKICAgICAgICAgfQogCkBAIC04MDcsMTEgKzcxNSwxMiBAQAogICAgICAgICBpZiAoZW5vdWdoVG9GaWx0ZXIoKSkgewogICAgICAgICAgICAgaWYgKG1GaWx0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHBlcmZvcm1GaWx0ZXJpbmcoZ2V0VGV4dCgpLCBtTGFzdEtleUNvZGUpOworICAgICAgICAgICAgICAgIGJ1aWxkSW1lQ29tcGxldGlvbnMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGRyb3AgZG93biBpcyBhdXRvbWF0aWNhbGx5IGRpc21pc3NlZCB3aGVuIGVub3VnaCBjaGFyYWN0ZXJzCiAgICAgICAgICAgICAvLyBhcmUgZGVsZXRlZCBmcm9tIHRoZSB0ZXh0IHZpZXcKLSAgICAgICAgICAgIGlmICghbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgZGlzbWlzc0Ryb3BEb3duKCk7CisgICAgICAgICAgICBpZiAoIW1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpKSBkaXNtaXNzRHJvcERvd24oKTsKICAgICAgICAgICAgIGlmIChtRmlsdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtRmlsdGVyLmZpbHRlcihudWxsKTsKICAgICAgICAgICAgIH0KQEAgLTg0NCwxMyArNzUzLDcgQEAKICAgICAgKiBpdCBiYWNrLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyTGlzdFNlbGVjdGlvbigpIHsKLSAgICAgICAgZmluYWwgRHJvcERvd25MaXN0VmlldyBsaXN0ID0gbURyb3BEb3duTGlzdDsKLSAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gV0FSTklORzogUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnQgd2hlcmUgbUxpc3RTZWxlY3Rpb25IaWRkZW4gaXMgZGVjbGFyZWQKLSAgICAgICAgICAgIGxpc3QubUxpc3RTZWxlY3Rpb25IaWRkZW4gPSB0cnVlOwotICAgICAgICAgICAgbGlzdC5oaWRlU2VsZWN0b3IoKTsKLSAgICAgICAgICAgIGxpc3QucmVxdWVzdExheW91dCgpOwotICAgICAgICB9CisgICAgICAgIG1Qb3B1cC5jbGVhckxpc3RTZWxlY3Rpb24oKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC04NTksMTEgKzc2Miw3IEBACiAgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBtb3ZlIHRoZSBzZWxlY3RvciB0by4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRMaXN0U2VsZWN0aW9uKGludCBwb3NpdGlvbikgewotICAgICAgICBpZiAobVBvcHVwLmlzU2hvd2luZygpICYmIChtRHJvcERvd25MaXN0ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFNlbGVjdGlvbihwb3NpdGlvbik7Ci0gICAgICAgICAgICAvLyBMaXN0Vmlldy5zZXRTZWxlY3Rpb24oKSB3aWxsIGNhbGwgcmVxdWVzdExheW91dCgpCi0gICAgICAgIH0KKyAgICAgICAgbVBvcHVwLnNldFNlbGVjdGlvbihwb3NpdGlvbik7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NzcsMTAgKzc3Niw3IEBACiAgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRMaXN0U2VsZWN0aW9uKCkgewotICAgICAgICBpZiAobVBvcHVwLmlzU2hvd2luZygpICYmIChtRHJvcERvd25MaXN0ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBMaXN0Vmlldy5JTlZBTElEX1BPU0lUSU9OOworICAgICAgICByZXR1cm4gbVBvcHVwLmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05MTQsMTMgKzgxMCw3IEBACiAgICAgICAgICAgICByZXBsYWNlVGV4dChjb21wbGV0aW9uLmdldFRleHQoKSk7CiAgICAgICAgICAgICBtQmxvY2tDb21wbGV0aW9uID0gZmFsc2U7CiAKLSAgICAgICAgICAgIGlmIChtSXRlbUNsaWNrTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIERyb3BEb3duTGlzdFZpZXcgbGlzdCA9IG1Ecm9wRG93bkxpc3Q7Ci0gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgYSBWaWV3IGhlcmUsIHNvIHdlIHdpbGwgbmVlZCB0bwotICAgICAgICAgICAgICAgIC8vIHN1cHBseSBudWxsLiAgSG9wZWZ1bGx5IG5vIGV4aXN0aW5nIGFwcHMgY3Jhc2guLi4KLSAgICAgICAgICAgICAgICBtSXRlbUNsaWNrTGlzdGVuZXIub25JdGVtQ2xpY2sobGlzdCwgbnVsbCwgY29tcGxldGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbi5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qb3B1cC5wZXJmb3JtSXRlbUNsaWNrKGNvbXBsZXRpb24uZ2V0UG9zaXRpb24oKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTkyOCw3ICs4MTgsNyBAQAogICAgICAgICBpZiAoaXNQb3B1cFNob3dpbmcoKSkgewogICAgICAgICAgICAgT2JqZWN0IHNlbGVjdGVkSXRlbTsKICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IDApIHsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW0gPSBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbSgpOworICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbSA9IG1Qb3B1cC5nZXRTZWxlY3RlZEl0ZW0oKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtID0gbUFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7CiAgICAgICAgICAgICB9CkBAIC05NDIsMTggKzgzMiwxOCBAQAogICAgICAgICAgICAgbUJsb2NrQ29tcGxldGlvbiA9IGZhbHNlOyAgICAgICAgICAgIAogCiAgICAgICAgICAgICBpZiAobUl0ZW1DbGlja0xpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcm9wRG93bkxpc3RWaWV3IGxpc3QgPSBtRHJvcERvd25MaXN0OworICAgICAgICAgICAgICAgIGZpbmFsIExpc3RQb3B1cFdpbmRvdyBsaXN0ID0gbVBvcHVwOwogCiAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkVmlldyA9PSBudWxsIHx8IHBvc2l0aW9uIDwgMCkgewogICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFZpZXcgPSBsaXN0LmdldFNlbGVjdGVkVmlldygpOwogICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgaWQgPSBsaXN0LmdldFNlbGVjdGVkSXRlbUlkKCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1JdGVtQ2xpY2tMaXN0ZW5lci5vbkl0ZW1DbGljayhsaXN0LCBzZWxlY3RlZFZpZXcsIHBvc2l0aW9uLCBpZCk7CisgICAgICAgICAgICAgICAgbUl0ZW1DbGlja0xpc3RlbmVyLm9uSXRlbUNsaWNrKGxpc3QuZ2V0TGlzdFZpZXcoKSwgc2VsZWN0ZWRWaWV3LCBwb3NpdGlvbiwgaWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Ecm9wRG93bkRpc21pc3NlZE9uQ29tcGxldGlvbiAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICBpZiAobURyb3BEb3duRGlzbWlzc2VkT25Db21wbGV0aW9uICYmICFtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKSkgewogICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDAzLDcgKzg5Myw2IEBACiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvbkZpbHRlckNvbXBsZXRlKGludCBjb3VudCkgewogICAgICAgICB1cGRhdGVEcm9wRG93bkZvckZpbHRlcihjb3VudCk7Ci0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdXBkYXRlRHJvcERvd25Gb3JGaWx0ZXIoaW50IGNvdW50KSB7CkBAIC0xMDE3LDExICs5MDYsMTIgQEAKICAgICAgICAgICogdG8gZmlsdGVyLgogICAgICAgICAgKi8KIAotICAgICAgICBpZiAoKGNvdW50ID4gMCB8fCBtRHJvcERvd25BbHdheXNWaXNpYmxlKSAmJiBlbm91Z2hUb0ZpbHRlcigpKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZHJvcERvd25BbHdheXNWaXNpYmxlID0gbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCk7CisgICAgICAgIGlmICgoY291bnQgPiAwIHx8IGRyb3BEb3duQWx3YXlzVmlzaWJsZSkgJiYgZW5vdWdoVG9GaWx0ZXIoKSkgewogICAgICAgICAgICAgaWYgKGhhc0ZvY3VzKCkgJiYgaGFzV2luZG93Rm9jdXMoKSkgewogICAgICAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFtRHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgIH0gZWxzZSBpZiAoIWRyb3BEb3duQWx3YXlzVmlzaWJsZSkgewogICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDI5LDcgKzkxOSw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25XaW5kb3dGb2N1c0NoYW5nZWQoYm9vbGVhbiBoYXNXaW5kb3dGb2N1cykgewogICAgICAgICBzdXBlci5vbldpbmRvd0ZvY3VzQ2hhbmdlZChoYXNXaW5kb3dGb2N1cyk7Ci0gICAgICAgIGlmICghaGFzV2luZG93Rm9jdXMgJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIHsKKyAgICAgICAgaWYgKCFoYXNXaW5kb3dGb2N1cyAmJiAhbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTAzOSw3ICs5MjksNyBAQAogICAgICAgICBzdXBlci5vbkRpc3BsYXlIaW50KGhpbnQpOwogICAgICAgICBzd2l0Y2ggKGhpbnQpIHsKICAgICAgICAgICAgIGNhc2UgSU5WSVNJQkxFOgotICAgICAgICAgICAgICAgIGlmICghbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICAgICAgICAgIGlmICghbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTA1Myw3ICs5NDMsNyBAQAogICAgICAgICBpZiAoIWZvY3VzZWQpIHsKICAgICAgICAgICAgIHBlcmZvcm1WYWxpZGF0aW9uKCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFmb2N1c2VkICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgIGlmICghZm9jdXNlZCAmJiAhbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTA3OCw4ICs5NjgsNiBAQAogICAgICAgICAgICAgaW1tLmRpc3BsYXlDb21wbGV0aW9ucyh0aGlzLCBudWxsKTsKICAgICAgICAgfQogICAgICAgICBtUG9wdXAuZGlzbWlzcygpOwotICAgICAgICBtUG9wdXAuc2V0Q29udGVudFZpZXcobnVsbCk7Ci0gICAgICAgIG1Ecm9wRG93bkxpc3QgPSBudWxsOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTA5MiwxOCArOTgwLDYgQEAKIAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5Vc2VkIGZvciBsYXp5IGluc3RhbnRpYXRpb24gb2YgdGhlIGFuY2hvciB2aWV3IGZyb20gdGhlIGlkIHdlIGhhdmUuIElmIHRoZSB2YWx1ZSBvZgotICAgICAqIHRoZSBpZCBpcyBOT19JRCBvciB3ZSBjYW4ndCBmaW5kIGEgdmlldyBmb3IgdGhlIGdpdmVuIGlkLCB3ZSByZXR1cm4gdGhpcyBUZXh0VmlldyBhcwotICAgICAqIHRoZSBkZWZhdWx0IGFuY2hvcmluZyBwb2ludC48L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBWaWV3IGdldERyb3BEb3duQW5jaG9yVmlldygpIHsKLSAgICAgICAgaWYgKG1Ecm9wRG93bkFuY2hvclZpZXcgPT0gbnVsbCAmJiBtRHJvcERvd25BbmNob3JJZCAhPSBWaWV3Lk5PX0lEKSB7Ci0gICAgICAgICAgICBtRHJvcERvd25BbmNob3JWaWV3ID0gZ2V0Um9vdFZpZXcoKS5maW5kVmlld0J5SWQobURyb3BEb3duQW5jaG9ySWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRHJvcERvd25BbmNob3JWaWV3ID09IG51bGwgPyB0aGlzIDogbURyb3BEb3duQW5jaG9yVmlldzsKLSAgICB9CiAKICAgICAvKioKICAgICAgKiBJc3N1ZXMgYSBydW5uYWJsZSB0byBzaG93IHRoZSBkcm9wZG93biBhcyBzb29uIGFzIHBvc3NpYmxlLgpAQCAtMTExMSw3ICs5ODcsNyBAQAogICAgICAqIEBoaWRlIGludGVybmFsIHVzZWQgb25seSBieSBTZWFyY2hEaWFsb2cKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzaG93RHJvcERvd25BZnRlckxheW91dCgpIHsKLSAgICAgICAgcG9zdChtU2hvd0Ryb3BEb3duUnVubmFibGUpOworICAgICAgICBtUG9wdXAucG9zdFNob3coKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xMTIyLDcgKzk5OCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5zdXJlSW1lVmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZSh2aXNpYmxlCi0gICAgICAgICAgICAgICAgPyBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEIDogUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQpOworICAgICAgICAgICAgICAgID8gTGlzdFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQgOiBMaXN0UG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQpOwogICAgICAgICBzaG93RHJvcERvd24oKTsKICAgICB9CiAKQEAgLTExMzAsODkgKzEwMDYsMjEgQEAKICAgICAgKiBAaGlkZSBpbnRlcm5hbCB1c2VkIG9ubHkgaGVyZSBhbmQgU2VhcmNoRGlhbG9nCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNJbnB1dE1ldGhvZE5vdE5lZWRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBMaXN0UG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogPHA+RGlzcGxheXMgdGhlIGRyb3AgZG93biBvbiBzY3JlZW4uPC9wPgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNob3dEcm9wRG93bigpIHsKLSAgICAgICAgaW50IGhlaWdodCA9IGJ1aWxkRHJvcERvd24oKTsKLQotICAgICAgICBpbnQgd2lkdGhTcGVjID0gMDsKLSAgICAgICAgaW50IGhlaWdodFNwZWMgPSAwOwotCi0gICAgICAgIGJvb2xlYW4gbm9JbnB1dE1ldGhvZCA9IGlzSW5wdXRNZXRob2ROb3ROZWVkZWQoKTsKLQotICAgICAgICBpZiAobVBvcHVwLmlzU2hvd2luZygpKSB7Ci0gICAgICAgICAgICBpZiAobURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgY2FsbCB0byBQb3B1cFdpbmRvdydzIHVwZGF0ZSBtZXRob2QgYmVsb3cgY2FuIGFjY2VwdCAtMSBmb3IgYW55Ci0gICAgICAgICAgICAgICAgLy8gdmFsdWUgeW91IGRvIG5vdCB3YW50IHRvIHVwZGF0ZS4KLSAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSAtMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSBnZXREcm9wRG93bkFuY2hvclZpZXcoKS5nZXRXaWR0aCgpOworICAgICAgICBpZiAobVBvcHVwLmdldEFuY2hvclZpZXcoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAobURyb3BEb3duQW5jaG9ySWQgIT0gVmlldy5OT19JRCkgeworICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRBbmNob3JWaWV3KGdldFJvb3RWaWV3KCkuZmluZFZpZXdCeUlkKG1Ecm9wRG93bkFuY2hvcklkKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IG1Ecm9wRG93bldpZHRoOworICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRBbmNob3JWaWV3KHRoaXMpOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQotICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCi0gICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IG5vSW5wdXRNZXRob2QgPyBoZWlnaHQgOiBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgICAgICAgICBpZiAobm9JbnB1dE1ldGhvZCkgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA6IDAsIDApOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaW5kb3dMYXlvdXRNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UIDogMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gaGVpZ2h0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gbURyb3BEb3duSGVpZ2h0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtUG9wdXAuc2V0T3V0c2lkZVRvdWNoYWJsZSghbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKTsKLQotICAgICAgICAgICAgbVBvcHVwLnVwZGF0ZShnZXREcm9wRG93bkFuY2hvclZpZXcoKSwgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duVmVydGljYWxPZmZzZXQsIHdpZHRoU3BlYywgaGVpZ2h0U3BlYyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaWR0aChnZXREcm9wRG93bkFuY2hvclZpZXcoKS5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2lkdGgobURyb3BEb3duV2lkdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgIGhlaWdodFNwZWMgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SGVpZ2h0KGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldEhlaWdodChtRHJvcERvd25IZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVBvcHVwLnNldFdpbmRvd0xheW91dE1vZGUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKLSAgICAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUoUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHVzZSBvdXRzaWRlIHRvdWNoYWJsZSB0byBkaXNtaXNzIGRyb3AgZG93biB3aGVuIHRvdWNoaW5nIG91dHNpZGUgb2YgaXQsIHNvCi0gICAgICAgICAgICAvLyBvbmx5IHNldCB0aGlzIGlmIHRoZSBkcm9wZG93biBpcyBub3QgYWx3YXlzIHZpc2libGUKLSAgICAgICAgICAgIG1Qb3B1cC5zZXRPdXRzaWRlVG91Y2hhYmxlKCFtRm9yY2VJZ25vcmVPdXRzaWRlVG91Y2ggJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpOwotICAgICAgICAgICAgbVBvcHVwLnNldFRvdWNoSW50ZXJjZXB0b3IobmV3IFBvcHVwVG91Y2hJbnRlcmNlcHRvcigpKTsKLSAgICAgICAgICAgIG1Qb3B1cC5zaG93QXNEcm9wRG93bihnZXREcm9wRG93bkFuY2hvclZpZXcoKSwKLSAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCwgbURyb3BEb3duVmVydGljYWxPZmZzZXQpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRTZWxlY3Rpb24oTGlzdFZpZXcuSU5WQUxJRF9QT1NJVElPTik7Ci0gICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIHBvc3QobUhpZGVTZWxlY3Rvcik7CiAgICAgICAgIH0KKyAgICAgICAgbVBvcHVwLnNob3coKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xMjIzLDE5ICsxMDMxLDEwIEBACiAgICAgICogQGhpZGUgdXNlZCBvbmx5IGJ5IFNlYXJjaERpYWxvZwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlSWdub3JlT3V0c2lkZVRvdWNoKGJvb2xlYW4gZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2gpIHsKLSAgICAgICAgbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoID0gZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2g7CisgICAgICAgIG1Qb3B1cC5zZXRGb3JjZUlnbm9yZU91dHNpZGVUb3VjaChmb3JjZUlnbm9yZU91dHNpZGVUb3VjaCk7CiAgICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+QnVpbGRzIHRoZSBwb3B1cCB3aW5kb3cncyBjb250ZW50IGFuZCByZXR1cm5zIHRoZSBoZWlnaHQgdGhlIHBvcHVwCi0gICAgICogc2hvdWxkIGhhdmUuIFJldHVybnMgLTEgd2hlbiB0aGUgY29udGVudCBhbHJlYWR5IGV4aXN0cy48L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50J3MgaGVpZ2h0IG9yIC0xIGlmIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBidWlsZERyb3BEb3duKCkgewotICAgICAgICBWaWV3R3JvdXAgZHJvcERvd25WaWV3OwotICAgICAgICBpbnQgb3RoZXJIZWlnaHRzID0gMDsKLQorICAgIAorICAgIHByaXZhdGUgdm9pZCBidWlsZEltZUNvbXBsZXRpb25zKCkgewogICAgICAgICBmaW5hbCBMaXN0QWRhcHRlciBhZGFwdGVyID0gbUFkYXB0ZXI7CiAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIucGVla0luc3RhbmNlKCk7CkBAIC0xMjYzLDEzNSArMTA2Miw2IEBACiAgICAgICAgICAgICAgICAgaW1tLmRpc3BsYXlDb21wbGV0aW9ucyh0aGlzLCBjb21wbGV0aW9ucyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBpZiAobURyb3BEb3duTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0KLSAgICAgICAgICAgIG1IaWRlU2VsZWN0b3IgPSBuZXcgTGlzdFNlbGVjdG9ySGlkZXIoKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGlzIFJ1bm5hYmxlIGV4aXN0cyBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBjaGVja2luZyBpZiB0aGUgdmlldyBsYXlvdXQgaGFzIGdvdAotICAgICAgICAgICAgICogY29tcGxldGVkIGFuZCBpZiBzbyBjYWxsIHNob3dEcm9wRG93biB0byBkaXNwbGF5IHRoZSBkcm9wIGRvd24uIFRoaXMgaXMgdXNlZCB0byBzaG93Ci0gICAgICAgICAgICAgKiB0aGUgZHJvcCBkb3duIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgdXNlciBvcGVucyB1cCB0aGUgc2VhcmNoIGRpYWxvZywgd2l0aG91dAotICAgICAgICAgICAgICogd2FpdGluZyBmb3IgdGhlIG5vcm1hbCBVSSBwaXBlbGluZSB0byBkbyBpdCdzIGpvYiB3aGljaCBpcyBzbG93ZXIgdGhhbiB0aGlzIG1ldGhvZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbVNob3dEcm9wRG93blJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVmlldyBsYXlvdXQgc2hvdWxkIGJlIGFsbCBkb25lIGJlZm9yZSBkaXNwbGF5aW5nIHRoZSBkcm9wIGRvd24uCi0gICAgICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IGdldERyb3BEb3duQW5jaG9yVmlldygpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmlldyAhPSBudWxsICYmIHZpZXcuZ2V0V2luZG93VG9rZW4oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaG93RHJvcERvd24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QgPSBuZXcgRHJvcERvd25MaXN0Vmlldyhjb250ZXh0KTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0U2VsZWN0b3IobURyb3BEb3duTGlzdEhpZ2hsaWdodCk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIoYWRhcHRlcik7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFZlcnRpY2FsRmFkaW5nRWRnZUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobURyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRGb2N1c2FibGUodHJ1ZSk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEcm9wRG93bkxpc3RWaWV3IGRyb3BEb3duTGlzdCA9IG1Ecm9wRG93bkxpc3Q7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wRG93bkxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BEb3duTGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Ob3RoaW5nU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50KSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uU2Nyb2xsTGlzdGVuZXIobmV3IFBvcHVwU2Nyb2xsTGlzdGVuZXIoKSk7Ci0KLSAgICAgICAgICAgIGlmIChtSXRlbVNlbGVjdGVkTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihtSXRlbVNlbGVjdGVkTGlzdGVuZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkcm9wRG93blZpZXcgPSBtRHJvcERvd25MaXN0OwotCi0gICAgICAgICAgICBWaWV3IGhpbnRWaWV3ID0gZ2V0SGludFZpZXcoY29udGV4dCk7Ci0gICAgICAgICAgICBpZiAoaGludFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGlmIGFuIGhpbnQgaGFzIGJlZW4gc3BlY2lmaWVkLCB3ZSBhY2NvbW9kYXRlIG1vcmUgc3BhY2UgZm9yIGl0IGFuZAotICAgICAgICAgICAgICAgIC8vIGFkZCBhIHRleHQgdmlldyBpbiB0aGUgZHJvcCBkb3duIG1lbnUsIGF0IHRoZSBib3R0b20gb2YgdGhlIGxpc3QKLSAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQgaGludENvbnRhaW5lciA9IG5ldyBMaW5lYXJMYXlvdXQoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaGludENvbnRhaW5lci5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOwotCi0gICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyBoaW50UGFyYW1zID0gbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgMCwgMS4wZgotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgaGludENvbnRhaW5lci5hZGRWaWV3KGRyb3BEb3duVmlldywgaGludFBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgaGludENvbnRhaW5lci5hZGRWaWV3KGhpbnRWaWV3KTsKLQotICAgICAgICAgICAgICAgIC8vIG1lYXN1cmUgdGhlIGhpbnQncyBoZWlnaHQgdG8gZmluZCBob3cgbXVjaCBtb3JlIHZlcnRpY2FsIHNwYWNlCi0gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBhZGQgdG8gdGhlIGRyb3AgZG93bidzIGhlaWdodAotICAgICAgICAgICAgICAgIGludCB3aWR0aFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoZ2V0V2lkdGgoKSwgTWVhc3VyZVNwZWMuQVRfTU9TVCk7Ci0gICAgICAgICAgICAgICAgaW50IGhlaWdodFNwZWMgPSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDsKLSAgICAgICAgICAgICAgICBoaW50Vmlldy5tZWFzdXJlKHdpZHRoU3BlYywgaGVpZ2h0U3BlYyk7Ci0KLSAgICAgICAgICAgICAgICBoaW50UGFyYW1zID0gKExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMpIGhpbnRWaWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICAgICAgICAgIG90aGVySGVpZ2h0cyA9IGhpbnRWaWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBoaW50UGFyYW1zLnRvcE1hcmdpbgotICAgICAgICAgICAgICAgICAgICAgICAgKyBoaW50UGFyYW1zLmJvdHRvbU1hcmdpbjsKLQotICAgICAgICAgICAgICAgIGRyb3BEb3duVmlldyA9IGhpbnRDb250YWluZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Qb3B1cC5zZXRDb250ZW50Vmlldyhkcm9wRG93blZpZXcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gKFZpZXdHcm91cCkgbVBvcHVwLmdldENvbnRlbnRWaWV3KCk7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBkcm9wRG93blZpZXcuZmluZFZpZXdCeUlkKEhJTlRfVklFV19JRCk7Ci0gICAgICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyBoaW50UGFyYW1zID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKSB2aWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICAgICAgICAgIG90aGVySGVpZ2h0cyA9IHZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKSArIGhpbnRQYXJhbXMudG9wTWFyZ2luCi0gICAgICAgICAgICAgICAgICAgICAgICArIGhpbnRQYXJhbXMuYm90dG9tTWFyZ2luOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWF4IGhlaWdodCBhdmFpbGFibGUgb24gdGhlIHNjcmVlbiBmb3IgYSBwb3B1cC4KLSAgICAgICAgYm9vbGVhbiBpZ25vcmVCb3R0b21EZWNvcmF0aW9ucyA9Ci0gICAgICAgICAgICAgICAgbVBvcHVwLmdldElucHV0TWV0aG9kTW9kZSgpID09IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEOwotICAgICAgICBmaW5hbCBpbnQgbWF4SGVpZ2h0ID0gbVBvcHVwLmdldE1heEF2YWlsYWJsZUhlaWdodCgKLSAgICAgICAgICAgICAgICBnZXREcm9wRG93bkFuY2hvclZpZXcoKSwgbURyb3BEb3duVmVydGljYWxPZmZzZXQsIGlnbm9yZUJvdHRvbURlY29yYXRpb25zKTsKLQotICAgICAgICAvLyBnZXRNYXhBdmFpbGFibGVIZWlnaHQoKSBzdWJ0cmFjdHMgdGhlIHBhZGRpbmcsIHNvIHdlIHB1dCBpdCBiYWNrLAotICAgICAgICAvLyB0byBnZXQgdGhlIGF2YWlsYWJsZSBoZWlnaHQgZm9yIHRoZSB3aG9sZSB3aW5kb3cKLSAgICAgICAgaW50IHBhZGRpbmcgPSAwOwotICAgICAgICBEcmF3YWJsZSBiYWNrZ3JvdW5kID0gbVBvcHVwLmdldEJhY2tncm91bmQoKTsKLSAgICAgICAgaWYgKGJhY2tncm91bmQgIT0gbnVsbCkgewotICAgICAgICAgICAgYmFja2dyb3VuZC5nZXRQYWRkaW5nKG1UZW1wUmVjdCk7Ci0gICAgICAgICAgICBwYWRkaW5nID0gbVRlbXBSZWN0LnRvcCArIG1UZW1wUmVjdC5ib3R0b207Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobURyb3BEb3duQWx3YXlzVmlzaWJsZSB8fCBtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgIHJldHVybiBtYXhIZWlnaHQgKyBwYWRkaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgaW50IGxpc3RDb250ZW50ID0gbURyb3BEb3duTGlzdC5tZWFzdXJlSGVpZ2h0T2ZDaGlsZHJlbihNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCwKLSAgICAgICAgICAgICAgICAwLCBMaXN0Vmlldy5OT19QT1NJVElPTiwgbWF4SGVpZ2h0IC0gb3RoZXJIZWlnaHRzLCAyKTsKLSAgICAgICAgLy8gYWRkIHBhZGRpbmcgb25seSBpZiB0aGUgbGlzdCBoYXMgaXRlbXMgaW4gaXQsIHRoYXQgd2F5IHdlIGRvbid0IHNob3cKLSAgICAgICAgLy8gdGhlIHBvcHVwIGlmIGl0IGlzIG5vdCBuZWVkZWQKLSAgICAgICAgaWYgKGxpc3RDb250ZW50ID4gMCkgb3RoZXJIZWlnaHRzICs9IHBhZGRpbmc7Ci0KLSAgICAgICAgcmV0dXJuIGxpc3RDb250ZW50ICsgb3RoZXJIZWlnaHRzOwotICAgIH0KLQotICAgIHByaXZhdGUgVmlldyBnZXRIaW50VmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKG1IaW50VGV4dCAhPSBudWxsICYmIG1IaW50VGV4dC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGZpbmFsIFRleHRWaWV3IGhpbnRWaWV3ID0gKFRleHRWaWV3KSBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpLmluZmxhdGUoCi0gICAgICAgICAgICAgICAgICAgIG1IaW50UmVzb3VyY2UsIG51bGwpLmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnRleHQxKTsKLSAgICAgICAgICAgIGhpbnRWaWV3LnNldFRleHQobUhpbnRUZXh0KTsKLSAgICAgICAgICAgIGhpbnRWaWV3LnNldElkKEhJTlRfVklFV19JRCk7Ci0gICAgICAgICAgICByZXR1cm4gaGludFZpZXc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ0Myw0NyArMTExMyw2IEBACiAgICAgICAgIHJldHVybiBtRmlsdGVyOwogICAgIH0KIAotICAgIHByaXZhdGUgY2xhc3MgTGlzdFNlbGVjdG9ySGlkZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGNsZWFyTGlzdFNlbGVjdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBSZXNpemVQb3B1cFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKLSAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBQb3B1cFRvdWNoSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBPblRvdWNoTGlzdGVuZXIgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoKFZpZXcgdiwgTW90aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBldmVudC5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04gJiYKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwICE9IG51bGwgJiYgbVBvcHVwLmlzU2hvd2luZygpKSB7Ci0gICAgICAgICAgICAgICAgcG9zdERlbGF5ZWQobVJlc2l6ZVBvcHVwUnVubmFibGUsIEVYUEFORF9MSVNUX1RJTUVPVVQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQ2FsbGJhY2tzKG1SZXNpemVQb3B1cFJ1bm5hYmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGNsYXNzIFBvcHVwU2Nyb2xsTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Vmlldy5PblNjcm9sbExpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25TY3JvbGwoQWJzTGlzdFZpZXcgdmlldywgaW50IGZpcnN0VmlzaWJsZUl0ZW0sIGludCB2aXNpYmxlSXRlbUNvdW50LAotICAgICAgICAgICAgICAgIGludCB0b3RhbEl0ZW1Db3VudCkgewotCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblNjcm9sbFN0YXRlQ2hhbmdlZChBYnNMaXN0VmlldyB2aWV3LCBpbnQgc2Nyb2xsU3RhdGUpIHsKLSAgICAgICAgICAgIGlmIChzY3JvbGxTdGF0ZSA9PSBTQ1JPTExfU1RBVEVfVE9VQ0hfU0NST0xMICYmCi0gICAgICAgICAgICAgICAgICAgICFpc0lucHV0TWV0aG9kTm90TmVlZGVkKCkgJiYgbVBvcHVwLmdldENvbnRlbnRWaWV3KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtUmVzaXplUG9wdXBSdW5uYWJsZSk7Ci0gICAgICAgICAgICAgICAgbVJlc2l6ZVBvcHVwUnVubmFibGUucnVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIGNsYXNzIERyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIgaW1wbGVtZW50cyBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIHsKICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXcgcGFyZW50LCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewogICAgICAgICAgICAgcGVyZm9ybUNvbXBsZXRpb24odiwgcG9zaXRpb24sIGlkKTsKQEAgLTE0OTEsMTIzICsxMTIwLDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD5XcmFwcGVyIGNsYXNzIGZvciBhIExpc3RWaWV3LiBUaGlzIHdyYXBwZXIgaGlqYWNrcyB0aGUgZm9jdXMgdG8KLSAgICAgKiBtYWtlIHN1cmUgdGhlIGxpc3QgdXNlcyB0aGUgYXBwcm9wcmlhdGUgZHJhd2FibGVzIGFuZCBzdGF0ZXMgd2hlbgotICAgICAqIGRpc3BsYXllZCBvbiBzY3JlZW4gd2l0aGluIGEgZHJvcCBkb3duLiBUaGUgZm9jdXMgaXMgbmV2ZXIgYWN0dWFsbHkKLSAgICAgKiBwYXNzZWQgdG8gdGhlIGRyb3AgZG93bjsgdGhlIGxpc3Qgb25seSBsb29rcyBmb2N1c2VkLjwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEcm9wRG93bkxpc3RWaWV3IGV4dGVuZHMgTGlzdFZpZXcgewotICAgICAgICAvKgotICAgICAgICAgKiBXQVJOSU5HOiBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSB0b3VjaCBtb2RlIGlzc3VlLgotICAgICAgICAgKgotICAgICAgICAgKiBUb3VjaCBtb2RlIGlzIHByb3BhZ2F0ZWQgbGF6aWx5IHRvIHdpbmRvd3MuIFRoaXMgY2F1c2VzIHByb2JsZW1zIGluCi0gICAgICAgICAqIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW86Ci0gICAgICAgICAqIC0gVHlwZSBzb21ldGhpbmcgaW4gdGhlIEF1dG9Db21wbGV0ZVRleHRWaWV3IGFuZCBnZXQgc29tZSByZXN1bHRzCi0gICAgICAgICAqIC0gTW92ZSBkb3duIHdpdGggdGhlIGQtcGFkIHRvIHNlbGVjdCBhbiBpdGVtIGluIHRoZSBsaXN0Ci0gICAgICAgICAqIC0gTW92ZSB1cCB3aXRoIHRoZSBkLXBhZCB1bnRpbCB0aGUgc2VsZWN0aW9uIGRpc2FwcGVhcnMKLSAgICAgICAgICogLSBUeXBlIG1vcmUgdGV4dCBpbiB0aGUgQXV0b0NvbXBsZXRlVGV4dFZpZXcgKnVzaW5nIHRoZSBzb2Z0IGtleWJvYXJkKgotICAgICAgICAgKiAgIGFuZCBnZXQgbmV3IHJlc3VsdHM7IHlvdSBhcmUgbm93IGluIHRvdWNoIG1vZGUKLSAgICAgICAgICogLSBUaGUgc2VsZWN0aW9uIGNvbWVzIGJhY2sgb24gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QsIGV2ZW4gdGhvdWdoCi0gICAgICAgICAqICAgdGhlIGxpc3QgaXMgc3VwcG9zZWQgdG8gYmUgaW4gdG91Y2ggbW9kZQotICAgICAgICAgKgotICAgICAgICAgKiBVc2luZyB0aGUgc29mdCBrZXlib2FyZCB0cmlnZ2VycyB0aGUgdG91Y2ggbW9kZSBjaGFuZ2UgYnV0IHRoYXQgY2hhbmdlCi0gICAgICAgICAqIGlzIHByb3BhZ2F0ZWQgdG8gb3VyIHdpbmRvdyBvbmx5IGFmdGVyIHRoZSBmaXJzdCBsaXN0IGxheW91dCwgdGhlcmVmb3JlCi0gICAgICAgICAqIGFmdGVyIHRoZSBsaXN0IGF0dGVtcHRzIHRvIHJlc3VycmVjdCB0aGUgc2VsZWN0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBUaGUgdHJpY2sgdG8gd29yayBhcm91bmQgdGhpcyBpc3N1ZSBpcyB0byBwcmV0ZW5kIHRoZSBsaXN0IGlzIGluIHRvdWNoCi0gICAgICAgICAqIG1vZGUgd2hlbiB3ZSBrbm93IHRoYXQgdGhlIHNlbGVjdGlvbiBzaG91bGQgbm90IGFwcGVhciwgdGhhdCBpcyB3aGVuCi0gICAgICAgICAqIHdlIGtub3cgdGhlIHVzZXIgbW92ZWQgdGhlIHNlbGVjdGlvbiBhd2F5IGZyb20gdGhlIGxpc3QuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoaXMgYm9vbGVhbiBpcyBzZXQgdG8gdHJ1ZSB3aGVuZXZlciB3ZSBleHBsaWNpdGVseSBoaWRlIHRoZSBsaXN0J3MKLSAgICAgICAgICogc2VsZWN0aW9uIGFuZCByZXNldCB0byBmYWxzZSB3aGVudmVyIHdlIGtub3cgdGhlIHVzZXIgbW92ZWQgdGhlCi0gICAgICAgICAqIHNlbGVjdGlvbiBiYWNrIHRvIHRoZSBsaXN0LgotICAgICAgICAgKgotICAgICAgICAgKiBXaGVuIHRoaXMgYm9vbGVhbiBpcyB0cnVlLCBpc0luVG91Y2hNb2RlKCkgcmV0dXJucyB0cnVlLCBvdGhlcndpc2UgaXQKLSAgICAgICAgICogcmV0dXJucyBzdXBlci5pc0luVG91Y2hNb2RlKCkuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUxpc3RTZWxlY3Rpb25IaWRkZW47Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPkNyZWF0ZXMgYSBuZXcgbGlzdCB2aWV3IHdyYXBwZXIuPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY29udGV4dCB0aGlzIHZpZXcncyBjb250ZXh0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRHJvcERvd25MaXN0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5kcm9wRG93bkxpc3RWaWV3U3R5bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPkF2b2lkcyBqYXJyaW5nIHNjcm9sbGluZyBlZmZlY3QgYnkgZW5zdXJpbmcgdGhhdCBsaXN0IGVsZW1lbnRzCi0gICAgICAgICAqIG1hZGUgb2YgYSB0ZXh0IHZpZXcgZml0IG9uIGEgc2luZ2xlIGxpbmUuPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcG9zaXRpb24gdGhlIGl0ZW0gaW5kZXggaW4gdGhlIGxpc3QgdG8gZ2V0IGEgdmlldyBmb3IKLSAgICAgICAgICogQHJldHVybiB0aGUgdmlldyBmb3IgdGhlIHNwZWNpZmllZCBpdGVtCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgVmlldyBvYnRhaW5WaWV3KGludCBwb3NpdGlvbiwgYm9vbGVhbltdIGlzU2NyYXApIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IHN1cGVyLm9idGFpblZpZXcocG9zaXRpb24sIGlzU2NyYXApOwotCi0gICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIFRleHRWaWV3KSB7Ci0gICAgICAgICAgICAgICAgKChUZXh0Vmlldykgdmlldykuc2V0SG9yaXpvbnRhbGx5U2Nyb2xsaW5nKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdmlldzsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luVG91Y2hNb2RlKCkgewotICAgICAgICAgICAgLy8gV0FSTklORzogUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnQgd2hlcmUgbUxpc3RTZWxlY3Rpb25IaWRkZW4gaXMgZGVjbGFyZWQKLSAgICAgICAgICAgIHJldHVybiBtTGlzdFNlbGVjdGlvbkhpZGRlbiB8fCBzdXBlci5pc0luVG91Y2hNb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogPHA+UmV0dXJucyB0aGUgZm9jdXMgc3RhdGUgaW4gdGhlIGRyb3AgZG93bi48L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNXaW5kb3dGb2N1cygpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGb2N1c2VkKCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogPHA+UmV0dXJucyB0aGUgZm9jdXMgc3RhdGUgaW4gdGhlIGRyb3AgZG93bi48L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNGb2N1cygpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgaW50W10gb25DcmVhdGVEcmF3YWJsZVN0YXRlKGludCBleHRyYVNwYWNlKSB7Ci0gICAgICAgICAgICBpbnRbXSByZXMgPSBzdXBlci5vbkNyZWF0ZURyYXdhYmxlU3RhdGUoZXh0cmFTcGFjZSk7Ci0gICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBDb25zdGFudElmU3RhdGVtZW50Ci0gICAgICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIkNyZWF0ZWQgZHJhd2FibGUgc3RhdGU6IFsiKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8cmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjB4Iik7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKHJlc1tpXSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIl0iKTsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgogICAgICAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHRleHQgZW50ZXJlZCBpbiB0aGlzIFRleHRWaWV3IGNvbXBsaWVzIHRvCiAgICAgICogYSBjZXJ0YWluIGZvcm1hdC4gIFNpbmNlIHRoZXJlIGlzIG5vIGZvb2xwcm9vZiB3YXkgdG8gcHJldmVudCB0aGUgdXNlciBmcm9tIGxlYXZpbmcKICAgICAgKiB0aGlzIFZpZXcgd2l0aCBhbiBpbmNvcnJlY3QgdmFsdWUgaW4gaXQsIGFsbCB3ZSBjYW4gZG8gaXMgdHJ5IHRvIGZpeCBpdCBvdXJzZWx2ZXMKQEAgLTE2NTUsMTAgKzExNjcsNyBAQAogICAgIHByaXZhdGUgY2xhc3MgUG9wdXBEYXRhU2V0T2JzZXJ2ZXIgZXh0ZW5kcyBEYXRhU2V0T2JzZXJ2ZXIgewogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2VkKCkgewotICAgICAgICAgICAgaWYgKGlzUG9wdXBTaG93aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgcmVzaXplIHRoZSBwb3B1cCB0byBmaXQgdGhlIG5ldyBhZGFwdGVyJ3MgY29udGVudAotICAgICAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwb3B1cCBpcyBub3Qgc2hvd2luZyBhbHJlYWR5LCBzaG93aW5nIGl0IHdpbGwgY2F1c2UKICAgICAgICAgICAgICAgICAvLyB0aGUgbGlzdCBvZiBkYXRhIHNldCBvYnNlcnZlcnMgYXR0YWNoZWQgdG8gdGhlIGFkYXB0ZXIgdG8KICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UuIFdlIGNhbid0IGRvIGl0IGZyb20gaGVyZSwgYmVjYXVzZSB3ZSBhcmUgaW4gdGhlIG1pZGRsZQpAQCAtMTY3MywxNCArMTE4Miw1IEBACiAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JbnZhbGlkYXRlZCgpIHsKLSAgICAgICAgICAgIGlmICghbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgewotICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gZGF0YSB0byBkaXNwbGF5IHNvIG1ha2Ugc3VyZSB3ZSdyZSBub3Qgc2hvd2luZwotICAgICAgICAgICAgICAgIC8vIHRoZSBkcm9wIGRvd24gYW5kIGl0cyBsaXN0Ci0gICAgICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQ3Vyc29yQWRhcHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0N1cnNvckFkYXB0ZXIuamF2YQppbmRleCBiYWE2ODMzLi40Y2Y4Nzg1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQ3Vyc29yQWRhcHRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9DdXJzb3JBZGFwdGVyLmphdmEKQEAgLTgwLDYgKzgwLDE4IEBACiAgICAgcHJvdGVjdGVkIEZpbHRlclF1ZXJ5UHJvdmlkZXIgbUZpbHRlclF1ZXJ5UHJvdmlkZXI7CiAKICAgICAvKioKKyAgICAgKiBJZiBzZXQgdGhlIGFkYXB0ZXIgd2lsbCBjYWxsIHJlcXVlcnkoKSBvbiB0aGUgY3Vyc29yIHdoZW5ldmVyIGEgY29udGVudCBjaGFuZ2UKKyAgICAgKiBub3RpZmljYXRpb24gaXMgZGVsaXZlcmVkLiBJbXBsaWVzIHtAbGluayAjRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQVVUT19SRVFVRVJZID0gMHgwMTsKKworICAgIC8qKgorICAgICAqIElmIHNldCB0aGUgYWRhcHRlciB3aWxsIHJlZ2lzdGVyIGEgY29udGVudCBvYnNlcnZlciBvbiB0aGUgY3Vyc29yIGFuZCB3aWxsIGNhbGwKKyAgICAgKiB7QGxpbmsgI29uQ29udGVudENoYW5nZWQoKX0gd2hlbiBhIG5vdGlmaWNhdGlvbiBjb21lcyBpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVIgPSAweDAyOworCisgICAgLyoqCiAgICAgICogQ29uc3RydWN0b3IuIFRoZSBhZGFwdGVyIHdpbGwgY2FsbCByZXF1ZXJ5KCkgb24gdGhlIGN1cnNvciB3aGVuZXZlcgogICAgICAqIGl0IGNoYW5nZXMgc28gdGhhdCB0aGUgbW9zdCByZWNlbnQgZGF0YSBpcyBhbHdheXMgZGlzcGxheWVkLgogICAgICAqCkBAIC04Nyw3ICs5OSw3IEBACiAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQKICAgICAgKi8KICAgICBwdWJsaWMgQ3Vyc29yQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvciBjKSB7Ci0gICAgICAgIGluaXQoY29udGV4dCwgYywgdHJ1ZSk7CisgICAgICAgIGluaXQoY29udGV4dCwgYywgRkxBR19BVVRPX1JFUVVFUlkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTksMTkgKzExMSw0MyBAQAogICAgICAqICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIGFsd2F5cyBkaXNwbGF5ZWQuCiAgICAgICovCiAgICAgcHVibGljIEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgYm9vbGVhbiBhdXRvUmVxdWVyeSkgewotICAgICAgICBpbml0KGNvbnRleHQsIGMsIGF1dG9SZXF1ZXJ5KTsKKyAgICAgICAgaW5pdChjb250ZXh0LCBjLCBhdXRvUmVxdWVyeSA/IEZMQUdfQVVUT19SRVFVRVJZIDogRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqIEBwYXJhbSBjIFRoZSBjdXJzb3IgZnJvbSB3aGljaCB0byBnZXQgdGhlIGRhdGEuCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gZmxhZ3MgZmxhZ3MgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGJlaGF2aW9yIG9mIHRoZSBhZGFwdGVyCisgICAgICovCisgICAgcHVibGljIEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgaW50IGZsYWdzKSB7CisgICAgICAgIGluaXQoY29udGV4dCwgYywgZmxhZ3MpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGluaXQoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgYm9vbGVhbiBhdXRvUmVxdWVyeSkgeworICAgICAgICBpbml0KGNvbnRleHQsIGMsIGF1dG9SZXF1ZXJ5ID8gRkxBR19BVVRPX1JFUVVFUlkgOiBGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGluaXQoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgaW50IGZsYWdzKSB7CisgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FVVE9fUkVRVUVSWSkgPT0gRkxBR19BVVRPX1JFUVVFUlkpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUjsKKyAgICAgICAgICAgIG1BdXRvUmVxdWVyeSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQXV0b1JlcXVlcnkgPSBmYWxzZTsKKyAgICAgICAgfQogICAgICAgICBib29sZWFuIGN1cnNvclByZXNlbnQgPSBjICE9IG51bGw7Ci0gICAgICAgIG1BdXRvUmVxdWVyeSA9IGF1dG9SZXF1ZXJ5OwogICAgICAgICBtQ3Vyc29yID0gYzsKICAgICAgICAgbURhdGFWYWxpZCA9IGN1cnNvclByZXNlbnQ7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVJvd0lEQ29sdW1uID0gY3Vyc29yUHJlc2VudCA/IGMuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJfaWQiKSA6IC0xOwotICAgICAgICBtQ2hhbmdlT2JzZXJ2ZXIgPSBuZXcgQ2hhbmdlT2JzZXJ2ZXIoKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUikgPT0gRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSKSB7CisgICAgICAgICAgICBtQ2hhbmdlT2JzZXJ2ZXIgPSBuZXcgQ2hhbmdlT2JzZXJ2ZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1DaGFuZ2VPYnNlcnZlciA9IG51bGw7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoY3Vyc29yUHJlc2VudCkgewotICAgICAgICAgICAgYy5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ2hhbmdlT2JzZXJ2ZXIpOworICAgICAgICAgICAgaWYgKG1DaGFuZ2VPYnNlcnZlciAhPSBudWxsKSBjLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CiAgICAgICAgICAgICBjLnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjQ2LDEzICsyODIsMTMgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNoYW5nZU9ic2VydmVyKTsKKyAgICAgICAgICAgIGlmIChtQ2hhbmdlT2JzZXJ2ZXIgIT0gbnVsbCkgbUN1cnNvci51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CiAgICAgICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CiAgICAgICAgICAgICBtQ3Vyc29yLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICAgICAgbUN1cnNvciA9IGN1cnNvcjsKICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjdXJzb3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNoYW5nZU9ic2VydmVyKTsKKyAgICAgICAgICAgIGlmIChtQ2hhbmdlT2JzZXJ2ZXIgIT0gbnVsbCkgY3Vyc29yLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CiAgICAgICAgICAgICBjdXJzb3IucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CiAgICAgICAgICAgICBtUm93SURDb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJfaWQiKTsKICAgICAgICAgICAgIG1EYXRhVmFsaWQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0VkZ2VHbG93LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRWRnZUdsb3cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJjN2JjYS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRWRnZUdsb3cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHBlcmZvcm1zIHRoZSBnbG93IGVmZmVjdCB1c2VkIGF0IHRoZSBlZGdlcyBvZiBzY3JvbGxhYmxlIHdpZGdldHMuCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgRWRnZUdsb3cgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRWRnZUdsb3ciOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0gICAgLy8gVGltZSBpdCB3aWxsIHRha2UgdGhlIGVmZmVjdCB0byBmdWxseSByZWNlZGUgaW4gbXMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVDRURFX1RJTUUgPSAxMDAwOwotCi0gICAgLy8gVGltZSBpdCB3aWxsIHRha2UgYmVmb3JlIGEgcHVsbGVkIGdsb3cgYmVnaW5zIHJlY2VkaW5nCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBVTExfVElNRSA9IDI1MDsKLQotICAgIC8vIFRpbWUgaXQgd2lsbCB0YWtlIGZvciBhIHB1bGxlZCBnbG93IHRvIGRlY2F5IHRvIHBhcnRpYWwgc3RyZW5ndGggYmVmb3JlIHJlbGVhc2UKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFVMTF9ERUNBWV9USU1FID0gMTAwMDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEhFTERfRURHRV9BTFBIQSA9IDAuN2Y7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgSEVMRF9FREdFX1NDQUxFX1kgPSAwLjVmOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEhFTERfR0xPV19BTFBIQSA9IDAuNWY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgSEVMRF9HTE9XX1NDQUxFX1kgPSAwLjVmOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgUFVMTF9HTE9XX0JFR0lOID0gMC41ZjsKLQotICAgIC8vIE1pbmltdW0gdmVsb2NpdHkgdGhhdCB3aWxsIGJlIGFic29yYmVkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9WRUxPQ0lUWSA9IDc1MDsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBFUFNJTE9OID0gMC4wMDFmOwotCi0gICAgcHJpdmF0ZSBEcmF3YWJsZSBtRWRnZTsKLSAgICBwcml2YXRlIERyYXdhYmxlIG1HbG93OwotICAgIHByaXZhdGUgaW50IG1XaWR0aDsKLSAgICBwcml2YXRlIGludCBtSGVpZ2h0OwotCi0gICAgcHJpdmF0ZSBmbG9hdCBtRWRnZUFscGhhOwotICAgIHByaXZhdGUgZmxvYXQgbUVkZ2VTY2FsZVk7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtR2xvd0FscGhhOwotICAgIHByaXZhdGUgZmxvYXQgbUdsb3dTY2FsZVk7Ci0KLSAgICBwcml2YXRlIGZsb2F0IG1FZGdlQWxwaGFTdGFydDsKLSAgICBwcml2YXRlIGZsb2F0IG1FZGdlQWxwaGFGaW5pc2g7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRWRnZVNjYWxlWVN0YXJ0OwotICAgIHByaXZhdGUgZmxvYXQgbUVkZ2VTY2FsZVlGaW5pc2g7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtR2xvd0FscGhhU3RhcnQ7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtR2xvd0FscGhhRmluaXNoOwotICAgIHByaXZhdGUgZmxvYXQgbUdsb3dTY2FsZVlTdGFydDsKLSAgICBwcml2YXRlIGZsb2F0IG1HbG93U2NhbGVZRmluaXNoOwotCi0gICAgcHJpdmF0ZSBsb25nIG1TdGFydFRpbWU7Ci0gICAgcHJpdmF0ZSBpbnQgbUR1cmF0aW9uOwotCi0gICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUludGVycG9sYXRvcjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9JRExFID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFVMTCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0FCU09SQiA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1JFQ0VERSA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BVTExfREVDQVkgPSA0OwotCi0gICAgcHJpdmF0ZSBpbnQgbVN0YXRlID0gU1RBVEVfSURMRTsKLQotICAgIHByaXZhdGUgZmxvYXQgbVB1bGxEaXN0YW5jZTsKLQotICAgIHB1YmxpYyBFZGdlR2xvdyhEcmF3YWJsZSBlZGdlLCBEcmF3YWJsZSBnbG93KSB7Ci0gICAgICAgIG1FZGdlID0gZWRnZTsKLSAgICAgICAgbUdsb3cgPSBnbG93OwotCi0gICAgICAgIG1JbnRlcnBvbGF0b3IgPSBuZXcgRGVjZWxlcmF0ZUludGVycG9sYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIG1XaWR0aCA9IHdpZHRoOwotICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmluaXNoZWQoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhdGUgPT0gU1RBVEVfSURMRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsIHdoZW4gdGhlIG9iamVjdCBpcyBwdWxsZWQgYnkgdGhlIHVzZXIuCi0gICAgICogQHBhcmFtIGRlbHRhRGlzdGFuY2UgQ2hhbmdlIGluIGRpc3RhbmNlIHNpbmNlIHRoZSBsYXN0IGNhbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblB1bGwoZmxvYXQgZGVsdGFEaXN0YW5jZSkgewotICAgICAgICBmaW5hbCBsb25nIG5vdyA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0gICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfUFVMTF9ERUNBWSAmJiBub3cgLSBtU3RhcnRUaW1lIDwgbUR1cmF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9QVUxMKSB7Ci0gICAgICAgICAgICBtR2xvd1NjYWxlWSA9IFBVTExfR0xPV19CRUdJTjsKLSAgICAgICAgfQotICAgICAgICBtU3RhdGUgPSBTVEFURV9QVUxMOwotCi0gICAgICAgIG1TdGFydFRpbWUgPSBub3c7Ci0gICAgICAgIG1EdXJhdGlvbiA9IFBVTExfVElNRTsKLQotICAgICAgICBtUHVsbERpc3RhbmNlICs9IGRlbHRhRGlzdGFuY2U7Ci0gICAgICAgIGZsb2F0IGRpc3RhbmNlID0gTWF0aC5hYnMobVB1bGxEaXN0YW5jZSk7Ci0KLSAgICAgICAgbUVkZ2VBbHBoYSA9IG1FZGdlQWxwaGFTdGFydCA9IE1hdGgubWF4KEhFTERfRURHRV9BTFBIQSwgTWF0aC5taW4oZGlzdGFuY2UsIDEuZikpOwotICAgICAgICBtRWRnZVNjYWxlWSA9IG1FZGdlU2NhbGVZU3RhcnQgPSBNYXRoLm1heChIRUxEX0VER0VfU0NBTEVfWSwgTWF0aC5taW4oZGlzdGFuY2UsIDIuZikpOwotCi0gICAgICAgIG1HbG93QWxwaGEgPSBtR2xvd0FscGhhU3RhcnQgPSBNYXRoLm1heCgwLjVmLAotICAgICAgICAgICAgICAgIE1hdGgubWluKG1HbG93QWxwaGEgKyBNYXRoLmFicyhkZWx0YURpc3RhbmNlKSwgMS5mKSk7Ci0KLSAgICAgICAgZmxvYXQgZ2xvd0NoYW5nZSA9IE1hdGguYWJzKGRlbHRhRGlzdGFuY2UpOwotICAgICAgICBpZiAoZGVsdGFEaXN0YW5jZSA+IDAgJiYgbVB1bGxEaXN0YW5jZSA8IDApIHsKLSAgICAgICAgICAgIGdsb3dDaGFuZ2UgPSAtZ2xvd0NoYW5nZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVB1bGxEaXN0YW5jZSA9PSAwKSB7Ci0gICAgICAgICAgICBtR2xvd1NjYWxlWSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgbUdsb3dTY2FsZVkgPSBtR2xvd1NjYWxlWVN0YXJ0ID0gTWF0aC5tYXgoMCwgbUdsb3dTY2FsZVkgKyBnbG93Q2hhbmdlICogMik7Ci0KLSAgICAgICAgbUVkZ2VBbHBoYUZpbmlzaCA9IG1FZGdlQWxwaGE7Ci0gICAgICAgIG1FZGdlU2NhbGVZRmluaXNoID0gbUVkZ2VTY2FsZVk7Ci0gICAgICAgIG1HbG93QWxwaGFGaW5pc2ggPSBtR2xvd0FscGhhOwotICAgICAgICBtR2xvd1NjYWxlWUZpbmlzaCA9IG1HbG93U2NhbGVZOwotCi0gICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25QdWxsKCIgKyBkaXN0YW5jZSArICIsICIgKyBkZWx0YURpc3RhbmNlICsgIikiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsIHdoZW4gdGhlIG9iamVjdCBpcyByZWxlYXNlZCBhZnRlciBiZWluZyBwdWxsZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25SZWxlYXNlKCkgewotICAgICAgICBtUHVsbERpc3RhbmNlID0gMDsKLQotICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX1BVTEwgJiYgbVN0YXRlICE9IFNUQVRFX1BVTExfREVDQVkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIm9uUmVsZWFzZSIpOwotCi0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX1JFQ0VERTsKLSAgICAgICAgbUVkZ2VBbHBoYVN0YXJ0ID0gbUVkZ2VBbHBoYTsKLSAgICAgICAgbUVkZ2VTY2FsZVlTdGFydCA9IG1FZGdlU2NhbGVZOwotICAgICAgICBtR2xvd0FscGhhU3RhcnQgPSBtR2xvd0FscGhhOwotICAgICAgICBtR2xvd1NjYWxlWVN0YXJ0ID0gbUdsb3dTY2FsZVk7Ci0KLSAgICAgICAgbUVkZ2VBbHBoYUZpbmlzaCA9IDAuZjsKLSAgICAgICAgbUVkZ2VTY2FsZVlGaW5pc2ggPSAwLjFmOwotICAgICAgICBtR2xvd0FscGhhRmluaXNoID0gMC5mOwotICAgICAgICBtR2xvd1NjYWxlWUZpbmlzaCA9IDAuMWY7Ci0KLSAgICAgICAgbVN0YXJ0VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0gICAgICAgIG1EdXJhdGlvbiA9IFJFQ0VERV9USU1FOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGwgd2hlbiB0aGUgZWZmZWN0IGFic29yYnMgYW4gaW1wYWN0IGF0IHRoZSBnaXZlbiB2ZWxvY2l0eS4KLSAgICAgKiBAcGFyYW0gdmVsb2NpdHkgVmVsb2NpdHkgYXQgaW1wYWN0IGluIHBpeGVscyBwZXIgc2Vjb25kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uQWJzb3JiKGludCB2ZWxvY2l0eSkgewotICAgICAgICBtU3RhdGUgPSBTVEFURV9BQlNPUkI7Ci0gICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25BYnNvcmIgdW5jb29rZWQgdmVsb2NpdHk6ICIgKyB2ZWxvY2l0eSk7Ci0gICAgICAgIHZlbG9jaXR5ID0gTWF0aC5tYXgoTUlOX1ZFTE9DSVRZLCBNYXRoLmFicyh2ZWxvY2l0eSkpOwotCi0gICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICBtRHVyYXRpb24gPSAoaW50KSAodmVsb2NpdHkgKiAwLjAzZik7Ci0KLSAgICAgICAgbUVkZ2VBbHBoYVN0YXJ0ID0gMC41ZjsKLSAgICAgICAgbUVkZ2VTY2FsZVlTdGFydCA9IDAuMmY7Ci0gICAgICAgIG1HbG93QWxwaGFTdGFydCA9IDAuNWY7Ci0gICAgICAgIG1HbG93U2NhbGVZU3RhcnQgPSAwLmY7Ci0KLSAgICAgICAgbUVkZ2VBbHBoYUZpbmlzaCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHZlbG9jaXR5ICogMC4wMWYsIDEpKTsKLSAgICAgICAgbUVkZ2VTY2FsZVlGaW5pc2ggPSAxLmY7Ci0gICAgICAgIG1HbG93QWxwaGFGaW5pc2ggPSAxLmY7Ci0gICAgICAgIG1HbG93U2NhbGVZRmluaXNoID0gTWF0aC5taW4odmVsb2NpdHkgKiAwLjAwMWYsIDEpOwotCi0gICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25BYnNvcmIoIiArIHZlbG9jaXR5ICsgIik6IGR1cmF0aW9uICIgKyBtRHVyYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERyYXcgaW50byB0aGUgcHJvdmlkZWQgY2FudmFzLgotICAgICAqIEFzc3VtZXMgdGhhdCB0aGUgY2FudmFzIGhhcyBiZWVuIHJvdGF0ZWQgYWNjb3JkaW5nbHkgYW5kIHRoZSBzaXplIGhhcyBiZWVuIHNldC4KLSAgICAgKiBUaGUgZWZmZWN0IHdpbGwgYmUgZHJhd24gdGhlIGZ1bGwgd2lkdGggb2YgWD0wIHRvIFg9d2lkdGgsIGVtaXR0aW5nIGZyb20gWT0wIGFuZCBleHRlbmRpbmcKLSAgICAgKiB0byBzb21lIGZhY3RvciA8IDEuZiBvZiBoZWlnaHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FudmFzIENhbnZhcyB0byBkcmF3IGludG8KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZHJhd2luZyBzaG91bGQgY29udGludWUgYmV5b25kIHRoaXMgZnJhbWUgdG8gY29udGludWUgdGhlIGFuaW1hdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICB1cGRhdGUoKTsKLQotICAgICAgICBmaW5hbCBpbnQgZWRnZUhlaWdodCA9IG1FZGdlLmdldEludHJpbnNpY0hlaWdodCgpOwotICAgICAgICBmaW5hbCBpbnQgZ2xvd0hlaWdodCA9IG1HbG93LmdldEludHJpbnNpY0hlaWdodCgpOwotCi0gICAgICAgIG1HbG93LnNldEFscGhhKChpbnQpIChNYXRoLm1heCgwLCBNYXRoLm1pbihtR2xvd0FscGhhLCAxKSkgKiAyNTUpKTsKLSAgICAgICAgbUdsb3cuc2V0Qm91bmRzKDAsIDAsIG1XaWR0aCwgKGludCkgKGdsb3dIZWlnaHQgKiBtR2xvd1NjYWxlWSkpOwotICAgICAgICBtR2xvdy5kcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgbUVkZ2Uuc2V0QWxwaGEoKGludCkgKE1hdGgubWF4KDAsIE1hdGgubWluKG1FZGdlQWxwaGEsIDEpKSAqIDI1NSkpOwotICAgICAgICBtRWRnZS5zZXRCb3VuZHMoMCwKLSAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgIG1XaWR0aCwKLSAgICAgICAgICAgICAgICAoaW50KSAoZWRnZUhlaWdodCAqIG1FZGdlU2NhbGVZKSk7Ci0gICAgICAgIG1FZGdlLmRyYXcoY2FudmFzKTsKLSAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJkcmF3KCkgZ2xvdygiICsgbUdsb3dBbHBoYSArICIsICIgKyBtR2xvd1NjYWxlWSArICIpIGVkZ2UoIiArIG1FZGdlQWxwaGEgKwotICAgICAgICAgICAgICAgICIsICIgKyBtRWRnZVNjYWxlWSArICIpIik7Ci0KLSAgICAgICAgcmV0dXJuIG1TdGF0ZSAhPSBTVEFURV9JRExFOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGUoKSB7Ci0gICAgICAgIGZpbmFsIGxvbmcgdGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0gICAgICAgIGZpbmFsIGZsb2F0IHQgPSBNYXRoLm1pbigoZmxvYXQpICh0aW1lIC0gbVN0YXJ0VGltZSkgLyBtRHVyYXRpb24sIDEuZik7Ci0KLSAgICAgICAgZmluYWwgZmxvYXQgaW50ZXJwID0gbUludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKHQpOwotCi0gICAgICAgIG1FZGdlQWxwaGEgPSBtRWRnZUFscGhhU3RhcnQgKyAobUVkZ2VBbHBoYUZpbmlzaCAtIG1FZGdlQWxwaGFTdGFydCkgKiBpbnRlcnA7Ci0gICAgICAgIG1FZGdlU2NhbGVZID0gbUVkZ2VTY2FsZVlTdGFydCArIChtRWRnZVNjYWxlWUZpbmlzaCAtIG1FZGdlU2NhbGVZU3RhcnQpICogaW50ZXJwOwotICAgICAgICBtR2xvd0FscGhhID0gbUdsb3dBbHBoYVN0YXJ0ICsgKG1HbG93QWxwaGFGaW5pc2ggLSBtR2xvd0FscGhhU3RhcnQpICogaW50ZXJwOwotICAgICAgICBtR2xvd1NjYWxlWSA9IG1HbG93U2NhbGVZU3RhcnQgKyAobUdsb3dTY2FsZVlGaW5pc2ggLSBtR2xvd1NjYWxlWVN0YXJ0KSAqIGludGVycDsKLQotICAgICAgICBpZiAodCA+PSAxLmYgLSBFUFNJTE9OKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfQUJTT1JCOgotICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9SRUNFREU7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSBSRUNFREVfVElNRTsKLQotICAgICAgICAgICAgICAgICAgICBtRWRnZUFscGhhU3RhcnQgPSBtRWRnZUFscGhhOwotICAgICAgICAgICAgICAgICAgICBtRWRnZVNjYWxlWVN0YXJ0ID0gbUVkZ2VTY2FsZVk7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93QWxwaGFTdGFydCA9IG1HbG93QWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93U2NhbGVZU3RhcnQgPSBtR2xvd1NjYWxlWTsKLQotICAgICAgICAgICAgICAgICAgICBtRWRnZUFscGhhRmluaXNoID0gMC5mOwotICAgICAgICAgICAgICAgICAgICBtRWRnZVNjYWxlWUZpbmlzaCA9IDAuMWY7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93QWxwaGFGaW5pc2ggPSAwLmY7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93U2NhbGVZRmluaXNoID0gbUdsb3dTY2FsZVk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiU1RBVEVfQUJTT1JCID0+IFNUQVRFX1JFQ0VERSIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1BVTEw6Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BVTExfREVDQVk7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSBQVUxMX0RFQ0FZX1RJTUU7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VBbHBoYVN0YXJ0ID0gbUVkZ2VBbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VTY2FsZVlTdGFydCA9IG1FZGdlU2NhbGVZOwotICAgICAgICAgICAgICAgICAgICBtR2xvd0FscGhhU3RhcnQgPSBtR2xvd0FscGhhOwotICAgICAgICAgICAgICAgICAgICBtR2xvd1NjYWxlWVN0YXJ0ID0gbUdsb3dTY2FsZVk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VBbHBoYUZpbmlzaCA9IE1hdGgubWluKG1FZGdlQWxwaGFTdGFydCwgSEVMRF9FREdFX0FMUEhBKTsKLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VTY2FsZVlGaW5pc2ggPSBNYXRoLm1pbihtRWRnZVNjYWxlWVN0YXJ0LCBIRUxEX0VER0VfU0NBTEVfWSk7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93QWxwaGFGaW5pc2ggPSBNYXRoLm1pbihtR2xvd0FscGhhU3RhcnQsIEhFTERfR0xPV19BTFBIQSk7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93U2NhbGVZRmluaXNoID0gTWF0aC5taW4obUdsb3dTY2FsZVksIEhFTERfR0xPV19TQ0FMRV9ZKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJTVEFURV9QVUxMID0+IFNUQVRFX1BVTExfREVDQVkiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9QVUxMX0RFQ0FZOgotICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nOyB3YWl0IGZvciByZWxlYXNlCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfUkVDRURFOgotICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9JRExFOwotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIlNUQVRFX1JFQ0VERSA9PiBTVEFURV9JRExFIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0ZyYW1lTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRnJhbWVMYXlvdXQuamF2YQppbmRleCBlNDQ1MTgwLi41NTlhNWZlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRnJhbWVMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRnJhbWVMYXlvdXQuamF2YQpAQCAtMzIsOCArMzIsOCBAQAogCiAvKioKICAqIEZyYW1lTGF5b3V0IGlzIGRlc2lnbmVkIHRvIGJsb2NrIG91dCBhbiBhcmVhIG9uIHRoZSBzY3JlZW4gdG8gZGlzcGxheQotICogYSBzaW5nbGUgaXRlbS4gWW91IGNhbiBhZGQgbXVsdGlwbGUgY2hpbGRyZW4gdG8gYSBGcmFtZUxheW91dCwgYnV0IGFsbAotICogY2hpbGRyZW4gYXJlIHBlZ2dlZCB0byB0aGUgdG9wIGxlZnQgb2YgdGhlIHNjcmVlbi4KKyAqIGEgc2luZ2xlIGl0ZW0uIFlvdSBjYW4gYWRkIG11bHRpcGxlIGNoaWxkcmVuIHRvIGEgRnJhbWVMYXlvdXQgYW5kIGNvbnRyb2wgdGhlaXIKKyAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgRnJhbWVMYXlvdXQgdXNpbmcge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0LkxheW91dFBhcmFtcyNncmF2aXR5fS4KICAqIENoaWxkcmVuIGFyZSBkcmF3biBpbiBhIHN0YWNrLCB3aXRoIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIGNoaWxkIG9uIHRvcC4KICAqIFRoZSBzaXplIG9mIHRoZSBmcmFtZSBsYXlvdXQgaXMgdGhlIHNpemUgb2YgaXRzIGxhcmdlc3QgY2hpbGQgKHBsdXMgcGFkZGluZyksIHZpc2libGUKICAqIG9yIG5vdCAoaWYgdGhlIEZyYW1lTGF5b3V0J3MgcGFyZW50IHBlcm1pdHMpLiBWaWV3cyB0aGF0IGFyZSBHT05FIGFyZSB1c2VkIGZvciBzaXppbmcKQEAgLTQ0MCw2ICs0NDAsOCBAQAogICAgICAqIFBlci1jaGlsZCBsYXlvdXQgaW5mb3JtYXRpb24gZm9yIGxheW91dHMgdGhhdCBzdXBwb3J0IG1hcmdpbnMuCiAgICAgICogU2VlIHtAbGluayBhbmRyb2lkLlIuc3R5bGVhYmxlI0ZyYW1lTGF5b3V0X0xheW91dCBGcmFtZUxheW91dCBMYXlvdXQgQXR0cmlidXRlc30KICAgICAgKiBmb3IgYSBsaXN0IG9mIGFsbCBjaGlsZCB2aWV3IGF0dHJpYnV0ZXMgdGhhdCB0aGlzIGNsYXNzIHN1cHBvcnRzLgorICAgICAqIAorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0ZyYW1lTGF5b3V0X0xheW91dF9sYXlvdXRfZ3Jhdml0eQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGF5b3V0UGFyYW1zIGV4dGVuZHMgTWFyZ2luTGF5b3V0UGFyYW1zIHsKICAgICAgICAgLyoqCkBAIC00NDcsNiArNDQ5LDggQEAKICAgICAgICAgICogYXJlIGFzc29jaWF0ZWQuCiAgICAgICAgICAqCiAgICAgICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LkdyYXZpdHkKKyAgICAgICAgICogCisgICAgICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0ZyYW1lTGF5b3V0X0xheW91dF9sYXlvdXRfZ3Jhdml0eQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGludCBncmF2aXR5ID0gLTE7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HYWxsZXJ5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR2FsbGVyeS5qYXZhCmluZGV4IGNjZDM3ZDMuLjk3ODk2NTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HYWxsZXJ5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dhbGxlcnkuamF2YQpAQCAtMTIxMCw3ICsxMjEwLDcgQEAKIAogICAgICAgICAvLyBXZSB1bmZvY3VzIHRoZSBvbGQgY2hpbGQgZG93biBoZXJlIHNvIHRoZSBhYm92ZSBoYXNGb2N1cyBjaGVjawogICAgICAgICAvLyByZXR1cm5zIHRydWUKLSAgICAgICAgaWYgKG9sZFNlbGVjdGVkQ2hpbGQgIT0gbnVsbCkgeworICAgICAgICBpZiAob2xkU2VsZWN0ZWRDaGlsZCAhPSBudWxsICYmIG9sZFNlbGVjdGVkQ2hpbGQgIT0gY2hpbGQpIHsKIAogICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGl0cyBkcmF3YWJsZSBzdGF0ZSBkb2Vzbid0IGNvbnRhaW4gJ3NlbGVjdGVkJwogICAgICAgICAgICAgb2xkU2VsZWN0ZWRDaGlsZC5zZXRTZWxlY3RlZChmYWxzZSk7CkBAIC0xMjY2LDYgKzEyNjYsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgaWYgKGdhaW5Gb2N1cyAmJiBtU2VsZWN0ZWRDaGlsZCAhPSBudWxsKSB7CiAgICAgICAgICAgICBtU2VsZWN0ZWRDaGlsZC5yZXF1ZXN0Rm9jdXMoZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIG1TZWxlY3RlZENoaWxkLnNldFNlbGVjdGVkKHRydWUpOwogICAgICAgICB9CiAKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkVmlldy5qYXZhCmluZGV4IGE3MzAwYzIuLmRmZmU2ODUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkVmlldy5qYXZhCkBAIC0xNywxNSArMTcsMTggQEAKIHBhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU291bmRFZmZlY3RDb25zdGFudHM7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uR3JpZExheW91dEFuaW1hdGlvbkNvbnRyb2xsZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MuUmVtb3RlVmlldzsKIAogCiAvKioKQEAgLTM1LDYgKzM4LDcgQEAKICAqIDxwPlNlZSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdmlld3MvaGVsbG8tZ3JpZHZpZXcuaHRtbCI+R3JpZAogICogVmlldyB0dXRvcmlhbDwvYT4uPC9wPgogICovCitAUmVtb3RlVmlldwogcHVibGljIGNsYXNzIEdyaWRWaWV3IGV4dGVuZHMgQWJzTGlzdFZpZXcgewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX1NUUkVUQ0ggPSAwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUkVUQ0hfU1BBQ0lORyA9IDE7CkBAIC0xMDMsMTkgKzEwNyw0OSBAQAogICAgICAgICBhLnJlY3ljbGUoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZXQgaG93IHRoZSB1c2VyIG1heSBzZWxlY3QgaXRlbXMgZnJvbSB0aGUgZ3JpZC4KKyAgICAgKgorICAgICAqIDxwPkdyaWRWaWV3IG9ubHkgc3VwcG9ydHMge0BsaW5rIEFic0xpc3RWaWV3I0NIT0lDRV9NT0RFX05PTkV9IGFuZAorICAgICAqIHtAbGluayBBYnNMaXN0VmlldyNDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTH0uIEF0dGVtcHRpbmcgdG8gc2V0IGFuIHVuc3VwcG9ydGVkIGNob2ljZQorICAgICAqIG1vZGUgd2lsbCB0aHJvdyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRDaG9pY2VNb2RlKGludCBjaG9pY2VNb2RlKSB7CisgICAgICAgIHN3aXRjaCAoY2hvaWNlTW9kZSkgeworICAgICAgICBjYXNlIENIT0lDRV9NT0RFX05PTkU6CisgICAgICAgIGNhc2UgQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUw6CisgICAgICAgICAgICBzdXBlci5zZXRDaG9pY2VNb2RlKGNob2ljZU1vZGUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgY2hvaWNlIG1vZGUgIiArIGNob2ljZU1vZGUpOworICAgICAgICB9CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIExpc3RBZGFwdGVyIGdldEFkYXB0ZXIoKSB7CiAgICAgICAgIHJldHVybiBtQWRhcHRlcjsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoaXMgQWJzTGlzdFZpZXcgdG8gdXNlIGEgcmVtb3RlIHZpZXdzIGFkYXB0ZXIgd2hpY2ggY29ubmVjdHMgdG8gYSBSZW1vdGVWaWV3c1NlcnZpY2UKKyAgICAgKiB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgaW50ZW50LgorICAgICAqIEBwYXJhbSBpbnRlbnQgdGhlIGludGVudCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UgZm9yIHRoZSBhZGFwdGVyIHRvIGNvbm5lY3QgdG8uCisgICAgICovCisgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlVmlld3NBZGFwdGVyKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgc3VwZXIuc2V0UmVtb3RlVmlld3NBZGFwdGVyKGludGVudCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZGF0YSBiZWhpbmQgdGhpcyBHcmlkVmlldy4KICAgICAgKgogICAgICAqIEBwYXJhbSBhZGFwdGVyIHRoZSBhZGFwdGVyIHByb3ZpZGluZyB0aGUgZ3JpZCdzIGRhdGEKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKLSAgICAgICAgaWYgKG51bGwgIT0gbUFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbURhdGFTZXRPYnNlcnZlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBtQWRhcHRlci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOwogICAgICAgICB9CiAKQEAgLTEyNSw3ICsxNTksMTAgQEAKIAogICAgICAgICBtT2xkU2VsZWN0ZWRQb3NpdGlvbiA9IElOVkFMSURfUE9TSVRJT047CiAgICAgICAgIG1PbGRTZWxlY3RlZFJvd0lkID0gSU5WQUxJRF9ST1dfSUQ7Ci0gICAgICAgIAorCisgICAgICAgIC8vIEFic0xpc3RWaWV3I3NldEFkYXB0ZXIgd2lsbCB1cGRhdGUgY2hvaWNlIG1vZGUgc3RhdGVzLgorICAgICAgICBzdXBlci5zZXRBZGFwdGVyKGFkYXB0ZXIpOworCiAgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBtT2xkSXRlbUNvdW50ID0gbUl0ZW1Db3VudDsKICAgICAgICAgICAgIG1JdGVtQ291bnQgPSBtQWRhcHRlci5nZXRDb3VudCgpOwpAQCAtNzQyLDYgKzc3OSwyNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNtb290aGx5IHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgcG9zaXRpb24uIFRoZSB2aWV3IHdpbGwKKyAgICAgKiBzY3JvbGwgc3VjaCB0aGF0IHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24gaXMgZGlzcGxheWVkLgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBTY3JvbGwgdG8gdGhpcyBhZGFwdGVyIHBvc2l0aW9uLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNtb290aFNjcm9sbFRvUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIHN1cGVyLnNtb290aFNjcm9sbFRvUG9zaXRpb24ocG9zaXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNtb290aGx5IHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgcG9zaXRpb24gb2Zmc2V0LiBUaGUgdmlldyB3aWxsCisgICAgICogc2Nyb2xsIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBhbW91bnQgdG8gb2Zmc2V0IGZyb20gdGhlIGFkYXB0ZXIgcG9zaXRpb24gdG8gc2Nyb2xsIHRvLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNtb290aFNjcm9sbEJ5T2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgc3VwZXIuc21vb3RoU2Nyb2xsQnlPZmZzZXQob2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBGaWxscyB0aGUgZ3JpZCBiYXNlZCBvbiBwb3NpdGlvbmluZyB0aGUgbmV3IHNlbGVjdGlvbiByZWxhdGl2ZSB0byB0aGUgb2xkCiAgICAgICogc2VsZWN0aW9uLiBUaGUgbmV3IHNlbGVjdGlvbiB3aWxsIGJlIHBsYWNlZCBhdCwgYWJvdmUsIG9yIGJlbG93IHRoZQogICAgICAqIGxvY2F0aW9uIG9mIHRoZSBuZXcgc2VsZWN0aW9uIGRlcGVuZGluZyBvbiBob3cgdGhlIHNlbGVjdGlvbiBpcyBtb3ZpbmcuCkBAIC0xMjgxLDYgKzEzMzgsMTIgQEAKICAgICAgICAgICAgIGNoaWxkLnNldFByZXNzZWQoaXNQcmVzc2VkKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FICYmIG1DaGVja1N0YXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDaGVja2FibGUpIHsKKyAgICAgICAgICAgICAgICAoKENoZWNrYWJsZSkgY2hpbGQpLnNldENoZWNrZWQobUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgaWYgKG5lZWRUb01lYXN1cmUpIHsKICAgICAgICAgICAgIGludCBjaGlsZEhlaWdodFNwZWMgPSBWaWV3R3JvdXAuZ2V0Q2hpbGRNZWFzdXJlU3BlYygKICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKDAsIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKSwgMCwgcC5oZWlnaHQpOwpAQCAtMTQ5MSw5ICsxNTU0LDkgQEAKICAgICAgICAgaW50IG5leHRQYWdlID0gLTE7CiAKICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBGT0NVU19VUCkgewotICAgICAgICAgICAgbmV4dFBhZ2UgPSBNYXRoLm1heCgwLCBtU2VsZWN0ZWRQb3NpdGlvbiAtIGdldENoaWxkQ291bnQoKSAtIDEpOworICAgICAgICAgICAgbmV4dFBhZ2UgPSBNYXRoLm1heCgwLCBtU2VsZWN0ZWRQb3NpdGlvbiAtIGdldENoaWxkQ291bnQoKSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IEZPQ1VTX0RPV04pIHsKLSAgICAgICAgICAgIG5leHRQYWdlID0gTWF0aC5taW4obUl0ZW1Db3VudCAtIDEsIG1TZWxlY3RlZFBvc2l0aW9uICsgZ2V0Q2hpbGRDb3VudCgpIC0gMSk7CisgICAgICAgICAgICBuZXh0UGFnZSA9IE1hdGgubWluKG1JdGVtQ291bnQgLSAxLCBtU2VsZWN0ZWRQb3NpdGlvbiArIGdldENoaWxkQ291bnQoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobmV4dFBhZ2UgPj0gMCkgewpAQCAtMTc3Nyw2ICsxODQwLDE5IEBACiAgICAgICAgICAgICByZXF1ZXN0TGF5b3V0SWZOZWNlc3NhcnkoKTsKICAgICAgICAgfQogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBncmlkLiAKKyAgICAgKiBSZXR1cm5zIHtAbGluayAjQVVUT19GSVR9IGlmIHRoZSBHcmlkIGhhcyBuZXZlciBiZWVuIGxhaWQgb3V0LgorICAgICAqCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjR3JpZFZpZXdfbnVtQ29sdW1ucworICAgICAqIAorICAgICAqIEBzZWUgI3NldE51bUNvbHVtbnMoaW50KQorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHB1YmxpYyBpbnQgZ2V0TnVtQ29sdW1ucygpIHsgIAorICAgICAgICByZXR1cm4gbU51bUNvbHVtbnM7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogTWFrZSBzdXJlIHZpZXdzIGFyZSB0b3VjaGluZyB0aGUgdG9wIG9yIGJvdHRvbSBlZGdlLCBhcyBhcHByb3ByaWF0ZSBmb3IKQEAgLTE4NzYsMTIgKzE5NTIsNyBAQAogICAgICAgICAvLyBUT0RPOiBBY2NvdW50IGZvciB2ZXJ0aWNhbCBzcGFjaW5nIHRvbwogICAgICAgICBmaW5hbCBpbnQgbnVtQ29sdW1ucyA9IG1OdW1Db2x1bW5zOwogICAgICAgICBmaW5hbCBpbnQgcm93Q291bnQgPSAobUl0ZW1Db3VudCArIG51bUNvbHVtbnMgLSAxKSAvIG51bUNvbHVtbnM7Ci0gICAgICAgIGludCByZXN1bHQgPSBNYXRoLm1heChyb3dDb3VudCAqIDEwMCwgMCk7Ci0gICAgICAgIGlmIChtU2Nyb2xsWSAhPSAwKSB7Ci0gICAgICAgICAgICAvLyBDb21wZW5zYXRlIGZvciBvdmVyc2Nyb2xsCi0gICAgICAgICAgICByZXN1bHQgKz0gTWF0aC5hYnMoKGludCkgKChmbG9hdCkgbVNjcm9sbFkgLyBnZXRIZWlnaHQoKSAqIHJvd0NvdW50ICogMTAwKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIE1hdGgubWF4KHJvd0NvdW50ICogMTAwLCAwKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Ib3Jpem9udGFsU2Nyb2xsVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0hvcml6b250YWxTY3JvbGxWaWV3LmphdmEKaW5kZXggMzQ5M2Y0OS4uZTMwZDRjOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0hvcml6b250YWxTY3JvbGxWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0hvcml6b250YWxTY3JvbGxWaWV3LmphdmEKQEAgLTE2LDI0ICsxNiwxOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKLQotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkZvY3VzRmluZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZlbG9jaXR5VHJhY2tlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkZvY3VzRmluZGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1BhcmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCkBAIC01OCw2ICs1Myw4IEBACiAgKiB3aXRoaW4gYSBsYXJnZXIgY29udGFpbmVyLgogICoKICAqIDxwPkhvcml6b250YWxTY3JvbGxWaWV3IG9ubHkgc3VwcG9ydHMgaG9yaXpvbnRhbCBzY3JvbGxpbmcuCisgKiAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0hvcml6b250YWxTY3JvbGxWaWV3X2ZpbGxWaWV3cG9ydCAKICAqLwogcHVibGljIGNsYXNzIEhvcml6b250YWxTY3JvbGxWaWV3IGV4dGVuZHMgRnJhbWVMYXlvdXQgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTklNQVRFRF9TQ1JPTExfR0FQID0gU2Nyb2xsVmlldy5BTklNQVRFRF9TQ1JPTExfR0FQOwpAQCAtNjgsOSArNjUsNyBAQAogICAgIHByaXZhdGUgbG9uZyBtTGFzdFNjcm9sbDsKIAogICAgIHByaXZhdGUgZmluYWwgUmVjdCBtVGVtcFJlY3QgPSBuZXcgUmVjdCgpOwotICAgIHByaXZhdGUgT3ZlclNjcm9sbGVyIG1TY3JvbGxlcjsKLSAgICBwcml2YXRlIEVkZ2VHbG93IG1FZGdlR2xvd0xlZnQ7Ci0gICAgcHJpdmF0ZSBFZGdlR2xvdyBtRWRnZUdsb3dSaWdodDsKKyAgICBwcml2YXRlIFNjcm9sbGVyIG1TY3JvbGxlcjsKIAogICAgIC8qKgogICAgICAqIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBhcmUgbW92aW5nIGZvY3VzIG91cnNlbHZlcy4gVGhpcyBpcyBzbyB0aGUKQEAgLTEyNCw5ICsxMTksNiBAQAogICAgIHByaXZhdGUgaW50IG1NaW5pbXVtVmVsb2NpdHk7CiAgICAgcHJpdmF0ZSBpbnQgbU1heGltdW1WZWxvY2l0eTsKICAgICAKLSAgICBwcml2YXRlIGludCBtT3ZlcnNjcm9sbERpc3RhbmNlOwotICAgIHByaXZhdGUgaW50IG1PdmVyZmxpbmdEaXN0YW5jZTsKLQogICAgIC8qKgogICAgICAqIElEIG9mIHRoZSBhY3RpdmUgcG9pbnRlci4gVGhpcyBpcyB1c2VkIHRvIHJldGFpbiBjb25zaXN0ZW5jeSBkdXJpbmcKICAgICAgKiBkcmFncy9mbGluZ3MgaWYgbXVsdGlwbGUgcG9pbnRlcnMgYXJlIHVzZWQuCkBAIC0xOTksNyArMTkxLDcgQEAKIAogCiAgICAgcHJpdmF0ZSB2b2lkIGluaXRTY3JvbGxWaWV3KCkgewotICAgICAgICBtU2Nyb2xsZXIgPSBuZXcgT3ZlclNjcm9sbGVyKGdldENvbnRleHQoKSk7CisgICAgICAgIG1TY3JvbGxlciA9IG5ldyBTY3JvbGxlcihnZXRDb250ZXh0KCkpOwogICAgICAgICBzZXRGb2N1c2FibGUodHJ1ZSk7CiAgICAgICAgIHNldERlc2NlbmRhbnRGb2N1c2FiaWxpdHkoRk9DVVNfQUZURVJfREVTQ0VOREFOVFMpOwogICAgICAgICBzZXRXaWxsTm90RHJhdyhmYWxzZSk7CkBAIC0yMDcsOCArMTk5LDYgQEAKICAgICAgICAgbVRvdWNoU2xvcCA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkVG91Y2hTbG9wKCk7CiAgICAgICAgIG1NaW5pbXVtVmVsb2NpdHkgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZE1pbmltdW1GbGluZ1ZlbG9jaXR5KCk7CiAgICAgICAgIG1NYXhpbXVtVmVsb2NpdHkgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZE1heGltdW1GbGluZ1ZlbG9jaXR5KCk7Ci0gICAgICAgIG1PdmVyc2Nyb2xsRGlzdGFuY2UgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZE92ZXJzY3JvbGxEaXN0YW5jZSgpOwotICAgICAgICBtT3ZlcmZsaW5nRGlzdGFuY2UgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZE92ZXJmbGluZ0Rpc3RhbmNlKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yNjAsMjAgKzI1MCwyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgU2Nyb2xsVmlldydzIGNvbnRlbnQgaXMgc3RyZXRjaGVkIHRvIGZpbGwgdGhlIHZpZXdwb3J0LgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgSG9yaXpvbnRhbFNjcm9sbFZpZXcncyBjb250ZW50IGlzIHN0cmV0Y2hlZCB0bworICAgICAqIGZpbGwgdGhlIHZpZXdwb3J0LgogICAgICAqCiAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjb250ZW50IGZpbGxzIHRoZSB2aWV3cG9ydCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjSG9yaXpvbnRhbFNjcm9sbFZpZXdfZmlsbFZpZXdwb3J0CiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNGaWxsVmlld3BvcnQoKSB7CiAgICAgICAgIHJldHVybiBtRmlsbFZpZXdwb3J0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGlzIFNjcm9sbFZpZXcgd2hldGhlciBpdCBzaG91bGQgc3RyZXRjaCBpdHMgY29udGVudCB3aWR0aCB0byBmaWxsCi0gICAgICogdGhlIHZpZXdwb3J0IG9yIG5vdC4KKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBIb3Jpem9udGFsU2Nyb2xsVmlldyB3aGV0aGVyIGl0IHNob3VsZCBzdHJldGNoIGl0cyBjb250ZW50IHdpZHRoCisgICAgICogdG8gZmlsbCB0aGUgdmlld3BvcnQgb3Igbm90LgogICAgICAqCiAgICAgICogQHBhcmFtIGZpbGxWaWV3cG9ydCBUcnVlIHRvIHN0cmV0Y2ggdGhlIGNvbnRlbnQncyB3aWR0aCB0byB0aGUgdmlld3BvcnQncwogICAgICAqICAgICAgICBib3VuZGFyaWVzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjSG9yaXpvbnRhbFNjcm9sbFZpZXdfZmlsbFZpZXdwb3J0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RmlsbFZpZXdwb3J0KGJvb2xlYW4gZmlsbFZpZXdwb3J0KSB7CiAgICAgICAgIGlmIChmaWxsVmlld3BvcnQgIT0gbUZpbGxWaWV3cG9ydCkgewpAQCAtNDY4LDkgKzQ2Myw2IEBACiAgICAgICAgICAgICAgICAgLyogUmVsZWFzZSB0aGUgZHJhZyAqLwogICAgICAgICAgICAgICAgIG1Jc0JlaW5nRHJhZ2dlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7Ci0gICAgICAgICAgICAgICAgaWYgKG1TY3JvbGxlci5zcHJpbmdiYWNrKG1TY3JvbGxYLCBtU2Nyb2xsWSwgMCwgZ2V0U2Nyb2xsUmFuZ2UoKSwgMCwgMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVA6CiAgICAgICAgICAgICAgICAgb25TZWNvbmRhcnlQb2ludGVyVXAoZXYpOwpAQCAtNTI4LDIyICs1MjAsNyBAQAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZGVsdGFYID0gKGludCkgKG1MYXN0TW90aW9uWCAtIHgpOwogICAgICAgICAgICAgICAgICAgICBtTGFzdE1vdGlvblggPSB4OwogCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBvbGRYID0gbVNjcm9sbFg7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBvbGRZID0gbVNjcm9sbFk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCByYW5nZSA9IGdldFNjcm9sbFJhbmdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdmVyc2Nyb2xsQnkoZGVsdGFYLCAwLCBtU2Nyb2xsWCwgMCwgcmFuZ2UsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU92ZXJzY3JvbGxEaXN0YW5jZSwgMCwgdHJ1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJyZWFrIG91ciB2ZWxvY2l0eSBpZiB3ZSBoaXQgYSBzY3JvbGwgYmFycmllci4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQobVNjcm9sbFgsIG1TY3JvbGxZLCBvbGRYLCBvbGRZKTsKLQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcHVsbGVkVG9YID0gb2xkWCArIGRlbHRhWDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHB1bGxlZFRvWCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQub25QdWxsKChmbG9hdCkgZGVsdGFYIC8gZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHVsbGVkVG9YID4gcmFuZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0Lm9uUHVsbCgoZmxvYXQpIGRlbHRhWCAvIGdldFdpZHRoKCkpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNjcm9sbEJ5KGRlbHRhWCwgMCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CkBAIC01NTIsMTUgKzUyOSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5VHJhY2tlci5jb21wdXRlQ3VycmVudFZlbG9jaXR5KDEwMDAsIG1NYXhpbXVtVmVsb2NpdHkpOwogICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdGlhbFZlbG9jaXR5ID0gKGludCkgdmVsb2NpdHlUcmFja2VyLmdldFhWZWxvY2l0eShtQWN0aXZlUG9pbnRlcklkKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChNYXRoLmFicyhpbml0aWFsVmVsb2NpdHkpID4gbU1pbmltdW1WZWxvY2l0eSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGluZygtaW5pdGlhbFZlbG9jaXR5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJpZ2h0ID0gZ2V0U2Nyb2xsUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ2JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCByaWdodCwgMCwgMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldENoaWxkQ291bnQoKSA+IDAgJiYgTWF0aC5hYnMoaW5pdGlhbFZlbG9jaXR5KSA+IG1NaW5pbXVtVmVsb2NpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsaW5nKC1pbml0aWFsVmVsb2NpdHkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOwpAQCAtNTcwLDI3ICs1NDAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd0xlZnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0Lm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOgogICAgICAgICAgICAgICAgIGlmIChtSXNCZWluZ0RyYWdnZWQgJiYgZ2V0Q2hpbGRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ2JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCBnZXRTY3JvbGxSYW5nZSgpLCAwLCAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CiAgICAgICAgICAgICAgICAgICAgIG1Jc0JlaW5nRHJhZ2dlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBpZiAobVZlbG9jaXR5VHJhY2tlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLnJlY3ljbGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRWRnZUdsb3dMZWZ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dSaWdodC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVA6CkBAIC02MTcsMjIgKzU3Niw2IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25PdmVyc2Nyb2xsZWQoaW50IHNjcm9sbFgsIGludCBzY3JvbGxZLAotICAgICAgICAgICAgYm9vbGVhbiBjbGFtcGVkWCwgYm9vbGVhbiBjbGFtcGVkWSkgewotICAgICAgICAvLyBUcmVhdCBhbmltYXRpbmcgc2Nyb2xscyBkaWZmZXJlbnRseTsgc2VlICNjb21wdXRlU2Nyb2xsKCkgZm9yIHdoeS4KLSAgICAgICAgaWYgKCFtU2Nyb2xsZXIuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICBtU2Nyb2xsWCA9IHNjcm9sbFg7Ci0gICAgICAgICAgICBtU2Nyb2xsWSA9IHNjcm9sbFk7Ci0gICAgICAgICAgICBpZiAoY2xhbXBlZFgpIHsKLSAgICAgICAgICAgICAgICBtU2Nyb2xsZXIuc3ByaW5nYmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsIGdldFNjcm9sbFJhbmdlKCksIDAsIDApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuc2Nyb2xsVG8oc2Nyb2xsWCwgc2Nyb2xsWSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXdha2VuU2Nyb2xsQmFycygpOwotICAgIH0KLQogICAgIHByaXZhdGUgaW50IGdldFNjcm9sbFJhbmdlKCkgewogICAgICAgICBpbnQgc2Nyb2xsUmFuZ2UgPSAwOwogICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCkgewpAQCAtMTAxNSwxNiArOTU4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBjb250ZW50V2lkdGg7CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGludCBzY3JvbGxSYW5nZSA9IGdldENoaWxkQXQoMCkuZ2V0UmlnaHQoKTsKLSAgICAgICAgZmluYWwgaW50IHNjcm9sbFggPSBtU2Nyb2xsWDsKLSAgICAgICAgZmluYWwgaW50IG92ZXJzY3JvbGxSaWdodCA9IE1hdGgubWF4KDAsIHNjcm9sbFJhbmdlIC0gY29udGVudFdpZHRoKTsKLSAgICAgICAgaWYgKHNjcm9sbFggPCAwKSB7Ci0gICAgICAgICAgICBzY3JvbGxSYW5nZSAtPSBzY3JvbGxYOwotICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbFggPiBvdmVyc2Nyb2xsUmlnaHQpIHsKLSAgICAgICAgICAgIHNjcm9sbFJhbmdlICs9IHNjcm9sbFggLSBvdmVyc2Nyb2xsUmlnaHQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2Nyb2xsUmFuZ2U7CisgICAgICAgIHJldHVybiBnZXRDaGlsZEF0KDApLmdldFJpZ2h0KCk7CiAgICAgfQogICAgIAogICAgIEBPdmVycmlkZQpAQCAtMTA4NSwxNiArMTAxOSwxNCBAQAogICAgICAgICAgICAgaW50IHggPSBtU2Nyb2xsZXIuZ2V0Q3VyclgoKTsKICAgICAgICAgICAgIGludCB5ID0gbVNjcm9sbGVyLmdldEN1cnJZKCk7CiAKLSAgICAgICAgICAgIGlmIChvbGRYICE9IHggfHwgb2xkWSAhPSB5KSB7Ci0gICAgICAgICAgICAgICAgb3ZlcnNjcm9sbEJ5KHggLSBvbGRYLCB5IC0gb2xkWSwgb2xkWCwgb2xkWSwgZ2V0U2Nyb2xsUmFuZ2UoKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSwgMCwgZmFsc2UpOwotICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJhbmdlID0gZ2V0U2Nyb2xsUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoeCA8IDAgJiYgb2xkWCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQub25BYnNvcmIoKGludCkgbVNjcm9sbGVyLmdldEN1cnJWZWxvY2l0eSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHggPiByYW5nZSAmJiBvbGRYIDw9IHJhbmdlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0Lm9uQWJzb3JiKChpbnQpIG1TY3JvbGxlci5nZXRDdXJyVmVsb2NpdHkoKSk7CisgICAgICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KDApOworICAgICAgICAgICAgICAgIHggPSBjbGFtcCh4LCBnZXRXaWR0aCgpIC0gbVBhZGRpbmdSaWdodCAtIG1QYWRkaW5nTGVmdCwgY2hpbGQuZ2V0V2lkdGgoKSk7CisgICAgICAgICAgICAgICAgeSA9IGNsYW1wKHksIGdldEhlaWdodCgpIC0gbVBhZGRpbmdCb3R0b20gLSBtUGFkZGluZ1RvcCwgY2hpbGQuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgIGlmICh4ICE9IG9sZFggfHwgeSAhPSBvbGRZKSB7CisgICAgICAgICAgICAgICAgICAgIG1TY3JvbGxYID0geDsKKyAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFkgPSB5OworICAgICAgICAgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQoeCwgeSwgb2xkWCwgb2xkWSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXdha2VuU2Nyb2xsQmFycygpOwpAQCAtMTMzMSw3ICsxMjYzLDcgQEAKICAgICAgICAgICAgIGludCByaWdodCA9IGdldENoaWxkQXQoMCkuZ2V0V2lkdGgoKTsKICAgICAKICAgICAgICAgICAgIG1TY3JvbGxlci5mbGluZyhtU2Nyb2xsWCwgbVNjcm9sbFksIHZlbG9jaXR5WCwgMCwgMCwgCi0gICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KDAsIHJpZ2h0IC0gd2lkdGgpLCAwLCAwLCB3aWR0aC8yLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoMCwgcmlnaHQgLSB3aWR0aCksIDAsIDApOwogICAgIAogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBtb3ZpbmdSaWdodCA9IHZlbG9jaXR5WCA+IDA7CiAgICAgCkBAIC0xMzY5LDU2ICsxMzAxLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJzY3JvbGxNb2RlKGludCBtb2RlKSB7Ci0gICAgICAgIGlmIChtb2RlICE9IE9WRVJTQ1JPTExfTkVWRVIpIHsKLSAgICAgICAgICAgIGlmIChtRWRnZUdsb3dMZWZ0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGVkZ2UgPSByZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5lZGdlX2xpZ2h0KTsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBnbG93ID0gcmVzLmdldERyYXdhYmxlKFIuZHJhd2FibGUub3ZlcnNjcm9sbF9nbG93KTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dMZWZ0ID0gbmV3IEVkZ2VHbG93KGVkZ2UsIGdsb3cpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0ID0gbmV3IEVkZ2VHbG93KGVkZ2UsIGdsb3cpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUVkZ2VHbG93TGVmdCA9IG51bGw7Ci0gICAgICAgICAgICBtRWRnZUdsb3dSaWdodCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuc2V0T3ZlcnNjcm9sbE1vZGUobW9kZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIHN1cGVyLmRyYXcoY2FudmFzKTsKLSAgICAgICAgaWYgKG1FZGdlR2xvd0xlZnQgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgaW50IHNjcm9sbFggPSBtU2Nyb2xsWDsKLSAgICAgICAgICAgIGlmICghbUVkZ2VHbG93TGVmdC5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVzdG9yZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgICAgICBjYW52YXMucm90YXRlKDI3MCk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtaGVpZ2h0ICogMS41Ziwgc2Nyb2xsWCk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5zZXRTaXplKGdldEhlaWdodCgpICogMiwgZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd0xlZnQuZHJhdyhjYW52YXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGdlR2xvd1JpZ2h0LmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGdldFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGdldEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgY2FudmFzLnJvdGF0ZSg5MCk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtaGVpZ2h0IC8gMiwgLXNjcm9sbFggLSB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQuc2V0U2l6ZShoZWlnaHQgKiAyLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1JpZ2h0LmRyYXcoY2FudmFzKSkgewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlQ291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBpbnQgY2xhbXAoaW50IG4sIGludCBteSwgaW50IGNoaWxkKSB7CiAgICAgICAgIGlmIChteSA+PSBjaGlsZCB8fCBuIDwgMCkgewogICAgICAgICAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvSW1hZ2VCdXR0b24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9JbWFnZUJ1dHRvbi5qYXZhCmluZGV4IDEyYTY4ZGIuLmQ2ODBmYWQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9JbWFnZUJ1dHRvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9JbWFnZUJ1dHRvbi5qYXZhCkBAIC0zMiw3ICszMiw3IEBACiAgKiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQnV0dG9ufSwgd2l0aCB0aGUgc3RhbmRhcmQgYnV0dG9uIGJhY2tncm91bmQKICAqIHRoYXQgY2hhbmdlcyBjb2xvciBkdXJpbmcgZGlmZmVyZW50IGJ1dHRvbiBzdGF0ZXMuIFRoZSBpbWFnZSBvbiB0aGUgc3VyZmFjZQogICogb2YgdGhlIGJ1dHRvbiBpcyBkZWZpbmVkIGVpdGhlciBieSB0aGUge0Bjb2RlIGFuZHJvaWQ6c3JjfSBhdHRyaWJ1dGUgaW4gdGhlCi0gKiB7QGNvZGUgJmx0O0ltYWdlQnV0dG9uJmd0O30gWE1MIGVsZW1lbnQgb3IgYnkgdGhlIAorICoge0Bjb2RlIDxJbWFnZUJ1dHRvbj59IFhNTCBlbGVtZW50IG9yIGJ5IHRoZQogICoge0BsaW5rICNzZXRJbWFnZVJlc291cmNlKGludCl9IG1ldGhvZC48L3A+CiAgKiAKICAqIDxwPlRvIHJlbW92ZSB0aGUgc3RhbmRhcmQgYnV0dG9uIGJhY2tncm91bmQgaW1hZ2UsIGRlZmluZSB5b3VyIG93biAKQEAgLTU3LDcgKzU3LDcgQEAKICAqIGJhc2VkIG9uIHRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9uIGFuZCB0aGUgY29ycmVzcG9uZGluZyBpbWFnZXMKICAqIGRlZmluZWQgaW4gdGhlIFhNTC48L3A+CiAgKgotICogPHA+VGhlIG9yZGVyIG9mIHRoZSB7QGNvZGUgJmx0O2l0ZW0+fSBlbGVtZW50cyBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGV5IGFyZQorICogPHA+VGhlIG9yZGVyIG9mIHRoZSB7QGNvZGUgPGl0ZW0+fSBlbGVtZW50cyBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGV5IGFyZQogICogZXZhbHVhdGVkIGluIG9yZGVyLiBUaGlzIGlzIHdoeSB0aGUgIm5vcm1hbCIgYnV0dG9uIGltYWdlIGNvbWVzIGxhc3QsIGJlY2F1c2UKICAqIGl0IHdpbGwgb25seSBiZSBhcHBsaWVkIGFmdGVyIHtAY29kZSBhbmRyb2lkOnN0YXRlX3ByZXNzZWR9IGFuZCB7QGNvZGUKICAqIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZH0gaGF2ZSBib3RoIGV2YWx1YXRlZCBmYWxzZS48L3A+CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEKaW5kZXggZmFmMDgyZC4uMWU1NDg5YSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpbmVhckxheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQuamF2YQpAQCAtNDMsNiArNDMsMTMgQEAKICAqIDxwPgogICogQWxzbyBzZWUge0BsaW5rIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0LkxheW91dFBhcmFtc30KICAqIGZvciBsYXlvdXQgYXR0cmlidXRlcyA8L3A+CisgKgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X2Jhc2VsaW5lQWxpZ25lZAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X2Jhc2VsaW5lQWxpZ25lZENoaWxkSW5kZXgKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpbmVhckxheW91dF9ncmF2aXR5CisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaW5lYXJMYXlvdXRfbWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpbmVhckxheW91dF9vcmllbnRhdGlvbgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X3dlaWdodFN1bQogICovCiBAUmVtb3RlVmlldwogcHVibGljIGNsYXNzIExpbmVhckxheW91dCBleHRlbmRzIFZpZXdHcm91cCB7CkBAIC0xMTcsNyArMTI0LDExIEBACiAgICAgfQogCiAgICAgcHVibGljIExpbmVhckxheW91dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTGluZWFyTGF5b3V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKIAogICAgICAgICBUeXBlZEFycmF5IGEgPSAKICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTGluZWFyTGF5b3V0KTsKQEAgLTE0Miw4ICsxNTMsNyBAQAogICAgICAgICBtQmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleCA9CiAgICAgICAgICAgICAgICAgYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTGluZWFyTGF5b3V0X2Jhc2VsaW5lQWxpZ25lZENoaWxkSW5kZXgsIC0xKTsKIAotICAgICAgICAvLyBUT0RPOiBCZXR0ZXIgbmFtZSwgYWRkIEphdmEgQVBJcywgbWFrZSBpdCBwdWJsaWMKLSAgICAgICAgbVVzZUxhcmdlc3RDaGlsZCA9IGEuZ2V0Qm9vbGVhbihSLnN0eWxlYWJsZS5MaW5lYXJMYXlvdXRfdXNlTGFyZ2VzdENoaWxkLCBmYWxzZSk7CisgICAgICAgIG1Vc2VMYXJnZXN0Q2hpbGQgPSBhLmdldEJvb2xlYW4oUi5zdHlsZWFibGUuTGluZWFyTGF5b3V0X21lYXN1cmVXaXRoTGFyZ2VzdENoaWxkLCBmYWxzZSk7CiAKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgfQpAQCAtMTcyLDYgKzE4MiwzMyBAQAogICAgICAgICBtQmFzZWxpbmVBbGlnbmVkID0gYmFzZWxpbmVBbGlnbmVkOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFdoZW4gdHJ1ZSwgYWxsIGNoaWxkcmVuIHdpdGggYSB3ZWlnaHQgd2lsbCBiZSBjb25zaWRlcmVkIGhhdmluZworICAgICAqIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQuIElmIGZhbHNlLCBhbGwgY2hpbGRyZW4gYXJlCisgICAgICogbWVhc3VyZWQgbm9ybWFsbHkuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIHRvIG1lYXN1cmUgY2hpbGRyZW4gd2l0aCBhIHdlaWdodCB1c2luZyB0aGUgbWluaW11bQorICAgICAqICAgICAgICAgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjaGlsZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGRFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gbVVzZUxhcmdlc3RDaGlsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHNldCB0byB0cnVlLCBhbGwgY2hpbGRyZW4gd2l0aCBhIHdlaWdodCB3aWxsIGJlIGNvbnNpZGVyZWQgaGF2aW5nCisgICAgICogdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjaGlsZC4gSWYgZmFsc2UsIGFsbCBjaGlsZHJlbiBhcmUKKyAgICAgKiBtZWFzdXJlZCBub3JtYWxseS4KKyAgICAgKiAKKyAgICAgKiBEaXNhYmxlZCBieSBkZWZhdWx0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbmFibGVkIFRydWUgdG8gbWVhc3VyZSBjaGlsZHJlbiB3aXRoIGEgd2VpZ2h0IHVzaW5nIHRoZQorICAgICAqICAgICAgICBtaW5pbXVtIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzZXRNZWFzdXJlV2l0aExhcmdlc3RDaGlsZEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1Vc2VMYXJnZXN0Q2hpbGQgPSBlbmFibGVkOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0QmFzZWxpbmUoKSB7CiAgICAgICAgIGlmIChtQmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleCA8IDApIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0UG9wdXBXaW5kb3cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0UG9wdXBXaW5kb3cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmZmMjkyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RQb3B1cFdpbmRvdy5qYXZhCkBAIC0wLDAgKzEsMTIzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1BhcmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PblRvdWNoTGlzdGVuZXI7CisKKy8qKgorICogQSBMaXN0UG9wdXBXaW5kb3cgYW5jaG9ycyBpdHNlbGYgdG8gYSBob3N0IHZpZXcgYW5kIGRpc3BsYXlzIGEKKyAqIGxpc3Qgb2YgY2hvaWNlcy4KKyAqIAorICogPHA+TGlzdFBvcHVwV2luZG93IGNvbnRhaW5zIGEgbnVtYmVyIG9mIHRyaWNreSBiZWhhdmlvcnMgc3Vycm91bmRpbmcKKyAqIHBvc2l0aW9uaW5nLCBzY3JvbGxpbmcgcGFyZW50cyB0byBmaXQgdGhlIGRyb3Bkb3duLCBpbnRlcmFjdGluZworICogc2FuZWx5IHdpdGggdGhlIElNRSBpZiBwcmVzZW50LCBhbmQgb3RoZXJzLgorICogCisgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3CisgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LlNwaW5uZXIKKyAqLworcHVibGljIGNsYXNzIExpc3RQb3B1cFdpbmRvdyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJMaXN0UG9wdXBXaW5kb3ciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFRoaXMgdmFsdWUgY29udHJvbHMgdGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIHVzZXIKKyAgICAgKiBtdXN0IGxlYXZlIGEgcG9pbnRlciBkb3duIHdpdGhvdXQgc2Nyb2xsaW5nIHRvIGV4cGFuZAorICAgICAqIHRoZSBhdXRvY29tcGxldGUgZHJvcGRvd24gbGlzdCB0byBjb3ZlciB0aGUgSU1FLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfTElTVF9USU1FT1VUID0gMjUwOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgUG9wdXBXaW5kb3cgbVBvcHVwOworICAgIHByaXZhdGUgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgcHJpdmF0ZSBEcm9wRG93bkxpc3RWaWV3IG1Ecm9wRG93bkxpc3Q7CisKKyAgICBwcml2YXRlIGludCBtRHJvcERvd25IZWlnaHQgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVDsKKyAgICBwcml2YXRlIGludCBtRHJvcERvd25XaWR0aCA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOworICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQ7CisgICAgcHJpdmF0ZSBpbnQgbURyb3BEb3duVmVydGljYWxPZmZzZXQ7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbURyb3BEb3duQWx3YXlzVmlzaWJsZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtRm9yY2VJZ25vcmVPdXRzaWRlVG91Y2ggPSBmYWxzZTsKKworICAgIHByaXZhdGUgVmlldyBtUHJvbXB0VmlldzsKKyAgICBwcml2YXRlIGludCBtUHJvbXB0UG9zaXRpb24gPSBQT1NJVElPTl9QUk9NUFRfQUJPVkU7CisKKyAgICBwcml2YXRlIERhdGFTZXRPYnNlcnZlciBtT2JzZXJ2ZXI7CisKKyAgICBwcml2YXRlIFZpZXcgbURyb3BEb3duQW5jaG9yVmlldzsKKworICAgIHByaXZhdGUgRHJhd2FibGUgbURyb3BEb3duTGlzdEhpZ2hsaWdodDsKKworICAgIHByaXZhdGUgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciBtSXRlbUNsaWNrTGlzdGVuZXI7CisgICAgcHJpdmF0ZSBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyIG1JdGVtU2VsZWN0ZWRMaXN0ZW5lcjsKKworICAgIHByaXZhdGUgZmluYWwgUmVzaXplUG9wdXBSdW5uYWJsZSBtUmVzaXplUG9wdXBSdW5uYWJsZSA9IG5ldyBSZXNpemVQb3B1cFJ1bm5hYmxlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQb3B1cFRvdWNoSW50ZXJjZXB0b3IgbVRvdWNoSW50ZXJjZXB0b3IgPSBuZXcgUG9wdXBUb3VjaEludGVyY2VwdG9yKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQb3B1cFNjcm9sbExpc3RlbmVyIG1TY3JvbGxMaXN0ZW5lciA9IG5ldyBQb3B1cFNjcm9sbExpc3RlbmVyKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0U2VsZWN0b3JIaWRlciBtSGlkZVNlbGVjdG9yID0gbmV3IExpc3RTZWxlY3RvckhpZGVyKCk7CisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtU2hvd0Ryb3BEb3duUnVubmFibGU7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworCisgICAgcHJpdmF0ZSBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbU1vZGFsOworCisgICAgLyoqCisgICAgICogVGhlIHByb3ZpZGVkIHByb21wdCB2aWV3IHNob3VsZCBhcHBlYXIgYWJvdmUgbGlzdCBjb250ZW50LgorICAgICAqIAorICAgICAqIEBzZWUgI3NldFByb21wdFBvc2l0aW9uKGludCkKKyAgICAgKiBAc2VlICNnZXRQcm9tcHRQb3NpdGlvbigpCisgICAgICogQHNlZSAjc2V0UHJvbXB0VmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU0lUSU9OX1BST01QVF9BQk9WRSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvdmlkZWQgcHJvbXB0IHZpZXcgc2hvdWxkIGFwcGVhciBiZWxvdyBsaXN0IGNvbnRlbnQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0UHJvbXB0UG9zaXRpb24oaW50KQorICAgICAqIEBzZWUgI2dldFByb21wdFBvc2l0aW9uKCkKKyAgICAgKiBAc2VlICNzZXRQcm9tcHRWaWV3KFZpZXcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TSVRJT05fUFJPTVBUX0JFTE9XID0gMTsKKworICAgIC8qKgorICAgICAqIEFsaWFzIGZvciB7QGxpbmsgVmlld0dyb3VwLkxheW91dFBhcmFtcyNNQVRDSF9QQVJFTlR9LgorICAgICAqIElmIHVzZWQgdG8gc3BlY2lmeSBhIHBvcHVwIHdpZHRoLCB0aGUgcG9wdXAgd2lsbCBtYXRjaCB0aGUgd2lkdGggb2YgdGhlIGFuY2hvciB2aWV3LgorICAgICAqIElmIHVzZWQgdG8gc3BlY2lmeSBhIHBvcHVwIGhlaWdodCwgdGhlIHBvcHVwIHdpbGwgZmlsbCBhdmFpbGFibGUgc3BhY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfUEFSRU5UID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgCisgICAgLyoqCisgICAgICogQWxpYXMgZm9yIHtAbGluayBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zI1dSQVBfQ09OVEVOVH0uCisgICAgICogSWYgdXNlZCB0byBzcGVjaWZ5IGEgcG9wdXAgd2lkdGgsIHRoZSBwb3B1cCB3aWxsIHVzZSB0aGUgd2lkdGggb2YgaXRzIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JBUF9DT05URU5UID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7CisgICAgCisgICAgLyoqCisgICAgICogTW9kZSBmb3Ige0BsaW5rICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KX06IHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZQorICAgICAqIGlucHV0IG1ldGhvZCBzaG91bGQgYmUgYmFzZWQgb24gdGhlIGZvY3VzYWJpbGl0eSBvZiB0aGUgcG9wdXAuICBUaGF0IGlzCisgICAgICogaWYgaXQgaXMgZm9jdXNhYmxlIHRoYW4gaXQgbmVlZHMgdG8gd29yayB3aXRoIHRoZSBpbnB1dCBtZXRob2QsIGVsc2UKKyAgICAgKiBpdCBkb2Vzbid0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUX01FVEhPRF9GUk9NX0ZPQ1VTQUJMRSA9IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9GUk9NX0ZPQ1VTQUJMRTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBNb2RlIGZvciB7QGxpbmsgI3NldElucHV0TWV0aG9kTW9kZShpbnQpfTogdGhpcyBwb3B1cCBhbHdheXMgbmVlZHMgdG8KKyAgICAgKiB3b3JrIHdpdGggYW4gaW5wdXQgbWV0aG9kLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgZm9jdXNhYmxlLiAgVGhpcworICAgICAqIG1lYW5zIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgZGlzcGxheWVkIHNvIHRoYXQgdGhlIHVzZXIgY2FuIGFsc28gb3BlcmF0ZQorICAgICAqIHRoZSBpbnB1dCBtZXRob2Qgd2hpbGUgaXQgaXMgc2hvd24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5QVVRfTUVUSE9EX05FRURFRCA9IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQ7CisgICAgCisgICAgLyoqCisgICAgICogTW9kZSBmb3Ige0BsaW5rICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KX06IHRoaXMgcG9wdXAgbmV2ZXIgbmVlZHMgdG8KKyAgICAgKiB3b3JrIHdpdGggYW4gaW5wdXQgbWV0aG9kLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgZm9jdXNhYmxlLiAgVGhpcworICAgICAqIG1lYW5zIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgZGlzcGxheWVkIHRvIHVzZSBhcyBtdWNoIHNwYWNlIG9uIHRoZQorICAgICAqIHNjcmVlbiBhcyBuZWVkZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIGNvdmVycyB0aGUgaW5wdXQgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUX01FVEhPRF9OT1RfTkVFREVEID0gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcsIGVtcHR5IHBvcHVwIHdpbmRvdyBjYXBhYmxlIG9mIGRpc3BsYXlpbmcgaXRlbXMgZnJvbSBhIExpc3RBZGFwdGVyLgorICAgICAqIEJhY2tncm91bmRzIHNob3VsZCBiZSBzZXQgdXNpbmcge0BsaW5rICNzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHVzZWQgZm9yIGNvbnRhaW5lZCB2aWV3cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwsIDAsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldywgZW1wdHkgcG9wdXAgd2luZG93IGNhcGFibGUgb2YgZGlzcGxheWluZyBpdGVtcyBmcm9tIGEgTGlzdEFkYXB0ZXIuCisgICAgICogQmFja2dyb3VuZHMgc2hvdWxkIGJlIHNldCB1c2luZyB7QGxpbmsgI3NldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdXNlZCBmb3IgY29udGFpbmVkIHZpZXdzLgorICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIGZyb20gaW5mbGF0aW5nIHBhcmVudCB2aWV3cyB1c2VkIHRvIHN0eWxlIHRoZSBwb3B1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDAsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldywgZW1wdHkgcG9wdXAgd2luZG93IGNhcGFibGUgb2YgZGlzcGxheWluZyBpdGVtcyBmcm9tIGEgTGlzdEFkYXB0ZXIuCisgICAgICogQmFja2dyb3VuZHMgc2hvdWxkIGJlIHNldCB1c2luZyB7QGxpbmsgI3NldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdXNlZCBmb3IgY29udGFpbmVkIHZpZXdzLgorICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIGZyb20gaW5mbGF0aW5nIHBhcmVudCB2aWV3cyB1c2VkIHRvIHN0eWxlIHRoZSBwb3B1cC4KKyAgICAgKiBAcGFyYW0gZGVmU3R5bGVBdHRyIERlZmF1bHQgc3R5bGUgYXR0cmlidXRlIHRvIHVzZSBmb3IgcG9wdXAgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3LCBlbXB0eSBwb3B1cCB3aW5kb3cgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIGl0ZW1zIGZyb20gYSBMaXN0QWRhcHRlci4KKyAgICAgKiBCYWNrZ3JvdW5kcyBzaG91bGQgYmUgc2V0IHVzaW5nIHtAbGluayAjc2V0QmFja2dyb3VuZERyYXdhYmxlKERyYXdhYmxlKX0uCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB1c2VkIGZvciBjb250YWluZWQgdmlld3MuCisgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgZnJvbSBpbmZsYXRpbmcgcGFyZW50IHZpZXdzIHVzZWQgdG8gc3R5bGUgdGhlIHBvcHVwLgorICAgICAqIEBwYXJhbSBkZWZTdHlsZUF0dHIgU3R5bGUgYXR0cmlidXRlIHRvIHJlYWQgZm9yIGRlZmF1bHQgc3R5bGluZyBvZiBwb3B1cCBjb250ZW50LgorICAgICAqIEBwYXJhbSBkZWZTdHlsZVJlcyBTdHlsZSByZXNvdXJjZSBJRCB0byB1c2UgZm9yIGRlZmF1bHQgc3R5bGluZyBvZiBwb3B1cCBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0UG9wdXBXaW5kb3coQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1Qb3B1cCA9IG5ldyBQb3B1cFdpbmRvdyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYWRhcHRlciB0aGF0IHByb3ZpZGVzIHRoZSBkYXRhIGFuZCB0aGUgdmlld3MgdG8gcmVwcmVzZW50IHRoZSBkYXRhCisgICAgICogaW4gdGhpcyBwb3B1cCB3aW5kb3cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgYWRhcHRlciB0byB1c2UgdG8gY3JlYXRlIHRoaXMgd2luZG93J3MgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKG1PYnNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtT2JzZXJ2ZXIgPSBuZXcgUG9wdXBEYXRhU2V0T2JzZXJ2ZXIoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWRhcHRlci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1PYnNlcnZlcik7CisgICAgICAgIH0KKyAgICAgICAgbUFkYXB0ZXIgPSBhZGFwdGVyOworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRhcHRlci5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtT2JzZXJ2ZXIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobURyb3BEb3duTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXJlIHRoZSBvcHRpb25hbCBwcm9tcHQgdmlldyBzaG91bGQgYXBwZWFyLiBUaGUgZGVmYXVsdCBpcworICAgICAqIHtAbGluayAjUE9TSVRJT05fUFJPTVBUX0FCT1ZFfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gQSBwb3NpdGlvbiBjb25zdGFudCBkZWNsYXJpbmcgd2hlcmUgdGhlIHByb21wdCBzaG91bGQgYmUgZGlzcGxheWVkLgorICAgICAqIAorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9BQk9WRQorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9CRUxPVworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFBvc2l0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBtUHJvbXB0UG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFdoZXJlIHRoZSBvcHRpb25hbCBwcm9tcHQgdmlldyBzaG91bGQgYXBwZWFyLgorICAgICAqIAorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9BQk9WRQorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9CRUxPVworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UHJvbXB0UG9zaXRpb24oKSB7CisgICAgICAgIHJldHVybiBtUHJvbXB0UG9zaXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGhpcyB3aW5kb3cgc2hvdWxkIGJlIG1vZGFsIHdoZW4gc2hvd24uCisgICAgICogCisgICAgICogPHA+SWYgYSBwb3B1cCB3aW5kb3cgaXMgbW9kYWwsIGl0IHdpbGwgcmVjZWl2ZSBhbGwgdG91Y2ggYW5kIGtleSBpbnB1dC4KKyAgICAgKiBJZiB0aGUgdXNlciB0b3VjaGVzIG91dHNpZGUgdGhlIHBvcHVwIHdpbmRvdydzIGNvbnRlbnQgYXJlYSB0aGUgcG9wdXAgd2luZG93CisgICAgICogd2lsbCBiZSBkaXNtaXNzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG1vZGFsIHtAY29kZSB0cnVlfSBpZiB0aGUgcG9wdXAgd2luZG93IHNob3VsZCBiZSBtb2RhbCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9kYWwoYm9vbGVhbiBtb2RhbCkgeworICAgICAgICBtTW9kYWwgPSB0cnVlOworICAgICAgICBtUG9wdXAuc2V0Rm9jdXNhYmxlKG1vZGFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHBvcHVwIHdpbmRvdyB3aWxsIGJlIG1vZGFsIHdoZW4gc2hvd24uCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHBvcHVwIHdpbmRvdyB3aWxsIGJlIG1vZGFsLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01vZGFsKCkgeworICAgICAgICByZXR1cm4gbU1vZGFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcmNlcyBvdXRzaWRlIHRvdWNoZXMgdG8gYmUgaWdub3JlZC4gTm9ybWFsbHkgaWYge0BsaW5rICNpc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpfSBpcworICAgICAqIGZhbHNlLCB3ZSBhbGxvdyBvdXRzaWRlIHRvdWNoIHRvIGRpc21pc3MgdGhlIGRyb3Bkb3duLiBJZiB0aGlzIGlzIHNldCB0byB0cnVlLCB0aGVuIHdlCisgICAgICogaWdub3JlIG91dHNpZGUgdG91Y2ggZXZlbiB3aGVuIHRoZSBkcm9wIGRvd24gaXMgbm90IHNldCB0byBhbHdheXMgdmlzaWJsZS4KKyAgICAgKiAKKyAgICAgKiBAaGlkZSBVc2VkIG9ubHkgYnkgQXV0b0NvbXBsZXRlVGV4dFZpZXcgdG8gaGFuZGxlIHNvbWUgaW50ZXJuYWwgc3BlY2lhbCBjYXNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZUlnbm9yZU91dHNpZGVUb3VjaChib29sZWFuIGZvcmNlSWdub3JlT3V0c2lkZVRvdWNoKSB7CisgICAgICAgIG1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCA9IGZvcmNlSWdub3JlT3V0c2lkZVRvdWNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGUgZHJvcC1kb3duIHNob3VsZCByZW1haW4gdmlzaWJsZSB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMuCisgICAgICoKKyAgICAgKiBUaGUgZHJvcC1kb3duIHdpbGwgb2NjdXB5IHRoZSBlbnRpcmUgc2NyZWVuIGJlbG93IHtAbGluayAjZ2V0QW5jaG9yVmlld30gcmVnYXJkbGVzcworICAgICAqIG9mIHRoZSBzaXplIG9yIGNvbnRlbnQgb2YgdGhlIGxpc3QuICB7QGxpbmsgI2dldEJhY2tncm91bmQoKX0gd2lsbCBmaWxsIGFueSBzcGFjZQorICAgICAqIHRoYXQgaXMgbm90IHVzZWQgYnkgdGhlIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHJvcERvd25BbHdheXNWaXNpYmxlIFdoZXRoZXIgdG8ga2VlcCB0aGUgZHJvcC1kb3duIHZpc2libGUuCisgICAgICoKKyAgICAgKiBAaGlkZSBPbmx5IHVzZWQgYnkgQXV0b0NvbXBsZXRlVGV4dFZpZXcgdW5kZXIgc3BlY2lhbCBjb25kaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duQWx3YXlzVmlzaWJsZShib29sZWFuIGRyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICBtRHJvcERvd25BbHdheXNWaXNpYmxlID0gZHJvcERvd25BbHdheXNWaXNpYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gV2hldGhlciB0aGUgZHJvcC1kb3duIGlzIHZpc2libGUgdW5kZXIgc3BlY2lhbCBjb25kaXRpb25zLgorICAgICAqCisgICAgICogQGhpZGUgT25seSB1c2VkIGJ5IEF1dG9Db21wbGV0ZVRleHRWaWV3IHVuZGVyIHNwZWNpYWwgY29uZGl0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkFsd2F5c1Zpc2libGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSBzb2Z0IGlucHV0IGFyZWEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgZGVzaXJlZCBtb2RlLCBzZWUKKyAgICAgKiAgICAgICAge0BsaW5rIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNzb2Z0SW5wdXRNb2RlfQorICAgICAqICAgICAgICBmb3IgdGhlIGZ1bGwgbGlzdAorICAgICAqCisgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMjc29mdElucHV0TW9kZQorICAgICAqIEBzZWUgI2dldFNvZnRJbnB1dE1vZGUoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNvZnRJbnB1dE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgbVBvcHVwLnNldFNvZnRJbnB1dE1vZGUobW9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBpbiB7QGxpbmsgI3NldFNvZnRJbnB1dE1vZGUoaW50KX0uCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTb2Z0SW5wdXRNb2RlKGludCkKKyAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNzb2Z0SW5wdXRNb2RlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTb2Z0SW5wdXRNb2RlKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldFNvZnRJbnB1dE1vZGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgZHJhd2FibGUgdG8gdXNlIGFzIHRoZSBsaXN0IGl0ZW0gc2VsZWN0b3IuCisgICAgICogCisgICAgICogQHBhcmFtIHNlbGVjdG9yIExpc3Qgc2VsZWN0b3IgZHJhd2FibGUgdG8gdXNlIGluIHRoZSBwb3B1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0U2VsZWN0b3IoRHJhd2FibGUgc2VsZWN0b3IpIHsKKyAgICAgICAgbURyb3BEb3duTGlzdEhpZ2hsaWdodCA9IHNlbGVjdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGJhY2tncm91bmQgZHJhd2FibGUgZm9yIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIERyYXdhYmxlIGdldEJhY2tncm91bmQoKSB7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0QmFja2dyb3VuZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBkcmF3YWJsZSB0byBiZSB0aGUgYmFja2dyb3VuZCBmb3IgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZCBBIGRyYXdhYmxlIHRvIHNldCBhcyB0aGUgYmFja2dyb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUgZCkgeworICAgICAgICBtUG9wdXAuc2V0QmFja2dyb3VuZERyYXdhYmxlKGQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhbiBhbmltYXRpb24gc3R5bGUgdG8gdXNlIHdoZW4gdGhlIHBvcHVwIHdpbmRvdyBpcyBzaG93biBvciBkaXNtaXNzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGFuaW1hdGlvblN0eWxlIEFuaW1hdGlvbiBzdHlsZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QW5pbWF0aW9uU3R5bGUoaW50IGFuaW1hdGlvblN0eWxlKSB7CisgICAgICAgIG1Qb3B1cC5zZXRBbmltYXRpb25TdHlsZShhbmltYXRpb25TdHlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYW5pbWF0aW9uIHN0eWxlIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gdGhlIHBvcHVwIHdpbmRvdyBpcworICAgICAqIHNob3duIG9yIGRpc21pc3NlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEFuaW1hdGlvbiBzdHlsZSB0aGF0IHdpbGwgYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEFuaW1hdGlvblN0eWxlKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldEFuaW1hdGlvblN0eWxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmlldyB0aGF0IHdpbGwgYmUgdXNlZCB0byBhbmNob3IgdGhpcyBwb3B1cC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBwb3B1cCdzIGFuY2hvciB2aWV3CisgICAgICovCisgICAgcHVibGljIFZpZXcgZ2V0QW5jaG9yVmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkFuY2hvclZpZXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcG9wdXAncyBhbmNob3Igdmlldy4gVGhpcyBwb3B1cCB3aWxsIGFsd2F5cyBiZSBwb3NpdGlvbmVkIHJlbGF0aXZlIHRvCisgICAgICogdGhlIGFuY2hvciB2aWV3IHdoZW4gc2hvd24uCisgICAgICogCisgICAgICogQHBhcmFtIGFuY2hvciBUaGUgdmlldyB0byB1c2UgYXMgYW4gYW5jaG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFuY2hvclZpZXcoVmlldyBhbmNob3IpIHsKKyAgICAgICAgbURyb3BEb3duQW5jaG9yVmlldyA9IGFuY2hvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBob3Jpem9udGFsIG9mZnNldCBvZiB0aGUgcG9wdXAgZnJvbSBpdHMgYW5jaG9yIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEhvcml6b250YWxPZmZzZXQoKSB7CisgICAgICAgIHJldHVybiBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhpcyBwb3B1cCBmcm9tIGl0cyBhbmNob3IgdmlldyBpbiBwaXhlbHMuCisgICAgICogCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIHBvcHVwIGZyb20gaXRzIGFuY2hvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3Jpem9udGFsT2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCA9IG9mZnNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhlIHBvcHVwIGZyb20gaXRzIGFuY2hvciBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRWZXJ0aWNhbE9mZnNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmVydGljYWwgb2Zmc2V0IG9mIHRoaXMgcG9wdXAgZnJvbSBpdHMgYW5jaG9yIHZpZXcgaW4gcGl4ZWxzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIHZlcnRpY2FsIG9mZnNldCBvZiB0aGUgcG9wdXAgZnJvbSBpdHMgYW5jaG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcnRpY2FsT2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgbURyb3BEb3duVmVydGljYWxPZmZzZXQgPSBvZmZzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgd2lkdGggb2YgdGhlIHBvcHVwIHdpbmRvdyBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRXaWR0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bldpZHRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBwb3B1cCB3aW5kb3cgaW4gcGl4ZWxzLiBDYW4gYWxzbyBiZSB7QGxpbmsgI01BVENIX1BBUkVOVH0KKyAgICAgKiBvciB7QGxpbmsgI1dSQVBfQ09OVEVOVH0uCisgICAgICogCisgICAgICogQHBhcmFtIHdpZHRoIFdpZHRoIG9mIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IHdpZHRoKSB7CisgICAgICAgIG1Ecm9wRG93bldpZHRoID0gd2lkdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgd2lkdGggb2YgdGhlIHBvcHVwIHdpbmRvdyBieSB0aGUgc2l6ZSBvZiBpdHMgY29udGVudC4gVGhlIGZpbmFsIHdpZHRoIG1heSBiZQorICAgICAqIGxhcmdlciB0byBhY2NvbW1vZGF0ZSBzdHlsZWQgd2luZG93IGRyZXNzaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHdpZHRoIERlc2lyZWQgd2lkdGggb2YgY29udGVudCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFdpZHRoKGludCB3aWR0aCkgeworICAgICAgICBEcmF3YWJsZSBwb3B1cEJhY2tncm91bmQgPSBtUG9wdXAuZ2V0QmFja2dyb3VuZCgpOworICAgICAgICBpZiAocG9wdXBCYWNrZ3JvdW5kICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Ecm9wRG93bldpZHRoID0gcG9wdXBCYWNrZ3JvdW5kLmdldEludHJpbnNpY1dpZHRoKCkgKyB3aWR0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGhlaWdodCBvZiB0aGUgcG9wdXAgd2luZG93IGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEhlaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkhlaWdodDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBoZWlnaHQgb2YgdGhlIHBvcHVwIHdpbmRvdyBpbiBwaXhlbHMuIENhbiBhbHNvIGJlIHtAbGluayAjTUFUQ0hfUEFSRU5UfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaGVpZ2h0IEhlaWdodCBvZiB0aGUgcG9wdXAgd2luZG93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhlaWdodChpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1Ecm9wRG93bkhlaWdodCA9IGhlaWdodDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSBldmVudHMgd2hlbiBhIGxpc3QgaXRlbSBpcyBjbGlja2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjbGlja0xpc3RlbmVyIExpc3RlbmVyIHRvIHJlZ2lzdGVyCisgICAgICogCisgICAgICogQHNlZSBMaXN0VmlldyNzZXRPbkl0ZW1DbGlja0xpc3RlbmVyKGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIGNsaWNrTGlzdGVuZXIpIHsKKyAgICAgICAgbUl0ZW1DbGlja0xpc3RlbmVyID0gY2xpY2tMaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSBldmVudHMgd2hlbiBhIGxpc3QgaXRlbSBpcyBzZWxlY3RlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VsZWN0ZWRMaXN0ZW5lciBMaXN0ZW5lciB0byByZWdpc3Rlci4KKyAgICAgKiAKKyAgICAgKiBAc2VlIExpc3RWaWV3I3NldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIgc2VsZWN0ZWRMaXN0ZW5lcikgeworICAgICAgICBtSXRlbVNlbGVjdGVkTGlzdGVuZXIgPSBzZWxlY3RlZExpc3RlbmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIHZpZXcgdG8gYWN0IGFzIGEgdXNlciBwcm9tcHQgZm9yIHRoaXMgcG9wdXAgd2luZG93LiBXaGVyZSB0aGUgcHJvbXB0IHZpZXcgd2lsbCBhcHBlYXIKKyAgICAgKiBpcyBjb250cm9sbGVkIGJ5IHtAbGluayAjc2V0UHJvbXB0UG9zaXRpb24oaW50KX0uCisgICAgICogCisgICAgICogQHBhcmFtIHByb21wdCBWaWV3IHRvIHVzZSBhcyBhbiBpbmZvcm1hdGlvbmFsIHByb21wdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9tcHRWaWV3KFZpZXcgcHJvbXB0KSB7CisgICAgICAgIGJvb2xlYW4gc2hvd2luZyA9IGlzU2hvd2luZygpOworICAgICAgICBpZiAoc2hvd2luZykgeworICAgICAgICAgICAgcmVtb3ZlUHJvbXB0VmlldygpOworICAgICAgICB9CisgICAgICAgIG1Qcm9tcHRWaWV3ID0gcHJvbXB0OworICAgICAgICBpZiAoc2hvd2luZykgeworICAgICAgICAgICAgc2hvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9zdCBhIHtAbGluayAjc2hvdygpfSBjYWxsIHRvIHRoZSBVSSB0aHJlYWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcG9zdFNob3coKSB7CisgICAgICAgIG1IYW5kbGVyLnBvc3QobVNob3dEcm9wRG93blJ1bm5hYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93IHRoZSBwb3B1cCBsaXN0LiBJZiB0aGUgbGlzdCBpcyBhbHJlYWR5IHNob3dpbmcsIHRoaXMgbWV0aG9kCisgICAgICogd2lsbCByZWNhbGN1bGF0ZSB0aGUgcG9wdXAncyBzaXplIGFuZCBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICBpbnQgaGVpZ2h0ID0gYnVpbGREcm9wRG93bigpOworCisgICAgICAgIGludCB3aWR0aFNwZWMgPSAwOworICAgICAgICBpbnQgaGVpZ2h0U3BlYyA9IDA7CisKKyAgICAgICAgYm9vbGVhbiBub0lucHV0TWV0aG9kID0gaXNJbnB1dE1ldGhvZE5vdE5lZWRlZCgpOworCisgICAgICAgIGlmIChtUG9wdXAuaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBjYWxsIHRvIFBvcHVwV2luZG93J3MgdXBkYXRlIG1ldGhvZCBiZWxvdyBjYW4gYWNjZXB0IC0xIGZvciBhbnkKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSB5b3UgZG8gbm90IHdhbnQgdG8gdXBkYXRlLgorICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IC0xOworICAgICAgICAgICAgfSBlbHNlIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgeworICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IGdldEFuY2hvclZpZXcoKS5nZXRXaWR0aCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSBtRHJvcERvd25XaWR0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBjYWxsIHRvIFBvcHVwV2luZG93J3MgdXBkYXRlIG1ldGhvZCBiZWxvdyBjYW4gYWNjZXB0IC0xIGZvciBhbnkKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSB5b3UgZG8gbm90IHdhbnQgdG8gdXBkYXRlLgorICAgICAgICAgICAgICAgIGhlaWdodFNwZWMgPSBub0lucHV0TWV0aG9kID8gaGVpZ2h0IDogVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgICAgICAgICAgICAgaWYgKG5vSW5wdXRNZXRob2QpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldFdpbmRvd0xheW91dE1vZGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgOiAwLCAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7CisgICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IGhlaWdodDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IG1Ecm9wRG93bkhlaWdodDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVBvcHVwLnNldE91dHNpZGVUb3VjaGFibGUoIW1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSk7CisKKyAgICAgICAgICAgIG1Qb3B1cC51cGRhdGUoZ2V0QW5jaG9yVmlldygpLCBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCwgd2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldFdpZHRoKGdldEFuY2hvclZpZXcoKS5nZXRXaWR0aCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2lkdGgobURyb3BEb3duV2lkdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgICAgIGhlaWdodFNwZWMgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SGVpZ2h0KGhlaWdodCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldEhlaWdodChtRHJvcERvd25IZWlnaHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVBvcHVwLnNldFdpbmRvd0xheW91dE1vZGUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUoUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIHVzZSBvdXRzaWRlIHRvdWNoYWJsZSB0byBkaXNtaXNzIGRyb3AgZG93biB3aGVuIHRvdWNoaW5nIG91dHNpZGUgb2YgaXQsIHNvCisgICAgICAgICAgICAvLyBvbmx5IHNldCB0aGlzIGlmIHRoZSBkcm9wZG93biBpcyBub3QgYWx3YXlzIHZpc2libGUKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRPdXRzaWRlVG91Y2hhYmxlKCFtRm9yY2VJZ25vcmVPdXRzaWRlVG91Y2ggJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpOworICAgICAgICAgICAgbVBvcHVwLnNldFRvdWNoSW50ZXJjZXB0b3IobVRvdWNoSW50ZXJjZXB0b3IpOworICAgICAgICAgICAgbVBvcHVwLnNob3dBc0Ryb3BEb3duKGdldEFuY2hvclZpZXcoKSwKKyAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCwgbURyb3BEb3duVmVydGljYWxPZmZzZXQpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRTZWxlY3Rpb24oTGlzdFZpZXcuSU5WQUxJRF9QT1NJVElPTik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICghbU1vZGFsIHx8IG1Ecm9wRG93bkxpc3QuaXNJblRvdWNoTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgY2xlYXJMaXN0U2VsZWN0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1Nb2RhbCkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobUhpZGVTZWxlY3Rvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNtaXNzIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzbWlzcygpIHsKKyAgICAgICAgbVBvcHVwLmRpc21pc3MoKTsKKyAgICAgICAgcmVtb3ZlUHJvbXB0VmlldygpOworICAgICAgICBtUG9wdXAuc2V0Q29udGVudFZpZXcobnVsbCk7CisgICAgICAgIG1Ecm9wRG93bkxpc3QgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIGxpc3RlbmVyIHRvIHJlY2VpdmUgYSBjYWxsYmFjayB3aGVuIHRoZSBwb3B1cCBpcyBkaXNtaXNzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgTGlzdGVuZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHBvcHVwIGlzIGRpc21pc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPbkRpc21pc3NMaXN0ZW5lcihQb3B1cFdpbmRvdy5PbkRpc21pc3NMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtUG9wdXAuc2V0T25EaXNtaXNzTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVQcm9tcHRWaWV3KCkgeworICAgICAgICBpZiAobVByb21wdFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgVmlld1BhcmVudCBwYXJlbnQgPSBtUHJvbXB0Vmlldy5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBWaWV3R3JvdXApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAgZ3JvdXAgPSAoVmlld0dyb3VwKSBwYXJlbnQ7CisgICAgICAgICAgICAgICAgZ3JvdXAucmVtb3ZlVmlldyhtUHJvbXB0Vmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb250cm9sIGhvdyB0aGUgcG9wdXAgb3BlcmF0ZXMgd2l0aCBhbiBpbnB1dCBtZXRob2Q6IG9uZSBvZgorICAgICAqIHtAbGluayAjSU5QVVRfTUVUSE9EX0ZST01fRk9DVVNBQkxFfSwge0BsaW5rICNJTlBVVF9NRVRIT0RfTkVFREVEfSwKKyAgICAgKiBvciB7QGxpbmsgI0lOUFVUX01FVEhPRF9OT1RfTkVFREVEfS4KKyAgICAgKiAKKyAgICAgKiA8cD5JZiB0aGUgcG9wdXAgaXMgc2hvd2luZywgY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHRha2UgZWZmZWN0IG9ubHkKKyAgICAgKiB0aGUgbmV4dCB0aW1lIHRoZSBwb3B1cCBpcyBzaG93biBvciB0aHJvdWdoIGEgbWFudWFsIGNhbGwgdG8gdGhlIHtAbGluayAjc2hvdygpfQorICAgICAqIG1ldGhvZC48L3A+CisgICAgICogCisgICAgICogQHNlZSAjZ2V0SW5wdXRNZXRob2RNb2RlKCkKKyAgICAgKiBAc2VlICNzaG93KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dE1ldGhvZE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShtb2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgaW4ge0BsaW5rICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KX0uCisgICAgICogCisgICAgICogQHNlZSAjc2V0SW5wdXRNZXRob2RNb2RlKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldElucHV0TWV0aG9kTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlbGVjdGVkIHBvc2l0aW9uIG9mIHRoZSBsaXN0LgorICAgICAqIE9ubHkgdmFsaWQgd2hlbiB7QGxpbmsgI2lzU2hvd2luZygpfSA9PSB7QGNvZGUgdHJ1ZX0uCisgICAgICogCisgICAgICogQHBhcmFtIHBvc2l0aW9uIExpc3QgcG9zaXRpb24gdG8gc2V0IGFzIHNlbGVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgRHJvcERvd25MaXN0VmlldyBsaXN0ID0gbURyb3BEb3duTGlzdDsKKyAgICAgICAgaWYgKGlzU2hvd2luZygpICYmIGxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgbGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOworICAgICAgICAgICAgbGlzdC5zZXRTZWxlY3Rpb24ocG9zaXRpb24pOworICAgICAgICAgICAgaWYgKGxpc3QuZ2V0Q2hvaWNlTW9kZSgpICE9IExpc3RWaWV3LkNIT0lDRV9NT0RFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBsaXN0LnNldEl0ZW1DaGVja2VkKHBvc2l0aW9uLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIGFueSBjdXJyZW50IGxpc3Qgc2VsZWN0aW9uLgorICAgICAqIE9ubHkgdmFsaWQgd2hlbiB7QGxpbmsgI2lzU2hvd2luZygpfSA9PSB7QGNvZGUgdHJ1ZX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJMaXN0U2VsZWN0aW9uKCkgeworICAgICAgICBmaW5hbCBEcm9wRG93bkxpc3RWaWV3IGxpc3QgPSBtRHJvcERvd25MaXN0OworICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBXQVJOSU5HOiBQbGVhc2UgcmVhZCB0aGUgY29tbWVudCB3aGVyZSBtTGlzdFNlbGVjdGlvbkhpZGRlbiBpcyBkZWNsYXJlZAorICAgICAgICAgICAgbGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IHRydWU7CisgICAgICAgICAgICBsaXN0LmhpZGVTZWxlY3RvcigpOworICAgICAgICAgICAgbGlzdC5yZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcG9wdXAgaXMgY3VycmVudGx5IHNob3dpbmcsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2hvd2luZygpIHsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5pc1Nob3dpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHBvcHVwIGlzIGNvbmZpZ3VyZWQgdG8gYXNzdW1lIHRoZSB1c2VyIGRvZXMgbm90IG5lZWQKKyAgICAgKiB0byBpbnRlcmFjdCB3aXRoIHRoZSBJTUUgd2hpbGUgaXQgaXMgc2hvd2luZywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJbnB1dE1ldGhvZE5vdE5lZWRlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBJTlBVVF9NRVRIT0RfTk9UX05FRURFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGFuIGl0ZW0gY2xpY2sgb3BlcmF0aW9uIG9uIHRoZSBzcGVjaWZpZWQgbGlzdCBhZGFwdGVyIHBvc2l0aW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBBZGFwdGVyIHBvc2l0aW9uIGZvciBwZXJmb3JtaW5nIHRoZSBjbGljaworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2xpY2sgYWN0aW9uIGNvdWxkIGJlIHBlcmZvcm1lZCwgZmFsc2UgaWYgbm90LgorICAgICAqICAgICAgICAgKGUuZy4gaWYgdGhlIHBvcHVwIHdhcyBub3Qgc2hvd2luZywgdGhpcyBtZXRob2Qgd291bGQgcmV0dXJuIGZhbHNlLikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtSXRlbUNsaWNrKGludCBwb3NpdGlvbikgeworICAgICAgICBpZiAoaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIGlmIChtSXRlbUNsaWNrTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIERyb3BEb3duTGlzdFZpZXcgbGlzdCA9IG1Ecm9wRG93bkxpc3Q7CisgICAgICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGxpc3QuZ2V0Q2hpbGRBdChwb3NpdGlvbiAtIGxpc3QuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7CisgICAgICAgICAgICAgICAgbUl0ZW1DbGlja0xpc3RlbmVyLm9uSXRlbUNsaWNrKGxpc3QsIGNoaWxkLCBwb3NpdGlvbiwgY2hpbGQuZ2V0SWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0gb3IgbnVsbCBpZiB0aGUgcG9wdXAgaXMgbm90IHNob3dpbmcuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRTZWxlY3RlZEl0ZW0oKSB7CisgICAgICAgIGlmICghaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBvciB7QGxpbmsgTGlzdFZpZXcjSU5WQUxJRF9QT1NJVElPTn0KKyAgICAgKiBpZiB7QGxpbmsgI2lzU2hvd2luZygpfSA9PSB7QGNvZGUgZmFsc2V9LgorICAgICAqIAorICAgICAqIEBzZWUgTGlzdFZpZXcjZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSB7CisgICAgICAgIGlmICghaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBMaXN0Vmlldy5JTlZBTElEX1BPU0lUSU9OOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgSUQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtIG9yIHtAbGluayBMaXN0VmlldyNJTlZBTElEX1JPV19JRH0KKyAgICAgKiBpZiB7QGxpbmsgI2lzU2hvd2luZygpfSA9PSB7QGNvZGUgZmFsc2V9LgorICAgICAqIAorICAgICAqIEBzZWUgTGlzdFZpZXcjZ2V0U2VsZWN0ZWRJdGVtSWQoKQorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFNlbGVjdGVkSXRlbUlkKCkgeworICAgICAgICBpZiAoIWlzU2hvd2luZygpKSB7CisgICAgICAgICAgICByZXR1cm4gTGlzdFZpZXcuSU5WQUxJRF9ST1dfSUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtSWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBWaWV3IGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0gb3IgbnVsbCBpZgorICAgICAqIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSBmYWxzZX0uCisgICAgICogCisgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZFZpZXcoKQorICAgICAqLworICAgIHB1YmxpYyBWaWV3IGdldFNlbGVjdGVkVmlldygpIHsKKyAgICAgICAgaWYgKCFpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRWaWV3KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUge0BsaW5rIExpc3RWaWV3fSBkaXNwbGF5ZWQgd2l0aGluIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICogT25seSB2YWxpZCB3aGVuIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSB0cnVlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFZpZXcgZ2V0TGlzdFZpZXcoKSB7CisgICAgICAgIHJldHVybiBtRHJvcERvd25MaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciBrZXkgZG93biBldmVudHMuIEJ5IGZvcndhcmRpbmcga2V5IHVwIGV2ZW50cyB0byB0aGlzIGZ1bmN0aW9uLAorICAgICAqIHZpZXdzIHVzaW5nIG5vbi1tb2RhbCBMaXN0UG9wdXBXaW5kb3cgY2FuIGhhdmUgaXQgaGFuZGxlIGtleSBzZWxlY3Rpb24gb2YgaXRlbXMuCisgICAgICogIAorICAgICAqIEBwYXJhbSBrZXlDb2RlIGtleUNvZGUgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleURvd24KKyAgICAgKiBAcGFyYW0gZXZlbnQgZXZlbnQgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleURvd24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV2ZW50IHdhcyBoYW5kbGVkLCBmYWxzZSBpZiBpdCB3YXMgaWdub3JlZC4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRNb2RhbChib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgLy8gd2hlbiB0aGUgZHJvcCBkb3duIGlzIHNob3duLCB3ZSBkcml2ZSBpdCBkaXJlY3RseQorICAgICAgICBpZiAoaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIC8vIHRoZSBrZXkgZXZlbnRzIGFyZSBmb3J3YXJkZWQgdG8gdGhlIGxpc3QgaW4gdGhlIGRyb3AgZG93biB2aWV3CisgICAgICAgICAgICAvLyBub3RlIHRoYXQgTGlzdFZpZXcgaGFuZGxlcyBzcGFjZSBidXQgd2UgZG9uJ3Qgd2FudCB0aGF0IHRvIGhhcHBlbgorICAgICAgICAgICAgLy8gYWxzbyBpZiBzZWxlY3Rpb24gaXMgbm90IGN1cnJlbnRseSBpbiB0aGUgZHJvcCBkb3duLCB0aGVuIGRvbid0CisgICAgICAgICAgICAvLyBsZXQgY2VudGVyIG9yIGVudGVyIHByZXNzZXMgZ28gdGhlcmUgc2luY2UgdGhhdCB3b3VsZCBjYXVzZSBpdAorICAgICAgICAgICAgLy8gdG8gc2VsZWN0IG9uZSBvZiBpdHMgaXRlbXMKKyAgICAgICAgICAgIGlmIChrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfU1BBQ0UKKyAgICAgICAgICAgICAgICAgICAgJiYgKG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSA+PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9FTlRFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYga2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKSkpIHsKKyAgICAgICAgICAgICAgICBpbnQgY3VySW5kZXggPSBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBjb25zdW1lZDsKKworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYmVsb3cgPSAhbVBvcHVwLmlzQWJvdmVBbmNob3IoKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIExpc3RBZGFwdGVyIGFkYXB0ZXIgPSBtQWRhcHRlcjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBib29sZWFuIGFsbEVuYWJsZWQ7CisgICAgICAgICAgICAgICAgaW50IGZpcnN0SXRlbSA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgICAgIGludCBsYXN0SXRlbSA9IEludGVnZXIuTUlOX1ZBTFVFOworCisgICAgICAgICAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhbGxFbmFibGVkID0gYWRhcHRlci5hcmVBbGxJdGVtc0VuYWJsZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RJdGVtID0gYWxsRW5hYmxlZCA/IDAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QubG9va0ZvclNlbGVjdGFibGVQb3NpdGlvbigwLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdEl0ZW0gPSBhbGxFbmFibGVkID8gYWRhcHRlci5nZXRDb3VudCgpIC0gMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5sb29rRm9yU2VsZWN0YWJsZVBvc2l0aW9uKGFkYXB0ZXIuZ2V0Q291bnQoKSAtIDEsIGZhbHNlKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoKGJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQICYmIGN1ckluZGV4IDw9IGZpcnN0SXRlbSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICghYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiAmJiBjdXJJbmRleCA+PSBsYXN0SXRlbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgc2VsZWN0aW9uIGlzIGF0IHRoZSB0b3AsIHdlIGJsb2NrIHRoZSBrZXkKKyAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgdG8gcHJldmVudCBmb2N1cyBmcm9tIG1vdmluZy4KKyAgICAgICAgICAgICAgICAgICAgY2xlYXJMaXN0U2VsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUoUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCk7CisgICAgICAgICAgICAgICAgICAgIHNob3coKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV0FSTklORzogUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnQgd2hlcmUgbUxpc3RTZWxlY3Rpb25IaWRkZW4KKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgaXMgZGVjbGFyZWQKKyAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbnN1bWVkID0gbURyb3BEb3duTGlzdC5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiS2V5IGRvd246IGNvZGU9IiArIGtleUNvZGUgKyAiIGxpc3QgY29uc3VtZWQ9IiArIGNvbnN1bWVkKTsKKworICAgICAgICAgICAgICAgIGlmIChjb25zdW1lZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBoYW5kbGVkIHRoZSBrZXkgZXZlbnQsIHRoZW4gdGhlIHVzZXIgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gbmF2aWdhdGluZyBpbiB0aGUgbGlzdCwgc28gd2Ugc2hvdWxkIHB1dCBpdCBpbiBmcm9udC4KKyAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRCk7CisgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUncyBhIGxpdHRsZSB0cmljayB3ZSBuZWVkIHRvIGRvIHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsaXN0IHZpZXcgaXMgYWN0dWFsbHkgc2hvd2luZyBpdHMgZm9jdXMgaW5kaWNhdG9yLAorICAgICAgICAgICAgICAgICAgICAvLyBieSBlbnN1cmluZyBpdCBoYXMgZm9jdXMgYW5kIGdldHRpbmcgaXRzIHdpbmRvdyBvdXQKKyAgICAgICAgICAgICAgICAgICAgLy8gb2YgdG91Y2ggbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5yZXF1ZXN0Rm9jdXNGcm9tVG91Y2goKTsKKyAgICAgICAgICAgICAgICAgICAgc2hvdygpOworCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZvaWQgcGFzc2luZyB0aGUgZm9jdXMgZnJvbSB0aGUgdGV4dCB2aWV3IHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBjb21wb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9FTlRFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV046CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBzZWxlY3Rpb24gaXMgYXQgdGhlIGJvdHRvbSwgd2UgYmxvY2sgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCB0byBhdm9pZCBnb2luZyB0byB0aGUgbmV4dCBmb2N1c2FibGUgd2lkZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VySW5kZXggPT0gbGFzdEl0ZW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJJbmRleCA9PSBmaXJzdEl0ZW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciBrZXkgZG93biBldmVudHMuIEJ5IGZvcndhcmRpbmcga2V5IHVwIGV2ZW50cyB0byB0aGlzIGZ1bmN0aW9uLAorICAgICAqIHZpZXdzIHVzaW5nIG5vbi1tb2RhbCBMaXN0UG9wdXBXaW5kb3cgY2FuIGhhdmUgaXQgaGFuZGxlIGtleSBzZWxlY3Rpb24gb2YgaXRlbXMuCisgICAgICogIAorICAgICAqIEBwYXJhbSBrZXlDb2RlIGtleUNvZGUgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleVVwCisgICAgICogQHBhcmFtIGV2ZW50IGV2ZW50IHBhcmFtIHBhc3NlZCB0byB0aGUgaG9zdCB2aWV3J3Mgb25LZXlVcAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIGZhbHNlIGlmIGl0IHdhcyBpZ25vcmVkLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldE1vZGFsKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlVcChpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGlzU2hvd2luZygpICYmIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSA+PSAwKSB7CisgICAgICAgICAgICBib29sZWFuIGNvbnN1bWVkID0gbURyb3BEb3duTGlzdC5vbktleVVwKGtleUNvZGUsIGV2ZW50KTsKKyAgICAgICAgICAgIGlmIChjb25zdW1lZCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbGlzdCBhY2NlcHRzIHRoZSBrZXkgZXZlbnRzIGFuZCB0aGUga2V5IGV2ZW50CisgICAgICAgICAgICAgICAgICAgIC8vIHdhcyBhIGNsaWNrLCB0aGUgdGV4dCB2aWV3IGdldHMgdGhlIHNlbGVjdGVkIGl0ZW0KKyAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgZHJvcCBkb3duIGFzIGl0cyBjb250ZW50CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9FTlRFUjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNvbnN1bWVkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgcHJlLUlNRSBrZXkgZXZlbnRzLiBCeSBmb3J3YXJkaW5nIHtAbGluayBWaWV3I29uS2V5UHJlSW1lKGludCwgS2V5RXZlbnQpfQorICAgICAqIGV2ZW50cyB0byB0aGlzIGZ1bmN0aW9uLCB2aWV3cyB1c2luZyBMaXN0UG9wdXBXaW5kb3cgY2FuIGhhdmUgaXQgZGlzbWlzcyB0aGUgcG9wdXAKKyAgICAgKiB3aGVuIHRoZSBiYWNrIGtleSBpcyBwcmVzc2VkLgorICAgICAqICAKKyAgICAgKiBAcGFyYW0ga2V5Q29kZSBrZXlDb2RlIHBhcmFtIHBhc3NlZCB0byB0aGUgaG9zdCB2aWV3J3Mgb25LZXlQcmVJbWUKKyAgICAgKiBAcGFyYW0gZXZlbnQgZXZlbnQgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleVByZUltZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIGZhbHNlIGlmIGl0IHdhcyBpZ25vcmVkLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldE1vZGFsKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlQcmVJbWUoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfQkFDSyAmJiBpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB0aGUgYmFjayBrZXksIHdlIGRvIG5vdCBldmVuIHRyeSB0byBzZW5kIGl0CisgICAgICAgICAgICAvLyB0byB0aGUgZHJvcCBkb3duIGxpc3QgYnV0IGluc3RlYWQsIGNvbnN1bWUgaXQgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgYW5jaG9yVmlldyA9IG1Ecm9wRG93bkFuY2hvclZpZXc7CisgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV04gJiYgZXZlbnQuZ2V0UmVwZWF0Q291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYW5jaG9yVmlldy5nZXRLZXlEaXNwYXRjaGVyU3RhdGUoKS5zdGFydFRyYWNraW5nKGV2ZW50LCB0aGlzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICAgICAgYW5jaG9yVmlldy5nZXRLZXlEaXNwYXRjaGVyU3RhdGUoKS5oYW5kbGVVcEV2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnQuaXNUcmFja2luZygpICYmICFldmVudC5pc0NhbmNlbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkJ1aWxkcyB0aGUgcG9wdXAgd2luZG93J3MgY29udGVudCBhbmQgcmV0dXJucyB0aGUgaGVpZ2h0IHRoZSBwb3B1cAorICAgICAqIHNob3VsZCBoYXZlLiBSZXR1cm5zIC0xIHdoZW4gdGhlIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMuPC9wPgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29udGVudCdzIGhlaWdodCBvciAtMSBpZiBjb250ZW50IGFscmVhZHkgZXhpc3RzCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgYnVpbGREcm9wRG93bigpIHsKKyAgICAgICAgVmlld0dyb3VwIGRyb3BEb3duVmlldzsKKyAgICAgICAgaW50IG90aGVySGVpZ2h0cyA9IDA7CisKKyAgICAgICAgaWYgKG1Ecm9wRG93bkxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbUNvbnRleHQ7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhpcyBSdW5uYWJsZSBleGlzdHMgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgY2hlY2tpbmcgaWYgdGhlIHZpZXcgbGF5b3V0IGhhcyBnb3QKKyAgICAgICAgICAgICAqIGNvbXBsZXRlZCBhbmQgaWYgc28gY2FsbCBzaG93RHJvcERvd24gdG8gZGlzcGxheSB0aGUgZHJvcCBkb3duLiBUaGlzIGlzIHVzZWQgdG8gc2hvdworICAgICAgICAgICAgICogdGhlIGRyb3AgZG93biBhcyBzb29uIGFzIHBvc3NpYmxlIGFmdGVyIHVzZXIgb3BlbnMgdXAgdGhlIHNlYXJjaCBkaWFsb2csIHdpdGhvdXQKKyAgICAgICAgICAgICAqIHdhaXRpbmcgZm9yIHRoZSBub3JtYWwgVUkgcGlwZWxpbmUgdG8gZG8gaXQncyBqb2Igd2hpY2ggaXMgc2xvd2VyIHRoYW4gdGhpcyBtZXRob2QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1TaG93RHJvcERvd25SdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFZpZXcgbGF5b3V0IHNob3VsZCBiZSBhbGwgZG9uZSBiZWZvcmUgZGlzcGxheWluZyB0aGUgZHJvcCBkb3duLgorICAgICAgICAgICAgICAgICAgICBWaWV3IHZpZXcgPSBnZXRBbmNob3JWaWV3KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3ICE9IG51bGwgJiYgdmlldy5nZXRXaW5kb3dUb2tlbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNob3coKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QgPSBuZXcgRHJvcERvd25MaXN0Vmlldyhjb250ZXh0LCAhbU1vZGFsKTsKKyAgICAgICAgICAgIGlmIChtRHJvcERvd25MaXN0SGlnaGxpZ2h0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFNlbGVjdG9yKG1Ecm9wRG93bkxpc3RIaWdobGlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRBZGFwdGVyKG1BZGFwdGVyKTsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0VmVydGljYWxGYWRpbmdFZGdlRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihtSXRlbUNsaWNrTGlzdGVuZXIpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBEcm9wRG93bkxpc3RWaWV3IGRyb3BEb3duTGlzdCA9IG1Ecm9wRG93bkxpc3Q7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wRG93bkxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BEb3duTGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Ob3RoaW5nU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50KSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uU2Nyb2xsTGlzdGVuZXIobVNjcm9sbExpc3RlbmVyKTsKKworICAgICAgICAgICAgaWYgKG1JdGVtU2VsZWN0ZWRMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKG1JdGVtU2VsZWN0ZWRMaXN0ZW5lcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRyb3BEb3duVmlldyA9IG1Ecm9wRG93bkxpc3Q7CisKKyAgICAgICAgICAgIFZpZXcgaGludFZpZXcgPSBtUHJvbXB0VmlldzsKKyAgICAgICAgICAgIGlmIChoaW50VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgYW4gaGludCBoYXMgYmVlbiBzcGVjaWZpZWQsIHdlIGFjY29tb2RhdGUgbW9yZSBzcGFjZSBmb3IgaXQgYW5kCisgICAgICAgICAgICAgICAgLy8gYWRkIGEgdGV4dCB2aWV3IGluIHRoZSBkcm9wIGRvd24gbWVudSwgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdAorICAgICAgICAgICAgICAgIExpbmVhckxheW91dCBoaW50Q29udGFpbmVyID0gbmV3IExpbmVhckxheW91dChjb250ZXh0KTsKKyAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLnNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7CisKKyAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zIGhpbnRQYXJhbXMgPSBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCAwLCAxLjBmCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1Qcm9tcHRQb3NpdGlvbikgeworICAgICAgICAgICAgICAgIGNhc2UgUE9TSVRJT05fUFJPTVBUX0JFTE9XOgorICAgICAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLmFkZFZpZXcoZHJvcERvd25WaWV3LCBoaW50UGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgaGludENvbnRhaW5lci5hZGRWaWV3KGhpbnRWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgUE9TSVRJT05fUFJPTVBUX0FCT1ZFOgorICAgICAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLmFkZFZpZXcoaGludFZpZXcpOworICAgICAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLmFkZFZpZXcoZHJvcERvd25WaWV3LCBoaW50UGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgaGludCBwb3NpdGlvbiAiICsgbVByb21wdFBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gbWVhc3VyZSB0aGUgaGludCdzIGhlaWdodCB0byBmaW5kIGhvdyBtdWNoIG1vcmUgdmVydGljYWwgc3BhY2UKKyAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGFkZCB0byB0aGUgZHJvcCBkb3duJ3MgaGVpZ2h0CisgICAgICAgICAgICAgICAgaW50IHdpZHRoU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhtRHJvcERvd25XaWR0aCwgTWVhc3VyZVNwZWMuQVRfTU9TVCk7CisgICAgICAgICAgICAgICAgaW50IGhlaWdodFNwZWMgPSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDsKKyAgICAgICAgICAgICAgICBoaW50Vmlldy5tZWFzdXJlKHdpZHRoU3BlYywgaGVpZ2h0U3BlYyk7CisKKyAgICAgICAgICAgICAgICBoaW50UGFyYW1zID0gKExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMpIGhpbnRWaWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgICAgIG90aGVySGVpZ2h0cyA9IGhpbnRWaWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBoaW50UGFyYW1zLnRvcE1hcmdpbgorICAgICAgICAgICAgICAgICAgICAgICAgKyBoaW50UGFyYW1zLmJvdHRvbU1hcmdpbjsKKworICAgICAgICAgICAgICAgIGRyb3BEb3duVmlldyA9IGhpbnRDb250YWluZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRDb250ZW50Vmlldyhkcm9wRG93blZpZXcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gKFZpZXdHcm91cCkgbVBvcHVwLmdldENvbnRlbnRWaWV3KCk7CisgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBtUHJvbXB0VmlldzsKKyAgICAgICAgICAgIGlmICh2aWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zIGhpbnRQYXJhbXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMpIHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgb3RoZXJIZWlnaHRzID0gdmlldy5nZXRNZWFzdXJlZEhlaWdodCgpICsgaGludFBhcmFtcy50b3BNYXJnaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICsgaGludFBhcmFtcy5ib3R0b21NYXJnaW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBNYXggaGVpZ2h0IGF2YWlsYWJsZSBvbiB0aGUgc2NyZWVuIGZvciBhIHBvcHVwLgorICAgICAgICBib29sZWFuIGlnbm9yZUJvdHRvbURlY29yYXRpb25zID0KKyAgICAgICAgICAgICAgICBtUG9wdXAuZ2V0SW5wdXRNZXRob2RNb2RlKCkgPT0gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7CisgICAgICAgIGZpbmFsIGludCBtYXhIZWlnaHQgPSBtUG9wdXAuZ2V0TWF4QXZhaWxhYmxlSGVpZ2h0KAorICAgICAgICAgICAgICAgIGdldEFuY2hvclZpZXcoKSwgbURyb3BEb3duVmVydGljYWxPZmZzZXQsIGlnbm9yZUJvdHRvbURlY29yYXRpb25zKTsKKworICAgICAgICAvLyBnZXRNYXhBdmFpbGFibGVIZWlnaHQoKSBzdWJ0cmFjdHMgdGhlIHBhZGRpbmcsIHNvIHdlIHB1dCBpdCBiYWNrLAorICAgICAgICAvLyB0byBnZXQgdGhlIGF2YWlsYWJsZSBoZWlnaHQgZm9yIHRoZSB3aG9sZSB3aW5kb3cKKyAgICAgICAgaW50IHBhZGRpbmcgPSAwOworICAgICAgICBEcmF3YWJsZSBiYWNrZ3JvdW5kID0gbVBvcHVwLmdldEJhY2tncm91bmQoKTsKKyAgICAgICAgaWYgKGJhY2tncm91bmQgIT0gbnVsbCkgeworICAgICAgICAgICAgYmFja2dyb3VuZC5nZXRQYWRkaW5nKG1UZW1wUmVjdCk7CisgICAgICAgICAgICBwYWRkaW5nID0gbVRlbXBSZWN0LnRvcCArIG1UZW1wUmVjdC5ib3R0b207CisgICAgICAgIH0KKworICAgICAgICBpZiAobURyb3BEb3duQWx3YXlzVmlzaWJsZSB8fCBtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXhIZWlnaHQgKyBwYWRkaW5nOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGxpc3RDb250ZW50ID0gbURyb3BEb3duTGlzdC5tZWFzdXJlSGVpZ2h0T2ZDaGlsZHJlbihNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAwLCBMaXN0Vmlldy5OT19QT1NJVElPTiwgbWF4SGVpZ2h0IC0gb3RoZXJIZWlnaHRzLCAyKTsKKyAgICAgICAgLy8gYWRkIHBhZGRpbmcgb25seSBpZiB0aGUgbGlzdCBoYXMgaXRlbXMgaW4gaXQsIHRoYXQgd2F5IHdlIGRvbid0IHNob3cKKyAgICAgICAgLy8gdGhlIHBvcHVwIGlmIGl0IGlzIG5vdCBuZWVkZWQKKyAgICAgICAgaWYgKGxpc3RDb250ZW50ID4gMCkgb3RoZXJIZWlnaHRzICs9IHBhZGRpbmc7CisKKyAgICAgICAgcmV0dXJuIGxpc3RDb250ZW50ICsgb3RoZXJIZWlnaHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPldyYXBwZXIgY2xhc3MgZm9yIGEgTGlzdFZpZXcuIFRoaXMgd3JhcHBlciBjYW4gaGlqYWNrIHRoZSBmb2N1cyB0bworICAgICAqIG1ha2Ugc3VyZSB0aGUgbGlzdCB1c2VzIHRoZSBhcHByb3ByaWF0ZSBkcmF3YWJsZXMgYW5kIHN0YXRlcyB3aGVuCisgICAgICogZGlzcGxheWVkIG9uIHNjcmVlbiB3aXRoaW4gYSBkcm9wIGRvd24uIFRoZSBmb2N1cyBpcyBuZXZlciBhY3R1YWxseQorICAgICAqIHBhc3NlZCB0byB0aGUgZHJvcCBkb3duIGluIHRoaXMgbW9kZTsgdGhlIGxpc3Qgb25seSBsb29rcyBmb2N1c2VkLjwvcD4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEcm9wRG93bkxpc3RWaWV3IGV4dGVuZHMgTGlzdFZpZXcgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gTGlzdFBvcHVwV2luZG93LlRBRyArICIuRHJvcERvd25MaXN0VmlldyI7CisgICAgICAgIC8qCisgICAgICAgICAqIFdBUk5JTkc6IFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBhIHRvdWNoIG1vZGUgaXNzdWUuCisgICAgICAgICAqCisgICAgICAgICAqIFRvdWNoIG1vZGUgaXMgcHJvcGFnYXRlZCBsYXppbHkgdG8gd2luZG93cy4gVGhpcyBjYXVzZXMgcHJvYmxlbXMgaW4KKyAgICAgICAgICogdGhlIGZvbGxvd2luZyBzY2VuYXJpbzoKKyAgICAgICAgICogLSBUeXBlIHNvbWV0aGluZyBpbiB0aGUgQXV0b0NvbXBsZXRlVGV4dFZpZXcgYW5kIGdldCBzb21lIHJlc3VsdHMKKyAgICAgICAgICogLSBNb3ZlIGRvd24gd2l0aCB0aGUgZC1wYWQgdG8gc2VsZWN0IGFuIGl0ZW0gaW4gdGhlIGxpc3QKKyAgICAgICAgICogLSBNb3ZlIHVwIHdpdGggdGhlIGQtcGFkIHVudGlsIHRoZSBzZWxlY3Rpb24gZGlzYXBwZWFycworICAgICAgICAgKiAtIFR5cGUgbW9yZSB0ZXh0IGluIHRoZSBBdXRvQ29tcGxldGVUZXh0VmlldyAqdXNpbmcgdGhlIHNvZnQga2V5Ym9hcmQqCisgICAgICAgICAqICAgYW5kIGdldCBuZXcgcmVzdWx0czsgeW91IGFyZSBub3cgaW4gdG91Y2ggbW9kZQorICAgICAgICAgKiAtIFRoZSBzZWxlY3Rpb24gY29tZXMgYmFjayBvbiB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCwgZXZlbiB0aG91Z2gKKyAgICAgICAgICogICB0aGUgbGlzdCBpcyBzdXBwb3NlZCB0byBiZSBpbiB0b3VjaCBtb2RlCisgICAgICAgICAqCisgICAgICAgICAqIFVzaW5nIHRoZSBzb2Z0IGtleWJvYXJkIHRyaWdnZXJzIHRoZSB0b3VjaCBtb2RlIGNoYW5nZSBidXQgdGhhdCBjaGFuZ2UKKyAgICAgICAgICogaXMgcHJvcGFnYXRlZCB0byBvdXIgd2luZG93IG9ubHkgYWZ0ZXIgdGhlIGZpcnN0IGxpc3QgbGF5b3V0LCB0aGVyZWZvcmUKKyAgICAgICAgICogYWZ0ZXIgdGhlIGxpc3QgYXR0ZW1wdHMgdG8gcmVzdXJyZWN0IHRoZSBzZWxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSB0cmljayB0byB3b3JrIGFyb3VuZCB0aGlzIGlzc3VlIGlzIHRvIHByZXRlbmQgdGhlIGxpc3QgaXMgaW4gdG91Y2gKKyAgICAgICAgICogbW9kZSB3aGVuIHdlIGtub3cgdGhhdCB0aGUgc2VsZWN0aW9uIHNob3VsZCBub3QgYXBwZWFyLCB0aGF0IGlzIHdoZW4KKyAgICAgICAgICogd2Uga25vdyB0aGUgdXNlciBtb3ZlZCB0aGUgc2VsZWN0aW9uIGF3YXkgZnJvbSB0aGUgbGlzdC4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBib29sZWFuIGlzIHNldCB0byB0cnVlIHdoZW5ldmVyIHdlIGV4cGxpY2l0bHkgaGlkZSB0aGUgbGlzdCdzCisgICAgICAgICAqIHNlbGVjdGlvbiBhbmQgcmVzZXQgdG8gZmFsc2Ugd2hlbmV2ZXIgd2Uga25vdyB0aGUgdXNlciBtb3ZlZCB0aGUKKyAgICAgICAgICogc2VsZWN0aW9uIGJhY2sgdG8gdGhlIGxpc3QuCisgICAgICAgICAqCisgICAgICAgICAqIFdoZW4gdGhpcyBib29sZWFuIGlzIHRydWUsIGlzSW5Ub3VjaE1vZGUoKSByZXR1cm5zIHRydWUsIG90aGVyd2lzZSBpdAorICAgICAgICAgKiByZXR1cm5zIHN1cGVyLmlzSW5Ub3VjaE1vZGUoKS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTGlzdFNlbGVjdGlvbkhpZGRlbjsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBUcnVlIGlmIHRoaXMgd3JhcHBlciBzaG91bGQgZmFrZSBmb2N1cy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSGlqYWNrRm9jdXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPkNyZWF0ZXMgYSBuZXcgbGlzdCB2aWV3IHdyYXBwZXIuPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCB0aGlzIHZpZXcncyBjb250ZXh0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRHJvcERvd25MaXN0VmlldyhDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gaGlqYWNrRm9jdXMpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5kcm9wRG93bkxpc3RWaWV3U3R5bGUpOworICAgICAgICAgICAgbUhpamFja0ZvY3VzID0gaGlqYWNrRm9jdXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+QXZvaWRzIGphcnJpbmcgc2Nyb2xsaW5nIGVmZmVjdCBieSBlbnN1cmluZyB0aGF0IGxpc3QgZWxlbWVudHMKKyAgICAgICAgICogbWFkZSBvZiBhIHRleHQgdmlldyBmaXQgb24gYSBzaW5nbGUgbGluZS48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgaXRlbSBpbmRleCBpbiB0aGUgbGlzdCB0byBnZXQgYSB2aWV3IGZvcgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB2aWV3IGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBWaWV3IG9idGFpblZpZXcoaW50IHBvc2l0aW9uLCBib29sZWFuW10gaXNTY3JhcCkgeworICAgICAgICAgICAgVmlldyB2aWV3ID0gc3VwZXIub2J0YWluVmlldyhwb3NpdGlvbiwgaXNTY3JhcCk7CisKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgVGV4dFZpZXcpIHsKKyAgICAgICAgICAgICAgICAoKFRleHRWaWV3KSB2aWV3KS5zZXRIb3Jpem9udGFsbHlTY3JvbGxpbmcodHJ1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB2aWV3OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSW5Ub3VjaE1vZGUoKSB7CisgICAgICAgICAgICAvLyBXQVJOSU5HOiBQbGVhc2UgcmVhZCB0aGUgY29tbWVudCB3aGVyZSBtTGlzdFNlbGVjdGlvbkhpZGRlbiBpcyBkZWNsYXJlZAorICAgICAgICAgICAgcmV0dXJuIChtSGlqYWNrRm9jdXMgJiYgbUxpc3RTZWxlY3Rpb25IaWRkZW4pIHx8IHN1cGVyLmlzSW5Ub3VjaE1vZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5SZXR1cm5zIHRoZSBmb2N1cyBzdGF0ZSBpbiB0aGUgZHJvcCBkb3duLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0cnVlIGFsd2F5cyBpZiBoaWphY2tpbmcgZm9jdXMKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNXaW5kb3dGb2N1cygpIHsKKyAgICAgICAgICAgIHJldHVybiBtSGlqYWNrRm9jdXMgfHwgc3VwZXIuaGFzV2luZG93Rm9jdXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5SZXR1cm5zIHRoZSBmb2N1cyBzdGF0ZSBpbiB0aGUgZHJvcCBkb3duLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0cnVlIGFsd2F5cyBpZiBoaWphY2tpbmcgZm9jdXMKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUhpamFja0ZvY3VzIHx8IHN1cGVyLmlzRm9jdXNlZCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzIGlmIGhpamFja2luZyBmb2N1cworICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1IaWphY2tGb2N1cyB8fCBzdXBlci5oYXNGb2N1cygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBQb3B1cERhdGFTZXRPYnNlcnZlciBleHRlbmRzIERhdGFTZXRPYnNlcnZlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZWQoKSB7CisgICAgICAgICAgICBpZiAoaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBSZXNpemUgdGhlIHBvcHVwIHRvIGZpdCBuZXcgY29udGVudAorICAgICAgICAgICAgICAgIHNob3coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSW52YWxpZGF0ZWQoKSB7CisgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIExpc3RTZWxlY3RvckhpZGVyIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUmVzaXplUG9wdXBSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRCk7CisgICAgICAgICAgICBzaG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBvcHVwVG91Y2hJbnRlcmNlcHRvciBpbXBsZW1lbnRzIE9uVG91Y2hMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2goVmlldyB2LCBNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2ZW50LmdldEFjdGlvbigpOworICAgICAgICAgICAgZmluYWwgaW50IHggPSAoaW50KSBldmVudC5nZXRYKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgeSA9IChpbnQpIGV2ZW50LmdldFkoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTiAmJgorICAgICAgICAgICAgICAgICAgICBtUG9wdXAgIT0gbnVsbCAmJiBtUG9wdXAuaXNTaG93aW5nKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHggPj0gMCAmJiB4IDwgZ2V0V2lkdGgoKSAmJiB5ID49IDAgJiYgeSA8IGdldEhlaWdodCgpKSkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1SZXNpemVQb3B1cFJ1bm5hYmxlLCBFWFBBTkRfTElTVF9USU1FT1VUKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUmVzaXplUG9wdXBSdW5uYWJsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBvcHVwU2Nyb2xsTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Vmlldy5PblNjcm9sbExpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25TY3JvbGwoQWJzTGlzdFZpZXcgdmlldywgaW50IGZpcnN0VmlzaWJsZUl0ZW0sIGludCB2aXNpYmxlSXRlbUNvdW50LAorICAgICAgICAgICAgICAgIGludCB0b3RhbEl0ZW1Db3VudCkgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblNjcm9sbFN0YXRlQ2hhbmdlZChBYnNMaXN0VmlldyB2aWV3LCBpbnQgc2Nyb2xsU3RhdGUpIHsKKyAgICAgICAgICAgIGlmIChzY3JvbGxTdGF0ZSA9PSBTQ1JPTExfU1RBVEVfVE9VQ0hfU0NST0xMICYmCisgICAgICAgICAgICAgICAgICAgICFpc0lucHV0TWV0aG9kTm90TmVlZGVkKCkgJiYgbVBvcHVwLmdldENvbnRlbnRWaWV3KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUmVzaXplUG9wdXBSdW5uYWJsZSk7CisgICAgICAgICAgICAgICAgbVJlc2l6ZVBvcHVwUnVubmFibGUucnVuKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGlzdFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0Vmlldy5qYXZhCmluZGV4IDQ2Y2Q0NWEuLmY5YmRjNDMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0Vmlldy5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTGlzdHM7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwpAQCAtMjcsMTAgKzI4LDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Db2xvckRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvbmdTcGFyc2VBcnJheTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQm9vbGVhbkFycmF5OwogaW1wb3J0IGFuZHJvaWQudmlldy5Gb2N1c0ZpbmRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CkBAIC00MSw2ICszOSw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1BhcmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MuUmVtb3RlVmlldzsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKQEAgLTY0LDEwICs2MywxMCBAQAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGlzdFZpZXdfZW50cmllcwogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGlzdFZpZXdfZGl2aWRlcgogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGlzdFZpZXdfZGl2aWRlckhlaWdodAotICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGlzdFZpZXdfY2hvaWNlTW9kZQogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGlzdFZpZXdfaGVhZGVyRGl2aWRlcnNFbmFibGVkCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19mb290ZXJEaXZpZGVyc0VuYWJsZWQKICAqLworQFJlbW90ZVZpZXcKIHB1YmxpYyBjbGFzcyBMaXN0VmlldyBleHRlbmRzIEFic0xpc3RWaWV3IHsKICAgICAvKioKICAgICAgKiBVc2VkIHRvIGluZGljYXRlIGEgbm8gcHJlZmVyZW5jZSBmb3IgYSBwb3NpdGlvbiB0eXBlLgpAQCAtNzUsMjEgKzc0LDYgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IE5PX1BPU0lUSU9OID0gLTE7CiAKICAgICAvKioKLSAgICAgKiBOb3JtYWwgbGlzdCB0aGF0IGRvZXMgbm90IGluZGljYXRlIGNob2ljZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9OT05FID0gMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBsaXN0IGFsbG93cyB1cCB0byBvbmUgY2hvaWNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFX01PREVfU0lOR0xFID0gMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBsaXN0IGFsbG93cyBtdWx0aXBsZSBjaG9pY2VzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFX01PREVfTVVMVElQTEUgPSAyOwotCi0gICAgLyoqCiAgICAgICogV2hlbiBhcnJvdyBzY3JvbGxpbmcsIExpc3RWaWV3IHdpbGwgbmV2ZXIgc2Nyb2xsIG1vcmUgdGhhbiB0aGlzIGZhY3RvcgogICAgICAqIHRpbWVzIHRoZSBoZWlnaHQgb2YgdGhlIGxpc3QuCiAgICAgICovCkBAIC0xMjEsOSArMTA1LDYgQEAKICAgICBEcmF3YWJsZSBtRGl2aWRlcjsKICAgICBpbnQgbURpdmlkZXJIZWlnaHQ7CiAgICAgCi0gICAgRHJhd2FibGUgbU92ZXJzY3JvbGxIZWFkZXI7Ci0gICAgRHJhd2FibGUgbU92ZXJzY3JvbGxGb290ZXI7Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQ2FjaGVDb2xvck9wYXF1ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbURpdmlkZXJJc09wYXF1ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbUNsaXBEaXZpZGVyOwpAQCAtMTM1LDExICsxMTYsNiBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1JdGVtc0NhbkZvY3VzID0gZmFsc2U7CiAKLSAgICBwcml2YXRlIGludCBtQ2hvaWNlTW9kZSA9IENIT0lDRV9NT0RFX05PTkU7Ci0KLSAgICBwcml2YXRlIFNwYXJzZUJvb2xlYW5BcnJheSBtQ2hlY2tTdGF0ZXM7Ci0gICAgcHJpdmF0ZSBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4gbUNoZWNrZWRJZFN0YXRlczsKLQogICAgIC8vIHVzZWQgZm9yIHRlbXBvcmFyeSBjYWxjdWxhdGlvbnMuCiAgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7CiAgICAgcHJpdmF0ZSBQYWludCBtRGl2aWRlclBhaW50OwpAQCAtMTUwLDcgKzEyNiw3IEBACiAKICAgICAvLyBLZWVwcyBmb2N1c2VkIGNoaWxkcmVuIHZpc2libGUgdGhyb3VnaCByZXNpemVzCiAgICAgcHJpdmF0ZSBGb2N1c1NlbGVjdG9yIG1Gb2N1c1NlbGVjdG9yOwotICAgIAorCiAgICAgcHVibGljIExpc3RWaWV3KENvbnRleHQgY29udGV4dCkgewogICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwogICAgIH0KQEAgLTE3OCwxNiArMTU0LDYgQEAKICAgICAgICAgICAgIHNldERpdmlkZXIoZCk7CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGZpbmFsIERyYXdhYmxlIG9zSGVhZGVyID0gYS5nZXREcmF3YWJsZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5MaXN0Vmlld19vdmVyc2Nyb2xsSGVhZGVyKTsKLSAgICAgICAgaWYgKG9zSGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldE92ZXJzY3JvbGxIZWFkZXIob3NIZWFkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgRHJhd2FibGUgb3NGb290ZXIgPSBhLmdldERyYXdhYmxlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkxpc3RWaWV3X292ZXJzY3JvbGxGb290ZXIpOwotICAgICAgICBpZiAob3NGb290ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0T3ZlcnNjcm9sbEZvb3Rlcihvc0Zvb3Rlcik7Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBVc2UgdGhlIGhlaWdodCBzcGVjaWZpZWQsIHplcm8gYmVpbmcgdGhlIGRlZmF1bHQKICAgICAgICAgZmluYWwgaW50IGRpdmlkZXJIZWlnaHQgPSBhLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5MaXN0Vmlld19kaXZpZGVySGVpZ2h0LCAwKTsKQEAgLTE5NSw4ICsxNjEsNiBAQAogICAgICAgICAgICAgc2V0RGl2aWRlckhlaWdodChkaXZpZGVySGVpZ2h0KTsKICAgICAgICAgfQogCi0gICAgICAgIHNldENob2ljZU1vZGUoYS5nZXRJbnQoUi5zdHlsZWFibGUuTGlzdFZpZXdfY2hvaWNlTW9kZSwgQ0hPSUNFX01PREVfTk9ORSkpOwotICAgICAgICAKICAgICAgICAgbUhlYWRlckRpdmlkZXJzRW5hYmxlZCA9IGEuZ2V0Qm9vbGVhbihSLnN0eWxlYWJsZS5MaXN0Vmlld19oZWFkZXJEaXZpZGVyc0VuYWJsZWQsIHRydWUpOwogICAgICAgICBtRm9vdGVyRGl2aWRlcnNFbmFibGVkID0gYS5nZXRCb29sZWFuKFIuc3R5bGVhYmxlLkxpc3RWaWV3X2Zvb3RlckRpdmlkZXJzRW5hYmxlZCwgdHJ1ZSk7CiAKQEAgLTQxNyw2ICszODEsMTYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoaXMgQWJzTGlzdFZpZXcgdG8gdXNlIGEgcmVtb3RlIHZpZXdzIGFkYXB0ZXIgd2hpY2ggY29ubmVjdHMgdG8gYSBSZW1vdGVWaWV3c1NlcnZpY2UKKyAgICAgKiB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgaW50ZW50LgorICAgICAqIEBwYXJhbSBpbnRlbnQgdGhlIGludGVudCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UgZm9yIHRoZSBhZGFwdGVyIHRvIGNvbm5lY3QgdG8uCisgICAgICovCisgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlVmlld3NBZGFwdGVyKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgc3VwZXIuc2V0UmVtb3RlVmlld3NBZGFwdGVyKGludGVudCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZGF0YSBiZWhpbmQgdGhpcyBMaXN0Vmlldy4KICAgICAgKgogICAgICAqIFRoZSBhZGFwdGVyIHBhc3NlZCB0byB0aGlzIG1ldGhvZCBtYXkgYmUgd3JhcHBlZCBieSBhIHtAbGluayBXcmFwcGVyTGlzdEFkYXB0ZXJ9LApAQCAtNDMxLDcgKzQwNSw3IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihMaXN0QWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIGlmIChudWxsICE9IG1BZGFwdGVyKSB7CisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsICYmIG1EYXRhU2V0T2JzZXJ2ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgbUFkYXB0ZXIudW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKICAgICAgICAgfQogCkBAIC00NDYsNiArNDIwLDEwIEBACiAKICAgICAgICAgbU9sZFNlbGVjdGVkUG9zaXRpb24gPSBJTlZBTElEX1BPU0lUSU9OOwogICAgICAgICBtT2xkU2VsZWN0ZWRSb3dJZCA9IElOVkFMSURfUk9XX0lEOworCisgICAgICAgIC8vIEFic0xpc3RWaWV3I3NldEFkYXB0ZXIgd2lsbCB1cGRhdGUgY2hvaWNlIG1vZGUgc3RhdGVzLgorICAgICAgICBzdXBlci5zZXRBZGFwdGVyKGFkYXB0ZXIpOworCiAgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBtQXJlQWxsSXRlbXNTZWxlY3RhYmxlID0gbUFkYXB0ZXIuYXJlQWxsSXRlbXNFbmFibGVkKCk7CiAgICAgICAgICAgICBtT2xkSXRlbUNvdW50ID0gbUl0ZW1Db3VudDsKQEAgLTQ3MCwxMyArNDQ4LDYgQEAKICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHNlbGVjdGVkCiAgICAgICAgICAgICAgICAgY2hlY2tTZWxlY3Rpb25DaGFuZ2VkKCk7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FICYmCi0gICAgICAgICAgICAgICAgICAgIG1BZGFwdGVyLmhhc1N0YWJsZUlkcygpICYmCi0gICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMgPSBuZXcgTG9uZ1NwYXJzZUFycmF5PEJvb2xlYW4+KCk7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1BcmVBbGxJdGVtc1NlbGVjdGFibGUgPSB0cnVlOwogICAgICAgICAgICAgY2hlY2tGb2N1cygpOwpAQCAtNDg0LDE0ICs0NTUsNiBAQAogICAgICAgICAgICAgY2hlY2tTZWxlY3Rpb25DaGFuZ2VkKCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobUNoZWNrU3RhdGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobUNoZWNrZWRJZFN0YXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmNsZWFyKCk7Ci0gICAgICAgIH0KLQogICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CiAgICAgfQogCkBAIC04NzksNiArODQyLDI1IEBACiAgICAgICAgIHJldHVybiB0b3BTZWxlY3Rpb25QaXhlbDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uLiBUaGUgdmlldyB3aWxsCisgICAgICogc2Nyb2xsIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZC4KKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gU2Nyb2xsIHRvIHRoaXMgYWRhcHRlciBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBzdXBlci5zbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uIG9mZnNldC4gVGhlIHZpZXcgd2lsbAorICAgICAqIHNjcm9sbCBzdWNoIHRoYXQgdGhlIGluZGljYXRlZCBwb3NpdGlvbiBpcyBkaXNwbGF5ZWQuCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgYW1vdW50IHRvIG9mZnNldCBmcm9tIHRoZSBhZGFwdGVyIHBvc2l0aW9uIHRvIHNjcm9sbCB0by4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzbW9vdGhTY3JvbGxCeU9mZnNldChpbnQgb2Zmc2V0KSB7CisgICAgICAgIHN1cGVyLnNtb290aFNjcm9sbEJ5T2Zmc2V0KG9mZnNldCk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogRmlsbHMgdGhlIGxpc3QgYmFzZWQgb24gcG9zaXRpb25pbmcgdGhlIG5ldyBzZWxlY3Rpb24gcmVsYXRpdmUgdG8gdGhlIG9sZApAQCAtMjk1OCw1MiArMjk0MCwxNCBAQAogICAgICAgICB9CiAgICAgICAgIHN1cGVyLnNldENhY2hlQ29sb3JIaW50KGNvbG9yKTsKICAgICB9Ci0KLSAgICB2b2lkIGRyYXdPdmVyc2Nyb2xsSGVhZGVyKENhbnZhcyBjYW52YXMsIERyYXdhYmxlIGRyYXdhYmxlLCBSZWN0IGJvdW5kcykgewotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZHJhd2FibGUuZ2V0TWluaW11bUhlaWdodCgpOwotCi0gICAgICAgIGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgIGNhbnZhcy5jbGlwUmVjdChib3VuZHMpOwotCi0gICAgICAgIGZpbmFsIGludCBzcGFuID0gYm91bmRzLmJvdHRvbSAtIGJvdW5kcy50b3A7Ci0gICAgICAgIGlmIChzcGFuIDwgaGVpZ2h0KSB7Ci0gICAgICAgICAgICBib3VuZHMudG9wID0gYm91bmRzLmJvdHRvbSAtIGhlaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIGRyYXdhYmxlLnNldEJvdW5kcyhib3VuZHMpOwotICAgICAgICBkcmF3YWJsZS5kcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGRyYXdPdmVyc2Nyb2xsRm9vdGVyKENhbnZhcyBjYW52YXMsIERyYXdhYmxlIGRyYXdhYmxlLCBSZWN0IGJvdW5kcykgewotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZHJhd2FibGUuZ2V0TWluaW11bUhlaWdodCgpOwotCi0gICAgICAgIGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgIGNhbnZhcy5jbGlwUmVjdChib3VuZHMpOwotCi0gICAgICAgIGZpbmFsIGludCBzcGFuID0gYm91bmRzLmJvdHRvbSAtIGJvdW5kcy50b3A7Ci0gICAgICAgIGlmIChzcGFuIDwgaGVpZ2h0KSB7Ci0gICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm91bmRzLnRvcCArIGhlaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIGRyYXdhYmxlLnNldEJvdW5kcyhib3VuZHMpOwotICAgICAgICBkcmF3YWJsZS5kcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKLSAgICB9Ci0KKyAgICAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaERyYXcoQ2FudmFzIGNhbnZhcykgewogICAgICAgICAvLyBEcmF3IHRoZSBkaXZpZGVycwogICAgICAgICBmaW5hbCBpbnQgZGl2aWRlckhlaWdodCA9IG1EaXZpZGVySGVpZ2h0OwotICAgICAgICBmaW5hbCBEcmF3YWJsZSBvdmVyc2Nyb2xsSGVhZGVyID0gbU92ZXJzY3JvbGxIZWFkZXI7Ci0gICAgICAgIGZpbmFsIERyYXdhYmxlIG92ZXJzY3JvbGxGb290ZXIgPSBtT3ZlcnNjcm9sbEZvb3RlcjsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBkcmF3T3ZlcnNjcm9sbEhlYWRlciA9IG92ZXJzY3JvbGxIZWFkZXIgIT0gbnVsbDsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBkcmF3T3ZlcnNjcm9sbEZvb3RlciA9IG92ZXJzY3JvbGxGb290ZXIgIT0gbnVsbDsKICAgICAgICAgZmluYWwgYm9vbGVhbiBkcmF3RGl2aWRlcnMgPSBkaXZpZGVySGVpZ2h0ID4gMCAmJiBtRGl2aWRlciAhPSBudWxsOwogCi0gICAgICAgIGlmIChkcmF3RGl2aWRlcnMgfHwgZHJhd092ZXJzY3JvbGxIZWFkZXIgfHwgZHJhd092ZXJzY3JvbGxGb290ZXIpIHsKKyAgICAgICAgaWYgKGRyYXdEaXZpZGVycykgewogICAgICAgICAgICAgLy8gT25seSBtb2RpZnkgdGhlIHRvcCBhbmQgYm90dG9tIGluIHRoZSBsb29wLCB3ZSBzZXQgdGhlIGxlZnQgYW5kIHJpZ2h0IGhlcmUKICAgICAgICAgICAgIGZpbmFsIFJlY3QgYm91bmRzID0gbVRlbXBSZWN0OwogICAgICAgICAgICAgYm91bmRzLmxlZnQgPSBtUGFkZGluZ0xlZnQ7CkBAIC0zMDIyLDcgKzI5NjYsNyBAQAogICAgICAgICAgICAgLy8gZmlsbCBhIHJlY3Qgd2hlcmUgdGhlIGRpdmlkZXJzIHdvdWxkIGJlIGZvciBub24tc2VsZWN0YWJsZSBpdGVtcwogICAgICAgICAgICAgLy8gSWYgdGhlIGxpc3QgaXMgb3BhcXVlIGFuZCB0aGUgYmFja2dyb3VuZCBpcyBhbHNvIG9wYXF1ZSwgd2UgZG9uJ3QKICAgICAgICAgICAgIC8vIG5lZWQgdG8gZHJhdyBhbnl0aGluZyBzaW5jZSB0aGUgYmFja2dyb3VuZCB3aWxsIGRvIGl0IGZvciB1cwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBmaWxsRm9yTWlzc2luZ0RpdmlkZXJzID0gZHJhd0RpdmlkZXJzICYmIGlzT3BhcXVlKCkgJiYgIXN1cGVyLmlzT3BhcXVlKCk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGZpbGxGb3JNaXNzaW5nRGl2aWRlcnMgPSBpc09wYXF1ZSgpICYmICFzdXBlci5pc09wYXF1ZSgpOwogCiAgICAgICAgICAgICBpZiAoZmlsbEZvck1pc3NpbmdEaXZpZGVycyAmJiBtRGl2aWRlclBhaW50ID09IG51bGwgJiYgbUlzQ2FjaGVDb2xvck9wYXF1ZSkgewogICAgICAgICAgICAgICAgIG1EaXZpZGVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKQEAgLTMwMzIsNzIgKzI5NzYsNDEgQEAKIAogICAgICAgICAgICAgZmluYWwgaW50IGxpc3RCb3R0b20gPSBtQm90dG9tIC0gbVRvcCAtIG1MaXN0UGFkZGluZy5ib3R0b20gKyBtU2Nyb2xsWTsKICAgICAgICAgICAgIGlmICghbVN0YWNrRnJvbUJvdHRvbSkgewotICAgICAgICAgICAgICAgIGludCBib3R0b20gPSAwOworICAgICAgICAgICAgICAgIGludCBib3R0b207CiAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gRHJhdyB0b3AgZGl2aWRlciBvciBoZWFkZXIgZm9yIG92ZXJzY3JvbGwKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDAgJiYgc2Nyb2xsWSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXdPdmVyc2Nyb2xsSGVhZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy50b3AgPSBzY3JvbGxZOwotICAgICAgICAgICAgICAgICAgICAgICAgZHJhd092ZXJzY3JvbGxIZWFkZXIoY2FudmFzLCBvdmVyc2Nyb2xsSGVhZGVyLCBib3VuZHMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRyYXdEaXZpZGVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLmJvdHRvbSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gLWRpdmlkZXJIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcmF3RGl2aWRlcihjYW52YXMsIGJvdW5kcywgLTEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICgoaGVhZGVyRGl2aWRlcnMgfHwgZmlyc3QgKyBpID49IGhlYWRlckNvdW50KSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb290ZXJEaXZpZGVycyB8fCBmaXJzdCArIGkgPCBmb290ZXJMaW1pdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tID0gY2hpbGQuZ2V0Qm90dG9tKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBkcmF3IGRpdmlkZXJzIG5leHQgdG8gaXRlbXMgdGhhdCBhcmUgbm90IGVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcmF3RGl2aWRlcnMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJvdHRvbSA8IGxpc3RCb3R0b20gJiYgIShkcmF3T3ZlcnNjcm9sbEZvb3RlciAmJiBpID09IGNvdW50IC0gMSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhcmVBbGxJdGVtc1NlbGVjdGFibGUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkpICYmIChpID09IGNvdW50IC0gMSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkgKyAxKSkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm90dG9tICsgZGl2aWRlckhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0RpdmlkZXIoY2FudmFzLCBib3VuZHMsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsbEZvck1pc3NpbmdEaXZpZGVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm90dG9tICsgZGl2aWRlckhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KGJvdW5kcywgcGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYXJlQWxsSXRlbXNTZWxlY3RhYmxlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkpICYmIChpID09IGNvdW50IC0gMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuaXNFbmFibGVkKGZpcnN0ICsgaSArIDEpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLnRvcCA9IGJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm90dG9tICsgZGl2aWRlckhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3RGl2aWRlcihjYW52YXMsIGJvdW5kcywgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGxGb3JNaXNzaW5nRGl2aWRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBib3R0b20gKyBkaXZpZGVySGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChib3VuZHMsIHBhaW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBvdmVyRm9vdGVyQm90dG9tID0gbUJvdHRvbSArIG1TY3JvbGxZOwotICAgICAgICAgICAgICAgIGlmIChkcmF3T3ZlcnNjcm9sbEZvb3RlciAmJiBmaXJzdCArIGNvdW50ID09IGl0ZW1Db3VudCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgb3ZlckZvb3RlckJvdHRvbSA+IGJvdHRvbSkgewotICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOwotICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gb3ZlckZvb3RlckJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgZHJhd092ZXJzY3JvbGxGb290ZXIoY2FudmFzLCBvdmVyc2Nyb2xsRm9vdGVyLCBib3VuZHMpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaW50IHRvcDsKICAgICAgICAgICAgICAgICBpbnQgbGlzdFRvcCA9IG1MaXN0UGFkZGluZy50b3A7CiAKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWSA9IG1TY3JvbGxZOwogCi0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCAmJiBkcmF3T3ZlcnNjcm9sbEhlYWRlcikgewotICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gc2Nyb2xsWTsKLSAgICAgICAgICAgICAgICAgICAgYm91bmRzLmJvdHRvbSA9IGdldENoaWxkQXQoMCkuZ2V0VG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRyYXdPdmVyc2Nyb2xsSGVhZGVyKGNhbnZhcywgb3ZlcnNjcm9sbEhlYWRlciwgYm91bmRzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3RhcnQgPSBkcmF3T3ZlcnNjcm9sbEhlYWRlciA/IDEgOiAwOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKChoZWFkZXJEaXZpZGVycyB8fCBmaXJzdCArIGkgPj0gaGVhZGVyQ291bnQpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvb3RlckRpdmlkZXJzIHx8IGZpcnN0ICsgaSA8IGZvb3RlckxpbWl0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBjaGlsZC5nZXRUb3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGRyYXcgZGl2aWRlcnMgbmV4dCB0byBpdGVtcyB0aGF0IGFyZSBub3QgZW5hYmxlZAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXdEaXZpZGVycyAmJiB0b3AgPiBsaXN0VG9wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9wID4gbGlzdFRvcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYXJlQWxsSXRlbXNTZWxlY3RhYmxlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRhcHRlci5pc0VuYWJsZWQoZmlyc3QgKyBpKSAmJiAoaSA9PSBjb3VudCAtIDEgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci5pc0VuYWJsZWQoZmlyc3QgKyBpICsgMSkpKSkpIHsKQEAgLTMxMTgsMTYgKzMwMzEsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwICYmIHNjcm9sbFkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkcmF3T3ZlcnNjcm9sbEZvb3RlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGFic0xpc3RCb3R0b20gPSBtQm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLnRvcCA9IGFic0xpc3RCb3R0b207Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYWJzTGlzdEJvdHRvbSArIHNjcm9sbFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcmF3T3ZlcnNjcm9sbEZvb3RlcihjYW52YXMsIG92ZXJzY3JvbGxGb290ZXIsIGJvdW5kcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHJhd0RpdmlkZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gbGlzdEJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBsaXN0Qm90dG9tICsgZGl2aWRlckhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdEaXZpZGVyKGNhbnZhcywgYm91bmRzLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYm91bmRzLnRvcCA9IGxpc3RCb3R0b207CisgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBsaXN0Qm90dG9tICsgZGl2aWRlckhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgZHJhd0RpdmlkZXIoY2FudmFzLCBib3VuZHMsIC0xKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTMyMzYsNDUgKzMxNDIsNiBAQAogICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQogICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRyYXdhYmxlIHRoYXQgd2lsbCBiZSBkcmF3biBhYm92ZSBhbGwgb3RoZXIgbGlzdCBjb250ZW50LgotICAgICAqIFRoaXMgYXJlYSBjYW4gYmVjb21lIHZpc2libGUgd2hlbiB0aGUgdXNlciBvdmVyc2Nyb2xscyB0aGUgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoZWFkZXIgVGhlIGRyYXdhYmxlIHRvIHVzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJzY3JvbGxIZWFkZXIoRHJhd2FibGUgaGVhZGVyKSB7Ci0gICAgICAgIG1PdmVyc2Nyb2xsSGVhZGVyID0gaGVhZGVyOwotICAgICAgICBpZiAobVNjcm9sbFkgPCAwKSB7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBkcmF3YWJsZSB0aGF0IHdpbGwgYmUgZHJhd24gYWJvdmUgYWxsIG90aGVyIGxpc3QgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBEcmF3YWJsZSBnZXRPdmVyc2Nyb2xsSGVhZGVyKCkgewotICAgICAgICByZXR1cm4gbU92ZXJzY3JvbGxIZWFkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZHJhd2FibGUgdGhhdCB3aWxsIGJlIGRyYXduIGJlbG93IGFsbCBvdGhlciBsaXN0IGNvbnRlbnQuCi0gICAgICogVGhpcyBhcmVhIGNhbiBiZWNvbWUgdmlzaWJsZSB3aGVuIHRoZSB1c2VyIG92ZXJzY3JvbGxzIHRoZSBsaXN0LAotICAgICAqIG9yIHdoZW4gdGhlIGxpc3QncyBjb250ZW50IGRvZXMgbm90IGZ1bGx5IGZpbGwgdGhlIGNvbnRhaW5lciBhcmVhLgotICAgICAqCi0gICAgICogQHBhcmFtIGZvb3RlciBUaGUgZHJhd2FibGUgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcnNjcm9sbEZvb3RlcihEcmF3YWJsZSBmb290ZXIpIHsKLSAgICAgICAgbU92ZXJzY3JvbGxGb290ZXIgPSBmb290ZXI7Ci0gICAgICAgIGludmFsaWRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBkcmF3YWJsZSB0aGF0IHdpbGwgYmUgZHJhd24gYmVsb3cgYWxsIG90aGVyIGxpc3QgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBEcmF3YWJsZSBnZXRPdmVyc2Nyb2xsRm9vdGVyKCkgewotICAgICAgICByZXR1cm4gbU92ZXJzY3JvbGxGb290ZXI7Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25Gb2N1c0NoYW5nZWQoYm9vbGVhbiBnYWluRm9jdXMsIGludCBkaXJlY3Rpb24sIFJlY3QgcHJldmlvdXNseUZvY3VzZWRSZWN0KSB7CiAgICAgICAgIHN1cGVyLm9uRm9jdXNDaGFuZ2VkKGdhaW5Gb2N1cywgZGlyZWN0aW9uLCBwcmV2aW91c2x5Rm9jdXNlZFJlY3QpOwpAQCAtMzQ0NSwxNzcgKzMzMTIsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY3VycmVudCBjaG9pY2UgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q2hvaWNlTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1DaG9pY2VNb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZmluZXMgdGhlIGNob2ljZSBiZWhhdmlvciBmb3IgdGhlIExpc3QuIEJ5IGRlZmF1bHQsIExpc3RzIGRvIG5vdCBoYXZlIGFueSBjaG9pY2UgYmVoYXZpb3IKLSAgICAgKiAoe0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSkuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9LCB0aGUKLSAgICAgKiBMaXN0IGFsbG93cyB1cCB0byBvbmUgaXRlbSB0byAgYmUgaW4gYSBjaG9zZW4gc3RhdGUuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8KLSAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFfSwgdGhlIGxpc3QgYWxsb3dzIGFueSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgY2hvc2VuLgotICAgICAqCi0gICAgICogQHBhcmFtIGNob2ljZU1vZGUgT25lIG9mIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0sIHtAbGluayAjQ0hPSUNFX01PREVfU0lOR0xFfSwgb3IKLSAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENob2ljZU1vZGUoaW50IGNob2ljZU1vZGUpIHsKLSAgICAgICAgbUNob2ljZU1vZGUgPSBjaG9pY2VNb2RlOwotICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSkgewotICAgICAgICAgICAgaWYgKG1DaGVja1N0YXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzID0gbmV3IFNwYXJzZUJvb2xlYW5BcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgPT0gbnVsbCAmJiBtQWRhcHRlciAhPSBudWxsICYmIG1BZGFwdGVyLmhhc1N0YWJsZUlkcygpKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1JdGVtQ2xpY2soVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKLSAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUpIHsKLSAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbHVlID0gIW1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMucHV0KG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbiksIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmRlbGV0ZShtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBuZXdWYWx1ZSA9ICFtQ2hlY2tTdGF0ZXMuZ2V0KHBvc2l0aW9uLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EYXRhQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICByZW1lbWJlclN5bmNTdGF0ZSgpOwotICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlZCB8PSBzdXBlci5wZXJmb3JtSXRlbUNsaWNrKHZpZXcsIHBvc2l0aW9uLCBpZCk7Ci0KLSAgICAgICAgcmV0dXJuIGhhbmRsZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2hlY2tlZCBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiBUaGUgaXMgb25seSB2YWxpZCBpZgotICAgICAqIHRoZSBjaG9pY2UgbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9IG9yCi0gICAgICoge0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBpdGVtIHdob3NlIGNoZWNrZWQgc3RhdGUgaXMgdG8gYmUgY2hlY2tlZAotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IGNoZWNrZWQgc3RhdGUgZm9yIHRoZSBpdGVtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SXRlbUNoZWNrZWQoaW50IHBvc2l0aW9uLCBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEUpIHsKLSAgICAgICAgICAgIG1DaGVja1N0YXRlcy5wdXQocG9zaXRpb24sIHZhbHVlKTsKLSAgICAgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmRlbGV0ZShtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBib29sZWFuIHVwZGF0ZUlkcyA9IG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKTsKLSAgICAgICAgICAgIC8vIENsZWFyIGFsbCB2YWx1ZXMgaWYgd2UncmUgY2hlY2tpbmcgc29tZXRoaW5nLCBvciB1bmNoZWNraW5nIHRoZSBjdXJyZW50bHkKLSAgICAgICAgICAgIC8vIHNlbGVjdGVkIGl0ZW0KLSAgICAgICAgICAgIGlmICh2YWx1ZSB8fCBpc0l0ZW1DaGVja2VkKHBvc2l0aW9uKSkgewotICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIGlmICh1cGRhdGVJZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHRoaXMgbWF5IGVuZCB1cCBzZWxlY3RpbmcgdGhlIHZhbHVlIHdlIGp1c3QgY2xlYXJlZCBidXQgdGhpcyB3YXkKLSAgICAgICAgICAgIC8vIHdlIGVuc3VyZSBsZW5ndGggb2YgbUNoZWNrU3RhdGVzIGlzIDEsIGEgZmFjdCBnZXRDaGVja2VkSXRlbVBvc2l0aW9uIHJlbGllcyBvbgotICAgICAgICAgICAgaWYgKHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzLnB1dChwb3NpdGlvbiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUlkcykgewotICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLnB1dChtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIERvIG5vdCBnZW5lcmF0ZSBhIGRhdGEgY2hhbmdlIHdoaWxlIHdlIGFyZSBpbiB0aGUgbGF5b3V0IHBoYXNlCi0gICAgICAgIGlmICghbUluTGF5b3V0ICYmICFtQmxvY2tMYXlvdXRSZXF1ZXN0cykgewotICAgICAgICAgICAgbURhdGFDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJlbWVtYmVyU3luY1N0YXRlKCk7Ci0gICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIFRoZSByZXN1bHQgaXMgb25seQotICAgICAqIHZhbGlkIGlmIHRoZSBjaG9pY2UgbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9Ci0gICAgICogb3Ige0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIGl0ZW0gd2hvc2UgY2hlY2tlZCBzdGF0ZSB0byByZXR1cm4KLSAgICAgKiBAcmV0dXJuIFRoZSBpdGVtJ3MgY2hlY2tlZCBzdGF0ZSBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgY2hvaWNlIG1vZGUKLSAgICAgKiAgICAgICAgIGlzIGludmFsaWQKLSAgICAgKgotICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSXRlbUNoZWNrZWQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FICYmIG1DaGVja1N0YXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IGNoZWNrZWQgaXRlbS4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZSBjaG9pY2UKLSAgICAgKiBtb2RlIGhhcyBiZWVuIHNldCB0byB7QGxpbmsgI0NIT0lDRV9NT0RFX1NJTkdMRX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudGx5IGNoZWNrZWQgaXRlbSBvcgotICAgICAqICAgICAgICAge0BsaW5rICNJTlZBTElEX1BPU0lUSU9OfSBpZiBub3RoaW5nIGlzIHNlbGVjdGVkCi0gICAgICoKLSAgICAgKiBAc2VlICNzZXRDaG9pY2VNb2RlKGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENoZWNrZWRJdGVtUG9zaXRpb24oKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9TSU5HTEUgJiYgbUNoZWNrU3RhdGVzICE9IG51bGwgJiYgbUNoZWNrU3RhdGVzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzLmtleUF0KDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIElOVkFMSURfUE9TSVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGNoZWNrZWQgaXRlbXMgaW4gdGhlIGxpc3QuIFRoZSByZXN1bHQgaXMgb25seSB2YWxpZCBpZgotICAgICAqIHRoZSBjaG9pY2UgbW9kZSBoYXMgbm90IGJlZW4gc2V0IHRvIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICBBIFNwYXJzZUJvb2xlYW5BcnJheSB3aGljaCB3aWxsIHJldHVybiB0cnVlIGZvciBlYWNoIGNhbGwgdG8KLSAgICAgKiAgICAgICAgICBnZXQoaW50IHBvc2l0aW9uKSB3aGVyZSBwb3NpdGlvbiBpcyBhIHBvc2l0aW9uIGluIHRoZSBsaXN0LAotICAgICAqICAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjaG9pY2UgbW9kZSBpcyBzZXQgdG8KLSAgICAgKiAgICAgICAgICB7QGxpbmsgI0NIT0lDRV9NT0RFX05PTkV9LgotICAgICAqLwotICAgIHB1YmxpYyBTcGFyc2VCb29sZWFuQXJyYXkgZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbnMoKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBjaGVja2VkIGl0ZW1zIGlkcy4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZQogICAgICAqIGNob2ljZSBtb2RlIGhhcyBub3QgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfS4KICAgICAgKiAKQEAgLTM2MjQsNiArMzMyMCw3IEBACiAgICAgICogICAgICAgICAKICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRDaGVja2VkSXRlbUlkcygpfSBpbnN0ZWFkLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGxvbmdbXSBnZXRDaGVja0l0ZW1JZHMoKSB7CiAgICAgICAgIC8vIFVzZSBuZXcgYmVoYXZpb3IgdGhhdCBjb3JyZWN0bHkgaGFuZGxlcyBzdGFibGUgSUQgbWFwcGluZy4KICAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKQEAgLTM2NTgsMTE1ICszMzU1LDQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbmV3IGxvbmdbMF07CiAgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBjaGVja2VkIGl0ZW1zIGlkcy4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZQotICAgICAqIGNob2ljZSBtb2RlIGhhcyBub3QgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSBhbmQgdGhlIGFkYXB0ZXIKLSAgICAgKiBoYXMgc3RhYmxlIElEcy4gKHtAbGluayBMaXN0QWRhcHRlciNoYXNTdGFibGVJZHMoKX0gPT0ge0Bjb2RlIHRydWV9KQotICAgICAqIAotICAgICAqIEByZXR1cm4gQSBuZXcgYXJyYXkgd2hpY2ggY29udGFpbnMgdGhlIGlkIG9mIGVhY2ggY2hlY2tlZCBpdGVtIGluIHRoZQotICAgICAqICAgICAgICAgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZ1tdIGdldENoZWNrZWRJdGVtSWRzKCkgewotICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTk9ORSB8fCBtQ2hlY2tlZElkU3RhdGVzID09IG51bGwgfHwgbUFkYXB0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBsb25nWzBdOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4gaWRTdGF0ZXMgPSBtQ2hlY2tlZElkU3RhdGVzOwotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBpZFN0YXRlcy5zaXplKCk7Ci0gICAgICAgIGZpbmFsIGxvbmdbXSBpZHMgPSBuZXcgbG9uZ1tjb3VudF07Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGlkc1tpXSA9IGlkU3RhdGVzLmtleUF0KGkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaWRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFyIGFueSBjaG9pY2VzIHByZXZpb3VzbHkgc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJDaG9pY2VzKCkgewotICAgICAgICBpZiAobUNoZWNrU3RhdGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBTYXZlZFN0YXRlIGV4dGVuZHMgQmFzZVNhdmVkU3RhdGUgewotICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgY2hlY2tTdGF0ZTsKLSAgICAgICAgTG9uZ1NwYXJzZUFycmF5PEJvb2xlYW4+IGNoZWNrSWRTdGF0ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGZyb20ge0BsaW5rIExpc3RWaWV3I29uU2F2ZUluc3RhbmNlU3RhdGUoKX0KLSAgICAgICAgICovCi0gICAgICAgIFNhdmVkU3RhdGUoUGFyY2VsYWJsZSBzdXBlclN0YXRlLCBTcGFyc2VCb29sZWFuQXJyYXkgY2hlY2tTdGF0ZSwKLSAgICAgICAgICAgICAgICBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4gY2hlY2tJZFN0YXRlKSB7Ci0gICAgICAgICAgICBzdXBlcihzdXBlclN0YXRlKTsKLSAgICAgICAgICAgIHRoaXMuY2hlY2tTdGF0ZSA9IGNoZWNrU3RhdGU7Ci0gICAgICAgICAgICB0aGlzLmNoZWNrSWRTdGF0ZSA9IGNoZWNrSWRTdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RvciBjYWxsZWQgZnJvbSB7QGxpbmsgI0NSRUFUT1J9Ci0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFNhdmVkU3RhdGUoUGFyY2VsIGluKSB7Ci0gICAgICAgICAgICBzdXBlcihpbik7Ci0gICAgICAgICAgICBjaGVja1N0YXRlID0gaW4ucmVhZFNwYXJzZUJvb2xlYW5BcnJheSgpOwotICAgICAgICAgICAgbG9uZ1tdIGlkU3RhdGUgPSBpbi5jcmVhdGVMb25nQXJyYXkoKTsKLQotICAgICAgICAgICAgaWYgKGlkU3RhdGUubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGNoZWNrSWRTdGF0ZSA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKLSAgICAgICAgICAgICAgICBjaGVja0lkU3RhdGUuc2V0VmFsdWVzKGlkU3RhdGUsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgICAgIHN1cGVyLndyaXRlVG9QYXJjZWwob3V0LCBmbGFncyk7Ci0gICAgICAgICAgICBvdXQud3JpdGVTcGFyc2VCb29sZWFuQXJyYXkoY2hlY2tTdGF0ZSk7Ci0gICAgICAgICAgICBvdXQud3JpdGVMb25nQXJyYXkoY2hlY2tJZFN0YXRlICE9IG51bGwgPyBjaGVja0lkU3RhdGUuZ2V0S2V5cygpIDogbmV3IGxvbmdbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkxpc3RWaWV3LlNhdmVkU3RhdGV7IgotICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykpCi0gICAgICAgICAgICAgICAgICAgICsgIiBjaGVja1N0YXRlPSIgKyBjaGVja1N0YXRlICsgIn0iOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUgotICAgICAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKGluKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZVtzaXplXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUGFyY2VsYWJsZSBvblNhdmVJbnN0YW5jZVN0YXRlKCkgewotICAgICAgICBQYXJjZWxhYmxlIHN1cGVyU3RhdGUgPSBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKCk7Ci0gICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZShzdXBlclN0YXRlLCBtQ2hlY2tTdGF0ZXMsIG1DaGVja2VkSWRTdGF0ZXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoUGFyY2VsYWJsZSBzdGF0ZSkgewotICAgICAgICBTYXZlZFN0YXRlIHNzID0gKFNhdmVkU3RhdGUpIHN0YXRlOwotCi0gICAgICAgIHN1cGVyLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUoc3MuZ2V0U3VwZXJTdGF0ZSgpKTsKLQotICAgICAgICBpZiAoc3MuY2hlY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgIG1DaGVja1N0YXRlcyA9IHNzLmNoZWNrU3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3MuY2hlY2tJZFN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMgPSBzcy5jaGVja0lkU3RhdGU7Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvT3ZlclNjcm9sbGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvT3ZlclNjcm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOTAwYTAuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L092ZXJTY3JvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5GbG9hdE1hdGg7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgc2Nyb2xsaW5nIHdpdGggdGhlIGFiaWxpdHkgdG8gb3ZlcnNob290IHRoZSBib3VuZHMKLSAqIG9mIGEgc2Nyb2xsaW5nIG9wZXJhdGlvbi4gVGhpcyBjbGFzcyBpcyBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yCi0gKiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuU2Nyb2xsZXJ9IGluIG1vc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBPdmVyU2Nyb2xsZXIgewotICAgIHByaXZhdGUgaW50IG1Nb2RlOwotCi0gICAgcHJpdmF0ZSBNYWduZXRpY092ZXJTY3JvbGxlciBtU2Nyb2xsZXJYOwotICAgIHByaXZhdGUgTWFnbmV0aWNPdmVyU2Nyb2xsZXIgbVNjcm9sbGVyWTsKLQotICAgIHByaXZhdGUgZmluYWwgSW50ZXJwb2xhdG9yIG1JbnRlcnBvbGF0b3I7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9EVVJBVElPTiA9IDI1MDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX01PREUgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTElOR19NT0RFID0gMTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gT3ZlclNjcm9sbGVyIHdpdGggYSB2aXNjb3VzIGZsdWlkIHNjcm9sbCBpbnRlcnBvbGF0b3IuCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgT3ZlclNjcm9sbGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gT3ZlclNjcm9sbGVyIHdpdGggZGVmYXVsdCBlZGdlIGJvdW5jZSBjb2VmZmljaWVudHMuCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhpcyBhcHBsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gaW50ZXJwb2xhdG9yIFRoZSBzY3JvbGwgaW50ZXJwb2xhdG9yLiBJZiBudWxsLCBhIGRlZmF1bHQgKHZpc2NvdXMpIGludGVycG9sYXRvciB3aWxsCi0gICAgICogYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3ZlclNjcm9sbGVyKENvbnRleHQgY29udGV4dCwgSW50ZXJwb2xhdG9yIGludGVycG9sYXRvcikgewotICAgICAgICB0aGlzKGNvbnRleHQsIGludGVycG9sYXRvciwgTWFnbmV0aWNPdmVyU2Nyb2xsZXIuREVGQVVMVF9CT1VOQ0VfQ09FRkZJQ0lFTlQsCi0gICAgICAgICAgICAgICAgTWFnbmV0aWNPdmVyU2Nyb2xsZXIuREVGQVVMVF9CT1VOQ0VfQ09FRkZJQ0lFTlQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gT3ZlclNjcm9sbGVyLgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoaXMgYXBwbGljYXRpb24uCi0gICAgICogQHBhcmFtIGludGVycG9sYXRvciBUaGUgc2Nyb2xsIGludGVycG9sYXRvci4gSWYgbnVsbCwgYSBkZWZhdWx0ICh2aXNjb3VzKSBpbnRlcnBvbGF0b3Igd2lsbAotICAgICAqIGJlIHVzZWQuCi0gICAgICogQHBhcmFtIGJvdW5jZUNvZWZmaWNpZW50WCBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMSB0aGF0IHdpbGwgZGV0ZXJtaW5lIHRoZSBwcm9wb3J0aW9uIG9mIHRoZQotICAgICAqIHZlbG9jaXR5IHdoaWNoIGlzIHByZXNlcnZlZCBpbiB0aGUgYm91bmNlIHdoZW4gdGhlIGhvcml6b250YWwgZWRnZSBpcyByZWFjaGVkLiBBIG51bGwgdmFsdWUKLSAgICAgKiBtZWFucyBubyBib3VuY2UuCi0gICAgICogQHBhcmFtIGJvdW5jZUNvZWZmaWNpZW50WSBTYW1lIGFzIGJvdW5jZUNvZWZmaWNpZW50WCBidXQgZm9yIHRoZSB2ZXJ0aWNhbCBkaXJlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIE92ZXJTY3JvbGxlcihDb250ZXh0IGNvbnRleHQsIEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IsCi0gICAgICAgICAgICBmbG9hdCBib3VuY2VDb2VmZmljaWVudFgsIGZsb2F0IGJvdW5jZUNvZWZmaWNpZW50WSkgewotICAgICAgICBtSW50ZXJwb2xhdG9yID0gaW50ZXJwb2xhdG9yOwotICAgICAgICBtU2Nyb2xsZXJYID0gbmV3IE1hZ25ldGljT3ZlclNjcm9sbGVyKCk7Ci0gICAgICAgIG1TY3JvbGxlclkgPSBuZXcgTWFnbmV0aWNPdmVyU2Nyb2xsZXIoKTsKLSAgICAgICAgTWFnbmV0aWNPdmVyU2Nyb2xsZXIuaW5pdGlhbGl6ZUZyb21Db250ZXh0KGNvbnRleHQpOwotCi0gICAgICAgIG1TY3JvbGxlclguc2V0Qm91bmNlQ29lZmZpY2llbnQoYm91bmNlQ29lZmZpY2llbnRYKTsKLSAgICAgICAgbVNjcm9sbGVyWS5zZXRCb3VuY2VDb2VmZmljaWVudChib3VuY2VDb2VmZmljaWVudFkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzY3JvbGxlciBoYXMgZmluaXNoZWQgc2Nyb2xsaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzY3JvbGxlciBoYXMgZmluaXNoZWQgc2Nyb2xsaW5nLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclgubUZpbmlzaGVkICYmIG1TY3JvbGxlclkubUZpbmlzaGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcmNlIHRoZSBmaW5pc2hlZCBmaWVsZCB0byBhIHBhcnRpY3VsYXIgdmFsdWUuIENvbnRyYXJ5IHRvCi0gICAgICoge0BsaW5rICNhYm9ydEFuaW1hdGlvbigpfSwgZm9yY2luZyB0aGUgYW5pbWF0aW9uIHRvIGZpbmlzaGVkCi0gICAgICogZG9lcyBOT1QgY2F1c2UgdGhlIHNjcm9sbGVyIHRvIG1vdmUgdG8gdGhlIGZpbmFsIHggYW5kIHkKLSAgICAgKiBwb3NpdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaW5pc2hlZCBUaGUgbmV3IGZpbmlzaGVkIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGZvcmNlRmluaXNoZWQoYm9vbGVhbiBmaW5pc2hlZCkgewotICAgICAgICBtU2Nyb2xsZXJYLm1GaW5pc2hlZCA9IG1TY3JvbGxlclkubUZpbmlzaGVkID0gZmluaXNoZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBYIG9mZnNldCBpbiB0aGUgc2Nyb2xsLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbmV3IFggb2Zmc2V0IGFzIGFuIGFic29sdXRlIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEN1cnJYKCkgewotICAgICAgICByZXR1cm4gbVNjcm9sbGVyWC5tQ3VycmVudFBvc2l0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgWSBvZmZzZXQgaW4gdGhlIHNjcm9sbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBZIG9mZnNldCBhcyBhbiBhYnNvbHV0ZSBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRDdXJyWSgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclkubUN1cnJlbnRQb3NpdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmVsb2NpdHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBvcmlnaW5hbCB2ZWxvY2l0eSBsZXNzIHRoZSBkZWNlbGVyYXRpb24sIG5vcm0gb2YgdGhlIFggYW5kIFkgdmVsb2NpdHkgdmVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBmbG9hdCBnZXRDdXJyVmVsb2NpdHkoKSB7Ci0gICAgICAgIGZsb2F0IHNxdWFyZWROb3JtID0gbVNjcm9sbGVyWC5tQ3VyclZlbG9jaXR5ICogbVNjcm9sbGVyWC5tQ3VyclZlbG9jaXR5OwotICAgICAgICBzcXVhcmVkTm9ybSArPSBtU2Nyb2xsZXJZLm1DdXJyVmVsb2NpdHkgKiBtU2Nyb2xsZXJZLm1DdXJyVmVsb2NpdHk7Ci0gICAgICAgIHJldHVybiBGbG9hdE1hdGguc3FydChzcXVhcmVkTm9ybSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RhcnQgWCBvZmZzZXQgaW4gdGhlIHNjcm9sbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHN0YXJ0IFggb2Zmc2V0IGFzIGFuIGFic29sdXRlIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFN0YXJ0WCgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclgubVN0YXJ0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0YXJ0IFkgb2Zmc2V0IGluIHRoZSBzY3JvbGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGFydCBZIG9mZnNldCBhcyBhbiBhYnNvbHV0ZSBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRTdGFydFkoKSB7Ci0gICAgICAgIHJldHVybiBtU2Nyb2xsZXJZLm1TdGFydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXJlIHRoZSBzY3JvbGwgd2lsbCBlbmQuIFZhbGlkIG9ubHkgZm9yICJmbGluZyIgc2Nyb2xscy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGZpbmFsIFggb2Zmc2V0IGFzIGFuIGFic29sdXRlIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEZpbmFsWCgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclgubUZpbmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hlcmUgdGhlIHNjcm9sbCB3aWxsIGVuZC4gVmFsaWQgb25seSBmb3IgImZsaW5nIiBzY3JvbGxzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZmluYWwgWSBvZmZzZXQgYXMgYW4gYWJzb2x1dGUgZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RmluYWxZKCkgewotICAgICAgICByZXR1cm4gbVNjcm9sbGVyWS5tRmluYWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBob3cgbG9uZyB0aGUgc2Nyb2xsIGV2ZW50IHdpbGwgdGFrZSwgaW4gbWlsbGlzZWNvbmRzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZHVyYXRpb24gb2YgdGhlIHNjcm9sbCBpbiBtaWxsaXNlY29uZHMuCi0gICAgICoKLSAgICAgKiBAaGlkZSBQZW5kaW5nIHJlbW92YWwgb25jZSBub3RoaW5nIGRlcGVuZHMgb24gaXQKLSAgICAgKiBAZGVwcmVjYXRlZCBPdmVyU2Nyb2xsZXJzIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgYSBmaXhlZCBkdXJhdGlvbi4KLSAgICAgKiAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgbGllIHRvIHRoZSBiZXN0IG9mIGl0cyBhYmlsaXR5LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RHVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBNYXRoLm1heChtU2Nyb2xsZXJYLm1EdXJhdGlvbiwgbVNjcm9sbGVyWS5tRHVyYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4dGVuZCB0aGUgc2Nyb2xsIGFuaW1hdGlvbi4gVGhpcyBhbGxvd3MgYSBydW5uaW5nIGFuaW1hdGlvbiB0byBzY3JvbGwKLSAgICAgKiBmdXJ0aGVyIGFuZCBsb25nZXIsIHdoZW4gdXNlZCB3aXRoIHtAbGluayAjc2V0RmluYWxYKGludCl9IG9yIHtAbGluayAjc2V0RmluYWxZKGludCl9LgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dGVuZCBBZGRpdGlvbmFsIHRpbWUgdG8gc2Nyb2xsIGluIG1pbGxpc2Vjb25kcy4KLSAgICAgKiBAc2VlICNzZXRGaW5hbFgoaW50KQotICAgICAqIEBzZWUgI3NldEZpbmFsWShpbnQpCi0gICAgICoKLSAgICAgKiBAaGlkZSBQZW5kaW5nIHJlbW92YWwgb25jZSBub3RoaW5nIGRlcGVuZHMgb24gaXQKLSAgICAgKiBAZGVwcmVjYXRlZCBPdmVyU2Nyb2xsZXJzIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgYSBmaXhlZCBkdXJhdGlvbi4KLSAgICAgKiAgICAgICAgICAgICBJbnN0ZWFkIG9mIHNldHRpbmcgYSBuZXcgZmluYWwgcG9zaXRpb24gYW5kIGV4dGVuZGluZwotICAgICAqICAgICAgICAgICAgIHRoZSBkdXJhdGlvbiBvZiBhbiBleGlzdGluZyBzY3JvbGwsIHVzZSBzdGFydFNjcm9sbAotICAgICAqICAgICAgICAgICAgIHRvIGJlZ2luIGEgbmV3IGFuaW1hdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleHRlbmREdXJhdGlvbihpbnQgZXh0ZW5kKSB7Ci0gICAgICAgIG1TY3JvbGxlclguZXh0ZW5kRHVyYXRpb24oZXh0ZW5kKTsKLSAgICAgICAgbVNjcm9sbGVyWS5leHRlbmREdXJhdGlvbihleHRlbmQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZpbmFsIHBvc2l0aW9uIChYKSBmb3IgdGhpcyBzY3JvbGxlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXdYIFRoZSBuZXcgWCBvZmZzZXQgYXMgYW4gYWJzb2x1dGUgZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luLgotICAgICAqIEBzZWUgI2V4dGVuZER1cmF0aW9uKGludCkKLSAgICAgKiBAc2VlICNzZXRGaW5hbFkoaW50KQotICAgICAqCi0gICAgICogQGhpZGUgUGVuZGluZyByZW1vdmFsIG9uY2Ugbm90aGluZyBkZXBlbmRzIG9uIGl0Ci0gICAgICogQGRlcHJlY2F0ZWQgT3ZlclNjcm9sbGVyJ3MgZmluYWwgcG9zaXRpb24gbWF5IGNoYW5nZSBkdXJpbmcgYW4gYW5pbWF0aW9uLgotICAgICAqICAgICAgICAgICAgIEluc3RlYWQgb2Ygc2V0dGluZyBhIG5ldyBmaW5hbCBwb3NpdGlvbiBhbmQgZXh0ZW5kaW5nCi0gICAgICogICAgICAgICAgICAgdGhlIGR1cmF0aW9uIG9mIGFuIGV4aXN0aW5nIHNjcm9sbCwgdXNlIHN0YXJ0U2Nyb2xsCi0gICAgICogICAgICAgICAgICAgdG8gYmVnaW4gYSBuZXcgYW5pbWF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbmFsWChpbnQgbmV3WCkgewotICAgICAgICBtU2Nyb2xsZXJYLnNldEZpbmFsUG9zaXRpb24obmV3WCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmluYWwgcG9zaXRpb24gKFkpIGZvciB0aGlzIHNjcm9sbGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIG5ld1kgVGhlIG5ldyBZIG9mZnNldCBhcyBhbiBhYnNvbHV0ZSBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4uCi0gICAgICogQHNlZSAjZXh0ZW5kRHVyYXRpb24oaW50KQotICAgICAqIEBzZWUgI3NldEZpbmFsWChpbnQpCi0gICAgICoKLSAgICAgKiBAaGlkZSBQZW5kaW5nIHJlbW92YWwgb25jZSBub3RoaW5nIGRlcGVuZHMgb24gaXQKLSAgICAgKiBAZGVwcmVjYXRlZCBPdmVyU2Nyb2xsZXIncyBmaW5hbCBwb3NpdGlvbiBtYXkgY2hhbmdlIGR1cmluZyBhbiBhbmltYXRpb24uCi0gICAgICogICAgICAgICAgICAgSW5zdGVhZCBvZiBzZXR0aW5nIGEgbmV3IGZpbmFsIHBvc2l0aW9uIGFuZCBleHRlbmRpbmcKLSAgICAgKiAgICAgICAgICAgICB0aGUgZHVyYXRpb24gb2YgYW4gZXhpc3Rpbmcgc2Nyb2xsLCB1c2Ugc3RhcnRTY3JvbGwKLSAgICAgKiAgICAgICAgICAgICB0byBiZWdpbiBhIG5ldyBhbmltYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxZKGludCBuZXdZKSB7Ci0gICAgICAgIG1TY3JvbGxlclkuc2V0RmluYWxQb3NpdGlvbihuZXdZKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsIHRoaXMgd2hlbiB5b3Ugd2FudCB0byBrbm93IHRoZSBuZXcgbG9jYXRpb24uIElmIGl0IHJldHVybnMgdHJ1ZSwgdGhlCi0gICAgICogYW5pbWF0aW9uIGlzIG5vdCB5ZXQgZmluaXNoZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29tcHV0ZVNjcm9sbE9mZnNldCgpIHsKLSAgICAgICAgaWYgKGlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChtTW9kZSkgewotICAgICAgICAgICAgY2FzZSBTQ1JPTExfTU9ERToKLSAgICAgICAgICAgICAgICBsb25nIHRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIC8vIEFueSBzY3JvbGxlciBjYW4gYmUgdXNlZCBmb3IgdGltZSwgc2luY2UgdGhleSB3ZXJlIHN0YXJ0ZWQKLSAgICAgICAgICAgICAgICAvLyB0b2dldGhlciBpbiBzY3JvbGwgbW9kZS4gV2UgdXNlIFggaGVyZS4KLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGVsYXBzZWRUaW1lID0gdGltZSAtIG1TY3JvbGxlclgubVN0YXJ0VGltZTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBkdXJhdGlvbiA9IG1TY3JvbGxlclgubUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIGlmIChlbGFwc2VkVGltZSA8IGR1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IHEgPSAoZmxvYXQpIChlbGFwc2VkVGltZSkgLyBkdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobUludGVycG9sYXRvciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcSA9IFNjcm9sbGVyLnZpc2NvdXNGbHVpZChxKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcSA9IG1JbnRlcnBvbGF0b3IuZ2V0SW50ZXJwb2xhdGlvbihxKTsKLQotICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsZXJYLnVwZGF0ZVNjcm9sbChxKTsKLSAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyWS51cGRhdGVTY3JvbGwocSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWJvcnRBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRkxJTkdfTU9ERToKLSAgICAgICAgICAgICAgICBpZiAoIW1TY3JvbGxlclgubUZpbmlzaGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVNjcm9sbGVyWC51cGRhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtU2Nyb2xsZXJYLmNvbnRpbnVlV2hlbkZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsZXJYLmZpbmlzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFtU2Nyb2xsZXJZLm1GaW5pc2hlZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIW1TY3JvbGxlclkudXBkYXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVNjcm9sbGVyWS5jb250aW51ZVdoZW5GaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyWS5maW5pc2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgc2Nyb2xsaW5nIGJ5IHByb3ZpZGluZyBhIHN0YXJ0aW5nIHBvaW50IGFuZCB0aGUgZGlzdGFuY2UgdG8gdHJhdmVsLgotICAgICAqIFRoZSBzY3JvbGwgd2lsbCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgMjUwIG1pbGxpc2Vjb25kcyBmb3IgdGhlCi0gICAgICogZHVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRYIFN0YXJ0aW5nIGhvcml6b250YWwgc2Nyb2xsIG9mZnNldCBpbiBwaXhlbHMuIFBvc2l0aXZlCi0gICAgICogICAgICAgIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIHN0YXJ0WSBTdGFydGluZyB2ZXJ0aWNhbCBzY3JvbGwgb2Zmc2V0IGluIHBpeGVscy4gUG9zaXRpdmUgbnVtYmVycwotICAgICAqICAgICAgICB3aWxsIHNjcm9sbCB0aGUgY29udGVudCB1cC4KLSAgICAgKiBAcGFyYW0gZHggSG9yaXpvbnRhbCBkaXN0YW5jZSB0byB0cmF2ZWwuIFBvc2l0aXZlIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlCi0gICAgICogICAgICAgIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIGR5IFZlcnRpY2FsIGRpc3RhbmNlIHRvIHRyYXZlbC4gUG9zaXRpdmUgbnVtYmVycyB3aWxsIHNjcm9sbCB0aGUKLSAgICAgKiAgICAgICAgY29udGVudCB1cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFNjcm9sbChpbnQgc3RhcnRYLCBpbnQgc3RhcnRZLCBpbnQgZHgsIGludCBkeSkgewotICAgICAgICBzdGFydFNjcm9sbChzdGFydFgsIHN0YXJ0WSwgZHgsIGR5LCBERUZBVUxUX0RVUkFUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBzY3JvbGxpbmcgYnkgcHJvdmlkaW5nIGEgc3RhcnRpbmcgcG9pbnQgYW5kIHRoZSBkaXN0YW5jZSB0byB0cmF2ZWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRYIFN0YXJ0aW5nIGhvcml6b250YWwgc2Nyb2xsIG9mZnNldCBpbiBwaXhlbHMuIFBvc2l0aXZlCi0gICAgICogICAgICAgIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIHN0YXJ0WSBTdGFydGluZyB2ZXJ0aWNhbCBzY3JvbGwgb2Zmc2V0IGluIHBpeGVscy4gUG9zaXRpdmUgbnVtYmVycwotICAgICAqICAgICAgICB3aWxsIHNjcm9sbCB0aGUgY29udGVudCB1cC4KLSAgICAgKiBAcGFyYW0gZHggSG9yaXpvbnRhbCBkaXN0YW5jZSB0byB0cmF2ZWwuIFBvc2l0aXZlIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlCi0gICAgICogICAgICAgIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIGR5IFZlcnRpY2FsIGRpc3RhbmNlIHRvIHRyYXZlbC4gUG9zaXRpdmUgbnVtYmVycyB3aWxsIHNjcm9sbCB0aGUKLSAgICAgKiAgICAgICAgY29udGVudCB1cC4KLSAgICAgKiBAcGFyYW0gZHVyYXRpb24gRHVyYXRpb24gb2YgdGhlIHNjcm9sbCBpbiBtaWxsaXNlY29uZHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRTY3JvbGwoaW50IHN0YXJ0WCwgaW50IHN0YXJ0WSwgaW50IGR4LCBpbnQgZHksIGludCBkdXJhdGlvbikgewotICAgICAgICBtTW9kZSA9IFNDUk9MTF9NT0RFOwotICAgICAgICBtU2Nyb2xsZXJYLnN0YXJ0U2Nyb2xsKHN0YXJ0WCwgZHgsIGR1cmF0aW9uKTsKLSAgICAgICAgbVNjcm9sbGVyWS5zdGFydFNjcm9sbChzdGFydFksIGR5LCBkdXJhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbCB0aGlzIHdoZW4geW91IHdhbnQgdG8gJ3NwcmluZyBiYWNrJyBpbnRvIGEgdmFsaWQgY29vcmRpbmF0ZSByYW5nZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGFydFggU3RhcnRpbmcgWCBjb29yZGluYXRlCi0gICAgICogQHBhcmFtIHN0YXJ0WSBTdGFydGluZyBZIGNvb3JkaW5hdGUKLSAgICAgKiBAcGFyYW0gbWluWCBNaW5pbXVtIHZhbGlkIFggdmFsdWUKLSAgICAgKiBAcGFyYW0gbWF4WCBNYXhpbXVtIHZhbGlkIFggdmFsdWUKLSAgICAgKiBAcGFyYW0gbWluWSBNaW5pbXVtIHZhbGlkIFkgdmFsdWUKLSAgICAgKiBAcGFyYW0gbWF4WSBNaW5pbXVtIHZhbGlkIFkgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBzcHJpbmdiYWNrIHdhcyBpbml0aWF0ZWQsIGZhbHNlIGlmIHN0YXJ0WCBhbmQgc3RhcnRZIHdlcmUKLSAgICAgKiAgICAgICAgICBhbHJlYWR5IHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3ByaW5nYmFjayhpbnQgc3RhcnRYLCBpbnQgc3RhcnRZLCBpbnQgbWluWCwgaW50IG1heFgsIGludCBtaW5ZLCBpbnQgbWF4WSkgewotICAgICAgICBtTW9kZSA9IEZMSU5HX01PREU7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIGJvdGggbWV0aG9kcyBhcmUgY2FsbGVkLgotICAgICAgICBmaW5hbCBib29sZWFuIHNwaW5nYmFja1ggPSBtU2Nyb2xsZXJYLnNwcmluZ2JhY2soc3RhcnRYLCBtaW5YLCBtYXhYKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBzcGluZ2JhY2tZID0gbVNjcm9sbGVyWS5zcHJpbmdiYWNrKHN0YXJ0WSwgbWluWSwgbWF4WSk7Ci0gICAgICAgIHJldHVybiBzcGluZ2JhY2tYIHx8IHNwaW5nYmFja1k7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmxpbmcoaW50IHN0YXJ0WCwgaW50IHN0YXJ0WSwgaW50IHZlbG9jaXR5WCwgaW50IHZlbG9jaXR5WSwKLSAgICAgICAgICAgIGludCBtaW5YLCBpbnQgbWF4WCwgaW50IG1pblksIGludCBtYXhZKSB7Ci0gICAgICAgIGZsaW5nKHN0YXJ0WCwgc3RhcnRZLCB2ZWxvY2l0eVgsIHZlbG9jaXR5WSwgbWluWCwgbWF4WCwgbWluWSwgbWF4WSwgMCwgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgc2Nyb2xsaW5nIGJhc2VkIG9uIGEgZmxpbmcgZ2VzdHVyZS4gVGhlIGRpc3RhbmNlIHRyYXZlbGVkIHdpbGwKLSAgICAgKiBkZXBlbmQgb24gdGhlIGluaXRpYWwgdmVsb2NpdHkgb2YgdGhlIGZsaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXJ0WCBTdGFydGluZyBwb2ludCBvZiB0aGUgc2Nyb2xsIChYKQotICAgICAqIEBwYXJhbSBzdGFydFkgU3RhcnRpbmcgcG9pbnQgb2YgdGhlIHNjcm9sbCAoWSkKLSAgICAgKiBAcGFyYW0gdmVsb2NpdHlYIEluaXRpYWwgdmVsb2NpdHkgb2YgdGhlIGZsaW5nIChYKSBtZWFzdXJlZCBpbiBwaXhlbHMgcGVyCi0gICAgICogICAgICAgICAgICBzZWNvbmQuCi0gICAgICogQHBhcmFtIHZlbG9jaXR5WSBJbml0aWFsIHZlbG9jaXR5IG9mIHRoZSBmbGluZyAoWSkgbWVhc3VyZWQgaW4gcGl4ZWxzIHBlcgotICAgICAqICAgICAgICAgICAgc2Vjb25kCi0gICAgICogQHBhcmFtIG1pblggTWluaW11bSBYIHZhbHVlLiBUaGUgc2Nyb2xsZXIgd2lsbCBub3Qgc2Nyb2xsIHBhc3QgdGhpcyBwb2ludAotICAgICAqICAgICAgICAgICAgdW5sZXNzIG92ZXJYID4gMC4gSWYgb3ZlcmZsaW5nIGlzIGFsbG93ZWQsIGl0IHdpbGwgdXNlIG1pblggYXMKLSAgICAgKiAgICAgICAgICAgIGEgc3ByaW5nYmFjayBib3VuZGFyeS4KLSAgICAgKiBAcGFyYW0gbWF4WCBNYXhpbXVtIFggdmFsdWUuIFRoZSBzY3JvbGxlciB3aWxsIG5vdCBzY3JvbGwgcGFzdCB0aGlzIHBvaW50Ci0gICAgICogICAgICAgICAgICB1bmxlc3Mgb3ZlclggPiAwLiBJZiBvdmVyZmxpbmcgaXMgYWxsb3dlZCwgaXQgd2lsbCB1c2UgbWF4WCBhcwotICAgICAqICAgICAgICAgICAgYSBzcHJpbmdiYWNrIGJvdW5kYXJ5LgotICAgICAqIEBwYXJhbSBtaW5ZIE1pbmltdW0gWSB2YWx1ZS4gVGhlIHNjcm9sbGVyIHdpbGwgbm90IHNjcm9sbCBwYXN0IHRoaXMgcG9pbnQKLSAgICAgKiAgICAgICAgICAgIHVubGVzcyBvdmVyWSA+IDAuIElmIG92ZXJmbGluZyBpcyBhbGxvd2VkLCBpdCB3aWxsIHVzZSBtaW5ZIGFzCi0gICAgICogICAgICAgICAgICBhIHNwcmluZ2JhY2sgYm91bmRhcnkuCi0gICAgICogQHBhcmFtIG1heFkgTWF4aW11bSBZIHZhbHVlLiBUaGUgc2Nyb2xsZXIgd2lsbCBub3Qgc2Nyb2xsIHBhc3QgdGhpcyBwb2ludAotICAgICAqICAgICAgICAgICAgdW5sZXNzIG92ZXJZID4gMC4gSWYgb3ZlcmZsaW5nIGlzIGFsbG93ZWQsIGl0IHdpbGwgdXNlIG1heFkgYXMKLSAgICAgKiAgICAgICAgICAgIGEgc3ByaW5nYmFjayBib3VuZGFyeS4KLSAgICAgKiBAcGFyYW0gb3ZlclggT3ZlcmZsaW5nIHJhbmdlLiBJZiA+IDAsIGhvcml6b250YWwgb3ZlcmZsaW5nIGluIGVpdGhlcgotICAgICAqICAgICAgICAgICAgZGlyZWN0aW9uIHdpbGwgYmUgcG9zc2libGUuCi0gICAgICogQHBhcmFtIG92ZXJZIE92ZXJmbGluZyByYW5nZS4gSWYgPiAwLCB2ZXJ0aWNhbCBvdmVyZmxpbmcgaW4gZWl0aGVyCi0gICAgICogICAgICAgICAgICBkaXJlY3Rpb24gd2lsbCBiZSBwb3NzaWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmbGluZyhpbnQgc3RhcnRYLCBpbnQgc3RhcnRZLCBpbnQgdmVsb2NpdHlYLCBpbnQgdmVsb2NpdHlZLAotICAgICAgICAgICAgaW50IG1pblgsIGludCBtYXhYLCBpbnQgbWluWSwgaW50IG1heFksIGludCBvdmVyWCwgaW50IG92ZXJZKSB7Ci0gICAgICAgIG1Nb2RlID0gRkxJTkdfTU9ERTsKLSAgICAgICAgbVNjcm9sbGVyWC5mbGluZyhzdGFydFgsIHZlbG9jaXR5WCwgbWluWCwgbWF4WCwgb3ZlclgpOwotICAgICAgICBtU2Nyb2xsZXJZLmZsaW5nKHN0YXJ0WSwgdmVsb2NpdHlZLCBtaW5ZLCBtYXhZLCBvdmVyWSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZ5IHRoZSBzY3JvbGxlciB0aGF0IHdlJ3ZlIHJlYWNoZWQgYSBob3Jpem9udGFsIGJvdW5kYXJ5LgotICAgICAqIE5vcm1hbGx5IHRoZSBpbmZvcm1hdGlvbiB0byBoYW5kbGUgdGhpcyB3aWxsIGFscmVhZHkgYmUga25vd24KLSAgICAgKiB3aGVuIHRoZSBhbmltYXRpb24gaXMgc3RhcnRlZCwgc3VjaCBhcyBpbiBhIGNhbGwgdG8gb25lIG9mIHRoZQotICAgICAqIGZsaW5nIGZ1bmN0aW9ucy4gSG93ZXZlciB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhpcyBjYW5ub3QgYmUga25vd24KLSAgICAgKiBpbiBhZHZhbmNlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdHJhbnNpdGlvbiB0aGUgY3VycmVudCBtb3Rpb24gYW5kCi0gICAgICogYW5pbWF0ZSBmcm9tIHN0YXJ0WCB0byBmaW5hbFggYXMgYXBwcm9wcmlhdGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRYIFN0YXJ0aW5nL2N1cnJlbnQgWCBwb3NpdGlvbgotICAgICAqIEBwYXJhbSBmaW5hbFggRGVzaXJlZCBmaW5hbCBYIHBvc2l0aW9uCi0gICAgICogQHBhcmFtIG92ZXJYIE1hZ25pdHVkZSBvZiBvdmVyc2Nyb2xsIGFsbG93ZWQuIFRoaXMgc2hvdWxkIGJlIHRoZSBtYXhpbXVtCi0gICAgICogICAgICAgICAgICAgIGRlc2lyZWQgZGlzdGFuY2UgZnJvbSBmaW5hbFguIEFic29sdXRlIHZhbHVlIC0gbXVzdCBiZSBwb3NpdGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlIb3Jpem9udGFsRWRnZVJlYWNoZWQoaW50IHN0YXJ0WCwgaW50IGZpbmFsWCwgaW50IG92ZXJYKSB7Ci0gICAgICAgIG1TY3JvbGxlclgubm90aWZ5RWRnZVJlYWNoZWQoc3RhcnRYLCBmaW5hbFgsIG92ZXJYKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZnkgdGhlIHNjcm9sbGVyIHRoYXQgd2UndmUgcmVhY2hlZCBhIHZlcnRpY2FsIGJvdW5kYXJ5LgotICAgICAqIE5vcm1hbGx5IHRoZSBpbmZvcm1hdGlvbiB0byBoYW5kbGUgdGhpcyB3aWxsIGFscmVhZHkgYmUga25vd24KLSAgICAgKiB3aGVuIHRoZSBhbmltYXRpb24gaXMgc3RhcnRlZCwgc3VjaCBhcyBpbiBhIGNhbGwgdG8gb25lIG9mIHRoZQotICAgICAqIGZsaW5nIGZ1bmN0aW9ucy4gSG93ZXZlciB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhpcyBjYW5ub3QgYmUga25vd24KLSAgICAgKiBpbiBhZHZhbmNlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYW5pbWF0ZSBhIHBhcmFib2xpYyBtb3Rpb24gZnJvbQotICAgICAqIHN0YXJ0WSB0byBmaW5hbFkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRZIFN0YXJ0aW5nL2N1cnJlbnQgWSBwb3NpdGlvbgotICAgICAqIEBwYXJhbSBmaW5hbFkgRGVzaXJlZCBmaW5hbCBZIHBvc2l0aW9uCi0gICAgICogQHBhcmFtIG92ZXJZIE1hZ25pdHVkZSBvZiBvdmVyc2Nyb2xsIGFsbG93ZWQuIFRoaXMgc2hvdWxkIGJlIHRoZSBtYXhpbXVtCi0gICAgICogICAgICAgICAgICAgIGRlc2lyZWQgZGlzdGFuY2UgZnJvbSBmaW5hbFkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbm90aWZ5VmVydGljYWxFZGdlUmVhY2hlZChpbnQgc3RhcnRZLCBpbnQgZmluYWxZLCBpbnQgb3ZlclkpIHsKLSAgICAgICAgbVNjcm9sbGVyWS5ub3RpZnlFZGdlUmVhY2hlZChzdGFydFksIGZpbmFsWSwgb3ZlclkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBTY3JvbGxlciBpcyBjdXJyZW50bHkgcmV0dXJuaW5nIHRvIGEgdmFsaWQgcG9zaXRpb24uCi0gICAgICogVmFsaWQgYm91bmRzIHdlcmUgcHJvdmlkZWQgYnkgdGhlCi0gICAgICoge0BsaW5rICNmbGluZyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpfSBtZXRob2QuCi0gICAgICoKLSAgICAgKiBPbmUgc2hvdWxkIGNoZWNrIHRoaXMgdmFsdWUgYmVmb3JlIGNhbGxpbmcKLSAgICAgKiB7QGxpbmsgI3N0YXJ0U2Nyb2xsKGludCwgaW50LCBpbnQsIGludCl9IGFzIHRoZSBpbnRlcnBvbGF0aW9uIGN1cnJlbnRseSBpbiBwcm9ncmVzcwotICAgICAqIHRvIHJlc3RvcmUgYSB2YWxpZCBwb3NpdGlvbiB3aWxsIHRoZW4gYmUgc3RvcHBlZC4gVGhlIGNhbGxlciBoYXMgdG8gdGFrZSBpbnRvIGFjY291bnQKLSAgICAgKiB0aGUgZmFjdCB0aGF0IHRoZSBzdGFydGVkIHNjcm9sbCB3aWxsIHN0YXJ0IGZyb20gYW4gb3ZlcnNjcm9sbGVkIHBvc2l0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgb3ZlcnNjcm9sbGVkIGFuZCBpbiB0aGUgcHJvY2VzcyBvZgotICAgICAqICAgICAgICAgaW50ZXJwb2xhdGluZyBiYWNrIHRvIGEgdmFsaWQgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNPdmVyc2Nyb2xsZWQoKSB7Ci0gICAgICAgIHJldHVybiAoKCFtU2Nyb2xsZXJYLm1GaW5pc2hlZCAmJgotICAgICAgICAgICAgICAgIG1TY3JvbGxlclgubVN0YXRlICE9IE1hZ25ldGljT3ZlclNjcm9sbGVyLlRPX0VER0UpIHx8Ci0gICAgICAgICAgICAgICAgKCFtU2Nyb2xsZXJZLm1GaW5pc2hlZCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyWS5tU3RhdGUgIT0gTWFnbmV0aWNPdmVyU2Nyb2xsZXIuVE9fRURHRSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3BzIHRoZSBhbmltYXRpb24uIENvbnRyYXJ5IHRvIHtAbGluayAjZm9yY2VGaW5pc2hlZChib29sZWFuKX0sCi0gICAgICogYWJvcnRpbmcgdGhlIGFuaW1hdGluZyBjYXVzZXMgdGhlIHNjcm9sbGVyIHRvIG1vdmUgdG8gdGhlIGZpbmFsIHggYW5kIHkKLSAgICAgKiBwb3NpdGlvbnMuCi0gICAgICoKLSAgICAgKiBAc2VlICNmb3JjZUZpbmlzaGVkKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWJvcnRBbmltYXRpb24oKSB7Ci0gICAgICAgIG1TY3JvbGxlclguZmluaXNoKCk7Ci0gICAgICAgIG1TY3JvbGxlclkuZmluaXNoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGltZSBlbGFwc2VkIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNjcm9sbGluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGVsYXBzZWQgdGltZSBpbiBtaWxsaXNlY29uZHMuCi0gICAgICoKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgdGltZVBhc3NlZCgpIHsKLSAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgZmluYWwgbG9uZyBzdGFydFRpbWUgPSBNYXRoLm1pbihtU2Nyb2xsZXJYLm1TdGFydFRpbWUsIG1TY3JvbGxlclkubVN0YXJ0VGltZSk7Ci0gICAgICAgIHJldHVybiAoaW50KSAodGltZSAtIHN0YXJ0VGltZSk7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIE1hZ25ldGljT3ZlclNjcm9sbGVyIHsKLSAgICAgICAgLy8gSW5pdGlhbCBwb3NpdGlvbgotICAgICAgICBpbnQgbVN0YXJ0OwotCi0gICAgICAgIC8vIEN1cnJlbnQgcG9zaXRpb24KLSAgICAgICAgaW50IG1DdXJyZW50UG9zaXRpb247Ci0KLSAgICAgICAgLy8gRmluYWwgcG9zaXRpb24KLSAgICAgICAgaW50IG1GaW5hbDsKLQotICAgICAgICAvLyBJbml0aWFsIHZlbG9jaXR5Ci0gICAgICAgIGludCBtVmVsb2NpdHk7Ci0KLSAgICAgICAgLy8gQ3VycmVudCB2ZWxvY2l0eQotICAgICAgICBmbG9hdCBtQ3VyclZlbG9jaXR5OwotCi0gICAgICAgIC8vIENvbnN0YW50IGN1cnJlbnQgZGVjZWxlcmF0aW9uCi0gICAgICAgIGZsb2F0IG1EZWNlbGVyYXRpb247Ci0KLSAgICAgICAgLy8gQW5pbWF0aW9uIHN0YXJ0aW5nIHRpbWUsIGluIHN5c3RlbSBtaWxsaXNlY29uZHMKLSAgICAgICAgbG9uZyBtU3RhcnRUaW1lOwotCi0gICAgICAgIC8vIEFuaW1hdGlvbiBkdXJhdGlvbiwgaW4gbWlsbGlzZWNvbmRzCi0gICAgICAgIGludCBtRHVyYXRpb247Ci0KLSAgICAgICAgLy8gV2hldGhlciB0aGUgYW5pbWF0aW9uIGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcwotICAgICAgICBib29sZWFuIG1GaW5pc2hlZDsKLQotICAgICAgICAvLyBDb25zdGFudCBncmF2aXR5IHZhbHVlLCB1c2VkIHRvIHNjYWxlIGRlY2VsZXJhdGlvbgotICAgICAgICBzdGF0aWMgZmxvYXQgR1JBVklUWTsKLQotICAgICAgICBzdGF0aWMgdm9pZCBpbml0aWFsaXplRnJvbUNvbnRleHQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCBwcGkgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eSAqIDE2MC4wZjsKLSAgICAgICAgICAgIEdSQVZJVFkgPSBTZW5zb3JNYW5hZ2VyLkdSQVZJVFlfRUFSVEggLy8gZyAobS9zXjIpCi0gICAgICAgICAgICAgICAgICAgICogMzkuMzdmIC8vIGluY2gvbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgKiBwcGkgLy8gcGl4ZWxzIHBlciBpbmNoCi0gICAgICAgICAgICAgICAgICAgICogVmlld0NvbmZpZ3VyYXRpb24uZ2V0U2Nyb2xsRnJpY3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT19FREdFID0gMDsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPX0JPVU5EQVJZID0gMTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPX0JPVU5DRSA9IDI7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YXRlID0gVE9fRURHRTsKLQotICAgICAgICAvLyBUaGUgYWxsb3dlZCBvdmVyc2hvdCBkaXN0YW5jZSBiZWZvcmUgYm91bmRhcnkgaXMgcmVhY2hlZC4KLSAgICAgICAgcHJpdmF0ZSBpbnQgbU92ZXI7Ci0KLSAgICAgICAgLy8gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHRvIGdvIGJhY2sgZnJvbSBlZGdlIHRvIGVkZ2UuIFNwcmluZ2JhY2sgaXMgaGFsZiBvZiBpdC4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9WRVJTQ1JPTExfU1BSSU5HQkFDS19EVVJBVElPTiA9IDIwMDsKLQotICAgICAgICAvLyBPc2NpbGxhdGlvbiBwZXJpb2QKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgVElNRV9DT0VGID0KLSAgICAgICAgICAgIDEwMDAuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyBPVkVSU0NST0xMX1NQUklOR0JBQ0tfRFVSQVRJT047Ci0KLSAgICAgICAgLy8gSWYgdGhlIHZlbG9jaXR5IGlzIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLCBubyBib3VuY2UgaXMgdHJpZ2dlcmVkCi0gICAgICAgIC8vIHdoZW4gdGhlIGVkZ2UgbGltaXRzIGFyZSByZWFjaGVkICh3b3VsZCByZXN1bHQgaW4gYSB6ZXJvIHBpeGVscwotICAgICAgICAvLyBkaXNwbGFjZW1lbnQgYW55d2F5KS4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUlOSU1VTV9WRUxPQ0lUWV9GT1JfQk9VTkNFID0gMTQwLjBmOwotCi0gICAgICAgIC8vIFByb3BvcnRpb24gb2YgdGhlIHZlbG9jaXR5IHRoYXQgaXMgcHJlc2VydmVkIHdoZW4gdGhlIGVkZ2UgaXMgcmVhY2hlZC4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9CT1VOQ0VfQ09FRkZJQ0lFTlQgPSAwLjE2ZjsKLQotICAgICAgICBwcml2YXRlIGZsb2F0IG1Cb3VuY2VDb2VmZmljaWVudCA9IERFRkFVTFRfQk9VTkNFX0NPRUZGSUNJRU5UOwotCi0gICAgICAgIE1hZ25ldGljT3ZlclNjcm9sbGVyKCkgewotICAgICAgICAgICAgbUZpbmlzaGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdXBkYXRlU2Nyb2xsKGZsb2F0IHEpIHsKLSAgICAgICAgICAgIG1DdXJyZW50UG9zaXRpb24gPSBtU3RhcnQgKyBNYXRoLnJvdW5kKHEgKiAobUZpbmFsIC0gbVN0YXJ0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgYSBzaWduZWQgZGVjZWxlcmF0aW9uIHRoYXQgd2lsbCByZWR1Y2UgdGhlIHZlbG9jaXR5LgotICAgICAgICAgKi8KLSAgICAgICAgc3RhdGljIGZsb2F0IGdldERlY2VsZXJhdGlvbihpbnQgdmVsb2NpdHkpIHsKLSAgICAgICAgICAgIHJldHVybiB2ZWxvY2l0eSA+IDAgPyAtR1JBVklUWSA6IEdSQVZJVFk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIGl0IHdpbGwgdGFrZSB0byBnbyBmcm9tIHN0YXJ0IHRvIGVuZC4KLSAgICAgICAgICovCi0gICAgICAgIHN0YXRpYyBpbnQgY29tcHV0ZUR1cmF0aW9uKGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgaW5pdGlhbFZlbG9jaXR5LCBmbG9hdCBkZWNlbGVyYXRpb24pIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBkaXN0YW5jZSA9IHN0YXJ0IC0gZW5kOwotICAgICAgICAgICAgZmluYWwgZmxvYXQgZGlzY3JpbWluYW50ID0gaW5pdGlhbFZlbG9jaXR5ICogaW5pdGlhbFZlbG9jaXR5IC0gMi4wZiAqIGRlY2VsZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAqIGRpc3RhbmNlOwotICAgICAgICAgICAgaWYgKGRpc2NyaW1pbmFudCA+PSAwLjBmKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgZGVsdGEgPSAoZmxvYXQpIE1hdGguc3FydChkaXNjcmltaW5hbnQpOwotICAgICAgICAgICAgICAgIGlmIChkZWNlbGVyYXRpb24gPCAwLjBmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhID0gLWRlbHRhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gKGludCkgKDEwMDAuMGYgKiAoLWluaXRpYWxWZWxvY2l0eSAtIGRlbHRhKSAvIGRlY2VsZXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEVuZCBwb3NpdGlvbiBjYW4gbm90IGJlIHJlYWNoZWQKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzdGFydFNjcm9sbChpbnQgc3RhcnQsIGludCBkaXN0YW5jZSwgaW50IGR1cmF0aW9uKSB7Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgbVN0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgICAgICBtRmluYWwgPSBzdGFydCArIGRpc3RhbmNlOwotCi0gICAgICAgICAgICBtU3RhcnRUaW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1EdXJhdGlvbiA9IGR1cmF0aW9uOwotCi0gICAgICAgICAgICAvLyBVbnVzZWQKLSAgICAgICAgICAgIG1EZWNlbGVyYXRpb24gPSAwLjBmOwotICAgICAgICAgICAgbVZlbG9jaXR5ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZmxpbmcoaW50IHN0YXJ0LCBpbnQgdmVsb2NpdHksIGludCBtaW4sIGludCBtYXgpIHsKLSAgICAgICAgICAgIG1GaW5pc2hlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBtU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotCi0gICAgICAgICAgICBtVmVsb2NpdHkgPSB2ZWxvY2l0eTsKLQotICAgICAgICAgICAgbURlY2VsZXJhdGlvbiA9IGdldERlY2VsZXJhdGlvbih2ZWxvY2l0eSk7Ci0KLSAgICAgICAgICAgIC8vIEEgc3RhcnQgZnJvbSBhbiBpbnZhbGlkIHBvc2l0aW9uIGltbWVkaWF0ZWx5IGJyaW5ncyBiYWNrIHRvIGEgdmFsaWQgcG9zaXRpb24KLSAgICAgICAgICAgIGlmIChtU3RhcnQgPCBtaW4pIHsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAwOwotICAgICAgICAgICAgICAgIG1GaW5hbCA9IG1pbjsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtU3RhcnQgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAwOwotICAgICAgICAgICAgICAgIG1GaW5hbCA9IG1heDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIER1cmF0aW9uIGFyZSBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzCi0gICAgICAgICAgICBtRHVyYXRpb24gPSAoaW50KSAoLTEwMDAuMGYgKiB2ZWxvY2l0eSAvIG1EZWNlbGVyYXRpb24pOwotCi0gICAgICAgICAgICBtRmluYWwgPSBzdGFydCAtIE1hdGgucm91bmQoKHZlbG9jaXR5ICogdmVsb2NpdHkpIC8gKDIuMGYgKiBtRGVjZWxlcmF0aW9uKSk7Ci0KLSAgICAgICAgICAgIC8vIENsYW1wIHRvIGEgdmFsaWQgZmluYWwgcG9zaXRpb24KLSAgICAgICAgICAgIGlmIChtRmluYWwgPCBtaW4pIHsKLSAgICAgICAgICAgICAgICBtRmluYWwgPSBtaW47Ci0gICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gY29tcHV0ZUR1cmF0aW9uKG1TdGFydCwgbWluLCBtVmVsb2NpdHksIG1EZWNlbGVyYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUZpbmFsID4gbWF4KSB7Ci0gICAgICAgICAgICAgICAgbUZpbmFsID0gbWF4OwotICAgICAgICAgICAgICAgIG1EdXJhdGlvbiA9IGNvbXB1dGVEdXJhdGlvbihtU3RhcnQsIG1heCwgbVZlbG9jaXR5LCBtRGVjZWxlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZmluaXNoKCkgewotICAgICAgICAgICAgbUN1cnJlbnRQb3NpdGlvbiA9IG1GaW5hbDsKLSAgICAgICAgICAgIC8vIE5vdCByZXNldCBzaW5jZSBXZWJWaWV3IHJlbGllcyBvbiB0aGlzIHZhbHVlIGZvciBmYXN0IGZsaW5nLgotICAgICAgICAgICAgLy8gbUN1cnJWZWxvY2l0eSA9IDAuMGY7Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRGaW5hbFBvc2l0aW9uKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgbUZpbmFsID0gcG9zaXRpb247Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZXh0ZW5kRHVyYXRpb24oaW50IGV4dGVuZCkgewotICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBlbGFwc2VkVGltZSA9IChpbnQpICh0aW1lIC0gbVN0YXJ0VGltZSk7Ci0gICAgICAgICAgICBtRHVyYXRpb24gPSBlbGFwc2VkVGltZSArIGV4dGVuZDsKLSAgICAgICAgICAgIG1GaW5pc2hlZCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRCb3VuY2VDb2VmZmljaWVudChmbG9hdCBjb2VmZmljaWVudCkgewotICAgICAgICAgICAgbUJvdW5jZUNvZWZmaWNpZW50ID0gY29lZmZpY2llbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHNwcmluZ2JhY2soaW50IHN0YXJ0LCBpbnQgbWluLCBpbnQgbWF4KSB7Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSB0cnVlOwotCi0gICAgICAgICAgICBtU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgIG1WZWxvY2l0eSA9IDA7Ci0KLSAgICAgICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICAgICAgbUR1cmF0aW9uID0gMDsKLQotICAgICAgICAgICAgaWYgKHN0YXJ0IDwgbWluKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnRTcHJpbmdiYWNrKHN0YXJ0LCBtaW4sIGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnQgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBzdGFydFNwcmluZ2JhY2soc3RhcnQsIG1heCwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAhbUZpbmlzaGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0U3ByaW5nYmFjayhpbnQgc3RhcnQsIGludCBlbmQsIGJvb2xlYW4gcG9zaXRpdmUpIHsKLSAgICAgICAgICAgIG1GaW5pc2hlZCA9IGZhbHNlOwotICAgICAgICAgICAgbVN0YXRlID0gVE9fQk9VTkNFOwotICAgICAgICAgICAgbVN0YXJ0ID0gbUZpbmFsID0gZW5kOwotICAgICAgICAgICAgbUR1cmF0aW9uID0gT1ZFUlNDUk9MTF9TUFJJTkdCQUNLX0RVUkFUSU9OOwotICAgICAgICAgICAgbVN0YXJ0VGltZSAtPSBPVkVSU0NST0xMX1NQUklOR0JBQ0tfRFVSQVRJT04gLyAyOwotICAgICAgICAgICAgbVZlbG9jaXR5ID0gKGludCkgKE1hdGguYWJzKGVuZCAtIHN0YXJ0KSAqIFRJTUVfQ09FRiAqIChwb3NpdGl2ZSA/IDEuMCA6IC0xLjBmKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGZsaW5nKGludCBzdGFydCwgaW50IHZlbG9jaXR5LCBpbnQgbWluLCBpbnQgbWF4LCBpbnQgb3ZlcikgewotICAgICAgICAgICAgbVN0YXRlID0gVE9fRURHRTsKLSAgICAgICAgICAgIG1PdmVyID0gb3ZlcjsKLQotICAgICAgICAgICAgbUZpbmlzaGVkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIG1TdGFydCA9IHN0YXJ0OwotICAgICAgICAgICAgbVN0YXJ0VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgICAgIG1WZWxvY2l0eSA9IHZlbG9jaXR5OwotCi0gICAgICAgICAgICBtRGVjZWxlcmF0aW9uID0gZ2V0RGVjZWxlcmF0aW9uKHZlbG9jaXR5KTsKLQotICAgICAgICAgICAgLy8gRHVyYXRpb24gYXJlIGV4cHJlc3NlZCBpbiBtaWxsaXNlY29uZHMKLSAgICAgICAgICAgIG1EdXJhdGlvbiA9IChpbnQpICgtMTAwMC4wZiAqIHZlbG9jaXR5IC8gbURlY2VsZXJhdGlvbik7Ci0KLSAgICAgICAgICAgIG1GaW5hbCA9IHN0YXJ0IC0gTWF0aC5yb3VuZCgodmVsb2NpdHkgKiB2ZWxvY2l0eSkgLyAoMi4wZiAqIG1EZWNlbGVyYXRpb24pKTsKLQotICAgICAgICAgICAgLy8gQ2xhbXAgdG8gYSB2YWxpZCBmaW5hbCBwb3NpdGlvbgotICAgICAgICAgICAgaWYgKG1GaW5hbCA8IG1pbikgewotICAgICAgICAgICAgICAgIG1GaW5hbCA9IG1pbjsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSBjb21wdXRlRHVyYXRpb24obVN0YXJ0LCBtaW4sIG1WZWxvY2l0eSwgbURlY2VsZXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRmluYWwgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBtRmluYWwgPSBtYXg7Ci0gICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gY29tcHV0ZUR1cmF0aW9uKG1TdGFydCwgbWF4LCBtVmVsb2NpdHksIG1EZWNlbGVyYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3RhcnQgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gbWF4ICsgb3ZlcikgewotICAgICAgICAgICAgICAgICAgICBzcHJpbmdiYWNrKG1heCArIG92ZXIsIG1pbiwgbWF4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAodmVsb2NpdHkgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nYmFjayhzdGFydCwgbWluLCBtYXgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGRvdWJsZSBkdXJhdGlvblNpbmNlRWRnZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hdGFuKChzdGFydC1tYXgpICogVElNRV9DT0VGIC8gdmVsb2NpdHkpIC8gVElNRV9DT0VGOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IChpbnQpICh0aW1lIC0gMTAwMC4wZiAqIGR1cmF0aW9uU2luY2VFZGdlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2ltdWxhdGUgYSBib3VuY2UgdGhhdCBzdGFydGVkIGZyb20gZWRnZQotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ID0gbWF4OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHkgPSAoaW50KSAodmVsb2NpdHkgLyBNYXRoLmNvcyhkdXJhdGlvblNpbmNlRWRnZSAqIFRJTUVfQ09FRikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBvbkVkZ2VSZWFjaGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IG1pbikgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPD0gbWluIC0gb3ZlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nYmFjayhtaW4gLSBvdmVyLCBtaW4sIG1heCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVsb2NpdHkgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmluZ2JhY2soc3RhcnQsIG1pbiwgbWF4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBkb3VibGUgZHVyYXRpb25TaW5jZUVkZ2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmF0YW4oKHN0YXJ0LW1pbikgKiBUSU1FX0NPRUYgLyB2ZWxvY2l0eSkgLyBUSU1FX0NPRUY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IChpbnQpICh0aW1lIC0gMTAwMC4wZiAqIGR1cmF0aW9uU2luY2VFZGdlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRlIGEgYm91bmNlIHRoYXQgc3RhcnRlZCBmcm9tIGVkZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnQgPSBtaW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHkgPSAoaW50KSAodmVsb2NpdHkgLyBNYXRoLmNvcyhkdXJhdGlvblNpbmNlRWRnZSAqIFRJTUVfQ09FRikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FZGdlUmVhY2hlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIG5vdGlmeUVkZ2VSZWFjaGVkKGludCBzdGFydCwgaW50IGVuZCwgaW50IG92ZXIpIHsKLSAgICAgICAgICAgIG1EZWNlbGVyYXRpb24gPSBnZXREZWNlbGVyYXRpb24obVZlbG9jaXR5KTsKLQotICAgICAgICAgICAgLy8gTG9jYWwgdGltZSwgdXNlZCB0byBjb21wdXRlIGVkZ2UgY3Jvc3NpbmcgdGltZS4KLSAgICAgICAgICAgIGZsb2F0IHRpbWVDdXJyZW50ID0gbUN1cnJWZWxvY2l0eSAvIG1EZWNlbGVyYXRpb247Ci0gICAgICAgICAgICBmaW5hbCBpbnQgZGlzdGFuY2UgPSBlbmQgLSBzdGFydDsKLSAgICAgICAgICAgIGZsb2F0IHRpbWVFZGdlID0gLShmbG9hdCkgTWF0aC5zcXJ0KCgyLjBmICogZGlzdGFuY2UgLyBtRGVjZWxlcmF0aW9uKQotICAgICAgICAgICAgICAgICAgICArICh0aW1lQ3VycmVudCAqIHRpbWVDdXJyZW50KSk7Ci0KLSAgICAgICAgICAgIG1WZWxvY2l0eSA9IChpbnQpIChtRGVjZWxlcmF0aW9uICogdGltZUVkZ2UpOwotCi0gICAgICAgICAgICAvLyBTaW11bGF0ZSBhIHN5bW1ldHJpYyBib3VuY2UgdGhhdCBzdGFydGVkIGZyb20gZWRnZQotICAgICAgICAgICAgbVN0YXJ0ID0gZW5kOwotCi0gICAgICAgICAgICBtT3ZlciA9IG92ZXI7Ci0KLSAgICAgICAgICAgIGxvbmcgdGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtU3RhcnRUaW1lID0gKGludCkgKHRpbWUgLSAxMDAwLjBmICogKHRpbWVDdXJyZW50IC0gdGltZUVkZ2UpKTsKLQotICAgICAgICAgICAgb25FZGdlUmVhY2hlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG9uRWRnZVJlYWNoZWQoKSB7Ci0gICAgICAgICAgICAvLyBtU3RhcnQsIG1WZWxvY2l0eSBhbmQgbVN0YXJ0VGltZSB3ZXJlIGFkanVzdGVkIHRvIHRoZWlyIHZhbHVlcyB3aGVuIGVkZ2Ugd2FzIHJlYWNoZWQuCi0gICAgICAgICAgICBmaW5hbCBmbG9hdCBkaXN0YW5jZSA9IG1WZWxvY2l0eSAvIFRJTUVfQ09FRjsKLQotICAgICAgICAgICAgaWYgKE1hdGguYWJzKGRpc3RhbmNlKSA8IG1PdmVyKSB7Ci0gICAgICAgICAgICAgICAgLy8gU3ByaW5nIGZvcmNlIHdpbGwgYnJpbmcgdXMgYmFjayB0byBmaW5hbCBwb3NpdGlvbgotICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFRPX0JPVU5DRTsKLSAgICAgICAgICAgICAgICBtRmluYWwgPSBtU3RhcnQ7Ci0gICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gT1ZFUlNDUk9MTF9TUFJJTkdCQUNLX0RVUkFUSU9OOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBWZWxvY2l0eSBpcyB0b28gaGlnaCwgd2Ugd2lsbCBoaXQgdGhlIGJvdW5kYXJ5IGxpbWl0Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gVE9fQk9VTkRBUlk7Ci0gICAgICAgICAgICAgICAgaW50IG92ZXIgPSBtVmVsb2NpdHkgPiAwID8gbU92ZXIgOiAtbU92ZXI7Ci0gICAgICAgICAgICAgICAgbUZpbmFsID0gbVN0YXJ0ICsgb3ZlcjsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAoaW50KSAoMTAwMC4wZiAqIE1hdGguYXNpbihvdmVyIC8gZGlzdGFuY2UpIC8gVElNRV9DT0VGKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gY29udGludWVXaGVuRmluaXNoZWQoKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgVE9fRURHRToKLSAgICAgICAgICAgICAgICAgICAgLy8gRHVyYXRpb24gZnJvbSBzdGFydCB0byBudWxsIHZlbG9jaXR5Ci0gICAgICAgICAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IChpbnQpICgtMTAwMC4wZiAqIG1WZWxvY2l0eSAvIG1EZWNlbGVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAobUR1cmF0aW9uIDwgZHVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhbmltYXRpb24gd2FzIGNsYW1wZWQsIHdlIHJlYWNoZWQgdGhlIGVkZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydCA9IG1GaW5hbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNwZWVkIHdoZW4gZWRnZSB3YXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5ID0gKGludCkgKG1WZWxvY2l0eSArIG1EZWNlbGVyYXRpb24gKiBtRHVyYXRpb24gLyAxMDAwLjBmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgKz0gbUR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgb25FZGdlUmVhY2hlZCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsIHN0b3AsIG5vIG5lZWQgdG8gY29udGludWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRPX0JPVU5EQVJZOgotICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lICs9IG1EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRTcHJpbmdiYWNrKG1GaW5hbCwgbUZpbmFsIC0gKG1WZWxvY2l0eSA+IDAgPyBtT3ZlcjotbU92ZXIpLCBtVmVsb2NpdHkgPiAwKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUT19CT1VOQ0U6Ci0gICAgICAgICAgICAgICAgICAgIC8vbVZlbG9jaXR5ID0gKGludCkgKG1WZWxvY2l0eSAqIEJPVU5DRV9DT0VGRklDSUVOVCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eSA9IChpbnQpIChtVmVsb2NpdHkgKiBtQm91bmNlQ29lZmZpY2llbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMobVZlbG9jaXR5KSA8IE1JTklNVU1fVkVMT0NJVFlfRk9SX0JPVU5DRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgKz0gbUR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFVwZGF0ZSB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgdmVsb2NpdHkgZm9yIGN1cnJlbnQgdGltZS4gUmV0dXJucwotICAgICAgICAgKiB0cnVlIGlmIHVwZGF0ZSBoYXMgYmVlbiBkb25lIGFuZCBmYWxzZSBpZiBhbmltYXRpb24gZHVyYXRpb24gaGFzIGJlZW4KLSAgICAgICAgICogcmVhY2hlZC4KLSAgICAgICAgICovCi0gICAgICAgIGJvb2xlYW4gdXBkYXRlKCkgewotICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgZHVyYXRpb24gPSB0aW1lIC0gbVN0YXJ0VGltZTsKLQotICAgICAgICAgICAgaWYgKGR1cmF0aW9uID4gbUR1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkb3VibGUgZGlzdGFuY2U7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCB0ID0gZHVyYXRpb24gLyAxMDAwLjBmOwotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBUT19FREdFKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJWZWxvY2l0eSA9IG1WZWxvY2l0eSArIG1EZWNlbGVyYXRpb24gKiB0OwotICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gbVZlbG9jaXR5ICogdCArIG1EZWNlbGVyYXRpb24gKiB0ICogdCAvIDIuMGY7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IGQgPSB0ICogVElNRV9DT0VGOwotICAgICAgICAgICAgICAgIG1DdXJyVmVsb2NpdHkgPSBtVmVsb2NpdHkgKiAoZmxvYXQpTWF0aC5jb3MoZCk7Ci0gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBtVmVsb2NpdHkgLyBUSU1FX0NPRUYgKiBNYXRoLnNpbihkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUN1cnJlbnRQb3NpdGlvbiA9IG1TdGFydCArIChpbnQpIGRpc3RhbmNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBNZW51LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBNZW51LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3NzBhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qb3B1cE1lbnUuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVQb3B1cEhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworLyoqCisgKiBBIFBvcHVwTWVudSBkaXNwbGF5cyBhIHtAbGluayBNZW51fSBpbiBhIG1vZGFsIHBvcHVwIHdpbmRvdyBhbmNob3JlZCB0byBhIHtAbGluayBWaWV3fS4KKyAqIFRoZSBwb3B1cCB3aWxsIGFwcGVhciBiZWxvdyB0aGUgYW5jaG9yIHZpZXcgaWYgdGhlcmUgaXMgcm9vbSwgb3IgYWJvdmUgaXQgaWYgdGhlcmUgaXMgbm90LgorICogSWYgdGhlIElNRSBpcyB2aXNpYmxlIHRoZSBwb3B1cCB3aWxsIG5vdCBvdmVybGFwIGl0IHVudGlsIGl0IGlzIHRvdWNoZWQuIFRvdWNoaW5nIG91dHNpZGUKKyAqIG9mIHRoZSBwb3B1cCB3aWxsIGRpc21pc3MgaXQuCisgKi8KK3B1YmxpYyBjbGFzcyBQb3B1cE1lbnUgaW1wbGVtZW50cyBNZW51QnVpbGRlci5DYWxsYmFjayB7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU1lbnU7CisgICAgcHJpdmF0ZSBWaWV3IG1BbmNob3I7CisgICAgcHJpdmF0ZSBNZW51UG9wdXBIZWxwZXIgbVBvcHVwOworICAgIHByaXZhdGUgT25NZW51SXRlbUNsaWNrTGlzdGVuZXIgbU1lbnVJdGVtQ2xpY2tMaXN0ZW5lcjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBQb3B1cE1lbnUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGZvciB0aGUgUG9wdXBNZW51LgorICAgICAqIEBwYXJhbSBhbmNob3IgQW5jaG9yIHZpZXcgZm9yIHRoaXMgcG9wdXAuIFRoZSBwb3B1cCB3aWxsIGFwcGVhciBiZWxvdyB0aGUgYW5jaG9yIGlmIHRoZXJlCisgICAgICogICAgICAgICAgICAgICBpcyByb29tLCBvciBhYm92ZSBpdCBpZiB0aGVyZSBpcyBub3QuCisgICAgICovCisgICAgcHVibGljIFBvcHVwTWVudShDb250ZXh0IGNvbnRleHQsIFZpZXcgYW5jaG9yKSB7CisgICAgICAgIC8vIFRPRE8gVGhlbWU/CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbU1lbnUgPSBuZXcgTWVudUJ1aWxkZXIoY29udGV4dCk7CisgICAgICAgIG1NZW51LnNldENhbGxiYWNrKHRoaXMpOworICAgICAgICBtQW5jaG9yID0gYW5jaG9yOworICAgICAgICBtUG9wdXAgPSBuZXcgTWVudVBvcHVwSGVscGVyKGNvbnRleHQsIG1NZW51LCBhbmNob3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBNZW51fSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwb3B1cC4gUG9wdWxhdGUgdGhlIHJldHVybmVkIE1lbnUgd2l0aAorICAgICAqIGl0ZW1zIGJlZm9yZSBjYWxsaW5nIHtAbGluayAjc2hvdygpfS4KKyAgICAgKgorICAgICAqIEBzZWUgI3Nob3coKQorICAgICAqIEBzZWUgI2dldE1lbnVJbmZsYXRlcigpCisgICAgICovCisgICAgcHVibGljIE1lbnUgZ2V0TWVudSgpIHsKKyAgICAgICAgcmV0dXJuIG1NZW51OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSB7QGxpbmsgTWVudUluZmxhdGVyfSB0aGF0IGNhbiBiZSB1c2VkIHRvIGluZmxhdGUgbWVudSBpdGVtcyBmcm9tIFhNTCBpbnRvIHRoZQorICAgICAqIG1lbnUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRNZW51KCl9LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0TWVudSgpCisgICAgICovCisgICAgcHVibGljIE1lbnVJbmZsYXRlciBnZXRNZW51SW5mbGF0ZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVudUluZmxhdGVyKG1Db250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93IHRoZSBtZW51IHBvcHVwIGFuY2hvcmVkIHRvIHRoZSB2aWV3IHNwZWNpZmllZCBkdXJpbmcgY29uc3RydWN0aW9uLgorICAgICAqIEBzZWUgI2Rpc21pc3MoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIG1Qb3B1cC5zaG93KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzbWlzcyB0aGUgbWVudSBwb3B1cC4KKyAgICAgKiBAc2VlICNzaG93KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1NZW51SXRlbUNsaWNrTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1TZWxlY3RlZChNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChtTWVudUl0ZW1DbGlja0xpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudUl0ZW1DbGlja0xpc3RlbmVyLm9uTWVudUl0ZW1DbGljayhpdGVtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNsb3NlTWVudShNZW51QnVpbGRlciBtZW51LCBib29sZWFuIGFsbE1lbnVzQXJlQ2xvc2luZykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25TdWJNZW51U2VsZWN0ZWQoU3ViTWVudUJ1aWxkZXIgc3ViTWVudSkgeworICAgICAgICBpZiAoIXN1Yk1lbnUuaGFzVmlzaWJsZUl0ZW1zKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3VycmVudCBtZW51IHdpbGwgYmUgZGlzbWlzc2VkIGJ5IHRoZSBub3JtYWwgaGVscGVyLCBzdWJtZW51IHdpbGwgYmUgc2hvd24gaW4gaXRzIHBsYWNlLgorICAgICAgICBuZXcgTWVudVBvcHVwSGVscGVyKG1Db250ZXh0LCBzdWJNZW51LCBtQW5jaG9yKS5zaG93KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25DbG9zZVN1Yk1lbnUoU3ViTWVudUJ1aWxkZXIgbWVudSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25NZW51TW9kZUNoYW5nZShNZW51QnVpbGRlciBtZW51KSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHJlc3BvbnNpYmxlIGZvciByZWNlaXZpbmcgbWVudSBpdGVtIGNsaWNrIGV2ZW50cyBpZiB0aGUgaXRlbXMgdGhlbXNlbHZlcworICAgICAqIGRvIG5vdCBoYXZlIGluZGl2aWR1YWwgaXRlbSBjbGljayBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgd2hlbiBhIG1lbnUgaXRlbSBpcyBjbGlja2VkIGlmIHRoZSBpdGVtIGl0c2VsZiBkaWQKKyAgICAgICAgICogbm90IGFscmVhZHkgaGFuZGxlIHRoZSBldmVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGl0ZW0ge0BsaW5rIE1lbnVJdGVtfSB0aGF0IHdhcyBjbGlja2VkCisgICAgICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGV2ZW50IHdhcyBoYW5kbGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qb3B1cFdpbmRvdy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKaW5kZXggMDM3ODMyOC4uNGEzZTJhOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKQEAgLTE5LDIyICsxOSwyNCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyLk9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uVG91Y2hMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uVG91Y2hMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyLk9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwogCkBAIC0xMjEsNyArMTIzLDcgQEAKICAgICBwcml2YXRlIE9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyIG1PblNjcm9sbENoYW5nZWRMaXN0ZW5lciA9CiAgICAgICAgIG5ldyBPblNjcm9sbENoYW5nZWRMaXN0ZW5lcigpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Nyb2xsQ2hhbmdlZCgpIHsKLSAgICAgICAgICAgICAgICBWaWV3IGFuY2hvciA9IG1BbmNob3IuZ2V0KCk7CisgICAgICAgICAgICAgICAgVmlldyBhbmNob3IgPSBtQW5jaG9yICE9IG51bGwgPyBtQW5jaG9yLmdldCgpIDogbnVsbDsKICAgICAgICAgICAgICAgICBpZiAoYW5jaG9yICE9IG51bGwgJiYgbVBvcHVwVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHAgPSAoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvcHVwVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKQEAgLTE1NywxMiArMTU5LDIxIEBACiAgICAgICogPHA+VGhlIHBvcHVwIGRvZXMgcHJvdmlkZSBhIGJhY2tncm91bmQuPC9wPgogICAgICAqLwogICAgIHB1YmxpYyBQb3B1cFdpbmRvdyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCAwKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogPHA+Q3JlYXRlIGEgbmV3LCBlbXB0eSwgbm9uIGZvY3VzYWJsZSBwb3B1cCB3aW5kb3cgb2YgZGltZW5zaW9uICgwLDApLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgcG9wdXAgZG9lcyBub3QgcHJvdmlkZSBhIGJhY2tncm91bmQuPC9wPgorICAgICAqLworICAgIHB1YmxpYyBQb3B1cFdpbmRvdyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVdpbmRvd01hbmFnZXIgPSAoV2luZG93TWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7CiAKICAgICAgICAgVHlwZWRBcnJheSBhID0KICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcygKLSAgICAgICAgICAgICAgICBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUG9wdXBXaW5kb3csIGRlZlN0eWxlLCAwKTsKKyAgICAgICAgICAgICAgICBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUG9wdXBXaW5kb3csIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwogCiAgICAgICAgIG1CYWNrZ3JvdW5kID0gYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5Qb3B1cFdpbmRvd19wb3B1cEJhY2tncm91bmQpOwogCkBAIC0xMDIyLDcgKzEwMzMsOSBAQAogICAgICAgICAKICAgICAgICAgaW50IGJvdHRvbUVkZ2UgPSBkaXNwbGF5RnJhbWUuYm90dG9tOwogICAgICAgICBpZiAoaWdub3JlQm90dG9tRGVjb3JhdGlvbnMpIHsKLSAgICAgICAgICAgIGJvdHRvbUVkZ2UgPSBhbmNob3IuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuaGVpZ2h0UGl4ZWxzOworICAgICAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGFuY2hvci5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBib3R0b21FZGdlID0gcmVzLmdldERpc3BsYXlNZXRyaWNzKCkuaGVpZ2h0UGl4ZWxzIC0KKyAgICAgICAgICAgICAgICAgICAgKGludCkgcmVzLmdldERpbWVuc2lvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnNjcmVlbl9tYXJnaW5fYm90dG9tKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbCBpbnQgZGlzdGFuY2VUb0JvdHRvbSA9IGJvdHRvbUVkZ2UgLSAoYW5jaG9yUG9zWzFdICsgYW5jaG9yLmdldEhlaWdodCgpKSAtIHlPZmZzZXQ7CiAgICAgICAgIGZpbmFsIGludCBkaXN0YW5jZVRvVG9wID0gYW5jaG9yUG9zWzFdIC0gZGlzcGxheUZyYW1lLnRvcCArIHlPZmZzZXQ7CkBAIC0xMzE1LDYgKzEzMjgsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgUG9wdXBWaWV3Q29udGFpbmVyIGV4dGVuZHMgRnJhbWVMYXlvdXQgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlBvcHVwV2luZG93LlBvcHVwVmlld0NvbnRhaW5lciI7CiAKICAgICAgICAgcHVibGljIFBvcHVwVmlld0NvbnRhaW5lcihDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Byb2dyZXNzQmFyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQppbmRleCBlYzdkOTI3Li4zYTQ0ODdjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQpAQCAtNzE2LDggKzcxNiw4IEBACiAgICAgICAgICAgICBtQW5pbWF0aW9uLnNldER1cmF0aW9uKG1EdXJhdGlvbik7CiAgICAgICAgICAgICBtQW5pbWF0aW9uLnNldEludGVycG9sYXRvcihtSW50ZXJwb2xhdG9yKTsKICAgICAgICAgICAgIG1BbmltYXRpb24uc2V0U3RhcnRUaW1lKEFuaW1hdGlvbi5TVEFSVF9PTl9GSVJTVF9GUkFNRSk7Ci0gICAgICAgICAgICBwb3N0SW52YWxpZGF0ZSgpOwogICAgICAgICB9CisgICAgICAgIHBvc3RJbnZhbGlkYXRlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MzAsNiArNzMwLDcgQEAKICAgICAgICAgICAgICgoQW5pbWF0YWJsZSkgbUluZGV0ZXJtaW5hdGVEcmF3YWJsZSkuc3RvcCgpOwogICAgICAgICAgICAgbVNob3VsZFN0YXJ0QW5pbWF0aW9uRHJhd2FibGUgPSBmYWxzZTsKICAgICAgICAgfQorICAgICAgICBwb3N0SW52YWxpZGF0ZSgpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1F1aWNrQ29udGFjdEJhZGdlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQppbmRleCAwN2MzZTRiLi41MGZiYjZiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQpAQCAtNDgsNiArNDgsNyBAQAogICAgIHByaXZhdGUgUXVlcnlIYW5kbGVyIG1RdWVyeUhhbmRsZXI7CiAgICAgcHJpdmF0ZSBEcmF3YWJsZSBtQmFkZ2VCYWNrZ3JvdW5kOwogICAgIHByaXZhdGUgRHJhd2FibGUgbU5vQmFkZ2VCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgRHJhd2FibGUgbURlZmF1bHRBdmF0YXI7CiAKICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gbUV4Y2x1ZGVNaW1lcyA9IG51bGw7CiAKQEAgLTExNyw2ICsxMTgsMTYgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRNb2RlKGludCBzaXplKSB7CiAgICAgICAgIG1Nb2RlID0gc2l6ZTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBjb250YWN0IHBob3RvIHRvIHRoZSBkZWZhdWx0IHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEltYWdlVG9EZWZhdWx0KCkgeworICAgICAgICBpZiAobURlZmF1bHRBdmF0YXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbURlZmF1bHRBdmF0YXIgPSBnZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2NvbnRhY3RfcGljdHVyZSk7CisgICAgICAgIH0KKyAgICAgICAgc2V0SW1hZ2VEcmF3YWJsZShtRGVmYXVsdEF2YXRhcik7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogQXNzaWduIHRoZSBjb250YWN0IHVyaSB0aGF0IHRoaXMgUXVpY2tDb250YWN0QmFkZ2Ugc2hvdWxkIGJlIGFzc29jaWF0ZWQKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3cy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEKaW5kZXggN2E3MGM4MC4uMGNhNzFlMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYXBwd2lkZ2V0LkFwcFdpZGdldEhvc3RWaWV3OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlcjsKQEAgLTYwLDEyICs2MSwxMiBAQAogICAgICAqIFRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgbGF5b3V0IAogICAgICAqIHJlc291cmNlLiAoQWRkZWQgdG8gdGhlIHBhcmNlbCkKICAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtUGFja2FnZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGFja2FnZTsKICAgICAKICAgICAvKioKICAgICAgKiBUaGUgcmVzb3VyY2UgSUQgb2YgdGhlIGxheW91dCBmaWxlLiAoQWRkZWQgdG8gdGhlIHBhcmNlbCkKICAgICAgKi8KLSAgICBwcml2YXRlIGludCBtTGF5b3V0SWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUxheW91dElkOwogCiAgICAgLyoqCiAgICAgICogQW4gYXJyYXkgb2YgYWN0aW9ucyB0byBwZXJmb3JtIG9uIHRoZSB2aWV3IHRyZWUgb25jZSBpdCBoYXMgYmVlbgpAQCAtMTEwLDYgKzExMSw0MiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBjbGFzcyBTZXRFbXB0eVZpZXcgZXh0ZW5kcyBBY3Rpb24geworICAgICAgICBpbnQgdmlld0lkOworICAgICAgICBpbnQgZW1wdHlWaWV3SWQ7CisKKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVEFHID0gNjsKKworICAgICAgICBTZXRFbXB0eVZpZXcoaW50IHZpZXdJZCwgaW50IGVtcHR5Vmlld0lkKSB7CisgICAgICAgICAgICB0aGlzLnZpZXdJZCA9IHZpZXdJZDsKKyAgICAgICAgICAgIHRoaXMuZW1wdHlWaWV3SWQgPSBlbXB0eVZpZXdJZDsKKyAgICAgICAgfQorCisgICAgICAgIFNldEVtcHR5VmlldyhQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHRoaXMudmlld0lkID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgdGhpcy5lbXB0eVZpZXdJZCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIG91dCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQoVEFHKTsKKyAgICAgICAgICAgIG91dC53cml0ZUludCh0aGlzLnZpZXdJZCk7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQodGhpcy5lbXB0eVZpZXdJZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoVmlldyByb290KSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSByb290LmZpbmRWaWV3QnlJZCh2aWV3SWQpOworICAgICAgICAgICAgaWYgKCEodmlldyBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3PD8+KSkgcmV0dXJuOworCisgICAgICAgICAgICBBZGFwdGVyVmlldzw/PiBhZGFwdGVyVmlldyA9IChBZGFwdGVyVmlldzw/PikgdmlldzsKKworICAgICAgICAgICAgZmluYWwgVmlldyBlbXB0eVZpZXcgPSByb290LmZpbmRWaWV3QnlJZChlbXB0eVZpZXdJZCk7CisgICAgICAgICAgICBpZiAoZW1wdHlWaWV3ID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgYWRhcHRlclZpZXcuc2V0RW1wdHlWaWV3KGVtcHR5Vmlldyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcKICAgICAgKiB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjc2V0T25DbGlja0xpc3RlbmVyKGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcil9CkBAIC0yNjYsNiArMzAzLDYzIEBACiAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRBRyA9IDM7CiAgICAgfQogICAgIAorICAgIHByaXZhdGUgY2xhc3MgUmVmbGVjdGlvbkFjdGlvbldpdGhvdXRQYXJhbXMgZXh0ZW5kcyBBY3Rpb24geworICAgICAgICBpbnQgdmlld0lkOworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZTsKKworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBUQUcgPSA1OworCisgICAgICAgIFJlZmxlY3Rpb25BY3Rpb25XaXRob3V0UGFyYW1zKGludCB2aWV3SWQsIFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICAgICAgICB0aGlzLnZpZXdJZCA9IHZpZXdJZDsKKyAgICAgICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBSZWZsZWN0aW9uQWN0aW9uV2l0aG91dFBhcmFtcyhQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHRoaXMudmlld0lkID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgdGhpcy5tZXRob2ROYW1lID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIG91dC53cml0ZUludChUQUcpOworICAgICAgICAgICAgb3V0LndyaXRlSW50KHRoaXMudmlld0lkKTsKKyAgICAgICAgICAgIG91dC53cml0ZVN0cmluZyh0aGlzLm1ldGhvZE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KFZpZXcgcm9vdCkgeworICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gcm9vdC5maW5kVmlld0J5SWQodmlld0lkKTsKKyAgICAgICAgICAgIGlmICh2aWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWN0aW9uRXhjZXB0aW9uKCJjYW4ndCBmaW5kIHZpZXc6IDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcodmlld0lkKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENsYXNzIGtsYXNzID0gdmlldy5nZXRDbGFzcygpOworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWV0aG9kID0ga2xhc3MuZ2V0TWV0aG9kKHRoaXMubWV0aG9kTmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWN0aW9uRXhjZXB0aW9uKCJ2aWV3OiAiICsga2xhc3MuZ2V0TmFtZSgpICsgIiBkb2Vzbid0IGhhdmUgbWV0aG9kOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHRoaXMubWV0aG9kTmFtZSArICIoKSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1ldGhvZC5pc0Fubm90YXRpb25QcmVzZW50KFJlbW90YWJsZVZpZXdNZXRob2QuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjdGlvbkV4Y2VwdGlvbigidmlldzogIiArIGtsYXNzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNhbid0IHVzZSBtZXRob2Qgd2l0aCBSZW1vdGVWaWV3czogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLm1ldGhvZE5hbWUgKyAiKCkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBDb25zdGFudElmU3RhdGVtZW50CisgICAgICAgICAgICAgICAgaWYgKGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKCJSZW1vdGVWaWV3cyIsICJ2aWV3OiAiICsga2xhc3MuZ2V0TmFtZSgpICsgIiBjYWxsaW5nIG1ldGhvZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLm1ldGhvZE5hbWUgKyAiKCkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZSh2aWV3KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBY3Rpb25FeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQmFzZSBjbGFzcyBmb3IgdGhlIHJlZmxlY3Rpb24gYWN0aW9ucy4KICAgICAgKi8KQEAgLTI4NSw2ICszNzksNyBAQAogICAgICAgICBzdGF0aWMgZmluYWwgaW50IFVSSSA9IDExOwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEJJVE1BUCA9IDEyOwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEJVTkRMRSA9IDEzOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IElOVEVOVCA9IDE0OwogCiAgICAgICAgIGludCB2aWV3SWQ7CiAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lOwpAQCAtMzQ3LDYgKzQ0Miw5IEBACiAgICAgICAgICAgICAgICAgY2FzZSBCVU5ETEU6CiAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBpbi5yZWFkQnVuZGxlKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5URU5UOgorICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gSW50ZW50LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNDAyLDYgKzUwMCw5IEBACiAgICAgICAgICAgICAgICAgY2FzZSBCVU5ETEU6CiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUJ1bmRsZSgoQnVuZGxlKSB0aGlzLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJTlRFTlQ6CisgICAgICAgICAgICAgICAgICAgICgoSW50ZW50KXRoaXMudmFsdWUpLndyaXRlVG9QYXJjZWwob3V0LCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNDM1LDYgKzUzNiw4IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCaXRtYXAuY2xhc3M7CiAgICAgICAgICAgICAgICAgY2FzZSBCVU5ETEU6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCdW5kbGUuY2xhc3M7CisgICAgICAgICAgICAgICAgY2FzZSBJTlRFTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlbnQuY2xhc3M7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CkBAIC01NjIsNiArNjY1LDEyIEBACiAgICAgICAgICAgICAgICAgY2FzZSBWaWV3R3JvdXBBY3Rpb24uVEFHOgogICAgICAgICAgICAgICAgICAgICBtQWN0aW9ucy5hZGQobmV3IFZpZXdHcm91cEFjdGlvbihwYXJjZWwpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSZWZsZWN0aW9uQWN0aW9uV2l0aG91dFBhcmFtcy5UQUc6CisgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25zLmFkZChuZXcgUmVmbGVjdGlvbkFjdGlvbldpdGhvdXRQYXJhbXMocGFyY2VsKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2V0RW1wdHlWaWV3LlRBRzoKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbnMuYWRkKG5ldyBTZXRFbXB0eVZpZXcocGFyY2VsKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBY3Rpb25FeGNlcHRpb24oIlRhZyAiICsgdGFnICsgIiBub3QgZm91bmQiKTsKICAgICAgICAgICAgICAgICB9CkBAIC01NjksNiArNjc4LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBjbG9uZSgpIHsKICAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgdGhhdCA9IG5ldyBSZW1vdGVWaWV3cyhtUGFja2FnZSwgbUxheW91dElkKTsKICAgICAgICAgaWYgKG1BY3Rpb25zICE9IG51bGwpIHsKQEAgLTYyMiw2ICs3MzIsMjQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcge0BsaW5rIEFkYXB0ZXJWaWV3RmxpcHBlciNzaG93TmV4dCgpfQorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgb24gd2hpY2ggdG8gY2FsbCB7QGxpbmsgQWRhcHRlclZpZXdGbGlwcGVyI3Nob3dOZXh0KCl9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hvd05leHQoaW50IHZpZXdJZCkgeworICAgICAgICBhZGRBY3Rpb24obmV3IFJlZmxlY3Rpb25BY3Rpb25XaXRob3V0UGFyYW1zKHZpZXdJZCwgInNob3dOZXh0IikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGxpbmsgQWRhcHRlclZpZXdGbGlwcGVyI3Nob3dQcmV2aW91cygpfQorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgb24gd2hpY2ggdG8gY2FsbCB7QGxpbmsgQWRhcHRlclZpZXdGbGlwcGVyI3Nob3dQcmV2aW91cygpfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3dQcmV2aW91cyhpbnQgdmlld0lkKSB7CisgICAgICAgIGFkZEFjdGlvbihuZXcgUmVmbGVjdGlvbkFjdGlvbldpdGhvdXRQYXJhbXModmlld0lkLCAic2hvd1ByZXZpb3VzIikpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBWaWV3LnNldFZpc2liaWxpdHkKICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyB3aG9zZSB2aXNpYmlsaXR5IHNob3VsZCBjaGFuZ2UKQEAgLTY3Miw2ICs4MDAsMTYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcgQWRhcHRlclZpZXcuc2V0RW1wdHlWaWV3CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyBvbiB3aGljaCB0byBzZXQgdGhlIGVtcHR5IHZpZXcKKyAgICAgKiBAcGFyYW0gZW1wdHlWaWV3SWQgVGhlIHZpZXcgaWQgb2YgdGhlIGVtcHR5IHZpZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbXB0eVZpZXcoaW50IHZpZXdJZCwgaW50IGVtcHR5Vmlld0lkKSB7CisgICAgICAgIGFkZEFjdGlvbihuZXcgU2V0RW1wdHlWaWV3KHZpZXdJZCwgZW1wdHlWaWV3SWQpKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcge0BsaW5rIENocm9ub21ldGVyI3NldEJhc2UgQ2hyb25vbWV0ZXIuc2V0QmFzZX0sCiAgICAgICoge0BsaW5rIENocm9ub21ldGVyI3NldEZvcm1hdCBDaHJvbm9tZXRlci5zZXRGb3JtYXR9LAogICAgICAqIGFuZCB7QGxpbmsgQ2hyb25vbWV0ZXIjc3RhcnQgQ2hyb25vbWV0ZXIuc3RhcnQoKX0gb3IKQEAgLTc2OSw2ICs5MDcsMzcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3I3NldFJlbW90ZVZpZXdzQWRhcHRlcihJbnRlbnQpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2aWV3SWQgVGhlIGlkIG9mIHRoZSB2aWV3IHdob3NlIHRleHQgc2hvdWxkIGNoYW5nZQorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGludGVudCBvZiB0aGUgc2VydmljZSB3aGljaCB3aWxsIGJlCisgICAgICogICAgICAgICAgICBwcm92aWRpbmcgZGF0YSB0byB0aGUgUmVtb3RlVmlld3NBZGFwdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlQWRhcHRlcihpbnQgdmlld0lkLCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHNldEludGVudCh2aWV3SWQsICJzZXRSZW1vdGVWaWV3c0FkYXB0ZXIiLCBpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcjc21vb3RoU2Nyb2xsVG9Qb3NpdGlvbihpbnQsIGludCl9LgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgd2hvc2UgdGV4dCBzaG91bGQgY2hhbmdlCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFNjcm9sbCB0byB0aGlzIGFkYXB0ZXIgcG9zaXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY3JvbGxQb3NpdGlvbihpbnQgdmlld0lkLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgc2V0SW50KHZpZXdJZCwgInNtb290aFNjcm9sbFRvUG9zaXRpb24iLCBwb3NpdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIHtAbGluayBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyNzbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKGludCwgaW50KX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyB3aG9zZSB0ZXh0IHNob3VsZCBjaGFuZ2UKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFNjcm9sbCBieSB0aGlzIGFkYXB0ZXIgcG9zaXRpb24gb2Zmc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVsYXRpdmVTY3JvbGxQb3NpdGlvbihpbnQgdmlld0lkLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHNldEludCh2aWV3SWQsICJzbW9vdGhTY3JvbGxCeU9mZnNldCIsIG9mZnNldCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2FsbCBhIG1ldGhvZCB0YWtpbmcgb25lIGJvb2xlYW4gb24gYSB2aWV3IGluIHRoZSBsYXlvdXQgZm9yIHRoaXMgUmVtb3RlVmlld3MuCiAgICAgICoKICAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyB3aG9zZSB0ZXh0IHNob3VsZCBjaGFuZ2UKQEAgLTkxNSw2ICsxMDg0LDE2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRlbnQoaW50IHZpZXdJZCwgU3RyaW5nIG1ldGhvZE5hbWUsIEludGVudCB2YWx1ZSkgeworICAgICAgICBhZGRBY3Rpb24obmV3IFJlZmxlY3Rpb25BY3Rpb24odmlld0lkLCBtZXRob2ROYW1lLCBSZWZsZWN0aW9uQWN0aW9uLklOVEVOVCwgdmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBJbmZsYXRlcyB0aGUgdmlldyBoaWVyYXJjaHkgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QgYW5kIGFwcGxpZXMKICAgICAgKiBhbGwgb2YgdGhlIGFjdGlvbnMuCiAgICAgICogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxZTQyMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3c0FkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDczOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk1lYXN1cmVTcGVjOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LklSZW1vdGVWaWV3c0ZhY3Rvcnk7CisKKy8qKgorICogQW4gYWRhcHRlciB0byBhIFJlbW90ZVZpZXdzU2VydmljZSB3aGljaCBmZXRjaGVzIGFuZCBjYWNoZXMgUmVtb3RlVmlld3MKKyAqIHRvIGJlIGxhdGVyIGluZmxhdGVkIGFzIGNoaWxkIHZpZXdzLgorICovCisvKiogQGhpZGUgKi8KK3B1YmxpYyBjbGFzcyBSZW1vdGVWaWV3c0FkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJSZW1vdGVWaWV3c0FkYXB0ZXIiOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgSW50ZW50IG1JbnRlbnQ7CisgICAgcHJpdmF0ZSBSZW1vdGVWaWV3c0FkYXB0ZXJTZXJ2aWNlQ29ubmVjdGlvbiBtU2VydmljZUNvbm5lY3Rpb247CisgICAgcHJpdmF0ZSBSZW1vdGVWaWV3c0NhY2hlIG1WaWV3Q2FjaGU7CisKKyAgICBwcml2YXRlIEhhbmRsZXJUaHJlYWQgbVdvcmtlclRocmVhZDsKKyAgICAvLyBpdGVtcyBtYXkgYmUgaW50ZXJydXB0ZWQgd2l0aGluIHRoZSBub3JtYWxseSBwcm9jZXNzZWQgcXVldWVzCisgICAgcHJpdmF0ZSBIYW5kbGVyIG1Xb3JrZXJRdWV1ZTsKKyAgICBwcml2YXRlIEhhbmRsZXIgbU1haW5RdWV1ZTsKKyAgICAvLyBpdGVtcyBhcmUgbmV2ZXIgZGVxdWV1ZWQgZnJvbSB0aGUgcHJpb3JpdHkgcXVldWUgYW5kIG11c3QgcnVuCisgICAgcHJpdmF0ZSBIYW5kbGVyIG1Xb3JrZXJQcmlvcml0eVF1ZXVlOworICAgIHByaXZhdGUgSGFuZGxlciBtTWFpblByaW9yaXR5UXVldWU7CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlcmZhY2UgZm9yIHRoZSBSZW1vdGVBZGFwdGVyIHRvIG5vdGlmeSBvdGhlciBjbGFzc2VzIHdoZW4gYWRhcHRlcnMKKyAgICAgKiBhcmUgYWN0dWFsbHkgY29ubmVjdGVkIHRvL2Rpc2Nvbm5lY3RlZCBmcm9tIHRoZWlyIGFjdHVhbCBzZXJ2aWNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFJlbW90ZUFkYXB0ZXJDb25uZWN0aW9uQ2FsbGJhY2sgeworICAgICAgICBwdWJsaWMgdm9pZCBvblJlbW90ZUFkYXB0ZXJDb25uZWN0ZWQoKTsKKworICAgICAgICBwdWJsaWMgdm9pZCBvblJlbW90ZUFkYXB0ZXJEaXNjb25uZWN0ZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmljZSBjb25uZWN0aW9uIHRoYXQgZ2V0cyBwb3B1bGF0ZWQgd2hlbiB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlIGlzCisgICAgICogYm91bmQuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBSZW1vdGVWaWV3c0FkYXB0ZXJTZXJ2aWNlQ29ubmVjdGlvbiBpbXBsZW1lbnRzIFNlcnZpY2VDb25uZWN0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Db25uZWN0ZWQ7CisgICAgICAgIHByaXZhdGUgSVJlbW90ZVZpZXdzRmFjdG9yeSBtUmVtb3RlVmlld3NGYWN0b3J5OworICAgICAgICBwcml2YXRlIFJlbW90ZUFkYXB0ZXJDb25uZWN0aW9uQ2FsbGJhY2sgbUNhbGxiYWNrOworCisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3c0FkYXB0ZXJTZXJ2aWNlQ29ubmVjdGlvbihSZW1vdGVBZGFwdGVyQ29ubmVjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUsIElCaW5kZXIgc2VydmljZSkgeworICAgICAgICAgICAgbVJlbW90ZVZpZXdzRmFjdG9yeSA9IElSZW1vdGVWaWV3c0ZhY3RvcnkuU3R1Yi5hc0ludGVyZmFjZShzZXJ2aWNlKTsKKyAgICAgICAgICAgIG1Db25uZWN0ZWQgPSB0cnVlOworCisgICAgICAgICAgICAvLyBub3RpZnlEYXRhU2V0Q2hhbmdlZCBzaG91bGQgYmUgY2FsbGVkIGZpcnN0LCB0byBlbnN1cmUgdGhhdCB0aGUKKyAgICAgICAgICAgIC8vIHZpZXdzIGFyZSBub3QgdXBkYXRlZCB0d2ljZQorICAgICAgICAgICAgbm90aWZ5RGF0YVNldENoYW5nZWQoKTsKKworICAgICAgICAgICAgLy8gcG9zdCBhIG5ldyBydW5uYWJsZSB0byBsb2FkIHRoZSBhcHByb3ByaWF0ZSBkYXRhLCB0aGVuIGNhbGxiYWNrCisgICAgICAgICAgICBtV29ya2VyUHJpb3JpdHlRdWV1ZS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZ2V0IHRoZSB2aWV3VHlwZUNvdW50IHNwZWNpZmljYWxseSwgc28ganVzdCBnZXQgYWxsIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlLnJlcXVlc3RNZXRhRGF0YSgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHBvc3QgYSBydW5uYWJsZSB0byBjYWxsIHRoZSBjYWxsYmFjayBvbiB0aGUgbWFpbiB0aHJlYWQKKyAgICAgICAgICAgICAgICAgICAgbU1haW5Qcmlvcml0eVF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25SZW1vdGVBZGFwdGVyQ29ubmVjdGVkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvLyBzdGFydCB0aGUgYmFja2dyb3VuZCBsb2FkZXIKKyAgICAgICAgICAgIG1WaWV3Q2FjaGUuc3RhcnRCYWNrZ3JvdW5kTG9hZGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lKSB7CisgICAgICAgICAgICBtUmVtb3RlVmlld3NGYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgICAgIG1Db25uZWN0ZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gY2xlYXIgdGhlIG1haW4vd29ya2VyIHF1ZXVlcworICAgICAgICAgICAgbU1haW5RdWV1ZS5yZW1vdmVNZXNzYWdlcygwKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gc3RvcCB0aGUgYmFja2dyb3VuZCBsb2FkZXIKKyAgICAgICAgICAgIG1WaWV3Q2FjaGUuc3RvcEJhY2tncm91bmRMb2FkZXIoKTsKKworICAgICAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKQorICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblJlbW90ZUFkYXB0ZXJEaXNjb25uZWN0ZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJUmVtb3RlVmlld3NGYWN0b3J5IGdldFJlbW90ZVZpZXdzRmFjdG9yeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUmVtb3RlVmlld3NGYWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3RlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGludGVybmFsIGNhY2hlIG9mIHJlbW90ZSB2aWV3cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFJlbW90ZVZpZXdzQ2FjaGUgeworICAgICAgICBwcml2YXRlIFJlbW90ZVZpZXdzSW5mbyBtVmlld0NhY2hlSW5mbzsKKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVWaWV3c0luZGV4SW5mb1tdIG1WaWV3Q2FjaGU7CisgICAgICAgIHByaXZhdGUgaW50W10gbVRtcFZpZXdDYWNoZUxvYWRJbmRpY2VzOworICAgICAgICBwcml2YXRlIExpbmtlZExpc3Q8SW50ZWdlcj4gbVZpZXdDYWNoZUxvYWRJbmRpY2VzOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUJhY2tncm91bmRMb2FkZXJFbmFibGVkOworCisgICAgICAgIC8vIGlmIGEgdXNlciBsb2FkaW5nIHZpZXcgaXMgbm90IHByb3ZpZGVkLCB0aGVuIHdlIGNyZWF0ZSBhIHRlbXBvcmFyeSBvbmUKKyAgICAgICAgLy8gZm9yIHRoZSB1c2VyIHVzaW5nIHRoZSBoZWlnaHQgb2YgdGhlIGZpcnN0IHZpZXcKKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVWaWV3cyBtVXNlckxvYWRpbmdWaWV3OworICAgICAgICBwcml2YXRlIFJlbW90ZVZpZXdzIG1GaXJzdFZpZXc7CisgICAgICAgIHByaXZhdGUgaW50IG1GaXJzdFZpZXdIZWlnaHQ7CisKKyAgICAgICAgLy8gZGV0ZXJtaW5lcyB3aGVuIHRoZSBjdXJyZW50IGNhY2hlIHdpbmRvdyBuZWVkcyB0byBiZSB1cGRhdGVkIHdpdGggbmV3CisgICAgICAgIC8vIGl0ZW1zIChpZS4gd2hlbiB0aGVyZSBpcyBub3QgZW5vdWdoIHNsYWNrKQorICAgICAgICBwcml2YXRlIGludCBtVmlld0NhY2hlU3RhcnRQb3NpdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVZpZXdDYWNoZUVuZFBvc2l0aW9uOworICAgICAgICBwcml2YXRlIGludCBtSGFsZkNhY2hlU2l6ZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUNhY2hlU2xhY2s7CisgICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbUNhY2hlU2xhY2tQZXJjZW50YWdlID0gMC43NWY7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkYXRhIHN0cnVjdHVyZSBzdG9yZWQgYXQgZWFjaCBpbmRleCBvZiB0aGUgY2FjaGUuIEFueSBtZW1iZXIgCisgICAgICAgICAqIHRoYXQgaXMgbm90IGludmFsaWRhdGVkIHBlcnNpc3RzIHRocm91Z2hvdXQgdGhlIGxpZmV0aW1lIG9mIHRoZSBjYWNoZS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgY2xhc3MgUmVtb3RlVmlld3NJbmRleEluZm8geworICAgICAgICAgICAgRnJhbWVMYXlvdXQgZmxpcHBlcjsKKyAgICAgICAgICAgIFJlbW90ZVZpZXdzIHZpZXc7CisgICAgICAgICAgICBsb25nIGl0ZW1JZDsKKyAgICAgICAgICAgIGludCB0eXBlSWQ7CisKKyAgICAgICAgICAgIFJlbW90ZVZpZXdzSW5kZXhJbmZvKCkgeworICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBzZXQoUmVtb3RlVmlld3MgdiwgbG9uZyBpZCkgeworICAgICAgICAgICAgICAgIHZpZXcgPSB2OworICAgICAgICAgICAgICAgIGl0ZW1JZCA9IGlkOworICAgICAgICAgICAgICAgIGlmICh2ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHR5cGVJZCA9IHYuZ2V0TGF5b3V0SWQoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHR5cGVJZCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgaW52YWxpZGF0ZSgpIHsKKyAgICAgICAgICAgICAgICB2aWV3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpdGVtSWQgPSAwOworICAgICAgICAgICAgICAgIHR5cGVJZCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNWYWxpZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHZpZXcgIT0gbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3RlIGFkYXB0ZXIgbWV0YWRhdGEuIFVzZWZ1bCBmb3Igd2hlbiB3ZSBoYXZlIHRvIGxvY2sgb24gc29tZXRoaW5nCisgICAgICAgICAqIGJlZm9yZSB1cGRhdGluZyB0aGUgbWV0YWRhdGEuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGNsYXNzIFJlbW90ZVZpZXdzSW5mbyB7CisgICAgICAgICAgICBpbnQgY291bnQ7CisgICAgICAgICAgICBpbnQgdmlld1R5cGVDb3VudDsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzU3RhYmxlSWRzOworICAgICAgICAgICAgYm9vbGVhbiBpc0RhdGFEaXJ0eTsKKyAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtVHlwZUlkSW5kZXhNYXA7CisKKyAgICAgICAgICAgIFJlbW90ZVZpZXdzSW5mbygpIHsKKyAgICAgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZHVtbXkgdmlldyB0eXBlCisgICAgICAgICAgICAgICAgdmlld1R5cGVDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgaGFzU3RhYmxlSWRzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpc0RhdGFEaXJ0eSA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1UeXBlSWRJbmRleE1hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3NDYWNoZShpbnQgaGFsZkNhY2hlU2l6ZSkgeworICAgICAgICAgICAgbUhhbGZDYWNoZVNpemUgPSBoYWxmQ2FjaGVTaXplOworICAgICAgICAgICAgbUNhY2hlU2xhY2sgPSBNYXRoLnJvdW5kKG1DYWNoZVNsYWNrUGVyY2VudGFnZSAqIG1IYWxmQ2FjaGVTaXplKTsKKyAgICAgICAgICAgIG1WaWV3Q2FjaGVTdGFydFBvc2l0aW9uID0gMDsKKyAgICAgICAgICAgIG1WaWV3Q2FjaGVFbmRQb3NpdGlvbiA9IC0xOworICAgICAgICAgICAgbUJhY2tncm91bmRMb2FkZXJFbmFibGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGNhY2hlCisgICAgICAgICAgICBpbnQgY2FjaGVTaXplID0gMiAqIG1IYWxmQ2FjaGVTaXplICsgMTsKKyAgICAgICAgICAgIG1WaWV3Q2FjaGVJbmZvID0gbmV3IFJlbW90ZVZpZXdzSW5mbygpOworICAgICAgICAgICAgbVZpZXdDYWNoZSA9IG5ldyBSZW1vdGVWaWV3c0luZGV4SW5mb1tjYWNoZVNpemVdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVmlld0NhY2hlLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgbVZpZXdDYWNoZVtpXSA9IG5ldyBSZW1vdGVWaWV3c0luZGV4SW5mbygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRtcFZpZXdDYWNoZUxvYWRJbmRpY2VzID0gbmV3IGludFtjYWNoZVNpemVdOworICAgICAgICAgICAgbVZpZXdDYWNoZUxvYWRJbmRpY2VzID0gbmV3IExpbmtlZExpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjb250YWlucyhpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAobVZpZXdDYWNoZVN0YXJ0UG9zaXRpb24gPD0gcG9zaXRpb24pICYmIChwb3NpdGlvbiA8PSBtVmlld0NhY2hlRW5kUG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNvbnRhaW5zQW5kSXNWYWxpZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIGlmIChjb250YWlucyhwb3NpdGlvbikpIHsKKyAgICAgICAgICAgICAgICBSZW1vdGVWaWV3c0luZGV4SW5mbyBpbmRleEluZm8gPSBtVmlld0NhY2hlW2dldENhY2hlSW5kZXgocG9zaXRpb24pXTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXhJbmZvLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBnZXRDYWNoZUluZGV4KGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgLy8gdGFrZSB0aGUgbW9kdWxvIG9mIHRoZSBwb3NpdGlvbgorICAgICAgICAgICAgcmV0dXJuIChtVmlld0NhY2hlLmxlbmd0aCArIChwb3NpdGlvbiAlIG1WaWV3Q2FjaGUubGVuZ3RoKSkgJSBtVmlld0NhY2hlLmxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RNZXRhRGF0YSgpIHsKKyAgICAgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIElSZW1vdGVWaWV3c0ZhY3RvcnkgZmFjdG9yeSA9IG1TZXJ2aWNlQ29ubmVjdGlvbi5nZXRSZW1vdGVWaWV3c0ZhY3RvcnkoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHByb3BlcnRpZXMvZmlyc3QgdmlldyAoc28gdGhhdCB3ZSBjYW4gdXNlIGl0IHRvCisgICAgICAgICAgICAgICAgICAgIC8vIG1lYXN1cmUgb3VyIGR1bW15IHZpZXdzKQorICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc1N0YWJsZUlkcyA9IGZhY3RvcnkuaGFzU3RhYmxlSWRzKCk7CisgICAgICAgICAgICAgICAgICAgIGludCB2aWV3VHlwZUNvdW50ID0gZmFjdG9yeS5nZXRWaWV3VHlwZUNvdW50KCk7CisgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IGZhY3RvcnkuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgUmVtb3RlVmlld3MgbG9hZGluZ1ZpZXcgPSBmYWN0b3J5LmdldExvYWRpbmdWaWV3KCk7CisgICAgICAgICAgICAgICAgICAgIFJlbW90ZVZpZXdzIGZpcnN0VmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmICgoY291bnQgPiAwKSAmJiAobG9hZGluZ1ZpZXcgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VmlldyA9IGZhY3RvcnkuZ2V0Vmlld0F0KDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbW90ZVZpZXdzSW5mbyBpbmZvID0gbVZpZXdDYWNoZUluZm87CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmhhc1N0YWJsZUlkcyA9IGhhc1N0YWJsZUlkczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8udmlld1R5cGVDb3VudCA9IHZpZXdUeXBlQ291bnQgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5jb3VudCA9IGNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgbVVzZXJMb2FkaW5nVmlldyA9IGxvYWRpbmdWaWV3OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0VmlldyA9IGZpcnN0VmlldzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RWaWV3SGVpZ2h0ID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTm90aWZ5RGF0YVNldENoYW5nZWQoKSB7CisgICAgICAgICAgICAvLyB3ZSBtYXJrIHRoZSBkYXRhIGFzIGRpcnR5IHNvIHRoYXQgdGhlIG5leHQgY2FsbCB0byBmZXRjaCB2aWV3cyB3aWxsIHJlc3VsdCBpbgorICAgICAgICAgICAgLy8gYW4gb25EYXRhU2V0RGlydHkoKSBjYWxsIGZyb20gdGhlIGFkYXB0ZXIKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUluZm8pIHsKKyAgICAgICAgICAgICAgICBtVmlld0NhY2hlSW5mby5pc0RhdGFEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlTm90aWZ5RGF0YVNldENoYW5nZWQoKSB7CisgICAgICAgICAgICAvLyBhY3R1YWxseSBjYWxscyB0aHJvdWdoIHRvIHRoZSBmYWN0b3J5IHRvIG5vdGlmeSBpdCB0byB1cGRhdGUKKyAgICAgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIElSZW1vdGVWaWV3c0ZhY3RvcnkgZmFjdG9yeSA9IG1TZXJ2aWNlQ29ubmVjdGlvbi5nZXRSZW1vdGVWaWV3c0ZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmYWN0b3J5Lm9uRGF0YVNldENoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZS1yZXF1ZXN0IHRoZSBuZXcgbWV0YWRhdGEgKG9ubHkgYWZ0ZXIgdGhlIG5vdGlmaWNhdGlvbiB0byB0aGUgZmFjdG9yeSkKKyAgICAgICAgICAgIHJlcXVlc3RNZXRhRGF0YSgpOworCisgICAgICAgICAgICAvLyBwb3N0IGEgbmV3IHJ1bm5hYmxlIG9uIHRoZSBtYWluIHRocmVhZCB0byBwcm9wYWdhdGUgdGhlIG5vdGlmaWNhdGlvbiBiYWNrCisgICAgICAgICAgICAvLyB0byB0aGUgYmFzZSBhZGFwdGVyCisgICAgICAgICAgICBtTWFpblF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICBjb21wbGV0ZU5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZW1vdGVWaWV3c0luZm8oaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpZiAobVNlcnZpY2VDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBJUmVtb3RlVmlld3NGYWN0b3J5IGZhY3RvcnkgPSBtU2VydmljZUNvbm5lY3Rpb24uZ2V0UmVtb3RlVmlld3NGYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSBpdGVtIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgUmVtb3RlVmlld3MgcmVtb3RlVmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgbG9uZyBpdGVtSWQgPSAwOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW90ZVZpZXcgPSBmYWN0b3J5LmdldFZpZXdBdChwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1JZCA9IGZhY3RvcnkuZ2V0SXRlbUlkKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGlmIHRoZSB3aW5kb3cgaGFzIG1vdmVkCisgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IG1WaWV3Q2FjaGVTdGFydFBvc2l0aW9uIHx8IHBvc2l0aW9uID4gbVZpZXdDYWNoZUVuZFBvc2l0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBwb3NpdGlvbkluZGV4ID0gcG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjYWNoZUluZGV4ID0gZ2V0Q2FjaGVJbmRleChwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVbY2FjaGVJbmRleF0uc2V0KHJlbW90ZVZpZXcsIGl0ZW1JZCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IHRoZSBtYWluIHRocmVhZCB3aGVuIGRvbmUgbG9hZGluZworICAgICAgICAgICAgICAgICAgICAvLyBmbHVzaCBwZW5kaW5nIHVwZGF0ZXMKKyAgICAgICAgICAgICAgICAgICAgbU1haW5RdWV1ZS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN3YXAgdGhlIGxvYWRlciB2aWV3IGZvciB0aGlzIHZpZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zQW5kSXNWYWxpZChwb3NpdGlvbkluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlVmlld3NJbmRleEluZm8gaW5kZXhJbmZvID0gbVZpZXdDYWNoZVtjYWNoZUluZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0IGZsaXBwZXIgPSBpbmRleEluZm8uZmxpcHBlcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBmbGlwcGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlwcGVyLmdldENoaWxkQXQoMCkuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhZGROZXdWaWV3ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGlwcGVyLmdldENoaWxkQ291bnQoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IHYgPSBmbGlwcGVyLmdldENoaWxkQXQoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGVJZCA9ICgoSW50ZWdlcikgdi5nZXRUYWcoKSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZUlkID09IGluZGV4SW5mby50eXBlSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIHJlYXBwbHkgc2luY2UgaXQgaXMgdGhlIHNhbWUgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEluZm8udmlldy5yZWFwcGx5KG1Db250ZXh0LCB2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LmdldEFuaW1hdGlvbigpICE9IG51bGwpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5idWlsZERyYXdpbmdDYWNoZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGROZXdWaWV3ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxpcHBlci5yZW1vdmVWaWV3QXQoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZE5ld1ZpZXcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IHYgPSBpbmRleEluZm8udmlldy5hcHBseShtQ29udGV4dCwgZmxpcHBlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5zZXRUYWcobmV3IEludGVnZXIoaW5kZXhJbmZvLnR5cGVJZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaXBwZXIuYWRkVmlldyh2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVWaWV3c0luZGV4SW5mbyByZXF1ZXN0Q2FjaGVkSW5kZXhJbmZvKGZpbmFsIGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgaW50IGluZGljZXNUb0xvYWRDb3VudCA9IDA7CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZSkgeworICAgICAgICAgICAgICAgIGlmIChjb250YWluc0FuZElzVmFsaWQocG9zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGUgaW5mbyBpZiBpdCBleGlzdHMgaW4gdGhlIHdpbmRvdyBhbmQgaXMgbG9hZGVkCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtVmlld0NhY2hlW2dldENhY2hlSW5kZXgocG9zaXRpb24pXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBpZiBuZWNlc3NhcnkgdXBkYXRlIHRoZSB3aW5kb3cgYW5kIGxvYWQgdGhlIG5ldyBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgIGludCBjZW50ZXJQb3NpdGlvbiA9IChtVmlld0NhY2hlRW5kUG9zaXRpb24gKyBtVmlld0NhY2hlU3RhcnRQb3NpdGlvbikgLyAyOworICAgICAgICAgICAgICAgIGlmICgobVZpZXdDYWNoZUVuZFBvc2l0aW9uIDw9IG1WaWV3Q2FjaGVTdGFydFBvc2l0aW9uKSB8fCAoTWF0aC5hYnMocG9zaXRpb24gLSBjZW50ZXJQb3NpdGlvbikgPiBtQ2FjaGVTbGFjaykpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ld1N0YXJ0UG9zaXRpb24gPSBwb3NpdGlvbiAtIG1IYWxmQ2FjaGVTaXplOworICAgICAgICAgICAgICAgICAgICBpbnQgbmV3RW5kUG9zaXRpb24gPSBwb3NpdGlvbiArIG1IYWxmQ2FjaGVTaXplOworICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVTaXplID0gbUhhbGZDYWNoZVNpemUgLyA0OworICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCA9IChpbnQpIE1hdGguY2VpbChtVmlld0NhY2hlLmxlbmd0aCAvIChmbG9hdCkgZnJhbWVTaXplKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBwcnVuZS9hZGQgYmVmb3JlIHRoZSBjdXJyZW50IHN0YXJ0IHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgIGludCBlZmZlY3RpdmVTdGFydCA9IE1hdGgubWF4KG5ld1N0YXJ0UG9zaXRpb24sIDApOworICAgICAgICAgICAgICAgICAgICBpbnQgZWZmZWN0aXZlRW5kID0gTWF0aC5taW4obmV3RW5kUG9zaXRpb24sIGdldENvdW50KCkgLSAxKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkYXRlIGl0ZW1zIGluIHRoZSBxdWV1ZQorICAgICAgICAgICAgICAgICAgICBpbnQgb3ZlcmxhcFN0YXJ0ID0gTWF0aC5tYXgobVZpZXdDYWNoZVN0YXJ0UG9zaXRpb24sIGVmZmVjdGl2ZVN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG92ZXJsYXBFbmQgPSBNYXRoLm1pbihNYXRoLm1heChtVmlld0NhY2hlU3RhcnRQb3NpdGlvbiwgbVZpZXdDYWNoZUVuZFBvc2l0aW9uKSwgZWZmZWN0aXZlRW5kKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoZnJhbWVTaXplICogZnJhbWVDb3VudCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbmV3U3RhcnRQb3NpdGlvbiArICgoaSAlIGZyYW1lU2l6ZSkgKiBmcmFtZUNvdW50ICsgKGkgLyBmcmFtZVNpemUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDw9IG5ld0VuZFBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChvdmVybGFwU3RhcnQgPD0gaW5kZXgpICYmIChpbmRleCA8PSBvdmVybGFwRW5kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSBzdHVmZiBpbiB0aGUgbWlkZGxlIHRoYXQgaGFzIG5vdCBhbHJlYWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZW4gbG9hZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVZpZXdDYWNoZVtnZXRDYWNoZUluZGV4KGluZGV4KV0uaXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG1wVmlld0NhY2hlTG9hZEluZGljZXNbaW5kaWNlc1RvTG9hZENvdW50KytdID0gaW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChlZmZlY3RpdmVTdGFydCA8PSBpbmRleCkgJiYgKGluZGV4IDw9IGVmZmVjdGl2ZUVuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52YWxpZGF0ZSBhbmQgbG9hZCBhbGwgbmV3IGVmZmVjdGl2ZSBpdGVtcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlW2dldENhY2hlSW5kZXgoaW5kZXgpXS5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UbXBWaWV3Q2FjaGVMb2FkSW5kaWNlc1tpbmRpY2VzVG9Mb2FkQ291bnQrK10gPSBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkYXRlIGFsbCBvdGhlciBjYWNoZSBpbmRpY2VzIChvdXRzaWRlIHRoZSBlZmZlY3RpdmUgc3RhcnQvZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgZG9uJ3QgbG9hZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlW2dldENhY2hlSW5kZXgoaW5kZXgpXS5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbVZpZXdDYWNoZVN0YXJ0UG9zaXRpb24gPSBuZXdTdGFydFBvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlRW5kUG9zaXRpb24gPSBuZXdFbmRQb3NpdGlvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHBvc3QgaXRlbXMgdG8gYmUgbG9hZGVkCisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUluZm8pIHsKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBtVmlld0NhY2hlSW5mby5jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbmRpY2VzVG9Mb2FkQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlTG9hZEluZGljZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbVZpZXdDYWNoZUxvYWRJbmRpY2VzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kaWNlc1RvTG9hZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IG1UbXBWaWV3Q2FjaGVMb2FkSW5kaWNlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4ICYmIGluZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXdDYWNoZUxvYWRJbmRpY2VzLmFkZExhc3QoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZXR1cm4gbnVsbCBzbyB0aGF0IGEgZHVtbXkgdmlldyBjYW4gYmUgcmV0cmlldmVkCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICBpZiAobVNlcnZpY2VDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGZsaXBwZXIgdmlld3MgaWYgbmVjZXNzYXJ5ICh3ZSBoYXZlIHRvIGRvIHRoaXMgbm93CisgICAgICAgICAgICAgICAgLy8gZm9yIGFsbCB0aGUgZmxpcHBlcnMgd2hpbGUgd2UgaGF2ZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQpCisgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUxvYWRpbmdWaWV3cyhwYXJlbnQpOworCisgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCB0aGUgaXRlbSBmcm9tIHRoZSBjYWNoZSAocXVldWVpbmcgaXQgdG8gbG9hZCBpZiBub3QKKyAgICAgICAgICAgICAgICAvLyBpbiB0aGUgY2FjaGUgYWxyZWFkeSkKKyAgICAgICAgICAgICAgICBSZW1vdGVWaWV3c0luZGV4SW5mbyBpbmRleEluZm8gPSByZXF1ZXN0Q2FjaGVkSW5kZXhJbmZvKHBvc2l0aW9uKTsKKworICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZmxpcHBlciBhcHByb3ByaWF0ZWx5CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjYWNoZUluZGV4ID0gZ2V0Q2FjaGVJbmRleChwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0IGZsaXBwZXIgPSBtVmlld0NhY2hlW2NhY2hlSW5kZXhdLmZsaXBwZXI7CisgICAgICAgICAgICAgICAgICAgIGZsaXBwZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICBmbGlwcGVyLnNldEFscGhhKDEuMGYpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleEluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSB0aGUgaXRlbSB2aWV3IGFuZCBzaG93IHRoZSBsb2FkaW5nIHZpZXcKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsaXBwZXIuZ2V0Q2hpbGRBdCgwKS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGZsaXBwZXIuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlwcGVyLmdldENoaWxkQXQoaSkuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSB0aGUgbG9hZGluZyB2aWV3IGFuZCBzaG93IHRoZSBpdGVtIHZpZXcKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmxpcHBlci5nZXRDaGlsZENvdW50KCkgLSAxOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlwcGVyLmdldENoaWxkQXQoaSkuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZmxpcHBlci5nZXRDaGlsZEF0KGZsaXBwZXIuZ2V0Q2hpbGRDb3VudCgpIC0gMSkuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbGlwcGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgVmlldyhtQ29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUxvYWRpbmdWaWV3cyhWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgY2FjaGUgaGFzIHRoZSBhcHByb3ByaWF0ZSBpbml0aWFsIGZsaXBwZXIKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZSkgeworICAgICAgICAgICAgICAgIGlmIChtVmlld0NhY2hlWzBdLmZsaXBwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1WaWV3Q2FjaGUubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0IGZsaXBwZXIgPSBuZXcgRnJhbWVMYXlvdXQobUNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Vc2VyTG9hZGluZ1ZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgdXNlci1zcGVjaWZpZWQgbG9hZGluZyB2aWV3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxpcHBlci5hZGRWaWV3KG1Vc2VyTG9hZGluZ1ZpZXcuYXBwbHkobUNvbnRleHQsIHBhcmVudCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIG9yaWdpbmFsIHNpemUgb2YgdGhlIGZpcnN0IHJvdyBmb3IgdGhlIGxvYWRlciB2aWV3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlSW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZpcnN0Vmlld0hlaWdodCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgZmlyc3RWaWV3ID0gbUZpcnN0Vmlldy5hcHBseShtQ29udGV4dCwgcGFyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vmlldy5tZWFzdXJlKE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygwLCBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygwLCBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0Vmlld0hlaWdodCA9IGZpcnN0Vmlldy5nZXRNZWFzdXJlZEhlaWdodCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RydWN0IGEgbmV3IGxvYWRlciBhbmQgYWRkIGl0IHRvIHRoZSBmbGlwcGVyIGFzIHRoZSBmYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdmlldworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRWaWV3IHRleHRWaWV3ID0gbmV3IFRleHRWaWV3KG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KCJMb2FkaW5nLi4uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0SGVpZ2h0KG1GaXJzdFZpZXdIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldEdyYXZpdHkoR3Jhdml0eS5DRU5URVJfSE9SSVpPTlRBTCB8IEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0U2l6ZSgxOC4wZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dENvbG9yKENvbG9yLmFyZ2IoOTYsIDI1NSwgMjU1LCAyNTUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRTaGFkb3dMYXllcigyLjBmLCAwLjBmLCAxLjBmLCBDb2xvci5CTEFDSyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlwcGVyLmFkZFZpZXcodGV4dFZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXdDYWNoZVtpXS5mbGlwcGVyID0gZmxpcHBlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0QmFja2dyb3VuZExvYWRlcigpIHsKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIHdvcmtlciBydW5uYWJsZQorICAgICAgICAgICAgbUJhY2tncm91bmRMb2FkZXJFbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Xb3JrZXJRdWV1ZS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtQmFja2dyb3VuZExvYWRlckVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSB0aGUgUmVtb3RlVmlld3MgZmFjdG9yeSBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNEYXRhRGlydHkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RhdGFEaXJ0eSA9IG1WaWV3Q2FjaGVJbmZvLmlzRGF0YURpcnR5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVJbmZvLmlzRGF0YURpcnR5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEYXRhRGlydHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVOb3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUxvYWRJbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtVmlld0NhY2hlTG9hZEluZGljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gbVZpZXdDYWNoZUxvYWRJbmRpY2VzLnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIHdlcmUgbm8gaXRlbXMgdG8gbG9hZCwgc28gc2xlZXAgZm9yIGEgYml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIHRyeSBhbmQgbG9hZCB0aGUgaXRlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJlbW90ZVZpZXdzSW5mbyhpbmRleCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbGVlcCBmb3IgYSBiaXQgdG8gYWxsb3cgdGhpbmdzIHRvIGNhdGNoIHVwIGFmdGVyIHRoZSBsb2FkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9wQmFja2dyb3VuZExvYWRlcigpIHsKKyAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBpdGVtcyB0byBiZSBsb2FkZWQKKyAgICAgICAgICAgIG1CYWNrZ3JvdW5kTG9hZGVyRW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlTG9hZEluZGljZXMpIHsKKyAgICAgICAgICAgICAgICBtVmlld0NhY2hlTG9hZEluZGljZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZSkgeworICAgICAgICAgICAgICAgIGlmIChjb250YWluc0FuZElzVmFsaWQocG9zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtVmlld0NhY2hlW2dldENhY2hlSW5kZXgocG9zaXRpb24pXS5pdGVtSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEl0ZW1WaWV3VHlwZShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIC8vIHN5bmNocm9uaXplIHRvIGVuc3VyZSB0aGF0IHRoZSB0eXBlIGlkL2luZGV4IG1hcCBpcyB1cGRhdGVkIHN5bmNocm9ub3VzbHkKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZSkgeworICAgICAgICAgICAgICAgIGlmIChjb250YWluc0FuZElzVmFsaWQocG9zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2aWV3SWQgPSBtVmlld0NhY2hlW2dldENhY2hlSW5kZXgocG9zaXRpb24pXS50eXBlSWQ7CisgICAgICAgICAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiB0eXBlTWFwID0gbVZpZXdDYWNoZUluZm8ubVR5cGVJZEluZGV4TWFwOworICAgICAgICAgICAgICAgICAgICAvLyB3ZSArMSBiZWNhdXNlIHRoZSBkZWZhdWx0IGR1bW15IHZpZXcgZ2V0IHZpZXcgdHlwZSAwCisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlTWFwLmNvbnRhaW5zS2V5KHZpZXdJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlTWFwLmdldCh2aWV3SWQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld0luZGV4ID0gdHlwZU1hcC5zaXplKCkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU1hcC5wdXQodmlld0lkLCBuZXdJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3SW5kZXg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGRlZmF1bHQgaXRlbQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlSW5mbykgeworICAgICAgICAgICAgICAgIHJldHVybiBtVmlld0NhY2hlSW5mby5jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUluZm8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVZpZXdDYWNoZUluZm8udmlld1R5cGVDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUluZm8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVZpZXdDYWNoZUluZm8uaGFzU3RhYmxlSWRzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZmx1c2hDYWNoZSgpIHsKKyAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBpdGVtcyB0byBiZSBsb2FkZWQKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUxvYWRJbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgbVZpZXdDYWNoZUxvYWRJbmRpY2VzLmNsZWFyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZSkgeworICAgICAgICAgICAgICAgIC8vIGZsdXNoIHRoZSBpbnRlcm5hbCBjYWNoZSBhbmQgaW52YWxpZGF0ZSB0aGUgYWRhcHRlciBmb3IgZnV0dXJlIGxvYWRzCisgICAgICAgICAgICAgICAgbU1haW5RdWV1ZS5yZW1vdmVNZXNzYWdlcygwKTsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZpZXdDYWNoZS5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlW2ldLmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtVmlld0NhY2hlU3RhcnRQb3NpdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgbVZpZXdDYWNoZUVuZFBvc2l0aW9uID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgUmVtb3RlVmlld3NBZGFwdGVyKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCwgUmVtb3RlQWRhcHRlckNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1JbnRlbnQgPSBpbnRlbnQ7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgd29ya2VyIHRocmVhZAorICAgICAgICBtV29ya2VyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIlJlbW90ZVZpZXdzQ2FjaGUtbG9hZGVyIik7CisgICAgICAgIG1Xb3JrZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbVdvcmtlclF1ZXVlID0gbmV3IEhhbmRsZXIobVdvcmtlclRocmVhZC5nZXRMb29wZXIoKSk7CisgICAgICAgIG1Xb3JrZXJQcmlvcml0eVF1ZXVlID0gbmV3IEhhbmRsZXIobVdvcmtlclRocmVhZC5nZXRMb29wZXIoKSk7CisgICAgICAgIG1NYWluUXVldWUgPSBuZXcgSGFuZGxlcihMb29wZXIubXlMb29wZXIoKSk7CisgICAgICAgIG1NYWluUHJpb3JpdHlRdWV1ZSA9IG5ldyBIYW5kbGVyKExvb3Blci5teUxvb3BlcigpKTsKKworICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBjYWNoZSBhbmQgdGhlIHNlcnZpY2UgY29ubmVjdGlvbiBvbiBzdGFydHVwCisgICAgICAgIG1WaWV3Q2FjaGUgPSBuZXcgUmVtb3RlVmlld3NDYWNoZSgyNSk7CisgICAgICAgIG1TZXJ2aWNlQ29ubmVjdGlvbiA9IG5ldyBSZW1vdGVWaWV3c0FkYXB0ZXJTZXJ2aWNlQ29ubmVjdGlvbihjYWxsYmFjayk7CisgICAgICAgIHJlcXVlc3RCaW5kU2VydmljZSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIC8vIHJlbWVtYmVyIHRvIHVuYmluZCBmcm9tIHRoZSBzZXJ2aWNlIHdoZW4gZmluYWxpemluZworICAgICAgICB1bmJpbmRTZXJ2aWNlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgcmVxdWVzdEJpbmRTZXJ2aWNlKCk7CisgICAgICAgIHJldHVybiBtVmlld0NhY2hlLmdldENvdW50KCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRJdGVtKGludCBwb3NpdGlvbikgeworICAgICAgICAvLyBkaXNhbGxvdyBhcmJpdHJhcnkgb2JqZWN0IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhbiBpdGVtIGZvciB0aGUgdGltZSBiZWluZworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgIHJlcXVlc3RCaW5kU2VydmljZSgpOworICAgICAgICByZXR1cm4gbVZpZXdDYWNoZS5nZXRJdGVtSWQocG9zaXRpb24pOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SXRlbVZpZXdUeXBlKGludCBwb3NpdGlvbikgeworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICAgICAgcmV0dXJuIG1WaWV3Q2FjaGUuZ2V0SXRlbVZpZXdUeXBlKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICAgICAgcmV0dXJuIG1WaWV3Q2FjaGUuZ2V0Vmlldyhwb3NpdGlvbiwgY29udmVydFZpZXcsIHBhcmVudCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRWaWV3VHlwZUNvdW50KCkgeworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICAgICAgcmV0dXJuIG1WaWV3Q2FjaGUuZ2V0Vmlld1R5cGVDb3VudCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKKyAgICAgICAgcmVxdWVzdEJpbmRTZXJ2aWNlKCk7CisgICAgICAgIHJldHVybiBtVmlld0NhY2hlLmhhc1N0YWJsZUlkcygpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBnZXRDb3VudCgpIDw9IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YVNldENoYW5nZWQoKSB7CisgICAgICAgIC8vIGZsdXNoIHRoZSBjYWNoZSBzbyB0aGF0IHdlIGNhbiByZWxvYWQgbmV3IGl0ZW1zIGZyb20gdGhlIHNlcnZpY2UKKyAgICAgICAgbVZpZXdDYWNoZS5mbHVzaENhY2hlKCk7CisKKyAgICAgICAgLy8gbm90aWZ5IHRoZSBmYWN0b3J5IHRoYXQgaXQncyBkYXRhIG1heSBubyBsb25nZXIgYmUgdmFsaWQKKyAgICAgICAgbVZpZXdDYWNoZS5vbk5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29tcGxldGVOb3RpZnlEYXRhU2V0Q2hhbmdlZCgpIHsKKyAgICAgICAgc3VwZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVxdWVzdEJpbmRTZXJ2aWNlKCkgeworICAgICAgICAvLyB0cnkgYmluZGluZyB0aGUgc2VydmljZSAod2hpY2ggd2lsbCBzdGFydCBpdCBpZiBpdCdzIG5vdCBhbHJlYWR5IHJ1bm5pbmcpCisgICAgICAgIGlmICghbVNlcnZpY2VDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgIG1Db250ZXh0LmJpbmRTZXJ2aWNlKG1JbnRlbnQsIG1TZXJ2aWNlQ29ubmVjdGlvbiwgQ29udGV4dC5CSU5EX0FVVE9fQ1JFQVRFKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtU2VydmljZUNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdW5iaW5kU2VydmljZSgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICBtQ29udGV4dC51bmJpbmRTZXJ2aWNlKG1TZXJ2aWNlQ29ubmVjdGlvbik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NTZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg0ZmEyNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3c1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5JUmVtb3RlVmlld3NGYWN0b3J5OworCisvKioKKyAqIFRoZSBzZXJ2aWNlIHRvIGJlIGNvbm5lY3RlZCB0byBmb3IgYSByZW1vdGUgYWRhcHRlciB0byByZXF1ZXN0IFJlbW90ZVZpZXdzLiAgVXNlcnMgc2hvdWxkCisgKiBleHRlbmQgdGhlIFJlbW90ZVZpZXdzU2VydmljZSB0byBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBSZW1vdGVWaWV3c0ZhY3RvcnkncyB1c2VkIHRvCisgKiBwb3B1bGF0ZSB0aGUgcmVtb3RlIGNvbGxlY3Rpb24gdmlldyAoTGlzdFZpZXcsIEdyaWRWaWV3LCBldGMpLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVtb3RlVmlld3NTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJSZW1vdGVWaWV3c1NlcnZpY2UiOworCisgICAgLy8gbXVsdGltYXAgaW1wbGVtZW50YXRpb24gZm9yIHJlZmVyZW5jZSBjb3VudGluZworICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlbnQsIFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPj4gbVJlbW90ZVZpZXdGYWN0b3JpZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlcmZhY2UgZm9yIGFuIGFkYXB0ZXIgYmV0d2VlbiBhIHJlbW90ZSBjb2xsZWN0aW9uIHZpZXcgKExpc3RWaWV3LCBHcmlkVmlldywgZXRjKSBhbmQKKyAgICAgKiB0aGUgdW5kZXJseWluZyBkYXRhIGZvciB0aGF0IHZpZXcuICBUaGUgaW1wbGVtZW50b3IgaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZyBhIFJlbW90ZVZpZXcKKyAgICAgKiBmb3IgZWFjaCBpdGVtIGluIHRoZSBkYXRhIHNldC4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXIKKyAgICAgKiBAc2VlIGFuZHJvaWQuYXBwd2lkZ2V0LkFwcFdpZGdldE1hbmFnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFJlbW90ZVZpZXdzRmFjdG9yeSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB5b3VyIGZhY3RvcnkgaXMgZmlyc3QgY29uc3RydWN0ZWQuIFRoZSBzYW1lIGZhY3RvcnkgbWF5IGJlIHNoYXJlZCBhY3Jvc3MKKyAgICAgICAgICogbXVsdGlwbGUgUmVtb3RlVmlld0FkYXB0ZXJzIGRlcGVuZGluZyBvbiB0aGUgaW50ZW50IHBhc3NlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBub3RpZnlEYXRhU2V0Q2hhbmdlZCgpIGlzIHRyaWdnZXJlZCBvbiB0aGUgcmVtb3RlIGFkYXB0ZXIuIFRoaXMgYWxsb3dzIGEKKyAgICAgICAgICogUmVtb3RlVmlld3NGYWN0b3J5IHRvIHJlc3BvbmQgdG8gZGF0YSBjaGFuZ2VzIGJ5IHVwZGF0aW5nIGFueSBpbnRlcm5hbCByZWZlcmVuY2VzLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlIGFuZHJvaWQuYXBwd2lkZ2V0LkFwcFdpZGdldE1hbmFnZXIjbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkKGludFtdLCBpbnQpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkRhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgbGFzdCBSZW1vdGVWaWV3c0FkYXB0ZXIgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBmYWN0b3J5IGlzCisgICAgICAgICAqIHVuYm91bmQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKTsKKworICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCk7CisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBnZXRWaWV3QXQoaW50IHBvc2l0aW9uKTsKKyAgICAgICAgcHVibGljIFJlbW90ZVZpZXdzIGdldExvYWRpbmdWaWV3KCk7CisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpOworICAgICAgICBwdWJsaWMgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzU3RhYmxlSWRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBwcml2YXRlIHByb3h5IGNsYXNzIGZvciB0aGUgcHJpdmF0ZSBJUmVtb3RlVmlld3NGYWN0b3J5IGludGVyZmFjZSB0aHJvdWdoIHRoZQorICAgICAqIHB1YmxpYyBSZW1vdGVWaWV3c0ZhY3RvcnkgaW50ZXJmYWNlLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgUmVtb3RlVmlld3NGYWN0b3J5QWRhcHRlciBleHRlbmRzIElSZW1vdGVWaWV3c0ZhY3RvcnkuU3R1YiB7CisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3c0ZhY3RvcnlBZGFwdGVyKFJlbW90ZVZpZXdzRmFjdG9yeSBmYWN0b3J5KSB7CisgICAgICAgICAgICBtRmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgb25EYXRhU2V0Q2hhbmdlZCgpIHsKKyAgICAgICAgICAgIG1GYWN0b3J5Lm9uRGF0YVNldENoYW5nZWQoKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1GYWN0b3J5LmdldENvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFJlbW90ZVZpZXdzIGdldFZpZXdBdChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBtRmFjdG9yeS5nZXRWaWV3QXQocG9zaXRpb24pOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBnZXRMb2FkaW5nVmlldygpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmFjdG9yeS5nZXRMb2FkaW5nVmlldygpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmFjdG9yeS5nZXRWaWV3VHlwZUNvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIG1GYWN0b3J5LmdldEl0ZW1JZChwb3NpdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzU3RhYmxlSWRzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1GYWN0b3J5Lmhhc1N0YWJsZUlkcygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVWaWV3c0ZhY3RvcnkgbUZhY3Rvcnk7CisgICAgfQorCisgICAgcHVibGljIFJlbW90ZVZpZXdzU2VydmljZSgpIHsKKyAgICAgICAgbVJlbW90ZVZpZXdGYWN0b3JpZXMgPSBuZXcgSGFzaE1hcDxJbnRlbnQsIFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPj4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCB0byB0aGUgcGFydGljdWxhciBmYWN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGludGVudAorICAgICAgICAgICAgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+IGZhY3RvcnlSZWYgPSBudWxsOworICAgICAgICAgICAgUmVtb3RlVmlld3NGYWN0b3J5IGZhY3RvcnkgPSBudWxsOworICAgICAgICAgICAgaWYgKCFtUmVtb3RlVmlld0ZhY3Rvcmllcy5jb250YWluc0tleShpbnRlbnQpKSB7CisgICAgICAgICAgICAgICAgZmFjdG9yeSA9IG9uR2V0Vmlld0ZhY3RvcnkoaW50ZW50KTsKKyAgICAgICAgICAgICAgICBmYWN0b3J5UmVmID0gbmV3IFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPihmYWN0b3J5LCAxKTsKKyAgICAgICAgICAgICAgICBtUmVtb3RlVmlld0ZhY3Rvcmllcy5wdXQoaW50ZW50LCBmYWN0b3J5UmVmKTsKKyAgICAgICAgICAgICAgICBmYWN0b3J5Lm9uQ3JlYXRlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPiBvbGRGYWN0b3J5UmVmID0gbVJlbW90ZVZpZXdGYWN0b3JpZXMuZ2V0KGludGVudCk7CisgICAgICAgICAgICAgICAgZmFjdG9yeSA9IG9sZEZhY3RvcnlSZWYuZmlyc3Q7CisgICAgICAgICAgICAgICAgaW50IG5ld1JlZkNvdW50ID0gb2xkRmFjdG9yeVJlZi5zZWNvbmQuaW50VmFsdWUoKSArIDE7CisgICAgICAgICAgICAgICAgZmFjdG9yeVJlZiA9IG5ldyBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4ob2xkRmFjdG9yeVJlZi5maXJzdCwgbmV3UmVmQ291bnQpOworICAgICAgICAgICAgICAgIG1SZW1vdGVWaWV3RmFjdG9yaWVzLnB1dChpbnRlbnQsIGZhY3RvcnlSZWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBSZW1vdGVWaWV3c0ZhY3RvcnlBZGFwdGVyKGZhY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25VbmJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAobVJlbW90ZVZpZXdGYWN0b3JpZXMuY29udGFpbnNLZXkoaW50ZW50KSkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsZXZpYXRlcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IG9mIGhhdmluZyB0byBjbGVhciBhbGwgZmFjdG9yaWVzCisgICAgICAgICAgICAgICAgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+IG9sZEZhY3RvcnlSZWYgPSBtUmVtb3RlVmlld0ZhY3Rvcmllcy5nZXQoaW50ZW50KTsKKyAgICAgICAgICAgICAgICBpbnQgbmV3UmVmQ291bnQgPSBvbGRGYWN0b3J5UmVmLnNlY29uZC5pbnRWYWx1ZSgpIC0gMTsKKyAgICAgICAgICAgICAgICBpZiAobmV3UmVmQ291bnQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBvbGRGYWN0b3J5UmVmLmZpcnN0Lm9uRGVzdHJveSgpOworICAgICAgICAgICAgICAgICAgICBtUmVtb3RlVmlld0ZhY3Rvcmllcy5yZW1vdmUoaW50ZW50KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4gZmFjdG9yeVJlZiA9IG5ldyBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4ob2xkRmFjdG9yeVJlZi5maXJzdCwgbmV3UmVmQ291bnQpOworICAgICAgICAgICAgICAgICAgICBtUmVtb3RlVmlld0ZhY3Rvcmllcy5wdXQoaW50ZW50LCBmYWN0b3J5UmVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uVW5iaW5kKGludGVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlcml2ZWQgc2VydmljZSB0byBnZW5lcmF0ZSBhcHByb3ByaWF0ZSBmYWN0b3JpZXMgZm9yCisgICAgICogdGhlIGRhdGEuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFJlbW90ZVZpZXdzRmFjdG9yeSBvbkdldFZpZXdGYWN0b3J5KEludGVudCBpbnRlbnQpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Jlc291cmNlQ3Vyc29yQWRhcHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Jlc291cmNlQ3Vyc29yQWRhcHRlci5qYXZhCmluZGV4IGM5YzIxN2EuLmFlZTQxMWUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZXNvdXJjZUN1cnNvckFkYXB0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVzb3VyY2VDdXJzb3JBZGFwdGVyLmphdmEKQEAgLTM2LDkgKzM2LDggQEAKICAgICAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGUgTGlzdFZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAgICAgKiAgICAgICAgICAgIFNpbXBsZUxpc3RJdGVtRmFjdG9yeSBpcyBydW5uaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGUgTGlzdFZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWRhcHRlciBpcyBydW5uaW5nCiAgICAgICogQHBhcmFtIGxheW91dCByZXNvdXJjZSBpZGVudGlmaWVyIG9mIGEgbGF5b3V0IGZpbGUgdGhhdCBkZWZpbmVzIHRoZSB2aWV3cwogICAgICAqICAgICAgICAgICAgZm9yIHRoaXMgbGlzdCBpdGVtLiAgVW5sZXNzIHlvdSBvdmVycmlkZSB0aGVtIGxhdGVyLCB0aGlzIHdpbGwKICAgICAgKiAgICAgICAgICAgIGRlZmluZSBib3RoIHRoZSBpdGVtIHZpZXdzIGFuZCB0aGUgZHJvcCBkb3duIHZpZXdzLgpAQCAtNTEsOSArNTAsOCBAQAogICAgIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoZSBMaXN0VmlldyBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAgICAqICAgICAgICAgICAgU2ltcGxlTGlzdEl0ZW1GYWN0b3J5IGlzIHJ1bm5pbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoZSBMaXN0VmlldyBhc3NvY2lhdGVkIHdpdGggdGhpcyBhZGFwdGVyIGlzIHJ1bm5pbmcKICAgICAgKiBAcGFyYW0gbGF5b3V0IHJlc291cmNlIGlkZW50aWZpZXIgb2YgYSBsYXlvdXQgZmlsZSB0aGF0IGRlZmluZXMgdGhlIHZpZXdzCiAgICAgICogICAgICAgICAgICBmb3IgdGhpcyBsaXN0IGl0ZW0uICBVbmxlc3MgeW91IG92ZXJyaWRlIHRoZW0gbGF0ZXIsIHRoaXMgd2lsbAogICAgICAqICAgICAgICAgICAgZGVmaW5lIGJvdGggdGhlIGl0ZW0gdmlld3MgYW5kIHRoZSBkcm9wIGRvd24gdmlld3MuCkBAIC02OSw2ICs2NywyMiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhlIExpc3RWaWV3IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFkYXB0ZXIgaXMgcnVubmluZworICAgICAqIEBwYXJhbSBsYXlvdXQgcmVzb3VyY2UgaWRlbnRpZmllciBvZiBhIGxheW91dCBmaWxlIHRoYXQgZGVmaW5lcyB0aGUgdmlld3MKKyAgICAgKiAgICAgICAgICAgIGZvciB0aGlzIGxpc3QgaXRlbS4gIFVubGVzcyB5b3Ugb3ZlcnJpZGUgdGhlbSBsYXRlciwgdGhpcyB3aWxsCisgICAgICogICAgICAgICAgICBkZWZpbmUgYm90aCB0aGUgaXRlbSB2aWV3cyBhbmQgdGhlIGRyb3AgZG93biB2aWV3cy4KKyAgICAgKiBAcGFyYW0gYyBUaGUgY3Vyc29yIGZyb20gd2hpY2ggdG8gZ2V0IHRoZSBkYXRhLgorICAgICAqIEBwYXJhbSBmbGFncyBmbGFncyB1c2VkIHRvIGRldGVybWluZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGFkYXB0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGxheW91dCwgQ3Vyc29yIGMsIGludCBmbGFncykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBjLCBmbGFncyk7CisgICAgICAgIG1MYXlvdXQgPSBtRHJvcERvd25MYXlvdXQgPSBsYXlvdXQ7CisgICAgICAgIG1JbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEluZmxhdGVzIHZpZXcocykgZnJvbSB0aGUgc3BlY2lmaWVkIFhNTCBmaWxlLgogICAgICAqIAogICAgICAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciNuZXdWaWV3KGFuZHJvaWQuY29udGVudC5Db250ZXh0LApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbEJhckRyYXdhYmxlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsQmFyRHJhd2FibGUuamF2YQppbmRleCAzYjExM2FlLi45M2ExMTc5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsQmFyRHJhd2FibGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsQmFyRHJhd2FibGUuamF2YQpAQCAtMTExLDggKzExMSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBSZWN0IHIgPSBnZXRCb3VuZHMoKTsKLSAgICAgICAgaWYgKGNhbnZhcy5xdWlja1JlamVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgCi0gICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkFBKSkgeworICAgICAgICBpZiAoY2FudmFzLnF1aWNrUmVqZWN0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tLCBDYW52YXMuRWRnZVR5cGUuQUEpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgaWYgKGRyYXdUcmFjaykgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxWaWV3LmphdmEKaW5kZXggOWQ5NzFmNi4uZWI1MjdlYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsVmlldy5qYXZhCkBAIC0xOSwxMSArMTksOCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuRm9jdXNGaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwpAQCAtNTIsNiArNDksOCBAQAogICogd2l0aGluIGEgbGFyZ2VyIGNvbnRhaW5lci4KICAqIAogICogPHA+U2Nyb2xsVmlldyBvbmx5IHN1cHBvcnRzIHZlcnRpY2FsIHNjcm9sbGluZy4KKyAqCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNTY3JvbGxWaWV3X2ZpbGxWaWV3cG9ydAogICovCiBwdWJsaWMgY2xhc3MgU2Nyb2xsVmlldyBleHRlbmRzIEZyYW1lTGF5b3V0IHsKICAgICBzdGF0aWMgZmluYWwgaW50IEFOSU1BVEVEX1NDUk9MTF9HQVAgPSAyNTA7CkBAIC02Miw5ICs2MSw3IEBACiAgICAgcHJpdmF0ZSBsb25nIG1MYXN0U2Nyb2xsOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7Ci0gICAgcHJpdmF0ZSBPdmVyU2Nyb2xsZXIgbVNjcm9sbGVyOwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93VG9wOwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93Qm90dG9tOworICAgIHByaXZhdGUgU2Nyb2xsZXIgbVNjcm9sbGVyOwogCiAgICAgLyoqCiAgICAgICogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZSBtb3ZpbmcgZm9jdXMgb3Vyc2VsdmVzLiBUaGlzIGlzIHNvIHRoZQpAQCAtMTE4LDkgKzExNSw2IEBACiAgICAgcHJpdmF0ZSBpbnQgbU1pbmltdW1WZWxvY2l0eTsKICAgICBwcml2YXRlIGludCBtTWF4aW11bVZlbG9jaXR5OwogICAgIAotICAgIHByaXZhdGUgaW50IG1PdmVyc2Nyb2xsRGlzdGFuY2U7Ci0gICAgcHJpdmF0ZSBpbnQgbU92ZXJmbGluZ0Rpc3RhbmNlOwotCiAgICAgLyoqCiAgICAgICogSUQgb2YgdGhlIGFjdGl2ZSBwb2ludGVyLiBUaGlzIGlzIHVzZWQgdG8gcmV0YWluIGNvbnNpc3RlbmN5IGR1cmluZwogICAgICAqIGRyYWdzL2ZsaW5ncyBpZiBtdWx0aXBsZSBwb2ludGVycyBhcmUgdXNlZC4KQEAgLTE5Myw3ICsxODcsNyBAQAogCiAKICAgICBwcml2YXRlIHZvaWQgaW5pdFNjcm9sbFZpZXcoKSB7Ci0gICAgICAgIG1TY3JvbGxlciA9IG5ldyBPdmVyU2Nyb2xsZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbVNjcm9sbGVyID0gbmV3IFNjcm9sbGVyKGdldENvbnRleHQoKSk7CiAgICAgICAgIHNldEZvY3VzYWJsZSh0cnVlKTsKICAgICAgICAgc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShGT0NVU19BRlRFUl9ERVNDRU5EQU5UUyk7CiAgICAgICAgIHNldFdpbGxOb3REcmF3KGZhbHNlKTsKQEAgLTIwMSw4ICsxOTUsNiBAQAogICAgICAgICBtVG91Y2hTbG9wID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRUb3VjaFNsb3AoKTsKICAgICAgICAgbU1pbmltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWluaW11bUZsaW5nVmVsb2NpdHkoKTsKICAgICAgICAgbU1heGltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWF4aW11bUZsaW5nVmVsb2NpdHkoKTsKLSAgICAgICAgbU92ZXJzY3JvbGxEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcnNjcm9sbERpc3RhbmNlKCk7Ci0gICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcmZsaW5nRGlzdGFuY2UoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTI1Nyw2ICsyNDksOCBAQAogICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgU2Nyb2xsVmlldydzIGNvbnRlbnQgaXMgc3RyZXRjaGVkIHRvIGZpbGwgdGhlIHZpZXdwb3J0LgogICAgICAqCiAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjb250ZW50IGZpbGxzIHRoZSB2aWV3cG9ydCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1Njcm9sbFZpZXdfZmlsbFZpZXdwb3J0CiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNGaWxsVmlld3BvcnQoKSB7CiAgICAgICAgIHJldHVybiBtRmlsbFZpZXdwb3J0OwpAQCAtMjY4LDYgKzI2Miw4IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gZmlsbFZpZXdwb3J0IFRydWUgdG8gc3RyZXRjaCB0aGUgY29udGVudCdzIGhlaWdodCB0byB0aGUgdmlld3BvcnQncwogICAgICAqICAgICAgICBib3VuZGFyaWVzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjU2Nyb2xsVmlld19maWxsVmlld3BvcnQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGaWxsVmlld3BvcnQoYm9vbGVhbiBmaWxsVmlld3BvcnQpIHsKICAgICAgICAgaWYgKGZpbGxWaWV3cG9ydCAhPSBtRmlsbFZpZXdwb3J0KSB7CkBAIC00NjMsOSArNDU5LDYgQEAKICAgICAgICAgICAgICAgICAvKiBSZWxlYXNlIHRoZSBkcmFnICovCiAgICAgICAgICAgICAgICAgbUlzQmVpbmdEcmFnZ2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKLSAgICAgICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ2JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCAwLCAwLCBnZXRTY3JvbGxSYW5nZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUDoKICAgICAgICAgICAgICAgICBvblNlY29uZGFyeVBvaW50ZXJVcChldik7CkBAIC01MjMsMjIgKzUxNiw3IEBACiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBkZWx0YVkgPSAoaW50KSAobUxhc3RNb3Rpb25ZIC0geSk7CiAgICAgICAgICAgICAgICAgICAgIG1MYXN0TW90aW9uWSA9IHk7CiAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG9sZFggPSBtU2Nyb2xsWDsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG9sZFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJhbmdlID0gZ2V0U2Nyb2xsUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJzY3JvbGxCeSgwLCBkZWx0YVksIDAsIG1TY3JvbGxZLCAwLCByYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBtT3ZlcnNjcm9sbERpc3RhbmNlLCB0cnVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnJlYWsgb3VyIHZlbG9jaXR5IGlmIHdlIGhpdCBhIHNjcm9sbCBiYXJyaWVyLgotICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOwotCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBwdWxsZWRUb1kgPSBvbGRZICsgZGVsdGFZOwotICAgICAgICAgICAgICAgICAgICBpZiAocHVsbGVkVG9ZIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uUHVsbCgoZmxvYXQpIGRlbHRhWSAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwdWxsZWRUb1kgPiByYW5nZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uUHVsbCgoZmxvYXQpIGRlbHRhWSAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzY3JvbGxCeSgwLCBkZWx0YVkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOiAKQEAgLTU0NywxNSArNTI1LDggQEAKICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlUcmFja2VyLmNvbXB1dGVDdXJyZW50VmVsb2NpdHkoMTAwMCwgbU1heGltdW1WZWxvY2l0eSk7CiAgICAgICAgICAgICAgICAgICAgIGludCBpbml0aWFsVmVsb2NpdHkgPSAoaW50KSB2ZWxvY2l0eVRyYWNrZXIuZ2V0WVZlbG9jaXR5KG1BY3RpdmVQb2ludGVySWQpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChnZXRDaGlsZENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKE1hdGguYWJzKGluaXRpYWxWZWxvY2l0eSkgPiBtTWluaW11bVZlbG9jaXR5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaW5nKC1pbml0aWFsVmVsb2NpdHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYm90dG9tID0gZ2V0U2Nyb2xsUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ2JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCAwLCAwLCBib3R0b20pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRDaGlsZENvdW50KCkgPiAwICYmIE1hdGguYWJzKGluaXRpYWxWZWxvY2l0eSkgPiBtTWluaW11bVZlbG9jaXR5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGluZygtaW5pdGlhbFZlbG9jaXR5KTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CkBAIC01NjUsMjcgKzUzNiwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDoKICAgICAgICAgICAgICAgICBpZiAobUlzQmVpbmdEcmFnZ2VkICYmIGdldENoaWxkQ291bnQoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TY3JvbGxlci5zcHJpbmdiYWNrKG1TY3JvbGxYLCBtU2Nyb2xsWSwgMCwgMCwgMCwgZ2V0U2Nyb2xsUmFuZ2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOwogICAgICAgICAgICAgICAgICAgICBtSXNCZWluZ0RyYWdnZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1WZWxvY2l0eVRyYWNrZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVA6CkBAIC02MTIsMzIgKzU3Miw2IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25PdmVyc2Nyb2xsZWQoaW50IHNjcm9sbFgsIGludCBzY3JvbGxZLAotICAgICAgICAgICAgYm9vbGVhbiBjbGFtcGVkWCwgYm9vbGVhbiBjbGFtcGVkWSkgewotICAgICAgICAvLyBUcmVhdCBhbmltYXRpbmcgc2Nyb2xscyBkaWZmZXJlbnRseTsgc2VlICNjb21wdXRlU2Nyb2xsKCkgZm9yIHdoeS4KLSAgICAgICAgaWYgKCFtU2Nyb2xsZXIuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICBtU2Nyb2xsWCA9IHNjcm9sbFg7Ci0gICAgICAgICAgICBtU2Nyb2xsWSA9IHNjcm9sbFk7Ci0gICAgICAgICAgICBpZiAoY2xhbXBlZFkpIHsKLSAgICAgICAgICAgICAgICBtU2Nyb2xsZXIuc3ByaW5nYmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsIDAsIDAsIGdldFNjcm9sbFJhbmdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuc2Nyb2xsVG8oc2Nyb2xsWCwgc2Nyb2xsWSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXdha2VuU2Nyb2xsQmFycygpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFNjcm9sbFJhbmdlKCkgewotICAgICAgICBpbnQgc2Nyb2xsUmFuZ2UgPSAwOwotICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoMCk7Ci0gICAgICAgICAgICBzY3JvbGxSYW5nZSA9IE1hdGgubWF4KDAsCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldEhlaWdodCgpIC0gZ2V0SGVpZ2h0KCkgLSBtUGFkZGluZ0JvdHRvbSAtIG1QYWRkaW5nVG9wKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2Nyb2xsUmFuZ2U7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogPHA+CiAgICAgICogRmluZHMgdGhlIG5leHQgZm9jdXNhYmxlIGNvbXBvbmVudCB0aGF0IGZpdHMgaW4gdGhpcyBWaWV3J3MgYm91bmRzCkBAIC0xMDE0LDE2ICs5NDgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRIZWlnaHQ7CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGludCBzY3JvbGxSYW5nZSA9IGdldENoaWxkQXQoMCkuZ2V0Qm90dG9tKCk7Ci0gICAgICAgIGZpbmFsIGludCBzY3JvbGxZID0gbVNjcm9sbFk7Ci0gICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsQm90dG9tID0gTWF0aC5tYXgoMCwgc2Nyb2xsUmFuZ2UgLSBjb250ZW50SGVpZ2h0KTsKLSAgICAgICAgaWYgKHNjcm9sbFkgPCAwKSB7Ci0gICAgICAgICAgICBzY3JvbGxSYW5nZSAtPSBzY3JvbGxZOwotICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbFkgPiBvdmVyc2Nyb2xsQm90dG9tKSB7Ci0gICAgICAgICAgICBzY3JvbGxSYW5nZSArPSBzY3JvbGxZIC0gb3ZlcnNjcm9sbEJvdHRvbTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzY3JvbGxSYW5nZTsKKyAgICAgICAgcmV0dXJuIGdldENoaWxkQXQoMCkuZ2V0Qm90dG9tKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMDg0LDE2ICsxMDA5LDE0IEBACiAgICAgICAgICAgICBpbnQgeCA9IG1TY3JvbGxlci5nZXRDdXJyWCgpOwogICAgICAgICAgICAgaW50IHkgPSBtU2Nyb2xsZXIuZ2V0Q3VyclkoKTsKIAotICAgICAgICAgICAgaWYgKG9sZFggIT0geCB8fCBvbGRZICE9IHkpIHsKLSAgICAgICAgICAgICAgICBvdmVyc2Nyb2xsQnkoeCAtIG9sZFgsIHkgLSBvbGRZLCBvbGRYLCBvbGRZLCAwLCBnZXRTY3JvbGxSYW5nZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgbU92ZXJmbGluZ0Rpc3RhbmNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgb25TY3JvbGxDaGFuZ2VkKG1TY3JvbGxYLCBtU2Nyb2xsWSwgb2xkWCwgb2xkWSk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmFuZ2UgPSBnZXRTY3JvbGxSYW5nZSgpOwotICAgICAgICAgICAgICAgIGlmICh5IDwgMCAmJiBvbGRZID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uQWJzb3JiKChpbnQpIG1TY3JvbGxlci5nZXRDdXJyVmVsb2NpdHkoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5ID4gcmFuZ2UgJiYgb2xkWSA8PSByYW5nZSkgewotICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25BYnNvcmIoKGludCkgbVNjcm9sbGVyLmdldEN1cnJWZWxvY2l0eSgpKTsKKyAgICAgICAgICAgIGlmIChnZXRDaGlsZENvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoMCk7CisgICAgICAgICAgICAgICAgeCA9IGNsYW1wKHgsIGdldFdpZHRoKCkgLSBtUGFkZGluZ1JpZ2h0IC0gbVBhZGRpbmdMZWZ0LCBjaGlsZC5nZXRXaWR0aCgpKTsKKyAgICAgICAgICAgICAgICB5ID0gY2xhbXAoeSwgZ2V0SGVpZ2h0KCkgLSBtUGFkZGluZ0JvdHRvbSAtIG1QYWRkaW5nVG9wLCBjaGlsZC5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgaWYgKHggIT0gb2xkWCB8fCB5ICE9IG9sZFkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFggPSB4OworICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsWSA9IHk7CisgICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZCh4LCB5LCBvbGRYLCBvbGRZKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhd2FrZW5TY3JvbGxCYXJzKCk7CkBAIC0xMzMxLDcgKzEyNTQsNyBAQAogICAgICAgICAgICAgaW50IGJvdHRvbSA9IGdldENoaWxkQXQoMCkuZ2V0SGVpZ2h0KCk7CiAgICAgCiAgICAgICAgICAgICBtU2Nyb2xsZXIuZmxpbmcobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCB2ZWxvY2l0eVksIDAsIDAsIDAsIAotICAgICAgICAgICAgICAgICAgICBNYXRoLm1heCgwLCBib3R0b20gLSBoZWlnaHQpLCAwLCBoZWlnaHQvMik7CisgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KDAsIGJvdHRvbSAtIGhlaWdodCkpOwogICAgIAogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBtb3ZpbmdEb3duID0gdmVsb2NpdHlZID4gMDsKICAgICAKQEAgLTEzNjksNTUgKzEyOTIsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcnNjcm9sbE1vZGUoaW50IG1vZGUpIHsKLSAgICAgICAgaWYgKG1vZGUgIT0gT1ZFUlNDUk9MTF9ORVZFUikgewotICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBlZGdlID0gcmVzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuZWRnZV9saWdodCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgZ2xvdyA9IHJlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLm92ZXJzY3JvbGxfZ2xvdyk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wID0gbmV3IEVkZ2VHbG93KGVkZ2UsIGdsb3cpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbSA9IG5ldyBFZGdlR2xvdyhlZGdlLCBnbG93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1FZGdlR2xvd1RvcCA9IG51bGw7Ci0gICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20gPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLnNldE92ZXJzY3JvbGxNb2RlKG1vZGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBzdXBlci5kcmF3KGNhbnZhcyk7Ci0gICAgICAgIGlmIChtRWRnZUdsb3dUb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgaW50IHNjcm9sbFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgIGlmICghbUVkZ2VHbG93VG9wLmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGdldFdpZHRoKCk7Ci0KLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC13aWR0aCAvIDIsIHNjcm9sbFkpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5zZXRTaXplKHdpZHRoICogMiwgZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgIGlmIChtRWRnZUdsb3dUb3AuZHJhdyhjYW52YXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGdlR2xvd0JvdHRvbS5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVzdG9yZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBnZXRXaWR0aCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBnZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXdpZHRoIC8gMiwgc2Nyb2xsWSArIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJvdGF0ZSgxODAsIHdpZHRoLCAwKTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20uc2V0U2l6ZSh3aWR0aCAqIDIsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd0JvdHRvbS5kcmF3KGNhbnZhcykpIHsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQocmVzdG9yZUNvdW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIHByaXZhdGUgaW50IGNsYW1wKGludCBuLCBpbnQgbXksIGludCBjaGlsZCkgewogICAgICAgICBpZiAobXkgPj0gY2hpbGQgfHwgbiA8IDApIHsKICAgICAgICAgICAgIC8qIG15ID49IGNoaWxkIGlzIHRoaXMgY2FzZToKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbGVyLmphdmEKaW5kZXggMjNmNzJiNi4uNGNiMDgzOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbGVyLmphdmEKQEAgLTUwLDYgKzUwLDggQEAKICAgICBwcml2YXRlIGZsb2F0IG1EdXJhdGlvblJlY2lwcm9jYWw7CiAgICAgcHJpdmF0ZSBmbG9hdCBtRGVsdGFYOwogICAgIHByaXZhdGUgZmxvYXQgbURlbHRhWTsKKyAgICBwcml2YXRlIGZsb2F0IG1WaXNjb3VzRmx1aWRTY2FsZTsKKyAgICBwcml2YXRlIGZsb2F0IG1WaXNjb3VzRmx1aWROb3JtYWxpemU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1GaW5pc2hlZDsKICAgICBwcml2YXRlIEludGVycG9sYXRvciBtSW50ZXJwb2xhdG9yOwogCkBAIC02MywxNyArNjUsNiBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBtRGVjZWxlcmF0aW9uOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgc1Zpc2NvdXNGbHVpZFNjYWxlOwotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IHNWaXNjb3VzRmx1aWROb3JtYWxpemU7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICAvLyBUaGlzIGNvbnRyb2xzIHRoZSB2aXNjb3VzIGZsdWlkIGVmZmVjdCAoaG93IG11Y2ggb2YgaXQpCi0gICAgICAgIHNWaXNjb3VzRmx1aWRTY2FsZSA9IDguMGY7Ci0gICAgICAgIC8vIG11c3QgYmUgc2V0IHRvIDEuMCAodXNlZCBpbiB2aXNjb3VzRmx1aWQoKSkKLSAgICAgICAgc1Zpc2NvdXNGbHVpZE5vcm1hbGl6ZSA9IDEuMGY7Ci0gICAgICAgIHNWaXNjb3VzRmx1aWROb3JtYWxpemUgPSAxLjBmIC8gdmlzY291c0ZsdWlkKDEuMGYpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIFNjcm9sbGVyIHdpdGggdGhlIGRlZmF1bHQgZHVyYXRpb24gYW5kIGludGVycG9sYXRvci4KICAgICAgKi8KQEAgLTI4Niw2ICsyNzcsMTEgQEAKICAgICAgICAgbURlbHRhWCA9IGR4OwogICAgICAgICBtRGVsdGFZID0gZHk7CiAgICAgICAgIG1EdXJhdGlvblJlY2lwcm9jYWwgPSAxLjBmIC8gKGZsb2F0KSBtRHVyYXRpb247CisgICAgICAgIC8vIFRoaXMgY29udHJvbHMgdGhlIHZpc2NvdXMgZmx1aWQgZWZmZWN0IChob3cgbXVjaCBvZiBpdCkKKyAgICAgICAgbVZpc2NvdXNGbHVpZFNjYWxlID0gOC4wZjsKKyAgICAgICAgLy8gbXVzdCBiZSBzZXQgdG8gMS4wICh1c2VkIGluIHZpc2NvdXNGbHVpZCgpKQorICAgICAgICBtVmlzY291c0ZsdWlkTm9ybWFsaXplID0gMS4wZjsKKyAgICAgICAgbVZpc2NvdXNGbHVpZE5vcm1hbGl6ZSA9IDEuMGYgLyB2aXNjb3VzRmx1aWQoMS4wZik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNDMsOSArMzM5LDExIEBACiAgICAgICAgIG1GaW5hbFkgPSBNYXRoLm1heChtRmluYWxZLCBtTWluWSk7CiAgICAgfQogICAgIAotICAgIHN0YXRpYyBmbG9hdCB2aXNjb3VzRmx1aWQoZmxvYXQgeCkKKyAgICAKKyAgICAKKyAgICBwcml2YXRlIGZsb2F0IHZpc2NvdXNGbHVpZChmbG9hdCB4KQogICAgIHsKLSAgICAgICAgeCAqPSBzVmlzY291c0ZsdWlkU2NhbGU7CisgICAgICAgIHggKj0gbVZpc2NvdXNGbHVpZFNjYWxlOwogICAgICAgICBpZiAoeCA8IDEuMGYpIHsKICAgICAgICAgICAgIHggLT0gKDEuMGYgLSAoZmxvYXQpTWF0aC5leHAoLXgpKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTM1Myw3ICszNTEsNyBAQAogICAgICAgICAgICAgeCA9IDEuMGYgLSAoZmxvYXQpTWF0aC5leHAoMS4wZiAtIHgpOwogICAgICAgICAgICAgeCA9IHN0YXJ0ICsgeCAqICgxLjBmIC0gc3RhcnQpOwogICAgICAgICB9Ci0gICAgICAgIHggKj0gc1Zpc2NvdXNGbHVpZE5vcm1hbGl6ZTsKKyAgICAgICAgeCAqPSBtVmlzY291c0ZsdWlkTm9ybWFsaXplOwogICAgICAgICByZXR1cm4geDsKICAgICB9CiAgICAgCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2ltcGxlQ3Vyc29yQWRhcHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NpbXBsZUN1cnNvckFkYXB0ZXIuamF2YQppbmRleCA3ZDM0NTllLi5kMWMyMjcwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2ltcGxlQ3Vyc29yQWRhcHRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TaW1wbGVDdXJzb3JBZGFwdGVyLmphdmEKQEAgLTYyLDcgKzYyLDggQEAKICAgICBwcml2YXRlIGludCBtU3RyaW5nQ29udmVyc2lvbkNvbHVtbiA9IC0xOwogICAgIHByaXZhdGUgQ3Vyc29yVG9TdHJpbmdDb252ZXJ0ZXIgbUN1cnNvclRvU3RyaW5nQ29udmVydGVyOwogICAgIHByaXZhdGUgVmlld0JpbmRlciBtVmlld0JpbmRlcjsKLSAgICBwcml2YXRlIFN0cmluZ1tdIG1PcmlnaW5hbEZyb207CisKKyAgICBTdHJpbmdbXSBtT3JpZ2luYWxGcm9tOwogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0b3IuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3Bpbm5lci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NwaW5uZXIuamF2YQppbmRleCA4ZGRiMDZjLi41OGMyNjEzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3Bpbm5lci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGlubmVyLmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIApAQCAtNDAsMTAgKzQxLDIxIEBACiAgKi8KIEBXaWRnZXQKIHB1YmxpYyBjbGFzcyBTcGlubmVyIGV4dGVuZHMgQWJzU3Bpbm5lciBpbXBsZW1lbnRzIE9uQ2xpY2tMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTcGlubmVyIjsKICAgICAKLSAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtUHJvbXB0OwotICAgIHByaXZhdGUgQWxlcnREaWFsb2cgbVBvcHVwOwotCisgICAgLyoqCisgICAgICogVXNlIGEgZGlhbG9nIHdpbmRvdyBmb3Igc2VsZWN0aW5nIHNwaW5uZXIgb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RJQUxPRyA9IDA7CisgICAgCisgICAgLyoqCisgICAgICogVXNlIGEgZHJvcGRvd24gYW5jaG9yZWQgdG8gdGhlIFNwaW5uZXIgZm9yIHNlbGVjdGluZyBzcGlubmVyIG9wdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9EUk9QRE9XTiA9IDE7CisgICAgCisgICAgcHJpdmF0ZSBTcGlubmVyUG9wdXAgbVBvcHVwOworICAgIHByaXZhdGUgRHJvcERvd25BZGFwdGVyIG1UZW1wQWRhcHRlcjsKKyAgICAKICAgICBwdWJsaWMgU3Bpbm5lcihDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKICAgICB9CkBAIC01OCw5ICs3MCw1NCBAQAogICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lciwgZGVmU3R5bGUsIDApOwogICAgICAgICAKLSAgICAgICAgbVByb21wdCA9IGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfcHJvbXB0KTsKKyAgICAgICAgZmluYWwgaW50IG1vZGUgPSBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyX3NwaW5uZXJNb2RlLAorICAgICAgICAgICAgICAgIE1PREVfRElBTE9HKTsKKyAgICAgICAgCisgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIE1PREVfRElBTE9HOiB7CisgICAgICAgICAgICBtUG9wdXAgPSBuZXcgRGlhbG9nUG9wdXAoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNT0RFX0RST1BET1dOOiB7CisgICAgICAgICAgICBmaW5hbCBpbnQgaGludFJlc291cmNlID0gYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyX3BvcHVwUHJvbXB0VmlldywgMCk7CisKKyAgICAgICAgICAgIERyb3Bkb3duUG9wdXAgcG9wdXAgPSBuZXcgRHJvcGRvd25Qb3B1cChjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIGhpbnRSZXNvdXJjZSk7CisKKyAgICAgICAgICAgIHBvcHVwLnNldEJhY2tncm91bmREcmF3YWJsZShhLmdldERyYXdhYmxlKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyX3BvcHVwQmFja2dyb3VuZCkpOworICAgICAgICAgICAgcG9wdXAuc2V0VmVydGljYWxPZmZzZXQoYS5nZXREaW1lbnNpb25QaXhlbE9mZnNldCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lcl9kcm9wRG93blZlcnRpY2FsT2Zmc2V0LCAwKSk7CisgICAgICAgICAgICBwb3B1cC5zZXRIb3Jpem9udGFsT2Zmc2V0KGEuZ2V0RGltZW5zaW9uUGl4ZWxPZmZzZXQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0LCAwKSk7CisKKyAgICAgICAgICAgIG1Qb3B1cCA9IHBvcHVwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbVBvcHVwLnNldFByb21wdFRleHQoYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lcl9wcm9tcHQpKTsKIAogICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAvLyBCYXNlIGNvbnN0cnVjdG9yIGNhbiBjYWxsIHNldEFkYXB0ZXIgYmVmb3JlIHdlIGluaXRpYWxpemUgbVBvcHVwLgorICAgICAgICAvLyBGaW5pc2ggc2V0dGluZyB0aGluZ3MgdXAgaWYgdGhpcyBoYXBwZW5lZC4KKyAgICAgICAgaWYgKG1UZW1wQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtUG9wdXAuc2V0QWRhcHRlcihtVGVtcEFkYXB0ZXIpOworICAgICAgICAgICAgbVRlbXBBZGFwdGVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKFNwaW5uZXJBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgc3VwZXIuc2V0QWRhcHRlcihhZGFwdGVyKTsKKworICAgICAgICBpZiAobVBvcHVwICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRBZGFwdGVyKG5ldyBEcm9wRG93bkFkYXB0ZXIoYWRhcHRlcikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRlbXBBZGFwdGVyID0gbmV3IERyb3BEb3duQWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtODcsNyArMTQ0LDYgQEAKICAgICAgICAgCiAgICAgICAgIGlmIChtUG9wdXAgIT0gbnVsbCAmJiBtUG9wdXAuaXNTaG93aW5nKCkpIHsKICAgICAgICAgICAgIG1Qb3B1cC5kaXNtaXNzKCk7Ci0gICAgICAgICAgICBtUG9wdXAgPSBudWxsOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xOTcsOCArMjUzLDYgQEAKICAgICAgICAgcmV0dXJuIGNoaWxkOwogICAgIH0KIAotCi0KICAgICAvKioKICAgICAgKiBIZWxwZXIgZm9yIG1ha2VBbmRBZGRWaWV3IHRvIHNldCB0aGUgcG9zaXRpb24gb2YgYSB2aWV3CiAgICAgICogYW5kIGZpbGwgb3V0IGl0cyBsYXlvdXQgcGFyYW10ZXJzLgpAQCAtMjQ5LDE1ICszMDMsMTAgQEAKICAgICAgICAgCiAgICAgICAgIGlmICghaGFuZGxlZCkgewogICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7Ci0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIERyb3BEb3duQWRhcHRlciBhZGFwdGVyID0gbmV3IERyb3BEb3duQWRhcHRlcihnZXRBZGFwdGVyKCkpOwogCi0gICAgICAgICAgICBBbGVydERpYWxvZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihjb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChtUHJvbXB0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLnNldFRpdGxlKG1Qcm9tcHQpOworICAgICAgICAgICAgaWYgKCFtUG9wdXAuaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgICAgICBtUG9wdXAuc2hvdygpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBvcHVwID0gYnVpbGRlci5zZXRTaW5nbGVDaG9pY2VJdGVtcyhhZGFwdGVyLCBnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpLCB0aGlzKS5zaG93KCk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gaGFuZGxlZDsKQEAgLTI2Niw3ICszMTUsNiBAQAogICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7CiAgICAgICAgIHNldFNlbGVjdGlvbih3aGljaCk7CiAgICAgICAgIGRpYWxvZy5kaXNtaXNzKCk7Ci0gICAgICAgIG1Qb3B1cCA9IG51bGw7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNzQsNyArMzIyLDcgQEAKICAgICAgKiBAcGFyYW0gcHJvbXB0IHRoZSBwcm9tcHQgdG8gc2V0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UHJvbXB0KENoYXJTZXF1ZW5jZSBwcm9tcHQpIHsKLSAgICAgICAgbVByb21wdCA9IHByb21wdDsKKyAgICAgICAgbVBvcHVwLnNldFByb21wdFRleHQocHJvbXB0KTsKICAgICB9CiAKICAgICAvKioKQEAgLTI4MiwxNCArMzMwLDE0IEBACiAgICAgICogQHBhcmFtIHByb21wdElkIHRoZSByZXNvdXJjZSBJRCBvZiB0aGUgcHJvbXB0IHRvIGRpc3BsYXkgd2hlbiB0aGUgZGlhbG9nIGlzIHNob3duCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UHJvbXB0SWQoaW50IHByb21wdElkKSB7Ci0gICAgICAgIG1Qcm9tcHQgPSBnZXRDb250ZXh0KCkuZ2V0VGV4dChwcm9tcHRJZCk7CisgICAgICAgIHNldFByb21wdChnZXRDb250ZXh0KCkuZ2V0VGV4dChwcm9tcHRJZCkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEByZXR1cm4gVGhlIHByb21wdCB0byBkaXNwbGF5IHdoZW4gdGhlIGRpYWxvZyBpcyBzaG93bgogICAgICAqLwogICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0UHJvbXB0KCkgewotICAgICAgICByZXR1cm4gbVByb21wdDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRIaW50VGV4dCgpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTM4Nyw0ICs0MzUsMTI0IEBACiAgICAgICAgICAgICByZXR1cm4gZ2V0Q291bnQoKSA9PSAwOwogICAgICAgICB9CiAgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEltcGxlbWVudHMgc29tZSBzb3J0IG9mIHBvcHVwIHNlbGVjdGlvbiBpbnRlcmZhY2UgZm9yIHNlbGVjdGluZyBhIHNwaW5uZXIgb3B0aW9uLgorICAgICAqIEFsbG93cyBmb3IgZGlmZmVyZW50IHNwaW5uZXIgbW9kZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgU3Bpbm5lclBvcHVwIHsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihMaXN0QWRhcHRlciBhZGFwdGVyKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBTaG93IHRoZSBwb3B1cAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2hvdygpOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIERpc21pc3MgdGhlIHBvcHVwCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCk7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwb3B1cCBpcyBzaG93aW5nLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Nob3dpbmcoKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgaGludCB0ZXh0IHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci4gVGhpcyBzaG91bGQgcHJvdmlkZQorICAgICAgICAgKiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjaG9pY2UgYmVpbmcgbWFkZS4KKyAgICAgICAgICogQHBhcmFtIGhpbnRUZXh0IEhpbnQgdGV4dCB0byBzZXQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9tcHRUZXh0KENoYXJTZXF1ZW5jZSBoaW50VGV4dCk7CisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0SGludFRleHQoKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBjbGFzcyBEaWFsb2dQb3B1cCBpbXBsZW1lbnRzIFNwaW5uZXJQb3B1cCwgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgQWxlcnREaWFsb2cgbVBvcHVwOworICAgICAgICBwcml2YXRlIExpc3RBZGFwdGVyIG1MaXN0QWRhcHRlcjsKKyAgICAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVByb21wdDsKKworICAgICAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICAgICAgbVBvcHVwLmRpc21pc3MoKTsKKyAgICAgICAgICAgIG1Qb3B1cCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Nob3dpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbVBvcHVwICE9IG51bGwgPyBtUG9wdXAuaXNTaG93aW5nKCkgOiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICAgICAgbUxpc3RBZGFwdGVyID0gYWRhcHRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFRleHQoQ2hhclNlcXVlbmNlIGhpbnRUZXh0KSB7CisgICAgICAgICAgICBtUHJvbXB0ID0gaGludFRleHQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0SGludFRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVByb21wdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgICAgICBBbGVydERpYWxvZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgaWYgKG1Qcm9tcHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0VGl0bGUobVByb21wdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUG9wdXAgPSBidWlsZGVyLnNldFNpbmdsZUNob2ljZUl0ZW1zKG1MaXN0QWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSwgdGhpcykuc2hvdygpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgeworICAgICAgICAgICAgc2V0U2VsZWN0aW9uKHdoaWNoKTsKKyAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGNsYXNzIERyb3Bkb3duUG9wdXAgZXh0ZW5kcyBMaXN0UG9wdXBXaW5kb3cgaW1wbGVtZW50cyBTcGlubmVyUG9wdXAgeworICAgICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtSGludFRleHQ7CisgICAgICAgIHByaXZhdGUgVGV4dFZpZXcgbUhpbnRWaWV3OworICAgICAgICBwcml2YXRlIGludCBtSGludFJlc291cmNlOworICAgICAgICAKKyAgICAgICAgcHVibGljIERyb3Bkb3duUG9wdXAoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsCisgICAgICAgICAgICAgICAgaW50IGRlZlN0eWxlUmVzLCBpbnQgaGludFJlc291cmNlKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgMCwgZGVmU3R5bGVSZXMpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtSGludFJlc291cmNlID0gaGludFJlc291cmNlOworICAgICAgICAgICAgCisgICAgICAgICAgICBzZXRBbmNob3JWaWV3KFNwaW5uZXIudGhpcyk7CisgICAgICAgICAgICBzZXRNb2RhbCh0cnVlKTsKKyAgICAgICAgICAgIHNldFByb21wdFBvc2l0aW9uKFBPU0lUSU9OX1BST01QVF9CRUxPVyk7CisgICAgICAgICAgICBzZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG5ldyBPbkl0ZW1DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3IHBhcmVudCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgU3Bpbm5lci50aGlzLnNldFNlbGVjdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRIaW50VGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSGludFRleHQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFRleHQoQ2hhclNlcXVlbmNlIGhpbnRUZXh0KSB7CisgICAgICAgICAgICBtSGludFRleHQgPSBoaW50VGV4dDsKKyAgICAgICAgICAgIGlmIChtSGludFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1IaW50Vmlldy5zZXRUZXh0KGhpbnRUZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICAgICAgaWYgKG1IaW50VmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVGV4dFZpZXcgdGV4dFZpZXcgPSAoVGV4dFZpZXcpIExheW91dEluZmxhdGVyLmZyb20oZ2V0Q29udGV4dCgpKS5pbmZsYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgbUhpbnRSZXNvdXJjZSwgbnVsbCkuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQudGV4dDEpOworICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHQobUhpbnRUZXh0KTsKKyAgICAgICAgICAgICAgICBzZXRQcm9tcHRWaWV3KHRleHRWaWV3KTsKKyAgICAgICAgICAgICAgICBtSGludFZpZXcgPSB0ZXh0VmlldzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cGVyLnNob3coKTsKKyAgICAgICAgICAgIGdldExpc3RWaWV3KCkuc2V0Q2hvaWNlTW9kZShMaXN0Vmlldy5DSE9JQ0VfTU9ERV9TSU5HTEUpOworICAgICAgICAgICAgc2V0U2VsZWN0aW9uKFNwaW5uZXIudGhpcy5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TdGFja1ZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TdGFja1ZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODE2YjM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1N0YWNrVmlldy5qYXZhCkBAIC0wLDAgKzEsODUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmVsb2NpdHlUcmFja2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uTGluZWFySW50ZXJwb2xhdG9yOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzLlJlbW90ZVZpZXc7CisKK0BSZW1vdGVWaWV3CisvKioKKyAqIEEgdmlldyB0aGF0IGRpc3BsYXlzIGl0cyBjaGlsZHJlbiBpbiBhIHN0YWNrIGFuZCBhbGxvd3MgdXNlcnMgdG8gZGlzY3JldGVseSBzd2lwZQorICogdGhyb3VnaCB0aGUgY2hpbGRyZW4uCisgKi8KK3B1YmxpYyBjbGFzcyBTdGFja1ZpZXcgZXh0ZW5kcyBBZGFwdGVyVmlld0FuaW1hdG9yIHsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RhY2tWaWV3IjsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgYW5pbWF0aW9uIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTiA9IDQwMDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBNSU5JTVVNX0FOSU1BVElPTl9EVVJBVElPTiA9IDUwOworCisgICAgLyoqCisgICAgICogVGhlc2Ugc3BlY2lmeSB0aGUgZGlmZmVyZW50IGdlc3R1cmUgc3RhdGVzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFU1RVUkVfTk9ORSA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFU1RVUkVfU0xJREVfVVAgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVNUVVJFX1NMSURFX0RPV04gPSAyOworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIGhvdyBmYXIgeW91IG5lZWQgdG8gc3dpcGUgKHVwIG9yIGRvd24pIGJlZm9yZSBpdAorICAgICAqIHdpbGwgYmUgY29uc2lkZXIgYSBjb21wbGV0ZWQgZ2VzdHVyZSB3aGVuIHlvdSBsaWZ0IHlvdXIgZmluZ2VyCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgU1dJUEVfVEhSRVNIT0xEX1JBVElPID0gMC4zNWY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgU0xJREVfVVBfUkFUSU8gPSAwLjdmOworCisgICAgcHJpdmF0ZSBmaW5hbCBXZWFrSGFzaE1hcDxWaWV3LCBGbG9hdD4gbVJvdGF0aW9ucyA9IG5ldyBXZWFrSGFzaE1hcDxWaWV3LCBGbG9hdD4oKTsKKworICAgIC8qKgorICAgICAqIFNlbnRpbmVsIHZhbHVlIGZvciBubyBjdXJyZW50IGFjdGl2ZSBwb2ludGVyLgorICAgICAqIFVzZWQgYnkge0BsaW5rICNtQWN0aXZlUG9pbnRlcklkfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9QT0lOVEVSID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSB2YXJpYWJsZXMgYXJlIGFsbCByZWxhdGVkIHRvIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRvdWNoIGludGVyYWN0aW9uCisgICAgICogd2l0aCB0aGUgc3RhY2sKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1Jbml0aWFsWTsKKyAgICBwcml2YXRlIGZsb2F0IG1Jbml0aWFsWDsKKyAgICBwcml2YXRlIGludCBtQWN0aXZlUG9pbnRlcklkOworICAgIHByaXZhdGUgaW50IG1ZVmVsb2NpdHkgPSAwOworICAgIHByaXZhdGUgaW50IG1Td2lwZUdlc3R1cmVUeXBlID0gR0VTVFVSRV9OT05FOworICAgIHByaXZhdGUgaW50IG1WaWV3SGVpZ2h0OworICAgIHByaXZhdGUgaW50IG1Td2lwZVRocmVzaG9sZDsKKyAgICBwcml2YXRlIGludCBtVG91Y2hTbG9wOworICAgIHByaXZhdGUgaW50IG1NYXhpbXVtVmVsb2NpdHk7CisgICAgcHJpdmF0ZSBWZWxvY2l0eVRyYWNrZXIgbVZlbG9jaXR5VHJhY2tlcjsKKworICAgIHByaXZhdGUgc3RhdGljIEhvbG9ncmFwaGljSGVscGVyIHNIb2xvZ3JhcGhpY0hlbHBlcjsKKyAgICBwcml2YXRlIEltYWdlVmlldyBtSGlnaGxpZ2h0OworICAgIHByaXZhdGUgU3RhY2tTbGlkZXIgbVN0YWNrU2xpZGVyOworICAgIHByaXZhdGUgYm9vbGVhbiBtRmlyc3RMYXlvdXRIYXBwZW5lZCA9IGZhbHNlOworICAgIHByaXZhdGUgVmlld0dyb3VwIG1BbmNlc3RvckNvbnRhaW5pbmdBbGxDaGlsZHJlbiA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgbUFuY2VzdG9ySGVpZ2h0ID0gMDsKKworICAgIHB1YmxpYyBTdGFja1ZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBpbml0U3RhY2tWaWV3KCk7CisgICAgfQorCisgICAgcHVibGljIFN0YWNrVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIGluaXRTdGFja1ZpZXcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFN0YWNrVmlldygpIHsKKyAgICAgICAgY29uZmlndXJlVmlld0FuaW1hdG9yKDQsIDIsIGZhbHNlKTsKKyAgICAgICAgc2V0U3RhdGljVHJhbnNmb3JtYXRpb25zRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgZmluYWwgVmlld0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IFZpZXdDb25maWd1cmF0aW9uLmdldChnZXRDb250ZXh0KCkpOworICAgICAgICBtVG91Y2hTbG9wID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRUb3VjaFNsb3AoKTsKKyAgICAgICAgbU1heGltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWF4aW11bUZsaW5nVmVsb2NpdHkoKTsKKyAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKKworICAgICAgICBtSGlnaGxpZ2h0ID0gbmV3IEltYWdlVmlldyhnZXRDb250ZXh0KCkpOworICAgICAgICBtSGlnaGxpZ2h0LnNldExheW91dFBhcmFtcyhuZXcgTGF5b3V0UGFyYW1zKG1IaWdobGlnaHQpKTsKKyAgICAgICAgYWRkVmlld0luTGF5b3V0KG1IaWdobGlnaHQsIC0xLCBuZXcgTGF5b3V0UGFyYW1zKG1IaWdobGlnaHQpKTsKKyAgICAgICAgbVN0YWNrU2xpZGVyID0gbmV3IFN0YWNrU2xpZGVyKCk7CisKKyAgICAgICAgaWYgKHNIb2xvZ3JhcGhpY0hlbHBlciA9PSBudWxsKSB7CisgICAgICAgICAgICBzSG9sb2dyYXBoaWNIZWxwZXIgPSBuZXcgSG9sb2dyYXBoaWNIZWxwZXIoKTsKKyAgICAgICAgfQorICAgICAgICBzZXRDbGlwQ2hpbGRyZW4oZmFsc2UpOworICAgICAgICBzZXRDbGlwVG9QYWRkaW5nKGZhbHNlKTsKKworICAgICAgICAvLyBUaGlzIGlzIGEgZmxhZyB0byBpbmRpY2F0ZSB0aGUgdGhlIHN0YWNrIGlzIGxvYWRpbmcgZm9yIHRoZSBmaXJzdCB0aW1lCisgICAgICAgIG1XaGljaENoaWxkID0gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW5pbWF0ZSB0aGUgdmlld3MgYmV0d2VlbiBkaWZmZXJlbnQgcmVsYXRpdmUgaW5kZXhlcyB3aXRoaW4gdGhlIHtAbGluayBBZGFwdGVyVmlld0FuaW1hdG9yfQorICAgICAqLworICAgIHZvaWQgYW5pbWF0ZVZpZXdGb3JUcmFuc2l0aW9uKGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBWaWV3IHZpZXcpIHsKKyAgICAgICAgaWYgKGZyb21JbmRleCA9PSAtMSAmJiB0b0luZGV4ID09IDApIHsKKyAgICAgICAgICAgIC8vIEZhZGUgaXRlbSBpbgorICAgICAgICAgICAgaWYgKHZpZXcuZ2V0QWxwaGEoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgdmlldy5zZXRBbHBoYSgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpZXcuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKworICAgICAgICAgICAgUHJvcGVydHlBbmltYXRvciBmYWRlSW4gPSBuZXcgUHJvcGVydHlBbmltYXRvcihERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgdmlldywgImFscGhhIiwgdmlldy5nZXRBbHBoYSgpLCAxLjBmKTsKKyAgICAgICAgICAgIGZhZGVJbi5zdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCA9PSBtTnVtQWN0aXZlVmlld3MgLSAxICYmIHRvSW5kZXggPT0gbU51bUFjdGl2ZVZpZXdzIC0gMikgeworICAgICAgICAgICAgLy8gU2xpZGUgaXRlbSBpbgorICAgICAgICAgICAgdmlldy5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworCisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSAoTGF5b3V0UGFyYW1zKSB2aWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgaW50IGxhcmdlc3REdXJhdGlvbiA9CisgICAgICAgICAgICAgICAgTWF0aC5yb3VuZChtU3RhY2tTbGlkZXIuZ2V0RHVyYXRpb25Gb3JOZXV0cmFsUG9zaXRpb24oKSpERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTik7CisKKyAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IGxhcmdlc3REdXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChtWVZlbG9jaXR5ICE9IDApIHsKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IDEwMDAqKDAgLSBscC52ZXJ0aWNhbE9mZnNldCkvTWF0aC5hYnMobVlWZWxvY2l0eSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGR1cmF0aW9uID0gTWF0aC5taW4oZHVyYXRpb24sIGxhcmdlc3REdXJhdGlvbik7CisgICAgICAgICAgICBkdXJhdGlvbiA9IE1hdGgubWF4KGR1cmF0aW9uLCBNSU5JTVVNX0FOSU1BVElPTl9EVVJBVElPTik7CisKKyAgICAgICAgICAgIFN0YWNrU2xpZGVyIGFuaW1hdGlvblNsaWRlciA9IG5ldyBTdGFja1NsaWRlcihtU3RhY2tTbGlkZXIpOworICAgICAgICAgICAgUHJvcGVydHlBbmltYXRvciBzbGlkZUluWSA9IG5ldyBQcm9wZXJ0eUFuaW1hdG9yKGR1cmF0aW9uLCBhbmltYXRpb25TbGlkZXIsCisgICAgICAgICAgICAgICAgICAgICJZUHJvZ3Jlc3MiLCBtU3RhY2tTbGlkZXIuZ2V0WVByb2dyZXNzKCksIDApOworICAgICAgICAgICAgc2xpZGVJblkuc2V0SW50ZXJwb2xhdG9yKG5ldyBMaW5lYXJJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBzbGlkZUluWS5zdGFydCgpOworICAgICAgICAgICAgUHJvcGVydHlBbmltYXRvciBzbGlkZUluWCA9IG5ldyBQcm9wZXJ0eUFuaW1hdG9yKGR1cmF0aW9uLCBhbmltYXRpb25TbGlkZXIsCisgICAgICAgICAgICAgICAgICAgICJYUHJvZ3Jlc3MiLCBtU3RhY2tTbGlkZXIuZ2V0WFByb2dyZXNzKCksIDApOworICAgICAgICAgICAgc2xpZGVJblguc2V0SW50ZXJwb2xhdG9yKG5ldyBMaW5lYXJJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBzbGlkZUluWC5zdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCA9PSBtTnVtQWN0aXZlVmlld3MgLSAyICYmIHRvSW5kZXggPT0gbU51bUFjdGl2ZVZpZXdzIC0gMSkgeworICAgICAgICAgICAgLy8gU2xpZGUgaXRlbSBvdXQKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisKKyAgICAgICAgICAgIGludCBsYXJnZXN0RHVyYXRpb24gPSBNYXRoLnJvdW5kKG1TdGFja1NsaWRlci5nZXREdXJhdGlvbkZvck9mZnNjcmVlblBvc2l0aW9uKCkqCisgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQU5JTUFUSU9OX0RVUkFUSU9OKTsKKyAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IGxhcmdlc3REdXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChtWVZlbG9jaXR5ICE9IDApIHsKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IDEwMDAqKGxwLnZlcnRpY2FsT2Zmc2V0ICsgbVZpZXdIZWlnaHQpL01hdGguYWJzKG1ZVmVsb2NpdHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkdXJhdGlvbiA9IE1hdGgubWluKGR1cmF0aW9uLCBsYXJnZXN0RHVyYXRpb24pOworICAgICAgICAgICAgZHVyYXRpb24gPSBNYXRoLm1heChkdXJhdGlvbiwgTUlOSU1VTV9BTklNQVRJT05fRFVSQVRJT04pOworCisgICAgICAgICAgICBTdGFja1NsaWRlciBhbmltYXRpb25TbGlkZXIgPSBuZXcgU3RhY2tTbGlkZXIobVN0YWNrU2xpZGVyKTsKKyAgICAgICAgICAgIFByb3BlcnR5QW5pbWF0b3Igc2xpZGVPdXRZID0gbmV3IFByb3BlcnR5QW5pbWF0b3IoZHVyYXRpb24sIGFuaW1hdGlvblNsaWRlciwKKyAgICAgICAgICAgICAgICAgICAgIllQcm9ncmVzcyIsIG1TdGFja1NsaWRlci5nZXRZUHJvZ3Jlc3MoKSwgMSk7CisgICAgICAgICAgICBzbGlkZU91dFkuc2V0SW50ZXJwb2xhdG9yKG5ldyBMaW5lYXJJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBzbGlkZU91dFkuc3RhcnQoKTsKKyAgICAgICAgICAgIFByb3BlcnR5QW5pbWF0b3Igc2xpZGVPdXRYID0gbmV3IFByb3BlcnR5QW5pbWF0b3IoZHVyYXRpb24sIGFuaW1hdGlvblNsaWRlciwKKyAgICAgICAgICAgICAgICAgICAgIlhQcm9ncmVzcyIsIG1TdGFja1NsaWRlci5nZXRYUHJvZ3Jlc3MoKSwgMCk7CisgICAgICAgICAgICBzbGlkZU91dFguc2V0SW50ZXJwb2xhdG9yKG5ldyBMaW5lYXJJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBzbGlkZU91dFguc3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChmcm9tSW5kZXggPT0gLTEgJiYgdG9JbmRleCA9PSBtTnVtQWN0aXZlVmlld3MgLSAxKSB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyB2aWV3IHRoYXQgaXMgIndhaXRpbmcgaW4gdGhlIHdpbmdzIiBpcyBpbnZpc2libGUKKyAgICAgICAgICAgIHZpZXcuc2V0QWxwaGEoMC4wZik7CisgICAgICAgICAgICB2aWV3LnNldFZpc2liaWxpdHkoSU5WSVNJQkxFKTsKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICBscC5zZXRWZXJ0aWNhbE9mZnNldCgtbVZpZXdIZWlnaHQpOworICAgICAgICB9IGVsc2UgaWYgKHRvSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIC8vIEZhZGUgaXRlbSBvdXQKKyAgICAgICAgICAgIFByb3BlcnR5QW5pbWF0b3IgZmFkZU91dCA9IG5ldyBQcm9wZXJ0eUFuaW1hdG9yKERFRkFVTFRfQU5JTUFUSU9OX0RVUkFUSU9OLAorICAgICAgICAgICAgICAgICAgICB2aWV3LCAiYWxwaGEiLCB2aWV3LmdldEFscGhhKCksIDApOworICAgICAgICAgICAgZmFkZU91dC5zdGFydCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwbHkgYW55IG5lY2Vzc2FyeSB0cmFuZm9ybXMgZm9yIHRoZSBjaGlsZCB0aGF0IGlzIGJlaW5nIGFkZGVkLgorICAgICAqLworICAgIHZvaWQgYXBwbHlUcmFuc2Zvcm1Gb3JDaGlsZEF0SW5kZXgoVmlldyBjaGlsZCwgaW50IHJlbGF0aXZlSW5kZXgpIHsKKyAgICAgICAgaWYgKCFtUm90YXRpb25zLmNvbnRhaW5zS2V5KGNoaWxkKSkgeworICAgICAgICAgICAgZmxvYXQgcm90YXRpb24gPSAoZmxvYXQpIChNYXRoLnJhbmRvbSgpKjI2IC0gMTMpOworICAgICAgICAgICAgbVJvdGF0aW9ucy5wdXQoY2hpbGQsIHJvdGF0aW9uKTsKKyAgICAgICAgICAgIGNoaWxkLnNldFJvdGF0aW9uKHJvdGF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoaWxkIGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgICAgaWYgKHJlbGF0aXZlSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChtUm90YXRpb25zLmNvbnRhaW5zS2V5KGNoaWxkKSkgeworICAgICAgICAgICAgICAgIG1Sb3RhdGlvbnMucmVtb3ZlKGNoaWxkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGRpc3BhdGNoRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgIHN1cGVyLmRpc3BhdGNoRHJhdyhjYW52YXMpOworICAgIH0KKworICAgIC8vIFRPRE86IHJpZ2h0IG5vdywgdGhpcyBjb2RlIHdhbGtzIHVwIHRoZSBoaWVyYXJjaHkgYXMgZmFyIGFzIG5lZWRlZCBhbmQgZGlzYWJsZXMgY2xpcHBpbmcKKyAgICAvLyBzbyB0aGF0IHRoZSBzdGFjaydzIGNoaWxkcmVuIGNhbiBkcmF3IG91dHNpZGUgb2YgdGhlIHN0YWNrJ3MgYm91bmRzLiBUaGlzIGlzIGZpbmUgd2l0aGluCisgICAgLy8gdGhlIGNvbnRleHQgb2Ygd2lkZ2V0cyBpbiB0aGUgbGF1bmNoZXIsIGJ1dCBpcyBkZXN0cnVjdGl2ZSBpbiBnZW5lcmFsLCBhcyB0aGUgY2xpcHBpbmcKKyAgICAvLyB2YWx1ZXMgYXJlIG5vdCBiZWluZyByZXNldC4gRm9yIHRoaXMgdG8gYmUgYSBmdWxsIGZyYW1ld29yayBsZXZlbCB3aWRnZXQsIHdlIHdpbGwgbmVlZAorICAgIC8vIGZyYW1ld29yayBsZXZlbCBzdXBwb3J0IGZvciBkcmF3aW5nIG91dHNpZGUgb2YgYSBwYXJlbnQncyBib3VuZHMuCisgICAgcHJpdmF0ZSB2b2lkIGRpc2FibGVQYXJlbnRhbENsaXBwaW5nKCkgeworICAgICAgICBpZiAobUFuY2VzdG9yQ29udGFpbmluZ0FsbENoaWxkcmVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgIkRpc2FibGluZyBwYXJlbnRhbCBjbGlwcGluZy4iKTsKKyAgICAgICAgICAgIFZpZXdHcm91cCB2ZyA9IHRoaXM7CisgICAgICAgICAgICB3aGlsZSAodmcuZ2V0UGFyZW50KCkgIT0gbnVsbCAmJiB2Zy5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFZpZXdHcm91cCkgeworICAgICAgICAgICAgICAgIGlmICh2ZyA9PSBtQW5jZXN0b3JDb250YWluaW5nQWxsQ2hpbGRyZW4pIGJyZWFrOworICAgICAgICAgICAgICAgIHZnID0gKFZpZXdHcm91cCkgdmcuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgdmcuc2V0Q2xpcENoaWxkcmVuKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB2Zy5zZXRDbGlwVG9QYWRkaW5nKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkxheW91dCgpIHsKKyAgICAgICAgaWYgKCFtRmlyc3RMYXlvdXRIYXBwZW5lZCkgeworICAgICAgICAgICAgbVZpZXdIZWlnaHQgPSBNYXRoLnJvdW5kKFNMSURFX1VQX1JBVElPKmdldE1lYXN1cmVkSGVpZ2h0KCkpOworICAgICAgICAgICAgbVN3aXBlVGhyZXNob2xkID0gTWF0aC5yb3VuZChTV0lQRV9USFJFU0hPTERfUkFUSU8qbVZpZXdIZWlnaHQpOworICAgICAgICAgICAgbUZpcnN0TGF5b3V0SGFwcGVuZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25JbnRlcmNlcHRUb3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIGludCBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgc3dpdGNoKGFjdGlvbiAmIE1vdGlvbkV2ZW50LkFDVElPTl9NQVNLKSB7CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOiB7CisgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVQb2ludGVySWQgPT0gSU5WQUxJRF9QT0lOVEVSKSB7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0aWFsWCA9IGV2LmdldFgoKTsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxZID0gZXYuZ2V0WSgpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gZXYuZ2V0UG9pbnRlcklkKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6IHsKKyAgICAgICAgICAgICAgICBpbnQgcG9pbnRlckluZGV4ID0gZXYuZmluZFBvaW50ZXJJbmRleChtQWN0aXZlUG9pbnRlcklkKTsKKyAgICAgICAgICAgICAgICBpZiAocG9pbnRlckluZGV4ID09IElOVkFMSURfUE9JTlRFUikgeworICAgICAgICAgICAgICAgICAgICAvLyBubyBkYXRhIGZvciBvdXIgcHJpbWFyeSBwb2ludGVyLCB0aGlzIHNob3VsZG4ndCBoYXBwZW4sIGxvZyBpdAorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJFcnJvcjogTm8gZGF0YSBmb3Igb3VyIHByaW1hcnkgcG9pbnRlci4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmbG9hdCBuZXdZID0gZXYuZ2V0WShwb2ludGVySW5kZXgpOworICAgICAgICAgICAgICAgIGZsb2F0IGRlbHRhWSA9IG5ld1kgLSBtSW5pdGlhbFk7CisKKyAgICAgICAgICAgICAgICBiZWdpbkdlc3R1cmVJZk5lZWRlZChkZWx0YVkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUDogeworICAgICAgICAgICAgICAgIG9uU2Vjb25kYXJ5UG9pbnRlclVwKGV2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgorICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOiB7CisgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKKyAgICAgICAgICAgICAgICBtU3dpcGVHZXN0dXJlVHlwZSA9IEdFU1RVUkVfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtU3dpcGVHZXN0dXJlVHlwZSAhPSBHRVNUVVJFX05PTkU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGJlZ2luR2VzdHVyZUlmTmVlZGVkKGZsb2F0IGRlbHRhWSkgeworICAgICAgICBpZiAoKGludCkgTWF0aC5hYnMoZGVsdGFZKSA+IG1Ub3VjaFNsb3AgJiYgbVN3aXBlR2VzdHVyZVR5cGUgPT0gR0VTVFVSRV9OT05FKSB7CisgICAgICAgICAgICBpbnQgc3dpcGVHZXN0dXJlVHlwZSA9IGRlbHRhWSA8IDAgPyBHRVNUVVJFX1NMSURFX1VQIDogR0VTVFVSRV9TTElERV9ET1dOOworICAgICAgICAgICAgY2FuY2VsTG9uZ1ByZXNzKCk7CisgICAgICAgICAgICByZXF1ZXN0RGlzYWxsb3dJbnRlcmNlcHRUb3VjaEV2ZW50KHRydWUpOworCisgICAgICAgICAgICBpbnQgYWN0aXZlSW5kZXggPSBzd2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTiA/IG1OdW1BY3RpdmVWaWV3cyAtIDEKKyAgICAgICAgICAgICAgICAgICAgOiBtTnVtQWN0aXZlVmlld3MgLSAyOworCisgICAgICAgICAgICBpZiAobUFkYXB0ZXIgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICBpZiAobUN1cnJlbnRXaW5kb3dTdGFydFVuYm91bmRlZCArIGFjdGl2ZUluZGV4ID09IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhY2tTbGlkZXIuc2V0TW9kZShTdGFja1NsaWRlci5CRUdJTk5JTkdfT0ZfU1RBQ0tfTU9ERSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1DdXJyZW50V2luZG93U3RhcnRVbmJvdW5kZWQgKyBhY3RpdmVJbmRleCA9PSBtQWRhcHRlci5nZXRDb3VudCgpKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlSW5kZXgtLTsKKyAgICAgICAgICAgICAgICBtU3RhY2tTbGlkZXIuc2V0TW9kZShTdGFja1NsaWRlci5FTkRfT0ZfU1RBQ0tfTU9ERSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TdGFja1NsaWRlci5zZXRNb2RlKFN0YWNrU2xpZGVyLk5PUk1BTF9NT0RFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVmlldyB2ID0gZ2V0Vmlld0F0UmVsYXRpdmVJbmRleChhY3RpdmVJbmRleCk7CisgICAgICAgICAgICBpZiAodiA9PSBudWxsKSByZXR1cm47CisKKyAgICAgICAgICAgIG1IaWdobGlnaHQuc2V0SW1hZ2VCaXRtYXAoc0hvbG9ncmFwaGljSGVscGVyLmNyZWF0ZU91dGxpbmUodikpOworICAgICAgICAgICAgbUhpZ2hsaWdodC5icmluZ1RvRnJvbnQoKTsKKyAgICAgICAgICAgIHYuYnJpbmdUb0Zyb250KCk7CisgICAgICAgICAgICBtU3RhY2tTbGlkZXIuc2V0Vmlldyh2KTsKKworICAgICAgICAgICAgaWYgKHN3aXBlR2VzdHVyZVR5cGUgPT0gR0VTVFVSRV9TTElERV9ET1dOKQorICAgICAgICAgICAgICAgIHYuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKworICAgICAgICAgICAgLy8gV2Ugb25seSByZWdpc3RlciB0aGlzIGdlc3R1cmUgaWYgd2UndmUgbWFkZSBpdCB0aGlzIGZhciB3aXRob3V0IGEgcHJvYmxlbQorICAgICAgICAgICAgbVN3aXBlR2VzdHVyZVR5cGUgPSBzd2lwZUdlc3R1cmVUeXBlOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIGludCBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgaW50IHBvaW50ZXJJbmRleCA9IGV2LmZpbmRQb2ludGVySW5kZXgobUFjdGl2ZVBvaW50ZXJJZCk7CisgICAgICAgIGlmIChwb2ludGVySW5kZXggPT0gSU5WQUxJRF9QT0lOVEVSKSB7CisgICAgICAgICAgICAvLyBubyBkYXRhIGZvciBvdXIgcHJpbWFyeSBwb2ludGVyLCB0aGlzIHNob3VsZG4ndCBoYXBwZW4sIGxvZyBpdAorICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXJyb3I6IE5vIGRhdGEgZm9yIG91ciBwcmltYXJ5IHBvaW50ZXIuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBuZXdZID0gZXYuZ2V0WShwb2ludGVySW5kZXgpOworICAgICAgICBmbG9hdCBuZXdYID0gZXYuZ2V0WChwb2ludGVySW5kZXgpOworICAgICAgICBmbG9hdCBkZWx0YVkgPSBuZXdZIC0gbUluaXRpYWxZOworICAgICAgICBmbG9hdCBkZWx0YVggPSBuZXdYIC0gbUluaXRpYWxYOworICAgICAgICBpZiAobVZlbG9jaXR5VHJhY2tlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gVmVsb2NpdHlUcmFja2VyLm9idGFpbigpOworICAgICAgICB9CisgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuYWRkTW92ZW1lbnQoZXYpOworCisgICAgICAgIHN3aXRjaCAoYWN0aW9uICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0spIHsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6IHsKKyAgICAgICAgICAgICAgICBiZWdpbkdlc3R1cmVJZk5lZWRlZChkZWx0YVkpOworCisgICAgICAgICAgICAgICAgZmxvYXQgcnggPSBkZWx0YVgvKG1WaWV3SGVpZ2h0KjEuMGYpOworICAgICAgICAgICAgICAgIGlmIChtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX0RPV04pIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgciA9IChkZWx0YVktbVRvdWNoU2xvcCoxLjBmKS9tVmlld0hlaWdodCoxLjBmOworICAgICAgICAgICAgICAgICAgICBtU3RhY2tTbGlkZXIuc2V0WVByb2dyZXNzKDEgLSByKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YWNrU2xpZGVyLnNldFhQcm9ncmVzcyhyeCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVN3aXBlR2VzdHVyZVR5cGUgPT0gR0VTVFVSRV9TTElERV9VUCkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCByID0gLShkZWx0YVkgKyBtVG91Y2hTbG9wKjEuMGYpL21WaWV3SGVpZ2h0KjEuMGY7CisgICAgICAgICAgICAgICAgICAgIG1TdGFja1NsaWRlci5zZXRZUHJvZ3Jlc3Mocik7CisgICAgICAgICAgICAgICAgICAgIG1TdGFja1NsaWRlci5zZXRYUHJvZ3Jlc3MocngpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDogeworICAgICAgICAgICAgICAgIGhhbmRsZVBvaW50ZXJVcChldik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQOiB7CisgICAgICAgICAgICAgICAgb25TZWNvbmRhcnlQb2ludGVyVXAoZXYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOiB7CisgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKKyAgICAgICAgICAgICAgICBtU3dpcGVHZXN0dXJlVHlwZSA9IEdFU1RVUkVfTk9ORTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFJlY3QgdG91Y2hSZWN0ID0gbmV3IFJlY3QoKTsKKyAgICBwcml2YXRlIHZvaWQgb25TZWNvbmRhcnlQb2ludGVyVXAoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgZmluYWwgaW50IGFjdGl2ZVBvaW50ZXJJbmRleCA9IGV2LmdldEFjdGlvbkluZGV4KCk7CisgICAgICAgIGZpbmFsIGludCBwb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQoYWN0aXZlUG9pbnRlckluZGV4KTsKKyAgICAgICAgaWYgKHBvaW50ZXJJZCA9PSBtQWN0aXZlUG9pbnRlcklkKSB7CisKKyAgICAgICAgICAgIGludCBhY3RpdmVWaWV3SW5kZXggPSAobVN3aXBlR2VzdHVyZVR5cGUgPT0gR0VTVFVSRV9TTElERV9ET1dOKSA/IG1OdW1BY3RpdmVWaWV3cyAtIDEKKyAgICAgICAgICAgICAgICAgICAgOiBtTnVtQWN0aXZlVmlld3MgLSAyOworCisgICAgICAgICAgICBWaWV3IHYgPSBnZXRWaWV3QXRSZWxhdGl2ZUluZGV4KGFjdGl2ZVZpZXdJbmRleCk7CisgICAgICAgICAgICBpZiAodiA9PSBudWxsKSByZXR1cm47CisKKyAgICAgICAgICAgIC8vIE91ciBwcmltYXJ5IHBvaW50ZXIgaGFzIGdvbmUgdXAgLS0gbGV0J3Mgc2VlIGlmIHdlIGNhbiBmaW5kCisgICAgICAgICAgICAvLyBhbm90aGVyIHBvaW50ZXIgb24gdGhlIHZpZXcuIElmIHNvLCB0aGVuIHdlIHNob3VsZCByZXBsYWNlCisgICAgICAgICAgICAvLyBvdXIgcHJpbWFyeSBwb2ludGVyIHdpdGggdGhpcyBuZXcgcG9pbnRlciBhbmQgYWRqdXN0IHRoaW5ncworICAgICAgICAgICAgLy8gc28gdGhhdCB0aGUgdmlldyBkb2Vzbid0IGp1bXAKKyAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBldi5nZXRQb2ludGVyQ291bnQoKTsgaW5kZXgrKykgeworICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSBhY3RpdmVQb2ludGVySW5kZXgpIHsKKworICAgICAgICAgICAgICAgICAgICBmbG9hdCB4ID0gZXYuZ2V0WChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHkgPSBldi5nZXRZKGluZGV4KTsKKworICAgICAgICAgICAgICAgICAgICB0b3VjaFJlY3Quc2V0KHYuZ2V0TGVmdCgpLCB2LmdldFRvcCgpLCB2LmdldFJpZ2h0KCksIHYuZ2V0Qm90dG9tKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAodG91Y2hSZWN0LmNvbnRhaW5zKE1hdGgucm91bmQoeCksIE1hdGgucm91bmQoeSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBvbGRYID0gZXYuZ2V0WChhY3RpdmVQb2ludGVySW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgb2xkWSA9IGV2LmdldFkoYWN0aXZlUG9pbnRlckluZGV4KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRqdXN0IG91ciBmcmFtZSBvZiByZWZlcmVuY2UgdG8gYXZvaWQgYSBqdW1wCisgICAgICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbFkgKz0gKHkgLSBvbGRZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0aWFsWCArPSAoeCAtIG9sZFgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gZXYuZ2V0UG9pbnRlcklkKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvaywgd2UncmUgZ29vZCwgd2UgZm91bmQgYSBuZXcgcG9pbnRlciB3aGljaCBpcyB0b3VjaGluZyB0aGUgYWN0aXZlIHZpZXcKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGlmIHdlIG1hZGUgaXQgdGhpcyBmYXIsIGl0IG1lYW5zIHdlIGRpZG4ndCBmaW5kIGEgc2F0aXNmYWN0b3J5IG5ldyBwb2ludGVyIDooLAorICAgICAgICAgICAgLy8gc28gZW5kIHRoZSBnZXN0dXJlCisgICAgICAgICAgICBoYW5kbGVQb2ludGVyVXAoZXYpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVBvaW50ZXJVcChNb3Rpb25FdmVudCBldikgeworICAgICAgICBpbnQgcG9pbnRlckluZGV4ID0gZXYuZmluZFBvaW50ZXJJbmRleChtQWN0aXZlUG9pbnRlcklkKTsKKyAgICAgICAgZmxvYXQgbmV3WSA9IGV2LmdldFkocG9pbnRlckluZGV4KTsKKyAgICAgICAgaW50IGRlbHRhWSA9IChpbnQpIChuZXdZIC0gbUluaXRpYWxZKTsKKworICAgICAgICBpZiAobVZlbG9jaXR5VHJhY2tlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNvbXB1dGVDdXJyZW50VmVsb2NpdHkoMTAwMCwgbU1heGltdW1WZWxvY2l0eSk7CisgICAgICAgICAgICBtWVZlbG9jaXR5ID0gKGludCkgbVZlbG9jaXR5VHJhY2tlci5nZXRZVmVsb2NpdHkobUFjdGl2ZVBvaW50ZXJJZCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVZlbG9jaXR5VHJhY2tlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLnJlY3ljbGUoKTsKKyAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlbHRhWSA+IG1Td2lwZVRocmVzaG9sZCAmJiBtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX0RPV04KKyAgICAgICAgICAgICAgICAmJiBtU3RhY2tTbGlkZXIubU1vZGUgPT0gU3RhY2tTbGlkZXIuTk9STUFMX01PREUpIHsKKyAgICAgICAgICAgIC8vIFN3aXBlIHRocmVzaG9sZCBleGNlZWRlZCwgc3dpcGUgZG93bgorICAgICAgICAgICAgc2hvd05leHQoKTsKKyAgICAgICAgICAgIG1IaWdobGlnaHQuYnJpbmdUb0Zyb250KCk7CisgICAgICAgIH0gZWxzZSBpZiAoZGVsdGFZIDwgLW1Td2lwZVRocmVzaG9sZCAmJiBtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX1VQCisgICAgICAgICAgICAgICAgJiYgbVN0YWNrU2xpZGVyLm1Nb2RlID09IFN0YWNrU2xpZGVyLk5PUk1BTF9NT0RFKSB7CisgICAgICAgICAgICAvLyBTd2lwZSB0aHJlc2hvbGQgZXhjZWVkZWQsIHN3aXBlIHVwCisgICAgICAgICAgICBzaG93UHJldmlvdXMoKTsKKyAgICAgICAgICAgIG1IaWdobGlnaHQuYnJpbmdUb0Zyb250KCk7CisgICAgICAgIH0gZWxzZSBpZiAobVN3aXBlR2VzdHVyZVR5cGUgPT0gR0VTVFVSRV9TTElERV9VUCkgeworICAgICAgICAgICAgLy8gRGlkbid0IHN3aXBlIHVwIGZhciBlbm91Z2gsIHNuYXAgYmFjayBkb3duCisgICAgICAgICAgICBpbnQgZHVyYXRpb24gPQorICAgICAgICAgICAgICAgIE1hdGgucm91bmQobVN0YWNrU2xpZGVyLmdldER1cmF0aW9uRm9yTmV1dHJhbFBvc2l0aW9uKCkqREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT04pOworCisgICAgICAgICAgICBTdGFja1NsaWRlciBhbmltYXRpb25TbGlkZXIgPSBuZXcgU3RhY2tTbGlkZXIobVN0YWNrU2xpZGVyKTsKKyAgICAgICAgICAgIFByb3BlcnR5QW5pbWF0b3Igc25hcEJhY2tZID0gbmV3IFByb3BlcnR5QW5pbWF0b3IoZHVyYXRpb24sIGFuaW1hdGlvblNsaWRlciwKKyAgICAgICAgICAgICAgICAgICAgIllQcm9ncmVzcyIsIG1TdGFja1NsaWRlci5nZXRZUHJvZ3Jlc3MoKSwgMCk7CisgICAgICAgICAgICBzbmFwQmFja1kuc2V0SW50ZXJwb2xhdG9yKG5ldyBMaW5lYXJJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBzbmFwQmFja1kuc3RhcnQoKTsKKyAgICAgICAgICAgIFByb3BlcnR5QW5pbWF0b3Igc25hcEJhY2tYID0gbmV3IFByb3BlcnR5QW5pbWF0b3IoZHVyYXRpb24sIGFuaW1hdGlvblNsaWRlciwKKyAgICAgICAgICAgICAgICAgICAgIlhQcm9ncmVzcyIsIG1TdGFja1NsaWRlci5nZXRYUHJvZ3Jlc3MoKSwgMCk7CisgICAgICAgICAgICBzbmFwQmFja1guc2V0SW50ZXJwb2xhdG9yKG5ldyBMaW5lYXJJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBzbmFwQmFja1guc3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX0RPV04pIHsKKyAgICAgICAgICAgIC8vIERpZG4ndCBzd2lwZSBkb3duIGZhciBlbm91Z2gsIHNuYXAgYmFjayB1cAorICAgICAgICAgICAgaW50IGR1cmF0aW9uID0gTWF0aC5yb3VuZChtU3RhY2tTbGlkZXIuZ2V0RHVyYXRpb25Gb3JPZmZzY3JlZW5Qb3NpdGlvbigpKgorICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTik7CisKKyAgICAgICAgICAgIFN0YWNrU2xpZGVyIGFuaW1hdGlvblNsaWRlciA9IG5ldyBTdGFja1NsaWRlcihtU3RhY2tTbGlkZXIpOworICAgICAgICAgICAgUHJvcGVydHlBbmltYXRvciBzbmFwQmFja1kgPSBuZXcgUHJvcGVydHlBbmltYXRvcihkdXJhdGlvbiwgYW5pbWF0aW9uU2xpZGVyLAorICAgICAgICAgICAgICAgICAgICAiWVByb2dyZXNzIiwgbVN0YWNrU2xpZGVyLmdldFlQcm9ncmVzcygpLCAxKTsKKyAgICAgICAgICAgIHNuYXBCYWNrWS5zZXRJbnRlcnBvbGF0b3IobmV3IExpbmVhckludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgIHNuYXBCYWNrWS5zdGFydCgpOworICAgICAgICAgICAgUHJvcGVydHlBbmltYXRvciBzbmFwQmFja1ggPSBuZXcgUHJvcGVydHlBbmltYXRvcihkdXJhdGlvbiwgYW5pbWF0aW9uU2xpZGVyLAorICAgICAgICAgICAgICAgICAgICAiWFByb2dyZXNzIiwgbVN0YWNrU2xpZGVyLmdldFhQcm9ncmVzcygpLCAwKTsKKyAgICAgICAgICAgIHNuYXBCYWNrWC5zZXRJbnRlcnBvbGF0b3IobmV3IExpbmVhckludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgIHNuYXBCYWNrWC5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKKyAgICAgICAgbVN3aXBlR2VzdHVyZVR5cGUgPSBHRVNUVVJFX05PTkU7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTdGFja1NsaWRlciB7CisgICAgICAgIFZpZXcgbVZpZXc7CisgICAgICAgIGZsb2F0IG1ZUHJvZ3Jlc3M7CisgICAgICAgIGZsb2F0IG1YUHJvZ3Jlc3M7CisKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBOT1JNQUxfTU9ERSA9IDA7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQkVHSU5OSU5HX09GX1NUQUNLX01PREUgPSAxOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IEVORF9PRl9TVEFDS19NT0RFID0gMjsKKworICAgICAgICBpbnQgbU1vZGUgPSBOT1JNQUxfTU9ERTsKKworICAgICAgICBwdWJsaWMgU3RhY2tTbGlkZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RhY2tTbGlkZXIoU3RhY2tTbGlkZXIgY29weSkgeworICAgICAgICAgICAgbVZpZXcgPSBjb3B5Lm1WaWV3OworICAgICAgICAgICAgbVlQcm9ncmVzcyA9IGNvcHkubVlQcm9ncmVzczsKKyAgICAgICAgICAgIG1YUHJvZ3Jlc3MgPSBjb3B5Lm1YUHJvZ3Jlc3M7CisgICAgICAgICAgICBtTW9kZSA9IGNvcHkubU1vZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZsb2F0IGN1YmljKGZsb2F0IHIpIHsKKyAgICAgICAgICAgIHJldHVybiAoZmxvYXQpIChNYXRoLnBvdygyKnItMSwgMykgKyAxKS8yLjBmOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBoaWdobGlnaHRBbHBoYUludGVycG9sYXRvcihmbG9hdCByKSB7CisgICAgICAgICAgICBmbG9hdCBwaXZvdCA9IDAuNGY7CisgICAgICAgICAgICBpZiAociA8IHBpdm90KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDAuODVmKmN1YmljKHIvcGl2b3QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMC44NWYqY3ViaWMoMSAtIChyLXBpdm90KS8oMS1waXZvdCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCB2aWV3QWxwaGFJbnRlcnBvbGF0b3IoZmxvYXQgcikgeworICAgICAgICAgICAgZmxvYXQgcGl2b3QgPSAwLjNmOworICAgICAgICAgICAgaWYgKHIgPiBwaXZvdCkgeworICAgICAgICAgICAgICAgIHJldHVybiAociAtIHBpdm90KS8oMSAtIHBpdm90KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZsb2F0IHJvdGF0aW9uSW50ZXJwb2xhdG9yKGZsb2F0IHIpIHsKKyAgICAgICAgICAgIGZsb2F0IHBpdm90ID0gMC4yZjsKKyAgICAgICAgICAgIGlmIChyIDwgcGl2b3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChyLXBpdm90KS8oMS1waXZvdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldFZpZXcoVmlldyB2KSB7CisgICAgICAgICAgICBtVmlldyA9IHY7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRZUHJvZ3Jlc3MoZmxvYXQgcikgeworICAgICAgICAgICAgLy8gZW5mb3JjZSByIGJldHdlZW4gMCBhbmQgMQorICAgICAgICAgICAgciA9IE1hdGgubWluKDEuMGYsIHIpOworICAgICAgICAgICAgciA9IE1hdGgubWF4KDAsIHIpOworCisgICAgICAgICAgICBtWVByb2dyZXNzID0gcjsKKyAgICAgICAgICAgIGZpbmFsIExheW91dFBhcmFtcyB2aWV3THAgPSAoTGF5b3V0UGFyYW1zKSBtVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgIGZpbmFsIExheW91dFBhcmFtcyBoaWdobGlnaHRMcCA9IChMYXlvdXRQYXJhbXMpIG1IaWdobGlnaHQuZ2V0TGF5b3V0UGFyYW1zKCk7CisKKyAgICAgICAgICAgIHN3aXRjaCAobU1vZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5PUk1BTF9NT0RFOgorICAgICAgICAgICAgICAgICAgICB2aWV3THAuc2V0VmVydGljYWxPZmZzZXQoTWF0aC5yb3VuZCgtciptVmlld0hlaWdodCkpOworICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRMcC5zZXRWZXJ0aWNhbE9mZnNldChNYXRoLnJvdW5kKC1yKm1WaWV3SGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgIG1IaWdobGlnaHQuc2V0QWxwaGEoaGlnaGxpZ2h0QWxwaGFJbnRlcnBvbGF0b3IocikpOworCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0gdmlld0FscGhhSW50ZXJwb2xhdG9yKDEtcik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWFrZSBzdXJlIHRoYXQgdmlld3Mgd2hpY2ggY2FuJ3QgYmUgc2VlbiAoaGF2ZSAwIGFscGhhKSBhcmUgYWxzbyBpbnZpc2libGUKKyAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCB0aGV5IGRvbid0IGludGVyZmVyZSB3aXRoIGNsaWNrIGV2ZW50cy4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWV3LmdldEFscGhhKCkgPT0gMCAmJiBhbHBoYSAhPSAwICYmIG1WaWV3LmdldFZpc2liaWxpdHkoKSAhPSBWSVNJQkxFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVmlldy5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFscGhhID09IDAgJiYgbVZpZXcuZ2V0QWxwaGEoKSAhPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVZpZXcuZ2V0VmlzaWJpbGl0eSgpID09IFZJU0lCTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3LnNldFZpc2liaWxpdHkoSU5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1WaWV3LnNldEFscGhhKGFscGhhKTsKKyAgICAgICAgICAgICAgICAgICAgbVZpZXcuc2V0Um90YXRpb25YKDkwLjBmKnJvdGF0aW9uSW50ZXJwb2xhdG9yKHIpKTsKKyAgICAgICAgICAgICAgICAgICAgbUhpZ2hsaWdodC5zZXRSb3RhdGlvblgoOTAuMGYqcm90YXRpb25JbnRlcnBvbGF0b3IocikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJFR0lOTklOR19PRl9TVEFDS19NT0RFOgorICAgICAgICAgICAgICAgICAgICByID0gciowLjJmOworICAgICAgICAgICAgICAgICAgICB2aWV3THAuc2V0VmVydGljYWxPZmZzZXQoTWF0aC5yb3VuZCgtciptVmlld0hlaWdodCkpOworICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRMcC5zZXRWZXJ0aWNhbE9mZnNldChNYXRoLnJvdW5kKC1yKm1WaWV3SGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgIG1IaWdobGlnaHQuc2V0QWxwaGEoaGlnaGxpZ2h0QWxwaGFJbnRlcnBvbGF0b3IocikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVORF9PRl9TVEFDS19NT0RFOgorICAgICAgICAgICAgICAgICAgICByID0gKDEtcikqMC4yZjsKKyAgICAgICAgICAgICAgICAgICAgdmlld0xwLnNldFZlcnRpY2FsT2Zmc2V0KE1hdGgucm91bmQociptVmlld0hlaWdodCkpOworICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRMcC5zZXRWZXJ0aWNhbE9mZnNldChNYXRoLnJvdW5kKHIqbVZpZXdIZWlnaHQpKTsKKyAgICAgICAgICAgICAgICAgICAgbUhpZ2hsaWdodC5zZXRBbHBoYShoaWdobGlnaHRBbHBoYUludGVycG9sYXRvcihyKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0WFByb2dyZXNzKGZsb2F0IHIpIHsKKyAgICAgICAgICAgIC8vIGVuZm9yY2UgciBiZXR3ZWVuIDAgYW5kIDEKKyAgICAgICAgICAgIHIgPSBNYXRoLm1pbigyLjBmLCByKTsKKyAgICAgICAgICAgIHIgPSBNYXRoLm1heCgtMi4wZiwgcik7CisKKyAgICAgICAgICAgIG1YUHJvZ3Jlc3MgPSByOworCisgICAgICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgdmlld0xwID0gKExheW91dFBhcmFtcykgbVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgaGlnaGxpZ2h0THAgPSAoTGF5b3V0UGFyYW1zKSBtSGlnaGxpZ2h0LmdldExheW91dFBhcmFtcygpOworCisgICAgICAgICAgICByICo9IDAuMmY7CisgICAgICAgICAgICB2aWV3THAuc2V0SG9yaXpvbnRhbE9mZnNldChNYXRoLnJvdW5kKHIqbVZpZXdIZWlnaHQpKTsKKyAgICAgICAgICAgIGhpZ2hsaWdodExwLnNldEhvcml6b250YWxPZmZzZXQoTWF0aC5yb3VuZChyKm1WaWV3SGVpZ2h0KSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgICAgIG1Nb2RlID0gbW9kZTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGdldER1cmF0aW9uRm9yTmV1dHJhbFBvc2l0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldER1cmF0aW9uKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGdldER1cmF0aW9uRm9yT2Zmc2NyZWVuUG9zaXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RHVyYXRpb24obU1vZGUgPT0gRU5EX09GX1NUQUNLX01PREUgPyBmYWxzZSA6IHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBnZXREdXJhdGlvbihib29sZWFuIGludmVydCkgeworICAgICAgICAgICAgaWYgKG1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgdmlld0xwID0gKExheW91dFBhcmFtcykgbVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisKKyAgICAgICAgICAgICAgICBmbG9hdCBkID0gKGZsb2F0KSBNYXRoLnNxcnQoTWF0aC5wb3codmlld0xwLmhvcml6b250YWxPZmZzZXQsMikgKworICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5wb3codmlld0xwLnZlcnRpY2FsT2Zmc2V0LDIpKTsKKyAgICAgICAgICAgICAgICBmbG9hdCBtYXhkID0gKGZsb2F0KSBNYXRoLnNxcnQoTWF0aC5wb3cobVZpZXdIZWlnaHQsIDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgucG93KDAuNGYqbVZpZXdIZWlnaHQsIDIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW52ZXJ0ID8gKDEtZC9tYXhkKSA6IGQvbWF4ZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgZ2V0WVByb2dyZXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1ZUHJvZ3Jlc3M7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBnZXRYUHJvZ3Jlc3MoKSB7CisgICAgICAgICAgICByZXR1cm4gbVhQcm9ncmVzczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCgpIHsKKyAgICAgICAgc3VwZXIub25SZW1vdGVBZGFwdGVyQ29ubmVjdGVkKCk7CisgICAgICAgIC8vIE9uIGZpcnN0IHJ1biwgd2Ugd2FudCB0byBzZXQgdGhlIHN0YWNrIHRvIHRoZSBlbmQuCisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsICYmIG1XaGljaENoaWxkID09IC0xKSB7CisgICAgICAgICAgICBtV2hpY2hDaGlsZCA9IG1BZGFwdGVyLmdldENvdW50KCkgLSAxOworICAgICAgICB9CisgICAgICAgIHNldERpc3BsYXllZENoaWxkKG1XaGljaENoaWxkKTsKKyAgICB9CisKKyAgICBMYXlvdXRQYXJhbXMgY3JlYXRlT3JSZXVzZUxheW91dFBhcmFtcyhWaWV3IHYpIHsKKyAgICAgICAgZmluYWwgVmlld0dyb3VwLkxheW91dFBhcmFtcyBjdXJyZW50THAgPSB2LmdldExheW91dFBhcmFtcygpOworICAgICAgICBpZiAoY3VycmVudExwIGluc3RhbmNlb2YgTGF5b3V0UGFyYW1zKSB7CisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSAoTGF5b3V0UGFyYW1zKSBjdXJyZW50THA7CisgICAgICAgICAgICBscC5zZXRIb3Jpem9udGFsT2Zmc2V0KDApOworICAgICAgICAgICAgbHAuc2V0VmVydGljYWxPZmZzZXQoMCk7CisgICAgICAgICAgICByZXR1cm4gbHA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBMYXlvdXRQYXJhbXModik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7CisgICAgICAgIGJvb2xlYW4gZGF0YUNoYW5nZWQgPSBtRGF0YUNoYW5nZWQ7CisgICAgICAgIGlmIChkYXRhQ2hhbmdlZCkgeworICAgICAgICAgICAgaGFuZGxlRGF0YUNoYW5nZWQoKTsKKworICAgICAgICAgICAgLy8gaWYgdGhlIGRhdGEgY2hhbmdlcywgbVdoaWNoQ2hpbGQgbWlnaHQgYmUgb3V0IG9mIHRoZSBib3VuZHMgb2YgdGhlIGFkYXB0ZXIKKyAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZSwgd2UgcmVzZXQgbVdoaWNoQ2hpbGQgdG8gdGhlIGJlZ2lubmluZworICAgICAgICAgICAgaWYgKG1XaGljaENoaWxkID49IG1BZGFwdGVyLmdldENvdW50KCkpCisgICAgICAgICAgICAgICAgbVdoaWNoQ2hpbGQgPSAwOworCisgICAgICAgICAgICBzaG93T25seShtV2hpY2hDaGlsZCwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgY2hpbGRDb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOworCisgICAgICAgICAgICBpbnQgY2hpbGRSaWdodCA9IG1QYWRkaW5nTGVmdCArIGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgICAgIGludCBjaGlsZEJvdHRvbSA9IG1QYWRkaW5nVG9wICsgY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIGNoaWxkLmdldExheW91dFBhcmFtcygpOworCisgICAgICAgICAgICBjaGlsZC5sYXlvdXQobVBhZGRpbmdMZWZ0ICsgbHAuaG9yaXpvbnRhbE9mZnNldCwgbVBhZGRpbmdUb3AgKyBscC52ZXJ0aWNhbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRSaWdodCArIGxwLmhvcml6b250YWxPZmZzZXQsIGNoaWxkQm90dG9tICsgbHAudmVydGljYWxPZmZzZXQpOworCisgICAgICAgICAgICAvL1RPRE86IHRlbXAgdW50aWwgZml4IGluIFZpZXcKKyAgICAgICAgICAgIGNoaWxkLnNldFBpdm90WChjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCkvMik7CisgICAgICAgICAgICBjaGlsZC5zZXRQaXZvdFkoY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKS8yKTsKKyAgICAgICAgfQorCisgICAgICAgIG1EYXRhQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICBvbkxheW91dCgpOworICAgIH0KKworICAgIGNsYXNzIExheW91dFBhcmFtcyBleHRlbmRzIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgeworICAgICAgICBpbnQgaG9yaXpvbnRhbE9mZnNldDsKKyAgICAgICAgaW50IHZlcnRpY2FsT2Zmc2V0OworICAgICAgICBWaWV3IG1WaWV3OworCisgICAgICAgIExheW91dFBhcmFtcyhWaWV3IHZpZXcpIHsKKyAgICAgICAgICAgIHN1cGVyKDAsIDApOworICAgICAgICAgICAgaG9yaXpvbnRhbE9mZnNldCA9IDA7CisgICAgICAgICAgICB2ZXJ0aWNhbE9mZnNldCA9IDA7CisgICAgICAgICAgICBtVmlldyA9IHZpZXc7CisgICAgICAgIH0KKworICAgICAgICBMYXlvdXRQYXJhbXMoQ29udGV4dCBjLCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMsIGF0dHJzKTsKKyAgICAgICAgICAgIGhvcml6b250YWxPZmZzZXQgPSAwOworICAgICAgICAgICAgdmVydGljYWxPZmZzZXQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBSZWN0IHBhcmVudFJlY3QgPSBuZXcgUmVjdCgpOworICAgICAgICB2b2lkIGludmFsaWRhdGVHbG9iYWxSZWdpb24oVmlldyB2LCBSZWN0IHIpIHsKKyAgICAgICAgICAgIFZpZXcgcCA9IHY7CisgICAgICAgICAgICBpZiAoISh2LmdldFBhcmVudCgpICE9IG51bGwgJiYgdi5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFZpZXcpKSByZXR1cm47CisKKyAgICAgICAgICAgIFZpZXcgZ3AgPSAoVmlldykgdi5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gZmlyc3RQYXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIHBhcmVudFJlY3Quc2V0KDAsIDAsIDAsIDApOworICAgICAgICAgICAgaW50IGRlcHRoID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChncC5nZXRQYXJlbnQoKSAhPSBudWxsICYmIGdwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgVmlldworICAgICAgICAgICAgICAgICAgICAmJiAhcGFyZW50UmVjdC5jb250YWlucyhyKSkgeworICAgICAgICAgICAgICAgIGlmICghZmlyc3RQYXNzKSB7CisgICAgICAgICAgICAgICAgICAgIHIub2Zmc2V0KHAuZ2V0TGVmdCgpIC0gZ3AuZ2V0U2Nyb2xsWCgpLCBwLmdldFRvcCgpIC0gZ3AuZ2V0U2Nyb2xsWSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZGVwdGgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmlyc3RQYXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcCA9IChWaWV3KSBwLmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgIGdwID0gKFZpZXcpIHAuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgcGFyZW50UmVjdC5zZXQocC5nZXRMZWZ0KCkgLSBncC5nZXRTY3JvbGxYKCksIHAuZ2V0VG9wKCkgLSBncC5nZXRTY3JvbGxZKCksCisgICAgICAgICAgICAgICAgICAgICAgICBwLmdldFJpZ2h0KCkgLSBncC5nZXRTY3JvbGxYKCksIHAuZ2V0Qm90dG9tKCkgLSBncC5nZXRTY3JvbGxZKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGVwdGggPiBtQW5jZXN0b3JIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtQW5jZXN0b3JDb250YWluaW5nQWxsQ2hpbGRyZW4gPSAoVmlld0dyb3VwKSBwOworICAgICAgICAgICAgICAgIG1BbmNlc3RvckhlaWdodCA9IGRlcHRoOworICAgICAgICAgICAgICAgIGRpc2FibGVQYXJlbnRhbENsaXBwaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHAuaW52YWxpZGF0ZShyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFJlY3QgaW52YWxpZGF0ZVJlY3QgPSBuZXcgUmVjdCgpOworICAgICAgICBwcml2YXRlIFJlY3RGIGludmFsaWRhdGVSZWN0ZiA9IG5ldyBSZWN0RigpOworICAgICAgICAvLyBUaGlzIGlzIHB1YmxpYyBzbyB0aGF0IFByb3BlcnR5QW5pbWF0b3IgY2FuIGFjY2VzcyBpdAorICAgICAgICBwdWJsaWMgdm9pZCBzZXRWZXJ0aWNhbE9mZnNldChpbnQgbmV3VmVydGljYWxPZmZzZXQpIHsKKyAgICAgICAgICAgIGludCBvZmZzZXREZWx0YSA9IG5ld1ZlcnRpY2FsT2Zmc2V0IC0gdmVydGljYWxPZmZzZXQ7CisgICAgICAgICAgICB2ZXJ0aWNhbE9mZnNldCA9IG5ld1ZlcnRpY2FsT2Zmc2V0OworCisgICAgICAgICAgICBpZiAobVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1WaWV3LnJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgICAgICAgICBpbnQgdG9wID0gTWF0aC5taW4obVZpZXcuZ2V0VG9wKCkgKyBvZmZzZXREZWx0YSwgbVZpZXcuZ2V0VG9wKCkpOworICAgICAgICAgICAgICAgIGludCBib3R0b20gPSBNYXRoLm1heChtVmlldy5nZXRCb3R0b20oKSArIG9mZnNldERlbHRhLCBtVmlldy5nZXRCb3R0b20oKSk7CisKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUmVjdGYuc2V0KG1WaWV3LmdldExlZnQoKSwgIHRvcCwgbVZpZXcuZ2V0UmlnaHQoKSwgYm90dG9tKTsKKworICAgICAgICAgICAgICAgIGZsb2F0IHhvZmZzZXQgPSAtaW52YWxpZGF0ZVJlY3RmLmxlZnQ7CisgICAgICAgICAgICAgICAgZmxvYXQgeW9mZnNldCA9IC1pbnZhbGlkYXRlUmVjdGYudG9wOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVSZWN0Zi5vZmZzZXQoeG9mZnNldCwgeW9mZnNldCk7CisgICAgICAgICAgICAgICAgbVZpZXcuZ2V0TWF0cml4KCkubWFwUmVjdChpbnZhbGlkYXRlUmVjdGYpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVSZWN0Zi5vZmZzZXQoLXhvZmZzZXQsIC15b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUmVjdC5zZXQoKGludCkgTWF0aC5mbG9vcihpbnZhbGlkYXRlUmVjdGYubGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBNYXRoLmZsb29yKGludmFsaWRhdGVSZWN0Zi50b3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgTWF0aC5jZWlsKGludmFsaWRhdGVSZWN0Zi5yaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBNYXRoLmNlaWwoaW52YWxpZGF0ZVJlY3RmLmJvdHRvbSkpOworCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZUdsb2JhbFJlZ2lvbihtVmlldywgaW52YWxpZGF0ZVJlY3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SG9yaXpvbnRhbE9mZnNldChpbnQgbmV3SG9yaXpvbnRhbE9mZnNldCkgeworICAgICAgICAgICAgaW50IG9mZnNldERlbHRhID0gbmV3SG9yaXpvbnRhbE9mZnNldCAtIGhvcml6b250YWxPZmZzZXQ7CisgICAgICAgICAgICBob3Jpem9udGFsT2Zmc2V0ID0gbmV3SG9yaXpvbnRhbE9mZnNldDsKKworICAgICAgICAgICAgaWYgKG1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVmlldy5yZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgICAgICAgICAgaW50IGxlZnQgPSBNYXRoLm1pbihtVmlldy5nZXRMZWZ0KCkgKyBvZmZzZXREZWx0YSwgbVZpZXcuZ2V0TGVmdCgpKTsKKyAgICAgICAgICAgICAgICBpbnQgcmlnaHQgPSBNYXRoLm1heChtVmlldy5nZXRSaWdodCgpICsgb2Zmc2V0RGVsdGEsIG1WaWV3LmdldFJpZ2h0KCkpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVSZWN0Zi5zZXQobGVmdCwgIG1WaWV3LmdldFRvcCgpLCByaWdodCwgbVZpZXcuZ2V0Qm90dG9tKCkpOworCisgICAgICAgICAgICAgICAgZmxvYXQgeG9mZnNldCA9IC1pbnZhbGlkYXRlUmVjdGYubGVmdDsKKyAgICAgICAgICAgICAgICBmbG9hdCB5b2Zmc2V0ID0gLWludmFsaWRhdGVSZWN0Zi50b3A7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVJlY3RmLm9mZnNldCh4b2Zmc2V0LCB5b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBtVmlldy5nZXRNYXRyaXgoKS5tYXBSZWN0KGludmFsaWRhdGVSZWN0Zik7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVJlY3RmLm9mZnNldCgteG9mZnNldCwgLXlvZmZzZXQpOworCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVJlY3Quc2V0KChpbnQpIE1hdGguZmxvb3IoaW52YWxpZGF0ZVJlY3RmLmxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgTWF0aC5mbG9vcihpbnZhbGlkYXRlUmVjdGYudG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIE1hdGguY2VpbChpbnZhbGlkYXRlUmVjdGYucmlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgTWF0aC5jZWlsKGludmFsaWRhdGVSZWN0Zi5ib3R0b20pKTsKKworICAgICAgICAgICAgICAgIGludmFsaWRhdGVHbG9iYWxSZWdpb24obVZpZXcsIGludmFsaWRhdGVSZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhvbG9ncmFwaGljSGVscGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtSG9sb2dyYXBoaWNQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1FcmFzZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXQgU1RST0tFX1dJRFRIID0gMy4wZjsKKworICAgICAgICBIb2xvZ3JhcGhpY0hlbHBlcigpIHsKKyAgICAgICAgICAgIGluaXRpYWxpemVQYWludHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgaW5pdGlhbGl6ZVBhaW50cygpIHsKKyAgICAgICAgICAgIG1Ib2xvZ3JhcGhpY1BhaW50LnNldENvbG9yKDB4ZmY2Njk5ZmYpOworICAgICAgICAgICAgbUhvbG9ncmFwaGljUGFpbnQuc2V0RmlsdGVyQml0bWFwKHRydWUpOworICAgICAgICAgICAgbUVyYXNlUGFpbnQuc2V0WGZlcm1vZGUobmV3IFBvcnRlckR1ZmZYZmVybW9kZShQb3J0ZXJEdWZmLk1vZGUuRFNUX09VVCkpOworICAgICAgICAgICAgbUVyYXNlUGFpbnQuc2V0RmlsdGVyQml0bWFwKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQml0bWFwIGNyZWF0ZU91dGxpbmUoVmlldyB2KSB7CisgICAgICAgICAgICBpZiAodi5nZXRNZWFzdXJlZFdpZHRoKCkgPT0gMCB8fCB2LmdldE1lYXN1cmVkSGVpZ2h0KCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcCh2LmdldE1lYXN1cmVkV2lkdGgoKSwgdi5nZXRNZWFzdXJlZEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhiaXRtYXApOworCisgICAgICAgICAgICBmbG9hdCByb3RhdGlvblggPSB2LmdldFJvdGF0aW9uWCgpOworICAgICAgICAgICAgdi5zZXRSb3RhdGlvblgoMCk7CisgICAgICAgICAgICBjYW52YXMuY29uY2F0KHYuZ2V0TWF0cml4KCkpOworICAgICAgICAgICAgdi5kcmF3KGNhbnZhcyk7CisKKyAgICAgICAgICAgIHYuc2V0Um90YXRpb25YKHJvdGF0aW9uWCk7CisKKyAgICAgICAgICAgIGRyYXdPdXRsaW5lKGNhbnZhcywgYml0bWFwKTsKKyAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBNYXRyaXggaWQgPSBuZXcgTWF0cml4KCk7CisgICAgICAgIGZpbmFsIE1hdHJpeCBzY2FsZU1hdHJpeCA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgdm9pZCBkcmF3T3V0bGluZShDYW52YXMgZGVzdCwgQml0bWFwIHNyYykgeworICAgICAgICAgICAgQml0bWFwIG1hc2sgPSBzcmMuZXh0cmFjdEFscGhhKCk7CisKKyAgICAgICAgICAgIGRlc3QuZHJhd0NvbG9yKDAsIFBvcnRlckR1ZmYuTW9kZS5DTEVBUik7CisKKyAgICAgICAgICAgIGZsb2F0IHhTY2FsZSA9IFNUUk9LRV9XSURUSCoyLyhkZXN0LmdldFdpZHRoKCkpOworICAgICAgICAgICAgZmxvYXQgeVNjYWxlID0gU1RST0tFX1dJRFRIKjIvKGRlc3QuZ2V0SGVpZ2h0KCkpOworCisgICAgICAgICAgICBzY2FsZU1hdHJpeC5yZXNldCgpOworICAgICAgICAgICAgc2NhbGVNYXRyaXgucHJlU2NhbGUoMSt4U2NhbGUsIDEreVNjYWxlLCBkZXN0LmdldFdpZHRoKCkvMiwgZGVzdC5nZXRIZWlnaHQoKS8yKTsKKyAgICAgICAgICAgIGRlc3Quc2V0TWF0cml4KGlkKTsKKyAgICAgICAgICAgIGRlc3QuZHJhd0JpdG1hcChtYXNrLCBzY2FsZU1hdHJpeCwgbUhvbG9ncmFwaGljUGFpbnQpOworICAgICAgICAgICAgZGVzdC5kcmF3Qml0bWFwKG1hc2ssIGlkLCBtRXJhc2VQYWludCk7CisgICAgICAgICAgICBtYXNrLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKaW5kZXggOTNmNjRiNC4uOTk2MTQzOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKQEAgLTIxLDggKzIxLDkgQEAKIAogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcGJvYXJkTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKQEAgLTM1LDYgKzM2LDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2U7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKQEAgLTQzLDcgKzQ1LDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkJvcmluZ0xheW91dDsKLWltcG9ydCBhbmRyb2lkLnRleHQuQ2xpcGJvYXJkTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRleHQuRHluYW1pY0xheW91dDsKIGltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkdldENoYXJzOwpAQCAtODQsMTAgKzg1LDEzIEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkZsb2F0TWF0aDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSGFwdGljRmVlZGJhY2tDb25zdGFudHM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtMTkxLDggKzE5NSw5IEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlRleHRWaWV3IjsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19FWFRSQUNUID0gZmFsc2U7CiAgICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IFBSSU9SSVRZID0gMTAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUklPUklUWSA9IDEwMDsKIAorICAgIHByaXZhdGUgaW50IG1DdXJyZW50QWxwaGEgPSAyNTU7ICAgIAogICAgIHByaXZhdGUgQ29sb3JTdGF0ZUxpc3QgbVRleHRDb2xvcjsKICAgICBwcml2YXRlIGludCBtQ3VyVGV4dENvbG9yOwogICAgIHByaXZhdGUgQ29sb3JTdGF0ZUxpc3QgbUhpbnRUZXh0Q29sb3I7CkBAIC0yNzk2LDYgKzI4MDEsMTQgQEAKICAgICAgICAgICAgIGMuZHJhd1RleHQobUNoYXJzLCBzdGFydCArIG1TdGFydCwgZW5kIC0gc3RhcnQsIHgsIHksIHApOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgZHJhd1RleHRSdW4oQ2FudmFzIGMsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGZsYWdzLCBQYWludCBwKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBlbmQgLSBzdGFydDsKKyAgICAgICAgICAgIGludCBjb250ZXh0Q291bnQgPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICAgICAgYy5kcmF3VGV4dFJ1bihtQ2hhcnMsIHN0YXJ0ICsgbVN0YXJ0LCBjb3VudCwgY29udGV4dFN0YXJ0ICsgbVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0Q291bnQsIHgsIHksIGZsYWdzLCBwKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBmbG9hdCBtZWFzdXJlVGV4dChpbnQgc3RhcnQsIGludCBlbmQsIFBhaW50IHApIHsKICAgICAgICAgICAgIHJldHVybiBwLm1lYXN1cmVUZXh0KG1DaGFycywgc3RhcnQgKyBtU3RhcnQsIGVuZCAtIHN0YXJ0KTsKICAgICAgICAgfQpAQCAtMjgwMyw2ICsyODE2LDIzIEBACiAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VGV4dFdpZHRocyhpbnQgc3RhcnQsIGludCBlbmQsIGZsb2F0W10gd2lkdGhzLCBQYWludCBwKSB7CiAgICAgICAgICAgICByZXR1cm4gcC5nZXRUZXh0V2lkdGhzKG1DaGFycywgc3RhcnQgKyBtU3RhcnQsIGVuZCAtIHN0YXJ0LCB3aWR0aHMpOwogICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsCisgICAgICAgICAgICAgICAgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgZmxvYXRbXSBhZHZhbmNlcywgaW50IGFkdmFuY2VzSW5kZXgsCisgICAgICAgICAgICAgICAgUGFpbnQgcCkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIHJldHVybiBwLmdldFRleHRSdW5BZHZhbmNlcyhtQ2hhcnMsIHN0YXJ0ICsgbVN0YXJ0LCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0ICsgbVN0YXJ0LCBjb250ZXh0Q291bnQsIGZsYWdzLCBhZHZhbmNlcywKKyAgICAgICAgICAgICAgICAgICAgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywKKyAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0LCBQYWludCBwKSB7CisgICAgICAgICAgICBpbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIHJldHVybiBwLmdldFRleHRSdW5DdXJzb3IobUNoYXJzLCBjb250ZXh0U3RhcnQgKyBtU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRDb3VudCwgZmxhZ3MsIG9mZnNldCArIG1TdGFydCwgY3Vyc29yT3B0KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzcwNSw5ICszNzM1LDkgQEAKICAgICAgICAgICAgIGNoYW5nZWQgPSBicmluZ1RleHRJbnRvVmlldygpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1TaG91bGRTdGFydFRleHRTZWxlY3Rpb25Nb2RlKSB7Ci0gICAgICAgICAgICBzdGFydFRleHRTZWxlY3Rpb25Nb2RlKCk7Ci0gICAgICAgICAgICBtU2hvdWxkU3RhcnRUZXh0U2VsZWN0aW9uTW9kZSA9IGZhbHNlOworICAgICAgICBpZiAobVNob3VsZFN0YXJ0U2VsZWN0aW9uQWN0aW9uTW9kZSkgeworICAgICAgICAgICAgc3RhcnRTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICBtU2hvdWxkU3RhcnRTZWxlY3Rpb25BY3Rpb25Nb2RlID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbVByZURyYXdTdGF0ZSA9IFBSRURSQVdfRE9ORTsKICAgICAgICAgcmV0dXJuICFjaGFuZ2VkOwpAQCAtMzgyOCw2ICszODU4LDIyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gb25TZXRBbHBoYShpbnQgYWxwaGEpIHsKKyAgICAgICAgaWYgKG1Nb3ZlbWVudCA9PSBudWxsICYmIGdldEJhY2tncm91bmQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ3VycmVudEFscGhhID0gYWxwaGE7CisgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZXMgZHIgPSBtRHJhd2FibGVzOworICAgICAgICAgICAgaWYgKGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoZHIubURyYXdhYmxlTGVmdCAhPSBudWxsKSBkci5tRHJhd2FibGVMZWZ0LnNldEFscGhhKGFscGhhKTsKKyAgICAgICAgICAgICAgICBpZiAoZHIubURyYXdhYmxlVG9wICE9IG51bGwpIGRyLm1EcmF3YWJsZVRvcC5zZXRBbHBoYShhbHBoYSk7CisgICAgICAgICAgICAgICAgaWYgKGRyLm1EcmF3YWJsZVJpZ2h0ICE9IG51bGwpIGRyLm1EcmF3YWJsZVJpZ2h0LnNldEFscGhhKGFscGhhKTsKKyAgICAgICAgICAgICAgICBpZiAoZHIubURyYXdhYmxlQm90dG9tICE9IG51bGwpIGRyLm1EcmF3YWJsZUJvdHRvbS5zZXRBbHBoYShhbHBoYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKICAgICAgICAgcmVzdGFydE1hcnF1ZWVJZk5lZWRlZCgpOwogCkBAIC0zOTI0LDYgKzM5NzAsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgbVRleHRQYWludC5zZXRDb2xvcihjb2xvcik7CisgICAgICAgIG1UZXh0UGFpbnQuc2V0QWxwaGEobUN1cnJlbnRBbHBoYSk7CiAgICAgICAgIG1UZXh0UGFpbnQuZHJhd2FibGVTdGF0ZSA9IGdldERyYXdhYmxlU3RhdGUoKTsKIAogICAgICAgICBjYW52YXMuc2F2ZSgpOwpAQCAtNDMwMywxNSArNDM1MCw2IEBACiAgICAgICAgICAgICAgICAgaWYgKHNob3VsZEFkdmFuY2VGb2N1c09uRW50ZXIoKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAvLyBIYXMgdG8gYmUgZG9uZSBvbiBrZXkgZG93biAoYW5kIG5vdCBvbiBrZXkgdXApIHRvIGNvcnJlY3RseSBiZSBpbnRlcmNlcHRlZC4KLSAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9CQUNLOgotICAgICAgICAgICAgICAgIGlmIChtSXNJblRleHRTZWxlY3Rpb25Nb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1JbnB1dCAhPSBudWxsKSB7CkBAIC00MzkxLDcgKzQ0MjksNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaGlkZUNvbnRyb2xsZXJzKCk7Ci0KKyAgICAgICAgCiAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgewogICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSOgogICAgICAgICAgICAgICAgIC8qCkBAIC00NDY1LDcgKzQ1MDMsNiBAQAogCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5vbktleVVwKGtleUNvZGUsIGV2ZW50KTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobUlucHV0ICE9IG51bGwpCkBAIC00ODA0LDcgKzQ4NDEsNyBAQAogICAgICAgICAgICAgICAgIG1ha2VCbGluaygpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGNoZWNrRm9yUmVzaXplKCk7CiAgICAgfQogICAgIApAQCAtNDg5NSw2ICs0OTMyLDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSBHcmF2aXR5LlJJR0hUOgorICAgICAgICAgICAgICAgIC8vIE5vdGUsIExheW91dCByZXNvbHZlcyBBTElHTl9PUFBPU0lURSB0byBsZWZ0IG9yCisgICAgICAgICAgICAgICAgLy8gcmlnaHQgYmFzZWQgb24gdGhlIHBhcmFncmFwaCBkaXJlY3Rpb24uCiAgICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gTGF5b3V0LkFsaWdubWVudC5BTElHTl9PUFBPU0lURTsKICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNTcxOSwxMSArNTc1OCwxNSBAQAogICAgICAgICBmaW5hbCBpbnQgbGVmdENoYXIgPSBtTGF5b3V0LmdldE9mZnNldEZvckhvcml6b250YWwobGluZSwgaHMpOwogICAgICAgICBmaW5hbCBpbnQgcmlnaHRDaGFyID0gbUxheW91dC5nZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUsIGhzcGFjZStocyk7CiAgICAgICAgIAorICAgICAgICAvLyBsaW5lIG1pZ2h0IGNvbnRhaW4gYmlkaXJlY3Rpb25hbCB0ZXh0CisgICAgICAgIGZpbmFsIGludCBsb3dDaGFyID0gbGVmdENoYXIgPCByaWdodENoYXIgPyBsZWZ0Q2hhciA6IHJpZ2h0Q2hhcjsKKyAgICAgICAgZmluYWwgaW50IGhpZ2hDaGFyID0gbGVmdENoYXIgPiByaWdodENoYXIgPyBsZWZ0Q2hhciA6IHJpZ2h0Q2hhcjsKKwogICAgICAgICBpbnQgbmV3U3RhcnQgPSBzdGFydDsKLSAgICAgICAgaWYgKG5ld1N0YXJ0IDwgbGVmdENoYXIpIHsKLSAgICAgICAgICAgIG5ld1N0YXJ0ID0gbGVmdENoYXI7Ci0gICAgICAgIH0gZWxzZSBpZiAobmV3U3RhcnQgPiByaWdodENoYXIpIHsKLSAgICAgICAgICAgIG5ld1N0YXJ0ID0gcmlnaHRDaGFyOworICAgICAgICBpZiAobmV3U3RhcnQgPCBsb3dDaGFyKSB7CisgICAgICAgICAgICBuZXdTdGFydCA9IGxvd0NoYXI7CisgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhcnQgPiBoaWdoQ2hhcikgeworICAgICAgICAgICAgbmV3U3RhcnQgPSBoaWdoQ2hhcjsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgaWYgKG5ld1N0YXJ0ICE9IHN0YXJ0KSB7CkBAIC02MzkxLDYgKzY0MzQsMTEgQEAKICAgICAgICAgICAgICAgICBzZW5kQWNjZXNzaWJpbGl0eUV2ZW50VHlwZVZpZXdUZXh0Q2hhbmdlZChtQmVmb3JlVGV4dCwgc3RhcnQsIGJlZm9yZSwgYWZ0ZXIpOwogICAgICAgICAgICAgICAgIG1CZWZvcmVUZXh0ID0gbnVsbDsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETy4gVGhlIGN1cnNvciBjb250cm9sbGVyIHNob3VsZCBoaWRlIGFzIHNvb24gYXMgdGV4dCBpcyB0eXBlZC4KKyAgICAgICAgICAgIC8vIEJ1dCB0aGlzIG1ldGhvZCBpcyBhbHNvIHVzZWQgZm9yIGNvc21ldGljIGNoYW5nZXMgKHVuZGVybGluZSBjdXJyZW50IHdvcmQgd2hlbgorICAgICAgICAgICAgLy8gc3BlbGwgY29ycmVjdGlvbnMgYXJlIGRpc3BsYXllZC4gVGhlcmUgaXMgY3VycmVudGx5IG5vIHdheSB0byBtYWtlIHRoZSBkaWZmZXJlbmNlCisgICAgICAgICAgICAvLyBiZXR3ZWVuIHRoZXNlIGNvc21ldGljIGNoYW5nZXMgYW5kIGFjdHVhbCB0ZXh0IG1vZGlmaWNhdGlvbnMuCiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclRleHRDaGFuZ2VkKEVkaXRhYmxlIGJ1ZmZlcikgewpAQCAtNjUzMyw3ICs2NTgxLDcgQEAKICAgICAgICAgICAgIC8vIG5lZWRlZCBieSB0aGUgY3Vyc29yIGNvbnRyb2xsZXIuIExheW91dCBjcmVhdGlvbiBpcyBkZWZlcnJlZCB1cCB0byBkcmF3aW5nLiBUaGUKICAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBhY3Rpb24gbW9kZSB3aWxsIGJlIHN0YXJ0ZWQgaW4gb25QcmVEcmF3KCkuCiAgICAgICAgICAgICBpZiAoc2VsU3RhcnQgIT0gc2VsRW5kKSB7Ci0gICAgICAgICAgICAgICAgbVNob3VsZFN0YXJ0VGV4dFNlbGVjdGlvbk1vZGUgPSB0cnVlOworICAgICAgICAgICAgICAgIG1TaG91bGRTdGFydFNlbGVjdGlvbkFjdGlvbk1vZGUgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKG1FcnJvciAhPSBudWxsKSB7CkBAIC02NTQzLDcgKzY1OTEsNyBAQAogICAgICAgICAgICAgb25FbmRCYXRjaEVkaXQoKTsKIAogICAgICAgICAgICAgaGlkZUluc2VydGlvblBvaW50Q3Vyc29yQ29udHJvbGxlcigpOwotICAgICAgICAgICAgdGVybWluYXRlVGV4dFNlbGVjdGlvbk1vZGUoKTsKKyAgICAgICAgICAgIHRlcm1pbmF0ZVNlbGVjdGlvbkFjdGlvbk1vZGUoKTsKICAgICAgICAgfQogCiAgICAgICAgIHN0YXJ0U3RvcE1hcnF1ZWUoZm9jdXNlZCk7CkBAIC02NjEyLDcgKzY2NjAsNyBAQAogICAgIGNsYXNzIENvbW1pdFNlbGVjdGlvblJlY2VpdmVyIGV4dGVuZHMgUmVzdWx0UmVjZWl2ZXIgewogICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtUHJldlN0YXJ0LCBtUHJldkVuZDsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU5ld1N0YXJ0LCBtTmV3RW5kOwotICAgICAgICAKKwogICAgICAgICBwdWJsaWMgQ29tbWl0U2VsZWN0aW9uUmVjZWl2ZXIoaW50IG1QcmV2U3RhcnQsIGludCBtUHJldkVuZCwgaW50IG1OZXdTdGFydCwgaW50IG1OZXdFbmQpIHsKICAgICAgICAgICAgIHN1cGVyKGdldEhhbmRsZXIoKSk7CiAgICAgICAgICAgICB0aGlzLm1QcmV2U3RhcnQgPSBtUHJldlN0YXJ0OwpAQCAtNjYyMCw3ICs2NjY4LDcgQEAKICAgICAgICAgICAgIHRoaXMubU5ld1N0YXJ0ID0gbU5ld1N0YXJ0OwogICAgICAgICAgICAgdGhpcy5tTmV3RW5kID0gbU5ld0VuZDsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25SZWNlaXZlUmVzdWx0KGludCByZXN1bHRDb2RlLCBCdW5kbGUgcmVzdWx0RGF0YSkgewogICAgICAgICAgICAgaW50IHN0YXJ0ID0gbU5ld1N0YXJ0OwpAQCAtNjYzMywxNCArNjY4MSwxMyBAQAogICAgICAgICAgICAgICAgIGVuZCA9IG1QcmV2RW5kOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoKG1QcmV2U3RhcnQgIT0gbVByZXZFbmQpICYmIChzdGFydCA9PSBlbmQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoc3RhcnQgPj0gbVByZXZTdGFydCkgJiYgKHN0YXJ0IDwgbVByZXZFbmQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoc3RhcnQgPj0gbVByZXZTdGFydCkgJiYgKHN0YXJ0IDw9IG1QcmV2RW5kKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFwcGluZyBpbnNpZGUgdGhlIHNlbGVjdGlvbiBkb2VzIG5vdGhpbmcKICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIG1QcmV2U3RhcnQsIG1QcmV2RW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDb250ZXh0TWVudSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFwcGluZyBvdXRzaWRlIHN0b3BzIHNlbGVjdGlvbiBtb2RlLCBpZiBhbnkKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RvcFNlbGVjdGlvbkFjdGlvbk1vZGUoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApAQCAtNjY4MiwxMSArNjcyOSwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIHN1cGVyUmVzdWx0OwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChtTW92ZW1lbnQgIT0gbnVsbCB8fCBvbkNoZWNrSXNUZXh0RWRpdG9yKCkpICYmIG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlICYmIG1MYXlvdXQgIT0gbnVsbCkgeworICAgICAgICBpZiAoKG1Nb3ZlbWVudCAhPSBudWxsIHx8IG9uQ2hlY2tJc1RleHRFZGl0b3IoKSkgJiYKKyAgICAgICAgICAgICAgICBtVGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZSAmJiBtTGF5b3V0ICE9IG51bGwpIHsKICAgICAgICAgICAgIAogICAgICAgICAgICAgaW50IG9sZFNlbFN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKICAgICAgICAgICAgIGludCBvbGRTZWxFbmQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAobUluc2VydGlvblBvaW50Q3Vyc29yQ29udHJvbGxlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbUluc2VydGlvblBvaW50Q3Vyc29yQ29udHJvbGxlci5vblRvdWNoRXZlbnQoZXZlbnQpOwogICAgICAgICAgICAgfQpAQCAtNjY5NSw3ICs2NzQzLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKG1Nb3ZlbWVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaGFuZGxlZCB8PSBtTW92ZW1lbnQub25Ub3VjaEV2ZW50KHRoaXMsIChTcGFubmFibGUpIG1UZXh0LCBldmVudCk7CiAgICAgICAgICAgICB9CkBAIC02NzA0LDE3ICs2NzUyLDE3IEBACiAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVAgJiYgaXNGb2N1c2VkKCkgJiYgIW1TY3JvbGxlZCkgewogICAgICAgICAgICAgICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gKElucHV0TWV0aG9kTWFuYWdlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5JTlBVVF9NRVRIT0RfU0VSVklDRSk7Ci0gICAgICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBuZXdTZWxTdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBuZXdTZWxFbmQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICAgICAgQ29tbWl0U2VsZWN0aW9uUmVjZWl2ZXIgY3NyID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1NlbFN0YXJ0ICE9IG9sZFNlbFN0YXJ0IHx8IG5ld1NlbEVuZCAhPSBvbGRTZWxFbmQgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWRUb3VjaEZvY3VzU2VsZWN0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNzciA9IG5ldyBDb21taXRTZWxlY3Rpb25SZWNlaXZlcihvbGRTZWxTdGFydCwgb2xkU2VsRW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTZWxTdGFydCwgbmV3U2VsRW5kKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgICAgICBoYW5kbGVkIHw9IGltbS5zaG93U29mdElucHV0KHRoaXMsIDAsIGNzcikgJiYgKGNzciAhPSBudWxsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC02NzQzLDcgKzY3OTEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gU3RvcCBzZWxlY3Rpb24gbW9kZSBpZiB0aGUgY29udHJvbGxlciBiZWNvbWVzIHVuYXZhaWxhYmxlLgotICAgICAgICAgICAgc3RvcFRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICBzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgICAgICAgICAgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciA9IG51bGw7CiAgICAgICAgIH0KICAgICB9CkBAIC02ODgzLDggKzY5MzEsMTAgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBpbnQgY29tcHV0ZUhvcml6b250YWxTY3JvbGxSYW5nZSgpIHsKLSAgICAgICAgaWYgKG1MYXlvdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBtTGF5b3V0LmdldFdpZHRoKCk7CisgICAgICAgIGlmIChtTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtU2luZ2xlTGluZSAmJiAobUdyYXZpdHkgJiBHcmF2aXR5LkhPUklaT05UQUxfR1JBVklUWV9NQVNLKSA9PSBHcmF2aXR5LkxFRlQgPworICAgICAgICAgICAgICAgICAgICAoaW50KSBtTGF5b3V0LmdldExpbmVXaWR0aCgwKSA6IG1MYXlvdXQuZ2V0V2lkdGgoKTsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBzdXBlci5jb21wdXRlSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCk7CiAgICAgfQpAQCAtNzAzMSw3ICs3MDgxLDcgQEAKICAgICAgICAgICAgICAgICBnZXRTZWxlY3Rpb25TdGFydCgpID49IDAgJiYKICAgICAgICAgICAgICAgICBnZXRTZWxlY3Rpb25FbmQoKSA+PSAwICYmCiAgICAgICAgICAgICAgICAgKChDbGlwYm9hcmRNYW5hZ2VyKWdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0xJUEJPQVJEX1NFUlZJQ0UpKS4KLSAgICAgICAgICAgICAgICBoYXNUZXh0KCkpOworICAgICAgICAgICAgICAgIGhhc1ByaW1hcnlDbGlwKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzEyMyw3ICs3MTczLDcgQEAKICAgICAgICAgLy8gVHdvIGludHMgcGFja2VkIGluIGEgbG9uZwogICAgICAgICByZXR1cm4gKCgobG9uZykgc3RhcnQpIDw8IDMyKSB8IGVuZDsKICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIHZvaWQgc2VsZWN0Q3VycmVudFdvcmQoKSB7CiAgICAgICAgIC8vIEluIGNhc2Ugc2VsZWN0aW9uIG1vZGUgaXMgc3RhcnRlZCBhZnRlciBhbiBvcmllbnRhdGlvbiBjaGFuZ2Ugb3IgYWZ0ZXIgYSBzZWxlY3QgYWxsLAogICAgICAgICAvLyB1c2UgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluc3RlYWQgb2YgY3JlYXRpbmcgb25lCkBAIC03MTU1LDI2ICs3MjA1LDcgQEAKIAogICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTsKICAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0V29yZEZvckRpY3Rpb25hcnkoKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9CiAKLSAgICAgICAgaW50IG9mZnNldCA9ICgoU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKSBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKS4KLSAgICAgICAgICAgICAgICAgICAgIGdldE1pblRvdWNoT2Zmc2V0KCk7Ci0KLSAgICAgICAgbG9uZyB3b3JkTGltaXRzID0gZ2V0V29yZExpbWl0c0F0KG9mZnNldCk7Ci0gICAgICAgIGlmICh3b3JkTGltaXRzID49IDApIHsKLSAgICAgICAgICAgIGludCBzdGFydCA9IChpbnQpICh3b3JkTGltaXRzID4+PiAzMik7Ci0gICAgICAgICAgICBpbnQgZW5kID0gKGludCkgKHdvcmRMaW1pdHMgJiAweDAwMDAwMDAwRkZGRkZGRkZMKTsKLSAgICAgICAgICAgIHJldHVybiBtVHJhbnNmb3JtZWQuc3ViU2VxdWVuY2Uoc3RhcnQsIGVuZCkudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaFBvcHVsYXRlQWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgewogICAgICAgICBpZiAoIWlzU2hvd24oKSkgewpAQCAtNzIxNiw5NyArNzI0NywzNCBAQAogICAgICAgICBzdXBlci5vbkNyZWF0ZUNvbnRleHRNZW51KG1lbnUpOwogICAgICAgICBib29sZWFuIGFkZGVkID0gZmFsc2U7CiAKLSAgICAgICAgaWYgKG1Jc0luVGV4dFNlbGVjdGlvbk1vZGUpIHsKLSAgICAgICAgICAgIE1lbnVIYW5kbGVyIGhhbmRsZXIgPSBuZXcgTWVudUhhbmRsZXIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNhbkN1dCgpKSB7Ci0gICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfQ1VULCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5jdXQpLgotICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcikuCi0gICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ3gnKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgTWVudUhhbmRsZXIgaGFuZGxlciA9IG5ldyBNZW51SGFuZGxlcigpOwogCi0gICAgICAgICAgICBpZiAoY2FuQ29weSgpKSB7Ci0gICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfQ09QWSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weSkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKS4KLSAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgnYycpOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAobVRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICBpbnQgc2VsU3RhcnQgPSBnZXRTZWxlY3Rpb25TdGFydCgpOworICAgICAgICAgICAgaW50IHNlbEVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOwogCi0gICAgICAgICAgICBpZiAoY2FuUGFzdGUoKSkgewotICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1BBU1RFLCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wYXN0ZSkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKS4KLSAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgndicpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IG1pbiA9IE1hdGgubWluKHNlbFN0YXJ0LCBzZWxFbmQpOworICAgICAgICAgICAgaW50IG1heCA9IE1hdGgubWF4KHNlbFN0YXJ0LCBzZWxFbmQpOwogCisgICAgICAgICAgICBVUkxTcGFuW10gdXJscyA9ICgoU3Bhbm5lZCkgbVRleHQpLmdldFNwYW5zKG1pbiwgbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgIGlmICh1cmxzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfQ09QWV9VUkwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weVVybCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcik7CisKKyAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFRoZSBjb250ZXh0IG1lbnUgaXMgbm90IGVtcHR5LCB3aGljaCB3aWxsIHByZXZlbnQgdGhlIHNlbGVjdGlvbiBtb2RlIGZyb20gc3RhcnRpbmcuCisgICAgICAgIC8vIEFkZCBhIGVudHJ5IHRvIHN0YXJ0IGl0IGluIHRoZSBjb250ZXh0IG1lbnUuCisgICAgICAgIC8vIFRPRE8gRG9lcyBub3QgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGEgc3ViY2xhc3MgZG9lcyBub3QgY2FsbCBzdXBlci50aGlzTWV0aG9kIG9yCisgICAgICAgIC8vIHBvcHVsYXRlcyB0aGUgbWVudSBBRlRFUiB0aGlzIGNhbGwuCisgICAgICAgIGlmIChtZW51LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NFTEVDVElPTl9NT0RFLCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zZWxlY3RUZXh0TW9kZSkuCisgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBpZiAoIWlzRm9jdXNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRm9jdXNhYmxlKCkgJiYgbUlucHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhbkNvcHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWVudUhhbmRsZXIgaGFuZGxlciA9IG5ldyBNZW51SGFuZGxlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfQ09QWSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ2MnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUuc2V0SGVhZGVyVGl0bGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZWRpdFRleHRNZW51VGl0bGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9yZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE1lbnVIYW5kbGVyIGhhbmRsZXIgPSBuZXcgTWVudUhhbmRsZXIoKTsKLQotICAgICAgICAgICAgaWYgKGNhblNlbGVjdFRleHQoKSkgewotICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NUQVJUX1NFTEVDVElOR19URVhULCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zZWxlY3RUZXh0KS4KLSAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjYW5TZWxlY3RBbGwoKSkgewotICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NFTEVDVF9BTEwsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnNlbGVjdEFsbCkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKS4KLSAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgnYScpOwotICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgewotICAgICAgICAgICAgICAgIGludCBzZWxTdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgaW50IHNlbEVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOwotCi0gICAgICAgICAgICAgICAgaW50IG1pbiA9IE1hdGgubWluKHNlbFN0YXJ0LCBzZWxFbmQpOwotICAgICAgICAgICAgICAgIGludCBtYXggPSBNYXRoLm1heChzZWxTdGFydCwgc2VsRW5kKTsKLQotICAgICAgICAgICAgICAgIFVSTFNwYW5bXSB1cmxzID0gKChTcGFubmVkKSBtVGV4dCkuZ2V0U3BhbnMobWluLCBtYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBVUkxTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAodXJscy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9DT1BZX1VSTCwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weVVybCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFBhc3RlIGxvY2F0aW9uIGlzIHRvbyBpbXByZWNpc2UuIE9ubHkgYWxsb3cgb24gZW1wdHkgdGV4dCBmaWVsZHMuCi0gICAgICAgICAgICBpZiAoY2FuUGFzdGUoKSAmJiB0ZXh0SXNPbmx5U3BhY2VzKCkpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9QQVNURSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucGFzdGUpLgotICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcikuCi0gICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ3YnKTsKLSAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc0lucHV0TWV0aG9kVGFyZ2V0KCkpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgxLCBJRF9TV0lUQ0hfSU5QVVRfTUVUSE9ELCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5pbnB1dE1ldGhvZCkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyB3b3JkID0gZ2V0V29yZEZvckRpY3Rpb25hcnkoKTsKLSAgICAgICAgICAgIGlmICh3b3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgxLCBJRF9BRERfVE9fRElDVElPTkFSWSwgMCwKLSAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuYWRkVG9EaWN0aW9uYXJ5LCB3b3JkKSkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChhZGRlZCkgewpAQCAtNzMxNCwxNyArNzI4Miw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gdGV4dElzT25seVNwYWNlcygpIHsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IG1UcmFuc2Zvcm1lZC5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBjaGFyIGMgPSBtVHJhbnNmb3JtZWQuY2hhckF0KGkpOwotICAgICAgICAgICAgZmluYWwgaW50IHR5cGUgPSBDaGFyYWN0ZXIuZ2V0VHlwZShjKTsKLSAgICAgICAgICAgIGlmICh0eXBlICE9IENoYXJhY3Rlci5TUEFDRV9TRVBBUkFUT1IpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHRleHQgdmlldyBpcyBhIGN1cnJlbnQgaW5wdXQgbWV0aG9kIHRhcmdldC4gIFRoZQogICAgICAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCBjaGVja3Mgd2l0aCB7QGxpbmsgSW5wdXRNZXRob2RNYW5hZ2VyfS4KQEAgLTczMzQsMTUgKzcyOTEsMTQgQEAKICAgICAgICAgcmV0dXJuIGltbSAhPSBudWxsICYmIGltbS5pc0FjdGl2ZSh0aGlzKTsKICAgICB9CiAgICAgCi0gICAgLy8gQ29udGV4dCBtZW51IGVudHJpZXMKKyAgICAvLyBTZWxlY3Rpb24gY29udGV4dCBtb2RlCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX1NFTEVDVF9BTEwgPSBhbmRyb2lkLlIuaWQuc2VsZWN0QWxsOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9TVEFSVF9TRUxFQ1RJTkdfVEVYVCA9IGFuZHJvaWQuUi5pZC5zdGFydFNlbGVjdGluZ1RleHQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX0NVVCA9IGFuZHJvaWQuUi5pZC5jdXQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX0NPUFkgPSBhbmRyb2lkLlIuaWQuY29weTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfUEFTVEUgPSBhbmRyb2lkLlIuaWQucGFzdGU7CisgICAgLy8gQ29udGV4dCBtZW51IGVudHJpZXMKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09QWV9VUkwgPSBhbmRyb2lkLlIuaWQuY29weVVybDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfU1dJVENIX0lOUFVUX01FVEhPRCA9IGFuZHJvaWQuUi5pZC5zd2l0Y2hJbnB1dE1ldGhvZDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfQUREX1RPX0RJQ1RJT05BUlkgPSBhbmRyb2lkLlIuaWQuYWRkVG9EaWN0aW9uYXJ5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9TRUxFQ1RJT05fTU9ERSA9IGFuZHJvaWQuUi5pZC5zZWxlY3RUZXh0TW9kZTsKIAogICAgIHByaXZhdGUgY2xhc3MgTWVudUhhbmRsZXIgaW1wbGVtZW50cyBNZW51SXRlbS5Pbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciB7CiAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1DbGljayhNZW51SXRlbSBpdGVtKSB7CkBAIC03MzUyLDgxICs3MzA4LDQ1IEBACiAKICAgICAvKioKICAgICAgKiBDYWxsZWQgd2hlbiBhIGNvbnRleHQgbWVudSBvcHRpb24gZm9yIHRoZSB0ZXh0IHZpZXcgaXMgc2VsZWN0ZWQuICBDdXJyZW50bHkKLSAgICAgKiB0aGlzIHdpbGwgYmUgb25lIG9mOiB7QGxpbmsgYW5kcm9pZC5SLmlkI3NlbGVjdEFsbH0sCi0gICAgICoge0BsaW5rIGFuZHJvaWQuUi5pZCNzdGFydFNlbGVjdGluZ1RleHR9LCB7QGxpbmsgYW5kcm9pZC5SLmlkI3N0b3BTZWxlY3RpbmdUZXh0fSwKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5SLmlkI2N1dH0sIHtAbGluayBhbmRyb2lkLlIuaWQjY29weX0sCi0gICAgICoge0BsaW5rIGFuZHJvaWQuUi5pZCNwYXN0ZX0sIHtAbGluayBhbmRyb2lkLlIuaWQjY29weVVybH0sCi0gICAgICogb3Ige0BsaW5rIGFuZHJvaWQuUi5pZCNzd2l0Y2hJbnB1dE1ldGhvZH0uCisgICAgICogdGhpcyB3aWxsIGJlIHtAbGluayBhbmRyb2lkLlIuaWQjY29weVVybH0gb3Ige0BsaW5rIGFuZHJvaWQuUi5pZCNzZWxlY3RUZXh0TW9kZX0uCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gb25UZXh0Q29udGV4dE1lbnVJdGVtKGludCBpZCkgewogICAgICAgICBpbnQgbWluID0gMDsKICAgICAgICAgaW50IG1heCA9IG1UZXh0Lmxlbmd0aCgpOwotCisgICAgICAgIAogICAgICAgICBpZiAoaXNGb2N1c2VkKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBzZWxTdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2VsRW5kID0gZ2V0U2VsZWN0aW9uRW5kKCk7Ci0KKyAgICAgICAgICAgIGludCBzZWxTdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7CisgICAgICAgICAgICBpbnQgc2VsRW5kID0gZ2V0U2VsZWN0aW9uRW5kKCk7CiAgICAgICAgICAgICBtaW4gPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzZWxTdGFydCwgc2VsRW5kKSk7CiAgICAgICAgICAgICBtYXggPSBNYXRoLm1heCgwLCBNYXRoLm1heChzZWxTdGFydCwgc2VsRW5kKSk7CiAgICAgICAgIH0KIAotICAgICAgICBDbGlwYm9hcmRNYW5hZ2VyIGNsaXAgPSAoQ2xpcGJvYXJkTWFuYWdlcilnZXRDb250ZXh0KCkKKyAgICAgICAgQ2xpcGJvYXJkTWFuYWdlciBjbGlwYm9hcmQgPSAoQ2xpcGJvYXJkTWFuYWdlcilnZXRDb250ZXh0KCkKICAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNMSVBCT0FSRF9TRVJWSUNFKTsKIAogICAgICAgICBzd2l0Y2ggKGlkKSB7Ci0gICAgICAgICAgICBjYXNlIElEX1NFTEVDVF9BTEw6Ci0gICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKSBtVGV4dCwgMCwgbVRleHQubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIHN0YXJ0VGV4dFNlbGVjdGlvbk1vZGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgY2FzZSBJRF9TVEFSVF9TRUxFQ1RJTkdfVEVYVDoKLSAgICAgICAgICAgICAgICBzdGFydFRleHRTZWxlY3Rpb25Nb2RlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgIGNhc2UgSURfQ1VUOiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjbGlwLnNldFRleHQobVRyYW5zZm9ybWVkLnN1YlNlcXVlbmNlKG1pbiwgbWF4KSk7Ci0gICAgICAgICAgICAgICAgKChFZGl0YWJsZSkgbVRleHQpLmRlbGV0ZShtaW4sIG1heCk7Ci0gICAgICAgICAgICAgICAgc3RvcFRleHRTZWxlY3Rpb25Nb2RlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgIGNhc2UgSURfQ09QWToKLSAgICAgICAgICAgICAgICBjbGlwLnNldFRleHQobVRyYW5zZm9ybWVkLnN1YlNlcXVlbmNlKG1pbiwgbWF4KSk7Ci0gICAgICAgICAgICAgICAgc3RvcFRleHRTZWxlY3Rpb25Nb2RlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgIGNhc2UgSURfUEFTVEU6Ci0gICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHBhc3RlID0gY2xpcC5nZXRUZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocGFzdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBtYXgpOwotICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkucmVwbGFjZShtaW4sIG1heCwgcGFzdGUpOwotICAgICAgICAgICAgICAgICAgICBzdG9wVGV4dFNlbGVjdGlvbk1vZGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KICAgICAgICAgICAgIGNhc2UgSURfQ09QWV9VUkw6CisgICAgICAgICAgICAgICAgTWV0YUtleUtleUxpc3RlbmVyLnN0b3BTZWxlY3RpbmcodGhpcywgKFNwYW5uYWJsZSkgbVRleHQpOworCiAgICAgICAgICAgICAgICAgVVJMU3BhbltdIHVybHMgPSAoKFNwYW5uZWQpIG1UZXh0KS5nZXRTcGFucyhtaW4sIG1heCwgVVJMU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHVybHMubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xpcC5zZXRUZXh0KHVybHNbMF0uZ2V0VVJMKCkpOworICAgICAgICAgICAgICAgIGlmICh1cmxzLmxlbmd0aCA+PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIENsaXBEYXRhIGNsaXAgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8dXJscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSh1cmxzWzBdLmdldFVSTCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwID0gQ2xpcERhdGEubmV3UmF3VXJpKG51bGwsIG51bGwsIHVyaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuYWRkSXRlbShuZXcgQ2xpcERhdGEuSXRlbSh1cmkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY2xpcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlwYm9hcmQuc2V0UHJpbWFyeUNsaXAoY2xpcCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICAgICAgICAgIGNhc2UgSURfU1dJVENIX0lOUFVUX01FVEhPRDoKLSAgICAgICAgICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5wdXRNZXRob2RNYW5hZ2VyLnBlZWtJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgIGlmIChpbW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbW0uc2hvd0lucHV0TWV0aG9kUGlja2VyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBjYXNlIElEX0FERF9UT19ESUNUSU9OQVJZOgotICAgICAgICAgICAgICAgIFN0cmluZyB3b3JkID0gZ2V0V29yZEZvckRpY3Rpb25hcnkoKTsKLQotICAgICAgICAgICAgICAgIGlmICh3b3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSW50ZW50IGkgPSBuZXcgSW50ZW50KCJjb20uYW5kcm9pZC5zZXR0aW5ncy5VU0VSX0RJQ1RJT05BUllfSU5TRVJUIik7Ci0gICAgICAgICAgICAgICAgICAgIGkucHV0RXh0cmEoIndvcmQiLCB3b3JkKTsKLSAgICAgICAgICAgICAgICAgICAgaS5zZXRGbGFncyhpLmdldEZsYWdzKCkgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7Ci0gICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KGkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgSURfU0VMRUNUSU9OX01PREU6CisgICAgICAgICAgICAgICAgc3RhcnRTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAKQEAgLTc0MzksMzMgKzczNTksODEgQEAKICAgICAgICAgICAgIG1FYXRUb3VjaFJlbGVhc2UgPSB0cnVlOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChzdGFydFNlbGVjdGlvbkFjdGlvbk1vZGUoKSkgeworICAgICAgICAgICAgcGVyZm9ybUhhcHRpY0ZlZWRiYWNrKEhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkxPTkdfUFJFU1MpOworICAgICAgICAgICAgbUVhdFRvdWNoUmVsZWFzZSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc3RhcnRUZXh0U2VsZWN0aW9uTW9kZSgpIHsKLSAgICAgICAgaWYgKG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlRleHRWaWV3IGhhcyBubyBzZWxlY3Rpb24gY29udHJvbGxlci4gQWN0aW9uIG1vZGUgY2FuY2VsbGVkLiIpOwotICAgICAgICAgICAgcmV0dXJuOworICAgIHByaXZhdGUgYm9vbGVhbiB0b3VjaFBvc2l0aW9uSXNJblNlbGVjdGlvbigpIHsKKyAgICAgICAgaW50IHNlbGVjdGlvblN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgaW50IHNlbGVjdGlvbkVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOworCisgICAgICAgIGlmIChzZWxlY3Rpb25TdGFydCA9PSBzZWxlY3Rpb25FbmQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghcmVxdWVzdEZvY3VzKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0ID4gc2VsZWN0aW9uRW5kKSB7CisgICAgICAgICAgICBpbnQgdG1wID0gc2VsZWN0aW9uU3RhcnQ7CisgICAgICAgICAgICBzZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvbkVuZDsKKyAgICAgICAgICAgIHNlbGVjdGlvbkVuZCA9IHRtcDsKKyAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpOwogICAgICAgICB9CiAKLSAgICAgICAgc2VsZWN0Q3VycmVudFdvcmQoKTsKLSAgICAgICAgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5zaG93KCk7Ci0gICAgICAgIG1Jc0luVGV4dFNlbGVjdGlvbk1vZGUgPSB0cnVlOworICAgICAgICBTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgc2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyID0KKyAgICAgICAgICAgICgoU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKSBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKTsKKyAgICAgICAgaW50IG1pbk9mZnNldCA9IHNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5nZXRNaW5Ub3VjaE9mZnNldCgpOworICAgICAgICBpbnQgbWF4T2Zmc2V0ID0gc2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLmdldE1heFRvdWNoT2Zmc2V0KCk7CisKKyAgICAgICAgcmV0dXJuICgobWluT2Zmc2V0ID49IHNlbGVjdGlvblN0YXJ0KSAmJiAobWF4T2Zmc2V0IDwgc2VsZWN0aW9uRW5kKSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogU2FtZSBhcyB7QGxpbmsgI3N0b3BUZXh0U2VsZWN0aW9uTW9kZSgpfSwgZXhjZXB0IHRoYXQgdGhlcmUgaXMgbm8gY3Vyc29yIGNvbnRyb2xsZXIKKyAgICAgKiBQcm92aWRlcyB0aGUgY2FsbGJhY2sgdXNlZCB0byBzdGFydCBhIHNlbGVjdGlvbiBhY3Rpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBjYWxsYmFjayBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBzdGFydCBzZWxlY3Rpb24gbW9kZSwgb3IgbnVsbCBpZiBzZWxlY3Rpb24KKyAgICAgKiBtb2RlIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBBY3Rpb25Nb2RlLkNhbGxiYWNrIGdldEFjdGlvbk1vZGVDYWxsYmFjaygpIHsKKyAgICAgICAgLy8gTG9uZyBwcmVzcyBpbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uCisgICAgICAgIC8vIFNob3VsZCBpbml0aWF0ZSBhIGRyYWcuIFJldHVybiBmYWxzZSwgdG8gcmVseSBvbiBjb250ZXh0IG1lbnUgZm9yIG5vdy4KKyAgICAgICAgaWYgKGNhblNlbGVjdFRleHQoKSAmJiAhdG91Y2hQb3NpdGlvbklzSW5TZWxlY3Rpb24oKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb25BY3Rpb25Nb2RlQ2FsbGJhY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2VsZWN0aW9uIG1vZGUgd2FzIGFjdHVhbGx5IHN0YXJ0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0U2VsZWN0aW9uQWN0aW9uTW9kZSgpIHsKKyAgICAgICAgaWYgKG1TZWxlY3Rpb25BY3Rpb25Nb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFNlbGVjdGlvbiBhY3Rpb24gbW9kZSBpcyBhbHJlYWR5IHN0YXJ0ZWQKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEFjdGlvbk1vZGUuQ2FsbGJhY2sgYWN0aW9uTW9kZUNhbGxiYWNrID0gZ2V0QWN0aW9uTW9kZUNhbGxiYWNrKCk7CisgICAgICAgIGlmIChhY3Rpb25Nb2RlQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdGlvbkFjdGlvbk1vZGUgPSBzdGFydEFjdGlvbk1vZGUoYWN0aW9uTW9kZUNhbGxiYWNrKTsKKyAgICAgICAgICAgIHJldHVybiBtU2VsZWN0aW9uQWN0aW9uTW9kZSAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhbWUgYXMge0BsaW5rICNzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpfSwgZXhjZXB0IHRoYXQgdGhlcmUgaXMgbm8gY3Vyc29yIGNvbnRyb2xsZXIKICAgICAgKiBmYWRlIG91dCBhbmltYXRpb24uIE5lZWRlZCBzaW5jZSB0aGUgZHJhd2FibGUgYW5kIHRoZWlyIGFscGhhIHZhbHVlcyBhcmUgc2hhcmVkIGJ5IGFsbAogICAgICAqIFRleHRWaWV3cy4gU3dpdGNoaW5nIGZyb20gb25lIFRleHRWaWV3IHRvIGFub3RoZXIgd291bGQgZmFkZSB0aGUgY3Vyc29yIGNvbnRyb2xsZXJzIGluIHRoZQogICAgICAqIG5ldyBvbmUgb3RoZXJ3aXNlLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXJtaW5hdGVUZXh0U2VsZWN0aW9uTW9kZSgpIHsKLSAgICAgICAgc3RvcFRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgcHJpdmF0ZSB2b2lkIHRlcm1pbmF0ZVNlbGVjdGlvbkFjdGlvbk1vZGUoKSB7CisgICAgICAgIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CiAgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIFNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciBzZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPQogICAgICAgICAgICAgICAgIChTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIpIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXI7CkBAIC03NDczLDE0ICs3NDQxLDE0NiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpIHsKLSAgICAgICAgaWYgKG1Jc0luVGV4dFNlbGVjdGlvbk1vZGUpIHsKLSAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIGdldFNlbGVjdGlvbkVuZCgpKTsKKyAgICBwcml2YXRlIHZvaWQgc3RvcFNlbGVjdGlvbkFjdGlvbk1vZGUoKSB7CisgICAgICAgIGlmIChtU2VsZWN0aW9uQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU2VsZWN0aW9uQWN0aW9uTW9kZS5maW5pc2goKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2VsZWN0aW9uQWN0aW9uTW9kZUNhbGxiYWNrIGltcGxlbWVudHMgQWN0aW9uTW9kZS5DYWxsYmFjayB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJUZXh0VmlldyBoYXMgbm8gc2VsZWN0aW9uIGNvbnRyb2xsZXIuIEFjdGlvbiBtb2RlIGNhbmNlbGxlZC4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghcmVxdWVzdEZvY3VzKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1vZGUuc2V0VGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnRleHRTZWxlY3Rpb25DQUJUaXRsZSkpOworICAgICAgICAgICAgbW9kZS5zZXRTdWJ0aXRsZShudWxsKTsKKworICAgICAgICAgICAgc2VsZWN0Q3VycmVudFdvcmQoKTsKKworICAgICAgICAgICAgYm9vbGVhbiBhdExlYXN0T25lID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmIChjYW5TZWxlY3RBbGwoKSkgeworICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NFTEVDVF9BTEwsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnNlbGVjdEFsbCkuCisgICAgICAgICAgICAgICAgICAgIHNldEljb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5pY19tZW51X2NoYXRfZGFzaGJvYXJkKS4KKyAgICAgICAgICAgICAgICAgICAgc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCdhJyk7CisgICAgICAgICAgICAgICAgYXRMZWFzdE9uZSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjYW5DdXQoKSkgeworICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX0NVVCwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY3V0KS4KKyAgICAgICAgICAgICAgICAgICAgc2V0SWNvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLmljX21lbnVfY29tcG9zZSkuCisgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgneCcpOworICAgICAgICAgICAgICAgIGF0TGVhc3RPbmUgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2FuQ29weSgpKSB7CisgICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfQ09QWSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weSkuCisgICAgICAgICAgICAgICAgICAgIHNldEljb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5pY19tZW51X2F0dGFjaG1lbnQpLgorICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ2MnKTsKKyAgICAgICAgICAgICAgICBhdExlYXN0T25lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNhblBhc3RlKCkpIHsKKyAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9QQVNURSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucGFzdGUpLgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0SWNvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLmljX21lbnVfY2FtZXJhKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgndicpOworICAgICAgICAgICAgICAgIGF0TGVhc3RPbmUgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXRMZWFzdE9uZSkgeworICAgICAgICAgICAgICAgIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuc2hvdygpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25QcmVwYXJlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25BY3Rpb25JdGVtQ2xpY2tlZChBY3Rpb25Nb2RlIG1vZGUsIE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBpdGVtSWQgPSBpdGVtLmdldEl0ZW1JZCgpOworCisgICAgICAgICAgICBpZiAoaXRlbUlkID09IElEX1NFTEVDVF9BTEwpIHsKKyAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCAwLCBtVGV4dC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGNvbnRyb2xsZXIgcG9zaXRpb25zIGFmdGVyIHNlbGVjdGlvbiBjaGFuZ2UuCisgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLnNob3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENsaXBib2FyZE1hbmFnZXIgY2xpcGJvYXJkID0gKENsaXBib2FyZE1hbmFnZXIpIGdldENvbnRleHQoKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNMSVBCT0FSRF9TRVJWSUNFKTsKKworICAgICAgICAgICAgaW50IG1pbiA9IDA7CisgICAgICAgICAgICBpbnQgbWF4ID0gbVRleHQubGVuZ3RoKCk7CisKKyAgICAgICAgICAgIGlmIChpc0ZvY3VzZWQoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBzZWxTdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHNlbEVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOworCisgICAgICAgICAgICAgICAgbWluID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2VsU3RhcnQsIHNlbEVuZCkpOworICAgICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KDAsIE1hdGgubWF4KHNlbFN0YXJ0LCBzZWxFbmQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChpdGVtLmdldEl0ZW1JZCgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBJRF9QQVNURToKKyAgICAgICAgICAgICAgICAgICAgQ2xpcERhdGEgY2xpcCA9IGNsaXBib2FyZC5nZXRQcmltYXJ5Q2xpcCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRpZGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2xpcC5nZXRJdGVtQ291bnQoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHBhc3RlID0gY2xpcC5nZXRJdGVtKGkpLmNvZXJjZVRvVGV4dChnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGlkZmlyc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIG1heCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkucmVwbGFjZShtaW4sIG1heCwgcGFzdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZSkgbVRleHQpLmluc2VydChnZXRTZWxlY3Rpb25FbmQoKSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkuaW5zZXJ0KGdldFNlbGVjdGlvbkVuZCgpLCBwYXN0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgICAgICBjYXNlIElEX0NVVDoKKyAgICAgICAgICAgICAgICAgICAgY2xpcGJvYXJkLnNldFByaW1hcnlDbGlwKENsaXBEYXRhLm5ld1BsYWluVGV4dChudWxsLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2Zvcm1lZC5zdWJTZXF1ZW5jZShtaW4sIG1heCkpKTsKKyAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZSkgbVRleHQpLmRlbGV0ZShtaW4sIG1heCk7CisgICAgICAgICAgICAgICAgICAgIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAgICAgY2FzZSBJRF9DT1BZOgorICAgICAgICAgICAgICAgICAgICBjbGlwYm9hcmQuc2V0UHJpbWFyeUNsaXAoQ2xpcERhdGEubmV3UGxhaW5UZXh0KG51bGwsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zZm9ybWVkLnN1YlNlcXVlbmNlKG1pbiwgbWF4KSkpOworICAgICAgICAgICAgICAgICAgICBzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBnZXRTZWxlY3Rpb25TdGFydCgpKTsKICAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLmhpZGUoKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUlzSW5UZXh0U2VsZWN0aW9uTW9kZSA9IGZhbHNlOworICAgICAgICAgICAgbVNlbGVjdGlvbkFjdGlvbk1vZGUgPSBudWxsOwogICAgICAgICB9CiAgICAgfQogCkBAIC03NTQ5LDcgKzc2NDksNyBAQAogICAgICAgICBIYW5kbGUoRHJhd2FibGUgZHJhd2FibGUpIHsKICAgICAgICAgICAgIG1EcmF3YWJsZSA9IGRyYXdhYmxlOwogICAgICAgICB9Ci0KKyAgICAgICAgCiAgICAgICAgIHZvaWQgcG9zaXRpb25BdEN1cnNvcihmaW5hbCBpbnQgb2Zmc2V0LCBib29sZWFuIGJvdHRvbSkgewogICAgICAgICAgICAgZmluYWwgaW50IGRyYXdhYmxlV2lkdGggPSBtRHJhd2FibGUuZ2V0SW50cmluc2ljV2lkdGgoKTsKICAgICAgICAgICAgIGZpbmFsIGludCBkcmF3YWJsZUhlaWdodCA9IG1EcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKQEAgLTc1NjksNyArNzY2OSw3IEBACiAgICAgICAgICAgICAvLyBFeHRlbmQgdG91Y2ggcmVnaW9uIHVwIHdoZW4gZWRpdGluZyB0aGUgbGFzdCBsaW5lIG9mIHRleHQgKG9yIGEgc2luZ2xlIGxpbmUpIHNvIHRoYXQKICAgICAgICAgICAgIC8vIGl0IGlzIGVhc2llciB0byBncmFiLgogICAgICAgICAgICAgaWYgKGxpbmUgPT0gbUxheW91dC5nZXRMaW5lQ291bnQoKSAtIDEpIHsKLSAgICAgICAgICAgICAgICBtVG9wRXh0ZW5zaW9uID0gKGxpbmVCb3R0b20gLSBsaW5lVG9wKSAtIGRyYXdhYmxlSGVpZ2h0IC8gMjsKKyAgICAgICAgICAgICAgICAgIG1Ub3BFeHRlbnNpb24gPSAobGluZUJvdHRvbSAtIGxpbmVUb3ApIC0gZHJhd2FibGVIZWlnaHQgLyAyOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBib3VuZHMucmlnaHQgPSBib3VuZHMubGVmdCArIGRyYXdhYmxlV2lkdGg7CkBAIC03NzU4LDggKzc4NTgsNiBAQAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXJ0SXNEcmFnZ2VkID0gZmFsc2U7CiAgICAgICAgIC8vIFN0YXJ0aW5nIHRpbWUgb2YgdGhlIGZhZGUgdGltZXIKICAgICAgICAgcHJpdmF0ZSBsb25nIG1GYWRlT3V0VGltZXJTdGFydDsKLSAgICAgICAgLy8gVXNlZCB0byBkZXRlY3QgYSB0YXAgKHZzIGRyYWcpIG9uIHRoZSBjb250cm9sbGVyCi0gICAgICAgIHByaXZhdGUgbG9uZyBtT25Eb3duVGltZXJTdGFydDsKICAgICAgICAgLy8gVGhlIGN1cnNvciBjb250cm9sbGVyIGltYWdlcwogICAgICAgICBwcml2YXRlIGZpbmFsIEhhbmRsZSBtU3RhcnRIYW5kbGUsIG1FbmRIYW5kbGU7CiAgICAgICAgIC8vIE9mZnNldCBiZXR3ZWVuIGZpbmdlciBob3QgcG9pbnQgb24gYWN0aXZlIGN1cnNvciBjb250cm9sbGVyIGFuZCBhY3R1YWwgY3Vyc29yCkBAIC03ODcwLDcgKzc5NjgsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYm9vbGVhbiBvbmVMaW5lU2VsZWN0aW9uID0gbUxheW91dC5nZXRMaW5lRm9yT2Zmc2V0KHNlbGVjdGlvblN0YXJ0KSA9PSBtTGF5b3V0LmdldExpbmVGb3JPZmZzZXQoc2VsZWN0aW9uRW5kKTsgCisgICAgICAgICAgICBib29sZWFuIG9uZUxpbmVTZWxlY3Rpb24gPQorICAgICAgICAgICAgICAgIG1MYXlvdXQuZ2V0TGluZUZvck9mZnNldChzZWxlY3Rpb25TdGFydCkgPT0gbUxheW91dC5nZXRMaW5lRm9yT2Zmc2V0KHNlbGVjdGlvbkVuZCk7CiAgICAgICAgICAgICBtU3RhcnRIYW5kbGUucG9zaXRpb25BdEN1cnNvcihzZWxlY3Rpb25TdGFydCwgb25lTGluZVNlbGVjdGlvbik7CiAgICAgICAgICAgICBtRW5kSGFuZGxlLnBvc2l0aW9uQXRDdXJzb3Ioc2VsZWN0aW9uRW5kLCB0cnVlKTsKIApAQCAtNzkwNywyMiArODAwNiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9mZnNldFggPSAoYm91bmRzLmxlZnQgKyBib3VuZHMucmlnaHQpIC8gMi4wZiAtIHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT2Zmc2V0WSA9IGRyYWdnZWRIYW5kbGUubUhvdFNwb3RWZXJ0aWNhbFBvc2l0aW9uIC0geTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9uRG93blRpbWVyU3RhcnQgPSBldmVudC5nZXRFdmVudFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQXJyb3dLZXlNb3ZlbWVudE1ldGhvZCltTW92ZW1lbnQpLnNldEN1cnNvckNvbnRyb2xsZXIodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lID0gKGludCkgKGV2ZW50LmdldEV2ZW50VGltZSgpIC0gbU9uRG93blRpbWVyU3RhcnQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGltZSA8PSBWaWV3Q29uZmlndXJhdGlvbi5nZXRUYXBUaW1lb3V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHRhcCBvbiB0aGUgY29udHJvbGxlciAobm90IGEgZHJhZykgb3BlbnMgdGhlIGNvbnRleHR1YWwgQ29weSBtZW51Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NvbnRleHRNZW51KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQogICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0RPV046CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVA6CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgbXVsdGktcG9pbnQgZ2VzdHVyZXMuIEtlZXAgbWluIGFuZCBtYXggb2Zmc2V0IHBvc2l0aW9ucy4KQEAgLTc5ODIsNyArODA3MSw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgaGlkZUNvbnRyb2xsZXJzKCkgewogICAgICAgICBoaWRlSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyKCk7Ci0gICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOworICAgICAgICBzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGdldE9mZnNldEZvckhvcml6b250YWwoaW50IGxpbmUsIGludCB4KSB7CkBAIC04MDQ1LDcgKzgxMzQsOCBAQAogICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lLCB4KTsKICAgICB9CiAKLSAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eShjYXRlZ29yeSA9ICJ0ZXh0IikKICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSAgICAgICAgICAgIG1UZXh0OwogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlICAgICAgICAgICAgbVRyYW5zZm9ybWVkOwogICAgIHByaXZhdGUgQnVmZmVyVHlwZSAgICAgICAgICAgICAgbUJ1ZmZlclR5cGUgPSBCdWZmZXJUeXBlLk5PUk1BTDsKQEAgLTgwNzYsOCArODE2Niw4IEBACiAgICAgLy8gQ3Vyc29yIENvbnRyb2xsZXJzLiBOdWxsIHdoZW4gZGlzYWJsZWQuCiAgICAgcHJpdmF0ZSBDdXJzb3JDb250cm9sbGVyICAgICAgICBtSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyOwogICAgIHByaXZhdGUgQ3Vyc29yQ29udHJvbGxlciAgICAgICAgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgICAgIG1TaG91bGRTdGFydFRleHRTZWxlY3Rpb25Nb2RlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgICAgICBtSXNJblRleHRTZWxlY3Rpb25Nb2RlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgICAgICBtU2hvdWxkU3RhcnRTZWxlY3Rpb25BY3Rpb25Nb2RlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBBY3Rpb25Nb2RlICAgICAgICAgICAgICBtU2VsZWN0aW9uQWN0aW9uTW9kZTsKICAgICAvLyBDcmVhdGVkIG9uY2UgYW5kIHNoYXJlZCBieSBkaWZmZXJlbnQgQ3Vyc29yQ29udHJvbGxlciBoZWxwZXIgbWV0aG9kcy4KICAgICAvLyBPbmx5IG9uZSBjdXJzb3IgY29udHJvbGxlciBpcyBhY3RpdmUgYXQgYW55IHRpbWUgd2hpY2ggcHJldmVudCByYWNlIGNvbmRpdGlvbnMuCiAgICAgcHJpdmF0ZSBzdGF0aWMgUmVjdCAgICAgICAgICAgICBzQ3Vyc29yQ29udHJvbGxlclRlbXBSZWN0ID0gbmV3IFJlY3QoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9WaWV3QW5pbWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9WaWV3QW5pbWF0b3IuamF2YQppbmRleCA5MDdjZmIzLi43YjY2ODkzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0FuaW1hdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdBbmltYXRvci5qYXZhCkBAIC0zMSwxMSArMzEsMTMgQEAKICAqCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3QW5pbWF0b3JfaW5BbmltYXRpb24KICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ZpZXdBbmltYXRvcl9vdXRBbmltYXRpb24KKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ZpZXdBbmltYXRvcl9hbmltYXRlRmlyc3RWaWV3CiAgKi8KIHB1YmxpYyBjbGFzcyBWaWV3QW5pbWF0b3IgZXh0ZW5kcyBGcmFtZUxheW91dCB7CiAKICAgICBpbnQgbVdoaWNoQ2hpbGQgPSAwOwogICAgIGJvb2xlYW4gbUZpcnN0VGltZSA9IHRydWU7CisKICAgICBib29sZWFuIG1BbmltYXRlRmlyc3RUaW1lID0gdHJ1ZTsKIAogICAgIEFuaW1hdGlvbiBtSW5BbmltYXRpb247CkBAIC01OSw2ICs2MSwxMCBAQAogICAgICAgICBpZiAocmVzb3VyY2UgPiAwKSB7CiAgICAgICAgICAgICBzZXRPdXRBbmltYXRpb24oY29udGV4dCwgcmVzb3VyY2UpOwogICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBmbGFnID0gYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdBbmltYXRvcl9hbmltYXRlRmlyc3RWaWV3LCB0cnVlKTsKKyAgICAgICAgc2V0QW5pbWF0ZUZpcnN0VmlldyhmbGFnKTsKKwogICAgICAgICBhLnJlY3ljbGUoKTsKIAogICAgICAgICBpbml0Vmlld0FuaW1hdG9yKGNvbnRleHQsIGF0dHJzKTsKQEAgLTg0LDEwICs5MCwxMCBAQAogICAgICAgICBzZXRNZWFzdXJlQWxsQ2hpbGRyZW4obWVhc3VyZUFsbENoaWxkcmVuKTsKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogU2V0cyB3aGljaCBjaGlsZCB2aWV3IHdpbGwgYmUgZGlzcGxheWVkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHdoaWNoQ2hpbGQgdGhlIGluZGV4IG9mIHRoZSBjaGlsZCB2aWV3IHRvIGRpc3BsYXkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5ZWRDaGlsZChpbnQgd2hpY2hDaGlsZCkgewpAQCAtMTA1LDE0ICsxMTEsMTQgQEAKICAgICAgICAgICAgIHJlcXVlc3RGb2N1cyhGT0NVU19GT1JXQVJEKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGNoaWxkIHZpZXcuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXREaXNwbGF5ZWRDaGlsZCgpIHsKICAgICAgICAgcmV0dXJuIG1XaGljaENoaWxkOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIE1hbnVhbGx5IHNob3dzIHRoZSBuZXh0IGNoaWxkLgogICAgICAqLwpAQCAtMTI4LDYgKzEzNCwzNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNob3dzIG9ubHkgdGhlIHNwZWNpZmllZCBjaGlsZC4gVGhlIG90aGVyIGRpc3BsYXlzIFZpZXdzIGV4aXQgdGhlIHNjcmVlbiwKKyAgICAgKiBvcHRpb25hbGx5IHdpdGggdGhlIHdpdGggdGhlIHtAbGluayAjZ2V0T3V0QW5pbWF0aW9uKCkgb3V0IGFuaW1hdGlvbn0gYW5kCisgICAgICogdGhlIHNwZWNpZmllZCBjaGlsZCBlbnRlcnMgdGhlIHNjcmVlbiwgb3B0aW9uYWxseSB3aXRoIHRoZQorICAgICAqIHtAbGluayAjZ2V0SW5BbmltYXRpb24oKSBpbiBhbmltYXRpb259LgorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBzaG93bi4KKyAgICAgKiBAcGFyYW0gYW5pbWF0ZSBXaGV0aGVyIG9yIG5vdCB0byB1c2UgdGhlIGluIGFuZCBvdXQgYW5pbWF0aW9ucywgZGVmYXVsdHMKKyAgICAgKiAgICAgICAgICAgIHRvIHRydWUuCisgICAgICovCisgICAgdm9pZCBzaG93T25seShpbnQgY2hpbGRJbmRleCwgYm9vbGVhbiBhbmltYXRlKSB7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGlmIChpID09IGNoaWxkSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoYW5pbWF0ZSAmJiBtSW5BbmltYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGFydEFuaW1hdGlvbihtSW5BbmltYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGlsZC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgbUZpcnN0VGltZSA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoYW5pbWF0ZSAmJiBtT3V0QW5pbWF0aW9uICE9IG51bGwgJiYgY2hpbGQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgeworICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGFydEFuaW1hdGlvbihtT3V0QW5pbWF0aW9uKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLmdldEFuaW1hdGlvbigpID09IG1JbkFuaW1hdGlvbikKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuY2xlYXJBbmltYXRpb24oKTsKKyAgICAgICAgICAgICAgICBjaGlsZC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqCiAgICAgICogU2hvd3Mgb25seSB0aGUgc3BlY2lmaWVkIGNoaWxkLiBUaGUgb3RoZXIgZGlzcGxheXMgVmlld3MgZXhpdCB0aGUgc2NyZWVuCiAgICAgICogd2l0aCB0aGUge0BsaW5rICNnZXRPdXRBbmltYXRpb24oKSBvdXQgYW5pbWF0aW9ufSBhbmQgdGhlIHNwZWNpZmllZCBjaGlsZAogICAgICAqIGVudGVycyB0aGUgc2NyZWVuIHdpdGggdGhlIHtAbGluayAjZ2V0SW5BbmltYXRpb24oKSBpbiBhbmltYXRpb259LgpAQCAtMTM1LDI0ICsxNzAsOCBAQAogICAgICAqIEBwYXJhbSBjaGlsZEluZGV4IFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgc2hvd24uCiAgICAgICovCiAgICAgdm9pZCBzaG93T25seShpbnQgY2hpbGRJbmRleCkgewotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBnZXRDaGlsZENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGNoZWNrRm9yRmlyc3QgPSAoIW1GaXJzdFRpbWUgfHwgbUFuaW1hdGVGaXJzdFRpbWUpOwotICAgICAgICAgICAgaWYgKGkgPT0gY2hpbGRJbmRleCkgewotICAgICAgICAgICAgICAgIGlmIChjaGVja0ZvckZpcnN0ICYmIG1JbkFuaW1hdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0YXJ0QW5pbWF0aW9uKG1JbkFuaW1hdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNoaWxkLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtRmlyc3RUaW1lID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjaGVja0ZvckZpcnN0ICYmIG1PdXRBbmltYXRpb24gIT0gbnVsbCAmJiBjaGlsZC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0YXJ0QW5pbWF0aW9uKG1PdXRBbmltYXRpb24pOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQuZ2V0QW5pbWF0aW9uKCkgPT0gbUluQW5pbWF0aW9uKQotICAgICAgICAgICAgICAgICAgICBjaGlsZC5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICAgICAgICAgIGNoaWxkLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBmaW5hbCBib29sZWFuIGFuaW1hdGUgPSAoIW1GaXJzdFRpbWUgfHwgbUFuaW1hdGVGaXJzdFRpbWUpOworICAgICAgICBzaG93T25seShjaGlsZEluZGV4LCBhbmltYXRlKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9WaWV3RmxpcHBlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdGbGlwcGVyLmphdmEKaW5kZXggODAzNDk2MS4uYzZmNmU4MSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdGbGlwcGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdGbGlwcGVyLmphdmEKQEAgLTc1LDcgKzc1LDcgQEAKICAgICAgICAgICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKEludGVudC5BQ1RJT05fVVNFUl9QUkVTRU5ULmVxdWFscyhhY3Rpb24pKSB7CiAgICAgICAgICAgICAgICAgbVVzZXJQcmVzZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CisgICAgICAgICAgICAgICAgdXBkYXRlUnVubmluZyhmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9OwpAQCAtMTA5LDcgKzEwOSw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgb25XaW5kb3dWaXNpYmlsaXR5Q2hhbmdlZChpbnQgdmlzaWJpbGl0eSkgewogICAgICAgICBzdXBlci5vbldpbmRvd1Zpc2liaWxpdHlDaGFuZ2VkKHZpc2liaWxpdHkpOwogICAgICAgICBtVmlzaWJsZSA9IHZpc2liaWxpdHkgPT0gVklTSUJMRTsKLSAgICAgICAgdXBkYXRlUnVubmluZygpOworICAgICAgICB1cGRhdGVSdW5uaW5nKGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE0NCwxMCArMTQ0LDIyIEBACiAgICAgICogb24ge0BsaW5rICNtUnVubmluZ30gYW5kIHtAbGluayAjbVZpc2libGV9IHN0YXRlLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSdW5uaW5nKCkgeworICAgICAgICB1cGRhdGVSdW5uaW5nKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIG1ldGhvZCB0byBzdGFydCBvciBzdG9wIGRpc3BhdGNoaW5nIGZsaXAge0BsaW5rIE1lc3NhZ2V9IGJhc2VkCisgICAgICogb24ge0BsaW5rICNtUnVubmluZ30gYW5kIHtAbGluayAjbVZpc2libGV9IHN0YXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGZsaXBOb3cgRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0byBleGVjdXRlIHRoZSBhbmltYXRpb24gbm93LCBpbgorICAgICAqICAgICAgICAgICAgYWRkaXRpb24gdG8gcXVldWluZyBmdXR1cmUgZmxpcHMuIElmIG9taXR0ZWQsIGRlZmF1bHRzIHRvCisgICAgICogICAgICAgICAgICB0cnVlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSdW5uaW5nKGJvb2xlYW4gZmxpcE5vdykgewogICAgICAgICBib29sZWFuIHJ1bm5pbmcgPSBtVmlzaWJsZSAmJiBtU3RhcnRlZCAmJiBtVXNlclByZXNlbnQ7CiAgICAgICAgIGlmIChydW5uaW5nICE9IG1SdW5uaW5nKSB7CiAgICAgICAgICAgICBpZiAocnVubmluZykgewotICAgICAgICAgICAgICAgIHNob3dPbmx5KG1XaGljaENoaWxkKTsKKyAgICAgICAgICAgICAgICBzaG93T25seShtV2hpY2hDaGlsZCwgZmxpcE5vdyk7CiAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKEZMSVBfTVNHKTsKICAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCBtRmxpcEludGVydmFsKTsKICAgICAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvWm9vbUJ1dHRvbnNDb250cm9sbGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvWm9vbUJ1dHRvbnNDb250cm9sbGVyLmphdmEKaW5kZXggM2RmNDE5YS4uNDUwYzk2NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1pvb21CdXR0b25zQ29udHJvbGxlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9ab29tQnV0dG9uc0NvbnRyb2xsZXIuamF2YQpAQCAtNjYsOCArNjYsOSBAQAogICoge0BsaW5rICNzZXRab29tSW5FbmFibGVkKGJvb2xlYW4pfSBhbmQge0BsaW5rICNzZXRab29tT3V0RW5hYmxlZChib29sZWFuKX0uCiAgKiA8cD4KICAqIElmIHlvdSBhcmUgdXNpbmcgdGhpcyB3aXRoIGEgY3VzdG9tIFZpZXcsIHBsZWFzZSBjYWxsCi0gKiB7QGxpbmsgI3NldFZpc2libGUoYm9vbGVhbikgc2V0VmlzaWJsZShmYWxzZSl9IGZyb20gdGhlCi0gKiB7QGxpbmsgVmlldyNvbkRldGFjaGVkRnJvbVdpbmRvd30uCisgKiB7QGxpbmsgI3NldFZpc2libGUoYm9vbGVhbikgc2V0VmlzaWJsZShmYWxzZSl9IGZyb20KKyAqIHtAbGluayBWaWV3I29uRGV0YWNoZWRGcm9tV2luZG93fSBhbmQgZnJvbSB7QGxpbmsgVmlldyNvblZpc2liaWxpdHlDaGFuZ2VkfQorICogd2hlbiA8Y29kZT52aXNpYmlsaXR5ICE9IFZpZXcuVklTSUJMRTwvY29kZT4uCiAgKgogICovCiBwdWJsaWMgY2xhc3MgWm9vbUJ1dHRvbnNDb250cm9sbGVyIGltcGxlbWVudHMgVmlldy5PblRvdWNoTGlzdGVuZXIgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9BY3Rpb25CYXJJbXBsLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FjdGlvbkJhckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDQ4MzUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9BY3Rpb25CYXJJbXBsLmphdmEKQEAgLTAsMCArMSw1OTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudVBvcHVwSGVscGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5TdWJNZW51QnVpbGRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXc7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhclZpZXc7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpb25CYXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXJBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlZpZXdBbmltYXRvcjsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIEFjdGlvbkJhckltcGwgaXMgdGhlIEFjdGlvbkJhciBpbXBsZW1lbnRhdGlvbiB1c2VkCisgKiBieSBkZXZpY2VzIG9mIGFsbCBzY3JlZW4gc2l6ZXMuIElmIGl0IGRldGVjdHMgYSBjb21wYXRpYmxlIGRlY29yLAorICogaXQgd2lsbCBzcGxpdCBjb250ZXh0dWFsIG1vZGVzIGFjcm9zcyBib3RoIHRoZSBBY3Rpb25CYXJWaWV3IGF0CisgKiB0aGUgdG9wIG9mIHRoZSBzY3JlZW4gYW5kIGEgaG9yaXpvbnRhbCBMaW5lYXJMYXlvdXQgYXQgdGhlIGJvdHRvbQorICogd2hpY2ggaXMgbm9ybWFsbHkgaGlkZGVuLgorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uQmFySW1wbCBleHRlbmRzIEFjdGlvbkJhciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PUk1BTF9WSUVXID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVYVF9WSUVXID0gMTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCX1NXSVRDSF9TSE9XX0hJREUgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfU1dJVENIX0FERF9SRU1PVkUgPSAxOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgQWN0aXZpdHkgbUFjdGl2aXR5OworICAgIHByaXZhdGUgRGlhbG9nIG1EaWFsb2c7CisKKyAgICBwcml2YXRlIFZpZXdBbmltYXRvciBtQW5pbWF0b3JWaWV3OworICAgIHByaXZhdGUgQWN0aW9uQmFyVmlldyBtQWN0aW9uVmlldzsKKyAgICBwcml2YXRlIEFjdGlvbkJhckNvbnRleHRWaWV3IG1VcHBlckNvbnRleHRWaWV3OworICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1Mb3dlckNvbnRleHRWaWV3OworCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8VGFiSW1wbD4gbVRhYnMgPSBuZXcgQXJyYXlMaXN0PFRhYkltcGw+KCk7CisKKyAgICBwcml2YXRlIGludCBtVGFiQ29udGFpbmVyVmlld0lkID0gYW5kcm9pZC5SLmlkLmNvbnRlbnQ7CisgICAgcHJpdmF0ZSBUYWJJbXBsIG1TZWxlY3RlZFRhYjsKKyAgICBwcml2YXRlIGludCBtVGFiU3dpdGNoTW9kZSA9IFRBQl9TV0lUQ0hfQUREX1JFTU9WRTsKKyAgICAKKyAgICBwcml2YXRlIEFjdGlvbk1vZGUgbUFjdGlvbk1vZGU7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFWFRfRElTUExBWV9OT1JNQUwgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05URVhUX0RJU1BMQVlfU1BMSVQgPSAxOworICAgIAorICAgIHByaXZhdGUgaW50IG1Db250ZXh0RGlzcGxheU1vZGU7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUNsb3NpbmdDb250ZXh0OworCisgICAgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgZmluYWwgUnVubmFibGUgbUNsb3NlQ29udGV4dCA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcuY2xvc2VNb2RlKCk7CisgICAgICAgICAgICBpZiAobUxvd2VyQ29udGV4dFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Mb3dlckNvbnRleHRWaWV3LnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2xvc2luZ0NvbnRleHQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgQWN0aW9uQmFySW1wbChBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICBtQWN0aXZpdHkgPSBhY3Rpdml0eTsKKyAgICAgICAgaW5pdChhY3Rpdml0eS5nZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKSk7CisgICAgfQorCisgICAgcHVibGljIEFjdGlvbkJhckltcGwoRGlhbG9nIGRpYWxvZykgeworICAgICAgICBtRGlhbG9nID0gZGlhbG9nOworICAgICAgICBpbml0KGRpYWxvZy5nZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXQoVmlldyBkZWNvcikgeworICAgICAgICBtQ29udGV4dCA9IGRlY29yLmdldENvbnRleHQoKTsKKyAgICAgICAgbUFjdGlvblZpZXcgPSAoQWN0aW9uQmFyVmlldykgZGVjb3IuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuYWN0aW9uX2Jhcik7CisgICAgICAgIG1VcHBlckNvbnRleHRWaWV3ID0gKEFjdGlvbkJhckNvbnRleHRWaWV3KSBkZWNvci5maW5kVmlld0J5SWQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5hY3Rpb25fY29udGV4dF9iYXIpOworICAgICAgICBtTG93ZXJDb250ZXh0VmlldyA9IChMaW5lYXJMYXlvdXQpIGRlY29yLmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmxvd2VyX2FjdGlvbl9jb250ZXh0X2Jhcik7CisgICAgICAgIG1BbmltYXRvclZpZXcgPSAoVmlld0FuaW1hdG9yKSBkZWNvci5maW5kVmlld0J5SWQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5hY3Rpb25fYmFyX2FuaW1hdG9yKTsKKworICAgICAgICBpZiAobUFjdGlvblZpZXcgPT0gbnVsbCB8fCBtVXBwZXJDb250ZXh0VmlldyA9PSBudWxsIHx8IG1BbmltYXRvclZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgY2FuIG9ubHkgYmUgdXNlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpdGggYSBjb21wYXRpYmxlIHdpbmRvdyBkZWNvciBsYXlvdXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1BY3Rpb25WaWV3LnNldENvbnRleHRWaWV3KG1VcHBlckNvbnRleHRWaWV3KTsKKyAgICAgICAgbUNvbnRleHREaXNwbGF5TW9kZSA9IG1Mb3dlckNvbnRleHRWaWV3ID09IG51bGwgPworICAgICAgICAgICAgICAgIENPTlRFWFRfRElTUExBWV9OT1JNQUwgOiBDT05URVhUX0RJU1BMQVlfU1BMSVQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShpbnQgdGl0bGVSZXNJZCwgaW50IHN1YnRpdGxlUmVzSWQpIHsKKyAgICAgICAgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShtQ29udGV4dC5nZXRTdHJpbmcodGl0bGVSZXNJZCksCisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0U3RyaW5nKHN1YnRpdGxlUmVzSWQpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKGludCB0aXRsZVJlc0lkKSB7CisgICAgICAgIHNldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUobUNvbnRleHQuZ2V0U3RyaW5nKHRpdGxlUmVzSWQpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShpbnQgcmVzSWQpIHsKKyAgICAgICAgc2V0VGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoaW50IHJlc0lkKSB7CisgICAgICAgIHNldFN1YnRpdGxlKG1Db250ZXh0LmdldFN0cmluZyhyZXNJZCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbU5hdmlnYXRpb25Nb2RlKFZpZXcgdmlldykgeworICAgICAgICBjbGVhbnVwVGFicygpOworICAgICAgICBtQWN0aW9uVmlldy5zZXRDdXN0b21OYXZpZ2F0aW9uVmlldyh2aWV3KTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0Q2FsbGJhY2sobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShTcGlubmVyQWRhcHRlciBhZGFwdGVyLCBOYXZpZ2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShhZGFwdGVyLCBjYWxsYmFjaywgLTEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUoU3Bpbm5lckFkYXB0ZXIgYWRhcHRlciwgTmF2aWdhdGlvbkNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgaW50IGRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uKSB7CisgICAgICAgIGNsZWFudXBUYWJzKCk7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldE5hdmlnYXRpb25Nb2RlKE5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0RHJvcGRvd25BZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBpZiAoZGVmYXVsdFNlbGVjdGVkUG9zaXRpb24gPj0gMCkgeworICAgICAgICAgICAgbUFjdGlvblZpZXcuc2V0RHJvcGRvd25TZWxlY3RlZFBvc2l0aW9uKGRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBtQWN0aW9uVmlldy5zZXRDYWxsYmFjayhjYWxsYmFjayk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSgpIHsKKyAgICAgICAgY2xlYW51cFRhYnMoKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0TmF2aWdhdGlvbk1vZGUoTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0Q2FsbGJhY2sobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgY2xlYW51cFRhYnMoKTsKKyAgICAgICAgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSh0aXRsZSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UgdGl0bGUsIENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSkgeworICAgICAgICBjbGVhbnVwVGFicygpOworICAgICAgICBtQWN0aW9uVmlldy5zZXROYXZpZ2F0aW9uTW9kZShOQVZJR0FUSU9OX01PREVfU1RBTkRBUkQpOworICAgICAgICBtQWN0aW9uVmlldy5zZXRUaXRsZSh0aXRsZSk7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldFN1YnRpdGxlKHN1YnRpdGxlKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0Q2FsbGJhY2sobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgc3dpdGNoIChtQWN0aW9uVmlldy5nZXROYXZpZ2F0aW9uTW9kZSgpKSB7CisgICAgICAgIGNhc2UgTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICBzZWxlY3RUYWIobVRhYnMuZ2V0KHBvc2l0aW9uKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgIG1BY3Rpb25WaWV3LnNldERyb3Bkb3duU2VsZWN0ZWRQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJzZXRTZWxlY3RlZE5hdmlnYXRpb25JdGVtIG5vdCB2YWxpZCBmb3IgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbSgpIHsKKyAgICAgICAgc3dpdGNoIChtQWN0aW9uVmlldy5nZXROYXZpZ2F0aW9uTW9kZSgpKSB7CisgICAgICAgIGNhc2UgTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICByZXR1cm4gbVNlbGVjdGVkVGFiLmdldFBvc2l0aW9uKCk7CisgICAgICAgIGNhc2UgTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0RHJvcGRvd25TZWxlY3RlZFBvc2l0aW9uKCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2xlYW51cFRhYnMoKSB7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUYWIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VsZWN0VGFiKG51bGwpOworICAgICAgICB9CisgICAgICAgIGlmICghbVRhYnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAobVRhYlN3aXRjaE1vZGUgPT0gVEFCX1NXSVRDSF9TSE9XX0hJREUpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBGcmFnbWVudFRyYW5zYWN0aW9uIHRyYW5zID0gbUFjdGl2aXR5Lm9wZW5GcmFnbWVudFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHRhYkNvdW50ID0gbVRhYnMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFiQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0cmFucy5yZW1vdmUobVRhYnMuZ2V0KGkpLmdldEZyYWdtZW50KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFucy5jb21taXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UYWJzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0VGl0bGUodGl0bGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSkgeworICAgICAgICBtQWN0aW9uVmlldy5zZXRTdWJ0aXRsZShzdWJ0aXRsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheU9wdGlvbnMoaW50IG9wdGlvbnMpIHsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0RGlzcGxheU9wdGlvbnMob3B0aW9ucyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheU9wdGlvbnMoaW50IG9wdGlvbnMsIGludCBtYXNrKSB7CisgICAgICAgIGZpbmFsIGludCBjdXJyZW50ID0gbUFjdGlvblZpZXcuZ2V0RGlzcGxheU9wdGlvbnMoKTsgCisgICAgICAgIG1BY3Rpb25WaWV3LnNldERpc3BsYXlPcHRpb25zKChvcHRpb25zICYgbWFzaykgfCAoY3VycmVudCAmIH5tYXNrKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZERyYXdhYmxlKERyYXdhYmxlIGQpIHsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0QmFja2dyb3VuZERyYXdhYmxlKGQpOworICAgIH0KKworICAgIHB1YmxpYyBWaWV3IGdldEN1c3RvbU5hdmlnYXRpb25WaWV3KCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0Q3VzdG9tTmF2aWdhdGlvblZpZXcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0VGl0bGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFN1YnRpdGxlKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0U3VidGl0bGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE5hdmlnYXRpb25Nb2RlKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0TmF2aWdhdGlvbk1vZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERpc3BsYXlPcHRpb25zKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0RGlzcGxheU9wdGlvbnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGUoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBpZiAobUFjdGlvbk1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFjdGlvbk1vZGUuZmluaXNoKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEb24ndCB3YWl0IGZvciB0aGUgY2xvc2UgY29udGV4dCBtb2RlIGFuaW1hdGlvbiB0byBmaW5pc2guCisgICAgICAgIGlmIChtQ2xvc2luZ0NvbnRleHQpIHsKKyAgICAgICAgICAgIG1BbmltYXRvclZpZXcuY2xlYXJBbmltYXRpb24oKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtQ2xvc2VDb250ZXh0KTsKKyAgICAgICAgICAgIG1DbG9zZUNvbnRleHQucnVuKCk7CisgICAgICAgIH0KKworICAgICAgICBBY3Rpb25Nb2RlIG1vZGUgPSBuZXcgQWN0aW9uTW9kZUltcGwoY2FsbGJhY2spOworICAgICAgICBpZiAoY2FsbGJhY2sub25DcmVhdGVBY3Rpb25Nb2RlKG1vZGUsIG1vZGUuZ2V0TWVudSgpKSkgeworICAgICAgICAgICAgbW9kZS5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5pbml0Rm9yTW9kZShtb2RlKTsKKyAgICAgICAgICAgIG1BbmltYXRvclZpZXcuc2V0RGlzcGxheWVkQ2hpbGQoQ09OVEVYVF9WSUVXKTsKKyAgICAgICAgICAgIGlmIChtTG93ZXJDb250ZXh0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyBhbmltYXRlIHRoaXMKKyAgICAgICAgICAgICAgICBtTG93ZXJDb250ZXh0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgICAgICByZXR1cm4gbW9kZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlVGFiKFRhYiB0YWIsIGludCBwb3NpdGlvbikgeworICAgICAgICBmaW5hbCBUYWJJbXBsIHRhYmkgPSAoVGFiSW1wbCkgdGFiOworICAgICAgICBmaW5hbCBib29sZWFuIGlzRmlyc3RUYWIgPSBtVGFicy5pc0VtcHR5KCk7CisgICAgICAgIGZpbmFsIEZyYWdtZW50VHJhbnNhY3Rpb24gdHJhbnMgPSBtQWN0aXZpdHkub3BlbkZyYWdtZW50VHJhbnNhY3Rpb24oKTsKKyAgICAgICAgZmluYWwgRnJhZ21lbnQgZnJhZyA9IHRhYmkuZ2V0RnJhZ21lbnQoKTsKKworICAgICAgICB0YWJpLnNldFBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgbVRhYnMuYWRkKHBvc2l0aW9uLCB0YWJpKTsKKworICAgICAgICBpZiAobVRhYlN3aXRjaE1vZGUgPT0gVEFCX1NXSVRDSF9TSE9XX0hJREUpIHsKKyAgICAgICAgICAgIGlmICghZnJhZy5pc0FkZGVkKCkpIHsKKyAgICAgICAgICAgICAgICB0cmFucy5hZGQobVRhYkNvbnRhaW5lclZpZXdJZCwgZnJhZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNGaXJzdFRhYikgeworICAgICAgICAgICAgaWYgKG1UYWJTd2l0Y2hNb2RlID09IFRBQl9TV0lUQ0hfU0hPV19ISURFKSB7CisgICAgICAgICAgICAgICAgdHJhbnMuc2hvdyhmcmFnKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVRhYlN3aXRjaE1vZGUgPT0gVEFCX1NXSVRDSF9BRERfUkVNT1ZFKSB7CisgICAgICAgICAgICAgICAgdHJhbnMuYWRkKG1UYWJDb250YWluZXJWaWV3SWQsIGZyYWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNlbGVjdGVkVGFiID0gdGFiaTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtVGFiU3dpdGNoTW9kZSA9PSBUQUJfU1dJVENIX1NIT1dfSElERSkgeworICAgICAgICAgICAgICAgIHRyYW5zLmhpZGUoZnJhZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHJhbnMuY29tbWl0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkVGFiKFRhYiB0YWIpIHsKKyAgICAgICAgbUFjdGlvblZpZXcuYWRkVGFiKHRhYik7CisgICAgICAgIGNvbmZpZ3VyZVRhYih0YWIsIG1UYWJzLnNpemUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5zZXJ0VGFiKFRhYiB0YWIsIGludCBwb3NpdGlvbikgeworICAgICAgICBtQWN0aW9uVmlldy5pbnNlcnRUYWIodGFiLCBwb3NpdGlvbik7CisgICAgICAgIGNvbmZpZ3VyZVRhYih0YWIsIHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGFiIG5ld1RhYigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUYWJJbXBsKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVGFiKFRhYiB0YWIpIHsKKyAgICAgICAgcmVtb3ZlVGFiQXQodGFiLmdldFBvc2l0aW9uKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRhYkF0KGludCBwb3NpdGlvbikgeworICAgICAgICBtQWN0aW9uVmlldy5yZW1vdmVUYWJBdChwb3NpdGlvbik7CisgICAgICAgIG1UYWJzLnJlbW92ZShwb3NpdGlvbik7CisKKyAgICAgICAgZmluYWwgaW50IG5ld1RhYkNvdW50ID0gbVRhYnMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gcG9zaXRpb247IGkgPCBuZXdUYWJDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBtVGFicy5nZXQoaSkuc2V0UG9zaXRpb24oaSk7CisgICAgICAgIH0KKworICAgICAgICBzZWxlY3RUYWIobVRhYnMuaXNFbXB0eSgpID8gbnVsbCA6IG1UYWJzLmdldChNYXRoLm1heCgwLCBwb3NpdGlvbiAtIDEpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VGFiTmF2aWdhdGlvbk1vZGUoKSB7CisgICAgICAgIGlmIChtQWN0aXZpdHkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlRhYiBuYXZpZ2F0aW9uIG1vZGUgY2Fubm90IGJlIHVzZWQgb3V0c2lkZSBvZiBhbiBBY3Rpdml0eSIpOworICAgICAgICB9CisgICAgICAgIG1BY3Rpb25WaWV3LnNldE5hdmlnYXRpb25Nb2RlKE5BVklHQVRJT05fTU9ERV9UQUJTKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUYWJOYXZpZ2F0aW9uTW9kZShpbnQgY29udGFpbmVyVmlld0lkKSB7CisgICAgICAgIG1UYWJDb250YWluZXJWaWV3SWQgPSBjb250YWluZXJWaWV3SWQ7CisgICAgICAgIHNldFRhYk5hdmlnYXRpb25Nb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2VsZWN0VGFiKFRhYiB0YWIpIHsKKyAgICAgICAgaWYgKG1TZWxlY3RlZFRhYiA9PSB0YWIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1BY3Rpb25WaWV3LnNldFRhYlNlbGVjdGVkKHRhYiAhPSBudWxsID8gdGFiLmdldFBvc2l0aW9uKCkgOiBUYWIuSU5WQUxJRF9QT1NJVElPTik7CisgICAgICAgIGZpbmFsIEZyYWdtZW50VHJhbnNhY3Rpb24gdHJhbnMgPSBtQWN0aXZpdHkub3BlbkZyYWdtZW50VHJhbnNhY3Rpb24oKTsKKyAgICAgICAgaWYgKG1TZWxlY3RlZFRhYiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobVRhYlN3aXRjaE1vZGUgPT0gVEFCX1NXSVRDSF9TSE9XX0hJREUpIHsKKyAgICAgICAgICAgICAgICB0cmFucy5oaWRlKG1TZWxlY3RlZFRhYi5nZXRGcmFnbWVudCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVRhYlN3aXRjaE1vZGUgPT0gVEFCX1NXSVRDSF9BRERfUkVNT1ZFKSB7CisgICAgICAgICAgICAgICAgdHJhbnMucmVtb3ZlKG1TZWxlY3RlZFRhYi5nZXRGcmFnbWVudCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodGFiICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtVGFiU3dpdGNoTW9kZSA9PSBUQUJfU1dJVENIX1NIT1dfSElERSkgeworICAgICAgICAgICAgICAgIHRyYW5zLnNob3codGFiLmdldEZyYWdtZW50KCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVGFiU3dpdGNoTW9kZSA9PSBUQUJfU1dJVENIX0FERF9SRU1PVkUpIHsKKyAgICAgICAgICAgICAgICB0cmFucy5hZGQobVRhYkNvbnRhaW5lclZpZXdJZCwgdGFiLmdldEZyYWdtZW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1TZWxlY3RlZFRhYiA9IChUYWJJbXBsKSB0YWI7CisgICAgICAgIHRyYW5zLmNvbW1pdCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0SGVpZ2h0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgLy8gVE9ETyBhbmltYXRlIQorICAgICAgICBtQW5pbWF0b3JWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICAvLyBUT0RPIGFuaW1hdGUhCisgICAgICAgIG1BbmltYXRvclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2hvd2luZygpIHsKKyAgICAgICAgcmV0dXJuIG1BbmltYXRvclZpZXcuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZSAKKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgQWN0aW9uTW9kZUltcGwgZXh0ZW5kcyBBY3Rpb25Nb2RlIGltcGxlbWVudHMgTWVudUJ1aWxkZXIuQ2FsbGJhY2sgeworICAgICAgICBwcml2YXRlIEFjdGlvbk1vZGUuQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgICAgICBwcml2YXRlIE1lbnVCdWlsZGVyIG1NZW51OworICAgICAgICBwcml2YXRlIFdlYWtSZWZlcmVuY2U8Vmlldz4gbUN1c3RvbVZpZXc7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgQWN0aW9uTW9kZUltcGwoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgICAgICBtTWVudSA9IG5ldyBNZW51QnVpbGRlcihtQWN0aW9uVmlldy5nZXRDb250ZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIC5zZXREZWZhdWx0U2hvd0FzQWN0aW9uKE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX0lGX1JPT00pOworICAgICAgICAgICAgbU1lbnUuc2V0Q2FsbGJhY2sodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1lbnVJbmZsYXRlciBnZXRNZW51SW5mbGF0ZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1lbnVJbmZsYXRlcihtQ29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1lbnUgZ2V0TWVudSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7CisgICAgICAgICAgICBpZiAobUFjdGlvbk1vZGUgIT0gdGhpcykgeworICAgICAgICAgICAgICAgIC8vIE5vdCB0aGUgYWN0aXZlIGFjdGlvbiBtb2RlIC0gbm8tb3AKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1DYWxsYmFjay5vbkRlc3Ryb3lBY3Rpb25Nb2RlKHRoaXMpOworICAgICAgICAgICAgbUFuaW1hdG9yVmlldy5zZXREaXNwbGF5ZWRDaGlsZChOT1JNQUxfVklFVyk7CisKKyAgICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgY29udGV4dCBtb2RlIHZpZXdzIGFmdGVyIHRoZSBhbmltYXRpb24gZmluaXNoZXMKKyAgICAgICAgICAgIG1DbG9zaW5nQ29udGV4dCA9IHRydWU7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChtQ2xvc2VDb250ZXh0LCBtQW5pbWF0b3JWaWV3LmdldE91dEFuaW1hdGlvbigpLmdldER1cmF0aW9uKCkpOworCisgICAgICAgICAgICBpZiAobUxvd2VyQ29udGV4dFZpZXcgIT0gbnVsbCAmJiBtTG93ZXJDb250ZXh0Vmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gVmlldy5HT05FKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyBBbmltYXRlIHRoaXMKKyAgICAgICAgICAgICAgICBtTG93ZXJDb250ZXh0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQWN0aW9uTW9kZSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpIHsKKyAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sub25QcmVwYXJlQWN0aW9uTW9kZSh0aGlzLCBtTWVudSkpIHsKKyAgICAgICAgICAgICAgICAvLyBSZWZyZXNoIGNvbnRlbnQgaW4gYm90aCBjb250ZXh0IHZpZXdzCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tVmlldyhWaWV3IHZpZXcpIHsKKyAgICAgICAgICAgIG1VcHBlckNvbnRleHRWaWV3LnNldEN1c3RvbVZpZXcodmlldyk7CisgICAgICAgICAgICBtQ3VzdG9tVmlldyA9IG5ldyBXZWFrUmVmZXJlbmNlPFZpZXc+KHZpZXcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSkgeworICAgICAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcuc2V0U3VidGl0bGUoc3VidGl0bGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcuc2V0VGl0bGUodGl0bGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKGludCByZXNJZCkgeworICAgICAgICAgICAgc2V0VGl0bGUobUFjdGl2aXR5LmdldFN0cmluZyhyZXNJZCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlKGludCByZXNJZCkgeworICAgICAgICAgICAgc2V0U3VidGl0bGUobUFjdGl2aXR5LmdldFN0cmluZyhyZXNJZCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVVwcGVyQ29udGV4dFZpZXcuZ2V0VGl0bGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFN1YnRpdGxlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1VcHBlckNvbnRleHRWaWV3LmdldFN1YnRpdGxlKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBnZXRDdXN0b21WaWV3KCkgeworICAgICAgICAgICAgcmV0dXJuIG1DdXN0b21WaWV3ICE9IG51bGwgPyBtQ3VzdG9tVmlldy5nZXQoKSA6IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbk1lbnVJdGVtU2VsZWN0ZWQoTWVudUJ1aWxkZXIgbWVudSwgTWVudUl0ZW0gaXRlbSkgeworICAgICAgICAgICAgcmV0dXJuIG1DYWxsYmFjay5vbkFjdGlvbkl0ZW1DbGlja2VkKHRoaXMsIGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25DbG9zZU1lbnUoTWVudUJ1aWxkZXIgbWVudSwgYm9vbGVhbiBhbGxNZW51c0FyZUNsb3NpbmcpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uU3ViTWVudVNlbGVjdGVkKFN1Yk1lbnVCdWlsZGVyIHN1Yk1lbnUpIHsKKyAgICAgICAgICAgIGlmICghc3ViTWVudS5oYXNWaXNpYmxlSXRlbXMoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXcgTWVudVBvcHVwSGVscGVyKG1Db250ZXh0LCBzdWJNZW51KS5zaG93KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xvc2VTdWJNZW51KFN1Yk1lbnVCdWlsZGVyIG1lbnUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTWVudU1vZGVDaGFuZ2UoTWVudUJ1aWxkZXIgbWVudSkgeworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcuc2hvd092ZXJmbG93TWVudSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgVGFiSW1wbCBleHRlbmRzIEFjdGlvbkJhci5UYWIgeworICAgICAgICBwcml2YXRlIEZyYWdtZW50IG1GcmFnbWVudDsKKyAgICAgICAgcHJpdmF0ZSBEcmF3YWJsZSBtSWNvbjsKKyAgICAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRleHQ7CisgICAgICAgIHByaXZhdGUgaW50IG1Qb3NpdGlvbjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZyYWdtZW50IGdldEZyYWdtZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1GcmFnbWVudDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRHJhd2FibGUgZ2V0SWNvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtSWNvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldFBvc2l0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Qb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBvc2l0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgbVBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1UZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgICAgICAgICBtRnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRJY29uKERyYXdhYmxlIGljb24pIHsKKyAgICAgICAgICAgIG1JY29uID0gaWNvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KCkgeworICAgICAgICAgICAgc2VsZWN0VGFiKHRoaXMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9Mb2NhbGVQaWNrZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlUGlja2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyZDY5MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlUGlja2VyLmphdmEKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5JQWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RGcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5iYWNrdXAuQmFja3VwTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworCitpbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworcHVibGljIGNsYXNzIExvY2FsZVBpY2tlciBleHRlbmRzIExpc3RGcmFnbWVudCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJMb2NhbGVQaWNrZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIExvY2FsZVNlbGVjdGlvbkxpc3RlbmVyIHsKKyAgICAgICAgLy8gWW91IGNhbiBhZGQgYW55IGFyZ3VtZW50IGlmIHlvdSByZWFsbHkgbmVlZCBpdC4uLgorICAgICAgICBwdWJsaWMgdm9pZCBvbkxvY2FsZVNlbGVjdGVkKCk7CisgICAgfQorCisgICAgTG9jW10gbUxvY2FsZXM7CisgICAgU3RyaW5nW10gbVNwZWNpYWxMb2NhbGVDb2RlczsKKyAgICBTdHJpbmdbXSBtU3BlY2lhbExvY2FsZU5hbWVzOworCisKKyAgICBMb2NhbGVTZWxlY3Rpb25MaXN0ZW5lciBtTGlzdGVuZXI7ICAvLyBkZWZhdWx0IHRvIG51bGwKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExvYyBpbXBsZW1lbnRzIENvbXBhcmFibGU8TG9jPiB7CisgICAgICAgIHN0YXRpYyBDb2xsYXRvciBzQ29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOworCisgICAgICAgIFN0cmluZyBsYWJlbDsKKyAgICAgICAgTG9jYWxlIGxvY2FsZTsKKworICAgICAgICBwdWJsaWMgTG9jKFN0cmluZyBsYWJlbCwgTG9jYWxlIGxvY2FsZSkgeworICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgICAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmxhYmVsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKExvYyBhbm90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gc0NvbGxhdG9yLmNvbXBhcmUodGhpcy5sYWJlbCwgYW5vdGhlci5sYWJlbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VXBMb2NhbGVMaXN0KCkgeworICAgICAgICBmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7CisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXNvdXJjZXMgPSBhY3Rpdml0eS5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgbVNwZWNpYWxMb2NhbGVDb2RlcyA9IHJlc291cmNlcy5nZXRTdHJpbmdBcnJheShSLmFycmF5LnNwZWNpYWxfbG9jYWxlX2NvZGVzKTsKKyAgICAgICAgbVNwZWNpYWxMb2NhbGVOYW1lcyA9IHJlc291cmNlcy5nZXRTdHJpbmdBcnJheShSLmFycmF5LnNwZWNpYWxfbG9jYWxlX25hbWVzKTsKKworICAgICAgICBmaW5hbCBTdHJpbmdbXSBsb2NhbGVzID0gYWN0aXZpdHkuZ2V0QXNzZXRzKCkuZ2V0TG9jYWxlcygpOworICAgICAgICBBcnJheXMuc29ydChsb2NhbGVzKTsKKyAgICAgICAgZmluYWwgaW50IG9yaWdTaXplID0gbG9jYWxlcy5sZW5ndGg7CisgICAgICAgIExvY1tdIHByZXByb2Nlc3MgPSBuZXcgTG9jW29yaWdTaXplXTsKKyAgICAgICAgaW50IGZpbmFsU2l6ZSA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG9yaWdTaXplOyBpKysgKSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IGxvY2FsZXNbaV07CisgICAgICAgICAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gNSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IHMuc3Vic3RyaW5nKDAsIDIpOworICAgICAgICAgICAgICAgIFN0cmluZyBjb3VudHJ5ID0gcy5zdWJzdHJpbmcoMywgNSk7CisgICAgICAgICAgICAgICAgTG9jYWxlIGwgPSBuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5KTsKKworICAgICAgICAgICAgICAgIGlmIChmaW5hbFNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgImFkZGluZyBpbml0aWFsICIrIHRvVGl0bGVDYXNlKGwuZ2V0RGlzcGxheUxhbmd1YWdlKGwpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc1tmaW5hbFNpemUrK10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2ModG9UaXRsZUNhc2UobC5nZXREaXNwbGF5TGFuZ3VhZ2UobCkpLCBsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBwcmV2aW91cyBlbnRyeToKKyAgICAgICAgICAgICAgICAgICAgLy8gIHNhbWUgbGFuZyBhbmQgYSBjb3VudHJ5IC0+IHVwZ3JhZGUgdG8gZnVsbCBuYW1lIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyAgICBpbnNlcnQgb3VycyB3aXRoIGZ1bGwgbmFtZQorICAgICAgICAgICAgICAgICAgICAvLyAgZGlmZiBsYW5nIC0+IGluc2VydCBvdXJzIHdpdGggbGFuZy1vbmx5IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXByb2Nlc3NbZmluYWxTaXplLTFdLmxvY2FsZS5nZXRMYW5ndWFnZSgpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgImJhY2tpbmcgdXAgYW5kIGZpeGluZyAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc1tmaW5hbFNpemUtMV0ubGFiZWwrIiB0byAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGlzcGxheU5hbWUocHJlcHJvY2Vzc1tmaW5hbFNpemUtMV0ubG9jYWxlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVwcm9jZXNzW2ZpbmFsU2l6ZS0xXS5sYWJlbCA9IHRvVGl0bGVDYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREaXNwbGF5TmFtZShwcmVwcm9jZXNzW2ZpbmFsU2l6ZS0xXS5sb2NhbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIiAgYW5kIGFkZGluZyAiKyB0b1RpdGxlQ2FzZShnZXREaXNwbGF5TmFtZShsKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc1tmaW5hbFNpemUrK10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9jKHRvVGl0bGVDYXNlKGdldERpc3BsYXlOYW1lKGwpKSwgbCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGlzcGxheU5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5lcXVhbHMoInp6X1paIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZSA9ICJQc2V1ZG8uLi4iOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZSA9IHRvVGl0bGVDYXNlKGwuZ2V0RGlzcGxheUxhbmd1YWdlKGwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgImFkZGluZyAiK2Rpc3BsYXlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXByb2Nlc3NbZmluYWxTaXplKytdID0gbmV3IExvYyhkaXNwbGF5TmFtZSwgbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUxvY2FsZXMgPSBuZXcgTG9jW2ZpbmFsU2l6ZV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmluYWxTaXplIDsgaSsrKSB7CisgICAgICAgICAgICBtTG9jYWxlc1tpXSA9IHByZXByb2Nlc3NbaV07CisgICAgICAgIH0KKyAgICAgICAgQXJyYXlzLnNvcnQobUxvY2FsZXMpOworICAgICAgICBmaW5hbCBpbnQgbGF5b3V0SWQgPSBSLmxheW91dC5sb2NhbGVfcGlja2VyX2l0ZW07CisgICAgICAgIGZpbmFsIGludCBmaWVsZElkID0gUi5pZC5sb2NhbGU7CisgICAgICAgIGZpbmFsIEFycmF5QWRhcHRlcjxMb2M+IGFkYXB0ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBBcnJheUFkYXB0ZXI8TG9jPihhY3Rpdml0eSwgbGF5b3V0SWQsIGZpZWxkSWQsIG1Mb2NhbGVzKTsKKyAgICAgICAgc2V0TGlzdEFkYXB0ZXIoYWRhcHRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoZmluYWwgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkFjdGl2aXR5Q3JlYXRlZChzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRVcExvY2FsZUxpc3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGVTZWxlY3Rpb25MaXN0ZW5lcihMb2NhbGVTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9UaXRsZUNhc2UoU3RyaW5nIHMpIHsKKyAgICAgICAgaWYgKHMubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHMuY2hhckF0KDApKSArIHMuc3Vic3RyaW5nKDEpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldERpc3BsYXlOYW1lKExvY2FsZSBsKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gbC50b1N0cmluZygpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVNwZWNpYWxMb2NhbGVDb2Rlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG1TcGVjaWFsTG9jYWxlQ29kZXNbaV0uZXF1YWxzKGNvZGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TcGVjaWFsTG9jYWxlTmFtZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbC5nZXREaXNwbGF5TmFtZShsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgZ2V0TGlzdFZpZXcoKS5yZXF1ZXN0Rm9jdXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElBY3Rpdml0eU1hbmFnZXIgYW0gPSBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpOworICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcgPSBhbS5nZXRDb25maWd1cmF0aW9uKCk7CisKKyAgICAgICAgICAgIExvYyBsb2MgPSBtTG9jYWxlc1twb3NpdGlvbl07CisgICAgICAgICAgICBjb25maWcubG9jYWxlID0gbG9jLmxvY2FsZTsKKworICAgICAgICAgICAgLy8gaW5kaWNhdGUgdGhpcyBpc24ndCBzb21lIHBhc3NpbmcgZGVmYXVsdCAtIHRoZSB1c2VyIHdhbnRzIHRoaXMgcmVtZW1iZXJlZAorICAgICAgICAgICAgY29uZmlnLnVzZXJTZXRMb2NhbGUgPSB0cnVlOworCisgICAgICAgICAgICBhbS51cGRhdGVDb25maWd1cmF0aW9uKGNvbmZpZyk7CisgICAgICAgICAgICAvLyBUcmlnZ2VyIHRoZSBkaXJ0eSBiaXQgZm9yIHRoZSBTZXR0aW5ncyBQcm92aWRlci4KKyAgICAgICAgICAgIEJhY2t1cE1hbmFnZXIuZGF0YUNoYW5nZWQoImNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncyIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rCisgICAgICAgIH0KKworICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lci5vbkxvY2FsZVNlbGVjdGVkKCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0SG9zdC5haWRsIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0SG9zdC5haWRsCmluZGV4IDJlZDQ3NzMuLjIxNmQ5ODUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldEhvc3QuYWlkbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwd2lkZ2V0L0lBcHBXaWRnZXRIb3N0LmFpZGwKQEAgLTI0LDUgKzI0LDYgQEAKIG9uZXdheSBpbnRlcmZhY2UgSUFwcFdpZGdldEhvc3QgewogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0KGludCBhcHBXaWRnZXRJZCwgaW4gUmVtb3RlVmlld3Mgdmlld3MpOwogICAgIHZvaWQgcHJvdmlkZXJDaGFuZ2VkKGludCBhcHBXaWRnZXRJZCwgaW4gQXBwV2lkZ2V0UHJvdmlkZXJJbmZvIGluZm8pOworICAgIHZvaWQgdmlld0RhdGFDaGFuZ2VkKGludCBhcHBXaWRnZXRJZCwgaW50IHZpZXdJZCk7CiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldFNlcnZpY2UuYWlkbCBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldFNlcnZpY2UuYWlkbAppbmRleCA0OTZhYTFhLi40ZDU2NzQ1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwd2lkZ2V0L0lBcHBXaWRnZXRTZXJ2aWNlLmFpZGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0U2VydmljZS5haWRsCkBAIC00MCw3ICs0MCw5IEBACiAgICAgLy8gZm9yIEFwcFdpZGdldE1hbmFnZXIKICAgICAvLwogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0SWRzKGluIGludFtdIGFwcFdpZGdldElkcywgaW4gUmVtb3RlVmlld3Mgdmlld3MpOworICAgIHZvaWQgcGFydGlhbGx5VXBkYXRlQXBwV2lkZ2V0SWRzKGluIGludFtdIGFwcFdpZGdldElkcywgaW4gUmVtb3RlVmlld3Mgdmlld3MpOwogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0UHJvdmlkZXIoaW4gQ29tcG9uZW50TmFtZSBwcm92aWRlciwgaW4gUmVtb3RlVmlld3Mgdmlld3MpOworICAgIHZvaWQgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkKGluIGludFtdIGFwcFdpZGdldElkcywgaW50IHZpZXdJZCk7CiAgICAgTGlzdDxBcHBXaWRnZXRQcm92aWRlckluZm8+IGdldEluc3RhbGxlZFByb3ZpZGVycygpOwogICAgIEFwcFdpZGdldFByb3ZpZGVySW5mbyBnZXRBcHBXaWRnZXRJbmZvKGludCBhcHBXaWRnZXRJZCk7CiAgICAgdm9pZCBiaW5kQXBwV2lkZ2V0SWQoaW50IGFwcFdpZGdldElkLCBpbiBDb21wb25lbnROYW1lIHByb3ZpZGVyKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9kYXRhYmFzZS9Tb3J0Q3Vyc29yLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvZGF0YWJhc2UvU29ydEN1cnNvci5qYXZhCmluZGV4IDk5NDEwYmMuLjAwMjU1MTI4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvZGF0YWJhc2UvU29ydEN1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9kYXRhYmFzZS9Tb3J0Q3Vyc29yLmphdmEKQEAgLTE4MiwyNCArMTgyLDYgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuZGVsZXRlUm93KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcygpIHsKLSAgICAgICAgaW50IGxlbmd0aCA9IG1DdXJzb3JzLmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbGVuZ3RoIDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobUN1cnNvcnNbaV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DdXJzb3JzW2ldLmNvbW1pdFVwZGF0ZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBvbkNoYW5nZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGNvbHVtbikKICAgICB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldFN0cmluZyhjb2x1bW4pOwpAQCAtMjM2LDYgKzIxOCwxMSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uKSB7CisgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldFR5cGUoY29sdW1uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc051bGwoaW50IGNvbHVtbikKICAgICB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmlzTnVsbChjb2x1bW4pOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1J1bnRpbWVJbml0LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvUnVudGltZUluaXQuamF2YQppbmRleCA1OTYwMGRjLi41NzY3ODMyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvUnVudGltZUluaXQuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvUnVudGltZUluaXQuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRmluYWxpemVyczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogCkBAIC0xNDEsNiArMTQyLDEyIEBACiAgICAgICAgICAgICBEZWJ1Zy5lbmFibGVFbXVsYXRvclRyYWNlT3V0cHV0KCk7CiAgICAgICAgIH0KIAorICAgICAgICAvKioKKyAgICAgICAgICogSW5pdGlhbGl6ZSB0aGUgdGhyZWFkIHVzZWQgdG8gcmVjbGFpbSByZXNvdXJjZXMgd2l0aG91dAorICAgICAgICAgKiBnb2luZyB0aHJvdWdoIGZpbmFsaXplcnMuCisgICAgICAgICAqLworICAgICAgICBGaW5hbGl6ZXJzLmluaXQoKTsKKwogICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7CiAgICAgfQogCkBAIC0zMzEsOSArMzM4LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKiBDb3VudGVyIHVzZWQgdG8gcHJldmVudCByZWVudHJhbmN5IGluIHtAbGluayAjcmVwb3J0RXhjZXB0aW9ufS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNJbnRlZ2VyIHNJblJlcG9ydEV4Y2VwdGlvbiA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7Ci0KICAgICAvKioKICAgICAgKiBTZXQgdGhlIG9iamVjdCBpZGVudGlmeWluZyB0aGlzIGFwcGxpY2F0aW9uL3Byb2Nlc3MsIGZvciByZXBvcnRpbmcgVk0KICAgICAgKiBlcnJvcnMuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLmphdmEKaW5kZXggMTI3ZmIyMy4uMzgzNjJjMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1NhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uamF2YQpAQCAtMTYsMTQgKzE2LDE1IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwub3M7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87CiBpbXBvcnQgZGFsdmlrLnN5c3RlbS5TYW1wbGluZ1Byb2ZpbGVyOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC5vcy4qOwpAQCAtMzUsMTUgKzM2LDI3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbiI7CiAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTTkFQU0hPVF9ESVIgPSAiL2RhdGEvc25hcHNob3RzIjsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZW5hYmxlZDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeGVjdXRvciBzbmFwc2hvdFdyaXRlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgc2FtcGxpbmdQcm9maWxlckh6OworICAgIAorICAgIC8qKiBXaGV0aGVyIG9yIG5vdCB3ZSd2ZSBjcmVhdGVkIHRoZSBzbmFwc2hvdHMgZGlyLiAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGlyTWFkZSA9IGZhbHNlOworCisgICAgLyoqIFdoZXRoZXIgb3Igbm90IGEgc25hcHNob3QgaXMgYmVpbmcgcGVyc2lzdGVkLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0Jvb2xlYW4gcGVuZGluZyA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKwogICAgIHN0YXRpYyB7Ci0gICAgICAgIGVuYWJsZWQgPSAiMSIuZXF1YWxzKFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJwZXJzaXN0LnNhbXBsaW5nX3Byb2ZpbGVyIikpOwotICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBzYW1wbGluZ1Byb2ZpbGVySHogPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEludCgicGVyc2lzdC5zeXMucHJvZmlsZXJfaHoiLCAwKTsKKyAgICAgICAgaWYgKHNhbXBsaW5nUHJvZmlsZXJIeiA+IDApIHsKICAgICAgICAgICAgIHNuYXBzaG90V3JpdGVyID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJQcm9maWxlciBpcyBlbmFibGVkLiIpOworICAgICAgICAgICAgZW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICBMb2cuaShUQUcsICJQcm9maWxlciBpcyBlbmFibGVkLiBTYW1wbGluZyBQcm9maWxlciBIejogIiArIHNhbXBsaW5nUHJvZmlsZXJIeik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzbmFwc2hvdFdyaXRlciA9IG51bGw7CisgICAgICAgICAgICBlbmFibGVkID0gZmFsc2U7CiAgICAgICAgICAgICBMb2cuaShUQUcsICJQcm9maWxlciBpcyBkaXNhYmxlZC4iKTsKICAgICAgICAgfQogICAgIH0KQEAgLTYwLDQ2ICs3Myw0NSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydCgpIHsKICAgICAgICAgaWYgKCFlbmFibGVkKSByZXR1cm47Ci0gICAgICAgIFNhbXBsaW5nUHJvZmlsZXIuZ2V0SW5zdGFuY2UoKS5zdGFydCgxMCk7CisgICAgICAgIFNhbXBsaW5nUHJvZmlsZXIuZ2V0SW5zdGFuY2UoKS5zdGFydChzYW1wbGluZ1Byb2ZpbGVySHopOwogICAgIH0KIAotICAgIC8qKiBXaGV0aGVyIG9yIG5vdCB3ZSd2ZSBjcmVhdGVkIHRoZSBzbmFwc2hvdHMgZGlyLiAqLwotICAgIHN0YXRpYyBib29sZWFuIGRpck1hZGUgPSBmYWxzZTsKLQotICAgIC8qKiBXaGV0aGVyIG9yIG5vdCBhIHNuYXBzaG90IGlzIGJlaW5nIHBlcnNpc3RlZC4gKi8KLSAgICBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBwZW5kaW5nOwotCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgc25hcHNob3QgdG8gdGhlIFNEIGNhcmQgaWYgcHJvZmlsaW5nIGlzIGVuYWJsZWQuCisgICAgICogV3JpdGVzIGEgc25hcHNob3QgaWYgcHJvZmlsaW5nIGlzIGVuYWJsZWQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlU25hcHNob3QoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVTbmFwc2hvdChmaW5hbCBTdHJpbmcgcHJvY2Vzc05hbWUsIGZpbmFsIFBhY2thZ2VJbmZvIHBhY2thZ2VJbmZvKSB7CiAgICAgICAgIGlmICghZW5hYmxlZCkgcmV0dXJuOwogCiAgICAgICAgIC8qCi0gICAgICAgICAqIElmIHdlJ3JlIGFscmVhZHkgd3JpdGluZyBhIHNuYXBzaG90LCBkb24ndCBib3RoZXIgZW5xdWVpbmcgYW5vdGhlcgorICAgICAgICAgKiBJZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgYSBzbmFwc2hvdCwgZG9uJ3QgYm90aGVyIGVucXVldWVpbmcgYW5vdGhlcgogICAgICAgICAgKiByZXF1ZXN0IHJpZ2h0IG5vdy4gVGhpcyB3aWxsIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGluZGl2aWR1YWwKICAgICAgICAgICogc25hcHNob3RzIGFuZCBpbiB0dXJuIHRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IGNvbnN1bWVkIChvbmUgYmlnCiAgICAgICAgICAqIHNuYXBzaG90IGlzIHNtYWxsZXIgdGhhbiBOIHN1YnNldCBzbmFwc2hvdHMpLgogICAgICAgICAgKi8KLSAgICAgICAgaWYgKCFwZW5kaW5nKSB7Ci0gICAgICAgICAgICBwZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgaWYgKHBlbmRpbmcuY29tcGFyZUFuZFNldChmYWxzZSwgdHJ1ZSkpIHsKICAgICAgICAgICAgIHNuYXBzaG90V3JpdGVyLmV4ZWN1dGUobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRpciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKS5nZXRQYXRoKCkgKyAiL3NuYXBzaG90cyI7CiAgICAgICAgICAgICAgICAgICAgIGlmICghZGlyTWFkZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoZGlyKS5ta2RpcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXcgRmlsZShkaXIpLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoU05BUFNIT1RfRElSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpci5ta2RpcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkaXJlY3RvcnkgbmVlZHMgdG8gYmUgd3JpdGFibGUgdG8gYW55Ym9keQorICAgICAgICAgICAgICAgICAgICAgICAgZGlyLnNldFdyaXRhYmxlKHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkaXJlY3RvcnkgbmVlZHMgdG8gYmUgZXhlY3V0YWJsZSB0byBhbnlib2R5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBrbm93IHdoeSB5ZXQsIGJ1dCBtb2RlIDcyMyB3b3VsZCB3b3JrLCB3aGlsZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9kZSA3MjIgdGhyb3dzIEZpbGVOb3RGb3VuZEV4ZWNwdGlvbiBhdCBsaW5lIDE1MQorICAgICAgICAgICAgICAgICAgICAgICAgZGlyLnNldEV4ZWN1dGFibGUodHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ldyBGaWxlKFNOQVBTSE9UX0RJUikuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpck1hZGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDcmVhdGlvbiBvZiAiICsgZGlyICsgIiBmYWlsZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ3JlYXRpb24gb2YgIiArIFNOQVBTSE9UX0RJUiArICIgZmFpbGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcuc2V0KGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU25hcHNob3QoZGlyLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU25hcHNob3QoU05BUFNIT1RfRElSLCBwcm9jZXNzTmFtZSwgcGFja2FnZUluZm8pOwogICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZy5zZXQoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSk7CkBAIC0xMTEsMTMgKzEyMywxMyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVp5Z290ZVNuYXBzaG90KCkgewogICAgICAgICBpZiAoIWVuYWJsZWQpIHJldHVybjsKLQotICAgICAgICBTdHJpbmcgZGlyID0gIi9kYXRhL3p5Z290ZS9zbmFwc2hvdHMiOwotICAgICAgICBuZXcgRmlsZShkaXIpLm1rZGlycygpOwotICAgICAgICB3cml0ZVNuYXBzaG90KGRpciwgInp5Z290ZSIpOworICAgICAgICB3cml0ZVNuYXBzaG90KCJ6eWdvdGUiLCBudWxsKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlU25hcHNob3QoU3RyaW5nIGRpciwgU3RyaW5nIG5hbWUpIHsKKyAgICAvKioKKyAgICAgKiBwYXNzIGluIFBhY2thZ2VJbmZvIHRvIHJldHJpZXZlIHZhcmlvdXMgdmFsdWVzIGZvciBzbmFwc2hvdCBoZWFkZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlU25hcHNob3QoU3RyaW5nIGRpciwgU3RyaW5nIHByb2Nlc3NOYW1lLCBQYWNrYWdlSW5mbyBwYWNrYWdlSW5mbykgewogICAgICAgICBieXRlW10gc25hcHNob3QgPSBTYW1wbGluZ1Byb2ZpbGVyLmdldEluc3RhbmNlKCkuc25hcHNob3QoKTsKICAgICAgICAgaWYgKHNuYXBzaG90ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTEyOSwzOSArMTQxLDU0IEBACiAgICAgICAgICAqIHdlIGNhcHR1cmUgdHdvIHNuYXBzaG90cyBpbiByYXBpZCBzdWNjZXNzaW9uLgogICAgICAgICAgKi8KICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBTdHJpbmcgcGF0aCA9IGRpciArICIvIiArIG5hbWUucmVwbGFjZSgnOicsICcuJykgKyAiLSIgKwotICAgICAgICAgICAgICAgICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLnNuYXBzaG90IjsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBwcm9jZXNzTmFtZS5yZXBsYWNlQWxsKCI6IiwgIi4iKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBkaXIgKyAiLyIgKyBuYW1lICsgIi0iICtTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIuc25hcHNob3QiOworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBUcnkgdG8gb3BlbiB0aGUgZmlsZSBhIGZldyB0aW1lcy4gVGhlIFNEIGNhcmQgbWF5IG5vdCBiZSBtb3VudGVkLgotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQ7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCsrY291bnQgPiAzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3Qgb3BlbiAiICsgcGF0aCArICIuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBTbGVlcCBmb3IgYSBiaXQgYW5kIHRoZW4gdHJ5IGFnYWluLgotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDI1MDApOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgeyAvKiBpZ25vcmUgKi8gfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoc25hcHNob3QpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvbmcgZWxhcHNlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJXcm90ZSBzbmFwc2hvdCBmb3IgIiArIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiIGluICIgKyBlbGFwc2VkICsgIm1zLiIpOworICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGF0aCk7CisgICAgICAgICAgICBnZW5lcmF0ZVNuYXBzaG90SGVhZGVyKG5hbWUsIHBhY2thZ2VJbmZvLCBvdXQpOworICAgICAgICAgICAgb3V0LndyaXRlKHNuYXBzaG90KTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3Igd3JpdGluZyBzbmFwc2hvdC4iLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYob3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBsZXQgaXQgZ28uCisgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgLy8gc2V0IGZpbGUgcmVhZGFibGUgdG8gdGhlIHdvcmxkIHNvIHRoYXQgU2FtcGxpbmdQcm9maWxlclNlcnZpY2UKKyAgICAgICAgLy8gY2FuIHB1dCBpdCB0byBkcm9wYm94CisgICAgICAgIG5ldyBGaWxlKHBhdGgpLnNldFJlYWRhYmxlKHRydWUsIGZhbHNlKTsKKworICAgICAgICBsb25nIGVsYXBzZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OworICAgICAgICBMb2cuaShUQUcsICJXcm90ZSBzbmFwc2hvdCBmb3IgIiArIG5hbWUgKyAiIGluICIgKyBlbGFwc2VkICsgIm1zLiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdlbmVyYXRlIGhlYWRlciBmb3Igc25hcHNob3RzLCB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybWF0IChsaWtlIGh0dHAgaGVhZGVyKToKKyAgICAgKgorICAgICAqIFZlcnNpb246IDx2ZXJzaW9uIG51bWJlciBvZiBwcm9maWxlcj5cbgorICAgICAqIFByb2Nlc3M6IDxwcm9jZXNzIG5hbWU+XG4KKyAgICAgKiBQYWNrYWdlOiA8cGFja2FnZSBuYW1lLCBpZiBleGlzdHM+XG4KKyAgICAgKiBQYWNrYWdlLVZlcnNpb246IDx2ZXJzaW9uIG51bWJlciBvZiB0aGUgcGFja2FnZSwgaWYgZXhpc3RzPlxuCisgICAgICogQnVpbGQ6IDxmaW5nZXJwcmludD5cbgorICAgICAqIFxuCisgICAgICogPHRoZSBhY3R1YWwgc25hcHNob3QgY29udGVudCBiZWdpbnMgaGVyZS4uLj4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdlbmVyYXRlU25hcHNob3RIZWFkZXIoU3RyaW5nIHByb2Nlc3NOYW1lLCBQYWNrYWdlSW5mbyBwYWNrYWdlSW5mbywKKyAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBwcm9maWxlciB2ZXJzaW9uCisgICAgICAgIG91dC53cml0ZSgiVmVyc2lvbjogMVxuIi5nZXRCeXRlcygpKTsKKyAgICAgICAgb3V0LndyaXRlKCgiUHJvY2VzczogIiArIHByb2Nlc3NOYW1lICsgIlxuIikuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIGlmKHBhY2thZ2VJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC53cml0ZSgoIlBhY2thZ2U6ICIgKyBwYWNrYWdlSW5mby5wYWNrYWdlTmFtZSArICJcbiIpLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgb3V0LndyaXRlKCgiUGFja2FnZS1WZXJzaW9uOiAiICsgcGFja2FnZUluZm8udmVyc2lvbkNvZGUgKyAiXG4iKS5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgICAgICBvdXQud3JpdGUoKCJCdWlsZDogIiArIEJ1aWxkLkZJTkdFUlBSSU5UICsgIlxuIikuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIC8vIHNpbmdsZSBibGFuayBsaW5lIG1lYW5zIHRoZSBlbmQgb2Ygc25hcHNob3QgaGVhZGVyLgorICAgICAgICBvdXQud3JpdGUoIlxuIi5nZXRCeXRlcygpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1p5Z290ZUluaXQuamF2YQppbmRleCA5ZmNkM2Y1Li45Yzg0ZTBlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdC5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0LmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQubmV0LkxvY2FsU2VydmVyU29ja2V0OwogaW1wb3J0IGFuZHJvaWQub3MuRGVidWc7CitpbXBvcnQgYW5kcm9pZC5vcy5GaWxlVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKQEAgLTUwNiw2ICs1MDcsOSBAQAogCiAgICAgICAgIGNsb3NlU2VydmVyU29ja2V0KCk7CiAKKyAgICAgICAgLy8gc2V0IHVtYXNrIHRvIDAwNzcgc28gbmV3IGZpbGVzIGFuZCBkaXJlY3RvcmllcyB3aWxsIGRlZmF1bHQgdG8gb3duZXItb25seSBwZXJtaXNzaW9ucy4KKyAgICAgICAgRmlsZVV0aWxzLnNldFVNYXNrKEZpbGVVdGlscy5TX0lSV1hHIHwgRmlsZVV0aWxzLlNfSVJXWE8pOworCiAgICAgICAgIC8qCiAgICAgICAgICAqIFBhc3MgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gU3lzdGVtU2VydmVyLgogICAgICAgICAgKiAiLS1uaWNlLW5hbWU9c3lzdGVtX3NlcnZlciBjb20uYW5kcm9pZC5zZXJ2ZXIuU3lzdGVtU2VydmVyIgpAQCAtNTIzLDcgKzUyNyw3IEBACiAgICAgICAgIFN0cmluZyBhcmdzW10gPSB7CiAgICAgICAgICAgICAiLS1zZXR1aWQ9MTAwMCIsCiAgICAgICAgICAgICAiLS1zZXRnaWQ9MTAwMCIsCi0gICAgICAgICAgICAiLS1zZXRncm91cHM9MTAwMSwxMDAyLDEwMDMsMTAwNCwxMDA1LDEwMDYsMTAwNywxMDA4LDEwMDksMTAxMCwzMDAxLDMwMDIsMzAwMyIsCisgICAgICAgICAgICAiLS1zZXRncm91cHM9MTAwMSwxMDAyLDEwMDMsMTAwNCwxMDA1LDEwMDYsMTAwNywxMDA4LDEwMDksMTAxMCwxMDE4LDMwMDEsMzAwMiwzMDAzIiwKICAgICAgICAgICAgICItLWNhcGFiaWxpdGllcz0xMzAxMDQzNTIsMTMwMTA0MzUyIiwKICAgICAgICAgICAgICItLXJ1bnRpbWUtaW5pdCIsCiAgICAgICAgICAgICAiLS1uaWNlLW5hbWU9c3lzdGVtX3NlcnZlciIsCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3RhdHVzYmFyL0lTdGF0dXNCYXJTZXJ2aWNlLmFpZGwgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3RhdHVzYmFyL0lTdGF0dXNCYXJTZXJ2aWNlLmFpZGwKaW5kZXggODUyNjMwZC4uMjMwNzY2OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3N0YXR1c2Jhci9JU3RhdHVzQmFyU2VydmljZS5haWRsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0JhclNlcnZpY2UuYWlkbApAQCAtNDAsNCArNDAsNSBAQAogICAgIHZvaWQgb25Ob3RpZmljYXRpb25FcnJvcihTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQsCiAgICAgICAgICAgICBpbnQgdWlkLCBpbnQgaW5pdGlhbFBpZCwgU3RyaW5nIG1lc3NhZ2UpOwogICAgIHZvaWQgb25DbGVhckFsbE5vdGlmaWNhdGlvbnMoKTsKKyAgICB2b2lkIG9uTm90aWZpY2F0aW9uQ2xlYXIoU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0hpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmphdmEKaW5kZXggYzU5OWQ2OC4uZDM4YzAzYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmphdmEKQEAgLTEzNyw3ICsxMzcsNyBAQAogICAgIH0KIAogICAgIGNsYXNzIFN0YXRlMSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICBcQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewogICAgICAgICAgICAgTG9nLmQoVEFHLCAiSGVsbG8gV29ybGQiKTsKICAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOwogICAgICAgICB9CkBAIC0yNTcsMTAgKzI1NywxMCBAQAogICAgIH0KIAogICAgIGNsYXNzIFAxIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgewotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgIFxAT3ZlcnJpZGUgcHVibGljIHZvaWQgZW50ZXIoKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJtUDEuZW50ZXIiKTsKICAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgIFxAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CiAgICAgICAgICAgICBib29sZWFuIHJldFZhbDsKICAgICAgICAgICAgIExvZy5kKFRBRywgIm1QMS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOwogICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgewpAQCAtMjc4LDE2ICsyNzgsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiByZXRWYWw7CiAgICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGV4aXQoKSB7CisgICAgICAgIFxAT3ZlcnJpZGUgcHVibGljIHZvaWQgZXhpdCgpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIm1QMS5leGl0Iik7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBjbGFzcyBTMSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICBcQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGVudGVyKCkgewogICAgICAgICAgICAgTG9nLmQoVEFHLCAibVMxLmVudGVyIik7CiAgICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICBcQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewogICAgICAgICAgICAgTG9nLmQoVEFHLCAiUzEucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKICAgICAgICAgICAgIGlmIChtZXNzYWdlLndoYXQgPT0gQ01EXzEpIHsKICAgICAgICAgICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIG91cnNlbGYgdG8gc2hvdyB0aGF0IGVudGVyL2V4aXQgaXMgY2FsbGVkCkBAIC0yOTgsMTYgKzI5OCwxNiBAQAogICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZXhpdCgpIHsKKyAgICAgICAgXEBPdmVycmlkZSBwdWJsaWMgdm9pZCBleGl0KCkgewogICAgICAgICAgICAgTG9nLmQoVEFHLCAibVMxLmV4aXQiKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIGNsYXNzIFMyIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgewotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgIFxAT3ZlcnJpZGUgcHVibGljIHZvaWQgZW50ZXIoKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJtUzIuZW50ZXIiKTsKICAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgIFxAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CiAgICAgICAgICAgICBib29sZWFuIHJldFZhbDsKICAgICAgICAgICAgIExvZy5kKFRBRywgIm1TMi5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOwogICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgewpAQCAtMzI2LDE3ICszMjYsMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiByZXRWYWw7CiAgICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGV4aXQoKSB7CisgICAgICAgIFxAT3ZlcnJpZGUgcHVibGljIHZvaWQgZXhpdCgpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIm1TMi5leGl0Iik7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBjbGFzcyBQMiBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICBcQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGVudGVyKCkgewogICAgICAgICAgICAgTG9nLmQoVEFHLCAibVAyLmVudGVyIik7CiAgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF81KSk7CiAgICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICBcQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewogICAgICAgICAgICAgTG9nLmQoVEFHLCAiUDIucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKICAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKICAgICAgICAgICAgIGNhc2UoQ01EXzMpOgpAQCAtMzQ5LDEyICszNDksMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOwogICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBleGl0KCkgeworICAgICAgICBcQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGV4aXQoKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJtUDIuZXhpdCIpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCisgICAgXEBPdmVycmlkZQogICAgIHZvaWQgaGFsdGluZygpIHsKICAgICAgICAgTG9nLmQoVEFHLCAiaGFsdGluZyIpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKQEAgLTExOTcsNiArMTE5NywzNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEdldCBhIG1lc3NhZ2UgYW5kIHNldCBNZXNzYWdlLnRhcmdldCA9IHRoaXMsCisgICAgICogd2hhdCwgYXJnMSBhbmQgYXJnMgorICAgICAqCisgICAgICogQHBhcmFtIHdoYXQgIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2Uud2hhdAorICAgICAqIEBwYXJhbSBhcmcxICBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLmFyZzEKKyAgICAgKiBAcGFyYW0gYXJnMiAgaXMgYXNzaWduZWQgdG8gTWVzc2FnZS5hcmcyCisgICAgICogQHJldHVybiAgQSBNZXNzYWdlIG9iamVjdCBmcm9tIHRoZSBnbG9iYWwgcG9vbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgTWVzc2FnZSBvYnRhaW5NZXNzYWdlKGludCB3aGF0LCBpbnQgYXJnMSwgaW50IGFyZzIpCisgICAgeworICAgICAgICByZXR1cm4gTWVzc2FnZS5vYnRhaW4obUhzbUhhbmRsZXIsIHdoYXQsIGFyZzEsIGFyZzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG1lc3NhZ2UgYW5kIHNldCBNZXNzYWdlLnRhcmdldCA9IHRoaXMsCisgICAgICogd2hhdCwgYXJnMSwgYXJnMiBhbmQgb2JqCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2hhdCAgaXMgYXNzaWduZWQgdG8gTWVzc2FnZS53aGF0CisgICAgICogQHBhcmFtIGFyZzEgIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2UuYXJnMQorICAgICAqIEBwYXJhbSBhcmcyICBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLmFyZzIKKyAgICAgKiBAcGFyYW0gb2JqIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2Uub2JqCisgICAgICogQHJldHVybiAgQSBNZXNzYWdlIG9iamVjdCBmcm9tIHRoZSBnbG9iYWwgcG9vbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgTWVzc2FnZSBvYnRhaW5NZXNzYWdlKGludCB3aGF0LCBpbnQgYXJnMSwgaW50IGFyZzIsIE9iamVjdCBvYmopCisgICAgeworICAgICAgICByZXR1cm4gTWVzc2FnZS5vYnRhaW4obUhzbUhhbmRsZXIsIHdoYXQsIGFyZzEsIGFyZzIsIG9iaik7CisgICAgfQorCisgICAgLyoqCiAgICAgICogRW5xdWV1ZSBhIG1lc3NhZ2UgdG8gdGhpcyBzdGF0ZSBtYWNoaW5lLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNlbmRNZXNzYWdlKGludCB3aGF0KSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9UeXBlZFByb3BlcnRpZXMuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1R5cGVkUHJvcGVydGllcy5qYXZhCmluZGV4IGMyY2UyMTAuLjU2MTM5OTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1R5cGVkUHJvcGVydGllcy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1R5cGVkUHJvcGVydGllcy5qYXZhCkBAIC00MTIsNyArNDEyLDcgQEAKICAgICAgKi8KIAogICAgIC8qKgotICAgICAqIEFuIHVuY2hlY2tlZCBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gaWYgYSB7QGNvZGUgZ2V0Jmx0O1RZUEUmZ3Q7KCl9IG1ldGhvZAorICAgICAqIEFuIHVuY2hlY2tlZCBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gaWYgYSB7QGNvZGUgZ2V0PFRZUEU+KCl9IG1ldGhvZAogICAgICAqIGlzIHVzZWQgdG8gcmV0cmlldmUgYSBwYXJhbWV0ZXIgd2hvc2UgdHlwZSBkb2VzIG5vdCBtYXRjaCB0aGUgbWV0aG9kIG5hbWUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlRXhjZXB0aW9uIGV4dGVuZHMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1htbFV0aWxzLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9YbWxVdGlscy5qYXZhCmluZGV4IDhkOGRmMTYuLmUwMGE4NTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1htbFV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvWG1sVXRpbHMuamF2YQpAQCAtMjYsNiArMjYsNyBAQAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0yODQsNiArMjg1LDI2IEBACiAKICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibGlzdCIpOwogICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgd3JpdGVTZXRYbWwoU2V0IHZhbCwgU3RyaW5nIG5hbWUsIFhtbFNlcmlhbGl6ZXIgb3V0KQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBpZiAodmFsID09IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibnVsbCIpOworICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibnVsbCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInNldCIpOworICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJuYW1lIiwgbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciAoT2JqZWN0IHYgOiB2YWwpIHsKKyAgICAgICAgICAgIHdyaXRlVmFsdWVYbWwodiwgbnVsbCwgb3V0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAic2V0Iik7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogRmxhdHRlbiBhIGJ5dGVbXSBpbnRvIGFuIFhtbFNlcmlhbGl6ZXIuICBUaGUgbGlzdCBjYW4gbGF0ZXIgYmUgcmVhZCBiYWNrCkBAIC00MjYsNiArNDQ3LDkgQEAKICAgICAgICAgfSBlbHNlIGlmICh2IGluc3RhbmNlb2YgTGlzdCkgewogICAgICAgICAgICAgd3JpdGVMaXN0WG1sKChMaXN0KXYsIG5hbWUsIG91dCk7CiAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAodiBpbnN0YW5jZW9mIFNldCkgeworICAgICAgICAgICAgd3JpdGVTZXRYbWwoKFNldCl2LCBuYW1lLCBvdXQpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBDaGFyU2VxdWVuY2UpIHsKICAgICAgICAgICAgIC8vIFhYWCBUaGlzIGlzIHRvIGFsbG93IHVzIHRvIGF0IGxlYXN0IHdyaXRlIHNvbWV0aGluZyBpZgogICAgICAgICAgICAgLy8gd2UgZW5jb3VudGVyIHN0eWxlZCB0ZXh0Li4uICBidXQgaXQgbWVhbnMgd2Ugd2lsbCBkcm9wIGFsbApAQCAtNDc2LDcgKzUwMCw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gaW4gVGhlIElucHV0U3RyZWFtIGZyb20gd2hpY2ggdG8gcmVhZC4KICAgICAgKgotICAgICAqIEByZXR1cm4gSGFzaE1hcCBUaGUgcmVzdWx0aW5nIGxpc3QuCisgICAgICogQHJldHVybiBBcnJheUxpc3QgVGhlIHJlc3VsdGluZyBsaXN0LgogICAgICAqCiAgICAgICogQHNlZSAjcmVhZE1hcFhtbAogICAgICAqIEBzZWUgI3JlYWRWYWx1ZVhtbApAQCAtNDkwLDYgKzUxNCwyOSBAQAogICAgICAgICBwYXJzZXIuc2V0SW5wdXQoaW4sIG51bGwpOwogICAgICAgICByZXR1cm4gKEFycmF5TGlzdClyZWFkVmFsdWVYbWwocGFyc2VyLCBuZXcgU3RyaW5nWzFdKTsKICAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVhZCBhIEhhc2hTZXQgZnJvbSBhbiBJbnB1dFN0cmVhbSBjb250YWluaW5nIFhNTC4gVGhlIHN0cmVhbSBjYW4KKyAgICAgKiBwcmV2aW91c2x5IGhhdmUgYmVlbiB3cml0dGVuIGJ5IHdyaXRlU2V0WG1sKCkuCisgICAgICogCisgICAgICogQHBhcmFtIGluIFRoZSBJbnB1dFN0cmVhbSBmcm9tIHdoaWNoIHRvIHJlYWQuCisgICAgICogCisgICAgICogQHJldHVybiBIYXNoU2V0IFRoZSByZXN1bHRpbmcgc2V0LgorICAgICAqIAorICAgICAqIEB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAqIAorICAgICAqIEBzZWUgI3JlYWRWYWx1ZVhtbAorICAgICAqIEBzZWUgI3JlYWRUaGlzU2V0WG1sCisgICAgICogQHNlZSAjd3JpdGVTZXRYbWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhhc2hTZXQgcmVhZFNldFhtbChJbnB1dFN0cmVhbSBpbikKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBYbWwubmV3UHVsbFBhcnNlcigpOworICAgICAgICBwYXJzZXIuc2V0SW5wdXQoaW4sIG51bGwpOworICAgICAgICByZXR1cm4gKEhhc2hTZXQpIHJlYWRWYWx1ZVhtbChwYXJzZXIsIG5ldyBTdHJpbmdbMV0pOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFJlYWQgYSBIYXNoTWFwIG9iamVjdCBmcm9tIGFuIFhtbFB1bGxQYXJzZXIuICBUaGUgWE1MIGRhdGEgY291bGQKQEAgLTU3Myw2ICs2MjAsNDcgQEAKICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCiAgICAgICAgICAgICAiRG9jdW1lbnQgZW5kZWQgYmVmb3JlICIgKyBlbmRUYWcgKyAiIGVuZCB0YWciKTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVhZCBhIEhhc2hTZXQgb2JqZWN0IGZyb20gYW4gWG1sUHVsbFBhcnNlci4gVGhlIFhNTCBkYXRhIGNvdWxkIHByZXZpb3VzbHkKKyAgICAgKiBoYXZlIGJlZW4gZ2VuZXJhdGVkIGJ5IHdyaXRlU2V0WG1sKCkuIFRoZSBYbWxQdWxsUGFyc2VyIG11c3QgYmUgcG9zaXRpb25lZAorICAgICAqIDxlbT5hZnRlcjwvZW0+IHRoZSB0YWcgdGhhdCBiZWdpbnMgdGhlIHNldC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyc2VyIFRoZSBYbWxQdWxsUGFyc2VyIGZyb20gd2hpY2ggdG8gcmVhZCB0aGUgc2V0IGRhdGEuCisgICAgICogQHBhcmFtIGVuZFRhZyBOYW1lIG9mIHRoZSB0YWcgdGhhdCB3aWxsIGVuZCB0aGUgc2V0LCB1c3VhbGx5ICJzZXQiLgorICAgICAqIEBwYXJhbSBuYW1lIEFuIGFycmF5IG9mIG9uZSBzdHJpbmcsIHVzZWQgdG8gcmV0dXJuIHRoZSBuYW1lIGF0dHJpYnV0ZQorICAgICAqICAgICAgICAgICAgIG9mIHRoZSBzZXQncyB0YWcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEhhc2hTZXQgVGhlIG5ld2x5IGdlbmVyYXRlZCBzZXQuCisgICAgICogCisgICAgICogQHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgICogCisgICAgICogQHNlZSAjcmVhZFNldFhtbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSGFzaFNldCByZWFkVGhpc1NldFhtbChYbWxQdWxsUGFyc2VyIHBhcnNlciwgU3RyaW5nIGVuZFRhZywgU3RyaW5nW10gbmFtZSkKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAKKyAgICAgICAgaW50IGV2ZW50VHlwZSA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBwYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbCA9IHJlYWRUaGlzVmFsdWVYbWwocGFyc2VyLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBzZXQuYWRkKHZhbCk7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyB0byBzZXQ6ICIgKyB2YWwpOworICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT0gcGFyc2VyLkVORF9UQUcpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VyLmdldE5hbWUoKS5lcXVhbHMoZW5kVGFnKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCAiICsgZW5kVGFnICsgIiBlbmQgdGFnIGF0OiAiICsgcGFyc2VyLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBldmVudFR5cGUgPSBwYXJzZXIubmV4dCgpOworICAgICAgICB9IHdoaWxlIChldmVudFR5cGUgIT0gcGFyc2VyLkVORF9ET0NVTUVOVCk7CisgICAgICAgIAorICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRG9jdW1lbnQgZW5kZWQgYmVmb3JlICIgKyBlbmRUYWcgKyAiIGVuZCB0YWciKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBSZWFkIGFuIGludFtdIG9iamVjdCBmcm9tIGFuIFhtbFB1bGxQYXJzZXIuICBUaGUgWE1MIGRhdGEgY291bGQKQEAgLTc0MCw2ICs4MjgsMTIgQEAKICAgICAgICAgICAgIG5hbWVbMF0gPSB2YWx1ZU5hbWU7CiAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiUmV0dXJuaW5nIHZhbHVlIGZvciAiICsgdmFsdWVOYW1lICsgIjogIiArIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9IGVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzKCJzZXQiKSkgeworICAgICAgICAgICAgcGFyc2VyLm5leHQoKTsKKyAgICAgICAgICAgIHJlcyA9IHJlYWRUaGlzU2V0WG1sKHBhcnNlciwgInNldCIsIG5hbWUpOworICAgICAgICAgICAgbmFtZVswXSA9IHZhbHVlTmFtZTsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJSZXR1cm5pbmcgdmFsdWUgZm9yICIgKyB2YWx1ZU5hbWUgKyAiOiAiICsgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAiVW5rbm93biB0YWc6ICIgKyB0YWdOYW1lKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L1N0YW5kYWxvbmVBY3Rpb25Nb2RlLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9TdGFuZGFsb25lQWN0aW9uTW9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODE5MDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9TdGFuZGFsb25lQWN0aW9uTW9kZS5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudVBvcHVwSGVscGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5TdWJNZW51QnVpbGRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXc7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKKworcHVibGljIGNsYXNzIFN0YW5kYWxvbmVBY3Rpb25Nb2RlIGV4dGVuZHMgQWN0aW9uTW9kZSBpbXBsZW1lbnRzIE1lbnVCdWlsZGVyLkNhbGxiYWNrIHsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBBY3Rpb25CYXJDb250ZXh0VmlldyBtQ29udGV4dFZpZXc7CisgICAgcHJpdmF0ZSBBY3Rpb25Nb2RlLkNhbGxiYWNrIG1DYWxsYmFjazsKKyAgICBwcml2YXRlIFdlYWtSZWZlcmVuY2U8Vmlldz4gbUN1c3RvbVZpZXc7CisgICAgcHJpdmF0ZSBib29sZWFuIG1GaW5pc2hlZDsKKworICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU1lbnU7CisKKyAgICBwdWJsaWMgU3RhbmRhbG9uZUFjdGlvbk1vZGUoQ29udGV4dCBjb250ZXh0LCBBY3Rpb25CYXJDb250ZXh0VmlldyB2aWV3LAorICAgICAgICAgICAgQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1Db250ZXh0VmlldyA9IHZpZXc7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworCisgICAgICAgIG1NZW51ID0gbmV3IE1lbnVCdWlsZGVyKGNvbnRleHQpLnNldERlZmF1bHRTaG93QXNBY3Rpb24oTWVudUl0ZW0uU0hPV19BU19BQ1RJT05fSUZfUk9PTSk7CisgICAgICAgIG1NZW51LnNldENhbGxiYWNrKHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtQ29udGV4dFZpZXcuc2V0VGl0bGUodGl0bGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSkgeworICAgICAgICBtQ29udGV4dFZpZXcuc2V0U3VidGl0bGUoc3VidGl0bGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKGludCByZXNJZCkgeworICAgICAgICBzZXRUaXRsZShtQ29udGV4dC5nZXRTdHJpbmcocmVzSWQpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShpbnQgcmVzSWQpIHsKKyAgICAgICAgc2V0U3VidGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tVmlldyhWaWV3IHZpZXcpIHsKKyAgICAgICAgbUNvbnRleHRWaWV3LnNldEN1c3RvbVZpZXcodmlldyk7CisgICAgICAgIG1DdXN0b21WaWV3ID0gdmlldyAhPSBudWxsID8gbmV3IFdlYWtSZWZlcmVuY2U8Vmlldz4odmlldykgOiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgICAgIG1DYWxsYmFjay5vblByZXBhcmVBY3Rpb25Nb2RlKHRoaXMsIG1NZW51KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7CisgICAgICAgIGlmIChtRmluaXNoZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtRmluaXNoZWQgPSB0cnVlOworCisgICAgICAgIG1DYWxsYmFjay5vbkRlc3Ryb3lBY3Rpb25Nb2RlKHRoaXMpOworICAgICAgICBtQ29udGV4dFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZW51IGdldE1lbnUoKSB7CisgICAgICAgIHJldHVybiBtTWVudTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gbUNvbnRleHRWaWV3LmdldFRpdGxlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0Vmlldy5nZXRTdWJ0aXRsZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3IGdldEN1c3RvbVZpZXcoKSB7CisgICAgICAgIHJldHVybiBtQ3VzdG9tVmlldyAhPSBudWxsID8gbUN1c3RvbVZpZXcuZ2V0KCkgOiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZW51SW5mbGF0ZXIgZ2V0TWVudUluZmxhdGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IE1lbnVJbmZsYXRlcihtQ29udGV4dCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbVNlbGVjdGVkKE1lbnVCdWlsZGVyIG1lbnUsIE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIG1DYWxsYmFjay5vbkFjdGlvbkl0ZW1DbGlja2VkKHRoaXMsIGl0ZW0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQ2xvc2VNZW51KE1lbnVCdWlsZGVyIG1lbnUsIGJvb2xlYW4gYWxsTWVudXNBcmVDbG9zaW5nKSB7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25TdWJNZW51U2VsZWN0ZWQoU3ViTWVudUJ1aWxkZXIgc3ViTWVudSkgeworICAgICAgICBpZiAoIXN1Yk1lbnUuaGFzVmlzaWJsZUl0ZW1zKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgbmV3IE1lbnVQb3B1cEhlbHBlcihtQ29udGV4dCwgc3ViTWVudSkuc2hvdygpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkNsb3NlU3ViTWVudShTdWJNZW51QnVpbGRlciBtZW51KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25NZW51TW9kZUNoYW5nZShNZW51QnVpbGRlciBtZW51KSB7CisgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgbUNvbnRleHRWaWV3LnNob3dPdmVyZmxvd01lbnUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnUuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNDRlYmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnUuamF2YQpAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5TdWJNZW51OworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25NZW51IGltcGxlbWVudHMgTWVudSB7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiBtSXNRd2VydHk7CisgICAgCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IG1JdGVtczsKKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uTWVudShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPigpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gbUNvbnRleHQ7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIGFkZChDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgcmV0dXJuIGFkZCgwLCAwLCAwLCB0aXRsZSk7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIGFkZChpbnQgdGl0bGVSZXMpIHsKKyAgICAgICAgcmV0dXJuIGFkZCgwLCAwLCAwLCB0aXRsZVJlcyk7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIGFkZChpbnQgZ3JvdXBJZCwgaW50IGl0ZW1JZCwgaW50IG9yZGVyLCBpbnQgdGl0bGVSZXMpIHsKKyAgICAgICAgcmV0dXJuIGFkZChncm91cElkLCBpdGVtSWQsIG9yZGVyLCBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcodGl0bGVSZXMpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIE1lbnVJdGVtIGFkZChpbnQgZ3JvdXBJZCwgaW50IGl0ZW1JZCwgaW50IG9yZGVyLCBDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IG5ldyBBY3Rpb25NZW51SXRlbShnZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgZ3JvdXBJZCwgaXRlbUlkLCAwLCBvcmRlciwgdGl0bGUpOworICAgICAgICBtSXRlbXMuYWRkKG9yZGVyLCBpdGVtKTsKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfQorCisgICAgcHVibGljIGludCBhZGRJbnRlbnRPcHRpb25zKGludCBncm91cElkLCBpbnQgaXRlbUlkLCBpbnQgb3JkZXIsCisgICAgICAgICAgICBDb21wb25lbnROYW1lIGNhbGxlciwgSW50ZW50W10gc3BlY2lmaWNzLCBJbnRlbnQgaW50ZW50LCBpbnQgZmxhZ3MsCisgICAgICAgICAgICBNZW51SXRlbVtdIG91dFNwZWNpZmljSXRlbXMpIHsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBmaW5hbCBMaXN0PFJlc29sdmVJbmZvPiBscmkgPQorICAgICAgICAgICAgICAgIHBtLnF1ZXJ5SW50ZW50QWN0aXZpdHlPcHRpb25zKGNhbGxlciwgc3BlY2lmaWNzLCBpbnRlbnQsIDApOworICAgICAgICBmaW5hbCBpbnQgTiA9IGxyaSAhPSBudWxsID8gbHJpLnNpemUoKSA6IDA7CisKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfQVBQRU5EX1RPX0dST1VQKSA9PSAwKSB7CisgICAgICAgICAgICByZW1vdmVHcm91cChncm91cElkKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc29sdmVJbmZvIHJpID0gbHJpLmdldChpKTsKKyAgICAgICAgICAgIEludGVudCByaW50ZW50ID0gbmV3IEludGVudCgKKyAgICAgICAgICAgICAgICByaS5zcGVjaWZpY0luZGV4IDwgMCA/IGludGVudCA6IHNwZWNpZmljc1tyaS5zcGVjaWZpY0luZGV4XSk7CisgICAgICAgICAgICByaW50ZW50LnNldENvbXBvbmVudChuZXcgQ29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgcmkuYWN0aXZpdHlJbmZvLmFwcGxpY2F0aW9uSW5mby5wYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcmkuYWN0aXZpdHlJbmZvLm5hbWUpKTsKKyAgICAgICAgICAgIGZpbmFsIE1lbnVJdGVtIGl0ZW0gPSBhZGQoZ3JvdXBJZCwgaXRlbUlkLCBvcmRlciwgcmkubG9hZExhYmVsKHBtKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEljb24ocmkubG9hZEljb24ocG0pKQorICAgICAgICAgICAgICAgICAgICAuc2V0SW50ZW50KHJpbnRlbnQpOworICAgICAgICAgICAgaWYgKG91dFNwZWNpZmljSXRlbXMgIT0gbnVsbCAmJiByaS5zcGVjaWZpY0luZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBvdXRTcGVjaWZpY0l0ZW1zW3JpLnNwZWNpZmljSW5kZXhdID0gaXRlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBOOworICAgIH0KKworICAgIHB1YmxpYyBTdWJNZW51IGFkZFN1Yk1lbnUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIC8vIFRPRE8gSW1wbGVtZW50IHN1Ym1lbnVzCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTdWJNZW51IGFkZFN1Yk1lbnUoaW50IHRpdGxlUmVzKSB7CisgICAgICAgIC8vIFRPRE8gSW1wbGVtZW50IHN1Ym1lbnVzCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTdWJNZW51IGFkZFN1Yk1lbnUoaW50IGdyb3VwSWQsIGludCBpdGVtSWQsIGludCBvcmRlciwKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICAvLyBUT0RPIEltcGxlbWVudCBzdWJtZW51cworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViTWVudSBhZGRTdWJNZW51KGludCBncm91cElkLCBpbnQgaXRlbUlkLCBpbnQgb3JkZXIsIGludCB0aXRsZVJlcykgeworICAgICAgICAvLyBUT0RPIEltcGxlbWVudCBzdWJtZW51cworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgbUl0ZW1zLmNsZWFyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgaW50IGZpbmRJdGVtSW5kZXgoaW50IGlkKSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4gaXRlbXMgPSBtSXRlbXM7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBpdGVtcy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpdGVtcy5nZXQoaSkuZ2V0SXRlbUlkKCkgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBmaW5kSXRlbShpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoZmluZEl0ZW1JbmRleChpZCkpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBnZXRJdGVtKGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gbUl0ZW1zLmdldChpbmRleCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzVmlzaWJsZUl0ZW1zKCkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGl0ZW1zLmdldChpKS5pc1Zpc2libGUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgQWN0aW9uTWVudUl0ZW0gZmluZEl0ZW1XaXRoU2hvcnRjdXQoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vIFRPRE8gTWFrZSB0aGlzIHNtYXJ0ZXIuCisgICAgICAgIGZpbmFsIGJvb2xlYW4gcXdlcnR5ID0gbUlzUXdlcnR5OworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IGl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGZpbmFsIGNoYXIgc2hvcnRjdXQgPSBxd2VydHkgPyBpdGVtLmdldEFscGhhYmV0aWNTaG9ydGN1dCgpIDoKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5nZXROdW1lcmljU2hvcnRjdXQoKTsKKyAgICAgICAgICAgIGlmIChrZXlDb2RlID09IHNob3J0Y3V0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTaG9ydGN1dEtleShpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgcmV0dXJuIGZpbmRJdGVtV2l0aFNob3J0Y3V0KGtleUNvZGUsIGV2ZW50KSAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1JZGVudGlmaWVyQWN0aW9uKGludCBpZCwgaW50IGZsYWdzKSB7CisgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGZpbmRJdGVtSW5kZXgoaWQpOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbUl0ZW1zLmdldChpbmRleCkuaW52b2tlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybVNob3J0Y3V0KGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCwgaW50IGZsYWdzKSB7CisgICAgICAgIEFjdGlvbk1lbnVJdGVtIGl0ZW0gPSBmaW5kSXRlbVdpdGhTaG9ydGN1dChrZXlDb2RlLCBldmVudCk7CisgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGl0ZW0uaW52b2tlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlR3JvdXAoaW50IGdyb3VwSWQpIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoaSA8IGl0ZW1Db3VudCkgeworICAgICAgICAgICAgaWYgKGl0ZW1zLmdldChpKS5nZXRHcm91cElkKCkgPT0gZ3JvdXBJZCkgeworICAgICAgICAgICAgICAgIGl0ZW1zLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICBpdGVtQ291bnQtLTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlSXRlbShpbnQgaWQpIHsKKyAgICAgICAgbUl0ZW1zLnJlbW92ZShmaW5kSXRlbUluZGV4KGlkKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R3JvdXBDaGVja2FibGUoaW50IGdyb3VwLCBib29sZWFuIGNoZWNrYWJsZSwKKyAgICAgICAgICAgIGJvb2xlYW4gZXhjbHVzaXZlKSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4gaXRlbXMgPSBtSXRlbXM7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBpdGVtcy5zaXplKCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBBY3Rpb25NZW51SXRlbSBpdGVtID0gaXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0R3JvdXBJZCgpID09IGdyb3VwKSB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRDaGVja2FibGUoY2hlY2thYmxlKTsKKyAgICAgICAgICAgICAgICBpdGVtLnNldEV4Y2x1c2l2ZUNoZWNrYWJsZShleGNsdXNpdmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R3JvdXBFbmFibGVkKGludCBncm91cCwgYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4gaXRlbXMgPSBtSXRlbXM7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBpdGVtcy5zaXplKCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBBY3Rpb25NZW51SXRlbSBpdGVtID0gaXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0R3JvdXBJZCgpID09IGdyb3VwKSB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRFbmFibGVkKGVuYWJsZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R3JvdXBWaXNpYmxlKGludCBncm91cCwgYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4gaXRlbXMgPSBtSXRlbXM7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBpdGVtcy5zaXplKCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBBY3Rpb25NZW51SXRlbSBpdGVtID0gaXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0R3JvdXBJZCgpID09IGdyb3VwKSB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRWaXNpYmxlKHZpc2libGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UXdlcnR5TW9kZShib29sZWFuIGlzUXdlcnR5KSB7CisgICAgICAgIG1Jc1F3ZXJ0eSA9IGlzUXdlcnR5OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5zaXplKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbS5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTg3NWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtLmphdmEKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1Yk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uTWVudUl0ZW0gaW1wbGVtZW50cyBNZW51SXRlbSB7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUlkOworICAgIHByaXZhdGUgZmluYWwgaW50IG1Hcm91cDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtQ2F0ZWdvcnlPcmRlcjsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtT3JkZXJpbmc7CisgICAgCisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRpdGxlOworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UaXRsZUNvbmRlbnNlZDsKKyAgICBwcml2YXRlIEludGVudCBtSW50ZW50OworICAgIHByaXZhdGUgY2hhciBtU2hvcnRjdXROdW1lcmljQ2hhcjsKKyAgICBwcml2YXRlIGNoYXIgbVNob3J0Y3V0QWxwaGFiZXRpY0NoYXI7CisgICAgCisgICAgcHJpdmF0ZSBEcmF3YWJsZSBtSWNvbkRyYXdhYmxlOworICAgIHByaXZhdGUgaW50IG1JY29uUmVzSWQgPSBOT19JQ09OOworICAgIAorICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICAKKyAgICBwcml2YXRlIE1lbnVJdGVtLk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIG1DbGlja0xpc3RlbmVyOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT19JQ09OID0gMDsKKyAgICAKKyAgICBwcml2YXRlIGludCBtRmxhZ3MgPSBFTkFCTEVEOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEVDS0FCTEUgICAgICA9IDB4MDAwMDAwMDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIRUNLRUQgICAgICAgID0gMHgwMDAwMDAwMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVhDTFVTSVZFICAgICAgPSAweDAwMDAwMDA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBISURERU4gICAgICAgICA9IDB4MDAwMDAwMDg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQUJMRUQgICAgICAgID0gMHgwMDAwMDAxMDsKKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uTWVudUl0ZW0oQ29udGV4dCBjb250ZXh0LCBpbnQgZ3JvdXAsIGludCBpZCwgaW50IGNhdGVnb3J5T3JkZXIsIGludCBvcmRlcmluZywKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1JZCA9IGlkOworICAgICAgICBtR3JvdXAgPSBncm91cDsKKyAgICAgICAgbUNhdGVnb3J5T3JkZXIgPSBjYXRlZ29yeU9yZGVyOworICAgICAgICBtT3JkZXJpbmcgPSBvcmRlcmluZzsKKyAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBjaGFyIGdldEFscGhhYmV0aWNTaG9ydGN1dCgpIHsKKyAgICAgICAgcmV0dXJuIG1TaG9ydGN1dEFscGhhYmV0aWNDaGFyOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0R3JvdXBJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Hcm91cDsKKyAgICB9CisKKyAgICBwdWJsaWMgRHJhd2FibGUgZ2V0SWNvbigpIHsKKyAgICAgICAgcmV0dXJuIG1JY29uRHJhd2FibGU7CisgICAgfQorCisgICAgcHVibGljIEludGVudCBnZXRJbnRlbnQoKSB7CisgICAgICAgIHJldHVybiBtSW50ZW50OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SXRlbUlkKCkgeworICAgICAgICByZXR1cm4gbUlkOworICAgIH0KKworICAgIHB1YmxpYyBDb250ZXh0TWVudUluZm8gZ2V0TWVudUluZm8oKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBjaGFyIGdldE51bWVyaWNTaG9ydGN1dCgpIHsKKyAgICAgICAgcmV0dXJuIG1TaG9ydGN1dE51bWVyaWNDaGFyOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0T3JkZXIoKSB7CisgICAgICAgIHJldHVybiBtT3JkZXJpbmc7CisgICAgfQorCisgICAgcHVibGljIFN1Yk1lbnUgZ2V0U3ViTWVudSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UaXRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRpdGxlQ29uZGVuc2VkKCkgeworICAgICAgICByZXR1cm4gbVRpdGxlQ29uZGVuc2VkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1N1Yk1lbnUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBDSEVDS0FCTEUpICE9IDA7IAorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tlZCgpIHsKKyAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBDSEVDS0VEKSAhPSAwOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBFTkFCTEVEKSAhPSAwOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBISURERU4pID09IDA7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldEFscGhhYmV0aWNTaG9ydGN1dChjaGFyIGFscGhhQ2hhcikgeworICAgICAgICBtU2hvcnRjdXRBbHBoYWJldGljQ2hhciA9IGFscGhhQ2hhcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldENoZWNrYWJsZShib29sZWFuIGNoZWNrYWJsZSkgeworICAgICAgICBtRmxhZ3MgPSAobUZsYWdzICYgfkNIRUNLQUJMRSkgfCAoY2hlY2thYmxlID8gQ0hFQ0tBQkxFIDogMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uTWVudUl0ZW0gc2V0RXhjbHVzaXZlQ2hlY2thYmxlKGJvb2xlYW4gZXhjbHVzaXZlKSB7CisgICAgICAgIG1GbGFncyA9IChtRmxhZ3MgJiB+RVhDTFVTSVZFKSB8IChleGNsdXNpdmUgPyBFWENMVVNJVkUgOiAwKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldENoZWNrZWQoYm9vbGVhbiBjaGVja2VkKSB7CisgICAgICAgIG1GbGFncyA9IChtRmxhZ3MgJiB+Q0hFQ0tFRCkgfCAoY2hlY2tlZCA/IENIRUNLRUQgOiAwKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1GbGFncyA9IChtRmxhZ3MgJiB+RU5BQkxFRCkgfCAoZW5hYmxlZCA/IEVOQUJMRUQgOiAwKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldEljb24oRHJhd2FibGUgaWNvbikgeworICAgICAgICBtSWNvbkRyYXdhYmxlID0gaWNvbjsKKyAgICAgICAgbUljb25SZXNJZCA9IE5PX0lDT047CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRJY29uKGludCBpY29uUmVzKSB7CisgICAgICAgIG1JY29uUmVzSWQgPSBpY29uUmVzOworICAgICAgICBtSWNvbkRyYXdhYmxlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RHJhd2FibGUoaWNvblJlcyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRJbnRlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICBtSW50ZW50ID0gaW50ZW50OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0TnVtZXJpY1Nob3J0Y3V0KGNoYXIgbnVtZXJpY0NoYXIpIHsKKyAgICAgICAgbVNob3J0Y3V0TnVtZXJpY0NoYXIgPSBudW1lcmljQ2hhcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIG1lbnVJdGVtQ2xpY2tMaXN0ZW5lcikgeworICAgICAgICBtQ2xpY2tMaXN0ZW5lciA9IG1lbnVJdGVtQ2xpY2tMaXN0ZW5lcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldFNob3J0Y3V0KGNoYXIgbnVtZXJpY0NoYXIsIGNoYXIgYWxwaGFDaGFyKSB7CisgICAgICAgIG1TaG9ydGN1dE51bWVyaWNDaGFyID0gbnVtZXJpY0NoYXI7CisgICAgICAgIG1TaG9ydGN1dEFscGhhYmV0aWNDaGFyID0gYWxwaGFDaGFyOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIG1UaXRsZSA9IHRpdGxlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0VGl0bGUoaW50IHRpdGxlKSB7CisgICAgICAgIG1UaXRsZSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZyh0aXRsZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRUaXRsZUNvbmRlbnNlZChDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVRpdGxlQ29uZGVuc2VkID0gdGl0bGU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBtRmxhZ3MgPSAobUZsYWdzICYgSElEREVOKSB8ICh2aXNpYmxlID8gMCA6IEhJRERFTik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGludm9rZSgpIHsKKyAgICAgICAgaWYgKG1DbGlja0xpc3RlbmVyICE9IG51bGwgJiYgbUNsaWNrTGlzdGVuZXIub25NZW51SXRlbUNsaWNrKHRoaXMpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1JbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShtSW50ZW50KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFNob3dBc0FjdGlvbihpbnQgc2hvdykgeworICAgICAgICAvLyBEbyBub3RoaW5nLiBBY3Rpb25NZW51SXRlbXMgYWx3YXlzIHNob3cgYXMgYWN0aW9uIGJ1dHRvbnMuCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbVZpZXcuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW1WaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyMWZhZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW1WaWV3LmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b247CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEFjdGlvbk1lbnVJdGVtVmlldyBleHRlbmRzIEZyYW1lTGF5b3V0CisgICAgICAgIGltcGxlbWVudHMgTWVudVZpZXcuSXRlbVZpZXcsIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFjdGlvbk1lbnVJdGVtVmlldyI7CisKKyAgICBwcml2YXRlIE1lbnVJdGVtSW1wbCBtSXRlbURhdGE7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRpdGxlOworICAgIHByaXZhdGUgTWVudUJ1aWxkZXIuSXRlbUludm9rZXIgbUl0ZW1JbnZva2VyOworCisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtSW1hZ2VCdXR0b247CisgICAgcHJpdmF0ZSBCdXR0b24gbVRleHRCdXR0b247CisKKyAgICBwdWJsaWMgQWN0aW9uTWVudUl0ZW1WaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBBY3Rpb25NZW51SXRlbVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmFjdGlvbkJ1dHRvblN0eWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWN0aW9uTWVudUl0ZW1WaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaEluZmxhdGUoKSB7CisgICAgICAgIG1JbWFnZUJ1dHRvbiA9IChJbWFnZUJ1dHRvbikgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuaW1hZ2VCdXR0b24pOworICAgICAgICBtVGV4dEJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnRleHRCdXR0b24pOworICAgICAgICBtSW1hZ2VCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICBtVGV4dEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtSW1wbCBnZXRJdGVtRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtRGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKE1lbnVJdGVtSW1wbCBpdGVtRGF0YSwgaW50IG1lbnVUeXBlKSB7CisgICAgICAgIG1JdGVtRGF0YSA9IGl0ZW1EYXRhOworCisgICAgICAgIHNldENsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOworICAgICAgICBzZXRJY29uKGl0ZW1EYXRhLmdldEljb24oKSk7CisgICAgICAgIHNldFRpdGxlKGl0ZW1EYXRhLmdldFRpdGxlKCkpOyAvLyBUaXRsZSBvbmx5IHRha2VzIGVmZmVjdCBpZiB0aGVyZSBpcyBubyBpY29uCisgICAgICAgIHNldElkKGl0ZW1EYXRhLmdldEl0ZW1JZCgpKTsKKworICAgICAgICBzZXRWaXNpYmlsaXR5KGl0ZW1EYXRhLmlzVmlzaWJsZSgpID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKyAgICAgICAgc2V0RW5hYmxlZChpdGVtRGF0YS5pc0VuYWJsZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgaWYgKG1JdGVtSW52b2tlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtSXRlbUludm9rZXIuaW52b2tlSXRlbShtSXRlbURhdGEpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SXRlbUludm9rZXIoTWVudUJ1aWxkZXIuSXRlbUludm9rZXIgaW52b2tlcikgeworICAgICAgICBtSXRlbUludm9rZXIgPSBpbnZva2VyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHByZWZlcnNDb25kZW5zZWRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENoZWNrYWJsZShib29sZWFuIGNoZWNrYWJsZSkgeworICAgICAgICAvLyBUT0RPIFN1cHBvcnQgY2hlY2thYmxlIGFjdGlvbiBpdGVtcworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbiBjaGVja2VkKSB7CisgICAgICAgIC8vIFRPRE8gU3VwcG9ydCBjaGVja2FibGUgYWN0aW9uIGl0ZW1zCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWNvbihEcmF3YWJsZSBpY29uKSB7CisgICAgICAgIG1JbWFnZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKGljb24pOworICAgICAgICBpZiAoaWNvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtSW1hZ2VCdXR0b24uc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgIG1UZXh0QnV0dG9uLnNldFZpc2liaWxpdHkoR09ORSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW1hZ2VCdXR0b24uc2V0VmlzaWJpbGl0eShHT05FKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNob3J0Y3V0KGJvb2xlYW4gc2hvd1Nob3J0Y3V0LCBjaGFyIHNob3J0Y3V0S2V5KSB7CisgICAgICAgIC8vIEFjdGlvbiBidXR0b25zIGRvbid0IHNob3cgdGV4dCBmb3Igc2hvcnRjdXQga2V5cy4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVRpdGxlID0gdGl0bGU7CisKKyAgICAgICAgLy8gcG9wdWxhdGUgYWNjZXNzaWJpbGl0eSBkZXNjcmlwdGlvbiB3aXRoIHRpdGxlCisgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbih0aXRsZSk7CisKKyAgICAgICAgaWYgKG1JbWFnZUJ1dHRvbi5nZXREcmF3YWJsZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIG1UZXh0QnV0dG9uLnNldFRleHQobVRpdGxlKTsKKyAgICAgICAgICAgIG1UZXh0QnV0dG9uLnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzaG93c0ljb24oKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudVZpZXcuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDY0ZTJjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51Vmlldy5qYXZhCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uTWVudVZpZXcgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgaW1wbGVtZW50cyBNZW51QnVpbGRlci5JdGVtSW52b2tlciwgTWVudVZpZXcgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQWN0aW9uTWVudVZpZXciOworICAgIAorICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU1lbnU7CisKKyAgICBwcml2YXRlIGludCBtSXRlbVBhZGRpbmc7CisgICAgcHJpdmF0ZSBpbnQgbUl0ZW1NYXJnaW47CisgICAgcHJpdmF0ZSBpbnQgbU1heEl0ZW1zOworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzZXJ2ZU92ZXJmbG93OworICAgIHByaXZhdGUgT3ZlcmZsb3dNZW51QnV0dG9uIG1PdmVyZmxvd0J1dHRvbjsKKyAgICBwcml2YXRlIE1lbnVQb3B1cEhlbHBlciBtT3ZlcmZsb3dQb3B1cDsKKworICAgIHByaXZhdGUgUnVubmFibGUgbVNob3dPdmVyZmxvdyA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgc2hvd092ZXJmbG93TWVudSgpOworICAgICAgICB9CisgICAgfTsKKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uTWVudVZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBBY3Rpb25NZW51VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIAorICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVGhlbWUpOworICAgICAgICBtSXRlbVBhZGRpbmcgPSBhLmdldERpbWVuc2lvblBpeGVsT2Zmc2V0KAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlRoZW1lX2FjdGlvbkJ1dHRvblBhZGRpbmcsIDApOworICAgICAgICBtSXRlbU1hcmdpbiA9IG1JdGVtUGFkZGluZyAvIDI7CisgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIC8vIE1lYXN1cmUgZm9yIGluaXRpYWwgY29uZmlndXJhdGlvbgorICAgICAgICBtTWF4SXRlbXMgPSBtZWFzdXJlTWF4QWN0aW9uQnV0dG9ucygpOworCisgICAgICAgIC8vIFRPRE8gVGhlcmUgaGFzIHRvIGJlIGEgYmV0dGVyIHdheSB0byBpbmRpY2F0ZSB0aGF0IHdlIGRvbid0IGhhdmUgYSBoYXJkIG1lbnUga2V5LgorICAgICAgICBmaW5hbCBpbnQgc2NyZWVuID0gZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLnNjcmVlbkxheW91dDsKKyAgICAgICAgbVJlc2VydmVPdmVyZmxvdyA9IChzY3JlZW4gJiBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX01BU0spID09CisgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9YTEFSR0U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBmaW5hbCBpbnQgc2NyZWVuID0gbmV3Q29uZmlnLnNjcmVlbkxheW91dDsKKyAgICAgICAgbVJlc2VydmVPdmVyZmxvdyA9IChzY3JlZW4gJiBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX01BU0spID09CisgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9YTEFSR0U7CisgICAgICAgIG1NYXhJdGVtcyA9IG1lYXN1cmVNYXhBY3Rpb25CdXR0b25zKCk7CisgICAgICAgIGlmIChtTWVudSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTWVudS5zZXRNYXhBY3Rpb25JdGVtcyhtTWF4SXRlbXMpOworICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW4oZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1PdmVyZmxvd1BvcHVwICE9IG51bGwgJiYgbU92ZXJmbG93UG9wdXAuaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIG1PdmVyZmxvd1BvcHVwLmRpc21pc3MoKTsKKyAgICAgICAgICAgIHBvc3QobVNob3dPdmVyZmxvdyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBtZWFzdXJlTWF4QWN0aW9uQnV0dG9ucygpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5hY3Rpb25faWNvbl9zaXplKTsKKyAgICAgICAgZmluYWwgaW50IHNwYWNlQXZhaWxhYmxlID0gcmVzLmdldERpc3BsYXlNZXRyaWNzKCkud2lkdGhQaXhlbHMgLyAyOworICAgICAgICBmaW5hbCBpbnQgaXRlbVNwYWNlID0gc2l6ZSArIG1JdGVtUGFkZGluZzsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBzcGFjZUF2YWlsYWJsZSAvIChpdGVtU3BhY2UgPiAwID8gaXRlbVNwYWNlIDogMSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNPdmVyZmxvd1Jlc2VydmVkKCkgeworICAgICAgICByZXR1cm4gbVJlc2VydmVPdmVyZmxvdzsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0T3ZlcmZsb3dSZXNlcnZlZChib29sZWFuIHJlc2VydmVPdmVyZmxvdykgeworICAgICAgICBtUmVzZXJ2ZU92ZXJmbG93ID0gcmVzZXJ2ZU92ZXJmbG93OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrTGF5b3V0UGFyYW1zKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcCkgeworICAgICAgICBpZiAocCBpbnN0YW5jZW9mIExheW91dFBhcmFtcykgeworICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgcDsKKyAgICAgICAgICAgIHJldHVybiBscC5sZWZ0TWFyZ2luID09IG1JdGVtTWFyZ2luICYmIGxwLnJpZ2h0TWFyZ2luID09IG1JdGVtTWFyZ2luICYmCisgICAgICAgICAgICAgICAgICAgIGxwLmdyYXZpdHkgPT0gR3Jhdml0eS5DRU5URVJfVkVSVElDQUwgJiYKKyAgICAgICAgICAgICAgICAgICAgbHAud2lkdGggPT0gTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCAmJiBscC5oZWlnaHQgPT0gTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBMYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCkgeworICAgICAgICBMYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOworICAgICAgICBwYXJhbXMubGVmdE1hcmdpbiA9IG1JdGVtTWFyZ2luOworICAgICAgICBwYXJhbXMucmlnaHRNYXJnaW4gPSBtSXRlbU1hcmdpbjsKKyAgICAgICAgcGFyYW1zLmdyYXZpdHkgPSBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTDsKKyAgICAgICAgcmV0dXJuIHBhcmFtczsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtcyhWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHApIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtcygpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldEl0ZW1NYXJnaW4oKSB7CisgICAgICAgIHJldHVybiBtSXRlbU1hcmdpbjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpbnZva2VJdGVtKE1lbnVJdGVtSW1wbCBpdGVtKSB7CisgICAgICAgIHJldHVybiBtTWVudS5wZXJmb3JtSXRlbUFjdGlvbihpdGVtLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFdpbmRvd0FuaW1hdGlvbnMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoTWVudUJ1aWxkZXIgbWVudSwgaW50IG1lbnVUeXBlKSB7CisgICAgICAgIG1lbnUuc2V0TWF4QWN0aW9uSXRlbXMobU1heEl0ZW1zKTsKKyAgICAgICAgbU1lbnUgPSBtZW51OworICAgICAgICB1cGRhdGVDaGlsZHJlbih0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVDaGlsZHJlbihib29sZWFuIGNsZWFyZWQpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiByZXNlcnZlT3ZlcmZsb3cgPSBtUmVzZXJ2ZU92ZXJmbG93OworICAgICAgICByZW1vdmVBbGxWaWV3cygpOworICAgICAgICAKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gaXRlbXNUb1Nob3cgPSBtTWVudS5nZXRBY3Rpb25JdGVtcyhyZXNlcnZlT3ZlcmZsb3cpOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXNUb1Nob3cuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgTWVudUl0ZW1JbXBsIGl0ZW1EYXRhID0gaXRlbXNUb1Nob3cuZ2V0KGkpOworICAgICAgICAgICAgYWRkSXRlbVZpZXcoKEFjdGlvbk1lbnVJdGVtVmlldykgaXRlbURhdGEuZ2V0SXRlbVZpZXcoTWVudUJ1aWxkZXIuVFlQRV9BQ1RJT05fQlVUVE9OLAorICAgICAgICAgICAgICAgICAgICB0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzZXJ2ZU92ZXJmbG93KSB7CisgICAgICAgICAgICBpZiAobU1lbnUuZ2V0Tm9uQWN0aW9uSXRlbXModHJ1ZSkuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIE92ZXJmbG93TWVudUJ1dHRvbiBidXR0b24gPSBuZXcgT3ZlcmZsb3dNZW51QnV0dG9uKG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KGJ1dHRvbik7CisgICAgICAgICAgICAgICAgbU92ZXJmbG93QnV0dG9uID0gYnV0dG9uOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtT3ZlcmZsb3dCdXR0b24gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2hvd092ZXJmbG93TWVudSgpIHsKKyAgICAgICAgaWYgKG1PdmVyZmxvd0J1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBNZW51UG9wdXBIZWxwZXIgcG9wdXAgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTWVudVBvcHVwSGVscGVyKGdldENvbnRleHQoKSwgbU1lbnUsIG1PdmVyZmxvd0J1dHRvbiwgdHJ1ZSk7CisgICAgICAgICAgICAvLyBQb3N0IHRoaXMgZm9yIGxhdGVyOyB3ZSBtaWdodCBzdGlsbCBuZWVkIGEgbGF5b3V0IGZvciB0aGUgYW5jaG9yIHRvIGJlIHJpZ2h0LgorICAgICAgICAgICAgcG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBwb3B1cC5zaG93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtT3ZlcmZsb3dQb3B1cCA9IHBvcHVwOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcmZsb3dNZW51U2hvd2luZygpIHsKKyAgICAgICAgTWVudVBvcHVwSGVscGVyIHBvcHVwID0gbU92ZXJmbG93UG9wdXA7CisgICAgICAgIGlmIChwb3B1cCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcG9wdXAuaXNTaG93aW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhpZGVPdmVyZmxvd01lbnUoKSB7CisgICAgICAgIE1lbnVQb3B1cEhlbHBlciBwb3B1cCA9IG1PdmVyZmxvd1BvcHVwOworICAgICAgICBpZiAocG9wdXAgIT0gbnVsbCkgeworICAgICAgICAgICAgcG9wdXAuZGlzbWlzcygpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRJdGVtVmlldyhBY3Rpb25NZW51SXRlbVZpZXcgdmlldykgeworICAgICAgICB2aWV3LnNldEl0ZW1JbnZva2VyKHRoaXMpOworICAgICAgICBhZGRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgT3ZlcmZsb3dNZW51QnV0dG9uIGV4dGVuZHMgSW1hZ2VCdXR0b24geworICAgICAgICBwdWJsaWMgT3ZlcmZsb3dNZW51QnV0dG9uKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmFjdGlvbkJ1dHRvblN0eWxlKTsKKworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBzZXRDbGlja2FibGUodHJ1ZSk7CisgICAgICAgICAgICBzZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24ocmVzLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5tb3JlX2l0ZW1fbGFiZWwpKTsKKyAgICAgICAgICAgIHNldEltYWdlRHJhd2FibGUocmVzLmdldERyYXdhYmxlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuaWNfbWVudV9tb3JlKSk7CisgICAgICAgICAgICBzZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworICAgICAgICAgICAgc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2xpY2soKSB7CisgICAgICAgICAgICBpZiAoc3VwZXIucGVyZm9ybUNsaWNrKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hhbmdlIHRvIG92ZXJmbG93IG1vZGUKKyAgICAgICAgICAgIG1NZW51LmdldENhbGxiYWNrKCkub25NZW51TW9kZUNoYW5nZShtTWVudSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvSWNvbk1lbnVWaWV3LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0ljb25NZW51Vmlldy5qYXZhCmluZGV4IGJlYjU3YmEuLjE3OGRjZGUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvSWNvbk1lbnVWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9JY29uTWVudVZpZXcuamF2YQpAQCAtMzM3LDcgKzMzNyw5IEBACiAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGRvZXMgYSBjbGVhciByZWZyZXNoIG9mIGNoaWxkcmVuCiAgICAgICAgIHJlbW92ZUFsbFZpZXdzKCk7CiAgICAgICAgIAotICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBpdGVtc1RvU2hvdyA9IG1NZW51LmdldFZpc2libGVJdGVtcygpOworICAgICAgICAvLyBJY29uTWVudVZpZXcgbmV2ZXIgd2FudHMgY29udGVudCBzb3J0ZWQgZm9yIGFuIG92ZXJmbG93IGFjdGlvbiBidXR0b24sIHNpbmNlCisgICAgICAgIC8vIGl0IGlzIG5ldmVyIHVzZWQgaW4gdGhlIHByZXNlbmNlIG9mIGFuIG92ZXJmbG93IGJ1dHRvbi4KKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gaXRlbXNUb1Nob3cgPSBtTWVudS5nZXROb25BY3Rpb25JdGVtcyhmYWxzZSk7CiAgICAgICAgIGZpbmFsIGludCBudW1JdGVtcyA9IGl0ZW1zVG9TaG93LnNpemUoKTsKICAgICAgICAgZmluYWwgaW50IG51bUl0ZW1zVGhhdENhbkZpdCA9IG1NYXhJdGVtczsKICAgICAgICAgLy8gTWluaW11bSBvZiB0aGUgbnVtIHRoYXQgY2FuIGZpdCBhbmQgdGhlIG51bSB0aGF0IHdlIGhhdmUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXIuamF2YQppbmRleCAyMjhkNWQwLi5kMTYwZmVjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVCdWlsZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51QnVpbGRlci5qYXZhCkBAIC0yNywxNiArMjcsMTcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5Q2hhcmFjdGVyTWFwOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdWJNZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXI7CkBAIC01NCw3ICs1NSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJNZW51QnVpbGRlciI7CiAgICAgCiAgICAgLyoqIFRoZSBudW1iZXIgb2YgZGlmZmVyZW50IG1lbnUgdHlwZXMgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1fVFlQRVMgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTV9UWVBFUyA9IDU7CiAgICAgLyoqIFRoZSBtZW51IHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSBpY29uIG1lbnUgdmlldyAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSUNPTiA9IDA7CiAgICAgLyoqIFRoZSBtZW51IHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSBleHBhbmRlZCBtZW51IHZpZXcgKi8KQEAgLTY1LDE0ICs2NiwyNCBAQAogICAgICAqIGhhdmUgYW4gSXRlbVZpZXcuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9ESUFMT0cgPSAyOworICAgIC8qKgorICAgICAqIFRoZSBtZW51IHR5cGUgdGhhdCByZXByZXNlbnRzIGEgYnV0dG9uIGluIHRoZSBhcHBsaWNhdGlvbidzIGFjdGlvbiBiYXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9BQ1RJT05fQlVUVE9OID0gMzsKKyAgICAvKioKKyAgICAgKiBUaGUgbWVudSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhIG1lbnUgcG9wdXAuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9QT1BVUCA9IDQ7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV1NfVEFHID0gImFuZHJvaWQ6dmlld3MiOwotICAgIAorCiAgICAgLy8gT3JkZXIgbXVzdCBiZSB0aGUgc2FtZSBvcmRlciBhcyB0aGUgVFlQRV8qCiAgICAgc3RhdGljIGZpbmFsIGludCBUSEVNRV9SRVNfRk9SX1RZUEVbXSA9IG5ldyBpbnRbXSB7CiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfSWNvbk1lbnUsCiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfRXhwYW5kZWRNZW51LAogICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAwLAogICAgIH07CiAgICAgCiAgICAgLy8gT3JkZXIgbXVzdCBiZSB0aGUgc2FtZSBvcmRlciBhcyB0aGUgVFlQRV8qCkBAIC04MCw2ICs5MSw4IEBACiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmljb25fbWVudV9sYXlvdXQsCiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LmV4cGFuZGVkX21lbnVfbGF5b3V0LAogICAgICAgICAwLAorICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5hY3Rpb25fbWVudV9sYXlvdXQsCisgICAgICAgIDAsCiAgICAgfTsKIAogICAgIC8vIE9yZGVyIG11c3QgYmUgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIFRZUEVfKgpAQCAtODcsNiArMTAwLDggQEAKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuaWNvbl9tZW51X2l0ZW1fbGF5b3V0LAogICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5saXN0X21lbnVfaXRlbV9sYXlvdXQsCiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmxpc3RfbWVudV9pdGVtX2xheW91dCwKKyAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuYWN0aW9uX21lbnVfaXRlbV9sYXlvdXQsCisgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmxpc3RfbWVudV9pdGVtX2xheW91dCwKICAgICB9OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gIHNDYXRlZ29yeVRvT3JkZXIgPSBuZXcgaW50W10gewpAQCAtMTMwLDYgKzE0NSwzNSBAQAogICAgICAqIGZldGNoZWQgZnJvbSB7QGxpbmsgI2dldFZpc2libGVJdGVtcygpfQogICAgICAqLyAKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzVmlzaWJsZUl0ZW1zU3RhbGU7CisgICAgCisgICAgLyoqCisgICAgICogQ29udGFpbnMgb25seSB0aGUgaXRlbXMgdGhhdCBzaG91bGQgYXBwZWFyIGluIHRoZSBBY3Rpb24gQmFyLCBpZiBwcmVzZW50LgorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gbUFjdGlvbkl0ZW1zOworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGl0ZW1zIHRoYXQgc2hvdWxkIE5PVCBhcHBlYXIgaW4gdGhlIEFjdGlvbiBCYXIsIGlmIHByZXNlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBtTm9uQWN0aW9uSXRlbXM7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiB2aXNpYmxlIGFjdGlvbiBidXR0b25zIHBlcm1pdHRlZCBpbiB0aGlzIG1lbnUKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtTWF4QWN0aW9uSXRlbXM7CisgICAgLyoqCisgICAgICogV2hldGhlciBvciBub3QgdGhlIGl0ZW1zIChvciBhbnkgb25lIGl0ZW0ncyBhY3Rpb24gc3RhdGUpIGhhcyBjaGFuZ2VkIHNpbmNlIGl0IHdhcworICAgICAqIGxhc3QgZmV0Y2hlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWN0aW9uSXRlbXNTdGFsZTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHByb2Nlc3Mgb2YgZ3JhbnRpbmcgc3BhY2UgYXMgYWN0aW9uIGl0ZW1zIHNob3VsZCByZXNlcnZlIGEgc3BhY2UgZm9yCisgICAgICogYW4gb3ZlcmZsb3cgb3B0aW9uIGluIHRoZSBhY3Rpb24gbGlzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVJlc2VydmVBY3Rpb25PdmVyZmxvdzsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgdmFsdWUgZm9yIGhvdyBhZGRlZCBpdGVtcyBzaG91bGQgc2hvdyBpbiB0aGUgYWN0aW9uIGxpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbURlZmF1bHRTaG93QXNBY3Rpb24gPSBNZW51SXRlbS5TSE9XX0FTX0FDVElPTl9ORVZFUjsKIAogICAgIC8qKgogICAgICAqIEN1cnJlbnQgdXNlIGNhc2UgaXMgQ29udGV4dCBNZW51czogQXMgVmlld3MgcG9wdWxhdGUgdGhlIGNvbnRleHQgbWVudSwgZWFjaCBvbmUgaGFzCkBAIC0yODEsMTAgKzMyNSwxOSBAQAogICAgICAgICBtVmlzaWJsZUl0ZW1zID0gbmV3IEFycmF5TGlzdDxNZW51SXRlbUltcGw+KCk7CiAgICAgICAgIG1Jc1Zpc2libGVJdGVtc1N0YWxlID0gdHJ1ZTsKICAgICAgICAgCisgICAgICAgIG1BY3Rpb25JdGVtcyA9IG5ldyBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPigpOworICAgICAgICBtTm9uQWN0aW9uSXRlbXMgPSBuZXcgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4oKTsKKyAgICAgICAgbUlzQWN0aW9uSXRlbXNTdGFsZSA9IHRydWU7CisgICAgICAgIAogICAgICAgICBtU2hvcnRjdXRzVmlzaWJsZSA9CiAgICAgICAgICAgICAgICAgKG1SZXNvdXJjZXMuZ2V0Q29uZmlndXJhdGlvbigpLmtleWJvYXJkICE9IENvbmZpZ3VyYXRpb24uS0VZQk9BUkRfTk9LRVlTKTsKICAgICB9CiAgICAgCisgICAgcHVibGljIE1lbnVCdWlsZGVyIHNldERlZmF1bHRTaG93QXNBY3Rpb24oaW50IGRlZmF1bHRTaG93QXNBY3Rpb24pIHsKKyAgICAgICAgbURlZmF1bHRTaG93QXNBY3Rpb24gPSBkZWZhdWx0U2hvd0FzQWN0aW9uOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCiAgICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgfQpAQCAtMzY4LDcgKzQyMSw4IEBACiAgICAgcHJpdmF0ZSBNZW51SXRlbSBhZGRJbnRlcm5hbChpbnQgZ3JvdXAsIGludCBpZCwgaW50IGNhdGVnb3J5T3JkZXIsIENoYXJTZXF1ZW5jZSB0aXRsZSkgewogICAgICAgICBmaW5hbCBpbnQgb3JkZXJpbmcgPSBnZXRPcmRlcmluZyhjYXRlZ29yeU9yZGVyKTsKICAgICAgICAgCi0gICAgICAgIGZpbmFsIE1lbnVJdGVtSW1wbCBpdGVtID0gbmV3IE1lbnVJdGVtSW1wbCh0aGlzLCBncm91cCwgaWQsIGNhdGVnb3J5T3JkZXIsIG9yZGVyaW5nLCB0aXRsZSk7CisgICAgICAgIGZpbmFsIE1lbnVJdGVtSW1wbCBpdGVtID0gbmV3IE1lbnVJdGVtSW1wbCh0aGlzLCBncm91cCwgaWQsIGNhdGVnb3J5T3JkZXIsCisgICAgICAgICAgICAgICAgb3JkZXJpbmcsIHRpdGxlLCBtRGVmYXVsdFNob3dBc0FjdGlvbik7CiAKICAgICAgICAgaWYgKG1DdXJyZW50TWVudUluZm8gIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gUGFzcyBhbG9uZyB0aGUgY3VycmVudCBtZW51IGluZm8KQEAgLTYzMyw2ICs2ODcsMTEgQEAKICAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoaW5kZXgpOwogICAgIH0KIAorICAgIHB1YmxpYyBNZW51SXRlbSBnZXRPdmVyZmxvd0l0ZW0oaW50IGluZGV4KSB7CisgICAgICAgIGZsYWdBY3Rpb25JdGVtcyh0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1Ob25BY3Rpb25JdGVtcy5nZXQoaW5kZXgpOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzU2hvcnRjdXRLZXkoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIHJldHVybiBmaW5kSXRlbVdpdGhTaG9ydGN1dEZvcktleShrZXlDb2RlLCBldmVudCkgIT0gbnVsbDsKICAgICB9CkBAIC05MDAsNiArOTU5LDcgQEAKICAgICBwcml2YXRlIHZvaWQgb25JdGVtc0NoYW5nZWQoYm9vbGVhbiBjbGVhcmVkKSB7CiAgICAgICAgIGlmICghbVByZXZlbnREaXNwYXRjaGluZ0l0ZW1zQ2hhbmdlZCkgewogICAgICAgICAgICAgaWYgKG1Jc1Zpc2libGVJdGVtc1N0YWxlID09IGZhbHNlKSBtSXNWaXNpYmxlSXRlbXNTdGFsZSA9IHRydWU7CisgICAgICAgICAgICBpZiAobUlzQWN0aW9uSXRlbXNTdGFsZSA9PSBmYWxzZSkgbUlzQWN0aW9uSXRlbXNTdGFsZSA9IHRydWU7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIE1lbnVUeXBlW10gbWVudVR5cGVzID0gbU1lbnVUeXBlczsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RZUEVTOyBpKyspIHsKQEAgLTkyMCw2ICs5ODAsMTUgQEAKICAgICAgICAgb25JdGVtc0NoYW5nZWQoZmFsc2UpOwogICAgIH0KICAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE1lbnVJdGVtSW1wbH0gd2hlbiBpdHMgYWN0aW9uIHJlcXVlc3Qgc3RhdHVzIGlzIGNoYW5nZWQuCisgICAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdGhhdCBoYXMgZ29uZSB0aHJvdWdoIGEgY2hhbmdlIGluIGFjdGlvbiByZXF1ZXN0IHN0YXR1cy4KKyAgICAgKi8KKyAgICB2b2lkIG9uSXRlbUFjdGlvblJlcXVlc3RDaGFuZ2VkKE1lbnVJdGVtSW1wbCBpdGVtKSB7CisgICAgICAgIC8vIE5vdGlmeSBvZiBpdGVtcyBiZWluZyBjaGFuZ2VkCisgICAgICAgIG9uSXRlbXNDaGFuZ2VkKGZhbHNlKTsKKyAgICB9CisgICAgCiAgICAgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gZ2V0VmlzaWJsZUl0ZW1zKCkgewogICAgICAgICBpZiAoIW1Jc1Zpc2libGVJdGVtc1N0YWxlKSByZXR1cm4gbVZpc2libGVJdGVtczsKICAgICAgICAgCkBAIC05MzQsOSArMTAwMyw4MyBAQAogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBtSXNWaXNpYmxlSXRlbXNTdGFsZSA9IGZhbHNlOworICAgICAgICBtSXNBY3Rpb25JdGVtc1N0YWxlID0gdHJ1ZTsKICAgICAgICAgCiAgICAgICAgIHJldHVybiBtVmlzaWJsZUl0ZW1zOwogICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgZmxhZ0FjdGlvbkl0ZW1zKGJvb2xlYW4gcmVzZXJ2ZUFjdGlvbk92ZXJmbG93KSB7CisgICAgICAgIGlmIChyZXNlcnZlQWN0aW9uT3ZlcmZsb3cgIT0gbVJlc2VydmVBY3Rpb25PdmVyZmxvdykgeworICAgICAgICAgICAgbVJlc2VydmVBY3Rpb25PdmVyZmxvdyA9IHJlc2VydmVBY3Rpb25PdmVyZmxvdzsKKyAgICAgICAgICAgIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSXNBY3Rpb25JdGVtc1N0YWxlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiB2aXNpYmxlSXRlbXMgPSBnZXRWaXNpYmxlSXRlbXMoKTsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1zU2l6ZSA9IHZpc2libGVJdGVtcy5zaXplKCk7CisgICAgICAgIGludCBtYXhBY3Rpb25zID0gbU1heEFjdGlvbkl0ZW1zOworCisgICAgICAgIGludCByZXF1aXJlZEl0ZW1zID0gMDsKKyAgICAgICAgaW50IHJlcXVlc3RlZEl0ZW1zID0gMDsKKyAgICAgICAgYm9vbGVhbiBoYXNPdmVyZmxvdyA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBNZW51SXRlbUltcGwgaXRlbSA9IHZpc2libGVJdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbS5yZXF1aXJlc0FjdGlvbkJ1dHRvbigpKSB7CisgICAgICAgICAgICAgICAgcmVxdWlyZWRJdGVtcysrOworICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnJlcXVlc3RzQWN0aW9uQnV0dG9uKCkpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJdGVtcysrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYXNPdmVyZmxvdyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNlcnZlIGEgc3BvdCBmb3IgdGhlIG92ZXJmbG93IGl0ZW0gaWYgbmVlZGVkLgorICAgICAgICBpZiAocmVzZXJ2ZUFjdGlvbk92ZXJmbG93ICYmCisgICAgICAgICAgICAgICAgKGhhc092ZXJmbG93IHx8IHJlcXVpcmVkSXRlbXMgKyByZXF1ZXN0ZWRJdGVtcyA+IG1heEFjdGlvbnMpKSB7CisgICAgICAgICAgICBtYXhBY3Rpb25zLS07CisgICAgICAgIH0KKyAgICAgICAgbWF4QWN0aW9ucyAtPSByZXF1aXJlZEl0ZW1zOworCisgICAgICAgIC8vIEZsYWcgYXMgbWFueSBtb3JlIHJlcXVlc3RlZCBpdGVtcyBhcyB3aWxsIGZpdC4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtc1NpemU7IGkrKykgeworICAgICAgICAgICAgTWVudUl0ZW1JbXBsIGl0ZW0gPSB2aXNpYmxlSXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0ucmVxdWVzdHNBY3Rpb25CdXR0b24oKSkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0SXNBY3Rpb25CdXR0b24obWF4QWN0aW9ucyA+IDApOworICAgICAgICAgICAgICAgIG1heEFjdGlvbnMtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1BY3Rpb25JdGVtcy5jbGVhcigpOworICAgICAgICBtTm9uQWN0aW9uSXRlbXMuY2xlYXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtc1NpemU7IGkrKykgeworICAgICAgICAgICAgTWVudUl0ZW1JbXBsIGl0ZW0gPSB2aXNpYmxlSXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0uaXNBY3Rpb25CdXR0b24oKSkgeworICAgICAgICAgICAgICAgIG1BY3Rpb25JdGVtcy5hZGQoaXRlbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Ob25BY3Rpb25JdGVtcy5hZGQoaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtSXNBY3Rpb25JdGVtc1N0YWxlID0gZmFsc2U7CisgICAgfQorICAgIAorICAgIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IGdldEFjdGlvbkl0ZW1zKGJvb2xlYW4gcmVzZXJ2ZUFjdGlvbk92ZXJmbG93KSB7CisgICAgICAgIGZsYWdBY3Rpb25JdGVtcyhyZXNlcnZlQWN0aW9uT3ZlcmZsb3cpOworICAgICAgICByZXR1cm4gbUFjdGlvbkl0ZW1zOworICAgIH0KKyAgICAKKyAgICBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBnZXROb25BY3Rpb25JdGVtcyhib29sZWFuIHJlc2VydmVBY3Rpb25PdmVyZmxvdykgeworICAgICAgICBmbGFnQWN0aW9uSXRlbXMocmVzZXJ2ZUFjdGlvbk92ZXJmbG93KTsKKyAgICAgICAgcmV0dXJuIG1Ob25BY3Rpb25JdGVtczsKKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRNYXhBY3Rpb25JdGVtcyhpbnQgbWF4QWN0aW9uSXRlbXMpIHsKKyAgICAgICAgbU1heEFjdGlvbkl0ZW1zID0gbWF4QWN0aW9uSXRlbXM7CisgICAgICAgIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOworICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNsZWFySGVhZGVyKCkgewogICAgICAgICBtSGVhZGVySWNvbiA9IG51bGw7CkBAIC0xMDc4LDYgKzEyMjEsMTYgQEAKICAgICAgICAgcmV0dXJuIG5ldyBNZW51QWRhcHRlcihtZW51VHlwZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyBhbiBhZGFwdGVyIGZvciBwcm92aWRpbmcgb3ZlcmZsb3cgKG5vbi1hY3Rpb24pIGl0ZW1zIGFuZCB0aGVpciB2aWV3cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZW51VHlwZSBUaGUgdHlwZSBvZiBtZW51IHRvIGdldCBhbiBhZGFwdGVyIGZvci4KKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIE1lbnVBZGFwdGVyfSBmb3IgdGhpcyBtZW51IHdpdGggdGhlIGdpdmVuIG1lbnUgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVudUFkYXB0ZXIgZ2V0T3ZlcmZsb3dNZW51QWRhcHRlcihpbnQgbWVudVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPdmVyZmxvd01lbnVBZGFwdGVyKG1lbnVUeXBlKTsKKyAgICB9CisKICAgICB2b2lkIHNldE9wdGlvbmFsSWNvbnNWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewogICAgICAgICBtT3B0aW9uYWxJY29uc1Zpc2libGUgPSB2aXNpYmxlOwogICAgIH0KQEAgLTExNTUsOCArMTMwOCw0MiBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiAoKE1lbnVJdGVtSW1wbCkgZ2V0SXRlbShwb3NpdGlvbikpLmdldEl0ZW1WaWV3KG1NZW51VHlwZSwgcGFyZW50KTsKKyAgICAgICAgICAgIGlmIChjb252ZXJ0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTWVudVZpZXcuSXRlbVZpZXcgaXRlbVZpZXcgPSAoTWVudVZpZXcuSXRlbVZpZXcpIGNvbnZlcnRWaWV3OworICAgICAgICAgICAgICAgIGl0ZW1WaWV3LmdldEl0ZW1EYXRhKCkuc2V0SXRlbVZpZXcobU1lbnVUeXBlLCBudWxsKTsKKworICAgICAgICAgICAgICAgIE1lbnVJdGVtSW1wbCBpdGVtID0gKE1lbnVJdGVtSW1wbCkgZ2V0SXRlbShwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgaXRlbVZpZXcuaW5pdGlhbGl6ZShpdGVtLCBtTWVudVR5cGUpOworICAgICAgICAgICAgICAgIGl0ZW0uc2V0SXRlbVZpZXcobU1lbnVUeXBlLCBpdGVtVmlldyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRWaWV3OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBNZW51SXRlbUltcGwgaXRlbSA9IChNZW51SXRlbUltcGwpIGdldEl0ZW0ocG9zaXRpb24pOworICAgICAgICAgICAgICAgIGl0ZW0uc2V0SXRlbVZpZXcobU1lbnVUeXBlLCBudWxsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5nZXRJdGVtVmlldyhtTWVudVR5cGUsIHBhcmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIGFuIHtAbGluayBBZGFwdGVyVmlld30gdG8gdXNlIHRoaXMge0BsaW5rIE1lbnVCdWlsZGVyfSBhcyBhIGRhdGEKKyAgICAgKiBzb3VyY2UgZm9yIG92ZXJmbG93IG1lbnUgaXRlbXMgdGhhdCBkbyBub3QgZml0IGluIHRoZSBsaXN0IG9mIGFjdGlvbiBpdGVtcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIE92ZXJmbG93TWVudUFkYXB0ZXIgZXh0ZW5kcyBNZW51QWRhcHRlciB7CisgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gbU92ZXJmbG93SXRlbXM7CisKKyAgICAgICAgcHVibGljIE92ZXJmbG93TWVudUFkYXB0ZXIoaW50IG1lbnVUeXBlKSB7CisgICAgICAgICAgICBzdXBlcihtZW51VHlwZSk7CisgICAgICAgICAgICBtT3ZlcmZsb3dJdGVtcyA9IGdldE5vbkFjdGlvbkl0ZW1zKHRydWUpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNZW51SXRlbUltcGwgZ2V0SXRlbShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBtT3ZlcmZsb3dJdGVtcy5nZXQocG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbU92ZXJmbG93SXRlbXMuc2l6ZSgpOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGwuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUl0ZW1JbXBsLmphdmEKaW5kZXggOWI1ODIwNS4uMDdhMmE5NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGwuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVJdGVtSW1wbC5qYXZhCkBAIC03NCw2ICs3NCw5IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYQ0xVU0lWRSAgICAgID0gMHgwMDAwMDAwNDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElEREVOICAgICAgICAgPSAweDAwMDAwMDA4OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkFCTEVEICAgICAgICA9IDB4MDAwMDAwMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElTX0FDVElPTiAgICAgID0gMHgwMDAwMDAyMDsKKworICAgIHByaXZhdGUgaW50IG1TaG93QXNBY3Rpb24gPSBTSE9XX0FTX0FDVElPTl9ORVZFUjsKIAogICAgIC8qKiBVc2VkIGZvciB0aGUgaWNvbiByZXNvdXJjZSBJRCBpZiB0aGlzIGl0ZW0gZG9lcyBub3QgaGF2ZSBhbiBpY29uICovCiAgICAgc3RhdGljIGZpbmFsIGludCBOT19JQ09OID0gMDsKQEAgLTEwNSw3ICsxMDgsNyBAQAogICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgdGV4dCB0byBkaXNwbGF5IGZvciB0aGUgaXRlbS4KICAgICAgKi8KICAgICBNZW51SXRlbUltcGwoTWVudUJ1aWxkZXIgbWVudSwgaW50IGdyb3VwLCBpbnQgaWQsIGludCBjYXRlZ29yeU9yZGVyLCBpbnQgb3JkZXJpbmcsCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aXRsZSwgaW50IHNob3dBc0FjdGlvbikgewogCiAgICAgICAgIGlmIChzUHJlcGVuZFNob3J0Y3V0TGFiZWwgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gVGhpcyBpcyBpbnN0YW50aWF0ZWQgZnJvbSB0aGUgVUkgdGhyZWFkLCBzbyBubyBjaGFuY2Ugb2Ygc3luYyBpc3N1ZXMgCkBAIC0xMjYsNiArMTI5LDcgQEAKICAgICAgICAgbUNhdGVnb3J5T3JkZXIgPSBjYXRlZ29yeU9yZGVyOwogICAgICAgICBtT3JkZXJpbmcgPSBvcmRlcmluZzsKICAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgIG1TaG93QXNBY3Rpb24gPSBzaG93QXNBY3Rpb247CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtNTgwLDYgKzU4NCwxMCBAQAogICAgICAgICByZXR1cm4gKFZpZXcpIG1JdGVtVmlld3NbbWVudVR5cGVdLmdldCgpOwogICAgIH0KIAorICAgIHZvaWQgc2V0SXRlbVZpZXcoaW50IG1lbnVUeXBlLCBJdGVtVmlldyB2aWV3KSB7CisgICAgICAgIG1JdGVtVmlld3NbbWVudVR5cGVdID0gbmV3IFdlYWtSZWZlcmVuY2U8SXRlbVZpZXc+KHZpZXcpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZXMgYSBtZW51IGl0ZW0gdmlldyB0aGF0IGltcGxlbWVudHMge0BsaW5rIE1lbnVWaWV3Lkl0ZW1WaWV3fS4KICAgICAgKiBAcGFyYW0gbWVudVR5cGUgVGhlIHR5cGUgb2YgbWVudSB0byBnZXQgYSBWaWV3IGZvciAobXVzdCBiZSBvbmUgb2YKQEAgLTYyOCw2ICs2MzYsMzQgQEAKICAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGdpdmVuIG1lbnUgdHlwZSBzaG91bGQgc2hvdyBpY29ucyBmb3IgbWVudSBpdGVtcy4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRTaG93SWNvbihpbnQgbWVudVR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1lbnVUeXBlID09IE1lbnVCdWlsZGVyLlRZUEVfSUNPTiB8fCBtTWVudS5nZXRPcHRpb25hbEljb25zVmlzaWJsZSgpOworICAgICAgICByZXR1cm4gbWVudVR5cGUgPT0gTWVudUJ1aWxkZXIuVFlQRV9JQ09OIHx8CisgICAgICAgICAgICAgICAgbWVudVR5cGUgPT0gTWVudUJ1aWxkZXIuVFlQRV9BQ1RJT05fQlVUVE9OIHx8CisgICAgICAgICAgICAgICAgbWVudVR5cGUgPT0gTWVudUJ1aWxkZXIuVFlQRV9QT1BVUCB8fAorICAgICAgICAgICAgICAgIG1NZW51LmdldE9wdGlvbmFsSWNvbnNWaXNpYmxlKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aW9uQnV0dG9uKCkgeworICAgICAgICByZXR1cm4gKG1GbGFncyAmIElTX0FDVElPTikgPT0gSVNfQUNUSU9OIHx8IHJlcXVpcmVzQWN0aW9uQnV0dG9uKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RzQWN0aW9uQnV0dG9uKCkgeworICAgICAgICByZXR1cm4gbVNob3dBc0FjdGlvbiA9PSBTSE9XX0FTX0FDVElPTl9JRl9ST09NOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0FjdGlvbkJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIG1TaG93QXNBY3Rpb24gPT0gU0hPV19BU19BQ1RJT05fQUxXQVlTOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElzQWN0aW9uQnV0dG9uKGJvb2xlYW4gaXNBY3Rpb25CdXR0b24pIHsKKyAgICAgICAgaWYgKGlzQWN0aW9uQnV0dG9uKSB7CisgICAgICAgICAgICBtRmxhZ3MgfD0gSVNfQUNUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUZsYWdzICY9IH5JU19BQ1RJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93QXNBY3Rpb24oaW50IGFjdGlvbkVudW0pIHsKKyAgICAgICAgbVNob3dBc0FjdGlvbiA9IGFjdGlvbkVudW07CisgICAgICAgIG1NZW51Lm9uSXRlbUFjdGlvblJlcXVlc3RDaGFuZ2VkKHRoaXMpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudVBvcHVwSGVscGVyLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVQb3B1cEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMmE0ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVQb3B1cEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnU7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIuTWVudUFkYXB0ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0UG9wdXBXaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3c7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIE1lbnVQb3B1cEhlbHBlciBpbXBsZW1lbnRzIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIsIFZpZXcuT25LZXlMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZW51UG9wdXBIZWxwZXIiOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgTGlzdFBvcHVwV2luZG93IG1Qb3B1cDsKKyAgICBwcml2YXRlIE1lbnVCdWlsZGVyIG1NZW51OworICAgIHByaXZhdGUgaW50IG1Qb3B1cE1heFdpZHRoOworICAgIHByaXZhdGUgV2Vha1JlZmVyZW5jZTxWaWV3PiBtQW5jaG9yVmlldzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbU92ZXJmbG93T25seTsKKworICAgIHByaXZhdGUgUG9wdXBXaW5kb3cuT25EaXNtaXNzTGlzdGVuZXIgbURpc21pc3NMaXN0ZW5lciA9IG5ldyBQb3B1cFdpbmRvdy5PbkRpc21pc3NMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25EaXNtaXNzKCkgeworICAgICAgICAgICAgbVBvcHVwID0gbnVsbDsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgTWVudVBvcHVwSGVscGVyKENvbnRleHQgY29udGV4dCwgTWVudUJ1aWxkZXIgbWVudSkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG1lbnUsIG51bGwsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudVBvcHVwSGVscGVyKENvbnRleHQgY29udGV4dCwgTWVudUJ1aWxkZXIgbWVudSwgVmlldyBhbmNob3JWaWV3KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbWVudSwgYW5jaG9yVmlldywgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51UG9wdXBIZWxwZXIoQ29udGV4dCBjb250ZXh0LCBNZW51QnVpbGRlciBtZW51LAorICAgICAgICAgICAgVmlldyBhbmNob3JWaWV3LCBib29sZWFuIG92ZXJmbG93T25seSkgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1NZW51ID0gbWVudTsKKyAgICAgICAgbU92ZXJmbG93T25seSA9IG92ZXJmbG93T25seTsKKworICAgICAgICBmaW5hbCBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICBtUG9wdXBNYXhXaWR0aCA9IG1ldHJpY3Mud2lkdGhQaXhlbHMgLyAyOworCisgICAgICAgIGlmIChhbmNob3JWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BbmNob3JWaWV3ID0gbmV3IFdlYWtSZWZlcmVuY2U8Vmlldz4oYW5jaG9yVmlldyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICAvLyBUT0RPIFVzZSBhIHN0eWxlIGZyb20gdGhlIHRoZW1lIGhlcmUKKyAgICAgICAgbVBvcHVwID0gbmV3IExpc3RQb3B1cFdpbmRvdyhtQ29udGV4dCwgbnVsbCwgMCwKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLldpZGdldF9TcGlubmVyKTsKKyAgICAgICAgbVBvcHVwLnNldE9uSXRlbUNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1Qb3B1cC5zZXRPbkRpc21pc3NMaXN0ZW5lcihtRGlzbWlzc0xpc3RlbmVyKTsKKworICAgICAgICBmaW5hbCBNZW51QWRhcHRlciBhZGFwdGVyID0gbU92ZXJmbG93T25seSA/CisgICAgICAgICAgICAgICAgbU1lbnUuZ2V0T3ZlcmZsb3dNZW51QWRhcHRlcihNZW51QnVpbGRlci5UWVBFX1BPUFVQKSA6CisgICAgICAgICAgICAgICAgbU1lbnUuZ2V0TWVudUFkYXB0ZXIoTWVudUJ1aWxkZXIuVFlQRV9QT1BVUCk7CisgICAgICAgIG1Qb3B1cC5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBtUG9wdXAuc2V0TW9kYWwodHJ1ZSk7CisKKyAgICAgICAgaWYgKG1BbmNob3JWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRBbmNob3JWaWV3KG1BbmNob3JWaWV3LmdldCgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtTWVudSBpbnN0YW5jZW9mIFN1Yk1lbnVCdWlsZGVyKSB7CisgICAgICAgICAgICBTdWJNZW51QnVpbGRlciBzdWJNZW51ID0gKFN1Yk1lbnVCdWlsZGVyKSBtTWVudTsKKyAgICAgICAgICAgIGZpbmFsIE1lbnVJdGVtSW1wbCBpdGVtSW1wbCA9IChNZW51SXRlbUltcGwpIHN1Yk1lbnUuZ2V0SXRlbSgpOworICAgICAgICAgICAgbVBvcHVwLnNldEFuY2hvclZpZXcoaXRlbUltcGwuZ2V0SXRlbVZpZXcoTWVudUJ1aWxkZXIuVFlQRV9BQ1RJT05fQlVUVE9OLCBudWxsKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNZW51UG9wdXBIZWxwZXIgY2Fubm90IGJlIHVzZWQgd2l0aG91dCBhbiBhbmNob3IiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1Qb3B1cC5zZXRDb250ZW50V2lkdGgoTWF0aC5taW4obWVhc3VyZUNvbnRlbnRXaWR0aChhZGFwdGVyKSwgbVBvcHVwTWF4V2lkdGgpKTsKKyAgICAgICAgbVBvcHVwLnNob3coKTsKKyAgICAgICAgbVBvcHVwLmdldExpc3RWaWV3KCkuc2V0T25LZXlMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICBpZiAoaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIG1Qb3B1cC5kaXNtaXNzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Nob3dpbmcoKSB7CisgICAgICAgIHJldHVybiBtUG9wdXAgIT0gbnVsbCAmJiBtUG9wdXAuaXNTaG93aW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICBNZW51SXRlbSBpdGVtID0gbnVsbDsKKyAgICAgICAgaWYgKG1PdmVyZmxvd09ubHkpIHsKKyAgICAgICAgICAgIGl0ZW0gPSBtTWVudS5nZXRPdmVyZmxvd0l0ZW0ocG9zaXRpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXRlbSA9IG1NZW51LmdldEl0ZW0ocG9zaXRpb24pOworICAgICAgICB9CisgICAgICAgIG1NZW51LnBlcmZvcm1JdGVtQWN0aW9uKGl0ZW0sIDApOworICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9uS2V5KFZpZXcgdiwgaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fVVAgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX01FTlUpIHsKKyAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBtZWFzdXJlQ29udGVudFdpZHRoKE1lbnVBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgLy8gTWVudXMgZG9uJ3QgdGVuZCB0byBiZSBsb25nLCBzbyB0aGlzIGlzIG1vcmUgc2FuZSB0aGFuIGl0IGxvb2tzLgorICAgICAgICBpbnQgd2lkdGggPSAwOworICAgICAgICBWaWV3IGl0ZW1WaWV3ID0gbnVsbDsKKyAgICAgICAgZmluYWwgaW50IHdpZHRoTWVhc3VyZVNwZWMgPQorICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKDAsIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodE1lYXN1cmVTcGVjID0KKyAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygwLCBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCk7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGFkYXB0ZXIuZ2V0Q291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpdGVtVmlldyA9IGFkYXB0ZXIuZ2V0VmlldyhpLCBpdGVtVmlldywgbnVsbCk7CisgICAgICAgICAgICBpdGVtVmlldy5tZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGl0ZW1WaWV3LmdldE1lYXN1cmVkV2lkdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdpZHRoOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyQ29udGV4dFZpZXcuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyQ29udGV4dFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2Y3NWUzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJDb250ZXh0Vmlldy5qYXZhCkBAIC0wLDAgKzEsMzMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQWN0aW9uTWVudVZpZXc7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEFjdGlvbkJhckNvbnRleHRWaWV3IGV4dGVuZHMgVmlld0dyb3VwIHsKKyAgICBwcml2YXRlIGludCBtSXRlbVBhZGRpbmc7CisgICAgcHJpdmF0ZSBpbnQgbUl0ZW1NYXJnaW47CisgICAgcHJpdmF0ZSBpbnQgbUFjdGlvblNwYWNpbmc7CisgICAgcHJpdmF0ZSBpbnQgbUNvbnRlbnRIZWlnaHQ7CisgICAgCisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRpdGxlOworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1TdWJ0aXRsZTsKKyAgICAKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1DbG9zZUJ1dHRvbjsKKyAgICBwcml2YXRlIFZpZXcgbUN1c3RvbVZpZXc7CisgICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbVRpdGxlTGF5b3V0OworICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1TdWJ0aXRsZVZpZXc7CisgICAgcHJpdmF0ZSBEcmF3YWJsZSBtQ2xvc2VEcmF3YWJsZTsKKyAgICBwcml2YXRlIEFjdGlvbk1lbnVWaWV3IG1NZW51VmlldzsKKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uQmFyQ29udGV4dFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCwgMCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBBY3Rpb25CYXJDb250ZXh0VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFjdGlvbkJhckNvbnRleHRWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKKyAgICAgICAgCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5UaGVtZSk7CisgICAgICAgIG1JdGVtUGFkZGluZyA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxPZmZzZXQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVGhlbWVfYWN0aW9uQnV0dG9uUGFkZGluZywgMCk7CisgICAgICAgIHNldEJhY2tncm91bmREcmF3YWJsZShhLmdldERyYXdhYmxlKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlRoZW1lX2FjdGlvbk1vZGVCYWNrZ3JvdW5kKSk7CisgICAgICAgIG1DbG9zZURyYXdhYmxlID0gYS5nZXREcmF3YWJsZSgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5UaGVtZV9hY3Rpb25Nb2RlQ2xvc2VEcmF3YWJsZSk7CisgICAgICAgIG1JdGVtTWFyZ2luID0gbUl0ZW1QYWRkaW5nIC8gMjsKKworICAgICAgICBtQ29udGVudEhlaWdodCA9IGEuZ2V0TGF5b3V0RGltZW5zaW9uKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlRoZW1lX3dpbmRvd0FjdGlvbkJhclNpemUsIDApOworICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQoVmlldyBjaGlsZCwgQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAvLyBObyBzdGFydGluZyBhbiBhY3Rpb24gbW9kZSBmb3IgYW4gZXhpc3RpbmcgYWN0aW9uIG1vZGUgVUkgY2hpbGQhIChXaGVyZSB3b3VsZCBpdCBnbz8pCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhlaWdodChpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1Db250ZW50SGVpZ2h0ID0gaGVpZ2h0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgIGlmIChtQ3VzdG9tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICByZW1vdmVWaWV3KG1DdXN0b21WaWV3KTsKKyAgICAgICAgfQorICAgICAgICBtQ3VzdG9tVmlldyA9IHZpZXc7CisgICAgICAgIGlmIChtVGl0bGVMYXlvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVtb3ZlVmlldyhtVGl0bGVMYXlvdXQpOworICAgICAgICAgICAgbVRpdGxlTGF5b3V0ID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGRWaWV3KHZpZXcpOworICAgICAgICB9CisgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgIGluaXRUaXRsZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSkgeworICAgICAgICBtU3VidGl0bGUgPSBzdWJ0aXRsZTsKKyAgICAgICAgaW5pdFRpdGxlKCk7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UaXRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFN1YnRpdGxlKCkgeworICAgICAgICByZXR1cm4gbVN1YnRpdGxlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0VGl0bGUoKSB7CisgICAgICAgIGlmIChtVGl0bGVMYXlvdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKGdldENvbnRleHQoKSk7CisgICAgICAgICAgICBtVGl0bGVMYXlvdXQgPSAoTGluZWFyTGF5b3V0KSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmFjdGlvbl9iYXJfdGl0bGVfaXRlbSwgbnVsbCk7CisgICAgICAgICAgICBtVGl0bGVWaWV3ID0gKFRleHRWaWV3KSBtVGl0bGVMYXlvdXQuZmluZFZpZXdCeUlkKFIuaWQuYWN0aW9uX2Jhcl90aXRsZSk7CisgICAgICAgICAgICBtU3VidGl0bGVWaWV3ID0gKFRleHRWaWV3KSBtVGl0bGVMYXlvdXQuZmluZFZpZXdCeUlkKFIuaWQuYWN0aW9uX2Jhcl9zdWJ0aXRsZSk7CisgICAgICAgICAgICBpZiAobVRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQobVRpdGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtU3VidGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dChtU3VidGl0bGUpOworICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZFZpZXcobVRpdGxlTGF5b3V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChtVGl0bGUpOworICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0KG1TdWJ0aXRsZSk7CisgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFZpc2liaWxpdHkobVN1YnRpdGxlICE9IG51bGwgPyBWSVNJQkxFIDogR09ORSk7CisgICAgICAgICAgICBpZiAobVRpdGxlTGF5b3V0LmdldFBhcmVudCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1UaXRsZUxheW91dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0Rm9yTW9kZShmaW5hbCBBY3Rpb25Nb2RlIG1vZGUpIHsKKyAgICAgICAgaWYgKG1DbG9zZUJ1dHRvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ2xvc2VCdXR0b24gPSBuZXcgSW1hZ2VCdXR0b24oZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgIG1DbG9zZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKG1DbG9zZURyYXdhYmxlKTsKKyAgICAgICAgICAgIG1DbG9zZUJ1dHRvbi5zZXRCYWNrZ3JvdW5kRHJhd2FibGUobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgbUNsb3NlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBtb2RlLmZpbmlzaCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgYWRkVmlldyhtQ2xvc2VCdXR0b24pOworCisgICAgICAgIGZpbmFsIE1lbnVCdWlsZGVyIG1lbnUgPSAoTWVudUJ1aWxkZXIpIG1vZGUuZ2V0TWVudSgpOworICAgICAgICBtTWVudVZpZXcgPSAoQWN0aW9uTWVudVZpZXcpIG1lbnUuZ2V0TWVudVZpZXcoTWVudUJ1aWxkZXIuVFlQRV9BQ1RJT05fQlVUVE9OLCB0aGlzKTsKKyAgICAgICAgbU1lbnVWaWV3LnNldE92ZXJmbG93UmVzZXJ2ZWQodHJ1ZSk7CisgICAgICAgIG1NZW51Vmlldy51cGRhdGVDaGlsZHJlbihmYWxzZSk7CisgICAgICAgIGFkZFZpZXcobU1lbnVWaWV3KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZU1vZGUoKSB7CisgICAgICAgIHJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgIG1DdXN0b21WaWV3ID0gbnVsbDsKKyAgICAgICAgbU1lbnVWaWV3ID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzaG93T3ZlcmZsb3dNZW51KCkgeworICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudVZpZXcuc2hvd092ZXJmbG93TWVudSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoaWRlT3ZlcmZsb3dNZW51KCkgeworICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudVZpZXcuaGlkZU92ZXJmbG93TWVudSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJmbG93TWVudVNob3dpbmcoKSB7CisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51Vmlldy5pc092ZXJmbG93TWVudVNob3dpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExheW91dFBhcmFtcyBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXMoKSB7CisgICAgICAgIC8vIFVzZWQgYnkgY3VzdG9tIHZpZXdzIGlmIHRoZXkgZG9uJ3Qgc3VwcGx5IGxheW91dCBwYXJhbXMuIEV2ZXJ5dGhpbmcgZWxzZQorICAgICAgICAvLyBhZGRlZCB0byBhbiBBY3Rpb25CYXJDb250ZXh0VmlldyBzaG91bGQgaGF2ZSB0aGVtIGFscmVhZHkuCisgICAgICAgIHJldHVybiBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgIGZpbmFsIGludCB3aWR0aE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKHdpZHRoTWVhc3VyZVNwZWMpOworICAgICAgICBpZiAod2lkdGhNb2RlICE9IE1lYXN1cmVTcGVjLkVYQUNUTFkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIGNhbiBvbmx5IGJlIHVzZWQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aXRoIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPVwibWF0Y2hfcGFyZW50XCIgKG9yIGZpbGxfcGFyZW50KSIpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGhlaWdodE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaWYgKGhlaWdodE1vZGUgIT0gTWVhc3VyZVNwZWMuQVRfTU9TVCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgY2FuIG9ubHkgYmUgdXNlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpdGggYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PVwid3JhcF9jb250ZW50XCIiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZmluYWwgaW50IGNvbnRlbnRXaWR0aCA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgIGZpbmFsIGludCBpdGVtTWFyZ2luID0gbUl0ZW1QYWRkaW5nOworCisgICAgICAgIGludCBtYXhIZWlnaHQgPSBtQ29udGVudEhlaWdodCA+IDAgPworICAgICAgICAgICAgICAgIG1Db250ZW50SGVpZ2h0IDogTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7CisKKyAgICAgICAgZmluYWwgaW50IHZlcnRpY2FsUGFkZGluZyA9IGdldFBhZGRpbmdUb3AoKSArIGdldFBhZGRpbmdCb3R0b20oKTsKKyAgICAgICAgaW50IGF2YWlsYWJsZVdpZHRoID0gY29udGVudFdpZHRoIC0gZ2V0UGFkZGluZ0xlZnQoKSAtIGdldFBhZGRpbmdSaWdodCgpOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gbWF4SGVpZ2h0IC0gdmVydGljYWxQYWRkaW5nOworICAgICAgICBmaW5hbCBpbnQgY2hpbGRTcGVjSGVpZ2h0ID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuQVRfTU9TVCk7CisgICAgICAgIAorICAgICAgICBpZiAobUNsb3NlQnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhtQ2xvc2VCdXR0b24sIGF2YWlsYWJsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQsIGl0ZW1NYXJnaW4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1UaXRsZUxheW91dCAhPSBudWxsICYmIG1DdXN0b21WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhtVGl0bGVMYXlvdXQsIGF2YWlsYWJsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQsIGl0ZW1NYXJnaW4pOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGlmIChjaGlsZCA9PSBtQ2xvc2VCdXR0b24gfHwgY2hpbGQgPT0gbVRpdGxlTGF5b3V0IHx8IGNoaWxkID09IG1DdXN0b21WaWV3KSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhjaGlsZCwgYXZhaWxhYmxlV2lkdGgsIGNoaWxkU3BlY0hlaWdodCwgaXRlbU1hcmdpbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUN1c3RvbVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gbUN1c3RvbVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tV2lkdGhNb2RlID0gbHAud2lkdGggIT0gTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCA/CisgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLkVYQUNUTFkgOiBNZWFzdXJlU3BlYy5BVF9NT1NUOworICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbVdpZHRoID0gbHAud2lkdGggPj0gMCA/CisgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGxwLndpZHRoLCBhdmFpbGFibGVXaWR0aCkgOiBhdmFpbGFibGVXaWR0aDsKKyAgICAgICAgICAgIGZpbmFsIGludCBjdXN0b21IZWlnaHRNb2RlID0gbHAuaGVpZ2h0ICE9IExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQgPworICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5FWEFDVExZIDogTWVhc3VyZVNwZWMuQVRfTU9TVDsKKyAgICAgICAgICAgIGZpbmFsIGludCBjdXN0b21IZWlnaHQgPSBscC5oZWlnaHQgPj0gMCA/CisgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGxwLmhlaWdodCwgaGVpZ2h0KSA6IGhlaWdodDsKKyAgICAgICAgICAgIG1DdXN0b21WaWV3Lm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGN1c3RvbVdpZHRoLCBjdXN0b21XaWR0aE1vZGUpLAorICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY3VzdG9tSGVpZ2h0LCBjdXN0b21IZWlnaHRNb2RlKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUNvbnRlbnRIZWlnaHQgPD0gMCkgeworICAgICAgICAgICAgaW50IG1lYXN1cmVkSGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIFZpZXcgdiA9IGdldENoaWxkQXQoaSk7CisgICAgICAgICAgICAgICAgaW50IHBhZGRlZFZpZXdIZWlnaHQgPSB2LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyB2ZXJ0aWNhbFBhZGRpbmc7CisgICAgICAgICAgICAgICAgaWYgKHBhZGRlZFZpZXdIZWlnaHQgPiBtZWFzdXJlZEhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IHBhZGRlZFZpZXdIZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24oY29udGVudFdpZHRoLCBtZWFzdXJlZEhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbihjb250ZW50V2lkdGgsIG1heEhlaWdodCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CisgICAgICAgIGludCB4ID0gZ2V0UGFkZGluZ0xlZnQoKTsKKyAgICAgICAgZmluYWwgaW50IHkgPSBnZXRQYWRkaW5nVG9wKCk7CisgICAgICAgIGZpbmFsIGludCBjb250ZW50SGVpZ2h0ID0gYiAtIHQgLSBnZXRQYWRkaW5nVG9wKCkgLSBnZXRQYWRkaW5nQm90dG9tKCk7CisgICAgICAgIGZpbmFsIGludCBpdGVtTWFyZ2luID0gbUl0ZW1QYWRkaW5nOworICAgICAgICAKKyAgICAgICAgaWYgKG1DbG9zZUJ1dHRvbiAhPSBudWxsICYmIG1DbG9zZUJ1dHRvbi5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1DbG9zZUJ1dHRvbiwgeCwgeSwgY29udGVudEhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtVGl0bGVMYXlvdXQgIT0gbnVsbCAmJiBtQ3VzdG9tVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobVRpdGxlTGF5b3V0LCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIGl0ZW1NYXJnaW47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtQ3VzdG9tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobUN1c3RvbVZpZXcsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgaXRlbU1hcmdpbjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgeCA9IHIgLSBsIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7CisKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICB4IC09IHBvc2l0aW9uQ2hpbGRJbnZlcnNlKG1NZW51VmlldywgeCArIG1BY3Rpb25TcGFjaW5nLCB5LCBjb250ZW50SGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAtIG1BY3Rpb25TcGFjaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgbWVhc3VyZUNoaWxkVmlldyhWaWV3IGNoaWxkLCBpbnQgYXZhaWxhYmxlV2lkdGgsIGludCBjaGlsZFNwZWNIZWlnaHQsIGludCBzcGFjaW5nKSB7CisgICAgICAgIGNoaWxkLm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQpOworCisgICAgICAgIGF2YWlsYWJsZVdpZHRoIC09IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgYXZhaWxhYmxlV2lkdGggLT0gc3BhY2luZzsKKworICAgICAgICByZXR1cm4gYXZhaWxhYmxlV2lkdGg7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgaW50IHBvc2l0aW9uQ2hpbGQoVmlldyBjaGlsZCwgaW50IHgsIGludCB5LCBpbnQgY29udGVudEhlaWdodCkgeworICAgICAgICBpbnQgY2hpbGRXaWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgaW50IGNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgaW50IGNoaWxkVG9wID0geSArIChjb250ZW50SGVpZ2h0IC0gY2hpbGRIZWlnaHQpIC8gMjsKKworICAgICAgICBjaGlsZC5sYXlvdXQoeCwgY2hpbGRUb3AsIHggKyBjaGlsZFdpZHRoLCBjaGlsZFRvcCArIGNoaWxkSGVpZ2h0KTsKKworICAgICAgICByZXR1cm4gY2hpbGRXaWR0aDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb25DaGlsZEludmVyc2UoVmlldyBjaGlsZCwgaW50IHgsIGludCB5LCBpbnQgY29udGVudEhlaWdodCkgeworICAgICAgICBpbnQgY2hpbGRXaWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgaW50IGNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgaW50IGNoaWxkVG9wID0geSArIChjb250ZW50SGVpZ2h0IC0gY2hpbGRIZWlnaHQpIC8gMjsKKworICAgICAgICBjaGlsZC5sYXlvdXQoeCAtIGNoaWxkV2lkdGgsIGNoaWxkVG9wLCB4LCBjaGlsZFRvcCArIGNoaWxkSGVpZ2h0KTsKKworICAgICAgICByZXR1cm4gY2hpbGRXaWR0aDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhclZpZXcuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZTRlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhclZpZXcuamF2YQpAQCAtMCwwICsxLDc1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQWN0aW9uTWVudUl0ZW07CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVWaWV3OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGlvbkJhcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpb25CYXIuTmF2aWdhdGlvbkNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzLlRydW5jYXRlQXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TcGlubmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXJBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25CYXJWaWV3IGV4dGVuZHMgVmlld0dyb3VwIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFjdGlvbkJhclZpZXciOworICAgIAorICAgIC8vIFRPRE86IFRoaXMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBkZWZhdWx0IHRoZW1lCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfUEFERElOR19ESVAgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1NQQUNJTkdfRElQID0gNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9BQ1RJT05fU1BBQ0lOR19ESVAgPSAxMjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IG9wdGlvbnMgYXBwbGllZCBieSBkZWZhdWx0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9ERUZBVUxUID0gMDsKKworICAgIC8qKgorICAgICAqIERpc3BsYXkgb3B0aW9ucyB0aGF0IHJlcXVpcmUgcmUtbGF5b3V0IGFzIG9wcG9zZWQgdG8gYSBzaW1wbGUgaW52YWxpZGF0ZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNQTEFZX1JFTEFZT1VUX01BU0sgPQorICAgICAgICAgICAgQWN0aW9uQmFyLkRJU1BMQVlfSElERV9IT01FIHwKKyAgICAgICAgICAgIEFjdGlvbkJhci5ESVNQTEFZX1VTRV9MT0dPOworICAgIAorICAgIHByaXZhdGUgZmluYWwgaW50IG1Db250ZW50SGVpZ2h0OworCisgICAgcHJpdmF0ZSBpbnQgbU5hdmlnYXRpb25Nb2RlOworICAgIHByaXZhdGUgaW50IG1EaXNwbGF5T3B0aW9uczsKKyAgICBwcml2YXRlIGludCBtU3BhY2luZzsKKyAgICBwcml2YXRlIGludCBtQWN0aW9uU3BhY2luZzsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGU7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVN1YnRpdGxlOworICAgIHByaXZhdGUgRHJhd2FibGUgbUljb247CisgICAgcHJpdmF0ZSBEcmF3YWJsZSBtTG9nbzsKKworICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1JY29uVmlldzsKKyAgICBwcml2YXRlIEltYWdlVmlldyBtTG9nb1ZpZXc7CisgICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbVRpdGxlTGF5b3V0OworICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1TdWJ0aXRsZVZpZXc7CisgICAgcHJpdmF0ZSBTcGlubmVyIG1TcGlubmVyOworICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1UYWJMYXlvdXQ7CisgICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21OYXZWaWV3OworICAgIAorICAgIHByaXZhdGUgaW50IG1UaXRsZVN0eWxlUmVzOworICAgIHByaXZhdGUgaW50IG1TdWJ0aXRsZVN0eWxlUmVzOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1TaG93TWVudTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVVzZXJUaXRsZTsKKworICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU9wdGlvbnNNZW51OworICAgIHByaXZhdGUgQWN0aW9uTWVudVZpZXcgbU1lbnVWaWV3OworICAgIAorICAgIHByaXZhdGUgQWN0aW9uQmFyQ29udGV4dFZpZXcgbUNvbnRleHRWaWV3OworCisgICAgcHJpdmF0ZSBBY3Rpb25NZW51SXRlbSBtTG9nb05hdkl0ZW07CisgICAgCisgICAgcHJpdmF0ZSBOYXZpZ2F0aW9uQ2FsbGJhY2sgbUNhbGxiYWNrOworCisgICAgcHJpdmF0ZSBmaW5hbCBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyIG1OYXZJdGVtU2VsZWN0ZWRMaXN0ZW5lciA9CisgICAgICAgICAgICBuZXcgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU2VsZWN0ZWQoQWRhcHRlclZpZXcgcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uTmF2aWdhdGlvbkl0ZW1TZWxlY3RlZChwb3NpdGlvbiwgaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIG9uTm90aGluZ1NlbGVjdGVkKEFkYXB0ZXJWaWV3IHBhcmVudCkgeworICAgICAgICAgICAgLy8gRG8gbm90aGluZworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgT25DbGlja0xpc3RlbmVyIG1Ib21lQ2xpY2tMaXN0ZW5lciA9IG51bGw7CisKKyAgICBwdWJsaWMgQWN0aW9uQmFyVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisKKyAgICAgICAgZmluYWwgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKTsKKworICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIFIuc3R5bGVhYmxlLkFjdGlvbkJhcik7CisKKyAgICAgICAgZmluYWwgaW50IGNvbG9yRmlsdGVyID0gYS5nZXRDb2xvcihSLnN0eWxlYWJsZS5BY3Rpb25CYXJfY29sb3JGaWx0ZXIsIDApOworCisgICAgICAgIGlmIChjb2xvckZpbHRlciAhPSAwKSB7CisgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBkID0gZ2V0QmFja2dyb3VuZCgpOworICAgICAgICAgICAgZC5zZXREaXRoZXIodHJ1ZSk7CisgICAgICAgICAgICBkLnNldENvbG9yRmlsdGVyKG5ldyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIoY29sb3JGaWx0ZXIsIFBvcnRlckR1ZmYuTW9kZS5PVkVSTEFZKSk7CisgICAgICAgIH0KKworICAgICAgICBBcHBsaWNhdGlvbkluZm8gaW5mbyA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb25JbmZvKCk7CisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBtTmF2aWdhdGlvbk1vZGUgPSBhLmdldEludChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfbmF2aWdhdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRCk7CisgICAgICAgIG1UaXRsZSA9IGEuZ2V0VGV4dChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfdGl0bGUpOworICAgICAgICBtU3VidGl0bGUgPSBhLmdldFRleHQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX3N1YnRpdGxlKTsKKyAgICAgICAgbURpc3BsYXlPcHRpb25zID0gYS5nZXRJbnQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX2Rpc3BsYXlPcHRpb25zLCBESVNQTEFZX0RFRkFVTFQpOworICAgICAgICAKKyAgICAgICAgbUxvZ28gPSBhLmdldERyYXdhYmxlKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9sb2dvKTsKKyAgICAgICAgaWYgKG1Mb2dvID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2dvID0gaW5mby5sb2FkTG9nbyhwbSk7CisgICAgICAgIH0KKyAgICAgICAgbUljb24gPSBhLmdldERyYXdhYmxlKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9pY29uKTsKKyAgICAgICAgaWYgKG1JY29uID09IG51bGwpIHsKKyAgICAgICAgICAgIG1JY29uID0gaW5mby5sb2FkSWNvbihwbSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIERyYXdhYmxlIGJhY2tncm91bmQgPSBhLmdldERyYXdhYmxlKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9iYWNrZ3JvdW5kKTsKKyAgICAgICAgaWYgKGJhY2tncm91bmQgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0QmFja2dyb3VuZERyYXdhYmxlKGJhY2tncm91bmQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtVGl0bGVTdHlsZVJlcyA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfdGl0bGVUZXh0U3R5bGUsIDApOworICAgICAgICBtU3VidGl0bGVTdHlsZVJlcyA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfc3VidGl0bGVUZXh0U3R5bGUsIDApOworCisgICAgICAgIGZpbmFsIGludCBjdXN0b21OYXZJZCA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfY3VzdG9tTmF2aWdhdGlvbkxheW91dCwgMCk7CisgICAgICAgIGlmIChjdXN0b21OYXZJZCAhPSAwKSB7CisgICAgICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oY29udGV4dCk7CisgICAgICAgICAgICBtQ3VzdG9tTmF2VmlldyA9IChWaWV3KSBpbmZsYXRlci5pbmZsYXRlKGN1c3RvbU5hdklkLCBudWxsKTsKKyAgICAgICAgICAgIG1OYXZpZ2F0aW9uTW9kZSA9IEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NOworICAgICAgICB9CisKKyAgICAgICAgbUNvbnRlbnRIZWlnaHQgPSBhLmdldExheW91dERpbWVuc2lvbihSLnN0eWxlYWJsZS5BY3Rpb25CYXJfaGVpZ2h0LCAwKTsKKworICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAvLyBUT0RPOiBTZXQgdGhpcyBpbiB0aGUgdGhlbWUKKyAgICAgICAgbVNwYWNpbmcgPSAoaW50KSAoQ09OVEVOVF9TUEFDSU5HX0RJUCAqIG1ldHJpY3MuZGVuc2l0eSArIDAuNWYpOworICAgICAgICBtQWN0aW9uU3BhY2luZyA9IChpbnQpIChDT05URU5UX0FDVElPTl9TUEFDSU5HX0RJUCAqIG1ldHJpY3MuZGVuc2l0eSArIDAuNWYpOworICAgICAgICAKKyAgICAgICAgaWYgKG1Mb2dvICE9IG51bGwgfHwgbUljb24gIT0gbnVsbCB8fCBtVGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvZ29OYXZJdGVtID0gbmV3IEFjdGlvbk1lbnVJdGVtKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5pZC5ob21lLCAwLCAwLCBtVGl0bGUpOworICAgICAgICAgICAgbUhvbWVDbGlja0xpc3RlbmVyID0gbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBjb250ZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkub25PcHRpb25zSXRlbVNlbGVjdGVkKG1Mb2dvTmF2SXRlbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQoVmlldyBjaGlsZCwgQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAvLyBObyBzdGFydGluZyBhbiBhY3Rpb24gbW9kZSBmb3IgYW4gYWN0aW9uIGJhciBjaGlsZCEgKFdoZXJlIHdvdWxkIGl0IGdvPykKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soTmF2aWdhdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1lbnUoTWVudSBtZW51KSB7CisgICAgICAgIE1lbnVCdWlsZGVyIGJ1aWxkZXIgPSAoTWVudUJ1aWxkZXIpIG1lbnU7CisgICAgICAgIG1PcHRpb25zTWVudSA9IGJ1aWxkZXI7CisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVtb3ZlVmlldyhtTWVudVZpZXcpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEFjdGlvbk1lbnVWaWV3IG1lbnVWaWV3ID0gKEFjdGlvbk1lbnVWaWV3KSBidWlsZGVyLmdldE1lbnVWaWV3KAorICAgICAgICAgICAgICAgIE1lbnVCdWlsZGVyLlRZUEVfQUNUSU9OX0JVVFRPTiwgbnVsbCk7CisgICAgICAgIG1BY3Rpb25TcGFjaW5nID0gbWVudVZpZXcuZ2V0SXRlbU1hcmdpbigpOworICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgbGF5b3V0UGFyYW1zID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOworICAgICAgICBtZW51Vmlldy5zZXRMYXlvdXRQYXJhbXMobGF5b3V0UGFyYW1zKTsKKyAgICAgICAgYWRkVmlldyhtZW51Vmlldyk7CisgICAgICAgIG1NZW51VmlldyA9IG1lbnVWaWV3OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNob3dPdmVyZmxvd01lbnUoKSB7CisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51Vmlldy5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc3RTaG93T3ZlcmZsb3dNZW51KCkgeworICAgICAgICBwb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBzaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhpZGVPdmVyZmxvd01lbnUoKSB7CisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51Vmlldy5oaWRlT3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcmZsb3dNZW51U2hvd2luZygpIHsKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbU1lbnVWaWV3LmlzT3ZlcmZsb3dNZW51U2hvd2luZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJmbG93UmVzZXJ2ZWQoKSB7CisgICAgICAgIHJldHVybiBtTWVudVZpZXcgIT0gbnVsbCAmJiBtTWVudVZpZXcuaXNPdmVyZmxvd1Jlc2VydmVkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tTmF2aWdhdGlvblZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgIG1DdXN0b21OYXZWaWV3ID0gdmlldzsKKyAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0TmF2aWdhdGlvbk1vZGUoQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT00pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UaXRsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgdGl0bGUuIFRoaXMgd2lsbCBhbHdheXMgcmVwbGFjZSBvciBvdmVycmlkZSB3aW5kb3cgdGl0bGVzLgorICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFdpbmRvd1RpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVVzZXJUaXRsZSA9IHRydWU7CisgICAgICAgIHNldFRpdGxlSW1wbCh0aXRsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB3aW5kb3cgdGl0bGUuIEEgd2luZG93IHRpdGxlIHdpbGwgYWx3YXlzIGJlIHJlcGxhY2VkIG9yIG92ZXJyaWRkZW4gYnkgYSB1c2VyIHRpdGxlLgorICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFRpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaW5kb3dUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgaWYgKCFtVXNlclRpdGxlKSB7CisgICAgICAgICAgICBzZXRUaXRsZUltcGwodGl0bGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFRpdGxlSW1wbChDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgIGlmIChtVGl0bGVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Mb2dvTmF2SXRlbSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9nb05hdkl0ZW0uc2V0VGl0bGUodGl0bGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJ0aXRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpIHsKKyAgICAgICAgbVN1YnRpdGxlID0gc3VidGl0bGU7CisgICAgICAgIGlmIChtU3VidGl0bGVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dChzdWJ0aXRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5T3B0aW9ucyhpbnQgb3B0aW9ucykgeworICAgICAgICBmaW5hbCBpbnQgZmxhZ3NDaGFuZ2VkID0gb3B0aW9ucyBeIG1EaXNwbGF5T3B0aW9uczsKKyAgICAgICAgbURpc3BsYXlPcHRpb25zID0gb3B0aW9uczsKKyAgICAgICAgaWYgKChmbGFnc0NoYW5nZWQgJiBESVNQTEFZX1JFTEFZT1VUX01BU0spICE9IDApIHsKKyAgICAgICAgICAgIGZpbmFsIGludCB2aXMgPSAob3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX0hJREVfSE9NRSkgIT0gMCA/IEdPTkUgOiBWSVNJQkxFOworICAgICAgICAgICAgaWYgKG1Mb2dvVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3LnNldFZpc2liaWxpdHkodmlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSWNvblZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JY29uVmlldy5zZXRWaXNpYmlsaXR5KHZpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hdmlnYXRpb25Nb2RlKGludCBtb2RlKSB7CisgICAgICAgIGZpbmFsIGludCBvbGRNb2RlID0gbU5hdmlnYXRpb25Nb2RlOworICAgICAgICBpZiAobW9kZSAhPSBvbGRNb2RlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9sZE1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRDoKKyAgICAgICAgICAgICAgICBpZiAobVRpdGxlTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVmlldyhtVGl0bGVMYXlvdXQpOworICAgICAgICAgICAgICAgICAgICBtVGl0bGVMYXlvdXQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICAgICAgaWYgKG1TcGlubmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVmlldyhtU3Bpbm5lcik7CisgICAgICAgICAgICAgICAgICAgIG1TcGlubmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NOgorICAgICAgICAgICAgICAgIGlmIChtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVZpZXcobUN1c3RvbU5hdlZpZXcpOworICAgICAgICAgICAgICAgICAgICBtQ3VzdG9tTmF2VmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICAgICAgaWYgKG1UYWJMYXlvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVWaWV3KG1UYWJMYXlvdXQpOworICAgICAgICAgICAgICAgICAgICBtVGFiTGF5b3V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgICAgIGluaXRUaXRsZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICAgICAgbVNwaW5uZXIgPSBuZXcgU3Bpbm5lcihtQ29udGV4dCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5kcm9wRG93blNwaW5uZXJTdHlsZSk7CisgICAgICAgICAgICAgICAgbVNwaW5uZXIuc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihtTmF2SXRlbVNlbGVjdGVkTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGFkZFZpZXcobVNwaW5uZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1DdXN0b21OYXZWaWV3KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTOgorICAgICAgICAgICAgICAgIG1UYWJMYXlvdXQgPSBuZXcgTGluZWFyTGF5b3V0KGdldENvbnRleHQoKSk7CisgICAgICAgICAgICAgICAgYWRkVmlldyhtVGFiTGF5b3V0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1OYXZpZ2F0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0RHJvcGRvd25BZGFwdGVyKFNwaW5uZXJBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgbVNwaW5uZXIuc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREcm9wZG93blNlbGVjdGVkUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIG1TcGlubmVyLnNldFNlbGVjdGlvbihwb3NpdGlvbik7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREcm9wZG93blNlbGVjdGVkUG9zaXRpb24oKSB7CisgICAgICAgIHJldHVybiBtU3Bpbm5lci5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBWaWV3IGdldEN1c3RvbU5hdmlnYXRpb25WaWV3KCkgeworICAgICAgICByZXR1cm4gbUN1c3RvbU5hdlZpZXc7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0TmF2aWdhdGlvbk1vZGUoKSB7CisgICAgICAgIHJldHVybiBtTmF2aWdhdGlvbk1vZGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0RGlzcGxheU9wdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBtRGlzcGxheU9wdGlvbnM7CisgICAgfQorCisgICAgcHJpdmF0ZSBUYWJWaWV3IGNyZWF0ZVRhYlZpZXcoQWN0aW9uQmFyLlRhYiB0YWIpIHsKKyAgICAgICAgZmluYWwgVGFiVmlldyB0YWJWaWV3ID0gbmV3IFRhYlZpZXcoZ2V0Q29udGV4dCgpLCB0YWIpOworICAgICAgICB0YWJWaWV3LnNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgdGFiVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFRhYkNsaWNrTGlzdGVuZXIoKSk7CisgICAgICAgIHJldHVybiB0YWJWaWV3OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFRhYihBY3Rpb25CYXIuVGFiIHRhYikgeworICAgICAgICBmaW5hbCBib29sZWFuIGlzRmlyc3QgPSBtVGFiTGF5b3V0LmdldENoaWxkQ291bnQoKSA9PSAwOworICAgICAgICBmaW5hbCBUYWJWaWV3IHRhYlZpZXcgPSBjcmVhdGVUYWJWaWV3KHRhYik7CisgICAgICAgIG1UYWJMYXlvdXQuYWRkVmlldyh0YWJWaWV3KTsKKyAgICAgICAgaWYgKGlzRmlyc3QpIHsKKyAgICAgICAgICAgIHRhYlZpZXcuc2V0U2VsZWN0ZWQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRUYWIoQWN0aW9uQmFyLlRhYiB0YWIsIGludCBwb3NpdGlvbikgeworICAgICAgICBmaW5hbCBib29sZWFuIGlzRmlyc3QgPSBtVGFiTGF5b3V0LmdldENoaWxkQ291bnQoKSA9PSAwOworICAgICAgICBmaW5hbCBUYWJWaWV3IHRhYlZpZXcgPSBjcmVhdGVUYWJWaWV3KHRhYik7CisgICAgICAgIG1UYWJMYXlvdXQuYWRkVmlldyh0YWJWaWV3LCBwb3NpdGlvbik7CisgICAgICAgIGlmIChpc0ZpcnN0KSB7CisgICAgICAgICAgICB0YWJWaWV3LnNldFNlbGVjdGVkKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVGFiQXQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgIG1UYWJMYXlvdXQucmVtb3ZlVmlld0F0KHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtcygpIHsKKyAgICAgICAgLy8gVXNlZCBieSBjdXN0b20gbmF2IHZpZXdzIGlmIHRoZXkgZG9uJ3Qgc3VwcGx5IGxheW91dCBwYXJhbXMuIEV2ZXJ5dGhpbmcgZWxzZQorICAgICAgICAvLyBhZGRlZCB0byBhbiBBY3Rpb25CYXJWaWV3IHNob3VsZCBoYXZlIHRoZW0gYWxyZWFkeS4KKyAgICAgICAgcmV0dXJuIG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25GaW5pc2hJbmZsYXRlKCkgeworICAgICAgICBzdXBlci5vbkZpbmlzaEluZmxhdGUoKTsKKworICAgICAgICBpZiAoKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX0hJREVfSE9NRSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKG1Mb2dvICE9IG51bGwgJiYgKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX1VTRV9MT0dPKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3ID0gbmV3IEltYWdlVmlldyhnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRBZGp1c3RWaWV3Qm91bmRzKHRydWUpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRMYXlvdXRQYXJhbXMobmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRJbWFnZURyYXdhYmxlKG1Mb2dvKTsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0Q2xpY2thYmxlKHRydWUpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcihtSG9tZUNsaWNrTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGFkZFZpZXcobUxvZ29WaWV3KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JY29uVmlldyA9IG5ldyBJbWFnZVZpZXcoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0QWRqdXN0Vmlld0JvdW5kcyh0cnVlKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0TGF5b3V0UGFyYW1zKG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0SW1hZ2VEcmF3YWJsZShtSWNvbik7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldENsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0Rm9jdXNhYmxlKHRydWUpOworICAgICAgICAgICAgICAgIG1JY29uVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIobUhvbWVDbGlja0xpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1JY29uVmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG1OYXZpZ2F0aW9uTW9kZSkgeworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQ6CisgICAgICAgICAgICBpZiAobUxvZ29WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbml0VGl0bGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUOgorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSW5mbGF0aW5nIGRyb3Bkb3duIGxpc3QgbmF2aWdhdGlvbiBpc24ndCBzdXBwb3J0ZWQgeWV0ISIpOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTOgorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSW5mbGF0aW5nIHRhYiBuYXZpZ2F0aW9uIGlzbid0IHN1cHBvcnRlZCB5ZXQhIik7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgIGlmIChtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWRkVmlldyhtQ3VzdG9tTmF2Vmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgaW5pdFRpdGxlKCkgeworICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbVRpdGxlTGF5b3V0ID0gKExpbmVhckxheW91dCkgaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5hY3Rpb25fYmFyX3RpdGxlX2l0ZW0sIG51bGwpOworICAgICAgICBtVGl0bGVWaWV3ID0gKFRleHRWaWV3KSBtVGl0bGVMYXlvdXQuZmluZFZpZXdCeUlkKFIuaWQuYWN0aW9uX2Jhcl90aXRsZSk7CisgICAgICAgIG1TdWJ0aXRsZVZpZXcgPSAoVGV4dFZpZXcpIG1UaXRsZUxheW91dC5maW5kVmlld0J5SWQoUi5pZC5hY3Rpb25fYmFyX3N1YnRpdGxlKTsKKworICAgICAgICBpZiAobVRpdGxlU3R5bGVSZXMgIT0gMCkgeworICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0QXBwZWFyYW5jZShtQ29udGV4dCwgbVRpdGxlU3R5bGVSZXMpOworICAgICAgICB9CisgICAgICAgIGlmIChtVGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KG1UaXRsZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVN1YnRpdGxlU3R5bGVSZXMgIT0gMCkgeworICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0QXBwZWFyYW5jZShtQ29udGV4dCwgbVN1YnRpdGxlU3R5bGVSZXMpOworICAgICAgICB9CisgICAgICAgIGlmIChtU3VidGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0KG1TdWJ0aXRsZSk7CisgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisgICAgICAgIH0KKworICAgICAgICBhZGRWaWV3KG1UaXRsZUxheW91dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGFiU2VsZWN0ZWQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGZpbmFsIGludCB0YWJDb3VudCA9IG1UYWJMYXlvdXQuZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBtVGFiTGF5b3V0LmdldENoaWxkQXQoaSk7CisgICAgICAgICAgICBjaGlsZC5zZXRTZWxlY3RlZChpID09IHBvc2l0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHRWaWV3KEFjdGlvbkJhckNvbnRleHRWaWV3IHZpZXcpIHsKKyAgICAgICAgbUNvbnRleHRWaWV3ID0gdmlldzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBpbnQgd2lkdGhNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaWYgKHdpZHRoTW9kZSAhPSBNZWFzdXJlU3BlYy5FWEFDVExZKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiBjYW4gb25seSBiZSB1c2VkICIgKworICAgICAgICAgICAgICAgICAgICAid2l0aCBhbmRyb2lkOmxheW91dF93aWR0aD1cIm1hdGNoX3BhcmVudFwiIChvciBmaWxsX3BhcmVudCkiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW50IGhlaWdodE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaWYgKGhlaWdodE1vZGUgIT0gTWVhc3VyZVNwZWMuQVRfTU9TVCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgY2FuIG9ubHkgYmUgdXNlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpdGggYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PVwid3JhcF9jb250ZW50XCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjb250ZW50V2lkdGggPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOworCisgICAgICAgIGludCBtYXhIZWlnaHQgPSBtQ29udGVudEhlaWdodCA+IDAgPworICAgICAgICAgICAgICAgIG1Db250ZW50SGVpZ2h0IDogTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgIAorICAgICAgICBmaW5hbCBpbnQgdmVydGljYWxQYWRkaW5nID0gZ2V0UGFkZGluZ1RvcCgpICsgZ2V0UGFkZGluZ0JvdHRvbSgpOworICAgICAgICBpbnQgYXZhaWxhYmxlV2lkdGggPSBjb250ZW50V2lkdGggLSBnZXRQYWRkaW5nTGVmdCgpIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7CisgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBtYXhIZWlnaHQgLSB2ZXJ0aWNhbFBhZGRpbmc7CisgICAgICAgIGZpbmFsIGludCBjaGlsZFNwZWNIZWlnaHQgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoaGVpZ2h0LCBNZWFzdXJlU3BlYy5BVF9NT1NUKTsKKworICAgICAgICBpZiAobUxvZ29WaWV3ICE9IG51bGwgJiYgbUxvZ29WaWV3LmdldFZpc2liaWxpdHkoKSAhPSBHT05FKSB7CisgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IG1lYXN1cmVDaGlsZFZpZXcobUxvZ29WaWV3LCBhdmFpbGFibGVXaWR0aCwgY2hpbGRTcGVjSGVpZ2h0LCBtU3BhY2luZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JY29uVmlldyAhPSBudWxsICYmIG1JY29uVmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBtZWFzdXJlQ2hpbGRWaWV3KG1JY29uVmlldywgYXZhaWxhYmxlV2lkdGgsIGNoaWxkU3BlY0hlaWdodCwgbVNwYWNpbmcpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhtTWVudVZpZXcsIGF2YWlsYWJsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQsIDApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzd2l0Y2ggKG1OYXZpZ2F0aW9uTW9kZSkgeworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQ6CisgICAgICAgICAgICBpZiAobVRpdGxlTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtZWFzdXJlQ2hpbGRWaWV3KG1UaXRsZUxheW91dCwgYXZhaWxhYmxlV2lkdGgsIGNoaWxkU3BlY0hlaWdodCwgbVNwYWNpbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUOgorICAgICAgICAgICAgaWYgKG1TcGlubmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU3Bpbm5lci5tZWFzdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkFUX01PU1QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NOgorICAgICAgICAgICAgaWYgKG1DdXN0b21OYXZWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSBtQ3VzdG9tTmF2Vmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tTmF2V2lkdGhNb2RlID0gbHAud2lkdGggIT0gTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCA/CisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5FWEFDVExZIDogTWVhc3VyZVNwZWMuQVRfTU9TVDsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tTmF2V2lkdGggPSBscC53aWR0aCA+PSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGxwLndpZHRoLCBhdmFpbGFibGVXaWR0aCkgOiBhdmFpbGFibGVXaWR0aDsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhY3Rpb24gYmFyIGlzIHdyYXBwaW5nIHRvIGl0cyBjb250ZW50IGhlaWdodCwgZG9uJ3QgYWxsb3cgYSBjdXN0b20KKyAgICAgICAgICAgICAgICAvLyB2aWV3IHRvIE1BVENIX1BBUkVOVC4KKyAgICAgICAgICAgICAgICBpbnQgY3VzdG9tTmF2SGVpZ2h0TW9kZTsKKyAgICAgICAgICAgICAgICBpZiAobUNvbnRlbnRIZWlnaHQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBjdXN0b21OYXZIZWlnaHRNb2RlID0gTWVhc3VyZVNwZWMuQVRfTU9TVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjdXN0b21OYXZIZWlnaHRNb2RlID0gbHAuaGVpZ2h0ICE9IExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLkVYQUNUTFkgOiBNZWFzdXJlU3BlYy5BVF9NT1NUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tTmF2SGVpZ2h0ID0gbHAuaGVpZ2h0ID49IDAgPworICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4obHAuaGVpZ2h0LCBoZWlnaHQpIDogaGVpZ2h0OworICAgICAgICAgICAgICAgIG1DdXN0b21OYXZWaWV3Lm1lYXN1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY3VzdG9tTmF2V2lkdGgsIGN1c3RvbU5hdldpZHRoTW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY3VzdG9tTmF2SGVpZ2h0LCBjdXN0b21OYXZIZWlnaHRNb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICBpZiAobVRhYkxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRhYkxheW91dC5tZWFzdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkFUX01PU1QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Db250ZW50SGVpZ2h0IDw9IDApIHsKKyAgICAgICAgICAgIGludCBtZWFzdXJlZEhlaWdodCA9IDA7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBWaWV3IHYgPSBnZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgICAgIGludCBwYWRkZWRWaWV3SGVpZ2h0ID0gdi5nZXRNZWFzdXJlZEhlaWdodCgpICsgdmVydGljYWxQYWRkaW5nOworICAgICAgICAgICAgICAgIGlmIChwYWRkZWRWaWV3SGVpZ2h0ID4gbWVhc3VyZWRIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRIZWlnaHQgPSBwYWRkZWRWaWV3SGVpZ2h0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKGNvbnRlbnRXaWR0aCwgbWVhc3VyZWRIZWlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24oY29udGVudFdpZHRoLCBtYXhIZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Db250ZXh0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ29udGV4dFZpZXcuc2V0SGVpZ2h0KGdldE1lYXN1cmVkSGVpZ2h0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgbWVhc3VyZUNoaWxkVmlldyhWaWV3IGNoaWxkLCBpbnQgYXZhaWxhYmxlV2lkdGgsIGludCBjaGlsZFNwZWNIZWlnaHQsIGludCBzcGFjaW5nKSB7CisgICAgICAgIGNoaWxkLm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQpOworCisgICAgICAgIGF2YWlsYWJsZVdpZHRoIC09IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgYXZhaWxhYmxlV2lkdGggLT0gc3BhY2luZzsKKworICAgICAgICByZXR1cm4gYXZhaWxhYmxlV2lkdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgeworICAgICAgICBpbnQgeCA9IGdldFBhZGRpbmdMZWZ0KCk7CisgICAgICAgIGZpbmFsIGludCB5ID0gZ2V0UGFkZGluZ1RvcCgpOworICAgICAgICBmaW5hbCBpbnQgY29udGVudEhlaWdodCA9IGIgLSB0IC0gZ2V0UGFkZGluZ1RvcCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOworCisgICAgICAgIGlmIChtTG9nb1ZpZXcgIT0gbnVsbCAmJiBtTG9nb1ZpZXcuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKKyAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtTG9nb1ZpZXcsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgbVNwYWNpbmc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JY29uVmlldyAhPSBudWxsICYmIG1JY29uVmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1JY29uVmlldywgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3dpdGNoIChtTmF2aWdhdGlvbk1vZGUpIHsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgaWYgKG1UaXRsZUxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1UaXRsZUxheW91dCwgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgIGlmIChtU3Bpbm5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1TcGlubmVyLCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIG1TcGFjaW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT006CisgICAgICAgICAgICBpZiAobUN1c3RvbU5hdlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtQ3VzdG9tTmF2VmlldywgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUzoKKyAgICAgICAgICAgIGlmIChtVGFiTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobVRhYkxheW91dCwgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHggPSByIC0gbCAtIGdldFBhZGRpbmdSaWdodCgpOworCisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgeCAtPSBwb3NpdGlvbkNoaWxkSW52ZXJzZShtTWVudVZpZXcsIHggKyBtQWN0aW9uU3BhY2luZywgeSwgY29udGVudEhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgLSBtQWN0aW9uU3BhY2luZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IHBvc2l0aW9uQ2hpbGQoVmlldyBjaGlsZCwgaW50IHgsIGludCB5LCBpbnQgY29udGVudEhlaWdodCkgeworICAgICAgICBpbnQgY2hpbGRXaWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgaW50IGNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgaW50IGNoaWxkVG9wID0geSArIChjb250ZW50SGVpZ2h0IC0gY2hpbGRIZWlnaHQpIC8gMjsKKworICAgICAgICBjaGlsZC5sYXlvdXQoeCwgY2hpbGRUb3AsIHggKyBjaGlsZFdpZHRoLCBjaGlsZFRvcCArIGNoaWxkSGVpZ2h0KTsKKworICAgICAgICByZXR1cm4gY2hpbGRXaWR0aDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb25DaGlsZEludmVyc2UoVmlldyBjaGlsZCwgaW50IHgsIGludCB5LCBpbnQgY29udGVudEhlaWdodCkgeworICAgICAgICBpbnQgY2hpbGRXaWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgaW50IGNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgaW50IGNoaWxkVG9wID0geSArIChjb250ZW50SGVpZ2h0IC0gY2hpbGRIZWlnaHQpIC8gMjsKKworICAgICAgICBjaGlsZC5sYXlvdXQoeCAtIGNoaWxkV2lkdGgsIGNoaWxkVG9wLCB4LCBjaGlsZFRvcCArIGNoaWxkSGVpZ2h0KTsKKworICAgICAgICByZXR1cm4gY2hpbGRXaWR0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUYWJWaWV3IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKKyAgICAgICAgcHJpdmF0ZSBBY3Rpb25CYXIuVGFiIG1UYWI7CisKKyAgICAgICAgcHVibGljIFRhYlZpZXcoQ29udGV4dCBjb250ZXh0LCBBY3Rpb25CYXIuVGFiIHRhYikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgICAgICBtVGFiID0gdGFiOworCisgICAgICAgICAgICAvLyBUT0RPIFN0eWxlIHRhYnMgYmFzZWQgb24gdGhlIHRoZW1lCisKKyAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGljb24gPSB0YWIuZ2V0SWNvbigpOworICAgICAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlIHRleHQgPSB0YWIuZ2V0VGV4dCgpOworCisgICAgICAgICAgICBpZiAoaWNvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSW1hZ2VWaWV3IGljb25WaWV3ID0gbmV3IEltYWdlVmlldyhjb250ZXh0KTsKKyAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRJbWFnZURyYXdhYmxlKGljb24pOworICAgICAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOworICAgICAgICAgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTDsKKyAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRMYXlvdXRQYXJhbXMobHApOworICAgICAgICAgICAgICAgIGFkZFZpZXcoaWNvblZpZXcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSBuZXcgVGV4dFZpZXcoY29udGV4dCk7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dCh0ZXh0KTsKKyAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRTaW5nbGVMaW5lKCk7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0RWxsaXBzaXplKFRydW5jYXRlQXQuRU5EKTsKKyAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICAgICAgICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5DRU5URVJfVkVSVElDQUw7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0TGF5b3V0UGFyYW1zKGxwKTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KHRleHRWaWV3KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0TGF5b3V0UGFyYW1zKG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgMSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFjdGlvbkJhci5UYWIgZ2V0VGFiKCkgeworICAgICAgICAgICAgcmV0dXJuIG1UYWI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFRhYkNsaWNrTGlzdGVuZXIgaW1wbGVtZW50cyBPbkNsaWNrTGlzdGVuZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdmlldykgeworICAgICAgICAgICAgVGFiVmlldyB0YWJWaWV3ID0gKFRhYlZpZXcpIHZpZXc7CisgICAgICAgICAgICB0YWJWaWV3LmdldFRhYigpLnNlbGVjdCgpOworICAgICAgICAgICAgZmluYWwgaW50IHRhYkNvdW50ID0gbVRhYkxheW91dC5nZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbVRhYkxheW91dC5nZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgICAgIGNoaWxkLnNldFNlbGVjdGVkKGNoaWxkID09IHZpZXcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9DYXJvdXNlbFJTLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0Nhcm91c2VsUlMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTg5NTMxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9DYXJvdXNlbFJTLmphdmEKQEAgLTAsMCArMSwzNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0LlJTTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1SYXN0ZXIuQ3VsbE1vZGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC4qOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlLkxJTkVBUjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuU2FtcGxlci5WYWx1ZS5XUkFQOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlLkNMQU1QOworCitwdWJsaWMgY2xhc3MgQ2Fyb3VzZWxSUyAgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1ZJU0lCTEVfU0xPVFMgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NBUkRfQ09VTlQgPSAxOworICAgIAorICAgIC8vIENsaWVudCBtZXNzYWdlcyAqKiogVEhJUyBMSVNUIE1VU1QgTUFUQ0ggVEhPU0UgSU4gY2Fyb3VzZWwucnMgKioqCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0NBUkRfU0VMRUNURUQgPSAxMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JFUVVFU1RfVEVYVFVSRSA9IDIwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTURfSU5WQUxJREFURV9URVhUVVJFID0gMjEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNRF9SRVFVRVNUX0dFT01FVFJZID0gMzAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNRF9JTlZBTElEQVRFX0dFT01FVFJZID0gMzEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNRF9BTklNQVRJT05fU1RBUlRFRCA9IDQwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTURfQU5JTUFUSU9OX0ZJTklTSEVEID0gNTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENNRF9QSU5HID0gNjAwOyAvLyBmb3IgZGVidWdnaW5nCisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDYXJvdXNlbFJTIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TTE9UX0NPVU5UID0gMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBNSVBNQVAgPSBmYWxzZTsKKyAgICAKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgU2NyaXB0Q19DYXJvdXNlbCBtU2NyaXB0OworICAgIHByaXZhdGUgU2NyaXB0RmllbGRfQ2FyZCBtQ2FyZHM7CisgICAgcHJpdmF0ZSBTYW1wbGVyIG1TYW1wbGVyOworICAgIHByaXZhdGUgUHJvZ3JhbVJhc3RlciBtUHJvZ3JhbVJhc3RlcjsKKyAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlOworICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1GcmFnbWVudFByb2dyYW07CisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1WZXJ0ZXhQcm9ncmFtOworICAgIHByaXZhdGUgUHJvZ3JhbVJhc3RlciBtUmFzdGVyUHJvZ3JhbTsKKyAgICBwcml2YXRlIENhcm91c2VsQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgIHByaXZhdGUgZmxvYXRbXSBtRXllUG9pbnQgPSBuZXcgZmxvYXRbM107CisgICAgcHJpdmF0ZSBmbG9hdFtdIG1BdFBvaW50ID0gbmV3IGZsb2F0WzNdOworICAgIHByaXZhdGUgZmxvYXRbXSBtVXAgPSBuZXcgZmxvYXRbM107CisgICAgCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQ2Fyb3VzZWxDYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIGNhcmQgaXMgc2VsZWN0ZWQKKyAgICAgICAgICogQHBhcmFtIG4gdGhlIGlkIG9mIHRoZSBjYXJkCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uQ2FyZFNlbGVjdGVkKGludCBuKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0ZXh0dXJlIGlzIG5lZWRlZCBmb3IgY2FyZCBuLiAgVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGdpdmVuIGNhcmQgYmVjb21lcworICAgICAgICAgKiB2aXNpYmxlLgorICAgICAgICAgKiBAcGFyYW0gbiB0aGUgaWQgb2YgdGhlIGNhcmQKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25SZXF1ZXN0VGV4dHVyZShpbnQgbik7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSB0ZXh0dXJlIGlzIG5vIGxvbmdlciBuZWVkZWQgZm9yIGNhcmQgbi4gIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBjYXJkCisgICAgICAgICAqIGdvZXMgb3V0IG9mIHZpZXcuCisgICAgICAgICAqIEBwYXJhbSBuIHRoZSBpZCBvZiB0aGUgY2FyZAorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvbkludmFsaWRhdGVUZXh0dXJlKGludCBuKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBnZW9tZXRyeSBpcyBuZWVkZWQgZm9yIGNhcmQgbi4KKyAgICAgICAgICogQHBhcmFtIG4gdGhlIGlkIG9mIHRoZSBjYXJkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvblJlcXVlc3RHZW9tZXRyeShpbnQgbik7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gZ2VvbWV0cnkgaXMgbm8gbG9uZ2VyIG5lZWRlZCBmb3IgY2FyZCBuLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgY2FyZCBnb2VzIAorICAgICAgICAgKiBvdXQgb2Ygdmlldy4KKyAgICAgICAgICogQHBhcmFtIG4gdGhlIGlkIG9mIHRoZSBjYXJkCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uSW52YWxpZGF0ZUdlb21ldHJ5KGludCBuKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBjYXJkIGFuaW1hdGlvbiAoZS5nLiBhIGZsaW5nKSBoYXMgc3RhcnRlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25BbmltYXRpb25TdGFydGVkKCk7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gY2FyZCBhbmltYXRpb24gaGFzIHN0b3BwZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uQW5pbWF0aW9uRmluaXNoZWQoKTsKKyAgICB9OworICAgIAorICAgIHByaXZhdGUgUlNNZXNzYWdlIG1Sc01lc3NhZ2UgPSBuZXcgUlNNZXNzYWdlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBpZiAobUNhbGxiYWNrID09IG51bGwpIHJldHVybjsKKyAgICAgICAgICAgIHN3aXRjaCAobUlEKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfQ0FSRF9TRUxFQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ2FyZFNlbGVjdGVkKG1EYXRhWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFUVVFU1RfVEVYVFVSRToKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uUmVxdWVzdFRleHR1cmUobURhdGFbMF0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9JTlZBTElEQVRFX1RFWFRVUkU6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vbkludmFsaWRhdGVUZXh0dXJlKG1EYXRhWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFUVVFU1RfR0VPTUVUUlk6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblJlcXVlc3RHZW9tZXRyeShtRGF0YVswXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9JTlZBTElEQVRFX0dFT01FVFJZOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25JbnZhbGlkYXRlR2VvbWV0cnkobURhdGFbMF0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSBDTURfQU5JTUFUSU9OX1NUQVJURUQ6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vbkFuaW1hdGlvblN0YXJ0ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0FOSU1BVElPTl9GSU5JU0hFRDoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uQW5pbWF0aW9uRmluaXNoZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1BJTkc6CisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIlBJTkcuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVua25vd24gUlNNZXNzYWdlOiAiICsgbUlEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisgICAgCisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcykgeworICAgICAgICBtUlMgPSByczsKKyAgICAgICAgbVJlcyA9IHJlczsKKworICAgICAgICAvLyBjcmVhdGUgdGhlIHNjcmlwdCBvYmplY3QKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX0Nhcm91c2VsKG1SUywgbVJlcywgUi5yYXcuY2Fyb3VzZWwsIHRydWUpOworICAgICAgICBtUlMubU1lc3NhZ2VDYWxsYmFjayA9IG1Sc01lc3NhZ2U7CisKKyAgICAgICAgaW5pdFByb2dyYW1TdG9yZSgpOworICAgICAgICBpbml0RnJhZ21lbnRQcm9ncmFtKCk7CisgICAgICAgIGluaXRSYXN0ZXJQcm9ncmFtKCk7CisgICAgICAgIGluaXRWZXJ0ZXhQcm9ncmFtKCk7CisgICAgICAgIAorICAgICAgICBzZXRTbG90Q291bnQoREVGQVVMVF9TTE9UX0NPVU5UKTsKKyAgICAgICAgc2V0VmlzaWJsZVNsb3RzKERFRkFVTFRfVklTSUJMRV9TTE9UUyk7CisgICAgICAgIGNyZWF0ZUNhcmRzKERFRkFVTFRfQ0FSRF9DT1VOVCk7CisgICAgICAgIAorICAgICAgICBzZXRTdGFydEFuZ2xlKDAuMGYpOworICAgICAgICBzZXRSYWRpdXMoMS4wZik7CisgICAgICAgIAorICAgICAgICAvLyB1cGRhdGUgdGhlIGNhbWVyYQorICAgICAgICBib29sZWFuIHBjYW0gPSB0cnVlOworICAgICAgICBpZiAocGNhbSkgeworICAgICAgICAgICAgZmxvYXQgZXllW10gPSB7IDIwLjY4MjlmLCAyLjc3MDgxZiwgMTYuNzMxNGYgfTsKKyAgICAgICAgICAgIGZsb2F0IGF0W10gPSB7IDE0LjcyNTVmLCAtMy40MDAwMWYsIC0xLjMwMTg0ZiB9OworICAgICAgICAgICAgZmxvYXQgdXBbXSA9IHsgMC4wZiwgMS4wZiwgMC4wZiB9OworICAgICAgICAgICAgc2V0TG9va0F0KGV5ZSwgYXQsIHVwKTsKKyAgICAgICAgICAgIHNldFJhZGl1cygyMC4wZik7CisgICAgICAgICAgICAvLyBGb3Y6IDI1CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2NyaXB0Lmludm9rZV9sb29rQXQoMi41ZiwgMi4wZiwgMi41ZiwgMC4wZiwgLTAuNzVmLCAwLjBmLCAgMC4wZiwgMS4wZiwgMC4wZik7CisgICAgICAgICAgICBtU2NyaXB0LnNldF9jYXJkUm90YXRpb24oMC4wZik7CisgICAgICAgICAgICBzZXRSYWRpdXMoMS41Zik7CisgICAgICAgIH0KKworICAgICAgICByZXN1bWVSZW5kZXJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb29rQXQoZmxvYXRbXSBleWUsIGZsb2F0W10gYXQsIGZsb2F0W10gdXApIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIG1FeWVQb2ludFtpXSA9IGV5ZVtpXTsKKyAgICAgICAgICAgIG1BdFBvaW50W2ldID0gYXRbaV07CisgICAgICAgICAgICBtVXBbaV0gPSB1cFtpXTsKKyAgICAgICAgfQorICAgICAgICBtU2NyaXB0Lmludm9rZV9sb29rQXQoZXllWzBdLCBleWVbMV0sIGV5ZVsyXSwgYXRbMF0sIGF0WzFdLCBhdFsyXSwgdXBbMF0sIHVwWzFdLCB1cFsyXSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmFkaXVzKGZsb2F0IHJhZGl1cykgeworICAgICAgICBtU2NyaXB0LnNldF9yYWRpdXMocmFkaXVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFZlcnRleFByb2dyYW0oKSB7CisgICAgICAgIFByb2dyYW1WZXJ0ZXguQnVpbGRlciBwdmIgPSBuZXcgUHJvZ3JhbVZlcnRleC5CdWlsZGVyKG1SUywgbnVsbCwgbnVsbCk7CisgICAgICAgIG1WZXJ0ZXhQcm9ncmFtID0gcHZiLmNyZWF0ZSgpOworICAgICAgICBQcm9ncmFtVmVydGV4Lk1hdHJpeEFsbG9jYXRpb24gcHZhID0gbmV3IFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbihtUlMpOworICAgICAgICBtVmVydGV4UHJvZ3JhbS5iaW5kQWxsb2NhdGlvbihwdmEpOworICAgICAgICBwdmEuc2V0dXBQcm9qZWN0aW9uTm9ybWFsaXplZCgxLCAxKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfdmVydGV4UHJvZ3JhbShtVmVydGV4UHJvZ3JhbSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRSYXN0ZXJQcm9ncmFtKCkgeworICAgICAgICBQcm9ncmFtUmFzdGVyLkJ1aWxkZXIgcHJvZ3JhbVJhc3RlckJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVJhc3Rlci5CdWlsZGVyKG1SUyk7CisgICAgICAgIG1SYXN0ZXJQcm9ncmFtID0gcHJvZ3JhbVJhc3RlckJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIC8vbVJhc3RlclByb2dyYW0uc2V0Q3VsbE1vZGUoQ3VsbE1vZGUuTk9ORSk7CisgICAgICAgIG1TY3JpcHQuc2V0X3Jhc3RlclByb2dyYW0obVJhc3RlclByb2dyYW0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0RnJhZ21lbnRQcm9ncmFtKCkgeworICAgICAgICBTYW1wbGVyLkJ1aWxkZXIgc2FtcGxlQnVpbGRlciA9IG5ldyBTYW1wbGVyLkJ1aWxkZXIobVJTKTsKKyAgICAgICAgc2FtcGxlQnVpbGRlci5zZXRNaW4oVmFsdWUuTElORUFSX01JUF9MSU5FQVIpOworICAgICAgICBzYW1wbGVCdWlsZGVyLnNldE1hZyhMSU5FQVIpOworICAgICAgICBzYW1wbGVCdWlsZGVyLnNldFdyYXBTKENMQU1QKTsKKyAgICAgICAgc2FtcGxlQnVpbGRlci5zZXRXcmFwVChDTEFNUCk7CisgICAgICAgIG1TYW1wbGVyID0gc2FtcGxlQnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIgZnJhZ21lbnRCdWlsZGVyID0gbmV3IFByb2dyYW1GcmFnbWVudC5CdWlsZGVyKG1SUyk7CisgICAgICAgIGZyYWdtZW50QnVpbGRlci5zZXRUZXh0dXJlKFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkVudk1vZGUuREVDQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlci5Gb3JtYXQuUkdCQSwgMCk7CisgICAgICAgIG1GcmFnbWVudFByb2dyYW0gPSBmcmFnbWVudEJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIG1GcmFnbWVudFByb2dyYW0uYmluZFNhbXBsZXIobVNhbXBsZXIsIDApOworICAgICAgICBtU2NyaXB0LnNldF9mcmFnbWVudFByb2dyYW0obUZyYWdtZW50UHJvZ3JhbSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9ncmFtU3RvcmUoKSB7CisgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIHByb2dyYW1TdG9yZUJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIobVJTLCBudWxsLCBudWxsKTsKKyAgICAgICAgcHJvZ3JhbVN0b3JlQnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5MRVNTKTsKKyAgICAgICAgcHJvZ3JhbVN0b3JlQnVpbGRlci5zZXRCbGVuZEZ1bmMoUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYy5TUkNfQUxQSEEsIAorICAgICAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMuT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgICAgIHByb2dyYW1TdG9yZUJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgcHJvZ3JhbVN0b3JlQnVpbGRlci5zZXREZXB0aE1hc2sodHJ1ZSk7CisgICAgICAgIG1Qcm9ncmFtU3RvcmUgPSBwcm9ncmFtU3RvcmVCdWlsZGVyLmNyZWF0ZSgpOworICAgICAgICBtU2NyaXB0LnNldF9wcm9ncmFtU3RvcmUobVByb2dyYW1TdG9yZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNhcmRzKGludCBjb3VudCkKKyAgICB7CisgICAgICAgIG1DYXJkcyA9IGNvdW50ID4gMCA/IG5ldyBTY3JpcHRGaWVsZF9DYXJkKG1SUywgY291bnQpIDogbnVsbDsKKyAgICAgICAgbVNjcmlwdC5iaW5kX2NhcmRzKG1DYXJkcyk7CisgICAgICAgIG1TY3JpcHQuaW52b2tlX2NyZWF0ZUNhcmRzKGNvdW50KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZVNsb3RzKGludCBjb3VudCkKKyAgICB7CisgICAgICAgIG1TY3JpcHQuc2V0X3Zpc2libGVTbG90Q291bnQoY291bnQpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0Qml0bWFwKEJpdG1hcCBiaXRtYXApCisgICAgeworICAgICAgICBtU2NyaXB0LnNldF9kZWZhdWx0VGV4dHVyZShhbGxvY2F0aW9uRnJvbUJpdG1hcChiaXRtYXAsIE1JUE1BUCkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2FkaW5nQml0bWFwKEJpdG1hcCBiaXRtYXApCisgICAgeworICAgICAgICBtU2NyaXB0LnNldF9sb2FkaW5nVGV4dHVyZShhbGxvY2F0aW9uRnJvbUJpdG1hcChiaXRtYXAsIE1JUE1BUCkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0R2VvbWV0cnkoTWVzaCBtZXNoKQorICAgIHsKKyAgICAgICAgbVNjcmlwdC5zZXRfZGVmYXVsdEdlb21ldHJ5KG1lc2gpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2FkaW5nR2VvbWV0cnkoTWVzaCBtZXNoKQorICAgIHsKKyAgICAgICAgbVNjcmlwdC5zZXRfbG9hZGluZ0dlb21ldHJ5KG1lc2gpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydEFuZ2xlKGZsb2F0IHRoZXRhKQorICAgIHsKKyAgICAgICAgbVNjcmlwdC5zZXRfc3RhcnRBbmdsZSh0aGV0YSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENhbGxiYWNrKENhcm91c2VsQ2FsbGJhY2sgY2FsbGJhY2spCisgICAgeworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIGFsbG9jYXRpb25Gcm9tQml0bWFwKEJpdG1hcCBiaXRtYXAsIGJvb2xlYW4gbWlwbWFwKQorICAgIHsKKyAgICAgICAgaWYgKGJpdG1hcCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgQWxsb2NhdGlvbiBhbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwKG1SUywgYml0bWFwLCBSR0JfNTY1KG1SUyksIG1pcG1hcCk7CisgICAgICAgIGFsbG9jYXRpb24udXBsb2FkVG9UZXh0dXJlKDApOworICAgICAgICByZXR1cm4gYWxsb2NhdGlvbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0VGV4dHVyZShpbnQgbiwgQml0bWFwIGJpdG1hcCkKKyAgICB7CisgICAgICAgIFNjcmlwdEZpZWxkX0NhcmQuSXRlbSBpdGVtID0gbUNhcmRzLmdldChuKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAic2V0VGV4dHVyZSgpOiBubyBpdGVtIGF0IGluZGV4ICIgKyBuKTsKKyAgICAgICAgICAgIGl0ZW0gPSBuZXcgU2NyaXB0RmllbGRfQ2FyZC5JdGVtKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJpdG1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJjcmVhdGluZyBuZXcgYml0bWFwIik7CisgICAgICAgICAgICBpdGVtLnRleHR1cmUgPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXAobVJTLCBiaXRtYXAsIFJHQl81NjUobVJTKSwgTUlQTUFQKTsKKyAgICAgICAgICAgIExvZy52KFRBRywgInVwbG9hZFRvVGV4dHVyZSgiICsgbiArICIpIik7CisgICAgICAgICAgICBpdGVtLnRleHR1cmUudXBsb2FkVG9UZXh0dXJlKDApOworICAgICAgICAgICAgTG9nLnYoVEFHLCAiZG9uZS4uLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGl0ZW0udGV4dHVyZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAidW5sb2FkaW5nIHRleHR1cmUgIiArIG4pOworICAgICAgICAgICAgICAgIC8vIERvbid0IHdhaXQgZm9yIEdDIHRvIGZyZWUgbmF0aXZlIG1lbW9yeS4KKyAgICAgICAgICAgICAgICAvLyBPbmx5IHdvcmtzIGlmIHRleHR1cmVzIGFyZSBub3Qgc2hhcmVkLgorICAgICAgICAgICAgICAgIGl0ZW0udGV4dHVyZS5kZXN0cm95KCk7IAorICAgICAgICAgICAgICAgIGl0ZW0udGV4dHVyZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUNhcmRzLnNldChpdGVtLCBuLCBmYWxzZSk7IC8vIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIHJlZmVyZW5jZSBjb3VudGluZy4KKyAgICAgICAgbVNjcmlwdC5pbnZva2Vfc2V0VGV4dHVyZShuLCBpdGVtLnRleHR1cmUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRHZW9tZXRyeShpbnQgbiwgTWVzaCBnZW9tZXRyeSkKKyAgICB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbWlwbWFwID0gZmFsc2U7CisgICAgICAgIFNjcmlwdEZpZWxkX0NhcmQuSXRlbSBpdGVtID0gbUNhcmRzLmdldChuKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAic2V0R2VvbWV0cnkoKTogbm8gaXRlbSBhdCBpbmRleCAiICsgbik7CisgICAgICAgICAgICBpdGVtID0gbmV3IFNjcmlwdEZpZWxkX0NhcmQuSXRlbSgpOworICAgICAgICB9CisgICAgICAgIGlmIChnZW9tZXRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICBpdGVtLmdlb21ldHJ5ID0gZ2VvbWV0cnk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJ1bmxvYWRpbmcgZ2VvbWV0cnkgIiArIG4pOworICAgICAgICAgICAgaWYgKGl0ZW0uZ2VvbWV0cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGl0ZW0uZ2VvbWV0cnkuZGVzdHJveSgpOyAKKyAgICAgICAgICAgICAgICBpdGVtLmdlb21ldHJ5ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQ2FyZHMuc2V0KGl0ZW0sIG4sIGZhbHNlKTsKKyAgICAgICAgbVNjcmlwdC5pbnZva2Vfc2V0R2VvbWV0cnkobiwgaXRlbS5nZW9tZXRyeSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcGF1c2VSZW5kZXJpbmcoKSB7CisgICAgICAgIC8vIFVzZWQgdG8gdXBkYXRlIG11bHRpcGxlIHN0YXRlcyBhdCBvbmNlIHcvbyByZWRyYXdpbmcgZm9yIGVhY2guCisgICAgICAgIG1SUy5jb250ZXh0QmluZFJvb3RTY3JpcHQobnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHJlc3VtZVJlbmRlcmluZygpIHsKKyAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZG9Nb3Rpb24oZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBtU2NyaXB0Lmludm9rZV9kb01vdGlvbih4LHkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkb1NlbGVjdGlvbihmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIG1TY3JpcHQuaW52b2tlX2RvU2VsZWN0aW9uKHgsIHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvU3RhcnQoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBtU2NyaXB0Lmludm9rZV9kb1N0YXJ0KHgsIHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvU3RvcChmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIG1TY3JpcHQuaW52b2tlX2RvU3RvcCh4LCB5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTbG90Q291bnQoaW50IG4pIHsKKyAgICAgICAgbVNjcmlwdC5zZXRfc2xvdENvdW50KG4pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQ2Fyb3VzZWxWaWV3LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0Nhcm91c2VsVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNzgwNWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0Nhcm91c2VsVmlldy5qYXZhCkBAIC0wLDAgKzEsMjY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5DYXJvdXNlbFJTLkNhcm91c2VsQ2FsbGJhY2s7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5GaWxlQTNEOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lk1lc2g7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworCitwdWJsaWMgY2xhc3MgQ2Fyb3VzZWxWaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBVU0VfREVQVEhfQlVGRkVSID0gdHJ1ZTsKKyAgICBwcml2YXRlIGZpbmFsIGludCBERUZBVUxUX1NMT1RfQ09VTlQgPSAxMDsKKyAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBERUZBVUxUX0JJVE1BUCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoMSwgMSwgQ29uZmlnLlJHQl81NjUpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ2Fyb3VzZWxWaWV3IjsKKyAgICBwcml2YXRlIENhcm91c2VsUlMgbVJlbmRlclNjcmlwdDsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1UcmFja2luZzsKKyAgICBwcml2YXRlIEJpdG1hcCBtRGVmYXVsdEJpdG1hcDsKKyAgICBwcml2YXRlIEJpdG1hcCBtTG9hZGluZ0JpdG1hcDsKKyAgICBwcml2YXRlIE1lc2ggbURlZmF1bHRHZW9tZXRyeTsKKyAgICBwcml2YXRlIE1lc2ggbUxvYWRpbmdHZW9tZXRyeTsKKyAgICBwcml2YXRlIGludCBtQ2FyZENvdW50ID0gMDsKKyAgICBwcml2YXRlIGludCBtVmlzaWJsZVNsb3RzID0gMDsKKyAgICBwcml2YXRlIGZsb2F0IG1TdGFydEFuZ2xlOworICAgIHByaXZhdGUgaW50IG1TbG90Q291bnQgPSBERUZBVUxUX1NMT1RfQ09VTlQ7CisKKyAgICBwdWJsaWMgQ2Fyb3VzZWxWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHVzZWQgd2hlbiB0aGlzIHdpZGdldCBpcyBjcmVhdGVkIGZyb20gYSBsYXlvdXQgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2Fyb3VzZWxWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBib29sZWFuIHVzZURlcHRoQnVmZmVyID0gdHJ1ZTsKKyAgICAgICAgbVJTID0gY3JlYXRlUmVuZGVyU2NyaXB0KFVTRV9ERVBUSF9CVUZGRVIpOworICAgICAgICBtUmVuZGVyU2NyaXB0ID0gbmV3IENhcm91c2VsUlMoKTsKKyAgICAgICAgbVJlbmRlclNjcmlwdC5pbml0KG1SUywgZ2V0UmVzb3VyY2VzKCkpOworICAgICAgICAvLyBUT0RPOiBhZGQgcGFyYW1ldGVycyB0byBsYXlvdXQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgLy9tUlMuY29udGV4dFNldFN1cmZhY2UodywgaCwgaG9sZGVyLmdldFN1cmZhY2UoKSk7CisgICAgICAgIG1SZW5kZXJTY3JpcHQuaW5pdChtUlMsIGdldFJlc291cmNlcygpKTsKKyAgICAgICAgc2V0U2xvdENvdW50KG1TbG90Q291bnQpOworICAgICAgICBjcmVhdGVDYXJkcyhtQ2FyZENvdW50KTsKKyAgICAgICAgc2V0VmlzaWJsZVNsb3RzKG1WaXNpYmxlU2xvdHMpOworICAgICAgICBzZXRDYWxsYmFjayhtQ2Fyb3VzZWxDYWxsYmFjayk7CisgICAgICAgIHNldERlZmF1bHRCaXRtYXAobURlZmF1bHRCaXRtYXApOworICAgICAgICBzZXRMb2FkaW5nQml0bWFwKG1Mb2FkaW5nQml0bWFwKTsKKyAgICAgICAgc2V0RGVmYXVsdEdlb21ldHJ5KG1EZWZhdWx0R2VvbWV0cnkpOworICAgICAgICBzZXRMb2FkaW5nR2VvbWV0cnkobUxvYWRpbmdHZW9tZXRyeSk7CisgICAgICAgIHNldFN0YXJ0QW5nbGUobVN0YXJ0QW5nbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWRzIGdlb21ldHJ5IGZyb20gYSByZXNvdXJjZSBpZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVzSWQKKyAgICAgKiBAcmV0dXJuIHRoZSBsb2FkZWQgbWVzaCBvciBudWxsIGlmIGl0IGNhbm5vdCBiZSBsb2FkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzaCBsb2FkR2VvbWV0cnkoaW50IHJlc0lkKSB7CisgICAgICAgIFJlc291cmNlcyByZXMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgRmlsZUEzRCBtb2RlbCA9IEZpbGVBM0QuY3JlYXRlRnJvbVJlc291cmNlKG1SUywgcmVzLCByZXNJZCk7CisgICAgICAgIEZpbGVBM0QuSW5kZXhFbnRyeSBlbnRyeSA9IG1vZGVsLmdldEluZGV4RW50cnkoMCk7CisgICAgICAgIGlmKGVudHJ5ID09IG51bGwgfHwgZW50cnkuZ2V0Q2xhc3NJRCgpICE9IEZpbGVBM0QuQ2xhc3NJRC5NRVNIKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKE1lc2gpIGVudHJ5LmdldE9iamVjdCgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBMb2FkIEEzRCBmaWxlIGZyb20gcmVzb3VyY2UuICBJZiByZXNJZCA9PSAwLCB3aWxsIGNsZWFyIGdlb21ldHJ5IGZvciB0aGlzIGl0ZW0uCisgICAgICogQHBhcmFtIG4KKyAgICAgKiBAcGFyYW0gcmVzSWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRHZW9tZXRyeUZvckl0ZW0oaW50IG4sIE1lc2ggbWVzaCkgeworICAgICAgICBtUmVuZGVyU2NyaXB0LnNldEdlb21ldHJ5KG4sIG1lc2gpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRTbG90Q291bnQoaW50IG4pIHsKKyAgICAgICAgbVNsb3RDb3VudCA9IG47CisgICAgICAgIGlmIChtUmVuZGVyU2NyaXB0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SZW5kZXJTY3JpcHQuc2V0U2xvdENvdW50KG4pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZVNsb3RzKGludCBuKSB7CisgICAgICAgIG1WaXNpYmxlU2xvdHMgPSBuOworICAgICAgICBpZiAobVJlbmRlclNjcmlwdCAhPSBudWxsKSB7CisgICAgICAgICAgICBtUmVuZGVyU2NyaXB0LnNldFZpc2libGVTbG90cyhuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNhcmRzKGludCBuKSB7CisgICAgICAgIG1DYXJkQ291bnQgPSBuOworICAgICAgICBpZiAobVJlbmRlclNjcmlwdCAhPSBudWxsKSB7CisgICAgICAgICAgICBtUmVuZGVyU2NyaXB0LmNyZWF0ZUNhcmRzKG4pOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFRleHR1cmVGb3JJdGVtKGludCBuLCBCaXRtYXAgYml0bWFwKSB7CisgICAgICAgIGlmIChtUmVuZGVyU2NyaXB0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgInNldFRleHR1cmVGb3JJdGVtKCIgKyBuICsgIikiKTsKKyAgICAgICAgICAgIG1SZW5kZXJTY3JpcHQuc2V0VGV4dHVyZShuLCBiaXRtYXApOyAKKyAgICAgICAgICAgIExvZy52KFRBRywgImRvbmUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRCaXRtYXAoQml0bWFwIGJpdG1hcCkgeworICAgICAgICBtRGVmYXVsdEJpdG1hcCA9IGJpdG1hcDsgCisgICAgICAgIGlmIChtUmVuZGVyU2NyaXB0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SZW5kZXJTY3JpcHQuc2V0RGVmYXVsdEJpdG1hcChiaXRtYXApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldExvYWRpbmdCaXRtYXAoQml0bWFwIGJpdG1hcCkgeworICAgICAgICBtTG9hZGluZ0JpdG1hcCA9IGJpdG1hcDsKKyAgICAgICAgaWYgKG1SZW5kZXJTY3JpcHQgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJlbmRlclNjcmlwdC5zZXRMb2FkaW5nQml0bWFwKGJpdG1hcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdEdlb21ldHJ5KE1lc2ggbWVzaCkgeworICAgICAgICBtRGVmYXVsdEdlb21ldHJ5ID0gbWVzaDsKKyAgICAgICAgaWYgKG1SZW5kZXJTY3JpcHQgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJlbmRlclNjcmlwdC5zZXREZWZhdWx0R2VvbWV0cnkobWVzaCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0TG9hZGluZ0dlb21ldHJ5KE1lc2ggbWVzaCkgeworICAgICAgICBtTG9hZGluZ0dlb21ldHJ5ID0gbWVzaDsKKyAgICAgICAgaWYgKG1SZW5kZXJTY3JpcHQgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJlbmRlclNjcmlwdC5zZXRMb2FkaW5nR2VvbWV0cnkobWVzaCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soQ2Fyb3VzZWxDYWxsYmFjayBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIG1DYXJvdXNlbENhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgIGlmIChtUmVuZGVyU2NyaXB0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SZW5kZXJTY3JpcHQuc2V0Q2FsbGJhY2soY2FsbGJhY2spOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhcnRBbmdsZShmbG9hdCBhbmdsZSkKKyAgICB7CisgICAgICAgIG1TdGFydEFuZ2xlID0gYW5nbGU7CisgICAgICAgIGlmIChtUmVuZGVyU2NyaXB0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SZW5kZXJTY3JpcHQuc2V0U3RhcnRBbmdsZShhbmdsZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIHN1cGVyLm9uRGV0YWNoZWRGcm9tV2luZG93KCk7CisgICAgICAgIGlmKG1SUyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBudWxsOworICAgICAgICAgICAgZGVzdHJveVJlbmRlclNjcmlwdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgeworICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKKyAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHQoVVNFX0RFUFRIX0JVRkZFUik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBldmVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgZmluYWwgZmxvYXQgeCA9IGV2ZW50LmdldFgoKTsKKyAgICAgICAgZmluYWwgZmxvYXQgeSA9IGV2ZW50LmdldFkoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChtUmVuZGVyU2NyaXB0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046CisgICAgICAgICAgICAgICAgbVRyYWNraW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtUmVuZGVyU2NyaXB0LmRvU3RhcnQoeCwgeSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOgorICAgICAgICAgICAgICAgIGlmIChtVHJhY2tpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlbmRlclNjcmlwdC5kb01vdGlvbih4LCB5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKKyAgICAgICAgICAgICAgICBtUmVuZGVyU2NyaXB0LmRvU3RvcCh4LCB5KTsKKyAgICAgICAgICAgICAgICBtVHJhY2tpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIENhcm91c2VsQ2FsbGJhY2sgREVCVUdfQ0FMTEJBQ0sgPSBuZXcgQ2Fyb3VzZWxDYWxsYmFjaygpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydGVkKCkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAib25BbmltYXRpb25TdGFydGVkKCkiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25GaW5pc2hlZCgpIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgIm9uQW5pbWF0aW9uRmluaXNoZWQoKSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25DYXJkU2VsZWN0ZWQoaW50IG4pIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgIm9uQ2FyZFNlbGVjdGVkKCIgKyBuICsgIikiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVxdWVzdEdlb21ldHJ5KGludCBuKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJvblJlcXVlc3RHZW9tZXRyeSgiICsgbiArICIpIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkludmFsaWRhdGVHZW9tZXRyeShpbnQgbikgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAib25JbnZhbGlkYXRlR2VvbWV0cnkoIiArIG4gKyAiKSIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBvblJlcXVlc3RUZXh0dXJlKGZpbmFsIGludCBuKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJvblJlcXVlc3RUZXh0dXJlKCIgKyBuICsgIikiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSW52YWxpZGF0ZVRleHR1cmUoaW50IG4pIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgIm9uSW52YWxpZGF0ZVRleHR1cmUoIiArIG4gKyAiKSIpOworICAgICAgICB9CisKKyAgICB9OworICAgIAorICAgIHByaXZhdGUgQ2Fyb3VzZWxDYWxsYmFjayBtQ2Fyb3VzZWxDYWxsYmFjayA9IERFQlVHX0NBTExCQUNLOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Db250YWN0SGVhZGVyV2lkZ2V0LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0NvbnRhY3RIZWFkZXJXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyMTQ2Ni4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0NvbnRhY3RIZWFkZXJXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwotCi1pbXBvcnQgYW5kcm9pZC5NYW5pZmVzdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQXN5bmNRdWVyeUhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFVyaXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUGhvbmVMb29rdXA7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5TdGF0dXNVcGRhdGVzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQ2hlY2tCb3g7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUXVpY2tDb250YWN0QmFkZ2U7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi0vKioKLSAqIEhlYWRlciB1c2VkIGFjcm9zcyBzeXN0ZW0gZm9yIGRpc3BsYXlpbmcgYSB0aXRsZSBiYXIgd2l0aCBjb250YWN0IGluZm8uIFlvdQotICogY2FuIGJpbmQgc3BlY2lmaWMgdmFsdWVzIG9uIHRoZSBoZWFkZXIsIG9yIHVzZSBoZWxwZXIgbWV0aG9kcyBsaWtlCi0gKiB7QGxpbmsgI2JpbmRGcm9tQ29udGFjdElkKGxvbmcpfSB0byBwb3B1bGF0ZSBhc3luY2hyb25vdXNseS4KLSAqIDxwPgotICogVGhlIHBhcmVudCBtdXN0IHJlcXVlc3QgdGhlIHtAbGluayBNYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfQ09OVEFDVFN9Ci0gKiBwZXJtaXNzaW9uIHRvIGFjY2VzcyBjb250YWN0IGRhdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250YWN0SGVhZGVyV2lkZ2V0IGV4dGVuZHMgRnJhbWVMYXlvdXQgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNvbnRhY3RIZWFkZXJXaWRnZXQiOwotCi0gICAgcHJpdmF0ZSBUZXh0VmlldyBtRGlzcGxheU5hbWVWaWV3OwotICAgIHByaXZhdGUgVmlldyBtQWdncmVnYXRlQmFkZ2U7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtUGhvbmV0aWNOYW1lVmlldzsKLSAgICBwcml2YXRlIENoZWNrQm94IG1TdGFycmVkVmlldzsKLSAgICBwcml2YXRlIFF1aWNrQ29udGFjdEJhZGdlIG1QaG90b1ZpZXc7Ci0gICAgcHJpdmF0ZSBJbWFnZVZpZXcgbVByZXNlbmNlVmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXNWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1c0F0dHJpYnV0aW9uVmlldzsKLSAgICBwcml2YXRlIGludCBtTm9QaG90b1Jlc291cmNlOwotICAgIHByaXZhdGUgUXVlcnlIYW5kbGVyIG1RdWVyeUhhbmRsZXI7Ci0KLSAgICBwcm90ZWN0ZWQgVXJpIG1Db250YWN0VXJpOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIG1FeGNsdWRlTWltZXMgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIGZvciBjYWxsYmFja3MgaW52b2tlZCB3aGVuIHRoZSB1c2VyIGludGVyYWN0cyB3aXRoIGEgaGVhZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgQ29udGFjdEhlYWRlckxpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25QaG90b0NsaWNrKFZpZXcgdmlldyk7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGlzcGxheU5hbWVDbGljayhWaWV3IHZpZXcpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29udGFjdEhlYWRlckxpc3RlbmVyIG1MaXN0ZW5lcjsKLQotCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgQ29udGFjdFF1ZXJ5IHsKLSAgICAgICAgLy9Qcm9qZWN0aW9uIHVzZWQgZm9yIHRoZSBzdW1tYXJ5IGluZm8gaW4gdGhlIGhlYWRlci4KLSAgICAgICAgU3RyaW5nW10gQ09MVU1OUyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICBDb250YWN0cy5fSUQsCi0gICAgICAgICAgICBDb250YWN0cy5MT09LVVBfS0VZLAotICAgICAgICAgICAgQ29udGFjdHMuUEhPVE9fSUQsCi0gICAgICAgICAgICBDb250YWN0cy5ESVNQTEFZX05BTUUsCi0gICAgICAgICAgICBDb250YWN0cy5QSE9ORVRJQ19OQU1FLAotICAgICAgICAgICAgQ29udGFjdHMuU1RBUlJFRCwKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfUFJFU0VOQ0UsCi0gICAgICAgICAgICBDb250YWN0cy5DT05UQUNUX1NUQVRVUywKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfU1RBVFVTX1RJTUVTVEFNUCwKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfU1RBVFVTX1JFU19QQUNLQUdFLAotICAgICAgICAgICAgQ29udGFjdHMuQ09OVEFDVF9TVEFUVVNfTEFCRUwsCi0gICAgICAgIH07Ci0gICAgICAgIGludCBfSUQgPSAwOwotICAgICAgICBpbnQgTE9PS1VQX0tFWSA9IDE7Ci0gICAgICAgIGludCBQSE9UT19JRCA9IDI7Ci0gICAgICAgIGludCBESVNQTEFZX05BTUUgPSAzOwotICAgICAgICBpbnQgUEhPTkVUSUNfTkFNRSA9IDQ7Ci0gICAgICAgIC8vVE9ETzogV2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB3ZSdyZSBnb2luZyB0byBnZXQgdGhlIHBob25ldGljIG5hbWUuCi0gICAgICAgIC8vc3RhdGljIGZpbmFsIGludCBIRUFERVJfUEhPTkVUSUNfTkFNRV9DT0xVTU5fSU5ERVgKLSAgICAgICAgaW50IFNUQVJSRUQgPSA1OwotICAgICAgICBpbnQgQ09OVEFDVF9QUkVTRU5DRV9TVEFUVVMgPSA2OwotICAgICAgICBpbnQgQ09OVEFDVF9TVEFUVVMgPSA3OwotICAgICAgICBpbnQgQ09OVEFDVF9TVEFUVVNfVElNRVNUQU1QID0gODsKLSAgICAgICAgaW50IENPTlRBQ1RfU1RBVFVTX1JFU19QQUNLQUdFID0gOTsKLSAgICAgICAgaW50IENPTlRBQ1RfU1RBVFVTX0xBQkVMID0gMTA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgUGhvdG9RdWVyeSB7Ci0gICAgICAgIFN0cmluZ1tdIENPTFVNTlMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgUGhvdG8uUEhPVE8KLSAgICAgICAgfTsKLQotICAgICAgICBpbnQgUEhPVE8gPSAwOwotICAgIH0KLQotICAgIC8vUHJvamVjdGlvbiB1c2VkIGZvciBsb29raW5nIHVwIGNvbnRhY3QgaWQgZnJvbSBwaG9uZSBudW1iZXIKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBIT05FX0xPT0tVUF9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgUGhvbmVMb29rdXAuX0lELAotICAgICAgICBQaG9uZUxvb2t1cC5MT09LVVBfS0VZLAotICAgIH07Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUEhPTkVfTE9PS1VQX0NPTlRBQ1RfSURfQ09MVU1OX0lOREVYID0gMDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQSE9ORV9MT09LVVBfQ09OVEFDVF9MT09LVVBfS0VZX0NPTFVNTl9JTkRFWCA9IDE7Ci0KLSAgICAvL1Byb2plY3Rpb24gdXNlZCBmb3IgbG9va2luZyB1cCBjb250YWN0IGlkIGZyb20gZW1haWwgYWRkcmVzcwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1BSUxfTE9PS1VQX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBSYXdDb250YWN0cy5DT05UQUNUX0lELAotICAgICAgICBDb250YWN0cy5MT09LVVBfS0VZLAotICAgIH07Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRU1BSUxfTE9PS1VQX0NPTlRBQ1RfSURfQ09MVU1OX0lOREVYID0gMDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFTUFJTF9MT09LVVBfQ09OVEFDVF9MT09LVVBfS0VZX0NPTFVNTl9JTkRFWCA9IDE7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTlRBQ1RfTE9PS1VQX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBDb250YWN0cy5fSUQsCi0gICAgfTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT05UQUNUX0xPT0tVUF9JRF9DT0xVTU5fSU5ERVggPSAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0NPTlRBQ1RfSU5GTyA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX1BIT05FX0xPT0tVUCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0VNQUlMX0xPT0tVUCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX1BIT1RPX1FVRVJZID0gMzsKLQotICAgIHB1YmxpYyBDb250YWN0SGVhZGVyV2lkZ2V0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0SGVhZGVyV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0SGVhZGVyV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKLQotICAgICAgICBtQ29udGVudFJlc29sdmVyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0KLSAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPQotICAgICAgICAgICAgKExheW91dEluZmxhdGVyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOwotICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmNvbnRhY3RfaGVhZGVyLCB0aGlzKTsKLQotICAgICAgICBtRGlzcGxheU5hbWVWaWV3ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5uYW1lKTsKLSAgICAgICAgbUFnZ3JlZ2F0ZUJhZGdlID0gZmluZFZpZXdCeUlkKFIuaWQuYWdncmVnYXRlX2JhZGdlKTsKLQotICAgICAgICBtUGhvbmV0aWNOYW1lVmlldyA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQucGhvbmV0aWNfbmFtZSk7Ci0KLSAgICAgICAgbVN0YXJyZWRWaWV3ID0gKENoZWNrQm94KWZpbmRWaWV3QnlJZChSLmlkLnN0YXIpOwotICAgICAgICBtU3RhcnJlZFZpZXcuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOwotCi0gICAgICAgIG1QaG90b1ZpZXcgPSAoUXVpY2tDb250YWN0QmFkZ2UpIGZpbmRWaWV3QnlJZChSLmlkLnBob3RvKTsKLQotICAgICAgICBtUHJlc2VuY2VWaWV3ID0gKEltYWdlVmlldykgZmluZFZpZXdCeUlkKFIuaWQucHJlc2VuY2UpOwotCi0gICAgICAgIG1TdGF0dXNWaWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnN0YXR1cyk7Ci0gICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzX2RhdGUpOwotCi0gICAgICAgIC8vIFNldCB0aGUgcGhvdG8gd2l0aCBhIHJhbmRvbSAibm8gY29udGFjdCIgaW1hZ2UKLSAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKLSAgICAgICAgaW50IG51bSA9IChpbnQpIG5vdyAmIDB4ZjsKLSAgICAgICAgaWYgKG51bSA8IDkpIHsKLSAgICAgICAgICAgIC8vIExlYW5pbmcgaW4gZnJvbSByaWdodCwgY29tbW9uCi0gICAgICAgICAgICBtTm9QaG90b1Jlc291cmNlID0gUi5kcmF3YWJsZS5pY19jb250YWN0X3BpY3R1cmU7Ci0gICAgICAgIH0gZWxzZSBpZiAobnVtIDwgMTQpIHsKLSAgICAgICAgICAgIC8vIExlYW5pbmcgaW4gZnJvbSBsZWZ0IHVuY29tbW9uCi0gICAgICAgICAgICBtTm9QaG90b1Jlc291cmNlID0gUi5kcmF3YWJsZS5pY19jb250YWN0X3BpY3R1cmVfMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIENvbWluZyBpbiBmcm9tIHRoZSB0b3AsIHJhcmUKLSAgICAgICAgICAgIG1Ob1Bob3RvUmVzb3VyY2UgPSBSLmRyYXdhYmxlLmljX2NvbnRhY3RfcGljdHVyZV8zOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuYWJsZUNsaWNrTGlzdGVuZXJzKCkgewotICAgICAgICBtRGlzcGxheU5hbWVWaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbVBob3RvVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBnaXZlbiB7QGxpbmsgQ29udGFjdEhlYWRlckxpc3RlbmVyfSB0byBoYW5kbGUgaGVhZGVyIGV2ZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250YWN0SGVhZGVyTGlzdGVuZXIoQ29udGFjdEhlYWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtUGhvdG9DbGljaygpIHsKLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIub25QaG90b0NsaWNrKG1QaG90b1ZpZXcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXNwbGF5TmFtZUNsaWNrKCkgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vbkRpc3BsYXlOYW1lQ2xpY2sobURpc3BsYXlOYW1lVmlldyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFF1ZXJ5SGFuZGxlciBleHRlbmRzIEFzeW5jUXVlcnlIYW5kbGVyIHsKLQotICAgICAgICBwdWJsaWMgUXVlcnlIYW5kbGVyKENvbnRlbnRSZXNvbHZlciBjcikgewotICAgICAgICAgICAgc3VwZXIoY3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUXVlcnlDb21wbGV0ZShpbnQgdG9rZW4sIE9iamVjdCBjb29raWUsIEN1cnNvciBjdXJzb3IpIHsKLSAgICAgICAgICAgIHRyeXsKLSAgICAgICAgICAgICAgICBpZiAodGhpcyAhPSBtUXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUXVlcnlDb21wbGV0ZTogZGlzY2FyZCByZXN1bHQsIHRoZSBxdWVyeSBoYW5kbGVyIGlzIHJlc2V0ISIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3dpdGNoICh0b2tlbikgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX1BIT1RPX1FVRVJZOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL1NldCB0aGUgcGhvdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBwaG90b0JpdG1hcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwgJiYgY3Vyc29yLm1vdmVUb0ZpcnN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWN1cnNvci5pc051bGwoUGhvdG9RdWVyeS5QSE9UTykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcGhvdG9EYXRhID0gY3Vyc29yLmdldEJsb2IoUGhvdG9RdWVyeS5QSE9UTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvdG9CaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheShwaG90b0RhdGEsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG90b0RhdGEubGVuZ3RoLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBob3RvQml0bWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG90b0JpdG1hcCA9IGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVBob3RvVmlldy5zZXRJbWFnZUJpdG1hcChwaG90b0JpdG1hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29va2llICE9IG51bGwgJiYgY29va2llIGluc3RhbmNlb2YgVXJpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBob3RvVmlldy5hc3NpZ25Db250YWN0VXJpKChVcmkpIGNvb2tpZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX0NPTlRBQ1RfSU5GTzogewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmIGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZENvbnRhY3RJbmZvKGN1cnNvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpIGxvb2t1cFVyaSA9IENvbnRhY3RzLmdldExvb2t1cFVyaShjdXJzb3IuZ2V0TG9uZyhDb250YWN0UXVlcnkuX0lEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LkxPT0tVUF9LRVkpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcGhvdG9JZCA9IGN1cnNvci5nZXRMb25nKENvbnRhY3RRdWVyeS5QSE9UT19JRCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGhvdG9JZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QaG90b1ZpZXcuc2V0SW1hZ2VCaXRtYXAobG9hZFBsYWNlaG9sZGVyUGhvdG8obnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29va2llICE9IG51bGwgJiYgY29va2llIGluc3RhbmNlb2YgVXJpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RVcmkoKFVyaSkgY29va2llKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQaG90b1F1ZXJ5KHBob3RvSWQsIGxvb2t1cFVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkb24ndCByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheU5hbWUobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U29jaWFsU25pcHBldChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQaG90byhsb2FkUGxhY2Vob2xkZXJQaG90byhudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX1BIT05FX0xPT0tVUDogewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmIGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBjb250YWN0SWQgPSBjdXJzb3IuZ2V0TG9uZyhQSE9ORV9MT09LVVBfQ09OVEFDVF9JRF9DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb29rdXBLZXkgPSBjdXJzb3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhPTkVfTE9PS1VQX0NPTlRBQ1RfTE9PS1VQX0tFWV9DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRGcm9tQ29udGFjdFVyaUludGVybmFsKENvbnRhY3RzLmdldExvb2t1cFVyaShjb250YWN0SWQsIGxvb2t1cEtleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkb24ndCByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBob25lTnVtYmVyID0gKFN0cmluZykgY29va2llOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERpc3BsYXlOYW1lKHBob25lTnVtYmVyLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTb2NpYWxTbmlwcGV0KG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RGcm9tUGhvbmUocGhvbmVOdW1iZXIsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUT0tFTl9FTUFJTF9MT09LVVA6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCAmJiBjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgY29udGFjdElkID0gY3Vyc29yLmdldExvbmcoRU1BSUxfTE9PS1VQX0NPTlRBQ1RfSURfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9va3VwS2V5ID0gY3Vyc29yLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVNQUlMX0xPT0tVUF9DT05UQUNUX0xPT0tVUF9LRVlfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kRnJvbUNvbnRhY3RVcmlJbnRlcm5hbChDb250YWN0cy5nZXRMb29rdXBVcmkoY29udGFjdElkLCBsb29rdXBLZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogZG9uJ3QgcmVzZXQgcXVlcnkgaGFuZGxlciAqLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbWFpbEFkZHJlc3MgPSAoU3RyaW5nKSBjb29raWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheU5hbWUoZW1haWxBZGRyZXNzLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTb2NpYWxTbmlwcGV0KG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RGcm9tRW1haWwoZW1haWxBZGRyZXNzLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHVybiBvbi9vZmYgc2hvd2luZyBvZiB0aGUgYWdncmVnYXRlIGJhZGdlIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd0FnZ3JlZ2F0ZUJhZGdlKGJvb2xlYW4gc2hvd0JhZ2RlKSB7Ci0gICAgICAgIG1BZ2dyZWdhdGVCYWRnZS5zZXRWaXNpYmlsaXR5KHNob3dCYWdkZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHVybiBvbi9vZmYgc2hvd2luZyBvZiB0aGUgc3RhciBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3dTdGFyKGJvb2xlYW4gc2hvd1N0YXIpIHsKLSAgICAgICAgbVN0YXJyZWRWaWV3LnNldFZpc2liaWxpdHkoc2hvd1N0YXIgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgc3RhcnJlZCBzdGF0ZSBvZiB0aGlzIGhlYWRlciB3aWRnZXQuIFRoaXMgZG9lc24ndCBjaGFuZ2UKLSAgICAgKiB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ29udGFjdHN9IHZhbHVlLCBvbmx5IHRoZSBVSSBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGFyZWQoYm9vbGVhbiBzdGFycmVkKSB7Ci0gICAgICAgIG1TdGFycmVkVmlldy5zZXRDaGVja2VkKHN0YXJyZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgcHJlc2VuY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJlc2VuY2UoaW50IHByZXNlbmNlKSB7Ci0gICAgICAgIG1QcmVzZW5jZVZpZXcuc2V0SW1hZ2VSZXNvdXJjZShTdGF0dXNVcGRhdGVzLmdldFByZXNlbmNlSWNvblJlc291cmNlSWQocHJlc2VuY2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIGNvbnRhY3QgdXJpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFjdFVyaShVcmkgdXJpKSB7Ci0gICAgICAgIHNldENvbnRhY3RVcmkodXJpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIGNvbnRhY3QgdXJpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFjdFVyaShVcmkgdXJpLCBib29sZWFuIHNlbmRUb0Zhc3RyYWNrKSB7Ci0gICAgICAgIG1Db250YWN0VXJpID0gdXJpOwotICAgICAgICBpZiAoc2VuZFRvRmFzdHJhY2spIHsKLSAgICAgICAgICAgIG1QaG90b1ZpZXcuYXNzaWduQ29udGFjdFVyaSh1cmkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFudWFsbHkgc2V0IHRoZSBwaG90byB0byBkaXNwbGF5IGluIHRoZSBoZWFkZXIuIFRoaXMgZG9lc24ndCBjaGFuZ2UgdGhlCi0gICAgICogdW5kZXJseWluZyB7QGxpbmsgQ29udGFjdHN9LCBvbmx5IHRoZSBVSSBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQaG90byhCaXRtYXAgYml0bWFwKSB7Ci0gICAgICAgIG1QaG90b1ZpZXcuc2V0SW1hZ2VCaXRtYXAoYml0bWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIGRpc3BsYXkgbmFtZSBhbmQgcGhvbmV0aWMgbmFtZSB0byBzaG93IGluIHRoZSBoZWFkZXIuCi0gICAgICogVGhpcyBkb2Vzbid0IGNoYW5nZSB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ29udGFjdHN9LCBvbmx5IHRoZSBVSSBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShDaGFyU2VxdWVuY2UgZGlzcGxheU5hbWUsIENoYXJTZXF1ZW5jZSBwaG9uZXRpY05hbWUpIHsKLSAgICAgICAgbURpc3BsYXlOYW1lVmlldy5zZXRUZXh0KGRpc3BsYXlOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY05hbWUpKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNOYW1lVmlldy5zZXRUZXh0KHBob25ldGljTmFtZSk7Ci0gICAgICAgICAgICBtUGhvbmV0aWNOYW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNOYW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIHNvY2lhbCBzbmlwcGV0IHRleHQgdG8gZGlzcGxheSBpbiB0aGUgaGVhZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNvY2lhbFNuaXBwZXQoQ2hhclNlcXVlbmNlIHNuaXBwZXQpIHsKLSAgICAgICAgaWYgKHNuaXBwZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN0YXR1c0F0dHJpYnV0aW9uVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRUZXh0KHNuaXBwZXQpOwotICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGEgbGlzdCBvZiBzcGVjaWZpYyBNSU1FLXR5cGVzIHRvIGV4Y2x1ZGUgYW5kIG5vdCBkaXNwbGF5LiBGb3IKLSAgICAgKiBleGFtcGxlLCB0aGlzIGNhbiBiZSB1c2VkIHRvIGhpZGUgdGhlIHtAbGluayBDb250YWN0cyNDT05URU5UX0lURU1fVFlQRX0KLSAgICAgKiBwcm9maWxlIGljb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZU1pbWVzKFN0cmluZ1tdIGV4Y2x1ZGVNaW1lcykgewotICAgICAgICBtRXhjbHVkZU1pbWVzID0gZXhjbHVkZU1pbWVzOwotICAgICAgICBtUGhvdG9WaWV3LnNldEV4Y2x1ZGVNaW1lcyhleGNsdWRlTWltZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgYmluZGluZyBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSBhbiBleGlzdGluZwotICAgICAqIGNvbnRhY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGFjdExvb2t1cFVyaSBhIHtDb250YWN0cy5DT05URU5UX0xPT0tVUF9VUkl9IHN0eWxlIFVSSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiaW5kRnJvbUNvbnRhY3RMb29rdXBVcmkoVXJpIGNvbnRhY3RMb29rdXBVcmkpIHsKLSAgICAgICAgYmluZEZyb21Db250YWN0VXJpSW50ZXJuYWwoY29udGFjdExvb2t1cFVyaSwgdHJ1ZSAvKiByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGJpbmRpbmcgYWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gYW4gZXhpc3RpbmcKLSAgICAgKiBjb250YWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRhY3RVcmkgYSB7Q29udGFjdHMuQ09OVEVOVF9VUkl9IHN0eWxlIFVSSS4KLSAgICAgKiBAcGFyYW0gcmVzZXRRdWVyeUhhbmRsZXIgd2hldGhlciB0byB1c2UgYSBuZXcgQXN5bmNRdWVyeUhhbmRsZXIgb3Igbm90LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBiaW5kRnJvbUNvbnRhY3RVcmlJbnRlcm5hbChVcmkgY29udGFjdFVyaSwgYm9vbGVhbiByZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICBtQ29udGFjdFVyaSA9IGNvbnRhY3RVcmk7Ci0gICAgICAgIHN0YXJ0Q29udGFjdFF1ZXJ5KGNvbnRhY3RVcmksIHJlc2V0UXVlcnlIYW5kbGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGJpbmRpbmcgYWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gYW4gZXhpc3RpbmcKLSAgICAgKiBjb250YWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGVtYWlsQWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB1c2VkIHRvIGRvIGEgcmV2ZXJzZSBsb29rdXAgaW4KLSAgICAgKiB0aGUgY29udGFjdHMgZGF0YWJhc2UuIElmIG1vcmUgdGhhbiBvbmUgY29udGFjdCBjb250YWlucyB0aGlzIGVtYWlsCi0gICAgICogYWRkcmVzcywgb25lIG9mIHRoZW0gd2lsbCBiZSBjaG9zZW4gdG8gYmluZCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiaW5kRnJvbUVtYWlsKFN0cmluZyBlbWFpbEFkZHJlc3MpIHsKLSAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotCi0gICAgICAgIG1RdWVyeUhhbmRsZXIuc3RhcnRRdWVyeShUT0tFTl9FTUFJTF9MT09LVVAsIGVtYWlsQWRkcmVzcywKLSAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChFbWFpbC5DT05URU5UX0xPT0tVUF9VUkksIFVyaS5lbmNvZGUoZW1haWxBZGRyZXNzKSksCi0gICAgICAgICAgICAgICAgRU1BSUxfTE9PS1VQX1BST0pFQ1RJT04sIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgYmluZGluZyBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSBhbiBleGlzdGluZwotICAgICAqIGNvbnRhY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBwaG9uZSBudW1iZXIgdXNlZCB0byBkbyBhIHJldmVyc2UgbG9va3VwIGluCi0gICAgICogdGhlIGNvbnRhY3RzIGRhdGFiYXNlLiBJZiBtb3JlIHRoYW4gb25lIGNvbnRhY3QgY29udGFpbnMgdGhpcyBwaG9uZQotICAgICAqIG51bWJlciwgb25lIG9mIHRoZW0gd2lsbCBiZSBjaG9zZW4gdG8gYmluZCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiaW5kRnJvbVBob25lTnVtYmVyKFN0cmluZyBudW1iZXIpIHsKLSAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotCi0gICAgICAgIG1RdWVyeUhhbmRsZXIuc3RhcnRRdWVyeShUT0tFTl9QSE9ORV9MT09LVVAsIG51bWJlciwKLSAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChQaG9uZUxvb2t1cC5DT05URU5UX0ZJTFRFUl9VUkksIFVyaS5lbmNvZGUobnVtYmVyKSksCi0gICAgICAgICAgICAgICAgUEhPTkVfTE9PS1VQX1BST0pFQ1RJT04sIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHN0YXJ0Q29udGFjdFF1ZXJ5Ci0gICAgICoKLSAgICAgKiBpbnRlcm5hbCBtZXRob2QgdG8gcXVlcnkgY29udGFjdCBieSBVcmkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGFjdFVyaSB0aGUgY29udGFjdCB1cmkKLSAgICAgKiBAcGFyYW0gcmVzZXRRdWVyeUhhbmRsZXIgd2hldGhlciB0byB1c2UgYSBuZXcgQXN5bmNRdWVyeUhhbmRsZXIgb3Igbm90Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0Q29udGFjdFF1ZXJ5KFVyaSBjb250YWN0VXJpLCBib29sZWFuIHJlc2V0UXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgIGlmIChyZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVF1ZXJ5SGFuZGxlci5zdGFydFF1ZXJ5KFRPS0VOX0NPTlRBQ1RfSU5GTywgY29udGFjdFVyaSwgY29udGFjdFVyaSwgQ29udGFjdFF1ZXJ5LkNPTFVNTlMsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc3RhcnRQaG90b1F1ZXJ5Ci0gICAgICoKLSAgICAgKiBpbnRlcm5hbCBtZXRob2QgdG8gcXVlcnkgY29udGFjdCBwaG90byBieSBwaG90byBpZCBhbmQgdXJpLgotICAgICAqCi0gICAgICogQHBhcmFtIHBob3RvSWQgdGhlIHBob3RvIGlkLgotICAgICAqIEBwYXJhbSBsb29rdXBLZXkgdGhlIGxvb2t1cCB1cmkuCi0gICAgICogQHBhcmFtIHJlc2V0UXVlcnlIYW5kbGVyIHdoZXRoZXIgdG8gdXNlIGEgbmV3IEFzeW5jUXVlcnlIYW5kbGVyIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydFBob3RvUXVlcnkobG9uZyBwaG90b0lkLCBVcmkgbG9va3VwS2V5LCBib29sZWFuIHJlc2V0UXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgIGlmIChyZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVF1ZXJ5SGFuZGxlci5zdGFydFF1ZXJ5KFRPS0VOX1BIT1RPX1FVRVJZLCBsb29rdXBLZXksCi0gICAgICAgICAgICAgICAgQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoRGF0YS5DT05URU5UX1VSSSwgcGhvdG9JZCksIFBob3RvUXVlcnkuQ09MVU1OUywKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdG8gZm9yY2UgdGhpcyB3aWRnZXQgdG8gZm9yZ2V0IGV2ZXJ5dGhpbmcgaXQga25vd3MgYWJvdXQgdGhlIGNvbnRhY3QuCi0gICAgICogV2UgbmVlZCB0byBzdG9wIGFueSBleGlzdGluZyBhc3luYyBxdWVyaWVzIGZvciBwaG9uZSwgZW1haWwsIGNvbnRhY3QsIGFuZCBwaG90b3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2lwZUNsZWFuKCkgewotICAgICAgICByZXNldEFzeW5jUXVlcnlIYW5kbGVyKCk7Ci0KLSAgICAgICAgc2V0RGlzcGxheU5hbWUobnVsbCwgbnVsbCk7Ci0gICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgc2V0U29jaWFsU25pcHBldChudWxsKTsKLSAgICAgICAgc2V0UHJlc2VuY2UoMCk7Ci0gICAgICAgIG1Db250YWN0VXJpID0gbnVsbDsKLSAgICAgICAgbUV4Y2x1ZGVNaW1lcyA9IG51bGw7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpIHsKLSAgICAgICAgLy8gdGhlIGFwaSBBc3luY1F1ZXJ5SGFuZGxlci5jYW5jZWxPcGVyYXRpb24oKSBkb2Vzbid0IHJlYWxseSB3b3JrLiBTaW5jZSB3ZSByZWFsbHkKLSAgICAgICAgLy8gbmVlZCB0aGUgb2xkIGFzeW5jIHF1ZXJpZXMgdG8gYmUgY2FuY2VsbGVkLCBsZXQncyBkbyBpdCB0aGUgaGFyZCB3YXkuCi0gICAgICAgIG1RdWVyeUhhbmRsZXIgPSBuZXcgUXVlcnlIYW5kbGVyKG1Db250ZW50UmVzb2x2ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJpbmQgdGhlIGNvbnRhY3QgZGV0YWlscyBwcm92aWRlZCBieSB0aGUgZ2l2ZW4ge0BsaW5rIEN1cnNvcn0uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYmluZENvbnRhY3RJbmZvKEN1cnNvciBjKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkaXNwbGF5TmFtZSA9IGMuZ2V0U3RyaW5nKENvbnRhY3RRdWVyeS5ESVNQTEFZX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNOYW1lID0gYy5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LlBIT05FVElDX05BTUUpOwotICAgICAgICB0aGlzLnNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lLCBwaG9uZXRpY05hbWUpOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gc3RhcnJlZCA9IGMuZ2V0SW50KENvbnRhY3RRdWVyeS5TVEFSUkVEKSAhPSAwOwotICAgICAgICBtU3RhcnJlZFZpZXcuc2V0Q2hlY2tlZChzdGFycmVkKTsKLQotICAgICAgICAvL1NldCB0aGUgcHJlc2VuY2Ugc3RhdHVzCi0gICAgICAgIGlmICghYy5pc051bGwoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfUFJFU0VOQ0VfU1RBVFVTKSkgewotICAgICAgICAgICAgaW50IHByZXNlbmNlID0gYy5nZXRJbnQoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfUFJFU0VOQ0VfU1RBVFVTKTsKLSAgICAgICAgICAgIG1QcmVzZW5jZVZpZXcuc2V0SW1hZ2VSZXNvdXJjZShTdGF0dXNVcGRhdGVzLmdldFByZXNlbmNlSWNvblJlc291cmNlSWQocHJlc2VuY2UpKTsKLSAgICAgICAgICAgIG1QcmVzZW5jZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVByZXNlbmNlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL1NldCB0aGUgc3RhdHVzIHVwZGF0ZQotICAgICAgICBTdHJpbmcgc3RhdHVzID0gYy5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfU1RBVFVTKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShzdGF0dXMpKSB7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRUZXh0KHN0YXR1cyk7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aW1lc3RhbXAgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoIWMuaXNOdWxsKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19USU1FU1RBTVApKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBkYXRlID0gYy5nZXRMb25nKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19USU1FU1RBTVApOwotCi0gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBkYXRlL3RpbWUgZmllbGQgYnkgbWl4aW5nIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZQotICAgICAgICAgICAgICAgIC8vIHRpbWVzLgotICAgICAgICAgICAgICAgIGludCBmbGFncyA9IERhdGVVdGlscy5GT1JNQVRfQUJCUkVWX1JFTEFUSVZFOwotCi0gICAgICAgICAgICAgICAgdGltZXN0YW1wID0gRGF0ZVV0aWxzLmdldFJlbGF0aXZlVGltZVNwYW5TdHJpbmcoZGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLCBEYXRlVXRpbHMuTUlOVVRFX0lOX01JTExJUywgZmxhZ3MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoIWMuaXNOdWxsKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19MQUJFTCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzUGFja2FnZSA9IGMuZ2V0U3RyaW5nKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19SRVNfUEFDS0FHRSk7Ci0gICAgICAgICAgICAgICAgaW50IGxhYmVsUmVzb3VyY2UgPSBjLmdldEludChDb250YWN0UXVlcnkuQ09OVEFDVF9TVEFUVVNfTEFCRUwpOwotICAgICAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXM7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJlc1BhY2thZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IGdldFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgPSBwbS5nZXRSZXNvdXJjZXNGb3JBcHBsaWNhdGlvbihyZXNQYWNrYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRhY3Qgc3RhdHVzIHVwZGF0ZSByZXNvdXJjZSBwYWNrYWdlIG5vdCBmb3VuZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlc1BhY2thZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSByZXNvdXJjZXMuZ2V0U3RyaW5nKGxhYmVsUmVzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250YWN0IHN0YXR1cyB1cGRhdGUgcmVzb3VyY2Ugbm90IGZvdW5kOiAiICsgcmVzUGFja2FnZSArICJAIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxhYmVsUmVzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgYXR0cmlidXRpb247Ci0gICAgICAgICAgICBpZiAodGltZXN0YW1wICE9IG51bGwgJiYgbGFiZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIGxhYmVsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZXN0YW1wID09IG51bGwgJiYgbGFiZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZXN0YW1wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbiA9IHRpbWVzdGFtcDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRpb24gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF0dHJpYnV0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzQXR0cmlidXRpb25WaWV3LnNldFRleHQoYXR0cmlidXRpb24pOwotICAgICAgICAgICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzQXR0cmlidXRpb25WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHZpZXcpIHsKLSAgICAgICAgc3dpdGNoICh2aWV3LmdldElkKCkpIHsKLSAgICAgICAgICAgIGNhc2UgUi5pZC5zdGFyOiB7Ci0gICAgICAgICAgICAgICAgLy8gVG9nZ2xlICJzdGFycmVkIiBzdGF0ZQotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIGNvbnRhY3QKLSAgICAgICAgICAgICAgICBpZiAobUNvbnRhY3RVcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKDEpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KENvbnRhY3RzLlNUQVJSRUQsIG1TdGFycmVkVmlldy5pc0NoZWNrZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIudXBkYXRlKG1Db250YWN0VXJpLCB2YWx1ZXMsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUi5pZC5waG90bzogewotICAgICAgICAgICAgICAgIHBlcmZvcm1QaG90b0NsaWNrKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFIuaWQubmFtZTogewotICAgICAgICAgICAgICAgIHBlcmZvcm1EaXNwbGF5TmFtZUNsaWNrKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEJpdG1hcCBsb2FkUGxhY2Vob2xkZXJQaG90byhCaXRtYXBGYWN0b3J5Lk9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICBpZiAobU5vUGhvdG9SZXNvdXJjZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShtQ29udGV4dC5nZXRSZXNvdXJjZXMoKSwKLSAgICAgICAgICAgICAgICBtTm9QaG90b1Jlc291cmNlLCBvcHRpb25zKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpZ2l0YWxDbG9jay5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9EaWdpdGFsQ2xvY2suamF2YQppbmRleCBmYTQ3ZmY2Li4yM2UyMjc3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpZ2l0YWxDbG9jay5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRGlnaXRhbENsb2NrLmphdmEKQEAgLTMwLDcgKzMwLDcgQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVGb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKIGltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHM7CkBAIC0zOSw3ICszOSw3IEBACiAvKioKICAqIERpc3BsYXlzIHRoZSB0aW1lCiAgKi8KLXB1YmxpYyBjbGFzcyBEaWdpdGFsQ2xvY2sgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgeworcHVibGljIGNsYXNzIERpZ2l0YWxDbG9jayBleHRlbmRzIFJlbGF0aXZlTGF5b3V0IHsKIAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBNMTIgPSAiaDptbSI7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE0yNCA9ICJrazptbSI7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0VkaXRTdHlsZWRUZXh0LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0VkaXRTdHlsZWRUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMTk3YzAuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9FZGl0U3R5bGVkVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZy5CdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlNoYXBlRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuUmVjdFNoYXBlOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0Lkh0bWw7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dDsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkOwotaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuQXJyb3dLZXlNb3ZlbWVudE1ldGhvZDsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQWJzb2x1dGVTaXplU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQWxpZ25tZW50U3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkZvcmVncm91bmRDb2xvclNwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkltYWdlU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUGFyYWdyYXBoU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlF1b3RlU3BhbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi0vKioKLSAqIEVkaXRTdHlsZWRUZXh0IGV4dGVuZHMgRWRpdFRleHQgZm9yIG1hbmFnaW5nIHRoZSBmbG93IGFuZCBzdGF0dXMgdG8gZWRpdAotICogdGhlIHN0eWxlZCB0ZXh0LiBUaGlzIG1hbmFnZXMgdGhlIHN0YXRlcyBhbmQgZmxvd3Mgb2YgZWRpdGluZywgc3VwcG9ydHMKLSAqIGluc2VydGluZyBpbWFnZSwgaW1wb3J0L2V4cG9ydCBIVE1MLgotICovCi1wdWJsaWMgY2xhc3MgRWRpdFN0eWxlZFRleHQgZXh0ZW5kcyBFZGl0VGV4dCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJFZGl0U3R5bGVkVGV4dCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtb2RlcyBvZiBlZGl0aW5nIGFjdGlvbnMuCi0gICAgICovCi0gICAgLyoqIFRoZSBtb2RlIHRoYXQgbm8gZWRpdGluZyBhY3Rpb24gaXMgZG9uZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX05PVEhJTkcgPSAwOwotICAgIC8qKiBUaGUgbW9kZSBvZiBjb3B5LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfQ09QWSA9IDE7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIHBhc3RlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfUEFTVEUgPSAyOwotICAgIC8qKiBUaGUgbW9kZSBvZiBjaGFuZ2luZyBzaXplLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfU0laRSA9IDM7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIGNoYW5naW5nIGNvbG9yLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfQ09MT1IgPSA0OwotICAgIC8qKiBUaGUgbW9kZSBvZiBzZWxlY3Rpb24uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9TRUxFQ1QgPSA1OwotICAgIC8qKiBUaGUgbW9kZSBvZiBjaGFuZ2luZyBhbGlnbm1lbnQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9BTElHTiA9IDY7Ci0gICAgLyoqIFRoZSBtb2RlIG9mIGNoYW5naW5nIGN1dC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0NVVCA9IDc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc3RhdGUgb2Ygc2VsZWN0aW9uLgotICAgICAqLwotICAgIC8qKiBUaGUgc3RhdGUgdGhhdCBzZWxlY3Rpb24gaXNuJ3Qgc3RhcnRlZC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9TRUxFQ1RfT0ZGID0gMDsKLSAgICAvKiogVGhlIHN0YXRlIHRoYXQgc2VsZWN0aW9uIGlzIHN0YXJ0ZWQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0VMRUNUX09OID0gMTsKLSAgICAvKiogVGhlIHN0YXRlIHRoYXQgc2VsZWN0aW9uIGlzIGRvbmUsIGJ1dCBub3QgZml4ZWQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0VMRUNURUQgPSAyOwotICAgIC8qKiBUaGUgc3RhdGUgdGhhdCBzZWxlY3Rpb24gaXMgZG9uZSBhbmQgbm90IGZpeGVkLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NFTEVDVF9GSVggPSAzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGhlbHAgbWVzc2FnZSBzdHJpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJTlRfTVNHX05VTEwgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJTlRfTVNHX0NPUFlfQlVGX0JMQU5LID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISU5UX01TR19TRUxFQ1RfU1RBUlQgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJTlRfTVNHX1NFTEVDVF9FTkQgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJTlRfTVNHX1BVU0hfQ09NUEVURSA9IDQ7Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgaGVscCBtZXNzYWdlIHN0cmluZ3MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SID0gMHgwMEZGRkZGRjsKLQotICAgIC8qKgotICAgICAqIEVkaXRTdHlsZWRUZXh0SW50ZXJmYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyBmb3Igbm90aWZ5aW5nIG1lc3NhZ2VzIHRvCi0gICAgICogY2FsbGluZyBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEVkaXRTdHlsZWRUZXh0Tm90aWZpZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlIaW50TXNnKGludCBtc2dJZCk7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeVN0YXRlQ2hhbmdlZChpbnQgbW9kZSwgaW50IHN0YXRlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVkaXRTdHlsZWRUZXh0Tm90aWZpZXIgbUVTVEludGVyZmFjZTsKLQotICAgIC8qKgotICAgICAqIEVkaXRTdHlsZWRUZXh0RWRpdG9yTWFuYWdlciBtYW5hZ2VzIHRoZSBmbG93IGFuZCBzdGF0dXMgb2YgZWFjaAotICAgICAqIGZ1bmN0aW9uIGZvciBlZGl0aW5nIHN0eWxlZCB0ZXh0LgotICAgICAqLwotICAgIHByaXZhdGUgRWRpdG9yTWFuYWdlciBtTWFuYWdlcjsKLSAgICBwcml2YXRlIFN0eWxlZFRleHRDb252ZXJ0ZXIgbUNvbnZlcnRlcjsKLSAgICBwcml2YXRlIFN0eWxlZFRleHREaWFsb2cgbURpYWxvZzsKLSAgICBwcml2YXRlIERyYXdhYmxlIG1EZWZhdWx0QmFja2dyb3VuZDsKLSAgICBwcml2YXRlIGludCBtQmFja2dyb3VuZENvbG9yOwotCi0gICAgLyoqCi0gICAgICogRWRpdFN0eWxlZFRleHQgZXh0ZW5kcyBFZGl0VGV4dCBmb3IgbWFuYWdpbmcgZmxvdyBvZiBlYWNoIGVkaXRpbmcKLSAgICAgKiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIEVkaXRTdHlsZWRUZXh0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBFZGl0U3R5bGVkVGV4dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWRpdFN0eWxlZFRleHQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IE5vdGlmaWVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5vdGlmaWVyKEVkaXRTdHlsZWRUZXh0Tm90aWZpZXIgZXN0SW50ZXJmYWNlKSB7Ci0gICAgICAgIG1FU1RJbnRlcmZhY2UgPSBlc3RJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IEJ1aWxkZXIgZm9yIEFsZXJ0RGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBidWlsZGVyCi0gICAgICogICAgICAgICAgICBCdWlsZGVyIGZvciBvcGVuaW5nIEFsZXJ0IERpYWxvZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZGVyKEJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICBtRGlhbG9nLnNldEJ1aWxkZXIoYnVpbGRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IFBhcmFtZXRlcnMgZm9yIENvbG9yQWxlcnREaWFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbG9ydGl0bGUKLSAgICAgKiAgICAgICAgICAgIFRpdGxlIGZvciBBbGVydCBEaWFsb2cuCi0gICAgICogQHBhcmFtIGNvbG9ybmFtZXMKLSAgICAgKiAgICAgICAgICAgIExpc3Qgb2YgbmFtZSBvZiBzZWxlY3RpbmcgY29sb3IuCi0gICAgICogQHBhcmFtIGNvbG9yaW50cwotICAgICAqICAgICAgICAgICAgTGlzdCBvZiBpbnQgb2YgY29sb3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29sb3JBbGVydFBhcmFtcyhDaGFyU2VxdWVuY2UgY29sb3J0aXRsZSwKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIGNvbG9ybmFtZXMsIENoYXJTZXF1ZW5jZVtdIGNvbG9yaW50cykgewotICAgICAgICBtRGlhbG9nLnNldENvbG9yQWxlcnRQYXJhbXMoY29sb3J0aXRsZSwgY29sb3JuYW1lcywgY29sb3JpbnRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgUGFyYW1ldGVycyBmb3IgU2l6ZUFsZXJ0RGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzaXpldGl0bGUKLSAgICAgKiAgICAgICAgICAgIFRpdGxlIGZvciBBbGVydCBEaWFsb2cuCi0gICAgICogQHBhcmFtIHNpemVuYW1lcwotICAgICAqICAgICAgICAgICAgTGlzdCBvZiBuYW1lIG9mIHNlbGVjdGluZyBzaXplLgotICAgICAqIEBwYXJhbSBzaXplZGlzcGxheWludHMKLSAgICAgKiAgICAgICAgICAgIExpc3Qgb2YgaW50IG9mIHNpemUgZGlzcGxheWVkIGluIFRleHRWaWV3LgotICAgICAqIEBwYXJhbSBzaXplc2VuZGludHMKLSAgICAgKiAgICAgICAgICAgIExpc3Qgb2YgaW50IG9mIHNpemUgZXhwb3J0ZWQgdG8gSFRNTC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTaXplQWxlcnRQYXJhbXMoQ2hhclNlcXVlbmNlIHNpemV0aXRsZSwKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIHNpemVuYW1lcywgQ2hhclNlcXVlbmNlW10gc2l6ZWRpc3BsYXlpbnRzLAotICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gc2l6ZXNlbmRpbnRzKSB7Ci0gICAgICAgIG1EaWFsb2cuc2V0U2l6ZUFsZXJ0UGFyYW1zKHNpemV0aXRsZSwgc2l6ZW5hbWVzLCBzaXplZGlzcGxheWludHMsCi0gICAgICAgICAgICAgICAgc2l6ZXNlbmRpbnRzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGlnbkFsZXJ0UGFyYW1zKENoYXJTZXF1ZW5jZSBhbGlnbnRpdGxlLAotICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gYWxpZ25uYW1lcykgewotICAgICAgICBtRGlhbG9nLnNldEFsaWduQWxlcnRQYXJhbXMoYWxpZ250aXRsZSwgYWxpZ25uYW1lcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChtTWFuYWdlci5pc1NvZnRLZXlCbG9ja2VkKCkgJiYKLSAgICAgICAgICAgICAgICBldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVApIHsKLSAgICAgICAgICAgIGNhbmNlbExvbmdQcmVzcygpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gc3VwZXJSZXN1bHQgPSBzdXBlci5vblRvdWNoRXZlbnQoZXZlbnQpOwotICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblRvdWNoRXZlbnQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1NYW5hZ2VyLm9uQ3Vyc29yTW92ZWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXJSZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgZWRpdGluZy4gVGhpcyBmdW5jdGlvbiBoYXZlIHRvIGJlIGNhbGxlZCBiZWZvcmUgb3RoZXIgZWRpdGluZwotICAgICAqIGFjdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydEVkaXQoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRFZGl0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5kIGVkaXRpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25FbmRFZGl0KCkgewotICAgICAgICBtTWFuYWdlci5vbkVuZEVkaXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCAiQ29weSIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRDb3B5KCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0Q29weSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0ICJDdXQiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0Q3V0KCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0Q3V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgIlBhc3RlIiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydFBhc3RlKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0UGFzdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBjaGFuZ2luZyAiU2l6ZSIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRTaXplKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0U2l6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGNoYW5naW5nICJDb2xvciIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRDb2xvcigpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydENvbG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgY2hhbmdpbmcgIkJhY2tncm91bmRDb2xvciIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRCYWNrZ3JvdW5kQ29sb3IoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRCYWNrZ3JvdW5kQ29sb3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBjaGFuZ2luZyAiQWxpZ25tZW50IiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydEFsaWduKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0QWxpZ24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCAiU2VsZWN0IiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydFNlbGVjdCgpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydFNlbGVjdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0ICJTZWxlY3RBbGwiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0U2VsZWN0QWxsKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0U2VsZWN0QWxsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRml4IFNlbGVjdGVkIEl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25GaXhTZWxlY3RlZEl0ZW0oKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uRml4U2VsZWN0ZWRJdGVtKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0SW1hZ2UgdG8gVGV4dFZpZXcgYnkgdXNpbmcgVVJJCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqICAgICAgICAgICAgVVJJIG9mIHRoZSBpYW1nZSBpbnNlcnRlZCB0byBUZXh0Vmlldy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkluc2VydEltYWdlKFVyaSB1cmkpIHsKLSAgICAgICAgbU1hbmFnZXIub25JbnNlcnRJbWFnZSh1cmkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydEltYWdlIHRvIFRleHRWaWV3IGJ5IHVzaW5nIHJlc291cmNlIElECi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc0lkCi0gICAgICogICAgICAgICAgICBSZXNvdXJjZSBJRCBvZiB0aGUgaWFtZ2UgaW5zZXJ0ZWQgdG8gVGV4dFZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25JbnNlcnRJbWFnZShpbnQgcmVzSWQpIHsKLSAgICAgICAgbU1hbmFnZXIub25JbnNlcnRJbWFnZShyZXNJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25JbnNlcnRIb3Jpem9udGFsTGluZSgpIHsKLSAgICAgICAgbU1hbmFnZXIub25JbnNlcnRIb3Jpem9udGFsTGluZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ2xlYXJTdHlsZXMoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uQ2xlYXJTdHlsZXMoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU2V0IFNpemUgb2YgdGhlIEl0ZW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHNpemUKLSAgICAgKiAgICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSBJdGVtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1TaXplKGludCBzaXplKSB7Ci0gICAgICAgIG1NYW5hZ2VyLnNldEl0ZW1TaXplKHNpemUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBDb2xvciBvZiB0aGUgSXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3IKLSAgICAgKiAgICAgICAgICAgIFRoZSBjb2xvciBvZiB0aGUgSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJdGVtQ29sb3IoaW50IGNvbG9yKSB7Ci0gICAgICAgIG1NYW5hZ2VyLnNldEl0ZW1Db2xvcihjb2xvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IEFsaWdubWVudCBvZiB0aGUgSXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3IKLSAgICAgKiAgICAgICAgICAgIFRoZSBjb2xvciBvZiB0aGUgSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGlnbm1lbnQoTGF5b3V0LkFsaWdubWVudCBhbGlnbikgewotICAgICAgICBtTWFuYWdlci5zZXRBbGlnbm1lbnQoYWxpZ24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBCYWNrZ3JvdW5kIGNvbG9yIG9mIFZpZXcuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yCi0gICAgICogICAgICAgICAgICBUaGUgYmFja2dyb3VuZCBjb2xvciBvZiB2aWV3LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRDb2xvcihpbnQgY29sb3IpIHsKLSAgICAgICAgc3VwZXIuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKLSAgICAgICAgbUJhY2tncm91bmRDb2xvciA9IGNvbG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBodG1sIHRvIEVkaXRTdHlsZWRUZXh0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBodG1sCi0gICAgICogICAgICAgICAgICBUaGUgaHRtbCB0byBiZSBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SHRtbChTdHJpbmcgaHRtbCkgewotICAgICAgICBtQ29udmVydGVyLlNldEh0bWwoaHRtbCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgZWRpdGluZyBpcyBzdGFydGVkIG9yIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFdoZXRoZXIgZWRpdGluZyBpcyBzdGFydGVkIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VkaXR0aW5nKCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuaXNFZGl0dGluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgc3R5bGVkIHRleHQgb3Igbm90LgotICAgICAqIAotICAgICAqIEByZXR1cm4gV2hldGhlciBzdHlsZWQgdGV4dCBvciBub3QuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdHlsZWRUZXh0KCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuaXNTdHlsZWRUZXh0KCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgU29mdEtleSBpcyBCbG9ja2VkIG9yIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgU29mdEtleSBpcyBCbG9ja2VkIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NvZnRLZXlCbG9ja2VkKCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuaXNTb2Z0S2V5QmxvY2tlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbW9kZSBvZiB0aGUgYWN0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIG1vZGUgb2YgdGhlIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEVkaXRNb2RlKCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuZ2V0RWRpdE1vZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHN0YXRlIG9mIHRoZSBzZWxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIHNlbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNlbGVjdFN0YXRlKCkgewotICAgICAgICByZXR1cm4gbU1hbmFnZXIuZ2V0U2VsZWN0U3RhdGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIGdldElucHV0RXh0cmFzKGJvb2xlYW4gY3JlYXRlKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS1nZXRJbnB1dEV4dHJhcyIpOwotICAgICAgICB9Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBzdXBlci5nZXRJbnB1dEV4dHJhcyhjcmVhdGUpOwotICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgfQotICAgICAgICBidW5kbGUucHV0Qm9vbGVhbigiYWxsb3dFbW9qaSIsIHRydWUpOwotICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIHNlbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SHRtbCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db252ZXJ0ZXIuZ2V0SHRtbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RhdGUgb2YgdGhlIHNlbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpcwotICAgICAqICAgICAgICAgICAgVGhlIGFycmF5IG9mIHVzZWQgdXJpcy4KLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgc2VsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SHRtbChBcnJheUxpc3Q8VXJpPiB1cmlzKSB7Ci0gICAgICAgIG1Db252ZXJ0ZXIuZ2V0VXJpQXJyYXkodXJpcywgZ2V0VGV4dCgpKTsKLSAgICAgICAgcmV0dXJuIG1Db252ZXJ0ZXIuZ2V0SHRtbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBCYWNrZ3JvdW5kIGNvbG9yIG9mIFZpZXcuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgYmFja2dyb3VuZCBjb2xvciBvZiBWaWV3LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0QmFja2dyb3VuZENvbG9yKCkgewotICAgICAgICByZXR1cm4gbUJhY2tncm91bmRDb2xvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgRm9yZWdyb3VuZCBjb2xvciBvZiBWaWV3LgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGJhY2tncm91bmQgY29sb3Igb2YgVmlldy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEZvcmVHcm91bmRDb2xvcihpbnQgcG9zKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS1nZXRGb3JlR3JvdW5kQ29sb3I6ICIgKyBwb3MpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwb3MgPCAwIHx8IHBvcyA+IGdldFRleHQoKS5sZW5ndGgoKSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLWdldEZvcmVHcm91bmRDb2xvcjogSWxsaWdhbCBwb3NpdGlvbi4iKTsKLSAgICAgICAgICAgIHJldHVybiBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGb3JlZ3JvdW5kQ29sb3JTcGFuW10gc3BhbnMgPQotICAgICAgICAgICAgICAgIGdldFRleHQoKS5nZXRTcGFucyhwb3MsIHBvcywgRm9yZWdyb3VuZENvbG9yU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzcGFuc1swXS5nZXRGb3JlZ3JvdW5kQ29sb3IoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfQkFDS0dST1VORF9DT0xPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgbWVtYmVycy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBpbml0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVxdWVzdEZvY3VzKCk7Ci0gICAgICAgIG1EZWZhdWx0QmFja2dyb3VuZCA9IGdldEJhY2tncm91bmQoKTsKLSAgICAgICAgbUJhY2tncm91bmRDb2xvciA9IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUjsKLSAgICAgICAgbU1hbmFnZXIgPSBuZXcgRWRpdG9yTWFuYWdlcih0aGlzKTsKLSAgICAgICAgbUNvbnZlcnRlciA9IG5ldyBTdHlsZWRUZXh0Q29udmVydGVyKHRoaXMpOwotICAgICAgICBtRGlhbG9nID0gbmV3IFN0eWxlZFRleHREaWFsb2codGhpcyk7Ci0gICAgICAgIHNldE1vdmVtZW50TWV0aG9kKG5ldyBTdHlsZWRUZXh0QXJyb3dLZXlNZXRob2QobU1hbmFnZXIpKTsKLSAgICAgICAgbU1hbmFnZXIuYmxvY2tTb2Z0S2V5KCk7Ci0gICAgICAgIG1NYW5hZ2VyLnVuYmxvY2tTb2Z0S2V5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyBGb3JlZ3JvdW5kIENvbG9yIFNlbGVjdGluZyBEaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uU2hvd0ZvcmVncm91bmRDb2xvckFsZXJ0KCkgewotICAgICAgICBtRGlhbG9nLm9uU2hvd0ZvcmVncm91bmRDb2xvckFsZXJ0RGlhbG9nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyBCYWNrZ3JvdW5kIENvbG9yIFNlbGVjdGluZyBEaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uU2hvd0JhY2tncm91bmRDb2xvckFsZXJ0KCkgewotICAgICAgICBtRGlhbG9nLm9uU2hvd0JhY2tncm91bmRDb2xvckFsZXJ0RGlhbG9nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyBTaXplIFNlbGVjdGluZyBEaWFsb2cuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9uU2hvd1NpemVBbGVydCgpIHsKLSAgICAgICAgbURpYWxvZy5vblNob3dTaXplQWxlcnREaWFsb2coKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IEFsaWdubWVudCBTZWxlY3RpbmcgRGlhbG9nLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvblNob3dBbGlnbkFsZXJ0KCkgewotICAgICAgICBtRGlhbG9nLm9uU2hvd0FsaWduQWxlcnREaWFsb2coKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZnkgaGludCBtZXNzYWdlcyB3aGF0IGFjdGlvbiBpcyBleHBlY3RlZCB0byBjYWxsaW5nIGNsYXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtc2dJZAotICAgICAqICAgICAgICAgICAgSWQgb2YgdGhlIGhpbnQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0SGludE1lc3NhZ2UoaW50IG1zZ0lkKSB7Ci0gICAgICAgIGlmIChtRVNUSW50ZXJmYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1FU1RJbnRlcmZhY2Uubm90aWZ5SGludE1zZyhtc2dJZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZnkgdGhlIGV2ZW50IHRoYXQgdGhlIG1vZGUgYW5kIHN0YXRlIGFyZSBjaGFuZ2VkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtb2RlCi0gICAgICogICAgICAgICAgICBNb2RlIG9mIHRoZSBlZGl0aW5nIGFjdGlvbi4KLSAgICAgKiBAcGFyYW0gc3RhdGUKLSAgICAgKiAgICAgICAgICAgIE1vZGUgb2YgdGhlIHNlbGVjdGlvbiBzdGF0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5U3RhdGVDaGFuZ2VkKGludCBtb2RlLCBpbnQgc3RhdGUpIHsKLSAgICAgICAgaWYgKG1FU1RJbnRlcmZhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbUVTVEludGVyZmFjZS5ub3RpZnlTdGF0ZUNoYW5nZWQobW9kZSwgc3RhdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRWRpdG9yTWFuYWdlciBtYW5hZ2VzIHRoZSBmbG93IGFuZCBzdGF0dXMgb2YgZWRpdGluZyBhY3Rpb25zLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgRWRpdG9yTWFuYWdlciB7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRWRpdEZsYWcgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Tb2Z0S2V5QmxvY2tGbGFnID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Nb2RlID0gMDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YXRlID0gMDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUN1clN0YXJ0ID0gMDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUN1ckVuZCA9IDA7Ci0gICAgICAgIHByaXZhdGUgRWRpdFN0eWxlZFRleHQgbUVTVDsKLQotICAgICAgICBFZGl0b3JNYW5hZ2VyKEVkaXRTdHlsZWRUZXh0IGVzdCkgewotICAgICAgICAgICAgbUVTVCA9IGVzdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRFZGl0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TdGFydEVkaXQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25zdGFydGVkaXQ6Iik7Ci0gICAgICAgICAgICBoYW5kbGVSZXNldEVkaXQoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25FbmRFZGl0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25FbmRFZGl0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVDYW5jZWwoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydENvcHkoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblN0YXJ0Q29weSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlQ29weSgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0Q3V0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TdGFydEN1dCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlQ3V0KCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRQYXN0ZSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU3RhcnRQYXN0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlUGFzdGUoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFNpemUoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblN0YXJ0U2l6ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlU2l6ZSgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0QWxpZ24oKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblN0YXJ0QWxpZ25SaWdodCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlQWxpZ24oKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydENvbG9yKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja0NvbG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVDb2xvcigpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0QmFja2dyb3VuZENvbG9yKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja0NvbG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRVNULm9uU2hvd0JhY2tncm91bmRDb2xvckFsZXJ0KCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRTZWxlY3QoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrU2VsZWN0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTW9kZSA9IE1PREVfU0VMRUNUOwotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfT0ZGKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVuc2V0U2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ3Vyc29yTW92ZWQoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrVmlldyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfT04gfHwgbVN0YXRlID09IFNUQVRFX1NFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0U2VsZWN0QWxsKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja1NlbGVjdEFsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlU2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRml4U2VsZWN0ZWRJdGVtKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja0NvbXBsZXRlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVDb21wbGV0ZSgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkluc2VydEltYWdlKFVyaSB1cmkpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uSW5zZXJ0SW1hZ2UgYnkgVVJJOiAiICsgdXJpLmdldFBhdGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCIgKyB1cmkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnNlcnRJbWFnZVNwYW4obmV3IEltYWdlU3BhbihtRVNULmdldENvbnRleHQoKSwgdXJpKSk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSW5zZXJ0SW1hZ2UoaW50IHJlc0lEKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkluc2VydEltYWdlIGJ5IHJlc0lEIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnNlcnRJbWFnZVNwYW4obmV3IEltYWdlU3BhbihtRVNULmdldENvbnRleHQoKSwgcmVzSUQpKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25JbnNlcnRIb3Jpem9udGFsTGluZSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uSW5zZXJ0SG9yaXpvbnRhbExpbmU6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnNlcnRJbWFnZVNwYW4obmV3IEhvcml6b250YWxMaW5lU3BhbigweEZGMDAwMDAwLCBtRVNUKSk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xlYXJTdHlsZXMoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsZWFyU3R5bGVzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFZGl0YWJsZSB0eHQgPSBtRVNULmdldFRleHQoKTsKLSAgICAgICAgICAgIGludCBsZW4gPSB0eHQubGVuZ3RoKCk7Ci0gICAgICAgICAgICBPYmplY3RbXSBzdHlsZXMgPSB0eHQuZ2V0U3BhbnMoMCwgbGVuLCBPYmplY3QuY2xhc3MpOwotICAgICAgICAgICAgZm9yIChPYmplY3Qgc3R5bGUgOiBzdHlsZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3R5bGUgaW5zdGFuY2VvZiBQYXJhZ3JhcGhTdHlsZSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUgaW5zdGFuY2VvZiBRdW90ZVNwYW4gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlIGluc3RhbmNlb2YgQ2hhcmFjdGVyU3R5bGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlIGluc3RhbmNlb2YgSW1hZ2VTcGFuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSB0eHQuZ2V0U3BhblN0YXJ0KHN0eWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmQgPSB0eHQuZ2V0U3BhbkVuZChzdHlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eHQucmVwbGFjZShzdGFydCwgZW5kLCAiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdHh0LnJlbW92ZVNwYW4oc3R5bGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FU1Quc2V0QmFja2dyb3VuZERyYXdhYmxlKG1FU1QubURlZmF1bHRCYWNrZ3JvdW5kKTsKLSAgICAgICAgICAgIG1FU1QubUJhY2tncm91bmRDb2xvciA9IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1TaXplKGludCBzaXplKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrU2l6ZUl0ZW0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQgfHwgbVN0YXRlID09IFNUQVRFX1NFTEVDVF9GSVgpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VTaXplU2VsZWN0ZWRUZXh0KHNpemUpOwotICAgICAgICAgICAgICAgIGhhbmRsZVJlc2V0RWRpdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SXRlbUNvbG9yKGludCBjb2xvcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja0NvbG9ySXRlbSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCB8fCBtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX0ZJWCkgewotICAgICAgICAgICAgICAgIGNoYW5nZUNvbG9yU2VsZWN0ZWRUZXh0KGNvbG9yKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVSZXNldEVkaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEFsaWdubWVudChMYXlvdXQuQWxpZ25tZW50IGFsaWduKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkNsaWNrQ29sb3JJdGVtIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEIHx8IG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfRklYKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlQWxpZ24oYWxpZ24pOwotICAgICAgICAgICAgICAgIGhhbmRsZVJlc2V0RWRpdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFZGl0dGluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBtRWRpdEZsYWc7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBJZiB0aGUgc3R5bGUgb2YgdGhlIHNwYW4gaXMgYWRkZWQsIGFkZCBjaGVjayBjYXNlIGZvciB0aGF0IHN0eWxlICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3R5bGVkVGV4dCgpIHsKLSAgICAgICAgICAgIEVkaXRhYmxlIHR4dCA9IG1FU1QuZ2V0VGV4dCgpOwotICAgICAgICAgICAgaW50IGxlbiA9IHR4dC5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmICh0eHQuZ2V0U3BhbnMoMCwgbGVuIC0xLCBQYXJhZ3JhcGhTdHlsZS5jbGFzcykubGVuZ3RoID4gMCB8fAotICAgICAgICAgICAgICAgICAgICB0eHQuZ2V0U3BhbnMoMCwgbGVuIC0xLCBRdW90ZVNwYW4uY2xhc3MpLmxlbmd0aCA+IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgdHh0LmdldFNwYW5zKDAsIGxlbiAtMSwgQ2hhcmFjdGVyU3R5bGUuY2xhc3MpLmxlbmd0aCA+IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgbUVTVC5tQmFja2dyb3VuZENvbG9yICE9IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUikgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTb2Z0S2V5QmxvY2tlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtU29mdEtleUJsb2NrRmxhZzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0RWRpdE1vZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1vZGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldFNlbGVjdFN0YXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uU3RhcnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN1clN0YXJ0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRTZWxlY3Rpb25FbmQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN1ckVuZDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBkb05leHRIYW5kbGUoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBkb05leHRIYW5kbGU6ICIgKyBtTW9kZSArICIsIiArIG1TdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKG1Nb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIE1PREVfQ09QWToKLSAgICAgICAgICAgICAgICBoYW5kbGVDb3B5KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1PREVfQ1VUOgotICAgICAgICAgICAgICAgIGhhbmRsZUN1dCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNT0RFX1BBU1RFOgotICAgICAgICAgICAgICAgIGhhbmRsZVBhc3RlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1PREVfU0laRToKLSAgICAgICAgICAgICAgICBoYW5kbGVTaXplKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1PREVfQ09MT1I6Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ29sb3IoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTU9ERV9BTElHTjoKLSAgICAgICAgICAgICAgICBoYW5kbGVBbGlnbigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDYW5jZWwoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVDYW5jZWwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9OT1RISU5HOwotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNUX09GRjsKLSAgICAgICAgICAgIG1FZGl0RmxhZyA9IGZhbHNlOwotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVDYW5jZWw6IiArIG1FU1QuZ2V0SW5wdXRUeXBlKCkpOwotICAgICAgICAgICAgdW5ibG9ja1NvZnRLZXkoKTsKLSAgICAgICAgICAgIHVuc2V0U2VsZWN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ29tcGxldGUoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVDb21wbGV0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRpdEZsYWcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNUX0ZJWDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRvTmV4dEhhbmRsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRleHRWaWV3RnVuYyhpbnQgbW9kZSwgaW50IGlkKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVUZXh0VmlldzogIiArIG1Nb2RlICsgIiwiICsgbVN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIsIiArIGlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUVkaXRGbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfTk9USElORyB8fCBtTW9kZSA9PSBNT0RFX1NFTEVDVCkgewotICAgICAgICAgICAgICAgIG1Nb2RlID0gbW9kZTsKLSAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVF9GSVg7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRWaWV3RnVuYyhtb2RlLCBpZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtTW9kZSAhPSBtb2RlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ2FuY2VsKCk7Ci0gICAgICAgICAgICAgICAgbU1vZGUgPSBtb2RlOwotICAgICAgICAgICAgICAgIGhhbmRsZVRleHRWaWV3RnVuYyhtb2RlLCBpZCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfRklYKSB7Ci0gICAgICAgICAgICAgICAgbUVTVC5vblRleHRDb250ZXh0TWVudUl0ZW0oaWQpOwotICAgICAgICAgICAgICAgIGhhbmRsZVJlc2V0RWRpdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNvcHkoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVDb3B5OiAiICsgbU1vZGUgKyAiLCIgKyBtU3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlVGV4dFZpZXdGdW5jKE1PREVfQ09QWSwgYW5kcm9pZC5SLmlkLmNvcHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUN1dCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZUNvcHk6ICIgKyBtTW9kZSArICIsIiArIG1TdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVUZXh0Vmlld0Z1bmMoTU9ERV9DVVQsIGFuZHJvaWQuUi5pZC5jdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVBhc3RlKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlUGFzdGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUVkaXRGbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVTVC5vblRleHRDb250ZXh0TWVudUl0ZW0oYW5kcm9pZC5SLmlkLnBhc3RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTZXRTcGFuKGludCBtb2RlKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVTZXRTcGFuOiIgKyBtRWRpdEZsYWcgKyAiLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbVN0YXRlICsgJywnICsgbU1vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRpdEZsYWcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIGhhbmRsZVNldFNwYW46IEVkaXRpbmcgaXMgbm90IHN0YXJ0ZWQuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfTk9USElORyB8fCBtTW9kZSA9PSBNT0RFX1NFTEVDVCkgewotICAgICAgICAgICAgICAgIG1Nb2RlID0gbW9kZTsKLSAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVF9GSVg7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVNldFNwYW4obW9kZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtTW9kZSAhPSBtb2RlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ2FuY2VsKCk7Ci0gICAgICAgICAgICAgICAgbU1vZGUgPSBtb2RlOwotICAgICAgICAgICAgICAgIGhhbmRsZVNldFNwYW4obW9kZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX0ZJWCkgewotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEhpbnRNZXNzYWdlKEhJTlRfTVNHX05VTEwpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNT0RFX0NPTE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgbUVTVC5vblNob3dGb3JlZ3JvdW5kQ29sb3JBbGVydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTU9ERV9TSVpFOgotICAgICAgICAgICAgICAgICAgICAgICAgbUVTVC5vblNob3dTaXplQWxlcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1PREVfQUxJR046Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRVNULm9uU2hvd0FsaWduQWxlcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBoYW5kbGVTZXRTcGFuOiBpbnZhbGlkIG1vZGUuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlU2V0U3BhbjogZG8gbm90aGluZy4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2l6ZSgpIHsKLSAgICAgICAgICAgIGhhbmRsZVNldFNwYW4oTU9ERV9TSVpFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDb2xvcigpIHsKLSAgICAgICAgICAgIGhhbmRsZVNldFNwYW4oTU9ERV9DT0xPUik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlQWxpZ24oKSB7Ci0gICAgICAgICAgICBoYW5kbGVTZXRTcGFuKE1PREVfQUxJR04pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZVNlbGVjdDoiICsgbUVkaXRGbGFnICsgIiwiICsgbVN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUVkaXRGbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfT0ZGKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVGV4dFNlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNlbGVjdGlvbiBpcyBvZmYsIGJ1dCBzZWxlY3RlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RTdGFydFBvcygpOwotICAgICAgICAgICAgICAgIGJsb2NrU29mdEtleSgpOwotICAgICAgICAgICAgICAgIG1FU1Quc2V0SGludE1lc3NhZ2UoSElOVF9NU0dfU0VMRUNUX0VORCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfT04pIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNUZXh0U2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU2VsZWN0aW9uIG5vdyBzdGFydCwgYnV0IHNlbGVjdGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkRW5kUG9zKCk7Ci0gICAgICAgICAgICAgICAgbUVTVC5zZXRIaW50TWVzc2FnZShISU5UX01TR19QVVNIX0NPTVBFVEUpOwotICAgICAgICAgICAgICAgIGRvTmV4dEhhbmRsZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzVGV4dFNlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNlbGVjdGlvbiBpcyBkb25lLCBidXQgbm90IHNlbGVjdGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkRW5kUG9zKCk7Ci0gICAgICAgICAgICAgICAgZG9OZXh0SGFuZGxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0QWxsKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlU2VsZWN0QWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGl0RmxhZykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FU1Quc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RFRDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSZXNldEVkaXQoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIlJlc2V0IEVkaXRvciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmxvY2tTb2Z0S2V5KCk7Ci0gICAgICAgICAgICBoYW5kbGVDYW5jZWwoKTsKLSAgICAgICAgICAgIG1FZGl0RmxhZyA9IHRydWU7Ci0gICAgICAgICAgICBtRVNULnNldEhpbnRNZXNzYWdlKEhJTlRfTVNHX1NFTEVDVF9TVEFSVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc2V0U2VsZWN0aW9uKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TZWxlY3Q6IiArIG1DdXJTdGFydCArICIsIiArIG1DdXJFbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1DdXJTdGFydCA+PSAwICYmIG1DdXJTdGFydCA8PSBtRVNULmdldFRleHQoKS5sZW5ndGgoKQotICAgICAgICAgICAgICAgICAgICAmJiBtQ3VyRW5kID49IDAgJiYgbUN1ckVuZCA8PSBtRVNULmdldFRleHQoKS5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIGlmIChtQ3VyU3RhcnQgPCBtQ3VyRW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FU1Quc2V0U2VsZWN0aW9uKG1DdXJTdGFydCwgbUN1ckVuZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUVTVC5zZXRTZWxlY3Rpb24obUN1ckVuZCwgbUN1clN0YXJ0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNURUQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiU2VsZWN0IGlzIG9uLCBidXQgY3Vyc29yIHBvc2l0aW9ucyBhcmUgaWxsaWdhbC46IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1FU1QuZ2V0VGV4dCgpLmxlbmd0aCgpICsgIiwiICsgbUN1clN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwiICsgbUN1ckVuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdW5zZXRTZWxlY3QoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvZmZTZWxlY3QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBjdXJycG9zID0gbUVTVC5nZXRTZWxlY3Rpb25TdGFydCgpOwotICAgICAgICAgICAgbUVTVC5zZXRTZWxlY3Rpb24oY3VycnBvcywgY3VycnBvcyk7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RfT0ZGOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFNlbGVjdFN0YXJ0UG9zKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gc2V0U2VsZWN0U3RhcnRQb3MiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJTdGFydCA9IG1FU1QuZ2V0U2VsZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVF9PTjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZEVuZFBvcygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHNldFNlbGVjdEVuZFBvczoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRVNULmdldFNlbGVjdGlvblN0YXJ0KCkgPT0gbUN1clN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRFbmRQb3MobUVTVC5nZXRTZWxlY3Rpb25FbmQoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkRW5kUG9zKG1FU1QuZ2V0U2VsZWN0aW9uU3RhcnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEVuZFBvcyhpbnQgcG9zKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBzZXRTZWxlY3RlZEVuZFBvczoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJFbmQgPSBwb3M7Ci0gICAgICAgICAgICBzZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1RleHRTZWxlY3RlZCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGlzVGV4dFNlbGVjdGVkOiIgKyBtQ3VyU3RhcnQgKyAiLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUN1ckVuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKG1DdXJTdGFydCAhPSBtQ3VyRW5kKQotICAgICAgICAgICAgICAgICAgICAmJiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlID09IFNUQVRFX1NFTEVDVF9GSVgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFN0eWxlZFRleHRTcGFuKE9iamVjdCBzcGFuLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHNldFN0eWxlZFRleHRTcGFuOiIgKyBtTW9kZSArICIsIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBzdGFydCArICIsIiArIGVuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhcnQgPCBlbmQpIHsKLSAgICAgICAgICAgICAgICBtRVNULmdldFRleHQoKS5zZXRTcGFuKHNwYW4sIHN0YXJ0LCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUVTVC5nZXRUZXh0KCkuc2V0U3BhbihzcGFuLCBlbmQsIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY2hhbmdlU2l6ZVNlbGVjdGVkVGV4dChpbnQgc2l6ZSkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gY2hhbmdlU2l6ZToiICsgc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRTdHlsZWRUZXh0U3BhbihuZXcgQWJzb2x1dGVTaXplU3BhbihzaXplKSwKLSAgICAgICAgICAgICAgICBtQ3VyU3RhcnQsIG1DdXJFbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoYW5nZUNvbG9yU2VsZWN0ZWRUZXh0KGludCBjb2xvcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gY2hhbmdlQ29sb3I6IiArIGNvbG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFN0eWxlZFRleHRTcGFuKG5ldyBGb3JlZ3JvdW5kQ29sb3JTcGFuKGNvbG9yKSwKLSAgICAgICAgICAgICAgICBtQ3VyU3RhcnQsIG1DdXJFbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoYW5nZUFsaWduKExheW91dC5BbGlnbm1lbnQgYWxpZ24pIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGNoYW5nZUFsaWduOiIgKyBhbGlnbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRTdHlsZWRUZXh0U3BhbihuZXcgQWxpZ25tZW50U3Bhbi5TdGFuZGFyZChhbGlnbiksCi0gICAgICAgICAgICAgICAgICAgIGZpbmRMaW5lU3RhcnQobUVTVC5nZXRUZXh0KCksIG1DdXJTdGFydCksCi0gICAgICAgICAgICAgICAgICAgIGZpbmRMaW5lRW5kKG1FU1QuZ2V0VGV4dCgpLCBtQ3VyRW5kKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBmaW5kTGluZVN0YXJ0KEVkaXRhYmxlIHRleHQsIGludCBjdXJyZW50KSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBmaW5kTGluZVN0YXJ0OiBjdXJyOiIgKyBjdXJyZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIsIGxlbmd0aDoiICsgdGV4dC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgcG9zID0gY3VycmVudDsKLSAgICAgICAgICAgIGZvciAoOyBwb3MgPiAwOyBwb3MtLSkgewotICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChwb3MgLSAxKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwb3M7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaW5zZXJ0SW1hZ2VTcGFuKEltYWdlU3BhbiBzcGFuKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBpbnNlcnRJbWFnZVNwYW4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcGFuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGluc2VydGltYWdlc3BhbjoiICsgc3Bhbi5nZXREcmF3YWJsZSgpLmdldEludHJpbnNpY0hlaWdodCgpICsgIiwiICsgc3Bhbi5nZXREcmF3YWJsZSgpLmdldEludHJpbnNpY1dpZHRoKCkpOwotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaW5zZXJ0aW1hZ2VzcGFuOiIgKyBzcGFuLmdldERyYXdhYmxlKCkuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgICAgICAgICAgaW50IGN1cnBvcyA9IG1FU1QuZ2V0U2VsZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgICAgICAgICBtRVNULmdldFRleHQoKS5pbnNlcnQoY3VycG9zLCAiXHVGRkZDIik7Ci0gICAgICAgICAgICAgICAgbUVTVC5nZXRUZXh0KCkuc2V0U3BhbihzcGFuLCBjdXJwb3MsIGN1cnBvcyArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKLSAgICAgICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBpbnNlcnRJbWFnZVNwYW46IG51bGwgc3BhbiB3YXMgaW5zZXJ0ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRMaW5lRW5kKEVkaXRhYmxlIHRleHQsIGludCBjdXJyZW50KSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBmaW5kTGluZUVuZDogY3VycjoiICsgY3VycmVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCBsZW5ndGg6IiArIHRleHQubGVuZ3RoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHBvcyA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICBmb3IgKDsgcG9zIDwgdGV4dC5sZW5ndGgoKTsgcG9zKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocG9zID4gMCAmJiB0ZXh0LmNoYXJBdChwb3MgLSAxKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwb3M7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYmxvY2tTb2Z0S2V5KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gYmxvY2tTb2Z0S2V5OiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IChJbnB1dE1ldGhvZE1hbmFnZXIpIG1FU1QuZ2V0Q29udGV4dCgpLgotICAgICAgICAgICAgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKLSAgICAgICAgICAgIGltbS5oaWRlU29mdElucHV0RnJvbVdpbmRvdyhtRVNULmdldFdpbmRvd1Rva2VuKCksIDApOwotICAgICAgICAgICAgbUVTVC5zZXRPbkNsaWNrTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb250cmFja2JhbGxjbGljazoiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZpeFNlbGVjdGVkSXRlbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtU29mdEtleUJsb2NrRmxhZyA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdW5ibG9ja1NvZnRLZXkoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSB1bmJsb2NrU29mdEtleToiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FU1Quc2V0T25DbGlja0xpc3RlbmVyKG51bGwpOwotICAgICAgICAgICAgbVNvZnRLZXlCbG9ja0ZsYWcgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU3R5bGVkVGV4dENvbnZlcnRlciB7Ci0gICAgICAgIHByaXZhdGUgRWRpdFN0eWxlZFRleHQgbUVTVDsKLQotICAgICAgICBwdWJsaWMgU3R5bGVkVGV4dENvbnZlcnRlcihFZGl0U3R5bGVkVGV4dCBlc3QpIHsKLSAgICAgICAgICAgIG1FU1QgPSBlc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEh0bWwoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaHRtbEJvZHkgPSBIdG1sLnRvSHRtbChtRVNULmdldFRleHQoKSk7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBnZXRDb252ZXJ0ZWRCb2R5OiIgKyBodG1sQm9keSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaHRtbEJvZHk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBnZXRVcmlBcnJheShBcnJheUxpc3Q8VXJpPiB1cmlzLCBFZGl0YWJsZSB0ZXh0KSB7Ci0gICAgICAgICAgICB1cmlzLmNsZWFyKCk7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBnZXRVcmlBcnJheToiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOwotICAgICAgICAgICAgaW50IG5leHQ7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkgPSBuZXh0KSB7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IHRleHQubmV4dFNwYW5UcmFuc2l0aW9uKGksIGxlbiwgSW1hZ2VTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBJbWFnZVNwYW5bXSBpbWFnZXMgPSB0ZXh0LmdldFNwYW5zKGksIG5leHQsIEltYWdlU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbWFnZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBnZXRVcmlBcnJheTogZm91bmRBcnJheSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEltYWdlU3BhbikgaW1hZ2VzW2pdKS5nZXRTb3VyY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdXJpcy5hZGQoVXJpLnBhcnNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSW1hZ2VTcGFuKSBpbWFnZXNbal0pLmdldFNvdXJjZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0SHRtbCAoU3RyaW5nIGh0bWwpIHsKLSAgICAgICAgICAgIGZpbmFsIFNwYW5uZWQgc3Bhbm5lZCA9IEh0bWwuZnJvbUh0bWwoaHRtbCwgbmV3IEh0bWwuSW1hZ2VHZXR0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIERyYXdhYmxlIGdldERyYXdhYmxlKFN0cmluZyBzcmMpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBzZXRodG1sOiBzcmM9IitzcmMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjLnN0YXJ0c1dpdGgoImNvbnRlbnQ6Ly8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZShzcmMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG1FU1QuZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbSh1cmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVN0cmVhbShpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBuZXcgQml0bWFwRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCksIGJpdG1hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd2FibGUuc2V0Qm91bmRzKDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRyYXdhYmxlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIHNldCBodG1sOiBGYWlsZWQgdG8gbG9hZGVkIGNvbnRlbnQgIiArIHVyaSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIiAgdW5rbm93biBzcmM9IitzcmMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LCBudWxsKTsKLSAgICAgICAgICAgIG1FU1Quc2V0VGV4dChzcGFubmVkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU3R5bGVkVGV4dERpYWxvZyB7Ci0gICAgICAgIEJ1aWxkZXIgbUJ1aWxkZXI7Ci0gICAgICAgIENoYXJTZXF1ZW5jZSBtQ29sb3JUaXRsZTsKLSAgICAgICAgQ2hhclNlcXVlbmNlIG1TaXplVGl0bGU7Ci0gICAgICAgIENoYXJTZXF1ZW5jZSBtQWxpZ25UaXRsZTsKLSAgICAgICAgQ2hhclNlcXVlbmNlW10gbUNvbG9yTmFtZXM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1Db2xvckludHM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1TaXplTmFtZXM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1TaXplRGlzcGxheUludHM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1TaXplU2VuZEludHM7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1BbGlnbk5hbWVzOwotICAgICAgICBFZGl0U3R5bGVkVGV4dCBtRVNUOwotCi0gICAgICAgIHB1YmxpYyBTdHlsZWRUZXh0RGlhbG9nKEVkaXRTdHlsZWRUZXh0IGVzdCkgewotICAgICAgICAgICAgbUVTVCA9IGVzdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEJ1aWxkZXIoQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBtQnVpbGRlciA9IGJ1aWxkZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb2xvckFsZXJ0UGFyYW1zKENoYXJTZXF1ZW5jZSBjb2xvcnRpdGxlLAotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIGNvbG9ybmFtZXMsIENoYXJTZXF1ZW5jZVtdIGNvbG9yaW50cykgewotICAgICAgICAgICAgbUNvbG9yVGl0bGUgPSBjb2xvcnRpdGxlOwotICAgICAgICAgICAgbUNvbG9yTmFtZXMgPSBjb2xvcm5hbWVzOwotICAgICAgICAgICAgbUNvbG9ySW50cyA9IGNvbG9yaW50czsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNpemVBbGVydFBhcmFtcyhDaGFyU2VxdWVuY2Ugc2l6ZXRpdGxlLAotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIHNpemVuYW1lcywgQ2hhclNlcXVlbmNlW10gc2l6ZWRpc3BsYXlpbnRzLAotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIHNpemVzZW5kaW50cykgewotICAgICAgICAgICAgbVNpemVUaXRsZSA9IHNpemV0aXRsZTsKLSAgICAgICAgICAgIG1TaXplTmFtZXMgPSBzaXplbmFtZXM7Ci0gICAgICAgICAgICBtU2l6ZURpc3BsYXlJbnRzID0gc2l6ZWRpc3BsYXlpbnRzOwotICAgICAgICAgICAgbVNpemVTZW5kSW50cyA9IHNpemVzZW5kaW50czsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEFsaWduQWxlcnRQYXJhbXMoQ2hhclNlcXVlbmNlIGFsaWdudGl0bGUsCi0gICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlW10gYWxpZ25uYW1lcykgewotICAgICAgICAgICAgbUFsaWduVGl0bGUgPSBhbGlnbnRpdGxlOwotICAgICAgICAgICAgbUFsaWduTmFtZXMgPSBhbGlnbm5hbWVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQ29sb3JBbGVydFBhcmFtcygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGNoZWNrUGFyYW1zIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gYnVpbGRlciBpcyBudWxsLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUNvbG9yVGl0bGUgPT0gbnVsbCB8fCBtQ29sb3JOYW1lcyA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgIHx8IG1Db2xvckludHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gY29sb3IgYWxlcnQgcGFyYW1zIGFyZSBudWxsLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUNvbG9yTmFtZXMubGVuZ3RoICE9IG1Db2xvckludHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSB0aGUgbGVuZ3RoIG9mIGNvbG9yIGFsZXJ0IHBhcmFtcyBhcmUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGlmZmVyZW50LiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrU2l6ZUFsZXJ0UGFyYW1zKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gY2hlY2tQYXJhbXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBidWlsZGVyIGlzIG51bGwuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU2l6ZVRpdGxlID09IG51bGwgfHwgbVNpemVOYW1lcyA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgIHx8IG1TaXplRGlzcGxheUludHMgPT0gbnVsbCB8fCBtU2l6ZVNlbmRJbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIHNpemUgYWxlcnQgcGFyYW1zIGFyZSBudWxsLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVNpemVOYW1lcy5sZW5ndGggIT0gbVNpemVEaXNwbGF5SW50cy5sZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgJiYgbVNpemVTZW5kSW50cy5sZW5ndGggIT0gbVNpemVEaXNwbGF5SW50cy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIHRoZSBsZW5ndGggb2Ygc2l6ZSBhbGVydCBwYXJhbXMgYXJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImRpZmZlcmVudC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0FsaWduQWxlcnRQYXJhbXMoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBjaGVja0FsaWduQWxlcnRQYXJhbXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBidWlsZGVyIGlzIG51bGwuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQWxpZ25UaXRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBhbGlnbiBhbGVydCBwYXJhbXMgYXJlIG51bGwuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb25TaG93Rm9yZWdyb3VuZENvbG9yQWxlcnREaWFsb2coKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblNob3dGb3JlZ3JvdW5kQ29sb3JBbGVydERpYWxvZyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFjaGVja0NvbG9yQWxlcnRQYXJhbXMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLnNldFRpdGxlKG1Db2xvclRpdGxlKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNldEljb24oMCk7Ci0gICAgICAgICAgICBtQnVpbGRlci4KLSAgICAgICAgICAgIHNldEl0ZW1zKG1Db2xvck5hbWVzLAotICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZCgiRUVUVk0iLCAibUJ1aWxkZXIub25jbGljazoiICsgd2hpY2gpOwotICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IgPSBJbnRlZ2VyLnBhcnNlSW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG1Db2xvckludHNbd2hpY2hdLCAxNikgLSAweDAxMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEl0ZW1Db2xvcihjb2xvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zaG93KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb25TaG93QmFja2dyb3VuZENvbG9yQWxlcnREaWFsb2coKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblNob3dCYWNrZ3JvdW5kQ29sb3JBbGVydERpYWxvZyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFjaGVja0NvbG9yQWxlcnRQYXJhbXMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLnNldFRpdGxlKG1Db2xvclRpdGxlKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNldEljb24oMCk7Ci0gICAgICAgICAgICBtQnVpbGRlci4KLSAgICAgICAgICAgIHNldEl0ZW1zKG1Db2xvck5hbWVzLAotICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZCgiRUVUVk0iLCAibUJ1aWxkZXIub25jbGljazoiICsgd2hpY2gpOwotICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IgPSBJbnRlZ2VyLnBhcnNlSW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG1Db2xvckludHNbd2hpY2hdLCAxNikgLSAweDAxMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zaG93KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb25TaG93U2l6ZUFsZXJ0RGlhbG9nKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TaG93U2l6ZUFsZXJ0RGlhbG9nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWNoZWNrU2l6ZUFsZXJ0UGFyYW1zKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5zZXRUaXRsZShtU2l6ZVRpdGxlKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNldEljb24oMCk7Ci0gICAgICAgICAgICBtQnVpbGRlci4KLSAgICAgICAgICAgIHNldEl0ZW1zKG1TaXplTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJtQnVpbGRlci5vbmNsaWNrOiIgKyB3aGljaCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gSW50ZWdlcgotICAgICAgICAgICAgICAgICAgICAucGFyc2VJbnQoKFN0cmluZykgbVNpemVEaXNwbGF5SW50c1t3aGljaF0pOwotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEl0ZW1TaXplKHNpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2hvdygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG9uU2hvd0FsaWduQWxlcnREaWFsb2coKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblNob3dBbGlnbkFsZXJ0RGlhbG9nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWNoZWNrQWxpZ25BbGVydFBhcmFtcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0VGl0bGUobUFsaWduVGl0bGUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0SWNvbigwKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLgotICAgICAgICAgICAgc2V0SXRlbXMobUFsaWduTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJtQnVpbGRlci5vbmNsaWNrOiIgKyB3aGljaCk7Ci0gICAgICAgICAgICAgICAgICAgIExheW91dC5BbGlnbm1lbnQgYWxpZ24gPSBMYXlvdXQuQWxpZ25tZW50LkFMSUdOX05PUk1BTDsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3aGljaCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9IExheW91dC5BbGlnbm1lbnQuQUxJR05fTk9STUFMOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gTGF5b3V0LkFsaWdubWVudC5BTElHTl9DRU5URVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSBMYXlvdXQuQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtRVNULnNldEFsaWdubWVudChhbGlnbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zaG93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFN0eWxlZFRleHRBcnJvd0tleU1ldGhvZCBleHRlbmRzIEFycm93S2V5TW92ZW1lbnRNZXRob2QgewotICAgICAgICBFZGl0b3JNYW5hZ2VyIG1NYW5hZ2VyOwotICAgICAgICBTdHlsZWRUZXh0QXJyb3dLZXlNZXRob2QoRWRpdG9yTWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgbU1hbmFnZXIgPSBtYW5hZ2VyOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIsCi0gICAgICAgICAgICAgICAgaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBpZiAoIW1NYW5hZ2VyLmlzU29mdEtleUJsb2NrZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24od2lkZ2V0LCBidWZmZXIsIGtleUNvZGUsIGV2ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChleGVjdXRlRG93bih3aWRnZXQsIGJ1ZmZlciwga2V5Q29kZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGdldEVuZFBvcyhUZXh0VmlldyB3aWRnZXQpIHsKLSAgICAgICAgICAgIGludCBlbmQ7Ci0gICAgICAgICAgICBpZiAod2lkZ2V0LmdldFNlbGVjdGlvblN0YXJ0KCkgPT0gbU1hbmFnZXIuZ2V0U2VsZWN0aW9uU3RhcnQoKSkgewotICAgICAgICAgICAgICAgIGVuZCA9IHdpZGdldC5nZXRTZWxlY3Rpb25FbmQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5kID0gd2lkZ2V0LmdldFNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHVwKFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gdXA6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMYXlvdXQgbGF5b3V0ID0gd2lkZ2V0LmdldExheW91dCgpOwotICAgICAgICAgICAgaW50IGVuZCA9IGdldEVuZFBvcyh3aWRnZXQpOwotICAgICAgICAgICAgaW50IGxpbmUgPSBsYXlvdXQuZ2V0TGluZUZvck9mZnNldChlbmQpOwotICAgICAgICAgICAgaWYgKGxpbmUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IHRvOwotICAgICAgICAgICAgICAgIGlmIChsYXlvdXQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpID09Ci0gICAgICAgICAgICAgICAgICAgIGxheW91dC5nZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGggPSBsYXlvdXQuZ2V0UHJpbWFyeUhvcml6b250YWwoZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgdG8gPSBsYXlvdXQuZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lIC0gMSwgaCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdG8gPSBsYXlvdXQuZ2V0TGluZVN0YXJ0KGxpbmUgLSAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU1hbmFnZXIuc2V0U2VsZWN0ZWRFbmRQb3ModG8pOwotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLm9uQ3Vyc29yTW92ZWQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBkb3duKFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZG93bjoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExheW91dCBsYXlvdXQgPSB3aWRnZXQuZ2V0TGF5b3V0KCk7Ci0gICAgICAgICAgICBpbnQgZW5kID0gZ2V0RW5kUG9zKHdpZGdldCk7Ci0gICAgICAgICAgICBpbnQgbGluZSA9IGxheW91dC5nZXRMaW5lRm9yT2Zmc2V0KGVuZCk7Ci0gICAgICAgICAgICBpZiAobGluZSA8IGxheW91dC5nZXRMaW5lQ291bnQoKSAtIDEpIHsKLSAgICAgICAgICAgICAgICBpbnQgdG87Ci0gICAgICAgICAgICAgICAgaWYgKGxheW91dC5nZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSkgPT0KLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lICsgMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgaCA9IGxheW91dC5nZXRQcmltYXJ5SG9yaXpvbnRhbChlbmQpOwotICAgICAgICAgICAgICAgICAgICB0byA9IGxheW91dC5nZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUgKyAxLCBoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0byA9IGxheW91dC5nZXRMaW5lU3RhcnQobGluZSArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTWFuYWdlci5zZXRTZWxlY3RlZEVuZFBvcyh0byk7Ci0gICAgICAgICAgICAgICAgbU1hbmFnZXIub25DdXJzb3JNb3ZlZCgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGxlZnQoVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBsZWZ0OiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGF5b3V0IGxheW91dCA9IHdpZGdldC5nZXRMYXlvdXQoKTsKLSAgICAgICAgICAgIGludCB0byA9IGxheW91dC5nZXRPZmZzZXRUb0xlZnRPZihnZXRFbmRQb3Mod2lkZ2V0KSk7Ci0gICAgICAgICAgICBtTWFuYWdlci5zZXRTZWxlY3RlZEVuZFBvcyh0byk7Ci0gICAgICAgICAgICBtTWFuYWdlci5vbkN1cnNvck1vdmVkKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiByaWdodChUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHJpZ2h0OiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGF5b3V0IGxheW91dCA9IHdpZGdldC5nZXRMYXlvdXQoKTsKLSAgICAgICAgICAgIGludCB0byA9IGxheW91dC5nZXRPZmZzZXRUb1JpZ2h0T2YoZ2V0RW5kUG9zKHdpZGdldCkpOwotICAgICAgICAgICAgbU1hbmFnZXIuc2V0U2VsZWN0ZWRFbmRQb3ModG8pOwotICAgICAgICAgICAgbU1hbmFnZXIub25DdXJzb3JNb3ZlZCgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZXhlY3V0ZURvd24oVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyLAotICAgICAgICAgICAgICAgIGludCBrZXlDb2RlKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBleGVjdXRlRG93bjogIiArIGtleUNvZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgewotICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVA6Ci0gICAgICAgICAgICAgICAgaGFuZGxlZCB8PSB1cCh3aWRnZXQsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOOgotICAgICAgICAgICAgICAgIGhhbmRsZWQgfD0gZG93bih3aWRnZXQsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZUOgotICAgICAgICAgICAgICAgIGhhbmRsZWQgfD0gbGVmdCh3aWRnZXQsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVDoKLSAgICAgICAgICAgICAgICBoYW5kbGVkIHw9IHJpZ2h0KHdpZGdldCwgYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLm9uRml4U2VsZWN0ZWRJdGVtKCk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBoYW5kbGVkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIEhvcml6b250YWxMaW5lU3BhbiBleHRlbmRzIEltYWdlU3BhbiB7Ci0gICAgICAgIHB1YmxpYyBIb3Jpem9udGFsTGluZVNwYW4oaW50IGNvbG9yLCBWaWV3IHZpZXcpIHsKLSAgICAgICAgICAgIHN1cGVyKG5ldyBIb3Jpem9udGFsTGluZURyYXdhYmxlKGNvbG9yLCB2aWV3KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIGNsYXNzIEhvcml6b250YWxMaW5lRHJhd2FibGUgZXh0ZW5kcyBTaGFwZURyYXdhYmxlIHsKLSAgICAgICAgcHJpdmF0ZSBWaWV3IG1WaWV3OwotICAgICAgICBwdWJsaWMgSG9yaXpvbnRhbExpbmVEcmF3YWJsZShpbnQgY29sb3IsIFZpZXcgdmlldykgewotICAgICAgICAgICAgc3VwZXIobmV3IFJlY3RTaGFwZSgpKTsKLSAgICAgICAgICAgIG1WaWV3ID0gdmlldzsKLSAgICAgICAgICAgIHJlbmV3Q29sb3IoY29sb3IpOwotICAgICAgICAgICAgcmVuZXdCb3VuZHModmlldyk7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZHJhdzoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlbmV3Q29sb3IoKTsKLSAgICAgICAgICAgIHJlbmV3Qm91bmRzKG1WaWV3KTsKLSAgICAgICAgICAgIHN1cGVyLmRyYXcoY2FudmFzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCByZW5ld0JvdW5kcyhWaWV3IHZpZXcpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBpbnQgd2lkdGggPSBtVmlldy5nZXRCYWNrZ3JvdW5kKCkuZ2V0Qm91bmRzKCkud2lkdGgoKTsKLSAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gbVZpZXcuZ2V0QmFja2dyb3VuZCgpLmdldEJvdW5kcygpLmhlaWdodCgpOwotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gcmVuZXdCb3VuZHM6IiArIHdpZHRoICsgIiwiICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHJlbmV3Qm91bmRzOiIgKyBtVmlldy5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCB3aWR0aCA9IG1WaWV3LmdldFdpZHRoKCk7Ci0gICAgICAgICAgICBpZiAod2lkdGggPiAyMCkgewotICAgICAgICAgICAgICAgIHdpZHRoIC09IDIwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Qm91bmRzKDAsIDAsIHdpZHRoLCAyKTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgcmVuZXdDb2xvcihpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHJlbmV3Q29sb3I6IiArIGNvbG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldFBhaW50KCkuc2V0Q29sb3IoY29sb3IpOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCByZW5ld0NvbG9yKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gcmVuZXdDb2xvcjoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtVmlldyBpbnN0YW5jZW9mIFZpZXcpIHsKLSAgICAgICAgICAgICAgICBJbWFnZVNwYW4gcGFyZW50ID0gZ2V0UGFyZW50U3BhbigpOwotICAgICAgICAgICAgICAgIEVkaXRhYmxlIHRleHQgPSAoKEVkaXRTdHlsZWRUZXh0KW1WaWV3KS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gdGV4dC5nZXRTcGFuU3RhcnQocGFyZW50KTsKLSAgICAgICAgICAgICAgICBGb3JlZ3JvdW5kQ29sb3JTcGFuW10gc3BhbnMgPSB0ZXh0LmdldFNwYW5zKHN0YXJ0LCBzdGFydCwgRm9yZWdyb3VuZENvbG9yU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZXdDb2xvcihzcGFuc1tzcGFucy5sZW5ndGggLSAxXS5nZXRGb3JlZ3JvdW5kQ29sb3IoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgSW1hZ2VTcGFuIGdldFBhcmVudFNwYW4oKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBnZXRQYXJlbnRTcGFuOiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1WaWV3IGluc3RhbmNlb2YgRWRpdFN0eWxlZFRleHQpIHsKLSAgICAgICAgICAgICAgICBFZGl0YWJsZSB0ZXh0ID0gKChFZGl0U3R5bGVkVGV4dCltVmlldykuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIEltYWdlU3BhbltdIGltYWdlcyA9IHRleHQuZ2V0U3BhbnMoMCwgdGV4dC5sZW5ndGgoKSwgSW1hZ2VTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1hZ2VzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJbWFnZVNwYW4gaW1hZ2U6IGltYWdlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlLmdldERyYXdhYmxlKCkgPT0gdGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbWFnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS1yZW5ld0JvdW5kczogQ291bGRuJ3QgZmluZCIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0lSZW1vdGVWaWV3c0ZhY3RvcnkuYWlkbCBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvSVJlbW90ZVZpZXdzRmFjdG9yeS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOTkwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0lSZW1vdGVWaWV3c0ZhY3RvcnkuYWlkbApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7CisKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKKworLyoqIHtAaGlkZX0gKi8KK2ludGVyZmFjZSBJUmVtb3RlVmlld3NGYWN0b3J5IHsKKyAgICB2b2lkIG9uRGF0YVNldENoYW5nZWQoKTsKKyAgICBpbnQgZ2V0Q291bnQoKTsKKyAgICBSZW1vdGVWaWV3cyBnZXRWaWV3QXQoaW50IHBvc2l0aW9uKTsKKyAgICBSZW1vdGVWaWV3cyBnZXRMb2FkaW5nVmlldygpOworICAgIGludCBnZXRWaWV3VHlwZUNvdW50KCk7CisgICAgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKTsKKyAgICBib29sZWFuIGhhc1N0YWJsZUlkcygpOworfQorCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0xvY2tQYXR0ZXJuVXRpbHMuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCmluZGV4IGM3ODg2MDUuLjkwNDIzYmUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCkBAIC05Niw2ICs5Niw4IEBACiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFTU1dPUkRfVFlQRV9LRVkgPSAibG9ja3NjcmVlbi5wYXNzd29yZF90eXBlIjsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9DS19QQVNTV09SRF9TQUxUX0tFWSA9ICJsb2Nrc2NyZWVuLnBhc3N3b3JkX3NhbHQiOwogCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBU1NXT1JEX0hJU1RPUllfS0VZID0gImxvY2tzY3JlZW4ucGFzc3dvcmRoaXN0b3J5IjsKKwogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwogICAgIHByaXZhdGUgRGV2aWNlUG9saWN5TWFuYWdlciBtRGV2aWNlUG9saWN5TWFuYWdlcjsKQEAgLTE2Myw2ICsxNjUsMzMgQEAKICAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZFF1YWxpdHkobnVsbCk7CiAgICAgfQogCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZEhpc3RvcnlMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRNaW5pbXVtTGV0dGVycygpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlcXVlc3RlZFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1OdW1lcmljKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bU51bWVyaWMobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1TeW1ib2xzKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoKSB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKG51bGwpOworICAgIH0KICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBhY3R1YWwgcGFzc3dvcmQgbW9kZSwgYXMgc2V0IGJ5IGtleWd1YXJkIGFmdGVyIHVwZGF0aW5nIHRoZSBwYXNzd29yZC4KICAgICAgKgpAQCAtMjI3LDYgKzI1NiwzMyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENoZWNrIHRvIHNlZSBpZiBhIHBhc3N3b3JkIG1hdGNoZXMgYW55IG9mIHRoZSBwYXNzd29yZHMgc3RvcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGhpc3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4gV2hldGhlciB0aGUgcGFzc3dvcmQgbWF0Y2hlcyBhbnkgaW4gdGhlIGhpc3RvcnkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tQYXNzd29yZEhpc3RvcnkoU3RyaW5nIHBhc3N3b3JkKSB7CisgICAgICAgIFN0cmluZyBwYXNzd29yZEhhc2hTdHJpbmcgPSBuZXcgU3RyaW5nKHBhc3N3b3JkVG9IYXNoKHBhc3N3b3JkKSk7CisgICAgICAgIFN0cmluZyBwYXNzd29yZEhpc3RvcnkgPSBnZXRTdHJpbmcoUEFTU1dPUkRfSElTVE9SWV9LRVkpOworICAgICAgICBpZiAocGFzc3dvcmRIaXN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBQYXNzd29yZCBIaXN0b3J5IG1heSBiZSB0b28gbG9uZy4uLgorICAgICAgICBpbnQgcGFzc3dvcmRIYXNoTGVuZ3RoID0gcGFzc3dvcmRIYXNoU3RyaW5nLmxlbmd0aCgpOworICAgICAgICBpbnQgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gZ2V0UmVxdWVzdGVkUGFzc3dvcmRIaXN0b3J5TGVuZ3RoKCk7CisgICAgICAgIGlmKHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaW50IG5lZWRlZFBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9IHBhc3N3b3JkSGFzaExlbmd0aCAqIHBhc3N3b3JkSGlzdG9yeUxlbmd0aAorICAgICAgICAgICAgICAgICsgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoIC0gMTsKKyAgICAgICAgaWYgKHBhc3N3b3JkSGlzdG9yeS5sZW5ndGgoKSA+IG5lZWRlZFBhc3N3b3JkSGlzdG9yeUxlbmd0aCkgeworICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gcGFzc3dvcmRIaXN0b3J5LnN1YnN0cmluZygwLCBuZWVkZWRQYXNzd29yZEhpc3RvcnlMZW5ndGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXNzd29yZEhpc3RvcnkuY29udGFpbnMocGFzc3dvcmRIYXNoU3RyaW5nKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIHVzZXIgaGFzIHN0b3JlZCBhIGxvY2sgcGF0dGVybi4KICAgICAgKiBAcmV0dXJuIFdoZXRoZXIgYSBzYXZlZCBwYXR0ZXJuIGV4aXN0cy4KICAgICAgKi8KQEAgLTI3OSw2ICszMzUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgYWN0aXZlUGFzc3dvcmRRdWFsaXR5ID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYOgorICAgICAgICAgICAgICAgIGlmIChpc0xvY2tQYXNzd29yZEVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGFjdGl2ZVBhc3N3b3JkUXVhbGl0eTsKICAgICB9CkBAIC0yODcsOCArMzQ4LDYgQEAKICAgICAgKiBDbGVhciBhbnkgbG9jayBwYXR0ZXJuIG9yIHBhc3N3b3JkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyTG9jaygpIHsKLSAgICAgICAgZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoCi0gICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwKTsKICAgICAgICAgc2F2ZUxvY2tQYXNzd29yZChudWxsLCBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HKTsKICAgICAgICAgc2V0TG9ja1BhdHRlcm5FbmFibGVkKGZhbHNlKTsKICAgICAgICAgc2F2ZUxvY2tQYXR0ZXJuKG51bGwpOwpAQCAtMzAxLDcgKzM2MCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2F2ZUxvY2tQYXR0ZXJuKExpc3Q8TG9ja1BhdHRlcm5WaWV3LkNlbGw+IHBhdHRlcm4pIHsKICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgaGFzaAotICAgICAgICBmaW5hbCBieXRlW10gaGFzaCAgPSBMb2NrUGF0dGVyblV0aWxzLnBhdHRlcm5Ub0hhc2gocGF0dGVybik7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBoYXNoID0gTG9ja1BhdHRlcm5VdGlscy5wYXR0ZXJuVG9IYXNoKHBhdHRlcm4pOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gV3JpdGUgdGhlIGhhc2ggdG8gZmlsZQogICAgICAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShzTG9ja1BhdHRlcm5GaWxlbmFtZSwgInJ3Iik7CkBAIC0zMTYsMTQgKzM3NSwxNSBAQAogICAgICAgICAgICAgaWYgKHBhdHRlcm4gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHNldEJvb2xlYW4oUEFUVEVSTl9FVkVSX0NIT1NFTl9LRVksIHRydWUpOwogICAgICAgICAgICAgICAgIHNldExvbmcoUEFTU1dPUkRfVFlQRV9LRVksIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkcpOwotICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORywgcGF0dGVybi5zaXplKCkpOworICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkcsIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAgICAgICAgIC5zaXplKCksIDAsIDAsIDAsIDAsIDAsIDApOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCwgMCk7CisgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7Ci0gICAgICAgICAgICAvLyBDYW50IGRvIG11Y2gsIHVubGVzcyB3ZSB3YW50IHRvIGZhaWwgb3ZlciB0byB1c2luZyB0aGUgc2V0dGluZ3MgcHJvdmlkZXIKKyAgICAgICAgICAgIC8vIENhbnQgZG8gbXVjaCwgdW5sZXNzIHdlIHdhbnQgdG8gZmFpbCBvdmVyIHRvIHVzaW5nIHRoZSBzZXR0aW5ncworICAgICAgICAgICAgLy8gcHJvdmlkZXIKICAgICAgICAgICAgIExvZy5lKFRBRywgIlVuYWJsZSB0byBzYXZlIGxvY2sgcGF0dGVybiB0byAiICsgc0xvY2tQYXR0ZXJuRmlsZW5hbWUpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgIC8vIENhbnQgZG8gbXVjaApAQCAtMzgxLDE3ICs0NDEsNTkgQEAKICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIgZHBtID0gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpOwogICAgICAgICAgICAgaWYgKHBhc3N3b3JkICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpbnQgY29tcHV0ZWRRdWFsaXR5ID0gY29tcHV0ZVBhc3N3b3JkUXVhbGl0eShwYXNzd29yZCk7Ci0gICAgICAgICAgICAgICAgc2V0TG9uZyhQQVNTV09SRF9UWVBFX0tFWSwgY29tcHV0ZWRRdWFsaXR5KTsKKyAgICAgICAgICAgICAgICBzZXRMb25nKFBBU1NXT1JEX1RZUEVfS0VZLCBNYXRoLm1heChxdWFsaXR5LCBjb21wdXRlZFF1YWxpdHkpKTsKICAgICAgICAgICAgICAgICBpZiAoY29tcHV0ZWRRdWFsaXR5ICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCkgewotICAgICAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShjb21wdXRlZFF1YWxpdHksIHBhc3N3b3JkLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxldHRlcnMgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgdXBwZXJjYXNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxvd2VyY2FzZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN5bWJvbHMgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgbm9ubGV0dGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXNzd29yZC5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSBwYXNzd29yZC5jaGFyQXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXR0ZXJzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJjYXNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0dGVycysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyY2FzZSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25sZXR0ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9scysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmxldHRlcisrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKE1hdGgubWF4KHF1YWxpdHksIGNvbXB1dGVkUXVhbGl0eSksIHBhc3N3b3JkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCgpLCBsZXR0ZXJzLCB1cHBlcmNhc2UsIGxvd2VyY2FzZSwgbnVtYmVycywgc3ltYm9scywgbm9ubGV0dGVyKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcGFzc3dvcmQgaXMgbm90IGFueXRoaW5nLgogICAgICAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgcGFzc3dvcmQgdG8gdGhlIHBhc3N3b3JkIGhpc3RvcnkuIFdlIGFzc3VtZSBhbGwKKyAgICAgICAgICAgICAgICAvLyBwYXNzd29yZAorICAgICAgICAgICAgICAgIC8vIGhhc2hlcyBoYXZlIHRoZSBzYW1lIGxlbmd0aCBmb3Igc2ltcGxpY2l0eSBvZiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmRIaXN0b3J5ID0gZ2V0U3RyaW5nKFBBU1NXT1JEX0hJU1RPUllfS0VZKTsKKyAgICAgICAgICAgICAgICBpZiAocGFzc3dvcmRIaXN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gbmV3IFN0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gZ2V0UmVxdWVzdGVkUGFzc3dvcmRIaXN0b3J5TGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkSGlzdG9yeSA9ICIiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkSGlzdG9yeSA9IG5ldyBTdHJpbmcoaGFzaCkgKyAiLCIgKyBwYXNzd29yZEhpc3Rvcnk7CisgICAgICAgICAgICAgICAgICAgIC8vIEN1dCBpdCB0byBjb250YWluIHBhc3N3b3JkSGlzdG9yeUxlbmd0aCBoYXNoZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHBhc3N3b3JkSGlzdG9yeUxlbmd0aCAtMSBjb21tYXMuCisgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkSGlzdG9yeSA9IHBhc3N3b3JkSGlzdG9yeS5zdWJzdHJpbmcoMCwgTWF0aC5taW4oaGFzaC5sZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBhc3N3b3JkSGlzdG9yeUxlbmd0aCArIHBhc3N3b3JkSGlzdG9yeUxlbmd0aCAtIDEsIHBhc3N3b3JkSGlzdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGgoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXRTdHJpbmcoUEFTU1dPUkRfSElTVE9SWV9LRVksIHBhc3N3b3JkSGlzdG9yeSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7CiAgICAgICAgICAgICAvLyBDYW50IGRvIG11Y2gsIHVubGVzcyB3ZSB3YW50IHRvIGZhaWwgb3ZlciB0byB1c2luZyB0aGUgc2V0dGluZ3MgcHJvdmlkZXIKQEAgLTUzMSw3ICs2MzMsOCBAQAogICAgICAgICByZXR1cm4gc2F2ZWRQYXNzd29yZEV4aXN0cygpICYmCiAgICAgICAgICAgICAgICAgKG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUMKICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX05VTUVSSUMKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQyk7CisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjU1LDEyICs3NTgsMjEgQEAKICAgICAgICAgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUucHV0TG9uZyhtQ29udGVudFJlc29sdmVyLCBzZWN1cmVTZXR0aW5nS2V5LCB2YWx1ZSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBzZWN1cmVTZXR0aW5nS2V5KSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcobUNvbnRlbnRSZXNvbHZlciwgc2VjdXJlU2V0dGluZ0tleSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFN0cmluZyhTdHJpbmcgc2VjdXJlU2V0dGluZ0tleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhtQ29udGVudFJlc29sdmVyLCBzZWN1cmVTZXR0aW5nS2V5LCB2YWx1ZSk7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CiAgICAgICAgIGxvbmcgbW9kZSA9IGdldEtleWd1YXJkU3RvcmVkUGFzc3dvcmRRdWFsaXR5KCk7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQYXR0ZXJuID0gbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HOwogICAgICAgICBmaW5hbCBib29sZWFuIGlzUGFzc3dvcmQgPSBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDCiAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQwotICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQzsKKyAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMKKyAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYOwogICAgICAgICBmaW5hbCBib29sZWFuIHNlY3VyZSA9IGlzUGF0dGVybiAmJiBpc0xvY2tQYXR0ZXJuRW5hYmxlZCgpICYmIHNhdmVkUGF0dGVybkV4aXN0cygpCiAgICAgICAgICAgICAgICAgfHwgaXNQYXNzd29yZCAmJiBzYXZlZFBhc3N3b3JkRXhpc3RzKCk7CiAgICAgICAgIHJldHVybiBzZWN1cmU7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1Bhc3N3b3JkRW50cnlLZXlib2FyZC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9QYXNzd29yZEVudHJ5S2V5Ym9hcmQuamF2YQppbmRleCBlMWE2NzM3Li5mYWNkYTM2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1Bhc3N3b3JkRW50cnlLZXlib2FyZC5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvUGFzc3dvcmRFbnRyeUtleWJvYXJkLmphdmEKQEAgLTY3LDggKzY3LDIyIEBACiAgICAgICAgIHRoaXMoY29udGV4dCwgeG1sTGF5b3V0UmVzSWQsIDApOwogICAgIH0KIAorICAgIHB1YmxpYyBQYXNzd29yZEVudHJ5S2V5Ym9hcmQoQ29udGV4dCBjb250ZXh0LCBpbnQgeG1sTGF5b3V0UmVzSWQsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIHhtbExheW91dFJlc0lkLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisKICAgICBwdWJsaWMgUGFzc3dvcmRFbnRyeUtleWJvYXJkKENvbnRleHQgY29udGV4dCwgaW50IHhtbExheW91dFJlc0lkLCBpbnQgbW9kZSkgewogICAgICAgICBzdXBlcihjb250ZXh0LCB4bWxMYXlvdXRSZXNJZCwgbW9kZSk7CisgICAgICAgIGluaXQoY29udGV4dCk7CisgICAgfQorCisgICAgcHVibGljIFBhc3N3b3JkRW50cnlLZXlib2FyZChDb250ZXh0IGNvbnRleHQsIGludCB4bWxMYXlvdXRSZXNJZCwgaW50IG1vZGUsCisgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgeG1sTGF5b3V0UmVzSWQsIG1vZGUsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBpbml0KGNvbnRleHQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0KENvbnRleHQgY29udGV4dCkgewogICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKTsKICAgICAgICAgbVJlcyA9IHJlczsKICAgICAgICAgbVNoaWZ0SWNvbiA9IHJlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLnN5bV9rZXlib2FyZF9zaGlmdCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1Bhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9QYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuamF2YQppbmRleCA1MzcyMGU0Li4zODRmN2JjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1Bhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyLmphdmEKQEAgLTU0LDEwICs1NCwyMCBAQAogICAgIHByaXZhdGUgVmlicmF0b3IgbVZpYnJhdG9yOwogCiAgICAgcHVibGljIFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlcihDb250ZXh0IGNvbnRleHQsIEtleWJvYXJkVmlldyBrZXlib2FyZFZpZXcsIFZpZXcgdGFyZ2V0VmlldykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGtleWJvYXJkVmlldywgdGFyZ2V0VmlldywgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlcihDb250ZXh0IGNvbnRleHQsIEtleWJvYXJkVmlldyBrZXlib2FyZFZpZXcsIFZpZXcgdGFyZ2V0VmlldywKKyAgICAgICAgICAgIGJvb2xlYW4gdXNlRnVsbFNjcmVlbldpZHRoKSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVRhcmdldFZpZXcgPSB0YXJnZXRWaWV3OwogICAgICAgICBtS2V5Ym9hcmRWaWV3ID0ga2V5Ym9hcmRWaWV3OwotICAgICAgICBjcmVhdGVLZXlib2FyZHMoKTsKKyAgICAgICAgaWYgKHVzZUZ1bGxTY3JlZW5XaWR0aCB8fCBtS2V5Ym9hcmRWaWV3LmdldExheW91dFBhcmFtcygpLndpZHRoID09IC0xKSB7CisgICAgICAgICAgICBjcmVhdGVLZXlib2FyZHMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNyZWF0ZUtleWJvYXJkc1dpdGhTcGVjaWZpY1NpemUobUtleWJvYXJkVmlldy5nZXRMYXlvdXRQYXJhbXMoKS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgbUtleWJvYXJkVmlldy5nZXRMYXlvdXRQYXJhbXMoKS5oZWlnaHQpOworICAgICAgICB9CiAgICAgICAgIG1LZXlib2FyZFZpZXcuc2V0T25LZXlib2FyZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwogICAgICAgICBtVmlicmF0b3IgPSBuZXcgVmlicmF0b3IoKTsKICAgICB9CkBAIC02Niw2ICs3NiwyOSBAQAogICAgICAgICByZXR1cm4gbUtleWJvYXJkTW9kZSA9PSBLRVlCT0FSRF9NT0RFX0FMUEhBOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBjcmVhdGVLZXlib2FyZHNXaXRoU3BlY2lmaWNTaXplKGludCB2aWV3V2lkdGgsIGludCB2aWV3SGVpZ2h0KSB7CisgICAgICAgIG1OdW1lcmljS2V5Ym9hcmQgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkKG1Db250ZXh0LCBSLnhtbC5wYXNzd29yZF9rYmRfbnVtZXJpYywKKyAgICAgICAgICAgICAgICB2aWV3V2lkdGgsIHZpZXdIZWlnaHQpOworICAgICAgICBtUXdlcnR5S2V5Ym9hcmQgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkKG1Db250ZXh0LAorICAgICAgICAgICAgICAgIFIueG1sLnBhc3N3b3JkX2tiZF9xd2VydHksIFIuaWQubW9kZV9ub3JtYWwsIHZpZXdXaWR0aCwgdmlld0hlaWdodCk7CisgICAgICAgIG1Rd2VydHlLZXlib2FyZC5lbmFibGVTaGlmdExvY2soKTsKKworICAgICAgICBtUXdlcnR5S2V5Ym9hcmRTaGlmdGVkID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZChtQ29udGV4dCwKKyAgICAgICAgICAgICAgICBSLnhtbC5wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQsCisgICAgICAgICAgICAgICAgUi5pZC5tb2RlX25vcm1hbCwgdmlld1dpZHRoLCB2aWV3SGVpZ2h0KTsKKyAgICAgICAgbVF3ZXJ0eUtleWJvYXJkU2hpZnRlZC5lbmFibGVTaGlmdExvY2soKTsKKyAgICAgICAgbVF3ZXJ0eUtleWJvYXJkU2hpZnRlZC5zZXRTaGlmdGVkKHRydWUpOyAvLyBhbHdheXMgc2hpZnRlZC4KKworICAgICAgICBtU3ltYm9sc0tleWJvYXJkID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZChtQ29udGV4dCwgUi54bWwucGFzc3dvcmRfa2JkX3N5bWJvbHMsCisgICAgICAgICAgICAgICAgdmlld1dpZHRoLCB2aWV3SGVpZ2h0KTsKKyAgICAgICAgbVN5bWJvbHNLZXlib2FyZC5lbmFibGVTaGlmdExvY2soKTsKKworICAgICAgICBtU3ltYm9sc0tleWJvYXJkU2hpZnRlZCA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmQobUNvbnRleHQsCisgICAgICAgICAgICAgICAgUi54bWwucGFzc3dvcmRfa2JkX3N5bWJvbHNfc2hpZnQsIHZpZXdXaWR0aCwgdmlld0hlaWdodCk7CisgICAgICAgIG1TeW1ib2xzS2V5Ym9hcmRTaGlmdGVkLmVuYWJsZVNoaWZ0TG9jaygpOworICAgICAgICBtU3ltYm9sc0tleWJvYXJkU2hpZnRlZC5zZXRTaGlmdGVkKHRydWUpOyAvLyBhbHdheXMgc2hpZnRlZAorICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBjcmVhdGVLZXlib2FyZHMoKSB7CiAgICAgICAgIG1OdW1lcmljS2V5Ym9hcmQgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkKG1Db250ZXh0LCBSLnhtbC5wYXNzd29yZF9rYmRfbnVtZXJpYyk7CiAgICAgICAgIG1Rd2VydHlLZXlib2FyZCA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmQobUNvbnRleHQsCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1NsaWRpbmdUYWIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2xpZGluZ1RhYi5qYXZhCmluZGV4IDkxNTI3MjkuLjRiNTZjYjQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2xpZGluZ1RhYi5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2xpZGluZ1RhYi5qYXZhCkBAIC0xNywxMCArMTcsOCBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuVmlicmF0b3I7CkBAIC0zOCw2ICszNiw3IEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldy5TY2FsZVR5cGU7CisKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogCiAvKioKQEAgLTY5LDIxICs2OCwyMSBAQAogICAgIHByaXZhdGUgaW50IG1HcmFiYmVkU3RhdGUgPSBPblRyaWdnZXJMaXN0ZW5lci5OT19IQU5ETEU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1UcmlnZ2VyZWQgPSBmYWxzZTsKICAgICBwcml2YXRlIFZpYnJhdG9yIG1WaWJyYXRvcjsKLSAgICBwcml2YXRlIGZsb2F0IG1EZW5zaXR5OyAvLyB1c2VkIHRvIHNjYWxlIGRpbWVuc2lvbnMgZm9yIGJpdG1hcHMuCisgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBtRGVuc2l0eTsgLy8gdXNlZCB0byBzY2FsZSBkaW1lbnNpb25zIGZvciBiaXRtYXBzLgogCiAgICAgLyoqCiAgICAgICogRWl0aGVyIHtAbGluayAjSE9SSVpPTlRBTH0gb3Ige0BsaW5rICNWRVJUSUNBTH0uCiAgICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbU9yaWVudGF0aW9uOworICAgIHByaXZhdGUgZmluYWwgaW50IG1PcmllbnRhdGlvbjsKIAotICAgIHByaXZhdGUgU2xpZGVyIG1MZWZ0U2xpZGVyOwotICAgIHByaXZhdGUgU2xpZGVyIG1SaWdodFNsaWRlcjsKKyAgICBwcml2YXRlIGZpbmFsIFNsaWRlciBtTGVmdFNsaWRlcjsKKyAgICBwcml2YXRlIGZpbmFsIFNsaWRlciBtUmlnaHRTbGlkZXI7CiAgICAgcHJpdmF0ZSBTbGlkZXIgbUN1cnJlbnRTbGlkZXI7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1UcmFja2luZzsKICAgICBwcml2YXRlIGZsb2F0IG1UaHJlc2hvbGQ7CiAgICAgcHJpdmF0ZSBTbGlkZXIgbU90aGVyU2xpZGVyOwogICAgIHByaXZhdGUgYm9vbGVhbiBtQW5pbWF0aW5nOwotICAgIHByaXZhdGUgUmVjdCBtVG1wUmVjdDsKKyAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVRtcFJlY3Q7CiAKICAgICAvKioKICAgICAgKiBMaXN0ZW5lciB1c2VkIHRvIHJlc2V0IHRoZSB2aWV3IHdoZW4gdGhlIGN1cnJlbnQgYW5pbWF0aW9uIGNvbXBsZXRlcy4KQEAgLTQ3NSwxMCArNDc0LDEzIEBACiAgICAgICAgIGludCBoZWlnaHRTcGVjTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUoaGVpZ2h0TWVhc3VyZVNwZWMpOwogICAgICAgICBpbnQgaGVpZ2h0U3BlY1NpemUgPSAgTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7CiAKLSAgICAgICAgaWYgKHdpZHRoU3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQgfHwgaGVpZ2h0U3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgICAgIExvZy5lKCJTbGlkaW5nVGFiIiwgIlNsaWRpbmdUYWIgY2Fubm90IGhhdmUgVU5TUEVDSUZJRUQgTWVhc3VyZVNwZWMiCi0gICAgICAgICAgICAgICAgICAgICsiKHdzcGVjPSIgKyB3aWR0aFNwZWNNb2RlICsgIiwgaHNwZWM9IiArIGhlaWdodFNwZWNNb2RlICsgIikiLAotICAgICAgICAgICAgICAgICAgICBuZXcgUnVudGltZUV4Y2VwdGlvbihMT0dfVEFHICsgInN0YWNrOiIpKTsKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgaWYgKHdpZHRoU3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQgCisgICAgICAgICAgICAgICAgICAgIHx8IGhlaWdodFNwZWNNb2RlID09IE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoIlNsaWRpbmdUYWIiLCAiU2xpZGluZ1RhYiBjYW5ub3QgaGF2ZSBVTlNQRUNJRklFRCBNZWFzdXJlU3BlYyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsiKHdzcGVjPSIgKyB3aWR0aFNwZWNNb2RlICsgIiwgaHNwZWM9IiArIGhlaWdodFNwZWNNb2RlICsgIikiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTE9HX1RBRyArICJzdGFjazoiKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBtTGVmdFNsaWRlci5tZWFzdXJlKCk7CkBAIC02MDgsMTQgKzYxMCw3IEBACiAKICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6Ci0gICAgICAgICAgICAgICAgICAgIG1UcmFja2luZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtVHJpZ2dlcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1PdGhlclNsaWRlci5zaG93KHRydWUpOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNsaWRlci5yZXNldChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2xpZGVyLmhpZGVUYXJnZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTbGlkZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBtT3RoZXJTbGlkZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBzZXRHcmFiYmVkU3RhdGUoT25UcmlnZ2VyTGlzdGVuZXIuTk9fSEFORExFKTsKKyAgICAgICAgICAgICAgICAgICAgY2FuY2VsR3JhYigpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjIzLDYgKzYxOCwxNyBAQAogICAgICAgICByZXR1cm4gbVRyYWNraW5nIHx8IHN1cGVyLm9uVG91Y2hFdmVudChldmVudCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbEdyYWIoKSB7CisgICAgICAgIG1UcmFja2luZyA9IGZhbHNlOworICAgICAgICBtVHJpZ2dlcmVkID0gZmFsc2U7CisgICAgICAgIG1PdGhlclNsaWRlci5zaG93KHRydWUpOworICAgICAgICBtQ3VycmVudFNsaWRlci5yZXNldChmYWxzZSk7CisgICAgICAgIG1DdXJyZW50U2xpZGVyLmhpZGVUYXJnZXQoKTsKKyAgICAgICAgbUN1cnJlbnRTbGlkZXIgPSBudWxsOworICAgICAgICBtT3RoZXJTbGlkZXIgPSBudWxsOworICAgICAgICBzZXRHcmFiYmVkU3RhdGUoT25UcmlnZ2VyTGlzdGVuZXIuTk9fSEFORExFKTsKKyAgICB9CisKICAgICB2b2lkIHN0YXJ0QW5pbWF0aW5nKGZpbmFsIGJvb2xlYW4gaG9sZEFmdGVyKSB7CiAgICAgICAgIG1BbmltYXRpbmcgPSB0cnVlOwogICAgICAgICBmaW5hbCBBbmltYXRpb24gdHJhbnMxOwpAQCAtODMyLDYgKzgzOCwxNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25WaXNpYmlsaXR5Q2hhbmdlZChWaWV3IGNoYW5nZWRWaWV3LCBpbnQgdmlzaWJpbGl0eSkgeworICAgICAgICBzdXBlci5vblZpc2liaWxpdHlDaGFuZ2VkKGNoYW5nZWRWaWV3LCB2aXNpYmlsaXR5KTsKKyAgICAgICAgLy8gV2hlbiB2aXNpYmlsaXR5IGNoYW5nZXMgYW5kIHRoZSB1c2VyIGhhcyBhIHRhYiBzZWxlY3RlZCwgdW5zZWxlY3QgaXQgYW5kCisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGVpciBjYWxsYmFjayBnZXRzIGNhbGxlZC4KKyAgICAgICAgaWYgKGNoYW5nZWRWaWV3ID09IHRoaXMgJiYgdmlzaWJpbGl0eSAhPSBWSVNJQkxFCisgICAgICAgICAgICAgICAgJiYgbUdyYWJiZWRTdGF0ZSAhPSBPblRyaWdnZXJMaXN0ZW5lci5OT19IQU5ETEUpIHsKKyAgICAgICAgICAgIGNhbmNlbEdyYWIoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGN1cnJlbnQgZ3JhYmJlZCBzdGF0ZSwgYW5kIGRpc3BhdGNoZXMgYSBncmFiYmVkIHN0YXRlIGNoYW5nZQogICAgICAqIGV2ZW50IHRvIG91ciBsaXN0ZW5lci4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvY2Fyb3VzZWwucnMgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L2Nhcm91c2VsLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZTI0YzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L2Nhcm91c2VsLnJzCkBAIC0wLDAgKzEsNzg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldCkKKyNwcmFnbWEgcnMgc2V0X3JlZmxlY3RfbGljZW5zZSgpCisKKyNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKSBDYXJkIHsKKyAgICByc19hbGxvY2F0aW9uIHRleHR1cmU7CisgICAgcnNfbWVzaCBnZW9tZXRyeTsKKyAgICAvL3JzX21hdHJpeDR4NCBtYXRyaXg7IC8vIGN1c3RvbSB0cmFuc2Zvcm0gZm9yIHRoaXMgY2FyZC9nZW9tZXRyeQorICAgIGludCB0ZXh0dXJlU3RhdGU7ICAvLyB3aGV0aGVyIG9yIG5vdCB0aGUgdGV4dHVyZSBpcyBsb2FkZWQuCisgICAgaW50IGdlb21ldHJ5U3RhdGU7IC8vIHdoZXRoZXIgb3Igbm90IGdlb21ldHJ5IGlzIGxvYWRlZAorICAgIGludCB2aXNpYmxlOyAvLyBub3QgYm9vbCBiZWNhdXNlIG9mIHBhY2tpbmcgYnVnPworfSBDYXJkX3Q7CisKK3R5cGVkZWYgc3RydWN0IFJheV9zIHsKKyAgICBmbG9hdDMgcG9zaXRpb247CisgICAgZmxvYXQzIGRpcmVjdGlvbjsKK30gUmF5OworCit0eXBlZGVmIHN0cnVjdCBQZXJzcGVjdGl2ZUNhbWVyYV9zIHsKKyAgICBmbG9hdDMgZnJvbTsKKyAgICBmbG9hdDMgYXQ7CisgICAgZmxvYXQzIHVwOworICAgIGZsb2F0ICBmb3Y7CisgICAgZmxvYXQgIGFzcGVjdDsKKyAgICBmbG9hdCAgbmVhcjsKKyAgICBmbG9hdCAgZmFyOworfSBQZXJzcGVjdGl2ZUNhbWVyYTsKKworLy8gUmVxdWVzdCBzdGF0ZXMuIFVzZWQgZm9yIGxvYWRpbmcgM0Qgb2JqZWN0IHByb3BlcnRpZXMgZnJvbSB0aGUgSmF2YSBjbGllbnQuCisvLyBUeXBpY2FsIHByb3BlcnRpZXM6IHRleHR1cmUsIGdlb21ldHJ5IGFuZCBtYXRyaWNlcy4KK2VudW0geworICAgIFNUQVRFX0lOVkFMSUQgPSAwLCAvLyBpdGVtIGhhc24ndCBiZWVuIGxvYWRlZAorICAgIFNUQVRFX0xPQURJTkcsIC8vIHdlJ3ZlIHJlcXVlc3RlZCBhbiBpdGVtIGJ1dCBhcmUgd2FpdGluZyBmb3IgaXQgdG8gbG9hZAorICAgIFNUQVRFX0xPQURFRCAvLyBpdGVtIHdhcyBkZWxpdmVyZWQKK307CisKKy8vIENsaWVudCBtZXNzYWdlcyAqKiogVEhJUyBMSVNUIE1VU1QgTUFUQ0ggVEhPU0UgSU4gQ2Fyb3VzZWxSUy5qYXZhLiAqKioKK3N0YXRpYyBjb25zdCBpbnQgQ01EX0NBUkRfU0VMRUNURUQgPSAxMDA7CitzdGF0aWMgY29uc3QgaW50IENNRF9SRVFVRVNUX1RFWFRVUkUgPSAyMDA7CitzdGF0aWMgY29uc3QgaW50IENNRF9JTlZBTElEQVRFX1RFWFRVUkUgPSAyMTA7CitzdGF0aWMgY29uc3QgaW50IENNRF9SRVFVRVNUX0dFT01FVFJZID0gMzAwOworc3RhdGljIGNvbnN0IGludCBDTURfSU5WQUxJREFURV9HRU9NRVRSWSA9IDMxMDsKK3N0YXRpYyBjb25zdCBpbnQgQ01EX0FOSU1BVElPTl9TVEFSVEVEID0gNDAwOworc3RhdGljIGNvbnN0IGludCBDTURfQU5JTUFUSU9OX0ZJTklTSEVEID0gNTAwOworc3RhdGljIGNvbnN0IGludCBDTURfUElORyA9IDYwMDsKKworLy8gQ29uc3RhbnRzCitzdGF0aWMgY29uc3QgaW50IEFOSU1BVElPTl9TQ0FMRV9USU1FID0gMjAwOyAvLyBUaW1lIGl0IHRha2VzIHRvIGFuaW1hdGUgc2VsZWN0ZWQgY2FyZCwgaW4gbXMKK3N0YXRpYyBjb25zdCBmbG9hdDMgU0VMRUNURURfU0NBTEVfRkFDVE9SID0geyAwLjJmLCAwLjJmLCAwLjJmIH07IC8vIGluY3JlYXNlIGJ5IHRoaXMgJQorCisvLyBEZWJ1ZyBmbGFncworYm9vbCBkZWJ1Z0NhbWVyYSA9IGZhbHNlOyAvLyBkdW1wcyByYXkvY2FtZXJhIGNvb3JkaW5hdGUgc3R1ZmYKK2Jvb2wgZGVidWdQaWNraW5nID0gZmFsc2U7IC8vIHJlbmRlcnMgcGlja2luZyBhcmVhIG9uIHRvcCBvZiBnZW9tZXRyeQorCisvLyBFeHBvcnRlZCB2YXJpYWJsZXMuIFRoZXNlIHdpbGwgYmUgcmVmbGVjdGVkIHRvIEphdmEgc2V0XyogdmFyaWFibGVzLgorQ2FyZF90ICpjYXJkczsgLy8gYXJyYXkgb2YgY2FyZHMgdG8gZHJhdworZmxvYXQgc3RhcnRBbmdsZTsgLy8gcG9zaXRpb24gb2YgaW5pdGlhbCBjYXJkLCBpbiByYWRpYW5zCitpbnQgc2xvdENvdW50OyAvLyBudW1iZXIgb2YgcG9zaXRpb25zIHdoZXJlIGEgY2FyZCBjYW4gYmUKK2ludCBjYXJkQ291bnQ7IC8vIG51bWJlciBvZiBjYXJkcyBpbiBzdGFjaworaW50IHZpc2libGVTbG90Q291bnQ7IC8vIG51bWJlciBvZiB2aXNpYmxlIHNsb3RzIChmb3IgY3VsbGluZykKK2Zsb2F0IHJhZGl1czsgLy8gY2Fyb3VzZWwgcmFkaXVzLiBDYXJkcyB3aWxsIGJlIGNlbnRlcmVkIG9uIGEgY2lyY2xlIHdpdGggdGhpcyByYWRpdXMKK2Zsb2F0IGNhcmRSb3RhdGlvbjsgLy8gcm90YXRpb24gb2YgY2FyZCBpbiBYWSBwbGFuZSByZWxhdGl2ZSB0byBaPTEKK3JzX3Byb2dyYW1fc3RvcmUgcHJvZ3JhbVN0b3JlOworcnNfcHJvZ3JhbV9mcmFnbWVudCBmcmFnbWVudFByb2dyYW07Cityc19wcm9ncmFtX3ZlcnRleCB2ZXJ0ZXhQcm9ncmFtOworcnNfcHJvZ3JhbV9yYXN0ZXIgcmFzdGVyUHJvZ3JhbTsKK3JzX2FsbG9jYXRpb24gZGVmYXVsdFRleHR1cmU7IC8vIHNob3duIHdoZW4gbm8gb3RoZXIgdGV4dHVyZSBpcyBhc3NpZ25lZAorcnNfYWxsb2NhdGlvbiBsb2FkaW5nVGV4dHVyZTsgLy8gcHJvZ3Jlc3MgdGV4dHVyZSAoc2hvd24gd2hlbiBhcHAgaXMgZmV0Y2hpbmcgdGhlIHRleHR1cmUpCityc19tZXNoIGRlZmF1bHRHZW9tZXRyeTsgLy8gc2hvd24gd2hlbiBubyBnZW9tZXRyeSBpcyBsb2FkZWQKK3JzX21lc2ggbG9hZGluZ0dlb21ldHJ5OyAvLyBzaG93biB3aGVuIGdlb21ldHJ5IGlzIGxvYWRpbmcKK3JzX21hdHJpeDR4NCBwcm9qZWN0aW9uTWF0cml4OworcnNfbWF0cml4NHg0IG1vZGVsdmlld01hdHJpeDsKKworI3ByYWdtYSBycyBleHBvcnRfdmFyKHJhZGl1cywgY2FyZHMsIHNsb3RDb3VudCwgdmlzaWJsZVNsb3RDb3VudCwgY2FyZFJvdGF0aW9uKQorI3ByYWdtYSBycyBleHBvcnRfdmFyKHByb2dyYW1TdG9yZSwgZnJhZ21lbnRQcm9ncmFtLCB2ZXJ0ZXhQcm9ncmFtLCByYXN0ZXJQcm9ncmFtKQorI3ByYWdtYSBycyBleHBvcnRfdmFyKHN0YXJ0QW5nbGUsIGRlZmF1bHRUZXh0dXJlLCBsb2FkaW5nVGV4dHVyZSwgZGVmYXVsdEdlb21ldHJ5LCBsb2FkaW5nR2VvbWV0cnkpCisjcHJhZ21hIHJzIGV4cG9ydF9mdW5jKGNyZWF0ZUNhcmRzLCBsb29rQXQsIGRvU3RhcnQsIGRvU3RvcCwgZG9Nb3Rpb24sIGRvU2VsZWN0aW9uLCBzZXRUZXh0dXJlKQorI3ByYWdtYSBycyBleHBvcnRfZnVuYyhzZXRHZW9tZXRyeSwgZGVidWdDYW1lcmEsIGRlYnVnUGlja2luZykKKworLy8gTG9jYWwgdmFyaWFibGVzCitzdGF0aWMgZmxvYXQgYmlhczsgLy8gcm90YXRpb24gYmlhcywgaW4gcmFkaWFucy4gVXNlZCBmb3IgYW5pbWF0aW9uIGFuZCBkcmFnZ2luZy4KK3N0YXRpYyBib29sIHVwZGF0ZUNhbWVyYTsgICAgLy8gZm9yY2UgYSByZWNvbXB1dGUgb2YgcHJvamVjdGlvbiBhbmQgbG9va2F0IG1hdHJpY2VzCitzdGF0aWMgYm9vbCBpbml0aWFsaXplZDsKK3N0YXRpYyBmbG9hdDMgYmFja2dyb3VuZENvbG9yID0geyAwLjBmLCAwLjBmLCAwLjBmIH07CitzdGF0aWMgY29uc3QgZmxvYXQgRkxUX01BWCA9IDEuMGUzNzsKK3N0YXRpYyBpbnQgY3VycmVudFNlbGVjdGlvbiA9IC0xOworc3RhdGljIGludDY0X3QgdG91Y2hUaW1lID0gLTE7ICAvLyB0aW1lIG9mIGZpcnN0IHRvdWNoIChzZWUgZG9TdGFydCgpKQorc3RhdGljIGZsb2F0IHRvdWNoQmlhcyA9IDAuMGY7IC8vIGJpYXMgb24gZmlyc3QgdG91Y2gKKworLy8gRGVmYXVsdCBnZW9tZXRyeSB3aGVuIGNhcmQuZ2VvbWV0cnkgaXMgbm90IHNldC4KK3N0YXRpYyBjb25zdCBmbG9hdDMgY2FyZFZlcnRpY2VzWzRdID0geworICAgICAgICB7IC0xLjAsIC0xLjAsIDAuMCB9LAorICAgICAgICB7IDEuMCwgLTEuMCwgMC4wIH0sCisgICAgICAgIHsgMS4wLCAxLjAsIDAuMCB9LAorICAgICAgICB7LTEuMCwgMS4wLCAwLjAgfQorfTsKKworLy8gRGVmYXVsdCBjYW1lcmEKK3N0YXRpYyBQZXJzcGVjdGl2ZUNhbWVyYSBjYW1lcmEgPSB7CisgICAgICAgIHsyLDIsMn0sIC8vIGZyb20KKyAgICAgICAgezAsMCwwfSwgLy8gYXQKKyAgICAgICAgezAsMSwwfSwgLy8gdXAKKyAgICAgICAgMjUuMGYsICAgLy8gZmllbGQgb2YgdmlldworICAgICAgICAxLjBmLCAgICAvLyBhc3BlY3QKKyAgICAgICAgMC4xZiwgICAgLy8gbmVhcgorICAgICAgICAxMDAuMGYgICAvLyBmYXIKK307CisKKy8vIEZvcndhcmQgcmVmZXJlbmNlcworc3RhdGljIGludCBpbnRlcnNlY3RHZW9tZXRyeShSYXkqIHJheSwgZmxvYXQgKmJlc3RUaW1lKTsKK3N0YXRpYyBib29sIG1ha2VSYXlGb3JQaXhlbEF0KFJheSogcmF5LCBmbG9hdCB4LCBmbG9hdCB5KTsKK3N0YXRpYyBmbG9hdCBkZWx0YVRpbWVJblNlY29uZHMoaW50NjRfdCBjdXJyZW50KTsKKwordm9pZCBpbml0KCkgeworICAgIC8vIGluaXRpYWxpemVycyBjdXJyZW50bHkgaGF2ZSBhIHByb2JsZW0gd2hlbiB0aGUgdmFyaWFibGVzIGFyZSBleHBvcnRlZCwgc28gaW5pdGlhbGl6ZQorICAgIC8vIGdsb2JhbHMgaGVyZS4KKyAgICByc0RlYnVnKCJSZW5kZXJzY3JpcHQ6IGluaXQoKSIsIDApOworICAgIHN0YXJ0QW5nbGUgPSAwLjBmOworICAgIHNsb3RDb3VudCA9IDEwOworICAgIHZpc2libGVTbG90Q291bnQgPSAxOworICAgIGJpYXMgPSAwLjBmOworICAgIHJhZGl1cyA9IDEuMGY7CisgICAgY2FyZFJvdGF0aW9uID0gMC4wZjsKKyAgICB1cGRhdGVDYW1lcmEgPSB0cnVlOworICAgIGluaXRpYWxpemVkID0gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZUFsbG9jYXRpb25WYXJzKCkKK3sKKyAgICAvLyBDYXJkcworICAgIHJzX2FsbG9jYXRpb24gY2FyZEFsbG9jID0gcnNHZXRBbGxvY2F0aW9uKGNhcmRzKTsKKyAgICAvLyBUT0RPOiB1c2UgbmV3IHJzSXNPYmplY3QoKQorICAgIGNhcmRDb3VudCA9IGNhcmRBbGxvYy5wICE9IDAgPyByc0FsbG9jYXRpb25HZXREaW1YKGNhcmRBbGxvYykgOiAwOworfQorCit2b2lkIGNyZWF0ZUNhcmRzKGludCBuKQoreworICAgIHJzRGVidWcoIkNyZWF0ZUNhcmRzOiAiLCBuKTsKKyAgICBpbml0aWFsaXplZCA9IGZhbHNlOworICAgIHVwZGF0ZUFsbG9jYXRpb25WYXJzKCk7Cit9CisKKy8vIFJldHVybiBhbmdsZSBmb3IgcG9zaXRpb24gcC4gVHlwaWNhbGx5IHAgd2lsbCBiZSBhbiBpbnRlZ2VyIHBvc2l0aW9uLCBidXQgY2FuIGJlIGZyYWN0aW9uYWwuCitzdGF0aWMgZmxvYXQgY2FyZFBvc2l0aW9uKGZsb2F0IHApCit7CisgICAgcmV0dXJuIHN0YXJ0QW5nbGUgKyBiaWFzICsgMi4wZiAqIE1fUEkgKiBwIC8gc2xvdENvdW50OworfQorCisvLyBSZXR1cm4gc2xvdCBmb3IgYSBjYXJkIGluIHBvc2l0aW9uIHAuIFR5cGljYWxseSBwIHdpbGwgYmUgYW4gaW50ZWdlciBzbG90LCBidXQgY2FuIGJlIGZyYWN0aW9uYWwuCitzdGF0aWMgZmxvYXQgc2xvdFBvc2l0aW9uKGZsb2F0IHApCit7CisgICAgcmV0dXJuIHN0YXJ0QW5nbGUgKyAyLjBmICogTV9QSSAqIHAgLyBzbG90Q291bnQ7Cit9CisKKy8vIFJldHVybiB0aGUgbG93ZXN0IHNsb3QgbnVtYmVyIGZvciBhIGdpdmVuIGFuZ3VsYXIgcG9zaXRpb24uCitzdGF0aWMgaW50IGNhcmRJbmRleChmbG9hdCBhbmdsZSkKK3sKKyAgICByZXR1cm4gZmxvb3IoYW5nbGUgLSBzdGFydEFuZ2xlIC0gYmlhcykgKiBzbG90Q291bnQgLyAoMi4wZiAqIE1fUEkpOworfQorCisvLyBTZXQgYmFzaWMgY2FtZXJhIHByb3BlcnRpZXM6CisvLyAgICBmcm9tIC0gcG9zaXRpb24gb2YgdGhlIGNhbWVyYSBpbiB4LHksegorLy8gICAgYXQgLSB0YXJnZXQgd2UncmUgbG9va2luZyBhdCAtIHVzZWQgdG8gY29tcHV0ZSB2aWV3IGRpcmVjdGlvbgorLy8gICAgdXAgLSBhIG5vcm1hbGl6ZWQgdmVjdG9yIGluZGljYXRpbmcgdXAgKHR5cGljYWxseSB7IDAsIDEsIDB9KQorLy8KKy8vIE5PVEU6IHRoZSB2aWV3IGRpcmVjdGlvbiBhbmQgdXAgdmVjdG9yIGNhbm5vdCBiZSBwYXJhbGxlbC9hbnRpcGFyYWxsZWwgd2l0aCBlYWNoIG90aGVyCit2b2lkIGxvb2tBdChmbG9hdCBmcm9tWCwgZmxvYXQgZnJvbVksIGZsb2F0IGZyb21aLAorICAgICAgICBmbG9hdCBhdFgsIGZsb2F0IGF0WSwgZmxvYXQgYXRaLAorICAgICAgICBmbG9hdCB1cFgsIGZsb2F0IHVwWSwgZmxvYXQgdXBaKQoreworICAgIGNhbWVyYS5mcm9tLnggPSBmcm9tWDsKKyAgICBjYW1lcmEuZnJvbS55ID0gZnJvbVk7CisgICAgY2FtZXJhLmZyb20ueiA9IGZyb21aOworICAgIGNhbWVyYS5hdC54ID0gYXRYOworICAgIGNhbWVyYS5hdC55ID0gYXRZOworICAgIGNhbWVyYS5hdC56ID0gYXRaOworICAgIGNhbWVyYS51cC54ID0gdXBYOworICAgIGNhbWVyYS51cC55ID0gdXBZOworICAgIGNhbWVyYS51cC56ID0gdXBaOworICAgIHVwZGF0ZUNhbWVyYSA9IHRydWU7Cit9CisKKy8vIExvYWQgYSBwcm9qZWN0aW9uIG1hdHJpeCBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlcnMuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gZ2x1UGVyc3BlY3RpdmUoKQorc3RhdGljIHZvaWQgbG9hZFBlcnNwZWN0aXZlTWF0cml4KHJzX21hdHJpeDR4NCogbWF0cml4LCBmbG9hdCBmb3Z5LCBmbG9hdCBhc3BlY3QsIGZsb2F0IG5lYXIsIGZsb2F0IGZhcikKK3sKKyAgICByc01hdHJpeExvYWRJZGVudGl0eShtYXRyaXgpOworICAgIGZsb2F0IHRvcCA9IG5lYXIgKiB0YW4oKGZsb2F0KSAoZm92eSAqIE1fUEkgLyAzNjAuMGYpKTsKKyAgICBmbG9hdCBib3R0b20gPSAtdG9wOworICAgIGZsb2F0IGxlZnQgPSBib3R0b20gKiBhc3BlY3Q7CisgICAgZmxvYXQgcmlnaHQgPSB0b3AgKiBhc3BlY3Q7CisgICAgcnNNYXRyaXhMb2FkRnJ1c3R1bShtYXRyaXgsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKTsKK30KKworLy8gQ29uc3RydWN0IGEgbWF0cml4IGJhc2VkIG9uIGV5ZSBwb2ludCwgY2VudGVyIGFuZCB1cCBkaXJlY3Rpb24uIEJhc2VkIG9uIHRoZQorLy8gbWFuIHBhZ2UgZm9yIGdsdUxvb2thdCgpLiBVcCBtdXN0IGJlIG5vcm1hbGl6ZWQuCitzdGF0aWMgdm9pZCBsb2FkTG9va2F0TWF0cml4KHJzX21hdHJpeDR4NCogbWF0cml4LCBmbG9hdDMgZXllLCBmbG9hdDMgY2VudGVyLCBmbG9hdDMgdXApCit7CisgICAgZmxvYXQzIGYgPSBub3JtYWxpemUoY2VudGVyIC0gZXllKTsKKyAgICBmbG9hdDMgcyA9IG5vcm1hbGl6ZShjcm9zcyhmLCB1cCkpOworICAgIGZsb2F0MyB1ID0gY3Jvc3MocywgZik7CisgICAgZmxvYXQgbVsxNl07CisgICAgbVswXSA9IHMueDsKKyAgICBtWzRdID0gcy55OworICAgIG1bOF0gPSBzLno7CisgICAgbVsxMl0gPSAwLjBmOworICAgIG1bMV0gPSB1Lng7CisgICAgbVs1XSA9IHUueTsKKyAgICBtWzldID0gdS56OworICAgIG1bMTNdID0gMC4wZjsKKyAgICBtWzJdID0gLWYueDsKKyAgICBtWzZdID0gLWYueTsKKyAgICBtWzEwXSA9IC1mLno7CisgICAgbVsxNF0gPSAwLjBmOworICAgIG1bM10gPSBtWzddID0gbVsxMV0gPSAwLjBmOworICAgIG1bMTVdID0gMS4wZjsKKyAgICByc01hdHJpeExvYWQobWF0cml4LCBtKTsKKyAgICByc01hdHJpeFRyYW5zbGF0ZShtYXRyaXgsIC1leWUueCwgLWV5ZS55LCAtZXllLnopOworfQorCit2b2lkIHNldFRleHR1cmUoaW50IG4sIHJzX2FsbG9jYXRpb24gdGV4dHVyZSkKK3sKKyAgICBjYXJkc1tuXS50ZXh0dXJlID0gdGV4dHVyZTsKKyAgICBpZiAoY2FyZHNbbl0udGV4dHVyZS5wICE9IDApCisgICAgICAgIGNhcmRzW25dLnRleHR1cmVTdGF0ZSA9IFNUQVRFX0xPQURFRDsKKyAgICBlbHNlCisgICAgICAgIGNhcmRzW25dLnRleHR1cmVTdGF0ZSA9IFNUQVRFX0lOVkFMSUQ7Cit9CisKK3ZvaWQgc2V0R2VvbWV0cnkoaW50IG4sIHJzX21lc2ggZ2VvbWV0cnkpCit7CisgICAgY2FyZHNbbl0uZ2VvbWV0cnkgPSBnZW9tZXRyeTsKKyAgICBpZiAoY2FyZHNbbl0uZ2VvbWV0cnkucCAhPSAwKQorICAgICAgICBjYXJkc1tuXS5nZW9tZXRyeVN0YXRlID0gU1RBVEVfTE9BREVEOworICAgIGVsc2UKKyAgICAgICAgY2FyZHNbbl0uZ2VvbWV0cnlTdGF0ZSA9IFNUQVRFX0lOVkFMSUQ7Cit9CisKK3N0YXRpYyBmbG9hdDMgZ2V0QW5pbWF0ZWRTY2FsZUZvclNlbGVjdGVkKCkKK3sKKyAgICBpbnQ2NF90IGR0ID0gKHJzVXB0aW1lTWlsbGlzKCkgLSB0b3VjaFRpbWUpOworICAgIGZsb2F0IGZyYWN0aW9uID0gKGR0IDwgQU5JTUFUSU9OX1NDQUxFX1RJTUUpID8gKGZsb2F0KSBkdCAvIEFOSU1BVElPTl9TQ0FMRV9USU1FIDogMS4wZjsKKyAgICBjb25zdCBmbG9hdDMgb25lID0geyAxLjBmLCAxLjBmLCAxLjBmIH07CisgICAgcmV0dXJuIG9uZSArIGZyYWN0aW9uICogU0VMRUNURURfU0NBTEVfRkFDVE9SOworfQorCitzdGF0aWMgdm9pZCBnZXRNYXRyaXhGb3JDYXJkKHJzX21hdHJpeDR4NCogbWF0cml4LCBpbnQgaSkKK3sKKyAgICBmbG9hdCB0aGV0YSA9IGNhcmRQb3NpdGlvbihpKTsKKyAgICByc01hdHJpeFJvdGF0ZShtYXRyaXgsIGRlZ3JlZXModGhldGEpLCAwLCAxLCAwKTsKKyAgICByc01hdHJpeFRyYW5zbGF0ZShtYXRyaXgsIHJhZGl1cywgMCwgMCk7CisgICAgcnNNYXRyaXhSb3RhdGUobWF0cml4LCBkZWdyZWVzKC10aGV0YSArIGNhcmRSb3RhdGlvbiksIDAsIDEsIDApOworICAgIGlmIChpID09IGN1cnJlbnRTZWxlY3Rpb24pIHsKKyAgICAgICAgZmxvYXQzIHNjYWxlID0gZ2V0QW5pbWF0ZWRTY2FsZUZvclNlbGVjdGVkKCk7CisgICAgICAgIHJzTWF0cml4U2NhbGUobWF0cml4LCBzY2FsZS54LCBzY2FsZS55LCBzY2FsZS56KTsKKyAgICB9CisgICAgLy8gVE9ETzogYXBwbHkgY3VzdG9tIG1hdHJpeCBmb3IgY2FyZHNbaV0uZ2VvbWV0cnkKK30KKworc3RhdGljIHZvaWQgZHJhd0NhcmRzKCkKK3sKKyAgICBmbG9hdCBkZXB0aCA9IDEuMGY7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYXJkQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoY2FyZHNbaV0udmlzaWJsZSkgeworICAgICAgICAgICAgLy8gQmluZCB0ZXh0dXJlCisgICAgICAgICAgICBpZiAoY2FyZHNbaV0udGV4dHVyZVN0YXRlID09IFNUQVRFX0xPQURFRCkgeworICAgICAgICAgICAgICAgIHJzZ0JpbmRUZXh0dXJlKGZyYWdtZW50UHJvZ3JhbSwgMCwgY2FyZHNbaV0udGV4dHVyZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNhcmRzW2ldLnRleHR1cmVTdGF0ZSA9PSBTVEFURV9MT0FESU5HKSB7CisgICAgICAgICAgICAgICAgcnNnQmluZFRleHR1cmUoZnJhZ21lbnRQcm9ncmFtLCAwLCBsb2FkaW5nVGV4dHVyZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJzZ0JpbmRUZXh0dXJlKGZyYWdtZW50UHJvZ3JhbSwgMCwgZGVmYXVsdFRleHR1cmUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEcmF3IGdlb21ldHJ5CisgICAgICAgICAgICByc19tYXRyaXg0eDQgbWF0cml4ID0gbW9kZWx2aWV3TWF0cml4OworICAgICAgICAgICAgZ2V0TWF0cml4Rm9yQ2FyZCgmbWF0cml4LCBpKTsKKyAgICAgICAgICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisgICAgICAgICAgICBpZiAoY2FyZHNbaV0uZ2VvbWV0cnlTdGF0ZSA9PSBTVEFURV9MT0FERUQgJiYgY2FyZHNbaV0uZ2VvbWV0cnkucCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcnNnRHJhd01lc2goY2FyZHNbaV0uZ2VvbWV0cnkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjYXJkc1tpXS5nZW9tZXRyeVN0YXRlID09IFNUQVRFX0xPQURJTkcgJiYgbG9hZGluZ0dlb21ldHJ5LnAgIT0gMCkgeworICAgICAgICAgICAgICAgIHJzZ0RyYXdNZXNoKGxvYWRpbmdHZW9tZXRyeSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlZmF1bHRHZW9tZXRyeS5wICE9IDApIHsKKyAgICAgICAgICAgICAgICByc2dEcmF3TWVzaChkZWZhdWx0R2VvbWV0cnkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBEcmF3IHBsYWNlLWhvbGRlciBnZW9tZXRyeQorICAgICAgICAgICAgICAgIHJzZ0RyYXdRdWFkKAorICAgICAgICAgICAgICAgICAgICBjYXJkVmVydGljZXNbMF0ueCwgY2FyZFZlcnRpY2VzWzBdLnksIGNhcmRWZXJ0aWNlc1swXS56LAorICAgICAgICAgICAgICAgICAgICBjYXJkVmVydGljZXNbMV0ueCwgY2FyZFZlcnRpY2VzWzFdLnksIGNhcmRWZXJ0aWNlc1sxXS56LAorICAgICAgICAgICAgICAgICAgICBjYXJkVmVydGljZXNbMl0ueCwgY2FyZFZlcnRpY2VzWzJdLnksIGNhcmRWZXJ0aWNlc1syXS56LAorICAgICAgICAgICAgICAgICAgICBjYXJkVmVydGljZXNbM10ueCwgY2FyZFZlcnRpY2VzWzNdLnksIGNhcmRWZXJ0aWNlc1szXS56KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgdXBkYXRlQ2FtZXJhTWF0cml4KGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQpCit7CisgICAgZmxvYXQgYXNwZWN0ID0gd2lkdGggLyBoZWlnaHQ7CisgICAgaWYgKGFzcGVjdCAhPSBjYW1lcmEuYXNwZWN0IHx8IHVwZGF0ZUNhbWVyYSkgeworICAgICAgICBjYW1lcmEuYXNwZWN0ID0gYXNwZWN0OworICAgICAgICBsb2FkUGVyc3BlY3RpdmVNYXRyaXgoJnByb2plY3Rpb25NYXRyaXgsIGNhbWVyYS5mb3YsIGNhbWVyYS5hc3BlY3QsIGNhbWVyYS5uZWFyLCBjYW1lcmEuZmFyKTsKKyAgICAgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4KCZwcm9qZWN0aW9uTWF0cml4KTsKKworICAgICAgICBsb2FkTG9va2F0TWF0cml4KCZtb2RlbHZpZXdNYXRyaXgsIGNhbWVyYS5mcm9tLCBjYW1lcmEuYXQsIGNhbWVyYS51cCk7CisgICAgICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1vZGVsdmlld01hdHJpeCk7CisgICAgICAgIHVwZGF0ZUNhbWVyYSA9IGZhbHNlOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQmVoYXZpb3IvUGh5c2ljcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworc3RhdGljIGZsb2F0IHZlbG9jaXR5ID0gMC4wZjsgIC8vIGFuZ3VsYXIgdmVsb2NpdHkgaW4gcmFkaWFucy9zCitzdGF0aWMgYm9vbCBpc0RyYWdnaW5nOworc3RhdGljIGludDY0X3QgbGFzdFRpbWUgPSAwTDsgLy8ga2VlcCB0cmFjayBvZiBob3cgbXVjaCB0aW1lIGhhcyBwYXNzZWQgYmV0d2VlbiBmcmFtZXMKK3N0YXRpYyBmbG9hdDIgbGFzdFBvc2l0aW9uOworc3RhdGljIGJvb2wgYW5pbWF0aW5nID0gZmFsc2U7CitzdGF0aWMgZmxvYXQgdmVsb2NpdHlUaHJlc2hvbGQgPSAwLjFmICogTV9QSSAvIDE4MC4wZjsKK3N0YXRpYyBmbG9hdCB2ZWxvY2l0eVRyYWNrZXI7CitzdGF0aWMgaW50IHZlbG9jaXR5VHJhY2tlckNvdW50Oworc3RhdGljIGZsb2F0IG1hc3MgPSA1LjBmOyAvLyBrZworCitzdGF0aWMgY29uc3QgZmxvYXQgRyA9IDkuODBmOyAvLyBncmF2aXR5IGNvbnN0YW50LCBpbiBtL3MKK3N0YXRpYyBjb25zdCBmbG9hdCBzcHJpbmdDb25zdGFudCA9IDAuMGY7CitzdGF0aWMgY29uc3QgZmxvYXQgZnJpY3Rpb25Db2VmZiA9IDEwLjBmOworc3RhdGljIGNvbnN0IGZsb2F0IGRyYWdGYWN0b3IgPSAwLjI1ZjsKKworc3RhdGljIGZsb2F0IGRyYWdGdW5jdGlvbihmbG9hdCB4LCBmbG9hdCB5KQoreworICAgIHJldHVybiBkcmFnRmFjdG9yICogKCh4IC0gbGFzdFBvc2l0aW9uLngpIC8gcnNnR2V0V2lkdGgoKSkgKiBNX1BJOworfQorCitzdGF0aWMgZmxvYXQgZGVsdGFUaW1lSW5TZWNvbmRzKGludDY0X3QgY3VycmVudCkKK3sKKyAgICByZXR1cm4gKGxhc3RUaW1lID4gMEwpID8gKGZsb2F0KSAoY3VycmVudCAtIGxhc3RUaW1lKSAvIDEwMDAuMGYgOiAwLjBmOworfQorCitpbnQgZG9TZWxlY3Rpb24oZmxvYXQgeCwgZmxvYXQgeSkKK3sKKyAgICBSYXkgcmF5OworICAgIGlmIChtYWtlUmF5Rm9yUGl4ZWxBdCgmcmF5LCB4LCB5KSkgeworICAgICAgICBmbG9hdCBiZXN0VGltZSA9IEZMVF9NQVg7CisgICAgICAgIHJldHVybiBpbnRlcnNlY3RHZW9tZXRyeSgmcmF5LCAmYmVzdFRpbWUpOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3ZvaWQgZG9TdGFydChmbG9hdCB4LCBmbG9hdCB5KQoreworICAgIGxhc3RQb3NpdGlvbi54ID0geDsKKyAgICBsYXN0UG9zaXRpb24ueSA9IHk7CisgICAgdmVsb2NpdHkgPSAwLjBmOworICAgIGlmIChhbmltYXRpbmcpIHsKKyAgICAgICAgcnNTZW5kVG9DbGllbnQoQ01EX0FOSU1BVElPTl9GSU5JU0hFRCk7CisgICAgICAgIGFuaW1hdGluZyA9IGZhbHNlOworICAgIH0KKyAgICB2ZWxvY2l0eVRyYWNrZXIgPSAwLjBmOworICAgIHZlbG9jaXR5VHJhY2tlckNvdW50ID0gMDsKKyAgICB0b3VjaFRpbWUgPSByc1VwdGltZU1pbGxpcygpOworICAgIHRvdWNoQmlhcyA9IGJpYXM7CisgICAgY3VycmVudFNlbGVjdGlvbiA9IGRvU2VsZWN0aW9uKHgsIHkpOworfQorCisKK3ZvaWQgZG9TdG9wKGZsb2F0IHgsIGZsb2F0IHkpCit7CisgICAgaW50NjRfdCBjdXJyZW50VGltZSA9IHJzVXB0aW1lTWlsbGlzKCk7CisgICAgdXBkYXRlQWxsb2NhdGlvblZhcnMoKTsKKyAgICBpZiAoY3VycmVudFNlbGVjdGlvbiAhPSAtMSAmJiAoY3VycmVudFRpbWUgLSB0b3VjaFRpbWUpIDwgQU5JTUFUSU9OX1NDQUxFX1RJTUUpIHsKKyAgICAgICAgcnNEZWJ1ZygiSElUISIsIGN1cnJlbnRTZWxlY3Rpb24pOworICAgICAgICBpbnQgZGF0YVsxXTsKKyAgICAgICAgZGF0YVswXSA9IGN1cnJlbnRTZWxlY3Rpb247CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoQ01EX0NBUkRfU0VMRUNURUQsIGRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmVsb2NpdHkgPSB2ZWxvY2l0eVRyYWNrZXJDb3VudCA+IDAgPworICAgICAgICAgICAgICAgICAgICAodmVsb2NpdHlUcmFja2VyIC8gdmVsb2NpdHlUcmFja2VyQ291bnQpIDogMC4wZjsgIC8vIGF2ZyB2ZWxvY2l0eQorICAgICAgICBpZiAoZmFicyh2ZWxvY2l0eSkgPiB2ZWxvY2l0eVRocmVzaG9sZCkgeworICAgICAgICAgICAgYW5pbWF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIHJzU2VuZFRvQ2xpZW50KENNRF9BTklNQVRJT05fU1RBUlRFRCk7CisgICAgICAgIH0KKyAgICB9CisgICAgY3VycmVudFNlbGVjdGlvbiA9IC0xOworICAgIGxhc3RUaW1lID0gcnNVcHRpbWVNaWxsaXMoKTsKK30KKwordm9pZCBkb01vdGlvbihmbG9hdCB4LCBmbG9hdCB5KQoreworICAgIGludDY0X3QgY3VycmVudFRpbWUgPSByc1VwdGltZU1pbGxpcygpOworICAgIGZsb2F0IGRlbHRhT21lZ2EgPSBkcmFnRnVuY3Rpb24oeCwgeSk7CisgICAgYmlhcyArPSBkZWx0YU9tZWdhOworICAgIGxhc3RQb3NpdGlvbi54ID0geDsKKyAgICBsYXN0UG9zaXRpb24ueSA9IHk7CisgICAgZmxvYXQgZHQgPSBkZWx0YVRpbWVJblNlY29uZHMoY3VycmVudFRpbWUpOworICAgIGlmIChkdCA+IDAuMGYpIHsKKyAgICAgICAgZmxvYXQgdiA9IGRlbHRhT21lZ2EgLyBkdDsKKyAgICAgICAgLy9pZiAoKHZlbG9jaXR5VHJhY2tlciA+IDAuMGYpID09ICh2ID4gMC4wZikpIHsKKyAgICAgICAgICAgIHZlbG9jaXR5VHJhY2tlciArPSB2OworICAgICAgICAgICAgdmVsb2NpdHlUcmFja2VyQ291bnQrKzsKKyAgICAgICAgLy99IGVsc2UgeworICAgICAgICAvLyAgICB2ZWxvY2l0eVRyYWNrZXIgPSB2OworICAgICAgICAvLyAgICB2ZWxvY2l0eVRyYWNrZXJDb3VudCA9IDE7CisgICAgICAgIC8vfQorICAgIH0KKworICAgIC8vIERyb3AgY3VycmVudCBzZWxlY3Rpb24gaWYgdXNlciBkcmFncyBwb3NpdGlvbiArLSBhIHBhcnRpYWwgc2xvdAorICAgIGlmIChjdXJyZW50U2VsZWN0aW9uICE9IC0xKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IHNsb3RNYXJnaW4gPSAwLjVmICogKDIuMGYgKiBNX1BJIC8gc2xvdENvdW50KTsKKyAgICAgICAgaWYgKGZhYnModG91Y2hCaWFzIC0gYmlhcykgPiBzbG90TWFyZ2luKSB7CisgICAgICAgICAgICBjdXJyZW50U2VsZWN0aW9uID0gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgbGFzdFRpbWUgPSBjdXJyZW50VGltZTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSGl0IGRldGVjdGlvbiB1c2luZyByYXkgY2FzdGluZy4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGJvb2wKK3JheVRyaWFuZ2xlSW50ZXJzZWN0KFJheSogcmF5LCBmbG9hdDMgcDAsIGZsb2F0MyBwMSwgZmxvYXQzIHAyLCBmbG9hdCAqdG91dCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgdG1pbiA9IDAuMGY7CisKKyAgICBmbG9hdDMgZTEgPSBwMSAtIHAwOworICAgIGZsb2F0MyBlMiA9IHAyIC0gcDA7CisgICAgZmxvYXQzIHMxID0gY3Jvc3MocmF5LT5kaXJlY3Rpb24sIGUyKTsKKworICAgIGZsb2F0IGRpdiA9IGRvdChzMSwgZTEpOworICAgIGlmIChkaXYgPT0gMC4wZikgcmV0dXJuIGZhbHNlOyAgLy8gcmF5IGlzIHBhcmFsbGVsIHRvIHBsYW5lLgorCisgICAgZmxvYXQzIGQgPSByYXktPnBvc2l0aW9uIC0gcDA7CisgICAgZmxvYXQgaW52RGl2ID0gMS4wZiAvIGRpdjsKKworICAgIGZsb2F0IHUgPSBkb3QoZCwgczEpICogaW52RGl2OworICAgIGlmICh1IDwgMC4wZiB8fCB1ID4gMS4wZikgcmV0dXJuIGZhbHNlOworCisgICAgZmxvYXQzIHMyID0gY3Jvc3MoZCwgZTEpOworICAgIGZsb2F0IHYgPSBkb3QocmF5LT5kaXJlY3Rpb24sIHMyKSAqIGludkRpdjsKKyAgICBpZiAoIHYgPCAwLjBmIHx8ICh1K3YpID4gMS4wZikgcmV0dXJuIGZhbHNlOworCisgICAgZmxvYXQgdCA9IGRvdChlMiwgczIpICogaW52RGl2OworICAgIGlmICh0IDwgdG1pbiB8fCB0ID4gKnRvdXQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAqdG91dCA9IHQ7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIENyZWF0ZXMgYSByYXkgZm9yIGFuIEFuZHJvaWQgcGl4ZWwgY29vcmRpbmF0ZS4KKy8vIE5vdGUgdGhhdCB0aGUgWSBjb29yZGluYXRlIGlzIG9wcG9zaXRlIG9mIEdMIHJlbmRlcmluZyBjb29yZGluYXRlcy4KK3N0YXRpYyBib29sIG1ha2VSYXlGb3JQaXhlbEF0KFJheSogcmF5LCBmbG9hdCB4LCBmbG9hdCB5KQoreworICAgIGlmIChkZWJ1Z0NhbWVyYSkgeworICAgICAgICByc0RlYnVnKCItLS0tLS0gbWFrZVJheSgpIC0tLS0tLS0iLCAwKTsKKyAgICAgICAgcnNEZWJ1ZygiQ2FtZXJhLmZyb206IiwgY2FtZXJhLmZyb20pOworICAgICAgICByc0RlYnVnKCJDYW1lcmEuYXQ6IiwgY2FtZXJhLmF0KTsKKyAgICAgICAgcnNEZWJ1ZygiQ2FtZXJhLmRpcjoiLCBub3JtYWxpemUoY2FtZXJhLmF0IC0gY2FtZXJhLmZyb20pKTsKKyAgICB9CisKKyAgICAvLyBWZWN0b3IgbWF0aC4gIFRoaXMgaGFzIHRoZSBwb3RlbnRpYWwgdG8gYmUgbXVjaCBmYXN0ZXIuCisgICAgLy8gVE9ETzogcHJlLWNvbXB1dGUgbG93ZXJMZWZ0UmF5LCBkdSwgZHYgdG8gZWxpbWluYXRlIG1vc3Qgb2YgdGhpcyBtYXRoLgorICAgIGlmICh0cnVlKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IHUgPSB4IC8gcnNnR2V0V2lkdGgoKTsKKyAgICAgICAgY29uc3QgZmxvYXQgdiA9IDEuMGYgLSAoeSAvIHJzZ0dldEhlaWdodCgpKTsKKyAgICAgICAgY29uc3QgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KSByc2dHZXRXaWR0aCgpIC8gcnNnR2V0SGVpZ2h0KCk7CisgICAgICAgIGNvbnN0IGZsb2F0IHRhbmZvdjIgPSAyLjBmICogdGFuKHJhZGlhbnMoY2FtZXJhLmZvdiAvIDIuMGYpKTsKKyAgICAgICAgZmxvYXQzIGRpciA9IG5vcm1hbGl6ZShjYW1lcmEuYXQgLSBjYW1lcmEuZnJvbSk7CisgICAgICAgIGZsb2F0MyBkdSA9IHRhbmZvdjIgKiBub3JtYWxpemUoY3Jvc3MoZGlyLCBjYW1lcmEudXApKTsKKyAgICAgICAgZmxvYXQzIGR2ID0gdGFuZm92MiAqIG5vcm1hbGl6ZShjcm9zcyhkdSwgZGlyKSk7CisgICAgICAgIGR1ICo9IGFzcGVjdDsKKyAgICAgICAgZmxvYXQzIGxvd2VyTGVmdFJheSA9IGRpciAtICgwLjVmICogZHUpIC0gKDAuNWYgKiBkdik7CisgICAgICAgIGNvbnN0IGZsb2F0MyByYXlQb2ludCA9IGNhbWVyYS5mcm9tOworICAgICAgICBjb25zdCBmbG9hdDMgcmF5RGlyID0gbm9ybWFsaXplKGxvd2VyTGVmdFJheSArIHUqZHUgKyB2KmR2KTsKKyAgICAgICAgaWYgKGRlYnVnQ2FtZXJhKSB7CisgICAgICAgICAgICByc0RlYnVnKCJSYXkgZGlyZWN0aW9uICh2ZWN0b3IgbWF0aCkgPSAiLCByYXlEaXIpOworICAgICAgICB9CisKKyAgICAgICAgcmF5LT5wb3NpdGlvbiA9ICByYXlQb2ludDsKKyAgICAgICAgcmF5LT5kaXJlY3Rpb24gPSByYXlEaXI7CisgICAgfQorCisgICAgLy8gTWF0cml4IG1hdGguICBUaGlzIGlzIG1vcmUgZ2VuZXJpYyBpZiB3ZSBhbGxvdyBzZXR0aW5nIG1vZGVsIHZpZXcgYW5kIHByb2plY3Rpb24gbWF0cmljZXMKKyAgICAvLyBkaXJlY3RseQorICAgIGVsc2UgeworICAgICAgICByc19tYXRyaXg0eDQgcG0gPSBtb2RlbHZpZXdNYXRyaXg7CisgICAgICAgIHJzTWF0cml4TG9hZE11bHRpcGx5KCZwbSwgJnByb2plY3Rpb25NYXRyaXgsICZtb2RlbHZpZXdNYXRyaXgpOworICAgICAgICBpZiAoIXJzTWF0cml4SW52ZXJzZSgmcG0pKSB7CisgICAgICAgICAgICByc0RlYnVnKCJFUlJPUjogU0lOR1VMQVIgUE0gTUFUUklYIiwgMCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgZmxvYXQgd2lkdGggPSByc2dHZXRXaWR0aCgpOworICAgICAgICBjb25zdCBmbG9hdCBoZWlnaHQgPSByc2dHZXRIZWlnaHQoKTsKKyAgICAgICAgY29uc3QgZmxvYXQgd2lueCA9IDIuMGYgKiB4IC8gd2lkdGggLSAxLjBmOworICAgICAgICBjb25zdCBmbG9hdCB3aW55ID0gMi4wZiAqIHkgLyBoZWlnaHQgLSAxLjBmOworCisgICAgICAgIGZsb2F0NCBleWUgPSB7IDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYgfTsKKyAgICAgICAgZmxvYXQ0IGF0ID0geyB3aW54LCB3aW55LCAxLjBmLCAxLjBmIH07CisKKyAgICAgICAgZXllID0gcnNNYXRyaXhNdWx0aXBseSgmcG0sIGV5ZSk7CisgICAgICAgIGV5ZSAqPSAxLjBmIC8gZXllLnc7CisKKyAgICAgICAgYXQgPSByc01hdHJpeE11bHRpcGx5KCZwbSwgYXQpOworICAgICAgICBhdCAqPSAxLjBmIC8gYXQudzsKKworICAgICAgICBjb25zdCBmbG9hdDMgcmF5UG9pbnQgPSB7IGV5ZS54LCBleWUueSwgZXllLnogfTsKKyAgICAgICAgY29uc3QgZmxvYXQzIGF0UG9pbnQgPSB7IGF0LngsIGF0LnksIGF0LnogfTsKKyAgICAgICAgY29uc3QgZmxvYXQzIHJheURpciA9IG5vcm1hbGl6ZShhdFBvaW50IC0gcmF5UG9pbnQpOworICAgICAgICBpZiAoZGVidWdDYW1lcmEpIHsKKyAgICAgICAgICAgIHJzRGVidWcoIndpbng6ICIsIHdpbngpOworICAgICAgICAgICAgcnNEZWJ1Zygid2lueTogIiwgd2lueSk7CisgICAgICAgICAgICByc0RlYnVnKCJSYXkgcG9zaXRpb24gKHRyYW5zZm9ybWVkKSA9ICIsIGV5ZSk7CisgICAgICAgICAgICByc0RlYnVnKCJSYXkgZGlyZWN0aW9uICh0cmFuc2Zvcm1lZCkgPSAiLCByYXlEaXIpOworICAgICAgICB9CisgICAgICAgIHJheS0+cG9zaXRpb24gPSAgcmF5UG9pbnQ7CisgICAgICAgIHJheS0+ZGlyZWN0aW9uID0gcmF5RGlyOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IGludGVyc2VjdEdlb21ldHJ5KFJheSogcmF5LCBmbG9hdCAqYmVzdFRpbWUpCit7CisgICAgaW50IGhpdCA9IC0xOworICAgIGZvciAoaW50IGlkID0gMDsgaWQgPCBjYXJkQ291bnQ7IGlkKyspIHsKKyAgICAgICAgaWYgKGNhcmRzW2lkXS52aXNpYmxlKSB7CisgICAgICAgICAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgICAgICAgICAgZmxvYXQzIHBbNF07CisKKyAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBjYXJkIHZlcnRpY2VzIHRvIHdvcmxkIHNwYWNlCisgICAgICAgICAgICByc01hdHJpeExvYWRJZGVudGl0eSgmbWF0cml4KTsKKyAgICAgICAgICAgIGdldE1hdHJpeEZvckNhcmQoJm1hdHJpeCwgaWQpOworICAgICAgICAgICAgZm9yIChpbnQgdmVydGV4ID0gMDsgdmVydGV4IDwgNDsgdmVydGV4KyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdDQgdG1wID0gcnNNYXRyaXhNdWx0aXBseSgmbWF0cml4LCBjYXJkVmVydGljZXNbdmVydGV4XSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcC53ICE9IDAuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgcFt2ZXJ0ZXhdLnggPSB0bXAueDsKKyAgICAgICAgICAgICAgICAgICAgcFt2ZXJ0ZXhdLnkgPSB0bXAueTsKKyAgICAgICAgICAgICAgICAgICAgcFt2ZXJ0ZXhdLnogPSB0bXAuejsKKyAgICAgICAgICAgICAgICAgICAgcFt2ZXJ0ZXhdICo9IDEuMGYgLyB0bXAudzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByc0RlYnVnKCJCYWQgdyBjb29yZDogIiwgdG1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEludGVyc2VjdCBjYXJkIGdlb21ldHJ5CisgICAgICAgICAgICBpZiAocmF5VHJpYW5nbGVJbnRlcnNlY3QocmF5LCBwWzBdLCBwWzFdLCBwWzJdLCBiZXN0VGltZSkKKyAgICAgICAgICAgICAgICB8fCByYXlUcmlhbmdsZUludGVyc2VjdChyYXksIHBbMl0sIHBbM10sIHBbMF0sIGJlc3RUaW1lKSkgeworICAgICAgICAgICAgICAgIGhpdCA9IGlkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBoaXQ7Cit9CisKKy8vIFRoaXMgbWV0aG9kIGNvbXB1dGVzIHRoZSBwb3NpdGlvbiBvZiBhbGwgdGhlIGNhcmRzIGJ5IHVwZGF0aW5nIGJpYXMgYmFzZWQgb24gYQorLy8gc2ltcGxlIHBoeXNpY3MgbW9kZWwuCisvLyBJZiB0aGUgY2FyZHMgYXJlIHN0aWxsIGluIG1vdGlvbiwgcmV0dXJucyB0cnVlLgorc3RhdGljIGJvb2wgdXBkYXRlTmV4dFBvc2l0aW9uKGludDY0X3QgY3VycmVudFRpbWUpCit7CisgICAgaWYgKGFuaW1hdGluZykgeworICAgICAgICBmbG9hdCBkdCA9IGRlbHRhVGltZUluU2Vjb25kcyhjdXJyZW50VGltZSk7CisgICAgICAgIGlmIChkdCA8PSAwLjBmKQorICAgICAgICAgICAgcmV0dXJuIGFuaW1hdGluZzsKKyAgICAgICAgY29uc3QgZmxvYXQgbWluU3RlcFRpbWUgPSAxLjBmIC8gMzAwLjBmOyAvLyB+NSBzdGVwcyBwZXIgZnJhbWUKKyAgICAgICAgY29uc3QgaW50IE4gPSAoZHQgPiBtaW5TdGVwVGltZSkgPyAoMSArIHJvdW5kKGR0IC8gbWluU3RlcFRpbWUpKSA6IDE7CisgICAgICAgIGR0IC89IE47CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICAvLyBGb3JjZSBmcmljdGlvbiAtIGFsd2F5cyBvcHBvc2VzIG1vdGlvbgorICAgICAgICAgICAgY29uc3QgZmxvYXQgRmYgPSAtZnJpY3Rpb25Db2VmZiAqIHZlbG9jaXR5OworCisgICAgICAgICAgICAvLyBSZXN0b3JpbmcgZm9yY2UgdG8gbWF0Y2ggY2FyZHMgd2l0aCBzbG90cworICAgICAgICAgICAgY29uc3QgZmxvYXQgdGhldGEgPSBzdGFydEFuZ2xlICsgYmlhczsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IGR0aGV0YSA9IDIuMGYgKiBNX1BJIC8gc2xvdENvdW50OworICAgICAgICAgICAgY29uc3QgZmxvYXQgcG9zaXRpb24gPSB0aGV0YSAvIGR0aGV0YTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IGZyYWN0aW9uID0gcG9zaXRpb24gLSBmbG9vcihwb3NpdGlvbik7IC8vIGZyYWN0aW9uYWwgcG9zaXRpb24gYmV0d2VlbiBzbG90cworICAgICAgICAgICAgZmxvYXQgeDsKKyAgICAgICAgICAgIGlmIChmcmFjdGlvbiA+IDAuNWYpIHsKKyAgICAgICAgICAgICAgICB4ID0gLSAoMS4wZiAtIGZyYWN0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgeCA9IGZyYWN0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgZmxvYXQgRnIgPSAtIHNwcmluZ0NvbnN0YW50ICogeDsKKworICAgICAgICAgICAgLy8gY29tcHV0ZSB2ZWxvY2l0eQorICAgICAgICAgICAgY29uc3QgZmxvYXQgbW9tZW50dW0gPSBtYXNzICogdmVsb2NpdHkgKyAoRmYgKyBGcikqZHQ7CisgICAgICAgICAgICB2ZWxvY2l0eSA9IG1vbWVudHVtIC8gbWFzczsKKyAgICAgICAgICAgIGJpYXMgKz0gdmVsb2NpdHkgKiBkdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IEFkZCBhbmltYXRpb24gdG8gc21vb3RobHkgbW92ZSBiYWNrIHRvIHNsb3RzLiBDdXJyZW50bHkgc25hcHMgdG8gbG9jYXRpb24uCisgICAgICAgIGlmIChjYXJkQ291bnQgPD0gdmlzaWJsZVNsb3RDb3VudCkgeworICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBhbGlnbnMgdGhlIGNhcmRzIHRvIHRoZSBmaXJzdCBzbG90ICh0aGV0YSA9IHN0YXJ0QW5nbGUpIHdoZW4gdGhlcmUgYXJlbid0CisgICAgICAgICAgICAvLyBlbm91Z2ggdmlzaWJsZSBjYXJkcy4gSXQgc2hvdWxkIGJlIGdlbmVyYWxpemVkIHRvIGFsbG93IGFsaWdubWVudCB0byBmcm9udCwKKyAgICAgICAgICAgIC8vIG1pZGRsZSBvciBiYWNrIG9mIHRoZSBzdGFjay4KKyAgICAgICAgICAgIGlmIChjYXJkUG9zaXRpb24oMCkgIT0gc2xvdFBvc2l0aW9uKDApKSB7CisgICAgICAgICAgICAgICAgYmlhcyA9IDAuMGY7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoY2FyZFBvc2l0aW9uKGNhcmRDb3VudCkgPCAwLjBmKSB7CisgICAgICAgICAgICAgICAgYmlhcyA9IC1zbG90UG9zaXRpb24oY2FyZENvdW50KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FyZFBvc2l0aW9uKDApID4gc2xvdFBvc2l0aW9uKDApKSB7CisgICAgICAgICAgICAgICAgYmlhcyA9IDAuMGY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhbmltYXRpbmcgPSBmYWJzKHZlbG9jaXR5KSA+IHZlbG9jaXR5VGhyZXNob2xkOworICAgICAgICBpZiAoIWFuaW1hdGluZykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgZHRoZXRhID0gMi4wZiAqIE1fUEkgLyBzbG90Q291bnQ7CisgICAgICAgICAgICBiaWFzID0gcm91bmQoKHN0YXJ0QW5nbGUgKyBiaWFzKSAvIGR0aGV0YSkgKiBkdGhldGEgLSBzdGFydEFuZ2xlOworICAgICAgICAgICAgcnNTZW5kVG9DbGllbnQoQ01EX0FOSU1BVElPTl9GSU5JU0hFRCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbGFzdFRpbWUgPSBjdXJyZW50VGltZTsKKworICAgIHJldHVybiBhbmltYXRpbmc7Cit9CisKKy8vIEN1bGwgY2FyZHMgYmFzZWQgb24gdmlzaWJpbGl0eSBhbmQgdmlzaWJsZVNsb3RDb3VudC4KKy8vIElmIHZpc2libGVTbG90Q291bnQgaXMgPiAwLCB0aGVuIG9ubHkgc2hvdyB0aG9zZSBzbG90cyBhbmQgY3VsbCB0aGUgcmVzdC4KKy8vIE90aGVyd2lzZSwgaXQgc2hvdWxkIGN1bGwgYmFzZWQgb24gYm91bmRzIG9mIGdlb21ldHJ5Lgorc3RhdGljIGludCBjdWxsQ2FyZHMoKQoreworICAgIGNvbnN0IGZsb2F0IHRoZXRhRmlyc3QgPSBzbG90UG9zaXRpb24oLTEpOyAvLyAtMSBrZWVwcyB0aGUgY2FyZCBpbiBmcm9udCBhcm91bmQgYSBiaXQgbG9uZ2VyCisgICAgY29uc3QgZmxvYXQgdGhldGFMYXN0ID0gc2xvdFBvc2l0aW9uKHZpc2libGVTbG90Q291bnQpOworCisgICAgaW50IGNvdW50ID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhcmRDb3VudDsgaSsrKSB7CisgICAgICAgIGlmICh2aXNpYmxlU2xvdENvdW50ID4gMCkgeworICAgICAgICAgICAgLy8gSWYgdmlzaWJsZVNsb3RDb3VudCBpcyBzcGVjaWZpZWQsIHRoZW4gb25seSBzaG93IHVwIHRvIHZpc2libGVTbG90Q291bnQgY2FyZHMuCisgICAgICAgICAgICBmbG9hdCBwID0gY2FyZFBvc2l0aW9uKGkpOworICAgICAgICAgICAgaWYgKHAgPj0gdGhldGFGaXJzdCAmJiBwIDwgdGhldGFMYXN0KSB7CisgICAgICAgICAgICAgICAgY2FyZHNbaV0udmlzaWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2FyZHNbaV0udmlzaWJsZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQ3VsbCB0aGUgcmVzdCBvZiB0aGUgY2FyZHMgdXNpbmcgYm91bmRpbmcgYm94IG9mIGdlb21ldHJ5LgorICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgY2FyZHNbaV0udmlzaWJsZSA9IHRydWU7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworLy8gUmVxdWVzdCB0ZXh0dXJlL2dlb21ldHJ5IGZvciBpdGVtcyB0aGF0IGhhdmUgY29tZSBpbnRvIHZpZXcKKy8vIG9yIGRvZXNuJ3QgaGF2ZSBhIHRleHR1cmUgeWV0Lgorc3RhdGljIHZvaWQgdXBkYXRlQ2FyZFJlc291cmNlcygpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYXJkQ291bnQ7IGkrKykgeworICAgICAgICBpbnQgZGF0YVsxXTsKKyAgICAgICAgaWYgKGNhcmRzW2ldLnZpc2libGUpIHsKKyAgICAgICAgICAgIC8vIHJlcXVlc3QgdGV4dHVyZSBmcm9tIGNsaWVudCBpZiBub3QgbG9hZGVkCisgICAgICAgICAgICBpZiAoY2FyZHNbaV0udGV4dHVyZVN0YXRlID09IFNUQVRFX0lOVkFMSUQpIHsKKyAgICAgICAgICAgICAgICBkYXRhWzBdID0gaTsKKyAgICAgICAgICAgICAgICBib29sIGVucXVldWVkID0gcnNTZW5kVG9DbGllbnQoQ01EX1JFUVVFU1RfVEVYVFVSRSwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5xdWV1ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FyZHNbaV0udGV4dHVyZVN0YXRlID0gU1RBVEVfTE9BRElORzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByc0RlYnVnKCJDb3VsZG4ndCBzZW5kIENNRF9SRVFVRVNUX1RFWFRVUkUiLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyByZXF1ZXN0IGdlb21ldHJ5IGZyb20gY2xpZW50IGlmIG5vdCBsb2FkZWQKKyAgICAgICAgICAgIGlmIChjYXJkc1tpXS5nZW9tZXRyeVN0YXRlID09IFNUQVRFX0lOVkFMSUQpIHsKKyAgICAgICAgICAgICAgICBkYXRhWzBdID0gaTsKKyAgICAgICAgICAgICAgICBib29sIGVucXVldWVkID0gcnNTZW5kVG9DbGllbnQoQ01EX1JFUVVFU1RfR0VPTUVUUlksIGRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgICAgICAgICAgICAgaWYgKGVucXVldWVkKSB7CisgICAgICAgICAgICAgICAgICAgIGNhcmRzW2ldLmdlb21ldHJ5U3RhdGUgPSBTVEFURV9MT0FESU5HOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJzRGVidWcoIkNvdWxkbid0IHNlbmQgQ01EX1JFUVVFU1RfR0VPTUVUUlkiLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBhc2sgdGhlIGhvc3QgdG8gcmVtb3ZlIHRoZSB0ZXh0dXJlCisgICAgICAgICAgICBpZiAoY2FyZHNbaV0udGV4dHVyZVN0YXRlID09IFNUQVRFX0xPQURFRCkgeworICAgICAgICAgICAgICAgIGRhdGFbMF0gPSBpOworICAgICAgICAgICAgICAgIGJvb2wgZW5xdWV1ZWQgPSByc1NlbmRUb0NsaWVudChDTURfSU5WQUxJREFURV9URVhUVVJFLCBkYXRhLCBzaXplb2YoZGF0YSkpOworICAgICAgICAgICAgICAgIGlmIChlbnF1ZXVlZCkgeworICAgICAgICAgICAgICAgICAgICBjYXJkc1tpXS50ZXh0dXJlU3RhdGUgPSBTVEFURV9JTlZBTElEOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJzRGVidWcoIkNvdWxkbid0IHNlbmQgQ01EX0lOVkFMSURBVEVfVEVYVFVSRSIsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFzayB0aGUgaG9zdCB0byByZW1vdmUgdGhlIGdlb21ldHJ5CisgICAgICAgICAgICBpZiAoY2FyZHNbaV0uZ2VvbWV0cnlTdGF0ZSA9PSBTVEFURV9MT0FERUQpIHsKKyAgICAgICAgICAgICAgICBkYXRhWzBdID0gaTsKKyAgICAgICAgICAgICAgICBib29sIGVucXVldWVkID0gcnNTZW5kVG9DbGllbnQoQ01EX0lOVkFMSURBVEVfR0VPTUVUUlksIGRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgICAgICAgICAgICAgaWYgKGVucXVldWVkKSB7CisgICAgICAgICAgICAgICAgICAgIGNhcmRzW2ldLmdlb21ldHJ5U3RhdGUgPSBTVEFURV9JTlZBTElEOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJzRGVidWcoIkNvdWxkbid0IHNlbmQgQ01EX0lOVkFMSURBVEVfR0VPTUVUUlkiLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gUGxhY2VzIGRvdHMgb24gZ2VvbWV0cnkgdG8gdmlzdWFsbHkgaW5zcGVjdCB0aGF0IG9iamVjdHMgY2FuIGJlIHNlZW4gYnkgcmF5cy4KKy8vIE5PVEU6IHRoZSBjb2xvciBvZiB0aGUgZG90IGlzIHNvbWV3aGF0IHJhbmRvbSwgYXMgaXQgZGVwZW5kcyBvbiB0ZXh0dXJlIG9mIHByZXZpb3VzbHktcmVuZGVyZWQKKy8vIGNhcmQuCitzdGF0aWMgdm9pZCByZW5kZXJXaXRoUmF5cygpCit7CisgICAgY29uc3QgZmxvYXQgdyA9IHJzZ0dldFdpZHRoKCk7CisgICAgY29uc3QgZmxvYXQgaCA9IHJzZ0dldEhlaWdodCgpOworICAgIGNvbnN0IGludCBza2lwID0gODsKKyAgICBjb2xvcigxLjBmLCAwLjBmLCAwLjBmLCAxLjBmKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IChpbnQpIGg7IGorPXNraXApIHsKKyAgICAgICAgZmxvYXQgcG9zWSA9IChmbG9hdCkgajsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KSB3OyBpKz1za2lwKSB7CisgICAgICAgICAgICBmbG9hdCBwb3NYID0gKGZsb2F0KSBpOworICAgICAgICAgICAgUmF5IHJheTsKKyAgICAgICAgICAgIGlmIChtYWtlUmF5Rm9yUGl4ZWxBdCgmcmF5LCBwb3NYLCBwb3NZKSkgeworICAgICAgICAgICAgICAgIGZsb2F0IGJlc3RUaW1lID0gRkxUX01BWDsKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0R2VvbWV0cnkoJnJheSwgJmJlc3RUaW1lKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICByc2dEcmF3U3ByaXRlU2NyZWVuc3BhY2UocG9zWCwgaCAtIHBvc1kgLSAxLCAwLjBmLCAyLjBmLCAyLjBmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCByb290KCkgeworICAgIGludDY0X3QgY3VycmVudFRpbWUgPSByc1VwdGltZU1pbGxpcygpOworCisgICAgcnNnQ2xlYXJEZXB0aCgxLjBmKTsKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleCh2ZXJ0ZXhQcm9ncmFtKTsKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGZyYWdtZW50UHJvZ3JhbSk7CisgICAgcnNnQmluZFByb2dyYW1TdG9yZShwcm9ncmFtU3RvcmUpOworICAgIHJzZ0JpbmRQcm9ncmFtUmFzdGVyKHJhc3RlclByb2dyYW0pOworCisgICAgdXBkYXRlQWxsb2NhdGlvblZhcnMoKTsKKworICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYXJkQ291bnQ7IGkrKykKKyAgICAgICAgICAgIGNhcmRzW2ldLnRleHR1cmVTdGF0ZSA9IFNUQVRFX0lOVkFMSUQ7CisgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoZmFsc2UpIHsgLy8gZm9yIGRlYnVnZ2luZyAtIGZsYXNoIHRoZSBzY3JlZW4gc28gd2Uga25vdyB3ZSdyZSBzdGlsbCByZW5kZXJpbmcKKyAgICAgICAgc3RhdGljIGJvb2wgdG9nZ2xlOworICAgICAgICBpZiAodG9nZ2xlKQorICAgICAgICAgICAgcnNnQ2xlYXJDb2xvcihiYWNrZ3JvdW5kQ29sb3IueCwgYmFja2dyb3VuZENvbG9yLnksIGJhY2tncm91bmRDb2xvci56LCAxLjApOworICAgICAgICBlbHNlCisgICAgICAgICAgICByc2dDbGVhckNvbG9yKDEuMGYsIDAuMGYsIDAuMGYsIDEuZik7CisgICAgICAgIHRvZ2dsZSA9ICF0b2dnbGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcnNnQ2xlYXJDb2xvcihiYWNrZ3JvdW5kQ29sb3IueCwgYmFja2dyb3VuZENvbG9yLnksIGJhY2tncm91bmRDb2xvci56LCAxLjApOworICAgIH0KKworICAgIHVwZGF0ZUNhbWVyYU1hdHJpeChyc2dHZXRXaWR0aCgpLCByc2dHZXRIZWlnaHQoKSk7CisKKyAgICBjb25zdCBib29sIHRpbWVFeHBpcmVkID0gKGN1cnJlbnRUaW1lIC0gdG91Y2hUaW1lKSA+IEFOSU1BVElPTl9TQ0FMRV9USU1FOworICAgIGlmICh0aW1lRXhwaXJlZCkgeworICAgICAgICAvL2N1cnJlbnRTZWxlY3Rpb24gPSAtMTsKKyAgICB9CisgICAgYm9vbCBzdGlsbEFuaW1hdGluZyA9IHVwZGF0ZU5leHRQb3NpdGlvbihjdXJyZW50VGltZSkgfHwgIXRpbWVFeHBpcmVkOworCisgICAgY3VsbENhcmRzKCk7CisKKyAgICB1cGRhdGVDYXJkUmVzb3VyY2VzKCk7CisKKyAgICBkcmF3Q2FyZHMoKTsKKworICAgIGlmIChkZWJ1Z1BpY2tpbmcpIHsKKyAgICAgICAgcmVuZGVyV2l0aFJheXMoKTsKKyAgICB9CisKKyAgICAvL3JzU2VuZFRvQ2xpZW50KENNRF9QSU5HKTsKKworICAgIHJldHVybiBzdGlsbEFuaW1hdGluZyA/IDEgOiAwOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvQW5kcm9pZC5tayBiL2NvcmUvam5pL0FuZHJvaWQubWsKaW5kZXggNDIxMzVjNS4uY2IwYmRkMyAxMDA2NDQKLS0tIGEvY29yZS9qbmkvQW5kcm9pZC5taworKysgYi9jb3JlL2puaS9BbmRyb2lkLm1rCkBAIC0xOSwxMiArMTksMTUgQEAKICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ1VTVE9NX1JVTlRJTUVfSEVBUF9NQVg9JChVU0VfQ1VTVE9NX1JVTlRJTUVfSEVBUF9NQVgpCiBlbmRpZgogCitpZmVxICgkKFVTRV9PUEVOR0xfUkVOREVSRVIpLHRydWUpCisJTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX09QRU5HTF9SRU5ERVJFUgorZW5kaWYKKwogTE9DQUxfQ0ZMQUdTICs9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUyAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUwogCiBMT0NBTF9TUkNfRklMRVM6PSBcCiAJQWN0aXZpdHlNYW5hZ2VyLmNwcCBcCiAJQW5kcm9pZFJ1bnRpbWUuY3BwIFwKLQlDdXJzb3JXaW5kb3cuY3BwIFwKIAlUaW1lLmNwcCBcCiAJY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0VHTEltcGwuY3BwIFwKIAljb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfR0xJbXBsLmNwcC5hcm0gXApAQCAtNDgsNiArNTEsNyBAQAogCWFuZHJvaWRfdmlld19JbnB1dENoYW5uZWwuY3BwIFwKIAlhbmRyb2lkX3ZpZXdfSW5wdXRRdWV1ZS5jcHAgXAogCWFuZHJvaWRfdmlld19LZXlFdmVudC5jcHAgXAorCWFuZHJvaWRfdmlld19HTEVTMjBDYW52YXMuY3BwIFwKIAlhbmRyb2lkX3ZpZXdfTW90aW9uRXZlbnQuY3BwIFwKIAlhbmRyb2lkX3RleHRfQW5kcm9pZENoYXJhY3Rlci5jcHAgXAogCWFuZHJvaWRfdGV4dF9BbmRyb2lkQmlkaS5jcHAgXApAQCAtMTA2LDYgKzExMCw3IEBACiAJYW5kcm9pZC9ncmFwaGljcy9SYXN0ZXJpemVyLmNwcCBcCiAJYW5kcm9pZC9ncmFwaGljcy9SZWdpb24uY3BwIFwKIAlhbmRyb2lkL2dyYXBoaWNzL1NoYWRlci5jcHAgXAorCWFuZHJvaWQvZ3JhcGhpY3MvVGV4dExheW91dC5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvVHlwZWZhY2UuY3BwIFwKIAlhbmRyb2lkL2dyYXBoaWNzL1hmZXJtb2RlLmNwcCBcCiAJYW5kcm9pZC9ncmFwaGljcy9ZdXZUb0pwZWdFbmNvZGVyLmNwcCBcCkBAIC0xMjQsNyArMTI5LDYgQEAKIAlhbmRyb2lkX2JsdWV0b290aF9jb21tb24uY3BwIFwKIAlhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhBdWRpb0dhdGV3YXkuY3BwIFwKIAlhbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhTb2NrZXQuY3BwIFwKLQlhbmRyb2lkX2JsdWV0b290aF9TY29Tb2NrZXQuY3BwIFwKIAlhbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlLmNwcCBcCiAJYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wLmNwcCBcCiAJYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoQTJkcFNlcnZpY2UuY3BwIFwKQEAgLTE0Myw2ICsxNDcsNyBAQAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAJJChKTklfSF9JTkNMVURFKSBcCiAJJChMT0NBTF9QQVRIKS9hbmRyb2lkL2dyYXBoaWNzIFwKKwkkKExPQ0FMX1BBVEgpLy4uLy4uL2xpYnMvaHd1aSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGJsdWVkcm9pZCkgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBsaWJoYXJkd2FyZSkvaGFyZHdhcmUgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBsaWJoYXJkd2FyZV9sZWdhY3kpL2hhcmR3YXJlX2xlZ2FjeSBcCkBAIC0xOTMsNiArMTk4LDEwIEBACiAJbGlid3BhX2NsaWVudCBcCiAJbGlianBlZwogCitpZmVxICgkKFVTRV9PUEVOR0xfUkVOREVSRVIpLHRydWUpCisJTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJod3VpCitlbmRpZgorCiBpZmVxICgkKEJPQVJEX0hBVkVfQkxVRVRPT1RIKSx0cnVlKQogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAJZXh0ZXJuYWwvZGJ1cyBcCmRpZmYgLS1naXQgYS9jb3JlL2puaS9BbmRyb2lkUnVudGltZS5jcHAgYi9jb3JlL2puaS9BbmRyb2lkUnVudGltZS5jcHAKaW5kZXggNjJhNDQ5NS4uNmY2ZDkxOSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvQW5kcm9pZFJ1bnRpbWUuY3BwCisrKyBiL2NvcmUvam5pL0FuZHJvaWRSdW50aW1lLmNwcApAQCAtMTE1LDYgKzExNSw3IEBACiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfUGl4ZWxGb3JtYXQoSk5JRW52KiBlbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9jb21fYW5kcm9pZF9pbnRlcm5hbF9ncmFwaGljc19OYXRpdmVVdGlscyhKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19EaXNwbGF5KEpOSUVudiogZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcyhKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19TdXJmYWNlKEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X1ZpZXdSb290KEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3coSk5JRW52KiBlbnYpOwpAQCAtMTUxLDcgKzE1Miw2IEBACiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX0hlYWRzZXRCYXNlKEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQXVkaW9HYXRld2F5KEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoU29ja2V0KEpOSUVudiAqZW52KTsKLWV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfU2NvU29ja2V0KEpOSUVudiAqZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoU2VydmljZShKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcChKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEEyZHBTZXJ2aWNlKEpOSUVudiogZW52KTsKQEAgLTEyMjksNiArMTIyOSw3IEBACiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX25pb191dGlscyksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX1BpeGVsRm9ybWF0KSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfR3JhcGhpY3MpLAorICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcyksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfU3VyZmFjZSksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0VHTEltcGwpLApAQCAtMTMwMCw3ICsxMzAxLDYgQEAKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX0hlYWRzZXRCYXNlKSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aEF1ZGlvR2F0ZXdheSksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhTb2NrZXQpLAotICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfU2NvU29ja2V0KSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wKSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEEyZHBTZXJ2aWNlKSwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL0N1cnNvcldpbmRvdy5jcHAgYi9jb3JlL2puaS9DdXJzb3JXaW5kb3cuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODc3OTIxLi4wMDAwMDAwCi0tLSBhL2NvcmUvam5pL0N1cnNvcldpbmRvdy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJDdXJzb3JXaW5kb3ciCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+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+bnVtUm93cy0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICBib29sICAgICAgICAgICAgICAgIHNldE51bUNvbHVtbnModWludDMyX3QgbnVtQ29sdW1ucykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGN1ciA9IG1IZWFkZXItPm51bUNvbHVtbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXIgPiAwICYmIGN1ciAhPSBudW1Db2x1bW5zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJUcnlpbmcgdG8gZ28gZnJvbSAlZCBjb2x1bW5zIHRvICVkIiwgY3VyLCBudW1Db2x1bW5zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgaW50MzJfdCAgICAgICAgICAgICBmcmVlU3BhY2UoKTsKLQotICAgIHZvaWQgICAgICAgICAgICAgICAgY2xlYXIoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBhIHJvdyBzbG90IGFuZCBpdHMgZGlyZWN0b3J5LiBUaGUgcmV0dXJuZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHBvaW50ZXIgcG9pbnRzIHRvIHRoZSBiZWdpbmluZyBvZiB0aGUgcm93J3MgZGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBvciBOVUxMIGlmIHRoZXJlIHdhc24ndCByb29tLiBUaGUgZGlyZWN0b3J5IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBpbml0aWFsaWVkIHdpdGggTlVMTCBlbnRyaWVzIGZvciBlYWNoIGZpZWxkLgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZmllbGRfc2xvdF90ICogICAgICBhbGxvY1JvdygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIGEgcG9ydGlvbiBvZiB0aGUgd2luZG93LiBSZXR1cm5zIHRoZSBvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG9mIHRoZSBhbGxvY2F0aW9uLCBvciAwIGlmIHRoZXJlIGlzbid0IGVub3VnaCBzcGFjZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIElmIGFsaWduZWQgaXMgdHJ1ZSwgdGhlIGFsbG9jYXRpb24gZ2V0cyA0IGJ5dGUgYWxpZ25tZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgdWludDMyX3QgICAgICAgICAgICBhbGxvYyhzaXplX3Qgc2l6ZSwgYm9vbCBhbGlnbmVkID0gZmFsc2UpOwotCi0gICAgdWludDMyX3QgICAgICAgICAgICByZWFkX2ZpZWxkX3Nsb3QoaW50IHJvdywgaW50IGNvbHVtbiwgZmllbGRfc2xvdF90ICogc2xvdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogQ29weSBkYXRhIGludG8gdGhlIHdpbmRvdyBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICBjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCB1aW50OF90IGNvbnN0ICogZGF0YSwgc2l6ZV90IHNpemUpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgY29weUluKHVpbnQzMl90IG9mZnNldCwgaW50NjRfdCBkYXRhKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlJbih1aW50MzJfdCBvZmZzZXQsIGRvdWJsZSBkYXRhKTsKLQotICAgIHZvaWQgICAgICAgICAgICAgICAgY29weU91dCh1aW50MzJfdCBvZmZzZXQsIHVpbnQ4X3QgKiBkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgaW50NjRfdCAgICAgICAgICAgICBjb3B5T3V0TG9uZyh1aW50MzJfdCBvZmZzZXQpOwotICAgIGRvdWJsZSAgICAgICAgICAgICAgY29weU91dERvdWJsZSh1aW50MzJfdCBvZmZzZXQpOwotCi0gICAgYm9vbCAgICAgICAgICAgICAgICBwdXRMb25nKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGludDY0X3QgdmFsdWUpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgcHV0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSB2YWx1ZSk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICBwdXROdWxsKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wpOwotCi0gICAgYm9vbCAgICAgICAgICAgICAgICBnZXRMb25nKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGludDY0X3QgKiB2YWx1ZU91dCk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICBnZXREb3VibGUodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgZG91YmxlICogdmFsdWVPdXQpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgZ2V0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBib29sICogdmFsdWVPdXQpOwotCi0gICAgdWludDhfdCAqICAgICAgICAgICBvZmZzZXRUb1B0cih1aW50MzJfdCBvZmZzZXQpIHtyZXR1cm4gbURhdGEgKyBvZmZzZXQ7fQotCi0gICAgcm93X3Nsb3RfdCAqICAgICAgICBhbGxvY1Jvd1Nsb3QoKTsKLQotICAgIHJvd19zbG90X3QgKiAgICAgICAgZ2V0Um93U2xvdChpbnQgcm93KTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0dXJuIE5VTEwgaWYgRmFpbGVkIHRvIGZpbmQgcm93U2xvdCBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICogSW52YWxpZCByb3dTbG90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBmaWVsZF9zbG90X3QgKiAgICAgIGdldEZpZWxkU2xvdFdpdGhDaGVjayhpbnQgcm93LCBpbnQgY29sdW1uKTsKLSAgICBmaWVsZF9zbG90X3QgKiAgICAgIGdldEZpZWxkU2xvdChpbnQgcm93LCBpbnQgY29sdW1uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkRGlyT2Zmc2V0ID0gZ2V0Um93U2xvdChyb3cpLT5vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKGZpZWxkRGlyT2Zmc2V0KSkgKyBjb2x1bW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi1wcml2YXRlOgotICAgIHVpbnQ4X3QgKiBtRGF0YTsKLSAgICBzaXplX3QgbVNpemU7Ci0gICAgc2l6ZV90IG1NYXhTaXplOwotICAgIHdpbmRvd19oZWFkZXJfdCAqIG1IZWFkZXI7Ci0gICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKLQotICAgIC8qKgotICAgICAqIE9mZnNldCBvZiB0aGUgbG93ZXN0IHVudXNlZCBkYXRhIGJ5dGUgaW4gdGhlIGFycmF5LgotICAgICAqLwotICAgIHVpbnQzMl90IG1GcmVlT2Zmc2V0OwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5jcHAKaW5kZXggODhiYmFmZC4uYjA2MjI2NCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmNwcApAQCAtMzEzLDYgKzMxMywxMCBAQAogICAgIHJldHVybiBiaXRtYXAtPmNvbmZpZygpOw0KIH0NCiANCitzdGF0aWMgaW50IEJpdG1hcF9nZXRHZW5lcmF0aW9uSWQoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQml0bWFwKiBiaXRtYXApIHsNCisgICAgcmV0dXJuIGJpdG1hcC0+Z2V0R2VuZXJhdGlvbklEKCk7DQorfQ0KKw0KIHN0YXRpYyBqYm9vbGVhbiBCaXRtYXBfaGFzQWxwaGEoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQml0bWFwKiBiaXRtYXApIHsNCiAgICAgcmV0dXJuICFiaXRtYXAtPmlzT3BhcXVlKCk7DQogfQ0KQEAgLTYwNiw2ICs2MTAsNyBAQAogICAgICAgICAodm9pZCopQml0bWFwX3dyaXRlVG9QYXJjZWwgfSwNCiAgICAgeyAgICJuYXRpdmVFeHRyYWN0QWxwaGEiLCAgICAgICAiKElJW0kpTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOyIsDQogICAgICAgICAodm9pZCopQml0bWFwX2V4dHJhY3RBbHBoYSB9LA0KKyAgICB7ICAgIm5hdGl2ZUdlbmVyYXRpb25JZCIsICAgICAgICIoSSlJIiwgKHZvaWQqKUJpdG1hcF9nZXRHZW5lcmF0aW9uSWQgfSwNCiAgICAgeyAgICJuYXRpdmVHZXRQaXhlbCIsICAgICAgICAgICAiKElJSSlJIiwgKHZvaWQqKUJpdG1hcF9nZXRQaXhlbCB9LA0KICAgICB7ICAgIm5hdGl2ZUdldFBpeGVscyIsICAgICAgICAgICIoSVtJSUlJSUlJKVYiLCAodm9pZCopQml0bWFwX2dldFBpeGVscyB9LA0KICAgICB7ICAgIm5hdGl2ZVNldFBpeGVsIiwgICAgICAgICAgICIoSUlJSSlWIiwgKHZvaWQqKUJpdG1hcF9zZXRQaXhlbCB9LA0KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmNwcCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmNwcAppbmRleCBlMWU5NTM2Li5iZjE1MGE5IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuY3BwCkBAIC0yMCw3ICsyMCw2IEBACiAKICNpbmNsdWRlICJTa0NhbnZhcy5oIgogI2luY2x1ZGUgIlNrRGV2aWNlLmgiCi0jaW5jbHVkZSAiU2tHTENhbnZhcy5oIgogI2luY2x1ZGUgIlNrR3JhcGhpY3MuaCIKICNpbmNsdWRlICJTa0ltYWdlUmVmX0dsb2JhbFBvb2wuaCIKICNpbmNsdWRlICJTa1BvcnRlckR1ZmYuaCIKQEAgLTMwLDYgKzI5LDEzIEBACiAjaW5jbHVkZSAiU2tCb3VuZGFyeVBhdGNoLmgiCiAjaW5jbHVkZSAiU2tNZXNoVXRpbHMuaCIKIAorI2luY2x1ZGUgIlRleHRMYXlvdXQuaCIKKworI2luY2x1ZGUgInVuaWNvZGUvdWJpZGkuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzaGFwZS5oIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNkZWZpbmUgVElNRV9EUkFXeAogCiBzdGF0aWMgdWludDMyX3QgZ2V0X3RocmVhZF9tc2VjKCkgewpAQCAtNjAsMTMgKzY2LDggQEAKICAgICAgICAgcmV0dXJuIGJpdG1hcCA/IG5ldyBTa0NhbnZhcygqYml0bWFwKSA6IG5ldyBTa0NhbnZhczsKICAgICB9CiAgICAgCi0gICAgc3RhdGljIFNrQ2FudmFzKiBpbml0R0woSk5JRW52KiBlbnYsIGpvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTa0dMQ2FudmFzOwotICAgIH0KLSAgICAKICAgICBzdGF0aWMgdm9pZCBmcmVlQ2FjaGVzKEpOSUVudiogZW52LCBqb2JqZWN0KSB7CiAgICAgICAgIC8vIHRoZXNlIGFyZSBjYWxsZWQgaW4gbm8gcGFydGljdWxhciBvcmRlcgotICAgICAgICBTa0dMQ2FudmFzOjpEZWxldGVBbGxUZXh0dXJlcygpOwogICAgICAgICBTa0ltYWdlUmVmX0dsb2JhbFBvb2w6OlNldFJBTVVzZWQoMCk7CiAgICAgICAgIFNrR3JhcGhpY3M6OlNldEZvbnRDYWNoZVVzZWQoMCk7CiAgICAgfQpAQCAtMTAzLDExICsxMDQsNiBAQAogICAgICAgICByZXR1cm4gY2FudmFzLT5nZXREZXZpY2UoKS0+YWNjZXNzQml0bWFwKGZhbHNlKS5oZWlnaHQoKTsKICAgICB9CiAKLSAgICBzdGF0aWMgdm9pZCBzZXRWaWV3cG9ydChKTklFbnYqIGVudiwgam9iamVjdCwgU2tDYW52YXMqIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgY2FudmFzLT5zZXRWaWV3cG9ydCh3aWR0aCwgaGVpZ2h0KTsKLSAgICB9Ci0gICAgCiAgICAgc3RhdGljIHZvaWQgc2V0Qml0bWFwKEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTa0JpdG1hcCogYml0bWFwKSB7CiAgICAgICAgIGNhbnZhcy0+c2V0Qml0bWFwRGV2aWNlKCpiaXRtYXApOwpAQCAtNzQzLDQ1ICs3MzksNDkgQEAKICAgICAgICAgY2FudmFzLT5kcmF3VmVydGljZXMobW9kZSwgcHRDb3VudCwgdmVydHMsIHRleHMsIGNvbG9ycywgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlcywgaW5kZXhDb3VudCwgKnBhaW50KTsKICAgICB9Ci0gICAgCi0gICAgc3RhdGljIHZvaWQgZHJhd1RleHRfX19DSUlGRlBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAorCisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dF9fX0NJSUZGSVBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgewogICAgICAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKLSAgICAgICAganNpemUgdGV4dENvdW50ID0gZW52LT5HZXRBcnJheUxlbmd0aCh0ZXh0KTsKLSAgICAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7Ci0gICAgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0KHRleHRBcnJheSArIGluZGV4LCBjb3VudCA8PCAxLCB4XywgeV8sICpwYWludCk7Ci0gICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIHRleHRBcnJheSwgMCk7CisgICAgICAgIFRleHRMYXlvdXQ6OmRyYXdUZXh0KHBhaW50LCB0ZXh0QXJyYXkgKyBpbmRleCwgY291bnQsIGZsYWdzLCB4LCB5LCBjYW52YXMpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7CiAgICAgfQotIAotICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0X19TdHJpbmdJSUZGUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGFpbnQqIHBhaW50KSB7Ci0gICAgICAgIGNvbnN0IHZvaWQqIHRleHRfID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKLSAgICAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7Ci0gICAgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0KChjb25zdCB1aW50MTZfdCopdGV4dF8gKyBzdGFydCwgKGVuZCAtIHN0YXJ0KSA8PCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgIHhfLCB5XywgKnBhaW50KTsKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgKGNvbnN0IGpjaGFyKikgdGV4dF8pOworCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHRfX1N0cmluZ0lJRkZJUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLCBqc3RyaW5nIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKyAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7CisgICAgICAgIFRleHRMYXlvdXQ6OmRyYXdUZXh0KHBhaW50LCB0ZXh0QXJyYXkgKyBzdGFydCwgZW5kIC0gc3RhcnQsIGZsYWdzLCB4LCB5LCBjYW52YXMpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOwogICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdm9pZCBkcmF3U3RyaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywganN0cmluZyB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBqb2JqZWN0IHBhaW50KSB7Ci0gICAgICAgIE5QRV9DSEVDS19SRVRVUk5fVk9JRChlbnYsIGNhbnZhcyk7Ci0gICAgICAgIE5QRV9DSEVDS19SRVRVUk5fVk9JRChlbnYsIHBhaW50KTsKLSAgICAgICAgTlBFX0NIRUNLX1JFVFVSTl9WT0lEKGVudiwgdGV4dCk7Ci0gICAgICAgIHNpemVfdCBjb3VudCA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHRleHQpOwotICAgICAgICBpZiAoMCA9PSBjb3VudCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0XyA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7Ci0gICAgICAgIFNrQ2FudmFzKiBjID0gR3JhcGhpY3NKTkk6OmdldE5hdGl2ZUNhbnZhcyhlbnYsIGNhbnZhcyk7Ci0gICAgICAgIGMtPmRyYXdUZXh0KHRleHRfLCBjb3VudCA8PCAxLCBTa0Zsb2F0VG9TY2FsYXIoeCksIFNrRmxvYXRUb1NjYWxhcih5KSwKLSAgICAgICAgICAgICAgICAgICAgKkdyYXBoaWNzSk5JOjpnZXROYXRpdmVQYWludChlbnYsIHBhaW50KSk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRfKTsKKworICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0UnVuX19fQ0lJSUlGRklQYWludCgKKyAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQ2FudmFzKiBjYW52YXMsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LAorICAgICAgICBpbnQgY291bnQsIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsCisgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGRpckZsYWdzLCBTa1BhaW50KiBwYWludCkgeworCisgICAgICAgIGpjaGFyKiBjaGFycyA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7CisgICAgICAgIFRleHRMYXlvdXQ6OmRyYXdUZXh0UnVuKHBhaW50LCBjaGFycyArIGNvbnRleHRJbmRleCwgaW5kZXggLSBjb250ZXh0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LCBjb250ZXh0Q291bnQsIGRpckZsYWdzLCB4LCB5LCBjYW52YXMpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBjaGFycywgSk5JX0FCT1JUKTsKICAgICB9Ci0gICAgCisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dFJ1bl9fU3RyaW5nSUlJSUZGSVBhaW50KAorICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCBvYmosIFNrQ2FudmFzKiBjYW52YXMsIGpzdHJpbmcgdGV4dCwgamludCBzdGFydCwKKyAgICAgICAgamludCBlbmQsIGppbnQgY29udGV4dFN0YXJ0LCBqaW50IGNvbnRleHRFbmQsCisgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgamludCBkaXJGbGFncywgU2tQYWludCogcGFpbnQpIHsKKworICAgICAgICBqaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIGppbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgY29uc3QgamNoYXIqIGNoYXJzID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgVGV4dExheW91dDo6ZHJhd1RleHRSdW4ocGFpbnQsIGNoYXJzICsgY29udGV4dFN0YXJ0LCBzdGFydCAtIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsIGNvbnRleHRDb3VudCwgZGlyRmxhZ3MsIHgsIHksIGNhbnZhcyk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIGNoYXJzKTsKKyAgICB9CisKICAgICBzdGF0aWMgdm9pZCBkcmF3UG9zVGV4dF9fX0NJSV9GUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQ2FudmFzKiBjYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdEFycmF5IHBvcywgU2tQYWludCogcGFpbnQpIHsKQEAgLTgwNCwxMCArODA0LDExIEBACiAgICAgICAgIH0KICAgICAgICAgZGVsZXRlW10gcG9zUHRyOwogICAgIH0KLSAKKwogICAgIHN0YXRpYyB2b2lkIGRyYXdQb3NUZXh0X19TdHJpbmdfRlBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsIGpzdHJpbmcgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXRBcnJheSBwb3MsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0QXJyYXkgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrUGFpbnQqIHBhaW50KSB7CiAgICAgICAgIGNvbnN0IHZvaWQqIHRleHRfID0gdGV4dCA/IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCkgOiBOVUxMOwogICAgICAgICBpbnQgYnl0ZUxlbmd0aCA9IHRleHQgPyBlbnYtPkdldFN0cmluZ0xlbmd0aCh0ZXh0KSA6IDA7CiAgICAgICAgIGZsb2F0KiBwb3NBcnJheSA9IHBvcyA/IGVudi0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKHBvcywgTlVMTCkgOiBOVUxMOwpAQCAtODI3LDI3ICs4MjgsMjcgQEAKICAgICAgICAgfQogICAgICAgICBkZWxldGVbXSBwb3NQdHI7CiAgICAgfQotIAorCiAgICAgc3RhdGljIHZvaWQgZHJhd1RleHRPblBhdGhfX19DSUlQYXRoRkZQYWludChKTklFbnYqIGVudiwgam9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgU2tQYXRoKiBwYXRoLCBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLCBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAorICAgICAgICAgICAgU2tQYXRoKiBwYXRoLCBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsIGppbnQgYmlkaUZsYWdzLCBTa1BhaW50KiBwYWludCkgewogCiAgICAgICAgIGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0T25QYXRoSFYodGV4dEFycmF5ICsgaW5kZXgsIGNvdW50IDw8IDEsICpwYXRoLAotICAgICAgICAgICAgICAgICAgICBTa0Zsb2F0VG9TY2FsYXIoaE9mZnNldCksIFNrRmxvYXRUb1NjYWxhcih2T2Zmc2V0KSwgKnBhaW50KTsKKyAgICAgICAgVGV4dExheW91dDo6ZHJhd1RleHRPblBhdGgocGFpbnQsIHRleHRBcnJheSwgY291bnQsIGJpZGlGbGFncywgaE9mZnNldCwgdk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgY2FudmFzKTsKICAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgdGV4dEFycmF5LCAwKTsKICAgICB9Ci0gCisKICAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dE9uUGF0aF9fU3RyaW5nUGF0aEZGUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBTa1BhdGgqIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LCBTa1BhaW50KiBwYWludCkgeworICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBTa1BhdGgqIHBhdGgsCisgICAgICAgICAgICBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsIGppbnQgYmlkaUZsYWdzLCBTa1BhaW50KiBwYWludCkgewogICAgICAgICBjb25zdCBqY2hhciogdGV4dF8gPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOwotICAgICAgICBpbnQgYnl0ZUxlbmd0aCA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHRleHQpIDw8IDE7Ci0gICAgICAgIGNhbnZhcy0+ZHJhd1RleHRPblBhdGhIVih0ZXh0XywgYnl0ZUxlbmd0aCwgKnBhdGgsCi0gICAgICAgICAgICAgICAgICAgIFNrRmxvYXRUb1NjYWxhcihoT2Zmc2V0KSwgU2tGbG9hdFRvU2NhbGFyKHZPZmZzZXQpLCAqcGFpbnQpOworICAgICAgICBpbnQgY291bnQgPSBlbnYtPkdldFN0cmluZ0xlbmd0aCh0ZXh0KTsKKyAgICAgICAgVGV4dExheW91dDo6ZHJhd1RleHRPblBhdGgocGFpbnQsIHRleHRfLCBjb3VudCwgYmlkaUZsYWdzLCBoT2Zmc2V0LCB2T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBjYW52YXMpOwogICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0Xyk7CiAgICAgfQotIAorCiAgICAgc3RhdGljIGJvb2wgZ2V0Q2xpcEJvdW5kcyhKTklFbnYqIGVudiwgam9iamVjdCwgU2tDYW52YXMqIGNhbnZhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgYm91bmRzKSB7CiAgICAgICAgIFNrUmVjdCAgIHI7CkBAIC04NjgsMTIgKzg2OSwxMCBAQAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnQ2FudmFzTWV0aG9kc1tdID0gewogICAgIHsiZmluYWxpemVyIiwgIihJKVYiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZmluYWxpemVyfSwKICAgICB7ImluaXRSYXN0ZXIiLCIoSSlJIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmluaXRSYXN0ZXJ9LAotICAgIHsiaW5pdEdMIiwiKClJIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmluaXRHTH0sCiAgICAgeyJpc09wYXF1ZSIsIigpWiIsICh2b2lkKikgU2tDYW52YXNHbHVlOjppc09wYXF1ZX0sCiAgICAgeyJnZXRXaWR0aCIsIigpSSIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpnZXRXaWR0aH0sCiAgICAgeyJnZXRIZWlnaHQiLCIoKUkiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6Z2V0SGVpZ2h0fSwKICAgICB7Im5hdGl2ZV9zZXRCaXRtYXAiLCIoSUkpViIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpzZXRCaXRtYXB9LAotICAgIHsibmF0aXZlU2V0Vmlld3BvcnQiLCAiKElJSSlWIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OnNldFZpZXdwb3J0fSwKICAgICB7InNhdmUiLCIoKUkiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6c2F2ZUFsbH0sCiAgICAgeyJzYXZlIiwiKEkpSSIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpzYXZlfSwKICAgICB7Im5hdGl2ZV9zYXZlTGF5ZXIiLCIoSUxhbmRyb2lkL2dyYXBoaWNzL1JlY3RGO0lJKUkiLApAQCAtOTQwLDI2ICs5MzksMjcgQEAKICAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdCaXRtYXBSUn0sCiAgICAgeyJuYXRpdmVfZHJhd0JpdG1hcCIsICIoSVtJSUlGRklJWkkpViIsCiAgICAgKHZvaWQqKVNrQ2FudmFzR2x1ZTo6ZHJhd0JpdG1hcEFycmF5fSwKLSAgICAKICAgICB7Im5hdGl2ZURyYXdCaXRtYXBNYXRyaXgiLCAiKElJSUkpViIsCiAgICAgICAgICh2b2lkKilTa0NhbnZhc0dsdWU6OmRyYXdCaXRtYXBNYXRyaXh9LAogICAgIHsibmF0aXZlRHJhd0JpdG1hcE1lc2giLCAiKElJSUlbRklbSUlJKVYiLAogICAgICAgICAodm9pZCopU2tDYW52YXNHbHVlOjpkcmF3Qml0bWFwTWVzaH0sCiAgICAgeyJuYXRpdmVEcmF3VmVydGljZXMiLCAiKElJSVtGSVtGSVtJSVtTSUlJKVYiLAogICAgICAgICAodm9pZCopU2tDYW52YXNHbHVlOjpkcmF3VmVydGljZXN9LAotICAgIHsibmF0aXZlX2RyYXdUZXh0IiwiKElbQ0lJRkZJKVYiLAotICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRfX19DSUlGRlBhaW50fSwKLSAgICB7Im5hdGl2ZV9kcmF3VGV4dCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlGRkkpViIsCi0gICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dF9fU3RyaW5nSUlGRlBhaW50fSwKLSAgICB7ImRyYXdUZXh0IiwiKExqYXZhL2xhbmcvU3RyaW5nO0ZGTGFuZHJvaWQvZ3JhcGhpY3MvUGFpbnQ7KVYiLAotICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1N0cmluZ30sCisgICAgeyJuYXRpdmVfZHJhd1RleHQiLCIoSVtDSUlGRklJKVYiLAorICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRfX19DSUlGRklQYWludH0sCisgICAgeyJuYXRpdmVfZHJhd1RleHQiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJRkZJSSlWIiwKKyAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0X19TdHJpbmdJSUZGSVBhaW50fSwKKyAgICB7Im5hdGl2ZV9kcmF3VGV4dFJ1biIsIihJW0NJSUlJRkZJSSlWIiwKKyAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0UnVuX19fQ0lJSUlGRklQYWludH0sCisgICAgeyJuYXRpdmVfZHJhd1RleHRSdW4iLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJSUlGRklJKVYiLAorICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRSdW5fX1N0cmluZ0lJSUlGRklQYWludH0sCiAgICAgeyJuYXRpdmVfZHJhd1Bvc1RleHQiLCIoSVtDSUlbRkkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3UG9zVGV4dF9fX0NJSV9GUGFpbnR9LAogICAgIHsibmF0aXZlX2RyYXdQb3NUZXh0IiwiKElMamF2YS9sYW5nL1N0cmluZztbRkkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3UG9zVGV4dF9fU3RyaW5nX0ZQYWludH0sCi0gICAgeyJuYXRpdmVfZHJhd1RleHRPblBhdGgiLCIoSVtDSUlJRkZJKVYiLAorICAgIHsibmF0aXZlX2RyYXdUZXh0T25QYXRoIiwiKElbQ0lJSUZGSUkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dE9uUGF0aF9fX0NJSVBhdGhGRlBhaW50fSwKLSAgICB7Im5hdGl2ZV9kcmF3VGV4dE9uUGF0aCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUZGSSlWIiwKKyAgICB7Im5hdGl2ZV9kcmF3VGV4dE9uUGF0aCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUZGSUkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dE9uUGF0aF9fU3RyaW5nUGF0aEZGUGFpbnR9LAogICAgIHsibmF0aXZlX2RyYXdQaWN0dXJlIiwgIihJSSlWIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdQaWN0dXJlfSwKIApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9Db2xvckZpbHRlci5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmNwcAppbmRleCBlYmZiMjA5Li5mM2JlOGIwIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmNwcApAQCAtMjMsMjggKzIzLDY5IEBACiAjaW5jbHVkZSAiU2tDb2xvck1hdHJpeEZpbHRlci5oIgogI2luY2x1ZGUgIlNrUG9ydGVyRHVmZi5oIgogCisjaW5jbHVkZSA8U2tpYUNvbG9yRmlsdGVyLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgbmFtZXNwYWNlIHVpcmVuZGVyZXI7CisKIGNsYXNzIFNrQ29sb3JGaWx0ZXJHbHVlIHsKIHB1YmxpYzoKLQotICAgIHN0YXRpYyB2b2lkIGZpbmFsaXplcihKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tDb2xvckZpbHRlciogb2JqKSB7CisgICAgc3RhdGljIHZvaWQgZmluYWxpemVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa0NvbG9yRmlsdGVyKiBvYmosIFNraWFDb2xvckZpbHRlciogZikgeworICAgICAgICBkZWxldGUgZjsKICAgICAgICAgb2JqLT5zYWZlVW5yZWYoKTsKICAgICB9CiAKLSAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihKTklFbnYqIGVudiwgam9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IHNyY0NvbG9yLCBTa1BvcnRlckR1ZmY6Ok1vZGUgbW9kZSkgewotICAgICAgICByZXR1cm4gU2tDb2xvckZpbHRlcjo6Q3JlYXRlTW9kZUZpbHRlcihzcmNDb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1BvcnRlckR1ZmY6OlRvWGZlcm1vZGVNb2RlKG1vZGUpKTsKKyAgICBzdGF0aWMgU2tpYUNvbG9yRmlsdGVyKiBnbENyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGppbnQgc3JjQ29sb3IsCisgICAgICAgICAgICBTa1BvcnRlckR1ZmY6Ok1vZGUgbW9kZSkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICAgICAgcmV0dXJuIG5ldyBTa2lhQmxlbmRGaWx0ZXIoc3JjQ29sb3IsIFNrUG9ydGVyRHVmZjo6VG9YZmVybW9kZU1vZGUobW9kZSkpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKICAgICB9Ci0gCi0gICAgc3RhdGljIFNrQ29sb3JGaWx0ZXIqIENyZWF0ZUxpZ2h0aW5nRmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG11bCwgamludCBhZGQpIHsKKworICAgIHN0YXRpYyBTa2lhQ29sb3JGaWx0ZXIqIGdsQ3JlYXRlTGlnaHRpbmdGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGppbnQgbXVsLCBqaW50IGFkZCkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICAgICAgcmV0dXJuIG5ldyBTa2lhTGlnaHRpbmdGaWx0ZXIobXVsLCBhZGQpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICB9CisKKyAgICBzdGF0aWMgU2tpYUNvbG9yRmlsdGVyKiBnbENyZWF0ZUNvbG9yTWF0cml4RmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LCBqZmxvYXRBcnJheSBqYXJyYXkpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgICAgIEF1dG9KYXZhRmxvYXRBcnJheSBhdXRvQXJyYXkoZW52LCBqYXJyYXksIDIwKTsKKyAgICAgICAgY29uc3QgZmxvYXQqIHNyYyA9IGF1dG9BcnJheS5wdHIoKTsKKworICAgICAgICBmbG9hdCogY29sb3JNYXRyaXggPSBuZXcgZmxvYXRbMTZdOworICAgICAgICBtZW1jcHkoY29sb3JNYXRyaXgsIHNyYywgNCAqIHNpemVvZihmbG9hdCkpOworICAgICAgICBtZW1jcHkoJmNvbG9yTWF0cml4WzRdLCAmc3JjWzVdLCA0ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIG1lbWNweSgmY29sb3JNYXRyaXhbOF0sICZzcmNbMTBdLCA0ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIG1lbWNweSgmY29sb3JNYXRyaXhbMTJdLCAmc3JjWzE1XSwgNCAqIHNpemVvZihmbG9hdCkpOworCisgICAgICAgIGZsb2F0KiBjb2xvclZlY3RvciA9IG5ldyBmbG9hdFs0XTsKKyAgICAgICAgY29sb3JWZWN0b3JbMF0gPSBzcmNbNF07CisgICAgICAgIGNvbG9yVmVjdG9yWzFdID0gc3JjWzldOworICAgICAgICBjb2xvclZlY3RvclsyXSA9IHNyY1sxNF07CisgICAgICAgIGNvbG9yVmVjdG9yWzNdID0gc3JjWzE5XTsKKworICAgICAgICByZXR1cm4gbmV3IFNraWFDb2xvck1hdHJpeEZpbHRlcihjb2xvck1hdHJpeCwgY29sb3JWZWN0b3IpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICB9CisKKyAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihKTklFbnYqIGVudiwgam9iamVjdCwgamludCBzcmNDb2xvciwKKyAgICAgICAgICAgIFNrUG9ydGVyRHVmZjo6TW9kZSBtb2RlKSB7CisgICAgICAgIHJldHVybiBTa0NvbG9yRmlsdGVyOjpDcmVhdGVNb2RlRmlsdGVyKHNyY0NvbG9yLCBTa1BvcnRlckR1ZmY6OlRvWGZlcm1vZGVNb2RlKG1vZGUpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlTGlnaHRpbmdGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGppbnQgbXVsLCBqaW50IGFkZCkgewogICAgICAgICByZXR1cm4gU2tDb2xvckZpbHRlcjo6Q3JlYXRlTGlnaHRpbmdGaWx0ZXIobXVsLCBhZGQpOwogICAgIH0KLSAgICAKLSAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlQ29sb3JNYXRyaXhGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdEFycmF5IGphcnJheSkgeworCisgICAgc3RhdGljIFNrQ29sb3JGaWx0ZXIqIENyZWF0ZUNvbG9yTWF0cml4RmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LCBqZmxvYXRBcnJheSBqYXJyYXkpIHsKICAgICAgICAgQXV0b0phdmFGbG9hdEFycmF5IGF1dG9BcnJheShlbnYsIGphcnJheSwgMjApOwogICAgICAgICBjb25zdCBmbG9hdCogc3JjID0gYXV0b0FycmF5LnB0cigpOwogCkBAIC01OCwyNiArOTksMjUgQEAKICAgICAgICAgcmV0dXJuIG5ldyBTa0NvbG9yTWF0cml4RmlsdGVyKHNyYyk7CiAjZW5kaWYKICAgICB9Ci0gCiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGNvbG9yZmlsdGVyX21ldGhvZHNbXSA9IHsKLSAgICB7ImZpbmFsaXplciIsICIoSSlWIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6ZmluYWxpemVyfQorICAgIHsiZmluYWxpemVyIiwgIihJSSlWIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6ZmluYWxpemVyfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBwb3J0ZXJkdWZmX21ldGhvZHNbXSA9IHsKLSAgICB7Im5hdGl2ZV9DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyIiwiKElJKUkiLAotICAgICAgICAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpDcmVhdGVQb3J0ZXJEdWZmRmlsdGVyfQorICAgIHsgIm5hdGl2ZV9DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyIiwgIihJSSlJIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6Q3JlYXRlUG9ydGVyRHVmZkZpbHRlciAgIH0sCisgICAgeyAibkNyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIiLCAgICAgICAiKElJKUkiLCAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpnbENyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIgfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBsaWdodGluZ19tZXRob2RzW10gPSB7Ci0gICAgeyJuYXRpdmVfQ3JlYXRlTGlnaHRpbmdGaWx0ZXIiLCIoSUkpSSIsCi0gICAgICAgICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OkNyZWF0ZUxpZ2h0aW5nRmlsdGVyfQorICAgIHsgIm5hdGl2ZV9DcmVhdGVMaWdodGluZ0ZpbHRlciIsICIoSUkpSSIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OkNyZWF0ZUxpZ2h0aW5nRmlsdGVyICAgfSwKKyAgICB7ICJuQ3JlYXRlTGlnaHRpbmdGaWx0ZXIiLCAgICAgICAiKElJKUkiLCAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpnbENyZWF0ZUxpZ2h0aW5nRmlsdGVyIH0sCiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGNvbG9ybWF0cml4X21ldGhvZHNbXSA9IHsKLSAgICB7Im5hdGl2ZUNvbG9yTWF0cml4RmlsdGVyIiwiKFtGKUkiLAotICAgICAgICAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpDcmVhdGVDb2xvck1hdHJpeEZpbHRlcn0KKyAgICB7ICJuYXRpdmVDb2xvck1hdHJpeEZpbHRlciIsICIoW0YpSSIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OkNyZWF0ZUNvbG9yTWF0cml4RmlsdGVyICAgfSwKKyAgICB7ICJuQ29sb3JNYXRyaXhGaWx0ZXIiLCAgICAgICIoW0YpSSIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OmdsQ3JlYXRlQ29sb3JNYXRyaXhGaWx0ZXIgfQogfTsKIAogI2RlZmluZSBSRUcoZW52LCBuYW1lLCBhcnJheSkgXApAQCAtODUsNyArMTI1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS19BUlJBWV9DT1VOVChhcnJheSkpOyAgXAogICAgIGlmIChyZXN1bHQgPCAwKSByZXR1cm4gcmVzdWx0CiAKLQogaW50IHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfQ29sb3JGaWx0ZXIoSk5JRW52KiBlbnYpIHsKICAgICBpbnQgcmVzdWx0OwogICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYWludC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhaW50LmNwcAppbmRleCA3ODBiYWRjLi5jYTlmMzcxIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhaW50LmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhaW50LmNwcApAQCAtMzEsNiArMzEsMTEgQEAKICNpbmNsdWRlICJTa1NoYWRlci5oIgogI2luY2x1ZGUgIlNrVHlwZWZhY2UuaCIKICNpbmNsdWRlICJTa1hmZXJtb2RlLmgiCisjaW5jbHVkZSAidW5pY29kZS91c2hhcGUuaCIKKyNpbmNsdWRlICJUZXh0TGF5b3V0LmgiCisKKy8vIHRlbXBvcmFyeSBmb3IgZGVidWdnaW5nCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTcsNiArNjIsOSBAQAogCiBjbGFzcyBTa1BhaW50R2x1ZSB7CiBwdWJsaWM6CisgICAgZW51bSBNb3ZlT3B0IHsKKyAgICAgICAgQUZURVIsIEFUX09SX0FGVEVSLCBCRUZPUkUsIEFUX09SX0JFRk9SRSwgQVQKKyAgICB9OwogCiAgICAgc3RhdGljIHZvaWQgZmluYWxpemVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBvYmopIHsKICAgICAgICAgZGVsZXRlIG9iajsKQEAgLTM5NSwyMCArNDAzLDE2MSBAQAogICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOwogICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgfQotICAgIAotICAgIHN0YXRpYyB2b2lkIGdldFRleHRQYXRoX19fQ0lJRkZQYXRoKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGgqIHBhdGgpIHsKLSAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7Ci0gICAgICAgIHBhaW50LT5nZXRUZXh0UGF0aCh0ZXh0QXJyYXkgKyBpbmRleCwgY291bnQgPDwgMSwgU2tGbG9hdFRvU2NhbGFyKHgpLCBTa0Zsb2F0VG9TY2FsYXIoeSksIHBhdGgpOwotICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBjb25zdF9jYXN0PGpjaGFyKj4odGV4dEFycmF5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk5JX0FCT1JUKTsKKworICAgIHN0YXRpYyBqZmxvYXQgZG9UZXh0UnVuQWR2YW5jZXMoSk5JRW52ICplbnYsIFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciAqdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgc3RhcnQsIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LCBqaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0QXJyYXkgYWR2YW5jZXMsIGppbnQgYWR2YW5jZXNJbmRleCkgeworICAgICAgICBqZmxvYXQgYWR2YW5jZXNBcnJheVtjb3VudF07CisgICAgICAgIGpmbG9hdCB0b3RhbEFkdmFuY2U7CisKKyAgICAgICAgVGV4dExheW91dDo6Z2V0VGV4dFJ1bkFkdmFuY2VzKHBhaW50LCB0ZXh0LCBzdGFydCwgY291bnQsIGNvbnRleHRDb3VudCwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlc0FycmF5LCB0b3RhbEFkdmFuY2UpOworCisgICAgICAgIGlmIChhZHZhbmNlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBlbnYtPlNldEZsb2F0QXJyYXlSZWdpb24oYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgsIGNvdW50LCBhZHZhbmNlc0FycmF5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG90YWxBZHZhbmNlOwogICAgIH0KLSAKLSAgICBzdGF0aWMgdm9pZCBnZXRUZXh0UGF0aF9fU3RyaW5nSUlGRlBhdGgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LCBqc3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGgqIHBhdGgpIHsKKworICAgIHN0YXRpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXNfX19DSUlJSUlfRkkoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LAorICAgICAgICAgICAgamNoYXJBcnJheSB0ZXh0LCBqaW50IGluZGV4LCBqaW50IGNvdW50LCBqaW50IGNvbnRleHRJbmRleCwgamludCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICBqaW50IGZsYWdzLCBqZmxvYXRBcnJheSBhZHZhbmNlcywgamludCBhZHZhbmNlc0luZGV4KSB7CisgICAgICAgIGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOworICAgICAgICBqZmxvYXQgcmVzdWx0ID0gZG9UZXh0UnVuQWR2YW5jZXMoZW52LCBwYWludCwgdGV4dEFycmF5ICsgY29udGV4dEluZGV4LAorICAgICAgICAgICAgaW5kZXggLSBjb250ZXh0SW5kZXgsIGNvdW50LCBjb250ZXh0Q291bnQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIHRleHRBcnJheSwgSk5JX0FCT1JUKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzX19TdHJpbmdJSUlJSV9GSShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogcGFpbnQsCisgICAgICAgICAgICBqc3RyaW5nIHRleHQsIGppbnQgc3RhcnQsIGppbnQgZW5kLCBqaW50IGNvbnRleHRTdGFydCwgamludCBjb250ZXh0RW5kLCBqaW50IGZsYWdzLAorICAgICAgICAgICAgamZsb2F0QXJyYXkgYWR2YW5jZXMsIGppbnQgYWR2YW5jZXNJbmRleCkgewogICAgICAgICBjb25zdCBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKLSAgICAgICAgcGFpbnQtPmdldFRleHRQYXRoKHRleHRBcnJheSArIHN0YXJ0LCAoZW5kIC0gc3RhcnQpIDw8IDEsIFNrRmxvYXRUb1NjYWxhcih4KSwgU2tGbG9hdFRvU2NhbGFyKHkpLCBwYXRoKTsKKyAgICAgICAgamZsb2F0IHJlc3VsdCA9IGRvVGV4dFJ1bkFkdmFuY2VzKGVudiwgcGFpbnQsIHRleHRBcnJheSArIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgIHN0YXJ0IC0gY29udGV4dFN0YXJ0LCBlbmQgLSBzdGFydCwgY29udGV4dEVuZCAtIGNvbnRleHRTdGFydCwgZmxhZ3MsIGFkdmFuY2VzLAorICAgICAgICAgICAgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRBcnJheSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIGppbnQgZG9UZXh0UnVuQ3Vyc29yKEpOSUVudiAqZW52LCBTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIgKnRleHQsIGppbnQgc3RhcnQsCisgICAgICAgICAgICBqaW50IGNvdW50LCBqaW50IGZsYWdzLCBqaW50IG9mZnNldCwgamludCBvcHQpIHsKKyAgICAgICAgU2tTY2FsYXIgc2NhbGFyQXJyYXlbY291bnRdOworICAgICAgICBqY2hhciBidWZmZXJbY291bnRdOworCisgICAgICAgIC8vIHRoaXMgaXMgd2hlcmUgd2UnZCBjYWxsIGhhcmZidXp6CisgICAgICAgIC8vIGZvciBub3cgd2UganVzdCB1c2UgdXNoYXBlLmMgYW5kIHdpZHRocyByZXR1cm5lZCBmcm9tIHNraWEKKworICAgICAgICBpbnQgd2lkdGhzOworICAgICAgICBpZiAoZmxhZ3MgJiAweDEpIHsgLy8gcnRsLCBjYWxsIGFyYWJpYyBzaGFwaW5nIGluIGNhc2UKKyAgICAgICAgICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICAgICAgLy8gVXNlIGZpeGVkIGxlbmd0aCBzaW5jZSB3ZSBuZWVkIHRvIGtlZXAgc3RhcnQgYW5kIGNvdW50IHZhbGlkCisgICAgICAgICAgICB1X3NoYXBlQXJhYmljKHRleHQgKyBzdGFydCwgY291bnQsIGJ1ZmZlciwgY291bnQsCisgICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfTEVOR1RIX0ZJWEVEX1NQQUNFU19ORUFSIHwgVV9TSEFQRV9URVhUX0RJUkVDVElPTl9MT0dJQ0FMIHwKKyAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9MRVRURVJTX1NIQVBFIHwgVV9TSEFQRV9YX0xBTUFMRUZfU1VCX0FMVEVSTkFURSwgJnN0YXR1cyk7CisgICAgICAgICAgICAvLyB3ZSBzaG91bGRuJ3QgZmFpbCB1bmxlc3MgdGhlcmUncyBhbiBvdXQgb2YgbWVtb3J5IGNvbmRpdGlvbiwKKyAgICAgICAgICAgIC8vIGluIHdoaWNoIGNhc2Ugd2UncmUgaG9zZWQgYW55d2F5CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgaWYgKGJ1ZmZlcltpXSA9PSAweGZmZmYpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbaV0gPSAweDIwMGI7IC8vIHplcm8td2lkdGgtc3BhY2UgZm9yIHNraWEKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2lkdGhzID0gcGFpbnQtPmdldFRleHRXaWR0aHMoYnVmZmVyLCBjb3VudCA8PCAxLCBzY2FsYXJBcnJheSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3aWR0aHMgPSBwYWludC0+Z2V0VGV4dFdpZHRocyh0ZXh0ICsgc3RhcnQsIGNvdW50IDw8IDEsIHNjYWxhckFycmF5KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3aWR0aHMgPCBjb3VudCkgeworICAgICAgICAgICAgLy8gU2tpYSBvcGVyYXRlcyBvbiBjb2RlIHBvaW50cywgbm90IGNvZGUgdW5pdHMsIHNvIHN1cnJvZ2F0ZSBwYWlycyByZXR1cm4gb25seSBvbmUKKyAgICAgICAgICAgIC8vIHZhbHVlLiBFeHBhbmQgdGhlIHJlc3VsdCBzbyB3ZSBoYXZlIG9uZSB2YWx1ZSBwZXIgVVRGLTE2IGNvZGUgdW5pdC4KKworICAgICAgICAgICAgLy8gTm90ZSwgc2tpYSdzIGdldFRleHRXaWR0aCBnZXRzIGNvbmZ1c2VkIGlmIGl0IGVuY291bnRlcnMgYSBzdXJyb2dhdGUgcGFpciwKKyAgICAgICAgICAgIC8vIGxlYXZpbmcgdGhlIHJlbWFpbmluZyB3aWR0aHMgemVyby4gIE5vdCBuaWNlLgorICAgICAgICAgICAgY29uc3QgamNoYXIgKmNoYXJzID0gdGV4dCArIHN0YXJ0OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNvdW50LCBwID0gd2lkdGhzIC0gMTsgLS1pID4gcDspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hhcnNbaV0gPj0gMHhkYzAwICYmIGNoYXJzW2ldIDwgMHhlMDAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc1tpLTFdID49IDB4ZDgwMCAmJiBjaGFyc1tpLTFdIDwgMHhkYzAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNjYWxhckFycmF5W2ldID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgc2NhbGFyQXJyYXlbaV0gPSBzY2FsYXJBcnJheVstLXBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGppbnQgcG9zID0gb2Zmc2V0IC0gc3RhcnQ7CisgICAgICAgIHN3aXRjaCAob3B0KSB7CisgICAgICAgIGNhc2UgQUZURVI6CisgICAgICAgICAgaWYgKHBvcyA8IGNvdW50KSB7CisgICAgICAgICAgICBwb3MgKz0gMTsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIGNhc2UgQVRfT1JfQUZURVI6CisgICAgICAgICAgd2hpbGUgKHBvcyA8IGNvdW50ICYmIHNjYWxhckFycmF5W3Bvc10gPT0gMCkgeworICAgICAgICAgICAgKytwb3M7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJFRk9SRToKKyAgICAgICAgICBpZiAocG9zID4gMCkgeworICAgICAgICAgICAgLS1wb3M7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBjYXNlIEFUX09SX0JFRk9SRToKKyAgICAgICAgICB3aGlsZSAocG9zID4gMCAmJiBzY2FsYXJBcnJheVtwb3NdID09IDApIHsKKyAgICAgICAgICAgIC0tcG9zOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBpZiAoc2NhbGFyQXJyYXlbcG9zXSA9PSAwKSB7CisgICAgICAgICAgICBwb3MgPSAtMTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocG9zICE9IC0xKSB7CisgICAgICAgICAgcG9zICs9IHN0YXJ0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBvczsKKyAgICB9CisKKyAgICBzdGF0aWMgamludCBnZXRUZXh0UnVuQ3Vyc29yX19fQyhKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogcGFpbnQsIGpjaGFyQXJyYXkgdGV4dCwKKyAgICAgICAgICAgIGppbnQgY29udGV4dFN0YXJ0LCBqaW50IGNvbnRleHRDb3VudCwgamludCBmbGFncywgamludCBvZmZzZXQsIGppbnQgY3Vyc29yT3B0KSB7CisgICAgICAgIGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOworICAgICAgICBqaW50IHJlc3VsdCA9IGRvVGV4dFJ1bkN1cnNvcihlbnYsIHBhaW50LCB0ZXh0QXJyYXksIGNvbnRleHRTdGFydCwgY29udGV4dENvdW50LCBmbGFncywKKyAgICAgICAgICAgICAgICBvZmZzZXQsIGN1cnNvck9wdCk7CisgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIHRleHRBcnJheSwgSk5JX0FCT1JUKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgamludCBnZXRUZXh0UnVuQ3Vyc29yX19TdHJpbmcoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LCBqc3RyaW5nIHRleHQsCisgICAgICAgICAgICBqaW50IGNvbnRleHRTdGFydCwgamludCBjb250ZXh0RW5kLCBqaW50IGZsYWdzLCBqaW50IG9mZnNldCwgamludCBjdXJzb3JPcHQpIHsKKyAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7CisgICAgICAgIGppbnQgcmVzdWx0ID0gZG9UZXh0UnVuQ3Vyc29yKGVudiwgcGFpbnQsIHRleHRBcnJheSwgY29udGV4dFN0YXJ0LAorICAgICAgICAgICAgICAgIGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQsIGZsYWdzLCBvZmZzZXQsIGN1cnNvck9wdCk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRBcnJheSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgZ2V0VGV4dFBhdGgoSk5JRW52KiBlbnYsIFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciogdGV4dCwgamludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGggKnBhdGgpIHsKKyAgICAgICAgVGV4dExheW91dDo6Z2V0VGV4dFBhdGgocGFpbnQsIHRleHQsIGNvdW50LCBiaWRpRmxhZ3MsIHgsIHksIHBhdGgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGdldFRleHRQYXRoX19fQyhKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogcGFpbnQsIGppbnQgYmlkaUZsYWdzLAorICAgICAgICAgICAgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGgqIHBhdGgpIHsKKyAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7CisgICAgICAgIGdldFRleHRQYXRoKGVudiwgcGFpbnQsIHRleHRBcnJheSArIGluZGV4LCBjb3VudCwgYmlkaUZsYWdzLCB4LCB5LCBwYXRoKTsKKyAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgY29uc3RfY2FzdDxqY2hhcio+KHRleHRBcnJheSksIEpOSV9BQk9SVCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgZ2V0VGV4dFBhdGhfX1N0cmluZyhKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogcGFpbnQsIGppbnQgYmlkaUZsYWdzLAorICAgICAgICAgICAganN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYXRoKiBwYXRoKSB7CisgICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOworICAgICAgICBnZXRUZXh0UGF0aChlbnYsIHBhaW50LCB0ZXh0QXJyYXkgKyBzdGFydCwgZW5kIC0gc3RhcnQsIGJpZGlGbGFncywgeCwgeSwgcGF0aCk7CiAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRBcnJheSk7CiAgICAgfQotIAorCiAgICAgc3RhdGljIHZvaWQgc2V0U2hhZG93TGF5ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QganBhaW50LCBqZmxvYXQgcmFkaXVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCBkeCwgamZsb2F0IGR5LCBpbnQgY29sb3IpIHsKICAgICAgICAgTlBFX0NIRUNLX1JFVFVSTl9WT0lEKGVudiwganBhaW50KTsKQEAgLTU3NiwxMyArNzI1LDIwIEBACiAgICAgeyJuYXRpdmVfYnJlYWtUZXh0IiwiKExqYXZhL2xhbmcvU3RyaW5nO1pGW0YpSSIsICh2b2lkKikgU2tQYWludEdsdWU6OmJyZWFrVGV4dFN9LAogICAgIHsibmF0aXZlX2dldFRleHRXaWR0aHMiLCIoSVtDSUlbRilJIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFdpZHRoc19fX0NJSV9GfSwKICAgICB7Im5hdGl2ZV9nZXRUZXh0V2lkdGhzIiwiKElMamF2YS9sYW5nL1N0cmluZztJSVtGKUkiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0V2lkdGhzX19TdHJpbmdJSV9GfSwKLSAgICB7Im5hdGl2ZV9nZXRUZXh0UGF0aCIsIihJW0NJSUZGSSlWIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFBhdGhfX19DSUlGRlBhdGh9LAotICAgIHsibmF0aXZlX2dldFRleHRQYXRoIiwiKElMamF2YS9sYW5nL1N0cmluZztJSUZGSSlWIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFBhdGhfX1N0cmluZ0lJRkZQYXRofSwKKyAgICB7Im5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMiLCIoSVtDSUlJSUlbRkkpRiIsICh2b2lkKikKKyAgICAgICAgU2tQYWludEdsdWU6OmdldFRleHRSdW5BZHZhbmNlc19fX0NJSUlJSV9GSX0sCisgICAgeyJuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzIiwiKElMamF2YS9sYW5nL1N0cmluZztJSUlJSVtGSSlGIiwKKyAgICAgICAgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFJ1bkFkdmFuY2VzX19TdHJpbmdJSUlJSV9GSX0sCisgICAgeyJuYXRpdmVfZ2V0VGV4dFJ1bkN1cnNvciIsICIoSVtDSUlJSUkpSSIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRSdW5DdXJzb3JfX19DfSwKKyAgICB7Im5hdGl2ZV9nZXRUZXh0UnVuQ3Vyc29yIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7SUlJSUkpSSIsCisgICAgICAgICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRSdW5DdXJzb3JfX1N0cmluZ30sCisgICAgeyJuYXRpdmVfZ2V0VGV4dFBhdGgiLCIoSUlbQ0lJRkZJKVYiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UGF0aF9fX0N9LAorICAgIHsibmF0aXZlX2dldFRleHRQYXRoIiwiKElJTGphdmEvbGFuZy9TdHJpbmc7SUlGRkkpViIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRQYXRoX19TdHJpbmd9LAogICAgIHsibmF0aXZlR2V0U3RyaW5nQm91bmRzIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7SUlMYW5kcm9pZC9ncmFwaGljcy9SZWN0OylWIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRTdHJpbmdCb3VuZHMgfSwKICAgICB7Im5hdGl2ZUdldENoYXJBcnJheUJvdW5kcyIsICIoSVtDSUlMYW5kcm9pZC9ncmFwaGljcy9SZWN0OylWIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikgU2tQYWludEdsdWU6OmdldENoYXJBcnJheUJvdW5kcyB9LAotICAgIHsic2V0U2hhZG93TGF5ZXIiLCAiKEZGRkkpViIsICh2b2lkKilTa1BhaW50R2x1ZTo6c2V0U2hhZG93TGF5ZXJ9CisgICAgeyJuU2V0U2hhZG93TGF5ZXIiLCAiKEZGRkkpViIsICh2b2lkKilTa1BhaW50R2x1ZTo6c2V0U2hhZG93TGF5ZXJ9CiB9OwogCiBzdGF0aWMgamZpZWxkSUQgcmVxX2ZpZWxkSUQoamZpZWxkSUQgaWQpIHsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmNwcCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmNwcAppbmRleCBiMDljNjJiLi5jYjFjMzMzIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1NoYWRlci5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuY3BwCkBAIC04LDYgKzgsMTUgQEAKICNpbmNsdWRlICJTa1RlbXBsYXRlcy5oIgogI2luY2x1ZGUgIlNrWGZlcm1vZGUuaCIKIAorI2luY2x1ZGUgPFNraWFTaGFkZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnVpcmVuZGVyZXI7CisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGpjbGFzcyBjbGF6ejsKKyAgICBqZmllbGRJRCBzaGFkZXI7Cit9IGdTaGFkZXJDbGFzc0luZm87CisKIHN0YXRpYyB2b2lkIFRocm93SUFFX0lmTnVsbChKTklFbnYqIGVudiwgdm9pZCogcHRyKSB7CiAgICAgaWYgKE5VTEwgPT0gcHRyKSB7CiAgICAgICAgIGRvVGhyb3dJQUUoZW52KTsKQEAgLTQxLDggKzUwLDkgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIHZvaWQgU2hhZGVyX2Rlc3RydWN0b3IoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrU2hhZGVyKiBzaGFkZXIpCitzdGF0aWMgdm9pZCBTaGFkZXJfZGVzdHJ1Y3RvcihKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLCBTa2lhU2hhZGVyKiBza2lhU2hhZGVyKQogeworICAgIGRlbGV0ZSBza2lhU2hhZGVyOwogICAgIHNoYWRlci0+c2FmZVVucmVmKCk7CiB9CiAKQEAgLTUxLDcgKzYxLDggQEAKICAgICByZXR1cm4gc2hhZGVyID8gc2hhZGVyLT5nZXRMb2NhbE1hdHJpeChtYXRyaXgpIDogZmFsc2U7CiB9CiAgCi1zdGF0aWMgdm9pZCBTaGFkZXJfc2V0TG9jYWxNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrU2hhZGVyKiBzaGFkZXIsIGNvbnN0IFNrTWF0cml4KiBtYXRyaXgpCitzdGF0aWMgdm9pZCBTaGFkZXJfc2V0TG9jYWxNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwgU2tpYVNoYWRlciogc2tpYVNoYWRlciwKKyAgICAgICAgY29uc3QgU2tNYXRyaXgqIG1hdHJpeCkKIHsKICAgICBpZiAoc2hhZGVyKSB7CiAgICAgICAgIGlmIChOVUxMID09IG1hdHJpeCkgewpAQCAtNjAsMjQgKzcxLDQwIEBACiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgc2hhZGVyLT5zZXRMb2NhbE1hdHJpeCgqbWF0cml4KTsKICAgICAgICAgfQorI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICAgICAgc2tpYVNoYWRlci0+c2V0TWF0cml4KGNvbnN0X2Nhc3Q8U2tNYXRyaXgqPihtYXRyaXgpKTsKKyNlbmRpZgogICAgIH0KIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIFNrU2hhZGVyKiBCaXRtYXBTaGFkZXJfY29uc3RydWN0b3IoSk5JRW52KiBlbnYsIGpvYmplY3QsIGNvbnN0IFNrQml0bWFwKiBiaXRtYXAsCitzdGF0aWMgU2tTaGFkZXIqIEJpdG1hcFNoYWRlcl9jb25zdHJ1Y3RvcihKTklFbnYqIGVudiwgam9iamVjdCBvLCBjb25zdCBTa0JpdG1hcCogYml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVNb2RlWCwgaW50IHRpbGVNb2RlWSkKIHsKICAgICBTa1NoYWRlciogcyA9IFNrU2hhZGVyOjpDcmVhdGVCaXRtYXBTaGFkZXIoKmJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2tTaGFkZXI6OlRpbGVNb2RlKXRpbGVNb2RlWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2tTaGFkZXI6OlRpbGVNb2RlKXRpbGVNb2RlWSk7CisKICAgICBUaHJvd0lBRV9JZk51bGwoZW52LCBzKTsKICAgICByZXR1cm4gczsKIH0KKworc3RhdGljIFNraWFTaGFkZXIqIEJpdG1hcFNoYWRlcl9wb3N0Q29uc3RydWN0b3IoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwKKyAgICAgICAgU2tCaXRtYXAqIGJpdG1hcCwgaW50IHRpbGVNb2RlWCwgaW50IHRpbGVNb2RlWSkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICBTa2lhU2hhZGVyKiBza2lhU2hhZGVyID0gbmV3IFNraWFCaXRtYXBTaGFkZXIoYml0bWFwLCBzaGFkZXIsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxTa1NoYWRlcjo6VGlsZU1vZGU+KHRpbGVNb2RlWCksIHN0YXRpY19jYXN0PFNrU2hhZGVyOjpUaWxlTW9kZT4odGlsZU1vZGVZKSwKKyAgICAgICAgICAgIE5VTEwsIChzaGFkZXItPmdldEZsYWdzKCkgJiBTa1NoYWRlcjo6a09wYXF1ZUFscGhhX0ZsYWcpID09IDApOworICAgIHJldHVybiBza2lhU2hhZGVyOworI2Vsc2UKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQogICAgIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIFNrU2hhZGVyKiBMaW5lYXJHcmFkaWVudF9jcmVhdGUxKEpOSUVudiogZW52LCBqb2JqZWN0LAorc3RhdGljIFNrU2hhZGVyKiBMaW5lYXJHcmFkaWVudF9jcmVhdGUxKEpOSUVudiogZW52LCBqb2JqZWN0IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludEFycmF5IGNvbG9yQXJyYXksIGpmbG9hdEFycmF5IHBvc0FycmF5LCBpbnQgdGlsZU1vZGUpCiB7CkBAIC04NSwzMSArMTEyLDk1IEBACiAgICAgcHRzWzBdLnNldChTa0Zsb2F0VG9TY2FsYXIoeDApLCBTa0Zsb2F0VG9TY2FsYXIoeTApKTsKICAgICBwdHNbMV0uc2V0KFNrRmxvYXRUb1NjYWxhcih4MSksIFNrRmxvYXRUb1NjYWxhcih5MSkpOwogCi0gICAgc2l6ZV90ICAgICAgY291bnQgPSBlbnYtPkdldEFycmF5TGVuZ3RoKGNvbG9yQXJyYXkpOworICAgIHNpemVfdCBjb3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoY29sb3JBcnJheSk7CiAgICAgY29uc3QgamludCogY29sb3JWYWx1ZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoY29sb3JBcnJheSwgTlVMTCk7CiAKICAgICBTa0F1dG9TVE1hbGxvYzw4LCBTa1NjYWxhcj4gc3RvcmFnZShwb3NBcnJheSA/IGNvdW50IDogMCk7CiAgICAgU2tTY2FsYXIqICAgICAgICAgICAgICAgICAgIHBvcyA9IE5VTEw7Ci0gICAgCisKICAgICBpZiAocG9zQXJyYXkpIHsKICAgICAgICAgQXV0b0phdmFGbG9hdEFycmF5IGF1dG9Qb3MoZW52LCBwb3NBcnJheSwgY291bnQpOwogICAgICAgICBjb25zdCBmbG9hdCogcG9zVmFsdWVzID0gYXV0b1Bvcy5wdHIoKTsKICAgICAgICAgcG9zID0gKFNrU2NhbGFyKilzdG9yYWdlLmdldCgpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgcG9zW2ldID0gU2tGbG9hdFRvU2NhbGFyKHBvc1ZhbHVlc1tpXSk7CisgICAgICAgIH0KICAgICB9Ci0KKyAgICAKICAgICBTa1NoYWRlciogc2hhZGVyID0gU2tHcmFkaWVudFNoYWRlcjo6Q3JlYXRlTGluZWFyKHB0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTa0NvbG9yKj4oY29sb3JWYWx1ZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MsIGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTa1NoYWRlcjo6VGlsZU1vZGU+KHRpbGVNb2RlKSk7Ci0gICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhjb2xvckFycmF5LCBjb25zdF9jYXN0PGppbnQqPihjb2xvclZhbHVlcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKTklfQUJPUlQpOworCisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhjb2xvckFycmF5LCBjb25zdF9jYXN0PGppbnQqPihjb2xvclZhbHVlcyksIEpOSV9BQk9SVCk7CiAgICAgVGhyb3dJQUVfSWZOdWxsKGVudiwgc2hhZGVyKTsKICAgICByZXR1cm4gc2hhZGVyOwogfQogCi1zdGF0aWMgU2tTaGFkZXIqIExpbmVhckdyYWRpZW50X2NyZWF0ZTIoSk5JRW52KiBlbnYsIGpvYmplY3QsCitzdGF0aWMgU2tpYVNoYWRlciogTGluZWFyR3JhZGllbnRfcG9zdENyZWF0ZTEoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwKKyAgICAgICAgZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsIGppbnRBcnJheSBjb2xvckFycmF5LAorICAgICAgICBqZmxvYXRBcnJheSBwb3NBcnJheSwgaW50IHRpbGVNb2RlKSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIHNpemVfdCBjb3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoY29sb3JBcnJheSk7CisgICAgY29uc3QgamludCogY29sb3JWYWx1ZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoY29sb3JBcnJheSwgTlVMTCk7CisKKyAgICBqZmxvYXQqIHN0b3JlZEJvdW5kcyA9IG5ldyBqZmxvYXRbNF07CisgICAgc3RvcmVkQm91bmRzWzBdID0geDA7IHN0b3JlZEJvdW5kc1sxXSA9IHkwOworICAgIHN0b3JlZEJvdW5kc1syXSA9IHgxOyBzdG9yZWRCb3VuZHNbM10gPSB5MTsKKyAgICBqZmxvYXQqIHN0b3JlZFBvc2l0aW9ucyA9IG5ldyBqZmxvYXRbY291bnRdOworICAgIHVpbnQzMl90KiBzdG9yZWRDb2xvcnMgPSBuZXcgdWludDMyX3RbY291bnRdOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBzdG9yZWRDb2xvcnNbaV0gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29sb3JWYWx1ZXNbaV0pOworICAgIH0KKworICAgIGlmIChwb3NBcnJheSkgeworICAgICAgICBBdXRvSmF2YUZsb2F0QXJyYXkgYXV0b1BvcyhlbnYsIHBvc0FycmF5LCBjb3VudCk7CisgICAgICAgIGNvbnN0IGZsb2F0KiBwb3NWYWx1ZXMgPSBhdXRvUG9zLnB0cigpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHN0b3JlZFBvc2l0aW9uc1tpXSA9IHBvc1ZhbHVlc1tpXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0b3JlZFBvc2l0aW9uc1swXSA9IDAuMGY7CisgICAgICAgIHN0b3JlZFBvc2l0aW9uc1sxXSA9IDEuMGY7CisgICAgfQorCisgICAgU2tpYVNoYWRlciogc2tpYVNoYWRlciA9IG5ldyBTa2lhTGluZWFyR3JhZGllbnRTaGFkZXIoc3RvcmVkQm91bmRzLCBzdG9yZWRDb2xvcnMsCisgICAgICAgICAgICBzdG9yZWRQb3NpdGlvbnMsIGNvdW50LCBzaGFkZXIsIHN0YXRpY19jYXN0PFNrU2hhZGVyOjpUaWxlTW9kZT4odGlsZU1vZGUpLCBOVUxMLAorICAgICAgICAgICAgKHNoYWRlci0+Z2V0RmxhZ3MoKSAmIFNrU2hhZGVyOjprT3BhcXVlQWxwaGFfRmxhZykgPT0gMCk7CisKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGNvbG9yQXJyYXksIGNvbnN0X2Nhc3Q8amludCo+KGNvbG9yVmFsdWVzKSwgSk5JX0FCT1JUKTsKKyAgICByZXR1cm4gc2tpYVNoYWRlcjsKKyNlbHNlCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKK30KKworc3RhdGljIFNraWFTaGFkZXIqIExpbmVhckdyYWRpZW50X3Bvc3RDcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0IG8sIFNrU2hhZGVyKiBzaGFkZXIsCisgICAgICAgIGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLCBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBpbnQgdGlsZU1vZGUpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgZmxvYXQqIHN0b3JlZEJvdW5kcyA9IG5ldyBmbG9hdFs0XTsKKyAgICBzdG9yZWRCb3VuZHNbMF0gPSB4MDsgc3RvcmVkQm91bmRzWzFdID0geTA7CisgICAgc3RvcmVkQm91bmRzWzJdID0geDE7IHN0b3JlZEJvdW5kc1szXSA9IHkxOworCisgICAgZmxvYXQqIHN0b3JlZFBvc2l0aW9ucyA9IG5ldyBmbG9hdFsyXTsKKyAgICBzdG9yZWRQb3NpdGlvbnNbMF0gPSAwLjBmOworICAgIHN0b3JlZFBvc2l0aW9uc1sxXSA9IDEuMGY7CisKKyAgICB1aW50MzJfdCogc3RvcmVkQ29sb3JzID0gbmV3IHVpbnQzMl90WzJdOworICAgIHN0b3JlZENvbG9yc1swXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2xvcjApOworICAgIHN0b3JlZENvbG9yc1sxXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2xvcjEpOworCisgICAgU2tpYVNoYWRlciogc2tpYVNoYWRlciA9IG5ldyBTa2lhTGluZWFyR3JhZGllbnRTaGFkZXIoc3RvcmVkQm91bmRzLCBzdG9yZWRDb2xvcnMsCisgICAgICAgICAgICBzdG9yZWRQb3NpdGlvbnMsIDIsIHNoYWRlciwgc3RhdGljX2Nhc3Q8U2tTaGFkZXI6OlRpbGVNb2RlPih0aWxlTW9kZSksIE5VTEwsCisgICAgICAgICAgICAoc2hhZGVyLT5nZXRGbGFncygpICYgU2tTaGFkZXI6OmtPcGFxdWVBbHBoYV9GbGFnKSA9PSAwKTsKKworICAgIHJldHVybiBza2lhU2hhZGVyOworI2Vsc2UKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCitzdGF0aWMgU2tTaGFkZXIqIExpbmVhckdyYWRpZW50X2NyZWF0ZTIoSk5JRW52KiBlbnYsIGpvYmplY3QgbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBpbnQgdGlsZU1vZGUpCiB7CkBAIC0xMjAsOCArMjExLDkgQEAKICAgICBTa0NvbG9yIGNvbG9yc1syXTsKICAgICBjb2xvcnNbMF0gPSBjb2xvcjA7CiAgICAgY29sb3JzWzFdID0gY29sb3IxOwotCisgICAgCiAgICAgU2tTaGFkZXIqIHMgPSBTa0dyYWRpZW50U2hhZGVyOjpDcmVhdGVMaW5lYXIocHRzLCBjb2xvcnMsIE5VTEwsIDIsIChTa1NoYWRlcjo6VGlsZU1vZGUpdGlsZU1vZGUpOworCiAgICAgVGhyb3dJQUVfSWZOdWxsKGVudiwgcyk7CiAgICAgcmV0dXJuIHM7CiB9CkBAIC0yMjIsMTggKzMxNCw0MiBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1zdGF0aWMgU2tTaGFkZXIqIENvbXBvc2VTaGFkZXJfY3JlYXRlMShKTklFbnYqIGVudiwgam9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrU2hhZGVyKiBzaGFkZXJBLCBTa1NoYWRlciogc2hhZGVyQiwgU2tYZmVybW9kZSogbW9kZSkKK3N0YXRpYyBTa1NoYWRlciogQ29tcG9zZVNoYWRlcl9jcmVhdGUxKEpOSUVudiogZW52LCBqb2JqZWN0IG8sCisgICAgICAgIFNrU2hhZGVyKiBzaGFkZXJBLCBTa1NoYWRlciogc2hhZGVyQiwgU2tYZmVybW9kZSogbW9kZSkKIHsKICAgICByZXR1cm4gbmV3IFNrQ29tcG9zZVNoYWRlcihzaGFkZXJBLCBzaGFkZXJCLCBtb2RlKTsKIH0KIAotc3RhdGljIFNrU2hhZGVyKiBDb21wb3NlU2hhZGVyX2NyZWF0ZTIoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1NoYWRlciogc2hhZGVyQSwgU2tTaGFkZXIqIHNoYWRlckIsIFNrUG9ydGVyRHVmZjo6TW9kZSBtb2RlKQorc3RhdGljIFNrU2hhZGVyKiBDb21wb3NlU2hhZGVyX2NyZWF0ZTIoSk5JRW52KiBlbnYsIGpvYmplY3QgbywKKyAgICAgICAgU2tTaGFkZXIqIHNoYWRlckEsIFNrU2hhZGVyKiBzaGFkZXJCLCBTa1BvcnRlckR1ZmY6Ok1vZGUgcG9ydGVyRHVmZk1vZGUpCiB7Ci0gICAgU2tBdXRvVW5yZWYgYXUoU2tQb3J0ZXJEdWZmOjpDcmVhdGVYZmVybW9kZShtb2RlKSk7CisgICAgU2tBdXRvVW5yZWYgYXUoU2tQb3J0ZXJEdWZmOjpDcmVhdGVYZmVybW9kZShwb3J0ZXJEdWZmTW9kZSkpOworICAgIFNrWGZlcm1vZGUqIG1vZGUgPSAoU2tYZmVybW9kZSopIGF1LmdldCgpOworICAgIHJldHVybiBuZXcgU2tDb21wb3NlU2hhZGVyKHNoYWRlckEsIHNoYWRlckIsIG1vZGUpOworfQogCi0gICAgcmV0dXJuIG5ldyBTa0NvbXBvc2VTaGFkZXIoc2hhZGVyQSwgc2hhZGVyQiwgKFNrWGZlcm1vZGUqKWF1LmdldCgpKTsKK3N0YXRpYyBTa2lhU2hhZGVyKiBDb21wb3NlU2hhZGVyX3Bvc3RDcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0IG8sIFNrU2hhZGVyKiBzaGFkZXIsCisgICAgICAgIFNraWFTaGFkZXIqIHNoYWRlckEsIFNraWFTaGFkZXIqIHNoYWRlckIsIFNrUG9ydGVyRHVmZjo6TW9kZSBwb3J0ZXJEdWZmTW9kZSkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGUgPSBTa1BvcnRlckR1ZmY6OlRvWGZlcm1vZGVNb2RlKHBvcnRlckR1ZmZNb2RlKTsKKyAgICByZXR1cm4gbmV3IFNraWFDb21wb3NlU2hhZGVyKHNoYWRlckEsIHNoYWRlckIsIG1vZGUsIHNoYWRlcik7CisjZWxzZQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCit9CisKK3N0YXRpYyBTa2lhU2hhZGVyKiBDb21wb3NlU2hhZGVyX3Bvc3RDcmVhdGUxKEpOSUVudiogZW52LCBqb2JqZWN0IG8sIFNrU2hhZGVyKiBzaGFkZXIsCisgICAgICAgIFNraWFTaGFkZXIqIHNoYWRlckEsIFNraWFTaGFkZXIqIHNoYWRlckIsIFNrWGZlcm1vZGUqIG1vZGUpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgU2tYZmVybW9kZTo6TW9kZSBza2lhTW9kZTsKKyAgICBpZiAoIVNrWGZlcm1vZGU6OklzTW9kZShtb2RlLCAmc2tpYU1vZGUpKSB7CisgICAgICAgIC8vIFRPRE86IFN1cHBvcnQgb3RoZXIgbW9kZXMKKyAgICAgICAgc2tpYU1vZGUgPSBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlOworICAgIH0KKyAgICByZXR1cm4gbmV3IFNraWFDb21wb3NlU2hhZGVyKHNoYWRlckEsIHNoYWRlckIsIHNraWFNb2RlLCBzaGFkZXIpOworI2Vsc2UKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMjQ0LDE4ICszNjAsMjEgQEAKIH07CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ1NoYWRlck1ldGhvZHNbXSA9IHsKLSAgICB7ICJuYXRpdmVEZXN0cnVjdG9yIiwgICAgICAgICIoSSlWIiwgICAgICh2b2lkKilTaGFkZXJfZGVzdHJ1Y3RvciAgICAgICAgfSwKKyAgICB7ICJuYXRpdmVEZXN0cnVjdG9yIiwgICAgICAgICIoSUkpViIsICAgICh2b2lkKilTaGFkZXJfZGVzdHJ1Y3RvciAgICAgICAgfSwKICAgICB7ICJuYXRpdmVHZXRMb2NhbE1hdHJpeCIsICAgICIoSUkpWiIsICAgICh2b2lkKilTaGFkZXJfZ2V0TG9jYWxNYXRyaXggICAgfSwKLSAgICB7ICJuYXRpdmVTZXRMb2NhbE1hdHJpeCIsICAgICIoSUkpViIsICAgICh2b2lkKilTaGFkZXJfc2V0TG9jYWxNYXRyaXggICAgfQorICAgIHsgIm5hdGl2ZVNldExvY2FsTWF0cml4IiwgICAgIihJSUkpViIsICAgKHZvaWQqKVNoYWRlcl9zZXRMb2NhbE1hdHJpeCAgICB9CiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdCaXRtYXBTaGFkZXJNZXRob2RzW10gPSB7Ci0gICAgeyAibmF0aXZlQ3JlYXRlIiwgICAiKElJSSlJIiwgICh2b2lkKilCaXRtYXBTaGFkZXJfY29uc3RydWN0b3IgfQorICAgIHsgIm5hdGl2ZUNyZWF0ZSIsICAgICAiKElJSSlJIiwgICh2b2lkKilCaXRtYXBTaGFkZXJfY29uc3RydWN0b3IgfSwKKyAgICB7ICJuYXRpdmVQb3N0Q3JlYXRlIiwgIihJSUlJKUkiLCAodm9pZCopQml0bWFwU2hhZGVyX3Bvc3RDb25zdHJ1Y3RvciB9CiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdMaW5lYXJHcmFkaWVudE1ldGhvZHNbXSA9IHsKLSAgICB7ICJuYXRpdmVDcmVhdGUxIiwgICIoRkZGRltJW0ZJKUkiLCAodm9pZCopTGluZWFyR3JhZGllbnRfY3JlYXRlMSAgIH0sCi0gICAgeyAibmF0aXZlQ3JlYXRlMiIsICAiKEZGRkZJSUkpSSIsICAgKHZvaWQqKUxpbmVhckdyYWRpZW50X2NyZWF0ZTIgICB9CisgICAgeyAibmF0aXZlQ3JlYXRlMSIsICAgICAiKEZGRkZbSVtGSSlJIiwgICh2b2lkKilMaW5lYXJHcmFkaWVudF9jcmVhdGUxICAgICB9LAorICAgIHsgIm5hdGl2ZUNyZWF0ZTIiLCAgICAgIihGRkZGSUlJKUkiLCAgICAodm9pZCopTGluZWFyR3JhZGllbnRfY3JlYXRlMiAgICAgfSwKKyAgICB7ICJuYXRpdmVQb3N0Q3JlYXRlMSIsICIoSUZGRkZbSVtGSSlJIiwgKHZvaWQqKUxpbmVhckdyYWRpZW50X3Bvc3RDcmVhdGUxIH0sCisgICAgeyAibmF0aXZlUG9zdENyZWF0ZTIiLCAiKElGRkZGSUlJKUkiLCAgICh2b2lkKilMaW5lYXJHcmFkaWVudF9wb3N0Q3JlYXRlMiB9CiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdSYWRpYWxHcmFkaWVudE1ldGhvZHNbXSA9IHsKQEAgLTI2OSw4ICszODgsMTAgQEAKIH07CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ0NvbXBvc2VTaGFkZXJNZXRob2RzW10gPSB7Ci0gICAgeyJuYXRpdmVDcmVhdGUxIiwgICIoSUlJKUkiLCAgICAodm9pZCopQ29tcG9zZVNoYWRlcl9jcmVhdGUxIH0sCi0gICAgeyJuYXRpdmVDcmVhdGUyIiwgICIoSUlJKUkiLCAgICAodm9pZCopQ29tcG9zZVNoYWRlcl9jcmVhdGUyIH0KKyAgICB7Im5hdGl2ZUNyZWF0ZTEiLCAgICAgICIoSUlJKUkiLCAgICh2b2lkKilDb21wb3NlU2hhZGVyX2NyZWF0ZTEgICAgIH0sCisgICAgeyJuYXRpdmVDcmVhdGUyIiwgICAgICAiKElJSSlJIiwgICAodm9pZCopQ29tcG9zZVNoYWRlcl9jcmVhdGUyICAgICB9LAorICAgIHsibmF0aXZlUG9zdENyZWF0ZTEiLCAgIihJSUlJKUkiLCAgKHZvaWQqKUNvbXBvc2VTaGFkZXJfcG9zdENyZWF0ZTEgfSwKKyAgICB7Im5hdGl2ZVBvc3RDcmVhdGUyIiwgICIoSUlJSSlJIiwgICh2b2lkKilDb21wb3NlU2hhZGVyX3Bvc3RDcmVhdGUyIH0KIH07CiAKICNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVGV4dExheW91dC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0N2UxZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuY3BwCkBAIC0wLDAgKzEsMzQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlRleHRMYXlvdXQuaCIKKworI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorCisjaW5jbHVkZSAiU2tUZW1wbGF0ZXMuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3ViaWRpLmgiCisjaW5jbHVkZSAidW5pY29kZS91c2hhcGUuaCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyBSZXR1cm5zIHRydWUgaWYgd2UgbWlnaHQgbmVlZCBsYXlvdXQuICBJZiBiaWRpRmxhZ3MgZm9yY2UgTFRSLCBhc3N1bWUgbm8gbGF5b3V0LCBpZgorLy8gYmlkaUZsYWdzIGluZGljYXRlIHRoZXJlIHByb2JhYmx5IGlzIFJUTCwgYXNzdW1lIHdlIGRvLCBvdGhlcndpc2Ugc2NhbiB0aGUgdGV4dAorLy8gbG9va2luZyBmb3IgYSBjaGFyYWN0ZXIgPj0gdGhlIGZpcnN0IFJUTCBjaGFyYWN0ZXIgaW4gdW5pY29kZSBhbmQgYXNzdW1lIHdlIGRvIGlmCisvLyB3ZSBmaW5kIG9uZS4KK2Jvb2wgVGV4dExheW91dDo6bmVlZHNMYXlvdXQoY29uc3QgamNoYXIqIHRleHQsIGppbnQgbGVuLCBqaW50IGJpZGlGbGFncykgeworICAgIGlmIChiaWRpRmxhZ3MgPT0ga0JpZGlfRm9yY2VfTFRSKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKChiaWRpRmxhZ3MgPT0ga0JpZGlfUlRMKSB8fCAoYmlkaUZsYWdzID09IGtCaWRpX0RlZmF1bHRfUlRMKSB8fAorICAgICAgICAgICAgYmlkaUZsYWdzID09IGtCaWRpX0ZvcmNlX1JUTCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICBpZiAodGV4dFtpXSA+PSAweDA1OTApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBDaGFyYWN0ZXItYmFzZWQgQXJhYmljIHNoYXBpbmcuCisgKgorICogV2UnbGwgdXNlIGhhcmZidXp6IGFuZCBnbHlwaC1iYXNlZCBzaGFwaW5nIGluc3RlYWQgb25jZSB3ZSdyZSBzZXQgdXAgZm9yIGl0LgorICoKKyAqIEBjb250ZXh0IHRoZSB0ZXh0IGNvbnRleHQKKyAqIEBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gcmVuZGVyCisgKiBAY291bnQgdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCB0byByZW5kZXIsIHN0YXJ0ICsgY291bnQgIG11c3QgYmUgPD0gY29udGV4dENvdW50CisgKiBAY29udGV4dENvdW50IHRoZSBsZW5ndGggb2YgdGhlIGNvbnRleHQKKyAqIEBzaGFwZWQgd2hlcmUgdG8gcHV0IHRoZSBzaGFwZWQgdGV4dCwgbXVzdCBoYXZlIGNhcGFjaXR5IGZvciBjb3VudCB1Y2hhcnMKKyAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgc2hhcGVkIHRleHQsIG9yIC0xIGlmIGVycm9yCisgKi8KK2ludCBUZXh0TGF5b3V0OjpzaGFwZVJ0bFRleHQoY29uc3QgamNoYXIqIGNvbnRleHQsIGpzaXplIHN0YXJ0LCBqc2l6ZSBjb3VudCwganNpemUgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgamNoYXIqIHNoYXBlZCwgVUVycm9yQ29kZSAmc3RhdHVzKSB7CisgICAgamNoYXIgYnVmZmVyW2NvbnRleHRDb3VudF07CisKKyAgICAvLyBVc2UgZml4ZWQgbGVuZ3RoIHNpbmNlIHdlIG5lZWQgdG8ga2VlcCBzdGFydCBhbmQgY291bnQgdmFsaWQKKyAgICB1X3NoYXBlQXJhYmljKGNvbnRleHQsIGNvbnRleHRDb3VudCwgYnVmZmVyLCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9MRU5HVEhfRklYRURfU1BBQ0VTX05FQVIgfAorICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCB8IFVfU0hBUEVfTEVUVEVSU19TSEFQRSB8CisgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9YX0xBTUFMRUZfU1VCX0FMVEVSTkFURSwgJnN0YXR1cyk7CisKKyAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgLy8gdHJpbSBvdXQgMHhmZmZmIGZvbGxvd2luZyBsaWdhdHVyZXMsIGlmIGFueQorICAgICAgICBpbnQgZW5kID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gc3RhcnQgKyBjb3VudDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlcltpXSAhPSAweGZmZmYpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbZW5kKytdID0gYnVmZmVyW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvdW50ID0gZW5kOworICAgICAgICAvLyBMT0coTE9HX0lORk8sICJDU1JUTCIsICJzdGFydCAlZCBjb3VudCAlZCBjY291bnQgJWRcbiIsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50KTsKKyAgICAgICAgdWJpZGlfd3JpdGVSZXZlcnNlKGJ1ZmZlciwgY291bnQsIHNoYXBlZCwgY291bnQsIFVCSURJX0RPX01JUlJPUklORyB8IFVCSURJX09VVFBVVF9SRVZFUlNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVCSURJX0tFRVBfQkFTRV9DT01CSU5JTkcsICZzdGF0dXMpOworICAgICAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworLyoqCisgKiBCYXNpYyBjaGFyYWN0ZXItYmFzZWQgbGF5b3V0IHN1cHBvcnRpbmcgcnRsIGFuZCBhcmFiaWMgc2hhcGluZy4KKyAqIFJ1bnMgYmlkaSBvbiB0aGUgdGV4dCBhbmQgZ2VuZXJhdGVzIGEgcmVvcmRlcmVkLCBzaGFwZWQgbGluZSBpbiBidWZmZXIsIHJldHVybmluZworICogdGhlIGxlbmd0aC4KKyAqIEB0ZXh0IHRoZSB0ZXh0CisgKiBAbGVuIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgaW4gdWNoYXJzCisgKiBAZGlyIHJlY2VpdmVzIHRoZSByZXNvbHZlZCBwYXJhZ3JhcGggZGlyZWN0aW9uCisgKiBAYnVmZmVyIHRoZSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgcmVvcmRlcmVkLCBzaGFwZWQgbGluZS4gIE11c3QgaGF2ZSBjYXBhY2l0eSBvZgorICogYXQgbGVhc3QgbGVuIGpjaGFycy4KKyAqIEBmbGFncyBsaW5lIGJpZGkgZmxhZ3MKKyAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcmVvcmRlcmVkLCBzaGFwZWQgbGluZSwgb3IgLTEgaWYgZXJyb3IKKyAqLworamludCBUZXh0TGF5b3V0OjpsYXlvdXRMaW5lKGNvbnN0IGpjaGFyKiB0ZXh0LCBqaW50IGxlbiwgamludCBmbGFncywgaW50ICZkaXIsIGpjaGFyKiBidWZmZXIsCisgICAgICAgIFVFcnJvckNvZGUgJnN0YXR1cykgeworICAgIHN0YXRpYyBjb25zdCBpbnQgUlRMX09QVFMgPSBVQklESV9ET19NSVJST1JJTkcgfCBVQklESV9LRUVQX0JBU0VfQ09NQklOSU5HIHwKKyAgICAgICAgICAgIFVCSURJX1JFTU9WRV9CSURJX0NPTlRST0xTIHwgVUJJRElfT1VUUFVUX1JFVkVSU0U7CisKKyAgICBVQmlEaUxldmVsIGJpZGlSZXEgPSAwOworICAgIHN3aXRjaCAoZmxhZ3MpIHsKKyAgICBjYXNlIGtCaWRpX0xUUjogYmlkaVJlcSA9IDA7IGJyZWFrOyAvLyBubyBJQ1UgY29uc3RhbnQsIGNhbm9uaWNhbCBMVFIgbGV2ZWwKKyAgICBjYXNlIGtCaWRpX1JUTDogYmlkaVJlcSA9IDE7IGJyZWFrOyAvLyBubyBJQ1UgY29uc3RhbnQsIGNhbm9uaWNhbCBSVEwgbGV2ZWwKKyAgICBjYXNlIGtCaWRpX0RlZmF1bHRfTFRSOiBiaWRpUmVxID0gVUJJRElfREVGQVVMVF9MVFI7IGJyZWFrOworICAgIGNhc2Uga0JpZGlfRGVmYXVsdF9SVEw6IGJpZGlSZXEgPSBVQklESV9ERUZBVUxUX1JUTDsgYnJlYWs7CisgICAgY2FzZSBrQmlkaV9Gb3JjZV9MVFI6IG1lbWNweShidWZmZXIsIHRleHQsIGxlbiAqIHNpemVvZihqY2hhcikpOyByZXR1cm4gbGVuOworICAgIGNhc2Uga0JpZGlfRm9yY2VfUlRMOiByZXR1cm4gc2hhcGVSdGxUZXh0KHRleHQsIDAsIGxlbiwgbGVuLCBidWZmZXIsIHN0YXR1cyk7CisgICAgfQorCisgICAgaW50MzJfdCByZXN1bHQgPSAtMTsKKworICAgIFVCaURpKiBiaWRpID0gdWJpZGlfb3BlbigpOworICAgIGlmIChiaWRpKSB7CisgICAgICAgIHViaWRpX3NldFBhcmEoYmlkaSwgdGV4dCwgbGVuLCBiaWRpUmVxLCBOVUxMLCAmc3RhdHVzKTsKKyAgICAgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICBkaXIgPSB1YmlkaV9nZXRQYXJhTGV2ZWwoYmlkaSkgJiAweDE7IC8vIDAgaWYgbHRyLCAxIGlmIHJ0bAorCisgICAgICAgICAgICBpbnQgcmMgPSB1YmlkaV9jb3VudFJ1bnMoYmlkaSwgJnN0YXR1cyk7CisgICAgICAgICAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICAvLyBMT0coTE9HX0lORk8sICJMQVlPVVQiLCAicGFyYSBiaWRpUmVxPSVkIGRpcj0lZCByYz0lZFxuIiwgYmlkaVJlcSwgZGlyLCByYyk7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IHNsZW4gPSAwOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0OworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgVUJpRGlEaXJlY3Rpb24gcnVuRGlyID0gdWJpZGlfZ2V0VmlzdWFsUnVuKGJpZGksIGksICZzdGFydCwgJmxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bkRpciA9PSBVQklESV9SVEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsZW4gKz0gc2hhcGVSdGxUZXh0KHRleHQgKyBzdGFydCwgMCwgbGVuZ3RoLCBsZW5ndGgsIGJ1ZmZlciArIHNsZW4sIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyICsgc2xlbiwgdGV4dCArIHN0YXJ0LCBsZW5ndGggKiBzaXplb2YoamNoYXIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsZW4gKz0gbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzbGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1YmlkaV9jbG9zZShiaWRpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitib29sIFRleHRMYXlvdXQ6OnByZXBhcmVUZXh0KFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLCBqaW50IGJpZGlGbGFncywKKyAgICAgICAgY29uc3QgamNoYXIqKiBvdXRUZXh0LCBpbnQzMl90KiBvdXRCeXRlcywgamNoYXIqKiBvdXRCdWZmZXIpIHsKKyAgICBjb25zdCBqY2hhciAqd29ya1RleHQgPSB0ZXh0OworICAgIGpjaGFyICpidWZmZXIgPSBOVUxMOworICAgIGludCBkaXIgPSBrRGlyZWN0aW9uX0xUUjsKKyAgICBpZiAobmVlZHNMYXlvdXQodGV4dCwgbGVuLCBiaWRpRmxhZ3MpKSB7CisgICAgICAgIGJ1ZmZlciA9KGpjaGFyICopIG1hbGxvYyhsZW4gKiBzaXplb2YoamNoYXIpKTsKKyAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgbGVuID0gbGF5b3V0TGluZSh0ZXh0LCBsZW4sIGJpZGlGbGFncywgZGlyLCBidWZmZXIsIHN0YXR1cyk7IC8vIG1pZ2h0IGNoYW5nZSBsZW4sIGRpcgorICAgICAgICBpZiAoIVVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICBMT0coTE9HX1dBUk4sICJMQVlPVVQiLCAiZHJhd1RleHQgZXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGNhbid0IHJlbmRlcgorICAgICAgICB9CisKKyAgICAgICAgd29ya1RleHQgPSBidWZmZXI7IC8vIHVzZSB0aGUgc2hhcGVkIHRleHQKKyAgICB9CisKKyAgICBib29sIHRyaW1MZWZ0ID0gZmFsc2U7CisgICAgYm9vbCB0cmltUmlnaHQgPSBmYWxzZTsKKworICAgIFNrUGFpbnQ6OkFsaWduIGhvcml6ID0gcGFpbnQtPmdldFRleHRBbGlnbigpOworICAgIHN3aXRjaCAoaG9yaXopIHsKKyAgICAgICAgY2FzZSBTa1BhaW50OjprTGVmdF9BbGlnbjogdHJpbUxlZnQgPSBkaXIgJiBrRGlyZWN0aW9uX01hc2s7IGJyZWFrOworICAgICAgICBjYXNlIFNrUGFpbnQ6OmtDZW50ZXJfQWxpZ246IHRyaW1MZWZ0ID0gdHJpbVJpZ2h0ID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgIGNhc2UgU2tQYWludDo6a1JpZ2h0X0FsaWduOiB0cmltUmlnaHQgPSAhKGRpciAmIGtEaXJlY3Rpb25fTWFzayk7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKyAgICBjb25zdCBqY2hhciogd29ya0xpbWl0ID0gd29ya1RleHQgKyBsZW47CisKKyAgICBpZiAodHJpbUxlZnQpIHsKKyAgICAgICAgd2hpbGUgKHdvcmtUZXh0IDwgd29ya0xpbWl0ICYmICp3b3JrVGV4dCA9PSAnICcpIHsKKyAgICAgICAgICAgICsrd29ya1RleHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHRyaW1SaWdodCkgeworICAgICAgICB3aGlsZSAod29ya0xpbWl0ID4gd29ya1RleHQgJiYgKih3b3JrTGltaXQgLSAxKSA9PSAnICcpIHsKKyAgICAgICAgICAgIC0td29ya0xpbWl0OworICAgICAgICB9CisgICAgfQorCisgICAgKm91dEJ5dGVzID0gKHdvcmtMaW1pdCAtIHdvcmtUZXh0KSA8PCAxOworICAgICpvdXRUZXh0ID0gd29ya1RleHQ7CisgICAgKm91dEJ1ZmZlciA9IGJ1ZmZlcjsKKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBEcmF3cyBvciBnZXRzIHRoZSBwYXRoIG9mIGEgcGFyYWdyYXBoIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZSwgcnVubmluZyBiaWRpIGFuZCBzaGFwaW5nLgorLy8gVGhpcyB3aWxsIGRyYXcgaWYgY2FudmFzIGlzIG5vdCBudWxsLCBvdGhlcndpc2UgcGF0aCBtdXN0IGJlIG5vbi1udWxsIGFuZCBpdCB3aWxsIGNyZWF0ZQorLy8gYSBwYXRoIHJlcHJlc2VudGluZyB0aGUgdGV4dCB0aGF0IHdvdWxkIGhhdmUgYmVlbiBkcmF3bi4KK3ZvaWQgVGV4dExheW91dDo6aGFuZGxlVGV4dChTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LFNrQ2FudmFzICpjYW52YXMsIFNrUGF0aCAqcGF0aCkgeworICAgIGNvbnN0IGpjaGFyICp3b3JrVGV4dDsKKyAgICBqY2hhciAqYnVmZmVyID0gTlVMTDsKKyAgICBpbnQzMl90IHdvcmtCeXRlczsKKyAgICBpZiAocHJlcGFyZVRleHQocGFpbnQsIHRleHQsIGxlbiwgYmlkaUZsYWdzLCAmd29ya1RleHQsICZ3b3JrQnl0ZXMsICZidWZmZXIpKSB7CisgICAgICAgIFNrU2NhbGFyIHhfID0gU2tGbG9hdFRvU2NhbGFyKHgpOworICAgICAgICBTa1NjYWxhciB5XyA9IFNrRmxvYXRUb1NjYWxhcih5KTsKKyAgICAgICAgaWYgKGNhbnZhcykgeworICAgICAgICAgICAgY2FudmFzLT5kcmF3VGV4dCh3b3JrVGV4dCwgd29ya0J5dGVzLCB4XywgeV8sICpwYWludCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYWludC0+Z2V0VGV4dFBhdGgod29ya1RleHQsIHdvcmtCeXRlcywgeF8sIHlfLCBwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgfQorfQorCitib29sIFRleHRMYXlvdXQ6OnByZXBhcmVSdGxUZXh0UnVuKGNvbnN0IGpjaGFyKiBjb250ZXh0LCBqc2l6ZSBzdGFydCwganNpemUmIGNvdW50LAorICAgICAgICBqc2l6ZSBjb250ZXh0Q291bnQsIGpjaGFyKiBzaGFwZWQpIHsKKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBjb3VudCA9IHNoYXBlUnRsVGV4dChjb250ZXh0LCBzdGFydCwgY291bnQsIGNvbnRleHRDb3VudCwgc2hhcGVkLCBzdGF0dXMpOworICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coTE9HX1dBUk4sICJMQVlPVVQiLCAiZHJhd1RleHRSdW4gZXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBUZXh0TGF5b3V0OjpkcmF3VGV4dFJ1bihTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIGNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IHN0YXJ0LCBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpckZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrQ2FudmFzKiBjYW52YXMpIHsKKworICAgICBTa1NjYWxhciB4XyA9IFNrRmxvYXRUb1NjYWxhcih4KTsKKyAgICAgU2tTY2FsYXIgeV8gPSBTa0Zsb2F0VG9TY2FsYXIoeSk7CisKKyAgICAgdWludDhfdCBydGwgPSBkaXJGbGFncyAmIDB4MTsKKyAgICAgaWYgKHJ0bCkgeworICAgICAgICAgU2tBdXRvU1RNYWxsb2M8ODAsIGpjaGFyPiBidWZmZXIoY29udGV4dENvdW50KTsKKyAgICAgICAgIGlmIChwcmVwYXJlUnRsVGV4dFJ1bihjaGFycywgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQsIGJ1ZmZlci5nZXQoKSkpIHsKKyAgICAgICAgICAgICBjYW52YXMtPmRyYXdUZXh0KGJ1ZmZlci5nZXQoKSwgY291bnQgPDwgMSwgeF8sIHlfLCAqcGFpbnQpOworICAgICAgICAgfQorICAgICB9IGVsc2UgeworICAgICAgICAgY2FudmFzLT5kcmF3VGV4dChjaGFycyArIHN0YXJ0LCBjb3VudCA8PCAxLCB4XywgeV8sICpwYWludCk7CisgICAgIH0KKyB9CisKK3ZvaWQgVGV4dExheW91dDo6Z2V0VGV4dFJ1bkFkdmFuY2VzKFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciAqY2hhcnMsIGppbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwgamludCBkaXJGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCAqcmVzdWx0QWR2YW5jZXMsIGpmbG9hdCAmcmVzdWx0VG90YWxBZHZhbmNlKSB7CisgICAgamNoYXIgYnVmZmVyW2NvbnRleHRDb3VudF07CisKKyAgICBTa1NjYWxhciogc2NhbGFyQXJyYXkgPSAoU2tTY2FsYXIgKilyZXN1bHRBZHZhbmNlczsKKyAgICByZXN1bHRUb3RhbEFkdmFuY2UgPSAwOworCisgICAgLy8gdGhpcyBpcyB3aGVyZSB3ZSdkIGNhbGwgaGFyZmJ1enoKKyAgICAvLyBmb3Igbm93IHdlIGp1c3QgdXNlIHVzaGFwZS5jCisKKyAgICBpbnQgd2lkdGhzOworICAgIGNvbnN0IGpjaGFyKiB0ZXh0OworICAgIGlmIChkaXJGbGFncyAmIDB4MSkgeyAvLyBydGwsIGNhbGwgYXJhYmljIHNoYXBpbmcgaW4gY2FzZQorICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgLy8gVXNlIGZpeGVkIGxlbmd0aCBzaW5jZSB3ZSBuZWVkIHRvIGtlZXAgc3RhcnQgYW5kIGNvdW50IHZhbGlkCisgICAgICAgIHVfc2hhcGVBcmFiaWMoY2hhcnMsIGNvbnRleHRDb3VudCwgYnVmZmVyLCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9MRU5HVEhfRklYRURfU1BBQ0VTX05FQVIgfAorICAgICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCB8IFVfU0hBUEVfTEVUVEVSU19TSEFQRSB8CisgICAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9YX0xBTUFMRUZfU1VCX0FMVEVSTkFURSwgJnN0YXR1cyk7CisgICAgICAgIC8vIHdlIHNob3VsZG4ndCBmYWlsIHVubGVzcyB0aGVyZSdzIGFuIG91dCBvZiBtZW1vcnkgY29uZGl0aW9uLAorICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHdlJ3JlIGhvc2VkIGFueXdheQorICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBpICsgY291bnQ7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICBpZiAoYnVmZmVyW2ldID09IDB4ZmZmZikgeworICAgICAgICAgICAgYnVmZmVyW2ldID0gMHgyMDBiOyAvLyB6ZXJvLXdpZHRoLXNwYWNlIGZvciBza2lhCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRleHQgPSBidWZmZXIgKyBzdGFydDsKKyAgICAgICAgd2lkdGhzID0gcGFpbnQtPmdldFRleHRXaWR0aHModGV4dCwgY291bnQgPDwgMSwgc2NhbGFyQXJyYXkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRleHQgPSBjaGFycyArIHN0YXJ0OworICAgICAgICB3aWR0aHMgPSBwYWludC0+Z2V0VGV4dFdpZHRocyh0ZXh0LCBjb3VudCA8PCAxLCBzY2FsYXJBcnJheSk7CisgICAgfQorCisgICAgaWYgKHdpZHRocyA8IGNvdW50KSB7CisgICAgICAgIC8vIFNraWEgb3BlcmF0ZXMgb24gY29kZSBwb2ludHMsIG5vdCBjb2RlIHVuaXRzLCBzbyBzdXJyb2dhdGUgcGFpcnMgcmV0dXJuIG9ubHkKKyAgICAgICAgLy8gb25lIHZhbHVlLiBFeHBhbmQgdGhlIHJlc3VsdCBzbyB3ZSBoYXZlIG9uZSB2YWx1ZSBwZXIgVVRGLTE2IGNvZGUgdW5pdC4KKworICAgICAgICAvLyBOb3RlLCBza2lhJ3MgZ2V0VGV4dFdpZHRoIGdldHMgY29uZnVzZWQgaWYgaXQgZW5jb3VudGVycyBhIHN1cnJvZ2F0ZSBwYWlyLAorICAgICAgICAvLyBsZWF2aW5nIHRoZSByZW1haW5pbmcgd2lkdGhzIHplcm8uICBOb3QgbmljZS4KKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIHAgPSAwOyBpIDwgd2lkdGhzOyArK2kpIHsKKyAgICAgICAgICAgIHJlc3VsdFRvdGFsQWR2YW5jZSArPSByZXN1bHRBZHZhbmNlc1twKytdID0gU2tTY2FsYXJUb0Zsb2F0KHNjYWxhckFycmF5W2ldKTsKKyAgICAgICAgICAgIGlmIChwIDwgY291bnQgJiYgdGV4dFtwXSA+PSAweGRjMDAgJiYgdGV4dFtwXSA8IDB4ZTAwMCAmJgorICAgICAgICAgICAgICAgICAgICB0ZXh0W3AtMV0gPj0gMHhkODAwICYmIHRleHRbcC0xXSA8IDB4ZGMwMCkgeworICAgICAgICAgICAgICAgIHJlc3VsdEFkdmFuY2VzW3ArK10gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHRUb3RhbEFkdmFuY2UgKz0gcmVzdWx0QWR2YW5jZXNbaV0gPSBTa1NjYWxhclRvRmxvYXQoc2NhbGFyQXJyYXlbaV0pOworICAgICAgICB9CisgICAgfQorfQorCisKKy8vIERyYXdzIGEgcGFyYWdyYXBoIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZSwgcnVubmluZyBiaWRpIGFuZCBzaGFwaW5nCit2b2lkIFRleHRMYXlvdXQ6OmRyYXdUZXh0KFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmlkaUZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrQ2FudmFzKiBjYW52YXMpIHsKKworICAgIGhhbmRsZVRleHQocGFpbnQsIHRleHQsIGxlbiwgYmlkaUZsYWdzLCB4LCB5LCBjYW52YXMsIE5VTEwpOworfQorCit2b2lkIFRleHRMYXlvdXQ6OmdldFRleHRQYXRoKFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciAqdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGggKnBhdGgpIHsKKyAgICBoYW5kbGVUZXh0KHBhaW50LCB0ZXh0LCBsZW4sIGJpZGlGbGFncywgeCwgeSwgTlVMTCwgcGF0aCk7Cit9CisKKwordm9pZCBUZXh0TGF5b3V0OjpkcmF3VGV4dE9uUGF0aChTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpZGlGbGFncywgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1BhdGgqIHBhdGgsIFNrQ2FudmFzKiBjYW52YXMpIHsKKworICAgIFNrU2NhbGFyIGhfID0gU2tGbG9hdFRvU2NhbGFyKGhPZmZzZXQpOworICAgIFNrU2NhbGFyIHZfID0gU2tGbG9hdFRvU2NhbGFyKHZPZmZzZXQpOworCisgICAgaWYgKCFuZWVkc0xheW91dCh0ZXh0LCBjb3VudCwgYmlkaUZsYWdzKSkgeworICAgICAgICBjYW52YXMtPmRyYXdUZXh0T25QYXRoSFYodGV4dCwgY291bnQgPDwgMSwgKnBhdGgsIGhfLCB2XywgKnBhaW50KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNrQXV0b1NUTWFsbG9jPDgwLCBqY2hhcj4gYnVmZmVyKGNvdW50KTsKKyAgICBpbnQgZGlyID0ga0RpcmVjdGlvbl9MVFI7CisgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgY291bnQgPSBsYXlvdXRMaW5lKHRleHQsIGNvdW50LCBiaWRpRmxhZ3MsIGRpciwgYnVmZmVyLmdldCgpLCBzdGF0dXMpOworICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICBjYW52YXMtPmRyYXdUZXh0T25QYXRoSFYoYnVmZmVyLmdldCgpLCBjb3VudCA8PCAxLCAqcGF0aCwgaF8sIHZfLCAqcGFpbnQpOworICAgIH0KK30KKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UZXh0TGF5b3V0LmggYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjY2NmMwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UZXh0TGF5b3V0LmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJqbmkuaCIKKworI2luY2x1ZGUgIlNrQ2FudmFzLmgiCisjaW5jbHVkZSAiU2tQYWludC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVGV4dExheW91dCB7CitwdWJsaWM6CisKKyAgICBlbnVtIHsKKyAgICAgICAga0RpcmVjdGlvbl9MVFIgPSAwLAorICAgICAgICBrRGlyZWN0aW9uX1JUTCA9IDEsCisKKyAgICAgICAga0RpcmVjdGlvbl9NYXNrID0gMHgxCisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBrQmlkaV9MVFIgPSAwLAorICAgICAgICBrQmlkaV9SVEwgPSAxLAorICAgICAgICBrQmlkaV9EZWZhdWx0X0xUUiA9IDIsCisgICAgICAgIGtCaWRpX0RlZmF1bHRfUlRMID0gMywKKyAgICAgICAga0JpZGlfRm9yY2VfTFRSID0gNCwKKyAgICAgICAga0JpZGlfRm9yY2VfUlRMID0gNSwKKworICAgICAgICBrQmlkaV9NYXNrID0gMHg3CisgICAgfTsKKworICAgIC8qCisgICAgICogRHJhd3MgYSB1bmlkaXJlY3Rpb25hbCBydW4gb2YgdGV4dC4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dFJ1bihTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIGNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgc3RhcnQsIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa0NhbnZhcyogY2FudmFzKTsKKworICAgIHN0YXRpYyB2b2lkIGdldFRleHRSdW5BZHZhbmNlcyhTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIgKmNoYXJzLCBqaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwgamludCBkaXJGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0ICpyZXN1bHRBZHZhbmNlcywgamZsb2F0ICZyZXN1bHRUb3RhbEFkdmFuY2UpOworCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHQoU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqc2l6ZSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgamludCBiaWRpRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tDYW52YXMqIGNhbnZhcyk7CisKKyAgICBzdGF0aWMgdm9pZCBnZXRUZXh0UGF0aChTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIgKnRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGggKnBhdGgpOworCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHRPblBhdGgoU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqc2l6ZSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpZGlGbGFncywgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrUGF0aCogcGF0aCwgU2tDYW52YXMqIGNhbnZhcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBzdGF0aWMgYm9vbCBwcmVwYXJlVGV4dChTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGpzaXplIGxlbiwgamludCBiaWRpRmxhZ3MsCisgICAgICAgIGNvbnN0IGpjaGFyKiogb3V0VGV4dCwgaW50MzJfdCogb3V0Qnl0ZXMsIGpjaGFyKiogb3V0QnVmZmVyKTsKKyAgICBzdGF0aWMgYm9vbCBwcmVwYXJlUnRsVGV4dFJ1bihjb25zdCBqY2hhciogY29udGV4dCwganNpemUgc3RhcnQsIGpzaXplJiBjb3VudCwKKyAgICAgICAganNpemUgY29udGV4dENvdW50LCBqY2hhciogc2hhcGVkKTsKKyAgICAgICAgCisKK3ByaXZhdGU6CisgICAgc3RhdGljIGJvb2wgbmVlZHNMYXlvdXQoY29uc3QgamNoYXIqIHRleHQsIGppbnQgbGVuLCBqaW50IGJpZGlGbGFncyk7CisgICAgc3RhdGljIGludCBzaGFwZVJ0bFRleHQoY29uc3QgamNoYXIqIGNvbnRleHQsIGpzaXplIHN0YXJ0LCBqc2l6ZSBjb3VudCwganNpemUgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpjaGFyKiBzaGFwZWQsIFVFcnJvckNvZGUgJnN0YXR1cyk7CisgICAgc3RhdGljIGppbnQgbGF5b3V0TGluZShjb25zdCBqY2hhciogdGV4dCwgamludCBsZW4sIGppbnQgZmxhZ3MsIGludCAmZGlyLCBqY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAmc3RhdHVzKTsKKyAgICBzdGF0aWMgdm9pZCBoYW5kbGVUZXh0KFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LFNrQ2FudmFzICpjYW52YXMsIFNrUGF0aCAqcGF0aCk7Cit9OworCit9CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1R5cGVmYWNlLmNwcCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVHlwZWZhY2UuY3BwCmluZGV4IDdjN2JmZWIuLjFmZTcyZTYgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVHlwZWZhY2UuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVHlwZWZhY2UuY3BwCkBAIC0xMzAsNyArMTMwLDEzIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICAKLSAgICByZXR1cm4gU2tUeXBlZmFjZTo6Q3JlYXRlRnJvbVN0cmVhbShuZXcgQXNzZXRTdHJlYW0oYXNzZXQsIHRydWUpKTsKKyAgICBTa1N0cmVhbSogc3RyZWFtID0gbmV3IEFzc2V0U3RyZWFtKGFzc2V0LCB0cnVlKTsKKyAgICBTa1R5cGVmYWNlKiBmYWNlID0gU2tUeXBlZmFjZTo6Q3JlYXRlRnJvbVN0cmVhbShzdHJlYW0pOworICAgIC8vIFNrVHlwZUZhY2U6OkNyZWF0ZUZyb21TdHJlYW0gY2FsbHMgcmVmKCkgb24gdGhlIHN0cmVhbSwgc28gd2UKKyAgICAvLyBuZWVkIHRvIHVucmVmIGl0IGhlcmUgb3IgaXQgd29uJ3QgYmUgZnJlZWQgbGF0ZXIgb24KKyAgICBzdHJlYW0tPnVucmVmKCk7CisKKyAgICByZXR1cm4gZmFjZTsKIH0KIAogc3RhdGljIFNrVHlwZWZhY2UqIFR5cGVmYWNlX2NyZWF0ZUZyb21GaWxlKEpOSUVudiogZW52LCBqb2JqZWN0LCBqc3RyaW5nIGpwYXRoKSB7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9TY29Tb2NrZXQuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfU2NvU29ja2V0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlNDQwOS4uMDAwMDAwMAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9TY29Tb2NrZXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjg5ICswLDAgQEAKLS8qCi0qKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2RlZmluZSBMT0dfVEFHICJibHVldG9vdGhfU2NvU29ja2V0LmNwcCIKLQotI2luY2x1ZGUgImFuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5oIgotI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgotI2luY2x1ZGUgIkpOSUhlbHAuaCIKLSNpbmNsdWRlICJqbmkuaCIKLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLSNpbmNsdWRlICJ1dGlscy9taXNjLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdWlvLmg+Ci0jaW5jbHVkZSA8c3lzL3BvbGwuaD4KLQotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0jaW5jbHVkZSA8Ymx1ZXRvb3RoL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGJsdWV0b290aC9zY28uaD4KLSNpbmNsdWRlIDxibHVldG9vdGgvaGNpLmg+Ci0KLSNkZWZpbmUgTUFYX0xJTkUgMjU1Ci0KLS8qCi0gKiBEZWZpbmVzIHRoZSBtb2R1bGUgc3RyaW5ncyB1c2VkIGluIHRoZSBibGFja2xpc3QgZmlsZS4KLSAqIFRoZXNlIGFyZSB1c2VkIGJ5IGNvbnN1bWVycyBvZiB0aGUgYmxhY2tsaXN0IGZpbGUgdG8gc2VlIGlmIHRoZSBsaW5lIGlzCi0gKiB1c2VkIGJ5IHRoYXQgbW9kdWxlLgotICovCi0jZGVmaW5lIFNDT19CTEFDS0xJU1RfTU9EVUxFX05BTUUgInNjb1NvY2tldCIKLQotCi0vKiBEZWZpbmUgdGhlIHR5cGUgc3RyaW5ncyB1c2VkIGluIHRoZSBibGFja2xpc3QgZmlsZS4gKi8KLSNkZWZpbmUgQkxBQ0tMSVNUX0JZX05BTUUgIm5hbWUiCi0jZGVmaW5lIEJMQUNLTElTVF9CWV9QQVJUSUFMX05BTUUgInBhcnRpYWxfbmFtZSIKLSNkZWZpbmUgQkxBQ0tMSVNUX0JZX09VSSAidmVuZG9yX291aSIKLQotI2VuZGlmCi0KLS8qIElkZWFsbHksIGJsb2NraW5nIEkvTyBvbiBhIFNDTyBzb2NrZXQgd291bGQgcmV0dXJuIHdoZW4gYW5vdGhlciB0aHJlYWQKLSAqIGNhbGxzIGNsb3NlKCkuIEhvd2V2ZXIgaXQgZG9lcyBub3QgcmlnaHQgbm93LCBpbiBmYWN0IGNsb3NlKCkgb24gYSBTQ08KLSAqIHNvY2tldCBoYXMgc3RyYW5nZSBiZWhhdmlvciAocmV0dXJucyBhIGJvZ3VzIHZhbHVlKSB3aGVuIG90aGVyIHRocmVhZHMKLSAqIGFyZSBwZXJmb3JtaW5nIGJsb2NraW5nIEkvTyBvbiB0aGF0IHNvY2tldC4gU28sIHRvIHdvcmthcm91bmQsIHdlIGFsd2F5cwotICogY2FsbCBjbG9zZSgpIGZyb20gdGhlIHNhbWUgdGhyZWFkIHRoYXQgZG9lcyBibG9ja2luZyBJL08uIFRoaXMgcmVxdWlyZXMgdGhlCi0gKiB1c2Ugb2YgYSBzb2NrZXRwYWlyIHRvIHNpZ25hbCB0aGUgYmxvY2tpbmcgSS9PIHRvIGFib3J0LgotICoKLSAqIFVuZm9ydHVuYXRlbHkgSSBkb24ndCBrbm93IGEgd2F5IHRvIGFib3J0IGNvbm5lY3QoKSB5ZXQsIGJ1dCBhdCBsZWFzdCB0aGlzCi0gKiB0aW1lcyBvdXQgYWZ0ZXIgdGhlIEJUIHBhZ2UgdGltZW91dCAoMTAgc2Vjb25kcyBjdXJyZW50bHkpLCBzbyB0aGUgdGhyZWFkCi0gKiB3aWxsIGRpZSBldmVudHVhbGx5LiBUaGUgZmFjdCB0aGF0IHRoZSB0aHJlYWQgY2FuIG91dGxpdmUKLSAqIHRoZSBKYXZhIG9iamVjdCBmb3JjZXMgdXMgdG8gdXNlIGEgbXV0ZXggaW4gZGVzdG9yeU5hdGl2ZSgpLgotICoKLSAqIFRoZSBKTkkgQVBJIGlzIGVudGlyZWx5IGFzeW5jLgotICoKLSAqIEFsc28gbm90ZSB0aGlzIGNsYXNzIGRlYWxzIG9ubHkgd2l0aCBTQ08gY29ubmVjdGlvbnMsIG5vdCB3aXRoIGRhdGEKLSAqIHRyYW5zbWlzc2lvbi4KLSAqLwotbmFtZXNwYWNlIGFuZHJvaWQgewotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0KLXN0YXRpYyBKYXZhVk0gKmp2bTsKLXN0YXRpYyBqZmllbGRJRCBmaWVsZF9tTmF0aXZlRGF0YTsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQWNjZXB0ZWQ7Ci1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkNvbm5lY3RlZDsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQ2xvc2VkOwotCi1zdHJ1Y3QgdGhyZWFkX2RhdGFfdDsKLXN0YXRpYyB2b2lkICp3b3JrX3RocmVhZCh2b2lkICphcmcpOwotc3RhdGljIGludCBjb25uZWN0X3dvcmsoY29uc3QgY2hhciAqYWRkcmVzcywgdWludDE2X3Qgc2NvX3BrdF90eXBlKTsKLXN0YXRpYyBpbnQgYWNjZXB0X3dvcmsoaW50IHNpZ25hbF9zayk7Ci1zdGF0aWMgdm9pZCB3YWl0X2Zvcl9jbG9zZShpbnQgc2ssIGludCBzaWduYWxfc2spOwotc3RhdGljIHZvaWQgY2xvc2VOYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0KTsKLQotc3RhdGljIHZvaWQgcGFyc2VCbGFja2xpc3Qodm9pZCk7Ci1zdGF0aWMgdWludDE2X3QgZ2V0U2NvVHlwZShjaGFyICphZGRyZXNzLCBjb25zdCBjaGFyICpuYW1lKTsKLQotI2RlZmluZSBDT01QQVJFX1NUUklORyhrZXksIHMpICghc3RybmNtcChrZXksIHMsIHN0cmxlbihzKSkpCi0KLS8qIEJsYWNrbGlzdCBkYXRhICovCi10eXBlZGVmIHN0cnVjdCBzY29CbGFja2xpc3QgewotICAgIGludCBmaWVsZFR5cGU7Ci0gICAgY2hhciAqdmFsdWU7Ci0gICAgdWludDE2X3Qgc2NvVHlwZTsKLSAgICBzdHJ1Y3Qgc2NvQmxhY2tsaXN0ICpuZXh0OwotfSBzY29CbGFja2xpc3RfdDsKLQotI2RlZmluZSBCTF9UWVBFX05BTUUgMSAgIC8vIEZpZWxkIHR5cGUgaXMgbmFtZSBzdHJpbmcKLQotc3RhdGljIHNjb0JsYWNrbGlzdF90ICpibGFja2xpc3QgPSBOVUxMOwotCi0vKiBzaGFyZWQgbmF0aXZlIGRhdGEgLSBwcm90ZWN0ZWQgYnkgbXV0ZXggKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBwdGhyZWFkX211dGV4X3QgbXV0ZXg7Ci0gICAgaW50IHNpZ25hbF9zazsgICAgICAgIC8vIHNvY2tldCB0byBzaWduYWwgYmxvY2tlZCBJL08gdG8gdW5ibG9jawotICAgIGpvYmplY3Qgb2JqZWN0OyAgICAgICAvLyBKTkkgZ2xvYmFsIHJlZiB0byB0aGUgSmF2YSBvYmplY3QKLSAgICB0aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YTsgIC8vIHBvaW50ZXIgdG8gdGhyZWFkIGxvY2FsIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heCAxIHRocmVhZCBwZXIgc2NvIHNvY2tldAotfSBuYXRpdmVfZGF0YV90OwotCi0vKiB0aHJlYWQgbG9jYWwgZGF0YSAqLwotc3RydWN0IHRocmVhZF9kYXRhX3QgewotICAgIG5hdGl2ZV9kYXRhX3QgKm5hdDsKLSAgICBib29sIGlzX2FjY2VwdDsgICAgICAgIC8vIGFjY2VwdCAobGlzdGVuaW5nKSBvciBjb25uZWN0IChvdXRnb2luZykgdGhyZWFkCi0gICAgaW50IHNpZ25hbF9zazsgICAgICAgICAvLyBzb2NrZXQgZm9yIHRocmVhZCB0byBsaXN0ZW4gZm9yIHVuYmxvY2sgc2lnbmFsCi0gICAgY2hhciBhZGRyZXNzW0JUQUREUl9TSVpFXTsgIC8vIEJUIGFkZHJlcyBhcyBzdHJpbmcKLSAgICB1aW50MTZfdCBzY29fcGt0X3R5cGU7ICAgLy8gU0NPIHBhY2tldCB0eXBlcyBzdXBwb3J0ZWQKLX07Ci0KLXN0YXRpYyBpbmxpbmUgbmF0aXZlX2RhdGFfdCAqIGdldF9uYXRpdmVfZGF0YShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QpIHsKLSAgICByZXR1cm4gKG5hdGl2ZV9kYXRhX3QgKikoZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIGZpZWxkX21OYXRpdmVEYXRhKSk7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBzdHIyc2NvVHlwZSAoY2hhciAqa2V5KSB7Ci0gICAgTE9HVigiJXM6IGtleSA9ICVzIiwgX19GVU5DVElPTl9fLCBrZXkpOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPX0hWMSIpKQotICAgICAgICByZXR1cm4gRVNDT19IVjE7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fSFYyIikpCi0gICAgICAgIHJldHVybiBFU0NPX0hWMjsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT19IVjMiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fSFYzOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPX0VWMyIpKQotICAgICAgICByZXR1cm4gRVNDT19FVjM7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fRVY0IikpCi0gICAgICAgIHJldHVybiBFU0NPX0VWNDsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT19FVjUiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fRVY1OwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPXzJFVjMiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fMkVWMzsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT18zRVYzIikpCi0gICAgICAgIHJldHVybiBFU0NPXzNFVjM7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fMkVWNSIpKQotICAgICAgICByZXR1cm4gRVNDT18yRVY1OwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPXzNFVjUiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fM0VWNTsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiU0NPX0VTQ09fTUFTSyIpKQotICAgICAgICByZXR1cm4gU0NPX0VTQ09fTUFTSzsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRURSX0VTQ09fTUFTSyIpKQotICAgICAgICByZXR1cm4gRURSX0VTQ09fTUFTSzsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiQUxMX0VTQ09fTUFTSyIpKQotICAgICAgICByZXR1cm4gQUxMX0VTQ09fTUFTSzsKLSAgICBMT0dFKCJVbmtub3duIFNDTyBUeXBlICglcykgc2tpcHBpbmciLGtleSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhcnNlQmxhY2tsaXN0KHZvaWQpIHsKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9ICIvZXRjL2JsdWV0b290aC9ibGFja2xpc3QuY29uZiI7Ci0gICAgY2hhciBsaW5lW01BWF9MSU5FXTsKLSAgICBzY29CbGFja2xpc3RfdCAqbGlzdCA9IE5VTEw7Ci0gICAgc2NvQmxhY2tsaXN0X3QgKm5ld2VsZW07Ci0KLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0KLSAgICAvKiBPcGVuIGZpbGUgKi8KLSAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOwotICAgIGlmKCFmcCkgewotICAgICAgICBMT0dFKCJFcnJvciglcylvcGVuaW5nIGJsYWNrbGlzdCBmaWxlIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBNQVhfTElORSwgZnApICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKChDT01QQVJFX1NUUklORyhsaW5lLCAiLy8iKSkgfHwgKCFzdHJjbXAobGluZSwgIiIpKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBjaGFyICptb2R1bGUgPSBzdHJ0b2sobGluZSwiOiIpOwotICAgICAgICBpZiAoQ09NUEFSRV9TVFJJTkcobW9kdWxlLCBTQ09fQkxBQ0tMSVNUX01PRFVMRV9OQU1FKSkgewotICAgICAgICAgICAgbmV3ZWxlbSA9IChzY29CbGFja2xpc3RfdCAqKWNhbGxvYygxLCBzaXplb2Yoc2NvQmxhY2tsaXN0X3QpKTsKLSAgICAgICAgICAgIGlmIChuZXdlbGVtID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBMT0dFKCIlczogb3V0IG9mIG1lbW9yeSEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHBhcnNlIGxpbmUKLSAgICAgICAgICAgIGNoYXIgKnR5cGUgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLSAgICAgICAgICAgIGNoYXIgKnZhbHVlTGlzdCA9IHN0cnRvayhOVUxMLCAiLCIpOwotICAgICAgICAgICAgY2hhciAqcGFyYW1MaXN0ID0gc3RydG9rKE5VTEwsICIsIik7Ci0gICAgICAgICAgICBpZiAoQ09NUEFSRV9TVFJJTkcodHlwZSwgQkxBQ0tMSVNUX0JZX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCBOYW1lIGZyb20gVmFsdWUgbGlzdAotICAgICAgICAgICAgICAgIG5ld2VsZW0tPmZpZWxkVHlwZSA9IEJMX1RZUEVfTkFNRTsKLSAgICAgICAgICAgICAgICBuZXdlbGVtLT52YWx1ZSA9IChjaGFyICopY2FsbG9jKDEsIHN0cmxlbih2YWx1ZUxpc3QpKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3ZWxlbS0+dmFsdWUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBMT0dFKCIlczogb3V0IG9mIG1lbW9yeSEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFsdWVMaXN0Kys7ICAvLyBTa2lwIG9wZW4gcXVvdGUKLSAgICAgICAgICAgICAgICBzdHJuY3B5KG5ld2VsZW0tPnZhbHVlLCB2YWx1ZUxpc3QsIHN0cmxlbih2YWx1ZUxpc3QpIC0gMSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgU2NvIFNldHRpbmdzIGZyb20gUGFyYW1ldGVycwotICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtID0gc3RydG9rKHBhcmFtTGlzdCwgIjsiKTsKLSAgICAgICAgICAgICAgICB1aW50MTZfdCBzY29UeXBlcyA9IDA7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmFtICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2NvOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1bMF0gPT0gJy0nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NvID0gc3RyMnNjb1R5cGUocGFyYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjbyAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb1R5cGVzICY9IH5zY287Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1bMF0gPT0gJysnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NvID0gc3RyMnNjb1R5cGUocGFyYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjbyAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb1R5cGVzIHw9IHNjbzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbVswXSA9PSAnPScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY28gPSBzdHIyc2NvVHlwZShwYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvVHlwZXMgPSBzY287Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIFNDTyB0eXBlIG11c3QgYmUgPSwgKyBvciAtIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBzdHJ0b2soTlVMTCwgIjsiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV3ZWxlbS0+c2NvVHlwZSA9IHNjb1R5cGVzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMT0dFKCJVbmtub3duIFNDTyB0eXBlIGVudHJ5IGluIEJsYWNrbGlzdCBmaWxlIik7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGlzdCkgewotICAgICAgICAgICAgICAgIGxpc3QtPm5leHQgPSBuZXdlbGVtOwotICAgICAgICAgICAgICAgIGxpc3QgPSBuZXdlbGVtOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBibGFja2xpc3QgPSBsaXN0ID0gbmV3ZWxlbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExPR0koIkVudHJ5IG5hbWUgPSAlcyBTY29UeXBlcyA9IDB4JXgiLCBuZXdlbGVtLT52YWx1ZSwKLSAgICAgICAgICAgICAgICAgbmV3ZWxlbS0+c2NvVHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZmNsb3NlKGZwKTsKLSAgICByZXR1cm47Ci19Ci1zdGF0aWMgdWludDE2X3QgZ2V0U2NvVHlwZShjaGFyICphZGRyZXNzLCBjb25zdCBjaGFyICpuYW1lKSB7Ci0gICAgdWludDE2X3QgcmV0ID0gMDsKLSAgICBzY29CbGFja2xpc3RfdCAqbGlzdCA9IGJsYWNrbGlzdDsKLQotICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKGxpc3QtPmZpZWxkVHlwZSA9PSBCTF9UWVBFX05BTUUpIHsKLSAgICAgICAgICAgIGlmIChDT01QQVJFX1NUUklORyhuYW1lLCBsaXN0LT52YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBsaXN0LT5zY29UeXBlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICAgIH0KLSAgICBMT0dJKCIlcyAlcyAtIDB4JXgiLCAgX19GVU5DVElPTl9fLCBuYW1lLCByZXQpOwotICAgIHJldHVybiByZXQ7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgY2xhc3NJbml0TmF0aXZlKEpOSUVudiogZW52LCBqY2xhc3MgY2xhenopIHsKLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLSAgICBpZiAoZW52LT5HZXRKYXZhVk0oJmp2bSkgPCAwKSB7Ci0gICAgICAgIExPR0UoIkNvdWxkIG5vdCBnZXQgaGFuZGxlIHRvIHRoZSBWTSIpOwotICAgIH0KLSAgICBmaWVsZF9tTmF0aXZlRGF0YSA9IGdldF9maWVsZChlbnYsIGNsYXp6LCAibU5hdGl2ZURhdGEiLCAiSSIpOwotICAgIG1ldGhvZF9vbkFjY2VwdGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uQWNjZXB0ZWQiLCAiKEkpViIpOwotICAgIG1ldGhvZF9vbkNvbm5lY3RlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbkNvbm5lY3RlZCIsICIoSSlWIik7Ci0gICAgbWV0aG9kX29uQ2xvc2VkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uQ2xvc2VkIiwgIigpViIpOwotCi0gICAgLyogUmVhZCB0aGUgYmxhY2tsaXN0IGZpbGUgaW4gaGVyZSAqLwotICAgIHBhcnNlQmxhY2tsaXN0KCk7Ci0jZW5kaWYKLX0KLQotLyogUmV0dXJucyBmYWxzZSBpZiBhIHNlcmlvdXMgZXJyb3Igb2NjdXJlZCAqLwotc3RhdGljIGpib29sZWFuIGluaXROYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KSB7Ci0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0KLSAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSAobmF0aXZlX2RhdGFfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKG5hdGl2ZV9kYXRhX3QpKTsKLSAgICBpZiAobmF0ID09IE5VTEwpIHsKLSAgICAgICAgTE9HRSgiJXM6IG91dCBvZiBtZW1vcnkhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0KLSAgICBwdGhyZWFkX211dGV4X2luaXQoJm5hdC0+bXV0ZXgsIE5VTEwpOwotICAgIGVudi0+U2V0SW50RmllbGQob2JqZWN0LCBmaWVsZF9tTmF0aXZlRGF0YSwgKGppbnQpbmF0KTsKLSAgICBuYXQtPnNpZ25hbF9zayA9IC0xOwotICAgIG5hdC0+b2JqZWN0ID0gTlVMTDsKLSAgICBuYXQtPnRocmVhZF9kYXRhID0gTlVMTDsKLQotI2VuZGlmCi0gICAgcmV0dXJuIEpOSV9UUlVFOwotfQotCi1zdGF0aWMgdm9pZCBkZXN0cm95TmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkgewotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSNpZmRlZiBIQVZFX0JMVUVUT09USAotICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7Ci0gICAgCi0gICAgY2xvc2VOYXRpdmUoZW52LCBvYmplY3QpOwotICAgIAotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbmF0LT5tdXRleCk7Ci0gICAgaWYgKG5hdC0+dGhyZWFkX2RhdGEgIT0gTlVMTCkgewotICAgICAgICBuYXQtPnRocmVhZF9kYXRhLT5uYXQgPSBOVUxMOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZuYXQtPm11dGV4KTsKLQotICAgIGZyZWUobmF0KTsKLSNlbmRpZgotfQotCi1zdGF0aWMgamJvb2xlYW4gYWNjZXB0TmF0aXZlKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCkgewotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSNpZmRlZiBIQVZFX0JMVUVUT09USAotICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7Ci0gICAgaW50IHNpZ25hbF9za3NbMl07Ci0gICAgcHRocmVhZF90IHRocmVhZDsKLSAgICBzdHJ1Y3QgdGhyZWFkX2RhdGFfdCAqZGF0YSA9IE5VTEw7Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm5hdC0+bXV0ZXgpOwotICAgIGlmIChuYXQtPnNpZ25hbF9zayAhPSAtMSkgewotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotCi0gICAgLy8gc2V0dXAgc29ja2V0cGFpciB0byBwYXNzIG1lc3NhZ2VzIGJldHdlZW4gdGhyZWFkcwotICAgIGlmIChzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBzaWduYWxfc2tzKSA8IDApIHsKLSAgICAgICAgTE9HRSgiJXM6IHNvY2tldHBhaXIoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotICAgIG5hdC0+c2lnbmFsX3NrID0gc2lnbmFsX3Nrc1swXTsKLSAgICBuYXQtPm9iamVjdCA9IGVudi0+TmV3R2xvYmFsUmVmKG9iamVjdCk7Ci0KLSAgICBkYXRhID0gKHRocmVhZF9kYXRhX3QgKiljYWxsb2MoMSwgc2l6ZW9mKHRocmVhZF9kYXRhX3QpKTsKLSAgICBpZiAoZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIExPR0UoIiVzOiBvdXQgb2YgbWVtb3J5IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLSAgICBuYXQtPnRocmVhZF9kYXRhID0gZGF0YTsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0KLSAgICBkYXRhLT5zaWduYWxfc2sgPSBzaWduYWxfc2tzWzFdOwotICAgIGRhdGEtPm5hdCA9IG5hdDsKLSAgICBkYXRhLT5pc19hY2NlcHQgPSB0cnVlOwotCi0gICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWQsIE5VTEwsICZ3b3JrX3RocmVhZCwgKHZvaWQgKilkYXRhKSA8IDApIHsKLSAgICAgICAgTE9HRSgiJXM6IHB0aHJlYWRfY3JlYXRlKCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIEpOSV9UUlVFOwotCi0jZW5kaWYKLSAgICByZXR1cm4gSk5JX0ZBTFNFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gY29ubmVjdE5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgYWRkcmVzcywKLSAgICAgICAganN0cmluZyBuYW1lKSB7Ci0KLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLSAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOwotICAgIGludCBzaWduYWxfc2tzWzJdOwotICAgIHB0aHJlYWRfdCB0aHJlYWQ7Ci0gICAgc3RydWN0IHRocmVhZF9kYXRhX3QgKmRhdGE7Ci0gICAgY29uc3QgY2hhciAqY19hZGRyZXNzOwotICAgIGNvbnN0IGNoYXIgKmNfbmFtZTsKLQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbmF0LT5tdXRleCk7Ci0gICAgaWYgKG5hdC0+c2lnbmFsX3NrICE9IC0xKSB7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0KLSAgICAvLyBzZXR1cCBzb2NrZXRwYWlyIHRvIHBhc3MgbWVzc2FnZXMgYmV0d2VlbiB0aHJlYWRzCi0gICAgaWYgKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIHNpZ25hbF9za3MpIDwgMCkgewotICAgICAgICBMT0dFKCIlczogc29ja2V0cGFpcigpIGZhaWxlZDogJXNcbiIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLSAgICBuYXQtPnNpZ25hbF9zayA9IHNpZ25hbF9za3NbMF07Ci0gICAgbmF0LT5vYmplY3QgPSBlbnYtPk5ld0dsb2JhbFJlZihvYmplY3QpOwotCi0gICAgZGF0YSA9ICh0aHJlYWRfZGF0YV90ICopY2FsbG9jKDEsIHNpemVvZih0aHJlYWRfZGF0YV90KSk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCIlczogb3V0IG9mIG1lbW9yeSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotCi0gICAgZGF0YS0+c2lnbmFsX3NrID0gc2lnbmFsX3Nrc1sxXTsKLSAgICBkYXRhLT5uYXQgPSBuYXQ7Ci0gICAgY19hZGRyZXNzID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhhZGRyZXNzLCBOVUxMKTsKLSAgICBzdHJsY3B5KGRhdGEtPmFkZHJlc3MsIGNfYWRkcmVzcywgQlRBRERSX1NJWkUpOwotICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGFkZHJlc3MsIGNfYWRkcmVzcyk7Ci0gICAgZGF0YS0+aXNfYWNjZXB0ID0gZmFsc2U7Ci0KLSAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIExPR0UoIiVzOiBOdWxsIHBvaW50ZXIgcGFzc2VkIGluIGZvciBkZXZpY2UgbmFtZSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGRhdGEtPnNjb19wa3RfdHlwZSA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY19uYW1lID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhuYW1lLCBOVUxMKTsKLSAgICAgICAgLyogU2VlIGlmIHRoaXMgZGV2aWNlIGlzIGluIHRoZSBibGFjayBsaXN0ICovCi0gICAgICAgIGRhdGEtPnNjb19wa3RfdHlwZSA9IGdldFNjb1R5cGUoZGF0YS0+YWRkcmVzcywgY19uYW1lKTsKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMobmFtZSwgY19uYW1lKTsKLSAgICB9Ci0gICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWQsIE5VTEwsICZ3b3JrX3RocmVhZCwgKHZvaWQgKilkYXRhKSA8IDApIHsKLSAgICAgICAgTE9HRSgiJXM6IHB0aHJlYWRfY3JlYXRlKCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIEpOSV9UUlVFOwotCi0jZW5kaWYKLSAgICByZXR1cm4gSk5JX0ZBTFNFOwotfQotCi1zdGF0aWMgdm9pZCBjbG9zZU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QpIHsKLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLSAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOwotICAgIGludCBzaWduYWxfc2s7Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm5hdC0+bXV0ZXgpOwotICAgIHNpZ25hbF9zayA9IG5hdC0+c2lnbmFsX3NrOwotICAgIG5hdC0+c2lnbmFsX3NrID0gLTE7Ci0gICAgZW52LT5EZWxldGVHbG9iYWxSZWYobmF0LT5vYmplY3QpOwotICAgIG5hdC0+b2JqZWN0ID0gTlVMTDsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0KLSAgICBpZiAoc2lnbmFsX3NrID49IDApIHsKLSAgICAgICAgTE9HVigiJXM6IHNpZ25hbF9zayA9ICVkIiwgX19GVU5DVElPTl9fLCBzaWduYWxfc2spOwotICAgICAgICB1bnNpZ25lZCBjaGFyIGR1bW15OwotICAgICAgICB3cml0ZShzaWduYWxfc2ssICZkdW1teSwgc2l6ZW9mKGR1bW15KSk7Ci0gICAgICAgIGNsb3NlKHNpZ25hbF9zayk7Ci0gICAgfQotI2VuZGlmCi19Ci0KLSNpZmRlZiBIQVZFX0JMVUVUT09USAotLyogdGhyZWFkIGVudHJ5IHBvaW50ICovCi1zdGF0aWMgdm9pZCAqd29ya190aHJlYWQodm9pZCAqYXJnKSB7Ci0gICAgSk5JRW52KiBlbnY7Ci0gICAgdGhyZWFkX2RhdGFfdCAqZGF0YSA9ICh0aHJlYWRfZGF0YV90ICopYXJnOwotICAgIGludCBzazsKLQotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSAgICBpZiAoanZtLT5BdHRhY2hDdXJyZW50VGhyZWFkKCZlbnYsIE5VTEwpICE9IEpOSV9PSykgewotICAgICAgICBMT0dFKCIlczogQXR0YWNoQ3VycmVudFRocmVhZCgpIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qIGNvbm5lY3QgdGhlIFNDTyBzb2NrZXQgKi8KLSAgICBpZiAoZGF0YS0+aXNfYWNjZXB0KSB7Ci0gICAgICAgIExPR1YoIlNDTyBPQkpFQ1QgJXAgQUNDRVBUICMjIyMjIiwgZGF0YS0+bmF0LT5vYmplY3QpOwotICAgICAgICBzayA9IGFjY2VwdF93b3JrKGRhdGEtPnNpZ25hbF9zayk7Ci0gICAgICAgIExPR1YoIlNDTyBPQkpFQ1QgJXAgRU5EIEFDQ0VQVCAqKioqKiIsIGRhdGEtPm5hdC0+b2JqZWN0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBzayA9IGNvbm5lY3Rfd29yayhkYXRhLT5hZGRyZXNzLCBkYXRhLT5zY29fcGt0X3R5cGUpOwotICAgIH0KLQotICAgIC8qIGNhbGxiYWNrIHdpdGggY29ubmVjdGlvbiByZXN1bHQgKi8KLSAgICBpZiAoZGF0YS0+bmF0ID09IE5VTEwpIHsKLSAgICAgICAgTE9HVigiJXM6IG9iamVjdCBkZXN0cm95ZWQhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmRhdGEtPm5hdC0+bXV0ZXgpOwotICAgIGlmIChkYXRhLT5uYXQtPm9iamVjdCA9PSBOVUxMKSB7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZkYXRhLT5uYXQtPm11dGV4KTsKLSAgICAgICAgTE9HVigiJXM6IGNhbGxiYWNrIGNhbmNlbGxlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0gICAgaWYgKGRhdGEtPmlzX2FjY2VwdCkgewotICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKGRhdGEtPm5hdC0+b2JqZWN0LCBtZXRob2Rfb25BY2NlcHRlZCwgc2spOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoZGF0YS0+bmF0LT5vYmplY3QsIG1ldGhvZF9vbkNvbm5lY3RlZCwgc2spOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZGF0YS0+bmF0LT5tdXRleCk7Ci0KLSAgICBpZiAoc2sgPCAwKSB7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0KLSAgICBMT0dWKCJTQ08gT0JKRUNUICVwICVkIENPTk5FQ1RFRCArKysgKCVzKSIsIGRhdGEtPm5hdC0+b2JqZWN0LCBzaywKLSAgICAgICAgIGRhdGEtPmlzX2FjY2VwdCA/ICJpbiIgOiAib3V0Iik7Ci0KLSAgICAvKiB3YWl0IGZvciB0aGUgc29ja2V0IHRvIGNsb3NlICovCi0gICAgTE9HVigid2FpdF9mb3JfY2xvc2UoKS4uLiIpOwotICAgIHdhaXRfZm9yX2Nsb3NlKHNrLCBkYXRhLT5zaWduYWxfc2spOwotICAgIExPR1YoIndhaXRfZm9yX2Nsb3NlKCkgcmV0dXJuZWQiKTsKLQotICAgIC8qIGNhbGxiYWNrIHdpdGggY2xvc2UgcmVzdWx0ICovCi0gICAgaWYgKGRhdGEtPm5hdCA9PSBOVUxMKSB7Ci0gICAgICAgIExPR1YoIiVzOiBvYmplY3QgZGVzdHJveWVkISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZkYXRhLT5uYXQtPm11dGV4KTsKLSAgICBpZiAoZGF0YS0+bmF0LT5vYmplY3QgPT0gTlVMTCkgewotICAgICAgICBMT0dWKCIlczogY2FsbGJhY2sgY2FuY2VsbGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICB9IGVsc2UgewotICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKGRhdGEtPm5hdC0+b2JqZWN0LCBtZXRob2Rfb25DbG9zZWQpOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZGF0YS0+bmF0LT5tdXRleCk7Ci0KLWRvbmU6Ci0gICAgaWYgKHNrID49IDApIHsKLSAgICAgICAgY2xvc2Uoc2spOwotICAgICAgICBMT0dWKCJTQ08gT0JKRUNUICVwICVkIENMT1NFRCAtLS0gKCVzKSIsIGRhdGEtPm5hdC0+b2JqZWN0LCBzaywgZGF0YS0+aXNfYWNjZXB0ID8gImluIiA6ICJvdXQiKTsKLSAgICB9Ci0gICAgaWYgKGRhdGEtPnNpZ25hbF9zayA+PSAwKSB7Ci0gICAgICAgIGNsb3NlKGRhdGEtPnNpZ25hbF9zayk7Ci0gICAgfQotICAgIExPR1YoIlNDTyBzb2NrZXQgY2xvc2VkIik7Ci0KLSAgICBpZiAoZGF0YS0+bmF0ICE9IE5VTEwpIHsKLSAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZkYXRhLT5uYXQtPm11dGV4KTsKLSAgICAgICAgZW52LT5EZWxldGVHbG9iYWxSZWYoZGF0YS0+bmF0LT5vYmplY3QpOwotICAgICAgICBkYXRhLT5uYXQtPm9iamVjdCA9IE5VTEw7Ci0gICAgICAgIGRhdGEtPm5hdC0+dGhyZWFkX2RhdGEgPSBOVUxMOwotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZGF0YS0+bmF0LT5tdXRleCk7Ci0gICAgfQotCi0gICAgZnJlZShkYXRhKTsKLSAgICBpZiAoanZtLT5EZXRhY2hDdXJyZW50VGhyZWFkKCkgIT0gSk5JX09LKSB7Ci0gICAgICAgIExPR0UoIiVzOiBEZXRhY2hDdXJyZW50VGhyZWFkKCkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICB9Ci0KLSAgICBMT0dWKCJ3b3JrX3RocmVhZCgpIGRvbmUiKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBhY2NlcHRfd29yayhpbnQgc2lnbmFsX3NrKSB7Ci0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotICAgIGludCBzazsKLSAgICBpbnQgbnNrOwotICAgIGludCBhZGRyX3N6OwotICAgIGludCBtYXhfZmQ7Ci0gICAgZmRfc2V0IGZkczsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfc2NvIGFkZHI7Ci0KLSAgICBzayA9IHNvY2tldChQRl9CTFVFVE9PVEgsIFNPQ0tfU0VRUEFDS0VULCBCVFBST1RPX1NDTyk7Ci0gICAgaWYgKHNrIDwgMCkgewotICAgICAgICBMT0dFKCIlcyBzb2NrZXQoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwotICAgIGFkZHIuc2NvX2ZhbWlseSA9IEFGX0JMVUVUT09USDsKLSAgICBtZW1jcHkoJmFkZHIuc2NvX2JkYWRkciwgQkRBRERSX0FOWSwgc2l6ZW9mKGJkYWRkcl90KSk7Ci0gICAgaWYgKGJpbmQoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7Ci0gICAgICAgIExPR0UoIiVzIGJpbmQoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGlmIChsaXN0ZW4oc2ssIDEpKSB7Ci0gICAgICAgIExPR0UoIiVzOiBsaXN0ZW4oKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKLSAgICBhZGRyX3N6ID0gc2l6ZW9mKGFkZHIpOwotCi0gICAgRkRfWkVSTygmZmRzKTsKLSAgICBGRF9TRVQoc2ssICZmZHMpOwotICAgIEZEX1NFVChzaWduYWxfc2ssICZmZHMpOwotCi0gICAgbWF4X2ZkID0gKHNrID4gc2lnbmFsX3NrKSA/IHNrIDogc2lnbmFsX3NrOwotICAgIExPR0koIkxpc3RlbmluZyBTQ08gc29ja2V0Li4uIik7Ci0gICAgd2hpbGUgKHNlbGVjdChtYXhfZmQgKyAxLCAmZmRzLCBOVUxMLCBOVUxMLCBOVUxMKSA8IDApIHsKLSAgICAgICAgaWYgKGVycm5vICE9IEVJTlRSKSB7Ci0gICAgICAgICAgICBMT0dFKCIlczogc2VsZWN0KCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HVigiJXM6IHNlbGVjdCgpIEVJTlRSLCByZXRyeWluZyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgfQotICAgIExPR1YoInNlbGVjdCgpIHJldHVybmVkIik7Ci0gICAgaWYgKEZEX0lTU0VUKHNpZ25hbF9zaywgJmZkcykpIHsKLSAgICAgICAgLy8gc2lnbmFsIHRvIGNhbmNlbCBsaXN0ZW5pbmcKLSAgICAgICAgTE9HVigiY2FuY2VsbGVkIGxpc3RlbmluZyBzb2NrZXQsIGNsb3NpbmciKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0gICAgaWYgKCFGRF9JU1NFVChzaywgJmZkcykpIHsKLSAgICAgICAgTE9HRSgiZXJyb3I6IHNlbGVjdCgpIHJldHVybmVkID49IDAgd2l0aCBubyBmZHMgc2V0Iik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgbnNrID0gYWNjZXB0KHNrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZhZGRyX3N6KTsKLSAgICBpZiAobnNrIDwgMCkgewotICAgICAgICBMT0dFKCIlczogYWNjZXB0KCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0gICAgTE9HSSgiQ29ubmVjdGVkIFNDTyBzb2NrZXQgKGluY29taW5nKSIpOwotICAgIGNsb3NlKHNrKTsgIC8vIFRoZSBsaXN0ZW5pbmcgc29ja2V0Ci0KLSAgICByZXR1cm4gbnNrOwotCi1lcnJvcjoKLSAgICBjbG9zZShzayk7Ci0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgY29ubmVjdF93b3JrKGNvbnN0IGNoYXIgKmFkZHJlc3MsIHVpbnQxNl90IHNjb19wa3RfdHlwZSkgewotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfc2NvIGFkZHI7Ci0gICAgaW50IHNrID0gLTE7Ci0KLSAgICBzayA9IHNvY2tldChQRl9CTFVFVE9PVEgsIFNPQ0tfU0VRUEFDS0VULCBCVFBST1RPX1NDTyk7Ci0gICAgaWYgKHNrIDwgMCkgewotICAgICAgICBMT0dFKCIlczogc29ja2V0KCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIEJpbmQgdG8gbG9jYWwgYWRkcmVzcyAqLwotICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKLSAgICBhZGRyLnNjb19mYW1pbHkgPSBBRl9CTFVFVE9PVEg7Ci0gICAgbWVtY3B5KCZhZGRyLnNjb19iZGFkZHIsIEJEQUREUl9BTlksIHNpemVvZihiZGFkZHJfdCkpOwotICAgIGlmIChiaW5kKHNrLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpIDwgMCkgewotICAgICAgICBMT0dFKCIlczogYmluZCgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwotICAgIGFkZHIuc2NvX2ZhbWlseSA9IEFGX0JMVUVUT09USDsKLSAgICBnZXRfYmRhZGRyKGFkZHJlc3MsICZhZGRyLnNjb19iZGFkZHIpOwotICAgIGFkZHIuc2NvX3BrdF90eXBlID0gc2NvX3BrdF90eXBlOwotICAgIExPR0koIkNvbm5lY3RpbmcgdG8gc29ja2V0Iik7Ci0gICAgd2hpbGUgKGNvbm5lY3Qoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKLSAgICAgICAgaWYgKGVycm5vICE9IEVJTlRSKSB7Ci0gICAgICAgICAgICBMT0dFKCIlczogY29ubmVjdCgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgICAgIExPR1YoIiVzOiBjb25uZWN0KCkgRUlOVFIsIHJldHJ5aW5nIiwgX19GVU5DVElPTl9fKTsKLSAgICB9Ci0gICAgTE9HSSgiU0NPIHNvY2tldCBjb25uZWN0ZWQgKG91dGdvaW5nKSIpOwotCi0gICAgcmV0dXJuIHNrOwotCi1lcnJvcjoKLSAgICBpZiAoc2sgPj0gMCkgY2xvc2Uoc2spOwotICAgIHJldHVybiAtMTsKLX0KLQotc3RhdGljIHZvaWQgd2FpdF9mb3JfY2xvc2UoaW50IHNrLCBpbnQgc2lnbmFsX3NrKSB7Ci0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotICAgIHBvbGxmZCBwWzJdOwotCi0gICAgbWVtc2V0KHAsIDAsIDIgKiBzaXplb2YocG9sbGZkKSk7Ci0gICAgcFswXS5mZCA9IHNrOwotICAgIHBbMV0uZmQgPSBzaWduYWxfc2s7Ci0gICAgcFsxXS5ldmVudHMgPSBQT0xMSU4gfCBQT0xMUFJJOwotCi0gICAgTE9HVigicG9sbC4uLiIpOwotCi0gICAgd2hpbGUgKHBvbGwocCwgMiwgLTEpIDwgMCkgeyAgLy8gYmxvY2tzCi0gICAgICAgIGlmIChlcnJubyAhPSBFSU5UUikgewotICAgICAgICAgICAgTE9HRSgiJXM6IHBvbGwoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HVigiJXM6IHBvbGwoKSBFSU5UUiwgcmV0cnlpbmciLCBfX0ZVTkNUSU9OX18pOwotICAgIH0KLQotICAgIExPR1YoInBvbGwoKSByZXR1cm5lZCIpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9IHsKLSAgICB7ImNsYXNzSW5pdE5hdGl2ZSIsICIoKVYiLCAodm9pZCopY2xhc3NJbml0TmF0aXZlfSwKLSAgICB7ImluaXROYXRpdmUiLCAiKClWIiwgKHZvaWQgKilpbml0TmF0aXZlfSwKLSAgICB7ImRlc3Ryb3lOYXRpdmUiLCAiKClWIiwgKHZvaWQgKilkZXN0cm95TmF0aXZlfSwKLSAgICB7ImNvbm5lY3ROYXRpdmUiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylaIiwgKHZvaWQgKiljb25uZWN0TmF0aXZlfSwKLSAgICB7ImFjY2VwdE5hdGl2ZSIsICIoKVoiLCAodm9pZCAqKWFjY2VwdE5hdGl2ZX0sCi0gICAgeyJjbG9zZU5hdGl2ZSIsICIoKVYiLCAodm9pZCAqKWNsb3NlTmF0aXZlfSwKLX07Ci0KLWludCByZWdpc3Rlcl9hbmRyb2lkX2JsdWV0b290aF9TY29Tb2NrZXQoSk5JRW52ICplbnYpIHsKLSAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsCi0gICAgICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvU2NvU29ja2V0Iiwgc01ldGhvZHMsIE5FTEVNKHNNZXRob2RzKSk7Ci19Ci0KLX0gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9jb21tb24uY3BwCmluZGV4IDQzYzNhOTUuLmFhZTBmMjEgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmNwcApAQCAtNjksNiArNjksMTYgQEAKICAgICB7IlVVSURzIiwgREJVU19UWVBFX0FSUkFZfSwKIH07CiAKK3N0YXRpYyBQcm9wZXJ0aWVzIGlucHV0X3Byb3BlcnRpZXNbXSA9IHsKKyAgICB7IkNvbm5lY3RlZCIsIERCVVNfVFlQRV9CT09MRUFOfSwKK307CisKK3N0YXRpYyBQcm9wZXJ0aWVzIHBhbl9wcm9wZXJ0aWVzW10gPSB7CisgICAgeyJDb25uZWN0ZWQiLCBEQlVTX1RZUEVfQk9PTEVBTn0sCisgICAgeyJJbnRlcmZhY2UiLCBEQlVTX1RZUEVfU1RSSU5HfSwKKyAgICB7IlVVSUQiLCBEQlVTX1RZUEVfU1RSSU5HfSwKK307CisKIHR5cGVkZWYgdW5pb24gewogICAgIGNoYXIgKnN0cl92YWw7CiAgICAgaW50IGludF92YWw7CkBAIC0xODcsNiArMTk3LDcgQEAKICAgICBkYnVzX2Jvb2xfdCByZXQ7CiAgICAgdmFfbGlzdCBsc3Q7CiAgICAgdmFfc3RhcnQobHN0LCBmaXJzdF9hcmdfdHlwZSk7CisKICAgICByZXQgPSBkYnVzX2Z1bmNfYXJnc19hc3luY192YWxpc3QoZW52LCBjb25uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseSwgdXNlciwgbmF0LApAQCAtNjk5LDYgKzcxMCwxNiBAQAogICAgICAgICAgICAgICAgICAgICBzaXplb2YocmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzKSAvIHNpemVvZihQcm9wZXJ0aWVzKSk7CiB9CiAKK2pvYmplY3RBcnJheSBwYXJzZV9pbnB1dF9wcm9wZXJ0eV9jaGFuZ2UoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlICptc2cpIHsKKyAgICByZXR1cm4gcGFyc2VfcHJvcGVydHlfY2hhbmdlKGVudiwgbXNnLCAoUHJvcGVydGllcyAqKSAmaW5wdXRfcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGlucHV0X3Byb3BlcnRpZXMpIC8gc2l6ZW9mKFByb3BlcnRpZXMpKTsKK30KKworam9iamVjdEFycmF5IHBhcnNlX3Bhbl9wcm9wZXJ0eV9jaGFuZ2UoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlICptc2cpIHsKKyAgICByZXR1cm4gcGFyc2VfcHJvcGVydHlfY2hhbmdlKGVudiwgbXNnLCAoUHJvcGVydGllcyAqKSAmcGFuX3Byb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihwYW5fcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOworfQorCiBqb2JqZWN0QXJyYXkgcGFyc2VfYWRhcHRlcl9wcm9wZXJ0aWVzKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpIHsKICAgICByZXR1cm4gcGFyc2VfcHJvcGVydGllcyhlbnYsIGl0ZXIsIChQcm9wZXJ0aWVzICopICZhZGFwdGVyX3Byb3BlcnRpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFkYXB0ZXJfcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOwpAQCAtNzA5LDYgKzczMCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzKSAvIHNpemVvZihQcm9wZXJ0aWVzKSk7CiB9CiAKK2pvYmplY3RBcnJheSBwYXJzZV9pbnB1dF9wcm9wZXJ0aWVzKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpIHsKKyAgICByZXR1cm4gcGFyc2VfcHJvcGVydGllcyhlbnYsIGl0ZXIsIChQcm9wZXJ0aWVzICopICZpbnB1dF9wcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW5wdXRfcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOworfQorCiBpbnQgZ2V0X2JkYWRkcihjb25zdCBjaGFyICpzdHIsIGJkYWRkcl90ICpiYSkgewogICAgIGNoYXIgKmQgPSAoKGNoYXIgKiliYSkgKyA1LCAqZW5kcDsKICAgICBpbnQgaTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5oIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmgKaW5kZXggMzc4YmI2Zi4uOTIyMmUxYSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmgKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmgKQEAgLTE2Miw2ICsxNjIsOSBAQAogam9iamVjdEFycmF5IHBhcnNlX3JlbW90ZV9kZXZpY2VfcHJvcGVydGllcyhKTklFbnYgKmVudiwgREJ1c01lc3NhZ2VJdGVyICppdGVyKTsKIGpvYmplY3RBcnJheSBwYXJzZV9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5X2NoYW5nZShKTklFbnYgKmVudiwgREJ1c01lc3NhZ2UgKm1zZyk7CiBqb2JqZWN0QXJyYXkgcGFyc2VfYWRhcHRlcl9wcm9wZXJ0eV9jaGFuZ2UoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlICptc2cpOworam9iamVjdEFycmF5IHBhcnNlX2lucHV0X3Byb3BlcnRpZXMoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlSXRlciAqaXRlcik7Citqb2JqZWN0QXJyYXkgcGFyc2VfaW5wdXRfcHJvcGVydHlfY2hhbmdlKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZSAqbXNnKTsKK2pvYmplY3RBcnJheSBwYXJzZV9wYW5fcHJvcGVydHlfY2hhbmdlKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZSAqbXNnKTsKIHZvaWQgYXBwZW5kX3ZhcmlhbnQoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBpbnQgdHlwZSwgdm9pZCAqdmFsKTsKIGludCBnZXRfYmRhZGRyKGNvbnN0IGNoYXIgKnN0ciwgYmRhZGRyX3QgKmJhKTsKIHZvaWQgZ2V0X2JkYWRkcl9hc19zdHJpbmcoY29uc3QgYmRhZGRyX3QgKmJhLCBjaGFyICpzdHIpOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3cuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3cuY3BwCmluZGV4IDkxNDQ5YmMuLjA0MGRhYzMgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93LmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX0N1cnNvcldpbmRvdy5jcHAKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgIkN1cnNvcldpbmRvdy5oIgorI2luY2x1ZGUgImJpbmRlci9DdXJzb3JXaW5kb3cuaCIKICNpbmNsdWRlICJzcWxpdGUzX2V4Y2VwdGlvbi5oIgogI2luY2x1ZGUgImFuZHJvaWRfdXRpbF9CaW5kZXIuaCIKIApAQCAtMjI1LDcwICsyMjUsNiBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgamJvb2xlYW4gaXNCbG9iX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKLXsKLSAgICBpbnQzMl90IGVycjsKLSAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKLUxPR19XSU5ET1coIkNoZWNraW5nIGlmIGNvbHVtbiBpcyBhIGJsb2Igb3IgbnVsbCBmb3IgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOwotCi0gICAgZmllbGRfc2xvdF90IGZpZWxkOwotICAgIGVyciA9IHdpbmRvdy0+cmVhZF9maWVsZF9zbG90KHJvdywgY29sdW1uLCAmZmllbGQpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICB0aHJvd0V4Y2VwdGlvbldpdGhSb3dDb2woZW52LCByb3csIGNvbHVtbik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBmaWVsZC50eXBlID09IEZJRUxEX1RZUEVfQkxPQiB8fCBmaWVsZC50eXBlID09IEZJRUxEX1RZUEVfTlVMTDsKLX0KLQotc3RhdGljIGpib29sZWFuIGlzU3RyaW5nX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKLXsKLSAgICBpbnQzMl90IGVycjsKLSAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKLUxPR19XSU5ET1coIkNoZWNraW5nIGlmIGNvbHVtbiBpcyBhIHN0cmluZyBvciBudWxsIGZvciAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7Ci0KLSAgICBmaWVsZF9zbG90X3QgZmllbGQ7Ci0gICAgZXJyID0gd2luZG93LT5yZWFkX2ZpZWxkX3Nsb3Qocm93LCBjb2x1bW4sICZmaWVsZCk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIHRocm93RXhjZXB0aW9uV2l0aFJvd0NvbChlbnYsIHJvdywgY29sdW1uKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpZWxkLnR5cGUgPT0gRklFTERfVFlQRV9TVFJJTkcgfHwgZmllbGQudHlwZSA9PSBGSUVMRF9UWVBFX05VTEw7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBpc0ludGVnZXJfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQotewotICAgIGludDMyX3QgZXJyOwotICAgIEN1cnNvcldpbmRvdyAqIHdpbmRvdyA9IEdFVF9XSU5ET1coZW52LCBvYmplY3QpOwotTE9HX1dJTkRPVygiQ2hlY2tpbmcgaWYgY29sdW1uIGlzIGFuIGludGVnZXIgZm9yICVkLCVkIGZyb20gJXAiLCByb3csIGNvbHVtbiwgd2luZG93KTsKLQotICAgIGZpZWxkX3Nsb3RfdCBmaWVsZDsKLSAgICBlcnIgPSB3aW5kb3ctPnJlYWRfZmllbGRfc2xvdChyb3csIGNvbHVtbiwgJmZpZWxkKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgdGhyb3dFeGNlcHRpb25XaXRoUm93Q29sKGVudiwgcm93LCBjb2x1bW4pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmllbGQudHlwZSA9PSBGSUVMRF9UWVBFX0lOVEVHRVI7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBpc0Zsb2F0X25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKLXsKLSAgICBpbnQzMl90IGVycjsKLSAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKLUxPR19XSU5ET1coIkNoZWNraW5nIGlmIGNvbHVtbiBpcyBhIGZsb2F0IGZvciAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7Ci0KLSAgICBmaWVsZF9zbG90X3QgZmllbGQ7Ci0gICAgZXJyID0gd2luZG93LT5yZWFkX2ZpZWxkX3Nsb3Qocm93LCBjb2x1bW4sICZmaWVsZCk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIHRocm93RXhjZXB0aW9uV2l0aFJvd0NvbChlbnYsIHJvdywgY29sdW1uKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpZWxkLnR5cGUgPT0gRklFTERfVFlQRV9GTE9BVDsKLX0KLQogc3RhdGljIGpzdHJpbmcgZ2V0U3RyaW5nX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKIHsKICAgICBpbnQzMl90IGVycjsKQEAgLTQ4NywxMCArNDIzLDkgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBqYm9vbGVhbiBpc051bGxfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQorYm9vbCBpc051bGxfbmF0aXZlKEN1cnNvcldpbmRvdyAqd2luZG93LCBqaW50IHJvdywgamludCBjb2x1bW4pCiB7Ci0gICAgQ3Vyc29yV2luZG93ICogd2luZG93ID0gR0VUX1dJTkRPVyhlbnYsIG9iamVjdCk7Ci1MT0dfV0lORE9XKCJDaGVja2luZyBmb3IgTlVMTCBhdCAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7CisgICAgTE9HX1dJTkRPVygiQ2hlY2tpbmcgZm9yIE5VTEwgYXQgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOwogCiAgICAgYm9vbCBpc051bGw7CiAgICAgaWYgKHdpbmRvdy0+Z2V0TnVsbChyb3csIGNvbHVtbiwgJmlzTnVsbCkpIHsKQEAgLTY1Miw2ICs1ODcsMjYgQEAKICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7CiB9CiAKK3N0YXRpYyBqaW50IGdldFR5cGVfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQoreworICAgIGludDMyX3QgZXJyOworICAgIEN1cnNvcldpbmRvdyAqIHdpbmRvdyA9IEdFVF9XSU5ET1coZW52LCBvYmplY3QpOworICAgIExPR19XSU5ET1coInJldHVybmluZyBjb2x1bW4gdHlwZSBhZmZpbml0eSBmb3IgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOworCisgICAgaWYgKGlzTnVsbF9uYXRpdmUod2luZG93LCByb3csIGNvbHVtbikpIHsKKyAgICAgIHJldHVybiBGSUVMRF9UWVBFX05VTEw7CisgICAgfQorCisgICAgZmllbGRfc2xvdF90IGZpZWxkOworICAgIGVyciA9IHdpbmRvdy0+cmVhZF9maWVsZF9zbG90KHJvdywgY29sdW1uLCAmZmllbGQpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICB0aHJvd0V4Y2VwdGlvbldpdGhSb3dDb2woZW52LCByb3csIGNvbHVtbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBmaWVsZC50eXBlOworfQorCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPQogewogICAgICAvKiBuYW1lLCBzaWduYXR1cmUsIGZ1bmNQdHIgKi8KQEAgLTY2MiwxMSArNjE3LDkgQEAKICAgICB7ImNsb3NlX25hdGl2ZSIsICIoKVYiLCAodm9pZCAqKW5hdGl2ZV9jbG9zZX0sCiAgICAgeyJnZXRMb25nX25hdGl2ZSIsICIoSUkpSiIsICh2b2lkICopZ2V0TG9uZ19uYXRpdmV9LAogICAgIHsiZ2V0QmxvYl9uYXRpdmUiLCAiKElJKVtCIiwgKHZvaWQgKilnZXRCbG9iX25hdGl2ZX0sCi0gICAgeyJpc0Jsb2JfbmF0aXZlIiwgIihJSSlaIiwgKHZvaWQgKilpc0Jsb2JfbmF0aXZlfSwKICAgICB7ImdldFN0cmluZ19uYXRpdmUiLCAiKElJKUxqYXZhL2xhbmcvU3RyaW5nOyIsICh2b2lkICopZ2V0U3RyaW5nX25hdGl2ZX0sCiAgICAgeyJjb3B5U3RyaW5nVG9CdWZmZXJfbmF0aXZlIiwgIihJSUlMYW5kcm9pZC9kYXRhYmFzZS9DaGFyQXJyYXlCdWZmZXI7KVtDIiwgKHZvaWQgKiljb3B5U3RyaW5nVG9CdWZmZXJfbmF0aXZlfSwKICAgICB7ImdldERvdWJsZV9uYXRpdmUiLCAiKElJKUQiLCAodm9pZCAqKWdldERvdWJsZV9uYXRpdmV9LAotICAgIHsiaXNOdWxsX25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopaXNOdWxsX25hdGl2ZX0sCiAgICAgeyJnZXROdW1Sb3dzX25hdGl2ZSIsICIoKUkiLCAodm9pZCAqKWdldE51bVJvd3N9LAogICAgIHsic2V0TnVtQ29sdW1uc19uYXRpdmUiLCAiKEkpWiIsICh2b2lkICopc2V0TnVtQ29sdW1uc30sCiAgICAgeyJhbGxvY1Jvd19uYXRpdmUiLCAiKClaIiwgKHZvaWQgKilhbGxvY1Jvd30sCkBAIC02NzYsOSArNjI5LDcgQEAKICAgICB7InB1dERvdWJsZV9uYXRpdmUiLCAiKERJSSlaIiwgKHZvaWQgKilwdXREb3VibGVfbmF0aXZlfSwKICAgICB7ImZyZWVMYXN0Um93X25hdGl2ZSIsICIoKVYiLCAodm9pZCAqKWZyZWVMYXN0Um93fSwKICAgICB7InB1dE51bGxfbmF0aXZlIiwgIihJSSlaIiwgKHZvaWQgKilwdXROdWxsX25hdGl2ZX0sCi0gICAgeyJpc1N0cmluZ19uYXRpdmUiLCAiKElJKVoiLCAodm9pZCAqKWlzU3RyaW5nX25hdGl2ZX0sCi0gICAgeyJpc0Zsb2F0X25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopaXNGbG9hdF9uYXRpdmV9LAotICAgIHsiaXNJbnRlZ2VyX25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopaXNJbnRlZ2VyX25hdGl2ZX0sCisgICAgeyJnZXRUeXBlX25hdGl2ZSIsICIoSUkpSSIsICh2b2lkICopZ2V0VHlwZV9uYXRpdmV9LAogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93KEpOSUVudiAqIGVudikKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVDb21waWxlZFNxbC5jcHAKaW5kZXggOGQxYzM5ZWUuLmRlNGM1YzggMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwuY3BwCkBAIC05MSwyMiArOTEsMTEgQEAKICAgICBjb21waWxlKGVudiwgb2JqZWN0LCBHRVRfSEFORExFKGVudiwgb2JqZWN0KSwgc3FsU3RyaW5nKTsKIH0KIAotc3RhdGljIHZvaWQgbmF0aXZlX2ZpbmFsaXplKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkKLXsKLSAgICBpbnQgZXJyOwotICAgIHNxbGl0ZTNfc3RtdCAqIHN0YXRlbWVudCA9IEdFVF9TVEFURU1FTlQoZW52LCBvYmplY3QpOwotCi0gICAgaWYgKHN0YXRlbWVudCAhPSBOVUxMKSB7Ci0gICAgICAgIHNxbGl0ZTNfZmluYWxpemUoc3RhdGVtZW50KTsKLSAgICAgICAgZW52LT5TZXRJbnRGaWVsZChvYmplY3QsIGdTdGF0ZW1lbnRGaWVsZCwgMCk7Ci0gICAgfQotfQogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPQogewogICAgICAvKiBuYW1lLCBzaWduYXR1cmUsIGZ1bmNQdHIgKi8KICAgICB7Im5hdGl2ZV9jb21waWxlIiwgIihMamF2YS9sYW5nL1N0cmluZzspViIsICh2b2lkICopbmF0aXZlX2NvbXBpbGV9LAotICAgIHsibmF0aXZlX2ZpbmFsaXplIiwgIigpViIsICh2b2lkICopbmF0aXZlX2ZpbmFsaXplfSwKIH07CiAKIGludCByZWdpc3Rlcl9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZUNvbXBpbGVkU3FsKEpOSUVudiAqIGVudikKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlRGF0YWJhc2UuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZS5jcHAKaW5kZXggMzYyMzRhOS4uNGIzZjFjMCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZS5jcHAKQEAgLTE1LDcgKzE1LDcgQEAKICAqLwogCiAjdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJEYXRhYmFzZSIKKyNkZWZpbmUgTE9HX1RBRyAiU3FsaXRlRGF0YWJhc2VDcHAiCiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC02Miw5ICs2MiwxMSBAQAogfTsKIAogc3RhdGljIGpmaWVsZElEIG9mZnNldF9kYl9oYW5kbGU7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9jdXN0b21fZnVuY3Rpb25fY2FsbGJhY2s7CitzdGF0aWMgamNsYXNzIHN0cmluZ19jbGFzcyA9IE5VTEw7CiAKLXN0YXRpYyBjaGFyICpjcmVhdGVTdHIoY29uc3QgY2hhciAqcGF0aCkgewotICAgIGludCBsZW4gPSBzdHJsZW4ocGF0aCk7CitzdGF0aWMgY2hhciAqY3JlYXRlU3RyKGNvbnN0IGNoYXIgKnBhdGgsIHNob3J0IGV4dHJhKSB7CisgICAgaW50IGxlbiA9IHN0cmxlbihwYXRoKSArIGV4dHJhOwogICAgIGNoYXIgKnN0ciA9IChjaGFyICopbWFsbG9jKGxlbiArIDEpOwogICAgIHN0cm5jcHkoc3RyLCBwYXRoLCBsZW4pOwogICAgIHN0cltsZW5dID0gTlVMTDsKQEAgLTg1LDcgKzg3LDcgQEAKICAgICB9CiAKICAgICBMT0dWKCJSZWdpc3RlcmluZyBzcWxpdGUgbG9nZ2luZyBmdW5jIFxuIik7Ci0gICAgaW50IGVyciA9IHNxbGl0ZTNfY29uZmlnKFNRTElURV9DT05GSUdfTE9HLCAmc3FsTG9nZ2VyLCAodm9pZCAqKWNyZWF0ZVN0cihwYXRoKSk7CisgICAgaW50IGVyciA9IHNxbGl0ZTNfY29uZmlnKFNRTElURV9DT05GSUdfTE9HLCAmc3FsTG9nZ2VyLCAodm9pZCAqKWNyZWF0ZVN0cihwYXRoLCAwKSk7CiAgICAgaWYgKGVyciAhPSBTUUxJVEVfT0spIHsKICAgICAgICAgTE9HRSgic3FsaXRlX2NvbmZpZyBmYWlsZWQgZXJyb3JfY29kZSA9ICVkLiBUSElTIFNIT1VMRCBORVZFUiBvY2N1ci5cbiIsIGVycik7CiAgICAgICAgIHJldHVybjsKQEAgLTE3NiwxMyArMTc4LDE3IEBACiAgICAgaWYgKGhhbmRsZSAhPSBOVUxMKSBzcWxpdGUzX2Nsb3NlKGhhbmRsZSk7CiB9CiAKLXN0YXRpYyBjaGFyICpnZXREYXRhYmFzZU5hbWUoSk5JRW52KiBlbnYsIHNxbGl0ZTMgKiBoYW5kbGUsIGpzdHJpbmcgZGF0YWJhc2VOYW1lKSB7CitzdGF0aWMgY2hhciAqZ2V0RGF0YWJhc2VOYW1lKEpOSUVudiogZW52LCBzcWxpdGUzICogaGFuZGxlLCBqc3RyaW5nIGRhdGFiYXNlTmFtZSwgc2hvcnQgY29ubk51bSkgewogICAgIGNoYXIgY29uc3QgKnBhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGRhdGFiYXNlTmFtZSwgTlVMTCk7CiAgICAgaWYgKHBhdGggPT0gTlVMTCkgewogICAgICAgICBMT0dFKCJGYWlsdXJlIGluIGdldERhdGFiYXNlTmFtZSgpLiBWTSByYW4gb3V0IG9mIG1lbW9yeT9cbiIpOwogICAgICAgICByZXR1cm4gTlVMTDsgLy8gVk0gd291bGQgaGF2ZSB0aHJvd24gT3V0T2ZNZW1vcnlFcnJvcgogICAgIH0KLSAgICBjaGFyICpkYk5hbWVTdHIgPSBjcmVhdGVTdHIocGF0aCk7CisgICAgY2hhciAqZGJOYW1lU3RyID0gY3JlYXRlU3RyKHBhdGgsIDQpOworICAgIGlmIChjb25uTnVtID4gOTk5KSB7IC8vIFRPRE86IGlmIG51bWJlciBvZiBwb29sZWQgY29ubmVjdGlvbnMgPiA5OTksIGZpeCB0aGlzIGxpbmUuCisgICAgICBjb25uTnVtID0gLTE7CisgICAgfQorICAgIHNwcmludGYoZGJOYW1lU3RyICsgc3RybGVuKHBhdGgpLCAifCUwM2QiLCBjb25uTnVtKTsKICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhkYXRhYmFzZU5hbWUsIHBhdGgpOwogICAgIHJldHVybiBkYk5hbWVTdHI7CiB9CkBAIC0xOTIsMTAgKzE5OCwxMCBAQAogfQogCiAvKiBwdWJsaWMgbmF0aXZlIHZvaWQgZW5hYmxlU3FsVHJhY2luZygpOyAqLwotc3RhdGljIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgZGF0YWJhc2VOYW1lKQorc3RhdGljIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgZGF0YWJhc2VOYW1lLCBqc2hvcnQgY29ublR5cGUpCiB7CiAgICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOwotICAgIHNxbGl0ZTNfdHJhY2UoaGFuZGxlLCAmc3FsVHJhY2UsICh2b2lkICopZ2V0RGF0YWJhc2VOYW1lKGVudiwgaGFuZGxlLCBkYXRhYmFzZU5hbWUpKTsKKyAgICBzcWxpdGUzX3RyYWNlKGhhbmRsZSwgJnNxbFRyYWNlLCAodm9pZCAqKWdldERhdGFiYXNlTmFtZShlbnYsIGhhbmRsZSwgZGF0YWJhc2VOYW1lLCBjb25uVHlwZSkpOwogfQogCiBzdGF0aWMgdm9pZCBzcWxQcm9maWxlKHZvaWQgKmRhdGFiYXNlTmFtZSwgY29uc3QgY2hhciAqc3FsLCBzcWxpdGUzX3VpbnQ2NCB0bSkgewpAQCAtMjA0LDEzICsyMTAsMTMgQEAKIH0KIAogLyogcHVibGljIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFByb2ZpbGluZygpOyAqLwotc3RhdGljIHZvaWQgZW5hYmxlU3FsUHJvZmlsaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBkYXRhYmFzZU5hbWUpCitzdGF0aWMgdm9pZCBlbmFibGVTcWxQcm9maWxpbmcoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIGRhdGFiYXNlTmFtZSwganNob3J0IGNvbm5UeXBlKQogewogICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKLSAgICBzcWxpdGUzX3Byb2ZpbGUoaGFuZGxlLCAmc3FsUHJvZmlsZSwgKHZvaWQgKilnZXREYXRhYmFzZU5hbWUoZW52LCBoYW5kbGUsIGRhdGFiYXNlTmFtZSkpOworICAgIHNxbGl0ZTNfcHJvZmlsZShoYW5kbGUsICZzcWxQcm9maWxlLCAodm9pZCAqKWdldERhdGFiYXNlTmFtZShlbnYsIGhhbmRsZSwgZGF0YWJhc2VOYW1lLAorICAgICAgICAgICAgY29ublR5cGUpKTsKIH0KIAotCiAvKiBwdWJsaWMgbmF0aXZlIHZvaWQgY2xvc2UoKTsgKi8KIHN0YXRpYyB2b2lkIGRiY2xvc2UoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQogewpAQCAtMjQwLDczICsyNDYsNiBAQAogICAgIH0KIH0KIAotLyogcHVibGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9leGVjU1FMKFN0cmluZyBzcWwpOyAqLwotc3RhdGljIHZvaWQgbmF0aXZlX2V4ZWNTUUwoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIHNxbFN0cmluZykKLXsKLSAgICBpbnQgZXJyOwotICAgIGludCBzdGVwRXJyOwotICAgIHNxbGl0ZTNfc3RtdCAqIHN0YXRlbWVudCA9IE5VTEw7Ci0gICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOwotICAgIGpjaGFyIGNvbnN0ICogc3FsID0gZW52LT5HZXRTdHJpbmdDaGFycyhzcWxTdHJpbmcsIE5VTEwpOwotICAgIGpzaXplIHNxbExlbiA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHNxbFN0cmluZyk7Ci0KLSAgICBpZiAoc3FsID09IE5VTEwgfHwgc3FsTGVuID09IDApIHsKLSAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsICJZb3UgbXVzdCBzdXBwbHkgYW4gU1FMIHN0cmluZyIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZXJyID0gc3FsaXRlM19wcmVwYXJlMTZfdjIoaGFuZGxlLCBzcWwsIHNxbExlbiAqIDIsICZzdGF0ZW1lbnQsIE5VTEwpOwotCi0gICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnMoc3FsU3RyaW5nLCBzcWwpOwotCi0gICAgaWYgKGVyciAhPSBTUUxJVEVfT0spIHsKLSAgICAgICAgY2hhciBjb25zdCAqIHNxbDggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHNxbFN0cmluZywgTlVMTCk7Ci0gICAgICAgIExPR0UoIkZhaWx1cmUgJWQgKCVzKSBvbiAlcCB3aGVuIHByZXBhcmluZyAnJXMnLlxuIiwgZXJyLCBzcWxpdGUzX2Vycm1zZyhoYW5kbGUpLCBoYW5kbGUsIHNxbDgpOwotICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsIGhhbmRsZSwgc3FsOCk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNxbFN0cmluZywgc3FsOCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdGVwRXJyID0gc3FsaXRlM19zdGVwKHN0YXRlbWVudCk7Ci0gICAgZXJyID0gc3FsaXRlM19maW5hbGl6ZShzdGF0ZW1lbnQpOwotCi0gICAgaWYgKHN0ZXBFcnIgIT0gU1FMSVRFX0RPTkUpIHsKLSAgICAgICAgaWYgKHN0ZXBFcnIgPT0gU1FMSVRFX1JPVykgewotICAgICAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb24oZW52LCAiUXVlcmllcyBjYW5ub3QgYmUgcGVyZm9ybWVkIHVzaW5nIGV4ZWNTUUwoKSwgdXNlIHF1ZXJ5KCkgaW5zdGVhZC4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoYXIgY29uc3QgKiBzcWw4ID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzcWxTdHJpbmcsIE5VTEwpOwotICAgICAgICAgICAgTE9HRSgiRmFpbHVyZSAlZCAoJXMpIG9uICVwIHdoZW4gZXhlY3V0aW5nICclcydcbiIsIGVyciwgc3FsaXRlM19lcnJtc2coaGFuZGxlKSwgaGFuZGxlLCBzcWw4KTsKLSAgICAgICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uKGVudiwgaGFuZGxlLCBzcWw4KTsKLSAgICAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNxbFN0cmluZywgc3FsOCk7Ci0KLSAgICAgICAgfQotICAgIH0gZWxzZQotI2lmbmRlZiBEQl9MT0dfU1RBVEVNRU5UUwotICAgIElGX0xPR1YoKQotI2VuZGlmCi0gICAgewotICAgICAgICBjaGFyIGNvbnN0ICogc3FsOCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc3FsU3RyaW5nLCBOVUxMKTsKLSAgICAgICAgTE9HVigiU3VjY2VzcyBvbiAlcCB3aGVuIGV4ZWN1dGluZyAnJXMnXG4iLCBoYW5kbGUsIHNxbDgpOwotICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzcWxTdHJpbmcsIHNxbDgpOwotICAgIH0KLX0KLQotLyogbmF0aXZlIGxvbmcgbGFzdEluc2VydFJvdygpOyAqLwotc3RhdGljIGpsb25nIGxhc3RJbnNlcnRSb3coSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQotewotICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKLQotICAgIHJldHVybiBzcWxpdGUzX2xhc3RfaW5zZXJ0X3Jvd2lkKGhhbmRsZSk7Ci19Ci0KLS8qIG5hdGl2ZSBpbnQgbGFzdENoYW5nZUNvdW50KCk7ICovCi1zdGF0aWMgamludCBsYXN0Q2hhbmdlQ291bnQoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQotewotICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKLQotICAgIHJldHVybiBzcWxpdGUzX2NoYW5nZXMoaGFuZGxlKTsKLX0KLQogLyogbmF0aXZlIGludCBuYXRpdmVfZ2V0RGJMb29rYXNpZGUoKTsgKi8KIHN0YXRpYyBqaW50IG5hdGl2ZV9nZXREYkxvb2thc2lkZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCiB7CkBAIC00NDMsMTkgKzM4Miw5MyBAQAogICAgIHJldHVybiBzcWxpdGUzX3JlbGVhc2VfbWVtb3J5KFNRTElURV9TT0ZUX0hFQVBfTElNSVQpOwogfQogCitzdGF0aWMgdm9pZCBuYXRpdmVfZmluYWxpemUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHN0YXRlbWVudElkKQoreworICAgIGlmIChzdGF0ZW1lbnRJZCA+IDApIHsKKyAgICAgICAgc3FsaXRlM19maW5hbGl6ZSgoc3FsaXRlM19zdG10ICopc3RhdGVtZW50SWQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY3VzdG9tX2Z1bmN0aW9uX2NhbGxiYWNrKHNxbGl0ZTNfY29udGV4dCAqIGNvbnRleHQsIGludCBhcmdjLCBzcWxpdGUzX3ZhbHVlICoqIGFyZ3YpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBpZiAoIWVudikgeworICAgICAgICBMT0dFKCJjdXN0b21fZnVuY3Rpb25fY2FsbGJhY2sgY2Fubm90IGNhbGwgaW50byBKYXZhIG9uIHRoaXMgdGhyZWFkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gZ2V0IGdsb2JhbCByZWYgdG8gQ3VzdG9tRnVuY3Rpb24gb2JqZWN0IGZyb20gb3VyIHVzZXIgZGF0YQorICAgIGpvYmplY3QgZnVuY3Rpb24gPSAoam9iamVjdClzcWxpdGUzX3VzZXJfZGF0YShjb250ZXh0KTsKKworICAgIC8vIHBhY2sgdXAgdGhlIGFyZ3VtZW50cyBpbnRvIGEgc3RyaW5nIGFycmF5CisgICAgaWYgKCFzdHJpbmdfY2xhc3MpCisgICAgICAgIHN0cmluZ19jbGFzcyA9IChqY2xhc3MpZW52LT5OZXdHbG9iYWxSZWYoZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9TdHJpbmciKSk7CisgICAgam9iamVjdEFycmF5IHN0ckFycmF5ID0gZW52LT5OZXdPYmplY3RBcnJheShhcmdjLCBzdHJpbmdfY2xhc3MsIE5VTEwpOworICAgIGlmICghc3RyQXJyYXkpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICBjaGFyKiBhcmcgPSAoY2hhciAqKXNxbGl0ZTNfdmFsdWVfdGV4dChhcmd2W2ldKTsKKyAgICAgICAgaWYgKCFhcmcpIHsKKyAgICAgICAgICAgIExPR0UoIk5VTEwgYXJndW1lbnQgaW4gY3VzdG9tX2Z1bmN0aW9uX2NhbGxiYWNrLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbi4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3U3RyaW5nVVRGKGFyZyk7CisgICAgICAgIGlmICghb2JqKQorICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChzdHJBcnJheSwgaSwgb2JqKTsKKyAgICAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOworICAgIH0KKworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoZnVuY3Rpb24sIG1ldGhvZF9jdXN0b21fZnVuY3Rpb25fY2FsbGJhY2ssIHN0ckFycmF5KTsKKworZG9uZToKKyAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgICAgIExPR0UoIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGJ5IGN1c3RvbSBzcWxpdGUzIGZ1bmN0aW9uLiIpOworICAgICAgICBMT0dFX0VYKGVudik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBqaW50IG5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbihKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCisgICAgICAgIGpzdHJpbmcgbmFtZSwgamludCBudW1BcmdzLCBqb2JqZWN0IGZ1bmN0aW9uKQoreworICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKKyAgICBjaGFyIGNvbnN0ICpuYW1lU3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhuYW1lLCBOVUxMKTsKKyAgICBqb2JqZWN0IHJlZiA9IGVudi0+TmV3R2xvYmFsUmVmKGZ1bmN0aW9uKTsKKyAgICBMT0dEKCJuYXRpdmVfYWRkQ3VzdG9tRnVuY3Rpb24gJXMgcmVmOiAlcCIsIG5hbWVTdHIsIHJlZik7CisgICAgaW50IGVyciA9IHNxbGl0ZTNfY3JlYXRlX2Z1bmN0aW9uKGhhbmRsZSwgbmFtZVN0ciwgbnVtQXJncywgU1FMSVRFX1VURjgsCisgICAgICAgICAgICAodm9pZCAqKXJlZiwgY3VzdG9tX2Z1bmN0aW9uX2NhbGxiYWNrLCBOVUxMLCBOVUxMKTsKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhuYW1lLCBuYW1lU3RyKTsKKworICAgIGlmIChlcnIgPT0gU1FMSVRFX09LKQorICAgICAgICByZXR1cm4gKGludClyZWY7CisgICAgZWxzZSB7CisgICAgICAgIExPR0UoInNxbGl0ZTNfY3JlYXRlX2Z1bmN0aW9uIHJldHVybmVkICVkIiwgZXJyKTsKKyAgICAgICAgZW52LT5EZWxldGVHbG9iYWxSZWYocmVmKTsKKyAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb24oZW52LCBoYW5kbGUpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgfQorfQorCitzdGF0aWMgdm9pZCBuYXRpdmVfcmVsZWFzZUN1c3RvbUZ1bmN0aW9uKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByZWYpCit7CisgICAgTE9HRCgibmF0aXZlX3JlbGVhc2VDdXN0b21GdW5jdGlvbiAlZCIsIHJlZik7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYoKGpvYmplY3QpcmVmKTsKK30KKwogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBzTWV0aG9kc1tdID0KIHsKICAgICAvKiBuYW1lLCBzaWduYXR1cmUsIGZ1bmNQdHIgKi8KICAgICB7ImRib3BlbiIsICIoTGphdmEvbGFuZy9TdHJpbmc7SSlWIiwgKHZvaWQgKilkYm9wZW59LAogICAgIHsiZGJjbG9zZSIsICIoKVYiLCAodm9pZCAqKWRiY2xvc2V9LAotICAgIHsiZW5hYmxlU3FsVHJhY2luZyIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAodm9pZCAqKWVuYWJsZVNxbFRyYWNpbmd9LAotICAgIHsiZW5hYmxlU3FsUHJvZmlsaW5nIiwgIihMamF2YS9sYW5nL1N0cmluZzspViIsICh2b2lkICopZW5hYmxlU3FsUHJvZmlsaW5nfSwKLSAgICB7Im5hdGl2ZV9leGVjU1FMIiwgIihMamF2YS9sYW5nL1N0cmluZzspViIsICh2b2lkICopbmF0aXZlX2V4ZWNTUUx9LAotICAgIHsibGFzdEluc2VydFJvdyIsICIoKUoiLCAodm9pZCAqKWxhc3RJbnNlcnRSb3d9LAotICAgIHsibGFzdENoYW5nZUNvdW50IiwgIigpSSIsICh2b2lkICopbGFzdENoYW5nZUNvdW50fSwKKyAgICB7ImVuYWJsZVNxbFRyYWNpbmciLCAiKExqYXZhL2xhbmcvU3RyaW5nO1MpViIsICh2b2lkICopZW5hYmxlU3FsVHJhY2luZ30sCisgICAgeyJlbmFibGVTcWxQcm9maWxpbmciLCAiKExqYXZhL2xhbmcvU3RyaW5nO1MpViIsICh2b2lkICopZW5hYmxlU3FsUHJvZmlsaW5nfSwKICAgICB7Im5hdGl2ZV9zZXRMb2NhbGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIsICh2b2lkICopbmF0aXZlX3NldExvY2FsZX0sCiAgICAgeyJuYXRpdmVfZ2V0RGJMb29rYXNpZGUiLCAiKClJIiwgKHZvaWQgKiluYXRpdmVfZ2V0RGJMb29rYXNpZGV9LAogICAgIHsicmVsZWFzZU1lbW9yeSIsICIoKUkiLCAodm9pZCAqKW5hdGl2ZV9yZWxlYXNlTWVtb3J5fSwKKyAgICB7Im5hdGl2ZV9maW5hbGl6ZSIsICIoSSlWIiwgKHZvaWQgKiluYXRpdmVfZmluYWxpemV9LAorICAgIHsibmF0aXZlX2FkZEN1c3RvbUZ1bmN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztJTGFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlJEN1c3RvbUZ1bmN0aW9uOylJIiwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiluYXRpdmVfYWRkQ3VzdG9tRnVuY3Rpb259LAorICAgIHsibmF0aXZlX3JlbGVhc2VDdXN0b21GdW5jdGlvbiIsICIoSSlWIiwgKHZvaWQgKiluYXRpdmVfcmVsZWFzZUN1c3RvbUZ1bmN0aW9ufSwKIH07CiAKIGludCByZWdpc3Rlcl9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZURhdGFiYXNlKEpOSUVudiAqZW52KQpAQCAtNDc0LDcgKzQ4NywxOSBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LCAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UiLCBzTWV0aG9kcywgTkVMRU0oc01ldGhvZHMpKTsKKyAgICBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZSRDdXN0b21GdW5jdGlvbiIpOworICAgIGlmIChjbGF6eiA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UkQ3VzdG9tRnVuY3Rpb25cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9jdXN0b21fZnVuY3Rpb25fY2FsbGJhY2sgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiY2FsbGJhY2siLCAiKFtMamF2YS9sYW5nL1N0cmluZzspViIpOworICAgIGlmIChtZXRob2RfY3VzdG9tX2Z1bmN0aW9uX2NhbGxiYWNrID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBtZXRob2QgU1FMaXRlRGF0YWJhc2UuQ3VzdG9tRnVuY3Rpb24uY2FsbGJhY2tcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LCAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UiLAorICAgICAgICAgICAgc01ldGhvZHMsIE5FTEVNKHNNZXRob2RzKSk7CiB9CiAKIC8qIHRocm93IGEgU1FMaXRlRXhjZXB0aW9uIHdpdGggYSBtZXNzYWdlIGFwcHJvcHJpYXRlIGZvciB0aGUgZXJyb3IgaW4gaGFuZGxlICovCkBAIC01MjMsNiArNTQ4LDcgQEAKICAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURpc2tJT0V4Y2VwdGlvbiI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBTUUxJVEVfQ09SUlVQVDoKKyAgICAgICAgY2FzZSBTUUxJVEVfTk9UQURCOiAvLyB0cmVhdCAidW5zdXBwb3J0ZWQgZmlsZSBmb3JtYXQiIGVycm9yIGFzIGNvcnJ1cHRpb24gYWxzbwogICAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFNRTElURV9DT05TVFJBSU5UOgpAQCAtNTQwLDYgKzU2NiwzMyBAQAogICAgICAgICBjYXNlIFNRTElURV9NSVNVU0U6CiAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU1pc3VzZUV4Y2VwdGlvbiI7CiAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9QRVJNOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX0JVU1k6CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX0xPQ0tFRDoKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24iOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfUkVBRE9OTFk6CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24iOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfQ0FOVE9QRU46CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24iOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfVE9PQklHOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX1JBTkdFOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24iOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfTk9NRU06CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX01JU01BVENIOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUV4Y2VwdGlvbiI7CiAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVRdWVyeS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVF1ZXJ5LmNwcAppbmRleCA0NDI3MTY4My4uNzQ3ZWU1MCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVRdWVyeS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVRdWVyeS5jcHAKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgIkN1cnNvcldpbmRvdy5oIgorI2luY2x1ZGUgImJpbmRlci9DdXJzb3JXaW5kb3cuaCIKICNpbmNsdWRlICJzcWxpdGUzX2V4Y2VwdGlvbi5oIgogCiAKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlU3RhdGVtZW50LmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlU3RhdGVtZW50LmNwcAppbmRleCBmZjJlZDVkLi4wZjMxMTRiIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVN0YXRlbWVudC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVTdGF0ZW1lbnQuY3BwCkBAIC0xNiw3ICsxNiw5IEBACiAqLwogCiAjdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJDdXJzb3IiCisjZGVmaW5lIExPR19UQUcgIlNRTGl0ZVN0YXRlbWVudENwcCIKKworI2luY2x1ZGUgImFuZHJvaWRfdXRpbF9CaW5kZXIuaCIKIAogI2luY2x1ZGUgPGpuaS5oPgogI2luY2x1ZGUgPEpOSUhlbHAuaD4KQEAgLTI0LDExICsyNiwxNiBAQAogCiAjaW5jbHVkZSA8c3FsaXRlMy5oPgogCisjaW5jbHVkZSA8Y3V0aWxzL2FzaG1lbS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KIAogI2luY2x1ZGUgInNxbGl0ZTNfZXhjZXB0aW9uLmgiCiAKQEAgLTQ4LDIyICs1NSw0MCBAQAogICAgICAgICAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBnSGFuZGxlRmllbGQpCiAKIAotc3RhdGljIHZvaWQgbmF0aXZlX2V4ZWN1dGUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQorc3RhdGljIGppbnQgbmF0aXZlX2V4ZWN1dGUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQogewogICAgIGludCBlcnI7CiAgICAgc3FsaXRlMyAqIGhhbmRsZSA9IEdFVF9IQU5ETEUoZW52LCBvYmplY3QpOwogICAgIHNxbGl0ZTNfc3RtdCAqIHN0YXRlbWVudCA9IEdFVF9TVEFURU1FTlQoZW52LCBvYmplY3QpOworICAgIGludCBudW1DaGFuZ2VzID0gLTE7CiAKICAgICAvLyBFeGVjdXRlIHRoZSBzdGF0ZW1lbnQKICAgICBlcnIgPSBzcWxpdGUzX3N0ZXAoc3RhdGVtZW50KTsKIAotICAgIC8vIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cmVkCi0gICAgaWYgKGVyciAhPSBTUUxJVEVfRE9ORSkgeworICAgIC8vIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnJlZAorICAgIGlmIChlcnIgPT0gU1FMSVRFX1JPVykgeworICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsCisgICAgICAgICAgICAgICAgIlF1ZXJpZXMgY2FuIGJlIHBlcmZvcm1lZCB1c2luZyBTUUxpdGVEYXRhYmFzZSBxdWVyeSBvciByYXdRdWVyeSBtZXRob2RzIG9ubHkuIik7CisgICAgfSBlbHNlIGlmIChlcnIgIT0gU1FMSVRFX0RPTkUpIHsKICAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb25fZXJyY29kZShlbnYsIGVyciwgc3FsaXRlM19lcnJtc2coaGFuZGxlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbnVtQ2hhbmdlcyA9IHNxbGl0ZTNfY2hhbmdlcyhoYW5kbGUpOwogICAgIH0KIAotICAgIC8vIFJlc2V0IHRoZSBzdGF0bWVudCBzbyBpdCdzIHJlYWR5IHRvIHVzZSBhZ2FpbgorICAgIC8vIFJlc2V0IHRoZSBzdGF0ZW1lbnQgc28gaXQncyByZWFkeSB0byB1c2UgYWdhaW4KICAgICBzcWxpdGUzX3Jlc2V0KHN0YXRlbWVudCk7CisgICAgcmV0dXJuIG51bUNoYW5nZXM7Cit9CisKK3N0YXRpYyBqbG9uZyBuYXRpdmVfZXhlY3V0ZUluc2VydChKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCit7CisgICAgc3FsaXRlMyAqIGhhbmRsZSA9IEdFVF9IQU5ETEUoZW52LCBvYmplY3QpOworICAgIGppbnQgbnVtQ2hhbmdlcyA9IG5hdGl2ZV9leGVjdXRlKGVudiwgb2JqZWN0KTsKKyAgICBpZiAobnVtQ2hhbmdlcyA+IDApIHsKKyAgICAgICAgcmV0dXJuIHNxbGl0ZTNfbGFzdF9pbnNlcnRfcm93aWQoaGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogfQogCiBzdGF0aWMgamxvbmcgbmF0aXZlXzF4MV9sb25nKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkKQEAgLTExNSwxMyArMTQwLDExMyBAQAogICAgIHJldHVybiB2YWx1ZTsKIH0KIAorc3RhdGljIGpvYmplY3QgY3JlYXRlUGFyY2VsRmlsZURlc2NyaXB0b3IoSk5JRW52ICogZW52LCBpbnQgZmQpCit7CisgICAgLy8gQ3JlYXRlIEZpbGVEZXNjcmlwdG9yIG9iamVjdAorICAgIGpvYmplY3QgZmlsZURlc2MgPSBuZXdGaWxlRGVzY3JpcHRvcihlbnYsIGZkKTsKKyAgICBpZiAoZmlsZURlc2MgPT0gTlVMTCkgeworICAgICAgICAvLyBGaWxlRGVzY3JpcHRvciBjb25zdHJ1Y3RvciBoYXMgdGhyb3duIGFuIGV4Y2VwdGlvbgorICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIFdyYXAgaXQgaW4gYSBQYXJjZWxGaWxlRGVzY3JpcHRvcgorICAgIGpvYmplY3QgcGFyY2VsRmlsZURlc2MgPSBuZXdQYXJjZWxGaWxlRGVzY3JpcHRvcihlbnYsIGZpbGVEZXNjKTsKKyAgICBpZiAocGFyY2VsRmlsZURlc2MgPT0gTlVMTCkgeworICAgICAgICAvLyBQYXJjZWxGaWxlRGVzY3JpcHRvciBjb25zdHJ1Y3RvciBoYXMgdGhyb3duIGFuIGV4Y2VwdGlvbgorICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBwYXJjZWxGaWxlRGVzYzsKK30KKworLy8gQ3JlYXRlcyBhbiBhc2htZW0gYXJlYSwgY29waWVzIHNvbWUgZGF0YSBpbnRvIGl0LCBhbmQgcmV0dXJucworLy8gYSBQYXJjZWxGaWxlRGVzY3JpcHRvciBmb3IgdGhlIGFzaG1lbSBhcmVhLgorc3RhdGljIGpvYmplY3QgY3JlYXRlX2FzaG1lbV9yZWdpb25fd2l0aF9kYXRhKEpOSUVudiAqIGVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogZGF0YSwgaW50IGxlbmd0aCkKK3sKKyAgICAvLyBDcmVhdGUgYXNobWVtIGFyZWEKKyAgICBpbnQgZmQgPSBhc2htZW1fY3JlYXRlX3JlZ2lvbihOVUxMLCBsZW5ndGgpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgTE9HRSgiYXNobWVtX2NyZWF0ZV9yZWdpb24gZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGpuaVRocm93SU9FeGNlcHRpb24oZW52LCBlcnJubyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICAgIC8vIG1tYXAgdGhlIGFzaG1lbSBhcmVhCisgICAgICAgIHZvaWQgKiBhc2htZW1fcHRyID0KKyAgICAgICAgICAgICAgICBtbWFwKE5VTEwsIGxlbmd0aCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQsIDApOworICAgICAgICBpZiAoYXNobWVtX3B0ciA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICBMT0dFKCJtbWFwIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgam5pVGhyb3dJT0V4Y2VwdGlvbihlbnYsIGVycm5vKTsKKyAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29weSBkYXRhIHRvIGFzaG1lbSBhcmVhCisgICAgICAgIG1lbWNweShhc2htZW1fcHRyLCBkYXRhLCBsZW5ndGgpOworCisgICAgICAgIC8vIG11bm1hcCBhc2htZW0gYXJlYQorICAgICAgICBpZiAobXVubWFwKGFzaG1lbV9wdHIsIGxlbmd0aCkgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJtdW5tYXAgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBqbmlUaHJvd0lPRXhjZXB0aW9uKGVudiwgZXJybm8pOworICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBNYWtlIGFzaG1lbSBhcmVhIHJlYWQtb25seQorICAgIGlmIChhc2htZW1fc2V0X3Byb3RfcmVnaW9uKGZkLCBQUk9UX1JFQUQpIDwgMCkgeworICAgICAgICBMT0dFKCJhc2htZW1fc2V0X3Byb3RfcmVnaW9uIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBqbmlUaHJvd0lPRXhjZXB0aW9uKGVudiwgZXJybm8pOworICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIFdyYXAgaXQgaW4gYSBQYXJjZWxGaWxlRGVzY3JpcHRvcgorICAgIHJldHVybiBjcmVhdGVQYXJjZWxGaWxlRGVzY3JpcHRvcihlbnYsIGZkKTsKK30KKworc3RhdGljIGpvYmplY3QgbmF0aXZlXzF4MV9ibG9iX2FzaG1lbShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCit7CisgICAgaW50IGVycjsKKyAgICBzcWxpdGUzICogaGFuZGxlID0gR0VUX0hBTkRMRShlbnYsIG9iamVjdCk7CisgICAgc3FsaXRlM19zdG10ICogc3RhdGVtZW50ID0gR0VUX1NUQVRFTUVOVChlbnYsIG9iamVjdCk7CisgICAgam9iamVjdCB2YWx1ZSA9IE5VTEw7CisKKyAgICAvLyBFeGVjdXRlIHRoZSBzdGF0ZW1lbnQKKyAgICBlcnIgPSBzcWxpdGUzX3N0ZXAoc3RhdGVtZW50KTsKKworICAgIC8vIEhhbmRsZSB0aGUgcmVzdWx0CisgICAgaWYgKGVyciA9PSBTUUxJVEVfUk9XKSB7CisgICAgICAgIC8vIE5vIGVycm9ycywgcmVhZCB0aGUgZGF0YSBhbmQgcmV0dXJuIGl0CisgICAgICAgIGNvbnN0IHZvaWQgKiBibG9iID0gc3FsaXRlM19jb2x1bW5fYmxvYihzdGF0ZW1lbnQsIDApOworICAgICAgICBpZiAoYmxvYiAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQgbGVuID0gc3FsaXRlM19jb2x1bW5fYnl0ZXMoc3RhdGVtZW50LCAwKTsKKyAgICAgICAgICAgIGlmIChsZW4gPj0gMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gY3JlYXRlX2FzaG1lbV9yZWdpb25fd2l0aF9kYXRhKGVudiwgYmxvYiwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uX2VycmNvZGUoZW52LCBlcnIsIHNxbGl0ZTNfZXJybXNnKGhhbmRsZSkpOworICAgIH0KKworICAgIC8vIFJlc2V0IHRoZSBzdGF0bWVudCBzbyBpdCdzIHJlYWR5IHRvIHVzZSBhZ2FpbgorICAgIHNxbGl0ZTNfcmVzZXQoc3RhdGVtZW50KTsKKworICAgIHJldHVybiB2YWx1ZTsKK30KIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBzTWV0aG9kc1tdID0KIHsKICAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCi0gICAgeyJuYXRpdmVfZXhlY3V0ZSIsICIoKVYiLCAodm9pZCAqKW5hdGl2ZV9leGVjdXRlfSwKKyAgICB7Im5hdGl2ZV9leGVjdXRlIiwgIigpSSIsICh2b2lkICopbmF0aXZlX2V4ZWN1dGV9LAorICAgIHsibmF0aXZlX2V4ZWN1dGVJbnNlcnQiLCAiKClKIiwgKHZvaWQgKiluYXRpdmVfZXhlY3V0ZUluc2VydH0sCiAgICAgeyJuYXRpdmVfMXgxX2xvbmciLCAiKClKIiwgKHZvaWQgKiluYXRpdmVfMXgxX2xvbmd9LAogICAgIHsibmF0aXZlXzF4MV9zdHJpbmciLCAiKClMamF2YS9sYW5nL1N0cmluZzsiLCAodm9pZCAqKW5hdGl2ZV8xeDFfc3RyaW5nfSwKKyAgICB7Im5hdGl2ZV8xeDFfYmxvYl9hc2htZW0iLCAiKClMYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvcjsiLCAodm9pZCAqKW5hdGl2ZV8xeDFfYmxvYl9hc2htZW19LAogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlU3RhdGVtZW50KEpOSUVudiAqIGVudikKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfbmV0X05ldFV0aWxzLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfbmV0X05ldFV0aWxzLmNwcAppbmRleCA2NTc1YjlhLi4zNTFmMjY0IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX25ldF9OZXRVdGlscy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9uZXRfTmV0VXRpbHMuY3BwCkBAIC0yMjQsNyArMjI0LDggQEAKICAgICB7ICJhZGRSb3V0ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7SUxqYXZhL2xhbmcvU3RyaW5nOylJIiwKICAgICAgICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX2FkZFJvdXRlIH0sCiAgICAgeyAicmVtb3ZlSG9zdFJvdXRlcyIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19yZW1vdmVIb3N0Um91dGVzIH0sCi0gICAgeyAiZ2V0RGVmYXVsdFJvdXRlIiwgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX2dldERlZmF1bHRSb3V0ZSB9LAorICAgIHsgImdldERlZmF1bHRSb3V0ZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLAorICAgICAgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfZ2V0RGVmYXVsdFJvdXRlIH0sCiAgICAgeyAicmVtb3ZlRGVmYXVsdFJvdXRlIiwgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX3JlbW92ZURlZmF1bHRSb3V0ZSB9LAogICAgIHsgInJlc2V0Q29ubmVjdGlvbnMiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfcmVzZXRDb25uZWN0aW9ucyB9LAogICAgIHsgInJ1bkRoY3AiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL25ldC9EaGNwSW5mbzspWiIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX3J1bkRoY3AgfSwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfbmV0X3dpZmlfV2lmaS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX25ldF93aWZpX1dpZmkuY3BwCmluZGV4IDkwMzI4M2UuLmFlYzUzN2QgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfbmV0X3dpZmlfV2lmaS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9uZXRfd2lmaV9XaWZpLmNwcApAQCAtOTgsNiArOTgsMTEgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX25ldF93aWZpX2lzRHJpdmVyTG9hZGVkKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6KQoreworICAgIHJldHVybiAoamJvb2xlYW4pKDo6aXNfd2lmaV9kcml2ZXJfbG9hZGVkKCkgPT0gMSk7Cit9CisKIHN0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX25ldF93aWZpX2xvYWREcml2ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopCiB7CiAgICAgcmV0dXJuIChqYm9vbGVhbikoOjp3aWZpX2xvYWRfZHJpdmVyKCkgPT0gMCk7CkBAIC00OTMsMTUgKzQ5OCw2IEBACiAgICAgcmV0dXJuIGRvQm9vbGVhbkNvbW1hbmQoIkJMQUNLTElTVCBjbGVhciIsICJPSyIpOwogfQogCi1zdGF0aWMgamJvb2xlYW4gYW5kcm9pZF9uZXRfd2lmaV9zZXRTdXNwZW5kT3B0aW1pemF0aW9uc0NvbW1hbmQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGpib29sZWFuIGVuYWJsZWQpCi17Ci0gICAgY2hhciBjbWRzdHJbMjVdOwotCi0gICAgc25wcmludGYoY21kc3RyLCBzaXplb2YoY21kc3RyKSwgIkRSSVZFUiBTRVRTVVNQRU5EICVkIiwgZW5hYmxlZCA/IDAgOiAxKTsKLSAgICByZXR1cm4gZG9Cb29sZWFuQ29tbWFuZChjbWRzdHIsICJPSyIpOwotfQotCi0KIHN0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX25ldF93aWZpX2RvRGhjcFJlcXVlc3QoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGpvYmplY3QgaW5mbykKIHsKICAgICBqaW50IGlwYWRkciwgZ2F0ZXdheSwgbWFzaywgZG5zMSwgZG5zMiwgc2VydmVyLCBsZWFzZTsKQEAgLTUzMyw2ICs1MjksNyBAQAogICAgIC8qIG5hbWUsIHNpZ25hdHVyZSwgZnVuY1B0ciAqLwogCiAgICAgeyAibG9hZERyaXZlciIsICIoKVoiLCAgKHZvaWQgKilhbmRyb2lkX25ldF93aWZpX2xvYWREcml2ZXIgfSwKKyAgICB7ICJpc0RyaXZlckxvYWRlZCIsICIoKVoiLCAgKHZvaWQgKilhbmRyb2lkX25ldF93aWZpX2lzRHJpdmVyTG9hZGVkfSwKICAgICB7ICJ1bmxvYWREcml2ZXIiLCAiKClaIiwgICh2b2lkICopYW5kcm9pZF9uZXRfd2lmaV91bmxvYWREcml2ZXIgfSwKICAgICB7ICJzdGFydFN1cHBsaWNhbnQiLCAiKClaIiwgICh2b2lkICopYW5kcm9pZF9uZXRfd2lmaV9zdGFydFN1cHBsaWNhbnQgfSwKICAgICB7ICJzdG9wU3VwcGxpY2FudCIsICIoKVoiLCAgKHZvaWQgKilhbmRyb2lkX25ldF93aWZpX3N0b3BTdXBwbGljYW50IH0sCkBAIC01ODAsNyArNTc3LDYgQEAKICAgICB7ICJzZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kIiwgIihJKVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZCB9LAogICAgIHsgImFkZFRvQmxhY2tsaXN0Q29tbWFuZCIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfYWRkVG9CbGFja2xpc3RDb21tYW5kIH0sCiAgICAgeyAiY2xlYXJCbGFja2xpc3RDb21tYW5kIiwgIigpWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9jbGVhckJsYWNrbGlzdENvbW1hbmQgfSwKLSAgICB7ICJzZXRTdXNwZW5kT3B0aW1pemF0aW9uc0NvbW1hbmQiLCAiKFopWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9zZXRTdXNwZW5kT3B0aW1pemF0aW9uc0NvbW1hbmR9LAogCiAgICAgeyAiZG9EaGNwUmVxdWVzdCIsICIoTGFuZHJvaWQvbmV0L0RoY3BJbmZvOylaIiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX2RvRGhjcFJlcXVlc3QgfSwKICAgICB7ICJnZXREaGNwRXJyb3IiLCAiKClMamF2YS9sYW5nL1N0cmluZzsiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfZ2V0RGhjcEVycm9yIH0sCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX29zX0RlYnVnLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfb3NfRGVidWcuY3BwCmluZGV4IDNlZTQwNGEuLjRhODc3ZDIgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfb3NfRGVidWcuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfb3NfRGVidWcuY3BwCkBAIC0xNCw2ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjZGVmaW5lIExPR19UQUcgImFuZHJvaWQub3MuRGVidWciCiAjaW5jbHVkZSAiSk5JSGVscC5oIgogI2luY2x1ZGUgImpuaS5oIgogI2luY2x1ZGUgInV0aWxzL21pc2MuaCIKQEAgLTI0LDYgKzI1LDggQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgogCiAjaWZkZWYgSEFWRV9NQUxMT0NfSAogI2luY2x1ZGUgPG1hbGxvYy5oPgpAQCAtMjc0LDYgKzI3NywxNzYgQEAKIGppbnQgYW5kcm9pZF9vc19EZWJ1Z19nZXRQcm94eU9iamVjdENvdW50KEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6KTsKIGppbnQgYW5kcm9pZF9vc19EZWJ1Z19nZXREZWF0aE9iamVjdENvdW50KEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6KTsKIAorCisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisvKiBwdWxsZWQgb3V0IG9mIGJpb25pYyAqLworZXh0ZXJuICJDIiB2b2lkIGdldF9tYWxsb2NfbGVha19pbmZvKHVpbnQ4X3QqKiBpbmZvLCBzaXplX3QqIG92ZXJhbGxTaXplLAorICAgIHNpemVfdCogaW5mb1NpemUsIHNpemVfdCogdG90YWxNZW1vcnksIHNpemVfdCogYmFja3RyYWNlU2l6ZSk7CitleHRlcm4gIkMiIHZvaWQgZnJlZV9tYWxsb2NfbGVha19pbmZvKHVpbnQ4X3QqIGluZm8pOworI2RlZmluZSBTSVpFX0ZMQUdfWllHT1RFX0NISUxEICAoMTw8MzEpCisjZGVmaW5lIEJBQ0tUUkFDRV9TSVpFICAgICAgICAgIDMyCisKKy8qCisgKiBUaGlzIGlzIGEgcXNvcnQoKSBjYWxsYmFjay4KKyAqCisgKiBTZWUgZHVtcE5hdGl2ZUhlYXAoKSBmb3IgY29tbWVudHMgYWJvdXQgdGhlIGRhdGEgZm9ybWF0IGFuZCBzb3J0IG9yZGVyLgorICovCitzdGF0aWMgaW50IGNvbXBhcmVIZWFwUmVjb3Jkcyhjb25zdCB2b2lkKiB2cmVjMSwgY29uc3Qgdm9pZCogdnJlYzIpCit7CisgICAgY29uc3Qgc2l6ZV90KiByZWMxID0gKGNvbnN0IHNpemVfdCopIHZyZWMxOworICAgIGNvbnN0IHNpemVfdCogcmVjMiA9IChjb25zdCBzaXplX3QqKSB2cmVjMjsKKyAgICBzaXplX3Qgc2l6ZTEgPSAqcmVjMTsKKyAgICBzaXplX3Qgc2l6ZTIgPSAqcmVjMjsKKworICAgIGlmIChzaXplMSA8IHNpemUyKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSBpZiAoc2l6ZTEgPiBzaXplMikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaW50cHRyX3QqIGJ0MSA9IChpbnRwdHJfdCopKHJlYzEgKyAyKTsKKyAgICBpbnRwdHJfdCogYnQyID0gKGludHB0cl90KikocmVjMiArIDIpOworICAgIGZvciAoc2l6ZV90IGlkeCA9IDA7IGlkeCA8IEJBQ0tUUkFDRV9TSVpFOyBpZHgrKykgeworICAgICAgICBpbnRwdHJfdCBhZGRyMSA9IGJ0MVtpZHhdOworICAgICAgICBpbnRwdHJfdCBhZGRyMiA9IGJ0MltpZHhdOworICAgICAgICBpZiAoYWRkcjEgPT0gYWRkcjIpIHsKKyAgICAgICAgICAgIGlmIChhZGRyMSA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFkZHIxIDwgYWRkcjIpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIGlmIChhZGRyMSA+IGFkZHIyKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKgorICogVGhlIGdldF9tYWxsb2NfbGVha19pbmZvKCkgY2FsbCByZXR1cm5zIGFuIGFycmF5IG9mIHN0cnVjdHMgdGhhdAorICogbG9vayBsaWtlIHRoaXM6CisgKgorICogICBzaXplX3Qgc2l6ZQorICogICBzaXplX3QgYWxsb2NhdGlvbnMKKyAqICAgaW50cHRyX3QgYmFja3RyYWNlWzMyXQorICoKKyAqICJzaXplIiBpcyB0aGUgc2l6ZSBvZiB0aGUgYWxsb2NhdGlvbiwgImJhY2t0cmFjZSIgaXMgYSBmaXhlZC1zaXplCisgKiBhcnJheSBvZiBmdW5jdGlvbiBwb2ludGVycywgYW5kICJhbGxvY2F0aW9ucyIgaXMgdGhlIG51bWJlciBvZgorICogYWxsb2NhdGlvbnMgd2l0aCB0aGUgZXhhY3Qgc2FtZSBzaXplIGFuZCBiYWNrdHJhY2UuCisgKgorICogVGhlIGVudHJpZXMgYXJlIHNvcnRlZCBieSBkZXNjZW5kaW5nIHRvdGFsIHNpemUgKGkuZS4gc2l6ZSphbGxvY2F0aW9ucykKKyAqIHRoZW4gYWxsb2NhdGlvbiBjb3VudC4gIEZvciBiZXN0IHJlc3VsdHMgd2l0aCAiZGlmZiIgd2UnZCBsaWtlIHRvIHNvcnQKKyAqIHByaW1hcmlseSBieSBpbmRpdmlkdWFsIHNpemUgdGhlbiBzdGFjayB0cmFjZS4gIFNpbmNlIHRoZSBlbnRyaWVzIGFyZQorICogZml4ZWQtc2l6ZSwgYW5kIHdlJ3JlIGFsbG93ZWQgKGJ5IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uKSB0byBtYW5nbGUKKyAqIHRoZW0sIHdlIGNhbiBkbyB0aGlzIGluIHBsYWNlLgorICovCitzdGF0aWMgdm9pZCBkdW1wTmF0aXZlSGVhcChGSUxFKiBmcCkKK3sKKyAgICB1aW50OF90KiBpbmZvID0gTlVMTDsKKyAgICBzaXplX3Qgb3ZlcmFsbFNpemUsIGluZm9TaXplLCB0b3RhbE1lbW9yeSwgYmFja3RyYWNlU2l6ZTsKKworICAgIGdldF9tYWxsb2NfbGVha19pbmZvKCZpbmZvLCAmb3ZlcmFsbFNpemUsICZpbmZvU2l6ZSwgJnRvdGFsTWVtb3J5LAorICAgICAgICAmYmFja3RyYWNlU2l6ZSk7CisgICAgaWYgKGluZm8gPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKGZwLCAiTmF0aXZlIGhlYXAgZHVtcCBub3QgYXZhaWxhYmxlLiBUbyBlbmFibGUsIHJ1biB0aGVzZSIKKyAgICAgICAgICAgICAgICAgICAgIiBjb21tYW5kcyAocmVxdWlyZXMgcm9vdCk6XG4iKTsKKyAgICAgICAgZnByaW50ZihmcCwgIiQgYWRiIHNoZWxsIHNldHByb3AgbGliYy5kZWJ1Zy5tYWxsb2MgMVxuIik7CisgICAgICAgIGZwcmludGYoZnAsICIkIGFkYiBzaGVsbCBzdG9wXG4iKTsKKyAgICAgICAgZnByaW50ZihmcCwgIiQgYWRiIHNoZWxsIHN0YXJ0XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhc3NlcnQoaW5mb1NpemUgIT0gMCk7CisgICAgYXNzZXJ0KG92ZXJhbGxTaXplICUgaW5mb1NpemUgPT0gMCk7CisKKyAgICBmcHJpbnRmKGZwLCAiQW5kcm9pZCBOYXRpdmUgSGVhcCBEdW1wIHYxLjBcblxuIik7CisKKyAgICBzaXplX3QgcmVjb3JkQ291bnQgPSBvdmVyYWxsU2l6ZSAvIGluZm9TaXplOworICAgIGZwcmludGYoZnAsICJUb3RhbCBtZW1vcnk6ICV6dVxuIiwgdG90YWxNZW1vcnkpOworICAgIGZwcmludGYoZnAsICJBbGxvY2F0aW9uIHJlY29yZHM6ICV6ZFxuIiwgcmVjb3JkQ291bnQpOworICAgIGlmIChiYWNrdHJhY2VTaXplICE9IEJBQ0tUUkFDRV9TSVpFKSB7CisgICAgICAgIGZwcmludGYoZnAsICJXQVJOSU5HOiBtaXNtYXRjaGVkIGJhY2t0cmFjZSBzaXplcyAoJWQgdnMuICVkKVxuIiwKKyAgICAgICAgICAgIGJhY2t0cmFjZVNpemUsIEJBQ0tUUkFDRV9TSVpFKTsKKyAgICB9CisgICAgZnByaW50ZihmcCwgIlxuIik7CisKKyAgICAvKiByZS1zb3J0IHRoZSBlbnRyaWVzICovCisgICAgcXNvcnQoaW5mbywgcmVjb3JkQ291bnQsIGluZm9TaXplLCBjb21wYXJlSGVhcFJlY29yZHMpOworCisgICAgLyogZHVtcCB0aGUgZW50cmllcyB0byB0aGUgZmlsZSAqLworICAgIGNvbnN0IHVpbnQ4X3QqIHB0ciA9IGluZm87CisgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgcmVjb3JkQ291bnQ7IGlkeCsrKSB7CisgICAgICAgIHNpemVfdCBzaXplID0gKihzaXplX3QqKSBwdHI7CisgICAgICAgIHNpemVfdCBhbGxvY2F0aW9ucyA9ICooc2l6ZV90KikgKHB0ciArIHNpemVvZihzaXplX3QpKTsKKyAgICAgICAgaW50cHRyX3QqIGJhY2t0cmFjZSA9IChpbnRwdHJfdCopIChwdHIgKyBzaXplb2Yoc2l6ZV90KSAqIDIpOworCisgICAgICAgIGZwcmludGYoZnAsICJ6ICVkICBzeiAlOHp1ICBudW0gJTR6dSAgYnQiLAorICAgICAgICAgICAgICAgIChzaXplICYgU0laRV9GTEFHX1pZR09URV9DSElMRCkgIT0gMCwKKyAgICAgICAgICAgICAgICBzaXplICYgflNJWkVfRkxBR19aWUdPVEVfQ0hJTEQsCisgICAgICAgICAgICAgICAgYWxsb2NhdGlvbnMpOworICAgICAgICBmb3IgKHNpemVfdCBidCA9IDA7IGJ0IDwgYmFja3RyYWNlU2l6ZTsgYnQrKykgeworICAgICAgICAgICAgaWYgKGJhY2t0cmFjZVtidF0gPT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiICUwOHgiLCBiYWNrdHJhY2VbYnRdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKGZwLCAiXG4iKTsKKworICAgICAgICBwdHIgKz0gaW5mb1NpemU7CisgICAgfQorCisgICAgZnByaW50ZihmcCwgIkVORFxuIik7CisgICAgZnJlZV9tYWxsb2NfbGVha19pbmZvKGluZm8pOworfQorI2VuZGlmIC8qSEFWRV9BTkRST0lEX09TKi8KKworLyoKKyAqIER1bXAgdGhlIG5hdGl2ZSBoZWFwLCB3cml0aW5nIGh1bWFuLXJlYWRhYmxlIG91dHB1dCB0byB0aGUgc3BlY2lmaWVkCisgKiBmaWxlIGRlc2NyaXB0b3IuCisgKi8KK3N0YXRpYyB2b2lkIGFuZHJvaWRfb3NfRGVidWdfZHVtcE5hdGl2ZUhlYXAoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosCisgICAgam9iamVjdCBmaWxlRGVzY3JpcHRvcikKK3sKKyAgICBpZiAoZmlsZURlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgTlVMTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50IG9yaWdGZCA9IGpuaUdldEZERnJvbUZpbGVEZXNjcmlwdG9yKGVudiwgZmlsZURlc2NyaXB0b3IpOworICAgIGlmIChvcmlnRmQgPCAwKSB7CisgICAgICAgIGpuaVRocm93UnVudGltZUV4Y2VwdGlvbihlbnYsICJJbnZhbGlkIGZpbGUgZGVzY3JpcHRvciIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogZHVwKCkgdGhlIGRlc2NyaXB0b3Igc28gd2UgZG9uJ3QgY2xvc2UgdGhlIG9yaWdpbmFsIHdpdGggZmNsb3NlKCkgKi8KKyAgICBpbnQgZmQgPSBkdXAob3JpZ0ZkKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIExPR1coImR1cCglZCkgZmFpbGVkOiAlc1xuIiwgb3JpZ0ZkLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBqbmlUaHJvd1J1bnRpbWVFeGNlcHRpb24oZW52LCAiZHVwKCkgZmFpbGVkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBGSUxFKiBmcCA9IGZkb3BlbihmZCwgInciKTsKKyAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICBMT0dXKCJmZG9wZW4oJWQpIGZhaWxlZDogJXNcbiIsIGZkLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIGpuaVRocm93UnVudGltZUV4Y2VwdGlvbihlbnYsICJmZG9wZW4oKSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoIk5hdGl2ZSBoZWFwIGR1bXAgc3RhcnRpbmcuLi5cbiIpOworICAgIGR1bXBOYXRpdmVIZWFwKGZwKTsKKyAgICBMT0dEKCJOYXRpdmUgaGVhcCBkdW1wIGNvbXBsZXRlLlxuIik7CisjZWxzZQorICAgIGZwcmludGYoZnAsICJOYXRpdmUgaGVhcCBkdW1wIG5vdCBhdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybVxuIik7CisjZW5kaWYKKworICAgIGZjbG9zZShmcCk7Cit9CisKKwogLyoKICAqIEpOSSByZWdpc3RyYXRpb24uCiAgKi8KQEAgLTI4OSw2ICs0NjIsOCBAQAogICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX29zX0RlYnVnX2dldERpcnR5UGFnZXMgfSwKICAgICB7ICJnZXRNZW1vcnlJbmZvIiwgICAgICAgICAgIihJTGFuZHJvaWQvb3MvRGVidWckTWVtb3J5SW5mbzspViIsCiAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfb3NfRGVidWdfZ2V0RGlydHlQYWdlc1BpZCB9LAorICAgIHsgImR1bXBOYXRpdmVIZWFwIiwgICAgICAgICAiKExqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOylWIiwKKyAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9vc19EZWJ1Z19kdW1wTmF0aXZlSGVhcCB9LAogICAgIHsgImdldEJpbmRlclNlbnRUcmFuc2FjdGlvbnMiLCAiKClJIiwKICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9vc19EZWJ1Z19nZXRCaW5kZXJTZW50VHJhbnNhY3Rpb25zIH0sCiAgICAgeyAiZ2V0QmluZGVyUmVjZWl2ZWRUcmFuc2FjdGlvbnMiLCAiKClJIiwKQEAgLTMyMCw0ICs0OTUsNCBAQAogICAgIHJldHVybiBqbmlSZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LCAiYW5kcm9pZC9vcy9EZWJ1ZyIsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOwogfQogCi19OworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfb3NfRmlsZVV0aWxzLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfb3NfRmlsZVV0aWxzLmNwcAppbmRleCAyMWNiOTE5Li5kM2ZhYTJmIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX29zX0ZpbGVVdGlscy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9vc19GaWxlVXRpbHMuY3BwCkBAIC0xMTMsNiArMTEzLDExIEBACiAgICAgI2VuZGlmCiB9CiAKK2ppbnQgYW5kcm9pZF9vc19GaWxlVXRpbHNfc2V0VU1hc2soSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGppbnQgbWFzaykKK3sKKyAgICByZXR1cm4gdW1hc2sobWFzayk7Cit9CisKIGppbnQgYW5kcm9pZF9vc19GaWxlVXRpbHNfZ2V0RmF0Vm9sdW1lSWQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGpzdHJpbmcgcGF0aCkKIHsKICAgICAjaWYgSEFWRV9BTkRST0lEX09TCkBAIC0xNzAsNiArMTc1LDcgQEAKIHN0YXRpYyBjb25zdCBKTklOYXRpdmVNZXRob2QgbWV0aG9kc1tdID0gewogICAgIHsic2V0UGVybWlzc2lvbnMiLCAgIihMamF2YS9sYW5nL1N0cmluZztJSUkpSSIsICh2b2lkKilhbmRyb2lkX29zX0ZpbGVVdGlsc19zZXRQZXJtaXNzaW9uc30sCiAgICAgeyJnZXRQZXJtaXNzaW9ucyIsICAiKExqYXZhL2xhbmcvU3RyaW5nO1tJKUkiLCAodm9pZCopYW5kcm9pZF9vc19GaWxlVXRpbHNfZ2V0UGVybWlzc2lvbnN9LAorICAgIHsic2V0VU1hc2siLCAgICAgICAgIihJKUkiLCAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfb3NfRmlsZVV0aWxzX3NldFVNYXNrfSwKICAgICB7ImdldEZhdFZvbHVtZUlkIiwgICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAodm9pZCopYW5kcm9pZF9vc19GaWxlVXRpbHNfZ2V0RmF0Vm9sdW1lSWR9LAogICAgIHsiZ2V0RmlsZVN0YXR1cyIsICAiKExqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL29zL0ZpbGVVdGlscyRGaWxlU3RhdHVzOylaIiwgKHZvaWQqKWFuZHJvaWRfb3NfRmlsZVV0aWxzX2dldEZpbGVTdGF0dXN9LAogfTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfb3NfUGFyY2VsRmlsZURlc2NyaXB0b3IuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9vc19QYXJjZWxGaWxlRGVzY3JpcHRvci5jcHAKaW5kZXggODQ4YTU3YS4uZWNlZWYxYyAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9vc19QYXJjZWxGaWxlRGVzY3JpcHRvci5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9vc19QYXJjZWxGaWxlRGVzY3JpcHRvci5jcHAKQEAgLTY2LDYgKzY2LDI2IEBACiAgICAgcmV0dXJuIGZpbGVEZXNjcmlwdG9yQ2xvbmU7CiB9CiAKK3N0YXRpYyBpbnQgYW5kcm9pZF9vc19QYXJjZWxGaWxlRGVzY3JpcHRvcl9jcmVhdGVQaXBlTmF0aXZlKEpOSUVudiogZW52LAorICAgIGpvYmplY3QgY2xhenosIGpvYmplY3RBcnJheSBvdXRGZHMpCit7CisgICAgaW50IGZkc1syXTsKKyAgICBpZiAocGlwZShmZHMpIDwgMCkgeworICAgICAgICByZXR1cm4gLWVycm5vOworICAgIH0KKworICAgIGZvciAoaW50IGk9MDsgaTwyOyBpKyspIHsKKyAgICAgICAgam9iamVjdCBmZE9iaiA9IGVudi0+TmV3T2JqZWN0KGdGaWxlRGVzY3JpcHRvck9mZnNldHMubUNsYXNzLAorICAgICAgICAgICAgICAgIGdGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yKTsKKyAgICAgICAgaWYgKGZkT2JqICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGVudi0+U2V0SW50RmllbGQoZmRPYmosIGdGaWxlRGVzY3JpcHRvck9mZnNldHMubURlc2NyaXB0b3IsIGZkc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQob3V0RmRzLCBpLCBmZE9iaik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBqaW50IGdldEZkKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6KQogewogICAgIGpvYmplY3QgZGVzY3JpcHRvciA9IGVudi0+R2V0T2JqZWN0RmllbGQoY2xhenosIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUZpbGVEZXNjcmlwdG9yKTsKQEAgLTEwOSw2ICsxMjksOCBAQAogc3RhdGljIGNvbnN0IEpOSU5hdGl2ZU1ldGhvZCBnUGFyY2VsRmlsZURlc2NyaXB0b3JNZXRob2RzW10gPSB7CiAgICAgeyJnZXRGaWxlRGVzY3JpcHRvckZyb21Tb2NrZXQiLCAiKExqYXZhL25ldC9Tb2NrZXQ7KUxqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOyIsCiAgICAgICAgICh2b2lkKilhbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yX2dldEZpbGVEZXNjcmlwdG9yRnJvbVNvY2tldH0sCisgICAgeyJjcmVhdGVQaXBlTmF0aXZlIiwgIihbTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7KUkiLAorICAgICAgICAodm9pZCopYW5kcm9pZF9vc19QYXJjZWxGaWxlRGVzY3JpcHRvcl9jcmVhdGVQaXBlTmF0aXZlfSwKICAgICB7ImdldFN0YXRTaXplIiwgIigpSiIsCiAgICAgICAgICh2b2lkKilhbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yX2dldFN0YXRTaXplfSwKICAgICB7InNlZWtUbyIsICIoSilKIiwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhFdmVudExvb3AuY3BwCmluZGV4IDAxYjY3MTEuLjZlZjE1NGUgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wLmNwcApAQCAtNjQsNiArNjQsMTEgQEAKIHN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQWdlbnRBdXRob3JpemU7CiBzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkFnZW50Q2FuY2VsOwogCitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbklucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2VkOworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQ7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vblBhbkRldmljZVByb3BlcnR5Q2hhbmdlZDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdDsKKwogdHlwZWRlZiBldmVudF9sb29wX25hdGl2ZV9kYXRhX3QgbmF0aXZlX2RhdGFfdDsKIAogI2RlZmluZSBFVkVOVF9MT09QX1JFRlMgMTAKQEAgLTExNiw2ICsxMjEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztJKVYiKTsKICAgICBtZXRob2Rfb25EaXNwbGF5UGFzc2tleSA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbkRpc3BsYXlQYXNza2V5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztJSSlWIik7CisgICAgbWV0aG9kX29uSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvU3RyaW5nOylWIik7CisgICAgbWV0aG9kX29uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztaKVYiKTsKKyAgICBtZXRob2Rfb25QYW5EZXZpY2VQcm9wZXJ0eUNoYW5nZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25QYW5EZXZpY2VQcm9wZXJ0eUNoYW5nZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL1N0cmluZzspViIpOworICAgIG1ldGhvZF9vblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25QYW5EZXZpY2VDb25uZWN0aW9uUmVzdWx0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztaKVYiKTsKIAogICAgIGZpZWxkX21OYXRpdmVEYXRhID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCAibU5hdGl2ZURhdGEiLCAiSSIpOwogI2VuZGlmCkBAIC0yMjYsNiArMjM5LDIwIEBACiAgICAgICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGRidXNfYnVzX2FkZF9tYXRjaChuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgInR5cGU9J3NpZ25hbCcsaW50ZXJmYWNlPSciQkxVRVpfREJVU19CQVNFX0lGQyIuSW5wdXQnIiwKKyAgICAgICAgICAgICAgICAmZXJyKTsKKyAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CisgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBKTklfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZGJ1c19idXNfYWRkX21hdGNoKG5hdC0+Y29ubiwKKyAgICAgICAgICAgICAgICAidHlwZT0nc2lnbmFsJyxpbnRlcmZhY2U9JyJCTFVFWl9EQlVTX0JBU0VfSUZDIi5OZXR3b3JrJyIsCisgICAgICAgICAgICAgICAgJmVycik7CisgICAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldCgmZXJyKSkgeworICAgICAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1IoJmVycik7CisgICAgICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGRidXNfYnVzX2FkZF9tYXRjaChuYXQtPmNvbm4sCiAgICAgICAgICAgICAgICAgInR5cGU9J3NpZ25hbCcsaW50ZXJmYWNlPSdvcmcuYmx1ZXouQXVkaW9TaW5rJyIsCiAgICAgICAgICAgICAgICAgJmVycik7CiAgICAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldCgmZXJyKSkgewpAQCAtODUzLDcgKzg4MCwzOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9vbkRldmljZURpc2Nvbm5lY3RSZXF1ZXN0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5OZXdTdHJpbmdVVEYocmVtb3RlX2RldmljZV9wYXRoKSk7CiAgICAgICAgIGdvdG8gc3VjY2VzczsKLSAgICB9CisgICAgfSBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsKG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5ibHVlei5JbnB1dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9wZXJ0eUNoYW5nZWQiKSkgeworCisgICAgICAgIGpvYmplY3RBcnJheSBzdHJfYXJyYXkgPQorICAgICAgICAgICAgICAgICAgICBwYXJzZV9pbnB1dF9wcm9wZXJ0eV9jaGFuZ2UoZW52LCBtc2cpOworICAgICAgICBpZiAoc3RyX2FycmF5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNfcGF0aCA9IGRidXNfbWVzc2FnZV9nZXRfcGF0aChtc2cpOworICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5OZXdTdHJpbmdVVEYoY19wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2FycmF5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SX1dJVEhfTVNHKCZlcnIsIG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgZ290byBzdWNjZXNzOworICAgIH0gZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5ibHVlei5OZXR3b3JrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvcGVydHlDaGFuZ2VkIikpIHsKKworICAgICAgIGpvYmplY3RBcnJheSBzdHJfYXJyYXkgPQorICAgICAgICAgICAgICAgICAgIHBhcnNlX3Bhbl9wcm9wZXJ0eV9jaGFuZ2UoZW52LCBtc2cpOworICAgICAgIGlmIChzdHJfYXJyYXkgIT0gTlVMTCkgeworICAgICAgICAgICBjb25zdCBjaGFyICpjX3BhdGggPSBkYnVzX21lc3NhZ2VfZ2V0X3BhdGgobXNnKTsKKyAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9vblBhbkRldmljZVByb3BlcnR5Q2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPk5ld1N0cmluZ1VURihjX3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9hcnJheSk7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1JfV0lUSF9NU0coJmVyciwgbXNnKTsKKyAgICAgICB9CisgICAgICAgZ290byBzdWNjZXNzOworICAgfQogCiAgICAgcmV0ID0gYTJkcF9ldmVudF9maWx0ZXIobXNnLCBlbnYpOwogICAgIGVudi0+UG9wTG9jYWxGcmFtZShOVUxMKTsKQEAgLTEyMTAsNiArMTI2OSw1NyBAQAogICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoYWRkcik7CiAgICAgZnJlZSh1c2VyKTsKIH0KKwordm9pZCBvbklucHV0RGV2aWNlQ29ubmVjdGlvblJlc3VsdChEQnVzTWVzc2FnZSAqbXNnLCB2b2lkICp1c2VyLCB2b2lkICpuKSB7CisgICAgTE9HVihfX0ZVTkNUSU9OX18pOworCisgICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gKG5hdGl2ZV9kYXRhX3QgKiluOworICAgIGNvbnN0IGNoYXIgKnBhdGggPSAoY29uc3QgY2hhciAqKXVzZXI7CisgICAgREJ1c0Vycm9yIGVycjsKKyAgICBkYnVzX2Vycm9yX2luaXQoJmVycik7CisgICAgSk5JRW52ICplbnY7CisgICAgbmF0LT52bS0+R2V0RW52KCh2b2lkKiopJmVudiwgbmF0LT5lbnZWZXIpOworCisgICAgYm9vbCByZXN1bHQgPSBKTklfVFJVRTsKKyAgICBpZiAoZGJ1c19zZXRfZXJyb3JfZnJvbV9tZXNzYWdlKCZlcnIsIG1zZykpIHsKKyAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1IoJmVycik7CisgICAgICAgIHJlc3VsdCA9IEpOSV9GQUxTRTsKKyAgICB9CisgICAgTE9HVigiLi4uIERldmljZSBQYXRoID0gJXMsIHJlc3VsdCA9ICVkIiwgcGF0aCwgcmVzdWx0KTsKKyAgICBqc3RyaW5nIGpQYXRoID0gZW52LT5OZXdTdHJpbmdVVEYocGF0aCk7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX29uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgalBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoalBhdGgpOworICAgIGZyZWUodXNlcik7Cit9CisKK3ZvaWQgb25QYW5EZXZpY2VDb25uZWN0aW9uUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm4pIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisKKyAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSAobmF0aXZlX2RhdGFfdCAqKW47CisgICAgY29uc3QgY2hhciAqcGF0aCA9IChjb25zdCBjaGFyICopdXNlcjsKKyAgICBEQnVzRXJyb3IgZXJyOworICAgIGRidXNfZXJyb3JfaW5pdCgmZXJyKTsKKyAgICBKTklFbnYgKmVudjsKKyAgICBuYXQtPnZtLT5HZXRFbnYoKHZvaWQqKikmZW52LCBuYXQtPmVudlZlcik7CisKKyAgICBib29sIHJlc3VsdCA9IEpOSV9UUlVFOworICAgIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UoJmVyciwgbXNnKSkgeworICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgcmVzdWx0ID0gSk5JX0ZBTFNFOworICAgIH0KKyAgICBMT0dWKCIuLi4gUGFuIERldmljZSBQYXRoID0gJXMsIHJlc3VsdCA9ICVkIiwgcGF0aCwgcmVzdWx0KTsKKyAgICBqc3RyaW5nIGpQYXRoID0gZW52LT5OZXdTdHJpbmdVVEYocGF0aCk7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX29uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGpQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGpQYXRoKTsKKyAgICBmcmVlKHVzZXIpOworfQorCiAjZW5kaWYKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBzTWV0aG9kc1tdID0gewpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoU2VydmljZS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlLmNwcAppbmRleCA0NDIwYWNhLi43NDEyN2NmIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlLmNwcApAQCAtMTYsNiArMTYsMTEgQEAKIAogI2RlZmluZSBEQlVTX0FEQVBURVJfSUZBQ0UgQkxVRVpfREJVU19CQVNFX0lGQyAiLkFkYXB0ZXIiCiAjZGVmaW5lIERCVVNfREVWSUNFX0lGQUNFIEJMVUVaX0RCVVNfQkFTRV9JRkMgIi5EZXZpY2UiCisjZGVmaW5lIERCVVNfSU5QVVRfSUZBQ0UgQkxVRVpfREJVU19CQVNFX0lGQyAiLklucHV0IgorI2RlZmluZSBEQlVTX05FVFdPUktfSUZBQ0UgQkxVRVpfREJVU19CQVNFX0lGQyAiLk5ldHdvcmsiCisjZGVmaW5lIERCVVNfTkVUV09SS1NFUlZFUl9JRkFDRSBCTFVFWl9EQlVTX0JBU0VfSUZDICIuTmV0d29ya1NlcnZlciIKKworCiAjZGVmaW5lIExPR19UQUcgIkJsdWV0b290aFNlcnZpY2UuY3BwIgogCiAjaW5jbHVkZSAiYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmgiCkBAIC02OCw2ICs3Myw5IEBACiB2b2lkIG9uQ3JlYXRlUGFpcmVkRGV2aWNlUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm5hdCk7CiB2b2lkIG9uRGlzY292ZXJTZXJ2aWNlc1Jlc3VsdChEQnVzTWVzc2FnZSAqbXNnLCB2b2lkICp1c2VyLCB2b2lkICpuYXQpOwogdm9pZCBvbkNyZWF0ZURldmljZVJlc3VsdChEQnVzTWVzc2FnZSAqbXNnLCB2b2lkICp1c2VyLCB2b2lkICpuYXQpOwordm9pZCBvbklucHV0RGV2aWNlQ29ubmVjdGlvblJlc3VsdChEQnVzTWVzc2FnZSAqbXNnLCB2b2lkICp1c2VyLCB2b2lkICpuYXQpOwordm9pZCBvbkNvbm5lY3RQYW5SZXN1bHQoREJ1c01lc3NhZ2UgKm1zZywgdm9pZCAqdXNlciwgdm9pZCAqbik7Cit2b2lkIG9uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdChEQnVzTWVzc2FnZSAqbXNnLCB2b2lkICp1c2VyLCB2b2lkICpuYXQpOwogCiAKIC8qKiBHZXQgbmF0aXZlIGRhdGEgc3RvcmVkIGluIHRoZSBvcGFxdWUgKEphdmEgY29kZSBtYWludGFpbmVkKSBwb2ludGVyIG1OYXRpdmVEYXRhCkBAIC04ODEsNiArODg5LDE2MCBAQAogICAgIHJldHVybiBKTklfRkFMU0U7CiB9CiAKK3N0YXRpYyBqYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIHBhdGgpIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisjaWZkZWYgSEFWRV9CTFVFVE9PVEgKKyAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOworICAgIGpvYmplY3QgZXZlbnRMb29wID0gZW52LT5HZXRPYmplY3RGaWVsZChvYmplY3QsIGZpZWxkX21FdmVudExvb3ApOworICAgIHN0cnVjdCBldmVudF9sb29wX25hdGl2ZV9kYXRhX3QgKmV2ZW50TG9vcE5hdCA9CisgICAgICAgICAgICBnZXRfRXZlbnRMb29wX25hdGl2ZV9kYXRhKGVudiwgZXZlbnRMb29wKTsKKworICAgIGlmIChuYXQgJiYgZXZlbnRMb29wTmF0KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNfcGF0aCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMocGF0aCwgTlVMTCk7CisKKyAgICAgICAgaW50IGxlbiA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHBhdGgpICsgMTsKKyAgICAgICAgY2hhciAqY29udGV4dF9wYXRoID0gKGNoYXIgKiljYWxsb2MobGVuLCBzaXplb2YoY2hhcikpOworICAgICAgICBzdHJsY3B5KGNvbnRleHRfcGF0aCwgY19wYXRoLCBsZW4pOyAgLy8gZm9yIGNhbGxiYWNrCisKKyAgICAgICAgYm9vbCByZXQgPSBkYnVzX2Z1bmNfYXJnc19hc3luYyhlbnYsIG5hdC0+Y29ubiwgLTEsIG9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfcGF0aCwgZXZlbnRMb29wTmF0LCBjX3BhdGgsIERCVVNfSU5QVVRfSUZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhwYXRoLCBjX3BhdGgpOworICAgICAgICByZXR1cm4gcmV0ID8gSk5JX1RSVUUgOiBKTklfRkFMU0U7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIEpOSV9GQUxTRTsKK30KKworc3RhdGljIGpib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBwYXRoKSB7CisgICAgTE9HVihfX0ZVTkNUSU9OX18pOworI2lmZGVmIEhBVkVfQkxVRVRPT1RICisgICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gZ2V0X25hdGl2ZV9kYXRhKGVudiwgb2JqZWN0KTsKKyAgICBqb2JqZWN0IGV2ZW50TG9vcCA9IGVudi0+R2V0T2JqZWN0RmllbGQob2JqZWN0LCBmaWVsZF9tRXZlbnRMb29wKTsKKyAgICBzdHJ1Y3QgZXZlbnRfbG9vcF9uYXRpdmVfZGF0YV90ICpldmVudExvb3BOYXQgPQorICAgICAgICAgICAgZ2V0X0V2ZW50TG9vcF9uYXRpdmVfZGF0YShlbnYsIGV2ZW50TG9vcCk7CisKKyAgICBpZiAobmF0ICYmIGV2ZW50TG9vcE5hdCkgeworICAgICAgICBjb25zdCBjaGFyICpjX3BhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHBhdGgsIE5VTEwpOworCisgICAgICAgIGludCBsZW4gPSBlbnYtPkdldFN0cmluZ0xlbmd0aChwYXRoKSArIDE7CisgICAgICAgIGNoYXIgKmNvbnRleHRfcGF0aCA9IChjaGFyICopY2FsbG9jKGxlbiwgc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgc3RybGNweShjb250ZXh0X3BhdGgsIGNfcGF0aCwgbGVuKTsgIC8vIGZvciBjYWxsYmFjaworCisgICAgICAgIGJvb2wgcmV0ID0gZGJ1c19mdW5jX2FyZ3NfYXN5bmMoZW52LCBuYXQtPmNvbm4sIC0xLCBvbklucHV0RGV2aWNlQ29ubmVjdGlvblJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X3BhdGgsIGV2ZW50TG9vcE5hdCwgY19wYXRoLCBEQlVTX0lOUFVUX0lGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMocGF0aCwgY19wYXRoKTsKKyAgICAgICAgcmV0dXJuIHJldCA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBKTklfRkFMU0U7Cit9CisKK3N0YXRpYyBqYm9vbGVhbiBzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0LCBqYm9vbGVhbiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBzcmNfcm9sZSwganN0cmluZyBicmlkZ2UpIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisjaWZkZWYgSEFWRV9CTFVFVE9PVEgKKyAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOworICAgIGlmIChuYXQpIHsKKyAgICAgICAgREJ1c01lc3NhZ2UgKnJlcGx5OworICAgICAgICBjb25zdCBjaGFyICpjX3JvbGUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHNyY19yb2xlLCBOVUxMKTsKKyAgICAgICAgY29uc3QgY2hhciAqY19icmlkZ2UgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGJyaWRnZSwgTlVMTCk7CisgICAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICAgICAgTE9HRSgic2V0Qmx1ZXRvb3RoVGV0aGVyaW5nTmF0aXZlIHRydWUiKTsKKyAgICAgICAgICAgIHJlcGx5ID0gZGJ1c19mdW5jX2FyZ3MoZW52LCBuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2FkYXB0ZXJfcGF0aChlbnYsIG9iamVjdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19ORVRXT1JLU0VSVkVSX0lGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpc3RlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmNfcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmY19icmlkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgic2V0Qmx1ZXRvb3RoVGV0aGVyaW5nTmF0aXZlIGZhbHNlIik7CisgICAgICAgICAgICByZXBseSA9IGRidXNfZnVuY19hcmdzKGVudiwgbmF0LT5jb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9hZGFwdGVyX3BhdGgoZW52LCBvYmplY3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTkVUV09SS1NFUlZFUl9JRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWdpc3RlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmNfcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisgICAgICAgIH0KKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoc3JjX3JvbGUsIGNfcm9sZSk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGJyaWRnZSwgY19icmlkZ2UpOworICAgICAgICByZXR1cm4gcmVwbHkgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gSk5JX0ZBTFNFOworfQorCitzdGF0aWMgamJvb2xlYW4gY29ubmVjdFBhbkRldmljZU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzdHJpbmcgc3JjUm9sZSwganN0cmluZyBkc3RSb2xlKSB7CisgICAgTE9HVihfX0ZVTkNUSU9OX18pOworI2lmZGVmIEhBVkVfQkxVRVRPT1RICisgICAgTE9HRSgiY29ubmVjdFBhbkRldmljZU5hdGl2ZSIpOworICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7CisgICAgam9iamVjdCBldmVudExvb3AgPSBlbnYtPkdldE9iamVjdEZpZWxkKG9iamVjdCwgZmllbGRfbUV2ZW50TG9vcCk7CisgICAgc3RydWN0IGV2ZW50X2xvb3BfbmF0aXZlX2RhdGFfdCAqZXZlbnRMb29wTmF0ID0KKyAgICAgICAgICAgIGdldF9FdmVudExvb3BfbmF0aXZlX2RhdGEoZW52LCBldmVudExvb3ApOworCisgICAgaWYgKG5hdCAmJiBldmVudExvb3BOYXQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqY19wYXRoID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhwYXRoLCBOVUxMKTsKKyAgICAgICAgY29uc3QgY2hhciAqc3JjID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzcmNSb2xlLCBOVUxMKTsKKyAgICAgICAgY29uc3QgY2hhciAqZHN0ID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhkc3RSb2xlLCBOVUxMKTsKKworICAgICAgICBpbnQgbGVuID0gZW52LT5HZXRTdHJpbmdMZW5ndGgocGF0aCkgKyAxOworICAgICAgICBjaGFyICpjb250ZXh0X3BhdGggPSAoY2hhciAqKWNhbGxvYyhsZW4sIHNpemVvZihjaGFyKSk7CisgICAgICAgIHN0cmxjcHkoY29udGV4dF9wYXRoLCBjX3BhdGgsIGxlbik7ICAvLyBmb3IgY2FsbGJhY2sKKworICAgICAgICBib29sIHJldCA9IGRidXNfZnVuY19hcmdzX2FzeW5jKGVudiwgbmF0LT5jb25uLCAtMSxvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X3BhdGgsIGV2ZW50TG9vcE5hdCwgY19wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19ORVRXT1JLX0lGQUNFLCAiQ29ubmVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhwYXRoLCBjX3BhdGgpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzcmNSb2xlLCBzcmMpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhkc3RSb2xlLCBkc3QpOworICAgICAgICByZXR1cm4gcmV0ID8gSk5JX1RSVUUgOiBKTklfRkFMU0U7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIEpOSV9GQUxTRTsKK30KKworc3RhdGljIGpib29sZWFuIGRpc2Nvbm5lY3RQYW5EZXZpY2VOYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzdHJpbmcgcGF0aCkgeworICAgIExPR1YoX19GVU5DVElPTl9fKTsKKyNpZmRlZiBIQVZFX0JMVUVUT09USAorICAgIExPR0UoImRpc2Nvbm5lY3RQYW5EZXZpY2VOYXRpdmUiKTsKKyAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOworICAgIGpvYmplY3QgZXZlbnRMb29wID0gZW52LT5HZXRPYmplY3RGaWVsZChvYmplY3QsIGZpZWxkX21FdmVudExvb3ApOworICAgIHN0cnVjdCBldmVudF9sb29wX25hdGl2ZV9kYXRhX3QgKmV2ZW50TG9vcE5hdCA9CisgICAgICAgICAgICBnZXRfRXZlbnRMb29wX25hdGl2ZV9kYXRhKGVudiwgZXZlbnRMb29wKTsKKworICAgIGlmIChuYXQgJiYgZXZlbnRMb29wTmF0KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNfcGF0aCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMocGF0aCwgTlVMTCk7CisKKyAgICAgICAgaW50IGxlbiA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHBhdGgpICsgMTsKKyAgICAgICAgY2hhciAqY29udGV4dF9wYXRoID0gKGNoYXIgKiljYWxsb2MobGVuLCBzaXplb2YoY2hhcikpOworICAgICAgICBzdHJsY3B5KGNvbnRleHRfcGF0aCwgY19wYXRoLCBsZW4pOyAgLy8gZm9yIGNhbGxiYWNrCisKKyAgICAgICAgYm9vbCByZXQgPSBkYnVzX2Z1bmNfYXJnc19hc3luYyhlbnYsIG5hdC0+Y29ubiwgLTEsb25QYW5EZXZpY2VDb25uZWN0aW9uUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfcGF0aCwgZXZlbnRMb29wTmF0LCBjX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19ORVRXT1JLX0lGQUNFLCAiRGlzY29ubmVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworCisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHBhdGgsIGNfcGF0aCk7CisgICAgICAgIHJldHVybiByZXQgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gSk5JX0ZBTFNFOworfQorCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPSB7CiAgICAgIC8qIG5hbWUsIHNpZ25hdHVyZSwgZnVuY1B0ciAqLwogICAgIHsiY2xhc3NJbml0TmF0aXZlIiwgIigpViIsICh2b2lkKiljbGFzc0luaXROYXRpdmV9LApAQCAtOTI2LDggKzEwODgsMTggQEAKICAgICB7ImFkZFJmY29tbVNlcnZpY2VSZWNvcmROYXRpdmUiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0pKUylJIiwgKHZvaWQgKilhZGRSZmNvbW1TZXJ2aWNlUmVjb3JkTmF0aXZlfSwKICAgICB7InJlbW92ZVNlcnZpY2VSZWNvcmROYXRpdmUiLCAiKEkpWiIsICh2b2lkICopcmVtb3ZlU2VydmljZVJlY29yZE5hdGl2ZX0sCiAgICAgeyJzZXRMaW5rVGltZW91dE5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7SSlaIiwgKHZvaWQgKilzZXRMaW5rVGltZW91dE5hdGl2ZX0sCisgICAgLy8gSElEIGZ1bmN0aW9ucworICAgIHsiY29ubmVjdElucHV0RGV2aWNlTmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZzspWiIsICh2b2lkICopY29ubmVjdElucHV0RGV2aWNlTmF0aXZlfSwKKyAgICB7ImRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCAqKWRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZX0sCisKKyAgICB7InNldEJsdWV0b290aFRldGhlcmluZ05hdGl2ZSIsICIoWkxqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylaIiwKKyAgICAgICAgICAgICAgKHZvaWQgKilzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmV9LAorICAgIHsiY29ubmVjdFBhbkRldmljZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVoiLAorICAgICAgICAgICAgICAodm9pZCAqKWNvbm5lY3RQYW5EZXZpY2VOYXRpdmV9LAorICAgIHsiZGlzY29ubmVjdFBhbkRldmljZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCAqKWRpc2Nvbm5lY3RQYW5EZXZpY2VOYXRpdmV9LAogfTsKIAorCiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoU2VydmljZShKTklFbnYgKmVudikgewogICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwKICAgICAgICAgICAgICAgICAiYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoU2VydmljZSIsIHNNZXRob2RzLCBORUxFTShzTWV0aG9kcykpOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTcxNzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcy5jcHAKQEAgLTAsMCArMSw0NTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL0pOSUhlbHAuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDx1dGlscy9SZXNvdXJjZVR5cGVzLmg+CisKKyNpbmNsdWRlIDxTa0JpdG1hcC5oPgorI2luY2x1ZGUgPFNrQ2FudmFzLmg+CisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisjaW5jbHVkZSA8U2tSZWdpb24uaD4KKyNpbmNsdWRlIDxTa1NjYWxlckNvbnRleHQuaD4KKyNpbmNsdWRlIDxTa1RlbXBsYXRlcy5oPgorI2luY2x1ZGUgPFNrWGZlcm1vZGUuaD4KKworI2luY2x1ZGUgPE9wZW5HTFJlbmRlcmVyLmg+CisjaW5jbHVkZSA8U2tpYVNoYWRlci5oPgorI2luY2x1ZGUgPFNraWFDb2xvckZpbHRlci5oPgorI2luY2x1ZGUgPFJlY3QuaD4KKworI2luY2x1ZGUgIlRleHRMYXlvdXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBuYW1lc3BhY2UgdWlyZW5kZXJlcjsKKworLyoqCisgKiBOb3RlOiBPcGVuR0xSZW5kZXJlciBKTkkgbGF5ZXIgaXMgZ2VuZXJhdGVkIGFuZCBjb21waWxlZCBvbmx5IG9uIHN1cHBvcnRlZAorICogICAgICAgZGV2aWNlcy4gVGhpcyBtZWFucyBhbGwgdGhlIGxvZ2ljIG11c3QgYmUgY29tcGlsZWQgb25seSB3aGVuIHRoZQorICogICAgICAgcHJlcHJvY2Vzc29yIHZhcmlhYmxlIFVTRV9PUEVOR0xfUkVOREVSRVIgaXMgZGVmaW5lZC4KKyAqLworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSmF2YSBBUElzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGpjbGFzcyBjbGF6ejsKKyAgICBqbWV0aG9kSUQgc2V0OworfSBnUmVjdENsYXNzSW5mbzsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29uc3RydWN0b3JzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBPcGVuR0xSZW5kZXJlciogYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jcmVhdGVSZW5kZXJlcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMpIHsKKyAgICByZXR1cm4gbmV3IE9wZW5HTFJlbmRlcmVyOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2Rlc3Ryb3lSZW5kZXJlcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIGRlbGV0ZSByZW5kZXJlcjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2V0dXAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXRWaWV3cG9ydChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamludCB3aWR0aCwgamludCBoZWlnaHQpIHsKKyAgICByZW5kZXJlci0+c2V0Vmlld3BvcnQod2lkdGgsIGhlaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcHJlcGFyZShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJlbmRlcmVyLT5wcmVwYXJlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfYWNxdWlyZUNvbnRleHQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIpIHsKKyAgICByZW5kZXJlci0+YWNxdWlyZUNvbnRleHQoKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19yZWxlYXNlQ29udGV4dChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJlbmRlcmVyLT5yZWxlYXNlQ29udGV4dCgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdGF0ZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgamludCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NhdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLCBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsCisgICAgICAgIGppbnQgZmxhZ3MpIHsKKyAgICByZXR1cm4gcmVuZGVyZXItPnNhdmUoZmxhZ3MpOworfQorCitzdGF0aWMgamludCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldFNhdmVDb3VudChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJldHVybiByZW5kZXJlci0+Z2V0U2F2ZUNvdW50KCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzdG9yZShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJlbmRlcmVyLT5yZXN0b3JlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzdG9yZVRvQ291bnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGppbnQgc2F2ZUNvdW50KSB7CisgICAgcmVuZGVyZXItPnJlc3RvcmVUb0NvdW50KHNhdmVDb3VudCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExheWVycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgamludCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NhdmVMYXllcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgU2tQYWludCogcGFpbnQsIGppbnQgc2F2ZUZsYWdzKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5zYXZlTGF5ZXIobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwYWludCwgc2F2ZUZsYWdzKTsKK30KKworc3RhdGljIGppbnQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zYXZlTGF5ZXJBbHBoYShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgamludCBhbHBoYSwgamludCBzYXZlRmxhZ3MpIHsKKyAgICByZXR1cm4gcmVuZGVyZXItPnNhdmVMYXllckFscGhhKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgYWxwaGEsIHNhdmVGbGFncyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENsaXBwaW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBib29sIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcXVpY2tSZWplY3QoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBsZWZ0LCBqZmxvYXQgdG9wLCBqZmxvYXQgcmlnaHQsIGpmbG9hdCBib3R0b20sCisgICAgICAgIFNrQ2FudmFzOjpFZGdlVHlwZSBlZGdlKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5xdWlja1JlamVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworfQorCitzdGF0aWMgYm9vbCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NsaXBSZWN0RihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgU2tSZWdpb246Ok9wIG9wKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5jbGlwUmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIG9wKTsKK30KKworc3RhdGljIGJvb2wgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jbGlwUmVjdChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamludCBsZWZ0LCBqaW50IHRvcCwgamludCByaWdodCwgamludCBib3R0b20sCisgICAgICAgIFNrUmVnaW9uOjpPcCBvcCkgeworICAgIHJldHVybiByZW5kZXJlci0+Y2xpcFJlY3QoZmxvYXQobGVmdCksIGZsb2F0KHRvcCksIGZsb2F0KHJpZ2h0KSwgZmxvYXQoYm90dG9tKSwgb3ApOworfQorCitzdGF0aWMgYm9vbCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldENsaXBCb3VuZHMoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpvYmplY3QgcmVjdCkgeworICAgIGNvbnN0IGFuZHJvaWQ6OnVpcmVuZGVyZXI6OlJlY3QmIGJvdW5kcyhyZW5kZXJlci0+Z2V0Q2xpcEJvdW5kcygpKTsKKworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QocmVjdCwgZ1JlY3RDbGFzc0luZm8uc2V0LAorICAgICAgICAgICAgaW50KGJvdW5kcy5sZWZ0KSwgaW50KGJvdW5kcy50b3ApLCBpbnQoYm91bmRzLnJpZ2h0KSwgaW50KGJvdW5kcy5ib3R0b20pKTsKKworICAgIHJldHVybiAhYm91bmRzLmlzRW1wdHkoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVHJhbnNmb3JtcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3RyYW5zbGF0ZShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGR4LCBqZmxvYXQgZHkpIHsKKyAgICByZW5kZXJlci0+dHJhbnNsYXRlKGR4LCBkeSk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcm90YXRlKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgZGVncmVlcykgeworICAgIHJlbmRlcmVyLT5yb3RhdGUoZGVncmVlcyk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2NhbGUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBzeCwgamZsb2F0IHN5KSB7CisgICAgcmVuZGVyZXItPnNjYWxlKHN4LCBzeSk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0TWF0cml4KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa01hdHJpeCogbWF0cml4KSB7CisgICAgcmVuZGVyZXItPnNldE1hdHJpeChtYXRyaXgpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldE1hdHJpeChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tNYXRyaXgqIG1hdHJpeCkgeworICAgIHJlbmRlcmVyLT5nZXRNYXRyaXgobWF0cml4KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jb25jYXRNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICByZW5kZXJlci0+Y29uY2F0TWF0cml4KG1hdHJpeCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERyYXdpbmcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Qml0bWFwKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgcmVuZGVyZXItPmRyYXdCaXRtYXAoYml0bWFwLCBsZWZ0LCB0b3AsIHBhaW50KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Qml0bWFwUmVjdChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tCaXRtYXAqIGJpdG1hcCwKKyAgICAgICAgZmxvYXQgc3JjTGVmdCwgZmxvYXQgc3JjVG9wLCBmbG9hdCBzcmNSaWdodCwgZmxvYXQgc3JjQm90dG9tLAorICAgICAgICBmbG9hdCBkc3RMZWZ0LCBmbG9hdCBkc3RUb3AsIGZsb2F0IGRzdFJpZ2h0LCBmbG9hdCBkc3RCb3R0b20sIFNrUGFpbnQqIHBhaW50KSB7CisgICAgcmVuZGVyZXItPmRyYXdCaXRtYXAoYml0bWFwLCBzcmNMZWZ0LCBzcmNUb3AsIHNyY1JpZ2h0LCBzcmNCb3R0b20sCisgICAgICAgICAgICBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b20sIHBhaW50KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Qml0bWFwTWF0cml4KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa0JpdG1hcCogYml0bWFwLCBTa01hdHJpeCogbWF0cml4LCBTa1BhaW50KiBwYWludCkgeworICAgIHJlbmRlcmVyLT5kcmF3Qml0bWFwKGJpdG1hcCwgbWF0cml4LCBwYWludCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1BhdGNoKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa0JpdG1hcCogYml0bWFwLCBqYnl0ZUFycmF5IGNodW5rcywKKyAgICAgICAgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBTa1BhaW50KiBwYWludCkgeworICAgIGpieXRlKiBzdG9yYWdlID0gZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhjaHVua3MsIE5VTEwpOworICAgIFJlc19wbmdfOXBhdGNoKiBwYXRjaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UmVzX3BuZ185cGF0Y2gqPihzdG9yYWdlKTsKKyAgICBSZXNfcG5nXzlwYXRjaDo6ZGVzZXJpYWxpemUocGF0Y2gpOworCisgICAgcmVuZGVyZXItPmRyYXdQYXRjaChiaXRtYXAsIHBhdGNoLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50KTsKKworICAgIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGNodW5rcywgc3RvcmFnZSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0NvbG9yKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpIHsKKyAgICByZW5kZXJlci0+ZHJhd0NvbG9yKGNvbG9yLCBtb2RlKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3UmVjdChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgU2tQYWludCogcGFpbnQpIHsKKyAgICByZW5kZXJlci0+ZHJhd1JlY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwYWludCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1JlY3RzKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa1JlZ2lvbiogcmVnaW9uLCBTa1BhaW50KiBwYWludCkgeworICAgIFNrUmVnaW9uOjpJdGVyYXRvciBpdCgqcmVnaW9uKTsKKyAgICB3aGlsZSAoIWl0LmRvbmUoKSkgeworICAgICAgICBjb25zdCBTa0lSZWN0JiByID0gaXQucmVjdCgpOworICAgICAgICByZW5kZXJlci0+ZHJhd1JlY3Qoci5mTGVmdCwgci5mVG9wLCByLmZSaWdodCwgci5mQm90dG9tLCBwYWludCk7CisgICAgICAgIGl0Lm5leHQoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1BhdGgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrUGF0aCogcGF0aCwgU2tQYWludCogcGFpbnQpIHsKKyAgICByZW5kZXJlci0+ZHJhd1BhdGgocGF0aCwgcGFpbnQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaGFkZXJzIGFuZCBjb2xvciBmaWx0ZXJzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzZXRNb2RpZmllcnMoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIpIHsKKyAgICByZW5kZXJlci0+cmVzZXRTaGFkZXIoKTsKKyAgICByZW5kZXJlci0+cmVzZXRDb2xvckZpbHRlcigpOworICAgIHJlbmRlcmVyLT5yZXNldFNoYWRvdygpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldHVwU2hhZGVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa2lhU2hhZGVyKiBzaGFkZXIpIHsKKyAgICByZW5kZXJlci0+c2V0dXBTaGFkZXIoc2hhZGVyKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXR1cENvbG9yRmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa2lhQ29sb3JGaWx0ZXIqIGZpbHRlcikgeworICAgIHJlbmRlcmVyLT5zZXR1cENvbG9yRmlsdGVyKGZpbHRlcik7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0dXBTaGFkb3coSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCByYWRpdXMsIGpmbG9hdCBkeCwgamZsb2F0IGR5LCBqaW50IGNvbG9yKSB7CisgICAgcmVuZGVyZXItPnNldHVwU2hhZG93KHJhZGl1cywgZHgsIGR5LCBjb2xvcik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRleHQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgcmVuZGVyVGV4dChPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGNvbnN0IGpjaGFyKiB0ZXh0LCBpbnQgY291bnQsCisgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgeworICAgIGNvbnN0IGpjaGFyICp3b3JrVGV4dDsKKyAgICBqY2hhciogYnVmZmVyID0gTlVMTDsKKyAgICBpbnQzMl90IHdvcmtCeXRlczsKKyAgICBpZiAoVGV4dExheW91dDo6cHJlcGFyZVRleHQocGFpbnQsIHRleHQsIGNvdW50LCBmbGFncywgJndvcmtUZXh0LCAmd29ya0J5dGVzLCAmYnVmZmVyKSkgeworICAgICAgICByZW5kZXJlci0+ZHJhd1RleHQoKGNvbnN0IGNoYXIqKSB3b3JrVGV4dCwgd29ya0J5dGVzLCBjb3VudCwgeCwgeSwgcGFpbnQpOworICAgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByZW5kZXJUZXh0UnVuKE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgY29uc3QgamNoYXIqIHRleHQsCisgICAgICAgIGppbnQgc3RhcnQsIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LCBqZmxvYXQgeCwgamZsb2F0IHksCisgICAgICAgIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKyAgICB1aW50OF90IHJ0bCA9IGZsYWdzICYgMHgxOworICAgIGlmIChydGwpIHsKKyAgICAgICAgU2tBdXRvU1RNYWxsb2M8ODAsIGpjaGFyPiBidWZmZXIoY29udGV4dENvdW50KTsKKyAgICAgICAgamNoYXIqIHNoYXBlZCA9IGJ1ZmZlci5nZXQoKTsKKyAgICAgICAgaWYgKFRleHRMYXlvdXQ6OnByZXBhcmVSdGxUZXh0UnVuKHRleHQsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50LCBzaGFwZWQpKSB7CisgICAgICAgICAgICByZW5kZXJlci0+ZHJhd1RleHQoKGNvbnN0IGNoYXIqKSBzaGFwZWQsIGNvdW50IDw8IDEsIGNvdW50LCB4LCB5LCBwYWludCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dXKCJkcmF3VGV4dFJ1biBlcnJvciIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyZXItPmRyYXdUZXh0KChjb25zdCBjaGFyKikgKHRleHQgKyBzdGFydCksIGNvdW50IDw8IDEsIGNvdW50LCB4LCB5LCBwYWludCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0QXJyYXkoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCisgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgeworICAgIGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOworICAgIHJlbmRlclRleHQocmVuZGVyZXIsIHRleHRBcnJheSArIGluZGV4LCBjb3VudCwgeCwgeSwgZmxhZ3MsIHBhaW50KTsKKyAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1RleHQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpzdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKyAgICBjb25zdCBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKKyAgICByZW5kZXJUZXh0KHJlbmRlcmVyLCB0ZXh0QXJyYXkgKyBzdGFydCwgZW5kIC0gc3RhcnQsIHgsIHksIGZsYWdzLCBwYWludCk7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dEFycmF5KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dFJ1bkFycmF5KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAorICAgICAgICBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LCBqZmxvYXQgeCwgamZsb2F0IHksIGludCBkaXJGbGFncywKKyAgICAgICAgU2tQYWludCogcGFpbnQpIHsKKyAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKKyAgICByZW5kZXJUZXh0UnVuKHJlbmRlcmVyLCB0ZXh0QXJyYXkgKyBjb250ZXh0SW5kZXgsIGluZGV4IC0gY29udGV4dEluZGV4LAorICAgICAgICAgICAgY291bnQsIGNvbnRleHRDb3VudCwgeCwgeSwgZGlyRmxhZ3MsIHBhaW50KTsKKyAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7CisgfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0UnVuKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqc3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGRpckZsYWdzLAorICAgICAgICBTa1BhaW50KiBwYWludCkgeworICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOworICAgIGppbnQgY291bnQgPSBlbmQgLSBzdGFydDsKKyAgICBqaW50IGNvbnRleHRDb3VudCA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgcmVuZGVyVGV4dFJ1bihyZW5kZXJlciwgdGV4dEFycmF5ICsgY29udGV4dFN0YXJ0LCBzdGFydCAtIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgIGNvdW50LCBjb250ZXh0Q291bnQsIHgsIHksIGRpckZsYWdzLCBwYWludCk7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dEFycmF5KTsKK30KKworI2VuZGlmIC8vIFVTRV9PUEVOR0xfUkVOREVSRVIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tbW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2lzQXZhaWxhYmxlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6KSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIHJldHVybiBKTklfVFJVRTsKKyNlbHNlCisgICAgcmV0dXJuIEpOSV9GQUxTRTsKKyNlbmRpZgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBKTkkgR2x1ZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjb25zdCBjaGFyKiBjb25zdCBrQ2xhc3NQYXRoTmFtZSA9ICJhbmRyb2lkL3ZpZXcvR0xFUzIwQ2FudmFzIjsKKworc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0geworICAgIHsgIm5Jc0F2YWlsYWJsZSIsICAgICAgICIoKVoiLCAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfaXNBdmFpbGFibGUgfSwKKworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICB7ICJuQ3JlYXRlUmVuZGVyZXIiLCAgICAiKClJIiwgICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NyZWF0ZVJlbmRlcmVyIH0sCisgICAgeyAibkRlc3Ryb3lSZW5kZXJlciIsICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kZXN0cm95UmVuZGVyZXIgfSwKKyAgICB7ICJuU2V0Vmlld3BvcnQiLCAgICAgICAiKElJSSlWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldFZpZXdwb3J0IH0sCisgICAgeyAiblByZXBhcmUiLCAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19wcmVwYXJlIH0sCisgICAgeyAibkFjcXVpcmVDb250ZXh0IiwgICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19hY3F1aXJlQ29udGV4dCB9LAorICAgIHsgIm5SZWxlYXNlQ29udGV4dCIsICAgICIoSSlWIiwgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVsZWFzZUNvbnRleHQgfSwKKworICAgIHsgIm5TYXZlIiwgICAgICAgICAgICAgICIoSUkpSSIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2F2ZSB9LAorICAgIHsgIm5SZXN0b3JlIiwgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzdG9yZSB9LAorICAgIHsgIm5SZXN0b3JlVG9Db3VudCIsICAgICIoSUkpViIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzdG9yZVRvQ291bnQgfSwKKyAgICB7ICJuR2V0U2F2ZUNvdW50IiwgICAgICAiKEkpSSIsICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldFNhdmVDb3VudCB9LAorCisgICAgeyAiblNhdmVMYXllciIsICAgICAgICAgIihJRkZGRklJKUkiLCAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zYXZlTGF5ZXIgfSwKKyAgICB7ICJuU2F2ZUxheWVyQWxwaGEiLCAgICAiKElGRkZGSUkpSSIsICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NhdmVMYXllckFscGhhIH0sCisKKyAgICB7ICJuUXVpY2tSZWplY3QiLCAgICAgICAiKElGRkZGSSlaIiwgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3F1aWNrUmVqZWN0IH0sCisgICAgeyAibkNsaXBSZWN0IiwgICAgICAgICAgIihJRkZGRkkpWiIsICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jbGlwUmVjdEYgfSwKKyAgICB7ICJuQ2xpcFJlY3QiLCAgICAgICAgICAiKElJSUlJSSlaIiwgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NsaXBSZWN0IH0sCisKKyAgICB7ICJuVHJhbnNsYXRlIiwgICAgICAgICAiKElGRilWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3RyYW5zbGF0ZSB9LAorICAgIHsgIm5Sb3RhdGUiLCAgICAgICAgICAgICIoSUYpViIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcm90YXRlIH0sCisgICAgeyAiblNjYWxlIiwgICAgICAgICAgICAgIihJRkYpViIsICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zY2FsZSB9LAorCisgICAgeyAiblNldE1hdHJpeCIsICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXRNYXRyaXggfSwKKyAgICB7ICJuR2V0TWF0cml4IiwgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldE1hdHJpeCB9LAorICAgIHsgIm5Db25jYXRNYXRyaXgiLCAgICAgICIoSUkpViIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY29uY2F0TWF0cml4IH0sCisKKyAgICB7ICJuRHJhd0JpdG1hcCIsICAgICAgICAiKElJRkZJKVYiLCAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdCaXRtYXAgfSwKKyAgICB7ICJuRHJhd0JpdG1hcCIsICAgICAgICAiKElJRkZGRkZGRkZJKVYiLCAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdCaXRtYXBSZWN0IH0sCisgICAgeyAibkRyYXdCaXRtYXAiLCAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Qml0bWFwTWF0cml4IH0sCisgICAgeyAibkRyYXdQYXRjaCIsICAgICAgICAgIihJSVtCRkZGRkkpViIsICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3UGF0Y2ggfSwKKyAgICB7ICJuRHJhd0NvbG9yIiwgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdDb2xvciB9LAorICAgIHsgIm5EcmF3UmVjdCIsICAgICAgICAgICIoSUZGRkZJKVYiLCAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1JlY3QgfSwKKyAgICB7ICJuRHJhd1JlY3RzIiwgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdSZWN0cyB9LAorICAgIHsgIm5EcmF3UGF0aCIsICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1BhdGggfSwKKworICAgIHsgIm5SZXNldE1vZGlmaWVycyIsICAgICIoSSlWIiwgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzZXRNb2RpZmllcnMgfSwKKyAgICB7ICJuU2V0dXBTaGFkZXIiLCAgICAgICAiKElJKVYiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldHVwU2hhZGVyIH0sCisgICAgeyAiblNldHVwQ29sb3JGaWx0ZXIiLCAgIihJSSlWIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXR1cENvbG9yRmlsdGVyIH0sCisgICAgeyAiblNldHVwU2hhZG93IiwgICAgICAgIihJRkZGSSlWIiwgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXR1cFNoYWRvdyB9LAorCisgICAgeyAibkRyYXdUZXh0IiwgICAgICAgICAgIihJW0NJSUZGSUkpViIsICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dEFycmF5IH0sCisgICAgeyAibkRyYXdUZXh0IiwgICAgICAgICAgIihJTGphdmEvbGFuZy9TdHJpbmc7SUlGRklJKVYiLAorICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0IH0sCisKKyAgICB7ICJuRHJhd1RleHRSdW4iLCAgICAgICAiKElbQ0lJSUlGRklJKVYiLCAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0UnVuQXJyYXkgfSwKKyAgICB7ICJuRHJhd1RleHRSdW4iLCAgICAgICAiKElMamF2YS9sYW5nL1N0cmluZztJSUlJRkZJSSlWIiwKKyAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dFJ1biB9LAorCisgICAgeyAibkdldENsaXBCb3VuZHMiLCAgICAgIihJTGFuZHJvaWQvZ3JhcGhpY3MvUmVjdDspWiIsCisgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZ2V0Q2xpcEJvdW5kcyB9LAorI2VuZGlmCit9OworCisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgICNkZWZpbmUgRklORF9DTEFTUyh2YXIsIGNsYXNzTmFtZSkgXAorICAgICAgICAgICAgdmFyID0gZW52LT5GaW5kQ2xhc3MoY2xhc3NOYW1lKTsgXAorICAgICAgICAgICAgTE9HX0ZBVEFMX0lGKCEgdmFyLCAiVW5hYmxlIHRvIGZpbmQgY2xhc3MgIiBjbGFzc05hbWUpOyBcCisgICAgICAgICAgICB2YXIgPSBqY2xhc3MoZW52LT5OZXdHbG9iYWxSZWYodmFyKSk7CisgICAgCisgICAgI2RlZmluZSBHRVRfTUVUSE9EX0lEKHZhciwgY2xhenosIG1ldGhvZE5hbWUsIG1ldGhvZERlc2NyaXB0b3IpIFwKKyAgICAgICAgICAgIHZhciA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosIG1ldGhvZE5hbWUsIG1ldGhvZERlc2NyaXB0b3IpOyBcCisgICAgICAgICAgICBMT0dfRkFUQUxfSUYoISB2YXIsICJVbmFibGUgdG8gZmluZCBtZXRob2QgIiBtZXRob2ROYW1lKTsKKyNlbHNlCisgICAgI2RlZmluZSBGSU5EX0NMQVNTKHZhciwgY2xhc3NOYW1lKQorICAgICNkZWZpbmUgR0VUX01FVEhPRF9JRCh2YXIsIGNsYXp6LCBtZXRob2ROYW1lLCBtZXRob2REZXNjcmlwdG9yKQorI2VuZGlmCisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzKEpOSUVudiogZW52KSB7CisgICAgRklORF9DTEFTUyhnUmVjdENsYXNzSW5mby5jbGF6eiwgImFuZHJvaWQvZ3JhcGhpY3MvUmVjdCIpOworICAgIEdFVF9NRVRIT0RfSUQoZ1JlY3RDbGFzc0luZm8uc2V0LCBnUmVjdENsYXNzSW5mby5jbGF6eiwgInNldCIsICIoSUlJSSlWIik7CisKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsIGtDbGFzc1BhdGhOYW1lLCBnTWV0aG9kcywgTkVMRU0oZ01ldGhvZHMpKTsKK30KKworfTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfdmlld19WaWV3Um9vdC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QuY3BwCmluZGV4IDUxNzNiYjguLjI5ODhhZTggMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfdmlld19WaWV3Um9vdC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X1ZpZXdSb290LmNwcApAQCAtNzYsMTAgKzc2LDYgQEAKICAgICBjYW52YXMtPnJlc3RvcmUoKTsKIH0KIAotc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X1ZpZXdSb290X2FiYW5kb25HbENhY2hlcyhKTklFbnYqIGVudiwgam9iamVjdCkgewotICAgIFNrR0xDYW52YXM6OkFiYW5kb25BbGxUZXh0dXJlcygpOwotfQotCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtODcsOSArODMsNyBAQAogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CiAgICAgeyAgICJuYXRpdmVTaG93RlBTIiwgIihMYW5kcm9pZC9ncmFwaGljcy9DYW52YXM7SSlWIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF92aWV3X1ZpZXdSb290X3Nob3dGUFMgfSwKLSAgICB7ICAgIm5hdGl2ZUFiYW5kb25HbENhY2hlcyIsICIoKVYiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfdmlld19WaWV3Um9vdF9hYmFuZG9uR2xDYWNoZXMgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX3ZpZXdfVmlld1Jvb3Rfc2hvd0ZQUyB9CiB9OwogCiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X1ZpZXdSb290KEpOSUVudiogZW52KSB7CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9BbmRyb2lkLm1rIGIvY29yZS9yZXMvQW5kcm9pZC5tawppbmRleCA3ZDExMTQ4Li45ZmFmYzU5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9BbmRyb2lkLm1rCisrKyBiL2NvcmUvcmVzL0FuZHJvaWQubWsKQEAgLTMzLDggKzMzLDE2IEBACiAjIFBST0RVQ1QtYWdub3N0aWMgcmVzb3VyY2UgZGF0YSBsaWtlIElEcyBhbmQgdHlwZSBkZWZpbml0aW9ucy4KIExPQ0FMX0VYUE9SVF9QQUNLQUdFX1JFU09VUkNFUyA6PSB0cnVlCiAKKyMgSW5jbHVkZSByZXNvdXJjZXMgZ2VuZXJhdGVkIGJ5IHN5c3RlbSBSZW5kZXJTY3JpcHQgZmlsZXMuCitmcmFtZXdvcmtfR0VORVJBVEVEX1NPVVJDRV9ESVIgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixKQVZBX0xJQlJBUklFUyxmcmFtZXdvcmssLENPTU1PTikvc3JjCitmcmFtZXdvcmtfUmVuZGVyU2NyaXB0X1NUQU1QX0ZJTEUgOj0gJChmcmFtZXdvcmtfR0VORVJBVEVEX1NPVVJDRV9ESVIpL1JlbmRlclNjcmlwdC5zdGFtcAorTE9DQUxfUkVTT1VSQ0VfRElSIDo9ICQoZnJhbWV3b3JrX0dFTkVSQVRFRF9TT1VSQ0VfRElSKS9yZW5kZXJzY3JpcHQvcmVzICQoTE9DQUxfUEFUSCkvcmVzCisKIGluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQogCisjIE1ha2Ugc3VyZSB0aGUgc3lzdGVtIC5ycyBmaWxlcyBnZXQgY29tcGlsZWQgYmVmb3JlIGJ1aWxkaW5nIHRoZSBwYWNrYWdlLWV4cG9ydC5hcGsuCiskKHJlc291cmNlX2V4cG9ydF9wYWNrYWdlKTogJChmcmFtZXdvcmtfUmVuZGVyU2NyaXB0X1NUQU1QX0ZJTEUpCisKICMgZGVmaW5lIGEgZ2xvYmFsIGludGVybWVkaWF0ZSB0YXJnZXQgdGhhdCBvdGhlciBtb2R1bGUgbWF5IGRlcGVuZCBvbi4KIC5QSE9OWTogZnJhbWV3b3JrLXJlcy1wYWNrYWdlLXRhcmdldAogZnJhbWV3b3JrLXJlcy1wYWNrYWdlLXRhcmdldDogJChMT0NBTF9CVUlMVF9NT0RVTEUpCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAxOWIzMGNjLi4xZjY2ZDA1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTgzLDYgKzgzLDggQEAKICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9DT05ORUNURUQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfRElTQ09OTkVDVEVEIiAvPgogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX1NUQVRFIiAvPgorICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX0NBTUVSQV9BVFRBQ0hFRCIgLz4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9DQU1FUkFfREVUQUNIRUQiIC8+CiAKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDwhLS0gUGVybWlzc2lvbnMgZm9yIHRoaW5ncyB0aGF0IGNvc3QgbW9uZXkgLS0+CkBAIC0zNDgsNiArMzUwLDEzIEBACiAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2NfYWNjb3VudE1hbmFnZXJTZXJ2aWNlIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfYWNjb3VudE1hbmFnZXJTZXJ2aWNlIiAvPgogCisgICAgPCEtLSBBbGxvd3MgYW4gaW50ZXJuYWwgdXNlciB0byB1c2UgcHJpdmFsZWRnZWQgQ29ubmVjdGl2aXR5TWFuYWdlcgorICAgIEFQSXMuCisgICAgICAgIEBoaWRlIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNPTk5FQ1RJVklUWV9JTlRFUk5BTCIKKyAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImFuZHJvaWQucGVybWlzc2lvbi1ncm91cC5ORVRXT1JLIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlT3JTeXN0ZW0iIC8+CisKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBQZXJtaXNzaW9ucyBmb3IgYWNjZXNzaW5nIGFjY291bnRzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtZGlzYWJsZWQucG5nIGIvY29yZS9yZXMvYXNzZXRzL2ltYWdlcy9jb21ib2JveC1kaXNhYmxlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMjIwZTQuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvYXNzZXRzL2ltYWdlcy9jb21ib2JveC1kaXNhYmxlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9hc3NldHMvaW1hZ2VzL2NvbWJvYm94LW5vSGlnaGxpZ2h0LnBuZyBiL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtbm9IaWdobGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmNkZjcyLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtbm9IaWdobGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvYXNzZXRzL3dlYmtpdC9oeXBoX2VuX1VTLmRpYyBiL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaHlwaF9lbl9VUy5kaWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxMjA0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaHlwaF9lbl9VUy5kaWMKQEAgLTAsMCArMSw5Nzg0IEBACitJU084ODU5LTEKK0xFRlRIWVBIRU5NSU4gMgorUklHSFRIWVBIRU5NSU4gMworLmEyY2g0CisuYWQ0ZGVyCisuYTJkCisuYWQxZDQKKy5hMmYxdAorLmEyZgorLmE0bDN0CisuYW01YXQKKy40YTFtYQorLmFuNWMKKy5hMm4KKy4yYW5nNAorLmFuMWk1bQorLmFuMXQ0CisuYW4zdGUKKy5hbnRpNXMKKy5hbnQyaQorLmE0cjVzMgorLjJhMnIKKy5hcjR0MmllNAorLmFyMXRpCisuYXI0dHkKKy5hczNjCisuYXMxcAorLmEyczFzCisuYXN0ZXI1CisuYTJ0b201CisuYTF0bworLmF1MWQKKy5hdjRpCisuYXduNAorLmJhNGcKKy5iYTVuYQorLmJhMm4KKy5iYXM0ZQorLmJlcjQKKy5iZTVyMWEKKy5iZTNzMW0KKy40YmVzNAorLmI0ZTVzMnRvCisuYnJpMgorLmJ1dDR0aQorLmJ1NHQzdDIKKy5jYW00cGUKKy4xY2EKKy5jYTRtMXAKKy5jYW41YworLmNhMm4KKy5jYXBhNWIKKy5jYTFwYQorLmNhcjVvbAorLmMyYTJyCisuY2E0dAorLmNlNGxhCisuMmNoNAorLmNoaWxsNWkKKy5jaDRpbDIKKy5jaGlsMWwKKy4xY2kyCisuY2l0NXIKKy4yYzFpdAorLmNvM2UyCisuMWNvCisuY280cgorLmNvcjVuMWVyCisuY29ybjJlCisuZGU0bW9pMgorLmQ0ZW0KKy5kZTFtbworLmRlM28KKy5kZTNyMWEKKy5kZTNyMWkKKy5kZTFzNGMKKy5kZXMyCisuZGljMXQyaW81CisuM2RpMmMxdAorLmRvNHQKKy4xZG8KKy5kdTRjCisuMWR1CisuZHU0bTFiNQorLmVhcnRoNQorLmVhcjJ0CisuZTJhMnIKKy5lYXMzaQorLjJlMWI0CisuZWVyNAorLmVnMgorLmUybDVkCisuZWwzZW0KKy5lbmFtMworLmUxbmEKKy5lbjNnCisuZTJuM3MyCisuZXE1dWk1dAorLmUxcQorLmVxdTIKKy5lcTJ1aTIKKy5lcjRyaQorLmVyMXI0CisuZXMzCisuNGV1MworLmV5ZTUKKy5mZXMzCisuZm9yNW1lcgorLjFmbworLmZvMnIKKy5mb3IxbQorLmZvcjJtZQorLjFnYTIKKy5nZTIKKy5nZW4zdDQKKy4xZ2VuCisuZ2U1bzJnCisuMWdlbworLjFnMmk1YQorLmdpNGIKKy5nbzRyCisuMWdvCisuaGFuZDVpCisuaGEybgorLmg0YW5kCisuaGE0bjVrMgorLmhlMgorLmhlcm81aTIKKy5oMmVybworLmgxZXMzCisuaGU0dDMKKy5oaTNiCisuaGkzZXIKKy5oMmllNAorLmhvbjVleQorLmhvMm4KKy5ob24zbworLmhvdjUKKy5pZDRsCisuMmlkCisuaWRvbDMKKy5pMWRvCisuaW0zbQorLmltNXAxaTJuCisuaTRtMXAKKy5pbTJwaQorLmluMQorLmluM2NpCisuMmluZTIKKy40aTRuMmsyCisuMmkybjNzMgorLmlyNXI0CisuNGlyCisuaXM0aQorLmp1M3IKKy5sYTRjeQorLmxhNG0KKy5sYXQ1ZXIKKy5sNGF0aDUKKy5sZTIKKy5sZWc1ZQorLmxlbjQKKy5sZXA1CisubGV2MQorLmwyaTRnCisubGkxZzVhCisubGkybgorLmwyaTNvCisubDFpNHQKKy5tYTFnNWE1CisuMW1hCisubWFsNW8KKy5tYTFuNWEKKy5tYTJuCisubWFyNXRpCisubTJhMnIKKy5tZTIKKy5tZXIzYworLm1lNXRlcgorLm1lMXRlCisubTJpczEKKy5taXM0dDVpCisubW9uM2UKKy4xbW8KKy5tbzJuCisubW8zcm8KKy5tbzJyCisubXU1dGEKKy4xbXUKKy5tdTJ0YTViCisubmk0YworLm9kMgorLm9kMWQ1Cisub2Y1dGUKKy5vMmZ0Cisub3I1YTF0bworLm8xcmEKKy5vcjNjCisub3IxZAorLm9yM3QKKy5vczMKKy5vczR0bAorLjRvdGgzCisub3V0MworLm91MgorLnBlZDVhbAorLjJwMmVkCisucDJlMmQyYQorLnBlNXRlCisucGUydAorLnBlNXRpdAorLnAyaTRlNAorLnBpbzVuNAorLjNwMmkxbworLnBpMnQKKy5wcmUzbQorLnByMgorLnJhNGMKKy5yYW40dAorLnJhMm4KKy5yYXRpbzVuMWEKKy5yYXRpbzJuNAorLnJhMXQyaW8KKy5yZWUyCisucmU1bWl0CisucmVzMgorLnJlNXN0YXQKKy5yZXMydAorLnJlczF0YQorLnIyaTRnCisucmkydDV1Cisucm80cQorLnJvczV0Cisucm93NWQKKy5ydTRkCisuM3M0YzJpM2U0CisuczFjaQorLjVzZTJsMmY1Cisuc2VsMWw1Cisuc2UybgorLnNlNXIyaWU0Cisuc2VyMWkKKy5zMmgyCisuc2kyCisuczNpbmc0CisuMnMxaW4KKy5zdDQKKy5zdGE1YjJsMgorLnMxdGEKKy5zMnRhYgorLnM0eTIKKy4xdGE0CisudGU0CisuM3RlbjVhMm4KKy50ZTFuYQorLnRoMgorLnRpMgorLnRpbDQKKy50aTFtNW81CisuMXRpbQorLnRpbmc0CisuMnQxaW4KKy50NGk0bjVrMgorLnRvMW40YQorLjF0bworLnRvMm4KKy50bzRwCisudG9wNWkKKy50bzJ1NXMKKy50b3UyCisudHJpYjV1dAorLnRyNGliCisudTFuMWEKKy51bjNjZQorLnVuZGVyNQorLnVuMWRlCisudTJuMWUKKy51NG41azIKKy51bjVvCisudW4zdTQKKy51cDMKKy51cmUzCisudXM1YTIKKy4ydXMKKy52ZW40ZGUKKy52ZTVyMWEKKy53aWw1aQorLndpMgorLndpbDIKKy55ZTQKKzRhYi4KK2E1YmFsCithNWJhMm4KK2FiZTIKK2FiNWVyZAorYWIyaTVhCithYjVpMnQ1YWIKK2FiaTJ0CithYmkxdGEKK2FiNWxhdAorYWIybDIKK2FiNW81bDFpegorYWJvbDJpCis0YWJyCithYjVyb2cKK2FiM3VsCithNGMyYTJyCithMWNhCithYzVhcmQKK2FjNWFybworYTVjZW91MgorYWMxZXIKK2E1Y2hlNHQKK2EyY2gKK2FjaGUyCis0YTJjaQorYTNjMmllNAorYTJjMWluCithM2MyaW8KK2FjNXJvYgorYWN0NWlmMgorYTJjMXQKK2FjM3VsCithYzR1bQorYTJkCithZDRkMWluCithZDFkNAorYWQ1ZXIuCisyYWRpCithM2Q0aTNhCithZDNpMWNhCithZGk0ZXIKK2FkMmllNAorYTNkMmlvCithM2RpdAorYTVkaTF1CithZDRsZQorYWQzb3cKK2ExZG8KK2FkNXJhMm4KK2ExZHIKK2FkNHN1CithMmQxczIKKzRhMWR1CithM2R1MmMKK2FkNXVtCithZTRyCithZXIyaTRlNAorYWVyMWkKK2EyZgorYTRmMWY0CithNGdhYgorYTFnYQorYWdhNG4KK2FnNWVsMWwKK2ExZ2U0bworNGFnNGV1CithZzFpCis0YWc0bDIKK2FnMW4KK2EyZ28KKzNhM2c0bzRnCithZzNvM25pCithZ28ybjIKK2E1Z3VlcgorYTJndWUKK2FnNXVsCithNGd5CithM2hhCithM2hlCithNGg0bDQKK2EzaG8KK2FpMgorYTVpMWEKK2EzaWMuCithaTVseQorYTRpNG4KK2FpbjVpbgorYTJpbmkKK2EyaTFuNW8KK2FpdDVlbgorYTJpdGUKK2ExagorYWsxZW4KK2FsNWFiCithbDNhMmQKK2E0bDJhMnIKKzRhbGRpNAorYTJsZAorMmFsZQorYWwzZW5kCithNGxlbnQyaQorYTFsZW4xdAorYTVsZTVvCithbDFpCithbDRpYS4KK2FsMmkxYQorYWwyaTRlNAorYWw1bGV2CithbDFsCithbDJsZQorNGFsbGljCithbGwyaQorNGEybG0KK2E1bG9nLgorYTRseS4KK2ExbHkKKzRhMmx5czQKKzVhNWx5czF0Cis1YWx5dAorM2FseXoKKzRhMW1hCithMm01YWIKK2FtM2FnCithbWE1cmEKK2FtMmEycgorYW01YXNjCithNG1hM3RpcworYTRtNWExdG8KK2FtNWVyMWEKK2FtM2ljCithbTVpZgorYW01aTFseQorYW0xaW4KK2FtMmk0bm8KK2EybW8KK2E1bW8ybgorYW1vcjVpCithbW8ycgorYW1wNWVuCithNG0xcAorYTJuCithbjNhZ2UKK2ExbmEKKzNhbmExbHkKK2EzbjJhMnIKK2FuM2FyM2MKK2FuYXI0aQorYTNuYXRpCithbjJhdAorNGFuZAorYW5kZTRzMgorYW4xZGUKK2FuM2RpczEKK2FuMWRsCithbjRkb3cKK2FuMWRvCithNW5lZQorYTNuZW4KK2FuNWUyc3QuCithMW5lcworYTJuZXN0CithM240ZXUKKzJhbmcKK2FuZzVpZTQKK2FuMWdsMgorYTRuMWljCithM25pZXMKK2FuMmllNAorYW4zaTNmCithbjRpbWUKK2FuMWltCithNW5pbTFpCithNW4yaW5lCithbjFpbgorYW4zaTRvCithM24yaXAKK2FuM2lzMmgKK2FuM2l0CithM25pMXUKK2FuNGtsaQorYTRuazIKK2FuMWsxbAorNWFubml6CithNG4xbjIKK2FubzQKK2FuNW90CithbjRvdGg1CithbjJzYTIKK2EybjFzMgorYW40czFjbworYW5zNGMKK2FuNHMxbjQKK2FuMnNwCithbnMzcG8KK2FuNHN0CithbjRzdTJyCithbjFzdQorYW50YTJsNAorYW4xdAorYW4xdGEKK2FuNHQyaWU0CithbnQyaQorNGFuMXRvCithbjJ0cgorYW40dHc0CithbjN1MWEKK2FuM3VsCithNW51cgorNGFvCithcDJhMnI0CithMXBhCithcDVhdAorYXA1ZXIzbworYTNwaDRlcgorNGFwaGkKK2E0cGlsbGEKK2FwaWwxbAorYXA1aWxsMmEycgorYXAzaTJuCithcDNpMXRhCithM3BpMnR1CithMnAybDIKK2FwbzRjNQorYXA1bzFsYQorYXBvcjVpCithMXA0b3IKK2Fwb3MzdAorYTFwb3MKK2FwczVlNHMKK2EycDFzMgorYXAyc2UKK2EzcHUKK2FxdWU1CithcXUyCisyYTJyCithcjNhMmMxdAorYTVyYWRlCithcmEyZAorYXI1YWRpczEKK2FyMmFkaQorYXIzYWwKK2E1cmFtZTF0ZQorYXJhbTNldAorYXIyYW40ZworYXJhMm4KK2FyYTNwCithcjRhdAorYTVyYTF0MmlvCithcjVhMXQyaXYKK2E1cmF1CithcjVhdjQKK2FyYXc0CithcmJhbDQKK2FyMWIKK2FyNGNoYTJuCithcjFjCithcjNjaGEKK2FyMmNoCithcjVkMmluZQorYXJkMmkKK2FyZDFpbjQKK2FyNGRyCithcjVlYXMKK2EzcmVlCithcjNlbjF0CithNXIyZTJzcworYXI0ZmkKK2FyMWYKK2FyNGY0bDIKK2FyMWkKK2FyNWkyYWwKK2FyMmkzYQorYXIzaTJhMm4KK2Ezcmk1ZXQKK2FyMmllNAorYXI0aW0KK2FyNWluMmF0CithcjJpMW5hCithcjNpMW8KK2FyMml6CithcjJtaQorYXIxbQorYXI1bzVkCithNXJvbmkKK2FybzJuCithM3JvbzIKK2FyMnAKK2FyM3EKK2FycmU0CithcjFyNAorYXI0c2EyCithNHJzMgorYXIyczJoCis0YXMuCithMnM0YWIKK2FzYTIKK2FzM2FuMXQKK2FzYTJuCithc2hpNAorYXMyaAorYTVzaWEuCithczJpMWEKK2Ezc2kxYgorYTNzaWMKKzVhNXNpNHQKK2FzazNpCithc2syCithczRsMgorYTRzb2MKK2Exc28KK2FzNXBoCithczRzMmgKK2Eyc3MKK2FzM3RlbgorYXMxdDRyCithc3UxcjVhCithMXN1Cithc3UycgorYTJ0YQorYXQzYWIybDIKK2EydGFiCithdDVhYworYXQzYWxvCithdGEybAorYXQ1YXAKK2F0ZTVjCithdDVlMmNoCithdDNlMWdvCithdGVnNAorYXQzZW4uCithdDNlcjFhCithdGVyNW4KK2E1dGVyMW5hCithdDNlc3QKK2F0NWV2Cis0YXRoCithdGg1ZW0KK2F0aDJlCithNXRoZTJuCithdDRobworYXRoNW9tCis0YXRpLgorYTV0MmkxYQorYTJ0NWk1YgorYXQxaWMKK2F0M2lmMgorYXRpb241YTJyCithMXQyaW8KK2F0aW8ybgorYXRpbzFuMWEKK2F0M2kxdHUKK2E0dG9nCithMXRvCithMnRvbQorYXQ1b20yaXoKK2E0dG9wCithNHRvczIKK2ExdHIKK2F0NXJvcAorYXQ0c2syCithNHQxczIKK2F0NHRhZworYTR0M3QyCithdDF0YQorYXQ1dGUKK2F0NHRoCithMnR1CithdDV1MWEKK2E0dDV1ZQorYXQzdWwKK2F0M3UxcmEKK2EydHkKK2F1NGIKK2F1Z2gzCithdTNndQorYXU0bDIKK2F1bjVkCithdTNyCithdTVzaTFiCithMnVzCithNHV0NWVuCithdTF0aAorYTJ2YQorYXYzYWc0CithNXZhMm4KK2F2NGU0bm8KK2F2M2VyMWEKK2F2NWVybgorYXY1ZXJ5CithdjFpCithdmk0ZXIKK2F2MmllNAorYXYzaWcKK2F2NW9jCithMXZvcgorM2F3YXkKK2F3M2kyCithdzRseQorYXdzNAorYXg0aTVjCitheDNpCitheDRpZAorYXk1YWwKK2F5ZTQKK2F5czQKK2F6aTRlcgorYTJ6MWkKK2F6MmllNAorYXoyejVpCithNHoxejIKKzViYS4KK2JhZDVnZXIKK2JhMmQKK2JhNGdlCitiYWwxYQorYmFuNWRhZworYmEybgorYjRhbmQKK2JhbjFkMmEKK2JhbjRlCitiYW4zaQorYmFyYmk1CitiMmEycgorYmFyMWIKK2JhcjJpNGEKK2JhcjFpCitiYXM0c2kKK2JhMnNzCisxYmF0CitiYTR6CisyYjFiCitiMmJlCitiM2JlcgorYmJpNG5hCis0YjFkCis0YmUuCitiZWFrNAorYmVhMnQzCis0YmUyZAorYjJlM2QyYQorYmUzZGUKK2I0ZTNkaQorYmUzZ2kKK2JlNWd1CisxYmVsCitiZTFsMmkKK2JlM2xvCis0YmU1bQorYmU1bjJpZworYmU1bnUKKzRiZXM0CitiZTNzcAorYjJlNXN0NHIKKzNiZXQKK2JlMXQ1aXoKK2JlNXRyCitiZTN0dzQKK2JlM3cKK2JlNXkxbzQKKzJiZgorNGIzaAorYmkyYgorYjJpNGQKKzNiMmllNAorYmk1ZW4KK2JpNGVyCisyYjNpZgorMWJpbAorYmkzbDJpegorYmlsMWkKK2JpbjJhNXI0CitiaTFuYQorYjRpbjRkCitiaTVuZXQKK2IyaW5lCitiaTNvMmdyCitiMmlvCitiaTVvdTIKK2JpMnQKKzNiMmkzdDJpbworYmkxdGkKK2JpM3RyCiszYml0NXUxYQorYmkxdHUKK2I1aTR0egorYjFqCitiazQKK2IybDIKK2JsNGF0aDUKK2I0bGUuCitibGVuNAorNWJsZTFzcAorYmxlczIKK2IzbGlzCitiNGxvCitibHVuNHQKKzRiMW0KKzRiM24KK2JuZTVnCiszYm9kCitib2QzaQorYm80ZQorYm9sM2ljCitib2wyaQorYm9tNGJpCitibzRtMWIKK2JvMW40YQorYm8ybgorYm9uNWF0CiszYm9vMgorNWJvci4KKzRiMW8xcmEKK2JvcjVkCis1Ym9yZQorNWJvcmkKKzVib3M0CitiNW8xdGEKK2I0b3RoNQorYm80dG8KK2JvdW4yZDMKK2JvdTIKKzRicAorNGJyaXQKK2JyNG90aDMKKzJiNXMyCitic29yNAorYjFzbworMmJ0CitiMnQ0bAorYjR0bworYjN0cgorYnVmNGZlcjEKK2J1NGYxZgorYnU0Z2EKK2J1M2wyaQorYnUxbWk0CitidTRuCitidW50NGkKK2J1bjF0CitidTNyZQorYnVzNWllNAorYjJ1cworYnVzczRlCitidTJzcworNWJ1c3QKKzRidTF0YQorM2J1MXQyaW8KK2I0dTF0MmkKK2I1dTF0bworYjF2Cis0YjV3Cis1YnkuCitieXM0CisxY2EKK2NhYjNpbgorY2ExYjJsMgorY2EyY2g0CitjYTVkZW4KK2NhMmQKKzRjYWc0CisyYzVhaAorY2EzbGF0CitjYWw0bGEKK2NhbDFsCitjYWwybDVpbjQKK2NhbGwyaQorNGNhbG8KK2M0YW41ZAorY2EybgorY2FuNGUKK2NhNG40aWMKK2NhbjVpcworY2FuM2l6CitjYW40dHkKK2NhbjF0CitjYW55NAorY2E1cGVyCitjYXI1b20KK2MyYTJyCitjYXN0NWVyCitjYXM1dDJpZworY2FzdDJpCis0Y2FzNHkKK2M0YTR0aAorNGNhMXQyaXYKK2NhdjVhbAorY2EydmEKK2MzYworY2NoYTUKK2MyY2gKK2MzYzJpNGEKK2MxY2kKK2Njb20xcGE1CitjMWNvCitjY280bTFwCitjY28ybjQKK2Njb3UzdAorY2NvdTIKKzJjZS4KKzRjZWQuCis0Y2UxZGVuCiszY2VpMgorNWNlbC4KKzNjZWwxbAorMWNlbgorM2NlbmMKKzJjZW40ZQorNGNlbmkKKzNjZW4xdAorM2NlcAorY2U1cmFtCitjZXIxYQorNGNlMXM0YTIKKzNjZXMxc2kKK2MyZTJzcworY2VzNXNpNWIKK2NlczV0CitjZXQ0CitjNWU0dGEKK2NldzQKKzJjaAorNGNoLgorNGNoM2FiCis1Y2hhNG4xaWMKK2NoYTJuCitjaDVhNW5pcworY2hlMgorY2hlYXAzCis0Y2g0ZWQKK2NoNWU1bG8KKzNjaGVtaQorY2g1ZW5lCitjaGUybgorY2gzZXIuCitjaDNlNHIxczIKKzRjaDFpbgorNWNoaTJuZS4KK2NoMmluZQorY2g1aTVuMmUyc3MKK2NoaTFuZXMKKzVjaDJpbmkKKzVjaDJpbworM2NoaXQKK2NoaTJ6CiszY2hvMgorY2g0dGkKKzFjaQorM2MyaTFhCitjaTJhNWIKK2NpMmE1cgorY2k1YworNGNpZXIKK2MyaWU0Cis1YzRpMmYzaWMuCitjaTFmaQorNGM0aTVpNAorY2k0bGEKKzNjaWwxaQorMmNpbQorMmNpbgorYzRpMW5hCiszY2luMmF0CitjaW4zZW0KK2MyaW5lCitjMWluZworYzVpbmcuCis1YzJpMW5vCitjaW8ybjQKK2MyaW8KKzRjaXBlNAorYzJpcAorY2kzcGgKKzRjaXA0aWMKK2NpcDNpCis0Y2lzMXRhCis0Y2lzMXQyaQorMmMxaXQKK2NpMXQzaXoKK2NpMXRpCis1Y2l6CitjazEKK2NrM2kKKzFjNGw0Cis0Y2wyYTJyCitjNWxhNXJhMXQyaW8KK2NsYXI0YXQKKzVjbGFyZQorY2xlNG0KKzRjbGljCitjbGltNAorYzFseTQKK2M1bgorMWNvCitjbzVhZworYzRvYQorY29lMgorMmNvZworY280Z3IKK2NvaTQKK2NvM2luYworY29sNWkKKzVjb2xvCitjb2wzbzRyCitjb201ZXIKK2NvMm1lCitjbzFuNGEKK2NvMm4KK2M0b25lCitjb24zZworY29uNXQKK2NvM3BhCitjb3AzaWMKK2NvNHAybDIKKzRjb3IxYgorY29ybzNuCitjb3M0ZQorY292MQorY292ZTQKK2NvdzVhCitjbzJ6NWUKK2NvNXoxaQorYzFxCitjcmFzNXQKK2NyMmFzCis1Y3JhdC4KKzVjcmF0MWljCitjcmUzYTJ0Cis1YzJyMmVkCis0YzNyZTF0YQorY3JlNHYyCitjcmkyCitjcmk1ZgorYzRyaW4KK2NyMmlzNAorNWNyaTF0aQorY3JvNHAybDIKK2Nyb3A1bworY3JvczRlCitjcnU0ZAorNGMzczIKKzJjMXQKK2MydGE0YgorYzF0YQorY3Q1YW5nCitjdGEybgorYzV0YW4xdAorYzJ0ZQorYzN0ZXIKK2M0dDRpYzF1CitjdGltM2kKK2MxdGltCitjdHU0cgorYzF0dQorYzR0dzQKK2N1ZDUKK2M0dWYKK2M0dWkyCitjdTVpMXR5Cis1Y3VsMmkKK2N1bDR0aXM0CitjdWwxdGkKK2N1NGx0CiszYzR1bDF0dTIKK2N1Mm1hCitjM3VtZQorY3U0bWkKKzNjdW4KK2N1M3BpCitjdTVweQorY3UycjVhNGIKK2N1MXJhCitjdTVyMmkzYQorMWMydXMKK2N1czFzNGkKK2N1MnNzCiszYzR1dAorY3U0dDJpZTQKK2M0dTF0MmkKKzRjNXUxdDJpdgorNGN1dHIKKzFjeQorYzJ6ZTQKKzFkMmEKKzVkYS4KKzJkM2E0YgorZGEyY2g0Cis0ZGEyZgorMmRhZworZGEybTIKK2QyYW4zZworZGEybgorZGFyZDUKK2QyYTJyCitkYXJrNQorNGRhcnkKKzNkYXQKKzRkYTF0Mml2Cis0ZGExdG8KKzVkYXY0CitkYXY1ZQorNWRheQorZDFiCitkNWMKK2QxZDQKKzJkZS4KK2RlYTJmNQorZGU0YjVpMnQKK2QyZTFiCitkZTRibzJuCitkZWNhMm40CitkZTFjYQorZGU0Y2lsCitkZTFjMmkKK2RlNWNvbQorZGUxY28KKzJkMWVkCis0ZGVlLgorZGU1aWYKK2RlaTIKK2RlbDJpNGU0CitkZWwyaQorZGU0bDVpNXEKK2RlNWxvCitkNGVtCis1ZGVtLgorM2RlbWljCitkZW01aWMuCitkZTVtaWwKK2RlNG1vMm4zczIKK2RlMW1vCitkZW1vMm4KK2RlbW8ycjUKKzFkZW4KK2RlNG4yYTJyCitkZTFuYQorZDRlM25vCitkZW50aTVmMgorZGVuMXQKK2RlbnQyaQorZGUzbnUKK2RlMXAKK2RlM3BhCitkZXBpNAorZGUycHUKK2QzZTFxCitkNGVyMWg0Cis1ZGVyM200CitkNWVybjVpegorZGU0cjVzMgorZGVzMgorZDJlcy4KK2RlMXMyYworZGUyczVvCitkZXMzdDJpCitkMmUzc3Q0cgorZGU0c3UKK2RlMXQKK2RlMnRvCitkZTF2CitkZTJ2M2k0bAorZGUxdmkKKzRkZXkKKzRkMWYKK2Q0Z2EKK2QzZ2U0dAorZGcxaQorZDJneQorZDFoMgorNWRpLgorMWQ0aTNhCitkaWE1YgorZDRpNGNhbQorZGkxY2EKK2Q0aWNlCiszZGkyYzF0CiszZDJpZAorNWRpM2VuCitkMmllNAorZDFpZgorZGkzZ2UKK2QyaWcKK2RpNGxhMXRvCitkaTFsYQorZDFpbgorMWRpMW5hCiszZGkybmUuCitkMmluZQorNWQyaW5pCitkaTVuaXoKKzFkMmlvCitkaW81ZworZGk0cDJsMgorZDJpcAorZDRpcjIKK2RpMXJlCitkaXIxdDVpCitkaXMxCis1ZGlzaQorZDRpczN0CitkMmkxdGkKKzFkMmkxdgorZDFqCitkNWsyCis0ZDVsYQorM2RsZS4KKzNkbGVkCiszZGxlcy4KK2RsZXMyCis0ZDNsMmUyc3MKKzJkM2xvCis0ZDVsdQorMmQxbHkKK2QxbQorNGQxbjQKKzFkbworM2RvLgorZG81ZGUKKzVkb2UKKzJkNW9mCitkNG9nCitkbzRsYQorZG9sMmk0CitkbzVsbzRyCitkb201aXoKK2RvM24yYXQKK2RvMm4KK2RvMW4xYQorZG9uaTQKK2RvbzNkCitkb28yCitkbzRwNHAKK2Q0b3IKKzNkb3MKKzRkNW91dAorZG91MgorZG80dgorM2RveAorZDFwCisxZHIKK2RyYWc1bzJuMgorZHJhMmdvCis0ZHIyYWkyCitkcmU0CitkcmUyYTVyCis1ZHJlbgorZHI0aTRiCitkcmlsNAorZHJvNHAKKzRkcm93Cis1ZHJ1cGxpCitkcnUzcDJsMgorNGRyeQorMmQxczIKK2RzNHAKK2Q0c3cyCitkNHM0eQorZDJ0aAorMWR1CitkMXUxYQorZHUyYworZDF1M2NhCitkdWM1ZXIKKzRkdWN0LgorZHUyYzF0Cis0ZHVjNHQxczIKK2R1NWVsCitkdTRnCitkM3VsNGUKK2R1bTRiZQorZHU0bTFiCitkdTRuCis0ZHVwCitkdTRwZQorZDF2CitkMXcKK2QyeQorNWR5bgorZHk0czJlCitkeXM1cAorZTFhNGIKK2UzYTJjMXQKK2VhMmQxCitlYWQ1aWU0CitlMmFkaQorZWE0Z2UKK2VhNWdlcgorZWE0bAorZWFsNWVyCitlMmFsZQorZWFsM291MgorZWFtM2VyCitlNWFuZAorZWEybgorZWFyM2EKK2UyYTJyCitlYXI0YworZWFyNWVzCitlYXI0aWMKK2VhcjFpCitlYXI0aWwKK2VhcjVrCitlYXIydAorZWFydDNlCitlYTVzcAorZTNhMnNzCitlYXN0MworZWEydAorZWF0NWVuCitlYXRoM2kKK2U0YXRoCitlNWF0M2lmMgorZTRhM3R1CitlYTJ2CitlYXYzZW4KK2VhdjVpCitlYXY1bworMmUxYgorZTRiZWwuCitlMWJlbAorZTRiZTJsMXMyCitlNGJlbgorZTRiaTJ0CitlM2JyCitlNGNhMmQKK2UxY2EKK2VjYW41YworZWNhMm4KK2VjMWNhNQorZWMzYworZTFjZQorZWM1ZXMxc2EyCitlYzJlMnNzCitlMWMyaQorZTRjaWIKK2VjNWlmaWNhdAorZWNpMWZpCitlY2lmaTFjYQorZWM1aTNmMmllNAorZWM1aTFmeQorZTJjM2ltCitlMmMxaTR0CitlNWMyaXRlCitlNGNsYW0KK2UxYzRsNAorZTRjbDJ1cworZTJjb2wKK2UxY28KK2U0Y29tMW0KK2U0Y29tcGUKK2VjbzRtMXAKK2U0Y29uMWMKK2VjbzJuCitlMmNvcgorZWMzbzFyYQorZWNvNXJvCitlMWNyCitlNGNyZW0KK2VjNHRhMm4KK2UyYzF0CitlYzF0YQorZWM0dGUKK2UxY3UKK2U0Y3VsCitlYzN1MWxhCisyZTJkMmEKKzRlZDNkNAorZTRkMWVyCitlZGU0czIKKzRlZGkKK2UzZDRpM2EKK2VkM2liCitlZDNpMWNhCitlZDNpbQorZWQxaXQKK2VkaTV6Cis0ZTFkbworZTRkb2wKK2VkbzJuMgorZTRkcmkKK2UxZHIKK2U0ZHVsCitlMWR1CitlZDV1MWw0bworZWUyYworZTRlZDNpCitlZTJmCitlZWwzaQorZWU0bHkKK2VlMm0KK2VlNG5hCitlZTRwMQorZWUyczQKK2Vlc3Q0CitlZTR0eQorZTVleAorZTFmCitlNGYzZXJlCitlZmVyMQorMWU0ZjFmCitlNGZpYworZTFmaQorNWVmMmkxYzRpCitlZmlsNAorZTNmMmkybmUKK2UyZmluCitlZjVpNW4yaXRlCitlZjJpbmkKK2VmaW4yaXQKKzNlZml0CitlZm9yNWVzCitlMWZvCitlZm8ycgorZTRmdTRzZS4KK2UzZnUKK2VmMnVzCis0ZWdhbAorZTFnYQorZWdlcjQKK2VnNWliCitlZzRpYworZWc1aW5nCitlNWdpdDUKK2VnNW4KK2U0Z28uCitlMWdvCitlNGdvcworZWcxdWwKK2U1Z3VyCis1ZTFneQorZTFoNAorZWhlcjQKK2VpMgorZTVpYworZTJpNWQKK2UyaWcyCitlaTVnNGwyCitlM2k0bTFiCitlM2luM2YKK2UxaW5nCitlNWluc3QKK2UyaTJuMXMyCitlaXI0ZAorZTRpcgorZTJpdDNlCitlMmkzdGgKK2U1aTF0eQorZTFqCitlNGp1ZAorZWo1dWRpCitla2k0bgorZWsxaQorZWs0bGEKK2VrMWwKK2UxbGEKK2U0bGEuCitlNGxhYworZTNsNGFuNGQKK2VsYTJuCitlNGw1YTF0Mml2CitlNGxhdworZWxheDFhNAorZTNsZTJhCitlbDVlYnJhCitlbDJlMWIKK2VsZTNicgorNWVsZWMKK2U0bGVkCitlbDNlMWdhCitlNWxlbgorZTRsMWVyCitlMWxlczIKK2UybDJmCitlbDJpCitlM2xpYmU0CitlNGw1aWMuCitlbDNpMWNhCitlM2xpZXIKK2VsMmllNAorZWw1aTNnaWIKK2VsMmlnCitlbDRpZ2kKK2U1bGltCitlNGwzaW5nCitlM2wyaW8KK2UybGlzCitlbDVpczJoCitlM2wyaXYzCis0ZWxsYQorZWwxbAorZWw0bGFiCitlbGw0bzQKK2U1bG9jCitlbDVvZworZWwzb3AuCitlbDJzMmgKK2UybDFzMgorZWw0dGEKK2U0bHQKK2U1bHVkCitlbDV1ZworZTRtYWMKK2UxbWEKK2U0bWFnCitlNW1hMm4KK2VtNWExbmEKK2U0bTViCitlMW1lCitlMm1lbAorZTRtZXQKK2VtM2kxY2EKK2VtMmk0ZTQKK2VtNWlncmEKK2VtMmlnNAorZW1pMWdyCitlbTFpbjIKK2VtNWluZQorZW0zaTNuaQorZTRtMmlzCitlbTVpczJoCitlNW00aTJzMXMKK2VtM2l6Cis1ZW1uaXoKK2U0bTFuCitlbW80ZworZTFtbworZW1vM24yaTVvCitlbW8ybgorZW0zcGkKK2U0bTFwCitlNG11bAorZTFtdQorZW01dTFsYQorZW11M24yCitlM215CitlbjVhMm1vCitlMW5hCitlNG5hbjF0CitlbjJhMm4KK2VuY2g0ZXIKK2VuMmNoCitlbmNoZTIKK2VuM2RpYworZTVuZWEKK2U1bmVlCitlbjNlbQorZW41ZXJvCitlbjFlcgorZW41ZTFzaQorZTFuZXMKK2UybjVlc3QKK2VuM2V0cgorZTNuZTR3CitlbjVpNGMzczIKK2U1bjJpZTQKK2U1bmlsCitlM24yaTRvCitlbjNpczJoCitlbjNpdAorZTVuaTF1Cis1ZW5pegorNGU0bjFuMgorNGVubworZTRubzRnCitlNG5vcworZW4zb3YKK2VuNHN3MgorZTJuMXMyCitlbnQ1YWdlCitlbjF0CitlbjF0YQorNGVudGgxZXMKK2VudGgyZQorZW4zdTFhCitlbjV1ZgorZTNueS4KKzRlNG4zegorZTVvZgorZW8yZworZTRvaTQKK2Uzb2wKK2VvcDNhMnIKK2VvMnBhCitlMW9yCitlbzNyZQorZW81cm9sCitlb3M0CitlNG90CitlbzR0bworZTVvdXQKK2VvdTIKK2U1b3cKK2UycGEKK2UzcDRhaTIKK2VwNWFuYworZXBhMm4KK2U1cGVsCitlM3BlbjF0CitlcDVlNXQyaTF0MmlvCitlcGUydAorZXBldGkxdGkKK2VwaGU0CitlNHBsaQorZTFwMmwyCitlMXBvCitlNHByZWMKK2VwcjIKK2VwNXJlMWNhCitlNHAycjJlZAorZXAzcmUxaDQKK2UzcHJvCitlNHByb2IKK2VwNHM0aAorZTJwMXMyCitlcDV0aTViCitlMnAxdAorZTRwdTJ0CitlcDV1MXRhCitlMXEKK2VxdWkzbAorZXF1MgorZXEydWkyCitlNHEzdWkzcworZXIxYQorZTJyYTRiCis0ZXI0YW5kCitlcmEybgorZXIzYTJyCis0ZXI0YXRpLgorMmVyMWIKK2VyNGIybDIKK2VyM2NoCitlcjFjCitlcjRjaGUyCisyZTJyZS4KK2UzcmUxYTRsCitlcmU1Y28KK2VyZTNpbgorZXJlaTIKK2VyNWVsLgorZXIzZTFtbworZXI1ZTFuYQorZXI1ZW5jZQorNGVyZW5lCitlcjNlbjF0CitlcmU0cQorZXI1ZTJzcworZXIzZXMydAorZXJldDQKK2VyMWg0CitlcjFpCitlMXIyaTNhNAorNWVyaWNrMQorZTNyaWVuCitlcjJpZTQKK2VyaTRlcgorZXIzaW40ZQorZTFyMmkxbworNGVyaXQKK2VyNGkxdQorZXIyaTR2CitlNHJpMXZhCitlcjNtNAorZXI0bmlzNAorNGVyM24yaXQKKzVlcm5pegorZXIzbm80CisyZXJvCitlcjVvYgorZTVyMm9jCitlcm80cgorZXIxb3UyCitlNHIxczIKK2VyM3NldAorZXIyc2UKK2VydDNlcgorNGVyMnRsCitlcjN0dzQKKzRlcnUKK2VydTR0Cis1ZXJ3YXUKK2VyMXcKK2UxczRhMgorZTRzYTJnZS4KK2U0c2FnZXMKK2VzMmMKK2UyczFjYQorZXM1Y2EybgorZTNzY3IKK2VzNWN1CitlMXMyZQorZTJzZWMKK2VzNWUxY3IKK2U0czVlbmMKK2U0c2VydC4KK2U0c2VyNHQxczIKK2U0c2VyMXZhCis0ZXMyaAorZTNzaGEKK2VzaDVlMm4KK2Uxc2kKK2Uyc2ljCitlMnMyaWQKK2VzNWkxZGVuCitlNHM1aWcxbjRhCitlczJpZworZTJzNWltCitlMnM0aTRuCitlc2lzNHRlCitlMXNpcworZTVzaTR1CitlNXNraW4KK2VzazIKK2VzazFpCitlczRtaQorZTJzMW0KK2Uyc29sCitlMXNvCitlczNvbHUKK2Uyc28ybgorZXM1bzFuMWE0CitlMXNwCitlMnMzcGVyCitlczVwaTFyYQorZXNwNGlyCitlczRwcmUKK2VzcHIyCisyZTJzcworZXM0c2k0YgorZXMxc2kKK2VzdGEybjQKK2VzMXRhCitlczN0MmlnCitlc3QyaQorZXM1dGltCis0ZXMydG8KK2Uzc3RvMm4KKzJlc3Q0cgorZTVzdHJvCitlc3RydWM1CitlMnN1MnIKK2Uxc3UKK2VzNXVyMXI0CitlczR3MgorZTJ0YTRiCitlMXRhCitlM3RlbjRkCitlM3RlbworZXRob2QzCitldDFpYworZTV0aWRlCitldDJpZAorZTJ0MWluNAorZXQyaTRubworZTV0NGlyCitlNXQyaTF0MmlvCitldGkxdGkKK2V0NWkxdDJpdgorNGUydDFuMgorZXQ1bzFuMWEKK2UxdG8KK2V0bzJuCitlM3RyYQorZTN0cmUKK2V0M3JpYworZXQ1cmlmCitldDNyb2cKK2V0NXJvcworZXQzdTFhCitlMXR1CitldDV5bQorZTF0eQorZTR0NXoKKzRldQorZTV1bgorZTN1cAorZXUzcm8KK2UydXM0CitldXRlNAorZXV0aTVsCitlNHUxdDJpCitldTV0cgorZXZhMnA1CitlMXZhCitlMnZhcworZXY1YXN0CitlNXZlYQorZXYzZWwxbAorZXZlNGwzbworZTV2ZW5nCitldmVuNGkKK2V2MWVyCitlNXYyZXIxYgorZTF2aQorZXYzaWQKK2Uydmk0bAorZTR2MWluCitlM3YyaTR2CitlNXZvYworZTV2dQorZTF3YQorZTR3YWcKK2U1d2VlCitlM3doCitld2lsNQorZXdpMgorZXczaW40ZworZTN3aXQKKzFleDNwCis1ZXkxYworNWV5ZS4KK2V5czQKKzFmYQorZmEzYjJsMgorZjRhYjNyCitmYTRjZQorNGZhZworZmE0aTRuNAorZmFpMgorZmFsMmw1ZQorZmFsMWwKKzRmNGE0bWEKK2ZhbTVpcworNWYyYTJyCitmYXI1dGgKK2ZhM3RhCitmYTN0aDJlCitmNGF0aAorNGZhMXRvCitmYXU0bHQ1CitmYXU0bDIKKzRmNWIKKzRmZAorNGZlLgorZmVhczQKK2ZlNGF0aDMKK2ZlYTJ0CitmMmU0YgorNGZlMWNhCis1ZmUyYzF0CisyZmVkCitmZTNsMmkKK2ZlNG1vCitmZW4yZAorZmVuMWQ1ZQorZmVyMQorNWZlcjFyNAorZmV2NAorNGYxZgorZjRmZXMKK2Y0ZjJpZTQKK2YxZmkKK2Y1ZjJpbi4KK2YyZmluCitmMmY1aXMKK2Y0ZjJseTUKK2ZmNGwyCitmMmZ5Cis0ZmgKKzFmaQorZjJpM2EKKzJmM2ljLgorNGYzaWNhbAorZmkxY2EKK2YzaWNhMm4KKzRmaWNhdGUKK2YzaTFjZW4KK2ZpM2NlcgorZjJpMWM0aQorNWZpM2MyaTFhCis1ZmljMmllNAorNGZpNGMzczIKK2ZpM2N1CitmaTVkZWwKK2YyaWQKK2ZpZ2h0NQorZjJpZworZmlsNWkKK2ZpbDJsNWluNAorZmlsMWwKK2ZpbGwyaQorNGZpMWx5CisyZmluCis1ZmkxbmEKK2Y0aW4yZDUKK2YyaTJuZQorZjFpbjNnCitmMmk0bjRuMgorZmlzNHQyaQorZjRsMgorZjVsMmUyc3MKK2ZsZXMyCitmbGluNAorZmxvM3JlCitmMmx5NQorNGZtCis0Zm4KKzFmbworNWZvMm4KK2ZvbjRkZQorZjJvbmQKK2ZvbjR0CitmbzJyCitmbzVyYXQKK2ZvMXJhCitmb3I1YXkKK2ZvcmU1dAorZm9yNGkKK2ZvcjF0NWEKK2ZvczUKKzRmNXAKK2ZyYTR0CitmNXJlYQorZnJlczVjCitmcmkyCitmcmlsNAorZnJvbDUKKzJmM3MKKzJmdAorZjR0bworZjJ0eQorM2Z1CitmdTVlbAorNGZ1ZworZnU0bWluCitmdTFtaQorZnU1bmUKK2Z1M3JpCitmdXNpNAorZjJ1cworZnUyczRzCis0ZnUxdGEKKzFmeQorMWdhCitnYTJmNAorNWdhbC4KKzNnYWwxaQorZ2EzbG8KKzJnYW0KK2dhNW1ldAorZzVhMm1vCitnYW41aXMKK2dhMm4KK2dhM25pegorZ2FuaTV6YTEKKzRnYW5vNAorZ2FyNW40CitnMmEycgorZ2Eyc3M0CitnNGF0aDMKKzRnYTF0Mml2Cis0Z2F6CitnM2IKK2dkNAorMmdlLgorMmdlZAorZ2VlejQKK2dlbDRpbgorZ2VsMmkKK2dlNWxpcworZ2U1bDFpegorNGdlMWx5CisxZ2VuCitnZTRuMmF0CitnZTFuYQorZzVlNW5pegorNGc0ZW5vCis0Z2VueQorMWdlbworZ2Uzb20KK2c0ZXJ5Cis1Z2Uxc2kKK2dldGg1Cis0Z2UxdG8KK2dlNHR5CitnZTR2Cis0ZzFnMgorZzJnZQorZzNnZXIKK2dnbHU1CitnZ2wyCitnMWdvNAorZ2gzaW4KK2doNW91dAorZ2hvdTIKK2doNHRvCis1Z2kuCisxZzJpNGEKK2dpMmE1cgorZzFpYworNWdpM2MyaTFhCitnMmkxY2kKK2c0aTFjbworZ2llbjUKK2cyaWU0Cis1Z2llcy4KK2dpbDQKK2czaTFtZW4KKzNnNGluLgorZzRpbjVnZQorNWc0aTJuMXMyCis1ZzJpbworM2c0aXIKK2dpcjRsCitnM2lzMWwyCitnaTR1Cis1ZzJpdgorM2dpegorZ2wyCitnbGE0CitnbDJhZDVpCitnbGEyZAorNWdsYXMKKzFnbGUKK2dsaTRiCitnM2wyaWcKKzNnbG8KK2dsbzNyCitnMW0KK2c0bXkKK2cxbjRhCitnNG5hLgorZ25lNHQ0dDIKK2cxbmkKK2cybjFpbgorZzRuMmk0bworZzFubworZzRubzRuCisxZ28KKzNnby4KK2dvYjUKKzVnb2UKKzNnNG80ZworZ28zaXMKK2dvaTIKK2dvMm4yCis0ZzNvM24xYQorZ29uNWRvNQorZzJvbmQKK2dvM25pCis1Z29vMgorZ281cml6Citnb3I1b3UyCis1Z29zLgorZ292MQorZzNwCisxZ3IKKzRncmExZDJhCitncmEyZAorZzRyMmFpMgorZ3JhMm4yCis1Z3JhNHBoLgorZzVyYTNwaDRlcgorNWdyYXBoMWljCitncjRhcGhpCis0ZzNyYTFwaHkKKzRncmF5CitncmU0bgorNGdyZXNzLgorZ3IyZTJzcworNGdyaXQKK2c0cm8KK2dydWY0CitnczIKK2c1c3RlCitndGgzCitndTRhCiszZ3VhcjJkCitndTJhMnIKKzJndWUKKzVndWk1dAorZzJ1aTIKKzNndW4KKzNnMnVzCis0Z3U0dAorZzN3CisxZ3kKKzJnNXkzbgorZ3k1cmEKK2gzYWI0bDIKK2hhMmNoNAoraGFlNG0KK2hhZTR0CitoNWFndQoraGEzbGEKK2hhbGEzbQoraGE0bQoraGFuNGNpCitoYTJuCitoYW40Y3kKKzVoYW5kLgoraDRhbmQKK2gyYW40ZworaGFuZzVlcgoraGFuMWc1bworaDVhNW5pegoraGE0bjRrMgoraGFuNHRlCitoYW4xdAoraGEycDNsMgoraGEycDV0CitoYTNyYTJuCitoMmEycgoraGE1cjJhcworaGFyMmQKK2hhcmQzZQoraGFyNGxlNAoraGFyMWwKK2hhcnA1ZW4KK2hhcjJwCitoYXI1dGVyCitoYTJzNXMKK2hhdW40Cis1aGF6CitoYXozYTEKK2gxYgorMWhlYTJkMQorM2hlMmEycgoraGU0Y2EybgoraGUxY2EKK2g1ZWNhdAoraDRlZAoraDRlNWRvNQoraGUzbDRpCitoZWw0bGlzCitoZWwxbAoraGVsbDJpCitoZWw0bHkKK2g1ZWxvCitoZTRtNHAKK2hlMm4KK2hlMW5hNAoraGVuNWF0CitoZTFvNXIKK2hlcDUKK2g0ZXIxYQoraGVyYTNwCitoZXI0YmEKK2gyZXIxYgoraGVyZTVhCitoM2VybgoraDVlcjFvdTIKK2gyZXJvCitoM2VyeQoraDFlcworaGUyczVwCitoZTR0CitoZTJ0NGVkCitoNGV1NAoraDFmCitoMWgKK2hpNWEybgoraDJpMWEKK2hpNGNvCitoaWdoNQoraDJpZworaDRpbDIKK2hpbWVyNAoraDRpMW5hCitoaW9uNGUKK2gyaW8KK2hpbzJuCitoMmk0cAoraGlyNGwKK2g0aXIKK2hpM3JvCitoaXI0cAoraGlyNHI0CitoaXMzZWwKK2g0aXNlCitoNGkyczRzCitoaXRoNWVyCitoMml0aAoraGl0aDJlCitoMmkydgorNGhrCis0aDFsNAoraGxhMm40CitoMmxvCitobG8zcmkKKzRoMW0KK2htZXQ0CisyaDFuCitoNW9kaXoKK2g1bzJkMXMyCitobzRnCitobzFnZTQKK2hvbDVhMnIKK2hvMWxhCiszaG9sNGUKK2hvNG1hCitobzJtZTMKK2hvMW40YQoraG8ybgoraG81bnkKKzNob29kCitob28yCitob28ybjQKK2hvcjVhdAoraG8xcmEKK2hvNXIyaXMKK2hvcnQzZQoraG81cnUKK2hvczRlCitobzVzZW4KK2hvczFwCisxaG8ydXMKK2hvdTIKK2hvdXNlMworaG92NWVsCis0aDVwCis0aHI0CitocmVlNQoraHJvNW5pegoraHJvMm4KK2hybzNwbworNGgxczIKK2g0czJoCitoNHQyYTJyCitoMXRhCitodDFlbgoraHQ1ZXMKK2g0dHkKK2h1NGcKK2h1NG1pbgoraHUxbWkKK2h1bjVrZQoraHU0bmsyCitodW40dAoraHVzM3Q0CitoMnVzCitodTR0CitoMXcKK2g0d2FyNHQKK2h3MmEycgoraHkzcGUKK2h5M3BoCitoeTJzCisyaTFhCitpMmFsCitpYW00CitpYW01ZTF0ZQoraTJhMm4KKzRpYW5jCitpYW4zaQorNGlhbjR0CitpYTVwZQoraWEyc3M0CitpNGExdDJpdgoraWE0dHJpYworaWExdHIKK2k0YTJ0dQoraWJlNAoraWIzZXIxYQoraWI1ZXJ0CitpYjVpMWEKK2liM2luCitpYjVpdC4KK2liaTJ0CitpYjVpdGUKK2kxYjJsMgoraWIzbGkKK2k1Ym8KK2kxYnIKK2kyYjVyaQoraTVidTRuCis0aWNhbQoraTFjYQorNWljYXAKKzRpYzJhMnIKK2k0Y2FyLgoraTRjYXJhCitpY2FzNQoraTRjYXkKK2ljY3U0CitpYzNjCis0aWNlbworNGkyY2gKKzJpMWNpCitpNWMyaWQKK2ljNWkxbmEKK2kyY2luCitpMmMyaXAKK2ljM2kxcGEKK2k0YzFseTQKK2kxYzRsNAoraTJjNW9jCitpMWNvCis0aTFjcgorNWljcmEKK2k0Y3J5CitpYzR0ZQoraTJjMXQKK2ljMXR1MgoraWM0dDN1MWEKK2ljM3UxbGEKK2ljNHVtCitpYzV1bworaTNjdXIKKzJpZAoraTRkYWkyCitpMWQyYQoraWQ1YW5jCitpZGEybgoraWQ1ZDQKK2lkZTNhNGwKK2lkZTRzMgoraTJkaQoraWQ1aTJhMm4KK2kxZDRpM2EKK2lkaTRhMnIKK2k1ZDJpZTQKK2kxZDNpbworaWRpNW91MgoraWQxaXQKK2lkNWkxdQoraTNkbGUKK2k0ZG9tCitpMWRvCitpZDNvdworaTRkcgoraTJkdQoraWQ1dW8KKzJpZTQKK2llZDRlCis1aWU1Z2EKK2llMmxkMworaWUxbjVhNAoraWVuNGUKK2k1ZTRuMW4yCitpM2VudDJpCitpZW4xdAoraTFlci4KK2kzZXMyYworaTFlc3QKK2kzZXQKKzRpZi4KK2lmNWVybworaWZlcjEKK2lmZjVlbgoraTRmMWYKK2lmNGZyCis0aTJmM2ljLgoraTFmaQoraTNmMmllNAoraTNmNGwyCis0aTJmdAorMmlnCitpZ2E1YgoraTFnYQoraWczZXIxYQoraWdodDNpCis0aWdpCitpM2dpYgoraWczaWw0CitpZzNpbgoraWczaXQKK2k0ZzRsMgoraTJnbworaWczb3IKK2lnNW90CitpNWdyZQoraTFncgoraWcydTVpMgoraWcxdXIKK2kzaAorNGk1aTQKK2kzagorNGlrCitpMWxhCitpbDNhNGIKK2k0bDRhZGUKK2lsYTJkCitpMmw1YW0KK2lsYTVyYQoraWwyYTJyCitpM2xlZworaWwxZXIKK2lsZXY0CitpMmw1ZgoraWwxaQoraWwzaTFhCitpbDJpYgoraWwzaW8KK2lsNGlzdAorMmlsMWl0CitpbDJpegoraWxsNWFiCitpbDFsCis0aTJsMW4yCitpbDNvMXEKK2lsNHR5CitpNGx0CitpbDV1cgoraWwzdgoraTRtYWcKK2kxbWEKK2ltM2FnZQoraW1hNXJ5CitpbTJhMnIKK2ltZW50MmE1cgoraTFtZW4KK2kzbWVuMXQKK2ltZW4xdGEKKzRpbWV0CitpbTFpCitpbTVpMWQ0YQoraW0yaWQKK2ltaTVsZQoraTVtMmluaQorNGltaXQKK2ltNG5pCitpNG0xbgoraTNtbzJuCitpMW1vCitpMm11CitpbTN1MWxhCisyaW4uCitpNG4zYXUKK2kxbmEKKzRpbmF2CitpbmNlbDQKK2luM2NlcgorNGluZAoraW41ZGxpbmcKKzJpbmUKK2kzbmVlCitpbjRlcjRhMnIKK2luMWVyCitpbmVyMWEKK2k1bjJlMnNzCitpMW5lcworNGluMWdhCis0aW5nZQoraW41Z2VuCis0aW5naQoraW41Z2xpbmcKK2luZ2wyCis0aW4xZ28KKzRpbjFndQorMmluaQoraTVuaS4KK2k0bjRpMWEKK2luM2k0bworaW4xaXMKK2k1bmk0dGUuCitpbjJpdAoraW4yaXRlCis1aTNuMmkxdDJpbworaW5pMXRpCitpbjNpMXR5Cis0aTRuazIKKzRpNG4xbAorMmk0bjFuMgorMmkxbm8KK2k0bm80YworaW5vNHMKK2k0bm90CisyaTJuMXMyCitpbjNzZQoraW5zdTFyNWEKK2luMXN1CitpbnN1MnIKKzJpbnQuCitpbjF0CisyaW40dGgKK2luMXUKK2k1bjJ1cworNGlueQorMmlvCis0aW8uCitpbzFnZTQKK2lvMmdyCitpMW9sCitpbzRtCitpb24zYXQKK2lvMm4KK2lvMW4xYQoraW9uNGVyeQoraW9uMWVyCitpb24zaQoraTJvNXBoCitpb3IzaQoraTRvcworaTRvNXRoCitpNW90aQoraW80dG8KK2k0b3VyCitpb3UyCisyaXAKK2lwZTQKK2lwaHIyYXM0CitpcDRocjQKK2lwM2kKK2lwNGljCitpcDRyZTQKK2lwcjIKK2lwM3VsCitpM3F1YQoraXF1MgoraXE1dWUxZgoraXEzdTJpZAoraXEydWkyCitpcTN1aTN0Cis0aXIKK2kxcmEKK2kycmE0YgoraTRyYWMKK2lyZDVlCitpcmU0ZGUKK2kycjJlZAoraTRyZTFmCitpNHJlbDQKK2k0cmVzCitpcjVnaQoraXJnMgoraXIxaQoraXJpNWRlCitpcjJpZAoraXI0aXMKK2lyaTN0dQorNWk1cjJpegoraXI0bWluCitpcjFtCitpcm80ZworNWlyb24uCitpcm8ybgoraXI1dWwKKzJpcy4KK2lzNWFnCitpc2EyCitpczNhMnIKK2lzYXM1CisyaXMxYworaXMzY2gyCis0aXNlCitpczNlcgorM2k0czNmCitpczVoYTJuCitpczJoCitpczNobzJuMworaXNobzQKK2lzaDVvcAoraXMzaTFiCitpczJpNGQKK2k1c2lzCitpczVpMXQyaXYKK2lzaTF0aQorNGlzNGsyCitpc2xhMm40CitpczFsMgorNGlzNG0xczIKK2kyczFtCitpMnNvCitpc281bWVyCitpM3NvbQoraXNvMm1lCitpczFwCitpczJwaQoraXM0cHkKKzRpMnMxcworaXM0c2FsCitpczFzYTIKK2lzc2VuNAoraXM0czFlNHMKK2lzNHRhLgoraXMxdGEKK2lzMXRlCitpczF0MmkKK2lzdDRseQoraXMydGwKKzRpc3RyYWwKK2lzdDRyCitpczF0cmEKK2kyc3UKK2lzNXVzCis0aTN0YS4KK2kxdGEKK2l0YTRiaQoraTJ0YWIKK2k0dGFnCis0aXRhNW0KK2kzdGEybgoraTN0YXQKKzJpdGUKK2l0M2VyMWEKK2k1dGVyMWkKK2l0NGVzCisyaXRoCitpMXRpCis0aTF0MmkxYQorNGkydGljCitpdDNpMWNhCis1aTV0aWNrMQoraTJ0M2lnCitpdDVpbDFsCitpMnRpbQorMmkxdDJpbworNGl0aXMKK2k0dGkyczRtCitpMnQ1bzVtCitpMXRvCis0aXRvMm4KK2k0dHJhbQoraTF0cmEKK2l0NXJ5Cis0aTR0M3QyCitpdDN1MWF0CitpMXR1CitpdHUxYQoraTV0dWQyCitpdDN1bAorNGl0ei4KK2k0dHoKK2kxdQorMml2CitpdjNlbDFsCitpdjNlbi4KK2k0djNlci4KK2k0dmVycy4KK2l2ZTRyMXMyCitpdjVpbC4KK2kydmlsCitpdjVpbworaXYxaXQKK2k1dm9yZQoraXYzbzNybworaTR2M290Cis0aTV3CitpeDRvCis0aXkKKzRpejJhMnIyCitpemExCitpMnoxaTQKKzVpem9uMXQKK2kxem8KK2l6bzJuCis1amEKK2phYzRxCitqYTRwCisxamUKK2plNHI1czIKKzRqZXM0dDJpZTQKK2plc3QyaQorNGplczJ0eQoramV3Mworam80cAorNWp1ZGcKKzNrYS4KK2szYWIKK2s1YWcKK2thaXM0CitrYWkyCitrYWw0CitrMWIKK2syZWQKKzFrZWUKK2tlNGcKK2tlNWwyaQorazNlbjRkCitrMWVyCitrZXM0CitrM2Uyc3QuCitrZTR0eQorazNmCitraDQKK2sxaQorNWtpLgorNWsyaWMKK2s0aWwxbAora2lsbzUKK2s0aW0KK2s0aW4uCitraW40ZGUKK2s0aW5kCitrNWk1bjJlMnNzCitrMmluZQora2kxbmVzCitraW40ZworazJpNHAKK2tpczQKK2s1aXMyaAora2s0CitrMWwKKzRrM2xleQorNGsxbHkKK2sxbQorazVuZXMKKzFrMm5vCitrbzVyCitrb3MyaDQKK2szb3UyCitrcm81bgorNGsxczIKK2s0c2MKK2tzNGwyCitrNHM0eQorazV0CitrMXcKK2xhYjNpYworbDRhYm8KK2w0YTJjaTQKK2w0YWRlCitsYTJkCitsYTNkMnkKK2xhZzRuCitsYTJtM28KKzNsNGFuZAorbGEybgorbGFuNGRsCitsYW41ZXQKK2xhbjR0ZQorbGFuMXQKK2xhcjRnMgorbDJhMnIKK2xhcjNpCitsYXM0ZQorbGE1dGEybgorbGEydGEKKzRsYXRlbDJpNAorNGxhMXQyaXYKKzRsYXYKK2xhNHY0YQorMmwxYgorbGJpbjQKKzRsMWMyCitsY2U0CitsM2NpCisybGQKK2wyZGUKK2xkNGVyZQorbGQ0ZXIxaQorbGRpNAorbGQ1aXMxCitsM2RyCitsNGRyaQorbGUyYQorbGU0YmkKK2wyZTFiCitsZTJmdDUKK2xlMWYKKzVsZWcuCis1bGU0ZzFnMgorbGU0bWF0CitsZTFtYQorbGVtNWF0MWljCis0bGVuLgorM2xlbmMKKzVsZTJuZS4KKzFsZW4xdAorbGUzcGgKK2xlNHByMgorbGUycmE1YgorbGVyMWEKK2xlcjRlCiszbGVyZzIKKzNsNGVyMWkKK2w0ZXJvCitsZXMyCitsZTVzMWNvCitsZXMyYworNWxlc3EKKzNsMmUyc3MKKzVsZXNzLgorbDNlMXZhCitsZXY0ZXIuCitsZXYxZXIKK2xldjRlcjFhCitsZXY0ZTRyMXMyCiszbGV5Cis0bGV5ZQorMmxmCitsNWZyCis0bDFnNAorbDVnYQorbGcyYTJyMworbDRnZXMKK2wxZ28zCisybDNoCitsaTRhZworbDJpMWEKK2xpMmFtNAorbGlhcjVpegorbGkyYTJyCitsaWFyMWkKK2xpNGFzCitsaTRhMXRvCitsaTViaQorNWxpYzJpbworbDJpMWNpCitsaTRjb3IKK2xpMWNvCis0bGk0YzNzMgorNGxpY3QuCitsaTJjMXQKK2w0aWN1CitsM2kxY3kKK2wzaTFkMmEKK2wyaWQKK2xpZDVlcgorM2xpMmRpCitsaWYzZXIxCitsNGk0ZjFmCitsaTRmNGwyCis1bGlnYXRlCitsMmlnCitsaTFnYQorM2xpZ2gKK2xpNGdyYQorbGkxZ3IKKzNsNGlrCis0bDRpNGwKK2xpbTRiMmwyCitsaTRtMWIKK2xpbTNpCitsaTRtbworbDRpNG00cAorbDRpMW5hCisxbDRpbmUKK2xpbjNlYQorbDJpbjNpCitsaW5rNWVyCitsNGk0bmsyCitsaTVvZworbDJpbworNGw0aXEKK2xpczRwCitsMWl0CitsMml0LgorNWxpdDNpMWNhCitsaTF0aQorbDRpMnRpYworbDVpNXRpNGMzczIKK2xpdjNlcgorbDJpdgorbDFpegorNGxqCitsa2EzCitsM2thbDQKK2xrYTR0CitsMWwKK2w0bGF3CitsMmxlCitsNWxlMmEKK2wzbGVjCitsM2xlZworbDNsZWwKK2wzbGU0bgorbDNsZTR0CitsbDJpCitsMmxpbjQKK2w1bDRpMW5hCitsbDRvCitsbG9xMnVpNQorbGxvMXEKK2xsb3F1MgorbDJsNW91dAorbGxvdTIKK2w1bG93CisybG0KK2w1bWV0CitsbTNpbmcKK2w0bW8yZDEKK2wxbW8KK2xtbzJuNAorMmwxbjIKKzNsby4KK2xvYjVhbAorbG80Y2kKKzRsb2YKKzNsb2cxaWMKK2w1bzFnbworM2xvZ3UKK2xvbTNlcgorbG8ybWUKKzVsb25nCitsbzJuCitsb240aQorbDNvM25pegorbG9vZDUKK2xvbzIKKzVsbzRwZS4KK2xvcDNpCitsM280cDFtCitsbzFyYTQKK2xvNHJhMXRvCitsbzVyMmllNAorbG9yNW91MgorNWxvcy4KK2xvczVldAorNWxvczVvM3BoaXoKK2xvMnNvCitsb3M0b3AKK2xvczJvcGgKKzVsb3M1bzFwaHkKK2xvczR0CitsbzR0YQorbG91bjVkCitsb3UyCisybG91dAorNGxvdgorMmxwCitscGE1YgorbDFwYQorbDNwaGEKK2w1cGhpCitscDVpbmcKK2xwaTJuCitsM3BpdAorbDRwMmwyCitsNXByMgorNGwxcgorMmwxczIKK2w0c2MKK2wyc2UKK2w0czJpZTQKKzRsdAorbHQ1YWcKK2wxdGEKK2x0YW5lNQorbHRhMm4KK2wxdGUKK2x0ZW40CitsdGVyMWE0CitsdGgzaQorbDV0aWVzLgorbHQyaWU0CitsdGlzNAorbDF0cgorbDF0dTIKK2x0dTFyM2EKK2x1NWEKK2x1M2JyCitsdTJjaDQKK2x1M2NpCitsdTNlbgorbHVmNAorbHU1aWQKK2wydWkyCitsdTRtYQorNWx1MW1pCitsNXVtbi4KK2x1NG0xbgorNWx1bTNuNGkxYQorbHUzbworbHVvM3IKKzRsdXAKK2x1MnNzNAorbDJ1cworbHVzM3RlCisxbHV0CitsNXZlbgorbDV2ZXQ0CisybDF3CisxbHkKKzRseWEKKzRseTFiCitseTVtZTQKK2x5M25vCisybHlzNAorbDV5M3MyZQorMW1hCisybWFiCittYTJjYQorbWE1Y2gyaW5lCittYTJjaAorbWE0Y2gxaW4KK21hNGM0bDQKK21hZzVpbgorbWFnMWkKKzVtYWcxbgorMm1haAorbWEyaWQ1CittYWkyCis0bWEybGQKK21hM2wyaWcKK21hbDFpCittYTVsaW4KK21hbDRsMmkKK21hbDFsCittYWw0dHkKK21hNGx0Cis1bWEzbjRpMWEKK21hMm4KK21hbjVpcworbWFuM2l6Cis0bWFwCittYTVyaTJuZS4KK20yYTJyCittYXIxaQorbWFyMmluNGUKK21hNXIyaXoKK21hcjRseQorbWFyMWwKK21hcjN2CittYTVzY2UKK21hczRlCittYXMxdAorNW1hdGUKK200YXRoMworbWEzdGlzCis0bWF0aTN6YTEKK21hMXRpegorNG0xYgorbTFiYTR0NQorbTViaWwKK200YjNpbmcKK21iMmk0dgorNG01YworNG1lLgorMm1lZAorNG1lZC4KKzVtZTNkNGkzYQorbTRlZGkKK21lM2QyaWU0CittNWU1ZDJ5CittZTJnCittZWw1bzJuCittZTRsNHQKK21lMm0KK21lMW0xbzMKKzFtZW4KK21lMW40YQorbWVuNWFjCittZW40ZGUKKzRtZW5lCittZW40aQorbWUybjFzNAorbWVuMXN1NQorM21lbjF0CittZW40dGUKK21lNW8ybgorbTVlcjFzYTIKK21lNHIxczIKKzJtZXMKKzNtZXN0MmkKK21lNHRhCittZXQzYTJsCittZTF0ZQorbWU1dGhpCittNGV0cgorNW1ldDNyaWMKK21lNXRyMmllNAorbWUzdHJ5CittZTR2Cis0bTFmCisybWgKKzVtaS4KK20yaTNhCittaTFkNGEKK20yaWQKK21pZDRnCittMmlnNAorM21pbDNpMWEKK21pbDFpCittNWk1bDJpZTQKK200aWwxbAorbWkxbjRhCiszbTRpbmQKK201aTNuZWUKK20yaW5lCittNGluZ2wyCittaW41Z2xpCittNWluZzFseQorbWluNHQKK200aW4xdQorbWlvdDQKK20yaW8KK20yaXMKK21pNHM0ZXIuCittNGlzZQorbWlzM2VyCittaXM1bDIKK21pczR0MmkKK201aTRzdHJ5CittaXN0NHIKKzRtMml0aAorbTJpegorNG1rCis0bTFsCittMW0KK21tYTVyeQorbTFtYQorbW0yYTJyCis0bTFuCittMW40YQorbTRuMWluCittbjRvCisxbW8KKzRtb2NyCis1bW9jNXJhMXRpegorbW8yZDEKK21vNGdvCittb2lzMgorbW9pMgorbW80aTVzZQorNG0yb2sKK21vNWxlc3QKK21vbGVzMgorbW8zbWUKK21vbjVldAorbW8ybgorbW9uNWdlCittbzNuNGkzYQorbW9uNGkyczFtCittb24xaXMKK21vbjRpc3QKK21vM25pegorbW9ub2w0CittbzNueS4KK21vMnIKKzRtbzVyYS4KK21vMXJhCittb3MyCittbzVzZXkKK21vM3NwCittNG90aDMKK201b3VmCittb3UyCiszbW8ydXMKK21vMnYKKzRtMXAKK21wYXJhNQorbTFwYQorbXAyYTJyCittcGE1cmFiCittcDRhNHI1aQorbTNwZTJ0CittcGhhczQKK20ycGkKK21wMmk0YQorbXA1aWVzCittcDJpZTQKK200cDFpMm4KK201cDRpcgorbXA1aXMKK21wbzNyaQorbTFwNG9yCittcG9zNWl0ZQorbTFwb3MKK200cG8ydXMKK21wb3UyCittcG92NQorbXA0dHIKK20ycDF0CittMnB5Cis0bTNyCis0bTFzMgorbTRzMmgKK201c2kKKzRtdAorMW11CittdWwyYTVyNAorbXUxbGEKKzVtdTRsdAorbXVsMXRpMworM211bQorbXVuMgorNG11cAorbXU0dQorNG13CisxbmEKKzJuMWEyYgorbjRhYnUKKzRuYWMuCituYTRjYQorbjVhMmMxdAorbmFnNWVyLgorbmFrNAorbmE0bDFpCituYTVsMmkxYQorNG5hNGx0CituYTVtaXQKK24yYTJuCituYW4xY2k0CituYW40aXQKK25hNG5rNAorbmFyM2MKK24yYTJyCis0bmFyZQorbmFyM2kKK25hcjRsCituNWFyMW0KK240YXMKK25hczRjCituYXM1dDJpCituMmF0CituYTN0YTJsCituYTJ0YQorbmF0NW81bTJpegorbmEydG9tCituYTF0bworbjJhdQorbmF1M3NlCituYTJ1cworM25hdXQKK25hdjRlCis0bjFiNAorbmMyYTJyNQorbjFjYQorbjRjZXMuCituM2NoYQorbjJjaAorbjVjaGVvCituY2hlMgorbjVjaDRpbDIKK24zY2hpcworbjJjMWluCituMWNpCituMmM0aXQKK25jb3UxcjVhCituMWNvCituY291MgorbjFjcgorbjFjdQorbjRkYWkyCituMWQyYQorbjVkYTJuCituMWRlCituZDVlMnN0LgorbmRlczIKK25kaTRiCituNWQyaWYKK24xZGl0CituM2RpegorbjVkdTJjCituMWR1CituZHU0cgorbmQyd2UKK25kMXcKKzJuZS4KK24zZTJhMnIKK24yZTJiCituZWIzdQorbmUyYworNW5lY2sxCisybmVkCituZTRnYXQKK25lMWdhCituZTRnNWExdDJpdgorNW5lZ2UKK25lNGxhCituZWw1aXoKK25lbDJpCituZTVtaQorbmU0bW8KKzFuZW4KKzRuZW5lCiszbmVvCituZTRwbworbmUycQorbjFlcgorbmUycmE1YgorbmVyMWEKK240ZXIzYTJyCituMmVyZQorbjRlcjVpCituZXI0cjQKKzFuZXMKKzJuZXMuCis0bmUxc3AKKzJuZXN0Cis0bmVzNHcyCiszbmV0MWljCituZTR2CituNWV2ZQorbmU0dworbjNmCituNGdhYgorbjFnYQorbjNnZWwKK25nZTRuNGUKK24xZ2VuCituNWdlcmUKK24zZ2VyMWkKK25nNWhhCituM2dpYgorbmcxaW4KK241Z2l0CituNGdsYTQKK25nbDIKK25nb3Y0CituMWdvCituZzVzMmgKK25nczIKK24xZ3UKK240Z3VtCituMmd5Cis0bjFoNAorbmhhNAorbmhhYjMKK25oZTQKKzNuNGkxYQorbmkzYTJuCituaTRhcAorbmkzYmEKK25pNGIybDIKK24yaTRkCituaTVkaQorbmk0ZXIKK24yaWU0CituaTJmaQorbmk1ZmljYXQKK25pZmkxY2EKK241aTFncgorbjJpZworbjRpazQKK24xaW0KK25pM20yaXoKK25pbTFpCituMWluCis1bmkybmUuCituMmluZQorbmluNGcKK24yaTRvCis1bjJpcy4KK25pczR0YQorbjJpdAorbjRpdGgKKzNuMmkxdDJpbworbmkxdGkKK24zaXRvcgorbmkxdG8KK25pM3RyCituMWoKKzRuazIKK241azJlcm8KK25rMWVyCituM2tldAorbmszaW4KK25rMWkKK24xazFsCis0bjFsCituNW0KK25tZTQKK25tZXQ0Cis0bjFuMgorbm5lNAorbm5pM2FsCituM240aTFhCitubjJpNHYKK25vYjRsMgorbm8zYmxlCituNW8xYzRsNAorNG4zbzJkCiszbm9lCis0bm9nCitubzFnZTQKK25vaXM1aQorbm9pMgorbm81bDRpCis1bm9sMW8xZ2lzCiszbm9taWMKK241bzVtMml6CitubzRtbworbm8zbXkKK25vNG4KK25vbjRhZworbm8xbjFhCitub241aQorbjVvbml6Cis0bm9wCis1bm9wNW81bDJpCitubzJyNWFiCitubzFyYQorbm80cmFyeQorbm9yMmEycgorNG5vczJjCitub3M0ZQorbm9zNXQKK25vNXRhCisxbm91MgorM25vdW4KK25vdjNlbDMKK25vd2wzCituMXA0CitucGk0CitucHJlNGMKK25wcjIKK24xcQorbjFyCitucnU0CisybjFzMgorbjJzNWFiCituc2EyCituc2F0aTQKK25zNGMKK24yc2UKK240czNlNHMKK25zMmlkMQorbnMyaWc0CituMnMxbDIKK24yczNtCituNHNvYworbjFzbworbnM0cGUKK241c3BpCituc3RhNWIybDIKK25zMXRhCituczJ0YWIKK24xdAorbjJ0YTRiCituMXRhCitudGU0cjNzMgorbnQyaQorbjV0aTJiCitudGk0ZXIKK250MmllNAorbnRpMmYyCituM3QyaW5lCituMnQxaW4KK240dDNpbmcKK250Mmk0cAorbnRyb2w1bDJpCitudHJvbDFsCituNHQ0czIKK250dTNtZQorbjF0dQorbjN0dW0KK251MWEKK251NGQKK251NWVuCitudWY0ZmUKK251NGYxZgorbjN1aTRuCituMnVpMgorM251M2l0CituNHVtCitudTFtZQorbjV1MW1pCiszbnU0bgorbjN1bworbnUzdHIKK24xdjIKK24xdzQKK255bTQKK255cDQKKzRuegorbjN6YTEKKzRvYQorb2EyZDMKK281YTVsZXMyCitvMmFsZQorb2FyZDMKK28yYTJyCitvYXM0ZQorb2FzdDVlCitvYXQ1aQorb2IzYTNiCitvNWIyYTJyCitvMWJlNGwKK28xYmkKK28yYmluCitvYjVpbmcKK28zYnIKK29iM3VsCitvMWNlCitvMmNoNAorbzNjaGU0dAorb2NoZTIKK29jaWYzCitvMWNpCitvNGNpbAorbzRjbGFtCitvMWM0bDQKK280Y29kCitvMWNvCitvYzNyYWMKK29jNXJhMXRpegorb2NyZTMKKzVvY3JpdAorb2NyaTIKK29jdG8ycjVhCitvMmMxdAorb2MxdG8KK29jM3UxbGEKK281Y3VyZQorb2Q1ZDFlZAorb2QxZDQKK29kM2ljCitvMWQyaTNvCitvMmRvNAorb2Q0b3IzCitvNGQ1dWN0LgorbzFkdQorb2R1MmMKK29kdTJjMXQKK280ZDV1YzR0MXMyCitvNGVsCitvNWVuZworbzNlcgorb2U0dGEKK28zZXYKK28yZmkKK29mNWl0ZQorb2Y0aTR0NHQyCitvMmc1YTVyCitvMWdhCitvNGc1YTF0Mml2CitvNGdhMXRvCitvMWdlCitvNWdlbmUKK28xZ2VuCitvNWdlbworbzRnZXIKK28zZzJpZTQKKzFvMWdpcworb2czaXQKK280Z2wyCitvNWcybHkKKzNvZ25pegorb2cxbmkKK280ZzRybworbzFncgorb2cydTVpMgorMW8xZ3kKKzJvMmc1eTNuCitvMWgyCitvaGFiNQorb2kyCitvaWMzZXMKK29pM2RlcgorbzJpZAorb2k0ZjFmNAorbzJpZzQKK29pNWxldAorbzNpbmcKK29pbnQ1ZXIKK29pbjF0CitvNWkyczFtCitvaTVzbzJuCitvaTJzbworb2lzdDVlbgorb2lzMXRlCitvaTN0ZXIKK28yaXRlCitvNWoKKzJvaworbzNrZW4KK29rNWllNAorb2sxaQorbzFsYQorbzRsYTJuCitvbGEyc3M0CitvMmwyZAorb2wyZDFlCitvbDNlcgorbzNsZXMyYworb2xlczIKK28zbGV0CitvbDRmaQorbzJsZgorb2wyaQorbzNsMmkxYQorbzNsaWNlCitvbDVpZC4KK29sMmlkCitvM2xpNGYKK281bDRpNGwKK29sM2luZworbzVsMmlvCitvNWwyaXMuCitvbDNpczJoCitvNWwyaXRlCitvbDFpdAorbzVsMmkxdDJpbworb2xpMXRpCitvNWwyaXYKK29sbDJpNGU0CitvbDFsCitvbGwyaQorb2w1bzNnaXoKK29sbzRyCitvbDVwMmwyCitvMmxwCitvNGwydAorb2wzdWIKK29sM3VtZQorb2wzdW4KK281bDJ1cworb2wydgorbzJseQorbzJtNWFoCitvMW1hCitvbWE1bAorb201YTF0aXoKK29tMmJlCitvNG0xYgorb200YjJsMgorbzJtZQorb20zZTFuNGEKK28xbWVuCitvbTVlcjJzZQorb21lNHIxczIKK280bWV0CitvbTVlM3RyeQorb200ZXRyCitvM20yaTNhCitvbTNpYy4KK29tM2kxY2EKK281bTJpZAorb20xaW4KK281bTJpbmkKKzVvbW1lbmQKK29tMW0KK29tMW1lbgorb21vNGdlCitvMW1vCitvNG1vMm4KK29tM3BpCitvNG0xcAorb21wcm81CitvbXByMgorbzJuCitvMW4xYQorb240YWMKK28zbjJhMm4KK29uMWMKKzNvbmNpbAorb24xY2kKKzJvbmQKK29uNWRvCitvM25lbgorbzJuNWVzdAorbzFuZXMKK29uNGd1CitvbjFpYworbzNuMmk0bworb24xaXMKK281bmkxdQorb24za2V5CitvNG5rMgorb240b2RpCitvNG4zbzJkCitvbjNvM215CitvMm4zczIKK29uNXNwaTQKK29uc3BpMXI1YQorb25zcDRpcgorb24xc3U0CitvbnRlbjQKK29uMXQKK29uM3Q0aQorb250aTJmNQorb241dW0KK29uMXZhNQorb24xdjIKK29vMgorb29kNWUKK29vZDVpCitvMm80aworb29wM2kKK28zb3JkCitvb3N0NQorbzJwYQorbzJwMmU1ZAorb3AxZXIKKzNvcGVyMWEKKzRvcDRlcmFnCisyb3BoCitvNXBoYTJuCitvNXBoNGVyCitvcDNpbmcKK29waTJuCitvM3BpdAorbzVwbzJuCitvNHBvc2kKK28xcG9zCitvMXByMgorb3AxdQorb3B5NQorbzFxCitvMXJhCitvNXJhLgorbzRyM2FnCitvcjVhbDFpegorb3JhbDFpCitvcjVhbjRnZQorb3JhMm4KK29yMmFuZworb3JlNWEKK281cmUxYTRsCitvcjNlaTIKK29yNGU1czJoCitvcjVlMnN0Lgorb3JlczJ0CitvcmV3NAorb3I0Z3UKK29yZzIKKzRvNXIyaTNhCitvcjNpMWNhCitvNXJpbAorb3IxaW4KK28xcjJpMW8KK29yM2kxdHkKK28zcmkxdQorb3IybWkKK29yMW0KK29ybjJlCitvNXJvZgorb3Izb3VnCitvcm91Mgorb3I1cGUKK29yMXAKKzNvcnJoNAorb3IxcjQKK29yNHNlCitvNHJzMgorb3JzNWVuCitvcnN0NAorb3IzdGhpCitvcjN0aHkKK29yNHR5CitvNXJ1bQorbzFyeQorb3MzYWwKK29zYTIKK29zMmMKK29zNGNlCitvM3Njb3AKK29zMWNvCis0b3Njb3BpCitvNXNjcgorb3M0aTRlNAorb3M1aTF0Mml2Citvc2kxdGkKK29zM2kxdG8KK29zM2kxdHkKK281c2k0dQorb3M0bDIKK28yc28KK28yczRwYQorb3M0cG8KK29zMnRhCitvNXN0YXRpCitvczV0aWwKK29zdDJpCitvczV0aXQKK280dGEybgorbzF0YQorb3RlbGU0Zworb3QzZXIuCitvdDVlNHIxczIKK280dGVzCis0b3RoCitvdGg1ZTFzaQorb3RoMmUKK290aDFlcworb3RoM2k0CitvdDNpYy4KK290NWkxY2EKK28zdGljZQorbzN0aWYyCitvM3Rpcworb3RvNXMyCitvMXRvCitvdTIKK291M2IybDIKK291Y2g1aQorb3UyY2gKK291NWV0CitvdTRsCitvdW5jNWVyCitvdW4yZAorb3U1djIKK292NGVuCitvdmVyNG5lCitvdmU0cjNzMgorb3Y0ZXJ0CitvM3ZpcworbzR2aTF0aTQKK281djRvbAorb3czZGVyCitvdzNlbAorb3c1ZXN0Mworb3cxaTIKK293bjVpCitvNHdvMgorb3kxYQorMXBhCitwYTRjYQorcGE0Y2UKK3BhMmM0dAorcDRhMmQKKzVwYWdhNG4KK3BhMWdhCitwM2FnYXQKK3A0YWkyCitwYTRpNG40CitwNGFsCitwYTFuNGEKK3BhMm4KK3BhbjNlbAorcGFuNHR5CitwYW4xdAorcGEzbnkKK3BhMXAKK3BhNHB1CitwYXJhNWIybDIKK3AyYTJyCitwYTJyYWIKK3BhcjVhZ2UKK3BhcjVkMmkKKzNwYXJlCitwYXI1ZWwKK3A0YTRyMWkKK3BhcjRpcworcGEydGUKK3BhNXRlcgorNXBhdGhpYworcDRhdGgKK3BhNXRoeQorcGE0dHJpYworcGExdHIKK3BhdjQKKzNwYXkKKzRwMWIKK3BkNAorNHBlLgorM3BlNGEKK3BlYXI0bAorcGUyYTJyCitwZTJjCisycDJlZAorM3BlZGUKKzNwNGVkaQorcGUzZDRpM2E0CitwZWQ0aWMKK3A0ZWUKK3BlZTRkCitwZWs0CitwZTRsYQorcGVsMmk0ZTQKK3BlbDJpCitwZTRuMmEybgorcGUxbmEKK3A0ZW5jCitwZW40dGgKK3BlbjF0CitwZTVvMm4KK3A0ZXJhLgorcGVyMWEKK3BlcmE1YjJsMgorcGUycmE0YgorcDRlcmFnCitwNGVyMWkKK3Blcmk1c3QKK3BlcjJpcworcGVyNG1hbAorcGVyM200CitwZXIxbWEKK3BlcjJtZTUKK3A0ZXJuCitwMmVyM28KK3BlcjN0aQorcDRlNXJ1CitwZXIxdgorcGUydAorcGU1dGVuCitwZTV0aXoKKzRwZgorNHBnCis0cGguCitwaGFyNWkKK3BoMmEycgorcGg0ZTNubworcGhlMm4KK3BoNGVyCitwaDRlcy4KK3BoMWVzCitwaDFpYworNXBoMmllNAorcGg1aW5nCis1cGhpczF0MmkKKzNwaGl6CitwNGgybDQKKzNwaG9iCiszcGhvbmUKK3BobzJuCis1cGhvbmkKK3BobzRyCis0cDRoMXMyCitwaDN0Cis1cGh1CisxcGh5CitwMmkzYQorcGkyYTJuNAorcGk0YzJpZTQKK3AyaTFjaQorcGk0Y3kKK3A0aWQKK3A1aTFkMmEKK3BpM2RlCis1cGkyZGkKKzNwaWVjCitwMmllNAorcGkzZW4KK3BpNGdyYXAKK3AyaWcKK3BpMWdyCitwaTNsbworcGkybgorcDRpbi4KK3A0aW5kNAorcDRpMW5vCiszcDJpMW8KK3BpbzJuNAorcDNpdGgKK3BpNXRoYQorcGkydHUKKzJwM2syCisxcDJsMgorM3BsYTJuCitwbGFzNXQKK3BsMmkzYQorcGxpNWVyCitwbDJpZTQKKzRwbDJpZworcGxpNG4KK3Bsb2k0CitwbHU0bQorcGx1NG00YgorNHAxbQorMnAzbgorcG80YworNXBvZC4KK3BvNWVtCitwbzNldDUKKzVwbzRnCitwb2luMgorcG9pMgorNXBvaW4xdAorcG9seTV0CitwbzJseQorcG80bmkKK3BvMm4KK3BvNHAKKzFwNG9yCitwbzRyeQorMXBvcworcG8yczFzCitwNG90CitwbzR0YQorNXBvdW4KK3BvdTIKKzRwMXAKK3BwYTVyYQorcDFwYQorcHAyYTJyCitwMnBlCitwNHAyZWQKK3A1cGVsCitwM3BlbgorcDNwZXIKK3AzcGUydAorcHBvNXMyaXRlCitwMXBvcworcHIyCitwcmF5NGU0Cis1cHJlMWMyaQorcHJlNWNvCitwcmUzZTJtCitwcmU0ZjVhYworcHJlMWYKK3ByZTFmYQorcHJlNGxhCitwcjFlM3I0CitwM3JlMXMyZQorM3ByMmUyc3MKK3ByZTV0ZW4KK3ByZTN2MgorNXByMmk0ZTQKK3ByaW40dDMKK3ByMmk0cworcHJpMnMzbworcDNybzFjYQorcHIyb2MKK3Byb2Y1aXQKK3BybzJmaQorcHJvM2wKK3Byb3MzZQorcHJvMXQKKzJwMXMyCitwMnNlCitwczRoCitwNHNpMWIKKzJwMXQKK3AydDVhNGIKK3AxdGEKK3AydGUKK3AydGgKK3AxdGkzbQorcHR1NHIKK3AxdHUKK3A0dHc0CitwdWIzCitwdWU0CitwdWY0CitwdTRsM2MyCitwdTRtCitwdTJuCitwdXI0cjQKKzVwMnVzCitwdTJ0Cis1cHV0ZQorcHV0M2VyCitwdTN0cgorcHV0NHQxZWQKK3B1NHQzdDIKK3B1dDR0MWluCitwM3cKK3F1MgorcXVhNXY0CisycXVlLgorM3F1ZXIKKzNxdWV0CisycmFiCityYTNiaQorcmFjaDRlMgorcmEyY2gKK3I1YTFjNGw0CityYWY1ZmkKK3JhMmYKK3JhNGYxZjQKK3JhMmY0dAorcjJhaTIKK3JhNGxvCityYW0zZXQKK3IyYW1pCityYTNuZTVvCityYTJuCityYW40Z2UKK3IyYW5nCityNGFuaQorcmE1bm80CityYXAzZXIKKzNyYTFwaHkKK3JhcjVjCityMmEycgorcmFyZTQKK3JhcjVlMWYKKzRyYXJpbAorcmFyMWkKK3IyYXMKK3JhdGlvMm40CityYTF0MmlvCityYXU0dAorcmE1dmFpMgorcmEydmEKK3JhdjNlbAorcmE1ejJpZTQKK3JhMnoxaQorcjFiCityNGJhYgorcjRiYWcKK3JiaTIKK3IyYjNpNGYKK3IyYmluCityNWIyaW5lCityYjVpbmcuCityYjRvCityMWMKK3IyY2UKK3IxY2VuNAorcjNjaGEKK3IyY2gKK3JjaDRlcgorcmNoZTIKK3I0Y2k0YgorcjFjaQorcjJjNGl0CityY3VtMworcjRkYWwKK3IxZDJhCityZDJpCityMWQ0aTRhCityZGk0ZXIKK3JkMmllNAorcmQxaW40CityZDNpbmcKKzJyZS4KK3JlMWE0bAorcmUzYTJuCityZTVhcjFyNAorcmUyYTJyCis1cmVhMnYKK3JlNGF3CityNWVicmF0CityMmUxYgorcmUzYnIKK3JlYzVvbDFsCityZTJjb2wKK3JlMWNvCityZTRjNW9tcGUKK3JlY280bTFwCityZTRjcmUKK3JlMWNyCisycjJlZAorcmUxZGUKK3JlM2RpczEKK3I0ZWRpCityZWQ1aXQKK3JlNGZhYworcmUxZgorcmUxZmEKK3JlMmZlCityZTVmZXIuCityZWZlcjEKK3JlM2ZpCityZTRmeQorcmVnM2lzCityZTVpdAorcmVpMgorcmUxbDJpCityZTVsdQorcjRlbjR0YQorcmVuMXQKK3JlbjR0ZQorcmUxbworcmU1cGkybgorcmU0cG9zaQorcmUxcG8KK3JlMXBvcworcmUxcHUKK3IxZXI0CityNGVyMWkKK3IyZXJvNAorcjRlNXJ1CityNGVzLgorcmU0c3BpCityZTFzcAorcmVzNHM1aTRiCityMmUyc3MKK3JlczFzaQorcmVzMnQKK3JlNXMydGEybAorcmVzMXRhCityMmUzc3Q0cgorcmU0dGVyCityZTR0aTR6CityZTN0cmkKK3I0ZXUyCityZTV1MXQyaQorcmV2MgorcmU0dmFsCityZTF2YQorcmV2M2VsCityNWV2NWVyLgorcmV2MWVyCityZTV2ZTRyMXMyCityZTV2ZXJ0CityZTV2aTRsCityZTF2aQorcmV2NW9sdQorcmU0d2gKK3IxZgorcjNmdTQKK3I0ZnkKK3JnMgorcmczZXIKK3IzZ2V0CityM2cxaWMKK3JnaTRuCityZzNpbmcKK3I1Z2lzCityNWdpdAorcjFnbDIKK3JnbzRuMgorcjFnbworcjNndQorcmg0Cis0cmguCis0cmhhbAorcjJpM2EKK3JpYTRiCityaTRhZworcjRpYgorcmliM2EKK3JpYzVhczUKK3JpMWNhCityNGljZQorNHIyaTFjaQorNXJpNWMyaWQKK3JpNGMyaWU0CityNGkxY28KK3JpZDVlcgorcjJpZAorcmkzZW5jCityMmllNAorcmkzZW4xdAorcmkxZXIKK3JpNWV0CityaWc1YTJuCityMmlnCityaTFnYQorNXI0aWdpCityaWwzaXoKK3JpbDFpCis1cmltYTJuCityaTFtYQorcmltNWkKKzNyaTFtbworcmltNHBlCityaTRtMXAKK3IyaTFuYQorNXJpbmEuCityNGluNGQKK3IyaW40ZQorcmluNGcKK3IyaTFvCis1cmlwaAorcjJpcAorcmlwaDVlCityaTJwMmwyCityaXA1bGljCityNGlxCityMmlzCityNGlzLgorcjJpczRjCityM2lzMmgKK3JpczRwCityaTN0YTNiCityaTF0YQorcjVpdGVkLgorcjJpdGUKK3JpMnQxZWQKK3JpdDVlci4KK3JpdDVlNHIxczIKK3I0aTJ0M2ljCityaTF0aQorcmkydHUKK3JpdDV1cgorcml2NWVsCityMml2CityaXYzZXQKK3JpdjNpCityM2oKK3Iza2V0CityazRsZQorcmsxbAorcms0bGluCityMWwKK3JsZTQKK3IybGVkCityNGwyaWcKK3I0bGlzCitybDVpczJoCityM2xvNAorcjFtCitybWE1YworcjFtYQorcjJtZQorcjNtZW4KK3JtNWU0cjFzMgorcm0zaW5nCityNG1pbmcuCityNG0yaW8KK3IzbWl0CityNG15CityNG4yYTJyCityMW5hCityM25lbAorcjRuMWVyCityNW5ldAorcjNuZXkKK3I1bmljCityMW5pczQKK3IzbjJpdAorcjNuMml2Citybm80CityNG5vdTIKK3IzbnUKK3JvYjNsMgorcjJvYworcm8zY3IKK3JvNGUKK3JvMWZlCitybzVmaWwKK3JvMmZpCityMm9rMgorcm81azFlcgorNXJvbGUuCityb201ZTF0ZQorcm8ybWUKK3JvNG1ldAorcm9tNGkKK3JvNG00cAorcm9uNGFsCitybzJuCitybzFuMWEKK3JvbjRlCitybzVuNGlzCityb240dGEKK3JvbjF0Cisxcm9vbQorcm9vMgorNXJvb3QKK3JvM3BlbAorcm9wM2ljCityb3IzaQorcm81cm8KK3JvMnM1cGVyCitybzJzNHMKK3JvNHRoMmUKK3I0b3RoCitybzR0eQorcm80dmEKK3JvdjVlbAorcm94NQorcjFwCityNHBlNGEKK3I1cGVuMXQKK3JwNWVyLgorcjNwZTJ0CitycDRoNAorcnAzaW5nCitycGkybgorcjNwbworcjFyNAorcnJlNGMKK3JyZTRmCityNHJlMW8KK3JyZTRzMnQKK3JyMmk0bworcnIyaTR2Citycm8ybjQKK3Jyb3M0CitycnlzNAorNHJzMgorcjFzYTIKK3JzYTV0aQorcnM0YworcjJzZQorcjNzZWMKK3JzZTRjcgorcjRzNWVyLgorcnMzZTRzCityNXNlNXYyCityMXMyaAorcjVzaGEKK3Ixc2kKK3I0c2k0YgorcnNvMm4zCityMXNvCityMXNwCityNXN3MgorcnRhMmNoNAorcjF0YQorcjR0YWcKK3IzdDJlMWIKK3IzdGVuNGQKK3IxdGU1bworcjF0aQorcjJ0NWkyYgorcnQyaTRkCityNHRpZXIKK3J0MmllNAorcjN0MmlnCitydGlsM2kKK3J0aWw0bAorcjR0aTFseQorcjR0aXN0CityNHQyaXYKK3IzdHJpCitydHIyb3BoNAorcnQ0czJoNAorcjR0MXMyCitydTNhCitydTNlNGwKK3J1M2VuCitydTRnbDIKK3J1M2k0bgorcjJ1aTIKK3J1bTNwMmwyCitydTRtMnAKK3J1Mm4KK3J1NG5rNQorcnVuNHR5CitydW4xdAorcjV1c2MyCityMnVzCitydTJ0MWk1bgorcjR1MXQyaQorcnY0ZQorcnZlbDRpCityM3ZlbgorcnY1ZXIuCityNXZlc3QKK3J2NGUycworcjN2ZXkKK3IzdmljCityM3YyaTR2CityM3ZvCityMXcKK3J5NGMKKzVyeW5nZQorcnluNWcKK3J5M3QKK3NhMgorMnMxYWIKKzVzYWNrMQorc2FjM3JpMgorczNhMmMxdAorNXNhaTIKK3NhNGwyYTJyNAorczRhMmw0bQorc2E1bG8KK3NhNGw0dAorM3NhbmMKK3NhMm4KK3NhbjRkZQorczRhbmQKK3MxYXAKK3NhNXRhCis1c2EzdDJpbworc2EydDN1CitzYXU0CitzYTV2b3IKKzVzYXcKKzRzNWIKK3NjYW40dDUKK3MxY2EKK3NjYTJuCitzY2E0cAorc2NhdjUKK3M0Y2VkCis0czNjZWkyCitzNGNlcworczJjaDIKK3M0Y2hvMgorM3M0YzJpZTQKK3MxY2kKKzVzYzRpbjRkCitzMmNpbgorc2NsZTUKK3MxYzRsNAorczRjbGkKK3Njb2Y0CitzMWNvCis0c2NvcHk1CitzY291MXI1YQorc2NvdTIKK3MxY3UKKzRzNWQKKzRzZS4KK3NlNGEKK3NlYXM0CitzZWE1dworc2UyYzNvCiszc2UyYzF0Cis0czRlZAorc2U0ZDRlCitzNWVkbAorc2UyZworc2UxZzNyCis1c2VpMgorc2UxbGUKKzVzZTJsMmYKKzVzZWx2Cis0c2UxbWUKK3NlNG1vbAorc2UxbW8KK3NlbjVhdAorc2UxbmEKKzRzZW5jCitzZW40ZAorczVlMm5lZAorc2VuNWcKK3M1ZW4xaW4KKzRzZW40dDFkCitzZW4xdAorNHNlbjJ0bAorc2UycDNhMworNHMxZXIuCitzNGVyMWwKK3MyZXI0bworNHNlcjN2bworczFlNHMKK3M0ZTVzMmgKK3NlczV0Cis1c2U1dW0KK3M0ZXUKKzVzZXYKK3NldjNlbgorc2V3NGkyCis1c2V4Cis0czNmCisyczNnCitzMmgKKzJzaC4KK3NoMWVyCis1c2hldgorc2gxaW4KK3NoM2lvCiszc2gyaTRwCitzaDJpMnY1CitzaG80CitzaDVvMmwyZAorc2hvMm4zCitzaG9yNAorc2hvcnQ1Cis0c2gxdworc2kxYgorczVpYzNjCiszc2kyZGUuCitzMmlkCis1c2lkZTRzMgorNXNpMmRpCitzaTVkaXoKKzRzaWcxbjRhCitzMmlnCitzaWw0ZQorNHNpMWx5CisyczFpbgorczJpMW5hCis1c2kybmUuCitzMmluZQorczNpbmcKKzFzMmlvCis1c2lvMm4KK3NpbzFuNWEKK3M0aTJyCitzaTFyNWEKKzFzaXMKKzNzMmkxdDJpbworc2kxdGkKKzVzaTF1CisxczJpdgorNXNpegorc2syCis0c2tlCitzM2tldAorc2s1aW5lCitzazFpCitzazVpbjRnCitzMWwyCitzM2xhdAorczJsZQorc2wyaXRoNQorc2wxaXQKKzJzMW0KK3MzbWEKK3NtYWwxbDMKK3NtYTJuMworc21lbDQKK3M1bWVuCis1czRtMml0aAorc21vMmw1ZDQKK3MxbW8KK3MxbjQKKzFzbworc280Y2UKK3NvMmZ0Mworc280bGFiCitzbzFsYQorc28ybDNkMgorc28zbGljCitzb2wyaQorNXNvbDJ2Ciszc29tCiszczRvbi4KK3NvMm4KK3NvMW4xYTQKK3NvbjRnCitzNG9wCis1c29waDFpYworczJvcGgKK3M1bzNwaGl6CitzNW8xcGh5Citzb3I1Yworc29yNWQKKzRzb3YKK3NvNXZpCisyczFwYQorNXNwNGFpMgorc3BhNG4KK3NwZW40ZAorMnM1cGVvCisyc3BlcgorczJwaGUKKzNzcGg0ZXIKK3NwaG81CitzcGlsNAorc3A1aW5nCitzcGkybgorNHMzcDJpMW8KK3M0cDFseQorczFwMmwyCitzNHBvMm4KK3MxcDRvcjQKKzRzcDRvdAorc3F1YWw0bAorc3F1MgorczFyCisyc3MKK3Mxc2EyCitzc2FzMworczJzNWMKK3Mzc2VsCitzNXNlbjVnCitzNHNlcy4KK3NzMWU0cworczVzZXQKK3Mxc2kKK3M0czJpZTQKK3NzaTRlcgorczRzNWkxbHkKK3M0czFsMgorc3M0bGkKK3M0czFuNAorc3NwZW40ZDQKK3NzMnQKK3NzdTFyNWEKK3Mxc3UKK3NzdTJyCitzczV3MgorMnN0LgorczJ0YWcKK3MxdGEKK3MydGEybAorc3RhbTRpCis1c3Q0YW5kCitzdGEybgorczR0YTRwCis1c3RhdC4KK3M0dDFlZAorc3Rlcm41aQorczV0MmVybworc3RlMncKK3N0ZTF3NWEKK3MzdGgyZQorc3QyaQorczR0aS4KK3M1dDJpMWEKK3MxdGljCis1czR0aWNrMQorczR0MmllNAorczN0aWYyCitzdDNpbmcKK3MydDFpbgorNXN0NGlyCitzMXRsZQorczJ0bAorNXN0b2NrMQorczF0bworc3RvMm0zYQorNXN0b25lCitzdG8ybgorczR0b3AKKzNzdG9yZQorc3Q0cgorczR0cmEyZAorczF0cmEKKzVzdHJhMnR1CitzNHRyYXkKK3M0dHIyaWQKKzRzdHJ5Cis0c3QzdzQKK3MydHkKKzFzdQorc3UxYWwKK3N1NGIzCitzdTJnMworc3U1aXMKK3MydWkyCitzdWl0MworczR1bAorc3UybQorc3UxbTNpCitzdTJuCitzdTJyCis0c3YKK3N3MgorNHMxd28yCitzNHkKKzRzeTFjCiszc3lsCitzeW41bworc3k1cmluCisxdGEKKzN0YS4KKzJ0YWIKK3RhNWJsZXMyCit0YWIybDIKKzV0YWI1bzVsMWl6Cit0YWJvbDJpCis0dDRhMmNpCit0YTVkbwordGEyZAorNHRhMmY0Cit0YWk1bG8KK3RhaTIKK3RhMmwKK3RhNWxhCit0YWw1ZW4KK3QyYWxlCit0YWwzaQorNHRhbGsKK3RhbDRsaXMKK3RhbDFsCit0YWxsMmkKK3RhNWxvZwordGE1bW8KK3RhbjRkZQordGEybgordDRhbmQKKzF0YW4xdGEzCit0YW4xdAordGE1cGVyCit0YTVwMmwyCit0YXI0YQordDJhMnIKKzR0YXIxYworNHRhcmUKK3RhM3IyaXoKK3RhcjFpCit0YXM0ZQordGE1czR5Cis0dGF0MWljCit0YTR0dXIKK3RhMnR1Cit0YXVuNAordGF2NAorMnRhdwordGF4NGlzCit0YXgzaQorMnQxYgorNHRjCit0NGNoCit0Y2g1ZTR0Cit0Y2hlMgorNHQxZAorNHRlLgordGUyYWQ0aQordGVhMmQxCis0dGVhMnQKK3RlMWNlNAorNXRlMmMxdAorMnQxZWQKK3Q0ZTVkaQorMXRlZQordGVnNAordGU1Z2VyNAordGU1Z2kKKzN0ZWwuCit0ZWwyaTQKKzV0ZTJsMXMyCit0ZTJtYTIKK3RlbTNhdAorM3RlbjJhMm4KK3RlMW5hCiszdGVuYworM3RlbmQKKzR0ZTFuZXMKKzF0ZW4xdAordGVuNHRhZwordGVuMXRhCisxdGVvCit0ZTRwCit0ZTVwZQordGVyM2MKKzV0ZXIzZAorMXRlcjFpCit0ZXI1aWVzCit0ZXIyaWU0Cit0ZXIzaXMKK3Rlcmk1emExCis1dDRlcjNuMml0Cit0ZXI1dgorNHRlcy4KKzR0MmUyc3MKK3QzZXNzLgordGV0aDVlCiszdDRldQorM3RleAorNHRleQorMnQxZgorNHQxZworMnRoLgordGhhMm40Cit0aDJlCis0dGhlYQordGgzZWFzCit0aGU1YTJ0Cit0aGUzaXMKK3RoZWkyCiszdGhlNHQKK3RoNWljLgordGg1aTFjYQorNHRoNGlsMgorNXRoNGk0bmsyCis0dDRoMWw0Cit0aDVvZGUKKzV0aG9kM2ljCis0dGhvbzIKK3Rob3I1aXQKK3RobzVyaXoKKzJ0NGgxczIKKzF0MmkxYQordGk0YWIKK3RpNGExdG8KKzJ0aTJiCis0dGljazEKK3Q0aTFjbwordDRpYzF1Cis1dGkyZGkKK3QyaWQKKzN0aWVuCit0MmllNAordGlmMgordGk1ZnkKKzJ0MmlnCis1dGlndQordGlsMmw1aW40Cit0aWwxbAordGlsbDJpCisxdGltCis0dGk0bTFwCit0aW01dWwKK3RpMm11CisydDFpbgordDJpMW5hCiszdGkybmUuCit0MmluZQorM3QyaW5pCisxdDJpbwordGk1b2MKK3Rpb241ZWUKK3RpbzJuCis1dGlxCit0aTNzYTIKKzN0NGlzZQordGkyczRtCit0aTVzbwordGlzNHAKKzV0aXN0aTFjYQordGlzMXQyaQordGlzMXRpYwordGkzdGwKK3RpNHUKKzF0Mml2Cit0aTF2NGEKKzF0aXoKK3RpM3phMQordGkzemU0bgordGkyemUKKzJ0bAordDVsYQordGxhMm40CiszdGxlLgorM3RsZWQKKzN0bGVzLgordGxlczIKK3Q1bGV0LgordDVsbworNHQxbQordG1lNAorMnQxbjIKKzF0bwordG8zYgordG81Y3JhdAorNHRvMmRvNAorMnRvZgordG8yZ3IKK3RvNWljCit0b2kyCit0bzJtYQordG80bTRiCit0bzNteQordG9uNGE0bDFpCit0bzJuCit0bzFuMWEKK3RvM24yYXQKKzR0b25vCis0dG9ueQordG8ycmEKK3RvM3IyaWU0Cit0b3I1aXoKK3RvczIKKzV0b3VyCit0b3UyCis0dG91dAordG8zdzJhMnIKKzR0MXAKKzF0cmEKK3QycmEzYgordHJhNWNoCit0cjRhMmNpNAordHJhMmM0aXQKK3RyYWM0dGUKK3RyYTJjMXQKK3RyMmFzNAordHJhNXZlbgordHJhdjVlMnM1Cit0cmU1ZgordHJlNG0KK3RyZW01aQorNXRyMmkzYQordHJpNWNlcwordHI0aWNlCis1dHJpM2MyaTFhCit0NHIyaTFjaQorNHRyaTRjM3MyCisydHJpbQordHIyaTR2Cit0cm81bTRpCit0cm9uNWkKK3RybzJuCis0dHJvbnkKK3RybzVwaGUKK3RyMm9waAordHJvM3NwCit0cm8zdgordHIydTVpMgordHIydXM0Cis0dDFzMgordDRzYwordHMyaDQKK3Q0c3cyCis0dDN0MgordDR0ZXMKK3Q1dG8KK3QxdHU0CisxdHUKK3R1MWEKK3R1M2EycgordHU0YjRpCit0dWQyCis0dHVlCis0dHVmNAorNXQydTNpMgorM3R1bQordHU0bmlzCit0dTFuaQorMnQzdXAuCiszdHVyZQorNXR1cmkKK3R1cjNpcwordHVyNW8KK3R1NXJ5CiszdDJ1cworNHR2Cit0dzQKKzR0MXdhCit0d2lzNAordHdpMgorNHQxd28yCisxdHkKKzR0eWEKKzJ0eWwKK3R5cGUzCit0eTVwaAorNHR6Cit0Mno0ZQorNHVhYgordWFjNAordWE1bmEKK3VhMm4KK3VhbjRpCit1YXI1YW4xdAordTJhMnIKK3VhcmEybgordWFyMmQKK3VhcjNpCit1YXIzdAordTFhdAordWF2NAordWI0ZQordTRiZWwKK3UzYmVyCit1NGIyZXJvCit1MWI0aQordTRiNWluZwordTNiNGxlLgordWIybDIKK3UzY2EKK3VjaTRiCit1MWNpCit1MmM0aXQKK3VjbGUzCit1MWM0bDQKK3UzY3IKK3UzY3UKK3U0Y3kKK3VkNWQ0Cit1ZDNlcgordWQ1ZXN0Cit1ZGVzMgordWRlMXY0Cit1MWRpYwordWQzaWVkCit1ZDJpZTQKK3VkM2llcwordWQ1aXMxCit1NWRpdAordTRkbzJuCit1MWRvCit1ZDRzaQordTJkMXMyCit1NGR1Cit1NGVuZQordWUybjFzNAordWVuNHRlCit1ZW4xdAordWVyNGlsCit1ZXIxaQorM3UxZmEKK3UzZjRsMgordWdoM2UybgordWc1aW4KKzJ1aTIKK3VpbDVpegordWlsMWkKK3VpNG4KK3UxaW5nCit1aXI0bQordTRpcgordWkxdGE0Cit1Mml2MwordWk0djRlci4KK3U1agorNHVrCit1MWxhCit1bGE1YgordTVsYXRpCit1bDJjaDQKK3U0bDFjMgorNXVsY2hlMgordWwzZGVyCit1MmxkCit1bDJkZQordWw0ZQordTFsZW4KK3VsNGdpCit1NGwxZzQKK3VsMmkKK3U1bDJpMWEKK3VsM2luZwordWw1aXMyaAordWw0bDJhMnIKK3VsMWwKK3VsNGxpNGIKK3VsbDJpCit1bDRsaXMKKzR1MmwzbQordTFsNG8KKzR1MmwxczIKK3VsczVlNHMKK3VsMnNlCit1bDF0aQordTRsdAordWwxdHJhMwordWwxdHIKKzR1bDF0dTIKK3UzbHUKK3VsNXVsCit1bDV2Cit1Mm01YWIKK3UxbWEKK3VtNGJpCit1NG0xYgordW00YjFseQordW1iMmwyCit1MW1pCit1NG0zaW5nCit1bW9yNW8KK3UxbW8KK3VtbzJyCit1NG0ycAordW4yYXQ0Cit1MW5hCit1Mm5lCit1bjRlcgordTFuaQordW40aW0KK3UybjFpbgordW41aXMyaAordW4yaTN2Cit1Mm4zczQKK3VuNHN3MgordW4ydDNhNGIKK3VuMXQKK3VuMXRhCit1bjR0ZXIuCit1bjR0ZXMKK3VudTQKK3VuNXkKK3U0bjV6Cit1NG80cnMyCit1NW9zCit1MW91MgordTFwZQordXBlNHI1czIKK3U1cDJpM2EKK3VwM2luZwordXBpMm4KK3UzcDJsMgordTRwM3AKK3VwcG9ydDUKK3VwMXA0b3IKK3VwMnQ1aTJiCit1MnAxdAordXAxdHU0Cit1MXJhCis0dXJhLgordTRyYWcKK3U0cjJhcwordXI0YmUKK3VyMWIKK3VyMWM0Cit1cjFkCit1cmU1YTJ0Cit1cjRmZXIxCit1cjFmCit1cjRmcgordTNyaWYKK3VyaTRmaWMKK3VyaTFmaQordXIxaW4KK3UzcjJpMW8KK3Uxcml0Cit1cjNpegordXIybAordXJsNWluZy4KK3VyNG5vNAordXJvczQKK3VyNHBlCit1cjFwCit1cjRwaQordXJzNWVyCit1NHJzMgordXIyc2UKK3VyNXRlcwordXIzdGgyZQordXIxdGk0Cit1cjR0MmllNAordTNydQorMnVzCit1NXNhMmQKK3VzYTIKK3U1c2EybgordXM0YXAKK3VzYzIKK3VzM2NpCit1c2U1YQordTVzMmkxYQordTNzaWMKK3VzNGxpbgordXMxbDIKK3VzMXAKK3VzNXMxbDIKK3Uyc3MKK3VzNXRlcmUKK3VzMXQ0cgordTJzdQordXN1MnI0Cit1MnRhNGIKK3UxdGEKK3UzdGF0Cis0dTR0ZS4KKzR1dGVsCis0dXRlbgordXRlbjRpCis0dTF0MmkKK3V0aTVsMml6Cit1dGlsMWkKK3UzdDJpbmUKK3UydDFpbgordXQzaW5nCit1dGlvMW41YQordTF0MmlvCit1dGlvMm4KK3U0dGlzCis1dTV0aXoKK3U0dDFsCit1MnQ1b2YKK3UxdG8KK3V0bzVnCit1dG81bWF0MWljCit1dG8ybWEKK3U1dG8ybgordTR0b3UyCit1NHQxczQKK3UzdQordXU0bQordTF2MgordXgxdTMKK3UyejRlCisxdmEKKzV2YS4KKzJ2MWE0YgordmFjNWlsCit2NGEyY2kKK3ZhYzN1Cit2YWc0Cit2YTRnZQordmE1bDJpNGU0Cit2YWwxaQordmFsNW8KK3ZhbDF1Cit2YTVtbwordmE1bml6Cit2YTJuCit2YTVwaQordmFyNWllZAordjJhMnIKK3ZhcjFpCit2YXIyaWU0CiszdmF0Cis0dmUuCis0dmVkCit2ZWczCit2M2VsLgordmVsM2wyaQordmVsMWwKK3ZlNGxvCit2NGUxbHkKK3ZlbjNvbQordjRlbm8KK3Y1ZW51ZQordjRlcmQKKzV2MmUycmUuCit2NGVyZWwKK3YzZXJlbgordmVyNWVuYwordjRlcmVzCit2ZXIzaWU0Cit2ZXIxaQordmVybWk0bgordmVyM200CiszdmVyMnNlCit2ZTRyMXMyCit2ZXIzdGgKK3Y0ZTJzCis0dmVzLgordmVzNHRlCit2ZTR0ZQordmV0M2VyCit2ZTR0eQordmk1YWwxaQordjJpMWEKK3ZpMmFsCis1dmkyYTJuCis1dmkyZGUuCit2MmlkCis1dmkyZDFlZAorNHYzaTFkZW4KKzV2aWRlNHMyCis1dmkyZGkKK3YzaWYKK3ZpNWduCit2MmlnCit2NGlrNAorMnZpbAorNXYyaWwxaXQKK3ZpbDFpCit2M2kzbDJpegordjFpbgorNHZpNG5hCit2MmluYwordjRpbjVkCis0dmluZwordmkxbzNsCit2MmlvCit2M2lvNHIKK3ZpMW91MgordjJpNHAKK3ZpNXJvCit2NGlyCit2aXMzaXQKK3ZpM3NvCit2aTNzdQorNHZpMXRpCit2aXQzcgorNHZpMXR5CiszdjJpdgorNXZvLgordm9pNAorM3Yyb2sKK3ZvNGxhCit2NW9sZQorNXZvNGwydAorM3ZvbDJ2Cit2b201aQordm8ycjVhYgordm8xcmEKK3Zvcmk0Cit2bzRyeQordm80dGEKKzR2bzF0ZWUKKzR2djQKK3Y0eQordzVhYjJsMgorMndhYword2E1Z2VyCit3YTJnNW8KK3dhaXQ1Cit3YWkyCit3NWFsLgord2FtNAord2FyNHQKK3cyYTJyCit3YXM0dAord2ExdGUKK3dhNXZlcgordzFiCit3ZWE1cjJpZTQKK3dlMmEycgord2VhcjFpCit3ZTRhdGgzCit3ZWEydAord2U0ZDRuNAord2VldDMKK3dlZTV2Cit3ZWw0bAordzFlcgord2VzdDMKK3czZXYKK3doaTQKK3dpMgord2lsMgord2lsMmw1aW40Cit3aWwxbAord2lsbDJpCit3aW40ZGUKK3c0aW5kCit3aW40ZwordzRpcjQKKzN3NGlzZQordzJpdGgzCit3aXo1Cit3NGsKK3dsNGVzMgord2wzaW4KK3c0bm8KKzF3bzIKK3dvbTEKK3dvNXY0ZW4KK3c1cAord3JhNAord3JpNAord3JpMXRhNAordzNzMmgKK3dzNGwyCit3czRwZQordzVzNHQKKzR3dAord3k0Cit4MWEKK3hhYzVlCit4NGEyZ28KK3hhbTMKK3g0YXAKK3hhczUKK3gzYzIKK3gxZQoreGU0Y3UxdG8KK3hlMWN1Cit4ZTNjNHV0Cit4MmVkCit4ZXI0aQoreDJlNXJvCit4MWgKK3hoaTIKK3hoNGlsNQoreGh1NAoreDNpCit4Mmk1YQoreGk1YworeGk1ZGkKK3gyaWQKK3g0aW1lCit4aTVtMml6Cit4aW0xaQoreDNvCit4NG9iCit4M3AKK3hwNGFuNGQKK3gxcGEKK3hwYTJuCit4cGVjMXRvNQoreHBlMmMKK3hwZTJjMXQKK3gycDJlM2QKK3gxdDIKK3gzdGkKK3gxdQoreHUzYQoreHg0Cit5NWFjCiszeTJhMnI0Cit5NWF0Cit5MWIKK3kxYworeTJjZQoreWM1ZXIKK3kzY2gKK3ljaDRlMgoreWNvbTQKK3kxY28KK3ljb3Q0Cit5MWQKK3k1ZWUKK3kxZXIKK3k0ZXIxZgoreWVzNAoreWU0dAoreTVnaQorNHkzaAoreTFpCit5M2xhCit5bGxhNWIybDIKK3lsMWwKK3kzbG8KK3k1bHUKK3ltYm9sNQoreTRtMWIKK3ltZTQKK3ltMXBhMworeTRtMXAKK3luM2M0aHI0Cit5bjJjaAoreW41ZAoreW41ZworeW41aWMKKzV5bngKK3kxbzQKK3lvNWQKK3k0bzVnCit5b200Cit5bzVuZXQKK3lvMm4KK3k0bzJuM3MyCit5NG9zCit5NHAyZWQKK3lwZXI1Cit5cDNpCit5M3BvCit5NHBvNGMKK3lwMnRhCit5MnAxdAoreTVwdQoreXJhNW0KK3lyNWkzYQoreTNybworeXI0cjQKK3lzNGMKK3kzczJlCit5czNpMWNhCit5MXMzaW8KKzN5MXNpcworeTRzbworeTJzczQKK3lzMXQKK3lzM3RhCit5c3UycjQKK3kxc3UKK3kzdGhpbgoreXQzaWMKK3kxdworemExCit6NWEyYgorejJhMnIyCis0emIKKzJ6ZQoremU0bgoremU0cAorejFlcgorejJlM3JvCit6ZXQ0CisyejFpCit6NGlsCit6NGlzCis1emwKKzR6bQorMXpvCit6bzRtCit6bzVvbAorem9vMgorenRlNAorNHoxejIKK3o0enkKKy5hczlzOG85YzhpOGE4dGUuCisuYXMxc28KKy5hc3NvMWNpCisuYXNzbzNjMmkxYQorLmFzOXM4bzljOGk4YTh0OGVzLgorLmRlOGM5bDhpOW44YTl0OGk4b24uCisuZGUxYzRsNAorLmRlY2w0aTFuYQorLmRlY2xpbjJhdAorLmRlY2xpbmExdDJpbworLmRlY2xpbmF0aW8ybgorLm9iOGw4aThnOWE5dDhvOHJ5LgorLm9iMmwyCisub2JsMmlnCisub2JsaTFnYQorLm9ibGlnYTF0bworLm9ibGlnYXRvMXJ5CisucGg4aThsOWE4bjl0OGg4cjhvOHA4aWMuCisucGg0aWwyCisucGhpMWxhCisucGhpbGEybgorLnBoaWxhbjF0CisucGhpbGFudDRocjQKKy5waGlsYW50aHJvcDNpYworLnByOGU4czhlOG50LgorLnAzcmUxczJlCisucHJlc2VuMXQKKy5wcjhlOHM4ZThuOHRzLgorLnByZXNlbjR0NHMyCisucHI4bzhqOGU4Y3QuCisucHJvNWoKKy5wcm8xamUKKy5wcm9qZTJjMXQKKy5wcjhvOGo4ZThjOHRzLgorLnByb2plYzR0MXMyCisucmU4YzlpOXA4cjhvOGM5aTl0OHkuCisucmUxYzJpCisucmVjMmlwCisucmVjaXByMgorLnJlY2lwcjJvYworLnJlMWNpcHJvMWNpCisucmVjaXBybzJjMWl0CisucmVjaXByb2NpMXR5CisucmU5YzhvOGc5bjhpOXo4YThuOGNlLgorLnJlMWNvCisucmUyY29nCisucmVjM29nbml6CisucmVjb2cxbmkKKy5yZWNvZ25pemExCisucmVjb2duaXphMm4KKy5yZThmOW84cjltOGE5dDhpOG9uLgorLnJlMWYKKy5yZTFmbworLnJlZm8ycgorLnJlZm9yMW0KKy5yZWZvcjFtYQorLnJlZm9ybWExdDJpbworLnJlZm9ybWF0aW8ybgorLnJlOHQ5cjhpOWI4dTl0OGk4b24uCisucmUzdHJpCisucmV0cjRpYgorLnJldHJpM2J1MXQyaW8KKy5yZXRyaWI0dTF0MmkKKy5yZXRyaWJ1dGlvMm4KKy50YTliOGxlLgorLjJ0YWIKKy50YWIybDIKKy5hYzhhOGQ5ZTltOHkuCisuYTFjYQorLmFjYTJkCisuYWNhZDRlbQorLmFjYWRlM215CisuYWM4YThkOWU5bThpOGU4cy4KKy5hY2FkZW0yaTRlNAorLmFjOWM4dTlzOGE5dDhpOHY4ZS4KKy5hYzNjCisuYWMxYzJ1cworLmFjY3VzYTIKKy5hY2N1c2ExdDJpdgorLmFjOHI4bzluOHk4bS4KKy5hY3JvMm4KKy5hY3JvbnltNAorLmFjOHI4eThsOWE4bThpOGQ4ZS4KKy5hY3J5M2xhCisuYWNyeWxhbTJpZAorLmFjOHI4eThsOWE4bThpOGQ4ZThzLgorLmFjcnlsYW1pZGU0czIKKy5hYzhyOHk4bDlhOGw4ZDhlOWg4eThkOGUuCisuYWNyeWxhMmxkCisuYWNyeWxhbDJkZQorLmFjcnlsYWxkZTFoNAorLmFjcnlsYWxkZWh5MWQKKy5hZDhkOWE5YjhsOGUuCisuYWQxZDJhCisuYWQyZDNhNGIKKy5hZGRhYjJsMgorLmFkOGQ5aTliOGw4ZS4KKy5hZGRpMWIybDIKKy5hZDhyOGU4bjlhOWw4aThuOGUuCisuYTFkcgorLmFkcmU0CisuYTVkcmVuCisuYWRyZTFuYQorLmFkcmVuYTRsMWkKKy5hZHJlbmExbDRpbmUKKy5hZThyOG85czhwOGE4YzhlLgorLmFlNHIKKy5hMmVybworLmFlcm8yczRwYQorLmFlcm9zcGE0Y2UKKy5hZjl0OGU4cjl0OGg4bzh1OGc4aDh0LgorLmFmdGVydGhvdTIKKy5hZjl0OGU4cjl0OGg4bzh1OGc4aDh0OHMuCisuYWZ0ZXJ0aG91Z2g0dDFzMgorLmFnOHI4bzhuOW85bThpOHM4dC4KKy5hMWdyCisuYWc0cm8KKy5hZ3JvMm4KKy5hZ3Jvbm9tMmlzCisuYWc4cjhvOG45bzltOGk4czh0OHMuCisuYWdyb25vbWlzNHQxczIKKy5hbDlnOGU5YjhyOGE5aTljOGE4bDlsOHkuCisuYTRsMWc0CisuYWxnMmUxYgorLmFsZ2UzYnIKKy5hbGdlYnIyYWkyCisuYWxnZWJyYWkxY2EKKy5hbGdlYnJhaWNhbDFsCisuYWxnZWJyYWljYWwxbHkKKy5hbTlwOGg4ZTh0OWE5bThpOG44ZS4KKy5hNG0xcAorLmFtcGhlNHQKKy5hbXBoZTF0YQorLmFtcGhldGFtMWluCisuYW1waGV0YW0yaW5lCisuYW05cDhoOGU4dDlhOW04aThuOGU4cy4KKy5hbXBoZXRhbWkxbmVzCisuYW45YTlsOHk4czhlLgorLjNhbmExbHkKKy5hMW5hCisuYW40YTJseXM0CisuYW5hbDV5M3MyZQorLmFuOWE5bDh5OHM4ZThkLgorLmFuYWx5NHM0ZWQKKy5hbjhhOGw4eTlzOGU4cy4KKy5hbmFseXMxZTRzCisuYW45aThzOG85dDhyOG84cDlpOGMuCisuYW5pMnNvCisuYW5pc290cm9wM2ljCisuYW45aThzOG85dDhyOG84cDlpOWM4YThsOWw4eS4KKy5hbmlzb3Ryb3BpMWNhCisuYW5pc290cm9waWNhbDFsCisuYW5pc290cm9waWNhbDFseQorLmFuOWk4czhvOHQ5cjhvOXA4aThzOG0uCisuYW5pc290cm9waTJzMW0KKy5hbjlpOHM4bzh0OXI4bzhwOHkuCisuYW5pc290cm9weTUKKy5hbjhvOG05YThsOHkuCisuYW5vNAorLmFub21hNWwKKy5hbm8xbWEKKy5hbm9tYTFseQorLmFuOG84bTlhOGw4aThlOHMuCisuYW5vbWFsMWkKKy5hbm9tYWwyaTRlNAorLmFuOHQ4aTlkOGU4cjhpOHY5YTl0OGk4djhlLgorLmFudDJpZAorLmFudGlkZXIxaQorLmFudGlkZXIyaTR2CisuYW50aWRlNHJpMXZhCisuYW50aWRlcmkzdmF0CisuYW50aWRlcjJpdmExdDJpdgorLmFuOHQ4aTlkOGU4cjhpOHY5YTl0OGk4djhlOHMuCisuYW50aWRlcml2YXRpdjRlMnMKKy5hbjh0OGk5aDhvOGw4bzltOG84cjlwOGg4aThjLgorLmFudGkzaAorLmFudGlob2xvMW1vCisuYW50aWhvbG9tbzJyCisuYW50aWhvbG9tb3IxcAorLmFudGlob2xvbW9ycDRoNAorLmFudGlob2xvbW9ycGgxaWMKKy5hbjl0OGk4bjlvOW04eS4KKy5hbjJ0MWluCisuYW50Mmkxbm8KKy5hbnRpbm8zbXkKKy5hbjl0OGk4bjlvOW04aThlOHMuCisuYW50aW5vbTJpZTQKKy5hbjl0OGk5bjh1OWM4bDhlOGE4ci4KKy5hbnRpbjF1CisuYW50aW51Y2xlMworLmFudGludTFjNGw0CisuYW50aW51Y2xlMmEKKy5hbnRpbnVjbGUyYTJyCisuYW45dDhpOW44dTljOGw4ZTlvOG4uCisuYW50aW51Y2xlbzJuCisuYW45dDhpOXI4ZTh2OW85bDh1OXQ4aThvOG45YThyOHkuCisuYW50NGlyCisuYW50aXJldjIKKy5hbnRpcmV2NW9sdQorLmFudGlyZXZvMWx1dAorLmFudGlyZXZvbDR1MXQyaQorLmFudGlyZXZvbHV0aW8xbjVhCisuYW50aXJldm9sdTF0MmlvCisuYW50aXJldm9sdXRpbzJuCisuYW50aXJldm9sdXRpb24yYTJyCisuYXA4bzh0OGg5ZTlvOXM4ZThzLgorLmFwNG90CisuYXA0b3RoCisuYXBvdGgyZQorLmFwb3RoZW9zNAorLmFwb3RoZW9zMWU0cworLmFwOG84dDhoOWU5bzlzOGk4cy4KKy5hcG90aGVvMXNpcworLmFwOXA4ZThuOWQ4aTh4LgorLmE0cDFwCisuYXAycGUKKy5hcDNwZW4KKy5hcjljOGg4aTltOGU5ZDhlOGE4bi4KKy5hcjFjCisuYXIyY2gKKy5hcmNoaTJtZWQKKy5hcmNoaW1lZGVhMm4KKy5hcjljOGg4aTlwOGU4bDlhOGc4by4KKy5hcmNoMmk0cAorLmFyY2hpcGU0CisuYXJjaGlwZTRsYQorLmFyY2hpcGVsYTJnbworLmFyOWM4aDhpOXA4ZThsOWE5ZzhvOHMuCisuYXI5YzhoOGk4djhlLgorLmFyY2gyaTJ2CisuYXI5YzhoOGk4djhlOHMuCisuYXJjaGl2NGUycworLmFyOWM4aDhpOHY5aThuOGcuCisuYXJjaGl2MWluCisuYXJjaGk0dmluZworLmFyOWM4aDhpOHY5aThzOHQuCisuYXI5YzhoOGk4djlpOHM4dDhzLgorLmFyY2hpdmlzNHQxczIKKy5hcjljOGg4ZTl0OHk4cDlhOGwuCisuYXJjaGUyCisuYXJjaGU0dAorLmFyY2hlMXR5CisuYXJjaGV0eTFwYQorLmFyY2hldHlwNGFsCisuYXI5YzhoOGU5dDh5OHA5aTljOGE4bC4KKy5hcmNoZXR5cDNpCisuYXJjaGV0eXBpMWNhCisuYXI4Yzl0OGE4bjlnOGU4bjh0LgorLmFyMmMxdAorLmFyY3Q1YW5nCisuYXJjMXRhCisuYXJjdGEybgorLmFyY3RhbjFnZW4KKy5hcmN0YW5nZW4xdAorLmFyOGM5dDhhOG45ZzhlOG44dDhzLgorLmFyY3RhbmdlbjR0NHMyCisuYXM5czhpOGc4bjlhOWI4bDhlLgorLmFzMXNpCisuYXM0c2lnMW40YQorLmFzczJpZworLmFzc2lnMm4xYTJiCisuYXNzaWduYWIybDIKKy5hczlzOGk4ZzhuOW84ci4KKy5hc3NpZzFubworLmFzOXM4aThnOG45bzhyOHMuCisuYXNzaWdubzRyczIKKy5hczlzOGk4czh0OWE4bjh0OXM4aDhpOHAuCisuYXMxc2lzCisuYXNzaXMxdGEKKy5hc3Npc3RhMm4KKy5hc3Npc3RhbjF0CisuYXNzaXN0YW40dDRzMgorLmFzc2lzdGFudHMyaDQKKy5hc3Npc3RhbnQzc2gyaTRwCisuYXM5czhpOHM4dDlhOG44dDlzOGg4aThwOHMuCisuYXNzaXN0YW50c2hpMnAxczIKKy5hczh5OG04cDl0OG85bThhOHQ4aThjLgorLmFzNHkKKy5hc3k0bTFwCisuYXN5bTJwMXQKKy5hc3ltcDF0bworLmFzeW1wdG8ybWEKKy5hc3ltcHRvbWF0MWljCisuYXM5eThtOHA5dDhvOHQ5aThjLgorLmFzOHk4bjljOGg4cjhvOW44bzh1OHMuCisuYXN5bjNjNGhyNAorLmFzeW4yY2gKKy5hc3luY2hybzJuCisuYXN5bmNocm8xbm91MgorLmFzeW5jaHJvbm8ydXMKKy5hdDhoOWU4cjlvOXM4YzhsOGU5cjhvOXM4aThzLgorLjRhdGgKKy5hdGgyZQorLmF0aDJlcm8KKy5hdGhlcm9zMmMKKy5hdGhlcm9zY2xlNQorLmF0aGVyb3MxYzRsNAorLmF0aDJlcm9zY2w0ZXJvCisuYXRoZXJvc2NsZXJvMXNpcworLmF0OW04bzhzOXA4aDhlOHI4ZS4KKy5hNHQxbQorLmF0MW1vCisuYXRtb3MyCisuYXRtbzNzcAorLmF0bW9zMnBoZQorLmF0bW8zc3BoNGVyCisuYXQ5bThvOHM5cDhoOGU4cjhlOHMuCisuYXQ5dDhyOGk4Yjl1OHQ4ZThkLgorLmE0dDN0MgorLmF0dHI0aWIKKy5hdHRyaWJ1MnQxZWQKKy5hdDl0OHI4aThiOXU4dDlhOGI4bDhlLgorLmF0dHJpNGJ1MXRhCisuYXR0cmlidTJ0YTRiCisuYXR0cmlidXRhYjJsMgorLmF1OXQ4bzltOGE5dDhpOG84bi4KKy5hdTF0bworLmF1dG8ybWEKKy5hdXRvbWExdDJpbworLmF1dG9tYXRpbzJuCisuYXU5dDhvOG05YTl0OG84bi4KKy5hdXRvbWExdG8KKy5hdXRvbWF0bzJuCisuYXU5dDhvOG05YTl0OGEuCisuYXV0b21hMnRhCisuYXU5dDhvOW44dThtOWI4ZThyOWk4bjhnLgorLmF1NXRvMm4KKy5hdXRvbjV1bQorLmF1dG9udTRtMWIKKy5hdXRvbnVtYmVyMWkKKy5hdXRvbnVtYmVyaW40ZworLmF1OXQ4bzhuOW85bThvOHU4cy4KKy5hdTR0b25vCisuYXV0b25vNG1vCisuYXV0b25vM21vMnVzCisuYXV0b25vbW91MgorLmF1OHQ4bzlyOG84dThuOGQ5aThuOGcuCisuYXV0b3JvdTIKKy5hdXRvcm91bjJkCisuYXV0b3JvdW5kMWluCisuYXY5bzhpOHI5ZDh1OXA4bzhpOHMuCisuYXZvaTQKKy5hdm80aXIKKy5hdm9pcjFkdQorLmF2b2lyNGR1cAorLmF2b2lyZHVwb2kyCisuYmE4bjhkOWw4ZThhOGQ4ZThyLgorLmI0YW5kCisuYmFuMWRsCisuYmFuZGxlMmEKKy5iYW5kbGVhMmQxCisuYmE4bjhkOWw4ZThhOGQ4ZThyOHMuCisuYmFuZGxlYWRlNHI1czIKKy5iYThuOGs5cjh1OHA4dC4KKy5iYTRuazIKKy5iYW5rcnUycDF0CisuYmE4bjhrOXI4dThwOHQ5Yzh5LgorLmJhbmtydXA0dGMKKy5iYW5rcnVwdDFjeQorLmJhOG44azlyOHU4cDh0OWM4aThlOHMuCisuYmFua3J1cHQxY2kKKy5iYW5rcnVwdGMyaWU0CisuYmE4cjlvOG44aThlOHMuCisuYjJhMnIKKy5iYTVyb25pCisuYmFybzJuCisuYmFyb24yaWU0CisuYmE4czhlOWw4aThuOGU5czhrOGk4cC4KKy5iYXNlbDJpCisuYmFzZTFsNGluZQorLmJhc2VsaTFuZXMKKy5iYXNlbGluZXNrMgorLmJhc2VsaW5lc2sxaQorLmJhc2VsaW5lc2syaTRwCisuYmE5dDhoOHk4bTllOXQ4cjh5LgorLjFiYXQKKy5iNGF0aAorLmJhdGh5bWU0CisuYmF0aHltNGV0cgorLmJhdGh5bWUzdHJ5CisuYmE4dDhoOHk5czhjOGE4cDhoOGUuCisuYmF0aHkycworLmJhdGh5czRjCisuYmF0aHlzY2E0cAorLmJhdGh5czFjYQorLmJlOGE4bjlpOGU4cy4KKy5iZWEybgorLmJlYTNuaWVzCisuYmVhbjJpZTQKKy5iZTloOGE4djlpOG84dThyLgorLmJlMWg0CisuYmVoYXYxaQorLmJlaGF2aTFvdTIKKy5iZWhhdjJpbworLmJlaGF2aTRvdXIKKy5iZTloOGE4djlpOG84dThyOHMuCisuYmVoYXZpb3U0cnMyCisuYmU4djhpOGU4cy4KKy5iZTF2aQorLmJldjJpZTQKKy5iaThiOWw4aTlvOGc5cjhhOXA4aDh5OXM4dDh5OGw4ZS4KKy5iaTJiCisuYmkxYjJsMgorLmJpYjNsaQorLmJpYmxpNW9nCisuYmlibDJpbworLmJpYmxpbzJncgorLmJpYmxpbzRnM3JhMXBoeQorLmJpYmxpb2dyYXBoeTJzCisuYmlibGlvZ3JhcGh5czF0CisuYmlibGlvZ3JhcGh5czJ0eQorLmJpYmxpb2dyYXBoeXMydHlsCisuYmk5ZDhpOGY5ZjhlOHI5ZThuOXQ4aThhOGwuCisuYjJpNGQKKy5iaTJkaQorLmJpZDFpZgorLmJpZGk0ZjFmCisuYmlkaWZmZXIxCisuYmlkaWZmZXIzZW4xdAorLmJpZGlmZmVyZW50MmkKKy5iaWRpZmZlcmVuMXQyaTFhCisuYmlkaWZmZXJlbnRpMmFsCisuYmk4ZzlnOGU4czh0LgorLmIyaWcKKy5iaTRnMWcyCisuYmlnMmdlCisuYmk4bDhsOWE4YjhsOGUuCisuMWJpbAorLmJpbGw1YWIKKy5iaWwxbAorLmJpbGxhYjJsMgorLmJpOG85bThhOHQ4aDllOW04YTh0OWk4YzhzLgorLmIyaW8KKy5iaW80bQorLmJpbzFtYQorLmJpb200YXRoMworLmJpb21hdGg1ZW0KKy5iaW9tYXRoMmUKKy5iaW9tYXRoZTFtYQorLmJpb21hdGhlbWF0MWljCisuYmlvbWF0aGVtYXRpNGMzczIKKy5iaThvOW04ZThkOWk5YzhhOGwuCisuYmlvMm1lCisuYmlvMm1lZAorLmJpb200ZWRpCisuYmlvbWVkM2kxY2EKKy5iaThvOW04ZThkOWk5YzhpOG44ZS4KKy5iaW9tZWQyaTFjaQorLmJpb21lZGkyY2luCisuYmlvbWVkaWMyaW5lCisuYmk4bzlyOGg4eTh0OGg4bThzLgorLmJpb3JoNAorLmJpb3JoeXQ0aDFtCisuYmlvcmh5dGg0bTFzMgorLmJpOHQ5bThhOHAuCisuYmkydAorLmJpNHQxbQorLmJpdDFtYQorLmJpdDRtYXAKKy5iaTh0OW04YThwOHMuCisuYml0bWEycDFzMgorLmJsOGE4bjhkOWU4ci4KKy5iMmwyCisuYjNsNGFuZAorLmJsYTJuCisuYmxhbjFkZQorLmJsOGE4bjhkOWU4czh0LgorLmJsYW5kZTRzMgorLmJsOGk4bjhkOWU4ci4KKy5ibDRpbmQKKy5ibGluMWRlCisuYmw4bzhuOGQ4ZThzLgorLmI0bG8KKy5ibG8ybgorLmJsMm9uZAorLmJsb24xZGUKKy5ibG9uZGVzMgorLmJsOHU4ZTlwOHI4aThuOHQuCisuYmx1ZXByMgorLmJsdWVwcmluNHQzCisuYmw4dThlOXA4cjhpOG44dDhzLgorLmJsdWVwcmluNHQ0czIKKy5ibzlsOG84bTllOXQ4ZThyLgorLmJvbG8ybWUKKy5ib2xvNG1ldAorLmJvbG9tZTF0ZQorLmJvOG84azlzOGU4bDhsOWU4ci4KKy4zYm9vMgorLmJvMm80aworLmJvbzRrMXMyCisuYm9va3NlbDFsCisuYm9va3NlbDJsZQorLmJvOG84azlzOGU4bDhsOWU4cjhzLgorLmJvb2tzZWxsZTRyMXMyCisuYm84bzhsOWU4YThuLgorLmJvb2xlMmEKKy5ib29sZWEybgorLmJvOG84bDllOGE4bjhzLgorLmJvb2xlYTJuMXMyCisuYm84cjluOG85bDhvOGc5aTljOGE4bC4KKy5ib3JubzQKKy5ib3JubzNsb2cxaWMKKy5ib3Jub2xvZ2kxY2EKKy5ibzh0OXU5bDhpOHM4bS4KKy5ibzF0dQorLmJvdHVsMmkKKy5ib3R1bGkyczFtCisuYnI4dThzOHE4dThlOHIuCisuYnIydXMKKy5icnVzcXUyCisuYnJ1czNxdWVyCisuYnU4ZjlmOGU4ci4KKy5idWY0ZmVyMQorLmJ1NGYxZgorLmJ1OGY5ZjhlOHI4cy4KKy5idWZmZTRyMXMyCisuYnU4czhpOGU4ci4KKy5idXM1aWU0CisuYjJ1cworLmJ1OHM4aThlOHM4dC4KKy5idXNpMWVzdAorLmJ1OHM4czhpOG44Zy4KKy5idTJzcworLmJ1czFzaQorLmJ1czJzMWluCisuYnVzczNpbmcKKy5idTh0OHQ4ZThkLgorLmJ1dDJ0MWVkCisuYnU4ejh6OXc4bzhyOGQuCisuYnU0ejF6MgorLmJ1enoxd28yCisuYnU4ejh6OXc4bzhyOGQ4cy4KKy5idXp6d29yMmQxczIKKy5jYTljOG84cDhoOW85bjh5LgorLmNhMWNvCisuY2FjMm9waAorLmNhY29waG81bnkKKy5jYWNvcGhvMm4KKy5jYTljOG84cDhoOW85bjhpOGU4cy4KKy5jYWNvNXBob25pCisuY2Fjb3Bob24yaWU0CisuY2E4bDhsOWU4ci4KKy5jYWwxbAorLmNhbDJsZQorLmNhOGw4bDllOHI4cy4KKy5jYWxsZTRyMXMyCisuY2E4bTllOHI4YTltOGU4bi4KKy5jYW01ZXIxYQorLmNhbWVyYTFtZW4KKy5jYThyOHQ5dzhoOGU4ZThsLgorLmNhcnR3NAorLmNhOHI4dDl3OGg4ZThlOGw4cy4KKy5jYXJ0d2hlZTJsMXMyCisuY2E5dDhhOHI4cjhoOHMuCisuY2EydGEKKy5jYXQyYTJyCisuY2F0YXIxcjQKKy5jYXRhcnJoNAorLmNhdGFycjRoMXMyCisuY2E4dDlhOXM4dDhyOG84cDhoOWk4Yy4KKy5jYXRhczF0NHIKKy5jYXRhc3RyMm9waAorLmNhdGFzdHJvcGgxaWMKKy5jYTh0OWE5czh0OHI4bzhwOGg5aTljOGE4bDhsOHkuCisuY2F0YXN0cm9waGkxY2EKKy5jYXRhc3Ryb3BoaWNhbDFsCisuY2F0YXN0cm9waGljYWwxbHkKKy5jYTh0OWU5bjhvOGk4ZC4KKy5jYXQ0ZW5vCisuY2F0ZW5vaTIKKy5jYXRlbm8yaWQKKy5jYTh0OWU5bjhvOGk4ZDhzLgorLmNhdGVub2kyZDFzMgorLmNhOHU5bDhpOWY4bDhvOHc5ZThyLgorLmNhdTRsMgorLmNhdWwyaQorLmNhdWxpNGY0bDIKKy5jYXVsaWZsb3cxZXIKKy5jaDhhOHA5YThyOXI4YThsLgorLmNoYXAyYTJyNAorLmNoYTFwYQorLmNoYXBhcjFyNAorLmNoOGE4cjl0OHI4ZTh1OHM4ZS4KKy5jaDJhMnIKKy5jaGFydHI0ZXUyCisuY2hhcnRyZTJ1czQKKy5jaDhlOG04bzl0OGg4ZThyOWE4cDh5LgorLmNoZTIKKy5jaGUxbW8KKy5jaGVtNG90aDMKKy5jaGVtb3RoMmUKKy5jaGVtb3RoNGVyMWEKKy5jaGVtb3RoZXJhM3AKKy5jaDhlOG04bzl0OGg4ZThyOWE5cDhpOGU4cy4KKy5jaGVtb3RoZXJhcDJpZTQKKy5jaDhsOG84cjhvOW04ZTh0OGg5YThuOGUuCisuYzRoMWw0CisuY2gybG8KKy5jaGxvcm8ybWUKKy5jaGxvcm80bWV0CisuY2hsb3JvbWV0aGEybjQKKy5jaDhsOG84cjhvOW04ZTh0OGg5YThuOGU4cy4KKy5jaGxvcm9tZXRoYTFuZXMKKy5jaDhvOWw4ZThzOXQ4ZThyOGk4Yy4KKy4zY2hvMgorLmMzaG9sNGUKKy5jaG9sZXMyCisuY2hvbGVzMXRlcjFpCisuY2k4ZzlhOXI4ZTh0OHQ4ZS4KKy5jMmlnCisuY2kxZ2EKKy5jaWcyYTJyCisuY2lnYXJlNHQzdDIKKy5jaThnOWE5cjhlOHQ4dDhlOHMuCisuY2lnYXJldDR0ZXMKKy5jaThuOHE4dThlOWY4bzhpOGwuCisuMmNpbgorLmNpbjFxCisuY2lucXUyCisuY2lucXVlMWYKKy5jaW5xdWUxZm8KKy5jaW5xdWVmb2kyCisuY285YThzOHM4bzljOGk4YTl0OGk4djhlLgorLmM0b2EKKy5jb2Eyc3MKKy5jb2FzMXNvCisuY29hc3NvMWNpCisuY29hc3NvM2MyaTFhCisuY29hc3NvY2k0YTF0Mml2CisuY285ZzhuOGE4Yy4KKy4yY29nCisuY29nMW40YQorLmNvOWc4bjhhOGM4cy4KKy5jb2duYTRjM3MyCisuY285azhlOHI5bjhlOGwuCisuYzJvaworLmNvazFlcgorLmNva2VyM25lbAorLmNvOWs4ZThyOW44ZThsOHMuCisuY29rZXJuZTJsMXMyCisuY284bDlsOGk4bjllOGE5dDhpOG84bi4KKy5jb2wxbAorLmNvbGwyaQorLmNvbDJsaW40CisuY29sMWw0aW5lCisuY29sbGluM2VhCisuY29sbGluZWEydAorLmNvbGxpbmVhMXQyaW8KKy5jb2xsaW5lYXRpbzJuCisuY284bDl1OG04bjhzLgorLmNvbHU0bTFuCisuY29sdW0ybjFzMgorLmNvOG05cDhhOHI5YThuOGQuCisuY280bTFwCisuY29tcGFyYTUKKy5jb20xcGEKKy5jb21wMmEycgorLmNvbXBhcmEybgorLmNvbXBhcjRhbmQKKy5jbzhtOXA4YThyOWE4bjhkOHMuCisuY29tcGFyYW4yZDFzMgorLmNvOG05cDhlOG45ZDhpOHU4bS4KKy5jb21wZW5kaTF1CisuY284bTlwOG85bjhlOG44dDl3OGk4czhlLgorLmNvbXBvMm4KKy5jb21wbzNuZW4KKy5jb21wb25lbjF0CisuY29tcG9uZW50dzQKKy5jb21wb25lbnR3aXM0CisuY29tcG9uZW50d2kyCisuY29tcG9uZW50M3c0aXNlCisuY284bThwOXQ4cjhvOGw5bDhlOHIuCisuY29tcDR0cgorLmNvbTJwMXQKKy5jb21wdHJvbDFsCisuY29tcHRyb2wybGUKKy5jbzhtOHA5dDhyOG84bDlsOGU4cjhzLgorLmNvbXB0cm9sbGU0cjFzMgorLmNvOG45ZjhvOHI4bTlhOGI4bDhlLgorLmNvMm4KKy5jb24zZgorLmNvbjFmbworLmNvbmZvMnIKKy5jb25mb3IxbQorLmNvbmZvcjFtYQorLmNvbmZvcjJtYWIKKy5jb25mb3JtYWIybDIKKy5jbzhuOWY4bzhyOG05aThzOHQuCisuY29uZm9yMm1pCisuY29uZm9ybTJpcworLmNvOG45ZjhvOHI4bTlpOHM4dDhzLgorLmNvbmZvcm1pczR0MXMyCisuY284bjlmOG84cjhtOWk4dDh5LgorLmNvbmZvcjNtaXQKKy5jb25mb3JtaTF0eQorLmNvOG45ZzhyOGU4czhzLgorLmNvbjNnCisuY29uMWdyCisuY29uZ3IyZTJzcworLmNvOG45ZzhyOGU4czhzOGU4cy4KKy5jb25ncmVzczFlNHMKKy5jbzhuOXQ4cjhpOGI5dTh0OGUuCisuY29uNXQKKy5jb250cjRpYgorLmNvOG45dDhyOGk4Yjl1OHQ4ZThzLgorLmNvOG45dDhyOGk4Yjl1OHQ4ZThkLgorLmNvbnRyaWJ1MnQxZWQKKy5jbzlyOGU5bDhhOXQ4aThvOG4uCisuY29yZTFsYQorLmNvcmVsYTF0MmlvCisuY29yZWxhdGlvMm4KKy5jbzlyOGU5bDhhOXQ4aThvOG44cy4KKy5jb3JlbGF0aW8ybjNzMgorLmNvOXI4ZTlsOGk5ZzhpOG84bjlpOHM4dC4KKy5jb3JlMWwyaQorLmNvcmVsMmlnCisuY29yZWw0aWdpCisuY29yZWxpNWcyaW8KKy5jb3JlbGlnaW9uM2kKKy5jb3JlbGlnaW8ybgorLmNvcmVsaWdpb24xaXMKKy5jbzlyOGU5bDhpOWc4aThvOG45aThzOHQ4cy4KKy5jb3JlbGlnaW9uaXM0dDFzMgorLmNvOXI4ZTlvOHA5czhpOHMuCisuY29yZTFvCisuY29yZW8ycDFzMgorLmNvcmVvcDFzaXMKKy5jbzlyOGU5czhwOG84bjlkOGU4bjh0LgorLmNvcmUxc3AKKy5jb3JlczRwbzJuCisuY29yZXNwMm9uZAorLmNvcmVzcG9uMWRlCisuY29yZXNwb24xZGVuCisuY29yZXNwb25kZW4xdAorLmNvOXI4ZTlzOHA4bzhuOWQ4ZThuOHQ4cy4KKy5jb3Jlc3BvbmRlbjR0NHMyCisuY285czhlOWM4YThuOHQuCisuY29zNGUKKy5jb3NlMWNhCisuY29zZWNhMm4KKy5jb3NlY2FuMXQKKy5jbzl0OGE4bjlnOGU4bjh0LgorLmNvNHRhMm4KKy5jbzF0YQorLmNvdDJhbmcKKy5jb3RhbjFnZW4KKy5jb3RhbmdlbjF0CisuY284dThyOXM4ZThzLgorLmNvdTIKKy5jb3U0cnMyCisuY291cjJzZQorLmNvdXJzM2U0cworLmNvOXc4bzhyOGs5ZThyLgorLmNvNHdvMgorLmNvd29yazFlcgorLmNvOXc4bzhyOGs5ZThyOHMuCisuY293b3JrZTRyMXMyCisuY3I4YThuOGs5YzhhOHM4ZS4KKy5jcmEybgorLmNyYTRuazIKKy5jcmFuazFjYQorLmNyOGE4bjhrOXM4aDhhOGY4dC4KKy5jcmFuNGsxczIKKy5jcmFua3MyaAorLmNyYW5rc2hhMmYKKy5jcmFua3NoYTJmdAorLmNyOG84YzlvOWQ4aThsOGUuCisuY3Iyb2MKKy5jcm80Y29kCisuY3JvMWNvCisuY3I4bzhjOW85ZDhpOGw4ZThzLgorLmNyb2NvZGlsZXMyCisuY3I4bzhzOHM5aDhhOHQ4YzhoLgorLmNybzJzNHMKKy5jcm9zczJoCisuY3Jvc3NoYTR0YworLmNyb3NzaGF0NGNoCisuY3I4bzhzOHM5aDhhOHQ4YzhoOGU4ZC4KKy5jcm9zc2hhdGNoZTIKKy5jcm9zc2hhdDRjaDRlZAorLmNyOG84czhzOW84djhlOHIuCisuY3JvczFzbworLmNyb3M0c292CisuY3I4eThwOXQ4bzlnOHI4YThtLgorLmNyeTJwMXQKKy5jcnlwMXRvCisuY3J5cHRvMmdyCisuY3I4eThwOXQ4bzlnOHI4YThtOHMuCisuY3J5cHRvZ3JhNG0xczIKKy5jdThmOGY5bDhpOG44ay4KKy5jNHVmCisuY3U0ZjFmCisuY3VmZjRsMgorLmN1ZmZsaW40CisuY3VmZmw0aTRuazIKKy5jdThmOGY5bDhpOG44azhzLgorLmN1ZmZsaW40azFzMgorLmN1OW44ZThpOWY4bzhyOG0uCisuM2N1bgorLmN1Mm5lCisuY3VuZWkyCisuY3VuZWkxZm8KKy5jdW5laWZvMnIKKy5jdW5laWZvcjFtCisuY3U4czl0OG84bTlpOHo5YTliOGw4ZS4KKy4xYzJ1cworLmN1czF0bworLmN1c3RvbTJpegorLmN1c3RvbWl6YTEKKy5jdXN0b21pejVhMmIKKy5jdXN0b21pemFiMmwyCisuY3U4czl0OG84bTlpOHo4ZS4KKy5jdXN0b21pMnplCisuY3U4czl0OG84bTlpOHo4ZThzLgorLmN1OHM5dDhvOG05aTh6OGU4ZC4KKy5kYThjOGg4czloOHU4bjhkLgorLjFkMmEKKy5kYTJjaDQKKy5kYWM0aDFzMgorLmRhY2g0czJoCisuZGE4bTlzOGU4bDlmOGw4eS4KKy5kYTJtMgorLmRhNG0xczIKKy5kYW01c2UybDJmCisuZGFtc2VsZjRsMgorLmRhbXNlbGYybHk1CisuZGE4bTlzOGU4bDlmOGw4aThlOHMuCisuZGFtc2VsZmwyaWU0CisuZGE4Yzh0OHk4bDlvOWc4cjhhOG0uCisuZGEyYzF0CisuZGFjMXR5CisuZGFjMnR5bAorLmRhY3R5M2xvCisuZGFjdHlsbzFncgorLmRhOGM4dDh5OGw5bzlnOHI4YThwOGguCisuZGE4dDhhOWI4YThzOGUuCisuM2RhdAorLmRhMnRhCisuZGEydGFiCisuZGE4dDhhOWI4YThzOGU4cy4KKy5kYXRhYmFzMWU0cworLmRhOHQ4YTlwOGE4dDhoLgorLmRhdDVhcAorLmRhdGFwNWF0CisuZGF0YTFwYQorLmRhdGFwNGF0aAorLmRhOHQ4YTlwOGE4dDhoOHMuCisuZGF0YXBhMnQ0aDFzMgorLmRhOHQ4ZTlzOHQ4YThtOHAuCisuZGF0M2VzdAorLmRhdGVzMXRhCisuZGF0ZXN0YTRtMXAKKy5kYTh0OGU5czh0OGE4bThwOHMuCisuZGF0ZXN0YW0ycDFzMgorLmRlOWM4bDhhOHI5YThiOGw4ZS4KKy5kZTRjbDJhMnIKKy5kZWNsYTJyYWIKKy5kZWNsYXJhYjJsMgorLmRlOWY4aThuOWk5dDhpOHY4ZS4KKy5kZTFmCisuZGUxZmkKKy5kZTJmaW4KKy5kZWYyaW5pCisuZGVmaW4yaXQKKy5kZWZpbmkxdGkKKy5kZWZpbmkxdDJpdgorLmRlOWw4ZThjOXQ4YTliOGw4ZS4KKy5kNWVsZWMKKy5kZWxlMmMxdAorLmRlbGVjMnRhNGIKKy5kZWxlYzF0YQorLmRlbGVjdGFiMmwyCisuZGU4bThpOXM4ZThtOGk5cTh1OGE5djhlOHIuCisuZGU0bTJpcworLmRlbTRpc2UKKy5kZW1pc2VtaTNxdWEKKy5kZW1pc2VtaXF1MgorLmRlbWlzZW1pcXVhNXY0CisuZGU4bThpOXM4ZThtOGk5cTh1OGE5djhlOHI4cy4KKy5kZW1pc2VtaXF1YXZlNHIxczIKKy5kZTltOG84YzlyOGE5dDhpOHM4bS4KKy5kZTRtb2NyCisuZGVtb2NyYXRpMnM0bQorLmRlOG04bzhzLgorLmRlbW9zMgorLmRlOXI4aTh2OWE5dDhpOHY4ZS4KKy5kZXIyaTR2CisuZGU0cmkxdmEKKy5kZXJpM3ZhdAorLmRlcjJpdmExdDJpdgorLmRlOXI4aTh2OWE5dDhpOHY4ZThzLgorLmRlcml2YXRpdjRlMnMKKy5kaThhOWw4ZThjOXQ4aThjLgorLjFkNGkzYQorLmRpMmFsCisuZGkyYWxlCisuZGlhbGUyYzF0CisuZGk4YTlsOGU4Yzl0OGk4YzhzLgorLmRpYWxlY3RpNGMzczIKKy5kaThhOWw4ZThjOXQ4aTljOGk4YThuLgorLmRpYWxlY3QyaTFjaQorLmQyaTFhbGVjdGkzYzJpMWEKKy5kaWFsZWN0aWNpMmEybgorLmRpOGE5bDhlOGM5dDhpOWM4aThhOG44cy4KKy5kaWFsZWN0aWNpYTJuMXMyCisuZGk5YzhoOGw4bzhyOG85bThlOHQ4aDlhOG44ZS4KKy5kNGkyY2gKKy5kaWM0aDFsNAorLmRpY2gybG8KKy5kaWNobG9ybzJtZQorLmRpY2hsb3JvNG1ldAorLmRpY2hsb3JvbWV0aGEybjQKKy5kaThmOWY4cjhhOGM4dC4KKy5kMWlmCisuZGlmNGZyCisuZGk0ZjFmCisuZGlmZnJhMmMxdAorLmRpOGY5ZjhyOGE4Yzh0OHMuCisuZGlmZnJhYzR0MXMyCisuZGk4ZjlmOHI4YThjOXQ4aThvOG4uCisuZGlmZnJhYzF0MmlvCisuZGlmZnJhY3RpbzJuCisuZGk4ZjlmOHI4YThjOXQ4aThvOG44cy4KKy5kaWZmcmFjdGlvMm4zczIKKy5kaThyOGU4ci4KKy5kNGlyMgorLmRpMXJlCisuZGlyMWVyNAorLmRpOHI4ZTluOGU4czhzLgorLmRpcmUxbmVzCisuZGlyZW4yZTJzcworLmRpOHM5cDhhOHI5YThuOGQuCisuZGlzMQorLmRpczFwCisuZGkyczFwYQorLmRpc3AyYTJyCisuZGlzcGFyYTJuCisuZGlzcGFyNGFuZAorLmRpOHM5cDhhOHI5YThuOGQ4cy4KKy5kaXNwYXJhbjJkMXMyCisuZGk4czl0OHI4YTh1OGc4aDh0OWw4eS4KKy5kNGlzM3QKKy5kaXN0NHIKKy5kaXMxdHJhCisuZGlzdHJhdWdoMworLmRpc3RyYXVnaDJ0bAorLmRpc3RyYXVnaHQxbHkKKy5kaThzOXQ4cjhpOGI5dTh0OGUuCisuZGlzdHI0aWIKKy5kaThzOXQ4cjhpOGI5dTh0OGU4cy4KKy5kaThzOXQ4cjhpOGI5dTh0OGU4ZC4KKy5kaXN0cmlidTJ0MWVkCisuZG84dTliOGw4ZTlzOHA4YThjOGUuCisuZG91MgorLmRvdTNiMmwyCisuZG91NWJsZTFzcAorLmRvdWJsZXMyCisuZG91YmxlMnMxcGEKKy5kb3VibGVzcGE0Y2UKKy5kbzh1OWI4bDhlOXM4cDhhOGM5aThuOGcuCisuZG91Ymxlc3A0YTJjaQorLmRvdWJsZXNwYTJjMWluCisuZG91Ymxlc3BhYzFpbmcKKy5kbzhsOGw5aThzOGguCisuZG9sMWwKKy5kb2xsMmkKKy5kb2xsaXMyaAorLmRyOGk4Zjh0OWE4ZzhlLgorLjFkcgorLmRyNGkyZnQKKy5kcmlmMXRhCisuZHI4aTh2OWU4cjhzLgorLmRyMml2CisuZHJpdmU0cjFzMgorLmRyOG84bTllOWQ4YThyOHkuCisuZHJvMm1lCisuZHJvMm1lZAorLmRyb20yZTJkMmEKKy5kcm9tZTRkYXJ5CisuZHJvbWVkMmEycgorLmRyOG84bTllOWQ4YThyOGk4ZThzLgorLmRyb21lZGFyMWkKKy5kcm9tZWRhcjJpZTQKKy5kdTlvOHA5bzlsOGk4czh0LgorLmR1b3BvbDJpCisuZHU5bzhwOW85bDhpOHM4dDhzLgorLmR1b3BvbGlzNHQxczIKKy5kdTlvOHA5bzhsOHkuCisuZHVvcG8ybHkKKy5keThzOWw4ZTh4OGk4YS4KKy5kMnkKKy5keXMxbDIKKy5keXMybGUKKy5keXNsZXgzaQorLmR5c2xleDJpNWEKKy5keThzOWw4ZThjOXQ4aThjLgorLmR5c2xlMmMxdAorLmVhOHM4dDllOG44ZDllOHI4cy4KKy5lYXN0MworLmVhczN0ZW4KKy5lYXMzdGVuZAorLmVhc3RlbjFkZQorLmVhc3RlbmRlNHI1czIKKy5lYzhvOW44bzhtOWk4YzhzLgorLmUxY28KKy5lY28ybgorLmVjbzNub21pYworLmVjb25vbWk0YzNzMgorLmVjOG84bjlvOW04aThzOHQuCisuZWNvbm9tMmlzCisuZWM4bzhuOW85bThpOHM4dDhzLgorLmVjb25vbWlzNHQxczIKKy5laTlnOGU4bjljOGw4YThzOHMuCisuZWkyCisuZTJpZzIKKy5laTFnZW4KKy5laWdlbjFjNGw0CisuZWlnZW5jbGEyc3MKKy5laTlnOGU4bjljOGw4YThzOHM4ZThzLgorLmVpZ2VuY2xhc3MxZTRzCisuZWk5ZzhlOG45djhhOGw5dThlLgorLmVpZ2VuMXYyCisuZWlnZW4xdmEKKy5laWdlbnZhbDF1CisuZWk5ZzhlOG45djhhOGw5dThlOHMuCisuZWw4ZThjOHQ4cjhvOW04ZThjOGg4YThuOWk5YzhhOGwuCisuNWVsZWMKKy5lbGUyYzF0CisuZWxlY3RybzJtZQorLmVsZWN0cm9tZTJjaAorLmVsZWN0cm9tZTVjaGE0bjFpYworLmVsZWN0cm9tZWNoYTJuCisuZWxlY3Ryb21lY2hhbmkxY2EKKy5lbDhlOGM4dDhyOG85bThlOGM4aDhhOG44bzlhOGM4bzh1OHM4dDhpOGMuCisuZWxlY3Ryb21lY2hhbm80CisuZWxlY3Ryb21lY2hhbjRvYQorLmVsZWN0cm9tZWNoYW5vYTFjbworLmVsZWN0cm9tZWNoYW5vYWNvdTIKKy5lbGVjdHJvbWVjaGFub2FjbzJ1cworLmVsZWN0cm9tZWNoYW5vYWNvdXN0MmkKKy5lbGVjdHJvbWVjaGFub2Fjb3VzMXRpYworLmVsOGk4dDlpOHM4dC4KKy5lbDJpCisuZWwxaXQKKy5lbGkxdGkKKy5lbDRpdGlzCisuZWw4aTh0OWk4czh0OHMuCisuZWxpdGlzNHQxczIKKy5lbjl0OHI4ZTlwOHI4ZTluOGU4dThyLgorLmVuMXQKKy5lbnRyZXByMgorLmVudHJlcHJlbjRldQorLmVuOXQ4cjhlOXA4cjhlOW44ZTh1OHI5aThhOGwuCisuZW50cmVwcmVuZXVyMmkzYQorLmVudHJlcHJlbmV1cmkyYWwKKy5lcDlpOW44ZThwOGg5cjhpOG44ZS4KKy5lcGkybgorLmVwMmluZQorLmVwaW5lcDRocjQKKy5lcDJpbmVwaHIyaW40ZQorLmVxOHU4aTl2OGE4cjhpOWE4bjh0LgorLmVxdTJpdjMKKy5lcXVpMXZhCisuZXF1aXYyYTJyCisuZXF1aXZhcjFpCisuZXF1aXZhcjNpMmEybgorLmVxdWl2YXIyaTNhCisuZXF1aXZhcjRpYW40dAorLmVxOHU4aTl2OGE4cjhpOWE4bjhjOGUuCisuZXF1aXZhcjRpYW5jCisuZXQ4aDlhOG44ZS4KKy5ldGhhMm40CisuZXQ4aDl5OGw5ZThuOGUuCisuZXY4ZThyOXM4aTliOGw4ZS4KKy5ldjFlcgorLmV2ZTRyMXMyCisuZXZlcjFzaQorLmV2ZXI0c2k0YgorLmV2ZXJzaTFiMmwyCisuZXY4ZThyOHQuCisuZXY4ZThyOHQ4cy4KKy5ldmVyNHQxczIKKy5ldjhlOHI4dDllOGQuCisuZXZlcjJ0MWVkCisuZXY4ZThyOHQ5aThuOGcuCisuZXZlcjF0aQorLmV2ZXIydDFpbgorLmV4OXE4dThpOHM5aTh0OGUuCisuZXhxdTIKKy5leHEydWkyCisuZXhxdWlzMml0ZQorLmV4OXQ4cjhhOW84cjlkOGk5bjhhOHI4eS4KKy5leDF0MgorLmV4MXRyYQorLmV4dHI0YW8KKy5leHRyYW9yZDJpCisuZXh0cmFvcmQxaW40CisuZXh0cmFvcjFkaTFuYQorLmV4dHJhb3JkaW4yYTJyCisuZmE4bDhsOWk4bjhnLgorLjFmYQorLmZhbDFsCisuZmFsbDJpCisuZmFsMmxpbjQKKy5mZThyOG04aTlvOG44cy4KKy5mZXIxCisuZmVyM200CisuZmVyNG0yaW8KKy5mZXJtaW8ybgorLmZlcm1pbzJuM3MyCisuZmk5bjhpOHQ4ZTlsOHkuCisuMWZpCisuMmZpbgorLmYyaW5pCisuZmluMml0CisuZmluMml0ZQorLmZpbml0ZTFseQorLmZsOGE5ZzhlOGw5bDh1OG0uCisuZjRsMgorLmZsYWc1ZWwxbAorLmZsOGE5ZzhlOGw5bDhhLgorLmZsYWc0ZWxsYQorLmZsOGE4bTltOGE5YjhsOGU4cy4KKy5mbGFtMW0KKy5mbGFtMW1hCisuZmxhbTJtYWIKKy5mbGFtbWFiMmwyCisuZmxhbW1hYmxlczIKKy5mbDhlOGQ4ZzlsOGk4bjhnLgorLmZsZWRnbDIKKy5mbDhvOHc5YzhoOGE4cjh0LgorLmZsb3cyY2gKKy5mbG93Y2gyYTJyCisuZmw4bzh3OWM4aDhhOHI4dDhzLgorLmZsb3djaGFyNHQxczIKKy5mbDh1OG84cjhvOWM4YThyOWI4bzhuLgorLmZsdTNvCisuZmx1bzNyCisuZmx1b3Iyb2MKKy5mbHVvcm8xY2EKKy5mbHVvcm9jMmEycgorLmZsdW9yb2NhcjFiCisuZmx1b3JvY2FyYjRvCisuZmx1b3JvY2FyYm8ybgorLmZvOHI5bThpOWQ4YTliOGw4ZS4KKy5mb3IybWkKKy5mb3JtaTFkNGEKKy5mb3JtMmlkCisuZm9ybWkyZDNhNGIKKy5mb3JtaWRhYjJsMgorLmZvOHI5bThpOWQ4YTliOGw4eS4KKy5mb3JtaWRhYjFseQorLmZvOHI5czh5OHQ4aDlpOGEuCisuZm80cnMyCisuZm9yczR5CisuZm9yc3l0aDJpMWEKKy5mbzhyOHQ4aDlyOGk4ZzhoOHQuCisuZm9ydDRocjQKKy5mb3J0aHIyaWcKKy5mcjhlOGU5bDhvOGE4ZDhlOHIuCisuZnJlZWw0b2EKKy5mcmVlbG9hMmQzCisuZnI4ZThlOWw4bzhhOGQ4ZThyOHMuCisuZnJlZWxvYWRlNHI1czIKKy5mcjhpOGU4bjhkOWw4aThlOHIuCisuZnJpMgorLmZyMmllNAorLmZyaWVuZGwyaWU0CisuZnI4aTl2OG84bDlpOHQ4eS4KKy5mcjJpdgorLmZyaXZvbDJpCisuZnJpdm9sMWl0CisuZnJpdm9saTF0eQorLmZyOGk5djhvOGw5aTl0OGk4ZThzLgorLmZyaXZvbGkxdGkKKy5mcml2b2xpdDJpZTQKKy5mcjhpOHY5bzlsOG84dThzLgorLmZyaXZvbG91MgorLmZyaXZvbG8ydXMKKy5nYTlsOGE4Yzl0OGk4Yy4KKy5nYWxhMmMxdAorLmdhOGw5YTh4OHkuCisuZ2E4bDlhOHg5aThlOHMuCisuZ2FsYXgzaQorLmdhbGF4MmllNAorLmdhOHM5bzhtOWU5dDhlOHIuCisuZ2Exc28KKy5nYTNzb20KKy5nYXNvMm1lCisuZ2FzbzRtZXQKKy5nYXNvbWUxdGUKKy5nZTlvOWQ4ZThzOWk4Yy4KKy5nZW9kZXMyCisuZ2VvZGUxc2kKKy5nZW9kZTJzaWMKKy5nZTlvOWQ4ZTh0OWk4Yy4KKy5nZW9kZTF0CisuZ2VvZGV0MWljCisuZ2U4bzltOGU4dDlyOGk4Yy4KKy5nZTNvbQorLmdlbzJtZQorLmdlbzRtZXQKKy5nZW9tNGV0cgorLmdlbzVtZXQzcmljCisuZ2U4bzltOGU4dDlyOGk4YzhzLgorLmdlb21lNHRyaTRjM3MyCisuZ2U5bzlzOHQ4cjhvOHA4aDhpOGMuCisuZ2VvczQKKy5nZW9zdDRyCisuZ2Vvc3RyMm9waAorLmdlb3N0cm9waDFpYworLmdlOG85dDhoOGU4cjltOGE4bC4KKy5nZTRvdAorLmdlNG90aAorLmdlb3RoMmUKKy5nZW90aGVyM200CisuZ2VvdGhlcjFtYQorLmdlOW84dDlyOG85cDhpOHM4bS4KKy5nZW90cm9waTJzMW0KKy5nbjhvOW04bzhuLgorLmcxbm8KKy5nbm80bW8KKy5nbm80bW8ybgorLmduOG85bThvOG44cy4KKy5nbm9tbzJuM3MyCisuZ3I4YThuOGQ5dThuOGM4bDhlLgorLjFncgorLmdyYTJuMgorLmdyNGFuZAorLmdyYW4xZHUKKy5ncmFuZHU0bgorLmdyYW5kdW4xYzRsNAorLmdyOGE4bjhkOXU4bjhjOGw4ZThzLgorLmdyYW5kdW5jbGVzMgorLmdyOGk4ZTh2OWE4bjhjOGUuCisuZ3IyaWU0CisuZ3JpZTF2YQorLmdyaWV2YTJuCisuZ3I4aThlOHY5YThuOGM4ZThzLgorLmdyOGk4ZTh2OW84dThzLgorLmdyaWV2b3UyCisuZ3JpZXZvMnVzCisuZ3I4aThlOHY5bzh1OHM5bDh5LgorLmdyaWV2b3VzMWwyCisuZ3JpZXZvdXMxbHkKKy5oYThpOHI5czh0OHk4bDhlLgorLmhhaTIKKy5oYTRpcgorLmhhaTRyczIKKy5oYWlyczJ0eQorLmhhaXJzMnR5bAorLmhhOGk4cjlzOHQ4eThsOGU4cy4KKy5oYWlyc3R5bGVzMgorLmhhOGk4cjlzOHQ4eThsOWk4czh0LgorLmhhOGk4cjlzOHQ4eThsOWk4czh0OHMuCisuaGFpcnN0eWxpczR0MXMyCisuaGE4bDhmOXM4cDhhOGM4ZS4KKy5oYTJsZgorLmhhbDJmM3MKKy5oYWxmMnMxcGEKKy5oYWxmc3BhNGNlCisuaGE4bDhmOXM4cDhhOGM4ZThzLgorLmhhOGw4Zjl3OGE4eS4KKy5oYThyOWI4aThuOWc4ZThyLgorLmgyYTJyCisuaGFyMWIKKy5oYXJiaTIKKy5oYXIyYmluCisuaGFyYjRpbmdlCisuaGE4cjliOGk4bjlnOGU4cjhzLgorLmhhcmJpbmdlNHIxczIKKy5oYThyOWw4ZTlxOHU4aThuLgorLmhhcjRsZTQKKy5oYXIxbAorLmhhcmxlMXEKKy5oYXJsZXF1MgorLmhhcmxlcTJ1aTIKKy5oYXJsZXF1aTRuCisuaGE4cjlsOGU5cTh1OGk4bjhzLgorLmhhcmxlcXUyaTJuMXMyCisuaGE4dDhjOGg5ZThyOGk4ZThzLgorLmhhNHRjCisuaGF0NGNoCisuaGF0Y2hlMgorLmhhdGNoZXIxaQorLmhhdGNoZXIyaWU0CisuaGU4bThpOWQ4ZThtOGk5czhlOG04aTlxOHU4YTl2OGU4ci4KKy5oZW0yaWQKKy5oZW1pZDRlbQorLmhlbWlkZTRtMmlzCisuaGVtaWRlbTRpc2UKKy5oZW1pZGVtaXNlbWkzcXVhCisuaGVtaWRlbWlzZW1pcXUyCisuaGVtaWRlbWlzZW1pcXVhNXY0CisuaGU4bThpOWQ4ZThtOGk5czhlOG04aTlxOHU4YTl2OGU4cjhzLgorLmhlbWlkZW1pc2VtaXF1YXZlNHIxczIKKy5oZTltOG85ZzhsOG85YjhpOG4uCisuaGVtbzRnCisuaGUxbW8KKy5oZW1vNGdsMgorLmhlbW8zZ2xvCisuaGVtb2dsbzFiaQorLmhlbW9nbG8yYmluCisuaGU5bThvOXA4aDhpOGw5aThhLgorLmhlbTJvcGgKKy5oZW1vcGg0aWwyCisuaGVtb3BoaWwxaQorLmhlbW9waGlsM2kxYQorLmhlOW04bzlwOGg4aThsOWk4YThjLgorLmhlOW04bzlwOGg4aThsOWk4YThjOHMuCisuaGVtb3BoaWxpYTRjM3MyCisuaGU4bThvOXI4aDhlOW84bDlvOGc4eS4KKy5oZW1vMnIKKy5oZW1vcmg0CisuaGVtb3JoZTNvbAorLmhlbW9yaGVvbDFvMWd5CisuaGU5cDhhOHQ5aThjLgorLmhlcDUKKy5oZTJwYQorLmhlcGF0MWljCisuaGU4cjltOGE4cDhoOXI4bzlkOGk4dDhlLgorLmhlcjNtNAorLmhlcjFtYQorLmhlcjRtYXAKKy5oZXJtYXA0aHI0CisuaGVybWFwaHJvZDJpdGUKKy5oZThyOW04YThwOGg5cjhvOWQ4aTh0OWk4Yy4KKy5oZXJtYXBocm9kMmkxdGkKKy5oZXJtYXBocm9kNGkydGljCisuaGU5cjhvOGU4cy4KKy5oZXJvNGUKKy5oZTh4OGE5ZDhlOGM5aTltOGE4bC4KKy5oZXgxYQorLmhleGEyZAorLmhleGFkZTFjMmkKKy5oZXhhZGUyYzNpbQorLmhleGFkZWNpMW1hCisuaG85bDhvOW44bzltOHkuCisuaG9sbzJuCisuaG9sb24zbzNteQorLmhvOW04ZThvOW04bzhyOXA4aDhpOGMuCisuaG8ybWUzCisuaG9tZW8xbW8KKy5ob21lb21vMnIKKy5ob21lb21vcjFwCisuaG9tZW9tb3JwNGg0CisuaG9tZW9tb3JwaDFpYworLmhvOW04ZThvOW04bzhyOXA4aDhpOHM4bS4KKy5ob21lb21vcnBoaTJzMW0KKy5obzltOG85dDhoOGU4dDhpOGMuCisuaG8xbW8KKy5ob200b3RoMworLmhvbW90aDJlCisuaG9tbzN0aGU0dAorLmhvbW90aGV0MWljCisuaG84cjhzOGU5cjhhOGQ5aThzOGguCisuaG9yNHNlCisuaG80cnMyCisuaG9yc2VyMWEKKy5ob3JzZXJhMmQKKy5ob3JzZXIyYWRpCisuaG9yc2VyYWRpczEKKy5ob3JzZXJhZGlzMmgKKy5obzh0OWI4ZThkLgorLmhvMnQxYgorLmhvdDRiZTJkCisuaG84dDliOGU4ZDhzLgorLmhvdGJlMmQxczIKKy5oeTlkOHI4bzl0OGg4ZThyOW04YThsLgorLmh5MWQKKy5oeTFkcgorLmh5ZHJvNHRoMmUKKy5oeWRyNG90aAorLmh5ZHJvdGhlcjNtNAorLmh5ZHJvdGhlcjFtYQorLmh5OXA4bzl0OGg4YThsOWE5bTh1OHMuCisuaHkzcG8KKy5oeXA0b3QKKy5oeXA0b3RoCisuaHlwb3RoYTNsYQorLmh5cG90aGFsYTNtCisuaHlwb3RoYWxhMW11CisuaHlwb3RoYWxhbTJ1cworLmlkOGU4YThsOHMuCisuaWRlM2E0bAorLmlkZWEybDFzMgorLmlkOGU4bzlnOHI4YThwOGg4cy4KKy5pZGVvMmcKKy5pZGVvMWdyCisuaWRlb2dyYTRwNGgxczIKKy5pZDhpOG85czh5OG45YzhyOGE4czh5LgorLmkyZGkKKy5pMWQzaW8KKy5pZGk0b3MKKy5pZGlvczR5CisuaWRpb3N5bjFjcgorLmlkaW9zeW5jcjJhcworLmlkaW9zeW5jcmFzNHkKKy5pZDhpOG85czh5OG45YzhyOGE5czhpOGU4cy4KKy5pZGlvc3luY3JhczJpZTQKKy5pZDhpOG85czh5OG45YzhyOGE4dDhpOGMuCisuaWRpb3N5bjVjcmF0MWljCisuaWQ4aThvOXM4eThuOWM4cjhhOHQ5aTljOGE4bDlsOHkuCisuaWRpb3N5bmNyYXRpMWNhCisuaWRpb3N5bmNyYXRpY2FsMWwKKy5pZGlvc3luY3JhdGljYWwxbHkKKy5pZzluOGk4dDllOHIuCisuMmlnCisuaWcxbmkKKy5pZ24yaXQKKy5pZ24yaXRlCisuaWc5bjhpOHQ5ZThyOHMuCisuaWduaXRlNHIxczIKKy5pZzluOGk5dDhvOHIuCisuaWduM2l0b3IKKy5pZ25pMXRvCisuaWc4bjhvOHI4ZTlzOHA4YThjOGU4cy4KKy5pZzFubworLmlnbm9yZTFzcAorLmlnbm9yZTJzMXBhCisuaWdub3Jlc3BhNGNlCisuaW05cDhlOGQ5YThuOGM4ZS4KKy5pbTJwMmVkCisuaW1wMmUyZDJhCisuaW1wZWRhMm4KKy5pbTlwOGU4ZDlhOG44YzhlOHMuCisuaW45ZDh1OWI4aTl0OGE5YjhsOGUuCisuNGluZAorLmluMWR1CisuaW5kdTFiNGkKKy5pbmR1YmkydAorLmluZHViaTF0YQorLmluZHViaTJ0YWIKKy5pbmR1Yml0YWIybDIKKy5pbjlmOGk4bjlpOHQ4ZTlsOHkuCisuaW4zZgorLmluMWZpCisuaW4yZmluCisuaW5mMmluaQorLmluZmluMml0CisuaW5maW4yaXRlCisuaW5maW5pdGUxbHkKKy5pbjlmOGk4bjlpOXQ4ZThzOWk5bThhOGwuCisuaW5maW5pdDRlcworLmluZmluaXRlMXNpCisuaW5maW5pdGUyczVpbQorLmluZmluaXRlc2kxbWEKKy5pbjlmOHI4YTlzOHQ4cjh1OGM5dDh1OHI4ZS4KKy5pbmZyMmFzCisuaW5mcmFzMXQ0cgorLmluZnJhc3RydTJjMXQKKy5pbmZyYXN0cnVjdHU0cgorLmluZnJhc3RydWMxdHUKKy5pbmZyYXN0cnVjM3R1cmUKKy5pbjlmOHI4YTlzOHQ4cjh1OGM5dDh1OHI4ZThzLgorLmluOXM4dDhhOGw4bDllOHIuCisuaW5zMnRhMmwKKy5pbnMxdGEKKy5pbnN0YWwxbAorLmluc3RhbDJsZQorLmluOXM4dDhhOGw4bDllOHI4cy4KKy5pbnN0YWxsZTRyMXMyCisuaW45dDhlOHI5ZDhpOHM5YzhpOXA4bDhpOW44YThyOHkuCisuaW4xdAorLmluNXRlcjNkCisuaW50ZXJkMmkKKy5pbnRlcmRpczEKKy5pbnRlcmQyaXMxYworLmludGVyZGlzMWNpCisuaW50ZXJkaXNjMmlwCisuaW50ZXJkaXNjaTFwMmwyCisuaW50ZXJkaXNjaXBsaTRuCisuaW50ZXJkaXNjaXBsNGkxbmEKKy5pbnRlcmRpc2NpcGxpbjJhMnIKKy5pbjl0OGU4cjlnOGE5bDhhOGM5dDhpOGMuCisuaW50ZXJnMgorLmludGVyMWdhCisuaW50ZXJnYWxhMmMxdAorLmluOXU4dDhpOGw4ZS4KKy5pbjF1CisuaW40dTF0MmkKKy5pbjl1OHQ4aThsOWk5dDh5LgorLmludXRpbDFpCisuaW51dDJpbDFpdAorLmludXRpbGkxdHkKKy5pcjlyOGU5ZDh1OGM5aThiOGw4ZS4KKy5pcjJyMmVkCisuaXJyZTFkdQorLmlycmVkdTJjCisuaXJyZWR1Y2k0YgorLmlycmVkdTFjaQorLmlycmVkdWNpMWIybDIKKy5pcjlyOGU5ZDh1OGM5aThiOGw4eS4KKy5pcnJlZHVjaWIxbHkKKy5pcjlyOGU4djlvOWM4YTliOGw4ZS4KKy5pcnJldjIKKy5pcnJlNXZvYworLmlycmV2bzFjYQorLmlycmV2b2NhMWIybDIKKy5pczhvOHQ5cjhvOHA4eS4KKy5pMnNvCisuaXNvdHJvcHk1CisuaXM4bzl0OHI4bzhwOWk4Yy4KKy5pc290cm9wM2ljCisuaXQ4aThuOWU4cjlhOHI4eS4KKy5pMXRpCisuaTJ0MWluCisuaXQyaW5lCisuaXRpbjRlcjRhMnIKKy5pdGluMWVyCisuaXRpbmVyMWEKKy5pdDhpOG45ZThyOWE4cjlpOGU4cy4KKy5pdGluZXJhcjFpCisuaXRpbmVyYXIyaWU0CisuamU5cjhlOW04aTlhOGQ4cy4KKy4xamUKKy5qZXJlbTJpM2EKKy5qZXJlbWlhMmQKKy5qZXJlbWlhMmQxczIKKy5rZTh5OW44bzh0OGUuCisua2U4eTluOG84dDhlOHMuCisua2V5bm80dGVzCisua2U4eTlzOHQ4cjhvOGs4ZS4KKy5rZXlzNAorLmtleXMxdAorLmtleXN0NHIKKy5rZXlzdHIyb2syCisua2U4eTlzOHQ4cjhvOGs4ZThzLgorLmtleXN0cm9rZXM0Cisua2k4bDhuOWk4bjhnLgorLmsxaQorLms0aTJsMW4yCisua2lsbjFpbgorLmtpbG5pbjRnCisubGE4YzlpOWU4czh0LgorLmw0YTJjaTQKKy5sYTNjMmllNAorLmxhY2kxZXN0CisubGE4bTllOG45dDhhOWI4bDhlLgorLmxhMW1lbgorLmxhM21lbjF0CisubGFtZW4ydGE0YgorLmxhbWVuMXRhCisubGFtZW50YWIybDIKKy5sYThuOGQ5czhjOGE4cDllOHIuCisuM2w0YW5kCisubGEybgorLmxhbjJkMXMyCisubGFuZHNjYTRwCisubGFuZHMxY2EKKy5sYW5kc2NhNXBlcgorLmxhOG44ZDlzOGM4YThwOWU4cjhzLgorLmxhbmRzY2FwZTRyMXMyCisubGE4cjljOGU5bjh5LgorLmwyYTJyCisubGFyMWMKKy5sYXIyY2UKKy5sYXIxY2VuNAorLmxhOHI5YzhlOW45aThzOHQuCisubGFyNGNlbmkKKy5sZThhOGY5aDhvOHA5cDhlOHIuCisubGUyYQorLmxlYTJmCisubGVhNGZoCisubGVhZmhvNHAxcAorLmxlYWZob3AycGUKKy5sZWFmaG9wM3BlcgorLmxlOGE4ZjloOG84cDlwOGU4cjhzLgorLmxlYWZob3BwZTRyMXMyCisubGU4dDl0OGU4cjlzOHA4YThjOWk4bjhnLgorLmxlNHQzdDIKKy5sZXR0ZTRyMXMyCisubGV0dGVyMXNwCisubGV0dGVyMnMxcGEKKy5sZXR0ZXJzcDRhMmNpCisubGV0dGVyc3BhMmMxaW4KKy5sZXR0ZXJzcGFjMWluZworLmxpOGY4ZTlzOHA4YThuLgorLmxpZmUxc3AKKy5saWZlMnMxcGEKKy5saWZlc3BhNG4KKy5saThmOGU5czhwOGE4bjhzLgorLmxpZmVzcGEybjFzMgorLmxpOGY4ZTlzOHQ4eThsOGUuCisubGlmZXMydHkKKy5saWZlczJ0eWwKKy5saThmOGU5czh0OHk4bDhlOHMuCisubGlmZXN0eWxlczIKKy5saThnOGg4dDl3OGU4aThnOGg4dC4KKy4zbGlnaAorLmxpZ2h0dzQKKy5saWdodHdlaTIKKy5sMmlnaHR3ZTJpZzIKKy5saThtOW84dTlzOGk4bjhlOHMuCisubGk0bW8KKy5saTNtbzJ1cworLmxpbW91MgorLmxpbW91MnMxaW4KKy5saW1vdXMyaW5lCisubGltb3VzaTFuZXMKKy5saThuOGU5YjhhOGM4azhlOHIuCisuMWw0aW5lCisubGluMmUyYgorLmxpbmViYWNrMQorLmxpbmViYWNrMWVyCisubGk4bjhlOXM4cDhhOGM4aThuOGcuCisubGkxbmVzCisubGk0bmUxc3AKKy5saW5lMnMxcGEKKy5saW5lc3A0YTJjaQorLmxpbmVzcGEyYzFpbgorLmxpbmVzcGFjMWluZworLmxpOW84bjllOHM4cy4KKy5saW8ybgorLmxpbzFuZXMKKy5saW9uMmUyc3MKKy5saTh0OGg5bzlnOHI4YThwOGg4ZThkLgorLmwyaXRoCisubGl0aG80ZworLmxpdGhvMWdyCisubGl0aG9ncmFwaDRlZAorLmxpOHQ4aDlvOWc4cjhhOHA4aDhzLgorLmxpdGhvZ3JhNHA0aDFzMgorLmxvOWI4bzh0OW84bTh5LgorLmxvYm80dG8KKy5sb2JvdG8zbXkKKy5sbzliOG84dDlvOG05aTh6OGUuCisubG9ib3RvbTJpegorLmxvYm90b21pMnplCisubG84ZzhlOHMuCisubG8xZ2UKKy5sbzhuOGc5ZThzOHQuCisuNWxvbmcKKy5sbzJuCisubG85cTh1OGE4YzlpOHQ4eS4KKy5sbzFxCisubG9xdTIKKy5sb3F1YWM0CisubG9xdTRhMmNpCisubG9xdWEyYzFpdAorLmxvcXVhY2kxdHkKKy5sbzh2OGU5czh0OHI4dThjOGsuCisuNGxvdgorLmxvdjRlMnMKKy5sb3YyZXN0NHIKKy5sb3Zlc3RydWM1CisubG92ZXN0cnVjazEKKy5tYThjOHI4bzllOGM4bzluOG84bThpOGM4cy4KKy5tYWNybzRlCisubWFjcm9lMWNvCisubWFjcm9lY28ybgorLm1hY3JvZWNvM25vbWljCisubWFjcm9lY29ub21pNGMzczIKKy5tYThsOWE5cDhyOG84cDlpOHM4bS4KKy5tYWxhcHIyCisubWFsYXByb3BpMnMxbQorLm1hOGw5YTlwOHI4bzhwOWk4czhtOHMuCisubWFsYXByb3A0aXM0bTFzMgorLm1hOG45czhsOGE4dThnOGg5dDhlOHIuCisubWEybjFzMgorLm1hbjJzMWwyCisubWFuc2xhdWdoMworLm1hOG45dTlzOGM4cjhpOHA4dC4KKy5tYW4ydXMKKy5tYW51c2MyCisubWFudXNjcmkyCisubWFudXNjcjJpcAorLm1hbnVzY3JpMnAxdAorLm1hOHI5ZzhpOG45YThsLgorLm1hcmcyCisubWFyZ2k0bgorLm1hcmdpMW5hCisubWE4dDhoOWU5bThhOXQ4aTljOGk4YThuLgorLm00YXRoMworLm1hdGg1ZW0KKy5tYXRoMmUKKy4xbWF0aGUxbWEKKy5tYXRoZW1hdDFpYworLm1hdGhlbWF0MmkxY2kKKy5tYXRoZW1hdGkzYzJpMWEKKy5tYXRoZW1hdGljaTJhMm4KKy5tYTh0OGg5ZTltOGE5dDhpOWM4aThhOG44cy4KKy5tYXRoZW1hdGljaWEybjFzMgorLm1hOHQ4dDhlOHMuCisubWF0NXRlCisubWE0dDN0MgorLm1hdDR0ZXMKKy5tZThkOWk4YzlhOGk4ZC4KKy4ybWVkCisubTRlZGkKKy5tZWQzaTFjYQorLm1lZGljYWkyCisubWVkaWNhMmlkCisubWU4ZDhpOW84YzhyOGUuCisubWUxZDJpbworLm1lZGlvY3JlMworLm1lOGQ4aTlvOGM5cjhpOXQ4aThlOHMuCisubWVkaTVvY3JpdAorLm1lZGlvY3JpMgorLm1lZGlvNWNyaTF0aQorLm1lZGlvY3JpdDJpZTQKKy5tZThnOGE5bDhpOHQ4aC4KKy5tZTJnCisubTRlZ2FsCisubWUxZ2EKKy5tZTNnYWwxaQorLm1lZ2FsMWl0CisubWVnYWwyaXRoCisubWU4ZzhhOWw4aTh0OGg4cy4KKy5tZWdhbGkydDRoMXMyCisubWU4dDhhOWI4bzhsOWk4Yy4KKy5tZTR0YQorLm1lMnRhNGIKKy5tZXRhYm9sM2ljCisubWV0YWJvbDJpCisubWU5dDhhOGI5bzlsOGk4czhtLgorLm1ldGFib2xpMnMxbQorLm1lOXQ4YThiOW85bDhpOHM4bThzLgorLm1ldGFib2w0aXM0bTFzMgorLm1lOXQ4YThiOW85bDhpOHQ4ZS4KKy5tZXRhYm81bDJpdGUKKy5tZXRhYm9sMWl0CisubWU5dDhhOGI5bzlsOGk4dDhlOHMuCisubWV0YWJvbGl0NGVzCisubWU4dDhhOWw4YThuOWc4dThhOGc4ZS4KKy5tZXQzYTJsCisubWV0YTVsYQorLm1ldGFsYTJuCisubWV0YWwyYW5nCisubWV0YWxhbjFndQorLm1ldGFsYW5ndTRhCisubWU4dDhhOWw4YThuOWc4dThhOGc4ZThzLgorLm1lOHQ4YTlwOGg4bzhyOWk4Yy4KKy5tZXRhcGhvNHIKKy5tZTh0OGg5YThuOGUuCisubWV0aGEybjQKKy5tZTl0OHI4bzhwOW85bDhpOHMuCisubTRldHIKKy5tZXRyb3BvbDJpCisubWU5dDhyOG84cDlvOWw4aThzOGU4cy4KKy5tZXRyb3BvbDRpc2UKKy5tZXRyb3BvbGlzMWU0cworLm1lOHQ5cjhvOXA4bzhsOWk5dDhhOG4uCisubWV0cm9wb2wxaXQKKy5tZXRyb3BvbGkzdGEybgorLm1ldHJvcG9saTF0YQorLm1lOHQ5cjhvOXA4bzhsOWk5dDhhOG44cy4KKy5tZXRyb3BvbGl0YTJuMXMyCisubWk4YzhyOG85ZThjOG85bjhvOG04aThjOHMuCisubTRpMWNyCisubWljcm80ZQorLm1pY3JvZTFjbworLm1pY3JvZWNvMm4KKy5taWNyb2VjbzNub21pYworLm1pY3JvZWNvbm9taTRjM3MyCisubWk5YzhyOG85ZjhpOGM4aDhlLgorLm1pY3JvMmZpCisubWljcm9mNGkyY2gKKy5taWNyb2ZpY2hlMgorLm1pOWM4cjhvOWY4aThjOGg4ZThzLgorLm1pY3JvZmljaDFlcworLm1pOGM4cjhvOW84cjhnOGE4bjlpOHM4bS4KKy5taWNyb28yCisubWljcm9vcmcyCisubWljcm9vcjFnYQorLm1pY3Jvb3JnYW41aXMKKy5taWNyb29yZ2EybgorLm1pY3Jvb3JnYW5pMnMxbQorLm1pOGM4cjhvOW84cjhnOGE4bjlpOHM4bThzLgorLm1pY3Jvb3JnYW40aXM0bTFzMgorLm1pOGw4bDlhOGc4ZS4KKy5tNGlsMWwKKy5taThsOWw4aTlsOGk4dDhlOHIuCisubWlsbDJpCisubWlsNGw0aTRsCisubWlsbGlsMWkKKy5taWxsMmlsMWl0CisubWlsbGlsMml0ZQorLm1pOG04ZThvOWc4cjhhOHA4aDhlOGQuCisubWltZW8yZworLm1pbWVvMWdyCisubWltZW9ncmFwaDRlZAorLm1pOG04ZThvOWc4cjhhOHA4aDhzLgorLm1pbWVvZ3JhNHA0aDFzMgorLm1pOG05aThjOXI4aThlOHMuCisubWltMWkKKy5taW00aTFjcgorLm1pbWljcmkyCisubWltaWNyMmllNAorLm1pOG45aThzLgorLm0yaW5pCisubWluMWlzCisubWk4bjhpOXM4eThtOXA4bzlzOGk4dThtLgorLm1pbmlzNHkKKy5taW5pc3k0bTFwCisubWluaXN5bTFwb3MKKy5taW5pc3ltcG81c2k0dQorLm1pOG44aTlzOHk4bTlwOG85czhpOGEuCisubWluaXN5bXBvczJpMWEKKy5taTluOHU4dDllOHIuCisubTRpbjF1CisubWk5bjh1OHQ5ZThzOHQuCisubWk4czljOGg4aThlOXY4bzh1OHM5bDh5LgorLm0yaXMxYworLm1pczNjaDIKKy5taXNjaDJpZTQKKy5taXNjaGlldm91MgorLm1pc2NoaWV2bzJ1cworLm1pc2NoaWV2b3VzMWwyCisubWlzY2hpZXZvdXMxbHkKKy5taTlzOGU4cjhzLgorLm00aXNlCisubWlzM2VyCisubWlzZTRyMXMyCisubWk5czhvOGc5YTltOHkuCisubWkyc28KKy5taXNvMWdhCisubWlzbzJnYW0KKy5tbzhkOWU4bDlsOGk4bjhnLgorLm1vMmQxCisubW9kZWwxbAorLm1vZGVsbDJpCisubW9kZWwybGluNAorLm1vOGw5ZTljOHU4bDhlLgorLm1vbGUxY3UKKy5tb2xlNGN1bAorLm1vbGVjdWw0ZQorLm1vOGw5ZTljOHU4bDhlOHMuCisubW9sZWN1bGVzMgorLm1vOG45YThyOGM4aDhzLgorLm1vMW4xYQorLm1vbmFyM2MKKy5tb24yYTJyCisubW9uYXIyY2gKKy5tb25hcmM0aDFzMgorLm1vOG44ZTh5OWw4ZThuOWQ4ZThyLgorLm1vbmV5bGVuMWRlCisubW84bjhlOHk5bDhlOG45ZDhlOHI4cy4KKy5tb25leWxlbmRlNHI1czIKKy5tbzhuOG85YzhoOHI4bzhtOGUuCisubW9ubzJjaDQKKy5tb25vYzRocjQKKy5tb25vY2hybzJtZQorLm1vOG44bzllOG45ZThyOWc4ZTh0OGk4Yy4KKy5tbzNub2UKKy5tb25vZW4xZXIKKy5tb25vZW5lcmcyCisubW9ub2VuZXIzZ2V0CisubW9ub2VuZXJnZXQxaWMKKy5tbzhuOW84aThkLgorLm1vbm9pMgorLm1vbm8yaWQKKy5tbzhuOG85cDhvOGw4ZS4KKy5tbzRub3AKKy5tbzhuOG85cDhvOGw4ZThzLgorLm1vbm9wb2xlczIKKy5tbzluOG84cDlvOGw4eS4KKy5tb25vcG8ybHkKKy5tbzhuOG85czhwOGw4aThuOGUuCisubW9ub3MxcDJsMgorLm1vbm9zcGxpNG4KKy5tb25vc3AxbDRpbmUKKy5tbzhuOG85czhwOGw4aThuOGU4cy4KKy5tb25vc3BsaTFuZXMKKy5tbzhuOG85czh0OHI4bzhmOGk4Yy4KKy5tb25vczV0CisubW9ub3N0NHIKKy5tb25vc3RybzJmaQorLm1vOW44bzh0OW85bjhpOGU4cy4KKy5tb25vMXRvCisubW8ybm90bzJuCisubW9ub3RvbjJpZTQKKy5tbzluOG84dDlvOW44bzh1OHMuCisubW9ubzR0b25vCisubW9ub3RvMW5vdTIKKy5tb25vdG9ubzJ1cworLm1vOXI4bzhuOWk4czhtLgorLm1vcm81bjRpcworLm1vcm8ybgorLm1vcm9uaTJzMW0KKy5tbzhzOXE4dThpOXQ4by4KKy5tb3MyCisubW9zcXUyCisubW9zcTJ1aTIKKy5tb3NxdWkxdG8KKy5tbzhzOXE4dThpOXQ4bzhzLgorLm1vc3F1aXRvczIKKy5tbzhzOXE4dThpOXQ4bzhlOHMuCisubXU4ZDlyOG84bzhtLgorLm11MWRyCisubXVkMXJvb20KKy5tdWRyb28yCisubXU4ZDlyOG84bzhtOHMuCisubXVkcm9vNG0xczIKKy5tdThsOXQ4aTlmOGE4YzllOHQ4ZThkLgorLjVtdTRsdAorLm11bDF0aTMKKy5tdWx0aWYyCisubXVsdGkxZmEKKy5tdWx0aWZhNGNlCisubXVsdGlmYWNldDQKKy5tdWx0aWZhY2UydDFlZAorLm11OGw5dDhpOXA4bDhpOGM5YThiOGw4ZS4KKy5tdWx0MmlwCisubXVsdGkxcDJsMgorLm11bHRpcGxpMWNhCisubXVsdGlwbGljYTFiMmwyCisubXU4bDh0OGk5dThzOGU4ci4KKy5tdWx0aTR1CisubXVsdGkydXMKKy5uZThvOWY4aThlOGw4ZDhzLgorLjNuZW8KKy5uZTVvZgorLm5lbzJmaQorLm5lb2YyaWU0CisubmVvZmllMmxkMworLm5lb2ZpZWwyZDFzMgorLm5lOG85bjhhOHo4aS4KKy5uZW8ybgorLm5lbzFuMWEKKy5uZW9uYTJ6MWkKKy5uZThvOW44YTh6OGk4cy4KKy5uZW9uYXo0aXMKKy5uZThwOGg5ZTh3OHMuCisubmVwaGU0CisubmU4cDhoOXI4aTh0OGUuCisubmVwNGhyNAorLm5lcGhyMml0ZQorLm5lOHA4aDlyOGk4dDhpOGMuCisubmVwaHI0aTJ0M2ljCisubmVwaHJpMXRpCisubmU4dzllOHM4dC4KKy5uZTR3CisubmV3ZXN0MworLm5lOHc4czlsOGU4dDl0OGU4ci4KKy5uZXdzNGwyCisubmV3czJsZQorLm5ld3NsZTR0M3QyCisubmU4dzhzOWw4ZTh0OXQ4ZThyOHMuCisubmV3c2xldHRlNHIxczIKKy5uaTh0OHI4bzltOGU4dDhoOWE4bjhlLgorLm4yaXQKKy5uaTN0cgorLm5pdHJvMm1lCisubml0cm80bWV0Cisubml0cm9tZXRoYTJuNAorLm5vOW44YThtOGUuCisubm80bgorLm5vMW4xYQorLm5vOG45YThyOWk4dDhoOW04ZTh0OWk4Yy4KKy5ub25hcjNpCisubm9uMmEycgorLm5vbmFyMml0aAorLm5vbmFyaXQ0aDFtCisubm9uYXJpdGhtZXQ0Cisubm9uYXJpdGhtZXQxaWMKKy5ubzhuOWU4bThlOHI5ZzhlOG44Yzh5LgorLm5vbmUxbWUKKy5ub25lbWVyZzIKKy5ub25lbWVyMWdlbgorLm5vbmVtZXJnZW4xY3kKKy5ubzhuOWU4cTh1OGk5djhhOHI4aTlhOG44YzhlLgorLm5vbmUycQorLm5vbmVxdTIKKy5ub25lcTJ1aTIKKy5ub25lcXUyaXYzCisubm9uZXF1aTF2YQorLm5vbmVxdWl2MmEycgorLm5vbmVxdWl2YXIxaQorLm5vbmVxdWl2YXIzaTJhMm4KKy5ub25lcXVpdmFyMmkzYQorLm5vbmVxdWl2YXI0aWFuYworLm5vOG44ZTl0OGg4ZTlsOGU4czhzLgorLm5vbmV0aDJlCisubm9uZXRoZTFsZXMyCisubm9uZXRoZTNsMmUyc3MKKy5ubzhuOWU4dThjOGw4aThkOWU4YThuLgorLm5vbjRldQorLm5vbmV1MWM0bDQKKy5ub25ldWNsMmlkCisubm9uZXVjbGlkZWEybgorLm5vOG45aThzOG85bThvOHI5cDhoOGk4Yy4KKy5ub241aQorLm5vbjFpcworLm5vbmkyc28KKy5ub25pM3NvbQorLm5vbmlzbzFtbworLm5vbmlzb21vMnIKKy5ub25pc29tb3IxcAorLm5vbmlzb21vcnA0aDQKKy5ub25pc29tb3JwaDFpYworLm5vOG45cDhzOGU4dThkOG85YzhvOG05cDhhOGM4dC4KKy5ub24xcDQKKy5ub24ycDFzMgorLm5vbnAyc2UKKy5ub25wczRldQorLm5vbnBzZXUxZG8KKy5ub25wc2V1ZG8xY28KKy5ub25wc2V1ZG9jbzRtMXAKKy5ub25wc2V1ZG9jb20xcGEKKy5ub25wc2V1ZG9jb21wYTJjNHQKKy5ubzhuOXM4bThvOG84dDhoLgorLm5vMm4zczIKKy5ub24yczNtCisubm9uczFtbworLm5vbnNtb28yCisubm9uc21vNG90aAorLm5vOG45dThuOGk5ZjhvOHI4bS4KKy5ubzNudTRuCisubm9udTFuaQorLm5vbnVuaTFmbworLm5vbnVuaWZvMnIKKy5ub251bmlmb3IxbQorLm5vOG45dThuOGk5ZjhvOHI4bTlsOHkuCisubm9udW5pZm9yNG0xbAorLm5vbnVuaWZvcm0xbHkKKy5ubzhyOWU4cDlpOW44ZThwOGg5cjhpOG44ZS4KKy5ub3JlNXBpMm4KKy5ub3JlcDJpbmUKKy5ub3JlcGluZXA0aHI0Cisubm9yZXAyaW5lcGhyMmluNGUKKy5ubzh0OXc4aTh0OGg5czh0OGE4bjhkOWk4bjhnLgorLm5vdHc0Cisubm90d2kyCisubm90dzJpdGgzCisubm90d2kydDRoMXMyCisubm90d2l0aDVzdDRhbmQKKy5ub3R3aXRoczF0YQorLm5vdHdpdGhzdGEybgorLm5vdHdpdGhzdGFuZDFpbgorLm51OWM4bDhlOG85dDhpOGQ4ZS4KKy5udWNsZTMKKy5udTFjNGw0CisubnVjbGU0b3QKKy5udWNsZW90MmlkCisubnU5YzhsOGU4bzl0OGk4ZDhlOHMuCisubnVjbGVvdGlkZTRzMgorLm51OHQ5YzhyOGE4YzhrOWU4ci4KKy5udTR0YworLm51dGNyYWNrMQorLm51dGNyYWNrMWVyCisubnU4dDljOHI4YThjOGs5ZThyOHMuCisubnV0Y3JhY2tlNHIxczIKKy5vZThyOXM4dDhlOGQ4cy4KKy5vM2VyCisub2U0cjFzMgorLm9lcnM0dDFlZAorLm9lcnN0ZTJkMXMyCisub2Y4ZjlsOGk4bjhlLgorLm80ZjFmCisub2ZmNGwyCisub2ZmbGluNAorLm9mZjFsNGluZQorLm9mOGY5bDhvOGE4ZC4KKy5vZmZsNG9hCisub2ZmbG9hMmQzCisub2Y4ZjlsOG84YThkOHMuCisub2ZmbG9hMmQxczIKKy5vZjhmOWw4bzhhOGQ4ZThkLgorLm9mZmxvYTJkMWVkCisub2w4aTlnOG84cDlvOWw4aThzOHQuCisub2wyaQorLm9sMmlnCisub2xpMmdvCisub2wyaWdvcG9sMmkKKy5vbDhpOWc4bzhwOW85bDhpOHM4dDhzLgorLm9saWdvcG9saXM0dDFzMgorLm9sOGk5ZzhvOHA5bzhsOHkuCisub2xpZ29wbzJseQorLm9sOGk5ZzhvOHA5bzhsOWk4ZThzLgorLm9saWdvcG9sMmllNAorLm9wOWU4cjlhOG44ZC4KKy5vcDFlcgorLjNvcGVyMWEKKy5vcDRlcjRhbmQKKy5vcGVyYTJuCisub3A5ZThyOWE4bjhkOHMuCisub3BlcmFuMmQxczIKKy5vcjhhOG44Zzl1OHQ4YThuLgorLm9yYTJuCisub3IyYW5nCisub3JhbjFndQorLm9yYW40Z3U0dAorLm9yYW5ndTF0YQorLm9yYTJuZ3V0YTJuCisub3I4YThuOGc5dTh0OGE4bjhzLgorLm9yYW5ndXRhMm4xczIKKy5vcjl0OGg4bzlkOG84bjl0OGk4czh0LgorLm9ydGhvMmRvNAorLm9ydGhvZG8ybgorLm9ydGhvZG9uM3Q0aQorLm9ydGhvZG9uMXQKKy5vcjl0OGg4bzlkOG84bjl0OGk4czh0OHMuCisub3J0aG9kb250aXM0dDFzMgorLm9yOXQ4aDhvOWs4ZThyOWE5dDhvOGw5bzhnOHkuCisub3J0aDJvaworLm9ydGhvazFlcgorLm9ydGhva2VyMWEKKy5vcnRob2tlcmExdG8KKy5vcnRob2tlcmF0b2wxbzFneQorLm9yOHQ4aDhvOW44aTh0OHI4bzl0OG84bDh1OGU4bjhlLgorLm9ydGhvMm4KKy5vcnRob24yaXQKKy5vcnRob25pM3RyCisub3J0aG9uaXRybzF0bworLm9ydGhvbml0cm90b2x1M2VuCisub3J0aG9uaXRyb3RvbHU0ZW5lCisub3Y4ZThyOXY4aThlOHcuCisub3ZlcnYyaWU0Cisub3Y4ZThyOXY4aThlOHc4cy4KKy5veDlpOGQ5aThjLgorLm94M2kKKy5veGk1ZGkKKy5veDJpZAorLnBhOGQ5ZDhpOG44Zy4KKy4xcGEKKy5wNGEyZAorLnBhZDRkMWluCisucGFkMWQ0CisucGE4aThuOWw4ZThzOHM5bDh5LgorLnA0YWkyCisucGE0aTRuNAorLnBhNGk0bjFsCisucGFpbmxlczIKKy5wYWluM2wyZTJzcworLnBhaW5sZXM0czFsMgorLnBhaW5sZXNzMWx5CisucGE4bDllOHQ4dDhlLgorLnA0YWwKKy5wMmFsZQorLnBhbGU0dDN0MgorLnBhOGw5ZTh0OHQ4ZThzLgorLnBhbGV0NHRlcworLnBhOHI5YTliOG84bDhhLgorLnAyYTJyCisucGEycmFiCisucGFyYWJvMWxhCisucGE4cjlhOWI4bzhsOWk4Yy4KKy5wYXJhYm9sM2ljCisucGFyYWJvbDJpCisucGE5cjhhOGI5bzlsOG84aThkLgorLnBhcmFib2xvaTIKKy5wYXJhYm9sbzJpZAorLnBhOHI5YTlkOGk4ZzhtLgorLnBhcmEyZAorLnBhcjJhZGkKKy5wYXJhZDJpZworLnBhcmFkaWcxbQorLnBhOHI5YTlkOGk4ZzhtOHMuCisucGFyYWRpZzRtMXMyCisucGE4cjhhOWM4aDh1OHQ4ZS4KKy5wYXJhMmNoCisucGFyYWNodTR0CisucGE4cjhhOWM4aDh1OHQ4ZThzLgorLnBhOHI4YTlkOGk5bThlOHQ4aDh5OGw5YjhlOG44ejhlOG44ZS4KKy5wYXJhZDRpbWV0CisucGFyYWRpbWV0aHkybDFiCisucGFyYWRpbWV0aHlsYjRlNG4zegorLnBhcmFkaW1ldGh5bGJlbjJ6ZQorLnBhcmFkaW1ldGh5bGJlbnplNG4KKy5wYThyOGE5ZjhsOHU4bzhyOG85dDhvOGw4dThlOG44ZS4KKy5wYXJhMmYKKy5wYXJhZjRsMgorLnBhcmFmbHUzbworLnBhcmFmbHVvM3IKKy5wYXJhZmx1b3JvMXRvCisucGFyYWZsdW9yb3RvbHUzZW4KKy5wYXJhZmx1b3JvdG9sdTRlbmUKKy5wYThyOGE5ZzhyOGE4cDhoOWU4ci4KKy5wYXJhMWdyCisucGFyYWc1cmEzcGg0ZXIKKy5wYThyOGE5bDhlOWc4YThsLgorLnBhcjNhbAorLnBhcjJhbGUKKy5wYXJhbDRlZ2FsCisucGFyYWxlMWdhCisucGE4cjlhOGw5bDhlOGw5aThzOG0uCisucGFyYWwxbAorLnBhcmFsMmxlCisucGFyYWwzbGVsCisucGFyYWxsZWwyaQorLnBhcmFsbGUybGlzCisucGFyYWxsZWxpMnMxbQorLnBhOHI4YTltOGE4ZzluOGU4dDlpOHM4bS4KKy5wYXI0YTFtYQorLnBhcmFtM2FnCisucGFyYTVtYWcxbgorLnBhcmFtYWduZXRpMnM0bQorLnBhOHI4YTltOGU4ZDhpOGMuCisucGFyYTJtZWQKKy5wYXJhbTRlZGkKKy5wYThyOGE5bThlOHQ4aDh5OGw5YThuOGk4czhvOGw4ZS4KKy5wYXJhbTNldAorLnBhcmFtZXRoeTNsYQorLnBhcmFtZXRoeWxhMm4KKy5wYXJhbWV0aHlsYW5pMnNvCisucGE5cjhhOG05ZTl0OHI4aTh6OGUuCisucGFyYW00ZXRyCisucGFyYW1ldHJpMnplCisucGE4cjhhOW04aThsOWk5dDhhOHI4eS4KKy5wYXIyYW1pCisucGFyYW1pbDFpCisucGFyYW0yaWwxaXQKKy5wYXJhbWlsaTF0YQorLnBhcmFtaWxpdDJhMnIKKy5wYThyOGE5bThvOHU4bjh0LgorLnBhcmEybW8KKy5wYXJhbW91MgorLnBhcmFtb3VuMXQKKy5wYTh0OGg5bzlnOGU4bjlpOGMuCisucDRhdGgKKy5wYXQ0aG8KKy5wYXRobzRnCisucGF0aG8xZ2U0CisucGF0aG8xZ2VuCisucGU4ZTh2OWk4czhoLgorLnA0ZWUKKy5wZWUxdmkKKy5wZWV2aXMyaAorLnBlOGU4djlpOHM4aDluOGU4czhzLgorLnBlZXZpczJoMW4KKy5wZWV2aXNoMW5lcworLnBlZXZpc2huMmUyc3MKKy5wZThuOXQ4YTlnOG84bi4KKy5wZW4xdAorLnBlbjF0YQorLnBlbnRhMmdvCisucGVudGFnbzJuMgorLnBlOG45dDhhOWc4bzhuOHMuCisucGVudGFnbzJuM3MyCisucGU5dDhyOG85bDhlOXU4bS4KKy5wZXRyb2w0ZXUKKy5waDhlOW44bzhtOWU5bjhvOG4uCisucGg0ZTNubworLnBoZTJuCisucGhlbm8ybWUKKy5waGVubzFtZW4KKy5waGVub200ZW5vCisucGhlbm9tZW5vNG4KKy5waDhlOG44eThsOWE4bDhhOW44aThuOGUuCisucGhlbnkzbGEKKy5waGVueWxhbGEybgorLnBoZW55bGFsYTVuMmluZQorLnBoZW55bGFsYW4xaW4KKy5waDhpOWw4YTh0OWU5bDhpOHM4dC4KKy5waGk0bGF0ZWwyaTQKKy5waGlsYXRlMmxpcworLnBoOGk5bDhhOHQ5ZTlsOGk4czh0OHMuCisucGhpbGF0ZWxpczR0MXMyCisucGg4bzluOGU4bThlLgorLjNwaG9uZQorLnBobzJuCisucGhvbmUxbWUKKy5waDhvOW44ZThtOGU4cy4KKy5waG9uZTJtZXMKKy5waDhvOW44ZTltOGk4Yy4KKy5waG9uZTVtaQorLnBoOG84czlwOGg4bzhyOWk4Yy4KKy5waG9zMXAKKy5waG9zcGhvNQorLnBob3NwaG80cgorLnBoOG85dDhvOWc4cjhhOHA4aDhzLgorLnBobzF0bworLnBob3RvMmdyCisucGhvdG9ncmE0cDRoMXMyCisucGg4bzl0OG85bzhmOGY5czhlOHQuCisucGhvdG9vMgorLnBob3RvbzRmMWYKKy5waG90b29mMmYzcworLnBpOGM5YTlkOG84ci4KKy5waTFjYQorLnBpY2EyZAorLnBpY2ExZG8KKy5waWNhZDRvcgorLnBpOGM5YTlkOG84cjhzLgorLnBpY2FkbzRyczIKKy5waThwOGU5bDhpOG44ZS4KKy5wMmlwCisucGlwZTQKKy5waXBlbDJpCisucGlwZTFsNGluZQorLnBpOHA4ZTlsOGk4bjhlOHMuCisucGlwZWxpMW5lcworLnBpOHA4ZTlsOGk4bjlpOG44Zy4KKy5waXBlbDJpbjNpCisucGlwZWxpbjFpbgorLnBpcGVsaW5pbjRnCisucGk5cjhhOW44aDhhOHMuCisucDRpcgorLnBpMXJhCisucGlyYTJuCisucGlyYTRuMWg0CisucGlyYW5oYTQKKy5wbDhhOGM4YTliOGw4ZS4KKy4xcDJsMgorLnBsYTFjYQorLnBsYWNhMWIybDIKKy5wbDhhOG44dDloOG84cDlwOGU4ci4KKy4zcGxhMm4KKy5wbGFuMXQKKy5wbGFudGhvNHAxcAorLnBsYW50aG9wMnBlCisucGxhbnRob3AzcGVyCisucGw4YThuOHQ5aDhvOHA5cDhlOHI4cy4KKy5wbGFudGhvcHBlNHIxczIKKy5wbDhlOGE4czlhOG44YzhlLgorLnBsZTJhCisucGxlYXNhMgorLnBsZWEzc2FuYworLnBsZWFzYTJuCisucGw4dThnOWk4bi4KKy5wbHVnNWluCisucGw4dThnOWk4bjhzLgorLnBsdTVnNGkybjFzMgorLnBvOGw5dDhlOHI5ZzhlOGk4czh0LgorLnBvNGwydAorLnBvbDF0ZQorLnBvbHRlcmcyCisucG9sdGVyZ2VpMgorLnBvOGw4eTllOG44ZS4KKy5wbzJseQorLnBvOGw4eTllOHQ4aDl5OGw5ZThuOGUuCisucG9seWU0dAorLnBvOWw4eThnOWE5bThpOHM4dC4KKy5wb2x5MWdhCisucG9seTJnYW0KKy5wb2x5Z2FtMmlzCisucG85bDh5OGc5YTltOGk4czh0OHMuCisucG9seWdhbWlzNHQxczIKKy5wbzhsOHk4ZzlvOG45aTl6OGE5dDhpOG84bi4KKy5wb2x5MWdvCisucG9seWdvMm4yCisucG9seWdvM25pCisucG9seWdvbml6YTEKKy5wb2x5Z29uaXphMXQyaW8KKy5wb2x5Z29uaXphdGlvMm4KKy5wbzlsOHk4cDhoOW85bjhvOHU4cy4KKy5wb2x5cGhvMm4KKy5wb2x5cGhvMW5vdTIKKy5wb2x5cGhvbm8ydXMKKy5wbzhsOHk5czh0OHk4cjhlOG44ZS4KKy5wbzJseXM0CisucG9seXMxdAorLnBvbHlzMnR5CisucG84bThlOWc4cjhhOG45YTh0OGUuCisucG8ybWUKKy5wb21lMmcKKy5wb21lMWdyCisucG9tZWdyYTJuMgorLnBvbWVncmExbmEKKy5wb21lZ3JhbjJhdAorLnBvOHI4bzllOGw4YThzOXQ4aThjLgorLjFwNG9yCisucG9ybzRlCisucG9ybzRlbAorLnBvcm9lMWxhCisucG9yb2VsYXN0MmkKKy5wb3JvZWxhczF0aWMKKy5wbzhyOW84dThzLgorLnBvcm91MgorLnBvcm8ydXMKKy5wbzhyOXQ4YTliOGw4ZS4KKy5wb3IxdGEKKy5wb3IydGFiCisucG9ydGFiMmwyCisucG84czh0OWE4bTliOGw4ZS4KKy4xcG9zCisucG9zMnRhCisucG9zdGE0bTFiCisucG9zdGFtYjJsMgorLnBvOHM4dDlhOG05YjhsOGU4cy4KKy5wb3N0YW1ibGVzMgorLnBvOHM4dDloOHU5bThvOHU4cy4KKy5wb3N0aHUxbW8KKy5wb3N0aHUzbW8ydXMKKy5wb3N0aHVtb3UyCisucG84czh0OXM4YzhyOGk4cDh0LgorLnBvczR0MXMyCisucG9zdDRzYworLnBvc3RzY3JpMgorLnBvc3RzY3IyaXAKKy5wb3N0c2NyaTJwMXQKKy5wbzhzOHQ5czhjOHI4aThwOHQ4cy4KKy5wb3N0c2NyaXA0dDFzMgorLnBvOHM5dDh1OHI5YThsLgorLnBvczF0dQorLnBvc3R1MXJhCisucHI4ZTlhOG05YjhsOGUuCisucHJlYTRtMWIKKy5wcmVhbWIybDIKKy5wcjhlOWE4bTliOGw4ZThzLgorLnByZWFtYmxlczIKKy5wcjhlOWw4bzhhOGQ4ZThkLgorLnByZWw0b2EKKy5wcmVsb2EyZDMKKy5wcmVsb2EyZDFlZAorLnByOGU5cDhhOHI5aThuOGcuCisucHJlMnBhCisucHJlcDRhNHIxaQorLnByZXAyYTJyCisucHJlcGFyaW40ZworLnByOGU5cDhyOGk4bjh0LgorLnByMmVwcjIKKy5wcmVwcmluNHQzCisucHI4ZTlwOHI4aThuOHQ4cy4KKy5wcmVwcmluNHQ0czIKKy5wcjhlOXA4cjhvOGM4ZThzOXM4bzhyLgorLnByZTNwcm8KKy5wcmVwcjJvYworLnByZXBybzFjZQorLnByZXByb2MyZTJzcworLnByZXByb2NlczFzbworLnByOGU5cDhyOG84YzhlOHM5czhvOHI4cy4KKy5wcmVwcm9jZXNzbzRyczIKKy5wcjhlOXM4cDhsOGk4dDl0OGk4bjhnLgorLnByZTFzcAorLnByZXMxcDJsMgorLnByZXNwbDFpdAorLnByZXNwbDRpNHQzdDIKKy5wcmVzcGxpdDJ0MWluCisucHI4ZTl3OHI4YThwLgorLnByZXdyYTQKKy5wcjhlOXc4cjhhOHA4cDhlOGQuCisucHJld3JhNHAxcAorLnByZXdyYXAycGUKKy5wcmV3cmFwNHAyZWQKKy5wcjhpOGU4czh0OWU4czhzOGU4cy4KKy41cHIyaTRlNAorLnByaTFlc3QKKy5wcmllczR0MmUyc3MKKy5wcmllc3Rlc3MxZTRzCisucHI4ZTh0OXQ4eTlwOHI4aThuOXQ4ZThyLgorLnByZTR0M3QyCisucHJldDF0eQorLnByMmV0dHlwcjIKKy5wcmV0dHlwcmluNHQzCisucHI4ZTh0OXQ4eTlwOHI4aThuOXQ4aThuOGcuCisucHJldHR5cHJpbnQyaQorLnByZXR0eXByaW40dDNpbmcKKy5wcmV0dHlwcmluMnQxaW4KKy5wcjhvOWM4ZTlkOHU4cjlhOGwuCisucHIyb2MKKy5wcm8xY2UKKy5wcm9jZTFkdQorLnByb2NlZHUxcmEKKy5wcjhvOGM4ZThzOHMuCisucHJvYzJlMnNzCisucHI4bzljOHU4cjlhOG44YzhlLgorLnByb2N1MXJhCisucHJvY3VyYTJuCisucHI4bzhnOWU5bjhpOGU4cy4KKy5wcm8xZ2UKKy5wcm8xZ2VuCisucHJvZ2U1bjJpZTQKKy5wcjhvOGc5ZTluOHkuCisucHJvNGdlbnkKKy5wcjhvOWc4cjhhOG05bThhOGI4bDhlLgorLnBybzFncgorLnByb2dyYW0xbQorLnByb2dyYW0xbWEKKy5wcm9ncmFtMm1hYgorLnByb2dyYW1tYWIybDIKKy5wcjhvOG05aTluOGU4bjh0LgorLnByb200aQorLnByb20xaW4KKy5wcm9tMmluZQorLnByb21pMW5lbgorLnByb21pbmVuMXQKKy5wcjhvOW04aThzOWM4dTlvOHU4cy4KKy5wcm9tMmlzCisucHJvbTJpczFjCisucHJvbWlzMWN1CisucHJvbWlzY3Uxb3UyCisucHJvbWlzY3VvMnVzCisucHI4bzhtOWk4czlzOG84cjh5LgorLnByb200aTJzMXMKKy5wcm9taXMxc28KKy5wcm9taXNzbzFyeQorLnByOG84bTlpOHM4ZS4KKy5wcm9tNGlzZQorLnByOG84bTlpOHM4ZThzLgorLnByb21pczFlNHMKKy5wcjhvOXA4ZThsOWw4ZThyLgorLnBybzNwZWwKKy5wcm9wZWwxbAorLnByb3BlbDJsZQorLnByOG85cDhlOGw5bDhlOHI4cy4KKy5wcm9wZWxsZTRyMXMyCisucHI4bzlwOGU4bDlsOGk4bjhnLgorLnByb3BlbGwyaQorLnByb3BlbDJsaW40CisucHI4bzloOGk4YjlpOXQ4aTh2OGUuCisucHJvMWgyCisucHJvaGliaTJ0CisucHJvaGliaTF0aQorLnByb2hpYmkxdDJpdgorLnByOG85aDhpOGI5aTl0OGk4djhlOWw4eS4KKy5wcm9oaWJpdGl2NGUxbHkKKy5wcjhvOXM4YzhpOHU4dDl0OG8uCisucHJvczJjCisucHJvczFjaQorLnByb3NjaTF1CisucHJvc2NpdTR0M3QyCisucHJvc2NpdXQ1dG8KKy5wcjhvOXQ4ZThzOHQ5ZThyLgorLnBybzF0CisucHJvNHRlcworLnByOG85dDhlOHM4dDllOHI4cy4KKy5wcm90ZXN0ZTRyMXMyCisucHI4bzl0OGU4czl0OG84ci4KKy5wcm90NGVzMnRvCisucHI4bzl0OGU4czl0OG84cjhzLgorLnByb3Rlc3RvNHJzMgorLnByOG85dDhvOWw4YThuOWc4dThhOGc4ZS4KKy5wcm8xdG8KKy5wcm90bzFsYQorLnByb3RvNGxhMm4KKy5wcm90b2wyYW5nCisucHJvdG9sYW4xZ3UKKy5wcm90b2xhbmd1NGEKKy5wcjhvOXQ4bzl0OHk4cDlhOGwuCisucHJvdG8xdHkKKy5wcm90b3R5MXBhCisucHJvdG90eXA0YWwKKy5wcjhvOHY5aThuOGM4ZS4KKy5wcm92MWluCisucHJvdjJpbmMKKy5wcjhvOHY5aThuOGM4ZThzLgorLnByOG85djhpOG45YzhpOGE4bC4KKy5wcm92aW4xY2kKKy5wcm92aW4zYzJpMWEKKy5wcm92aW5jaTJhbAorLnByOG84dzllOHM4cy4KKy5wcm93MmUyc3MKKy5wczhlOHU5ZDhvOWQ4aThmOWY4ZThyOWU4bjl0OGk4YThsLgorLjJwMXMyCisucDJzZQorLnBzNGV1CisucHNldTFkbworLnBzZXVkb2QxaWYKKy5wc2V1ZG9kaTRmMWYKKy5wc2V1ZG9kaWZmZXIxCisucHNldWRvZGlmZmVyM2VuMXQKKy5wc2V1ZG9kaWZmZXJlbnQyaQorLnBzZXVkb2RpZmZlcmVuMXQyaTFhCisucHNldWRvZGlmZmVyZW50aTJhbAorLnBzOGU4dTlkOG85ZjhpOW44aTh0OGUuCisucHNldTJkNW9mCisucHNldWRvMmZpCisucHNldWRvMmZpbgorLnBzZXVkb2YyaW5pCisucHNldWRvZmluMml0CisucHNldWRvZmluMml0ZQorLnBzOGU4dTlkOG85ZjhpOW44aTh0OGU5bDh5LgorLnBzZXVkb2Zpbml0ZTFseQorLnBzOGU4dTlkOG85ZjhvOHI4YzhlOHMuCisucHNldWRvMWZvCisucHNldWRvZm8ycgorLnBzZXVkb2ZvcjFjCisucHNldWRvZm9yMmNlCisucHM4ZTh1OWQ4bzhnOXI4YTlwOGg4ZThyLgorLnBzZXVkNG9nCisucHNldWRvMWdyCisucHNldWRvZzVyYTNwaDRlcgorLnBzOGU4dTlkOG85ZzhyOG84dThwLgorLnBzZXVkbzRnNHJvCisucHNldWRvZ3JvdTIKKy5wczhlOHU5ZDhvOWc4cjhvOHU4cDhzLgorLnBzZXVkb2dyb3UycDFzMgorLnBzOGU4dTlkOG85bjh5OG0uCisucHNldTRkbzJuCisucHNldWRvbnltNAorLnBzOGU4dTlkOG85bjh5OG04cy4KKy5wc2V1ZG9ueTRtMXMyCisucHM4ZTh1OWQ4bzl3OG84cjhkLgorLnBzZXVkbzR3bzIKKy5wczhlOHU5ZDhvOXc4bzhyOGQ4cy4KKy5wc2V1ZG93b3IyZDFzMgorLnBzOHk5YzhoOGU5ZDhlOGw5aThjLgorLnBzNHkKKy5wNHN5MWMKKy5wc3kzY2gKKy5wc3ljaDRlMgorLnBzeTRjaDRlZAorLnBzeWNoZWRlbDJpCisucHM4eThjOGg4cy4KKy5wc3ljNGgxczIKKy5wdTliOGU4czljOGU4bjhjOGUuCisucHViMworLnB1YjRlCisucHU0YmVzNAorLnB1YmVzMmMKKy5wdWJlczFjZW4KKy5wdWJlczNjZW5jCisucXU4YThkOWQ4aThuOGcuCisucXUyCisucXVhMmQKKy5xdWFkNGQxaW4KKy5xdWFkMWQ0CisucXU4YTlkOHI4YTh0OWk4Yy4KKy5xdWExZHIKKy5xdWFkcmF0MWljCisucXU4YTlkOHI4YTh0OWk4YzhzLgorLnF1YWRyYXRpNGMzczIKKy5xdThhOGQ5cjhhOXQ4dThyOGUuCisucXVhZHJhMnR1CisucXVhZHJhM3R1cmUKKy5xdThhOGQ5cjhpOXA4bDhlOGc5aThjLgorLnF1YWRyaTJwMmwyCisucXVhZHIyaXAKKy5xdWFkcmlwbGVnNGljCisucXU4YThpOG44dDllOHIuCisucXVhaTIKKy5xdWE0aTRuCisucXVhaW4xdAorLnF1OGE4aThuOHQ5ZThzOHQuCisucXU4YTlzOGk5ZThxOHU4aTh2OWE5bDhlOG44YzhlLgorLnF1YXMyaWU0CisucXVhc2llMXEKKy5xdTJhc2llcXUyCisucXVhc2llcTJ1aTIKKy5xdWFzaWVxdTJpdjMKKy5xdWFzaWVxdWkxdmEKKy5xdWFzaWVxdWl2MmFsZQorLnF1YXNpZXF1aXZhM2xlbmMKKy5xdThhOXM4aTllOHE4dThpOHY5YTlsOGU4bjhjOGU4cy4KKy5xdThhOXM4aTllOHE4dThpOHY5YTlsOGU4bjh0LgorLnF1YXNpZXF1aXZhMWxlbjF0CisucXU4YTlzOGk5aDh5OXA4bzluOG84cjltOGE4bC4KKy5xdWFzaTNoCisucXVhc2loeTNwbworLnF1YXNpaHlwbzJuCisucXVhc2loeXBvbm9yMW0KKy5xdWFzaWh5cG9ub3IxbWEKKy5xdThhOXM4aTlyOGE4ZDlpOWM4YThsLgorLnF1YXM0aTJyCisucXVhc2kxcjVhCisucXVhc2lyYTJkCisucXVhc2lyMmFkaQorLnF1YXNpcmFkM2kxY2EKKy5xdThhOXM4aTlyOGU4czhpOGQ5dThhOGwuCisucXVhc2k0cmVzCisucXVhc2lyZTFzaQorLnF1YXNpcmUyczJpZAorLnF1YXNpcmVzaTJkdQorLnF1YXNpcmVzaWQxdTFhCisucXU4YTlzOGk5czhtOG84bzh0OGguCisucXVhMXNpcworLnF1YXNpMnMxbQorLnF1YXNpczFtbworLnF1YXNpc21vbzIKKy5xdWFzaXNtbzRvdGgKKy5xdThhOXM4aTlzOHQ4YTl0OGk4bzhuOWE4cjh5LgorLnF1YXNpczF0YQorLnF1YXNpc3RhdGlvbjVhMnIKKy5xdWFzaXN0YTF0MmlvCisucXVhc2lzdGF0aW8ybgorLnF1YXNpc3RhdGlvMW4xYQorLnF1OGE5czhpOXQ4bzhwOG84cy4KKy5xdTVhNXNpNHQKKy5xdWFzaTF0bworLnF1YXNpdG8xcG9zCisucXU4YTlzOGk5dDhyOGk5YThuOWc4dTlsOGE4ci4KKy5xdWFzaTV0cjJpM2EKKy5xdWFzaXRyaTJhMm4KKy5xdWFzaXRyaTJhbmcKKy5xdWFzaXRyaWFuMWd1CisucXVhc2l0cmlhbmd1MWxhCisucXVhc2l0cmlhbmd1bDJhMnIKKy5xdThhOXM4aTl0OHI4aTh2OWk4YThsLgorLnF1YXNpdHIyaTR2CisucXVhc2l0cml2M2kKKy5xdWFzaXRyaXYyaTFhCisucXVhc2l0cml2aTJhbAorLnF1OGk4bjl0OGU4czlzOGU4bjhjOGUuCisucTJ1aTIKKy5xdWk0bgorLnF1aW4xdAorLnF1aW40dDJlMnNzCisucXVpbnRlczRzZW5jCisucXU4aThuOXQ4ZThzOXM4ZThuOGM4ZThzLgorLnF1OGk4bjl0OGU4czlzOGU4bjl0OGk4YThsLgorLnF1aW50ZXNzZW4xdAorLnF1aW50ZXNzZW50MmkKKy5xdWludGVzc2VuMXQyaTFhCisucXVpbnRlc3NlbnRpMmFsCisucmE4YjliOGk4dDlyOHkuCisuMnJhYgorLnJhMmIxYgorLnJhYmJpMnQKKy5yYWJiaTN0cgorLnJhYmJpdDVyeQorLnJhOWQ4aTlvOGc5cjhhOXA4aDh5LgorLnJhMmQKKy5yMmFkaQorLnJhM2QyaW8KKy5yYWRpbzVnCisucmFkaW8yZ3IKKy5yYWRpbzRnM3JhMXBoeQorLnJhOGY4ZjlpOHM4aC4KKy5yYWY1ZmkKKy5yYTJmCisucmE0ZjFmNAorLnJhZjJmNWlzCisucmFmZmlzMmgKKy5yYThmOGY5aThzOGg5bDh5LgorLnJhZmZpczRoMWw0CisucmFmZmlzaDFseQorLnJhOG05czhoOGE4YzhrOGw4ZS4KKy5yYTRtMXMyCisucmFtNHMyaAorLnJhbXNoYWNrMQorLnJhbXNoYWNrMWwKKy5yYTh2OWU4bjlvOHU4cy4KKy5yYXY0ZTRubworLnJhdmUxbm91MgorLnJhdmVubzJ1cworLnJlOWE4cjhyOGE4bjhnOGU5bThlOG44dC4KKy5yZTVhcjFyNAorLnJlMmEycgorLnJlYXJyYW40Z2UKKy5yZWFycmEybgorLnJlYXJyMmFuZworLnJlYXJyYW5nZTFtZQorLnJlYXJyYW5nZTFtZW4KKy5yZWFycmFuZ2UzbWVuMXQKKy5yZTlhOHI4cjhhOG44ZzhlOW04ZThuOHQ4cy4KKy5yZWFycmFuZ2VtZW40dDRzMgorLnJlOGM5aTlwOHI4bzhjOWk5dDhpOGU4cy4KKy5yZWNpcHJvY2kxdGkKKy5yZWNpcHJvY2l0MmllNAorLnJlOGM5dDhhOG45ZzhsOGUuCisucmVjNHRhMm4KKy5yZTJjMXQKKy5yZWN0NWFuZworLnJlYzF0YQorLnJlY3RhbjFnbDIKKy5yZWN0YW4xZ2xlCisucmU4Yzl0OGE4bjlnOGw4ZThzLgorLnJlY3RhbmdsZXMyCisucmU4Yzl0OGE4bjlnOHU5bDhhOHIuCisucmVjdGFuMWd1CisucmVjdGFuZ3UxbGEKKy5yZWN0YW5ndWwyYTJyCisucmU5ZDhpOXI4ZThjOHQuCisuMnIyZWQKKy5yNGVkaQorLnJlZDRpcjIKKy5yZWRpMXJlCisucmVkaXJlMmMxdAorLnJlOWQ4aTlyOGU4Yzh0OWk4bzhuLgorLnJlZGlyZWMxdDJpbworLnJlZGlyZWN0aW8ybgorLnJlOWQ4dThjOWk4YjhsOGUuCisucmUxZHUKKy5yZWR1MmMKKy5yZWR1Y2k0YgorLnJlZHUxY2kKKy5yZWR1Y2kxYjJsMgorLnJlOWU4YzhoOG8uCisucmVlMmMKKy5yZWUyY2gKKy5yZWUzY2hvMgorLnJlOXA4aDhyOGE4czhlLgorLnJlcDRocjQKKy5yZXBocjJhcworLnJlOXA4aDhyOGE4czhlOHMuCisucmVwaHJhczFlNHMKKy5yZTlwOGg4cjhhOHM4ZThkLgorLnJlcGhyYTRzNGVkCisucmU5cDhvOXM4aTl0OGk4bzhuLgorLnJlNHBvc2kKKy5yZTFwbworLnJlMXBvcworLnJlcG8zczJpMXQyaW8KKy5yZXBvc2kxdGkKKy5yZXBvc2l0aW8ybgorLnJlOXA4bzlzOGk5dDhpOG84bjhzLgorLnJlcG9zaXRpbzJuM3MyCisucmU5cDhyOGk4bjh0LgorLnJlcHIyCisucmVwcmluNHQzCisucmU5cDhyOGk4bjh0OHMuCisucmVwcmluNHQ0czIKKy5yZTlzOHQ4bzhyOWE4YjhsOGUuCisucjRlczJ0bworLnJlc3RvMnJhCisucmVzdG8ycmFiCisucmVzdG9yYWIybDIKKy5yZTh0OHI4bzlmOGk4dC4KKy5yZXRybzJmaQorLnJlOHQ4cjhvOWY4aTh0OXQ4ZThkLgorLnJldHJvZjRpNHQ0dDIKKy5yZXRyb2ZpdDJ0MWVkCisucmU5dThzOWE4YjhsOGUuCisucjRldTIKKy5yZTJ1czQKKy5yZXVzYTIKKy5yZXUyczFhYgorLnJldXNhYjJsMgorLnJlOXU4czhlLgorLnJlOXc4aThyOGUuCisucmV3aTIKKy5yZXc0aXI0CisucmU5dzhyOGE4cC4KKy5yZXdyYTQKKy5yZTl3OHI4YThwOHA4ZThkLgorLnJld3JhNHAxcAorLnJld3JhcDJwZQorLnJld3JhcDRwMmVkCisucmU5dzhyOGk4dDhlLgorLnJld3JpNAorLnJld3IyaXRlCisucmg4aTluOG84YzllOHI5bzhzLgorLnJoNAorLnJoMmkxbm8KKy5yaGk0bm80YworLnJoaW5vMWNlCisucmhpbm9jMmVybworLnJpOGc4aDh0OWU4bzh1OHMuCisucmlnaDF0ZW8KKy5yaWdodGVvdTIKKy5yaWdodGVvMnVzCisucmk4ZzhoOHQ5ZThvOHU4czluOGU4czhzLgorLnJpZ2h0ZW91czFuNAorLnJpZ2h0ZW91czFuZXMKKy5yaWdodGVvdXNuMmUyc3MKKy5yaThuOGc5bDhlOGE4ZDhlOHIuCisucmluNGcKKy5yaW5nbDIKKy5yaW4xZ2xlCisucmluZ2xlMmEKKy5yaW5nbGVhMmQxCisucmk4bjhnOWw4ZThhOGQ4ZThyOHMuCisucmluZ2xlYWRlNHI1czIKKy5ybzliOG84dC4KKy5ybzliOG84dDhzLgorLnJvYm80dDFzMgorLnJvOWI4bzh0OGk4Yy4KKy5ybzliOG84dDlpOGM4cy4KKy5yb2JvdGk0YzNzMgorLnJvOHU4bjhkOXQ4YThiOGw4ZS4KKy5yb3UyCisucm91bjJkCisucm91bmQxdGEKKy5yb3VuZDJ0YWIKKy5yb3VuZHRhYjJsMgorLnJvOHU4bjhkOXQ4YThiOGw4ZThzLgorLnJvdW5kdGE1YmxlczIKKy5zYThsOGU4czljOGw4ZThyOGsuCisuc2EyCisuczJhbGUKKy5zYWxlczIKKy5zYWxlczJjCisuc2FsZXNjbGU1Cisuc2FsZXMxYzRsNAorLnNhOGw4ZThzOWM4bDhlOHI4azhzLgorLnNhbGVzY2xlcjRrMXMyCisuc2E4bDhlOHM5dzhvOG04YThuLgorLnNhbGVzNHcyCisuc2FsZTRzMXdvMgorLnNhbGVzd29tMQorLnNhbGVzd28xbWEKKy5zYWxlc3dvbWEybgorLnNhOGw4ZThzOXc4bzhtOGU4bi4KKy5zYWxlc3dvMm1lCisuc2FsZXN3bzFtZW4KKy5zYThsOW04bzluOGU4bDlsOGEuCisuczRhMmw0bQorLnNhbG1vMm40Cisuc2FsMW1vCisuc2FsbW9uNGVsbGEKKy5zYWxtb25lbDFsCisuc2E4bDl0OGE5dDhpOG84bi4KKy5zYTRsNHQKKy5zYWwxdGEKKy5zYWx0YTF0MmlvCisuc2FsdGF0aW8ybgorLnNhOHI5czhhOXA4YThyOWk4bDlsOGEuCisuczJhMnIKKy5zYTJyNHNhMgorLnNhNHJzMgorLnNhcnMxYXAKKy5zMmEycnNhcDJhMnI0Cisuc2Fyc2ExcGEKKy5zYXJzYXA0YTRyMWkKKy5zYXJzYXBhcmlsMWwKKy5zYTh1OGU4cjlrOHI4YTh1OHQuCisuc2F1NAorLnNhdWVya3JhdTR0Cisuc2M4YTh0OW85bDhvOGc5aTljOGE4bC4KKy5zMWNhCisuc2NhMXRvCisuc2NhdG8zbG9nMWljCisuc2NhdG9sb2dpMWNhCisuc2M4aDhlOGQ5dThsOWk4bjhnLgorLnMyY2gyCisuc2NoZTIKKy5zNGNoNGVkCisuc2NoZTRkdWwKKy5zY2hlMWR1Cisuc2NoZWR1bDJpCisuc2NoZWR1bDNpbmcKKy5zYzhoOGk4ejlvOXA4aDhyOGU4bjhpOGMuCisuc2NoaTJ6Cisuc2NoaTF6bworLnNjaGl6Mm9waAorLnNjaGl6b3A0aHI0Cisuc2M4aDhuOGE4dTl6OGU4ci4KKy5zYzJoMW4KKy5zY2gxbmEKKy5zY2huMmF1Cisuc2NobmF1Mno0ZQorLnNjaG5hdXoxZXIKKy5zYzhoOG84bzhsOWM4aDhpOGw4ZC4KKy5zNGNobzIKKy5zY2hvbzIKKy5zY2hvbzRsMWMyCisuczJjaG9vbDJjaAorLnNjaG9vbGNoNGlsMgorLnNjaG9vbGNoaTJsZAorLnNjOGg4bzhvOGw5YzhoOGk4bDhkOXI4ZThuLgorLnNjaG9vbGNoaWwzZHIKKy5zY2hvb2xjaGlsZHJlNAorLnNjaG9vbGNoaWw1ZHJlbgorLnNjOGg4bzhvOGw5dDhlOGE4YzhoOGU4ci4KKy5zY2hvbzRsMnQKKy5zY2hvb2wxdGUKKy5zMmNob29sdGVhMmNoCisuc2Nob29sdGVhY2hlMgorLnNjOGg4bzhvOGw5dDhlOGE4YzhoOWU4cjhzLgorLnNjaG9vbHRlYWNoM2U0cjFzMgorLnNjOHI4dTl0OGk5bjh5LgorLnNjcnUydDFpNW4KKy5zY3I0dTF0MmkKKy5zY3J1dDRpbnkKKy5zYzh5OHQ4aDlpOG44Zy4KKy5zMWN5Cisuc2N5M3RoaW4KKy5zZThsOGw5ZThyLgorLnNlbDJsZQorLnNlOGw4bDllOHI4cy4KKy5zZWxsZTRyMXMyCisuc2U4YzlyOGU5dDhhOHI5aThhOHQuCisuc2UxY3IKKy5zZTRjM3JlMXRhCisuc2VjcmV0MmEycgorLnNlY3JldGFyMWkKKy5zZWNyZXRhcjJpM2EKKy5zZThjOXI4ZTl0OGE4cjlpOGE4dDhzLgorLnNlY3JldGFyaWE0dDFzMgorLnNlOG05YTlwOGg4bzhyOGUuCisuc2UxbWEKKy5zZTRtYXAKKy5zZW1hcGhvNHIKKy5zZThtOWE5cDhoOG84cjhlOHMuCisuc2U5bThlOHM5dDhlOHIuCisuNHNlMW1lCisuc2UybWVzCisuc2U4bThpOWQ4ZThmOWk5bjhpOHQ4ZS4KKy5zZW0yaWQKKy5zZW1pZGUxZgorLnNlbWlkZWY1aTVuMml0ZQorLnNlbWlkZTFmaQorLnNlbWlkZTJmaW4KKy5zZW1pZGVmMmluaQorLnNlbWlkZWZpbjJpdAorLnNlOG04aTlkOGk5cjhlOGM4dC4KKy5zZW1pMmRpCisuc2VtaWQ0aXIyCisuc2VtaWRpMXJlCisuc2VtaWRpcmUyYzF0Cisuc2U4bThpOWg4bzltOG85dDhoOGU4dDlpOGMuCisuc2VtaTNoCisuc2VtaWhvMW1vCisuc2VtaWhvbTRvdGgzCisuc2VtaWhvbW90aDJlCisuc2VtaWhvbW8zdGhlNHQKKy5zZW1paG9tb3RoZXQxaWMKKy5zZThtOGk5cjhpOG44Zy4KKy5zZW00aXIKKy5zZW1pcjFpCisuc2VtaXJpbjRnCisuc2U4bThpOXI4aThuOGc4cy4KKy5zZW1pcmluZ3MyCisuc2U4bThpOXM4aThtOXA4bDhlLgorLnNlNG0yaXMKKy5zZW1pc2k0bTFwCisuc2VtaXNpbTFwMmwyCisuc2U4bThpOXM4azhpOGw4bDhlOGQuCisuc2VtNGlzNGsyCisuc2VtaXNrMWkKKy5zZW1pc2s0aWwxbAorLnNlbWlza2lsMmxlCisuc2U4cjhvOWU4cDhpOWQ4ZTltOGk5bzlsOG84ZzlpOWM4YThsLgorLnMyZXI0bworLnNlcm80ZQorLnNlcm9lcDRpZAorLnNlcm9lcGkzZGUKKy5zZXJvZXBpZDRlbQorLnNlcm9lcGlkZW0yaW8KKy5zZXJvZXBpZGVtaTFvbAorLnNlcm9lcGlkZW1pbzNsb2cxaWMKKy5zZXJvZXBpZGVtaW9sb2dpMWNhCisuc2U4cjl2OG85bThlOGM4aDlhOG44aThzOG0uCisuNHNlcjN2bworLnNlcnZvMm1lCisuc2Vydm9tZTJjaAorLnNlcnZvbWVjaDVhNW5pcworLnNlcnZvbWVjaGEybgorLnNlcnZvbWVjaGFuaTJzMW0KKy5zZThyOXY4bzltOGU4YzhoOWE4bjhpOHM4bThzLgorLnNlcnZvbWVjaGFuNGlzNG0xczIKKy5zZThzOXE4dThpOXA4ZTlkOGE5bDhpOGE4bi4KKy5zMWU0cworLnNlc3F1MgorLnNlc3EydWkyCisuc2VzcXUyaXAKKy5zZXNxdWlwZTQKKy5zZXNxdWkycDJlZAorLnNlc3F1aXAyZTJkMmEKKy5zZXNxdWlwZWRhbDFpCisuc2VzcXVpcGVkYWwyaTFhCisuc2VzcXVpcGVkYWxpMmEybgorLnNlOHQ5dThwLgorLnNlMXR1Cisuc2U4dDl1OHA4cy4KKy5zZXR1MnAxczIKKy5zZTl2OGU4cjhlOWw4eS4KKy41c2V2Cisuc2V2MWVyCisuc2V2NGVyZWwKKy5zZXZlcmUxbHkKKy5zaDhhOHA4ZTlhOGI4bDhlLgorLnNoYTNwZTRhCisuc2hhcGUxYTRiCisuc2hhcGVhYjJsMgorLnNoOG84ZTlzOHQ4cjhpOG44Zy4KKy5zaG80Cisuc2hvMmVzdDRyCisuc2hvZXN0cmluNGcKKy5zaDhvOGU5czh0OHI4aThuOGc4cy4KKy5zaG9lc3RyaW5nczIKKy5zaThkOGU5czh0OGU4cC4KKy41c2lkZTRzMgorLnMyaWQKKy5zaWRlc3RlNHAKKy5zaThkOGU5czh0OGU4cDhzLgorLnNpZGVzdGUycDFzMgorLnNpOGQ4ZTlzOHc4aThwOGUuCisuc2lkZXM0dzIKKy5zaWRlc3dpMgorLnNpZGVzdzJpcAorLnNpZGVzd2lwZTQKKy5zazh5OXM4YzhyOGE4cDhlOHIuCisuc2syCisuc2t5czRjCisuc2t5c2NyYXAzZXIKKy5zazh5OXM4YzhyOGE4cDhlOHI4cy4KKy5za3lzY3JhcGU0cjFzMgorLnNtOG84azhlOXM4dDhhOGM4ay4KKy4yczFtCisuczFtbworLnM0bTJvaworLnNtb2tlczQKKy5zbW9rZXMxdGEKKy5zbW9rZXN0YWNrMQorLnNtOG84azhlOXM4dDhhOGM4azhzLgorLnNtb2tlc3RhYzRrMXMyCisuc244bzhyOWs4ZThsOWk4bjhnLgorLnMxbjQKKy5zbm9ya2U1bDJpCisuc25vcmtlNGwzaW5nCisuc285bDhlOW44bzhpOGQuCisuMXNvCisuc29sNGVubworLnNvbGVub2kyCisuc29sZW5vMmlkCisuc285bDhlOW44bzhpOGQ4cy4KKy5zb2xlbm9pMmQxczIKKy5zbzhsOHU4dDhlLgorLnNvMWx1dAorLnNvOGw4dTh0OGU4cy4KKy5zbzh2OWU4cjllOGk4ZzhuLgorLjRzb3YKKy5zb3ZlcmVpMgorLnNvdmVyZTJpZzIKKy5zbzh2OWU4cjllOGk4ZzhuOHMuCisuc292ZXJlaWcybjFzMgorLnNwOGE5YzhlOHMuCisuMnMxcGEKKy5zcGE0Y2UKKy5zcDhlOWM4aThvOHU4cy4KKy5zcGUyYworLnNwZTFjMmkKKy5zcGVjMmlvCisuc3BlY2lvdTIKKy5zcGVjaW8ydXMKKy5zcDhlOGw4bDllOHIuCisuc3BlbDFsCisuc3BlbDJsZQorLnNwOGU4bDhsOWU4cjhzLgorLnNwZWxsZTRyMXMyCisuc3A4ZThsOGw5aThuOGcuCisuc3BlbGwyaQorLnNwZWwybGluNAorLnNwOGU5bDh1OG44azllOHIuCisuc3BlbHU0bmsyCisuc3BlbHVuazFlcgorLnNwOGU4bjhkOXQ4aDhyOGk4Zjh0LgorLnNwZW40ZAorLnNwZW5kMnRoCisuc3BlbmR0NGhyNAorLnNwZW5kdGhyNGkyZnQKKy5zcDhoOGU4cjlvOGk4ZC4KKy5zMnBoZQorLjNzcGg0ZXIKKy5zcGgyZXJvCisuc3BoZXJvaTIKKy5zcGhlcm8yaWQKKy5zcDhoOGU4cjlvOGk4ZDlhOGwuCisuc3BoZXJvaTFkMmEKKy5zcDhoOGk4bjlnOGU4cy4KKy5zcGg1aW5nCisuc3BoNGluZ2UKKy5zcDhpOGM5aTlsOHkuCisuc3AyaTFjaQorLnNwaWNpMWx5Cisuc3A4aThuOW84cjhzLgorLnNwaTJuCisuc3A0aTFubworLnNwaW5vNHJzMgorLnNwOG84azhlOHM5dzhvOG04YThuLgorLnNwMm9rCisuc3Bva2VzNAorLnNwb2tlczR3MgorLnNwb2tlNHMxd28yCisuc3Bva2Vzd29tMQorLnNwb2tlc3dvMW1hCisuc3Bva2Vzd29tYTJuCisuc3A4bzhrOGU4czl3OG84bThlOG4uCisuc3Bva2Vzd28ybWUKKy5zcG9rZXN3bzFtZW4KKy5zcDhvOHI4dDhzOWM4YThzOHQuCisuczFwNG9yNAorLnNwb3I0dDFzMgorLnNwb3J0NHNjCisuc3BvcnRzMWNhCisuc3A4bzhyOHQ4czljOGE4czh0OWU4ci4KKy5zcG9ydHNjYXN0NWVyCisuc3A4bzhyOXQ4aTh2OGU5bDh5LgorLnNwb3IxdGkKKy5zcG9yNHQyaXYKKy5zcG9ydGl2NGUxbHkKKy5zcDhvOHI4dDhzOXc4ZThhOHIuCisuc3BvcnQ0c3cyCisuc3BvcnRzd2UyYTJyCisuc3A4bzhyOHQ4czl3OHI4aTh0OGU4ci4KKy5zcG9ydHN3cmk0Cisuc3BvcnRzd3IyaXRlCisuc3A4bzhyOHQ4czl3OHI4aTh0OGU4cjhzLgorLnNwb3J0c3dyaXQ1ZTRyMXMyCisuc3A4cjhpOGc4aDh0OWw4aThlOHIuCisuc3ByMgorLnNwcjJpZworLnNwcmlnaDJ0bAorLnNwcmlnaHRsMmllNAorLnNxOHU4ZThhOW04aThzOGguCisuc3F1MgorLnNxdWVhbTJpcworLnNxdWVhbWlzMmgKKy5zdDhhOG44ZDlhOGw4bzhuOGUuCisuNXN0NGFuZAorLnN0YTJuCisuc3RhbjFkMmEKKy5zdGFuZGFsbzJuCisuc3Q4YThyOXQ4bDhpOG44Zy4KKy5zdDJhMnIKKy5zdGFyMnRsCisuc3Q4YThyOXQ4bDhpOG44ZzlsOHkuCisuc3RhcnRsaW5nbDIKKy5zdGFydGxpbmcxbHkKKy5zdDhhOXQ4aThzOXQ4aThjOHMuCisuc3RhdGlzMXQyaQorLnN0YXRpczF0aWMKKy5zdGF0aXN0aTRjM3MyCisuc3Q4ZThhOGw4dDhoOWk4bDh5LgorLnN0ZWE0bAorLnN0ZWE0bHQKKy5zdGVhbHRoM2kKKy5zdGVhbDR0aDRpbDIKKy5zdGVhbHRoaTFseQorLnN0OGU4ZThwOGw4ZTljOGg4YThzOGUuCisuczF0ZWUKKy5zdGVlNHAxCisuc3RlZTFwMmwyCisuc3RlZXBsZTJjaAorLnN0OGU4cjhlOG85ZzhyOGE4cDhoOWk4Yy4KKy5zdGVyZTFvCisuc3RlcmVvMmcKKy5zdGVyZW8xZ3IKKy5zdGVyZW81Z3JhcGgxaWMKKy5zdGVyZW9ncjRhcGhpCisuc3Q4bzljOGg4YThzOXQ4aThjLgorLnMxdG8KKy5zdG8yY2g0Cisuc3RvY2hhc3QyaQorLnN0b2NoYXMxdGljCisuc3Q4cjhhOG44ZzhlOW44ZThzOHMuCisuc3Q0cgorLnMxdHJhCisuc3RyYW40Z2UKKy5zdHJhMm4KKy5zdHIyYW5nCisuc3RyYW5nZTRuNGUKKy5zdHJhbjFnZW4KKy5zdHJhbmdlMW5lcworLnN0cmFuZ2VuMmUyc3MKKy5zdDhyOGE4cDloOGE4bjhnOGU4ci4KKy5zdHJhcGgyYW40ZworLnN0cmFwaGFuZzVlcgorLnN0cmFwaGEybgorLnN0OHI4YTh0OWE5ZzhlOG0uCisuc3RyYTJ0YQorLnN0OHI4YTh0OWE5ZzhlOG04cy4KKy5zdHJhdGFnZTRtMXMyCisuc3Q4cjhlOHQ4YzhoOWk5ZThyLgorLnN0cmU0dGMKKy5zdHJldDRjaAorLnN0cmV0Y2gyaWU0Cisuc3Q4cjhpOHA5dDhlOGE4czhlLgorLnN0cjJpcAorLnN0cmkycDF0Cisuc3RyaXAydGUKKy5zdDhyOG84bjhnOWg4bzhsOGQuCisuc3RybzJuCisuc3Ryb25naG8ybDJkCisuc3Q4cjhvOG44ZzllOHM4dC4KKy5zdDh1OXA4aThkOWU4ci4KKy5zMXR1Cisuc3R1cDRpZAorLnN0dXBpM2RlCisuc3Q4dTlwOGk4ZDllOHM4dC4KKy5zdHVwaWRlNHMyCisuc3U4YjlkOGk4ZjlmOGU4cjllOG45dDhpOGE4bC4KKy4xc3UKKy5zdTRiMworLnN1NGIxZAorLnN1YmQxaWYKKy5zdWJkaTRmMWYKKy5zdWJkaWZmZXIxCisuc3ViZGlmZmVyM2VuMXQKKy5zdWJkaWZmZXJlbnQyaQorLnN1YmRpZmZlcmVuMXQyaTFhCisuc3ViZGlmZmVyZW50aTJhbAorLnN1OGI5ZTh4OXA4cjhlOHM5czhpOG84bi4KKy5zdWI0ZQorLnN1YjFleDNwCisuc3ViZXhwcjIKKy5zdWJleDNwcjJlMnNzCisuc3ViZXhwcmVzMXNpCisuc3ViZXhwcmVzMXMyaW8KKy5zdWJleHByZXM1c2lvMm4KKy5zdThiOWU4eDlwOHI4ZThzOXM4aThvOG44cy4KKy5zdWJleHByZXNzaW8ybjNzMgorLnN1OG05bThhOWI4bDhlLgorLnN1Mm0KKy5zdW0xbQorLnN1bTFtYQorLnN1bTJtYWIKKy5zdW1tYWIybDIKKy5zdThwOGU4cjllOGc4by4KKy5zdTFwZQorLnN1cGVyZTFnbworLnN1OHA4ZThyOWU4ZzhvOHMuCisuc3VwZXJlNGdvcworLnN1OXA4cjhlOG05YTljOGk4czh0LgorLnN1cHIyCisuc3VwcmU0bWFjCisuc3VwcmUxbWEKKy5zdXByZW00YTJjaQorLnN1OXA4cjhlOG05YTljOGk4czh0OHMuCisuc3VwcmVtYWNpczR0MXMyCisuc3U4cjl2OGU4aThsOWw4YThuOGM4ZS4KKy5zdTJyCisuc3VydjRlCisuc3VydmVpMgorLnN1cnZlaWwxbAorLnN1cnZlaWxsYTJuCisuc3c4aThtOW04aThuOGc5bDh5LgorLnN3MgorLnN3aTIKKy5zd2ltMW0KKy5zd2ltbTRpbmdsMgorLnN3aW1tNWluZzFseQorLnN5OG04cDl0OG85bThhOHQ4aThjLgorLnN5NG0xcAorLnN5bTJwMXQKKy5zeW1wMXRvCisuc3ltcHRvMm1hCisuc3ltcHRvbWF0MWljCisuc3k4bjljOGg4cjhvOW04ZThzOGguCisuc3luM2M0aHI0Cisuc3luMmNoCisuc3luY2hybzJtZQorLnN5bmNocm8ybWVzCisuc3luY2hyb200ZXMyaAorLnN5OG45YzhoOHI4bzluOG84dThzLgorLnN5bmNocm8ybgorLnN5bmNocm8xbm91MgorLnN5bmNocm9ubzJ1cworLnN5OG45YzhoOHI4bzl0OHI4bzhuLgorLnN5bmNocm90cm8ybgorLnRhOGY4ZjlyOGE4aThsLgorLjR0YTJmNAorLnRhNGYxZjQKKy50YWZmcjJhaTIKKy50YThsOGs5YTl0OGk4djhlLgorLnRhMmwKKy40dGFsaworLnRhbGthMworLnRhbGthNHQKKy50YWxrYTF0Mml2CisudGE5cDhlOHM5dDhyOHkuCisudGFwMmVzdDRyCisudGFwZTRzdHJ5CisudGE5cDhlOHM5dDhyOGk4ZThzLgorLnRhcGVzdHIyaWU0CisudGE4cjlwOGE4dTlsOGk4bi4KKy50MmEycgorLnRhcjJwCisudGFyMXBhCisudGFycGF1NGwyCisudGFycGF1bDJpCisudGE4cjlwOGE4dTlsOGk4bjhzLgorLnRhcnBhdWwyaTJuMXMyCisudGU5bDhlOGc5cjhhOXA4aDhlOHIuCisudGVsZTFncgorLnRlbGVnNXJhM3BoNGVyCisudGU5bDhlOGc5cjhhOXA4aDhlOHI4cy4KKy50ZWxlZ3JhcGhlNHIxczIKKy50ZThsOGU5azhpOW44ZTh0OWk4Yy4KKy50ZWxla2k0bgorLnRlbGVrMWkKKy50ZWxlazJpbmUKKy50ZWxla2kzbmV0MWljCisudGU4bDhlOWs4aTluOGU4dDlpOGM4cy4KKy50ZWxla2luZXRpNGMzczIKKy50ZThsOGU5cjhvOWI4bzh0OWk4YzhzLgorLnRlNGwxZXIKKy50ZWw0ZXJvCisudGVsZXI1b2IKKy50ZWxlcm9ib3RpNGMzczIKKy50ZThsOGw5ZThyLgorLnRlbDFsCisudGVsMmxlCisudGU4bDhsOWU4cjhzLgorLnRlbGxlNHIxczIKKy50ZThtOXA4bzlyOGE4cjlpOGw4eS4KKy50ZTRtMXAKKy50ZW0xcDRvcgorLnRlbXBvMXJhCisudGVtcG80cmFyaWwKKy50ZW1wb3IyYTJyCisudGVtcG9yYXIxaQorLnRlbXBvcmFyaTFseQorLnRlOG45dThyOGUuCisudGU4czh0OWI4ZThkLgorLnRlczJ0MWIKKy50ZXN0NGJlMmQKKy50ZTh4OHQ5dzhpOGQ4dDhoLgorLjN0ZXgKKy50ZXgxdDIKKy50ZXh0dzQKKy50ZXh0d2kyCisudGV4dHcyaWQKKy50ZXh0d2lkMnRoCisudGg4YThsOWE5bTh1OHMuCisudGhhM2xhCisudGhhbGEzbQorLnRoYWxhMW11CisudGhhbGFtMnVzCisudGg4ZThyOW04bzllOGw4YThzOXQ4aThjLgorLnRoMmUKKy50aGVyM200CisudGhlcjFtbworLnRoZXJtbzRlbAorLnRoZXJtb2UxbGEKKy50aGVybW9lbGFzdDJpCisudGhlcm1vZWxhczF0aWMKKy50aThtOGU5czh0OGE4bThwLgorLnRpMm1lcworLnRpbWVzMXRhCisudGltZXN0YTRtMXAKKy50aThtOGU5czh0OGE4bThwOHMuCisudGltZXN0YW0ycDFzMgorLnRvOG84bDlrOGk4dC4KKy50b28yCisudG9vbGsxaQorLnRvOG84bDlrOGk4dDhzLgorLnRvb2xraTR0MXMyCisudG84cDhvOWc4cjhhOHA4aDlpOWM4YThsLgorLnRvNXBvNGcKKy50b3BvMWdyCisudG9wbzVncmFwaDFpYworLnRvcG9ncjRhcGhpCisudG9wb2dyYXBoaTFjYQorLnRvOHE4dThlOHMuCisudG8xcQorLnRvcXUyCisudHI4YThpOXQ4bzhyOW84dThzLgorLjF0cmEKKy50cjJhaTIKKy50cmFpMXRvCisudHJhaXRvcm91MgorLnRyYWl0b3JvMnVzCisudHI4YThuOHM5YzhlOGk4djhlOHIuCisudHJhMm4KKy50cmEybjFzMgorLnRyYW5zNGMKKy50cmFuNHMzY2VpMgorLnRyYW5zY2UyaXYKKy50cjhhOG44czljOGU4aTh2OGU4cjhzLgorLnRyYW5zY2VpdmU0cjFzMgorLnRyOGE4bjhzOWc4cjhlOHM4cy4KKy50cmFuMnMzZworLnRyYW5zMWdyCisudHJhbnNncjJlMnNzCisudHI4YThuOHM5djhlOHI5czhhOGwuCisudHJhbjRzdgorLnRyYW5zdmU0cjFzMgorLnRyYW5zdmVyMXNhMgorLnRyOGE4bjhzOXY4ZThyOXM4YThsOHMuCisudHJhbnN2ZXJzYTJsMXMyCisudHI4YThuOHM5djhlOHM5dDhpOHQ4ZS4KKy50cmFuc3Y0ZTJzCisudHJhbnN2ZXN0MmkKKy50cmFuc3Zlc3QyaXRlCisudHI4YThuOHM5djhlOHM5dDhpOHQ4ZThzLgorLnRyYW5zdmVzdGl0NGVzCisudHI4YTl2OGU4cjhzOWE5YjhsOGUuCisudHJhdmU0cjFzMgorLnRyYXZlcjFzYTIKKy50cmF2ZXIyczFhYgorLnRyYXZlcnNhYjJsMgorLnRyOGE5djhlOHI5czhhOGwuCisudHI4YTl2OGU4cjlzOGE4bDhzLgorLnRyYXZlcnNhMmwxczIKKy50cjhpOWU4dDhoOHk4bDlhOG04aThuOGUuCisudHJpNWV0CisudHIyaWU0CisudHJpZXRoeTNsYQorLnRyaWV0aHlsYW0xaW4KKy50cmlldGh5bGFtMmluZQorLnRyOGU4YThjOGg5ZThyOGk4ZThzLgorLnRyZWEyY2gKKy50cmVhY2hlMgorLnRyZWFjaGVyMWkKKy50cmVhY2hlcjJpZTQKKy50cjhvOHU5YjhhOWQ4bzh1OHIuCisudHJvdTIKKy50cm91YmEyZAorLnRyb3ViYTFkbworLnRyb3ViYWRvdTIKKy50dThyOWs4ZTh5LgorLjF0dQorLnR1OHI5azhlOHk4cy4KKy50dXJrZXlzNAorLnR1OHI4bjlhOHI4bzh1OG44ZC4KKy50dXI0bjJhMnIKKy50dXIxbmEKKy50dXJuYXJvdTIKKy50dXJuYXJvdW4yZAorLnR1OHI4bjlhOHI4bzh1OG44ZDhzLgorLnR1cm5hcm91bjJkMXMyCisudHk4cDlhOGwuCisuMXR5CisudHkxcGEKKy50eXA0YWwKKy51bjlhOHQ5dDhhOGM4aDhlOGQuCisudW4yYXQ0CisudW5hNHQzdDIKKy51bmF0MXRhCisudW5hdHRhMmNoCisudW5hdHRhY2hlMgorLnVuYXR0YTRjaDRlZAorLnVuOWU4cjhyOWk4bjhnOWw4eS4KKy51bjRlcgorLnVuZXI0cjQKKy51bmVycmluNGcKKy51bmVycmluZ2wyCisudW5lcnJpbmcxbHkKKy51bjlmOHI4aThlOG44ZDlsOHkuCisudW4zZgorLnVuZnJpMgorLnVuZnIyaWU0CisudW5mcmllbjJkMWx5CisudW45ZjhyOGk4ZThuOGQ5bDhpOWU4ci4KKy51bmZyaWVuZGwyaWU0CisudmE4Zzh1OGU4ci4KKy4xdmEKKy52YWc0CisudmE1Z3VlcgorLnZhMmd1ZQorLnZhOHU4ZDhlOXY4aThsOGw4ZS4KKy52YXVkZTF2NAorLnZhdWRlMnYzaTRsCisudmF1ZGUxdmkKKy52YXVkZXZpbDFsCisudmF1ZGV2aWwybGUKKy52aThjOWE4cjhzLgorLnY0aWMyYTJyCisudmkxY2EKKy52aWNhNHJzMgorLnZpOGw5bDhhOGk4bjllOHM4cy4KKy4ydmlsCisudmlsMWwKKy52aWxsYWkyCisudmlsbGE0aTRuCisudmlsbGEyaW5lCisudmlsbGFpNW4yZTJzcworLnZpbGxhaTFuZXMKKy52aThzOXU4YThsLgorLnZpM3N1CisudmlzdTFhbAorLnZpOHM5dThhOGw5bDh5LgorLnZpc3VhbDFsCisudmlzdWFsMWx5Cisudmk5djhpOHA5YTlyOG84dThzLgorLjN2Mml2Cisudml2Mmk0cAorLnZpdmkxcGEKKy52aXZpcDJhMnIKKy52aXZpcGFyb3UyCisudml2aXBhcm8ydXMKKy52bzhpOGM4ZTlwOHI4aThuOHQuCisudm9pNAorLnZvaTNjZXAKKy52b2ljZXByMgorLnZvaWNlcHJpbjR0MworLnZzOHA4YThjOGUuCisudjJzMXBhCisudnNwYTRjZQorLndhOGQ5ZDhpOG44Zy4KKy53YTJkCisud2FkNGQxaW4KKy53YWQxZDQKKy53YThsOGw5ZjhsOG84dzhlOHIuCisud2FsMWwKKy53YWwybGYKKy53YWxsZjRsMgorLndhbGxmbG93MWVyCisud2E4bDhsOWY4bDhvOHc5ZThyOHMuCisud2FsbGZsb3dlNHIxczIKKy53YThyOG05ZThzOHQuCisudzJhMnIKKy53YXIxbQorLndhcjJtZQorLndhcjJtZXMKKy53YThzOHQ4ZTl3OGE4dDhlOHIuCisud2FzNHQKKy53YXN0ZTJ3Cisud2FzdGUxdzVhCisud2FzdGV3YTF0ZQorLndhOHY4ZTlnOHU4aThkOGUuCisud2F2ZWczCisud2F2ZWcydWkyCisud2F2ZWd1MmlkCisud2E4djhlOWc4dThpOGQ4ZThzLgorLndhdmVndWlkZTRzMgorLndhOHY4ZTlsOGU4dC4KKy53YTh2OGU5bDhlOHQ4cy4KKy53YXZlbGU0dDFzMgorLndlOGI5bDhpOGs4ZS4KKy53MmUxYgorLndlYjJsMgorLndlYjNsNGlrCisud2U4ZThrOW44aThnOGg4dC4KKy53ZWVrbjJpZworLndlOGU4azluOGk4ZzhoOHQ4cy4KKy53ZWVrbmlnaDR0MXMyCisud2g4ZThlOGw5YzhoOGE4aThyLgorLndoZWU0bDFjMgorLndoZWVsMmNoCisud2hlZWxjaGFpMgorLndoZWVsY2hhNGlyCisud2g4ZThlOGw5YzhoOGE4aThyOHMuCisud2hlZWxjaGFpNHJzMgorLndoOGk4YzhoOWU4djhlOHIuCisud2hpNAorLndoNGkyY2gKKy53aGljaGUyCisud2hpY2hldjFlcgorLndoOGk4dDhlOXM4aThkOGU4ZC4KKy53aDJpdGUKKy53aGl0NGVzCisud2hpdGUxc2kKKy53aGl0ZTJzMmlkCisud2hpdGVzaTJkMWVkCisud2g4aTh0OGU5czhwOGE4YzhlLgorLndoaXRlMXNwCisud2hpdGUyczFwYQorLndoaXRlc3BhNGNlCisud2g4aTh0OGU5czhwOGE4YzhlOHMuCisud2k4ZDhlOXM4cDhyOGU4YThkLgorLncyaWQKKy53aWRlNHMyCisud2lkZTFzcAorLndpZGVzNHByZQorLndpZGVzcHIyCisud2lkZXNwcmVhMmQxCisud2k4bjhnOXM4cDhhOG4uCisud2luNGcKKy53aW5nczIKKy53aW5nMnMxcGEKKy53aW5nc3BhNG4KKy53aThuOGc5czhwOGE4bjhzLgorLndpbmdzcGEybjFzMgorLndpOG44ZzlzOHA4cjhlOGE4ZC4KKy53aW5nc3ByMgorLndpbmdzcHJlYTJkMQorLndpOHQ4YzhoOWM4cjhhOGY4dC4KKy53aTR0YworLndpdDRjaAorLndpdGNoY3JhMmY0dAorLndpdGNoY3JhMmYKKy53bzhyOGQ5czhwOGE4YzlpOG44Zy4KKy4xd28yCisud29yMmQxczIKKy53b3JkczRwCisud29yZDJzMXBhCisud29yZHNwNGEyY2kKKy53b3Jkc3BhMmMxaW4KKy53b3Jkc3BhYzFpbmcKKy53bzhyOGs5YThyOG84dThuOGQuCisud29yazJhMnIKKy53b3JrYXJvdTIKKy53b3JrYXJvdW4yZAorLndvOHI4azlhOHI4bzh1OG44ZDhzLgorLndvcmthcm91bjJkMXMyCisud284cjhrOWg4bzhyOHM4ZS4KKy53b3JraDQKKy53b3JraG9yNHNlCisud29ya2hvNHJzMgorLndvOHI4azloOG84cjhzOGU4cy4KKy53b3JraG9yczNlNHMKKy53cjhhOHA5YThyOG84dThuOGQuCisud3JhNAorLndyYXAyYTJyNAorLndyYTFwYQorLndyYXBhcm91MgorLndyYXBhcm91bjJkCisud3I4ZTh0OGM4aDllOGQuCisud3JlNHRjCisud3JldDRjaAorLndyZXRjaGUyCisud3JldDRjaDRlZAorLndyOGU4dDhjOGg5ZThkOWw4eS4KKy53cmV0Y2hlMmQxbHkKKy55ZThzOXQ4ZThyOXk4ZThhOHIuCisueWVzNAorLnllc3RlcnllMmEycgorLmFsOWc4ZTliOHI4YThpOXM4YzhoOGUuCisuYWxnZWJyYTJpczFjCisuYWxnZWJyYWlzM2NoMgorLmFsZ2VicmFpc2NoZTIKKy5hbDlsOGU5ZzhoOGU5bjh5LgorLmFsMWwKKy5hbDJsZQorLmFsM2xlZworLmFsbGVnaGUybgorLmFyOWs4YThuOXM4YThzLgorLmFya2EybgorLmFya2FuMnNhMgorLmFya2EybjFzMgorLmF0OHA5YThzOGUuCisuYTR0MXAKKy5hdDFwYQorLmF0OHA5YThzOGU4cy4KKy5hdHBhczFlNHMKKy5hdThzOXQ4cjhhOGw5YThzOGk4YThuLgorLmEydXMKKy5hdXMxdDRyCisuYXVzMXRyYQorLmF1c3RyYWxhczJpMWEKKy5hdXN0cmFsYXNpMmEybgorLmF1OHQ4bzltOGE4dDhpOXM4aThlOHI5dDhlOHIuCisuYXV0b21hM3RpcworLmF1dG9tYXRpczJpZTQKKy5hdXRvbWF0aXNpZXJ0M2VyCisuYmU5ZDhpOGU5bjh1OG44Zy4KKy40YmUyZAorLmI0ZTNkaQorLmJlNWRpM2VuCisuYmVkMmllNAorLmJlZGllM251NG4KKy5iZThtOGI4by4KKy40YmU1bQorLmJlNG01YgorLmJpOGI5bDhpOW85ZzhyOGE5cDhoOGk5czhjOGg4ZS4KKy5iaWJsaW9ncjRhcGhpCisuYmlibGlvZ3JhcGgyaXMxYworLmJpYmxpb2dyYXBoaXMzY2gyCisuYmlibGlvZ3JhcGhpc2NoZTIKKy5ibzhzOXQ4bzhuLgorLjVib3M0CisuYm9zMXRvCisuYm9zdG8ybgorLmJyOG84dzhuOWk4YThuLgorLmJyb3duNWkKKy5icm93M240aTFhCisuYnJvd25pM2EybgorLmJyOHU4bjhzOXc4aThjOGsuCisuYnJ1Mm4KKy5icnUybjNzNAorLmJydW40c3cyCisuYnJ1bnN3aTIKKy5icnVuc3dpY2sxCisuYnU5ZDhhOXA4ZThzOHQuCisuYnUxZDJhCisuY2E4cjlpOGI5YjhlOGE4bi4KKy5jYXIxaQorLmNhcjRpYgorLmNhcmkyYjFiCisuY2FyaWIyYmUKKy5jYXJpYmJlYTJuCisuY2g4YThyOGw4ZThzOXQ4bzhuLgorLmNoYXI0bGU0CisuY2hhcjFsCisuY2hhcmxlczIKKy5jaGFybDRlczJ0bworLmNoYXJsZTNzdG8ybgorLmNoOGE4cjlsOG84dDh0OGU4czl2OGk4bDhsOGUuCisuY2hhcjNsbzQKKy5jaGFybG80dDN0MgorLmNoYXJsb3Q0dGVzCisuY2hhcmxvdHRlNHN2CisuY2hhcmxvdHRlczJ2aWwKKy5jaGFybG90dGVzdmlsMWwKKy5jaGFybG90dGVzdmlsMmxlCisuY285bDh1OG05YjhpOGEuCisuY29sdW00YmkKKy5jb2x1NG0xYgorLmNvbHVtYjJpMWEKKy5jejhlOGM4aDhvOXM4bDhvOXY4YTlrOGk4YS4KKy5jMnplNAorLmN6ZTJjaAorLmN6ZTNjaG8yCisuY3plY2hvczRsMgorLmN6ZWNob3M0bG92CisuY3plY2hvc2xvMXZhCisuY3plY2hvc2xvdmFrMWkKKy5jemVjaG9zbG92YWsyaTFhCisuZGU4bDlhOXc4YThyOGUuCisuZGUxbGEKKy5kZTRsYXcKKy5kZWxhdzJhMnIKKy5kaThqOGs5czh0OHI4YS4KKy5kaTNqCisuZGlqNGsxczIKKy5kaWprc3Q0cgorLmRpamtzMXRyYQorLmR1OGE4bjhlLgorLmQxdTFhCisuZHVhMm4KKy5keTluOGE5bThpOXM4YzhoOGUuCisuNWR5bgorLmR5MW5hCisuZHluYW0yaXMKKy5keW5hbTJpczFjCisuZHluYW1pczNjaDIKKy5keW5hbWlzY2hlMgorLmVuOGc5bDhpOHM4aC4KKy5lbmdsMgorLmVuZ2xpczJoCisuZXU4bDhlOHI5aThhOG4uCisuZXVsNGUKKy5ldTNsNGVyMWkKKy5ldWxlMXIyaTNhNAorLmV1bGVyaTJhMm4KKy5ldjhhOG45czh0OG84bi4KKy5lMXZhCisuZXZhMm4KKy5ldmFuNHN0CisuZXZhMm4xczIKKy5ldmFuczF0bworLmV2YW5zdG8ybgorLmZlOGI5cjh1OWE4cjh5LgorLmYyZTRiCisuZmUzYnIKKy5mZWJydTNhCisuZmVicnUyYTJyCisuZmU4czh0OXM4YzhoOHI4aThmOHQuCisuZmVzNHQxczIKKy5mZXN0NHNjCisuZmVzdHMyY2gyCisuZmVzdHNjNGhyNAorLmZlc3RzY2hyNGkyZnQKKy5mbDhvOHI5aTlkOGEuCisuZmxvcjJpZAorLmZsb3JpMWQyYQorLmZsOG84cjlpOWQ5aThhOG4uCisuZmxvcmkyZGkKKy5mbG9yaWQ1aTJhMm4KKy5mbG9yaTFkNGkzYQorLmZvOHI5czhjOGg4dThuOGc4czlpOG45czh0OGk5dDh1OHQuCisuZm9yczRjCisuZm9yczJjaDIKKy5mb3JzY2h1bmdzMgorLmZvcnNjaHVuZzJzMWluCisuZm9yc2NodW5nczJpMm4xczIKKy5mb3JzY2h1bmdzaW5zdDJpCisuZm9yc2NodW5nc2luc3RpMXR1CisuZnI4ZThlOWI4czhkLgorLmZyZTJlMWIKKy5mcmVlMmI1czIKKy5mcmVlYjRzNWQKKy5mdThuOGs5dDhzOGk4bzhuOGE4bC4KKy4zZnUKKy5mdTRuazIKKy5mdW5rNXQKKy5mdW5rNHQxczIKKy5mdW5rdDFzMmlvCisuZnVua3Q1c2lvMm4KKy5mdW5rdHNpbzFuNWEKKy5nYTh1OHM4czlpOGE4bi4KKy5nYTJ1cworLmdhdTJzcworLmdhdXMxc2kKKy5nYXVzczJpMWEKKy5nYXVzc2kyYTJuCisuZ2g4bzhzOHQ5czhjOHI4aThwOHQuCisuZ2hvczR0MXMyCisuZ2hvc3Q0c2MKKy5naG9zdHNjcmkyCisuZ2hvc3RzY3IyaXAKKy5naG9zdHNjcmkycDF0CisuZ2g4bzhzOHQ5djhpOGU4dy4KKy5naG9zNHR2CisuZ2hvc3R2MmllNAorLmdyOGE4czhzOW04YThuOG45aThhOG4uCisuZ3IyYXMKKy5ncmEyc3MKKy5ncmFzMnMxbQorLmdyYXNzM21hCisuZ3Jhc3NtYTJuMworLmdyYXNzbWE0bjFuMgorLmdyYXNzbWFuM240aTFhCisuZ3Jhc3NtYTJubmkzYTJuCisuZ3I4ZThpOGY4czl3OGE4bDhkLgorLmdyZWkyCisuZ3JlaTJmM3MKKy5ncmVpZnN3MgorLmdyZWlmc3dhMmxkCisuZ3I4bzh0OGg4ZThuOWQ4aThlOGM4ay4KKy5nNHJvCisuZ3JvNHRoMmUKKy5ncjRvdGgKKy5ncm90aGUybgorLmdyb3RoZW5kMmllNAorLmdyb3RoZW5kaWVjazEKKy5ncjh1OG44ZDlsOGU4aDlyOGU4bi4KKy5ncnUybgorLmdydW5kbGUxaDQKKy5ncnVuZGxlNGhyNAorLmhhOWQ4YTltOGE4cjhkLgorLmhhMmQKKy5oYTFkMmEKKy5oYWRhMm0yCisuaGFkNGExbWEKKy5oYWRhbTJhMnIKKy5oYThpOWY4YS4KKy5oYWkxZmEKKy5oYThtOGk4bDl0OG84bjlpOGE4bi4KKy5oYTRtCisuaGFtaTRsdAorLmhhbWlsMXRvCisuaGFtaWx0bzJuCisuaGFtaWx0bzNuNGkxYQorLmhhbWlsdG9uaTNhMm4KKy5oZThsOXM4aThuOGs4aS4KKy5oZTJsMXMyCisuaGVsMnMxaW4KKy5oZWxzNGk0bmsyCisuaGVsc2luazFpCisuaGU4cjltOGk4dDlpOGE4bi4KKy5oZXIzbWl0CisuaGVybWkxdGkKKy5oZXJtNGkxdDJpMWEKKy5oZXJtaXRpMmEybgorLmhpOGI4YjhzLgorLmhpMmIxYgorLmhpYjJiNXMyCisuaG84azlrOGE4aTlkOG8uCisuaDJvaworLmhva2s0CisuaG9ra2FpMgorLmhva2thMmlkCisuaG9ra2FpMWRvCisuamE4YzlrOG84dzlzOGs4aS4KKy41amEKKy5qYWNrMQorLmphY2tvd3NrMgorLmphY2tvd3NrMWkKKy5qYThuOXU5YThyOHkuCisuamEybgorLmphbjN1MWEKKy5qYW51MmEycgorLmphOXA4YTluOGU4czhlLgorLmphNHAKKy5qYTFwYQorLmphcGEybgorLmphcGExbmVzCisuamFwYW5lMXMyZQorLmthOGQ5bzhtOXQ4czhlOHYuCisua2EyZAorLmthMWRvCisua2FkbzRtdAorLmthZG9tNHQxczIKKy5rYWRvbXQ1c2V2Cisua2E4bjlzOGE4cy4KKy5rYTJuCisua2FuMnNhMgorLmthMm4xczIKKy5rYThyOGw4czlyOHU4aDhlLgorLmsyYTJyCisua2FyMWwKKy5rYXIybDFzMgorLmthcmxzMXIKKy5rbzhyOXQ4ZTl3OGU4Zy4KKy5rbzVyCisua3I4aThzOGg4bjhhLgorLmtyMmlzCisua3IzaXMyaAorLmtyaXMyaDFuCisua3Jpc2gxbmEKKy5rcjhpOHM4aDluOGE5aThzOG0uCisua3Jpc2huYWkyCisua3Jpc2huYWkyczFtCisua3I4aThzOGg5bjhhOG4uCisua3Jpc2huMmEybgorLmxhOG45YzhhOHM5dDhlOHIuCisubGFuMWNhCisubGFuY2FzdDVlcgorLmxlOWc4ZThuOGQ4cjhlLgorLmxlMWdlbgorLmxlZ2VuMWRyCisubGVnZW5kcmU0CisubGU4aThjOGU4czl0OGU4ci4KKy5sZWkyCisubGU1aWMKKy5sZWljZXM1dAorLmxpOHA5czhjOGg4aTh0OHouCisubDJpcAorLmxpMnAxczIKKy5saXBzMmNoMgorLmxpcHMzY2hpdAorLmxpcHNjaGk0dHoKKy5saThwOXM4YzhoOGk4dDh6OWk4YThuLgorLmxpcHNjaGl0MnoxaQorLmxpcHNjaGl0ejJpMWEKKy5saXBzY2hpdHppMmEybgorLmxvOGo5YjhhOG4uCisubG81agorLmxvamJhMm4KKy5sbzh1OWk5czhpOWE4bjhhLgorLmxvdTIKKy5sbzJ1aTIKKy5sb3VpczJpMWEKKy5sb3Vpc2kyYTJuCisubG91aXNpYTFuYQorLm1hOGM5bzhzLgorLm1hMWNvCisubWE4bjljOGg4ZThzOXQ4ZThyLgorLm1hbjJjaAorLm1hbmNoZTIKKy5tYW5jaDFlcworLm1hOHI5azhvOHY5aThhOG4uCisubWFya281dmkyYTJuCisubWFya292MmkxYQorLm1hOHI4azh0OW84YjhlOHI5ZDhvOHI4Zi4KKy5tYXJrNXQKKy5tYXJrMXRvCisubWFya3RvM2IKKy5tYXJrdG9iZXIxZG8KKy5tYXJrdG9iZXJkNG9yCisubWFya3RvYmVyZG9yMWYKKy5tYThzOHM5YTljOGg4dTlzOGU4dDh0OHMuCisubWEyc3MKKy5tYXMxc2EyCisubWFzc2EyY2gKKy5tYXNzYWNoMnVzCisubWFzc2FjaHVzZTR0M3QyCisubWFzc2FjaHVzZXQ0dDFzMgorLm1hOHg5dzhlOGw4bC4KKy5tYXh3ZWw0bAorLm1pOWM4cjhvOXM4bzhmOHQuCisubWljcm8yc28KKy5taWNyb3NvMmZ0MworLm1pOG45bjhlOWE4cDlvOWw4aThzLgorLm0yaTRuMW4yCisubWlubmU0CisubWlubmVhcG9sMmkKKy5taThuOW44ZTlzOG84dDhhLgorLm1pbjFuZXMKKy5taW5uZTFzbworLm1pbm5lc28xdGEKKy5tbzhzOWM4bzh3LgorLm1vczJjCisubW9zMWNvCisubmE4YzhoOXI4aThjOGg4dDhlOG4uCisuMW5hCisubmEyY2gKKy5uYWM0aHI0CisubmEyY2hyNGkyY2gKKy5uYWNocmljaHQxZW4KKy5uYThzOGg5djhpOGw4bDhlLgorLm40YXMKKy5uYXMyaAorLm5hc2gydmlsCisubmFzaHZpbDFsCisubmFzaHZpbDJsZQorLm5lOHQ5YjhzOGQuCisubmUydDFiCisubmV0MmI1czIKKy5uZXRiNHM1ZAorLm5lOHQ5czhjOGE4cDhlLgorLm5lNHQxczIKKy5uZXQ0c2MKKy5uZXRzY2E0cAorLm5ldHMxY2EKKy5uaThqOW04ZTlnOGU4bi4KKy5uaTNqCisubmlqbWUyZworLm5pam1lMWdlbgorLm5vOGU5dDhoOGU4cjlpOGE4bi4KKy4zbm9lCisubm9ldGgyZQorLm5vZXRoZXIxaQorLm5vZXRoZTFyMmkzYTQKKy5ub2V0aGVyaTJhMm4KKy5ubzhvOHI4ZDl3OGk4ajhrOGU4cjloOG84dTh0LgorLm5vbzIKKy5ubzNvcmQKKy5ub29yZDF3Cisubm9vcmR3aTIKKy5ub29yZHdpM2oKKy5ub29yZHdpamsxZXIKKy5ub29yZHdpamtlcjFoNAorLm5vb3Jkd2lqa2VyaG91MgorLm5vOXY4ZThtOWI4ZThyLgorLm5vdmU0bTViCisub3A4ZThuOWI4czhkLgorLm9wZTRuMWI0Cisub3BlbjJiNXMyCisub3BlbmI0czVkCisub3A4ZThuOW84ZjhmOGk4YzhlLgorLm9wNGVubworLm9wZW5vNGYxZgorLm9wZW5vZjFmaQorLnBhOGw4YTl0OGk4bjhvLgorLnBhbGEydDFpbgorLnBhbGF0Mmkxbm8KKy5wYTlsOGU4cjltOG8uCisucGFsZXIzbTQKKy5wYWxlcjFtbworLnBlOXQ4cjhvOHY5czhrOGkuCisucGV0cm8zdgorLnBldHJvdnNrMgorLnBldHJvdnNrMWkKKy5wZjhhOGY4ZjlpOGE4bi4KKy40cGYKKy5wMWZhCisucGZhMmYKKy5wZmE0ZjFmNAorLnBmYWYxZmkKKy5wZmFmZjJpM2EKKy5wZmFmZmkyYTJuCisucGg4aThsOWE5ZDhlOGw5cDhoOGk4YS4KKy5waGk0bDRhZGUKKy5waGlsYTJkCisucGhpbGFkZTJscAorLnBoaWxhZGVsNXBoaQorLnBoaWxhZGVscGgyaTFhCisucGg4aThsOW85czhvOHA4aDlpOXM4YzhoOGUuCisucGhpbG8yc28KKy5waGlsb3M0b3AKKy5waGlsb3Myb3BoCisucGhpbG9zb3BoMmlzMWMKKy5waGlsb3NvcGhpczNjaDIKKy5waGlsb3NvcGhpc2NoZTIKKy5wbzhpOG45YzhhOHI4ZS4KKy5wb2luMgorLnBvaTIKKy5wb2luYzJhMnI1CisucG9pbjFjYQorLnBvOXQ4ZThuOXQ4aThhOGw5ZzhsOGU4aTljOGg4dThuOGcuCisucDRvdAorLnBvMXRlbjF0CisucG90ZW50MmkKKy5wb3RlbjF0MmkxYQorLnBvdGVudGkyYWwKKy5wb3RlbnRpYTRsMWc0CisucG90ZW50aWFsZ2wyCisucG90ZW50aWFsMWdsZQorLnBvdGVudGlhbGdsZWkyCisucG90ZW50aWFsZ2xlNWljCisucG90ZW50aWFsZ2xlNGkyY2gKKy5yYTlkOGg4YTlrOHI4aThzOGg5bjhhOG4uCisucmFkMWgyCisucmFkaGFrcjJpcworLnJhZGhha3IzaXMyaAorLnJhZGhha3JpczJoMW4KKy5yYWRoYWtyaXNoMW5hCisucmFkaGFrcmlzaG4yYTJuCisucmE4dDhoOHM5azhlOGw5bDhlOHIuCisucjRhdGgKKy5yYTJ0NGgxczIKKy5yYXRoc2syCisucmF0aDRza2UKKy5yYXRoc2tlbDFsCisucmF0aHNrZWwybGUKKy5yaThlOW04YThuOG45aThhOG4uCisucjJpZTQKKy5yaWU1bWEybgorLnJpZTFtYQorLnJpZW1hNG4xbjIKKy5yaWVtYW4zbjRpMWEKKy5yaWVtYTJubmkzYTJuCisucnk4ZDliOGU4cjhnLgorLnJ5MWQKKy5yeWQxYgorLnJ5ZGJlcmcyCisuc2M4aDhvOHQ5dDhpOHM4YzhoOGUuCisuc2NobzR0M3QyCisuc2Nob3R0MmlzMWMKKy5zMmNoMm90dGlzM2NoMgorLnNjaG90dGlzY2hlMgorLnNjOGg4cjhvOWQ4aThuOGc5ZThyLgorLnNjNGhyNAorLnNjaHJvZDFpbgorLnNjaHJvZDRpbmdlCisuc2M4aDh3OGE5YjhhOWM4aDhlOHIuCisuc2NoMXcKKy5zY2h3YWJhMmNoCisuc2Nod2FiYWNoZTIKKy5zYzhoOHc4YThyOHo5czhjOGg4aThsOGQuCisuc2NodzJhMnIKKy5zMmNod2FyenMyY2gyCisuc2Nod2FyenNjaDRpbDIKKy5zY2h3YXJ6c2NoaTJsZAorLnNlOHA5dDhlOG05YjhlOHIuCisuc2UycDF0Cisuc2VwMnRlCisuc2VwdGU0bTViCisuc3Q4bzhrOGU4czlzOGM4aDhlLgorLnN0Mm9rCisuc3Rva2VzNAorLnN0b2syZTJzcworLnN0b2tlczJzNWMKKy5zdG9rZXNzMmNoMgorLnN0b2tlc3NjaGUyCisuc3Q4dTh0OHQ5ZzhhOHI4dC4KKy5zdHU0dDN0MgorLnN0dXQ0dDFnCisuc3R1dHQxZ2EKKy5zdHV0dGcyYTJyCisuc3U4czlxOHU4ZTloOGE4bjluOGEuCisuczJ1cworLnN1c3F1MgorLnN1c3F1ZTFoNAorLnN1c3F1ZWhhMm4KKy5zdXNxdWVoYTRuMW4yCisuc3VzcXVlaGFuMW5hCisudGE4dTliOGU4cjlpOGE4bi4KKy50YXU0YgorLnRhdWI0ZQorLnRhdTNiZXIKKy50YXViZXIxaQorLnRhdWJlMXIyaTNhNAorLnRhdWJlcmkyYTJuCisudGU4YzhoOW44aTlzOGM4aDhlLgorLnRlMmNoCisudGVjMmgxbgorLnRlY2huMmlzMWMKKy50ZTJjaG5pczNjaDIKKy50ZWNobmlzY2hlMgorLnRlOG45bjhlOHM5czhlOGUuCisudDRlNG4xbjIKKy50ZW5uZTQKKy50ZW4xbmVzCisudGVubjJlMnNzCisudG85bThhOXM4ejhlOHc5czhrOGkuCisudG8ybWEKKy50b21hczJ6ZQorLnRvbWFzemV3c2syCisudG9tYXN6ZXdzazFpCisudHk5cDhvOWc4cjhhOHA4aDhpOHE4dThlLgorLnR5M3BvCisudHk1cG80ZworLnR5cG8xZ3IKKy50eXBvZ3I0YXBoaQorLnR5cG9ncmFwaGlxdTIKKy51azhyOGE4aThuOWk4YThuLgorLjR1aworLnVrcjJhaTIKKy51a3JhNGk0bgorLnVrcmEyaW5pCisudWtyYWk0bjRpMWEKKy51a3JhaW5pM2EybgorLnZlOHI5YThsOGw5ZzhlOW04ZThpOG45ZThyOHQ4ZS4KKy52ZXJhbDFsCisudmVyYWw0bDFnNAorLnZlcmFsbGdlMW1lCisudmVyYWxsZ2VtZWkyCisudmVyYWxsZ2VtZTJpbmUKKy52ZXJhbGxnZW1laW4xZXIKKy52ZThyOWU4aThuOWk5Zzh1OG44Zy4KKy52ZXJlM2luCisudmVyZWkyCisudmVyZTJpbmkKKy52ZXJlaW4yaWcKKy52ZXJlaW5pM2d1bgorLnZlOHI5dDhlOGk5bDh1OG45ZzhlOG4uCisudmVydGVpMgorLnZlcnRlaWx1bjFnZW4KKy52aThpOGk4dDhoLgorLnY0aTVpNAorLnZpNGk1aTQKKy52aWkyaXRoCisudmk4aTh0OGguCisudmkyaXRoCisud2E4aDhyOXM4YzhoOGU4aThuOWw4aThjOGg5azhlOGk4dDhzOXQ4aDhlOG85cjhpOGUuCisud2E0aHI0Cisud2FoNHJzMgorLndhaHJzNGMKKy53YWhyczJjaDIKKy53YWhyc2NoZTIKKy53YWhyc2NoZWkyCisud2FocnNjaGU0aTRuMWwKKy53YWhyczJjaGVpbmw0aTJjaAorLndhaHJzY2hlaW5saWM0aGsKKy53YWhyc2NoZWlubGljaGtlaTIKKy53YWhyc2NoZWlubGljaGtlaTR0MXMyCisud2FocnNjaGVpbmxpY2hrZWl0czN0aDJlCisud2FocnNjaGVpbmxpY2hrZWl0c3RoZTFvNXIKKy53YWhyc2NoZWlubGljaGtlaXRzdGhlb3IyaWU0Cisud2U4cjluOGU4ci4KKy53MWVyCisud2VyNG4xZXIKKy53ZThyOXQ4aDhlOHI5aThhOG4uCisud2VydGgyZQorLndlcnRoZXIxaQorLndlcnRoZTFyMmkzYTQKKy53ZXJ0aGVyaTJhMm4KKy53aThuOWM4aDhlOHM5dDhlOHIuCisud2luMmNoCisud2luY2hlMgorLndpbmNoMWVzCisud2k4cjh0OXM4YzhoOGE4Zjh0LgorLnc0aXI0Cisud2lyNHQxczIKKy53aXJ0NHNjCisud2lydHMyY2gyCisud2lydHNjaGEyZgorLndpcnRzY2hhMmZ0Cisud2k4czlzOGU4bjlzOGM4aDhhOGY4dDlsOGk4YzhoLgorLnc0aTJzMXMKKy53aXNzZW40Cisud2lzc2UybjFzMgorLndpc3NlbnM0YworLndpc3NlbnMyY2gyCisud2lzc2Vuc2NoYTJmCisud2lzc2Vuc2NoYTJmdAorLndpc3NlbnNjaGFmMnRsCisud2lzc2VuczJjaGFmdGw0aTJjaAorLnh2OGk4aThpOHQ4aC4KKy54djRpNWk0CisueHZpNGk1aTQKKy54dmlpMml0aAorLnh2OGk4aTh0OGguCisueHZpMml0aAorLnh4OGk4aThpOHI4ZC4KKy54eDQKKy54eDNpCisueHg0aTVpNAorLnh4aTRpNWk0CisueHhpaTRpcgorLnh4OGk4aThuOGQuCisueHhpNGluZAorLnlpOG44Zzl5OG84bjhnLgorLnkxaQorLnlpbjJneQorLnlpbmd5MW80CisueWluZ3lvMm4KKy5zaDh1OXg4dThlLgorLnNodXgxdTMKKy5qaTlzOHU4YThuLgorLmppMnN1CisuamlzdWEybgorLnplOGE5bDhhOG44ZC4KKy4yemUKKy56ZWE0bAorLnplYTNsNGFuZAorLnplYWxhMm4KKy56ZThpOHQ5czhjOGg4cjhpOGY4dC4KKy56ZWkyCisuemVpNHQxczIKKy56ZWl0NHNjCisuemVpdHMyY2gyCisuemVpdHNjNGhyNAorLnplaXRzY2hyNGkyZnQKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaW5jb2duaXRvX21vZGVfc3RhcnRfcGFnZS5odG1sIGIvY29yZS9yZXMvYXNzZXRzL3dlYmtpdC9pbmNvZ25pdG9fbW9kZV9zdGFydF9wYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3MGM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaW5jb2duaXRvX21vZGVfc3RhcnRfcGFnZS5odG1sCkBAIC0wLDAgKzEsMjQgQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIvPgorICAgIDx0aXRsZT5OZXcgaW5jb2duaXRvIHdpbmRvdzwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+PHN0cm9uZz5Zb3UndmUgZ29uZSBpbmNvZ25pdG88L3N0cm9uZz4uIFBhZ2VzIHlvdSB2aWV3IGluIHRoaXMgd2luZG93CisgICAgICB3b24ndCBhcHBlYXIgaW4geW91ciBicm93c2VyIGhpc3Rvcnkgb3Igc2VhcmNoIGhpc3RvcnksIGFuZCB0aGV5IHdvbid0CisgICAgICBsZWF2ZSBvdGhlciB0cmFjZXMsIGxpa2UgY29va2llcywgb24geW91ciBjb21wdXRlciBhZnRlciB5b3UgY2xvc2UgdGhlCisgICAgICBpbmNvZ25pdG8gd2luZG93LiBBbnkgZmlsZXMgeW91IGRvd25sb2FkIG9yIGJvb2ttYXJrcyB5b3UgY3JlYXRlIHdpbGwgYmUKKyAgICAgIHByZXNlcnZlZCwgaG93ZXZlci48L3A+CisKKyAgICA8cD48c3Ryb25nPkdvaW5nIGluY29nbml0byBkb2Vzbid0IGFmZmVjdCB0aGUgYmVoYXZpb3Igb2Ygb3RoZXIgcGVvcGxlLAorCXNlcnZlcnMsIG9yIHNvZnR3YXJlLiBCZSB3YXJ5IG9mOjwvc3Ryb25nPjwvcD4KKworICAgIDx1bD4KKyAgICAgIDxsaT5XZWJzaXRlcyB0aGF0IGNvbGxlY3Qgb3Igc2hhcmUgaW5mb3JtYXRpb24gYWJvdXQgeW91PC9saT4KKyAgICAgIDxsaT5JbnRlcm5ldCBzZXJ2aWNlIHByb3ZpZGVycyBvciBlbXBsb3llcnMgdGhhdCB0cmFjayB0aGUgcGFnZXMgeW91IHZpc2l0PC9saT4KKyAgICAgIDxsaT5NYWxpY2lvdXMgc29mdHdhcmUgdGhhdCB0cmFja3MgeW91ciBrZXlzdHJva2VzIGluIGV4Y2hhbmdlIGZvciBmcmVlIHNtaWxleXM8L2xpPgorICAgICAgPGxpPlN1cnZlaWxsYW5jZSBieSBzZWNyZXQgYWdlbnRzPC9saT4KKyAgICAgIDxsaT5QZW9wbGUgc3RhbmRpbmcgYmVoaW5kIHlvdTwvbGk+CisgICAgPC91bD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vYW5pbWF0b3JfZmFkZV9pbi54bWwgYi9jb3JlL3Jlcy9yZXMvYW5pbS9hbmltYXRvcl9mYWRlX2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDUwNDJmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vYW5pbWF0b3JfZmFkZV9pbi54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8cHJvcGVydHkgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9hY2NlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMCIKKyAgICBhbmRyb2lkOnZhbHVlVG89IjEiCisgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9ImFscGhhIgorICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIgorLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9hbmltL2FuaW1hdG9yX2ZhZGVfb3V0LnhtbCBiL2NvcmUvcmVzL3Jlcy9hbmltL2FuaW1hdG9yX2ZhZGVfb3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmI1ZDljCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vYW5pbWF0b3JfZmFkZV9vdXQueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPHByb3BlcnR5IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vYWNjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgYW5kcm9pZDp2YWx1ZUZyb209IjEuMCIKKyAgICBhbmRyb2lkOnZhbHVlVG89IjAuMCIKKyAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0iYWxwaGEiCisgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiCisvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfY2xvc2VfZW50ZXIueG1sIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfY2xvc2VfZW50ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MDkxZTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9jbG9zZV9lbnRlci54bWwKQEAgLTAsMCArMSw0OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHNlcXVlbmNlciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxwcm9wZXJ0eQorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vZGVjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIyIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJzY2FsZVgiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPHByb3BlcnR5CisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9kZWNlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjIiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InNjYWxlWSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8cHJvcGVydHkKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2RlY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0iYWxwaGEiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPHByb3BlcnR5CisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9kZWNlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209Ii00MDAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InRyYW5zbGF0aW9uWCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKzwvc2VxdWVuY2VyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X2Nsb3NlX2V4aXQueG1sIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfY2xvc2VfZXhpdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UyY2QyMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X2Nsb3NlX2V4aXQueG1sCkBAIC0wLDAgKzEsNDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxzZXF1ZW5jZXIgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8cHJvcGVydHkKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2FjY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIuNSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InNjYWxlWCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8cHJvcGVydHkKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2FjY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIuNSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InNjYWxlWSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8cHJvcGVydHkKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2FjY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0iYWxwaGEiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPHByb3BlcnR5CisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9hY2NlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iNDAwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0idHJhbnNsYXRpb25YIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorPC9zZXF1ZW5jZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfb3Blbl9lbnRlci54bWwgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9vcGVuX2VudGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODkwMDFjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfb3Blbl9lbnRlci54bWwKQEAgLTAsMCArMSw0NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHNlcXVlbmNlciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxwcm9wZXJ0eQorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vZGVjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIyIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJzY2FsZVgiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPHByb3BlcnR5CisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9kZWNlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjIiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InNjYWxlWSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8cHJvcGVydHkKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9ImFscGhhIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorICAgIDxwcm9wZXJ0eQorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iNDAwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJ0cmFuc2xhdGlvblgiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+Cis8L3NlcXVlbmNlcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9vcGVuX2V4aXQueG1sIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfb3Blbl9leGl0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjdmZTRmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfb3Blbl9leGl0LnhtbApAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8c2VxdWVuY2VyIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPHByb3BlcnR5CisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9hY2NlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMiIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InNjYWxlWCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8cHJvcGVydHkKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2FjY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIyIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0ic2NhbGVZIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorICAgIDxwcm9wZXJ0eQorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0iYWxwaGEiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPHByb3BlcnR5CisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89Ii00MDAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJ0cmFuc2xhdGlvblgiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+Cis8L3NlcXVlbmNlcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvYW5pbS9wdXNoX2Rvd25faW5fbm9fYWxwaGEueG1sIGIvY29yZS9yZXMvcmVzL2FuaW0vcHVzaF9kb3duX2luX25vX2FscGhhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDVkNjkxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vcHVzaF9kb3duX2luX25vX2FscGhhLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisJPHRyYW5zbGF0ZSBhbmRyb2lkOmZyb21ZRGVsdGE9Ii0xMDAlcCIgYW5kcm9pZDp0b1lEZWx0YT0iMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX2xvbmdBbmltVGltZSIvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvYW5pbS9wdXNoX2Rvd25fb3V0X25vX2FscGhhLnhtbCBiL2NvcmUvcmVzL3Jlcy9hbmltL3B1c2hfZG93bl9vdXRfbm9fYWxwaGEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMjQ3NGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvYW5pbS9wdXNoX2Rvd25fb3V0X25vX2FscGhhLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisJPHRyYW5zbGF0ZSBhbmRyb2lkOmZyb21ZRGVsdGE9IjAiIGFuZHJvaWQ6dG9ZRGVsdGE9IjEwMCVwIgorICAgICAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbG9uZ0FuaW1UaW1lIi8+Cis8L3NldD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1lbi1oZHBpL3N5bV9rZXlib2FyZF9mZWVkYmFja19kZWxldGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWVuLWhkcGkvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX2RlbGV0ZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhNzYzNzUuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWVuLWhkcGkvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX2RlbGV0ZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzJlMmI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGEwNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MmUyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwYTA0NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTExZTFhYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2EzYzU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZjQxODEyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNzU0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NGYxMDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg1MDZiZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MDU0NTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyNjhkNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwNTQ1OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTI2OGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25faG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTQxYzY3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OGM0YWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25faG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdlMzk1MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzI5ZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGJlYWM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZjQ1YzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMWM5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3YzhlNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTZlZjJiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MmJmMTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMWFlODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhiZDFkZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25faG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjBkYmU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YWUzNmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25faG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNhMGQ0OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTIyMzU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzA1ZjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExN2ZhMWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY29tYm9ib3hfZGlzYWJsZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY29tYm9ib3hfZGlzYWJsZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZWI0NWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jb21ib2JveF9kaXNhYmxlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY29tYm9ib3hfbm9oaWdobGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY29tYm9ib3hfbm9oaWdobGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNjAzMDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jb21ib2JveF9ub2hpZ2hsaWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQuOS5wbmcKaW5kZXggOTlhNjdiOS4uNDFiNzc2YiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodF9vcGFxdWUuOS5wbmcKaW5kZXggY2ZlMjU4Yi4uZWI3NWEyMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodF9vcGFxdWUuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodF9vcGFxdWUuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFyay45LnBuZwppbmRleCAzMzhkODQwLi41NWE1ZTUzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFyay45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcKaW5kZXggOTQ0NGYwZC4uNjBlMmNiMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGltX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGltX2RhcmsuOS5wbmcKaW5kZXggNjM4NTlmNy4uY2YzNDYxMyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RpbV9kYXJrLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kaW1fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0LjkucG5nCmluZGV4IDk5YTY3YjkuLjQxYjc3NmIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0X29wYXF1ZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0X29wYXF1ZS45LnBuZwppbmRleCA1YzUzN2VlLi5lYjc1YTIyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodF9vcGFxdWUuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHRfb3BhcXVlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfZGFyay45LnBuZwppbmRleCA3MDJiODc4Li41NWE1ZTUzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfZGFya19vcGFxdWUuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2Rhcmtfb3BhcXVlLjkucG5nCmluZGV4IDhmMzUzMTUuLjYwZTJjYjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfZGFya19vcGFxdWUuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrX29wYXF1ZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lbW9faW1fZW1iYXJyYXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZW1vX2ltX2VtYmFycmFzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjdkYWY3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZW1vX2ltX2VtYmFycmFzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19hZ2dyZWdhdGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2FnZ3JlZ2F0ZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2ExNWIxLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2FnZ3JlZ2F0ZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2JhY2sucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2JhY2sucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YjMyODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fYmFjay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX25leHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX25leHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYzZlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fbmV4dC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWM2MjQxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2U2OWYwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkLjkucG5nCmluZGV4IGM0MDIzM2UuLmFiMzc3ZDggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZGM5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGUxNmI5OS4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXMuOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYmI0NTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYmI0NTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX3NlbGVjdGVkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MjdkYTE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfc2VsZWN0ZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzcy45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3MuOS5wbmcKaW5kZXggMTY3NmNhNy4uYmQ3NDQyNiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzcy45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3NfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMmJhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKaW5kZXggYmE3OWNmNy4uZDE4ZDZmNyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDc4NmU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZjUwYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZWE4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcXVpY2tjb250YWN0X25vYmFkZ2UuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2NvbnRhY3Rfbm9iYWRnZS45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGQ0M2M0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcXVpY2tjb250YWN0X25vYmFkZ2UuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2JhY2tncm91bmRfbm9ybWFsLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCmluZGV4IGMwMWMwMTguLjgxMGM5NTAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3ltX2FjdGlvbl9jYWxsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N5bV9hY3Rpb25fY2FsbC5wbmcKaW5kZXggMTA1ZjdkMC4uZGE4YWZlZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3ltX2FjdGlvbl9jYWxsLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zeW1fYWN0aW9uX2NhbGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRfc2VsZWN0X2hhbmRsZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0X3NlbGVjdF9oYW5kbGUucG5nCmluZGV4IDgwZDQ4YWIuLjkzYTVhMTUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRfc2VsZWN0X2hhbmRsZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dF9zZWxlY3RfaGFuZGxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY3ZDA0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjkyZWJmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzk5ODJhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMjI0YjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmYxOGNjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NjQzODQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJmNTNjNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTQ5YjhkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmY1M2M1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNDliOGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbGFuZC1oZHBpL2ljX2pvZ19kaWFsX3NvdW5kX29mZi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbGFuZC1oZHBpL2ljX2pvZ19kaWFsX3NvdW5kX29mZi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3M2RiNDguLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF9zb3VuZF9vZmYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF9zb3VuZF9vbi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbGFuZC1oZHBpL2ljX2pvZ19kaWFsX3NvdW5kX29uLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTBkYTZlMy4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbGFuZC1oZHBpL2ljX2pvZ19kaWFsX3NvdW5kX29uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfdW5sb2NrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfdW5sb2NrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTlhZjFhZi4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbGFuZC1oZHBpL2ljX2pvZ19kaWFsX3VubG9jay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjAzZmIxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZTlmZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MDNmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllOWZmOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU0NGMyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjJlYzkyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMWJiMWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEwZWE0NDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMjhkZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlMTEzNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOTk3MmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlZjQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5OTcyYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2VmNDZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25faG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzBkNTYyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNzgwOGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25faG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3NTNmNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTRkZDJjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTg2ODgxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NzAxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YzFjNmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyODdmMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjUyMTdiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2M2I5YjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZjc1NzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3NTRlMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25faG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWQ3NDcxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYWFhNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25faG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmOTFjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDkzNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmY2ZjViCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZGQ4ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfZGlzYWJsZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfZGlzYWJsZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMmRiN2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jb21ib2JveF9kaXNhYmxlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfbm9oaWdobGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfbm9oaWdobGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NjMzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jb21ib2JveF9ub2hpZ2hsaWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQuOS5wbmcKaW5kZXggMzk1MjI3YS4uNDFiNzc2YiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodF9vcGFxdWUuOS5wbmcKaW5kZXggNWM1MzdlZS4uZWI3NWEyMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodF9vcGFxdWUuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodF9vcGFxdWUuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFyay45LnBuZwppbmRleCBiZjQ1ZTM4Li41NWE1ZTUzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFyay45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcKaW5kZXggOTQ0NGYwZC4uNjBlMmNiMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGltX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGltX2RhcmsuOS5wbmcKaW5kZXggMDg4MzhjYS4uY2YzNDYxMyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RpbV9kYXJrLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kaW1fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0LjkucG5nCmluZGV4IDM5NTIyN2EuLjQxYjc3NmIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0X29wYXF1ZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0X29wYXF1ZS45LnBuZwppbmRleCA1YzUzN2VlLi5lYjc1YTIyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodF9vcGFxdWUuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHRfb3BhcXVlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfZGFyay45LnBuZwppbmRleCA3MDJiODc4Li41NWE1ZTUzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfZGFya19vcGFxdWUuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2Rhcmtfb3BhcXVlLjkucG5nCmluZGV4IDhmMzUzMTUuLjYwZTJjYjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfZGFya19vcGFxdWUuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrX29wYXF1ZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZW1vX2ltX2VtYmFycmFzc2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2Vtb19pbV9lbWJhcnJhc3NlZC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvcmVzL3Jlcy9kcmF3YWJsZS9lbW9faW1fZW1iYXJyYXNzZWQucG5nCnJlbmFtZSB0byBjb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9lbW9faW1fZW1iYXJyYXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2FnZ3JlZ2F0ZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYWdncmVnYXRlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMmUyYjAuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYWdncmVnYXRlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fYmFjay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fYmFjay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliZmY0YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9iYWNrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fbmV4dC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fbmV4dC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzZjZjQzNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9uZXh0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYzcxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdF9saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0X2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZWRmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdF9saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQuOS5wbmcKaW5kZXggYmY5NzBiMC4uNjBmMTlmZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM5OTI2MTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2UyNDE1OC4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXMuOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMWYxOTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMWYxOTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX3NlbGVjdGVkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YjBjMWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9zZWxlY3RlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzcy45LnBuZwppbmRleCA1Y2JiMjUxLi43ODE3NjY3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3MuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzc19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3NfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ2ZmM2OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3NfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZwppbmRleCAwMmI0ZTlhLi4xNTMxZDlkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZF9saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZjZmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZF9saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhYzFlMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4NjE5NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZF9saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9xdWlja2NvbnRhY3Rfbm9iYWRnZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZTc0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9xdWlja2NvbnRhY3Rfbm9iYWRnZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKaW5kZXggYjhlMzk5ZC4uZjBlNGQwNiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9pdGVtX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlhMmNjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjAwM2NmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWM4MmRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOWIxMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDU5MjRjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZWUyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3YzI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWUwOWE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTdjMjRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTA5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2RlZmF1bHRfd2FsbHBhcGVyLmpwZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvZGVmYXVsdF93YWxscGFwZXIuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYjBhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2RlZmF1bHRfd2FsbHBhcGVyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9hbGFybS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9hbGFybS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2YTgyMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvaWNfbG9ja19pZGxlX2FsYXJtLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9jaGFyZ2luZy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9jaGFyZ2luZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlZjUzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvaWNfbG9ja19pZGxlX2NoYXJnaW5nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9sb2NrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvaWNfbG9ja19pZGxlX2xvY2sucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNWUyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9sb2NrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9sb3dfYmF0dGVyeS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9sb3dfYmF0dGVyeS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0OWI2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UvaWNfbG9ja19pZGxlX2xvd19iYXR0ZXJ5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9iYWNrZ3JvdW5kLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2JhY2tncm91bmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjlkN2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9iYWNrZ3JvdW5kLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8Z3JhZGllbnQKKyAgICAgICAgYW5kcm9pZDpzdGFydENvbG9yPSIjZmZkMWQyZDQiCisgICAgICAgIGFuZHJvaWQ6ZW5kQ29sb3I9IiNmZjg1ODc4YSIKKyAgICAgICAgYW5kcm9pZDphbmdsZT0iMjcwIiAvPgorPC9zaGFwZT4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2NvbnRleHRfYmFja2dyb3VuZC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9jb250ZXh0X2JhY2tncm91bmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ODk4OTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9jb250ZXh0X2JhY2tncm91bmQueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxncmFkaWVudAorICAgICAgICBhbmRyb2lkOnN0YXJ0Q29sb3I9IiNmZjAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpjZW50ZXJDb2xvcj0iI2ZmZDFkMmQ0IgorICAgICAgICBhbmRyb2lkOmVuZENvbG9yPSIjZmY4NTg3OGEiCisgICAgICAgIGFuZHJvaWQ6YW5nbGU9IjI3MCIgLz4KKzwvc2hhcGU+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9kaXZpZGVyLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2RpdmlkZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNDMwOWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9kaXZpZGVyLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8Z3JhZGllbnQKKyAgICAgICAgYW5kcm9pZDpzdGFydENvbG9yPSIjZmZlMWUyZTQiCisgICAgICAgIGFuZHJvaWQ6ZW5kQ29sb3I9IiNmZjk1OTc5YSIKKyAgICAgICAgYW5kcm9pZDphbmdsZT0iMjcwIiAvPgorPC9zaGFwZT4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fY2hlY2tfaG9sb19kYXJrLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fY2hlY2tfaG9sb19kYXJrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDg1ZDcyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9jaGVja19ob2xvX2RhcmsueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPCEtLSBFbmFibGVkIHN0YXRlcyAtLT4KKyAgICAgICAgCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX2hvbG9fZGFyayIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2RhcmsiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2hvbG9fZGFyayIgLz4KKworCisgICAgPCEtLSBEaXNhYmxlZCBzdGF0ZXMgLS0+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2RhcmsiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2RhcmsiIC8+CisKKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX2hvbG9fbGlnaHQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9jaGVja19ob2xvX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmIxNmZhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9jaGVja19ob2xvX2xpZ2h0LnhtbApAQCAtMCwwICsxLDY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDwhLS0gRW5hYmxlZCBzdGF0ZXMgLS0+CisgICAgICAgIAorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25faG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfaG9sb19saWdodCIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19saWdodCIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25faG9sb19saWdodCIgLz4KKworCisgICAgPCEtLSBEaXNhYmxlZCBzdGF0ZXMgLS0+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19saWdodCIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fbGlnaHQiIC8+CisKKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX3JhZGlvX2hvbG9fZGFyay54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX3JhZGlvX2hvbG9fZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4NGY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fcmFkaW9faG9sb19kYXJrLnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb25faG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb2ZmX2hvbG9fZGFyayIgLz4KKyAgICAgICAgICAKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fZGFyayIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29mZl9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX2hvbG9fZGFyayIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX3JhZGlvX2hvbG9fbGlnaHQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDE1MDhjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2xpZ2h0LnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb25faG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29mZl9ob2xvX2xpZ2h0IiAvPgorICAgICAgICAgIAorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29mZl9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vbl9ob2xvX2xpZ2h0IiAvPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9lZGdlX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9lZGdlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyNjg4MC4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRnZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fZGFyay54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkMjRmZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9lZGl0X3RleHRfaG9sb19kYXJrLnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fZGFyayIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9lZGl0X3RleHRfaG9sb19saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZTM5ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fbGlnaHQueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19saWdodCIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdGVkX2JhY2tncm91bmQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiNjU5NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdGVkX2JhY2tncm91bmQueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgICBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9zZWxlY3RlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIiAgYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkIiAvPgorCis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZF9saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3RlZF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWZjMWNiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZF9saWdodC54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX3NlbGVjdGVkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0iZmFsc2UiICBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWRfbGlnaHQiIC8+CisKKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmQueG1sCmluZGV4IGJjYTk5NmMuLjBhNTExNTIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmQueG1sCkBAIC0xNiwyMiArMTYsMTQgQEAKIAogPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CiAKLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGNvbG9yL3RyYW5zcGFyZW50IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOmRyYXdhYmxlPSJAY29sb3IvdHJhbnNwYXJlbnQiIC8+CiAKICAgICA8IS0tIEV2ZW4gdGhvdWdoIHRoZXNlIHR3byBwb2ludCB0byB0aGUgc2FtZSByZXNvdXJjZSwgaGF2ZSB0d28gc3RhdGVzIHNvIHRoZSBkcmF3YWJsZSB3aWxsIGludmFsaWRhdGUgaXRzZWxmIHdoZW4gY29taW5nIG91dCBvZiBwcmVzc2VkIHN0YXRlLiAtLT4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiCi0gICAgICAgIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiCi0gICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQiIC8+Ci0KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF90cmFuc2l0aW9uIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF90cmFuc2l0aW9uIiAvPgotCi0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzIiAvPgotCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZCIgLz4KKyAgICA8aXRlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdCIgLz4KKyAgICAKIDwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzk4MGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGNvbG9yL3RyYW5zcGFyZW50IiAvPgorCisgICAgPCEtLSBFdmVuIHRob3VnaCB0aGVzZSB0d28gcG9pbnQgdG8gdGhlIHNhbWUgcmVzb3VyY2UsIGhhdmUgdHdvIHN0YXRlcyBzbyB0aGUgZHJhd2FibGUgd2lsbCBpbnZhbGlkYXRlIGl0c2VsZiB3aGVuIGNvbWluZyBvdXQgb2YgcHJlc3NlZCBzdGF0ZS4gLS0+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbl9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbl9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9saWdodCIgLz4KKyAgICA8aXRlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdF9saWdodCIgLz4KKworPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbl9saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3RyYW5zaXRpb25fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNGY4OTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3RyYW5zaXRpb25fbGlnaHQueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8dHJhbnNpdGlvbiB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkX2xpZ2h0IiAgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzX2xpZ2h0IiAgLz4KKzwvdHJhbnNpdGlvbj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9vdmVyc2Nyb2xsX2dsb3cucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL292ZXJzY3JvbGxfZ2xvdy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMTgzMWUuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL292ZXJzY3JvbGxfZ2xvdy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2UueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyZmEwZS4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLS8qIGJ1YmJsZV93aXRoX2NoYXRzLnhtbAotKioKLSoqIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLS0tPgotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+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+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgID4KKyAgICAgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblZpZXcgYW5kcm9pZDppZD0iQCtpZC9sb2NrUGF0dGVybiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzNTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjM1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOTBkaXAiCisgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworPC9jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTGluZWFyTGF5b3V0V2l0aERlZmF1bHRUb3VjaFJlY2VwaWVudD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19wb3J0cmFpdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlZDc5YmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LnhtbApAQCAtMCwwICsxLDEwMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTGluZWFyTGF5b3V0V2l0aERlZmF1bHRUb3VjaFJlY2VwaWVudAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICA+CisKKyAgICA8IS0tIGxlZnQgc2lkZTogc3RhdHVzIGFuZCBlbWVyZ2VuY3kgY2FsbCBidXR0b24gLS0+CisgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgPgorICAgICAgICAKKyAgICAgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfcG9ydCIgLz4KKworICAgICAgICA8IS0tIGZvb3RlciAtLT4KKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxNDBkaXAiCisgICAgICAgICAgICA+CisKKyAgICAgICAgICAgIDwhLS0gb3B0aW9uIDE6IGEgc2luZ2xlIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiAtLT4KKyAgICAgICAgICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2Zvb3Rlck5vcm1hbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2VtZXJnZW5jeUNhbGxBbG9uZSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9sb2Nrc2NyZWVuX2VtZXJnZW5jeV9jYWxsIgorICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1dpZGdldC5CdXR0b24uVHJhbnNwYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvaWNfZW1lcmdlbmN5IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iOGRpcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICAgICAgPCEtLSBvcHRpb24gMjogYW4gZW1lcmdlbmN5IGNhbGwgYnV0dG9uLCBhbmQgYSAnZm9yZ290IHBhdHRlcm4/JyBidXR0b24gLS0+CisgICAgICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvZm9vdGVyRm9yZ290UGF0dGVybiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2ZvcmdvdFBhdHRlcm4iCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1dpZGdldC5CdXR0b24uVHJhbnNwYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2VtZXJnZW5jeUNhbGxUb2dldGhlciIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9sb2Nrc2NyZWVuX2VtZXJnZW5jeV9jYWxsIgorICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1dpZGdldC5CdXR0b24uVHJhbnNwYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvaWNfZW1lcmdlbmN5IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iOGRpcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8IS0tIHJpZ2h0IHNpZGU6IGxvY2sgcGF0dGVybiAtLT4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxvY2tQYXR0ZXJuVmlldyBhbmRyb2lkOmlkPSJAK2lkL2xvY2tQYXR0ZXJuIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjM1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzUwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI1MGRpcCIKKyAgICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCis8L2NvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5MaW5lYXJMYXlvdXRXaXRoRGVmYXVsdFRvdWNoUmVjZXBpZW50PgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zY3JlZW5fYWN0aW9uX2Jhci54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zY3JlZW5fYWN0aW9uX2Jhci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhNzMxODQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zY3JlZW5fYWN0aW9uX2Jhci54bWwKQEAgLTAsMCArMSw0NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLQorVGhpcyBpcyBhbiBvcHRpbWl6ZWQgbGF5b3V0IGZvciBhIHNjcmVlbiB3aXRoIHRoZSBBY3Rpb24gQmFyIGVuYWJsZWQuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpmaXRzU3lzdGVtV2luZG93cz0idHJ1ZSI+CisgICAgPFZpZXdBbmltYXRvciBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9iYXJfYW5pbWF0b3IiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmluQW5pbWF0aW9uPSJAYW5pbS9wdXNoX2Rvd25faW5fbm9fYWxwaGEiCisgICAgICAgIGFuZHJvaWQ6b3V0QW5pbWF0aW9uPSJAYW5pbS9wdXNoX2Rvd25fb3V0X25vX2FscGhhIj4KKyAgICAgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9iYXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci93aW5kb3dBY3Rpb25CYXJTdHlsZSIgLz4KKyAgICAgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJDb250ZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fY29udGV4dF9iYXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisgICAgPC9WaWV3QW5pbWF0b3I+CisgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmZvcmVncm91bmRHcmF2aXR5PSJmaWxsX2hvcml6b250YWx8dG9wIgorICAgICAgICBhbmRyb2lkOmZvcmVncm91bmQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3NjcmVlbl9hY3Rpb25fYmFyX292ZXJsYXkueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uvc2NyZWVuX2FjdGlvbl9iYXJfb3ZlcmxheS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzNWFjMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3NjcmVlbl9hY3Rpb25fYmFyX292ZXJsYXkueG1sCkBAIC0wLDAgKzEsNDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KK1RoaXMgaXMgYW4gb3B0aW1pemVkIGxheW91dCBmb3IgYSBzY3JlZW4gd2l0aAordGhlIEFjdGlvbiBCYXIgZW5hYmxlZCBvdmVybGF5aW5nIGFwcGxpY2F0aW9uIGNvbnRlbnQuCistLT4KKworPFJlbGF0aXZlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmZpdHNTeXN0ZW1XaW5kb3dzPSJ0cnVlIj4KKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiIC8+CisgICAgPFZpZXdBbmltYXRvciBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9iYXJfYW5pbWF0b3IiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InRvcCIKKyAgICAgICAgYW5kcm9pZDppbkFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX2luX25vX2FscGhhIgorICAgICAgICBhbmRyb2lkOm91dEFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYSI+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvd2luZG93QWN0aW9uQmFyU3R5bGUiIC8+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgIDwvVmlld0FuaW1hdG9yPgorICAgIDxJbWFnZVZpZXcgYW5kcm9pZDpzcmM9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiCisgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0WFkiCisgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2FjdGlvbl9iYXJfYW5pbWF0b3IiIC8+Cis8L1JlbGF0aXZlTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRfY29udGVudC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudF9jb250ZW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjRiOTBlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRfY29udGVudC54bWwKQEAgLTAsMCArMSw1NiBAQAorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI3ZHAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjVkcCIKKyAgICAgICAgPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIzZHAiCisgICAgICAgID4KKyAgICAgICAgPCEtLWNvbS5hbmRyb2lkLnNlcnZlci5zdGF0dXMuQW5pbWF0ZWRJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9pY29uIiAtLT4KKyAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL2ljb24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjVkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjVkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRDZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2Fycm93X2Rvd25fZmxvYXQiLz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkV2ZW50Q29udGVudC5UaXRsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICAgICAgYW5kcm9pZDpmYWRpbmdFZGdlPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNGRwIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICA+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkV2ZW50Q29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICAgICAgYW5kcm9pZDpmYWRpbmdFZGdlPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNGRwIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPGFuZHJvaWQud2lkZ2V0LkRhdGVUaW1lVmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpbWUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkV2ZW50Q29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjRkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI1ZHAiCisgICAgICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9iYXJfdGl0bGVfaXRlbS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9iYXJfdGl0bGVfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MwNDZmZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX2Jhcl90aXRsZV9pdGVtLnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgPgorICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9iYXJfdGl0bGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW1JbnZlcnNlIiAvPgorICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9iYXJfc3VidGl0bGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbEludmVyc2UiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21lbnVfaXRlbV9sYXlvdXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9pdGVtX2xheW91dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzY2NlNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21lbnVfaXRlbV9sYXlvdXQueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Y29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVJdGVtVmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgPgorICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2ltYWdlQnV0dG9uIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgICAgICBzdHlsZT0iP2F0dHIvYWN0aW9uQnV0dG9uU3R5bGUiIC8+CisgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3RleHRCdXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Cis8L2NvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51SXRlbVZpZXc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tZW51X2xheW91dC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tZW51X2xheW91dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkNTUzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21lbnVfbGF5b3V0LnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51VmlldworICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbW9kZV9iYXIueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbW9kZV9iYXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZjMyN2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tb2RlX2Jhci54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJDb250ZXh0VmlldworICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FsZXJ0X2RpYWxvZy54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FsZXJ0X2RpYWxvZy54bWwKaW5kZXggMjVhNDFmOC4uYjc0NmQyOCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9hbGVydF9kaWFsb2cueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWxlcnRfZGlhbG9nLnhtbApAQCAtODAsOCArODAsNyBAQAogICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIyZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIxMmRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE0ZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEwZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpvdmVyc2Nyb2xsTW9kZT0iaWZDb250ZW50U2Nyb2xscyI+CisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTBkaXAiPgogICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbWVzc2FnZSIKICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgpAQCAtMTEzLDcgKzExMiw3IEBACiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjRkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjJkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOnVzZUxhcmdlc3RDaGlsZD0idHJ1ZSI+CisgICAgICAgICAgICBhbmRyb2lkOm1lYXN1cmVXaXRoTGFyZ2VzdENoaWxkPSJ0cnVlIj4KICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9sZWZ0U3BhY2VyIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMC4yNSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvY29udGFjdF9oZWFkZXIueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9jb250YWN0X2hlYWRlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNDY3ZDMuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9jb250YWN0X2hlYWRlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDppZD0iQCtpZC9iYW5uZXIiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3RpdGxlX2Jhcl9tZWRpdW0iCi0gICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiPgotCi0gICAgPGFuZHJvaWQud2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlIGFuZHJvaWQ6aWQ9IkAraWQvcGhvdG8iCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9Ii0xZGlwIgotICAgICAgICBzdHlsZT0iQCphbmRyb2lkOnN0eWxlL1dpZGdldC5RdWlja0NvbnRhY3RCYWRnZS5XaW5kb3dTbWFsbCIgLz4KLSAgICAvPgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIgPgotCi0gICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZ2dyZWdhdGVfYmFkZ2UiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iM2RpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjNkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19hZ2dyZWdhdGVkIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgICAgIC8+Ci0KLSAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL25hbWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93Q29sb3I9IiNCQjAwMDAwMCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd1JhZGl1cz0iMi43NSIKLSAgICAgICAgICAgICAgICAvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9waG9uZXRpY19uYW1lIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgotICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iLTJkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgIC8+Ci0KLSAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgotICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iLTJkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgIC8+Ci0KLSAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzX2RhdGUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTJzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iLTJkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8SW1hZ2VWaWV3Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcHJlc2VuY2UiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjNkaXAiCi0gICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI2ZGlwIgotICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgLz4KLQotICAgIDxDaGVja0JveAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXIiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvZGVzY3JpcHRpb25fc3RhciIKLSAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvc3RhclN0eWxlIiAvPgotCi08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX2xhbmRzY2FwZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9sYW5kc2NhcGUueG1sCmluZGV4IGFiNjc1YzcuLjNkNTJmNzEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX2xhbmRzY2FwZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfbGFuZHNjYXBlLnhtbApAQCAtMjgsNyArMjgsNyBAQAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+CiAgICAgICAgIDwhLS0gIkVudGVyIFBJTihQYXNzd29yZCkgdG8gdW5sb2NrIiAtLT4KLSAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvZW50ZXJfcGFzc3dvcmRfbGFiZWwiCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1czEiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfcG9ydHJhaXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfcG9ydHJhaXQueG1sCmluZGV4IDllZTg3ODEuLmFmOGEzZWYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX3BvcnRyYWl0LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9wb3J0cmFpdC54bWwKQEAgLTI0LDcgKzI0LDcgQEAKICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIj4KIAogICAgIDwhLS0gIkVudGVyIFBJTihQYXNzd29yZCkgdG8gdW5sb2NrIiAtLT4KLSAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9lbnRlcl9wYXNzd29yZF9sYWJlbCIKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXMxIgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19sYW5kc2NhcGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX2xhbmRzY2FwZS54bWwKaW5kZXggYzFiNDA2Zi4uODMzODFhMSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX2xhbmRzY2FwZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX2xhbmRzY2FwZS54bWwKQEAgLTU4LDE4ICs1OCwxOSBAQAogICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCiAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0fGJvdHRvbSIKICAgICAgICAgICAgIC8+CisKICAgICAgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5EaWdpdGFsQ2xvY2sgYW5kcm9pZDppZD0iQCtpZC90aW1lIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCiAgICAgICAgICAgICA+CiAKICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpbWVEaXNwbGF5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9Ijcyc3AiCkBAIC04NCw4ICs4NSw5IEBACiAKICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FtX3BtIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvdGltZURpc3BsYXkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25CYXNlbGluZT0iQGlkL3RpbWVEaXNwbGF5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyMnNwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19wb3J0cmFpdC54bWwKaW5kZXggNzRhMGVlZS4uOGRhY2ZhZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sCkBAIC01NSwxMiArNTUsMTIgQEAKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxNWRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZGlwIgogICAgICAgICAgICAgPgogCiAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aW1lRGlzcGxheSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iYm90dG9tIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSI1NnNwIgpAQCAtNzQsOCArNzQsOSBAQAogCiAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hbV9wbSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iYm90dG9tIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL3RpbWVEaXNwbGF5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduQmFzZWxpbmU9IkBpZC90aW1lRGlzcGxheSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50LnhtbAppbmRleCA2ZjlmMWUwLi4xNDE0MDMyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudC54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnQueG1sCkBAIC0xLDggKzEsNiBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KIDwhLS0KLS8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL2Fzc2V0cy9yZXMvbGF5b3V0L2xpc3RfY29udGVudC54bWwKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLyogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICoqCiAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCiAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIApAQCAtMTcsOCArMTUsNDIgQEAKICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KIC0tPgotPExpc3RWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvbGlzdCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJmYWxzZSIKLSAgICAvPgorPEZyYW1lTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorICAgIAorICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9wcm9ncmVzc0NvbnRhaW5lciIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIj4KKyAgICAgICAgCisgICAgICAgIDxQcm9ncmVzc0JhciBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9wcm9ncmVzc0JhclN0eWxlTGFyZ2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9sb2FkaW5nIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iNGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiIC8+CisgICAgICAgICAgICAKKyAgICA8L0xpbmVhckxheW91dD4KKyAgICAgICAgCisgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbGlzdENvbnRhaW5lciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorICAgICAgICAgICAgCisgICAgICAgIDxMaXN0VmlldyBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9saXN0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd1NlbGVjdG9yT25Ub3A9ImZhbHNlIiAvPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL2ludGVybmFsRW1wdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2UiIC8+CisgICAgPC9GcmFtZUxheW91dD4KKyAgICAgICAgCis8L0ZyYW1lTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnRfc2ltcGxlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50X3NpbXBsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY5ZjFlMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50X3NpbXBsZS54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL2Fzc2V0cy9yZXMvbGF5b3V0L2xpc3RfY29udGVudC54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8TGlzdFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9saXN0IgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6ZHJhd1NlbGVjdG9yT25Ub3A9ImZhbHNlIgorICAgIC8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xvY2FsZV9waWNrZXJfaXRlbS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xvY2FsZV9waWNrZXJfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzZjVhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbG9jYWxlX3BpY2tlcl9pdGVtLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCisgICAgYW5kcm9pZDpwYWRkaW5nPSI1ZGlwIj4KKworICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2xvY2FsZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKKyAgICAvPgorPC9MaW5lYXJMYXlvdXQgPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2RpYWxvZ19lZGl0dGV4dC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfZGlhbG9nX2VkaXR0ZXh0LnhtbAppbmRleCBiNDFlNzc0Li41YmU1NzczIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfZGlhbG9nX2VkaXR0ZXh0LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfZGlhbG9nX2VkaXR0ZXh0LnhtbApAQCAtMTcsOCArMTcsNyBAQAogPCEtLSBMYXlvdXQgdXNlZCBhcyB0aGUgZGlhbG9nJ3MgY29udGVudCBWaWV3IGZvciBFZGl0VGV4dFByZWZlcmVuY2UuIC0tPgogPFNjcm9sbFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpvdmVyc2Nyb2xsTW9kZT0iaWZDb250ZW50U2Nyb2xscyI+CisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgogCiAgICAgPExpbmVhckxheW91dAogICAgICAgICBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvZWRpdHRleHRfY29udGFpbmVyIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfY29udGVudC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9jb250ZW50LnhtbAppbmRleCA4Zjg2OTgxLi5mZTk1MGIyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9jb250ZW50LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9jb250ZW50LnhtbApAQCAtNCwyMiArNCw5NiBAQAogKioKICoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAqKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogLS0+Ci08TGlzdFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9saXN0IgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJmYWxzZSIKLSAgICBhbmRyb2lkOnNjcm9sbGJhckFsd2F5c0RyYXdWZXJ0aWNhbFRyYWNrPSJ0cnVlIgotICAgIC8+CisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCI+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMHB4IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiPgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIj4KKworICAgICAgICAgICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBweCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JvbGxiYXJBbHdheXNEcmF3VmVydGljYWxUcmFjaz0idHJ1ZSIgLz4KKworICAgICAgICAgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbGlzdF9mb290ZXIiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiIC8+CisKKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvcHJlZnMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uX2JhciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9ib3R0b21fYmFyIgorICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9iYWNrX2J1dHRvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxNTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iNWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvaWNfYnRuX2JhY2siCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iM2RpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9iYWNrX2J1dHRvbl9sYWJlbCIKKyAgICAgICAgLz4KKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvc2tpcF9idXR0b24iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjVkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NraXBfYnV0dG9uX2xhYmVsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9uZXh0X2J1dHRvbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTUwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iNWRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUmlnaHQ9IkBkcmF3YWJsZS9pY19idG5fbmV4dCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iM2RpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbmV4dF9idXR0b25fbGFiZWwiCisgICAgICAgICAgICAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9pdGVtLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiODg4YjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9pdGVtLnhtbApAQCAtMCwwICsxLDYxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIExheW91dCBmb3IgYSBwcmVmZXJlbmNlIGNhdGVnb3J5IGl0ZW0sIGNvbnRhaW5pbmcgYW4gaWNvbiBhbmQgbGFiZWwuIC0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL3dpZGdldF9mcmFtZSIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI/YW5kcm9pZDphdHRyL3Njcm9sbGJhclNpemUiPgorCisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIiAvPgorCisgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIyZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSI+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC90aXRsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICAgICAgYW5kcm9pZDpmYWRpbmdFZGdlPSJob3Jpem9udGFsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvc3VtbWFyeSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAYW5kcm9pZDppZC90aXRsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduTGVmdD0iQGFuZHJvaWQ6aWQvdGl0bGUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIyIiAvPgorCisgICAgPC9SZWxhdGl2ZUxheW91dD4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3JlY2VudF9hcHBzX2FjdGl2aXR5LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcmVjZW50X2FwcHNfYWN0aXZpdHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NjIzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3JlY2VudF9hcHBzX2FjdGl2aXR5LnhtbApAQCAtMCwwICsxLDU1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxMaW5lYXJMYXlvdXQKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICA8IS0tIFRpdGxlIC0tPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiM4MEZGRkZGRiIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAYW5kcm9pZDpzdHJpbmcvcmVjZW50X3Rhc2tzX3RpdGxlIgorICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiLz4KKworICAgIDwhLS0gVGhpcyBpcyBvbmx5IGludGVuZGVkIHRvIGJlIHZpc2libGUgd2hlbiBjYXJvdXNlbCBpcyBpbnZpc2libGUgLS0+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm9fYXBwbGljYXRpb25zX21lc3NhZ2UiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAYW5kcm9pZDpzdHJpbmcvbm9fcmVjZW50X3Rhc2tzIgorICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiLz4KKworICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQ2Fyb3VzZWxWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2Fyb3VzZWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIj4KKyAgICA8L2NvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5DYXJvdXNlbFZpZXc+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW4ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW4ueG1sCmluZGV4IGRmYTk3MzEuLjcyZjczOTIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbi54bWwKQEAgLTI1LDYgKzI1LDEzIEBACiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKID4KKyAgICA8IS0tIFBvcG91dCBiYXIgZm9yIGFjdGlvbiBtb2RlcyAtLT4KKyAgICA8Vmlld1N0dWIgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXJfc3R1YiIKKyAgICAgICAgICAgICAgYW5kcm9pZDppbmZsYXRlZElkPSJAK2lkL2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKwogICAgIDwhLS0gVGl0bGUgYmFyIC0tPgogICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90aXRsZV9jb250YWluZXIiCiAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3dpbmRvd1RpdGxlQmFja2dyb3VuZFN0eWxlIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fYWN0aW9uX2Jhci54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9hY3Rpb25fYmFyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzQ0YjhjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fYWN0aW9uX2Jhci54bWwKQEAgLTAsMCArMSw1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KK1RoaXMgaXMgYW4gb3B0aW1pemVkIGxheW91dCBmb3IgYSBzY3JlZW4gd2l0aCB0aGUgQWN0aW9uIEJhciBlbmFibGVkLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiPgorICAgIDxWaWV3QW5pbWF0b3IgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDppbkFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX2luX25vX2FscGhhIgorICAgICAgICBhbmRyb2lkOm91dEFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYSI+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvd2luZG93QWN0aW9uQmFyU3R5bGUiIC8+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgIDwvVmlld0FuaW1hdG9yPgorICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZEdyYXZpdHk9ImZpbGxfaG9yaXpvbnRhbHx0b3AiCisgICAgICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZD0iP2FuZHJvaWQ6YXR0ci93aW5kb3dDb250ZW50T3ZlcmxheSIgLz4KKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbG93ZXJfYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvd2luZG93QWN0aW9uQmFyU3R5bGUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2FjdGlvbl9iYXJfb3ZlcmxheS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9hY3Rpb25fYmFyX292ZXJsYXkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NTRjNmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9hY3Rpb25fYmFyX292ZXJsYXkueG1sCkBAIC0wLDAgKzEsNTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KK1RoaXMgaXMgYW4gb3B0aW1pemVkIGxheW91dCBmb3IgYSBzY3JlZW4gd2l0aAordGhlIEFjdGlvbiBCYXIgZW5hYmxlZCBvdmVybGF5aW5nIGFwcGxpY2F0aW9uIGNvbnRlbnQuCistLT4KKworPFJlbGF0aXZlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmZpdHNTeXN0ZW1XaW5kb3dzPSJ0cnVlIj4KKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiIC8+CisgICAgPFZpZXdBbmltYXRvciBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9iYXJfYW5pbWF0b3IiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InRvcCIKKyAgICAgICAgYW5kcm9pZDppbkFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX2luX25vX2FscGhhIgorICAgICAgICBhbmRyb2lkOm91dEFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYSI+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvd2luZG93QWN0aW9uQmFyU3R5bGUiIC8+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgIDwvVmlld0FuaW1hdG9yPgorICAgIDxJbWFnZVZpZXcgYW5kcm9pZDpzcmM9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiCisgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0WFkiCisgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2FjdGlvbl9iYXJfYW5pbWF0b3IiIC8+CisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2xvd2VyX2FjdGlvbl9jb250ZXh0X2JhciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3dpbmRvd0FjdGlvbkJhclN0eWxlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorPC9SZWxhdGl2ZUxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2N1c3RvbV90aXRsZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9jdXN0b21fdGl0bGUueG1sCmluZGV4IDM0YzlkZTAuLmM2MmEwNmEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2N1c3RvbV90aXRsZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fY3VzdG9tX3RpdGxlLnhtbApAQCAtMjEsNiArMjEsMTMgQEAKIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiPgorICAgIDwhLS0gUG9wb3V0IGJhciBmb3IgYWN0aW9uIG1vZGVzIC0tPgorICAgIDxWaWV3U3R1YiBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9tb2RlX2Jhcl9zdHViIgorICAgICAgICAgICAgICBhbmRyb2lkOmluZmxhdGVkSWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dD0iQGxheW91dC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorCiAgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RpdGxlX2NvbnRhaW5lciIgCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93VGl0bGVTaXplIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fcHJvZ3Jlc3MueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fcHJvZ3Jlc3MueG1sCmluZGV4IDZlNjk0YzEuLmMzZjQxZmEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3Byb2dyZXNzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9wcm9ncmVzcy54bWwKQEAgLTI2LDYgKzI2LDEzIEBACiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKID4KKyAgICA8IS0tIFBvcG91dCBiYXIgZm9yIGFjdGlvbiBtb2RlcyAtLT4KKyAgICA8Vmlld1N0dWIgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXJfc3R1YiIKKyAgICAgICAgICAgICAgYW5kcm9pZDppbmZsYXRlZElkPSJAK2lkL2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKwogICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90aXRsZV9jb250YWluZXIiIAogICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci93aW5kb3dUaXRsZUJhY2tncm91bmRTdHlsZSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9zaW1wbGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fc2ltcGxlLnhtbAppbmRleCBkZjUxMWM2Li44N2MyOWY2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9zaW1wbGUueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3NpbXBsZS54bWwKQEAgLTIxLDkgKzIxLDE5IEBACiBlbmFibGVkLgogLS0+CiAKLTxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvY29udGVudCIKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiCi0gICAgYW5kcm9pZDpmb3JlZ3JvdW5kSW5zaWRlUGFkZGluZz0iZmFsc2UiCi0gICAgYW5kcm9pZDpmb3JlZ3JvdW5kR3Jhdml0eT0iZmlsbF9ob3Jpem9udGFsfHRvcCIKLSAgICBhbmRyb2lkOmZvcmVncm91bmQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiIC8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKyAgICA8Vmlld1N0dWIgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXJfc3R1YiIKKyAgICAgICAgICAgICAgYW5kcm9pZDppbmZsYXRlZElkPSJAK2lkL2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKyAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2NvbnRlbnQiCisgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICBhbmRyb2lkOmZvcmVncm91bmRJbnNpZGVQYWRkaW5nPSJmYWxzZSIKKyAgICAgICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZEdyYXZpdHk9ImZpbGxfaG9yaXpvbnRhbHx0b3AiCisgICAgICAgICBhbmRyb2lkOmZvcmVncm91bmQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlLnhtbAppbmRleCAzOWVhMTMxLi5mNTEzNGY5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl90aXRsZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fdGl0bGUueG1sCkBAIC0yMiw2ICsyMiwxMiBAQAogPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCiAgICAgYW5kcm9pZDpmaXRzU3lzdGVtV2luZG93cz0idHJ1ZSI+CisgICAgPCEtLSBQb3BvdXQgYmFyIGZvciBhY3Rpb24gbW9kZXMgLS0+CisgICAgPFZpZXdTdHViIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyX3N0dWIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6aW5mbGF0ZWRJZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CiAgICAgPEZyYW1lTGF5b3V0CiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93VGl0bGVTaXplIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fdGl0bGVfaWNvbnMueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fdGl0bGVfaWNvbnMueG1sCmluZGV4IDYyYTAyMjguLjUxZDZhMTUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlX2ljb25zLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl90aXRsZV9pY29ucy54bWwKQEAgLTIzLDYgKzIzLDEyIEBACiAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisgICAgPCEtLSBQb3BvdXQgYmFyIGZvciBhY3Rpb24gbW9kZXMgLS0+CisgICAgPFZpZXdTdHViIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyX3N0dWIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6aW5mbGF0ZWRJZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CiAgICAgPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RpdGxlX2NvbnRhaW5lciIKICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvd2luZG93VGl0bGVCYWNrZ3JvdW5kU3R5bGUiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2cueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nLnhtbAppbmRleCA2ZTRlNWUxLi5jNjY1ZjdhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2cueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZy54bWwKQEAgLTMxLDUgKzMxLDQgQEAKICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjVweCIKICAgICBhbmRyb2lkOmNhY2hlQ29sb3JIaW50PSJAbnVsbCIKICAgICBhbmRyb2lkOmRpdmlkZXI9IkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQiCi0gICAgYW5kcm9pZDpzY3JvbGxiYXJzPSJ2ZXJ0aWNhbCIKLSAgICBhbmRyb2lkOm92ZXJzY3JvbGxNb2RlPSJpZkNvbnRlbnRTY3JvbGxzIiAvPgorICAgIGFuZHJvaWQ6c2Nyb2xsYmFycz0idmVydGljYWwiIC8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2dfbXVsdGljaG9pY2UueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX211bHRpY2hvaWNlLnhtbAppbmRleCA1Nzg1ZDNiLi5iNjQ2YTRjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2dfbXVsdGljaG9pY2UueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19tdWx0aWNob2ljZS54bWwKQEAgLTI0LDcgKzI0LDcgQEAKICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxMmRpcCIKICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iN2RpcCIKLSAgICBhbmRyb2lkOmNoZWNrTWFyaz0iQGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2NoZWNrIgorICAgIGFuZHJvaWQ6Y2hlY2tNYXJrPSI/YW5kcm9pZDphdHRyL2xpc3RDaG9pY2VJbmRpY2F0b3JNdWx0aXBsZSIKICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKIC8+CiAKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19zaW5nbGVjaG9pY2UueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX3NpbmdsZWNob2ljZS54bWwKaW5kZXggMzU2MGZlZS4uYzNjMjA3MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX3NpbmdsZWNob2ljZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX3NpbmdsZWNob2ljZS54bWwKQEAgLTI0LDYgKzI0LDYgQEAKICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxMmRpcCIKICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iN2RpcCIKLSAgICBhbmRyb2lkOmNoZWNrTWFyaz0iQGFuZHJvaWQ6ZHJhd2FibGUvYnRuX3JhZGlvIgorICAgIGFuZHJvaWQ6Y2hlY2tNYXJrPSI/YW5kcm9pZDphdHRyL2xpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUiCiAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCiAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zaW1wbGVfc2VsZWN0YWJsZV9saXN0X2l0ZW0ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zaW1wbGVfc2VsZWN0YWJsZV9saXN0X2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOGJjZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NpbXBsZV9zZWxlY3RhYmxlX2xpc3RfaXRlbS54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxDaGVja2VkVGV4dFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RleHQxIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IgorICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvbGlzdENob2ljZUJhY2tncm91bmRJbmRpY2F0b3IiCisgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNmRpcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iOWRpcCIKKy8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3dlYl9ydW50aW1lLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2ViX3J1bnRpbWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYzA5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3dlYl9ydW50aW1lLnhtbApAQCAtMCwwICsxLDM2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgID4KKyAgICA8V2ViVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3dlYnZpZXciCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICAvPgorCisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NwbGFzaHNjcmVlbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0U3RhcnQiCisgICAgLz4KKworPC9GcmFtZUxheW91dD4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3Jhdy1ybS9sb2FkZXJyb3IuaHRtbCBiL2NvcmUvcmVzL3Jlcy9yYXctcm0vbG9hZGVycm9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0YTNmZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9yYXctcm0vbG9hZGVycm9yLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5QYWdpbmEgZCdpbnRlcm5ldCBiZXRnIGRpc3BvbmlibGE8L3RpdGxlPgorICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgICAgICAgYm9keSB7IG1hcmdpbi10b3A6IDBweDsgcGFkZGluZy10b3A6IDBweDsgfQorICAgICAgICAgICAgaDIgICB7IG1hcmdpbi10b3A6IDVweDsgcGFkZGluZy10b3A6IDBweDsgfQorICAgICAgICA8L3N0eWxlPgorCisgICAgICAgIDxib2R5PgorCisgICAgICAgICAgICA8aW1nIHNyYz0iZmlsZTovLy9hbmRyb2lkX2Fzc2V0L3dlYmtpdC9hbmRyb2lkLXdlYmVycm9yLnBuZyIgYWxpZ249InRvcCIgLz4KKyAgICAgICAgICAgIDxoMj5QYWdpbmEgZCdpbnRlcm5ldCBiZXRnIGRpc3BvbmlibGE8L2gyPgorICAgICAgICAgICAgPHA+SW1wdXNzaWJlbCBkYSBjaGFyZ2lhciBsYSBwYWdpbmEgZCdpbnRlcm5ldCBzdXQgPGEgaHJlZj0iJXMiPiVzPC9hPi4gRXJydXI6PC9wPgorICAgICAgICAgICAgPCEtLSBUaGUgJWUgaXMgcmVwbGFjZWQgYnkgYSBsb2NhbGl6ZWQgZXJyb3Igc3RyaW5nIC0tPgorICAgICAgICAgICAgPHA+JWU8L3A+CisgICAgICAgIDwvYm9keT4KKyAgICA8L2hlYWQ+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvcmF3LXJtL25vZG9tYWluLmh0bWwgYi9jb3JlL3Jlcy9yZXMvcmF3LXJtL25vZG9tYWluLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyODMzYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9yYXctcm0vbm9kb21haW4uaHRtbApAQCAtMCwwICsxLDIzIEBACis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPlBhZ2luYSBkJ2ludGVybmV0IGJldGcgZGlzcG9uaWJsYTwvdGl0bGU+CisgICAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICAgICAgICBib2R5IHsgbWFyZ2luLXRvcDogMHB4OyBwYWRkaW5nLXRvcDogMHB4OyB9CisgICAgICAgICAgICBoMiAgIHsgbWFyZ2luLXRvcDogNXB4OyBwYWRkaW5nLXRvcDogMHB4OyB9CisgICAgICAgIDwvc3R5bGU+CisKKyAgICAgICAgPGJvZHk+CisKKyAgICAgICAgICAgIDxpbWcgc3JjPSJmaWxlOi8vL2FuZHJvaWRfYXNzZXQvd2Via2l0L2FuZHJvaWQtd2ViZXJyb3IucG5nIiBhbGlnbj0idG9wIiAvPgorICAgICAgICAgICAgPGgyPlBhZ2luYSBkJ2ludGVybmV0IGJldGcgZGlzcG9uaWJsYTwvaDI+CisgICAgICAgICAgICA8cD5MYSBwYWdpbmEgZCdpbnRlcm5ldCBzdXQgPGEgaHJlZj0iJXMiPiVzPC9hPiAmZWdyYXZlOyBldmVudHVhbG1haW4gZGVhY3RpdmFkYSB0ZW1wb3Jhcm1haW4gdSBzcHVzdGFkYSBkZWZpbml0aXZhbWFpbiBhZCBpbmEgbm92YSBhZHJlc3NhIGRhIHdlYi48L3A+CisKKyAgICAgICAgICAgIDxwPjxiPlF1YSBpbiBwJmVncmF2ZTtyIHByb3Bvc3Rhczo8L2I+PC9wPgorICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgIDxsaT5Db250cm9sbGFpIGNoZSBWb3NzIGFwcGFyYXQgcmVjZXBlc2NoYSBpbiBzaWduYWwgZSBkaXNwb25hIGQnaW5hIGNvbm5leGl1biBkYSBkYXRhcy48L2xpPgorICAgICAgICAgICAgICAgIDxsaT5DaGFyZ2lhaSBwbGkgdGFyZCBkYW5vdmFtYWluIGxhIHBhZ2luYSBkJ2ludGVybmV0LjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPkNoYXJnaWFpIGluYSBjb3BpYSBkYSBsYSBwYWdpbmEgZGEgd2ViIG1lbW9yaXNhZGEgZW4gaWwgY2FjaGUgZGEgR29vZ2xlLjwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2JvZHk+CisgICAgPC9oZWFkPgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKaW5kZXggNzk0MmM1Ni4uMDVlOWZhYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCkBAIC00MzYsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJVcsSNdWplLCBrZHkgZG9qZGUgayB1emFtxI1lbsOtIHphxZnDrXplbsOtIGEgYnVkZSBwb8W+YWRvdsOhbm8gb3DEm3Rvdm7DqSB6YWTDoW7DrSBoZXNsYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iVnltYXrDoW7DrSB2xaFlY2ggZGF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJCZXogZGFsxaHDrWhvIHBvdHZyemVuw60gb2Jub3bDrSB2w71jaG96w60gbmFzdGF2ZW7DrSB6IHbDvXJvYnkgYSBzbWHFvmUgdsWhZWNobmEgZGF0YS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJEb23FryI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmlsIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJQcsOhY2UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iSmluw6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iVmxhc3Ruw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4icG9tb2PDrSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IHBvbW9jw60gPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJaYWRlanRlIGvDs2QgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJaYWRlanRlIGhlc2xvIHBybyBvZGJsb2tvdsOhbsOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJaYWRlanRlIGvDs2QgUElOIHBybyBvZGJsb2tvdsOhbsOtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iTmVzcHLDoXZuw70ga8OzZCBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iQ2hjZXRlLWxpIHRlbGVmb24gb2RlbWtub3V0LCBzdGlza27Em3RlIE1lbnUgYSBwb3TDqSAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLEjMOtc2xvIHTDrXPFiG92w6kgbGlua3kiPC9zdHJpbmc+CkBAIC01NDUsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iWmF2b2xhdCB6cMSbdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IlNwcsOhdm7EmyEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iWmt1c3RlIHRvIHByb3PDrW0gem5vdnUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IlprdXN0ZSB0byBwcm9zw61tIHpub3Z1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iTmFiw61qZW7DrSAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iTmFiaXRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gPHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iS2FydGEgU0lNIGplIHphYmxva292w6FuYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJPZGJsb2tvdsOhbsOtIGthcnR5IFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+a3LDoXQganN0ZSBuYWtyZXNsaWxpIG5lc3Byw6F2bsOpIGJlenBlxI1ub3N0bsOtIGdlc3RvLiAiXG5cbiJPcGFrdWp0ZSBwcm9zw61tIGFrY2kgemEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJWw61jZWtyw6F0ICg8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPikganN0ZSBuZXNwcsOhdm7EmyB6YWRhbGkgaGVzbG8uICJcblxuIlprdXN0ZSB0byB6bm92dSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJWw61jZWtyw6F0ICg8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPikganN0ZSBuZXNwcsOhdm7EmyB6YWRhbGkga8OzZCBQSU4uICJcblxuIlprdXN0ZSB0byB6bm92dSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz5rcsOhdCBqc3RlIG5lc3Byw6F2bsSbIG5ha3Jlc2xpbGkgc3bDqSBiZXpwZcSNbm9zdG7DrSBnZXN0by4gUG8gZGFsxaHDrWNoIG5lw7pzcMSbxaFuw71jaCBwb2t1c2VjaCAoPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4pIGJ1ZGV0ZSBwb8W+w6Fkw6FuaSBvIG9kZW3EjWVuw60gdGVsZWZvbnUgcG9tb2PDrSBwxZlpaGzDocWhZW7DrSBkbyDDusSNdHUgR29vZ2xlLiJcblxuIiBBa2NpIHByb3PDrW0gb3Bha3VqdGUgemEgbsSba29saWsgc2VrdW5kICg8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPikuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlNla3VuZHkgemLDvXZhasOtY8OtIGRvIGRhbMWhw61obyBwb2t1c3U6IDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IlphcG9tbsSbbGkganN0ZSBnZXN0bz8iPC9zdHJpbmc+CkBAIC03MDMsMTUgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlZ5YnJhdCB2xaFlIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHQgKDQ4NjIzNTkzMTEwODg4OTg4NzgpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iVnlqbW91dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iS29ww61yb3ZhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IlZsb8W+aXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IktvcMOtcm92YXQgYWRyZXN1IFVSTCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJNZXRvZGEgemFkw6F2w6Fuw60gZGF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IlDFmWlkYXQgc2xvdm8g4oCePHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPuKAnCBkbyBzbG92bsOta3UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiLDmnByYXZ5IHRleHR1Ijwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJNw6FsbyBwYW3Em3RpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iViB0ZWxlZm9udSB6YsO9dsOhIG3DoWxvIG3DrXN0YSBwcm8gdWtsw6Fkw6Fuw60gZGF0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzE5LDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJacnXFoWl0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IlVwb3pvcm7Em27DrSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iTmHEjcOtdMOhbsOtLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJaQVBOVVRPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iVllQTk9VVCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iRG9rb27EjWl0IGFrY2kgcG9tb2PDrSBhcGxpa2FjZSI8L3N0cmluZz4KQEAgLTg1MywxMyArODYyLDE2IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iU8OtxaUgVlBOIEwyVFAvSVBTZWMgcyBwxZllZHNkw61sZW7DvW0ga2zDrcSNZW0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iU8OtxaUgVlBOIEwyVFAvSVBTZWMgcyBjZXJ0aWZpa8OhdGVtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iWnZvbGl0IHNvdWJvciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+Ik5lbsOtIHZ5YnLDoW4gxb7DoWRuw70gc291Ym9yIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVzZXRvdmF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+Ik9kZXNsYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+Im9ibMOtYmVuw6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJBa3Rpdm92w6FuIHJlxb5pbSBWIGF1dMSbIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlZ5YmVydGUsIGNoY2V0ZS1saSB1a29uxI1pdCByZcW+aW0gTmEgY2VzdMSbLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJKZSBha3Rpdm7DrSB0ZXRoZXJpbmcgbmVibyBob3RzcG90Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iRG90eWtlbSB6YWjDoWrDrXRlIGtvbmZpZ3VyYWNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iWnDEm3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJEYWzFocOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iUMWZZXNrb8SNaXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJWeXNva8OpIHZ5dcW+aXTDrSBtb2JpbG7DrWNoIGRhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iRG90eWtlbSB6b2JyYXrDrXRlIGRhbMWhw60gaW5mb3JtYWNlIG8gdnl1xb5pdMOtIG1vYmlsbsOtY2ggZGF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJCeWwgcMWZZWtyb8SNZW4gbGltaXQgbW9iaWxuw61jaCBkYXQiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbAppbmRleCBiYWIxOGYyLi5mNTMzMWU1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IktvbnRyb2wgbsOlciBlbmhlZGVuIGzDpXNlcywgc8OlIGR1IHNrYWwgaW5kdGFzdGUgYWRnYW5nc2tvZGVuIGlnZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IlNsZXQgYWxsZSBkYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJGb3JldGFnIGVuIGZhYnJpa3NudWxzdGlsbGluZywgZGVyIHNsZXR0ZXIgYWxsZSBkaW5lIGRhdGEgdWRlbiBiZWtyw6ZmdGVsc2UuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iSGplbSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmlsIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJBcmJlamRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IkFuZHJlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IlRpbHBhc3NldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJ2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJJbmR0YXN0IFBJTi1rb2RlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJJbmR0YXN0IGFkZ2FuZ3Nrb2RlIGZvciBhdCBsw6VzZSBvcCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iSW5kdGFzdCBwaW5rb2RlIGZvciBhdCBsw6VzZSBvcCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkZvcmtlcnQgUElOLWtvZGUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlRyeWsgcMOlIE1lbnUgb2cgZGVybsOmc3QgcMOlIDAgZm9yIGF0IGzDpXNlIG9wLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7hkbnVtbWVyIjwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlRpbGJhZ2UgdGlsIG9wa2FsZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IlJpZ3RpZ3QhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IkJla2xhZ2VyISBQcsO4diBpZ2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJCZWtsYWdlciEgUHLDuHYgaWdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+Ik9wbGFkZXIgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+Ik9wbGFkdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTksNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IlNJTS1rb3J0ZXQgZXIgbMOlc3QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iTMOlc2VyIFNJTS1rb3J0ZXQgb3AgLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iRHUgaGFyIHRlZ25ldCBkaXQgb3Bsw6VzbmluZ3Ntw7huc3RlciBmb3JrZXJ0IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGdhbmdlLiAiXG5cbiJQcsO4diBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkR1IGhhciBpbmR0YXN0ZXQgZGluIGFkZ2FuZ3Nrb2RlIGZvcmtlcnQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ2FuZ2UuICJcblxuIlByw7h2IGlnZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IkR1IGhhciBpbmR0YXN0ZXQgZGluIHBpbmtvZGUgZm9ya2VydCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnYW5nZS4gIlxuXG4iUHLDuHYgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IkR1IGhhciB0ZWduZXQgZGl0IG9wbMOlc25pbmdzbcO4bnN0ZXIgZm9ya2VydCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnYW5nZS4gRWZ0ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gZm9yc8O4ZyBtZXJlIHZpbCBkdSBibGl2ZSBiZWR0IG9tIGF0IGzDpXNlIGRpbiB0ZWxlZm9uIG9wIHZlZCBoasOmbHAgYWYgZGl0IEdvb2dsZS1sb2dpbiJcblxuIiBQcsO4diBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJQcsO4diBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkhhciBkdSBnbGVtdCBtw7huc3RyZXQ/Ijwvc3RyaW5nPgpAQCAtNzAzLDE1ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJWw6ZsZyBhbGxlIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHQgKDQ4NjIzNTkzMTEwODg4OTg4NzgpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iS2xpcCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iS29waWVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iSW5kc8OmdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iS29waWVyIHdlYmFkcmVzc2UiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iSW5wdXRtZXRvZGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iRsO4aiBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiB0aWwgb3JkYm9nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iUmVkaWdlciB0ZWtzdCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iRGVyIGVyIGlra2Ugc8OlIG1lZ2V0IHBsYWRzIHRpbGJhZ2UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJEZXIgZXIgbsOmc3RlbiBpa2tlIG1lcmUgcGxhZHMgcMOlIHRlbGVmb25lbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxOSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQW5udWxsZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQmVtw6ZyayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iSW5kbMOmc2VyLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJUSUwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJGUkEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkZ1bGRmw7hyIGhhbmRsaW5nIHZlZCBoasOmbHAgYWYiPC9zdHJpbmc+CkBAIC04NTMsMTMgKzg2MiwxNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IkwyVFAvSVBTZWMgVlBOIGJhc2VyZXQgcMOlIGZvcmjDpW5kc2RlbHQgbsO4Z2xla29kbmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJDZXJ0aWZpa2F0YmFzZXJldCBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IlbDpmxnIGZpbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IkluZ2VuIGZpbCBlciB2YWxndCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+Ik51bHN0aWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iU2VuZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkJpbHRpbHN0YW5kIGVyIGFrdGl2ZXJldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJWw6ZsZyBmb3IgYXQgYWZzbHV0dGUgYmlsdGlsc3RhbmQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IlRldGhlcmluZyBlbGxlciBob3RzcG90IGVyIGFrdGl2dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRyeWsgZm9yIGF0IGtvbmZpZ3VyZXJlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iVGlsYmFnZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+Ik7DpnN0ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+IlNwcmluZyBvdmVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iSMO4anQgbW9iaWxkYXRhZm9yYnJ1ZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iVHJ5ayBmb3Igb3BseXNuaW5nZXIgb20gYnJ1ZyBhZiBtb2JpbGRhdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+Ikdyw6Zuc2VuIGZvciBtb2JpbGRhdGEgZXIgb3ZlcnNrcmVkZXQiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbAppbmRleCBjMjBhYTE2Li41MmFlM2I0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IlN0ZXVlcnVuZyBkZXIgR2Vyw6R0ZXNwZXJyZTsgZXJmb3JkZXJ0IGRpZSBlcm5ldXRlIFBhc3N3b3J0ZWluZ2FiZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJBbGxlIERhdGVuIGzDtnNjaGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJadXLDvGNrc2V0emVuIGF1ZiBkaWUgV2Vya3NlaW5zdGVsbHVuZ2VuLiBEYWJlaSB3ZXJkZW4gYWxsZSBJaHJlIERhdGVuIG9obmUgTmFjaGZyYWdlIGdlbMO2c2NodC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJQcml2YXQiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJNb2JpbCI8L2l0ZW0+CkBAIC01MjksMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4iQmVydWZsaWNoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IkFuZGVyZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJCZW51dHplcmRlZmluaWVydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiLDvGJlciA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IMO8YmVyIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iUElOLUNvZGUgZWluZ2ViZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IlBhc3N3b3J0IHp1bSBFbnRzcGVycmVuIGVpbmdlYmVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJQSU4genVtIEVudHNwZXJyZW4gZWluZ2ViZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJGYWxzY2hlciBQSU4tQ29kZSEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iRHLDvGNrZW4gU2llIHp1bSBFbnRzcGVycmVuIGRpZSBNZW7DvHRhc3RlIHVuZCBkYW5uIGF1ZiBcIjBcIi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTm90cnVmbnVtbWVyIjwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+Ilp1csO8Y2sgenVtIEFucnVmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iS29ycmVrdCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iVHV0IHVucyBsZWlkLiBWZXJzdWNoZW4gU2llIGVzIG5vY2ggZWlubWFsLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iVHV0IHVucyBsZWlkLiBWZXJzdWNoZW4gU2llIGVzIG5vY2ggZWlubWFsLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IldpcmQgZ2VsYWRlbiAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iQXVmZ2VsYWRlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gPHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iQml0dGUgUElOLUNvZGUgZWluZ2ViZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJTSU0tS2FydGUgd2lyZCBlbnRzcGVycnQuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJTaWUgaGFiZW4gSWhyIEVudHNwZXJydW5nc211c3RlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPi1tYWwgZmFsc2NoIGdlemVpY2huZXQuICJcblxuIlZlcnN1Y2hlbiBTaWUgZXMgaW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gU2VrdW5kZW4gZXJuZXV0LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IlNpZSBoYWJlbiBJaHIgUGFzc3dvcnQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gTWFsIGZhbHNjaCBlaW5nZWdlYmVuLiAiXG5cbiJWZXJzdWNoZW4gU2llIGVzIGluIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IFNla3VuZGVuIGVybmV1dC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iU2llIGhhYmVuIElocmUgUElOIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IE1hbCBmYWxzY2ggZWluZ2VnZWJlbi4gIlxuXG4iVmVyc3VjaGVuIFNpZSBlcyBpbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBTZWt1bmRlbiBlcm5ldXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJTaWUgaGFiZW4gSWhyIEVudHNwZXJydW5nc211c3RlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPi1tYWwgZmFsc2NoIGdlemVpY2huZXQuIE5hY2ggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gd2VpdGVyZW4gZXJmb2xnbG9zZW4gVmVyc3VjaGVuIHdlcmRlbiBTaWUgYXVmZ2Vmb3JkZXJ0LCBJaHIgVGVsZWZvbiBtaXRoaWxmZSBJaHJlciBHb29nbGUtQW5tZWxkZWluZm9ybWF0aW9uZW4genUgZW50c3BlcnJlbi4gIlxuXG4iVmVyc3VjaGVuIFNpZSBlcyBpbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBTZWt1bmRlbiBlcm5ldXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlZlcnN1Y2hlbiBTaWUgZXMgaW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IFNla3VuZGVuIGVybmV1dC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+Ik11c3RlciB2ZXJnZXNzZW4/Ijwvc3RyaW5nPgpAQCAtNzAzLDE1ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJBbGxlcyBhdXN3w6RobGVuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHQgKDQ4NjIzNTkzMTEwODg4OTg4NzgpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iQXVzc2NobmVpZGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3BpZXJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IkVpbmbDvGdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iVVJMIGtvcGllcmVuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+IkVpbmdhYmVtZXRob2RlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IlwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIHp1bSBXw7ZydGVyYnVjaCBoaW56dWbDvGdlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IlRleHQgYmVhcmJlaXRlbiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iR2VyaW5nZXIgU3BlaWNoZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJLYXVtIG5vY2ggZnJlaWVyIFRlbGVmb25zcGVpY2hlciB2ZXJmw7xnYmFyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzE5LDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJBYmJyZWNoZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQWNodHVuZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iV2lyZCBnZWxhZGVuLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJFSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJBVVMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkFrdGlvbiBkdXJjaGbDvGhyZW4gbWl0Ijwvc3RyaW5nPgpAQCAtODUzLDEzICs4NjIsMTYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJMMlRQL0lQU2VjLVZQTiBtaXQgdm9yaW5zdGFsbGllcnRlbSBTY2hsw7xzc2VsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlplcnRpZmlrYXQgbWl0IHZvcmluc3RhbGxpZXJ0ZW0gU2NobMO8c3NlbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IkRhdGVpIGF1c3fDpGhsZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJLZWluZSBEYXRlaSBhdXNnZXfDpGhsdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+Ilp1csO8Y2tzZXR6ZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iU2VuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJGYXZvcml0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iQXV0b21vZHVzIGFrdGl2aWVydCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJadW0gQmVlbmRlbiBkZXMgQXV0b21vZHVzIGF1c3fDpGhsZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iVGV0aGVyaW5nIG9kZXIgSG90c3BvdCBha3RpdiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+Ilp1bSBLb25maWd1cmllcmVuIGJlcsO8aHJlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+Ilp1csO8Y2siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJXZWl0ZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiLDnGJlcnNwcmluZ2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iSG9oZSBNb2JpbGRhdGVubnV0enVuZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iV2VpdGVyZSBJbmZvcm1hdGlvbmVuIMO8YmVyIGRpZSBNb2JpbGRhdGVubnV0enVuZyBkdXJjaCBCZXLDvGhyZW4gYXVmcnVmZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+Ik1vYmlsZGF0ZW5saW1pdCDDvGJlcnNjaHJpdHRlbiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCmluZGV4IGFiMjk2MDEuLmMyMTMyMWQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbApAQCAtNDM2LDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4izpXOu86tzrPPh861zrkgz4DPjM+EzrUgzrrOu861zrnOtM+Ozr3Otc65IM63IM+Dz4XPg866zrXPhc6uLCDOsc+AzrHOuc+Ez47Ovc+EzrHPgiDOus+JzrTOuc66z4wgz4DPgc+Mz4POss6xz4POt8+CIM6zzrnOsSDOtc+AzrHOvc61zq/Pg86/zrTOvy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4izpTOuc6xzrPPgc6xz4bOriDPjM67z4nOvSDPhM+Jzr0gzrTOtc60zr/OvM6tzr3Pic69Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiLOoM+BzrHOs868zrHPhM6/z4DOv865zrXOr8+EzrHOuSDOtc+AzrHOvc6xz4bOv8+BzqwgzrXPgc6zzr/Pg8+EzrHPg865zrHOus+Ozr0gz4HPhc64zrzOr8+DzrXPic69LCDOvM61IM+EzrcgzrTOuc6xzrPPgc6xz4bOriDPjM67z4nOvSDPhM+Jzr0gzrTOtc60zr/OvM6tzr3Pic69IM+DzrHPgiDPh8+Jz4HOr8+CIM61z4DOuc6yzrXOss6xzq/Pic+DzrcuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4izp/Ouc66zq/OsSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Is6azrnOvc63z4TPjCI8L2l0ZW0+CkBAIC01MjksMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4izpXPgc6zzrHPg86vzrEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4izobOu867zr8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4izqDPgc6/z4POsc+BzrzOv8+DzrzOrc69zr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4izrzOrc+Dz4kgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiDOvM6tz4PPiSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+Is6gzrvOt866z4TPgc6/zrvOv86zzq7Pg8+EzrUgz4TOv869IM66z4nOtM65zrrPjCDOsc+BzrnOuM68z4wgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiLOlc65z4POsc6zzqzOs861z4TOtSDPhM6/zr0gzrrPic60zrnOus+MIM+Az4HPjM+DzrLOsc+DzrfPgiDOs865zrEgzr7Otc66zrvOtc6vzrTPic68zrEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+Is6VzrnPg86xzrPOrM6zzrXPhM61IM+Ezr8gUElOIM6zzrnOsSDOvs61zrrOu861zq/OtM+JzrzOsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+Is6Vz4PPhs6xzrvOvM6tzr3Ov8+CIM66z4nOtM65zrrPjM+CIM6xz4HOuc64zrzPjM+CIFBJTiEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4izpPOuc6xIM6+zrXOus67zrXOr860z4nOvM6xLCDPgM6xz4TOrs+Dz4TOtSDPhM6/IM+AzrvOrs66z4TPgc6/IE1lbnUgzrrOsc65LCDPg8+Ezrcgz4PPhc69zq3Ph861zrnOsSwgz4TOvyDPgM67zq7Ous+Ez4HOvyAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLOkc+BzrnOuM68z4zPgiDOrc66z4TOsc66z4TOt8+CIM6xzr3OrM6zzrrOt8+CIjwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+Is6Vz4DOuc+Dz4TPgc6/z4bOriDPg8+EzrfOvSDOus67zq7Pg863Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4izqPPic+Dz4TPjCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4izqDPgc6/z4PPgM6xzrjOrs+Dz4TOtSDOsc+BzrPPjM+EzrXPgc6xIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiLOoM+Bzr/Pg8+AzrHOuM6uz4PPhM61IM6xz4HOs8+Mz4TOtc+BzrEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLOps+Mz4HPhM65z4POtyAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4izqbOv8+Bz4TOr8+Dz4TOt866zrUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTksNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+Is6XIM66zqzPgc+EzrEgU0lNIM61zq/Ovc6xzrkgzrrOu861zrnOtM+JzrzOrc69zrcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4izp7Otc66zrvOtc6vzrTPic68zrEgzrrOrM+Bz4TOsc+CIFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+Is6jz4fOtc60zrnOrM+DzrHPhM61IM61z4PPhs6xzrvOvM6tzr3OsSDPhM6/IM68zr/PhM6vzrLOvyDOvs61zrrOu861zrnOtM+OzrzOsc+Ezr/Pgjx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IM+Gzr/Pgc6tz4IuICJcblxuIs6gz4HOv8+Dz4DOsc64zq7Pg8+EzrUgzr7Osc69zqwgz4POtSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDOtM61z4XPhM61z4HPjM67zrXPgM+EzrEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4izprOsc+EzrHPh8+Jz4HOr8+DzrHPhM61IM61z4PPhs6xzrvOvM6tzr3OsSDPhM6/zr0gzrrPic60zrnOus+MIM+Az4HPjM+DzrLOsc+DzrfPgiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiDPhs6/z4HOrc+CLiAiXG5cbiLOoM+Bzr/Pg8+AzrHOuM6uz4PPhM61IM6+zrHOvc6sIM+DzrUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gzrTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiLOms6xz4TOsc+Hz4nPgc6vz4POsc+EzrUgzrXPg8+GzrHOu868zq3Ovc6xIM+Ezr8gUElOIM+DzrHPgjx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IM+Gzr/Pgc6tz4IuICJcblxuIs6gz4HOv8+Dz4DOsc64zq7Pg8+EzrUgzr7Osc69zqwgz4POtSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDOtM61z4XPhM61z4HPjM67zrXPgM+EzrEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiLOo8+HzrXOtM65zqzPg86xz4TOtSDPhM6/IM68zr/PhM6vzrLOvyDOvs61zrrOu861zrnOtM+OzrzOsc+Ezr/PgiDOtc+Dz4bOsc67zrzOrc69zrEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gz4bOv8+Bzq3Pgi4gzpzOtc+EzqwgzrHPgM+MIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IM6xzr3Otc+AzrnPhM+Fz4fOtc6vz4Igz4DPgc6/z4PPgM6szrjOtc65zrXPgiDOsc66z4zOvM63LCDOuM6xIM+DzrHPgiDOts63z4TOt864zrXOryDOvc6xIM6+zrXOus67zrXOuc60z47Pg861z4TOtSDPhM6/IM+EzrfOu86tz4bPic69z4wgz4POsc+CIM68zrUgz4TOtyDPh8+Bzq7Pg863IM+EzrfPgiDPg8+Nzr3OtM61z4POrs+CIM+DzrHPgiBHb29nbGUuIlxuXG4iIM6gz4HOv8+Dz4DOsc64zq7Pg8+EzrUgzr7Osc69zqwgz4POtSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBcbs60zrXPhc+EzrXPgc+MzrvOtc+Az4TOsS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4izqDPgc6/z4PPgM6xzrjOrs+Dz4TOtSDOvs6xzr3OrCDPg861IDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiDOtM61z4XPhM61z4HPjM67zrXPgM+EzrEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiLOns61z4fOrM+DzrHPhM61IM+Ezr8gzrzOv8+Ezq/Oss6/OyI8L3N0cmluZz4KQEAgLTcwMywxNSArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4izpXPgM65zrvOv86zzq4gz4zOu8+Jzr0iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dCAoNDg2MjM1OTMxMTA4ODg5ODg3OCkgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiLOkc+Azr/Ous6/z4DOriI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4izpHOvc+EzrnOs8+BzrHPhs6uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4izpXPgM65zrrPjM67zrvOt8+DzrciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+Is6Rzr3PhM65zrPPgc6xz4bOriDOtM65zrXPjc64z4XOvc+DzrfPgiBVUkwiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4izpzOrc64zr/OtM6/z4IgzrXOuc+Dz4zOtM6/z4UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4izqDPgc6/z4POuM6uzrrOtyDPhM63z4IgzrvOrc6+zrfPgiBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiDPg8+Ezr8gzrvOtc6+zrnOus+MIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4izpXPgM61zr7Otc+BzrPOsc+Dzq/OsSDOus61zrnOvM6tzr3Ov8+FIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiLOkc+Azr/OvM6tzr3Otc65IM67zq/Os86/z4IgzrXOu861z43OuM61z4HOv8+CIM+Hz47Pgc6/z4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiLOiM+HzrXOuSDOsc+Azr/OvM61zq/Ovc61zrkgzrvOr86zzr/PgiDOtc67zrXPjc64zrXPgc6/z4IgzrHPgM6/zrjOt866zrXPhc+EzrnOus+Mz4Igz4fPjs+Bzr/PgiDPg8+Ezr8gz4TOt867zq3Phs+Jzr3Ovy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxOSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4izpHOus+Nz4HPic+DzrciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4izqDPgc6/z4POv8+Hzq4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+Is6mz4zPgc+Ez4nPg863Li4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiLOlc69zrXPgc6zzr/PgM6/zrnOt868zq3Ovc6/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4izpHPgM61zr3Otc+BzrPOv8+Azr/Or863z4POtyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4izp/Ou86/zrrOu86uz4HPic+DzrcgzrXOvc6tz4HOs861zrnOsc+CIM68zrUgz4TOtyDPh8+Bzq7Pg863Ijwvc3RyaW5nPgpAQCAtODUzLDEzICs4NjIsMTYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiLOms67zrXOuc60zq8gcHJlLXNoYXJlZCDOss6sz4POtc65IEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+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+Gz4nOvc6vzrHPgiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKaW5kZXggZmNlNTZjZC4uMzhhZDQwNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNvbnRyb2xhciBjdWFuZG8gc2UgYmxvcXVlZSBlbCBkaXNwb3NpdGl2bywgcmVxdWllcmUgcXVlIHZ1ZWx2YXMgYSBpbmdyZXNhciB0dSBjb250cmFzZcOxYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iQm9ycmFyIHRvZG9zIGxvcyBkYXRvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iUmVhbGl6YXIgdW4gcmVlc3RhYmxlY2ltaWVudG8gZGUgZsOhYnJpY2EgeSBib3JyYXIgdG9kb3MgdHVzIGRhdG9zIHNpbiBuaW5ndW5hIGNvbmZpcm1hY2nDs24uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iQ2FzYSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IkNlbHVsYXIiPC9pdGVtPgpAQCAtNTI5LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IlRyYWJham8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iT3RybyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJQZXJzb25hbGl6YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+ImEgdHJhdsOpcyBkZSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IGEgdHJhdsOpcyBkZSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IkluZ3Jlc2FyIGVsIGPDs2RpZ28gZGUgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJJbmdyZXNhciBsYSBjb250cmFzZcOxYSBwYXJhIGRlc2Jsb3F1ZWFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJJbmdyZXNhIGVsIFBJTiBwYXJhIGRlc2Jsb3F1ZWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iwqFDw7NkaWdvIGRlIFBJTiBpbmNvcnJlY3RvISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJQYXJhIGRlc2Jsb3F1ZWFyLCBwcmVzaW9uYSBlbCBtZW7DuiB5IGx1ZWdvIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik7Dum1lcm8gZGUgZW1lcmdlbmNpYSI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJSZWdyZXNhciBhIGxsYW1hZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJDb3JyZWN0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJMbyBzZW50aW1vcywgdnVlbHZlIGEgaW50ZW50YXJsbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iTG8gc2VudGltb3MsIHZ1ZWx2ZSBhIGludGVudGFybG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJDYXJnYW5kbyAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iQ2FyZ2FkYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iU2VnbWVudG8gPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iTGEgdGFyamV0YSBTSU0gZXN0w6EgYmxvcXVlYWRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IkRlc2Jsb3F1ZWFuZG8gdGFyamV0YSBTSU3igKYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJIYXMgZXh0cmHDrWRvIGluY29ycmVjdGFtZW50ZSB0dSBwYXRyw7NuIGRlIGRlc2Jsb3F1ZW8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmVjZXMuICJcblxuIlZ1ZWx2ZSBhIGludGVudGFybG8gZW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iSGFzIGluZ3Jlc2FkbyB0dSBjb250cmFzZcOxYSBkZSBtYW5lcmEgaW5jb3JyZWN0YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZWNlcy4gIlxuXG4iVnVlbHZlIGEgaW50ZW50YXJsbyBlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iSGFzIGluZ3Jlc2FkbyB0dSBQSU4gZGUgbWFuZXJhIGluY29ycmVjdGEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmVjZXMuICJcblxuIlZ1ZWx2ZSBhIGludGVudGFybG8gZW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJIYXMgZXh0cmHDrWRvIGluY29ycmVjdGFtZW50ZSB0dSBwYXRyw7NuIGRlIGRlc2Jsb3F1ZW8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmVjZXMuIEx1ZWdvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IGludGVudG9zIGluY29ycmVjdG9zLCBzZSB0ZSBzb2xpY2l0YXLDoSBxdWUgZGVzYmxvcXVlZXMgdHUgdGVsw6lmb25vIGFsIGluaWNpYXIgc2VzacOzbiBlbiBHb29nbGUuICJcblxuIiBWdWVsdmUgYSBpbnRlbnRhcmxvIGVuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJWdWVsdmUgYSBpbnRlbnRhcmxvIGVuIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IsK/T2x2aWRhc3RlIGVsIHBhdHLDs24/Ijwvc3RyaW5nPgpAQCAtNzAzLDE1ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJTZWxlY2Npb25hciB0b2RvcyI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0ICg0ODYyMzU5MzExMDg4ODk4ODc4KSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IkNvcnRhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iQ29waWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iUGVnYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IkNvcGlhciBVUkwiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iTcOpdG9kbyBkZSBlbnRyYWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkFncmVnYXIgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgYWwgZGljY2lvbmFyaW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJFZGl0YXIgdGV4dG8iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IlBvY28gZXNwYWNpbyBkZSBhbG1hY2VuYW1pZW50byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IkhheSBwb2NvIGVzcGFjaW8gZGUgYWxtYWNlbmFtaWVudG8gZW4gZWwgdGVsw6lmb25vLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+IkFjZXB0YXIiPC9zdHJpbmc+CkBAIC03MTksNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJBY2VwdGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQ2FuY2VsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQXRlbmNpw7NuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJDYXJnYW5kby4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iRW5jZW5kaWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iQVBBR0FETyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iQ29tcGxldGFyIGxhIGFjY2nDs24gbWVkaWFudGUiPC9zdHJpbmc+CkBAIC04NTMsMTMgKzg2MiwxNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IkNsYXZlIHByZXZpYW1lbnRlIGNvbXBhcnRpZGEgc2Vnw7puIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IkNlcnRpZmljYWRvIHNlZ8O6biBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IkVsZWdpciBhcmNoaXZvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTm8gc2Ugc2VsZWNjaW9uw7MgdW4gYXJjaGl2by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJSZXN0YWJsZWNlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJFbnZpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaXRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iTW9kbyBhdXRvIGhhYmlsaXRhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iU2VsZWNjaW9uYXIgcGFyYSBzYWxpciBkZWwgbW9kbyBhdXRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkFuY2xhamUgYSByZWQgbyB6b25hIGFjdGl2YSBjb25lY3RhZG9zIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVG9jYXIgcGFyYSBjb25maWd1cmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iQXRyw6FzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iU2lndWllbnRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iT21pdGlyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iQW1wbGlhIHV0aWxpemFjacOzbiBkZSBkYXRvcyBtw7N2aWxlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iVG9jYSBwYXJhIG9idGVuZXIgbcOhcyBpbmZvcm1hY2nDs24gYWNlcmNhIGRlIGxhIHV0aWxpemFjacOzbiBkZSBkYXRvcyBtw7N2aWxlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IkzDrW1pdGUgZGUgZGF0b3MgbcOzdmlsZXMgZXhjZWRpZG8gIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKaW5kZXggNGZkYWYzYy4uYmIyZGZkOCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCkBAIC00MzYsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJQZXJtaXRlIGNvbnRyb2xhciBlbCBtb21lbnRvIGRlIGJsb3F1ZW8gZGVsIGRpc3Bvc2l0aXZvIHNvbGljaXRhbmRvIGFsIHVzdWFyaW8gcXVlIHZ1ZWx2YSBhIGludHJvZHVjaXIgbGEgY29udHJhc2XDsWEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkJvcnJhciB0b2RvcyBsb3MgZGF0b3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IlBlcm1pdGUgcmVhbGl6YXIgdW4gcmVzdGFibGVjaW1pZW50byBkZSBmw6FicmljYSBlbGltaW5hbmRvIHRvZG9zIGxvcyBkYXRvcyBzaW4gY29uZmlybWFjacOzbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJDYXNhIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTcOzdmlsIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJUcmFiYWpvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+Ik90cmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iUGVyc29uYWxpemFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJhIHRyYXbDqXMgZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiBhIHRyYXbDqXMgZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJJbnRyb2R1Y2UgZWwgY8OzZGlnbyBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IkludHJvZHVjaXIgY29udHJhc2XDsWEgcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iSW50cm9kdWNpciBQSU4gcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkVsIGPDs2RpZ28gUElOIGVzIGluY29ycmVjdG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlBhcmEgZGVzYmxvcXVlYXIgZWwgdGVsw6lmb25vLCBwdWxzYSBsYSB0ZWNsYSBkZSBtZW7DuiB5LCBhIGNvbnRpbnVhY2nDs24sIHB1bHNhIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik7Dum1lcm8gZGUgZW1lcmdlbmNpYSI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJWb2x2ZXIgYSBsbGFtYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iQ29ycmVjdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iSW50w6ludGFsbyBkZSBudWV2byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iSW50w6ludGFsbyBkZSBudWV2byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkNhcmdhbmRvICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJDYXJnYWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU5LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJJbnRyb2R1Y2UgZWwgY8OzZGlnbyBQSU4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iRGVzYmxvcXVlYW5kbyB0YXJqZXRhIFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IkhhcyByZWFsaXphZG8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gaW50ZW50b3MgZmFsbGlkb3MgZGUgY3JlYWNpw7NuIGRlIHVuIHBhdHLDs24gZGUgZGVzYmxvcXVlby4gIlxuXG4iSW50w6ludGFsbyBkZSBudWV2byBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iSGFzIGludHJvZHVjaWRvIHVuYSBjb250cmFzZcOxYSBpbmNvcnJlY3RhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlY2VzLiAiXG5cbiJJbnTDqW50YWxvIGRlIG51ZXZvIGRlbnRybyBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iSGFzIGludHJvZHVjaWRvIHVuIFBJTiBpbmNvcnJlY3RvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlY2VzLiAiXG5cbiJJbnTDqW50YWxvIGRlIG51ZXZvIGRlbnRybyBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IkhhcyByZWFsaXphZG8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gaW50ZW50b3MgZmFsbGlkb3MgZGUgY3JlYWNpw7NuIGRlbCBwYXRyw7NuIGRlIGRlc2Jsb3F1ZW8uIFNpIHJlYWxpemFzIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IGludGVudG9zIGZhbGxpZG9zIG3DoXMsIHNlIHRlIHBlZGlyw6EgcXVlIGRlc2Jsb3F1ZWVzIGVsIHRlbMOpZm9ubyBjb24gdHVzIGNyZWRlbmNpYWxlcyBkZSBhY2Nlc28gZGUgR29vZ2xlLiJcblxuIiBFc3BlcmEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MgZSBpbnTDqW50YWxvIGRlIG51ZXZvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJFc3BlcmEgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zIHkgdnVlbHZlIGEgaW50ZW50YXJsby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IsK/SGFzIG9sdmlkYWRvIGVsIHBhdHLDs24/Ijwvc3RyaW5nPgpAQCAtNzAzLDE1ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJTZWxlY2Npb25hciB0b2RvIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHQgKDQ4NjIzNTkzMTEwODg4OTg4NzgpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iQ29ydGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJDb3BpYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJQZWdhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iQ29waWFyIFVSTCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJNw6l0b2RvIGRlIGludHJvZHVjY2nDs24gZGUgdGV4dG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iQcOxYWRpciBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBhbCBkaWNjaW9uYXJpbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IkVkaXRhciB0ZXh0byI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iUG9jbyBlc3BhY2lvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iU2UgZXN0w6EgYWdvdGFuZG8gZWwgZXNwYWNpbyBkZSBhbG1hY2VuYW1pZW50byBkZWwgdGVsw6lmb25vLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+IkFjZXB0YXIiPC9zdHJpbmc+CkBAIC03MTksNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJBY2VwdGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQ2FuY2VsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQXRlbmNpw7NuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJDYXJnYW5kb+KApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iQWN0aXZhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJEZXNjb25lY3RhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkNvbXBsZXRhciBhY2Npw7NuIHV0aWxpemFuZG8iPC9zdHJpbmc+CkBAIC04NTMsMTMgKzg2MiwxNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IlJlZCBwcml2YWRhIHZpcnR1YWwgTDJUUC9JUFNlYyBiYXNhZGEgZW4gY2xhdmUgY29tcGFydGlkYSBwcmV2aWFtZW50ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJSZWQgcHJpdmFkYSB2aXJ0dWFsIEwyVFAvSVBTZWMgYmFzYWRhIGVuIGNlcnRpZmljYWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iU2VsZWNjaW9uYXIgYXJjaGl2byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IkFyY2hpdm8gbm8gc2VsZWNjaW9uYWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVzdGFibGVjZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iRW52aWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJmYXZvcml0b3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJTZSBoYSBoYWJpbGl0YWRvIGVsIG1vZG8gY29jaGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlNlbGVjY2lvbmEgZXN0YSBvcGNpw7NuIHBhcmEgc2FsaXIgZGVsIG1vZG8gY29jaGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkFuY2xhamUgYSByZWQgYWN0aXZvIG8gem9uYSBXaS1GaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRvY2EgcGFyYSBpbmljaWFyIGxhIGNvbmZpZ3VyYWNpw7NuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IkF0csOhcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IlNpZ3VpZW50ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+Ik9taXRpciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IlVzbyBlbGV2YWRvIGRhdG9zIG3Ds3ZpbGVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJNw6FzIGluZm9ybWFjacOzbiBzb2JyZSB1c28gZGUgZGF0b3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IkzDrW1pdGUgZGF0b3Mgc3VwZXJhZG8iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbAppbmRleCA5ZjBmYTBiLi4zNDM4MjlhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNvbnRyw7RsZSBsZSB2ZXJyb3VpbGxhZ2UgZHUgcMOpcmlwaMOpcmlxdWUsIGF2ZWMgb2JsaWdhdGlvbiBkZSBzYWlzaXIgw6Agbm91dmVhdSBsZSBtb3QgZGUgcGFzc2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkVmZmFjZXIgdG91dGVzIGxlcyBkb25uw6llcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iUsOpdGFibGl0IGxlcyBwYXJhbcOodHJlcyBkXCd1c2luZSwgc3VwcHJpbWFudCB0b3V0ZXMgdm9zIGRvbm7DqWVzIHNhbnMgZGVtYW5kZSBkZSBjb25maXJtYXRpb24uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iRG9taWNpbGUiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJQb3J0YWJsZSI8L2l0ZW0+CkBAIC01MjksMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4iQnVyZWF1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IkF1dHJlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IlBlcnNvbm5hbGlzw6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4idmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iU2Fpc2lzc2V6IGxlIGNvZGUgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJTYWlzaXNzZXogbGUgbW90IGRlIHBhc3NlIHBvdXIgcHJvY8OpZGVyIGF1IGTDqXZlcnJvdWlsbGFnZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IlNhaXNpc3NleiBsZSBjb2RlIFBJTiBwb3VyIHByb2PDqWRlciBhdSBkw6l2ZXJyb3VpbGxhZ2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iTGUgY29kZSBQSU4gZXN0IGluY29ycmVjdMKgISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJQb3VyIGTDqWJsb3F1ZXIgbGUgY2xhdmllciwgYXBwdXlleiBzdXIgXCJNZW51XCIgcHVpcyBzdXIgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTnVtw6lybyBkXCd1cmdlbmNlIjwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlJldG91ciDDoCBsXCdhcHBlbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IkNvbWJpbmFpc29uIGNvcnJlY3RlwqAhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IkluY29ycmVjdC4gTWVyY2kgZGUgcsOpZXNzYXllci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IkluY29ycmVjdC4gTWVyY2kgZGUgcsOpZXNzYXllci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJDaGFyZ2VtZW50ICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz7CoDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNoYXJnw6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+wqA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU5LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJMYSBjYXJ0ZSBTSU0gZXN0IHZlcnJvdWlsbMOpZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJEw6libG9jYWdlIGRlIGxhIGNhcnRlIFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IlZvdXMgYXZleiBtYWwgcmVwcm9kdWl0IGxlIHNjaMOpbWEgZGUgZMOpdmVycm91aWxsYWdlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGZvaXMuICJcblxuIlZldWlsbGV6IHLDqWVzc2F5ZXIgZGFucyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRlcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJWb3VzIGF2ZXogc2Fpc2kgdW4gbW90IGRlIHBhc3NlIGluY29ycmVjdCDDoCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPsKgcmVwcmlzZXMuICJcblxuIlZldWlsbGV6IHLDqWVzc2F5ZXIgZGFucyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPsKgc2Vjb25kZXMuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IlZvdXMgYXZleiBzYWlzaSB1biBjb2RlIFBJTiBpbmNvcnJlY3Qgw6AgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7CoHJlcHJpc2VzLiAiXG5cbiJWZXVpbGxleiByw6llc3NheWVyIGRhbnMgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7CoHNlY29uZGVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iVm91cyBhdmV6IG1hbCBzYWlzaSBsZSBzY2jDqW1hIGRlIGTDqXZlcnJvdWlsbGFnZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBmb2lzLiBBdSBib3V0IGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHRlbnRhdGl2ZXMgc3VwcGzDqW1lbnRhaXJlcywgdm91cyBkZXZyZXogZMOpYmxvcXVlciB2b3RyZSB0w6lsw6lwaG9uZSDDoCBsXCdhaWRlIGRlIHZvdHJlIGlkZW50aWZpYW50IEdvb2dsZS4iXG5cbiJNZXJjaSBkZSByw6llc3NheWVyIGRhbnMgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2Vjb25kZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlLDqWVzc2F5ZXogZGFucyA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz7CoHNlY29uZGVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iU2Now6ltYSBvdWJsacOpID8iPC9zdHJpbmc+CkBAIC03MDMsMTUgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlRvdXQgc8OpbGVjdGlvbm5lciI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0ICg0ODYyMzU5MzExMDg4ODk4ODc4KSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IkNvdXBlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iQ29waWVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iQ29sbGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJDb3BpZXIgbFwnVVJMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik1vZGUgZGUgc2Fpc2llIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkFqb3V0ZXIgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgYXUgZGljdGlvbm5haXJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iTW9kaWZpZXIgbGUgdGV4dGUiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IkVzcGFjZSBkaXNwb25pYmxlIGZhaWJsZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IkxhIG3DqW1vaXJlIGR1IHTDqWzDqXBob25lIGNvbW1lbmNlIMOgIMOqdHJlIHBsZWluZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxOSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQW5udWxlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJBdHRlbnRpb24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkNoYXJnZW1lbnQgZW4gY291cnMuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+Ik9OIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iT0ZGIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJDb250aW51ZXIgYXZlYyI8L3N0cmluZz4KQEAgLTg1MywxMyArODYyLDE2IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iVlBOIEwyVFAvSVBTZWMgYmFzw6kgc3VyIHVuZSBjbMOpIHByw6ktcGFydGFnw6llIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlZQTiBMMlRQL0lQU2VjIGJhc8OpIHN1ciB1biBjZXJ0aWZpY2F0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iU8OpbGVjdGlvbm5lciB1biBmaWNoaWVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iQXVjdW4gZmljaGllciBzw6lsZWN0aW9ubsOpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUsOpaW5pdGlhbGlzZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iRW52b3llciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iTW9kZSBWb2l0dXJlIGFjdGl2w6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iU8OpbGVjdGlvbm5leiBjZXR0ZSBvcHRpb24gcG91ciBxdWl0dGVyIGxlIG1vZGUgVm9pdHVyZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iUGFydGFnZSBkZSBjb25uZXhpb24gb3UgcG9pbnQgZFwnYWNjw6hzIHNhbnMgZmlsIGFjdGl2w6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUb3VjaGVyIHBvdXIgY29uZmlndXJlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlJldG91ciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IlN1aXZhbnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiJJZ25vcmVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iVXRpbGlzYXRpb24gw6lsZXbDqWUgZGVzIGRvbm7DqWVzIG1vYmlsZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IlRvdWNoZXogcG91ciBlbiBzYXZvaXIgcGx1cyBzdXIgbFwndXRpbGlzYXRpb24gZGVzIGRvbm7DqWVzIG1vYmlsZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IlF1b3RhIGRcJ3V0aWxpc2F0aW9uIGRlcyBkb25uw6llcyBtb2JpbGVzIGTDqXBhc3PDqSI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCmluZGV4IDQ3MzFmMzkuLjU4YTM0ZWIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbApAQCAtNDM2LDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iQ29udHJvbGxhIHF1YW5kbyBpbCBkaXNwb3NpdGl2byBzaSBibG9jY2EsIGNoaWVkZW5kb3RpIGRpIHJlaW5zZXJpcmUgbGEgcGFzc3dvcmQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkNhbmNlbGxhIHR1dHRpIGkgZGF0aSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iRXNlZ3VpIHVuIHJpcHJpc3Rpbm8gZGkgZmFiYnJpY2EsIGVsaW1pbmFuZG8gdHV0dGkgaSB0dW9pIGRhdGkgc2VuemEgY29uZmVybWEuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iQ2FzYSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IkNlbGx1bGFyZSI8L2l0ZW0+CkBAIC01MjksMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4iVWZmaWNpbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiJBbHRybyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJQZXJzb25hbGl6emF0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJ0cmFtaXRlIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdHJhbWl0ZSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+Ikluc2VyaXNjaSBpbCBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+Ikluc2VyaXNjaSBwYXNzd29yZCBwZXIgc2Jsb2NjYXJlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJJbnNlcmlzY2kgUElOIHBlciBzYmxvY2NhcmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJDb2RpY2UgUElOIGVycmF0by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iUGVyIHNibG9jY2FyZSwgcHJlbWkgTWVudSwgcG9pIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik51bWVybyBkaSBlbWVyZ2VuemEiPC9zdHJpbmc+CkBAIC01NDUsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iVG9ybmEgYSBjaGlhbWF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IkNvcnJldHRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJSaXByb3ZhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJSaXByb3ZhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iSW4gY2FyaWNhICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJDYXJpY28uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTksNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IkxhIFNJTSDDqCBibG9jY2F0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJTYmxvY2NvIFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHRlbnRhdGl2aSBkaSBpbnNlcmltZW50byBkZWxsYSBzZXF1ZW56YSBkaSBzYmxvY2NvLiAiXG5cbiJSaXByb3ZhIGZyYSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRpLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+Ijx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHRlbnRhdGl2aSBlcnJhdGkgZGkgaW5zZXJpbWVudG8gZGVsbGEgcGFzc3dvcmQuICJcblxuIlJpcHJvdmEgdHJhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlY29uZGkuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+Ijx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHRlbnRhdGl2aSBlcnJhdGkgZGkgaW5zZXJpbWVudG8gZGVsIFBJTi4gIlxuXG4iUmlwcm92YSB0cmEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2Vjb25kaS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+Ijx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHRlbnRhdGl2aSBkaSBpbnNlcmltZW50byBkZWxsYSBzZXF1ZW56YSBkaSBzYmxvY2NvLiBEb3BvIGFsdHJpIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHRlbnRhdGl2aSBmYWxsaXRpLCB0aSB2ZXJyw6AgY2hpZXN0byBkaSBzYmxvY2NhcmUgaWwgdGVsZWZvbm8gdHJhbWl0ZSBpIGRhdGkgZGkgYWNjZXNzbyBkaSBHb29nbGUuIlxuXG4iUmlwcm92YSBmcmEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2Vjb25kaS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iUmlwcm92YSBmcmEgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNlY29uZGkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJIYWkgZGltZW50aWNhdG8gbGEgc2VxdWVuemE/Ijwvc3RyaW5nPgpAQCAtNzAzLDE1ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJTZWxlemlvbmEgdHV0dG8iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dCAoNDg2MjM1OTMxMTA4ODg5ODg3OCkgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJUYWdsaWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IkNvcGlhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iSW5jb2xsYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iQ29waWEgVVJMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik1ldG9kbyBpbnNlcmltZW50byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJBZ2dpdW5naSBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBhbCBkaXppb25hcmlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iTW9kaWZpY2EgdGVzdG8iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IlNwYXppbyBpbiBlc2F1cmltZW50byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IlNwYXppbyBkaSBhcmNoaXZpYXppb25lIGRlbCB0ZWxlZm9ubyBpbiBlc2F1cmltZW50by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxOSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQW5udWxsYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJBdHRlbnppb25lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJDYXJpY2FtZW50byBpbiBjb3Jzby4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iT04iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJPRkYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkNvbXBsZXRhIGxcJ2F6aW9uZSBjb24iPC9zdHJpbmc+CkBAIC04NTMsMTMgKzg2MiwxNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IlZQTiBMMlRQL0lQU2VjIGJhc2F0YSBzdSBjaGlhdmUgcHJlY29uZGl2aXNhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlZQTiBMMlRQL0lQU2VjIGJhc2F0YSBzdSBjZXJ0aWZpY2F0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IlNjZWdsaSBmaWxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTmVzc3VuIGZpbGUgw6ggc3RhdG8gc2NlbHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVpbXBvc3RhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkludmlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJwcmVmZXJpdGkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJNb2RhbGl0w6AgYXV0b21vYmlsZSBhdHRpdmF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJTZWxlemlvbmEgcGVyIHVzY2lyZSBkYWxsYSBtb2RhbGl0w6AgYXV0b21vYmlsZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iVGV0aGVyaW5nIG9wcHVyZSBob3RzcG90IGF0dGl2byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRvY2NhIHBlciBjb25maWd1cmFyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IkluZGlldHJvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iQXZhbnRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iU2FsdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJVdGlsaXp6byBkYXRpIGNlbGwuIGVsZXZhdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IlRvY2NhIHBlciBpbmZvcm1hemlvbmkgc3VsbFwndXRpbGl6em8gZGF0aSBjZWxsLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTGltaXRlIGRhdGkgY2VsbC4gc3VwZXJhdG8iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbAppbmRleCBhOTYxM2Y0Li43ZGEzMGY3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IuaQuuW4r+mbu+ipseOBruODreODg+OCr+aZguOCkueuoeeQhuOBl+OBvuOBmeOAguODkeOCueODr+ODvOODieOBruWGjeWFpeWKm+OBjOW/heimgeOBqOOBquOCiuOBvuOBmeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiLjgZnjgbnjgabjga7jg4fjg7zjgr/jgpLmtojljrsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IuWHuuiNt+aZguioreWumuOBq+ODquOCu+ODg+ODiOOBl+OBvuOBmeOAgueiuuiqjeOBquOBl+OBp+ODh+ODvOOCv+OBjOOBmeOBueOBpuWJiumZpOOBleOCjOOBvuOBmeOAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IuiHquWuhSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IuaQuuW4ryI8L2l0ZW0+CkBAIC01MjksMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4i5Yuk5YuZ5YWIIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IuOBneOBruS7liI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiLjgqvjgrnjgr/jg6AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4iPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz7ntYznlLEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPuOAgeabtOaWsOWFgzogPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJQSU7jgrPjg7zjg4njgpLlhaXlipsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IuODreODg+OCr+OCkuino+mZpOOBmeOCi+OBq+OBr+ODkeOCueODr+ODvOODieOCkuWFpeWKmyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4i44Ot44OD44Kv44KS6Kej6Zmk44GZ44KL44Gr44GvUElO44KS5YWl5YqbIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iUElO44Kz44O844OJ44GM5q2j44GX44GP44GC44KK44G+44Gb44KT44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+Ik1FTlXjgIEw44Kt44O844Gn44Ot44OD44Kv6Kej6ZmkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Iue3iuaApemAmuWgseeVquWPtyI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLpgJroqbHjgavmiLvjgosiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiLkuIDoh7TjgZfjgb7jgZfjgZ8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4i44KE44KK55u044GX44Gm44GP44Gg44GV44GEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiLjgoTjgornm7TjgZfjgabjgY/jgaDjgZXjgYQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLlhYXpm7vkuK3vvIg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+77yJIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IuWFhembu+WujOS6huOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU5LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU3jgqvjg7zjg4njga/jg63jg4Pjgq/jgZXjgozjgabjgYTjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJTSU3jgqvjg7zjg4njga7jg63jg4Pjgq/op6PpmaTkuK0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiLjg63jg4Pjgq/op6PpmaTjga7jg5Hjgr/jg7zjg7Pjga88eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPuWbnuOBqOOCguato+OBl+OBj+aMh+WumuOBleOCjOOBpuOBhOOBvuOBm+OCk+OAgiJcblxuIjx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+56eS5b6M44Gr44KC44GG5LiA5bqm5oyH5a6a44GX44Gm44GP44Gg44GV44GE44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4i5YWl5Yqb44GX44Gf44OR44K544Ov44O844OJ44GvPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7lm57jgajjgoLmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgafjgZfjgZ/jgIIiXG5cbiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPuenkuW+jOOBq+OCguOBhuS4gOW6puWFpeWKm+OBl+OBpuOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiLlhaXlipvjgZfjgZ9QSU7jga88eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPuWbnuOBqOOCguato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OBp+OBl+OBn+OAgiJcblxuIjx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+56eS5b6M44Gr44KC44GG5LiA5bqm5YWl5Yqb44GX44Gm44GP44Gg44GV44GE44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiLmjIflrprjgZfjgZ/jg5Hjgr/jg7zjg7Pjga88eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPuWbnuOBqOOCguato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAguOBguOBqDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+5Zue5oyH5a6a44Gr5aSx5pWX44GZ44KL44Go44CB5pC65biv6Zu76Kmx44Gu44Ot44OD44Kv44Gu6Kej6Zmk44GrR29vZ2xl44G444Gu44Ot44Kw44Kk44Oz44GM5b+F6KaB44Gr44Gq44KK44G+44GZ44CCIlxuXG4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz7np5LlvozjgavjgoLjgYbkuIDluqbmjIflrprjgZfjgabjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+56eS5b6M44Gr44KE44KK55u044GX44Gm44GP44Gg44GV44GE44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiLjg5Hjgr/jg7zjg7PjgpLlv5jjgozjgZ/loLTlkIgiPC9zdHJpbmc+CkBAIC03MDMsMTUgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IuOBmeOBueOBpumBuOaKniI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0ICg0ODYyMzU5MzExMDg4ODk4ODc4KSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IuWIh+OCiuWPluOCiiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4i44Kz44OU44O8Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4i6LK844KK5LuY44GRIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJVUkzjgpLjgrPjg5Tjg7wiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4i5YWl5Yqb5pa55rOVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+Iui+nuabuOOBq+OAjDx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz7jgI3jgpLov73liqAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiLjg4bjgq3jgrnjg4jjgpLnt6jpm4YiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IuepuuOBjeWuuemHj+S9juS4iyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IuaQuuW4r+mbu+ipseOBruepuuOBjeWuuemHj+OBjOWwkeOBquOBj+OBquOBo+OBpuOBhOOBvuOBmeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzE5LDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiLjgq3jg6Pjg7Pjgrvjg6siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4i5rOo5oSPIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiLoqq3jgb/ovrzjgb/kuK0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+Ik9OIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iT0ZGIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgpLpgbjmip4iPC9zdHJpbmc+CkBAIC04NTMsMTMgKzg2MiwxNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IkwyVFAvSVBTZWMgVlBO44OZ44O844K544Gu5LqL5YmN5YWx5pyJ6Y21Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IkwyVFAvSVBTZWMgVlBO44OZ44O844K544Gu6Ki85piO5pu4Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4i44OV44Kh44Kk44Or44KS6YG45oqeIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4i44OV44Kh44Kk44Or44GM6YG45oqe44GV44KM44Gm44GE44G+44Gb44KTIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4i44Oq44K744OD44OIIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IumAgeS/oSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4i44GK5rCX44Gr5YWl44KKIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4i6YGL6Lui44Oi44O844OJ44KS5pyJ5Yq544Gr44GZ44KLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IumBi+i7ouODouODvOODieOCkue1guS6huOBmeOCi+OBq+OBr+mBuOaKnuOBl+OBpuOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiLjg4bjgrbjg6rjg7PjgrDjgb7jgZ/jga/jgqLjgq/jgrvjgrnjg53jgqTjg7Pjg4jjgYzmnInlirnjgafjgZkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiLjgr/jg4Pjg5fjgZfjgaboqK3lrprjgZnjgosiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiLmiLvjgosiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiLmrKHjgbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiLjgrnjgq3jg4Pjg5ciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiLjg6Ljg5DjgqTjg6vjg4fjg7zjgr/jga7kvb/nlKjph4/jgYzlopfjgYjjgabjgYTjgb7jgZkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IuOCv+ODg+ODl+OBl+OBpuODouODkOOCpOODq+ODh+ODvOOCv+WIqeeUqOOBruips+e0sOOCkuihqOekuuOBl+OBvuOBmSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4i44Oi44OQ44Kk44Or44OH44O844K/44Gu5Yi26ZmQ44KS6LaF44GI44G+44GX44GfIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKaW5kZXggZDZhYjVhZC4uMTQ0ZWZhMCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCkBAIC00MzYsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiLquLDquLDqsIAg7J6g6rKoIOyeiOydhCDrlYwg7J6R64+Z7ZWY66Ck66m0IOu5hOuwgOuyiO2YuOulvCDri6Tsi5wg7J6F66Cl7ZW07JW8IO2VqeuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4i66qo65OgIOuNsOydtO2EsCDsgq3soJwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+Iuy0iOq4sO2ZlOulvCDsiJjtlontlZjsl6wg66qo65OgIOuNsOydtO2EsOulvCDtmZXsnbjtlZjsp4Ag7JWK6rOgIOyCreygnO2VqeuLiOuLpC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiLsp5EiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiLrqqjrsJTsnbwiPC9pdGVtPgpAQCAtNTI5LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IuyngeyepSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiLquLDtg4AiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4i66ee7Lak7ISk7KCVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+Ijx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+7J2EKOulvCkg7Ya17ZW0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4oPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4g7IKs7JqpKSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IlBJTiDsvZTrk5wg7J6F66ClIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiLsnqDquIjsnYQg7ZW07KCc7ZWY66Ck66m0IOu5hOuwgOuyiO2YuCDsnoXroKUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IuyeoOq4iOydhCDtlbTsoJztlZjroKTrqbQgUElOIOyeheugpSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IlBJTiDsvZTrk5zqsIAg7J6Y66q765CY7JeI7Iq164uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiLsnqDquIjtlbTsoJztlZjroKTrqbQg66mU64m066W8IOuIhOuluCDri6TsnYwgMOydhCDriITrpoXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Iuu5hOyDgSDsoITtmZTrsojtmLgiPC9zdHJpbmc+CkBAIC01NDUsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4i7Ya17ZmU66GcIOuPjOyVhOqwgOq4sCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IuunnuyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4i7KOE7Iah7ZWp64uI64ukLiDri6Tsi5wg7Iuc64+E7ZWY7IS47JqULiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4i7KOE7Iah7ZWp64uI64ukLiDri6Tsi5wg7Iuc64+E7ZW0IOyjvOyEuOyalC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLstqnsoIQg7KSRKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+Iuy2qeyghOuQmOyXiOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTksNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IlNJTSDsubTrk5zqsIAg7J6g6rKoIOyeiOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJTSU0g7Lm065OcIOyeoOq4iO2VtOygnCDspJEuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiLsnqDquIjtlbTsoJwg7Yyo7YS07J2EIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+7ZqMIOyemOuquyDqt7jroLjsirXri4jri6QuICJcblxuIjx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+7LSIIO2bhOyXkCDri6Tsi5wg7Iuc64+E7ZWY7IS47JqULiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+Iuu5hOuwgOuyiO2YuOulvCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPu2ajCDsnpjrqrsg7J6F66Cl7ZaI7Iq164uI64ukLiAiXG5cbiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPuy0iCDtm4Tsl5Ag64uk7IucIOyLnOuPhO2VtCDso7zshLjsmpQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IlBJTuydhCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPu2ajCDsnpjrqrsg7J6F66Cl7ZaI7Iq164uI64ukLiAiXG5cbiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPuy0iCDtm4Tsl5Ag64uk7IucIOyLnOuPhO2VtCDso7zshLjsmpQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiLsnqDquIjtlbTsoJwg7Yyo7YS07J2EIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+7ZqMIOyemOuquyDqt7jroLjsirXri4jri6QuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+7ZqMIOuNlCDsi6TtjKjtlZjrqbQgR29vZ2xlIOuhnOq3uOyduOydhCDthrXtlbQg7Zy064yA7KCE7ZmU66W8IOyeoOq4iO2VtOygnO2VmOuPhOuhnSDsmpTssq3rkKnri4jri6QuICJcblxuIiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPuy0iCDtm4Tsl5Ag64uk7IucIOyLnOuPhO2VmOyEuOyalC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+7LSIIO2bhOyXkCDri6Tsi5wg7Iuc64+E7ZWY7IS47JqULiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4i7Yyo7YS07J2EIOyeiuycvOyFqOuCmOyalD8iPC9zdHJpbmc+CkBAIC03MDMsMTUgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IuuqqOuRkCDshKDtg50iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dCAoNDg2MjM1OTMxMTA4ODg5ODg3OCkgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiLsnpjrnbzrgrTquLAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IuuzteyCrCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+Iuu2meyXrOuEo+q4sCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iVVJMIOuzteyCrCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiLsnoXroKUg67Cp67KVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IuyCrOyghOyXkCBcJzx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cJyDstpTqsIAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiLthY3siqTtirgg7IiY7KCVIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiLsoIDsnqXqs7XqsIQg67aA7KGxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4i7Zy064yA7KCE7ZmUIOyggOyepeqzteqwhOydtCDrtoDsobHtlanri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4i7ZmV7J24Ijwvc3RyaW5nPgpAQCAtNzE5LDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4i7ZmV7J24Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4i7Leo7IaMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IuyjvOydmCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4i66Gc65OcIOykkS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4i7IKs7JqpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4i7IKs7JqpIOyViO2VqCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4i7J6R7JeF7J2EIOyImO2Wie2VoCDrlYwg7IKs7Jqp7ZWY64qUIOyVoO2UjOumrOy8gOydtOyFmCI8L3N0cmluZz4KQEAgLTg1MywxMyArODYyLDE2IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4i7IKs7KCEIOqzteycoCDtgqQg6riw67CYIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IuyduOymneyEnCDquLDrsJggTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiLtjIzsnbwg7ISg7YOdIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4i7YyM7J287J2EIOyEoO2Dne2VmOyngCDslYrslZjsirXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4i7J6s7ISk7KCVIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IuygnOy2nCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4i7KaQ6rKo7LC+6riwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4i7Jq07KCE66qo65OcIOyCrOyaqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiLsmrTsoITrqqjrk5zrpbwg7KKF66OM7ZWY66Ck66m0IOyEoO2Dne2VmOyEuOyalC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4i7YWM642U66eBIOuYkOuKlCDtlavsiqTtjJ8g7IKs7JqpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4i6rWs7ISx7ZWY66Ck66m0IO2EsOy5mO2VmOyEuOyalC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiLrkqTroZwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiLri6TsnYwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiLqsbTrhIjrm7DquLAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiLrhpLsnYAg66qo67CU7J28IOuNsOydtO2EsCDsgqzsmqnrn4kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IuuqqOuwlOydvCDrjbDsnbTthLAg7IKs7Jqp7JeQIOuMgO2VtCDsnpDshLjtnogg7JWM7JWE67O066Ck66m0IO2EsOy5mO2VmOyEuOyalC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IuuqqOuwlOydvCDrjbDsnbTthLAg7KCc7ZWc7J2EIOy0iOqzvO2WiOyKteuLiOuLpC4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbAppbmRleCAwMjFiMjBlLi5iNGFhNjYxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IktvbnRyb2xsZXJlciBuw6VyIGVuaGV0ZW4gbMOlc2VzLiBEdSBtw6Ugc2tyaXZlIGlubiBwYXNzb3JkZXQgcMOlIG55dHQgZm9yIMOlIGzDpXNlIGRlbiBvcHAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IlNsZXR0IGFsbGUgZGF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iVXRmw7hyZXIgdGlsYmFrZXN0aWxsaW5nIHRpbCBmYWJyaWtrc3RhbmRhcmQuIEFsbGUgZGF0YSBzbGV0dGVzIHV0ZW4gdmFyc2VsLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkhqZW1tZW51bW1lciI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmlsIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJBcmJlaWQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iQW5uZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iRWdlbmRlZmluZXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+InZpYSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IHZpYSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IlNrcml2IGlubiBQSU4ta29kZToiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IlNrcml2IGlubiBwYXNzb3JkIGZvciDDpSBsw6VzZSBvcHAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IlNrcml2IGlubiBwZXJzb25saWcga29kZSBmb3Igw6UgbMOlc2Ugb3BwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iR2FsIFBJTi1rb2RlISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJGb3Igw6UgbMOlc2Ugb3BwLCB0cnlrayBww6UgbWVueWtuYXBwZW4gb2cgZGVyZXR0ZXIgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTsO4ZG51bW1lciI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJUaWxiYWtlIHRpbCBzYW10YWxlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iUmlrdGlnISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJCZWtsYWdlciwgcHLDuHYgaWdqZW46Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJQcsO4diBpZ2plbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkxhZGVyICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJGdWxsdCBsYWRldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU5LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0ta29ydGV0IGVyIGzDpXN0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IkzDpXNlciBvcHAgU0lNLWtvcnTigKYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJZb3UgaGF2ZSBpbmNvcnJlY3RseSBkcmF3biB5b3VyIHVubG9jayBwYXR0ZXJuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHRpbWVzLiAiXG5cbiJQbGVhc2UgdHJ5IGFnYWluIGluIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iRHUgaGFyIG9wcGdpdHQgZmVpbCBwYXNzb3JkIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGdhbmdlci4gIlxuXG4iUHLDuHYgaWdqZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IkR1IGhhciBvcHBnaXR0IGZlaWwgcGVyc29ubGlnIGtvZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ2FuZ2VyLiAiXG5cbiJQcsO4diBpZ2plbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IllvdSBoYXZlIGluY29ycmVjdGx5IGRyYXduIHlvdXIgdW5sb2NrIHBhdHRlcm4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGltZXMuIEFmdGVyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IG1vcmUgdW5zdWNjZXNzZnVsIGF0dGVtcHRzLCB5b3Ugd2lsbCBiZSBhc2tlZCB0byB1bmxvY2sgeW91ciBwaG9uZSB1c2luZyB5b3VyIEdvb2dsZSBzaWduLWluLiJcblxuIiBQbGVhc2UgdHJ5IGFnYWluIGluIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlByw7h2IGlnamVuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkdsZW10IG3DuG5zdGVyZXQ/Ijwvc3RyaW5nPgpAQCAtNzAzLDE1ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJNZXJrIGFsdCI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0ICg0ODYyMzU5MzExMDg4ODk4ODc4KSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IktsaXBwIHV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3BpZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJMaW0gaW5uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJLb3BpZXIgVVJMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+IklubmRhdGFtZXRvZGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iTGVnZyDCqzx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz7CuyB0aWwgb3JkbGlzdGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iUmVkaWdlciB0ZWtzdCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iTGl0ZSBwbGFzcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IkRldCBiZWd5bm5lciDDpSBibGkgbGl0ZSBsYWdyaW5nc3BsYXNzIHDDpSB0ZWxlZm9uZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03MTksNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IkF2YnJ5dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJNZXJrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJMYXN0ZXIgaW5uIC4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iUMOlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iQXYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkZ1bGxmw7hyIG1lZCI8L3N0cmluZz4KQEAgLTg1MywxMyArODYyLDE2IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iUGFzc29yZGJhc2VydCBMMlRQL0lQU2VjLVZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJTZXJ0aWZpa2F0YmFzZXJ0IEwyVFAvSVBTZWMtVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iVmVsZyBmaWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJJbmdlbiBmaWwgZXIgdmFsZ3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJUaWxiYWtlc3RpbGwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iU2VuZCBpbm4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaXR0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iQmlsbW9kdXMgZXIgYWt0aXZlcnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iVmVsZyBmb3Igw6UgYXZzbHV0dGUgYmlsbW9kdXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iVGlsa255dG5pbmcgZWxsZXIgdHLDpWRsw7hzIHNvbmUgZXIgYWt0aXYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUcnlrayBmb3Igw6Uga29uZmlndXJlcmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJUaWxiYWtlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iTmVzdGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiJIb3BwIG92ZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJIw7h5IG1vYmlsZGF0YWJydWsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IkJlcsO4ciBmb3Igw6UgbGVzZSBtZXIgb20gYnJ1ayBhdiBtb2JpbGRhdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IkdyZW5zZW4gZm9yIG1vYmlsZGF0YWJydWsgZXIgb3ZlcnNrcmVkZXQiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbAppbmRleCBhNzRkYjJiLi5jYzYwMTAxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkJlaGVyZW4gd2FubmVlciBoZXQgYXBwYXJhYXQgd29yZHQgdmVyZ3JlbmRlbGQsIHdhdCB2ZXJlaXN0IGRhdCB1IGhldCB3YWNodHdvb3JkIG9wbmlldXcgaW52b2VydC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iQWxsZSBnZWdldmVucyB3aXNzZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IkRlIGZhYnJpZWtzaW5zdGVsbGluZ2VuIGhlcnN0ZWxsZW4sIHdhYXJiaWogYWxsZSBnZWdldmVucyB3b3JkZW4gdmVyd2lqZGVyZCB6b25kZXIgYmV2ZXN0aWdpbmcuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iVGh1aXMiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJNb2JpZWwiPC9pdGVtPgpAQCAtNTI5LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IldlcmsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iT3ZlcmlnIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IkFhbmdlcGFzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJ2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJQSU4tY29kZSBpbnZvZXJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iVm9lciBoZXQgd2FjaHR3b29yZCBpbiBvbSB0ZSBvbnRncmVuZGVsZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IlZvZXIgZGUgUElOLWNvZGUgaW4gb20gdGUgb250Z3JlbmRlbGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iT25qdWlzdGUgUElOLWNvZGUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IkRydWsgb3AgXCdNZW51XCcgZW4gdmVydm9sZ2VucyBvcCAwIG9tIHRlIG9udGdyZW5kZWxlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iQWxhcm1udW1tZXIiPC9zdHJpbmc+CkBAIC01NDUsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iVGVydWcgbmFhciBnZXNwcmVrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iSnVpc3QhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IlByb2JlZXIgaGV0IG9wbmlldXciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IlByb2JlZXIgaGV0IG9wbmlldXciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJPcGxhZGVuICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJPcGdlbGFkZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTksNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IlNJTS1rYWFydCBpcyB2ZXJncmVuZGVsZC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJTSU0ta2FhcnQgb250Z3JlbmRlbGVuLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iVSBoZWVmdCB1dyBvbnRncmVuZGVsaW5nc3BhdHJvb24gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2VlciBvbmp1aXN0IGdldGVrZW5kLiAiXG5cbiJQcm9iZWVyIGhldCBvdmVyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlY29uZGVuIG9wbmlldXcuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iVSBoZWVmdCB1dyB3YWNodHdvb3JkIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtlZXIgb25qdWlzdCBpbmdldm9lcmQuICJcblxuIlByb2JlZXIgaGV0IG92ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2Vjb25kZW4gb3BuaWV1dy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iVSBoZWVmdCB1dyBQSU4tY29kZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrZWVyIG9uanVpc3QgaW5nZXZvZXJkLiAiXG5cbiJQcm9iZWVyIGhldCBvdmVyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlY29uZGVuIG9wbmlldXcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJVIGhlZWZ0IHV3IG9udGdyZW5kZWxpbmdzcGF0cm9vbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrZWVyIG9uanVpc3QgZ2V0ZWtlbmQuIE5hIG5vZyBlZW5zIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IG1pc2x1a3RlIHBvZ2luZ2VuLCB3b3JkdCB1IGdldnJhYWdkIG9tIHV3IHRlbGVmb29uIHRlIG9udGdyZW5kZWxlbiBtZXQgdXcgR29vZ2xlIGFhbm1lbGRpbmcuIlxuXG4iIFByb2JlZXIgaGV0IG92ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2Vjb25kZW4gb3BuaWV1dy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iUHJvYmVlciBoZXQgb3ZlciA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2Vjb25kZW4gb3BuaWV1dy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IlBhdHJvb24gdmVyZ2V0ZW4/Ijwvc3RyaW5nPgpAQCAtNzAzLDE1ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJBbGxlcyBzZWxlY3RlcmVuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHQgKDQ4NjIzNTkzMTEwODg4OTg4NzgpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iS25pcHBlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iS29wacOrcmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iUGxha2tlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iVVJMIGtvcGnDq3JlbiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJJbnZvZXJtZXRob2RlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IlwnPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwnIHRvZXZvZWdlbiBhYW4gd29vcmRlbmJvZWsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJUZWtzdCBiZXdlcmtlbiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iV2VpbmlnIHJ1aW10ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+Ik9wc2xhZ3J1aW10ZSB2YW4gdGVsZWZvb24gcmFha3Qgb3AuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03MTksNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IkFubnVsZXJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJMZXQgb3AiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkxhZGVuLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJBQU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJVSVQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkFjdGllIHZvbHRvb2llbiBtZXQiPC9zdHJpbmc+CkBAIC04NTMsMTMgKzg2MiwxNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IlZvb3JhZiBnZWRlZWxkZSBzbGV1dGVsIG9wIGJhc2lzIHZhbiBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJDZXJ0aWZpY2FhdCBvcCBiYXNpcyB2YW4gTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJCZXN0YW5kIGtpZXplbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IkdlZW4gYmVzdGFuZCBnZXNlbGVjdGVlcmQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJPcG5pZXV3IGluc3RlbGxlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJWZXJ6ZW5kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaWV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iQXV0b21vZHVzIGluZ2VzY2hha2VsZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJTZWxlY3RlZXIgZGl0IG9tIGRlIGF1dG9tb2R1cyBhZiB0ZSBzbHVpdGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJUZXRoZXJpbmcgb2YgaG90c3BvdCBhY3RpZWYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJBYW5yYWtlbiBvbSB0ZSBjb25maWd1cmVyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJWb3JpZ2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJWb2xnZW5kZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+Ik92ZXJzbGFhbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+Ikhvb2cgbW9iaWVsIGdlZ2V2ZW5zZ2VicnVpayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iUmFhayBhYW4gdm9vciBtZWVyIGluZm9ybWF0aWUgb3ZlciBtb2JpZWwgZ2VnZXZlbnNnZWJydWlrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJNb2JpZWxlIGdlZ2V2ZW5zbGltaWV0IG92ZXJzY2hyZWRlbiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCmluZGV4IGY1ZWQ1MGM4Li5hOTY1MzE2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IktvbnRyb2x1amUsIGtpZWR5IHVyesSFZHplbmllIGplc3QgYmxva293YW5lLCB3eW1hZ2FqxIVjIHBvbm93bmVnbyB3cHJvd2FkemVuaWEgaGFzxYJhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJVc3XFhCB3c3p5c3RraWUgZGFuZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iV3lrb251amUgcmVzZXQgZmFicnljem55LCB1c3V3YWrEhWMgd3N6eXN0a2llIGRhbmUgdcW8eXRrb3duaWthIGJleiDFvGFkbmVnbyBwb3R3aWVyZHplbmlhLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkRvbSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IktvbcOzcmthIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJTxYJ1xbxib3d5Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IklubnkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iTmllc3RhbmRhcmRvd3kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4icHJ6ZXogPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiBwcnpleiA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+Ildwcm93YWTFuiBrb2QgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJXcHJvd2FkxbogaGFzxYJvLCBhYnkgb2RibG9rb3dhxIciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+Ildwcm93YWTFuiBrb2QgUElOLCBhYnkgb2RibG9rb3dhxIciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJCxYLEmWRueSBrb2QgUElOISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJBYnkgb2RibG9rb3dhxIcsIG5hY2nFm25paiBNZW51LCBhIG5hc3TEmXBuaWUgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTnVtZXIgYWxhcm1vd3kiPC9zdHJpbmc+CkBAIC01NDUsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iUG93csOzdCBkbyBwb8WCxIVjemVuaWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJQb3ByYXduaWUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+Ik5pZXN0ZXR5LCBzcHLDs2J1aiBwb25vd25pZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iU3Byw7NidWogcG9ub3duaWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLFgWFkb3dhbmllICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJOYcWCYWRvd2FueS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iS2FydGEgU0lNIGplc3QgemFibG9rb3dhbmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iT2RibG9rb3d5d2FuaWUga2FydHkgU0lNLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iV3rDs3Igb2RibG9rb3dhbmlhIHpvc3RhxYIgbmllcHJhd2lkxYJvd28gbmFyeXNvd2FueSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiByYXp5LiAiXG5cbiJTcHLDs2J1aiBwb25vd25pZSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iSGFzxYJvIHpvc3RhxYJvIG5pZXByYXdpZMWCb3dvIHdwcm93YWR6b25lIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHJhenkuICJcblxuIlNwcsOzYnVqIHBvbm93bmllIHphIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHMuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+Ik5pZXBvcHJhd25pZSB3cHJvd2Fkem9ubyBrb2QgUElOIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHJhenkuICJcblxuIlNwcsOzYnVqIHBvbm93bmllIHphIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJXesOzciBvZGJsb2tvd2FuaWEgem9zdGHFgiBuYXJ5c293YW55IG5pZXByYXdpZMWCb3dvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHJhenkuIFBvIGtvbGVqbnljaCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBuaWV1ZGFueWNoIHByw7NiYWNoIHRlbGVmb24gdHJ6ZWJhIGLEmWR6aWUgb2RibG9rb3dhxIcgcHJ6ZXogemFsb2dvd2FuaWUgbmEga29uY2llIEdvb2dsZS4iXG5cbiIgU3Byw7NidWogcG9ub3duaWUgemEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2VrdW5kLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJTcHLDs2J1aiBwb25vd25pZSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2VrdW5kLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iWmFwb21uaWHFgmXFmyB3em9ydT8iPC9zdHJpbmc+CkBAIC03MDMsMTUgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+Ilphem5hY3ogd3N6eXN0a28iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dCAoNDg2MjM1OTMxMTA4ODg5ODg3OCkgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJXeXRuaWoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IktvcGl1aiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IldrbGVqIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJLb3BpdWogYWRyZXMgVVJMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik1ldG9kYSB3cHJvd2FkemFuaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iRG9kYWogdGVybWluIOKAnjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz7igJ0gZG8gc8WCb3duaWthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iRWR5dHVqIHRla3N0Ijwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJNYcWCbyBtaWVqc2NhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iTWFsZWplIGlsb8WbxIcgZG9zdMSZcG5laiBwYW1pxJljaSB0ZWxlZm9udS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxOSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQW51bHVqIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IlV3YWdhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJXY3p5dHl3YW5pZS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iV8WCxIVjeiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+Ild5xYLEhWN6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJaYWtvxYRjeiBjenlubm/Fm8SHIGtvcnp5c3RhasSFYyB6Ijwvc3RyaW5nPgpAQCAtODUzLDEzICs4NjIsMTYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJTaWXEhyBWUE4gTDJUUC9JUFNlYyB6IGtsdWN6ZW0gUFNLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlNpZcSHIFZQTiBMMlRQL0lQU2VjIHogY2VydHlmaWthdGVtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iV3liaWVyeiBwbGlrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTmllIHd5YnJhbm8gcGxpa3UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJSZXNldHVqIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IlByemXFm2xpaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4idWx1YmlvbmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJUcnliIHNhbW9jaG9kb3d5IHfFgsSFY3pvbnkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iV3liaWVyeiwgYWJ5IHpha2/FhGN6ecSHIHRyeWIgc2Ftb2Nob2Rvd3kuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+Ikplc3QgYWt0eXduZSBwb3dpxIV6YW5pZSBsdWIgcHVua3QgZG9zdMSZcHUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJEb3RrbmlqLCBhYnkgc2tvbmZpZ3Vyb3dhxIciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJXcsOzxIciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJEYWxlaiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+IlBvbWnFhCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+Ild5c29raSBwb3ppb20gdcW8eWNpYSBkYW55Y2giPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IkRvdGtuaWosIGFieSB6b2JhY3p5xIcgc3RhdHlzdHlraSBwcnplc3nFgnUgZGFueWNoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJQcnpla3JvY3pvbm8gbGltaXQgZGFueWNoIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbAppbmRleCA3OTE0YTNkLi4zNjBiOTExIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbApAQCAtNDM2LDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iQ29udHJvbGUgcXVhbmRvIG8gZGlzcG9zaXRpdm8gw6kgYmxvcXVlYWRvLCBzZW5kbyBuZWNlc3PDoXJpbyByZWludHJvZHV6aXIgYSByZXNwZWN0aXZhIHBhbGF2cmEtcGFzc2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkFwYWdhciB0b2RvcyBvcyBkYWRvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iRWZlY3R1ZSB1bWEgcmVwb3Npw6fDo28gZGUgZsOhYnJpY2EsIGVsaW1pbmFuZG8gdG9kb3Mgb3MgZGFkb3Mgc2VtIHF1YWxxdWVyIGNvbmZpcm1hw6fDo28uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iUmVzaWTDqm5jaWEiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJNw7N2ZWwiPC9pdGVtPgpAQCAtNTI5LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IkVtcHJlZ28iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iT3V0cm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iUGVyc29uYWxpemFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJhdHJhdsOpcyBkbyA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IGF0cmF2w6lzIGRlIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iSW50cm9kdXppciBjw7NkaWdvIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iSW50cm9kdXphIGEgcGFsYXZyYS1wYXNzZSBwYXJhIGRlc2Jsb3F1ZWFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJJbnRyb2R1emEgbyBQSU4gcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkPDs2RpZ28gUElOIGluY29ycmVjdG8hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlBhcmEgZGVzYmxvcXVlYXIsIHByaW1hIE1lbnUgZSwgZW0gc2VndWlkYSwgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTsO6bWVybyBkZSBlbWVyZ8OqbmNpYSI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJSZWdyZXNzYXIgw6AgY2hhbWFkYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IkNvcnJlY3RvISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJMYW1lbnRhbW9zLCB0ZW50ZSBub3ZhbWVudGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IkxhbWVudGFtb3MsIHRlbnRlIG5vdmFtZW50ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkEgY2FycmVnYXIgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNhcnJlZ2Fkby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iTyBjYXJ0w6NvIFNJTSBlc3TDoSBibG9xdWVhZG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iQSBkZXNibG9xdWVhciBjYXJ0w6NvIFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IkVmZWN0dW91IGluY29ycmVjdGFtZW50ZSBvIHNldSBwYWRyw6NvIGRlIGRlc2Jsb3F1ZWlvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlemVzLiAiXG5cbiJUZW50ZSBub3ZhbWVudGUgZGVudHJvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkludHJvZHV6aXUgaW5jb3JyZWN0YW1lbnRlIGEgcGFsYXZyYS1wYXNzZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gIlxuXG4iVGVudGUgbm92YW1lbnRlIGRlbnRybyBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iSW50cm9kdXppdSBpbmNvcnJlY3RhbWVudGUgbyBQSU4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuICJcblxuIlRlbnRlIG5vdmFtZW50ZSBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJFZmVjdHVvdSBpbmNvcnJlY3RhbWVudGUgbyBzZXUgcGFkcsOjbyBkZSBkZXNibG9xdWVpbyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gQXDDs3Mgb3V0cmFzIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHRlbnRhdGl2YXMgc2VtIHN1Y2Vzc28sIHNlci1saGUtw6EgcGVkaWRvIHBhcmEgZGVzYmxvcXVlYXIgbyB0ZWxlZm9uZSB1dGlsaXphbmRvIG8gc2V1IGluw61jaW8gZGUgc2Vzc8OjbyBubyBHb29nbGUuIlxuXG4iIFRlbnRlIG5vdmFtZW50ZSBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlRlbnRlIG5vdmFtZW50ZSBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iRXNxdWVjZXUtc2UgZG8gcGFkcsOjbz8iPC9zdHJpbmc+CkBAIC03MDMsMTUgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlNlbGVjY2lvbmFyIHR1ZG8iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dCAoNDg2MjM1OTMxMTA4ODg5ODg3OCkgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJDb3J0YXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IkNvcGlhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IkNvbGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJDb3BpYXIgVVJMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik3DqXRvZG8gZGUgZW50cmFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJBZGljaW9uYXIgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgYW8gZGljaW9uw6FyaW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJFZGl0YXIgdGV4dG8iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IlBvdWNvIGVzcGHDp28gbGl2cmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJPIGVzcGHDp28gZGUgYXJtYXplbmFtZW50byBkbyB0ZWxlZm9uZSBlc3TDoSBhIGZpY2FyIHJlZHV6aWRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzE5LDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJDYW5jZWxhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJBdGVuw6fDo28iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkEgY2FycmVnYXIuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IkFjdGl2YWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iRGVzYWN0aXZhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iQ29uY2x1aXIgYWPDp8OjbyB1dGlsaXphbmRvIjwvc3RyaW5nPgpAQCAtODUzLDEzICs4NjIsMTYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJWUE4gTDJUUC9JUFNlYyBiYXNlYWRhIGVtIGNoYXZlIHByw6ktIHBhcnRpbGhhZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iVlBOIEwyVFAvSVBTZWMgYmFzZWFkYSBlbSBjZXJ0aWZpY2FkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IkVzY29saGVyIGZpY2hlaXJvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTsOjbyBmb2kgc2VsZWNjaW9uYWRvIG5lbmh1bSBmaWNoZWlybyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlJlcG9yIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkVudmlhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJNb2RvIGF1dG9tw7N2ZWwgYWN0aXZhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iU2VsZWNjaW9uYXIgcGFyYSBzYWlyIGRvIG1vZG8gYXV0b23Ds3ZlbC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iTGlnYcOnw6NvIHBvbnRvIGEgcG9udG8gb3UgaG90c3BvdCBhY3Rpdm9zIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVG9jYXIgcGFyYSBjb25maWd1cmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iQW50ZXJpb3IiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJTZWd1aW50ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+Iklnbm9yYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJVdGlsaXphw6fDo28gZWxldmFkYSBkZSBkYWRvcyBtw7N2ZWlzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJUb3F1ZSBwYXJhIHNhYmVyIG1haXMgc29icmUgYSB1dGlsaXphw6fDo28gZGUgZGFkb3MgbcOzdmVpcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTGltaXRlIGRlIGRhZG9zIG3Ds3ZlaXMgZXhjZWRpZG8iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbAppbmRleCBjOWM3OTJlLi5kYzVlZTE0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKQEAgLTQzNiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNvbnRyb2xhIG8gYmxvcXVlaW8gZG8gYXBhcmVsaG8sIGV4aWdpbmRvIHF1ZSBhIHNlbmhhIHNlamEgZGlnaXRhZGEgbm92YW1lbnRlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJBcGFnYXIgdG9kb3Mgb3MgZGFkb3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IkV4ZWN1dGUgdW1hIHJlZGVmaW5pw6fDo28gZGUgZsOhYnJpY2EsIGV4Y2x1aW5kbyB0b2RvcyBvcyBzZXVzIGRhZG9zIHNlbSBxdWFscXVlciBjb25maXJtYcOnw6NvLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IlJlc2lkZW5jaWFsIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iQ2VsdWxhciI8L2l0ZW0+CkBAIC01MjksMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4iQ29tZXJjaWFsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+Ik91dHJvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJQZXJzb25hbGl6YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+InBvciBtZWlvIGRlIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iRGlnaXRlIG8gY8OzZGlnbyBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IkRpZ2l0ZSBhIHNlbmhhIHBhcmEgZGVzYmxvcXVlYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IkRpZ2l0ZSBvIFBJTiBwYXJhIGRlc2Jsb3F1ZWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iQ8OzZGlnbyBQSU4gaW5jb3JyZXRvISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJQYXJhIGRlc2Jsb3F1ZWFyLCBwcmVzc2lvbmUgTWVudSBlLCBlbSBzZWd1aWRhLCAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7ptZXJvIGRlIGVtZXJnw6puY2lhIjwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlJldG9ybmFyIMOgIGNoYW1hZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJDb3JyZXRvISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJUZW50ZSBub3ZhbWVudGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IlRlbnRlIG5vdmFtZW50ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkNhcnJlZ2FuZG8gKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNhcnJlZ2Fkby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1OSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iTyBjYXJ0w6NvIFNJTSBlc3TDoSBibG9xdWVhZG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iRGVzYmxvcXVlYW5kbyBvIGNhcnTDo28gU0lN4oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iVm9jw6ogZGVzZW5ob3UgaW5jb3JyZXRhbWVudGUgbyBzZXUgcGFkcsOjbyBkZSBkZXNibG9xdWVpbyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gIlxuXG4iVGVudGUgbm92YW1lbnRlIGVtIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IlZvY8OqIGluc2VyaXUgaW5jb3JyZXRhbWVudGUgYSBzdWEgc2VuaGEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuICJcblxuIlRlbnRlIG5vdmFtZW50ZSBlbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iVm9jw6ogZGlnaXRvdSBpbmNvcnJldGFtZW50ZSBvIHNldSBQSU4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuICJcblxuIlRlbnRlIG5vdmFtZW50ZSBlbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IlZvY8OqIGRlc2VuaG91IG8gc2V1IHBhZHLDo28gZGUgZGVzYmxvcXVlaW8gaW5jb3JyZXRhbWVudGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuIE1haXMgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZhcyBpbmNvcnJldGFzIGUgdm9jw6ogcmVjZWJlcsOhIHVtYSBzb2xpY2l0YcOnw6NvIHBhcmEgZGVzYmxvcXVlYXIgbyBzZXUgdGVsZWZvbmUgdXNhbmRvIG8gc2V1IGxvZ2luIGRvIEdvb2dsZS4iXG5cbiIgVGVudGUgbm92YW1lbnRlIGVtIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJUZW50ZSBub3ZhbWVudGUgZW0gPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iRXNxdWVjZXUgbyBwYWRyw6NvPyI8L3N0cmluZz4KQEAgLTcwMywxNSArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iU2VsZWNpb25hciB0dWRvIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHQgKDQ4NjIzNTkzMTEwODg4OTg4NzgpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iUmVjb3J0YXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IkNvcGlhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IkNvbGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJDb3BpYXIgVVJMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik3DqXRvZG8gZGUgZW50cmFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJBZGljaW9uYXIgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgYW8gZGljaW9uw6FyaW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJFZGl0YXIgdGV4dG8iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IlBvdWNvIGVzcGHDp28iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJPIGVzcGHDp28gZGUgYXJtYXplbmFtZW50byBkbyB0ZWxlZm9uZSBlc3TDoSBmaWNhbmRvIGJhaXhvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzE5LDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJDYW5jZWxhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJBdGVuw6fDo28iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkNhcnJlZ2FuZG8uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IkFUSVZBRE8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJERVNBVElWQURPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJDb21wbGV0ZSBhIGHDp8OjbyB1c2FuZG8iPC9zdHJpbmc+CkBAIC04NTMsMTMgKzg2MiwxNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IlZQTiBMMlRQL0lQU2VjIGNvbSBiYXNlIGVtIGNoYXZlIHByw6ktY29tcGFydGlsaGFkYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJWUE4gTDJUUC9JUFNlYyBjb20gYmFzZSBlbSBjZXJ0aWZpY2FkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IkVzY29saGVyIGFycXVpdm8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJOZW5odW0gYXJxdWl2byBlc2NvbGhpZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJSZWRlZmluaXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iRW52aWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJmYXZvcml0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+Ik1vZG8gZGUgY2Fycm8gYXRpdmFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJTZWxlY2lvbmUgcGFyYSBzYWlyIGRvIG1vZG8gZGUgY2Fycm8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IlbDrW5jdWxvIG91IHBvbnRvIGRlIGFjZXNzbyBhdGl2byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRvcXVlIHBhcmEgY29uZmlndXJhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlZvbHRhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IkF2YW7Dp2FyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iSWdub3JhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IkFsdG8gdXNvIGRlIGRhZG9zIGRvIGNlbHVsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IlRvcXVlIHBhcmEgc2FiZXIgbWFpcyBzb2JyZSB1c28gZGUgZGFkb3MgZG8gY2VsdWxhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTGltaXRlIGRlIGRhZG9zIGRvIGNlbHVsYXIgZXhjZWRpZG8iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJtLXJDSC9hcnJheXMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ybS1yQ0gvYXJyYXlzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGU4NjEzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ybS1yQ0gvYXJyYXlzLnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vYXNzZXRzL3Jlcy9hbnkvY29sb3JzLnhtbAorKioKKyoqIENvcHlyaWdodCAyMDEwLCBHb29nbGUgSW5jLgorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8cmVzb3VyY2VzPgorCisgICAgPCEtLSBEbyBub3QgdHJhbnNsYXRlLiAtLT4KKyAgICA8aW50ZWdlci1hcnJheSBuYW1lPSJtYXBzX3N0YXJ0aW5nX2xhdF9sbmciPgorICAgICAgICA8aXRlbT40Njk0ODAyMDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+NzQ0ODIwNjwvaXRlbT4KKyAgICA8L2ludGVnZXItYXJyYXk+CisgICAgPCEtLSBEbyBub3QgdHJhbnNsYXRlLiAtLT4KKyAgICA8aW50ZWdlci1hcnJheSBuYW1lPSJtYXBzX3N0YXJ0aW5nX3pvb20iPgorICAgICAgICA8aXRlbT40PC9pdGVtPgorICAgIDwvaW50ZWdlci1hcnJheT4KKworPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJtL2Rvbm90dHJhbnNsYXRlLWNsZHIueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ybS9kb25vdHRyYW5zbGF0ZS1jbGRyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjlmOWRiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ybS9kb25vdHRyYW5zbGF0ZS1jbGRyLnhtbApAQCAtMCwwICsxLDE2NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9qYW51YXJ5Ij5zY2hhbmVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3N0YW5kYWxvbmVfZmVicnVhcnkiPmZhdnJlcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX21hcmNoIj5tYXJzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3N0YW5kYWxvbmVfYXByaWwiPmF2cmlnbDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX21heSI+bWF0Zzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX2p1bmUiPnplcmNsYWR1cjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX2p1bHkiPmZhbmFkdXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9hdWd1c3QiPmF2dXN0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3N0YW5kYWxvbmVfc2VwdGVtYmVyIj5zZXR0ZW1iZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9vY3RvYmVyIj5vY3RvYmVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3N0YW5kYWxvbmVfbm92ZW1iZXIiPm5vdmVtYmVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3N0YW5kYWxvbmVfZGVjZW1iZXIiPmRlY2VtYmVyPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfamFudWFyeSI+c2NoYW5lcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19mZWJydWFyeSI+ZmF2cmVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX21hcmNoIj5tYXJzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX2FwcmlsIj5hdnJpZ2w8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfbWF5Ij5tYXRnPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX2p1bmUiPnplcmNsYWR1cjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19qdWx5Ij5mYW5hZHVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX2F1Z3VzdCI+YXZ1c3Q8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc2VwdGVtYmVyIj5zZXR0ZW1iZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfb2N0b2JlciI+b2N0b2Jlcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19ub3ZlbWJlciI+bm92ZW1iZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfZGVjZW1iZXIiPmRlY2VtYmVyPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9qYW51YXJ5Ij5zY2hhbi48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9mZWJydWFyeSI+ZmF2ci48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9tYXJjaCI+bWFyczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX2FwcmlsIj5hdnIuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1fbWF5Ij5tYXRnPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1fanVuZSI+emVyY2wuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1fanVseSI+ZmFuLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX2F1Z3VzdCI+YXZ1c3Q8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9zZXB0ZW1iZXIiPnNldHQuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1fb2N0b2JlciI+b2N0Ljwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX25vdmVtYmVyIj5ub3YuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1fZGVjZW1iZXIiPmRlYy48L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfc2hvcnRlc3RfamFudWFyeSI+Uzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfc2hvcnRlc3RfZmVicnVhcnkiPkY8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X21hcmNoIj5NPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9hcHJpbCI+QTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfc2hvcnRlc3RfbWF5Ij5NPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9qdW5lIj5aPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9qdWx5Ij5GPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9hdWd1c3QiPkE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X3NlcHRlbWJlciI+Uzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfc2hvcnRlc3Rfb2N0b2JlciI+Tzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfc2hvcnRlc3Rfbm92ZW1iZXIiPk48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X2RlY2VtYmVyIj5EPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9InN1bmRheSI+ZHVtZW5naWE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbmRheSI+Z2xpbmRlc2RpPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0dWVzZGF5Ij5tYXJkaTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0id2VkbmVzZGF5Ij5tZXNlbW5hPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aHVyc2RheSI+Z2lldmdpYTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZnJpZGF5Ij52ZW5kZXJkaTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2F0dXJkYXkiPnNvbmRhPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX2xvbmdfc3VuZGF5Ij5kdW1lbmdpYTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbG9uZ19tb25kYXkiPmdsaW5kZXNkaTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbG9uZ190dWVzZGF5Ij5tYXJkaTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbG9uZ193ZWRuZXNkYXkiPm1lc2VtbmE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX2xvbmdfdGh1cnNkYXkiPmdpZXZnaWE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX2xvbmdfZnJpZGF5Ij52ZW5kZXJkaTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbG9uZ19zYXR1cmRheSI+c29uZGE8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbWVkaXVtX3N1bmRheSI+ZHU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX21lZGl1bV9tb25kYXkiPmdsaTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbWVkaXVtX3R1ZXNkYXkiPm1hPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19tZWRpdW1fd2VkbmVzZGF5Ij5tZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbWVkaXVtX3RodXJzZGF5Ij5naWU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX21lZGl1bV9mcmlkYXkiPnZlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19tZWRpdW1fc2F0dXJkYXkiPnNvPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0X3N1bmRheSI+ZHU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0X21vbmRheSI+Z2xpPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydF90dWVzZGF5Ij5tYTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRfd2VkbmVzZGF5Ij5tZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRfdGh1cnNkYXkiPmdpZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRfZnJpZGF5Ij52ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRfc2F0dXJkYXkiPnNvPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0ZXJfc3VuZGF5Ij5EPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydGVyX21vbmRheSI+Rzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlcl90dWVzZGF5Ij5NPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydGVyX3dlZG5lc2RheSI+TTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlcl90aHVyc2RheSI+Rzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlcl9mcmlkYXkiPlY8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0ZXJfc2F0dXJkYXkiPlM8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlc3Rfc3VuZGF5Ij5EPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydGVzdF9tb25kYXkiPkc8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0ZXN0X3R1ZXNkYXkiPk08L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0ZXN0X3dlZG5lc2RheSI+TTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlc3RfdGh1cnNkYXkiPkc8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0ZXN0X2ZyaWRheSI+Vjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlc3Rfc2F0dXJkYXkiPlM8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0ieWVzdGVyZGF5Ij5pZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRvZGF5Ij5vejwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idG9tb3Jyb3ciPmRhbWF1bjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJob3VyX21pbnV0ZV8yNCI+JS1rOiVNPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJob3VyX21pbnV0ZV9hbXBtIj4lLWw6JU0gJXA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImhvdXJfbWludXRlX2NhcF9hbXBtIj4lLWw6JU0gJV5wPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0d2VsdmVfaG91cl90aW1lX2Zvcm1hdCI+aDptbSBhPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0d2VudHlfZm91cl9ob3VyX3RpbWVfZm9ybWF0Ij5IOm1tPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1lcmljX2RhdGUiPiVkLiVtLiVZPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1lcmljX2RhdGVfZm9ybWF0Ij5kZC5NTS55eXl5PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1lcmljX2RhdGVfdGVtcGxhdGUiPiIlcy4lcy4lcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2RheV95ZWFyIj4lLWUuICVCICVZPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmdWxsX2RhdGVfbW9udGhfZmlyc3QiPmQuIE1NTU0geTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZnVsbF9kYXRlX2RheV9maXJzdCI+ZC4gTU1NTSB5PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZWRpdW1fZGF0ZV9tb250aF9maXJzdCI+ZC4gTU1NIHk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lZGl1bV9kYXRlX2RheV9maXJzdCI+ZC4gTU1NIHk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpbWVfb2ZfZGF5Ij4lSDolTTolUzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic3RhdHVzX2Jhcl90aW1lX2Zvcm1hdCI+SEg6bW08L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRhdGVfYW5kX3RpbWUiPiVIOiVNOiVTICVkLiVtLiVZPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXRlX3RpbWUiPiUxJHMsICUyJHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpbWVfZGF0ZSI+JTMkcywgJTEkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWJicmV2X21vbnRoX2RheV95ZWFyIj4lZC4lbS4lWTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfZGF5Ij4lLWUuICVCPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aCI+JS1CPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF95ZWFyIj4lQiAlWTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWJicmV2X21vbnRoX2RheSI+JS1lLiAlYjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWJicmV2X21vbnRoIj4lLWI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFiYnJldl9tb250aF95ZWFyIj4lYiAlWTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGltZTFfdGltZTIiPiUxJHMgLSAlMiRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXRlMV9kYXRlMiI+JTIkcyAtICU1JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfbWQxX21kMiI+JTMkcy4lMiRzLiAtICU4JHMuJTckcy48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfd2RheTFfbWQxX3dkYXkyX21kMiI+JTEkcywgJTMkcy4lMiRzLiAtICU2JHMsICU4JHMuJTckcy48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfbWR5MV9tZHkyIj4lMyRzLiUyJHMuJTQkcyAtICU4JHMuJTckcy4lOSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1lcmljX3dkYXkxX21keTFfd2RheTJfbWR5MiI+JTEkcywgJTMkcy4lMiRzLiU0JHMgLSAlNiRzLCAlOCRzLiU3JHMuJTkkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibnVtZXJpY193ZGF5MV9tZHkxX3RpbWUxX3dkYXkyX21keTJfdGltZTIiPiU1JHMgJTEkcywgJTQkcy0lMiRzLSUzJHMgLSAlMTAkcyAlNiRzLCAlOSRzLSU3JHMtJTgkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibnVtZXJpY19tZDFfdGltZTFfbWQyX3RpbWUyIj4lNSRzICUzJHMuJTIkcy4gLSAlMTAkcyAlOCRzLiU3JHMuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1lcmljX3dkYXkxX21kMV90aW1lMV93ZGF5Ml9tZDJfdGltZTIiPiU1JHMgJTEkcywgJTMkcy4lMiRzLiAtICUxMCRzICU2JHMsICU4JHMuJTckcy48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfbWR5MV90aW1lMV9tZHkyX3RpbWUyIj4lNSRzICUzJHMuJTIkcy4lNCRzIC0gJTEwJHMgJTgkcy4lNyRzLiU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9IndkYXkxX2RhdGUxX3RpbWUxX3dkYXkyX2RhdGUyX3RpbWUyIj4lMyRzICUxJHMgJTIkcyAtICU2JHMgJTQkcyAlNSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ3ZGF5MV9kYXRlMV93ZGF5Ml9kYXRlMiI+JTEkcyAlMiRzIC0gJTQkcyAlNSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXRlMV90aW1lMV9kYXRlMl90aW1lMiI+JTMkcyAlMiRzIC0gJTYkcyAlNSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aW1lX3dkYXlfZGF0ZSI+JTEkcyAlMiRzICUzJHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9IndkYXlfZGF0ZSI+JTIkcyAlMyRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aW1lX3dkYXkiPiUxJHMgJTIkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV95ZWFyX21kMV9tZDIiPiUzJHMuICUyJHMgLSAlOCRzLiAlNyRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX3llYXJfd2RheTFfbWQxX3dkYXkyX21kMiI+JTEkcyAlMyRzLiAlMiRzIC0gJTYkcyAlOCRzLiAlNyRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX3llYXJfbWQxX3RpbWUxX21kMl90aW1lMiI+JTUkcyAlMyRzLiAlMiRzIC0gJTEwJHMgJTgkcy4gJTckczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV9tb250aF9tZDFfdGltZTFfbWQyX3RpbWUyIj4lNSRzICUzJHMuICUyJHMgLSAlMTAkcyAlOCRzLiAlNyRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX3llYXJfd2RheTFfbWQxX3RpbWUxX3dkYXkyX21kMl90aW1lMiI+JTUkcyAlMSRzICUzJHMuICUyJHMgLSAlMTAkcyAlNiRzICU4JHMuICU3JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfbW9udGhfd2RheTFfbWQxX3RpbWUxX3dkYXkyX21kMl90aW1lMiI+JTUkcyAlMSRzICUzJHMuICUyJHMgLSAlMTAkcyAlNiRzICU4JHMuICU3JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfeWVhcl9tZHkxX3RpbWUxX21keTJfdGltZTIiPiU1JHMgJTMkcy4gJTIkcyAlNCRzIC0gJTEwJHMgJTgkcy4gJTckcyAlOSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX21vbnRoX21keTFfdGltZTFfbWR5Ml90aW1lMiI+JTUkcyAlMyRzLiAlMiRzICU0JHMgLSAlMTAkcyAlOCRzLiAlNyRzICU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfeWVhcl93ZGF5MV9tZHkxX3RpbWUxX3dkYXkyX21keTJfdGltZTIiPiU1JHMgJTEkcywgJTMkcy4gJTIkcyAlNCRzIC0gJTEwJHMgJTYkcywgJTgkcy4gJTckcyAlOSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX21vbnRoX3dkYXkxX21keTFfdGltZTFfd2RheTJfbWR5Ml90aW1lMiI+JTUkcyAlMSRzLCAlMyRzLiAlMiRzICU0JHMgLSAlMTAkcyAlNiRzLCAlOCRzLiAlNyRzICU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfbW9udGhfd2RheTFfbWR5MV93ZGF5Ml9tZHkyIj4lMSRzLCAlMyRzLiAlMiRzICU0JHMgLSAlNiRzLCAlOCRzLiAlNyRzICU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfbW9udGhfbWQxX21kMiI+JTMkcy4tJTgkcy4gJTIkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV9tb250aF93ZGF5MV9tZDFfd2RheTJfbWQyIj4lMSRzICUzJHMuICUyJHMgLSAlNiRzICU4JHMuICU3JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfeWVhcl9tZHkxX21keTIiPiUzJHMuICUyJHMgLSAlOCRzLiAlNyRzICU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfbW9udGhfbWR5MV9tZHkyIj4lMyRzLi0lOCRzLiAlMiRzICU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfeWVhcl93ZGF5MV9tZHkxX3dkYXkyX21keTIiPiUxJHMsICUzJHMuICUyJHMgLSAlNiRzLCAlOCRzLiAlNyRzICU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNob3J0X2Zvcm1hdF9tb250aCI+JWI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKaW5kZXggNzg2NTcxYi4uODQwNTc2MCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCkBAIC00MzYsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiLQo9C/0YDQsNCy0LvQtdC90LjQtSDQsdC70L7QutC40YDQvtCy0LrQvtC5INGD0YHRgtGA0L7QudGB0YLQstCwLCDRgtGA0LXQsdGD0Y7RidC10Lkg0LLQstC+0LTQsCDQv9Cw0YDQvtC70Y8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+ItCj0LTQsNC70LjRgtGMINCy0YHQtSDQtNCw0L3QvdGL0LUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+ItCS0YvQv9C+0LvQvdC40YLRjCDRgdCx0YDQvtGBINC6INC90LDRh9Cw0LvRjNC90YvQvCDQvdCw0YHRgtGA0L7QudC60LDQvCDRgSDRg9C00LDQu9C10L3QuNC10Lwg0LLRgdC10YUg0LTQsNC90L3Ri9GFINCx0LXQtyDQt9Cw0L/RgNC+0YHQsCDQv9C+0LTRgtCy0LXRgNC20LTQtdC90LjRjy4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiLQlNC+0LzQsNGI0L3QuNC5IjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4i0JzQvtCx0LjQu9GM0L3Ri9C5IjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiLQoNCw0LHQvtGC0LAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4i0JTRgNGD0LPQvtC1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+ItCh0L7Qt9C00LDRgtGMINGB0LLQvtC5INGP0YDQu9GL0LoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4i0YEg0L/QvtC80L7RidGM0Y4gPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiDRgSDQv9C+0LzQvtGJ0YzRjiA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+ItCS0LLQtdC00LjRgtC1IFBJTi3QutC+0LQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+ItCS0LLQtdC00LjRgtC1INC/0LDRgNC+0LvRjCDQtNC70Y8g0YDQsNC30LHQu9C+0LrQuNGA0L7QstC60LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+ItCS0LLQtdC00LjRgtC1IFBJTi3QutC+0LQg0LTQu9GPINGA0LDQt9Cx0LvQvtC60LjRgNC+0LLQutC4Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4i0J3QtdCy0LXRgNC90YvQuSBQSU4t0LrQvtC0ISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiLQlNC70Y8g0YDQsNC30LHQu9C+0LrQuNGA0L7QstC60Lgg0L3QsNC20LzQuNGC0LUgXCLQnNC10L3RjlwiLCDQsCDQt9Cw0YLQtdC8IDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+ItCt0LrRgdGC0YDQtdC90L3QsNGPINGB0LvRg9C20LHQsCI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLQktC10YDQvdGD0YLRjNGB0Y8g0Log0LLRi9C30L7QstGDIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4i0J/RgNCw0LLQuNC70YzQvdC+ISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiLQn9C+0LLRgtC+0YDQuNGC0LUg0L/QvtC/0YvRgtC60YMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+ItCf0L7QstGC0L7RgNC40YLQtSDQv9C+0L/Ri9GC0LrRgyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+ItCY0LTQtdGCINC30LDRgNGP0LTQutCwICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLQl9Cw0YDRj9C20LXQvdCwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU5LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0t0LrQsNGA0YLQsCDQt9Cw0LHQu9C+0LrQuNGA0L7QstCw0L3QsC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiLQoNCw0LfQsdC70L7QutC40YDQvtCy0LrQsCBTSU0t0LrQsNGA0YLRi+KApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+ItCa0L7Qu9C40YfQtdGB0YLQstC+INC90LXRg9C00LDRh9C90YvRhSDQv9C+0L/Ri9GC0L7QuiDQstCy0L7QtNCwINCz0YDQsNGE0LjRh9C10YHQutC+0LPQviDQutC70Y7Rh9CwINGA0LDQt9Cx0LvQvtC60LjRgNC+0LLQutC4OiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPi4gIlxuXG4i0J/QvtCy0YLQvtGA0LjRgtC1INC/0L7Qv9GL0YLQutGDINGH0LXRgNC10LcgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g0YEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4i0JrQvtC70LjRh9C10YHRgtCy0L4g0L3QtdGD0LTQsNGH0L3Ri9GFINC/0L7Qv9GL0YLQvtC6INCy0LLQvtC00LAg0L/QsNGA0L7Qu9GPOiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPi4gIlxuXG4i0J/QvtCy0YLQvtGA0LjRgtC1INC/0L7Qv9GL0YLQutGDINGH0LXRgNC10LcgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g0YEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+ItCa0L7Qu9C40YfQtdGB0YLQstC+INC90LXRg9C00LDRh9C90YvRhSDQv9C+0L/Ri9GC0L7QuiDQstCy0L7QtNCwIFBJTi3QutC+0LTQsDogPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4uICJcblxuItCf0L7QstGC0L7RgNC40YLQtSDQv9C+0L/Ri9GC0LrRgyDRh9C10YDQtdC3IDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+INGBLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4i0JrQvtC70LjRh9C10YHRgtCy0L4g0L3QtdGD0LTQsNGH0L3Ri9GFINC/0L7Qv9GL0YLQvtC6INCy0LLQvtC00LAg0LPRgNCw0YTQuNGH0LXRgdC60L7Qs9C+INC60LvRjtGH0LAg0YDQsNC30LHQu9C+0LrQuNGA0L7QstC60Lg6IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+LiDQn9C+0YHQu9C1IDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+INC90LXRg9C00LDRh9C90YvRhSDQv9C+0L/Ri9GC0L7QuiDQstCw0Lwg0LHRg9C00LXRgiDQv9GA0LXQtNC70L7QttC10L3QviDRgNCw0LfQsdC70L7QutC40YDQvtCy0LDRgtGMINGC0LXQu9C10YTQvtC9INGBINC/0L7QvNC+0YnRjNGOINGD0YfQtdGC0L3Ri9GFINC00LDQvdC90YvRhSBHb29nbGUuXG4gIlxuXG4iINCf0L7QstGC0L7RgNC40YLQtSDQv9C+0L/Ri9GC0LrRgyDRh9C10YDQtdC3IDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+INGBLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiLQn9C+0LLRgtC+0YDQuNGC0LUg0L/QvtC/0YvRgtC60YMg0YfQtdGA0LXQtyA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4g0YEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiLQl9Cw0LHRi9C70Lgg0LPRgNCw0YTQuNGH0LXRgdC60LjQuSDQutC70Y7Rhz8iPC9zdHJpbmc+CkBAIC03MDMsMTUgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+ItCS0YvQsdGA0LDRgtGMINCy0YHQtSI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0ICg0ODYyMzU5MzExMDg4ODk4ODc4KSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+ItCS0YvRgNC10LfQsNGC0YwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+ItCa0L7Qv9C40YDQvtCy0LDRgtGMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4i0JLRgdGC0LDQstC40YLRjCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4i0JrQvtC/0LjRgNC+0LLQsNGC0YwgVVJMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+ItCh0L/QvtGB0L7QsSDQstCy0L7QtNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+ItCU0L7QsdCw0LLQuNGC0YwgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIg0LIg0YHQu9C+0LLQsNGA0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiLQmNC30LzQtdC90LjRgtGMINGC0LXQutGB0YIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+ItCd0LXQtNC+0YHRgtCw0YLQvtGH0L3QviDQvNC10YHRgtCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4i0JfQsNC60LDQvdGH0LjQstCw0LXRgtGB0Y8g0LzQtdGB0YLQviDQsiDQv9Cw0LzRj9GC0Lgg0YLQtdC70LXRhNC+0L3QsC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiLQntCaIjwvc3RyaW5nPgpAQCAtNzE5LDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4i0J7QmiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+ItCe0YLQvNC10L3QsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiLQktC90LjQvNCw0L3QuNC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiLQl9Cw0LPRgNGD0LfQutCwLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiLQktCa0JsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiLQktCr0JrQmyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4i0KfRgtC+INC40YHQv9C+0LvRjNC30L7QstCw0YLRjD8iPC9zdHJpbmc+CkBAIC04NTMsMTMgKzg2MiwxNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IkwyVFAvSVBTZWMgVlBOICjQvdCwINC+0YHQvdC+0LLQtSDQv9GA0LXQtNCyLiDQvtCx0YkuINC60LvRjtGH0LApIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IkwyVFAvSVBTZWMgVlBOICjQvdCwINC+0YHQvdC+0LLQtSDRgdC10YDRgtC40YTQuNC60LDRgtCwKSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+ItCS0YvQsdGA0LDRgtGMINGE0LDQudC7Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4i0J3QtSDQstGL0LHRgNCw0L0g0YTQsNC50LsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiLQodCx0YDQvtGB0LjRgtGMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+ItCe0YLQv9GA0LDQstC40YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4i0LjQt9Cx0YDQsNC90L3QvtC1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4i0KDQtdC20LjQvCDQs9GA0L7QvNC60L7QuSDRgdCy0Y/Qt9C4INCy0LrQu9GO0YfQtdC9Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+ItCS0YvQsdC10YDQuNGC0LUg0LTQu9GPINCy0YvRhdC+0LTQsCDQuNC3INGA0LXQttC40LzQsCDQs9GA0L7QvNC60L7QuSDRgdCy0Y/Qt9C4LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJVU0It0LzQvtC00LXQvCDQuNC70Lgg0YLQvtGH0LrQsCDQtNC+0YHRgtGD0L/QsCBXaS1GaSDQsNC60YLQuNCy0L3RiyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+ItCd0LDQttC80LjRgtC1INC00LvRjyDQvdCw0YHRgtGA0L7QudC60LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiLQndCw0LfQsNC0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4i0JTQsNC70LXQtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+ItCf0YDQvtC/0YPRgdGC0LjRgtGMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4i0JDQutGC0LjQstC90LDRjyDQv9C10YDQtdC00LDRh9CwINC00LDQvdC90YvRhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4i0J3QsNC20LzQuNGC0LUsINGH0YLQvtCx0Ysg0YPQt9C90LDRgtGMINCx0L7Qu9GM0YjQtSDQviDQvNC+0LHQuNC70YzQvdC+0Lkg0L/QtdGA0LXQtNCw0YfQtSDQtNCw0L3QvdGL0YUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+ItCf0YDQtdCy0YvRiNC10L0g0LvQuNC80LjRgiDQvdCwINC80L7QsdC40LvRjNC90YvQtSDQtNCw0L3QvdGL0LUiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbAppbmRleCA4YTExNTY5Ny4uNDY4MDZhYiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCkBAIC00MzYsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJLb250cm9sbGVyYSBuw6RyIGVuaGV0ZW4gbMOlc2VzLCB2aWxrZXQga3LDpHZlciBhdHQgZHUgYW5nZXIgbMO2c2Vub3JkZXQgaWdlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iUmFkZXJhIGFsbGEgZGF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iw4V0ZXJzdMOkbGwgZmFicmlrc2luc3TDpGxsbmluZ2FybmEgb2NoIHRhIGJvcnQgYWxsYSBkYXRhIHV0YW4gbsOlZ29uIGJla3LDpGZ0ZWxzZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJIZW0iPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJNb2JpbCI8L2l0ZW0+CkBAIC01MjksMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4iQXJiZXRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IsOWdnJpZ3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iQW5wYXNzYWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4idmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iQW5nZSBQSU4ta29kIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJBbmdlIGzDtnNlbm9yZCBmw7ZyIGF0dCBsw6VzYSB1cHAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IkFuZ2UgUElOLWtvZCBmw7ZyIGF0dCBsw6VzYSB1cHAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJGZWwgUElOLWtvZCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iVHJ5Y2sgcMOlIE1lbnUgb2NoIHNlZGFuIHDDpSAwIG9tIGR1IHZpbGwgbMOlc2EgdXBwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7Zkc2FtdGFsc251bW1lciI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLDhXRlcmfDpSB0aWxsIHNhbXRhbGV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iS29ycmVrdCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iRsO2cnPDtmsgaWdlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iRsO2cnPDtmsgaWdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkxhZGRhciAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iTGFkZGFkLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU5LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0ta29ydGV0IMOkciBsw6VzdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJMw6VzZXIgdXBwIFNJTS1rb3J04oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iRHUgaGFyIHJpdGF0IGRpdHQgZ3JhZmlza2EgbMO2c2Vub3JkIGZlbCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnw6VuZ2VyLiAiXG5cbiJGw7Zyc8O2ayBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkR1IGhhciBhbmdldHQgZmVsIGzDtnNlbm9yZCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnw6VuZ2VyLiAiXG5cbiJGw7Zyc8O2ayBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJEdSBoYXIgYW5nZXR0IGRpbiBQSU4ta29kIGZlbCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnw6VuZ2VyLiAiXG5cbiJGw7Zyc8O2ayBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iRHUgaGFyIHJpdGF0IGRpdHQgZ3JhZmlza2EgbMO2c2Vub3JkIGZlbCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnw6VuZ2VyLiBFZnRlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBmw7Zyc8O2ayB0aWxsIGtvbW1lciBkdSBhdHQgdXBwbWFuYXMgYXR0IGzDpXNhIHVwcCB0ZWxlZm9uZW4gbWVkIGRpbiBHb29nbGUtaW5sb2dnbmluZy4iXG5cbiIgRsO2cnPDtmsgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iRsO2cnPDtmsgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJHbMO2bXQgZGl0dCBncmFmaXNrYSBsw7ZzZW5vcmQ/Ijwvc3RyaW5nPgpAQCAtNzAzLDE1ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJWw6RsaiBhbGxhIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHQgKDQ4NjIzNTkzMTEwODg4OTg4NzgpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iS2xpcHAgdXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IktvcGllcmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJLbGlzdHJhIGluIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJLb3BpZXJhIHdlYmJhZHJlc3MiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iSW5kYXRhbWV0b2QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iTMOkZ2cgdGlsbCBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBpIG9yZGxpc3RhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IlJlZGlnZXJhIHRleHQiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IkTDpWxpZ3QgbWVkIHV0cnltbWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJUZWxlZm9uZW5zIGxhZ3JpbmdzdXRyeW1tZSBow6VsbGVyIHDDpSBhdHQgdGEgc2x1dC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxOSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQXZicnl0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+Ik9icyEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkzDpHNlciBpbi4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iUMOFIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iQVYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IlNsdXRmw7ZyIMOldGfDpHJkIGdlbm9tIGF0dCBhbnbDpG5kYSI8L3N0cmluZz4KQEAgLTg1MywxMyArODYyLDE2IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iSSBmw7ZydsOkZyBkZWxhZCBMMlRQL0lQU2VjIFZQTi1ueWNrZWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iQ2VydGlmaWthdHNiYXNlcmFkIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iVsOkbGogZmlsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iSW5nZW4gZmlsIGhhciB2YWx0cyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IsOFdGVyc3TDpGxsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IlNraWNrYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkJpbGzDpGdlIGFrdGl2ZXJhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJWw6RsaiBvbSBkdSB2aWxsIGF2c2x1dGEgYmlsbMOkZ2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkludGVybmV0ZGVsbmluZyBlbGxlciBzdXJmcHVua3QgYWt0aXZlcmFkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVHJ5Y2sgb20gZHUgdmlsbCBrb25maWd1cmVyYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlRpbGxiYWthIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iTsOkc3RhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iSG9wcGEgw7Z2ZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJIw7ZnIG1vYmlsZGF0YWFudsOkbmRuaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJUcnljayBvbSBkdSB2aWxsIHZldGEgbWVyIG9tIG1vYmlsZGF0YWFudsOkbmRuaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJHcsOkbnNlbiBmw7ZyIG1vYmlsZGF0YSBoYXIgw7Z2ZXJza3JpZGl0cyI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCmluZGV4IGI0NWQ1YmIuLmZmZmJjZDcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbApAQCAtNDM2LDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iQ2loYXoga2lsaXRsZW5kacSfaW5kZSwgxZ9pZnJlc2luaSB5ZW5pZGVuIGdpcm1lbml6aSBnZXJla3RpcmVuIGRlbmV0aW0uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IlTDvG0gdmVyaWxlcmkgc2lsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJUw7xtIHZlcmlsZXJpbml6aSBvbmF5IG9sbWFkYW4gc2lsbWVrIGnDp2luIGZhYnJpa2EgYXlhcmxhcsSxbmEgc8SxZsSxcmxhecSxbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJFdiI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmlsIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiLEsMWfIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IkRpxJ9lciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiLDlnplbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiI8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiBhcmFjxLFsxLHEn8SxeWxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiBpbGUgPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IHRhcmloaW5kZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IlBJTiBrb2R1bnUgZ2lyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJLaWxpZGkgYcOnbWFrIGnDp2luIMWfaWZyZXlpIGdpcmluIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJLaWxpZGkgYcOnbWFrIGnDp2luIFBJTlwnaSBnaXJpbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IllhbmzEscWfIFBJTiBrb2R1ISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJLaWxpZGkgYcOnbWFrIGnDp2luIMO2bmNlIE1lbsO8XCd5ZSwgc29ucmEgMFwnYSBiYXPEsW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+IkFjaWwgZHVydW0gbnVtYXJhc8SxIjwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IsOHYcSfcsSxeWEgZMO2biI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IkRvxJ9ydSEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iw5x6Z8O8bsO8eiwgbMO8dGZlbiB5ZW5pZGVuIGRlbmV5aW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+Ik1hYWxlc2VmLCB0ZWtyYXIgZGVuZXlpbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IsWeYXJqIG9sdXlvciAoPHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4ixZ5hcmogb2xkdS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTksNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IlNJTSBrYXJ0IGtpbGl0bGkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iU0lNIGthcnQga2lsaWRpIGHDp8SxbMSxeW9y4oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iS2lsaXQgYcOnbWEgZGVzZW5pbml6aSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrZXogeWFubMSxxZ8gw6dpemRpbml6LiAiXG5cbiJMw7x0ZmVuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNhbml5ZSBpw6dpbmRlIHllbmlkZW4gZGVuZXlpbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiLFnmlmcmVuaXppIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtleiB5YW5sxLHFnyBnaXJkaW5pei4gIlxuXG4iTMO8dGZlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzYW5peWUgacOnaW5kZSB5ZW5pZGVuIGRlbmV5aW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IlBJTlwnaW5pemkgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2V6IHlhbmzEscWfIGdpcmRpbml6LiAiXG5cbiJMw7x0ZmVuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNhbml5ZSBpw6dpbmRlIHllbmlkZW4gZGVuZXlpbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IktpbGl0IGHDp21hIGRlc2VuaW5pemkgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2V6IHlhbmzEscWfIMOnaXpkaW5pei4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gYmHFn2FyxLFzxLF6IGRlbmVtZWRlbiBzb25yYSB0ZWxlZm9udW51enUgR29vZ2xlIG90dXJ1bSBhw6dtYSBiaWxnaWxlcmluaXppIGt1bGxhbmFyYWsgYcOnbWFuxLF6IGlzdGVuaXIuIlxuXG4iIEzDvHRmZW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2FuaXllIGnDp2luZGUgeWVuaWRlbiBkZW5leWluLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2FuaXllIGnDp2luZGUgeWVuaWRlbiBkZW5leWluLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iRGVzZW5pIHVudXR0dW51eiBtdT8iPC9zdHJpbmc+CkBAIC03MDMsMTUgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlTDvG3DvG7DvCBzZcOnIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHQgKDQ4NjIzNTkzMTEwODg4OTg4NzgpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iS2VzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3B5YWxhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iWWFwxLHFn3TEsXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IlVSTFwneWkga29weWFsYSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJHaXJpxZ8gecO2bnRlbWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIga2VsaW1lc2luaSBzw7Z6bMO8xJ9lIGVrbGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJNZXRpbiBkw7x6ZW5sZSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iWWVyIGF6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iVGVsZWZvbnVuIGRlcG9sYW1hIGFsYW7EsSBhemFsxLF5b3IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iVGFtYW0iPC9zdHJpbmc+CkBAIC03MTksNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJUYW1hbSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IsSwcHRhbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJEaWtrYXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IlnDvGtsZW5peW9yLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJBw4dJSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IktBUEFMSSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4ixLDFn2xlbWkgxZ91bnUga3VsbGFuYXJhayB0YW1hbWxhIjwvc3RyaW5nPgpAQCAtODUzLDEzICs4NjIsMTYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJMMlRQL0lQU2VjIFZQTiB0ZW1lbGxpIMO2bmNlZGVuIHBheWxhxZ/EsWxtxLHFnyBhbmFodGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IkwyVFAvSVBTZWMgVlBOIHRlbWVsbGkgc2VydGlmaWthIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iRG9zeWEgc2XDpyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IlNlw6dpbGkgZG9zeWEgeW9rIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iU8SxZsSxcmxhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkfDtm5kZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkFyYWJhIG1vZHUgZXRraW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iQXJhYmEgbW9kdW5kYW4gw6fEsWttYWsgacOnaW4gc2XDp2luLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJEb8SfcnVkYW4gYmHEn2xhbnTEsSB2ZXlhIG9ydGFrIGVyacWfaW0gbm9rdGFzxLEgZXRraW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJZYXDEsWxhbmTEsXJtYWsgacOnaW4gZG9rdW51biI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IkdlcmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiLEsGxlcmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiJBdGxhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iWcO8a3NlayBkw7x6ZXlkZSBtb2JpbCB2ZXJpIGt1bGxhbsSxbcSxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJNb2JpbCB2ZXJpIGt1bGxhbsSxbcSxIGhha2vEsW5kYSBkYWhhIGZhemxhIGJpbGdpIGVkaW5tZWsgacOnaW4gZG9rdW51biI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTW9iaWwgdmVyaSBsaW1pdGkgYcWfxLFsZMSxIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2UvY29uZmlnLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2NvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U1YTI3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2NvbmZpZy54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gVGhlc2UgcmVzb3VyY2VzIGFyZSBhcm91bmQganVzdCB0byBhbGxvdyB0aGVpciB2YWx1ZXMgdG8gYmUgY3VzdG9taXplZAorICAgICBmb3IgZGlmZmVyZW50IGhhcmR3YXJlIGFuZCBwcm9kdWN0IGJ1aWxkcy4gLS0+Cis8cmVzb3VyY2VzIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8IS0tIENvbXBvbmVudCB0byBiZSB1c2VkIGFzIHRoZSBzdGF0dXMgYmFyIHNlcnZpY2UuICBNdXN0IGltcGxlbWVudCB0aGUgSVN0YXR1c0JhcgorICAgICAgICAgaW50ZXJmYWNlLiAgVGhpcyBuYW1lIGlzIGluIHRoZSBDb21wb25lbnROYW1lIGZsYXR0ZW5lZCBmb3JtYXQgKHBhY2thZ2UvY2xhc3MpICAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImNvbmZpZ19zdGF0dXNCYXJDb21wb25lbnQiPmNvbS5hbmRyb2lkLnN5c3RlbXVpL2NvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuVGFibGV0U3RhdHVzQmFyU2VydmljZTwvc3RyaW5nPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19zdGF0dXNCYXJDYW5IaWRlIj5mYWxzZTwvYm9vbD4KKworICAgIDwhLS0gU2hvdyBzbGlkaW5nIHRhYiBiZWZvcmUgbG9ja3NjcmVlbiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfZW5hYmxlU2xpZGluZ1RhYkZpcnN0Ij5mYWxzZTwvYm9vbD4KKyAgICA8IS0tIEVuYWJsZSBsb2Nrc2NyZWVuIHJvdGF0aW9uIC0tPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19lbmFibGVMb2NrU2NyZWVuUm90YXRpb24iPnRydWU8L2Jvb2w+CisKKyAgICA8IS0tIEVuYWJsZXMgM2QgdGFzayBzd2l0Y2hlciBvbiB4bGFyZ2UgZGV2aWNlIC0tPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19lbmFibGVSZWNlbnRBcHBzM0QiPnRydWU8L2Jvb2w+CisKKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9kaW1lbnMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2UvZGltZW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTZmYjVmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2UvZGltZW5zLnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vYXNzZXRzL3Jlcy9hbnkvZGltZW5zLnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8cmVzb3VyY2VzPgorICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2hlaWdodCI+NTBkaXA8L2RpbWVuPgorICAgIDwhLS0gSGVpZ2h0IG9mIHRoZSBzdGF0dXMgYmFyIC0tPgorICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2ljb25fc2l6ZSI+NTBkaXA8L2RpbWVuPgorICAgIDwhLS0gTWFyZ2luIGF0IHRoZSBlZGdlIG9mIHRoZSBzY3JlZW4gdG8gaWdub3JlIHRvdWNoIGV2ZW50cyBmb3IgaW4gdGhlIHdpbmRvd3NoYWRlLiAtLT4KKyAgICA8IS0tIE1hcmdpbiBmb3IgcGVybWFuZW50IHNjcmVlbiBkZWNvcmF0aW9ucyBhdCB0aGUgYm90dG9tLiAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic2NyZWVuX21hcmdpbl9ib3R0b20iPjUwZGlwPC9kaW1lbj4KKyAgICAKKyAgICA8IS0tIERlZmF1bHQgaGVpZ2h0IG9mIGEga2V5IGluIHRoZSBwYXNzd29yZCBrZXlib2FyZCBmb3IgYWxwaGEgLS0+CisgICAgPGRpbWVuIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiPjAuMzVpbjwvZGltZW4+CisgICAgPCEtLSBEZWZhdWx0IGhlaWdodCBvZiBhIGtleSBpbiB0aGUgcGFzc3dvcmQga2V5Ym9hcmQgZm9yIG51bWVyaWMgLS0+CisgICAgPGRpbWVuIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfbnVtZXJpYyI+MC40N2luPC9kaW1lbj4KKworICAgIDwhLS0gVGhlIHdpZHRoIHRoYXQgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIHRodW1ibmFpbHMgb2YgYXBwbGljYXRpb25zLiAtLT4KKyAgICA8ZGltZW4gbmFtZT0idGh1bWJuYWlsX3dpZHRoIj4yNTZkcDwvZGltZW4+CisgICAgPCEtLSBUaGUgaGVpZ2h0IHRoYXQgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIHRodW1ibmFpbHMgb2YgYXBwbGljYXRpb25zLiAtLT4KKyAgICA8ZGltZW4gbmFtZT0idGh1bWJuYWlsX2hlaWdodCI+MjU1ZHA8L2RpbWVuPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjBiZTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vYXNzZXRzL3Jlcy9hbnkvc3RyaW5ncy54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisKKyAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuICBXZWJWaWV3IFVzZXIgQWdlbnQgdGFyZ2V0ZWQgY29udGVudCAtLT4KKyAgICA8c3RyaW5nIG5hbWU9IndlYl91c2VyX2FnZW50X3RhcmdldF9jb250ZW50IiB0cmFuc2xhdGFibGU9ImZhbHNlIj48L3N0cmluZz4KKworPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2Uvc3R5bGVzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL3N0eWxlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3ZGY3YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL3N0eWxlcy54bWwKQEAgLTAsMCArMSwzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPCEtLSBTdGF0dXMgQmFyIFN0eWxlcyAtLT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGw8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRpY2tlciI+CisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRpdGxlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuSWNvbiI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgorICAgIDwvc3R5bGU+CisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgorICAgIDwvc3R5bGU+CisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQuVGl0bGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xOHNwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+Ym9sZDwvaXRlbT4KKyAgICA8L3N0eWxlPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCmluZGV4IDg4YzM4ZTUuLmJmZjgyYjkgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCkBAIC00MzYsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiLmjqfliLbkvZXml7bplIHlrprorr7lpIfvvIzov5npnIDopoHmgqjph43mlrDovpPlhaXlr4bnoIHjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4i5riF6Zmk5omA5pyJ5pWw5o2uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiLmgaLlpI3lh7rljoLorr7nva7vvIzov5nkvJrlnKjkuI3mj5DnpLrnoa7orqTnmoTmg4XlhrXkuIvliKDpmaTmgqjnmoTmiYDmnInmlbDmja7jgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiLkvY/lroUiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiLmiYvmnLoiPC9pdGVtPgpAQCAtNTI5LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IuWFrOWPuCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiLlhbbku5YiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4i6Ieq5a6a5LmJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+IumAmui/hyA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4i5pe26Ze077yaPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+77yM5pa55byP77yaPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiLovpPlhaUgUElOIOeggSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4i6L6T5YWl5a+G56CB6L+b6KGM6Kej6ZSBIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiLovpPlhaUgUElOIOi/m+ihjOino+mUgSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IlBJTiDnoIHkuI3mraPnoa7vvIEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4i6KaB6Kej6ZSB77yM6K+35YWI5oyJIE1FTlUg5YaN5oyJIDDjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4i5oCl5pWR5oiW5oql6K2m55S16K+dIjwvc3RyaW5nPgpAQCAtNTQ1LDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+Iui/lOWbnumAmuivnSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+Iuato+ehru+8gSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiLlvojmirHmrYnvvIzor7fph43or5UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IuW+iOaKseatie+8jOivt+mHjeivlSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+Iuato+WcqOWFheeUtSAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4i5bey5YWF5ruh44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTksNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+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+CkBAIC03MDMsMTUgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IuWFqOmAiSI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0ICg0ODYyMzU5MzExMDg4ODk4ODc4KSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IuWJquWIhyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4i5aSN5Yi2Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4i57KY6LS0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiLlpI3liLbnvZHlnYAiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4i6L6T5YWl5rOVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IuWwhuKAnDx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz7igJ3mt7vliqDliLDor43lhbgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiLnvJbovpHmloflrZciPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IuWtmOWCqOepuumXtOS4jei2syI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IuaJi+acuuWGheWtmOepuumXtOaJgOWJqeS4jeWkmuS6huOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+IuehruWumiI8L3N0cmluZz4KQEAgLTcxOSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+IuehruWumiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IuWPlua2iCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiLms6jmhI8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+Iuato+WcqOi9veWFpS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4i5omT5byAIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4i5YWz6ZetIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiLkvb/nlKjku6XkuIvmlrnlvI/lj5HpgIEiPC9zdHJpbmc+CkBAIC04NTMsMTMgKzg2MiwxNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+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+ivpuaDhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4i5bey6LaF5Ye65omL5py65pWw5o2u5LiK6ZmQIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbAppbmRleCA3ZDNjMjdhLi4zMDBjZjIwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbApAQCAtNDM2LDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4i6KOd572u6Y6W5a6a5pmC5Y+v5Y+W5b6X5o6n5Yi277yM5L2G5b+F6aCI6YeN5paw6Ly45YWl5a+G56K844CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+Iua4hemZpOaJgOacieizh+aWmSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4i6YeN6Kit54K65Y6f5bug6Kit5a6aICjns7vntbHmnIPliKrpmaTmiYDmnInos4fmlpnvvIzkuJTkuI3mnIPlkJHmgqjpgLLooYznorroqo0p44CCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4i5L2P5a626Zu76KmxIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4i6KGM5YuV6Zu76KmxIjwvaXRlbT4KQEAgLTUyOSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiLlhazlj7giPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4i5YW25LuWIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IuiHquiogiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiLpgI/pgY4gPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPumAj+mBjuOAjDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+44CNIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4i6Ly45YWlIFBJTiDnorwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+Iui8uOWFpeWvhueivOWNs+WPr+ino+mOliI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4i6Ly45YWlIFBJTiDpgLLooYzop6PpjpYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJQSU4g56K86Yyv6Kqk77yBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IuWmguimgeino+mOlu+8jOiri+aMiSBNZW51IOmNte+8jOeEtuW+jOaMiSAw44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Iue3iuaApembu+ipseiZn+eivCI8L3N0cmluZz4KQEAgLTU0NSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLov5Tlm57pgJroqbEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiLmraPnorrvvIEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4i5b6I5oqx5q2J77yM6KuL5YaN6Kmm5LiA5qyhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiLlvojmirHmrYnvvIzoq4vlho3oqabkuIDmrKEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLmraPlnKjlhYXpm7sgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IuWFhembu+WujOaIkOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU5LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0g5Y2h5bey6Y6W5a6a44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4i6Kej6Y6WIFNJTSDljaHkuK0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiLnlavlh7rop6PpjpblnJblvaLlt7LpjK/oqqQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4g5qyh44CCIlxuXG4iIOiri+WcqCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDnp5Llvozlho3lmJfoqabjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiLmgqjlt7IgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4g5qyh6Ly45YWl5LiN5q2j56K655qE5a+G56K844CCIlxuXG4i6KuL5pa8IDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IOenkuW+jOWGjeippuS4gOasoeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiLmgqjlt7IgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4g5qyh6Ly45YWl5LiN5q2j56K655qEIFBJTuOAgiJcblxuIuiri+aWvCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDnp5Llvozlho3oqabkuIDmrKHjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IueVq+WHuuino+mOluWcluW9ouW3sumMr+iqpCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiDmrKHjgILlho3pjK/oqqQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g5qyh5b6M77yM57O757Wx5pyD6KaB5rGC5L2/55SoIEdvb2dsZSDnmbvlhaXkvobop6PpjpbjgIIiXG5cbiIg6KuL5ZyoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IOenkuW+jOWGjeippuS4gOasoeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4g56eS5b6M5YaN6Kmm5LiA5qyh44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiLlv5joqJjop6PpjpblnJblvaLvvJ8iPC9zdHJpbmc+CkBAIC03MDMsMTUgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IuWFqOmDqOmBuOWPliI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0ICg0ODYyMzU5MzExMDg4ODk4ODc4KSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IuWJquS4iyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4i6KSH6KO9Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4i6LK85LiKIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiLopIfoo73ntrLlnYAiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4i6Ly45YWl5pa55byPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IuWwh+OAjDx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz7jgI3mlrDlop7oh7PlrZflhbgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiLnt6jovK/mloflrZciPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IuWEsuWtmOepuumWk+WNs+Wwh+S4jei2syI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IuaJi+apn+WEsuWtmOepuumWk+WNs+Wwh+S4jei2s+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+IueiuuWumiI8L3N0cmluZz4KQEAgLTcxOSw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+IueiuuWumiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IuWPlua2iCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiLms6jmhI8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+Iui8ieWFpeS4rS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4i6ZaL5ZWfIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4i6Zec6ZaJIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiLlrozmiJDmk43kvZzpnIDkvb/nlKgiPC9zdHJpbmc+CkBAIC04NTMsMTMgKzg2MiwxNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IuaOoeeUqOmgkOWFiOWFseeUqOmHkemRsOeahCBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiLmjqHnlKjmhpHorYnnmoQgTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiLpgbjmk4fmqpTmoYgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiLmnKrpgbjmk4fku7vkvZXmqpTmoYgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiLph43oqK0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4i5o+Q5LqkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiLmiJHnmoTmnIDmhJsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiLlt7LllZ/nlKjou4rnlKjmqKHlvI8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4i6YG45Y+W57WQ5p2f6LuK55So5qih5byP44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IuaVuOaTmumAo+e3muaIlueEoee3muWfuuWcsOWPsOW3suWVn+eUqCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+Iui8leinuOS7peioreWumiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+Iui/lOWbniI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+Iue5vOe6jCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+IueVpemBjiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IumrmOihjOWLleizh+aWmeeUqOmHjyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4i6LyV6Ke45Y2z5Y+v556t6Kej5pu05aSa5pyJ6Zec6KGM5YuV6LOH5paZ55So6YeP55qE6Kmz57Sw6LOH6KiKIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiLlt7LpgZTooYzli5Xos4fmlpnkuIrpmZAiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2FycmF5cy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2FycmF5cy54bWwKaW5kZXggYWVlZThhZi4uYjYxODc1NiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hcnJheXMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbApAQCAtMTE3LDQgKzExNywxNiBAQAogICAgICAgICA8aXRlbT4zPC9pdGVtPgogICAgIDwvaW50ZWdlci1hcnJheT4KIAorICAgIDwhLS0gVXNlZCBpbiBMb2NhbGVQaWNrZXIgLS0+CisgICAgPHN0cmluZy1hcnJheSB0cmFuc2xhdGFibGU9ImZhbHNlIiBuYW1lPSJzcGVjaWFsX2xvY2FsZV9jb2RlcyI+CisgICAgICAgIDxpdGVtPnpoX0NOPC9pdGVtPgorICAgICAgICA8aXRlbT56aF9UVzwvaXRlbT4KKyAgICA8L3N0cmluZy1hcnJheT4KKworICAgIDwhLS0gVXNlZCBpbiBMb2NhbGVQaWNrZXIgLS0+CisgICAgPHN0cmluZy1hcnJheSB0cmFuc2xhdGFibGU9ImZhbHNlIiBuYW1lPSJzcGVjaWFsX2xvY2FsZV9uYW1lcyI+CisgICAgICAgIDxpdGVtPuS4reaWhyAo566A5L2TKTwvaXRlbT4KKyAgICAgICAgPGl0ZW0+5Lit5paHICjnuYHpq5QpPC9pdGVtPgorICAgIDwvc3RyaW5nLWFycmF5PgorCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRycy54bWwKaW5kZXggMTEzMGI2OS4uYmUyNzUyOCAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRycy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRycy54bWwKQEAgLTE0LDggKzE0LDggQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIAotPCEtLSBGb3JtYXR0aW5nIG5vdGU6IHRlcm1pbmF0ZSBhbGwgY29tbWVudHMgd2l0aCBhIHBlcmlvZCwgdG8gYXZvaWQgYnJlYWtpbmcgCi0gICAgIHRoZSBkb2N1bWVudGF0aW9uIG91dHB1dC4gVG8gc3VwcHJlc3MgY29tbWVudCBsaW5lcyBmcm9tIHRoZSBkb2N1bWVudGF0aW9uIAorPCEtLSBGb3JtYXR0aW5nIG5vdGU6IHRlcm1pbmF0ZSBhbGwgY29tbWVudHMgd2l0aCBhIHBlcmlvZCwgdG8gYXZvaWQgYnJlYWtpbmcKKyAgICAgdGhlIGRvY3VtZW50YXRpb24gb3V0cHV0LiBUbyBzdXBwcmVzcyBjb21tZW50IGxpbmVzIGZyb20gdGhlIGRvY3VtZW50YXRpb24KICAgICAgb3V0cHV0LCBpbnNlcnQgYW4gZWF0LWNvbW1lbnQgZWxlbWVudCBhZnRlciB0aGUgY29tbWVudCBsaW5lcy4KIC0tPgogCkBAIC00Niw2ICs0Niw3IEBACiAgICAgICAgICAgICAgdGhlbWUgZG9lcyBub3Qgc2V0IHRoaXMgdmFsdWUsIG1lYW5pbmcgaXQgaXMgYmFzZWQgb24gd2hldGhlciB0aGUKICAgICAgICAgICAgICB3aW5kb3cgaXMgZmxvYXRpbmcuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJiYWNrZ3JvdW5kRGltRW5hYmxlZCIgZm9ybWF0PSJib29sZWFuIiAvPgorICAgICAgICAKIAogICAgICAgICA8IS0tID09PT09PT09PT09IC0tPgogICAgICAgICA8IS0tIFRleHQgc3R5bGVzIC0tPgpAQCAtOTUsNiArOTYsMTIgQEAKIAogICAgICAgICA8IS0tIFRleHQgY29sb3IgZm9yIHVybHMgaW4gc2VhcmNoIHN1Z2dlc3Rpb25zLCB1c2VkIGJ5IHRoaW5ncyBsaWtlIGdsb2JhbCBzZWFyY2ggYW5kIHRoZSBicm93c2VyLiBAaGlkZSAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0idGV4dENvbG9yU2VhcmNoVXJsIiBmb3JtYXQ9InJlZmVyZW5jZXxjb2xvciIgLz4KKworICAgICAgICA8IS0tIENvbG9yIG9mIGhpZ2hsaWdodGVkIHRleHQsIHdoZW4gdXNlZCBpbiBhIGxpZ2h0IHRoZW1lLiBAaGlkZSAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZSIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CisgICAgICAgIDwhLS0gQ29sb3Igb2YgbGluayB0ZXh0IChVUkxzKSwgd2hlbiB1c2VkIGluIGEgbGlnaHQgdGhlbWUuIEBoaWRlIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0ZXh0Q29sb3JMaW5rSW52ZXJzZSIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CisgICAgICAgIAogICAgICAgICA8IS0tIFNlYXJjaCB3aWRnZXQgbW9yZSBjb3JwdXMgcmVzdWx0IGl0ZW0gYmFja2dyb3VuZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InNlYXJjaFdpZGdldENvcnB1c0l0ZW1CYWNrZ3JvdW5kIiBmb3JtYXQ9InJlZmVyZW5jZXxjb2xvciIgLz4KIApAQCAtMTE3LDEwICsxMjQsMTQgQEAKICAgICAgICAgPCEtLSBUZXh0IGNvbG9yLCB0eXBlZmFjZSwgc2l6ZSwgYW5kIHN0eWxlIGZvciBzeXN0ZW0gc2VhcmNoIHJlc3VsdCBzdWJ0aXRsZS4gRGVmYXVsdHMgdG8gcHJpbWFyeSBpbnZlcnNlIHRleHQgY29sb3IuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ0ZXh0QXBwZWFyYW5jZVNlYXJjaFJlc3VsdFN1YnRpdGxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KIAotCiAgICAgICAgIDwhLS0gVGV4dCBjb2xvciwgdHlwZWZhY2UsIHNpemUsIGFuZCBzdHlsZSBmb3IgdGhlIHRleHQgaW5zaWRlIG9mIGEgYnV0dG9uLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0idGV4dEFwcGVhcmFuY2VCdXR0b24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogCisgICAgICAgIDwhLS0gRWRpdFRleHQgdGV4dCBmb3JlZ3JvdW5kIGNvbG9yLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZWRpdFRleHRDb2xvciIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CisgICAgICAgIDwhLS0gRWRpdFRleHQgYmFja2dyb3VuZCBkcmF3YWJsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImVkaXRUZXh0QmFja2dyb3VuZCIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisKICAgICAgICAgPCEtLSBBIHN0eWxlZCBzdHJpbmcsIHNwZWNpZnlpbmcgdGhlIHN0eWxlIHRvIGJlIHVzZWQgZm9yIHNob3dpbmcKICAgICAgICAgICAgICBpbmxpbmUgY2FuZGlkYXRlIHRleHQgd2hlbiBjb21wb3Npbmcgd2l0aCBhbiBpbnB1dCBtZXRob2QuICBUaGUKICAgICAgICAgICAgICB0ZXh0IGl0c2VsZiB3aWxsIGJlIGlnbm9yZWQsIGJ1dCB0aGUgc3R5bGUgc3BhbnMgd2lsbCBiZSBhcHBsaWVkCkBAIC0xMzcsNiArMTQ4LDkgQEAKICAgICAgICAgPCEtLSBEcmF3YWJsZSB0byB1c2UgZm9yIHNpbmdsZSBjaG9pY2UgaW5kaWNhdG9ycy4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogCisgICAgICAgIDwhLS0gRHJhd2FibGUgdXNlZCBhcyBhIGJhY2tncm91bmQgZm9yIHNlbGVjdGVkIGxpc3QgaXRlbXMuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJsaXN0Q2hvaWNlQmFja2dyb3VuZEluZGljYXRvciIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisKICAgICAgICAgPCEtLSA9PT09PT09PT09PT09IC0tPgogICAgICAgICA8IS0tIEJ1dHRvbiBzdHlsZXMgLS0+CiAgICAgICAgIDwhLS0gPT09PT09PT09PT09PSAtLT4KQEAgLTI0NCw2ICsyNTgsMjggQEAKICAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5SLnN0eWxlYWJsZSNXaW5kb3dBbmltYXRpb259LiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QW5pbWF0aW9uU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogCisgICAgICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyB3aW5kb3cgc2hvdWxkIGhhdmUgYW4gQWN0aW9uIEJhcgorICAgICAgICAgICAgIGluIHBsYWNlIG9mIHRoZSB1c3VhbCB0aXRsZSBiYXIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKworICAgICAgICA8IS0tIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgd2luZG93J3MgQWN0aW9uIEJhciBzaG91bGQgb3ZlcmxheQorICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGNvbnRlbnQuIERvZXMgbm90aGluZyBpZiB0aGUgd2luZG93IHdvdWxkIG5vdAorICAgICAgICAgICAgIGhhdmUgYW4gQWN0aW9uIEJhci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd0FjdGlvbkJhck92ZXJsYXkiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKworICAgICAgICA8IS0tIFJlZmVyZW5jZSB0byBhIHN0eWxlIGZvciB0aGUgQWN0aW9uIEJhciAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QWN0aW9uQmFyU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorCisgICAgICAgIDwhLS0gU2l6ZSBvZiB0aGUgQWN0aW9uIEJhciwgaW5jbHVkaW5nIHRoZSBjb250ZXh0dWFsCisgICAgICAgICAgICAgYmFyIHVzZWQgdG8gcHJlc2VudCBBY3Rpb24gTW9kZXMuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJTaXplIiBmb3JtYXQ9ImRpbWVuc2lvbiIgPgorICAgICAgICAgICAgPGVudW0gbmFtZT0id3JhcF9jb250ZW50IiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgPC9hdHRyPgorCisgICAgICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYWN0aW9uIG1vZGVzIHNob3VsZCBvdmVybGF5IHdpbmRvdyBjb250ZW50CisgICAgICAgICAgICAgd2hlbiB0aGVyZSBpcyBub3QgcmVzZXJ2ZWQgc3BhY2UgZm9yIHRoZWlyIFVJIChzdWNoIGFzIGFuIEFjdGlvbiBCYXIpLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QWN0aW9uTW9kZU92ZXJsYXkiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKwogICAgICAgICA8IS0tIERlZmluZXMgdGhlIGRlZmF1bHQgc29mdCBpbnB1dCBzdGF0ZSB0aGF0IHRoaXMgd2luZG93IHdvdWxkCiAgICAgICAgICAgICAgbGlrZSB3aGVuIGl0IGlzIGRpc3BsYXllZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd1NvZnRJbnB1dE1vZGUiPgpAQCAtMzkwLDYgKzQyNiwxMiBAQAogICAgICAgICA8YXR0ciBuYW1lPSJob3Jpem9udGFsU2Nyb2xsVmlld1N0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBEZWZhdWx0IFNwaW5uZXIgc3R5bGUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzcGlubmVyU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIERlZmF1bHQgZHJvcGRvd24gU3Bpbm5lciBzdHlsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRyb3BEb3duU3Bpbm5lclN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IEFjdGlvbkJhciBkcm9wZG93biBzdHlsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbkRyb3BEb3duU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIERlZmF1bHQgYWN0aW9uIGJ1dHRvbiBzdHlsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbkJ1dHRvblN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBEZWZhdWx0IFN0YXIgc3R5bGUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzdGFyU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgICAgICA8IS0tIERlZmF1bHQgVGFiV2lkZ2V0IHN0eWxlLiAtLT4KQEAgLTQyNiw2ICs0NjgsMjIgQEAKICAgICAgICAgPGF0dHIgbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVNtYWxsV2luZG93TGFyZ2UiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogCiAgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICAgICAgPCEtLSBBY3Rpb24gYmFyIHN0eWxlcyAgIC0tPgorICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgICAgIDxlYXQtY29tbWVudCAvPgorICAgICAgICA8IS0tIERlZmF1bHQgYW1vdW50IG9mIHBhZGRpbmcgdG8gdXNlIGJldHdlZW4gYWN0aW9uIGJ1dHRvbnMuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25CdXR0b25QYWRkaW5nIiBmb3JtYXQ9ImRpbWVuc2lvbiIgLz4KKworICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgICAgIDwhLS0gQWN0aW9uIG1vZGUgc3R5bGVzICAtLT4KKyAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09IC0tPgorICAgICAgICA8ZWF0LWNvbW1lbnQgLz4KKyAgICAgICAgPCEtLSBCYWNrZ3JvdW5kIGRyYXdhYmxlIHRvIHVzZSBmb3IgYWN0aW9uIG1vZGUgVUkgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbk1vZGVCYWNrZ3JvdW5kIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEcmF3YWJsZSB0byB1c2UgZm9yIHRoZSBjbG9zZSBhY3Rpb24gbW9kZSBidXR0b24gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbk1vZGVDbG9zZURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKworICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgICAgIDwhLS0gUHJlZmVyZW5jZSBzdHlsZXMgICAtLT4KICAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09IC0tPgogICAgICAgICA8ZWF0LWNvbW1lbnQgLz4KQEAgLTk2Myw2ICsxMDIxLDExIEBACiAgICAgICAgIDxhdHRyIG5hbWU9InRleHRDb2xvciIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iYmFja2dyb3VuZERpbUVuYWJsZWQiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImJhY2tncm91bmREaW1BbW91bnQiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd0FjdGlvbkJhciIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QWN0aW9uQmFyU3R5bGUiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd0FjdGlvbk1vZGVPdmVybGF5IiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJPdmVybGF5IiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJTaXplIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKICAgICA8IS0tIFRoZSBzZXQgb2YgYXR0cmlidXRlcyB0aGF0IGRlc2NyaWJlIGEgQWxlcnREaWFsb2cncyB0aGVtZS4gLS0+CkBAIC05NzksNiArMTA0MiwxNCBAQAogICAgICAgICA8YXR0ciBuYW1lPSJjZW50ZXJNZWRpdW0iIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8IS0tIEZyYWdtZW50IGFuaW1hdGlvbiBjbGFzcyBhdHRyaWJ1dGVzLiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iRnJhZ21lbnRBbmltYXRpb24iPgorICAgICAgICA8YXR0ciBuYW1lPSJmcmFnbWVudE9wZW5FbnRlckFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImZyYWdtZW50T3BlbkV4aXRBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJmcmFnbWVudENsb3NlRW50ZXJBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJmcmFnbWVudENsb3NlRXhpdEFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKwogICAgIDwhLS0gV2luZG93IGFuaW1hdGlvbiBjbGFzcyBhdHRyaWJ1dGVzLiAtLT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iV2luZG93QW5pbWF0aW9uIj4KICAgICAgICAgPCEtLSBUaGUgYW5pbWF0aW9uIHVzZWQgd2hlbiBhIHdpbmRvdyBpcyBiZWluZyBhZGRlZC4gLS0+CkBAIC05ODksNyArMTA2MCw3IEBACiAgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd1Nob3dBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgICAgICA8IS0tIFRoZSBhbmltYXRpb24gdXNlZCB3aGVuIGEgd2luZG93IGlzIGdvaW5nIGZyb20gVklTSUJMRSB0byBJTlZJU0lCTEUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dIaWRlQW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgCisKICAgICAgICAgPCEtLSAgV2hlbiBvcGVuaW5nIGEgbmV3IGFjdGl2aXR5LCB0aGlzIGlzIHRoZSBhbmltYXRpb24gdGhhdCBpcwogICAgICAgICAgICAgICBydW4gb24gdGhlIG5leHQgYWN0aXZpdHkgKHdoaWNoIGlzIGVudGVyaW5nIHRoZSBzY3JlZW4pLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iYWN0aXZpdHlPcGVuRW50ZXJBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgpAQCAtMTAzMCw3ICsxMTAxLDcgQEAKICAgICAgICAgICAgICAgYW5pbWF0aW9uIHRoYXQgaXMgcnVuIG9uIHRoZSB0b3AgYWN0aXZpdHkgb2YgdGhlIGN1cnJlbnQgdGFzawogICAgICAgICAgICAgICAod2hpY2ggaXMgZXhpdGluZyB0aGUgc2NyZWVuKS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InRhc2tUb0JhY2tFeGl0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgCisKICAgICAgICAgPCEtLSAgV2hlbiBvcGVuaW5nIGEgbmV3IGFjdGl2aXR5IHRoYXQgc2hvd3MgdGhlIHdhbGxwYXBlciwgd2hpbGUKICAgICAgICAgICAgICAgY3VycmVudGx5IG5vdCBzaG93aW5nIHRoZSB3YWxscGFwZXIsIHRoaXMgaXMgdGhlIGFuaW1hdGlvbiB0aGF0CiAgICAgICAgICAgICAgIGlzIHJ1biBvbiB0aGUgbmV3IHdhbGxwYXBlciBhY3Rpdml0eSAod2hpY2ggaXMgZW50ZXJpbmcgdGhlIHNjcmVlbikuIC0tPgpAQCAtMTA0Nyw3ICsxMTE4LDcgQEAKICAgICAgICAgICAgICAgY3VycmVudGx5IHNob3dpbmcgdGhlIHdhbGxwYXBlciwgdGhpcyBpcyB0aGUgYW5pbWF0aW9uIHRoYXQKICAgICAgICAgICAgICAgaXMgcnVuIG9uIHRoZSBvbGQgd2FsbHBhcGVyIGFjdGl2aXR5ICh3aGljaCBpcyBleGl0aW5nIHRoZSBzY3JlZW4pLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0id2FsbHBhcGVyQ2xvc2VFeGl0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgCisKICAgICAgICAgPCEtLSAgV2hlbiBvcGVuaW5nIGEgbmV3IGFjdGl2aXR5IHRoYXQgaXMgb24gdG9wIG9mIHRoZSB3YWxscGFwZXIKICAgICAgICAgICAgICAgd2hlbiB0aGUgY3VycmVudCBhY3Rpdml0eSBpcyBhbHNvIG9uIHRvcCBvZiB0aGUgd2FsbHBhcGVyLAogICAgICAgICAgICAgICB0aGlzIGlzIHRoZSBhbmltYXRpb24gdGhhdCBpcyBydW4gb24gdGhlIG5ldyBhY3Rpdml0eQpAQCAtMTMyNiwxOSArMTM5Nyw2IEBACiAgICAgICAgICAgICAgPGNvZGU+cHVibGljIHZvaWQgc2F5SGVsbG8oVmlldyB2KTwvY29kZT4gbWV0aG9kIG9mIHlvdXIgY29udGV4dAogICAgICAgICAgICAgICh0eXBpY2FsbHksIHlvdXIgQWN0aXZpdHkpLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ib25DbGljayIgZm9ybWF0PSJzdHJpbmciIC8+Ci0KLSAgICAgICAgPCEtLSBEZWZpbmVzIG92ZXJzY3JvbGxpbmcgYmVoYXZpb3IuIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBvbmx5IGlmIHRoZQotICAgICAgICAgICAgIFZpZXcgaXMgc2Nyb2xsYWJsZS4gT3ZlcnNjcm9sbGluZyBpcyB0aGUgYWJpbGl0eSBmb3IgdGhlIHVzZXIgdG8KLSAgICAgICAgICAgICBzY3JvbGwgYSBWaWV3IGJleW9uZCBpdHMgY29udGVudCBib3VuZGFyaWVzIGludG8gZW1wdHkgc3BhY2UuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJvdmVyc2Nyb2xsTW9kZSI+Ci0gICAgICAgICAgICA8IS0tIEFsd2F5cyBhbGxvdyB0aGUgdXNlciB0byBvdmVyc2Nyb2xsIHRoZSBjb250ZW50LiAtLT4KLSAgICAgICAgICAgIDxlbnVtIG5hbWU9ImFsd2F5cyIgdmFsdWU9IjAiIC8+Ci0gICAgICAgICAgICA8IS0tIE9ubHkgYWxsb3cgdGhlIHVzZXIgdG8gb3ZlcnNjcm9sbCBjb250ZW50IGlmIHRoZSBjb250ZW50IGlzIGxhcmdlCi0gICAgICAgICAgICAgICAgIGVub3VnaCB0byBtZWFuaW5nZnVsbHkgc2Nyb2xsLiAtLT4KLSAgICAgICAgICAgIDxlbnVtIG5hbWU9ImlmQ29udGVudFNjcm9sbHMiIHZhbHVlPSIxIiAvPgotICAgICAgICAgICAgPCEtLSBOZXZlciBvdmVyc2Nyb2xsLiAtLT4KLSAgICAgICAgICAgIDxlbnVtIG5hbWU9Im5ldmVyIiB2YWx1ZT0iMiIgLz4KLSAgICAgICAgPC9hdHRyPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKICAgICA8IS0tIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGEge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3R3JvdXB9IG9yIGFueQpAQCAtMTM5OCw2ICsxNDU2LDE3IEBACiAgICAgICAgICAgICA8ZW51bSBuYW1lPSJibG9ja3NEZXNjZW5kYW50cyIgdmFsdWU9IjIiIC8+CiAgICAgICAgIDwvYXR0cj4KIAorICAgICAgICA8IS0tIFNldHMgd2hldGhlciB0aGlzIFZpZXdHcm91cCBzaG91bGQgc3BsaXQgTW90aW9uRXZlbnRzCisgICAgICAgICAgICAgdG8gc2VwYXJhdGUgY2hpbGQgdmlld3MgZHVyaW5nIHRvdWNoIGV2ZW50IGRpc3BhdGNoLgorICAgICAgICAgICAgIElmIGZhbHNlIChkZWZhdWx0KSwgdG91Y2ggZXZlbnRzIHdpbGwgYmUgZGlzcGF0Y2hlZCB0bworICAgICAgICAgICAgIHRoZSBjaGlsZCB2aWV3IHdoZXJlIHRoZSBmaXJzdCBwb2ludGVyIHdlbnQgZG93biB1bnRpbAorICAgICAgICAgICAgIHRoZSBsYXN0IHBvaW50ZXIgZ29lcyB1cC4KKyAgICAgICAgICAgICBJZiB0cnVlLCB0b3VjaCBldmVudHMgbWF5IGJlIGRpc3BhdGNoZWQgdG8gbXVsdGlwbGUgY2hpbGRyZW4uCisgICAgICAgICAgICAgTW90aW9uRXZlbnRzIGZvciBlYWNoIHBvaW50ZXIgd2lsbCBiZSBkaXNwYXRjaGVkIHRvIHRoZSBjaGlsZAorICAgICAgICAgICAgIHZpZXcgd2hlcmUgdGhlIGluaXRpYWwgQUNUSU9OX0RPV04gZXZlbnQgaGFwcGVuZWQuCisgICAgICAgICAgICAgU2VlIHtAbGluayBhbmRyb2lkLnZpZXcuVmlld0dyb3VwI3NldE1vdGlvbkV2ZW50U3BsaXR0aW5nRW5hYmxlZChib29sZWFuKX0KKyAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InNwbGl0TW90aW9uRXZlbnRzIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gQSB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXdTdHVifSBsZXRzIHlvdSBsYXppbHkgaW5jbHVkZSBvdGhlciBYTUwgbGF5b3V0cwpAQCAtMTQ5OSw2ICsxNTY4LDI4IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImlzRGVmYXVsdCIgZm9ybWF0PSJib29sZWFuIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8IS0tIFRoaXMgaXMgdGhlIHN1YnR5cGUgb2YgSW5wdXRNZXRob2QuIFN1YnR5cGUgY2FuIGRlc2NyaWJlIGxvY2FsZXMgKGUuZy4gZW5fVVMsIGZyX0ZSLi4uKQorICAgICAgICAgYW5kIG1vZGVzIChlLmcuIHZvaWNlLCBrZXlib2FyZC4uLiksIGFuZCBpcyB1c2VkIGZvciBJTUUgc3dpdGNoLiBUaGlzIHN1YnR5cGUgYWxsb3dzCisgICAgICAgICB0aGUgc3lzdGVtIHRvIGNhbGwgdGhlIHNwZWNpZmllZCBzdWJ0eXBlIG9mIHRoZSBJTUUgZGlyZWN0bHkuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJJbnB1dE1ldGhvZF9TdWJ0eXBlIj4KKyAgICAgICAgPCEtLSBUaGUgbmFtZSBvZiB0aGUgc3VidHlwZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImxhYmVsIiAvPgorICAgICAgICA8IS0tIFRoZSBpY29uIG9mIHRoZSBzdWJ0eXBlLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaWNvbiIgLz4KKyAgICAgICAgPCEtLSBUaGUgbG9jYWxlIG9mIHRoZSBzdWJ0eXBlLiBUaGlzIHN0cmluZyBzaG91bGQgYmUgYSBsb2NhbGUgKGUuZy4gZW5fVVMsIGZyX0ZSLi4uKQorICAgICAgICAgICAgIGFuZCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgSU1FIHdoZW4gdGhlIGZyYW1ld29yayBjYWxscyB0aGUgSU1FCisgICAgICAgICAgICAgd2l0aCB0aGUgc3VidHlwZS4gVGhpcyBpcyBhbHNvIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBrbm93IHRoZSBzdXBwb3J0ZWQgbG9jYWxlcworICAgICAgICAgICAgIG9mIHRoZSBJTUUuICAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaW1lU3VidHlwZUxvY2FsZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIG1vZGUgb2YgdGhlIHN1YnR5cGUuIFRoaXMgc3RyaW5nIGNhbiBiZSBhIG1vZGUgKGUuZy4gdm9pY2UsIGtleWJvYXJkLi4uKSBhbmQgdGhpcworICAgICAgICAgICAgIHN0cmluZyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgSU1FIHdoZW4gdGhlIGZyYW1ld29yayBjYWxscyB0aGUgSU1FIHdpdGggdGhlCisgICAgICAgICAgICAgc3VidHlwZS4gIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpbWVTdWJ0eXBlTW9kZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIGV4dHJhIHZhbHVlIG9mIHRoZSBzdWJ0eXBlLiBUaGlzIHN0cmluZyBjYW4gYmUgYW55IHN0cmluZyBhbmQgd2lsbCBiZSBwYXNzZWQgdG8KKyAgICAgICAgICAgICB0aGUgSU1FIHdoZW4gdGhlIGZyYW1ld29yayBjYWxscyB0aGUgSU1FIHdpdGggdGhlIHN1YnR5cGUuICAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaW1lU3VidHlwZUV4dHJhVmFsdWUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBXaWRnZXQgcGFja2FnZSBjbGFzcyBhdHRyaWJ1dGVzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTE1NDgsNiArMTYzOSwyOCBAQAogICAgICAgICAgICAgIHdpbGwgdXNlIG9ubHkgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgYWRhcHRlciBhbmQgdGhlIG51bWJlciBvZiBpdGVtcyB2aXNpYmxlCiAgICAgICAgICAgICAgb24gc2NyZWVuIHRvIGRldGVybWluZSB0aGUgc2Nyb2xsYmFyJ3MgcHJvcGVydGllcy4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InNtb290aFNjcm9sbGJhciIgZm9ybWF0PSJib29sZWFuIiAvPgorICAgICAgICA8IS0tIEEgcmVmZXJlbmNlIHRvIGFuIFhNTCBkZXNjcmlwdGlvbiBvZiB0aGUgYWRhcHRlciB0byBhdHRhY2ggdG8gdGhlIGxpc3QuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhZGFwdGVyIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZpbmVzIHRoZSBjaG9pY2UgYmVoYXZpb3IgZm9yIHRoZSB2aWV3LiBCeSBkZWZhdWx0LCBsaXN0cyBkbyBub3QgaGF2ZQorICAgICAgICAgICAgIGFueSBjaG9pY2UgYmVoYXZpb3IuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8gc2luZ2xlQ2hvaWNlLCB0aGUgbGlzdAorICAgICAgICAgICAgIGFsbG93cyB1cCB0byBvbmUgaXRlbSB0byBiZSBpbiBhIGNob3NlbiBzdGF0ZS4gQnkgc2V0dGluZyB0aGUgY2hvaWNlTW9kZSB0bworICAgICAgICAgICAgIG11bHRpcGxlQ2hvaWNlLCB0aGUgbGlzdCBhbGxvd3MgYW55IG51bWJlciBvZiBpdGVtcyB0byBiZSBjaG9zZW4uCisgICAgICAgICAgICAgRmluYWxseSwgYnkgc2V0dGluZyB0aGUgY2hvaWNlTW9kZSB0byBtdWx0aXBsZUNob2ljZU1vZGFsIHRoZSBsaXN0IGFsbG93cworICAgICAgICAgICAgIGFueSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgY2hvc2VuIGluIGEgc3BlY2lhbCBzZWxlY3Rpb24gbW9kZS4KKyAgICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gd2lsbCBzdXBwbHkgYQorICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLndpZGdldC5BYnNMaXN0Vmlldy5NdWx0aUNob2ljZU1vZGVMaXN0ZW5lcn0gdXNpbmcKKyAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcjc2V0TXVsdGlDaG9pY2VNb2RlTGlzdGVuZXJ9IHRvIGNvbnRyb2wgdGhlCisgICAgICAgICAgICAgc2VsZWN0aW9uIG1vZGUuIFRoaXMgdXNlcyB0aGUge0BsaW5rIGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlfSBBUEkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJjaG9pY2VNb2RlIj4KKyAgICAgICAgICAgIDwhLS0gTm9ybWFsIGxpc3QgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjaG9pY2VzLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9Im5vbmUiIHZhbHVlPSIwIiAvPgorICAgICAgICAgICAgPCEtLSBUaGUgbGlzdCBhbGxvd3MgdXAgdG8gb25lIGNob2ljZS4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJzaW5nbGVDaG9pY2UiIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPCEtLSBUaGUgbGlzdCBhbGxvd3MgbXVsdGlwbGUgY2hvaWNlcy4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJtdWx0aXBsZUNob2ljZSIgdmFsdWU9IjIiIC8+CisgICAgICAgICAgICA8IS0tIFRoZSBsaXN0IGFsbG93cyBtdWx0aXBsZSBjaG9pY2VzIGluIGEgY3VzdG9tIHNlbGVjdGlvbiBtb2RlLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9Im11bHRpcGxlQ2hvaWNlTW9kYWwiIHZhbHVlPSIzIiAvPgorICAgICAgICA8L2F0dHI+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQWJzU3Bpbm5lciI+CiAgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGFuIGFycmF5IHJlc291cmNlIHRoYXQgd2lsbCBwb3B1bGF0ZSB0aGUgU3Bpbm5lci4gIEZvciBzdGF0aWMgY29udGVudCwKQEAgLTE3NDMsNyArMTg1Niw3IEBACiAgICAgICAgIDwhLS0gV2hlbiBzZXQgdG8gdHJ1ZSwgYWxsIGNoaWxkcmVuIHdpdGggYSB3ZWlnaHQgd2lsbCBiZSBjb25zaWRlcmVkIGhhdmluZwogICAgICAgICAgICAgIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQuIElmIGZhbHNlLCBhbGwgY2hpbGRyZW4gYXJlCiAgICAgICAgICAgICAgbWVhc3VyZWQgbm9ybWFsbHkuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJ1c2VMYXJnZXN0Q2hpbGQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ibWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJMaXN0VmlldyI+CiAgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGFuIGFycmF5IHJlc291cmNlIHRoYXQgd2lsbCBwb3B1bGF0ZSB0aGUgTGlzdFZpZXcuICBGb3Igc3RhdGljIGNvbnRlbnQsCkBAIC0xNzU0LDI4ICsxODY3LDEyIEBACiAgICAgICAgIDwhLS0gSGVpZ2h0IG9mIHRoZSBkaXZpZGVyLiBXaWxsIHVzZSB0aGUgaW50cmluc2ljIGhlaWdodCBvZiB0aGUgZGl2aWRlciBpZiB0aGlzCiAgICAgICAgICAgICAgaXMgbm90IHNwZWNpZmllZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImRpdmlkZXJIZWlnaHQiIGZvcm1hdD0iZGltZW5zaW9uIiAvPgotICAgICAgICA8IS0tIERlZmluZXMgdGhlIGNob2ljZSBiZWhhdmlvciBmb3IgdGhlIExpc3RWaWV3LiBCeSBkZWZhdWx0LCBsaXN0cyBkbyBub3QgaGF2ZQotICAgICAgICAgICAgIGFueSBjaG9pY2UgYmVoYXZpb3IuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8gc2luZ2xlQ2hvaWNlLCB0aGUgTGlzdAotICAgICAgICAgICAgIGFsbG93cyB1cCB0byBvbmUgaXRlbSB0byBiZSBpbiBhIGNob3NlbiBzdGF0ZS4gQnkgc2V0dGluZyB0aGUgY2hvaWNlTW9kZSB0bwotICAgICAgICAgICAgIG11bHRpcGxlQ2hvaWNlLCB0aGUgbGlzdCBhbGxvd3MgYW55IG51bWJlciBvZiBpdGVtcyB0byBiZSBjaG9zZW4uIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJjaG9pY2VNb2RlIj4KLSAgICAgICAgICAgIDwhLS0gTm9ybWFsIGxpc3QgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjaG9pY2VzLiAtLT4KLSAgICAgICAgICAgIDxlbnVtIG5hbWU9Im5vbmUiIHZhbHVlPSIwIiAvPgotICAgICAgICAgICAgPCEtLSBUaGUgbGlzdCBhbGxvd3MgdXAgdG8gb25lIGNob2ljZS4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJzaW5nbGVDaG9pY2UiIHZhbHVlPSIxIiAvPgotICAgICAgICAgICAgPCEtLSBUaGUgbGlzdCBhbGxvd3MgbXVsdGlwbGUgY2hvaWNlcy4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJtdWx0aXBsZUNob2ljZSIgdmFsdWU9IjIiIC8+Ci0gICAgICAgIDwvYXR0cj4KICAgICAgICAgPCEtLSBXaGVuIHNldCB0byBmYWxzZSwgdGhlIExpc3RWaWV3IHdpbGwgbm90IGRyYXcgdGhlIGRpdmlkZXIgYWZ0ZXIgZWFjaCBoZWFkZXIgdmlldy4KICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iaGVhZGVyRGl2aWRlcnNFbmFibGVkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgICAgIDwhLS0gV2hlbiBzZXQgdG8gZmFsc2UsIHRoZSBMaXN0VmlldyB3aWxsIG5vdCBkcmF3IHRoZSBkaXZpZGVyIGJlZm9yZSBlYWNoIGZvb3RlciB2aWV3LgogICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJmb290ZXJEaXZpZGVyc0VuYWJsZWQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KLSAgICAgICAgPCEtLSBEcmF3YWJsZSB0byBkcmF3IGFib3ZlIGxpc3QgY29udGVudC4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9Im92ZXJzY3JvbGxIZWFkZXIiIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgotICAgICAgICA8IS0tIERyYXdhYmxlIHRvIGRyYXcgYmVsb3cgbGlzdCBjb250ZW50LiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ib3ZlcnNjcm9sbEZvb3RlciIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTWVudVZpZXciPgogICAgICAgICA8IS0tIERlZmF1bHQgYXBwZWFyYW5jZSBvZiBtZW51IGl0ZW0gdGV4dC4gLS0+CkBAIC0yMTcxLDcgKzIyNjgsNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93bkFuY2hvciIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRoZSBiYXNpYyB3aWR0aCBvZiB0aGUgZHJvcGRvd24uIEl0cyB2YWx1ZSBtYXkKICAgICAgICAgICAgICBiZSBhIGRpbWVuc2lvbiAoc3VjaCBhcyAiMTJkaXAiKSBmb3IgYSBjb25zdGFudCB3aWR0aCwKLSAgICAgICAgICAgICBmaWxsX3BhcmVudCBvciBtYXRjaF9wYXJlbnQgdG8gbWF0Y2ggdGhlIHdpZHRoIG9mIHRoZSAKKyAgICAgICAgICAgICBmaWxsX3BhcmVudCBvciBtYXRjaF9wYXJlbnQgdG8gbWF0Y2ggdGhlIHdpZHRoIG9mIHRoZQogICAgICAgICAgICAgIHNjcmVlbiwgb3Igd3JhcF9jb250ZW50IHRvIG1hdGNoIHRoZSB3aWR0aCBvZgogICAgICAgICAgICAgIHRoZSBhbmNob3JlZCB2aWV3LiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25XaWR0aCIgZm9ybWF0PSJkaW1lbnNpb24iPgpAQCAtMjIwNywxNCArMjMwNCwzMyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJwb3B1cEJhY2tncm91bmQiIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlZpZXdBbmltYXRvciI+CisgICAgICAgIDwhLS0gSWRlbnRpZmllciBmb3IgdGhlIGFuaW1hdGlvbiB0byB1c2Ugd2hlbiBhIHZpZXcgaXMgc2hvd24uIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJpbkFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gSWRlbnRpZmllciBmb3IgdGhlIGFuaW1hdGlvbiB0byB1c2Ugd2hlbiBhIHZpZXcgaXMgaGlkZGVuLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ib3V0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZpbmVzIHdoZXRoZXIgdG8gYW5pbWF0ZSB0aGUgY3VycmVudCBWaWV3IHdoZW4gdGhlIFZpZXdBbmltYXRpb24KKyAgICAgICAgICAgICBpcyBmaXJzdCBkaXNwbGF5ZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhbmltYXRlRmlyc3RWaWV3IiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iVmlld0ZsaXBwZXIiPgogICAgICAgICA8YXR0ciBuYW1lPSJmbGlwSW50ZXJ2YWwiIGZvcm1hdD0iaW50ZWdlciIgbWluPSIwIiAvPgogICAgICAgICA8IS0tIFdoZW4gdHJ1ZSwgYXV0b21hdGljYWxseSBzdGFydCBhbmltYXRpbmcgLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImF1dG9TdGFydCIgZm9ybWF0PSJib29sZWFuIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkFkYXB0ZXJWaWV3QW5pbWF0b3IiPgorICAgICAgICA8IS0tIElkZW50aWZpZXIgZm9yIHRoZSBhbmltYXRpb24gdG8gdXNlIHdoZW4gYSB2aWV3IGlzIHNob3duLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaW5BbmltYXRpb24iIC8+CisgICAgICAgIDwhLS0gSWRlbnRpZmllciBmb3IgdGhlIGFuaW1hdGlvbiB0byB1c2Ugd2hlbiBhIHZpZXcgaXMgaGlkZGVuLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ib3V0QW5pbWF0aW9uIiAvPgorICAgICAgICA8IS0tIERlZmluZXMgd2hldGhlciB0byBhbmltYXRlIHRoZSBjdXJyZW50IFZpZXcgd2hlbiB0aGUgVmlld0FuaW1hdGlvbgorICAgICAgICAgICAgIGlzIGZpcnN0IGRpc3BsYXllZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFuaW1hdGVGaXJzdFZpZXciIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQWRhcHRlclZpZXdGbGlwcGVyIj4KKyAgICAgICAgPGF0dHIgbmFtZT0iZmxpcEludGVydmFsIiAvPgorICAgICAgICA8IS0tIFdoZW4gdHJ1ZSwgYXV0b21hdGljYWxseSBzdGFydCBhbmltYXRpbmcgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImF1dG9TdGFydCIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJWaWV3U3dpdGNoZXIiPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlNjcm9sbFZpZXciPgpAQCAtMjIyOCw2ICsyMzQ0LDMwIEBACiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlNwaW5uZXIiPgogICAgICAgICA8IS0tIFRoZSBwcm9tcHQgdG8gZGlzcGxheSB3aGVuIHRoZSBzcGlubmVyJ3MgZGlhbG9nIGlzIHNob3duLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0icHJvbXB0IiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEaXNwbGF5IG1vZGUgZm9yIHNwaW5uZXIgb3B0aW9ucy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InNwaW5uZXJNb2RlIiBmb3JtYXQ9ImVudW0iPgorICAgICAgICAgICAgPCEtLSBTcGlubmVyIG9wdGlvbnMgd2lsbCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgYXMgYSBkaWFsb2cgd2luZG93LiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImRpYWxvZyIgdmFsdWU9IjAiIC8+CisgICAgICAgICAgICA8IS0tIFNwaW5uZXIgb3B0aW9ucyB3aWxsIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlciBhcyBhbiBpbmxpbmUgZHJvcGRvd24KKyAgICAgICAgICAgICAgICAgYW5jaG9yZWQgdG8gdGhlIHNwaW5uZXIgd2lkZ2V0IGl0c2VsZi4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJkcm9wZG93biIgdmFsdWU9IjEiIC8+CisgICAgICAgIDwvYXR0cj4KKyAgICAgICAgPCEtLSBMaXN0IHNlbGVjdG9yIHRvIHVzZSBmb3Igc3Bpbm5lck1vZGU9ImRyb3Bkb3duIiBkaXNwbGF5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25TZWxlY3RvciIgLz4KKyAgICAgICAgPCEtLSBCYWNrZ3JvdW5kIGRyYXdhYmxlIHRvIHVzZSBmb3IgdGhlIGRyb3Bkb3duIGluIHNwaW5uZXJNb2RlPSJkcm9wZG93biIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJwb3B1cEJhY2tncm91bmQiIC8+CisgICAgICAgIDwhLS0gVmVydGljYWwgb2Zmc2V0IGZyb20gdGhlIHNwaW5uZXIgd2lkZ2V0IGZvciBwb3NpdGlvbmluZyB0aGUgZHJvcGRvd24gaW4KKyAgICAgICAgICAgICBzcGlubmVyTW9kZT0iZHJvcGRvd24iLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25WZXJ0aWNhbE9mZnNldCIgLz4KKyAgICAgICAgPCEtLSBIb3Jpem9udGFsIG9mZnNldCBmcm9tIHRoZSBzcGlubmVyIHdpZGdldCBmb3IgcG9zaXRpb25pbmcgdGhlIGRyb3Bkb3duCisgICAgICAgICAgICAgaW4gc3Bpbm5lck1vZGU9ImRyb3Bkb3duIi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRyb3BEb3duSG9yaXpvbnRhbE9mZnNldCIgLz4KKyAgICAgICAgPCEtLSBXaWR0aCBvZiB0aGUgZHJvcGRvd24gaW4gc3Bpbm5lck1vZGU9ImRyb3Bkb3duIi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRyb3BEb3duV2lkdGgiIC8+CisgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGEgbGF5b3V0IHRvIHVzZSBmb3IgZGlzcGxheWluZyBhIHByb21wdCBpbiB0aGUgZHJvcGRvd24gZm9yCisgICAgICAgICAgICAgc3Bpbm5lck1vZGU9ImRyb3Bkb3duIi4gVGhpcyBsYXlvdXQgbXVzdCBjb250YWluIGEgVGV4dFZpZXcgd2l0aCB0aGUgaWQKKyAgICAgICAgICAgICBAYW5kcm9pZDppZC90ZXh0MSB0byBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgcHJvbXB0IHRleHQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJwb3B1cFByb21wdFZpZXciIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkRhdGVQaWNrZXIiPgogICAgICAgICA8IS0tIFRoZSBmaXJzdCB5ZWFyIChpbmNsdXNpdmUpLCBmb3IgZXhhbXBsZSAiMTk0MCIuIC0tPgpAQCAtMjUzOCw2ICsyNjc4LDEwIEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImRyYXdhYmxlIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTWlwbWFwRHJhd2FibGVJdGVtIj4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHJhd2FibGUiIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKwogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJSb3RhdGVEcmF3YWJsZSI+CiAgICAgICAgIDxhdHRyIG5hbWU9InZpc2libGUiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImZyb21EZWdyZWVzIiBmb3JtYXQ9ImZsb2F0IiAvPgpAQCAtMjg2MSw2ICszMDA1LDY5IEBACiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBBbmltYXRvciBjbGFzcyBhdHRyaWJ1dGVzIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPGVhdC1jb21tZW50IC8+CisKKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQW5pbWF0b3IiPgorICAgICAgICA8IS0tIERlZmluZXMgdGhlIGludGVycG9sYXRvciB1c2VkIHRvIHNtb290aCB0aGUgYW5pbWF0aW9uIG1vdmVtZW50IGluIHRpbWUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpbnRlcnBvbGF0b3IiIC8+CisgICAgICAgIDwhLS0gV2hlbiBzZXQgdG8gdHJ1ZSwgZmlsbEFmdGVyIGlzIHRha2VuIGludG8gYWNjb3VudC4gLS0+CisgICAgICAgIDwhLS0gQW1vdW50IG9mIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgZm9yIHRoZSBhbmltYXRpb24gdG8gcnVuLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHVyYXRpb24iIC8+CisgICAgICAgIDwhLS0gRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgYW5pbWF0aW9uIHJ1bnMsIG9uY2Ugc3RhcnQgdGltZSBpcyByZWFjaGVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3RhcnRPZmZzZXQiLz4KKyAgICAgICAgPCEtLSBEZWZpbmVzIGhvdyBtYW55IHRpbWVzIHRoZSBhbmltYXRpb24gc2hvdWxkIHJlcGVhdC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InJlcGVhdENvdW50Ii8+CisgICAgICAgIDwhLS0gRGVmaW5lcyB0aGUgYW5pbWF0aW9uIGJlaGF2aW9yIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIGFuZCB0aGUgcmVwZWF0IGNvdW50IGlzCisgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIDAgb3IgaW5maW5pdGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHJlc3RhcnQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJyZXBlYXRNb2RlIi8+CisgICAgICAgIDwhLS0gVmFsdWUgdGhlIGFuaW1hdGlvbiBzdGFydHMgZnJvbS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InZhbHVlRnJvbSIgZm9ybWF0PSJmbG9hdHxpbnRlZ2VyIi8+CisgICAgICAgIDwhLS0gVmFsdWUgdGhlIGFuaW1hdGlvbiBhbmltYXRlcyB0by4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InZhbHVlVG8iIGZvcm1hdD0iZmxvYXR8aW50ZWdlciIvPgorICAgICAgICA8IS0tIFRoZSB0eXBlIG9mIHZhbHVlRnJvbSBhbmQgdmFsdWVUby4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InZhbHVlVHlwZSI+CisgICAgICAgICAgICA8IS0tIHZhbHVlRnJvbSBhbmQgdmFsdWVUbyBhcmUgZmxvYXRzLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImZsb2F0VHlwZSIgdmFsdWU9IjAiIC8+CisgICAgICAgICAgICA8IS0tIHZhbHVlRnJvbSBhbmQgdmFsdWVUbyBhcmUgaW50ZWdlcnMuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iaW50VHlwZSIgICB2YWx1ZT0iMSIgLz4KKyAgICAgICAgICAgIDwhLS0gdmFsdWVGcm9tIGFuZCB2YWx1ZVRvIGFyZSBkb3VibGVzLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImRvdWJsZVR5cGUiIHZhbHVlPSIyIiAvPgorICAgICAgICAgICAgPCEtLSB2YWx1ZUZyb20gYW5kIHZhbHVlVG8gYXJlIGNvbG9ycy4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJjb2xvclR5cGUiIHZhbHVlPSIzIiAvPgorICAgICAgICAgICAgPCEtLSB2YWx1ZUZyb20gYW5kIHZhbHVlVG8gYXJlIGEgY3VzdG9tIHR5cGUuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iY3VzdG9tVHlwZSIgdmFsdWU9IjQiIC8+CisgICAgICAgIDwvYXR0cj4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIFByb3BlcnR5QW5pbWF0b3IgY2xhc3MgYXR0cmlidXRlcyAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDxlYXQtY29tbWVudCAvPgorCisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlByb3BlcnR5QW5pbWF0b3IiPgorICAgICAgICA8IS0tIE5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0icHJvcGVydHlOYW1lIiBmb3JtYXQ9InN0cmluZyIvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKworICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBTZXF1ZW5jZXIgY2xhc3MgYXR0cmlidXRlcyAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDxlYXQtY29tbWVudCAvPgorCisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlNlcXVlbmNlciI+CisgICAgICAgIDwhLS0gTmFtZSBvZiB0aGUgcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJvcmRlcmluZyI+CisgICAgICAgICAgICA8IS0tIGNoaWxkIGFuaW1hdGlvbnMgc2hvdWxkIGJlIHBsYXllZCB0b2dldGhlci4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJ0b2dldGhlciIgdmFsdWU9IjAiIC8+CisgICAgICAgICAgICA8IS0tIGNoaWxkIGFuaW1hdGlvbnMgc2hvdWxkIGJlIHBsYXllZCBzZXF1ZW50aWFsbHksIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSB4bWwuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0ic2VxdWVudGlhbGx5IiB2YWx1ZT0iMSIgLz4KKyAgICAgICAgPC9hdHRyPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDwhLS0gU3RhdGUgYXR0cmlidXRlcyAgICAgICAgICAgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8ZWF0LWNvbW1lbnQgLz4KQEAgLTMyNjksNiArMzQ3NiwxNyBAQAogICAgICAgICA8IS0tIFdoZXRoZXIgdGhlIGl0ZW0gaXMgZW5hYmxlZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImVuYWJsZWQiIC8+CiAKKyAgICAgICAgPCEtLSBOYW1lIG9mIGEgbWV0aG9kIG9uIHRoZSBDb250ZXh0IHVzZWQgdG8gaW5mbGF0ZSB0aGUgbWVudSB0aGF0IHdpbGwgYmUKKyAgICAgICAgICAgICBjYWxsZWQgd2hlbiB0aGUgaXRlbSBpcyBjbGlja2VkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ib25DbGljayIgLz4KKworICAgICAgICA8IS0tIEhvdyB0aGlzIGl0ZW0gc2hvdWxkIGRpc3BsYXkgaW4gdGhlIEFjdGlvbiBCYXIsIGlmIHByZXNlbnQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzaG93QXNBY3Rpb24iIGZvcm1hdD0iZW51bSI+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJuZXZlciIgdmFsdWU9IjAiIC8+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJpZlJvb20iIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iYWx3YXlzIiB2YWx1ZT0iMiIgLz4KKyAgICAgICAgPC9hdHRyPgorCiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KQEAgLTMyODQsNiArMzUwMiwxOSBAQAogICAgICAgICA8YXR0ciBuYW1lPSJvcmRlcmluZ0Zyb21YbWwiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCisgICAgPCEtLSBBdHRyaWJ1dGUgZm9yIGEgaGVhZGVyIGRlc2NyaWJpbmcgdGhlIGl0ZW0gc2hvd24gaW4gdGhlIHRvcC1sZXZlbCBsaXN0CisgICAgICAgICBmcm9tIHdoaWNoIHRoZSBzZWxlY3RzIHRoZSBzZXQgb2YgcHJlZmVyZW5jZSB0byBkaWcgaW4gdG8uIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJQcmVmZXJlbmNlSGVhZGVyIj4KKyAgICAgICAgPCEtLSBUaGUgdGl0bGUgb2YgdGhlIGl0ZW0gdGhhdCBpcyBzaG93biB0byB0aGUgdXNlci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRpdGxlIiAvPgorICAgICAgICA8IS0tIFRoZSBzdW1tYXJ5IGZvciB0aGUgaXRlbS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InN1bW1hcnkiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIEFuIGljb24gZm9yIHRoZSBpdGVtLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaWNvbiIgLz4KKyAgICAgICAgPCEtLSBUaGUgZnJhZ21lbnQgdGhhdCBpcyBkaXNwbGF5ZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIHRoaXMgaXRlbS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImZyYWdtZW50IiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiAgICAgPCEtLSBXQVJOSU5HOiAgSWYgYWRkaW5nIGF0dHJpYnV0ZXMgdG8gUHJlZmVyZW5jZSwgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNvbmZsaWN0CiAgICAgICAgICAgICAgICAgICAgd2l0aCBhIFZpZXcncyBhdHRyaWJ1dGVzLiAgU29tZSBzdWJjbGFzc2VzIChlLmcuLCBFZGl0VGV4dFByZWZlcmVuY2UpCiAgICAgICAgICAgICAgICAgICAgcHJveHkgYWxsIGF0dHJpYnV0ZXMgdG8gaXRzIEVkaXRUZXh0IHdpZGdldC4gLS0+CkBAIC0zMjk2LDEwICszNTI3LDEzIEBACiAgICAgICAgIDwhLS0gVGhlIHRpdGxlIGZvciB0aGUgUHJlZmVyZW5jZSBpbiBhIFByZWZlcmVuY2VBY3Rpdml0eSBzY3JlZW4uIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ0aXRsZSIgLz4KICAgICAgICAgPCEtLSBUaGUgc3VtbWFyeSBmb3IgdGhlIFByZWZlcmVuY2UgaW4gYSBQcmVmZXJlbmNlQWN0aXZpdHkgc2NyZWVuLiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ic3VtbWFyeSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDxhdHRyIG5hbWU9InN1bW1hcnkiIC8+CiAgICAgICAgIDwhLS0gVGhlIG9yZGVyIGZvciB0aGUgUHJlZmVyZW5jZSAobG93ZXIgdmFsdWVzIGFyZSB0byBiZSBvcmRlcmVkIGZpcnN0KS4gSWYgdGhpcyBpcyBub3QKICAgICAgICAgICAgICBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IG9yZGVyaW4gd2lsbCBiZSBhbHBoYWJldGljLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ib3JkZXIiIGZvcm1hdD0iaW50ZWdlciIgLz4KKyAgICAgICAgPCEtLSBXaGVuIHVzZWQgaW5zaWRlIG9mIGEgbW9kZXJuIFByZWZlcmVuY2VBY3Rpdml0eSwgdGhpcyBkZWNsYXJlcworICAgICAgICAgICAgIGEgbmV3IFByZWZlcmVuY2VGcmFnbWVudCB0byBiZSBzaG93biB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgdGhpcyBpdGVtLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJhZ21lbnQiIC8+CiAgICAgICAgIDwhLS0gVGhlIGxheW91dCBmb3IgdGhlIFByZWZlcmVuY2UgaW4gYSBQcmVmZXJlbmNlQWN0aXZpdHkgc2NyZWVuLiBUaGlzIHNob3VsZAogICAgICAgICAgICAgIHJhcmVseSBuZWVkIHRvIGJlIGNoYW5nZWQsIGxvb2sgYXQgd2lkZ2V0TGF5b3V0IGluc3RlYWQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJsYXlvdXQiIC8+CkBAIC0zMzcxLDYgKzM2MDUsMTYgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iZW50cnlWYWx1ZXMiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSI+CisgICAgICAgIDwhLS0gVGhlIGh1bWFuLXJlYWRhYmxlIGFycmF5IHRvIHByZXNlbnQgYXMgYSBsaXN0LiBFYWNoIGVudHJ5IG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICBpbmRleCBpbiBlbnRyeVZhbHVlcy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImVudHJpZXMiIC8+CisgICAgICAgIDwhLS0gVGhlIGFycmF5IHRvIGZpbmQgdGhlIHZhbHVlIHRvIHNhdmUgZm9yIGEgcHJlZmVyZW5jZSB3aGVuIGFuIGVudHJ5IGZyb20KKyAgICAgICAgICAgICBlbnRyaWVzIGlzIHNlbGVjdGVkLiBJZiBhIHVzZXIgY2xpY2tzIHRoZSBzZWNvbmQgaXRlbSBpbiBlbnRyaWVzLCB0aGUKKyAgICAgICAgICAgICBzZWNvbmQgaXRlbSBpbiB0aGlzIGFycmF5IHdpbGwgYmUgc2F2ZWQgdG8gdGhlIHByZWZlcmVuY2UuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJlbnRyeVZhbHVlcyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiAgICAgPCEtLSBCYXNlIGF0dHJpYnV0ZXMgYXZhaWxhYmxlIHRvIFJpbmd0b25lUHJlZmVyZW5jZS4gLS0+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlJpbmd0b25lUHJlZmVyZW5jZSI+CiAgICAgICAgIDwhLS0gV2hpY2ggcmluZ3RvbmUgdHlwZShzKSB0byBzaG93IGluIHRoZSBwaWNrZXIuIC0tPgpAQCAtMzUyMiw3ICszNzY2LDcgQEAKICAgICA8IS0tIEFwcFdpZGdldCBwYWNrYWdlIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgotICAgIAorCiAgICAgPCEtLSBVc2UgPGNvZGU+YXBwd2lkZ2V0LXByb3ZpZGVyPC9jb2RlPiBhcyB0aGUgcm9vdCB0YWcgb2YgdGhlIFhNTCByZXNvdXJjZSB0aGF0CiAgICAgICAgICBkZXNjcmliZXMgYW4gQXBwV2lkZ2V0IHByb3ZpZGVyLiAgU2VlIHtAbGluayBhbmRyb2lkLmFwcHdpZGdldCBhbmRyb2lkLmFwcHdpZGdldH0KICAgICAgICAgIHBhY2thZ2UgZm9yIG1vcmUgaW5mby4KQEAgLTM1MzksMTMgKzM3ODMsNDkgQEAKICAgICAgICAgPCEtLSBBIGNsYXNzIG5hbWUgaW4gdGhlIEFwcFdpZGdldCdzIHBhY2thZ2UgdG8gYmUgbGF1bmNoZWQgdG8gY29uZmlndXJlLgogICAgICAgICAgICAgIElmIG5vdCBzdXBwbGllZCwgdGhlbiBubyBhY3Rpdml0eSB3aWxsIGJlIGxhdW5jaGVkLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iY29uZmlndXJlIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBBIHByZXZpZXcgb2Ygd2hhdCB0aGUgQXBwV2lkZ2V0IHdpbGwgbG9vayBsaWtlIGFmdGVyIGl0J3MgY29uZmlndXJlZC4KKyAgICAgICAJICAgICBJZiBub3Qgc3VwcGxpZWQsIHRoZSBBcHBXaWRnZXQncyBpY29uIHdpbGwgYmUgdXNlZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InByZXZpZXdJbWFnZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tIEFwcCBwYWNrYWdlIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgotICAgIAorCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIFZpZXcgcGFja2FnZSBjbGFzcyBhdHRyaWJ1dGVzIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPGVhdC1jb21tZW50IC8+CisKKyAgICA8IS0tIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIDxjb2RlPiZsdDtmcmFnbWVudCZndDs8L2NvZGU+CisgICAgICAgICB0YWdzIGluc2lkZSBvZiB0aGUgbGF5b3V0IG9mIGFuIEFjdGl2aXR5LiAgVGhpcyBpbnN0YW50aWF0ZXMKKyAgICAgICAgIHRoZSBnaXZlbiB7QGxpbmsgYW5kcm9pZC5hcHAuRnJhZ21lbnR9IGFuZCBpbnNlcnRzIGl0cyBjb250ZW50CisgICAgICAgICB2aWV3IGludG8gdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGxheW91dC4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkZyYWdtZW50Ij4KKyAgICAgICAgPCEtLSBTdXBwbHkgdGhlIG5hbWUgb2YgdGhlIGZyYWdtZW50IGNsYXNzIHRvIGluc3RhbnRpYXRlLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibmFtZSIgLz4KKworICAgICAgICA8IS0tIFN1cHBseSBhbiBpZGVudGlmaWVyIG5hbWUgZm9yIHRoZSB0b3AtbGV2ZWwgdmlldywgdG8gbGF0ZXIgcmV0cmlldmUgaXQKKyAgICAgICAgICAgICB3aXRoIHtAbGluayBhbmRyb2lkLnZpZXcuVmlldyNmaW5kVmlld0J5SWQgVmlldy5maW5kVmlld0J5SWQoKX0gb3IKKyAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjZmluZFZpZXdCeUlkIEFjdGl2aXR5LmZpbmRWaWV3QnlJZCgpfS4KKyAgICAgICAgICAgICBUaGlzIG11c3QgYmUgYQorICAgICAgICAgICAgIHJlc291cmNlIHJlZmVyZW5jZTsgdHlwaWNhbGx5IHlvdSBzZXQgdGhpcyB1c2luZyB0aGUKKyAgICAgICAgICAgICA8Y29kZT5AKzwvY29kZT4gc3ludGF4IHRvIGNyZWF0ZSBhIG5ldyBJRCByZXNvdXJjZXMuCisgICAgICAgICAgICAgRm9yIGV4YW1wbGU6IDxjb2RlPmFuZHJvaWQ6aWQ9IkAraWQvbXlfaWQiPC9jb2RlPiB3aGljaAorICAgICAgICAgICAgIGFsbG93cyB5b3UgdG8gbGF0ZXIgcmV0cmlldmUgdGhlIHZpZXcKKyAgICAgICAgICAgICB3aXRoIDxjb2RlPmZpbmRWaWV3QnlJZChSLmlkLm15X2lkKTwvY29kZT4uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpZCIgLz4KKworICAgICAgICA8IS0tIFN1cHBseSBhIHRhZyBmb3IgdGhlIHRvcC1sZXZlbCB2aWV3IGNvbnRhaW5pbmcgYSBTdHJpbmcsIHRvIGJlIHJldHJpZXZlZAorICAgICAgICAgICAgIGxhdGVyIHdpdGgge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I2dldFRhZyBWaWV3LmdldFRhZygpfSBvcgorICAgICAgICAgICAgIHNlYXJjaGVkIGZvciB3aXRoIHtAbGluayBhbmRyb2lkLnZpZXcuVmlldyNmaW5kVmlld1dpdGhUYWcKKyAgICAgICAgICAgICBWaWV3LmZpbmRWaWV3V2l0aFRhZygpfS4gIEl0IGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZQorICAgICAgICAgICAgIElEcyAodGhyb3VnaCB0aGUgYW5kcm9pZDppZCBhdHRyaWJ1dGUpIGluc3RlYWQgb2YgdGFncyBiZWNhdXNlCisgICAgICAgICAgICAgdGhleSBhcmUgZmFzdGVyIGFuZCBhbGxvdyBmb3IgY29tcGlsZS10aW1lIHR5cGUgY2hlY2tpbmcuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0YWciIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKwogICAgIDwhLS0gVXNlIDxjb2RlPmRldmljZS1hZG1pbjwvY29kZT4gYXMgdGhlIHJvb3QgdGFnIG9mIHRoZSBYTUwgcmVzb3VyY2UgdGhhdAogICAgICAgICAgZGVzY3JpYmVzIGEKICAgICAgICAgIHtAbGluayBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VBZG1pblJlY2VpdmVyfSwgd2hpY2ggaXMKQEAgLTM1ODUsNyArMzg2NSw3IEBACiAgICAgPCEtLSBBY2NvdW50cyBwYWNrYWdlIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgotICAgIAorCiAgICAgPCEtLSBVc2UgPGNvZGU+YWNjb3VudC1hdXRoZW50aWNhdG9yPC9jb2RlPiBhcyB0aGUgcm9vdCB0YWcgb2YgdGhlIFhNTCByZXNvdXJjZSB0aGF0CiAgICAgICAgICBkZXNjcmliZXMgYW4gYWNjb3VudCBhdXRoZW50aWNhdG9yLgogICAgICAtLT4KQEAgLTM2MDYsNyArMzg4Niw3IEBACiAgICAgPCEtLSBBY2NvdW50cyBwYWNrYWdlIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgotICAgIAorCiAgICAgPCEtLSBVc2UgPGNvZGU+YWNjb3VudC1hdXRoZW50aWNhdG9yPC9jb2RlPiBhcyB0aGUgcm9vdCB0YWcgb2YgdGhlIFhNTCByZXNvdXJjZSB0aGF0CiAgICAgICAgICBkZXNjcmliZXMgYW4gYWNjb3VudCBhdXRoZW50aWNhdG9yLgogICAgICAtLT4KQEAgLTM2MjIsNyArMzkwMiw3IEBACiAgICAgPCEtLSBDb250YWN0cyBtZXRhLWRhdGEgYXR0cmlidXRlcyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+Ci0gICAgCisKICAgICA8IS0tIFRPRE86IHJlbW92ZSB0aGlzIGRlcHJlY2F0ZWQgc3R5bGVhYmxlLiAtLT4KICAgICA8ZWF0LWNvbW1lbnQgLz4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iSWNvbiI+CkBAIC0zNjQ4LDYgKzM5MjgsOSBAQAogICAgICAgICA8YXR0ciBuYW1lPSJkZXRhaWxDb2x1bW4iIGZvcm1hdD0ic3RyaW5nIiAvPgogICAgICAgICA8IS0tIEZsYWcgaW5kaWNhdGluZyB0aGF0IGRldGFpbCBzaG91bGQgYmUgYnVpbHQgZnJvbSBTb2NpYWxQcm92aWRlci4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImRldGFpbFNvY2lhbFN1bW1hcnkiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKyAgICAgICAgPCEtLSBSZXNvdXJjZSByZXByZXNlbnRpbmcgdGhlIHRlcm0gIkFsbCBDb250YWN0cyIgKGUuZy4gIkFsbCBGcmllbmRzIiBvcgorICAgICAgICAiQWxsIGNvbm5lY3Rpb25zIikuIE9wdGlvbmFsIChEZWZhdWx0IGlzICJBbGwgQ29udGFjdHMiKS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFsbENvbnRhY3RzTmFtZSIgZm9ybWF0PSJzdHJpbmciIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTM2NzksNCArMzk2MiwxMDcgQEAKICAgICAgICAgPGF0dHIgbmFtZT0ic2V0dGluZ3NBY3Rpdml0eSIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gQWRhcHRlcnMgYXR0cmlidXRlcyAgICAgICAgICAgICAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+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+CisKIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRyc19tYW5pZmVzdC54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzX21hbmlmZXN0LnhtbAppbmRleCBmYjQ5MTIwLi44Y2Y2NWFlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzX21hbmlmZXN0LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzX21hbmlmZXN0LnhtbApAQCAtMjM1LDYgKzIzNSwxMCBAQAogICAgICAgICAgdGhlIHNhZmUgbW9kZS4gIC0tPgogICAgIDxhdHRyIG5hbWU9InZtU2FmZU1vZGUiIGZvcm1hdD0iYm9vbGVhbiIgLz4KIAorICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uJ3MgcmVuZGVyaW5nIHNob3VsZCBiZSBoYXJkd2FyZQorICAgICAgICAgYWNjZWxlcmF0ZWQgaWYgcG9zc2libGUuICAtLT4KKyAgICA8YXR0ciBuYW1lPSJoYXJkd2FyZUFjY2VsZXJhdGVkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CisKICAgICA8IS0tIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiBjb21wb25lbnQgaXMgYXZhaWxhYmxlCiAgICAgICAgICB0byBvdGhlciBhcHBsaWNhdGlvbnMuICBJZiBmYWxzZSwgaXQgY2FuIG9ubHkgYmUgYWNjZXNzZWQgYnkKICAgICAgICAgIGFwcGxpY2F0aW9ucyB3aXRoIGl0cyBzYW1lIHVzZXIgaWQgKHdoaWNoIHVzdWFsbHkgbWVhbnMgb25seSBieQpAQCAtNzM0LDYgKzczOCw3IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImVuYWJsZWQiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImRlYnVnZ2FibGUiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9InZtU2FmZU1vZGUiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImhhcmR3YXJlQWNjZWxlcmF0ZWQiIC8+CiAgICAgICAgIDwhLS0gTmFtZSBvZiBhY3Rpdml0eSB0byBiZSBsYXVuY2hlZCBmb3IgbWFuYWdpbmcgdGhlIGFwcGxpY2F0aW9uJ3Mgc3BhY2Ugb24gdGhlIGRldmljZS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9Im1hbmFnZVNwYWNlQWN0aXZpdHkiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImFsbG93Q2xlYXJVc2VyRGF0YSIgLz4KQEAgLTEyMDcsNiArMTIxMiw3IEBACiAgICAgICAgICAgICAgYW55IHZhbHVlIGluIHRoZSB0aGVtZS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd1NvZnRJbnB1dE1vZGUiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImltbWVyc2l2ZSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIAogICAgIDwhLS0gVGhlIDxjb2RlPmFjdGl2aXR5LWFsaWFzPC9jb2RlPiB0YWcgZGVjbGFyZXMgYSBuZXcKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbAppbmRleCBiNmFmNmIyLi5lOWE0Y2EzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbG9ycy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCkBAIC0xOCw4ICsxOCw4IEBACiAqLwogLS0+CiA8cmVzb3VyY2VzPgotCTxkcmF3YWJsZSBuYW1lPSJzY3JlZW5fYmFja2dyb3VuZF9saWdodCI+I2ZmZmZmZmZmPC9kcmF3YWJsZT4KLQk8ZHJhd2FibGUgbmFtZT0ic2NyZWVuX2JhY2tncm91bmRfZGFyayI+I2ZmMDAwMDAwPC9kcmF3YWJsZT4KKwk8ZHJhd2FibGUgbmFtZT0ic2NyZWVuX2JhY2tncm91bmRfbGlnaHQiPiNmZmVmZWZlZjwvZHJhd2FibGU+CisJPGRyYXdhYmxlIG5hbWU9InNjcmVlbl9iYWNrZ3JvdW5kX2RhcmsiPiNmZjEwMTAxMDwvZHJhd2FibGU+CiAgICAgPGRyYXdhYmxlIG5hbWU9InN0YXR1c19iYXJfY2xvc2VkX2RlZmF1bHRfYmFja2dyb3VuZCI+I2ZmMDAwMDAwPC9kcmF3YWJsZT4KICAgICA8ZHJhd2FibGUgbmFtZT0ic3RhdHVzX2Jhcl9vcGVuZWRfZGVmYXVsdF9iYWNrZ3JvdW5kIj4jZmYwMDAwMDA8L2RyYXdhYmxlPgogICAgIDxkcmF3YWJsZSBuYW1lPSJzZWFyY2hfYmFyX2RlZmF1bHRfY29sb3IiPiNmZjAwMDAwMDwvZHJhd2FibGU+CkBAIC0zNiwyNCArMzYsMzAgQEAKICAgICA8Y29sb3IgbmFtZT0id2hpdGUiPiNmZmZmZmZmZjwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImJsYWNrIj4jZmYwMDAwMDA8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJ0cmFuc3BhcmVudCI+IzAwMDAwMDAwPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0iYmFja2dyb3VuZF9kYXJrIj4jZmYwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9kYXJrIj4jZmZmZmZmZmY8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJiYWNrZ3JvdW5kX2RhcmsiPiNmZjEwMTAxMDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJhY2tncm91bmRfbGlnaHQiPiNmZmVmZWZlZjwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2RhcmsiPkBhbmRyb2lkOmNvbG9yL2JhY2tncm91bmRfbGlnaHQ8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9saWdodCI+QGFuZHJvaWQ6Y29sb3IvYmFja2dyb3VuZF9kYXJrPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfZGFya19kaXNhYmxlZCI+IzgwZmZmZmZmPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfZGFya19pbnZlcnNlIj4jZmYwMDAwMDA8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9saWdodF9kaXNhYmxlZCI+IzgwMDAwMDAwPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfZGFya19pbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0X2ludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2Rhcms8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9kYXJrIj4jYmViZWJlPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfZGFya19kaXNhYmxlZCI+IzgwYmViZWJlPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfZGFya19pbnZlcnNlIj4jMzIzMjMyPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfZGFya19pbnZlcnNlX2Rpc2FibGVkIj4jODAzMjMyMzI8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJoaW50X2ZvcmVncm91bmRfZGFyayI+IzgwODA4MDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9ImJhY2tncm91bmRfbGlnaHQiPiNmZmZmZmZmZjwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ij4jZmYwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9saWdodF9pbnZlcnNlIj4jZmZmZmZmZmY8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9saWdodF9kaXNhYmxlZCI+IzgwMDAwMDAwPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfbGlnaHQiPiMzMjMyMzI8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9saWdodF9kaXNhYmxlZCI+IzgwMzIzMjMyPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfbGlnaHRfaW52ZXJzZSI+I2JlYmViZTwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImRpbV9mb3JlZ3JvdW5kX2xpZ2h0X2ludmVyc2VfZGlzYWJsZWQiPiM4MGJlYmViZTwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImhpbnRfZm9yZWdyb3VuZF9saWdodCI+IzgwODA4MDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImhpZ2hsaWdodF9iYWNrZ3JvdW5kIj4jY2M0NzU5MjU8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJoaWdobGlnaHRfYmFja2dyb3VuZF9pbnZlcnNlIj4jY2NkMmU0NjE8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJoaWdobGlnaHRlZF90ZXh0X2RhcmsiPiNjYzQ3NTkyNTwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImhpZ2hsaWdodGVkX3RleHRfbGlnaHQiPiNjY2QyZTQ2MTwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImxpbmtfdGV4dF9kYXJrIj4jNWM1Y2ZmPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0ibGlua190ZXh0X2xpZ2h0Ij4jMDAwMGVlPC9jb2xvcj4KIAogICAgIDxkcmF3YWJsZSBuYW1lPSJzdGF0X25vdGlmeV9zeW5jX25vYW5pbSI+QGRyYXdhYmxlL3N0YXRfbm90aWZ5X3N5bmNfYW5pbTA8L2RyYXdhYmxlPgogICAgIDxkcmF3YWJsZSBuYW1lPSJzdGF0X3N5c19kb3dubG9hZF9kb25lIj5AZHJhd2FibGUvc3RhdF9zeXNfZG93bmxvYWRfYW5pbTA8L2RyYXdhYmxlPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sCmluZGV4IDgwMGVkMTMuLmEwNzFjYWMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwKQEAgLTIyLDcgKzIyLDggQEAKIDxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgogICAgIDwhLS0gQ29tcG9uZW50IHRvIGJlIHVzZWQgYXMgdGhlIHN0YXR1cyBiYXIgc2VydmljZS4gIE11c3QgaW1wbGVtZW50IHRoZSBJU3RhdHVzQmFyCiAgICAgICAgICBpbnRlcmZhY2UuICBUaGlzIG5hbWUgaXMgaW4gdGhlIENvbXBvbmVudE5hbWUgZmxhdHRlbmVkIGZvcm1hdCAocGFja2FnZS9jbGFzcykgIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iY29uZmlnX3N0YXR1c0JhckNvbXBvbmVudCI+Y29tLmFuZHJvaWQuc3lzdGVtdWkvY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLlN0YXR1c0JhclNlcnZpY2U8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNvbmZpZ19zdGF0dXNCYXJDb21wb25lbnQiPmNvbS5hbmRyb2lkLnN5c3RlbXVpL2NvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5QaG9uZVN0YXR1c0JhclNlcnZpY2U8L3N0cmluZz4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfc3RhdHVzQmFyQ2FuSGlkZSI+dHJ1ZTwvYm9vbD4KIAogICAgIDwhLS0gRG8gbm90IHRyYW5zbGF0ZS4gRGVmaW5lcyB0aGUgc2xvdHMgZm9yIHRoZSByaWdodC1oYW5kIHNpZGUgaWNvbnMuICBUaGF0IGlzIHRvIHNheSwgdGhlCiAgICAgICAgICBpY29ucyBpbiB0aGUgc3RhdHVzIGJhciB0aGF0IGFyZSBub3Qgbm90aWZpY2F0aW9ucy4gLS0+CkBAIC03Miw2ICs3MywxMyBAQAogICAgICAgICAgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgY29ubmVjdGlvbi4gSWYgdGhlIHNjYW4gZG9lc24ndCB0aW1lb3V0LCB1c2UgemVybyAtLT4KICAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfcmFkaW9TY2FubmluZ1RpbWVvdXQiPjA8L2ludGVnZXI+CiAKKyAgICA8IS0tIFNldCB0byB0cnVlIGlmIHRoZSBsb2NhdGlvbiByZXR1cm5lZCBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKQorICAgICAgICAgaXMgYWN0dWFsbHkgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIGludGVybmFsIHN0b3JhZ2UuCisgICAgICAgICBJZiB0aGlzIGlzIHNldCB0aGVuIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZVN0YXRlKCkgd2lsbCBhbHdheXMgcmV0dXJuCisgICAgICAgICBNRURJQV9NT1VOVEVEIGFuZCBJbnRlbnQuQUNUSU9OX01FRElBX01PVU5URUQgd2lsbCBiZSBicm9hZGNhc3QgYXQgYm9vdCB0aW1lCisgICAgICAgICBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGFwcHMgdGhhdCByZXF1aXJlIGV4dGVybmFsIHN0b3JhZ2UuIC0tPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19lbXVsYXRlRXh0ZXJuYWxTdG9yYWdlIj5mYWxzZTwvYm9vbD4KKwogICAgIDwhLS0gWFhYWFggTk9URSBUSEUgRk9MTE9XSU5HIFJFU09VUkNFUyBVU0UgVEhFIFdST05HIE5BTUlORyBDT05WRU5USU9OLgogICAgICAgICAgUGxlYXNlIGRvbid0IGNvcHkgdGhlbSwgY29weSBhbnl0aGluZyBlbHNlLiAtLT4KIApAQCAtOTgsNiArMTA2LDkgQEAKICAgICAgICAgPGl0ZW0+IjAsMSI8L2l0ZW0+CiAgICAgPC9zdHJpbmctYXJyYXk+CiAKKyAgICA8IS0tIFRoZSBtYXhpbXVtIGR1cmF0aW9uIChpbiBtaWxsaXNlY29uZHMpIHdlIGV4cGVjdCBhIG5ldHdvcmsgdHJhbnNpdGlvbiB0byB0YWtlIC0tPgorICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19uZXR3b3JrVHJhbnNpdGlvblRpbWVvdXQiPjYwMDAwPC9pbnRlZ2VyPgorCiAgICAgPCEtLSBMaXN0IG9mIHJlZ2V4cHJlc3Npb25zIGRlc2NyaWJpbmcgdGhlIGludGVyZmFjZSAoaWYgYW55KSB0aGF0IHJlcHJlc2VudCB0ZXRoZXJhYmxlCiAgICAgICAgICBVU0IgaW50ZXJmYWNlcy4gIElmIHRoZSBkZXZpY2UgZG9lc24ndCB3YW50IHRvIHN1cHBvcnQgdGV0aGluZyBvdmVyIFVTQiB0aGlzIHNob3VsZAogICAgICAgICAgYmUgZW1wdHkuICBBbiBleGFtcGxlIHdvdWxkIGJlICJ1c2IuKiIgLS0+CkBAIC0xMTAsNiArMTIxLDEyIEBACiAgICAgPHN0cmluZy1hcnJheSB0cmFuc2xhdGFibGU9ImZhbHNlIiBuYW1lPSJjb25maWdfdGV0aGVyX3dpZmlfcmVnZXhzIj4KICAgICA8L3N0cmluZy1hcnJheT4KIAorICAgIDwhLS0gTGlzdCBvZiByZWdleHByZXNzaW9ucyBkZXNjcmliaW5nIHRoZSBpbnRlcmZhY2UgKGlmIGFueSkgdGhhdCByZXByZXNlbnQgdGV0aGVyYWJsZQorICAgICAgICAgYmx1ZXRvb3RoIGludGVyZmFjZXMuICBJZiB0aGUgZGV2aWNlIGRvZXNuJ3Qgd2FudCB0byBzdXBwb3J0IHRldGhlcmluZyBvdmVyIGJsdWV0b290aCB0aGlzCisgICAgICAgICBzaG91bGQgYmUgZW1wdHkuIC0tPgorICAgIDxzdHJpbmctYXJyYXkgdHJhbnNsYXRhYmxlPSJmYWxzZSIgbmFtZT0iY29uZmlnX3RldGhlcl9ibHVldG9vdGhfcmVnZXhzIj4KKyAgICA8L3N0cmluZy1hcnJheT4KKwogICAgIDwhLS0gRGhjcCByYW5nZSAobWluLCBtYXgpIHRvIHVzZSBmb3IgdGV0aGVyaW5nIHB1cnBvc2VzIC0tPgogICAgIDxzdHJpbmctYXJyYXkgdHJhbnNsYXRhYmxlPSJmYWxzZSIgbmFtZT0iY29uZmlnX3RldGhlcl9kaGNwX3JhbmdlIj4KICAgICA8L3N0cmluZy1hcnJheT4KQEAgLTE5MSw2ICsyMDgsOSBAQAogICAgIDwhLS0gSW5kaWNhdGUgd2hldGhlciB0aGUgU0QgY2FyZCBpcyBhY2Nlc3NpYmxlIHdpdGhvdXQgcmVtb3ZpbmcgdGhlIGJhdHRlcnkuIC0tPgogICAgIDxib29sIG5hbWU9ImNvbmZpZ19iYXR0ZXJ5U2RDYXJkQWNjZXNzaWJpbGl0eSI+ZmFsc2U8L2Jvb2w+CiAKKyAgICA8IS0tIEluZGljYXRlIHdoZXRoZXIgdGhlIGRldmljZSBoYXMgVVNCIGhvc3Qgc3VwcG9ydC4gLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2hhc1VzYkhvc3RTdXBwb3J0Ij5mYWxzZTwvYm9vbD4KKwogICAgIDwhLS0gVmlicmF0b3IgcGF0dGVybiBmb3IgZmVlZGJhY2sgYWJvdXQgYSBsb25nIHNjcmVlbi9rZXkgcHJlc3MgLS0+CiAgICAgPGludGVnZXItYXJyYXkgbmFtZT0iY29uZmlnX2xvbmdQcmVzc1ZpYmVQYXR0ZXJuIj4KICAgICAgICAgPGl0ZW0+MDwvaXRlbT4KQEAgLTI3Myw2ICsyOTMsMTUgQEAKICAgICA8IS0tIEFsbG93IHRoZSBtZW51IGhhcmQga2V5IHRvIGJlIGRpc2FibGVkIGluIExvY2tTY3JlZW4gb24gc29tZSBkZXZpY2VzIC0tPgogICAgIDxib29sIG5hbWU9ImNvbmZpZ19kaXNhYmxlTWVudUtleUluTG9ja1NjcmVlbiI+ZmFsc2U8L2Jvb2w+CiAKKyAgICA8IS0tIFNob3cgc2xpZGluZyB0YWIgYmVmb3JlIGxvY2tzY3JlZW4gLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VuYWJsZVNsaWRpbmdUYWJGaXJzdCI+dHJ1ZTwvYm9vbD4KKworICAgIDwhLS0gRGlhYmxlIGxvY2tzY3JlZW4gcm90YXRpb24gYnkgZGVmYXVsdCAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfZW5hYmxlTG9ja1NjcmVlblJvdGF0aW9uIj5mYWxzZTwvYm9vbD4KKworICAgIDwhLS0gRW5hYmxlIDNEIFJlY2VudEFwcGxpY2F0aW9ucyB2aWV3IC0tPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19lbmFibGVSZWNlbnRBcHBzM0QiPmZhbHNlPC9ib29sPgorCiAgICAgPCEtLSBBcnJheSBvZiBsaWdodCBzZW5zb3IgTFVYIHZhbHVlcyB0byBkZWZpbmUgb3VyIGxldmVscyBmb3IgYXV0byBiYWNrbGlnaHQgYnJpZ2h0bmVzcyBzdXBwb3J0LgogICAgICAgICAgVGhlIE4gZW50cmllcyBvZiB0aGlzIGFycmF5IGRlZmluZSBOICsgMSB6b25lcyBhcyBmb2xsb3dzOgogCkBAIC0zNTcsNCArMzg2LDE3IEBACiAgICAgPCEtLSAyIG1lYW5zIGdpdmUgd2FybmluZyAtLT4KICAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfZGF0YXVzZV9ub3RpZmljYXRpb25fdHlwZSI+MjwvaW50ZWdlcj4KIAorICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGN1cnJlbnQgZGV2aWNlIGlzICJ2b2ljZSBjYXBhYmxlIi4KKyAgICAgICAgIElmIHRydWUsIHRoaXMgbWVhbnMgdGhhdCB0aGUgZGV2aWNlIHN1cHBvcnRzIGNpcmN1aXQtc3dpdGNoZWQKKyAgICAgICAgIChpLmUuIHZvaWNlKSBwaG9uZSBjYWxscyBvdmVyIHRoZSB0ZWxlcGhvbnkgbmV0d29yaywgYW5kIGlzCisgICAgICAgICBhbGxvd2VkIHRvIGRpc3BsYXkgdGhlIGluLWNhbGwgVUkgd2hpbGUgYSBjZWxsdWxhciB2b2ljZSBjYWxsIGlzCisgICAgICAgICBhY3RpdmUuICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIHRvIGZhbHNlIGZvciAiZGF0YSBvbmx5IiBkZXZpY2VzCisgICAgICAgICB3aGljaCBjYW4ndCBtYWtlIHZvaWNlIGNhbGxzIGFuZCBkb24ndCBzdXBwb3J0IGFueSBpbi1jYWxsIFVJLgorCisgICAgICAgICBOb3RlOiB0aGlzIGZsYWcgaXMgc3VidGx5IGRpZmZlcmVudCBmcm9tIHRoZQorICAgICAgICAgUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9URUxFUEhPTlkgc3lzdGVtIGZlYXR1cmUsIHdoaWNoIGlzCisgICAgICAgICBhdmFpbGFibGUgb24gKmFueSogZGV2aWNlIHdpdGggYSB0ZWxlcGhvbnkgcmFkaW8sIGV2ZW4gaWYgdGhlCisgICAgICAgICBkZXZpY2UgaXMgZGF0YS1vbmx5LiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfdm9pY2VfY2FwYWJsZSI+dHJ1ZTwvYm9vbD4KKwogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwKaW5kZXggMTFmM2U1MC4uZDNhYTJkNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbApAQCAtMjUsNiArMjUsOSBAQAogICAgIDwhLS0gVGhlIHN0YW5kYXJkIHNpemUgKGJvdGggd2lkdGggYW5kIGhlaWdodCkgb2YgYW4gYXBwbGljYXRpb24gaWNvbiB0aGF0CiAgICAgICAgICB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgYXBwIGxhdW5jaGVyIGFuZCBlbHNld2hlcmUuIC0tPgogICAgIDxkaW1lbiBuYW1lPSJhcHBfaWNvbl9zaXplIj40OGRpcDwvZGltZW4+CisgICAgPCEtLSBUaGUgc3RhbmRhcmQgc2l6ZSAoYm90aCB3aWR0aCBhbmQgaGVpZ2h0KSBvZiBhbiBhY3Rpb24gaWNvbiB0aGF0IHdpbGwKKyAgICAgICAgIGJlIGRpc3BsYXllZCBpbiBhcHBsaWNhdGlvbiBhY3Rpb24gYmFycy4gLS0+CisgICAgPGRpbWVuIG5hbWU9ImFjdGlvbl9pY29uX3NpemUiPjQ4ZGlwPC9kaW1lbj4KICAgICA8ZGltZW4gbmFtZT0idG9hc3RfeV9vZmZzZXQiPjY0ZGlwPC9kaW1lbj4KICAgICA8IS0tIEhlaWdodCBvZiB0aGUgc3RhdHVzIGJhciAtLT4KICAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9oZWlnaHQiPjI1ZGlwPC9kaW1lbj4KQEAgLTMyLDE0ICszNSwxOCBAQAogICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2ljb25fc2l6ZSI+MjVkaXA8L2RpbWVuPgogICAgIDwhLS0gTWFyZ2luIGF0IHRoZSBlZGdlIG9mIHRoZSBzY3JlZW4gdG8gaWdub3JlIHRvdWNoIGV2ZW50cyBmb3IgaW4gdGhlIHdpbmRvd3NoYWRlLiAtLT4KICAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9lZGdlX2lnbm9yZSI+NWRwPC9kaW1lbj4KKyAgICA8IS0tIE1hcmdpbiBmb3IgcGVybWFuZW50IHNjcmVlbiBkZWNvcmF0aW9ucyBhdCB0aGUgYm90dG9tLiAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic2NyZWVuX21hcmdpbl9ib3R0b20iPjBkaXA8L2RpbWVuPgogICAgIDwhLS0gU2l6ZSBvZiB0aGUgZmFzdHNjcm9sbCBoaW50IGxldHRlciAtLT4KICAgICA8ZGltZW4gbmFtZT0iZmFzdHNjcm9sbF9vdmVybGF5X3NpemUiPjEwNGRwPC9kaW1lbj4KICAgICA8IS0tIFdpZHRoIG9mIHRoZSBmYXN0c2Nyb2xsIHRodW1iIC0tPgogICAgIDxkaW1lbiBuYW1lPSJmYXN0c2Nyb2xsX3RodW1iX3dpZHRoIj42NGRwPC9kaW1lbj4KICAgICA8IS0tIEhlaWdodCBvZiB0aGUgZmFzdHNjcm9sbCB0aHVtYiAtLT4KICAgICA8ZGltZW4gbmFtZT0iZmFzdHNjcm9sbF90aHVtYl9oZWlnaHQiPjUyZHA8L2RpbWVuPgotICAgIDwhLS0gRGVmYXVsdCBoZWlnaHQgb2YgYSBrZXkgaW4gdGhlIHBhc3N3b3JkIGtleWJvYXJkIC0tPgotICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0Ij41NmRpcDwvZGltZW4+CisgICAgPCEtLSBEZWZhdWx0IGhlaWdodCBvZiBhIGtleSBpbiB0aGUgcGFzc3dvcmQga2V5Ym9hcmQgZm9yIGFscGhhIC0tPgorICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIj41NmRpcDwvZGltZW4+CisgICAgPCEtLSBEZWZhdWx0IGhlaWdodCBvZiBhIGtleSBpbiB0aGUgcGFzc3dvcmQga2V5Ym9hcmQgZm9yIG51bWVyaWMgLS0+CisgICAgPGRpbWVuIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfbnVtZXJpYyI+NTZkaXA8L2RpbWVuPgogICAgIDwhLS0gRGVmYXVsdCBjb3JyZWN0aW9uIGZvciB0aGUgc3BhY2Uga2V5IGluIHRoZSBwYXNzd29yZCBrZXlib2FyZCAtLT4KICAgICA8ZGltZW4gbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfc3BhY2ViYXJfdmVydGljYWxfY29ycmVjdGlvbiI+NGRpcDwvZGltZW4+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvaWRzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvaWRzLnhtbAppbmRleCA4YjZhZjcxLi4zM2NkMTAwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2lkcy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9pZHMueG1sCkBAIC01OSw2ICs1OSw3IEBACiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJjb3B5IiAvPgogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0icGFzdGUiIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJjb3B5VXJsIiAvPgorICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJzd2l0Y2hJbnB1dE1ldGhvZCIgLz4KICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9ImtleWJvYXJkVmlldyIgLz4KICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9ImNsb3NlQnV0dG9uIiAvPgpAQCAtNjgsNCArNjksNSBAQAogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0iYWNjb3VudFByZWZlcmVuY2VzIiAvPgogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0ic21hbGxJY29uIiAvPgogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0iY3VzdG9tIiAvPgorICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0iaG9tZSIgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9wdWJsaWMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9wdWJsaWMueG1sCmluZGV4IGRlNDE5YmUuLmU0Mzk1OTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvcHVibGljLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwKQEAgLTExODMsNyArMTE4Myw3IEBACiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iY29sb3JCYWNrZ3JvdW5kQ2FjaGVIaW50IiBpZD0iMHgwMTAxMDJhYiIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJkcm9wRG93bkhvcml6b250YWxPZmZzZXQiIGlkPSIweDAxMDEwMmFjIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImRyb3BEb3duVmVydGljYWxPZmZzZXQiIGlkPSIweDAxMDEwMmFkIiAvPgotICAKKwogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5XYWxscGFwZXIiIGlkPSIweDAxMDMwMDVlIiAvPgogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5XYWxscGFwZXIuTm9UaXRsZUJhciIgaWQ9IjB4MDEwMzAwNWYiIC8+CiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLldhbGxwYXBlci5Ob1RpdGxlQmFyLkZ1bGxzY3JlZW4iIGlkPSIweDAxMDMwMDYwIiAvPgpAQCAtMTE5MSw3ICsxMTkxLDcgQEAKICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuTGlnaHQuV2FsbHBhcGVyU2V0dGluZ3MiIGlkPSIweDAxMDMwMDYyIiAvPgogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TZWFyY2hSZXN1bHQuVGl0bGUiIGlkPSIweDAxMDMwMDYzIiAvPgogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TZWFyY2hSZXN1bHQuU3VidGl0bGUiIGlkPSIweDAxMDMwMDY0IiAvPgotICAKKwogICA8IS0tIFNlbWktdHJhbnNwYXJlbnQgYmFja2dyb3VuZCB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gcGxhY2luZyBhIGRhcmsKICAgICAgICB0aGVtZWQgVUkgb24gdG9wIG9mIHNvbWUgYXJiaXRyYXJ5IGJhY2tncm91bmQgKHN1Y2ggYXMgdGhlCiAgICAgICAgd2FsbHBhcGVyKS4gIFRoaXMgZGFya2VucyB0aGUgYmFja2dyb3VuZCBzdWZmaWNpZW50bHkgdGhhdCB0aGUgVUkKQEAgLTExOTksNyArMTE5OSw3IEBACiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InNjcmVlbl9iYWNrZ3JvdW5kX2RhcmtfdHJhbnNwYXJlbnQiIGlkPSIweDAxMDgwMGE5IiAvPgogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJzY3JlZW5fYmFja2dyb3VuZF9saWdodF90cmFuc3BhcmVudCIgaWQ9IjB4MDEwODAwYWEiIC8+CiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InN0YXRfbm90aWZ5X3NkY2FyZF9wcmVwYXJlIiBpZD0iMHgwMTA4MDBhYiIgLz4KLSAgCisKIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIFJlc291cmNlcyBhZGRlZCBpbiB2ZXJzaW9uIDYgb2YgdGhlIHBsYXRmb3JtIChFY2xhaXIgMi4wLjEpLgogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0xMjExLDcgKzEyMTEsNyBAQAogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd1NtYWxsIiBpZD0iMHgwMTAxMDJiMSIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJxdWlja0NvbnRhY3RCYWRnZVN0eWxlU21hbGxXaW5kb3dNZWRpdW0iIGlkPSIweDAxMDEwMmIyIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd0xhcmdlIiBpZD0iMHgwMTAxMDJiMyIgLz4KLSAgCisKIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIFJlc291cmNlcyBhZGRlZCBpbiB2ZXJzaW9uIDcgb2YgdGhlIHBsYXRmb3JtIChFY2xhaXIgTVIxKS4KICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtMTIyMCw3ICsxMjIwLDcgQEAKICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhdXRob3IiIGlkPSIweDAxMDEwMmI0IiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImF1dG9TdGFydCIgaWQ9IjB4MDEwMTAyYjUiIC8+CiAKLSAgICAKKwogPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgUmVzb3VyY2VzIGFkZGVkIGluIHZlcnNpb24gOCBvZiB0aGUgcGxhdGZvcm0gKEVjbGFpciBNUjIpLgogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0xMjQxLDIyICsxMjQxLDE4IEBACiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idGFiU3RyaXBFbmFibGVkIiBpZD0iMHgwMTAxMDJiZCIgLz4KIAogICA8cHVibGljIHR5cGU9ImlkIiBuYW1lPSJjdXN0b20iIGlkPSIweDAxMDIwMDJiIiAvPgotICAgIAorCiAgIDxwdWJsaWMgdHlwZT0iYW5pbSIgbmFtZT0iY3ljbGVfaW50ZXJwb2xhdG9yIiBpZD0iMHgwMTBhMDAwYyIgLz4KIAogPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgUmVzb3VyY2VzIGludHJvZHVjZWQgaW4gR2luZ2VyYnJlYWQuCiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAgCisgIDxlYXQtY29tbWVudCAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImxvZ28iIGlkPSIweDAxMDEwMmJlIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InhsYXJnZVNjcmVlbnMiIGlkPSIweDAxMDEwMmJmIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImltbWVyc2l2ZSIgaWQ9IjB4MDEwMTAyYzAiIC8+Ci0gIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ib3ZlcnNjcm9sbE1vZGUiIGlkPSIweDAxMDEwMmMxIiAvPgotICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Im92ZXJzY3JvbGxIZWFkZXIiIGlkPSIweDAxMDEwMmMyIiAvPgotICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Im92ZXJzY3JvbGxGb290ZXIiIGlkPSIweDAxMDEwMmMzIiAvPgotCiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJhdHRyIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwMTAzMDAiIC8+Ci0gIAorCiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJpZCIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDIwMDQwIiAvPgogICA8cHVibGljLXBhZGRpbmcgdHlwZT0iYW5pbSIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMGEwMDIwIiAvPgogCkBAIC0xMjY3LDkgKzEyNjMsOCBAQAogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJwcmVzZW5jZV9hdWRpb19hd2F5IiBpZD0iMHgwMTA4MDBhZiIgLz4KICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0icHJlc2VuY2VfYXVkaW9fYnVzeSIgaWQ9IjB4MDEwODAwYjAiIC8+CiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InByZXNlbmNlX2F1ZGlvX29ubGluZSIgaWQ9IjB4MDEwODAwYjEiIC8+Ci0KICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwODAxMDAiIC8+Ci0gIAorCiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJzdHlsZSIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDMwMDkwIiAvPgogICA8cHVibGljLXBhZGRpbmcgdHlwZT0ic3RyaW5nIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwNDAwMjAiIC8+CiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJpbnRlZ2VyIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwZTAwMTAiIC8+CkBAIC0xMjc3LDQgKzEyNzIsOTEgQEAKICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImRpbWVuIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwNTAwMTAiIC8+CiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJjb2xvciIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDYwMDIwIiAvPgogICA8cHVibGljLXBhZGRpbmcgdHlwZT0iYXJyYXkiIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQiIGVuZD0iMHgwMTA3MDAxMCIgLz4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgUmVzb3VyY2VzIHByb3Bvc2VkIGZvciBIb25leWNvbWIuCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPGVhdC1jb21tZW50IC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWRhcHRlciIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzZWxlY3Rpb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic29ydE9yZGVyIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InVyaSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmcm9tIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InRvIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFzIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZyb21WYWx1ZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ0b1ZhbHVlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImNvbHVtbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ3aXRoRXhwcmVzc2lvbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ3aXRoQ2xhc3MiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWxsQ29udGFjdHNOYW1lIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9IndpbmRvd0FjdGlvbkJhciIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJTdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJuYXZpZ2F0aW9uTW9kZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJkaXNwbGF5T3B0aW9ucyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzdWJ0aXRsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJjdXN0b21OYXZpZ2F0aW9uTGF5b3V0IiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImhhcmR3YXJlQWNjZWxlcmF0ZWQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYW5pbWF0ZUZpcnN0VmlldyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJkcm9wRG93blNwaW5uZXJTdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25Ecm9wRG93blN0eWxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvbkJ1dHRvblN0eWxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InNob3dBc0FjdGlvbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25CdXR0b25QYWRkaW5nIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InByZXZpZXdJbWFnZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25Nb2RlQmFja2dyb3VuZCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VEcmF3YWJsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ3aW5kb3dBY3Rpb25Nb2RlT3ZlcmxheSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ2YWx1ZUZyb20iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idmFsdWVUbyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ2YWx1ZVR5cGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0icHJvcGVydHlOYW1lIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Im9yZGVyaW5nIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZyYWdtZW50IiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9IndpbmRvd0FjdGlvbkJhck92ZXJsYXkiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJhZ21lbnRPcGVuRW50ZXJBbmltYXRpb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJhZ21lbnRPcGVuRXhpdEFuaW1hdGlvbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmcmFnbWVudENsb3NlRW50ZXJBbmltYXRpb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJhZ21lbnRDbG9zZUV4aXRBbmltYXRpb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2luZG93QWN0aW9uQmFyU2l6ZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJpbWVTdWJ0eXBlTG9jYWxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImltZVN1YnR5cGVNb2RlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImltZVN1YnR5cGVFeHRyYVZhbHVlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InNwbGl0TW90aW9uRXZlbnRzIiAvPgorCisgIDxwdWJsaWMgdHlwZT0iYW5pbSIgbmFtZT0iYW5pbWF0b3JfZmFkZV9pbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhbmltIiBuYW1lPSJhbmltYXRvcl9mYWRlX291dCIgLz4KKworICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Imxpc3RDaG9pY2VCYWNrZ3JvdW5kSW5kaWNhdG9yIiBpZD0iMHgwMTAxMDMzMCIgLz4KKworICA8cHVibGljIHR5cGU9ImlkIiBuYW1lPSJob21lIiAvPgorICA8IS0tIENvbnRleHQgbWVudSBJRCBmb3IgdGhlICJTZWxlY3QgdGV4dC4uLiIgbWVudSBpdGVtIHRvIHN3aXRjaCB0byB0ZXh0CisgICAgICAgc2VsZWN0aW9uIGNvbnRleHQgbW9kZSBpbiB0ZXh0IHZpZXdzLiAtLT4KKyAgPHB1YmxpYyB0eXBlPSJpZCIgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIC8+CisgIAorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5XaXRoQWN0aW9uQmFyIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJXaWRnZXQuU3Bpbm5lci5Ecm9wRG93biIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iV2lkZ2V0LkFjdGlvbkJ1dHRvbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuRGlhbG9nLk5vRnJhbWUiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLk5vVGl0bGVCYXIuT3ZlcmxheUFjdGlvbk1vZGVzIiAvPgorCisgIDwhLS0gU3RhbmRhcmQgY29udGVudCB2aWV3IGZvciBhIHtAbGluayBhbmRyb2lkLmFwcC5MaXN0RnJhZ21lbnR9LgorICAgICAgIElmIHlvdSBhcmUgaW1wbGVtZW50aW5nIGEgc3ViY2xhc3Mgb2YgTGlzdEZyYWdtZW50IHdpdGggeW91cgorICAgICAgIG93biBjdXN0b21pemVkIGNvbnRlbnQsIHlvdSBjYW4gaW5jbHVkZSB0aGlzIGxheW91dCBpbiB0aGF0CisgICAgICAgY29udGVudCB0byBzdGlsbCByZXRhaW4gYWxsIG9mIHRoZSBzdGFuZGFyZCBmdW5jdGlvbmFsaXR5IG9mCisgICAgICAgdGhlIGJhc2UgY2xhc3MuIC0tPgorICA8cHVibGljIHR5cGU9ImxheW91dCIgbmFtZT0ibGlzdF9jb250ZW50IiAvPgorCisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLkhvbG8iIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLkxpZ2h0LkhvbG8iIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLkhvbG8uTm9BY3Rpb25CYXIiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLkhvbG8uTm9BY3Rpb25CYXIuRnVsbHNjcmVlbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuTGlnaHQuSG9sby5Ob0FjdGlvbkJhciIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuTGlnaHQuSG9sby5Ob0FjdGlvbkJhci5GdWxsc2NyZWVuIiAvPgorCisgIDwhLS0gQSBzaW1wbGUgTGlzdFZpZXcgaXRlbSBsYXlvdXQgd2hpY2ggY2FuIGNvbnRhaW4gdGV4dCBhbmQgc3VwcG9ydCAoc2luZ2xlIG9yIG11bHRpcGxlKSBpdGVtIHNlbGVjdGlvbi4gLS0+CisgIDxwdWJsaWMgdHlwZT0ibGF5b3V0IiBuYW1lPSJzaW1wbGVfc2VsZWN0YWJsZV9saXN0X2l0ZW0iIGlkPSIweDAxMDkwMDIyIiAvPgorCisgIDxwdWJsaWMgdHlwZT0ic3RyaW5nIiBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgaWQ9IjB4MDEwNDAwMzAiIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IDAzYjcyMWMuLmUzOGEyMjggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtODA3LDggKzgwNyw4IEBACiAgICAgPCEtLSBUaXRsZSBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ2FsZW5kYXIiPmFkZCBvciBtb2RpZnkgY2FsZW5kYXIgZXZlbnRzIGFuZCBzZW5kIGVtYWlsIHRvIGd1ZXN0czwvc3RyaW5nPgogICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDYWxlbmRhciI+QWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGFkZCBvciBjaGFuZ2UgdGhlIAotICAgICAgICBldmVudHMgb24geW91ciBjYWxlbmRhciwgd2hpY2ggbWF5IHNlbmQgZW1haWwgdG8gZ3Vlc3RzLiBNYWxpY2lvdXMgYXBwbGljYXRpb25zIGNhbiB1c2UgdGhpcyAKKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ2FsZW5kYXIiPkFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBhZGQgb3IgY2hhbmdlIHRoZQorICAgICAgICBldmVudHMgb24geW91ciBjYWxlbmRhciwgd2hpY2ggbWF5IHNlbmQgZW1haWwgdG8gZ3Vlc3RzLiBNYWxpY2lvdXMgYXBwbGljYXRpb25zIGNhbiB1c2UgdGhpcwogICAgICAgICB0byBlcmFzZSBvciBtb2RpZnkgeW91ciBjYWxlbmRhciBldmVudHMgb3IgdG8gc2VuZCBlbWFpbCB0byBndWVzdHMuPC9zdHJpbmc+CiAKICAgICA8IS0tIFRpdGxlIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KQEAgLTEyNTIsNiArMTI1MiwxMSBAQAogICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgcG9saWN5IGFjY2VzcyB0byB3aXBlIHRoZSB1c2VyJ3MgZGF0YSAtLT4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiPlBlcmZvcm0gYSBmYWN0b3J5IHJlc2V0LCBkZWxldGluZwogICAgICAgICBhbGwgb2YgeW91ciBkYXRhIHdpdGhvdXQgYW55IGNvbmZpcm1hdGlvbi48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSI+U2V0IHRoZSBkZXZpY2UgZ2xvYmFsIHByb3h5PC9zdHJpbmc+CisgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiBwb2xpY3kgYWNjZXNzIHRvIHdpcGUgdGhlIHVzZXIncyBkYXRhIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSI+U2V0IHRoZSBkZXZpY2UgZ2xvYmFsIHByb3h5CisgICAgICAgIHRvIGJlIHVzZWQgd2hpbGUgcG9saWN5IGlzIGVuYWJsZWQuIE9ubHkgdGhlIGZpcnN0IGRldmljZSBhZG1pbgorICAgICAgICBzZXRzIHRoZSBlZmZlY3RpdmUgZ2xvYmFsIHByb3h5Ljwvc3RyaW5nPgogCiAgICAgPCEtLSBUaGUgb3JkZXIgb2YgdGhlc2UgaXMgaW1wb3J0YW50LCBkb24ndCByZW9yZGVyIHdpdGhvdXQgY2hhbmdpbmcgQ29udGFjdHMuamF2YSAtLT4gPHNraXAgLz4KICAgICA8IS0tIFBob25lIG51bWJlciB0eXBlcyBmcm9tIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMuIFRoaXMgY291bGQgYmUgdXNlZCB3aGVuIGFkZGluZyBhIG5ldyBwaG9uZSBudW1iZXIgZm9yIGEgY29udGFjdCwgZm9yIGV4YW1wbGUuIC0tPgpAQCAtMTQyMSwyMCArMTQyNiwxOCBAQAogICAgIDwhLS0gQ3VzdG9tIG9yZ2FuaXphdGlvbiB0eXBlIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSI+Q3VzdG9tPC9zdHJpbmc+CiAKLSAgICA8IS0tIEF0dGJ1dGlvbiBvZiBhIGNvbnRhY3Qgc3RhdHVzIHVwZGF0ZSwgd2hlbiB0aGUgdGltZSBvZiB1cGRhdGUgaXMgdW5rbm93biAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiI+dmlhIDx4bGlmZjpnIGlkPSJzb3VyY2UiIGV4YW1wbGU9Ikdvb2dsZSBUYWxrIj4lMSRzPC94bGlmZjpnPjwvc3RyaW5nPgotCi0gICAgPCEtLSBBdHRidXRpb24gb2YgYSBjb250YWN0IHN0YXR1cyB1cGRhdGUsIHdoZW4gdGhlIHRpbWUgb2YgdXBkYXRlIGlzIGtub3duIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSI+PHhsaWZmOmcgaWQ9ImRhdGUiIGV4YW1wbGU9IjMgaG91cnMgYWdvIj4lMSRzPC94bGlmZjpnPiB2aWEgPHhsaWZmOmcgaWQ9InNvdXJjZSIgZXhhbXBsZT0iR29vZ2xlIFRhbGsiPiUyJHM8L3hsaWZmOmc+PC9zdHJpbmc+Ci0KICAgICA8IS0tIEluc3RydWN0aW9ucyB0ZWxsaW5nIHRoZSB1c2VyIHRvIGVudGVyIHRoZWlyIFNJTSBQSU4gdG8gdW5sb2NrIHRoZSBrZXlndWFyZC4KICAgICAgICAgIERpc3BsYXllZCBpbiBvbmUgbGluZSBpbiBhIGxhcmdlIGZvbnQuICAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIj5FbnRlciBQSU4gY29kZTwvc3RyaW5nPgogCi0gICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVpciBQSU4gcGFzc3dvcmQgdG8gdW5sb2NrIHRoZSBrZXlndWFyZC4KKyAgICA8IS0tIEluc3RydWN0aW9ucyB0ZWxsaW5nIHRoZSB1c2VyIHRvIGVudGVyIHRoZWlyIHRleHQgcGFzc3dvcmQgdG8gdW5sb2NrIHRoZSBrZXlndWFyZC4KICAgICAgICAgIERpc3BsYXllZCBpbiBvbmUgbGluZSBpbiBhIGxhcmdlIGZvbnQuICAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiPkVudGVyIHBhc3N3b3JkIHRvIHVubG9jazwvc3RyaW5nPgogCisgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVpciBQSU4gcGFzc3dvcmQgdG8gdW5sb2NrIHRoZSBrZXlndWFyZC4KKyAgICAgICAgIERpc3BsYXllZCBpbiBvbmUgbGluZSBpbiBhIGxhcmdlIGZvbnQuICAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIj5FbnRlciBQSU4gdG8gdW5sb2NrPC9zdHJpbmc+CisKICAgICA8IS0tIEluc3RydWN0aW9ucyB0ZWxsaW5nIHRoZSB1c2VyIHRoYXQgdGhleSBlbnRlcmVkIHRoZSB3cm9uZyBwaW4gd2hpbGUgdHJ5aW5nCiAgICAgICAgICB0byB1bmxvY2sgdGhlIGtleWd1YXJkLiAgRGlzcGxheWVkIGluIG9uZSBsaW5lIGluIGEgbGFyZ2UgZm9udC4gIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiPkluY29ycmVjdCBQSU4gY29kZSE8L3N0cmluZz4KQEAgLTE0NzEsNiArMTQ3NCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCI+Q29ycmVjdCE8L3N0cmluZz4KICAgICA8IS0tIE9uIHRoZSB1bmxvY2sgcGF0dGVybiBzY3JlZW4sIHNob3duIHdoZW4gdGhlIHVzZXIgZW50ZXJzIHRoZSB3cm9uZyBsb2NrIHBhdHRlcm4gYW5kIG11c3QgdHJ5IGFnYWluLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyI+U29ycnksIHRyeSBhZ2Fpbjwvc3RyaW5nPgorICAgIDwhLS0gT24gdGhlIHVubG9jayBwYXNzd29yZCBzY3JlZW4sIHNob3duIHdoZW4gdGhlIHVzZXIgZW50ZXJzIHRoZSB3cm9uZyBsb2NrIHBhc3N3b3JkIGFuZCBtdXN0IHRyeSBhZ2Fpbi4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIj5Tb3JyeSwgdHJ5IGFnYWluPC9zdHJpbmc+CiAKICAgICA8IS0tIFdoZW4gdGhlIGxvY2sgc2NyZWVuIGlzIHNob3dpbmcgYW5kIHRoZSBwaG9uZSBwbHVnZ2VkIGluLCBhbmQgdGhlIGJhdHRlcnkKICAgICAgICAgIGlzIG5vdCBmdWxseSBjaGFyZ2VkLCBzaG93IHRoZSBjdXJyZW50IGNoYXJnZSAlLiAgLS0+CkBAIC0xNTE0LDEyICsxNTE5LDI3IEBACiAgICAgICAgICBwcm9ncmVzcyBkaWFsb2cgaW4gdGhlIG1lYW50aW1lLiAgdGhpcyBpcyB0aGUgZW1zc2FnZS4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiPlVubG9ja2luZyBTSU0gY2FyZFx1MjAyNjwvc3RyaW5nPgogCi0gICAgPCEtLSBGb3IgdGhlIHVubG9jayBzY3JlZW4sIEluZm9ybWF0aW9uIG1lc3NhZ2Ugc2hvd24gaW4gZGlhbG9nIHdoZW4gdXNlciBoYXMgdG9vIG1hbnkgZmFpbGVkIGF0dGVtcHRzIC0tPgorICAgIDwhLS0gRm9yIHRoZSB1bmxvY2sgc2NyZWVuLCBJbmZvcm1hdGlvbiBtZXNzYWdlIHNob3duIGluIGRpYWxvZyB3aGVuIHVzZXIgaGFzIHRvbyBtYW55IGZhaWxlZCBhdHRlbXB0cyBhdAorICAgICAgICAgZHJhd2luZyB0aGUgdW5sb2NrIHBhdHRlcm4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSI+CiAgICAgICAgIFlvdSBoYXZlIGluY29ycmVjdGx5IGRyYXduIHlvdXIgdW5sb2NrIHBhdHRlcm4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHRpbWVzLgogICAgICAgICBcblxuUGxlYXNlIHRyeSBhZ2FpbiBpbiA8eGxpZmY6ZyBpZD0ibnVtYmVyIj4lZDwveGxpZmY6Zz4gc2Vjb25kcy4KICAgICA8L3N0cmluZz4KIAorICAgIDwhLS0gRm9yIHRoZSB1bmxvY2sgc2NyZWVuLCBJbmZvcm1hdGlvbiBtZXNzYWdlIHNob3duIGluIGRpYWxvZyB3aGVuIHVzZXIgaGFzIHRvbyBtYW55IGZhaWxlZCBhdHRlbXB0cyBhdAorICAgICAgICAgZW50ZXJpbmcgdGhlIHBhc3N3b3JkIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiPgorICAgICAgICBZb3UgaGF2ZSBpbmNvcnJlY3RseSBlbnRlcmVkIHlvdXIgcGFzc3dvcmQgPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHRpbWVzLgorICAgICAgICBcblxuUGxlYXNlIHRyeSBhZ2FpbiBpbiA8eGxpZmY6ZyBpZD0ibnVtYmVyIj4lZDwveGxpZmY6Zz4gc2Vjb25kcy4KKyAgICA8L3N0cmluZz4KKworICAgIDwhLS0gRm9yIHRoZSB1bmxvY2sgc2NyZWVuLCBJbmZvcm1hdGlvbiBtZXNzYWdlIHNob3duIGluIGRpYWxvZyB3aGVuIHVzZXIgaGFzIHRvbyBtYW55IGZhaWxlZCBhdHRlbXB0cyBhdAorICAgICAgICAgZW50ZXJpbmcgdGhlIFBJTiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSI+CisgICAgICAgIFlvdSBoYXZlIGluY29ycmVjdGx5IGVudGVyZWQgeW91ciBQSU4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHRpbWVzLgorICAgICAgICBcblxuUGxlYXNlIHRyeSBhZ2FpbiBpbiA8eGxpZmY6ZyBpZD0ibnVtYmVyIj4lZDwveGxpZmY6Zz4gc2Vjb25kcy4KKyAgICA8L3N0cmluZz4KKwogICAgIDwhLS0gRm9yIHRoZSB1bmxvY2sgc2NyZWVuLCBJbmZvcm1hdGlvbiBtZXNzYWdlIHNob3duIGluIGRpYWxvZyB3aGVuIHVzZXIgaXMgYWxtb3N0IGF0IHRoZSBsaW1pdAogICAgICAgICAgd2hlcmUgdGhleSB3aWxsIGJlIGxvY2tlZCBvdXQgYW5kIG1heSBoYXZlIHRvIGVudGVyIGFuIGFsdGVybmF0ZSB1c2VybmFtZS9wYXNzd29yZCB0byB1bmxvY2sgdGhlIHBob25lIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiI+CkBAIC0xNTg5LDggKzE2MDksMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhY3Rvcnl0ZXN0X3JlYm9vdCI+UmVib290PC9zdHJpbmc+CiAKICAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuICBXZWJWaWV3IFVzZXIgQWdlbnQgc3RyaW5nIC0tPgotICAgIDxzdHJpbmcgbmFtZT0id2ViX3VzZXJfYWdlbnQiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPjx4bGlmZjpnIGlkPSJ4Ij5Nb3ppbGxhLzUuMCAoTGludXg7IFU7IEFuZHJvaWQgJXMpCi0gICAgICAgIEFwcGxlV2ViS2l0LzUzMy4xIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzMuMTwveGxpZmY6Zz48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9IndlYl91c2VyX2FnZW50IiB0cmFuc2xhdGFibGU9ImZhbHNlIj5Nb3ppbGxhLzUuMCAoTGludXg7IFU7IDx4bGlmZjpnIGlkPSJ4Ij5BbmRyb2lkICVzPC94bGlmZjpnPikKKyAgICAgICAgQXBwbGVXZWJLaXQvNTM0LjYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCA8eGxpZmY6ZyBpZD0ibW9iaWxlIj4lczwveGxpZmY6Zz5TYWZhcmkvNTM0LjY8L3N0cmluZz4KKyAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuICBXZWJWaWV3IFVzZXIgQWdlbnQgdGFyZ2V0ZWQgY29udGVudCAtLT4KKyAgICA8c3RyaW5nIG5hbWU9IndlYl91c2VyX2FnZW50X3RhcmdldF9jb250ZW50IiB0cmFuc2xhdGFibGU9ImZhbHNlIj4iTW9iaWxlICI8L3N0cmluZz4KIAogICAgIDwhLS0gVGl0bGUgZm9yIGEgSmF2YVNjcmlwdCBkaWFsb2cuICJUaGUgcGFnZSBhdCA8dXJsIG9mIGN1cnJlbnQgcGFnZT4gc2F5czoiIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ianNfZGlhbG9nX3RpdGxlIj5UaGUgcGFnZSBhdCBcJzx4bGlmZjpnIGlkPSJ0aXRsZSI+JXM8L3hsaWZmOmc+XCcgc2F5czo8L3N0cmluZz4KQEAgLTE4NTMsOSArMTg3NSw2IEBACiAgICAgPCEtLSBJdGVtIG9uIEVkaXRUZXh0IGNvbnRleHQgbWVudS4gVGhpcyBhY3Rpb24gaXMgdXNlZCB0byBzZWxlY3QgYWxsIHRleHQgaW4gdGhlIGVkaXQgZmllbGQuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIj5TZWxlY3QgYWxsPC9zdHJpbmc+CiAKLSAgICA8IS0tIEl0ZW0gb24gRWRpdFRleHQgY29udGV4dCBtZW51LiBUaGlzIGFjdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IHNlbGVjdGluZyB0ZXh0IGluIHRoZSBlZGl0IGZpZWxkLiBbQ0hBUiBMSU1JVD0yMF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0Ij5TZWxlY3Qgd29yZDwvc3RyaW5nPgotCiAgICAgPCEtLSBJdGVtIG9uIEVkaXRUZXh0IGNvbnRleHQgbWVudS4gIFRoaXMgYWN0aW9uIGlzIHVzZWQgdG8gY3V0IHNlbGVjdGVkIHRoZSB0ZXh0IGludG8gdGhlIGNsaXBib2FyZC4gIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0Ij5DdXQ8L3N0cmluZz4KIApAQCAtMTg2OCwxNSArMTg4NywxNyBAQAogICAgIDwhLS0gSXRlbSBvbiBFZGl0VGV4dCBjb250ZXh0IG1lbnUuIFRoaXMgYWN0aW9uIGlzIHVzZWQgdG8gY29weSBhIFVSTCBmcm9tIHRoZSBlZGl0IGZpZWxkIGludG8gdGhlIGNsaXBib2FyZC4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIj5Db3B5IFVSTDwvc3RyaW5nPgogCisgICAgPCEtLSBJdGVtIG9uIEVkaXRUZXh0IGNvbnRleHQgbWVudS4gQWRkZWQgb25seSB3aGVuIHRoZSBjb250ZXh0IG1lbnUgaXMgbm90IGVtcHR5LCBpdCBlbmFibGUgc2VsZWN0aW9uIGNvbnRleHQgbW9kZS4gW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiPlNlbGVjdCB0ZXh0Li4uPC9zdHJpbmc+CisKKyAgICA8IS0tIFRleHQgc2VsZWN0aW9uIGNvbnRleHR1YWwgbW9kZSB0aXRsZSwgZGlzcGxheWVkIGluIHRoZSBDQUIuIFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InRleHRTZWxlY3Rpb25DQUJUaXRsZSI+VGV4dCBzZWxlY3Rpb248L3N0cmluZz4KKwogICAgIDwhLS0gRWRpdFRleHQgY29udGV4dCBtZW51IC0tPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiPklucHV0IG1ldGhvZDwvc3RyaW5nPgogCi0gICAgPCEtLSBJdGVtIG9uIEVkaXRUZXh0IGNvbnRleHQgbWVudSwgdXNlZCB0byBhZGQgYSB3b3JkIHRvIHRoZQotICAgICAgICAgaW5wdXQgbWV0aG9kIGRpY3Rpb25hcnkuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5Ij4iQWRkIFwiPHhsaWZmOmcgaWQ9IndvcmQiIGV4YW1wbGU9InJpY2tyb2xsIj4lczwveGxpZmY6Zz5cIiB0byBkaWN0aW9uYXJ5PC9zdHJpbmc+Ci0KLSAgICA8IS0tIFRpdGxlIGZvciBFZGl0VGV4dCBjb250ZXh0IG1lbnUgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSI+RWRpdCB0ZXh0PC9zdHJpbmc+CisgICAgPCEtLSBUaXRsZSBmb3IgRWRpdFRleHQgY29udGV4dCBtZW51IFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIj5UZXh0IGFjdGlvbnM8L3N0cmluZz4KIAogICAgIDwhLS0gSWYgdGhlIGRldmljZSBpcyBnZXR0aW5nIGxvdyBvbiBpbnRlcm5hbCBzdG9yYWdlLCBhIG5vdGlmaWNhdGlvbiBpcyBzaG93biB0byB0aGUgdXNlci4gIFRoaXMgaXMgdGhlIHRpdGxlIG9mIHRoYXQgbm90aWZpY2F0aW9uLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiPkxvdyBvbiBzcGFjZTwvc3RyaW5nPgpAQCAtMTg5NSw2ICsxOTE2LDkgQEAKICAgICAgICAgIGNvbWJpbmVkIHdpdGggc2V0SWNvbihhbmRyb2lkLlIuZHJhd2FibGUuaWNfZGlhbG9nX2FsZXJ0KSAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSI+QXR0ZW50aW9uPC9zdHJpbmc+CiAKKyAgICA8IS0tIFRleHQgc2hvd24gYnkgbGlzdCBmcmFnbWVudCB3aGVuIHdhaXRpbmcgZm9yIGRhdGEgdG8gZGlzcGxheS4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIj5Mb2FkaW5nLi4uPC9zdHJpbmc+CisKICAgICA8IS0tIERlZmF1bHQgdGV4dCBmb3IgYSBidXR0b24gdGhhdCBjYW4gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iPk9OPC9zdHJpbmc+CiAgICAgPCEtLSBEZWZhdWx0IHRleHQgZm9yIGEgYnV0dG9uIHRoYXQgY2FuIGJlIHRvZ2dsZWQgb24gYW5kIG9mZi4gLS0+CkBAIC0xOTQ1LDIzICsxOTY5LDIzIEBACiAKICAgICA8IS0tIE5vdGlmaWNhdGlvbiB0ZXh0IHRvIHRlbGwgdGhlIHVzZXIgdGhhdCBhIGhlYXZ5LXdlaWdodCBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iPjx4bGlmZjpnIGlkPSJhcHAiPiUxJHM8L3hsaWZmOmc+IHJ1bm5pbmc8L3N0cmluZz4KLSAgICAKKwogICAgIDwhLS0gTm90aWZpY2F0aW9uIGRldGFpbHMgdG8gdGVsbCB0aGUgdXNlciB0aGF0IGEgaGVhdnktd2VpZ2h0IGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbl9kZXRhaWwiPlNlbGVjdCB0byBzd2l0Y2ggdG8gYXBwbGljYXRpb248L3N0cmluZz4KLSAgICAKKwogICAgIDwhLS0gVGl0bGUgb2YgZGlhbG9nIHByb21wdGluZyB3aGV0aGVyIHVzZXIgd2FudHMgdG8gc3dpdGNoIGJldHdlZW4gaGVhdnktd2VpZ2h0IGFwcHMuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X3N3aXRjaGVyX3RpdGxlIj5Td2l0Y2ggYXBwbGljYXRpb25zPzwvc3RyaW5nPgotICAgIAorCiAgICAgPCEtLSBEZXNjcmlwdGl2ZSB0ZXh0IGZvciBzd2l0Y2hpbmcgdG8gYSBuZXcgaGVhdnktd2VpZ2h0IGFwcGxpY2F0aW9uLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9zd2l0Y2hlcl90ZXh0Ij5Bbm90aGVyIGFwcGxpY2F0aW9uIGlzIGFscmVhZHkgcnVubmluZwogICAgIHRoYXQgbXVzdCBiZSBzdG9wcGVkIGJlZm9yZSB5b3UgY2FuIHN0YXJ0IGEgbmV3IG9uZS48L3N0cmluZz4KLSAgICAKKwogICAgIDxzdHJpbmcgbmFtZT0ib2xkX2FwcF9hY3Rpb24iPlJldHVybiB0byA8eGxpZmY6ZyBpZD0ib2xkX2FwcCI+JTEkczwveGxpZmY6Zz48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9sZF9hcHBfZGVzY3JpcHRpb24iPkRvblwndCBzdGFydCB0aGUgbmV3IGFwcGxpY2F0aW9uLjwvc3RyaW5nPgotICAgIAorCiAgICAgPHN0cmluZyBuYW1lPSJuZXdfYXBwX2FjdGlvbiI+U3RhcnQgPHhsaWZmOmcgaWQ9Im9sZF9hcHAiPiUxJHM8L3hsaWZmOmc+PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJuZXdfYXBwX2Rlc2NyaXB0aW9uIj5TdG9wIHRoZSBvbGQgYXBwbGljYXRpb24gd2l0aG91dCBzYXZpbmcuPC9zdHJpbmc+Ci0gICAgCisKICAgICA8IS0tIERpc3BsYXllZCBpbiB0aGUgdGl0bGUgb2YgdGhlIGNob29zZXIgZm9yIHRoaW5ncyB0byBkbyB3aXRoIHRleHQgdGhhdAogICAgICAgICAgaXMgdG8gYmUgc2VudCB0byBhbm90aGVyIGFwcGxpY2F0aW9uLiBGb3IgZXhhbXBsZSwgSSBjYW4gc2VuZAogICAgICAgICAgdGV4dCB0aHJvdWdoIFNNUyBvciBJTS4gIEEgZGlhbG9nIHdpdGggdGhvc2UgY2hvaWNlcyB3b3VsZCBiZSBzaG93biwKQEAgLTIyMzMsMTcgKzIyNTcsMTMgQEAKICAgICA8IS0tIExvY2FsaXplZCBzdHJpbmdzIGZvciBXZWJWaWV3IC0tPgogICAgIDwhLS0gTGFiZWwgZm9yIGJ1dHRvbiBpbiBhIFdlYlZpZXcgdGhhdCB3aWxsIG9wZW4gYSBjaG9vc2VyIHRvIGNob29zZSBhIGZpbGUgdG8gdXBsb2FkIC0tPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiPkNob29zZSBmaWxlPC9zdHJpbmc+CisgICAgPCEtLSBMYWJlbCBmb3IgdGhlIGZpbGUgdXBsb2FkIGNvbnRyb2wgd2hlbiBubyBmaWxlIGhhcyBiZWVuIGNob3NlbiB5ZXQgLS0+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiI+Tm8gZmlsZSBjaG9zZW48L3N0cmluZz4KICAgICA8IS0tIExhYmVsIGZvciA8aW5wdXQgdHlwZT0icmVzZXQiPiBidXR0b24gaW4gaHRtbCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0Ij5SZXNldDwvc3RyaW5nPgogICAgIDwhLS0gTGFiZWwgZm9yIDxpbnB1dCB0eXBlPSJzdWJtaXQiPiBidXR0b24gaW4gaHRtbCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCI+U3VibWl0PC9zdHJpbmc+CiAKLSAgICA8IS0tIFN0cmluZyBkZXNjcmliaW5nIHRoZSBTdGFyL0Zhdm9yaXRlIGNoZWNrYm94Ci0KLSAgICAgICAgIFVzZWQgYnkgQWNjZXNzaWJpbGl0eVNlcnZpY2UgdG8gYW5ub3VuY2UgdGhlIHB1cnBvc2Ugb2YgdGhlIHZpZXcuCi0gICAgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIj5mYXZvcml0ZTwvc3RyaW5nPgotCiAgICAgPCEtLSBTdHJpbmdzIGZvciBjYXIgbW9kZSBub3RpZmljYXRpb24gLS0+CiAgICAgPCEtLSBTaG93biB3aGVuIGNhciBtb2RlIGlzIGVuYWJsZWQgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSI+Q2FyIG1vZGUgZW5hYmxlZDwvc3RyaW5nPgpAQCAtMjI1NCw2ICsyMjc0LDEzIEBACiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiPlRldGhlcmluZyBvciBob3RzcG90IGFjdGl2ZTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiPlRvdWNoIHRvIGNvbmZpZ3VyZTwvc3RyaW5nPgogCisgICAgPCEtLSAgU3RyaW5ncyBmb3IgcG9zc2libGUgUHJlZmVyZW5jZUFjdGl2aXR5IEJhY2svTmV4dCBidXR0b25zIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiPkJhY2s8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIj5OZXh0PC9zdHJpbmc+CisKKyAgICA8IS0tIE9wdGlvbmFsIGJ1dHRvbiB0byBTa2lwIGEgUHJlZmVyZW5jZUFjdGl2aXR5IFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIj5Ta2lwPC9zdHJpbmc+CisKICAgICA8IS0tIFN0cmluZ3MgZm9yIHRocm90dGxpbmcgbm90aWZpY2F0aW9uIC0tPgogICAgIDwhLS0gU2hvd24gd2hlbiB0aGUgdXNlciBpcyBpbiBkYW5nZXIgb2YgYmVpbmcgdGhyb3R0bGVkIC0tPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiPkhpZ2ggbW9iaWxlIGRhdGEgdXNlPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKaW5kZXggYWYwNDExNy4uNjk2NDgwOCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtNzQsNiArNzQsMTAgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0id2FsbHBhcGVySW50cmFPcGVuRXhpdEFuaW1hdGlvbiI+QGFuaW0vd2FsbHBhcGVyX2ludHJhX29wZW5fZXhpdDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0id2FsbHBhcGVySW50cmFDbG9zZUVudGVyQW5pbWF0aW9uIj5AYW5pbS93YWxscGFwZXJfaW50cmFfY2xvc2VfZW50ZXI8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9IndhbGxwYXBlckludHJhQ2xvc2VFeGl0QW5pbWF0aW9uIj5AYW5pbS93YWxscGFwZXJfaW50cmFfY2xvc2VfZXhpdDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZnJhZ21lbnRPcGVuRW50ZXJBbmltYXRpb24iPkBhbmltL2ZyYWdtZW50X29wZW5fZW50ZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImZyYWdtZW50T3BlbkV4aXRBbmltYXRpb24iPkBhbmltL2ZyYWdtZW50X29wZW5fZXhpdDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZnJhZ21lbnRDbG9zZUVudGVyQW5pbWF0aW9uIj5AYW5pbS9mcmFnbWVudF9jbG9zZV9lbnRlcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZnJhZ21lbnRDbG9zZUV4aXRBbmltYXRpb24iPkBhbmltL2ZyYWdtZW50X2Nsb3NlX2V4aXQ8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDwhLS0gU3RhbmRhcmQgYW5pbWF0aW9ucyBmb3IgYSBub24tZnVsbC1zY3JlZW4gd2luZG93IG9yIGFjdGl2aXR5LiAtLT4KQEAgLTg4LDYgKzkyLDEzIEBACiAgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0V4aXRBbmltYXRpb24iPkBhbmltL3N0YXR1c19iYXJfZXhpdDwvaXRlbT4KICAgICA8L3N0eWxlPgogCisgICAgPCEtLSB7QGhpZGV9IC0tPgorICAgIDxzdHlsZSBuYW1lPSJBbmltYXRpb24uU3RhdHVzQmFyLkludHJ1ZGVyQWxlcnQiCisgICAgICAgIHBhcmVudD0iQGFuZHJvaWQ6c3R5bGUvQW5pbWF0aW9uLlN0YXR1c0JhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93RW50ZXJBbmltYXRpb24iPkBhbmltL3ByaW9yaXR5X2FsZXJ0X2VudGVyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0V4aXRBbmltYXRpb24iPkBhbmltL3ByaW9yaXR5X2FsZXJ0X2V4aXQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKwogICAgIDwhLS0gU3RhbmRhcmQgYW5pbWF0aW9ucyBmb3IgYSB0cmFuc2x1Y2VudCB3aW5kb3cgb3IgYWN0aXZpdHkuICBUaGlzCiAgICAgICAgICBzdHlsZSBpcyA8ZW0+bm90PGVtPiB1c2VkIGJ5IGRlZmF1bHQgZm9yIHRoZSB0cmFuc2x1Y2VudCB0aGVtZQogICAgICAgICAgKHNpbmNlIHRyYW5zbHVjZW50IGFjdGl2aXRpZXMgYXJlIGEgc3BlY2lhbCBjYXNlIHRoYXQgaGF2ZSBubwpAQCAtMjY5LDEyICsyODAsMTIgQEAKIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQ29tcG91bmRCdXR0b24uQ2hlY2tCb3giPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9jaGVja19sYWJlbF9iYWNrZ3JvdW5kPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJ1dHRvbiI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2NoZWNrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJ1dHRvbiI+P2FuZHJvaWQ6YXR0ci9saXN0Q2hvaWNlSW5kaWNhdG9yTXVsdGlwbGU8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQ29tcG91bmRCdXR0b24uUmFkaW9CdXR0b24iPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpb19sYWJlbF9iYWNrZ3JvdW5kPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJ1dHRvbiI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX3JhZGlvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJ1dHRvbiI+P2FuZHJvaWQ6YXR0ci9saXN0Q2hvaWNlSW5kaWNhdG9yU2luZ2xlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkNvbXBvdW5kQnV0dG9uLlN0YXIiPgpAQCAtNDA0LDkgKzQxNSw5IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Zm9jdXNhYmxlIj50cnVlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZvY3VzYWJsZUluVG91Y2hNb2RlIj50cnVlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNsaWNrYWJsZSI+dHJ1ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9lZGl0X3RleHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+P2FuZHJvaWQ6YXR0ci9lZGl0VGV4dEJhY2tncm91bmQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW1JbnZlcnNlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci9lZGl0VGV4dENvbG9yPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcl92ZXJ0aWNhbDwvaXRlbT4KICAgICA8L3N0eWxlPgogICAgIApAQCAtNDUxLDYgKzQ2MiwxOCBAQAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuU3Bpbm5lciI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2Ryb3Bkb3duPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNsaWNrYWJsZSI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcGlubmVyTW9kZSI+ZGlhbG9nPC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25TZWxlY3RvciI+QGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBvcHVwQmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvc3Bpbm5lcl9kcm9wZG93bl9iYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duVmVydGljYWxPZmZzZXQiPi0xMGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93bkhvcml6b250YWxPZmZzZXQiPjBkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25XaWR0aCI+d3JhcF9jb250ZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBvcHVwUHJvbXB0VmlldyI+QGFuZHJvaWQ6bGF5b3V0L3NpbXBsZV9kcm9wZG93bl9oaW50PC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LlNwaW5uZXIuRHJvcERvd24iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNwaW5uZXJNb2RlIj5kcm9wZG93bjwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5UZXh0Vmlldy5Qb3B1cE1lbnUiPgpAQCAtNDcwLDcgKzQ5Myw3IEBACiAgICAgPC9zdHlsZT4KICAgICAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkRyb3BEb3duSXRlbS5TcGlubmVyIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjaGVja01hcmsiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjaGVja01hcmsiPj9hbmRyb2lkOmF0dHIvbGlzdENob2ljZUluZGljYXRvclNpbmdsZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5TY3JvbGxWaWV3Ij4KQEAgLTQ5MCw3ICs1MTMsNyBAQAogICAgIDwvc3R5bGU+CiAgICAgCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5MaXN0Vmlldy5XaGl0ZSIgcGFyZW50PSJXaWRnZXQuQWJzTGlzdFZpZXciPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxpc3RTZWxlY3RvciI+QGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxpc3RTZWxlY3RvciI+QGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNhY2hlQ29sb3JIaW50Ij4/YW5kcm9pZDphdHRyL2NvbG9yQmFja2dyb3VuZENhY2hlSGludDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkaXZpZGVyIj5AYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0X29wYXF1ZTwvaXRlbT4KICAgICA8L3N0eWxlPiAgICAKQEAgLTU2Nyw2ICs1OTAsNyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL3F1aWNrY29udGFjdF9iYWRnZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjbGlja2FibGUiPnRydWU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2NhbGVUeXBlIj5maXRDZW50ZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19jb250YWN0X3BpY3R1cmU8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlU21hbGwiPgpAQCAtNjA2LDkgKzYzMCw5IEBACiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnk8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGlnaGxpZ2h0Ij4jRkZGRjkyMDA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGlnaGxpZ2h0Ij4/dGV4dENvbG9ySGlnaGxpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpbnQiPj90ZXh0Q29sb3JIaW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPiM1QzVDRkY8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+P3RleHRDb2xvckxpbms8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE2c3A8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ub3JtYWw8L2l0ZW0+CiAgICAgPC9zdHlsZT4KQEAgLTYxNiw3ICs2NDAsOCBAQAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5JbnZlcnNlIj4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeUludmVyc2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+P3RleHRDb2xvckhpbnRJbnZlcnNlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPiMwMDAwRUU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGlnaGxpZ2h0Ij4/dGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj4/dGV4dENvbG9yTGlua0ludmVyc2U8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5UaGVtZSI+CkBAIC02MjQsNDEgKzY0OSw0MCBAQAogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkRpYWxvZ1dpbmRvd1RpdGxlIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MThzcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTGFyZ2UiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4yMnNwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5MYXJnZS5JbnZlcnNlIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaW50Ij4/dGV4dENvbG9ySGludEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGlnaGxpZ2h0Ij4/dGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj4/dGV4dENvbG9yTGlua0ludmVyc2U8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5NZWRpdW0iPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xOHNwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5NZWRpdW0uSW52ZXJzZSI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeUludmVyc2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+P3RleHRDb2xvckhpbnRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+P3RleHRDb2xvckhpZ2hsaWdodEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+P3RleHRDb2xvckxpbmtJbnZlcnNlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU21hbGwiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNHNwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclNlY29uZGFyeTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlNtYWxsLkludmVyc2UiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclNlY29uZGFyeUludmVyc2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+P3RleHRDb2xvckhpbnRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+P3RleHRDb2xvckhpZ2hsaWdodEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+P3RleHRDb2xvckxpbmtJbnZlcnNlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuVGhlbWUuRGlhbG9nIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLlRoZW1lIj4KQEAgLTg1NCw0ICs4NzgsMTkgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nQm90dG9tIj4xZGlwPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2JvdHRvbV9iYXI8L2l0ZW0+CiAgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJBY3Rpb25CYXIiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2FjdGlvbl9iYXJfYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkaXNwbGF5T3B0aW9ucyI+dXNlTG9nbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkaXZpZGVyIj5AYW5kcm9pZDpkcmF3YWJsZS9hY3Rpb25fYmFyX2RpdmlkZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6aGVpZ2h0Ij4/YW5kcm9pZDphdHRyL3dpbmRvd0FjdGlvbkJhclNpemU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ0xlZnQiPjNkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ1RvcCI+M2RpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nUmlnaHQiPjNkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ0JvdHRvbSI+M2RpcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5BY3Rpb25CdXR0b24iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgorICAgIDwvc3R5bGU+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbAppbmRleCBkNTg1ZDllLi42ZWQ3YjcxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy90aGVtZXMueG1sCkBAIC01Myw2ICs1MywxMCBAQAogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaW50Ij5AYW5kcm9pZDpjb2xvci9oaW50X2ZvcmVncm91bmRfZGFyazwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGludEludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2hpbnRfZm9yZWdyb3VuZF9saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yU2VhcmNoVXJsIj5AYW5kcm9pZDpjb2xvci9zZWFyY2hfdXJsX3RleHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpZ2hsaWdodCI+QGFuZHJvaWQ6Y29sb3IvaGlnaGxpZ2h0ZWRfdGV4dF9kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9oaWdobGlnaHRlZF90ZXh0X2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JMaW5rIj5AYW5kcm9pZDpjb2xvci9saW5rX3RleHRfZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yTGlua0ludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2xpbmtfdGV4dF9saWdodDwvaXRlbT4KIAogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZUxhcmdlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5MYXJnZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VNZWRpdW0iPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGl1bTwvaXRlbT4KQEAgLTY1LDYgKzY5LDkgQEAKICAgICAgICAgCiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlQnV0dG9uIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5XaWRnZXQuQnV0dG9uPC9pdGVtPgogICAgICAgICAKKyAgICAgICAgPGl0ZW0gbmFtZT0iZWRpdFRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZWRpdFRleHRCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9lZGl0X3RleHQ8L2l0ZW0+CisgICAgICAgIAogICAgICAgICA8aXRlbSBuYW1lPSJjYW5kaWRhdGVzVGV4dFN0eWxlU3BhbnMiPkBhbmRyb2lkOnN0cmluZy9jYW5kaWRhdGVzX3N0eWxlPC9pdGVtPgogICAgICAgICAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENoZWNrTWFyayI+QGFuZHJvaWQ6ZHJhd2FibGUvaW5kaWNhdG9yX2NoZWNrX21hcmtfZGFyazwvaXRlbT4KQEAgLTg0LDkgKzkxLDExIEBACiAgICAgICAgIDxpdGVtIG5hbWU9InNlYXJjaFJlc3VsdExpc3RJdGVtSGVpZ2h0Ij41OGRpcDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdERpdmlkZXIiPkBkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfZGFyazwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdFNlcGFyYXRvclRleHRWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5UZXh0Vmlldy5MaXN0U2VwYXJhdG9yPC9pdGVtPiAgIAotICAgICAgICAKLQkJPGl0ZW0gbmFtZT0ibGlzdENob2ljZUluZGljYXRvclNpbmdsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX3JhZGlvPC9pdGVtPgotICAgIAk8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yTXVsdGlwbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9jaGVjazwvaXRlbT4gICAgCisKKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdENob2ljZUluZGljYXRvclNpbmdsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX3JhZGlvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yTXVsdGlwbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9jaGVjazwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlQmFja2dyb3VuZEluZGljYXRvciI+QGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3RlZF9iYWNrZ3JvdW5kPC9pdGVtPgogCiAgICAgICAgIDxpdGVtIG5hbWU9ImV4cGFuZGFibGVMaXN0UHJlZmVycmVkSXRlbVBhZGRpbmdMZWZ0Ij40MGRpcDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRDaGlsZFBhZGRpbmdMZWZ0Ij4KQEAgLTExNSw2ICsxMjQsMTAgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVCYWNrZ3JvdW5kU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpbmRvd1RpdGxlQmFja2dyb3VuZDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBbmltYXRpb25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvQW5pbWF0aW9uLkFjdGl2aXR5PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd1NvZnRJbnB1dE1vZGUiPnN0YXRlVW5zcGVjaWZpZWR8YWRqdXN0VW5zcGVjaWZpZWQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0FjdGlvbkJhciI+ZmFsc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0FjdGlvbk1vZGVPdmVybGF5Ij5mYWxzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93QWN0aW9uQmFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL0FjdGlvbkJhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93QWN0aW9uQmFyU2l6ZSI+NTBkaXA8L2l0ZW0+CiAKICAgICAgICAgPCEtLSBEaWFsb2cgYXR0cmlidXRlcyAtLT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWxlcnREaWFsb2dTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvQWxlcnREaWFsb2c8L2l0ZW0+CkBAIC0xNTcsOCArMTcwLDggQEAKICAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZVNtYWxsVGl0bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbC5UaXRsZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUxhcmdlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuSW52ZXJzZTwvaXRlbT4KLQkJPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZVNtYWxsSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLlNtYWxsLkludmVyc2U8L2l0ZW0+Ci0JICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5MYXJnZS5JbnZlcnNlPC9pdGVtPiAKKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZVNtYWxsSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLlNtYWxsLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5MYXJnZS5JbnZlcnNlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJzZWVrQmFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5TZWVrQmFyPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJyYXRpbmdCYXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlJhdGluZ0JhcjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0icmF0aW5nQmFyU3R5bGVJbmRpY2F0b3IiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5SYXRpbmdCYXIuSW5kaWNhdG9yPC9pdGVtPgpAQCAtMTY3LDYgKzE4MCw5IEBACiAgICAgICAgIDxpdGVtIG5hbWU9InNjcm9sbFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlNjcm9sbFZpZXc8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imhvcml6b250YWxTY3JvbGxWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib3Jpem9udGFsU2Nyb2xsVmlldzwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0ic3Bpbm5lclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuU3Bpbm5lcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZHJvcERvd25TcGlubmVyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5TcGlubmVyLkRyb3BEb3duPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Ecm9wRG93blN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuU3Bpbm5lci5Ecm9wRG93bjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQnV0dG9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5BY3Rpb25CdXR0b248L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InN0YXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkNvbXBvdW5kQnV0dG9uLlN0YXI8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRhYldpZGdldFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuVGFiV2lkZ2V0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuVGV4dFZpZXc8L2l0ZW0+CkBAIC0xOTgsNiArMjE0LDExIEBACiAKICAgICAgICAgPCEtLSBTZWFyY2ggd2lkZ2V0IHN0eWxlcyAtLT4KICAgICAgICAgPGl0ZW0gbmFtZT0ic2VhcmNoV2lkZ2V0Q29ycHVzSXRlbUJhY2tncm91bmQiPkBhbmRyb2lkOmNvbG9yL3NlYXJjaF93aWRnZXRfY29ycHVzX2l0ZW1fYmFja2dyb3VuZDwvaXRlbT4KKworICAgICAgICA8IS0tIEFjdGlvbiBiYXIgc3R5bGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CdXR0b25QYWRkaW5nIj4xMmRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2FjdGlvbl9iYXJfY29udGV4dF9iYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VEcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9jbG9zZV9jbGVhcl9jYW5jZWw8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICAKICAgICA8IS0tIFZhcmlhbnQgb2YgdGhlIGRlZmF1bHQgKGRhcmspIHRoZW1lIHdpdGggbm8gdGl0bGUgYmFyIC0tPgpAQCAtMjIxLDcgKzI0Miw3IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImNvbG9yQmFja2dyb3VuZCI+QGFuZHJvaWQ6Y29sb3IvYmFja2dyb3VuZF9saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iY29sb3JGb3JlZ3JvdW5kIj5AY29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImNvbG9yRm9yZWdyb3VuZEludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0X2ludmVyc2U8L2l0ZW0+Ci0KKyAgICAgICAgCiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclByaW1hcnkiPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yU2Vjb25kYXJ5Ij5AYW5kcm9pZDpjb2xvci9zZWNvbmRhcnlfdGV4dF9saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yVGVydGlhcnkiPkBhbmRyb2lkOmNvbG9yL3RlcnRpYXJ5X3RleHRfbGlnaHQ8L2l0ZW0+CkBAIC0yMzUsOCArMjU2LDE1IEBACiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclByaW1hcnlJbnZlcnNlTm9EaXNhYmxlIj5AYW5kcm9pZDpjb2xvci9wcmltYXJ5X3RleHRfZGFya19ub2Rpc2FibGU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclNlY29uZGFyeUludmVyc2VOb0Rpc2FibGUiPkBhbmRyb2lkOmNvbG9yL3NlY29uZGFyeV90ZXh0X2Rhcmtfbm9kaXNhYmxlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaW50Ij5AYW5kcm9pZDpjb2xvci9oaW50X2ZvcmVncm91bmRfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpbnRJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9oaW50X2ZvcmVncm91bmRfZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGludEludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2hpbnRfZm9yZWdyb3VuZF9kYXJrPC9pdGVtPiAgICAgICAgCisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpZ2hsaWdodCI+QGFuZHJvaWQ6Y29sb3IvaGlnaGxpZ2h0ZWRfdGV4dF9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvaGlnaGxpZ2h0ZWRfdGV4dF9kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JMaW5rIj5AYW5kcm9pZDpjb2xvci9saW5rX3RleHRfbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckxpbmtJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9saW5rX3RleHRfZGFyazwvaXRlbT4KICAgICAgICAgCisgICAgICAgIDxpdGVtIG5hbWU9ImVkaXRUZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdENob2ljZUJhY2tncm91bmRJbmRpY2F0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZF9saWdodDwvaXRlbT4KKwogICAgICAgICA8aXRlbSBuYW1lPSJwb3B1cFdpbmRvd1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUG9wdXBXaW5kb3c8L2l0ZW0+CiAgICAgICAgIAogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q2hlY2tNYXJrIj5AYW5kcm9pZDpkcmF3YWJsZS9pbmRpY2F0b3JfY2hlY2tfbWFya19saWdodDwvaXRlbT4KQEAgLTI0NywxMyArMjc1LDEzIEBACiAgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5MaXN0Vmlldy5XaGl0ZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdERpdmlkZXIiPkBkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJsaXN0U2VwYXJhdG9yVGV4dFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlRleHRWaWV3Lkxpc3RTZXBhcmF0b3IuV2hpdGU8L2l0ZW0+Ci0gICAgICAgIAorCiAgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5JbnZlcnNlPC9pdGVtPgotCQk8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlU21hbGwiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbC5JbnZlcnNlPC9pdGVtPgotCQk8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlTGFyZ2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5MYXJnZS5JbnZlcnNlPC9pdGVtPgotCQk8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyPC9pdGVtPgotCQk8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlU21hbGxJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGw8L2l0ZW0+Ci0JCTxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5MYXJnZTwvaXRlbT4gCisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbCI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLlNtYWxsLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbEludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUxhcmdlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAgICAgCiAgICAgPCEtLSBWYXJpYW50IG9mIHRoZSBsaWdodCB0aGVtZSB3aXRoIG5vIHRpdGxlIGJhciAtLT4KQEAgLTQxNiwxMyArNDQ0LDI1IEBACiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlU21hbGxJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5TbWFsbC5JbnZlcnNlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKKyAgICA8IS0tIFZhcmlhdGlvbiBvZiBUaGVtZS5EaWFsb2cgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIGEgZnJhbWUgKG9yIGJhY2tncm91bmQpLgorICAgICAgICAgVGhlIHZpZXcgaGllcmFyY2h5IG9mIHRoZSBkaWFsb2cgaXMgcmVzcG9uc2libGUgZm9yIGRyYXdpbmcgYWxsIG9mCisgICAgICAgICBpdHMgcGl4ZWxzLiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuRGlhbG9nLk5vRnJhbWUiPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dCYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci90cmFuc3BhcmVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dGcmFtZSI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0NvbnRlbnRPdmVybGF5Ij5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBbmltYXRpb25TdHlsZSI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZERpbUVuYWJsZWQiPmZhbHNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0lzVHJhbnNsdWNlbnQiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93Tm9UaXRsZSI+dHJ1ZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCiAgICAgPCEtLSBEZWZhdWx0IHRoZW1lIGZvciBhbGVydCBkaWFsb2cgd2luZG93cywgd2hpY2ggaXMgdXNlZCBieSB0aGUKICAgICAgICAgIHtAbGluayBhbmRyb2lkLmFwcC5BbGVydERpYWxvZ30gY2xhc3MuICBUaGlzIGlzIGJhc2ljYWxseSBhIGRpYWxvZwogICAgICAgICAgYnV0IHNldHMgdGhlIGJhY2tncm91bmQgdG8gZW1wdHkgc28gaXQgY2FuIGRvIHR3by10b25lIGJhY2tncm91bmRzLiAtLT4KICAgICA8c3R5bGUgbmFtZT0iVGhlbWUuRGlhbG9nLkFsZXJ0Ij4KICAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93QmFja2dyb3VuZCI+QGFuZHJvaWQ6Y29sb3IvdHJhbnNwYXJlbnQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd1RpdGxlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL0RpYWxvZ1dpbmRvd1RpdGxlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dJc0Zsb2F0aW5nIj50cnVlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dDb250ZW50T3ZlcmxheSI+QG51bGw8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICAKQEAgLTUyMSw1ICs1NjEsNjcgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBbmltYXRpb25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvQW5pbWF0aW9uLlJlY2VudEFwcGxpY2F0aW9uczwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBhbmRyb2lkOmNvbG9yL3NlY29uZGFyeV90ZXh0X25vZm9jdXM8L2l0ZW0+CiAgICAgPC9zdHlsZT4KKworICAgIDwhLS0gRGVmYXVsdCB0aGVtZSB3aXRoIGFuIEFjdGlvbiBCYXIuIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5XaXRoQWN0aW9uQmFyIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBY3Rpb25CYXIiPnRydWU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gTm8gdGl0bGUgYmFyLCBidXQgQWN0aW9uIE1vZGUgYmFycyB3aWxsIG92ZXJsYXkgYXBwbGljYXRpb24gY29udGVudAorICAgICAgICAgaW5zdGVhZCBvZiBwdXNoaW5nIGl0IGRvd24gdG8gbWFrZSByb29tLiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuTm9UaXRsZUJhci5PdmVybGF5QWN0aW9uTW9kZXMiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FjdGlvbk1vZGVPdmVybGF5Ij50cnVlPC9pdGVtPgorICAgIDwvc3R5bGU+CiAgICAgCisgICAgPCEtLSBOZXcgSG9uZXljb21iIGhvbG9ncmFwaGljIHRoZW1lLiBEYXJrIHZlcnNpb24uICBUaGUgd2lkZ2V0cyBpbiB0aGUKKyAgICAgICAgIGhvbG9ncmFwaGljIHRoZW1lIGFyZSB0cmFuc2x1Y2VudCBvbiB0aGVpciBicmFja2dyb3VuZCwgc28gYXBwbGljYXRpb25zCisgICAgICAgICBtdXN0IGVuc3VyZSB0aGF0IGFueSBiYWNrZ3JvdW5kIHRoZXkgdXNlIHdpdGggdGhpcyB0aGVtZSBpcyBpdHNlbGYKKyAgICAgICAgIGRhcms7IG90aGVyd2lzZSwgaXQgd2lsbCBiZSBkaWZmaWN1bHQgdG8gc2VlIHRoZSB3aWRnZXRzLiAgVGhlIG5ldworICAgICAgICAgVUkgc3R5bGUgYWxzbyBpbmNsdWRlcyBhIGZ1bGwgYWN0aW9uIGJhciBieSBkZWZhdWx0LiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuSG9sbyI+CisgICAgICAgIDxpdGVtIG5hbWU9ImVkaXRUZXh0QmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZWRpdFRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FjdGlvbkJhciI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdENob2ljZUluZGljYXRvclNpbmdsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX3JhZGlvX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdENob2ljZUluZGljYXRvck11bHRpcGxlIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fY2hlY2tfaG9sb19kYXJrPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIE5ldyBIb25leWNvbWIgaG9sb2dyYXBoaWMgdGhlbWUuIExpZ2h0IHZlcnNpb24uICBUaGUgd2lkZ2V0cyBpbiB0aGUKKyAgICAgICAgIGhvbG9ncmFwaGljIHRoZW1lIGFyZSB0cmFuc2x1Y2VudCBvbiB0aGVpciBicmFja2dyb3VuZCwgc28gYXBwbGljYXRpb25zCisgICAgICAgICBtdXN0IGVuc3VyZSB0aGF0IGFueSBiYWNrZ3JvdW5kIHRoZXkgdXNlIHdpdGggdGhpcyB0aGVtZSBpcyBpdHNlbGYKKyAgICAgICAgIGxpZ2h0OyBvdGhlcndpc2UsIGl0IHdpbGwgYmUgZGlmZmljdWx0IHRvIHNlZSB0aGUgd2lkZ2V0cy4gIFRoZSBuZXcKKyAgICAgICAgIFVJIHN0eWxlIGFsc28gaW5jbHVkZXMgYSBmdWxsIGFjdGlvbiBiYXIgYnkgZGVmYXVsdC4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkxpZ2h0LkhvbG8iPgorICAgICAgICA8aXRlbSBuYW1lPSJlZGl0VGV4dEJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2VkaXRfdGV4dF9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FjdGlvbkJhciI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdENob2ljZUluZGljYXRvclNpbmdsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX3JhZGlvX2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JNdWx0aXBsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2NoZWNrX2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gVmFyaWFudCBvZiB0aGUgaG9sb2dyYXBoaWMgKGRhcmspIHRoZW1lIHdpdGggbm8gYWN0aW9uIGJhci4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkhvbG8uTm9BY3Rpb25CYXIiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FjdGlvbkJhciI+ZmFsc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93Tm9UaXRsZSI+dHJ1ZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorICAgIAorICAgIDwhLS0gVmFyaWFudCBvZiB0aGUgaG9sb2dyYXBoaWMgKGRhcmspIHRoZW1lIHRoYXQgaGFzIG5vIHRpdGxlIGJhciBhbmQgZmlsbHMKKyAgICAgICAgIHRoZSBlbnRpcmUgc2NyZWVuIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5Ib2xvLk5vQWN0aW9uQmFyLkZ1bGxzY3JlZW4iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0Z1bGxzY3JlZW4iPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93Q29udGVudE92ZXJsYXkiPkBudWxsPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIFZhcmlhbnQgb2YgdGhlIGhvbG9ncmFwaGljIGxpZ2h0IHRoZW1lIHdpdGggbm8gYWN0aW9uIGJhciAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuTGlnaHQuSG9sby5Ob0FjdGlvbkJhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QWN0aW9uQmFyIj5mYWxzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIFZhcmlhbnQgb2YgdGhlIGhvbG9ncmFwaGljIGxpZ2h0IHRoZW1lIHRoYXQgaGFzIG5vIHRpdGxlIGJhciBhbmQgZmlsbHMKKyAgICAgICAgIHRoZSBlbnRpcmUgc2NyZWVuIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5MaWdodC5Ib2xvLk5vQWN0aW9uQmFyLkZ1bGxzY3JlZW4iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0Z1bGxzY3JlZW4iPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93Q29udGVudE92ZXJsYXkiPkBudWxsPC9pdGVtPgorICAgIDwvc3R5bGU+CisgCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwtbGFuZC9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwtbGFuZC9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbAppbmRleCA3MDBjNTI3Li5mZDhiZDQ5IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sLWxhbmQvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC1sYW5kL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiAKICAgICA8Um93PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC1sYW5kL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwgYi9jb3JlL3Jlcy9yZXMveG1sLWxhbmQvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbAppbmRleCAxZTM3YjZjLi45ZmY2ZmQ3IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sLWxhbmQvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sLWxhbmQvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCiAgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCiAgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgotICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCiAgICAgPgogCiAgICAgPFJvdz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwtbWRwaS9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwtbWRwaS9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbAppbmRleCBiYWUxYjQyLi44MmE3Yzc1IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sLW1kcGkvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC1tZHBpL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiAKICAgICA8Um93PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC1tZHBpL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwgYi9jb3JlL3Jlcy9yZXMveG1sLW1kcGkvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbAppbmRleCA2MTJkZjljLi45ZmZmM2NjIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sLW1kcGkvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sLW1kcGkvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCiAgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCiAgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgotICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCiAgICAgPgogCiAgICAgPFJvdz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwteGxhcmdlL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sIGIvY29yZS9yZXMvcmVzL3htbC14bGFyZ2UvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGEzNTA0MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwteGxhcmdlL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCkBAIC0wLDAgKzEsMTAyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8S2V5Ym9hcmQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCisgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCisgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKKyAgICA+CisKKyAgICA8Um93IGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJ0b3AiPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjEiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iMiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjMiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSI0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iNSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjYiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSI3Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iOCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjkiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICA8L1Jvdz4KKworICAgIDxSb3c+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0icSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ3Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iZSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InIiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ieSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InUiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJpIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ibyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgIDwvUm93PgorCisgICAgPFJvdz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJhIiBhbmRyb2lkOmhvcml6b250YWxHYXA9IjUlcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0icyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJmIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iZyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImgiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJqIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iayIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImwiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgIDwvUm93PgorCisgICAgPFJvdz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSItMSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX3NoaWZ0IgorICAgICAgICAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTUlcCIgYW5kcm9pZDppc01vZGlmaWVyPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19zaGlmdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aXNTdGlja3k9InRydWUiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ieiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IngiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJjIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0idiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImIiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJuIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ibSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9Ii01IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZGVsZXRlIgorICAgICAgICAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTUlcCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19kZWxldGUiCisgICAgICAgICAgICBhbmRyb2lkOmlzUmVwZWF0YWJsZT0idHJ1ZSIvPgorICAgIDwvUm93PgorCisgICAgPFJvdyBhbmRyb2lkOmtleWJvYXJkTW9kZT0iQCtpZC9tb2RlX25vcm1hbCIgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9ImJvdHRvbSI+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iLTIiIGFuZHJvaWQ6a2V5TGFiZWw9IkBzdHJpbmcvcGFzc3dvcmRfa2V5Ym9hcmRfbGFiZWxfc3ltYm9sX2tleSIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjIwJXAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iLCIgLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSItIiAvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjMyIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfc3BhY2UiCisgICAgICAgICAgICBhbmRyb2lkOmljb25QcmV2aWV3PSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX3NwYWNlIgorICAgICAgICAgICAgYW5kcm9pZDprZXlXaWR0aD0iMjAlcCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Ij0iIC8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iLiIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSIxMCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX29rIgorICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19vayIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjIwJXAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgIDwvUm93PgorCis8L0tleWJvYXJkPgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sLXhsYXJnZS9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sIGIvY29yZS9yZXMvcmVzL3htbC14bGFyZ2UvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZTlkYjgxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL3htbC14bGFyZ2UvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbApAQCAtMCwwICsxLDEwMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPEtleWJvYXJkIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgorICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgorICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCisgICAgPgorCisgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0idG9wIj4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJcQCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJcIyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IiQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIlIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iJmFtcDsiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIqIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iLSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IisiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIoIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iKSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CisgICAgPC9Sb3c+CisKKyAgICA8Um93PgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InEiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0idyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImUiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJyIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0idCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InkiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ1Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iaSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Im8iLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICA8L1Jvdz4KKworICAgIDxSb3c+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iYSIgYW5kcm9pZDpob3Jpem9udGFsR2FwPSI1JXAiCisgICAgICAgICAgICBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InMiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJkIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iZiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImciLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJoIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iaiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImsiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJsIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICA8L1Jvdz4KKworICAgIDxSb3c+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iLTEiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9zaGlmdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjE1JXAiIGFuZHJvaWQ6aXNNb2RpZmllcj0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfc2hpZnQiCisgICAgICAgICAgICBhbmRyb2lkOmlzU3RpY2t5PSJ0cnVlIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InoiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ4Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iYyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InYiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJiIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ibiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Im0iLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSItNSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2RlbGV0ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjE1JXAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfZGVsZXRlIgorICAgICAgICAgICAgYW5kcm9pZDppc1JlcGVhdGFibGU9InRydWUiLz4KKyAgICA8L1Jvdz4KKworICAgIDxSb3cgYW5kcm9pZDprZXlib2FyZE1vZGU9IkAraWQvbW9kZV9ub3JtYWwiIGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJib3R0b20iPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9Ii0yIiBhbmRyb2lkOmtleUxhYmVsPSJAc3RyaW5nL3Bhc3N3b3JkX2tleWJvYXJkX2xhYmVsX3N5bWJvbF9rZXkiCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIyMCVwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IiwiIC8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iXyIgLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSIzMiIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX3NwYWNlIgorICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19zcGFjZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjIwJXAiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIrIiAvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Ii4iLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSIxMCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX29rIgorICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19vayIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjIwJXAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgIDwvUm93PgorCis8L0tleWJvYXJkPgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9leHRlbnNpb24ueG1sIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfZXh0ZW5zaW9uLnhtbAppbmRleCAyOGI3ZWZlLi5mM2ZhNTdiIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9leHRlbnNpb24ueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX2V4dGVuc2lvbi54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIAogICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9InRvcCI+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9udW1lcmljLnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX251bWVyaWMueG1sCmluZGV4IGUzZjE2MTIuLjIyNzBiOGEgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX251bWVyaWMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX251bWVyaWMueG1sCkBAIC0xOSwzNSArMTksNDEgQEAKIC0tPgogPEtleWJvYXJkIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBhbmRyb2lkOmtleVdpZHRoPSIzMy4zMyVwIgotICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMnB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X251bWVyaWMiCiAgICAgPgogCi0gICAgPFJvdz4KLSAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI0OSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTEiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0idG9wIj4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI0OSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTEiCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1MCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTIiLz4KLSAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1MSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTMiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1MSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTMiCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CiAgICAgPC9Sb3c+CiAKICAgICA8Um93PgotICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjUyIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtNCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1MiIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTQiCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1MyIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTUiLz4KLSAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTYiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTYiCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CiAgICAgPC9Sb3c+CiAKICAgICA8Um93PgotICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjU1IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtNyIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTciCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NiIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTgiLz4KLSAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NyIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTkiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NyIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTkiCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CiAgICAgPC9Sb3c+CiAKICAgICA8Um93IGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJib3R0b20iPgotICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjEwIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfb2siLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSIxMCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX29rIgorICAgICAgICAgICAgIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CiAgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNDgiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW0wX25vX3BsdXMiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSItNSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2RlbGV0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfZGVsZXRlIgotICAgICAgICAgICAgYW5kcm9pZDppc1JlcGVhdGFibGU9InRydWUiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfZGVsZXRlIgorICAgICAgICAgICAgIGFuZHJvaWQ6aXNSZXBlYXRhYmxlPSJ0cnVlIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KICAgICA8L1Jvdz4KIAogPC9LZXlib2FyZD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3BvcHVwX3RlbXBsYXRlLnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3BvcHVwX3RlbXBsYXRlLnhtbAppbmRleCA1ZGRmZDNlLi45Yjg1M2UyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9wb3B1cF90ZW1wbGF0ZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcG9wdXBfdGVtcGxhdGUueG1sCkBAIC0yMiw2ICsyMiw2IEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiA8L0tleWJvYXJkPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKaW5kZXggNWZhOWI4YS4uMGEzNTA0MCAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiAKICAgICA8Um93IGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJ0b3AiPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sCmluZGV4IGU0OTFhZmYuLjllOWRiODEgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIAogICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9InRvcCI+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzLnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHMueG1sCmluZGV4IDE0YTdlYzguLjlhOTQ5MzAgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHMueG1sCkBAIC0yMiwxMCArMjIsMTAgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIAotICAgIDxSb3c+CisgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0idG9wIj4KICAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIxIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgogICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjIiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIzIi8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzX3NoaWZ0LnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHNfc2hpZnQueG1sCmluZGV4IDRiODRmNGIuLmE5NzJlYjIgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHNfc2hpZnQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHNfc2hpZnQueG1sCkBAIC0yMiwxMCArMjIsMTAgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIAotICAgIDxSb3c+CisgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0idG9wIj4KICAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ+IiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgogICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImAiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ8Ii8+CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9iYWNrc2xhc2gudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfYmFja3NsYXNoLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzMDAyYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9iYWNrc2xhc2gudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjo7QVw7QlxcO0NcXFw7O0Q7XDpFO1xcXFw7DQotRk46QTtCXENcO0Q6RVxcDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfY29tcGxpY2F0ZWQudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfY29tcGxpY2F0ZWQudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTM0ZTE2Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2NvbXBsaWNhdGVkLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjpHdW1wO0ZvcnJlc3Q7SG9nZTtQb3M7VGFvDQotRk46Sm9lIER1ZQ0KLU9SRzpHdW1wIFNocmltcCBDby47U2FsZXMgRGVwdC5cO01hbmFnZXI7RmlzaCBrZWVwZXINCi1ST0xFOkZpc2ggQ2FrZSBLZWVwZXIhDQotWC1DTEFTUzpQVUJMSUMNCi1USVRMRTpTaHJpbXAgTWFuDQotVEVMO1dPUks7Vk9JQ0U6KDExMSkgNTU1LTEyMTINCi1URUw7SE9NRTtWT0lDRTooNDA0KSA1NTUtMTIxMg0KLVRFTDtDRUxMOjAzMTExMTExMTENCi1URUw7VklERU86MDMyMjIyMjIyMg0KLVRFTDtWT0lDRTowMzMzMzMzMzMzDQotQURSO1dPUks6OzsxMDAgV2F0ZXJzIEVkZ2U7QmF5dG93bjtMQTszMDMxNDtVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2ENCi1MQUJFTDtXT1JLO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6MTAwIFdhdGVycyBFZGdlPTBEPTBBQmF5dG93biwgTEEgMzAzMTQ9MEQ9MEFVbml0ZWQgIFN0YXRlcyBvZiBBbWVyaWNhDQotQURSO0hPTUU6Ozs0MiBQbGFudGF0aW9uIFN0LjtCYXl0b3duO0xBOzMwMzE0O1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQ0KLUxBQkVMO0hPTUU7RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRTo0MiBQbGFudGF0aW9uIFN0Lj0wRD0wQT0NCi1CYXl0b3duLCBMQSAzMDMxND0wRD0wQT0NCi1Vbml0ZWQgIFN0YXRlcyBvZiBBbWVyaWNhDQotRU1BSUw7UFJFRjtJTlRFUk5FVDpmb3JyZXN0Z3VtcEB3YWxsYWRhbGxhLmNvbQ0KLUVNQUlMO0NFTEw6Y2VsbEBleGFtcGxlLmNvbQ0KLU5PVEU6VGhlIGZvbGxvd2luZyBub3RlIGlzIHRoZSBleGFtcGxlIGZyb20gUkZDIDIwNDUuDQotTk9URTtFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOk5vdydzIHRoZSB0aW1lID0NCi1mb3IgYWxsIGZvbGsgdG8gY29tZT0NCi0gdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5Lg0KLQ0KLVBIT1RPO0VOQ09ESU5HPUJBU0U2NDtUWVBFPUpQRUc6DQotIC85ai80UW9QUlhocFpnQUFUVTBBS2dBQUFBZ0FEUUVPQUFJQUFBQVBBQUFBcWdFUEFBSUFBQUFIQUFBQXVnRVFBQUlBQUFBRw0KLSBBQUFBd2dFU0FBTUFBQUFCQUFFQUFBRWFBQVVBQUFBQkFBQUF5QUViQUFVQUFBQUJBQUFBMEFFb0FBTUFBQUFCQUFJQUFBRXgNCi0gQUFJQUFBQU9BQUFBMkFFeUFBSUFBQUFVQUFBQTVnSVRBQU1BQUFBQkFBRUFBSUtZQUFJQUFBQU9BQUFBK29kcEFBUUFBQUFCDQotIEFBQUJoTVNsQUFjQUFBQjhBQUFCQ0FBQUJCNHlNREE0TVRBeU9URXpOVFV6TVFBQVJHOURiMDF2QUFCRU9UQTFhUUFBQUFCSQ0KLSBBQUFBQVFBQUFFZ0FBQUFCUkRrd05Xa2dWbVZ5TVM0d01BQXlNREE0T2pFd09qSTVJREV6T2pVMU9qUTNBQ0FnSUNBZ0lDQWcNCi0gSUNBZ0lDQUFVSEpwYm5SSlRRQXdNekF3QUFBQUJnQUJBQlFBRkFBQ0FRQUFBQUFEQUFBQU5BRUFCUUFBQUFFQkFRQUFBQUVRDQotIGdBQUFBQUFBRVFrQUFDY1FBQUFQQ3dBQUp4QUFBQVdYQUFBbkVBQUFDTEFBQUNjUUFBQWNBUUFBSnhBQUFBSmVBQUFuRUFBQQ0KLSBBSXNBQUNjUUFBQUR5d0FBSnhBQUFCdmxBQUFuRUFBb2dwb0FCUUFBQUFFQUFBTnFncDBBQlFBQUFBRUFBQU55aUNJQUF3QUENCi0gQUFFQUFnQUFrQUFBQndBQUFBUXdNakl3a0FNQUFnQUFBQlFBQUFONmtBUUFBZ0FBQUJRQUFBT09rUUVBQndBQUFBUUJBZ01BDQotIGtRSUFCUUFBQUFFQUFBT2lrZ0VBQ2dBQUFBRUFBQU9xa2dJQUJRQUFBQUVBQUFPeWtnUUFDZ0FBQUFFQUFBTzZrZ1VBQlFBQQ0KLSBBQUVBQUFQQ2tnY0FBd0FBQUFFQUFnQUFrZ2dBQXdBQUFBRUFBQUFBa2drQUF3QUFBQUVBQUFBQWtnb0FCUUFBQUFFQUFBUEsNCi0ga253QUJ3QUFBQUVBQUFBQWtvWUFCd0FBQUJZQUFBUFNvQUFBQndBQUFBUXdNVEF3b0FFQUF3QUFBQUVBQVFBQW9BSUFBd0FBDQotIEFBRUFZQUFBb0FNQUF3QUFBQUVBU0FBQW9BVUFCQUFBQUFFQUFBUUFvZzRBQlFBQUFBRUFBQVBvb2c4QUJRQUFBQUVBQUFQdw0KLSBvaEFBQXdBQUFBRUFBZ0FBb2hjQUF3QUFBQUVBQWdBQW93QUFCd0FBQUFFREFBQUFvd0VBQndBQUFBRUJBQUFBcEFFQUF3QUENCi0gQUFFQUFBQUFwQUlBQXdBQUFBRUFBQUFBcEFNQUF3QUFBQUVBQUFBQXBBUUFCUUFBQUFFQUFBUDRwQVVBQXdBQUFBRUFIUUFBDQotIHBBWUFBd0FBQUFFQUFBQUFwQWNBQXdBQUFBRUFBQUFBcEFnQUF3QUFBQUVBQUFBQXBBa0FBd0FBQUFFQUFBQUFwQW9BQXdBQQ0KLSBBQUVBQUFBQXBBd0FBd0FBQUFFQUFnQUFBQUFBQUFBQUFGTUFBQ2NRQUFBQlhnQUFBR1F5TURBNE9qRXdPakk1SURFek9qVTENCi0gT2pNeEFESXdNRGc2TVRBNk1qa2dNVE02TlRVNk5EY0FBQUFwaUFBQUd3QUFBQUt5QUFBQVpBQUFBVjRBQUFCa0FBQUFBQUFBDQotIEFHUUFBQUFsQUFBQUNnQUFEcElBQUFQb0FBQUFBQUFBQUFBeU1EQTRNVEF5T1RFek5UVXpNUUFBSUNvQUFBQUtBQUFxNGdBQQ0KLSBBQW9BQUFBQUFBQUFBUUFDQUFFQUFnQUFBQVJTT1RnQUFBSUFCd0FBQUFRd01UQXdBQUFBQUFBR0FRTUFBd0FBQUFFQUJnQUENCi0gQVJvQUJRQUFBQUVBQUFSc0FSc0FCUUFBQUFFQUFBUjBBU2dBQXdBQUFBRUFBZ0FBQWdFQUJBQUFBQUVBQUFSOEFnSUFCQUFBDQotIEFBRUFBQVdMQUFBQUFBQUFBRWdBQUFBQkFBQUFTQUFBQUFILzJQL2JBSVFBSUJZWUhCZ1VJQndhSENRaUlDWXdVRFF3TEN3dw0KLSBZa1pLT2xCMFpucDRjbVp3Ym9DUXVKeUFpSzZLYm5DZzJxS3V2c1RPME01OG11THk0TWp3dU1yT3hnRWlKQ1F3S2pCZU5EUmUNCi0geG9Sd2hNYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHDQotIC84QUFFUWdBZUFDZ0F3RWhBQUlSQVFNUkFmL0VBYUlBQUFFRkFRRUJBUUVCQUFBQUFBQUFBQUFCQWdNRUJRWUhDQWtLQ3hBQQ0KLSBBZ0VEQXdJRUF3VUZCQVFBQUFGOUFRSURBQVFSQlJJaE1VRUdFMUZoQnlKeEZES0JrYUVJSTBLeHdSVlMwZkFrTTJKeWdna0sNCi0gRmhjWUdSb2xKaWNvS1NvME5UWTNPRGs2UTBSRlJrZElTVXBUVkZWV1YxaFpXbU5rWldabmFHbHFjM1IxZG5kNGVYcURoSVdHDQotIGg0aUppcEtUbEpXV2w1aVptcUtqcEtXbXA2aXBxckt6dExXMnQ3aTV1c0xEeE1YR3g4akp5dExUMU5YVzE5aloydUhpNCtUbA0KLSA1dWZvNmVyeDh2UDA5ZmIzK1BuNkFRQURBUUVCQVFFQkFRRUJBQUFBQUFBQUFRSURCQVVHQndnSkNnc1JBQUlCQWdRRUF3UUgNCi0gQlFRRUFBRUNkd0FCQWdNUkJBVWhNUVlTUVZFSFlYRVRJaktCQ0JSQ2thR3h3UWtqTTFMd0ZXSnkwUW9XSkRUaEpmRVhHQmthDQotIEppY29LU28xTmpjNE9UcERSRVZHUjBoSlNsTlVWVlpYV0ZsYVkyUmxabWRvYVdwemRIVjJkM2g1ZW9LRGhJV0doNGlKaXBLVA0KLSBsSldXbDVpWm1xS2pwS1dtcDZpcHFyS3p0TFcydDdpNXVzTER4TVhHeDhqSnl0TFQxTlhXMTlqWjJ1TGo1T1htNStqcDZ2THoNCi0gOVBYMjkvajUrdi9hQUF3REFRQUNFUU1SQUQ4QUZGU3FLa1pJb3FSVnBnU0tLZUJURU9BcHdGQURzVVlwZ0lSU0VVQU5JcHBGDQotIElDTmhVVENnQ01pbzJGSUNKaFVMQ2dDMG9xVmFBSkZGU3FLQmtnRk9BcGlIQ25DZ0IyS01VQ0VOSlFBMGltRVVER01LaVlVQQ0KLSBSdFViVWdJV3FKaFFCWlNwRm9BbFdwVm9HUEZQRk1RN3RTSzJPRFFBNHlLTzlIbUtlOUZ4QXpESEZJT2xBQWFZYUFHTlVUVUQNCi0gSW1xTnFRRVRWRTFBRTZWS0tBSkZOU3FhQUhnMDhHbUFOSUZGUU01WTVxSk1CdVQ2MFpOUUljcmtWWVNRTUt1TEdLYWFhc1F4DQotIHFpYWdaRTFSdFNBamFvbW9Ba1ExS3BvQWxVMUlwb0FrVTA3T0JUQXJPKzVxa1YxMlk3MWxmVUJtYUtrQ1JTdXpuclRGYmEyYQ0KLSBvQ3dHeU0wRTFxSWpZMUd4b0dSTlVaTklDTnFpYWdCeUdwbE5BRWltcEZOTUI0WUR2U3VjcHhTWUVJVTA0S2F6c0F1MXFBclUNCi0gV0VMdFBwVFNwb3NCTkVUdDVweE5hb0NOalViR2dDTmpVWm9HUnRVVFVnRlUxS3BvQWtCcVFIaWdDRm5PN3JVcU9kbFpwNmdBDQotIGMrdE9EbjFwWEFYekQ2MGVZZlduY1F2bU5TR1EwN2dPTWhDVkVKR3oxcHRnUzV5S1l4cXdHRTFHeG9BaWFtR2tNYXBxVlRRQg0KLSBLcHArZUtBSUNmbXFXTS9LYXo2Z0FOT0JxUUZ6Um1tQXVhVE5BQ3Nma3FNSG1tOXdKczhVMG10UkRHTlJzYUFJMnBocERJMU4NCi0gU3FhQUpGTlNBOFVDSVNmbXFTTS9LYXo2akFIbW5BMUlDZzB1YUFGelNacGdLeCtTbURyVGU0RTJlS2FUV29pTW1tTWFBSXpUDQotIERTR1JLYWtVMEFTS2FlRFRFUnNlYWtqUHltcytveEFhY0RVZ09CcGMwZ0Z6U1pwZ09ZL0tLWXYzcXJxSWxwcHJRQmpHb3lhQQ0KLSBHR21ta01nVTFJcHBnUEJxUUdnUXUwR240d3ZGS3dFUXB3TlpESFpwYzBBTG1pZ1JLQmxlYVFLQld0Z0EwMDFRREdxTTBnR20NCi0gbUdrTXJxYWtCb0FlcHA0Tk1SSURUd2FBRTJBMDA4R29rZ0h4amQxcHpLRnBXMHVBZzVOU0JCVGlyZ09wRFdnRFRUVFFBdzB3DQotIDBnR0dtbWdaV0JwNHBBU0thZURURU9CcDROQUR3YWpiclV5QkVrWFduU1VkQUdyMXFlaUFNU2tOV0FocGhvQWFhWWFRRERUVA0KLSBTR1ZSVHdhWUR4VHdhQkR3YWVEUUE0R2xLNW9hdUllbzIwcEdhTGFBS3FnVTZoS3dCU0dtQWhwaG9BYWFZYVF4aHBwcERLZ04NCi0gUEZNQjRwNG9FUEZPQnBnUEJwNE5BaHdwd29BV2xvQUtTZ0JEVFRRTVlhWWFRRFRUVFNHQS85bi8yd0NFQUFvSEJ3Z0hCZ29JDQotIENBZ0xDZ29MRGhnUURnME5EaDBWRmhFWUl4OGxKQ0lmSWlFbUt6Y3ZKaWswS1NFaU1FRXhORGs3UGo0K0pTNUVTVU04U0RjOQ0KLSBQanNCQ2dzTERnME9IQkFRSERzb0lpZzdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czcNCi0gT3pzN096czdPenM3T3pzN08vL0FBQkVJQUVnQVlBTUJJUUFDRVFFREVRSC94QUdpQUFBQkJRRUJBUUVCQVFBQUFBQUFBQUFBDQotIEFRSURCQVVHQndnSkNnc1FBQUlCQXdNQ0JBTUZCUVFFQUFBQmZRRUNBd0FFRVFVU0lURkJCaE5SWVFjaWNSUXlnWkdoQ0NOQw0KLSBzY0VWVXRId0pETmljb0lKQ2hZWEdCa2FKU1luS0NrcU5EVTJOemc1T2tORVJVWkhTRWxLVTFSVlZsZFlXVnBqWkdWbVoyaHANCi0gYW5OMGRYWjNlSGw2ZzRTRmhvZUlpWXFTazVTVmxwZVltWnFpbzZTbHBxZW9xYXF5czdTMXRyZTR1YnJDdzhURnhzZkl5Y3JTDQotIDA5VFYxdGZZMmRyaDR1UGs1ZWJuNk9ucThmTHo5UFgyOS9qNStnRUFBd0VCQVFFQkFRRUJBUUFBQUFBQUFBRUNBd1FGQmdjSQ0KLSBDUW9MRVFBQ0FRSUVCQU1FQndVRUJBQUJBbmNBQVFJREVRUUZJVEVHRWtGUkIyRnhFeUl5Z1FnVVFwR2hzY0VKSXpOUzhCVmkNCi0gY3RFS0ZpUTA0U1h4RnhnWkdpWW5LQ2txTlRZM09EazZRMFJGUmtkSVNVcFRWRlZXVjFoWldtTmtaV1puYUdscWMzUjFkbmQ0DQotIGVYcUNnNFNGaG9lSWlZcVNrNVNWbHBlWW1acWlvNlNscHFlb3FhcXlzN1MxdHJlNHVickN3OFRGeHNmSXljclMwOVRWMXRmWQ0KLSAyZHJpNCtUbDV1Zm82ZXJ5OC9UMTl2ZjQrZnIvMmdBTUF3RUFBaEVERVFBL0FKN1NMZ2NWcjIwSTRyTkZHdmJRQUFIRmFFVVgNCi0gU3JRaTVIQ01kS2s4b1k2VlNKWXg0aGpwVmFXTWVsQUZDNGlHRHhXUGRSOG1reG1SZHhqQnJFdkkrdFpqTjIweHRITmJOcUFjDQotIFVJRFhnNkNyMFdLdENZOFhLUU95ek9CM0ZLTldzeWNlWitsUzZzWTZOa2p2UFNkd0ltQkhVbW15NHEwNzZvQ2pPT0RXUGRnYw0KLSAwTXBHUGRBWU5ZbDRvNXJOak5Lemt5b3JadFh4aWhBYTF2SURpcDdtOUZyYjcvNGp3S2NueXhiRXpOM2llSnBwWnN5WjRVMUgNCi0gdXJ6WmF1NG1XVmxOckdrMFV1V1BWYTFZcm9YRUlrSGZyWFpoNVc5MFJXbmNBSG1zaTZiSk5kUTBaTnczQnJHdWlNR3MyTWtzDQotIHB1QnpXemJ6ZE9hRUJlT3BSMm9VdGtrOWhUcnU3aXVvNG04d2dlbUt5cVRpMDRzQnNma0VmNjhqOEtsVVFaejlvL1N1WlJqMw0KLSBKWXJpQWppNC9TcDdXNmh0YlYyYVhjdTcwcmFtb3hsZTRnTjdIY0lYamJpcys0azVOZGFhYXVobVZjdjFySHVXNjFER2lHMW0NCi0gNmMxczIwL1RtZ0F2NXZtajU3VktrMytpeG5QYzF4VlY3MGg5Q1ZKdU90U3JMNzFoRmd4elNjVWtrbitpWS8ycTFpOXhEckdUDQotIDl5MzFwSjVPdGQxTCtHaE15N21UcldYTzJTYXBqUm4yOHZUbXRhM254am1nR092SmQydzFLa3YraXB6L0FCR3VPb3ZlWWRDZQ0KLSBPYmpyVTZ5NXJsc0E4eWNVa3NuK2lqL2VOYXc2aUpMTnNXNTl6VEpuNjgxNkZQNEVKbWJPK1NhejVtNjAyVWpJZ2s0SE5hZHYNCi0gTHdLYUJsK01wSU1PTWlwcDQ5MFNDSmVGN0NvcVF2RjJKdVJxV1E0WUVHclNpUUp1S25IclhCeU1wa2k3M0dGQk5YSW9oOW4yDQotIFNybm5PSzZNUFRiZDNzU3dJVkYycU1DcWt6SG11eTFsWVJuVEhyVkdXcFphTUtCK0JXbGJ5Y1lvUU0wSVpEeHpWK0dVOGMxYQ0KLSBJWXk1WStkbkhhdEFzZnNBSGZBcm1TMW1Qb2gxZ1Q4eDlxdGsxclFYN3RDZTVESWFwekd0R0JRbTcxU2xxR1dqbklINlZvd3QNCi0gem1oQXkvRTN2VjZGNnRFTXV4bFdJeUFmclZ4Q0NBTzFWWkVFeVlBNEFBcHhOR3d5SitsVkpSVXNhS013NjFTbEZRelJBUC9aDQotDQotWC1BVFRSSUJVVEU6U29tZSBTdHJpbmcNCi1CREFZOjE5ODAwMTAxDQotR0VPOjM1LjY1NjM4NTQsMTM5LjY5OTQyMzMNCi1VUkw6aHR0cDovL3d3dy5leGFtcGxlLmNvbS8NCi1SRVY6MjAwODA0MjRUMTk1MjQzWg0KLUVORDpWQ0FSRApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2ludmFsaWRfY29tbWVudF9saW5lLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2ludmFsaWRfY29tbWVudF9saW5lLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkxMDcxMC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9pbnZhbGlkX2NvbW1lbnRfbGluZS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1CRUdJTjp2Q2FyZA0KLVZFUlNJT046Mi4xDQotVUlEOjM1Nw0KLU46O0NvbmZlcmVuY2UgQ2FsbA0KLUZOOkNvbmZlcmVuY2UgQ2FsbA0KLSMgVGhpcyBsaW5lIG11c3QgYmUgaWdub3JlZC4NCi1OT1RFO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6VGhpcyBpcyBhbiAoc2hhcnAgLT49DQotIzwtIHNoYXJwKSBleGFtcGxlLiBUaGlzIG1lc3NhZ2UgbXVzdCBOT1QgYmUgaWdub3JlZC4NCi0jIFRoaXMgbGluZSBtdXN0IGJlIGlnbm9yZWQgdG9vLg0KLUVORDp2Q2FyZA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2phcGFuZXNlXzEudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfamFwYW5lc2VfMS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNWUyZmYuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfamFwYW5lc2VfMS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OO0NIQVJTRVQ9U0hJRlRfSklTOojAk6GDjYNDg2g7Ozs7DQotU09VTkQ7WC1JUk1DLU47Q0hBUlNFVD1TSElGVF9KSVM6sd3E3rPbssTeOzs7Ow0KLVRFTDtQUkVGO1ZPSUNFOjAzMDAwMDAwMDANCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8yLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2phcGFuZXNlXzIudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTU0YWNiLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2phcGFuZXNlXzIudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLUZOO0NIQVJTRVQ9U0hJRlRfSklTOojAk6Egg42DQ4NoIDENCi1OO0NIQVJTRVQ9U0hJRlRfSklTOojAk6E7g42DQ4NoMTs7Ow0KLVNPVU5EO1gtSVJNQy1OO0NIQVJTRVQ9U0hJRlRfSklTOrHdxN6zO9uyxN4xOzs7DQotQURSO0hPTUU7Q0hBUlNFVD1TSElGVF9KSVM7RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRTo7PTkzPThDPThCPTlFPTkzPTczPQ0KLT04Rj02MT05Mj00QT04Qj1FNj04RD1GNz04Qj03NT05Mj1BQzI2LTE9ODM9NUE9ODM9OEI9ODM9OEE9ODM9NDE9ODM9OTM9DQotPTgzPTVFPTgzPThGPTgxPTVCNj04QT00Qjs7OzsxNTAtODUxMjsNCi1OT1RFO0NIQVJTRVQ9U0hJRlRfSklTO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6PTgzPTgxPTgzPTgyDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfbXVsdGlwbGVfZW50cnkudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfbXVsdGlwbGVfZW50cnkudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmJiMTlhLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX211bHRpcGxlX2VudHJ5LnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OO0NIQVJTRVQ9U0hJRlRfSklTOojAk6GDjYNDg2gzOzs7Ow0KLVNPVU5EO1gtSVJNQy1OO0NIQVJTRVQ9U0hJRlRfSklTOrHdxN6z27LE3jM7Ozs7DQotVEVMO1gtTkVDLVNFQ1JFVDo5DQotVEVMO1gtTkVDLUhPVEVMOjEwDQotVEVMO1gtTkVDLVNDSE9PTDoxMQ0KLVRFTDtIT01FO0ZBWDoxMg0KLUVORDpWQ0FSRA0KLQ0KLQ0KLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OO0NIQVJTRVQ9U0hJRlRfSklTOojAk6GDjYNDg2g0Ozs7Ow0KLVNPVU5EO1gtSVJNQy1OO0NIQVJTRVQ9U0hJRlRfSklTOrHdxN6z27LE3jQ7Ozs7DQotVEVMO01PREVNOjEzDQotVEVMO1BBR0VSOjE0DQotVEVMO1gtTkVDLUZBTUlMWToxNQ0KLVRFTDtYLU5FQy1HSVJMOjE2DQotRU5EOlZDQVJEDQotDQotDQotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLU47Q0hBUlNFVD1TSElGVF9KSVM6iMCToYONg0ODaDU7Ozs7DQotU09VTkQ7WC1JUk1DLU47Q0hBUlNFVD1TSElGVF9KSVM6sd3E3rPbssTeNTs7OzsNCi1URUw7WC1ORUMtQk9ZOjE3DQotVEVMO1gtTkVDLUZSSUVORDoxOA0KLVRFTDtYLU5FQy1QSFM6MTkNCi1URUw7WC1ORUMtUkVTVEFVUkFOVDoyMA0KLUVORDpWQ0FSRA0KLQ0KLQ0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX29yZ19iZWZvcmVfdGl0bGUudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfb3JnX2JlZm9yZV90aXRsZS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZjExOTAuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfb3JnX2JlZm9yZV90aXRsZS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1GTjpOb3JtYWwgR3V5DQotT1JHOkNvbXBhbnk7T3JnYW5pemF0aW9uO0RldmlzaW9uO1Jvb207U2hlZXQgTm8uDQotVElUTEU6RXhjZWxsZW50IEphbml0b3INCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9wcmVmX2hhbmRsaW5nLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3ByZWZfaGFuZGxpbmcudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTA1MzEwLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3ByZWZfaGFuZGxpbmcudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotQkVHSU46VkNBUkQKLVZFUlNJT046Mi4xCi1GTjpTbWl0aAotVEVMO0hPTUU6MQotVEVMO1dPUks7UFJFRjoyCi1URUw7SVNETjozCi1FTUFJTDtQUkVGO0hPTUU6dGVzdEBleGFtcGxlLmNvbQotRU1BSUw7Q0VMTDtQUkVGOnRlc3QyQGV4YW1pbmF0aW9uLmNvbQotT1JHOkNvbXBhbnkKLVRJVExFOkVuZ2luZWVyCi1PUkc6TXlzdGVyeQotVElUTEU6QmxvZ2dlcgotT1JHOlBvZXRyeQotVElUTEU6UG9ldAotRU5EOlZDQVJECmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYWJiNGMuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzEudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLU46QW5kbztSb2lkOw0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8yLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8yLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBkNWFiNS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMi52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUJFR0lOOlZDQVJEDQotRk46QW5kbyBSb2lkDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzMudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzMudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWRkYWJiLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8zLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1OOkFuZG87Um9pZDsNCi1GTjpBbmRvIFJvaWQNCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV90aXRsZV9iZWZvcmVfb3JnLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3RpdGxlX2JlZm9yZV9vcmcudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmRjNzM4Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3RpdGxlX2JlZm9yZV9vcmcudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotRk46TmljZSBHdXkNCi1USVRMRTpDb29sIFRpdGxlDQotT1JHOk1hcnZlcm91cztQZXJmZWN0O0dyZWF0O0dvb2Q7QmFkO1Bvb3INCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV93aW5tb182NS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV93aW5tb182NS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzODBkMGQuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfd2lubW9fNjUudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLU46RXhhbXBsZTs7OzsNCi1GTjpFeGFtcGxlDQotQU5OSVZFUlNBUlk7VkFMVUU9REFURToyMDA5MTAxMA0KLUFHRU5UOkludmFsaWQgbGluZSB3aGljaCBtdXN0IGJlIGhhbmRsZWQgY29ycmVjdGx5Lg0KLVgtQ0xBU1M6UFVCTElDDQotWC1SRURVQ1RJT046DQotWC1OTzoNCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9jb21tYV9zZXBhcmF0ZWQudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfY29tbWFfc2VwYXJhdGVkLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThhN2YyMC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9jb21tYV9zZXBhcmF0ZWQudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046My4wDQotTjpGO0c7TTs7DQotVEVMO1RZUEU9UEFHRVIsV09SSyxNU0c6NjEwMTIzMTIzNEBwYWdlcnNhbXBsZS5jb20NCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9tdWx0aWJ5dGVfcGFyYW0udmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfbXVsdGlieXRlX3BhcmFtLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QyMDBlNS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9tdWx0aWJ5dGVfcGFyYW0udmNmCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046My4wDQotTjpGO0c7TTs7DQotVEVMO1RZUEU9Iui0uSI6MQ0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX3NpbXBsZS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9zaW1wbGUudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTg2NjFmLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX3NpbXBsZS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046My4wDQotRk46QW5kIFJvaWQNCi1OOkFuZDtSb2lkOzs7DQotT1JHOk9wZW47SGFuZHNldDsgQWxsaWFuY2UNCi1TT1JULVNUUklORzphbmRyb2lkDQotVEVMO1RZUEU9UFJFRjtUWVBFPVZPSUNFOjAzMDAwMDAwMDANCi1DTEFTUzpQVUJMSUMNCi1YLUdOTzowDQotWC1HTjpncm91cDANCi1YLVJFRFVDVElPTjowDQotUkVWOjIwMDgxMDMxVDA2NTg1NFoNCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9BY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0FjY2Vzc2liaWxpdHlUZXN0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTUxZWVhLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0FjY2Vzc2liaWxpdHlUZXN0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2U7Ci0KLWltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvOwotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKLWltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgdGV4dCB0aGUgYWNjZXNzaWJpbGl0eSBmcmFtZXdvcmsgZW5kIHRvIGVuZC4KLSAqIDxwPgotICogTm90ZTogU2luY2UgYWNjZXNzaWJpbGl0eSBpcyBwcm92aWRlZCBieSB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2V9cyB3ZSBjcmVhdGUgb25lLAotICogYW5kIGl0IGdlbmVyYXRlcyBhbiBldmVudCBhbmQgYW4gaW50ZXJydXB0aW9uIGRpc3BhdGNoaW5nIHRoZW0gdGhyb3VnaCB0aGUKLSAqIHtAbGluayBBY2Nlc3NpYmlsaXR5TWFuYWdlcn0uIFdlIHZlcmlmeSB0aGUgcmVjZWl2ZWQgcmVzdWx0LiBUbyB0cmlnZ2VyIHRoZSB0ZXN0Ci0gKiBnbyB0byBTZXR0aW5ncy0+QWNjZXNzaWJpbGl0eSBhbmQgc2VsZWN0IHRoZSBlbmFibGUgYWNjZXNzaWJpbGl0eSBjaGVjayBhbmQgdGhlbgotICogc2VsZWN0IHRoZSBjaGVjayBmb3IgdGhpcyBzZXJ2aWNlIChzYW1lIG5hbWUgYXMgdGhlIGNsYXNzKS4KLSAqLwotcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlUZXN0U2VydmljZSBleHRlbmRzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkFjY2Vzc2liaWxpdHlUZXN0U2VydmljZSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRSA9ICJmb28uYmFyLmJhei5UZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gImZvby5iYXIuYmF6IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVCA9ICJTb21lIHN0dWZmIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVGT1JFX1RFWFQgPSAiU29tZSBvdGhlciBzdHVmZiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ERVNDUklQVElPTiA9ICJDb250ZW50IGRlc2NyaXB0aW9uIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJVEVNX0NPVU5UID0gMTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENVUlJFTlRfSVRFTV9JTkRFWCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVEVSUlVQVF9JTlZPQ0FUSU9OX1RZUEUgPSAweDAwMDAwMjAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZST01fSU5ERVggPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERFRF9DT1VOVCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFTU9WRURfQ09VTlQgPSAxOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVElGSUNBVElPTl9USU1FT1VUX01JTExJUyA9IDgwOwotCi0gICAgcHJpdmF0ZSBpbnQgbVJlY2VpdmVkUmVzdWx0OwotCi0gICAgcHJpdmF0ZSBUaW1lciBtVGltZXIgPSBuZXcgVGltZXIoKTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZCgpIHsKLSAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGluZm8gPSBuZXcgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKCk7Ci0gICAgICAgIGluZm8uZXZlbnRUeXBlcyA9IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFU19BTExfTUFTSzsKLSAgICAgICAgaW5mby5mZWVkYmFja1R5cGUgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfQVVESUJMRTsKLSAgICAgICAgaW5mby5ub3RpZmljYXRpb25UaW1lb3V0ID0gTk9USUZJQ0FUSU9OX1RJTUVPVVRfTUlMTElTOwotICAgICAgICBpbmZvLmZsYWdzICY9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5ERUZBVUxUOwotICAgICAgICBzZXRTZXJ2aWNlSW5mbyhpbmZvKTsKLQotICAgICAgICAvLyB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgdGhlIHN5c3RlbSBwaWNrcyBvdXIgY29uZmlndXJhdGlvbgotICAgICAgICAvLyBvdGhlcndpc2UgaXQgd2lsbCBub3Qgbm90aWZ5IHVzCi0gICAgICAgIG1UaW1lci5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdGVzdEFjY2Vzc2liaWxpdHlFdmVudERpc3BhdGNoaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RJbnRlcnJ1cHQoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRXJyb3IgaW4gdGVzdGluZyBBY2Nlc3NpYmlsaXR5IGZlYXR1cmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIDEwMDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGhlcmUgaWYgdGhlIGV2ZW50IHdlIHJlY2VpdmVkIGlzIGFjdHVhbGx5IHRoZSBvbmUgd2Ugc2VudC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgYXNzZXJ0KEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX05PVElGSUNBVElPTl9TVEFURV9DSEFOR0VEID09IGV2ZW50LmdldEV2ZW50VHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50ICE9IG51bGwpOwotICAgICAgICBhc3NlcnQoZXZlbnQuZ2V0RXZlbnRUaW1lKCkgPiAwKTsKLSAgICAgICAgYXNzZXJ0KENMQVNTX05BTUUuZXF1YWxzKGV2ZW50LmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgIGFzc2VydChQQUNLQUdFX05BTUUuZXF1YWxzKGV2ZW50LmdldFBhY2thZ2VOYW1lKCkpKTsKLSAgICAgICAgYXNzZXJ0KDEgPT0gZXZlbnQuZ2V0VGV4dCgpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydChURVhULmVxdWFscyhldmVudC5nZXRUZXh0KCkuZ2V0KDApKSk7Ci0gICAgICAgIGFzc2VydChCRUZPUkVfVEVYVC5lcXVhbHMoZXZlbnQuZ2V0QmVmb3JlVGV4dCgpKSk7Ci0gICAgICAgIGFzc2VydChldmVudC5pc0NoZWNrZWQoKSk7Ci0gICAgICAgIGFzc2VydChDT05URU5UX0RFU0NSSVBUSU9OLmVxdWFscyhldmVudC5nZXRDb250ZW50RGVzY3JpcHRpb24oKSkpOwotICAgICAgICBhc3NlcnQoSVRFTV9DT1VOVCA9PSBldmVudC5nZXRJdGVtQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydChDVVJSRU5UX0lURU1fSU5ERVggPT0gZXZlbnQuZ2V0Q3VycmVudEl0ZW1JbmRleCgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50LmlzRW5hYmxlZCgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50LmlzUGFzc3dvcmQoKSk7Ci0gICAgICAgIGFzc2VydChGUk9NX0lOREVYID09IGV2ZW50LmdldEZyb21JbmRleCgpKTsKLSAgICAgICAgYXNzZXJ0KEFEREVEX0NPVU5UID09IGV2ZW50LmdldEFkZGVkQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydChSRU1PVkVEX0NPVU5UID09IGV2ZW50LmdldFJlbW92ZWRDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50LmdldFBhcmNlbGFibGVEYXRhKCkgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydCgxID09ICgoTm90aWZpY2F0aW9uKSBldmVudC5nZXRQYXJjZWxhYmxlRGF0YSgpKS5pY29uKTsKLQotICAgICAgICAvLyBzZXQgdGhlIHR5cGUgb2YgdGhlIHJlY2V2ZWQgcmVxdWVzdAotICAgICAgICBtUmVjZWl2ZWRSZXN1bHQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9OT1RJRklDQVRJT05fU1RBVEVfQ0hBTkdFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYSBmbGFnIHRoYXQgd2UgcmVjZWl2ZWQgdGhlIGludGVycnVwdCByZXF1ZXN0LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uSW50ZXJydXB0KCkgewotCi0gICAgICAgIC8vIHNldCB0aGUgdHlwZSBvZiB0aGUgcmVjZXZlZCByZXF1ZXN0Ci0gICAgICAgIG1SZWNlaXZlZFJlc3VsdCA9IElOVEVSUlVQVF9JTlZPQ0FUSU9OX1RZUEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0gaXMgc2VudCBhbmQgcmVjZWl2ZWQgY29ycmVjdGx5LgotICAgICAqLwotICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc2liaWxpdHlFdmVudERpc3BhdGNoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0KLSAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbihBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9OT1RJRklDQVRJT05fU1RBVEVfQ0hBTkdFRCk7Ci0KLSAgICAgICBhc3NlcnQoZXZlbnQgIT0gbnVsbCk7Ci0gICAgICAgZXZlbnQuc2V0Q2xhc3NOYW1lKENMQVNTX05BTUUpOwotICAgICAgIGV2ZW50LnNldFBhY2thZ2VOYW1lKFBBQ0tBR0VfTkFNRSk7Ci0gICAgICAgZXZlbnQuZ2V0VGV4dCgpLmFkZChURVhUKTsKLSAgICAgICBldmVudC5zZXRCZWZvcmVUZXh0KEJFRk9SRV9URVhUKTsKLSAgICAgICBldmVudC5zZXRDaGVja2VkKHRydWUpOwotICAgICAgIGV2ZW50LnNldENvbnRlbnREZXNjcmlwdGlvbihDT05URU5UX0RFU0NSSVBUSU9OKTsKLSAgICAgICBldmVudC5zZXRJdGVtQ291bnQoSVRFTV9DT1VOVCk7Ci0gICAgICAgZXZlbnQuc2V0Q3VycmVudEl0ZW1JbmRleChDVVJSRU5UX0lURU1fSU5ERVgpOwotICAgICAgIGV2ZW50LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgZXZlbnQuc2V0UGFzc3dvcmQodHJ1ZSk7Ci0gICAgICAgZXZlbnQuc2V0RnJvbUluZGV4KEZST01fSU5ERVgpOwotICAgICAgIGV2ZW50LnNldEFkZGVkQ291bnQoQURERURfQ09VTlQpOwotICAgICAgIGV2ZW50LnNldFJlbW92ZWRDb3VudChSRU1PVkVEX0NPVU5UKTsKLSAgICAgICBldmVudC5zZXRQYXJjZWxhYmxlRGF0YShuZXcgTm90aWZpY2F0aW9uKDEsICJGb28iLCAxMjM0KSk7Ci0KLSAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZSh0aGlzKS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KTsKLQotICAgICAgIGFzc2VydChtUmVjZWl2ZWRSZXN1bHQgPT0gZXZlbnQuZ2V0RXZlbnRUeXBlKCkpOwotCi0gICAgICAgTG9nLmkoTE9HX1RBRywgIkFjY2Vzc2liaWxpdHlUZXN0U2VydmljZSN0ZXN0QWNjZXNzaWJpbGl0eUV2ZW50RGlzcGF0Y2hpbmc6IFN1Y2Nlc3MiKTsKLSAgIH0KLQotICAgLyoqCi0gICAgKiBJZiBhY2Nlc3NpYmlsaXR5IGZlZWRiYWNrIGludGVycnVwdGlvbiBpcyB0cmlnZ2VyZWQgYW5kIHJlY2VpdmVkIGNvcnJlY3RseS4KLSAgICAqLwotICAgcHVibGljIHZvaWQgdGVzdEludGVycnVwdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKHRoaXMpLmludGVycnVwdCgpOwotCi0gICAgICAgYXNzZXJ0KElOVEVSUlVQVF9JTlZPQ0FUSU9OX1RZUEUgPT0gbVJlY2VpdmVkUmVzdWx0KTsKLQotICAgICAgIExvZy5pKExPR19UQUcsICJBY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UjdGVzdEludGVycnVwdDogU3VjY2VzcyIpOwotICAgfQotfQotCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoU3RyZXNzVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFN0cmVzc1Rlc3QuamF2YQppbmRleCBjYTZlY2UwLi43YTZlZThlIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoU3RyZXNzVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhTdHJlc3NUZXN0LmphdmEKQEAgLTIwLDEwICsyMCw4IEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSGVhZHNldC5TZXJ2aWNlTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CkBAIC02MSwzNiArNTksNiBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQU5DRUxfRElTQ09WRVJZX1RJTUVPVVQgPSA1MDAwOwogCi0gICAgLyoqCi0gICAgICogVGltZW91dCBmb3Ige0BsaW5rIEJsdWV0b290aERldmljZSNjcmVhdGVCb25kKCl9IGluIG1zLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUlSX1RJTUVPVVQgPSAyMDAwMDsKLQotICAgIC8qKgotICAgICAqIFRpbWVvdXQgZm9yIHtAbGluayBCbHVldG9vdGhEZXZpY2UjcmVtb3ZlQm9uZCgpfSBpbiBtcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5QQUlSX1RJTUVPVVQgPSAyMDAwMDsKLQotICAgIC8qKgotICAgICAqIFRpbWVvdXQgZm9yIHtAbGluayBCbHVldG9vdGhBMmRwI2Nvbm5lY3RTaW5rKEJsdWV0b290aERldmljZSl9IGluIG1zLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0EyRFBfVElNRU9VVCA9IDIwMDAwOwotCi0gICAgLyoqCi0gICAgICogVGltZW91dCBmb3Ige0BsaW5rIEJsdWV0b290aEEyZHAjZGlzY29ubmVjdFNpbmsoQmx1ZXRvb3RoRGV2aWNlKX0gaW4gbXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfQTJEUF9USU1FT1VUID0gMjAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaW1lb3V0IGZvciB7QGxpbmsgQmx1ZXRvb3RoSGVhZHNldCNjb25uZWN0SGVhZHNldChCbHVldG9vdGhEZXZpY2UpfSBpbiBtcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9IRUFEU0VUX1RJTUVPVVQgPSAyMDAwMDsKLQotICAgIC8qKgotICAgICAqIFRpbWVvdXQgZm9yIHtAbGluayBCbHVldG9vdGhIZWFkc2V0I2Rpc2Nvbm5lY3RIZWFkc2V0KEJsdWV0b290aERldmljZSl9IGluIG1zLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0hFQURTRVRfVElNRU9VVCA9IDIwMDAwOwotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPVkVSWV9TVEFSVEVEX0ZMQUcgPSAxOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNDT1ZFUllfRklOSVNIRURfRkxBRyA9IDEgPDwgMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9NT0RFX05PTkVfRkxBRyA9IDEgPDwgMjsKQEAgLTEwMCwyMyArNjgsNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9UVVJOSU5HX09OX0ZMQUcgPSAxIDw8IDY7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX09OX0ZMQUcgPSAxIDw8IDc7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1RVUk5JTkdfT0ZGX0ZMQUcgPSAxIDw8IDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBSVJfU1RBVEVfRkxBRyA9IDEgPDwgOTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9BMkRQX0ZMQUcgPSAxIDw8IDEwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9GSUxFX0hFQURTRVRfRkxBRyA9IDEgPDwgMTE7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFJUl9TVEFURV9CT05ERUQgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUlSX1NUQVRFX0JPTkRJTkcgPSAxIDw8IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBSVJfU1RBVEVfTk9ORSA9IDEgPDwgMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBMkRQX1NUQVRFX0RJU0NPTk5FQ1RFRCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEEyRFBfU1RBVEVfQ09OTkVDVElORyA9IDEgPDwgMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQTJEUF9TVEFURV9DT05ORUNURUQgPSAxIDw8IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEEyRFBfU1RBVEVfRElTQ09OTkVDVElORyA9IDEgPDwgMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQTJEUF9TVEFURV9QTEFZSU5HID0gMSA8PCA0OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhFQURTRVRfU1RBVEVfRElTQ09OTkVDVEVEID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEVBRFNFVF9TVEFURV9DT05ORUNUSU5HID0gMSA8PCAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIRUFEU0VUX1NUQVRFX0NPTk5FQ1RFRCA9IDEgPDwgMjsKIAogICAgIC8qKgogICAgICAqIFRpbWUgYmV0d2VlbiBwb2xscyBpbiBtcy4KQEAgLTEyOSw0MSArODAsOCBAQAogCiAgICAgcHJpdmF0ZSBCdWZmZXJlZFdyaXRlciBtT3V0cHV0V3JpdGVyOwogCi0gICAgcHJpdmF0ZSBCbHVldG9vdGhBMmRwIG1BMmRwOwotCi0gICAgcHJpdmF0ZSBCbHVldG9vdGhIZWFkc2V0IG1IZWFkc2V0OwotCi0gICAgcHJpdmF0ZSBjbGFzcyBIZWFkc2V0U2VydmljZUxpc3RlbmVyIGltcGxlbWVudHMgU2VydmljZUxpc3RlbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Db25uZWN0ZWQgPSBmYWxzZTsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3RlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSGVhZHNldFNlcnZpY2VMaXN0ZW5lciBtSGVhZHNldFNlcnZpY2VMaXN0ZW5lciA9IG5ldyBIZWFkc2V0U2VydmljZUxpc3RlbmVyKCk7Ci0KICAgICBwcml2YXRlIGNsYXNzIEJsdWV0b290aFJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewogICAgICAgICBwcml2YXRlIGludCBtRmlyZWRGbGFncyA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IG1QYWlyRmlyZWRGbGFncyA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IG1BMmRwRmlyZWRGbGFncyA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IG1IZWFkc2V0RmlyZWRGbGFncyA9IDA7CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKQEAgLTIwNSw1OCArMTIzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyZWRGbGFncyB8PSBTVEFURV9UVVJOSU5HX09GRl9GTEFHOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0JPTkRfU1RBVEVfQ0hBTkdFRC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgICAgICAgICBtRmlyZWRGbGFncyB8PSBQQUlSX1NUQVRFX0ZMQUc7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfQk9ORF9TVEFURSwgLTEpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKHN0YXRlLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYWlyRmlyZWRGbGFncyB8PSBQQUlSX1NUQVRFX0JPTkRFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9ORElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFpckZpcmVkRmxhZ3MgfD0gUEFJUl9TVEFURV9CT05ESU5HOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9OT05FOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYWlyRmlyZWRGbGFncyB8PSBQQUlSX1NUQVRFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEJsdWV0b290aEEyZHAuQUNUSU9OX1NJTktfU1RBVEVfQ0hBTkdFRC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgICAgICAgICBtRmlyZWRGbGFncyB8PSBQUk9GSUxFX0EyRFBfRkxBRzsKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aEEyZHAuRVhUUkFfU0lOS19TVEFURSwgLTEpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKHN0YXRlLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBGaXJlZEZsYWdzIHw9IEEyRFBfU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBGaXJlZEZsYWdzIHw9IEEyRFBfU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBGaXJlZEZsYWdzIHw9IEEyRFBfU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBGaXJlZEZsYWdzIHw9IEEyRFBfU1RBVEVfRElTQ09OTkVDVElORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwRmlyZWRGbGFncyB8PSBBMkRQX1NUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX1NUQVRFX0NIQU5HRUQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpcmVkRmxhZ3MgfD0gUFJPRklMRV9IRUFEU0VUX0ZMQUc7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhIZWFkc2V0LkVYVFJBX1NUQVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRVJST1IpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKHN0YXRlLCBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZHNldEZpcmVkRmxhZ3MgfD0gSEVBRFNFVF9TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZHNldEZpcmVkRmxhZ3MgfD0gSEVBRFNFVF9TVEFURV9DT05ORUNUSU5HOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZHNldEZpcmVkRmxhZ3MgfD0gSEVBRFNFVF9TVEFURV9DT05ORUNURUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI2NywzMCArMTMzLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGFpckZpcmVkRmxhZ3MoKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVBhaXJGaXJlZEZsYWdzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRBMmRwRmlyZWRGbGFncygpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIHJldHVybiBtQTJkcEZpcmVkRmxhZ3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEhlYWRzZXRGaXJlZEZsYWdzKCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1IZWFkc2V0RmlyZWRGbGFnczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0RmlyZWRGbGFncygpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgICAgIG1GaXJlZEZsYWdzID0gMDsKLSAgICAgICAgICAgICAgICBtUGFpckZpcmVkRmxhZ3MgPSAwOwotICAgICAgICAgICAgICAgIG1BMmRwRmlyZWRGbGFncyA9IDA7Ci0gICAgICAgICAgICAgICAgbUhlYWRzZXRGaXJlZEZsYWdzID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTMxNywxMyArMTYyLDcgQEAKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhBZGFwdGVyLkFDVElPTl9ESVNDT1ZFUllfU1RBUlRFRCk7CiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fU0NBTl9NT0RFX0NIQU5HRUQpOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NUQVRFX0NIQU5HRUQpOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aERldmljZS5BQ1RJT05fQk9ORF9TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhBMmRwLkFDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUQpOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX1NUQVRFX0NIQU5HRUQpOwogICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlciwgZmlsdGVyKTsKLQotICAgICAgICBtQTJkcCA9IG5ldyBCbHVldG9vdGhBMmRwKG1Db250ZXh0KTsKLSAgICAgICAgbUhlYWRzZXQgPSBuZXcgQmx1ZXRvb3RoSGVhZHNldChtQ29udGV4dCwgbUhlYWRzZXRTZXJ2aWNlTGlzdGVuZXIpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMzgwLDUxICsyMTksNiBAQAogICAgICAgICBkaXNhYmxlKGFkYXB0ZXIpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRlc3RQYWlyKCkgewotICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBhZGFwdGVyLmdldFJlbW90ZURldmljZShCbHVldG9vdGhUZXN0UnVubmVyLnNIZWFkc2V0QWRkcmVzcyk7Ci0KLSAgICAgICAgZW5hYmxlKGFkYXB0ZXIpOwotICAgICAgICBwYWlyKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgIHVucGFpcihhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICBkaXNhYmxlKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0QTJkcCgpIHsKLSAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBCbHVldG9vdGhUZXN0UnVubmVyLnNDb25uZWN0QTJkcEl0ZXJhdGlvbnM7Ci0gICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKEJsdWV0b290aFRlc3RSdW5uZXIuc0EyZHBBZGRyZXNzKTsKLQotICAgICAgICBlbmFibGUoYWRhcHRlcik7Ci0gICAgICAgIHBhaXIoYWRhcHRlciwgZGV2aWNlKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgewotICAgICAgICAgICAgd3JpdGVPdXRwdXQoImNvbm5lY3RBMmRwIGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIiArIGl0ZXJhdGlvbnMpOwotICAgICAgICAgICAgY29ubmVjdEEyZHAoYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgICAgIGRpc2Nvbm5lY3RBMmRwKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBVbnBhaXIgZnJvbSBkZXZpY2UgaWYgZGV2aWNlIGNhbiBhY2NlcHQgcGFpcmluZyBhZnRlciB1bnBhaXJpbmcKLSAgICAgICAgZGlzYWJsZShhZGFwdGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdEhlYWRzZXQoKSB7Ci0gICAgICAgIGludCBpdGVyYXRpb25zID0gQmx1ZXRvb3RoVGVzdFJ1bm5lci5zQ29ubmVjdEhlYWRzZXRJdGVyYXRpb25zOwotICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBhZGFwdGVyLmdldFJlbW90ZURldmljZShCbHVldG9vdGhUZXN0UnVubmVyLnNIZWFkc2V0QWRkcmVzcyk7Ci0KLSAgICAgICAgZW5hYmxlKGFkYXB0ZXIpOwotICAgICAgICBwYWlyKGFkYXB0ZXIsIGRldmljZSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKLSAgICAgICAgICAgIHdyaXRlT3V0cHV0KCJjb25uZWN0SGVhZHNldCBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIgKyBpdGVyYXRpb25zKTsKLSAgICAgICAgICAgIGNvbm5lY3RIZWFkc2V0KGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgICAgICBkaXNjb25uZWN0SGVhZHNldChhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgZGlzYWJsZShhZGFwdGVyKTsKLSAgICB9Ci0KICAgICBwcml2YXRlIHZvaWQgZGlzYWJsZShCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIpIHsKICAgICAgICAgaW50IG1hc2sgPSBTVEFURV9UVVJOSU5HX09GRl9GTEFHIHwgU1RBVEVfT0ZGX0ZMQUcgfCBTQ0FOX01PREVfTk9ORV9GTEFHOwogICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7CkBAIC02NjMsMzUxICs0NTcsNiBAQAogCiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHBhaXIoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGludCBtYXNrID0gUEFJUl9TVEFURV9GTEFHOwotICAgICAgICBpbnQgcGFpck1hc2sgPSBQQUlSX1NUQVRFX0JPTkRJTkcgfCBQQUlSX1NUQVRFX0JPTkRFRDsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotCi0gICAgICAgIGlmICghYWRhcHRlci5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZmFpbCgicGFpcigpIGJsdWV0b290aCBub3QgZW5hYmxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHN0YXRlID0gZGV2aWNlLmdldEJvbmRTdGF0ZSgpOwotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRDoKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9ORElORzoKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBjaGVjayBmb3IgcmVjZWl2ZWQgaW50ZW50cyBzaW5jZSB3ZSBtaWdodCBoYXZlIG1pc3NlZCB0aGVtLgotICAgICAgICAgICAgICAgIG1hc2sgPSBwYWlyTWFzayA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX05PTkU6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZXZpY2UuY3JlYXRlQm9uZCgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgZmFpbCgicGFpcigpIGludmFsaWRlIHN0YXRlOiBzdGF0ZT0iICsgc3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyBzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBQQUlSX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIHN0YXRlID0gZGV2aWNlLmdldEJvbmRTdGF0ZSgpOwotICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRCkgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgaWYgKChtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzawotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1SZWNlaXZlci5nZXRQYWlyRmlyZWRGbGFncygpICYgcGFpck1hc2spID09IHBhaXJNYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoInBhaXIoKSBjb21wbGV0ZWQgaW4gJWQgbXM6IGRldmljZT0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyksIGRldmljZSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgaW50IHBhaXJGaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldFBhaXJGaXJlZEZsYWdzKCk7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJwYWlyKCkgdGltZW91dDogc3RhdGU9JWQgKGV4cGVjdGVkICVkKSwgZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCksICIKLSAgICAgICAgICAgICAgICArICJwYWlyRmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCkiLCBzdGF0ZSwgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVELCBmaXJlZEZsYWdzLAotICAgICAgICAgICAgICAgIG1hc2ssIHBhaXJGaXJlZEZsYWdzLCBwYWlyTWFzaykpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1bnBhaXIoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGludCBtYXNrID0gUEFJUl9TVEFURV9GTEFHOwotICAgICAgICBpbnQgcGFpck1hc2sgPSBQQUlSX1NUQVRFX05PTkU7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLQotICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGZhaWwoInVucGFpcigpIGJsdWV0b290aCBub3QgZW5hYmxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHN0YXRlID0gZGV2aWNlLmdldEJvbmRTdGF0ZSgpOwotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRDoKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGV2aWNlLnJlbW92ZUJvbmQoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRJTkc6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZXZpY2UucmVtb3ZlQm9uZCgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORToKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZhaWwoInVucGFpcigpIGludmFsaWQgc3RhdGU6IHN0YXRlPSIgKyBzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKGRldmljZS5yZW1vdmVCb25kKCkpOwotCi0gICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgVU5QQUlSX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIGlmIChkZXZpY2UuZ2V0Qm9uZFN0YXRlKCkgPT0gQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORSkgewotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGlmICgobVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2sKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChtUmVjZWl2ZXIuZ2V0UGFpckZpcmVkRmxhZ3MoKSAmIHBhaXJNYXNrKSA9PSBwYWlyTWFzaykgewotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJ1bnBhaXIoKSBjb21wbGV0ZWQgaW4gJWQgbXM6IGRldmljZT0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyksIGRldmljZSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICBpbnQgcGFpckZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0UGFpckZpcmVkRmxhZ3MoKTsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoInVucGFpcigpIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksIGZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpLCAiCi0gICAgICAgICAgICAgICAgKyAicGFpckZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwgc3RhdGUsIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRCwgZmlyZWRGbGFncywKLSAgICAgICAgICAgICAgICBtYXNrLCBwYWlyRmlyZWRGbGFncywgcGFpck1hc2spKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29ubmVjdEEyZHAoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGludCBtYXNrID0gUFJPRklMRV9BMkRQX0ZMQUc7Ci0gICAgICAgIGludCBhMmRwTWFzazEgPSBBMkRQX1NUQVRFX0NPTk5FQ1RJTkcgfCBBMkRQX1NUQVRFX0NPTk5FQ1RFRCB8IEEyRFBfU1RBVEVfUExBWUlORzsKLSAgICAgICAgaW50IGEyZHBNYXNrMiA9IGEyZHBNYXNrMSBeIEEyRFBfU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICBpbnQgYTJkcE1hc2szID0gYTJkcE1hc2sxIF4gQTJEUF9TVEFURV9QTEFZSU5HOwotICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKCJjb25uZWN0QTJkcCgpIGJsdWV0b290aCBub3QgZW5hYmxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICBmYWlsKCJjb25uZWN0QTJkcCgpIGRldmljZSBub3QgcGFpcmVkOiBkZXZpY2U9IiArIGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc3RhdGUgPSBtQTJkcC5nZXRTaW5rU3RhdGUoZGV2aWNlKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUEyZHAuaXNTaW5rQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNUSU5HOgotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShtQTJkcC5pc1NpbmtDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQTJkcC5jb25uZWN0U2luayhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1BMmRwLmlzU2lua0Nvbm5lY3RlZChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBjaGVjayBmb3IgcmVjZWl2ZWQgaW50ZW50cyBzaW5jZSB3ZSBtaWdodCBoYXZlIG1pc3NlZCB0aGVtLgotICAgICAgICAgICAgICAgIG1hc2sgPSBhMmRwTWFzazEgPSBhMmRwTWFzazIgPSBhMmRwTWFzazMgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmYWlsKCJjb25uZWN0QTJkcCgpIGludmFsaWQgc3RhdGU6IHN0YXRlPSIgKyBzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IENPTk5FQ1RfQTJEUF9USU1FT1VUKSB7Ci0gICAgICAgICAgICBzdGF0ZSA9IG1BMmRwLmdldFNpbmtTdGF0ZShkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVEVEIHx8IHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORykgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUEyZHAuaXNTaW5rQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgU1RBVEVfQ09OTkVDVElORyBhbmQgKFNUQVRFX0NPTk5FQ1RFRCBvciBTVEFURV9QTEFZSU5HKSBpbnRlbnRzCi0gICAgICAgICAgICAgICAgLy8gaGF2ZSBmaXJlZCBpZiB3ZSBhcmUgY2hlY2tpbmcgaWYgaW50ZW50cyBzaG91bGQgYmUgZmlyZWQuCi0gICAgICAgICAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICAgICAgICAgIGludCBhMmRwRmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRBMmRwRmlyZWRGbGFncygpOwotICAgICAgICAgICAgICAgIGlmICgobVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2sKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICgoYTJkcEZpcmVkRmxhZ3MgJiBhMmRwTWFzazEpID09IGEyZHBNYXNrMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoYTJkcEZpcmVkRmxhZ3MgJiBhMmRwTWFzazIpID09IGEyZHBNYXNrMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoYTJkcEZpcmVkRmxhZ3MgJiBhMmRwTWFzazMpID09IGEyZHBNYXNrMykpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJjb25uZWN0QTJkcCgpIGNvbXBsZXRlZCBpbiAlZCBtczogZGV2aWNlPSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzKSwgZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICBpbnQgYTJkcEZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0QTJkcEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoImNvbm5lY3RBMmRwKCkgdGltZW91dDogc3RhdGU9JWQgKGV4cGVjdGVkICVkIG9yICVkKSwgIgotICAgICAgICAgICAgICAgICsgImZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpLCBhMmRwRmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCBvciAweCV4IG9yIDB4JXgpIiwKLSAgICAgICAgICAgICAgICBzdGF0ZSwgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNURUQsIEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORywgZmlyZWRGbGFncywKLSAgICAgICAgICAgICAgICBtYXNrLCBhMmRwRmlyZWRGbGFncywgYTJkcE1hc2sxLCBhMmRwTWFzazIsIGEyZHBNYXNrMykpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkaXNjb25uZWN0QTJkcChCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaW50IG1hc2sgPSBQUk9GSUxFX0EyRFBfRkxBRzsKLSAgICAgICAgaW50IGEyZHBNYXNrID0gQTJEUF9TVEFURV9ESVNDT05ORUNUSU5HIHwgQTJEUF9TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLQotICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGZhaWwoImRpc2Nvbm5lY3RBMmRwKCkgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpIHsKLSAgICAgICAgICAgIGZhaWwoImRpc2Nvbm5lY3RBMmRwKCkgZGV2aWNlIG5vdCBwYWlyZWQ6IGRldmljZT0iICsgZGV2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzdGF0ZSA9IG1BMmRwLmdldFNpbmtTdGF0ZShkZXZpY2UpOwotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1BMmRwLmlzU2lua0Nvbm5lY3RlZChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVEVEOgotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQTJkcC5pc1NpbmtDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQTJkcC5kaXNjb25uZWN0U2luayhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1BMmRwLmlzU2lua0Nvbm5lY3RlZChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1BMmRwLmRpc2Nvbm5lY3RTaW5rKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUEyZHAuaXNTaW5rQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCi0gICAgICAgICAgICAgICAgbWFzayA9IGEyZHBNYXNrID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgZmFpbCgiZGlzY29ubmVjdEEyZHAoKSBpbnZhbGlkIHN0YXRlOiBzdGF0ZT0iICsgc3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyBzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBESVNDT05ORUNUX0EyRFBfVElNRU9VVCkgewotICAgICAgICAgICAgc3RhdGUgPSBtQTJkcC5nZXRTaW5rU3RhdGUoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1BMmRwLmlzU2lua0Nvbm5lY3RlZChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBpZiAoKG1SZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAobVJlY2VpdmVyLmdldEEyZHBGaXJlZEZsYWdzKCkgJiBhMmRwTWFzaykgPT0gYTJkcE1hc2spIHsKLSAgICAgICAgICAgICAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJkaXNjb25uZWN0QTJkcCgpIGNvbXBsZXRlZCBpbiAlZCBtczogZGV2aWNlPSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzKSwgZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICBpbnQgYTJkcEZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0QTJkcEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoImRpc2Nvbm5lY3RBMmRwKCkgdGltZW91dDogc3RhdGU9JWQgKGV4cGVjdGVkICVkKSwgIgotICAgICAgICAgICAgICAgICsgImZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpLCBhMmRwRmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCkiLCBzdGF0ZSwKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRCwgZmlyZWRGbGFncywgbWFzaywgYTJkcEZpcmVkRmxhZ3MsIGEyZHBNYXNrKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbm5lY3RIZWFkc2V0KEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpbnQgbWFzayA9IFBST0ZJTEVfSEVBRFNFVF9GTEFHOwotICAgICAgICBpbnQgaGVhZHNldE1hc2sgPSBIRUFEU0VUX1NUQVRFX0NPTk5FQ1RJTkcgfCBIRUFEU0VUX1NUQVRFX0NPTk5FQ1RFRDsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotCi0gICAgICAgIGlmICghYWRhcHRlci5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZmFpbCgiY29ubmVjdEhlYWRzZXQoKSBibHVldG9vdGggbm90IGVuYWJsZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgewotICAgICAgICAgICAgZmFpbCgiY29ubmVjdEhlYWRzZXQoKSBkZXZpY2Ugbm90IHBhaXJlZDogZGV2aWNlPSIgKyBkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKCFtSGVhZHNldFNlcnZpY2VMaXN0ZW5lci5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHN0YXRlID0gbUhlYWRzZXQuZ2V0U3RhdGUoZGV2aWNlKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1IZWFkc2V0LmlzQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUhlYWRzZXQuaXNDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgbUhlYWRzZXQuY29ubmVjdEhlYWRzZXQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1IZWFkc2V0LmlzQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCi0gICAgICAgICAgICAgICAgbWFzayA9IGhlYWRzZXRNYXNrID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9FUlJPUjoKLSAgICAgICAgICAgICAgICBmYWlsKCJjb25uZWN0SGVhZHNldCgpIGVycm9yIHN0YXRlIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZhaWwoImNvbm5lY3RIZWFkc2V0KCkgaW52YWxpZCBzdGF0ZTogc3RhdGU9IiArIHN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgQ09OTkVDVF9IRUFEU0VUX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIHN0YXRlID0gbUhlYWRzZXQuZ2V0U3RhdGUoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUhlYWRzZXQuaXNDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgaWYgKChtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzawotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1SZWNlaXZlci5nZXRIZWFkc2V0RmlyZWRGbGFncygpICYgaGVhZHNldE1hc2spID09IGhlYWRzZXRNYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiY29ubmVjdEhlYWRzZXQoKSBjb21wbGV0ZWQgaW4gJWQgbXM6IGRldmljZT0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyksIGRldmljZSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgaW50IGhlYWRzZXRGaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEhlYWRzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJjb25uZWN0SGVhZHNldCgpIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksICIKLSAgICAgICAgICAgICAgICArICJmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSwgaGVhZHNldEZsYWdzPTB4JXMgKGV4cGVjdGVkIDB4JXgpIiwgc3RhdGUsCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNURUQsIGZpcmVkRmxhZ3MsIG1hc2ssIGhlYWRzZXRGaXJlZEZsYWdzLAotICAgICAgICAgICAgICAgIGhlYWRzZXRNYXNrKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRpc2Nvbm5lY3RIZWFkc2V0KEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpbnQgbWFzayA9IFBST0ZJTEVfSEVBRFNFVF9GTEFHOwotICAgICAgICBpbnQgaGVhZHNldE1hc2sgPSBIRUFEU0VUX1NUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotCi0gICAgICAgIGlmICghYWRhcHRlci5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZmFpbCgiZGlzY29ubmVjdEhlYWRzZXQoKSBibHVldG9vdGggbm90IGVuYWJsZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgewotICAgICAgICAgICAgZmFpbCgiZGlzY29ubmVjdEhlYWRzZXQoKSBkZXZpY2Ugbm90IHBhaXJlZDogZGV2aWNlPSIgKyBkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKCFtSGVhZHNldFNlcnZpY2VMaXN0ZW5lci5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHN0YXRlID0gbUhlYWRzZXQuZ2V0U3RhdGUoZGV2aWNlKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICBtSGVhZHNldC5kaXNjb25uZWN0SGVhZHNldChkZXZpY2UpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgbUhlYWRzZXQuZGlzY29ubmVjdEhlYWRzZXQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0VSUk9SOgotICAgICAgICAgICAgICAgIGZhaWwoImRpc2Nvbm5lY3RIZWFkc2V0KCkgZXJyb3Igc3RhdGUiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgZmFpbCgiZGlzY29ubmVjdEhlYWRzZXQoKSBpbnZhbGlkIHN0YXRlOiBzdGF0ZT0iICsgc3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyBzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBESVNDT05ORUNUX0hFQURTRVRfVElNRU9VVCkgewotICAgICAgICAgICAgc3RhdGUgPSBtSGVhZHNldC5nZXRTdGF0ZShkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUhlYWRzZXQuaXNDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgaWYgKChtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzawotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1SZWNlaXZlci5nZXRIZWFkc2V0RmlyZWRGbGFncygpICYgaGVhZHNldE1hc2spID09IGhlYWRzZXRNYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiZGlzY29ubmVjdEhlYWRzZXQoKSBjb21wbGV0ZWQgaW4gJWQgbXM6IGRldmljZT0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyksIGRldmljZSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgaW50IGhlYWRzZXRGaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEhlYWRzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJkaXNjb25uZWN0SGVhZHNldCgpIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksICIKLSAgICAgICAgICAgICAgICArICJmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSwgaGVhZHNldEZsYWdzPTB4JXMgKGV4cGVjdGVkIDB4JXgpIiwgc3RhdGUsCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQsIGZpcmVkRmxhZ3MsIG1hc2ssIGhlYWRzZXRGaXJlZEZsYWdzLAotICAgICAgICAgICAgICAgIGhlYWRzZXRNYXNrKSk7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT3V0cHV0KFN0cmluZyBzKSB7CiAgICAgICAgIGlmIChtT3V0cHV0V3JpdGVyID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhUZXN0UnVubmVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFJ1bm5lci5qYXZhCmluZGV4IGUzZDJlYjYuLmNmMGZmOTkgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhUZXN0UnVubmVyLmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFRlc3RSdW5uZXIuamF2YQpAQCAtMjYsMTEgKzI2LDYgQEAKICAgICBwdWJsaWMgc3RhdGljIGludCBzRW5hYmxlSXRlcmF0aW9ucyA9IDEwMDsKICAgICBwdWJsaWMgc3RhdGljIGludCBzRGlzY292ZXJhYmxlSXRlcmF0aW9ucyA9IDEwMDA7CiAgICAgcHVibGljIHN0YXRpYyBpbnQgc1NjYW5JdGVyYXRpb25zID0gMTAwMDsKLSAgICBwdWJsaWMgc3RhdGljIGludCBzQ29ubmVjdEhlYWRzZXRJdGVyYXRpb25zID0gMTAwMDsKLSAgICBwdWJsaWMgc3RhdGljIGludCBzQ29ubmVjdEEyZHBJdGVyYXRpb25zID0gMTAwMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNIZWFkc2V0QWRkcmVzcyA9ICIiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNBMmRwQWRkcmVzcyA9ICIiOwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFRlc3RTdWl0ZSBnZXRBbGxUZXN0cygpIHsKQEAgLTc0LDMzICs2OSw1IEBACiAgICAgICAgICAgICAgICAgLy8gSW52YWxpZCBhcmd1bWVudCwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIHZhbCA9IGFyZ3VtZW50cy5nZXRTdHJpbmcoImNvbm5lY3RfYTJkcF9pdGVyYXRpb25zIik7Ci0gICAgICAgIGlmICh2YWwgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzQ29ubmVjdEEyZHBJdGVyYXRpb25zID0gSW50ZWdlci5wYXJzZUludCh2YWwpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGFyZ3VtZW50LCBmYWxsIGJhY2sgdG8gZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygiY29ubmVjdF9oZWFkc2V0X2l0ZXJhdGlvbnMiKTsKLSAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNDb25uZWN0SGVhZHNldEl0ZXJhdGlvbnMgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIEludmFsaWQgYXJndW1lbnQsIGZhbGwgYmFjayB0byBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWwgPSBhcmd1bWVudHMuZ2V0U3RyaW5nKCJoZWFkc2V0X2FkZHJlc3MiKTsKLSAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzSGVhZHNldEFkZHJlc3MgPSB2YWw7Ci0gICAgICAgIH0KLQotICAgICAgICB2YWwgPSBhcmd1bWVudHMuZ2V0U3RyaW5nKCJhMmRwX2FkZHJlc3MiKTsKLSAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzQTJkcEFkZHJlc3MgPSB2YWw7Ci0gICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L01lbW9yeUZpbGVQcm92aWRlci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9NZW1vcnlGaWxlUHJvdmlkZXIuamF2YQppbmRleCBjNGJjNzY3Li43MzUzMGQ3IDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L01lbW9yeUZpbGVQcm92aWRlci5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvTWVtb3J5RmlsZVByb3ZpZGVyLmphdmEKQEAgLTE2LDE2ICsxNiwxMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKIAotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlVyaU1hdGNoZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlsczsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPcGVuSGVscGVyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLk1lbW9yeUZpbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCkBAIC0xMzQsNjQgKzEyOSwzNCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5Bc3NldEZpbGUoVXJpIHVybCwgU3RyaW5nIG1vZGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgIHB1YmxpYyBQYXJjZWxGaWxlRGVzY3JpcHRvciBvcGVuRmlsZShVcmkgdXJsLCBTdHJpbmcgbW9kZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCBtYXRjaCA9IHNVUkxNYXRjaGVyLm1hdGNoKHVybCk7CiAgICAgICAgIHN3aXRjaCAobWF0Y2gpIHsKICAgICAgICAgICAgIGNhc2UgREFUQV9JRF9CTE9COgogICAgICAgICAgICAgICAgIFN0cmluZyBzcWwgPSAiU0VMRUNUIF9ibG9iIEZST00gZGF0YSBXSEVSRSBfaWQ9IiArIHVybC5nZXRQYXRoU2VnbWVudHMoKS5nZXQoMSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEJsb2JDb2x1bW5Bc0Fzc2V0RmlsZSh1cmwsIG1vZGUsIHNxbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJsb2JDb2x1bW5Bc0ZpbGUodXJsLCBtb2RlLCBzcWwpOwogICAgICAgICAgICAgY2FzZSBIVUdFOgogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lbW9yeUZpbGUgbWVtb3J5RmlsZSA9IG5ldyBNZW1vcnlGaWxlKG51bGwsIDUwMDAwMDApOwotICAgICAgICAgICAgICAgICAgICBtZW1vcnlGaWxlLndyaXRlQnl0ZXMoVEVTVF9CTE9CLCAwLCAxMDAwMDAwLCBURVNUX0JMT0IubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtb3J5RmlsZS5kZWFjdGl2YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBc3NldEZpbGVEZXNjcmlwdG9yLmZyb21NZW1vcnlGaWxlKG1lbW9yeUZpbGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGFyY2VsRmlsZURlc2NyaXB0b3IuZnJvbURhdGEoVEVTVF9CTE9CLCBudWxsKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJFcnJvciByZWFkaW5nICIgKyB1cmwgKyAiOiIgKyBleC50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXNlIEZJTEU6CiAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gZ2V0Q29udGV4dCgpLmdldEZpbGVTdHJlYW1QYXRoKERBVEFfRklMRSk7Ci0gICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQgPQotICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3Iub3BlbihmaWxlLCBQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX1JFQURfT05MWSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NldEZpbGVEZXNjcmlwdG9yKGZkLCAwLCBBc3NldEZpbGVEZXNjcmlwdG9yLlVOS05PV05fTEVOR1RIKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUGFyY2VsRmlsZURlc2NyaXB0b3Iub3BlbihmaWxlLCBQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX1JFQURfT05MWSk7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIk5vIGZpbGVzIHN1cHBvcnRlZCBieSBwcm92aWRlciBhdCAiICsgdXJsKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgQXNzZXRGaWxlRGVzY3JpcHRvciBnZXRCbG9iQ29sdW1uQXNBc3NldEZpbGUoVXJpIHVybCwgU3RyaW5nIG1vZGUsIFN0cmluZyBzcWwpCisgICAgcHJpdmF0ZSBQYXJjZWxGaWxlRGVzY3JpcHRvciBnZXRCbG9iQ29sdW1uQXNGaWxlKFVyaSB1cmwsIFN0cmluZyBtb2RlLCBTdHJpbmcgc3FsKQogICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghInIiLmVxdWFscyhtb2RlKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiTW9kZSAiICsgbW9kZSArICIgbm90IHN1cHBvcnRlZCBmb3IgIiArIHVybCk7CiAgICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0UmVhZGFibGVEYXRhYmFzZSgpOwotICAgICAgICAgICAgTWVtb3J5RmlsZSBmaWxlID0gc2ltcGxlUXVlcnlGb3JCbG9iTWVtb3J5RmlsZShkYiwgc3FsKTsKLSAgICAgICAgICAgIGlmIChmaWxlID09IG51bGwpIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIk5vIHN1Y2ggZW50cnk6ICIgKyB1cmwpOwotICAgICAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBhZmQgPSBBc3NldEZpbGVEZXNjcmlwdG9yLmZyb21NZW1vcnlGaWxlKGZpbGUpOwotICAgICAgICAgICAgZmlsZS5kZWFjdGl2YXRlKCk7Ci0gICAgICAgICAgICAvLyBuZWVkIHRvIGR1cCBhbmQgdGhlbiBjbG9zZT8gb3BlbkZpbGVIZWxwZXIoKSBkb2Vzbid0IGRvIHRoYXQgdGhvdWdoCi0gICAgICAgICAgICByZXR1cm4gYWZkOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiRXJyb3IgcmVhZGluZyAiICsgdXJsICsgIjoiICsgZXgudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9CiAKLSAgICBwcml2YXRlIE1lbW9yeUZpbGUgc2ltcGxlUXVlcnlGb3JCbG9iTWVtb3J5RmlsZShTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQ3Vyc29yIGN1cnNvciA9IGRiLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoIWN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBjdXJzb3IuZ2V0QmxvYigwKTsKLSAgICAgICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IG5ldyBNZW1vcnlGaWxlKG51bGwsIGJ5dGVzLmxlbmd0aCk7Ci0gICAgICAgICAgICBmaWxlLndyaXRlQnl0ZXMoYnl0ZXMsIDAsIDAsIGJ5dGVzLmxlbmd0aCk7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0UmVhZGFibGVEYXRhYmFzZSgpOworICAgICAgICByZXR1cm4gRGF0YWJhc2VVdGlscy5ibG9iRmlsZURlc2NyaXB0b3JGb3JRdWVyeShkYiwgc3FsLCBudWxsKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvTWVtb3J5RmlsZVByb3ZpZGVyVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9NZW1vcnlGaWxlUHJvdmlkZXJUZXN0LmphdmEKaW5kZXggNjJiNGU3ZS4uYmJlN2MxMCAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9NZW1vcnlGaWxlUHJvdmlkZXJUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9NZW1vcnlGaWxlUHJvdmlkZXJUZXN0LmphdmEKQEAgLTU2LDcgKzU2LDYgQEAKICAgICAgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly9hbmRyb2lkLmNvbnRlbnQuTWVtb3J5RmlsZVByb3ZpZGVyL2h1Z2UiKTsKICAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gcmVzb2x2ZXIub3BlbklucHV0U3RyZWFtKHVyaSk7CiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gb3BlbiBzdHJlYW0gbnVtYmVyICIgKyBpLCBpbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTAwMDAwMCwgaW4uc2tpcCgxMDAwMDAwKSk7CiAgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbTWVtb3J5RmlsZVByb3ZpZGVyLlRFU1RfQkxPQi5sZW5ndGhdOwogICAgICAgICAgICAgaW50IGNvdW50ID0gaW4ucmVhZChidWYpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Zi5sZW5ndGgsIGNvdW50KTsKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlQ3Vyc29yVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VDdXJzb3JUZXN0LmphdmEKaW5kZXggZmI1YTM2Zi4uMDczMzIyOSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VDdXJzb3JUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VDdXJzb3JUZXN0LmphdmEKQEAgLTMzLDcgKzMzLDYgQEAKIGltcG9ydCBhbmRyb2lkLnRlc3QuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlN1cHByZXNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKQEAgLTQxLDggKzQwLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KIHB1YmxpYyBjbGFzcyBEYXRhYmFzZUN1cnNvclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgaW1wbGVtZW50cyBQZXJmb3JtYW5jZVRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzU3RyaW5nMSA9ICJ0aGlzIGlzIGEgdGVzdCI7CkBAIC05Miw0MyArODksNiBAQAogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEN1cnNvclVwZGF0ZSgpIHsKLSAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoCi0gICAgICAgICAgICAiQ1JFQVRFIFRBQkxFIHRlc3QgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkIElOVEVHRVIsIHMgSU5URUdFUik7Iik7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIElOVE8gdGVzdCAoZCwgcykgVkFMVUVTICgiICsgaSArIAotICAgICAgICAgICAgICAgICIsIiArIGklMiArICIpOyIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBDdXJzb3IgYyA9IG1EYXRhYmFzZS5xdWVyeSgidGVzdCIsIG51bGwsICJzID0gMCIsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICBpbnQgZENvbCA9IGMuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJkIik7Ci0gICAgICAgIGludCBzQ29sID0gYy5nZXRDb2x1bW5JbmRleE9yVGhyb3coInMiKTsKLSAgICAgICAgCi0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjLnVwZGF0ZUludChkQ29sLCAzKSk7Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygxMCwgY291bnQpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLmNvbW1pdFVwZGF0ZXMoKSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKGMucmVxdWVyeSgpKTsKLSAgICAgICAgCi0gICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgYy5nZXRJbnQoZENvbCkpOwotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBjb3VudCk7Ci0gICAgICAgIGFzc2VydFRydWUoYy5tb3ZlVG9GaXJzdCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLmRlbGV0ZVJvdygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDksIGMuZ2V0Q291bnQoKSk7Ci0gICAgICAgIGMuY2xvc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmxvYigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBjcmVhdGUgdGFibGUKICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoCkBAIC0xNjQsMjQgKzEyNCw3IEBACiAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhibG9iLCBjQmxvYikpOwogICAgICAgICBhc3NlcnRFcXVhbHMocywgYy5nZXRTdHJpbmcoc0NvbCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoKGRvdWJsZSlkLCBjLmdldERvdWJsZShkQ29sKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygobG9uZylsLCBjLmdldExvbmcobENvbCkpOwotICAgICAgICAKLSAgICAgICAgLy8gbmV3IGJ5dGVbXQotICAgICAgICBieXRlW10gbmV3YmxvYiA9IG5ldyBieXRlWzEwMDBdOwotICAgICAgICB2YWx1ZSA9IDk4OwotICAgICAgICBBcnJheXMuZmlsbChibG9iLCB2YWx1ZSk7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGMudXBkYXRlQmxvYihiQ29sLCBuZXdibG9iKTsKLSAgICAgICAgY0Jsb2IgPSAgYy5nZXRCbG9iKGJDb2wpOwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3YmxvYiwgY0Jsb2IpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGNvbW1pdAotICAgICAgICBhc3NlcnRUcnVlKGMuY29tbWl0VXBkYXRlcygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLnJlcXVlcnkoKSk7Ci0gICAgICAgIGMubW92ZVRvTmV4dCgpOwotICAgICAgICBjQmxvYiA9ICBjLmdldEJsb2IoYkNvbCk7Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXdibG9iLCBjQmxvYikpOyAgICAgICAgCi0gICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKChsb25nKWwsIGMuZ2V0TG9uZyhsQ29sKSk7ICAgICAgICAKICAgICB9CiAgICAgCiAgICAgQE1lZGl1bVRlc3QKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YQppbmRleCA2NTYwMjlkLi5jZDM4YmYwNyAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VHZW5lcmFsVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YQpAQCAtMjEsMTggKzIxLDIxIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlU3RhdGVtZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKQEAgLTM4Miw1NCArMzg1LDI4IEBACiAKICAgICBATWVkaXVtVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTY2hlbWFDaGFuZ2UyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMSA9IG1EYXRhYmFzZTsKLSAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIyID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZSwgbnVsbCk7Ci0gICAgICAgIEN1cnNvciBjdXJzb3I7Ci0KLSAgICAgICAgZGIxLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBkYjEgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOwotCi0gICAgICAgIGN1cnNvciA9IGRiMS5xdWVyeSgiZGIxIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkN1cnNvciBpcyBudWxsIiwgY3Vyc29yKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBkYjEgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOworICAgICAgICBDdXJzb3IgY3Vyc29yID0gbURhdGFiYXNlLnF1ZXJ5KCJkYjEiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjdXJzb3IpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3Vyc29yLmdldENvdW50KCkpOwotICAgICAgICBjdXJzb3IuZGVhY3RpdmF0ZSgpOwotICAgICAgICAvLyB0aGlzIGNhdXNlIGV4Y2VwdGlvbiBiZWNhdXNlIHdlJ3JlIHN0aWxsIHVzaW5nIHNxbGl0ZV9wcmVwYXRlMTYgYW5kIG5vdAotICAgICAgICAvLyBzcWxpdGVfcHJlcGFyZTE2X3YyLiBUaGUgdjIgdmFyaWFudCBhZGRlZCB0aGUgYWJpbGl0eSB0byBjaGVjayB0aGUKLSAgICAgICAgLy8gc2NoZW1hIHZlcnNpb24gYW5kIGhhbmRsZSB0aGUgY2FzZSB3aGVuIHRoZSBzY2hlbWEgaGFzIGNoYW5nZWQKLSAgICAgICAgLy8gTWFyY28gTmVsaXNzZW4gY2xhaW0gaXQgd2FzIDJ4IHNsb3dlciB0byBjb21waWxlIFNRTCBzdGF0ZW1lbnRzIHNvCi0gICAgICAgIC8vIEkgcmV2ZXJ0ZWQgYmFjayB0byB0aGUgdjEgdmFyaWFudC4KLSAgICAgICAgLyogZGIyLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBkYjIgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOwotCi0gICAgICAgIGN1cnNvciA9IGRiMS5xdWVyeSgiZGIxIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkN1cnNvciBpcyBudWxsIiwgY3Vyc29yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGN1cnNvci5jb3VudCgpKTsKLSAgICAgICAgY3Vyc29yLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgKi8KKyAgICAgICAgY3Vyc29yLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hQ2hhbmdlMygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBtRGF0YWJhc2U7Ci0gICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUsIG51bGwpOwotICAgICAgICBDdXJzb3IgY3Vyc29yOwotCi0KLSAgICAgICAgZGIxLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBkYjEgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOwotICAgICAgICBkYjEuZXhlY1NRTCgiSU5TRVJUIElOVE8gZGIxIChkYXRhKSBWQUxVRVMgKCd0ZXN0Jyk7Iik7Ci0KLSAgICAgICAgY3Vyc29yID0gZGIxLnF1ZXJ5KCJkYjEiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgLy8gdGhpcyBjYXVzZSBleGNlcHRpb24gYmVjYXVzZSB3ZSdyZSBzdGlsbCB1c2luZyBzcWxpdGVfcHJlcGF0ZTE2IGFuZCBub3QKLSAgICAgICAgLy8gc3FsaXRlX3ByZXBhcmUxNl92Mi4gVGhlIHYyIHZhcmlhbnQgYWRkZWQgdGhlIGFiaWxpdHkgdG8gY2hlY2sgdGhlCi0gICAgICAgIC8vIHNjaGVtYSB2ZXJzaW9uIGFuZCBoYW5kbGUgdGhlIGNhc2Ugd2hlbiB0aGUgc2NoZW1hIGhhcyBjaGFuZ2VkCi0gICAgICAgIC8vIE1hcmNvIE5lbGlzc2VuIGNsYWltIGl0IHdhcyAyeCBzbG93ZXIgdG8gY29tcGlsZSBTUUwgc3RhdGVtZW50cyBzbwotICAgICAgICAvLyBJIHJldmVydGVkIGJhY2sgdG8gdGhlIHYxIHZhcmlhbnQuCi0gICAgICAgIC8qIGRiMi5leGVjU1FMKCJDUkVBVEUgVEFCTEUgZGIyIChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKCJDdXJzb3IgaXMgbnVsbCIsIGN1cnNvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBjdXJzb3IuY291bnQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY3Vyc29yLmZpcnN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCBjdXJzb3IuZ2V0U3RyaW5nKGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coImRhdGEiKSkpOwotICAgICAgICBjdXJzb3IuZGVhY3RpdmF0ZSgpOwotICAgICAgICAqLworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIGRiMSAoX2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIGRhdGEgVEVYVCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgSU5UTyBkYjEgKGRhdGEpIFZBTFVFUyAoJ3Rlc3QnKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkFMVEVSIFRBQkxFIGRiMSBBREQgQ09MVU1OIGJsYWggaW50OyIpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KCJzZWxlY3QgYmxhaCBmcm9tIGRiMSIsIG51bGwpOworICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBjbGFzcyBDaGFuZ2VPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CkBAIC00NjcsNDUgKzQ0NCw2IEBACiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90aWZpY2F0aW9uVGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLyoKLSAgICAgICAgQ3Vyc29yIGMgPSBtQ29udGVudFJlc29sdmVyLnF1ZXJ5KE5vdGVzLkNPTlRFTlRfVVJJLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7Tm90ZXMuX0lELCBOb3Rlcy5OT1RFfSwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKLSAgICAgICAgYy5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihuZXcgTXlDb250ZW50T2JzZXJ2ZXIodHJ1ZSkpOwotICAgICAgICBpbnQgY291bnQgPSBjLmNvdW50KCk7Ci0KLSAgICAgICAgTXlDb250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBuZXcgTXlDb250ZW50T2JzZXJ2ZXIoZmFsc2UpOwotICAgICAgICBtQ29udGVudFJlc29sdmVyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKE5vdGVzLkNPTlRFTlRfVVJJLCB0cnVlLCBvYnNlcnZlcik7Ci0KLSAgICAgICAgVXJpIHVyaTsKLQotICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiB2YWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgdmFsdWVzLnB1dChOb3Rlcy5OT1RFLCAidGVzdCBub3RlMSIpOwotICAgICAgICB1cmkgPSBtQ29udGVudFJlc29sdmVyLmluc2VydChOb3Rlcy5DT05URU5UX1VSSSwgdmFsdWVzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1DdXJzb3JOb3RpZmljYXRpb25Db3VudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtTm90aWZpY2F0aW9uQ291bnQpOwotCi0gICAgICAgIGMucmVxdWVyeSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY291bnQgKyAxLCBjLmNvdW50KCkpOwotICAgICAgICBjLmZpcnN0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGVzdCBub3RlMSIsIGMuZ2V0U3RyaW5nKGMuZ2V0Q29sdW1uSW5kZXgoTm90ZXMuTk9URSkpKTsKLSAgICAgICAgYy51cGRhdGVTdHJpbmcoYy5nZXRDb2x1bW5JbmRleChOb3Rlcy5OT1RFKSwgInRlc3Qgbm90ZTIiKTsKLSAgICAgICAgYy5jb21taXRVcGRhdGVzKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1DdXJzb3JOb3RpZmljYXRpb25Db3VudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBtTm90aWZpY2F0aW9uQ291bnQpOwotCi0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIuZGVsZXRlKHVyaSwgbnVsbCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG1DdXJzb3JOb3RpZmljYXRpb25Db3VudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBtTm90aWZpY2F0aW9uQ291bnQpOwotCi0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihvYnNlcnZlcik7Ci0gICAgICAgICovCi0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQXJncygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3QgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOwogICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKDEpOwpAQCAtOTg5LDIxICs5MjcsNiBAQAogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERiQ2xvc2VSZWxlYXNpbmdBbGxDYWNoZWRTcWwoKSB7Ci0gICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdCAoX2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIHRleHQxIFRFWFQsIHRleHQyIFRFWFQsICIgKwotICAgICAgICAgICAgICAgICJudW0xIElOVEVHRVIsIG51bTIgSU5URUdFUiwgaW1hZ2UgQkxPQik7Iik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzdGF0ZW1lbnQgPSAiREVMRVRFIEZST00gdGVzdCBXSEVSRSBfaWQ9PzsiOwotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50RG9Ob3RDbG9zZSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydFRydWUoc3RhdGVtZW50RG9Ob3RDbG9zZS5nZXRVbmlxdWVJZCgpID4gMCk7Ci0gICAgICAgIGludCBuU3RhdGVtZW50ID0gc3RhdGVtZW50RG9Ob3RDbG9zZS5nZXRVbmlxdWVJZCgpOwotICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudERvTm90Q2xvc2UuZ2V0VW5pcXVlSWQoKSA9PSBuU3RhdGVtZW50KTsKLSAgICAgICAgLyogZG8gbm90IGNsb3NlIHN0YXRlbWVudERvTm90Q2xvc2Ugb2JqZWN0LiAKLSAgICAgICAgICogVGhhdCBzaG91bGQgbGVhdmUgaXQgaW4gU1FMaXRlRGF0YWJhc2UubVByb2dyYW1zLgotICAgICAgICAgKiBtRGF0YWJhc2UuY2xvc2UoKSBpbiB0ZWFyRG93bigpIHNob3VsZCByZWxlYXNlIGl0LgotICAgICAgICAgKi8KLSAgICB9Ci0KLSAgICBATWVkaXVtVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZW1pY29sb25zSW5TdGF0ZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgcHJhZ21hX3Rlc3QgKCIgKwogICAgICAgICAgICAgICAgICJpIElOVEVHRVIgREVGQVVMVCAxMjM0LCAiICsKQEAgLTEwMjMsNiArOTQ2LDM0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmlvbnNXaXRoQmluZEFyZ3MoKSB7CisgICAgICAgIC8qIG1ha2Ugc3VyZSB1bmlvbnMgd2l0aCBiaW5kYXJncyB3b3JrIGh0dHA6Ly9iL2lzc3VlP2lkPTEwNjEyOTEgKi8KKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBBIChpIGludCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJjcmVhdGUgdGFibGUgQiAoayBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIEMgKG4gaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEEgdmFsdWVzKDEpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQSB2YWx1ZXMoMik7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBBIHZhbHVlcygzKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEIgdmFsdWVzKDIwMSk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBCIHZhbHVlcygyMDIpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQiB2YWx1ZXMoMjAzKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEMgdmFsdWVzKDkwMSk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBDIHZhbHVlcyg5MDIpOyIpOworICAgICAgICBTdHJpbmcgcyA9ICJzZWxlY3QgaSBmcm9tIEEgd2hlcmUgaSA+IDIgIiArCisgICAgICAgICAgICAgICAgIlVOSU9OIHNlbGVjdCBrIGZyb20gQiB3aGVyZSBrID4gMjAxICIgKworICAgICAgICAgICAgICAgICJVTklPTiBzZWxlY3QgbiBmcm9tIEMgd2hlcmUgbiAhPTkwMDsiOworICAgICAgICBDdXJzb3IgYyA9IG1EYXRhYmFzZS5yYXdRdWVyeShzLCBudWxsKTsKKyAgICAgICAgaW50IG4gPSBjLmdldENvdW50KCk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgU3RyaW5nIHMxID0gInNlbGVjdCBpIGZyb20gQSB3aGVyZSBpID4gPyAiICsKKyAgICAgICAgICAgICAgICAiVU5JT04gc2VsZWN0IGsgZnJvbSBCIHdoZXJlIGsgPiA/ICIgKworICAgICAgICAgICAgICAgICJVTklPTiBzZWxlY3QgbiBmcm9tIEMgd2hlcmUgbiAhPSA/OyI7CisgICAgICAgIEN1cnNvciBjMSA9IG1EYXRhYmFzZS5yYXdRdWVyeShzMSwgbmV3IFN0cmluZ1tdeyIyIiwgIjIwMSIsICI5MDAifSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuLCBjMS5nZXRDb3VudCgpKTsKKyAgICAgICAgYzEuY2xvc2UoKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUaGlzIHRlc3QgaXMgYXZhaWxhYmxlIG9ubHkgd2hlbiB0aGUgcGxhdGZvcm0gaGFzIGEgbG9jYWxlIHdpdGggdGhlIGxhbmd1YWdlICJqYSIuCiAgICAgICogSXQgZmluaXNoZXMgd2l0aG91dCBmYWlsdXJlIHdoZW4gaXQgaXMgbm90IGF2YWlsYWJsZS4gIApAQCAtMTEwOCw1ICsxMDU5LDExMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gICAgCisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRNYXhDYWhlc2l6ZSgpIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChpIGludCwgaiBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMSwxKTsiKTsKKyAgICAgICAgLy8gc2V0IGNhY2hlIHNpemUKKyAgICAgICAgaW50IE4gPSBTUUxpdGVEYXRhYmFzZS5NQVhfU1FMX0NBQ0hFX1NJWkU7CisgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisKKyAgICAgICAgLy8gdHJ5IHJlZHVjZSBjYWNoZXNpemUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoMSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJjYW5ub3Qgc2V0IGNhY2hlU2l6ZSB0byBhIHZhbHVlIGxlc3MgdGhhbiIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyKCkgeworICAgICAgICBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyID0gbmV3IERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpOworCisgICAgICAgIC8vIGNsb3NlIHRoZSBkYXRhYmFzZS4gYW5kIGNhbGwgY29ycnVwdGlvbiBoYW5kbGVyLgorICAgICAgICAvLyBpdCBzaG91bGQgZGVsZXRlIHRoZSBkYXRhYmFzZSBmaWxlLgorICAgICAgICBGaWxlIGRiZmlsZSA9IG5ldyBGaWxlKG1EYXRhYmFzZS5nZXRQYXRoKCkpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzT3BlbigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbihtRGF0YWJhc2UpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZGJmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSBhbiBpbi1tZW1vcnkgZGF0YWJhc2UuIGFuZCBjb3JydXB0aW9uIGhhbmRsZXIgc2hvdWxkbid0IHRyeSB0byBkZWxldGUgaXQKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgbWVtb3J5RGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZSgiOm1lbW9yeToiLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtZW1vcnlEYik7CisgICAgICAgIG1lbW9yeURiLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1lbW9yeURiLmlzT3BlbigpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVycm9ySGFuZGxlci5vbkNvcnJ1cHRpb24obWVtb3J5RGIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgidW5leHBlY3RlZCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIGEgZGF0YWJhc2UsIGtlZXAgaXQgb3BlbiwgY2FsbCBjb3JydXB0aW9uIGhhbmRsZXIuIGRhdGFiYXNlIGZpbGUgc2hvdWxkIGJlIGRlbGV0ZWQKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGJPYmogPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2UuZ2V0UGF0aCgpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRiT2JqKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYk9iai5pc09wZW4oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiT2JqKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgYSBkYXRhYmFzZSwgYXR0YWNoIDIgbW9yZSBkYXRhYmFzZXMgdG8gaXQKKyAgICAgICAgLy8gICAgYXR0YWNoZWQgZGF0YWJhc2UgIyAxOiAiOm1lbW9yeToiCisgICAgICAgIC8vICAgIGF0dGFjaGVkIGRhdGFiYXNlICMgMjogbURhdGFiYXNlLmdldFBhdGgoKSArICIxIjsKKyAgICAgICAgLy8gY2FsbCBjb3JydXB0aW9uIGhhbmRsZXIuIGRhdGFiYXNlIGZpbGVzIGluY2x1ZGluZyB0aGUgb25lIGZvciBhdHRhY2hlZCBkYXRhYmFzZSAjIDIKKyAgICAgICAgLy8gc2hvdWxkIGJlIGRlbGV0ZWQKKyAgICAgICAgU3RyaW5nIGF0dGFjaGVkRGIxRmlsZSA9IG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiMSI7CisgICAgICAgIGRiT2JqID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGRiT2JqLmV4ZWNTUUwoIkFUVEFDSCBEQVRBQkFTRSAnOm1lbW9yeTonIGFzIG1lbW9yeURiIik7CisgICAgICAgIGRiT2JqLmV4ZWNTUUwoIkFUVEFDSCBEQVRBQkFTRSAnIiArICBhdHRhY2hlZERiMUZpbGUgKyAiJyBhcyBhdHRhY2hlZERiMSIpOworICAgICAgICBhc3NlcnRUcnVlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUoYXR0YWNoZWREYjFGaWxlKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGJPYmopOworICAgICAgICBhc3NlcnRUcnVlKGRiT2JqLmlzT3BlbigpKTsKKyAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IGRiT2JqLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiT2JqKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShuZXcgRmlsZShhdHRhY2hlZERiMUZpbGUpLmV4aXN0cygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUsIGV4Y2VwdCB0aGlzIGlzIGEgYml0IG9mIHN0cmVzcyB0ZXN0aW5nLiBhdHRhY2ggNSBkYXRhYmFzZSBmaWxlcworICAgICAgICAvLyBhbmQgbWFrZSBzdXJlIHRoZXkgYXJlIGFsbCByZW1vdmVkLgorICAgICAgICBpbnQgTiA9IDU7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGF0dGFjaGVkRGJGaWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihOKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIGF0dGFjaGVkRGJGaWxlcy5hZGQobURhdGFiYXNlLmdldFBhdGgoKSArIGkpOworICAgICAgICB9CisgICAgICAgIGRiT2JqID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGRiT2JqLmV4ZWNTUUwoIkFUVEFDSCBEQVRBQkFTRSAnOm1lbW9yeTonIGFzIG1lbW9yeURiIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICBkYk9iai5leGVjU1FMKCJBVFRBQ0ggREFUQUJBU0UgJyIgKyAgYXR0YWNoZWREYkZpbGVzLmdldChpKSArICInIGFzIGF0dGFjaGVkRGIiICsgaSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZShhdHRhY2hlZERiRmlsZXMuZ2V0KGkpKS5leGlzdHMoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkYk9iaik7CisgICAgICAgIGFzc2VydFRydWUoZGJPYmouaXNPcGVuKCkpOworICAgICAgICBhdHRhY2hlZERicyA9IGRiT2JqLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiT2JqKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG5ldyBGaWxlKGF0dGFjaGVkRGJGaWxlcy5nZXQoaSkpLmV4aXN0cygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlQ29ubmVjdGlvblBvb2xUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI1ZGQyZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlVGVzdC5DbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZzsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitwdWJsaWMgY2xhc3MgRGF0YWJhc2VDb25uZWN0aW9uUG9vbFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGF0YWJhc2VDb25uZWN0aW9uUG9vbFRlc3QiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9DT05OID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TUUwgPSAic2VsZWN0ICogZnJvbSB0ZXN0IHdoZXJlIGkgPSA/IEFORCBqID0gMSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVEVTVF9TUUxTID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgVEVTVF9TUUwsIFRFU1RfU1FMICsgMSwgVEVTVF9TUUwgKyAyLCBURVNUX1NRTCArIDMsIFRFU1RfU1FMICsgNAorICAgIH07CisKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKKyAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKKyAgICBwcml2YXRlIERhdGFiYXNlQ29ubmVjdGlvblBvb2wgbVRlc3RQb29sOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBGaWxlIGRiRGlyID0gZ2V0Q29udGV4dCgpLmdldERpcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUgPSBuZXcgRmlsZShkYkRpciwgImRhdGFiYXNlX3Rlc3QuZGIiKTsKKyAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJjcmVhdGUgdGFibGUgdGVzdCAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgbVRlc3RQb29sID0gbmV3IERhdGFiYXNlQ29ubmVjdGlvblBvb2wobURhdGFiYXNlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtVGVzdFBvb2wpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1UZXN0UG9vbC5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFuZFJlbGVhc2UoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIC8vIGNvbm5lY3Rpb25zIHNob3VsZCBiZSBsYXppbHkgY3JlYXRlZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICAvLyBNQVggcG9vbCBzaXplIHNob3VsZCBiZSBzZXQgdG8gTUFYX0NPTk4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIGdldCBhIGNvbm5lY3Rpb24KKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMKTsKKyAgICAgICAgLy8gcG9vbCBzaXplIHNob3VsZCBiZSBvbmUgLSBzaW5jZSBvbmx5IG9uZSBzaG91bGQgYmUgYWxsb2NhdGVkIGZvciB0aGUgYWJvdmUgZ2V0KCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBkYi5tUGFyZW50Q29ubk9iaik7CisgICAgICAgIC8vIG5vIGZyZWUgY29ubmVjdGlvbnMgc2hvdWxkIGJlIGF2YWlsYWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiKSk7CisgICAgICAgIC8vIHJlbGVhc2UgdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIpKTsKKyAgICAgICAgLy8gcmVsZWFzZSB0aGUgc2FtZSBvYmplY3QgYWdhaW4gYW5kIGV4cGVjdCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiKTsKKyAgICAgICAgICAgIGZhaWwoImlsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkLgorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGFsbCBjb25uZWN0aW9ucyBmcm9tIHRoZSBwb29sIGFuZCBhc2sgZm9yIG9uZSBtb3JlLgorICAgICAqIHNob3VsZCBnZXQgb25lIG9mIHRoZSBjb25uZWN0aW9ucyBhbHJlYWR5IGdvdCBzbyBmYXIuIAorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsQ29ubkFuZE9uZU1vcmUoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICBBcnJheUxpc3Q8U1FMaXRlRGF0YWJhc2U+IGRiT2JqcyA9IG5ldyBBcnJheUxpc3Q8U1FMaXRlRGF0YWJhc2U+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiT2Jqcy5jb250YWlucyhkYikpOworICAgICAgICAgICAgZGJPYmpzLmFkZChkYik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBkYi5tUGFyZW50Q29ubk9iaik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBwb29sIGlzIG1heGVkIG91dCBhbmQgbm8gZnJlZSBjb25uZWN0aW9ucy4gYXNrIGZvciBvbmUgbW9yZSBjb25uZWN0aW9uCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMSA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUwpOworICAgICAgICAvLyBtYWtlIHN1cmUgZGIxIGlzIG9uZSBvZiB0aGUgZXhpc3Rpbmcgb25lcworICAgICAgICBhc3NlcnRUcnVlKGRiT2Jqcy5jb250YWlucyhkYjEpKTsKKyAgICAgICAgLy8gcG9vbCBzaXplIHNob3VsZCByZW1haW4gYXQgTUFYX0NPTk4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyByZWxlYXNlIGRiMSBidXQgc2luY2UgaXQgaXMgYWxsb2NhdGVkIDIgdGltZXMsIGl0IHNob3VsZCBzdGlsbCByZW1haW4gJ2J1c3knCisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiMSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYjEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyByZWxlYXNlIGFsbCBjb25uZWN0aW9ucworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9DT05OOyBpKyspIHsKKyAgICAgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiT2Jqcy5nZXQoaSkpOworICAgICAgICB9CisgICAgICAgIC8vIGFsbCBvYmplY3RzIGluIHRoZSBwb29sIHNob3VsZCBiZSBmcmVlZCBub3cKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogc2FtZSBhcyBhYm92ZSBleGNlcHQgdGhhdCBlYWNoIGNvbm5lY3Rpb24gaGFzIGRpZmZlcmVudCBTUUwgc3RhdGVtZW50IGFzc29jaWF0ZWQgd2l0aCBpdC4gCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uUmV0cmlldmFsRm9yUHJldmlvdXNseVNlZW5TcWwoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVEYXRhYmFzZT4gZGJPYmpzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVEYXRhYmFzZT4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSsrKSB7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgICAgIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihkYiwgVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiT2Jqcy52YWx1ZXMoKS5jb250YWlucyhkYikpOworICAgICAgICAgICAgZGJPYmpzLnB1dChURVNUX1NRTFNbaV0sIGRiKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIHBvb2wgaXMgbWF4ZWQgb3V0IGFuZCBubyBmcmVlIGNvbm5lY3Rpb25zLiBhc2sgZm9yIG9uZSBtb3JlIGNvbm5lY3Rpb24KKyAgICAgICAgLy8gdXNlIGEgcHJldmlvdXNseSBzZWVuIFNRTCBzdGF0ZW1lbnQKKyAgICAgICAgU3RyaW5nIHRlc3RTcWwgPSBURVNUX1NRTFNbTUFYX0NPTk4gLSAxXTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIxID0gbVRlc3RQb29sLmdldCh0ZXN0U3FsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBtYWtlIHN1cmUgZGIxIGlzIG9uZSBvZiB0aGUgZXhpc3Rpbmcgb25lcworICAgICAgICBhc3NlcnRUcnVlKGRiT2Jqcy52YWx1ZXMoKS5jb250YWlucyhkYjEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRiMSwgZGJPYmpzLmdldCh0ZXN0U3FsKSk7CisgICAgICAgIC8vIGRvIHRoZSBzYW1lIGFnYWluCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMiA9IG1UZXN0UG9vbC5nZXQodGVzdFNxbCk7CisgICAgICAgIC8vIG1ha2Ugc3VyZSBkYjEgaXMgb25lIG9mIHRoZSBleGlzdGluZyBvbmVzCisgICAgICAgIGFzc2VydEVxdWFscyhkYjIsIGRiT2Jqcy5nZXQodGVzdFNxbCkpOworCisgICAgICAgIC8vIHBvb2wgc2l6ZSBzaG91bGQgcmVtYWluIGF0IE1BWF9DT05OCisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICAvLyByZWxlYXNlIGRiMSBidXQgc2luY2UgdGhlIHNhbWUgY29ubmVjdGlvbiBpcyBhbGxvY2F0ZWQgMyB0aW1lcywKKyAgICAgICAgLy8gaXQgc2hvdWxkIHN0aWxsIHJlbWFpbiAnYnVzeScKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIxKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiT2Jqcy5nZXQodGVzdFNxbCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIC8vIHJlbGVhc2UgZGIyIGJ1dCBzaW5jZSB0aGUgc2FtZSBjb25uZWN0aW9uIGlzIGFsbG9jYXRlZCAyIHRpbWVzLAorICAgICAgICAvLyBpdCBzaG91bGQgc3RpbGwgcmVtYWluICdidXN5JworICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYjIpOworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGJPYmpzLmdldCh0ZXN0U3FsKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisKKyAgICAgICAgLy8gcmVsZWFzZSBhbGwgY29ubmVjdGlvbnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYk9ianMuZ2V0KFRFU1RfU1FMU1tpXSkpOworICAgICAgICB9CisgICAgICAgIC8vIGFsbCBvYmplY3RzIGluIHRoZSBwb29sIHNob3VsZCBiZSBmcmVlZCBub3cKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZVNxbE9uRGF0YWJhc2VDb25uKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsKSB7CisgICAgICAgIC8vIGdldCB0aGUgZ2l2ZW4gc3FsIGJlIGNvbXBpbGVkIG9uIHRoZSBnaXZlbiBkYXRhYmFzZSBjb25uZWN0aW9uLgorICAgICAgICAvLyB0aGlzIHdpbGwgaGVscCBEYXRhYmFzZUNvbmVuY3Rpb25Qb29sIGZpZ3VyZSBvdXQgaWYgYSBnaXZlbiBTUUwgc3RhdGVtZW50CisgICAgICAgIC8vIGlzIGFscmVhZHkgY2FjaGVkIGJ5IGEgZGF0YWJhc2UgY29ubmVjdGlvbi4KKyAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgYyA9CisgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKGRiLCBzcWwpOworICAgICAgICBjLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGEgY29ubmVjdGlvbiBmb3IgYSBTUUwgc3RhdGVtZW50ICdibGFoJy4gKGNvbm5lY3Rpb25fcykKKyAgICAgKiBtYWtlIHN1cmUgdGhlIHBvb2wgaGFzIGF0IGxlYXN0IG9uZSBmcmVlIGNvbm5lY3Rpb24gZXZlbiBhZnRlciB0aGlzIGdldCgpLgorICAgICAqIGFuZCBnZXQgYSBjb25uZWN0aW9uIGZvciB0aGUgc2FtZSBTUUwgYWdhaW4uCisgICAgICogICAgdGhpcyBjb25uZWN0aW9uIHNob3VsZCBiZSBkaWZmZXJlbnQgZnJvbSBjb25uZWN0aW9uX3MuCisgICAgICogICAgZXZlbiB0aG91Z2ggdGhlcmUgaXMgYSBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIFNRTCBwcmUtY29tcGlsZWQsIHNpbmNlIGlzIGl0IG5vdCBmcmVlCisgICAgICogICAgQU5EIHNpbmNlIHRoZSBwb29sIGhhcyBmcmVlIGNvbm5lY3Rpb25zIGF2YWlsYWJsZSwgc2hvdWxkIGdldCBhIG5ldyBjb25uZWN0aW9uLgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29ubkZvclRoZVNhbWVTcWwoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMKTsKKyAgICAgICAgZXhlY3V0ZVNxbE9uRGF0YWJhc2VDb25uKGRiLCBURVNUX1NRTCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYikpOworCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMSA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGRiMS5lcXVhbHMoZGIpKTsKKworICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiMSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCB0aGUgc2FtZSBjb25uZWN0aW9uIE4gdGltZXMgYW5kIHJlbGVhc2UgaXQgTiB0aW1lcy4KKyAgICAgKiB0aGlzIHRlc3RzIERhdGFiYXNlQ29ubmVjdGlvblBvb2wuUG9vbE9iai5tTnVtSG9sZGVycworICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2FtZUNvbm5OdGltZXNBbmRSZWxlYXNlSXROdGltZXMoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVEYXRhYmFzZT4gZGJPYmpzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVEYXRhYmFzZT4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSsrKSB7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgICAgIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihkYiwgVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiT2Jqcy52YWx1ZXMoKS5jb250YWlucyhkYikpOworICAgICAgICAgICAgZGJPYmpzLnB1dChURVNUX1NRTFNbaV0sIGRiKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIGV2ZXJ5IGNvbm5lY3Rpb24gaW4gdGhlIHBvb2wgc2hvdWxkIGhhdmUgbnVtSG9sZGVycyA9IDEKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSArKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRQb29sKCkuZ2V0KGkpLmdldE51bUhvbGRlcnMoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcG9vbCBpcyBtYXhlZCBvdXQgYW5kIG5vIGZyZWUgY29ubmVjdGlvbnMuIGFzayBmb3Igb25lIG1vcmUgY29ubmVjdGlvbgorICAgICAgICAvLyB1c2UgYSBwcmV2aW91c2x5IHNlZW4gU1FMIHN0YXRlbWVudAorICAgICAgICBTdHJpbmcgdGVzdFNxbCA9IFRFU1RfU1FMU1tNQVhfQ09OTiAtIDFdOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBtVGVzdFBvb2wuZ2V0KHRlc3RTcWwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIG1ha2Ugc3VyZSBkYjEgaXMgb25lIG9mIHRoZSBleGlzdGluZyBvbmVzCisgICAgICAgIGFzc2VydFRydWUoZGJPYmpzLnZhbHVlcygpLmNvbnRhaW5zKGRiMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGIxLCBkYk9ianMuZ2V0KHRlc3RTcWwpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiMSkpOworICAgICAgICBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sLlBvb2xPYmogcG9vbE9iaiA9IG1UZXN0UG9vbC5nZXRQb29sKCkuZ2V0KGRiMS5tQ29ubmVjdGlvbk51bSAtIDEpOworICAgICAgICBpbnQgbnVtSG9sZGVycyA9IHBvb2xPYmouZ2V0TnVtSG9sZGVycygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbnVtSG9sZGVycyk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gZ2V0IHRoZSBzYW1lIGNvbm5lY3Rpb24gTiB0aW1lcyBtb3JlCisgICAgICAgIGludCBOID0gMTAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIyID0gbVRlc3RQb29sLmdldCh0ZXN0U3FsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkYjEsIGRiMik7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIyKSk7CisgICAgICAgICAgICAvLyBudW1Ib2xkZXJzIGZvciB0aGlzIG9iamVjdCBzaG91bGQgYmUgbm93IHVwIGJ5IDEKKyAgICAgICAgICAgIGludCBwcmV2ID0gbnVtSG9sZGVyczsKKyAgICAgICAgICAgIG51bUhvbGRlcnMgPSBwb29sT2JqLmdldE51bUhvbGRlcnMoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmV2ICsgMSwgbnVtSG9sZGVycyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVsZWFzZSBpdCBOIHRpbWVzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYjEpOworICAgICAgICAgICAgaW50IHByZXYgPSBudW1Ib2xkZXJzOworICAgICAgICAgICAgbnVtSG9sZGVycyA9IHBvb2xPYmouZ2V0TnVtSG9sZGVycygpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHByZXYgLSAxLCBudW1Ib2xkZXJzKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYjEpKTsKKyAgICAgICAgfQorICAgICAgICAvLyB0aGUgY29ubmVjdGlvbiBzaG91bGQgc3RpbGwgaGF2ZSAyIG1vcmUgaG9sZGVycworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBwb29sT2JqLmdldE51bUhvbGRlcnMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcmVsZWFzZSAyIG1vcmUgdGltZXMKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIxKTsKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHBvb2xPYmouZ2V0TnVtSG9sZGVycygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYjEpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmVzc1Rlc3QoKSB7CisgICAgICAgIG1UZXN0UG9vbC5zZXRNYXhQb29sU2l6ZShNQVhfQ09OTik7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIEhhc2hNYXA8U1FMaXRlRGF0YWJhc2UsIEludGVnZXI+IGRiTWFwID0gbmV3IEhhc2hNYXA8U1FMaXRlRGF0YWJhc2UsIEludGVnZXI+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMU1tpXSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYk1hcC5jb250YWluc0tleShkYikpOworICAgICAgICAgICAgZGJNYXAucHV0KGRiLCAxKTsKKyAgICAgICAgICAgIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihkYiwgVEVTVF9TUUxTW2ldKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIGFzayBmb3IgbG90IG1vcmUgY29ubmVjdGlvbnMgYnV0IHNpbmNlIHRoZSBwb29sIGlzIG1heGVkIG91dCwgd2Ugc2hvdWxkIHN0YXJ0IHJlY2VpdmluZworICAgICAgICAvLyBjb25uZWN0aW9ucyB0aGF0IHdlIGFscmVhZHkgZ290IHNvIGZhcgorICAgICAgICBmb3IgKGludCBpID0gTUFYX0NPTk47IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVRlc3RQb29sLmdldChURVNUX1NRTCArIGkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkYk1hcC5jb250YWluc0tleShkYikpOworICAgICAgICAgICAgaW50IGsgPSBkYk1hcC5nZXQoZGIpOworICAgICAgICAgICAgZGJNYXAucHV0KGRiLCArK2spOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcHJpbnQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGVzIHJlY2VpdmVkLCBzaG91bGQgYmUgdW5pZm9ybS4KKyAgICAgICAgZm9yIChTUUxpdGVEYXRhYmFzZSBkIDogZGJNYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgImNvbm5lY3Rpb24gIyAiICsgZC5tQ29ubmVjdGlvbk51bSArICIsIG51bUhvbGRlcnM6ICIgKyBkYk1hcC5nZXQoZCkpOworICAgICAgICB9CisgICAgICAgIC8vIHByaW50IHRoZSBwb29sIGluZm8KKyAgICAgICAgTG9nLmkoVEFHLCBtVGVzdFBvb2wudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHJlbGVhc2UgYWxsCisgICAgICAgIGZvciAoU1FMaXRlRGF0YWJhc2UgZCA6IGRiTWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICBpbnQgbnVtID0gZGJNYXAuZ2V0KGQpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgICAgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzZmYzZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JUZXN0LmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVDdXJzb3JUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKKyAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJ0ZXN0Q3Vyc29yIjsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIEZpbGUgZGJEaXIgPSBnZXRDb250ZXh0KCkuZ2V0RGlyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZSA9IG5ldyBGaWxlKGRiRGlyLCAic3FsaXRlY3Vyc29yX3Rlc3QuZGIiKTsKKyAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7CisgICAgICAgIC8vIGNyZWF0ZSBhIHRlc3QgdGFibGUKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSAiICsgVEFCTEVfTkFNRSArICIgKGkgaW50LCBqIGludCk7Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeU9ialJlYXNzaWdubWVudCgpIHsKKyAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIC8vIGhhdmUgYSBmZXcgY29ubmVjdGlvbnMgaW4gdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gcG9vbAorICAgICAgICBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sIHBvb2wgPSBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sOworICAgICAgICBwb29sLnNldE1heFBvb2xTaXplKDUpOworICAgICAgICBTUUxpdGVDdXJzb3IgY3Vyc29yID0KKyAgICAgICAgICAgICAgICAoU1FMaXRlQ3Vyc29yKSBtRGF0YWJhc2UucmF3UXVlcnkoInNlbGVjdCAqIGZyb20gIiArIFRBQkxFX05BTUUsIG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKGN1cnNvcik7CisgICAgICAgIC8vIGl0IHNob3VsZCB1c2UgYSBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IGN1cnNvci5nZXREYXRhYmFzZSgpOworICAgICAgICBhc3NlcnRUcnVlKGRiLm1Db25uZWN0aW9uTnVtID4gMCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5lcXVhbHMoZGIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgZGIubVBhcmVudENvbm5PYmopOworICAgICAgICBhc3NlcnRUcnVlKHBvb2wuZ2V0Q29ubmVjdGlvbkxpc3QoKS5jb250YWlucyhkYikpOworICAgICAgICBhc3NlcnRUcnVlKGRiLmlzT3BlbigpKTsKKyAgICAgICAgLy8gZG8gYSByZXF1ZXJ5LiBjdXJzb3Igc2hvdWxkIGNvbnRpbnVlIHRvIHVzZSB0aGUgYWJvdmUgcG9vbGVkIGNvbm5lY3Rpb24KKyAgICAgICAgY3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGJBZ2FpbiA9IGN1cnNvci5nZXREYXRhYmFzZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGIsIGRiQWdhaW4pOworICAgICAgICAvLyBkaXNhYmxlIFdBTCBzbyB0aGF0IHRoZSBwb29sZWQgY29ubmVjdGlvbiBoZWxkIGJ5IHRoZSBhYm92ZSBjdXJzb3IgaXMgY2xvc2VkCisgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZGIuaXNPcGVuKCkpOworICAgICAgICBhc3NlcnROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICAvLyByZXF1ZXJ5IC0gd2hpY2ggc2hvdWxkIG1ha2UgdGhlIGN1cnNvciB1c2UgbURhdGFiYXNlIGNvbm5lY3Rpb24gc2luY2UgdGhlIHBvb2xlZAorICAgICAgICAvLyBjb25uZWN0aW9uIGlzIG5vIGxvbmdlciBhdmFpbGFibGUKKyAgICAgICAgY3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIxID0gY3Vyc29yLmdldERhdGFiYXNlKCk7CisgICAgICAgIGFzc2VydFRydWUoZGIxLm1Db25uZWN0aW9uTnVtID09IDApOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBkYjEpOworICAgICAgICBhc3NlcnROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICBhc3NlcnRUcnVlKGRiMS5pc09wZW4oKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5lcXVhbHMoZGIpKTsKKyAgICAgICAgLy8gZW5hYmxlIFdBTCBhbmQgcmVxdWVyeSAtIHRoaXMgdGltZSBhIHBvb2xlZCBjb25uZWN0aW9uIHNob3VsZCBiZSB1c2VkCisgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBjdXJzb3IucmVxdWVyeSgpOworICAgICAgICBkYiA9IGN1cnNvci5nZXREYXRhYmFzZSgpOworICAgICAgICBhc3NlcnRUcnVlKGRiLm1Db25uZWN0aW9uTnVtID4gMCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5lcXVhbHMoZGIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgZGIubVBhcmVudENvbm5PYmopOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wuZ2V0Q29ubmVjdGlvbkxpc3QoKS5jb250YWlucyhkYikpOworICAgICAgICBhc3NlcnRUcnVlKGRiLmlzT3BlbigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZlZGE3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZVRlc3QuamF2YQpAQCAtMCwwICsxLDk0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlsczsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVN0YXRlbWVudDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU3VwcHJlc3M7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitwdWJsaWMgY2xhc3MgU1FMaXRlRGF0YWJhc2VUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRhdGFiYXNlR2VuZXJhbFRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RBQkxFID0gInRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDVVJSRU5UX0RBVEFCQVNFX1ZFUlNJT04gPSA0MjsKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKKyAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5TRVJUID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVMRVRFID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfTkFNRSA9ICJkYXRhYmFzZV90ZXN0LmRiIjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIGRiU2V0VXAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkYlRlYXJkb3duKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRiVGVhcmRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRiU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBkYkRpciA9IGdldENvbnRleHQoKS5nZXREaXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworICAgICAgICBtRGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoZGJEaXIsIERCX05BTUUpOworICAgICAgICBpZiAobURhdGFiYXNlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSwgbnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobURhdGFiYXNlKTsKKyAgICAgICAgbURhdGFiYXNlLnNldFZlcnNpb24oQ1VSUkVOVF9EQVRBQkFTRV9WRVJTSU9OKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCkgeworICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIGFzc2VydE51bGwobURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbCk7CisgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sIHBvb2wgPSBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sOworICAgICAgICBhc3NlcnROb3ROdWxsKHBvb2wpOworICAgICAgICAvLyBtYWtlIHRoZSBzYW1lIGNhbGwgYWdhaW4gYW5kIG1ha2Ugc3VyZSB0aGUgcG9vbCBhbHJlYWR5IHNldHVwIGlzIG5vdCByZS1jcmVhdGVkCisgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnRFcXVhbHMocG9vbCwgbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbCk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKSB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJjcmVhdGUgdGFibGUgdGVzdCAoaSBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sKTsKKyAgICAgICAgLy8gZ2V0IGEgcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtRGF0YWJhc2UuZ2V0RGJDb25uZWN0aW9uKCJzZWxlY3QgKiBmcm9tIHRlc3QiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkYik7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5lcXVhbHMoZGIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYi5pc09wZW4oKSk7CisgICAgICAgIC8vIGRpc2FibGUgV0FMIC0gd2hpY2ggc2hvdWxkIGNsb3NlIGNvbm5lY3Rpb24gcG9vbCBhbmQgYWxsIHBvb2xlZCBjb25uZWN0aW9ucworICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIGFzc2VydE51bGwobURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbCk7CisgICAgICAgIGFzc2VydEZhbHNlKGRiLmlzT3BlbigpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1cnNvcnNXaXRoQ2xvc2VkRGJDb25uQWZ0ZXJEaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKSB7CisgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImNyZWF0ZSB0YWJsZSB0ZXN0IChpIGludCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygxKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gZ2V0IGEgY3Vyc29yIHdoaWNoIHNob3VsZCB1c2UgcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucmF3UXVlcnkoInNlbGVjdCAqIGZyb20gdGVzdCIsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wuZ2V0Q29ubmVjdGlvbkxpc3QoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYikpOworICAgICAgICAvLyBkaXNhYmxlIFdBTCAtIHdoaWNoIHNob3VsZCBjbG9zZSBjb25uZWN0aW9uIHBvb2wgYW5kIGFsbCBwb29sZWQgY29ubmVjdGlvbnMKKyAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICBhc3NlcnRGYWxzZShkYi5pc09wZW4oKSk7CisgICAgICAgIC8vIGN1cnNvciBkYXRhIHNob3VsZCBzdGlsbCBiZSBhY2Nlc3NpYmxlIGJlY2F1c2UgaXQgaXMgZmV0Y2hpbmcgZGF0YSBmcm9tIEN1cnNvcldpbmRvdworICAgICAgICBjLm1vdmVUb05leHQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0SW50KDApKTsKKyAgICAgICAgYy5yZXF1ZXJ5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBjLm1vdmVUb05leHQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0SW50KDApKTsKKyAgICAgICAgYy5jbG9zZSgpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Q29ubmVjdGlvblBvb2xTaXplKCkgeworICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgLy8gY2FuJ3Qgc2V0IHBvb2wgc2l6ZSB0byB6ZXJvCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0Q29ubmVjdGlvblBvb2xTaXplKDApOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJsZXNzIHRoYW4gdGhlIGN1cnJlbnQgbWF4IHZhbHVlIikpOworICAgICAgICB9CisgICAgICAgIC8vIHNldCBwb29sIHNpemUgdG8gYSB2YWxpZCB2YWx1ZQorICAgICAgICBtRGF0YWJhc2Uuc2V0Q29ubmVjdGlvblBvb2xTaXplKDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBjYW4ndCBzZXQgcG9vbCBzaXplIHRvIDwgdGhlIHZhbHVlIGFib3ZlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0Q29ubmVjdGlvblBvb2xTaXplKDEpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJsZXNzIHRoYW4gdGhlIGN1cnJlbnQgbWF4IHZhbHVlIikpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgc3RhcnRlZCBiZWZvcmUgYSBzdGFuZGFsb25lLXVwZGF0ZS9pbnNlcnQvZGVsZXRlIHN0YXRlbWVudAorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRYYWN0QmVmb3JlVXBkYXRlU3FsKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgcnVuVGVzdEZvclN0YXJ0WGFjdEJlZm9yZVVwZGF0ZVNxbChJTlNFUlQpOworICAgICAgICBydW5UZXN0Rm9yU3RhcnRYYWN0QmVmb3JlVXBkYXRlU3FsKFVQREFURSk7CisgICAgICAgIHJ1blRlc3RGb3JTdGFydFhhY3RCZWZvcmVVcGRhdGVTcWwoREVMRVRFKTsKKyAgICB9CisgICAgcHJpdmF0ZSB2b2lkIHJ1blRlc3RGb3JTdGFydFhhY3RCZWZvcmVVcGRhdGVTcWwoaW50IHN0bXRUeXBlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKworICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIC8vIG1ha2Ugc29tZSBjaGFuZ2VzIHRvIGRhdGEgaW4gVEVTVF9UQUJMRQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgdmFsdWVzLnB1dCgiaSIsIGkpOworICAgICAgICAgICAgdmFsdWVzLnB1dCgiaiIsICJpIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5pbnNlcnQoVEVTVF9UQUJMRSwgbnVsbCwgdmFsdWVzKTsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RtdFR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFVQREFURToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dCgiaiIsICJ1IiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLnVwZGF0ZShURVNUX1RBQkxFLCB2YWx1ZXMsICJpID0gIiArIGksIG51bGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERFTEVURToKKyAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLmRlbGV0ZShURVNUX1RBQkxFLCAiaSA9IDEiLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gZG8gYSBxdWVyeS4gZXZlbiB0aG91Z2ggcXVlcnkgdXNlcyBhIGRpZmZlcmVudCBkYXRhYmFzZSBjb25uZWN0aW9uLAorICAgICAgICAvLyBpdCBzaG91bGQgc3RpbGwgc2VlIHRoZSBhYm92ZSBjaGFuZ2VzIHRvIGRhdGEgYmVjYXVzZSB0aGUgYWJvdmUgc3RhbmRhbG9uZQorICAgICAgICAvLyBpbnNlcnQvdXBkYXRlL2RlbGV0ZXMgYXJlIGRvbmUgaW4gdHJhbnNhY3Rpb25zIGF1dG9tYXRpY2FsbHkuCisgICAgICAgIFN0cmluZyBzcWwgPSAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEU7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10ID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3FsKTsKKyAgICAgICAgZmluYWwgaW50IGV4cGVjdGVkVmFsdWUgPSAoc3RtdFR5cGUgPT0gREVMRVRFKSA/IDQgOiA1OworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgc3RtdC5zaW1wbGVRdWVyeUZvckxvbmcoKSk7CisgICAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucmF3UXVlcnkoc3FsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGMubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIGMuZ2V0TG9uZygwKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKworICAgICAgICAvLyBkbyA1IG1vcmUgY2hhbmdlcyBpbiBhIHRyYW5zYWN0aW9uIGJ1dCBkbyBhIHF1ZXJ5IGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGNvbW1pdAorICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICBmb3IgKGludCBpID0gMTA7IGkgPCAxNTsgaSsrKSB7CisgICAgICAgICAgICB2YWx1ZXMucHV0KCJpIiwgaSk7CisgICAgICAgICAgICB2YWx1ZXMucHV0KCJqIiwgImkiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgbURhdGFiYXNlLmluc2VydChURVNUX1RBQkxFLCBudWxsLCB2YWx1ZXMpOworICAgICAgICAgICAgc3dpdGNoIChzdG10VHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KCJqIiwgInUiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2UudXBkYXRlKFRFU1RfVEFCTEUsIHZhbHVlcywgImkgPSAiICsgaSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgREVMRVRFOgorICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZGVsZXRlKFRFU1RfVEFCTEUsICJpID0gMSIsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgIC8vIGRvIGEgcXVlcnkgYmVmb3JlIGNvbW1pdCAtIHNob3VsZCBzdGlsbCBoYXZlIDUgcm93cworICAgICAgICAvLyB0aGlzIHF1ZXJ5IHNob3VsZCBydW4gaW4gYSBkaWZmZXJlbnQgdGhyZWFkIHRvIGZvcmNlIGl0IHRvIHVzZSBhIGRpZmZlcmVudCBkYXRhYmFzZQorICAgICAgICAvLyBjb25uZWN0aW9uCisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHNxbCA9ICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRTsKKyAgICAgICAgICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RtdCA9IGdldERiKCkuY29tcGlsZVN0YXRlbWVudChzcWwpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBzdG10LnNpbXBsZVF1ZXJ5Rm9yTG9uZygpKTsKKyAgICAgICAgICAgICAgICBzdG10LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgQ3Vyc29yIGMgPSBnZXREYigpLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgICAgICAgICAgYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBjLmdldExvbmcoMCkpOworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICAvLyB3YWl0IHVudGlsIHRoZSBhYm92ZSB0aHJlYWQgaXMgZG9uZQorICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgLy8gY29tbWl0IGFuZCB0aGVuIHF1ZXJ5LiBzaG91bGQgc2VlIGNoYW5nZXMgZnJvbSB0aGUgdHJhbnNhY3Rpb24KKyAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgIHN0bXQgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudChzcWwpOworICAgICAgICBmaW5hbCBpbnQgZXhwZWN0ZWRWYWx1ZTIgPSAoc3RtdFR5cGUgPT0gREVMRVRFKSA/IDkgOiAxMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUyLCBzdG10LnNpbXBsZVF1ZXJ5Rm9yTG9uZygpKTsKKyAgICAgICAgc3RtdC5jbG9zZSgpOworICAgICAgICBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBjLm1vdmVUb0ZpcnN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlMiwgYy5nZXRMb25nKDApKTsKKyAgICAgICAgYy5jbG9zZSgpOworICAgIH0KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBTUUxpdGVEYXRhYmFzZSBnZXREYigpIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhYmFzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRvIGVuc3VyZSB0aGF0IHJlYWRlcnMgYXJlIGFibGUgdG8gcmVhZCB0aGUgZGF0YWJhc2UgZGF0YSAob2xkIHZlcnNpb25zKQorICAgICAqIEVWRU4gV0hFTiB0aGUgd3JpdGVyIGlzIGluIGEgdHJhbnNhY3Rpb24gb24gdGhlIHNhbWUgZGF0YWJhc2UuCisgICAgICo8cD4KKyAgICAgKiBUaGlzIHRlc3Qgc3RhcnRzIDEgV3JpdGVyIGFuZCAyIFJlYWRlcnMgYW5kIHNldHMgdXAgY29ubmVjdGlvbiBwb29sIGZvciByZWFkZXJzCisgICAgICogYnkgY2FsbGluZyB0aGUgbWV0aG9kIHtAbGluayBTUUxpdGVEYXRhYmFzZSNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfS4KKyAgICAgKiA8cD4KKyAgICAgKiBXcml0ZXIgZG9lcyB0aGUgZm9sbG93aW5nIGluIGEgdGlnaHQgbG9vcAorICAgICAqIDxwcmU+CisgICAgICogICAgIGJlZ2luIHRyYW5zYWN0aW9uCisgICAgICogICAgIGluc2VydCBpbnRvIHRhYmxlXzEKKyAgICAgKiAgICAgaW5zZXJ0IGludG8gdGFibGVfMgorICAgICAqICAgICBjb21taXQKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8cD4KKyAgICAgKiBBcyBsb25nIGEgdGhlIHdyaXRlciBpcyBhbGl2ZSwgUmVhZGVycyBkbyB0aGUgZm9sbG93aW5nIGluIGEgdGlnaHQgbG9vcCBhdCB0aGUgc2FtZSB0aW1lCisgICAgICogPHByZT4KKyAgICAgKiAgICAgUmVhZGVyX0sgZG9lcyAic2VsZWN0IGNvdW50KCopIGZyb20gdGFibGVfSyIgIHdoZXJlIEsgPSAxIG9yIDIKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdGVzdCBpcyBydW4gZm9yIFRJTUVfVE9fUlVOX1dBTF9URVNUX0ZPUiBzZWMuCisgICAgICogPHA+CisgICAgICogVGhlIHRlc3QgaXMgcmVwZWF0ZWQgZm9yIGRpZmZlcmVudCBjb25uZWN0aW9uLXBvb2wtc2l6ZXMgKDEuLjMpCisgICAgICogPHA+CisgICAgICogQW5kIGF0IHRoZSBlbmQgb2Ygb2YgZWFjaCB0ZXN0LCB0aGUgZm9sbG93aW5nIHN0YXRpc3RpY3MgYXJlIHByaW50ZWQKKyAgICAgKiA8dWw+CisgICAgICogICAgPGxpPmNvbm5lY3Rpb24tcG9vbC1zaXplPC9saT4KKyAgICAgKiAgICA8bGk+bnVtYmVyLW9mLXRyYW5zYWN0aW9ucyBieSB3cml0ZXI8L2xpPgorICAgICAqICAgIDxsaT5udW1iZXIgb2YgcmVhZHMgYnkgcmVhZGVyX0sgd2hpbGUgdGhlIHdyaXRlciBpcyBJTiBvciBOT1QtSU4geGFjdGlvbjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgQFN1cHByZXNzIC8vIHJ1biB0aGlzIHRlc3Qgb25seSBpZiB5b3UgbmVlZCB0byBjb2xsZWN0IHRoZSBudW1iZXJzIGZyb20gdGhpcyB0ZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmN1cnJlbmN5RWZmZWN0c09mQ29ublBvb2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcnVuIHRoZSB0ZXN0IHdpdGggc3FsaXRlIFdBTCBlbmFibGUKKyAgICAgICAgcnVuQ29ubmVjdGlvblBvb2xUZXN0KHRydWUpOworCisgICAgICAgIC8vIHJ1biB0aGUgc2FtZSB0ZXN0IFdJVEhPVVQgc3FsaXRlIFdBTCBlbmFibGVkCisgICAgICAgIHJ1bkNvbm5lY3Rpb25Qb29sVGVzdChmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1bkNvbm5lY3Rpb25Qb29sVGVzdChib29sZWFuIHVzZVdhbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBNID0gMzsKKyAgICAgICAgU3RyaW5nQnVpbGRlcltdIGJ1ZmYgPSBuZXcgU3RyaW5nQnVpbGRlcltNXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh1c2VXYWwpIHsKKyAgICAgICAgICAgICAgICAvLyBzZXQgdXAgY29ubmVjdGlvbiBwb29sCisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldENvbm5lY3Rpb25Qb29sU2l6ZShpICsgMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdDEgKGkgaW50LCBqIGludCk7Iik7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHQyIChpIGludCwgaiBpbnQpOyIpOworICAgICAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgaysrKSB7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIHQxIHZhbHVlcyg/LD8pOyIsIG5ldyBTdHJpbmdbXSB7aysiIiwgaysiIn0pOworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byB0MiB2YWx1ZXMoPyw/KTsiLCBuZXcgU3RyaW5nW10ge2srIiIsIGsrIiJ9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworCisgICAgICAgICAgICAvLyBzdGFydCBhIHdyaXRlcgorICAgICAgICAgICAgV3JpdGVyIHcgPSBuZXcgV3JpdGVyKG1EYXRhYmFzZSk7CisKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgYW4gYXJyYXkgb2YgY291bnRlcnMgdG8gYmUgcGFzc2VkIHRvIHRoZSByZWFkZXJzCisgICAgICAgICAgICBSZWFkZXIgcjEgPSBuZXcgUmVhZGVyKG1EYXRhYmFzZSwgInQxIiwgdywgMCk7CisgICAgICAgICAgICBSZWFkZXIgcjIgPSBuZXcgUmVhZGVyKG1EYXRhYmFzZSwgInQyIiwgdywgMSk7CisgICAgICAgICAgICB3LnN0YXJ0KCk7CisgICAgICAgICAgICByMS5zdGFydCgpOworICAgICAgICAgICAgcjIuc3RhcnQoKTsKKworICAgICAgICAgICAgLy8gd2FpdCBmb3IgYWxsIHRocmVhZHMgdG8gZGllCisgICAgICAgICAgICB3LmpvaW4oKTsKKyAgICAgICAgICAgIHIxLmpvaW4oKTsKKyAgICAgICAgICAgIHIyLmpvaW4oKTsKKworICAgICAgICAgICAgLy8gcHJpbnQgdGhlIHN0YXRzCisgICAgICAgICAgICBpbnRbXVtdIGNvdW50cyA9IGdldENvdW50cygpOworICAgICAgICAgICAgYnVmZltpXSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZCgiY29ubnBvb2wtc2l6ZSA9ICIpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoaSArIDEpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoIiwgbnVtIHhhY3RzIGJ5IHdyaXRlciA9ICIpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoZ2V0TnVtWGFjdHMoKSk7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZCgiLCBudW0tcmVhZHMtaW4teGFjdC9OT1QtaW4teGFjdCBieSByZWFkZXIxID0gIik7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZChjb3VudHNbMF1bMV0gKyAiLyIgKyBjb3VudHNbMF1bMF0pOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoIiwgYnkgcmVhZGVyMiA9ICIpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoY291bnRzWzFdWzFdICsgIi8iICsgY291bnRzWzFdWzBdKTsKKworICAgICAgICAgICAgTG9nLmkoVEFHLCAiZG9uZSB0ZXN0aW5nIGZvciBjb25uLXBvb2wtc2l6ZSBvZiAiICsgKGkrMSkpOworCisgICAgICAgICAgICBkYlRlYXJkb3duKCk7CisgICAgICAgICAgICBkYlNldFVwKCk7CisgICAgICAgIH0KKyAgICAgICAgTG9nLmkoVEFHLCAiZHVyYXRpb24gb2YgdGVzdCAiICsgVElNRV9UT19SVU5fV0FMX1RFU1RfRk9SICsgIiBzZWMiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNOyBpKyspIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgYnVmZltpXS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpblhhY3QgPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCBudW1YYWN0czsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRV9UT19SVU5fV0FMX1RFU1RfRk9SID0gMTU7IC8vIG51bSBzZWMgdGhpcyB0ZXN0IHNob3VsZCBydW4KKyAgICBwcml2YXRlIGludFtdW10gY291bnRzID0gbmV3IGludFsyXVsyXTsKKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gaW5YYWN0KCkgeworICAgICAgICByZXR1cm4gaW5YYWN0OworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0SW5YYWN0RmxhZyhib29sZWFuIGZsYWcpIHsKKyAgICAgICAgaW5YYWN0ID0gZmxhZzsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldENvdW50cyhpbnQgcmVhZGVyTnVtLCBpbnRbXSBudW1SZWFkcykgeworICAgICAgICBjb3VudHNbcmVhZGVyTnVtXVswXSA9IG51bVJlYWRzWzBdOworICAgICAgICBjb3VudHNbcmVhZGVyTnVtXVsxXSA9IG51bVJlYWRzWzFdOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGludFtdW10gZ2V0Q291bnRzKCkgeworICAgICAgICByZXR1cm4gY291bnRzOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0TnVtWGFjdHMoaW50IG51bSkgeworICAgICAgICBudW1YYWN0cyA9IG51bTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBpbnQgZ2V0TnVtWGFjdHMoKSB7CisgICAgICAgIHJldHVybiBudW1YYWN0czsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFdyaXRlciBleHRlbmRzIFRocmVhZCB7CisgICAgICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgZGIgPSBudWxsOworICAgICAgICBwdWJsaWMgV3JpdGVyKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgICAgICB0aGlzLmRiID0gZGI7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIC8vIGluIGEgbG9vcCwgZm9yIE4gc2VjLCBkbyB0aGUgZm9sbG93aW5nCisgICAgICAgICAgICAvLyAgICBCRUdJTiB0cmFuc2FjdGlvbgorICAgICAgICAgICAgLy8gICAgaW5zZXJ0IGludG8gdGFibGUgdDEsIHQyCisgICAgICAgICAgICAvLyAgICBDb21taXQKKyAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBpbnQgazsKKyAgICAgICAgICAgIGZvciAoayA9IDA7KFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gbm93KSAvIDEwMDAgPCBUSU1FX1RPX1JVTl9XQUxfVEVTVF9GT1I7IGsrKykgeworICAgICAgICAgICAgICAgIGRiLmJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKTsKKyAgICAgICAgICAgICAgICBzZXRJblhhY3RGbGFnKHRydWUpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBkYi5leGVjU1FMKCJpbnNlcnQgaW50byB0MSB2YWx1ZXMoPyw/KTsiLCBuZXcgU3RyaW5nW10ge2krIiIsIGkrIiJ9KTsKKyAgICAgICAgICAgICAgICAgICAgZGIuZXhlY1NRTCgiaW5zZXJ0IGludG8gdDIgdmFsdWVzKD8sPyk7IiwgbmV3IFN0cmluZ1tdIHtpKyIiLCBpKyIifSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRiLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICAgICAgICAgIHNldEluWGFjdEZsYWcoZmFsc2UpOworICAgICAgICAgICAgICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXROdW1YYWN0cyhrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUmVhZGVyIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBkYiA9IG51bGw7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHRhYmxlID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBXcml0ZXIgdyA9IG51bGw7CisgICAgICAgIHByaXZhdGUgaW50IHJlYWRlck51bTsKKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBudW1SZWFkcyA9IG5ldyBpbnRbMl07CisgICAgICAgIHB1YmxpYyBSZWFkZXIoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyB0YWJsZSwgV3JpdGVyIHcsIGludCByZWFkZXJOdW0pIHsKKyAgICAgICAgICAgIHRoaXMuZGIgPSBkYjsKKyAgICAgICAgICAgIHRoaXMudGFibGUgPSB0YWJsZTsKKyAgICAgICAgICAgIHRoaXMudyA9IHc7CisgICAgICAgICAgICB0aGlzLnJlYWRlck51bSA9IHJlYWRlck51bTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgLy8gd2hpbGUgdGhlIHdyaXRlIGlzIGFsaXZlLCBpbiBhIGxvb3AgZG8gdGhlIHF1ZXJ5IG9uIGEgdGFibGUKKyAgICAgICAgICAgIHdoaWxlICh3LmlzQWxpdmUoKSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShkYiwgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyB0aGlzLnRhYmxlLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNvdW50IG9mIHJlYWRzCisgICAgICAgICAgICAgICAgICAgIG51bVJlYWRzW2luWGFjdCgpID8gMSA6IDBdICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0Q291bnRzKHJlYWRlck51bSwgbnVtUmVhZHMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBleHRlbmRzIFNRTGl0ZVByb2dyYW0geworICAgICAgICBwcml2YXRlIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsKSB7CisgICAgICAgICAgICBzdXBlcihkYiwgc3FsKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIGNyZWF0ZShTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCkgeworICAgICAgICAgICAgZGIubG9jaygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nKGRiLCBzcWwpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBkYi51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0THJ1Q2FjaGluZ09mU3FsaXRlQ29tcGlsZWRTcWxPYmpzKCkgeworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgLy8gc2V0IGNhY2hlIHNpemUKKyAgICAgICAgaW50IE4gPSBTUUxpdGVEYXRhYmFzZS5NQVhfU1FMX0NBQ0hFX1NJWkU7CisgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisKKyAgICAgICAgLy8gZG8gTisxIHF1ZXJpZXMgLSBhbmQgd2hlbiB0aGUgMHRoIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSBMUlUgY2FjaGUgZHVlIHRvIHRoZQorICAgICAgICAvLyBpbnNlcnRpb24gb2YgKE4rMSl0aCBlbnRyeSwgbWFrZSBzdXJlIDB0aCBlbnRyeSBpcyBjbG9zZWQKKyAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IHN0bXRPYmpzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBzcWxTdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGludCBzdG10MCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTisxOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKCIgKyBpICsgIiw/KTsiOworICAgICAgICAgICAgc3FsU3RyaW5ncy5hZGQocyk7CisgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBjID0KKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKG1EYXRhYmFzZSwgcyk7CisgICAgICAgICAgICBpbnQgbiA9IGMuZ2V0U3FsU3RhdGVtZW50SWQoKTsKKyAgICAgICAgICAgIHN0bXRPYmpzLmFkZChpLCBuKTsKKyAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBzYXZlIHRoZSBzdGF0ZW1lbnRJZCBvZiB0aGlzIG9iai4gd2Ugd2FudCB0byBtYWtlIHN1cmUgaXQgaXMgdGhyb3duIG91dCBvZgorICAgICAgICAgICAgICAgIC8vIHRoZSBjYWNoZSBhdCB0aGUgZW5kIG9mIHRoaXMgdGVzdC4KKyAgICAgICAgICAgICAgICBzdG10MCA9IG47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gaXMgMCd0aCBlbnRyeSBvdXQgb2YgdGhlIGNhY2hlPyBpdCBzaG91bGQgYmUgaW4gdGhlIGxpc3Qgb2Ygc3RhdGVtZW50SWRzCisgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByZS1jb21waWxlZCBzcWwgc3RhdGVtZW50cyB0byBiZSBmaW5hbGl6ZWQuCisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKS5jb250YWlucyhzdG10MCkpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IE4rMTsgaSsrKSB7CisgICAgICAgICAgICBTUUxpdGVDb21waWxlZFNxbCBjb21wU3FsID0gbURhdGFiYXNlLmdldENvbXBpbGVkU3RhdGVtZW50Rm9yU3FsKHNxbFN0cmluZ3MuZ2V0KGkpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoY29tcFNxbCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN0bXRPYmpzLmNvbnRhaW5zKGNvbXBTcWwublN0YXRlbWVudCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGJDbG9zZVJlbGVhc2luZ0FsbENhY2hlZFNxbCgpIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgdGV4dDEgVEVYVCwgdGV4dDIgVEVYVCwgIiArCisgICAgICAgICAgICAgICAgIm51bTEgSU5URUdFUiwgbnVtMiBJTlRFR0VSLCBpbWFnZSBCTE9CKTsiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0YXRlbWVudCA9ICJERUxFVEUgRlJPTSB0ZXN0IFdIRVJFIF9pZD0/OyI7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnREb05vdENsb3NlID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3RhdGVtZW50KTsKKyAgICAgICAgc3RhdGVtZW50RG9Ob3RDbG9zZS5iaW5kTG9uZygxLCAxKTsKKyAgICAgICAgLyogZG8gbm90IGNsb3NlIHN0YXRlbWVudERvTm90Q2xvc2Ugb2JqZWN0LgorICAgICAgICAgKiBUaGF0IHNob3VsZCBsZWF2ZSBpdCBpbiBTUUxpdGVEYXRhYmFzZS5tUHJvZ3JhbXMuCisgICAgICAgICAqIG1EYXRhYmFzZS5jbG9zZSgpIGluIHRlYXJEb3duKCkgc2hvdWxkIHJlbGVhc2UgaXQuCisgICAgICAgICAqLworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKSB7CisgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkRST1AgVEFCTEUgSUYgRVhJU1RTICIgKyBURVNUX1RBQkxFKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSAiICsgVEVTVF9UQUJMRSArICIgKGkgaW50LCBqIGludCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBtRGF0YWJhc2UubG9jaygpOworICAgICAgICAvLyBmbHVzaCB0aGUgYWJvdmUgc3RhdGVtZW50IGZyb20gY2FjaGUgYW5kIGNsb3NlIGFsbCB0aGUgcGVuZGluZyBzdGF0ZW1lbnRzIHRvIGJlIHJlbGVhc2VkCisgICAgICAgIG1EYXRhYmFzZS5kZWFsbG9jQ2FjaGVkU3FsU3RhdGVtZW50cygpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOworICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpLnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCB0byBtYWtlIHN1cmUgdGhlIHN0YXRlbWVudCBmaW5hbGl6YXRpb25zIGFyZSBub3QgZG9uZSByaWdodCBhd2F5IGJ1dAorICAgICAqIHBpZ2d5LWJhY2tlZCBvbnRvIHRoZSBuZXh0IHNxbCBzdGF0ZW1lbnQgZXhlY3V0aW9uIG9uIHRoZSBzYW1lIGRhdGFiYXNlLgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVtZW50Q2xvc2UoKSB7CisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICAvLyBmaWxsIHVwIHN0YXRlbWVudCBjYWNoZSBpbiBtRGF0YWJhc2UKKyAgICAgICAgaW50IE4gPSBTUUxpdGVEYXRhYmFzZS5NQVhfU1FMX0NBQ0hFX1NJWkU7CisgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10OworICAgICAgICBpbnQgc3RtdDBJZCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSArKykgeworICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgYyA9CisgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKCIgKyBpICsgIiwgPyk7Iik7CisgICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIDB0aCBlbnRyeQorICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIHN0bXQwSWQgPSBjLmdldFNxbFN0YXRlbWVudElkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgb25lIG1vcmUgdG8gdGhlIGNhY2hlIC0gYW5kIHRoZSBhYm92ZSAnc3RtdDBJZCcgc2hvdWxkIGZhbGwgb3V0IG9mIGNhY2hlCisgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIHN0bXQxID0KKyAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKDEwMCwgPyk7Iik7CisgICAgICAgIHN0bXQxLmNsb3NlKCk7CisKKyAgICAgICAgLy8gdGhlIGFib3ZlIGNsb3NlKCkgc2hvdWxkIGhhdmUgcXVldWVkVXAgdGhlIHN0YXRlbWVudCBmb3IgZmluYWxpemF0aW9uCisgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBzdGF0ZW1lbnRJZHMgPSBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudElkcy5jb250YWlucyhzdG10MElkKSk7CisKKyAgICAgICAgLy8gZXhlY3V0ZSBzb21ldGhpbmcgdG8gc2VlIGlmIHRoaXMgc3RhdGVtZW50IGdldHMgZmluYWxpemVkCisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJkZWxldGUgZnJvbSB0ZXN0IHdoZXJlIGkgPSAxMDsiKTsKKyAgICAgICAgc3RhdGVtZW50SWRzID0gbURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc3RhdGVtZW50SWRzLmNvbnRhaW5zKHN0bXQwSWQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzYW1lIGFzIGFib3ZlIC0gZXhjZXB0IHRoYXQgdGhlIHN0YXRlbWVudCB0byBiZSBmaW5hbGl6ZWQgaXMgZnJvbSBUaHJlYWQgIyAxLgorICAgICAqIGFuZCBpdCBpcyBldmVudHVhbGx5IGZpbmFsaXplZCBpbiBUaHJlYWQgIyAyIHdoZW4gaXQgZXhlY3V0ZXMgYSBTUUwgc3RhdGVtZW50LgorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXRlbWVudENsb3NlRGlmZlRocmVhZCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICBmaW5hbCBpbnQgTiA9IFNRTGl0ZURhdGFiYXNlLk1BWF9TUUxfQ0FDSEVfU0laRTsKKyAgICAgICAgbURhdGFiYXNlLnNldE1heFNxbENhY2hlU2l6ZShOKTsKKyAgICAgICAgLy8gZmlsbCB1cCBzdGF0ZW1lbnQgY2FjaGUgaW4gbURhdGFiYXNlIGluIGEgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MSA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10OworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIGMgPQorICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKGdldERiKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygiICsgaSArICIsID8pOyIpOworICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIDB0aCBlbnRyeQorICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdG10MElkID0gYy5nZXRTcWxTdGF0ZW1lbnRJZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZmluaXNoCisgICAgICAgIHQxLmpvaW4oKTsKKyAgICAgICAgLy8gbURhdGFiYXNlIHNob3VsZG4ndCBoYXZlIGFueSBzdGF0ZW1lbnRzIHRvIGJlIHJlbGVhc2VkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpLnNpemUoKSk7CisKKyAgICAgICAgLy8gYWRkIG9uZSBtb3JlIHRvIHRoZSBjYWNoZSAtIGFuZCB0aGUgYWJvdmUgJ3N0bXQwSWQnIHNob3VsZCBmYWxsIG91dCBvZiBjYWNoZQorICAgICAgICAvLyBqdXN0IGZvciB0aGUgaGVjayBvZiBpdCwgZG8gaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgc3RtdDEgPQorICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUoZ2V0RGIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMTAwLCA/KTsiKTsKKyAgICAgICAgICAgICAgICBzdG10MS5iaW5kTG9uZygxLCAxKTsKKyAgICAgICAgICAgICAgICBzdG10MS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICB0Mi5qb2luKCk7CisKKyAgICAgICAgLy8gY2xvc2UoKSBpbiB0aGUgYWJvdmUgdGhyZWFkIHNob3VsZCBoYXZlIHF1ZXVlZFVwIHRoZSBzdG10MElkIGZvciBmaW5hbGl6YXRpb24KKyAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IHN0YXRlbWVudElkcyA9IGdldERiKCkuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudElkcy5jb250YWlucyhnZXRTdG10MElkKCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN0YXRlbWVudElkcy5zaXplKCkpOworCisgICAgICAgIC8vIGV4ZWN1dGUgc29tZXRoaW5nIHRvIHNlZSBpZiB0aGlzIHN0YXRlbWVudCBnZXRzIGZpbmFsaXplZAorICAgICAgICAvLyBhZ2FpbiBkbyBpdCBpbiBhIHNlcGFyYXRlIHRocmVhZAorICAgICAgICBUaHJlYWQgdDMgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBnZXREYigpLmV4ZWNTUUwoImRlbGV0ZSBmcm9tIHRlc3Qgd2hlcmUgaSA9IDEwOyIpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0My5zdGFydCgpOworICAgICAgICB0My5qb2luKCk7CisKKyAgICAgICAgLy8gaXMgdGhlIHN0YXRlbWVudCBmaW5hbGl6ZWQ/CisgICAgICAgIHN0YXRlbWVudElkcyA9IGdldERiKCkuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRGYWxzZShzdGF0ZW1lbnRJZHMuY29udGFpbnMoZ2V0U3RtdDBJZCgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgc3RtdDBJZCA9IDA7CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgaW50IGdldFN0bXQwSWQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN0bXQwSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2FtZSBhcyBhYm92ZSAtIGV4Y2VwdCB0aGF0IHRoZSBxdWV1ZSBvZiBzdGF0ZW1lbnRzIHRvIGJlIGZpbmFsaXplZCBhcmUgZmluYWxpemVkCisgICAgICogYnkgZGF0YWJhc2UgY2xvc2UoKSBvcGVyYXRpb24uCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZW1lbnRDbG9zZUJ5RGJDbG9zZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICAvLyBmaWxsIHVwIHN0YXRlbWVudCBjYWNoZSBpbiBtRGF0YWJhc2UgaW4gYSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgaW50IE4gPSBTUUxpdGVEYXRhYmFzZS5NQVhfU1FMX0NBQ0hFX1NJWkU7CisgICAgICAgICAgICAgICAgZ2V0RGIoKS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisgICAgICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpICsrKSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIGMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShnZXREYigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKCIgKyBpICsgIiwgPyk7Iik7CisgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgMHRoIGVudHJ5CisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0bXQwSWQgPSBjLmdldFNxbFN0YXRlbWVudElkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIHRocmVhZCB0byBmaW5pc2gKKyAgICAgICAgdDEuam9pbigpOworCisgICAgICAgIC8vIGFkZCBvbmUgbW9yZSB0byB0aGUgY2FjaGUgLSBhbmQgdGhlIGFib3ZlICdzdG10MElkJyBzaG91bGQgZmFsbCBvdXQgb2YgY2FjaGUKKyAgICAgICAgLy8ganVzdCBmb3IgdGhlIGhlY2sgb2YgaXQsIGRvIGl0IGluIGEgc2VwYXJhdGUgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIHN0bXQxID0KKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShnZXREYigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMTAwLCA/KTsiKTsKKyAgICAgICAgICAgICAgICBzdG10MS5iaW5kTG9uZygxLCAxKTsKKyAgICAgICAgICAgICAgICBzdG10MS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICB0Mi5qb2luKCk7CisKKyAgICAgICAgLy8gY2xvc2UoKSBpbiB0aGUgYWJvdmUgdGhyZWFkIHNob3VsZCBoYXZlIHF1ZXVlZFVwIHRoZSBzdGF0ZW1lbnQgZm9yIGZpbmFsaXphdGlvbgorICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gc3RhdGVtZW50SWRzID0gZ2V0RGIoKS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCk7CisgICAgICAgIGFzc2VydFRydWUoZ2V0U3RtdDBJZCgpID4gMCk7CisgICAgICAgIGFzc2VydFRydWUoc3RhdGVtZW50SWRzLmNvbnRhaW5zKHN0bXQwSWQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN0YXRlbWVudElkcy5zaXplKCkpOworCisgICAgICAgIC8vIGNsb3NlIHRoZSBkYXRhYmFzZS4gZXZlcnl0aGluZyBmcm9tIG1DbG9zZWRTdGF0ZW1lbnRJZHMgaW4gbURhdGFiYXNlCisgICAgICAgIC8vIHNob3VsZCBiZSBmaW5hbGl6ZWQgYW5kIGNsZWFyZWQgZnJvbSB0aGUgbGlzdAorICAgICAgICAvLyBhZ2FpbiBkbyBpdCBpbiBhIHNlcGFyYXRlIHRocmVhZAorICAgICAgICBUaHJlYWQgdDMgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBnZXREYigpLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQzLnN0YXJ0KCk7CisgICAgICAgIHQzLmpvaW4oKTsKKworICAgICAgICAvLyBjaGVjayBtQ2xvc2VkU3RhdGVtZW50SWRzIGluIG1EYXRhYmFzZS4gaXQgc2hvdWxkIGJlIGVtcHR5CisgICAgICAgIHN0YXRlbWVudElkcyA9IGdldERiKCkuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RhdGVtZW50SWRzLnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IHRlc3RzIHVzYWdlIGV4ZWNTUUwoKSB0byBiZWdpbiB0cmFuc2FjdGlvbiB3b3JrcyBpbiB0aGUgZm9sbG93aW5nIHdheQorICAgICAqICAgVGhyZWFkICMxIGRvZXMKKyAgICAgKiAgICAgICBleGVjU1FMKCJiZWdpbiB0cmFuc2FjdGlvbiIpOworICAgICAqICAgICAgIGluc2VydCgpCisgICAgICogICBUaHJlYWQgIyAyCisgICAgICogICAgICAgcXVlcnkoKQorICAgICAqICAgVGhyZWFkIzEgKCJlbmQgdHJhbnNhY3Rpb24iKQorICAgICAqIFRocmVhZCAjIDIgcXVlcnkgd2lsbCBleGVjdXRlIC0gYmVjYXVzZSBqYXZhIGxheWVyIHdpbGwgbm90IGhhdmUgbG9ja2VkIHRoZSBTUUxpdGVEYXRhYmFzZQorICAgICAqIG9iamVjdCBhbmQgc3FsaXRlIHdpbGwgY29uc2lkZXIgdGhpcyBxdWVyeSB0byBiZSBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIGJ1dCBpZiB0aHJlYWQgIyAxIHVzZXMgYmVnaW5UcmFuc2FjdGlvbigpIGluc3RlYWQgb2YgZXhlY1NRTCgpIHRvIHN0YXJ0IHRyYW5zYWN0aW9uLAorICAgICAqIHRoZW4gVGhyZWFkICMgMidzIHF1ZXJ5IHdpbGwgaGF2ZSBiZWVuIGJsb2NrZWQgYnkgamF2YSBsYXllcgorICAgICAqIHVudGlsIFRocmVhZCMxIGVuZHMgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjU3FsVG9TdGFydEFuZEVuZFRyYW5zYWN0aW9uKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgcnVuRXhlY1NxbFRvU3RhcnRBbmRFbmRUcmFuc2FjdGlvbigiRU5EIik7CisgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUsIGluc3RlYWQgbm93IGRvICJDT01NSVQiIG9yICJST0xMQkFDSyIgaW5zdGVhZCBvZiAiRU5EIiB0cmFuc2FjdGlvbgorICAgICAgICBydW5FeGVjU3FsVG9TdGFydEFuZEVuZFRyYW5zYWN0aW9uKCJDT01NSVQiKTsKKyAgICAgICAgcnVuRXhlY1NxbFRvU3RhcnRBbmRFbmRUcmFuc2FjdGlvbigiUk9MTEJBQ0siKTsKKyAgICB9CisgICAgcHJpdmF0ZSB2b2lkIHJ1bkV4ZWNTcWxUb1N0YXJ0QW5kRW5kVHJhbnNhY3Rpb24oU3RyaW5nIHN0cikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIC8vIGRpc2FibGUgV0FMIGp1c3Qgc28gcXVlcmllcyBhbmQgdXBkYXRlcyB1c2UgdGhlIHNhbWUgZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpOworICAgICAgICAvLyBldmVuIHRob3VnaCBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpIGlzIG5vdCBjYWxsZWQgdG8gc3RhcnQgdHJhbnNhY3Rpb24sCisgICAgICAgIC8vIG1EYXRhYmFzZSBjb25uZWN0aW9uIHNob3VsZCBub3cgYmUgaW4gdHJhbnNhY3Rpb24gYXMgYSByZXN1bHQgb2YKKyAgICAgICAgLy8gbURhdGFiYXNlLmV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIikKKyAgICAgICAgLy8gYnV0IG1EYXRhYmFzZS5tTG9jayBzaG91bGQgbm90IGJlIGhlbGQgYnkgYW55IHRocmVhZAorICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5pblRyYW5zYWN0aW9uKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzRGJMb2NrZWRCeU90aGVyVGhyZWFkcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UuYW1JSW5UcmFuc2FjdGlvbigpKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAsIDk5OSk7Iik7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5T3RoZXJUaHJlYWRzKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5hbUlJblRyYW5zYWN0aW9uKCkpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmFtSUluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDk5OSwgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkoZ2V0RGIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgaiBmcm9tICIgKyBURVNUX1RBQkxFICsgIiBXSEVSRSBpID0gMTAiLCBudWxsKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXREYigpLmluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZ2V0RGIoKS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGdldERiKCkuaXNEYkxvY2tlZEJ5T3RoZXJUaHJlYWRzKCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmFtSUluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgdC5qb2luKCk7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmFtSUluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5T3RoZXJUaHJlYWRzKCkpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTChzdHIpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuYW1JSW5UcmFuc2FjdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5T3RoZXJUaHJlYWRzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhlIGZvbGxvd2luZworICAgICAqIGh0dHA6Ly9iL2lzc3VlP2lkPTI4NzEwMzcKKyAgICAgKiAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gZGIucXVlcnkoLi4uKTsKKyAgICAgKiAgICAgICAgICAvLyB3aXRoIFdBTCBlbmFibGVkLCB0aGUgYWJvdmUgdXNlcyBhIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICogICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpCisgICAgICogICAgICAgICAgdHJ5IHsKKyAgICAgKiAgICAgICAgICAgIGRiLmluc2VydCguLi4uLi4pOworICAgICAqICAgICAgICAgICAgY3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgKiAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBjdXJzb3IgdXNlcyBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbiwgdGhlIGFib3ZlIHJlcXVlcnkKKyAgICAgKiAgICAgICAgICAgIC8vIHdpbGwgbm90IHJldHVybiB0aGUgcmVzdWx0cyB0aGF0IHdlcmUgaW5zZXJ0ZWQgYWJvdmUgc2luY2UgdGhlIGluc2VydCBpcworICAgICAqICAgICAgICAgICAgLy8gZG9uZSB1c2luZyBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gQU5EIHRoZSB0cmFuc2FjdGlvbiBpcyBub3QgY29tbWl0dGVkIHlldC4KKyAgICAgKiAgICAgICAgICAgIC8vIGZpeCBpcyB0byBtYWtlIHRoZSBhYm92ZSBjdXJzb3IgdXNlIHRoZSBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gLSBhbmQgTk9UCisgICAgICogICAgICAgICAgICAvLyB0aGUgcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgKiAgICAgICAgICAgIGRiLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpCisgICAgICogICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgKiAgICAgICAgICAgIGRiLmVuZFRyYW5zYWN0aW9uKCkKKyAgICAgKiAgICAgICAgICB9CisgICAgICoKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2FjdGlvbkFuZFdhbEludGVycGxheTEoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAsIDk5OSk7Iik7CisgICAgICAgIFN0cmluZyBzcWwgPSAic2VsZWN0ICogZnJvbSAiICsgVEVTVF9UQUJMRTsKKyAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucmF3UXVlcnkoc3FsLCBudWxsKTsKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgMSByb3cgaW4gdGhlIHRhYmxlCisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAwLCA5OTA5KTsiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCkpOworICAgICAgICAgICAgLy8gcmVxdWVyeSBvbiB0aGUgcHJldmlvdXNseSBvcGVuZWQgY3Vyc29yCisgICAgICAgICAgICAvLyBjdXJzb3Igc2hvdWxkIG5vdyB1c2UgdGhlIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgc2VlIDIgcm93cworICAgICAgICAgICAgYy5yZXF1ZXJ5KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICB9CisgICAgICAgIGMuY2xvc2UoKTsKKworICAgICAgICAvLyBkbyB0aGUgc2FtZSB0ZXN0IGJ1dCBub3cgZG8gdGhlIHJlcXVlcnkgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMCwgOTk5KTsiKTsKKyAgICAgICAgZmluYWwgQ3Vyc29yIGMxID0gbURhdGFiYXNlLnJhd1F1ZXJ5KCJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCk7CisgICAgICAgIC8vIHNob3VsZCBoYXZlIDEgcm93IGluIHRoZSB0YWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYzEuZ2V0Q291bnQoKSk7CisgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMDAsIDk5MDkpOyIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFLCBudWxsKSk7CisgICAgICAgICAgICAvLyBxdWVyeSBpbiBhIGRpZmZlcmVudCB0aHJlYWQuIHRoYXQgY2F1c2VzIHRoZSBjdXJzb3IgdG8gdXNlIGEgcG9vbGVkIGNvbm5lY3Rpb24KKyAgICAgICAgICAgIC8vIGFuZCBzaW5jZSB0aGlzIHRocmVhZCBoYXNuJ3QgY29tbWl0dGVkIGl0cyBjaGFuZ2VzLCB0aGUgY3Vyc29yIHNob3VsZCBzdGlsbCBzZWUgb25seQorICAgICAgICAgICAgLy8gMSByb3cKKyAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBjMS5yZXF1ZXJ5KCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBjMS5nZXRDb3VudCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgICAgICAvLyBzaG91bGQgYmUgMiByb3dzIG5vdyAtIGluY2x1ZGluZyB0aGUgdGhlIHJvdyBpbnNlcnRlZCBhYm92ZQorICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgYzEuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QgaXMgc2FtZSBhcyB7QGxpbmsgI3Rlc3RUcmFuc2FjdGlvbkFuZFdhbEludGVycGxheTEoKX0gZXhjZXB0IHRoZSBmb2xsb3dpbmc6CisgICAgICogaW5zdGVhZCBvZiBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpLCB1c2UgZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKQorICAgICAqIGFuZCBpbnN0ZWFkIG9mIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpLCB1c2UgZXhlY1NRTCgiRU5EIik7CisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2FjdGlvbkFuZFdhbEludGVycGxheTIoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAsIDk5OSk7Iik7CisgICAgICAgIFN0cmluZyBzcWwgPSAic2VsZWN0ICogZnJvbSAiICsgVEVTVF9UQUJMRTsKKyAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucmF3UXVlcnkoc3FsLCBudWxsKTsKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgMSByb3cgaW4gdGhlIHRhYmxlCisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwMCwgOTkwOSk7Iik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEUsIG51bGwpKTsKKyAgICAgICAgICAgIC8vIHJlcXVlcnkgb24gdGhlIHByZXZpb3VzbHkgb3BlbmVkIGN1cnNvcgorICAgICAgICAgICAgLy8gY3Vyc29yIHNob3VsZCBub3cgdXNlIHRoZSBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIHNlZSAyIHJvd3MKKyAgICAgICAgICAgIGMucmVxdWVyeSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY29tbWl0OyIpOworICAgICAgICB9CisgICAgICAgIGMuY2xvc2UoKTsKKworICAgICAgICAvLyBkbyB0aGUgc2FtZSB0ZXN0IGJ1dCBub3cgZG8gdGhlIHJlcXVlcnkgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMCwgOTk5KTsiKTsKKyAgICAgICAgZmluYWwgQ3Vyc29yIGMxID0gbURhdGFiYXNlLnJhd1F1ZXJ5KCJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCk7CisgICAgICAgIC8vIHNob3VsZCBoYXZlIDEgcm93IGluIHRoZSB0YWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYzEuZ2V0Q291bnQoKSk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAwLCA5OTA5KTsiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCkpOworICAgICAgICAgICAgLy8gcXVlcnkgaW4gYSBkaWZmZXJlbnQgdGhyZWFkLiBidXQgc2luY2UgdGhlIHRyYW5zYWN0aW9uIGlzIHN0YXJ0ZWQgdXNpbmcKKyAgICAgICAgICAgIC8vIGV4ZWNTUSgpIGluc3RlYWQgb2YgYmVnaW5UcmFuc2FjdGlvbigpLCBjdXJzb3IncyBxdWVyeSBpcyBjb25zaWRlcmVkIHBhcnQgb2YKKyAgICAgICAgICAgIC8vIHRoZSBzYW1lIHRyYW5zYWN0aW9uIC0gYW5kIGhlbmNlIGl0IHNob3VsZCBzZWUgdGhlIGFib3ZlIGluc2VydGVkIHJvdworICAgICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGMxLnJlcXVlcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMxLmdldENvdW50KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgICAgIC8vIHNob3VsZCBiZSAyIHJvd3Mgbm93IC0gaW5jbHVkaW5nIHRoZSB0aGUgcm93IGluc2VydGVkIGFib3ZlCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY29tbWl0Iik7CisgICAgICAgIH0KKyAgICAgICAgYzEuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QgaXMgc2FtZSBhcyB7QGxpbmsgI3Rlc3RUcmFuc2FjdGlvbkFuZFdhbEludGVycGxheTIoKX0gZXhjZXB0IHRoZSBmb2xsb3dpbmc6CisgICAgICogaW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBkYXRhLCBkbyByb2xsYmFjayBhbmQgbWFrZSBzdXJlIHRoZSBkYXRhIHNlZW4gYnkgdGhlIHF1ZXJ5CisgICAgICogd2l0aGluIHRoZSB0cmFuc2FjdGlvbiBpcyBub3cgZ29uZS4KKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zYWN0aW9uQW5kV2FsSW50ZXJwbGF5MygpIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwLCA5OTkpOyIpOworICAgICAgICBTdHJpbmcgc3FsID0gInNlbGVjdCAqIGZyb20gIiArIFRFU1RfVEFCTEU7CisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgIC8vIHNob3VsZCBoYXZlIDEgcm93IGluIHRoZSB0YWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMDAsIDk5MDkpOyIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFLCBudWxsKSk7CisgICAgICAgICAgICAvLyByZXF1ZXJ5IG9uIHRoZSBwcmV2aW91c2x5IG9wZW5lZCBjdXJzb3IKKyAgICAgICAgICAgIC8vIGN1cnNvciBzaG91bGQgbm93IHVzZSB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBzZWUgMiByb3dzCisgICAgICAgICAgICBjLnJlcXVlcnkoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBjLmdldENvdW50KCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gcm9sbGJhY2sgdGhlIGNoYW5nZQorICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoInJvbGxiYWNrOyIpOworICAgICAgICB9CisgICAgICAgIC8vIHNpbmNlIHRoZSBjaGFuZ2UgaXMgcm9sbGVkIGJhY2ssIGRvIHRoZSBzYW1lIHF1ZXJ5IGFnYWluIGFuZCBzaG91bGQgbm93IGZpbmQgb25seSAxIHJvdworICAgICAgICBjLnJlcXVlcnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFLCBudWxsKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBodHRwOi8vYi9pc3N1ZT9pZD0yOTQzMDI4CisgICAgICogU1FMaXRlT3BlbkhlbHBlciBtYWludGFpbnMgYSBTaW5nbGV0b24gZXZlbiBpZiBpdCBpcyBpbiBiYWQgc3RhdGUuCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUFuZFJlb3BlbigpIHsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIFRlc3RPcGVuSGVscGVyIGhlbHBlciA9IG5ldyBUZXN0T3BlbkhlbHBlcihnZXRDb250ZXh0KCksIERCX05BTUUsIG51bGwsCisgICAgICAgICAgICAgICAgQ1VSUkVOVF9EQVRBQkFTRV9WRVJTSU9OLCBuZXcgRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyKCkpOworICAgICAgICBtRGF0YWJhc2UgPSBoZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAsIDk5OSk7Iik7CisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnF1ZXJ5KFRFU1RfVEFCTEUsIG5ldyBTdHJpbmdbXXsiaSIsICJqIn0sIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgYy5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzT3BlbigpKTsKKyAgICAgICAgbURhdGFiYXNlID0gaGVscGVyLmdldFJlYWRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UuaXNPcGVuKCkpOworICAgICAgICBjID0gbURhdGFiYXNlLnF1ZXJ5KFRFU1RfVEFCTEUsIG5ldyBTdHJpbmdbXXsiaSIsICJqIn0sIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgYy5jbG9zZSgpOworICAgIH0KKyAgICBwcml2YXRlIGNsYXNzIFRlc3RPcGVuSGVscGVyIGV4dGVuZHMgU1FMaXRlT3BlbkhlbHBlciB7CisgICAgICAgIHB1YmxpYyBUZXN0T3BlbkhlbHBlcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbmFtZSwgZmFjdG9yeSwgdmVyc2lvbiwgZXJyb3JIYW5kbGVyKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25DcmVhdGUoU1FMaXRlRGF0YWJhc2UgZGIpIHt9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBvblVwZ3JhZGUoU1FMaXRlRGF0YWJhc2UgZGIsIGludCBvbGRWZXJzaW9uLCBpbnQgbmV3VmVyc2lvbikge30KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlR2VuZXJhbFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVHZW5lcmFsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjdjY2NlLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVHZW5lcmFsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QuRmxha3lUZXN0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBTUUxpdGVHZW5lcmFsVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKLSAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKLSAgICBCb29sZWFuIGV4Y2VwdGlvblJlY3ZkID0gZmFsc2U7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBleGNlcHRpb25SZWN2ZCA9IGZhbHNlOwotICAgICAgICBGaWxlIGRiRGlyID0gZ2V0Q29udGV4dCgpLmdldERpcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7Ci0gICAgICAgIG1EYXRhYmFzZUZpbGUgPSBuZXcgRmlsZShkYkRpciwgImRhdGFiYXNlX3Rlc3QuZGIiKTsKLSAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7Ci0gICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VPZlNhbWVTcWxTdGF0ZW1lbnRCeTJUaHJlYWRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOwotCi0gICAgICAgIC8vIHRocmVhZCAxIGNyZWF0ZXMgYSBwcmVwYXJlZCBzdGF0ZW1lbnQKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0bXQgPSAiU0VMRUNUICogRlJPTSB0ZXN0X3BzdG10IFdIRVJFIGkgPSA/IjsKLQotICAgICAgICAvLyBzdGFydCAyIHRocmVhZHMgdG8gZG8gcmVwZWF0ZWRseSBleGVjdXRlICJzdG10IgotICAgICAgICAvLyBzaW5jZSB0aGVzZSAyIHRocmVhZHMgYXJlIGV4ZWN1dGluZyB0aGUgc2FtZSBzcWwsIHRoZXkgZWFjaCBzaG91bGQgZ2V0Ci0gICAgICAgIC8vIHRoZWlyIG93biBjb3B5IGFuZAotICAgICAgICAvLyB0aGVyZSBTSE9VTEQgTk9UIGJlIGFuIGVycm9yIGZyb20gc3FsaXRlOiAicHJlcGFyZWQgc3RhdGVtZW50IGlzIGJ1c3kiCi0gICAgICAgIGNsYXNzIFJ1blN0bXRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE4gPSAxMDAwOwotICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBtYW55IHRpbWVzCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzMSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHN0bXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgczEuYmluZExvbmcoMSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzMS5leGVjdXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzMS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiU1FMaXRlRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgicmFuZG9tIHVuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFJ1blN0bXRUaHJlYWQgdDEgPSBuZXcgUnVuU3RtdFRocmVhZCgpOwotICAgICAgICB0MS5zdGFydCgpOwotICAgICAgICBSdW5TdG10VGhyZWFkIHQyID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKLSAgICAgICAgdDIuc3RhcnQoKTsKLSAgICAgICAgd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBGbGFreVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlT2ZTYW1lUHJlcGFyZWRTdGF0ZW1lbnRCeTJUaHJlYWRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOwotCi0gICAgICAgIC8vIHRocmVhZCAxIGNyZWF0ZXMgYSBwcmVwYXJlZCBzdGF0ZW1lbnQKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0bXQgPSAiU0VMRUNUICogRlJPTSB0ZXN0X3BzdG10IFdIRVJFIGkgPSA/IjsKLSAgICAgICAgZmluYWwgU1FMaXRlU3RhdGVtZW50IHMxID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3RtdCk7Ci0KLSAgICAgICAgLy8gc3RhcnQgMiB0aHJlYWRzIHRvIGRvIHJlcGVhdGVkbHkgZXhlY3V0ZSAic3RtdCIKLSAgICAgICAgLy8gc2luY2UgdGhlc2UgMiB0aHJlYWRzIGFyZSBleGVjdXRpbmcgdGhlIHNhbWUgcHJlcGFyZWQgc3RhdGVtZW50LAotICAgICAgICAvLyBzaG91bGQgc2VlIGFuIGVycm9yIGZyb20gc3FsaXRlOiAicHJlcGFyZWQgc3RhdGVtZW50IGlzIGJ1c3kiCi0gICAgICAgIGNsYXNzIFJ1blN0bXRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE4gPSAxMDAwOwotICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBtYW55IHRpbWVzCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMxLmJpbmRMb25nKDEsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgczEuZXhlY3V0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0IGl0Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoImxpYnJhcnkgcm91dGluZSBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uUmVjdmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgicmFuZG9tIHVuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFJ1blN0bXRUaHJlYWQgdDEgPSBuZXcgUnVuU3RtdFRocmVhZCgpOwotICAgICAgICB0MS5zdGFydCgpOwotICAgICAgICBSdW5TdG10VGhyZWFkIHQyID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKLSAgICAgICAgdDIuc3RhcnQoKTsKLSAgICAgICAgd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGV4Y2VwdGlvblJlY3ZkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50VGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTc1NDVmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVTdGF0ZW1lbnRUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKKyAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgRmlsZSBkYkRpciA9IGdldENvbnRleHQoKS5nZXREaXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworICAgICAgICBtRGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoZGJEaXIsICJkYXRhYmFzZV90ZXN0LmRiIik7CisgICAgICAgIGlmIChtRGF0YWJhc2VGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZSA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUuZ2V0UGF0aCgpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IDIgdGhyZWFkcyB0byByZXBlYXRlZGx5IGV4ZWN1dGUgdGhlIGFib3ZlIFNRTCBzdGF0ZW1lbnQuCisgICAgICogRXZlbiB0aG91Z2ggMiB0aHJlYWRzIGFyZSBleGVjdXRpbmcgdGhlIHNhbWUgU1FMLCB0aGV5IGVhY2ggc2hvdWxkIGdldCB0aGVpciBvd24gY29weSBvZgorICAgICAqIHByZXBhcmVkIFNRTCBzdGF0ZW1lbnQgaWQgYW5kIHRoZXJlIFNIT1VMRCBOT1QgYmUgYW4gZXJyb3IgZnJvbSBzcWxpdGUgb3IgYW5kcm9pZC4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHRocm93biBpZiB0aGUgdGVzdCB0aHJlYWRzIHN0YXJ0ZWQgYnkgdGhpcyB0ZXN0IGFyZSBpbnRlcnJ1cHRlZAorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlT2ZTYW1lU3FsU3RhdGVtZW50QnkyVGhyZWFkcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RtdCA9ICJTRUxFQ1QgKiBGUk9NIHRlc3RfcHN0bXQgV0hFUkUgaSA9ID8iOworICAgICAgICBjbGFzcyBSdW5TdG10VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgLy8gZG8gaXQgZW5vdWdoIHRpbWVzIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gY29ybmVyIGNhc2VzIGdvaW5nIHVudGVzdGVkCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHMxID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3RtdCk7CisgICAgICAgICAgICAgICAgICAgIHMxLmJpbmRMb25nKDEsIGkpOworICAgICAgICAgICAgICAgICAgICBzMS5leGVjdXRlKCk7CisgICAgICAgICAgICAgICAgICAgIHMxLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBSdW5TdG10VGhyZWFkIHQxID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKKyAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgUnVuU3RtdFRocmVhZCB0MiA9IG5ldyBSdW5TdG10VGhyZWFkKCk7CisgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgICB3aGlsZSAodDEuaXNBbGl2ZSgpIHx8IHQyLmlzQWxpdmUoKSkgeworICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMCk7CisgICAgICAgICB9CisgICAgIH0KKworICAgIC8qKgorICAgICAqIEEgc2ltcGxlIHRlc3Q6IHN0YXJ0IDIgdGhyZWFkcyB0byByZXBlYXRlZGx5IGV4ZWN1dGUgdGhlIHNhbWUge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH0uCisgICAgICogVGhlIDIgdGhyZWFkcyB0YWtlIHR1cm5zIHRvIHVzZSB0aGUge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH07IGkuZS4sIGl0IGlzIE5PVCBpbiB1c2UKKyAgICAgKiBieSBib3RoIHRoZSB0aHJlYWRzIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHRocm93biBpZiB0aGUgdGVzdCB0aHJlYWRzIHN0YXJ0ZWQgYnkgdGhpcyB0ZXN0IGFyZSBpbnRlcnJ1cHRlZAorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlT2ZTYW1lU3FsaXRlU3RhdGVtZW50QnkyVGhyZWFkcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RtdCA9ICJTRUxFQ1QgKiBGUk9NIHRlc3RfcHN0bXQgV0hFUkUgaSA9ID8iOworICAgICAgICBmaW5hbCBTUUxpdGVTdGF0ZW1lbnQgczEgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudChzdG10KTsKKyAgICAgICAgY2xhc3MgUnVuU3RtdFRocmVhZCBleHRlbmRzIFRocmVhZCB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIGRvIGl0IGVub3VnaCB0aW1lcyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGNvcm5lciBjYXNlcyBnb2luZyB1bnRlc3RlZAorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMxLmJpbmRMb25nKDEsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgczEuZXhlY3V0ZSgpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnlpZWxkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFJ1blN0bXRUaHJlYWQgdDEgPSBuZXcgUnVuU3RtdFRocmVhZCgpOworICAgICAgICB0MS5zdGFydCgpOworICAgICAgICBSdW5TdG10VGhyZWFkIHQyID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKKyAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqIFN5bmNocm9uaXplIG9uIHRoaXMgd2hlbiBhY2Nlc3NpbmcgdGhlIFNxbGl0ZVN0YXRlbWV0IGluIHRoZSBhYm92ZSAqLworICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50TG9jayBtTG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKHRydWUpOworICAgIHByaXZhdGUgdm9pZCBsb2NrKCkgeworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgfQorICAgIHByaXZhdGUgdm9pZCB1bmxvY2soKSB7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoZSBmb2xsb3dpbmc6IGEge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH0gb2JqZWN0IHNob3VsZCBub3QgcmVmZXIgdG8gYQorICAgICAqIHByZS1jb21waWxlZCBTUUwgc3RhdGVtZW50IGlkIGV4Y2VwdCBpbiBkdXJpbmcgdGhlIHBlcmlvZCBvZiBiaW5kaW5nIHRoZSBhcmd1bWVudHMKKyAgICAgKiBhbmQgZXhlY3V0aW5nIHRoZSBTUUwgc3RhdGVtZW50LgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKCkgeworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIHQgKGkgaW50LCBqIHRleHQpOyIpOworICAgICAgICB2ZXJpZnlSZWZlcmVuY2VUb1ByZWNvbXBpbGVkU3RhdGVtZW50SWQoZmFsc2UpOworICAgICAgICB2ZXJpZnlSZWZlcmVuY2VUb1ByZWNvbXBpbGVkU3RhdGVtZW50SWQodHJ1ZSk7CisKKyAgICAgICAgLy8gYSBzbWFsbCBzdHJlc3MgdGVzdCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHNpZGUgZWZmZWN0cyBvZgorICAgICAgICAvLyB0aGUgYWNxdWlyZSAmIHJlbGVhc2Ugb2YgcHJlLWNvbXBpbGVkIHN0YXRlbWVudCBpZCBieSBTUUxpdGVTdGF0ZW1lbnQgb2JqZWN0LgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisgICAgICAgICAgICB2ZXJpZnlSZWZlcmVuY2VUb1ByZWNvbXBpbGVkU3RhdGVtZW50SWQoZmFsc2UpOworICAgICAgICAgICAgdmVyaWZ5UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKGJvb2xlYW4gd2FsKSB7CisgICAgICAgIGlmICh3YWwpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICB9CisgICAgICAgIC8vIHRlc3Qgd2l0aCBJTlNFUlQgc3RhdGVtZW50IC0gZG9lc24ndCB1c2UgY29ubmVjdGlvbiBwb29sLCBpZiBXQUwgaXMgc2V0CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10ID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoImluc2VydCBpbnRvIHQgdmFsdWVzKD8sPyk7Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSwgc3RtdC5uSGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworICAgICAgICAvLyBzcWwgc3RhdGVtZW50IHNob3VsZCBub3QgYmUgY29tcGlsZWQgeWV0CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgaW50IGNvbFZhbHVlID0gbmV3IFJhbmRvbSgpLm5leHRJbnQoKTsKKyAgICAgICAgc3RtdC5iaW5kTG9uZygxLCBjb2xWYWx1ZSk7CisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBzcWwgc3RhdGVtZW50IGlzIHN0aWxsIG5vdCBjb21waWxlZAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgLy8gc2hvdWxkIHN0aWxsIGJlIHVzaW5nIHRoZSBtRGF0YWJhc2UgY29ubmVjdGlvbiAtIHZlcmlmeQorICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgc3RtdC5iaW5kU3RyaW5nKDIsICJibGFoIiArIGNvbFZhbHVlKTsKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIHNxbCBzdGF0ZW1lbnQgaXMgc3RpbGwgbm90IGNvbXBpbGVkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10LmdldFNxbFN0YXRlbWVudElkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgc3RtdC5leGVjdXRlSW5zZXJ0KCk7CisgICAgICAgIC8vIG5vdyB0aGF0IHRoZSBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQsIHByZS1jb21waWxlZCBzdGF0ZW1lbnQgc2hvdWxkIGJlIHJlbGVhc2VkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgLy8gcHJlLWNvbXBpbGVkIFNRTCBzdGF0ZW1lbnQgc2hvdWxkIHN0aWxsIHJlbWFpbiByZWxlYXNlZCBmcm9tIHRoaXMgb2JqZWN0CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgLy8gYnV0IHRoZSBkYXRhYmFzZSBoYW5kbGUgc2hvdWxkIHN0aWxsIGJlIHRoZSBzYW1lCisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKworICAgICAgICAvLyB0ZXN0IHdpdGggYSBTRUxFQ1Qgc3RhdGVtZW50IC0gdXNlcyBjb25uZWN0aW9uIHBvb2wgaWYgV0FMIGlzIHNldAorICAgICAgICBzdG10ID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoInNlbGVjdCBpIGZyb20gdCB3aGVyZSBqPT87Iik7CisgICAgICAgIC8vIHNxbCBzdGF0ZW1lbnQgc2hvdWxkIG5vdCBiZSBjb21waWxlZCB5ZXQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQublN0YXRlbWVudCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10LmdldFNxbFN0YXRlbWVudElkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgc3RtdC5iaW5kU3RyaW5nKDEsICJibGFoIiArIGNvbFZhbHVlKTsKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIHNxbCBzdGF0ZW1lbnQgaXMgc3RpbGwgbm90IGNvbXBpbGVkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHN0YXRlbWVudAorICAgICAgICBMb25nIGwgPSBzdG10LnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29sVmFsdWUsIGwuaW50VmFsdWUoKSk7CisgICAgICAgIC8vIG5vdyB0aGF0IHRoZSBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQsIHByZS1jb21waWxlZCBzdGF0ZW1lbnQgc2hvdWxkIGJlIHJlbGVhc2VkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgLy8gcHJlLWNvbXBpbGVkIFNRTCBzdGF0ZW1lbnQgc2hvdWxkIHN0aWxsIHJlbWFpbiByZWxlYXNlZCBmcm9tIHRoaXMgb2JqZWN0CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgLy8gYnV0IHRoZSBkYXRhYmFzZSBoYW5kbGUgc2hvdWxkIHN0aWxsIHJlbWFpbiBhdHRhY2hlZCB0byB0aGUgc3RhdGVtZW50CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSwgc3RtdC5uSGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9VcmlUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvVXJpVGVzdC5qYXZhCmluZGV4IGE1ZmRhMjAuLmZlNjA4YjUgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9VcmlUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L1VyaVRlc3QuamF2YQpAQCAtMjQsNiArMjQsOSBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIHB1YmxpYyBjbGFzcyBVcmlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCkBAIC01MiwyMCArNTUsMjAgQEAKIAogICAgIHByaXZhdGUgdm9pZCBwYXJjZWxBbmRVbnBhcmNlbChVcmkgdSkgewogICAgICAgICBQYXJjZWwgcCA9IFBhcmNlbC5vYnRhaW4oKTsKLQl0cnkgewotCQlVcmkud3JpdGVUb1BhcmNlbChwLCB1KTsKLQkJcC5zZXREYXRhUG9zaXRpb24oMCk7Ci0JCWFzc2VydEVxdWFscyh1LCBVcmkuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHApKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVyaS53cml0ZVRvUGFyY2VsKHAsIHUpOworICAgICAgICAgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModSwgVXJpLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKSk7CiAKLQkJcC5zZXREYXRhUG9zaXRpb24oMCk7Ci0JCXUgPSB1LmJ1aWxkVXBvbigpLmJ1aWxkKCk7ICAgICAgICAKLQkJVXJpLndyaXRlVG9QYXJjZWwocCwgdSk7Ci0JCXAuc2V0RGF0YVBvc2l0aW9uKDApOwotCQlhc3NlcnRFcXVhbHModSwgVXJpLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKSk7Ci0JfQotCWZpbmFsbHkgewotCQlwLnJlY3ljbGUoKTsKLQl9CisgICAgICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgICAgIHUgPSB1LmJ1aWxkVXBvbigpLmJ1aWxkKCk7CisgICAgICAgICAgICBVcmkud3JpdGVUb1BhcmNlbChwLCB1KTsKKyAgICAgICAgICAgIHAuc2V0RGF0YVBvc2l0aW9uKDApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHUsIFVyaS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgcC5yZWN5Y2xlKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAU21hbGxUZXN0CkBAIC02MDMsNCArNjA2LDEyMiBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHVyaS5nZXRRdWVyeVBhcmFtZXRlcigiYiIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoImMiKSk7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyRW1wdHlLZXkoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8/PWIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgdXJpLmdldFF1ZXJ5UGFyYW1ldGVyKCIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyRW1wdHlLZXkyKCkgeworICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tLz9hPWImJmM9ZCIpOworICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoIiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnlQYXJhbWV0ZXJFbXB0eUtleTMoKSB7CisgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20/Iik7CisgICAgICBhc3NlcnRFcXVhbHMoIiIsIHVyaS5nZXRRdWVyeVBhcmFtZXRlcigiIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlckVtcHR5S2V5NCgpIHsKKyAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbT9hPWImIik7CisgICAgICBhc3NlcnRFcXVhbHMoIiIsIHVyaS5nZXRRdWVyeVBhcmFtZXRlcigiIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlcnNFbXB0eUtleSgpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tLz89YiYiKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlcnMoIiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdmFsdWVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIHZhbHVlcy5nZXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHZhbHVlcy5nZXQoMSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlcnNFbXB0eUtleTIoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbT8iKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlcnMoIiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdmFsdWVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgdmFsdWVzLmdldCgwKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyc0VtcHR5S2V5MygpIHsKKyAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8/YT1iJiZjPWQiKTsKKyAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJzKCIiKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCB2YWx1ZXMuc2l6ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygiIiwgdmFsdWVzLmdldCgwKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyTmFtZXMoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly90ZXN0P2E9MSIpOworICAgICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBuYW1lcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBuYW1lcy5pdGVyYXRvcigpLm5leHQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyTmFtZXNFbXB0eUtleSgpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tLz9hPXgmJmM9eiIpOworICAgICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IG5hbWVzLml0ZXJhdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBuYW1lcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBpdGVyLm5leHQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyTmFtZXNFbXB0eUtleTIoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8/YT14Jj1kJmM9eiIpOworICAgICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IG5hbWVzLml0ZXJhdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBuYW1lcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBpdGVyLm5leHQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyTmFtZXNFbXB0eVZhbHVlcygpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tLz9hPWZvbyZiPSZjPSIpOworICAgICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IG5hbWVzLml0ZXJhdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBuYW1lcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIiwgaXRlci5uZXh0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlck5hbWVzRWRnZUNhc2VzKCkgeworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vZm9vP2E9YmFyJmI9YmFyJmM9JiZkPWJheiZlJmYmZz1idXp6JiYmYSZiPWJhciZoIik7CisgICAgICAgIFNldDxTdHJpbmc+IG5hbWVzID0gdXJpLmdldFF1ZXJ5UGFyYW1ldGVyTmFtZXMoKTsKKyAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbmFtZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDksIG5hbWVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImQiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZSIsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImciLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaCIsIGl0ZXIubmV4dCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnlQYXJhbWV0ZXJOYW1lc0VzY2FwZWRLZXlzKCkgeworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20vP2ElMjBiPWZvbyZjJTIwZD0iKTsKKyAgICAgICAgU2V0PFN0cmluZz4gbmFtZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbmFtZXMuc2l6ZSgpKTsKKyAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbmFtZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIGIiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYyBkIiwgaXRlci5uZXh0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlckVzY2FwZWRLZXlzKCkgeworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20vP2ElMjBiPWZvbyZjJTIwZD0iKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gdXJpLmdldFF1ZXJ5UGFyYW1ldGVyKCJhIGIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCB2YWx1ZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhclF1ZXJ5UGFyYW1ldGVycygpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tLz9hPXgmYj15JmM9eiIpLmJ1aWxkVXBvbigpCisgICAgICAgICAgICAuY2xlYXJRdWVyeSgpLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKCJmb28iLCAiYmFyIikuYnVpbGQoKTsKKyAgICAgICAgU2V0PFN0cmluZz4gbmFtZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbmFtZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lcy5pdGVyYXRvcigpLm5leHQoKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvb3MvTWVtb3J5RmlsZVRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL29zL01lbW9yeUZpbGVUZXN0LmphdmEKaW5kZXggMDA5YTBlMi4uZTYyN2JiNCAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvb3MvTWVtb3J5RmlsZVRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9vcy9NZW1vcnlGaWxlVGVzdC5qYXZhCkBAIC0yMzcsNTEgKzIzNyw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdElzTWVtb3J5RmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZW1vcnlGaWxlIGZpbGUgPSBuZXcgTWVtb3J5RmlsZSgiTWVtb3J5RmlsZVRlc3QiLCAxMDAwMDAwKTsKLSAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQgPSBmaWxlLmdldEZpbGVEZXNjcmlwdG9yKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZmQpOwotICAgICAgICBhc3NlcnRUcnVlKGZkLnZhbGlkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKE1lbW9yeUZpbGUuaXNNZW1vcnlGaWxlKGZkKSk7Ci0gICAgICAgIGZpbGUuY2xvc2UoKTsKLQotICAgICAgICBhc3NlcnRGYWxzZShNZW1vcnlGaWxlLmlzTWVtb3J5RmlsZShGaWxlRGVzY3JpcHRvci5pbikpOwotICAgICAgICBhc3NlcnRGYWxzZShNZW1vcnlGaWxlLmlzTWVtb3J5RmlsZShGaWxlRGVzY3JpcHRvci5vdXQpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoTWVtb3J5RmlsZS5pc01lbW9yeUZpbGUoRmlsZURlc2NyaXB0b3IuZXJyKSk7Ci0KLSAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIk1lbW9yeUZpbGVUZXN0IiwiLnRtcCIsIGdldENvbnRleHQoKS5nZXRGaWxlc0RpcigpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmaWxlKTsKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcEZpbGUpOwotICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IgZmlsZUZkID0gb3V0LmdldEZEKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZpbGVGZCk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShNZW1vcnlGaWxlLmlzTWVtb3J5RmlsZShmaWxlRmQpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGVtcEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVEZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IG5ldyBNZW1vcnlGaWxlKCJNZW1vcnlGaWxlVGVzdCIsIDEwMDAwMDApOwotICAgICAgICBNZW1vcnlGaWxlIHJlZiA9IG5ldyBNZW1vcnlGaWxlKGZpbGUuZ2V0RmlsZURlc2NyaXB0b3IoKSwgZmlsZS5sZW5ndGgoKSwgInIiKTsKLSAgICAgICAgYnl0ZVtdIGJ1ZmZlcjsKLQotICAgICAgICAvLyB3cml0ZSB0byBvcmlnaW5hbCwgcmVhZCBmcm9tIHJlZmVyZW5jZQotICAgICAgICBmaWxlLndyaXRlQnl0ZXModGVzdFN0cmluZywgMCwgMjAwMCwgdGVzdFN0cmluZy5sZW5ndGgpOwotICAgICAgICBidWZmZXIgPSBuZXcgYnl0ZVt0ZXN0U3RyaW5nLmxlbmd0aF07Ci0gICAgICAgIHJlZi5yZWFkQnl0ZXMoYnVmZmVyLCAyMDAwLCAwLCB0ZXN0U3RyaW5nLmxlbmd0aCk7Ci0gICAgICAgIGNvbXBhcmVCdWZmZXJzKHRlc3RTdHJpbmcsIGJ1ZmZlciwgdGVzdFN0cmluZy5sZW5ndGgpOwotCi0gICAgICAgIGZpbGUuY2xvc2UoKTsKLSAgICAgICAgcmVmLmNsb3NlKCk7ICAvLyBEb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nLCBzaW5jZSB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIG5vdCBkdXAoMik6ZWQKLSAgICB9Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gdGVzdFN0cmluZyA9IG5ldyBieXRlW10gewogICAgICAgICAzLCAxLCA0LCAxLCA1LCA5LCAyLCA2LCA1LCAzLCA1LCA4LCA5LCA3LCA5LCAzLCAyLCAzLCA4LCA0LCA2LCAyLCA2LCA0LCAzLCAzLCA4LCAzLCAyLCA3LCA5LCA1LCAwLCAyLCA4LCA4LCA0LCAxLCA5LCA3LCAxLCA2LCA5LCAzLCA5LCA5LCAzLCA3LCA1LCAxLCAwLCA1LCA4LCAyLCAwLCA5LCA3LCA0LCA5LCA0LCA0LCA1LCA5LCAyLCAzLCAwLCA3LCA4LCAxLCA2LCA0LAogICAgICAgICAwLCA2LCAyLCA4LCA2LCAyLCAwLCA4LCA5LCA5LCA4LCA2LCAyLCA4LCAwLCAzLCA0LCA4LCAyLCA1LCAzLCA0LCAyLCAxLCAxLCA3LCAwLCA2LCA3LCA5LCA4LCAyLCAxLCA0LCA4LCAwLCA4LCA2LCA1LCAxLCAzLCAyLCA4LCAyLCAzLCAwLCA2LCA2LCA0LCA3LCAwLCA5LCAzLCA4LCA0LCA0LCA2LCAwLCA5LCA1LCA1LCAwLCA1LCA4LCAyLCAyLCAzLCAxLCA3LCAyLApkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvb3MvTWVzc2FnZVF1ZXVlVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvb3MvTWVzc2FnZVF1ZXVlVGVzdC5qYXZhCmluZGV4IGI3YzJkMWYuLmY4MmJmY2UgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZVRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9vcy9NZXNzYWdlUXVldWVUZXN0LmphdmEKQEAgLTQxLDYgKzQxLDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBpZiAoIW1zZy5pc0luVXNlKCkpIHsKKyAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIm1zZy5pc0ludXNlIGlzIGZhbHNlLCBzaG91bGQgYWx3YXlzIGJlIHRydWUsICMiICsgbXNnLndoYXQpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtQ291bnQgPD0gbUxhc3RNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1zZy53aGF0ICE9IG1Db3VudCkgewogICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKApAQCAtOTksNSArMTAzLDE3NCBAQAogCiAgICAgICAgIHRlc3Rlci5kb1Rlc3QoMTAwMCk7CiAgICAgfQotfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdEZpZWxkSW50ZWdyaXR5SGFuZGxlciBleHRlbmRzIFRlc3RIYW5kbGVyVGhyZWFkIHsKKyAgICAgICAgSGFuZGxlciBtSGFuZGxlcjsKKyAgICAgICAgaW50IG1MYXN0TWVzc2FnZTsKKyAgICAgICAgaW50IG1Db3VudDsKKworICAgICAgICBwdWJsaWMgVGVzdEZpZWxkSW50ZWdyaXR5SGFuZGxlcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGdvKCkgeworICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICAgICAgICAgIFRlc3RGaWVsZEludGVncml0eUhhbmRsZXIudGhpcy5oYW5kbGVNZXNzYWdlKG1zZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIGlmICghbXNnLmlzSW5Vc2UoKSkgeworICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAibXNnLmlzSW51c2UgaXMgZmFsc2UsIHNob3VsZCBhbHdheXMgYmUgdHJ1ZSwgIyIgKyBtc2cud2hhdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Db3VudCA8PSBtTGFzdE1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICBpZiAobXNnLndoYXQgIT0gbUNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG1lc3NhZ2UgIyIgKyBtQ291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcmVjZWl2ZWQgIyIgKyBtc2cud2hhdCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUNvdW50ID09IG1MYXN0TWVzc2FnZSkgeworICAgICAgICAgICAgICAgICAgICBzdWNjZXNzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Db3VudCsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgcmVjZWl2ZWQgYWZ0ZXIgZG9uZSwgIyIgKyBtc2cud2hhdCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRJbnRlZ3JpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBUZXN0SGFuZGxlclRocmVhZCB0ZXN0ZXIgPSBuZXcgVGVzdEZpZWxkSW50ZWdyaXR5SGFuZGxlcigpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBtQnVuZGxlOworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBnbygpIHsKKyAgICAgICAgICAgICAgICBzdXBlci5nbygpOworICAgICAgICAgICAgICAgIG1MYXN0TWVzc2FnZSA9IDE7CisgICAgICAgICAgICAgICAgbUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKDApKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgICAgIHN1cGVyLmhhbmRsZU1lc3NhZ2UobXNnKTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLndoYXQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtc2cuZmxhZ3MgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLndoYXQgPSAxOworICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMSA9IDQ1NjsKKyAgICAgICAgICAgICAgICAgICAgbXNnLmFyZzIgPSA3ODk7CisgICAgICAgICAgICAgICAgICAgIG1zZy5vYmogPSB0aGlzOworICAgICAgICAgICAgICAgICAgICBtc2cucmVwbHlUbyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgICAgIG1zZy5kYXRhID0gbUJ1bmRsZTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLmRhdGEucHV0U3RyaW5nKCJrZXkiLCAidmFsdWUiKTsKKworICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG5ld01zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3TXNnLmNvcHlGcm9tKG1zZyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cuaXNJblVzZSgpICE9IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLmlzSW5Vc2UgaXMgdHJ1ZSBzaG91bGQgYmUgZmFsc2UgYWZ0ZXIgY29weUZyb20iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy5mbGFncyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLmZsYWdzIGlzICVkIHNob3VsZCBiZSAwIGFmdGVyIGNvcHlGcm9tIiwgbmV3TXNnLmZsYWdzKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cud2hhdCAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cud2hhdCBpcyAlZCBzaG91bGQgYmUgJWQgYWZ0ZXIgY29weUZyb20iLCBuZXdNc2cud2hhdCwgMSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLmFyZzEgIT0gNDU2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cuYXJnMSBpcyAlZCBzaG91bGQgYmUgJWQgYWZ0ZXIgY29weUZyb20iLCBtc2cuYXJnMSwgNDU2KSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cuYXJnMiAhPSA3ODkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy5hcmcyIGlzICVkIHNob3VsZCBiZSAlZCBhZnRlciBjb3B5RnJvbSIsIG1zZy5hcmcyLCA3ODkpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy5vYmogIT0gdGhpcykgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy5vYmogc2hvdWxkIGJlICd0aGlzJyBhZnRlciBjb3B5RnJvbSIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLnJlcGx5VG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy5yZXBseVRvIHNob3VsZCBiZSBudWxsIGFmdGVyIGNvcHlGcm9tIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cuZGF0YSA9PSBtQnVuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLmRhdGEgc2hvdWxkIE5PVCBiZSBtQnVuZGxlIGFmdGVyIGNvcHlGcm9tIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghbmV3TXNnLmRhdGEuZ2V0U3RyaW5nKCJrZXkiKS5lcXVhbHMobUJ1bmRsZS5nZXRTdHJpbmcoImtleSIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLmRhdGEuZ2V0U3RyaW5nKFwia2V5XCIpIGlzICVzIGFuZCBkb2VzIG5vdCBlcXVhbCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG1CdW5kbGUuZ2V0U3RyaW5nKFwia2V5XCIpIHdoaWNoIGlzICVzIGFmdGVyIGNvcHlGcm9tIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TXNnLmRhdGEuZ2V0U3RyaW5nKCJrZXkiKSwgIG1CdW5kbGUuZ2V0U3RyaW5nKCJrZXkiKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLndoZW4gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLndoZW4gaXMgJWQgc2hvdWxkIGJlIDAgYWZ0ZXIgY29weUZyb20iLCBuZXdNc2cud2hlbikpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLnRhcmdldCAhPSBtSGFuZGxlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy50YXJnZXQgaXMgTk9UIG1IYW5kbGVyIGFmdGVyIGNvcHlGcm9tIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cuY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy5jYWxsYmFjayBpcyBOT1QgbnVsbCBhZnRlciBjb3B5RnJvbSIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG5ld01zZyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtc2cud2hhdCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuaXNJblVzZSgpICE9IHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZy5pc0luVXNlIGlzIGZhbHNlIHNob3VsZCBiZSB0cnVlIGFmdGVyIHdoZW4gcHJvY2Vzc2luZyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy53aGF0KSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuYXJnMSAhPSA0NTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZy5hcmcxIGlzICVkIHNob3VsZCBiZSAlZCB3aGVuIHByb2Nlc3NpbmcgIyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5hcmcxLCA0NTYsIG1zZy53aGF0KSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuYXJnMiAhPSA3ODkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZy5hcmcyIGlzICVkIHNob3VsZCBiZSAlZCB3aGVuIHByb2Nlc3NpbmcgIyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5hcmcyLCA3ODksIG1zZy53aGF0KSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cub2JqICE9IHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZy5vYmogc2hvdWxkIGJlICd0aGlzJyB3aGVuIHByb2Nlc3NpbmcgIyAlZCIsIG1zZy53aGF0KSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cucmVwbHlUbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cucmVwbHlUbyBzaG91bGQgYmUgbnVsbCB3aGVuIHByb2Nlc3NpbmcgIyAlZCIsIG1zZy53aGF0KSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLmRhdGEuZ2V0U3RyaW5nKCJrZXkiKS5lcXVhbHMobUJ1bmRsZS5nZXRTdHJpbmcoImtleSIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLmRhdGEuZ2V0U3RyaW5nKFwia2V5XCIpIGlzICVzIGFuZCBkb2VzIG5vdCBlcXVhbCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG1CdW5kbGUuZ2V0U3RyaW5nKFwia2V5XCIpIHdoaWNoIGlzICVzIHdoZW4gcHJvY2Vzc2luZyAjICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmRhdGEuZ2V0U3RyaW5nKCJrZXkiKSwgIG1CdW5kbGUuZ2V0U3RyaW5nKCJrZXkiKSwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy53aGVuICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZy53aGVuIGlzICVkIHNob3VsZCBiZSAwIHdoZW4gcHJvY2Vzc2luZyAjICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLndoZW4sIG1zZy53aGF0KSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cudGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZy50YXJnZXQgaXMgTk9UIG51bGwgd2hlbiBwcm9jZXNzaW5nICMgJWQiLCBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZy5jYWxsYmFjayBpcyBOT1QgbnVsbCB3aGVuIHByb2Nlc3NpbmcgIyAlZCIsIG1zZy53aGF0KSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIG1zZy53aGF0IGlzICVkIiArIG1zZy53aGF0KSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICB0ZXN0ZXIuZG9UZXN0KDEwMDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Db250ZW50VmFsdWVzQnVpbGRlci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0NvbnRlbnRWYWx1ZXNCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYzA3NzMuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0NvbnRlbnRWYWx1ZXNCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotCi0vKioKLSAqIENvbnRlbnRWYWx1ZXMtbGlrZSBjbGFzcyB3aGljaCBlbmFibGVzIHVzZXJzIHRvIGNoYWluIHB1dCgpIG1ldGhvZHMgYW5kIHJlc3RyaWN0cwotICogdGhlIG90aGVyIG1ldGhvZHMuCi0gKi8KLS8qIHBhY2thZ2UgKi8gY2xhc3MgQ29udGVudFZhbHVlc0J1aWxkZXIgewotICAgIHByaXZhdGUgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlczsKLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlcihmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMgPSBjb250ZW50VmFsdWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBCeXRlIHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBTaG9ydCB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgSW50ZWdlciB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgTG9uZyB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgRmxvYXQgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIERvdWJsZSB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgQm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgYnl0ZVtdIHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dE51bGwoU3RyaW5nIGtleSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXROdWxsKGtleSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Db250ZW50VmFsdWVzVmVyaWZpZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Db250ZW50VmFsdWVzVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjllOTg3NS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvQ29udGVudFZhbHVlc1ZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5Q29uc3RydWN0b3I7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeUhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXJfVjIxOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyX1YzMDsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKiBwYWNrYWdlICovIGNsYXNzIENvbnRlbnRWYWx1ZXNWZXJpZmllciBpbXBsZW1lbnRzIFZDYXJkRW50cnlIYW5kbGVyIHsKLSAgICBwcml2YXRlIEFuZHJvaWRUZXN0Q2FzZSBtVGVzdENhc2U7Ci0gICAgcHJpdmF0ZSBMaXN0PENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0+IG1Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtTGlzdCA9Ci0gICAgICAgIG5ldyBBcnJheUxpc3Q8Q29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbT4oKTsKLSAgICBwcml2YXRlIGludCBtSW5kZXg7Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBhZGRFbGVtKEFuZHJvaWRUZXN0Q2FzZSBhbmRyb2lkVGVzdENhc2UpIHsKLSAgICAgICAgbVRlc3RDYXNlID0gYW5kcm9pZFRlc3RDYXNlOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGltcG9ydFZlcmlmaWVyID0gbmV3IENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oYW5kcm9pZFRlc3RDYXNlKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW1MaXN0LmFkZChpbXBvcnRWZXJpZmllcik7Ci0gICAgICAgIHJldHVybiBpbXBvcnRWZXJpZmllcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoaW50IHJlc0lkLCBpbnQgdkNhcmRUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdmVyaWZ5KG1UZXN0Q2FzZS5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlKHJlc0lkKSwgdkNhcmRUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoaW50IHJlc0lkLCBpbnQgdkNhcmRUeXBlLCBmaW5hbCBWQ2FyZFBhcnNlciB2Q2FyZFBhcnNlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICB2ZXJpZnkobVRlc3RDYXNlLmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5vcGVuUmF3UmVzb3VyY2UocmVzSWQpLAotICAgICAgICAgICAgICAgIHZDYXJkVHlwZSwgdkNhcmRQYXJzZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShJbnB1dFN0cmVhbSBpcywgaW50IHZDYXJkVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFZDYXJkUGFyc2VyIHZDYXJkUGFyc2VyOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWMzAodkNhcmRUeXBlKSkgewotICAgICAgICAgICAgdkNhcmRQYXJzZXIgPSBuZXcgVkNhcmRQYXJzZXJfVjMwKHRydWUpOyAgLy8gdXNlIFN0cmljdFBhcnNpbmcKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZDYXJkUGFyc2VyID0gbmV3IFZDYXJkUGFyc2VyX1YyMSgpOwotICAgICAgICB9Ci0gICAgICAgIHZlcmlmeShpcywgdkNhcmRUeXBlLCB2Q2FyZFBhcnNlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KElucHV0U3RyZWFtIGlzLCBpbnQgdkNhcmRUeXBlLCBmaW5hbCBWQ2FyZFBhcnNlciB2Q2FyZFBhcnNlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBWQ2FyZEVudHJ5Q29uc3RydWN0b3IgYnVpbGRlciA9Ci0gICAgICAgICAgICBuZXcgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKG51bGwsIG51bGwsIGZhbHNlLCB2Q2FyZFR5cGUsIG51bGwpOwotICAgICAgICBidWlsZGVyLmFkZEVudHJ5SGFuZGxlcih0aGlzKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZDYXJkUGFyc2VyLnBhcnNlKGlzLCBidWlsZGVyKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAgICAgICAgZm9yIChDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gOiBtQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbUxpc3QpIHsKLSAgICAgICAgICAgIGVsZW0ub25QYXJzaW5nU3RhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRW50cnlDcmVhdGVkKFZDYXJkRW50cnkgZW50cnkpIHsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydFRydWUobUluZGV4IDwgbUNvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW1MaXN0LnNpemUoKSk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtTGlzdC5nZXQobUluZGV4KS5vbkVudHJ5Q3JlYXRlZChlbnRyeSk7Ci0gICAgICAgIG1JbmRleCsrOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRW5kKCkgewotICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA6IG1Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtTGlzdCkgewotICAgICAgICAgICAgZWxlbS5vblBhcnNpbmdFbmQoKTsKLSAgICAgICAgICAgIGVsZW0udmVyaWZ5UmVzb2x2ZXIoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWRiYjM2Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5OwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnlDb21taXR0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeUNvbnN0cnVjdG9yOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnlIYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyX1YyMTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcl9WMzA7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLS8qIHBhY2thZ2UgKi8gY2xhc3MgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBbmRyb2lkVGVzdENhc2UgbVRlc3RDYXNlOwotICAgIHByaXZhdGUgZmluYWwgSW1wb3J0VGVzdFJlc29sdmVyIG1SZXNvbHZlcjsKLSAgICBwcml2YXRlIGZpbmFsIFZDYXJkRW50cnlIYW5kbGVyIG1IYW5kbGVyOwotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSkgewotICAgICAgICBtVGVzdENhc2UgPSBhbmRyb2lkVGVzdENhc2U7Ci0gICAgICAgIG1SZXNvbHZlciA9IG5ldyBJbXBvcnRUZXN0UmVzb2x2ZXIoYW5kcm9pZFRlc3RDYXNlKTsKLSAgICAgICAgbUhhbmRsZXIgPSBuZXcgVkNhcmRFbnRyeUNvbW1pdHRlcihtUmVzb2x2ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBhZGRFeHBlY3RlZChTdHJpbmcgbWltZVR5cGUpIHsKLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgY29udGVudFZhbHVlcy5wdXQoRGF0YS5NSU1FVFlQRSwgbWltZVR5cGUpOwotICAgICAgICBtUmVzb2x2ZXIuYWRkRXhwZWN0ZWRDb250ZW50VmFsdWVzKGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICByZXR1cm4gbmV3IENvbnRlbnRWYWx1ZXNCdWlsZGVyKGNvbnRlbnRWYWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShpbnQgcmVzSWQsIGludCB2Q2FyZFR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdmVyaWZ5KG1UZXN0Q2FzZS5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlKHJlc0lkKSwgdkNhcmRUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoSW5wdXRTdHJlYW0gaXMsIGludCB2Q2FyZFR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBWQ2FyZFBhcnNlciB2Q2FyZFBhcnNlcjsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVjMwKHZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHZDYXJkUGFyc2VyID0gbmV3IFZDYXJkUGFyc2VyX1YzMCh0cnVlKTsgIC8vIHVzZSBTdHJpY3RQYXJzaW5nCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2Q2FyZFBhcnNlciA9IG5ldyBWQ2FyZFBhcnNlcl9WMjEoKTsKLSAgICAgICAgfQotICAgICAgICBWQ2FyZEVudHJ5Q29uc3RydWN0b3IgYnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IFZDYXJkRW50cnlDb25zdHJ1Y3RvcihudWxsLCBudWxsLCBmYWxzZSwgdkNhcmRUeXBlLCBudWxsKTsKLSAgICAgICAgYnVpbGRlci5hZGRFbnRyeUhhbmRsZXIobUhhbmRsZXIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdkNhcmRQYXJzZXIucGFyc2UoaXMsIGJ1aWxkZXIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdmVyaWZ5UmVzb2x2ZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnlSZXNvbHZlcigpIHsKLSAgICAgICAgbVJlc29sdmVyLnZlcmlmeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uUGFyc2luZ1N0YXJ0KCkgewotICAgICAgICBtSGFuZGxlci5vblN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25FbnRyeUNyZWF0ZWQoVkNhcmRFbnRyeSBlbnRyeSkgewotICAgICAgICBtSGFuZGxlci5vbkVudHJ5Q3JlYXRlZChlbnRyeSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25QYXJzaW5nRW5kKCkgewotICAgICAgICBtSGFuZGxlci5vbkVuZCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9FeHBvcnRUZXN0UmVzb2x2ZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9FeHBvcnRUZXN0UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUxZDBkOC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvRXhwb3J0VGVzdFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci0gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotICogdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRW50aXR5SXRlcmF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDdXJzb3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyogcGFja2FnZSAqLyBwdWJsaWMgY2xhc3MgRXhwb3J0VGVzdFJlc29sdmVyIGV4dGVuZHMgTW9ja0NvbnRlbnRSZXNvbHZlciB7Ci0gICAgRXhwb3J0VGVzdFByb3ZpZGVyIG1Qcm92aWRlcjsKLSAgICBwdWJsaWMgRXhwb3J0VGVzdFJlc29sdmVyKFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0gICAgICAgIG1Qcm92aWRlciA9IG5ldyBFeHBvcnRUZXN0UHJvdmlkZXIodGVzdENhc2UpOwotICAgICAgICBhZGRQcm92aWRlcihWQ2FyZENvbXBvc2VyLlZDQVJEX1RFU1RfQVVUSE9SSVRZLCBtUHJvdmlkZXIpOwotICAgICAgICBhZGRQcm92aWRlcihSYXdDb250YWN0cy5DT05URU5UX1VSSS5nZXRBdXRob3JpdHkoKSwgbVByb3ZpZGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGFjdEVudHJ5IGFkZElucHV0Q29udGFjdEVudHJ5KCkgewotICAgICAgICByZXR1cm4gbVByb3ZpZGVyLmJ1aWxkSW5wdXRFbnRyeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBFeHBvcnRUZXN0UHJvdmlkZXIgZ2V0UHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBtUHJvdmlkZXI7Ci0gICAgfQotfQotCi0vKiBwYWNrYWdlICovIGNsYXNzIE1vY2tFbnRpdHlJdGVyYXRvciBpbXBsZW1lbnRzIEVudGl0eUl0ZXJhdG9yIHsKLSAgICBMaXN0PEVudGl0eT4gbUVudGl0eUxpc3Q7Ci0gICAgSXRlcmF0b3I8RW50aXR5PiBtSXRlcmF0b3I7Ci0KLSAgICBwdWJsaWMgTW9ja0VudGl0eUl0ZXJhdG9yKExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgbUVudGl0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PEVudGl0eT4oKTsKLSAgICAgICAgRW50aXR5IGVudGl0eSA9IG5ldyBFbnRpdHkobmV3IENvbnRlbnRWYWx1ZXMoKSk7Ci0gICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBlbnRpdHkuYWRkU3ViVmFsdWUoRGF0YS5DT05URU5UX1VSSSwgY29udGVudFZhbHVlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbUVudGl0eUxpc3QuYWRkKGVudGl0eSk7Ci0gICAgICAgIG1JdGVyYXRvciA9IG1FbnRpdHlMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG1JdGVyYXRvci5oYXNOZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVudGl0eSBuZXh0KCkgewotICAgICAgICByZXR1cm4gbUl0ZXJhdG9yLm5leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigicmVtb3ZlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgbUl0ZXJhdG9yID0gbUVudGl0eUxpc3QuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICB9Ci19Ci0KLS8qKgotICogUmVwcmVzZW50cyBvbmUgY29udGFjdCwgd2hpY2ggc2hvdWxkIGNvbnRhaW4gbXVsdGlwbGUgQ29udGVudFZhbHVlcyBsaWtlCi0gKiBTdHJ1Y3R1cmVkTmFtZSwgRW1haWwsIGV0Yy4KLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBDb250YWN0RW50cnkgewotICAgIHByaXZhdGUgZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBtQ29udGVudFZhbHVlc0xpc3QgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRWYWx1ZXM+KCk7Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgYWRkQ29udGVudFZhbHVlcyhTdHJpbmcgbWltZVR5cGUpIHsKLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgY29udGVudFZhbHVlcy5wdXQoRGF0YS5NSU1FVFlQRSwgbWltZVR5cGUpOwotICAgICAgICBtQ29udGVudFZhbHVlc0xpc3QuYWRkKGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICByZXR1cm4gbmV3IENvbnRlbnRWYWx1ZXNCdWlsZGVyKGNvbnRlbnRWYWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENvbnRlbnRWYWx1ZXM+IGdldExpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udGVudFZhbHVlc0xpc3Q7Ci0gICAgfQotfQotCi0vKiBwYWNrYWdlICovIGNsYXNzIEV4cG9ydFRlc3RQcm92aWRlciBleHRlbmRzIE1vY2tDb250ZW50UHJvdmlkZXIgewotICAgIGZpbmFsIHByaXZhdGUgVGVzdENhc2UgbVRlc3RDYXNlOwotICAgIGZpbmFsIHByaXZhdGUgQXJyYXlMaXN0PENvbnRhY3RFbnRyeT4gbUNvbnRhY3RFbnRyeUxpc3QgPSBuZXcgQXJyYXlMaXN0PENvbnRhY3RFbnRyeT4oKTsKLQotICAgIHB1YmxpYyBFeHBvcnRUZXN0UHJvdmlkZXIoVGVzdENhc2UgdGVzdENhc2UpIHsKLSAgICAgICAgbVRlc3RDYXNlID0gdGVzdENhc2U7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRhY3RFbnRyeSBidWlsZElucHV0RW50cnkoKSB7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBjb250YWN0RW50cnkgPSBuZXcgQ29udGFjdEVudHJ5KCk7Ci0gICAgICAgIG1Db250YWN0RW50cnlMaXN0LmFkZChjb250YWN0RW50cnkpOwotICAgICAgICByZXR1cm4gY29udGFjdEVudHJ5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFuIG9sZCBtZXRob2Qgd2hpY2ggaGFkIGV4aXN0ZWQgYnV0IHdhcyByZW1vdmVkIGZyb20gQ29udGVudFJlc29sdmVyLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBXZSBzdGlsbCBrZWVwIHVzaW5nIHRoaXMgbWV0aG9kIHNpbmNlIHdlIGRvbid0IGhhdmUgYSBwcm9wZWVyIHdheSB0byBrbm93Ci0gICAgICogd2hpY2ggdmFsdWUgaW4gdGhlIENvbnRlbnRWYWx1ZSBjb3JyZXNwb25kcyB0byB0aGUgZW50cnkgaW4gQ29udGFjdHMgZGF0YWJhc2UuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIERldGFpbDoKLSAgICAgKiBUaGVyZSdzIGFuIGVhc3kgd2F5IHRvIGtub3cgd2hpY2ggaW5kZXggImZhbWlseSBuYW1lIiBjb3JyZXNwb25kcyB0bywgdmlhCi0gICAgICoge0BsaW5rIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdH0uCi0gICAgICogRkFNSUxZX05BTUUgZXF1YWxzIERBVEEzLCBzbyB0aGUgY29ycmVzcG9uZGluZyBpbmRleAotICAgICAqIGZvciAiZmFtaWx5IG5hbWUiIHNob3VsZCBiZSAyIChub3RlIHRoYXQgaW5kZXggaXMgMC1vcmlnaW4pLgotICAgICAqIEhvd2V2ZXIsIHdlIGNhbm5vdCBrbm93IHdoYXQgdGhlIGluZGV4IDIgY29ycmVzcG9uZHMgdG87IGl0IG1heSBiZSAiZmFtaWx5IG5hbWUiLAotICAgICAqICJsYWJlbCIgZm9yIG5vdywgYnV0IG1heSBiZSB0aGUgb3RoZXIgc29tZSBjb2x1bW4gaW4gdGhlIGZ1dHVyZS4gV2UgZG9uJ3QgaGF2ZQotICAgICAqIGNvbnZlbmllbnQgd2F5IHRvIGtub3cgdGhlIG9yaWdpbmFsIGRhdGEgc3RydWN0dXJlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgRW50aXR5SXRlcmF0b3IgcXVlcnlFbnRpdGllcyhVcmkgdXJpLAotICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICBtVGVzdENhc2UuYXNzZXJ0VHJ1ZSh1cmkgIT0gbnVsbCk7Ci0gICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRUcnVlKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQ09OVEVOVC5lcXVhbHModXJpLmdldFNjaGVtZSgpKSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhdXRob3JpdHkgPSB1cmkuZ2V0QXV0aG9yaXR5KCk7Ci0gICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRUcnVlKFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLmdldEF1dGhvcml0eSgpLmVxdWFscyhhdXRob3JpdHkpKTsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydFRydWUoKERhdGEuQ09OVEFDVF9JRCArICI9PyIpLmVxdWFscyhzZWxlY3Rpb24pKTsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydEVxdWFscygxLCBzZWxlY3Rpb25BcmdzLmxlbmd0aCk7Ci0gICAgICAgIGZpbmFsIGludCBpZCA9IEludGVnZXIucGFyc2VJbnQoc2VsZWN0aW9uQXJnc1swXSk7Ci0gICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRUcnVlKGlkID49IDAgJiYgaWQgPCBtQ29udGFjdEVudHJ5TGlzdC5zaXplKCkpOwotCi0gICAgICAgIHJldHVybiBuZXcgTW9ja0VudGl0eUl0ZXJhdG9yKG1Db250YWN0RW50cnlMaXN0LmdldChpZCkuZ2V0TGlzdCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KFVyaSB1cmksU3RyaW5nW10gcHJvamVjdGlvbiwKLSAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIpIHsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydFRydWUoVkNhcmRDb21wb3Nlci5DT05UQUNUU19URVNUX0NPTlRFTlRfVVJJLmVxdWFscyh1cmkpKTsKLSAgICAgICAgLy8gSW4gdGhpcyB0ZXN0LCBmb2xsb3dpbmcgYXJndW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkLgotICAgICAgICBtVGVzdENhc2UuYXNzZXJ0TnVsbChzZWxlY3Rpb24pOwotICAgICAgICBtVGVzdENhc2UuYXNzZXJ0TnVsbChzZWxlY3Rpb25BcmdzKTsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydE51bGwoc29ydE9yZGVyKTsKLQotICAgICAgICByZXR1cm4gbmV3IE1vY2tDdXJzb3IoKSB7Ci0gICAgICAgICAgICBpbnQgbUN1cnJlbnRQb3NpdGlvbiA9IC0xOwotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Db250YWN0RW50cnlMaXN0LnNpemUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBtb3ZlVG9GaXJzdCgpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFBvc2l0aW9uID0gMDsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBtb3ZlVG9OZXh0KCkgewotICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFBvc2l0aW9uIDwgbUNvbnRhY3RFbnRyeUxpc3Quc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UG9zaXRpb24rKzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0JlZm9yZUZpcnN0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQ3VycmVudFBvc2l0aW9uIDwgMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyTGFzdCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUN1cnJlbnRQb3NpdGlvbiA+PSBtQ29udGFjdEVudHJ5TGlzdC5zaXplKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGludCBnZXRDb2x1bW5JbmRleChTdHJpbmcgY29sdW1uTmFtZSkgewotICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRFcXVhbHMoQ29udGFjdHMuX0lELCBjb2x1bW5OYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgaW50IGdldEludChpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuYXNzZXJ0RXF1YWxzKDAsIGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuYXNzZXJ0VHJ1ZShtQ3VycmVudFBvc2l0aW9uID49IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG1DdXJyZW50UG9zaXRpb24gPCBtQ29udGFjdEVudHJ5TGlzdC5zaXplKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBtQ3VycmVudFBvc2l0aW9uOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJbnQoY29sdW1uSW5kZXgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvSW1wb3J0VGVzdFJlc29sdmVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvSW1wb3J0VGVzdFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NjNkYTkuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0ltcG9ydFRlc3RSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJPcGVyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlclJlc3VsdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FbWFpbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkV2ZW50OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuR3JvdXBNZW1iZXJzaGlwOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuSW07Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5OaWNrbmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Pcmdhbml6YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob3RvOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUmVsYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkTmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5XZWJzaXRlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0czsKLWltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi0vKiBwYWNrYWdlICovIGNsYXNzIEltcG9ydFRlc3RSZXNvbHZlciBleHRlbmRzIE1vY2tDb250ZW50UmVzb2x2ZXIgewotICAgIGZpbmFsIEltcG9ydFRlc3RQcm92aWRlciBtUHJvdmlkZXI7Ci0KLSAgICBwdWJsaWMgSW1wb3J0VGVzdFJlc29sdmVyKFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0gICAgICAgIG1Qcm92aWRlciA9IG5ldyBJbXBvcnRUZXN0UHJvdmlkZXIodGVzdENhc2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb250ZW50UHJvdmlkZXJSZXN1bHRbXSBhcHBseUJhdGNoKFN0cmluZyBhdXRob3JpdHksCi0gICAgICAgICAgICBBcnJheUxpc3Q8Q29udGVudFByb3ZpZGVyT3BlcmF0aW9uPiBvcGVyYXRpb25zKSB7Ci0gICAgICAgIGVxdWFsc1N0cmluZyhhdXRob3JpdHksIFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLnRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gbVByb3ZpZGVyLmFwcGx5QmF0Y2gob3BlcmF0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRXhwZWN0ZWRDb250ZW50VmFsdWVzKENvbnRlbnRWYWx1ZXMgZXhwZWN0ZWRDb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIG1Qcm92aWRlci5hZGRFeHBlY3RlZENvbnRlbnRWYWx1ZXMoZXhwZWN0ZWRDb250ZW50VmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7Ci0gICAgICAgIG1Qcm92aWRlci52ZXJpZnkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFsc1N0cmluZyhTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLSAgICAgICAgaWYgKGEgPT0gbnVsbCB8fCBhLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBiID09IG51bGwgfHwgYi5sZW5ndGgoKSA9PSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGEuZXF1YWxzKGIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKiBwYWNrYWdlICovIGNsYXNzIEltcG9ydFRlc3RQcm92aWRlciBleHRlbmRzIE1vY2tDb250ZW50UHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNLbm93bk1pbWVUeXBlU2V0ID0KLSAgICAgICAgbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgIE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFLCBQaG9uZS5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBFbWFpbC5DT05URU5UX0lURU1fVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBJbS5DT05URU5UX0lURU1fVFlQRSwgT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgIEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFLCBQaG90by5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBOb3RlLkNPTlRFTlRfSVRFTV9UWVBFLCBXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgIFJlbGF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFLCBFdmVudC5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBHcm91cE1lbWJlcnNoaXAuQ09OVEVOVF9JVEVNX1RZUEUpKTsKLQotICAgIGZpbmFsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248Q29udGVudFZhbHVlcz4+IG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBUZXN0Q2FzZSBtVGVzdENhc2U7Ci0KLSAgICBwdWJsaWMgSW1wb3J0VGVzdFByb3ZpZGVyKFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0gICAgICAgIG1UZXN0Q2FzZSA9IHRlc3RDYXNlOwotICAgICAgICBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlcyA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbGxlY3Rpb248Q29udGVudFZhbHVlcz4+KCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGFjY2VwdGFuYmxlTWltZVR5cGUgOiBzS25vd25NaW1lVHlwZVNldCkgewotICAgICAgICAgICAgLy8gRG8gbm90IHVzZSBIYXNoU2V0IHNpbmNlIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGNoYW5nZXMgdGhlIGNvbnRlbnQgb2YKLSAgICAgICAgICAgIC8vIENvbnRlbnRWYWx1ZXMgYWZ0ZXIgdGhlIGluc2VydGlvbiwgd2hpY2ggbWFrZSB0aGUgcmVzdWx0IG9mIGhhc2hDb2RlKCkKLSAgICAgICAgICAgIC8vIGNoYW5nZXMuLi4KLSAgICAgICAgICAgIG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgYWNjZXB0YW5ibGVNaW1lVHlwZSwgbmV3IEFycmF5TGlzdDxDb250ZW50VmFsdWVzPigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEV4cGVjdGVkQ29udGVudFZhbHVlcyhDb250ZW50VmFsdWVzIGV4cGVjdGVkQ29udGVudFZhbHVlcykgewotICAgICAgICBmaW5hbCBTdHJpbmcgbWltZVR5cGUgPSBleHBlY3RlZENvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRGF0YS5NSU1FVFlQRSk7Ci0gICAgICAgIGlmICghc0tub3duTWltZVR5cGVTZXQuY29udGFpbnMobWltZVR5cGUpKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbChTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiVW5rbm93IE1pbWVUeXBlICVzIGluIHRoZSB0ZXN0IGNvZGUuIFRlc3QgY29kZSBzaG91bGQgYmUgYnJva2VuLiIsCi0gICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uID0KLSAgICAgICAgICAgICAgICBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlcy5nZXQobWltZVR5cGUpOwotICAgICAgICBjb250ZW50VmFsdWVzQ29sbGVjdGlvbi5hZGQoZXhwZWN0ZWRDb250ZW50VmFsdWVzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29udGVudFByb3ZpZGVyUmVzdWx0W10gYXBwbHlCYXRjaCgKLSAgICAgICAgICAgIEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+IG9wZXJhdGlvbnMpIHsKLSAgICAgICAgaWYgKG9wZXJhdGlvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIlRoZXJlIGlzIG5vIG9wZXJhdGlvbi4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCBzaXplID0gb3BlcmF0aW9ucy5zaXplKCk7Ci0gICAgICAgIENvbnRlbnRQcm92aWRlclJlc3VsdFtdIGZha2VSZXN1bHRBcnJheSA9IG5ldyBDb250ZW50UHJvdmlkZXJSZXN1bHRbc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBVcmkgdXJpID0gVXJpLndpdGhBcHBlbmRlZFBhdGgoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkksIFN0cmluZy52YWx1ZU9mKGkpKTsKLSAgICAgICAgICAgIGZha2VSZXN1bHRBcnJheVtpXSA9IG5ldyBDb250ZW50UHJvdmlkZXJSZXN1bHQodXJpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24gb3BlcmF0aW9uID0gb3BlcmF0aW9ucy5nZXQoaSk7Ci0gICAgICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBvcGVyYXRpb24ucmVzb2x2ZVZhbHVlQmFja1JlZmVyZW5jZXMoCi0gICAgICAgICAgICAgICAgICAgIGZha2VSZXN1bHRBcnJheSwgaSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbiBvcGVyYXRpb24gPSBvcGVyYXRpb25zLmdldChpKTsKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgYWN0dWFsQ29udGVudFZhbHVlcyA9IG9wZXJhdGlvbi5yZXNvbHZlVmFsdWVCYWNrUmVmZXJlbmNlcygKLSAgICAgICAgICAgICAgICAgICAgZmFrZVJlc3VsdEFycmF5LCBpKTsKLSAgICAgICAgICAgIGZpbmFsIFVyaSB1cmkgPSBvcGVyYXRpb24uZ2V0VXJpKCk7Ci0gICAgICAgICAgICBpZiAodXJpLmVxdWFscyhSYXdDb250YWN0cy5DT05URU5UX1VSSSkpIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuYXNzZXJ0TnVsbChhY3R1YWxDb250ZW50VmFsdWVzLmdldChSYXdDb250YWN0cy5BQ0NPVU5UX05BTUUpKTsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuYXNzZXJ0TnVsbChhY3R1YWxDb250ZW50VmFsdWVzLmdldChSYXdDb250YWN0cy5BQ0NPVU5UX1RZUEUpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodXJpLmVxdWFscyhEYXRhLkNPTlRFTlRfVVJJKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtaW1lVHlwZSA9IGFjdHVhbENvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRGF0YS5NSU1FVFlQRSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzS25vd25NaW1lVHlwZVNldC5jb250YWlucyhtaW1lVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBNaW1lVHlwZSAlcy4gUHJvYmFibHkgYWRkZWQgYWZ0ZXIgZGV2ZWxvcGluZyB0aGlzIHRlc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBkYXRhIG1lYW5pbmdsZXNzIGluIHRoaXMgdW5pdCB0ZXN0cy4KLSAgICAgICAgICAgICAgICAvLyBTcGVjaWZpY2FsbHksIERhdGEuREFUQTEgLSBEQVRBNyBhcmUgc2V0IHRvIG51bGwgb3IgZW1wdHkgU3RyaW5nCi0gICAgICAgICAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQsIGJ1dCBpdCBtYXkgY2hhbmdlIGRlcGVuZGluZyBvbiBob3cKLSAgICAgICAgICAgICAgICAvLyByZXNvbHZlci1yZWxhdGVkIGNvZGUgaGFuZGxlcyBpdC4KLSAgICAgICAgICAgICAgICAvLyBIZXJlLCB3ZSBpZ25vcmUgdGhlc2UgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50IHNwZWNzIGFuZAotICAgICAgICAgICAgICAgIC8vIGp1c3QgY2hlY2sgd2hldGhlciB2Q2FyZCBpbXBvcnRlciBjb3JyZWN0bHkgaW5zZXJ0cyByZWxsZXZlbnQgZGF0YS4KLSAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBrZXlUb0JlUmVtb3ZlZCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IGFjdHVhbENvbnRlbnRWYWx1ZXMudmFsdWVTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCBUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZS50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAga2V5VG9CZVJlbW92ZWQuYWRkKGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXk6IGtleVRvQmVSZW1vdmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdHVhbENvbnRlbnRWYWx1ZXMucmVtb3ZlKGtleSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIGZvciB0ZXN0aW5nCi0gICAgICAgICAgICAgICAgTG9nLmQoIkBAQCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJNaW1lVHlwZTogJXMsIGRhdGE6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUsIGFjdHVhbENvbnRlbnRWYWx1ZXMudG9TdHJpbmcoKSkpOyAqLwotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBSQVdfQ09OVEFDVF9JRCBlbnRyeSBqdXN0IGZvciBzYWZldHksIHNpbmNlIHdlIGRvIG5vdCBjYXJlCi0gICAgICAgICAgICAgICAgLy8gaG93IHJlc29sdmVyLXJlbGF0ZWQgY29kZSBoYW5kbGVzIHRoZSBlbnRyeSBpbiB0aGlzIHVuaXQgdGVzdCwKLSAgICAgICAgICAgICAgICBpZiAoYWN0dWFsQ29udGVudFZhbHVlcy5jb250YWluc0tleShEYXRhLlJBV19DT05UQUNUX0lEKSkgewotICAgICAgICAgICAgICAgICAgICBhY3R1YWxDb250ZW50VmFsdWVzLnJlbW92ZShEYXRhLlJBV19DT05UQUNUX0lEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzQ29sbGVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzLmdldChtaW1lVHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiQ29udGVudFZhbHVlcyBmb3IgTWltZVR5cGUgIiArIG1pbWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBleHBlY3RlZCBhdCBhbGwgKCIgKyBhY3R1YWxDb250ZW50VmFsdWVzICsgIikiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBjaGVja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGV4cGVjdGVkQ29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qZm9yIHRlc3RpbmcKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoIkBAQCIsICJleHBlY3RlZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoZXhwZWN0ZWRDb250ZW50VmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKCJAQEAiLCAiYWN0dWFsICA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnZlcnRUb0Vhc2lseVJlYWRhYmxlU3RyaW5nKGFjdHVhbENvbnRlbnRWYWx1ZXMpKTsqLwotICAgICAgICAgICAgICAgICAgICBpZiAoZXF1YWxzRm9yQ29udGVudFZhbHVlcyhleHBlY3RlZENvbnRlbnRWYWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsQ29udGVudFZhbHVlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRUcnVlKGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uLnJlbW92ZShleHBlY3RlZENvbnRlbnRWYWx1ZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFjaGVja2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJVbmV4cGVjdGVkOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoYWN0dWFsQ29udGVudFZhbHVlcykpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG5FeHBlY3RlZDogIik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBleHBlY3RlZENvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoZXhwZWN0ZWRDb250ZW50VmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJVbmV4cGVjdGVkIFVyaSBoYXMgY29tZTogIiArIHVyaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIHJldHVybiBmYWtlUmVzdWx0QXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmb3IgKENvbGxlY3Rpb248Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0NvbGxlY3Rpb24gOgotICAgICAgICAgICAgICAgIG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgZXhwZWN0ZWRDb250ZW50VmFsdWVzOiBjb250ZW50VmFsdWVzQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNvbnZlcnRUb0Vhc2lseVJlYWRhYmxlU3RyaW5nKGV4cGVjdGVkQ29udGVudFZhbHVlcykpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChidWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZhaWxNc2cgPQotICAgICAgICAgICAgICAgICJUaGVyZSBpcyhhcmUpIHJlbWFpbmluZyBleHBlY3RlZCBDb250ZW50VmFsdWVzIGluc3RhbmNlKHMpOiBcbiIKLSAgICAgICAgICAgICAgICAgICAgKyBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbChmYWlsTXNnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIHByaW50IENvbnRlbnRWYWx1ZXMgd2hvc2UgY29udGVudCBpcyBwcmludGVkIHdpdGggc29ydGVkIGtleXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAibnVsbCI7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIG1pbWVUeXBlVmFsdWUgPSAiIjsKLSAgICAgICAgU29ydGVkTWFwPFN0cmluZywgU3RyaW5nPiBzb3J0ZWRNYXAgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBjb250ZW50VmFsdWVzLnZhbHVlU2V0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWVTdHJpbmcgPSAodmFsdWUgIT0gbnVsbCA/IHZhbHVlLnRvU3RyaW5nKCkgOiBudWxsKTsKLSAgICAgICAgICAgIGlmIChEYXRhLk1JTUVUWVBFLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgbWltZVR5cGVWYWx1ZSA9IHZhbHVlU3RyaW5nOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChrZXkpOwotICAgICAgICAgICAgICAgIHNvcnRlZE1hcC5wdXQoa2V5LCB2YWx1ZVN0cmluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoRGF0YS5NSU1FVFlQRSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCc9Jyk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKG1pbWVUeXBlVmFsdWUpOwotICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IHNvcnRlZE1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGtleSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiPVwiIik7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCh2YWx1ZSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnIicpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbHNGb3JDb250ZW50VmFsdWVzKAotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBleHBlY3RlZCwgQ29udGVudFZhbHVlcyBhY3R1YWwpIHsKLSAgICAgICAgaWYgKGV4cGVjdGVkID09IGFjdHVhbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWQgPT0gbnVsbCB8fCBhY3R1YWwgPT0gbnVsbCB8fCBleHBlY3RlZC5zaXplKCkgIT0gYWN0dWFsLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBleHBlY3RlZC52YWx1ZVNldCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKCFhY3R1YWwuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGJ5dGVbXSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBhY3R1YWxWYWx1ZSA9IGFjdHVhbC5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMoKGJ5dGVbXSl2YWx1ZSwgKGJ5dGVbXSlhY3R1YWxWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXZhbHVlLmVxdWFscyhhY3R1YWwuZ2V0KGtleSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvTGluZVZlcmlmaWVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvTGluZVZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZjE1ZmQ3Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9MaW5lVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29tcG9zZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1jbGFzcyBMaW5lVmVyaWZpZXIgaW1wbGVtZW50cyBWQ2FyZENvbXBvc2VyLk9uZUVudHJ5SGFuZGxlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUZXN0Q2FzZSBtVGVzdENhc2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8TGluZVZlcmlmaWVyRWxlbT4gbUxpbmVWZXJpZmllckVsZW1MaXN0OwotICAgIHByaXZhdGUgaW50IG1WQ2FyZFR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgaW5kZXg7Ci0KLSAgICBwdWJsaWMgTGluZVZlcmlmaWVyKFRlc3RDYXNlIHRlc3RDYXNlLCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1UZXN0Q2FzZSA9IHRlc3RDYXNlOwotICAgICAgICBtTGluZVZlcmlmaWVyRWxlbUxpc3QgPSBuZXcgQXJyYXlMaXN0PExpbmVWZXJpZmllckVsZW0+KCk7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIExpbmVWZXJpZmllckVsZW0gYWRkTGluZVZlcmlmaWVyRWxlbSgpIHsKLSAgICAgICAgTGluZVZlcmlmaWVyRWxlbSBsaW5lVmVyaWZpZXIgPSBuZXcgTGluZVZlcmlmaWVyRWxlbShtVGVzdENhc2UsIG1WQ2FyZFR5cGUpOwotICAgICAgICBtTGluZVZlcmlmaWVyRWxlbUxpc3QuYWRkKGxpbmVWZXJpZmllcik7Ci0gICAgICAgIHJldHVybiBsaW5lVmVyaWZpZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KFN0cmluZyB2Y2FyZCkgewotICAgICAgICBpZiAoaW5kZXggPj0gbUxpbmVWZXJpZmllckVsZW1MaXN0LnNpemUoKSkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIkluc3VmZmljaWVudCBudW1iZXIgb2YgTGluZVZlcmlmaWVyICgiICsgaW5kZXggKyAiKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGluZVZlcmlmaWVyRWxlbSBsaW5lVmVyaWZpZXIgPSBtTGluZVZlcmlmaWVyRWxlbUxpc3QuZ2V0KGluZGV4KTsKLSAgICAgICAgbGluZVZlcmlmaWVyLnZlcmlmeSh2Y2FyZCk7Ci0KLSAgICAgICAgaW5kZXgrKzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBvbkVudHJ5Q3JlYXRlZChTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgdmVyaWZ5KHZjYXJkKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gb25Jbml0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblRlcm1pbmF0ZSgpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvTGluZVZlcmlmaWVyRWxlbS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0xpbmVWZXJpZmllckVsZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIzYjI5Yi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvTGluZVZlcmlmaWVyRWxlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSAqIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotY2xhc3MgTGluZVZlcmlmaWVyRWxlbSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUZXN0Q2FzZSBtVGVzdENhc2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gbUV4cGVjdGVkTGluZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzVjMwOwotCi0gICAgcHVibGljIExpbmVWZXJpZmllckVsZW0oVGVzdENhc2UgdGVzdENhc2UsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVRlc3RDYXNlID0gdGVzdENhc2U7Ci0gICAgICAgIG1Jc1YzMCA9IFZDYXJkQ29uZmlnLmlzVjMwKHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpbmVWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWQoZmluYWwgU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShsaW5lKSkgewotICAgICAgICAgICAgbUV4cGVjdGVkTGluZUxpc3QuYWRkKGxpbmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShmaW5hbCBTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gbGluZUFycmF5ID0gdmNhcmQuc3BsaXQoIlxccj9cXG4iKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGxpbmVBcnJheS5sZW5ndGg7Ci0gICAgICAgIGJvb2xlYW4gYmVnaW5FeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBlbmRFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiB2ZXJzaW9uRXhpc3RzID0gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBsaW5lQXJyYXlbaV07Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobGluZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCJCRUdJTjpWQ0FSRCIuZXF1YWxzSWdub3JlQ2FzZShsaW5lKSkgewotICAgICAgICAgICAgICAgIGlmIChiZWdpbkV4aXN0cykgewotICAgICAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiTXVsdGlwbGUgXCJCRUdJTjpWQ0FSRFwiIGxpbmUgZm91bmQiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiZWdpbkV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIkVORDpWQ0FSRCIuZXF1YWxzSWdub3JlQ2FzZShsaW5lKSkgewotICAgICAgICAgICAgICAgIGlmIChlbmRFeGlzdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIk11bHRpcGxlIFwiRU5EOlZDQVJEXCIgbGluZSBmb3VuZCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZEV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKG1Jc1YzMCA/ICJWRVJTSU9OOjMuMCIgOiAiVkVSU0lPTjoyLjEiKS5lcXVhbHNJZ25vcmVDYXNlKGxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZlcnNpb25FeGlzdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIk11bHRpcGxlIFZFUlNJT04gbGluZSArIGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbkV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFiZWdpbkV4aXN0cykgewotICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJQcm9wZXJ0eSBvdGhlciB0aGFuIEJFR0lOIGNhbWUgYmVmb3JlIEJFR0lOIHByb3BlcnR5OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGxpbmUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlbmRFeGlzdHMpIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiUHJvcGVydHkgb3RoZXIgdGhhbiBFTkQgY2FtZSBhZnRlciBFTkQgcHJvcGVydHk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbGluZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IG1FeHBlY3RlZExpbmVMaXN0LmluZGV4T2YobGluZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIG1FeHBlY3RlZExpbmVMaXN0LnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJVbmV4cGVjdGVkIGxpbmU6ICIgKyBsaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbUV4cGVjdGVkTGluZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgZXhwZWN0ZWRMaW5lIDogbUV4cGVjdGVkTGluZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGV4cGVjdGVkTGluZSk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIkV4cGVjdGVkIGxpbmUocykgbm90IGZvdW5kOiIgKyBidWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvUHJvcGVydHlOb2RlLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvUHJvcGVydHlOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMWY2ZDIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1Byb3BlcnR5Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFByZXZpb3VzbHkgdXNlZCBpbiBtYWluIHZDYXJkIGhhbmRsaW5nIGNvZGUgYnV0IG5vdyBleGlzdHMgb25seSBmb3IgdGVzdGluZy4KLSAqCi0gKiBFc3BlY2lhbGx5IHVzZWZ1bCBmb3IgdGVzdGluZyBwYXJzZXIgY29kZSAoVkNhcmRQYXJzZXIpLCBzaW5jZSBhbGwgcHJvcGVydGllcyBjYW4gYmUKLSAqIGNoZWNrZWQgdmlhIHRoaXMgY2xhc3MgdW5saWtlIHtAbGluayBWQ2FyZEVudHJ5fSwgd2hpY2ggb25seSBlbWl0cyB0aGUgcmVzdWx0IG9mCi0gKiBpbnRlcnByZXRhdGlvbiBvZiB0aGUgY29udGVudCBvZiBlYWNoIHZDYXJkLiBXZSBjYW5ub3Qga25vdyB3aGV0aGVyIHZDYXJkIHBhcnNlciBvcgotICogQ29udGFjdFN0cnVjdCBpcyB3cm9uZyB3aXRob3V0aCB0aGlzIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlOb2RlIHsKLSAgICBwdWJsaWMgU3RyaW5nIHByb3BOYW1lOwotICAgIHB1YmxpYyBTdHJpbmcgcHJvcFZhbHVlOwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gcHJvcFZhbHVlX3ZlY3RvcjsKLQotICAgIC8qKiBTdG9yZSB2YWx1ZSBhcyBieXRlW10sYWZ0ZXIgZGVjb2RlLgotICAgICAqIFVzZWQgd2hlbiBwcm9wVmFsdWUgaXMgZW5jb2RlZCBieSBzb21ldGhpbmcgbGlrZSBCQVNFNjQsIFFVT1RFRC1QUklOVEFCTEUsIGV0Yy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYnl0ZVtdIHByb3BWYWx1ZV9ieXRlczsKLQotICAgIC8qKiBwYXJhbSBzdG9yZToga2V5PXBhcmFtVHlwZSwgdmFsdWU9cGFyYW1WYWx1ZQotICAgICAqIE5vdGUgdGhhdCBjdXJyZW50bHkgUHJvcGVydHlOb2RlIGNsYXNzIGRvZXMgbm90IHN1cHBvcnQgbXVsdGlwbGUgcGFyYW0tdmFsdWVzCi0gICAgICogZGVmaW5lZCBpbiB2Q2FyZCAzLjAgKFNlZSBhbHNvIFJGQyAyNDI2KS4gbXVsdGlwbGUtdmFsdWVzIGFyZSBzdG9yZWQgYXMKLSAgICAgKiBvbmUgU3RyaW5nIHZhbHVlIGxpa2UgIkEsQiIsIG5vdCBbIkEiLCAiQiJdLi4uCi0gICAgICogVE9ETzogZml4IHRoaXMuIAotICAgICAqLwotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzIHBhcmFtTWFwOwotCi0gICAgLyoqIE9ubHkgZm9yIFRZUEU9Pz8/IHBhcmFtIHN0b3JlLiAqLwotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBwYXJhbU1hcF9UWVBFOwotCi0gICAgLyoqIFN0b3JlIGdyb3VwIHZhbHVlcy4gVXNlZCBvbmx5IGluIFZDYXJkLiAqLwotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBwcm9wR3JvdXBTZXQ7Ci0gICAgCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZSgpIHsKLSAgICAgICAgcHJvcE5hbWUgPSAiIjsKLSAgICAgICAgcHJvcFZhbHVlID0gIiI7Ci0gICAgICAgIHByb3BWYWx1ZV92ZWN0b3IgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgcGFyYW1NYXAgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBwYXJhbU1hcF9UWVBFID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBwcm9wR3JvdXBTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGUoCi0gICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVfdmVjdG9yLAotICAgICAgICAgICAgYnl0ZVtdIHByb3BWYWx1ZV9ieXRlcywgQ29udGVudFZhbHVlcyBwYXJhbU1hcCwgU2V0PFN0cmluZz4gcGFyYW1NYXBfVFlQRSwKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IHByb3BHcm91cFNldCkgewotICAgICAgICBpZiAocHJvcE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wcm9wTmFtZSA9IHByb3BOYW1lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wcm9wTmFtZSA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wcm9wVmFsdWUgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BWYWx1ZSA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wVmFsdWVfdmVjdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHJvcFZhbHVlX3ZlY3RvciA9IHByb3BWYWx1ZV92ZWN0b3I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BWYWx1ZV92ZWN0b3IgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnByb3BWYWx1ZV9ieXRlcyA9IHByb3BWYWx1ZV9ieXRlczsKLSAgICAgICAgaWYgKHBhcmFtTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucGFyYW1NYXAgPSBwYXJhbU1hcDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucGFyYW1NYXAgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbU1hcF9UWVBFICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucGFyYW1NYXBfVFlQRSA9IHBhcmFtTWFwX1RZUEU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtTWFwX1RZUEUgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BHcm91cFNldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BHcm91cFNldCA9IHByb3BHcm91cFNldDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucHJvcEdyb3VwU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIC8vIHZDYXJkIG1heSBjb250YWluIG1vcmUgdGhhbiBvbmUgc2FtZSBsaW5lIGluIG9uZSBlbnRyeSwgd2hpbGUgSGFzaFNldCBvciBhbnkgb3RoZXIKLSAgICAgICAgLy8gbGlicmFyeSB3aGljaCB1dGlsaXplIGhhc2hDb2RlKCkgZG9lcyBub3QgaG9ub3IgdGhhdCwgc28gaW50ZW50aW9uYWxseSB0aHJvdyBhbgotICAgICAgICAvLyBFeGNlcHRpb24uCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiUHJvcGVydHlOb2RlIGRvZXMgbm90IHByb3ZpZGUgaGFzaENvZGUoKSBpbXBsZW1lbnRhdGlvbiBpbnRlbnRpb25hbGx5LiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFByb3BlcnR5Tm9kZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgUHJvcGVydHlOb2RlIG5vZGUgPSAoUHJvcGVydHlOb2RlKW9iajsKLSAgICAgICAgCi0gICAgICAgIGlmIChwcm9wTmFtZSA9PSBudWxsIHx8ICFwcm9wTmFtZS5lcXVhbHMobm9kZS5wcm9wTmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmICghcGFyYW1NYXBfVFlQRS5lcXVhbHMobm9kZS5wYXJhbU1hcF9UWVBFKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKCFwYXJhbU1hcF9UWVBFLmVxdWFscyhub2RlLnBhcmFtTWFwX1RZUEUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXByb3BHcm91cFNldC5lcXVhbHMobm9kZS5wcm9wR3JvdXBTZXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvcFZhbHVlX2J5dGVzICE9IG51bGwgJiYgQXJyYXlzLmVxdWFscyhwcm9wVmFsdWVfYnl0ZXMsIG5vZGUucHJvcFZhbHVlX2J5dGVzKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIXByb3BWYWx1ZS5lcXVhbHMobm9kZS5wcm9wVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUaGUgdmFsdWUgaW4gcHJvcFZhbHVlX3ZlY3RvciBpcyBub3QgZGVjb2RlZCBldmVuIGlmIGl0IHNob3VsZCBiZQotICAgICAgICAgICAgLy8gZGVjb2RlZCBieSBCQVNFNjQgb3IgUVVPVEVELVBSSU5UQUJMRS4gV2hlbiB0aGUgc2l6ZSBvZiBwcm9wVmFsdWVfdmVjdG9yCi0gICAgICAgICAgICAvLyBpcyAxLCB0aGUgZW5jb2RlZCB2YWx1ZSBpcyBzdG9yZWQgaW4gcHJvcFZhbHVlLCBzbyB3ZSBkbyBub3QgaGF2ZSB0bwotICAgICAgICAgICAgLy8gY2hlY2sgaXQuCi0gICAgICAgICAgICByZXR1cm4gKHByb3BWYWx1ZV92ZWN0b3IuZXF1YWxzKG5vZGUucHJvcFZhbHVlX3ZlY3RvcikgfHwKLSAgICAgICAgICAgICAgICAgICAgcHJvcFZhbHVlX3ZlY3Rvci5zaXplKCkgPT0gMSB8fAotICAgICAgICAgICAgICAgICAgICBub2RlLnByb3BWYWx1ZV92ZWN0b3Iuc2l6ZSgpID09IDEpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJwcm9wTmFtZTogIik7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKHByb3BOYW1lKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgcGFyYW1NYXA6ICIpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChwYXJhbU1hcC50b1N0cmluZygpKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgcGFyYW1NYXBfVFlQRTogWyIpOwotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChTdHJpbmcgZWxlbSA6IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyInKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGVsZW0pOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyInKTsKLSAgICAgICAgfQotICAgICAgICBidWlsZGVyLmFwcGVuZCgiXSIpOwotICAgICAgICBpZiAoIXByb3BHcm91cFNldC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHByb3BHcm91cFNldDogWyIpOwotICAgICAgICAgICAgZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgZWxlbSA6IHByb3BHcm91cFNldCkgewotICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnIicpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGVsZW0pOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCciJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wVmFsdWVfdmVjdG9yICE9IG51bGwgJiYgcHJvcFZhbHVlX3ZlY3Rvci5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBwcm9wVmFsdWVfdmVjdG9yIHNpemU6ICIpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocHJvcFZhbHVlX3ZlY3Rvci5zaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wVmFsdWVfYnl0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgcHJvcFZhbHVlX2J5dGVzIHNpemU6ICIpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocHJvcFZhbHVlX2J5dGVzLmxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgcHJvcFZhbHVlOiBcIiIpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChwcm9wVmFsdWUpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgiXCIiKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvUHJvcGVydHlOb2Rlc1ZlcmlmaWVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvUHJvcGVydHlOb2Rlc1ZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZGQwNzQuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1Byb3BlcnR5Tm9kZXNWZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyX1YyMTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcl9WMzA7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKiBwYWNrYWdlICovIGNsYXNzIFByb3BlcnR5Tm9kZXNWZXJpZmllciBleHRlbmRzIFZOb2RlQnVpbGRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0+IG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtTGlzdDsKLSAgICBwcml2YXRlIGZpbmFsIEFuZHJvaWRUZXN0Q2FzZSBtQW5kcm9pZFRlc3RDYXNlOwotICAgIHByaXZhdGUgaW50IG1JbmRleDsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXIoQW5kcm9pZFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0gICAgICAgIG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbT4oKTsKLSAgICAgICAgbUFuZHJvaWRUZXN0Q2FzZSA9IHRlc3RDYXNlOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKSB7Ci0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG5ldyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKG1BbmRyb2lkVGVzdENhc2UpOwotICAgICAgICBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbUxpc3QuYWRkKGVsZW0pOwotICAgICAgICByZXR1cm4gZWxlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoaW50IHJlc0lkLCBpbnQgdkNhcmRUeXBlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZlcmlmeShtQW5kcm9pZFRlc3RDYXNlLmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5vcGVuUmF3UmVzb3VyY2UocmVzSWQpLCB2Q2FyZFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShpbnQgcmVzSWQsIGludCB2Q2FyZFR5cGUsIGZpbmFsIFZDYXJkUGFyc2VyIHZDYXJkUGFyc2VyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZlcmlmeShtQW5kcm9pZFRlc3RDYXNlLmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5vcGVuUmF3UmVzb3VyY2UocmVzSWQpLAotICAgICAgICAgICAgICAgIHZDYXJkVHlwZSwgdkNhcmRQYXJzZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShJbnB1dFN0cmVhbSBpcywgaW50IHZDYXJkVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFZDYXJkUGFyc2VyIHZDYXJkUGFyc2VyOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWMzAodkNhcmRUeXBlKSkgewotICAgICAgICAgICAgdkNhcmRQYXJzZXIgPSBuZXcgVkNhcmRQYXJzZXJfVjMwKHRydWUpOyAgLy8gVXNlIFN0cmljdFBhcnNpbmcuCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2Q2FyZFBhcnNlciA9IG5ldyBWQ2FyZFBhcnNlcl9WMjEoKTsKLSAgICAgICAgfQotICAgICAgICB2ZXJpZnkoaXMsIHZDYXJkVHlwZSwgdkNhcmRQYXJzZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShJbnB1dFN0cmVhbSBpcywgaW50IHZDYXJkVHlwZSwgZmluYWwgVkNhcmRQYXJzZXIgdkNhcmRQYXJzZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZDYXJkUGFyc2VyLnBhcnNlKGlzLCB0aGlzKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5kRW50cnkoKSB7Ci0gICAgICAgIHN1cGVyLmVuZEVudHJ5KCk7Ci0gICAgICAgIG1BbmRyb2lkVGVzdENhc2UuYXNzZXJ0VHJ1ZShtSW5kZXggPCBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgbUFuZHJvaWRUZXN0Q2FzZS5hc3NlcnRUcnVlKG1JbmRleCA8IHZOb2RlTGlzdC5zaXplKCkpOwotICAgICAgICBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbUxpc3QuZ2V0KG1JbmRleCkudmVyaWZ5KHZOb2RlTGlzdC5nZXQobUluZGV4KSk7Ci0gICAgICAgIG1JbmRleCsrOwotICAgIH0KLX0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHdoaWNoIHZlcmlmaWVzIGlucHV0IFZOb2RlLgotICoKLSAqIFRoaXMgY2xhc3MgZmlyc3QgY2hlY2tzIHdoZXRoZXIgZWFjaCBwcm9wZXJ0eU5vZGUgaW4gdGhlIFZOb2RlIGlzIGluIHRoZQotICogIm9yZGVyZWQgZXhwZWN0ZWQgcHJvcGVydHkgbGlzdCIuCi0gKiBJZiB0aGUgbm9kZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgIm9yZGVyZWQgbGlzdCIsIHRoZSBjbGFzcyByZWZlcnMgdG8KLSAqICJ1bm9yZGVyZCBleHBlY3RlZCBwcm9wZXJ0eSBzZXQiIGFuZCBjaGVja3MgdGhlIG5vZGUgaXMgZXhwZWN0ZWQgc29tZXdoZXJlLgotICovCi0vKiBwYWNrYWdlICovIGNsYXNzIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gewotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHlwZVNldCBleHRlbmRzIEhhc2hTZXQ8U3RyaW5nPiB7Ci0gICAgICAgIHB1YmxpYyBUeXBlU2V0KFN0cmluZyAuLi4gYXJyYXkpIHsKLSAgICAgICAgICAgIHN1cGVyKEFycmF5cy5hc0xpc3QoYXJyYXkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR3JvdXBTZXQgZXh0ZW5kcyBIYXNoU2V0PFN0cmluZz4gewotICAgICAgICBwdWJsaWMgR3JvdXBTZXQoU3RyaW5nIC4uLiBhcnJheSkgewotICAgICAgICAgICAgc3VwZXIoQXJyYXlzLmFzTGlzdChhcnJheSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgTGlzdDxQcm9wZXJ0eU5vZGU+PiBtT3JkZXJlZE5vZGVNYXA7Ci0gICAgLy8gSW50ZW50aW9uYWxseSB1c2UgQXJyYXlMaXN0IGluc3RlYWQgb2YgU2V0LCBhc3N1bWluZyB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZQotICAgIC8vIGV4YWN0bHkgc2FtZSBvYmplY3RzLgotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4gbVVub3JkZXJlZE5vZGVMaXN0OwotICAgIHByaXZhdGUgZmluYWwgVGVzdENhc2UgbVRlc3RDYXNlOwotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oVGVzdENhc2UgdGVzdENhc2UpIHsKLSAgICAgICAgbU9yZGVyZWROb2RlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFByb3BlcnR5Tm9kZT4+KCk7Ci0gICAgICAgIG1Vbm9yZGVyZWROb2RlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPigpOwotICAgICAgICBtVGVzdENhc2UgPSB0ZXN0Q2FzZTsKLSAgICB9Ci0KLSAgICAvLyBXaXRoT3JkZXIKLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoCi0gICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwgY29udGVudFZhbHVlcywgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKAotICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lLCBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIG51bGwsIHByb3BWYWx1ZUxpc3QsCi0gICAgICAgICAgICAgICAgbnVsbCwgY29udGVudFZhbHVlcywgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKAotICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLCBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb3BWYWx1ZUxpc3QsIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKAotICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lLCBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCkgewotICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcFZhbHVlID0gY29uY2F0aW5hdGVMaXN0V2l0aFNlbWlDb2xvbihwcm9wVmFsdWVMaXN0KTsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLnRvU3RyaW5nKCksIHByb3BWYWx1ZUxpc3QsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKFN0cmluZyBwcm9wTmFtZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgbnVsbCwgcHJvcFZhbHVlTGlzdCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBwYXJhbU1hcCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcCwgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgYnl0ZVtdIHByb3BWYWx1ZV9ieXRlcywKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSwgR3JvdXBTZXQgcHJvcEdyb3VwU2V0KSB7Ci0gICAgICAgIGlmIChwcm9wVmFsdWUgPT0gbnVsbCAmJiBwcm9wVmFsdWVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BWYWx1ZSA9IGNvbmNhdGluYXRlTGlzdFdpdGhTZW1pQ29sb24ocHJvcFZhbHVlTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgUHJvcGVydHlOb2RlIHByb3BlcnR5Tm9kZSA9IG5ldyBQcm9wZXJ0eU5vZGUocHJvcE5hbWUsCi0gICAgICAgICAgICAgICAgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBwcm9wVmFsdWVfYnl0ZXMsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXAsIHBhcmFtTWFwX1RZUEUsIHByb3BHcm91cFNldCk7Ci0gICAgICAgIExpc3Q8UHJvcGVydHlOb2RlPiBleHBlY3RlZE5vZGVMaXN0ID0gbU9yZGVyZWROb2RlTWFwLmdldChwcm9wTmFtZSk7Ci0gICAgICAgIGlmIChleHBlY3RlZE5vZGVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGV4cGVjdGVkTm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4oKTsKLSAgICAgICAgICAgIG1PcmRlcmVkTm9kZU1hcC5wdXQocHJvcE5hbWUsIGV4cGVjdGVkTm9kZUxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIGV4cGVjdGVkTm9kZUxpc3QuYWRkKHByb3BlcnR5Tm9kZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8vIFdpdGhvdXRPcmRlcgotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLCBudWxsLCBjb250ZW50VmFsdWVzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBudWxsLAotICAgICAgICAgICAgICAgIHByb3BWYWx1ZUxpc3QsIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb3BWYWx1ZUxpc3QsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBudWxsLCBwcm9wVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLCBudWxsLCBudWxsLCBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcFZhbHVlID0gY29uY2F0aW5hdGVMaXN0V2l0aFNlbWlDb2xvbihwcm9wVmFsdWVMaXN0KTsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvcFZhbHVlTGlzdCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBwYXJhbU1hcCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcCwgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBieXRlW10gcHJvcFZhbHVlX2J5dGVzLAotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBwYXJhbU1hcCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFLCBHcm91cFNldCBwcm9wR3JvdXBTZXQpIHsKLSAgICAgICAgaWYgKHByb3BWYWx1ZSA9PSBudWxsICYmIHByb3BWYWx1ZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcFZhbHVlID0gY29uY2F0aW5hdGVMaXN0V2l0aFNlbWlDb2xvbihwcm9wVmFsdWVMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBtVW5vcmRlcmVkTm9kZUxpc3QuYWRkKG5ldyBQcm9wZXJ0eU5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwKLSAgICAgICAgICAgICAgICBwcm9wVmFsdWVMaXN0LCBwcm9wVmFsdWVfYnl0ZXMsIHBhcmFtTWFwLCBwYXJhbU1hcF9UWVBFLCBwcm9wR3JvdXBTZXQpKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KFZOb2RlIHZub2RlKSB7Ci0gICAgICAgIGZvciAoUHJvcGVydHlOb2RlIGFjdHVhbE5vZGUgOiB2bm9kZS5wcm9wTGlzdCkgewotICAgICAgICAgICAgdmVyaWZ5Tm9kZShhY3R1YWxOb2RlLnByb3BOYW1lLCBhY3R1YWxOb2RlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1PcmRlcmVkTm9kZU1hcC5pc0VtcHR5KCkgfHwgIW1Vbm9yZGVyZWROb2RlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBleHBlY3RlZFByb3BzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKExpc3Q8UHJvcGVydHlOb2RlPiBub2RlcyA6IG1PcmRlcmVkTm9kZU1hcC52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlOb2RlIG5vZGUgOiBub2RlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkUHJvcHMuY29udGFpbnMobm9kZS5wcm9wTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkUHJvcHMuYWRkKG5vZGUucHJvcE5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChQcm9wZXJ0eU5vZGUgbm9kZSA6IG1Vbm9yZGVyZWROb2RlTGlzdCkgewotICAgICAgICAgICAgICAgIGlmICghZXhwZWN0ZWRQcm9wcy5jb250YWlucyhub2RlLnByb3BOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFByb3BzLmFkZChub2RlLnByb3BOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiRXhwZWN0ZWQgcHJvcGVydHkgIiArIEFycmF5cy50b1N0cmluZyhleHBlY3RlZFByb3BzLnRvQXJyYXkoKSkKLSAgICAgICAgICAgICAgICAgICAgKyAiIHdhcyBub3QgZm91bmQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Tm9kZShmaW5hbCBTdHJpbmcgcHJvcE5hbWUsIGZpbmFsIFByb3BlcnR5Tm9kZSBhY3R1YWxOb2RlKSB7Ci0gICAgICAgIExpc3Q8UHJvcGVydHlOb2RlPiBleHBlY3RlZE5vZGVMaXN0ID0gbU9yZGVyZWROb2RlTWFwLmdldChwcm9wTmFtZSk7Ci0gICAgICAgIGZpbmFsIGludCBzaXplID0gKGV4cGVjdGVkTm9kZUxpc3QgIT0gbnVsbCA/IGV4cGVjdGVkTm9kZUxpc3Quc2l6ZSgpIDogMCk7Ci0gICAgICAgIGlmIChzaXplID4gMCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eU5vZGUgZXhwZWN0ZWROb2RlID0gZXhwZWN0ZWROb2RlTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eU5vZGU+IGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eU5vZGU+KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkTm9kZS5wcm9wTmFtZS5lcXVhbHMocHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZE5vZGUuZXF1YWxzKGFjdHVhbE5vZGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZE5vZGVMaXN0LnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZE5vZGVMaXN0LnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9yZGVyZWROb2RlTWFwLnJlbW92ZShwcm9wTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdC5hZGQoZXhwZWN0ZWROb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vICJhY3R1YWxOb2RlIiBpcyBub3QgaW4gb3JkZXJlZCBleHBlY3RlZCBsaXN0LgotICAgICAgICAgICAgICAgIC8vIFRyeSBsb29raW5nIG92ZXIgdW5vcmRlcmVkIGV4cGVjdGVkIGxpc3QuCi0gICAgICAgICAgICAgICAgaWYgKHRyeUZvdW5kRXhwZWN0ZWROb2RlRnJvbVVub3JkZXJlZExpc3QoYWN0dWFsTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwcm9wTmFtZSBleGlzdHMgYnV0IHdpdGggZGlmZmVyZW50IHZhbHVlKHMpLgotICAgICAgICAgICAgICAgICAgICBmYWlsV2l0aEV4cGVjdGVkTm9kZUxpc3QocHJvcE5hbWUsIGFjdHVhbE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gZXhwZWN0ZWQgbm9kZSB3aXRoIHNhbWUgcHJvcE5hbWUuCi0gICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJVbmV4cGVjdGVkIHByb3BlcnR5IFwiIiArIHByb3BOYW1lICsgIlwiIGV4aXN0cy4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMaXN0PFByb3BlcnR5Tm9kZT4gZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPigpOwotICAgICAgICAgICAgaWYgKHRyeUZvdW5kRXhwZWN0ZWROb2RlRnJvbVVub3JkZXJlZExpc3QoYWN0dWFsTm9kZSwgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHByb3BOYW1lIGV4aXN0cyBidXQgd2l0aCBkaWZmZXJlbnQgdmFsdWUocykuCi0gICAgICAgICAgICAgICAgICAgIGZhaWxXaXRoRXhwZWN0ZWROb2RlTGlzdChwcm9wTmFtZSwgYWN0dWFsTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyBleHBlY3RlZCBub2RlIHdpdGggc2FtZSBwcm9wTmFtZS4KLSAgICAgICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgcHJvcGVydHkgXCIiICsgcHJvcE5hbWUgKyAiXCIgZXhpc3RzLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNvbmNhdGluYXRlTGlzdFdpdGhTZW1pQ29sb24oTGlzdDxTdHJpbmc+IGFycmF5KSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBmb3IgKFN0cmluZyBwcm9wVmFsdWVFbGVtIDogYXJyYXkpIHsKLSAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJzsnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQocHJvcFZhbHVlRWxlbSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHRyeUZvdW5kRXhwZWN0ZWROb2RlRnJvbVVub3JkZXJlZExpc3QoUHJvcGVydHlOb2RlIGFjdHVhbE5vZGUsCi0gICAgICAgICAgICBMaXN0PFByb3BlcnR5Tm9kZT4gZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BOYW1lID0gYWN0dWFsTm9kZS5wcm9wTmFtZTsKLSAgICAgICAgaW50IHVub3JkZXJlZExpc3RTaXplID0gbVVub3JkZXJlZE5vZGVMaXN0LnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bm9yZGVyZWRMaXN0U2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eU5vZGUgdW5vcmRlcmVkRXhwZWN0ZWROb2RlID0gbVVub3JkZXJlZE5vZGVMaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmICh1bm9yZGVyZWRFeHBlY3RlZE5vZGUucHJvcE5hbWUuZXF1YWxzKHByb3BOYW1lKSkgewotICAgICAgICAgICAgICAgIGlmICh1bm9yZGVyZWRFeHBlY3RlZE5vZGUuZXF1YWxzKGFjdHVhbE5vZGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Vbm9yZGVyZWROb2RlTGlzdC5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdC5hZGQodW5vcmRlcmVkRXhwZWN0ZWROb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZhaWxXaXRoRXhwZWN0ZWROb2RlTGlzdChTdHJpbmcgcHJvcE5hbWUsIFByb3BlcnR5Tm9kZSBhY3R1YWxOb2RlLAotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eU5vZGU+IGV4cGVjdGVkTm9kZUxpc3QpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChQcm9wZXJ0eU5vZGUgZXhwZWN0ZWROb2RlIDogZXhwZWN0ZWROb2RlTGlzdCkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoImV4cGVjdGVkOiAiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGV4cGVjdGVkTm9kZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJQcm9wZXJ0eSBcIiIgKyBwcm9wTmFtZSArICJcIiBoYXMgd3JvbmcgdmFsdWUuXG4iCi0gICAgICAgICAgICAgICAgKyBidWlsZGVyLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICArICIgIGFjdHVhbDogIiArIGFjdHVhbE5vZGUudG9TdHJpbmcoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRXhwb3J0ZXJUZXN0cy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRXhwb3J0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTYyYTkyNi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFeHBvcnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5JbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5pY2tuYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTm90ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk9yZ2FuaXphdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvdG87Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5SZWxhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLldlYnNpdGU7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtLlR5cGVTZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFRlc3RzIGZvciB0aGUgY29kZSByZWxhdGVkIHRvIHZDYXJkIGV4cG9ydGVyLCBpbmN1bGRpbmcgdkNhcmQgY29tcG9zZXIuCi0gKiBUaGlzIHRlc3QgY2xhc3MgZGVwZW5kcyBvbiB2Q2FyZCBpbXBvcnRlciBjb2RlLCBzbyBpZiB0ZXN0cyBmb3IgdkNhcmQgaW1wb3J0ZXIgZmFpbCwKLSAqIHRoZSByZXN1bHQgb2YgdGhpcyBjbGFzcyB3aWxsIG5vdCBiZSByZWxpYWJsZS4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkRXhwb3J0ZXJUZXN0cyBleHRlbmRzIFZDYXJkVGVzdHNCYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gc1Bob3RvQnl0ZUFycmF5ID0KLSAgICAgICAgVkNhcmRJbXBvcnRlclRlc3RzLnNQaG90b0J5dGVBcnJheUZvckNvbXBsaWNhdGVkQ2FzZTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVWMjEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWMjEpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFuZG8iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlJvaWQiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIlJvaWQgQW5kbyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsICJBbmRvO1JvaWQ7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiQW5kbyIsICJSb2lkIiwgIiIsICIiLCAiIikpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVCYXNpYyhpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNWMzAgPSBWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJBcHByb3ByaWF0ZUZhbWlseU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkFwcHJvcHJpYXRlR2l2ZW5OYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkFwcHJvcHJpYXRlUHJlZml4IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkFwcHJvcHJpYXRlU3VmZml4IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpOwotCi0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZUZhbWlseU5hbWU7QXBwcm9wcmlhdGVHaXZlbk5hbWU7QXBwcm9wcmlhdGVNaWRkbGVOYW1lOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlUHJlZml4O0FwcHJvcHJpYXRlU3VmZml4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiLCAiQXBwcm9wcmlhdGVQcmVmaXgiLCAiQXBwcm9wcmlhdGVTdWZmaXgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVQcmVmaXggQXBwcm9wcmlhdGVHaXZlbk5hbWUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIEFwcHJvcHJpYXRlRmFtaWx5TmFtZSBBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiwgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1NSURETEUtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljTWlkZGxlIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUxBU1QtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5Iik7Ci0KLSAgICAgICAgaWYgKGlzVjMwKSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiU09SVC1TVFJJTkciLAotICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIEFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUgIgotICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVCYXNpY1YyMSgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lQmFzaWMoVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVCYXNpY1YzMCgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lQmFzaWMoVjMwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgb25seSAicHJpbWFyeSIgU3RydWN0dXJlZE5hbWUgaXMgZW1pdHRlZCwgc28gdGhhdCBvdXIgdkNhcmQgZmlsZQotICAgICAqIHdpbGwgbm90IGNvbmZ1c2UgdGhlIGV4dGVybmFsIGltcG9ydGVyLCBhc3N1bWluZyB0aGVyZSBtYXkgYmUgc29tZSBpbXBvcnRlcgotICAgICAqIHdoaWNoIHByZXN1bWUgdGhhdCB0aGVyZSdzIG9ubHkgb25lIHByb3BlcnR5IHRvd2FyZCBlYWNoIG9mICAiTiIsICJGTiIsIGV0Yy4KLSAgICAgKiBOb3RlIHRoYXQgbW9yZSB0aGFuIG9uZSAiTiIsICJGTiIsIGV0Yy4gcHJvcGVydGllcyBhcmUgYWNjZXB0YWJsZSBpbiB2Q2FyZCBzcGVjLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VQcmltYXJ5Q29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc1YzMCA9ICh2Y2FyZFR5cGUgPT0gVjMwKTsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNGYW1pbHkxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0dpdmVuMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkRvTm90RW1pdFBob25ldGljTWlkZGxlMSIpOwotCi0gICAgICAgIC8vIFdpdGggIklTX1BSSU1BUlk9MSIuIFRoaXMgaXMgd2hhdCB3ZSBzaG91bGQgdXNlLgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJBcHByb3ByaWF0ZUZhbWlseU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkFwcHJvcHJpYXRlR2l2ZW5OYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkFwcHJvcHJpYXRlUHJlZml4IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkFwcHJvcHJpYXRlU3VmZml4IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICAvLyBXaXRoICJJU19QUklNQVJZPTEiLCBidXQgd2Ugc2hvdWxkIGlnbm9yZSB0aGlzIHRpbWUsIHNpbmNlIHRoaXMgaXMgc2Vjb25kLCBub3QgZmlyc3QuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNGYW1pbHkyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0dpdmVuMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkRvTm90RW1pdFBob25ldGljTWlkZGxlMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lO0FwcHJvcHJpYXRlR2l2ZW5OYW1lO0FwcHJvcHJpYXRlTWlkZGxlTmFtZTsiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVByZWZpeDtBcHByb3ByaWF0ZVN1ZmZpeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIiwgIkFwcHJvcHJpYXRlUHJlZml4IiwgIkFwcHJvcHJpYXRlU3VmZml4IikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlUHJlZml4IEFwcHJvcHJpYXRlR2l2ZW5OYW1lICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSBBcHByb3ByaWF0ZUZhbWlseU5hbWUgQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtRklSU1QtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtTUlERExFLU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1MQVNULU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotCi0gICAgICAgIGlmIChpc1YzMCkgewotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIlNPUlQtU1RSSU5HIiwKLSAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiBBcHByb3ByaWF0ZVBob25ldGljTWlkZGxlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeVYyMSgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeUNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlWMzAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IG9ubHkgInN1cGVyIHByaW1hcnkiIFN0cnVjdHVyZWROYW1lIGlzIGVtaXR0ZWQuCi0gICAgICogU2VlIGFsc28gdGhlIGNvbW1lbnQgaW4ge0BsaW5rICN0ZXN0U3RydWN0dXJlZE5hbWVVc2VQcmltYXJ5Q29tbW9uKGludCl9LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VTdXBlclByaW1hcnlDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBmaW5hbCBib29sZWFuIGlzVjMwID0gKHZjYXJkVHlwZSA9PSBWMzApOwotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0RmFtaWx5TmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkRvTm90RW1pdEdpdmVuTmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJEb05vdEVtaXRNaWRkbGVOYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEb05vdEVtaXRQcmVmaXgxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkRvTm90RW1pdFN1ZmZpeDEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0ZhbWlseTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIkRvTm90RW1pdFBob25ldGljR2l2ZW4xIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNNaWRkbGUxIik7Ci0KLSAgICAgICAgLy8gV2l0aCAiSVNfUFJJTUFSWT0xIiwgYnV0IHdlIHNob3VsZCBpZ25vcmUgdGhpcyB0aW1lLgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIkRvTm90RW1pdFBob25ldGljRmFtaWx5MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNHaXZlbjIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY01pZGRsZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICAgLy8gV2l0aCAiSVNfU1VQRVJfUFJJTUFSWT0xIi4gVGhpcyBpcyB3aGF0IHdlIHNob3VsZCB1c2UuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiQXBwcm9wcmlhdGVQcmVmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljTWlkZGxlIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1NVUEVSX1BSSU1BUlksIDEpOwotCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNGYW1pbHkzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0dpdmVuMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkRvTm90RW1pdFBob25ldGljTWlkZGxlMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lO0FwcHJvcHJpYXRlR2l2ZW5OYW1lO0FwcHJvcHJpYXRlTWlkZGxlTmFtZTsiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVByZWZpeDtBcHByb3ByaWF0ZVN1ZmZpeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIiwgIkFwcHJvcHJpYXRlUHJlZml4IiwgIkFwcHJvcHJpYXRlU3VmZml4IikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlUHJlZml4IEFwcHJvcHJpYXRlR2l2ZW5OYW1lICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSBBcHByb3ByaWF0ZUZhbWlseU5hbWUgQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtRklSU1QtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtTUlERExFLU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1MQVNULU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotCi0gICAgICAgIGlmIChpc1YzMCkgewotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIlNPUlQtU1RSSU5HIiwKLSAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiBBcHByb3ByaWF0ZVBob25ldGljTWlkZGxlIgotICAgICAgICAgICAgICAgICAgICArICIgQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlU3VwZXJQcmltYXJ5VjIxKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVVc2VTdXBlclByaW1hcnlDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VTdXBlclByaW1hcnlWMzAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVN1cGVyUHJpbWFyeUNvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROaWNrTmFtZVYzMCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYzMCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJOaWNreSIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOSUNLTkFNRSIsICJOaWNreSIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UGhvbmVCYXNpY0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEiLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVCYXNpY1YyMSgpIHsKLSAgICAgICAgdGVzdFBob25lQmFzaWNDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVCYXNpY1YzMCgpIHsKLSAgICAgICAgdGVzdFBob25lQmFzaWNDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVSZWZyYWluRm9ybWF0dGluZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYyMSB8IFZDYXJkQ29uZmlnLkZMQUdfUkVGUkFJTl9QSE9ORV9OVU1CRVJfRk9STUFUVElORyk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEyMzQ1Njc4OTAoYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXopIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEyMzQ1Njc4OTAoYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXopIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgdkNhcmQgY29tcG9zZXIgZW1pdHMgY29ycmVzcG9uZGluZyB0eXBlIHBhcmFtIHdoaWNoIHdlIGV4cGVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0KGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMjAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjMwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfRkFYX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNDAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9GQVhfV09SSyk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI1MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX01PQklMRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI2MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1BBR0VSKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjcwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfT1RIRVIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiODAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DQVIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiOTAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DT01QQU5ZX01BSU4pOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTAwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSVNETik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMTAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9NQUlOKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEyMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX09USEVSX0ZBWCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMzAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9URUxFWCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNDAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLX01PQklMRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNTAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLX1BBR0VSKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE2MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX01NUyk7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTAiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIyMCIsIG5ldyBUeXBlU2V0KCJXT1JLIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjMwIiwgbmV3IFR5cGVTZXQoIkhPTUUiLCAiRkFYIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjQwIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiRkFYIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjUwIiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNjAiLCBuZXcgVHlwZVNldCgiUEFHRVIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNzAiLCBuZXcgVHlwZVNldCgiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiODAiLCBuZXcgVHlwZVNldCgiQ0FSIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjkwIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiUFJFRiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMDAiLCBuZXcgVHlwZVNldCgiSVNETiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMTAiLCBuZXcgVHlwZVNldCgiUFJFRiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMjAiLCBuZXcgVHlwZVNldCgiRkFYIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEzMCIsIG5ldyBUeXBlU2V0KCJUTFgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTQwIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiQ0VMTCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxNTAiLCBuZXcgVHlwZVNldCgiV09SSyIsICJQQUdFUiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxNjAiLCBuZXcgVHlwZVNldCgiTVNHIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVZhcmlvdXNUeXBlU3VwcG9ydFYyMSgpIHsKLSAgICAgICAgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0KFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0VjMwKCkgewotICAgICAgICB0ZXN0UGhvbmVWYXJpb3VzVHlwZVN1cHBvcnQoVjMwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0ICJQUkVGInMgYXJlIGVtaXR0ZWQgYXBwcm9wcmlhdGVseS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBob25lUHJlZkhhbmRsaW5nQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIyIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLklTX1BSSU1BUlksIDEpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMyIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0ZBWF9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI0IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfRkFYX1dPUkspOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjQiLCBuZXcgVHlwZVNldCgiV09SSyIsICJGQVgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMyIsIG5ldyBUeXBlU2V0KCJIT01FIiwgIkZBWCIsICJQUkVGIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjIiLCBuZXcgVHlwZVNldCgiV09SSyIsICJQUkVGIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEiLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVQcmVmSGFuZGxpbmdWMjEoKSB7Ci0gICAgICAgIHRlc3RQaG9uZVByZWZIYW5kbGluZ0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVByZWZIYW5kbGluZ1YzMCgpIHsKLSAgICAgICAgdGVzdFBob25lUHJlZkhhbmRsaW5nQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RNaXNjUGhvbmVUeXBlSGFuZGxpbmcoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk1vZGVtIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIyIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJNU0ciKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjMiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIkJCUyIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiVklERU8iKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjUiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNiIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiX0FVVE9fQ0VMTCIpOyAgLy8gVGhlIG9sZCBpbmRpY2F0b3IgZm9yIHRoZSB0eXBlIG1vYmlsZS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjciKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlx1NjQzQVx1NUUyRiIpOyAgLy8gTW9iaWxlIHBob25lIGluIEphcGFuZXNlIEthbmppCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI4IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJpbnZhbGlkIik7Ci0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWMzAodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgLy8gdkNhcmQgMy4wIGFjY2VwdHMgImludmFsaWQiLiBBbHNvIHN0b3AgdXNpbmcgdG9VcHBlcigpCi0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEiLCBuZXcgVHlwZVNldCgiTW9kZW0iKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjIiLCBuZXcgVHlwZVNldCgiTVNHIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIzIiwgbmV3IFR5cGVTZXQoIkJCUyIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNCIsIG5ldyBUeXBlU2V0KCJWSURFTyIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNSIsIG5ldyBUeXBlU2V0KCJWT0lDRSIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNiIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI3IiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjgiLCBuZXcgVHlwZVNldCgiaW52YWxpZCIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMSIsIG5ldyBUeXBlU2V0KCJNT0RFTSIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMiIsIG5ldyBUeXBlU2V0KCJNU0ciKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjMiLCBuZXcgVHlwZVNldCgiQkJTIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI0IiwgbmV3IFR5cGVTZXQoIlZJREVPIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI1IiwgbmV3IFR5cGVTZXQoIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI2IiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjciLCBuZXcgVHlwZVNldCgiQ0VMTCIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiOCIsIG5ldyBUeXBlU2V0KCJYLWludmFsaWQiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVUeXBlSGFuZGxpbmdWMjEoKSB7Ci0gICAgICAgIHRlc3RNaXNjUGhvbmVUeXBlSGFuZGxpbmcoVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVUeXBlSGFuZGxpbmdWMzAoKSB7Ci0gICAgICAgIHRlc3RNaXNjUGhvbmVUeXBlSGFuZGxpbmcoVjMwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEVtYWlsQmFzaWNDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInNhbXBsZUBleGFtcGxlLmNvbSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAic2FtcGxlQGV4YW1wbGUuY29tIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsQmFzaWNWMjEoKSB7Ci0gICAgICAgIHRlc3RFbWFpbEJhc2ljQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsQmFzaWNWMzAoKSB7Ci0gICAgICAgIHRlc3RFbWFpbEJhc2ljQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfaG9tZUBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfd29ya0BleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX1dPUkspOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfbW9iaWxlQGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX290aGVyQGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfT1RIRVIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInR5cGVfaG9tZUBleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAidHlwZV93b3JrQGV4YW1wbGUuY29tIiwgbmV3IFR5cGVTZXQoIldPUksiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJ0eXBlX21vYmlsZUBleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAidHlwZV9vdGhlckBleGFtcGxlLmNvbSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydFYyMSgpIHsKLSAgICAgICAgdGVzdEVtYWlsVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsVmFyaW91c1R5cGVTdXBwb3J0VjMwKCkgewotICAgICAgICB0ZXN0RW1haWxWYXJpb3VzVHlwZVN1cHBvcnRDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEVtYWlsUHJlZkhhbmRsaW5nQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAidHlwZV9ob21lQGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLklTX1BSSU1BUlksIDEpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfbm90eXBlQGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLklTX1BSSU1BUlksIDEpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAidHlwZV9ub3R5cGVAZXhhbXBsZS5jb20iLCBuZXcgVHlwZVNldCgiUFJFRiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInR5cGVfaG9tZUBleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJIT01FIiwgIlBSRUYiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsUHJlZkhhbmRsaW5nVjIxKCkgewotICAgICAgICB0ZXN0RW1haWxQcmVmSGFuZGxpbmdDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxQcmVmSGFuZGxpbmdWMzAoKSB7Ci0gICAgICAgIHRlc3RFbWFpbFByZWZIYW5kbGluZ0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICJQb2JveCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLk5FSUdIQk9SSE9PRCwgIk5laWdoYm9yaG9vZCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgIlN0cmVldCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJDaXR5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OLCAiUmVnaW9uIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsICIxMDAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZLCAiQ291bnRyeSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLCAiRm9ybWF0dGVkIEFkZHJlc3MiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSyk7Ci0gICAgICAgIC8vIGFkci12YWx1ZSAgICA9IDAqNih0ZXh0LXZhbHVlICI7IikgdGV4dC12YWx1ZQotICAgICAgICAvLyAgICAgICAgICAgICAgOyBQTyBCb3gsIEV4dGVuZGVkIEFkZHJlc3MsIFN0cmVldCwgTG9jYWxpdHksIFJlZ2lvbiwgUG9zdGFsIENvZGUsCi0gICAgICAgIC8vICAgICAgICAgICAgICA7IENvdW50cnkgTmFtZQotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgTkVJR0hCT1JIT09EIGZpZWxkIGlzIGFwcGVuZGVkIGFmdGVyIHRoZSBDSVRZIGZpZWxkLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJQb2JveCIsICIiLCAiU3RyZWV0IiwgIkNpdHkgTmVpZ2hib3Job29kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ2lvbiIsICIxMDAiLCAiQ291bnRyeSIpLCBuZXcgVHlwZVNldCgiV09SSyIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc1YyMSgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc1YzMCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25OZWlnaGJvcmhvb2QoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJDaXR5Iik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsICIiLCAiIiwgIkNpdHkiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25OZWlnaGJvcmhvb2RWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25OZWlnaGJvcmhvb2RWMzAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uQ2l0eShpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTkVJR0hCT1JIT09ELCAiTmVpZ2hib3Job29kIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsICIiLCAiIiwgIk5laWdoYm9yaG9vZCIsICIiLCAiIiwgIiIpLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHlWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzTm9uQ2l0eShWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uQ2l0eVYzMCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NOb25DaXR5KFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQb3N0YWxPbmx5V2l0aEZvcm1hdHRlZEFkZHJlc3NDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIiIpICAvLyBNdXN0IGJlIGlnbm9yZWQuCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICJGb3JtYXR0ZWQgYWRkcmVzcyBDQSAxMjMtMzM0IFVuaXRlZCBTdGF0dWUiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBRFIiLCAiO0Zvcm1hdHRlZCBhZGRyZXNzIENBIDEyMy0zMzQgVW5pdGVkIFN0YXR1ZTs7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsICJGb3JtYXR0ZWQgYWRkcmVzcyBDQSAxMjMtMzM0IFVuaXRlZCBTdGF0dWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgIiIsICIiLCAiIiwgIiIpLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsT25seVdpdGhGb3JtYXR0ZWRBZGRyZXNzVjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsT25seVdpdGhGb3JtYXR0ZWRBZGRyZXNzQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc1YzMCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgdGhlIHZDYXJkIGNvbXBvc2VyIGhvbm9ycyBmb3JtYXR0ZWQgZGF0YSB3aGVuIGl0IGlzIGF2YWlsYWJsZQotICAgICAqIGV2ZW4gd2hlbiBpdCBpcyBwYXJ0aWFsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIlBvYm94IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIkNvdW50cnkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICJGb3JtYXR0ZWQgYWRkcmVzcyBDQSAxMjMtMzM0IFVuaXRlZCBTdGF0dWUiKTsgIC8vIFNob3VsZCBiZSBpZ25vcmVkCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwgIlBvYm94Ozs7Ozs7Q291bnRyeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJQb2JveCIsICIiLCAiIiwgIiIsICIiLCAiIiwgIkNvdW50cnkiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxXaXRoQm90aFN0cnVjdHVyZWRBbmRGb3JtYXR0ZWRWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxXaXRoQm90aFN0cnVjdHVyZWRBbmRGb3JtYXR0ZWRDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkVjMwKCkgewotICAgICAgICB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RPcmdhbml6YXRpb25Db21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIkNvbXBhbnlYIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5ULCAiRGVwYXJ0bWVudFkiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRJVExFLCAiVGl0bGVaIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5KT0JfREVTQ1JJUFRJT04sICJEZXNjcmlwdGlvbiBSYW1iZGEiKSAgLy8gSWdub3JlZC4KLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5PRkZJQ0VfTE9DQVRJT04sICJNb3VudGFpbiBWaWV3IikgIC8vIElnbm9yZWQuCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uUEhPTkVUSUNfTkFNRSwgIlBob25ldGljTmFtZSEiKSAgLy8gSWdub3JlZAotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlNZTUJPTCwgIiheb14pL35+Iik7ICAvLyBJZ25vcmUgaGltIChoZXIpLgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0TnVsbChPcmdhbml6YXRpb24uQ09NUEFOWSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5ULCAiRGVwYXJ0bWVudFhYIikKLSAgICAgICAgICAgICAgICAucHV0TnVsbChPcmdhbml6YXRpb24uVElUTEUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiQ29tcGFueVhZWiIpCi0gICAgICAgICAgICAgICAgLnB1dE51bGwoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJUaXRsZVhZWllYIik7Ci0gICAgICAgIC8vIEN1cnJlbnRseSB3ZSBkbyBub3QgdXNlIGdyb3VwIGJ1dCBkZXBlbmQgb24gdGhlIG9yZGVyLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsICJDb21wYW55WDtEZXBhcnRtZW50WSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJDb21wYW55WCIsICJEZXBhcnRtZW50WSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRJVExFIiwgIlRpdGxlWiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiT1JHIiwgIkRlcGFydG1lbnRYWCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiT1JHIiwgIkNvbXBhbnlYWVoiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRJVExFIiwgIlRpdGxlWFlaWVgiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3JnYW5pemF0aW9uVjIxKCkgewotICAgICAgICB0ZXN0T3JnYW5pemF0aW9uQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9yZ2FuaXphdGlvblYzMCgpIHsKLSAgICAgICAgdGVzdE9yZ2FuaXphdGlvbkNvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0SW1WYXJpb3VzVHlwZVN1cHBvcnRDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9BSU0pCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAiYWltIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfTVNOKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgIm1zbiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX1lBSE9PKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgInlhaG9vIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfU0tZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAic2t5cGUiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9RUSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJxcSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0dPT0dMRV9UQUxLKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgImdvb2dsZSB0YWxrIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfSUNRKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgImljcSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0pBQkJFUikKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJqYWJiZXIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9ORVRNRUVUSU5HKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgIm5ldG1lZXRpbmciKTsKLQotICAgICAgICAvLyBObyBkZXRlcm1pbmVkIHdheSB0byBleHByZXNzIHVua25vd24gdHlwZS4uLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtSkFCQkVSIiwgImphYmJlciIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1JQ1EiLCAiaWNxIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUdPT0dMRS1UQUxLIiwgImdvb2dsZSB0YWxrIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVFRIiwgInFxIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVNLWVBFLVVTRVJOQU1FIiwgInNreXBlIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVlBSE9PIiwgInlhaG9vIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU1TTiIsICJtc24iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTkVUTUVFVElORyIsICJuZXRtZWV0aW5nIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFJTSIsICJhaW0iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1CYXNpVjIxKCkgewotICAgICAgICB0ZXN0SW1WYXJpb3VzVHlwZVN1cHBvcnRDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1CYXNpY1YzMCgpIHsKLSAgICAgICAgdGVzdEltVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RJbVByZWZIYW5kbGluZ0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0FJTSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJhaW0xIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfQUlNKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgImFpbTIiKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uVFlQRSwgSW0uVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uSVNfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFJTSIsICJhaW0xIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFJTSIsICJhaW0yIiwgbmV3IFR5cGVTZXQoIkhPTUUiLCAiUFJFRiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1QcmVmSGFuZGxpbmdWMjEoKSB7Ci0gICAgICAgIHRlc3RJbVByZWZIYW5kbGluZ0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbVByZWZIYW5kbGluZ1YzMCgpIHsKLSAgICAgICAgdGVzdEltUHJlZkhhbmRsaW5nQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RXZWJzaXRlQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVVJMLCAiaHR0cDovL3dlYnNpdGUuZXhhbXBsZS5hbmRyb2lkLmNvbS9pbmRleC5odG1sIikKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVFlQRSwgV2Vic2l0ZS5UWVBFX0JMT0cpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFdlYnNpdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChXZWJzaXRlLlVSTCwgImZ0cDovL2Z0cC5leGFtcGxlLmFuZHJvaWQuY29tL2luZGV4Lmh0bWwiKQotICAgICAgICAgICAgICAgIC5wdXQoV2Vic2l0ZS5UWVBFLCBXZWJzaXRlLlRZUEVfRlRQKTsKLQotICAgICAgICAvLyBXZSBkcm9wIFRZUEUgaW5mb3JtYXRpb24gc2luY2UgdkNhcmQgKGVzcGVjaWFsbHkgMy4wKSBkb2VzIG5vdCBhbGxvdyB1cyB0byBlbWl0IGl0LgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlVSTCIsICJmdHA6Ly9mdHAuZXhhbXBsZS5hbmRyb2lkLmNvbS9pbmRleC5odG1sIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJVUkwiLCAiaHR0cDovL3dlYnNpdGUuZXhhbXBsZS5hbmRyb2lkLmNvbS9pbmRleC5odG1sIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYnNpdGVWMjEoKSB7Ci0gICAgICAgIHRlc3RXZWJzaXRlQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYnNpdGVWMzAoKSB7Ci0gICAgICAgIHRlc3RXZWJzaXRlQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QW5kcm9pZFByb3BWYWx1ZShmaW5hbCBTdHJpbmcgbWltZVR5cGUsIFN0cmluZyB2YWx1ZSwgSW50ZWdlciB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbmRyb2lkUHJvcFZhbHVlKG1pbWVUeXBlLCB2YWx1ZSwgdHlwZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QW5kcm9pZFByb3BWYWx1ZShmaW5hbCBTdHJpbmcgbWltZVR5cGUsIFN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgIEludGVnZXIgdHlwZSwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIHJldHVybiAobWltZVR5cGUgKyAiOyIgKyB2YWx1ZSArICI7IgotICAgICAgICAgICAgICAgICsgKHR5cGUgIT0gbnVsbCA/IHR5cGUgOiAiIikgKyAiOyIKLSAgICAgICAgICAgICAgICArIChsYWJlbCAhPSBudWxsID8gbGFiZWwgOiAiIikgKyAiOzs7Ozs7Ozs7Ozs7Iik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RFdmVudENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9BTk5JVkVSU0FSWSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlNUQVJUX0RBVEUsICIxOTgyLTA2LTE2Iik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5UWVBFLCBFdmVudC5UWVBFX0JJUlRIREFZKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuU1RBUlRfREFURSwgIjIwMDgtMTAtMjIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFdmVudC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfT1RIRVIpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiMjAxOC0wMy0xMiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5MQUJFTCwgIlRoZSBsYXN0IGRheSIpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiV2hlbiB0aGUgVG93ZXIgb2YgSGFub2kgd2l0aCA2NCByaW5ncyBpcyBjb21wbGV0ZWQuIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5UWVBFLCBFdmVudC5UWVBFX0JJUlRIREFZKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuU1RBUlRfREFURSwgIjIwMDktMDUtMTkiKTsgIC8vIFNob3VsZCBiZSBpZ25vcmVkLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkJEQVkiLCAiMjAwOC0xMC0yMiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BTkRST0lELUNVU1RPTSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBbmRyb2lkUHJvcFZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudC5DT05URU5UX0lURU1fVFlQRSwgIjE5ODItMDYtMTYiLCBFdmVudC5UWVBFX0FOTklWRVJTQVJZKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFORFJPSUQtQ1VTVE9NIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEFuZHJvaWRQcm9wVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFLCAiMjAxOC0wMy0xMiIsIEV2ZW50LlRZUEVfT1RIRVIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQU5EUk9JRC1DVVNUT00iLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QW5kcm9pZFByb3BWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXaGVuIHRoZSBUb3dlciBvZiBIYW5vaSB3aXRoIDY0IHJpbmdzIGlzIGNvbXBsZXRlZC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudC5UWVBFX0NVU1RPTSwgIlRoZSBsYXN0IGRheSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZlbnRWMjEoKSB7Ci0gICAgICAgIHRlc3RFdmVudENvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmVudFYzMCgpIHsKLSAgICAgICAgdGVzdEV2ZW50Q29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3ROb3RlQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIm5vdGUxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIm5vdGUyIikKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuSVNfUFJJTUFSWSwgMSk7ICAvLyBKdXN0IGlnbm9yZWQuCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTk9URSIsICJub3RlMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTk9URSIsICJub3RlMiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RlVjIxKCkgewotICAgICAgICB0ZXN0Tm90ZUNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RlVjMwKCkgewotICAgICAgICB0ZXN0Tm90ZUNvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UGhvdG9Db21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBmaW5hbCBib29sZWFuIGlzVjMwID0gdmNhcmRUeXBlID09IFYzMDsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlBob3RvVGVzdCIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob3RvLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvdG8uUEhPVE8sIHNQaG90b0J5dGVBcnJheSk7Ci0KLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzRm9yUGhvdG8gPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBjb250ZW50VmFsdWVzRm9yUGhvdG8ucHV0KCJFTkNPRElORyIsIChpc1YzMCA/ICJiIiA6ICJCQVNFNjQiKSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJGTiIsICJQaG90b1Rlc3QiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCAiUGhvdG9UZXN0Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJQaG90b1Rlc3QiLCAiIiwgIiIsICIiLCAiIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiUEhPVE8iLCBudWxsLCBudWxsLCBzUGhvdG9CeXRlQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzRm9yUGhvdG8sIG5ldyBUeXBlU2V0KCJKUEVHIiksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG90b1YyMSgpIHsKLSAgICAgICAgdGVzdFBob3RvQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob3RvVjMwKCkgewotICAgICAgICB0ZXN0UGhvdG9Db21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFJlbGF0aW9uQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFJlbGF0aW9uLlRZUEUsIFJlbGF0aW9uLlRZUEVfTU9USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoUmVsYXRpb24uTkFNRSwgIk1zLiBNb3RoZXIiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKS5hZGRFeHBlY3RlZChSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFJlbGF0aW9uLlRZUEUsIFJlbGF0aW9uLlRZUEVfTU9USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoUmVsYXRpb24uTkFNRSwgIk1zLiBNb3RoZXIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpb25WMjEoKSB7Ci0gICAgICAgIHRlc3RSZWxhdGlvbkNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxhdGlvblYzMCgpIHsKLSAgICAgICAgdGVzdFJlbGF0aW9uQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYzMEhhbmRsZUVzY2FwZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYzMCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXFwiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIjsiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICIsIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIlxuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIls8e1VuZXNjYXBlZDpBc2NpaXN9Pl0iKTsKLSAgICAgICAgLy8gVmVyaWZpZXMgdGhlIHZDYXJkIFN0cmluZyBjb3JyZWN0bHkgZXNjYXBlcyBlYWNoIGNoYXJhY3RlciB3aGljaCBtdXN0IGJlIGVzY2FwZWQuCi0gICAgICAgIG1WZXJpZmllci5hZGRMaW5lVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoIk46XFxcXDtcXDs7XFwsO1xcbjsiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZCgiRk46Wzx7VW5lc2NhcGVkOkFzY2lpc30+XSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRk4iLCAiWzx7VW5lc2NhcGVkOkFzY2lpc30+XSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsIEFycmF5cy5hc0xpc3QoIlxcIiwgIjsiLCAiLCIsICJcbiIsICIiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlcmUncyBubyAiTklDS05BTUUiIHByb3BlcnR5IGluIHZDYXJkIDIuMSwgd2hpbGUgdGhlcmUgaXMgaW4gdkNhcmQgMy4wLgotICAgICAqIFdlIHVzZSBBbmRyb2lkLXNwZWNpZmljICJYLUFORFJPSUQtQ1VTVE9NIiBwcm9wZXJ0eS4KLSAgICAgKiBUaGlzIHRlc3QgdmVyaWZpZXMgdGhlIGZ1bmN0aW9uYWxpdHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5pY2tOYW1lVjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVjIxKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTmlja25hbWUuTkFNRSwgIk5pY2t5Iik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BTkRST0lELUNVU1RPTSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSArICI7Tmlja3k7Ozs7Ozs7Ozs7Ozs7OyIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpLmFkZEV4cGVjdGVkKE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTmlja25hbWUuTkFNRSwgIk5pY2t5Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRvbGVyYXRlQnJva2VuUGhvbmVOdW1iZXJFbnRyeVYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYyMSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMTEtMjIyLTMzMzMgKE1pYW1pKVxuNDQ0LTU1NTUtNjY2IChUb2t5byk7IgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiNzc3LTg4OC05OTk5IChDaGljYWdvKTsxMTEtMjIyLTMzMzMgKE1pYW1pKSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMTEtMjIyLTMzMzMiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI0NDQtNTU1LTU2NjYiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI3NzctODg4LTk5OTkiLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSk7ICAvLyBFbXB0eSBuYW1lLiBTaG91bGQgYmUgaWdub3JlZC4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiZmFtaWx5MSIpOyAgLy8gTm90IHByaW1hcnkuIFNob3VsZCBiZSBpZ25vcmVkLgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiZmFtaWx5MiIpOyAgLy8gVGhpcyBlbnRyeSBpcyB3aGF0IHdlIHdhbnQuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJmYW1pbHkzIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgImZhbWlseTQiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCBBcnJheXMuYXNMaXN0KCJmYW1pbHkyIiwgIiIsICIiLCAiIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgImZhbWlseTIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGlja1VwTm9uRW1wdHlDb250ZW50VmFsdWVzVjIxKCkgewotICAgICAgICB0ZXN0UGlja1VwTm9uRW1wdHlDb250ZW50VmFsdWVzQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc1YzMCgpIHsKLSAgICAgICAgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc0NvbW1vbihWMzApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEltcG9ydGVyVGVzdHMuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEltcG9ydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBlMWY4Ny4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbXBvcnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Pcmdhbml6YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob3RvOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuV2Vic2l0ZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmZyYW1ld29ya3MuY29yZXRlc3RzLlI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbS5UeXBlU2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotcHVibGljIGNsYXNzIFZDYXJkSW1wb3J0ZXJUZXN0cyBleHRlbmRzIFZDYXJkVGVzdHNCYXNlIHsKLSAgICAvLyBQdXNoIGRhdGEgaW50byBpbnQgYXJyYXkgYXQgZmlyc3Qgc2luY2UgdmFsdWVzIGxpa2UgMHg4MCBhcmUKLSAgICAvLyBpbnRlcnByZXRlZCBhcyBpbnQgYnkgdGhlIGNvbXBpbGVyIGFuZCBjYXN0aW5nIGFsbCBvZiB0aGVtIGlzCi0gICAgLy8gY3VtYmVyc29tZS4uLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHNQaG90b0ludEFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlID0gewotICAgICAgICAweGZmLCAweGQ4LCAweGZmLCAweGUxLCAweDBhLCAweDBmLCAweDQ1LCAweDc4LCAweDY5LCAweDY2LCAweDAwLAotICAgICAgICAweDAwLCAweDRkLCAweDRkLCAweDAwLCAweDJhLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDBkLAotICAgICAgICAweDAxLCAweDBlLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDBmLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweGFhLCAweDAxLCAweDBmLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweGJhLCAweDAxLCAweDEwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweGMyLCAweDAxLCAweDEyLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAxLCAweDFhLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweGM4LCAweDAxLCAweDFiLCAweDAwLCAweDA1LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweGQwLCAweDAxLCAweDI4LCAweDAwLCAweDAzLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAxLCAweDMxLCAweDAwLCAweDAyLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDBlLCAweDAwLCAweDAwLCAweDAwLCAweGQ4LCAweDAxLCAweDMyLCAweDAwLAotICAgICAgICAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweGU2LCAweDAyLCAweDEzLAotICAgICAgICAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDgyLAotICAgICAgICAweDk4LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDBlLCAweDAwLCAweDAwLCAweDAwLCAweGZhLAotICAgICAgICAweDg3LCAweDY5LCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDg0LCAweGM0LCAweGE1LCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDdjLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDA4LCAweDAwLCAweDAwLCAweDA0LCAweDFlLCAweDMyLCAweDMwLCAweDMwLCAweDM4LCAweDMxLAotICAgICAgICAweDMwLCAweDMyLCAweDM5LCAweDMxLCAweDMzLCAweDM1LCAweDM1LCAweDMzLCAweDMxLCAweDAwLCAweDAwLAotICAgICAgICAweDQ0LCAweDZmLCAweDQzLCAweDZmLCAweDRkLCAweDZmLCAweDAwLCAweDAwLCAweDQ0LCAweDM5LCAweDMwLAotICAgICAgICAweDM1LCAweDY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDQ0LCAweDM5LCAweDMwLAotICAgICAgICAweDM1LCAweDY5LCAweDIwLCAweDU2LCAweDY1LCAweDcyLCAweDMxLCAweDJlLCAweDMwLCAweDMwLCAweDAwLAotICAgICAgICAweDMyLCAweDMwLCAweDMwLCAweDM4LCAweDNhLCAweDMxLCAweDMwLCAweDNhLCAweDMyLCAweDM5LCAweDIwLAotICAgICAgICAweDMxLCAweDMzLCAweDNhLCAweDM1LCAweDM1LCAweDNhLCAweDM0LCAweDM3LCAweDAwLCAweDIwLCAweDIwLAotICAgICAgICAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAotICAgICAgICAweDAwLCAweDUwLCAweDcyLCAweDY5LCAweDZlLCAweDc0LCAweDQ5LCAweDRkLCAweDAwLCAweDMwLCAweDMzLAotICAgICAgICAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDAxLCAweDAwLCAweDE0LCAweDAwLAotICAgICAgICAweDE0LCAweDAwLCAweDAyLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDM0LCAweDAxLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDEwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDExLCAweDA5LCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDBmLCAweDBiLCAweDAwLAotICAgICAgICAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDA1LCAweDk3LCAweDAwLCAweDAwLCAweDI3LCAweDEwLAotICAgICAgICAweDAwLCAweDAwLCAweDA4LCAweGIwLCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDFjLAotICAgICAgICAweDAxLCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDAyLCAweDVlLCAweDAwLCAweDAwLAotICAgICAgICAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDhiLCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLAotICAgICAgICAweDAwLCAweDAzLCAweGNiLCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDFiLCAweGU1LAotICAgICAgICAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDI4LCAweDgyLCAweDlhLCAweDAwLCAweDA1LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweDZhLCAweDgyLCAweDlkLCAweDAwLCAweDA1LAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweDcyLCAweDg4LCAweDIyLCAweDAwLAotICAgICAgICAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDkwLCAweDAwLAotICAgICAgICAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDMwLCAweDMyLCAweDMyLCAweDMwLCAweDkwLAotICAgICAgICAweDAzLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAzLCAweDdhLAotICAgICAgICAweDkwLCAweDA0LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAzLAotICAgICAgICAweDhlLCAweDkxLCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAxLCAweDAyLAotICAgICAgICAweDAzLCAweDAwLCAweDkxLCAweDAyLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDAzLCAweGEyLCAweDkyLCAweDAxLCAweDAwLCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDAzLCAweGFhLCAweDkyLCAweDAyLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGIyLCAweDkyLCAweDA0LCAweDAwLCAweDBhLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGJhLCAweDkyLCAweDA1LCAweDAwLCAweDA1LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGMyLCAweDkyLCAweDA3LCAweDAwLCAweDAzLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDkyLCAweDA4LCAweDAwLAotICAgICAgICAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDA5LAotICAgICAgICAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLAotICAgICAgICAweDBhLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGNhLAotICAgICAgICAweDkyLCAweDdjLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDkyLCAweDg2LCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDE2LCAweDAwLCAweDAwLAotICAgICAgICAweDAzLCAweGQyLCAweGEwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDMwLAotICAgICAgICAweDMxLCAweDMwLCAweDMwLCAweGEwLCAweDAxLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweGEwLCAweDAyLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDYwLCAweDAwLCAweDAwLCAweGEwLCAweDAzLCAweDAwLCAweDAzLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweGEwLCAweDA1LCAweDAwLCAweDA0LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweGEyLCAweDBlLCAweDAwLCAweDA1LAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGU4LCAweGEyLCAweDBmLCAweDAwLAotICAgICAgICAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGYwLCAweGEyLCAweDEwLAotICAgICAgICAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweGEyLAotICAgICAgICAweDE3LCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLAotICAgICAgICAweGEzLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAzLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweGEzLCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweGE0LCAweDAxLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDAyLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDAzLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDA0LCAweDAwLCAweDA1LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGY4LCAweGE0LCAweDA1LCAweDAwLCAweDAzLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDFkLCAweDAwLCAweDAwLCAweGE0LCAweDA2LCAweDAwLCAweDAzLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDA3LCAweDAwLAotICAgICAgICAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDA4LAotICAgICAgICAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LAotICAgICAgICAweDA5LCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweGE0LCAweDBhLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweGE0LCAweDBjLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDUzLCAweDAwLAotICAgICAgICAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDAxLCAweDVlLCAweDAwLCAweDAwLCAweDAwLCAweDY0LAotICAgICAgICAweDMyLCAweDMwLCAweDMwLCAweDM4LCAweDNhLCAweDMxLCAweDMwLCAweDNhLCAweDMyLCAweDM5LCAweDIwLAotICAgICAgICAweDMxLCAweDMzLCAweDNhLCAweDM1LCAweDM1LCAweDNhLCAweDMzLCAweDMxLCAweDAwLCAweDMyLCAweDMwLAotICAgICAgICAweDMwLCAweDM4LCAweDNhLCAweDMxLCAweDMwLCAweDNhLCAweDMyLCAweDM5LCAweDIwLCAweDMxLCAweDMzLAotICAgICAgICAweDNhLCAweDM1LCAweDM1LCAweDNhLCAweDM0LCAweDM3LCAweDAwLCAweDAwLCAweDAwLCAweDI5LCAweDg4LAotICAgICAgICAweDAwLCAweDAwLCAweDFiLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweGIyLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDY0LCAweDAwLCAweDAwLCAweDAxLCAweDVlLCAweDAwLCAweDAwLCAweDAwLCAweDY0LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDI1LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDBhLCAweDAwLCAweDAwLCAweDBlLCAweDkyLCAweDAwLCAweDAwLCAweDAzLCAweGU4LAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDMyLCAweDMwLCAweDMwLAotICAgICAgICAweDM4LCAweDMxLCAweDMwLCAweDMyLCAweDM5LCAweDMxLCAweDMzLCAweDM1LCAweDM1LCAweDMzLCAweDMxLAotICAgICAgICAweDAwLCAweDAwLCAweDIwLCAweDJhLCAweDAwLCAweDAwLCAweDAwLCAweDBhLCAweDAwLCAweDAwLCAweDJhLAotICAgICAgICAweGUyLCAweDAwLCAweDAwLCAweDAwLCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDA0LCAweDUyLCAweDM5LCAweDM4LCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDA3LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDA0LCAweDMwLCAweDMxLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDA2LAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDFhLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDA0LCAweDZjLCAweDAxLCAweDFiLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDA0LCAweDc0LCAweDAxLCAweDI4LCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAyLCAweDAxLCAweDAwLCAweDA0LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDA0LCAweDdjLCAweDAyLCAweDAyLCAweDAwLCAweDA0LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDA1LCAweDhiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGZmLCAweGQ4LCAweGZmLCAweGRiLCAweDAwLCAweDg0LAotICAgICAgICAweDAwLCAweDIwLCAweDE2LCAweDE4LCAweDFjLCAweDE4LCAweDE0LCAweDIwLCAweDFjLCAweDFhLCAweDFjLAotICAgICAgICAweDI0LCAweDIyLCAweDIwLCAweDI2LCAweDMwLCAweDUwLCAweDM0LCAweDMwLCAweDJjLCAweDJjLCAweDMwLAotICAgICAgICAweDYyLCAweDQ2LCAweDRhLCAweDNhLCAweDUwLCAweDc0LCAweDY2LCAweDdhLCAweDc4LCAweDcyLCAweDY2LAotICAgICAgICAweDcwLCAweDZlLCAweDgwLCAweDkwLCAweGI4LCAweDljLCAweDgwLCAweDg4LCAweGFlLCAweDhhLCAweDZlLAotICAgICAgICAweDcwLCAweGEwLCAweGRhLCAweGEyLCAweGFlLCAweGJlLCAweGM0LCAweGNlLCAweGQwLCAweGNlLCAweDdjLAotICAgICAgICAweDlhLCAweGUyLCAweGYyLCAweGUwLCAweGM4LCAweGYwLCAweGI4LCAweGNhLCAweGNlLCAweGM2LCAweDAxLAotICAgICAgICAweDIyLCAweDI0LCAweDI0LCAweDMwLCAweDJhLCAweDMwLCAweDVlLCAweDM0LCAweDM0LCAweDVlLCAweGM2LAotICAgICAgICAweDg0LCAweDcwLCAweDg0LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAotICAgICAgICAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAotICAgICAgICAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAotICAgICAgICAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAotICAgICAgICAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGZmLCAweGMwLAotICAgICAgICAweDAwLCAweDExLCAweDA4LCAweDAwLCAweDc4LCAweDAwLCAweGEwLCAweDAzLCAweDAxLCAweDIxLCAweDAwLAotICAgICAgICAweDAyLCAweDExLCAweDAxLCAweDAzLCAweDExLCAweDAxLCAweGZmLCAweGM0LCAweDAxLCAweGEyLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDA1LCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LAotICAgICAgICAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDEwLCAweDAwLCAweDAyLCAweDAxLCAweDAzLAotICAgICAgICAweDAzLCAweDAyLCAweDA0LCAweDAzLCAweDA1LCAweDA1LCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDdkLCAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLCAweDIxLCAweDMxLAotICAgICAgICAweDQxLCAweDA2LCAweDEzLCAweDUxLCAweDYxLCAweDA3LCAweDIyLCAweDcxLCAweDE0LCAweDMyLCAweDgxLAotICAgICAgICAweDkxLCAweGExLCAweDA4LCAweDIzLCAweDQyLCAweGIxLCAweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLAotICAgICAgICAweDI0LCAweDMzLCAweDYyLCAweDcyLCAweDgyLCAweDA5LCAweDBhLCAweDE2LCAweDE3LCAweDE4LCAweDE5LAotICAgICAgICAweDFhLCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAotICAgICAgICAweDM4LCAweDM5LCAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLAotICAgICAgICAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDYzLCAweDY0LCAweDY1LAotICAgICAgICAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LAotICAgICAgICAweDc5LCAweDdhLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDkyLAotICAgICAgICAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LAotICAgICAgICAweGE1LCAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LAotICAgICAgICAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LAotICAgICAgICAweGM5LCAweGNhLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLAotICAgICAgICAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGYxLAotICAgICAgICAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweDAxLCAweDAwLAotICAgICAgICAweDAzLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LAotICAgICAgICAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDExLCAweDAwLCAweDAyLCAweDAxLCAweDAyLCAweDA0LAotICAgICAgICAweDA0LCAweDAzLCAweDA0LCAweDA3LCAweDA1LCAweDA0LCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDc3LAotICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDExLCAweDA0LCAweDA1LCAweDIxLCAweDMxLCAweDA2LCAweDEyLAotICAgICAgICAweDQxLCAweDUxLCAweDA3LCAweDYxLCAweDcxLCAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LAotICAgICAgICAweDQyLCAweDkxLCAweGExLCAweGIxLCAweGMxLCAweDA5LCAweDIzLCAweDMzLCAweDUyLCAweGYwLCAweDE1LAotICAgICAgICAweDYyLCAweDcyLCAweGQxLCAweDBhLCAweDE2LCAweDI0LCAweDM0LCAweGUxLCAweDI1LCAweGYxLCAweDE3LAotICAgICAgICAweDE4LCAweDE5LCAweDFhLCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM1LCAweDM2LCAweDM3LAotICAgICAgICAweDM4LCAweDM5LCAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLAotICAgICAgICAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDYzLCAweDY0LCAweDY1LAotICAgICAgICAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LAotICAgICAgICAweDc5LCAweDdhLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLAotICAgICAgICAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLAotICAgICAgICAweGE0LCAweGE1LCAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LAotICAgICAgICAweGI2LCAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LAotICAgICAgICAweGM4LCAweGM5LCAweGNhLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LAotICAgICAgICAweGRhLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGYyLAotICAgICAgICAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweGZmLCAweGRhLCAweDAwLAotICAgICAgICAweDBjLCAweDAzLCAweDAxLCAweDAwLCAweDAyLCAweDExLCAweDAzLCAweDExLCAweDAwLCAweDNmLCAweDAwLAotICAgICAgICAweDE0LCAweDU0LCAweGFhLCAweDJhLCAweDQ2LCAweDQ4LCAweGEyLCAweGE0LCAweDU1LCAweGE2LCAweDA0LAotICAgICAgICAweDhhLCAweDI5LCAweGUwLCAweDUzLCAweDEwLCAweGUwLCAweDI5LCAweGMwLCAweDUwLCAweDAzLCAweGIxLAotICAgICAgICAweDQ2LCAweDI5LCAweDgwLCAweDg0LCAweDUyLCAweDExLCAweDQwLCAweDBkLCAweDIyLCAweDlhLCAweDQ1LAotICAgICAgICAweDIwLCAweDIzLCAweDYxLCAweDUxLCAweDMwLCAweGEwLCAweDA4LCAweGM4LCAweGE4LCAweGQ4LCAweDUyLAotICAgICAgICAweDAyLCAweDI2LCAweDE1LCAweDBiLCAweDBhLCAweDAwLCAweGI0LCAweGEyLCAweGE1LCAweDVhLCAweDAwLAotICAgICAgICAweDkxLCAweDQ1LCAweDRhLCAweGEyLCAweDgxLCAweDkyLCAweDAxLCAweDRlLCAweDAyLCAweDk4LCAweDg3LAotICAgICAgICAweDBhLCAweDcwLCAweGEwLCAweDA3LCAweDYyLCAweDhjLCAweDUwLCAweDIxLCAweDBkLCAweDI1LCAweDAwLAotICAgICAgICAweDM0LCAweDhhLCAweDYxLCAweDE0LCAweDBjLCAweDYzLCAweDBhLCAweDg5LCAweDg1LCAweDAwLCAweDQ2LAotICAgICAgICAweGQ1LCAweDFiLCAweDUyLCAweDAyLCAweDE2LCAweGE4LCAweDk4LCAweDUwLCAweDA1LCAweDk0LCAweGE5LAotICAgICAgICAweDE2LCAweDgwLCAweDI1LCAweDVhLCAweDk1LCAweDY4LCAweDE4LCAweGYxLCAweDRmLCAweDE0LCAweGM0LAotICAgICAgICAweDNiLCAweGI1LCAweDIyLCAweGI2LCAweDM4LCAweDM0LCAweDAwLCAweGUzLCAweDIyLCAweDhlLCAweGY0LAotICAgICAgICAweDc5LCAweDhhLCAweDdiLCAweGQxLCAweDcxLCAweDAzLCAweDMwLCAweGM3LCAweDE0LCAweDgzLCAweGE1LAotICAgICAgICAweDAwLCAweDA2LCAweDk4LCAweDY4LCAweDAxLCAweDhkLCAweDUxLCAweDM1LCAweDAzLCAweDIyLCAweDZhLAotICAgICAgICAweDhkLCAweGE5LCAweDAxLCAweDEzLCAweDU0LCAweDRkLCAweDQwLCAweDEzLCAweGE1LCAweDRhLCAweDI4LAotICAgICAgICAweDAyLCAweDQ1LCAweDM1LCAweDJhLCAweDlhLCAweDAwLCAweDc4LCAweDM0LCAweGYwLCAweDY5LCAweDgwLAotICAgICAgICAweDM0LCAweDgxLCAweDQ1LCAweDQwLCAweGNlLCAweDU4LCAweGU2LCAweGEyLCAweDRjLCAweDA2LCAweGU0LAotICAgICAgICAweGZhLCAweGQxLCAweDkzLCAweDUwLCAweDIxLCAweGNhLCAweGU0LCAweDU1LCAweDg0LCAweDkwLCAweDMwLAotICAgICAgICAweGFiLCAweDhiLCAweDE4LCAweGE2LCAweDlhLCAweDZhLCAweGM0LCAweDMxLCAweGFhLCAweDI2LCAweGEwLAotICAgICAgICAweDY0LCAweDRkLCAweDUxLCAweGI1LCAweDIwLCAweDIzLCAweDZhLCAweDg5LCAweGE4LCAweDAyLCAweDQ0LAotICAgICAgICAweDM1LCAweDJhLCAweDlhLCAweDAwLCAweDk1LCAweDRkLCAweDQ4LCAweGE2LCAweDgwLCAweDI0LCAweDUzLAotICAgICAgICAweDRlLCAweGNlLCAweDA1LCAweDMwLCAweDJiLCAweDNiLCAweGVlLCAweDZhLCAweDkxLCAweDVkLCAweDc2LAotICAgICAgICAweDYzLCAweGJkLCAweDY1LCAweDdkLCAweDQwLCAweDY2LCAweDY4LCAweGE5LCAweDAyLCAweDQ1LCAweDJiLAotICAgICAgICAweGIzLCAweDllLCAweGI0LCAweGM1LCAweDZkLCAweGFkLCAweDlhLCAweGEwLCAweDJjLCAweDA2LCAweGM4LAotICAgICAgICAweGNkLCAweDA0LCAweGQ2LCAweGEyLCAweDIzLCAweDYzLCAweDUxLCAweGIxLCAweGEwLCAweDY0LCAweDRkLAotICAgICAgICAweDUxLCAweDkzLCAweDQ4LCAweDA4LCAweGRhLCAweGEyLCAweDZhLCAweDAwLCAweDcyLCAweDFhLCAweDk5LAotICAgICAgICAweDRkLCAweDAwLCAweDQ4LCAweGE2LCAweGE0LCAweDUzLCAweDRjLCAweDA3LCAweDg2LCAweDAzLCAweGJkLAotICAgICAgICAweDJiLCAweDljLCAweGE3LCAweDE0LCAweDk4LCAweDEwLCAweDg1LCAweDM0LCAweGUwLCAweGE2LCAweGIzLAotICAgICAgICAweGIwLCAweDBiLCAweGI1LCAweGE4LCAweDBhLCAweGQ0LCAweDU4LCAweDQyLCAweGVkLCAweDNlLCAweDk0LAotICAgICAgICAweGQyLCAweGE2LCAweDhiLCAweDAxLCAweDM0LCAweDQ0LCAweGVkLCAweGU2LCAweDljLCAweDRkLCAweDZhLAotICAgICAgICAweDgwLCAweDhkLCAweDhkLCAweDQ2LCAweGM2LCAweDgwLCAweDIzLCAweDYzLCAweDUxLCAweDlhLCAweDA2LAotICAgICAgICAweDQ2LCAweGQ1LCAweDEzLCAweDUyLCAweDAxLCAweDU0LCAweGQ0LCAweGFhLCAweDY4LCAweDAyLCAweDQwLAotICAgICAgICAweDZhLCAweDQwLCAweDc4LCAweGEwLCAweDA4LCAweDU5LCAweGNlLCAweGVlLCAweGI1LCAweDJhLCAweDM5LAotICAgICAgICAweGQ5LCAweDU5LCAweGE3LCAweGE4LCAweDAwLCAweDczLCAweGViLCAweDRlLCAweDBlLCAweDdkLCAweDY5LAotICAgICAgICAweDVjLCAweDA1LCAweGYzLCAweDBmLCAweGFkLCAweDFlLCAweDYxLCAweGY1LCAweGE3LCAweDcxLCAweDBiLAotICAgICAgICAweGU2LCAweDM1LCAweDIxLCAweDkwLCAweGQzLCAweGI4LCAweDBlLCAweDMyLCAweDEwLCAweDk1LCAweDEwLAotICAgICAgICAweDkxLCAweGIzLCAweGQ2LCAweDliLCAweDYwLCAweDRiLCAweDljLCAweDhhLCAweDYzLCAweDFhLCAweGIwLAotICAgICAgICAweDE4LCAweDRkLCAweDQ2LCAweGM2LCAweDgwLCAweDIyLCAweDZhLCAweDYxLCAweGE0LCAweDMxLCAweGFhLAotICAgICAgICAweDZhLCAweDU1LCAweDM0LCAweDAxLCAweDJhLCAweDlhLCAweDdlLCAweDc4LCAweGEwLCAweDA4LCAweDA5LAotICAgICAgICAweGY5LCAweGFhLCAweDU4LCAweGNmLCAweGNhLCAweDZiLCAweDNlLCAweGEwLCAweDAwLCAweGQzLCAweDgxLAotICAgICAgICAweGE5LCAweDAxLCAweDczLCAweDQ2LCAweDY5LCAweDgwLCAweGI5LCAweGE0LCAweGNkLCAweDAwLCAweDJiLAotICAgICAgICAweDFmLCAweDkyLCAweGEzLCAweDA3LCAweDlhLCAweDZmLCAweDcwLCAweDI2LCAweGNmLCAweDE0LCAweGQyLAotICAgICAgICAweDZiLCAweDUxLCAweDBjLCAweDYzLCAweDUxLCAweGIxLCAweGEwLCAweDA4LCAweGRhLCAweDk4LCAweDY5LAotICAgICAgICAweDBjLCAweDhkLCAweDRkLCAweDRhLCAweGE2LCAweDgwLCAweDI0LCAweDUzLCAweDUyLCAweDAzLCAweGM1LAotICAgICAgICAweDAyLCAweDIxLCAweDI3LCAweGU2LCAweGE5LCAweDIzLCAweDNmLCAweDI5LCAweGFjLCAweGZhLCAweDhjLAotICAgICAgICAweDAxLCAweGU2LCAweDljLCAweDBkLCAweDQ4LCAweDBhLCAweDBkLCAweDJlLCAweDY4LCAweDAxLCAweDczLAotICAgICAgICAweDQ5LCAweDlhLCAweDYwLCAweDJiLCAweDFmLCAweDkyLCAweDk4LCAweDNhLCAweGQzLCAweDdiLCAweDgxLAotICAgICAgICAweDM2LCAweDc4LCAweGE2LCAweDkzLCAweDVhLCAweDg4LCAweDhjLCAweDlhLCAweDYzLCAweDFhLCAweDAwLAotICAgICAgICAweDhjLCAweGQzLCAweDBkLCAweDIxLCAweDkxLCAweDI5LCAweGE5LCAweDE0LCAweGQwLCAweDA0LCAweDhhLAotICAgICAgICAweDY5LCAweGUwLCAweGQzLCAweDExLCAweDFiLCAweDFlLCAweDZhLCAweDQ4LCAweGNmLCAweGNhLCAweDZiLAotICAgICAgICAweDNlLCAweGEzLCAweDEwLCAweDFhLCAweDcwLCAweDM1LCAweDIwLCAweDM4LCAweDFhLCAweDVjLCAweGQyLAotICAgICAgICAweDAxLCAweDczLCAweDQ5LCAweDlhLCAweDYwLCAweDM5LCAweDhmLCAweGNhLCAweDI5LCAweDhiLCAweGY3LAotICAgICAgICAweGFhLCAweGJhLCAweDg4LCAweDk2LCAweDlhLCAweDZiLCAweDQwLCAweDE4LCAweGM2LCAweGEzLCAweDI2LAotICAgICAgICAweDgwLCAweDE4LCAweDY5LCAweGE2LCAweDkwLCAweGM4LCAweDE0LCAweGQ0LCAweDhhLCAweDY5LCAweDgwLAotICAgICAgICAweGYwLCAweDZhLCAweDQwLCAweDY4LCAweDEwLCAweGJiLCAweDQxLCAweGE3LCAweGUzLCAweDBiLCAweGM1LAotICAgICAgICAweDJiLCAweDAxLCAweDEwLCAweGE3LCAweDAzLCAweDU5LCAweDBjLCAweDc2LCAweDY5LCAweDczLCAweDQwLAotICAgICAgICAweDBiLCAweDlhLCAweDI4LCAweDExLCAweDI4LCAweDE5LCAweDVlLCAweDY5LCAweDAyLCAweDgxLCAweDVhLAotICAgICAgICAweGQ4LCAweDAwLCAweGQzLCAweDRkLCAweDUwLCAweDBjLCAweDZhLCAweDhjLCAweGQyLCAweDAxLCAweGE2LAotICAgICAgICAweDk4LCAweDY5LCAweDBjLCAweGFlLCAweGE2LCAweGE0LCAweDA2LCAweDgwLCAweDFlLCAweGE2LCAweDllLAotICAgICAgICAweDBkLCAweDMxLCAweDEyLCAweDAzLCAweDRmLCAweDA2LCAweDgwLCAweDEzLCAweDYwLCAweDM0LCAweGQzLAotICAgICAgICAweGMxLCAweGE4LCAweDkyLCAweDAxLCAweGYxLCAweDhkLCAweGRkLCAweDY5LCAweGNjLCAweGExLCAweDY5LAotICAgICAgICAweDViLCAweDRiLCAweDgwLCAweDgzLCAweDkzLCAweDUyLCAweDA0LCAweDE0LCAweGUyLCAweGFlLCAweDAzLAotICAgICAgICAweGE5LCAweDBkLCAweDY4LCAweDAzLCAweDRkLCAweDM0LCAweGQwLCAweDAzLCAweDBkLCAweDMwLCAweGQyLAotICAgICAgICAweDAxLCAweDg2LCAweDlhLCAweDY4LCAweDE5LCAweDU4LCAweDFhLCAweDc4LCAweGE0LCAweDA0LCAweDhhLAotICAgICAgICAweDY5LCAweGUwLCAweGQzLCAweDEwLCAweGUwLCAweDY5LCAweGUwLCAweGQwLCAweDAzLCAweGMxLCAweGE4LAotICAgICAgICAweGRiLCAweGFkLCAweDRjLCAweDgxLCAweDEyLCAweDQ1LCAweGQ2LCAweDlkLCAweDI1LCAweDFkLCAweDAwLAotICAgICAgICAweDZhLCAweGY1LCAweGE5LCAweGU4LCAweDgwLCAweDMxLCAweDI5LCAweDBkLCAweDU4LCAweDA4LCAweDY5LAotICAgICAgICAweDg2LCAweDgwLCAweDFhLCAweDY5LCAweDg2LCAweDkwLCAweDBjLCAweDM0LCAweGQzLCAweDQ4LCAweDY1LAotICAgICAgICAweDUxLCAweDRmLCAweDA2LCAweDk4LCAweDBmLCAweDE0LCAweGYwLCAweDY4LCAweDEwLCAweGYwLCAweDY5LAotICAgICAgICAweGUwLCAweGQwLCAweDAzLCAweDgxLCAweGE1LCAweDJiLCAweDlhLCAweDFhLCAweGI4LCAweDg3LCAweGE4LAotICAgICAgICAweGRiLCAweDRhLCAweDQ2LCAweDY4LCAweGI2LCAweDgwLCAweDJhLCAweGE4LCAweDE0LCAweGVhLCAweDEyLAotICAgICAgICAweGIwLCAweDA1LCAweDIxLCAweGE2LCAweDAyLCAweDFhLCAweDYxLCAweGEwLCAweDA2LCAweDlhLCAweDYxLAotICAgICAgICAweGE0LCAweDMxLCAweDg2LCAweDlhLCAweDY5LCAweDBjLCAweGE4LCAweDBkLCAweDNjLCAweDUzLCAweDAxLAotICAgICAgICAweGUyLCAweDllLCAweDI4LCAweDEwLCAweGYxLCAweDRlLCAweDA2LCAweDk4LCAweDBmLCAweDA2LCAweDllLAotICAgICAgICAweDBkLCAweDAyLCAweDFjLCAweDI5LCAweGMyLCAweDgwLCAweDE2LCAweDk2LCAweDgwLCAweDBhLCAweDRhLAotICAgICAgICAweDAwLCAweDQzLCAweDRkLCAweDM0LCAweDBjLCAweDYxLCAweGE2LCAweDFhLCAweDQwLCAweDM0LCAweGQzLAotICAgICAgICAweDRkLCAweDIxLCAweDgwLCAweGZmLCAweGQ5LCAweGZmLCAweGRiLCAweDAwLCAweDg0LCAweDAwLCAweDBhLAotICAgICAgICAweDA3LCAweDA3LCAweDA4LCAweDA3LCAweDA2LCAweDBhLCAweDA4LCAweDA4LCAweDA4LCAweDBiLCAweDBhLAotICAgICAgICAweDBhLCAweDBiLCAweDBlLCAweDE4LCAweDEwLCAweDBlLCAweDBkLCAweDBkLCAweDBlLCAweDFkLCAweDE1LAotICAgICAgICAweDE2LCAweDExLCAweDE4LCAweDIzLCAweDFmLCAweDI1LCAweDI0LCAweDIyLCAweDFmLCAweDIyLCAweDIxLAotICAgICAgICAweDI2LCAweDJiLCAweDM3LCAweDJmLCAweDI2LCAweDI5LCAweDM0LCAweDI5LCAweDIxLCAweDIyLCAweDMwLAotICAgICAgICAweDQxLCAweDMxLCAweDM0LCAweDM5LCAweDNiLCAweDNlLCAweDNlLCAweDNlLCAweDI1LCAweDJlLCAweDQ0LAotICAgICAgICAweDQ5LCAweDQzLCAweDNjLCAweDQ4LCAweDM3LCAweDNkLCAweDNlLCAweDNiLCAweDAxLCAweDBhLCAweDBiLAotICAgICAgICAweDBiLCAweDBlLCAweDBkLCAweDBlLCAweDFjLCAweDEwLCAweDEwLCAweDFjLCAweDNiLCAweDI4LCAweDIyLAotICAgICAgICAweDI4LCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLAotICAgICAgICAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLAotICAgICAgICAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLAotICAgICAgICAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLAotICAgICAgICAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweGZmLCAweGMwLCAweDAwLCAweDExLAotICAgICAgICAweDA4LCAweDAwLCAweDQ4LCAweDAwLCAweDYwLCAweDAzLCAweDAxLCAweDIxLCAweDAwLCAweDAyLCAweDExLAotICAgICAgICAweDAxLCAweDAzLCAweDExLCAweDAxLCAweGZmLCAweGM0LCAweDAxLCAweGEyLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDA1LCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotICAgICAgICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDEwLCAweDAwLCAweDAyLCAweDAxLCAweDAzLCAweDAzLCAweDAyLAotICAgICAgICAweDA0LCAweDAzLCAweDA1LCAweDA1LCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDAxLCAweDdkLCAweDAxLAotICAgICAgICAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLCAweDIxLCAweDMxLCAweDQxLCAweDA2LAotICAgICAgICAweDEzLCAweDUxLCAweDYxLCAweDA3LCAweDIyLCAweDcxLCAweDE0LCAweDMyLCAweDgxLCAweDkxLCAweGExLAotICAgICAgICAweDA4LCAweDIzLCAweDQyLCAweGIxLCAweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLCAweDI0LCAweDMzLAotICAgICAgICAweDYyLCAweDcyLCAweDgyLCAweDA5LCAweDBhLCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDI1LAotICAgICAgICAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAotICAgICAgICAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLCAweDUzLCAweDU0LAotICAgICAgICAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LAotICAgICAgICAweDY4LCAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LCAweDdhLAotICAgICAgICAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDkyLCAweDkzLCAweDk0LAotICAgICAgICAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LAotICAgICAgICAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAweGI4LAotICAgICAgICAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLAotICAgICAgICAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLCAweGUxLCAweGUyLAotICAgICAgICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGYxLCAweGYyLCAweGYzLAotICAgICAgICAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweDAxLCAweDAwLCAweDAzLCAweDAxLAotICAgICAgICAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LAotICAgICAgICAweDA5LCAweDBhLCAweDBiLCAweDExLCAweDAwLCAweDAyLCAweDAxLCAweDAyLCAweDA0LCAweDA0LCAweDAzLAotICAgICAgICAweDA0LCAweDA3LCAweDA1LCAweDA0LCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDc3LCAweDAwLCAweDAxLAotICAgICAgICAweDAyLCAweDAzLCAweDExLCAweDA0LCAweDA1LCAweDIxLCAweDMxLCAweDA2LCAweDEyLCAweDQxLCAweDUxLAotICAgICAgICAweDA3LCAweDYxLCAweDcxLCAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LCAweDQyLCAweDkxLAotICAgICAgICAweGExLCAweGIxLCAweGMxLCAweDA5LCAweDIzLCAweDMzLCAweDUyLCAweGYwLCAweDE1LCAweDYyLCAweDcyLAotICAgICAgICAweGQxLCAweDBhLCAweDE2LCAweDI0LCAweDM0LCAweGUxLCAweDI1LCAweGYxLCAweDE3LCAweDE4LCAweDE5LAotICAgICAgICAweDFhLCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAotICAgICAgICAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLCAweDUzLCAweDU0LAotICAgICAgICAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LAotICAgICAgICAweDY4LCAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LCAweDdhLAotICAgICAgICAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDkyLCAweDkzLAotICAgICAgICAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LCAweGE1LAotICAgICAgICAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LAotICAgICAgICAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LAotICAgICAgICAweGNhLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLCAweGUyLAotICAgICAgICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGYyLCAweGYzLCAweGY0LAotICAgICAgICAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweGZmLCAweGRhLCAweDAwLCAweDBjLCAweDAzLAotICAgICAgICAweDAxLCAweDAwLCAweDAyLCAweDExLCAweDAzLCAweDExLCAweDAwLCAweDNmLCAweDAwLCAweDllLCAweGQyLAotICAgICAgICAweDJlLCAweDA3LCAweDE1LCAweGFmLCAweDZkLCAweDA4LCAweGUyLCAweGIzLCAweDQ1LCAweDFhLCAweGY2LAotICAgICAgICAweGQwLCAweDAwLCAweDAxLCAweGM1LCAweDY4LCAweDQ1LCAweDE3LCAweDRhLCAweGI0LCAweDIyLCAweGU0LAotICAgICAgICAweDcwLCAweDhjLCAweDc0LCAweGE5LCAweDNjLCAweGExLCAweDhlLCAweDk1LCAweDQ4LCAweDk2LCAweDMxLAotICAgICAgICAweGUyLCAweDE4LCAweGU5LCAweDU1LCAweGE1LCAweDhjLCAweDdhLCAweDUwLCAweDA1LCAweDBiLCAweDg4LAotICAgICAgICAweDg2LCAweDBmLCAweDE1LCAweDhmLCAweDc1LCAweDFmLCAweDI2LCAweDkzLCAweDE5LCAweDkxLCAweDc3LAotICAgICAgICAweDE4LCAweGMxLCAweGFjLCAweDRiLCAweGM4LCAweGZhLCAweGQ2LCAweDYzLCAweDM3LCAweDZkLCAweDMxLAotICAgICAgICAweGI0LCAweDczLCAweDViLCAweDM2LCAweGEwLCAweDFjLCAweDUwLCAweDgwLCAweGQ3LCAweDgzLCAweGEwLAotICAgICAgICAweGFiLCAweGQxLCAweDYyLCAweGFkLCAweDA5LCAweDhmLCAweDE3LCAweDI5LCAweDAzLCAweGIyLCAweGNjLAotICAgICAgICAweGUwLCAweDc3LCAweDE0LCAweGEzLCAweDU2LCAweGIzLCAweDI3LCAweDFlLCAweDY3LCAweGU5LCAweDUyLAotICAgICAgICAweGVhLCAweGM2LCAweDNhLCAweDM2LCAweDQ4LCAweGVmLCAweDNkLCAweDI3LCAweDcwLCAweDIyLCAweDYwLAotICAgICAgICAweDQ3LCAweDUyLCAweDY5LCAweGIyLCAweGUyLCAweGFkLCAweDNiLCAweGVhLCAweDgwLCAweGEzLCAweDM4LAotICAgICAgICAweGUwLCAweGQ2LCAweDNkLCAweGQ4LCAweDFjLCAweGQwLCAweGNhLCAweDQ2LCAweDNkLCAweGQwLCAweDE4LAotICAgICAgICAweDM1LCAweDg5LCAweDc4LCAweGEzLCAweDlhLCAweGNkLCAweDhjLCAweGQyLCAweGIzLCAweDkzLCAweDJhLAotICAgICAgICAweDJiLCAweDY2LCAweGQ1LCAweGYxLCAweDhhLCAweDEwLCAweDFhLCAweGQ2LCAweGYyLCAweDAzLCAweDhhLAotICAgICAgICAweDllLCAweGU2LCAweGY0LCAweDVhLCAweGRiLCAweGVmLCAweGZlLCAweDIzLCAweGMwLCAweGE3LCAweDI3LAotICAgICAgICAweGNiLCAweDE2LCAweGM0LCAweGNjLCAweGRkLCAweGUyLCAweDc4LCAweDlhLCAweDY5LCAweDY2LCAweGNjLAotICAgICAgICAweDk5LCAweGUxLCAweDRkLCAweDQ3LCAweGJhLCAweGJjLCAweGQ5LCAweDZhLCAweGVlLCAweDI2LCAweDU5LAotICAgICAgICAweDU5LCAweDRkLCAweGFjLCAweDY5LCAweDM0LCAweDUyLCAweGU1LCAweDhmLCAweDU1LCAweGFkLCAweDU4LAotICAgICAgICAweGFlLCAweDg1LCAweGM0LCAweDIyLCAweDQxLCAweGRmLCAweGFkLCAweDc2LCAweDYxLCAweGU1LCAweDZmLAotICAgICAgICAweDc0LCAweDQ1LCAweDY5LCAweGRjLCAweDAwLCAweDc5LCAweGFjLCAweDhiLCAweGE2LCAweGM5LCAweDM1LAotICAgICAgICAweGQ0LCAweDM0LCAweDY0LCAweGRjLCAweDM3LCAweDA2LCAweGIxLCAweGFlLCAweDg4LCAweGMxLCAweGFjLAotICAgICAgICAweGQ4LCAweGM5LCAweDJjLCAweGE2LCAweGUwLCAweDczLCAweDViLCAweDM2LCAweGYzLCAweDc0LCAweGU2LAotICAgICAgICAweDg0LCAweDA1LCAweGUzLCAweGE5LCAweDQ3LCAweDZhLCAweDE0LCAweGI2LCAweDQ5LCAweDNkLCAweDg1LAotICAgICAgICAweDNhLCAweGVlLCAweGVlLCAweDJiLCAweGE4LCAweGUyLCAweDZmLCAweDMwLCAweDgxLCAweGU5LCAweDhhLAotICAgICAgICAweGNhLCAweGE0LCAweGUyLCAweGQzLCAweDhiLCAweDAxLCAweGIxLCAweGY5LCAweDA0LCAweDdmLCAweGFmLAotICAgICAgICAweDIzLCAweGYwLCAweGE5LCAweDU0LCAweDQxLCAweDljLCAweGZkLCAweGEzLCAweGY0LCAweGFlLCAweDY1LAotICAgICAgICAweDE4LCAweGY3LCAweDI1LCAweDhhLCAweGUyLCAweDAyLCAweDM4LCAweGI4LCAweGZkLCAweDJhLCAweDdiLAotICAgICAgICAweDViLCAweGE4LCAweDZkLCAweDZkLCAweDVkLCAweDlhLCAweDVkLCAweGNiLCAweGJiLCAweGQyLCAweGI2LAotICAgICAgICAweGE2LCAweGEzLCAweDE5LCAweDVlLCAweGUyLCAweDAzLCAweDdiLCAweDFkLCAweGMyLCAweDE3LCAweDhkLAotICAgICAgICAweGI4LCAweGFjLCAweGZiLCAweDg5LCAweDM5LCAweDM1LCAweGQ2LCAweDlhLCAweDZhLCAweGU4LCAweDY2LAotICAgICAgICAweDU1LCAweGNiLCAweGY1LCAweGFjLCAweDdiLCAweDk2LCAweGViLCAweDUwLCAweGM2LCAweDg4LCAweDZkLAotICAgICAgICAweDY2LCAweGU5LCAweGNkLCAweDZjLCAweGRiLCAweDRmLCAweGQzLCAweDlhLCAweDAwLCAweDJmLCAweGU2LAotICAgICAgICAweGY5LCAweGEzLCAweGU3LCAweGI1LCAweDRhLCAweDkzLCAweDdmLCAweGEyLCAweGM2LCAweDczLCAweGRjLAotICAgICAgICAweGQ3LCAweDE1LCAweDU1LCAweGVmLCAweDQ4LCAweDdkLCAweDA5LCAweDUyLCAweDZlLCAweDNhLCAweGQ0LAotICAgICAgICAweGFiLCAweDJmLCAweGJkLCAweDYxLCAweDE2LCAweDBjLCAweDczLCAweDQ5LCAweGM1LCAweDI0LCAweDkyLAotICAgICAgICAweDdmLCAweGEyLCAweDYzLCAweGZkLCAweGFhLCAweGQ2LCAweDJmLCAweDcxLCAweDBlLCAweGIxLCAweDkzLAotICAgICAgICAweGY3LCAweDJkLCAweGY1LCAweGE0LCAweDllLCAweDRlLCAweGI1LCAweGRkLCAweDRiLCAweGY4LCAweDY4LAotICAgICAgICAweDRjLCAweGNiLCAweGI5LCAweDkzLCAweGFkLCAweDY1LCAweGNlLCAweGQ5LCAweDI2LCAweGE5LCAweDhkLAotICAgICAgICAweDE5LCAweGY2LCAweGYyLCAweGY0LCAweGU2LCAweGI1LCAweGFkLCAweGU3LCAweGM2LCAweDM5LCAweGEwLAotICAgICAgICAweDE4LCAweGViLCAweGM5LCAweDc3LCAweDZjLCAweDM1LCAweDJhLCAweDRiLCAweGZlLCAweDhhLCAweDljLAotICAgICAgICAweGZmLCAweDAwLCAweDExLCAweGFlLCAweDNhLCAweDhiLCAweGRlLCAweDYxLCAweGQwLCAweDllLCAweDM5LAotICAgICAgICAweGI4LCAweGViLCAweDUzLCAweGFjLCAweGI5LCAweGFlLCAweDViLCAweDAwLCAweGYzLCAweDI3LCAweDE0LAotICAgICAgICAweDkyLCAweGM5LCAweGZlLCAweDhhLCAweDNmLCAweGRlLCAweDM1LCAweGFjLCAweDNhLCAweDg4LCAweDkyLAotICAgICAgICAweGNkLCAweGIxLCAweDZlLCAweDdkLCAweGNkLCAweDMyLCAweDY3LCAweGViLCAweGNkLCAweDdhLCAweDE0LAotICAgICAgICAweGZlLCAweDA0LCAweDI2LCAweDY2LCAweGNlLCAweGY5LCAweDI2LCAweGIzLCAweGU2LCAweDZlLCAweGI0LAotICAgICAgICAweGQ5LCAweDQ4LCAweGM4LCAweDgyLCAweDRlLCAweDA3LCAweDM1LCAweGE3LCAweDZmLCAweDJmLCAweDAyLAotICAgICAgICAweDlhLCAweDA2LCAweDVmLCAweDhjLCAweGE0LCAweDgzLCAweDBlLCAweDMyLCAweDJhLCAweDY5LCAweGUzLAotICAgICAgICAweGRkLCAweDEyLCAweDA4LCAweDk3LCAweDg1LCAweGVjLCAweDJhLCAweDJhLCAweDQyLCAweGYxLCAweDc2LAotICAgICAgICAweDI2LCAweGU0LCAweDZhLCAweDU5LCAweDBlLCAweDE4LCAweDEwLCAweDZhLCAweGQyLCAweDg5LCAweDAyLAotICAgICAgICAweDZlLCAweDJhLCAweDcxLCAweGViLCAweDVjLCAweDFjLCAweDhjLCAweGE2LCAweDQ4LCAweGJiLCAweGRjLAotICAgICAgICAweDYxLCAweDQxLCAweDM1LCAweDcyLCAweDI4LCAweDg3LCAweGQ5LCAweGY2LCAweDRhLCAweGI5LCAweGU3LAotICAgICAgICAweDM4LCAweGFlLCAweDhjLCAweDNkLCAweDM2LCAweGRkLCAweGRlLCAweGM0LCAweGIwLCAweDIxLCAweDUxLAotICAgICAgICAweDc2LCAweGE4LCAweGMwLCAweGFhLCAweDkzLCAweDMxLCAweGU2LCAweGJiLCAweDJkLCAweDY1LCAweDYxLAotICAgICAgICAweDE5LCAweGQzLCAweDFlLCAweGI1LCAweDQ2LCAweDVhLCAweDk2LCAweDVhLCAweDMwLCAweGEwLCAweDdlLAotICAgICAgICAweDA1LCAweDY5LCAweDViLCAweGM5LCAweGM2LCAweDI4LCAweDQwLCAweGNkLCAweDA4LCAweDY0LCAweDNjLAotICAgICAgICAweDczLCAweDU3LCAweGUxLCAweDk0LCAweGYxLCAweGNkLCAweDVhLCAweDIxLCAweDhjLCAweGI5LCAweDYzLAotICAgICAgICAweGU3LCAweDY3LCAweDFkLCAweGFiLCAweDQwLCAweGIxLCAweGZiLCAweDAwLCAweDFkLCAweGYwLCAweDJiLAotICAgICAgICAweDk5LCAweDJkLCAweDY2LCAweDNlLCAweDg4LCAweDc1LCAweDgxLCAweDNmLCAweDMxLCAweGY2LCAweGFiLAotICAgICAgICAweDY0LCAweGQ2LCAweGI0LCAweDE3LCAweGVlLCAweGQwLCAweDllLCAweGU0LCAweDMyLCAweDFhLCAweGE3LAotICAgICAgICAweDMxLCAweGFkLCAweDE4LCAweDE0LCAweDI2LCAweGVmLCAweDU0LCAweGE1LCAweGE4LCAweDY1LCAweGEzLAotICAgICAgICAweDljLCAweDgxLCAweGZhLCAweDU2LCAweDhjLCAweDJkLCAweGNlLCAweDY4LCAweDQwLCAweGNiLCAweGYxLAotICAgICAgICAweDM3LCAweGJkLCAweDVlLCAweDg1LCAweGVhLCAweGQxLCAweDBjLCAweGJiLCAweDE5LCAweDU2LCAweDIzLAotICAgICAgICAweDIwLCAweDFmLCAweGFkLCAweDVjLCAweDQyLCAweDA4LCAweDAzLCAweGI1LCAweDU1LCAweDkxLCAweDA0LAotICAgICAgICAweGM5LCAweDgwLCAweDM4LCAweDAwLCAweDBhLCAweDcxLCAweDM0LCAweDZjLCAweDMyLCAweDI3LCAweGU5LAotICAgICAgICAweDU1LCAweDI1LCAweDE1LCAweDJjLCAweDY4LCAweGEzLCAweDMwLCAweGViLCAweDU0LCAweGE1LCAweDE1LAotICAgICAgICAweDBjLCAweGQxLCAweDAwLCAweGZmLCAweGQ5fTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGJ5dGVbXSBzUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2U7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gc1Bob3RvSW50QXJyYXlGb3JDb21wbGljYXRlZENhc2UubGVuZ3RoOwotICAgICAgICBzUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2UgPSBuZXcgYnl0ZVtsZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBzUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2VbaV0gPSAoYnl0ZSlzUGhvdG9JbnRBcnJheUZvckNvbXBsaWNhdGVkQ2FzZVtpXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFTaW1wbGVDYXNlMV9QYXJzaW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfc2ltcGxlXzEpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJBbmRvO1JvaWQ7IiwgQXJyYXlzLmFzTGlzdCgiQW5kbyIsICJSb2lkIiwgIiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxU2ltcGxlQ2FzZTFfVHlwZV9HZW5lcmljKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19VVEY4LCBSLnJhdy52MjFfc2ltcGxlXzEpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFuZG8iKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiUm9pZCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlJvaWQgQW5kbyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFTaW1wbGVDYXNlMV9UeXBlX0phcGFuZXNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUywgUi5yYXcudjIxX3NpbXBsZV8xKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJBbmRvIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlJvaWQiKQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgbmFtZS1yZWxhdGVkIHN0cmluZ3Mgb25seSBjb250YWlucyBwcmludGFibGUgQXNjaWksCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb3JkZXIgaXMgcmVtYWluZWQgdG8gYmUgVVMnczoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJQcmVmaXggR2l2ZW4gTWlkZGxlIEZhbWlseSBTdWZmaXgiCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlJvaWQgQW5kbyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFTaW1wbGVDYXNlMigpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMsIFIucmF3LnYyMV9zaW1wbGVfMik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkFuZG8gUm9pZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFTaW1wbGVDYXNlMygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3NpbXBsZV8zKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJBbmRvIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlJvaWQiKQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gIkZOIiBmaWVsZCBzaG91bGQgYmUgcHJlZmVyZWQgc2luY2UgaXQgc2hvdWxkIGNvbnRhaW4gdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmRlciBpbnRlbmRlZCBieSB0aGUgYXV0aG9yIG9mIHRoZSBmaWxlLgotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJBbmRvIFJvaWQiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyAnOycgaXMgcHJvcGVybHkgaGFuZGxlZCBieSBWQ2FyZFBhcnNlciBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxQmFja3NsYXNoQ2FzZV9QYXJzaW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfYmFja3NsYXNoKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlZFUlNJT04iLCAiMi4xIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIjtBO0JcXDtDXFw7O0Q7OkU7XFxcXDsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwgIkE7QlxcIiwgIkNcXDsiLCAiRCIsICI6RSIsICJcXFxcIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwgIkE7QlxcQ1xcO0Q6RVxcXFwiKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgQ29udGFjdFN0cnVjdCBjb3JyZWN0bHkgaWdub3JlcyByZWR1bmRhbnQgZmllbGRzIGluICJOIiBwcm9wZXJ0eSB2YWx1ZXMgYW5kCi0gICAgICogaW5zZXJ0cyBuYW1lIHJlbGF0ZWQgZGF0YS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxQmFja3NsYXNoQ2FzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2JhY2tzbGFzaCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGQU1JTFlfTkFNRSBpcyBlbXB0eSBhbmQgcmVtb3ZlZCBpbiB0aGlzIHRlc3QuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkE7QlxcIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJDXFw7IikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIjpFIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiQTtCXFxDXFw7RDpFXFxcXCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmdCZWZvclRpdGxlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfb3JnX2JlZm9yZV90aXRsZSk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJOb3JtYWwgR3V5Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJDb21wYW55IikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5ULCAiT3JnYW5pemF0aW9uIERldmlzaW9uIFJvb20gU2hlZXQgTm8uIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIkV4Y2VsbGVudCBKYW5pdG9yIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGl0bGVCZWZvck9yZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3RpdGxlX2JlZm9yZV9vcmcpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiTmljZSBHdXkiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIk1hcnZlcm91cyIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIlBlcmZlY3QgR3JlYXQgR29vZCBCYWQgUG9vciIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJDb29sIFRpdGxlIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB0aGF0IHZDYXJkIGltcG9ydGVyIGNvcnJlY3RseSBpbnRlcnByZXQgIlBSRUYiIGF0dHJpYnV0ZSB0byBJU19QUklNQVJZLgotICAgICAqIFRoZSBkYXRhIGNvbnRhaW4gdGhyZWUgY2FzZXM6IG9uZSAiUFJFRiIsIG5vICJQUkVGIiBhbmQgbXVsdGlwbGUgIlBSRUYiLCBpbiBlYWNoIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMVByZWZUb0lzUHJpbWFyeSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3ByZWZfaGFuZGxpbmcpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRGF0YS5NSU1FVFlQRSwgU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJTbWl0aCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMiIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjMiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9JU0ROKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0ZXN0QGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLklTX1BSSU1BUlksIDEpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInRlc3QyQGV4YW1pbmF0aW9uLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX01PQklMRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLklTX1BSSU1BUlksIDEpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiQ29tcGFueSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJFbmdpbmVlciIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSyk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJNeXN0ZXJ5IikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIkJsb2dnZXIiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiUG9ldHJ5IikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIlBvZXQiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIGFsbCB0aGUgcHJvcGVydGllcyBpbiBhIGNvbXBsaWNhdGVkIHZDYXJkIGFyZSBjb3JyZWN0bHkgcGFyc2VkIGJ5IHRoZSBWQ2FyZFBhcnNlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxQ29tcGxpY2F0ZWRDYXNlX1BhcnNpbmcoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9jb21wbGljYXRlZCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjIuMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJHdW1wO0ZvcnJlc3Q7SG9nZTtQb3M7VGFvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkd1bXAiLCAiRm9ycmVzdCIsICJIb2dlIiwgIlBvcyIsICJUYW8iKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJKb2UgRHVlIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJPUkciLCAiR3VtcCBTaHJpbXAgQ28uO1NhbGVzIERlcHQuO01hbmFnZXI7RmlzaCBrZWVwZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiR3VtcCBTaHJpbXAgQ28uIiwgIlNhbGVzIERlcHQuO01hbmFnZXIiLCAiRmlzaCBrZWVwZXIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJST0xFIiwgIkZpc2ggQ2FrZSBLZWVwZXIhIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJUSVRMRSIsICJTaHJpbXAgTWFuIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIigxMTEpIDU1NS0xMjEyIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiKDQwNCkgNTU1LTEyMTIiLCBuZXcgVHlwZVNldCgiSE9NRSIsICJWT0lDRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIwMzExMTExMTExIiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMyMjIyMjIyMiIsIG5ldyBUeXBlU2V0KCJWSURFTyIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIwMzMzMzMzMzMzIiwgbmV3IFR5cGVTZXQoIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICI7OzEwMCBXYXRlcnMgRWRnZTtCYXl0b3duO0xBOzMwMzE0O1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiIiwgIjEwMCBXYXRlcnMgRWRnZSIsICJCYXl0b3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBIiwgIjMwMzE0IiwgIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBuZXcgVHlwZVNldCgiV09SSyIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkxBQkVMIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICIxMDAgV2F0ZXJzIEVkZ2VcclxuQmF5dG93biwgTEEgMzAzMTRcclxuVW5pdGVkICBTdGF0ZXMgb2YgQW1lcmljYSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclFQLCBuZXcgVHlwZVNldCgiV09SSyIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiOzs0MiBQbGFudGF0aW9uIFN0LjtCYXl0b3duO0xBOzMwMzE0O1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiIiwgIjQyIFBsYW50YXRpb24gU3QuIiwgIkJheXRvd24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEEiLCAiMzAzMTQiLCAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIiksIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJIT01FIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTEFCRUwiLAotICAgICAgICAgICAgICAgICAgICAgICAgIjQyIFBsYW50YXRpb24gU3QuXHJcbkJheXRvd24sIExBIDMwMzE0XHJcblVuaXRlZCAgU3RhdGVzIG9mIEFtZXJpY2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JRUCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJIT01FIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRU1BSUwiLCAiZm9ycmVzdGd1bXBAd2FsbGFkYWxsYS5jb20iLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlBSRUYiLCAiSU5URVJORVQiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJFTUFJTCIsICJjZWxsQGV4YW1wbGUuY29tIiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOT1RFIiwgIlRoZSBmb2xsb3dpbmcgbm90ZSBpcyB0aGUgZXhhbXBsZSBmcm9tIFJGQyAyMDQ1LiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTk9URSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTm93J3MgdGhlIHRpbWUgZm9yIGFsbCBmb2xrIHRvIGNvbWUgdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclFQLCBudWxsLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlBIT1RPIiwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIHNQaG90b0J5dGVBcnJheUZvckNvbXBsaWNhdGVkQ2FzZSwgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMjEsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiSlBFRyIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtQVRUUklCVVRFIiwgIlNvbWUgU3RyaW5nIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJCREFZIiwgIjE5ODAwMTAxIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJHRU8iLCAiMzUuNjU2Mzg1NCwxMzkuNjk5NDIzMyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVVJMIiwgImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJSRVYiLCAiMjAwODA0MjRUMTk1MjQzWiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBDb250YWN0U3RydWN0IGNvcnJlY3RseSBpbnNlcnRzIHZhbHVlcyBpbiBhIGNvbXBsaWNhdGVkIHZDYXJkCi0gICAgICogaW50byBDb250ZW50UmVzb2x2ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUNvbXBsaWNhdGVkQ2FzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2NvbXBsaWNhdGVkKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiR3VtcCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRm9ycmVzdCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkhvZ2UiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiUG9zIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIlRhbyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJKb2UgRHVlIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIkd1bXAgU2hyaW1wIENvLiIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIlNhbGVzIERlcHQuO01hbmFnZXIgRmlzaCBrZWVwZXIiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRJVExFLCAiU2hyaW1wIE1hbiIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC8vIFBob25lIG51bWJlciBpcyBleHBlY3RlZCB0byBiZSBmb3JtYXRlZCB3aXRoIE5BTVAgZm9ybWF0IGluIGRlZmF1bHQuCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMTEtNTU1LTEyMTIiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjQwNC01NTUtMTIxMiIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9NT0JJTEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIwMzEtMTExLTExMTEiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJWSURFTyIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIwMzItMjIyLTIyMjIiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJWT0lDRSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIwMzMtMzMzLTMzMzMiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiMzAzMTQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5SRUdJT04sICJMQSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJCYXl0b3duIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuU1RSRUVULCAiMTAwIFdhdGVycyBFZGdlIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiMTAwIFdhdGVycyBFZGdlIEJheXRvd24gTEEgMzAzMTQgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT1NUQ09ERSwgIjMwMzE0IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OLCAiTEEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiQmF5dG93biIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgIjQyIFBsYW50YXRpb24gU3QuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiNDIgUGxhbnRhdGlvbiBTdC4gQmF5dG93biBMQSAzMDMxNCBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAvLyAiVFlQRT1JTlRFUk5FVCIgLT4gVFlQRV9DVVNUT00gKyB0aGUgbGFiZWwgIklOVEVSTkVUIgotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5MQUJFTCwgIklOVEVSTkVUIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJmb3JyZXN0Z3VtcEB3YWxsYWRhbGxhLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfTU9CSUxFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgImNlbGxAZXhhbXBsZS5jb20iKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTm90ZS5OT1RFLCAiVGhlIGZvbGxvd2luZyBub3RlIGlzIHRoZSBleGFtcGxlIGZyb20gUkZDIDIwNDUuIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJOb3cncyB0aGUgdGltZSBmb3IgYWxsIGZvbGsgdG8gY29tZSB0byB0aGUgYWlkIG9mIHRoZWlyIGNvdW50cnkuIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvdG8uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLy8gTm8gaW5mb3JtYXRpb24gYWJvdXQgaXRzIGltYWdlIGZvcm1hdCBjYW4gYmUgaW5zZXJ0ZWQuCi0gICAgICAgICAgICAgICAgLnB1dChQaG90by5QSE9UTywgc1Bob3RvQnl0ZUFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChFdmVudC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlNUQVJUX0RBVEUsICIxOTgwMDEwMSIpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5UWVBFLCBFdmVudC5UWVBFX0JJUlRIREFZKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoV2Vic2l0ZS5VUkwsICJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpCi0gICAgICAgICAgICAgICAgLnB1dChXZWJzaXRlLlRZUEUsIFdlYnNpdGUuVFlQRV9IT01FUEFHRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYzMFNpbXBsZV9QYXJzaW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjMwLCBSLnJhdy52MzBfc2ltcGxlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlZFUlNJT04iLCAiMy4wIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJBbmQgUm9pZCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJBbmQ7Um9pZDs7OyIsIEFycmF5cy5hc0xpc3QoIkFuZCIsICJSb2lkIiwgIiIsICIiLCAiIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiT1JHIiwgIk9wZW47SGFuZHNldDsgQWxsaWFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiT3BlbiIsICJIYW5kc2V0IiwgIiBBbGxpYW5jZSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlNPUlQtU1RSSU5HIiwgImFuZHJvaWQiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIwMzAwMDAwMDAwIiwgbmV3IFR5cGVTZXQoIlBSRUYiLCAiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJDTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtR05PIiwgIjAiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtR04iLCAiZ3JvdXAwIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLVJFRFVDVElPTiIsICIwIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJSRVYiLCAiMjAwODEwMzFUMDY1ODU0WiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMzBTaW1wbGUoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMzAsIFIucmF3LnYzMF9zaW1wbGUpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJBbmQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlJvaWQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiQW5kIFJvaWQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgImFuZHJvaWQiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIk9wZW4iKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQsICJIYW5kc2V0ICBBbGxpYW5jZSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSyk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiVk9JQ0UiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMwLTAwMC0wMDAwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLklTX1BSSU1BUlksIDEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFKYXBhbmVzZTFfUGFyc2luZygpIHsKLSAgICAgICAgLy8gVGhvdWdoIEphcGFuZXNlIGNhcmVlcnMgYXBwZW5kICI7Ozs7IiBhdCB0aGUgZW5kIG9mIHRoZSB2YWx1ZSBvZiAiU09VTkQiLAotICAgICAgICAvLyB2Q2FyZCAyLjEvMy4wIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgbXVsdGlwbGUgdmFsdWVzLgotICAgICAgICAvLyBEbyBub3QgbmVlZCB0byBoYW5kbGUgaXQgYXMgbXVsdGlwbGUgdmFsdWVzLgotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUywKLSAgICAgICAgICAgICAgICBSLnJhdy52MjFfamFwYW5lc2VfMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjIuMSIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzk7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOSIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMwMDAwMDAwMCIsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiVk9JQ0UiLCAiUFJFRiIpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFYyMUphcGFuZXNlMUNvbW1vbihpbnQgcmVzSWQsIGludCB2Y2FyZFR5cGUsIGJvb2xlYW4gamFwYW5lc2UpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KHZjYXJkVHlwZSwgcmVzSWQpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5IikKLSAgICAgICAgICAgICAgICAvLyBXaGlsZSB2Q2FyZCBwYXJzZXIgZG9lcyBub3Qgc3BsaXQgIlNPVU5EIiBwcm9wZXJ0eSB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgLy8gQ29udGFjdFN0cnVjdCBjYXJlIGl0LgotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUUiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAvLyBQaG9uZSBudW1iZXIgZm9ybWF0dGluZyBpcyBkaWZmZXJlbnQuCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsIChqYXBhbmVzZSA/ICIwMy0wMDAwLTAwMDAiIDogIjAzMC0wMDAtMDAwMCIpKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlZPSUNFIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLklTX1BSSU1BUlksIDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHZDYXJkIHdpdGggSmFwYW5lc2UgY2FuIGJlIHBhcnNlZCBjb3JyZWN0bHkgd2l0aAotICAgICAqIHtAbGluayBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZyNWQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjh9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFKYXBhbmVzZTFfVHlwZV9HZW5lcmljX1V0ZjgoKSB7Ci0gICAgICAgIHRlc3RWMjFKYXBhbmVzZTFDb21tb24oCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX2phcGFuZXNlXzEsIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGOCwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHZDYXJkIHdpdGggSmFwYW5lc2UgY2FuIGJlIHBhcnNlZCBjb3JyZWN0bHkgd2l0aAotICAgICAqIHtAbGluayBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZyNWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UxX1R5cGVfSmFwYW5lc2VfU2ppcygpIHsKLSAgICAgICAgdGVzdFYyMUphcGFuZXNlMUNvbW1vbigKLSAgICAgICAgICAgICAgICBSLnJhdy52MjFfamFwYW5lc2VfMSwgVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUywgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdkNhcmQgd2l0aCBKYXBhbmVzZSBjYW4gYmUgcGFyc2VkIGNvcnJlY3RseSB3aXRoCi0gICAgICoge0BsaW5rIGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnI1ZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjh9LgotICAgICAqIHNpbmNlIHZDYXJkIDIuMSBzcGVjaWZpZXMgdGhlIGNoYXJzZXQgb2YgZWFjaCBsaW5lIGlmIGl0IGNvbnRhaW5zIG5vbi1Bc2NpaS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UxX1R5cGVfSmFwYW5lc2VfVXRmOCgpIHsKLSAgICAgICAgdGVzdFYyMUphcGFuZXNlMUNvbW1vbigKLSAgICAgICAgICAgICAgICBSLnJhdy52MjFfamFwYW5lc2VfMSwgVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfVVRGOCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUphcGFuZXNlMl9QYXJzaW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUywKLSAgICAgICAgICAgICAgICBSLnJhdy52MjFfamFwYW5lc2VfMik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjIuMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTQ7XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMxOzs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNCIsICJcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJcdTVCODlcdTg1RTRcdTAwMjBcdTMwRURcdTMwQTRcdTMwQzlcdTAwMjBcdTAwMzEiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLCBudWxsLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlNPVU5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzM7XHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDMxOzs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiO1x1Njc3MVx1NEVBQ1x1OTBGRFx1NkUwQlx1OEMzN1x1NTMzQVx1Njg1QyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUxOFx1NzUzQVx1MDAzMlx1MDAzNlx1MDAyRFx1MDAzMVx1MzBCQiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBFQlx1MzBFQVx1MzBBMlx1MzBGM1x1MzBCRlx1MzBFRlx1MzBGQ1x1MDAzNiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1OTY4RTs7OzsxNTAtODUxMjsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1Njc3MVx1NEVBQ1x1OTBGRFx1NkUwQlx1OEMzN1x1NTMzQVx1Njg1QyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTE4XHU3NTNBXHUwMDMyXHUwMDM2XHUwMDJEXHUwMDMxXHUzMEJCIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRUJcdTMwRUFcdTMwQTJcdTMwRjNcdTMwQkZcdTMwRUZcdTMwRkMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MDAzNlx1OTY4RSIsICIiLCAiIiwgIiIsICIxNTAtODUxMiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzLCBuZXcgVHlwZVNldCgiSE9NRSIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5PVEUiLCAiXHUzMEUxXHUzMEUyIiwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UyX1R5cGVfR2VuZXJpY19VdGY4KCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfamFwYW5lc2VfMik7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiXHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTVCODlcdTg1RTRcdTAwMjBcdTMwRURcdTMwQTRcdTMwQzlcdTAwMjBcdTAwMzEiKQotICAgICAgICAgICAgICAgIC8vIENvbnRhY3RTdHJ1Y3Qgc2hvdWxkIGNvcnJlY3RseSBzcGxpdCAiU09VTkQiIHByb3BlcnR5IGludG8gc2V2ZXJhbCBlbGVtZW50cywKLSAgICAgICAgICAgICAgICAvLyBldmVuIHRob3VnaCBWQ2FyZFBhcnNlciBzaWRlIGRvZXMgbm90IGNhcmUgaXQuCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDMxIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsICIxNTAtODUxMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTRFQUNcdTkwRkRcdTZFMEJcdThDMzdcdTUzM0FcdTY4NUMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMThcdTc1M0FcdTAwMzJcdTAwMzZcdTAwMkRcdTAwMzFcdTMwQkIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRUJcdTMwRUFcdTMwQTJcdTMwRjNcdTMwQkZcdTMwRUZcdTMwRkMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwMzZcdTk2OEUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTRFQUNcdTkwRkRcdTZFMEJcdThDMzdcdTUzM0FcdTY4NUMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMThcdTc1M0FcdTAwMzJcdTAwMzZcdTAwMkRcdTAwMzFcdTMwQkIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRUJcdTMwRUFcdTMwQTJcdTMwRjNcdTMwQkZcdTMwRUZcdTMwRkMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwMzZcdTk2OEUgMTUwLTg1MTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIlx1MzBFMVx1MzBFMiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFNdWx0aXBsZUVudHJ5Q2FzZV9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMsCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX211bHRpcGxlX2VudHJ5KTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlZFUlNJT04iLCAiMi4xIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMzs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMzIiwgIiIsICIiLCAiIiwgIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLCBudWxsLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlNPVU5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUVcdTAwMzM7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICI5IiwgbmV3IFR5cGVTZXQoIlgtTkVDLVNFQ1JFVCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxMCIsIG5ldyBUeXBlU2V0KCJYLU5FQy1IT1RFTCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxMSIsIG5ldyBUeXBlU2V0KCJYLU5FQy1TQ0hPT0wiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTIiLCBuZXcgVHlwZVNldCgiRkFYIiwgIkhPTUUiKSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjIuMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzQ7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNCIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDM0Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTMiLCBuZXcgVHlwZVNldCgiTU9ERU0iKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTQiLCBuZXcgVHlwZVNldCgiUEFHRVIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTUiLCBuZXcgVHlwZVNldCgiWC1ORUMtRkFNSUxZIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE2IiwgbmV3IFR5cGVTZXQoIlgtTkVDLUdJUkwiKSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjIuMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzU7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNSIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDM1Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTciLCBuZXcgVHlwZVNldCgiWC1ORUMtQk9ZIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE4IiwgbmV3IFR5cGVTZXQoIlgtTkVDLUZSSUVORCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxOSIsIG5ldyBUeXBlU2V0KCJYLU5FQy1QSFMiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMjAiLCBuZXcgVHlwZVNldCgiWC1ORUMtUkVTVEFVUkFOVCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxTXVsdGlwbGVFbnRyeUNhc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTLAotICAgICAgICAgICAgICAgIFIucmF3LnYyMV9tdWx0aXBsZV9lbnRyeSk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUVcdTAwMzMiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtU0VDUkVUIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjkiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtSE9URUwiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTAiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtU0NIT09MIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjExIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0ZBWF9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTIiKTsKLQotICAgICAgICBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDM0IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzNCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk1PREVNIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEzIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1BBR0VSKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTQiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtRkFNSUxZIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE1Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLUdJUkwiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTYiKTsKLQotICAgICAgICBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDM1IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzNSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1CT1kiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTciKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtRlJJRU5EIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE4Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLVBIUyIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxOSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1SRVNUQVVSQU5UIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjIwIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElnbm9yZUFnZW50VjIxX1BhcnNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfd2lubW9fNjUpOwotICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXNGb3JWYWx1ZSA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIGNvbnRlbnRWYWx1ZXNGb3JWYWx1ZS5wdXQoIlZBTFVFIiwgIkRBVEUiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlZFUlNJT04iLCAiMi4xIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgQXJyYXlzLmFzTGlzdCgiRXhhbXBsZSIsICIiLCAiIiwgIiIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJFeGFtcGxlIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBTk5JVkVSU0FSWSIsICIyMDA5MTAxMCIsIGNvbnRlbnRWYWx1ZXNGb3JWYWx1ZSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBR0VOVCIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtTk8iLCAiIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElnbm9yZUFnZW50VjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfd2lubW9fNjUpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgQ29udGVudFZhbHVlc1ZlcmlmaWVyKCk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkV4YW1wbGUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiRXhhbXBsZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb2xlcmF0ZUludmFsaWRDb21tZW50TGlrZUxpbmVWMjEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9pbnZhbGlkX2NvbW1lbnRfbGluZSk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQ29uZmVyZW5jZSBDYWxsIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkNvbmZlcmVuY2UgQ2FsbCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJUaGlzIGlzIGFuIChzaGFycCAtPiM8LSBzaGFycCkgZXhhbXBsZS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhpcyBtZXNzYWdlIG11c3QgTk9UIGJlIGlnbm9yZWQuIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhZ2VyVjMwX1BhcnNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjMwLCBSLnJhdy52MzBfY29tbWFfc2VwYXJhdGVkKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlZFUlNJT04iLCAiMy4wIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgQXJyYXlzLmFzTGlzdCgiRiIsICJHIiwgIk0iLCAiIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICI2MTAxMjMxMjM0QHBhZ2Vyc2FtcGxlLmNvbSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiV09SSyIsICJNU0ciLCAiUEFHRVIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhZ2VyVjMwKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjMwLCBSLnJhdy52MzBfY29tbWFfc2VwYXJhdGVkKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIk0iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkciKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiRyBNIEYiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfUEFHRVIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI2MTAxMjMxMjM0QHBhZ2Vyc2FtcGxlLmNvbSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aUJ5dGVQcm9wVjMwX1BhcnNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjMwLCBSLnJhdy52MzBfbXVsdGlieXRlX3BhcmFtKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlZFUlNJT04iLCAiMy4wIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgQXJyYXlzLmFzTGlzdCgiRiIsICJHIiwgIk0iLCAiIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxIiwgbmV3IFR5cGVTZXQoIlx1OEQzOSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlCeXRlUHJvcFYzMCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX211bHRpYnl0ZV9wYXJhbSk7Ci0gICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkYiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJNIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJHIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkcgTSBGIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiXHU4RDM5IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRKYXBhbml6YXRpb25UZXN0cy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSmFwYW5pemF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2MDM0Mi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRKYXBhbml6YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5OaWNrbmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0uVHlwZVNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLXB1YmxpYyBjbGFzcyBWQ2FyZEphcGFuaXphdGlvblRlc3RzIGV4dGVuZHMgVkNhcmRUZXN0c0Jhc2UgewotICAgIHByaXZhdGUgdm9pZCB0ZXN0TmFtZVV0ZjhDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHUzMDc1XHUzMDhCXHUzMDY5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJcdTMwOTFcdTMwOEFcdTMwNEIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRyLiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJQaC5EIik7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9Ci0gICAgICAgICAgICAoVkNhcmRDb25maWcuaXNWMzAodmNhcmRUeXBlKSA/IG51bGwgOiBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmOCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJGTiIsICJEci4gXHUzMDc1XHUzMDhCXHUzMDY5IEIgXHUzMDkxXHUzMDhBXHUzMDRCIFBoLkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcykKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgIlx1MzA3NVx1MzA4Qlx1MzA2OTtcdTMwOTFcdTMwOEFcdTMwNEI7QjtEci47UGguRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDc1XHUzMDhCXHUzMDY5IiwgIlx1MzA5MVx1MzA4QVx1MzA0QiIsICJCIiwgIkRyLiIsICJQaC5EIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lVXRmOFYyMSgpIHsKLSAgICAgICAgdGVzdE5hbWVVdGY4Q29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lVXRmOFYzMCgpIHsKLSAgICAgICAgdGVzdE5hbWVVdGY4Q29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1VURjgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lU2hpZnRKaXMoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9TSklTKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHUzMDc1XHUzMDhCXHUzMDY5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJcdTMwOTFcdTMwOEFcdTMwNEIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRyLiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJQaC5EIik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIkRyLiBcdTMwNzVcdTMwOEJcdTMwNjkgQiBcdTMwOTFcdTMwOEFcdTMwNEIgUGguRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsICJcdTMwNzVcdTMwOEJcdTMwNjk7XHUzMDkxXHUzMDhBXHUzMDRCO0I7RHIuO1BoLkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA3NVx1MzA4Qlx1MzA2OSIsICJcdTMwOTFcdTMwOEFcdTMwNEIiLCAiQiIsICJEci4iLCAiUGguRCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvQ29NbyBwaG9uZXMgcmVxdWlyZSBhbGwgbmFtZSBlbGVtZW50cyBzaG91bGQgYmUgaW4gImZhbWlseSBuYW1lIiBmaWVsZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZURvQ29NbygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHUzMDc1XHUzMDhCXHUzMDY5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJcdTMwOTFcdTMwOEFcdTMwNEIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRyLiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJQaC5EIik7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGZ1bGxOYW1lID0gIkRyLiBcdTMwNzVcdTMwOEJcdTMwNjkgQiBcdTMwOTFcdTMwOEFcdTMwNEIgUGguRCI7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgZnVsbE5hbWUgKyAiOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KGZ1bGxOYW1lLCAiIiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRk4iLCBmdWxsTmFtZSwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlNPVU5EIiwgIjs7OzsiLCBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBob25ldGljTmFtZUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdTMwODRcdTMwN0VcdTMwNjAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1MzA1Rlx1MzA4RFx1MzA0NiIpOwotCi0gICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9Ci0gICAgICAgICAgICAoVkNhcmRDb25maWcudXNlc1NoaWZ0SmlzKHZjYXJkVHlwZSkgPwotICAgICAgICAgICAgICAgICAgICAoVkNhcmRDb25maWcuaXNWMzAodmNhcmRUeXBlKSA/IG1Db250ZW50VmFsdWVzRm9yU0ppcyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFNKaXMpIDoKLSAgICAgICAgICAgICAgICAgICAgKFZDYXJkQ29uZmlnLmlzVjMwKHZjYXJkVHlwZSkgPyBudWxsIDogbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjgpKTsKLSAgICAgICAgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUxBU1QtTkFNRSIsICJcdTMwODRcdTMwN0VcdTMwNjAiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcykKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLU1JRERMRS1OQU1FIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcykKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUZJUlNULU5BTUUiLCAiXHUzMDVGXHUzMDhEXHUzMDQ2IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWMzAodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIlNPUlQtU1RSSU5HIiwKLSAgICAgICAgICAgICAgICAgICAgIlx1MzA4NFx1MzA3RVx1MzA2MCBcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAgXHUzMDVGXHUzMDhEXHUzMDQ2IiwKLSAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29udGVudFZhbHVlc0J1aWxkZXIgYnVpbGRlciA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICBidWlsZGVyLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1MzA4NFx1MzA3RVx1MzA2MCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIlx1MzBERlx1MzBDOVx1MzBFQlx1MzBDRFx1MzBGQ1x1MzBFMCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiXHUzMDVGXHUzMDhEXHUzMDQ2IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwODRcdTMwN0VcdTMwNjAgXHUzMERGXHUzMEM5XHUzMEVCXHUzMENEXHUzMEZDXHUzMEUwICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA1Rlx1MzA4RFx1MzA0NiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZXRpY05hbWVGb3JKYXBhbmVzZVYyMVV0ZjgoKSB7Ci0gICAgICAgIHRlc3RQaG9uZXRpY05hbWVDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfVVRGOCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25ldGljTmFtZUZvckphcGFuZXNlVjIxU2ppcygpIHsKLSAgICAgICAgdGVzdFBob25ldGljTmFtZUNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lRm9ySmFwYW5lc2VWMzBVdGY4KCkgewotICAgICAgICB0ZXN0UGhvbmV0aWNOYW1lQ29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1VURjgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZXRpY05hbWVGb3JKYXBhbmVzZVYzMFNKaXMoKSB7Ci0gICAgICAgIHRlc3RQaG9uZXRpY05hbWVDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfU0pJUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25ldGljTmFtZUZvck1vYmlsZVYyMV8xKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHUzMDg0XHUzMDdFXHUzMDYwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiXHUzMERGXHUzMEM5XHUzMEVCXHUzMENEXHUzMEZDXHUzMEUwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJcdTMwNUZcdTMwOERcdTMwNDYiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY5NFx1RkY4Rlx1RkY4MFx1RkY5RSBcdUZGOTBcdUZGODRcdUZGOUVcdUZGOTlcdUZGODhcdUZGNzBcdUZGOTEgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjgwXHVGRjlCXHVGRjczOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpKTsKLSAgICAgICAgQ29udGVudFZhbHVlc0J1aWxkZXIgYnVpbGRlciA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICBidWlsZGVyLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1RkY5NFx1RkY4Rlx1RkY4MFx1RkY5RSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGOTBcdUZGODRcdUZGOUVcdUZGOTlcdUZGODhcdUZGNzBcdUZGOTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1RkY4MFx1RkY5Qlx1RkY3MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIFx1RkY5MFx1RkY4NFx1RkY5RVx1RkY5OVx1RkY4OFx1RkY3MFx1RkY5MSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGODBcdUZGOUJcdUZGNzMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lRm9yTW9iaWxlVjIxXzIoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdTMwODRcdTMwN0VcdTMwNjAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1MzA1Rlx1MzA4RFx1MzA0NiIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJTT1VORCIsICJcdUZGOTRcdUZGOEZcdUZGODBcdUZGOUUgXHVGRjgwXHVGRjlCXHVGRjczOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIikpOwotICAgICAgICBDb250ZW50VmFsdWVzQnVpbGRlciBidWlsZGVyID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgIGJ1aWxkZXIucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJcdUZGODBcdUZGOUJcdUZGNzMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIFx1RkY4MFx1RkY5Qlx1RkY3MyIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc1dpdGhKYXBhbmVzZUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiXHU3OUMxXHU2NkY4XHU3QkIxMDciKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsICJcdTk2REJcdTg5OEJcdTZDQTJcdTY3NTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiXHU5RTdGXHU5QUE4XHU1RTAyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OLCAiXHUwMEQ3XHUwMEQ3XHU3NzBDIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsICI0OTQtMTMxMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksICJcdTY1RTVcdTY3MkMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwNTNcdTMwOTNcdTMwNkFcdTMwNjhcdTMwNTNcdTMwOERcdTMwOTJcdTg5OEIiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJcdTMwOEJcdTMwNkFcdTMwOTNcdTMwNjZcdTY2ODdcdTRFQkFcdTMwNjdcdTMwNTlcdTMwNEJcdUZGMUYiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5MQUJFTCwgIlx1MzA0QVx1MzA4Mlx1MzA2MVx1MzA0Qlx1MzA0OFx1MzA4QSIpOwotCi0gICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9IChWQ2FyZENvbmZpZy51c2VzU2hpZnRKaXModmNhcmRUeXBlKSA/Ci0gICAgICAgICAgICAgICAgKFZDYXJkQ29uZmlnLmlzVjMwKHZjYXJkVHlwZSkgPyBtQ29udGVudFZhbHVlc0ZvclNKaXMgOgotICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcykgOgotICAgICAgICAgICAgICAgIChWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpID8gbUNvbnRlbnRWYWx1ZXNGb3JVdGY4IDoKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjgpKTsKLQotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKTsKLSAgICAgICAgLy8gTEFCRUwgbXVzdCBiZSBpZ25vcmVkIGluIHZDYXJkIDIuMS4gQXMgZm9yIHZDYXJkIDMuMCwgdGhlIGN1cnJlbnQgYmVoYXZpb3IgaXMKLSAgICAgICAgLy8gc2FtZSBhcyB0aGF0IGluIHZDYXJkIDMuMCwgd2hpY2ggY2FuIGJlIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZS4KLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsIEFycmF5cy5hc0xpc3QoIlx1NzlDMVx1NjZGOFx1N0JCMTA3IiwKLSAgICAgICAgICAgICAgICAiIiwgIlx1OTZEQlx1ODk4Qlx1NkNBMlx1Njc1MSIsICJcdTlFN0ZcdTlBQThcdTVFMDIiLCAiXHUwMEQ3XHUwMEQ3XHU3NzBDIiwKLSAgICAgICAgICAgICAgICAiNDk0LTEzMTMiLCAiXHU2NUU1XHU2NzJDIiksCi0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcyk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICJcdTc5QzFcdTY2RjhcdTdCQjEwNyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgIlx1OTZEQlx1ODk4Qlx1NkNBMlx1Njc1MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJcdTlFN0ZcdTlBQThcdTVFMDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5SRUdJT04sICJcdTAwRDdcdTAwRDdcdTc3MEMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT1NUQ09ERSwgIjQ5NC0xMzEzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIlx1NjVFNVx1NjcyQyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1NjVFNVx1NjcyQyA0OTQtMTMxMyBcdTAwRDdcdTAwRDdcdTc3MEMgXHU5RTdGXHU5QUE4XHU1RTAyICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1OTZEQlx1ODk4Qlx1NkNBMlx1Njc1MSAiICsgIlx1NzlDMVx1NjZGOFx1N0JCMTA3IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc3dpdGhKYXBhbmVzZVYyMSgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NXaXRoSmFwYW5lc2VDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdGhhdCBvbmx5IG9uZSBhZGRyZXNzIGZpZWxkIGlzIGVtaXR0ZWQgdG93YXJkIERvQ29NbyBwaG9uZXMuCi0gICAgICogUHJlZmVyZWQgdHlwZSBtdXN0IChzaG91bGQ/KSBiZTogSE9NRSA+IFdPUksgPiBPVEhFUiA+IENVU1RPTQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZHJyZXNzRm9yRG9Db01vXzEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTyk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMyIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMLCAiY3VzdG9tIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICI0Iik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIzIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiksIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZHJyZXNzRm9yRG9Db01vXzIoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTyk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjEiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsICJjdXN0b20iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjMiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUkVEVUNUSU9OIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1OTyIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtRENNLUhNTi1NT0RFIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIjIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIldPUksiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkcnJlc3NGb3JEb0NvTW9fMygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5MQUJFTCwgImN1c3RvbTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjEiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfT1RIRVIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMLCAiY3VzdG9tMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMyIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5PIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1EQ00tSE1OLU1PREUiLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLCBBcnJheXMuYXNMaXN0KCIyIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHRoZSB2Q2FyZCBleHBvcnRlciB0b2xlcmF0ZXMgbnVsbCBUWVBFLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZHJyZXNzRm9yRG9Db01vXzQoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTyk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIzIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiNCIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiNSIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5PIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1EQ00tSE1OLU1PREUiLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiMyIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIpLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEphcGFuZXNlUGhvbmVOdW1iZXJDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMTIzNDEyMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjA5MDEyMzQxMjM0IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMDMtMTIzNC0xMjM0IiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMDkwLTEyMzQtMTIzNCIsIG5ldyBUeXBlU2V0KCJDRUxMIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyVjIxXzEoKSB7Ci0gICAgICAgIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyQ29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyVjMwKCkgewotICAgICAgICB0ZXN0SmFwYW5lc2VQaG9uZU51bWJlckNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9VVEY4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmFwYW5lc2VQaG9uZU51bWJlckRvQ29NbygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMTIzNDEyMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjA5MDEyMzQxMjM0IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIwMy0xMjM0LTEyMzQiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIwOTAtMTIzNC0xMjM0IiwgbmV3IFR5cGVTZXQoIkNFTEwiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vdGVEb0NvTW8oKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTyk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIm5vdGUxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIm5vdGUyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIm5vdGUzIik7Ci0KLSAgICAgICAgLy8gTW9yZSB0aGFuIG9uZSBub3RlIGZpZWxkcyBtdXN0IGJlIGFnZ3JlZ2F0ZWQgaW50byBvbmUgbm90ZS4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk5PVEUiLCAibm90ZTFcbm5vdGUyXG5ub3RlMyIsIG1Db250ZW50VmFsdWVzRm9yUVApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbmRyb2lkQ3VzdG9tVjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19VVEY4KTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTmlja25hbWUuTkFNRSwgIlx1MzA0RFx1MzA4M1x1MzBGQ1x1MzBBOFx1MzBDM1x1MzBDMVx1MzBGQyIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQU5EUk9JRC1DVVNUT00iLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA0RFx1MzA4M1x1MzBGQ1x1MzBBOFx1MzBDM1x1MzBDMVx1MzBGQyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmOCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVGVzdHNCYXNlLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRUZXN0c0Jhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2MDAzZi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRUZXN0c0Jhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLQotLyoqCi0gKiBCYXNlQ2xhc3MgZm9yIHZDYXJkIHVuaXQgdGVzdHMgd2l0aCB1dGlsaXR5IGNsYXNzZXMuCi0gKiBQbGVhc2UgZG8gbm90IGFkZCBlYWNoIHVuaXQgdGVzdCBoZXJlLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRUZXN0c0Jhc2UgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFYyMSA9IFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWMzAgPSBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9HRU5FUklDX1VURjg7Ci0KLSAgICAvLyBEbyBub3QgbW9kaWZ5IHRoZXNlIGR1cmluZyB0ZXN0cy4KLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvclFQOwotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZW50VmFsdWVzIG1Db250ZW50VmFsdWVzRm9yU0ppczsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvclV0Zjg7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFNKaXM7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0Zjg7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMjE7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMzA7Ci0KLSAgICBwcm90ZWN0ZWQgVkNhcmRWZXJpZmllciBtVmVyaWZpZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Ta2lwVmVyaWZpY2F0aW9uOwotCi0gICAgcHVibGljIFZDYXJkVGVzdHNCYXNlKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUC5wdXQoIkVOQ09ESU5HIiwgIlFVT1RFRC1QUklOVEFCTEUiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLnB1dCgiQ0hBUlNFVCIsICJTSElGVF9KSVMiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JVdGY4ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JVdGY4LnB1dCgiQ0hBUlNFVCIsICJVVEYtOCIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzLnB1dCgiRU5DT0RJTkciLCAiUVVPVEVELVBSSU5UQUJMRSIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcy5wdXQoIkNIQVJTRVQiLCAiU0hJRlRfSklTIik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjgucHV0KCJFTkNPRElORyIsICJRVU9URUQtUFJJTlRBQkxFIik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4LnB1dCgiQ0hBUlNFVCIsICJVVEYtOCIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvckJhc2U2NFYyMSA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjIxLnB1dCgiRU5DT0RJTkciLCAiQkFTRTY0Iik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjMwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMzAucHV0KCJFTkNPRElORyIsICJiIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVzdEFuZHJvaWRUZXN0Q2FzZVNldHVwUHJvcGVybHkoKSB7Ci0gICAgICAgIHN1cGVyLnRlc3RBbmRyb2lkVGVzdENhc2VTZXR1cFByb3Blcmx5KCk7Ci0gICAgICAgIG1Ta2lwVmVyaWZpY2F0aW9uID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb257Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIG1WZXJpZmllciA9IG5ldyBWQ2FyZFZlcmlmaWVyKHRoaXMpOwotICAgICAgICBtU2tpcFZlcmlmaWNhdGlvbiA9IGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIGlmICghbVNraXBWZXJpZmljYXRpb24pIHsKLSAgICAgICAgICAgIG1WZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzVGVzdHMuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgwNWJlZS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRVdGlsc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFV0aWxzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBWQ2FyZFV0aWxzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCkgewotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoKFN0cmluZyludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgoU3RyaW5nW10pbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoKExpc3Q8U3RyaW5nPiludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgiIikpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IikpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIikpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMHgyMDsgaSA8IDB4N0Y7IGkrKykgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoKGNoYXIpaSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKGJ1aWxkZXIudG9TdHJpbmcoKSkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoIlxyXG4iKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoIlx1MDAxOSIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgiXHUwMDdGIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoKSB7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoKFN0cmluZyludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoKFN0cmluZ1tdKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgoTGlzdDxTdHJpbmc+KW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiIikpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiKSk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAweDIwOyBpIDwgMHg3RjsgaSsrKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgoY2hhcilpKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGJ1aWxkZXIudG9TdHJpbmcoKSkpOwotICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiXHUwMDE5IikpOwotICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiXHUwMDdGIikpOwotICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiXHIiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJcbiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbigpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oKFN0cmluZyludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKChTdHJpbmdbXSludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKChMaXN0PFN0cmluZz4pbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbigiIikpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIjAxMjM0NTY3ODktIikpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDB4MzA7IGkrKykgewotICAgICAgICAgICAgaWYgKGkgPT0gMHgyRCkgeyAgLy8gLQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKFN0cmluZy52YWx1ZU9mKChjaGFyKWkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDB4M0E7IGkgPCAweDQxOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihTdHJpbmcudmFsdWVPZigoY2hhcilpKSkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAweDVCOyBpIDwgMHg2MTsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oU3RyaW5nLnZhbHVlT2YoKGNoYXIpaSkpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMHg3QjsgaSA8IDB4MTAwOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihTdHJpbmcudmFsdWVPZigoY2hhcilpKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nQXZhaWxhYmxlQXNWMzBQYXJhbVZhbHVlKCkgewotICAgICAgICAvLyBTbW9rZSB0ZXN0cy4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJIT01FIiwgVkNhcmRVdGlscy50b1N0cmluZ0F2YWlsYWJsZUFzVjMwUGFyYW1lVmFsdWUoIkhPTUUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVEVMIiwgVkNhcmRVdGlscy50b1N0cmluZ0F2YWlsYWJsZUFzVjMwUGFyYW1lVmFsdWUoIlRFTCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQQUdFUiIsIFZDYXJkVXRpbHMudG9TdHJpbmdBdmFpbGFibGVBc1YzMFBhcmFtZVZhbHVlKCJQQUdFUiIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlwiXCIiLCBWQ2FyZFV0aWxzLnRvU3RyaW5nQXZhaWxhYmxlQXNWMzBQYXJhbWVWYWx1ZSgiIikpOwotCi0gICAgICAgIC8vIG5vbi1Bc2NpaSBtdXN0IGJlIGFsbG93ZWQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJcdTRFOEJcdTUyRDlcdTYyNDAiLAotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMudG9TdHJpbmdBdmFpbGFibGVBc1YzMFBhcmFtZVZhbHVlKCJcdTRFOEJcdTUyRDlcdTYyNDAiKSk7Ci0gICAgICAgIC8vIFJlcG9ydGVkIGFzIGJ1ZyByZXBvcnQuCi0gICAgICAgIGFzc2VydEVxdWFscygiXHU4RDM5IiwgVkNhcmRVdGlscy50b1N0cmluZ0F2YWlsYWJsZUFzVjMwUGFyYW1lVmFsdWUoIlx1OEQzOSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJcImNvbW1hLHNlcGFyYXRlZFwiIiwKLSAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLnRvU3RyaW5nQXZhaWxhYmxlQXNWMzBQYXJhbWVWYWx1ZSgiY29tbWEsc2VwYXJhdGVkIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlwiY29sb246YXdhcmVcIiIsCi0gICAgICAgICAgICAgICAgVkNhcmRVdGlscy50b1N0cmluZ0F2YWlsYWJsZUFzVjMwUGFyYW1lVmFsdWUoImNvbG9uOmF3YXJlIikpOwotICAgICAgICAvLyBDVEwgY2hhcmFjdGVycy4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDVExFeGFtcGxlIiwKLSAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLnRvU3RyaW5nQXZhaWxhYmxlQXNWMzBQYXJhbWVWYWx1ZSgiQ1RMXHUwMDAxRXhhbXBsZSIpKTsKLSAgICAgICAgLy8gRFFVT1RFIG11c3QgYmUgcmVtb3ZlZC4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJxdW90ZWQiLAotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMudG9TdHJpbmdBdmFpbGFibGVBc1YzMFBhcmFtZVZhbHVlKCJcInF1b3RlZFwiIikpOwotICAgICAgICAvLyBEUVVPVEUgbXVzdCBiZSByZW1vdmVkIGJhc2ljYWxseSwgYnV0IHdlIHNob3VsZCBkZXRlY3QgYSBzcGFjZSwgd2hpY2gKLSAgICAgICAgLy8gcmVxdWlyZSB1cyB0byB1c2UgRFFVT1RFIGFnYWluLgotICAgICAgICAvLyBSaWdodC1zaWRlIGhhcyBvbmUgbW9yZSBpbGxlZ2FsIGRxdW90ZSB0byB0ZXN0IHF1b3RlLWhhbmRsZSBjb2RlIHRob3JvdWdobHkuCi0gICAgICAgIGFzc2VydEVxdWFscygiXCJBbHJlYWR5IHF1b3RlZFwiIiwKLSAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLnRvU3RyaW5nQXZhaWxhYmxlQXNWMzBQYXJhbWVWYWx1ZSgiXCJBbHJlYWR5IHF1b3RlZFwiXCIiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVmVyaWZpZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYjViOWIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5FbnRpdHlJdGVyYXRvcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb21wb3NlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5Q29uc3RydWN0b3I7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRJbnRlcnByZXRlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEludGVycHJldGVyQ29sbGVjdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcl9WMjE7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXJfVjMwOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZXh0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyogcGFja2FnZSAqLyBjbGFzcyBDdXN0b21Nb2NrQ29udGV4dCBleHRlbmRzIE1vY2tDb250ZXh0IHsKLSAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbVJlc29sdmVyOwotICAgIHB1YmxpYyBDdXN0b21Nb2NrQ29udGV4dChDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLSAgICAgICAgbVJlc29sdmVyID0gcmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbnRlbnRSZXNvbHZlciBnZXRDb250ZW50UmVzb2x2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBtUmVzb2x2ZXI7Ci0gICAgfQotfQotCi0vKiBwYWNrYWdlICovIGNsYXNzIFZDYXJkVmVyaWZpZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkVmVyaWZpZXIiOwotCi0gICAgcHJpdmF0ZSBjbGFzcyBWQ2FyZFZlcmlmaWVySW50ZXJuYWwgaW1wbGVtZW50cyBWQ2FyZENvbXBvc2VyLk9uZUVudHJ5SGFuZGxlciB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uSW5pdChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uRW50cnlDcmVhdGVkKFN0cmluZyB2Y2FyZCkgewotICAgICAgICAgICAgdmVyaWZ5T25lVkNhcmQodmNhcmQpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgb25UZXJtaW5hdGUoKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFuZHJvaWRUZXN0Q2FzZSBtVGVzdENhc2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWQ2FyZFZlcmlmaWVySW50ZXJuYWwgbVZDYXJkVmVyaWZpZXJJbnRlcm5hbDsKLSAgICBwcml2YXRlIGludCBtVkNhcmRUeXBlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNWMzA7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0RvQ29NbzsKLQotICAgIC8vIE9ubHkgb25lIG9mIHRoZW0gbXVzdCBiZSBub24tZW1wdHkuCi0gICAgcHJpdmF0ZSBFeHBvcnRUZXN0UmVzb2x2ZXIgbUV4cG9ydFRlc3RSZXNvbHZlcjsKLSAgICBwcml2YXRlIElucHV0U3RyZWFtIG1JbnB1dFN0cmVhbTsKLQotICAgIC8vIFRvIGFsbG93IGR1cGxpY2F0aW9uLCB1c2UgbGlzdCBpbnN0ZWFkIG9mIHNldC4KLSAgICAvLyBXaGVuIG51bGwsIHdlIGRvbid0IG5lZWQgdG8gZG8gdGhlIHZlcmlmaWNhdGlvbi4KLSAgICBwcml2YXRlIFByb3BlcnR5Tm9kZXNWZXJpZmllciBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyOwotICAgIHByaXZhdGUgTGluZVZlcmlmaWVyIG1MaW5lVmVyaWZpZXI7Ci0gICAgcHJpdmF0ZSBDb250ZW50VmFsdWVzVmVyaWZpZXIgbUNvbnRlbnRWYWx1ZXNWZXJpZmllcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUluaXRpYWxpemVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVmVyaWZpZWQgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBWQ2FyZFZlcmlmaWVyKEFuZHJvaWRUZXN0Q2FzZSBhbmRyb2lkVGVzdENhc2UpIHsKLSAgICAgICAgbVRlc3RDYXNlID0gYW5kcm9pZFRlc3RDYXNlOwotICAgICAgICBtVkNhcmRWZXJpZmllckludGVybmFsID0gbmV3IFZDYXJkVmVyaWZpZXJJbnRlcm5hbCgpOwotICAgICAgICBtRXhwb3J0VGVzdFJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgbUlucHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgICAgIG1WZXJpZmllZCA9IGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXRGb3JFeHBvcnRUZXN0KGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgaWYgKG1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIkFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBtRXhwb3J0VGVzdFJlc29sdmVyID0gbmV3IEV4cG9ydFRlc3RSZXNvbHZlcihtVGVzdENhc2UpOwotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgICAgICBtSXNWMzAgPSBWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpOwotICAgICAgICBtSXNEb0NvTW8gPSBWQ2FyZENvbmZpZy5pc0RvQ29Nbyh2Y2FyZFR5cGUpOwotICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXRGb3JJbXBvcnRUZXN0KGludCB2Y2FyZFR5cGUsIGludCByZXNJZCkgewotICAgICAgICBpZiAobUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiQWxyZWFkeSBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgICAgIG1Jc1YzMCA9IFZDYXJkQ29uZmlnLmlzVjMwKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Jc0RvQ29NbyA9IFZDYXJkQ29uZmlnLmlzRG9Db01vKHZjYXJkVHlwZSk7Ci0gICAgICAgIHNldElucHV0UmVzb3VyY2VJZChyZXNJZCk7Ci0gICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldElucHV0UmVzb3VyY2VJZChpbnQgcmVzSWQpIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBtVGVzdENhc2UuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShyZXNJZCk7Ci0gICAgICAgIGlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiV3JvbmcgcmVzSWQ6ICIgKyByZXNJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0SW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotICAgICAgICBpZiAobUV4cG9ydFRlc3RSZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiYWRkSW5wdXRFbnRyeSgpIGlzIGNhbGxlZC4iKTsKLSAgICAgICAgfSBlbHNlIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIklucHV0U3RyZWFtIGlzIGFscmVhZHkgc2V0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgbUlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRhY3RFbnRyeSBhZGRJbnB1dEVudHJ5KCkgewotICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIk5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoInNldElucHV0U3RyZWFtIGlzIGNhbGxlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRXhwb3J0VGVzdFJlc29sdmVyLmFkZElucHV0Q29udGFjdEVudHJ5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByb3BlcnR5Tm9kZXNWZXJpZmllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyID0gbmV3IFByb3BlcnR5Tm9kZXNWZXJpZmllcihtVGVzdENhc2UpOwotICAgICAgICB9Ci0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9Ci0gICAgICAgICAgICAgICAgbVByb3BlcnR5Tm9kZXNWZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgKG1Jc1YzMCA/ICIzLjAiIDogIjIuMSIpKTsKLQotICAgICAgICByZXR1cm4gZWxlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBhZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGlmIChtSXNWMzApIHsKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIiIpLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiIik7Ci0gICAgICAgIH0gZWxzZSBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICIiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWxlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGluZVZlcmlmaWVyRWxlbSBhZGRMaW5lVmVyaWZpZXJFbGVtKCkgewotICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIk5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtTGluZVZlcmlmaWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1MaW5lVmVyaWZpZXIgPSBuZXcgTGluZVZlcmlmaWVyKG1UZXN0Q2FzZSwgbVZDYXJkVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1MaW5lVmVyaWZpZXIuYWRkTGluZVZlcmlmaWVyRWxlbSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKSB7Ci0gICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiTm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Db250ZW50VmFsdWVzVmVyaWZpZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNWZXJpZmllciA9IG5ldyBDb250ZW50VmFsdWVzVmVyaWZpZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtQ29udGVudFZhbHVlc1ZlcmlmaWVyLmFkZEVsZW0obVRlc3RDYXNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5T25lVkNhcmQoZmluYWwgU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgIC8vIExvZy5kKCJAQEAiLCB2Y2FyZCk7Ci0gICAgICAgIGZpbmFsIFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlcjsKLSAgICAgICAgaWYgKG1Db250ZW50VmFsdWVzVmVyaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgVk5vZGVCdWlsZGVyIHZub2RlQnVpbGRlciA9IG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXI7Ci0gICAgICAgICAgICBmaW5hbCBWQ2FyZEVudHJ5Q29uc3RydWN0b3IgdmNhcmREYXRhQnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBWQ2FyZEVudHJ5Q29uc3RydWN0b3IobVZDYXJkVHlwZSk7Ci0gICAgICAgICAgICB2Y2FyZERhdGFCdWlsZGVyLmFkZEVudHJ5SGFuZGxlcihtQ29udGVudFZhbHVlc1ZlcmlmaWVyKTsKLSAgICAgICAgICAgIGlmIChtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyLCB2Y2FyZERhdGFCdWlsZGVyKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSB2bm9kZUJ1aWxkZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVByb3BlcnR5Tm9kZXNWZXJpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFZDYXJkUGFyc2VyIHBhcnNlciA9Ci0gICAgICAgICAgICAgICAgKG1Jc1YzMCA/IG5ldyBWQ2FyZFBhcnNlcl9WMzAodHJ1ZSkgOiBuZXcgVkNhcmRQYXJzZXJfVjIxKCkpOwotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2hhcnNldCA9Ci0gICAgICAgICAgICAgICAgKFZDYXJkQ29uZmlnLnVzZXNTaGlmdEppcyhtVkNhcmRUeXBlKSA/ICJTSElGVF9KSVMiIDogIlVURi04Iik7Ci0gICAgICAgICAgICBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh2Y2FyZC5nZXRCeXRlcyhjaGFyc2V0KSk7Ci0gICAgICAgICAgICBtVGVzdENhc2UuYXNzZXJ0RXF1YWxzKHRydWUsIHBhcnNlci5wYXJzZShpcywgbnVsbCwgYnVpbGRlcikpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoVkNhcmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgVkNhcmRFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1WZXJpZmllZCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoInZlcmlmeSgpIHdhcyBjYWxsZWQgdHdpY2UuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHZlcmlmeUZvckltcG9ydFRlc3QoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiSU9FeGNlcHRpb24gd2FzIHRocm93bjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFZDYXJkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiVkNhcmRFeGNlcHRpb24gd2FzIHRocm93bjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtRXhwb3J0VGVzdFJlc29sdmVyICE9IG51bGwpewotICAgICAgICAgICAgdmVyaWZ5Rm9yRXhwb3J0VGVzdCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIk5vIGlucHV0IGlzIGRldGVybWluZWQiKTsKLSAgICAgICAgfQotICAgICAgICBtVmVyaWZpZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlGb3JJbXBvcnRUZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtTGluZVZlcmlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJOb3Qgc3VwcG9ydGVkIG5vdy4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUNvbnRlbnRWYWx1ZXNWZXJpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ29udGVudFZhbHVlc1ZlcmlmaWVyLnZlcmlmeShtSW5wdXRTdHJlYW0sIG1WQ2FyZFR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFbnRpdHlJdGVyYXRvciBtb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QoCi0gICAgICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIsCi0gICAgICAgICAgICBmaW5hbCBVcmkgdXJpLCBmaW5hbCBTdHJpbmcgc2VsZWN0aW9uLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgZmluYWwgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICBpZiAoRXhwb3J0VGVzdFJlc29sdmVyLmNsYXNzLmVxdWFscyhyZXNvbHZlci5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgcmV0dXJuICgoRXhwb3J0VGVzdFJlc29sdmVyKXJlc29sdmVyKS5nZXRQcm92aWRlcigpLnF1ZXJ5RW50aXRpZXMoCi0gICAgICAgICAgICAgICAgICAgIHVyaSwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBzb3J0T3JkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVuZXhwZWN0ZWQgcHJvdmlkZXIgZ2l2ZW4uIik7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgTWV0aG9kIGdldE1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCgpCi0gICAgICAgICAgICB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJtb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QiLAotICAgICAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlci5jbGFzcywgVXJpLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZ1tdLmNsYXNzLCBTdHJpbmcuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlGb3JFeHBvcnRUZXN0KCkgewotICAgICAgIGZpbmFsIFZDYXJkQ29tcG9zZXIgY29tcG9zZXIgPQotICAgICAgICAgICAgbmV3IFZDYXJkQ29tcG9zZXIobmV3IEN1c3RvbU1vY2tDb250ZXh0KG1FeHBvcnRUZXN0UmVzb2x2ZXIpLCBtVkNhcmRUeXBlKTsKLSAgICAgICAgY29tcG9zZXIuYWRkSGFuZGxlcihtTGluZVZlcmlmaWVyKTsKLSAgICAgICAgY29tcG9zZXIuYWRkSGFuZGxlcihtVkNhcmRWZXJpZmllckludGVybmFsKTsKLSAgICAgICAgaWYgKCFjb21wb3Nlci5pbml0KFZDYXJkQ29tcG9zZXIuQ09OVEFDVFNfVEVTVF9DT05URU5UX1VSSSwgbnVsbCwgbnVsbCwgbnVsbCkpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJpbml0KCkgZmFpbGVkLiBSZWFzb246ICIgKyBjb21wb3Nlci5nZXRFcnJvclJlYXNvbigpKTsKLSAgICAgICAgfQotICAgICAgICBBbmRyb2lkVGVzdENhc2UuYXNzZXJ0RmFsc2UoY29tcG9zZXIuaXNBZnRlckxhc3QoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAoIWNvbXBvc2VyLmlzQWZ0ZXJMYXN0KCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXRob2QgbW9ja0dldEVudGl0eUl0ZXJhdG9yTWV0aG9kID0gZ2V0TW9ja0dldEVudGl0eUl0ZXJhdG9yTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKG1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5hc3NlcnRUcnVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2VyLmNyZWF0ZU9uZUVudHJ5KG1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY29tcG9zZXIudGVybWluYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVk5vZGUuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWYxMGRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBQcmV2aW91c2x5IHVzZWQgaW4gbWFpbiB2Q2FyZCBoYW5kbGluZyBjb2RlIGJ1dCBub3cgZXhpc3RzIG9ubHkgZm9yIHRlc3RpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBWTm9kZSB7Ci0gICAgcHVibGljIFN0cmluZyBWTmFtZTsKLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPiBwcm9wTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPigpOwotCi0gICAgLyoqIDA6cGFyc2Ugb3Zlci4gMTpwYXJzaW5nLiAqLwotICAgIHB1YmxpYyBpbnQgcGFyc2VTdGF0dXMgPSAxOwotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZOb2RlQnVpbGRlci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZOb2RlQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTZjMzI1Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WTm9kZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEludGVycHJldGVyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudXRpbC5DaGFyc2V0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5EZWNvZGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5uZXQuUXVvdGVkUHJpbnRhYmxlQ29kZWM7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBTdG9yZSB0aGUgcGFyc2UgcmVzdWx0IHRvIGN1c3RvbSBkYXRhc3RydWN0OiBWTm9kZSwgUHJvcGVydHlOb2RlCi0gKiBNYXliZSBzZXZlcmFsIHZjYXJkIGluc3RhbmNlLCBzbyB1c2Ugdk5vZGVMaXN0IHRvIHN0b3JlLgotICogVk5vZGU6IHN0YW5keSBieSBhIHZjYXJkIGluc3RhbmNlLgotICogUHJvcGVydHlOb2RlOiBzdGFuZHkgYnkgYSBwcm9wZXJ0eSBsaW5lIG9mIGEgY2FyZC4KLSAqCi0gKiBQcmV2aW91c2x5IHVzZWQgaW4gbWFpbiB2Q2FyZCBoYW5kbGluZyBjb2RlIGJ1dCBub3cgZXhpc3RzIG9ubHkgZm9yIHRlc3RpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBWTm9kZUJ1aWxkZXIgaW1wbGVtZW50cyBWQ2FyZEludGVycHJldGVyIHsKLSAgICBzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgTE9HX1RBRyA9ICJWTm9kZUJ1aWxkZXIiOyAKLSAgICAKLSAgICAvKioKLSAgICAgKiBJZiB0aGVyZSdzIG5vIG90aGVyIGluZm9ybWF0aW9uIGF2YWlsYWJsZSwgdGhpcyBjbGFzcyB1c2VzIHRoaXMgY2hhcnNldCBmb3IgZW5jb2RpbmcKLSAgICAgKiBieXRlIGFycmF5cy4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyBUQVJHRVRfQ0hBUlNFVCA9ICJVVEYtOCI7IAotICAgIAotICAgIC8qKiB0eXBlPVZOb2RlICovCi0gICAgcHVibGljIExpc3Q8Vk5vZGU+IHZOb2RlTGlzdCA9IG5ldyBBcnJheUxpc3Q8Vk5vZGU+KCk7Ci0gICAgcHJpdmF0ZSBpbnQgbU5vZGVMaXN0UG9zID0gMDsKLSAgICBwcml2YXRlIFZOb2RlIG1DdXJyZW50Vk5vZGU7Ci0gICAgcHJpdmF0ZSBQcm9wZXJ0eU5vZGUgbUN1cnJlbnRQcm9wTm9kZTsKLSAgICBwcml2YXRlIFN0cmluZyBtQ3VycmVudFBhcmFtVHlwZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgY2hhcnNldCB1c2luZyB3aGljaCBWUGFyc2VyIHBhcnNlcyB0aGUgdGV4dC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtU291cmNlQ2hhcnNldDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgY2hhcnNldCB3aXRoIHdoaWNoIGJ5dGUgYXJyYXkgaXMgZW5jb2RlZCB0byBTdHJpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVRhcmdldENoYXJzZXQ7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIG1TdHJpY3RMaW5lQnJlYWtQYXJzaW5nOwotICAgIAotICAgIHB1YmxpYyBWTm9kZUJ1aWxkZXIoKSB7Ci0gICAgICAgIHRoaXMoVkNhcmRDb25maWcuREVGQVVMVF9DSEFSU0VULCBUQVJHRVRfQ0hBUlNFVCwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBWTm9kZUJ1aWxkZXIoU3RyaW5nIGNoYXJzZXQsIGJvb2xlYW4gc3RyaWN0TGluZUJyZWFrUGFyc2luZykgewotICAgICAgICB0aGlzKG51bGwsIGNoYXJzZXQsIHN0cmljdExpbmVCcmVha1BhcnNpbmcpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAaGlkZSBzb3VyY2VDaGFyc2V0IGlzIHRlbXBvcmFsLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgVk5vZGVCdWlsZGVyKFN0cmluZyBzb3VyY2VDaGFyc2V0LCBTdHJpbmcgdGFyZ2V0Q2hhcnNldCwKLSAgICAgICAgICAgIGJvb2xlYW4gc3RyaWN0TGluZUJyZWFrUGFyc2luZykgewotICAgICAgICBpZiAoc291cmNlQ2hhcnNldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU291cmNlQ2hhcnNldCA9IHNvdXJjZUNoYXJzZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU291cmNlQ2hhcnNldCA9IFZDYXJkQ29uZmlnLkRFRkFVTFRfQ0hBUlNFVDsKLSAgICAgICAgfQotICAgICAgICBpZiAodGFyZ2V0Q2hhcnNldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGFyZ2V0Q2hhcnNldCA9IHRhcmdldENoYXJzZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVGFyZ2V0Q2hhcnNldCA9IFRBUkdFVF9DSEFSU0VUOwotICAgICAgICB9Ci0gICAgICAgIG1TdHJpY3RMaW5lQnJlYWtQYXJzaW5nID0gc3RyaWN0TGluZUJyZWFrUGFyc2luZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmQoKSB7Ci0gICAgfQotCi0gICAgLy8gTm90ZTogSSBndWVzcyB0aGF0IHRoaXMgY29kZSBhc3N1bWVzIHRoZSBSZWNvcmQgbWF5IG5lc3QgbGlrZSB0aGlzOgotICAgIC8vIFNUQVJUOlZQT1MKLSAgICAvLyAuLi4KLSAgICAvLyBTVEFSVDpWUE9TMgotICAgIC8vIC4uLgotICAgIC8vIEVORDpWUE9TMgotICAgIC8vIC4uLgotICAgIC8vIEVORDpWUE9TCi0gICAgLy8KLSAgICAvLyBIb3dldmVyIHRoZSBmb2xsb3dpbmcgY29kZSBoYXMgYSBidWcuCi0gICAgLy8gV2hlbiBlcnJvciBvY2N1cnMgYWZ0ZXIgY2FsbGluZyBzdGFydFJlY29yZCgpLCB0aGUgZW50cnkgd2hpY2ggaXMgcHJvYmFibHkKLSAgICAvLyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIHJlbWFpbnMgdG8gYmUgaW4gdk5vZGVMaXN0LCB3aGlsZSBlbmRSZWNvcmQoKSBpcyBub3QgY2FsbGVkLgotICAgIC8vCi0gICAgLy8gSSBsZWF2ZSB0aGlzIGNvZGUgYXMgaXMgc2luY2UgSSdtIG5vdCBmYW1pbGlhciB3aXRoIHZjYWxlbmRhciBzcGVjaWZpY2F0aW9uLgotICAgIC8vIEJ1dCBJIGJlbGlldmUgd2Ugc2hvdWxkIHJlZmFjdG9yIHRoaXMgY29kZSBpbiB0aGUgZnV0dXJlLgotICAgIC8vIFVudGlsIHRoaXMsIHRoZSBsYXN0IGVudHJ5IGhhcyB0byBiZSByZW1vdmVkIHdoZW4gc29tZSBlcnJvciBvY2N1cnMuCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbnRyeSgpIHsKLSAgICAgICAgVk5vZGUgdm5vZGUgPSBuZXcgVk5vZGUoKTsKLSAgICAgICAgdm5vZGUucGFyc2VTdGF0dXMgPSAxOwotICAgICAgICB2bm9kZS5WTmFtZSA9ICJWQ0FSRCI7Ci0gICAgICAgIC8vIEkgZmVlbCB0aGlzIHNob3VsZCBiZSBkb25lIGluIGVuZFJlY29yZCgpLCBidXQgaXQgY2Fubm90IGJlIGRvbmUgYmVjYXVzZSBvZgotICAgICAgICAvLyB0aGUgcmVhc29uIGFib3ZlLgotICAgICAgICB2Tm9kZUxpc3QuYWRkKHZub2RlKTsKLSAgICAgICAgbU5vZGVMaXN0UG9zID0gdk5vZGVMaXN0LnNpemUoKSAtIDE7Ci0gICAgICAgIG1DdXJyZW50Vk5vZGUgPSB2Tm9kZUxpc3QuZ2V0KG1Ob2RlTGlzdFBvcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRW50cnkoKSB7Ci0gICAgICAgIFZOb2RlIGVuZE5vZGUgPSB2Tm9kZUxpc3QuZ2V0KG1Ob2RlTGlzdFBvcyk7Ci0gICAgICAgIGVuZE5vZGUucGFyc2VTdGF0dXMgPSAwOwotICAgICAgICB3aGlsZShtTm9kZUxpc3RQb3MgPiAwKXsKLSAgICAgICAgICAgIG1Ob2RlTGlzdFBvcy0tOwotICAgICAgICAgICAgaWYoKHZOb2RlTGlzdC5nZXQobU5vZGVMaXN0UG9zKSkucGFyc2VTdGF0dXMgPT0gMSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudFZOb2RlID0gdk5vZGVMaXN0LmdldChtTm9kZUxpc3RQb3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJvcGVydHkoKSB7Ci0gICAgICAgIG1DdXJyZW50UHJvcE5vZGUgPSBuZXcgUHJvcGVydHlOb2RlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kUHJvcGVydHkoKSB7Ci0gICAgICAgIG1DdXJyZW50Vk5vZGUucHJvcExpc3QuYWRkKG1DdXJyZW50UHJvcE5vZGUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wTmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLy8gVXNlZCBvbmx5IGluIFZDYXJkLgotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcEdyb3VwU2V0LmFkZChncm91cCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1UeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIG1DdXJyZW50UGFyYW1UeXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmIChtQ3VycmVudFBhcmFtVHlwZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRQYXJhbVR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiVFlQRSIpKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnBhcmFtTWFwX1RZUEUuYWRkKHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucGFyYW1NYXAucHV0KG1DdXJyZW50UGFyYW1UeXBlLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ3VycmVudFBhcmFtVHlwZSA9IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlU3RyaW5nKFN0cmluZyBvcmlnaW5hbFN0cmluZywgU3RyaW5nIHRhcmdldENoYXJzZXQpIHsKLSAgICAgICAgaWYgKG1Tb3VyY2VDaGFyc2V0LmVxdWFsc0lnbm9yZUNhc2UodGFyZ2V0Q2hhcnNldCkpIHsKLSAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFN0cmluZzsKLSAgICAgICAgfQotICAgICAgICBDaGFyc2V0IGNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUobVNvdXJjZUNoYXJzZXQpOwotICAgICAgICBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBjaGFyc2V0LmVuY29kZShvcmlnaW5hbFN0cmluZyk7Ci0gICAgICAgIC8vIGJ5dGVCdWZmZXIuYXJyYXkoKSAibWF5IiByZXR1cm4gYnl0ZSBhcnJheSB3aGljaCBpcyBsYXJnZXIgdGhhbgotICAgICAgICAvLyBieXRlQnVmZmVyLnJlbWFpbmluZygpLiBIZXJlLCB3ZSBrZWVwIG9uIHRoZSBzYWZlIHNpZGUuCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2J5dGVCdWZmZXIucmVtYWluaW5nKCldOwotICAgICAgICBieXRlQnVmZmVyLmdldChieXRlcyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgdGFyZ2V0Q2hhcnNldCk7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBlbmNvZGU6IGNoYXJzZXQ9IiArIHRhcmdldENoYXJzZXQpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgaGFuZGxlT25lVmFsdWUoU3RyaW5nIHZhbHVlLCBTdHJpbmcgdGFyZ2V0Q2hhcnNldCwgU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbmNvZGluZyA9IGVuY29kaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICBpZiAoZW5jb2RpbmcuZXF1YWxzKCJCQVNFNjQiKSB8fCBlbmNvZGluZy5lcXVhbHMoIkIiKSkgewotICAgICAgICAgICAgICAgIC8vIEFzc3VtZSBCQVNFNjQgaXMgdXNlZCBvbmx5IHdoZW4gdGhlIG51bWJlciBvZiB2YWx1ZXMgaXMgMS4KLSAgICAgICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZV9ieXRlcyA9Ci0gICAgICAgICAgICAgICAgICAgIEJhc2U2NC5kZWNvZGVCYXNlNjQodmFsdWUuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlbmNvZGluZy5lcXVhbHMoIlFVT1RFRC1QUklOVEFCTEUiKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBxdW90ZWRQcmludGFibGUgPSB2YWx1ZQotICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCI9ICIsICIgIikucmVwbGFjZUFsbCgiPVx0IiwgIlx0Iik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gbGluZXM7Ci0gICAgICAgICAgICAgICAgaWYgKG1TdHJpY3RMaW5lQnJlYWtQYXJzaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVzID0gcXVvdGVkUHJpbnRhYmxlLnNwbGl0KCJcclxuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IHF1b3RlZFByaW50YWJsZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gcXVvdGVkUHJpbnRhYmxlLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoID0gcXVvdGVkUHJpbnRhYmxlLmNoYXJBdChpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2ggPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbmFsTGluZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsTGluZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGZpbmFsTGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGluZXMgPSBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmVuZHNXaXRoKCI9IikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlczsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBieXRlcyA9IGJ1aWxkZXIudG9TdHJpbmcoKS5nZXRCeXRlcyhtU291cmNlQ2hhcnNldCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGVuY29kZTogY2hhcnNldD0iICsgbVNvdXJjZUNoYXJzZXQpOwotICAgICAgICAgICAgICAgICAgICBieXRlcyA9IGJ1aWxkZXIudG9TdHJpbmcoKS5nZXRCeXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBieXRlcyA9IFF1b3RlZFByaW50YWJsZUNvZGVjLmRlY29kZVF1b3RlZFByaW50YWJsZShieXRlcyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRGVjb2RlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gZGVjb2RlIHF1b3RlZC1wcmludGFibGU6ICIgKyBlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzLCB0YXJnZXRDaGFyc2V0KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBlbmNvZGU6IGNoYXJzZXQ9IiArIHRhcmdldENoYXJzZXQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVW5rbm93biBlbmNvZGluZy4gRmFsbCBiYWNrIHRvIGRlZmF1bHQuCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuY29kZVN0cmluZyh2YWx1ZSwgdGFyZ2V0Q2hhcnNldCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfYnl0ZXMgPSBudWxsOwotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfdmVjdG9yLmNsZWFyKCk7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZV92ZWN0b3IuYWRkKCIiKTsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcFZhbHVlID0gIiI7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAgPSBtQ3VycmVudFByb3BOb2RlLnBhcmFtTWFwOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHRhcmdldENoYXJzZXQgPSBDaGFyc2V0VXRpbHMubmFtZUZvckRlZmF1bHRWZW5kb3IocGFyYW1NYXAuZ2V0QXNTdHJpbmcoIkNIQVJTRVQiKSk7IAotICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBwYXJhbU1hcC5nZXRBc1N0cmluZygiRU5DT0RJTkciKTsgCi0gICAgICAgIAotICAgICAgICBpZiAodGFyZ2V0Q2hhcnNldCA9PSBudWxsIHx8IHRhcmdldENoYXJzZXQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGFyZ2V0Q2hhcnNldCA9IG1UYXJnZXRDaGFyc2V0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfdmVjdG9yLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlT25lVmFsdWUodmFsdWUsIHRhcmdldENoYXJzZXQsIGVuY29kaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZSA9IGxpc3RUb1N0cmluZyhtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZV92ZWN0b3IpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGxpc3RUb1N0cmluZyhMaXN0PFN0cmluZz4gbGlzdCl7Ci0gICAgICAgIGludCBzaXplID0gbGlzdC5zaXplKCk7Ci0gICAgICAgIGlmIChzaXplID4gMSkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciB0eXBlTGlzdEIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZSA6IGxpc3QpIHsKLSAgICAgICAgICAgICAgICB0eXBlTGlzdEIuYXBwZW5kKHR5cGUpLmFwcGVuZCgiOyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGxlbiA9IHR5cGVMaXN0Qi5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChsZW4gPiAwICYmIHR5cGVMaXN0Qi5jaGFyQXQobGVuIC0gMSkgPT0gJzsnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVMaXN0Qi5zdWJzdHJpbmcoMCwgbGVuIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHlwZUxpc3RCLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5nZXQoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXN1bHQoKXsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3NQcm92aWRlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzUHJvdmlkZXJUZXN0LmphdmEKaW5kZXggMzcwYWU3OC4uYjgyZTY5OCAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3NQcm92aWRlclRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5nc1Byb3ZpZGVyVGVzdC5qYXZhCkBAIC0xNDQsNCArMTQ0LDUxIEBACiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIFNldHRpbmdzLkJvb2ttYXJrcy5nZXRJbnRlbnRGb3JTaG9ydGN1dChyLCAnKicpKTsKICAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVByb3ZpZGVyTGlzdCgpIHsKKyAgICAgICAgQ29udGVudFJlc29sdmVyIHIgPSBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGdldCBvdXQgd2hhdCB3ZSBwdXQgaW4uCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELAorICAgICAgICAgICAgICAgICJ0ZXN0MSx0ZXN0Mix0ZXN0MyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpLAorICAgICAgICAgICAgICAgICJ0ZXN0MSx0ZXN0Mix0ZXN0MyIpOworCisgICAgICAgIC8vIFRlc3QgYWRkaW5nIGEgdmFsdWUKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsCisgICAgICAgICAgICAgICAgIiIpOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwgIit0ZXN0MSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QxIiwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCkpOworCisgICAgICAgIC8vIFRlc3QgYWRkaW5nIGEgc2Vjb25kIHZhbHVlCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELCAiK3Rlc3QyIik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDEsdGVzdDIiLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSk7CisKKyAgICAgICAgLy8gVGVzdCBhZGRpbmcgYSB0aGlyZCB2YWx1ZQorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwgIit0ZXN0MyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QxLHRlc3QyLHRlc3QzIiwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCkpOworCisgICAgICAgIC8vIFRlc3QgZGVsZXRpbmcgdGhlIGZpcnN0IHZhbHVlIGluIGEgMyBpdGVtIGxpc3QKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsICItdGVzdDEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0Mix0ZXN0MyIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpKTsKKworICAgICAgICAvLyBUZXN0IGRlbGV0aW5nIHRoZSBtaWRkbGUgdmFsdWUgaW4gYSAzIGl0ZW0gbGlzdAorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwKKyAgICAgICAgICAgICAgICAidGVzdDEsdGVzdDIsdGVzdDMiKTsKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsICItdGVzdDIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0MSx0ZXN0MyIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpKTsKKworICAgICAgICAvLyBUZXN0IGRlbGV0aW5nIHRoZSBsYXN0IHZhbHVlIGluIGEgMyBpdGVtIGxpc3QKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsCisgICAgICAgICAgICAgICAgInRlc3QxLHRlc3QyLHRlc3QzIik7CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELCAiLXRlc3QzIik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDEsdGVzdDIiLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSk7CisgICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0QmlkaVRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0QmlkaVRlc3QuamF2YQppbmRleCA4ZTdlNjNlLi5mYjBmMGMxIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dEJpZGlUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRCaWRpVGVzdC5qYXZhCkBAIC0yMiw3ICsyMiw3IEBACiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCiAvKioKLSAqIFRlc3RzIFN0YXRpY0xheW91dCBiaWRpIGltcGxlbWVudGF0aW9uLgorICogUXVpY2sgY2hlY2sgb2YgbmF0aXZlIGJpZGkgaW1wbGVtZW50YXRpb24uCiAgKi8KIHB1YmxpYyBjbGFzcyBTdGF0aWNMYXlvdXRCaWRpVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICAKQEAgLTQxLDczICs0MSw0NyBAQAogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxMdHIoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX0RMLCAiYSB0ZXN0IiwgIjAwMDAwMCIsIEwpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9ETCwgImEgdGVzdCIsICIwMDAwMDAiLCBMKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEx0clJ0bCgpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfREwsICJhYmMgIiArIEFMRUYgKyBCRVQgKyBHSU1FTCwgIjAwMDAxMTEiLCBMKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsICJhYmMgIiArIEFMRUYgKyBCRVQgKyBHSU1FTCwgIjAwMDAxMTEiLCBMKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFsbFJ0bCgpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfREwsIEFMRUYgKyBTUCArIEFMRUYgKyBCRVQgKyBHSU1FTCArIERBTEVULCAiMTExMTExIiwgUik7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0RMLCBBTEVGICsgU1AgKyBBTEVGICsgQkVUICsgR0lNRUwgKyBEQUxFVCwgIjExMTExMSIsIFIpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UnRsTHRyKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9ETCwgIEFMRUYgKyBCRVQgKyBHSU1FTCArICIgYWJjIiwgIjExMTEwMDAiLCBSKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTExMjIyIiwgUik7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSQWxsTHRyKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9SLCAiYSB0ZXN0IiwgIjAwMDAwMCIsIFIpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9SLCAiYSB0ZXN0IiwgIjIyMjIyMiIsIFIpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Ukx0clJ0bCgpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfUiwgImFiYyAiICsgQUxFRiArIEJFVCArIEdJTUVMLCAiMDAwMTExMSIsIFIpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9SLCAiYWJjICIgKyBBTEVGICsgQkVUICsgR0lNRUwsICIyMjIxMTExIiwgUik7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RMQWxsUnRsKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9MLCBBTEVGICsgU1AgKyBBTEVGICsgQkVUICsgR0lNRUwgKyBEQUxFVCwgIjExMTExMSIsIEwpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9MLCBBTEVGICsgU1AgKyBBTEVGICsgQkVUICsgR0lNRUwgKyBEQUxFVCwgIjExMTExMSIsIEwpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TFJ0bEx0cigpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfTCwgIEFMRUYgKyBCRVQgKyBHSU1FTCArICIgYWJjIiwgIjExMTAwMDAiLCBMKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGV4cGVjdEJpZGkoaW50IGRpciwgU3RyaW5nIHRleHQsIAotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkTGV2ZWxzLCBpbnQgZXhwZWN0ZWREaXIpIHsKLSAgICAgICAgY2hhcltdIGNocyA9IHRleHQudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgaW50IG4gPSBjaHMubGVuZ3RoOwotICAgICAgICBieXRlW10gY2hJbmZvID0gbmV3IGJ5dGVbbl07Ci0gICAgICAgIAotICAgICAgICBpbnQgcmVzdWx0RGlyID0gU3RhdGljTGF5b3V0LmJpZGkoZGlyLCBjaHMsIGNoSW5mbywgbiwgZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJpbmZvOiIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAiKS5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoY2hJbmZvW2ldKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cuaSgiQklESSIsIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjaGFyW10gcmVzdWx0TGV2ZWxDaGFycyA9IG5ldyBjaGFyW25dOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgcmVzdWx0TGV2ZWxDaGFyc1tpXSA9IChjaGFyKSgnMCcgKyBjaEluZm9baV0pOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyByZXN1bHRMZXZlbHMgPSBuZXcgU3RyaW5nKHJlc3VsdExldmVsQ2hhcnMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImRpcmVjdGlvbiIsIGV4cGVjdGVkRGlyLCByZXN1bHREaXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImxldmVscyIsIGV4cGVjdGVkTGV2ZWxzLCByZXN1bHRMZXZlbHMpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9ETCwgIEFMRUYgKyBCRVQgKyBHSU1FTCArICIgYWJjIiwgIjExMTEyMjIiLCBSKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5hdGl2ZUJpZGkoKSB7Ci0gICAgICAgIC8vIG5hdGl2ZSBiaWRpIHJldHVybnMgbGV2ZWxzLCBub3Qgc2ltcGx5IGRpcmVjdGlvbnMKLSAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTExMjIyIiwgUik7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0wsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTEwMDAwIiwgTCk7CiAgICAgfQogICAgIAogICAgIHByaXZhdGUgdm9pZCBleHBlY3ROYXRpdmVCaWRpKGludCBkaXIsIFN0cmluZyB0ZXh0LCAKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0RGlyZWN0aW9uc1Rlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0RGlyZWN0aW9uc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmRlODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXREaXJlY3Rpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXh0OworCitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dC5EaXJlY3Rpb25zOworaW1wb3J0IGFuZHJvaWQudGV4dC5TdGF0aWNMYXlvdXRUZXN0LkxheW91dEJ1aWxkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBTdGF0aWNMYXlvdXREaXJlY3Rpb25zVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEFMRUYgPSAnXHUwNWQwJzsKKworICAgIHByaXZhdGUgc3RhdGljIERpcmVjdGlvbnMgZGlycyhpbnQgLi4uIGRpcnMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3Rpb25zKGRpcnMpOworICAgIH0KKworICAgIC8vIGNvbnN0YW50cyBmcm9tIExheW91dCB0aGF0IGFyZSBwYWNrYWdlLXByb3RlY3RlZAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fTEVOR1RIX01BU0sgPSAweDAzZmZmZmZmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fTEVWRUxfU0hJRlQgPSAyNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX0xFVkVMX01BU0sgPSAweDNmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fUlRMX0ZMQUcgPSAxIDw8IFJVTl9MRVZFTF9TSElGVDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERpcmVjdGlvbnMgRElSU19BTExfTEVGVF9UT19SSUdIVCA9CisgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBpbnRbXSB7IDAsIFJVTl9MRU5HVEhfTUFTSyB9KTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEaXJlY3Rpb25zIERJUlNfQUxMX1JJR0hUX1RPX0xFRlQgPQorICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgaW50W10geyAwLCBSVU5fTEVOR1RIX01BU0sgfCBSVU5fUlRMX0ZMQUcgfSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTFZMMV8xID0gMSB8ICgxIDw8IFJVTl9MRVZFTF9TSElGVCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExWTDJfMSA9IDEgfCAoMiA8PCBSVU5fTEVWRUxfU0hJRlQpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMVkwyXzIgPSAyIHwgKDIgPDwgUlVOX0xFVkVMX1NISUZUKTsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRleHRzID0geworICAgICAgICAiIiwKKyAgICAgICAgIiAiLAorICAgICAgICAiYSIsCisgICAgICAgICJhMSIsCisgICAgICAgICJhQSIsCisgICAgICAgICJhMWIiLAorICAgICAgICAiYTFBIiwKKyAgICAgICAgImFBMSIsCisgICAgICAgICJhQWIiLAorICAgICAgICAiYUExQiIsCisgICAgICAgICJhQTFCMiIsCisKKyAgICAgICAgLy8gcnRsCisgICAgICAgICJBIiwKKyAgICAgICAgIkExIiwKKyAgICAgICAgIkFhIiwKKyAgICAgICAgIkExQiIsCisgICAgICAgICJBMWEiLAorICAgICAgICAiQWExIiwKKyAgICAgICAgIkFhQiIKKyAgICB9OworCisgICAgLy8gRXhwZWN0ZWQgZGlyZWN0aW9ucyBhcmUgYW4gYXJyYXkgb2Ygc3RhcnQvbGVuZ3RoK2xldmVsIHBhaXJzLAorICAgIC8vIGluIHZpc3VhbCBvcmRlciBmcm9tIHRoZSBsZWFkaW5nIG1hcmdpbi4KKyAgICBwcml2YXRlIHN0YXRpYyBEaXJlY3Rpb25zW10gZXhwZWN0ZWQgPSB7CisgICAgICAgIERJUlNfQUxMX0xFRlRfVE9fUklHSFQsCisgICAgICAgIERJUlNfQUxMX0xFRlRfVE9fUklHSFQsCisgICAgICAgIERJUlNfQUxMX0xFRlRfVE9fUklHSFQsCisgICAgICAgIERJUlNfQUxMX0xFRlRfVE9fUklHSFQsCisgICAgICAgIGRpcnMoMCwgMSwgMSwgTFZMMV8xKSwKKyAgICAgICAgRElSU19BTExfTEVGVF9UT19SSUdIVCwKKyAgICAgICAgZGlycygwLCAyLCAyLCBMVkwxXzEpLAorICAgICAgICBkaXJzKDAsIDEsIDIsIExWTDJfMSwgMSwgTFZMMV8xKSwKKyAgICAgICAgZGlycygwLCAxLCAxLCBMVkwxXzEsIDIsIDEpLAorICAgICAgICBkaXJzKDAsIDEsIDMsIExWTDFfMSwgMiwgTFZMMl8xLCAxLCBMVkwxXzEpLAorICAgICAgICBkaXJzKDAsIDEsIDQsIExWTDJfMSwgMywgTFZMMV8xLCAyLCBMVkwyXzEsIDEsIExWTDFfMSksCisKKyAgICAgICAgLy8gcnRsCisgICAgICAgIERJUlNfQUxMX1JJR0hUX1RPX0xFRlQsCisgICAgICAgIGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzEpLAorICAgICAgICBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8xKSwKKyAgICAgICAgZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMSwgMiwgTFZMMV8xKSwKKyAgICAgICAgZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMiksCisgICAgICAgIGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzIpLAorICAgICAgICBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8xLCAyLCBMVkwxXzEpLAorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHNldWRvQmlkaVRvUmVhbChTdHJpbmcgc3JjKSB7CisgICAgICAgIGNoYXJbXSBjaGFycyA9IHNyYy50b0NoYXJBcnJheSgpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoYXJzLmxlbmd0aDsgKytqKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBjaGFyc1tqXTsKKyAgICAgICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdEJykgeworICAgICAgICAgICAgICAgIGNoYXJzW2pdID0gKGNoYXIpKEFMRUYgKyBjIC0gJ0EnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNoYXJzLCAwLCBjaGFycy5sZW5ndGgpOworICAgIH0KKworICAgIC8vIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0aW9ucygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigiXG4iKTsKKyAgICAgICAgRm9ybWF0dGVyIGYgPSBuZXcgRm9ybWF0dGVyKGJ1Zik7CisKKyAgICAgICAgTGF5b3V0QnVpbGRlciBiID0gU3RhdGljTGF5b3V0VGVzdC5idWlsZGVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGV4dHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGIuc2V0VGV4dChwc2V1ZG9CaWRpVG9SZWFsKHRleHRzW2ldKSk7CisgICAgICAgICAgICBjaGVja0RpcmVjdGlvbnMoYi5idWlsZCgpLCBpLCBiLnRleHQsIGV4cGVjdGVkLCBmKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmLmxlbmd0aCgpID4gMSkgeworICAgICAgICAgICAgZmFpbChidWYudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYWlsaW5nV2hpdGVzcGFjZSgpIHsKKyAgICAgICAgTGF5b3V0QnVpbGRlciBiID0gU3RhdGljTGF5b3V0VGVzdC5idWlsZGVyKCk7CisgICAgICAgIGIuc2V0VGV4dChwc2V1ZG9CaWRpVG9SZWFsKCJBYiAgIGMiKSk7CisgICAgICAgIGZsb2F0IHdpZHRoID0gYi5wYWludC5tZWFzdXJlVGV4dChiLnRleHQsIDAsIDUpOyAgLy8gZXhjbHVkZSAnYycKKyAgICAgICAgYi5zZXRXaWR0aChNYXRoLnJvdW5kKHdpZHRoKSk7CisgICAgICAgIExheW91dCBsID0gYi5idWlsZCgpOworICAgICAgICBpZiAobC5nZXRMaW5lQ291bnQoKSAhPSAyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZXhwZWN0ZWQgMiBsaW5lcywgZ290OiAiICsgbC5nZXRMaW5lQ291bnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgRGlyZWN0aW9ucyByZXN1bHQgPSBsLmdldExpbmVEaXJlY3Rpb25zKDApOworICAgICAgICBEaXJlY3Rpb25zIGV4cGVjdGVkID0gZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMSwgMiwgMyB8ICgxIDw8IExheW91dC5SVU5fTEVWRUxfU0hJRlQpKTsKKyAgICAgICAgZXhwZWN0RGlyZWN0aW9ucygic3BsaXQgbGluZSIsIGV4cGVjdGVkLCByZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXh0VG9SaWdodE9mKCkgeworICAgICAgICBMYXlvdXRCdWlsZGVyIGIgPSBTdGF0aWNMYXlvdXRUZXN0LmJ1aWxkZXIoKTsKKyAgICAgICAgYi5zZXRUZXh0KHBzZXVkb0JpZGlUb1JlYWwoImFBMUIyIikpOworICAgICAgICAvLyB2aXN1YWwgYTJCMUEgcG9zaXRpb25zIDA0MzIxCisgICAgICAgIC8vIDA6IHxhMkIxQSwgc3Ryb25nIGlzIHNvbCwgYWZ0ZXIgLT4gMAorICAgICAgICAvLyAxOiBhfDJCMUEsIHN0cm9uZyBpcyBhLCBhZnRlciAtPiwgMQorICAgICAgICAvLyAyOiBhMnxCMUEsIHN0cm9uZyBpcyBCLCBhZnRlciAtPiA0CisgICAgICAgIC8vIDM6IGEyQnwxQSwgc3Ryb25nIGlzIEIsIGJlZm9yZSAtPiAzCisgICAgICAgIC8vIDQ6IGEyQjF8QSwgc3Ryb25nIGlzIEEsIGFmdGVyIC0+IDIKKyAgICAgICAgLy8gNTogYTJCMUF8LCBzdHJvbmcgaXMgZW9sLCBiZWZvcmUgLT4gNQorICAgICAgICBpbnRbXSBleHBlY3RlZCA9IHsgMCwgMSwgNCwgMywgMiwgNSB9OworICAgICAgICBMYXlvdXQgbCA9IGIuYnVpbGQoKTsKKyAgICAgICAgaW50IG4gPSAwOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpbnQgdCA9IGwuZ2V0T2Zmc2V0VG9SaWdodE9mKG4pOworICAgICAgICAgICAgaWYgKHQgIT0gZXhwZWN0ZWRbaV0pIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJvZmZzZXRbIiArIGkgKyAiXSB0byByaWdodCBvZjogIiArIG4gKyAiIGV4cGVjdGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkW2ldICsgIiBnb3Q6ICIgKyB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG4gPSB0OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5leHRUb0xlZnRPZigpIHsKKyAgICAgICAgTGF5b3V0QnVpbGRlciBiID0gU3RhdGljTGF5b3V0VGVzdC5idWlsZGVyKCk7CisgICAgICAgIGIuc2V0VGV4dChwc2V1ZG9CaWRpVG9SZWFsKCJhQTFCMiIpKTsKKyAgICAgICAgaW50W10gZXhwZWN0ZWQgPSB7IDAsIDEsIDQsIDMsIDIsIDUgfTsKKyAgICAgICAgTGF5b3V0IGwgPSBiLmJ1aWxkKCk7CisgICAgICAgIGludCBuID0gNTsKKyAgICAgICAgZm9yIChpbnQgaSA9IGV4cGVjdGVkLmxlbmd0aCAtIDE7IC0taSA+PSAwOykgeworICAgICAgICAgICAgaW50IHQgPSBsLmdldE9mZnNldFRvTGVmdE9mKG4pOworICAgICAgICAgICAgaWYgKHQgIT0gZXhwZWN0ZWRbaV0pIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJvZmZzZXRbIiArIGkgKyAiXSB0byBsZWZ0IG9mOiAiICsgbiArICIgZXhwZWN0ZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRbaV0gKyAiIGdvdDogIiArIHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbiA9IHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1dGlsaXR5LCBub3QgcmVhbGx5IGEgdGVzdAorICAgIC8qCisgICAgcHVibGljIHZvaWQgdGVzdE1lYXN1cmVUZXh0MSgpIHsKKyAgICAgICAgTGF5b3V0QnVpbGRlciBiID0gU3RhdGljTGF5b3V0VGVzdC5idWlsZGVyKCk7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gIkFCQyI7IC8vICJhYkFCIgorICAgICAgICBiLnNldFRleHQocHNldWRvQmlkaVRvUmVhbCh0ZXh0KSk7CisgICAgICAgIExheW91dCBsID0gYi5idWlsZCgpOworICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBsLmdldExpbmVEaXJlY3Rpb25zKDApOworCisgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7CisKKyAgICAgICAgaW50IGRpciA9IC0xOyAvLyBMRUZUX1RPX1JJR0hUCisgICAgICAgIGJvb2xlYW4gdHJhaWxpbmcgPSB0cnVlOworICAgICAgICBib29sZWFuIGFsdCA9IHRydWU7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGRpciA9IC1kaXI7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgdHJhaWxpbmcgPSAhdHJhaWxpbmc7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgb2Zmc2V0ID0gMCwgZW5kID0gYi50ZXh0Lmxlbmd0aCgpOyBvZmZzZXQgPD0gZW5kOyArK29mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWR0aCA9IExheW91dC5tZWFzdXJlVGV4dChiLnBhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtQYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgb2Zmc2V0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyLCBkaXJlY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoIkJJREkiLCAiZGlyOiAiICsgZGlyICsgIiB0cmFpbDogIiArIHRyYWlsaW5nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9mZnNldDogIiArIG9mZnNldCArICIgd2lkdGg6ICIgKyB3aWR0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoIXRyYWlsaW5nKTsKKyAgICAgICAgfSB3aGlsZSAoZGlyID4gMCk7CisgICAgfQorICAgICovCisKKyAgICAvLyB1dGlsaXR5IGZvciBkaXNwbGF5aW5nIGFycmF5cyBpbiBoZXgKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgaGV4QXJyYXkoaW50W10gYXJyYXkpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHNiLmFwcGVuZCgneycpOworICAgICAgICBmb3IgKGludCBpIDogYXJyYXkpIHsKKyAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhpKSk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCd9Jyk7CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0RpcmVjdGlvbnMoTGF5b3V0IGwsIGludCBpLCBTdHJpbmcgdGV4dCwKKyAgICAgICAgICAgIERpcmVjdGlvbnNbXSBleHBlY3RlZERpcnMsIEZvcm1hdHRlciBmKSB7CisgICAgICAgIERpcmVjdGlvbnMgZXhwZWN0ZWQgPSBleHBlY3RlZERpcnNbaV07CisgICAgICAgIERpcmVjdGlvbnMgcmVzdWx0ID0gbC5nZXRMaW5lRGlyZWN0aW9ucygwKTsKKyAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKGV4cGVjdGVkLm1EaXJlY3Rpb25zLCByZXN1bHQubURpcmVjdGlvbnMpKSB7CisgICAgICAgICAgICBmLmZvcm1hdCgiJW5bJTJkXSAnJXMnLCAlcyAhPSAlcyIsIGksIHRleHQsCisgICAgICAgICAgICAgICAgICAgIGhleEFycmF5KGV4cGVjdGVkLm1EaXJlY3Rpb25zKSwKKyAgICAgICAgICAgICAgICAgICAgaGV4QXJyYXkocmVzdWx0Lm1EaXJlY3Rpb25zKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhwZWN0RGlyZWN0aW9ucyhTdHJpbmcgbXNnLCBEaXJlY3Rpb25zIGV4cGVjdGVkLCBEaXJlY3Rpb25zIHJlc3VsdCkgeworICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMoZXhwZWN0ZWQubURpcmVjdGlvbnMsIHJlc3VsdC5tRGlyZWN0aW9ucykpIHsKKyAgICAgICAgICAgIGZhaWwoImV4cGVjdGVkOiAiICsgaGV4QXJyYXkoZXhwZWN0ZWQubURpcmVjdGlvbnMpICsKKyAgICAgICAgICAgICAgICAgICAgIiBnb3Q6ICIgKyBoZXhBcnJheShyZXN1bHQubURpcmVjdGlvbnMpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0VGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRUZXN0LmphdmEKaW5kZXggMWY1OGEyYy4uZDU1NGE1MCAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRUZXN0LmphdmEKQEAgLTIyOCwxMSArMjI4LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBMYXlvdXRCdWlsZGVyIGJ1aWxkZXIoKSB7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgTGF5b3V0QnVpbGRlciBidWlsZGVyKCkgewogICAgICAgICByZXR1cm4gbmV3IExheW91dEJ1aWxkZXIoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMYXlvdXRCdWlsZGVyIHsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBMYXlvdXRCdWlsZGVyIHsKICAgICAgICAgU3RyaW5nIHRleHQgPSAiVGhpcyBpcyBhIHRlc3QiOwogICAgICAgICBUZXh0UGFpbnQgcGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7IC8vIGRlZmF1bHQKICAgICAgICAgaW50IHdpZHRoID0gMTAwOwpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9FeHBhbmRhYmxlTGlzdFNjZW5hcmlvLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0V4cGFuZGFibGVMaXN0U2NlbmFyaW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGExMmIwZC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0V4cGFuZGFibGVMaXN0U2NlbmFyaW8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci0KLS8qKgotICogVXRpbGl0eSBiYXNlIGNsYXNzIGZvciBjcmVhdGluZyB2YXJpb3VzIEV4cGFuZGFibGUgTGlzdCBzY2VuYXJpb3MuCi0gKiA8cD4KLSAqIFdBUk5JTkc6IEEgbG90IG9mIHRoZSBmZWF0dXJlcyBhcmUgbWl4ZWQgYmV0d2VlbiBMaXN0VmlldydzIGV4cGVjdGVkIHBvc2l0aW9uCi0gKiAoZmxhdCBsaXN0IHBvc2l0aW9uKSBhbmQgYW4gRXhwYW5kYWJsZUxpc3RWaWV3J3MgZXhwZWN0ZWQgcG9zaXRpb24uICBZb3UgbXVzdCBhZGQvY2hhbmdlCi0gKiBmZWF0dXJlcyBhcyB5b3UgbmVlZCB0aGVtLgotICogCi0gKiBAc2VlIExpc3RTY2VuYXJpbwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbyBleHRlbmRzIExpc3RTY2VuYXJpbyB7Ci0gICAgcHJvdGVjdGVkIEV4cGFuZGFibGVMaXN0QWRhcHRlciBtQWRhcHRlcjsgCi0gICAgcHJvdGVjdGVkIExpc3Q8TXlHcm91cD4gbUdyb3VwczsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgTGlzdFZpZXcgY3JlYXRlTGlzdFZpZXcoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRXhwYW5kYWJsZUxpc3RWaWV3KHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBQYXJhbXMgY3JlYXRlUGFyYW1zKCkgewotICAgICAgICByZXR1cm4gbmV3IEV4cGFuZGFibGVQYXJhbXMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRBZGFwdGVyKExpc3RWaWV3IGxpc3RWaWV3KSB7Ci0gICAgICAgICgoRXhwYW5kYWJsZUxpc3RWaWV3KSBsaXN0Vmlldykuc2V0QWRhcHRlcihtQWRhcHRlciA9IGNyZWF0ZUFkYXB0ZXIoKSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgY3JlYXRlQWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNeUFkYXB0ZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVhZEFuZFZhbGlkYXRlUGFyYW1zKFBhcmFtcyBwYXJhbXMpIHsKLSAgICAgICAgRXhwYW5kYWJsZVBhcmFtcyBleHBhbmRhYmxlUGFyYW1zID0gKEV4cGFuZGFibGVQYXJhbXMpIHBhcmFtczsKLSAgICAgICAgCi0gICAgICAgIGludFtdIG51bUNoaWxkcmVuID0gZXhwYW5kYWJsZVBhcmFtcy5tTnVtQ2hpbGRyZW47Ci0gICAgICAgIAotICAgICAgICBtR3JvdXBzID0gbmV3IEFycmF5TGlzdDxNeUdyb3VwPihudW1DaGlsZHJlbi5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBtR3JvdXBzLmFkZChuZXcgTXlHcm91cChudW1DaGlsZHJlbltpXSkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBleHBhbmRhYmxlUGFyYW1zLnN1cGVyU2V0TnVtSXRlbXMoKTsKLSAgICAgICAgCi0gICAgICAgIHN1cGVyLnJlYWRBbmRWYWxpZGF0ZVBhcmFtcyhwYXJhbXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgRXhwYW5kYWJsZUxpc3RWaWV3IHdpZGdldC4KLSAgICAgKiBAcmV0dXJuIFRoZSBtYWluIHdpZGdldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RWaWV3IGdldEV4cGFuZGFibGVMaXN0VmlldygpIHsKLSAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlTGlzdFZpZXcpIHN1cGVyLmdldExpc3RWaWV3KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHBhbmRhYmxlUGFyYW1zIGV4dGVuZHMgUGFyYW1zIHsKLSAgICAgICAgcHJpdmF0ZSBpbnRbXSBtTnVtQ2hpbGRyZW47Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHBlciBncm91cC4KLSAgICAgICAgICogIAotICAgICAgICAgKiBAcGFyYW0gbnVtQ2hpbGRyZW5QZXJHcm91cCBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIHBlciBncm91cC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldE51bUNoaWxkcmVuKGludFtdIG51bUNoaWxkcmVuKSB7Ci0gICAgICAgICAgICBtTnVtQ2hpbGRyZW4gPSBudW1DaGlsZHJlbjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIG51bWJlciBvZiBpdGVtcyBvbiB0aGUgc3VwZXJjbGFzcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mCi0gICAgICAgICAqIGdyb3VwcyBhbmQgY2hpbGRyZW4gcGVyIGdyb3VwLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBFeHBhbmRhYmxlUGFyYW1zIHN1cGVyU2V0TnVtSXRlbXMoKSB7Ci0gICAgICAgICAgICBpbnQgbnVtSXRlbXMgPSAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobU51bUNoaWxkcmVuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gbU51bUNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIG51bUl0ZW1zICs9IG1OdW1DaGlsZHJlbltpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN1cGVyLnNldE51bUl0ZW1zKG51bUl0ZW1zKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgUGFyYW1zIHNldE51bUl0ZW1zKGludCBudW1JdGVtcykgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVXNlIHNldE51bUdyb3VwcyBhbmQgc2V0TnVtQ2hpbGRyZW4gaW5zdGVhZC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRGYWRpbmdFZGdlU2NyZWVuU2l6ZUZhY3Rvcihkb3VibGUgZmFkaW5nRWRnZVNjcmVlblNpemVGYWN0b3IpIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0RmFkaW5nRWRnZVNjcmVlblNpemVGYWN0b3IoZmFkaW5nRWRnZVNjcmVlblNpemVGYWN0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldEl0ZW1TY3JlZW5TaXplRmFjdG9yKGRvdWJsZSBpdGVtU2NyZWVuU2l6ZUZhY3RvcikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRJdGVtU2NyZWVuU2l6ZUZhY3RvcihpdGVtU2NyZWVuU2l6ZUZhY3Rvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0SXRlbXNGb2N1c2FibGUoYm9vbGVhbiBpdGVtc0ZvY3VzYWJsZSkgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRJdGVtc0ZvY3VzYWJsZShpdGVtc0ZvY3VzYWJsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0TXVzdEZpbGxTY3JlZW4oYm9vbGVhbiBmaWxsU2NyZWVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldE11c3RGaWxsU2NyZWVuKGZpbGxTY3JlZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldFBvc2l0aW9uU2NyZWVuU2l6ZUZhY3Rvck92ZXJyaWRlKGludCBwb3NpdGlvbiwgZG91YmxlIGl0ZW1TY3JlZW5TaXplRmFjdG9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldFBvc2l0aW9uU2NyZWVuU2l6ZUZhY3Rvck92ZXJyaWRlKHBvc2l0aW9uLCBpdGVtU2NyZWVuU2l6ZUZhY3Rvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0UG9zaXRpb25VbnNlbGVjdGFibGUoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldFBvc2l0aW9uVW5zZWxlY3RhYmxlKHBvc2l0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRTdGFja0Zyb21Cb3R0b20oYm9vbGVhbiBzdGFja0Zyb21Cb3R0b20pIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0U3RhY2tGcm9tQm90dG9tKHN0YWNrRnJvbUJvdHRvbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0U3RhcnRpbmdTZWxlY3Rpb25Qb3NpdGlvbihpbnQgc3RhcnRpbmdTZWxlY3Rpb25Qb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRTdGFydGluZ1NlbGVjdGlvblBvc2l0aW9uKHN0YXJ0aW5nU2VsZWN0aW9uUG9zaXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldENvbm5lY3RBZGFwdGVyKGJvb2xlYW4gY29ubmVjdEFkYXB0ZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0Q29ubmVjdEFkYXB0ZXIoY29ubmVjdEFkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHN0cmluZyBmb3IgdGhlIHZhbHVlIG9mIHNvbWUgaXRlbS4KLSAgICAgKiBAcGFyYW0gcGFja2VkUG9zaXRpb24gVGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtLgotICAgICAqIEByZXR1cm4gVGhlIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFZhbHVlQXRQb3NpdGlvbihsb25nIHBhY2tlZFBvc2l0aW9uKSB7Ci0gICAgICAgIGZpbmFsIGludCB0eXBlID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uVHlwZShwYWNrZWRQb3NpdGlvbik7Ci0gICAgICAgIAotICAgICAgICBpZiAodHlwZSA9PSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfQ0hJTEQpIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBzLmdldChFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Hcm91cChwYWNrZWRQb3NpdGlvbikpCi0gICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbi5nZXQoRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uQ2hpbGQocGFja2VkUG9zaXRpb24pKQotICAgICAgICAgICAgICAgICAgICAubmFtZTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9HUk9VUCkgewotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cHMuZ2V0KEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkdyb3VwKHBhY2tlZFBvc2l0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgLm5hbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwYWNrZWRQb3NpdGlvbiBpcyBub3QgYSB2YWxpZCBwb3NpdGlvbi4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgYSBwYXJ0aWN1bGFyIHBvc2l0aW9uIGlzIG91dCBvZiBib3VuZHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhY2tlZFBvc2l0aW9uIFRoZSBwYWNrZWQgcG9zaXRpb24uCi0gICAgICogQHJldHVybiBXaGV0aGVyIGl0J3Mgb3V0IG9mIGJvdW5kcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNPdXRPZkJvdW5kcyhsb25nIHBhY2tlZFBvc2l0aW9uKSB7Ci0gICAgICAgIGZpbmFsIGludCB0eXBlID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uVHlwZShwYWNrZWRQb3NpdGlvbik7Ci0gICAgICAgIAotICAgICAgICBpZiAodHlwZSA9PSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfTlVMTCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicGFja2VkUG9zaXRpb24gaXMgbm90IGEgdmFsaWQgcG9zaXRpb24uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBpbnQgZ3JvdXAgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Hcm91cChwYWNrZWRQb3NpdGlvbik7IAotICAgICAgICBpZiAoZ3JvdXAgPj0gbUdyb3Vwcy5zaXplKCkgfHwgZ3JvdXAgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHR5cGUgPT0gRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9UWVBFX0NISUxEKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGQgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25DaGlsZChwYWNrZWRQb3NpdGlvbik7IAotICAgICAgICAgICAgaWYgKGNoaWxkID49IG1Hcm91cHMuZ2V0KGdyb3VwKS5jaGlsZHJlbi5zaXplKCkgfHwgY2hpbGQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHZpZXcgZm9yIHRoZSBwYWNrZWQgcG9zaXRpb24sIHBvc3NpYmx5IHJldXNpbmcgdGhlIGNvbnZlcnRWaWV3LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYWNrZWRQb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gZ2V0IGEgdmlldyBmb3IuCi0gICAgICogQHBhcmFtIGNvbnZlcnRWaWV3IE9wdGlvbmFsIHZpZXcgdG8gY29udmVydC4KLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBmdXR1cmUgcGFyZW50LgotICAgICAqIEByZXR1cm4gQSB2aWV3LgotICAgICAqLwotICAgIHByaXZhdGUgVmlldyBnZXRWaWV3KGxvbmcgcGFja2VkUG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgaWYgKGlzT3V0T2ZCb3VuZHMocGFja2VkUG9zaXRpb24pKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwb3NpdGlvbiBvdXQgb2YgcmFuZ2UgZm9yIGFkYXB0ZXIhIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIEV4cGFuZGFibGVMaXN0VmlldyBlbHYgPSBnZXRFeHBhbmRhYmxlTGlzdFZpZXcoKTsKLSAgICAgICAgZmluYWwgaW50IGZsUG9zID0gZWx2LmdldEZsYXRMaXN0UG9zaXRpb24ocGFja2VkUG9zaXRpb24pOyAKLSAgICAgICAgCi0gICAgICAgIGlmIChjb252ZXJ0VmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAoKFRleHRWaWV3KSBjb252ZXJ0Vmlldykuc2V0VGV4dChnZXRWYWx1ZUF0UG9zaXRpb24ocGFja2VkUG9zaXRpb24pKTsKLSAgICAgICAgICAgIGNvbnZlcnRWaWV3LnNldElkKGZsUG9zKTsKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VmlldzsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBkZXNpcmVkSGVpZ2h0ID0gZ2V0SGVpZ2h0Rm9yUG9zaXRpb24oZmxQb3MpOwotICAgICAgICByZXR1cm4gY3JlYXRlVmlldyhwYWNrZWRQb3NpdGlvbiwgZmxQb3MsIHBhcmVudCwgZGVzaXJlZEhlaWdodCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHZpZXcgZm9yIGEgZ3JvdXAgb3IgY2hpbGQgcG9zaXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhY2tlZFBvc2l0aW9uIFRoZSBwYWNrZWQgcG9zaXRpb24gKGhhcyB0eXBlLCBncm91cCBwb3MsIGFuZCBvcHRpb25hbGx5IGNoaWxkIHBvcykuCi0gICAgICogQHBhcmFtIGZsUG9zIFRoZSBmbGF0IGxpc3QgcG9zaXRpb24gKHRoZSBwb3NpdGlvbiB0aGF0IHRoZSBMaXN0VmlldyBnb2VzIGJ5KS4KLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgdmlldy4KLSAgICAgKiBAcGFyYW0gZGVzaXJlZEhlaWdodCBUaGUgZGVzaXJlZCBoZWlnaHQuCi0gICAgICogQHJldHVybiBBIHZpZXcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFZpZXcgY3JlYXRlVmlldyhsb25nIHBhY2tlZFBvc2l0aW9uLCBpbnQgZmxQb3MsIFZpZXdHcm91cCBwYXJlbnQsIGludCBkZXNpcmVkSGVpZ2h0KSB7Ci0gICAgICAgIFRleHRWaWV3IHJlc3VsdCA9IG5ldyBUZXh0VmlldyhwYXJlbnQuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgcmVzdWx0LnNldEhlaWdodChkZXNpcmVkSGVpZ2h0KTsKLSAgICAgICAgcmVzdWx0LnNldFRleHQoZ2V0VmFsdWVBdFBvc2l0aW9uKHBhY2tlZFBvc2l0aW9uKSk7Ci0gICAgICAgIGZpbmFsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgQWJzTGlzdFZpZXcuTGF5b3V0UGFyYW1zKAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKLSAgICAgICAgcmVzdWx0LnNldExheW91dFBhcmFtcyhscCk7Ci0gICAgICAgIHJlc3VsdC5zZXRHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMKTsKLSAgICAgICAgcmVzdWx0LnNldFBhZGRpbmcoMzYsIDAsIDAsIDApOwotICAgICAgICByZXN1bHQuc2V0SWQoZmxQb3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZ3JvdXAgaW5kZXggY29udGFpbmluZyBlaXRoZXIgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvciBhdAotICAgICAqIGxlYXN0IG9uZSBjaGlsZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbnVtQ2hpbGRyZW4gVGhlIGdyb3VwIG11c3QgaGF2ZSB0aGlzIGFtb3VudCwgb3IgLTEgaWYgdXNpbmcKLSAgICAgKiAgICAgICAgICAgIGF0TGVhc3RPbmVDaGlsZC4KLSAgICAgKiBAcGFyYW0gYXRMZWFzdE9uZUNoaWxkIFRoZSBncm91cCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGNoaWxkLCBvciBmYWxzZQotICAgICAqICAgICAgICAgICAgaWYgdXNpbmcgbnVtQ2hpbGRyZW4uCi0gICAgICogQHJldHVybiBBIGdyb3VwIGluZGV4IHdpdGggdGhlIHJlcXVpcmVtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGZpbmRHcm91cFdpdGhOdW1DaGlsZHJlbihpbnQgbnVtQ2hpbGRyZW4sIGJvb2xlYW4gYXRMZWFzdE9uZUNoaWxkKSB7Ci0gICAgICAgIGZpbmFsIEV4cGFuZGFibGVMaXN0QWRhcHRlciBhZGFwdGVyID0gbUFkYXB0ZXI7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gYWRhcHRlci5nZXRHcm91cENvdW50KCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgZmluYWwgaW50IGN1ck51bUNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbkNvdW50KGkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobnVtQ2hpbGRyZW4gPT0gY3VyTnVtQ2hpbGRyZW4gfHwgYXRMZWFzdE9uZUNoaWxkICYmIGN1ck51bUNoaWxkcmVuID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaXN0PE15R3JvdXA+IGdldEdyb3VwcygpIHsKLSAgICAgICAgcmV0dXJuIG1Hcm91cHM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgZ2V0QWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1BZGFwdGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbXBsZSBleHBhbmRhYmxlIGxpc3QgYWRhcHRlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgY2xhc3MgTXlBZGFwdGVyIGV4dGVuZHMgQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlciB7Ci0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWVBdFBvc2l0aW9uKEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckNoaWxkKGdyb3VwUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkUG9zaXRpb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIGdldENoaWxkSWQoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3Vwcy5nZXQoZ3JvdXBQb3NpdGlvbikuY2hpbGRyZW4uZ2V0KGNoaWxkUG9zaXRpb24pLmlkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRDaGlsZHJlbkNvdW50KGludCBncm91cFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3Vwcy5nZXQoZ3JvdXBQb3NpdGlvbikuY2hpbGRyZW4uc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFZpZXcgZ2V0Q2hpbGRWaWV3KGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbiwgYm9vbGVhbiBpc0xhc3RDaGlsZCwKLSAgICAgICAgICAgICAgICBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmlldyhFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JDaGlsZChncm91cFBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICBjaGlsZFBvc2l0aW9uKSwgY29udmVydFZpZXcsIHBhcmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEdyb3VwKGludCBncm91cFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWVBdFBvc2l0aW9uKEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckdyb3VwKGdyb3VwUG9zaXRpb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0R3JvdXBDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBzLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIGdldEdyb3VwSWQoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBzLmdldChncm91cFBvc2l0aW9uKS5pZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldEdyb3VwVmlldyhpbnQgZ3JvdXBQb3NpdGlvbiwgYm9vbGVhbiBpc0V4cGFuZGVkLCBWaWV3IGNvbnZlcnRWaWV3LAotICAgICAgICAgICAgICAgIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRWaWV3KEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckdyb3VwKGdyb3VwUG9zaXRpb24pLAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VmlldywgcGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2hpbGRTZWxlY3RhYmxlKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdGFibGVJZHMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15R3JvdXAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBsb25nIG1OZXh0SWQgPSAxMDAwOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5hbWU7Ci0gICAgICAgIGxvbmcgaWQgPSBtTmV4dElkKys7Ci0gICAgICAgIExpc3Q8TXlDaGlsZD4gY2hpbGRyZW47Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgTXlHcm91cChpbnQgbnVtQ2hpbGRyZW4pIHsKLSAgICAgICAgICAgIG5hbWUgPSAiR3JvdXAgIiArIGlkOwotICAgICAgICAgICAgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE15Q2hpbGQ+KG51bUNoaWxkcmVuKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2hpbGRyZW47IGkrKykgewotICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFkZChuZXcgTXlDaGlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15Q2hpbGQgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBsb25nIG1OZXh0SWQgPSAyMDAwOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5hbWU7Ci0gICAgICAgIGxvbmcgaWQgPSBtTmV4dElkKys7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgTXlDaGlsZCgpIHsKLSAgICAgICAgICAgIG5hbWUgPSAiQ2hpbGQgIiArIGlkOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXQoUGFyYW1zIHBhcmFtcykgewotICAgICAgICBpbml0KChFeHBhbmRhYmxlUGFyYW1zKSBwYXJhbXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgTGlzdFNjZW5hcmlvI2luaXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0KEV4cGFuZGFibGVQYXJhbXMgcGFyYW1zKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvSnNvblJlYWRlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvSnNvblJlYWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWQ5MzEwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9Kc29uUmVhZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnV0aWw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworCitwdWJsaWMgZmluYWwgY2xhc3MgSnNvblJlYWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbdHJ1ZSwgdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRFbXB0eUFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVhZGVyLmhhc05leHQoKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoCisgICAgICAgICAgICAgICAgIntcImFcIjogXCJhbmRyb2lkXCIsIFwiYlwiOiBcImJhbmFuYVwifSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbmRyb2lkIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYW5hbmEiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRFbXB0eU9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie30iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRGYWxzZShyZWFkZXIuaGFzTmV4dCgpKTsKKyAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNraXBPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoCisgICAgICAgICAgICAgICAgIntcImFcIjogeyBcImNcIjogW10sIFwiZFwiOiBbdHJ1ZSwgdHJ1ZSwge31dIH0sIFwiYlwiOiBcImJhbmFuYVwifSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgcmVhZGVyLnNraXBWYWx1ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIHJlYWRlci5za2lwVmFsdWUoKTsKKyAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcganNvbiA9ICJ7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgXCJoZWxsb1wiOiB0cnVlLFxuIiArCisgICAgICAgICAgICAgICAgIiAgIFwiZm9vXCI6IFtcIndvcmxkXCJdXG4iICsKKyAgICAgICAgICAgICAgICAifSI7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3b3JsZCIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bGxzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEpzb25SZWFkZXIobnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiIikpLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiIikpLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Ub3BMZXZlbE9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ0cnVlIikpLm5leHRCb29sZWFuKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhcmFjdGVyVW5lc2NhcGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIltcImFcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJhXFxcIlwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcXCJcIiwiCisgICAgICAgICAgICAgICAgKyAiXCI6XCIsIgorICAgICAgICAgICAgICAgICsgIlwiLFwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcYlwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcZlwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcblwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcclwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcdFwiLCIKKyAgICAgICAgICAgICAgICArICJcIiBcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXFxcXCIsIgorICAgICAgICAgICAgICAgICsgIlwie1wiLCIKKyAgICAgICAgICAgICAgICArICJcIn1cIiwiCisgICAgICAgICAgICAgICAgKyAiXCJbXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXVwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcdTAwMDBcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXHUwMDE5XCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFx1MjBBQ1wiIgorICAgICAgICAgICAgICAgICsgIl0iOworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoanNvbikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhXCIiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcIiIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjoiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIsIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXGIiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcZiIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXHIiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcdCIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiAiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcXCIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInsiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ9IiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIl0iLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcMCIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MDAxOSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MjBBQyIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlZ2Vyc1dpdGhGcmFjdGlvbmFsUGFydFNwZWNpZmllZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWzEuMCwxLjAsMS4wXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCByZWFkZXIubmV4dEludCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDFMLCByZWFkZXIubmV4dExvbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcganNvbiA9ICJbLTAuMCwiCisgICAgICAgICAgICAgICAgKyAiMS4wLCIKKyAgICAgICAgICAgICAgICArICIxLjc5NzY5MzEzNDg2MjMxNTdFMzA4LCIKKyAgICAgICAgICAgICAgICArICI0LjlFLTMyNCwiCisgICAgICAgICAgICAgICAgKyAiMC4wLCIKKyAgICAgICAgICAgICAgICArICItMC41LCIKKyAgICAgICAgICAgICAgICArICIyLjIyNTA3Mzg1ODUwNzIwMTRFLTMwOCwiCisgICAgICAgICAgICAgICAgKyAiMy4xNDE1OTI2NTM1ODk3OTMsIgorICAgICAgICAgICAgICAgICsgIjIuNzE4MjgxODI4NDU5MDQ1XSI7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygtMC4wLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLjc5NzY5MzEzNDg2MjMxNTdFMzA4LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQuOUUtMzI0LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMC41LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIuMjI1MDczODU4NTA3MjAxNEUtMzA4LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjUzNTg5NzkzLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIuNzE4MjgxODI4NDU5MDQ1LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRmluaXRlRG91YmxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIltOYU5dIjsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGpzb24pKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0RG91YmxlKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGpzb24gPSAiWzAsMCwwLCIKKyAgICAgICAgICAgICAgICArICIxLDEsMSwiCisgICAgICAgICAgICAgICAgKyAiLTEsLTEsLTEsIgorICAgICAgICAgICAgICAgICsgIi05MjIzMzcyMDM2ODU0Nzc1ODA4LCIKKyAgICAgICAgICAgICAgICArICI5MjIzMzcyMDM2ODU0Nzc1ODA3XSI7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygwTCwgcmVhZGVyLm5leHRMb25nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVhZGVyLm5leHRJbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLjAsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMUwsIHJlYWRlci5uZXh0TG9uZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlYWRlci5uZXh0SW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xTCwgcmVhZGVyLm5leHRMb25nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHJlYWRlci5uZXh0SW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEludCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoTG9uZy5NSU5fVkFMVUUsIHJlYWRlci5uZXh0TG9uZygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0SW50KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLk1BWF9WQUxVRSwgcmVhZGVyLm5leHRMb25nKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCBmYWlscyBiZWNhdXNlIHRoZXJlJ3Mgbm8gZG91YmxlIGZvciA5MjIzMzcyMDM2ODU0Nzc1ODA2LCBhbmQKKyAgICAgKiBvdXIgbG9uZyBwYXJzaW5nIHVzZXMgRG91YmxlLnBhcnNlRG91YmxlKCkgZm9yIGZyYWN0aW9uYWwgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RIaWdoUHJlY2lzaW9uTG9uZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIls5MjIzMzcyMDM2ODU0Nzc1ODA2LjAwMF0iOworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoanNvbikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwNkwsIHJlYWRlci5uZXh0TG9uZygpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bWJlcldpdGhPY3RhbFByZWZpeCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIlswMV0iOworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoanNvbikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRJbnQoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TG9uZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHREb3VibGUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sZWFucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWUsZmFsc2VdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWl4ZWRDYXNlTGl0ZXJhbHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIltUcnVlLFRydUUsRmFsc2UsRkFMU0UsTlVMTCxudWxMXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiOn0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dFN0cmluZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByZW1hdHVyZUVuZE9mSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIjp0cnVlLCIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByZW1hdHVyZWx5Q2xvc2VkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiOltdfSIpKTsKKyAgICAgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICByZWFkZXIubmV4dE5hbWUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6W119IikpOworICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6dHJ1ZX0iKSk7CisgICAgICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgcmVhZGVyLnBlZWsoKTsKKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgcmVhZGVyLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5leHRGYWlsdXJlc0RvTm90QWR2YW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiOnRydWV9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0U3RyaW5nKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dFN0cmluZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROYW1lKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHJlYWRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nTnVsbElzTm90TnVsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW1wibnVsbFwiXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsTGl0ZXJhbElzTm90QVN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbbnVsbF0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dFN0cmluZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3ROYW1lVmFsdWVTZXBhcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIj10cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiPT50cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnROYW1lVmFsdWVTZXBhcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIj10cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiPT50cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdENvbW1lbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLy8gY29tbWVudCBcbiB0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWyMgY29tbWVudCBcbiB0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWy8qIGNvbW1lbnQgKi8gdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50Q29tbWVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlsvLyBjb21tZW50IFxuIHRydWVdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbIyBjb21tZW50IFxuIHRydWVdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLyogY29tbWVudCAqLyB0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdFVucXVvdGVkTmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoInthOnRydWV9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRVbnF1b3RlZE5hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7YTp0cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdFNpbmdsZVF1b3RlZE5hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7J2EnOnRydWV9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRTaW5nbGVRdW90ZWROYW1lcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigieydhJzp0cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdFVucXVvdGVkU3RyaW5ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW2FdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRTdHJpbmcoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50VW5xdW90ZWRTdHJpbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbYV0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaWN0U2luZ2xlUXVvdGVkU3RyaW5ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWydhJ10iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dFN0cmluZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRTaW5nbGVRdW90ZWRTdHJpbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbJ2EnXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RTZW1pY29sb25EZWxpbWl0ZWRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWU7dHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRTZW1pY29sb25EZWxpbWl0ZWRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWU7dHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RTZW1pY29sb25EZWxpbWl0ZWROYW1lVmFsdWVQYWlyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6dHJ1ZTtcImJcIjp0cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgcmVhZGVyLm5leHROYW1lKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVuaWVudFNlbWljb2xvbkRlbGltaXRlZE5hbWVWYWx1ZVBhaXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIjp0cnVlO1wiYlwiOnRydWV9IikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RVbm5lY2Vzc2FyeUFycmF5U2VwYXJhdG9ycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWUsLHRydWVdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLHRydWVdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbdHJ1ZSxdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLF0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50VW5uZWNlc3NhcnlBcnJheVNlcGFyYXRvcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlt0cnVlLCx0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLHRydWVdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlt0cnVlLF0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWyxdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0pzb25Xcml0ZXJUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0pzb25Xcml0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4NDAyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvSnNvbldyaXRlclRlc3QuamF2YQpAQCAtMCwwICsxLDQxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC51dGlsOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworcHVibGljIGZpbmFsIGNsYXNzIEpzb25Xcml0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdFdyb25nVG9wTGV2ZWxUeXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoImEiKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvTmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci5uYW1lKCJhIik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5hbWVXaXRob3V0VmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVXaXRob3V0TmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIudmFsdWUodHJ1ZSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlVG9wTGV2ZWxWYWx1ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKS5lbmRBcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJhZE5lc3RpbmdPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCYWROZXN0aW5nQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsTmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIubmFtZShudWxsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsU3RyaW5nVmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKG51bGwpOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIntcImFcIjpudWxsfSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRmluaXRlRG91YmxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci52YWx1ZShEb3VibGUuTmFOKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoRG91YmxlLk5FR0FUSVZFX0lORklOSVRZKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoRG91YmxlLlBPU0lUSVZFX0lORklOSVRZKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKC0wLjApOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDEuMCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoRG91YmxlLk1BWF9WQUxVRSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoRG91YmxlLk1JTl9WQUxVRSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoMC4wKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgtMC41KTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShEb3VibGUuTUlOX05PUk1BTCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoTWF0aC5QSSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoTWF0aC5FKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiWy0wLjAsIgorICAgICAgICAgICAgICAgICsgIjEuMCwiCisgICAgICAgICAgICAgICAgKyAiMS43OTc2OTMxMzQ4NjIzMTU3RTMwOCwiCisgICAgICAgICAgICAgICAgKyAiNC45RS0zMjQsIgorICAgICAgICAgICAgICAgICsgIjAuMCwiCisgICAgICAgICAgICAgICAgKyAiLTAuNSwiCisgICAgICAgICAgICAgICAgKyAiMi4yMjUwNzM4NTg1MDcyMDE0RS0zMDgsIgorICAgICAgICAgICAgICAgICsgIjMuMTQxNTkyNjUzNTg5NzkzLCIKKyAgICAgICAgICAgICAgICArICIyLjcxODI4MTgyODQ1OTA0NV0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoMCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoMSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoLTEpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKExvbmcuTUlOX1ZBTFVFKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShMb25nLk1BWF9WQUxVRSk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5jbG9zZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlswLCIKKyAgICAgICAgICAgICAgICArICIxLCIKKyAgICAgICAgICAgICAgICArICItMSwiCisgICAgICAgICAgICAgICAgKyAiLTkyMjMzNzIwMzY4NTQ3NzU4MDgsIgorICAgICAgICAgICAgICAgICsgIjkyMjMzNzIwMzY4NTQ3NzU4MDddIiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sZWFucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKHRydWUpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKGZhbHNlKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlt0cnVlLGZhbHNlXSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5udWxsVmFsdWUoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIltudWxsXSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJhIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoImFcIiIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcIiIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCI6Iik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIiwiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXGIiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXGYiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXG4iKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXHIiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXHQiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiICIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcXCIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJ7Iik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIn0iKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiWyIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJdIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIlwwIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIlx1MDAxOSIpOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiW1wiYVwiLCIKKyAgICAgICAgICAgICAgICArICJcImFcXFwiXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxcIlwiLCIKKyAgICAgICAgICAgICAgICArICJcIjpcIiwiCisgICAgICAgICAgICAgICAgKyAiXCIsXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxiXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxmXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxuXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxyXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFx0XCIsIgorICAgICAgICAgICAgICAgICsgIlwiIFwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcXFxcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJ7XCIsIgorICAgICAgICAgICAgICAgICsgIlwifVwiLCIKKyAgICAgICAgICAgICAgICArICJcIltcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJdXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFx1MDAwMFwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcdTAwMTlcIl0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5QXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIltdIiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eU9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7fSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0c0luQXJyYXlzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIikudmFsdWUoNSk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYiIpLnZhbHVlKGZhbHNlKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImMiKS52YWx1ZSg2KTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJkIikudmFsdWUodHJ1ZSk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbe1wiYVwiOjUsXCJiXCI6ZmFsc2V9LCIKKyAgICAgICAgICAgICAgICArICJ7XCJjXCI6NixcImRcIjp0cnVlfV0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFycmF5c0luT2JqZWN0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDUpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKGZhbHNlKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImIiKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoNik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUodHJ1ZSk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7XCJhXCI6WzUsZmFsc2VdLCIKKyAgICAgICAgICAgICAgICArICJcImJcIjpbNix0cnVlXX0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlZXBOZXN0aW5nQXJyYXlzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIltbW1tbW1tbW1tbW1tbW1tbW1tbXV1dXV1dXV1dXV1dXV1dXV1dXV0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlZXBOZXN0aW5nT2JqZWN0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKTsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIH0KKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6IgorICAgICAgICAgICAgICAgICsgIntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7IgorICAgICAgICAgICAgICAgICsgIn19fX19fX19fX19fX19fX19fX19fSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0ZWROYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKS52YWx1ZSh0cnVlKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIikudmFsdWUoZmFsc2UpOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICAvLyBKc29uV3JpdGVyIGRvZXNuJ3QgYXR0ZW1wdCB0byBkZXRlY3QgZHVwbGljYXRlIG5hbWVzCisgICAgICAgIGFzc2VydEVxdWFscygie1wiYVwiOnRydWUsXCJhXCI6ZmFsc2V9Iiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmV0dHlQcmludE9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuc2V0SW5kZW50KCIgICAiKTsKKworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpLnZhbHVlKHRydWUpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImIiKS52YWx1ZShmYWxzZSk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYyIpLnZhbHVlKDUuMCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiZSIpLm51bGxWYWx1ZSgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImYiKS5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoNi4wKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSg3LjApOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiZyIpLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiaCIpLnZhbHVlKDguMCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiaSIpLnZhbHVlKDkuMCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gIntcbiIKKyAgICAgICAgICAgICAgICArICIgICBcImFcIjogdHJ1ZSxcbiIKKyAgICAgICAgICAgICAgICArICIgICBcImJcIjogZmFsc2UsXG4iCisgICAgICAgICAgICAgICAgKyAiICAgXCJjXCI6IDUuMCxcbiIKKyAgICAgICAgICAgICAgICArICIgICBcImVcIjogbnVsbCxcbiIKKyAgICAgICAgICAgICAgICArICIgICBcImZcIjogW1xuIgorICAgICAgICAgICAgICAgICsgIiAgICAgIDYuMCxcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICA3LjBcbiIKKyAgICAgICAgICAgICAgICArICIgICBdLFxuIgorICAgICAgICAgICAgICAgICsgIiAgIFwiZ1wiOiB7XG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgXCJoXCI6IDguMCxcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICBcImlcIjogOS4wXG4iCisgICAgICAgICAgICAgICAgKyAiICAgfVxuIgorICAgICAgICAgICAgICAgICsgIn0iOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJldHR5UHJpbnRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuc2V0SW5kZW50KCIgICAiKTsKKworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSh0cnVlKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShmYWxzZSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoNS4wKTsKKyAgICAgICAganNvbldyaXRlci5udWxsVmFsdWUoKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKS52YWx1ZSg2LjApOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImIiKS52YWx1ZSg3LjApOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSg4LjApOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDkuMCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworCisgICAgICAgIFN0cmluZyBleHBlY3RlZCA9ICJbXG4iCisgICAgICAgICAgICAgICAgKyAiICAgdHJ1ZSxcbiIKKyAgICAgICAgICAgICAgICArICIgICBmYWxzZSxcbiIKKyAgICAgICAgICAgICAgICArICIgICA1LjAsXG4iCisgICAgICAgICAgICAgICAgKyAiICAgbnVsbCxcbiIKKyAgICAgICAgICAgICAgICArICIgICB7XG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgXCJhXCI6IDYuMCxcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICBcImJcIjogNy4wXG4iCisgICAgICAgICAgICAgICAgKyAiICAgfSxcbiIKKyAgICAgICAgICAgICAgICArICIgICBbXG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgOC4wLFxuIgorICAgICAgICAgICAgICAgICsgIiAgICAgIDkuMFxuIgorICAgICAgICAgICAgICAgICsgIiAgIF1cbiIKKyAgICAgICAgICAgICAgICArICJdIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9QYXR0ZXJuc1Rlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvUGF0dGVybnNUZXN0LmphdmEKaW5kZXggYjkwYzk3Yi4uYWFkM2ZlMSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9QYXR0ZXJuc1Rlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL1BhdHRlcm5zVGVzdC5qYXZhCkBAIC02OCw2ICs2OCwxMyBAQAogICAgICAgICB0ID0gUGF0dGVybnMuV0VCX1VSTC5tYXRjaGVyKCJ4bi0tZnNxdTAwYS54bi0tMHp3bTU2ZCIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgVVJMIiwgdCk7CiAKKyAgICAgICAgLy8gVXJsIGZvciB0ZXN0aW5nIHRvcCBsZXZlbCBBcmFiaWMgY291bnRyeSBjb2RlIGRvbWFpbiBpbiBQdW55Y29kZToKKyAgICAgICAgLy8gICBodHRwOi8veG4tLTRnYnJpbS54bi0tLS1ybWNrYmJhamxjNmRqN2J4bmUyYy54bi0td2diaDFjL2FyL2RlZmF1bHQuYXNweAorICAgICAgICB0ID0gUGF0dGVybnMuV0VCX1VSTC5tYXRjaGVyKCJodHRwOi8veG4tLTRnYnJpbS54bi0tLS1ybWNrYmJhamxjNmRqN2J4bmUyYy54bi0td2diaDFjL2FyL2RlZmF1bHQuYXNweCIpLm1hdGNoZXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgVVJMIiwgdCk7CisgICAgICAgIHQgPSBQYXR0ZXJucy5XRUJfVVJMLm1hdGNoZXIoInhuLS00Z2JyaW0ueG4tLS0tcm1ja2JiYWpsYzZkajdieG5lMmMueG4tLXdnYmgxYy9hci9kZWZhdWx0LmFzcHgiKS5tYXRjaGVzKCk7CisgICAgICAgIGFzc2VydFRydWUoIlZhbGlkIFVSTCIsIHQpOworCiAgICAgICAgIC8vIEludGVybmF0aW9uYWxpemVkIFVSTC4KICAgICAgICAgdCA9IFBhdHRlcm5zLldFQl9VUkwubWF0Y2hlcigiaHR0cDovL1x1RDYwNFx1QUUwOFx1QzYwMVx1QzIxOFx1Qzk5RC5rciIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgVVJMIiwgdCk7CkBAIC0xMDksNyArMTE2LDcgQEAKICAgICAgICAgdCA9IFBhdHRlcm5zLkRPTUFJTl9OQU1FLm1hdGNoZXIoIm1haWwuZXhhbXBsZS5jb20iKS5tYXRjaGVzKCk7CiAgICAgICAgIGFzc2VydFRydWUoIlZhbGlkIGRvbWFpbiIsIHQpOwogCi0gICAgICAgIHQgPSBQYXR0ZXJucy5XRUJfVVJMLm1hdGNoZXIoImdvb2dsZS5tZSIpLm1hdGNoZXMoKTsKKyAgICAgICAgdCA9IFBhdHRlcm5zLkRPTUFJTl9OQU1FLm1hdGNoZXIoImdvb2dsZS5tZSIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgZG9tYWluIiwgdCk7CiAKICAgICAgICAgLy8gSW50ZXJuYXRpb25hbGl6ZWQgZG9tYWlucy4KQEAgLTExOCw2ICsxMjUsMTQgQEAKIAogICAgICAgICB0ID0gUGF0dGVybnMuRE9NQUlOX05BTUUubWF0Y2hlcigiX18rJjQyLnhlciIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoIkludmFsaWQgZG9tYWluIiwgdCk7CisKKyAgICAgICAgLy8gT2Jzb2xldGUgZG9tYWluIC55dQorICAgICAgICB0ID0gUGF0dGVybnMuRE9NQUlOX05BTUUubWF0Y2hlcigidGVzdC55dSIpLm1hdGNoZXMoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIk9ic29sZXRlIGNvdW50cnkgY29kZSB0b3AgbGV2ZWwgZG9tYWluIiwgdCk7CisKKyAgICAgICAgLy8gVGVzdGluZyB0b3AgbGV2ZWwgQXJhYmljIGNvdW50cnkgY29kZSBkb21haW4gaW4gUHVueWNvZGU6CisgICAgICAgIHQgPSBQYXR0ZXJucy5ET01BSU5fTkFNRS5tYXRjaGVyKCJ4bi0tNGdicmltLnhuLS0tLXJtY2tiYmFqbGM2ZGo3YnhuZTJjLnhuLS13Z2JoMWMiKS5tYXRjaGVzKCk7CisgICAgICAgIGFzc2VydFRydWUoIlZhbGlkIGRvbWFpbiIsIHQpOwogICAgIH0KIAogICAgIEBTbWFsbFRlc3QKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dlYmtpdC9ab29tTWFuYWdlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dlYmtpdC9ab29tTWFuYWdlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzlkZWZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgWm9vbU1hbmFnZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgWm9vbU1hbmFnZXIgem9vbU1hbmFnZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgV2ViVmlldyB3ZWJWaWV3ID0gbmV3IFdlYlZpZXcodGhpcy5nZXRDb250ZXh0KCkpOworICAgICAgICBDYWxsYmFja1Byb3h5IGNhbGxiYWNrUHJveHkgPSBuZXcgQ2FsbGJhY2tQcm94eSh0aGlzLmdldENvbnRleHQoKSwgd2ViVmlldyk7CisgICAgICAgIHpvb21NYW5hZ2VyID0gbmV3IFpvb21NYW5hZ2VyKHdlYlZpZXcsIGNhbGxiYWNrUHJveHkpOworCisgICAgICAgIHpvb21NYW5hZ2VyLmluaXQoMS4wMGYpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbml0KCkgeworICAgICAgICB0ZXN0SW5pdCgwLjAxZik7CisgICAgICAgIHRlc3RJbml0KDEuMDBmKTsKKyAgICAgICAgdGVzdEluaXQoMS4yNWYpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0SW5pdChmbG9hdCBkZW5zaXR5KSB7CisgICAgICAgIHpvb21NYW5hZ2VyLmluaXQoZGVuc2l0eSk7CisgICAgICAgIGFjdHVhbFNjYWxlVGVzdChkZW5zaXR5KTsKKyAgICAgICAgZGVmYXVsdFNjYWxlVGVzdChkZW5zaXR5KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHpvb21NYW5hZ2VyLmdldERlZmF1bHRNYXhab29tU2NhbGUoKSwgem9vbU1hbmFnZXIuZ2V0TWF4Wm9vbVNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoem9vbU1hbmFnZXIuZ2V0RGVmYXVsdE1pblpvb21TY2FsZSgpLCB6b29tTWFuYWdlci5nZXRNaW5ab29tU2NhbGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkZW5zaXR5LCB6b29tTWFuYWdlci5nZXRUZXh0V3JhcFNjYWxlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoKSB7CisgICAgICAgIC8vIHRlc3QgdGhlIGJhc2ljIGNhc2Ugd2hlcmUgdGhlIGFjdHVhbCB2YWx1ZXMgYXJlIGVxdWFsIHRvIHRoZSBkZWZhdWx0cworICAgICAgICB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KDAuMDFmKTsKKyAgICAgICAgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eSgxLjAwZik7CisgICAgICAgIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoMS4yNWYpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGZsb2F0IGRlbnNpdHkpIHsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGRlbnNpdHkpOworICAgICAgICBkZWZhdWx0U2NhbGVUZXN0KGRlbnNpdHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHlXaXRoU21hbGxNaW5ab29tKCkgeworICAgICAgICAvLyB0ZXN0IHRoZSBjYXNlIHdoZXJlIHRoZSBtaW5ab29tU2NhbGUgaGFzIGNoYW5nZWQgdG8gYmUgPCB0aGUgZGVmYXVsdAorICAgICAgICBmbG9hdCBuZXdEZWZhdWx0U2NhbGUgPSAxLjUwZjsKKyAgICAgICAgZmxvYXQgbWluWm9vbVNjYWxlID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NSU5fWk9PTV9TQ0FMRV9GQUNUT1IgKiBuZXdEZWZhdWx0U2NhbGU7CisgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSBtaW5WaWV3U3RhdGUgPSBuZXcgV2ViVmlld0NvcmUuVmlld1N0YXRlKCk7CisgICAgICAgIG1pblZpZXdTdGF0ZS5tTWluU2NhbGUgPSBtaW5ab29tU2NhbGUgLSAwLjFmOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVab29tUmFuZ2UobWluVmlld1N0YXRlLCAwLCAwKTsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgICAgIGRlZmF1bHRTY2FsZVRlc3QobmV3RGVmYXVsdFNjYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5V2l0aExhcmdlTWluWm9vbSgpIHsKKyAgICAgICAgLy8gdGVzdCB0aGUgY2FzZSB3aGVyZSB0aGUgbWluWm9vbVNjYWxlIGhhcyBjaGFuZ2VkIHRvIGJlID4gdGhlIGRlZmF1bHQKKyAgICAgICAgZmxvYXQgbmV3RGVmYXVsdFNjYWxlID0gMS41MGY7CisgICAgICAgIGZsb2F0IG1pblpvb21TY2FsZSA9IFpvb21NYW5hZ2VyLkRFRkFVTFRfTUlOX1pPT01fU0NBTEVfRkFDVE9SICogbmV3RGVmYXVsdFNjYWxlOworICAgICAgICBXZWJWaWV3Q29yZS5WaWV3U3RhdGUgbWluVmlld1N0YXRlID0gbmV3IFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSgpOworICAgICAgICBtaW5WaWV3U3RhdGUubU1pblNjYWxlID0gbWluWm9vbVNjYWxlICsgMC4xZjsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlWm9vbVJhbmdlKG1pblZpZXdTdGF0ZSwgMCwgMCk7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShuZXdEZWZhdWx0U2NhbGUpOworICAgICAgICBkZWZhdWx0U2NhbGVUZXN0KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eVdpdGhTbWFsbE1heFpvb20oKSB7CisgICAgICAgIC8vIHRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIG1heFpvb21TY2FsZSBoYXMgY2hhbmdlZCB0byBiZSA8IHRoZSBkZWZhdWx0CisgICAgICAgIGZsb2F0IG5ld0RlZmF1bHRTY2FsZSA9IDEuNTBmOworICAgICAgICBmbG9hdCBtYXhab29tU2NhbGUgPSBab29tTWFuYWdlci5ERUZBVUxUX01BWF9aT09NX1NDQUxFX0ZBQ1RPUiAqIG5ld0RlZmF1bHRTY2FsZTsKKyAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIG1heFZpZXdTdGF0ZSA9IG5ldyBXZWJWaWV3Q29yZS5WaWV3U3RhdGUoKTsKKyAgICAgICAgbWF4Vmlld1N0YXRlLm1NYXhTY2FsZSA9IG1heFpvb21TY2FsZSAtIDAuMWY7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZVpvb21SYW5nZShtYXhWaWV3U3RhdGUsIDAsIDApOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkobmV3RGVmYXVsdFNjYWxlKTsKKyAgICAgICAgZGVmYXVsdFNjYWxlVGVzdChuZXdEZWZhdWx0U2NhbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHlXaXRoTGFyZ2VNYXhab29tKCkgeworICAgICAgICAvLyB0ZXN0IHRoZSBjYXNlIHdoZXJlIHRoZSBtYXhab29tU2NhbGUgaGFzIGNoYW5nZWQgdG8gYmUgPiB0aGUgZGVmYXVsdAorICAgICAgICBmbG9hdCBuZXdEZWZhdWx0U2NhbGUgPSAxLjUwZjsKKyAgICAgICAgZmxvYXQgbWF4Wm9vbVNjYWxlID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NQVhfWk9PTV9TQ0FMRV9GQUNUT1IgKiBuZXdEZWZhdWx0U2NhbGU7CisgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSBtYXhWaWV3U3RhdGUgPSBuZXcgV2ViVmlld0NvcmUuVmlld1N0YXRlKCk7CisgICAgICAgIG1heFZpZXdTdGF0ZS5tTWF4U2NhbGUgPSBtYXhab29tU2NhbGUgKyAwLjFmOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVab29tUmFuZ2UobWF4Vmlld1N0YXRlLCAwLCAwKTsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgICAgIGRlZmF1bHRTY2FsZVRlc3QobmV3RGVmYXVsdFNjYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcHV0ZVNjYWxlV2l0aExpbWl0cygpIHsKKyAgICAgICAgZmluYWwgZmxvYXQgbWF4U2NhbGUgPSB6b29tTWFuYWdlci5nZXRNYXhab29tU2NhbGUoKTsKKyAgICAgICAgZmluYWwgZmxvYXQgbWluU2NhbGUgPSB6b29tTWFuYWdlci5nZXRNaW5ab29tU2NhbGUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXhTY2FsZSA+IG1pblNjYWxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1heFNjYWxlLCB6b29tTWFuYWdlci5jb21wdXRlU2NhbGVXaXRoTGltaXRzKG1heFNjYWxlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtYXhTY2FsZSwgem9vbU1hbmFnZXIuY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhtYXhTY2FsZSArIC4wMWYpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1pblNjYWxlLCB6b29tTWFuYWdlci5jb21wdXRlU2NhbGVXaXRoTGltaXRzKG1pblNjYWxlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtaW5TY2FsZSwgem9vbU1hbmFnZXIuY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhtaW5TY2FsZSAtIC4wMWYpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWN0dWFsU2NhbGVUZXN0KGZsb2F0IGFjdHVhbFNjYWxlKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhhY3R1YWxTY2FsZSwgem9vbU1hbmFnZXIuZ2V0U2NhbGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxIC8gYWN0dWFsU2NhbGUsIHpvb21NYW5hZ2VyLmdldEludlNjYWxlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWZhdWx0U2NhbGVUZXN0KGZsb2F0IGRlZmF1bHRTY2FsZSkgeworICAgICAgICBmaW5hbCBmbG9hdCBtYXhEZWZhdWx0ID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NQVhfWk9PTV9TQ0FMRV9GQUNUT1IgKiBkZWZhdWx0U2NhbGU7CisgICAgICAgIGZpbmFsIGZsb2F0IG1pbkRlZmF1bHQgPSBab29tTWFuYWdlci5ERUZBVUxUX01JTl9aT09NX1NDQUxFX0ZBQ1RPUiAqIGRlZmF1bHRTY2FsZTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRlZmF1bHRTY2FsZSwgem9vbU1hbmFnZXIuZ2V0RGVmYXVsdFNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSAvIGRlZmF1bHRTY2FsZSwgem9vbU1hbmFnZXIuZ2V0SW52RGVmYXVsdFNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobWF4RGVmYXVsdCwgem9vbU1hbmFnZXIuZ2V0RGVmYXVsdE1heFpvb21TY2FsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1pbkRlZmF1bHQsIHpvb21NYW5hZ2VyLmdldERlZmF1bHRNaW5ab29tU2NhbGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdEJhc2ljVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdEJhc2ljVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjNiNTE2Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkV4cGFuZGFibGVMaXN0U2NlbmFyaW87Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxpc3RVdGlsOwotaW1wb3J0IGFuZHJvaWQudXRpbC5FeHBhbmRhYmxlTGlzdFNjZW5hcmlvLk15R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxFeHBhbmRhYmxlTGlzdFNpbXBsZT4gewotICAgIHByaXZhdGUgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbyBtQWN0aXZpdHk7Ci0gICAgcHJpdmF0ZSBFeHBhbmRhYmxlTGlzdFZpZXcgbUV4cGFuZGFibGVMaXN0VmlldzsKLSAgICBwcml2YXRlIEV4cGFuZGFibGVMaXN0QWRhcHRlciBtQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3RVdGlsIG1MaXN0VXRpbDsKLSAgICAKLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEV4cGFuZGFibGVMaXN0U2ltcGxlLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICAKLSAgICAgICAgbUFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKLSAgICAgICAgbUV4cGFuZGFibGVMaXN0VmlldyA9IG1BY3Rpdml0eS5nZXRFeHBhbmRhYmxlTGlzdFZpZXcoKTsKLSAgICAgICAgbUFkYXB0ZXIgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEV4cGFuZGFibGVMaXN0QWRhcHRlcigpOwotICAgICAgICBtTGlzdFV0aWwgPSBuZXcgTGlzdFV0aWwobUV4cGFuZGFibGVMaXN0VmlldywgZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVjb25kaXRpb25zKCkgewotICAgICAgICBhc3NlcnROb3ROdWxsKG1BY3Rpdml0eSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobUV4cGFuZGFibGVMaXN0Vmlldyk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGV4cGFuZEdyb3VwKGludCBudW1DaGlsZHJlbiwgYm9vbGVhbiBhdExlYXN0T25lQ2hpbGQpIHsKLSAgICAgICAgZmluYWwgaW50IGdyb3VwUG9zID0gbUFjdGl2aXR5LmZpbmRHcm91cFdpdGhOdW1DaGlsZHJlbihudW1DaGlsZHJlbiwgYXRMZWFzdE9uZUNoaWxkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgZ3JvdXAgdG8gZXhwYW5kIiwgZ3JvdXBQb3MgPj0gMCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoIkdyb3VwIGlzIGFscmVhZHkgZXhwYW5kZWQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cFBvcykpOwotICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oZ3JvdXBQb3MpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBhc3NlcnRUcnVlKCJHcm91cCBkaWQgbm90IGV4cGFuZCIsIG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKGdyb3VwUG9zKSk7Ci0KLSAgICAgICAgcmV0dXJuIGdyb3VwUG9zOwotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4cGFuZEdyb3VwKCkgewotICAgICAgICBleHBhbmRHcm91cCgtMSwgdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbGxhcHNlR3JvdXAoKSB7Ci0gICAgICAgIGZpbmFsIGludCBncm91cFBvcyA9IGV4cGFuZEdyb3VwKC0xLCB0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIHNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkdyb3VwIGRpZCBub3QgY29sbGFwc2UiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cFBvcykpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRlZEdyb3VwTW92ZW1lbnQoKSB7Ci0gICAgICAgIC8vIEV4cGFuZCB0aGUgZmlyc3QgZ3JvdXAKLSAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKDApOwotICAgICAgICBzZW5kS2V5cyhLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0KLSAgICAgICAgLy8gRW5zdXJlIGl0IGV4cGFuZGVkCi0gICAgICAgIGFzc2VydFRydWUoIkdyb3VwIGRpZCBub3QgZXhwYW5kIiwgbUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoMCkpOwotICAgICAgICAKLSAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGF0J3MgYWxsIGdvb2QKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgaXQgZXhwYW5kZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiR3JvdXAgZGlkIG5vdCBleHBhbmQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBJbnNlcnQgYSBjb2xsYXBzZWQgZ3JvdXAgaW4gZnJvbnQgb2YgdGhlIG9uZSBqdXN0IGV4cGFuZGVkCi0gICAgICAgIExpc3Q8TXlHcm91cD4gZ3JvdXBzID0gbUFjdGl2aXR5LmdldEdyb3VwcygpOwotICAgICAgICBNeUdyb3VwIGluc2VydGVkR3JvdXAgPSBuZXcgTXlHcm91cCgxKTsKLSAgICAgICAgZ3JvdXBzLmFkZCgwLCBpbnNlcnRlZEdyb3VwKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE5vdGlmeSBkYXRhIGNoYW5nZQotICAgICAgICBhc3NlcnRUcnVlKCJBZGFwdGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgYmFzZSBhZGFwdGVyIiwKLSAgICAgICAgICAgICAgICBtQWRhcHRlciBpbnN0YW5jZW9mIEJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIpOwotICAgICAgICBmaW5hbCBCYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyIGFkYXB0ZXIgPSAoQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcikgbUFkYXB0ZXI7Ci0gICAgIAotICAgICAgICBtQWN0aXZpdHkucnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgYWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJpZ2h0IGdyb3VwIGlzIGV4cGFuZGVkCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBleHBhbmRlZCBzdGF0ZSBkaWRuJ3Qgc3RheSB3aXRoIHRoZSBwcm9wZXIgZ3JvdXAiLAotICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKDEpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBleHBhbmRlZCBzdGF0ZSB3YXMgZ2l2ZW4gdG8gdGhlIGluc2VydGVkIGdyb3VwIiwKLSAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dE1lbnVzKCkgewotICAgICAgICBFeHBhbmRhYmxlTGlzdFRlc3RlciB0ZXN0ZXIgPSBuZXcgRXhwYW5kYWJsZUxpc3RUZXN0ZXIobUV4cGFuZGFibGVMaXN0VmlldywgdGhpcyk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udGV4dE1lbnVzKCk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkKCkgewotICAgICAgICBFeHBhbmRhYmxlTGlzdFRlc3RlciB0ZXN0ZXIgPSBuZXcgRXhwYW5kYWJsZUxpc3RUZXN0ZXIobUV4cGFuZGFibGVMaXN0VmlldywgdGhpcyk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25Hcm91cHMoKTsKLSAgICAgICAgdGVzdGVyLnRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWRPbkNoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbigpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25Pbkdyb3VwcygpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25PbkNoaWxkcmVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFNpbXBsZS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFNpbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGRiMjhjLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RTaW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0uT25NZW51SXRlbUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcjsKLQotaW1wb3J0IGFuZHJvaWQudXRpbC5FeHBhbmRhYmxlTGlzdFNjZW5hcmlvOwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RTaW1wbGUgZXh0ZW5kcyBFeHBhbmRhYmxlTGlzdFNjZW5hcmlvIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBOVU1fQ0hJTERSRU4gPSB7NCwgMywgMiwgMSwgMH07Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KEV4cGFuZGFibGVQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIHBhcmFtcy5zZXROdW1DaGlsZHJlbihOVU1fQ0hJTERSRU4pCi0gICAgICAgICAgICAgICAgLnNldEl0ZW1TY3JlZW5TaXplRmFjdG9yKDAuMTQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7Ci0KLSAgICAgICAgbWVudS5hZGQoIkFkZCBpdGVtIikuc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIobmV3IE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBzLmFkZCgwLCBuZXcgTXlHcm91cCgyKSk7Ci0gICAgICAgICAgICAgICAgKChCYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyKSBtQWRhcHRlcikubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0VGVzdGVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYjEwZmIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkV4cGFuZGFibGVMaXN0U2NlbmFyaW87Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxpc3RVdGlsOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotcHVibGljIGNsYXNzIEV4cGFuZGFibGVMaXN0VGVzdGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIEV4cGFuZGFibGVMaXN0VmlldyBtRXhwYW5kYWJsZUxpc3RWaWV3OwotICAgIHByaXZhdGUgZmluYWwgRXhwYW5kYWJsZUxpc3RBZGFwdGVyIG1BZGFwdGVyOwotICAgIHByaXZhdGUgZmluYWwgTGlzdFV0aWwgbUxpc3RVdGlsOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjw/IGV4dGVuZHMgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbz4KLSAgICAgICAgbUFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uOwotCi0gICAgSW5zdHJ1bWVudGF0aW9uIG1JbnN0cnVtZW50YXRpb247Ci0KLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RUZXN0ZXIoCi0gICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcgZXhwYW5kYWJsZUxpc3RWaWV3LAotICAgICAgICAgICAgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8PyBleHRlbmRzIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8+Ci0gICAgICAgICAgICBhY3Rpdml0eUluc3RydW1lbnRhdGlvbikgewotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3ID0gZXhwYW5kYWJsZUxpc3RWaWV3OwotICAgICAgICBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uID0gYWN0aXZpdHlJbnN0cnVtZW50YXRpb24uZ2V0SW5zdHJ1bWVudGF0aW9uKCk7Ci0gICAgICAgIG1MaXN0VXRpbCA9IG5ldyBMaXN0VXRpbChtRXhwYW5kYWJsZUxpc3RWaWV3LCBpbnN0cnVtZW50YXRpb24pOwotICAgICAgICBtQWRhcHRlciA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RBZGFwdGVyKCk7Ci0gICAgICAgIG1BY3Rpdml0eUluc3RydW1lbnRhdGlvbiA9IGFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uOwotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uID0gbUFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uLmdldEluc3RydW1lbnRhdGlvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHBhbmRHcm91cChmaW5hbCBpbnQgZ3JvdXBJbmRleCwgaW50IGZsYXRQb3NpdGlvbikgewotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoIkdyb3VwIGlzIGFscmVhZHkgZXhwYW5kZWQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3Ci0gICAgICAgICAgICAgICAgLmlzR3JvdXBFeHBhbmRlZChncm91cEluZGV4KSk7Ci0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihmbGF0UG9zaXRpb24pOwotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBtQWN0aXZpdHlJbnN0cnVtZW50YXRpb24uc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIG1BY3Rpdml0eUluc3RydW1lbnRhdGlvbi5nZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkdyb3VwIGRpZCBub3QgZXhwYW5kICIgKyBncm91cEluZGV4LCAKLSAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cEluZGV4KSk7Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0Q29udGV4dE1lbnVzKCkgewotICAgICAgICAvLyBBZGQgYSBwb3NpdGlvbiB0ZXN0ZXIgQ29udGV4dE1lbnUgbGlzdGVuZXIgdG8gdGhlIEV4cGFuZGFibGVMaXN0VmlldwotICAgICAgICBQb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIgbWVudUxpc3RlbmVyID0gbmV3IFBvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lcigpOwotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNldE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcihtZW51TGlzdGVuZXIpOwotCi0gICAgICAgIGludCBpbmRleCA9IDA7Ci0KLSAgICAgICAgLy8gU2Nyb2xsaW5nIG9uIGhlYWRlciBlbGVtZW50cyBzaG91bGQgdHJpZ2dlciBhbiBBZGFwdGVyQ29udGV4dE1lbnUKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIC8vIENoZWNrIGdyb3VwIGluZGV4IGluIGNvbnRleHQgbWVudQotICAgICAgICAgICAgbWVudUxpc3RlbmVyLmV4cGVjdEFkYXB0ZXJDb250ZXh0TWVudShpKTsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZ3JvdXAgaXMgdmlzaWJsZSBzbyB0aGF0IGdldENoaWxkIGZpbmRzIGl0Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgVmlldyBoZWFkZXJDaGlsZCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Q2hpbGRBdChpbmRleAotICAgICAgICAgICAgICAgICAgICAtIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNob3dDb250ZXh0TWVudUZvckNoaWxkKGhlYWRlckNoaWxkKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCksIG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdyb3VwQ291bnQgPSBtQWRhcHRlci5nZXRHcm91cENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGdyb3VwSW5kZXggPSAwOyBncm91cEluZGV4IDwgZ3JvdXBDb3VudDsgZ3JvdXBJbmRleCsrKSB7Ci0KLSAgICAgICAgICAgIC8vIEV4cGFuZCBncm91cAotICAgICAgICAgICAgZXhwYW5kR3JvdXAoZ3JvdXBJbmRleCwgaW5kZXgpOwotCi0gICAgICAgICAgICAvLyBDaGVjayBncm91cCBpbmRleCBpbiBjb250ZXh0IG1lbnUKLSAgICAgICAgICAgIG1lbnVMaXN0ZW5lci5leHBlY3RHcm91cENvbnRleHRNZW51KGdyb3VwSW5kZXgpOwotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBncm91cCBpcyB2aXNpYmxlIHNvIHRoYXQgZ2V0Q2hpbGQgZmluZHMgaXQKLSAgICAgICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihpbmRleCk7Ci0gICAgICAgICAgICBWaWV3IGdyb3VwQ2hpbGQgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldENoaWxkQXQoaW5kZXgKLSAgICAgICAgICAgICAgICAgICAgLSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCkpOwotICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5zaG93Q29udGV4dE1lbnVGb3JDaGlsZChncm91cENoaWxkKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCksIG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotCi0gICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRyZW5Db3VudCA9IG1BZGFwdGVyLmdldENoaWxkcmVuQ291bnQoZ3JvdXBJbmRleCk7Ci0gICAgICAgICAgICBmb3IgKGludCBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IGNoaWxkcmVuQ291bnQ7IGNoaWxkSW5kZXgrKykgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIGNoaWxkIGluZGV4IGluIGNvbnRleHQgbWVudQotICAgICAgICAgICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihpbmRleCk7Ci0gICAgICAgICAgICAgICAgbWVudUxpc3RlbmVyLmV4cGVjdENoaWxkQ29udGV4dE1lbnUoZ3JvdXBJbmRleCwgY2hpbGRJbmRleCk7Ci0gICAgICAgICAgICAgICAgVmlldyBjaGlsZCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Q2hpbGRBdChpbmRleAotICAgICAgICAgICAgICAgICAgICAgICAgLSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCkpOwotICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuc2hvd0NvbnRleHRNZW51Rm9yQ2hpbGQoY2hpbGQpOwotICAgICAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwobWVudUxpc3RlbmVyLmdldEVycm9yTWVzc2FnZSgpLCBtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTY3JvbGxpbmcgb24gZm9vdGVyIGVsZW1lbnRzIHNob3VsZCB0cmlnZ2VyIGFuIEFkYXB0ZXJDb250ZXh0TWVudQotICAgICAgICBmb3IgKGludCBpPTA7IGk8bUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGb290ZXJWaWV3c0NvdW50KCk7IGkrKykgewotICAgICAgICAgICAgLy8gQ2hlY2sgZ3JvdXAgaW5kZXggaW4gY29udGV4dCBtZW51Ci0gICAgICAgICAgICBtZW51TGlzdGVuZXIuZXhwZWN0QWRhcHRlckNvbnRleHRNZW51KGluZGV4KTsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZ3JvdXAgaXMgdmlzaWJsZSBzbyB0aGF0IGdldENoaWxkIGZpbmRzIGl0Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgVmlldyBmb290ZXJDaGlsZCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Q2hpbGRBdChpbmRleAotICAgICAgICAgICAgICAgICAgICAtIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNob3dDb250ZXh0TWVudUZvckNoaWxkKGZvb3RlckNoaWxkKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCksIG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2xlYW51cDogcmVtb3ZlIHRoZSBsaXN0ZW5lciB3ZSBhZGRlZC4KLSAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5zZXRPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIobnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZXhwYW5kQUdyb3VwKCkgewotICAgICAgICBmaW5hbCBpbnQgZ3JvdXBJbmRleCA9IDI7Ci0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiTm90IGVub3VnaCBncm91cHMiLCBncm91cEluZGV4IDwgbUFkYXB0ZXIuZ2V0R3JvdXBDb3VudCgpKTsKLSAgICAgICAgZXhwYW5kR3JvdXAoZ3JvdXBJbmRleCwgZ3JvdXBJbmRleCArIGhlYWRlckNvdW50KTsKLSAgICAgICAgcmV0dXJuIGdyb3VwSW5kZXg7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IE5PIGdyb3VwIGlzIGV4cGFuZGVkIHdoZW4gY2FsbGVkCi0gICAgdm9pZCB0ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25Hcm91cHMoKSB7Ci0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxoZWFkZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJOb24gTlVMTCBwb3NpdGlvbiBmb3IgaGVhZGVyIGl0ZW0iLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RQb3NpdGlvbihpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUZXN0IGFsbCAobm9uIGV4cGFuZGVkKSBncm91cHMKLSAgICAgICAgZmluYWwgaW50IGdyb3VwQ291bnQgPSBtQWRhcHRlci5nZXRHcm91cENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGdyb3VwSW5kZXggPSAwOyBncm91cEluZGV4IDwgZ3JvdXBDb3VudDsgZ3JvdXBJbmRleCsrKSB7Ci0gICAgICAgICAgICBpbnQgZXhwZWN0ZWRGbGF0UG9zaXRpb24gPSBoZWFkZXJDb3VudCArIGdyb3VwSW5kZXg7Ci0gICAgICAgICAgICBsb25nIHBhY2tlZFBvc2l0aW9uRm9yR3JvdXAgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JHcm91cChncm91cEluZGV4KTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdyb3VwIG5vdCBmb3VuZCBhdCBmbGF0IHBvc2l0aW9uICIgKyBleHBlY3RlZEZsYXRQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgcGFja2VkUG9zaXRpb25Gb3JHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRFeHBhbmRhYmxlTGlzdFBvc2l0aW9uKGV4cGVjdGVkRmxhdFBvc2l0aW9uKSk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIldyb25nIGZsYXQgcG9zaXRpb24gZm9yIGdyb3VwICIgKyBncm91cEluZGV4LAotICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEZsYXRQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGbGF0TGlzdFBvc2l0aW9uKHBhY2tlZFBvc2l0aW9uRm9yR3JvdXApKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZvb3RlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJOb24gTlVMTCBwb3NpdGlvbiBmb3IgaGVhZGVyIGl0ZW0iLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RQb3NpdGlvbihoZWFkZXJDb3VudCArIGdyb3VwQ291bnQgKyBpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgTk8gZ3JvdXAgaXMgZXhwYW5kZWQgd2hlbiBjYWxsZWQKLSAgICB2b2lkIHRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWRPbkNoaWxkcmVuKCkgewotICAgICAgICAvLyBUZXN0IHdpdGggYW4gZXhwYW5kZWQgZ3JvdXAKLSAgICAgICAgZmluYWwgaW50IGhlYWRlckNvdW50ID0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRIZWFkZXJWaWV3c0NvdW50KCk7Ci0gICAgICAgIGZpbmFsIGludCBncm91cEluZGV4ID0gZXhwYW5kQUdyb3VwKCk7Ci0KLSAgICAgICAgZmluYWwgaW50IGNoaWxkcmVuQ291bnQgPSBtQWRhcHRlci5nZXRDaGlsZHJlbkNvdW50KGdyb3VwSW5kZXgpOwotICAgICAgICBmb3IgKGludCBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IGNoaWxkcmVuQ291bnQ7IGNoaWxkSW5kZXgrKykgewotICAgICAgICAgICAgaW50IGV4cGVjdGVkRmxhdFBvc2l0aW9uID0gaGVhZGVyQ291bnQgKyBncm91cEluZGV4ICsgMSArIGNoaWxkSW5kZXg7Ci0gICAgICAgICAgICBsb25nIGNoaWxkUG9zID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yQ2hpbGQoZ3JvdXBJbmRleCwgY2hpbGRJbmRleCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIldyb25nIGZsYXQgcG9zaXRpb24gZm9yIGNoaWxkICIsCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkUG9zLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEV4cGFuZGFibGVMaXN0UG9zaXRpb24oZXhwZWN0ZWRGbGF0UG9zaXRpb24pKTsKLQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiV3JvbmcgZmxhdCBwb3NpdGlvbiBmb3IgY2hpbGQgIiwKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRGbGF0UG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RmxhdExpc3RQb3NpdGlvbihjaGlsZFBvcykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IE5PIGdyb3VwIGlzIGV4cGFuZGVkIHdoZW4gY2FsbGVkCi0gICAgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbk9uR3JvdXBzKCkgewotICAgICAgICBpbnQgaW5kZXggPSAwOwotCi0gICAgICAgIC8vIFNjcm9sbGluZyBvbiBoZWFkZXIgZWxlbWVudHMgc2hvdWxkIG5vdCBnaXZlIGEgdmFsaWQgc2VsZWN0ZWQgcG9zaXRpb24uCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEhlYWRlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSGVhZGVyIGl0ZW0gaXMgc2VsZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBzZWxlY3Rpb24gb24gZ3JvdXAgaXRlbXMKLSAgICAgICAgZmluYWwgaW50IGdyb3VwQ291bnQgPSBtQWRhcHRlci5nZXRHcm91cENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGdyb3VwSW5kZXggPSAwOyBncm91cEluZGV4IDwgZ3JvdXBDb3VudDsgZ3JvdXBJbmRleCsrKSB7Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR3JvdXAgaXRlbSBpcyBub3Qgc2VsZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JHcm91cChncm91cEluZGV4KSwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRTZWxlY3RlZFBvc2l0aW9uKCkpOwotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNjcm9sbGluZyBvbiBmb290ZXIgZWxlbWVudHMgc2hvdWxkIG5vdCBnaXZlIGEgdmFsaWQgc2VsZWN0ZWQgcG9zaXRpb24uCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZvb3RlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRm9vdGVyIGl0ZW0gaXMgc2VsZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgTk8gZ3JvdXAgaXMgZXhwYW5kZWQgd2hlbiBjYWxsZWQKLSAgICB2b2lkIHRlc3RTZWxlY3RlZFBvc2l0aW9uT25DaGlsZHJlbigpIHsKLSAgICAgICAgLy8gVGVzdCB3aXRoIGFuIGV4cGFuZGVkIGdyb3VwCi0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotICAgICAgICBmaW5hbCBpbnQgZ3JvdXBJbmRleCA9IGV4cGFuZEFHcm91cCgpOwotCi0gICAgICAgIGZpbmFsIGludCBjaGlsZHJlbkNvdW50ID0gbUFkYXB0ZXIuZ2V0Q2hpbGRyZW5Db3VudChncm91cEluZGV4KTsKLSAgICAgICAgZm9yIChpbnQgY2hpbGRJbmRleCA9IDA7IGNoaWxkSW5kZXggPCBjaGlsZHJlbkNvdW50OyBjaGlsZEluZGV4KyspIHsKLSAgICAgICAgICAgIGludCBjaGlsZEZsYXRQb3NpdGlvbiA9IGhlYWRlckNvdW50ICsgZ3JvdXBJbmRleCArIDEgKyBjaGlsZEluZGV4OwotICAgICAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGNoaWxkRmxhdFBvc2l0aW9uKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdyb3VwIGl0ZW0gaXMgbm90IHNlbGVjdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yQ2hpbGQoZ3JvdXBJbmRleCwgY2hpbGRJbmRleCksCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVycy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNTFjMWQuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRXhwYW5kYWJsZUxpc3RTY2VuYXJpbzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVycyBleHRlbmRzIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHNOdW1DaGlsZHJlbiA9IHsxLCA0LCAzLCAyLCA2fTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgc051bU9mSGVhZGVyc0FuZEZvb3RlcnMgPSAxMjsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KEV4cGFuZGFibGVQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIHBhcmFtcy5zZXRTdGFja0Zyb21Cb3R0b20oZmFsc2UpCi0gICAgICAgICAgICAgICAgLnNldFN0YXJ0aW5nU2VsZWN0aW9uUG9zaXRpb24oLTEpCi0gICAgICAgICAgICAgICAgLnNldE51bUNoaWxkcmVuKHNOdW1DaGlsZHJlbikKLSAgICAgICAgICAgICAgICAuc2V0SXRlbVNjcmVlblNpemVGYWN0b3IoMC4xNCkKLSAgICAgICAgICAgICAgICAuc2V0Q29ubmVjdEFkYXB0ZXIoZmFsc2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKLQotICAgICAgICBmaW5hbCBFeHBhbmRhYmxlTGlzdFZpZXcgZXhwYW5kYWJsZUxpc3RWaWV3ID0gZ2V0RXhwYW5kYWJsZUxpc3RWaWV3KCk7Ci0gICAgICAgIGV4cGFuZGFibGVMaXN0Vmlldy5zZXRJdGVtc0NhbkZvY3VzKHRydWUpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc051bU9mSGVhZGVyc0FuZEZvb3RlcnM7IGkrKykgewotICAgICAgICAgICAgQnV0dG9uIGhlYWRlciA9IG5ldyBCdXR0b24odGhpcyk7Ci0gICAgICAgICAgICBoZWFkZXIuc2V0VGV4dCgiSGVhZGVyIFZpZXcgIiArIGkpOwotICAgICAgICAgICAgZXhwYW5kYWJsZUxpc3RWaWV3LmFkZEhlYWRlclZpZXcoaGVhZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc051bU9mSGVhZGVyc0FuZEZvb3RlcnM7IGkrKykgewotICAgICAgICAgICAgQnV0dG9uIGZvb3RlciA9IG5ldyBCdXR0b24odGhpcyk7Ci0gICAgICAgICAgICBmb290ZXIuc2V0VGV4dCgiRm9vdGVyIFZpZXcgIiArIGkpOwotICAgICAgICAgICAgZXhwYW5kYWJsZUxpc3RWaWV3LmFkZEZvb3RlclZpZXcoZm9vdGVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gU2V0IGFkYXB0ZXIgaGVyZSBBRlRFUiB3ZSBzZXQgaGVhZGVyIGFuZCBmb290ZXIgdmlld3MKLSAgICAgICAgc2V0QWRhcHRlcihleHBhbmRhYmxlTGlzdFZpZXcpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgaGVhZGVycyAoYW5kIHRoZSBzYW1lIG51bWJlciBvZiBmb290ZXJzKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TnVtT2ZIZWFkZXJzQW5kRm9vdGVycygpIHsKLSAgICAgICAgcmV0dXJuIHNOdW1PZkhlYWRlcnNBbmRGb290ZXJzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzRjODUzLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5MaXN0VXRpbDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QgZXh0ZW5kcwotICAgICAgICBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxFeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzPiB7Ci0gICAgcHJpdmF0ZSBFeHBhbmRhYmxlTGlzdFZpZXcgbUV4cGFuZGFibGVMaXN0VmlldzsKLSAgICBwcml2YXRlIExpc3RVdGlsIG1MaXN0VXRpbDsKLSAgICAKLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEV4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnMuY2xhc3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIAotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3ID0gZ2V0QWN0aXZpdHkoKS5nZXRFeHBhbmRhYmxlTGlzdFZpZXcoKTsKLSAgICAgICAgbUxpc3RVdGlsID0gbmV3IExpc3RVdGlsKG1FeHBhbmRhYmxlTGlzdFZpZXcsIGdldEluc3RydW1lbnRhdGlvbigpKTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlY29uZGl0aW9ucygpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtRXhwYW5kYWJsZUxpc3RWaWV3KTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwYW5kT25GaXJzdFBvc2l0aW9uKCkgewotICAgICAgICAvLyBTaG91bGQgYmUgYSBoZWFkZXIsIGFuZCBoZW5jZSB0aGUgZmlyc3QgZ3JvdXAgc2hvdWxkIE5PVCBoYXZlIGV4cGFuZGVkCi0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbigwKTsKLSAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBhc3NlcnRGYWxzZShtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgfQotCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRPbkZpcnN0R3JvdXAoKSB7Ci0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihnZXRBY3Rpdml0eSgpLmdldE51bU9mSGVhZGVyc0FuZEZvb3RlcnMoKSk7Ci0gICAgICAgIHNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgfQotCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0TWVudXMoKSB7Ci0gICAgICAgIEV4cGFuZGFibGVMaXN0VGVzdGVyIHRlc3RlciA9IG5ldyBFeHBhbmRhYmxlTGlzdFRlc3RlcihtRXhwYW5kYWJsZUxpc3RWaWV3LCB0aGlzKTsKLSAgICAgICAgdGVzdGVyLnRlc3RDb250ZXh0TWVudXMoKTsKLSAgICB9Ci0KLSAgICBATGFyZ2VUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZCgpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZE9uR3JvdXBzKCk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25DaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBMYXJnZVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbigpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25Pbkdyb3VwcygpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25PbkNoaWxkcmVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9JbmZsYXRlZEV4cGFuZGFibGVMaXN0Vmlldy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9JbmZsYXRlZEV4cGFuZGFibGVMaXN0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGM5ZDU2Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvSW5mbGF0ZWRFeHBhbmRhYmxlTGlzdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5mcmFtZXdvcmtzLmNvcmV0ZXN0cy5SOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotcHVibGljIGNsYXNzIEluZmxhdGVkRXhwYW5kYWJsZUxpc3RWaWV3IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICAKLSAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuaW5mbGF0ZWRfZXhwYW5kYWJsZWxpc3R2aWV3KTsKLSAgICAgICAgCi0gICAgICAgIEV4cGFuZGFibGVMaXN0VmlldyBlbHYgPSAoRXhwYW5kYWJsZUxpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5lbHYpOwotICAgICAgICBlbHYuc2V0QWRhcHRlcihuZXcgTXlFeHBhbmRhYmxlTGlzdEFkYXB0ZXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIE15RXhwYW5kYWJsZUxpc3RBZGFwdGVyIGV4dGVuZHMgQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlciB7Ci0gICAgICAgIC8vIFNhbXBsZSBkYXRhIHNldC4gIGNoaWxkcmVuW2ldIGNvbnRhaW5zIHRoZSBjaGlsZHJlbiAoU3RyaW5nW10pIGZvciBncm91cHNbaV0uCi0gICAgICAgIHByaXZhdGUgU3RyaW5nW10gZ3JvdXBzID0geyAiUGVvcGxlIE5hbWVzIiwgIkRvZyBOYW1lcyIsICJDYXQgTmFtZXMiLCAiRmlzaCBOYW1lcyIgfTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXVtdIGNoaWxkcmVuID0gewotICAgICAgICAgICAgICAgIHsgIkFybm9sZCIsICJCYXJyeSIsICJDaHVjayIsICJEYXZpZCIgfSwKLSAgICAgICAgICAgICAgICB7ICJBY2UiLCAiQmFuZGl0IiwgIkNoYS1DaGEiLCAiRGV1Y2UiIH0sCi0gICAgICAgICAgICAgICAgeyAiRmx1ZmZ5IiwgIlNudWdnbGVzIiB9LAotICAgICAgICAgICAgICAgIHsgIkdvbGR5IiwgIkJ1YmJsZXMiIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5bZ3JvdXBQb3NpdGlvbl1bY2hpbGRQb3NpdGlvbl07Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRDaGlsZElkKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkUG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldENoaWxkcmVuQ291bnQoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbltncm91cFBvc2l0aW9uXS5sZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGV4dFZpZXcgZ2V0R2VuZXJpY1ZpZXcoKSB7Ci0gICAgICAgICAgICAvLyBMYXlvdXQgcGFyYW1ldGVycyBmb3IgdGhlIEV4cGFuZGFibGVMaXN0VmlldwotICAgICAgICAgICAgQWJzTGlzdFZpZXcuTGF5b3V0UGFyYW1zIGxwID0gbmV3IEFic0xpc3RWaWV3LkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIDY0KTsKLQotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSBuZXcgVGV4dFZpZXcoSW5mbGF0ZWRFeHBhbmRhYmxlTGlzdFZpZXcudGhpcyk7Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRMYXlvdXRQYXJhbXMobHApOwotICAgICAgICAgICAgLy8gQ2VudGVyIHRoZSB0ZXh0IHZlcnRpY2FsbHkKLSAgICAgICAgICAgIHRleHRWaWV3LnNldEdyYXZpdHkoR3Jhdml0eS5DRU5URVJfVkVSVElDQUwgfCBHcmF2aXR5LkxFRlQpOwotICAgICAgICAgICAgLy8gU2V0IHRoZSB0ZXh0IHN0YXJ0aW5nIHBvc2l0aW9uCi0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRQYWRkaW5nKDM2LCAwLCAwLCAwKTsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0VmlldzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFZpZXcgZ2V0Q2hpbGRWaWV3KGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbiwgYm9vbGVhbiBpc0xhc3RDaGlsZCwKLSAgICAgICAgICAgICAgICBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IGdldEdlbmVyaWNWaWV3KCk7Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KGdldENoaWxkKGdyb3VwUG9zaXRpb24sIGNoaWxkUG9zaXRpb24pLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRleHRWaWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRHcm91cChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdyb3Vwc1tncm91cFBvc2l0aW9uXTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0R3JvdXBDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBncm91cHMubGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0R3JvdXBJZChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdyb3VwUG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVmlldyBnZXRHcm91cFZpZXcoaW50IGdyb3VwUG9zaXRpb24sIGJvb2xlYW4gaXNFeHBhbmRlZCwgVmlldyBjb252ZXJ0VmlldywKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IGdldEdlbmVyaWNWaWV3KCk7Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KGdldEdyb3VwKGdyb3VwUG9zaXRpb24pLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRleHRWaWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDaGlsZFNlbGVjdGFibGUoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L1Bvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9Qb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiZGZmOC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L1Bvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuQWRhcHRlckNvbnRleHRNZW51SW5mbzsKLQotcHVibGljIGNsYXNzIFBvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIGludCBncm91cFBvc2l0aW9uLCBjaGlsZFBvc2l0aW9uOwotCi0gICAgLy8gRmFrZSBjb25zdGFudCB0byBzdG9yZSBpbiB0ZXN0VHlwZSBhIHRlc3QgdHlwZSBzcGVjaWZpYyB0byBoZWFkZXJzIGFuZCBmb290ZXJzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFEQVBURVJfVFlQRSA9IC0xOwotICAgIHByaXZhdGUgaW50IHRlc3RUeXBlOyAvLyBhcyByZXR1cm5lZCBieSBnZXRQYWNrZWRQb3NpdGlvblR5cGUKLQotICAgIC8vIFdpbGwgYmUgc2V0IHRvIG51bGwgYnkgZWFjaCBjYWxsIHRvIG9uQ3JlYXRlQ29udGV4dE1lbnUsIHVubGVzcyBhbiBlcnJvciBvY2N1cnJlZC4gCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlOwotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0R3JvdXBDb250ZXh0TWVudShpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICB0aGlzLmdyb3VwUG9zaXRpb24gPSBncm91cFBvc2l0aW9uOwotICAgICAgICB0ZXN0VHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9HUk9VUDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RDaGlsZENvbnRleHRNZW51KGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICB0aGlzLmdyb3VwUG9zaXRpb24gPSBncm91cFBvc2l0aW9uOwotICAgICAgICB0aGlzLmNoaWxkUG9zaXRpb24gPSBjaGlsZFBvc2l0aW9uOwotICAgICAgICB0ZXN0VHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9DSElMRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RBZGFwdGVyQ29udGV4dE1lbnUoaW50IGZsYXRQb3NpdGlvbikgewotICAgICAgICB0aGlzLmdyb3VwUG9zaXRpb24gPSBmbGF0UG9zaXRpb247Ci0gICAgICAgIHRlc3RUeXBlID0gQURBUFRFUl9UWVBFOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUgbWVudSwgVmlldyB2LCBDb250ZXh0TWVudUluZm8gbWVudUluZm8pIHsKLSAgICAgICAgZXJyb3JNZXNzYWdlID0gbnVsbDsKLSAgICAgICAgaWYgKHRlc3RUeXBlID09IEFEQVBURVJfVFlQRSkgewotICAgICAgICAgICAgaWYgKCFpc1RydWUoIk1lbnVJbmZvIGlzIG5vdCBhbiBBZGFwdGVyQ29udGV4dE1lbnVJbmZvIiwKLSAgICAgICAgICAgICAgICAgICAgbWVudUluZm8gaW5zdGFuY2VvZiBBZGFwdGVyQ29udGV4dE1lbnVJbmZvKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFkYXB0ZXJDb250ZXh0TWVudUluZm8gYWRhcHRlckNvbnRleHRNZW51SW5mbyA9IChBZGFwdGVyQ29udGV4dE1lbnVJbmZvKSBtZW51SW5mbzsKLSAgICAgICAgICAgIGlmICghYXJlRXF1YWwoIldyb25nIGZsYXQgcG9zaXRpb24iLCBncm91cFBvc2l0aW9uLCBhZGFwdGVyQ29udGV4dE1lbnVJbmZvLnBvc2l0aW9uKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghaXNUcnVlKCJNZW51SW5mbyBpcyBub3QgYW4gRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8iLAotICAgICAgICAgICAgICAgICAgICBtZW51SW5mbyBpbnN0YW5jZW9mIEV4cGFuZGFibGVMaXN0Vmlldy5FeHBhbmRhYmxlTGlzdENvbnRleHRNZW51SW5mbykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8gZWx2TWVudUluZm8gPQotICAgICAgICAgICAgICAgIChFeHBhbmRhYmxlTGlzdFZpZXcuRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8pIG1lbnVJbmZvOwotICAgICAgICAgICAgbG9uZyBwYWNrZWRQb3NpdGlvbiA9IGVsdk1lbnVJbmZvLnBhY2tlZFBvc2l0aW9uOwotCi0gICAgICAgICAgICBpbnQgcGFja2VkUG9zaXRpb25UeXBlID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uVHlwZShwYWNrZWRQb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAoIWFyZUVxdWFsKCJXcm9uZyBwYWNrZWQgcG9zaXRpb24gdHlwZSIsIHRlc3RUeXBlLCBwYWNrZWRQb3NpdGlvblR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcGFja2VkUG9zaXRpb25Hcm91cCA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkdyb3VwKHBhY2tlZFBvc2l0aW9uKTsKLSAgICAgICAgICAgIGlmICghYXJlRXF1YWwoIldyb25nIGdyb3VwIHBvc2l0aW9uIiwgZ3JvdXBQb3NpdGlvbiwgcGFja2VkUG9zaXRpb25Hcm91cCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0ZXN0VHlwZSA9PSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfQ0hJTEQpIHsKLSAgICAgICAgICAgICAgICBpbnQgcGFja2VkUG9zaXRpb25DaGlsZCA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkNoaWxkKHBhY2tlZFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoIWFyZUVxdWFsKCJXcm9uZyBjaGlsZCBwb3NpdGlvbiIsIGNoaWxkUG9zaXRpb24sIHBhY2tlZFBvc2l0aW9uQ2hpbGQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gYXJlRXF1YWwoU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZCwgaW50IGFjdHVhbCkgewotICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gYWN0dWFsKSB7Ci0gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KG1lc3NhZ2UgKyAiICglZCB2cyAlZCIsIGV4cGVjdGVkLCBhY3R1YWwpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1RydWUoU3RyaW5nIG1lc3NhZ2UsIGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgaWYgKCF2YWx1ZSkgewotICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5qYXZhIGIvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuamF2YQppbmRleCBiMjI1YzM3Li4zODE5MWIwIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5qYXZhCisrKyBiL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLmphdmEKQEAgLTEzMCw3ICsxMzAsMTEgQEAKICAgICAgICAgUmVtb3RlQW5kcm9pZFRlc3RSdW5uZXIgdGVzdFJ1bm5lciA9IG5ldyBSZW1vdGVBbmRyb2lkVGVzdFJ1bm5lcigKICAgICAgICAgICAgICAgICBwa2dOYW1lLCBtRGV2aWNlKTsKICAgICAgICAgQ29sbGVjdGluZ1Rlc3RSdW5MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBDb2xsZWN0aW5nVGVzdFJ1bkxpc3RlbmVyKCk7Ci0gICAgICAgIHRlc3RSdW5uZXIucnVuKGxpc3RlbmVyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRlc3RSdW5uZXIucnVuKGxpc3RlbmVyKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiZW5jb3VudGVyZWQgSU9FeGNlcHRpb24gIiArIGlvZSk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGxpc3RlbmVyOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZGF0YS9ldGMvcGxhdGZvcm0ueG1sIGIvZGF0YS9ldGMvcGxhdGZvcm0ueG1sCmluZGV4IDczMjJlNmMuLjBlNWRmOGMgMTAwNjQ0Ci0tLSBhL2RhdGEvZXRjL3BsYXRmb3JtLnhtbAorKysgYi9kYXRhL2V0Yy9wbGF0Zm9ybS54bWwKQEAgLTU4LDYgKzU4LDEwIEBACiAgICAgICAgIDxncm91cCBnaWQ9InNkY2FyZF9ydyIgLz4KICAgICA8L3Blcm1pc3Npb24+CiAKKyAgICA8cGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX1VTQiIgPgorICAgICAgICA8Z3JvdXAgZ2lkPSJ1c2IiIC8+CisgICAgPC9wZXJtaXNzaW9uPgorCiAgICAgPCEtLSBUaGUgZ3JvdXAgdGhhdCAvY2FjaGUgYmVsb25ncyB0bywgbGlua2VkIHRvIHRoZSBwZXJtaXNzaW9uCiAgICAgICAgICBzZXQgb24gdGhlIGFwcGxpY2F0aW9ucyB0aGF0IGNhbiBhY2Nlc3MgL2NhY2hlIC0tPgogICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfQ0FDSEVfRklMRVNZU1RFTSIgPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy9pbmRleC5qZCBiL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvaW5kZXguamQKaW5kZXggZWE2MWNjMy4uMjE2NDcwNSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy9pbmRleC5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL2luZGV4LmpkCkBAIC0xLDYgKzEsNSBAQAogcGFnZS50aXRsZT1UZXN0aW5nIE92ZXJ2aWV3CiBAamQ6Ym9keQotCiA8cD4KICAgICBBbmRyb2lkIGluY2x1ZGVzIHBvd2VyZnVsIHRvb2xzIGZvciBzZXR0aW5nIHVwIGFuZCBydW5uaW5nIHRlc3QgYXBwbGljYXRpb25zLgogICAgIFdoZXRoZXIgeW91IGFyZSB3b3JraW5nIGluIEVjbGlwc2Ugd2l0aCBBRFQgb3Igd29ya2luZyBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHRoZXNlIHRvb2xzCkBAIC05LDcgKzgsNyBAQAogPC9wPgogPHA+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+CisgICAgWW91IGNhbiB1c2UgdGhlIGVtdWxhdG9yIHRvIHRlc3QgbmV0d29yayBhY2Nlc3MgYW5kIGJhbmR3aWR0aC4gVG8gbGVhcm4gbW9yZSwgcGxlYXNlIHNlZQorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2VtdWxhdG9yLmh0bWwjbmV0c3BlZWQiPk5ldHdvcmsgU3BlZWQgRW11bGF0aW9uPC9hPi4KKyAgICBUbyB0ZXN0IEdQUywgeW91IGNhbiB1c2UgdGhlIGVtdWxhdG9yIGNvbnNvbGUgYW5kIHtAbGluayBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlcn0uIFRvCisgICAgbGVhcm4gbW9yZSBhYm91dCB0aGUgZW11bGF0b3IgY29uc29sZSwgcGxlYXNlIHNlZQorICAgIDxhIGhyZWY9IntAZG9jUm9vdH0vZ3VpZGUvZGV2ZWxvcGluZy90b29scy9lbXVsYXRvci5odG1sI2NvbnNvbGUiPgorICAgIFVzaW5nIHRoZSBFbXVsYXRvciBDb25zb2xlPC9hPi4KKzwvcD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9pbWFnZXMvdGVzdGluZy9hbmRyb2lkX3Rlc3RfZnJhbWV3b3JrLnBuZyBiL2RvY3MvaHRtbC9pbWFnZXMvdGVzdGluZy9hbmRyb2lkX3Rlc3RfZnJhbWV3b3JrLnBuZwppbmRleCA2ZjgwNTMwLi40NTk5NzVjIDEwMDc1NQotLS0gYS9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvYW5kcm9pZF90ZXN0X2ZyYW1ld29yay5wbmcKKysrIGIvZG9jcy9odG1sL2ltYWdlcy90ZXN0aW5nL2FuZHJvaWRfdGVzdF9mcmFtZXdvcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9pbWFnZXMvdGVzdGluZy90ZXN0X2ZyYW1ld29yay5wbmcgYi9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvdGVzdF9mcmFtZXdvcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzVmYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvdGVzdF9mcmFtZXdvcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvYnJvd3Nlci5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYnJvd3Nlci5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTA4NzY5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9icm93c2VyLmpkCkBAIC0wLDAgKzEsNDkgQEAKK3BhZ2UudGl0bGU9VGVjaG5pY2FsIFJlc291cmNlcworQGpkOmJvZHkKKworPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAge0BsaXRlcmFsIEBpbXBvcnR9ICJ7QGRvY1Jvb3R9YXNzZXRzL2FuZHJvaWQtZGV2ZWxvcGVyLXJlc291cmNlLWJyb3dzZXIuY3NzIjsKKzwvc3R5bGU+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IntAZG9jUm9vdH1hc3NldHMvYW5kcm9pZC1kZXZlbG9wZXItcmVzb3VyY2UtYnJvd3Nlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL21pY3JvdGVtcGxhdGUuanMiPjwvc2NyaXB0PgorCis8ZGl2PgorICA8cCBzdHlsZT0iZGlzcGxheTogbm9uZTsgZmxvYXQ6IHJpZ2h0Ij5GaWx0ZXI6IDxpbnB1dCBpZD0icmVzb3VyY2UtYnJvd3Nlci1rZXl3b3JkLWZpbHRlciIvPjwvcD4KKyAgPHAgaWQ9InJlc291cmNlLWJyb3dzZXItc2VhcmNoLXBhcmFtcyI+U2hvd2luZyBhbGwgdGVjaG5pY2FsIHJlc291cmNlczo8L3A+Cis8L2Rpdj4KKworPG5vc2NyaXB0PgorICA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5FcnJvcjo8L3N0cm9uZz4KKyAgICBZb3UgbXVzdCBoYXZlIEphdmFTY3JpcHQgZW5hYmxlZCB0byB2aWV3IHRoaXMgcGFnZS4gUmVzb3VyY2VzIGFyZSBhbHNvCisgICAgYXZhaWxhYmxlIG9mZmxpbmUgaW4gdGhlIFNESy4KKyAgPC9wPgorPC9ub3NjcmlwdD4KKworPGRpdiBpZD0icmVzb3VyY2UtYnJvd3Nlci1yZXN1bHRzIj4KKyAgPGRpdiBjbGFzcz0ibm8tcmVzdWx0cyI+Tm8gcmVzdWx0cy48L2Rpdj4KKzwvZGl2PgorCis8c2NyaXB0IHR5cGU9InRleHQvaHRtbCIgaWQ9InRtcGxfcmVzb3VyY2VfYnJvd3Nlcl9yZXN1bHQiPgorPGRpdiBjbGFzcz0icmVzdWx0Ij4KKyAgPGgzPgorICAgIDwlIGlmICgnZXh0ZXJuYWwnIGluIHRhZ3NIYXNoKSB7ICU+PHN0cm9uZz5FeHRlcm5hbDogPC9zdHJvbmc+IDwlIH0gJT4KKyAgICA8YSBocmVmPSI8JT0gcGF0aCAlPiI+PCU9IHRpdGxlLmVuICU+PC9hPgorICAgIDwlIGlmICgnbmV3JyBpbiB0YWdzSGFzaCkgeyAlPjxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+IDwlIH0gJT4KKyAgPC9oMz4KKyAgPHAgY2xhc3M9InJlc291cmNlLW1ldGEiPjwlCisgICAgdmFyIF9fZyA9IFsnJywgJyddOworICAgIGlmICgnYXJ0aWNsZScgaW4gdGFnc0hhc2gpIHsKKyAgICAgIF9fZyA9IFsnQXJ0aWNsZScsICdhYm91dCddOworICAgIH0gZWxzZSBpZiAoJ3R1dG9yaWFsJyBpbiB0YWdzSGFzaCkgeworICAgICAgX19nID0gWydUdXRvcmlhbCcsICdvbiddOworICAgIH0gZWxzZSBpZiAoJ3NhbXBsZScgaW4gdGFnc0hhc2gpIHsKKyAgICAgIF9fZyA9IFsnU2FtcGxlJywgJ2ZvciddOworICAgIH0gZWxzZSBpZiAoJ3ZpZGVvJyBpbiB0YWdzSGFzaCkgeworICAgICAgX19nID0gWydWaWRlbycsICdhYm91dCddOworICAgIH0KKyAgJT4KKyAgPCU9IF9fZ1swXSAlPjwlIGlmICh0b3BpY3NIdG1sKSB7ICU+IDwlPSBfX2dbMV0gJT48JSB9ICU+IDwlPSB0b3BpY3NIdG1sICU+PC9wPgorICA8cD48JT0gZGVzY3JpcHRpb24uZW4gJT48L3A+Cis8L2Rpdj4KKzwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9pbmRleC5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvaW5kZXguamQKaW5kZXggMTY2ODcyMS4uOTA1NTg2OCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Jlc291cmNlcy9pbmRleC5qZAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2luZGV4LmpkCkBAIC0xLDM4ICsxLDkwIEBACiBwYWdlLnRpdGxlPURldmVsb3BlciBSZXNvdXJjZXMKIEBqZDpib2R5CiAKKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICNyZXNvdXJjZS1saXN0LXRhYmxlIHRkIHsKKyAgICBib3JkZXI6IDA7CisgICAgcGFkZGluZzogMCAyNHB4OworICAgIHdpZHRoOiAzMyU7CisgICAgbWF4LXdpZHRoOiAyNTBweDsKKyAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkOworICB9CisKKyAgI3Jlc291cmNlLWxpc3QtdGFibGUgdGQubGFzdCB7CisgICAgYm9yZGVyLXJpZ2h0OiAwOworICAgIHBhZGRpbmctcmlnaHQ6IDA7CisgIH0KKzwvc3R5bGU+CisKIDxwPgotVGhpcyBzZWN0aW9uIHByb3ZpZGVzIHRlY2huaWNhbCBhcnRpY2xlcywgdHV0b3JpYWxzLCBzYW1wbGUgY29kZSwgYW5kIG90aGVyCitUaGlzIHNlY3Rpb24gcHJvdmlkZXMgYXJ0aWNsZXMsIHR1dG9yaWFscywgc2FtcGxlIGNvZGUsIGFuZCBvdGhlcgogaW5mb3JtYXRpb24gdG8gaGVscCB5b3UgcXVpY2tseSBpbXBsZW1lbnQgdGhlIGZlYXR1cmVzIHlvdSB3YW50IGluIHlvdXIKLWFwcGxpY2F0aW9uLgorYXBwbGljYXRpb24uIFRvIHJldHVybiB0byB0aGlzIHBhZ2UgbGF0ZXIsIGp1c3QgY2xpY2sgdGhlICJSZXNvdXJjZXMiCit0YWIgd2hpbGUgYW55IFJlc291cmNlcyBwYWdlIGlzIGxvYWRlZC4KIDwvcD4KIAorPGgyPlRlY2huaWNhbCBSZXNvdXJjZXM8L2gyPgorCis8dGFibGUgaWQ9InJlc291cmNlLWxpc3QtdGFibGUiPgorPHRyPgorICA8dGQ+CisgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXNhbXBsZSI+CisgICAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLXNhbXBsZS5wbmciLz4KKyAgICA8L2E+CisgICAgPGgzPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1zYW1wbGUiPgorICAgICAgU2FtcGxlIENvZGUKKyAgICA8L2E+PC9oMz4KKyAgICA8cD5GdWxseS1mdW5jdGlvbmluZyBzYW1wbGUgYXBwbGljYXRpb25zIHRoYXQgeW91IGNhbiBidWlsZCBhbmQgcnVuCisgICAgdG8gbGVhcm4gYWJvdXQgaG93IEFuZHJvaWQgd29ya3MuIEZlZWwgZnJlZSB0byByZXVzZSBhbnkgb2YgdGhlIGNvZGUgb3IKKyAgICB0ZWNobmlxdWVzIGluIHRoZSBzYW1wbGVzLjwvcD4KKyAgPC90ZD4KKyAgPHRkPgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1hcnRpY2xlIj4KKyAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctYXJ0aWNsZS5wbmciLz4KKyAgICA8L2E+CisgICAgPGgzPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1hcnRpY2xlIj4KKyAgICAgIEFydGljbGVzCisgICAgPC9hPjwvaDM+CisgICAgPHA+Rm9jdXNlZCBkaXNjdXNzaW9ucyBhYm91dCBBbmRyb2lkIGRldmVsb3BtZW50IHN1YmplY3RzLCBpbmNsdWRpbmcKKyAgICBvcHRpbWl6YXRpb25zLCB0aXBzLCBpbnRlcmVzdGluZyBpbXBsZW1lbnRhdGlvbnMsICJob3ctdG9zIiwKKyAgICBhbmQgc28gb24uPC9wPgorICA8L3RkPgorICA8dGQ+CisgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXR1dG9yaWFsIj4KKyAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctdHV0b3JpYWwucG5nIi8+CisgICAgPC9hPgorICAgIDxoMz48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9dHV0b3JpYWwiPgorICAgICAgVHV0b3JpYWxzCisgICAgPC9hPjwvaDM+CisgICAgPHA+U3RlcC1ieS1zdGVwIGluc3RydWN0aW9ucyBkZW1vbnN0cmF0aW5nIGhvdyB0byBidWlsZCBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uCisgICAgdGhhdCBoYXMgdGhlIHNwZWNpZmljIGZlYXR1cmVzIHlvdSB3YW50LjwvcD4KKyAgPC90ZD4KKyAgPCEtLSA8dGQgY2xhc3M9Imxhc3QiPgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz12aWRlbyI+CisgICAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLXZpZGVvLnBuZyIvPgorICAgIDwvYT4KKyAgICA8aDM+PGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXZpZGVvIj4KKyAgICAgIFZpZGVvcyAmYW1wOyBTY3JlZW5jYXN0cworICAgIDwvYT48L2gzPgorICAgIDxwPlZpZGVvcyBhbmQgcHJlc2VudGF0aW9uIHNsaWRlcyBmcm9tIGRldmVsb3BlciBldmVudHMsIGFsb25nIHdpdGgKKyAgICBzY3JlZW5jYXN0cyB0byB3YWxrIHlvdSB0aHJvdWdoIGNvbW1vbiBBbmRyb2lkIGRldmVsb3BtZW50CisgICAgd29ya2Zsb3dzLjwvcD4KKyAgPC90ZD4gLS0+Cis8L3RyPgorPC90YWJsZT4KKworPGgyPk90aGVyIFJlc291cmNlczwvaDI+CisKIDxkbD4KLTxkdD48Yj5UZWNobmljYWwgQXJ0aWNsZXM8L2I+PC9kdD4KLTxkZD5Gb2N1c2VkIGRpc2N1c3Npb25zIGFib3V0IEFuZHJvaWQgZGV2ZWxvcG1lbnQgc3ViamVjdHMsIGluY2x1ZGluZwotb3B0aW1pemF0aW9ucywgdGlwcywgaW50ZXJlc3RpbmcgaW1wbGVtZW50YXRpb25zLAotYW5kIHNvIG9uLiBNb3N0IG9mIHRoZSBhcnRpY2xlcyBwcm92aWRlICJob3ctdG8iIGluc3RydWN0aW9ucyBmb3IgYWRkaW5nCi1mZWF0dXJlcyBvciBmdW5jdGlvbmFsaXR5IHRvIHlvdXIgYXBwLiBUaGUgYXJ0aWNsZXMgYXJlIGRyYXduIGZyb20gcG9zdHMgdG8gdGhlCi1BbmRyb2lkIERldmVsb3BlcnMgQmxvZy4KLTwvZGQ+Ci0KLTxkdD48Yj5UdXRvcmlhbHM8L2I+PC9kdD4KLTxkZD5TdGVwLWJ5LXN0ZXAgaW5zdHJ1Y3Rpb25zIGRlbW9uc3RyYXRpbmcgaG93IHRvIGJ1aWxkIGFuIEFuZHJvaWQgYXBwbGljYXRpb24KLXRoYXQgaGFzIHRoZSBzcGVjaWZpYyBmZWF0dXJlcyB5b3Ugd2FudC4gPC9kZD4KLQotPGR0PjxiPlNhbXBsZSBDb2RlPC9iPjwvZHQ+Ci08ZGQ+RnVsbHktZnVuY3Rpb25pbmcgc2FtcGxlIGFwcGxpY2F0aW9ucyB0aGF0IHlvdSBjYW4gbG9vayBhdCBvciBidWlsZCBhbmQgcnVuLAotdG8gbGVhcm4gYWJvdXQgaG93IEFuZHJvaWQgd29ya3MuIEZlZWwgZnJlZSB0byByZXVzZSBhbnkgb2YgdGhlIGNvZGUgb3IKLXRlY2huaXF1ZXMgdGhhdCB5b3UgZmluZCBpbiB0aGUgc2FtcGxlcyE8L2RkPgotCiA8ZHQ+PGI+Q29tbXVuaXR5PC9iPjwvZHQ+CiA8ZGQ+TGlua3MgdG8gdGhlIEFuZHJvaWQgZGlzY3Vzc2lvbiBncm91cHMgYW5kIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIHdheXMgdG8KIGNvbGxhYm9yYXRlIHdpdGggb3RoZXIgZGV2ZWxvcGVycy4gPC9kZD4KIAorPGR0PjxiPkRldmljZSBEYXNoYm9hcmQ8L2I+PC9kdD4KKzxkZD5EZXZpY2UgZGlzdHJpYnV0aW9uIGRhdGEsIGdyb3VwZWQgYnkgdmFyaW91cyBkaW1lbnNpb25zIHN1Y2ggYXMgc2NyZWVuIHNpemUKK2FuZCBBbmRyb2lkIHBsYXRmb3JtIHZlcnNpb24uIDwvZGQ+CisKIDxkdD48Yj5Nb3JlPC9iPjwvZHQ+CiA8ZGQ+UXVpY2sgZGV2ZWxvcG1lbnQgdGlwcywgdHJvdWJsZXNob290aW5nIGluZm9ybWF0aW9uLCBhbmQgZnJlcXVlbnRseSBhc2tlZAogcXVlc3Rpb25zIChGQVFzKS4gPC9kZD4KIDwvZGw+Ci0KLTxwPlRvIHJldHVybiB0byB0aGlzIHBhZ2UgbGF0ZXIsIGp1c3QgY2xpY2sgdGhlICJSZXNvdXJjZXMiIHRhYiB3aGlsZSBhbnkKLVJlc291cmNlcyBwYWdlIGlzIGxvYWRlZC4gPC9wPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzLWRhdGEuanMgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlcy1kYXRhLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNmI2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlcy1kYXRhLmpzCkBAIC0wLDAgKzEsNjMyIEBACit2YXIgQU5EUk9JRF9UQUdTID0geworICB0eXBlOiB7CisgICAgJ2FydGljbGUnOiAnQXJ0aWNsZScsCisgICAgJ3R1dG9yaWFsJzogJ1R1dG9yaWFsJywKKyAgICAnc2FtcGxlJzogJ1NhbXBsZScsCisgICAgJ3ZpZGVvJzogJ1ZpZGVvJywKKyAgICAnbGlicmFyeSc6ICdDb2RlIExpYnJhcnknCisgIH0sCisgIHRvcGljOiB7CisgICAgJ2FjY2Vzc2liaWxpdHknOiAnQWNjZXNzaWJpbGl0eScsCisgICAgJ2FjY291bnRzeW5jJzogJ0FjY291bnRzICZhbXA7IFN5bmMnLAorICAgICdiZXN0cHJhY3RpY2UnOiAnQmVzdCBQcmFjdGljZXMnLAorICAgICdjb21tdW5pY2F0aW9uJzogJ0NvbW11bmljYXRpb24nLAorICAgICdjb21wYXRpYmlsaXR5JzogJ0NvbXBhdGliaWxpdHknLAorICAgICdkYXRhJzogJ0RhdGEgQWNjZXNzJywKKyAgICAnZHJhd2luZyc6ICdDYW52YXMgRHJhd2luZycsCisgICAgJ2dhbWVkZXYnOiAnR2FtZSBEZXZlbG9wbWVudCcsCisgICAgJ2dsJzogJ09wZW5HTCBFUycsCisgICAgJ2lucHV0JzogJ0lucHV0IE1ldGhvZHMnLAorICAgICdpbnRlbnQnOiAnSW50ZW50cycsCisgICAgJ2xheW91dCc6ICdMYXlvdXRzL1ZpZXdzJywKKyAgICAnbWVkaWEnOiAnTXVsdGltZWRpYScsCisgICAgJ25ld2ZlYXR1cmUnOiAnTmV3IEZlYXR1cmVzJywKKyAgICAncGVyZm9ybWFuY2UnOiAnUGVyZm9ybWFuY2UnLAorICAgICdzZWFyY2gnOiAnU2VhcmNoJywKKyAgICAndGVzdGluZyc6ICdUZXN0aW5nJywKKyAgICAndWknOiAnVXNlciBJbnRlcmZhY2UnLAorICAgICd3ZWInOiAnV2ViIENvbnRlbnQnCisgIH0sCisgIG1pc2M6IHsKKyAgICAnZXh0ZXJuYWwnOiAnRXh0ZXJuYWwnLAorICAgICduZXcnOiAnTmV3JworICB9Cit9OworCit2YXIgQU5EUk9JRF9SRVNPVVJDRVMgPSBbCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8gVEVDSE5JQ0FMIEFSVElDTEVTIC8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9hdm9pZGluZy1tZW1vcnktbGVha3MuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQXZvaWRpbmcgTWVtb3J5IExlYWtzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTW9iaWxlIGRldmljZXMgb2Z0ZW4gaGF2ZSBsaW1pdGVkIG1lbW9yeSwgYW5kIG1lbW9yeSBsZWFrcyBjYW4gY2F1c2UgeW91ciBhcHBsaWNhdGlvbiB0byB3YXN0ZSB0aGlzIHZhbHVhYmxlIHJlc291cmNlIHdpdGhvdXQgeW91ciBrbm93bGVkZ2UuIFRoaXMgYXJ0aWNsZSBwcm92aWRlcyB0aXBzIHRvIGhlbHAgeW91IGF2b2lkIGNvbW1vbiBjYXVzZXMgb2YgbWVtb3J5IGxlYWtzIG9uIHRoZSBBbmRyb2lkIHBsYXRmb3JtLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnY29tcGF0aWJpbGl0eSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9iYWNrd2FyZC1jb21wYXRpYmlsaXR5Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0JhY2t3YXJkIENvbXBhdGliaWxpdHknCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGUgQW5kcm9pZCBwbGF0Zm9ybSBzdHJpdmVzIHRvIGVuc3VyZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSG93ZXZlciwgc29tZXRpbWVzIHlvdSB3YW50IHRvIHVzZSBuZXcgZmVhdHVyZXMgd2hpY2ggYXJlblwndCBzdXBwb3J0ZWQgb24gb2xkZXIgcGxhdGZvcm1zLiBUaGlzIGFydGljbGUgZGlzY3Vzc2VzIHN0cmF0ZWdpZXMgZm9yIHNlbGVjdGl2ZWx5IHVzaW5nIHRoZXNlIGZlYXR1cmVzIGJhc2VkIG9uIGF2YWlsYWJpbGl0eSwgYWxsb3dpbmcgeW91IHRvIGtlZXAgeW91ciBhcHBsaWNhdGlvbnMgcG9ydGFibGUgYWNyb3NzIGEgd2lkZSByYW5nZSBvZiBkZXZpY2VzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnaW50ZW50J10sCisgICAgcGF0aDogJ2FydGljbGVzL2Nhbi1pLXVzZS10aGlzLWludGVudC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdDYW4gSSBVc2UgdGhpcyBJbnRlbnQ/JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW5kcm9pZCBvZmZlcnMgYSB2ZXJ5IHBvd2VyZnVsIGFuZCB5ZXQgZWFzeS10by11c2UgbWVzc2FnZSB0eXBlIGNhbGxlZCBhbiBpbnRlbnQuIFlvdSBjYW4gdXNlIGludGVudHMgdG8gdHVybiBhcHBsaWNhdGlvbnMgaW50byBoaWdoLWxldmVsIGxpYnJhcmllcyBhbmQgbWFrZSBjb2RlIG1vZHVsYXIgYW5kIHJldXNhYmxlLiBXaGlsZSBpdCBpcyBuaWNlIHRvIGJlIGFibGUgdG8gbWFrZSB1c2Ugb2YgYSBsb29zZWx5IGNvdXBsZWQgQVBJLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgaW50ZW50IHlvdSBzZW5kIHdpbGwgYmUgcmVjZWl2ZWQgYnkgYW5vdGhlciBhcHBsaWNhdGlvbi4gVGhpcyBhcnRpY2xlIGRlc2NyaWJlcyBhIHRlY2huaXF1ZSB5b3UgY2FuIHVzZSB0byBmaW5kIG91dCB3aGV0aGVyIHRoZSBzeXN0ZW0gY29udGFpbnMgYW55IGFwcGxpY2F0aW9uIGNhcGFibGUgb2YgcmVzcG9uZGluZyB0byB0aGUgaW50ZW50IHlvdSB3YW50IHRvIHVzZS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2lucHV0J10sCisgICAgcGF0aDogJ2FydGljbGVzL2NyZWF0aW5nLWlucHV0LW1ldGhvZC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdDcmVhdGluZyBhbiBJbnB1dCBNZXRob2QnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdJbnB1dCBNZXRob2QgRWRpdG9ycyAoSU1FcykgcHJvdmlkZSB0aGUgbWVjaGFuaXNtIGZvciBlbnRlcmluZyB0ZXh0IGludG8gdGV4dCBmaWVsZHMgYW5kIG90aGVyIFZpZXdzLiBBbmRyb2lkIGRldmljZXMgY29tZSBidW5kbGVkIHdpdGggYXQgbGVhc3Qgb25lIElNRSwgYnV0IHVzZXJzIGNhbiBpbnN0YWxsIGFkZGl0aW9uYWwgSU1Fcy4gVGhpcyBhcnRpY2xlIGNvdmVycyB0aGUgYmFzaWNzIG9mIGRldmVsb3BpbmcgYW4gSU1FIGZvciB0aGUgQW5kcm9pZCBwbGF0Zm9ybS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2RyYXdpbmcnLCAndWknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvZHJhd2FibGUtbXV0YXRpb25zLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0RyYXdhYmxlIE11dGF0aW9ucycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0RyYXdhYmxlcyBhcmUgcGx1Z2dhYmxlIGRyYXdpbmcgY29udGFpbmVycyB0aGF0IGFsbG93IGFwcGxpY2F0aW9ucyB0byBkaXNwbGF5IGdyYXBoaWNzLiBUaGlzIGFydGljbGUgZXhwbGFpbnMgc29tZSBjb21tb24gcGl0ZmFsbHMgd2hlbiB0cnlpbmcgdG8gbW9kaWZ5IHRoZSBwcm9wZXJ0aWVzIG9mIG11bHRpcGxlIERyYXdhYmxlcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2Jlc3RwcmFjdGljZScsICd1aSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9mYXN0ZXItc2NyZWVuLW9yaWVudGF0aW9uLWNoYW5nZS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdGYXN0ZXIgU2NyZWVuIE9yaWVudGF0aW9uIENoYW5nZScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1doZW4gYW4gQW5kcm9pZCBkZXZpY2UgY2hhbmdlcyBpdHMgb3JpZW50YXRpb24sIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGF1dG9tYXRpY2FsbHkgcmVzdGFydCB0aGUgY3VycmVudCBhY3Rpdml0eSB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24uIEhvd2V2ZXIsIHRoaXMgY2FuIGJlY29tZSBhIGJvdHRsZW5lY2sgaW4gYXBwbGljYXRpb25zIHRoYXQgYWNjZXNzIGEgbGFyZ2UgYW1vdW50IG9mIGV4dGVybmFsIGRhdGEuIFRoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgaG93IHRvIGdyYWNlZnVsbHkgaGFuZGxlIHRoaXMgc2l0dWF0aW9uIHdpdGhvdXQgcmVzb3J0aW5nIHRvIG1hbnVhbGx5IHByb2Nlc3NpbmcgY29uZmlndXJhdGlvbiBjaGFuZ2VzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnY29tcGF0aWJpbGl0eSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9mdXR1cmUtcHJvb2ZpbmcuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnRnV0dXJlLVByb29maW5nIFlvdXIgQXBwcycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgY29sbGVjdGlvbiBvZiBjb21tb24gc2Vuc2UgYWR2aWNlIHRvIGhlbHAgeW91IGVuc3VyZSB0aGF0IHlvdXIgYXBwbGljYXRpb25zIGRvblwndCBicmVhayB3aGVuIG5ldyB2ZXJzaW9ucyBvZiB0aGUgQW5kcm9pZCBwbGF0Zm9ybSBhcmUgcmVsZWFzZWQuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdpbnB1dCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9nZXN0dXJlcy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdHZXN0dXJlcycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RvdWNoIHNjcmVlbnMgYWxsb3cgdXNlcnMgdG8gcGVyZm9ybSBnZXN0dXJlcywgc3VjaCBhcyB0YXBwaW5nLCBkcmFnZ2luZywgZmxpbmdpbmcsIG9yIHNsaWRpbmcsIHRvIHBlcmZvcm0gdmFyaW91cyBhY3Rpb25zLiBUaGUgZ2VzdHVyZXMgQVBJIGVuYWJsZXMgeW91ciBhcHBsaWNhdGlvbiB0byByZWNvZ25pemUgZXZlbiBjb21wbGljYXRlZCBnZXN0dXJlcyB3aXRoIGVhc2UuIFRoaXMgYXJ0aWNsZSBleHBsYWlucyBob3cgdG8gaW50ZWdyYXRlIHRoaXMgQVBJIGludG8gYW4gYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdnYW1lZGV2JywgJ2dsJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2dsc3VyZmFjZXZpZXcuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSW50cm9kdWNpbmcgR0xTdXJmYWNlVmlldycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBwcm92aWRlcyBhbiBvdmVydmlldyBvZiBHTFN1cmZhY2VWaWV3LCBhIGNsYXNzIHRoYXQgbWFrZXMgaXQgZWFzeSB0byBpbXBsZW1lbnQgMkQgb3IgM0QgT3BlbkdMIHJlbmRlcmluZyBpbnNpZGUgb2YgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ2xheW91dCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9sYXlvdXQtdHJpY2tzLXJldXNlLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xheW91dCBUcmlja3M6IENyZWF0aW5nIFJldXNhYmxlIFVJIENvbXBvbmVudHMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMZWFybiBob3cgdG8gY29tYmluZSBtdWx0aXBsZSBzdGFuZGFyZCBVSSB3aWRnZXRzIGludG8gYSBzaW5nbGUgaGlnaC1sZXZlbCBjb21wb25lbnQsIHdoaWNoIGNhbiBiZSByZXVzZWQgdGhyb3VnaG91dCB5b3VyIGFwcGxpY2F0aW9uLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnbGF5b3V0JywgJ3VpJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9sYXlvdXQtdHJpY2tzLWVmZmljaWVuY3kuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGF5b3V0IFRyaWNrczogQ3JlYXRpbmcgRWZmaWNpZW50IExheW91dHMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMZWFybiBob3cgdG8gb3B0aW1pemUgYXBwbGljYXRpb24gbGF5b3V0cyBhcyB0aGlzIGFydGljbGUgd2Fsa3MgeW91IHRocm91Z2ggY29udmVydGluZyBhIExpbmVhckxheW91dCBpbnRvIGEgUmVsYXRpdmVMYXlvdXQsIGFuZCBhbmFseXplcyB0aGUgcmVzdWx0aW5nIGltcGxpY2F0aW9ucyBvbiBwZXJmb3JtYW5jZS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2xheW91dCcsICd1aScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1zdHVicy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMYXlvdXQgVHJpY2tzOiBVc2luZyBWaWV3U3R1YnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMZWFybiBhYm91dCB1c2luZyBWaWV3U3R1YnMgaW5zaWRlIGFuIGFwcGxpY2F0aW9uXCdzIGxheW91dCBpbiBvcmRlciB0byBpbmZsYXRlIHJhcmVseSB1c2VkIFVJIGVsZW1lbnRzLCB3aXRob3V0IHRoZSBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGJlIGNhdXNlZCBieSB1c2luZyB0aGUgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiB0YWcuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdsYXlvdXQnLCAndWknLCAncGVyZm9ybWFuY2UnLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2xheW91dC10cmlja3MtbWVyZ2UuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGF5b3V0IFRyaWNrczogTWVyZ2luZyBMYXlvdXRzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTGVhcm4gaG93IHRvIHVzZSB0aGUgPGNvZGU+Jmx0O21lcmdlJmd0OzwvY29kZT4gdGFnIGluIHlvdXIgWE1MIGxheW91dHMgaW4gb3JkZXIgdG8gYXZvaWQgdW5uZWNlc3NhcnkgbGV2ZWxzIG9mIGhpZXJhcmNoeSB3aXRoaW4gYW4gYXBwbGljYXRpb25cJ3MgdmlldyB0cmVlLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAncGVyZm9ybWFuY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGlzdHZpZXctYmFja2dyb3VuZHMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGlzdFZpZXcgQmFja2dyb3VuZHM6IEFuIE9wdGltaXphdGlvbicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0xpc3RWaWV3cyBhcmUgdmVyeSBwb3B1bGFyIHdpZGdldHMgd2l0aGluIHRoZSBBbmRyb2lkIGZyYW1ld29yay4gVGhpcyBhcnRpY2xlIGRlc2NyaWJlcyBzb21lIG9mIHRoZSBvcHRpbWl6YXRpb25zIHVzZWQgYnkgdGhlIExpc3RWaWV3IHdpZGdldCwgYW5kIGhvdyB0byBhdm9pZCBzb21lIGNvbW1vbiBpc3N1ZXMgdGhhdCB0aGlzIGNhdXNlcyB3aGVuIHRyeWluZyB0byB1c2UgYSBjdXN0b20gYmFja2dyb3VuZC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ25ld2ZlYXR1cmUnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGl2ZS1mb2xkZXJzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xpdmUgRm9sZGVycycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0xpdmUgRm9sZGVycyBhbGxvdyB1c2VycyB0byBkaXNwbGF5IGFueSBzb3VyY2Ugb2YgZGF0YSBvbiB0aGVpciBob21lIHNjcmVlbiB3aXRob3V0IGxhdW5jaGluZyBhbiBhcHBsaWNhdGlvbi4gVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBob3cgdG8gZXhwb3J0IGFuIGFwcGxpY2F0aW9uXCdzIGRhdGEgaW4gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGRpc3BsYXkgaW5zaWRlIG9mIGEgbGl2ZSBmb2xkZXIuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICduZXdmZWF0dXJlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2xpdmUtd2FsbHBhcGVycy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMaXZlIFdhbGxwYXBlcnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMaXZlIHdhbGxwYXBlcnMgYXJlIHJpY2hlciwgYW5pbWF0ZWQsIGludGVyYWN0aXZlIGJhY2tncm91bmRzIHRoYXQgdXNlcnMgY2FuIGRpc3BsYXkgaW4gdGhlaXIgaG9tZSBzY3JlZW5zLiBMZWFybiBob3cgdG8gY3JlYXRlIGEgbGl2ZSB3YWxscGFwZXIgYW5kIGJ1bmRsZSBpdCBpbiBhbiBhcHBsaWNhdGlvbiB0aGF0IHVzZXJzIGNhbiBpbnN0YWxsIG9uIHRoZWlyIGRldmljZXMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdpbnB1dCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9vbi1zY3JlZW4taW5wdXRzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ09uc2NyZWVuIElucHV0IE1ldGhvZHMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGUgSW5wdXQgTWV0aG9kIEZyYW1ld29yayAoSU1GKSBhbGxvd3MgdXNlcnMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2Ygb24tc2NyZWVuIGlucHV0IG1ldGhvZHMsIHN1Y2ggYXMgc29mdHdhcmUga2V5Ym9hcmRzLiBUaGlzIGFydGljbGUgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgSW5wdXQgTWV0aG9kIEVkaXRvcnMgKElNRXMpIGFuZCBob3cgYXBwbGljYXRpb25zIGludGVyYWN0IHdpdGggdGhlbS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9wYWlubGVzcy10aHJlYWRpbmcuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnUGFpbmxlc3MgVGhyZWFkaW5nJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyB0aGUgdGhyZWFkaW5nIG1vZGVsIHVzZWQgYnkgQW5kcm9pZCBhcHBsaWNhdGlvbnMgYW5kIGhvdyBhcHBsaWNhdGlvbnMgY2FuIGVuc3VyZSBiZXN0IFVJIHBlcmZvcm1hbmNlIGJ5IHNwYXduaW5nIHdvcmtlciB0aHJlYWRzIHRvIGhhbmRsZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9ucywgcmF0aGVyIHRoYW4gaGFuZGxpbmcgdGhlbSBpbiB0aGUgbWFpbiB0aHJlYWQuIFRoZSBhcnRpY2xlIGFsc28gZXhwbGFpbnMgdGhlIEFQSSB0aGF0IHlvdXIgYXBwbGljYXRpb24gY2FuIHVzZSB0byBpbnRlcmFjdCB3aXRoIEFuZHJvaWQgVUkgdG9vbGtpdCBjb21wb25lbnRzIHJ1bm5pbmcgb24gdGhlIG1haW4gdGhyZWFkIGFuZCBzcGF3biBtYW5hZ2VkIHdvcmtlciB0aHJlYWRzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAnc2VhcmNoJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3FzYi5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdRdWljayBTZWFyY2ggQm94JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnUXVpY2sgU2VhcmNoIEJveCAoUVNCKSBpcyBhIHBvd2VyZnVsLCBzeXN0ZW0td2lkZSBzZWFyY2ggZnJhbWV3b3JrLiBRU0IgbWFrZXMgaXQgcG9zc2libGUgZm9yIHVzZXJzIHRvIHF1aWNrbHkgYW5kIGVhc2lseSBmaW5kIHdoYXQgdGhleVwncmUgbG9va2luZyBmb3IsIGJvdGggb24gdGhlaXIgZGV2aWNlcyBhbmQgb24gdGhlIHdlYi4gVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBob3cgdG8gd29yayB3aXRoIHRoZSBRU0IgZnJhbWV3b3JrIHRvIGFkZCBuZXcgc2VhcmNoIHJlc3VsdHMgZm9yIGFuIGluc3RhbGxlZCBhcHBsaWNhdGlvbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3RvdWNoLW1vZGUuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVG91Y2ggTW9kZScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBleHBsYWlucyB0aGUgdG91Y2ggbW9kZSwgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBwcmluY2lwbGVzIG9mIEFuZHJvaWRcJ3MgVUkgdG9vbGtpdC4gV2hlbmV2ZXIgYSB1c2VyIGludGVyYWN0cyB3aXRoIGEgZGV2aWNlXCdzIHRvdWNoIHNjcmVlbiwgdGhlIHN5c3RlbSBlbnRlcnMgdG91Y2ggbW9kZS4gV2hpbGUgc2ltcGxlIGluIGNvbmNlcHQsIHRoZXJlIGFyZSBpbXBvcnRhbnQgaW1wbGljYXRpb25zIHRvdWNoIG1vZGUgdGhhdCBhcmUgb2Z0ZW4gb3Zlcmxvb2tlZC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy90cmFjay1tZW0uaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVHJhY2tpbmcgTWVtb3J5IEFsbG9jYXRpb25zJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBob3cgdG8gdXNlIHRoZSBBbGxvY2F0aW9uIFRyYWNrZXIgdG9vbCB0byBvYnNlcnZlIG1lbW9yeSBhbGxvY2F0aW9ucyBhbmQgYXZvaWQgcGVyZm9ybWFuY2UgcHJvYmxlbXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgY2F1c2VkIGJ5IGlnbm9yaW5nIHRoZSBlZmZlY3Qgb2YgRGFsdmlrXCdzIGdhcmJhZ2UgY29sbGVjdG9yLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnbmV3ZmVhdHVyZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy91aS0xLjUuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVUkgRnJhbWV3b3JrIENoYW5nZXMgaW4gQW5kcm9pZCAxLjUnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdFeHBsb3JlIHRoZSBVSSBjaGFuZ2VzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGluIEFuZHJvaWQgMS41LCBjb21wYXJlZCB3aXRoIHRoZSBVSSBwcm92aWRlZCBpbiBBbmRyb2lkIDEuMCBhbmQgMS4xLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnbmV3ZmVhdHVyZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy91aS0xLjYuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVUkgRnJhbWV3b3JrIENoYW5nZXMgaW4gQW5kcm9pZCAxLjYnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdFeHBsb3JlIHRoZSBVSSBjaGFuZ2VzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGluIEFuZHJvaWQgMS42LCBjb21wYXJlZCB3aXRoIHRoZSBVSSBwcm92aWRlZCBpbiBBbmRyb2lkIDEuNS4gSW4gcGFydGljdWxhciwgdGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBjaGFuZ2VzIHRvIFJlbGF0aXZlTGF5b3V0cyBhbmQgY2xpY2sgbGlzdGVuZXJzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3RpbWVkLXVpLXVwZGF0ZXMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVXBkYXRpbmcgdGhlIFVJIGZyb20gYSBUaW1lcicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0xlYXJuIGFib3V0IGhvdyB0byB1c2UgSGFuZGxlcnMgYXMgYSBtb3JlIGVmZmljaWVudCByZXBsYWNlbWVudCBmb3IgamF2YS51dGlsLlRpbWVyIG9uIHRoZSBBbmRyb2lkIHBsYXRmb3JtLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAnYWNjZXNzaWJpbGl0eSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy90dHMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVXNpbmcgVGV4dC10by1TcGVlY2gnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGUgdGV4dC10by1zcGVlY2ggQVBJIGxldHMgeW91ciBhcHBsaWNhdGlvbiAic3BlYWsiIHRvIHVzZXJzLCBpbiBhbnkgb2Ygc2V2ZXJhbCBsYW5ndWFnZXMuIFRoaXMgYXJ0aWNsZSBwcm92aWRlcyBhbiBvdmVydmlldyBvZiB0aGUgVFRTIEFQSSBhbmQgaG93IHlvdSB1c2UgdG8gYWRkIHNwZWVjaCBjYXBhYmlsaXRpZXMgdG8geW91ciBhcHBsaWNhdGlvbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ3dlYiddLAorICAgIHBhdGg6ICdhcnRpY2xlcy91c2luZy13ZWJ2aWV3cy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdVc2luZyBXZWJWaWV3cycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1dlYlZpZXdzIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIGR5bmFtaWNhbGx5IGRpc3BsYXkgSFRNTCBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0LCB3aXRob3V0IHJlbGlucXVpc2hpbmcgY29udHJvbCB0byBhIHNlcGFyYXRlIGJyb3dzZXIgYXBwbGljYXRpb24uIFRoaXMgYXJ0aWNsZSBpbnRyb2R1Y2VzIHRoZSBXZWJWaWV3IGNsYXNzZXMgYW5kIHByb3ZpZGVzIGEgc2FtcGxlIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIGl0cyB1c2UuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy93aWtpbm90ZXMtbGlua2lmeS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdXaWtpTm90ZXM6IExpbmtpZnkgeW91ciBUZXh0IScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBpbnRyb2R1Y2VzIFdpa2lOb3RlcyBmb3IgQW5kcm9pZCwgcGFydCBvZiB0aGUgQXBwcyBmb3IgQW5kcm9pZCBwcm9qZWN0LiBJdCBjb3ZlcnMgdGhlIHVzZSBvZiBMaW5raWZ5IHRvIHR1cm4gb3JkaW5hcnkgdGV4dCB2aWV3cyBpbnRvIHJpY2hlciwgbGluay1vcmllbnRlZCBjb250ZW50IHRoYXQgY2F1c2VzIEFuZHJvaWQgaW50ZW50cyB0byBmaXJlIHdoZW4gYSBsaW5rIGlzIHNlbGVjdGVkLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnaW50ZW50J10sCisgICAgcGF0aDogJ2FydGljbGVzL3dpa2lub3Rlcy1pbnRlbnRzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1dpa2lOb3RlczogUm91dGluZyBJbnRlbnRzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhpcyBhcnRpY2xlIGlsbHVzdHJhdGVzIGhvdyBhbiBhcHBsaWNhdGlvbiwgaW4gdGhpcyBjYXNlIHRoZSBXaWtpTm90ZXMgc2FtcGxlIGFwcCwgY2FuIHVzZSBpbnRlbnRzIHRvIHJvdXRlIHZhcmlvdXMgdHlwZXMgb2YgbGlua2VkIHRleHQgdG8gdGhlIGFwcGxpY2F0aW9uIHRoYXQgaGFuZGxlcyB0aGF0IHR5cGUgb2YgZGF0YS4gRm9yIGV4YW1wbGUsIGFuIGFwcCBjYW4gdXNlIGludGVudHMgdG8gcm91dGUgYSBsaW5rZWQgdGVsZXBob25lIG51bWJlciB0byBhIGRpYWxlciBhcHAgYW5kIGEgd2ViIFVSTCB0byBhIGJyb3dzZXIuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICdwZXJmb3JtYW5jZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy93aW5kb3ctYmctc3BlZWQuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnV2luZG93IEJhY2tncm91bmRzICYgVUkgU3BlZWQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdTb21lIEFuZHJvaWQgYXBwbGljYXRpb25zIG5lZWQgdG8gc3F1ZWV6ZSBldmVyeSBiaXQgb2YgcGVyZm9ybWFuY2Ugb3V0IG9mIHRoZSBVSSB0b29sa2l0IGFuZCB0aGVyZSBhcmUgbWFueSB3YXlzIHRvIGRvIHNvLiBJbiB0aGlzIGFydGljbGUsIHlvdSB3aWxsIGRpc2NvdmVyIGhvdyB0byBzcGVlZCB1cCB0aGUgZHJhd2luZyBhbmQgdGhlIHBlcmNlaXZlZCBzdGFydHVwIHRpbWUgb2YgeW91ciBhY3Rpdml0aWVzLiBCb3RoIG9mIHRoZXNlIHRlY2huaXF1ZXMgcmVseSBvbiBhIHNpbmdsZSBmZWF0dXJlLCB0aGUgd2luZG93XCdzIGJhY2tncm91bmQgZHJhd2FibGUuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvemlwYWxpZ24uaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnWmlwYWxpZ246IGFuIEVhc3kgT3B0aW1pemF0aW9uJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhlIEFuZHJvaWQgU0RLIGluY2x1ZGVzIGEgdG9vbCBjYWxsZWQgemlwYWxpZ24gdGhhdCBvcHRpbWl6ZXMgdGhlIHdheSBhbiBhcHBsaWNhdGlvbiBpcyBwYWNrYWdlZC4gUnVubmluZyB6aXBhbGlnbiBhZ2FpbnN0IHlvdXIgYXBwbGljYXRpb24gZW5hYmxlcyBBbmRyb2lkIHRvIGludGVyYWN0IHdpdGggaXQgbW9yZSBlZmZpY2llbnRseSBhdCBydW4gdGltZSBhbmQgdGh1cyBoYXMgdGhlIHBvdGVudGlhbCB0byBtYWtlIGl0IGFuZCB0aGUgb3ZlcmFsbCBzeXN0ZW0gcnVuIGZhc3Rlci4gVGhpcyBhcnRpY2xlIHByb3ZpZGVzIGEgaGlnaC1sZXZlbCBvdmVydmlldyBvZiB0aGUgemlwYWxpZ24gdG9vbCBhbmQgaXRzIHVzZS4nCisgICAgfQorICB9LAorCisvLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8gU0FNUExFIENPREUgLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2xheW91dCcsICd1aSddLAorICAgIHBhdGg6ICdzYW1wbGVzL0FwaURlbW9zL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0FQSSBEZW1vcycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgdmFyaWV0eSBvZiBzbWFsbCBhcHBsaWNhdGlvbnMgdGhhdCBkZW1vbnN0cmF0ZSBhbiBleHRlbnNpdmUgY29sbGVjdGlvbiBvZiBmcmFtZXdvcmsgdG9waWNzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdkYXRhJywgJ25ld2ZlYXR1cmUnLCAnYWNjb3VudHN5bmMnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvQmFja3VwUmVzdG9yZS9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdCYWNrdXAgYW5kIFJlc3RvcmUnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdJbGx1c3RyYXRlcyBhIGZldyBkaWZmZXJlbnQgYXBwcm9hY2hlcyB0aGF0IGFuIGFwcGxpY2F0aW9uIGRldmVsb3BlciBjYW4gdGFrZSB3aGVuIGludGVncmF0aW5nIHdpdGggdGhlIEFuZHJvaWQgQmFja3VwIE1hbmFnZXIgdXNpbmcgdGhlIEJhY2t1cEFnZW50IEFQSSBpbnRyb2R1Y2VkIGluIEFuZHJvaWQgMi4yLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdjb21tdW5pY2F0aW9uJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvQmx1ZXRvb3RoQ2hhdC9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdCbHVldG9vdGggQ2hhdCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGFwcGxpY2F0aW9uIGZvciB0d28td2F5IHRleHQgbWVzc2FnaW5nIG92ZXIgQmx1ZXRvb3RoLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdhY2NvdW50c3luYyddLAorICAgIHBhdGg6ICdzYW1wbGVzL0J1c2luZXNzQ2FyZC9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdCdXNpbmVzc0NhcmQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBhcHBsaWNhdGlvbiB0aGF0IGRlbW9uc3RyYXRlcyBob3cgdG8gbGF1bmNoIHRoZSBidWlsdC1pbiBjb250YWN0IHBpY2tlciBmcm9tIHdpdGhpbiBhbiBhY3Rpdml0eS4gVGhpcyBzYW1wbGUgYWxzbyB1c2VzIHJlZmxlY3Rpb24gdG8gZW5zdXJlIHRoYXQgdGhlIGNvcnJlY3QgdmVyc2lvbiBvZiB0aGUgY29udGFjdHMgQVBJIGlzIHVzZWQsIGRlcGVuZGluZyBvbiB3aGljaCBBUEkgbGV2ZWwgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgdW5kZXIuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2FjY291bnRzeW5jJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvQ29udGFjdE1hbmFnZXIvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQ29udGFjdCBNYW5hZ2VyJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW4gYXBwbGljYXRpb24gdGhhdCBkZW1vbnN0cmF0ZXMgaG93IHRvIHF1ZXJ5IHRoZSBzeXN0ZW0gY29udGFjdHMgcHJvdmlkZXIgIHVzaW5nIHRoZSA8Y29kZT5Db250YWN0c0NvbnRyYWN0PC9jb2RlPiBBUEksIGFzIHdlbGwgYXMgaW5zZXJ0IGNvbnRhY3RzIGludG8gYSBzcGVjaWZpYyBhY2NvdW50LicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZSddLAorICAgIHBhdGg6ICdzYW1wbGVzL0hvbWUvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSG9tZScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgaG9tZSBzY3JlZW4gcmVwbGFjZW1lbnQgYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2dhbWVkZXYnLCAnbWVkaWEnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9KZXRCb3kvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSmV0Qm95JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBnYW1lIHRoYXQgZGVtb25zdHJhdGVzIHRoZSBTT05pVk9YIEpFVCBpbnRlcmFjdGl2ZSBtdXNpYyB0ZWNobm9sb2d5LCB3aXRoIDxjb2RlPjxhIGhyZWY9Ii9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9KZXRQbGF5ZXIuaHRtbCI+SmV0UGxheWVyPC9hPjwvY29kZT4uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3VpJywgJ25ld2ZlYXR1cmUnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9DdWJlTGl2ZVdhbGxwYXBlci9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMaXZlIFdhbGxwYXBlcicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIGhvdyB0byBjcmVhdGUgYSBsaXZlIHdhbGxwYXBlciBhbmQgIGJ1bmRsZSBpdCBpbiBhbiBhcHBsaWNhdGlvbiB0aGF0IHVzZXJzIGNhbiBpbnN0YWxsIG9uIHRoZWlyIGRldmljZXMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2dhbWVkZXYnLCAnbWVkaWEnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9MdW5hckxhbmRlci9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMdW5hciBMYW5kZXInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIGNsYXNzaWMgTHVuYXIgTGFuZGVyIGdhbWUuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3VpJywgJ2Jlc3RwcmFjdGljZScsICdsYXlvdXQnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9NdWx0aVJlc29sdXRpb24vaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTXVsdGlwbGUgUmVzb2x1dGlvbnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIHNhbXBsZSBhcHBsaWNhdGlvbiB0aGF0IHNob3dzIGhvdyB0byB1c2UgcmVzb3VyY2UgZGlyZWN0b3J5IHF1YWxpZmllcnMgdG8gcHJvdmlkZSBkaWZmZXJlbnQgcmVzb3VyY2VzIGZvciBkaWZmZXJlbnQgc2NyZWVuIGNvbmZpZ3VyYXRpb25zLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdkYXRhJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvTm90ZVBhZC9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdOb3RlIFBhZCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGFwcGxpY2F0aW9uIGZvciBzYXZpbmcgbm90ZXMuIFNpbWlsYXIgKGJ1dCBub3QgaWRlbnRpY2FsKSB0byB0aGUgPGEgaHJlZj0iL3Jlc291cmNlcy90dXRvcmlhbHMvbm90ZXBhZC9pbmRleC5odG1sIj5Ob3RlcGFkIHR1dG9yaWFsPC9hPi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnYWNjb3VudHN5bmMnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdTYW1wbGVTeW5jQWRhcHRlcicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0RlbW9uc3RyYXRlcyBob3cgYW4gYXBwbGljYXRpb24gY2FuIGNvbW11bmljYXRlIHdpdGggYSBjbG91ZC1iYXNlZCBzZXJ2aWNlIGFuZCBzeW5jaHJvbml6ZSBpdHMgZGF0YSB3aXRoIGRhdGEgc3RvcmVkIGxvY2FsbHkgaW4gYSBjb250ZW50IHByb3ZpZGVyLiBUaGUgc2FtcGxlIHVzZXMgdHdvIHJlbGF0ZWQgcGFydHMgb2YgdGhlIEFuZHJvaWQgZnJhbWV3b3JrICZtZGFzaDsgdGhlIGFjY291bnQgbWFuYWdlciBhbmQgdGhlIHN5bmNocm9uaXphdGlvbiBtYW5hZ2VyICh0aHJvdWdoIGEgc3luYyBhZGFwdGVyKS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAndWknLCAnc2VhcmNoJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1NlYXJjaGFibGVEaWN0aW9uYXJ5L2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1NlYXJjaGFibGUgRGljdGlvbmFyeSB2MicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0Egc2FtcGxlIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIEFuZHJvaWRcJ3Mgc2VhcmNoIGZyYW1ld29yaywgaW5jbHVkaW5nIGhvdyB0byBwcm92aWRlIHNlYXJjaCBzdWdnZXN0aW9ucyBmb3IgUXVpY2sgU2VhcmNoIEJveC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnbGF5b3V0JywgJ3VpJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvU25ha2UvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnU25ha2UnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2xhc3NpYyBnYW1lICJTbmFrZS4iJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3Rlc3RpbmcnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvU3Bpbm5lci9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdTcGlubmVyJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBzaW1wbGUgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgYW4gYXBwbGljYXRpb24gdW5kZXIgdGVzdCBmb3IgdGhlIFNwaW5uZXJUZXN0IGV4YW1wbGUuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3Rlc3RpbmcnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvU3Bpbm5lclRlc3QvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnU3Bpbm5lclRlc3QnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGUgdGVzdCBhcHBsaWNhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IFRlc3RpbmcgdHV0b3JpYWwuIEl0IHRlc3RzIHRoZSBTcGlubmVyIGV4YW1wbGUgYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ25ld2ZlYXR1cmUnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvVGljVGFjVG9lTGliL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1RpY1RhY1RvZUxpYicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGV4YW1wbGUgb2YgYW4gQW5kcm9pZCBsaWJyYXJ5IHByb2plY3QsIGEgdHlwZSBvZiBwcm9qZWN0IHRoYXQgbGV0cyB5b3Ugc3RvcmUgYW5kIG1hbmFnZSBzaGFyZWQgY29kZSBhbmQgcmVzb3VyY2VzIGluIG9uZSBwbGFjZSwgdGhlbiBtYWtlIHRoZW0gYXZhaWxhYmxlIHRvIHlvdXIgb3RoZXIgQW5kcm9pZCBhcHBsaWNhdGlvbnMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ25ld2ZlYXR1cmUnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvVGljVGFjVG9lTWFpbi9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdUaWNUYWNUb2VNYWluJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnRGVtb25zdHJhdGVzIGhvdyBhbiBhcHBsaWNhdGlvbiBjYW4gbWFrZSB1c2Ugb2Ygc2hhcmVkIGNvZGUgYW5kIHJlc291cmNlcyBzdG9yZWQgaW4gYW4gQW5kcm9pZCBsaWJyYXJ5IHByb2plY3QuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2lucHV0J10sCisgICAgcGF0aDogJ3NhbXBsZXMvU29mdEtleWJvYXJkL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1NvZnQgS2V5Ym9hcmQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBleGFtcGxlIG9mIHdyaXRpbmcgYW4gaW5wdXQgbWV0aG9kIGZvciBhIHNvZnR3YXJlIGtleWJvYXJkLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICd1aSddLAorICAgIHBhdGg6ICdzYW1wbGVzL1dpa3Rpb25hcnkvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnV2lrdGlvbmFyeScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGV4YW1wbGUgb2YgY3JlYXRpbmcgaW50ZXJhY3RpdmUgd2lkZ2V0cyBmb3IgZGlzcGxheSBvbiB0aGUgQW5kcm9pZCBob21lIHNjcmVlbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAndWknXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9XaWt0aW9uYXJ5U2ltcGxlL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1dpa3Rpb25hcnkgKFNpbXBsaWZpZWQpJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBzaW1wbGUgQW5kcm9pZCBob21lIHNjcmVlbiB3aWRnZXRzIGV4YW1wbGUuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2xheW91dCcsICduZXcnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9YbWxBZGFwdGVycy9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdYTUwgQWRhcHRlcnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdCaW5kaW5nIGRhdGEgdG8gdmlld3MgdXNpbmcgWE1MIEFkYXB0ZXJzIGV4YW1wbGVzLicKKyAgICB9CisgIH0sCisKKy8vLy8vLy8vLy8vLy8vLy8vCisvLy8gVFVUT1JJQUxTIC8vLworLy8vLy8vLy8vLy8vLy8vLy8KKworICB7CisgICAgdGFnczogWyd0dXRvcmlhbCddLAorICAgIHBhdGg6ICd0dXRvcmlhbHMvaGVsbG8td29ybGQuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSGVsbG8gV29ybGQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdCZWdpbm5pbmcgYmFzaWMgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgd2l0aCB0aGUgQW5kcm9pZCBTREsuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsndHV0b3JpYWwnLCAndWknLCAnbGF5b3V0J10sCisgICAgcGF0aDogJ3R1dG9yaWFscy92aWV3cy9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdIZWxsbyBWaWV3cycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0Egd2Fsay10aHJvdWdoIG9mIHRoZSB2YXJpb3VzIHR5cGVzIG9mIGxheW91dHMgYW5kIHZpZXdzIGF2YWlsYWJsZSBpbiB0aGUgQW5kcm9pZCBTREsuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsndHV0b3JpYWwnLCAndWknLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ3R1dG9yaWFscy9sb2NhbGl6YXRpb24vaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSGVsbG8gTG9jYWxpemF0aW9uJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhlIGJhc2ljcyBvZiBsb2NhbGl6aW5nIHlvdXIgYXBwbGljYXRpb25zIGZvciBtdWx0aXBsZSBsYW5ndWFnZXMgYW5kIGxvY2FsZXMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsndHV0b3JpYWwnLCAnZGF0YSddLAorICAgIHBhdGg6ICd0dXRvcmlhbHMvbm90ZXBhZC9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdOb3RlcGFkIFR1dG9yaWFsJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBtdWx0aS1wYXJ0IHR1dG9yaWFsIGRpc2N1c3NpbmcgaW50ZXJtZWRpYXRlLWxldmVsIGNvbmNlcHRzIHN1Y2ggYXMgZGF0YSBhY2Nlc3MuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsndHV0b3JpYWwnLCAndGVzdGluZycsICduZXcnXSwKKyAgICBwYXRoOiAndHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSGVsbG8gVGVzdGluZycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgYmFzaWMgaW50cm9kdWN0aW9uIHRvIHRoZSBBbmRyb2lkIHRlc3RpbmcgZnJhbWV3b3JrLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3R1dG9yaWFsJywgJ3Rlc3RpbmcnLCAnbmV3J10sCisgICAgcGF0aDogJ3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQWN0aXZpdHkgVGVzdGluZycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgbW9yZSBhZHZhbmNlZCBkZW1vbnN0cmF0aW9uIG9mIHRoZSBBbmRyb2lkIHRlc3RpbmcgZnJhbWV3b3JrIGFuZCB0b29scy4nCisgICAgfQorICB9CitdOwpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXNfdG9jLmNzIGIvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXNfdG9jLmNzCmluZGV4IDUyNjg5YjYuLmExNzExYjUgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzX3RvYy5jcworKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlc190b2MuY3MKQEAgLTEsNSArMSw1NiBAQAogPHVsPgogICA8bGk+CisgICAgPGgyPjxzcGFuIGNsYXNzPSJlbiI+VGVjaG5pY2FsIFJlc291cmNlczwvc3Bhbj4KKyAgICA8L2gyPgorICAgIDx1bD4KKyAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgorICAgICAgICA8ZGl2PjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXNhbXBsZSI+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNhbXBsZSBDb2RlPC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlIiBzdHlsZT0iZGlzcGxheTpub25lIj5CZWlzcGllbGNvZGU8L3NwYW4+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXMiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkPDs2RpZ28gZGUgZWplbXBsbzwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmciIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+RXhlbXBsZSBkZSBjb2RlPC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9Iml0IiBzdHlsZT0iZGlzcGxheTpub25lIj5Db2RpY2UgZGkgZXNlbXBpbzwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+44K144Oz44OX44OrIOOCs+ODvOODiTwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1DTiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLVRXIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+CisgICAgICAgICAgPC9hPjwvZGl2PgorICAgICAgICA8dWwgaWQ9ImRldmRvYy1uYXYtc2FtcGxlLWxpc3QiPgorICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9nZXQuaHRtbCI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5HZXR0aW5nIHRoZSBTYW1wbGVzPC9zcGFuPgorICAgICAgICAgICAgICA8L2E+PC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgICA8bGkgY2xhc3M9InRvZ2dsZS1saXN0Ij4KKyAgICAgICAgPGRpdj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1hcnRpY2xlIj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QXJ0aWNsZXM8L3NwYW4+CisgICAgICAgICAgICAgPC9hPjwvZGl2PgorICAgICAgICA8dWwgaWQ9ImRldmRvYy1uYXYtYXJ0aWNsZS1saXN0Ij4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgICA8bGkgY2xhc3M9InRvZ2dsZS1saXN0Ij4KKyAgICAgICAgPGRpdj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz10dXRvcmlhbCI+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlR1dG9yaWFsczwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+TGVybnByb2dyYW1tZTwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+VHV0b3JpYWxlczwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmciIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+RGlkYWN0aWNpZWxzPC9zcGFuPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Iml0IiBzdHlsZT0iZGlzcGxheTpub25lIj5Fc2VyY2l0YXppb25pPC9zcGFuPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphIiBzdHlsZT0iZGlzcGxheTpub25lIj7jg4Hjg6Xjg7zjg4jjg6rjgqLjg6s8L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtQ04iIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1UVyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgorICAgICAgICAgICAgIDwvYT48L2Rpdj4KKyAgICAgICAgPHVsIGlkPSJkZXZkb2MtbmF2LXR1dG9yaWFsLWxpc3QiPgorICAgICAgICA8L3VsPgorICAgICAgPC9saT4KKyAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgorICAgICAgICA8ZGl2PjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy90b3BpY3MuaHRtbCI+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlRvcGljczwvc3Bhbj4KKyAgICAgICAgICAgICA8L2E+PC9kaXY+CisgICAgICAgIDx1bCBpZD0iZGV2ZG9jLW5hdi10b3BpYy1saXN0Ij4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgPC9saT4KKyAgPGxpPgogICAgIDxoMj48c3BhbiBjbGFzcz0iZW4iPkNvbW11bml0eTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmUiIGNsYXNzPSJkZSI+PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZSIgY2xhc3M9ImVzIj5Db211bmlkYWQ8L3NwYW4+CkBAIC0zNCwyNDEgKzg1LDYgQEAKICAgPC9saT48P2NzCiAgIC9pZgogPz4KLQotICA8bGk+Ci0gICAgPGgyPjxzcGFuIGNsYXNzPSJlbiI+VGVjaG5pY2FsIEFydGljbGVzPC9zcGFuPgotICAgIDwvaDI+Ci0gICAgPHVsPgotICAgICAgPGxpIGNsYXNzPSJ0b2dnbGUtbGlzdCI+Ci0gICAgICAgIDxkaXY+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MaXN0IG9mIEFydGljbGVzPC9zcGFuPgotICAgICAgICAgICAgIDwvYT48L2Rpdj4KLSAgICAgICAgPHVsPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2F2b2lkaW5nLW1lbW9yeS1sZWFrcy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkF2b2lkaW5nIE1lbW9yeSBMZWFrczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9iYWNrd2FyZC1jb21wYXRpYmlsaXR5Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QmFja3dhcmQgQ29tcGF0aWJpbGl0eTwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9jYW4taS11c2UtdGhpcy1pbnRlbnQuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5DYW4gSSBVc2UgdGhpcyBJbnRlbnQ/PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2NyZWF0aW5nLWlucHV0LW1ldGhvZC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkNyZWF0aW5nIGFuIElucHV0IE1ldGhvZDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9kcmF3YWJsZS1tdXRhdGlvbnMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5EcmF3YWJsZSBNdXRhdGlvbnM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvZmFzdGVyLXNjcmVlbi1vcmllbnRhdGlvbi1jaGFuZ2UuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5GYXN0ZXIgU2NyZWVuIE9yaWVudGF0aW9uIENoYW5nZTwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9mdXR1cmUtcHJvb2ZpbmcuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5GdXR1cmUtUHJvb2ZpbmcgWW91ciBBcHBzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2dlc3R1cmVzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+R2VzdHVyZXM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvZ2xzdXJmYWNldmlldy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkludHJvZHVjaW5nIEdMU3VyZmFjZVZpZXc8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1yZXVzZS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxheW91dCBUcmlja3M6IFJldXNpbmcgPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xheW91dC10cmlja3MtZWZmaWNpZW5jeS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxheW91dCBUcmlja3M6IEVmZmljaWVuY3k8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1zdHVicy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxheW91dCBUcmlja3M6IFZpZXdTdHVicyA8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1tZXJnZS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxheW91dCBUcmlja3M6IE1lcmdpbmcgPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xpc3R2aWV3LWJhY2tncm91bmRzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGlzdFZpZXcgQmFja2dyb3VuZHM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvbGl2ZS1mb2xkZXJzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGl2ZSBGb2xkZXJzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xpdmUtd2FsbHBhcGVycy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxpdmUgV2FsbHBhcGVyczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9vbi1zY3JlZW4taW5wdXRzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+T25zY3JlZW4gSW5wdXQgTWV0aG9kczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9wYWlubGVzcy10aHJlYWRpbmcuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5QYWlubGVzcyBUaHJlYWRpbmc8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvcXNiLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+UXVpY2sgU2VhcmNoIEJveDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9zcGVlY2gtaW5wdXQuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TcGVlY2ggSW5wdXQ8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvdG91Y2gtbW9kZS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlRvdWNoIE1vZGU8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvdHJhY2stbWVtLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VHJhY2tpbmcgTWVtb3J5IEFsbG9jYXRpb25zPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3VpLTEuNS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlVJIEZyYW1ld29yayBDaGFuZ2VzIGluIEFuZHJvaWQgMS41PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3VpLTEuNi5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlVJIEZyYW1ld29yayBDaGFuZ2VzIGluIEFuZHJvaWQgMS42PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3RpbWVkLXVpLXVwZGF0ZXMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5VcGRhdGluZyB0aGUgVUkgZnJvbSBhIFRpbWVyPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3R0cy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlVzaW5nIFRleHQtdG8tU3BlZWNoPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2NvbnRhY3RzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VXNpbmcgdGhlIENvbnRhY3RzIEFQSTwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy91c2luZy13ZWJ2aWV3cy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlVzaW5nIFdlYlZpZXdzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3dpa2lub3Rlcy1saW5raWZ5Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+V2lraU5vdGVzOiBMaW5raWZ5IHlvdXIgVGV4dCE8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvd2lraW5vdGVzLWludGVudHMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5XaWtpTm90ZXM6IFJvdXRpbmcgSW50ZW50czwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy93aW5kb3ctYmctc3BlZWQuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5XaW5kb3cgQmFja2dyb3VuZHMgJmFtcDsgVUkgU3BlZWQ8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvemlwYWxpZ24uaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5aaXBhbGlnbjogQW4gRWFzeSBPcHRpbWl6YXRpb248L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDwvdWw+Ci0gICAgICA8L2xpPgotICAgIDwvdWw+Ci0gICA8L2xpPgotCi0gIDxsaT4KLSAgICA8aDI+PHNwYW4gY2xhc3M9ImVuIj5UdXRvcmlhbHM8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGUiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkxlcm5wcm9ncmFtbWU8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXMiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPlR1dG9yaWFsZXM8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZnIiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkRpZGFjdGljaWVsczwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpdCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+RXNlcmNpdGF6aW9uaTwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+44OB44Ol44O844OI44Oq44Ki44OrPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLUNOIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtVFciIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KLSAgICA8L2gyPgotICAgIDx1bD4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdHV0b3JpYWxzL2hlbGxvLXdvcmxkLmh0bWwiPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5IZWxsbyBXb3JsZDwvc3Bhbj4KLSAgICAgICAgICA8L2E+PC9saT4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdHV0b3JpYWxzL3ZpZXdzL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5IZWxsbyBWaWV3czwvc3Bhbj4KLSAgICAgICAgICA8L2E+PC9saT4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdHV0b3JpYWxzL2xvY2FsaXphdGlvbi9pbmRleC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SGVsbG8gTG9jYWxpemF0aW9uPC9zcGFuPgotICAgICAgICAgIDwvYT48L2xpPgotICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SGVsbG8gVGVzdGluZzwvc3Bhbj48L2E+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPgotICAgICAgPC9saT4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdHV0b3JpYWxzL25vdGVwYWQvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPk5vdGVwYWQgVHV0b3JpYWw8L3NwYW4+Ci0gICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkFjdGl2aXR5IFRlc3Rpbmc8L3NwYW4+PC9hPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj4KLSAgICAgIDwvbGk+Ci0gICAgPC91bD4KLSAgPC9saT4KLQotCi0gIDxsaT4KLSAgICA8aDI+PHNwYW4gY2xhc3M9ImVuIj5TYW1wbGUgQ29kZTwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+QmVpc3BpZWxjb2RlPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVzIiBzdHlsZT0iZGlzcGxheTpub25lIj5Dw7NkaWdvIGRlIGVqZW1wbG88L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZnIiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkV4ZW1wbGUgZGUgY29kZTwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpdCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+Q29kaWNlIGRpIGVzZW1waW88L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamEiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPuOCteODs+ODl+ODqyDjgrPjg7zjg4k8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtQ04iIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1UVyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgotICAgIDwvaDI+Ci0gICAgPHVsPgotICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL2dldC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+R2V0dGluZyB0aGUgU2FtcGxlczwvc3Bhbj4KLSAgICAgICAgICA8L2E+PC9saT4KLSAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgotICAgICAgICA8ZGl2PjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MaXN0IG9mIFNhbXBsZXM8L3NwYW4+Ci0gICAgICAgICAgICAgPC9hPjwvZGl2PgotICAgICAgICA8dWw+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0FwaURlbW9zL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QVBJIERlbW9zPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvQmFja3VwUmVzdG9yZS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkJhY2t1cCBhbmQgUmVzdG9yZTwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPiA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0JsdWV0b290aENoYXQvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5CbHVldG9vdGggQ2hhdDwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0J1c2luZXNzQ2FyZC9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkJ1c2luZXNzIENhcmQ8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9Db250YWN0TWFuYWdlci9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkNvbnRhY3QgTWFuYWdlcjwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0hvbWUvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Ib21lPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvSmV0Qm95L2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SmV0Qm95PC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvQ3ViZUxpdmVXYWxscGFwZXIvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MaXZlIFdhbGxwYXBlcjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvTHVuYXJMYW5kZXIvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MdW5hciBMYW5kZXI8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9NdWx0aVJlc29sdXRpb24vaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5NdWx0aXBsZSBSZXNvbHV0aW9uczwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL05vdGVQYWQvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Ob3RlIFBhZDwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U2FtcGxlIFN5bmMgQWRhcHRlcjwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1NlYXJjaGFibGVEaWN0aW9uYXJ5L2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U2VhcmNoYWJsZSBEaWN0aW9uYXJ5IHYyPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+IDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvU25ha2UvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TbmFrZTwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1NvZnRLZXlib2FyZC9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNvZnQgS2V5Ym9hcmQ8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9TcGlubmVyL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U3Bpbm5lcjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+IDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvU3Bpbm5lclRlc3QvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TcGlubmVyVGVzdDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+IDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvVGljVGFjVG9lTGliL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VGljVGFjVG9lTGliPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT4gPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9UaWNUYWNUb2VNYWluL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VGljVGFjVG9lTWFpbjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+IDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvV2lrdGlvbmFyeS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPldpa3Rpb25hcnk8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9XaWt0aW9uYXJ5U2ltcGxlL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+V2lrdGlvbmFyeSAoU2ltcGxpZmllZCk8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8L3VsPgotICAgICAgPC9saT4KLSAgICA8L3VsPgotICA8L2xpPgotCi0KLQogICA8bGk+CiAgICAgPGgyPjxzcGFuIGNsYXNzPSJlbiI+TW9yZTwvc3Bhbj4KICAgICA8L2gyPgpAQCAtMjk3LDggKzExMyw2IEBACiAgICAgIDwvbGk+CiAgICAgPC91bD4KICAgPC9saT4KLQotCiA8L3VsPgogCiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL1htbFBob3Rvc0FkYXB0ZXIucG5nIGIvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9YbWxQaG90b3NBZGFwdGVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDE4ZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9YbWxQaG90b3NBZGFwdGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL1htbFJzc1JlYWRlci5wbmcgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL1htbFJzc1JlYWRlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBmODQxYgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvc2FtcGxlcy9pbWFnZXMvWG1sUnNzUmVhZGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL3NhbXBsZV9ub3RlcGFkdGVzdF9qdW5pdC5wbmcgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL3NhbXBsZV9ub3RlcGFkdGVzdF9qdW5pdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNkYTU0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvc2FtcGxlcy9pbWFnZXMvc2FtcGxlX25vdGVwYWR0ZXN0X2p1bml0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL3RvcGljcy5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvdG9waWNzLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OTYwZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3RvcGljcy5qZApAQCAtMCwwICsxLDcyIEBACitwYWdlLnRpdGxlPVRlY2huaWNhbCBSZXNvdXJjZSBUb3BpY3MKK0BqZDpib2R5CisKKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICNyZXNvdXJjZS10b3BpYy10YWJsZSB0ZCB7CisgICAgYm9yZGVyOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmctbGVmdDogMWVtOworICAgIHdpZHRoOiAxOGVtOworICB9CisKKyAgI3Jlc291cmNlLXRvcGljLXRhYmxlIHVsIHsKKyAgICBwYWRkaW5nOiAwOworICAgIG1hcmdpbjogMDsKKyAgfQorCisgICNyZXNvdXJjZS10b3BpYy10YWJsZSBsaSB7CisgICAgbGlzdC1zdHlsZTogbm9uZTsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgfQorPC9zdHlsZT4KKworPHA+CitZb3UgY2FuIGJyb3dzZSB0aGUgbGlzdCBvZiB0ZWNobmljYWwgcmVzb3VyY2VzIGJ5IHRvcGljIGJ5IGNsaWNraW5nIG9uIHRoZQorbGlua3MgYmVsb3cuIE92ZXIgdGltZSwgYXMgbW9yZSB0b3BpY3MgYXJlIGFkZGVkLCB0aGV5IHdpbGwgYmUgYWRkZWQgdG8gdGhlCitsaXN0IGJlbG93LgorPC9wPgorCis8bm9zY3JpcHQ+CisgIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPkVycm9yOjwvc3Ryb25nPgorICAgIFlvdSBtdXN0IGhhdmUgSmF2YVNjcmlwdCBlbmFibGVkIHRvIHZpZXcgdGhpcyBwYWdlLiBSZXNvdXJjZXMgYXJlIGFsc28KKyAgICBhdmFpbGFibGUgb2ZmbGluZSBpbiB0aGUgU0RLLgorICA8L3A+Cis8L25vc2NyaXB0PgorCis8dGFibGUgaWQ9InJlc291cmNlLXRvcGljLXRhYmxlIj4KKyAgPHRyPjwvdHI+Cis8L3RhYmxlPgorCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cis8IS0tIAorKGZ1bmN0aW9uKCkgeworICB2YXIgdG9waWNzID0gW107CisgIGZvciAodmFyIHRvcGljIGluIEFORFJPSURfVEFHU1sndG9waWMnXSkgeworICAgIHRvcGljcy5wdXNoKHtuYW1lOnRvcGljLHRpdGxlOkFORFJPSURfVEFHU1sndG9waWMnXVt0b3BpY119KTsKKyAgfQorICB0b3BpY3Muc29ydChmdW5jdGlvbih4LHkpeyByZXR1cm4gKHgudGl0bGUgPCB5LnRpdGxlKSA/IC0xIDogMTsgfSk7CisgIHZhciB0b3BpY1BhcmVudCA9IG51bGw7CisgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9waWNzLmxlbmd0aDsgaSsrKSB7CisgICAgaWYgKHRvcGljUGFyZW50ID09IG51bGwgfHwgaSAlIDEwID09IDApIHsKKyAgICAgIC8vIGNyZWF0ZSBhIG5ldyBjb2x1bW4KKyAgICAgIHRvcGljUGFyZW50ID0gJCgndWwnLCAkKCc8dGQ+PHVsPicpLmFwcGVuZFRvKCcjcmVzb3VyY2UtdG9waWMtdGFibGUgdHInKSk7CisgICAgfQorCisgICAgdG9waWNQYXJlbnQuYXBwZW5kKAorICAgICAgICAkKCc8bGk+JykuYXBwZW5kKAorICAgICAgICAgICQoJzxoMz4nKS5hcHBlbmQoCisgICAgICAgICAgICAkKCc8YT4nKQorICAgICAgICAgICAgICAuYXR0cignaHJlZicsIHRvUm9vdCArICJyZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz0iICsgdG9waWNzW2ldLm5hbWUpCisgICAgICAgICAgICAgIC5hcHBlbmQoJCgnPHNwYW4+JykKKyAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2VuJykKKyAgICAgICAgICAgICAgICAuaHRtbCh0b3BpY3NbaV0udGl0bGUpCisgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICkKKyAgICAgICAgICApCisgICAgICAgICk7CisgIH0KK30pKCk7CisvLy0tPgorPC9zY3JpcHQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5qYXZhCmluZGV4IDdjYTM3NDEuLmQ5ZWUzZWMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmphdmEKQEAgLTE5LDEyICsxOSwxNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC51dGlsLkZpbmFsaXplcnM7CiAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5pby5CdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5JbnRCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uU2hvcnRCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBCaXRtYXAgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKICAgICAvKioKQEAgLTM1LDkgKzM5LDEzIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVOU0lUWV9OT05FID0gMDsKICAgICAKLSAgICAvLyBOb3RlOiAgbU5hdGl2ZUJpdG1hcCBpcyB1c2VkIGJ5IEZhY2VEZXRlY3Rvcl9qbmkuY3BwCi0gICAgLy8gRG9uJ3QgY2hhbmdlL3JlbmFtZSB3aXRob3V0IHVwZGF0aW5nIEZhY2VEZXRlY3Rvcl9qbmkuY3BwCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU5hdGl2ZUJpdG1hcDsKKyAgICAvKioKKyAgICAgKiBOb3RlOiAgbU5hdGl2ZUJpdG1hcCBpcyB1c2VkIGJ5IEZhY2VEZXRlY3Rvcl9qbmkuY3BwCisgICAgICogRG9uJ3QgY2hhbmdlL3JlbmFtZSB3aXRob3V0IHVwZGF0aW5nIEZhY2VEZXRlY3Rvcl9qbmkuY3BwCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IG1OYXRpdmVCaXRtYXA7CiAKICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzTXV0YWJsZTsKICAgICBwcml2YXRlIGJ5dGVbXSBtTmluZVBhdGNoQ2h1bms7ICAgLy8gbWF5IGJlIG51bGwKQEAgLTUxLDcgKzU5LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBNYXRyaXggc1NjYWxlTWF0cml4OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgaW50IHNEZWZhdWx0RGVuc2l0eSA9IC0xOwotICAgIAorCiAgICAgLyoqCiAgICAgICogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBhbGxvd3MgdGhlIGFwcCBsYXllciB0byBjaGFuZ2UgdGhlIGRlZmF1bHQKICAgICAgKiBkZW5zaXR5IHdoZW4gcnVubmluZyBvbGQgYXBwcy4KQEAgLTc3LDggKzg1LDcgQEAKIAogICAgICAgICBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSBKTkkgY29kZS4KICAgICAqLwotICAgIHByaXZhdGUgQml0bWFwKGludCBuYXRpdmVCaXRtYXAsIGJvb2xlYW4gaXNNdXRhYmxlLCBieXRlW10gbmluZVBhdGNoQ2h1bmssCi0gICAgICAgICAgICBpbnQgZGVuc2l0eSkgeworICAgIHByaXZhdGUgQml0bWFwKGludCBuYXRpdmVCaXRtYXAsIGJvb2xlYW4gaXNNdXRhYmxlLCBieXRlW10gbmluZVBhdGNoQ2h1bmssIGludCBkZW5zaXR5KSB7CiAgICAgICAgIGlmIChuYXRpdmVCaXRtYXAgPT0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludGVybmFsIGVycm9yOiBuYXRpdmUgYml0bWFwIGlzIDAiKTsKICAgICAgICAgfQpAQCAtOTAsNiArOTcsMTMgQEAKICAgICAgICAgaWYgKGRlbnNpdHkgPj0gMCkgewogICAgICAgICAgICAgbURlbnNpdHkgPSBkZW5zaXR5OwogICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlIGZpbmFsaXplcnMgcXVldWUgaXMgbnVsbCwgd2UgYXJlIHJ1bm5pbmcgaW4genlnb3RlIGFuZCB0aGUKKyAgICAgICAgLy8gYml0bWFwIHdpbGwgbmV2ZXIgYmUgcmVjbGFpbWVkLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHJ1biBvdXIgbmF0aXZlCisgICAgICAgIC8vIGRlc3RydWN0b3IKKyAgICAgICAgaWYgKEZpbmFsaXplcnMuZ2V0UXVldWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBuZXcgQml0bWFwRmluYWxpemVyKHRoaXMpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzIsNiArMTg2LDE5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZ2VuZXJhdGlvbiBJRCBvZiB0aGlzIGJpdG1hcC4gVGhlIGdlbmVyYXRpb24gSUQgY2hhbmdlcworICAgICAqIHdoZW5ldmVyIHRoZSBiaXRtYXAgaXMgbW9kaWZpZWQuIFRoaXMgY2FuIGJlIHVzZWQgYXMgYW4gZWZmaWNpZW50IHdheSB0bworICAgICAqIGNoZWNrIGlmIGEgYml0bWFwIGhhcyBjaGFuZ2VkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgZ2VuZXJhdGlvbiBJRCBmb3IgdGhpcyBiaXRtYXAuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEdlbmVyYXRpb25JZCgpIHsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZUdlbmVyYXRpb25JZChtTmF0aXZlQml0bWFwKTsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogVGhpcyBpcyBjYWxsZWQgYnkgbWV0aG9kcyB0aGF0IHdhbnQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBiaXRtYXAKICAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIHJlY3ljbGVkLgogICAgICAqLwpAQCAtOTk5LDEyICsxMDI2LDIyIEBACiAgICAgICAgIG5hdGl2ZVByZXBhcmVUb0RyYXcobU5hdGl2ZUJpdG1hcCk7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdHJ5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCaXRtYXBGaW5hbGl6ZXIgZXh0ZW5kcyBGaW5hbGl6ZXJzLlJlY2xhaW1hYmxlUmVmZXJlbmNlPEJpdG1hcD4geworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Qml0bWFwRmluYWxpemVyPiBzRmluYWxpemVycyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldCgKKyAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxCaXRtYXBGaW5hbGl6ZXI+KCkpOworCisgICAgICAgIHByaXZhdGUgaW50IG1OYXRpdmVCaXRtYXA7CisKKyAgICAgICAgQml0bWFwRmluYWxpemVyKEJpdG1hcCBiKSB7CisgICAgICAgICAgICBzdXBlcihiLCBGaW5hbGl6ZXJzLmdldFF1ZXVlKCkpOworICAgICAgICAgICAgbU5hdGl2ZUJpdG1hcCA9IGIubU5hdGl2ZUJpdG1hcDsKKyAgICAgICAgICAgIHNGaW5hbGl6ZXJzLmFkZCh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZWNsYWltKCkgewogICAgICAgICAgICAgbmF0aXZlRGVzdHJ1Y3RvcihtTmF0aXZlQml0bWFwKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgICAgICBzRmluYWxpemVycy5yZW1vdmUodGhpcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEwNDEsNiArMTA3OCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlQ29weVBpeGVsc1RvQnVmZmVyKGludCBuYXRpdmVCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlciBkc3QpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvcHlQaXhlbHNGcm9tQnVmZmVyKGludCBuYiwgQnVmZmVyIHNyYyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVHZW5lcmF0aW9uSWQoaW50IG5hdGl2ZUJpdG1hcCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQml0bWFwIG5hdGl2ZUNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHApOwogICAgIC8vIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcEZhY3RvcnkuamF2YQppbmRleCAwMmUxNmNkLi41ZGJiZDcwIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBGYWN0b3J5LmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQub3MuTWVtb3J5RmlsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CiAKQEAgLTg0LDcgKzgzLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBwaXhlbCBkZW5zaXR5IHRvIHVzZSBmb3IgdGhlIGJpdG1hcC4gIFRoaXMgd2lsbCBhbHdheXMgcmVzdWx0CiAgICAgICAgICAqIGluIHRoZSByZXR1cm5lZCBiaXRtYXAgaGF2aW5nIGEgZGVuc2l0eSBzZXQgZm9yIGl0IChzZWUKLSAgICAgICAgICoge0BsaW5rIEJpdG1hcCNzZXREZW5zaXR5KGludCkgQml0bWFwLnNldERlbnNpdHkoaW50KSkuICBJbiBhZGRpdGlvbiwKKyAgICAgICAgICoge0BsaW5rIEJpdG1hcCNzZXREZW5zaXR5KGludCkgQml0bWFwLnNldERlbnNpdHkoaW50KSl9LiAgSW4gYWRkaXRpb24sCiAgICAgICAgICAqIGlmIHtAbGluayAjaW5TY2FsZWR9IGlzIHNldCAod2hpY2ggaXQgaXMgYnkgZGVmYXVsdH0gYW5kIHRoaXMKICAgICAgICAgICogZGVuc2l0eSBkb2VzIG5vdCBtYXRjaCB7QGxpbmsgI2luVGFyZ2V0RGVuc2l0eX0sIHRoZW4gdGhlIGJpdG1hcAogICAgICAgICAgKiB3aWxsIGJlIHNjYWxlZCB0byB0aGUgdGFyZ2V0IGRlbnNpdHkgYmVmb3JlIGJlaW5nIHJldHVybmVkLgpAQCAtNTA3LDkgKzUwNiw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gaXMgVGhlIGlucHV0IHN0cmVhbSB0aGF0IGhvbGRzIHRoZSByYXcgZGF0YSB0byBiZSBkZWNvZGVkIGludG8gYQogICAgICAqICAgICAgICAgICBiaXRtYXAuCi0gICAgICogQHJldHVybiBUaGUgZGVjb2RlZCBiaXRtYXAsIG9yIG51bGwgaWYgdGhlIGltYWdlIGRhdGEgY291bGQgbm90IGJlCi0gICAgICogICAgICAgICBkZWNvZGVkLCBvciwgaWYgb3B0cyBpcyBub24tbnVsbCwgaWYgb3B0cyByZXF1ZXN0ZWQgb25seSB0aGUKLSAgICAgKiAgICAgICAgIHNpemUgYmUgcmV0dXJuZWQgKGluIG9wdHMub3V0V2lkdGggYW5kIG9wdHMub3V0SGVpZ2h0KQorICAgICAqIEByZXR1cm4gVGhlIGRlY29kZWQgYml0bWFwLCBvciBudWxsIGlmIHRoZSBpbWFnZSBkYXRhIGNvdWxkIG5vdCBiZSBkZWNvZGVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQml0bWFwIGRlY29kZVN0cmVhbShJbnB1dFN0cmVhbSBpcykgewogICAgICAgICByZXR1cm4gZGVjb2RlU3RyZWFtKGlzLCBudWxsLCBudWxsKTsKQEAgLTUzMCwxOCArNTI3LDYgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIGJpdG1hcCwgb3IgbnVsbAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQml0bWFwIGRlY29kZUZpbGVEZXNjcmlwdG9yKEZpbGVEZXNjcmlwdG9yIGZkLCBSZWN0IG91dFBhZGRpbmcsIE9wdGlvbnMgb3B0cykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKE1lbW9yeUZpbGUuaXNNZW1vcnlGaWxlKGZkKSkgewotICAgICAgICAgICAgICAgIGludCBtYXBwZWRsZW5ndGggPSBNZW1vcnlGaWxlLmdldFNpemUoZmQpOwotICAgICAgICAgICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IG5ldyBNZW1vcnlGaWxlKGZkLCBtYXBwZWRsZW5ndGgsICJyIik7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBmaWxlLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgQml0bWFwIGJtID0gZGVjb2RlU3RyZWFtKGlzLCBvdXRQYWRkaW5nLCBvcHRzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmluaXNoRGVjb2RlKGJtLCBvdXRQYWRkaW5nLCBvcHRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIGludmFsaWQgZmlsZWRlc2NyaXB0b3IsIG5vIG5lZWQgdG8gY2FsbCBuYXRpdmVEZWNvZGVGaWxlRGVzY3JpcHRvcigpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQogICAgICAgICBCaXRtYXAgYm0gPSBuYXRpdmVEZWNvZGVGaWxlRGVzY3JpcHRvcihmZCwgb3V0UGFkZGluZywgb3B0cyk7CiAgICAgICAgIHJldHVybiBmaW5pc2hEZWNvZGUoYm0sIG91dFBhZGRpbmcsIG9wdHMpOwogICAgIH0KQEAgLTYyOCwxMiArNjEzLDYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIExhcmdlQml0bWFwIGNyZWF0ZUxhcmdlQml0bWFwKAogICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQsIGJvb2xlYW4gaXNTaGFyZWFibGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChNZW1vcnlGaWxlLmlzTWVtb3J5RmlsZShmZCkpIHsKLSAgICAgICAgICAgIGludCBtYXBwZWRsZW5ndGggPSBNZW1vcnlGaWxlLmdldFNpemUoZmQpOwotICAgICAgICAgICAgTWVtb3J5RmlsZSBmaWxlID0gbmV3IE1lbW9yeUZpbGUoZmQsIG1hcHBlZGxlbmd0aCwgInIiKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gZmlsZS5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxhcmdlQml0bWFwKGlzLCBpc1NoYXJlYWJsZSk7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5hdGl2ZUNyZWF0ZUxhcmdlQml0bWFwKGZkLCBpc1NoYXJlYWJsZSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwU2hhZGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwU2hhZGVyLmphdmEKaW5kZXggNjEyYjBhYi4uNGJhNjc5YiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFNoYWRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBTaGFkZXIuamF2YQpAQCAtMTYsMTAgKzE2LDE2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5ncmFwaGljczsKIAorLyoqCisgKiBTaGFkZXIgdXNlZCB0byBkcmF3IGEgYml0bWFwIGFzIGEgdGV4dHVyZS4gVGhlIGJpdG1hcCBjYW4gYmUgcmVwZWF0ZWQgb3IKKyAqIG1pcnJvcmVkIGJ5IHNldHRpbmcgdGhlIHRpbGluZyBtb2RlLgorICovCiBwdWJsaWMgY2xhc3MgQml0bWFwU2hhZGVyIGV4dGVuZHMgU2hhZGVyIHsKLQotICAgIC8vIHdlIGhvbGQgb24ganVzdCBmb3IgdGhlIEdDLCBzaW5jZSBvdXIgbmF0aXZlIGNvdW50ZXJwYXJ0IGlzIHVzaW5nIGl0Ci0gICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcDsKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50IGdhcmJhZ2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCIsICJVbnVzZWREZWNsYXJhdGlvbiJ9KQorICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXA7CiAKICAgICAvKioKICAgICAgKiBDYWxsIHRoaXMgdG8gY3JlYXRlIGEgbmV3IHNoYWRlciB0aGF0IHdpbGwgZHJhdyB3aXRoIGEgYml0bWFwLgpAQCAtMzAsMTIgKzM2LDEzIEBACiAgICAgICovCiAgICAgcHVibGljIEJpdG1hcFNoYWRlcihCaXRtYXAgYml0bWFwLCBUaWxlTW9kZSB0aWxlWCwgVGlsZU1vZGUgdGlsZVkpIHsKICAgICAgICAgbUJpdG1hcCA9IGJpdG1hcDsKLSAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ3JlYXRlKGJpdG1hcC5uaSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZVgubmF0aXZlSW50LCB0aWxlWS5uYXRpdmVJbnQpOworICAgICAgICBmaW5hbCBpbnQgYiA9IGJpdG1hcC5uaSgpOworICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDcmVhdGUoYiwgdGlsZVgubmF0aXZlSW50LCB0aWxlWS5uYXRpdmVJbnQpOworICAgICAgICBuYXRpdmVfc2hhZGVyID0gbmF0aXZlUG9zdENyZWF0ZShuYXRpdmVfaW5zdGFuY2UsIGIsIHRpbGVYLm5hdGl2ZUludCwgdGlsZVkubmF0aXZlSW50KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZShpbnQgbmF0aXZlX2JpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hhZGVyVGlsZU1vZGVYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGFkZXJUaWxlTW9kZVkpOyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZShpbnQgbmF0aXZlX2JpdG1hcCwgaW50IHNoYWRlclRpbGVNb2RlWCwKKyAgICAgICAgICAgIGludCBzaGFkZXJUaWxlTW9kZVkpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlUG9zdENyZWF0ZShpbnQgbmF0aXZlX3NoYWRlciwgaW50IG5hdGl2ZV9iaXRtYXAsCisgICAgICAgICAgICBpbnQgc2hhZGVyVGlsZU1vZGVYLCBpbnQgc2hhZGVyVGlsZU1vZGVZKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCmluZGV4IDc2Y2RlNzMuLmU3NWExOWUgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKQEAgLTE2LDExICsxNiwxMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7CiAKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkU3RyaW5nOwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkdyYXBoaWNzT3BlcmF0aW9uczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZFN0cmluZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogCiBpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0w7CiAKQEAgLTQzLDIyICs0MiwzOSBAQAogICAgICAgICBmb3IgYm90aCB0byBiZSBudWxsLgogICAgICovCiAgICAgcHJpdmF0ZSBCaXRtYXAgIG1CaXRtYXA7ICAgIC8vIGlmIG5vdCBudWxsLCBtR0wgbXVzdCBiZSBudWxsCi0gICAgcHJpdmF0ZSBHTCAgICAgIG1HTDsgICAgICAgIC8vIGlmIG5vdCBudWxsLCBtQml0bWFwIG11c3QgYmUgbnVsbAogICAgIAogICAgIC8vIG9wdGlvbmFsIGZpZWxkIHNldCBieSB0aGUgY2FsbGVyCi0gICAgcHJpdmF0ZSBEcmF3RmlsdGVyICBtRHJhd0ZpbHRlcjsKKyAgICBwcml2YXRlIERyYXdGaWx0ZXIgbURyYXdGaWx0ZXI7CiAKLSAgICAvLyBQYWNrYWdlLXNjb3BlZCBmb3IgcXVpY2sgYWNjZXNzLgotICAgIC8qcGFja2FnZSovIGludCBtRGVuc2l0eSA9IEJpdG1hcC5ERU5TSVRZX05PTkU7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG1EZW5zaXR5ID0gQml0bWFwLkRFTlNJVFlfTk9ORTsKIAotICAgIC8vIFVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gY29tcGF0aWJpbGl0eSBzY2FsaW5nIGlzIGluIGVmZmVjdC4KLSAgICBwcml2YXRlIGludCBtU2NyZWVuRGVuc2l0eSA9IEJpdG1hcC5ERU5TSVRZX05PTkU7CisgICAgLyoqCisgICAgICogVXNlZCB0byBkZXRlcm1pbmUgd2hlbiBjb21wYXRpYmlsaXR5IHNjYWxpbmcgaXMgaW4gZWZmZWN0LgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBtU2NyZWVuRGVuc2l0eSA9IEJpdG1hcC5ERU5TSVRZX05PTkU7CiAgICAgCiAgICAgLy8gVXNlZCBieSBuYXRpdmUgY29kZQogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKICAgICBwcml2YXRlIGludCAgICAgICAgIG1TdXJmYWNlRm9ybWF0OwogCiAgICAgLyoqCisgICAgICogRmxhZyBmb3IgZHJhd1RleHRSdW4gaW5kaWNhdGluZyBsZWZ0LXRvLXJpZ2h0IHJ1biBkaXJlY3Rpb24uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJFQ1RJT05fTFRSID0gMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciBkcmF3VGV4dFJ1biBpbmRpY2F0aW5nIHJpZ2h0LXRvLWxlZnQgcnVuIGRpcmVjdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9SVEwgPSAxOworICAgIAorICAgIC8qKgogICAgICAqIENvbnN0cnVjdCBhbiBlbXB0eSByYXN0ZXIgY2FudmFzLiBVc2Ugc2V0Qml0bWFwKCkgdG8gc3BlY2lmeSBhIGJpdG1hcCB0bwogICAgICAqIGRyYXcgaW50by4gIFRoZSBpbml0aWFsIHRhcmdldCBkZW5zaXR5IGlzIHtAbGluayBCaXRtYXAjREVOU0lUWV9OT05FfTsKICAgICAgKiB0aGlzIHdpbGwgdHlwaWNhbGx5IGJlIHJlcGxhY2VkIHdoZW4gYSB0YXJnZXQgYml0bWFwIGlzIHNldCBmb3IgdGhlCkBAIC04OSw0NyArMTA1LDM3IEBACiAgICAgICAgIG1EZW5zaXR5ID0gYml0bWFwLm1EZW5zaXR5OwogICAgIH0KICAgICAKLSAgICAvKnBhY2thZ2UqLyBDYW52YXMoaW50IG5hdGl2ZUNhbnZhcykgeworICAgIENhbnZhcyhpbnQgbmF0aXZlQ2FudmFzKSB7CiAgICAgICAgIGlmIChuYXRpdmVDYW52YXMgPT0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogICAgICAgICB9CiAgICAgICAgIG1OYXRpdmVDYW52YXMgPSBuYXRpdmVDYW52YXM7CiAgICAgICAgIG1EZW5zaXR5ID0gQml0bWFwLmdldERlZmF1bHREZW5zaXR5KCk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgY2FudmFzIHdpdGggdGhlIHNwZWNpZmllZCBnbCBjb250ZXh0LiBBbGwgZHJhd2luZyB0aHJvdWdoCi0gICAgICogdGhpcyBjYW52YXMgd2lsbCBiZSByZWRpcmVjdGVkIHRvIE9wZW5HTC4gTm90ZTogc29tZSBmZWF0dXJlcyBtYXkgbm90Ci0gICAgICogYmUgc3VwcG9ydGVkIGluIHRoaXMgbW9kZSAoZS5nLiBzb21lIEdMIGltcGxlbWVudGF0aW9ucyBtYXkgbm90IHN1cHBvcnQKLSAgICAgKiBhbnRpYWxpYXNpbmcgb3IgY2VydGFpbiBlZmZlY3RzIGxpa2UgQ29sb3JNYXRyaXggb3IgY2VydGFpbiBYZmVybW9kZXMpLgotICAgICAqIEhvd2V2ZXIsIG5vIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpbiB0aG9zZSBjYXNlcy4KKyAgICAgKiBSZXR1cm5zIG51bGwuCiAgICAgICogCi0gICAgICogPHA+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/IG1PdXRlclJhZGlpLmNsb25lKCkgOiBudWxsOworICAgICAgICBzaGFwZS5tSW5uZXJSYWRpaSA9IG1Jbm5lclJhZGlpICE9IG51bGwgPyBtSW5uZXJSYWRpaS5jbG9uZSgpIDogbnVsbDsKICAgICAgICAgc2hhcGUubUluc2V0ID0gbmV3IFJlY3RGKG1JbnNldCk7CiAgICAgICAgIHNoYXBlLm1Jbm5lclJlY3QgPSBuZXcgUmVjdEYobUlubmVyUmVjdCk7CiAgICAgICAgIHNoYXBlLm1QYXRoID0gbmV3IFBhdGgobVBhdGgpOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9BbGxvY2F0aW9uLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0FsbG9jYXRpb24uamF2YQppbmRleCBiMjdjN2Y1Li5lZTVkYmMxIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0FsbG9jYXRpb24uamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0FsbG9jYXRpb24uamF2YQpAQCAtMzUsMTEgKzM1LDI1IEBACiAgICAgQml0bWFwIG1CaXRtYXA7CiAKICAgICBBbGxvY2F0aW9uKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzLCBUeXBlIHQpIHsKLSAgICAgICAgc3VwZXIocnMpOwotICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICAgICAgbVR5cGUgPSB0OwogICAgIH0KIAorICAgIEFsbG9jYXRpb24oaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIHVwZGF0ZUZyb21OYXRpdmUoKSB7CisgICAgICAgIG1SUy52YWxpZGF0ZSgpOworICAgICAgICBtTmFtZSA9IG1SUy5uR2V0TmFtZShtSUQpOworICAgICAgICBpbnQgdHlwZUlEID0gbVJTLm5BbGxvY2F0aW9uR2V0VHlwZShtSUQpOworICAgICAgICBpZih0eXBlSUQgIT0gMCkgeworICAgICAgICAgICAgbVR5cGUgPSBuZXcgVHlwZSh0eXBlSUQsIG1SUyk7CisgICAgICAgICAgICBtVHlwZS51cGRhdGVGcm9tTmF0aXZlKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgewogICAgICAgICByZXR1cm4gbVR5cGU7CiAgICAgfQpAQCAtNzYsMTAgKzkwLDUwIEBACiAgICAgICAgIHN1YkRhdGExRCgwLCBtVHlwZS5nZXRFbGVtZW50Q291bnQoKSwgZCk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgc3ViRGF0YShpbnQgeG9mZiwgRmllbGRQYWNrZXIgZnApIHsKKyAgICAgICAgaW50IGVTaXplID0gbVR5cGUubUVsZW1lbnQuZ2V0U2l6ZUJ5dGVzKCk7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhID0gZnAuZ2V0RGF0YSgpOworCisgICAgICAgIGludCBjb3VudCA9IGRhdGEubGVuZ3RoIC8gZVNpemU7CisgICAgICAgIGlmICgoZVNpemUgKiBjb3VudCkgIT0gZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkIHBhY2tlciBsZW5ndGggIiArIGRhdGEubGVuZ3RoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBub3QgZGl2aXNpYmxlIGJ5IGVsZW1lbnQgc2l6ZSAiICsgZVNpemUgKyAiLiIpOworICAgICAgICB9CisgICAgICAgIGRhdGExRENoZWNrcyh4b2ZmLCBjb3VudCwgZGF0YS5sZW5ndGgsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgbVJTLm5BbGxvY2F0aW9uU3ViRGF0YTFEKG1JRCwgeG9mZiwgY291bnQsIGRhdGEsIGRhdGEubGVuZ3RoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHN1YkVsZW1lbnREYXRhKGludCB4b2ZmLCBpbnQgY29tcG9uZW50X251bWJlciwgRmllbGRQYWNrZXIgZnApIHsKKyAgICAgICAgaWYgKGNvbXBvbmVudF9udW1iZXIgPj0gbVR5cGUubUVsZW1lbnQubUVsZW1lbnRzLmxlbmd0aCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29tcG9uZW50X251bWJlciAiICsgY29tcG9uZW50X251bWJlciArICIgb3V0IG9mIHJhbmdlLiIpOworICAgICAgICB9CisgICAgICAgIGlmKHhvZmYgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPZmZzZXQgbXVzdCBiZSA+PSAwLiIpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgYnl0ZVtdIGRhdGEgPSBmcC5nZXREYXRhKCk7CisgICAgICAgIGludCBlU2l6ZSA9IG1UeXBlLm1FbGVtZW50Lm1FbGVtZW50c1tjb21wb25lbnRfbnVtYmVyXS5nZXRTaXplQnl0ZXMoKTsKKworICAgICAgICBpZiAoZGF0YS5sZW5ndGggIT0gZVNpemUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkIHBhY2tlciBzaXplbGVuZ3RoICIgKyBkYXRhLmxlbmd0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgbWF0Y2ggY29tcG9uZW50IHNpemUgIiArIGVTaXplICsgIi4iKTsKKyAgICAgICAgfQorCisgICAgICAgIG1SUy5uQWxsb2NhdGlvblN1YkVsZW1lbnREYXRhMUQobUlELCB4b2ZmLCBjb21wb25lbnRfbnVtYmVyLCBkYXRhLCBkYXRhLmxlbmd0aCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGRhdGExRENoZWNrcyhpbnQgb2ZmLCBpbnQgY291bnQsIGludCBsZW4sIGludCBkYXRhU2l6ZSkgewogICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgaWYoKG9mZiA8IDApIHx8IChjb3VudCA8IDEpIHx8ICgob2ZmICsgY291bnQpID4gbVR5cGUuZ2V0RWxlbWVudENvdW50KCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPZmZzZXQgb3IgQ291bnQgb3V0IG9mIGJvdW5kcy4iKTsKKyAgICAgICAgaWYob2ZmIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT2Zmc2V0IG11c3QgYmUgPj0gMC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZihjb3VudCA8IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvdW50IG11c3QgYmUgPj0gMS4iKTsKKyAgICAgICAgfQorICAgICAgICBpZigob2ZmICsgY291bnQpID4gbVR5cGUuZ2V0RWxlbWVudENvdW50KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk92ZXJmbG93LCBBdmFpbGFibGUgY291bnQgIiArIG1UeXBlLmdldEVsZW1lbnRDb3VudCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgZ290ICIgKyBjb3VudCArICIgYXQgb2Zmc2V0ICIgKyBvZmYgKyAiLiIpOwogICAgICAgICB9CiAgICAgICAgIGlmKChsZW4pIDwgZGF0YVNpemUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFycmF5IHRvbyBzbWFsbCBmb3IgYWxsb2NhdGlvbiB0eXBlLiIpOwpAQCAtMTQ2LDggKzIwMCw3IEBACiAKICAgICBwdWJsaWMgY2xhc3MgQWRhcHRlcjFEIGV4dGVuZHMgQmFzZU9iaiB7CiAgICAgICAgIEFkYXB0ZXIxRChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewotICAgICAgICAgICAgc3VwZXIocnMpOwotICAgICAgICAgICAgbUlEID0gaWQ7CisgICAgICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgc2V0Q29uc3RyYWludChEaW1lbnNpb24gZGltLCBpbnQgdmFsdWUpIHsKQEAgLTE4OSw4ICsyNDIsNyBAQAogCiAgICAgcHVibGljIGNsYXNzIEFkYXB0ZXIyRCBleHRlbmRzIEJhc2VPYmogewogICAgICAgICBBZGFwdGVyMkQoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgICAgIG1JRCA9IGlkOworICAgICAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbnN0cmFpbnQoRGltZW5zaW9uIGRpbSwgaW50IHZhbHVlKSB7CkBAIC0zNzcsNiArNDI5LDIxIEBACiAgICAgICAgIEJpdG1hcCBiID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShyZXMsIGlkLCBtQml0bWFwT3B0aW9ucyk7CiAgICAgICAgIHJldHVybiBjcmVhdGVGcm9tQml0bWFwQm94ZWQocnMsIGIsIGRzdEZtdCwgZ2VuTWlwcyk7CiAgICAgfQorCisgICAgc3RhdGljIHB1YmxpYyBBbGxvY2F0aW9uIGNyZWF0ZUZyb21TdHJpbmcoUmVuZGVyU2NyaXB0IHJzLCBTdHJpbmcgc3RyKQorICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGFsbG9jQXJyYXkgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYWxsb2NBcnJheSA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKKyAgICAgICAgICAgIEFsbG9jYXRpb24gYWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKHJzLCBFbGVtZW50LlU4KHJzKSwgYWxsb2NBcnJheS5sZW5ndGgpOworICAgICAgICAgICAgYWxsb2MuZGF0YShhbGxvY0FycmF5KTsKKyAgICAgICAgICAgIHJldHVybiBhbGxvYzsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKCJycyIsICJjb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gdXRmLTgiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiB9CiAKIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CYXNlT2JqLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Jhc2VPYmouamF2YQppbmRleCAwMDJmYzc4Li4zMTk4ZTNmIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Jhc2VPYmouamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Jhc2VPYmouamF2YQpAQCAtMjQsMTAgKzI0LDEwIEBACiAgKiovCiBjbGFzcyBCYXNlT2JqIHsKIAotICAgIEJhc2VPYmooUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgQmFzZU9iaihpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewogICAgICAgICBycy52YWxpZGF0ZSgpOwogICAgICAgICBtUlMgPSByczsKLSAgICAgICAgbUlEID0gMDsKKyAgICAgICAgbUlEID0gaWQ7CiAgICAgICAgIG1EZXN0cm95ZWQgPSBmYWxzZTsKICAgICB9CiAKQEAgLTYyLDcgKzYyLDcgQEAKICAgICB7CiAgICAgICAgIGlmICghbURlc3Ryb3llZCkgewogICAgICAgICAgICAgaWYobUlEICE9IDAgJiYgbVJTLmlzQWxpdmUoKSkgewotICAgICAgICAgICAgICAgIG1SUy5uT2JqRGVzdHJveU9PQihtSUQpOworICAgICAgICAgICAgICAgIG1SUy5uT2JqRGVzdHJveShtSUQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVJTID0gbnVsbDsKICAgICAgICAgICAgIG1JRCA9IDA7CkBAIC04MSw1ICs4MSwxMCBAQAogICAgICAgICBtUlMubk9iakRlc3Ryb3kobUlEKTsKICAgICB9CiAKKyAgICAvLyBJZiBhbiBvYmplY3QgY2FtZSBmcm9tIGFuIGEzZCBmaWxlLCBqYXZhIGZpZWxkcyBuZWVkIHRvIGJlCisgICAgLy8gY3JlYXRlZCB3aXRoIG9iamVjdHMgZnJvbSB0aGUgbmF0aXZlIGxheWVyCisgICAgdm9pZCB1cGRhdGVGcm9tTmF0aXZlKCkgeworICAgIH0KKwogfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGUyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGUyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjZjg4YwotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBCeXRlMiB7CisgICAgcHVibGljIEJ5dGUyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBieXRlIHg7CisgICAgcHVibGljIGJ5dGUgeTsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlMy5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YzBjYTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGUzLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgQnl0ZTMgeworICAgIHB1YmxpYyBCeXRlMygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSB4OworICAgIHB1YmxpYyBieXRlIHk7CisgICAgcHVibGljIGJ5dGUgejsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlNC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YmZjNjEKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGU0LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgQnl0ZTQgeworICAgIHB1YmxpYyBCeXRlNCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSB4OworICAgIHB1YmxpYyBieXRlIHk7CisgICAgcHVibGljIGJ5dGUgejsKKyAgICBwdWJsaWMgYnl0ZSB3OworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9FbGVtZW50LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0VsZW1lbnQuamF2YQppbmRleCAxMGVmMDVhLi5lZDA5Zjg5IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0VsZW1lbnQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0VsZW1lbnQuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIC8qKgogICogQGhpZGUKQEAgLTQ3LDIwICs0OCwyNiBAQAogICAgICAgICBVTlNJR05FRF8zMiAoMTAsIDQpLAogICAgICAgICAvL1VOU0lHTkVEXzY0ICgxMSwgOCksCiAKLSAgICAgICAgVU5TSUdORURfNV82XzUgKDEyLCAyKSwKLSAgICAgICAgVU5TSUdORURfNV81XzVfMSAoMTMsIDIpLAotICAgICAgICBVTlNJR05FRF80XzRfNF80ICgxNCwgMiksCisgICAgICAgIEJPT0xFQU4oMTIsIDEpLAogCi0gICAgICAgIFJTX0VMRU1FTlQgKDE1LCA0KSwKLSAgICAgICAgUlNfVFlQRSAoMTYsIDQpLAotICAgICAgICBSU19BTExPQ0FUSU9OICgxNywgNCksCi0gICAgICAgIFJTX1NBTVBMRVIgKDE4LCA0KSwKLSAgICAgICAgUlNfU0NSSVBUICgxOSwgNCksCi0gICAgICAgIFJTX01FU0ggKDIwLCA0KSwKLSAgICAgICAgUlNfUFJPR1JBTV9GUkFHTUVOVCAoMjEsIDQpLAotICAgICAgICBSU19QUk9HUkFNX1ZFUlRFWCAoMjIsIDQpLAotICAgICAgICBSU19QUk9HUkFNX1JBU1RFUiAoMjMsIDQpLAotICAgICAgICBSU19QUk9HUkFNX1NUT1JFICgyNCwgNCk7CisgICAgICAgIFVOU0lHTkVEXzVfNl81ICgxMywgMiksCisgICAgICAgIFVOU0lHTkVEXzVfNV81XzEgKDE0LCAyKSwKKyAgICAgICAgVU5TSUdORURfNF80XzRfNCAoMTUsIDIpLAorCisgICAgICAgIE1BVFJJWF80WDQgKDE2LCA2NCksCisgICAgICAgIE1BVFJJWF8zWDMgKDE3LCAzNiksCisgICAgICAgIE1BVFJJWF8yWDIgKDE4LCAxNiksCisKKyAgICAgICAgUlNfRUxFTUVOVCAoMTAwMCwgNCksCisgICAgICAgIFJTX1RZUEUgKDEwMDEsIDQpLAorICAgICAgICBSU19BTExPQ0FUSU9OICgxMDAyLCA0KSwKKyAgICAgICAgUlNfU0FNUExFUiAoMTAwMywgNCksCisgICAgICAgIFJTX1NDUklQVCAoMTAwNCwgNCksCisgICAgICAgIFJTX01FU0ggKDEwMDUsIDQpLAorICAgICAgICBSU19QUk9HUkFNX0ZSQUdNRU5UICgxMDA2LCA0KSwKKyAgICAgICAgUlNfUFJPR1JBTV9WRVJURVggKDEwMDcsIDQpLAorICAgICAgICBSU19QUk9HUkFNX1JBU1RFUiAoMTAwOCwgNCksCisgICAgICAgIFJTX1BST0dSQU1fU1RPUkUgKDEwMDksIDQpOwogCiAgICAgICAgIGludCBtSUQ7CiAgICAgICAgIGludCBtU2l6ZTsKQEAgLTcyLDEyICs3OSw2IEBACiAKICAgICBwdWJsaWMgZW51bSBEYXRhS2luZCB7CiAgICAgICAgIFVTRVIgKDApLAotICAgICAgICBDT0xPUiAoMSksCi0gICAgICAgIFBPU0lUSU9OICgyKSwKLSAgICAgICAgVEVYVFVSRSAoMyksCi0gICAgICAgIE5PUk1BTCAoNCksCi0gICAgICAgIElOREVYICg1KSwKLSAgICAgICAgUE9JTlRfU0laRSg2KSwKIAogICAgICAgICBQSVhFTF9MICg3KSwKICAgICAgICAgUElYRUxfQSAoOCksCkBAIC05MSw0MSArOTIsMTMzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9VOChSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfVVNFUl9VOCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9VU0VSX1U4ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfOCk7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEJPT0xFQU4oUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0JPT0xFQU4gPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfQk9PTEVBTiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLkJPT0xFQU4pOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VU0VSX1U4OworICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfQk9PTEVBTjsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9JOChSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfVVNFUl9JOCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9VU0VSX0k4ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzgpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBVOChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVTggPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfVTggPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5VTlNJR05FRF84KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9JODsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1U4OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBVU0VSX1UzMihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfVVNFUl9VMzIgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfVVNFUl9VMzIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5VTlNJR05FRF8zMik7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEk4KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9JOCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9JOCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF84KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9VMzI7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9JODsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9JMzIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfSTMyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1VTRVJfSTMyID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzMyKTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVTE2KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9VMTYgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfVTE2ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfMTYpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VU0VSX0kzMjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1UxNjsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9GMzIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfRjMyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1VTRVJfRjMyID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuRkxPQVRfMzIpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBJMTYoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0kxNiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9JMTYgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfMTYpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VU0VSX0YzMjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0kxNjsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVTMyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9VMzIgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfVTMyID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfMzIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VMzI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEkzMihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfSTMyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0kzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF8zMik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0kzMjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgRjMyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9GMzIgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfRjMyID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuRkxPQVRfMzIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9GMzI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEVMRU1FTlQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0VMRU1FTlQgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfRUxFTUVOVCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX0VMRU1FTlQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9FTEVNRU5UOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBUWVBFKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9UWVBFID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1RZUEUgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19UWVBFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVFlQRTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgQUxMT0NBVElPTihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfQUxMT0NBVElPTiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9BTExPQ0FUSU9OID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfQUxMT0NBVElPTik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0FMTE9DQVRJT047CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFNBTVBMRVIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1NBTVBMRVIgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfU0FNUExFUiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX1NBTVBMRVIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9TQU1QTEVSOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBTQ1JJUFQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1NDUklQVCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9TQ1JJUFQgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19TQ1JJUFQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9TQ1JJUFQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IE1FU0goUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X01FU0ggPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfTUVTSCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX01FU0gpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9NRVNIOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBQUk9HUkFNX0ZSQUdNRU5UKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9QUk9HUkFNX0ZSQUdNRU5UID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1BST0dSQU1fRlJBR01FTlQgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19QUk9HUkFNX0ZSQUdNRU5UKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUFJPR1JBTV9GUkFHTUVOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgUFJPR1JBTV9WRVJURVgoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1BST0dSQU1fVkVSVEVYID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1BST0dSQU1fVkVSVEVYID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfUFJPR1JBTV9WRVJURVgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9QUk9HUkFNX1ZFUlRFWDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgUFJPR1JBTV9SQVNURVIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1BST0dSQU1fUkFTVEVSID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1BST0dSQU1fUkFTVEVSID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfUFJPR1JBTV9SQVNURVIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9QUk9HUkFNX1JBU1RFUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgUFJPR1JBTV9TVE9SRShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfUFJPR1JBTV9TVE9SRSA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9QUk9HUkFNX1NUT1JFID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfUFJPR1JBTV9TVE9SRSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1BST0dSQU1fU1RPUkU7CisgICAgfQorCisKICAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgQV84KFJlbmRlclNjcmlwdCBycykgewogICAgICAgICBpZihycy5tRWxlbWVudF9BXzggPT0gbnVsbCkgewogICAgICAgICAgICAgcnMubUVsZW1lbnRfQV84ID0gY3JlYXRlUGl4ZWwocnMsIERhdGFUeXBlLlVOU0lHTkVEXzgsIERhdGFLaW5kLlBJWEVMX0EpOwpAQCAtMTY4LDE2OCArMjYxLDE0MCBAQAogICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUkdCQV84ODg4OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBJTkRFWF8xNihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfSU5ERVhfMTYgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfSU5ERVhfMTYgPSBjcmVhdGVJbmRleChycyk7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEYzMl8yKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9GTE9BVF8yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0ZMT0FUXzIgPSBjcmVhdGVWZWN0b3IocnMsIERhdGFUeXBlLkZMT0FUXzMyLCAyKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfSU5ERVhfMTY7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9GTE9BVF8yOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfUE9TSVRJT05fMihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfUE9TSVRJT05fMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9QT1NJVElPTl8yID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgRGF0YUtpbmQuUE9TSVRJT04sIDIpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBGMzJfMyhSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfRkxPQVRfMyA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9GTE9BVF8zID0gY3JlYXRlVmVjdG9yKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgMyk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1BPU0lUSU9OXzI7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9GTE9BVF8zOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfUE9TSVRJT05fMyhSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfUE9TSVRJT05fMyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9QT1NJVElPTl8zID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgRGF0YUtpbmQuUE9TSVRJT04sIDMpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBGMzJfNChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfRkxPQVRfNCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9GTE9BVF80ID0gY3JlYXRlVmVjdG9yKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgNCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1BPU0lUSU9OXzM7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9GTE9BVF80OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfVEVYVFVSRV8yKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9URVhUVVJFXzIgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfVEVYVFVSRV8yID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgRGF0YUtpbmQuVEVYVFVSRSwgMik7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFU4XzQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1VDSEFSXzQgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfVUNIQVJfNCA9IGNyZWF0ZVZlY3RvcihycywgRGF0YVR5cGUuVU5TSUdORURfOCwgNCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1RFWFRVUkVfMjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1VDSEFSXzQ7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9OT1JNQUxfMyhSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfTk9STUFMXzMgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfTk9STUFMXzMgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5OT1JNQUwsIDMpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBNQVRSSVhfNFg0KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9NQVRSSVhfNFg0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X01BVFJJWF80WDQgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5NQVRSSVhfNFg0KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfTk9STUFMXzM7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9NQVRSSVhfNFg0OworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgTUFUUklYNFg0KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICByZXR1cm4gTUFUUklYXzRYNChycyk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9DT0xPUl9VOF80KFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9DT0xPUl9VOF80ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X0NPTE9SX1U4XzQgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLlVOU0lHTkVEXzgsIERhdGFLaW5kLkNPTE9SLCA0KTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgTUFUUklYXzNYMyhSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfTUFUUklYXzNYMyA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9NQVRSSVhfM1gzID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuTUFUUklYXzNYMyk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0NPTE9SX1U4XzQ7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9NQVRSSVhfNFg0OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfQ09MT1JfRjMyXzQoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X0NPTE9SX0YzMl80ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X0NPTE9SX0YzMl80ID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgRGF0YUtpbmQuQ09MT1IsIDQpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBNQVRSSVhfMlgyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9NQVRSSVhfMlgyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X01BVFJJWF8yWDIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5NQVRSSVhfMlgyKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfQ09MT1JfRjMyXzQ7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9NQVRSSVhfMlgyOwogICAgIH0KIAotICAgIEVsZW1lbnQoUmVuZGVyU2NyaXB0IHJzLCBFbGVtZW50W10gZSwgU3RyaW5nW10gbikgewotICAgICAgICBzdXBlcihycyk7CisgICAgRWxlbWVudChpbnQgaWQsIFJlbmRlclNjcmlwdCBycywgRWxlbWVudFtdIGUsIFN0cmluZ1tdIG4pIHsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICAgICAgbVNpemUgPSAwOwogICAgICAgICBtRWxlbWVudHMgPSBlOwogICAgICAgICBtRWxlbWVudE5hbWVzID0gbjsKLSAgICAgICAgaW50W10gaWRzID0gbmV3IGludFttRWxlbWVudHMubGVuZ3RoXTsKICAgICAgICAgZm9yIChpbnQgY3QgPSAwOyBjdCA8IG1FbGVtZW50cy5sZW5ndGg7IGN0KysgKSB7CiAgICAgICAgICAgICBtU2l6ZSArPSBtRWxlbWVudHNbY3RdLm1TaXplOwotICAgICAgICAgICAgaWRzW2N0XSA9IG1FbGVtZW50c1tjdF0ubUlEOwogICAgICAgICB9Ci0gICAgICAgIG1JRCA9IHJzLm5FbGVtZW50Q3JlYXRlMihpZHMsIG1FbGVtZW50TmFtZXMpOwogICAgIH0KIAotICAgIEVsZW1lbnQoUmVuZGVyU2NyaXB0IHJzLCBEYXRhVHlwZSBkdCwgRGF0YUtpbmQgZGssIGJvb2xlYW4gbm9ybSwgaW50IHNpemUpIHsKLSAgICAgICAgc3VwZXIocnMpOworICAgIEVsZW1lbnQoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMsIERhdGFUeXBlIGR0LCBEYXRhS2luZCBkaywgYm9vbGVhbiBub3JtLCBpbnQgc2l6ZSkgeworICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgICAgICBtU2l6ZSA9IGR0Lm1TaXplICogc2l6ZTsKICAgICAgICAgbVR5cGUgPSBkdDsKICAgICAgICAgbUtpbmQgPSBkazsKICAgICAgICAgbU5vcm1hbGl6ZWQgPSBub3JtOwogICAgICAgICBtVmVjdG9yU2l6ZSA9IHNpemU7Ci0gICAgICAgIG1JRCA9IHJzLm5FbGVtZW50Q3JlYXRlKGR0Lm1JRCwgZGsubUlELCBub3JtLCBzaXplKTsKKyAgICB9CisKKyAgICBFbGVtZW50KGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCB1cGRhdGVGcm9tTmF0aXZlKCkgeworCisgICAgICAgIC8vIHdlIHdpbGwgcGFjayBtVHlwZTsgbUtpbmQ7IG1Ob3JtYWxpemVkOyBtVmVjdG9yU2l6ZTsgTnVtU3ViRWxlbWVudHMKKyAgICAgICAgaW50W10gZGF0YUJ1ZmZlciA9IG5ldyBpbnRbNV07CisgICAgICAgIG1SUy5uRWxlbWVudEdldE5hdGl2ZURhdGEobUlELCBkYXRhQnVmZmVyKTsKKworICAgICAgICBtTm9ybWFsaXplZCA9IGRhdGFCdWZmZXJbMl0gPT0gMSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgbVZlY3RvclNpemUgPSBkYXRhQnVmZmVyWzNdOworICAgICAgICBtU2l6ZSA9IDA7CisgICAgICAgIGZvciAoRGF0YVR5cGUgZHQ6IERhdGFUeXBlLnZhbHVlcygpKSB7CisgICAgICAgICAgICBpZihkdC5tSUQgPT0gZGF0YUJ1ZmZlclswXSl7CisgICAgICAgICAgICAgICAgbVR5cGUgPSBkdDsKKyAgICAgICAgICAgICAgICBtU2l6ZSA9IG1UeXBlLm1TaXplICogbVZlY3RvclNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChEYXRhS2luZCBkazogRGF0YUtpbmQudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGlmKGRrLm1JRCA9PSBkYXRhQnVmZmVyWzFdKXsKKyAgICAgICAgICAgICAgICBtS2luZCA9IGRrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IG51bVN1YkVsZW1lbnRzID0gZGF0YUJ1ZmZlcls0XTsKKyAgICAgICAgaWYobnVtU3ViRWxlbWVudHMgPiAwKSB7CisgICAgICAgICAgICBtRWxlbWVudHMgPSBuZXcgRWxlbWVudFtudW1TdWJFbGVtZW50c107CisgICAgICAgICAgICBtRWxlbWVudE5hbWVzID0gbmV3IFN0cmluZ1tudW1TdWJFbGVtZW50c107CisKKyAgICAgICAgICAgIGludFtdIHN1YkVsZW1lbnRJZHMgPSBuZXcgaW50W251bVN1YkVsZW1lbnRzXTsKKyAgICAgICAgICAgIG1SUy5uRWxlbWVudEdldFN1YkVsZW1lbnRzKG1JRCwgc3ViRWxlbWVudElkcywgbUVsZW1lbnROYW1lcyk7CisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtU3ViRWxlbWVudHM7IGkgKyspIHsKKyAgICAgICAgICAgICAgICBtRWxlbWVudHNbaV0gPSBuZXcgRWxlbWVudChzdWJFbGVtZW50SWRzW2ldLCBtUlMpOworICAgICAgICAgICAgICAgIG1FbGVtZW50c1tpXS51cGRhdGVGcm9tTmF0aXZlKCk7CisgICAgICAgICAgICAgICAgbVNpemUgKz0gbUVsZW1lbnRzW2ldLm1TaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLmRlc3Ryb3koKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlRnJvbUNsYXNzKFJlbmRlclNjcmlwdCBycywgQ2xhc3MgYykgewotICAgICAgICBycy52YWxpZGF0ZSgpOwotICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGMuZ2V0RmllbGRzKCk7Ci0gICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzKTsKLQotICAgICAgICBmb3IoRmllbGQgZjogZmllbGRzKSB7Ci0gICAgICAgICAgICBDbGFzcyBmYyA9IGYuZ2V0VHlwZSgpOwotICAgICAgICAgICAgaWYoZmMgPT0gaW50LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgYi5hZGQoY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzMyKSwgZi5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmKGZjID09IHNob3J0LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgYi5hZGQoY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzE2KSwgZi5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmKGZjID09IGJ5dGUuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBiLmFkZChjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfOCksIGYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBmbG9hdC5jbGFzcykgewotICAgICAgICAgICAgICAgIGIuYWRkKGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLkZMT0FUXzMyKSwgZi5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtvd24gZmllbGQgdHlwZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiLmNyZWF0ZSgpOwotICAgIH0KLQotCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlVXNlcihSZW5kZXJTY3JpcHQgcnMsIERhdGFUeXBlIGR0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudChycywgZHQsIERhdGFLaW5kLlVTRVIsIGZhbHNlLCAxKTsKKyAgICAgICAgRGF0YUtpbmQgZGsgPSBEYXRhS2luZC5VU0VSOworICAgICAgICBib29sZWFuIG5vcm0gPSBmYWxzZTsKKyAgICAgICAgaW50IHZlY1NpemUgPSAxOworICAgICAgICBpbnQgaWQgPSBycy5uRWxlbWVudENyZWF0ZShkdC5tSUQsIGRrLm1JRCwgbm9ybSwgdmVjU2l6ZSk7CisgICAgICAgIHJldHVybiBuZXcgRWxlbWVudChpZCwgcnMsIGR0LCBkaywgbm9ybSwgdmVjU2l6ZSk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZVZlY3RvcihSZW5kZXJTY3JpcHQgcnMsIERhdGFUeXBlIGR0LCBpbnQgc2l6ZSkgewogICAgICAgICBpZiAoc2l6ZSA8IDIgfHwgc2l6ZSA+IDQpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBzaXplIik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KHJzLCBkdCwgRGF0YUtpbmQuVVNFUiwgZmFsc2UsIHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVJbmRleChSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KHJzLCBEYXRhVHlwZS5VTlNJR05FRF8xNiwgRGF0YUtpbmQuSU5ERVgsIGZhbHNlLCAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlQXR0cmliKFJlbmRlclNjcmlwdCBycywgRGF0YVR5cGUgZHQsIERhdGFLaW5kIGRrLCBpbnQgc2l6ZSkgewotICAgICAgICBpZiAoIShkdCA9PSBEYXRhVHlwZS5GTE9BVF8zMiB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5VTlNJR05FRF84IHx8Ci0gICAgICAgICAgICAgIGR0ID09IERhdGFUeXBlLlVOU0lHTkVEXzE2IHx8Ci0gICAgICAgICAgICAgIGR0ID09IERhdGFUeXBlLlVOU0lHTkVEXzMyIHx8Ci0gICAgICAgICAgICAgIGR0ID09IERhdGFUeXBlLlNJR05FRF84IHx8Ci0gICAgICAgICAgICAgIGR0ID09IERhdGFUeXBlLlNJR05FRF8xNiB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5TSUdORURfMzIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBEYXRhVHlwZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEoZGsgPT0gRGF0YUtpbmQuQ09MT1IgfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuUE9TSVRJT04gfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuVEVYVFVSRSB8fAotICAgICAgICAgICAgICBkayA9PSBEYXRhS2luZC5OT1JNQUwgfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuUE9JTlRfU0laRSB8fAotICAgICAgICAgICAgICBkayA9PSBEYXRhS2luZC5VU0VSKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgRGF0YUtpbmQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkayA9PSBEYXRhS2luZC5DT0xPUiAmJgotICAgICAgICAgICAgKChkdCAhPSBEYXRhVHlwZS5GTE9BVF8zMiAmJiBkdCAhPSBEYXRhVHlwZS5VTlNJR05FRF84KSB8fAotICAgICAgICAgICAgIHNpemUgPCAzIHx8IHNpemUgPiA0KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGNvbWJvIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRrID09IERhdGFLaW5kLlBPU0lUSU9OICYmIChzaXplIDwgMSB8fCBzaXplID4gNCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBjb21ibyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkayA9PSBEYXRhS2luZC5URVhUVVJFICYmCi0gICAgICAgICAgICAoZHQgIT0gRGF0YVR5cGUuRkxPQVRfMzIgfHwgc2l6ZSA8IDEgfHwgc2l6ZSA+IDQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgY29tYm8iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGsgPT0gRGF0YUtpbmQuTk9STUFMICYmCi0gICAgICAgICAgICAoZHQgIT0gRGF0YVR5cGUuRkxPQVRfMzIgfHwgc2l6ZSAhPSAzKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGNvbWJvIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRrID09IERhdGFLaW5kLlBPSU5UX1NJWkUgJiYKLSAgICAgICAgICAgIChkdCAhPSBEYXRhVHlwZS5GTE9BVF8zMiB8fCBzaXplICE9IDEpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgY29tYm8iKTsKLSAgICAgICAgfQotCisgICAgICAgIERhdGFLaW5kIGRrID0gRGF0YUtpbmQuVVNFUjsKICAgICAgICAgYm9vbGVhbiBub3JtID0gZmFsc2U7Ci0gICAgICAgIGlmIChkayA9PSBEYXRhS2luZC5DT0xPUiAmJiBkdCA9PSBEYXRhVHlwZS5VTlNJR05FRF84KSB7Ci0gICAgICAgICAgICBub3JtID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudChycywgZHQsIGRrLCBub3JtLCBzaXplKTsKKyAgICAgICAgaW50IGlkID0gcnMubkVsZW1lbnRDcmVhdGUoZHQubUlELCBkay5tSUQsIG5vcm0sIHNpemUpOworICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQoaWQsIHJzLCBkdCwgZGssIG5vcm0sIHNpemUpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVQaXhlbChSZW5kZXJTY3JpcHQgcnMsIERhdGFUeXBlIGR0LCBEYXRhS2luZCBkaykgewpAQCAtMzY3LDcgKzQzMiw5IEBACiAgICAgICAgICAgICBzaXplID0gNDsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudChycywgZHQsIGRrLCB0cnVlLCBzaXplKTsKKyAgICAgICAgYm9vbGVhbiBub3JtID0gdHJ1ZTsKKyAgICAgICAgaW50IGlkID0gcnMubkVsZW1lbnRDcmVhdGUoZHQubUlELCBkay5tSUQsIG5vcm0sIHNpemUpOworICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQoaWQsIHJzLCBkdCwgZGssIG5vcm0sIHNpemUpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CkBAIC00MDMsNyArNDcwLDEzIEBACiAgICAgICAgICAgICBTdHJpbmdbXSBzaW4gPSBuZXcgU3RyaW5nW21Db3VudF07CiAgICAgICAgICAgICBqYXZhLmxhbmcuU3lzdGVtLmFycmF5Y29weShtRWxlbWVudHMsIDAsIGVpbiwgMCwgbUNvdW50KTsKICAgICAgICAgICAgIGphdmEubGFuZy5TeXN0ZW0uYXJyYXljb3B5KG1FbGVtZW50TmFtZXMsIDAsIHNpbiwgMCwgbUNvdW50KTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRWxlbWVudChtUlMsIGVpbiwgc2luKTsKKworICAgICAgICAgICAgaW50W10gaWRzID0gbmV3IGludFtlaW4ubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGN0ID0gMDsgY3QgPCBlaW4ubGVuZ3RoOyBjdCsrICkgeworICAgICAgICAgICAgICAgIGlkc1tjdF0gPSBlaW5bY3RdLm1JRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBpZCA9IG1SUy5uRWxlbWVudENyZWF0ZTIoaWRzLCBzaW4pOworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KGlkLCBtUlMsIGVpbiwgc2luKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWVsZFBhY2tlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWVsZFBhY2tlci5qYXZhCmluZGV4IGIyNmU0N2QuLmI2Zjg4YmUgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmllbGRQYWNrZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpZWxkUGFja2VyLmphdmEKQEAgLTMzLDIxICszMywyOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCByZXNldCgpIHsKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKICAgICAgICAgbVBvcyA9IDA7CiAgICAgfQorICAgIHB1YmxpYyB2b2lkIHJlc2V0KGludCBpKSB7CisgICAgICAgIG1Qb3MgPSBpOworICAgIH0KIAotICAgIHZvaWQgYWRkSTgoYnl0ZSB2KSB7CisgICAgcHVibGljIHZvaWQgc2tpcChpbnQgaSkgeworICAgICAgICBtUG9zICs9IGk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSTgoYnl0ZSB2KSB7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSB2OwogICAgIH0KIAotICAgIHZvaWQgYWRkSTE2KHNob3J0IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRJMTYoc2hvcnQgdikgewogICAgICAgICBhbGlnbigyKTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSh2ICYgMHhmZik7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkodiA+PiA4KTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEkzMihpbnQgdikgeworICAgIHB1YmxpYyB2b2lkIGFkZEkzMihpbnQgdikgewogICAgICAgICBhbGlnbig0KTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSh2ICYgMHhmZik7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKQEAgLTU1LDcgKzYyLDcgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiAyNCkgJiAweGZmKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEk2NChsb25nIHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRJNjQobG9uZyB2KSB7CiAgICAgICAgIGFsaWduKDgpOwogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKHYgJiAweGZmKTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwpAQCAtNjcsMTUgKzc0LDE3IEBACiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkoKHYgPj4gNTYpICYgMHhmZik7CiAgICAgfQogCi0gICAgdm9pZCBhZGRVOChzaG9ydCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkVTgoc2hvcnQgdikgewogICAgICAgICBpZiAoKHYgPCAwKSB8fCAodiA+IDB4ZmYpKSB7CisgICAgICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLmUoInJzIiwgIkZpZWxkUGFja2VyLmFkZFU4KCAiICsgdiArICIgKSIpOwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2F2aW5nIHZhbHVlIG91dCBvZiByYW5nZSBmb3IgdHlwZSIpOwogICAgICAgICB9CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSl2OwogICAgIH0KIAotICAgIHZvaWQgYWRkVTE2KGludCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkVTE2KGludCB2KSB7CiAgICAgICAgIGlmICgodiA8IDApIHx8ICh2ID4gMHhmZmZmKSkgeworICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJGaWVsZFBhY2tlci5hZGRVMTYoICIgKyB2ICsgIiApIik7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTYXZpbmcgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciB0eXBlIik7CiAgICAgICAgIH0KICAgICAgICAgYWxpZ24oMik7CkBAIC04Myw4ICs5Miw5IEBACiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkodiA+PiA4KTsKICAgICB9CiAKLSAgICB2b2lkIGFkZFUzMihsb25nIHYpIHsKLSAgICAgICAgaWYgKCh2IDwgMCkgfHwgKHYgPiAweGZmZmZmZmZmKSkgeworICAgIHB1YmxpYyB2b2lkIGFkZFUzMihsb25nIHYpIHsKKyAgICAgICAgaWYgKCh2IDwgMCkgfHwgKHYgPiAweGZmZmZmZmZmTCkpIHsKKyAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cuZSgicnMiLCAiRmllbGRQYWNrZXIuYWRkVTMyKCAiICsgdiArICIgKSIpOwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2F2aW5nIHZhbHVlIG91dCBvZiByYW5nZSBmb3IgdHlwZSIpOwogICAgICAgICB9CiAgICAgICAgIGFsaWduKDQpOwpAQCAtOTQsOCArMTA0LDkgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiAyNCkgJiAweGZmKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZFU2NChsb25nIHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRVNjQobG9uZyB2KSB7CiAgICAgICAgIGlmICh2IDwgMCkgeworICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJGaWVsZFBhY2tlci5hZGRVNjQoICIgKyB2ICsgIiApIik7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTYXZpbmcgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciB0eXBlIik7CiAgICAgICAgIH0KICAgICAgICAgYWxpZ24oOCk7CkBAIC0xMDksMTUgKzEyMCwxNTcgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiA1NikgJiAweGZmKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEYzMihmbG9hdCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkRjMyKGZsb2F0IHYpIHsKICAgICAgICAgYWRkSTMyKEZsb2F0LmZsb2F0VG9SYXdJbnRCaXRzKHYpKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEY2NChmbG9hdCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkRjY0KGZsb2F0IHYpIHsKICAgICAgICAgYWRkSTY0KERvdWJsZS5kb3VibGVUb1Jhd0xvbmdCaXRzKHYpKTsKICAgICB9CiAKLSAgICBmaW5hbCBieXRlW10gZ2V0RGF0YSgpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRPYmooQmFzZU9iaiBvYmopIHsKKyAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGRJMzIob2JqLmdldElEKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkSTMyKDApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRjMyKEZsb2F0MiB2KSB7CisgICAgICAgIGFkZEYzMih2LngpOworICAgICAgICBhZGRGMzIodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkRjMyKEZsb2F0MyB2KSB7CisgICAgICAgIGFkZEYzMih2LngpOworICAgICAgICBhZGRGMzIodi55KTsKKyAgICAgICAgYWRkRjMyKHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEYzMihGbG9hdDQgdikgeworICAgICAgICBhZGRGMzIodi54KTsKKyAgICAgICAgYWRkRjMyKHYueSk7CisgICAgICAgIGFkZEYzMih2LnopOworICAgICAgICBhZGRGMzIodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJOChCeXRlMiB2KSB7CisgICAgICAgIGFkZEk4KHYueCk7CisgICAgICAgIGFkZEk4KHYueSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEk4KEJ5dGUzIHYpIHsKKyAgICAgICAgYWRkSTgodi54KTsKKyAgICAgICAgYWRkSTgodi55KTsKKyAgICAgICAgYWRkSTgodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTgoQnl0ZTQgdikgeworICAgICAgICBhZGRJOCh2LngpOworICAgICAgICBhZGRJOCh2LnkpOworICAgICAgICBhZGRJOCh2LnopOworICAgICAgICBhZGRJOCh2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFU4KFNob3J0MiB2KSB7CisgICAgICAgIGFkZFU4KHYueCk7CisgICAgICAgIGFkZFU4KHYueSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZFU4KFNob3J0MyB2KSB7CisgICAgICAgIGFkZFU4KHYueCk7CisgICAgICAgIGFkZFU4KHYueSk7CisgICAgICAgIGFkZFU4KHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZFU4KFNob3J0NCB2KSB7CisgICAgICAgIGFkZFU4KHYueCk7CisgICAgICAgIGFkZFU4KHYueSk7CisgICAgICAgIGFkZFU4KHYueik7CisgICAgICAgIGFkZFU4KHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSTE2KFNob3J0MiB2KSB7CisgICAgICAgIGFkZEkxNih2LngpOworICAgICAgICBhZGRJMTYodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTE2KFNob3J0MyB2KSB7CisgICAgICAgIGFkZEkxNih2LngpOworICAgICAgICBhZGRJMTYodi55KTsKKyAgICAgICAgYWRkSTE2KHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEkxNihTaG9ydDQgdikgeworICAgICAgICBhZGRJMTYodi54KTsKKyAgICAgICAgYWRkSTE2KHYueSk7CisgICAgICAgIGFkZEkxNih2LnopOworICAgICAgICBhZGRJMTYodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRVMTYoSW50MiB2KSB7CisgICAgICAgIGFkZFUxNih2LngpOworICAgICAgICBhZGRVMTYodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTE2KEludDMgdikgeworICAgICAgICBhZGRVMTYodi54KTsKKyAgICAgICAgYWRkVTE2KHYueSk7CisgICAgICAgIGFkZFUxNih2LnopOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRVMTYoSW50NCB2KSB7CisgICAgICAgIGFkZFUxNih2LngpOworICAgICAgICBhZGRVMTYodi55KTsKKyAgICAgICAgYWRkVTE2KHYueik7CisgICAgICAgIGFkZFUxNih2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEkzMihJbnQyIHYpIHsKKyAgICAgICAgYWRkSTMyKHYueCk7CisgICAgICAgIGFkZEkzMih2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRJMzIoSW50MyB2KSB7CisgICAgICAgIGFkZEkzMih2LngpOworICAgICAgICBhZGRJMzIodi55KTsKKyAgICAgICAgYWRkSTMyKHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEkzMihJbnQ0IHYpIHsKKyAgICAgICAgYWRkSTMyKHYueCk7CisgICAgICAgIGFkZEkzMih2LnkpOworICAgICAgICBhZGRJMzIodi56KTsKKyAgICAgICAgYWRkSTMyKHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVTMyKEludDIgdikgeworICAgICAgICBhZGRVMzIodi54KTsKKyAgICAgICAgYWRkVTMyKHYueSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZFUzMihJbnQzIHYpIHsKKyAgICAgICAgYWRkVTMyKHYueCk7CisgICAgICAgIGFkZFUzMih2LnkpOworICAgICAgICBhZGRVMzIodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTMyKEludDQgdikgeworICAgICAgICBhZGRVMzIodi54KTsKKyAgICAgICAgYWRkVTMyKHYueSk7CisgICAgICAgIGFkZFUzMih2LnopOworICAgICAgICBhZGRVMzIodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRPYmooTWF0cml4NGYgdikgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCB2Lm1NYXQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFkZEYzMih2Lm1NYXRbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkT2JqKE1hdHJpeDNmIHYpIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgdi5tTWF0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhZGRGMzIodi5tTWF0W2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE9iaihNYXRyaXgyZiB2KSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHYubU1hdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYWRkRjMyKHYubU1hdFtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRCb29sZWFuKGJvb2xlYW4gdikgeworICAgICAgICBhZGRJOCgoYnl0ZSkodiA/IDEgOiAwKSk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJ5dGVbXSBnZXREYXRhKCkgewogICAgICAgICByZXR1cm4gbURhdGE7CiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpbGVBM0QuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmlsZUEzRC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MTQwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpbGVBM0QuamF2YQpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBGaWxlQTNEIGV4dGVuZHMgQmFzZU9iaiB7CisKKyAgICBwdWJsaWMgZW51bSBDbGFzc0lEIHsKKworICAgICAgICBVTktOT1dOLAorICAgICAgICBNRVNILAorICAgICAgICBUWVBFLAorICAgICAgICBFTEVNRU5ULAorICAgICAgICBBTExPQ0FUSU9OLAorICAgICAgICBQUk9HUkFNX1ZFUlRFWCwKKyAgICAgICAgUFJPR1JBTV9SQVNURVIsCisgICAgICAgIFBST0dSQU1fRlJBR01FTlQsCisgICAgICAgIFBST0dSQU1fU1RPUkUsCisgICAgICAgIFNBTVBMRVIsCisgICAgICAgIEFOSU1BVElPTiwKKyAgICAgICAgTElHSFQsCisgICAgICAgIEFEQVBURVJfMUQsCisgICAgICAgIEFEQVBURVJfMkQsCisgICAgICAgIFNDUklQVF9DOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NJRCB0b0NsYXNzSUQoaW50IGludElEKSB7CisgICAgICAgICAgICByZXR1cm4gQ2xhc3NJRC52YWx1ZXMoKVtpbnRJRF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZWFkIG9ubHkgY2xhc3Mgd2l0aCBpbmRleCBlbnRyaWVzCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbmRleEVudHJ5IHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKKyAgICAgICAgaW50IG1JbmRleDsKKyAgICAgICAgaW50IG1JRDsKKyAgICAgICAgU3RyaW5nIG1OYW1lOworICAgICAgICBDbGFzc0lEIG1DbGFzc0lEOworICAgICAgICBCYXNlT2JqIG1Mb2FkZWRPYmo7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG1OYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENsYXNzSUQgZ2V0Q2xhc3NJRCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2xhc3NJRDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCYXNlT2JqIGdldE9iamVjdCgpIHsKKyAgICAgICAgICAgIG1SUy52YWxpZGF0ZSgpOworICAgICAgICAgICAgQmFzZU9iaiBvYmogPSBpbnRlcm5hbENyZWF0ZShtUlMsIHRoaXMpOworICAgICAgICAgICAgcmV0dXJuIG9iajsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgQmFzZU9iaiBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEluZGV4RW50cnkgZW50cnkpIHsKKyAgICAgICAgICAgIGlmKGVudHJ5Lm1Mb2FkZWRPYmogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5tTG9hZGVkT2JqOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihlbnRyeS5tQ2xhc3NJRCA9PSBDbGFzc0lELlVOS05PV04pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IG9iamVjdElEID0gcnMubkZpbGVBM0RHZXRFbnRyeUJ5SW5kZXgoZW50cnkubUlELCBlbnRyeS5tSW5kZXgpOworICAgICAgICAgICAgaWYob2JqZWN0SUQgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGVudHJ5Lm1DbGFzc0lEKSB7CisgICAgICAgICAgICBjYXNlIE1FU0g6CisgICAgICAgICAgICAgICAgZW50cnkubUxvYWRlZE9iaiA9IG5ldyBNZXNoKG9iamVjdElELCBycyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRZUEU6CisgICAgICAgICAgICAgICAgZW50cnkubUxvYWRlZE9iaiA9IG5ldyBUeXBlKG9iamVjdElELCBycyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVMRU1FTlQ6CisgICAgICAgICAgICAgICAgZW50cnkubUxvYWRlZE9iaiA9IG51bGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFMTE9DQVRJT046CisgICAgICAgICAgICAgICAgZW50cnkubUxvYWRlZE9iaiA9IG51bGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBST0dSQU1fVkVSVEVYOgorICAgICAgICAgICAgICAgIGVudHJ5Lm1Mb2FkZWRPYmogPSBuZXcgUHJvZ3JhbVZlcnRleChvYmplY3RJRCwgcnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQUk9HUkFNX1JBU1RFUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUFJPR1JBTV9GUkFHTUVOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUFJPR1JBTV9TVE9SRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0FNUExFUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU5JTUFUSU9OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMSUdIVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQURBUFRFUl8xRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQURBUFRFUl8yRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0NSSVBUX0M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVudHJ5Lm1Mb2FkZWRPYmoudXBkYXRlRnJvbU5hdGl2ZSgpOworCisgICAgICAgICAgICByZXR1cm4gZW50cnkubUxvYWRlZE9iajsKKyAgICAgICAgfQorCisgICAgICAgIEluZGV4RW50cnkoUmVuZGVyU2NyaXB0IHJzLCBpbnQgaW5kZXgsIGludCBpZCwgU3RyaW5nIG5hbWUsIENsYXNzSUQgY2xhc3NJRCkgeworICAgICAgICAgICAgbVJTID0gcnM7CisgICAgICAgICAgICBtSW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgIG1JRCA9IGlkOworICAgICAgICAgICAgbU5hbWUgPSBuYW1lOworICAgICAgICAgICAgbUNsYXNzSUQgPSBjbGFzc0lEOworICAgICAgICAgICAgbUxvYWRlZE9iaiA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJbmRleEVudHJ5W10gbUZpbGVFbnRyaWVzOworCisgICAgRmlsZUEzRChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBzdXBlcihpZCwgcnMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0RW50cmllcygpIHsKKyAgICAgICAgaW50IG51bUZpbGVFbnRyaWVzID0gbVJTLm5GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzKG1JRCk7CisgICAgICAgIGlmKG51bUZpbGVFbnRyaWVzIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1GaWxlRW50cmllcyA9IG5ldyBJbmRleEVudHJ5W251bUZpbGVFbnRyaWVzXTsKKyAgICAgICAgaW50W10gaWRzID0gbmV3IGludFtudW1GaWxlRW50cmllc107CisgICAgICAgIFN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tudW1GaWxlRW50cmllc107CisKKyAgICAgICAgbVJTLm5GaWxlQTNER2V0SW5kZXhFbnRyaWVzKG1JRCwgbnVtRmlsZUVudHJpZXMsIGlkcywgbmFtZXMpOworCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1GaWxlRW50cmllczsgaSArKykgeworICAgICAgICAgICAgbUZpbGVFbnRyaWVzW2ldID0gbmV3IEluZGV4RW50cnkobVJTLCBpLCBtSUQsIG5hbWVzW2ldLCBDbGFzc0lELnRvQ2xhc3NJRChpZHNbaV0pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TnVtSW5kZXhFbnRyaWVzKCkgeworICAgICAgICBpZihtRmlsZUVudHJpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1GaWxlRW50cmllcy5sZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIEluZGV4RW50cnkgZ2V0SW5kZXhFbnRyeShpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYoZ2V0TnVtSW5kZXhFbnRyaWVzKCkgPT0gMCB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gbUZpbGVFbnRyaWVzLmxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1GaWxlRW50cmllc1tpbmRleF07CisgICAgfQorCisgICAgc3RhdGljIHB1YmxpYyBGaWxlQTNEIGNyZWF0ZUZyb21SZXNvdXJjZShSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXMsIGludCBpZCkKKyAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcnMudmFsaWRhdGUoKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7CisgICAgICAgICAgICBpcyA9IHJlcy5vcGVuUmF3UmVzb3VyY2UoaWQsIHZhbHVlKTsKKworICAgICAgICAgICAgaW50IGFzc2V0ID0gKChBc3NldE1hbmFnZXIuQXNzZXRJbnB1dFN0cmVhbSkgaXMpLmdldEFzc2V0SW50KCk7CisKKyAgICAgICAgICAgIGludCBmaWxlSWQgPSBycy5uRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShhc3NldCk7CisKKyAgICAgICAgICAgIGlmKGZpbGVJZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTG9hZCBmYWlsZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGaWxlQTNEIGZhM2QgPSBuZXcgRmlsZUEzRChmaWxlSWQsIHJzKTsKKyAgICAgICAgICAgIGZhM2QuaW5pdEVudHJpZXMoKTsKKyAgICAgICAgICAgIHJldHVybiBmYTNkOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OWJmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0Mi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEZsb2F0MiB7CisgICAgcHVibGljIEZsb2F0MigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgRmxvYXQyKGZsb2F0IGluaXRYLCBmbG9hdCBpbml0WSkgeworICAgICAgICB4ID0gaW5pdFg7CisgICAgICAgIHkgPSBpbml0WTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgeDsKKyAgICBwdWJsaWMgZmxvYXQgeTsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDMuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlMTQwZAotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQzLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgRmxvYXQzIHsKKyAgICBwdWJsaWMgRmxvYXQzKCkgeworICAgIH0KKyAgICBwdWJsaWMgRmxvYXQzKGZsb2F0IGluaXRYLCBmbG9hdCBpbml0WSwgZmxvYXQgaW5pdFopIHsKKyAgICAgICAgeCA9IGluaXRYOworICAgICAgICB5ID0gaW5pdFk7CisgICAgICAgIHogPSBpbml0WjsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgeDsKKyAgICBwdWJsaWMgZmxvYXQgeTsKKyAgICBwdWJsaWMgZmxvYXQgejsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3NzMyZgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQ0LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgRmxvYXQ0IHsKKyAgICBwdWJsaWMgRmxvYXQ0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBGbG9hdDQoZmxvYXQgaW5pdFgsIGZsb2F0IGluaXRZLCBmbG9hdCBpbml0WiwgZmxvYXQgaW5pdFcpIHsKKyAgICAgICAgeCA9IGluaXRYOworICAgICAgICB5ID0gaW5pdFk7CisgICAgICAgIHogPSBpbml0WjsKKyAgICAgICAgdyA9IGluaXRXOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCB4OworICAgIHB1YmxpYyBmbG9hdCB5OworICAgIHB1YmxpYyBmbG9hdCB6OworICAgIHB1YmxpYyBmbG9hdCB3OworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Gb250LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZvbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTI1MDE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Gb250LmphdmEKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEZvbnQgZXh0ZW5kcyBCYXNlT2JqIHsKKworICAgIC8vVGhlc2UgaGVscCB1cyBjcmVhdGUgYSBmb250IGJ5IGZhbWlseSBuYW1lCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc1NhbnNOYW1lcyA9IHsKKyAgICAgICAgInNhbnMtc2VyaWYiLCAiYXJpYWwiLCAiaGVsdmV0aWNhIiwgInRhaG9tYSIsICJ2ZXJkYW5hIgorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzU2VyaWZOYW1lcyA9IHsKKyAgICAgICAgInNlcmlmIiwgInRpbWVzIiwgInRpbWVzIG5ldyByb21hbiIsICJwYWxhdGlubyIsICJnZW9yZ2lhIiwgImJhc2tlcnZpbGxlIiwKKyAgICAgICAgImdvdWR5IiwgImZhbnRhc3kiLCAiY3Vyc2l2ZSIsICJJVEMgU3RvbmUgU2VyaWYiCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHNNb25vTmFtZXMgPSB7CisgICAgICAgICJtb25vc3BhY2UiLCAiY291cmllciIsICJjb3VyaWVyIG5ldyIsICJtb25hY28iCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZvbnRGYW1pbHkgeworICAgICAgICBTdHJpbmdbXSBtTmFtZXM7CisgICAgICAgIFN0cmluZyBtTm9ybWFsRmlsZU5hbWU7CisgICAgICAgIFN0cmluZyBtQm9sZEZpbGVOYW1lOworICAgICAgICBTdHJpbmcgbUl0YWxpY0ZpbGVOYW1lOworICAgICAgICBTdHJpbmcgbUJvbGRJdGFsaWNGaWxlTmFtZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBGb250RmFtaWx5PiBzRm9udEZhbWlseU1hcDsKKworICAgIHB1YmxpYyBlbnVtIFN0eWxlIHsKKyAgICAgICAgTk9STUFMLAorICAgICAgICBCT0xELAorICAgICAgICBJVEFMSUMsCisgICAgICAgIEJPTERfSVRBTElDOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkRmFtaWx5VG9NYXAoRm9udEZhbWlseSBmYW1pbHkpIHsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGZhbWlseS5tTmFtZXMubGVuZ3RoOyBpICsrKSB7CisgICAgICAgICAgICBzRm9udEZhbWlseU1hcC5wdXQoZmFtaWx5Lm1OYW1lc1tpXSwgZmFtaWx5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW5pdEZvbnRGYW1pbHlNYXAoKSB7CisgICAgICAgIHNGb250RmFtaWx5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGb250RmFtaWx5PigpOworCisgICAgICAgIEZvbnRGYW1pbHkgc2Fuc0ZhbWlseSA9IG5ldyBGb250RmFtaWx5KCk7CisgICAgICAgIHNhbnNGYW1pbHkubU5hbWVzID0gc1NhbnNOYW1lczsKKyAgICAgICAgc2Fuc0ZhbWlseS5tTm9ybWFsRmlsZU5hbWUgPSAiRHJvaWRTYW5zLnR0ZiI7CisgICAgICAgIHNhbnNGYW1pbHkubUJvbGRGaWxlTmFtZSA9ICJEcm9pZFNhbnMtQm9sZC50dGYiOworICAgICAgICBzYW5zRmFtaWx5Lm1JdGFsaWNGaWxlTmFtZSA9ICJEcm9pZFNhbnMudHRmIjsKKyAgICAgICAgc2Fuc0ZhbWlseS5tQm9sZEl0YWxpY0ZpbGVOYW1lID0gIkRyb2lkU2Fucy1Cb2xkLnR0ZiI7CisgICAgICAgIGFkZEZhbWlseVRvTWFwKHNhbnNGYW1pbHkpOworCisgICAgICAgIEZvbnRGYW1pbHkgc2VyaWZGYW1pbHkgPSBuZXcgRm9udEZhbWlseSgpOworICAgICAgICBzZXJpZkZhbWlseS5tTmFtZXMgPSBzU2VyaWZOYW1lczsKKyAgICAgICAgc2VyaWZGYW1pbHkubU5vcm1hbEZpbGVOYW1lID0gIkRyb2lkU2VyaWYtUmVndWxhci50dGYiOworICAgICAgICBzZXJpZkZhbWlseS5tQm9sZEZpbGVOYW1lID0gIkRyb2lkU2VyaWYtQm9sZC50dGYiOworICAgICAgICBzZXJpZkZhbWlseS5tSXRhbGljRmlsZU5hbWUgPSAiRHJvaWRTZXJpZi1JdGFsaWMudHRmIjsKKyAgICAgICAgc2VyaWZGYW1pbHkubUJvbGRJdGFsaWNGaWxlTmFtZSA9ICJEcm9pZFNlcmlmLUJvbGRJdGFsaWMudHRmIjsKKyAgICAgICAgYWRkRmFtaWx5VG9NYXAoc2VyaWZGYW1pbHkpOworCisgICAgICAgIEZvbnRGYW1pbHkgbW9ub0ZhbWlseSA9IG5ldyBGb250RmFtaWx5KCk7CisgICAgICAgIG1vbm9GYW1pbHkubU5hbWVzID0gc01vbm9OYW1lczsKKyAgICAgICAgbW9ub0ZhbWlseS5tTm9ybWFsRmlsZU5hbWUgPSAiRHJvaWRTYW5zTW9uby50dGYiOworICAgICAgICBtb25vRmFtaWx5Lm1Cb2xkRmlsZU5hbWUgPSAiRHJvaWRTYW5zTW9uby50dGYiOworICAgICAgICBtb25vRmFtaWx5Lm1JdGFsaWNGaWxlTmFtZSA9ICJEcm9pZFNhbnNNb25vLnR0ZiI7CisgICAgICAgIG1vbm9GYW1pbHkubUJvbGRJdGFsaWNGaWxlTmFtZSA9ICJEcm9pZFNhbnNNb25vLnR0ZiI7CisgICAgICAgIGFkZEZhbWlseVRvTWFwKG1vbm9GYW1pbHkpOworICAgIH0KKworICAgIHN0YXRpYyB7CisgICAgICAgIGluaXRGb250RmFtaWx5TWFwKCk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBnZXRGb250RmlsZU5hbWUoU3RyaW5nIGZhbWlseU5hbWUsIFN0eWxlIHN0eWxlKSB7CisgICAgICAgIEZvbnRGYW1pbHkgZmFtaWx5ID0gc0ZvbnRGYW1pbHlNYXAuZ2V0KGZhbWlseU5hbWUpOworICAgICAgICBpZihmYW1pbHkgIT0gbnVsbCkgeworICAgICAgICAgICAgc3dpdGNoKHN0eWxlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOT1JNQUw6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYW1pbHkubU5vcm1hbEZpbGVOYW1lOworICAgICAgICAgICAgICAgIGNhc2UgQk9MRDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbWlseS5tQm9sZEZpbGVOYW1lOworICAgICAgICAgICAgICAgIGNhc2UgSVRBTElDOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFtaWx5Lm1JdGFsaWNGaWxlTmFtZTsKKyAgICAgICAgICAgICAgICBjYXNlIEJPTERfSVRBTElDOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFtaWx5Lm1Cb2xkSXRhbGljRmlsZU5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gRmFsbGJhY2sgaWYgd2UgY291bGQgbm90IGZpbmQgdGhlIGRlc2lyZWQgZmFtaWx5CisgICAgICAgIHJldHVybiAiRHJvaWRTYW5zLnR0ZiI7CisgICAgfQorCisgICAgRm9udChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBzdXBlcihpZCwgcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2VzIGEgc3BlY2lmaWMgZmlsZSBuYW1lIGFzIGFuIGFyZ3VtZW50CisgICAgICovCisgICAgc3RhdGljIHB1YmxpYyBGb250IGNyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXMsIFN0cmluZyBmaWxlTmFtZSwgaW50IHNpemUpCisgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCisgICAgICAgIHJzLnZhbGlkYXRlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgZHBpID0gcmVzLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eURwaTsKKyAgICAgICAgICAgIGludCBmb250SWQgPSBycy5uRm9udENyZWF0ZUZyb21GaWxlKGZpbGVOYW1lLCBzaXplLCBkcGkpOworCisgICAgICAgICAgICBpZihmb250SWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZhaWxlZCBsb2FkaW5nIGEgZm9udCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRm9udCByc0ZvbnQgPSBuZXcgRm9udChmb250SWQsIHJzKTsKKworICAgICAgICAgICAgcmV0dXJuIHJzRm9udDsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2NlcHRzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZhbWlseSBuYW1lcyBhcyBhbiBhcmd1bWVudAorICAgICAqIGFuZCB3aWxsIGF0dGVtcCB0byBwcm9kdWNlIHRoZSBiZXN0IG1hdGNoIHdpdGggYSBzeXN0ZW0gZm9udAorICAgICAqICJzYW5zLXNlcmlmIiAiYXJpYWwiICJoZWx2ZXRpY2EiICJ0YWhvbWEiICJ2ZXJkYW5hIgorICAgICAqICJzZXJpZiIgInRpbWVzIiAidGltZXMgbmV3IHJvbWFuIiAicGFsYXRpbm8iICJnZW9yZ2lhIiAiYmFza2VydmlsbGUiCisgICAgICogImdvdWR5IiAiZmFudGFzeSIgImN1cnNpdmUiICJJVEMgU3RvbmUgU2VyaWYiCisgICAgICogIm1vbm9zcGFjZSIgImNvdXJpZXIiICJjb3VyaWVyIG5ldyIgIm1vbmFjbyIKKyAgICAgKiBSZXR1cm5zIGRlZmF1bHQgZm9udCBpZiBubyBtYXRjaCBjb3VsZCBiZSBmb3VuZAorICAgICAqLworICAgIHN0YXRpYyBwdWJsaWMgRm9udCBjcmVhdGVGcm9tRmFtaWx5KFJlbmRlclNjcmlwdCBycywgUmVzb3VyY2VzIHJlcywgU3RyaW5nIGZhbWlseU5hbWUsIFN0eWxlIGZvbnRTdHlsZSwgaW50IHNpemUpCisgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGdldEZvbnRGaWxlTmFtZShmYW1pbHlOYW1lLCBmb250U3R5bGUpOworICAgICAgICByZXR1cm4gY3JlYXRlKHJzLCByZXMsIGZpbGVOYW1lLCBzaXplKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZTJmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBJbnQyIHsKKyAgICBwdWJsaWMgSW50MigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHg7CisgICAgcHVibGljIGludCB5OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDMuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50My5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMjc1MDkKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDMuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBJbnQzIHsKKyAgICBwdWJsaWMgSW50MygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHg7CisgICAgcHVibGljIGludCB5OworICAgIHB1YmxpYyBpbnQgejsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQ0LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDZmM2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQ0LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgSW50NCB7CisgICAgcHVibGljIEludDQoKSB7CisgICAgfQorCisgICAgcHVibGljIGludCB4OworICAgIHB1YmxpYyBpbnQgeTsKKyAgICBwdWJsaWMgaW50IHo7CisgICAgcHVibGljIGludCB3OworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9MaWdodC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9MaWdodC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWI2NTZmLi4wMDAwMDAwCi0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTGlnaHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwotCi1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0vKioKLSAqIEBoaWRlCi0gKgotICoqLwotcHVibGljIGNsYXNzIExpZ2h0IGV4dGVuZHMgQmFzZU9iaiB7Ci0gICAgTGlnaHQoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgc3VwZXIocnMpOwotICAgICAgICBtSUQgPSBpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMubkxpZ2h0U2V0Q29sb3IobUlELCByLCBnLCBiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQb3NpdGlvbihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMubkxpZ2h0U2V0UG9zaXRpb24obUlELCB4LCB5LCB6KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOwotICAgICAgICBib29sZWFuIG1Jc01vbm87Ci0gICAgICAgIGJvb2xlYW4gbUlzTG9jYWw7Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgICAgICBtUlMgPSByczsKLSAgICAgICAgICAgIG1Jc01vbm8gPSBmYWxzZTsKLSAgICAgICAgICAgIG1Jc0xvY2FsID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBsaWdodFNldElzTW9ubyhib29sZWFuIGlzTW9ubykgewotICAgICAgICAgICAgbUlzTW9ubyA9IGlzTW9ubzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGxpZ2h0U2V0SXNMb2NhbChib29sZWFuIGlzTG9jYWwpIHsKLSAgICAgICAgICAgIG1Jc0xvY2FsID0gaXNMb2NhbDsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgTGlnaHQgaW50ZXJuYWxDcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBCdWlsZGVyIGIpIHsKLSAgICAgICAgICAgIHJzLm5TYW1wbGVyQmVnaW4oKTsKLSAgICAgICAgICAgIHJzLm5MaWdodFNldElzTW9ubyhiLm1Jc01vbm8pOwotICAgICAgICAgICAgcnMubkxpZ2h0U2V0SXNMb2NhbChiLm1Jc0xvY2FsKTsKLSAgICAgICAgICAgIGludCBpZCA9IHJzLm5MaWdodENyZWF0ZSgpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBMaWdodChpZCwgcnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExpZ2h0IGNyZWF0ZSgpIHsKLSAgICAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICAgICAgcmV0dXJuIGludGVybmFsQ3JlYXRlKG1SUywgdGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nMi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZWFkMmYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmcyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgTG9uZzIgeworICAgIHB1YmxpYyBMb25nMigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyB4OworICAgIHB1YmxpYyBsb25nIHk7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzMuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjA0NTMyCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nMy5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIExvbmczIHsKKyAgICBwdWJsaWMgTG9uZzMoKSB7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgeDsKKyAgICBwdWJsaWMgbG9uZyB5OworICAgIHB1YmxpYyBsb25nIHo7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmQyNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nNC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIExvbmc0IHsKKyAgICBwdWJsaWMgTG9uZzQoKSB7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgeDsKKyAgICBwdWJsaWMgbG9uZyB5OworICAgIHB1YmxpYyBsb25nIHo7CisgICAgcHVibGljIGxvbmcgdzsKK30KKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4MmYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4MmYuamF2YQppbmRleCA0YjVlNjFiLi45OWQyM2RiIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDJmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXgyZi5qYXZhCkBAIC01MSw2ICs1MSw1NyBAQAogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1NYXQsIDAsIHNyYywgMCwgNCk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgbG9hZFJvdGF0ZShmbG9hdCByb3QpIHsKKyAgICAgICAgZmxvYXQgYywgczsKKyAgICAgICAgcm90ICo9IChmbG9hdCkoamF2YS5sYW5nLk1hdGguUEkgLyAxODAuMGYpOworICAgICAgICBjID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLmNvcyhyb3QpOworICAgICAgICBzID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNpbihyb3QpOworICAgICAgICBtTWF0WzBdID0gYzsKKyAgICAgICAgbU1hdFsxXSA9IC1zOworICAgICAgICBtTWF0WzJdID0gczsKKyAgICAgICAgbU1hdFszXSA9IGM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZFNjYWxlKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgbG9hZElkZW50aXR5KCk7CisgICAgICAgIG1NYXRbMF0gPSB4OworICAgICAgICBtTWF0WzNdID0geTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgbG9hZE11bHRpcGx5KE1hdHJpeDJmIGxocywgTWF0cml4MmYgcmhzKSB7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8MiA7IGkrKykgeworICAgICAgICAgICAgZmxvYXQgcmkwID0gMDsKKyAgICAgICAgICAgIGZsb2F0IHJpMSA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBqPTAgOyBqPDIgOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdCByaHNfaWogPSByaHMuZ2V0KGksaik7CisgICAgICAgICAgICAgICAgcmkwICs9IGxocy5nZXQoaiwwKSAqIHJoc19pajsKKyAgICAgICAgICAgICAgICByaTEgKz0gbGhzLmdldChqLDEpICogcmhzX2lqOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0KGksMCwgcmkwKTsKKyAgICAgICAgICAgIHNldChpLDEsIHJpMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtdWx0aXBseShNYXRyaXgyZiByaHMpIHsKKyAgICAgICAgTWF0cml4MmYgdG1wID0gbmV3IE1hdHJpeDJmKCk7CisgICAgICAgIHRtcC5sb2FkTXVsdGlwbHkodGhpcywgcmhzKTsKKyAgICAgICAgbG9hZCh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCByb3RhdGUoZmxvYXQgcm90KSB7CisgICAgICAgIE1hdHJpeDJmIHRtcCA9IG5ldyBNYXRyaXgyZigpOworICAgICAgICB0bXAubG9hZFJvdGF0ZShyb3QpOworICAgICAgICBtdWx0aXBseSh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzY2FsZShmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIE1hdHJpeDJmIHRtcCA9IG5ldyBNYXRyaXgyZigpOworICAgICAgICB0bXAubG9hZFNjYWxlKHgsIHkpOworICAgICAgICBtdWx0aXBseSh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0cmFuc3Bvc2UoKSB7CisgICAgICAgIGZsb2F0IHRlbXAgPSBtTWF0WzFdOworICAgICAgICBtTWF0WzFdID0gbU1hdFsyXTsKKyAgICAgICAgbU1hdFsyXSA9IHRlbXA7CisgICAgfQorCiAgICAgZmluYWwgZmxvYXRbXSBtTWF0OwogfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDNmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDNmLmphdmEKaW5kZXggMTlkN2I0My4uOTYxYmM1ZCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXgzZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4M2YuamF2YQpAQCAtNTcsNiArNTcsMTI0IEBACiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobU1hdCwgMCwgc3JjLCAwLCA5KTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBsb2FkUm90YXRlKGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICBmbG9hdCBjLCBzOworICAgICAgICByb3QgKj0gKGZsb2F0KShqYXZhLmxhbmcuTWF0aC5QSSAvIDE4MC4wZik7CisgICAgICAgIGMgPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguY29zKHJvdCk7CisgICAgICAgIHMgPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguc2luKHJvdCk7CisKKyAgICAgICAgZmxvYXQgbGVuID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNxcnQoeCp4ICsgeSp5ICsgeip6KTsKKyAgICAgICAgaWYgKCEobGVuICE9IDEpKSB7CisgICAgICAgICAgICBmbG9hdCByZWNpcExlbiA9IDEuZiAvIGxlbjsKKyAgICAgICAgICAgIHggKj0gcmVjaXBMZW47CisgICAgICAgICAgICB5ICo9IHJlY2lwTGVuOworICAgICAgICAgICAgeiAqPSByZWNpcExlbjsKKyAgICAgICAgfQorICAgICAgICBmbG9hdCBuYyA9IDEuMGYgLSBjOworICAgICAgICBmbG9hdCB4eSA9IHggKiB5OworICAgICAgICBmbG9hdCB5eiA9IHkgKiB6OworICAgICAgICBmbG9hdCB6eCA9IHogKiB4OworICAgICAgICBmbG9hdCB4cyA9IHggKiBzOworICAgICAgICBmbG9hdCB5cyA9IHkgKiBzOworICAgICAgICBmbG9hdCB6cyA9IHogKiBzOworICAgICAgICBtTWF0WzBdID0geCp4Km5jICsgIGM7CisgICAgICAgIG1NYXRbM10gPSAgeHkqbmMgLSB6czsKKyAgICAgICAgbU1hdFs2XSA9ICB6eCpuYyArIHlzOworICAgICAgICBtTWF0WzFdID0gIHh5Km5jICsgenM7CisgICAgICAgIG1NYXRbNF0gPSB5KnkqbmMgKyAgYzsKKyAgICAgICAgbU1hdFs5XSA9ICB5eipuYyAtIHhzOworICAgICAgICBtTWF0WzJdID0gIHp4Km5jIC0geXM7CisgICAgICAgIG1NYXRbNl0gPSAgeXoqbmMgKyB4czsKKyAgICAgICAgbU1hdFs4XSA9IHoqeipuYyArICBjOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRSb3RhdGUoZmxvYXQgcm90KSB7CisgICAgICAgIGZsb2F0IGMsIHM7CisgICAgICAgIHJvdCAqPSAoZmxvYXQpKGphdmEubGFuZy5NYXRoLlBJIC8gMTgwLjBmKTsKKyAgICAgICAgYyA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5jb3Mocm90KTsKKyAgICAgICAgcyA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zaW4ocm90KTsKKyAgICAgICAgbU1hdFswXSA9IGM7CisgICAgICAgIG1NYXRbMV0gPSAtczsKKyAgICAgICAgbU1hdFszXSA9IHM7CisgICAgICAgIG1NYXRbNF0gPSBjOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRTY2FsZShmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIGxvYWRJZGVudGl0eSgpOworICAgICAgICBtTWF0WzBdID0geDsKKyAgICAgICAgbU1hdFs0XSA9IHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZFNjYWxlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgbG9hZElkZW50aXR5KCk7CisgICAgICAgIG1NYXRbMF0gPSB4OworICAgICAgICBtTWF0WzRdID0geTsKKyAgICAgICAgbU1hdFs4XSA9IHo7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZFRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIGxvYWRJZGVudGl0eSgpOworICAgICAgICBtTWF0WzZdID0geDsKKyAgICAgICAgbU1hdFs3XSA9IHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZE11bHRpcGx5KE1hdHJpeDNmIGxocywgTWF0cml4M2YgcmhzKSB7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8MyA7IGkrKykgeworICAgICAgICAgICAgZmxvYXQgcmkwID0gMDsKKyAgICAgICAgICAgIGZsb2F0IHJpMSA9IDA7CisgICAgICAgICAgICBmbG9hdCByaTIgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaj0wIDsgajwzIDsgaisrKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgcmhzX2lqID0gcmhzLmdldChpLGopOworICAgICAgICAgICAgICAgIHJpMCArPSBsaHMuZ2V0KGosMCkgKiByaHNfaWo7CisgICAgICAgICAgICAgICAgcmkxICs9IGxocy5nZXQoaiwxKSAqIHJoc19pajsKKyAgICAgICAgICAgICAgICByaTIgKz0gbGhzLmdldChqLDIpICogcmhzX2lqOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0KGksMCwgcmkwKTsKKyAgICAgICAgICAgIHNldChpLDEsIHJpMSk7CisgICAgICAgICAgICBzZXQoaSwyLCByaTIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbXVsdGlwbHkoTWF0cml4M2YgcmhzKSB7CisgICAgICAgIE1hdHJpeDNmIHRtcCA9IG5ldyBNYXRyaXgzZigpOworICAgICAgICB0bXAubG9hZE11bHRpcGx5KHRoaXMsIHJocyk7CisgICAgICAgIGxvYWQodG1wKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgcm90YXRlKGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICBNYXRyaXgzZiB0bXAgPSBuZXcgTWF0cml4M2YoKTsKKyAgICAgICAgdG1wLmxvYWRSb3RhdGUocm90LCB4LCB5LCB6KTsKKyAgICAgICAgbXVsdGlwbHkodG1wKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgcm90YXRlKGZsb2F0IHJvdCkgeworICAgICAgICBNYXRyaXgzZiB0bXAgPSBuZXcgTWF0cml4M2YoKTsKKyAgICAgICAgdG1wLmxvYWRSb3RhdGUocm90KTsKKyAgICAgICAgbXVsdGlwbHkodG1wKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2NhbGUoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBNYXRyaXgzZiB0bXAgPSBuZXcgTWF0cml4M2YoKTsKKyAgICAgICAgdG1wLmxvYWRTY2FsZSh4LCB5KTsKKyAgICAgICAgbXVsdGlwbHkodG1wKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2NhbGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICBNYXRyaXgzZiB0bXAgPSBuZXcgTWF0cml4M2YoKTsKKyAgICAgICAgdG1wLmxvYWRTY2FsZSh4LCB5LCB6KTsKKyAgICAgICAgbXVsdGlwbHkodG1wKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgTWF0cml4M2YgdG1wID0gbmV3IE1hdHJpeDNmKCk7CisgICAgICAgIHRtcC5sb2FkVHJhbnNsYXRlKHgsIHkpOworICAgICAgICBtdWx0aXBseSh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0cmFuc3Bvc2UoKSB7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgICAgIGZvcihpbnQgaiA9IGkgKyAxOyBqIDwgMzsgKytqKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgdGVtcCA9IG1NYXRbaSozICsgal07CisgICAgICAgICAgICAgICAgbU1hdFtpKjMgKyBqXSA9IG1NYXRbaiozICsgaV07CisgICAgICAgICAgICAgICAgbU1hdFtqKjMgKyBpXSA9IHRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBmaW5hbCBmbG9hdFtdIG1NYXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4NGYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4NGYuamF2YQppbmRleCBlYmQ1YmRlLi41ZmZjMjFhIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDRmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXg0Zi5qYXZhCkBAIC0xNzksNiArMTc5LDg1IEBACiAgICAgICAgIHRtcC5sb2FkVHJhbnNsYXRlKHgsIHksIHopOwogICAgICAgICBtdWx0aXBseSh0bXApOwogICAgIH0KKyAgICBwcml2YXRlIGZsb2F0IGNvbXB1dGVDb2ZhY3RvcihpbnQgaSwgaW50IGopIHsKKyAgICAgICAgaW50IGMwID0gKGkrMSkgJSA0OworICAgICAgICBpbnQgYzEgPSAoaSsyKSAlIDQ7CisgICAgICAgIGludCBjMiA9IChpKzMpICUgNDsKKyAgICAgICAgaW50IHIwID0gKGorMSkgJSA0OworICAgICAgICBpbnQgcjEgPSAoaisyKSAlIDQ7CisgICAgICAgIGludCByMiA9IChqKzMpICUgNDsKKworICAgICAgICBmbG9hdCBtaW5vciA9IChtTWF0W2MwICsgNCpyMF0gKiAobU1hdFtjMSArIDQqcjFdICogbU1hdFtjMiArIDQqcjJdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hdFtjMSArIDQqcjJdICogbU1hdFtjMiArIDQqcjFdKSkKKyAgICAgICAgICAgICAgICAgICAgIC0gKG1NYXRbYzAgKyA0KnIxXSAqIChtTWF0W2MxICsgNCpyMF0gKiBtTWF0W2MyICsgNCpyMl0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWF0W2MxICsgNCpyMl0gKiBtTWF0W2MyICsgNCpyMF0pKQorICAgICAgICAgICAgICAgICAgICAgKyAobU1hdFtjMCArIDQqcjJdICogKG1NYXRbYzEgKyA0KnIwXSAqIG1NYXRbYzIgKyA0KnIxXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXRbYzEgKyA0KnIxXSAqIG1NYXRbYzIgKyA0KnIwXSkpOworCisgICAgICAgIGZsb2F0IGNvZmFjdG9yID0gKChpK2opICYgMSkgIT0gMCA/IC1taW5vciA6IG1pbm9yOworICAgICAgICByZXR1cm4gY29mYWN0b3I7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaW52ZXJzZSgpIHsKKworICAgICAgICBNYXRyaXg0ZiByZXN1bHQgPSBuZXcgTWF0cml4NGYoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyArK2opIHsKKyAgICAgICAgICAgICAgICByZXN1bHQubU1hdFs0KmkgKyBqXSA9IGNvbXB1dGVDb2ZhY3RvcihpLCBqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIERvdCBwcm9kdWN0IG9mIDB0aCBjb2x1bW4gb2Ygc291cmNlIGFuZCAwdGggcm93IG9mIHJlc3VsdAorICAgICAgICBmbG9hdCBkZXQgPSBtTWF0WzBdKnJlc3VsdC5tTWF0WzBdICsgbU1hdFs0XSpyZXN1bHQubU1hdFsxXSArCisgICAgICAgICAgICAgICAgICAgICBtTWF0WzhdKnJlc3VsdC5tTWF0WzJdICsgbU1hdFsxMl0qcmVzdWx0Lm1NYXRbM107CisKKyAgICAgICAgaWYgKE1hdGguYWJzKGRldCkgPCAxZS02KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBkZXQgPSAxLjBmIC8gZGV0OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgICAgICAgIG1NYXRbaV0gPSByZXN1bHQubU1hdFtpXSAqIGRldDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGludmVyc2VUcmFuc3Bvc2UoKSB7CisKKyAgICAgICAgTWF0cml4NGYgcmVzdWx0ID0gbmV3IE1hdHJpeDRmKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgKytqKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0Lm1NYXRbNCpqICsgaV0gPSBjb21wdXRlQ29mYWN0b3IoaSwgaik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBkZXQgPSBtTWF0WzBdKnJlc3VsdC5tTWF0WzBdICsgbU1hdFs0XSpyZXN1bHQubU1hdFs0XSArCisgICAgICAgICAgICAgICAgICAgICBtTWF0WzhdKnJlc3VsdC5tTWF0WzhdICsgbU1hdFsxMl0qcmVzdWx0Lm1NYXRbMTJdOworCisgICAgICAgIGlmIChNYXRoLmFicyhkZXQpIDwgMWUtNikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZGV0ID0gMS4wZiAvIGRldDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICAgICAgICBtTWF0W2ldID0gcmVzdWx0Lm1NYXRbaV0gKiBkZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0cmFuc3Bvc2UoKSB7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgICAgIGZvcihpbnQgaiA9IGkgKyAxOyBqIDwgNDsgKytqKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgdGVtcCA9IG1NYXRbaSo0ICsgal07CisgICAgICAgICAgICAgICAgbU1hdFtpKjQgKyBqXSA9IG1NYXRbaio0ICsgaV07CisgICAgICAgICAgICAgICAgbU1hdFtqKjQgKyBpXSA9IHRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKICAgICBmaW5hbCBmbG9hdFtdIG1NYXQ7CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01lc2guamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWVzaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NGMxZjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01lc2guamF2YQpAQCAtMCwwICsxLDQ3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIE1lc2ggZXh0ZW5kcyBCYXNlT2JqIHsKKworICAgIEFsbG9jYXRpb25bXSBtVmVydGV4QnVmZmVyczsKKyAgICBBbGxvY2F0aW9uW10gbUluZGV4QnVmZmVyczsKKyAgICBQcmltaXRpdmVbXSBtUHJpbWl0aXZlczsKKworICAgIE1lc2goaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFZlcnRleEFsbG9jYXRpb25Db3VudCgpIHsKKyAgICAgICAgaWYobVZlcnRleEJ1ZmZlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1WZXJ0ZXhCdWZmZXJzLmxlbmd0aDsKKyAgICB9CisgICAgcHVibGljIEFsbG9jYXRpb24gZ2V0VmVydGV4QWxsb2NhdGlvbihpbnQgc2xvdCkgeworICAgICAgICByZXR1cm4gbVZlcnRleEJ1ZmZlcnNbc2xvdF07CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQcmltaXRpdmVDb3VudCgpIHsKKyAgICAgICAgaWYobUluZGV4QnVmZmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUluZGV4QnVmZmVycy5sZW5ndGg7CisgICAgfQorICAgIHB1YmxpYyBBbGxvY2F0aW9uIGdldEluZGV4QWxsb2NhdGlvbihpbnQgc2xvdCkgeworICAgICAgICByZXR1cm4gbUluZGV4QnVmZmVyc1tzbG90XTsKKyAgICB9CisgICAgcHVibGljIFByaW1pdGl2ZSBnZXRQcmltaXRpdmUoaW50IHNsb3QpIHsKKyAgICAgICAgcmV0dXJuIG1QcmltaXRpdmVzW3Nsb3RdOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgdXBkYXRlRnJvbU5hdGl2ZSgpIHsKKyAgICAgICAgbU5hbWUgPSBtUlMubkdldE5hbWUobUlEKTsKKyAgICAgICAgaW50IHZ0eENvdW50ID0gbVJTLm5NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQobUlEKTsKKyAgICAgICAgaW50IGlkeENvdW50ID0gbVJTLm5NZXNoR2V0SW5kZXhDb3VudChtSUQpOworCisgICAgICAgIGludFtdIHZ0eElEcyA9IG5ldyBpbnRbdnR4Q291bnRdOworICAgICAgICBpbnRbXSBpZHhJRHMgPSBuZXcgaW50W2lkeENvdW50XTsKKyAgICAgICAgaW50W10gcHJpbWl0aXZlcyA9IG5ldyBpbnRbaWR4Q291bnRdOworCisgICAgICAgIG1SUy5uTWVzaEdldFZlcnRpY2VzKG1JRCwgdnR4SURzLCB2dHhDb3VudCk7CisgICAgICAgIG1SUy5uTWVzaEdldEluZGljZXMobUlELCBpZHhJRHMsIHByaW1pdGl2ZXMsIHZ0eENvdW50KTsKKworICAgICAgICBtVmVydGV4QnVmZmVycyA9IG5ldyBBbGxvY2F0aW9uW3Z0eENvdW50XTsKKyAgICAgICAgbUluZGV4QnVmZmVycyA9IG5ldyBBbGxvY2F0aW9uW2lkeENvdW50XTsKKyAgICAgICAgbVByaW1pdGl2ZXMgPSBuZXcgUHJpbWl0aXZlW2lkeENvdW50XTsKKworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgdnR4Q291bnQ7IGkgKyspIHsKKyAgICAgICAgICAgIGlmKHZ0eElEc1tpXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbVZlcnRleEJ1ZmZlcnNbaV0gPSBuZXcgQWxsb2NhdGlvbih2dHhJRHNbaV0sIG1SUyk7CisgICAgICAgICAgICAgICAgbVZlcnRleEJ1ZmZlcnNbaV0udXBkYXRlRnJvbU5hdGl2ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGlkeENvdW50OyBpICsrKSB7CisgICAgICAgICAgICBpZihpZHhJRHNbaV0gIT0gMCkgeworICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlcnNbaV0gPSBuZXcgQWxsb2NhdGlvbihpZHhJRHNbaV0sIG1SUyk7CisgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyc1tpXS51cGRhdGVGcm9tTmF0aXZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJpbWl0aXZlc1tpXSA9IFByaW1pdGl2ZS52YWx1ZXMoKVtwcmltaXRpdmVzW2ldXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CisKKyAgICAgICAgY2xhc3MgRW50cnkgeworICAgICAgICAgICAgVHlwZSB0OworICAgICAgICAgICAgRWxlbWVudCBlOworICAgICAgICAgICAgaW50IHNpemU7CisgICAgICAgICAgICBQcmltaXRpdmUgcHJpbTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBtVmVydGV4VHlwZUNvdW50OworICAgICAgICBFbnRyeVtdIG1WZXJ0ZXhUeXBlczsKKyAgICAgICAgVmVjdG9yIG1JbmRleFR5cGVzOworCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICAgICAgbVJTID0gcnM7CisgICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50ID0gMDsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlcyA9IG5ldyBFbnRyeVsxNl07CisgICAgICAgICAgICBtSW5kZXhUeXBlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkVmVydGV4VHlwZShUeXBlIHQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG1WZXJ0ZXhUeXBlQ291bnQgPj0gbVZlcnRleFR5cGVzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1heCB2ZXJ0ZXggdHlwZXMgZXhjZWVkZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ID0gbVZlcnRleFR5cGVDb3VudDsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLnQgPSB0OworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLmUgPSBudWxsOworICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCsrOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZFZlcnRleFR5cGUoRWxlbWVudCBlLCBpbnQgc2l6ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobVZlcnRleFR5cGVDb3VudCA+PSBtVmVydGV4VHlwZXMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWF4IHZlcnRleCB0eXBlcyBleGNlZWRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggPSBtVmVydGV4VHlwZUNvdW50OworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0udCA9IG51bGw7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0uZSA9IGU7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0uc2l6ZSA9IHNpemU7CisgICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50Kys7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkSW5kZXhUeXBlKFR5cGUgdCwgUHJpbWl0aXZlIHApIHsKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ICA9IG1JbmRleFR5cGVzLnNpemUoKTsKKyAgICAgICAgICAgIEVudHJ5IGluZGV4VHlwZSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgaW5kZXhUeXBlLnQgPSB0OworICAgICAgICAgICAgaW5kZXhUeXBlLmUgPSBudWxsOworICAgICAgICAgICAgaW5kZXhUeXBlLnNpemUgPSAwOworICAgICAgICAgICAgaW5kZXhUeXBlLnByaW0gPSBwOworICAgICAgICAgICAgbUluZGV4VHlwZXMuYWRkRWxlbWVudChpbmRleFR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZEluZGV4VHlwZShQcmltaXRpdmUgcCkgeworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggID0gbUluZGV4VHlwZXMuc2l6ZSgpOworICAgICAgICAgICAgRW50cnkgaW5kZXhUeXBlID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBpbmRleFR5cGUudCA9IG51bGw7CisgICAgICAgICAgICBpbmRleFR5cGUuZSA9IG51bGw7CisgICAgICAgICAgICBpbmRleFR5cGUuc2l6ZSA9IDA7CisgICAgICAgICAgICBpbmRleFR5cGUucHJpbSA9IHA7CisgICAgICAgICAgICBtSW5kZXhUeXBlcy5hZGRFbGVtZW50KGluZGV4VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkSW5kZXhUeXBlKEVsZW1lbnQgZSwgaW50IHNpemUsIFByaW1pdGl2ZSBwKSB7CisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCAgPSBtSW5kZXhUeXBlcy5zaXplKCk7CisgICAgICAgICAgICBFbnRyeSBpbmRleFR5cGUgPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIGluZGV4VHlwZS50ID0gbnVsbDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5lID0gZTsKKyAgICAgICAgICAgIGluZGV4VHlwZS5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgIGluZGV4VHlwZS5wcmltID0gcDsKKyAgICAgICAgICAgIG1JbmRleFR5cGVzLmFkZEVsZW1lbnQoaW5kZXhUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgVHlwZSBuZXdUeXBlKEVsZW1lbnQgZSwgaW50IHNpemUpIHsKKyAgICAgICAgICAgIFR5cGUuQnVpbGRlciB0YiA9IG5ldyBUeXBlLkJ1aWxkZXIobVJTLCBlKTsKKyAgICAgICAgICAgIHRiLmFkZChEaW1lbnNpb24uWCwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gdGIuY3JlYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgc3luY2hyb25pemVkIE1lc2ggaW50ZXJuYWxDcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBCdWlsZGVyIGIpIHsKKworICAgICAgICAgICAgaW50IGlkID0gcnMubk1lc2hDcmVhdGUoYi5tVmVydGV4VHlwZUNvdW50LCBiLm1JbmRleFR5cGVzLnNpemUoKSk7CisgICAgICAgICAgICBNZXNoIG5ld01lc2ggPSBuZXcgTWVzaChpZCwgcnMpOworICAgICAgICAgICAgbmV3TWVzaC5tSW5kZXhCdWZmZXJzID0gbmV3IEFsbG9jYXRpb25bYi5tSW5kZXhUeXBlcy5zaXplKCldOworICAgICAgICAgICAgbmV3TWVzaC5tUHJpbWl0aXZlcyA9IG5ldyBQcmltaXRpdmVbYi5tSW5kZXhUeXBlcy5zaXplKCldOworICAgICAgICAgICAgbmV3TWVzaC5tVmVydGV4QnVmZmVycyA9IG5ldyBBbGxvY2F0aW9uW2IubVZlcnRleFR5cGVDb3VudF07CisKKyAgICAgICAgICAgIGZvcihpbnQgY3QgPSAwOyBjdCA8IGIubUluZGV4VHlwZXMuc2l6ZSgpOyBjdCArKykgeworICAgICAgICAgICAgICAgIEFsbG9jYXRpb24gYWxsb2MgPSBudWxsOworICAgICAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KWIubUluZGV4VHlwZXMuZWxlbWVudEF0KGN0KTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChycywgZW50cnkudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoZW50cnkuZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChycywgZW50cnkuZSwgZW50cnkuc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBhbGxvY0lEID0gKGFsbG9jID09IG51bGwpID8gMCA6IGFsbG9jLmdldElEKCk7CisgICAgICAgICAgICAgICAgcnMubk1lc2hCaW5kSW5kZXgoaWQsIGFsbG9jSUQsIGVudHJ5LnByaW0ubUlELCBjdCk7CisgICAgICAgICAgICAgICAgbmV3TWVzaC5tSW5kZXhCdWZmZXJzW2N0XSA9IGFsbG9jOworICAgICAgICAgICAgICAgIG5ld01lc2gubVByaW1pdGl2ZXNbY3RdID0gZW50cnkucHJpbTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKGludCBjdCA9IDA7IGN0IDwgYi5tVmVydGV4VHlwZUNvdW50OyBjdCArKykgeworICAgICAgICAgICAgICAgIEFsbG9jYXRpb24gYWxsb2MgPSBudWxsOworICAgICAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gYi5tVmVydGV4VHlwZXNbY3RdOworICAgICAgICAgICAgICAgIGlmIChlbnRyeS50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKHJzLCBlbnRyeS50KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYoZW50cnkuZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChycywgZW50cnkuZSwgZW50cnkuc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJzLm5NZXNoQmluZFZlcnRleChpZCwgYWxsb2MuZ2V0SUQoKSwgY3QpOworICAgICAgICAgICAgICAgIG5ld01lc2gubVZlcnRleEJ1ZmZlcnNbY3RdID0gYWxsb2M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXdNZXNoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1lc2ggY3JlYXRlKCkgeworICAgICAgICAgICAgbVJTLnZhbGlkYXRlKCk7CisgICAgICAgICAgICBNZXNoIHNtID0gaW50ZXJuYWxDcmVhdGUobVJTLCB0aGlzKTsKKyAgICAgICAgICAgIHJldHVybiBzbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWxsb2NhdGlvbkJ1aWxkZXIgeworICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOworCisgICAgICAgIGNsYXNzIEVudHJ5IHsKKyAgICAgICAgICAgIEFsbG9jYXRpb24gYTsKKyAgICAgICAgICAgIFByaW1pdGl2ZSBwcmltOworICAgICAgICB9CisKKyAgICAgICAgaW50IG1WZXJ0ZXhUeXBlQ291bnQ7CisgICAgICAgIEVudHJ5W10gbVZlcnRleFR5cGVzOworCisgICAgICAgIFZlY3RvciBtSW5kZXhUeXBlczsKKworICAgICAgICBwdWJsaWMgQWxsb2NhdGlvbkJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgICAgICBtUlMgPSByczsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQgPSAwOworICAgICAgICAgICAgbVZlcnRleFR5cGVzID0gbmV3IEVudHJ5WzE2XTsKKyAgICAgICAgICAgIG1JbmRleFR5cGVzID0gbmV3IFZlY3RvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRWZXJ0ZXhBbGxvY2F0aW9uKEFsbG9jYXRpb24gYSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobVZlcnRleFR5cGVDb3VudCA+PSBtVmVydGV4VHlwZXMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWF4IHZlcnRleCB0eXBlcyBleGNlZWRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggPSBtVmVydGV4VHlwZUNvdW50OworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0uYSA9IGE7CisgICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50Kys7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkSW5kZXhBbGxvY2F0aW9uKEFsbG9jYXRpb24gYSwgUHJpbWl0aXZlIHApIHsKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ICA9IG1JbmRleFR5cGVzLnNpemUoKTsKKyAgICAgICAgICAgIEVudHJ5IGluZGV4VHlwZSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgaW5kZXhUeXBlLmEgPSBhOworICAgICAgICAgICAgaW5kZXhUeXBlLnByaW0gPSBwOworICAgICAgICAgICAgbUluZGV4VHlwZXMuYWRkRWxlbWVudChpbmRleFR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZEluZGV4VHlwZShQcmltaXRpdmUgcCkgeworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggID0gbUluZGV4VHlwZXMuc2l6ZSgpOworICAgICAgICAgICAgRW50cnkgaW5kZXhUeXBlID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBpbmRleFR5cGUuYSA9IG51bGw7CisgICAgICAgICAgICBpbmRleFR5cGUucHJpbSA9IHA7CisgICAgICAgICAgICBtSW5kZXhUeXBlcy5hZGRFbGVtZW50KGluZGV4VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgTWVzaCBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEFsbG9jYXRpb25CdWlsZGVyIGIpIHsKKworICAgICAgICAgICAgaW50IGlkID0gcnMubk1lc2hDcmVhdGUoYi5tVmVydGV4VHlwZUNvdW50LCBiLm1JbmRleFR5cGVzLnNpemUoKSk7CisgICAgICAgICAgICBNZXNoIG5ld01lc2ggPSBuZXcgTWVzaChpZCwgcnMpOworICAgICAgICAgICAgbmV3TWVzaC5tSW5kZXhCdWZmZXJzID0gbmV3IEFsbG9jYXRpb25bYi5tSW5kZXhUeXBlcy5zaXplKCldOworICAgICAgICAgICAgbmV3TWVzaC5tUHJpbWl0aXZlcyA9IG5ldyBQcmltaXRpdmVbYi5tSW5kZXhUeXBlcy5zaXplKCldOworICAgICAgICAgICAgbmV3TWVzaC5tVmVydGV4QnVmZmVycyA9IG5ldyBBbGxvY2F0aW9uW2IubVZlcnRleFR5cGVDb3VudF07CisKKyAgICAgICAgICAgIGZvcihpbnQgY3QgPSAwOyBjdCA8IGIubUluZGV4VHlwZXMuc2l6ZSgpOyBjdCArKykgeworICAgICAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KWIubUluZGV4VHlwZXMuZWxlbWVudEF0KGN0KTsKKyAgICAgICAgICAgICAgICBpbnQgYWxsb2NJRCA9IChlbnRyeS5hID09IG51bGwpID8gMCA6IGVudHJ5LmEuZ2V0SUQoKTsKKyAgICAgICAgICAgICAgICBycy5uTWVzaEJpbmRJbmRleChpZCwgYWxsb2NJRCwgZW50cnkucHJpbS5tSUQsIGN0KTsKKyAgICAgICAgICAgICAgICBuZXdNZXNoLm1JbmRleEJ1ZmZlcnNbY3RdID0gZW50cnkuYTsKKyAgICAgICAgICAgICAgICBuZXdNZXNoLm1QcmltaXRpdmVzW2N0XSA9IGVudHJ5LnByaW07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcihpbnQgY3QgPSAwOyBjdCA8IGIubVZlcnRleFR5cGVDb3VudDsgY3QgKyspIHsKKyAgICAgICAgICAgICAgICBFbnRyeSBlbnRyeSA9IGIubVZlcnRleFR5cGVzW2N0XTsKKyAgICAgICAgICAgICAgICBycy5uTWVzaEJpbmRWZXJ0ZXgoaWQsIGVudHJ5LmEubUlELCBjdCk7CisgICAgICAgICAgICAgICAgbmV3TWVzaC5tVmVydGV4QnVmZmVyc1tjdF0gPSBlbnRyeS5hOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3TWVzaDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZXNoIGNyZWF0ZSgpIHsKKyAgICAgICAgICAgIG1SUy52YWxpZGF0ZSgpOworICAgICAgICAgICAgTWVzaCBzbSA9IGludGVybmFsQ3JlYXRlKG1SUywgdGhpcyk7CisgICAgICAgICAgICByZXR1cm4gc207CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHJpYW5nbGVNZXNoQnVpbGRlciB7CisgICAgICAgIGZsb2F0IG1WdHhEYXRhW107CisgICAgICAgIGludCBtVnR4Q291bnQ7CisgICAgICAgIHNob3J0IG1JbmRleERhdGFbXTsKKyAgICAgICAgaW50IG1JbmRleENvdW50OworICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOworICAgICAgICBFbGVtZW50IG1FbGVtZW50OworCisgICAgICAgIGZsb2F0IG1OWCA9IDA7CisgICAgICAgIGZsb2F0IG1OWSA9IDA7CisgICAgICAgIGZsb2F0IG1OWiA9IC0xOworICAgICAgICBmbG9hdCBtUzAgPSAwOworICAgICAgICBmbG9hdCBtVDAgPSAwOworICAgICAgICBmbG9hdCBtUiA9IDE7CisgICAgICAgIGZsb2F0IG1HID0gMTsKKyAgICAgICAgZmxvYXQgbUIgPSAxOworICAgICAgICBmbG9hdCBtQSA9IDE7CisKKyAgICAgICAgaW50IG1WdHhTaXplOworICAgICAgICBpbnQgbUZsYWdzOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTE9SID0gMHgwMDAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1JNQUwgPSAweDAwMDI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFRVUkVfMCA9IDB4MDEwMDsKKworICAgICAgICBwdWJsaWMgVHJpYW5nbGVNZXNoQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMsIGludCB2dHhTaXplLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIG1SUyA9IHJzOworICAgICAgICAgICAgbVZ0eENvdW50ID0gMDsKKyAgICAgICAgICAgIG1JbmRleENvdW50ID0gMDsKKyAgICAgICAgICAgIG1WdHhEYXRhID0gbmV3IGZsb2F0WzEyOF07CisgICAgICAgICAgICBtSW5kZXhEYXRhID0gbmV3IHNob3J0WzEyOF07CisgICAgICAgICAgICBtVnR4U2l6ZSA9IHZ0eFNpemU7CisgICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKKworICAgICAgICAgICAgaWYgKHZ0eFNpemUgPCAyIHx8IHZ0eFNpemUgPiAzKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmVydGV4IHNpemUgb3V0IG9mIHJhbmdlLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIG1ha2VTcGFjZShpbnQgY291bnQpIHsKKyAgICAgICAgICAgIGlmICgobVZ0eENvdW50ICsgY291bnQpID49IG1WdHhEYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGZsb2F0IHRbXSA9IG5ldyBmbG9hdFttVnR4RGF0YS5sZW5ndGggKiAyXTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1WdHhEYXRhLCAwLCB0LCAwLCBtVnR4RGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIG1WdHhEYXRhID0gdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBsYXRjaCgpIHsKKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpICE9IDApIHsKKyAgICAgICAgICAgICAgICBtYWtlU3BhY2UoNCk7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbVI7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbUc7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbUI7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbUE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIFRFWFRVUkVfMCkgIT0gMCkgeworICAgICAgICAgICAgICAgIG1ha2VTcGFjZSgyKTsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtUzA7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbVQwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBOT1JNQUwpICE9IDApIHsKKyAgICAgICAgICAgICAgICBtYWtlU3BhY2UoMyk7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbU5YOworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1OWTsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtTlo7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGRWZXJ0ZXgoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICAgICAgaWYgKG1WdHhTaXplICE9IDIpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ha2VTcGFjZSgyKTsKKyAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHg7CisgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB5OworICAgICAgICAgICAgbGF0Y2goKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFZlcnRleChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgICAgICBpZiAobVZ0eFNpemUgIT0gMykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFrZVNwYWNlKDMpOworICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geDsKKyAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHk7CisgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB6OworICAgICAgICAgICAgbGF0Y2goKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHR1cmUoZmxvYXQgcywgZmxvYXQgdCkgeworICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBURVhUVVJFXzApID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TMCA9IHM7CisgICAgICAgICAgICBtVDAgPSB0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Tm9ybWFsKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgTk9STUFMKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTlggPSB4OworICAgICAgICAgICAgbU5ZID0geTsKKyAgICAgICAgICAgIG1OWiA9IHo7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKSB7CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIENPTE9SKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUiA9IHI7CisgICAgICAgICAgICBtRyA9IGc7CisgICAgICAgICAgICBtQiA9IGI7CisgICAgICAgICAgICBtQSA9IGE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGRUcmlhbmdsZShpbnQgaWR4MSwgaW50IGlkeDIsIGludCBpZHgzKSB7CisgICAgICAgICAgICBpZigoaWR4MSA+PSBtVnR4Q291bnQpIHx8IChpZHgxIDwgMCkgfHwKKyAgICAgICAgICAgICAgIChpZHgyID49IG1WdHhDb3VudCkgfHwgKGlkeDIgPCAwKSB8fAorICAgICAgICAgICAgICAgKGlkeDMgPj0gbVZ0eENvdW50KSB8fCAoaWR4MyA8IDApKSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbmRleCBwcm92aWRlZCBncmVhdGVyIHRoYW4gdmVydGV4IGNvdW50LiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtSW5kZXhDb3VudCArIDMpID49IG1JbmRleERhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgc2hvcnQgdFtdID0gbmV3IHNob3J0W21JbmRleERhdGEubGVuZ3RoICogMl07CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtSW5kZXhEYXRhLCAwLCB0LCAwLCBtSW5kZXhEYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgbUluZGV4RGF0YSA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSW5kZXhEYXRhW21JbmRleENvdW50KytdID0gKHNob3J0KWlkeDE7CisgICAgICAgICAgICBtSW5kZXhEYXRhW21JbmRleENvdW50KytdID0gKHNob3J0KWlkeDI7CisgICAgICAgICAgICBtSW5kZXhEYXRhW21JbmRleENvdW50KytdID0gKHNob3J0KWlkeDM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWVzaCBjcmVhdGUoYm9vbGVhbiB1cGxvYWRUb0J1ZmZlck9iamVjdCkgeworICAgICAgICAgICAgRWxlbWVudC5CdWlsZGVyIGIgPSBuZXcgRWxlbWVudC5CdWlsZGVyKG1SUyk7CisgICAgICAgICAgICBpbnQgZmxvYXRDb3VudCA9IG1WdHhTaXplOworICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5jcmVhdGVWZWN0b3IobVJTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WdHhTaXplKSwgInBvc2l0aW9uIik7CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIENPTE9SKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZmxvYXRDb3VudCArPSA0OworICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuRjMyXzQobVJTKSwgImNvbG9yIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIFRFWFRVUkVfMCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGZsb2F0Q291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LkYzMl8yKG1SUyksICJ0ZXh0dXJlMCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBOT1JNQUwpICE9IDApIHsKKyAgICAgICAgICAgICAgICBmbG9hdENvdW50ICs9IDM7CisgICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5GMzJfMyhtUlMpLCAibm9ybWFsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRWxlbWVudCA9IGIuY3JlYXRlKCk7CisKKyAgICAgICAgICAgIEJ1aWxkZXIgc21iID0gbmV3IEJ1aWxkZXIobVJTKTsKKyAgICAgICAgICAgIHNtYi5hZGRWZXJ0ZXhUeXBlKG1FbGVtZW50LCBtVnR4Q291bnQgLyBmbG9hdENvdW50KTsKKyAgICAgICAgICAgIHNtYi5hZGRJbmRleFR5cGUoRWxlbWVudC5VMTYobVJTKSwgbUluZGV4Q291bnQsIFByaW1pdGl2ZS5UUklBTkdMRSk7CisKKyAgICAgICAgICAgIE1lc2ggc20gPSBzbWIuY3JlYXRlKCk7CisKKyAgICAgICAgICAgIHNtLmdldFZlcnRleEFsbG9jYXRpb24oMCkuZGF0YShtVnR4RGF0YSk7CisgICAgICAgICAgICBpZih1cGxvYWRUb0J1ZmZlck9iamVjdCkgeworICAgICAgICAgICAgICAgIHNtLmdldFZlcnRleEFsbG9jYXRpb24oMCkudXBsb2FkVG9CdWZmZXJPYmplY3QoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc20uZ2V0SW5kZXhBbGxvY2F0aW9uKDApLmRhdGEobUluZGV4RGF0YSk7CisgICAgICAgICAgICBzbS5nZXRJbmRleEFsbG9jYXRpb24oMCkudXBsb2FkVG9CdWZmZXJPYmplY3QoKTsKKworICAgICAgICAgICAgcmV0dXJuIHNtOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW0uamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbS5qYXZhCmluZGV4IDE2MTRlYzUuLmM2ZWQ3MmEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbS5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKIAogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIApAQCAtMzgsOCArNDMsNyBAQAogICAgIFN0cmluZyBtU2hhZGVyOwogCiAgICAgUHJvZ3JhbShpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgIG1JRCA9IGlkOworICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGJpbmRDb25zdGFudHMoQWxsb2NhdGlvbiBhLCBpbnQgc2xvdCkgewpAQCAtOTEsOCArOTUsNDcgQEAKICAgICAgICAgICAgIG1UZXh0dXJlQ291bnQgPSAwOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2hhZGVyKFN0cmluZyBzKSB7CisgICAgICAgIHB1YmxpYyBCYXNlUHJvZ3JhbUJ1aWxkZXIgc2V0U2hhZGVyKFN0cmluZyBzKSB7CiAgICAgICAgICAgICBtU2hhZGVyID0gczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJhc2VQcm9ncmFtQnVpbGRlciBzZXRTaGFkZXIoUmVzb3VyY2VzIHJlc291cmNlcywgaW50IHJlc291cmNlSUQpIHsKKyAgICAgICAgICAgIGJ5dGVbXSBzdHI7CisgICAgICAgICAgICBpbnQgc3RyTGVuZ3RoOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSByZXNvdXJjZXMub3BlblJhd1Jlc291cmNlKHJlc291cmNlSUQpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdHIgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgICAgICAgICAgICAgc3RyTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzTGVmdCA9IHN0ci5sZW5ndGggLSBzdHJMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNMZWZ0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmMiA9IG5ldyBieXRlW3N0ci5sZW5ndGggKiAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHN0ciwgMCwgYnVmMiwgMCwgc3RyLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gYnVmMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc0xlZnQgPSBzdHIubGVuZ3RoIC0gc3RyTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IGlzLnJlYWQoc3RyLCBzdHJMZW5ndGgsIGJ5dGVzTGVmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ckxlbmd0aCArPSBieXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2hhZGVyID0gbmV3IFN0cmluZyhzdHIsIDAsIHN0ckxlbmd0aCwgIlVURi04Iik7CisgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZSgiUmVuZGVyc2NyaXB0IHNoYWRlciBjcmVhdGlvbiIsICJDb3VsZCBub3QgZGVjb2RlIHNoYWRlciBzdHJpbmciKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChFbGVtZW50IGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewpAQCAtMTIwLDEyICsxNjMsMTMgQEAKICAgICAgICAgICAgIHJldHVybiBtQ29uc3RhbnRDb3VudCsrOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHVyZUNvdW50KGludCBjb3VudCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIHB1YmxpYyBCYXNlUHJvZ3JhbUJ1aWxkZXIgc2V0VGV4dHVyZUNvdW50KGludCBjb3VudCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAvLyBTaG91bGQgY2hlY2sgZm9yIGNvbnNpc3RhbnQgYW5kIG5vbi1jb25mbGljdGluZyBuYW1lcy4uLgogICAgICAgICAgICAgaWYoY291bnQgPj0gTUFYX0NPTlNUQU5UKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWF4IHRleHR1cmUgY291bnQgZXhjZWVkZWQuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtVGV4dHVyZUNvdW50ID0gY291bnQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIGluaXRQcm9ncmFtKFByb2dyYW0gcCkgewpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtRnJhZ21lbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbUZyYWdtZW50LmphdmEKaW5kZXggNWUwNGYwYy4uMDQwOTFhMyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtRnJhZ21lbnQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1GcmFnbWVudC5qYXZhCkBAIC02Niw2ICs2Niw3IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9URVhUVVJFID0gMjsKICAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKICAgICAgICAgYm9vbGVhbiBtUG9pbnRTcHJpdGVFbmFibGU7CisgICAgICAgIGJvb2xlYW4gbVZhcnlpbmdDb2xvckVuYWJsZTsKIAogICAgICAgICBwdWJsaWMgZW51bSBFbnZNb2RlIHsKICAgICAgICAgICAgIFJFUExBQ0UgKDEpLApAQCAtMTA2LDIxICsxMDcsMjggQEAKICAgICAgICAgICAgIG1Qb2ludFNwcml0ZUVuYWJsZSA9IGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHVyZShFbnZNb2RlIGVudiwgRm9ybWF0IGZtdCwgaW50IHNsb3QpCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFRleHR1cmUoRW52TW9kZSBlbnYsIEZvcm1hdCBmbXQsIGludCBzbG90KQogICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpZigoc2xvdCA8IDApIHx8IChzbG90ID49IE1BWF9URVhUVVJFKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1BWF9URVhUVVJFIGV4Y2VlZGVkLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVNsb3RzW3Nsb3RdID0gbmV3IFNsb3QoZW52LCBmbXQpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQb2ludFNwcml0ZVRleENvb3JkaW5hdGVSZXBsYWNlbWVudChib29sZWFuIGVuYWJsZSkgeworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQb2ludFNwcml0ZVRleENvb3JkaW5hdGVSZXBsYWNlbWVudChib29sZWFuIGVuYWJsZSkgewogICAgICAgICAgICAgbVBvaW50U3ByaXRlRW5hYmxlID0gZW5hYmxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRWYXJ5aW5nQ29sb3IoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgICAgIG1WYXJ5aW5nQ29sb3JFbmFibGUgPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBQcm9ncmFtRnJhZ21lbnQgY3JlYXRlKCkgewogICAgICAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICBpbnRbXSB0bXAgPSBuZXcgaW50W01BWF9URVhUVVJFICogMiArIDFdOworICAgICAgICAgICAgaW50W10gdG1wID0gbmV3IGludFtNQVhfVEVYVFVSRSAqIDIgKyAyXTsKICAgICAgICAgICAgIGlmIChtU2xvdHNbMF0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRtcFswXSA9IG1TbG90c1swXS5lbnYubUlEOwogICAgICAgICAgICAgICAgIHRtcFsxXSA9IG1TbG90c1swXS5mb3JtYXQubUlEOwpAQCAtMTMwLDYgKzEzOCw3IEBACiAgICAgICAgICAgICAgICAgdG1wWzNdID0gbVNsb3RzWzFdLmZvcm1hdC5tSUQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0bXBbNF0gPSBtUG9pbnRTcHJpdGVFbmFibGUgPyAxIDogMDsKKyAgICAgICAgICAgIHRtcFs1XSA9IG1WYXJ5aW5nQ29sb3JFbmFibGUgPyAxIDogMDsKICAgICAgICAgICAgIGludCBpZCA9IG1SUy5uUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKHRtcCk7CiAgICAgICAgICAgICBQcm9ncmFtRnJhZ21lbnQgcGYgPSBuZXcgUHJvZ3JhbUZyYWdtZW50KGlkLCBtUlMpOwogICAgICAgICAgICAgcGYubVRleHR1cmVDb3VudCA9IE1BWF9URVhUVVJFOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtUmFzdGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1SYXN0ZXIuamF2YQppbmRleCA1NmY5YmY0Li5mZDg5YjZlIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1SYXN0ZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1SYXN0ZXIuamF2YQpAQCAtMjYsMjMgKzI2LDMzIEBACiAgKgogICoqLwogcHVibGljIGNsYXNzIFByb2dyYW1SYXN0ZXIgZXh0ZW5kcyBCYXNlT2JqIHsKKworICAgIHB1YmxpYyBlbnVtIEN1bGxNb2RlIHsKKyAgICAgICAgQkFDSyAoMCksCisgICAgICAgIEZST05UICgxKSwKKyAgICAgICAgTk9ORSAoMik7CisKKyAgICAgICAgaW50IG1JRDsKKyAgICAgICAgQ3VsbE1vZGUoaW50IGlkKSB7CisgICAgICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGJvb2xlYW4gbVBvaW50U21vb3RoOwogICAgIGJvb2xlYW4gbUxpbmVTbW9vdGg7CiAgICAgYm9vbGVhbiBtUG9pbnRTcHJpdGU7Ci0gICAgZmxvYXQgbVBvaW50U2l6ZTsKICAgICBmbG9hdCBtTGluZVdpZHRoOwotICAgIEVsZW1lbnQgbUluOwotICAgIEVsZW1lbnQgbU91dDsKKyAgICBDdWxsTW9kZSBtQ3VsbE1vZGU7CiAKICAgICBQcm9ncmFtUmFzdGVyKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAKLSAgICAgICAgbVBvaW50U2l6ZSA9IDEuMGY7CiAgICAgICAgIG1MaW5lV2lkdGggPSAxLjBmOwogICAgICAgICBtUG9pbnRTbW9vdGggPSBmYWxzZTsKICAgICAgICAgbUxpbmVTbW9vdGggPSBmYWxzZTsKICAgICAgICAgbVBvaW50U3ByaXRlID0gZmFsc2U7CisKKyAgICAgICAgbUN1bGxNb2RlID0gQ3VsbE1vZGUuQkFDSzsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRMaW5lV2lkdGgoZmxvYXQgdykgewpAQCAtNTEsNTEgKzYxLDc4IEBACiAgICAgICAgIG1SUy5uUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChtSUQsIHcpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldFBvaW50U2l6ZShmbG9hdCBzKSB7CisgICAgcHVibGljIHZvaWQgc2V0Q3VsbE1vZGUoQ3VsbE1vZGUgbSkgewogICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVBvaW50U2l6ZSA9IHM7Ci0gICAgICAgIG1SUy5uUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZShtSUQsIHMpOworICAgICAgICBtQ3VsbE1vZGUgPSBtOworICAgICAgICBtUlMublByb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShtSUQsIG0ubUlEKTsKICAgICB9CiAKLSAgICB2b2lkIGludGVybmFsSW5pdCgpIHsKLSAgICAgICAgaW50IGluSUQgPSAwOwotICAgICAgICBpbnQgb3V0SUQgPSAwOwotICAgICAgICBpZiAobUluICE9IG51bGwpIHsKLSAgICAgICAgICAgIGluSUQgPSBtSW4ubUlEOworICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVJhc3RlciBDVUxMX0JBQ0soUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtUmFzdGVyX0NVTExfQkFDSyA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtUmFzdGVyLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtUmFzdGVyLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRDdWxsTW9kZShDdWxsTW9kZS5CQUNLKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtUmFzdGVyX0NVTExfQkFDSyA9IGJ1aWxkZXIuY3JlYXRlKCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1PdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgb3V0SUQgPSBtT3V0Lm1JRDsKLSAgICAgICAgfQotICAgICAgICBtSUQgPSBtUlMublByb2dyYW1SYXN0ZXJDcmVhdGUoaW5JRCwgb3V0SUQsIG1Qb2ludFNtb290aCwgbUxpbmVTbW9vdGgsIG1Qb2ludFNwcml0ZSk7CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVJhc3Rlcl9DVUxMX0JBQ0s7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtUmFzdGVyIENVTExfRlJPTlQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtUmFzdGVyX0NVTExfRlJPTlQgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVJhc3Rlci5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVJhc3Rlci5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q3VsbE1vZGUoQ3VsbE1vZGUuRlJPTlQpOworICAgICAgICAgICAgcnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9GUk9OVCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtUmFzdGVyX0NVTExfRlJPTlQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtUmFzdGVyIENVTExfTk9ORShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9OT05FID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1SYXN0ZXIuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1SYXN0ZXIuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEN1bGxNb2RlKEN1bGxNb2RlLk5PTkUpOworICAgICAgICAgICAgcnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9OT05FID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9OT05FOworICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7Ci0gICAgICAgIFByb2dyYW1SYXN0ZXIgbVBSOworICAgICAgICBib29sZWFuIG1Qb2ludFNwcml0ZTsKKyAgICAgICAgYm9vbGVhbiBtUG9pbnRTbW9vdGg7CisgICAgICAgIGJvb2xlYW4gbUxpbmVTbW9vdGg7CisgICAgICAgIEN1bGxNb2RlIG1DdWxsTW9kZTsKIAotICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMsIEVsZW1lbnQgaW4sIEVsZW1lbnQgb3V0KSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgewogICAgICAgICAgICAgbVJTID0gcnM7Ci0gICAgICAgICAgICBtUFIgPSBuZXcgUHJvZ3JhbVJhc3RlcigwLCBycyk7CisgICAgICAgICAgICBtUG9pbnRTbW9vdGggPSBmYWxzZTsKKyAgICAgICAgICAgIG1MaW5lU21vb3RoID0gZmFsc2U7CisgICAgICAgICAgICBtUG9pbnRTcHJpdGUgPSBmYWxzZTsKKyAgICAgICAgICAgIG1DdWxsTW9kZSA9IEN1bGxNb2RlLkJBQ0s7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQb2ludFNwcml0ZUVuYWJsZShib29sZWFuIGVuYWJsZSkgewotICAgICAgICAgICAgbVBSLm1Qb2ludFNwcml0ZSA9IGVuYWJsZTsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UG9pbnRTcHJpdGVFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgICAgIG1Qb2ludFNwcml0ZSA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UG9pbnRTbW9vdGhFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgICAgIG1QUi5tUG9pbnRTbW9vdGggPSBlbmFibGU7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBvaW50U21vb3RoRW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgICAgICBtUG9pbnRTbW9vdGggPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldExpbmVTbW9vdGhFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgICAgIG1QUi5tTGluZVNtb290aCA9IGVuYWJsZTsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TGluZVNtb290aEVuYWJsZShib29sZWFuIGVuYWJsZSkgeworICAgICAgICAgICAgbUxpbmVTbW9vdGggPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEN1bGxNb2RlKEN1bGxNb2RlIG0pIHsKKyAgICAgICAgICAgIG1DdWxsTW9kZSA9IG07CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQogCiAgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgUHJvZ3JhbVJhc3RlciBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEJ1aWxkZXIgYikgewotICAgICAgICAgICAgYi5tUFIuaW50ZXJuYWxJbml0KCk7Ci0gICAgICAgICAgICBQcm9ncmFtUmFzdGVyIHByID0gYi5tUFI7Ci0gICAgICAgICAgICBiLm1QUiA9IG5ldyBQcm9ncmFtUmFzdGVyKDAsIGIubVJTKTsKKyAgICAgICAgICAgIGludCBpZCA9IHJzLm5Qcm9ncmFtUmFzdGVyQ3JlYXRlKGIubVBvaW50U21vb3RoLCBiLm1MaW5lU21vb3RoLCBiLm1Qb2ludFNwcml0ZSk7CisgICAgICAgICAgICBQcm9ncmFtUmFzdGVyIHByID0gbmV3IFByb2dyYW1SYXN0ZXIoaWQsIHJzKTsKKyAgICAgICAgICAgIHByLnNldEN1bGxNb2RlKGIubUN1bGxNb2RlKTsKICAgICAgICAgICAgIHJldHVybiBwcjsKICAgICAgICAgfQogCkBAIC0xMTEsMyArMTQ4LDQgQEAKIAogCiAKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtU3RvcmUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVN0b3JlLmphdmEKaW5kZXggNjliZTI0NTQuLjMyYzBkMDEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVN0b3JlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtU3RvcmUuamF2YQpAQCAtNzYsMTEgKzc2LDE0MyBAQAogCiAKICAgICBQcm9ncmFtU3RvcmUoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgc3VwZXIocnMpOwotICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9OT05FX0RFUFRIX1RFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9URVNUID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5MRVNTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5PTkUsIEJsZW5kRHN0RnVuYy5aRVJPKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKHRydWUpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX1RFU1QgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfVEVTVDsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfTk9ORV9ERVBUSF9OT19ERVBUSChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX0RFUFRIID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5BTFdBWVMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLk9ORSwgQmxlbmREc3RGdW5jLlpFUk8pOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2soZmFsc2UpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX0RFUFRIID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX0RFUFRIOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9OT05FX0RFUFRIX05PX1RFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19URVNUID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5BTFdBWVMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLk9ORSwgQmxlbmREc3RGdW5jLlpFUk8pOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2sodHJ1ZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fVEVTVCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19URVNUOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9OT05FX0RFUFRIX05PX1dSSVRFKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fV1JJVEUgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkxFU1MpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLk9ORSwgQmxlbmREc3RGdW5jLlpFUk8pOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2soZmFsc2UpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX1dSSVRFID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX1dSSVRFOworICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX0FMUEhBX0RFUFRIX1RFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfVEVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuU1JDX0FMUEhBLCBCbGVuZERzdEZ1bmMuT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayh0cnVlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfVEVTVCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfVEVTVDsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfQUxQSEFfREVQVEhfTk9fREVQVEgoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fREVQVEggPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkFMV0FZUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuU1JDX0FMUEhBLCBCbGVuZERzdEZ1bmMuT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayhmYWxzZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX0RFUFRIID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19ERVBUSDsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfQUxQSEFfREVQVEhfTk9fVEVTVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19URVNUID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5BTFdBWVMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLlNSQ19BTFBIQSwgQmxlbmREc3RGdW5jLk9ORV9NSU5VU19TUkNfQUxQSEEpOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2sodHJ1ZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX1RFU1QgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX1RFU1Q7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX0FMUEhBX0RFUFRIX05PX1dSSVRFKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX1dSSVRFID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5MRVNTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5TUkNfQUxQSEEsIEJsZW5kRHN0RnVuYy5PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKGZhbHNlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fV1JJVEUgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX1dSSVRFOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX0FERF9ERVBUSF9URVNUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9URVNUID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5MRVNTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5PTkUsIEJsZW5kRHN0RnVuYy5PTkUpOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2sodHJ1ZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9URVNUID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfVEVTVDsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfQUREX0RFUFRIX05PX0RFUFRIKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19ERVBUSCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuQUxXQVlTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5PTkUsIEJsZW5kRHN0RnVuYy5PTkUpOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2soZmFsc2UpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fREVQVEggPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19ERVBUSDsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfQUREX0RFUFRIX05PX1RFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX1RFU1QgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkFMV0FZUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuT05FLCBCbGVuZERzdEZ1bmMuT05FKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKHRydWUpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fREVQVEggPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19URVNUOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9BRERfREVQVEhfTk9fV1JJVEUoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX1dSSVRFID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5BTFdBWVMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLk9ORSwgQmxlbmREc3RGdW5jLk9ORSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayhmYWxzZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19XUklURSA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX1dSSVRFOworICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CkBAIC0xMTAsMzIgKzI0Miw0OSBAQAogICAgICAgICAgICAgbUNvbG9yTWFza0EgPSB0cnVlOwogICAgICAgICAgICAgbUJsZW5kU3JjID0gQmxlbmRTcmNGdW5jLk9ORTsKICAgICAgICAgICAgIG1CbGVuZERzdCA9IEJsZW5kRHN0RnVuYy5aRVJPOwotCi0KICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERlcHRoRnVuYyhEZXB0aEZ1bmMgZnVuYykgeworICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgICAgIG1SUyA9IHJzOworICAgICAgICAgICAgbUluID0gbnVsbDsKKyAgICAgICAgICAgIG1PdXQgPSBudWxsOworICAgICAgICAgICAgbURlcHRoRnVuYyA9IERlcHRoRnVuYy5BTFdBWVM7CisgICAgICAgICAgICBtRGVwdGhNYXNrID0gZmFsc2U7CisgICAgICAgICAgICBtQ29sb3JNYXNrUiA9IHRydWU7CisgICAgICAgICAgICBtQ29sb3JNYXNrRyA9IHRydWU7CisgICAgICAgICAgICBtQ29sb3JNYXNrQiA9IHRydWU7CisgICAgICAgICAgICBtQ29sb3JNYXNrQSA9IHRydWU7CisgICAgICAgICAgICBtQmxlbmRTcmMgPSBCbGVuZFNyY0Z1bmMuT05FOworICAgICAgICAgICAgbUJsZW5kRHN0ID0gQmxlbmREc3RGdW5jLlpFUk87CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXREZXB0aEZ1bmMoRGVwdGhGdW5jIGZ1bmMpIHsKICAgICAgICAgICAgIG1EZXB0aEZ1bmMgPSBmdW5jOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXREZXB0aE1hc2soYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGVwdGhNYXNrKGJvb2xlYW4gZW5hYmxlKSB7CiAgICAgICAgICAgICBtRGVwdGhNYXNrID0gZW5hYmxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb2xvck1hc2soYm9vbGVhbiByLCBib29sZWFuIGcsIGJvb2xlYW4gYiwgYm9vbGVhbiBhKSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbG9yTWFzayhib29sZWFuIHIsIGJvb2xlYW4gZywgYm9vbGVhbiBiLCBib29sZWFuIGEpIHsKICAgICAgICAgICAgIG1Db2xvck1hc2tSID0gcjsKICAgICAgICAgICAgIG1Db2xvck1hc2tHID0gZzsKICAgICAgICAgICAgIG1Db2xvck1hc2tCID0gYjsKICAgICAgICAgICAgIG1Db2xvck1hc2tBID0gYTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYyBzcmMsIEJsZW5kRHN0RnVuYyBkc3QpIHsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYyBzcmMsIEJsZW5kRHN0RnVuYyBkc3QpIHsKICAgICAgICAgICAgIG1CbGVuZFNyYyA9IHNyYzsKICAgICAgICAgICAgIG1CbGVuZERzdCA9IGRzdDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0RGl0aGVyRW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERpdGhlckVuYWJsZShib29sZWFuIGVuYWJsZSkgewogICAgICAgICAgICAgbURpdGhlciA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKICAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBQcm9ncmFtU3RvcmUgaW50ZXJuYWxDcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBCdWlsZGVyIGIpIHsKQEAgLTE0NywxNyArMjk2LDE3IEBACiAgICAgICAgICAgICBpZiAoYi5tT3V0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBvdXRJRCA9IGIubU91dC5tSUQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbihpbklELCBvdXRJRCk7Ci0gICAgICAgICAgICBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMoYi5tRGVwdGhGdW5jLm1JRCk7Ci0gICAgICAgICAgICBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2soYi5tRGVwdGhNYXNrKTsKLSAgICAgICAgICAgIHJzLm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayhiLm1Db2xvck1hc2tSLAorICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZUJlZ2luKGluSUQsIG91dElEKTsKKyAgICAgICAgICAgIHJzLm5Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMoYi5tRGVwdGhGdW5jLm1JRCk7CisgICAgICAgICAgICBycy5uUHJvZ3JhbVN0b3JlRGVwdGhNYXNrKGIubURlcHRoTWFzayk7CisgICAgICAgICAgICBycy5uUHJvZ3JhbVN0b3JlQ29sb3JNYXNrKGIubUNvbG9yTWFza1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5tQ29sb3JNYXNrRywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLm1Db2xvck1hc2tCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIubUNvbG9yTWFza0EpOwotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jKGIubUJsZW5kU3JjLm1JRCwgYi5tQmxlbmREc3QubUlEKTsKLSAgICAgICAgICAgIHJzLm5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlcihiLm1EaXRoZXIpOworICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZUJsZW5kRnVuYyhiLm1CbGVuZFNyYy5tSUQsIGIubUJsZW5kRHN0Lm1JRCk7CisgICAgICAgICAgICBycy5uUHJvZ3JhbVN0b3JlRGl0aGVyKGIubURpdGhlcik7CiAKLSAgICAgICAgICAgIGludCBpZCA9IHJzLm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZSgpOworICAgICAgICAgICAgaW50IGlkID0gcnMublByb2dyYW1TdG9yZUNyZWF0ZSgpOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9ncmFtU3RvcmUoaWQsIHJzKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1WZXJ0ZXguamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVZlcnRleC5qYXZhCmluZGV4IDFiMTU1ZDcuLmIwNzI0MzMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVZlcnRleC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVZlcnRleC5qYXZhCkBAIC00Niw5ICs0NiwxMyBAQAogICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMsIEVsZW1lbnQgaW4sIEVsZW1lbnQgb3V0KSB7CiAgICAgICAgICAgICBtUlMgPSByczsKICAgICAgICAgfQorICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgICAgIG1SUyA9IHJzOworICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHVyZU1hdHJpeEVuYWJsZShib29sZWFuIGVuYWJsZSkgeworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRUZXh0dXJlTWF0cml4RW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7CiAgICAgICAgICAgICBtVGV4dHVyZU1hdHJpeEVuYWJsZSA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFByb2dyYW1WZXJ0ZXggY3JlYXRlKCkgewpAQCAtMTAzLDE0ICsxMDcsMTAgQEAKICAgICAgICAgcHVibGljIEFsbG9jYXRpb24gbUFsbG9jOwogCiAgICAgICAgIHB1YmxpYyBNYXRyaXhBbGxvY2F0aW9uKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICAgICAgbU1vZGVsID0gbmV3IE1hdHJpeDRmKCk7Ci0gICAgICAgICAgICBtUHJvamVjdGlvbiA9IG5ldyBNYXRyaXg0ZigpOwotICAgICAgICAgICAgbVRleHR1cmUgPSBuZXcgTWF0cml4NGYoKTsKLQogICAgICAgICAgICAgbUFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChycywgRWxlbWVudC5jcmVhdGVVc2VyKHJzLCBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyKSwgNDgpOwotICAgICAgICAgICAgbUFsbG9jLnN1YkRhdGExRChNT0RFTFZJRVdfT0ZGU0VULCAxNiwgbU1vZGVsLm1NYXQpOwotICAgICAgICAgICAgbUFsbG9jLnN1YkRhdGExRChQUk9KRUNUSU9OX09GRlNFVCwgMTYsIG1Qcm9qZWN0aW9uLm1NYXQpOwotICAgICAgICAgICAgbUFsbG9jLnN1YkRhdGExRChURVhUVVJFX09GRlNFVCwgMTYsIG1UZXh0dXJlLm1NYXQpOworICAgICAgICAgICAgbG9hZE1vZGVsdmlldyhuZXcgTWF0cml4NGYoKSk7CisgICAgICAgICAgICBsb2FkUHJvamVjdGlvbihuZXcgTWF0cml4NGYoKSk7CisgICAgICAgICAgICBsb2FkVGV4dHVyZShuZXcgTWF0cml4NGYoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0LmphdmEKaW5kZXggYTkzNTI0My4uZDUxMjU3YiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdC5qYXZhCkBAIC01NywxNTEgKzU3LDQ4MiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gTm9uLXRocmVhZHNhZmUgZnVuY3Rpb25zLgogICAgIG5hdGl2ZSB2b2lkIG5Jbml0RWxlbWVudHMoaW50IGE4LCBpbnQgcmdiYTQ0NDQsIGludCByZ2JhODg4OCwgaW50IHJnYjU2NSk7Ci0KICAgICBuYXRpdmUgaW50ICBuRGV2aWNlQ3JlYXRlKCk7CiAgICAgbmF0aXZlIHZvaWQgbkRldmljZURlc3Ryb3koaW50IGRldik7CiAgICAgbmF0aXZlIHZvaWQgbkRldmljZVNldENvbmZpZyhpbnQgZGV2LCBpbnQgcGFyYW0sIGludCB2YWx1ZSk7Ci0gICAgbmF0aXZlIGludCAgbkNvbnRleHRDcmVhdGVHTChpbnQgZGV2LCBpbnQgdmVyLCBib29sZWFuIHVzZURlcHRoKTsKLSAgICBuYXRpdmUgaW50ICBuQ29udGV4dENyZWF0ZShpbnQgZGV2LCBpbnQgdmVyKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dERlc3Ryb3koaW50IGNvbik7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRTZXRTdXJmYWNlKGludCB3LCBpbnQgaCwgU3VyZmFjZSBzdXIpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0U2V0UHJpb3JpdHkoaW50IHApOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0RHVtcChpbnQgYml0cyk7Ci0KLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRSb290U2NyaXB0KGludCBzY3JpcHQpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0QmluZFNhbXBsZXIoaW50IHNhbXBsZXIsIGludCBzbG90KTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShpbnQgcGZzKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQoaW50IHBmKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4KGludCBwZik7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlcihpbnQgcHIpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0UGF1c2UoKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dFJlc3VtZSgpOwotICAgIG5hdGl2ZSBpbnQgbkNvbnRleHRHZXRNZXNzYWdlKGludFtdIGRhdGEsIGJvb2xlYW4gd2FpdCk7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRJbml0VG9DbGllbnQoKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dERlaW5pdFRvQ2xpZW50KCk7Ci0KLSAgICBuYXRpdmUgdm9pZCBuQXNzaWduTmFtZShpbnQgb2JqLCBieXRlW10gbmFtZSk7Ci0gICAgbmF0aXZlIHZvaWQgbk9iakRlc3Ryb3koaW50IGlkKTsKLSAgICBuYXRpdmUgdm9pZCBuT2JqRGVzdHJveU9PQihpbnQgaWQpOwotICAgIG5hdGl2ZSBpbnQgIG5GaWxlT3BlbihieXRlW10gbmFtZSk7CisgICAgbmF0aXZlIGludCAgbkNvbnRleHRHZXRNZXNzYWdlKGludCBjb24sIGludFtdIGRhdGEsIGJvb2xlYW4gd2FpdCk7CisgICAgbmF0aXZlIHZvaWQgbkNvbnRleHRJbml0VG9DbGllbnQoaW50IGNvbik7CisgICAgbmF0aXZlIHZvaWQgbkNvbnRleHREZWluaXRUb0NsaWVudChpbnQgY29uKTsKIAogCi0gICAgbmF0aXZlIGludCAgbkVsZW1lbnRDcmVhdGUoaW50IHR5cGUsIGludCBraW5kLCBib29sZWFuIG5vcm0sIGludCB2ZWNTaXplKTsKLSAgICBuYXRpdmUgaW50ICBuRWxlbWVudENyZWF0ZTIoaW50W10gZWxlbWVudHMsIFN0cmluZ1tdIG5hbWVzKTsKKyAgICAvLyBNZXRob2RzIGJlbG93IGFyZSB3cmFwcGVkIHRvIHByb3RlY3QgdGhlIG5vbi10aHJlYWRzYWZlCisgICAgLy8gbG9ja2xlc3MgZmlmby4KKyAgICBuYXRpdmUgaW50ICByc25Db250ZXh0Q3JlYXRlR0woaW50IGRldiwgaW50IHZlciwgYm9vbGVhbiB1c2VEZXB0aCk7CisgICAgc3luY2hyb25pemVkIGludCBuQ29udGV4dENyZWF0ZUdMKGludCBkZXYsIGludCB2ZXIsIGJvb2xlYW4gdXNlRGVwdGgpIHsKKyAgICAgICAgcmV0dXJuIHJzbkNvbnRleHRDcmVhdGVHTChkZXYsIHZlciwgdXNlRGVwdGgpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25Db250ZXh0Q3JlYXRlKGludCBkZXYsIGludCB2ZXIpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkNvbnRleHRDcmVhdGUoaW50IGRldiwgaW50IHZlcikgeworICAgICAgICByZXR1cm4gcnNuQ29udGV4dENyZWF0ZShkZXYsIHZlcik7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHREZXN0cm95KGludCBjb24pOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0RGVzdHJveSgpIHsKKyAgICAgICAgcnNuQ29udGV4dERlc3Ryb3kobUNvbnRleHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0U2V0U3VyZmFjZShpbnQgY29uLCBpbnQgdywgaW50IGgsIFN1cmZhY2Ugc3VyKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dFNldFN1cmZhY2UoaW50IHcsIGludCBoLCBTdXJmYWNlIHN1cikgeworICAgICAgICByc25Db250ZXh0U2V0U3VyZmFjZShtQ29udGV4dCwgdywgaCwgc3VyKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dFNldFByaW9yaXR5KGludCBjb24sIGludCBwKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dFNldFByaW9yaXR5KGludCBwKSB7CisgICAgICAgIHJzbkNvbnRleHRTZXRQcmlvcml0eShtQ29udGV4dCwgcCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHREdW1wKGludCBjb24sIGludCBiaXRzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dER1bXAoaW50IGJpdHMpIHsKKyAgICAgICAgcnNuQ29udGV4dER1bXAobUNvbnRleHQsIGJpdHMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0RmluaXNoKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0RmluaXNoKCkgeworICAgICAgICByc25Db250ZXh0RmluaXNoKG1Db250ZXh0KTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuVHlwZUJlZ2luKGludCBlbGVtZW50SUQpOwotICAgIG5hdGl2ZSB2b2lkIG5UeXBlQWRkKGludCBkaW0sIGludCB2YWwpOwotICAgIG5hdGl2ZSBpbnQgIG5UeXBlQ3JlYXRlKCk7Ci0gICAgbmF0aXZlIHZvaWQgblR5cGVGaW5hbERlc3Ryb3koVHlwZSB0KTsKLSAgICBuYXRpdmUgdm9pZCBuVHlwZVNldHVwRmllbGRzKFR5cGUgdCwgaW50W10gdHlwZXMsIGludFtdIGJpdHMsIEZpZWxkW10gSURzKTsKKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0QmluZFJvb3RTY3JpcHQoaW50IGNvbiwgaW50IHNjcmlwdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kUm9vdFNjcmlwdChpbnQgc2NyaXB0KSB7CisgICAgICAgIHJzbkNvbnRleHRCaW5kUm9vdFNjcmlwdChtQ29udGV4dCwgc2NyaXB0KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dEJpbmRTYW1wbGVyKGludCBjb24sIGludCBzYW1wbGVyLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kU2FtcGxlcihpbnQgc2FtcGxlciwgaW50IHNsb3QpIHsKKyAgICAgICAgcnNuQ29udGV4dEJpbmRTYW1wbGVyKG1Db250ZXh0LCBzYW1wbGVyLCBzbG90KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUoaW50IGNvbiwgaW50IHBmcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKGludCBwZnMpIHsKKyAgICAgICAgcnNuQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUobUNvbnRleHQsIHBmcyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KGludCBjb24sIGludCBwZik7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KGludCBwZikgeworICAgICAgICByc25Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudChtQ29udGV4dCwgcGYpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgoaW50IGNvbiwgaW50IHB2KTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4KGludCBwdikgeworICAgICAgICByc25Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgobUNvbnRleHQsIHB2KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKGludCBjb24sIGludCBwcik7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlcihpbnQgcHIpIHsKKyAgICAgICAgcnNuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKG1Db250ZXh0LCBwcik7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHRQYXVzZShpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dFBhdXNlKCkgeworICAgICAgICByc25Db250ZXh0UGF1c2UobUNvbnRleHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0UmVzdW1lKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0UmVzdW1lKCkgeworICAgICAgICByc25Db250ZXh0UmVzdW1lKG1Db250ZXh0KTsKKyAgICB9CiAKLSAgICBuYXRpdmUgaW50ICBuQWxsb2NhdGlvbkNyZWF0ZVR5cGVkKGludCB0eXBlKTsKLSAgICBuYXRpdmUgaW50ICBuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAoaW50IGRzdEZtdCwgYm9vbGVhbiBnZW5NaXBzLCBCaXRtYXAgYm1wKTsKLSAgICBuYXRpdmUgaW50ICBuQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZihpbnQgdHlwZSwgQml0bWFwIGJtcCk7Ci0gICAgbmF0aXZlIGludCAgbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQoaW50IGRzdEZtdCwgYm9vbGVhbiBnZW5NaXBzLCBCaXRtYXAgYm1wKTsKLSAgICBuYXRpdmUgaW50ICBuQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbShpbnQgZHN0Rm10LCBib29sZWFuIGdlbk1pcHMsIGludCBhc3NldFN0cmVhbSk7CisgICAgbmF0aXZlIHZvaWQgcnNuQXNzaWduTmFtZShpbnQgY29uLCBpbnQgb2JqLCBieXRlW10gbmFtZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFzc2lnbk5hbWUoaW50IG9iaiwgYnl0ZVtdIG5hbWUpIHsKKyAgICAgICAgcnNuQXNzaWduTmFtZShtQ29udGV4dCwgb2JqLCBuYW1lKTsKKyAgICB9CisgICAgbmF0aXZlIFN0cmluZyByc25HZXROYW1lKGludCBjb24sIGludCBvYmopOworICAgIHN5bmNocm9uaXplZCBTdHJpbmcgbkdldE5hbWUoaW50IG9iaikgeworICAgICAgICByZXR1cm4gcnNuR2V0TmFtZShtQ29udGV4dCwgb2JqKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuT2JqRGVzdHJveShpbnQgY29uLCBpbnQgaWQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5PYmpEZXN0cm95KGludCBpZCkgeworICAgICAgICByc25PYmpEZXN0cm95KG1Db250ZXh0LCBpZCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkZpbGVPcGVuKGludCBjb24sIGJ5dGVbXSBuYW1lKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5GaWxlT3BlbihieXRlW10gbmFtZSkgeworICAgICAgICByZXR1cm4gcnNuRmlsZU9wZW4obUNvbnRleHQsIG5hbWUpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKGludCBhbGxvYywgYm9vbGVhbiBnZW5NaXBzLCBpbnQgYmFzZU1pb0xldmVsKTsKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KGludCBhbGxvYyk7CisgICAgbmF0aXZlIGludCAgcnNuRWxlbWVudENyZWF0ZShpbnQgY29uLCBpbnQgdHlwZSwgaW50IGtpbmQsIGJvb2xlYW4gbm9ybSwgaW50IHZlY1NpemUpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkVsZW1lbnRDcmVhdGUoaW50IHR5cGUsIGludCBraW5kLCBib29sZWFuIG5vcm0sIGludCB2ZWNTaXplKSB7CisgICAgICAgIHJldHVybiByc25FbGVtZW50Q3JlYXRlKG1Db250ZXh0LCB0eXBlLCBraW5kLCBub3JtLCB2ZWNTaXplKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuRWxlbWVudENyZWF0ZTIoaW50IGNvbiwgaW50W10gZWxlbWVudHMsIFN0cmluZ1tdIG5hbWVzKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5FbGVtZW50Q3JlYXRlMihpbnRbXSBlbGVtZW50cywgU3RyaW5nW10gbmFtZXMpIHsKKyAgICAgICAgcmV0dXJuIHJzbkVsZW1lbnRDcmVhdGUyKG1Db250ZXh0LCBlbGVtZW50cywgbmFtZXMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25FbGVtZW50R2V0TmF0aXZlRGF0YShpbnQgY29uLCBpbnQgaWQsIGludFtdIGVsZW1lbnREYXRhKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuRWxlbWVudEdldE5hdGl2ZURhdGEoaW50IGlkLCBpbnRbXSBlbGVtZW50RGF0YSkgeworICAgICAgICByc25FbGVtZW50R2V0TmF0aXZlRGF0YShtQ29udGV4dCwgaWQsIGVsZW1lbnREYXRhKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuRWxlbWVudEdldFN1YkVsZW1lbnRzKGludCBjb24sIGludCBpZCwgaW50W10gSURzLCBTdHJpbmdbXSBuYW1lcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkVsZW1lbnRHZXRTdWJFbGVtZW50cyhpbnQgaWQsIGludFtdIElEcywgU3RyaW5nW10gbmFtZXMpIHsKKyAgICAgICAgcnNuRWxlbWVudEdldFN1YkVsZW1lbnRzKG1Db250ZXh0LCBpZCwgSURzLCBuYW1lcyk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGludFtdIGQsIGludCBzaXplQnl0ZXMpOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBzaG9ydFtdIGQsIGludCBzaXplQnl0ZXMpOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBieXRlW10gZCwgaW50IHNpemVCeXRlcyk7Ci0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGZsb2F0W10gZCwgaW50IHNpemVCeXRlcyk7CisgICAgbmF0aXZlIHZvaWQgcnNuVHlwZUJlZ2luKGludCBjb24sIGludCBlbGVtZW50SUQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5UeXBlQmVnaW4oaW50IGVsZW1lbnRJRCkgeworICAgICAgICByc25UeXBlQmVnaW4obUNvbnRleHQsIGVsZW1lbnRJRCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblR5cGVBZGQoaW50IGNvbiwgaW50IGRpbSwgaW50IHZhbCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblR5cGVBZGQoaW50IGRpbSwgaW50IHZhbCkgeworICAgICAgICByc25UeXBlQWRkKG1Db250ZXh0LCBkaW0sIHZhbCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzblR5cGVDcmVhdGUoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIGludCBuVHlwZUNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzblR5cGVDcmVhdGUobUNvbnRleHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25UeXBlRmluYWxEZXN0cm95KGludCBjb24sIFR5cGUgdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblR5cGVGaW5hbERlc3Ryb3koVHlwZSB0KSB7CisgICAgICAgIHJzblR5cGVGaW5hbERlc3Ryb3kobUNvbnRleHQsIHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25UeXBlU2V0dXBGaWVsZHMoaW50IGNvbiwgVHlwZSB0LCBpbnRbXSB0eXBlcywgaW50W10gYml0cywgRmllbGRbXSBJRHMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5UeXBlU2V0dXBGaWVsZHMoVHlwZSB0LCBpbnRbXSB0eXBlcywgaW50W10gYml0cywgRmllbGRbXSBJRHMpIHsKKyAgICAgICAgcnNuVHlwZVNldHVwRmllbGRzKG1Db250ZXh0LCB0LCB0eXBlcywgYml0cywgSURzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuVHlwZUdldE5hdGl2ZURhdGEoaW50IGNvbiwgaW50IGlkLCBpbnRbXSB0eXBlRGF0YSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblR5cGVHZXROYXRpdmVEYXRhKGludCBpZCwgaW50W10gdHlwZURhdGEpIHsKKyAgICAgICAgcnNuVHlwZUdldE5hdGl2ZURhdGEobUNvbnRleHQsIGlkLCB0eXBlRGF0YSk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMkQoaW50IGlkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgaW50W10gZCwgaW50IHNpemVCeXRlcyk7Ci0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMkQoaW50IGlkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgZmxvYXRbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblJlYWQoaW50IGlkLCBpbnRbXSBkKTsKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblJlYWQoaW50IGlkLCBmbG9hdFtdIGQpOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YUZyb21PYmplY3QoaW50IGlkLCBUeXBlIHQsIGludCBvZmZzZXQsIE9iamVjdCBvKTsKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0KGludCBpZCwgVHlwZSB0LCBpbnQgb2Zmc2V0LCBPYmplY3Qgbyk7CisgICAgbmF0aXZlIGludCAgcnNuQWxsb2NhdGlvbkNyZWF0ZVR5cGVkKGludCBjb24sIGludCB0eXBlKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQoaW50IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHJzbkFsbG9jYXRpb25DcmVhdGVUeXBlZChtQ29udGV4dCwgdHlwZSk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwKGludCBjb24sIGludCBkc3RGbXQsIGJvb2xlYW4gZ2VuTWlwcywgQml0bWFwIGJtcCk7CisgICAgc3luY2hyb25pemVkIGludCBuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAoaW50IGRzdEZtdCwgYm9vbGVhbiBnZW5NaXBzLCBCaXRtYXAgYm1wKSB7CisgICAgICAgIHJldHVybiByc25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcChtQ29udGV4dCwgZHN0Rm10LCBnZW5NaXBzLCBibXApOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmKGludCBjb24sIGludCB0eXBlLCBCaXRtYXAgYm1wKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmKGludCB0eXBlLCBCaXRtYXAgYm1wKSB7CisgICAgICAgIHJldHVybiByc25BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmKG1Db250ZXh0LCB0eXBlLCBibXApOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkKGludCBjb24sIGludCBkc3RGbXQsIGJvb2xlYW4gZ2VuTWlwcywgQml0bWFwIGJtcCk7CisgICAgc3luY2hyb25pemVkIGludCBuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXBCb3hlZChpbnQgZHN0Rm10LCBib29sZWFuIGdlbk1pcHMsIEJpdG1hcCBibXApIHsKKyAgICAgICAgcmV0dXJuIHJzbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQobUNvbnRleHQsIGRzdEZtdCwgZ2VuTWlwcywgYm1wKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbShpbnQgY29uLCBpbnQgZHN0Rm10LCBib29sZWFuIGdlbk1pcHMsIGludCBhc3NldFN0cmVhbSk7CisgICAgc3luY2hyb25pemVkIGludCBuQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbShpbnQgZHN0Rm10LCBib29sZWFuIGdlbk1pcHMsIGludCBhc3NldFN0cmVhbSkgeworICAgICAgICByZXR1cm4gcnNuQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbShtQ29udGV4dCwgZHN0Rm10LCBnZW5NaXBzLCBhc3NldFN0cmVhbSk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uKGludCBhZCwgaW50IGFsbG9jKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjFEU2V0Q29uc3RyYWludChpbnQgYWQsIGludCBkaW0sIGludCB2YWx1ZSk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIxRERhdGEoaW50IGFkLCBpbnRbXSBkKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjFERGF0YShpbnQgYWQsIGZsb2F0W10gZCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIxRFN1YkRhdGEoaW50IGFkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGludFtdIGQpOwotICAgIG5hdGl2ZSB2b2lkIG5BZGFwdGVyMURTdWJEYXRhKGludCBhZCwgaW50IG9mZiwgaW50IGNvdW50LCBmbG9hdFtdIGQpOwotICAgIG5hdGl2ZSBpbnQgIG5BZGFwdGVyMURDcmVhdGUoKTsKKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKGludCBjb24sIGludCBhbGxvYywgYm9vbGVhbiBnZW5NaXBzLCBpbnQgYmFzZU1pb0xldmVsKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShpbnQgYWxsb2MsIGJvb2xlYW4gZ2VuTWlwcywgaW50IGJhc2VNaW9MZXZlbCkgeworICAgICAgICByc25BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKG1Db250ZXh0LCBhbGxvYywgZ2VuTWlwcywgYmFzZU1pb0xldmVsKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KGludCBjb24sIGludCBhbGxvYyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdChpbnQgYWxsb2MpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KG1Db250ZXh0LCBhbGxvYyk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uKGludCBhZCwgaW50IGFsbG9jKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjJEU2V0Q29uc3RyYWludChpbnQgYWQsIGludCBkaW0sIGludCB2YWx1ZSk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIyRERhdGEoaW50IGFkLCBpbnRbXSBkKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjJERGF0YShpbnQgYWQsIGZsb2F0W10gZCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIyRFN1YkRhdGEoaW50IGFkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgaW50W10gZCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIyRFN1YkRhdGEoaW50IGFkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgZmxvYXRbXSBkKTsKLSAgICBuYXRpdmUgaW50ICBuQWRhcHRlcjJEQ3JlYXRlKCk7CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgY29uLCBpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgaW50W10gZCwgaW50IHNpemVCeXRlcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGludFtdIGQsIGludCBzaXplQnl0ZXMpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblN1YkRhdGExRChtQ29udGV4dCwgaWQsIG9mZiwgY291bnQsIGQsIHNpemVCeXRlcyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGNvbiwgaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIHNob3J0W10gZCwgaW50IHNpemVCeXRlcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIHNob3J0W10gZCwgaW50IHNpemVCeXRlcykgeworICAgICAgICByc25BbGxvY2F0aW9uU3ViRGF0YTFEKG1Db250ZXh0LCBpZCwgb2ZmLCBjb3VudCwgZCwgc2l6ZUJ5dGVzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgY29uLCBpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgYnl0ZVtdIGQsIGludCBzaXplQnl0ZXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBieXRlW10gZCwgaW50IHNpemVCeXRlcykgeworICAgICAgICByc25BbGxvY2F0aW9uU3ViRGF0YTFEKG1Db250ZXh0LCBpZCwgb2ZmLCBjb3VudCwgZCwgc2l6ZUJ5dGVzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkVsZW1lbnREYXRhMUQoaW50IGNvbiwgaW50IGlkLCBpbnQgeG9mZiwgaW50IGNvbXBJZHgsIGJ5dGVbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblN1YkVsZW1lbnREYXRhMUQoaW50IGlkLCBpbnQgeG9mZiwgaW50IGNvbXBJZHgsIGJ5dGVbXSBkLCBpbnQgc2l6ZUJ5dGVzKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25TdWJFbGVtZW50RGF0YTFEKG1Db250ZXh0LCBpZCwgeG9mZiwgY29tcElkeCwgZCwgc2l6ZUJ5dGVzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgY29uLCBpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgZmxvYXRbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgZmxvYXRbXSBkLCBpbnQgc2l6ZUJ5dGVzKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25TdWJEYXRhMUQobUNvbnRleHQsIGlkLCBvZmYsIGNvdW50LCBkLCBzaXplQnl0ZXMpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRCaW5kQWxsb2NhdGlvbihpbnQgc2NyaXB0LCBpbnQgYWxsb2MsIGludCBzbG90KTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0Q2xlYXJDb2xvcihpbnQgc2NyaXB0LCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0Q2xlYXJEZXB0aChpbnQgc2NyaXB0LCBmbG9hdCBkZXB0aCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldENsZWFyU3RlbmNpbChpbnQgc2NyaXB0LCBpbnQgc3RlbmNpbCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldFRpbWVab25lKGludCBzY3JpcHQsIGJ5dGVbXSB0aW1lWm9uZSk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldFR5cGUoaW50IHR5cGUsIGJvb2xlYW4gd3JpdGFibGUsIFN0cmluZyBuYW1lLCBpbnQgc2xvdCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldFJvb3QoYm9vbGVhbiBpc1Jvb3QpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRTZXRJbnZva2FibGUoU3RyaW5nIG5hbWUsIGludCBzbG90KTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0SW52b2tlKGludCBpZCwgaW50IHNsb3QpOworICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25TdWJEYXRhMkQoaW50IGNvbiwgaW50IGlkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgaW50W10gZCwgaW50IHNpemVCeXRlcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMkQoaW50IGlkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgaW50W10gZCwgaW50IHNpemVCeXRlcykgeworICAgICAgICByc25BbGxvY2F0aW9uU3ViRGF0YTJEKG1Db250ZXh0LCBpZCwgeG9mZiwgeW9mZiwgdywgaCwgZCwgc2l6ZUJ5dGVzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkRhdGEyRChpbnQgY29uLCBpbnQgaWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBmbG9hdFtdIGQsIGludCBzaXplQnl0ZXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTJEKGludCBpZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGZsb2F0W10gZCwgaW50IHNpemVCeXRlcykgeworICAgICAgICByc25BbGxvY2F0aW9uU3ViRGF0YTJEKG1Db250ZXh0LCBpZCwgeG9mZiwgeW9mZiwgdywgaCwgZCwgc2l6ZUJ5dGVzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblJlYWQoaW50IGNvbiwgaW50IGlkLCBpbnRbXSBkKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblJlYWQoaW50IGlkLCBpbnRbXSBkKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25SZWFkKG1Db250ZXh0LCBpZCwgZCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25SZWFkKGludCBjb24sIGludCBpZCwgZmxvYXRbXSBkKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblJlYWQoaW50IGlkLCBmbG9hdFtdIGQpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblJlYWQobUNvbnRleHQsIGlkLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkRhdGFGcm9tT2JqZWN0KGludCBjb24sIGludCBpZCwgVHlwZSB0LCBpbnQgb2Zmc2V0LCBPYmplY3Qgbyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdChpbnQgaWQsIFR5cGUgdCwgaW50IG9mZnNldCwgT2JqZWN0IG8pIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblN1YkRhdGFGcm9tT2JqZWN0KG1Db250ZXh0LCBpZCwgdCwgb2Zmc2V0LCBvKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0KGludCBjb24sIGludCBpZCwgVHlwZSB0LCBpbnQgb2Zmc2V0LCBPYmplY3Qgbyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25TdWJSZWFkRnJvbU9iamVjdChpbnQgaWQsIFR5cGUgdCwgaW50IG9mZnNldCwgT2JqZWN0IG8pIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0KG1Db250ZXh0LCBpZCwgdCwgb2Zmc2V0LCBvKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuQWxsb2NhdGlvbkdldFR5cGUoaW50IGNvbiwgaW50IGlkKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5BbGxvY2F0aW9uR2V0VHlwZShpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIHJzbkFsbG9jYXRpb25HZXRUeXBlKG1Db250ZXh0LCBpZCk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgblNjcmlwdENCZWdpbigpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRDU2V0U2NyaXB0KGJ5dGVbXSBzY3JpcHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOwotICAgIG5hdGl2ZSBpbnQgIG5TY3JpcHRDQ3JlYXRlKCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdENBZGREZWZpbmVJMzIoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdENBZGREZWZpbmVGKFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSk7CisgICAgbmF0aXZlIGludCAgcnNuRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShpbnQgY29uLCBpbnQgYXNzZXRTdHJlYW0pOworICAgIHN5bmNocm9uaXplZCBpbnQgbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0oaW50IGFzc2V0U3RyZWFtKSB7CisgICAgICAgIHJldHVybiByc25GaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKG1Db250ZXh0LCBhc3NldFN0cmVhbSk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoaW50IGNvbiwgaW50IGZpbGVBM0QpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoaW50IGZpbGVBM0QpIHsKKyAgICAgICAgcmV0dXJuIHJzbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMobUNvbnRleHQsIGZpbGVBM0QpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25GaWxlQTNER2V0SW5kZXhFbnRyaWVzKGludCBjb24sIGludCBmaWxlQTNELCBpbnQgbnVtRW50cmllcywgaW50W10gSURzLCBTdHJpbmdbXSBuYW1lcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkZpbGVBM0RHZXRJbmRleEVudHJpZXMoaW50IGZpbGVBM0QsIGludCBudW1FbnRyaWVzLCBpbnRbXSBJRHMsIFN0cmluZ1tdIG5hbWVzKSB7CisgICAgICAgIHJzbkZpbGVBM0RHZXRJbmRleEVudHJpZXMobUNvbnRleHQsIGZpbGVBM0QsIG51bUVudHJpZXMsIElEcywgbmFtZXMpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25GaWxlQTNER2V0RW50cnlCeUluZGV4KGludCBjb24sIGludCBmaWxlQTNELCBpbnQgaW5kZXgpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkZpbGVBM0RHZXRFbnRyeUJ5SW5kZXgoaW50IGZpbGVBM0QsIGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gcnNuRmlsZUEzREdldEVudHJ5QnlJbmRleChtQ29udGV4dCwgZmlsZUEzRCwgaW5kZXgpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5TYW1wbGVyQmVnaW4oKTsKLSAgICBuYXRpdmUgdm9pZCBuU2FtcGxlclNldChpbnQgcGFyYW0sIGludCB2YWx1ZSk7Ci0gICAgbmF0aXZlIGludCAgblNhbXBsZXJDcmVhdGUoKTsKKyAgICBuYXRpdmUgaW50ICByc25Gb250Q3JlYXRlRnJvbUZpbGUoaW50IGNvbiwgU3RyaW5nIGZpbGVOYW1lLCBpbnQgc2l6ZSwgaW50IGRwaSk7CisgICAgc3luY2hyb25pemVkIGludCBuRm9udENyZWF0ZUZyb21GaWxlKFN0cmluZyBmaWxlTmFtZSwgaW50IHNpemUsIGludCBkcGkpIHsKKyAgICAgICAgcmV0dXJuIHJzbkZvbnRDcmVhdGVGcm9tRmlsZShtQ29udGV4dCwgZmlsZU5hbWUsIHNpemUsIGRwaSk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oaW50IGluLCBpbnQgb3V0KTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMoaW50IGZ1bmMpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayhib29sZWFuIGVuYWJsZSk7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrKGJvb2xlYW4gciwgYm9vbGVhbiBnLCBib29sZWFuIGIsIGJvb2xlYW4gYSk7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jKGludCBzcmMsIGludCBkc3QpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlcihib29sZWFuIGVuYWJsZSk7Ci0gICAgbmF0aXZlIGludCAgblByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlKCk7CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjFEQmluZEFsbG9jYXRpb24oaW50IGNvbiwgaW50IGFkLCBpbnQgYWxsb2MpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMURCaW5kQWxsb2NhdGlvbihpbnQgYWQsIGludCBhbGxvYykgeworICAgICAgICByc25BZGFwdGVyMURCaW5kQWxsb2NhdGlvbihtQ29udGV4dCwgYWQsIGFsbG9jKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjFEU2V0Q29uc3RyYWludChpbnQgY29uLCBpbnQgYWQsIGludCBkaW0sIGludCB2YWx1ZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIxRFNldENvbnN0cmFpbnQoaW50IGFkLCBpbnQgZGltLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgcnNuQWRhcHRlcjFEU2V0Q29uc3RyYWludChtQ29udGV4dCwgYWQsIGRpbSwgdmFsdWUpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMUREYXRhKGludCBjb24sIGludCBhZCwgaW50W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIxRERhdGEoaW50IGFkLCBpbnRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIxRERhdGEobUNvbnRleHQsIGFkLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjFERGF0YShpbnQgY29uLCBpbnQgYWQsIGZsb2F0W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIxRERhdGEoaW50IGFkLCBmbG9hdFtdIGQpIHsKKyAgICAgICAgcnNuQWRhcHRlcjFERGF0YShtQ29udGV4dCwgYWQsIGQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMURTdWJEYXRhKGludCBjb24sIGludCBhZCwgaW50IG9mZiwgaW50IGNvdW50LCBpbnRbXSBkKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWRhcHRlcjFEU3ViRGF0YShpbnQgYWQsIGludCBvZmYsIGludCBjb3VudCwgaW50W10gZCkgeworICAgICAgICByc25BZGFwdGVyMURTdWJEYXRhKG1Db250ZXh0LCBhZCwgb2ZmLCBjb3VudCwgZCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFkYXB0ZXIxRFN1YkRhdGEoaW50IGNvbiwgaW50IGFkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGZsb2F0W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIxRFN1YkRhdGEoaW50IGFkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGZsb2F0W10gZCkgeworICAgICAgICByc25BZGFwdGVyMURTdWJEYXRhKG1Db250ZXh0LCBhZCwgb2ZmLCBjb3VudCwgZCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkFkYXB0ZXIxRENyZWF0ZShpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5BZGFwdGVyMURDcmVhdGUoKSB7CisgICAgICAgIHJldHVybiByc25BZGFwdGVyMURDcmVhdGUobUNvbnRleHQpOworICAgIH0KIAotICAgIG5hdGl2ZSBpbnQgIG5Qcm9ncmFtUmFzdGVyQ3JlYXRlKGludCBpbiwgaW50IG91dCwgYm9vbGVhbiBwb2ludFNtb290aCwgYm9vbGVhbiBsaW5lU21vb3RoLCBib29sZWFuIHBvaW50U3ByaXRlKTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChpbnQgcHIsIGZsb2F0IHYpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplKGludCBwciwgZmxvYXQgdik7CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjJEQmluZEFsbG9jYXRpb24oaW50IGNvbiwgaW50IGFkLCBpbnQgYWxsb2MpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbihpbnQgYWQsIGludCBhbGxvYykgeworICAgICAgICByc25BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbihtQ29udGV4dCwgYWQsIGFsbG9jKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjJEU2V0Q29uc3RyYWludChpbnQgY29uLCBpbnQgYWQsIGludCBkaW0sIGludCB2YWx1ZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRFNldENvbnN0cmFpbnQoaW50IGFkLCBpbnQgZGltLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgcnNuQWRhcHRlcjJEU2V0Q29uc3RyYWludChtQ29udGV4dCwgYWQsIGRpbSwgdmFsdWUpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMkREYXRhKGludCBjb24sIGludCBhZCwgaW50W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRERhdGEoaW50IGFkLCBpbnRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIyRERhdGEobUNvbnRleHQsIGFkLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjJERGF0YShpbnQgY29uLCBpbnQgYWQsIGZsb2F0W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRERhdGEoaW50IGFkLCBmbG9hdFtdIGQpIHsKKyAgICAgICAgcnNuQWRhcHRlcjJERGF0YShtQ29udGV4dCwgYWQsIGQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMkRTdWJEYXRhKGludCBjb24sIGludCBhZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGludFtdIGQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMkRTdWJEYXRhKGludCBhZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGludFtdIGQpIHsKKyAgICAgICAgcnNuQWRhcHRlcjJEU3ViRGF0YShtQ29udGV4dCwgYWQsIHhvZmYsIHlvZmYsIHcsIGgsIGQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMkRTdWJEYXRhKGludCBjb24sIGludCBhZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGZsb2F0W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRFN1YkRhdGEoaW50IGFkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgZmxvYXRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIyRFN1YkRhdGEobUNvbnRleHQsIGFkLCB4b2ZmLCB5b2ZmLCB3LCBoLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuQWRhcHRlcjJEQ3JlYXRlKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCBpbnQgbkFkYXB0ZXIyRENyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzbkFkYXB0ZXIyRENyZWF0ZShtQ29udGV4dCk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1CaW5kQ29uc3RhbnRzKGludCBwdiwgaW50IHNsb3QsIGludCBtSUQpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtQmluZFRleHR1cmUoaW50IHZwZiwgaW50IHNsb3QsIGludCBhKTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUJpbmRTYW1wbGVyKGludCB2cGYsIGludCBzbG90LCBpbnQgcyk7CisgICAgbmF0aXZlIHZvaWQgcnNuU2NyaXB0QmluZEFsbG9jYXRpb24oaW50IGNvbiwgaW50IHNjcmlwdCwgaW50IGFsbG9jLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNjcmlwdEJpbmRBbGxvY2F0aW9uKGludCBzY3JpcHQsIGludCBhbGxvYywgaW50IHNsb3QpIHsKKyAgICAgICAgcnNuU2NyaXB0QmluZEFsbG9jYXRpb24obUNvbnRleHQsIHNjcmlwdCwgYWxsb2MsIHNsb3QpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRTZXRUaW1lWm9uZShpbnQgY29uLCBpbnQgc2NyaXB0LCBieXRlW10gdGltZVpvbmUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRTZXRUaW1lWm9uZShpbnQgc2NyaXB0LCBieXRlW10gdGltZVpvbmUpIHsKKyAgICAgICAgcnNuU2NyaXB0U2V0VGltZVpvbmUobUNvbnRleHQsIHNjcmlwdCwgdGltZVpvbmUpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRJbnZva2UoaW50IGNvbiwgaW50IGlkLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNjcmlwdEludm9rZShpbnQgaWQsIGludCBzbG90KSB7CisgICAgICAgIHJzblNjcmlwdEludm9rZShtQ29udGV4dCwgaWQsIHNsb3QpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRJbnZva2VWKGludCBjb24sIGludCBpZCwgaW50IHNsb3QsIGJ5dGVbXSBwYXJhbXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRJbnZva2VWKGludCBpZCwgaW50IHNsb3QsIGJ5dGVbXSBwYXJhbXMpIHsKKyAgICAgICAgcnNuU2NyaXB0SW52b2tlVihtQ29udGV4dCwgaWQsIHNsb3QsIHBhcmFtcyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblNjcmlwdFNldFZhckkoaW50IGNvbiwgaW50IGlkLCBpbnQgc2xvdCwgaW50IHZhbCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNjcmlwdFNldFZhckkoaW50IGlkLCBpbnQgc2xvdCwgaW50IHZhbCkgeworICAgICAgICByc25TY3JpcHRTZXRWYXJJKG1Db250ZXh0LCBpZCwgc2xvdCwgdmFsKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2NyaXB0U2V0VmFyRihpbnQgY29uLCBpbnQgaWQsIGludCBzbG90LCBmbG9hdCB2YWwpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRTZXRWYXJGKGludCBpZCwgaW50IHNsb3QsIGZsb2F0IHZhbCkgeworICAgICAgICByc25TY3JpcHRTZXRWYXJGKG1Db250ZXh0LCBpZCwgc2xvdCwgdmFsKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2NyaXB0U2V0VmFyVihpbnQgY29uLCBpbnQgaWQsIGludCBzbG90LCBieXRlW10gdmFsKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuU2NyaXB0U2V0VmFyVihpbnQgaWQsIGludCBzbG90LCBieXRlW10gdmFsKSB7CisgICAgICAgIHJzblNjcmlwdFNldFZhclYobUNvbnRleHQsIGlkLCBzbG90LCB2YWwpOworICAgIH0KIAotICAgIG5hdGl2ZSBpbnQgIG5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUoaW50W10gcGFyYW1zKTsKLSAgICBuYXRpdmUgaW50ICBuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMihTdHJpbmcgc2hhZGVyLCBpbnRbXSBwYXJhbXMpOworICAgIG5hdGl2ZSB2b2lkIHJzblNjcmlwdENCZWdpbihpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuU2NyaXB0Q0JlZ2luKCkgeworICAgICAgICByc25TY3JpcHRDQmVnaW4obUNvbnRleHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRDU2V0U2NyaXB0KGludCBjb24sIGJ5dGVbXSBzY3JpcHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRDU2V0U2NyaXB0KGJ5dGVbXSBzY3JpcHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgcnNuU2NyaXB0Q1NldFNjcmlwdChtQ29udGV4dCwgc2NyaXB0LCBvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzblNjcmlwdENDcmVhdGUoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIGludCBuU2NyaXB0Q0NyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzblNjcmlwdENDcmVhdGUobUNvbnRleHQpOworICAgIH0KIAotICAgIG5hdGl2ZSBpbnQgIG5Qcm9ncmFtVmVydGV4Q3JlYXRlKGJvb2xlYW4gdGV4TWF0KTsKLSAgICBuYXRpdmUgaW50ICBuUHJvZ3JhbVZlcnRleENyZWF0ZTIoU3RyaW5nIHNoYWRlciwgaW50W10gcGFyYW1zKTsKKyAgICBuYXRpdmUgdm9pZCByc25TYW1wbGVyQmVnaW4oaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNhbXBsZXJCZWdpbigpIHsKKyAgICAgICAgcnNuU2FtcGxlckJlZ2luKG1Db250ZXh0KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2FtcGxlclNldChpbnQgY29uLCBpbnQgcGFyYW0sIGludCB2YWx1ZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNhbXBsZXJTZXQoaW50IHBhcmFtLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgcnNuU2FtcGxlclNldChtQ29udGV4dCwgcGFyYW0sIHZhbHVlKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuU2FtcGxlckNyZWF0ZShpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5TYW1wbGVyQ3JlYXRlKCkgeworICAgICAgICByZXR1cm4gcnNuU2FtcGxlckNyZWF0ZShtQ29udGV4dCk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgbkxpZ2h0QmVnaW4oKTsKLSAgICBuYXRpdmUgdm9pZCBuTGlnaHRTZXRJc01vbm8oYm9vbGVhbiBpc01vbm8pOwotICAgIG5hdGl2ZSB2b2lkIG5MaWdodFNldElzTG9jYWwoYm9vbGVhbiBpc0xvY2FsKTsKLSAgICBuYXRpdmUgaW50ICBuTGlnaHRDcmVhdGUoKTsKLSAgICBuYXRpdmUgdm9pZCBuTGlnaHRTZXRDb2xvcihpbnQgbCwgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYik7Ci0gICAgbmF0aXZlIHZvaWQgbkxpZ2h0U2V0UG9zaXRpb24oaW50IGwsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopOworICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1TdG9yZUJlZ2luKGludCBjb24sIGludCBpbiwgaW50IG91dCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1TdG9yZUJlZ2luKGludCBpbiwgaW50IG91dCkgeworICAgICAgICByc25Qcm9ncmFtU3RvcmVCZWdpbihtQ29udGV4dCwgaW4sIG91dCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1TdG9yZURlcHRoRnVuYyhpbnQgY29uLCBpbnQgZnVuYyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1TdG9yZURlcHRoRnVuYyhpbnQgZnVuYykgeworICAgICAgICByc25Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMobUNvbnRleHQsIGZ1bmMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVEZXB0aE1hc2soaW50IGNvbiwgYm9vbGVhbiBlbmFibGUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtU3RvcmVEZXB0aE1hc2soYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgcnNuUHJvZ3JhbVN0b3JlRGVwdGhNYXNrKG1Db250ZXh0LCBlbmFibGUpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVDb2xvck1hc2soaW50IGNvbiwgYm9vbGVhbiByLCBib29sZWFuIGcsIGJvb2xlYW4gYiwgYm9vbGVhbiBhKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuUHJvZ3JhbVN0b3JlQ29sb3JNYXNrKGJvb2xlYW4gciwgYm9vbGVhbiBnLCBib29sZWFuIGIsIGJvb2xlYW4gYSkgeworICAgICAgICByc25Qcm9ncmFtU3RvcmVDb2xvck1hc2sobUNvbnRleHQsIHIsIGcsIGIsIGEpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMoaW50IGNvbiwgaW50IHNyYywgaW50IGRzdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1TdG9yZUJsZW5kRnVuYyhpbnQgc3JjLCBpbnQgZHN0KSB7CisgICAgICAgIHJzblByb2dyYW1TdG9yZUJsZW5kRnVuYyhtQ29udGV4dCwgc3JjLCBkc3QpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVEaXRoZXIoaW50IGNvbiwgYm9vbGVhbiBlbmFibGUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtU3RvcmVEaXRoZXIoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgcnNuUHJvZ3JhbVN0b3JlRGl0aGVyKG1Db250ZXh0LCBlbmFibGUpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtU3RvcmVDcmVhdGUoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIGludCBuUHJvZ3JhbVN0b3JlQ3JlYXRlKCkgeworICAgICAgICByZXR1cm4gcnNuUHJvZ3JhbVN0b3JlQ3JlYXRlKG1Db250ZXh0KTsKKyAgICB9CiAKLSAgICBuYXRpdmUgaW50ICBuU2ltcGxlTWVzaENyZWF0ZShpbnQgYmF0Y2hJRCwgaW50IGlkeElELCBpbnRbXSB2dHhJRCwgaW50IHByaW0pOwotICAgIG5hdGl2ZSB2b2lkIG5TaW1wbGVNZXNoQmluZFZlcnRleChpbnQgaWQsIGludCBhbGxvYywgaW50IHNsb3QpOwotICAgIG5hdGl2ZSB2b2lkIG5TaW1wbGVNZXNoQmluZEluZGV4KGludCBpZCwgaW50IGFsbG9jKTsKKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtUmFzdGVyQ3JlYXRlKGludCBjb24sIGJvb2xlYW4gcG9pbnRTbW9vdGgsIGJvb2xlYW4gbGluZVNtb290aCwgYm9vbGVhbiBwb2ludFNwcml0ZSk7CisgICAgc3luY2hyb25pemVkIGludCBuUHJvZ3JhbVJhc3RlckNyZWF0ZShib29sZWFuIHBvaW50U21vb3RoLCBib29sZWFuIGxpbmVTbW9vdGgsIGJvb2xlYW4gcG9pbnRTcHJpdGUpIHsKKyAgICAgICAgcmV0dXJuIHJzblByb2dyYW1SYXN0ZXJDcmVhdGUobUNvbnRleHQsIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoaW50IGNvbiwgaW50IHByLCBmbG9hdCB2KTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChpbnQgcHIsIGZsb2F0IHYpIHsKKyAgICAgICAgcnNuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChtQ29udGV4dCwgcHIsIHYpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUoaW50IGNvbiwgaW50IHByLCBpbnQgbW9kZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShpbnQgcHIsIGludCBtb2RlKSB7CisgICAgICAgIHJzblByb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShtQ29udGV4dCwgcHIsIG1vZGUpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5BbmltYXRpb25CZWdpbihpbnQgYXR0cmliQ291bnQsIGludCBrZXlmcmFtZUNvdW50KTsKLSAgICBuYXRpdmUgdm9pZCBuQW5pbWF0aW9uQWRkKGZsb2F0IHRpbWUsIGZsb2F0W10gYXR0cmlicyk7Ci0gICAgbmF0aXZlIGludCAgbkFuaW1hdGlvbkNyZWF0ZSgpOworICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1CaW5kQ29uc3RhbnRzKGludCBjb24sIGludCBwdiwgaW50IHNsb3QsIGludCBtSUQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtQmluZENvbnN0YW50cyhpbnQgcHYsIGludCBzbG90LCBpbnQgbUlEKSB7CisgICAgICAgIHJzblByb2dyYW1CaW5kQ29uc3RhbnRzKG1Db250ZXh0LCBwdiwgc2xvdCwgbUlEKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuUHJvZ3JhbUJpbmRUZXh0dXJlKGludCBjb24sIGludCB2cGYsIGludCBzbG90LCBpbnQgYSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1CaW5kVGV4dHVyZShpbnQgdnBmLCBpbnQgc2xvdCwgaW50IGEpIHsKKyAgICAgICAgcnNuUHJvZ3JhbUJpbmRUZXh0dXJlKG1Db250ZXh0LCB2cGYsIHNsb3QsIGEpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtQmluZFNhbXBsZXIoaW50IGNvbiwgaW50IHZwZiwgaW50IHNsb3QsIGludCBzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuUHJvZ3JhbUJpbmRTYW1wbGVyKGludCB2cGYsIGludCBzbG90LCBpbnQgcykgeworICAgICAgICByc25Qcm9ncmFtQmluZFNhbXBsZXIobUNvbnRleHQsIHZwZiwgc2xvdCwgcyk7CisgICAgfQorCisgICAgbmF0aXZlIGludCAgcnNuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKGludCBjb24sIGludFtdIHBhcmFtcyk7CisgICAgc3luY2hyb25pemVkIGludCBuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKGludFtdIHBhcmFtcykgeworICAgICAgICByZXR1cm4gcnNuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKG1Db250ZXh0LCBwYXJhbXMpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyKGludCBjb24sIFN0cmluZyBzaGFkZXIsIGludFtdIHBhcmFtcyk7CisgICAgc3luY2hyb25pemVkIGludCBuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMihTdHJpbmcgc2hhZGVyLCBpbnRbXSBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIHJzblByb2dyYW1GcmFnbWVudENyZWF0ZTIobUNvbnRleHQsIHNoYWRlciwgcGFyYW1zKTsKKyAgICB9CisKKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtVmVydGV4Q3JlYXRlKGludCBjb24sIGJvb2xlYW4gdGV4TWF0KTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5Qcm9ncmFtVmVydGV4Q3JlYXRlKGJvb2xlYW4gdGV4TWF0KSB7CisgICAgICAgIHJldHVybiByc25Qcm9ncmFtVmVydGV4Q3JlYXRlKG1Db250ZXh0LCB0ZXhNYXQpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtVmVydGV4Q3JlYXRlMihpbnQgY29uLCBTdHJpbmcgc2hhZGVyLCBpbnRbXSBwYXJhbXMpOworICAgIHN5bmNocm9uaXplZCBpbnQgblByb2dyYW1WZXJ0ZXhDcmVhdGUyKFN0cmluZyBzaGFkZXIsIGludFtdIHBhcmFtcykgeworICAgICAgICByZXR1cm4gcnNuUHJvZ3JhbVZlcnRleENyZWF0ZTIobUNvbnRleHQsIHNoYWRlciwgcGFyYW1zKTsKKyAgICB9CisKKworICAgIG5hdGl2ZSBpbnQgIHJzbk1lc2hDcmVhdGUoaW50IGNvbiwgaW50IHZ0eENvdW50LCBpbnQgaW5kZXhDb3VudCk7CisgICAgc3luY2hyb25pemVkIGludCBuTWVzaENyZWF0ZShpbnQgdnR4Q291bnQsIGludCBpbmRleENvdW50KSB7CisgICAgICAgIHJldHVybiByc25NZXNoQ3JlYXRlKG1Db250ZXh0LCB2dHhDb3VudCwgaW5kZXhDb3VudCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbk1lc2hCaW5kVmVydGV4KGludCBjb24sIGludCBpZCwgaW50IGFsbG9jLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbk1lc2hCaW5kVmVydGV4KGludCBpZCwgaW50IGFsbG9jLCBpbnQgc2xvdCkgeworICAgICAgICByc25NZXNoQmluZFZlcnRleChtQ29udGV4dCwgaWQsIGFsbG9jLCBzbG90KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuTWVzaEJpbmRJbmRleChpbnQgY29uLCBpbnQgaWQsIGludCBhbGxvYywgaW50IHByaW0sIGludCBzbG90KTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuTWVzaEJpbmRJbmRleChpbnQgaWQsIGludCBhbGxvYywgaW50IHByaW0sIGludCBzbG90KSB7CisgICAgICAgIHJzbk1lc2hCaW5kSW5kZXgobUNvbnRleHQsIGlkLCBhbGxvYywgcHJpbSwgc2xvdCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbk1lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudChpbnQgY29uLCBpbnQgaWQpOworICAgIHN5bmNocm9uaXplZCBpbnQgbk1lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudChpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIHJzbk1lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudChtQ29udGV4dCwgaWQpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25NZXNoR2V0SW5kZXhDb3VudChpbnQgY29uLCBpbnQgaWQpOworICAgIHN5bmNocm9uaXplZCBpbnQgbk1lc2hHZXRJbmRleENvdW50KGludCBpZCkgeworICAgICAgICByZXR1cm4gcnNuTWVzaEdldEluZGV4Q291bnQobUNvbnRleHQsIGlkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuTWVzaEdldFZlcnRpY2VzKGludCBjb24sIGludCBpZCwgaW50W10gdnR4SWRzLCBpbnQgdnR4SWRDb3VudCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbk1lc2hHZXRWZXJ0aWNlcyhpbnQgaWQsIGludFtdIHZ0eElkcywgaW50IHZ0eElkQ291bnQpIHsKKyAgICAgICAgcnNuTWVzaEdldFZlcnRpY2VzKG1Db250ZXh0LCBpZCwgdnR4SWRzLCB2dHhJZENvdW50KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuTWVzaEdldEluZGljZXMoaW50IGNvbiwgaW50IGlkLCBpbnRbXSBpZHhJZHMsIGludFtdIHByaW1pdGl2ZXMsIGludCB2dHhJZENvdW50KTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuTWVzaEdldEluZGljZXMoaW50IGlkLCBpbnRbXSBpZHhJZHMsIGludFtdIHByaW1pdGl2ZXMsIGludCB2dHhJZENvdW50KSB7CisgICAgICAgIHJzbk1lc2hHZXRJbmRpY2VzKG1Db250ZXh0LCBpZCwgaWR4SWRzLCBwcmltaXRpdmVzLCB2dHhJZENvdW50KTsKKyAgICB9CisKIAogICAgIHByb3RlY3RlZCBpbnQgICAgIG1EZXY7CiAgICAgcHJvdGVjdGVkIGludCAgICAgbUNvbnRleHQ7CiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKICAgICBwcm90ZWN0ZWQgTWVzc2FnZVRocmVhZCBtTWVzc2FnZVRocmVhZDsKIAotICAgIEVsZW1lbnQgbUVsZW1lbnRfVVNFUl9VODsKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfSTg7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX1UxNjsKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfSTE2OwotICAgIEVsZW1lbnQgbUVsZW1lbnRfVVNFUl9VMzI7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX0kzMjsKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfRjMyOworICAgIEVsZW1lbnQgbUVsZW1lbnRfVTg7CisgICAgRWxlbWVudCBtRWxlbWVudF9JODsKKyAgICBFbGVtZW50IG1FbGVtZW50X1UxNjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0kxNjsKKyAgICBFbGVtZW50IG1FbGVtZW50X1UzMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0kzMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0YzMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0JPT0xFQU47CisKKyAgICBFbGVtZW50IG1FbGVtZW50X0VMRU1FTlQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9UWVBFOworICAgIEVsZW1lbnQgbUVsZW1lbnRfQUxMT0NBVElPTjsKKyAgICBFbGVtZW50IG1FbGVtZW50X1NBTVBMRVI7CisgICAgRWxlbWVudCBtRWxlbWVudF9TQ1JJUFQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9NRVNIOworICAgIEVsZW1lbnQgbUVsZW1lbnRfUFJPR1JBTV9GUkFHTUVOVDsKKyAgICBFbGVtZW50IG1FbGVtZW50X1BST0dSQU1fVkVSVEVYOworICAgIEVsZW1lbnQgbUVsZW1lbnRfUFJPR1JBTV9SQVNURVI7CisgICAgRWxlbWVudCBtRWxlbWVudF9QUk9HUkFNX1NUT1JFOwogCiAgICAgRWxlbWVudCBtRWxlbWVudF9BXzg7CiAgICAgRWxlbWVudCBtRWxlbWVudF9SR0JfNTY1OwpAQCAtMjEwLDEzICs1NDEsMzggQEAKICAgICBFbGVtZW50IG1FbGVtZW50X1JHQkFfNDQ0NDsKICAgICBFbGVtZW50IG1FbGVtZW50X1JHQkFfODg4ODsKIAotICAgIEVsZW1lbnQgbUVsZW1lbnRfSU5ERVhfMTY7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9QT1NJVElPTl8yOwotICAgIEVsZW1lbnQgbUVsZW1lbnRfUE9TSVRJT05fMzsKLSAgICBFbGVtZW50IG1FbGVtZW50X1RFWFRVUkVfMjsKLSAgICBFbGVtZW50IG1FbGVtZW50X05PUk1BTF8zOwotICAgIEVsZW1lbnQgbUVsZW1lbnRfQ09MT1JfVThfNDsKLSAgICBFbGVtZW50IG1FbGVtZW50X0NPTE9SX0YzMl80OworICAgIEVsZW1lbnQgbUVsZW1lbnRfRkxPQVRfMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X0ZMT0FUXzM7CisgICAgRWxlbWVudCBtRWxlbWVudF9GTE9BVF80OworICAgIEVsZW1lbnQgbUVsZW1lbnRfVUNIQVJfNDsKKworICAgIEVsZW1lbnQgbUVsZW1lbnRfTUFUUklYXzRYNDsKKyAgICBFbGVtZW50IG1FbGVtZW50X01BVFJJWF8zWDM7CisgICAgRWxlbWVudCBtRWxlbWVudF9NQVRSSVhfMlgyOworCisgICAgU2FtcGxlciBtU2FtcGxlcl9DTEFNUF9ORUFSRVNUOworICAgIFNhbXBsZXIgbVNhbXBsZXJfQ0xBTVBfTElORUFSOworICAgIFNhbXBsZXIgbVNhbXBsZXJfQ0xBTVBfTElORUFSX01JUF9MSU5FQVI7CisgICAgU2FtcGxlciBtU2FtcGxlcl9XUkFQX05FQVJFU1Q7CisgICAgU2FtcGxlciBtU2FtcGxlcl9XUkFQX0xJTkVBUjsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX1dSQVBfTElORUFSX01JUF9MSU5FQVI7CisKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX1RFU1Q7CisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19ERVBUSDsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX1RFU1Q7CisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19XUklURTsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX0RFUFRIOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX1RFU1Q7CisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fV1JJVEU7CisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX1RFU1Q7CisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX0RFUFRIOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19XUklURTsKKworICAgIFByb2dyYW1SYXN0ZXIgbVByb2dyYW1SYXN0ZXJfQ1VMTF9CQUNLOworICAgIFByb2dyYW1SYXN0ZXIgbVByb2dyYW1SYXN0ZXJfQ1VMTF9GUk9OVDsKKyAgICBQcm9ncmFtUmFzdGVyIG1Qcm9ncmFtUmFzdGVyX0NVTExfTk9ORTsKIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8KQEAgLTI2NCwxNyArNjIwLDI0IEBACiAgICAgICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgdGVtcG9yYXJ5IHNvbHV0aW9uLiAgVGhlIGZpbmFsIHNvbHV0aW9uIHdpbGwKICAgICAgICAgICAgIC8vIHVzZWQgdHlwZWQgYWxsb2NhdGlvbnMgd2hlcmUgdGhlIG1lc3NhZ2UgaWQgaXMgdGhlIHR5cGUgaW5kaWNhdG9yLgogICAgICAgICAgICAgaW50W10gcmJ1ZiA9IG5ldyBpbnRbMTZdOwotICAgICAgICAgICAgbVJTLm5Db250ZXh0SW5pdFRvQ2xpZW50KCk7CisgICAgICAgICAgICBtUlMubkNvbnRleHRJbml0VG9DbGllbnQobVJTLm1Db250ZXh0KTsKICAgICAgICAgICAgIHdoaWxlKG1SdW4pIHsKLSAgICAgICAgICAgICAgICBpbnQgbXNnID0gbVJTLm5Db250ZXh0R2V0TWVzc2FnZShyYnVmLCB0cnVlKTsKKyAgICAgICAgICAgICAgICByYnVmWzBdID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgbXNnID0gbVJTLm5Db250ZXh0R2V0TWVzc2FnZShtUlMubUNvbnRleHQsIHJidWYsIHRydWUpOwogICAgICAgICAgICAgICAgIGlmIChtc2cgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgb25seSBoYXBwZW4gZHVyaW5nIHRlYXJkb3duLgotICAgICAgICAgICAgICAgICAgICAvLyBCdXQgd2Ugd2FudCB0byBhdm9pZCBzdGFydmluZyBvdGhlciB0aHJlYWRzIGR1cmluZwotICAgICAgICAgICAgICAgICAgICAvLyB0ZWFyZG93biBieSB5aWVsZGluZyB1bnRpbCB0aGUgbmV4dCBsaW5lIGluIHRoZSBkZXN0cnVjdG9yCi0gICAgICAgICAgICAgICAgICAgIC8vIGNhbiBleGVjdXRlIHRvIHNldCBtUnVuID0gZmFsc2UKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwKDEsIDApOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2FuIGhhcHBlbiBmb3IgdHdvIHJlYXNvbnMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJidWZbMF0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAxOiBCdWZmZXIgbmVlZHMgdG8gYmUgZW5sYXJnZWQuCisgICAgICAgICAgICAgICAgICAgICAgICByYnVmID0gbmV3IGludFtyYnVmWzBdICsgMl07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAyOiB0ZWFyZG93bi4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1dCB3ZSB3YW50IHRvIGF2b2lkIHN0YXJ2aW5nIG90aGVyIHRocmVhZHMgZHVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWFyZG93biBieSB5aWVsZGluZyB1bnRpbCB0aGUgbmV4dCBsaW5lIGluIHRoZSBkZXN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4gZXhlY3V0ZSB0byBzZXQgbVJ1biA9IGZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwKDEsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYobVJTLm1NZXNzYWdlQ2FsbGJhY2sgIT0gbnVsbCkgewpAQCAtMjgyLDcgKzY0NSw2IEBACiAgICAgICAgICAgICAgICAgICAgIG1SUy5tTWVzc2FnZUNhbGxiYWNrLm1JRCA9IG1zZzsKICAgICAgICAgICAgICAgICAgICAgbVJTLm1NZXNzYWdlQ2FsbGJhY2sucnVuKCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vTG9nLmQoTE9HX1RBRywgIk1lc3NhZ2VUaHJlYWQgbXNnICIgKyBtc2cgKyAiIHYxICIgKyByYnVmWzBdICsgIiB2MiAiICsgcmJ1ZlsxXSArICIgdjMgIiArcmJ1ZlsyXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiTWVzc2FnZVRocmVhZCBleGl0aW5nLiIpOwogICAgICAgICB9CkBAIC0zMDcsMTIgKzY2OSwxNiBAQAogICAgICAgICBuQ29udGV4dER1bXAoYml0cyk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICBuQ29udGV4dEZpbmlzaCgpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CiAgICAgICAgIHZhbGlkYXRlKCk7Ci0gICAgICAgIG5Db250ZXh0RGVpbml0VG9DbGllbnQoKTsKKyAgICAgICAgbkNvbnRleHREZWluaXRUb0NsaWVudChtQ29udGV4dCk7CiAgICAgICAgIG1NZXNzYWdlVGhyZWFkLm1SdW4gPSBmYWxzZTsKIAotICAgICAgICBuQ29udGV4dERlc3Ryb3kobUNvbnRleHQpOworICAgICAgICBuQ29udGV4dERlc3Ryb3koKTsKICAgICAgICAgbUNvbnRleHQgPSAwOwogCiAgICAgICAgIG5EZXZpY2VEZXN0cm95KG1EZXYpOwpAQCAtMzM1LDMgKzcwMSw0IEBACiB9CiAKIAorCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdEdMLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdEdMLmphdmEKaW5kZXggZDFkZjIzZC4uNjFlY2M4ZCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHRHTC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0R0wuamF2YQpAQCAtNzQsOSArNzQsOSBAQAogICAgICAgICBuQ29udGV4dEJpbmRSb290U2NyaXB0KHNhZmVJRChzKSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgY29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShQcm9ncmFtU3RvcmUgcCkgeworICAgIHB1YmxpYyB2b2lkIGNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKFByb2dyYW1TdG9yZSBwKSB7CiAgICAgICAgIHZhbGlkYXRlKCk7Ci0gICAgICAgIG5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlKHNhZmVJRChwKSk7CisgICAgICAgIG5Db250ZXh0QmluZFByb2dyYW1TdG9yZShzYWZlSUQocCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KFByb2dyYW1GcmFnbWVudCBwKSB7CkBAIC0xMDIsOCArMTAyLDcgQEAKIAogICAgIHB1YmxpYyBjbGFzcyBGaWxlIGV4dGVuZHMgQmFzZU9iaiB7CiAgICAgICAgIEZpbGUoaW50IGlkKSB7Ci0gICAgICAgICAgICBzdXBlcihSZW5kZXJTY3JpcHRHTC50aGlzKTsKLSAgICAgICAgICAgIG1JRCA9IGlkOworICAgICAgICAgICAgc3VwZXIoaWQsIFJlbmRlclNjcmlwdEdMLnRoaXMpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NhbXBsZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2FtcGxlci5qYXZhCmluZGV4IDQwYmE3MjIuLjM0M2ZjZGIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2FtcGxlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2FtcGxlci5qYXZhCkBAIC00NywxMCArNDcsODIgQEAKICAgICB9CiAKICAgICBTYW1wbGVyKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBTYW1wbGVyIENMQU1QX05FQVJFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1TYW1wbGVyX0NMQU1QX05FQVJFU1QgPT0gbnVsbCkgeworICAgICAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMpOworICAgICAgICAgICAgYi5zZXRNaW4oVmFsdWUuTkVBUkVTVCk7CisgICAgICAgICAgICBiLnNldE1hZyhWYWx1ZS5ORUFSRVNUKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgYi5zZXRXcmFwVChWYWx1ZS5DTEFNUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9DTEFNUF9ORUFSRVNUID0gYi5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVNhbXBsZXJfQ0xBTVBfTkVBUkVTVDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNhbXBsZXIgQ0xBTVBfTElORUFSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tU2FtcGxlcl9DTEFNUF9MSU5FQVIgPT0gbnVsbCkgeworICAgICAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMpOworICAgICAgICAgICAgYi5zZXRNaW4oVmFsdWUuTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0TWFnKFZhbHVlLkxJTkVBUik7CisgICAgICAgICAgICBiLnNldFdyYXBTKFZhbHVlLkNMQU1QKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgcnMubVNhbXBsZXJfQ0xBTVBfTElORUFSID0gYi5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVNhbXBsZXJfQ0xBTVBfTElORUFSOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2FtcGxlciBDTEFNUF9MSU5FQVJfTUlQX0xJTkVBUihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVNhbXBsZXJfQ0xBTVBfTElORUFSX01JUF9MSU5FQVIgPT0gbnVsbCkgeworICAgICAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMpOworICAgICAgICAgICAgYi5zZXRNaW4oVmFsdWUuTElORUFSX01JUF9MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRNYWcoVmFsdWUuTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgYi5zZXRXcmFwVChWYWx1ZS5DTEFNUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9DTEFNUF9MSU5FQVJfTUlQX0xJTkVBUiA9IGIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1TYW1wbGVyX0NMQU1QX0xJTkVBUl9NSVBfTElORUFSOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2FtcGxlciBXUkFQX05FQVJFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1TYW1wbGVyX1dSQVBfTkVBUkVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5ORUFSRVNUKTsKKyAgICAgICAgICAgIGIuc2V0TWFnKFZhbHVlLk5FQVJFU1QpOworICAgICAgICAgICAgYi5zZXRXcmFwUyhWYWx1ZS5XUkFQKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9XUkFQX05FQVJFU1QgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9XUkFQX05FQVJFU1Q7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTYW1wbGVyIFdSQVBfTElORUFSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tU2FtcGxlcl9XUkFQX0xJTkVBUiA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRNYWcoVmFsdWUuTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBiLnNldFdyYXBUKFZhbHVlLldSQVApOworICAgICAgICAgICAgcnMubVNhbXBsZXJfV1JBUF9MSU5FQVIgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9XUkFQX0xJTkVBUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNhbXBsZXIgV1JBUF9MSU5FQVJfTUlQX0xJTkVBUihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVNhbXBsZXJfV1JBUF9MSU5FQVJfTUlQX0xJTkVBUiA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5MSU5FQVJfTUlQX0xJTkVBUik7CisgICAgICAgICAgICBiLnNldE1hZyhWYWx1ZS5MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRXcmFwUyhWYWx1ZS5XUkFQKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9XUkFQX0xJTkVBUl9NSVBfTElORUFSID0gYi5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVNhbXBsZXJfV1JBUF9MSU5FQVJfTUlQX0xJTkVBUjsKKyAgICB9CisKKwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CiAgICAgICAgIFZhbHVlIG1NaW47CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHQuamF2YQppbmRleCA1N2NjZmEzLi4xOWM0NDRjIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0LmphdmEKQEAgLTQyLDI5ICs0Miw0NiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJvdGVjdGVkIHZvaWQgaW52b2tlKGludCBzbG90KSB7CisgICAgICAgIG1SUy5uU2NyaXB0SW52b2tlKG1JRCwgc2xvdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgaW52b2tlKGludCBzbG90LCBGaWVsZFBhY2tlciB2KSB7CisgICAgICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SUy5uU2NyaXB0SW52b2tlVihtSUQsIHNsb3QsIHYuZ2V0RGF0YSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SUy5uU2NyaXB0SW52b2tlKG1JRCwgc2xvdCk7CisgICAgICAgIH0KKyAgICB9CisKKwogICAgIFNjcmlwdChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgIG1JRCA9IGlkOworICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGJpbmRBbGxvY2F0aW9uKEFsbG9jYXRpb24gdmEsIGludCBzbG90KSB7CiAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMublNjcmlwdEJpbmRBbGxvY2F0aW9uKG1JRCwgdmEubUlELCBzbG90KTsKKyAgICAgICAgaWYgKHZhICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SUy5uU2NyaXB0QmluZEFsbG9jYXRpb24obUlELCB2YS5tSUQsIHNsb3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJTLm5TY3JpcHRCaW5kQWxsb2NhdGlvbihtSUQsIDAsIHNsb3QpOworICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0Q2xlYXJDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMublNjcmlwdFNldENsZWFyQ29sb3IobUlELCByLCBnLCBiLCBhKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXIoaW50IGluZGV4LCBmbG9hdCB2KSB7CisgICAgICAgIG1SUy5uU2NyaXB0U2V0VmFyRihtSUQsIGluZGV4LCB2KTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRDbGVhckRlcHRoKGZsb2F0IGQpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uU2NyaXB0U2V0Q2xlYXJEZXB0aChtSUQsIGQpOworICAgIHB1YmxpYyB2b2lkIHNldFZhcihpbnQgaW5kZXgsIGludCB2KSB7CisgICAgICAgIG1SUy5uU2NyaXB0U2V0VmFySShtSUQsIGluZGV4LCB2KTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRDbGVhclN0ZW5jaWwoaW50IHN0ZW5jaWwpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uU2NyaXB0U2V0Q2xlYXJTdGVuY2lsKG1JRCwgc3RlbmNpbCk7CisgICAgcHVibGljIHZvaWQgc2V0VmFyKGludCBpbmRleCwgYm9vbGVhbiB2KSB7CisgICAgICAgIG1SUy5uU2NyaXB0U2V0VmFySShtSUQsIGluZGV4LCB2ID8gMSA6IDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhcihpbnQgaW5kZXgsIEZpZWxkUGFja2VyIHYpIHsKKyAgICAgICAgbVJTLm5TY3JpcHRTZXRWYXJWKG1JRCwgaW5kZXgsIHYuZ2V0RGF0YSgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRUaW1lWm9uZShTdHJpbmcgdGltZVpvbmUpIHsKQEAgLTc4LDcyICs5NSw1NCBAQAogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKICAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKLSAgICAgICAgYm9vbGVhbiBtSXNSb290ID0gZmFsc2U7Ci0gICAgICAgIFR5cGVbXSBtVHlwZXM7Ci0gICAgICAgIFN0cmluZ1tdIG1OYW1lczsKLSAgICAgICAgYm9vbGVhbltdIG1Xcml0YWJsZTsKLSAgICAgICAgaW50IG1JbnZva2FibGVDb3VudCA9IDA7Ci0gICAgICAgIEludm9rYWJsZVtdIG1JbnZva2FibGVzOwogCiAgICAgICAgIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CiAgICAgICAgICAgICBtUlMgPSByczsKLSAgICAgICAgICAgIG1UeXBlcyA9IG5ldyBUeXBlW01BWF9TTE9UXTsKLSAgICAgICAgICAgIG1OYW1lcyA9IG5ldyBTdHJpbmdbTUFYX1NMT1RdOwotICAgICAgICAgICAgbVdyaXRhYmxlID0gbmV3IGJvb2xlYW5bTUFYX1NMT1RdOwotICAgICAgICAgICAgbUludm9rYWJsZXMgPSBuZXcgSW52b2thYmxlW01BWF9TTE9UXTsKICAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoVHlwZSB0LCBpbnQgc2xvdCkgewotICAgICAgICAgICAgbVR5cGVzW3Nsb3RdID0gdDsKLSAgICAgICAgICAgIG1OYW1lc1tzbG90XSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFR5cGUgdCwgU3RyaW5nIG5hbWUsIGludCBzbG90KSB7Ci0gICAgICAgICAgICBtVHlwZXNbc2xvdF0gPSB0OwotICAgICAgICAgICAgbU5hbWVzW3Nsb3RdID0gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbnZva2FibGUgYWRkSW52b2thYmxlKFN0cmluZyBmdW5jKSB7Ci0gICAgICAgICAgICBJbnZva2FibGUgaSA9IG5ldyBJbnZva2FibGUoKTsKLSAgICAgICAgICAgIGkubU5hbWUgPSBmdW5jOwotICAgICAgICAgICAgaS5tUlMgPSBtUlM7Ci0gICAgICAgICAgICBpLm1TbG90ID0gbUludm9rYWJsZUNvdW50OwotICAgICAgICAgICAgbUludm9rYWJsZXNbbUludm9rYWJsZUNvdW50KytdID0gaTsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VHlwZShib29sZWFuIHdyaXRhYmxlLCBpbnQgc2xvdCkgewotICAgICAgICAgICAgbVdyaXRhYmxlW3Nsb3RdID0gd3JpdGFibGU7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHRyYW5zZmVyQ3JlYXRlKCkgewotICAgICAgICAgICAgbVJTLm5TY3JpcHRTZXRSb290KG1Jc1Jvb3QpOwotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IG1UeXBlcy5sZW5ndGg7IGN0KyspIHsKLSAgICAgICAgICAgICAgICBpZihtVHlwZXNbY3RdICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJTLm5TY3JpcHRTZXRUeXBlKG1UeXBlc1tjdF0ubUlELCBtV3JpdGFibGVbY3RdLCBtTmFtZXNbY3RdLCBjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IG1JbnZva2FibGVDb3VudDsgY3QrKykgewotICAgICAgICAgICAgICAgIG1SUy5uU2NyaXB0U2V0SW52b2thYmxlKG1JbnZva2FibGVzW2N0XS5tTmFtZSwgY3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB0cmFuc2Zlck9iamVjdChTY3JpcHQgcykgewotICAgICAgICAgICAgcy5tSXNSb290ID0gbUlzUm9vdDsKLSAgICAgICAgICAgIHMubVR5cGVzID0gbVR5cGVzOwotICAgICAgICAgICAgcy5tSW52b2thYmxlcyA9IG5ldyBJbnZva2FibGVbbUludm9rYWJsZUNvdW50XTsKLSAgICAgICAgICAgIGZvcihpbnQgY3Q9MDsgY3QgPCBtSW52b2thYmxlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgICAgICBzLm1JbnZva2FibGVzW2N0XSA9IG1JbnZva2FibGVzW2N0XTsKLSAgICAgICAgICAgICAgICBzLm1JbnZva2FibGVzW2N0XS5tU2NyaXB0ID0gczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMubUludm9rYWJsZXMgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Um9vdChib29sZWFuIHIpIHsKLSAgICAgICAgICAgIG1Jc1Jvb3QgPSByOwotICAgICAgICB9Ci0KICAgICB9CiAKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmllbGRCYXNlIHsKKyAgICAgICAgcHJvdGVjdGVkIEVsZW1lbnQgbUVsZW1lbnQ7CisgICAgICAgIHByb3RlY3RlZCBUeXBlIG1UeXBlOworICAgICAgICBwcm90ZWN0ZWQgQWxsb2NhdGlvbiBtQWxsb2NhdGlvbjsKKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KFJlbmRlclNjcmlwdCBycywgaW50IGRpbXgpIHsKKyAgICAgICAgICAgIG1BbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChycywgbUVsZW1lbnQsIGRpbXgpOworICAgICAgICAgICAgbVR5cGUgPSBtQWxsb2NhdGlvbi5nZXRUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgRmllbGRCYXNlKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRWxlbWVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQWxsb2NhdGlvbiBnZXRBbGxvY2F0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLy9AT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlQWxsb2NhdGlvbigpIHsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8KKyAgICAgICAgLyoKKyAgICAgICAgcHVibGljIGNsYXNzIFNjcmlwdEZpZWxkX1VzZXJGaWVsZAorICAgICAgICAgICAgZXh0ZW5kcyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TY3JpcHQuRmllbGRCYXNlIHsKKworICAgICAgICAgICAgcHJvdGVjdGVkCisKKyAgICAgICAgfQorCisgICAgICAgICovCisKKyAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0Qy5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHRDLmphdmEKaW5kZXggYmI5OWUyMy4uNTk1OWJlNCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHRDLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHRDLmphdmEKQEAgLTM3LDExICszNyw0OSBAQAogICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgIH0KIAorICAgIHByb3RlY3RlZCBTY3JpcHRDKFJlbmRlclNjcmlwdCBycywgUmVzb3VyY2VzIHJlc291cmNlcywgaW50IHJlc291cmNlSUQsIGJvb2xlYW4gaXNSb290KSB7CisgICAgICAgIHN1cGVyKDAsIHJzKTsKKyAgICAgICAgbUlEID0gaW50ZXJuYWxDcmVhdGUocnMsIHJlc291cmNlcywgcmVzb3VyY2VJRCk7CisgICAgfQorCisKKyAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgaW50IGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgUmVzb3VyY2VzIHJlc291cmNlcywgaW50IHJlc291cmNlSUQpIHsKKyAgICAgICAgYnl0ZVtdIHBnbTsKKyAgICAgICAgaW50IHBnbUxlbmd0aDsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSByZXNvdXJjZXMub3BlblJhd1Jlc291cmNlKHJlc291cmNlSUQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwZ20gPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgICAgICAgICBwZ21MZW5ndGggPSAwOworICAgICAgICAgICAgICAgIHdoaWxlKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzTGVmdCA9IHBnbS5sZW5ndGggLSBwZ21MZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc0xlZnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZjIgPSBuZXcgYnl0ZVtwZ20ubGVuZ3RoICogMl07CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBnbSwgMCwgYnVmMiwgMCwgcGdtLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwZ20gPSBidWYyOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNMZWZ0ID0gcGdtLmxlbmd0aCAtIHBnbUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gaXMucmVhZChwZ20sIHBnbUxlbmd0aCwgYnl0ZXNMZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwZ21MZW5ndGggKz0gYnl0ZXNSZWFkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBycy5uU2NyaXB0Q0JlZ2luKCk7CisgICAgICAgIHJzLm5TY3JpcHRDU2V0U2NyaXB0KHBnbSwgMCwgcGdtTGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHJzLm5TY3JpcHRDQ3JlYXRlKCk7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIGV4dGVuZHMgU2NyaXB0LkJ1aWxkZXIgewogICAgICAgICBieXRlW10gbVByb2dyYW07CiAgICAgICAgIGludCBtUHJvZ3JhbUxlbmd0aDsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsSW50ZWdlcj4gbUludERlZmluZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBIYXNoTWFwPFN0cmluZyxGbG9hdD4gbUZsb2F0RGVmaW5lcyA9IG5ldyBIYXNoTWFwKCk7CiAKICAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CiAgICAgICAgICAgICBzdXBlcihycyk7CkBAIC05Miw2NiArMTMwLDIwIEBACiAKICAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBTY3JpcHRDIGludGVybmFsQ3JlYXRlKEJ1aWxkZXIgYikgewogICAgICAgICAgICAgYi5tUlMublNjcmlwdENCZWdpbigpOwotICAgICAgICAgICAgYi50cmFuc2ZlckNyZWF0ZSgpOwogCi0gICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZyxJbnRlZ2VyPiBlOiBiLm1JbnREZWZpbmVzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBiLm1SUy5uU2NyaXB0Q0FkZERlZmluZUkzMihlLmdldEtleSgpLCBlLmdldFZhbHVlKCkuaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZyxGbG9hdD4gZTogYi5tRmxvYXREZWZpbmVzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBiLm1SUy5uU2NyaXB0Q0FkZERlZmluZUYoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpLmZsb2F0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cuZSgicnMiLCAibGVuID0gIiArIGIubVByb2dyYW1MZW5ndGgpOwogICAgICAgICAgICAgYi5tUlMublNjcmlwdENTZXRTY3JpcHQoYi5tUHJvZ3JhbSwgMCwgYi5tUHJvZ3JhbUxlbmd0aCk7CiAKICAgICAgICAgICAgIGludCBpZCA9IGIubVJTLm5TY3JpcHRDQ3JlYXRlKCk7CiAgICAgICAgICAgICBTY3JpcHRDIG9iaiA9IG5ldyBTY3JpcHRDKGlkLCBiLm1SUyk7Ci0gICAgICAgICAgICBiLnRyYW5zZmVyT2JqZWN0KG9iaik7Ci0KICAgICAgICAgICAgIHJldHVybiBvYmo7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmUoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotICAgICAgICAgICAgbUludERlZmluZXMucHV0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZShTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpIHsKLSAgICAgICAgICAgIG1GbG9hdERlZmluZXMucHV0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUYWtlcyB0aGUgYWxsIHB1YmxpYyBzdGF0aWMgZmluYWwgZmllbGRzIGZvciBhIGNsYXNzLCBhbmQgYWRkcyBkZWZpbmVzCi0gICAgICAgICAqIGZvciB0aGVtLCB1c2luZyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgYXMgdGhlIG5hbWUgb2YgdGhlIGRlZmluZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZXMoQ2xhc3MgY2wpIHsKLSAgICAgICAgICAgIGFkZERlZmluZXMoY2wuZ2V0RmllbGRzKCksIChNb2RpZmllci5TVEFUSUMgfCBNb2RpZmllci5GSU5BTCB8IE1vZGlmaWVyLlBVQkxJQyksIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRha2VzIHRoZSBhbGwgcHVibGljIGZpZWxkcyBmb3IgYW4gb2JqZWN0LCBhbmQgYWRkcyBkZWZpbmVzCi0gICAgICAgICAqIGZvciB0aGVtLCB1c2luZyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgYXMgdGhlIG5hbWUgb2YgdGhlIGRlZmluZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZXMoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIGFkZERlZmluZXMoby5nZXRDbGFzcygpLmdldEZpZWxkcygpLCBNb2RpZmllci5QVUJMSUMsIG8pOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhZGREZWZpbmVzKEZpZWxkW10gZmllbGRzLCBpbnQgbWFzaywgT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIGZvciAoRmllbGQgZjogZmllbGRzKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChmLmdldE1vZGlmaWVycygpICYgbWFzaykgPT0gbWFzaykgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgdCA9IGYuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT0gaW50LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludERlZmluZXMucHV0KGYuZ2V0TmFtZSgpLCBmLmdldEludChvKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ID09IGZsb2F0LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsb2F0RGVmaW5lcy5wdXQoZi5nZXROYW1lKCksIGYuZ2V0RmxvYXQobykpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBEbyB3ZSB3YW50IHRoaXMgbG9nPwotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhZGREZWZpbmVzIHNraXBwaW5nIGZpZWxkICIgKyBmLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZShTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7fQorICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmUoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKSB7fQorICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmVzKENsYXNzIGNsKSB7fQorICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmVzKE9iamVjdCBvKSB7fQorICAgICAgICB2b2lkIGFkZERlZmluZXMoRmllbGRbXSBmaWVsZHMsIGludCBtYXNrLCBPYmplY3Qgbykge30KIAogICAgICAgICBwdWJsaWMgU2NyaXB0QyBjcmVhdGUoKSB7CiAgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxDcmVhdGUodGhpcyk7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0Mi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjY4MDFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBTaG9ydDIgeworICAgIHB1YmxpYyBTaG9ydDIoKSB7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IHg7CisgICAgcHVibGljIHNob3J0IHk7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQzLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0My5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOWMzMDUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0My5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIFNob3J0MyB7CisgICAgcHVibGljIFNob3J0MygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgeDsKKyAgICBwdWJsaWMgc2hvcnQgeTsKKyAgICBwdWJsaWMgc2hvcnQgejsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE0NzRlMgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQ0LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgU2hvcnQ0IHsKKyAgICBwdWJsaWMgU2hvcnQ0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCB4OworICAgIHB1YmxpYyBzaG9ydCB5OworICAgIHB1YmxpYyBzaG9ydCB6OworICAgIHB1YmxpYyBzaG9ydCB3OworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaW1wbGVNZXNoLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NpbXBsZU1lc2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyMTdhOS4uMDAwMDAwMAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NpbXBsZU1lc2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKLQotaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotLyoqCi0gKiBAaGlkZQotICoKLSAqKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVNZXNoIGV4dGVuZHMgQmFzZU9iaiB7Ci0gICAgVHlwZVtdIG1WZXJ0ZXhUeXBlczsKLSAgICBUeXBlIG1JbmRleFR5cGU7Ci0gICAgLy9UeXBlIG1CYXRjaGVUeXBlOwotICAgIFByaW1pdGl2ZSBtUHJpbWl0aXZlOwotCi0gICAgU2ltcGxlTWVzaChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgIG1JRCA9IGlkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJpbmRWZXJ0ZXhBbGxvY2F0aW9uKEFsbG9jYXRpb24gYSwgaW50IHNsb3QpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uU2ltcGxlTWVzaEJpbmRWZXJ0ZXgobUlELCBhLm1JRCwgc2xvdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmluZEluZGV4QWxsb2NhdGlvbihBbGxvY2F0aW9uIGEpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uU2ltcGxlTWVzaEJpbmRJbmRleChtSUQsIGEubUlEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWxsb2NhdGlvbiBjcmVhdGVWZXJ0ZXhBbGxvY2F0aW9uKGludCBzbG90KSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICByZXR1cm4gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIG1WZXJ0ZXhUeXBlc1tzbG90XSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFsbG9jYXRpb24gY3JlYXRlSW5kZXhBbGxvY2F0aW9uKCkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgcmV0dXJuIEFsbG9jYXRpb24uY3JlYXRlVHlwZWQobVJTLCBtSW5kZXhUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZSBnZXRWZXJ0ZXhUeXBlKGludCBzbG90KSB7Ci0gICAgICAgIHJldHVybiBtVmVydGV4VHlwZXNbc2xvdF07Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGUgZ2V0SW5kZXhUeXBlKCkgewotICAgICAgICByZXR1cm4gbUluZGV4VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOwotCi0gICAgICAgIGNsYXNzIEVudHJ5IHsKLSAgICAgICAgICAgIFR5cGUgdDsKLSAgICAgICAgICAgIEVsZW1lbnQgZTsKLSAgICAgICAgICAgIGludCBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG1WZXJ0ZXhUeXBlQ291bnQ7Ci0gICAgICAgIEVudHJ5W10gbVZlcnRleFR5cGVzOwotICAgICAgICBFbnRyeSBtSW5kZXhUeXBlOwotICAgICAgICAvL0VudHJ5IG1CYXRjaFR5cGU7Ci0gICAgICAgIFByaW1pdGl2ZSBtUHJpbWl0aXZlOwotCi0KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgICAgICBtUlMgPSByczsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQgPSAwOwotICAgICAgICAgICAgbVZlcnRleFR5cGVzID0gbmV3IEVudHJ5WzE2XTsKLSAgICAgICAgICAgIG1JbmRleFR5cGUgPSBuZXcgRW50cnkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgYWRkVmVydGV4VHlwZShUeXBlIHQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKG1WZXJ0ZXhUeXBlQ291bnQgPj0gbVZlcnRleFR5cGVzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1heCB2ZXJ0ZXggdHlwZXMgZXhjZWVkZWQuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBhZGRlZEluZGV4ID0gbVZlcnRleFR5cGVDb3VudDsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XSA9IG5ldyBFbnRyeSgpOwotICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLnQgPSB0OwotICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCsrOwotICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGFkZFZlcnRleFR5cGUoRWxlbWVudCBlLCBpbnQgc2l6ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAobVZlcnRleFR5cGVDb3VudCA+PSBtVmVydGV4VHlwZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWF4IHZlcnRleCB0eXBlcyBleGNlZWRlZC4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggPSBtVmVydGV4VHlwZUNvdW50OwotICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdID0gbmV3IEVudHJ5KCk7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0uZSA9IGU7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0uc2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50Kys7Ci0gICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEluZGV4VHlwZShUeXBlIHQpIHsKLSAgICAgICAgICAgIG1JbmRleFR5cGUudCA9IHQ7Ci0gICAgICAgICAgICBtSW5kZXhUeXBlLmUgPSBudWxsOwotICAgICAgICAgICAgbUluZGV4VHlwZS5zaXplID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEluZGV4VHlwZShFbGVtZW50IGUsIGludCBzaXplKSB7Ci0gICAgICAgICAgICBtSW5kZXhUeXBlLnQgPSBudWxsOwotICAgICAgICAgICAgbUluZGV4VHlwZS5lID0gZTsKLSAgICAgICAgICAgIG1JbmRleFR5cGUuc2l6ZSA9IHNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcmltaXRpdmUoUHJpbWl0aXZlIHApIHsKLSAgICAgICAgICAgIG1QcmltaXRpdmUgPSBwOwotICAgICAgICB9Ci0KLQotICAgICAgICBUeXBlIG5ld1R5cGUoRWxlbWVudCBlLCBpbnQgc2l6ZSkgewotICAgICAgICAgICAgVHlwZS5CdWlsZGVyIHRiID0gbmV3IFR5cGUuQnVpbGRlcihtUlMsIGUpOwotICAgICAgICAgICAgdGIuYWRkKERpbWVuc2lvbi5YLCBzaXplKTsKLSAgICAgICAgICAgIHJldHVybiB0Yi5jcmVhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgU2ltcGxlTWVzaCBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEJ1aWxkZXIgYikgewotICAgICAgICAgICAgVHlwZVtdIHRvRGVzdHJveSA9IG5ldyBUeXBlWzE4XTsKLSAgICAgICAgICAgIGludCB0b0Rlc3Ryb3lDb3VudCA9IDA7Ci0KLSAgICAgICAgICAgIGludCBpbmRleElEID0gMDsKLSAgICAgICAgICAgIGlmIChiLm1JbmRleFR5cGUudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5kZXhJRCA9IGIubUluZGV4VHlwZS50Lm1JRDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYi5tSW5kZXhUeXBlLnNpemUgIT0gMCkgewotICAgICAgICAgICAgICAgIGIubUluZGV4VHlwZS50ID0gYi5uZXdUeXBlKGIubUluZGV4VHlwZS5lLCBiLm1JbmRleFR5cGUuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaW5kZXhJRCA9IGIubUluZGV4VHlwZS50Lm1JRDsKLSAgICAgICAgICAgICAgICB0b0Rlc3Ryb3lbdG9EZXN0cm95Q291bnQrK10gPSBiLm1JbmRleFR5cGUudDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50W10gSURzID0gbmV3IGludFtiLm1WZXJ0ZXhUeXBlQ291bnRdOwotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IGIubVZlcnRleFR5cGVDb3VudDsgY3QrKykgewotICAgICAgICAgICAgICAgIGlmIChiLm1WZXJ0ZXhUeXBlc1tjdF0udCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIElEc1tjdF0gPSBiLm1WZXJ0ZXhUeXBlc1tjdF0udC5tSUQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYi5tVmVydGV4VHlwZXNbY3RdLnQgPSBiLm5ld1R5cGUoYi5tVmVydGV4VHlwZXNbY3RdLmUsIGIubVZlcnRleFR5cGVzW2N0XS5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgSURzW2N0XSA9IGIubVZlcnRleFR5cGVzW2N0XS50Lm1JRDsKLSAgICAgICAgICAgICAgICAgICAgdG9EZXN0cm95W3RvRGVzdHJveUNvdW50KytdID0gYi5tVmVydGV4VHlwZXNbY3RdLnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgaWQgPSBycy5uU2ltcGxlTWVzaENyZWF0ZSgwLCBpbmRleElELCBJRHMsIGIubVByaW1pdGl2ZS5tSUQpOwotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IHRvRGVzdHJveUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgdG9EZXN0cm95W2N0XS5kZXN0cm95KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlTWVzaChpZCwgcnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNpbXBsZU1lc2ggY3JlYXRlKCkgewotICAgICAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICBTaW1wbGVNZXNoIHNtID0gaW50ZXJuYWxDcmVhdGUobVJTLCB0aGlzKTsKLSAgICAgICAgICAgIHNtLm1WZXJ0ZXhUeXBlcyA9IG5ldyBUeXBlW21WZXJ0ZXhUeXBlQ291bnRdOwotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IG1WZXJ0ZXhUeXBlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgICAgICBzbS5tVmVydGV4VHlwZXNbY3RdID0gbVZlcnRleFR5cGVzW2N0XS50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc20ubUluZGV4VHlwZSA9IG1JbmRleFR5cGUudDsKLSAgICAgICAgICAgIHNtLm1QcmltaXRpdmUgPSBtUHJpbWl0aXZlOwotICAgICAgICAgICAgcmV0dXJuIHNtOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBUcmlhbmdsZU1lc2hCdWlsZGVyIHsKLSAgICAgICAgZmxvYXQgbVZ0eERhdGFbXTsKLSAgICAgICAgaW50IG1WdHhDb3VudDsKLSAgICAgICAgc2hvcnQgbUluZGV4RGF0YVtdOwotICAgICAgICBpbnQgbUluZGV4Q291bnQ7Ci0gICAgICAgIFJlbmRlclNjcmlwdCBtUlM7Ci0gICAgICAgIEVsZW1lbnQgbUVsZW1lbnQ7Ci0KLSAgICAgICAgZmxvYXQgbU5YID0gMDsKLSAgICAgICAgZmxvYXQgbU5ZID0gMDsKLSAgICAgICAgZmxvYXQgbU5aID0gLTE7Ci0gICAgICAgIGZsb2F0IG1TMCA9IDA7Ci0gICAgICAgIGZsb2F0IG1UMCA9IDA7Ci0gICAgICAgIGZsb2F0IG1SID0gMTsKLSAgICAgICAgZmxvYXQgbUcgPSAxOwotICAgICAgICBmbG9hdCBtQiA9IDE7Ci0gICAgICAgIGZsb2F0IG1BID0gMTsKLQotICAgICAgICBpbnQgbVZ0eFNpemU7Ci0gICAgICAgIGludCBtRmxhZ3M7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1IgPSAweDAwMDE7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PUk1BTCA9IDB4MDAwMjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVFVSRV8wID0gMHgwMTAwOwotCi0gICAgICAgIHB1YmxpYyBUcmlhbmdsZU1lc2hCdWlsZGVyKFJlbmRlclNjcmlwdCBycywgaW50IHZ0eFNpemUsIGludCBmbGFncykgewotICAgICAgICAgICAgbVJTID0gcnM7Ci0gICAgICAgICAgICBtVnR4Q291bnQgPSAwOwotICAgICAgICAgICAgbUluZGV4Q291bnQgPSAwOwotICAgICAgICAgICAgbVZ0eERhdGEgPSBuZXcgZmxvYXRbMTI4XTsKLSAgICAgICAgICAgIG1JbmRleERhdGEgPSBuZXcgc2hvcnRbMTI4XTsKLSAgICAgICAgICAgIG1WdHhTaXplID0gdnR4U2l6ZTsKLSAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOwotCi0gICAgICAgICAgICBpZiAodnR4U2l6ZSA8IDIgfHwgdnR4U2l6ZSA+IDMpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWZXJ0ZXggc2l6ZSBvdXQgb2YgcmFuZ2UuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbWFrZVNwYWNlKGludCBjb3VudCkgewotICAgICAgICAgICAgaWYgKChtVnR4Q291bnQgKyBjb3VudCkgPj0gbVZ0eERhdGEubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdFtdID0gbmV3IGZsb2F0W21WdHhEYXRhLmxlbmd0aCAqIDJdOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobVZ0eERhdGEsIDAsIHQsIDAsIG1WdHhEYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGEgPSB0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGxhdGNoKCkgewotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBDT0xPUikgIT0gMCkgewotICAgICAgICAgICAgICAgIG1ha2VTcGFjZSg0KTsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtUjsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtRzsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtQjsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtQTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbWFrZVNwYWNlKDIpOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1TMDsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtVDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIE5PUk1BTCkgIT0gMCkgewotICAgICAgICAgICAgICAgIG1ha2VTcGFjZSgzKTsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtTlg7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbU5ZOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1OWjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFZlcnRleChmbG9hdCB4LCBmbG9hdCB5KSB7Ci0gICAgICAgICAgICBpZiAobVZ0eFNpemUgIT0gMikgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFrZVNwYWNlKDIpOwotICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geDsKLSAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHk7Ci0gICAgICAgICAgICBsYXRjaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkVmVydGV4KGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKLSAgICAgICAgICAgIGlmIChtVnR4U2l6ZSAhPSAzKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYWtlU3BhY2UoMyk7Ci0gICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB4OwotICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geTsKLSAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHo7Ci0gICAgICAgICAgICBsYXRjaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHVyZShmbG9hdCBzLCBmbG9hdCB0KSB7Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIFRFWFRVUkVfMCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVMwID0gczsKLSAgICAgICAgICAgIG1UMCA9IHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXROb3JtYWwoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgewotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBOT1JNQUwpID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1OWCA9IHg7Ci0gICAgICAgICAgICBtTlkgPSB5OwotICAgICAgICAgICAgbU5aID0gejsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpIHsKLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SID0gcjsKLSAgICAgICAgICAgIG1HID0gZzsKLSAgICAgICAgICAgIG1CID0gYjsKLSAgICAgICAgICAgIG1BID0gYTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFRyaWFuZ2xlKGludCBpZHgxLCBpbnQgaWR4MiwgaW50IGlkeDMpIHsKLSAgICAgICAgICAgIGlmKChpZHgxID49IG1WdHhDb3VudCkgfHwgKGlkeDEgPCAwKSB8fAotICAgICAgICAgICAgICAgKGlkeDIgPj0gbVZ0eENvdW50KSB8fCAoaWR4MiA8IDApIHx8Ci0gICAgICAgICAgICAgICAoaWR4MyA+PSBtVnR4Q291bnQpIHx8IChpZHgzIDwgMCkpIHsKLSAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkluZGV4IHByb3ZpZGVkIGdyZWF0ZXIgdGhhbiB2ZXJ0ZXggY291bnQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1JbmRleENvdW50ICsgMykgPj0gbUluZGV4RGF0YS5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBzaG9ydCB0W10gPSBuZXcgc2hvcnRbbUluZGV4RGF0YS5sZW5ndGggKiAyXTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1JbmRleERhdGEsIDAsIHQsIDAsIG1JbmRleERhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBtSW5kZXhEYXRhID0gdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JbmRleERhdGFbbUluZGV4Q291bnQrK10gPSAoc2hvcnQpaWR4MTsKLSAgICAgICAgICAgIG1JbmRleERhdGFbbUluZGV4Q291bnQrK10gPSAoc2hvcnQpaWR4MjsKLSAgICAgICAgICAgIG1JbmRleERhdGFbbUluZGV4Q291bnQrK10gPSAoc2hvcnQpaWR4MzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTaW1wbGVNZXNoIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgIEVsZW1lbnQuQnVpbGRlciBiID0gbmV3IEVsZW1lbnQuQnVpbGRlcihtUlMpOwotICAgICAgICAgICAgaW50IGZsb2F0Q291bnQgPSBtVnR4U2l6ZTsKLSAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFLaW5kLlBPU0lUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZ0eFNpemUpLCAicG9zaXRpb24iKTsKLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpICE9IDApIHsKLSAgICAgICAgICAgICAgICBmbG9hdENvdW50ICs9IDQ7Ci0gICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5jcmVhdGVBdHRyaWIobVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhS2luZC5DT0xPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KSwgImNvbG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIFRFWFRVUkVfMCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGZsb2F0Q291bnQgKz0gMjsKLSAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LmNyZWF0ZUF0dHJpYihtUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFLaW5kLlRFWFRVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiksICJ0ZXh0dXJlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIE5PUk1BTCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGZsb2F0Q291bnQgKz0gMzsKLSAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LmNyZWF0ZUF0dHJpYihtUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFLaW5kLk5PUk1BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKSwgIm5vcm1hbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVsZW1lbnQgPSBiLmNyZWF0ZSgpOwotCi0gICAgICAgICAgICBCdWlsZGVyIHNtYiA9IG5ldyBCdWlsZGVyKG1SUyk7Ci0gICAgICAgICAgICBzbWIuYWRkVmVydGV4VHlwZShtRWxlbWVudCwgbVZ0eENvdW50IC8gZmxvYXRDb3VudCk7Ci0gICAgICAgICAgICBzbWIuc2V0SW5kZXhUeXBlKEVsZW1lbnQuY3JlYXRlSW5kZXgobVJTKSwgbUluZGV4Q291bnQpOwotICAgICAgICAgICAgc21iLnNldFByaW1pdGl2ZShQcmltaXRpdmUuVFJJQU5HTEUpOwotICAgICAgICAgICAgU2ltcGxlTWVzaCBzbSA9IHNtYi5jcmVhdGUoKTsKLQotICAgICAgICAgICAgQWxsb2NhdGlvbiB2ZXJ0ZXhBbGxvYyA9IHNtLmNyZWF0ZVZlcnRleEFsbG9jYXRpb24oMCk7Ci0gICAgICAgICAgICBBbGxvY2F0aW9uIGluZGV4QWxsb2MgPSBzbS5jcmVhdGVJbmRleEFsbG9jYXRpb24oKTsKLSAgICAgICAgICAgIHNtLmJpbmRWZXJ0ZXhBbGxvY2F0aW9uKHZlcnRleEFsbG9jLCAwKTsKLSAgICAgICAgICAgIHNtLmJpbmRJbmRleEFsbG9jYXRpb24oaW5kZXhBbGxvYyk7Ci0KLSAgICAgICAgICAgIHZlcnRleEFsbG9jLmRhdGEobVZ0eERhdGEpOwotICAgICAgICAgICAgdmVydGV4QWxsb2MudXBsb2FkVG9CdWZmZXJPYmplY3QoKTsKLQotICAgICAgICAgICAgaW5kZXhBbGxvYy5kYXRhKG1JbmRleERhdGEpOwotICAgICAgICAgICAgaW5kZXhBbGxvYy51cGxvYWRUb0J1ZmZlck9iamVjdCgpOwotCi0gICAgICAgICAgICByZXR1cm4gc207Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlLmphdmEKaW5kZXggNjJkMzg2Ny4uMjEwNTNjOSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlLmphdmEKQEAgLTE2LDcgKzE2LDkgQEAKIAogcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKIAorCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCiAgKiBAaGlkZQpAQCAtOTUsOCArOTcsNyBAQAogCiAKICAgICBUeXBlKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgICAgIG1OYXRpdmVDYWNoZSA9IDA7CiAgICAgfQogCkBAIC0xMDgsNDggKzEwOSwzMCBAQAogICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgVHlwZSBjcmVhdGVGcm9tQ2xhc3MoUmVuZGVyU2NyaXB0IHJzLCBDbGFzcyBjLCBpbnQgc2l6ZSkgewotICAgICAgICBFbGVtZW50IGUgPSBFbGVtZW50LmNyZWF0ZUZyb21DbGFzcyhycywgYyk7Ci0gICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzLCBlKTsKLSAgICAgICAgYi5hZGQoRGltZW5zaW9uLlgsIHNpemUpOwotICAgICAgICBUeXBlIHQgPSBiLmNyZWF0ZSgpOwotICAgICAgICBlLmRlc3Ryb3koKTsKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIHVwZGF0ZUZyb21OYXRpdmUoKSB7CisgICAgICAgIC8vIFdlIGhhdmUgNiBpbnRlZ2VyIHRvIG9idGFpbiBtRGltWDsgbURpbVk7IG1EaW1aOworICAgICAgICAvLyBtRGltTE9EOyBtRGltRmFjZXM7IG1FbGVtZW50OworICAgICAgICBpbnRbXSBkYXRhQnVmZmVyID0gbmV3IGludFs2XTsKKyAgICAgICAgbVJTLm5UeXBlR2V0TmF0aXZlRGF0YShtSUQsIGRhdGFCdWZmZXIpOwogCi0gICAgICAgIC8vIG5hdGl2ZSBmaWVsZHMKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjLmdldEZpZWxkcygpOwotICAgICAgICAgICAgaW50W10gYXJUeXBlcyA9IG5ldyBpbnRbZmllbGRzLmxlbmd0aF07Ci0gICAgICAgICAgICBpbnRbXSBhckJpdHMgPSBuZXcgaW50W2ZpZWxkcy5sZW5ndGhdOworICAgICAgICBtRGltWCA9IGRhdGFCdWZmZXJbMF07CisgICAgICAgIG1EaW1ZID0gZGF0YUJ1ZmZlclsxXTsKKyAgICAgICAgbURpbVogPSBkYXRhQnVmZmVyWzJdOworICAgICAgICBtRGltTE9EID0gZGF0YUJ1ZmZlclszXSA9PSAxID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICBtRGltRmFjZXMgPSBkYXRhQnVmZmVyWzRdID09IDEgPyB0cnVlIDogZmFsc2U7CiAKLSAgICAgICAgICAgIGZvcihpbnQgY3Q9MDsgY3QgPCBmaWVsZHMubGVuZ3RoOyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgRmllbGQgZiA9IGZpZWxkc1tjdF07Ci0gICAgICAgICAgICAgICAgQ2xhc3MgZmMgPSBmLmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZihmYyA9PSBpbnQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJUeXBlc1tjdF0gPSBFbGVtZW50LkRhdGFUeXBlLlNJR05FRF8zMi5tSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGFyQml0c1tjdF0gPSAzMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYoZmMgPT0gc2hvcnQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJUeXBlc1tjdF0gPSBFbGVtZW50LkRhdGFUeXBlLlNJR05FRF8xNi5tSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGFyQml0c1tjdF0gPSAxNjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYoZmMgPT0gYnl0ZS5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICBhclR5cGVzW2N0XSA9IEVsZW1lbnQuRGF0YVR5cGUuU0lHTkVEXzgubUlEOwotICAgICAgICAgICAgICAgICAgICBhckJpdHNbY3RdID0gODsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYoZmMgPT0gZmxvYXQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJUeXBlc1tjdF0gPSBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLm1JRDsKLSAgICAgICAgICAgICAgICAgICAgYXJCaXRzW2N0XSA9IDMyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua293biBmaWVsZCB0eXBlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcnMublR5cGVTZXR1cEZpZWxkcyh0LCBhclR5cGVzLCBhckJpdHMsIGZpZWxkcyk7CisgICAgICAgIGludCBlbGVtZW50SUQgPSBkYXRhQnVmZmVyWzVdOworICAgICAgICBpZihlbGVtZW50SUQgIT0gMCkgeworICAgICAgICAgICAgbUVsZW1lbnQgPSBuZXcgRWxlbWVudChlbGVtZW50SUQsIG1SUyk7CisgICAgICAgICAgICBtRWxlbWVudC51cGRhdGVGcm9tTmF0aXZlKCk7CiAgICAgICAgIH0KLSAgICAgICAgdC5tSmF2YUNsYXNzID0gYzsKLSAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIGNhbGNFbGVtZW50Q291bnQoKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIFR5cGUgY3JlYXRlRnJvbUNsYXNzKFJlbmRlclNjcmlwdCBycywgQ2xhc3MgYywgaW50IHNpemUsIFN0cmluZyBzY3JpcHROYW1lKSB7Ci0gICAgICAgIFR5cGUgdCA9IGNyZWF0ZUZyb21DbGFzcyhycywgYywgc2l6ZSk7Ci0gICAgICAgIHQuc2V0TmFtZShzY3JpcHROYW1lKTsKLSAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cuZSgiUmVuZGVyU2NyaXB0IiwgIkNhbGxpbmcgZGVwcmljYXRlZCBjcmVhdGVGcm9tQ2xhc3MiKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3ZDU3ZmEuLjAwMDAwMDAKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcuTWF0aDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0KLS8qKgotICogQGhpZGUKLSAqCi0gKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yMmYgewotICAgIHB1YmxpYyBWZWN0b3IyZigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgeDsKLSAgICBwdWJsaWMgZmxvYXQgeTsKLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IzZi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IzZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjg0MmYzLi4wMDAwMDAwCi0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yM2YuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwotCi1pbXBvcnQgamF2YS5sYW5nLk1hdGg7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotCi0vKioKLSAqIEBoaWRlCi0gKgotICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjNmIHsKLSAgICBwdWJsaWMgVmVjdG9yM2YoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7Ci0gICAgcHVibGljIGZsb2F0IHo7Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yNGYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yNGYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiZDk1OS4uMDAwMDAwMAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjRmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKLQotaW1wb3J0IGphdmEubGFuZy5NYXRoOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLQotLyoqCi0gKiBAaGlkZQotICoKLSAqKi8KLXB1YmxpYyBjbGFzcyBWZWN0b3I0ZiB7Ci0gICAgcHVibGljIFZlY3RvcjRmKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCB4OwotICAgIHB1YmxpYyBmbG9hdCB5OwotICAgIHB1YmxpYyBmbG9hdCB6OwotICAgIHB1YmxpYyBmbG9hdCB3OwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfcmVuZGVyc2NyaXB0X1JlbmRlclNjcmlwdC5jcHAgYi9ncmFwaGljcy9qbmkvYW5kcm9pZF9yZW5kZXJzY3JpcHRfUmVuZGVyU2NyaXB0LmNwcAppbmRleCA0NWNjNzJlLi4yM2I3MWIwIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qbmkvYW5kcm9pZF9yZW5kZXJzY3JpcHRfUmVuZGVyU2NyaXB0LmNwcAorKysgYi9ncmFwaGljcy9qbmkvYW5kcm9pZF9yZW5kZXJzY3JpcHRfUmVuZGVyU2NyaXB0LmNwcApAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgImpuaS5oIgogI2luY2x1ZGUgIkpOSUhlbHAuaCIKICNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvYW5kcm9pZF92aWV3X1N1cmZhY2UuaCIKIAogI2luY2x1ZGUgPFJlbmRlclNjcmlwdC5oPgogI2luY2x1ZGUgPFJlbmRlclNjcmlwdEVudi5oPgpAQCAtODUsNDEgKzg2LDQzIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5Bc3NpZ25OYW1lKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBvYmosIGpieXRlQXJyYXkgc3RyKQorbkNvbnRleHRGaW5pc2goSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Bc3NpZ25OYW1lLCBjb24oJXApLCBvYmooJXApIiwgY29uLCAodm9pZCAqKW9iaik7CisgICAgTE9HX0FQSSgibkNvbnRleHRGaW5pc2gsIGNvbiglcCkiLCBjb24pOworICAgIHJzQ29udGV4dEZpbmlzaChjb24pOworfQogCitzdGF0aWMgdm9pZAorbkFzc2lnbk5hbWUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG9iaiwgamJ5dGVBcnJheSBzdHIpCit7CisgICAgTE9HX0FQSSgibkFzc2lnbk5hbWUsIGNvbiglcCksIG9iaiglcCkiLCBjb24sICh2b2lkICopb2JqKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKHN0cik7CiAgICAgamJ5dGUgKiBjcHRyID0gKGpieXRlICopIF9lbnYtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoc3RyLCAwKTsKICAgICByc0Fzc2lnbk5hbWUoY29uLCAodm9pZCAqKW9iaiwgKGNvbnN0IGNoYXIgKiljcHRyLCBsZW4pOwogICAgIF9lbnYtPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKHN0ciwgY3B0ciwgSk5JX0FCT1JUKTsKIH0KIAotc3RhdGljIHZvaWQKLW5PYmpEZXN0cm95KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBvYmopCitzdGF0aWMganN0cmluZworbkdldE5hbWUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG9iaikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKKyAgICBMT0dfQVBJKCJuR2V0TmFtZSwgY29uKCVwKSwgb2JqKCVwKSIsIGNvbiwgKHZvaWQgKilvYmopOworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworICAgIHJzR2V0TmFtZShjb24sICh2b2lkICopb2JqLCAmbmFtZSk7CisgICAgcmV0dXJuIF9lbnYtPk5ld1N0cmluZ1VURihuYW1lKTsKK30KKworc3RhdGljIHZvaWQKK25PYmpEZXN0cm95KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBvYmopCit7CiAgICAgTE9HX0FQSSgibk9iakRlc3Ryb3ksIGNvbiglcCkgb2JqKCVwKSIsIGNvbiwgKHZvaWQgKilvYmopOwogICAgIHJzT2JqRGVzdHJveShjb24sICh2b2lkICopb2JqKTsKIH0KIAotc3RhdGljIHZvaWQKLW5PYmpEZXN0cm95T09CKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBvYmopCi17Ci0gICAgLy8gVGhpcyBmdW5jdGlvbiBvbmx5IGRpZmZlcnMgZnJvbSBuT2JqRGVzdHJveSBpbiB0aGF0IGl0IGNhbGxzIHRoZQotICAgIC8vIHNwZWNpYWwgT3V0IE9mIEJhbmQgdmVyc2lvbiBvZiBPYmpEZXN0cm95IHdoaWNoIGlzIHRocmVhZCBzYWZlLgotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5PYmpEZXN0cm95T09CLCBjb24oJXApIG9iaiglcCkiLCBjb24sICh2b2lkICopb2JqKTsKLSAgICByc09iakRlc3Ryb3lPT0IoY29uLCAodm9pZCAqKW9iaik7Ci19CiAKIHN0YXRpYyBqaW50Ci1uRmlsZU9wZW4oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYnl0ZUFycmF5IHN0cikKK25GaWxlT3BlbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGpieXRlQXJyYXkgc3RyKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5GaWxlT3BlbiwgY29uKCVwKSIsIGNvbik7Ci0KICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKHN0cik7CiAgICAgamJ5dGUgKiBjcHRyID0gKGpieXRlICopIF9lbnYtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoc3RyLCAwKTsKICAgICBqaW50IHJldCA9IChqaW50KXJzRmlsZU9wZW4oY29uLCAoY29uc3QgY2hhciAqKWNwdHIsIGxlbik7CkBAIC0xNjUsOSArMTY4LDggQEAKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0U2V0UHJpb3JpdHkoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHApCituQ29udGV4dFNldFByaW9yaXR5KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBwKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIkNvbnRleHRTZXRQcmlvcml0eSwgY29uKCVwKSwgcHJpb3JpdHkoJWkpIiwgY29uLCBwKTsKICAgICByc0NvbnRleHRTZXRQcmlvcml0eShjb24sIHApOwogfQpAQCAtMTc1LDk4ICsxNzcsODggQEAKIAogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRTZXRTdXJmYWNlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB3aWR0aCwgamludCBoZWlnaHQsIGpvYmplY3Qgd25kKQorbkNvbnRleHRTZXRTdXJmYWNlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB3aWR0aCwgamludCBoZWlnaHQsIGpvYmplY3Qgd25kKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Db250ZXh0U2V0U3VyZmFjZSwgY29uKCVwKSwgd2lkdGgoJWkpLCBoZWlnaHQoJWkpLCBzdXJmYWNlKCVwKSIsIGNvbiwgd2lkdGgsIGhlaWdodCwgKFN1cmZhY2UgKil3bmQpOwogCiAgICAgU3VyZmFjZSAqIHdpbmRvdyA9IE5VTEw7CiAgICAgaWYgKHduZCA9PSBOVUxMKSB7CiAKICAgICB9IGVsc2UgewotICAgICAgICBqY2xhc3Mgc3VyZmFjZV9jbGFzcyA9IF9lbnYtPkZpbmRDbGFzcygiYW5kcm9pZC92aWV3L1N1cmZhY2UiKTsKLSAgICAgICAgamZpZWxkSUQgc3VyZmFjZUZpZWxkSUQgPSBfZW52LT5HZXRGaWVsZElEKHN1cmZhY2VfY2xhc3MsIEFORFJPSURfVklFV19TVVJGQUNFX0pOSV9JRCwgIkkiKTsKLSAgICAgICAgd2luZG93ID0gKFN1cmZhY2UqKV9lbnYtPkdldEludEZpZWxkKHduZCwgc3VyZmFjZUZpZWxkSUQpOworICAgICAgICB3aW5kb3cgPSAoU3VyZmFjZSopIGFuZHJvaWRfU3VyZmFjZV9nZXROYXRpdmVXaW5kb3coX2Vudiwgd25kKS5nZXQoKTsKICAgICB9CiAKICAgICByc0NvbnRleHRTZXRTdXJmYWNlKGNvbiwgd2lkdGgsIGhlaWdodCwgd2luZG93KTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0RGVzdHJveShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgY29uKQorbkNvbnRleHREZXN0cm95KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBMT0dfQVBJKCJuQ29udGV4dERlc3Ryb3ksIGNvbiglcCkiLCAoUnNDb250ZXh0KWNvbik7Ci0gICAgcnNDb250ZXh0RGVzdHJveSgoUnNDb250ZXh0KWNvbik7CisgICAgTE9HX0FQSSgibkNvbnRleHREZXN0cm95LCBjb24oJXApIiwgY29uKTsKKyAgICByc0NvbnRleHREZXN0cm95KGNvbik7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQ29udGV4dER1bXAoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGJpdHMpCituQ29udGV4dER1bXAoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGJpdHMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHREdW1wLCBjb24oJXApICBiaXRzKCVpKSIsIChSc0NvbnRleHQpY29uLCBiaXRzKTsKICAgICByc0NvbnRleHREdW1wKChSc0NvbnRleHQpY29uLCBiaXRzKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0UGF1c2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorbkNvbnRleHRQYXVzZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRQYXVzZSwgY29uKCVwKSIsIGNvbik7CiAgICAgcnNDb250ZXh0UGF1c2UoY29uKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0UmVzdW1lKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK25Db250ZXh0UmVzdW1lKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dFJlc3VtZSwgY29uKCVwKSIsIGNvbik7CiAgICAgcnNDb250ZXh0UmVzdW1lKGNvbik7CiB9CiAKIHN0YXRpYyBqaW50Ci1uQ29udGV4dEdldE1lc3NhZ2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50QXJyYXkgZGF0YSwgamJvb2xlYW4gd2FpdCkKK25Db250ZXh0R2V0TWVzc2FnZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnRBcnJheSBkYXRhLCBqYm9vbGVhbiB3YWl0KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRHZXRNZXNzYWdlLCBjb24oJXApLCBsZW4oJWkpIiwgY29uLCBsZW4pOwogICAgIGppbnQgKnB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CiAgICAgc2l6ZV90IHJlY2VpdmVMZW47CiAgICAgaW50IGlkID0gcnNDb250ZXh0R2V0TWVzc2FnZShjb24sIHB0ciwgJnJlY2VpdmVMZW4sIGxlbiAqIDQsIHdhaXQpOwogICAgIGlmICghaWQgJiYgcmVjZWl2ZUxlbikgewotICAgICAgICBMT0dFKCJtZXNzYWdlIHJlY2VpdmUgYnVmZmVyIHRvbyBzbWFsbC4gICVpIiwgcmVjZWl2ZUxlbik7CisgICAgICAgIExPR1YoIm1lc3NhZ2UgcmVjZWl2ZSBidWZmZXIgdG9vIHNtYWxsLiAgJWkiLCByZWNlaXZlTGVuKTsKKyAgICAgICAgKnB0ciA9IChqaW50KXJlY2VpdmVMZW47CiAgICAgfQogICAgIF9lbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGRhdGEsIHB0ciwgMCk7CiAgICAgcmV0dXJuIGlkOwogfQogCi1zdGF0aWMgdm9pZCBuQ29udGV4dEluaXRUb0NsaWVudChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCitzdGF0aWMgdm9pZCBuQ29udGV4dEluaXRUb0NsaWVudChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRJbml0VG9DbGllbnQsIGNvbiglcCkiLCBjb24pOwogICAgIHJzQ29udGV4dEluaXRUb0NsaWVudChjb24pOwogfQogCi1zdGF0aWMgdm9pZCBuQ29udGV4dERlaW5pdFRvQ2xpZW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK3N0YXRpYyB2b2lkIG5Db250ZXh0RGVpbml0VG9DbGllbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Db250ZXh0RGVpbml0VG9DbGllbnQsIGNvbiglcCkiLCBjb24pOwogICAgIHJzQ29udGV4dERlaW5pdFRvQ2xpZW50KGNvbik7CiB9CiAKIAogc3RhdGljIGppbnQKLW5FbGVtZW50Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB0eXBlLCBqaW50IGtpbmQsIGpib29sZWFuIG5vcm0sIGppbnQgc2l6ZSkKK25FbGVtZW50Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB0eXBlLCBqaW50IGtpbmQsIGpib29sZWFuIG5vcm0sIGppbnQgc2l6ZSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuRWxlbWVudENyZWF0ZSwgY29uKCVwKSwgdHlwZSglaSksIGtpbmQoJWkpLCBub3JtKCVpKSwgc2l6ZSglaSkiLCBjb24sIHR5cGUsIGtpbmQsIG5vcm0sIHNpemUpOwogICAgIHJldHVybiAoamludClyc0VsZW1lbnRDcmVhdGUoY29uLCAoUnNEYXRhVHlwZSl0eXBlLCAoUnNEYXRhS2luZClraW5kLCBub3JtLCBzaXplKTsKIH0KIAogc3RhdGljIGppbnQKLW5FbGVtZW50Q3JlYXRlMihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnRBcnJheSBfaWRzLCBqb2JqZWN0QXJyYXkgX25hbWVzKQorbkVsZW1lbnRDcmVhdGUyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludEFycmF5IF9pZHMsIGpvYmplY3RBcnJheSBfbmFtZXMpCiB7CiAgICAgaW50IGZpZWxkQ291bnQgPSBfZW52LT5HZXRBcnJheUxlbmd0aChfaWRzKTsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuRWxlbWVudENyZWF0ZTIsIGNvbiglcCkiLCBjb24pOwogCiAgICAgamludCAqaWRzID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhfaWRzLCBOVUxMKTsKQEAgLTI4OSwzMiArMjgxLDg1IEBACiAgICAgcmV0dXJuIChqaW50KWlkOwogfQogCitzdGF0aWMgdm9pZAorbkVsZW1lbnRHZXROYXRpdmVEYXRhKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBpZCwgamludEFycmF5IF9lbGVtZW50RGF0YSkKK3sKKyAgICBpbnQgZGF0YVNpemUgPSBfZW52LT5HZXRBcnJheUxlbmd0aChfZWxlbWVudERhdGEpOworICAgIExPR19BUEkoIm5FbGVtZW50R2V0TmF0aXZlRGF0YSwgY29uKCVwKSIsIGNvbik7CisKKyAgICAvLyB3ZSB3aWxsIHBhY2sgbVR5cGU7IG1LaW5kOyBtTm9ybWFsaXplZDsgbVZlY3RvclNpemU7IE51bVN1YkVsZW1lbnRzCisgICAgYXNzZXJ0KGRhdGFTaXplID09IDUpOworCisgICAgdWludDMyX3QgZWxlbWVudERhdGFbNV07CisgICAgcnNFbGVtZW50R2V0TmF0aXZlRGF0YShjb24sIChSc0VsZW1lbnQpaWQsIGVsZW1lbnREYXRhLCBkYXRhU2l6ZSk7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IGRhdGFTaXplOyBpICsrKSB7CisgICAgICAgIF9lbnYtPlNldEludEFycmF5UmVnaW9uKF9lbGVtZW50RGF0YSwgaSwgMSwgKGNvbnN0IGppbnQqKSZlbGVtZW50RGF0YVtpXSk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCituRWxlbWVudEdldFN1YkVsZW1lbnRzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBpZCwgamludEFycmF5IF9JRHMsIGpvYmplY3RBcnJheSBfbmFtZXMpCit7CisgICAgaW50IGRhdGFTaXplID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoX0lEcyk7CisgICAgTE9HX0FQSSgibkVsZW1lbnRHZXRTdWJFbGVtZW50cywgY29uKCVwKSIsIGNvbik7CisKKyAgICB1aW50MzJfdCAqaWRzID0gKHVpbnQzMl90ICopbWFsbG9jKCh1aW50MzJfdClkYXRhU2l6ZSAqIHNpemVvZih1aW50MzJfdCkpOworICAgIGNvbnN0IGNoYXIgKipuYW1lcyA9IChjb25zdCBjaGFyICoqKW1hbGxvYygodWludDMyX3QpZGF0YVNpemUgKiBzaXplb2YoY29uc3QgY2hhciAqKSk7CisKKyAgICByc0VsZW1lbnRHZXRTdWJFbGVtZW50cyhjb24sIChSc0VsZW1lbnQpaWQsIGlkcywgbmFtZXMsICh1aW50MzJfdClkYXRhU2l6ZSk7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IGRhdGFTaXplOyBpICsrKSB7CisgICAgICAgIF9lbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChfbmFtZXMsIGksIF9lbnYtPk5ld1N0cmluZ1VURihuYW1lc1tpXSkpOworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfSURzLCBpLCAxLCAoY29uc3QgamludCopJmlkc1tpXSk7CisgICAgfQorCisgICAgZnJlZShpZHMpOworICAgIGZyZWUobmFtZXMpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotblR5cGVCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgZUlEKQorblR5cGVCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZUlEKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5UeXBlQmVnaW4sIGNvbiglcCkgZSglcCkiLCBjb24sIChSc0VsZW1lbnQpZUlEKTsKICAgICByc1R5cGVCZWdpbihjb24sIChSc0VsZW1lbnQpZUlEKTsKIH0KIAogc3RhdGljIHZvaWQKLW5UeXBlQWRkKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBkaW0sIGppbnQgdmFsKQorblR5cGVBZGQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGRpbSwgamludCB2YWwpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblR5cGVBZGQsIGNvbiglcCkgZGltKCVpKSwgdmFsKCVpKSIsIGNvbiwgZGltLCB2YWwpOwogICAgIHJzVHlwZUFkZChjb24sIChSc0RpbWVuc2lvbilkaW0sIHZhbCk7CiB9CiAKIHN0YXRpYyBqaW50Ci1uVHlwZUNyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituVHlwZUNyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblR5cGVDcmVhdGUsIGNvbiglcCkiLCBjb24pOwogICAgIHJldHVybiAoamludClyc1R5cGVDcmVhdGUoY29uKTsKIH0KIAorc3RhdGljIHZvaWQKK25UeXBlR2V0TmF0aXZlRGF0YShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgaWQsIGppbnRBcnJheSBfdHlwZURhdGEpCit7CisgICAgLy8gV2UgYXJlIHBhY2tpbmcgNiBpdGVtczogbURpbVg7IG1EaW1ZOyBtRGltWjsKKyAgICAvLyBtRGltTE9EOyBtRGltRmFjZXM7IG1FbGVtZW50OyBpbnRvIHR5cGVEYXRhCisgICAgaW50IGVsZW1lbnRDb3VudCA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKF90eXBlRGF0YSk7CisKKyAgICBhc3NlcnQoZWxlbWVudENvdW50ID09IDYpOworICAgIExPR19BUEkoIm5UeXBlQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKKworICAgIHVpbnQzMl90IHR5cGVEYXRhWzZdOworICAgIHJzVHlwZUdldE5hdGl2ZURhdGEoY29uLCAoUnNUeXBlKWlkLCB0eXBlRGF0YSwgNik7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IGVsZW1lbnRDb3VudDsgaSArKykgeworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfdHlwZURhdGEsIGksIDEsIChjb25zdCBqaW50KikmdHlwZURhdGFbaV0pOworICAgIH0KK30KKwogc3RhdGljIHZvaWQgKiBTRl9Mb2FkSW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBfZmllbGQsIHZvaWQgKmJ1ZmZlcikKIHsKICAgICAoKGludDMyX3QgKilidWZmZXIpWzBdID0gX2Vudi0+R2V0SW50RmllbGQoX29iaiwgX2ZpZWxkKTsKQEAgLTM3OCw3ICs0MjMsNyBAQAogCiAvL3siblR5cGVGaW5hbERlc3Ryb3kiLCAgICAgICAgICAgICAgIihMYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZTspViIsICAgICAgICh2b2lkKiluVHlwZUZpbmFsRGVzdHJveSB9LAogc3RhdGljIHZvaWQKLW5UeXBlRmluYWxEZXN0cm95KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgam9iamVjdCBfdHlwZSkKK25UeXBlRmluYWxEZXN0cm95KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgam9iamVjdCBfdHlwZSkKIHsKICAgICBUeXBlQ2FjaGUgKnRjID0gKFR5cGVDYWNoZSAqKV9lbnYtPkdldEludEZpZWxkKF90eXBlLCBnVHlwZU5hdGl2ZUNhY2hlKTsKICAgICBmcmVlKHRjKTsKQEAgLTM4Niw3ICs0MzEsNyBAQAogCiAvLyBuYXRpdmUgdm9pZCBuVHlwZVNldHVwRmllbGRzKFR5cGUgdCwgaW50W10gdHlwZXMsIGludFtdIGJpdHMsIEZpZWxkW10gSURzKTsKIHN0YXRpYyB2b2lkCi1uVHlwZVNldHVwRmllbGRzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgam9iamVjdCBfdHlwZSwgamludEFycmF5IF90eXBlcywgamludEFycmF5IF9iaXRzLCBqb2JqZWN0QXJyYXkgX0lEcykKK25UeXBlU2V0dXBGaWVsZHMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqb2JqZWN0IF90eXBlLCBqaW50QXJyYXkgX3R5cGVzLCBqaW50QXJyYXkgX2JpdHMsIGpvYmplY3RBcnJheSBfSURzKQogewogICAgIGludCBmaWVsZENvdW50ID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoX3R5cGVzKTsKICAgICBzaXplX3Qgc3RydWN0U2l6ZSA9IHNpemVvZihUeXBlQ2FjaGUpICsgKHNpemVvZihUeXBlRmllbGRDYWNoZSkgKiAoZmllbGRDb3VudC0xKSk7CkBAIC00MzYsMjUgKzQ4MSwyMiBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIGppbnQKLW5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGUpCituQWxsb2NhdGlvbkNyZWF0ZVR5cGVkKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBlKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQsIGNvbiglcCksIGUoJXApIiwgY29uLCAoUnNFbGVtZW50KWUpOwogICAgIHJldHVybiAoamludCkgcnNBbGxvY2F0aW9uQ3JlYXRlVHlwZWQoY29uLCAoUnNFbGVtZW50KWUpOwogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25VcGxvYWRUb1RleHR1cmUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGEsIGpib29sZWFuIGdlbk1pcCwgamludCBtaXApCituQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYSwgamJvb2xlYW4gZ2VuTWlwLCBqaW50IG1pcCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZSwgY29uKCVwKSwgYSglcCksIGdlbk1pcCglaSksIG1pcCglaSkiLCBjb24sIChSc0FsbG9jYXRpb24pYSwgZ2VuTWlwLCBtaXApOwogICAgIHJzQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShjb24sIChSc0FsbG9jYXRpb24pYSwgZ2VuTWlwLCBtaXApOwogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYSkKK25BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdCwgY29uKCVwKSwgYSglcCkiLCBjb24sIChSc0FsbG9jYXRpb24pYSk7CiAgICAgcnNBbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QoY29uLCAoUnNBbGxvY2F0aW9uKWEpOwogfQpAQCAtNDgwLDkgKzUyMiw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgZHN0Rm10LCBqYm9vbGVhbiBnZW5NaXBzLCBqb2JqZWN0IGpiaXRtYXApCituQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGRzdEZtdCwgamJvb2xlYW4gZ2VuTWlwcywgam9iamVjdCBqYml0bWFwKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIFNrQml0bWFwIGNvbnN0ICogbmF0aXZlQml0bWFwID0KICAgICAgICAgICAgIChTa0JpdG1hcCBjb25zdCAqKV9lbnYtPkdldEludEZpZWxkKGpiaXRtYXAsIGdOYXRpdmVCaXRtYXBJRCk7CiAgICAgY29uc3QgU2tCaXRtYXAmIGJpdG1hcCgqbmF0aXZlQml0bWFwKTsKQEAgLTUwOCw5ICs1NDksOCBAQAogfQogCiBzdGF0aWMgaW50Ci1uQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgdHlwZSwgam9iamVjdCBqYml0bWFwKQorbkFsbG9jYXRpb25DcmVhdGVCaXRtYXBSZWYoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHR5cGUsIGpvYmplY3QgamJpdG1hcCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBTa0JpdG1hcCAqIG5hdGl2ZUJpdG1hcCA9CiAgICAgICAgICAgICAoU2tCaXRtYXAgKilfZW52LT5HZXRJbnRGaWVsZChqYml0bWFwLCBnTmF0aXZlQml0bWFwSUQpOwogCkBAIC01MjIsMTAgKzU2Miw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBkc3RGbXQsIGpib29sZWFuIGdlbk1pcHMsIGppbnQgbmF0aXZlX2Fzc2V0KQorbkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGRzdEZtdCwgamJvb2xlYW4gZ2VuTWlwcywgamludCBuYXRpdmVfYXNzZXQpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0KICAgICBBc3NldCogYXNzZXQgPSByZWludGVycHJldF9jYXN0PEFzc2V0Kj4obmF0aXZlX2Fzc2V0KTsKICAgICBTa0JpdG1hcCBiaXRtYXA7CiAgICAgU2tJbWFnZURlY29kZXI6OkRlY29kZU1lbW9yeShhc3NldC0+Z2V0QnVmZmVyKGZhbHNlKSwgYXNzZXQtPmdldExlbmd0aCgpLApAQCAtNTQ4LDkgKzU4Niw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBkc3RGbXQsIGpib29sZWFuIGdlbk1pcHMsIGpvYmplY3QgamJpdG1hcCkKK25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBkc3RGbXQsIGpib29sZWFuIGdlbk1pcHMsIGpvYmplY3QgamJpdG1hcCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBTa0JpdG1hcCBjb25zdCAqIG5hdGl2ZUJpdG1hcCA9CiAgICAgICAgICAgICAoU2tCaXRtYXAgY29uc3QgKilfZW52LT5HZXRJbnRGaWVsZChqYml0bWFwLCBnTmF0aXZlQml0bWFwSUQpOwogICAgIGNvbnN0IFNrQml0bWFwJiBiaXRtYXAoKm5hdGl2ZUJpdG1hcCk7CkBAIC01NzIsOSArNjA5LDggQEAKIAogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25TdWJEYXRhMURfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqaW50QXJyYXkgZGF0YSwgaW50IHNpemVCeXRlcykKK25BbGxvY2F0aW9uU3ViRGF0YTFEX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqaW50IG9mZnNldCwgamludCBjb3VudCwgamludEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvbjFEU3ViRGF0YV9pLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgb2Zmc2V0KCVpKSwgY291bnQoJWkpLCBsZW4oJWkpLCBzaXplQnl0ZXMoJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBvZmZzZXQsIGNvdW50LCBsZW4sIHNpemVCeXRlcyk7CiAgICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTU4Myw5ICs2MTksOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25TdWJEYXRhMURfcyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqc2hvcnRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQorbkFsbG9jYXRpb25TdWJEYXRhMURfcyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqc2hvcnRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb24xRFN1YkRhdGFfcywgY29uKCVwKSwgYWRhcHRlciglcCksIG9mZnNldCglaSksIGNvdW50KCVpKSwgbGVuKCVpKSwgc2l6ZUJ5dGVzKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgb2Zmc2V0LCBjb3VudCwgbGVuLCBzaXplQnl0ZXMpOwogICAgIGpzaG9ydCAqcHRyID0gX2Vudi0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNTk0LDkgKzYyOSw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YkRhdGExRF9iKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpieXRlQXJyYXkgZGF0YSwgaW50IHNpemVCeXRlcykKK25BbGxvY2F0aW9uU3ViRGF0YTFEX2IoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqaW50IG9mZnNldCwgamludCBjb3VudCwgamJ5dGVBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb24xRFN1YkRhdGFfYiwgY29uKCVwKSwgYWRhcHRlciglcCksIG9mZnNldCglaSksIGNvdW50KCVpKSwgbGVuKCVpKSwgc2l6ZUJ5dGVzKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgb2Zmc2V0LCBjb3VudCwgbGVuLCBzaXplQnl0ZXMpOwogICAgIGpieXRlICpwdHIgPSBfZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTYwNSw5ICs2MzksOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25TdWJEYXRhMURfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqZmxvYXRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQorbkFsbG9jYXRpb25TdWJEYXRhMURfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqZmxvYXRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb24xRFN1YkRhdGFfZiwgY29uKCVwKSwgYWRhcHRlciglcCksIG9mZnNldCglaSksIGNvdW50KCVpKSwgbGVuKCVpKSwgc2l6ZUJ5dGVzKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgb2Zmc2V0LCBjb3VudCwgbGVuLCBzaXplQnl0ZXMpOwogICAgIGpmbG9hdCAqcHRyID0gX2Vudi0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNjE2LDkgKzY0OSwxOSBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25TdWJEYXRhMkRfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGppbnQgeG9mZiwgamludCB5b2ZmLCBqaW50IHcsIGppbnQgaCwgamludEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCisvLyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uU3ViRWxlbWVudERhdGExRChpbnQgY29uLCBpbnQgaWQsIGludCB4b2ZmLCBpbnQgY29tcElkeCwgYnl0ZVtdIGQsIGludCBzaXplQnl0ZXMpOworbkFsbG9jYXRpb25TdWJFbGVtZW50RGF0YTFEKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY29tcElkeCwgamJ5dGVBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOworICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CisgICAgTE9HX0FQSSgibkFsbG9jYXRpb25TdWJFbGVtZW50RGF0YTFELCBjb24oJXApLCBhbGxvYyglcCksIG9mZnNldCglaSksIGNvbXAoJWkpLCBsZW4oJWkpLCBzaXplQnl0ZXMoJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBvZmZzZXQsIGNvbXBJZHgsIGxlbiwgc2l6ZUJ5dGVzKTsKKyAgICBqYnl0ZSAqcHRyID0gX2Vudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CisgICAgcnNBbGxvY2F0aW9uMURTdWJFbGVtZW50RGF0YShjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIG9mZnNldCwgcHRyLCBjb21wSWR4LCBzaXplQnl0ZXMpOworICAgIF9lbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBwdHIsIEpOSV9BQk9SVCk7Cit9CisKK3N0YXRpYyB2b2lkCituQWxsb2NhdGlvblN1YkRhdGEyRF9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqaW50QXJyYXkgZGF0YSwgaW50IHNpemVCeXRlcykKK3sKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uMkRTdWJEYXRhX2ksIGNvbiglcCksIGFkYXB0ZXIoJXApLCB4b2ZmKCVpKSwgeW9mZiglaSksIHcoJWkpLCBoKCVpKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgeG9mZiwgeW9mZiwgdywgaCwgbGVuKTsKICAgICBqaW50ICpwdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNjI3LDkgKzY3MCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YkRhdGEyRF9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqZmxvYXRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQorbkFsbG9jYXRpb25TdWJEYXRhMkRfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWxsb2MsIGppbnQgeG9mZiwgamludCB5b2ZmLCBqaW50IHcsIGppbnQgaCwgamZsb2F0QXJyYXkgZGF0YSwgaW50IHNpemVCeXRlcykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uMkRTdWJEYXRhX2ksIGNvbiglcCksIGFkYXB0ZXIoJXApLCB4b2ZmKCVpKSwgeW9mZiglaSksIHcoJWkpLCBoKCVpKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgeG9mZiwgeW9mZiwgdywgaCwgbGVuKTsKICAgICBqZmxvYXQgKnB0ciA9IF9lbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTYzOCw5ICs2ODAsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25SZWFkX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFsbG9jLCBqaW50QXJyYXkgZGF0YSkKK25BbGxvY2F0aW9uUmVhZF9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamludEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvblJlYWRfaSwgY29uKCVwKSwgYWxsb2MoJXApLCBsZW4oJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBsZW4pOwogICAgIGppbnQgKnB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC02NDksOSArNjkwLDggQEAKIH0KIAogc3RhdGljIHZvaWQKLW5BbGxvY2F0aW9uUmVhZF9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamZsb2F0QXJyYXkgZGF0YSkKK25BbGxvY2F0aW9uUmVhZF9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamZsb2F0QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uUmVhZF9mLCBjb24oJXApLCBhbGxvYyglcCksIGxlbiglaSkiLCBjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIGxlbik7CiAgICAgamZsb2F0ICpwdHIgPSBfZW52LT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC02NjIsOSArNzAyLDggQEAKIAogLy97Im5BbGxvY2F0aW9uRGF0YUZyb21PYmplY3QiLCAgICAgICIoSUxhbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlO0xqYXZhL2xhbmcvT2JqZWN0OylWIiwgICAodm9pZCopbkFsbG9jYXRpb25EYXRhRnJvbU9iamVjdCB9LAogc3RhdGljIHZvaWQKLW5BbGxvY2F0aW9uU3ViRGF0YUZyb21PYmplY3QoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFsbG9jLCBqb2JqZWN0IF90eXBlLCBqaW50IG9mZnNldCwgam9iamVjdCBfbykKK25BbGxvY2F0aW9uU3ViRGF0YUZyb21PYmplY3QoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqb2JqZWN0IF90eXBlLCBqaW50IG9mZnNldCwgam9iamVjdCBfbykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvbkRhdGFGcm9tT2JqZWN0IGNvbiglcCksIGFsbG9jKCVwKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYyk7CiAKICAgICBjb25zdCBUeXBlQ2FjaGUgKnRjID0gKFR5cGVDYWNoZSAqKV9lbnYtPkdldEludEZpZWxkKF90eXBlLCBnVHlwZU5hdGl2ZUNhY2hlKTsKQEAgLTY4MCw5ICs3MTksOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25TdWJSZWFkRnJvbU9iamVjdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGpvYmplY3QgX3R5cGUsIGppbnQgb2Zmc2V0LCBqb2JqZWN0IF9vKQorbkFsbG9jYXRpb25TdWJSZWFkRnJvbU9iamVjdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWxsb2MsIGpvYmplY3QgX3R5cGUsIGppbnQgb2Zmc2V0LCBqb2JqZWN0IF9vKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uUmVhZEZyb21PYmplY3QgY29uKCVwKSwgYWxsb2MoJXApIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKIAogICAgIGFzc2VydChvZmZzZXQgPT0gMCk7CkBAIC03MDAsMjkgKzczOCw4OSBAQAogICAgIGZyZWUoYnVmQWxsb2MpOwogfQogCitzdGF0aWMgamludAorbkFsbG9jYXRpb25HZXRUeXBlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhKQoreworICAgIExPR19BUEkoIm5BbGxvY2F0aW9uR2V0VHlwZSwgY29uKCVwKSwgYSglcCkiLCBjb24sIChSc0FsbG9jYXRpb24pYSk7CisgICAgcmV0dXJuIChqaW50KSByc0FsbG9jYXRpb25HZXRUeXBlKGNvbiwgKFJzQWxsb2NhdGlvbilhKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludAorbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG5hdGl2ZV9hc3NldCkKK3sKKyAgICBMT0dWKCJfX19fX19uRmlsZUEzRCAldSIsICh1aW50MzJfdCkgbmF0aXZlX2Fzc2V0KTsKKworICAgIEFzc2V0KiBhc3NldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8QXNzZXQqPihuYXRpdmVfYXNzZXQpOworCisgICAgamludCBpZCA9IChqaW50KXJzRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShjb24sIGFzc2V0LT5nZXRCdWZmZXIoZmFsc2UpLCBhc3NldC0+Z2V0TGVuZ3RoKCkpOworICAgIHJldHVybiBpZDsKK30KKworc3RhdGljIGludAorbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGZpbGVBM0QpCit7CisgICAgaW50MzJfdCBudW1FbnRyaWVzID0gMDsKKyAgICByc0ZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoY29uLCAmbnVtRW50cmllcywgKFJzRmlsZSlmaWxlQTNEKTsKKyAgICByZXR1cm4gbnVtRW50cmllczsKK30KKworc3RhdGljIHZvaWQKK25GaWxlQTNER2V0SW5kZXhFbnRyaWVzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBmaWxlQTNELCBqaW50IG51bUVudHJpZXMsIGppbnRBcnJheSBfaWRzLCBqb2JqZWN0QXJyYXkgX2VudHJpZXMpCit7CisgICAgTE9HVigiX19fX19fbkZpbGVBM0QgJXUiLCAodWludDMyX3QpIGZpbGVBM0QpOworICAgIFJzRmlsZUluZGV4RW50cnkgKmZpbGVFbnRyaWVzID0gKFJzRmlsZUluZGV4RW50cnkqKW1hbGxvYygodWludDMyX3QpbnVtRW50cmllcyAqIHNpemVvZihSc0ZpbGVJbmRleEVudHJ5KSk7CisKKyAgICByc0ZpbGVBM0RHZXRJbmRleEVudHJpZXMoY29uLCBmaWxlRW50cmllcywgKHVpbnQzMl90KW51bUVudHJpZXMsIChSc0ZpbGUpZmlsZUEzRCk7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IG51bUVudHJpZXM7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KF9lbnRyaWVzLCBpLCBfZW52LT5OZXdTdHJpbmdVVEYoZmlsZUVudHJpZXNbaV0ub2JqZWN0TmFtZSkpOworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfaWRzLCBpLCAxLCAoY29uc3QgamludCopJmZpbGVFbnRyaWVzW2ldLmNsYXNzSUQpOworICAgIH0KKworICAgIGZyZWUoZmlsZUVudHJpZXMpOworfQorCitzdGF0aWMgaW50CituRmlsZUEzREdldEVudHJ5QnlJbmRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZmlsZUEzRCwgamludCBpbmRleCkKK3sKKyAgICBMT0dWKCJfX19fX19uRmlsZUEzRCAldSIsICh1aW50MzJfdCkgZmlsZUEzRCk7CisgICAgamludCBpZCA9IChqaW50KXJzRmlsZUEzREdldEVudHJ5QnlJbmRleChjb24sICh1aW50MzJfdClpbmRleCwgKFJzRmlsZSlmaWxlQTNEKTsKKyAgICByZXR1cm4gaWQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQKK25Gb250Q3JlYXRlRnJvbUZpbGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqc3RyaW5nIGZpbGVOYW1lLCBqaW50IGZvbnRTaXplLCBqaW50IGRwaSkKK3sKKyAgICBjb25zdCBjaGFyKiBmaWxlTmFtZVVURiA9IF9lbnYtPkdldFN0cmluZ1VURkNoYXJzKGZpbGVOYW1lLCBOVUxMKTsKKworICAgIGppbnQgaWQgPSAoamludClyc0ZvbnRDcmVhdGVGcm9tRmlsZShjb24sIGZpbGVOYW1lVVRGLCBmb250U2l6ZSwgZHBpKTsKKyAgICByZXR1cm4gaWQ7Cit9CisKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5BZGFwdGVyMURCaW5kQWxsb2NhdGlvbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCBhbGxvYykKK25BZGFwdGVyMURCaW5kQWxsb2NhdGlvbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCBhbGxvYykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFEQmluZEFsbG9jYXRpb24sIGNvbiglcCksIGFkYXB0ZXIoJXApLCBhbGxvYyglcCkiLCBjb24sIChSc0FkYXB0ZXIxRClhZGFwdGVyLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKICAgICByc0FkYXB0ZXIxREJpbmRBbGxvY2F0aW9uKGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIChSc0FsbG9jYXRpb24pYWxsb2MpOwogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIxRFNldENvbnN0cmFpbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFkYXB0ZXIsIGppbnQgZGltLCBqaW50IHZhbHVlKQorbkFkYXB0ZXIxRFNldENvbnN0cmFpbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFkYXB0ZXIsIGppbnQgZGltLCBqaW50IHZhbHVlKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMURTZXRDb25zdHJhaW50LCBjb24oJXApLCBhZGFwdGVyKCVwKSwgZGltKCVpKSwgdmFsdWUoJWkpIiwgY29uLCAoUnNBZGFwdGVyMUQpYWRhcHRlciwgZGltLCB2YWx1ZSk7CiAgICAgcnNBZGFwdGVyMURTZXRDb25zdHJhaW50KGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIChSc0RpbWVuc2lvbilkaW0sIHZhbHVlKTsKIH0KIAogc3RhdGljIHZvaWQKLW5BZGFwdGVyMUREYXRhX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFkYXB0ZXIsIGppbnRBcnJheSBkYXRhKQorbkFkYXB0ZXIxRERhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFERGF0YV9pLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIGxlbik7CiAgICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTczMSw5ICs4MjksOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIxRFN1YkRhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCBvZmZzZXQsIGppbnQgY291bnQsIGppbnRBcnJheSBkYXRhKQorbkFkYXB0ZXIxRFN1YkRhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCBvZmZzZXQsIGppbnQgY291bnQsIGppbnRBcnJheSBkYXRhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIxRFN1YkRhdGFfaSwgY29uKCVwKSwgYWRhcHRlciglcCksIG9mZnNldCglaSksIGNvdW50KCVpKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIG9mZnNldCwgY291bnQsIGxlbik7CiAgICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTc0Miw5ICs4MzksOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIxRERhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamZsb2F0QXJyYXkgZGF0YSkKK25BZGFwdGVyMUREYXRhX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFkYXB0ZXIsIGpmbG9hdEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFERGF0YV9mLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIGxlbik7CiAgICAgamZsb2F0ICpwdHIgPSBfZW52LT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC03NTMsOSArODQ5LDggQEAKIH0KIAogc3RhdGljIHZvaWQKLW5BZGFwdGVyMURTdWJEYXRhX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFkYXB0ZXIsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqZmxvYXRBcnJheSBkYXRhKQorbkFkYXB0ZXIxRFN1YkRhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpmbG9hdEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFEU3ViRGF0YV9mLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgb2Zmc2V0KCVpKSwgY291bnQoJWkpLCBsZW4oJWkpIiwgY29uLCAoUnNBZGFwdGVyMUQpYWRhcHRlciwgb2Zmc2V0LCBjb3VudCwgbGVuKTsKICAgICBqZmxvYXQgKnB0ciA9IF9lbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTc2NCw5ICs4NTksOCBAQAogfQogCiBzdGF0aWMgamludAotbkFkYXB0ZXIxRENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituQWRhcHRlcjFEQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFEQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKICAgICByZXR1cm4gKGppbnQpcnNBZGFwdGVyMURDcmVhdGUoY29uKTsKIH0KQEAgLTc3NCwyNSArODY4LDIyIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqaW50IGFsbG9jKQorbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50IGFsbG9jKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbiwgY29uKCVwKSwgYWRhcHRlciglcCksIGFsbG9jKCVwKSIsIGNvbiwgKFJzQWRhcHRlcjJEKWFkYXB0ZXIsIChSc0FsbG9jYXRpb24pYWxsb2MpOwogICAgIHJzQWRhcHRlcjJEQmluZEFsbG9jYXRpb24oY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgKFJzQWxsb2NhdGlvbilhbGxvYyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjJEU2V0Q29uc3RyYWludChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCBkaW0sIGppbnQgdmFsdWUpCituQWRhcHRlcjJEU2V0Q29uc3RyYWludChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCBkaW0sIGppbnQgdmFsdWUpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIyRFNldENvbnN0cmFpbnQsIGNvbiglcCksIGFkYXB0ZXIoJXApLCBkaW0oJWkpLCB2YWx1ZSglaSkiLCBjb24sIChSc0FkYXB0ZXIyRClhZGFwdGVyLCBkaW0sIHZhbHVlKTsKICAgICByc0FkYXB0ZXIyRFNldENvbnN0cmFpbnQoY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgKFJzRGltZW5zaW9uKWRpbSwgdmFsdWUpOwogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIyRERhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludEFycmF5IGRhdGEpCituQWRhcHRlcjJERGF0YV9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMkREYXRhX2ksIGNvbiglcCksIGFkYXB0ZXIoJXApLCBsZW4oJWkpIiwgY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgbGVuKTsKICAgICBqaW50ICpwdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtODAxLDkgKzg5Miw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjJERGF0YV9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqZmxvYXRBcnJheSBkYXRhKQorbkFkYXB0ZXIyRERhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamZsb2F0QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMkREYXRhX2YsIGNvbiglcCksIGFkYXB0ZXIoJXApLCBsZW4oJWkpIiwgY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgbGVuKTsKICAgICBqZmxvYXQgKnB0ciA9IF9lbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTgxMiw5ICs5MDIsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIyRFN1YkRhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqaW50QXJyYXkgZGF0YSkKK25BZGFwdGVyMkRTdWJEYXRhX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFkYXB0ZXIsIGppbnQgeG9mZiwgamludCB5b2ZmLCBqaW50IHcsIGppbnQgaCwgamludEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjJEU3ViRGF0YV9pLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgeG9mZiglaSksIHlvZmYoJWkpLCB3KCVpKSwgaCglaSksIGxlbiglaSkiLAogICAgICAgICAgICAgY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgeG9mZiwgeW9mZiwgdywgaCwgbGVuKTsKQEAgLTgyNCw5ICs5MTMsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIyRFN1YkRhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqZmxvYXRBcnJheSBkYXRhKQorbkFkYXB0ZXIyRFN1YkRhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqZmxvYXRBcnJheSBkYXRhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIyRFN1YkRhdGFfZiwgY29uKCVwKSwgYWRhcHRlciglcCksIHhvZmYoJWkpLCB5b2ZmKCVpKSwgdyglaSksIGgoJWkpLCBsZW4oJWkpIiwKICAgICAgICAgICAgIGNvbiwgKFJzQWRhcHRlcjJEKWFkYXB0ZXIsIHhvZmYsIHlvZmYsIHcsIGgsIGxlbik7CkBAIC04MzYsOSArOTI0LDggQEAKIH0KIAogc3RhdGljIGppbnQKLW5BZGFwdGVyMkRDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorbkFkYXB0ZXIyRENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIyRENyZWF0ZSwgY29uKCVwKSIsIGNvbik7CiAgICAgcmV0dXJuIChqaW50KXJzQWRhcHRlcjJEQ3JlYXRlKGNvbik7CiB9CkBAIC04NDYsNDEgKzkzMyw0MCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRCaW5kQWxsb2NhdGlvbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqaW50IGFsbG9jLCBqaW50IHNsb3QpCituU2NyaXB0QmluZEFsbG9jYXRpb24oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHNjcmlwdCwgamludCBhbGxvYywgamludCBzbG90KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5TY3JpcHRCaW5kQWxsb2NhdGlvbiwgY29uKCVwKSwgc2NyaXB0KCVwKSwgYWxsb2MoJXApLCBzbG90KCVpKSIsIGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgKFJzQWxsb2NhdGlvbilhbGxvYywgc2xvdCk7CiAgICAgcnNTY3JpcHRCaW5kQWxsb2NhdGlvbihjb24sIChSc1NjcmlwdClzY3JpcHQsIChSc0FsbG9jYXRpb24pYWxsb2MsIHNsb3QpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldENsZWFyQ29sb3IoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCwgamZsb2F0IHIsIGpmbG9hdCBnLCBqZmxvYXQgYiwgamZsb2F0IGEpCituU2NyaXB0U2V0VmFySShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGppbnQgdmFsKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5TY3JpcHRTZXRDbGVhckNvbG9yLCBjb24oJXApLCBzKCVwKSwgciglZiksIGcoJWYpLCBiKCVmKSwgYSglZikiLCBjb24sICh2b2lkICopc2NyaXB0LCByLCBnLCBiLCBhKTsKLSAgICByc1NjcmlwdFNldENsZWFyQ29sb3IoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCByLCBnLCBiLCBhKTsKKyAgICBMT0dfQVBJKCJuU2NyaXB0U2V0VmFySSwgY29uKCVwKSwgcyglcCksIHNsb3QoJWkpLCB2YWwoJWkpLCBiKCVmKSwgYSglZikiLCBjb24sICh2b2lkICopc2NyaXB0LCBzbG90LCB2YWwpOworICAgIHJzU2NyaXB0U2V0VmFySShjb24sIChSc1NjcmlwdClzY3JpcHQsIHNsb3QsIHZhbCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uU2NyaXB0U2V0Q2xlYXJEZXB0aChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqZmxvYXQgZCkKK25TY3JpcHRTZXRWYXJGKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBzY3JpcHQsIGppbnQgc2xvdCwgZmxvYXQgdmFsKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5TY3JpcHRDU2V0Q2xlYXJEZXB0aCwgY29uKCVwKSwgcyglcCksIGRlcHRoKCVmKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIGQpOwotICAgIHJzU2NyaXB0U2V0Q2xlYXJEZXB0aChjb24sIChSc1NjcmlwdClzY3JpcHQsIGQpOworICAgIExPR19BUEkoIm5TY3JpcHRTZXRWYXJJLCBjb24oJXApLCBzKCVwKSwgc2xvdCglaSksIHZhbCglaSksIGIoJWYpLCBhKCVmKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIHNsb3QsIHZhbCk7CisgICAgcnNTY3JpcHRTZXRWYXJGKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc2xvdCwgdmFsKTsKIH0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRTZXRDbGVhclN0ZW5jaWwoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCwgamludCBzdGVuY2lsKQorblNjcmlwdFNldFZhclYoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHNjcmlwdCwgamludCBzbG90LCBqYnl0ZUFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdENTZXRDbGVhclN0ZW5jaWwsIGNvbiglcCksIHMoJXApLCBzdGVuY2lsKCVpKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIHN0ZW5jaWwpOwotICAgIHJzU2NyaXB0U2V0Q2xlYXJTdGVuY2lsKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc3RlbmNpbCk7CisgICAgTE9HX0FQSSgiblNjcmlwdFNldFZhclYsIGNvbiglcCksIHMoJXApLCBzbG90KCVpKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIHNsb3QpOworICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CisgICAgamJ5dGUgKnB0ciA9IF9lbnYtPkdldEJ5dGVBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOworICAgIHJzU2NyaXB0U2V0VmFyVihjb24sIChSc1NjcmlwdClzY3JpcHQsIHNsb3QsIHB0ciwgbGVuKTsKKyAgICBfZW52LT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZGF0YSwgcHRyLCBKTklfQUJPUlQpOwogfQogCisKIHN0YXRpYyB2b2lkCi1uU2NyaXB0U2V0VGltZVpvbmUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCwgamJ5dGVBcnJheSB0aW1lWm9uZSkKK25TY3JpcHRTZXRUaW1lWm9uZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqYnl0ZUFycmF5IHRpbWVab25lKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5TY3JpcHRDU2V0VGltZVpvbmUsIGNvbiglcCksIHMoJXApLCB0aW1lWm9uZSglcykiLCBjb24sICh2b2lkICopc2NyaXB0LCAoY29uc3QgY2hhciAqKXRpbWVab25lKTsKIAogICAgIGppbnQgbGVuZ3RoID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgodGltZVpvbmUpOwpAQCAtODk1LDY2ICs5ODEsMzYgQEAKIH0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRTZXRUeXBlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB0eXBlLCBqYm9vbGVhbiB3cml0YWJsZSwganN0cmluZyBfc3RyLCBqaW50IHNsb3QpCituU2NyaXB0SW52b2tlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBvYmosIGppbnQgc2xvdCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q0FkZFR5cGUsIGNvbiglcCksIHR5cGUoJXApLCB3cml0YWJsZSglaSksIHNsb3QoJWkpIiwgY29uLCAoUnNUeXBlKXR5cGUsIHdyaXRhYmxlLCBzbG90KTsKLSAgICBjb25zdCBjaGFyKiBuID0gTlVMTDsKLSAgICBpZiAoX3N0cikgewotICAgICAgICBuID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMoX3N0ciwgTlVMTCk7Ci0gICAgfQotICAgIHJzU2NyaXB0U2V0VHlwZShjb24sIChSc1R5cGUpdHlwZSwgc2xvdCwgd3JpdGFibGUsIG4pOwotICAgIGlmIChuKSB7Ci0gICAgICAgIF9lbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhfc3RyLCBuKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1uU2NyaXB0U2V0SW52b2tlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywganN0cmluZyBfc3RyLCBqaW50IHNsb3QpCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdFNldEludm9rZSwgY29uKCVwKSIsIGNvbik7Ci0gICAgY29uc3QgY2hhciogbiA9IE5VTEw7Ci0gICAgaWYgKF9zdHIpIHsKLSAgICAgICAgbiA9IF9lbnYtPkdldFN0cmluZ1VURkNoYXJzKF9zdHIsIE5VTEwpOwotICAgIH0KLSAgICByc1NjcmlwdFNldEludm9rZShjb24sIG4sIHNsb3QpOwotICAgIGlmIChuKSB7Ci0gICAgICAgIF9lbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhfc3RyLCBuKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1uU2NyaXB0SW52b2tlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBvYmosIGppbnQgc2xvdCkKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuU2NyaXB0SW52b2tlLCBjb24oJXApLCBzY3JpcHQoJXApIiwgY29uLCAodm9pZCAqKW9iaik7CiAgICAgcnNTY3JpcHRJbnZva2UoY29uLCAoUnNTY3JpcHQpb2JqLCBzbG90KTsKIH0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRTZXRSb290KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJvb2xlYW4gaXNSb290KQorblNjcmlwdEludm9rZVYoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHNjcmlwdCwgamludCBzbG90LCBqYnl0ZUFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdENTZXRSb290LCBjb24oJXApLCBpc1Jvb3QoJWkpIiwgY29uLCBpc1Jvb3QpOwotICAgIHJzU2NyaXB0U2V0Um9vdChjb24sIGlzUm9vdCk7CisgICAgTE9HX0FQSSgiblNjcmlwdEludm9rZVYsIGNvbiglcCksIHMoJXApLCBzbG90KCVpKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIHNsb3QpOworICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CisgICAgamJ5dGUgKnB0ciA9IF9lbnYtPkdldEJ5dGVBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOworICAgIHJzU2NyaXB0SW52b2tlVihjb24sIChSc1NjcmlwdClzY3JpcHQsIHNsb3QsIHB0ciwgbGVuKTsKKyAgICBfZW52LT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZGF0YSwgcHRyLCBKTklfQUJPUlQpOwogfQogCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyB2b2lkCi1uU2NyaXB0Q0JlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK25TY3JpcHRDQmVnaW4oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5TY3JpcHRDQmVnaW4sIGNvbiglcCkiLCBjb24pOwogICAgIHJzU2NyaXB0Q0JlZ2luKGNvbik7CiB9CiAKIHN0YXRpYyB2b2lkCi1uU2NyaXB0Q1NldFNjcmlwdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpieXRlQXJyYXkgc2NyaXB0UmVmLAorblNjcmlwdENTZXRTY3JpcHQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqYnl0ZUFycmF5IHNjcmlwdFJlZiwKICAgICAgICAgICAgICAgICAgIGppbnQgb2Zmc2V0LCBqaW50IGxlbmd0aCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCIhISEgblNjcmlwdENTZXRTY3JpcHQsIGNvbiglcCkiLCBjb24pOwogICAgIGppbnQgX2V4Y2VwdGlvbiA9IDA7CiAgICAgamludCByZW1haW5pbmc7CkBAIC05OTUsMTE0ICsxMDUxLDgyIEBACiB9CiAKIHN0YXRpYyBqaW50Ci1uU2NyaXB0Q0NyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituU2NyaXB0Q0NyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblNjcmlwdENDcmVhdGUsIGNvbiglcCkiLCBjb24pOwogICAgIHJldHVybiAoamludClyc1NjcmlwdENDcmVhdGUoY29uKTsKIH0KIAotc3RhdGljIHZvaWQKLW5TY3JpcHRDQWRkRGVmaW5lSTMyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywganN0cmluZyBuYW1lLCBqaW50IHZhbHVlKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIGNvbnN0IGNoYXIqIG4gPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhuYW1lLCBOVUxMKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q0FkZERlZmluZUkzMiwgY29uKCVwKSBuYW1lKCVzKSB2YWx1ZSglZCkiLCBjb24sIG4sIHZhbHVlKTsKLSAgICByc1NjcmlwdENTZXREZWZpbmVJMzIoY29uLCBuLCB2YWx1ZSk7Ci0gICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKG5hbWUsIG4pOwotfQotCi1zdGF0aWMgdm9pZAotblNjcmlwdENBZGREZWZpbmVGKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywganN0cmluZyBuYW1lLCBqZmxvYXQgdmFsdWUpCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgY29uc3QgY2hhciogbiA9IF9lbnYtPkdldFN0cmluZ1VURkNoYXJzKG5hbWUsIE5VTEwpOwotICAgIExPR19BUEkoIm5TY3JpcHRDQWRkRGVmaW5lRiwgY29uKCVwKSBuYW1lKCVzKSB2YWx1ZSglZikiLCBjb24sIG4sIHZhbHVlKTsKLSAgICByc1NjcmlwdENTZXREZWZpbmVGKGNvbiwgbiwgdmFsdWUpOwotICAgIF9lbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhuYW1lLCBuKTsKLX0KLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgaW4sIGppbnQgb3V0KQorblByb2dyYW1TdG9yZUJlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBpbiwgamludCBvdXQpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4sIGNvbiglcCksIGluKCVwKSwgb3V0KCVwKSIsIGNvbiwgKFJzRWxlbWVudClpbiwgKFJzRWxlbWVudClvdXQpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbihjb24sIChSc0VsZW1lbnQpaW4sIChSc0VsZW1lbnQpb3V0KTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlQmVnaW4sIGNvbiglcCksIGluKCVwKSwgb3V0KCVwKSIsIGNvbiwgKFJzRWxlbWVudClpbiwgKFJzRWxlbWVudClvdXQpOworICAgIHJzUHJvZ3JhbVN0b3JlQmVnaW4oY29uLCAoUnNFbGVtZW50KWluLCAoUnNFbGVtZW50KW91dCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGZ1bmMpCituUHJvZ3JhbVN0b3JlRGVwdGhGdW5jKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBmdW5jKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYywgY29uKCVwKSwgZnVuYyglaSkiLCBjb24sIGZ1bmMpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMoY29uLCAoUnNEZXB0aEZ1bmMpZnVuYyk7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZURlcHRoRnVuYywgY29uKCVwKSwgZnVuYyglaSkiLCBjb24sIGZ1bmMpOworICAgIHJzUHJvZ3JhbVN0b3JlRGVwdGhGdW5jKGNvbiwgKFJzRGVwdGhGdW5jKWZ1bmMpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJvb2xlYW4gZW5hYmxlKQorblByb2dyYW1TdG9yZURlcHRoTWFzayhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGpib29sZWFuIGVuYWJsZSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2ssIGNvbiglcCksIGVuYWJsZSglaSkiLCBjb24sIGVuYWJsZSk7Ci0gICAgcnNQcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayhjb24sIGVuYWJsZSk7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZURlcHRoTWFzaywgY29uKCVwKSwgZW5hYmxlKCVpKSIsIGNvbiwgZW5hYmxlKTsKKyAgICByc1Byb2dyYW1TdG9yZURlcHRoTWFzayhjb24sIGVuYWJsZSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiByLCBqYm9vbGVhbiBnLCBqYm9vbGVhbiBiLCBqYm9vbGVhbiBhKQorblByb2dyYW1TdG9yZUNvbG9yTWFzayhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGpib29sZWFuIHIsIGpib29sZWFuIGcsIGpib29sZWFuIGIsIGpib29sZWFuIGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrLCBjb24oJXApLCByKCVpKSwgZyglaSksIGIoJWkpLCBhKCVpKSIsIGNvbiwgciwgZywgYiwgYSk7Ci0gICAgcnNQcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayhjb24sIHIsIGcsIGIsIGEpOworICAgIExPR19BUEkoIm5Qcm9ncmFtU3RvcmVDb2xvck1hc2ssIGNvbiglcCksIHIoJWkpLCBnKCVpKSwgYiglaSksIGEoJWkpIiwgY29uLCByLCBnLCBiLCBhKTsKKyAgICByc1Byb2dyYW1TdG9yZUNvbG9yTWFzayhjb24sIHIsIGcsIGIsIGEpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgaW50IHNyYywgaW50IGRzdCkKK25Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBpbnQgc3JjLCBpbnQgZHN0KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYywgY29uKCVwKSwgc3JjKCVpKSwgZHN0KCVpKSIsIGNvbiwgc3JjLCBkc3QpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMoY29uLCAoUnNCbGVuZFNyY0Z1bmMpc3JjLCAoUnNCbGVuZERzdEZ1bmMpZHN0KTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlQmxlbmRGdW5jLCBjb24oJXApLCBzcmMoJWkpLCBkc3QoJWkpIiwgY29uLCBzcmMsIGRzdCk7CisgICAgcnNQcm9ncmFtU3RvcmVCbGVuZEZ1bmMoY29uLCAoUnNCbGVuZFNyY0Z1bmMpc3JjLCAoUnNCbGVuZERzdEZ1bmMpZHN0KTsKIH0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIGVuYWJsZSkKK25Qcm9ncmFtU3RvcmVEaXRoZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqYm9vbGVhbiBlbmFibGUpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyLCBjb24oJXApLCBlbmFibGUoJWkpIiwgY29uLCBlbmFibGUpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoY29uLCBlbmFibGUpOworICAgIExPR19BUEkoIm5Qcm9ncmFtU3RvcmVEaXRoZXIsIGNvbiglcCksIGVuYWJsZSglaSkiLCBjb24sIGVuYWJsZSk7CisgICAgcnNQcm9ncmFtU3RvcmVEaXRoZXIoY29uLCBlbmFibGUpOwogfQogCiBzdGF0aWMgamludAotblByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK25Qcm9ncmFtU3RvcmVDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZSwgY29uKCVwKSIsIGNvbik7Ci0KLSAgICByZXR1cm4gKGppbnQpcnNQcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZShjb24pOworICAgIExPR19BUEkoIm5Qcm9ncmFtU3RvcmVDcmVhdGUsIGNvbiglcCkiLCBjb24pOworICAgIHJldHVybiAoamludClyc1Byb2dyYW1TdG9yZUNyZWF0ZShjb24pOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtQmluZENvbnN0YW50cyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgdnB2LCBqaW50IHNsb3QsIGppbnQgYSkKK25Qcm9ncmFtQmluZENvbnN0YW50cyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgdnB2LCBqaW50IHNsb3QsIGppbnQgYSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuUHJvZ3JhbUJpbmRDb25zdGFudHMsIGNvbiglcCksIHZwZiglcCksIHNsb2F0KCVpKSwgYSglcCkiLCBjb24sIChSc1Byb2dyYW1WZXJ0ZXgpdnB2LCBzbG90LCAoUnNBbGxvY2F0aW9uKWEpOwogICAgIHJzUHJvZ3JhbUJpbmRDb25zdGFudHMoY29uLCAoUnNQcm9ncmFtKXZwdiwgc2xvdCwgKFJzQWxsb2NhdGlvbilhKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtQmluZFRleHR1cmUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHZwZiwgamludCBzbG90LCBqaW50IGEpCituUHJvZ3JhbUJpbmRUZXh0dXJlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB2cGYsIGppbnQgc2xvdCwgamludCBhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Qcm9ncmFtQmluZFRleHR1cmUsIGNvbiglcCksIHZwZiglcCksIHNsb3QoJWkpLCBhKCVwKSIsIGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50KXZwZiwgc2xvdCwgKFJzQWxsb2NhdGlvbilhKTsKICAgICByc1Byb2dyYW1CaW5kVGV4dHVyZShjb24sIChSc1Byb2dyYW1GcmFnbWVudCl2cGYsIHNsb3QsIChSc0FsbG9jYXRpb24pYSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUJpbmRTYW1wbGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB2cGYsIGppbnQgc2xvdCwgamludCBhKQorblByb2dyYW1CaW5kU2FtcGxlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgdnBmLCBqaW50IHNsb3QsIGppbnQgYSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuUHJvZ3JhbUJpbmRTYW1wbGVyLCBjb24oJXApLCB2cGYoJXApLCBzbG90KCVpKSwgYSglcCkiLCBjb24sIChSc1Byb2dyYW1GcmFnbWVudCl2cGYsIHNsb3QsIChSc1NhbXBsZXIpYSk7CiAgICAgcnNQcm9ncmFtQmluZFNhbXBsZXIoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnBmLCBzbG90LCAoUnNTYW1wbGVyKWEpOwogfQpAQCAtMTExMCw5ICsxMTM0LDggQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgamludAotblByb2dyYW1GcmFnbWVudENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnRBcnJheSBwYXJhbXMpCituUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludEFycmF5IHBhcmFtcykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50ICpwYXJhbVB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMocGFyYW1zLCBOVUxMKTsKICAgICBqaW50IHBhcmFtTGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgocGFyYW1zKTsKIApAQCAtMTEyNCw5ICsxMTQ3LDggQEAKIH0KIAogc3RhdGljIGppbnQKLW5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywganN0cmluZyBzaGFkZXIsIGppbnRBcnJheSBwYXJhbXMpCituUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGpzdHJpbmcgc2hhZGVyLCBqaW50QXJyYXkgcGFyYW1zKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGNvbnN0IGNoYXIqIHNoYWRlclVURiA9IF9lbnYtPkdldFN0cmluZ1VURkNoYXJzKHNoYWRlciwgTlVMTCk7CiAgICAgamludCBzaGFkZXJMZW4gPSBfZW52LT5HZXRTdHJpbmdVVEZMZW5ndGgoc2hhZGVyKTsKICAgICBqaW50ICpwYXJhbVB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMocGFyYW1zLCBOVUxMKTsKQEAgLTExNDQsMTcgKzExNjYsMTUgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgamludAotblByb2dyYW1WZXJ0ZXhDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiB0ZXhNYXQpCituUHJvZ3JhbVZlcnRleENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGpib29sZWFuIHRleE1hdCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuUHJvZ3JhbVZlcnRleENyZWF0ZSwgY29uKCVwKSwgdGV4TWF0KCVpKSIsIGNvbiwgdGV4TWF0KTsKICAgICByZXR1cm4gKGppbnQpcnNQcm9ncmFtVmVydGV4Q3JlYXRlKGNvbiwgdGV4TWF0KTsKIH0KIAogc3RhdGljIGppbnQKLW5Qcm9ncmFtVmVydGV4Q3JlYXRlMihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpzdHJpbmcgc2hhZGVyLCBqaW50QXJyYXkgcGFyYW1zKQorblByb2dyYW1WZXJ0ZXhDcmVhdGUyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwganN0cmluZyBzaGFkZXIsIGppbnRBcnJheSBwYXJhbXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgY29uc3QgY2hhciogc2hhZGVyVVRGID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc2hhZGVyLCBOVUxMKTsKICAgICBqaW50IHNoYWRlckxlbiA9IF9lbnYtPkdldFN0cmluZ1VURkxlbmd0aChzaGFkZXIpOwogICAgIGppbnQgKnBhcmFtUHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhwYXJhbXMsIE5VTEwpOwpAQCAtMTE3MSw3MCArMTE5MSw2MSBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyBqaW50Ci1uUHJvZ3JhbVJhc3RlckNyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgaW4sIGppbnQgb3V0LAotICAgICAgICAgICAgICAgICAgICAgamJvb2xlYW4gcG9pbnRTbW9vdGgsIGpib29sZWFuIGxpbmVTbW9vdGgsIGpib29sZWFuIHBvaW50U3ByaXRlKQorblByb2dyYW1SYXN0ZXJDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqYm9vbGVhbiBwb2ludFNtb290aCwgamJvb2xlYW4gbGluZVNtb290aCwgamJvb2xlYW4gcG9pbnRTcHJpdGUpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1SYXN0ZXJDcmVhdGUsIGNvbiglcCksIGluKCVwKSwgb3V0KCVwKSwgcG9pbnRTbW9vdGgoJWkpLCBsaW5lU21vb3RoKCVpKSwgcG9pbnRTcHJpdGUoJWkpIiwKLSAgICAgICAgICAgIGNvbiwgKFJzRWxlbWVudClpbiwgKFJzRWxlbWVudClvdXQsIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7Ci0gICAgcmV0dXJuIChqaW50KXJzUHJvZ3JhbVJhc3RlckNyZWF0ZShjb24sIChSc0VsZW1lbnQpaW4sIChSc0VsZW1lbnQpb3V0LCBwb2ludFNtb290aCwgbGluZVNtb290aCwgcG9pbnRTcHJpdGUpOworICAgIExPR19BUEkoIm5Qcm9ncmFtUmFzdGVyQ3JlYXRlLCBjb24oJXApLCBwb2ludFNtb290aCglaSksIGxpbmVTbW9vdGgoJWkpLCBwb2ludFNwcml0ZSglaSkiLAorICAgICAgICAgICAgY29uLCBwb2ludFNtb290aCwgbGluZVNtb290aCwgcG9pbnRTcHJpdGUpOworICAgIHJldHVybiAoamludClyc1Byb2dyYW1SYXN0ZXJDcmVhdGUoY29uLCBwb2ludFNtb290aCwgbGluZVNtb290aCwgcG9pbnRTcHJpdGUpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHZwciwgamZsb2F0IHYpCituUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgdnByLCBqZmxvYXQgdikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZSwgY29uKCVwKSwgdnBmKCVwKSwgdmFsdWUoJWYpIiwgY29uLCAoUnNQcm9ncmFtUmFzdGVyKXZwciwgdik7Ci0gICAgcnNQcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplKGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50KXZwciwgdik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1uUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgdnByLCBqZmxvYXQgdikKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aCwgY29uKCVwKSwgdnBmKCVwKSwgdmFsdWUoJWYpIiwgY29uLCAoUnNQcm9ncmFtUmFzdGVyKXZwciwgdik7Ci0gICAgcnNQcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50KXZwciwgdik7CisgICAgcnNQcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKGNvbiwgKFJzUHJvZ3JhbVJhc3Rlcil2cHIsIHYpOworfQorCitzdGF0aWMgdm9pZAorblByb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgdnByLCBqaW50IHYpCit7CisgICAgTE9HX0FQSSgiblByb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZSwgY29uKCVwKSwgdnBmKCVwKSwgdmFsdWUoJWkpIiwgY29uLCAoUnNQcm9ncmFtUmFzdGVyKXZwciwgdik7CisgICAgcnNQcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUoY29uLCAoUnNQcm9ncmFtUmFzdGVyKXZwciwgKFJzQ3VsbE1vZGUpdik7CiB9CiAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyB2b2lkCi1uQ29udGV4dEJpbmRSb290U2NyaXB0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBzY3JpcHQpCituQ29udGV4dEJpbmRSb290U2NyaXB0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBzY3JpcHQpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRCaW5kUm9vdFNjcmlwdCwgY29uKCVwKSwgc2NyaXB0KCVwKSIsIGNvbiwgKFJzU2NyaXB0KXNjcmlwdCk7CiAgICAgcnNDb250ZXh0QmluZFJvb3RTY3JpcHQoY29uLCAoUnNTY3JpcHQpc2NyaXB0KTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBwZnMpCituQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHBmcykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSwgY29uKCVwKSwgcGZzKCVwKSIsIGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50U3RvcmUpcGZzKTsKLSAgICByc0NvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSlwZnMpOworICAgIExPR19BUEkoIm5Db250ZXh0QmluZFByb2dyYW1TdG9yZSwgY29uKCVwKSwgcGZzKCVwKSIsIGNvbiwgKFJzUHJvZ3JhbVN0b3JlKXBmcyk7CisgICAgcnNDb250ZXh0QmluZFByb2dyYW1TdG9yZShjb24sIChSc1Byb2dyYW1TdG9yZSlwZnMpOwogfQogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBwZikKK25Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgcGYpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50LCBjb24oJXApLCBwZiglcCkiLCBjb24sIChSc1Byb2dyYW1GcmFnbWVudClwZik7CiAgICAgcnNDb250ZXh0QmluZFByb2dyYW1GcmFnbWVudChjb24sIChSc1Byb2dyYW1GcmFnbWVudClwZik7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBwZikKK25Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHBmKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgsIGNvbiglcCksIHBmKCVwKSIsIGNvbiwgKFJzUHJvZ3JhbVZlcnRleClwZik7CiAgICAgcnNDb250ZXh0QmluZFByb2dyYW1WZXJ0ZXgoY29uLCAoUnNQcm9ncmFtVmVydGV4KXBmKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHBmKQorbkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgcGYpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlciwgY29uKCVwKSwgcGYoJXApIiwgY29uLCAoUnNQcm9ncmFtUmFzdGVyKXBmKTsKICAgICByc0NvbnRleHRCaW5kUHJvZ3JhbVJhc3Rlcihjb24sIChSc1Byb2dyYW1SYXN0ZXIpcGYpOwogfQpAQCAtMTI0MywxMDggKzEyNTQsMTAwIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5TYW1wbGVyQmVnaW4oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorblNhbXBsZXJCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblNhbXBsZXJCZWdpbiwgY29uKCVwKSIsIGNvbik7CiAgICAgcnNTYW1wbGVyQmVnaW4oY29uKTsKIH0KIAogc3RhdGljIHZvaWQKLW5TYW1wbGVyU2V0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBwLCBqaW50IHYpCituU2FtcGxlclNldChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgcCwgamludCB2KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5TYW1wbGVyU2V0LCBjb24oJXApLCBwYXJhbSglaSksIHZhbHVlKCVpKSIsIGNvbiwgcCwgdik7CiAgICAgcnNTYW1wbGVyU2V0KGNvbiwgKFJzU2FtcGxlclBhcmFtKXAsIChSc1NhbXBsZXJWYWx1ZSl2KTsKIH0KIAogc3RhdGljIGppbnQKLW5TYW1wbGVyQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK25TYW1wbGVyQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuU2FtcGxlckNyZWF0ZSwgY29uKCVwKSIsIGNvbik7CiAgICAgcmV0dXJuIChqaW50KXJzU2FtcGxlckNyZWF0ZShjb24pOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdGljIHZvaWQKLW5MaWdodEJlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuTGlnaHRCZWdpbiwgY29uKCVwKSIsIGNvbik7Ci0gICAgcnNMaWdodEJlZ2luKGNvbik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1uTGlnaHRTZXRJc01vbm8oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBpc01vbm8pCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkxpZ2h0U2V0SXNNb25vLCBjb24oJXApLCBpc01vbm8oJWkpIiwgY29uLCBpc01vbm8pOwotICAgIHJzTGlnaHRTZXRNb25vY2hyb21hdGljKGNvbiwgaXNNb25vKTsKLX0KLQotc3RhdGljIHZvaWQKLW5MaWdodFNldElzTG9jYWwoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBpc0xvY2FsKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5MaWdodFNldElzTG9jYWwsIGNvbiglcCksIGlzTG9jYWwoJWkpIiwgY29uLCBpc0xvY2FsKTsKLSAgICByc0xpZ2h0U2V0TG9jYWwoY29uLCBpc0xvY2FsKTsKLX0KLQogc3RhdGljIGppbnQKLW5MaWdodENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituTWVzaENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgdnR4Q291bnQsIGppbnQgaWR4Q291bnQpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkxpZ2h0Q3JlYXRlLCBjb24oJXApIiwgY29uKTsKLSAgICByZXR1cm4gKGppbnQpcnNMaWdodENyZWF0ZShjb24pOwotfQotCi1zdGF0aWMgdm9pZAotbkxpZ2h0U2V0Q29sb3IoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGxpZ2h0LCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5MaWdodFNldENvbG9yLCBjb24oJXApLCBsaWdodCglcCksIHIoJWYpLCBnKCVmKSwgYiglZikiLCBjb24sIChSc0xpZ2h0KWxpZ2h0LCByLCBnLCBiKTsKLSAgICByc0xpZ2h0U2V0Q29sb3IoY29uLCAoUnNMaWdodClsaWdodCwgciwgZywgYik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1uTGlnaHRTZXRQb3NpdGlvbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgbGlnaHQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkxpZ2h0U2V0UG9zaXRpb24sIGNvbiglcCksIGxpZ2h0KCVwKSwgeCglZiksIHkoJWYpLCB6KCVmKSIsIGNvbiwgKFJzTGlnaHQpbGlnaHQsIHgsIHksIHopOwotICAgIHJzTGlnaHRTZXRQb3NpdGlvbihjb24sIChSc0xpZ2h0KWxpZ2h0LCB4LCB5LCB6KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBqaW50Ci1uU2ltcGxlTWVzaENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYmF0Y2hJRCwgamludCBpbmRleElELCBqaW50QXJyYXkgdnR4SURzLCBqaW50IHByaW1JRCkKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKHZ0eElEcyk7Ci0gICAgTE9HX0FQSSgiblNpbXBsZU1lc2hDcmVhdGUsIGNvbiglcCksIGJhdGNoSUQoJWkpLCBpbmRleElEKCVpKSwgdnR4SURzLmxlbiglaSksIHByaW1JRCglaSkiLAotICAgICAgICAgICAgY29uLCBiYXRjaElELCBpbmRleElELCBsZW4sIHByaW1JRCk7Ci0gICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyh2dHhJRHMsIE5VTEwpOwotICAgIGludCBpZCA9IChpbnQpcnNTaW1wbGVNZXNoQ3JlYXRlKGNvbiwgKHZvaWQgKiliYXRjaElELCAodm9pZCAqKWluZGV4SUQsICh2b2lkICoqKXB0ciwgbGVuLCBwcmltSUQpOwotICAgIF9lbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKHZ0eElEcywgcHRyLCAwLypKTklfQUJPUlQqLyk7CisgICAgTE9HX0FQSSgibk1lc2hDcmVhdGUsIGNvbiglcCksIHZ0eENvdW50KCVpKSwgaWR4Q291bnQoJWkpIiwgY29uLCB2dHhDb3VudCwgaWR4Q291bnQpOworICAgIGludCBpZCA9IChpbnQpcnNNZXNoQ3JlYXRlKGNvbiwgdnR4Q291bnQsIGlkeENvdW50KTsKICAgICByZXR1cm4gaWQ7CiB9CiAKIHN0YXRpYyB2b2lkCi1uU2ltcGxlTWVzaEJpbmRWZXJ0ZXgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHMsIGppbnQgYWxsb2MsIGppbnQgc2xvdCkKK25NZXNoQmluZFZlcnRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgbWVzaCwgamludCBhbGxvYywgamludCBzbG90KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5TaW1wbGVNZXNoQmluZFZlcnRleCwgY29uKCVwKSwgU2ltcGxlTWVzaCglcCksIEFsbG9jKCVwKSwgc2xvdCglaSkiLCBjb24sIChSc1NpbXBsZU1lc2gpcywgKFJzQWxsb2NhdGlvbilhbGxvYywgc2xvdCk7Ci0gICAgcnNTaW1wbGVNZXNoQmluZFZlcnRleChjb24sIChSc1NpbXBsZU1lc2gpcywgKFJzQWxsb2NhdGlvbilhbGxvYywgc2xvdCk7CisgICAgTE9HX0FQSSgibk1lc2hCaW5kVmVydGV4LCBjb24oJXApLCBNZXNoKCVwKSwgQWxsb2MoJXApLCBzbG90KCVpKSIsIGNvbiwgKFJzTWVzaCltZXNoLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBzbG90KTsKKyAgICByc01lc2hCaW5kVmVydGV4KGNvbiwgKFJzTWVzaCltZXNoLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBzbG90KTsKIH0KIAogc3RhdGljIHZvaWQKLW5TaW1wbGVNZXNoQmluZEluZGV4KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBzLCBqaW50IGFsbG9jKQorbk1lc2hCaW5kSW5kZXgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG1lc2gsIGppbnQgYWxsb2MsIGppbnQgcHJpbUlELCBqaW50IHNsb3QpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNpbXBsZU1lc2hCaW5kSW5kZXgsIGNvbiglcCksIFNpbXBsZU1lc2goJXApLCBBbGxvYyglcCkiLCBjb24sIChSc1NpbXBsZU1lc2gpcywgKFJzQWxsb2NhdGlvbilhbGxvYyk7Ci0gICAgcnNTaW1wbGVNZXNoQmluZEluZGV4KGNvbiwgKFJzU2ltcGxlTWVzaClzLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKKyAgICBMT0dfQVBJKCJuTWVzaEJpbmRJbmRleCwgY29uKCVwKSwgTWVzaCglcCksIEFsbG9jKCVwKSIsIGNvbiwgKFJzTWVzaCltZXNoLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKKyAgICByc01lc2hCaW5kSW5kZXgoY29uLCAoUnNNZXNoKW1lc2gsIChSc0FsbG9jYXRpb24pYWxsb2MsIHByaW1JRCwgc2xvdCk7Cit9CisKK3N0YXRpYyBqaW50CituTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBtZXNoKQoreworICAgIExPR19BUEkoIm5NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQsIGNvbiglcCksIE1lc2goJXApIiwgY29uLCAoUnNNZXNoKW1lc2gpOworICAgIGppbnQgdnR4Q291bnQgPSAwOworICAgIHJzTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50KGNvbiwgKFJzTWVzaCltZXNoLCAmdnR4Q291bnQpOworICAgIHJldHVybiB2dHhDb3VudDsKK30KKworc3RhdGljIGppbnQKK25NZXNoR2V0SW5kZXhDb3VudChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgbWVzaCkKK3sKKyAgICBMT0dfQVBJKCJuTWVzaEdldEluZGV4Q291bnQsIGNvbiglcCksIE1lc2goJXApIiwgY29uLCAoUnNNZXNoKW1lc2gpOworICAgIGppbnQgaWR4Q291bnQgPSAwOworICAgIHJzTWVzaEdldEluZGV4Q291bnQoY29uLCAoUnNNZXNoKW1lc2gsICZpZHhDb3VudCk7CisgICAgcmV0dXJuIGlkeENvdW50OworfQorCitzdGF0aWMgdm9pZAorbk1lc2hHZXRWZXJ0aWNlcyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgbWVzaCwgamludEFycmF5IF9pZHMsIGludCBudW1WdHhJRHMpCit7CisgICAgTE9HX0FQSSgibk1lc2hHZXRWZXJ0aWNlcywgY29uKCVwKSwgTWVzaCglcCkiLCBjb24sIChSc01lc2gpbWVzaCk7CisKKyAgICBSc0FsbG9jYXRpb24gKmFsbG9jcyA9IChSc0FsbG9jYXRpb24qKW1hbGxvYygodWludDMyX3QpbnVtVnR4SURzICogc2l6ZW9mKFJzQWxsb2NhdGlvbikpOworICAgIHJzTWVzaEdldFZlcnRpY2VzKGNvbiwgKFJzTWVzaCltZXNoLCBhbGxvY3MsICh1aW50MzJfdCludW1WdHhJRHMpOworCisgICAgZm9yKGppbnQgaSA9IDA7IGkgPCBudW1WdHhJRHM7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0SW50QXJyYXlSZWdpb24oX2lkcywgaSwgMSwgKGNvbnN0IGppbnQqKSZhbGxvY3NbaV0pOworICAgIH0KKworICAgIGZyZWUoYWxsb2NzKTsKK30KKworc3RhdGljIHZvaWQKK25NZXNoR2V0SW5kaWNlcyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgbWVzaCwgamludEFycmF5IF9pZHhJZHMsIGppbnRBcnJheSBfcHJpbWl0aXZlcywgaW50IG51bUluZGljZXMpCit7CisgICAgTE9HX0FQSSgibk1lc2hHZXRWZXJ0aWNlcywgY29uKCVwKSwgTWVzaCglcCkiLCBjb24sIChSc01lc2gpbWVzaCk7CisKKyAgICBSc0FsbG9jYXRpb24gKmFsbG9jcyA9IChSc0FsbG9jYXRpb24qKW1hbGxvYygodWludDMyX3QpbnVtSW5kaWNlcyAqIHNpemVvZihSc0FsbG9jYXRpb24pKTsKKyAgICB1aW50MzJfdCAqcHJpbXM9ICh1aW50MzJfdCopbWFsbG9jKCh1aW50MzJfdCludW1JbmRpY2VzICogc2l6ZW9mKHVpbnQzMl90KSk7CisKKyAgICByc01lc2hHZXRJbmRpY2VzKGNvbiwgKFJzTWVzaCltZXNoLCBhbGxvY3MsIHByaW1zLCAodWludDMyX3QpbnVtSW5kaWNlcyk7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IG51bUluZGljZXM7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0SW50QXJyYXlSZWdpb24oX2lkeElkcywgaSwgMSwgKGNvbnN0IGppbnQqKSZhbGxvY3NbaV0pOworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfcHJpbWl0aXZlcywgaSwgMSwgKGNvbnN0IGppbnQqKSZwcmltc1tpXSk7CisgICAgfQorCisgICAgZnJlZShhbGxvY3MpOworICAgIGZyZWUocHJpbXMpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEzNTksMTI0ICsxMzYyLDEzMyBAQAogeyJuRGV2aWNlQ3JlYXRlIiwgICAgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5EZXZpY2VDcmVhdGUgfSwKIHsibkRldmljZURlc3Ryb3kiLCAgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRGV2aWNlRGVzdHJveSB9LAogeyJuRGV2aWNlU2V0Q29uZmlnIiwgICAgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5EZXZpY2VTZXRDb25maWcgfSwKLXsibkNvbnRleHRDcmVhdGUiLCAgICAgICAgICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dENyZWF0ZSB9LAoteyJuQ29udGV4dENyZWF0ZUdMIiwgICAgICAgICAgICAgICAiKElJWilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0Q3JlYXRlR0wgfSwKLXsibkNvbnRleHRTZXRQcmlvcml0eSIsICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dFNldFByaW9yaXR5IH0sCi17Im5Db250ZXh0U2V0U3VyZmFjZSIsICAgICAgICAgICAgICIoSUlMYW5kcm9pZC92aWV3L1N1cmZhY2U7KVYiLCAgICAgICAgICAodm9pZCopbkNvbnRleHRTZXRTdXJmYWNlIH0sCi17Im5Db250ZXh0RGVzdHJveSIsICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHREZXN0cm95IH0sCi17Im5Db250ZXh0RHVtcCIsICAgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHREdW1wIH0sCi17Im5Db250ZXh0UGF1c2UiLCAgICAgICAgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRQYXVzZSB9LAoteyJuQ29udGV4dFJlc3VtZSIsICAgICAgICAgICAgICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0UmVzdW1lIH0sCi17Im5Bc3NpZ25OYW1lIiwgICAgICAgICAgICAgICAgICAgICIoSVtCKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFzc2lnbk5hbWUgfSwKLXsibk9iakRlc3Ryb3kiLCAgICAgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluT2JqRGVzdHJveSB9LAoteyJuT2JqRGVzdHJveU9PQiIsICAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5PYmpEZXN0cm95T09CIH0sCi17Im5Db250ZXh0R2V0TWVzc2FnZSIsICAgICAgICAgICAgICIoW0laKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRHZXRNZXNzYWdlIH0sCi17Im5Db250ZXh0SW5pdFRvQ2xpZW50IiwgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRJbml0VG9DbGllbnQgfSwKLXsibkNvbnRleHREZWluaXRUb0NsaWVudCIsICAgICAgICAgIigpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dERlaW5pdFRvQ2xpZW50IH0sCit7Im5Db250ZXh0R2V0TWVzc2FnZSIsICAgICAgICAgICAgICIoSVtJWilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0R2V0TWVzc2FnZSB9LAoreyJuQ29udGV4dEluaXRUb0NsaWVudCIsICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEluaXRUb0NsaWVudCB9LAoreyJuQ29udGV4dERlaW5pdFRvQ2xpZW50IiwgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dERlaW5pdFRvQ2xpZW50IH0sCiAKLXsibkZpbGVPcGVuIiwgICAgICAgICAgICAgICAgICAgICAgIihbQilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRmlsZU9wZW4gfSwKIAoteyJuRWxlbWVudENyZWF0ZSIsICAgICAgICAgICAgICAgICAiKElJWkkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5FbGVtZW50Q3JlYXRlIH0sCi17Im5FbGVtZW50Q3JlYXRlMiIsICAgICAgICAgICAgICAgICIoW0lbTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAgICAgICAgICAgICAodm9pZCopbkVsZW1lbnRDcmVhdGUyIH0sCisvLyBBbGwgbWV0aG9kcyBiZWxvdyBhcmUgdGhyZWFkIHByb3RlY3RlZCBpbiBqYXZhLgoreyJyc25Db250ZXh0Q3JlYXRlIiwgICAgICAgICAgICAgICAgICIoSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRDcmVhdGUgfSwKK3sicnNuQ29udGV4dENyZWF0ZUdMIiwgICAgICAgICAgICAgICAiKElJWilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0Q3JlYXRlR0wgfSwKK3sicnNuQ29udGV4dEZpbmlzaCIsICAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEZpbmlzaCB9LAoreyJyc25Db250ZXh0U2V0UHJpb3JpdHkiLCAgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0U2V0UHJpb3JpdHkgfSwKK3sicnNuQ29udGV4dFNldFN1cmZhY2UiLCAgICAgICAgICAgICAiKElJSUxhbmRyb2lkL3ZpZXcvU3VyZmFjZTspViIsICAgICAgICAgICh2b2lkKiluQ29udGV4dFNldFN1cmZhY2UgfSwKK3sicnNuQ29udGV4dERlc3Ryb3kiLCAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0RGVzdHJveSB9LAoreyJyc25Db250ZXh0RHVtcCIsICAgICAgICAgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0RHVtcCB9LAoreyJyc25Db250ZXh0UGF1c2UiLCAgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0UGF1c2UgfSwKK3sicnNuQ29udGV4dFJlc3VtZSIsICAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dFJlc3VtZSB9LAoreyJyc25Bc3NpZ25OYW1lIiwgICAgICAgICAgICAgICAgICAgICIoSUlbQilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Bc3NpZ25OYW1lIH0sCit7InJzbkdldE5hbWUiLCAgICAgICAgICAgICAgICAgICAgICAgIihJSSlMamF2YS9sYW5nL1N0cmluZzsiLCAgICAgICAgICAgICAgICh2b2lkKiluR2V0TmFtZSB9LAoreyJyc25PYmpEZXN0cm95IiwgICAgICAgICAgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5PYmpEZXN0cm95IH0sCiAKLXsiblR5cGVCZWdpbiIsICAgICAgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluVHlwZUJlZ2luIH0sCi17Im5UeXBlQWRkIiwgICAgICAgICAgICAgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblR5cGVBZGQgfSwKLXsiblR5cGVDcmVhdGUiLCAgICAgICAgICAgICAgICAgICAgIigpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluVHlwZUNyZWF0ZSB9LAoteyJuVHlwZUZpbmFsRGVzdHJveSIsICAgICAgICAgICAgICAiKExhbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlOylWIiwgICAgICAgKHZvaWQqKW5UeXBlRmluYWxEZXN0cm95IH0sCi17Im5UeXBlU2V0dXBGaWVsZHMiLCAgICAgICAgICAgICAgICIoTGFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGU7W0lbSVtMamF2YS9sYW5nL3JlZmxlY3QvRmllbGQ7KVYiLCAodm9pZCopblR5cGVTZXR1cEZpZWxkcyB9LAoreyJyc25GaWxlT3BlbiIsICAgICAgICAgICAgICAgICAgICAgICIoSVtCKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5GaWxlT3BlbiB9LAoreyJyc25GaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtIiwgICIoSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5GaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtIH0sCit7InJzbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMiLCAgICAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMgfSwKK3sicnNuRmlsZUEzREdldEluZGV4RW50cmllcyIsICAgICAgICAiKElJSVtJW0xqYXZhL2xhbmcvU3RyaW5nOylWIiwgICAgICAgICAgKHZvaWQqKW5GaWxlQTNER2V0SW5kZXhFbnRyaWVzIH0sCit7InJzbkZpbGVBM0RHZXRFbnRyeUJ5SW5kZXgiLCAgICAgICAgIihJSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkZpbGVBM0RHZXRFbnRyeUJ5SW5kZXggfSwKIAoteyJuQWxsb2NhdGlvbkNyZWF0ZVR5cGVkIiwgICAgICAgICAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQgfSwKLXsibkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwIiwgICAgIihJWkxhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcDspSSIsICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAgfSwKLXsibkFsbG9jYXRpb25DcmVhdGVCaXRtYXBSZWYiLCAgICAgIihJTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZiB9LAoteyJuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXBCb3hlZCIsIihJWkxhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcDspSSIsICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkIH0sCi17Im5BbGxvY2F0aW9uQ3JlYXRlRnJvbUFzc2V0U3RyZWFtIiwiKElaSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0gfSwKLXsibkFsbG9jYXRpb25VcGxvYWRUb1RleHR1cmUiLCAgICAgIihJWkkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZSB9LAoteyJuQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0IiwiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QgfSwKLXsibkFsbG9jYXRpb25TdWJEYXRhMUQiLCAgICAgICAgICAgIihJSUlbSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGExRF9pIH0sCi17Im5BbGxvY2F0aW9uU3ViRGF0YTFEIiwgICAgICAgICAgICIoSUlJW1NJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMURfcyB9LAoteyJuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSVtCSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2IgfSwKLXsibkFsbG9jYXRpb25TdWJEYXRhMUQiLCAgICAgICAgICAgIihJSUlbRkkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGExRF9mIH0sCi17Im5BbGxvY2F0aW9uU3ViRGF0YTJEIiwgICAgICAgICAgICIoSUlJSUlbSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMkRfaSB9LAoteyJuQWxsb2NhdGlvblN1YkRhdGEyRCIsICAgICAgICAgICAiKElJSUlJW0ZJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTJEX2YgfSwKLXsibkFsbG9jYXRpb25SZWFkIiwgICAgICAgICAgICAgICAgIihJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblJlYWRfaSB9LAoteyJuQWxsb2NhdGlvblJlYWQiLCAgICAgICAgICAgICAgICAiKElbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uUmVhZF9mIH0sCi17Im5BbGxvY2F0aW9uU3ViRGF0YUZyb21PYmplY3QiLCAgICIoSUxhbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlO0lMamF2YS9sYW5nL09iamVjdDspViIsICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YUZyb21PYmplY3QgfSwKLXsibkFsbG9jYXRpb25TdWJSZWFkRnJvbU9iamVjdCIsICAgIihJTGFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGU7SUxqYXZhL2xhbmcvT2JqZWN0OylWIiwgICAodm9pZCopbkFsbG9jYXRpb25TdWJSZWFkRnJvbU9iamVjdCB9LAoreyJyc25Gb250Q3JlYXRlRnJvbUZpbGUiLCAgICAgICAgICAgICIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJKUkiLCAgICAgICAgICAgICAodm9pZCopbkZvbnRDcmVhdGVGcm9tRmlsZSB9LAogCi17Im5BZGFwdGVyMURCaW5kQWxsb2NhdGlvbiIsICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uIH0sCi17Im5BZGFwdGVyMURTZXRDb25zdHJhaW50IiwgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRFNldENvbnN0cmFpbnQgfSwKLXsibkFkYXB0ZXIxRERhdGEiLCAgICAgICAgICAgICAgICAgIihJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFERGF0YV9pIH0sCi17Im5BZGFwdGVyMUREYXRhIiwgICAgICAgICAgICAgICAgICIoSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRERhdGFfZiB9LAoteyJuQWRhcHRlcjFEU3ViRGF0YSIsICAgICAgICAgICAgICAiKElJSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURTdWJEYXRhX2kgfSwKLXsibkFkYXB0ZXIxRFN1YkRhdGEiLCAgICAgICAgICAgICAgIihJSUlbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEU3ViRGF0YV9mIH0sCi17Im5BZGFwdGVyMURDcmVhdGUiLCAgICAgICAgICAgICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRENyZWF0ZSB9LAoreyJyc25FbGVtZW50Q3JlYXRlIiwgICAgICAgICAgICAgICAgICIoSUlJWkkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5FbGVtZW50Q3JlYXRlIH0sCit7InJzbkVsZW1lbnRDcmVhdGUyIiwgICAgICAgICAgICAgICAgIihJW0lbTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAgICAgICAgICAgICAodm9pZCopbkVsZW1lbnRDcmVhdGUyIH0sCit7InJzbkVsZW1lbnRHZXROYXRpdmVEYXRhIiwgICAgICAgICAgIihJSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkVsZW1lbnRHZXROYXRpdmVEYXRhIH0sCit7InJzbkVsZW1lbnRHZXRTdWJFbGVtZW50cyIsICAgICAgICAgIihJSVtJW0xqYXZhL2xhbmcvU3RyaW5nOylWIiwgICAgICAgICAgICh2b2lkKiluRWxlbWVudEdldFN1YkVsZW1lbnRzIH0sCiAKLXsibkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uIiwgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJEQmluZEFsbG9jYXRpb24gfSwKLXsibkFkYXB0ZXIyRFNldENvbnN0cmFpbnQiLCAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJEU2V0Q29uc3RyYWludCB9LAoteyJuQWRhcHRlcjJERGF0YSIsICAgICAgICAgICAgICAgICAiKElbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkREYXRhX2kgfSwKLXsibkFkYXB0ZXIyRERhdGEiLCAgICAgICAgICAgICAgICAgIihJW0YpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJERGF0YV9mIH0sCi17Im5BZGFwdGVyMkRTdWJEYXRhIiwgICAgICAgICAgICAgICIoSUlJSUlbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRFN1YkRhdGFfaSB9LAoteyJuQWRhcHRlcjJEU3ViRGF0YSIsICAgICAgICAgICAgICAiKElJSUlJW0YpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRTdWJEYXRhX2YgfSwKLXsibkFkYXB0ZXIyRENyZWF0ZSIsICAgICAgICAgICAgICAgIigpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJEQ3JlYXRlIH0sCit7InJzblR5cGVCZWdpbiIsICAgICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblR5cGVCZWdpbiB9LAoreyJyc25UeXBlQWRkIiwgICAgICAgICAgICAgICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5UeXBlQWRkIH0sCit7InJzblR5cGVDcmVhdGUiLCAgICAgICAgICAgICAgICAgICAgIihJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblR5cGVDcmVhdGUgfSwKK3sicnNuVHlwZUZpbmFsRGVzdHJveSIsICAgICAgICAgICAgICAiKElMYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZTspViIsICAgICAgICh2b2lkKiluVHlwZUZpbmFsRGVzdHJveSB9LAoreyJyc25UeXBlU2V0dXBGaWVsZHMiLCAgICAgICAgICAgICAgICIoSUxhbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlO1tJW0lbTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOylWIiwgKHZvaWQqKW5UeXBlU2V0dXBGaWVsZHMgfSwKK3sicnNuVHlwZUdldE5hdGl2ZURhdGEiLCAgICAgICAgICAgICAiKElJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblR5cGVHZXROYXRpdmVEYXRhIH0sCiAKLXsiblNjcmlwdEJpbmRBbGxvY2F0aW9uIiwgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0QmluZEFsbG9jYXRpb24gfSwKLXsiblNjcmlwdFNldENsZWFyQ29sb3IiLCAgICAgICAgICAgIihJRkZGRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0Q2xlYXJDb2xvciB9LAoteyJuU2NyaXB0U2V0Q2xlYXJEZXB0aCIsICAgICAgICAgICAiKElGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRDbGVhckRlcHRoIH0sCi17Im5TY3JpcHRTZXRDbGVhclN0ZW5jaWwiLCAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldENsZWFyU3RlbmNpbCB9LAoteyJuU2NyaXB0U2V0VGltZVpvbmUiLCAgICAgICAgICAgICAiKElbQilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRUaW1lWm9uZSB9LAoteyJuU2NyaXB0U2V0VHlwZSIsICAgICAgICAgICAgICAgICAiKElaTGphdmEvbGFuZy9TdHJpbmc7SSlWIiwgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRUeXBlIH0sCi17Im5TY3JpcHRTZXRSb290IiwgICAgICAgICAgICAgICAgICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFJvb3QgfSwKLXsiblNjcmlwdFNldEludm9rYWJsZSIsICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztJKVYiLCAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0SW52b2tlIH0sCi17Im5TY3JpcHRJbnZva2UiLCAgICAgICAgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdEludm9rZSB9LAoreyJyc25BbGxvY2F0aW9uQ3JlYXRlVHlwZWQiLCAgICAgICAgICIoSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQgfSwKK3sicnNuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAiLCAgICAiKElJWkxhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcDspSSIsICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAgfSwKK3sicnNuQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZiIsICAgICAiKElJTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZiB9LAoreyJyc25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkIiwiKElJWkxhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcDspSSIsICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkIH0sCit7InJzbkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0iLCIoSUlaSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0gfSwKK3sicnNuQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZSIsICAgICAiKElJWkkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZSB9LAoreyJyc25BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QiLCIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QgfSwKK3sicnNuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSUlbSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGExRF9pIH0sCit7InJzbkFsbG9jYXRpb25TdWJEYXRhMUQiLCAgICAgICAgICAgIihJSUlJW1NJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMURfcyB9LAoreyJyc25BbGxvY2F0aW9uU3ViRGF0YTFEIiwgICAgICAgICAgICIoSUlJSVtCSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2IgfSwKK3sicnNuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSUlbRkkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGExRF9mIH0sCit7InJzbkFsbG9jYXRpb25TdWJFbGVtZW50RGF0YTFEIiwgICAgIihJSUlJW0JJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJFbGVtZW50RGF0YTFEIH0sCit7InJzbkFsbG9jYXRpb25TdWJEYXRhMkQiLCAgICAgICAgICAgIihJSUlJSUlbSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMkRfaSB9LAoreyJyc25BbGxvY2F0aW9uU3ViRGF0YTJEIiwgICAgICAgICAgICIoSUlJSUlJW0ZJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTJEX2YgfSwKK3sicnNuQWxsb2NhdGlvblJlYWQiLCAgICAgICAgICAgICAgICAiKElJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblJlYWRfaSB9LAoreyJyc25BbGxvY2F0aW9uUmVhZCIsICAgICAgICAgICAgICAgICIoSUlbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uUmVhZF9mIH0sCit7InJzbkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdCIsICAgIihJSUxhbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlO0lMamF2YS9sYW5nL09iamVjdDspViIsICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YUZyb21PYmplY3QgfSwKK3sicnNuQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0IiwgICAiKElJTGFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGU7SUxqYXZhL2xhbmcvT2JqZWN0OylWIiwgICAodm9pZCopbkFsbG9jYXRpb25TdWJSZWFkRnJvbU9iamVjdCB9LAoreyJyc25BbGxvY2F0aW9uR2V0VHlwZSIsICAgICAgICAgICAgICIoSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uR2V0VHlwZX0sCiAKLXsiblNjcmlwdENCZWdpbiIsICAgICAgICAgICAgICAgICAgIigpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0Q0JlZ2luIH0sCi17Im5TY3JpcHRDU2V0U2NyaXB0IiwgICAgICAgICAgICAgICIoW0JJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENTZXRTY3JpcHQgfSwKLXsiblNjcmlwdENDcmVhdGUiLCAgICAgICAgICAgICAgICAgIigpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0Q0NyZWF0ZSB9LAoteyJuU2NyaXB0Q0FkZERlZmluZUkzMiIsICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIsICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDQWRkRGVmaW5lSTMyIH0sCi17Im5TY3JpcHRDQWRkRGVmaW5lRiIsICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7RilWIiwgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENBZGREZWZpbmVGIH0sCit7InJzbkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uIiwgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uIH0sCit7InJzbkFkYXB0ZXIxRFNldENvbnN0cmFpbnQiLCAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRFNldENvbnN0cmFpbnQgfSwKK3sicnNuQWRhcHRlcjFERGF0YSIsICAgICAgICAgICAgICAgICAiKElJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFERGF0YV9pIH0sCit7InJzbkFkYXB0ZXIxRERhdGEiLCAgICAgICAgICAgICAgICAgIihJSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRERhdGFfZiB9LAoreyJyc25BZGFwdGVyMURTdWJEYXRhIiwgICAgICAgICAgICAgICIoSUlJSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURTdWJEYXRhX2kgfSwKK3sicnNuQWRhcHRlcjFEU3ViRGF0YSIsICAgICAgICAgICAgICAiKElJSUlbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEU3ViRGF0YV9mIH0sCit7InJzbkFkYXB0ZXIxRENyZWF0ZSIsICAgICAgICAgICAgICAgIihJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRENyZWF0ZSB9LAogCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luIiwgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4gfSwKLXsiblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jIiwgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMgfSwKLXsiblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrIiwgIihaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2sgfSwKLXsiblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrIiwgIihaWlpaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2sgfSwKLXsiblByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jIiwgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMgfSwKLXsiblByb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyIiwgICAgIihaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIgfSwKLXsiblByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlIiwgICAgIigpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUgfSwKK3sicnNuQWRhcHRlcjJEQmluZEFsbG9jYXRpb24iLCAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJEQmluZEFsbG9jYXRpb24gfSwKK3sicnNuQWRhcHRlcjJEU2V0Q29uc3RyYWludCIsICAgICAgICAiKElJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJEU2V0Q29uc3RyYWludCB9LAoreyJyc25BZGFwdGVyMkREYXRhIiwgICAgICAgICAgICAgICAgICIoSUlbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkREYXRhX2kgfSwKK3sicnNuQWRhcHRlcjJERGF0YSIsICAgICAgICAgICAgICAgICAiKElJW0YpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJERGF0YV9mIH0sCit7InJzbkFkYXB0ZXIyRFN1YkRhdGEiLCAgICAgICAgICAgICAgIihJSUlJSUlbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRFN1YkRhdGFfaSB9LAoreyJyc25BZGFwdGVyMkRTdWJEYXRhIiwgICAgICAgICAgICAgICIoSUlJSUlJW0YpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRTdWJEYXRhX2YgfSwKK3sicnNuQWRhcHRlcjJEQ3JlYXRlIiwgICAgICAgICAgICAgICAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJEQ3JlYXRlIH0sCiAKLXsiblByb2dyYW1CaW5kQ29uc3RhbnRzIiwgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUJpbmRDb25zdGFudHMgfSwKLXsiblByb2dyYW1CaW5kVGV4dHVyZSIsICAgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUJpbmRUZXh0dXJlIH0sCi17Im5Qcm9ncmFtQmluZFNhbXBsZXIiLCAgICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1CaW5kU2FtcGxlciB9LAoreyJyc25TY3JpcHRCaW5kQWxsb2NhdGlvbiIsICAgICAgICAgICIoSUlJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRCaW5kQWxsb2NhdGlvbiB9LAoreyJyc25TY3JpcHRTZXRUaW1lWm9uZSIsICAgICAgICAgICAgICIoSUlbQilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRUaW1lWm9uZSB9LAoreyJyc25TY3JpcHRJbnZva2UiLCAgICAgICAgICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRJbnZva2UgfSwKK3sicnNuU2NyaXB0SW52b2tlViIsICAgICAgICAgICAgICAgICAiKElJSVtCKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0SW52b2tlViB9LAoreyJyc25TY3JpcHRTZXRWYXJJIiwgICAgICAgICAgICAgICAgICIoSUlJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRWYXJJIH0sCit7InJzblNjcmlwdFNldFZhckYiLCAgICAgICAgICAgICAgICAgIihJSUlGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFZhckYgfSwKK3sicnNuU2NyaXB0U2V0VmFyViIsICAgICAgICAgICAgICAgICAiKElJSVtCKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0VmFyViB9LAogCi17Im5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUiLCAgICAgICAgICIoW0kpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudENyZWF0ZSB9LAoteyJuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMiIsICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO1tJKUkiLCAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyIH0sCit7InJzblNjcmlwdENCZWdpbiIsICAgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENCZWdpbiB9LAoreyJyc25TY3JpcHRDU2V0U2NyaXB0IiwgICAgICAgICAgICAgICIoSVtCSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDU2V0U2NyaXB0IH0sCit7InJzblNjcmlwdENDcmVhdGUiLCAgICAgICAgICAgICAgICAgIihJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENDcmVhdGUgfSwKIAoteyJuUHJvZ3JhbVJhc3RlckNyZWF0ZSIsICAgICAgICAgICAiKElJWlpaKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtUmFzdGVyQ3JlYXRlIH0sCi17Im5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplIiwgICAgICIoSUYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUgfSwKLXsiblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgiLCAgICAgIihJRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aCB9LAoreyJyc25Qcm9ncmFtU3RvcmVCZWdpbiIsICAgICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVCZWdpbiB9LAoreyJyc25Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMiLCAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMgfSwKK3sicnNuUHJvZ3JhbVN0b3JlRGVwdGhNYXNrIiwgICAgICAgICAiKElaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlRGVwdGhNYXNrIH0sCit7InJzblByb2dyYW1TdG9yZUNvbG9yTWFzayIsICAgICAgICAgIihJWlpaWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZUNvbG9yTWFzayB9LAoreyJyc25Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMiLCAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMgfSwKK3sicnNuUHJvZ3JhbVN0b3JlRGl0aGVyIiwgICAgICAgICAgICAiKElaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlRGl0aGVyIH0sCit7InJzblByb2dyYW1TdG9yZUNyZWF0ZSIsICAgICAgICAgICAgIihJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZUNyZWF0ZSB9LAogCi17Im5Qcm9ncmFtVmVydGV4Q3JlYXRlIiwgICAgICAgICAgICIoWilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1WZXJ0ZXhDcmVhdGUgfSwKLXsiblByb2dyYW1WZXJ0ZXhDcmVhdGUyIiwgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztbSSlJIiwgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVZlcnRleENyZWF0ZTIgfSwKK3sicnNuUHJvZ3JhbUJpbmRDb25zdGFudHMiLCAgICAgICAgICAiKElJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUJpbmRDb25zdGFudHMgfSwKK3sicnNuUHJvZ3JhbUJpbmRUZXh0dXJlIiwgICAgICAgICAgICAiKElJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUJpbmRUZXh0dXJlIH0sCit7InJzblByb2dyYW1CaW5kU2FtcGxlciIsICAgICAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1CaW5kU2FtcGxlciB9LAogCi17Im5MaWdodEJlZ2luIiwgICAgICAgICAgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkxpZ2h0QmVnaW4gfSwKLXsibkxpZ2h0U2V0SXNNb25vIiwgICAgICAgICAgICAgICAgIihaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTGlnaHRTZXRJc01vbm8gfSwKLXsibkxpZ2h0U2V0SXNMb2NhbCIsICAgICAgICAgICAgICAgIihaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTGlnaHRTZXRJc0xvY2FsIH0sCi17Im5MaWdodENyZWF0ZSIsICAgICAgICAgICAgICAgICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkxpZ2h0Q3JlYXRlIH0sCi17Im5MaWdodFNldENvbG9yIiwgICAgICAgICAgICAgICAgICIoSUZGRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkxpZ2h0U2V0Q29sb3IgfSwKLXsibkxpZ2h0U2V0UG9zaXRpb24iLCAgICAgICAgICAgICAgIihJRkZGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTGlnaHRTZXRQb3NpdGlvbiB9LAoreyJyc25Qcm9ncmFtRnJhZ21lbnRDcmVhdGUiLCAgICAgICAgICIoSVtJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUgfSwKK3sicnNuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMiIsICAgICAgICAiKElMamF2YS9sYW5nL1N0cmluZztbSSlJIiwgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMiB9LAogCi17Im5Db250ZXh0QmluZFJvb3RTY3JpcHQiLCAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUm9vdFNjcmlwdCB9LAoteyJuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSIsIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlIH0sCi17Im5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudCIsICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50IH0sCi17Im5Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgiLCAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleCB9LAoteyJuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyIiwgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIgfSwKK3sicnNuUHJvZ3JhbVJhc3RlckNyZWF0ZSIsICAgICAgICAgICAiKElaWlopSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1SYXN0ZXJDcmVhdGUgfSwKK3sicnNuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aCIsICAgICAiKElJRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aCB9LAoreyJyc25Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUiLCAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUgfSwKIAoteyJuU2FtcGxlckJlZ2luIiwgICAgICAgICAgICAgICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyQmVnaW4gfSwKLXsiblNhbXBsZXJTZXQiLCAgICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2FtcGxlclNldCB9LAoteyJuU2FtcGxlckNyZWF0ZSIsICAgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyQ3JlYXRlIH0sCit7InJzblByb2dyYW1WZXJ0ZXhDcmVhdGUiLCAgICAgICAgICAgIihJWilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1WZXJ0ZXhDcmVhdGUgfSwKK3sicnNuUHJvZ3JhbVZlcnRleENyZWF0ZTIiLCAgICAgICAgICAiKElMamF2YS9sYW5nL1N0cmluZztbSSlJIiwgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVZlcnRleENyZWF0ZTIgfSwKIAoteyJuU2ltcGxlTWVzaENyZWF0ZSIsICAgICAgICAgICAgICAiKElJW0lJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TaW1wbGVNZXNoQ3JlYXRlIH0sCi17Im5TaW1wbGVNZXNoQmluZFZlcnRleCIsICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNpbXBsZU1lc2hCaW5kVmVydGV4IH0sCi17Im5TaW1wbGVNZXNoQmluZEluZGV4IiwgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNpbXBsZU1lc2hCaW5kSW5kZXggfSwKK3sicnNuQ29udGV4dEJpbmRSb290U2NyaXB0IiwgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRSb290U2NyaXB0IH0sCit7InJzbkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlIiwgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUgfSwKK3sicnNuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQiLCAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQgfSwKK3sicnNuQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4IiwgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4IH0sCit7InJzbkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlciIsICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlciB9LAorCit7InJzblNhbXBsZXJCZWdpbiIsICAgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNhbXBsZXJCZWdpbiB9LAoreyJyc25TYW1wbGVyU2V0IiwgICAgICAgICAgICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyU2V0IH0sCit7InJzblNhbXBsZXJDcmVhdGUiLCAgICAgICAgICAgICAgICAgIihJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNhbXBsZXJDcmVhdGUgfSwKKworeyJyc25NZXNoQ3JlYXRlIiwgICAgICAgICAgICAgICAgICAgICIoSUlJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5NZXNoQ3JlYXRlIH0sCit7InJzbk1lc2hCaW5kVmVydGV4IiwgICAgICAgICAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk1lc2hCaW5kVmVydGV4IH0sCit7InJzbk1lc2hCaW5kSW5kZXgiLCAgICAgICAgICAgICAgICAgIihJSUlJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk1lc2hCaW5kSW5kZXggfSwKKworeyJyc25NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQiLCAgICAgICIoSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQgfSwKK3sicnNuTWVzaEdldEluZGV4Q291bnQiLCAgICAgICAgICAgICAiKElJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaEdldEluZGV4Q291bnQgfSwKK3sicnNuTWVzaEdldFZlcnRpY2VzIiwgICAgICAgICAgICAgICAiKElJW0lJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5NZXNoR2V0VmVydGljZXMgfSwKK3sicnNuTWVzaEdldEluZGljZXMiLCAgICAgICAgICAgICAgICAiKElJW0lbSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaEdldEluZGljZXMgfSwKIAogfTsKIApAQCAtMTUxMCwzICsxNTIyLDQgQEAKIGJhaWw6CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KKwpkaWZmIC0tZ2l0IGEvaWN1NGovamF2YS9hbmRyb2lkL2ljdS90ZXh0L0FyYWJpY1NoYXBpbmcuamF2YSBiL2ljdTRqL2phdmEvYW5kcm9pZC9pY3UvdGV4dC9BcmFiaWNTaGFwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlMjE3NQotLS0gL2Rldi9udWxsCisrKyBiL2ljdTRqL2phdmEvYW5kcm9pZC9pY3UvdGV4dC9BcmFiaWNTaGFwaW5nLmphdmEKQEAgLTAsMCArMSwxOTQ3IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIENvcHlyaWdodCAoQykgMjAwMS0yMDA5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvKgorICogUG9ydGVkIHdpdGggbWlub3IgbW9kaWZpY2F0aW9ucyBmcm9tIElDVTRKIDQuMidzCisgKiBjb20uaWJtLmljdS50ZXh0LkFyYWJpY1NoYXBpbmcgY2xhc3MuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmljdS50ZXh0OworCisKKy8qKgorICogU2hhcGUgQXJhYmljIHRleHQgb24gYSBjaGFyYWN0ZXIgYmFzaXMuCisgKgorICogPHA+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+bnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgIGludDMyX3QgICAgICAgICAgICAgZnJlZVNwYWNlKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIGNsZWFyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgICAgICogQWxsb2NhdGUgYSByb3cgc2xvdCBhbmQgaXRzIGRpcmVjdG9yeS4gVGhlIHJldHVybmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBwb2ludGVyIHBvaW50cyB0byB0aGUgYmVnaW5pbmcgb2YgdGhlIHJvdydzIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICogb3IgTlVMTCBpZiB0aGVyZSB3YXNuJ3Qgcm9vbS4gVGhlIGRpcmVjdG9yeSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICogaW5pdGlhbGllZCB3aXRoIE5VTEwgZW50cmllcyBmb3IgZWFjaCBmaWVsZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGZpZWxkX3Nsb3RfdCAqICAgICAgYWxsb2NSb3coKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBhIHBvcnRpb24gb2YgdGhlIHdpbmRvdy4gUmV0dXJucyB0aGUgb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgYWxsb2NhdGlvbiwgb3IgMCBpZiB0aGVyZSBpc24ndCBlbm91Z2ggc3BhY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBhbGlnbmVkIGlzIHRydWUsIHRoZSBhbGxvY2F0aW9uIGdldHMgNCBieXRlIGFsaWdubWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgYWxsb2Moc2l6ZV90IHNpemUsIGJvb2wgYWxpZ25lZCA9IGZhbHNlKTsKKworICAgIHVpbnQzMl90ICAgICAgICAgICAgcmVhZF9maWVsZF9zbG90KGludCByb3csIGludCBjb2x1bW4sIGZpZWxkX3Nsb3RfdCAqIHNsb3QpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIENvcHkgZGF0YSBpbnRvIHRoZSB3aW5kb3cgYXQgdGhlIGdpdmVuIG9mZnNldC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgY29weUluKHVpbnQzMl90IG9mZnNldCwgdWludDhfdCBjb25zdCAqIGRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlJbih1aW50MzJfdCBvZmZzZXQsIGludDY0X3QgZGF0YSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCBkb3VibGUgZGF0YSk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlPdXQodWludDMyX3Qgb2Zmc2V0LCB1aW50OF90ICogZGF0YSwgc2l6ZV90IHNpemUpOworICAgIGludDY0X3QgICAgICAgICAgICAgY29weU91dExvbmcodWludDMyX3Qgb2Zmc2V0KTsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGNvcHlPdXREb3VibGUodWludDMyX3Qgb2Zmc2V0KTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgcHV0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90IHZhbHVlKTsKKyAgICBib29sICAgICAgICAgICAgICAgIHB1dERvdWJsZSh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBkb3VibGUgdmFsdWUpOworICAgIGJvb2wgICAgICAgICAgICAgICAgcHV0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgZ2V0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90ICogdmFsdWVPdXQpOworICAgIGJvb2wgICAgICAgICAgICAgICAgZ2V0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSAqIHZhbHVlT3V0KTsKKyAgICBib29sICAgICAgICAgICAgICAgIGdldE51bGwodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgYm9vbCAqIHZhbHVlT3V0KTsKKworICAgIHVpbnQ4X3QgKiAgICAgICAgICAgb2Zmc2V0VG9QdHIodWludDMyX3Qgb2Zmc2V0KSB7cmV0dXJuIG1EYXRhICsgb2Zmc2V0O30KKworICAgIHJvd19zbG90X3QgKiAgICAgICAgYWxsb2NSb3dTbG90KCk7CisKKyAgICByb3dfc2xvdF90ICogICAgICAgIGdldFJvd1Nsb3QoaW50IHJvdyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0dXJuIE5VTEwgaWYgRmFpbGVkIHRvIGZpbmQgcm93U2xvdCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICogSW52YWxpZCByb3dTbG90CisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBmaWVsZF9zbG90X3QgKiAgICAgIGdldEZpZWxkU2xvdFdpdGhDaGVjayhpbnQgcm93LCBpbnQgY29sdW1uKTsKKyAgICBmaWVsZF9zbG90X3QgKiAgICAgIGdldEZpZWxkU2xvdChpbnQgcm93LCBpbnQgY29sdW1uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkRGlyT2Zmc2V0ID0gZ2V0Um93U2xvdChyb3cpLT5vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKGZpZWxkRGlyT2Zmc2V0KSkgKyBjb2x1bW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCitwcml2YXRlOgorICAgIHVpbnQ4X3QgKiBtRGF0YTsKKyAgICBzaXplX3QgbVNpemU7CisgICAgc2l6ZV90IG1NYXhTaXplOworICAgIHdpbmRvd19oZWFkZXJfdCAqIG1IZWFkZXI7CisgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKKworICAgIC8qKgorICAgICAqIE9mZnNldCBvZiB0aGUgbG93ZXN0IHVudXNlZCBkYXRhIGJ5dGUgaW4gdGhlIGFycmF5LgorICAgICAqLworICAgIHVpbnQzMl90IG1GcmVlT2Zmc2V0OworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaCBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCmluZGV4IDk2NDcwMGIuLjc1Y2Y1ZmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCkBAIC0yMiw4ICsyMiw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSVN1cmZhY2U7Ci0KIC8qCiAgKiBBIHNldCBvZiBiaXQgbWFza3MgZm9yIHNwZWNpZnlpbmcgaG93IHRoZSByZWNlaXZlZCBwcmV2aWV3IGZyYW1lcyBhcmUKICAqIGhhbmRsZWQgYmVmb3JlIHRoZSBwcmV2aWV3Q2FsbGJhY2soKSBjYWxsLgpAQCAtMTUyLDkgKzE1MCw4IEBACiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFN0YXR1cygpIHsgcmV0dXJuIG1TdGF0dXM7IH0KIAotICAgICAgICAgICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgSVN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCisgICAgICAgICAgICAvLyBwYXNzIHRoZSBidWZmZXJlZCBTdXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZQogICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKTsKIAogICAgICAgICAgICAgLy8gc3RhcnQgcHJldmlldyBtb2RlLCBtdXN0IGNhbGwgc2V0UHJldmlld0Rpc3BsYXkgZmlyc3QKICAgICAgICAgICAgIHN0YXR1c190ICAgIHN0YXJ0UHJldmlldygpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKaW5kZXggNmE2NmUzYy4uNTE1ZDg3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfQ0FNRVJBX0hBUkRXQVJFX0lOVEVSRkFDRV9ICiAKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPHVpL2VnbC9hbmRyb2lkX25hdGl2ZXMuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhLmg+CkBAIC04Niw4ICs4Nyw4IEBACiBwdWJsaWM6CiAgICAgdmlydHVhbCB+Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UoKSB7IH0KIAotICAgIC8qKiBSZXR1cm4gdGhlIElNZW1vcnlIZWFwIGZvciB0aGUgcHJldmlldyBpbWFnZSBoZWFwICovCi0gICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gICAgICAgICBnZXRQcmV2aWV3SGVhcCgpIGNvbnN0ID0gMDsKKyAgICAvKiogU2V0IHRoZSBJU3VyZmFjZSBmcm9tIHdoaWNoIHRoZSBwcmV2aWV3IGJ1ZmZlcnMgc2hvdWxkIGJlIGRlcXVldWVkICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3V2luZG93KGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+JiBidWYpID0gMDsKIAogICAgIC8qKiBSZXR1cm4gdGhlIElNZW1vcnlIZWFwIGZvciB0aGUgcmF3IGltYWdlIGhlYXAgKi8KICAgICB2aXJ0dWFsIHNwPElNZW1vcnlIZWFwPiAgICAgICAgIGdldFJhd0hlYXAoKSBjb25zdCA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhLmggYi9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhLmgKaW5kZXggNmZjZjllNS4uOGJjZWVhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmEuaApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oPgorI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhLmg+CkBAIC00NSw4ICs0NSw4IEBACiAgICAgLy8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzIHRvIHVzZSB0aGlzIElDYW1lcmEgaW50ZXJmYWNlCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgdW5sb2NrKCkgPSAwOwogCi0gICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgSVN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CisgICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgU3VyZmFjZSB0byB0aGUgY2FtZXJhIHNlcnZpY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOwogCiAgICAgLy8gc2V0IHRoZSBwcmV2aWV3IGNhbGxiYWNrIGZsYWcgdG8gYWZmZWN0IGhvdyB0aGUgcmVjZWl2ZWQgZnJhbWVzIGZyb20KICAgICAvLyBwcmV2aWV3IGFyZSBoYW5kbGVkLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKaW5kZXggYWY5YTdlZC4uYTFjZTExMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCkBAIC0yNSw2ICsyNSw3IEBACiAKIGNsYXNzIFBhcmNlbDsKIGNsYXNzIElTdXJmYWNlOworY2xhc3MgU3VyZmFjZTsKIAogY2xhc3MgSU1lZGlhUGxheWVyOiBwdWJsaWMgSUludGVyZmFjZQogewpAQCAtMzMsNyArMzQsOCBAQAogCiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHByZXBhcmVBc3luYygpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdGFydCgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdG9wKCkgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCmluZGV4IDU0YWRjYTguLjI4YmU3YzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKQEAgLTIyLDcgKzIyLDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBJU3VyZmFjZTsKK2NsYXNzIFN1cmZhY2U7CiBjbGFzcyBJQ2FtZXJhOwogY2xhc3MgSU1lZGlhUmVjb3JkZXJDbGllbnQ7CiAKQEAgLTMyLDcgKzMyLDcgQEAKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE1lZGlhUmVjb3JkZXIpOwogCiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0Q2FtZXJhKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEpID0gMDsKLSAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKKyAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldFZpZGVvU291cmNlKGludCB2cykgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldEF1ZGlvU291cmNlKGludCBhcykgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldE91dHB1dEZvcm1hdChpbnQgb2YpID0gMDsKQEAgLTQwLDYgKzQwLDcgQEAKICAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRBdWRpb0VuY29kZXIoaW50IGFlKSA9IDA7CiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKiBwYXRoKSA9IDA7CiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOworICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldE91dHB1dEZpbGVBdXhpbGlhcnkoaW50IGZkKSA9IDA7CiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldFZpZGVvRnJhbWVSYXRlKGludCBmcmFtZXNfcGVyX3NlY29uZCkgPSAwOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKSA9IDA7CkBAIC02OCw0ICs2OSwzIEBACiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9JTUVESUFSRUNPUkRFUl9ICi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAppbmRleCAzNjYyOTgzLi4xM2M3M2FjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCkBAIC0zMyw2ICszMyw3IEBACiAKIGNsYXNzIFBhcmNlbDsKIGNsYXNzIElTdXJmYWNlOworY2xhc3MgU3VyZmFjZTsKIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgU29ydGVkVmVjdG9yOwogCkBAIC0xMDQsNyArMTA1LDggQEAKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBwcmVwYXJlKCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZUFzeW5jKCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoKSA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmggYi9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKaW5kZXggNWU5ZTM2OC4uYzQyMzQ2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaApAQCAtMjIsNyArMjIsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIElTdXJmYWNlOworY2xhc3MgU3VyZmFjZTsKIAogc3RydWN0IE1lZGlhUmVjb3JkZXJCYXNlIHsKICAgICBNZWRpYVJlY29yZGVyQmFzZSgpIHt9CkBAIC0zNyw5ICszNywxMCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYW1lcmEoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyICpwYXRoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGludCBmZCkge3JldHVybiBJTlZBTElEX09QRVJBVElPTjt9CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+JiBsaXN0ZW5lcikgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZSgpID0gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvUFZNZWRpYVJlY29yZGVyLmggYi9pbmNsdWRlL21lZGlhL1BWTWVkaWFSZWNvcmRlci5oCmluZGV4IGMwOTFjMzkuLjRiNDRjY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvUFZNZWRpYVJlY29yZGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9QVk1lZGlhUmVjb3JkZXIuaApAQCAtMjMsNyArMjMsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIElTdXJmYWNlOworY2xhc3MgU3VyZmFjZTsKIGNsYXNzIElDYW1lcmE7CiBjbGFzcyBBdXRob3JEcml2ZXJXcmFwcGVyOwogCkBAIC00MSw3ICs0MSw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvRnJhbWVSYXRlKGludCBmcmFtZXNfcGVyX3NlY29uZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYW1lcmEoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyICpwYXRoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpOwpAQCAtNjYsNCArNjYsMyBAQAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfUFZNRURJQVJFQ09SREVSX0gKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9QVlBsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9QVlBsYXllci5oCmluZGV4IGRmNTA5ODEuLjY1N2U3YTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvUFZQbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL1BWUGxheWVyLmgKQEAgLTQzLDcgKzQzLDggQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9JU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmUoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmVBc3luYygpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKaW5kZXggMjkxYjE4YS4uYTYwMGY2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKQEAgLTE3MCw2ICsxNzAsNyBAQAogICAgIHN0YXR1c190ICAgIHNldEF1ZGlvRW5jb2RlcihpbnQgYWUpOwogICAgIHN0YXR1c190ICAgIHNldE91dHB1dEZpbGUoY29uc3QgY2hhciogcGF0aCk7CiAgICAgc3RhdHVzX3QgICAgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CisgICAgc3RhdHVzX3QgICAgc2V0T3V0cHV0RmlsZUF1eGlsaWFyeShpbnQgZmQpOwogICAgIHN0YXR1c190ICAgIHNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogICAgIHN0YXR1c190ICAgIHNldFZpZGVvRnJhbWVSYXRlKGludCBmcmFtZXNfcGVyX3NlY29uZCk7CiAgICAgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpOwpAQCAtMTk2LDYgKzE5Nyw3IEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0F1ZGlvRW5jb2RlclNldDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUlzVmlkZW9FbmNvZGVyU2V0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtSXNPdXRwdXRGaWxlU2V0OworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtSXNBdXhpbGlhcnlPdXRwdXRGaWxlU2V0OwogICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbU5vdGlmeUxvY2s7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKaW5kZXggMzE5MmQwMy4uZWQ1ZjA5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00NywxMiArNDYsMzQgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciogYnVmZmVyKTsKIAotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgQ2FtZXJhU291cmNlTGlzdGVuZXI7Ci0KK3Byb3RlY3RlZDoKICAgICBzcDxDYW1lcmE+IG1DYW1lcmE7CiAgICAgc3A8TWV0YURhdGE+IG1NZXRhOwogCisgICAgaW50NjRfdCBtU3RhcnRUaW1lVXM7CisgICAgaW50MzJfdCBtTnVtRnJhbWVzUmVjZWl2ZWQ7CisgICAgaW50NjRfdCBtTGFzdEZyYW1lVGltZXN0YW1wVXM7CisgICAgYm9vbCBtU3RhcnRlZDsKKworICAgIENhbWVyYVNvdXJjZShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEpOworCisgICAgdmlydHVhbCB2b2lkIHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCk7CisgICAgdmlydHVhbCB2b2lkIHN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSk7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgbmVlZCB0byBza2lwIHRoZSBjdXJyZW50IGZyYW1lLgorICAgIC8vIENhbGxlZCBmcm9tIGRhdGFDYWxsYmFja1RpbWVzdGFtcC4KKyAgICB2aXJ0dWFsIGJvb2wgc2tpcEN1cnJlbnRGcmFtZShpbnQ2NF90IHRpbWVzdGFtcFVzKSB7cmV0dXJuIGZhbHNlO30KKworICAgIC8vIENhbGxiYWNrIGNhbGxlZCB3aGVuIHN0aWxsIGNhbWVyYSByYXcgZGF0YSBpcyBhdmFpbGFibGUuCisgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFja1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIENhbWVyYVNvdXJjZUxpc3RlbmVyOworCiAgICAgTXV0ZXggbUxvY2s7CiAgICAgQ29uZGl0aW9uIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbjsKICAgICBDb25kaXRpb24gbUZyYW1lQ29tcGxldGVDb25kaXRpb247CkBAIC02MCwyMSArODEsMTIgQEAKICAgICBMaXN0PHNwPElNZW1vcnk+ID4gbUZyYW1lc0JlaW5nRW5jb2RlZDsKICAgICBMaXN0PGludDY0X3Q+IG1GcmFtZVRpbWVzOwogCi0gICAgaW50NjRfdCBtU3RhcnRUaW1lVXM7CiAgICAgaW50NjRfdCBtRmlyc3RGcmFtZVRpbWVVczsKLSAgICBpbnQ2NF90IG1MYXN0RnJhbWVUaW1lc3RhbXBVczsKLSAgICBpbnQzMl90IG1OdW1GcmFtZXNSZWNlaXZlZDsKICAgICBpbnQzMl90IG1OdW1GcmFtZXNFbmNvZGVkOwogICAgIGludDMyX3QgbU51bUZyYW1lc0Ryb3BwZWQ7CiAgICAgaW50MzJfdCBtTnVtR2xpdGNoZXM7CiAgICAgaW50NjRfdCBtR2xpdGNoRHVyYXRpb25UaHJlc2hvbGRVczsKICAgICBib29sIG1Db2xsZWN0U3RhdHM7Ci0gICAgYm9vbCBtU3RhcnRlZDsKLQotICAgIENhbWVyYVNvdXJjZShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEpOwotCi0gICAgdm9pZCBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoCi0gICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKTsKIAogICAgIHZvaWQgcmVsZWFzZVF1ZXVlZEZyYW1lcygpOwogICAgIHZvaWQgcmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTM1YTMzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaApAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0FNRVJBX1NPVVJDRV9USU1FX0xBUFNFX0hfCisKKyNkZWZpbmUgQ0FNRVJBX1NPVVJDRV9USU1FX0xBUFNFX0hfCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElDYW1lcmE7CitjbGFzcyBJTWVtb3J5OworY2xhc3MgQ2FtZXJhOworCitjbGFzcyBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgOiBwdWJsaWMgQ2FtZXJhU291cmNlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgQ2FtZXJhU291cmNlVGltZUxhcHNlICpDcmVhdGUoYm9vbCB1c2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSwKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgaW50MzJfdCB2aWRlb0ZyYW1lUmF0ZSk7CisKKyAgICBzdGF0aWMgQ2FtZXJhU291cmNlVGltZUxhcHNlICpDcmVhdGVGcm9tQ2FtZXJhKGNvbnN0IHNwPENhbWVyYT4gJmNhbWVyYSwKKyAgICAgICAgYm9vbCB1c2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSwKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgaW50MzJfdCB2aWRlb0ZyYW1lUmF0ZSk7CisKKyAgICB2aXJ0dWFsIH5DYW1lcmFTb3VyY2VUaW1lTGFwc2UoKTsKKworcHJpdmF0ZToKKyAgICAvLyBJZiB0cnVlLCB3aWxsIHVzZSBzdGlsbCBjYW1lcmEgdGFrZVBpY3R1cmUoKSBmb3IgdGltZSBsYXBzZSBmcmFtZXMKKyAgICAvLyBJZiBmYWxzZSwgd2lsbCB1c2UgdGhlIHZpZGVvY2FtZXJhIGZyYW1lcyBpbnN0ZWFkLgorICAgIGJvb2wgbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlOworCisgICAgLy8gU2l6ZSBvZiBwaWN0dXJlIHRha2VuIGZyb20gc3RpbGwgY2FtZXJhLiBUaGlzIG1heSBiZSBsYXJnZXIgdGhhbiB0aGUgc2l6ZQorICAgIC8vIG9mIHRoZSB2aWRlbywgYXMgc3RpbGwgY2FtZXJhIG1heSBub3Qgc3VwcG9ydCB0aGUgZXhhY3QgdmlkZW8gcmVzb2x1dGlvbgorICAgIC8vIGRlbWFuZGVkLiBTZWUgc2V0UGljdHVyZVNpemVUb0Nsb3Nlc3RTdXBwb3J0ZWQoKS4KKyAgICBpbnQzMl90IG1QaWN0dXJlV2lkdGg7CisgICAgaW50MzJfdCBtUGljdHVyZUhlaWdodDsKKworICAgIC8vIHNpemUgb2YgdGhlIGVuY29kZWQgdmlkZW8uCisgICAgaW50MzJfdCBtVmlkZW9XaWR0aDsKKyAgICBpbnQzMl90IG1WaWRlb0hlaWdodDsKKworICAgIC8vIFRydWUgaWYgd2UgbmVlZCB0byBjcm9wIHRoZSBzdGlsbCBjYW1lcmEgaW1hZ2UgdG8gZ2V0IHRoZSB2aWRlbyBmcmFtZS4KKyAgICBib29sIG1OZWVkQ3JvcHBpbmc7CisKKyAgICAvLyBTdGFydCBsb2NhdGlvbiBvZiB0aGUgY3JvcHBpbmcgcmVjdGFuZ2xlLgorICAgIGludDMyX3QgbUNyb3BSZWN0U3RhcnRYOworICAgIGludDMyX3QgbUNyb3BSZWN0U3RhcnRZOworCisgICAgLy8gVGltZSBiZXR3ZWVuIGNhcHR1cmUgb2YgdHdvIGZyYW1lcyBkdXJpbmcgdGltZSBsYXBzZSByZWNvcmRpbmcKKyAgICAvLyBOZWdhdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aW1lbGFwc2UgaXMgZGlzYWJsZWQuCisgICAgaW50NjRfdCBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVczsKKworICAgIC8vIFRpbWUgYmV0d2VlbiB0d28gZnJhbWVzIGluIGZpbmFsIHZpZGVvICgxL2ZyYW1lUmF0ZSkKKyAgICBpbnQ2NF90IG1UaW1lQmV0d2VlblRpbWVMYXBzZVZpZGVvRnJhbWVzVXM7CisKKyAgICAvLyBSZWFsIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBlbmNvZGVkIHRpbWUgbGFwc2UgZnJhbWUKKyAgICBpbnQ2NF90IG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXM7CisKKyAgICAvLyBUaHJlYWQgaWQgb2YgdGhyZWFkIHdoaWNoIHRha2VzIHN0aWxsIHBpY3R1cmUgYW5kIHNsZWVwcyBpbiBhIGxvb3AuCisgICAgcHRocmVhZF90IG1UaHJlYWRUaW1lTGFwc2U7CisKKyAgICAvLyBWYXJpYWJsZSBzZXQgaW4gZGF0YUNhbGxiYWNrVGltZXN0YW1wKCkgdG8gaGVscCBza2lwQ3VycmVudEZyYW1lKCkKKyAgICAvLyB0byBrbm93IGlmIGN1cnJlbnQgZnJhbWUgbmVlZHMgdG8gYmUgc2tpcHBlZC4KKyAgICBib29sIG1Ta2lwQ3VycmVudEZyYW1lOworCisgICAgLy8gVHJ1ZSBpZiBjYW1lcmEgaXMgaW4gcHJldmlldyBtb2RlIGFuZCByZWFkeSBmb3IgdGFrZVBpY3R1cmUoKS4KKyAgICBib29sIG1DYW1lcmFJZGxlOworCisgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlKGNvbnN0IHNwPENhbWVyYT4gJmNhbWVyYSwKKyAgICAgICAgYm9vbCB1c2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSwKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgaW50MzJfdCB2aWRlb0ZyYW1lUmF0ZSk7CisKKyAgICAvLyBGb3Igc3RpbGwgY2FtZXJhIGNhc2Ugc3RhcnRzIGEgdGhyZWFkIHdoaWNoIGNhbGxzIGNhbWVyYSdzIHRha2VQaWN0dXJlKCkKKyAgICAvLyBpbiBhIGxvb3AuIEZvciB2aWRlbyBjYW1lcmEgY2FzZSwganVzdCBzdGFydHMgdGhlIGNhbWVyYSdzIHZpZGVvIHJlY29yZGluZy4KKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnRDYW1lcmFSZWNvcmRpbmcoKTsKKworICAgIC8vIEZvciBzdGlsbCBjYW1lcmEgY2FzZSBqb2lucyB0aGUgdGhyZWFkIGNyZWF0ZWQgaW4gc3RhcnRDYW1lcmFSZWNvcmRpbmcoKS4KKyAgICAvLyBGb3IgdmlkZW8gY2FtZXJhIGNhc2UsIGp1c3Qgc3RvcHMgdGhlIGNhbWVyYSdzIHZpZGVvIHJlY29yZGluZy4KKyAgICB2aXJ0dWFsIHZvaWQgc3RvcENhbWVyYVJlY29yZGluZygpOworCisgICAgLy8gRm9yIHN0aWxsIGNhbWVyYSBjYXNlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYXMgbWVtb3J5IGlzIGxvY2FsbHkKKyAgICAvLyBhbGxvY2F0ZWQgd2l0aCByZWZjb3VudGluZy4KKyAgICAvLyBGb3IgdmlkZW8gY2FtZXJhIGNhc2UganVzdCB0ZWxsIHRoZSBjYW1lcmEgdG8gcmVsZWFzZSB0aGUgZnJhbWUuCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpOworCisgICAgLy8gbVNraXBDdXJyZW50RnJhbWUgaXMgc2V0IHRvIHRydWUgaW4gZGF0YUNhbGxiYWNrVGltZXN0YW1wKCkgaWYgdGhlIGN1cnJlbnQKKyAgICAvLyBmcmFtZSBuZWVkcyB0byBiZSBza2lwcGVkIGFuZCB0aGlzIGZ1bmN0aW9uIGp1c3QgcmV0dXJucyB0aGUgdmFsdWUgb2YgbVNraXBDdXJyZW50RnJhbWUuCisgICAgdmlydHVhbCBib29sIHNraXBDdXJyZW50RnJhbWUoaW50NjRfdCB0aW1lc3RhbXBVcyk7CisKKyAgICAvLyBIYW5kbGVzIHRoZSBjYWxsYmFjayB0byBoYW5kbGUgcmF3IGZyYW1lIGRhdGEgZnJvbSB0aGUgc3RpbGwgY2FtZXJhLgorICAgIC8vIENyZWF0ZXMgYSBjb3B5IG9mIHRoZSBmcmFtZSBkYXRhIGFzIHRoZSBjYW1lcmEgY2FuIHJldXNlIHRoZSBmcmFtZSBtZW1vcnkKKyAgICAvLyBvbmNlIHRoaXMgY2FsbGJhY2sgcmV0dXJucy4gVGhlIGZ1bmN0aW9uIGFsc28gc2V0cyBhIG5ldyB0aW1zdGFtcCBjb3JyZXNwb25kaW5nCisgICAgLy8gdG8gb25lIGZyYW1lIHRpbWUgYWhlYWQgb2YgdGhlIGxhc3QgZW5jb2RlZCBmcmFtZSdzIHRpbWUgc3RhbXAuIEl0IHRoZW4KKyAgICAvLyBjYWxscyBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoKSBvZiB0aGUgYmFzZSBjbGFzcyB3aXRoIHRoZSBjb3BpZWQgZGF0YSBhbmQgdGhlCisgICAgLy8gbW9kaWZpZWQgdGltZXN0YW1wLCB3aGljaCB3aWxsIHRoaW5rIHRoYXQgaXQgcmVjaWV2ZWQgdGhlIGZyYW1lIGZyb20gYSB2aWRlbworICAgIC8vIGNhbWVyYSBhbmQgcHJvY2VlZCBhcyB1c3VhbC4KKyAgICB2aXJ0dWFsIHZvaWQgZGF0YUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpOworCisgICAgLy8gSW4gdGhlIHZpZGVvIGNhbWVyYSBjYXNlIGNhbGxzIHNraXBGcmFtZUFuZE1vZGlmeVRpbWVTdGFtcCgpIHRvIG1vZGlmeQorICAgIC8vIHRpbWVzdGFtcCBhbmQgc2V0IG1Ta2lwQ3VycmVudEZyYW1lLgorICAgIC8vIFRoZW4gaXQgY2FsbHMgdGhlIGJhc2UgQ2FtZXJhU291cmNlOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoKQorICAgIHZpcnR1YWwgdm9pZCBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywgaW50MzJfdCBtc2dUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpOworCisgICAgLy8gVGhlIHN0aWxsIGNhbWVyYSBtYXkgbm90IHN1cHBvcnQgdGhlIGRlbWFuZGVkIHZpZGVvIHdpZHRoIGFuZCBoZWlnaHQuCisgICAgLy8gV2UgbG9vayBmb3IgdGhlIHN1cHBvcnRlZCBwaWN0dXJlIHNpemVzIGZyb20gdGhlIHN0aWxsIGNhbWVyYSBhbmQKKyAgICAvLyBjaG9vc2UgdGhlIHNtYWxsZXN0IG9uZSB3aXRoIGVpdGhlciBkaW1lbnNpb25zIGhpZ2hlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nCisgICAgLy8gdmlkZW8gZGltZW5zaW9ucy4gVGhlIHN0aWxsIHBpY3R1cmUgd2lsbCBiZSBjcm9wcGVkIHRvIGdldCB0aGUgdmlkZW8gZnJhbWUuCisgICAgLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2FtZXJhIHN1cHBvcnRzIHBpY3R1cmUgc2l6ZXMgZ3JlYXRlciB0aGFuCisgICAgLy8gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCBpbiB3aWR0aCBhbmQgaGVpZ2h0LCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgc2V0UGljdHVyZVNpemVUb0Nsb3Nlc3RTdXBwb3J0ZWQoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworCisgICAgLy8gQ29tcHV0ZXMgdGhlIG9mZnNldCBvZiB0aGUgcmVjdGFuZ2xlIGZyb20gd2hlcmUgdG8gc3RhcnQgY3JvcHBpbmcgdGhlCisgICAgLy8gc3RpbGwgaW1hZ2UgaW50byB0aGUgdmlkZW8gZnJhbWUuIFdlIGNob29zZSB0aGUgY2VudGVyIG9mIHRoZSBpbWFnZSB0byBiZQorICAgIC8vIGNyb3BwZWQuIFRoZSBvZmZzZXQgaXMgc3RvcmVkIGluIChtQ3JvcFJlY3RTdGFydFgsIG1Dcm9wUmVjdFN0YXJ0WSkuCisgICAgYm9vbCBjb21wdXRlQ3JvcFJlY3RhbmdsZU9mZnNldCgpOworCisgICAgLy8gQ3JvcHMgdGhlIHNvdXJjZSBkYXRhIGludG8gYSBzbWFsbGVyIGltYWdlIHN0YXJ0aW5nIGF0CisgICAgLy8gKG1Dcm9wUmVjdFN0YXJ0WCwgbUNyb3BSZWN0U3RhcnRZKSBhbmQgb2YgdGhlIHNpemUgb2YgdGhlIHZpZGVvIGZyYW1lLgorICAgIC8vIFRoZSBkYXRhIGlzIHJldHVybmVkIGludG8gYSBuZXdseSBhbGxvY2F0ZWQgSU1lbW9yeS4KKyAgICBzcDxJTWVtb3J5PiBjcm9wWVVWSW1hZ2UoY29uc3Qgc3A8SU1lbW9yeT4gJnNvdXJjZV9kYXRhKTsKKworICAgIC8vIFdoZW4gdmlkZW8gY2FtZXJhIGlzIHVzZWQgZm9yIHRpbWUgbGFwc2UgY2FwdHVyZSwgcmV0dXJucyB0cnVlCisgICAgLy8gdW50aWwgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBmb3IgdGhlIG5leHQgdGltZSBsYXBzZSBmcmFtZS4gV2hlbgorICAgIC8vIHRoZSBmcmFtZSBuZWVkcyB0byBiZSBlbmNvZGVkLCBpdCByZXR1cm5zIGZhbHNlIGFuZCBhbHNvIG1vZGlmaWVzCisgICAgLy8gdGhlIHRpbWUgc3RhbXAgdG8gYmUgb25lIGZyYW1lIHRpbWUgYWhlYWQgb2YgdGhlIGxhc3QgZW5jb2RlZAorICAgIC8vIGZyYW1lJ3MgdGltZSBzdGFtcC4KKyAgICBib29sIHNraXBGcmFtZUFuZE1vZGlmeVRpbWVTdGFtcChpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICAvLyBXcmFwcGVyIHRvIGVudGVyIHRocmVhZFRpbWVMYXBzZUVudHJ5KCkKKyAgICBzdGF0aWMgdm9pZCAqVGhyZWFkVGltZUxhcHNlV3JhcHBlcih2b2lkICptZSk7CisKKyAgICAvLyBSdW5zIGEgbG9vcCB3aGljaCBzbGVlcHMgdW50aWwgYSBzdGlsbCBwaWN0dXJlIGlzIHJlcXVpcmVkCisgICAgLy8gYW5kIHRoZW4gY2FsbHMgbUNhbWVyYS0+dGFrZVBpY3R1cmUoKSB0byB0YWtlIHRoZSBzdGlsbCBwaWN0dXJlLgorICAgIC8vIFVzZWQgb25seSBpbiB0aGUgY2FzZSBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UgPSB0cnVlLgorICAgIHZvaWQgdGhyZWFkVGltZUxhcHNlRW50cnkoKTsKKworICAgIC8vIFdyYXBwZXIgdG8gZW50ZXIgdGhyZWFkU3RhcnRQcmV2aWV3KCkKKyAgICBzdGF0aWMgdm9pZCAqVGhyZWFkU3RhcnRQcmV2aWV3V3JhcHBlcih2b2lkICptZSk7CisKKyAgICAvLyBTdGFydHMgdGhlIGNhbWVyYSdzIHByZXZpZXcuCisgICAgdm9pZCB0aHJlYWRTdGFydFByZXZpZXcoKTsKKworICAgIC8vIFN0YXJ0cyB0aHJlYWQgVGhyZWFkU3RhcnRQcmV2aWV3V3JhcHBlcigpIGZvciByZXN0YXJ0aW5nIHByZXZpZXcuCisgICAgLy8gTmVlZHMgdG8gYmUgZG9uZSBpbiBhIHRocmVhZCBzbyB0aGF0IGRhdGFDYWxsYmFjaygpIHdoaWNoIGNhbGxzIHRoaXMgZnVuY3Rpb24KKyAgICAvLyBjYW4gcmV0dXJuLCBhbmQgdGhlIGNhbWVyYSBjYW4ga25vdyB0aGF0IHRha2VQaWN0dXJlKCkgaXMgZG9uZS4KKyAgICB2b2lkIHJlc3RhcnRQcmV2aWV3KCk7CisKKyAgICAvLyBDcmVhdGVzIGEgY29weSBvZiBzb3VyY2VfZGF0YSBpbnRvIGEgbmV3IG1lbW9yeSBvZiBmaW5hbCB0eXBlIE1lbW9yeUJhc2UuCisgICAgc3A8SU1lbW9yeT4gY3JlYXRlSU1lbW9yeUNvcHkoY29uc3Qgc3A8SU1lbW9yeT4gJnNvdXJjZV9kYXRhKTsKKworICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZShjb25zdCBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgJik7CisgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlICZvcGVyYXRvcj0oY29uc3QgQ2FtZXJhU291cmNlVGltZUxhcHNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDQU1FUkFfU09VUkNFX1RJTUVfTEFQU0VfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2VTcGxpdHRlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZVNwbGl0dGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4ZjRjMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2VTcGxpdHRlci5oCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhIHdheSB0byBzcGxpdCBhIHNpbmdsZSBtZWRpYSBzb3VyY2UgaW50byBtdWx0aXBsZSBzb3VyY2VzLgorLy8gVGhlIGNvbnN0cnVjdG9yIHRha2VzIGluIHRoZSByZWFsIG1lZGlhU291cmNlIGFuZCBjcmVhdGVDbGllbnQoKSBjYW4gdGhlbiBiZQorLy8gdXNlZCB0byBjcmVhdGUgbXVsdGlwbGUgc291cmNlcyBzZXJ2ZWQgZnJvbSB0aGlzIHJlYWwgbWVkaWFTb3VyY2UuCisvLworLy8gVXNhZ2U6CisvLyAtIENyZWF0ZSBNZWRpYVNvdXJjZVNwbGl0dGVyIGJ5IHBhc3NpbmcgaW4gYSByZWFsIG1lZGlhU291cmNlIGZyb20gd2hpY2gKKy8vIG11bHRpcGxlIGR1cGxpY2F0ZSBjaGFubmVscyBhcmUgbmVlZGVkLgorLy8gLSBDcmVhdGUgYSBjbGllbnQgdXNpbmcgY3JlYXRlQ2xpZW50KCkgYW5kIHVzZSBpdCBhcyBhbnkgb3RoZXIgbWVkaWFTb3VyY2UuCisvLworLy8gTm90ZSB0aGF0IG11bHRpcGxlIGNsaWVudHMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgY3JlYXRlQ2xpZW50KCkgYW5kCisvLyBzdGFydGVkL3N0b3BwZWQgaW4gYW55IG9yZGVyLiBNZWRpYVNvdXJjZVNwbGl0dGVyIHN0b3BzIHRoZSByZWFsIHNvdXJjZSBvbmx5CisvLyB3aGVuIGFsbCBjbGllbnRzIGhhdmUgYmVlbiBzdG9wcGVkLgorLy8KKy8vIElmIGEgbmV3IGNsaWVudCBpcyBjcmVhdGVkL3N0YXJ0ZWQgYWZ0ZXIgc29tZSBleGlzdGluZyBjbGllbnRzIGhhdmUgYWxyZWFkeQorLy8gc3RhcnRlZCwgdGhlIG5ldyBjbGllbnQgd2lsbCBzdGFydCBnZXR0aW5nIGl0cyByZWFkIGZyYW1lcyBmcm9tIHRoZSBjdXJyZW50CisvLyB0aW1lLgorCisjaWZuZGVmIE1FRElBX1NPVVJDRV9TUExJVFRFUl9IXworCisjZGVmaW5lIE1FRElBX1NPVVJDRV9TUExJVFRFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQnVmZmVyOworY2xhc3MgTWV0YURhdGE7CisKK2NsYXNzIE1lZGlhU291cmNlU3BsaXR0ZXIgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgLy8gQ29uc3RydWN0b3IKKyAgICAvLyBtZWRpYVNvdXJjZTogVGhlIHJlYWwgbWVkaWFTb3VyY2UuIFRoZSBjbGFzcyBrZWVwcyBhIHJlZmVyZW5jZSB0byBpdCB0bworICAgIC8vIGltcGxlbWVudCB0aGUgdmFyaW91cyBjbGllbnRzLgorICAgIE1lZGlhU291cmNlU3BsaXR0ZXIoc3A8TWVkaWFTb3VyY2U+IG1lZGlhU291cmNlKTsKKworICAgIH5NZWRpYVNvdXJjZVNwbGl0dGVyKCk7CisKKyAgICAvLyBDcmVhdGVzIGEgbmV3IGNsaWVudCBvZiBiYXNlIHR5cGUgTWVkaWFTb3VyY2UuIE11bHRpcGxlIGNsaWVudHMgY2FuIGJlCisgICAgLy8gY3JlYXRlZCB3aGljaCBnZXQgdGhlaXIgZGF0YSB0aHJvdWdoIHRoZSBzYW1lIHJlYWwgbWVkaWFTb3VyY2UuIFRoZXNlCisgICAgLy8gY2xpZW50cyBjYW4gdGhlbiBiZSB1c2VkIGxpa2UgYW55IG90aGVyIE1lZGlhU291cmNlLCBhbGwgb2Ygd2hpY2ggcHJvdmlkZQorICAgIC8vIGRhdGEgZnJvbSB0aGUgc2FtZSByZWFsIHNvdXJjZS4KKyAgICBzcDxNZWRpYVNvdXJjZT4gY3JlYXRlQ2xpZW50KCk7CisKK3ByaXZhdGU6CisgICAgLy8gVG90YWwgbnVtYmVyIG9mIGNsaWVudHMgY3JlYXRlZCB0aHJvdWdoIGNyZWF0ZUNsaWVudCgpLgorICAgIGludDMyX3QgbU51bWJlck9mQ2xpZW50czsKKworICAgIC8vIHJlZmVyZW5jZSB0byB0aGUgcmVhbCBNZWRpYVNvdXJjZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgorICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOworCisgICAgLy8gU3RvcmVzIHBvaW50ZXIgdG8gdGhlIE1lZGlhQnVmZmVyIHJlYWQgZnJvbSB0aGUgcmVhbCBNZWRpYVNvdXJjZS4KKyAgICAvLyBBbGwgY2xpZW50cyB1c2UgdGhpcyB0byBpbXBsZW1lbnQgdGhlIHJlYWQoKSBjYWxsLgorICAgIE1lZGlhQnVmZmVyICptTGFzdFJlYWRNZWRpYUJ1ZmZlcjsKKworICAgIC8vIFN0YXR1cyBjb2RlIGZvciByZWFkIGZyb20gdGhlIHJlYWwgTWVkaWFTb3VyY2UuIEFsbCBjbGllbnRzIHJldHVybgorICAgIC8vIHRoaXMgZm9yIHRoZWlyIHJlYWQoKS4KKyAgICBzdGF0dXNfdCBtTGFzdFJlYWRTdGF0dXM7CisKKyAgICAvLyBCb29sZWFuIHRlbGxpbmcgd2hldGhlciB0aGUgcmVhbCBNZWRpYVNvdXJjZSBoYXMgc3RhcnRlZC4KKyAgICBib29sIG1Tb3VyY2VTdGFydGVkOworCisgICAgLy8gTGlzdCBvZiBib29sZWFucywgb25lIGZvciBlYWNoIGNsaWVudCwgc3RvcmluZyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nCisgICAgLy8gY2xpZW50J3Mgc3RhcnQoKSBoYXMgYmVlbiBjYWxsZWQuCisgICAgVmVjdG9yPGJvb2w+IG1DbGllbnRzU3RhcnRlZDsKKworICAgIC8vIFN0b3JlcyB0aGUgbnVtYmVyIG9mIGNsaWVudHMgd2hpY2ggYXJlIGN1cnJlbnRseSBzdGFydGVkLgorICAgIGludDMyX3QgbU51bWJlck9mQ2xpZW50c1N0YXJ0ZWQ7CisKKyAgICAvLyBTaW5jZSBkaWZmZXJlbnQgY2xpZW50cyBjYWxsIHJlYWQoKSBhc3luY2hyb25vdXNseSwgd2UgbmVlZCB0byBrZWVwIHRyYWNrCisgICAgLy8gb2Ygd2hhdCBkYXRhIGlzIGN1cnJlbnRseSByZWFkIGludG8gdGhlIG1MYXN0UmVhZE1lZGlhQnVmZmVyLgorICAgIC8vIG1DdXJyZW50UmVhZEJpdCBzdG9yZXMgdGhlIGJpdCBmb3IgdGhlIGN1cnJlbnQgcmVhZCBidWZmZXIuIFRoaXMgYml0CisgICAgLy8gZmxpcHMgZWFjaCB0aW1lIGEgbmV3IGJ1ZmZlciBpcyByZWFkIGZyb20gdGhlIHNvdXJjZS4KKyAgICAvLyBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0IHN0b3JlcyB0aGUgYml0IGZvciB0aGUgbmV4dCBkZXNpcmVkIHJlYWQgYnVmZmVyCisgICAgLy8gZm9yIGVhY2ggY2xpZW50LiBUaGlzIGJpdCBmbGlwcyBlYWNoIHRpbWUgcmVhZCgpIGlzIGNvbXBsZXRlZCBmb3IgdGhpcworICAgIC8vIGNsaWVudC4KKyAgICBib29sIG1DdXJyZW50UmVhZEJpdDsKKyAgICBWZWN0b3I8Ym9vbD4gbUNsaWVudHNEZXNpcmVkUmVhZEJpdDsKKworICAgIC8vIE51bWJlciBvZiBjbGllbnRzIHdob3NlIGN1cnJlbnQgcmVhZCBoYXMgYmVlbiBjb21wbGV0ZWQuCisgICAgaW50MzJfdCBtTnVtYmVyT2ZDdXJyZW50UmVhZHM7CisKKyAgICAvLyBCb29sZWFuIHRlbGxpbmcgd2hldGhlciB0aGUgbGFzdCByZWFkIGhhcyBiZWVuIGNvbXBsZXRlZCBmb3IgYWxsIGNsaWVudHMuCisgICAgLy8gVGhlIHZhcmlhYmxlIGlzIHJlc2V0IHRvIGZhbHNlIGVhY2ggdGltZSBidWZmZXIgaXMgcmVhZCBmcm9tIHRoZSByZWFsCisgICAgLy8gc291cmNlLgorICAgIGJvb2wgbUxhc3RSZWFkQ29tcGxldGVkOworCisgICAgLy8gQSBnbG9iYWwgbXV0ZXggZm9yIGFjY2VzcyB0byBjcml0aWNhbCBzZWN0aW9ucy4KKyAgICBNdXRleCBtTG9jazsKKworICAgIC8vIENvbmRpdGlvbiB2YXJpYWJsZSBmb3Igd2FpdGluZyBvbiByZWFkIGZyb20gc291cmNlIHRvIGNvbXBsZXRlLgorICAgIENvbmRpdGlvbiBtUmVhZEZyb21Tb3VyY2VDb25kaXRpb247CisKKyAgICAvLyBDb25kaXRpb24gdmFyaWFibGUgZm9yIHdhaXRpbmcgb24gYWxsIGNsaWVudCdzIGxhc3QgcmVhZCB0byBjb21wbGV0ZS4KKyAgICBDb25kaXRpb24gbUFsbFJlYWRzQ29tcGxldGVDb25kaXRpb247CisKKyAgICAvLyBGdW5jdGlvbnMgdXNlZCBieSBDbGllbnQgdG8gaW1wbGVtZW50IHRoZSBNZWRpYVNvdXJjZSBpbnRlcmZhY2UuCisKKyAgICAvLyBJZiB0aGUgcmVhbCBzb3VyY2UgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgeWV0IGJ5IGFueSBjbGllbnQsIHN0YXJ0cyBpdC4KKyAgICBzdGF0dXNfdCBzdGFydChpbnQgY2xpZW50SWQsIE1ldGFEYXRhICpwYXJhbXMpOworCisgICAgLy8gU3RvcHMgdGhlIHJlYWwgc291cmNlIGFmdGVyIGFsbCBjbGllbnRzIGhhdmUgY2FsbGVkIHN0b3AoKS4KKyAgICBzdGF0dXNfdCBzdG9wKGludCBjbGllbnRJZCk7CisKKyAgICAvLyByZXR1cm5zIHRoZSByZWFsIHNvdXJjZSdzIGdldEZvcm1hdCgpLgorICAgIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoaW50IGNsaWVudElkKTsKKworICAgIC8vIElmIHRoZSBjbGllbnQncyBkZXNpcmVkIGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIHJlYWQgaW50bworICAgIC8vIG1MYXN0UmVhZE1lZGlhQnVmZmVyLCBwb2ludHMgdGhlIGJ1ZmZlciB0byB0aGF0LiBPdGhlcndpc2UgaWYgaXQgaXMgdGhlCisgICAgLy8gbWFzdGVyIGNsaWVudCwgcmVhZHMgdGhlIGJ1ZmZlciBmcm9tIHNvdXJjZSBvciBlbHNlIHdhaXRzIGZvciB0aGUgbWFzdGVyCisgICAgLy8gY2xpZW50IHRvIHJlYWQgdGhlIGJ1ZmZlciBhbmQgdXNlcyB0aGF0LgorICAgIHN0YXR1c190IHJlYWQoaW50IGNsaWVudElkLAorICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworCisgICAgLy8gTm90IGltcGxlbWVudGVkIHJpZ2h0IG5vdy4KKyAgICBzdGF0dXNfdCBwYXVzZShpbnQgY2xpZW50SWQpOworCisgICAgLy8gRnVuY3Rpb24gd2hpY2ggcmVhZHMgYSBidWZmZXIgZnJvbSB0aGUgcmVhbCBzb3VyY2UgaW50bworICAgIC8vIG1MYXN0UmVhZE1lZGlhQnVmZmVyCisgICAgdm9pZCByZWFkRnJvbVNvdXJjZV9sb2NrKGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisKKyAgICAvLyBXYWl0cyB1bnRpbCByZWFkIGZyb20gdGhlIHJlYWwgc291cmNlIGhhcyBiZWVuIGNvbXBsZXRlZC4KKyAgICAvLyBfbG9jayBtZWFucyB0aGF0IHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIHRocmVhZCBoYXMgYWxyZWFkeQorICAgIC8vIG9idGFpbmVkIHRoZSBsb2NrIGZvciB0aGUgbXV0ZXggbUxvY2suCisgICAgdm9pZCB3YWl0Rm9yUmVhZEZyb21Tb3VyY2VfbG9jayhpbnQzMl90IGNsaWVudElkKTsKKworICAgIC8vIFdhaXRzIHVudGlsIGFsbCBjbGllbnRzIGhhdmUgcmVhZCB0aGUgY3VycmVudCBidWZmZXIgaW4KKyAgICAvLyBtTGFzdFJlYWRDb21wbGV0ZWQuCisgICAgdm9pZCB3YWl0Rm9yQWxsQ2xpZW50c0xhc3RSZWFkX2xvY2soaW50MzJfdCBjbGllbnRJZCk7CisKKyAgICAvLyBFYWNoIGNsaWVudCBjYWxscyB0aGlzIGFmdGVyIGl0IGNvbXBsZXRlcyBpdHMgcmVhZCgpLiBPbmNlIGFsbCBjbGllbnRzCisgICAgLy8gaGF2ZSBjYWxsZWQgdGhpcyBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyLCB0aGUgZnVuY3Rpb24gY2FsbHMKKyAgICAvLyBtQWxsUmVhZHNDb21wbGV0ZUNvbmRpdGlvbi5icm9hZGNhc3QoKSB0byBzaWduYWwgdGhlIHdhaXRpbmcgY2xpZW50cy4KKyAgICB2b2lkIHNpZ25hbFJlYWRDb21wbGV0ZV9sb2NrKGJvb2wgcmVhZEFib3J0ZWQpOworCisgICAgLy8gTWFrZSB0aGVzZSBjb25zdHJ1Y3RvcnMgcHJpdmF0ZS4KKyAgICBNZWRpYVNvdXJjZVNwbGl0dGVyKCk7CisgICAgTWVkaWFTb3VyY2VTcGxpdHRlcihjb25zdCBNZWRpYVNvdXJjZVNwbGl0dGVyICYpOworICAgIE1lZGlhU291cmNlU3BsaXR0ZXIgJm9wZXJhdG9yPShjb25zdCBNZWRpYVNvdXJjZVNwbGl0dGVyICYpOworCisgICAgLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBNZWRpYVNvdXJjZSBpbnRlcmZhY2UuIEVhY2ggY2xpZW50IHN0b3JlcyBhCisgICAgLy8gcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgTWVkaWFTb3VyY2VTcGxpdHRlciBhbmQgdXNlcyBpdCB0byBjb21wbGV0ZSB0aGUKKyAgICAvLyB2YXJpb3VzIGNhbGxzLgorICAgIGNsYXNzIENsaWVudCA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CisgICAgcHVibGljOgorICAgICAgICAvLyBDb25zdHJ1Y3RvciBzdG9yZXMgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgTWVkaWFTb3VyY2VTcGxpdHRlciBhbmQgaXQKKyAgICAgICAgLy8gY2xpZW50IGlkLgorICAgICAgICBDbGllbnQoc3A8TWVkaWFTb3VyY2VTcGxpdHRlcj4gc3BsaXR0ZXIsIGludDMyX3QgY2xpZW50SWQpOworCisgICAgICAgIC8vIE1lZGlhU291cmNlIGludGVyZmFjZQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gUmVmZXJuY2UgdG8gdGhlIHBhcmVudCBNZWRpYVNvdXJjZVNwbGl0dGVyCisgICAgICAgIHNwPE1lZGlhU291cmNlU3BsaXR0ZXI+IG1TcGxpdHRlcjsKKworICAgICAgICAvLyBJZCBvZiB0aGlzIGNsaWVudC4KKyAgICAgICAgaW50MzJfdCBtQ2xpZW50SWQ7CisgICAgfTsKKworICAgIGZyaWVuZCBjbGFzcyBDbGllbnQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX1NPVVJDRV9TUExJVFRFUl9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb1NvdXJjZURvd25TYW1wbGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvU291cmNlRG93blNhbXBsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzk5MThjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb1NvdXJjZURvd25TYW1wbGVyLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFZpZGVvU291cmNlRG93blNhbXBsZXIgaW1wbGVtZW50cyB0aGUgTWVkaWFTb3VyY2UgaW50ZXJmYWNlLAorLy8gZG93bnNhbXBsaW5nIGZyYW1lcyBwcm92aWRlZCBmcm9tIGEgcmVhbCB2aWRlbyBzb3VyY2UuCisKKyNpZm5kZWYgVklERU9fU09VUkNFX0RPV05fU0FNUExFUl9IXworCisjZGVmaW5lIFZJREVPX1NPVVJDRV9ET1dOX1NBTVBMRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElNZW1vcnk7CitjbGFzcyBNZWRpYUJ1ZmZlcjsKK2NsYXNzIE1ldGFEYXRhOworCitjbGFzcyBWaWRlb1NvdXJjZURvd25TYW1wbGVyIDogcHVibGljIE1lZGlhU291cmNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5WaWRlb1NvdXJjZURvd25TYW1wbGVyKCk7CisKKyAgICAvLyBDb25zdHJ1Y3RvcjoKKyAgICAvLyB2aWRlb1NvdXJjZTogVGhlIHJlYWwgdmlkZW8gc291cmNlIHdoaWNoIHByb3ZpZGVzIHRoZSBvcmlnaW5hbCBmcmFtZXMuCisgICAgLy8gd2lkdGgsIGhlaWdodDogVGhlIGRlc2lyZWQgd2lkdGgsIGhlaWdodC4gVGhlc2Ugc2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbAorICAgIC8vIHRvIHRob3NlIG9mIHRoZSByZWFsIHZpZGVvIHNvdXJjZS4gV2UgdGhlbiBkb3duc2FtcGxlIHRoZSBvcmlnaW5hbCBmcmFtZXMgdG8KKyAgICAvLyB0aGlzIHNpemUuCisgICAgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnZpZGVvU291cmNlLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisKKyAgICAvLyBNZWRpYVNvdXJjZSBpbnRlcmZhY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKworcHJpdmF0ZToKKyAgICAvLyBSZWZlcmVuY2UgdG8gdGhlIHJlYWwgdmlkZW8gc291cmNlLgorICAgIHNwPE1lZGlhU291cmNlPiBtUmVhbFZpZGVvU291cmNlOworCisgICAgLy8gU2l6ZSBvZiBmcmFtZXMgdG8gYmUgcHJvdmlkZWQgYnkgdGhpcyBzb3VyY2UuCisgICAgaW50MzJfdCBtV2lkdGg7CisgICAgaW50MzJfdCBtSGVpZ2h0OworCisgICAgLy8gU2l6ZSBvZiBmcmFtZXMgcHJvdmlkZWQgYnkgdGhlIHJlYWwgc291cmNlLgorICAgIGludDMyX3QgbVJlYWxTb3VyY2VXaWR0aDsKKyAgICBpbnQzMl90IG1SZWFsU291cmNlSGVpZ2h0OworCisgICAgLy8gRG93biBzYW1wbGluZyBwYXJhbXRlcnMuCisgICAgaW50MzJfdCBtRG93blNhbXBsZU9mZnNldFg7CisgICAgaW50MzJfdCBtRG93blNhbXBsZU9mZnNldFk7CisgICAgaW50MzJfdCBtRG93blNhbXBsZVNraXBYOworICAgIGludDMyX3QgbURvd25TYW1wbGVTa2lwWTsKKworICAgIC8vIFRydWUgaWYgd2UgbmVlZCB0byBjcm9wIHRoZSBzdGlsbCB2aWRlbyBpbWFnZSB0byBnZXQgdGhlIHZpZGVvIGZyYW1lLgorICAgIGJvb2wgbU5lZWREb3duU2FtcGxpbmc7CisKKyAgICAvLyBNZXRhIGRhdGEuIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSByZWFsIHNvdXJjZSBleGNlcHQgZm9yIHRoZSB3aWR0aCBhbmQKKyAgICAvLyBoZWlnaHQgcGFyYW1ldGVycy4KKyAgICBzcDxNZXRhRGF0YT4gbU1ldGE7CisKKyAgICAvLyBDb21wdXRlcyB0aGUgb2Zmc2V0LCBza2lwIHBhcmFtZXRlcnMgZm9yIGRvd25zYW1wbGluZyB0aGUgb3JpZ2luYWwgZnJhbWUKKyAgICAvLyB0byB0aGUgZGVzaXJlZCBzaXplLgorICAgIHZvaWQgY29tcHV0ZURvd25TYW1wbGluZ1BhcmFtZXRlcnMoKTsKKworICAgIC8vIERvd25zYW1wbGVzIHRoZSBmcmFtZSBpbiBzb3VyY2VCdWZmZXIgdG8gc2l6ZSAobVdpZHRoIHggbUhlaWdodCkuIEEgbmV3CisgICAgLy8gYnVmZmVyIGlzIGNyZWF0ZWQgd2hpY2ggc3RvcmVzIHRoZSBkb3duc2FtcGxlZCBpbWFnZS4KKyAgICB2b2lkIGRvd25TYW1wbGVZVVZJbWFnZShjb25zdCBNZWRpYUJ1ZmZlciAmc291cmNlQnVmZmVyLCBNZWRpYUJ1ZmZlciAqKmJ1ZmZlcikgY29uc3Q7CisKKyAgICAvLyBEaXNhbGxvdyB0aGVzZS4KKyAgICBWaWRlb1NvdXJjZURvd25TYW1wbGVyKGNvbnN0IFZpZGVvU291cmNlRG93blNhbXBsZXIgJik7CisgICAgVmlkZW9Tb3VyY2VEb3duU2FtcGxlciAmb3BlcmF0b3I9KGNvbnN0IFZpZGVvU291cmNlRG93blNhbXBsZXIgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFZJREVPX1NPVVJDRV9ET1dOX1NBTVBMRVJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvWVVWQ2FudmFzLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1lVVkNhbnZhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNzA5MjMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1lVVkNhbnZhcy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBZVVZDYW52YXMgaG9sZHMgYSByZWZlcmVuY2UgdG8gYSBZVVZJbWFnZSBvbiB3aGljaCBpdCBjYW4gZG8gdmFyaW91cworLy8gZHJhd2luZyBvcGVyYXRpb25zLiBJdCBwcm92aWRlcyB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBmaWxsaW5nLAorLy8gY3JvcHBpbmcsIGV0Yy4KKworCisjaWZuZGVmIFlVVl9DQU5WQVNfSF8KKworI2RlZmluZSBZVVZfQ0FOVkFTX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBZVVZJbWFnZTsKK2NsYXNzIFJlY3Q7CisKK2NsYXNzIFlVVkNhbnZhcyB7CitwdWJsaWM6CisKKyAgICAvLyBDb25zdHJ1Y3RvciB0YWtlcyBpbiByZWZlcmVuY2UgdG8gYSB5dXZJbWFnZSBvbiB3aGljaCBpdCBjYW4gZG8KKyAgICAvLyB2YXJpb3VzIGRyYXdpbmcgb3ByZWF0aW9ucy4KKyAgICBZVVZDYW52YXMoWVVWSW1hZ2UgJnl1dkltYWdlKTsKKyAgICB+WVVWQ2FudmFzKCk7CisKKyAgICAvLyBGaWxscyB0aGUgZW50aXJlIGltYWdlIHdpdGggdGhlIGdpdmVuIFlVViB2YWx1ZXMuCisgICAgdm9pZCBGaWxsWVVWKHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUpOworCisgICAgLy8gRmlsbHMgdGhlIHJlY3Rhbmd1bGFyIHJlZ2lvbiBbc3RhcnRYLGVuZFhdeFtzdGFydFksZW5kWV0gd2l0aCB0aGUgZ2l2ZW4gWVVWIHZhbHVlcy4KKyAgICB2b2lkIEZpbGxZVVZSZWN0YW5nbGUoY29uc3QgUmVjdCYgcmVjdCwKKyAgICAgICAgICAgIHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUpOworCisgICAgLy8gQ29waWVzIHRoZSByZWdpb24gW3N0YXJ0WCxlbmRYXXhbc3RhcnRZLGVuZFldIGZyb20gc3JjSW1hZ2UgaW50byB0aGUKKyAgICAvLyBjYW52YXMnIHRhcmdldCBpbWFnZSAobVlVVkltYWdlKSBzdGFydGluZyBhdAorICAgIC8vIChkZXN0aW5hdGlvblN0YXJ0WCxkZXN0aW5hdGlvblN0YXJ0WSkuCisgICAgLy8gTm90ZSB0aGF0IHVuZGVmaW5lZCBiZWhhdmlvciBtYXkgb2NjdXIgaWYgc3JjSW1hZ2UgaXMgc2FtZSBhcyB0aGUgY2FudmFzJworICAgIC8vIHRhcmdldCBpbWFnZS4KKyAgICB2b2lkIENvcHlJbWFnZVJlY3QoCisgICAgICAgICAgICBjb25zdCBSZWN0JiBzcmNSZWN0LAorICAgICAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UpOworCisgICAgLy8gRG93bnNhbXBsZXMgdGhlIHNyY0ltYWdlIGludG8gdGhlIGNhbnZhcycgdGFyZ2V0IGltYWdlIChtWVVWSW1hZ2UpCisgICAgLy8gVGhlIGRvd25zYW1wbGluZyBjb3BpZXMgcGl4ZWxzIGZyb20gdGhlIHNvdXJjZSBpbWFnZSBzdGFydGluZyBhdAorICAgIC8vIChzcmNPZmZzZXRYLCBzcmNPZmZzZXRZKSB0byB0aGUgdGFyZ2V0IGltYWdlLCBzdGFydGluZyBhdCAoMCwgMCkuCisgICAgLy8gRm9yIGVhY2ggWCBpbmNyZW1lbnQgaW4gdGhlIHRhcmdldCBpbWFnZSwgc2tpcFggcGl4ZWxzIGFyZSBza2lwcGVkCisgICAgLy8gaW4gdGhlIHNvdXJjZSBpbWFnZS4KKyAgICAvLyBTaW1pbGFybHkgZm9yIGVhY2ggWSBpbmNyZW1lbnQgaW4gdGhlIHRhcmdldCBpbWFnZSwgc2tpcFkgcGl4ZWxzCisgICAgLy8gYXJlIHNraXBwZWQgaW4gdGhlIHNvdXJjZSBpbWFnZS4KKyAgICB2b2lkIGRvd25zYW1wbGUoCisgICAgICAgICAgICBpbnQzMl90IHNyY09mZnNldFgsIGludDMyX3Qgc3JjT2Zmc2V0WSwKKyAgICAgICAgICAgIGludDMyX3Qgc2tpcFgsIGludDMyX3Qgc2tpcFksCisgICAgICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UpOworCitwcml2YXRlOgorICAgIFlVVkltYWdlJiBtWVVWSW1hZ2U7CisKKyAgICBZVVZDYW52YXMoY29uc3QgWVVWQ2FudmFzICYpOworICAgIFlVVkNhbnZhcyAmb3BlcmF0b3I9KGNvbnN0IFlVVkNhbnZhcyAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gWVVWX0NBTlZBU19IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ZVVZJbWFnZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ZVVZJbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOTg2MTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1lVVkltYWdlLmgKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBBIGNvbnRhaW5lciBjbGFzcyB0byBob2xkIFlVViBkYXRhIGFuZCBwcm92aWRlIHZhcmlvdXMgdXRpbGl0aWVzLAorLy8gZS5nLiB0byBzZXQvZ2V0IHBpeGVsIHZhbHVlcy4KKy8vIFN1cHBvcnRlZCBmb3JtYXRzOgorLy8gIC0gWVVWNDIwIFBsYW5hcgorLy8gIC0gWVVWNDIwIFNlbWkgUGxhbmFyCisvLworLy8gIEN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IHZhcmlhYmxlIHN0cmlkZXMuCisvLworLy8gIEltcGxlbWVudGF0aW9uOiBUd28gc2ltcGxlIGFic3RyYWN0aW9ucyBhcmUgZG9uZSB0byBzaW1wbGlmeSBhY2Nlc3MKKy8vICB0byBZVVYgY2hhbm5lbHMgZm9yIGRpZmZlcmVudCBmb3JtYXRzOgorLy8gIC0gaW5pdGlhbGl6ZVlVVlBvaW50ZXJzKCkgc2V0cyB1cCBwb2ludGVycyAobVlkYXRhLCBtVWRhdGEsIG1WZGF0YSkgdG8KKy8vICBwb2ludCB0byB0aGUgcmlnaHQgc3RhcnQgbG9jYXRpb25zIG9mIHRoZSBkaWZmZXJlbnQgY2hhbm5lbCBkYXRhIGRlcGVuZGluZworLy8gIG9uIHRoZSBmb3JtYXQuCisvLyAgLSBnZXRPZmZzZXRzKCkgcmV0dXJucyB0aGUgY29ycmVjdCBvZmZzZXQgZm9yIHRoZSBkaWZmZXJlbnQgY2hhbm5lbHMKKy8vICBkZXBlbmRpbmcgb24gdGhlIGZvcm1hdC4KKy8vICBMb2NhdGlvbiBvZiBhbnkgcGl4ZWwncyBZVVYgY2hhbm5lbHMgY2FuIHRoZW4gYmUgZWFzaWx5IGNvbXB1dGVkIHVzaW5nIHRoZXNlLgorLy8KKworI2lmbmRlZiBZVVZfSU1BR0VfSF8KKworI2RlZmluZSBZVVZfSU1BR0VfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGNzdHJpbmc+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgUmVjdDsKKworY2xhc3MgWVVWSW1hZ2UgeworcHVibGljOgorICAgIC8vIFN1cHBvcnRlZCBZVVYgZm9ybWF0cworICAgIGVudW0gWVVWRm9ybWF0IHsKKyAgICAgICAgWVVWNDIwUGxhbmFyLAorICAgICAgICBZVVY0MjBTZW1pUGxhbmFyCisgICAgfTsKKworICAgIC8vIENvbnN0cnVjdHMgYW4gaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4gc2l6ZSwgZm9ybWF0LiBBbHNvIGFsbG9jYXRlcyBhbmQgb3ducworICAgIC8vIHRoZSByZXF1aXJlZCBtZW1vcnkuCisgICAgWVVWSW1hZ2UoWVVWRm9ybWF0IHl1dkZvcm1hdCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworCisgICAgLy8gQ29uc3RydWN0cyBhbiBpbWFnZSB3aXRoIHRoZSBnaXZlbiBzaXplLCBmb3JtYXQuIFRoZSBtZW1vcnkgaXMgcHJvdmlkZWQKKyAgICAvLyBieSB0aGUgY2FsbGVyIGFuZCB3ZSBkb24ndCBvd24gaXQuCisgICAgWVVWSW1hZ2UoWVVWRm9ybWF0IHl1dkZvcm1hdCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIHVpbnQ4X3QgKmJ1ZmZlcik7CisKKyAgICAvLyBEZXN0cnVjdG9yIHRvIGRlbGV0ZSB0aGUgbWVtb3J5IGlmIGl0IG93bnMgaXQuCisgICAgfllVVkltYWdlKCk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIFlVViBkYXRhIGZvciB0aGUgZ2l2ZW4KKyAgICAvLyBmb3JtYXQgYW5kIGdlb21ldHJ5LiBVc2VmdWwgd2hlbiB0aGUgY2FsbGVyIHdhbnRzIHRvIGFsbG9jYXRlIHRoZSByZXF1aXNpdGUKKyAgICAvLyBtZW1vcnkuCisgICAgc3RhdGljIHNpemVfdCBidWZmZXJTaXplKFlVVkZvcm1hdCB5dXZGb3JtYXQsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKworICAgIGludDMyX3Qgd2lkdGgoKSBjb25zdCB7cmV0dXJuIG1XaWR0aDt9CisgICAgaW50MzJfdCBoZWlnaHQoKSBjb25zdCB7cmV0dXJuIG1IZWlnaHQ7fQorCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHBpeGVsIGlzIHRoZSByYW5nZSBbMCwgd2lkdGgtMV0geCBbMCwgaGVpZ2h0LTFdCisgICAgLy8gYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIHZhbGlkUGl4ZWwoaW50MzJfdCB4LCBpbnQzMl90IHkpIGNvbnN0OworCisgICAgLy8gR2V0IHRoZSBwaXhlbCBZVVYgdmFsdWUgYXQgcGl4ZWwgKHgseSkuCisgICAgLy8gTm90ZSB0aGF0IHRoZSByYW5nZSBvZiB4IGlzIFswLCB3aWR0aC0xXSBhbmQgdGhlIHJhbmdlIG9mIHkgaXMgWzAsIGhlaWdodC0xXS4KKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgZ2V0IHdhcyBzdWNjZXNzZnVsIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCBnZXRQaXhlbFZhbHVlKGludDMyX3QgeCwgaW50MzJfdCB5LAorICAgICAgICAgICAgdWludDhfdCAqeVB0ciwgdWludDhfdCAqdVB0ciwgdWludDhfdCAqdlB0cikgY29uc3Q7CisKKyAgICAvLyBTZXQgdGhlIHBpeGVsIFlVViB2YWx1ZSBhdCBwaXhlbCAoeCx5KS4KKyAgICAvLyBOb3RlIHRoYXQgdGhlIHJhbmdlIG9mIHggaXMgWzAsIHdpZHRoLTFdIGFuZCB0aGUgcmFuZ2Ugb2YgeSBpcyBbMCwgaGVpZ2h0LTFdLgorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBzZXQgd2FzIHN1Y2Nlc3NmdWwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIHNldFBpeGVsVmFsdWUoaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgICAgICB1aW50OF90IHlWYWx1ZSwgdWludDhfdCB1VmFsdWUsIHVpbnQ4X3QgdlZhbHVlKTsKKworICAgIC8vIFVzZXMgbWVtY3B5IHRvIGNvcHkgYW4gZW50aXJlIHJvdyBvZiBkYXRhCisgICAgc3RhdGljIHZvaWQgZmFzdENvcHlSZWN0YW5nbGU0MjBQbGFuYXIoCisgICAgICAgICAgICBjb25zdCBSZWN0JiBzcmNSZWN0LAorICAgICAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UsIFlVVkltYWdlICZkZXN0SW1hZ2UpOworCisgICAgLy8gVXNlcyBtZW1jcHkgdG8gY29weSBhbiBlbnRpcmUgcm93IG9mIGRhdGEKKyAgICBzdGF0aWMgdm9pZCBmYXN0Q29weVJlY3RhbmdsZTQyMFNlbWlQbGFuYXIoCisgICAgICAgICAgICBjb25zdCBSZWN0JiBzcmNSZWN0LAorICAgICAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UsIFlVVkltYWdlICZkZXN0SW1hZ2UpOworCisgICAgLy8gVHJpZXMgdG8gdXNlIG1lbWNvcHkgdG8gY29weSBlbnRpcmUgcm93cyBvZiBkYXRhLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgZmFzdCBjb3B5IGlzIG5vdCBwb3NzaWJsZSBmb3IgdGhlIHBhc3NlZCBpbWFnZSBmb3JtYXRzLgorICAgIHN0YXRpYyBib29sIGZhc3RDb3B5UmVjdGFuZ2xlKAorICAgICAgICAgICAgY29uc3QgUmVjdCYgc3JjUmVjdCwKKyAgICAgICAgICAgIGludDMyX3QgZGVzdFN0YXJ0WCwgaW50MzJfdCBkZXN0U3RhcnRZLAorICAgICAgICAgICAgY29uc3QgWVVWSW1hZ2UgJnNyY0ltYWdlLCBZVVZJbWFnZSAmZGVzdEltYWdlKTsKKworICAgIC8vIENvbnZlcnQgdGhlIGdpdmVuIFlVViB2YWx1ZSB0byBSR0IuCisgICAgdm9pZCB5dXYycmdiKHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUsCisgICAgICAgIHVpbnQ4X3QgKnIsIHVpbnQ4X3QgKmcsIHVpbnQ4X3QgKmIpIGNvbnN0OworCisgICAgLy8gV3JpdGUgdGhlIGltYWdlIHRvIGEgaHVtYW4gcmVhZGFibGUgUFBNIGZpbGUuCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHdyaXRlIHdhcyBzdWNjZXNmdWwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIHdyaXRlVG9QUE0oY29uc3QgY2hhciAqZmlsZW5hbWUpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8vIFlVViBGb3JtYXQgb2YgdGhlIGltYWdlLgorICAgIFlVVkZvcm1hdCBtWVVWRm9ybWF0OworCisgICAgaW50MzJfdCBtV2lkdGg7CisgICAgaW50MzJfdCBtSGVpZ2h0OworCisgICAgLy8gUG9pbnRlciB0byB0aGUgbWVtb3J5IGJ1ZmZlci4KKyAgICB1aW50OF90ICptQnVmZmVyOworCisgICAgLy8gQm9vbGVhbiB0ZWxsaW5nIHdoZXRoZXIgd2Ugb3duIHRoZSBtZW1vcnkgYnVmZmVyLgorICAgIGJvb2wgbU93bkJ1ZmZlcjsKKworICAgIC8vIFBvaW50ZXIgdG8gc3RhcnQgb2YgdGhlIFkgZGF0YSBwbGFuZS4KKyAgICB1aW50OF90ICptWWRhdGE7CisKKyAgICAvLyBQb2ludGVyIHRvIHN0YXJ0IG9mIHRoZSBVIGRhdGEgcGxhbmUuIE5vdGUgdGhhdCBpbiBjYXNlIG9mIGludGVybGVhdmVkIGZvcm1hdHMgbGlrZQorICAgIC8vIFlVVjQyMCBzZW1pcGxhbmFyLCBtVWRhdGEgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgVSBkYXRhIGluIHRoZSBVViBwbGFuZS4KKyAgICB1aW50OF90ICptVWRhdGE7CisKKyAgICAvLyBQb2ludGVyIHRvIHN0YXJ0IG9mIHRoZSBWIGRhdGEgcGxhbmUuIE5vdGUgdGhhdCBpbiBjYXNlIG9mIGludGVybGVhdmVkIGZvcm1hdHMgbGlrZQorICAgIC8vIFlVVjQyMCBzZW1pcGxhbmFyLCBtVmRhdGEgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgViBkYXRhIGluIHRoZSBVViBwbGFuZS4KKyAgICB1aW50OF90ICptVmRhdGE7CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBwb2ludGVycyBtWWRhdGEsIG1VZGF0YSwgbVZkYXRhIHRvIHBvaW50IHRvIHRoZSByaWdodCBsb2NhdGlvbnMgZm9yCisgICAgLy8gdGhlIGdpdmVuIGZvcm1hdCBhbmQgZ2VvbWV0cnkuCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGluaXRpYWxpemUgd2FzIHN1Y2Nlc2Z1bCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgaW5pdGlhbGl6ZVlVVlBvaW50ZXJzKCk7CisKKyAgICAvLyBGb3IgdGhlIGdpdmVuIHBpeGVsIGxvY2F0aW9uLCB0aGlzIHJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgbG9jYXRpb24gb2YgeSwgdSBhbmQgdgorICAgIC8vIGRhdGEgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBiYXNlIHBvaW50ZXJzIC0tIG1ZZGF0YSwgbVVkYXRhLCBtVmRhdGEuCisgICAgLy8gTm90ZSB0aGF0IHRoZSByYW5nZSBvZiB4IGlzIFswLCB3aWR0aC0xXSBhbmQgdGhlIHJhbmdlIG9mIHkgaXMgWzAsIGhlaWdodC0xXS4KKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgZ2V0dGluZyBvZmZzZXRzIHdhcyBzdWNjZXNmdWwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIGdldE9mZnNldHMoaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgIGludDMyX3QgKnlPZmZzZXQsIGludDMyX3QgKnVPZmZzZXQsIGludDMyX3QgKnZPZmZzZXQpIGNvbnN0OworCisgICAgLy8gUmV0dXJucyB0aGUgb2Zmc2V0IGluY3JlbWVudHMgaW5jdXJyZWQgaW4gZ29pbmcgZnJvbSBvbmUgZGF0YSByb3cgdG8gdGhlIG5leHQgZGF0YSByb3cKKyAgICAvLyBmb3IgdGhlIFlVViBjaGFubmVscy4gTm90ZSB0aGF0IHRoaXMgY29ycmVzcG9uZHMgdG8gZGF0YSByb3dzIGFuZCBub3QgcGl4ZWwgcm93cy4KKyAgICAvLyBFLmcuIGRlcGVuZGluZyBvbiBmb3JtYXRzLCBVL1YgY2hhbm5lbHMgbWF5IGhhdmUgb25seSBvbmUgZGF0YSByb3cgY29ycmVzcG9uZGluZworICAgIC8vIHRvIHR3byBwaXhlbCByb3dzLgorICAgIGJvb2wgZ2V0T2Zmc2V0SW5jcmVtZW50c1BlckRhdGFSb3coCisgICAgICAgIGludDMyX3QgKnlEYXRhT2Zmc2V0SW5jcmVtZW50LAorICAgICAgICBpbnQzMl90ICp1RGF0YU9mZnNldEluY3JlbWVudCwKKyAgICAgICAgaW50MzJfdCAqdkRhdGFPZmZzZXRJbmNyZW1lbnQpIGNvbnN0OworCisgICAgLy8gR2l2ZW4gdGhlIG9mZnNldCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCdzIGRhdGEuCisgICAgdWludDhfdCogZ2V0WUFkZHJlc3MoaW50MzJfdCBvZmZzZXQpIGNvbnN0OworICAgIHVpbnQ4X3QqIGdldFVBZGRyZXNzKGludDMyX3Qgb2Zmc2V0KSBjb25zdDsKKyAgICB1aW50OF90KiBnZXRWQWRkcmVzcyhpbnQzMl90IG9mZnNldCkgY29uc3Q7CisKKyAgICAvLyBHaXZlbiB0aGUgcGl4ZWwgbG9jYXRpb24sIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCdzIGRhdGEuCisgICAgLy8gTm90ZSB0aGF0IHRoZSByYW5nZSBvZiB4IGlzIFswLCB3aWR0aC0xXSBhbmQgdGhlIHJhbmdlIG9mIHkgaXMgWzAsIGhlaWdodC0xXS4KKyAgICBib29sIGdldFlVVkFkZHJlc3NlcyhpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgdWludDhfdCAqKnlBZGRyLCB1aW50OF90ICoqdUFkZHIsIHVpbnQ4X3QgKip2QWRkcikgY29uc3Q7CisKKyAgICAvLyBEaXNhbGxvdyBpbXBsaWNpdCBjYXN0aW5nIGFuZCBjb3B5aW5nLgorICAgIFlVVkltYWdlKGNvbnN0IFlVVkltYWdlICYpOworICAgIFlVVkltYWdlICZvcGVyYXRvcj0oY29uc3QgWVVWSW1hZ2UgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFlVVl9JTUFHRV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zdXJmYWNlZmxpbmdlci9TdXJmYWNlLmggYi9pbmNsdWRlL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaAppbmRleCA3YzVhMzliLi5hMjEwODgwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaAorKysgYi9pbmNsdWRlL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaApAQCAtOTQsNyArOTQsNyBAQAogICAgIGZyaWVuZCBjbGFzcyBTdXJmYWNlQ29tcG9zZXJDbGllbnQ7CiAKICAgICAvLyBjYW1lcmEgYW5kIGNhbWNvcmRlciBuZWVkIGFjY2VzcyB0byB0aGUgSVN1cmZhY2UgYmluZGVyIGludGVyZmFjZSBmb3IgcHJldmlldwotICAgIGZyaWVuZCBjbGFzcyBDYW1lcmE7CisgICAgZnJpZW5kIGNsYXNzIENhbWVyYVNlcnZpY2U7CiAgICAgZnJpZW5kIGNsYXNzIE1lZGlhUmVjb3JkZXI7CiAgICAgLy8gbWVkaWFwbGF5ZXIgbmVlZHMgYWNjZXNzIHRvIElTdXJmYWNlIGZvciBkaXNwbGF5CiAgICAgZnJpZW5kIGNsYXNzIE1lZGlhUGxheWVyOwpAQCAtMTczLDExICsxNzMsMTIgQEAKICAgICAgKiAoZXZlbnR1YWxseSB0aGlzIHNob3VsZCBnbyBhd2F5IGFuZCBiZSByZXBsYWNlZCBieSBwcm9wZXIgQVBJcykKICAgICAgKi8KICAgICAvLyBjYW1lcmEgYW5kIGNhbWNvcmRlciBuZWVkIGFjY2VzcyB0byB0aGUgSVN1cmZhY2UgYmluZGVyIGludGVyZmFjZSBmb3IgcHJldmlldwotICAgIGZyaWVuZCBjbGFzcyBDYW1lcmE7CisgICAgZnJpZW5kIGNsYXNzIENhbWVyYVNlcnZpY2U7CiAgICAgZnJpZW5kIGNsYXNzIE1lZGlhUmVjb3JkZXI7CiAgICAgLy8gTWVkaWFQbGF5ZXIgbmVlZHMgYWNjZXNzIHRvIElTdXJmYWNlIGZvciBkaXNwbGF5CiAgICAgZnJpZW5kIGNsYXNzIE1lZGlhUGxheWVyOwogICAgIGZyaWVuZCBjbGFzcyBJT01YOworICAgIGZyaWVuZCBjbGFzcyBTb2Z0d2FyZVJlbmRlcmVyOwogICAgIC8vIHRoaXMgaXMganVzdCB0byBiZSBhYmxlIHRvIHdyaXRlIHNvbWUgdW5pdCB0ZXN0cwogICAgIGZyaWVuZCBjbGFzcyBUZXN0OwogCkBAIC0zMTIsNCArMzEzLDMgQEAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBBTkRST0lEX1NGX1NVUkZBQ0VfSAotCmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9BbmRyb2lkLm1rIGIvbGlicy9iaW5kZXIvQW5kcm9pZC5tawppbmRleCAxM2RjNTAwLi5mOWQ5ZjI1IDEwMDY0NAotLS0gYS9saWJzL2JpbmRlci9BbmRyb2lkLm1rCisrKyBiL2xpYnMvYmluZGVyL0FuZHJvaWQubWsKQEAgLTE2LDYgKzE2LDcgQEAKIHNvdXJjZXMgOj0gXAogICAgIEJpbmRlci5jcHAgXAogICAgIEJwQmluZGVyLmNwcCBcCisgICAgQ3Vyc29yV2luZG93LmNwcCBcCiAgICAgSUludGVyZmFjZS5jcHAgXAogICAgIElNZW1vcnkuY3BwIFwKICAgICBJUENUaHJlYWRTdGF0ZS5jcHAgXApkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvQ3Vyc29yV2luZG93LmNwcCBiL2xpYnMvYmluZGVyL0N1cnNvcldpbmRvdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBiMjdjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYmluZGVyL0N1cnNvcldpbmRvdy5jcHAKQEAgLTAsMCArMSw0MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQ3Vyc29yV2luZG93IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+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+IHN1cmZhY2UgPSBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IFN1cmZhY2U6OnJlYWRGcm9tUGFyY2VsKGRhdGEpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0UHJldmlld0Rpc3BsYXkoc3VyZmFjZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtMzc2LDQgKzM3NiwzIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9BbmRyb2lkLm1rIGIvbGlicy9od3VpL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ2OTUwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDMgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgT25seSBidWlsZCBsaWJod3VpIHdoZW4gVVNFX09QRU5HTF9SRU5ERVJFUiBpcworIyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IGRldmljZS9ib2FyZCBjb25maWd1cmF0aW9uCitpZmVxICgkKFVTRV9PUEVOR0xfUkVOREVSRVIpLHRydWUpCisJTE9DQUxfU1JDX0ZJTEVTOj0gXAorCQlGb250UmVuZGVyZXIuY3BwIFwKKwkJR2FtbWFGb250UmVuZGVyZXIuY3BwIFwKKwkJR3JhZGllbnRDYWNoZS5jcHAgXAorCQlMYXllckNhY2hlLmNwcCBcCisJCU1hdHJpeC5jcHAgXAorCQlPcGVuR0xSZW5kZXJlci5jcHAgXAorCQlQYXRjaC5jcHAgXAorCQlQYXRjaENhY2hlLmNwcCBcCisJCVBhdGhDYWNoZS5jcHAgXAorCQlQcm9ncmFtLmNwcCBcCisJCVByb2dyYW1DYWNoZS5jcHAgXAorCQlTa2lhQ29sb3JGaWx0ZXIuY3BwIFwKKwkJU2tpYVNoYWRlci5jcHAgXAorCQlUZXh0dXJlQ2FjaGUuY3BwIFwKKwkJVGV4dERyb3BTaGFkb3dDYWNoZS5jcHAKKwkKKwlMT0NBTF9DX0lOQ0xVREVTICs9IFwKKwkJJChKTklfSF9JTkNMVURFKSBcCisJCSQoTE9DQUxfUEFUSCkvLi4vLi4vaW5jbHVkZS91dGlscyBcCisJCWV4dGVybmFsL3NraWEvaW5jbHVkZS9jb3JlIFwKKwkJZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2VmZmVjdHMgXAorCQlleHRlcm5hbC9za2lhL2luY2x1ZGUvaW1hZ2VzIFwKKwkJZXh0ZXJuYWwvc2tpYS9zcmMvcG9ydHMgXAorCQlleHRlcm5hbC9za2lhL2luY2x1ZGUvdXRpbHMKKworCUxPQ0FMX0NGTEFHUyArPSAtRFVTRV9PUEVOR0xfUkVOREVSRVIKKwlMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gU0hBUkVEX0xJQlJBUklFUworCUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYnV0aWxzIGxpYkdMRVN2MiBsaWJza2lhCisJTE9DQUxfTU9EVUxFIDo9IGxpYmh3dWkKKwlMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisJCisJaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisgICAgaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQorZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9DYWNoZXMuaCBiL2xpYnMvaHd1aS9DYWNoZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGE1N2I4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0NhY2hlcy5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfQ0FDSEVTX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9DQUNIRVNfSAorCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+CisKKyNpbmNsdWRlICJUZXh0dXJlQ2FjaGUuaCIKKyNpbmNsdWRlICJMYXllckNhY2hlLmgiCisjaW5jbHVkZSAiR3JhZGllbnRDYWNoZS5oIgorI2luY2x1ZGUgIlBhdGNoQ2FjaGUuaCIKKyNpbmNsdWRlICJHYW1tYUZvbnRSZW5kZXJlci5oIgorI2luY2x1ZGUgIlByb2dyYW1DYWNoZS5oIgorI2luY2x1ZGUgIlBhdGhDYWNoZS5oIgorI2luY2x1ZGUgIlRleHREcm9wU2hhZG93Q2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCitzdHJ1Y3QgQ2FjaGVMb2dnZXIgeworICAgIENhY2hlTG9nZ2VyKCkgeworICAgICAgICBMT0dEKCJDcmVhdGluZyBjYWNoZXMiKTsKKyAgICB9Cit9OyAvLyBzdHJ1Y3QgQ2FjaGVMb2dnZXIKKworY2xhc3MgQ2FjaGVzOiBwdWJsaWMgU2luZ2xldG9uPENhY2hlcz4geworICAgIENhY2hlcygpOiBTaW5nbGV0b248Q2FjaGVzPigpLCBibGVuZChmYWxzZSksIGxhc3RTcmNNb2RlKEdMX1pFUk8pLAorICAgICAgICAgICAgbGFzdERzdE1vZGUoR0xfWkVSTyksIGN1cnJlbnRQcm9ncmFtKE5VTEwpIHsKKyAgICB9CisKKyAgICBmcmllbmQgY2xhc3MgU2luZ2xldG9uPENhY2hlcz47CisKKyAgICBDYWNoZUxvZ2dlciBsb2dnZXI7CisKK3B1YmxpYzoKKyAgICBib29sIGJsZW5kOworICAgIEdMZW51bSBsYXN0U3JjTW9kZTsKKyAgICBHTGVudW0gbGFzdERzdE1vZGU7CisgICAgUHJvZ3JhbSogY3VycmVudFByb2dyYW07CisKKyAgICBUZXh0dXJlQ2FjaGUgdGV4dHVyZUNhY2hlOworICAgIExheWVyQ2FjaGUgbGF5ZXJDYWNoZTsKKyAgICBHcmFkaWVudENhY2hlIGdyYWRpZW50Q2FjaGU7CisgICAgUHJvZ3JhbUNhY2hlIHByb2dyYW1DYWNoZTsKKyAgICBQYXRoQ2FjaGUgcGF0aENhY2hlOworICAgIFBhdGNoQ2FjaGUgcGF0Y2hDYWNoZTsKKyAgICBUZXh0RHJvcFNoYWRvd0NhY2hlIGRyb3BTaGFkb3dDYWNoZTsKKyAgICBHYW1tYUZvbnRSZW5kZXJlciBmb250UmVuZGVyZXI7Cit9OyAvLyBjbGFzcyBDYWNoZXMKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKKworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKK3VzaW5nIG5hbWVzcGFjZSB1aXJlbmRlcmVyOworQU5EUk9JRF9TSU5HTEVUT05fU1RBVElDX0lOU1RBTkNFKENhY2hlcyk7CisjZW5kaWYKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfQ0FDSEVTX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9FeHRlbnNpb25zLmggYi9saWJzL2h3dWkvRXh0ZW5zaW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NzgyOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvRXh0ZW5zaW9ucy5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfRVhURU5TSU9OU19ICisjZGVmaW5lIEFORFJPSURfVUlfRVhURU5TSU9OU19ICisKKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCitjbGFzcyBFeHRlbnNpb25zIHsKK3B1YmxpYzoKKyAgICBFeHRlbnNpb25zKCkgeworICAgICAgICBjb25zdCBjaGFyKiBidWZmZXIgPSAoY29uc3QgY2hhciopIGdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpOworICAgICAgICBjb25zdCBjaGFyKiBjdXJyZW50ID0gYnVmZmVyOworICAgICAgICBjb25zdCBjaGFyKiBoZWFkID0gY3VycmVudDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaGVhZCA9IHN0cmNocihjdXJyZW50LCAnICcpOworICAgICAgICAgICAgU3RyaW5nOCBzKGN1cnJlbnQsIGhlYWQgPyBoZWFkIC0gY3VycmVudCA6IHN0cmxlbihjdXJyZW50KSk7CisgICAgICAgICAgICBpZiAocy5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIG1FeHRlbnNpb25MaXN0LmFkZChzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnJlbnQgPSBoZWFkICsgMTsKKyAgICAgICAgfSB3aGlsZSAoaGVhZCk7CisKKyAgICAgICAgbUhhc05Qb3QgPSBoYXNFeHRlbnNpb24oIkdMX09FU190ZXh0dXJlX25wb3QiKTsKKyAgICAgICAgbUhhc0RyYXdQYXRoID0gaGFzRXh0ZW5zaW9uKCJHTF9OVl9kcmF3X3BhdGgiKTsKKyAgICAgICAgbUhhc0NvdmVyYWdlU2FtcGxlID0gaGFzRXh0ZW5zaW9uKCJHTF9OVl9jb3ZlcmFnZV9zYW1wbGUiKTsKKworICAgICAgICBtRXh0ZW5zaW9ucyA9IGJ1ZmZlcjsKKyAgICB9CisKKyAgICBpbmxpbmUgYm9vbCBoYXNOUG90KCkgY29uc3QgeyByZXR1cm4gbUhhc05Qb3Q7IH0KKyAgICBpbmxpbmUgYm9vbCBoYXNEcmF3UGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1IYXNEcmF3UGF0aDsgfQorICAgIGlubGluZSBib29sIGhhc0NvdmVyYWdlU2FtcGxlKCkgY29uc3QgeyByZXR1cm4gbUhhc0NvdmVyYWdlU2FtcGxlOyB9CisKKyAgICBib29sIGhhc0V4dGVuc2lvbihjb25zdCBjaGFyKiBleHRlbnNpb24pIGNvbnN0IHsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBzKGV4dGVuc2lvbik7CisgICAgICAgIHJldHVybiBtRXh0ZW5zaW9uTGlzdC5pbmRleE9mKHMpID49IDA7CisgICAgfQorCisgICAgdm9pZCBkdW1wKCkgeworICAgICAgICBMT0dEKCJTdXBwb3J0ZWQgZXh0ZW5zaW9uczpcbiVzIiwgbUV4dGVuc2lvbnMpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBTb3J0ZWRWZWN0b3I8U3RyaW5nOD4gbUV4dGVuc2lvbkxpc3Q7CisKKyAgICBjb25zdCBjaGFyKiBtRXh0ZW5zaW9uczsKKworICAgIGJvb2wgbUhhc05Qb3Q7CisgICAgYm9vbCBtSGFzRHJhd1BhdGg7CisgICAgYm9vbCBtSGFzQ292ZXJhZ2VTYW1wbGU7Cit9OyAvLyBjbGFzcyBFeHRlbnNpb25zCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9FWFRFTlNJT05TX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Gb250UmVuZGVyZXIuY3BwIGIvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ3ZjhiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Gb250UmVuZGVyZXIuY3BwCkBAIC0wLDAgKzEsODE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPFNrVXRpbHMuaD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJGb250UmVuZGVyZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWZpbmVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgREVGQVVMVF9URVhUX0NBQ0hFX1dJRFRIIDEwMjQKKyNkZWZpbmUgREVGQVVMVF9URVhUX0NBQ0hFX0hFSUdIVCAyNTYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRm9udAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitGb250OjpGb250KEZvbnRSZW5kZXJlciogc3RhdGUsIHVpbnQzMl90IGZvbnRJZCwgZmxvYXQgZm9udFNpemUpIDoKKyAgICBtU3RhdGUoc3RhdGUpLCBtRm9udElkKGZvbnRJZCksIG1Gb250U2l6ZShmb250U2l6ZSkgeworfQorCisKK0ZvbnQ6On5Gb250KCkgeworICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IG1TdGF0ZS0+bUFjdGl2ZUZvbnRzLnNpemUoKTsgY3QrKykgeworICAgICAgICBpZiAobVN0YXRlLT5tQWN0aXZlRm9udHNbY3RdID09IHRoaXMpIHsKKyAgICAgICAgICAgIG1TdGF0ZS0+bUFjdGl2ZUZvbnRzLnJlbW92ZUF0KGN0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZWRHbHlwaHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQ2FjaGVkR2x5cGhJbmZvKiBnbHlwaCA9IG1DYWNoZWRHbHlwaHMudmFsdWVBdChpKTsKKyAgICAgICAgZGVsZXRlIGdseXBoOworICAgIH0KK30KKwordm9pZCBGb250OjppbnZhbGlkYXRlVGV4dHVyZUNhY2hlKCkgeworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVkR2x5cGhzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1DYWNoZWRHbHlwaHMudmFsdWVBdChpKS0+bUlzVmFsaWQgPSBmYWxzZTsKKyAgICB9Cit9CisKK3ZvaWQgRm9udDo6bWVhc3VyZUNhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgsIGludCB4LCBpbnQgeSwgUmVjdCAqYm91bmRzKSB7CisgICAgaW50IG5QZW5YID0geCArIGdseXBoLT5tQml0bWFwTGVmdDsKKyAgICBpbnQgblBlblkgPSB5ICsgZ2x5cGgtPm1CaXRtYXBUb3A7CisKKyAgICBpbnQgd2lkdGggPSAoaW50KSBnbHlwaC0+bUJpdG1hcFdpZHRoOworICAgIGludCBoZWlnaHQgPSAoaW50KSBnbHlwaC0+bUJpdG1hcEhlaWdodDsKKworICAgIGlmIChib3VuZHMtPmJvdHRvbSA+IG5QZW5ZKSB7CisgICAgICAgIGJvdW5kcy0+Ym90dG9tID0gblBlblk7CisgICAgfQorICAgIGlmIChib3VuZHMtPmxlZnQgPiBuUGVuWCkgeworICAgICAgICBib3VuZHMtPmxlZnQgPSBuUGVuWDsKKyAgICB9CisgICAgaWYgKGJvdW5kcy0+cmlnaHQgPCBuUGVuWCArIHdpZHRoKSB7CisgICAgICAgIGJvdW5kcy0+cmlnaHQgPSBuUGVuWCArIHdpZHRoOworICAgIH0KKyAgICBpZiAoYm91bmRzLT50b3AgPCBuUGVuWSArIGhlaWdodCkgeworICAgICAgICBib3VuZHMtPnRvcCA9IG5QZW5ZICsgaGVpZ2h0OworICAgIH0KK30KKwordm9pZCBGb250OjpkcmF3Q2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvKiBnbHlwaCwgaW50IHgsIGludCB5KSB7CisgICAgaW50IG5QZW5YID0geCArIGdseXBoLT5tQml0bWFwTGVmdDsKKyAgICBpbnQgblBlblkgPSB5ICsgZ2x5cGgtPm1CaXRtYXBUb3AgKyBnbHlwaC0+bUJpdG1hcEhlaWdodDsKKworICAgIGZsb2F0IHUxID0gZ2x5cGgtPm1CaXRtYXBNaW5VOworICAgIGZsb2F0IHUyID0gZ2x5cGgtPm1CaXRtYXBNYXhVOworICAgIGZsb2F0IHYxID0gZ2x5cGgtPm1CaXRtYXBNaW5WOworICAgIGZsb2F0IHYyID0gZ2x5cGgtPm1CaXRtYXBNYXhWOworCisgICAgaW50IHdpZHRoID0gKGludCkgZ2x5cGgtPm1CaXRtYXBXaWR0aDsKKyAgICBpbnQgaGVpZ2h0ID0gKGludCkgZ2x5cGgtPm1CaXRtYXBIZWlnaHQ7CisKKyAgICBtU3RhdGUtPmFwcGVuZE1lc2hRdWFkKG5QZW5YLCBuUGVuWSwgMCwgdTEsIHYyLAorICAgICAgICAgICAgblBlblggKyB3aWR0aCwgblBlblksIDAsIHUyLCB2MiwKKyAgICAgICAgICAgIG5QZW5YICsgd2lkdGgsIG5QZW5ZIC0gaGVpZ2h0LCAwLCB1MiwgdjEsCisgICAgICAgICAgICBuUGVuWCwgblBlblkgLSBoZWlnaHQsIDAsIHUxLCB2MSk7Cit9CisKK3ZvaWQgRm9udDo6ZHJhd0NhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyogZ2x5cGgsIGludCB4LCBpbnQgeSwKKyAgICAgICAgdWludDhfdCogYml0bWFwLCB1aW50MzJfdCBiaXRtYXBXLCB1aW50MzJfdCBiaXRtYXBIKSB7CisgICAgaW50IG5QZW5YID0geCArIGdseXBoLT5tQml0bWFwTGVmdDsKKyAgICBpbnQgblBlblkgPSB5ICsgZ2x5cGgtPm1CaXRtYXBUb3A7CisKKyAgICB1aW50MzJfdCBlbmRYID0gZ2x5cGgtPm1TdGFydFggKyBnbHlwaC0+bUJpdG1hcFdpZHRoOworICAgIHVpbnQzMl90IGVuZFkgPSBnbHlwaC0+bVN0YXJ0WSArIGdseXBoLT5tQml0bWFwSGVpZ2h0OworCisgICAgdWludDMyX3QgY2FjaGVXaWR0aCA9IG1TdGF0ZS0+Z2V0Q2FjaGVXaWR0aCgpOworICAgIGNvbnN0IHVpbnQ4X3QqIGNhY2hlQnVmZmVyID0gbVN0YXRlLT5nZXRUZXh0VGV4dHVyZURhdGEoKTsKKworICAgIHVpbnQzMl90IGNhY2hlWCA9IDAsIGNhY2hlWSA9IDA7CisgICAgaW50MzJfdCBiWCA9IDAsIGJZID0gMDsKKyAgICBmb3IgKGNhY2hlWCA9IGdseXBoLT5tU3RhcnRYLCBiWCA9IG5QZW5YOyBjYWNoZVggPCBlbmRYOyBjYWNoZVgrKywgYlgrKykgeworICAgICAgICBmb3IgKGNhY2hlWSA9IGdseXBoLT5tU3RhcnRZLCBiWSA9IG5QZW5ZOyBjYWNoZVkgPCBlbmRZOyBjYWNoZVkrKywgYlkrKykgeworICAgICAgICAgICAgaWYgKGJYIDwgMCB8fCBiWSA8IDAgfHwgYlggPj0gKGludDMyX3QpIGJpdG1hcFcgfHwgYlkgPj0gKGludDMyX3QpIGJpdG1hcEgpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJTa2lwcGluZyBpbnZhbGlkIGluZGV4Iik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50OF90IHRlbXBDb2wgPSBjYWNoZUJ1ZmZlcltjYWNoZVkgKiBjYWNoZVdpZHRoICsgY2FjaGVYXTsKKyAgICAgICAgICAgIGJpdG1hcFtiWSAqIGJpdG1hcFcgKyBiWF0gPSB0ZW1wQ29sOworICAgICAgICB9CisgICAgfQorCit9CisKK0ZvbnQ6OkNhY2hlZEdseXBoSW5mbyogRm9udDo6Z2V0Q2FjaGVkVVRGQ2hhcihTa1BhaW50KiBwYWludCwgaW50MzJfdCB1dGZDaGFyKSB7CisgICAgQ2FjaGVkR2x5cGhJbmZvKiBjYWNoZWRHbHlwaCA9IE5VTEw7CisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZWRHbHlwaHMuaW5kZXhPZktleSh1dGZDaGFyKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBjYWNoZWRHbHlwaCA9IG1DYWNoZWRHbHlwaHMudmFsdWVBdChpbmRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2FjaGVkR2x5cGggPSBjYWNoZUdseXBoKHBhaW50LCB1dGZDaGFyKTsKKyAgICB9CisKKyAgICAvLyBJcyB0aGUgZ2x5cGggc3RpbGwgaW4gdGV4dHVyZSBjYWNoZT8KKyAgICBpZiAoIWNhY2hlZEdseXBoLT5tSXNWYWxpZCkgeworICAgICAgICBjb25zdCBTa0dseXBoJiBza2lhR2x5cGggPSBwYWludC0+Z2V0VW5pY2hhck1ldHJpY3ModXRmQ2hhcik7CisgICAgICAgIHVwZGF0ZUdseXBoQ2FjaGUocGFpbnQsIHNraWFHbHlwaCwgY2FjaGVkR2x5cGgpOworICAgIH0KKworICAgIHJldHVybiBjYWNoZWRHbHlwaDsKK30KKwordm9pZCBGb250OjpyZW5kZXJVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIqIHRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSwgdWludDhfdCAqYml0bWFwLCB1aW50MzJfdCBiaXRtYXBXLCB1aW50MzJfdCBiaXRtYXBIKSB7CisgICAgaWYgKGJpdG1hcCAhPSBOVUxMICYmIGJpdG1hcFcgPiAwICYmIGJpdG1hcEggPiAwKSB7CisgICAgICAgIHJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnQsIGxlbiwgbnVtR2x5cGhzLCB4LCB5LCBCSVRNQVAsIGJpdG1hcCwKKyAgICAgICAgICAgICAgICBiaXRtYXBXLCBiaXRtYXBILCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZW5kZXJVVEYocGFpbnQsIHRleHQsIHN0YXJ0LCBsZW4sIG51bUdseXBocywgeCwgeSwgRlJBTUVCVUZGRVIsIE5VTEwsIDAsIDAsIE5VTEwpOworICAgIH0KKworfQorCit2b2lkIEZvbnQ6Om1lYXN1cmVVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIqIHRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgIGludCBudW1HbHlwaHMsIFJlY3QgKmJvdW5kcykgeworICAgIGlmIChib3VuZHMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJObyByZXR1cm4gcmVjdGFuZ2xlIHByb3ZpZGVkIHRvIG1lYXN1cmUgdGV4dCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJvdW5kcy0+c2V0KDFlNiwgLTFlNiwgLTFlNiwgMWU2KTsKKyAgICByZW5kZXJVVEYocGFpbnQsIHRleHQsIHN0YXJ0LCBsZW4sIG51bUdseXBocywgMCwgMCwgTUVBU1VSRSwgTlVMTCwgMCwgMCwgYm91bmRzKTsKK30KKwordm9pZCBGb250OjpyZW5kZXJVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIqIHRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSwgUmVuZGVyTW9kZSBtb2RlLCB1aW50OF90ICpiaXRtYXAsCisgICAgICAgIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgsUmVjdCAqYm91bmRzKSB7CisgICAgaWYgKG51bUdseXBocyA9PSAwIHx8IHRleHQgPT0gTlVMTCB8fCBsZW4gPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IHBlblggPSB4LCBwZW5ZID0geTsKKyAgICBpbnQgZ2x5cGhzTGVmdCA9IDE7CisgICAgaWYgKG51bUdseXBocyA+IDApIHsKKyAgICAgICAgZ2x5cGhzTGVmdCA9IG51bUdseXBoczsKKyAgICB9CisKKyAgICB0ZXh0ICs9IHN0YXJ0OworCisgICAgd2hpbGUgKGdseXBoc0xlZnQgPiAwKSB7CisgICAgICAgIGludDMyX3QgdXRmQ2hhciA9IFNrVVRGMTZfTmV4dFVuaWNoYXIoKGNvbnN0IHVpbnQxNl90KiopICZ0ZXh0KTsKKworICAgICAgICAvLyBSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmluZworICAgICAgICBpZiAodXRmQ2hhciA8IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQ2FjaGVkR2x5cGhJbmZvKiBjYWNoZWRHbHlwaCA9IGdldENhY2hlZFVURkNoYXIocGFpbnQsIHV0ZkNoYXIpOworCisgICAgICAgIC8vIElmIGl0J3Mgc3RpbGwgbm90IHZhbGlkLCB3ZSBjb3VsZG4ndCBjYWNoZSBpdCwgc28gd2Ugc2hvdWxkbid0IGRyYXcgZ2FyYmFnZQorICAgICAgICBpZiAoY2FjaGVkR2x5cGgtPm1Jc1ZhbGlkKSB7CisgICAgICAgICAgICBzd2l0Y2gobW9kZSkgeworICAgICAgICAgICAgY2FzZSBGUkFNRUJVRkZFUjoKKyAgICAgICAgICAgICAgICBkcmF3Q2FjaGVkR2x5cGgoY2FjaGVkR2x5cGgsIHBlblgsIHBlblkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCSVRNQVA6CisgICAgICAgICAgICAgICAgZHJhd0NhY2hlZEdseXBoKGNhY2hlZEdseXBoLCBwZW5YLCBwZW5ZLCBiaXRtYXAsIGJpdG1hcFcsIGJpdG1hcEgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNRUFTVVJFOgorICAgICAgICAgICAgICAgIG1lYXN1cmVDYWNoZWRHbHlwaChjYWNoZWRHbHlwaCwgcGVuWCwgcGVuWSwgYm91bmRzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBlblggKz0gU2tGaXhlZEZsb29yKGNhY2hlZEdseXBoLT5tQWR2YW5jZVgpOworCisgICAgICAgIC8vIElmIHdlIHdlcmUgZ2l2ZW4gYSBzcGVjaWZpYyBudW1iZXIgb2YgZ2x5cGhzLCBkZWNyZW1lbnQKKyAgICAgICAgaWYgKG51bUdseXBocyA+IDApIHsKKyAgICAgICAgICAgIGdseXBoc0xlZnQtLTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBGb250Ojp1cGRhdGVHbHlwaENhY2hlKFNrUGFpbnQqIHBhaW50LCBjb25zdCBTa0dseXBoJiBza2lhR2x5cGgsIENhY2hlZEdseXBoSW5mbyogZ2x5cGgpIHsKKyAgICBnbHlwaC0+bUFkdmFuY2VYID0gc2tpYUdseXBoLmZBZHZhbmNlWDsKKyAgICBnbHlwaC0+bUFkdmFuY2VZID0gc2tpYUdseXBoLmZBZHZhbmNlWTsKKyAgICBnbHlwaC0+bUJpdG1hcExlZnQgPSBza2lhR2x5cGguZkxlZnQ7CisgICAgZ2x5cGgtPm1CaXRtYXBUb3AgPSBza2lhR2x5cGguZlRvcDsKKworICAgIHVpbnQzMl90IHN0YXJ0WCA9IDA7CisgICAgdWludDMyX3Qgc3RhcnRZID0gMDsKKworICAgIC8vIEdldCB0aGUgYml0bWFwIGZvciB0aGUgZ2x5cGgKKyAgICBwYWludC0+ZmluZEltYWdlKHNraWFHbHlwaCk7CisgICAgZ2x5cGgtPm1Jc1ZhbGlkID0gbVN0YXRlLT5jYWNoZUJpdG1hcChza2lhR2x5cGgsICZzdGFydFgsICZzdGFydFkpOworCisgICAgaWYgKCFnbHlwaC0+bUlzVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQzMl90IGVuZFggPSBzdGFydFggKyBza2lhR2x5cGguZldpZHRoOworICAgIHVpbnQzMl90IGVuZFkgPSBzdGFydFkgKyBza2lhR2x5cGguZkhlaWdodDsKKworICAgIGdseXBoLT5tU3RhcnRYID0gc3RhcnRYOworICAgIGdseXBoLT5tU3RhcnRZID0gc3RhcnRZOworICAgIGdseXBoLT5tQml0bWFwV2lkdGggPSBza2lhR2x5cGguZldpZHRoOworICAgIGdseXBoLT5tQml0bWFwSGVpZ2h0ID0gc2tpYUdseXBoLmZIZWlnaHQ7CisKKyAgICB1aW50MzJfdCBjYWNoZVdpZHRoID0gbVN0YXRlLT5nZXRDYWNoZVdpZHRoKCk7CisgICAgdWludDMyX3QgY2FjaGVIZWlnaHQgPSBtU3RhdGUtPmdldENhY2hlSGVpZ2h0KCk7CisKKyAgICBnbHlwaC0+bUJpdG1hcE1pblUgPSAoZmxvYXQpIHN0YXJ0WCAvIChmbG9hdCkgY2FjaGVXaWR0aDsKKyAgICBnbHlwaC0+bUJpdG1hcE1pblYgPSAoZmxvYXQpIHN0YXJ0WSAvIChmbG9hdCkgY2FjaGVIZWlnaHQ7CisgICAgZ2x5cGgtPm1CaXRtYXBNYXhVID0gKGZsb2F0KSBlbmRYIC8gKGZsb2F0KSBjYWNoZVdpZHRoOworICAgIGdseXBoLT5tQml0bWFwTWF4ViA9IChmbG9hdCkgZW5kWSAvIChmbG9hdCkgY2FjaGVIZWlnaHQ7CisKKyAgICBtU3RhdGUtPm1VcGxvYWRUZXh0dXJlID0gdHJ1ZTsKK30KKworRm9udDo6Q2FjaGVkR2x5cGhJbmZvKiBGb250OjpjYWNoZUdseXBoKFNrUGFpbnQqIHBhaW50LCBpbnQzMl90IGdseXBoKSB7CisgICAgQ2FjaGVkR2x5cGhJbmZvKiBuZXdHbHlwaCA9IG5ldyBDYWNoZWRHbHlwaEluZm8oKTsKKyAgICBtQ2FjaGVkR2x5cGhzLmFkZChnbHlwaCwgbmV3R2x5cGgpOworCisgICAgY29uc3QgU2tHbHlwaCYgc2tpYUdseXBoID0gcGFpbnQtPmdldFVuaWNoYXJNZXRyaWNzKGdseXBoKTsKKyAgICBuZXdHbHlwaC0+bUdseXBoSW5kZXggPSBza2lhR2x5cGguZklEOworICAgIG5ld0dseXBoLT5tSXNWYWxpZCA9IGZhbHNlOworCisgICAgdXBkYXRlR2x5cGhDYWNoZShwYWludCwgc2tpYUdseXBoLCBuZXdHbHlwaCk7CisKKyAgICByZXR1cm4gbmV3R2x5cGg7Cit9CisKK0ZvbnQqIEZvbnQ6OmNyZWF0ZShGb250UmVuZGVyZXIqIHN0YXRlLCB1aW50MzJfdCBmb250SWQsIGZsb2F0IGZvbnRTaXplKSB7CisgICAgVmVjdG9yPEZvbnQqPiAmYWN0aXZlRm9udHMgPSBzdGF0ZS0+bUFjdGl2ZUZvbnRzOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGFjdGl2ZUZvbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEZvbnQqIGZvbnQgPSBhY3RpdmVGb250c1tpXTsKKyAgICAgICAgaWYgKGZvbnQtPm1Gb250SWQgPT0gZm9udElkICYmIGZvbnQtPm1Gb250U2l6ZSA9PSBmb250U2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIGZvbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBGb250KiBuZXdGb250ID0gbmV3IEZvbnQoc3RhdGUsIGZvbnRJZCwgZm9udFNpemUpOworICAgIGFjdGl2ZUZvbnRzLnB1c2gobmV3Rm9udCk7CisgICAgcmV0dXJuIG5ld0ZvbnQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZvbnRSZW5kZXJlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitGb250UmVuZGVyZXI6OkZvbnRSZW5kZXJlcigpIHsKKyAgICBMT0dEKCJDcmVhdGluZyBGb250UmVuZGVyZXIiKTsKKworICAgIG1HYW1tYVRhYmxlID0gTlVMTDsKKyAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBtTWF4TnVtYmVyT2ZRdWFkcyA9IDEwMjQ7CisgICAgbUN1cnJlbnRRdWFkSW5kZXggPSAwOworICAgIG1UZXh0dXJlSWQgPSAwOworCisgICAgbVRleHRNZXNoUHRyID0gTlVMTDsKKyAgICBtVGV4dFRleHR1cmUgPSBOVUxMOworCisgICAgbUluZGV4QnVmZmVySUQgPSAwOworCisgICAgbUNhY2hlV2lkdGggPSBERUZBVUxUX1RFWFRfQ0FDSEVfV0lEVEg7CisgICAgbUNhY2hlSGVpZ2h0ID0gREVGQVVMVF9URVhUX0NBQ0hFX0hFSUdIVDsKKworICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX1RFWFRfQ0FDSEVfV0lEVEgsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKKyAgICAgICAgTE9HRCgiICBTZXR0aW5nIHRleHQgY2FjaGUgd2lkdGggdG8gJXMgcGl4ZWxzIiwgcHJvcGVydHkpOworICAgICAgICBtQ2FjaGVXaWR0aCA9IGF0b2kocHJvcGVydHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB0ZXh0IGNhY2hlIHdpZHRoIG9mICVpIHBpeGVscyIsIG1DYWNoZVdpZHRoKTsKKyAgICB9CisKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX1RFWFRfQ0FDSEVfSEVJR0hULCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyB0ZXh0IGNhY2hlIHdpZHRoIHRvICVzIHBpeGVscyIsIHByb3BlcnR5KTsKKyAgICAgICAgbUNhY2hlSGVpZ2h0ID0gYXRvaShwcm9wZXJ0eSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IHRleHQgY2FjaGUgaGVpZ2h0IG9mICVpIHBpeGVscyIsIG1DYWNoZUhlaWdodCk7CisgICAgfQorfQorCitGb250UmVuZGVyZXI6On5Gb250UmVuZGVyZXIoKSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGRlbGV0ZSBtQ2FjaGVMaW5lc1tpXTsKKyAgICB9CisgICAgbUNhY2hlTGluZXMuY2xlYXIoKTsKKworICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgZGVsZXRlW10gbVRleHRNZXNoUHRyOworICAgICAgICBkZWxldGVbXSBtVGV4dFRleHR1cmU7CisgICAgfQorCisgICAgaWYgKG1UZXh0dXJlSWQpIHsKKyAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmbVRleHR1cmVJZCk7CisgICAgfQorCisgICAgVmVjdG9yPEZvbnQqPiBmb250c1RvRGVyZWZlcmVuY2UgPSBtQWN0aXZlRm9udHM7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGZvbnRzVG9EZXJlZmVyZW5jZS5zaXplKCk7IGkrKykgeworICAgICAgICBkZWxldGUgZm9udHNUb0RlcmVmZXJlbmNlW2ldOworICAgIH0KK30KKwordm9pZCBGb250UmVuZGVyZXI6OmZsdXNoQWxsQW5kSW52YWxpZGF0ZSgpIHsKKyAgICBpZiAobUN1cnJlbnRRdWFkSW5kZXggIT0gMCkgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1BY3RpdmVGb250cy5zaXplKCk7IGkrKykgeworICAgICAgICBtQWN0aXZlRm9udHNbaV0tPmludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1DYWNoZUxpbmVzW2ldLT5tQ3VycmVudENvbCA9IDA7CisgICAgfQorfQorCitib29sIEZvbnRSZW5kZXJlcjo6Y2FjaGVCaXRtYXAoY29uc3QgU2tHbHlwaCYgZ2x5cGgsIHVpbnQzMl90KiByZXRPcmlnaW5YLCB1aW50MzJfdCogcmV0T3JpZ2luWSkgeworICAgIC8vIElmIHRoZSBnbHlwaCBpcyB0b28gdGFsbCwgZG9uJ3QgY2FjaGUgaXQKKyAgICBpZiAoZ2x5cGguZldpZHRoID4gbUNhY2hlTGluZXNbbUNhY2hlTGluZXMuc2l6ZSgpIC0gMV0tPm1NYXhIZWlnaHQpIHsKKyAgICAgICAgTE9HRSgiRm9udCBzaXplIHRvIGxhcmdlIHRvIGZpdCBpbiBjYWNoZS4gd2lkdGgsIGhlaWdodCA9ICVpLCAlaSIsCisgICAgICAgICAgICAgICAgKGludCkgZ2x5cGguZldpZHRoLCAoaW50KSBnbHlwaC5mSGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE5vdyBjb3B5IHRoZSBiaXRtYXAgaW50byB0aGUgY2FjaGUgdGV4dHVyZQorICAgIHVpbnQzMl90IHN0YXJ0WCA9IDA7CisgICAgdWludDMyX3Qgc3RhcnRZID0gMDsKKworICAgIGJvb2wgYml0bWFwRml0ID0gZmFsc2U7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGJpdG1hcEZpdCA9IG1DYWNoZUxpbmVzW2ldLT5maXRCaXRtYXAoZ2x5cGgsICZzdGFydFgsICZzdGFydFkpOworICAgICAgICBpZiAoYml0bWFwRml0KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHRoZSBuZXcgZ2x5cGggZGlkbid0IGZpdCwgZmx1c2ggdGhlIHN0YXRlIHNvIGZhciBhbmQgaW52YWxpZGF0ZSBldmVyeXRoaW5nCisgICAgaWYgKCFiaXRtYXBGaXQpIHsKKyAgICAgICAgZmx1c2hBbGxBbmRJbnZhbGlkYXRlKCk7CisKKyAgICAgICAgLy8gVHJ5IHRvIGZpdCBpdCBhZ2FpbgorICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGJpdG1hcEZpdCA9IG1DYWNoZUxpbmVzW2ldLT5maXRCaXRtYXAoZ2x5cGgsICZzdGFydFgsICZzdGFydFkpOworICAgICAgICAgICAgaWYgKGJpdG1hcEZpdCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgd2Ugc3RpbGwgZG9uJ3QgZml0LCBzb21ldGhpbmcgaXMgd3JvbmcgYW5kIHdlIHNob3VsZG4ndCBkcmF3CisgICAgICAgIGlmICghYml0bWFwRml0KSB7CisgICAgICAgICAgICBMT0dFKCJCaXRtYXAgZG9lc24ndCBmaXQgaW4gY2FjaGUuIHdpZHRoLCBoZWlnaHQgPSAlaSwgJWkiLAorICAgICAgICAgICAgICAgICAgICAoaW50KSBnbHlwaC5mV2lkdGgsIChpbnQpIGdseXBoLmZIZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgKnJldE9yaWdpblggPSBzdGFydFg7CisgICAgKnJldE9yaWdpblkgPSBzdGFydFk7CisKKyAgICB1aW50MzJfdCBlbmRYID0gc3RhcnRYICsgZ2x5cGguZldpZHRoOworICAgIHVpbnQzMl90IGVuZFkgPSBzdGFydFkgKyBnbHlwaC5mSGVpZ2h0OworCisgICAgdWludDMyX3QgY2FjaGVXaWR0aCA9IG1DYWNoZVdpZHRoOworCisgICAgdWludDhfdCogY2FjaGVCdWZmZXIgPSBtVGV4dFRleHR1cmU7CisgICAgdWludDhfdCogYml0bWFwQnVmZmVyID0gKHVpbnQ4X3QqKSBnbHlwaC5mSW1hZ2U7CisgICAgdW5zaWduZWQgaW50IHN0cmlkZSA9IGdseXBoLnJvd0J5dGVzKCk7CisKKyAgICB1aW50MzJfdCBjYWNoZVggPSAwLCBiWCA9IDAsIGNhY2hlWSA9IDAsIGJZID0gMDsKKyAgICBmb3IgKGNhY2hlWCA9IHN0YXJ0WCwgYlggPSAwOyBjYWNoZVggPCBlbmRYOyBjYWNoZVgrKywgYlgrKykgeworICAgICAgICBmb3IgKGNhY2hlWSA9IHN0YXJ0WSwgYlkgPSAwOyBjYWNoZVkgPCBlbmRZOyBjYWNoZVkrKywgYlkrKykgeworICAgICAgICAgICAgdWludDhfdCB0ZW1wQ29sID0gYml0bWFwQnVmZmVyW2JZICogc3RyaWRlICsgYlhdOworICAgICAgICAgICAgY2FjaGVCdWZmZXJbY2FjaGVZICogY2FjaGVXaWR0aCArIGNhY2hlWF0gPSBtR2FtbWFUYWJsZVt0ZW1wQ29sXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6aW5pdFRleHRUZXh0dXJlKCkgeworICAgIG1UZXh0VGV4dHVyZSA9IG5ldyB1aW50OF90W21DYWNoZVdpZHRoICogbUNhY2hlSGVpZ2h0XTsKKyAgICBtVXBsb2FkVGV4dHVyZSA9IGZhbHNlOworCisgICAgZ2xHZW5UZXh0dXJlcygxLCAmbVRleHR1cmVJZCk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtVGV4dHVyZUlkKTsKKyAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDEpOworICAgIC8vIEluaXRpYWxpemUgdGV4dHVyZSBkaW1lbnRpb25zCisgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0FMUEhBLCBtQ2FjaGVXaWR0aCwgbUNhY2hlSGVpZ2h0LCAwLAorICAgICAgICAgICAgR0xfQUxQSEEsIEdMX1VOU0lHTkVEX0JZVEUsIDApOworCisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7CisKKyAgICAvLyBTcGxpdCB1cCBvdXIgY2FjaGUgdGV4dHVyZSBpbnRvIGxpbmVzIG9mIGNlcnRhaW4gd2lkdGhzCisgICAgaW50IG5leHRMaW5lID0gMDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCAxNiwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCAyNCwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCAyNCwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCAzMiwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCAzMiwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCA0MCwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCBtQ2FjaGVIZWlnaHQgLSBuZXh0TGluZSwgbmV4dExpbmUsIDApKTsKK30KKworLy8gQXZvaWQgaGF2aW5nIHRvIHJlYWxsb2NhdGUgbWVtb3J5IGFuZCByZW5kZXIgcXVhZCBieSBxdWFkCit2b2lkIEZvbnRSZW5kZXJlcjo6aW5pdFZlcnRleEFycmF5QnVmZmVycygpIHsKKyAgICB1aW50MzJfdCBudW1JbmRpY2llcyA9IG1NYXhOdW1iZXJPZlF1YWRzICogNjsKKyAgICB1aW50MzJfdCBpbmRleEJ1ZmZlclNpemVCeXRlcyA9IG51bUluZGljaWVzICogc2l6ZW9mKHVpbnQxNl90KTsKKyAgICB1aW50MTZfdCogaW5kZXhCdWZmZXJEYXRhID0gKHVpbnQxNl90KikgbWFsbG9jKGluZGV4QnVmZmVyU2l6ZUJ5dGVzKTsKKworICAgIC8vIEZvdXIgdmVydHMsIHR3byB0cmlhbmdsZXMgLCBzaXggaW5kaWNlcyBwZXIgcXVhZAorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtTWF4TnVtYmVyT2ZRdWFkczsgaSsrKSB7CisgICAgICAgIGludCBpNiA9IGkgKiA2OworICAgICAgICBpbnQgaTQgPSBpICogNDsKKworICAgICAgICBpbmRleEJ1ZmZlckRhdGFbaTYgKyAwXSA9IGk0ICsgMDsKKyAgICAgICAgaW5kZXhCdWZmZXJEYXRhW2k2ICsgMV0gPSBpNCArIDE7CisgICAgICAgIGluZGV4QnVmZmVyRGF0YVtpNiArIDJdID0gaTQgKyAyOworCisgICAgICAgIGluZGV4QnVmZmVyRGF0YVtpNiArIDNdID0gaTQgKyAwOworICAgICAgICBpbmRleEJ1ZmZlckRhdGFbaTYgKyA0XSA9IGk0ICsgMjsKKyAgICAgICAgaW5kZXhCdWZmZXJEYXRhW2k2ICsgNV0gPSBpNCArIDM7CisgICAgfQorCisgICAgZ2xHZW5CdWZmZXJzKDEsICZtSW5kZXhCdWZmZXJJRCk7CisgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUluZGV4QnVmZmVySUQpOworICAgIGdsQnVmZmVyRGF0YShHTF9BUlJBWV9CVUZGRVIsIGluZGV4QnVmZmVyU2l6ZUJ5dGVzLCBpbmRleEJ1ZmZlckRhdGEsIEdMX0RZTkFNSUNfRFJBVyk7CisgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgMCk7CisKKyAgICBmcmVlKGluZGV4QnVmZmVyRGF0YSk7CisKKyAgICB1aW50MzJfdCBjb29yZFNpemUgPSAzOworICAgIHVpbnQzMl90IHV2U2l6ZSA9IDI7CisgICAgdWludDMyX3QgdmVydHNQZXJRdWFkID0gNDsKKyAgICB1aW50MzJfdCB2ZXJ0ZXhCdWZmZXJTaXplID0gbU1heE51bWJlck9mUXVhZHMgKiB2ZXJ0c1BlclF1YWQgKiBjb29yZFNpemUgKiB1dlNpemU7CisgICAgbVRleHRNZXNoUHRyID0gbmV3IGZsb2F0W3ZlcnRleEJ1ZmZlclNpemVdOworfQorCisvLyBXZSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIGFueXRoaW5nIHVubGVzcyB3ZSBhY3R1YWxseSBkcmF3IHRleHQKK3ZvaWQgRm9udFJlbmRlcmVyOjpjaGVja0luaXQoKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW5pdFRleHRUZXh0dXJlKCk7CisgICAgaW5pdFZlcnRleEFycmF5QnVmZmVycygpOworCisgICAgLy8gV2Ugc3RvcmUgYSBzdHJpbmcgd2l0aCBsZXR0ZXJzIGluIGEgcm91Z2ggZnJlcXVlbmN5IG9mIG9jY3VycmVuY2UKKyAgICBtTGF0aW5QcmVjYWNoZSA9IFN0cmluZzE2KCJlaXNhcm50b2xjZHVncG1oYnlmdmt3enhqcSAiKTsKKyAgICBtTGF0aW5QcmVjYWNoZSArPSBTdHJpbmcxNigiRUlTQVJOVE9MQ0RVR1BNSEJZRlZLV1pYSlEiKTsKKyAgICBtTGF0aW5QcmVjYWNoZSArPSBTdHJpbmcxNigiLC4/ISgpLStAOzpgJyIpOworICAgIG1MYXRpblByZWNhY2hlICs9IFN0cmluZzE2KCIwMTIzNDU2Nzg5Iik7CisKKyAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6Y2hlY2tUZXh0dXJlVXBkYXRlKCkgeworICAgIGlmICghbVVwbG9hZFRleHR1cmUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbVRleHR1cmVJZCk7CisKKyAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBjYWNoZSBsaW5lcyBhbmQgc2VlIHdoaWNoIG9uZXMgbmVlZCB0byBiZSB1cGRhdGVkCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIENhY2hlVGV4dHVyZUxpbmUqIGNsID0gbUNhY2hlTGluZXNbaV07CisgICAgICAgIGlmKGNsLT5tRGlydHkpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHhPZmZzZXQgPSAwOworICAgICAgICAgICAgdWludDMyX3QgeU9mZnNldCA9IGNsLT5tQ3VycmVudFJvdzsKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoICAgPSBtQ2FjaGVXaWR0aDsKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCAgPSBjbC0+bU1heEhlaWdodDsKKyAgICAgICAgICAgIHZvaWQqIHRleHR1cmVEYXRhID0gbVRleHRUZXh0dXJlICsgeU9mZnNldCp3aWR0aDsKKworICAgICAgICAgICAgZ2xUZXhTdWJJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIHhPZmZzZXQsIHlPZmZzZXQsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIEdMX0FMUEhBLCBHTF9VTlNJR05FRF9CWVRFLCB0ZXh0dXJlRGF0YSk7CisKKyAgICAgICAgICAgIGNsLT5tRGlydHkgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1VcGxvYWRUZXh0dXJlID0gZmFsc2U7Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjppc3N1ZURyYXdDb21tYW5kKCkgeworICAgIGNoZWNrVGV4dHVyZVVwZGF0ZSgpOworCisgICAgZmxvYXQqIHZ0eCA9IG1UZXh0TWVzaFB0cjsKKyAgICBmbG9hdCogdGV4ID0gdnR4ICsgMzsKKworICAgIC8vIHBvc2l0aW9uIGlzIHNsb3QgMAorICAgIHVpbnQzMl90IHNsb3QgPSAwOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihzbG90LCAzLCBHTF9GTE9BVCwgZmFsc2UsIDIwLCB2dHgpOworCisgICAgLy8gdGV4dHVyZTAgaXMgc2xvdCAxCisgICAgc2xvdCA9IDE7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHNsb3QsIDIsIEdMX0ZMT0FULCBmYWxzZSwgMjAsIHRleCk7CisKKyAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1JbmRleEJ1ZmZlcklEKTsKKyAgICBnbERyYXdFbGVtZW50cyhHTF9UUklBTkdMRVMsIG1DdXJyZW50UXVhZEluZGV4ICogNiwgR0xfVU5TSUdORURfU0hPUlQsIE5VTEwpOworfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6YXBwZW5kTWVzaFF1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgdTEsIGZsb2F0IHYxLCBmbG9hdCB4MiwKKyAgICAgICAgZmxvYXQgeTIsIGZsb2F0IHoyLCBmbG9hdCB1MiwgZmxvYXQgdjIsIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsIGZsb2F0IHUzLCBmbG9hdCB2MywKKyAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwgZmxvYXQgdTQsIGZsb2F0IHY0KSB7CisgICAgaWYgKHgxID4gbUNsaXAtPnJpZ2h0IHx8IHkxIDwgbUNsaXAtPnRvcCB8fCB4MiA8IG1DbGlwLT5sZWZ0IHx8IHk0ID4gbUNsaXAtPmJvdHRvbSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgdWludDMyX3QgdmVydHNQZXJRdWFkID0gNDsKKyAgICBjb25zdCB1aW50MzJfdCBmbG9hdHNQZXJWZXJ0ID0gNTsKKyAgICBmbG9hdCogY3VycmVudFBvcyA9IG1UZXh0TWVzaFB0ciArIG1DdXJyZW50UXVhZEluZGV4ICogdmVydHNQZXJRdWFkICogZmxvYXRzUGVyVmVydDsKKworICAgICgqY3VycmVudFBvcysrKSA9IHgxOworICAgICgqY3VycmVudFBvcysrKSA9IHkxOworICAgICgqY3VycmVudFBvcysrKSA9IHoxOworICAgICgqY3VycmVudFBvcysrKSA9IHUxOworICAgICgqY3VycmVudFBvcysrKSA9IHYxOworCisgICAgKCpjdXJyZW50UG9zKyspID0geDI7CisgICAgKCpjdXJyZW50UG9zKyspID0geTI7CisgICAgKCpjdXJyZW50UG9zKyspID0gejI7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTI7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjI7CisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2MzsKKworICAgICgqY3VycmVudFBvcysrKSA9IHg0OworICAgICgqY3VycmVudFBvcysrKSA9IHk0OworICAgICgqY3VycmVudFBvcysrKSA9IHo0OworICAgICgqY3VycmVudFBvcysrKSA9IHU0OworICAgICgqY3VycmVudFBvcysrKSA9IHY0OworCisgICAgbUN1cnJlbnRRdWFkSW5kZXgrKzsKKworICAgIGlmIChtQ3VycmVudFF1YWRJbmRleCA9PSBtTWF4TnVtYmVyT2ZRdWFkcykgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9Cit9CisKK3VpbnQzMl90IEZvbnRSZW5kZXJlcjo6Z2V0UmVtYWluaW5nQ2FjaGVDYXBhY2l0eSgpIHsKKyAgICB1aW50MzJfdCByZW1haW5pbmdDYXBhY2l0eSA9IDA7CisgICAgZmxvYXQgdG90YWxQaXhlbHMgPSAwOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSArKykgeworICAgICAgICAgcmVtYWluaW5nQ2FwYWNpdHkgKz0gKG1DYWNoZUxpbmVzW2ldLT5tTWF4V2lkdGggLSBtQ2FjaGVMaW5lc1tpXS0+bUN1cnJlbnRDb2wpOworICAgICAgICAgdG90YWxQaXhlbHMgKz0gbUNhY2hlTGluZXNbaV0tPm1NYXhXaWR0aDsKKyAgICB9CisgICAgcmVtYWluaW5nQ2FwYWNpdHkgPSAocmVtYWluaW5nQ2FwYWNpdHkgKiAxMDApIC8gdG90YWxQaXhlbHM7CisgICAgcmV0dXJuIHJlbWFpbmluZ0NhcGFjaXR5OworfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6cHJlY2FjaGVMYXRpbihTa1BhaW50KiBwYWludCkgeworICAgIC8vIFJlbWFpbmluZyBjYXBhY2l0eSBpcyBtZWFzdXJlZCBpbiAlCisgICAgdWludDMyX3QgcmVtYWluaW5nQ2FwYWNpdHkgPSBnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCk7CisgICAgdWludDMyX3QgcHJlY2FjaGVJZHggPSAwOworICAgIHdoaWxlKHJlbWFpbmluZ0NhcGFjaXR5ID4gMjUgJiYgcHJlY2FjaGVJZHggPCBtTGF0aW5QcmVjYWNoZS5zaXplKCkpIHsKKyAgICAgICAgbUN1cnJlbnRGb250LT5nZXRDYWNoZWRVVEZDaGFyKHBhaW50LCAoaW50MzJfdCltTGF0aW5QcmVjYWNoZVtwcmVjYWNoZUlkeF0pOworICAgICAgICByZW1haW5pbmdDYXBhY2l0eSA9IGdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKTsKKyAgICAgICAgcHJlY2FjaGVJZHggKys7CisgICAgfQorfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6c2V0Rm9udChTa1BhaW50KiBwYWludCwgdWludDMyX3QgZm9udElkLCBmbG9hdCBmb250U2l6ZSkgeworICAgIHVpbnQzMl90IGN1cnJlbnROdW1Gb250cyA9IG1BY3RpdmVGb250cy5zaXplKCk7CisgICAgbUN1cnJlbnRGb250ID0gRm9udDo6Y3JlYXRlKHRoaXMsIGZvbnRJZCwgZm9udFNpemUpOworCisgICAgY29uc3QgZmxvYXQgbWF4UHJlY2FjaGVGb250U2l6ZSA9IDQwLjBmOworICAgIGJvb2wgaXNOZXdGb250ID0gY3VycmVudE51bUZvbnRzICE9IG1BY3RpdmVGb250cy5zaXplKCk7CisKKyAgICBpZihpc05ld0ZvbnQgJiYgZm9udFNpemUgPD0gbWF4UHJlY2FjaGVGb250U2l6ZSApeworICAgICAgICBwcmVjYWNoZUxhdGluKHBhaW50KTsKKyAgICB9Cit9CitGb250UmVuZGVyZXI6OkRyb3BTaGFkb3cgRm9udFJlbmRlcmVyOjpyZW5kZXJEcm9wU2hhZG93KFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyICp0ZXh0LAorICAgICAgICB1aW50MzJfdCBzdGFydEluZGV4LCB1aW50MzJfdCBsZW4sIGludCBudW1HbHlwaHMsIHVpbnQzMl90IHJhZGl1cykgeworICAgIGNoZWNrSW5pdCgpOworCisgICAgaWYgKCFtQ3VycmVudEZvbnQpIHsKKyAgICAgICAgRHJvcFNoYWRvdyBpbWFnZTsKKyAgICAgICAgaW1hZ2Uud2lkdGggPSAwOworICAgICAgICBpbWFnZS5oZWlnaHQgPSAwOworICAgICAgICBpbWFnZS5pbWFnZSA9IE5VTEw7CisgICAgICAgIGltYWdlLnBlblggPSAwOworICAgICAgICBpbWFnZS5wZW5ZID0gMDsKKyAgICAgICAgcmV0dXJuIGltYWdlOworICAgIH0KKworICAgIFJlY3QgYm91bmRzOworICAgIG1DdXJyZW50Rm9udC0+bWVhc3VyZVVURihwYWludCwgdGV4dCwgc3RhcnRJbmRleCwgbGVuLCBudW1HbHlwaHMsICZib3VuZHMpOworICAgIHVpbnQzMl90IHBhZGRlZFdpZHRoID0gKHVpbnQzMl90KSAoYm91bmRzLnJpZ2h0IC0gYm91bmRzLmxlZnQpICsgMiAqIHJhZGl1czsKKyAgICB1aW50MzJfdCBwYWRkZWRIZWlnaHQgPSAodWludDMyX3QpIChib3VuZHMudG9wIC0gYm91bmRzLmJvdHRvbSkgKyAyICogcmFkaXVzOworICAgIHVpbnQ4X3QqIGRhdGFCdWZmZXIgPSBuZXcgdWludDhfdFtwYWRkZWRXaWR0aCAqIHBhZGRlZEhlaWdodF07CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBhZGRlZFdpZHRoICogcGFkZGVkSGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZGF0YUJ1ZmZlcltpXSA9IDA7CisgICAgfQorCisgICAgaW50IHBlblggPSByYWRpdXMgLSBib3VuZHMubGVmdDsKKyAgICBpbnQgcGVuWSA9IHJhZGl1cyAtIGJvdW5kcy5ib3R0b207CisKKyAgICBtQ3VycmVudEZvbnQtPnJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnRJbmRleCwgbGVuLCBudW1HbHlwaHMsIHBlblgsIHBlblksCisgICAgICAgICAgICBkYXRhQnVmZmVyLCBwYWRkZWRXaWR0aCwgcGFkZGVkSGVpZ2h0KTsKKyAgICBibHVySW1hZ2UoZGF0YUJ1ZmZlciwgcGFkZGVkV2lkdGgsIHBhZGRlZEhlaWdodCwgcmFkaXVzKTsKKworICAgIERyb3BTaGFkb3cgaW1hZ2U7CisgICAgaW1hZ2Uud2lkdGggPSBwYWRkZWRXaWR0aDsKKyAgICBpbWFnZS5oZWlnaHQgPSBwYWRkZWRIZWlnaHQ7CisgICAgaW1hZ2UuaW1hZ2UgPSBkYXRhQnVmZmVyOworICAgIGltYWdlLnBlblggPSBwZW5YOworICAgIGltYWdlLnBlblkgPSBwZW5ZOworICAgIHJldHVybiBpbWFnZTsKK30KKwordm9pZCBGb250UmVuZGVyZXI6OnJlbmRlclRleHQoU2tQYWludCogcGFpbnQsIGNvbnN0IFJlY3QqIGNsaXAsIGNvbnN0IGNoYXIgKnRleHQsCisgICAgICAgIHVpbnQzMl90IHN0YXJ0SW5kZXgsIHVpbnQzMl90IGxlbiwgaW50IG51bUdseXBocywgaW50IHgsIGludCB5KSB7CisgICAgY2hlY2tJbml0KCk7CisKKyAgICBpZiAoIW1DdXJyZW50Rm9udCkgeworICAgICAgICBMT0dFKCJObyBmb250IHNldCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNsaXAgPSBjbGlwOworICAgIG1DdXJyZW50Rm9udC0+cmVuZGVyVVRGKHBhaW50LCB0ZXh0LCBzdGFydEluZGV4LCBsZW4sIG51bUdseXBocywgeCwgeSk7CisKKyAgICBpZiAobUN1cnJlbnRRdWFkSW5kZXggIT0gMCkgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjpjb21wdXRlR2F1c3NpYW5XZWlnaHRzKGZsb2F0KiB3ZWlnaHRzLCBpbnQzMl90IHJhZGl1cykgeworICAgIC8vIENvbXB1dGUgZ2F1c3NpYW4gd2VpZ2h0cyBmb3IgdGhlIGJsdXIKKyAgICAvLyBlIGlzIHRoZSBldWxlcidzIG51bWJlcgorICAgIGZsb2F0IGUgPSAyLjcxODI4MTgyODQ1OTA0NWY7CisgICAgZmxvYXQgcGkgPSAzLjE0MTU5MjY1MzU4OTc5MzJmOworICAgIC8vIGcoeCkgPSAoIDEgLyBzcXJ0KCAyICogcGkgKSAqIHNpZ21hKSAqIGUgXiAoIC14XjIgLyAyICogc2lnbWFeMiApCisgICAgLy8geCBpcyBvZiB0aGUgZm9ybSBbLXJhZGl1cyAuLiAwIC4uIHJhZGl1c10KKyAgICAvLyBhbmQgc2lnbWEgdmFyaWVzIHdpdGggcmFkaXVzLgorICAgIC8vIEJhc2VkIG9uIHNvbWUgZXhwZXJpbWVudGFsIHJhZGl1cyB2YWx1ZXMgYW5kIHNpZ21hJ3MKKyAgICAvLyB3ZSBhcHByb3hpbWF0ZWx5IGZpdCBzaWdtYSA9IGYocmFkaXVzKSBhcworICAgIC8vIHNpZ21hID0gcmFkaXVzICogMC4zICArIDAuNgorICAgIC8vIFRoZSBsYXJnZXIgdGhlIHJhZGl1cyBnZXRzLCB0aGUgbW9yZSBvdXIgZ2F1c3NpYW4gYmx1cgorICAgIC8vIHdpbGwgcmVzZW1ibGUgYSBib3ggYmx1ciBzaW5jZSB3aXRoIGxhcmdlIHNpZ21hCisgICAgLy8gdGhlIGdhdXNzaWFuIGN1cnZlIGJlZ2lucyB0byBsb3NlIGl0cyBzaGFwZQorICAgIGZsb2F0IHNpZ21hID0gMC4zZiAqIChmbG9hdClyYWRpdXMgKyAwLjZmOworCisgICAgLy8gTm93IGNvbXB1dGUgdGhlIGNvZWZmaWNpbnRzCisgICAgLy8gV2Ugd2lsbCBzdG9yZSBzb21lIHJlZHVuZGFudCB2YWx1ZXMgdG8gc2F2ZSBzb21lIG1hdGggZHVyaW5nCisgICAgLy8gdGhlIGJsdXIgY2FsY3VsYXRpb25zCisgICAgLy8gcHJlY29tcHV0ZSBzb21lIHZhbHVlcworICAgIGZsb2F0IGNvZWZmMSA9IDEuMGYgLyAoc3FydCggMi4wZiAqIHBpICkgKiBzaWdtYSk7CisgICAgZmxvYXQgY29lZmYyID0gLSAxLjBmIC8gKDIuMGYgKiBzaWdtYSAqIHNpZ21hKTsKKworICAgIGZsb2F0IG5vcm1hbGl6ZUZhY3RvciA9IDAuMGY7CisgICAgZm9yKGludDMyX3QgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgIGZsb2F0IGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICB3ZWlnaHRzW3IgKyByYWRpdXNdID0gY29lZmYxICogcG93KGUsIGZsb2F0UiAqIGZsb2F0UiAqIGNvZWZmMik7CisgICAgICAgIG5vcm1hbGl6ZUZhY3RvciArPSB3ZWlnaHRzW3IgKyByYWRpdXNdOworICAgIH0KKworICAgIC8vTm93IHdlIG5lZWQgdG8gbm9ybWFsaXplIHRoZSB3ZWlnaHRzIGJlY2F1c2UgYWxsIG91ciBjb2VmZmljaWVudHMgbmVlZCB0byBhZGQgdXAgdG8gb25lCisgICAgbm9ybWFsaXplRmFjdG9yID0gMS4wZiAvIG5vcm1hbGl6ZUZhY3RvcjsKKyAgICBmb3IoaW50MzJfdCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgd2VpZ2h0c1tyICsgcmFkaXVzXSAqPSBub3JtYWxpemVGYWN0b3I7CisgICAgfQorfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6aG9yaXpvbnRhbEJsdXIoZmxvYXQqIHdlaWdodHMsIGludDMyX3QgcmFkaXVzLAorICAgICAgICBjb25zdCB1aW50OF90KiBzb3VyY2UsIHVpbnQ4X3QqIGRlc3QsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgZmxvYXQgYmx1cnJlZFBpeGVsID0gMC4wZjsKKyAgICBmbG9hdCBjdXJyZW50UGl4ZWwgPSAwLjBmOworCisgICAgZm9yKGludDMyX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKyspIHsKKworICAgICAgICBjb25zdCB1aW50OF90KiBpbnB1dCA9IHNvdXJjZSArIHkgKiB3aWR0aDsKKyAgICAgICAgdWludDhfdCogb3V0cHV0ID0gZGVzdCArIHkgKiB3aWR0aDsKKworICAgICAgICBmb3IoaW50MzJfdCB4ID0gMDsgeCA8IHdpZHRoOyB4ICsrKSB7CisgICAgICAgICAgICBibHVycmVkUGl4ZWwgPSAwLjBmOworICAgICAgICAgICAgY29uc3QgZmxvYXQqIGdQdHIgPSB3ZWlnaHRzOworICAgICAgICAgICAgLy8gT3B0aW1pemF0aW9uIGZvciBub24tYm9yZGVyIHBpeGVscworICAgICAgICAgICAgaWYgKCh4ID4gcmFkaXVzKSAmJiAoeCA8ICh3aWR0aCAtIHJhZGl1cykpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaSA9IGlucHV0ICsgKHggLSByYWRpdXMpOworICAgICAgICAgICAgICAgIGZvcihpbnQgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQaXhlbCA9IChmbG9hdCkoKmkpOworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gY3VycmVudFBpeGVsICogZ1B0clswXTsKKyAgICAgICAgICAgICAgICAgICAgZ1B0cisrOworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RlcHBpbmcgbGVmdCBhbmQgcmlnaHQgYXdheSBmcm9tIHRoZSBwaXhlbAorICAgICAgICAgICAgICAgICAgICBpbnQgdmFsaWRXID0geCArIHI7CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkVyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkVyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRXID4gd2lkdGggLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFcgPSB3aWR0aCAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGl4ZWwgPSAoZmxvYXQpKGlucHV0W3ZhbGlkV10pOworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gY3VycmVudFBpeGVsICogZ1B0clswXTsKKyAgICAgICAgICAgICAgICAgICAgZ1B0cisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvdXRwdXQgPSAodWludDhfdClibHVycmVkUGl4ZWw7CisgICAgICAgICAgICBvdXRwdXQgKys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjp2ZXJ0aWNhbEJsdXIoZmxvYXQqIHdlaWdodHMsIGludDMyX3QgcmFkaXVzLAorICAgICAgICBjb25zdCB1aW50OF90KiBzb3VyY2UsIHVpbnQ4X3QqIGRlc3QsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgZmxvYXQgYmx1cnJlZFBpeGVsID0gMC4wZjsKKyAgICBmbG9hdCBjdXJyZW50UGl4ZWwgPSAwLjBmOworCisgICAgZm9yKGludDMyX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKyspIHsKKworICAgICAgICB1aW50OF90KiBvdXRwdXQgPSBkZXN0ICsgeSAqIHdpZHRoOworCisgICAgICAgIGZvcihpbnQzMl90IHggPSAwOyB4IDwgd2lkdGg7IHggKyspIHsKKyAgICAgICAgICAgIGJsdXJyZWRQaXhlbCA9IDAuMGY7CisgICAgICAgICAgICBjb25zdCBmbG9hdCogZ1B0ciA9IHdlaWdodHM7CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBpbnB1dCA9IHNvdXJjZSArIHg7CisgICAgICAgICAgICAvLyBPcHRpbWl6YXRpb24gZm9yIG5vbi1ib3JkZXIgcGl4ZWxzCisgICAgICAgICAgICBpZiAoKHkgPiByYWRpdXMpICYmICh5IDwgKGhlaWdodCAtIHJhZGl1cykpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaSA9IGlucHV0ICsgKCh5IC0gcmFkaXVzKSAqIHdpZHRoKTsKKyAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFBpeGVsID0gKGZsb2F0KSgqaSk7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBjdXJyZW50UGl4ZWwgKiBnUHRyWzBdOworICAgICAgICAgICAgICAgICAgICBnUHRyKys7CisgICAgICAgICAgICAgICAgICAgIGkgKz0gd2lkdGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbGlkSCA9IHkgKyByOworICAgICAgICAgICAgICAgICAgICAvLyBDbGFtcCB0byB6ZXJvIGFuZCB3aWR0aAorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZEggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEggPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkSCA+IGhlaWdodCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkSCA9IGhlaWdodCAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppID0gaW5wdXQgKyB2YWxpZEggKiB3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFBpeGVsID0gKGZsb2F0KSgqaSk7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBjdXJyZW50UGl4ZWwgKiBnUHRyWzBdOworICAgICAgICAgICAgICAgICAgICBnUHRyKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKm91dHB1dCA9ICh1aW50OF90KWJsdXJyZWRQaXhlbDsKKyAgICAgICAgICAgIG91dHB1dCArKzsKKyAgICAgICAgfQorICAgIH0KK30KKworCit2b2lkIEZvbnRSZW5kZXJlcjo6Ymx1ckltYWdlKHVpbnQ4X3QgKmltYWdlLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCByYWRpdXMpIHsKKyAgICBmbG9hdCAqZ2F1c3NpYW4gPSBuZXcgZmxvYXRbMiAqIHJhZGl1cyArIDFdOworICAgIGNvbXB1dGVHYXVzc2lhbldlaWdodHMoZ2F1c3NpYW4sIHJhZGl1cyk7CisgICAgdWludDhfdCogc2NyYXRjaCA9IG5ldyB1aW50OF90W3dpZHRoICogaGVpZ2h0XTsKKyAgICBob3Jpem9udGFsQmx1cihnYXVzc2lhbiwgcmFkaXVzLCBpbWFnZSwgc2NyYXRjaCwgd2lkdGgsIGhlaWdodCk7CisgICAgdmVydGljYWxCbHVyKGdhdXNzaWFuLCByYWRpdXMsIHNjcmF0Y2gsIGltYWdlLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBkZWxldGVbXSBnYXVzc2lhbjsKKyAgICBkZWxldGVbXSBzY3JhdGNoOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Gb250UmVuZGVyZXIuaCBiL2xpYnMvaHd1aS9Gb250UmVuZGVyZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDNlYTkyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5oCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0ZPTlRfUkVOREVSRVJfSAorI2RlZmluZSBBTkRST0lEX1VJX0ZPTlRfUkVOREVSRVJfSAorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworI2luY2x1ZGUgPFNrU2NhbGVyQ29udGV4dC5oPgorI2luY2x1ZGUgPFNrUGFpbnQuaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSAiUmVjdC5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCitjbGFzcyBGb250UmVuZGVyZXI7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGZvbnQsIGRlZmluZWQgYnkgYSBTa2lhIGZvbnQgaWQgYW5kIGEgZm9udCBzaXplLiBBIGZvbnQgaXMgdXNlZAorICogdG8gZ2VuZXJhdGUgZ2x5cGhzIGFuZCBjYWNoZSB0aGVtIGluIHRoZSBGb250U3RhdGUuCisgKi8KK2NsYXNzIEZvbnQgeworcHVibGljOgorICAgIH5Gb250KCk7CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXJzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIG9mIHRleHQuCisgICAgICogSWYgYml0bWFwIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBiZSB1c2VkIGFzIHRoZSByZW5kZXIgdGFyZ2V0CisgICAgICovCisgICAgdm9pZCByZW5kZXJVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpiaXRtYXAgPSBOVUxMLCB1aW50MzJfdCBiaXRtYXBXID0gMCwgdWludDMyX3QgYml0bWFwSCA9IDApOworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgZm9udCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBmb250IHN0YXRlLgorICAgICAqLworICAgIHN0YXRpYyBGb250KiBjcmVhdGUoRm9udFJlbmRlcmVyKiBzdGF0ZSwgdWludDMyX3QgZm9udElkLCBmbG9hdCBmb250U2l6ZSk7CisKK3Byb3RlY3RlZDoKKyAgICBmcmllbmQgY2xhc3MgRm9udFJlbmRlcmVyOworCisgICAgZW51bSBSZW5kZXJNb2RlIHsKKyAgICAgICAgRlJBTUVCVUZGRVIsCisgICAgICAgIEJJVE1BUCwKKyAgICAgICAgTUVBU1VSRSwKKyAgICB9OworCisgICAgdm9pZCByZW5kZXJVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHksIFJlbmRlck1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJpdG1hcCwgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCwKKyAgICAgICAgICAgICAgICAgICAgIFJlY3QgKmJvdW5kcyk7CisKKyAgICB2b2lkIG1lYXN1cmVVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIqIHRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgaW50IG51bUdseXBocywgUmVjdCAqYm91bmRzKTsKKworICAgIHN0cnVjdCBDYWNoZWRHbHlwaEluZm8geworICAgICAgICAvLyBIYXMgdGhlIGNhY2hlIGJlZW4gaW52YWxpZGF0ZWQ/CisgICAgICAgIGJvb2wgbUlzVmFsaWQ7CisgICAgICAgIC8vIExvY2F0aW9uIG9mIHRoZSBjYWNoZWQgZ2x5cGggaW4gdGhlIGJpdG1hcAorICAgICAgICAvLyBpbiBjYXNlIHdlIG5lZWQgdG8gcmVzaXplIHRoZSB0ZXh0dXJlIG9yCisgICAgICAgIC8vIHJlbmRlciB0byBiaXRtYXAKKyAgICAgICAgdWludDMyX3QgbVN0YXJ0WDsKKyAgICAgICAgdWludDMyX3QgbVN0YXJ0WTsKKyAgICAgICAgdWludDMyX3QgbUJpdG1hcFdpZHRoOworICAgICAgICB1aW50MzJfdCBtQml0bWFwSGVpZ2h0OworICAgICAgICAvLyBBbHNvIGNhY2hlIHRleHR1cmUgY29vcmRzIGZvciB0aGUgcXVhZAorICAgICAgICBmbG9hdCBtQml0bWFwTWluVTsKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1pblY7CisgICAgICAgIGZsb2F0IG1CaXRtYXBNYXhVOworICAgICAgICBmbG9hdCBtQml0bWFwTWF4VjsKKyAgICAgICAgLy8gTWluaW1pemUgaG93IG11Y2ggd2UgY2FsbCBmcmVldHlwZQorICAgICAgICB1aW50MzJfdCBtR2x5cGhJbmRleDsKKyAgICAgICAgdWludDMyX3QgbUFkdmFuY2VYOworICAgICAgICB1aW50MzJfdCBtQWR2YW5jZVk7CisgICAgICAgIC8vIFZhbHVlcyBiZWxvdyBjb250YWluIGEgZ2x5cGgncyBvcmlnaW4gaW4gdGhlIGJpdG1hcAorICAgICAgICBpbnQzMl90IG1CaXRtYXBMZWZ0OworICAgICAgICBpbnQzMl90IG1CaXRtYXBUb3A7CisgICAgfTsKKworICAgIEZvbnQoRm9udFJlbmRlcmVyKiBzdGF0ZSwgdWludDMyX3QgZm9udElkLCBmbG9hdCBmb250U2l6ZSk7CisKKyAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8aW50MzJfdCwgQ2FjaGVkR2x5cGhJbmZvKj4gbUNhY2hlZEdseXBoczsKKworICAgIHZvaWQgaW52YWxpZGF0ZVRleHR1cmVDYWNoZSgpOworCisgICAgQ2FjaGVkR2x5cGhJbmZvKiBjYWNoZUdseXBoKFNrUGFpbnQqIHBhaW50LCBpbnQzMl90IGdseXBoKTsKKyAgICB2b2lkIHVwZGF0ZUdseXBoQ2FjaGUoU2tQYWludCogcGFpbnQsIGNvbnN0IFNrR2x5cGgmIHNraWFHbHlwaCwgQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCk7CisgICAgdm9pZCBtZWFzdXJlQ2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5LCBSZWN0ICpib3VuZHMpOworICAgIHZvaWQgZHJhd0NhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgsIGludCB4LCBpbnQgeSk7CisgICAgdm9pZCBkcmF3Q2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpiaXRtYXAsIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgpOworCisgICAgQ2FjaGVkR2x5cGhJbmZvKiBnZXRDYWNoZWRVVEZDaGFyKFNrUGFpbnQqIHBhaW50LCBpbnQzMl90IHV0ZkNoYXIpOworCisgICAgRm9udFJlbmRlcmVyKiBtU3RhdGU7CisgICAgdWludDMyX3QgbUZvbnRJZDsKKyAgICBmbG9hdCBtRm9udFNpemU7Cit9OworCitjbGFzcyBGb250UmVuZGVyZXIgeworcHVibGljOgorICAgIEZvbnRSZW5kZXJlcigpOworICAgIH5Gb250UmVuZGVyZXIoKTsKKworICAgIHZvaWQgaW5pdCgpOworICAgIHZvaWQgZGVpbml0KCk7CisKKyAgICB2b2lkIHNldEdhbW1hVGFibGUoY29uc3QgdWludDhfdCogZ2FtbWFUYWJsZSkgeworICAgICAgICBtR2FtbWFUYWJsZSA9IGdhbW1hVGFibGU7CisgICAgfQorCisgICAgdm9pZCBzZXRGb250KFNrUGFpbnQqIHBhaW50LCB1aW50MzJfdCBmb250SWQsIGZsb2F0IGZvbnRTaXplKTsKKyAgICB2b2lkIHJlbmRlclRleHQoU2tQYWludCogcGFpbnQsIGNvbnN0IFJlY3QqIGNsaXAsIGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IHN0YXJ0SW5kZXgsCisgICAgICAgICAgICB1aW50MzJfdCBsZW4sIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSk7CisKKyAgICBzdHJ1Y3QgRHJvcFNoYWRvdyB7CisgICAgICAgIERyb3BTaGFkb3coKSB7IH07CisKKyAgICAgICAgRHJvcFNoYWRvdyhjb25zdCBEcm9wU2hhZG93JiBkcm9wU2hhZG93KToKKyAgICAgICAgICAgIHdpZHRoKGRyb3BTaGFkb3cud2lkdGgpLCBoZWlnaHQoZHJvcFNoYWRvdy5oZWlnaHQpLAorICAgICAgICAgICAgaW1hZ2UoZHJvcFNoYWRvdy5pbWFnZSksIHBlblgoZHJvcFNoYWRvdy5wZW5YKSwKKyAgICAgICAgICAgIHBlblkoZHJvcFNoYWRvdy5wZW5ZKSB7CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCB3aWR0aDsKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0OworICAgICAgICB1aW50OF90KiBpbWFnZTsKKyAgICAgICAgaW50MzJfdCBwZW5YOworICAgICAgICBpbnQzMl90IHBlblk7CisgICAgfTsKKworICAgIC8vIEFmdGVyIHJlbmRlckRyb3BTaGFkb3cgcmV0dXJucywgdGhlIGNhbGxlZCBvd25zIHRoZSBtZW1vcnkgaW4gRHJvcFNoYWRvdy5pbWFnZQorICAgIC8vIGFuZCBpcyByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIGl0IHdoZW4gaXQncyBkb25lIHdpdGggaXQKKyAgICBEcm9wU2hhZG93IHJlbmRlckRyb3BTaGFkb3coU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IHN0YXJ0SW5kZXgsCisgICAgICAgICAgICB1aW50MzJfdCBsZW4sIGludCBudW1HbHlwaHMsIHVpbnQzMl90IHJhZGl1cyk7CisKKyAgICBHTHVpbnQgZ2V0VGV4dHVyZSgpIHsKKyAgICAgICAgY2hlY2tJbml0KCk7CisgICAgICAgIHJldHVybiBtVGV4dHVyZUlkOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGZyaWVuZCBjbGFzcyBGb250OworCisgICAgY29uc3QgdWludDhfdCogbUdhbW1hVGFibGU7CisKKyAgICBzdHJ1Y3QgQ2FjaGVUZXh0dXJlTGluZSB7CisgICAgICAgIHVpbnQxNl90IG1NYXhIZWlnaHQ7CisgICAgICAgIHVpbnQxNl90IG1NYXhXaWR0aDsKKyAgICAgICAgdWludDMyX3QgbUN1cnJlbnRSb3c7CisgICAgICAgIHVpbnQzMl90IG1DdXJyZW50Q29sOworICAgICAgICBib29sIG1EaXJ0eTsKKworICAgICAgICBDYWNoZVRleHR1cmVMaW5lKHVpbnQxNl90IG1heFdpZHRoLCB1aW50MTZfdCBtYXhIZWlnaHQsIHVpbnQzMl90IGN1cnJlbnRSb3csCisgICAgICAgICAgICAgICAgdWludDMyX3QgY3VycmVudENvbCk6CisgICAgICAgICAgICAgICAgICAgIG1NYXhIZWlnaHQobWF4SGVpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgbU1heFdpZHRoKG1heFdpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRSb3coY3VycmVudFJvdyksCisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50Q29sKGN1cnJlbnRDb2wpLAorICAgICAgICAgICAgICAgICAgICBtRGlydHkoZmFsc2UpIHsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgZml0Qml0bWFwKGNvbnN0IFNrR2x5cGgmIGdseXBoLCB1aW50MzJfdCAqcmV0T3JpZ2luWCwgdWludDMyX3QgKnJldE9yaWdpblkpIHsKKyAgICAgICAgICAgIGlmIChnbHlwaC5mSGVpZ2h0ID4gbU1heEhlaWdodCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1DdXJyZW50Q29sICsgZ2x5cGguZldpZHRoIDwgbU1heFdpZHRoKSB7CisgICAgICAgICAgICAgICAgKnJldE9yaWdpblggPSBtQ3VycmVudENvbDsKKyAgICAgICAgICAgICAgICAqcmV0T3JpZ2luWSA9IG1DdXJyZW50Um93OworICAgICAgICAgICAgICAgIG1DdXJyZW50Q29sICs9IGdseXBoLmZXaWR0aDsKKyAgICAgICAgICAgICAgICBtRGlydHkgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdWludDMyX3QgZ2V0Q2FjaGVXaWR0aCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DYWNoZVdpZHRoOworICAgIH0KKworICAgIHVpbnQzMl90IGdldENhY2hlSGVpZ2h0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNhY2hlSGVpZ2h0OworICAgIH0KKworICAgIHZvaWQgaW5pdFRleHRUZXh0dXJlKCk7CisgICAgYm9vbCBjYWNoZUJpdG1hcChjb25zdCBTa0dseXBoJiBnbHlwaCwgdWludDMyX3QgKnJldE9yaWdpblgsIHVpbnQzMl90ICpyZXRPcmlnaW5ZKTsKKworICAgIHZvaWQgZmx1c2hBbGxBbmRJbnZhbGlkYXRlKCk7CisgICAgdm9pZCBpbml0VmVydGV4QXJyYXlCdWZmZXJzKCk7CisKKyAgICB2b2lkIGNoZWNrSW5pdCgpOworCisgICAgU3RyaW5nMTYgbUxhdGluUHJlY2FjaGU7CisgICAgdm9pZCBwcmVjYWNoZUxhdGluKFNrUGFpbnQqIHBhaW50KTsKKworICAgIHZvaWQgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgIHZvaWQgYXBwZW5kTWVzaFF1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgdTEsIGZsb2F0IHYxLCBmbG9hdCB4MiwgZmxvYXQgeTIsCisgICAgICAgICAgICBmbG9hdCB6MiwgZmxvYXQgdTIsIGZsb2F0IHYyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB1MywgZmxvYXQgdjMsCisgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LCBmbG9hdCB1NCwgZmxvYXQgdjQpOworCisgICAgdWludDMyX3QgbUNhY2hlV2lkdGg7CisgICAgdWludDMyX3QgbUNhY2hlSGVpZ2h0OworCisgICAgVmVjdG9yPENhY2hlVGV4dHVyZUxpbmUqPiBtQ2FjaGVMaW5lczsKKyAgICB1aW50MzJfdCBnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCk7CisKKyAgICBGb250KiBtQ3VycmVudEZvbnQ7CisgICAgVmVjdG9yPEZvbnQqPiBtQWN0aXZlRm9udHM7CisKKyAgICAvLyBUZXh0dXJlIHRvIGNhY2hlIGdseXBoIGJpdG1hcHMKKyAgICB1aW50OF90KiBtVGV4dFRleHR1cmU7CisgICAgY29uc3QgdWludDhfdCogZ2V0VGV4dFRleHR1cmVEYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRleHRUZXh0dXJlOworICAgIH0KKyAgICBHTHVpbnQgbVRleHR1cmVJZDsKKyAgICB2b2lkIGNoZWNrVGV4dHVyZVVwZGF0ZSgpOworICAgIGJvb2wgbVVwbG9hZFRleHR1cmU7CisKKyAgICAvLyBQb2ludGVyIHRvIHZlcnRleCBkYXRhIHRvIHNwZWVkIHVwIGZyYW1lIHRvIGZyYW1lIHdvcmsKKyAgICBmbG9hdCAqbVRleHRNZXNoUHRyOworICAgIHVpbnQzMl90IG1DdXJyZW50UXVhZEluZGV4OworICAgIHVpbnQzMl90IG1NYXhOdW1iZXJPZlF1YWRzOworCisgICAgdWludDMyX3QgbUluZGV4QnVmZmVySUQ7CisKKyAgICBjb25zdCBSZWN0KiBtQ2xpcDsKKworICAgIGJvb2wgbUluaXRpYWxpemVkOworCisgICAgdm9pZCBjb21wdXRlR2F1c3NpYW5XZWlnaHRzKGZsb2F0KiB3ZWlnaHRzLCBpbnQzMl90IHJhZGl1cyk7CisgICAgdm9pZCBob3Jpem9udGFsQmx1cihmbG9hdCogd2VpZ2h0cywgaW50MzJfdCByYWRpdXMsIGNvbnN0IHVpbnQ4X3QgKnNvdXJjZSwgdWludDhfdCAqZGVzdCwKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKyAgICB2b2lkIHZlcnRpY2FsQmx1cihmbG9hdCogd2VpZ2h0cywgaW50MzJfdCByYWRpdXMsIGNvbnN0IHVpbnQ4X3QgKnNvdXJjZSwgdWludDhfdCAqZGVzdCwKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKyAgICB2b2lkIGJsdXJJbWFnZSh1aW50OF90KiBpbWFnZSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgcmFkaXVzKTsKK307CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9GT05UX1JFTkRFUkVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9HYW1tYUZvbnRSZW5kZXJlci5jcHAgYi9saWJzL2h3dWkvR2FtbWFGb250UmVuZGVyZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMDg3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvR2FtbWFGb250UmVuZGVyZXIuY3BwCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgIkdhbW1hRm9udFJlbmRlcmVyLmgiCisjaW5jbHVkZSAiUHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0dhbW1hRm9udFJlbmRlcmVyOjpHYW1tYUZvbnRSZW5kZXJlcigpIHsKKyAgICBMT0dEKCJDcmVhdGluZyBnYW1tYSBmb250IHJlbmRlcmVyIik7CisKKyAgICAvLyBHZXQgdGhlIHJlbmRlcmVyIHByb3BlcnRpZXMKKyAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgICAvLyBHZXQgdGhlIGdhbW1hCisgICAgZmxvYXQgZ2FtbWEgPSBERUZBVUxUX1RFWFRfR0FNTUE7CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX0dBTU1BLCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyB0ZXh0IGdhbW1hIHRvICVzIiwgcHJvcGVydHkpOworICAgICAgICBnYW1tYSA9IGF0b2YocHJvcGVydHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB0ZXh0IGdhbW1hIG9mICUuMmYiLCBERUZBVUxUX1RFWFRfR0FNTUEpOworICAgIH0KKworICAgIC8vIEdldCB0aGUgYmxhY2sgZ2FtbWEgdGhyZXNob2xkCisgICAgbUJsYWNrVGhyZXNob2xkID0gREVGQVVMVF9URVhUX0JMQUNLX0dBTU1BX1RIUkVTSE9MRDsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX1RFWFRfQkxBQ0tfR0FNTUFfVEhSRVNIT0xELCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyB0ZXh0IGJsYWNrIGdhbW1hIHRocmVzaG9sZCB0byAlcyIsIHByb3BlcnR5KTsKKyAgICAgICAgbUJsYWNrVGhyZXNob2xkID0gYXRvaShwcm9wZXJ0eSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IHRleHQgYmxhY2sgZ2FtbWEgdGhyZXNob2xkIG9mICVkIiwKKyAgICAgICAgICAgICAgICBERUZBVUxUX1RFWFRfQkxBQ0tfR0FNTUFfVEhSRVNIT0xEKTsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIHdoaXRlIGdhbW1hIHRocmVzaG9sZAorICAgIG1XaGl0ZVRocmVzaG9sZCA9IERFRkFVTFRfVEVYVF9XSElURV9HQU1NQV9USFJFU0hPTEQ7CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX1dISVRFX0dBTU1BX1RIUkVTSE9MRCwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgdGV4dCB3aGl0ZSBnYW1tYSB0aHJlc2hvbGQgdG8gJXMiLCBwcm9wZXJ0eSk7CisgICAgICAgIG1XaGl0ZVRocmVzaG9sZCA9IGF0b2kocHJvcGVydHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB3aGl0ZSBibGFjayBnYW1tYSB0aHJlc2hvbGQgb2YgJWQiLAorICAgICAgICAgICAgICAgIERFRkFVTFRfVEVYVF9XSElURV9HQU1NQV9USFJFU0hPTEQpOworICAgIH0KKworICAgIC8vIENvbXB1dGUgdGhlIGdhbW1hIHRhYmxlcworICAgIGNvbnN0IGZsb2F0IGJsYWNrR2FtbWEgPSBnYW1tYTsKKyAgICBjb25zdCBmbG9hdCB3aGl0ZUdhbW1hID0gMS4wZiAvIGdhbW1hOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8PSAyNTU7IGkrKykgeworICAgICAgICBtRGVmYXVsdFtpXSA9IGk7CisKKyAgICAgICAgY29uc3QgZmxvYXQgdiA9IGkgLyAyNTUuMGY7CisgICAgICAgIGNvbnN0IGZsb2F0IGJsYWNrID0gcG93KHYsIGJsYWNrR2FtbWEpOworICAgICAgICBjb25zdCBmbG9hdCB3aGl0ZSA9IHBvdyh2LCB3aGl0ZUdhbW1hKTsKKworICAgICAgICBtQmxhY2tHYW1tYVtpXSA9IHVpbnQ4X3QoKGZsb2F0KTo6Zmxvb3IoYmxhY2sgKiAyNTUuMGYgKyAwLjVmKSk7CisgICAgICAgIG1XaGl0ZUdhbW1hW2ldID0gdWludDhfdCgoZmxvYXQpOjpmbG9vcih3aGl0ZSAqIDI1NS4wZiArIDAuNWYpKTsKKyAgICB9CisKKyAgICAvLyBDb25maWd1cmUgdGhlIGZvbnQgcmVuZGVyZXJzCisgICAgbURlZmF1bHRSZW5kZXJlci5zZXRHYW1tYVRhYmxlKCZtRGVmYXVsdFswXSk7CisgICAgbUJsYWNrR2FtbWFSZW5kZXJlci5zZXRHYW1tYVRhYmxlKCZtQmxhY2tHYW1tYVswXSk7CisgICAgbVdoaXRlR2FtbWFSZW5kZXJlci5zZXRHYW1tYVRhYmxlKCZtV2hpdGVHYW1tYVswXSk7Cit9CisKK0ZvbnRSZW5kZXJlciYgR2FtbWFGb250UmVuZGVyZXI6OmdldEZvbnRSZW5kZXJlcihjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIGlmIChwYWludC0+Z2V0U2hhZGVyKCkgPT0gTlVMTCkgeworICAgICAgICB1aW50MzJfdCBjID0gcGFpbnQtPmdldENvbG9yKCk7CisgICAgICAgIGNvbnN0IGludCByID0gKGMgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgY29uc3QgaW50IGcgPSAoYyA+PiAgOCkgJiAweEZGOworICAgICAgICBjb25zdCBpbnQgYiA9IChjICAgICAgKSAmIDB4RkY7CisgICAgICAgIGNvbnN0IGludCBsdW1pbmFuY2UgPSAociAqIDIgKyBnICogNSArIGIpID4+IDM7CisKKyAgICAgICAgaWYgKGx1bWluYW5jZSA8PSBtQmxhY2tUaHJlc2hvbGQpIHsKKyAgICAgICAgICAgIHJldHVybiBtQmxhY2tHYW1tYVJlbmRlcmVyOworICAgICAgICB9IGVsc2UgaWYgKGx1bWluYW5jZSA+PSBtV2hpdGVUaHJlc2hvbGQpIHsKKyAgICAgICAgICAgIHJldHVybiBtV2hpdGVHYW1tYVJlbmRlcmVyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtRGVmYXVsdFJlbmRlcmVyOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9HYW1tYUZvbnRSZW5kZXJlci5oIGIvbGlicy9od3VpL0dhbW1hRm9udFJlbmRlcmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZhNDVjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9HYW1tYUZvbnRSZW5kZXJlci5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfR0FNTUFfRk9OVF9SRU5ERVJFUl9ICisjZGVmaW5lIEFORFJPSURfVUlfR0FNTUFfRk9OVF9SRU5ERVJFUl9ICisKKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisKKyNpbmNsdWRlICJGb250UmVuZGVyZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCitzdHJ1Y3QgR2FtbWFGb250UmVuZGVyZXIgeworICAgIEdhbW1hRm9udFJlbmRlcmVyKCk7CisKKyAgICBGb250UmVuZGVyZXImIGdldEZvbnRSZW5kZXJlcihjb25zdCBTa1BhaW50KiBwYWludCk7CisKK3ByaXZhdGU6CisgICAgRm9udFJlbmRlcmVyIG1EZWZhdWx0UmVuZGVyZXI7CisgICAgRm9udFJlbmRlcmVyIG1CbGFja0dhbW1hUmVuZGVyZXI7CisgICAgRm9udFJlbmRlcmVyIG1XaGl0ZUdhbW1hUmVuZGVyZXI7CisKKyAgICBpbnQgbUJsYWNrVGhyZXNob2xkOworICAgIGludCBtV2hpdGVUaHJlc2hvbGQ7CisKKyAgICB1aW50OF90IG1EZWZhdWx0WzI1Nl07CisgICAgdWludDhfdCBtQmxhY2tHYW1tYVsyNTZdOworICAgIHVpbnQ4X3QgbVdoaXRlR2FtbWFbMjU2XTsKK307CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9HQU1NQV9GT05UX1JFTkRFUkVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9HZW5lcmF0aW9uQ2FjaGUuaCBiL2xpYnMvaHd1aS9HZW5lcmF0aW9uQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzU4YzgwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0dlbmVyYXRpb25DYWNoZS5oCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0dFTkVSQVRJT05fQ0FDSEVfSAorI2RlZmluZSBBTkRST0lEX1VJX0dFTkVSQVRJT05fQ0FDSEVfSAorCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRW50cnlLZXksIHR5cGVuYW1lIEVudHJ5VmFsdWU+CitjbGFzcyBPbkVudHJ5UmVtb3ZlZCB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+T25FbnRyeVJlbW92ZWQoKSB7IH07CisgICAgdmlydHVhbCB2b2lkIG9wZXJhdG9yKCkoRW50cnlLZXkmIGtleSwgRW50cnlWYWx1ZSYgdmFsdWUpID0gMDsKK307IC8vIGNsYXNzIE9uRW50cnlSZW1vdmVkCisKK3RlbXBsYXRlPHR5cGVuYW1lIEVudHJ5S2V5LCB0eXBlbmFtZSBFbnRyeVZhbHVlPgorc3RydWN0IEVudHJ5OiBwdWJsaWMgTGlnaHRSZWZCYXNlPEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiA+IHsKKyAgICBFbnRyeSgpIHsgfQorICAgIEVudHJ5KGNvbnN0IEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiYgZSk6CisgICAgICAgICAgICBrZXkoZS5rZXkpLCB2YWx1ZShlLnZhbHVlKSwgcGFyZW50KGUucGFyZW50KSwgY2hpbGQoZS5jaGlsZCkgeyB9CisgICAgRW50cnkoc3A8RW50cnk8RW50cnlLZXksIEVudHJ5VmFsdWU+ID4gZSk6CisgICAgICAgICAgICBrZXkoZS0+a2V5KSwgdmFsdWUoZS0+dmFsdWUpLCBwYXJlbnQoZS0+cGFyZW50KSwgY2hpbGQoZS0+Y2hpbGQpIHsgfQorCisgICAgRW50cnlLZXkga2V5OworICAgIEVudHJ5VmFsdWUgdmFsdWU7CisKKyAgICBzcDxFbnRyeTxFbnRyeUtleSwgRW50cnlWYWx1ZT4gPiBwYXJlbnQ7CisgICAgc3A8RW50cnk8RW50cnlLZXksIEVudHJ5VmFsdWU+ID4gY2hpbGQ7Cit9OyAvLyBzdHJ1Y3QgRW50cnkKKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK2NsYXNzIEdlbmVyYXRpb25DYWNoZSB7CitwdWJsaWM6CisgICAgR2VuZXJhdGlvbkNhY2hlKHVpbnQzMl90IG1heENhcGFjaXR5KTsKKyAgICB2aXJ0dWFsIH5HZW5lcmF0aW9uQ2FjaGUoKTsKKworICAgIGVudW0gQ2FwYWNpdHkgeworICAgICAgICBrVW5saW1pdGVkQ2FwYWNpdHksCisgICAgfTsKKworICAgIHZvaWQgc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcihPbkVudHJ5UmVtb3ZlZDxLLCBWPiogbGlzdGVuZXIpOworCisgICAgdm9pZCBjbGVhcigpOworCisgICAgYm9vbCBjb250YWlucyhLIGtleSkgY29uc3Q7CisgICAgViBnZXQoSyBrZXkpOworICAgIHZvaWQgcHV0KEsga2V5LCBWIHZhbHVlKTsKKyAgICBWIHJlbW92ZShLIGtleSk7CisgICAgViByZW1vdmVPbGRlc3QoKTsKKworICAgIHVpbnQzMl90IHNpemUoKSBjb25zdDsKKworICAgIHZvaWQgYWRkVG9DYWNoZShzcDxFbnRyeTxLLCBWPiA+IGVudHJ5LCBLIGtleSwgViB2YWx1ZSk7CisgICAgdm9pZCBhdHRhY2hUb0NhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnkpOworICAgIHZvaWQgZGV0YWNoRnJvbUNhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnkpOworCisgICAgViByZW1vdmVBdChzc2l6ZV90IGluZGV4KTsKKworICAgIEtleWVkVmVjdG9yPEssIHNwPEVudHJ5PEssIFY+ID4gPiBtQ2FjaGU7CisgICAgdWludDMyX3QgbU1heENhcGFjaXR5OworCisgICAgT25FbnRyeVJlbW92ZWQ8SywgVj4qIG1MaXN0ZW5lcjsKKworICAgIHNwPEVudHJ5PEssIFY+ID4gbU9sZGVzdDsKKyAgICBzcDxFbnRyeTxLLCBWPiA+IG1Zb3VuZ2VzdDsKK307IC8vIGNsYXNzIEdlbmVyYXRpb25DYWNoZQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpHZW5lcmF0aW9uQ2FjaGUodWludDMyX3QgbWF4Q2FwYWNpdHkpOiBtTWF4Q2FwYWNpdHkobWF4Q2FwYWNpdHkpLCBtTGlzdGVuZXIoTlVMTCkgeworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK0dlbmVyYXRpb25DYWNoZTxLLCBWPjo6fkdlbmVyYXRpb25DYWNoZSgpIHsKKyAgICBjbGVhcigpOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3VpbnQzMl90IEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6c2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNhY2hlLnNpemUoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpzZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKE9uRW50cnlSZW1vdmVkPEssIFY+KiBsaXN0ZW5lcikgeworICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgordm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmNsZWFyKCkgeworICAgIGlmIChtTGlzdGVuZXIpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG1DYWNoZS52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICgqbUxpc3RlbmVyKShlbnRyeS0+a2V5LCBlbnRyeS0+dmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1DYWNoZS5jbGVhcigpOworICAgIG1Zb3VuZ2VzdC5jbGVhcigpOworICAgIG1PbGRlc3QuY2xlYXIoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK2Jvb2wgR2VuZXJhdGlvbkNhY2hlPEssIFY+Ojpjb250YWlucyhLIGtleSkgY29uc3QgeworICAgIHJldHVybiBtQ2FjaGUuaW5kZXhPZktleShrZXkpID49IDA7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitWIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6Z2V0KEsga2V5KSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG1DYWNoZS52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgaWYgKGVudHJ5LmdldCgpKSB7CisgICAgICAgICAgICBkZXRhY2hGcm9tQ2FjaGUoZW50cnkpOworICAgICAgICAgICAgYXR0YWNoVG9DYWNoZShlbnRyeSk7CisgICAgICAgICAgICByZXR1cm4gZW50cnktPnZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Cit2b2lkIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6cHV0KEsga2V5LCBWIHZhbHVlKSB7CisgICAgaWYgKG1NYXhDYXBhY2l0eSAhPSBrVW5saW1pdGVkQ2FwYWNpdHkgJiYgbUNhY2hlLnNpemUoKSA+PSBtTWF4Q2FwYWNpdHkpIHsKKyAgICAgICAgcmVtb3ZlT2xkZXN0KCk7CisgICAgfQorCisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG1DYWNoZS52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgZGV0YWNoRnJvbUNhY2hlKGVudHJ5KTsKKyAgICAgICAgYWRkVG9DYWNoZShlbnRyeSwga2V5LCB2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG5ldyBFbnRyeTxLLCBWPjsKKyAgICAgICAgYWRkVG9DYWNoZShlbnRyeSwga2V5LCB2YWx1ZSk7CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgordm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmFkZFRvQ2FjaGUoc3A8RW50cnk8SywgVj4gPiBlbnRyeSwgSyBrZXksIFYgdmFsdWUpIHsKKyAgICBlbnRyeS0+a2V5ID0ga2V5OworICAgIGVudHJ5LT52YWx1ZSA9IHZhbHVlOworICAgIG1DYWNoZS5hZGQoa2V5LCBlbnRyeSk7CisgICAgYXR0YWNoVG9DYWNoZShlbnRyeSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitWIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6cmVtb3ZlKEsga2V5KSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgcmV0dXJuIHJlbW92ZUF0KGluZGV4KTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK1YgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpyZW1vdmVBdChzc2l6ZV90IGluZGV4KSB7CisgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG1DYWNoZS52YWx1ZUF0KGluZGV4KTsKKyAgICBpZiAobUxpc3RlbmVyKSB7CisgICAgICAgICgqbUxpc3RlbmVyKShlbnRyeS0+a2V5LCBlbnRyeS0+dmFsdWUpOworICAgIH0KKyAgICBtQ2FjaGUucmVtb3ZlSXRlbXNBdChpbmRleCwgMSk7CisgICAgZGV0YWNoRnJvbUNhY2hlKGVudHJ5KTsKKworICAgIHJldHVybiBlbnRyeS0+dmFsdWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitWIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6cmVtb3ZlT2xkZXN0KCkgeworICAgIGlmIChtT2xkZXN0LmdldCgpKSB7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQ2FjaGUuaW5kZXhPZktleShtT2xkZXN0LT5rZXkpOworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHJlbW92ZUF0KGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgordm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmF0dGFjaFRvQ2FjaGUoc3A8RW50cnk8SywgVj4gPiBlbnRyeSkgeworICAgIGlmICghbVlvdW5nZXN0LmdldCgpKSB7CisgICAgICAgIG1Zb3VuZ2VzdCA9IG1PbGRlc3QgPSBlbnRyeTsKKyAgICB9IGVsc2UgeworICAgICAgICBlbnRyeS0+cGFyZW50ID0gbVlvdW5nZXN0OworICAgICAgICBtWW91bmdlc3QtPmNoaWxkID0gZW50cnk7CisgICAgICAgIG1Zb3VuZ2VzdCA9IGVudHJ5OworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpkZXRhY2hGcm9tQ2FjaGUoc3A8RW50cnk8SywgVj4gPiBlbnRyeSkgeworICAgIGlmIChlbnRyeS0+cGFyZW50LmdldCgpKSB7CisgICAgICAgIGVudHJ5LT5wYXJlbnQtPmNoaWxkID0gZW50cnktPmNoaWxkOworICAgIH0KKworICAgIGlmIChlbnRyeS0+Y2hpbGQuZ2V0KCkpIHsKKyAgICAgICAgZW50cnktPmNoaWxkLT5wYXJlbnQgPSBlbnRyeS0+cGFyZW50OworICAgIH0KKworICAgIGlmIChtT2xkZXN0ID09IGVudHJ5KSB7CisgICAgICAgIG1PbGRlc3QgPSBlbnRyeS0+Y2hpbGQ7CisgICAgfQorCisgICAgaWYgKG1Zb3VuZ2VzdCA9PSBlbnRyeSkgeworICAgICAgICBtWW91bmdlc3QgPSBlbnRyeS0+cGFyZW50OworICAgIH0KKworICAgIGVudHJ5LT5wYXJlbnQuY2xlYXIoKTsKKyAgICBlbnRyeS0+Y2hpbGQuY2xlYXIoKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX0dFTkVSQVRJT05fQ0FDSEVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuY3BwIGIvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OTIwYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvR3JhZGllbnRDYWNoZS5jcHAKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlIDxTa0NhbnZhcy5oPgorI2luY2x1ZGUgPFNrR3JhZGllbnRTaGFkZXIuaD4KKworI2luY2x1ZGUgIkdyYWRpZW50Q2FjaGUuaCIKKyNpbmNsdWRlICJQcm9wZXJ0aWVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworR3JhZGllbnRDYWNoZTo6R3JhZGllbnRDYWNoZSgpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPFNrU2hhZGVyKiwgVGV4dHVyZSo+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUoTUIoREVGQVVMVF9HUkFESUVOVF9DQUNIRV9TSVpFKSkgeworICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX0dSQURJRU5UX0NBQ0hFX1NJWkUsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKKyAgICAgICAgTE9HRCgiICBTZXR0aW5nIGdyYWRpZW50IGNhY2hlIHNpemUgdG8gJXNNQiIsIHByb3BlcnR5KTsKKyAgICAgICAgc2V0TWF4U2l6ZShNQihhdG9mKHByb3BlcnR5KSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCBncmFkaWVudCBjYWNoZSBzaXplIG9mICUuMmZNQiIsIERFRkFVTFRfR1JBRElFTlRfQ0FDSEVfU0laRSk7CisgICAgfQorCisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7Cit9CisKK0dyYWRpZW50Q2FjaGU6OkdyYWRpZW50Q2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPFNrU2hhZGVyKiwgVGV4dHVyZSo+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUobWF4Qnl0ZVNpemUpIHsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKK30KKworR3JhZGllbnRDYWNoZTo6fkdyYWRpZW50Q2FjaGUoKSB7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNpemUgbWFuYWdlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1aW50MzJfdCBHcmFkaWVudENhY2hlOjpnZXRTaXplKCkgeworICAgIHJldHVybiBtU2l6ZTsKK30KKwordWludDMyX3QgR3JhZGllbnRDYWNoZTo6Z2V0TWF4U2l6ZSgpIHsKKyAgICByZXR1cm4gbU1heFNpemU7Cit9CisKK3ZvaWQgR3JhZGllbnRDYWNoZTo6c2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKSB7CisgICAgbU1heFNpemUgPSBtYXhTaXplOworICAgIHdoaWxlIChtU2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhbGxiYWNrcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIEdyYWRpZW50Q2FjaGU6Om9wZXJhdG9yKCkoU2tTaGFkZXIqJiBzaGFkZXIsIFRleHR1cmUqJiB0ZXh0dXJlKSB7CisgICAgaWYgKHNoYWRlcikgeworICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplID0gdGV4dHVyZS0+d2lkdGggKiB0ZXh0dXJlLT5oZWlnaHQgKiA0OworICAgICAgICBtU2l6ZSAtPSBzaXplOworICAgIH0KKworICAgIGlmICh0ZXh0dXJlKSB7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRleHR1cmUtPmlkKTsKKyAgICAgICAgZGVsZXRlIHRleHR1cmU7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1RleHR1cmUqIEdyYWRpZW50Q2FjaGU6OmdldChTa1NoYWRlciogc2hhZGVyKSB7CisgICAgcmV0dXJuIG1DYWNoZS5nZXQoc2hhZGVyKTsKK30KKwordm9pZCBHcmFkaWVudENhY2hlOjpyZW1vdmUoU2tTaGFkZXIqIHNoYWRlcikgeworICAgIG1DYWNoZS5yZW1vdmUoc2hhZGVyKTsKK30KKwordm9pZCBHcmFkaWVudENhY2hlOjpjbGVhcigpIHsKKyAgICBtQ2FjaGUuY2xlYXIoKTsKK30KKworVGV4dHVyZSogR3JhZGllbnRDYWNoZTo6YWRkTGluZWFyR3JhZGllbnQoU2tTaGFkZXIqIHNoYWRlciwgZmxvYXQqIGJvdW5kcywgdWludDMyX3QqIGNvbG9ycywKKyAgICAgICAgZmxvYXQqIHBvc2l0aW9ucywgaW50IGNvdW50LCBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZU1vZGUpIHsKKyAgICBTa0JpdG1hcCBiaXRtYXA7CisgICAgYml0bWFwLnNldENvbmZpZyhTa0JpdG1hcDo6a0FSR0JfODg4OF9Db25maWcsIDEwMjQsIDEpOworICAgIGJpdG1hcC5hbGxvY1BpeGVscygpOworICAgIGJpdG1hcC5lcmFzZUNvbG9yKDApOworCisgICAgU2tDYW52YXMgY2FudmFzKGJpdG1hcCk7CisKKyAgICBTa1BvaW50IHBvaW50c1syXTsKKyAgICBwb2ludHNbMF0uc2V0KDAuMGYsIDAuMGYpOworICAgIHBvaW50c1sxXS5zZXQoYml0bWFwLndpZHRoKCksIDAuMGYpOworCisgICAgU2tTaGFkZXIqIGxvY2FsU2hhZGVyID0gU2tHcmFkaWVudFNoYWRlcjo6Q3JlYXRlTGluZWFyKHBvaW50cywKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2tDb2xvcio+KGNvbG9ycyksIHBvc2l0aW9ucywgY291bnQsIHRpbGVNb2RlKTsKKworICAgIFNrUGFpbnQgcDsKKyAgICBwLnNldFN0eWxlKFNrUGFpbnQ6OmtTdHJva2VBbmRGaWxsX1N0eWxlKTsKKyAgICBwLnNldFNoYWRlcihsb2NhbFNoYWRlciktPnVucmVmKCk7CisKKyAgICBjYW52YXMuZHJhd1JlY3RDb29yZHMoMC4wZiwgMC4wZiwgYml0bWFwLndpZHRoKCksIDEuMGYsIHApOworCisgICAgLy8gQXN1bWUgdGhlIGNhY2hlIGlzIGFsd2F5cyBiaWcgZW5vdWdoCisgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IGJpdG1hcC5yb3dCeXRlcygpICogYml0bWFwLmhlaWdodCgpOworICAgIHdoaWxlIChtU2l6ZSArIHNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgfQorCisgICAgVGV4dHVyZSogdGV4dHVyZSA9IG5ldyBUZXh0dXJlOworICAgIGdlbmVyYXRlVGV4dHVyZSgmYml0bWFwLCB0ZXh0dXJlKTsKKworICAgIG1TaXplICs9IHNpemU7CisgICAgbUNhY2hlLnB1dChzaGFkZXIsIHRleHR1cmUpOworCisgICAgcmV0dXJuIHRleHR1cmU7Cit9CisKK3ZvaWQgR3JhZGllbnRDYWNoZTo6Z2VuZXJhdGVUZXh0dXJlKFNrQml0bWFwKiBiaXRtYXAsIFRleHR1cmUqIHRleHR1cmUpIHsKKyAgICBTa0F1dG9Mb2NrUGl4ZWxzIGF1dG9Mb2NrKCpiaXRtYXApOworICAgIGlmICghYml0bWFwLT5yZWFkeVRvRHJhdygpKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBnZW5lcmF0ZSB0ZXh0dXJlIGZyb20gc2hhZGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0ZXh0dXJlLT5nZW5lcmF0aW9uID0gYml0bWFwLT5nZXRHZW5lcmF0aW9uSUQoKTsKKyAgICB0ZXh0dXJlLT53aWR0aCA9IGJpdG1hcC0+d2lkdGgoKTsKKyAgICB0ZXh0dXJlLT5oZWlnaHQgPSBiaXRtYXAtPmhlaWdodCgpOworCisgICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4dHVyZS0+aWQpOworCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlLT5pZCk7CisgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCBiaXRtYXAtPmJ5dGVzUGVyUGl4ZWwoKSk7CisKKyAgICB0ZXh0dXJlLT5ibGVuZCA9ICFiaXRtYXAtPmlzT3BhcXVlKCk7CisgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIGJpdG1hcC0+cm93Qnl0ZXNBc1BpeGVscygpLCB0ZXh0dXJlLT5oZWlnaHQsIDAsCisgICAgICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBiaXRtYXAtPmdldFBpeGVscygpKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvR3JhZGllbnRDYWNoZS5oIGIvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzk1OTIwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0dSQURJRU5UX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9HUkFESUVOVF9DQUNIRV9ICisKKyNpbmNsdWRlIDxTa1NoYWRlci5oPgorCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorI2luY2x1ZGUgIkdlbmVyYXRpb25DYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogQSBzaW1wbGUgTFJVIGdyYWRpZW50IGNhY2hlLiBUaGUgY2FjaGUgaGFzIGEgbWF4aW11bSBzaXplIGV4cHJlc3NlZCBpbiBieXRlcy4KKyAqIEFueSB0ZXh0dXJlIGFkZGVkIHRvIHRoZSBjYWNoZSBjYXVzaW5nIHRoZSBjYWNoZSB0byBncm93IGJleW9uZCB0aGUgbWF4aW11bQorICogYWxsb3dlZCBzaXplIHdpbGwgYWxzbyBjYXVzZSB0aGUgb2xkZXN0IHRleHR1cmUgdG8gYmUga2lja2VkIG91dC4KKyAqLworY2xhc3MgR3JhZGllbnRDYWNoZTogcHVibGljIE9uRW50cnlSZW1vdmVkPFNrU2hhZGVyKiwgVGV4dHVyZSo+IHsKK3B1YmxpYzoKKyAgICBHcmFkaWVudENhY2hlKCk7CisgICAgR3JhZGllbnRDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk7CisgICAgfkdyYWRpZW50Q2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoU2tTaGFkZXIqJiBzaGFkZXIsIFRleHR1cmUqJiB0ZXh0dXJlKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcgbGluZWFyIGdyYWRpZW50IHRvIHRoZSBjYWNoZS4gVGhlIGdlbmVyYXRlZCB0ZXh0dXJlIGlzCisgICAgICogcmV0dXJuZWQuCisgICAgICovCisgICAgVGV4dHVyZSogYWRkTGluZWFyR3JhZGllbnQoU2tTaGFkZXIqIHNoYWRlciwgZmxvYXQqIGJvdW5kcywgdWludDMyX3QqIGNvbG9ycywKKyAgICAgICAgICAgIGZsb2F0KiBwb3NpdGlvbnMsIGludCBjb3VudCwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVNb2RlKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHNoYWRlci4KKyAgICAgKi8KKyAgICBUZXh0dXJlKiBnZXQoU2tTaGFkZXIqIHNoYWRlcik7CisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgdGV4dHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBzaGFkZXIuIFJldHVybnMgTlVMTAorICAgICAqIGlmIHRoZSB0ZXh0dXJlIGNhbm5vdCBiZSBmb3VuZC4gVXBvbiByZW1vdmUgdGhlIHRleHR1cmUgaXMgZnJlZWQuCisgICAgICovCisgICAgdm9pZCByZW1vdmUoU2tTaGFkZXIqIHNoYWRlcik7CisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjYWNoZS4gVGhpcyBjYXVzZXMgYWxsIHRleHR1cmVzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRNYXhTaXplKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRTaXplKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBnZW5lcmF0ZVRleHR1cmUoU2tCaXRtYXAqIGJpdG1hcCwgVGV4dHVyZSogdGV4dHVyZSk7CisKKyAgICBHZW5lcmF0aW9uQ2FjaGU8U2tTaGFkZXIqLCBUZXh0dXJlKj4gbUNhY2hlOworCisgICAgdWludDMyX3QgbVNpemU7CisgICAgdWludDMyX3QgbU1heFNpemU7Cit9OyAvLyBjbGFzcyBHcmFkaWVudENhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9HUkFESUVOVF9DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTGF5ZXIuaCBiL2xpYnMvaHd1aS9MYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZGI3ODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTGF5ZXIuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0xBWUVSX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9MQVlFUl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8U2tYZmVybW9kZS5oPgorCisjaW5jbHVkZSAiUmVjdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogRGltZW5zaW9ucyBvZiBhIGxheWVyLgorICovCitzdHJ1Y3QgTGF5ZXJTaXplIHsKKyAgICBMYXllclNpemUoKTogd2lkdGgoMCksIGhlaWdodCgwKSwgaWQoMCkgeyB9CisgICAgTGF5ZXJTaXplKGNvbnN0IHVpbnQzMl90IHdpZHRoLCBjb25zdCB1aW50MzJfdCBoZWlnaHQpOiB3aWR0aCh3aWR0aCksIGhlaWdodChoZWlnaHQpLCBpZCgwKSB7IH0KKyAgICBMYXllclNpemUoY29uc3QgTGF5ZXJTaXplJiBzaXplKTogd2lkdGgoc2l6ZS53aWR0aCksIGhlaWdodChzaXplLmhlaWdodCksIGlkKHNpemUuaWQpIHsgfQorCisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworCisgICAgLy8gSW5jcmVtZW50YWwgaWQgdXNlZCBieSB0aGUgbGF5ZXIgY2FjaGUgdG8gc3RvcmUgbXVsdGlwbGUKKyAgICAvLyBMYXllclNpemUgd2l0aCB0aGUgc2FtZSBkaW1lbnNpb25zCisgICAgdWludDMyX3QgaWQ7CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBMYXllclNpemUmIHJocykgY29uc3QgeworICAgICAgICBpZiAoaWQgIT0gMCAmJiByaHMuaWQgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGlkIDwgcmhzLmlkOworICAgICAgICB9CisgICAgICAgIGlmICh3aWR0aCA9PSByaHMud2lkdGgpIHsKKyAgICAgICAgICAgIHJldHVybiBoZWlnaHQgPCByaHMuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiB3aWR0aCA8IHJocy53aWR0aDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTGF5ZXJTaXplJiByaHMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHdpZHRoID09IHJocy53aWR0aCAmJiBoZWlnaHQgPT0gcmhzLmhlaWdodDsKKyAgICB9Cit9OyAvLyBzdHJ1Y3QgTGF5ZXJTaXplCisKKy8qKgorICogQSBsYXllciBoYXMgZGltZW5zaW9ucyBhbmQgaXMgYmFja2VkIGJ5IGFuIE9wZW5HTCB0ZXh0dXJlLgorICovCitzdHJ1Y3QgTGF5ZXIgeworICAgIC8qKgorICAgICAqIENvb3JkaW5hdGVzIG9mIHRoZSBsYXllciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc25hcHNob3QuCisgICAgICogT25seSBzZXQgd2hlbiB0aGUgZmxhZyBrRmxhZ0lzTGF5ZXIgaXMgc2V0LgorICAgICAqLworICAgIFJlY3QgbGF5ZXI7CisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgdGV4dHVyZSB1c2VkIHRvIHJlbmRlciB0aGUgbGF5ZXIuCisgICAgICogT25seSBzZXQgd2hlbiB0aGUgZmxhZyBrRmxhZ0lzTGF5ZXIgaXMgc2V0LgorICAgICAqLworICAgIEdMdWludCB0ZXh0dXJlOworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIEZCTyB1c2VkIHRvIHJlbmRlciB0aGUgbGF5ZXIuCisgICAgICogT25seSBzZXQgd2hlbiB0aGUgZmxhZyBrRmxhZ0lzTGF5ZXIgaXMgc2V0LgorICAgICAqLworICAgIEdMdWludCBmYm87CisgICAgLyoqCisgICAgICogT3BhY2l0eSBvZiB0aGUgbGF5ZXIuCisgICAgICogT25seSBzZXQgd2hlbiB0aGUgZmxhZyBrRmxhZ0lzTGF5ZXIgaXMgc2V0LgorICAgICAqLworICAgIGZsb2F0IGFscGhhOworICAgIC8qKgorICAgICAqIEJsZW5kaW5nIG1vZGUgb2YgdGhlIGxheWVyLgorICAgICAqIE9ubHkgc2V0IHdoZW4gdGhlIGZsYWcga0ZsYWdJc0xheWVyIGlzIHNldC4KKyAgICAgKi8KKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBsYXllciBzaG91bGQgYmUgYmxlbmRlZC4KKyAgICAgKi8KKyAgICBib29sIGJsZW5kOworfTsgLy8gc3RydWN0IExheWVyCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9MQVlFUl9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTGF5ZXJDYWNoZS5jcHAgYi9saWJzL2h3dWkvTGF5ZXJDYWNoZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIwNDc3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9MYXllckNhY2hlLmNwcApAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTGF5ZXJDYWNoZS5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitMYXllckNhY2hlOjpMYXllckNhY2hlKCk6CisgICAgICAgIG1DYWNoZShHZW5lcmF0aW9uQ2FjaGU8TGF5ZXJTaXplLCBMYXllcio+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtSWRHZW5lcmF0b3IoMSksIG1TaXplKDApLCBtTWF4U2l6ZShNQihERUZBVUxUX0xBWUVSX0NBQ0hFX1NJWkUpKSB7CisgICAgY2hhciBwcm9wZXJ0eVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUEVSVFlfTEFZRVJfQ0FDSEVfU0laRSwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgbGF5ZXIgY2FjaGUgc2l6ZSB0byAlc01CIiwgcHJvcGVydHkpOworICAgICAgICBzZXRNYXhTaXplKE1CKGF0b2YocHJvcGVydHkpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IGxheWVyIGNhY2hlIHNpemUgb2YgJS4yZk1CIiwgREVGQVVMVF9MQVlFUl9DQUNIRV9TSVpFKTsKKyAgICB9Cit9CisKK0xheWVyQ2FjaGU6OkxheWVyQ2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPExheWVyU2l6ZSwgTGF5ZXIqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbUlkR2VuZXJhdG9yKDEpLCBtU2l6ZSgwKSwgbU1heFNpemUobWF4Qnl0ZVNpemUpIHsKK30KKworTGF5ZXJDYWNoZTo6fkxheWVyQ2FjaGUoKSB7CisgICAgY2xlYXIoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2l6ZSBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VpbnQzMl90IExheWVyQ2FjaGU6OmdldFNpemUoKSB7CisgICAgcmV0dXJuIG1TaXplOworfQorCit1aW50MzJfdCBMYXllckNhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIHJldHVybiBtTWF4U2l6ZTsKK30KKwordm9pZCBMYXllckNhY2hlOjpzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpIHsKKyAgICBtTWF4U2l6ZSA9IG1heFNpemU7CisgICAgd2hpbGUgKG1TaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgTGF5ZXIqIG9sZGVzdCA9IG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICAgICAgZGVsZXRlTGF5ZXIob2xkZXN0KTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhbGxiYWNrcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIExheWVyQ2FjaGU6Om9wZXJhdG9yKCkoTGF5ZXJTaXplJiBzaXplLCBMYXllciomIGxheWVyKSB7CisgICAgZGVsZXRlTGF5ZXIobGF5ZXIpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgTGF5ZXJDYWNoZTo6ZGVsZXRlTGF5ZXIoTGF5ZXIqIGxheWVyKSB7CisgICAgaWYgKGxheWVyKSB7CisgICAgICAgIG1TaXplIC09IGxheWVyLT5sYXllci5nZXRXaWR0aCgpICogbGF5ZXItPmxheWVyLmdldEhlaWdodCgpICogNDsKKworICAgICAgICBnbERlbGV0ZUZyYW1lYnVmZmVycygxLCAmbGF5ZXItPmZibyk7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJmxheWVyLT50ZXh0dXJlKTsKKyAgICAgICAgZGVsZXRlIGxheWVyOworICAgIH0KK30KKwordm9pZCBMYXllckNhY2hlOjpjbGVhcigpIHsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKKyAgICBtQ2FjaGUuY2xlYXIoKTsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcihOVUxMKTsKK30KKworTGF5ZXIqIExheWVyQ2FjaGU6OmdldChMYXllclNpemUmIHNpemUsIEdMdWludCBwcmV2aW91c0ZibykgeworICAgIExheWVyKiBsYXllciA9IG1DYWNoZS5yZW1vdmUoc2l6ZSk7CisgICAgaWYgKGxheWVyKSB7CisgICAgICAgIExBWUVSX0xPR0QoIlJldXNpbmcgbGF5ZXIiKTsKKworICAgICAgICBtU2l6ZSAtPSBsYXllci0+bGF5ZXIuZ2V0V2lkdGgoKSAqIGxheWVyLT5sYXllci5nZXRIZWlnaHQoKSAqIDQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTEFZRVJfTE9HRCgiQ3JlYXRpbmcgbmV3IGxheWVyIik7CisKKyAgICAgICAgbGF5ZXIgPSBuZXcgTGF5ZXI7CisgICAgICAgIGxheWVyLT5ibGVuZCA9IHRydWU7CisKKyAgICAgICAgLy8gR2VuZXJhdGUgdGhlIEZCTyBhbmQgYXR0YWNoIHRoZSB0ZXh0dXJlCisgICAgICAgIGdsR2VuRnJhbWVidWZmZXJzKDEsICZsYXllci0+ZmJvKTsKKyAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIGxheWVyLT5mYm8pOworCisgICAgICAgIC8vIEdlbmVyYXRlIHRoZSB0ZXh0dXJlIGluIHdoaWNoIHRoZSBGQk8gd2lsbCBkcmF3CisgICAgICAgIGdsR2VuVGV4dHVyZXMoMSwgJmxheWVyLT50ZXh0dXJlKTsKKyAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBsYXllci0+dGV4dHVyZSk7CisKKyAgICAgICAgLy8gVGhlIEZCTyB3aWxsIG5vdCBiZSBzY2FsZWQsIHNvIHdlIGNhbiB1c2UgbG93ZXIgcXVhbGl0eSBmaWx0ZXJpbmcKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOworCisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7CisKKyAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIE5VTEwpOworCisgICAgICAgIC8vIEJpbmQgdGV4dHVyZSB0byBGQk8KKyAgICAgICAgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRChHTF9GUkFNRUJVRkZFUiwgR0xfQ09MT1JfQVRUQUNITUVOVDAsIEdMX1RFWFRVUkVfMkQsCisgICAgICAgICAgICAgICAgbGF5ZXItPnRleHR1cmUsIDApOworCisgICAgICAgIEdMZW51bSBzdGF0dXMgPSBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMoR0xfRlJBTUVCVUZGRVIpOworICAgICAgICBpZiAoc3RhdHVzICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFKSB7CisgICAgICAgICAgICBMT0dFKCJGcmFtZWJ1ZmZlciBpbmNvbXBsZXRlIChHTCBlcnJvciBjb2RlIDB4JXgpIiwgc3RhdHVzKTsKKworICAgICAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIHByZXZpb3VzRmJvKTsKKworICAgICAgICAgICAgZ2xEZWxldGVGcmFtZWJ1ZmZlcnMoMSwgJmxheWVyLT5mYm8pOworICAgICAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmbGF5ZXItPnRleHR1cmUpOworICAgICAgICAgICAgZGVsZXRlIGxheWVyOworCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsYXllcjsKK30KKworYm9vbCBMYXllckNhY2hlOjpwdXQoTGF5ZXJTaXplJiBsYXllclNpemUsIExheWVyKiBsYXllcikgeworICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBsYXllclNpemUud2lkdGggKiBsYXllclNpemUuaGVpZ2h0ICogNDsKKyAgICAvLyBEb24ndCBldmVuIHRyeSB0byBjYWNoZSBhIGxheWVyIHRoYXQncyBiaWdnZXIgdGhhbiB0aGUgY2FjaGUKKyAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgIHdoaWxlIChtU2l6ZSArIHNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICAgICAgTGF5ZXIqIG9sZGVzdCA9IG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICAgICAgICAgIGRlbGV0ZUxheWVyKG9sZGVzdCk7CisgICAgICAgIH0KKworICAgICAgICBsYXllclNpemUuaWQgPSBtSWRHZW5lcmF0b3IrKzsKKyAgICAgICAgbUNhY2hlLnB1dChsYXllclNpemUsIGxheWVyKTsKKyAgICAgICAgbVNpemUgKz0gc2l6ZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9MYXllckNhY2hlLmggYi9saWJzL2h3dWkvTGF5ZXJDYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NjA5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTGF5ZXJDYWNoZS5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0xBWUVSX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9MQVlFUl9DQUNIRV9ICisKKyNpbmNsdWRlICJMYXllci5oIgorI2luY2x1ZGUgIkdlbmVyYXRpb25DYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlZmluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gRGVidWcKKyNkZWZpbmUgREVCVUdfTEFZRVJTIDAKKworLy8gRGVidWcKKyNpZiBERUJVR19MQVlFUlMKKyAgICAjZGVmaW5lIExBWUVSX0xPR0QoLi4uKSBMT0dEKF9fVkFfQVJHU19fKQorI2Vsc2UKKyAgICAjZGVmaW5lIExBWUVSX0xPR0QoLi4uKQorI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIExheWVyQ2FjaGU6IHB1YmxpYyBPbkVudHJ5UmVtb3ZlZDxMYXllclNpemUsIExheWVyKj4geworcHVibGljOgorICAgIExheWVyQ2FjaGUoKTsKKyAgICBMYXllckNhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKTsKKyAgICB+TGF5ZXJDYWNoZSgpOworCisgICAgLyoqCisgICAgICogVXNlZCBhcyBhIGNhbGxiYWNrIHdoZW4gYW4gZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKiBEbyBub3QgaW52b2tlIGRpcmVjdGx5LgorICAgICAqLworICAgIHZvaWQgb3BlcmF0b3IoKShMYXllclNpemUmIHNpemUsIExheWVyKiYgbGF5ZXIpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGF5ZXIgb2Ygc3BlY2lmaWVkIGRpbWVuc2lvbnMuIElmIG5vdCBzdWl0YWJsZSBsYXllcgorICAgICAqIGNhbiBiZSBmb3VuZCwgYSBuZXcgb25lIGlzIGNyZWF0ZWQgYW5kIHJldHVybmVkLiBJZiBjcmVhdGluZyBhIG5ldworICAgICAqIGxheWVyIGZhaWxzLCBOVUxMIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogV2hlbiBhIGxheWVyIGlzIG9idGFpbmVkIGZyb20gdGhlIGNhY2hlLCBpdCBpcyByZW1vdmVkIGFuZCB0aGUgdG90YWwKKyAgICAgKiBzaXplIG9mIHRoZSBjYWNoZSBnb2VzIGRvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgZGltZW5zaW9ucyBvZiB0aGUgZGVzaXJlZCBsYXllcgorICAgICAqIEBwYXJhbSBwcmV2aW91c0ZibyBUaGUgbmFtZSBvZiB0aGUgRkJPIHRvIGJpbmQgdG8gaWYgY3JlYXRpbmcgYSBuZXcKKyAgICAgKiAgICAgICAgbGF5ZXIgZmFpbHMKKyAgICAgKi8KKyAgICBMYXllciogZ2V0KExheWVyU2l6ZSYgc2l6ZSwgR0x1aW50IHByZXZpb3VzRmJvKTsKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBsYXllciB0byB0aGUgY2FjaGUuIFRoZSBsYXllciB3aWxsIG5vdCBiZSBhZGRlZCBpZiB0aGVyZSBpcworICAgICAqIG5vdCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIHNpemUgVGhlIGRpbWVuc2lvbnMgb2YgdGhlIGxheWVyCisgICAgICogQHBhcmFtIGxheWVyIFRoZSBsYXllciB0byBhZGQgdG8gdGhlIGNhY2hlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGxheWVyIHdhcyBhZGRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgcHV0KExheWVyU2l6ZSYgc2l6ZSwgTGF5ZXIqIGxheWVyKTsKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIGNhY2hlLiBUaGlzIGNhdXNlcyBhbGwgbGF5ZXJzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRNYXhTaXplKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRTaXplKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBkZWxldGVMYXllcihMYXllciogbGF5ZXIpOworCisgICAgR2VuZXJhdGlvbkNhY2hlPExheWVyU2l6ZSwgTGF5ZXIqPiBtQ2FjaGU7CisgICAgdWludDMyX3QgbUlkR2VuZXJhdG9yOworCisgICAgdWludDMyX3QgbVNpemU7CisgICAgdWludDMyX3QgbU1heFNpemU7Cit9OyAvLyBjbGFzcyBMYXllckNhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9MQVlFUl9DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnMvaHd1aS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL01hdHJpeC5jcHAgYi9saWJzL2h3dWkvTWF0cml4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjRhZDNkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL01hdHJpeC5jcHAKQEAgLTAsMCArMSwzMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxTa01hdHJpeC5oPgorCisjaW5jbHVkZSAiTWF0cml4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKwordm9pZCBNYXRyaXg0Ojpsb2FkSWRlbnRpdHkoKSB7CisgICAgZGF0YVtrU2NhbGVYXSAgICAgICA9IDEuMGY7CisgICAgZGF0YVtrU2tld1ldICAgICAgICA9IDAuMGY7CisgICAgZGF0YVsyXSAgICAgICAgICAgICA9IDAuMGY7CisgICAgZGF0YVtrUGVyc3BlY3RpdmUwXSA9IDAuMGY7CisKKyAgICBkYXRhW2tTa2V3WF0gICAgICAgID0gMC4wZjsKKyAgICBkYXRhW2tTY2FsZVldICAgICAgID0gMS4wZjsKKyAgICBkYXRhWzZdICAgICAgICAgICAgID0gMC4wZjsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTFdID0gMC4wZjsKKworICAgIGRhdGFbOF0gICAgICAgICAgICAgPSAwLjBmOworICAgIGRhdGFbOV0gICAgICAgICAgICAgPSAwLjBmOworICAgIGRhdGFba1NjYWxlWl0gICAgICAgPSAxLjBmOworICAgIGRhdGFbMTFdICAgICAgICAgICAgPSAwLjBmOworCisgICAgZGF0YVtrVHJhbnNsYXRlWF0gICA9IDAuMGY7CisgICAgZGF0YVtrVHJhbnNsYXRlWV0gICA9IDAuMGY7CisgICAgZGF0YVtrVHJhbnNsYXRlWl0gICA9IDAuMGY7CisgICAgZGF0YVtrUGVyc3BlY3RpdmUyXSA9IDEuMGY7CisKKyAgICBtU2ltcGxlTWF0cml4ID0gdHJ1ZTsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkKGNvbnN0IGZsb2F0KiB2KSB7CisgICAgbWVtY3B5KGRhdGEsIHYsIHNpemVvZihkYXRhKSk7CisgICAgbVNpbXBsZU1hdHJpeCA9IGZhbHNlOworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWQoY29uc3QgTWF0cml4NCYgdikgeworICAgIG1lbWNweShkYXRhLCB2LmRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgbVNpbXBsZU1hdHJpeCA9IHYubVNpbXBsZU1hdHJpeDsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkKGNvbnN0IFNrTWF0cml4JiB2KSB7CisgICAgbWVtc2V0KGRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisKKyAgICBkYXRhW2tTY2FsZVhdICAgICA9IHZbU2tNYXRyaXg6OmtNU2NhbGVYXTsKKyAgICBkYXRhW2tTa2V3WF0gICAgICA9IHZbU2tNYXRyaXg6OmtNU2tld1hdOworICAgIGRhdGFba1RyYW5zbGF0ZVhdID0gdltTa01hdHJpeDo6a01UcmFuc1hdOworCisgICAgZGF0YVtrU2tld1ldICAgICAgPSB2W1NrTWF0cml4OjprTVNrZXdZXTsKKyAgICBkYXRhW2tTY2FsZVldICAgICA9IHZbU2tNYXRyaXg6OmtNU2NhbGVZXTsKKyAgICBkYXRhW2tUcmFuc2xhdGVZXSA9IHZbU2tNYXRyaXg6OmtNVHJhbnNZXTsKKworICAgIGRhdGFba1BlcnNwZWN0aXZlMF0gID0gdltTa01hdHJpeDo6a01QZXJzcDBdOworICAgIGRhdGFba1BlcnNwZWN0aXZlMV0gID0gdltTa01hdHJpeDo6a01QZXJzcDFdOworICAgIGRhdGFba1BlcnNwZWN0aXZlMl0gID0gdltTa01hdHJpeDo6a01QZXJzcDJdOworCisgICAgZGF0YVtrU2NhbGVaXSA9IDEuMGY7CisKKyAgICBtU2ltcGxlTWF0cml4ID0gKHYuZ2V0VHlwZSgpIDw9IFNrTWF0cml4OjprU2NhbGVfTWFzayk7Cit9CisKK3ZvaWQgTWF0cml4NDo6Y29weVRvKFNrTWF0cml4JiB2KSBjb25zdCB7CisgICAgdi5yZXNldCgpOworCisgICAgdi5zZXQoU2tNYXRyaXg6OmtNU2NhbGVYLCBkYXRhW2tTY2FsZVhdKTsKKyAgICB2LnNldChTa01hdHJpeDo6a01Ta2V3WCwgIGRhdGFba1NrZXdYXSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNVHJhbnNYLCBkYXRhW2tUcmFuc2xhdGVYXSk7CisKKyAgICB2LnNldChTa01hdHJpeDo6a01Ta2V3WSwgIGRhdGFba1NrZXdZXSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNU2NhbGVZLCBkYXRhW2tTY2FsZVldKTsKKyAgICB2LnNldChTa01hdHJpeDo6a01UcmFuc1ksIGRhdGFba1RyYW5zbGF0ZVldKTsKKworICAgIHYuc2V0KFNrTWF0cml4OjprTVBlcnNwMCwgZGF0YVtrUGVyc3BlY3RpdmUwXSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNUGVyc3AxLCBkYXRhW2tQZXJzcGVjdGl2ZTFdKTsKKyAgICB2LnNldChTa01hdHJpeDo6a01QZXJzcDIsIGRhdGFba1BlcnNwZWN0aXZlMl0pOworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWRJbnZlcnNlKGNvbnN0IE1hdHJpeDQmIHYpIHsKKyAgICBkb3VibGUgc2NhbGUgPSAxLjAgLworICAgICAgICAgICAgKHYuZGF0YVtrU2NhbGVYXSAqICgoZG91YmxlKSB2LmRhdGFba1NjYWxlWV0gICogdi5kYXRhW2tQZXJzcGVjdGl2ZTJdIC0KKyAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgdi5kYXRhW2tUcmFuc2xhdGVZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUxXSkgKworICAgICAgICAgICAgIHYuZGF0YVtrU2tld1hdICogKChkb3VibGUpIHYuZGF0YVtrVHJhbnNsYXRlWV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMF0gLQorICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgdi5kYXRhW2tTa2V3WV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMl0pICsKKyAgICAgICAgICAgICB2LmRhdGFba1RyYW5zbGF0ZVhdICogKChkb3VibGUpIHYuZGF0YVtrU2tld1ldICogdi5kYXRhW2tQZXJzcGVjdGl2ZTFdIC0KKyAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIHYuZGF0YVtrU2NhbGVZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUwXSkpOworCisgICAgZGF0YVtrU2NhbGVYXSA9ICh2LmRhdGFba1NjYWxlWV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMl0gLQorICAgICAgICAgICAgdi5kYXRhW2tUcmFuc2xhdGVZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUxXSkgICogc2NhbGU7CisgICAgZGF0YVtrU2tld1hdID0gKHYuZGF0YVtrVHJhbnNsYXRlWF0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMV0gLQorICAgICAgICAgICAgdi5kYXRhW2tTa2V3WF0gICogdi5kYXRhW2tQZXJzcGVjdGl2ZTJdKSAqIHNjYWxlOworICAgIGRhdGFba1RyYW5zbGF0ZVhdID0gKHYuZGF0YVtrU2tld1hdICogdi5kYXRhW2tUcmFuc2xhdGVZXSAtCisgICAgICAgICAgICB2LmRhdGFba1RyYW5zbGF0ZVhdICogdi5kYXRhW2tTY2FsZVldKSAgKiBzY2FsZTsKKworICAgIGRhdGFba1NrZXdZXSA9ICh2LmRhdGFba1RyYW5zbGF0ZVldICogdi5kYXRhW2tQZXJzcGVjdGl2ZTBdIC0KKyAgICAgICAgICAgIHYuZGF0YVtrU2tld1ldICAqIHYuZGF0YVtrUGVyc3BlY3RpdmUyXSkgKiBzY2FsZTsKKyAgICBkYXRhW2tTY2FsZVldID0gKHYuZGF0YVtrU2NhbGVYXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUyXSAtCisgICAgICAgICAgICB2LmRhdGFba1RyYW5zbGF0ZVhdICogdi5kYXRhW2tQZXJzcGVjdGl2ZTBdKSAgKiBzY2FsZTsKKyAgICBkYXRhW2tUcmFuc2xhdGVZXSA9ICh2LmRhdGFba1RyYW5zbGF0ZVhdICogdi5kYXRhW2tTa2V3WV0gLQorICAgICAgICAgICAgdi5kYXRhW2tTY2FsZVhdICAqIHYuZGF0YVtrVHJhbnNsYXRlWV0pICogc2NhbGU7CisKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTBdID0gKHYuZGF0YVtrU2tld1ldICogdi5kYXRhW2tQZXJzcGVjdGl2ZTFdIC0KKyAgICAgICAgICAgIHYuZGF0YVtrU2NhbGVZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUwXSkgKiBzY2FsZTsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTFdID0gKHYuZGF0YVtrU2tld1hdICogdi5kYXRhW2tQZXJzcGVjdGl2ZTBdIC0KKyAgICAgICAgICAgIHYuZGF0YVtrU2NhbGVYXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUxXSkgKiBzY2FsZTsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTJdID0gKHYuZGF0YVtrU2NhbGVYXSAqIHYuZGF0YVtrU2NhbGVZXSAtCisgICAgICAgICAgICB2LmRhdGFba1NrZXdYXSAqIHYuZGF0YVtrU2tld1ldKSAqIHNjYWxlOworCisgICAgbVNpbXBsZU1hdHJpeCA9IHYubVNpbXBsZU1hdHJpeDsKK30KKwordm9pZCBNYXRyaXg0Ojpjb3B5VG8oZmxvYXQqIHYpIGNvbnN0IHsKKyAgICBtZW1jcHkodiwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKK30KKworZmxvYXQgTWF0cml4NDo6Z2V0VHJhbnNsYXRlWCgpIHsKKyAgICByZXR1cm4gZGF0YVtrVHJhbnNsYXRlWF07Cit9CisKK2Zsb2F0IE1hdHJpeDQ6OmdldFRyYW5zbGF0ZVkoKSB7CisgICAgcmV0dXJuIGRhdGFba1RyYW5zbGF0ZVldOworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWRUcmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIGxvYWRJZGVudGl0eSgpOworICAgIGRhdGFba1RyYW5zbGF0ZVhdID0geDsKKyAgICBkYXRhW2tUcmFuc2xhdGVZXSA9IHk7CisgICAgZGF0YVtrVHJhbnNsYXRlWl0gPSB6OworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWRTY2FsZShmbG9hdCBzeCwgZmxvYXQgc3ksIGZsb2F0IHN6KSB7CisgICAgbG9hZElkZW50aXR5KCk7CisgICAgZGF0YVtrU2NhbGVYXSA9IHN4OworICAgIGRhdGFba1NjYWxlWV0gPSBzeTsKKyAgICBkYXRhW2tTY2FsZVpdID0gc3o7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZFJvdGF0ZShmbG9hdCBhbmdsZSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIGRhdGFba1BlcnNwZWN0aXZlMF0gID0gMC4wZjsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTFdICA9IDAuMGY7CisgICAgZGF0YVsxMV0gICAgICAgICAgICAgPSAwLjBmOworICAgIGRhdGFba1RyYW5zbGF0ZVhdICAgID0gMC4wZjsKKyAgICBkYXRhW2tUcmFuc2xhdGVZXSAgICA9IDAuMGY7CisgICAgZGF0YVtrVHJhbnNsYXRlWl0gICAgPSAwLjBmOworICAgIGRhdGFba1BlcnNwZWN0aXZlMl0gID0gMS4wZjsKKworICAgIGFuZ2xlICo9IGZsb2F0KE1fUEkgLyAxODAuMGYpOworICAgIGZsb2F0IGMgPSBjb3NmKGFuZ2xlKTsKKyAgICBmbG9hdCBzID0gc2luZihhbmdsZSk7CisKKyAgICBjb25zdCBmbG9hdCBsZW5ndGggPSBzcXJ0Zih4ICogeCArIHkgKiB5ICsgeiAqIHopOworICAgIGZsb2F0IHJlY2lwTGVuID0gMS4wZiAvIGxlbmd0aDsKKyAgICB4ICo9IHJlY2lwTGVuOworICAgIHkgKj0gcmVjaXBMZW47CisgICAgeiAqPSByZWNpcExlbjsKKworICAgIGNvbnN0IGZsb2F0IG5jID0gMS4wZiAtIGM7CisgICAgY29uc3QgZmxvYXQgeHkgPSB4ICogeTsKKyAgICBjb25zdCBmbG9hdCB5eiA9IHkgKiB6OworICAgIGNvbnN0IGZsb2F0IHp4ID0geiAqIHg7CisgICAgY29uc3QgZmxvYXQgeHMgPSB4ICogczsKKyAgICBjb25zdCBmbG9hdCB5cyA9IHkgKiBzOworICAgIGNvbnN0IGZsb2F0IHpzID0geiAqIHM7CisKKyAgICBkYXRhW2tTY2FsZVhdID0geCAqIHggKiBuYyArICBjOworICAgIGRhdGFba1NrZXdYXSAgPSAgICB4eSAqIG5jIC0genM7CisgICAgZGF0YVs4XSAgICAgICA9ICAgIHp4ICogbmMgKyB5czsKKyAgICBkYXRhW2tTa2V3WV0gID0gICAgeHkgKiBuYyArIHpzOworICAgIGRhdGFba1NjYWxlWV0gPSB5ICogeSAqIG5jICsgIGM7CisgICAgZGF0YVs5XSAgICAgICA9ICAgIHl6ICogbmMgLSB4czsKKyAgICBkYXRhWzJdICAgICAgID0gICAgenggKiBuYyAtIHlzOworICAgIGRhdGFbNl0gICAgICAgPSAgICB5eiAqIG5jICsgeHM7CisgICAgZGF0YVtrU2NhbGVaXSA9IHogKiB6ICogbmMgKyAgYzsKKworICAgIG1TaW1wbGVNYXRyaXggPSBmYWxzZTsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkTXVsdGlwbHkoY29uc3QgTWF0cml4NCYgdSwgY29uc3QgTWF0cml4NCYgdikgeworICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IDQgOyBpKyspIHsKKyAgICAgICAgZmxvYXQgeCA9IDA7CisgICAgICAgIGZsb2F0IHkgPSAwOworICAgICAgICBmbG9hdCB6ID0gMDsKKyAgICAgICAgZmxvYXQgdyA9IDA7CisKKyAgICAgICAgZm9yIChpbnQgaiA9IDAgOyBqIDwgNCA7IGorKykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgZSA9IHYuZ2V0KGksIGopOworICAgICAgICAgICAgeCArPSB1LmdldChqLCAwKSAqIGU7CisgICAgICAgICAgICB5ICs9IHUuZ2V0KGosIDEpICogZTsKKyAgICAgICAgICAgIHogKz0gdS5nZXQoaiwgMikgKiBlOworICAgICAgICAgICAgdyArPSB1LmdldChqLCAzKSAqIGU7CisgICAgICAgIH0KKworICAgICAgICBzZXQoaSwgMCwgeCk7CisgICAgICAgIHNldChpLCAxLCB5KTsKKyAgICAgICAgc2V0KGksIDIsIHopOworICAgICAgICBzZXQoaSwgMywgdyk7CisgICAgfQorCisgICAgbVNpbXBsZU1hdHJpeCA9IHUubVNpbXBsZU1hdHJpeCAmJiB2Lm1TaW1wbGVNYXRyaXg7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZE9ydGhvKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGZsb2F0IHRvcCwgZmxvYXQgbmVhciwgZmxvYXQgZmFyKSB7CisgICAgbG9hZElkZW50aXR5KCk7CisgICAgZGF0YVtrU2NhbGVYXSA9IDIuMGYgLyAocmlnaHQgLSBsZWZ0KTsKKyAgICBkYXRhW2tTY2FsZVldID0gMi4wZiAvICh0b3AgLSBib3R0b20pOworICAgIGRhdGFba1NjYWxlWl0gPSAtMi4wZiAvIChmYXIgLSBuZWFyKTsKKyAgICBkYXRhW2tUcmFuc2xhdGVYXSA9IC0ocmlnaHQgKyBsZWZ0KSAvIChyaWdodCAtIGxlZnQpOworICAgIGRhdGFba1RyYW5zbGF0ZVldID0gLSh0b3AgKyBib3R0b20pIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgZGF0YVtrVHJhbnNsYXRlWl0gPSAtKGZhciArIG5lYXIpIC8gKGZhciAtIG5lYXIpOworfQorCisjZGVmaW5lIE1VTF9BRERfU1RPUkUoYSwgYiwgYykgYSA9IChhKSAqIChiKSArIChjKQorCit2b2lkIE1hdHJpeDQ6Om1hcFBvaW50KGZsb2F0JiB4LCBmbG9hdCYgeSkgY29uc3QgeworICAgIGlmIChtU2ltcGxlTWF0cml4KSB7CisgICAgICAgIE1VTF9BRERfU1RPUkUoeCwgZGF0YVtrU2NhbGVYXSwgZGF0YVtrVHJhbnNsYXRlWF0pOworICAgICAgICBNVUxfQUREX1NUT1JFKHksIGRhdGFba1NjYWxlWV0sIGRhdGFba1RyYW5zbGF0ZVldKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZsb2F0IGR4ID0geCAqIGRhdGFba1NjYWxlWF0gKyB5ICogZGF0YVtrU2tld1hdICsgZGF0YVtrVHJhbnNsYXRlWF07CisgICAgZmxvYXQgZHkgPSB4ICogZGF0YVtrU2tld1ldICsgeSAqIGRhdGFba1NjYWxlWV0gKyBkYXRhW2tUcmFuc2xhdGVZXTsKKyAgICBmbG9hdCBkeiA9IHggKiBkYXRhW2tQZXJzcGVjdGl2ZTBdICsgeSAqIGRhdGFba1BlcnNwZWN0aXZlMV0gKyBkYXRhW2tQZXJzcGVjdGl2ZTJdOworICAgIGlmIChkeikgZHogPSAxLjBmIC8gZHo7CisKKyAgICB4ID0gZHggKiBkejsKKyAgICB5ID0gZHkgKiBkejsKK30KKwordm9pZCBNYXRyaXg0OjptYXBSZWN0KFJlY3QmIHIpIGNvbnN0IHsKKyAgICBpZiAobVNpbXBsZU1hdHJpeCkgeworICAgICAgICBNVUxfQUREX1NUT1JFKHIubGVmdCwgZGF0YVtrU2NhbGVYXSwgZGF0YVtrVHJhbnNsYXRlWF0pOworICAgICAgICBNVUxfQUREX1NUT1JFKHIucmlnaHQsIGRhdGFba1NjYWxlWF0sIGRhdGFba1RyYW5zbGF0ZVhdKTsKKyAgICAgICAgTVVMX0FERF9TVE9SRShyLnRvcCwgZGF0YVtrU2NhbGVZXSwgZGF0YVtrVHJhbnNsYXRlWV0pOworICAgICAgICBNVUxfQUREX1NUT1JFKHIuYm90dG9tLCBkYXRhW2tTY2FsZVldLCBkYXRhW2tUcmFuc2xhdGVZXSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmbG9hdCB2ZXJ0aWNlc1tdID0geworICAgICAgICByLmxlZnQsIHIudG9wLAorICAgICAgICByLnJpZ2h0LCByLnRvcCwKKyAgICAgICAgci5yaWdodCwgci5ib3R0b20sCisgICAgICAgIHIubGVmdCwgci5ib3R0b20KKyAgICB9OworCisgICAgZmxvYXQgeCwgeSwgejsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSs9IDIpIHsKKyAgICAgICAgZmxvYXQgcHggPSB2ZXJ0aWNlc1tpXTsKKyAgICAgICAgZmxvYXQgcHkgPSB2ZXJ0aWNlc1tpICsgMV07CisKKyAgICAgICAgeCA9IHB4ICogZGF0YVtrU2NhbGVYXSArIHB5ICogZGF0YVtrU2tld1hdICsgZGF0YVtrVHJhbnNsYXRlWF07CisgICAgICAgIHkgPSBweCAqIGRhdGFba1NrZXdZXSArIHB5ICogZGF0YVtrU2NhbGVZXSArIGRhdGFba1RyYW5zbGF0ZVldOworICAgICAgICB6ID0gcHggKiBkYXRhW2tQZXJzcGVjdGl2ZTBdICsgcHkgKiBkYXRhW2tQZXJzcGVjdGl2ZTFdICsgZGF0YVtrUGVyc3BlY3RpdmUyXTsKKyAgICAgICAgaWYgKHopIHogPSAxLjBmIC8gejsKKworICAgICAgICB2ZXJ0aWNlc1tpXSA9IHggKiB6OworICAgICAgICB2ZXJ0aWNlc1tpICsgMV0gPSB5ICogejsKKyAgICB9CisKKyAgICByLmxlZnQgPSByLnJpZ2h0ID0gdmVydGljZXNbMF07CisgICAgci50b3AgPSByLmJvdHRvbSA9IHZlcnRpY2VzWzFdOworCisgICAgZm9yIChpbnQgaSA9IDI7IGkgPCA4OyBpICs9IDIpIHsKKyAgICAgICAgeCA9IHZlcnRpY2VzW2ldOworICAgICAgICB5ID0gdmVydGljZXNbaSArIDFdOworCisgICAgICAgIGlmICh4IDwgci5sZWZ0KSByLmxlZnQgPSB4OworICAgICAgICBlbHNlIGlmICh4ID4gci5yaWdodCkgci5yaWdodCA9IHg7CisgICAgICAgIGlmICh5IDwgci50b3ApIHIudG9wID0geTsKKyAgICAgICAgZWxzZSBpZiAoeSA+IHIuYm90dG9tKSByLmJvdHRvbSA9IHk7CisgICAgfQorfQorCit2b2lkIE1hdHJpeDQ6OmR1bXAoKSBjb25zdCB7CisgICAgTE9HRCgiTWF0cml4NFtzaW1wbGU9JWQiLCBtU2ltcGxlTWF0cml4KTsKKyAgICBMT0dEKCIgICVmICVmICVmICVmIiwgZGF0YVtrU2NhbGVYXSwgZGF0YVtrU2tld1hdLCBkYXRhWzhdLCBkYXRhW2tUcmFuc2xhdGVYXSk7CisgICAgTE9HRCgiICAlZiAlZiAlZiAlZiIsIGRhdGFba1NrZXdZXSwgZGF0YVtrU2NhbGVZXSwgZGF0YVs5XSwgZGF0YVtrVHJhbnNsYXRlWV0pOworICAgIExPR0QoIiAgJWYgJWYgJWYgJWYiLCBkYXRhWzJdLCBkYXRhWzZdLCBkYXRhW2tTY2FsZVpdLCBkYXRhW2tUcmFuc2xhdGVaXSk7CisgICAgTE9HRCgiICAlZiAlZiAlZiAlZiIsIGRhdGFba1BlcnNwZWN0aXZlMF0sIGRhdGFba1BlcnNwZWN0aXZlMV0sIGRhdGFbMTFdLCBkYXRhW2tQZXJzcGVjdGl2ZTJdKTsKKyAgICBMT0dEKCJdIik7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL01hdHJpeC5oIGIvbGlicy9od3VpL01hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNDdhNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTWF0cml4LmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfTUFUUklYX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9NQVRSSVhfSAorCisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKworI2luY2x1ZGUgIlJlY3QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGFzc2VzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIE1hdHJpeDQgeworcHVibGljOgorICAgIGZsb2F0IGRhdGFbMTZdOworCisgICAgZW51bSBFbnRyeSB7CisgICAgICAgIGtTY2FsZVggPSAwLAorICAgICAgICBrU2tld1kgPSAxLAorICAgICAgICBrUGVyc3BlY3RpdmUwID0gMywKKyAgICAgICAga1NrZXdYID0gNCwKKyAgICAgICAga1NjYWxlWSA9IDUsCisgICAgICAgIGtQZXJzcGVjdGl2ZTEgPSA3LAorICAgICAgICBrU2NhbGVaID0gMTAsCisgICAgICAgIGtUcmFuc2xhdGVYID0gMTIsCisgICAgICAgIGtUcmFuc2xhdGVZID0gMTMsCisgICAgICAgIGtUcmFuc2xhdGVaID0gMTQsCisgICAgICAgIGtQZXJzcGVjdGl2ZTIgPSAxNQorICAgIH07CisKKyAgICBNYXRyaXg0KCkgeworICAgICAgICBsb2FkSWRlbnRpdHkoKTsKKyAgICB9CisKKyAgICBNYXRyaXg0KGNvbnN0IGZsb2F0KiB2KSB7CisgICAgICAgIGxvYWQodik7CisgICAgfQorCisgICAgTWF0cml4NChjb25zdCBNYXRyaXg0JiB2KSB7CisgICAgICAgIGxvYWQodik7CisgICAgfQorCisgICAgTWF0cml4NChjb25zdCBTa01hdHJpeCYgdikgeworICAgICAgICBsb2FkKHYpOworICAgIH0KKworICAgIHZvaWQgbG9hZElkZW50aXR5KCk7CisKKyAgICB2b2lkIGxvYWQoY29uc3QgZmxvYXQqIHYpOworICAgIHZvaWQgbG9hZChjb25zdCBNYXRyaXg0JiB2KTsKKyAgICB2b2lkIGxvYWQoY29uc3QgU2tNYXRyaXgmIHYpOworCisgICAgdm9pZCBsb2FkSW52ZXJzZShjb25zdCBNYXRyaXg0JiB2KTsKKworICAgIHZvaWQgbG9hZFRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKKyAgICB2b2lkIGxvYWRTY2FsZShmbG9hdCBzeCwgZmxvYXQgc3ksIGZsb2F0IHN6KTsKKyAgICB2b2lkIGxvYWRSb3RhdGUoZmxvYXQgYW5nbGUsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopOworICAgIHZvaWQgbG9hZE11bHRpcGx5KGNvbnN0IE1hdHJpeDQmIHUsIGNvbnN0IE1hdHJpeDQmIHYpOworCisgICAgdm9pZCBsb2FkT3J0aG8oZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgdG9wLCBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpOworCisgICAgdm9pZCBtdWx0aXBseShjb25zdCBNYXRyaXg0JiB2KSB7CisgICAgICAgIE1hdHJpeDQgdTsKKyAgICAgICAgdS5sb2FkTXVsdGlwbHkoKnRoaXMsIHYpOworICAgICAgICBsb2FkKHUpOworICAgIH0KKworICAgIHZvaWQgdHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgTWF0cml4NCB1OworICAgICAgICB1LmxvYWRUcmFuc2xhdGUoeCwgeSwgeik7CisgICAgICAgIG11bHRpcGx5KHUpOworICAgIH0KKworICAgIHZvaWQgc2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5LCBmbG9hdCBzeikgeworICAgICAgICBNYXRyaXg0IHU7CisgICAgICAgIHUubG9hZFNjYWxlKHN4LCBzeSwgc3opOworICAgICAgICBtdWx0aXBseSh1KTsKKyAgICB9CisKKyAgICB2b2lkIHJvdGF0ZShmbG9hdCBhbmdsZSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICBNYXRyaXg0IHU7CisgICAgICAgIHUubG9hZFJvdGF0ZShhbmdsZSwgeCwgeSwgeik7CisgICAgICAgIG11bHRpcGx5KHUpOworICAgIH0KKworICAgIHZvaWQgY29weVRvKGZsb2F0KiB2KSBjb25zdDsKKyAgICB2b2lkIGNvcHlUbyhTa01hdHJpeCYgdikgY29uc3Q7CisKKyAgICB2b2lkIG1hcFJlY3QoUmVjdCYgcikgY29uc3Q7CisgICAgdm9pZCBtYXBQb2ludChmbG9hdCYgeCwgZmxvYXQmIHkpIGNvbnN0OworCisgICAgZmxvYXQgZ2V0VHJhbnNsYXRlWCgpOworICAgIGZsb2F0IGdldFRyYW5zbGF0ZVkoKTsKKworICAgIHZvaWQgZHVtcCgpIGNvbnN0OworCitwcml2YXRlOgorICAgIGJvb2wgbVNpbXBsZU1hdHJpeDsKKworICAgIGlubGluZSBmbG9hdCBnZXQoaW50IGksIGludCBqKSBjb25zdCB7CisgICAgICAgIHJldHVybiBkYXRhW2kgKiA0ICsgal07CisgICAgfQorCisgICAgaW5saW5lIHZvaWQgc2V0KGludCBpLCBpbnQgaiwgZmxvYXQgdikgeworICAgICAgICBkYXRhW2kgKiA0ICsgal0gPSB2OworICAgIH0KK307IC8vIGNsYXNzIE1hdHJpeDQKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVHlwZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordHlwZWRlZiBNYXRyaXg0IG1hdDQ7CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9NQVRSSVhfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL05PVElDRSBiL2xpYnMvaHd1aS9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuY3BwIGIvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmY1ZGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmNwcApAQCAtMCwwICsxLDEwMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxTa0NhbnZhcy5oPgorI2luY2x1ZGUgPFNrVHlwZWZhY2UuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiT3BlbkdMUmVuZGVyZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWZpbmVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgUkVRVUlSRURfVEVYVFVSRV9VTklUU19DT1VOVCAzCisKKy8vIEdlbmVyYXRlcyBzaW1wbGUgYW5kIHRleHR1cmVkIHZlcnRpY2VzCisjZGVmaW5lIEZWKHgsIHksIHUsIHYpIHsgeyB4LCB5IH0sIHsgdSwgdiB9IH0KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gR2xvYmFscworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBUaGlzIGFycmF5IGlzIG5ldmVyIHVzZWQgZGlyZWN0bHkgYnV0IHVzZWQgYXMgYSBtZW1jcHkgc291cmNlIGluIHRoZQorLy8gT3BlbkdMUmVuZGVyZXIgY29uc3RydWN0b3IKK3N0YXRpYyBjb25zdCBUZXh0dXJlVmVydGV4IGdNZXNoVmVydGljZXNbXSA9IHsKKyAgICAgICAgRlYoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiksCisgICAgICAgIEZWKDEuMGYsIDAuMGYsIDEuMGYsIDAuMGYpLAorICAgICAgICBGVigwLjBmLCAxLjBmLCAwLjBmLCAxLjBmKSwKKyAgICAgICAgRlYoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikKK307CitzdGF0aWMgY29uc3QgR0xzaXplaSBnTWVzaFN0cmlkZSA9IHNpemVvZihUZXh0dXJlVmVydGV4KTsKK3N0YXRpYyBjb25zdCBHTHNpemVpIGdNZXNoQ291bnQgPSA0OworCisvKioKKyAqIFN0cnVjdHVyZSBtYXBwaW5nIFNraWEgeGZlcm1vZGVzIHRvIE9wZW5HTCBibGVuZGluZyBmYWN0b3JzLgorICovCitzdHJ1Y3QgQmxlbmRlciB7CisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOworICAgIEdMZW51bSBzcmM7CisgICAgR0xlbnVtIGRzdDsKK307IC8vIHN0cnVjdCBCbGVuZGVyCisKKy8vIEluIHRoaXMgYXJyYXksIHRoZSBpbmRleCBvZiBlYWNoIEJsZW5kZXIgZXF1YWxzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QKKy8vIGVudHJ5LiBGb3IgaW5zdGFuY2UsIGdCbGVuZHNbMV0gPT0gZ0JsZW5kc1tTa1hmZXJtb2RlOjprU3JjX01vZGVdCitzdGF0aWMgY29uc3QgQmxlbmRlciBnQmxlbmRzW10gPSB7CisgICAgICAgIHsgU2tYZmVybW9kZTo6a0NsZWFyX01vZGUsICAgR0xfWkVSTywgICAgICAgICAgICAgICAgIEdMX1pFUk8gfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjX01vZGUsICAgICBHTF9PTkUsICAgICAgICAgICAgICAgICAgR0xfWkVSTyB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RfTW9kZSwgICAgIEdMX1pFUk8sICAgICAgICAgICAgICAgICBHTF9PTkUgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlLCBHTF9PTkUsICAgICAgICAgICAgICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RPdmVyX01vZGUsIEdMX09ORV9NSU5VU19EU1RfQUxQSEEsICBHTF9PTkUgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjSW5fTW9kZSwgICBHTF9EU1RfQUxQSEEsICAgICAgICAgICAgR0xfWkVSTyB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RJbl9Nb2RlLCAgIEdMX1pFUk8sICAgICAgICAgICAgICAgICBHTF9TUkNfQUxQSEEgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjT3V0X01vZGUsICBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCAgR0xfWkVSTyB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RPdXRfTW9kZSwgIEdMX1pFUk8sICAgICAgICAgICAgICAgICBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1NyY0FUb3BfTW9kZSwgR0xfRFNUX0FMUEhBLCAgICAgICAgICAgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprRHN0QVRvcF9Nb2RlLCBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCAgR0xfU1JDX0FMUEhBIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1hvcl9Nb2RlLCAgICAgR0xfT05FX01JTlVTX0RTVF9BTFBIQSwgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgfQorfTsKKworc3RhdGljIGNvbnN0IEdMZW51bSBnVGV4dHVyZVVuaXRzW10gPSB7CisgICAgICAgIEdMX1RFWFRVUkUwLAorICAgICAgICBHTF9URVhUVVJFMSwKKyAgICAgICAgR0xfVEVYVFVSRTIKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK09wZW5HTFJlbmRlcmVyOjpPcGVuR0xSZW5kZXJlcigpOiBtQ2FjaGVzKENhY2hlczo6Z2V0SW5zdGFuY2UoKSkgeworICAgIExPR0QoIkNyZWF0ZSBPcGVuR0xSZW5kZXJlciIpOworCisgICAgbVNoYWRlciA9IE5VTEw7CisgICAgbUNvbG9yRmlsdGVyID0gTlVMTDsKKyAgICBtSGFzU2hhZG93ID0gZmFsc2U7CisKKyAgICBtZW1jcHkobU1lc2hWZXJ0aWNlcywgZ01lc2hWZXJ0aWNlcywgc2l6ZW9mKGdNZXNoVmVydGljZXMpKTsKKworICAgIG1GaXJzdFNuYXBzaG90ID0gbmV3IFNuYXBzaG90OworCisgICAgR0xpbnQgbWF4VGV4dHVyZVVuaXRzOworICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMsICZtYXhUZXh0dXJlVW5pdHMpOworICAgIGlmIChtYXhUZXh0dXJlVW5pdHMgPCBSRVFVSVJFRF9URVhUVVJFX1VOSVRTX0NPVU5UKSB7CisgICAgICAgIExPR1coIkF0IGxlYXN0ICVkIHRleHR1cmUgdW5pdHMgYXJlIHJlcXVpcmVkISIsIFJFUVVJUkVEX1RFWFRVUkVfVU5JVFNfQ09VTlQpOworICAgIH0KK30KKworT3BlbkdMUmVuZGVyZXI6On5PcGVuR0xSZW5kZXJlcigpIHsKKyAgICBMT0dEKCJEZXN0cm95IE9wZW5HTFJlbmRlcmVyIik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNldHVwCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgIGdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgbU9ydGhvTWF0cml4LmxvYWRPcnRobygwLCB3aWR0aCwgaGVpZ2h0LCAwLCAtMSwgMSk7CisKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0OworICAgIG1GaXJzdFNuYXBzaG90LT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgbUZpcnN0U25hcHNob3QtPnZpZXdwb3J0LnNldCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cHJlcGFyZSgpIHsKKyAgICBtU25hcHNob3QgPSBuZXcgU25hcHNob3QobUZpcnN0U25hcHNob3QpOworICAgIG1TYXZlQ291bnQgPSAxOworCisgICAgZ2xWaWV3cG9ydCgwLCAwLCBtV2lkdGgsIG1IZWlnaHQpOworCisgICAgZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisKKyAgICBnbENsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKworICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgZ2xTY2lzc29yKDAsIDAsIG1XaWR0aCwgbUhlaWdodCk7CisKKyAgICBtU25hcHNob3QtPnNldENsaXAoMC4wZiwgMC4wZiwgbVdpZHRoLCBtSGVpZ2h0KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6YWNxdWlyZUNvbnRleHQoKSB7CisgICAgaWYgKG1DYWNoZXMuY3VycmVudFByb2dyYW0pIHsKKyAgICAgICAgaWYgKG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmlzSW5Vc2UoKSkgeworICAgICAgICAgICAgbUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+cmVtb3ZlKCk7CisgICAgICAgICAgICBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVsZWFzZUNvbnRleHQoKSB7CisgICAgZ2xWaWV3cG9ydCgwLCAwLCBtU25hcHNob3QtPnZpZXdwb3J0LmdldFdpZHRoKCksIG1TbmFwc2hvdC0+dmlld3BvcnQuZ2V0SGVpZ2h0KCkpOworCisgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKKyAgICBzZXRTY2lzc29yRnJvbUNsaXAoKTsKKworICAgIGlmIChtQ2FjaGVzLmJsZW5kKSB7CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xCbGVuZEZ1bmMobUNhY2hlcy5sYXN0U3JjTW9kZSwgbUNhY2hlcy5sYXN0RHN0TW9kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFN0YXRlIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IE9wZW5HTFJlbmRlcmVyOjpnZXRTYXZlQ291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TYXZlQ291bnQ7Cit9CisKK2ludCBPcGVuR0xSZW5kZXJlcjo6c2F2ZShpbnQgZmxhZ3MpIHsKKyAgICByZXR1cm4gc2F2ZVNuYXBzaG90KCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJlc3RvcmUoKSB7CisgICAgaWYgKG1TYXZlQ291bnQgPiAxKSB7CisgICAgICAgIHJlc3RvcmVTbmFwc2hvdCgpOworICAgIH0KK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVzdG9yZVRvQ291bnQoaW50IHNhdmVDb3VudCkgeworICAgIGlmIChzYXZlQ291bnQgPCAxKSBzYXZlQ291bnQgPSAxOworCisgICAgd2hpbGUgKG1TYXZlQ291bnQgPiBzYXZlQ291bnQpIHsKKyAgICAgICAgcmVzdG9yZVNuYXBzaG90KCk7CisgICAgfQorfQorCitpbnQgT3BlbkdMUmVuZGVyZXI6OnNhdmVTbmFwc2hvdCgpIHsKKyAgICBtU25hcHNob3QgPSBuZXcgU25hcHNob3QobVNuYXBzaG90KTsKKyAgICByZXR1cm4gbVNhdmVDb3VudCsrOworfQorCitib29sIE9wZW5HTFJlbmRlcmVyOjpyZXN0b3JlU25hcHNob3QoKSB7CisgICAgYm9vbCByZXN0b3JlQ2xpcCA9IG1TbmFwc2hvdC0+ZmxhZ3MgJiBTbmFwc2hvdDo6a0ZsYWdDbGlwU2V0OworICAgIGJvb2wgcmVzdG9yZUxheWVyID0gbVNuYXBzaG90LT5mbGFncyAmIFNuYXBzaG90OjprRmxhZ0lzTGF5ZXI7CisgICAgYm9vbCByZXN0b3JlT3J0aG8gPSBtU25hcHNob3QtPmZsYWdzICYgU25hcHNob3Q6OmtGbGFnRGlydHlPcnRobzsKKworICAgIHNwPFNuYXBzaG90PiBjdXJyZW50ID0gbVNuYXBzaG90OworICAgIHNwPFNuYXBzaG90PiBwcmV2aW91cyA9IG1TbmFwc2hvdC0+cHJldmlvdXM7CisKKyAgICBpZiAocmVzdG9yZU9ydGhvKSB7CisgICAgICAgIFJlY3QmIHIgPSBwcmV2aW91cy0+dmlld3BvcnQ7CisgICAgICAgIGdsVmlld3BvcnQoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20pOworICAgICAgICBtT3J0aG9NYXRyaXgubG9hZChjdXJyZW50LT5vcnRob01hdHJpeCk7CisgICAgfQorCisgICAgbVNhdmVDb3VudC0tOworICAgIG1TbmFwc2hvdCA9IHByZXZpb3VzOworCisgICAgaWYgKHJlc3RvcmVMYXllcikgeworICAgICAgICBjb21wb3NlTGF5ZXIoY3VycmVudCwgcHJldmlvdXMpOworICAgIH0KKworICAgIGlmIChyZXN0b3JlQ2xpcCkgeworICAgICAgICBzZXRTY2lzc29yRnJvbUNsaXAoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdG9yZUNsaXA7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIExheWVycworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpbnQgT3BlbkdMUmVuZGVyZXI6OnNhdmVMYXllcihmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIGNvbnN0IFNrUGFpbnQqIHAsIGludCBmbGFncykgeworICAgIGludCBjb3VudCA9IHNhdmVTbmFwc2hvdCgpOworCisgICAgaW50IGFscGhhID0gMjU1OworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKworICAgIGlmIChwKSB7CisgICAgICAgIGFscGhhID0gcC0+Z2V0QWxwaGEoKTsKKyAgICAgICAgY29uc3QgYm9vbCBpc01vZGUgPSBTa1hmZXJtb2RlOjpJc01vZGUocC0+Z2V0WGZlcm1vZGUoKSwgJm1vZGUpOworICAgICAgICBpZiAoIWlzTW9kZSkgeworICAgICAgICAgICAgLy8gQXNzdW1lIFNSQ19PVkVSCisgICAgICAgICAgICBtb2RlID0gU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1vZGUgPSBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlOworICAgIH0KKworICAgIGlmIChhbHBoYSA+IDAgJiYgIW1TbmFwc2hvdC0+aW52aXNpYmxlKSB7CisgICAgICAgIGNyZWF0ZUxheWVyKG1TbmFwc2hvdCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBhbHBoYSwgbW9kZSwgZmxhZ3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TbmFwc2hvdC0+aW52aXNpYmxlID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKK2ludCBPcGVuR0xSZW5kZXJlcjo6c2F2ZUxheWVyQWxwaGEoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBpbnQgYWxwaGEsIGludCBmbGFncykgeworICAgIGludCBjb3VudCA9IHNhdmVTbmFwc2hvdCgpOworICAgIGlmIChhbHBoYSA+IDAgJiYgIW1TbmFwc2hvdC0+aW52aXNpYmxlKSB7CisgICAgICAgIGNyZWF0ZUxheWVyKG1TbmFwc2hvdCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBhbHBoYSwgU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZSwgZmxhZ3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TbmFwc2hvdC0+aW52aXNpYmxlID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCitib29sIE9wZW5HTFJlbmRlcmVyOjpjcmVhdGVMYXllcihzcDxTbmFwc2hvdD4gc25hcHNob3QsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwKKyAgICAgICAgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsaW50IGZsYWdzKSB7CisgICAgTEFZRVJfTE9HRCgiUmVxdWVzdGluZyBsYXllciAlZnglZiIsIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wKTsKKyAgICBMQVlFUl9MT0dEKCJMYXllciBjYWNoZSBzaXplID0gJWQiLCBtQ2FjaGVzLmxheWVyQ2FjaGUuZ2V0U2l6ZSgpKTsKKworICAgIEdMdWludCBwcmV2aW91c0ZibyA9IHNuYXBzaG90LT5wcmV2aW91cy5nZXQoKSA/IHNuYXBzaG90LT5wcmV2aW91cy0+ZmJvIDogMDsKKyAgICBMYXllclNpemUgc2l6ZShyaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7CisKKyAgICBMYXllciogbGF5ZXIgPSBtQ2FjaGVzLmxheWVyQ2FjaGUuZ2V0KHNpemUsIHByZXZpb3VzRmJvKTsKKyAgICBpZiAoIWxheWVyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgbGF5ZXItPmZibyk7CisKKyAgICAvLyBDbGVhciB0aGUgRkJPCisgICAgZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgZ2xDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKKworICAgIGxheWVyLT5tb2RlID0gbW9kZTsKKyAgICBsYXllci0+YWxwaGEgPSBhbHBoYSAvIDI1NS4wZjsKKyAgICBsYXllci0+bGF5ZXIuc2V0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisKKyAgICAvLyBTYXZlIHRoZSBsYXllciBpbiB0aGUgc25hcHNob3QKKyAgICBzbmFwc2hvdC0+ZmxhZ3MgfD0gU25hcHNob3Q6OmtGbGFnSXNMYXllcjsKKyAgICBzbmFwc2hvdC0+bGF5ZXIgPSBsYXllcjsKKyAgICBzbmFwc2hvdC0+ZmJvID0gbGF5ZXItPmZibzsKKyAgICBzbmFwc2hvdC0+dHJhbnNmb3JtLmxvYWRUcmFuc2xhdGUoLWxlZnQsIC10b3AsIDAuMGYpOworICAgIHNuYXBzaG90LT5zZXRDbGlwKDAuMGYsIDAuMGYsIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wKTsKKyAgICBzbmFwc2hvdC0+dmlld3BvcnQuc2V0KDAuMGYsIDAuMGYsIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wKTsKKyAgICBzbmFwc2hvdC0+aGVpZ2h0ID0gYm90dG9tIC0gdG9wOworICAgIHNuYXBzaG90LT5mbGFncyB8PSBTbmFwc2hvdDo6a0ZsYWdEaXJ0eU9ydGhvOworICAgIHNuYXBzaG90LT5vcnRob01hdHJpeC5sb2FkKG1PcnRob01hdHJpeCk7CisKKyAgICBzZXRTY2lzc29yRnJvbUNsaXAoKTsKKworICAgIC8vIENoYW5nZSB0aGUgb3J0aG8gcHJvamVjdGlvbgorICAgIGdsVmlld3BvcnQoMCwgMCwgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3ApOworICAgIG1PcnRob01hdHJpeC5sb2FkT3J0aG8oMC4wZiwgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3AsIDAuMGYsIC0xLjBmLCAxLjBmKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpjb21wb3NlTGF5ZXIoc3A8U25hcHNob3Q+IGN1cnJlbnQsIHNwPFNuYXBzaG90PiBwcmV2aW91cykgeworICAgIGlmICghY3VycmVudC0+bGF5ZXIpIHsKKyAgICAgICAgTE9HRSgiQXR0ZW1wdGluZyB0byBjb21wb3NlIGEgbGF5ZXIgdGhhdCBkb2VzIG5vdCBleGlzdCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVW5iaW5kIGN1cnJlbnQgRkJPIGFuZCByZXN0b3JlIHByZXZpb3VzIG9uZQorICAgIC8vIE1vc3Qgb2YgdGhlIHRpbWUsIHByZXZpb3VzLT5mYm8gd2lsbCBiZSAwIHRvIGJpbmQgdGhlIGRlZmF1bHQgYnVmZmVyCisgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIHByZXZpb3VzLT5mYm8pOworCisgICAgLy8gUmVzdG9yZSB0aGUgY2xpcCBmcm9tIHRoZSBwcmV2aW91cyBzbmFwc2hvdAorICAgIGNvbnN0IFJlY3QmIGNsaXAgPSBwcmV2aW91cy0+Y2xpcFJlY3Q7CisgICAgZ2xTY2lzc29yKGNsaXAubGVmdCwgbUhlaWdodCAtIGNsaXAuYm90dG9tLCBjbGlwLmdldFdpZHRoKCksIGNsaXAuZ2V0SGVpZ2h0KCkpOworCisgICAgTGF5ZXIqIGxheWVyID0gY3VycmVudC0+bGF5ZXI7CisgICAgY29uc3QgUmVjdCYgcmVjdCA9IGxheWVyLT5sYXllcjsKKworICAgIC8vIEZCT3MgYXJlIGFscmVhZHkgZHJhd24gd2l0aCBhIHRvcC1sZWZ0IG9yaWdpbiwgZG9uJ3QgZmxpcCB0aGUgdGV4dHVyZQorICAgIHJlc2V0RHJhd1RleHR1cmVUZXhDb29yZHMoMC4wZiwgMS4wZiwgMS4wZiwgMC4wZik7CisKKyAgICBkcmF3VGV4dHVyZVJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sCisgICAgICAgICAgICBsYXllci0+dGV4dHVyZSwgbGF5ZXItPmFscGhhLCBsYXllci0+bW9kZSwgbGF5ZXItPmJsZW5kKTsKKworICAgIHJlc2V0RHJhd1RleHR1cmVUZXhDb29yZHMoMC4wZiwgMC4wZiwgMS4wZiwgMS4wZik7CisKKyAgICBMYXllclNpemUgc2l6ZShyZWN0LmdldFdpZHRoKCksIHJlY3QuZ2V0SGVpZ2h0KCkpOworICAgIC8vIEZhaWxpbmcgdG8gYWRkIHRoZSBsYXllciB0byB0aGUgY2FjaGUgc2hvdWxkIGhhcHBlbiBvbmx5IGlmIHRoZQorICAgIC8vIGxheWVyIGlzIHRvbyBsYXJnZQorICAgIGlmICghbUNhY2hlcy5sYXllckNhY2hlLnB1dChzaXplLCBsYXllcikpIHsKKyAgICAgICAgTEFZRVJfTE9HRCgiRGVsZXRpbmcgbGF5ZXIiKTsKKworICAgICAgICBnbERlbGV0ZUZyYW1lYnVmZmVycygxLCAmbGF5ZXItPmZibyk7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJmxheWVyLT50ZXh0dXJlKTsKKworICAgICAgICBkZWxldGUgbGF5ZXI7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUcmFuc2Zvcm1zCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnRyYW5zbGF0ZShmbG9hdCBkeCwgZmxvYXQgZHkpIHsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS50cmFuc2xhdGUoZHgsIGR5LCAwLjBmKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cm90YXRlKGZsb2F0IGRlZ3JlZXMpIHsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS5yb3RhdGUoZGVncmVlcywgMC4wZiwgMC4wZiwgMS4wZik7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNjYWxlKGZsb2F0IHN4LCBmbG9hdCBzeSkgeworICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLnNjYWxlKHN4LCBzeSwgMS4wZik7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldE1hdHJpeChTa01hdHJpeCogbWF0cml4KSB7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0ubG9hZCgqbWF0cml4KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6Z2V0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS5jb3B5VG8oKm1hdHJpeCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmNvbmNhdE1hdHJpeChTa01hdHJpeCogbWF0cml4KSB7CisgICAgbWF0NCBtKCptYXRyaXgpOworICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLm11bHRpcGx5KG0pOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGlwcGluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXRTY2lzc29yRnJvbUNsaXAoKSB7CisgICAgY29uc3QgUmVjdCYgY2xpcCA9IG1TbmFwc2hvdC0+Y2xpcFJlY3Q7CisgICAgZ2xTY2lzc29yKGNsaXAubGVmdCwgbVNuYXBzaG90LT5oZWlnaHQgLSBjbGlwLmJvdHRvbSwgY2xpcC5nZXRXaWR0aCgpLCBjbGlwLmdldEhlaWdodCgpKTsKK30KKworY29uc3QgUmVjdCYgT3BlbkdMUmVuZGVyZXI6OmdldENsaXBCb3VuZHMoKSB7CisgICAgcmV0dXJuIG1TbmFwc2hvdC0+Z2V0TG9jYWxDbGlwKCk7Cit9CisKK2Jvb2wgT3BlbkdMUmVuZGVyZXI6OnF1aWNrUmVqZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSkgeworICAgIGlmIChtU25hcHNob3QtPmludmlzaWJsZSkgcmV0dXJuIHRydWU7CisKKyAgICBSZWN0IHIobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS5tYXBSZWN0KHIpOworICAgIHJldHVybiAhbVNuYXBzaG90LT5jbGlwUmVjdC5pbnRlcnNlY3RzKHIpOworfQorCitib29sIE9wZW5HTFJlbmRlcmVyOjpjbGlwUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIFNrUmVnaW9uOjpPcCBvcCkgeworICAgIGJvb2wgY2xpcHBlZCA9IG1TbmFwc2hvdC0+Y2xpcChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIG9wKTsKKyAgICBpZiAoY2xpcHBlZCkgeworICAgICAgICBzZXRTY2lzc29yRnJvbUNsaXAoKTsKKyAgICB9CisgICAgcmV0dXJuICFtU25hcHNob3QtPmNsaXBSZWN0LmlzRW1wdHkoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRHJhd2luZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBjb25zdCBmbG9hdCByaWdodCA9IGxlZnQgKyBiaXRtYXAtPndpZHRoKCk7CisgICAgY29uc3QgZmxvYXQgYm90dG9tID0gdG9wICsgYml0bWFwLT5oZWlnaHQoKTsKKworICAgIGlmIChxdWlja1JlamVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGVzLnRleHR1cmVDYWNoZS5nZXQoYml0bWFwKTsKKyAgICBpZiAoIXRleHR1cmUpIHJldHVybjsKKyAgICBjb25zdCBBdXRvVGV4dHVyZSBhdXRvQ2xlYW51cCh0ZXh0dXJlKTsKKworICAgIGRyYXdUZXh0dXJlUmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHRleHR1cmUsIHBhaW50KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBjb25zdCBTa01hdHJpeCogbWF0cml4LCBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIFJlY3QgcigwLjBmLCAwLjBmLCBiaXRtYXAtPndpZHRoKCksIGJpdG1hcC0+aGVpZ2h0KCkpOworICAgIGNvbnN0IG1hdDQgdHJhbnNmb3JtKCptYXRyaXgpOworICAgIHRyYW5zZm9ybS5tYXBSZWN0KHIpOworCisgICAgaWYgKHF1aWNrUmVqZWN0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBjb25zdCBUZXh0dXJlKiB0ZXh0dXJlID0gbUNhY2hlcy50ZXh0dXJlQ2FjaGUuZ2V0KGJpdG1hcCk7CisgICAgaWYgKCF0ZXh0dXJlKSByZXR1cm47CisgICAgY29uc3QgQXV0b1RleHR1cmUgYXV0b0NsZWFudXAodGV4dHVyZSk7CisKKyAgICBkcmF3VGV4dHVyZVJlY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20sIHRleHR1cmUsIHBhaW50KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLAorICAgICAgICAgZmxvYXQgc3JjTGVmdCwgZmxvYXQgc3JjVG9wLCBmbG9hdCBzcmNSaWdodCwgZmxvYXQgc3JjQm90dG9tLAorICAgICAgICAgZmxvYXQgZHN0TGVmdCwgZmxvYXQgZHN0VG9wLCBmbG9hdCBkc3RSaWdodCwgZmxvYXQgZHN0Qm90dG9tLAorICAgICAgICAgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBpZiAocXVpY2tSZWplY3QoZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBjb25zdCBUZXh0dXJlKiB0ZXh0dXJlID0gbUNhY2hlcy50ZXh0dXJlQ2FjaGUuZ2V0KGJpdG1hcCk7CisgICAgaWYgKCF0ZXh0dXJlKSByZXR1cm47CisgICAgY29uc3QgQXV0b1RleHR1cmUgYXV0b0NsZWFudXAodGV4dHVyZSk7CisKKyAgICBjb25zdCBmbG9hdCB3aWR0aCA9IHRleHR1cmUtPndpZHRoOworICAgIGNvbnN0IGZsb2F0IGhlaWdodCA9IHRleHR1cmUtPmhlaWdodDsKKworICAgIGNvbnN0IGZsb2F0IHUxID0gc3JjTGVmdCAvIHdpZHRoOworICAgIGNvbnN0IGZsb2F0IHYxID0gc3JjVG9wIC8gaGVpZ2h0OworICAgIGNvbnN0IGZsb2F0IHUyID0gc3JjUmlnaHQgLyB3aWR0aDsKKyAgICBjb25zdCBmbG9hdCB2MiA9IHNyY0JvdHRvbSAvIGhlaWdodDsKKworICAgIHJlc2V0RHJhd1RleHR1cmVUZXhDb29yZHModTEsIHYxLCB1MiwgdjIpOworCisgICAgZHJhd1RleHR1cmVSZWN0KGRzdExlZnQsIGRzdFRvcCwgZHN0UmlnaHQsIGRzdEJvdHRvbSwgdGV4dHVyZSwgcGFpbnQpOworCisgICAgcmVzZXREcmF3VGV4dHVyZVRleENvb3JkcygwLjBmLCAwLjBmLCAxLjBmLCAxLjBmKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1BhdGNoKFNrQml0bWFwKiBiaXRtYXAsIFJlc19wbmdfOXBhdGNoKiBwYXRjaCwKKyAgICAgICAgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIGlmIChxdWlja1JlamVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGVzLnRleHR1cmVDYWNoZS5nZXQoYml0bWFwKTsKKyAgICBpZiAoIXRleHR1cmUpIHJldHVybjsKKyAgICBjb25zdCBBdXRvVGV4dHVyZSBhdXRvQ2xlYW51cCh0ZXh0dXJlKTsKKworICAgIGludCBhbHBoYTsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisgICAgZ2V0QWxwaGFBbmRNb2RlKHBhaW50LCAmYWxwaGEsICZtb2RlKTsKKworICAgIFBhdGNoKiBtZXNoID0gbUNhY2hlcy5wYXRjaENhY2hlLmdldChwYXRjaCk7CisgICAgbWVzaC0+dXBkYXRlVmVydGljZXMoYml0bWFwLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sCisgICAgICAgICAgICAmcGF0Y2gtPnhEaXZzWzBdLCAmcGF0Y2gtPnlEaXZzWzBdLCBwYXRjaC0+bnVtWERpdnMsIHBhdGNoLT5udW1ZRGl2cyk7CisKKyAgICAvLyBTcGVjaWZ5IHJpZ2h0IGFuZCBib3R0b20gYXMgKzEuMGYgZnJvbSBsZWZ0L3RvcCB0byBwcmV2ZW50IHNjYWxpbmcgc2luY2UgdGhlCisgICAgLy8gcGF0Y2ggbWVzaCBhbHJlYWR5IGRlZmluZXMgdGhlIGZpbmFsIHNpemUKKyAgICBkcmF3VGV4dHVyZU1lc2gobGVmdCwgdG9wLCBsZWZ0ICsgMS4wZiwgdG9wICsgMS4wZiwgdGV4dHVyZS0+aWQsIGFscGhhIC8gMjU1LjBmLAorICAgICAgICAgICAgbW9kZSwgdGV4dHVyZS0+YmxlbmQsICZtZXNoLT52ZXJ0aWNlc1swXS5wb3NpdGlvblswXSwKKyAgICAgICAgICAgICZtZXNoLT52ZXJ0aWNlc1swXS50ZXh0dXJlWzBdLCBtZXNoLT5pbmRpY2VzLCBtZXNoLT5pbmRpY2VzQ291bnQpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3Q29sb3IoaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpIHsKKyAgICBpZiAobVNuYXBzaG90LT5pbnZpc2libGUpIHJldHVybjsKKyAgICBjb25zdCBSZWN0JiBjbGlwID0gbVNuYXBzaG90LT5jbGlwUmVjdDsKKyAgICBkcmF3Q29sb3JSZWN0KGNsaXAubGVmdCwgY2xpcC50b3AsIGNsaXAucmlnaHQsIGNsaXAuYm90dG9tLCBjb2xvciwgbW9kZSwgdHJ1ZSk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgY29uc3QgU2tQYWludCogcCkgeworICAgIGlmIChxdWlja1JlamVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisKKyAgICBjb25zdCBib29sIGlzTW9kZSA9IFNrWGZlcm1vZGU6OklzTW9kZShwLT5nZXRYZmVybW9kZSgpLCAmbW9kZSk7CisgICAgaWYgKCFpc01vZGUpIHsKKyAgICAgICAgLy8gQXNzdW1lIFNSQ19PVkVSCisgICAgICAgIG1vZGUgPSBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlOworICAgIH0KKworICAgIC8vIFNraWEgZHJhd3MgdXNpbmcgdGhlIGNvbG9yJ3MgYWxwaGEgY2hhbm5lbCBpZiA8IDI1NQorICAgIC8vIE90aGVyd2lzZSwgaXQgdXNlcyB0aGUgcGFpbnQncyBhbHBoYQorICAgIGludCBjb2xvciA9IHAtPmdldENvbG9yKCk7CisgICAgaWYgKCgoY29sb3IgPj4gMjQpICYgMHhmZikgPT0gMjU1KSB7CisgICAgICAgIGNvbG9yIHw9IHAtPmdldEFscGhhKCkgPDwgMjQ7CisgICAgfQorCisgICAgZHJhd0NvbG9yUmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIGNvbG9yLCBtb2RlKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1RleHQoY29uc3QgY2hhciogdGV4dCwgaW50IGJ5dGVzQ291bnQsIGludCBjb3VudCwKKyAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgU2tQYWludCogcGFpbnQpIHsKKyAgICBpZiAobVNuYXBzaG90LT5pbnZpc2libGUgfHwgdGV4dCA9PSBOVUxMIHx8IGNvdW50ID09IDAgfHwKKyAgICAgICAgICAgIChwYWludC0+Z2V0QWxwaGEoKSA9PSAwICYmIHBhaW50LT5nZXRYZmVybW9kZSgpID09IE5VTEwpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmbG9hdCBzY2FsZVggPSBwYWludC0+Z2V0VGV4dFNjYWxlWCgpOworICAgIGJvb2wgYXBwbHlTY2FsZVggPSBzY2FsZVggPCAwLjk5OTlmIHx8IHNjYWxlWCA+IDEuMDAwMWY7CisgICAgaWYgKGFwcGx5U2NhbGVYKSB7CisgICAgICAgIHNhdmUoMCk7CisgICAgICAgIHRyYW5zbGF0ZSh4IC0gKHggKiBzY2FsZVgpLCAwLjBmKTsKKyAgICAgICAgc2NhbGUoc2NhbGVYLCAxLjBmKTsKKyAgICB9CisKKyAgICBmbG9hdCBsZW5ndGggPSAtMS4wZjsKKyAgICBzd2l0Y2ggKHBhaW50LT5nZXRUZXh0QWxpZ24oKSkgeworICAgICAgICBjYXNlIFNrUGFpbnQ6OmtDZW50ZXJfQWxpZ246CisgICAgICAgICAgICBsZW5ndGggPSBwYWludC0+bWVhc3VyZVRleHQodGV4dCwgYnl0ZXNDb3VudCk7CisgICAgICAgICAgICB4IC09IGxlbmd0aCAvIDIuMGY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhaW50OjprUmlnaHRfQWxpZ246CisgICAgICAgICAgICBsZW5ndGggPSBwYWludC0+bWVhc3VyZVRleHQodGV4dCwgYnl0ZXNDb3VudCk7CisgICAgICAgICAgICB4IC09IGxlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaW50IGFscGhhOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKyAgICBnZXRBbHBoYUFuZE1vZGUocGFpbnQsICZhbHBoYSwgJm1vZGUpOworCisgICAgdWludDMyX3QgY29sb3IgPSBwYWludC0+Z2V0Q29sb3IoKTsKKyAgICBjb25zdCBHTGZsb2F0IGEgPSBhbHBoYSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IHIgPSBhICogKChjb2xvciA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGcgPSBhICogKChjb2xvciA+PiAgOCkgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGIgPSBhICogKChjb2xvciAgICAgICkgJiAweEZGKSAvIDI1NS4wZjsKKworICAgIEZvbnRSZW5kZXJlciYgZm9udFJlbmRlcmVyID0gbUNhY2hlcy5mb250UmVuZGVyZXIuZ2V0Rm9udFJlbmRlcmVyKHBhaW50KTsKKyAgICBmb250UmVuZGVyZXIuc2V0Rm9udChwYWludCwgU2tUeXBlZmFjZTo6VW5pcXVlSUQocGFpbnQtPmdldFR5cGVmYWNlKCkpLAorICAgICAgICAgICAgcGFpbnQtPmdldFRleHRTaXplKCkpOworICAgIGlmIChtSGFzU2hhZG93KSB7CisgICAgICAgIGdsQWN0aXZlVGV4dHVyZShnVGV4dHVyZVVuaXRzWzBdKTsKKyAgICAgICAgbUNhY2hlcy5kcm9wU2hhZG93Q2FjaGUuc2V0Rm9udFJlbmRlcmVyKGZvbnRSZW5kZXJlcik7CisgICAgICAgIGNvbnN0IFNoYWRvd1RleHR1cmUqIHNoYWRvdyA9IG1DYWNoZXMuZHJvcFNoYWRvd0NhY2hlLmdldChwYWludCwgdGV4dCwgYnl0ZXNDb3VudCwKKyAgICAgICAgICAgICAgICBjb3VudCwgbVNoYWRvd1JhZGl1cyk7CisgICAgICAgIGNvbnN0IEF1dG9UZXh0dXJlIGF1dG9DbGVhbnVwKHNoYWRvdyk7CisKKyAgICAgICAgc2V0dXBTaGFkb3coc2hhZG93LCB4LCB5LCBtb2RlLCBhKTsKKworICAgICAgICAvLyBEcmF3IHRoZSBtZXNoCisgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgZ01lc2hDb3VudCk7CisgICAgICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmdldEF0dHJpYigidGV4Q29vcmRzIikpOworICAgIH0KKworICAgIEdMdWludCB0ZXh0dXJlVW5pdCA9IDA7CisgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNbdGV4dHVyZVVuaXRdKTsKKworICAgIHNldHVwVGV4dHVyZUFscGhhOChmb250UmVuZGVyZXIuZ2V0VGV4dHVyZSgpLCAwLCAwLCB0ZXh0dXJlVW5pdCwgeCwgeSwgciwgZywgYiwgYSwKKyAgICAgICAgICAgIG1vZGUsIGZhbHNlLCB0cnVlKTsKKworICAgIGNvbnN0IFJlY3QmIGNsaXAgPSBtU25hcHNob3QtPmdldExvY2FsQ2xpcCgpOworICAgIGZvbnRSZW5kZXJlci5yZW5kZXJUZXh0KHBhaW50LCAmY2xpcCwgdGV4dCwgMCwgYnl0ZXNDb3VudCwgY291bnQsIHgsIHkpOworCisgICAgZ2xCaW5kQnVmZmVyKEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCAwKTsKKyAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5nZXRBdHRyaWIoInRleENvb3JkcyIpKTsKKworICAgIGRyYXdUZXh0RGVjb3JhdGlvbnModGV4dCwgYnl0ZXNDb3VudCwgbGVuZ3RoLCB4LCB5LCBwYWludCk7CisKKyAgICBpZiAoYXBwbHlTY2FsZVgpIHsKKyAgICAgICAgcmVzdG9yZSgpOworICAgIH0KK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1BhdGgoU2tQYXRoKiBwYXRoLCBTa1BhaW50KiBwYWludCkgeworICAgIGlmIChtU25hcHNob3QtPmludmlzaWJsZSkgcmV0dXJuOworCisgICAgR0x1aW50IHRleHR1cmVVbml0ID0gMDsKKyAgICBnbEFjdGl2ZVRleHR1cmUoZ1RleHR1cmVVbml0c1t0ZXh0dXJlVW5pdF0pOworCisgICAgY29uc3QgUGF0aFRleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGVzLnBhdGhDYWNoZS5nZXQocGF0aCwgcGFpbnQpOworICAgIGlmICghdGV4dHVyZSkgcmV0dXJuOworICAgIGNvbnN0IEF1dG9UZXh0dXJlIGF1dG9DbGVhbnVwKHRleHR1cmUpOworCisgICAgY29uc3QgZmxvYXQgeCA9IHRleHR1cmUtPmxlZnQgLSB0ZXh0dXJlLT5vZmZzZXQ7CisgICAgY29uc3QgZmxvYXQgeSA9IHRleHR1cmUtPnRvcCAtIHRleHR1cmUtPm9mZnNldDsKKworICAgIGlmIChxdWlja1JlamVjdCh4LCB5LCB4ICsgdGV4dHVyZS0+d2lkdGgsIHkgKyB0ZXh0dXJlLT5oZWlnaHQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgYWxwaGE7CisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOworICAgIGdldEFscGhhQW5kTW9kZShwYWludCwgJmFscGhhLCAmbW9kZSk7CisKKyAgICB1aW50MzJfdCBjb2xvciA9IHBhaW50LT5nZXRDb2xvcigpOworICAgIGNvbnN0IEdMZmxvYXQgYSA9IGFscGhhIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgciA9IGEgKiAoKGNvbG9yID4+IDE2KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgZyA9IGEgKiAoKGNvbG9yID4+ICA4KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgYiA9IGEgKiAoKGNvbG9yICAgICAgKSAmIDB4RkYpIC8gMjU1LjBmOworCisgICAgc2V0dXBUZXh0dXJlQWxwaGE4KHRleHR1cmUsIHRleHR1cmVVbml0LCB4LCB5LCByLCBnLCBiLCBhLCBtb2RlLCB0cnVlLCB0cnVlKTsKKworICAgIC8vIERyYXcgdGhlIG1lc2gKKyAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfU1RSSVAsIDAsIGdNZXNoQ291bnQpOworICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmdldEF0dHJpYigidGV4Q29vcmRzIikpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaGFkZXJzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJlc2V0U2hhZGVyKCkgeworICAgIG1TaGFkZXIgPSBOVUxMOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXR1cFNoYWRlcihTa2lhU2hhZGVyKiBzaGFkZXIpIHsKKyAgICBtU2hhZGVyID0gc2hhZGVyOworICAgIGlmIChtU2hhZGVyKSB7CisgICAgICAgIG1TaGFkZXItPnNldCgmbUNhY2hlcy50ZXh0dXJlQ2FjaGUsICZtQ2FjaGVzLmdyYWRpZW50Q2FjaGUpOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29sb3IgZmlsdGVycworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpyZXNldENvbG9yRmlsdGVyKCkgeworICAgIG1Db2xvckZpbHRlciA9IE5VTEw7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldHVwQ29sb3JGaWx0ZXIoU2tpYUNvbG9yRmlsdGVyKiBmaWx0ZXIpIHsKKyAgICBtQ29sb3JGaWx0ZXIgPSBmaWx0ZXI7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERyb3Agc2hhZG93CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJlc2V0U2hhZG93KCkgeworICAgIG1IYXNTaGFkb3cgPSBmYWxzZTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0dXBTaGFkb3coZmxvYXQgcmFkaXVzLCBmbG9hdCBkeCwgZmxvYXQgZHksIGludCBjb2xvcikgeworICAgIG1IYXNTaGFkb3cgPSB0cnVlOworICAgIG1TaGFkb3dSYWRpdXMgPSByYWRpdXM7CisgICAgbVNoYWRvd0R4ID0gZHg7CisgICAgbVNoYWRvd0R5ID0gZHk7CisgICAgbVNoYWRvd0NvbG9yID0gY29sb3I7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERyYXdpbmcgaW1wbGVtZW50YXRpb24KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0dXBTaGFkb3coY29uc3QgU2hhZG93VGV4dHVyZSogdGV4dHVyZSwgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBmbG9hdCBhbHBoYSkgeworICAgIGNvbnN0IGZsb2F0IHN4ID0geCAtIHRleHR1cmUtPmxlZnQgKyBtU2hhZG93RHg7CisgICAgY29uc3QgZmxvYXQgc3kgPSB5IC0gdGV4dHVyZS0+dG9wICsgbVNoYWRvd0R5OworCisgICAgY29uc3QgaW50IHNoYWRvd0FscGhhID0gKChtU2hhZG93Q29sb3IgPj4gMjQpICYgMHhGRik7CisgICAgY29uc3QgR0xmbG9hdCBhID0gc2hhZG93QWxwaGEgPCAyNTUgPyBzaGFkb3dBbHBoYSAvIDI1NS4wZiA6IGFscGhhOworICAgIGNvbnN0IEdMZmxvYXQgciA9IGEgKiAoKG1TaGFkb3dDb2xvciA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGcgPSBhICogKChtU2hhZG93Q29sb3IgPj4gIDgpICYgMHhGRikgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCBiID0gYSAqICgobVNoYWRvd0NvbG9yICAgICAgKSAmIDB4RkYpIC8gMjU1LjBmOworCisgICAgR0x1aW50IHRleHR1cmVVbml0ID0gMDsKKyAgICBzZXR1cFRleHR1cmVBbHBoYTgodGV4dHVyZSwgdGV4dHVyZVVuaXQsIHN4LCBzeSwgciwgZywgYiwgYSwgbW9kZSwgdHJ1ZSwgZmFsc2UpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXR1cFRleHR1cmVBbHBoYTgoY29uc3QgVGV4dHVyZSogdGV4dHVyZSwgR0x1aW50JiB0ZXh0dXJlVW5pdCwKKyAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLAorICAgICAgICBib29sIHRyYW5zZm9ybXMsIGJvb2wgYXBwbHlGaWx0ZXJzKSB7CisgICAgc2V0dXBUZXh0dXJlQWxwaGE4KHRleHR1cmUtPmlkLCB0ZXh0dXJlLT53aWR0aCwgdGV4dHVyZS0+aGVpZ2h0LCB0ZXh0dXJlVW5pdCwKKyAgICAgICAgICAgIHgsIHksIHIsIGcsIGIsIGEsIG1vZGUsIHRyYW5zZm9ybXMsIGFwcGx5RmlsdGVycyk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldHVwVGV4dHVyZUFscGhhOChHTHVpbnQgdGV4dHVyZSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgR0x1aW50JiB0ZXh0dXJlVW5pdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSwKKyAgICAgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIHRyYW5zZm9ybXMsIGJvb2wgYXBwbHlGaWx0ZXJzKSB7CisgICAgIC8vIERlc2NyaWJlIHRoZSByZXF1aXJlZCBzaGFkZXJzCisgICAgIFByb2dyYW1EZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjsKKyAgICAgZGVzY3JpcHRpb24uaGFzVGV4dHVyZSA9IHRydWU7CisgICAgIGRlc2NyaXB0aW9uLmhhc0FscGhhOFRleHR1cmUgPSB0cnVlOworCisgICAgIGlmIChhcHBseUZpbHRlcnMpIHsKKyAgICAgICAgIGlmIChtU2hhZGVyKSB7CisgICAgICAgICAgICAgbVNoYWRlci0+ZGVzY3JpYmUoZGVzY3JpcHRpb24sIG1FeHRlbnNpb25zKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmIChtQ29sb3JGaWx0ZXIpIHsKKyAgICAgICAgICAgICBtQ29sb3JGaWx0ZXItPmRlc2NyaWJlKGRlc2NyaXB0aW9uLCBtRXh0ZW5zaW9ucyk7CisgICAgICAgICB9CisgICAgIH0KKworICAgICAvLyBCdWlsZCBhbmQgdXNlIHRoZSBhcHByb3ByaWF0ZSBzaGFkZXIKKyAgICAgdXNlUHJvZ3JhbShtQ2FjaGVzLnByb2dyYW1DYWNoZS5nZXQoZGVzY3JpcHRpb24pKTsKKworICAgICAvLyBTZXR1cCB0aGUgYmxlbmRpbmcgbW9kZQorICAgICBjaG9vc2VCbGVuZGluZyh0cnVlLCBtb2RlKTsKKyAgICAgYmluZFRleHR1cmUodGV4dHVyZSwgR0xfQ0xBTVBfVE9fRURHRSwgR0xfQ0xBTVBfVE9fRURHRSwgdGV4dHVyZVVuaXQpOworICAgICBnbFVuaWZvcm0xaShtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5nZXRVbmlmb3JtKCJzYW1wbGVyIiksIHRleHR1cmVVbml0KTsKKworICAgICBpbnQgdGV4Q29vcmRzU2xvdCA9IG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmdldEF0dHJpYigidGV4Q29vcmRzIik7CisgICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkodGV4Q29vcmRzU2xvdCk7CisKKyAgICAgLy8gU2V0dXAgYXR0cmlidXRlcworICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+cG9zaXRpb24sIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgICAgICAgICBnTWVzaFN0cmlkZSwgJm1NZXNoVmVydGljZXNbMF0ucG9zaXRpb25bMF0pOworICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIodGV4Q29vcmRzU2xvdCwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgIGdNZXNoU3RyaWRlLCAmbU1lc2hWZXJ0aWNlc1swXS50ZXh0dXJlWzBdKTsKKworICAgICAvLyBTZXR1cCB1bmlmb3JtcworICAgICBpZiAodHJhbnNmb3JtcykgeworICAgICAgICAgbU1vZGVsVmlldy5sb2FkVHJhbnNsYXRlKHgsIHksIDAuMGYpOworICAgICAgICAgbU1vZGVsVmlldy5zY2FsZSh3aWR0aCwgaGVpZ2h0LCAxLjBmKTsKKyAgICAgfSBlbHNlIHsKKyAgICAgICAgIG1Nb2RlbFZpZXcubG9hZElkZW50aXR5KCk7CisgICAgIH0KKyAgICAgbUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+c2V0KG1PcnRob01hdHJpeCwgbU1vZGVsVmlldywgbVNuYXBzaG90LT50cmFuc2Zvcm0pOworICAgICBnbFVuaWZvcm00ZihtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5jb2xvciwgciwgZywgYiwgYSk7CisKKyAgICAgdGV4dHVyZVVuaXQrKzsKKyAgICAgaWYgKGFwcGx5RmlsdGVycykgeworICAgICAgICAgLy8gU2V0dXAgYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMgcmVxdWlyZWQgYnkgdGhlIHNoYWRlcnMKKyAgICAgICAgIGlmIChtU2hhZGVyKSB7CisgICAgICAgICAgICAgbVNoYWRlci0+c2V0dXBQcm9ncmFtKG1DYWNoZXMuY3VycmVudFByb2dyYW0sIG1Nb2RlbFZpZXcsICptU25hcHNob3QsICZ0ZXh0dXJlVW5pdCk7CisgICAgICAgICB9CisgICAgICAgICBpZiAobUNvbG9yRmlsdGVyKSB7CisgICAgICAgICAgICAgbUNvbG9yRmlsdGVyLT5zZXR1cFByb2dyYW0obUNhY2hlcy5jdXJyZW50UHJvZ3JhbSk7CisgICAgICAgICB9CisgICAgIH0KK30KKworI2RlZmluZSBrU3RkU3RyaWtlVGhydV9PZmZzZXQgICAoLTYuMGYgLyAyMS4wZikKKyNkZWZpbmUga1N0ZFVuZGVybGluZV9PZmZzZXQgICAgKDEuMGYgLyA5LjBmKQorI2RlZmluZSBrU3RkVW5kZXJsaW5lX1RoaWNrbmVzcyAoMS4wZiAvIDE4LjBmKQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3VGV4dERlY29yYXRpb25zKGNvbnN0IGNoYXIqIHRleHQsIGludCBieXRlc0NvdW50LCBmbG9hdCBsZW5ndGgsCisgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIFNrUGFpbnQqIHBhaW50KSB7CisgICAgLy8gSGFuZGxlIHVuZGVybGluZSBhbmQgc3RyaWtlLXRocm91Z2gKKyAgICB1aW50MzJfdCBmbGFncyA9IHBhaW50LT5nZXRGbGFncygpOworICAgIGlmIChmbGFncyAmIChTa1BhaW50OjprVW5kZXJsaW5lVGV4dF9GbGFnIHwgU2tQYWludDo6a1N0cmlrZVRocnVUZXh0X0ZsYWcpKSB7CisgICAgICAgIGZsb2F0IHVuZGVybGluZVdpZHRoID0gbGVuZ3RoOworICAgICAgICAvLyBJZiBsZW5ndGggaXMgPiAwLjBmLCB3ZSBhbHJlYWR5IG1lYXN1cmVkIHRoZSB0ZXh0IGZvciB0aGUgdGV4dCBhbGlnbm1lbnQKKyAgICAgICAgaWYgKGxlbmd0aCA8PSAwLjBmKSB7CisgICAgICAgICAgICB1bmRlcmxpbmVXaWR0aCA9IHBhaW50LT5tZWFzdXJlVGV4dCh0ZXh0LCBieXRlc0NvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IG9mZnNldFggPSAwOworICAgICAgICBzd2l0Y2ggKHBhaW50LT5nZXRUZXh0QWxpZ24oKSkgeworICAgICAgICAgICAgY2FzZSBTa1BhaW50OjprQ2VudGVyX0FsaWduOgorICAgICAgICAgICAgICAgIG9mZnNldFggPSB1bmRlcmxpbmVXaWR0aCAqIDAuNWY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNrUGFpbnQ6OmtSaWdodF9BbGlnbjoKKyAgICAgICAgICAgICAgICBvZmZzZXRYID0gdW5kZXJsaW5lV2lkdGg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHVuZGVybGluZVdpZHRoID4gMC4wZikgeworICAgICAgICAgICAgZmxvYXQgdGV4dFNpemUgPSBwYWludC0+Z2V0VGV4dFNpemUoKTsKKyAgICAgICAgICAgIGZsb2F0IGhlaWdodCA9IHRleHRTaXplICoga1N0ZFVuZGVybGluZV9UaGlja25lc3M7CisKKyAgICAgICAgICAgIGZsb2F0IGxlZnQgPSB4IC0gb2Zmc2V0WDsKKyAgICAgICAgICAgIGZsb2F0IHRvcCA9IDAuMGY7CisgICAgICAgICAgICBmbG9hdCByaWdodCA9IGxlZnQgKyB1bmRlcmxpbmVXaWR0aDsKKyAgICAgICAgICAgIGZsb2F0IGJvdHRvbSA9IDAuMGY7CisKKyAgICAgICAgICAgIGlmIChmbGFncyAmIFNrUGFpbnQ6OmtVbmRlcmxpbmVUZXh0X0ZsYWcpIHsKKyAgICAgICAgICAgICAgICB0b3AgPSB5ICsgdGV4dFNpemUgKiBrU3RkVW5kZXJsaW5lX09mZnNldDsKKyAgICAgICAgICAgICAgICBib3R0b20gPSB0b3AgKyBoZWlnaHQ7CisgICAgICAgICAgICAgICAgZHJhd1JlY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwYWludCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmbGFncyAmIFNrUGFpbnQ6OmtTdHJpa2VUaHJ1VGV4dF9GbGFnKSB7CisgICAgICAgICAgICAgICAgdG9wID0geSArIHRleHRTaXplICoga1N0ZFN0cmlrZVRocnVfT2Zmc2V0OworICAgICAgICAgICAgICAgIGJvdHRvbSA9IHRvcCArIGhlaWdodDsKKyAgICAgICAgICAgICAgICBkcmF3UmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd0NvbG9yUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIGludCBjb2xvciwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGlnbm9yZVRyYW5zZm9ybSkgeworICAgIC8vIElmIGEgc2hhZGVyIGlzIHNldCwgcHJlc2VydmUgb25seSB0aGUgYWxwaGEKKyAgICBpZiAobVNoYWRlcikgeworICAgICAgICBjb2xvciB8PSAweDAwZmZmZmZmOworICAgIH0KKworICAgIC8vIFJlbmRlciB1c2luZyBwcmUtbXVsdGlwbGllZCBhbHBoYQorICAgIGNvbnN0IGludCBhbHBoYSA9IChjb2xvciA+PiAyNCkgJiAweEZGOworICAgIGNvbnN0IEdMZmxvYXQgYSA9IGFscGhhIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgciA9IGEgKiAoKGNvbG9yID4+IDE2KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgZyA9IGEgKiAoKGNvbG9yID4+ICA4KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgYiA9IGEgKiAoKGNvbG9yICAgICAgKSAmIDB4RkYpIC8gMjU1LjBmOworCisgICAgR0x1aW50IHRleHR1cmVVbml0ID0gMDsKKworICAgIC8vIFNldHVwIHRoZSBibGVuZGluZyBtb2RlCisgICAgY2hvb3NlQmxlbmRpbmcoYWxwaGEgPCAyNTUgfHwgKG1TaGFkZXIgJiYgbVNoYWRlci0+YmxlbmQoKSksIG1vZGUpOworCisgICAgLy8gRGVzY3JpYmUgdGhlIHJlcXVpcmVkIHNoYWRlcnMKKyAgICBQcm9ncmFtRGVzY3JpcHRpb24gZGVzY3JpcHRpb247CisgICAgaWYgKG1TaGFkZXIpIHsKKyAgICAgICAgbVNoYWRlci0+ZGVzY3JpYmUoZGVzY3JpcHRpb24sIG1FeHRlbnNpb25zKTsKKyAgICB9CisgICAgaWYgKG1Db2xvckZpbHRlcikgeworICAgICAgICBtQ29sb3JGaWx0ZXItPmRlc2NyaWJlKGRlc2NyaXB0aW9uLCBtRXh0ZW5zaW9ucyk7CisgICAgfQorCisgICAgLy8gQnVpbGQgYW5kIHVzZSB0aGUgYXBwcm9wcmlhdGUgc2hhZGVyCisgICAgdXNlUHJvZ3JhbShtQ2FjaGVzLnByb2dyYW1DYWNoZS5nZXQoZGVzY3JpcHRpb24pKTsKKworICAgIC8vIFNldHVwIGF0dHJpYnV0ZXMKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+cG9zaXRpb24sIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgICAgICAgIGdNZXNoU3RyaWRlLCAmbU1lc2hWZXJ0aWNlc1swXS5wb3NpdGlvblswXSk7CisKKyAgICAvLyBTZXR1cCB1bmlmb3JtcworICAgIG1Nb2RlbFZpZXcubG9hZFRyYW5zbGF0ZShsZWZ0LCB0b3AsIDAuMGYpOworICAgIG1Nb2RlbFZpZXcuc2NhbGUocmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3AsIDEuMGYpOworICAgIGlmICghaWdub3JlVHJhbnNmb3JtKSB7CisgICAgICAgIG1DYWNoZXMuY3VycmVudFByb2dyYW0tPnNldChtT3J0aG9NYXRyaXgsIG1Nb2RlbFZpZXcsIG1TbmFwc2hvdC0+dHJhbnNmb3JtKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtYXQ0IGlkZW50aXR5OworICAgICAgICBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5zZXQobU9ydGhvTWF0cml4LCBtTW9kZWxWaWV3LCBpZGVudGl0eSk7CisgICAgfQorICAgIGdsVW5pZm9ybTRmKG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmNvbG9yLCByLCBnLCBiLCBhKTsKKworICAgIC8vIFNldHVwIGF0dHJpYnV0ZXMgYW5kIHVuaWZvcm1zIHJlcXVpcmVkIGJ5IHRoZSBzaGFkZXJzCisgICAgaWYgKG1TaGFkZXIpIHsKKyAgICAgICAgbVNoYWRlci0+c2V0dXBQcm9ncmFtKG1DYWNoZXMuY3VycmVudFByb2dyYW0sIG1Nb2RlbFZpZXcsICptU25hcHNob3QsICZ0ZXh0dXJlVW5pdCk7CisgICAgfQorICAgIGlmIChtQ29sb3JGaWx0ZXIpIHsKKyAgICAgICAgbUNvbG9yRmlsdGVyLT5zZXR1cFByb2dyYW0obUNhY2hlcy5jdXJyZW50UHJvZ3JhbSk7CisgICAgfQorCisgICAgLy8gRHJhdyB0aGUgbWVzaAorICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgZ01lc2hDb3VudCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdUZXh0dXJlUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUsIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgaW50IGFscGhhOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKyAgICBnZXRBbHBoYUFuZE1vZGUocGFpbnQsICZhbHBoYSwgJm1vZGUpOworCisgICAgZHJhd1RleHR1cmVNZXNoKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgdGV4dHVyZS0+aWQsIGFscGhhIC8gMjU1LjBmLCBtb2RlLCB0ZXh0dXJlLT5ibGVuZCwKKyAgICAgICAgICAgICZtTWVzaFZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdLCAmbU1lc2hWZXJ0aWNlc1swXS50ZXh0dXJlWzBdLCBOVUxMKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1RleHR1cmVSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgR0x1aW50IHRleHR1cmUsIGZsb2F0IGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgYmxlbmQpIHsKKyAgICBkcmF3VGV4dHVyZU1lc2gobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCB0ZXh0dXJlLCBhbHBoYSwgbW9kZSwgYmxlbmQsCisgICAgICAgICAgICAmbU1lc2hWZXJ0aWNlc1swXS5wb3NpdGlvblswXSwgJm1NZXNoVmVydGljZXNbMF0udGV4dHVyZVswXSwgTlVMTCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdUZXh0dXJlTWVzaChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIEdMdWludCB0ZXh0dXJlLCBmbG9hdCBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGJsZW5kLAorICAgICAgICBHTHZvaWQqIHZlcnRpY2VzLCBHTHZvaWQqIHRleENvb3JkcywgR0x2b2lkKiBpbmRpY2VzLCBHTHNpemVpIGVsZW1lbnRzQ291bnQpIHsKKyAgICBQcm9ncmFtRGVzY3JpcHRpb24gZGVzY3JpcHRpb247CisgICAgZGVzY3JpcHRpb24uaGFzVGV4dHVyZSA9IHRydWU7CisgICAgaWYgKG1Db2xvckZpbHRlcikgeworICAgICAgICBtQ29sb3JGaWx0ZXItPmRlc2NyaWJlKGRlc2NyaXB0aW9uLCBtRXh0ZW5zaW9ucyk7CisgICAgfQorCisgICAgbU1vZGVsVmlldy5sb2FkVHJhbnNsYXRlKGxlZnQsIHRvcCwgMC4wZik7CisgICAgbU1vZGVsVmlldy5zY2FsZShyaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCwgMS4wZik7CisKKyAgICB1c2VQcm9ncmFtKG1DYWNoZXMucHJvZ3JhbUNhY2hlLmdldChkZXNjcmlwdGlvbikpOworICAgIG1DYWNoZXMuY3VycmVudFByb2dyYW0tPnNldChtT3J0aG9NYXRyaXgsIG1Nb2RlbFZpZXcsIG1TbmFwc2hvdC0+dHJhbnNmb3JtKTsKKworICAgIGNob29zZUJsZW5kaW5nKGJsZW5kIHx8IGFscGhhIDwgMS4wZiwgbW9kZSk7CisKKyAgICAvLyBUZXh0dXJlCisgICAgYmluZFRleHR1cmUodGV4dHVyZSwgR0xfQ0xBTVBfVE9fRURHRSwgR0xfQ0xBTVBfVE9fRURHRSwgMCk7CisgICAgZ2xVbmlmb3JtMWkobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Z2V0VW5pZm9ybSgic2FtcGxlciIpLCAwKTsKKworICAgIC8vIEFsd2F5cyBwcmVtdWx0aXBsaWVkCisgICAgZ2xVbmlmb3JtNGYobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Y29sb3IsIGFscGhhLCBhbHBoYSwgYWxwaGEsIGFscGhhKTsKKworICAgIC8vIE1lc2gKKyAgICBpbnQgdGV4Q29vcmRzU2xvdCA9IG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmdldEF0dHJpYigidGV4Q29vcmRzIik7CisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0ZXhDb29yZHNTbG90KTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+cG9zaXRpb24sIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgICAgICAgIGdNZXNoU3RyaWRlLCB2ZXJ0aWNlcyk7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHRleENvb3Jkc1Nsb3QsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgZ01lc2hTdHJpZGUsIHRleENvb3Jkcyk7CisKKyAgICAvLyBDb2xvciBmaWx0ZXIKKyAgICBpZiAobUNvbG9yRmlsdGVyKSB7CisgICAgICAgIG1Db2xvckZpbHRlci0+c2V0dXBQcm9ncmFtKG1DYWNoZXMuY3VycmVudFByb2dyYW0pOworICAgIH0KKworICAgIGlmICghaW5kaWNlcykgeworICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfU1RSSVAsIDAsIGdNZXNoQ291bnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRHJhd0VsZW1lbnRzKEdMX1RSSUFOR0xFUywgZWxlbWVudHNDb3VudCwgR0xfVU5TSUdORURfU0hPUlQsIGluZGljZXMpOworICAgIH0KKyAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSh0ZXhDb29yZHNTbG90KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6Y2hvb3NlQmxlbmRpbmcoYm9vbCBibGVuZCwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGlzUHJlbXVsdGlwbGllZCkgeworICAgIGJsZW5kID0gYmxlbmQgfHwgbW9kZSAhPSBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlOworICAgIGlmIChibGVuZCkgeworICAgICAgICBpZiAoIW1DYWNoZXMuYmxlbmQpIHsKKyAgICAgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgfQorCisgICAgICAgIEdMZW51bSBzb3VyY2VNb2RlID0gZ0JsZW5kc1ttb2RlXS5zcmM7CisgICAgICAgIEdMZW51bSBkZXN0TW9kZSA9IGdCbGVuZHNbbW9kZV0uZHN0OworICAgICAgICBpZiAoIWlzUHJlbXVsdGlwbGllZCAmJiBzb3VyY2VNb2RlID09IEdMX09ORSkgeworICAgICAgICAgICAgc291cmNlTW9kZSA9IEdMX1NSQ19BTFBIQTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzb3VyY2VNb2RlICE9IG1DYWNoZXMubGFzdFNyY01vZGUgfHwgZGVzdE1vZGUgIT0gbUNhY2hlcy5sYXN0RHN0TW9kZSkgeworICAgICAgICAgICAgZ2xCbGVuZEZ1bmMoc291cmNlTW9kZSwgZGVzdE1vZGUpOworICAgICAgICAgICAgbUNhY2hlcy5sYXN0U3JjTW9kZSA9IHNvdXJjZU1vZGU7CisgICAgICAgICAgICBtQ2FjaGVzLmxhc3REc3RNb2RlID0gZGVzdE1vZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1DYWNoZXMuYmxlbmQpIHsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKKyAgICB9CisgICAgbUNhY2hlcy5ibGVuZCA9IGJsZW5kOworfQorCitib29sIE9wZW5HTFJlbmRlcmVyOjp1c2VQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pIHsKKyAgICBpZiAoIXByb2dyYW0tPmlzSW5Vc2UoKSkgeworICAgICAgICBpZiAobUNhY2hlcy5jdXJyZW50UHJvZ3JhbSAhPSBOVUxMKSBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5yZW1vdmUoKTsKKyAgICAgICAgcHJvZ3JhbS0+dXNlKCk7CisgICAgICAgIG1DYWNoZXMuY3VycmVudFByb2dyYW0gPSBwcm9ncmFtOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpyZXNldERyYXdUZXh0dXJlVGV4Q29vcmRzKGZsb2F0IHUxLCBmbG9hdCB2MSwgZmxvYXQgdTIsIGZsb2F0IHYyKSB7CisgICAgVGV4dHVyZVZlcnRleCogdiA9ICZtTWVzaFZlcnRpY2VzWzBdOworICAgIFRleHR1cmVWZXJ0ZXg6OnNldFVWKHYrKywgdTEsIHYxKTsKKyAgICBUZXh0dXJlVmVydGV4OjpzZXRVVih2KyssIHUyLCB2MSk7CisgICAgVGV4dHVyZVZlcnRleDo6c2V0VVYodisrLCB1MSwgdjIpOworICAgIFRleHR1cmVWZXJ0ZXg6OnNldFVWKHYrKywgdTIsIHYyKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6Z2V0QWxwaGFBbmRNb2RlKGNvbnN0IFNrUGFpbnQqIHBhaW50LCBpbnQqIGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlKiBtb2RlKSB7CisgICAgaWYgKHBhaW50KSB7CisgICAgICAgIGNvbnN0IGJvb2wgaXNNb2RlID0gU2tYZmVybW9kZTo6SXNNb2RlKHBhaW50LT5nZXRYZmVybW9kZSgpLCBtb2RlKTsKKyAgICAgICAgaWYgKCFpc01vZGUpIHsKKyAgICAgICAgICAgIC8vIEFzc3VtZSBTUkNfT1ZFUgorICAgICAgICAgICAgKm1vZGUgPSBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2tpYSBkcmF3cyB1c2luZyB0aGUgY29sb3IncyBhbHBoYSBjaGFubmVsIGlmIDwgMjU1CisgICAgICAgIC8vIE90aGVyd2lzZSwgaXQgdXNlcyB0aGUgcGFpbnQncyBhbHBoYQorICAgICAgICBpbnQgY29sb3IgPSBwYWludC0+Z2V0Q29sb3IoKTsKKyAgICAgICAgKmFscGhhID0gKGNvbG9yID4+IDI0KSAmIDB4RkY7CisgICAgICAgIGlmICgqYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICAgICAqYWxwaGEgPSBwYWludC0+Z2V0QWxwaGEoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICptb2RlID0gU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZTsKKyAgICAgICAgKmFscGhhID0gMjU1OworICAgIH0KK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6YmluZFRleHR1cmUoR0x1aW50IHRleHR1cmUsIEdMZW51bSB3cmFwUywgR0xlbnVtIHdyYXBULCBHTHVpbnQgdGV4dHVyZVVuaXQpIHsKKyAgICBnbEFjdGl2ZVRleHR1cmUoZ1RleHR1cmVVbml0c1t0ZXh0dXJlVW5pdF0pOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCB3cmFwUyk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCB3cmFwVCk7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmggYi9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGUwNGIyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmgKQEAgLTAsMCArMSwzNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfT1BFTkdMX1JFTkRFUkVSX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9PUEVOR0xfUkVOREVSRVJfSAorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKKyNpbmNsdWRlIDxTa0JpdG1hcC5oPgorI2luY2x1ZGUgPFNrTWF0cml4Lmg+CisjaW5jbHVkZSA8U2tQYWludC5oPgorI2luY2x1ZGUgPFNrUmVnaW9uLmg+CisjaW5jbHVkZSA8U2tTaGFkZXIuaD4KKyNpbmNsdWRlIDxTa1hmZXJtb2RlLmg+CisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVzb3VyY2VUeXBlcy5oPgorCisjaW5jbHVkZSAiRXh0ZW5zaW9ucy5oIgorI2luY2x1ZGUgIk1hdHJpeC5oIgorI2luY2x1ZGUgIlByb2dyYW0uaCIKKyNpbmNsdWRlICJSZWN0LmgiCisjaW5jbHVkZSAiU25hcHNob3QuaCIKKyNpbmNsdWRlICJWZXJ0ZXguaCIKKyNpbmNsdWRlICJTa2lhU2hhZGVyLmgiCisjaW5jbHVkZSAiU2tpYUNvbG9yRmlsdGVyLmgiCisjaW5jbHVkZSAiQ2FjaGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUmVuZGVyZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBPcGVuR0wgcmVuZGVyZXIgdXNlZCB0byBkcmF3IGFjY2VsZXJhdGVkIDJEIGdyYXBoaWNzLiBUaGUgQVBJIGlzIGEKKyAqIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiBTa2lhJ3MgQ2FudmFzIEFQSS4KKyAqLworY2xhc3MgT3BlbkdMUmVuZGVyZXIgeworcHVibGljOgorICAgIE9wZW5HTFJlbmRlcmVyKCk7CisgICAgfk9wZW5HTFJlbmRlcmVyKCk7CisKKyAgICB2b2lkIHNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgICAgdm9pZCBwcmVwYXJlKCk7CisgICAgdm9pZCBhY3F1aXJlQ29udGV4dCgpOworICAgIHZvaWQgcmVsZWFzZUNvbnRleHQoKTsKKworICAgIGludCBnZXRTYXZlQ291bnQoKSBjb25zdDsKKyAgICBpbnQgc2F2ZShpbnQgZmxhZ3MpOworICAgIHZvaWQgcmVzdG9yZSgpOworICAgIHZvaWQgcmVzdG9yZVRvQ291bnQoaW50IHNhdmVDb3VudCk7CisKKyAgICBpbnQgc2F2ZUxheWVyKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgY29uc3QgU2tQYWludCogcCwgaW50IGZsYWdzKTsKKyAgICBpbnQgc2F2ZUxheWVyQWxwaGEoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBpbnQgYWxwaGEsIGludCBmbGFncyk7CisKKyAgICB2b2lkIHRyYW5zbGF0ZShmbG9hdCBkeCwgZmxvYXQgZHkpOworICAgIHZvaWQgcm90YXRlKGZsb2F0IGRlZ3JlZXMpOworICAgIHZvaWQgc2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5KTsKKworICAgIHZvaWQgc2V0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpOworICAgIHZvaWQgZ2V0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpOworICAgIHZvaWQgY29uY2F0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpOworCisgICAgY29uc3QgUmVjdCYgZ2V0Q2xpcEJvdW5kcygpOworICAgIGJvb2wgcXVpY2tSZWplY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKTsKKyAgICBib29sIGNsaXBSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgU2tSZWdpb246Ok9wIG9wKTsKKworICAgIHZvaWQgZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdCaXRtYXAoU2tCaXRtYXAqIGJpdG1hcCwgY29uc3QgU2tNYXRyaXgqIG1hdHJpeCwgY29uc3QgU2tQYWludCogcGFpbnQpOworICAgIHZvaWQgZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBzcmNMZWZ0LCBmbG9hdCBzcmNUb3AsIGZsb2F0IHNyY1JpZ2h0LCBmbG9hdCBzcmNCb3R0b20sCisgICAgICAgICAgICBmbG9hdCBkc3RMZWZ0LCBmbG9hdCBkc3RUb3AsIGZsb2F0IGRzdFJpZ2h0LCBmbG9hdCBkc3RCb3R0b20sIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdQYXRjaChTa0JpdG1hcCogYml0bWFwLCBSZXNfcG5nXzlwYXRjaCogcGF0Y2gsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwKKyAgICAgICAgICAgIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdDb2xvcihpbnQgY29sb3IsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSk7CisgICAgdm9pZCBkcmF3UmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdQYXRoKFNrUGF0aCogcGF0aCwgU2tQYWludCogcGFpbnQpOworCisgICAgdm9pZCByZXNldFNoYWRlcigpOworICAgIHZvaWQgc2V0dXBTaGFkZXIoU2tpYVNoYWRlciogc2hhZGVyKTsKKworICAgIHZvaWQgcmVzZXRDb2xvckZpbHRlcigpOworICAgIHZvaWQgc2V0dXBDb2xvckZpbHRlcihTa2lhQ29sb3JGaWx0ZXIqIGZpbHRlcik7CisKKyAgICB2b2lkIHJlc2V0U2hhZG93KCk7CisgICAgdm9pZCBzZXR1cFNoYWRvdyhmbG9hdCByYWRpdXMsIGZsb2F0IGR4LCBmbG9hdCBkeSwgaW50IGNvbG9yKTsKKworICAgIHZvaWQgZHJhd1RleHQoY29uc3QgY2hhciogdGV4dCwgaW50IGJ5dGVzQ291bnQsIGludCBjb3VudCwgZmxvYXQgeCwgZmxvYXQgeSwgU2tQYWludCogcGFpbnQpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIFNhdmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSByZW5kZXJlciBhcyBhIG5ldyBzbmFwc2hvdC4KKyAgICAgKiBUaGUgbmV3IHNuYXBzaG90IGlzIHNhdmVkIGluIG1TbmFwc2hvdCBhbmQgdGhlIHByZXZpb3VzIHNuYXBzaG90CisgICAgICogaXMgbGlua2VkIGZyb20gbVNuYXBzaG90LT5wcmV2aW91cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG5ldyBzYXZlIGNvdW50LiBUaGlzIHZhbHVlIGNhbiBiZSBwYXNzZWQgdG8gI3Jlc3RvcmVUb0NvdW50KCkKKyAgICAgKi8KKyAgICBpbnQgc2F2ZVNuYXBzaG90KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0b3JlcyB0aGUgY3VycmVudCBzbmFwc2hvdDsgbVNuYXBzaG90IGJlY29tZXMgbVNuYXBzaG90LT5wcmV2aW91cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2xpcCB3YXMgbW9kaWZpZWQuCisgICAgICovCisgICAgYm9vbCByZXN0b3JlU25hcHNob3QoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNsaXBwaW5nIHJlY3RhbmdsZSB1c2luZyBnbFNjaXNzb3IuIFRoZSBjbGlwIGlzIGRlZmluZWQgYnkKKyAgICAgKiB0aGUgY3VycmVudCBzbmFwc2hvdCdzIGNsaXBSZWN0IG1lbWJlci4KKyAgICAgKi8KKyAgICB2b2lkIHNldFNjaXNzb3JGcm9tQ2xpcCgpOworCisgICAgLyoqCisgICAgICogQ29tcG9zZSB0aGUgbGF5ZXIgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBzbmFwc2hvdCB3aXRoIHRoZSBsYXllcgorICAgICAqIGRlZmluZWQgYnkgdGhlIHByZXZpb3VzIHNuYXBzaG90LgorICAgICAqCisgICAgICogVGhlIGN1cnJlbnQgc25hcHNob3QgKm11c3QqIGJlIGEgbGF5ZXIgKGZsYWcga0ZsYWdJc0xheWVyIHNldC4pCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3VyZW50IFRoZSBjdXJyZW50IHNuYXBzaG90IGNvbnRhaW5pbmcgdGhlIGxheWVyIHRvIGNvbXBvc2UKKyAgICAgKiBAcGFyYW0gcHJldmlvdXMgVGhlIHByZXZpb3VzIHNuYXBzaG90IHRvIGNvbXBvc2UgdGhlIGN1cnJlbnQgbGF5ZXIgd2l0aAorICAgICAqLworICAgIHZvaWQgY29tcG9zZUxheWVyKHNwPFNuYXBzaG90PiBjdXJyZW50LCBzcDxTbmFwc2hvdD4gcHJldmlvdXMpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBsYXllciBzdG9yZWQgaW4gdGhlIHNwZWNpZmllZCBzbmFwc2hvdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzbmFwc2hvdCBUaGUgc25hcHNob3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgbGF5ZXIKKyAgICAgKiBAcGFyYW0gbGVmdCBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBsYXllcgorICAgICAqIEBwYXJhbSB0b3AgVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBsYXllcgorICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgY29vcmRpbmF0ZSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gYm90dG9tIFRoZSBib3R0b20gY29vcmRpbmF0ZSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gYWxwaGEgVGhlIHRyYW5zbHVjZW5jeSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgYmxlbmRpbmcgbW9kZSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gZmxhZ3MgVGhlIGxheWVyIHNhdmUgZmxhZ3MKKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbGF5ZXIgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIGNyZWF0ZUxheWVyKHNwPFNuYXBzaG90PiBzbmFwc2hvdCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgaW50IGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGludCBmbGFncyk7CisKKyAgICAvKioKKyAgICAgKiBEcmF3cyBhIGNvbG9yZWQgcmVjdGFuZ2xlIHdpdGggdGhlIHNwZWNpZmllZCBjb2xvci4gVGhlIHNwZWNpZmllZCBjb29yZGluYXRlcworICAgICAqIGFyZSB0cmFuc2Zvcm1lZCBieSB0aGUgY3VycmVudCBzbmFwc2hvdCdzIHRyYW5zZm9ybSBtYXRyaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdG9wIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHJpZ2h0IFRoZSByaWdodCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gYm90dG9tIFRoZSBib3R0b20gY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGNvbG9yIFRoZSByZWN0YW5nbGUncyBBUkdCIGNvbG9yLCBkZWZpbmVkIGFzIGEgcGFja2VkIDMyIGJpdHMgd29yZAorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBTa2lhIHhmZXJtb2RlIHRvIHVzZQorICAgICAqIEBwYXJhbSBpZ25vcmVUcmFuc2Zvcm0gVHJ1ZSBpZiB0aGUgY3VycmVudCB0cmFuc2Zvcm0gc2hvdWxkIGJlIGlnbm9yZWQKKyAgICAgKi8KKyAgICB2b2lkIGRyYXdDb2xvclJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgIAkJaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgaWdub3JlVHJhbnNmb3JtID0gZmFsc2UpOworCisgICAgLyoqCisgICAgICogRHJhd3MgYSB0ZXh0dXJlZCByZWN0YW5nbGUgd2l0aCB0aGUgc3BlY2lmaWVkIHRleHR1cmUuIFRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMKKyAgICAgKiBhcmUgdHJhbnNmb3JtZWQgYnkgdGhlIGN1cnJlbnQgc25hcHNob3QncyB0cmFuc2Zvcm0gbWF0cml4LgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB0ZXh0dXJlIFRoZSB0ZXh0dXJlIG5hbWUgdG8gbWFwIG9udG8gdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBhbHBoYSBBbiBhZGRpdGlvbmFsIHRyYW5zbHVjZW5jeSBwYXJhbWV0ZXIsIGJldHdlZW4gMC4wZiBhbmQgMS4wZgorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBibGVuZGluZyBtb2RlCisgICAgICogQHBhcmFtIGJsZW5kIFRydWUgaWYgdGhlIHRleHR1cmUgY29udGFpbnMgYW4gYWxwaGEgY2hhbm5lbAorICAgICAqLworICAgIHZvaWQgZHJhd1RleHR1cmVSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgR0x1aW50IHRleHR1cmUsCisgICAgICAgICAgICBmbG9hdCBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGJsZW5kKTsKKworICAgIC8qKgorICAgICAqIERyYXdzIGEgdGV4dHVyZWQgcmVjdGFuZ2xlIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0dXJlLiBUaGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzCisgICAgICogYXJlIHRyYW5zZm9ybWVkIGJ5IHRoZSBjdXJyZW50IHNuYXBzaG90J3MgdHJhbnNmb3JtIG1hdHJpeC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB0b3AgVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBib3R0b20gVGhlIGJvdHRvbSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdGV4dHVyZSBUaGUgdGV4dHVyZSB0byB1c2UKKyAgICAgKiBAcGFyYW0gcGFpbnQgVGhlIHBhaW50IGNvbnRhaW5pbmcgdGhlIGFscGhhLCBibGVuZGluZyBtb2RlLCBldGMuCisgICAgICovCisgICAgdm9pZCBkcmF3VGV4dHVyZVJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSwgY29uc3QgU2tQYWludCogcGFpbnQpOworCisgICAgLyoqCisgICAgICogRHJhd3MgYSB0ZXh0dXJlZCBtZXNoIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0dXJlLiBJZiB0aGUgaW5kaWNlcyBhcmUgb21pdHRlZCwgdGhlCisgICAgICogbWVzaCBpcyBkcmF3biBhcyBhIHNpbXBsZSBxdWFkLgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB0ZXh0dXJlIFRoZSB0ZXh0dXJlIG5hbWUgdG8gbWFwIG9udG8gdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBhbHBoYSBBbiBhZGRpdGlvbmFsIHRyYW5zbHVjZW5jeSBwYXJhbWV0ZXIsIGJldHdlZW4gMC4wZiBhbmQgMS4wZgorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBibGVuZGluZyBtb2RlCisgICAgICogQHBhcmFtIGJsZW5kIFRydWUgaWYgdGhlIHRleHR1cmUgY29udGFpbnMgYW4gYWxwaGEgY2hhbm5lbAorICAgICAqIEBwYXJhbSB2ZXJ0aWNlcyBUaGUgdmVydGljZXMgdGhhdCBkZWZpbmUgdGhlIG1lc2gKKyAgICAgKiBAcGFyYW0gdGV4Q29vcmRzIFRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIG9mIGVhY2ggdmVydGV4CisgICAgICogQHBhcmFtIGluZGljZXMgVGhlIGluZGljZXMgb2YgdGhlIHZlcnRpY2VzLCBjYW4gYmUgTlVMTAorICAgICAqIEBwYXJhbSBlbGVtZW50c0NvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG1lc2gsIHJlcXVpcmVkIGJ5IGluZGljZXMKKyAgICAgKi8KKyAgICB2b2lkIGRyYXdUZXh0dXJlTWVzaChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIEdMdWludCB0ZXh0dXJlLAorICAgICAgICAgICAgZmxvYXQgYWxwaGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCBibGVuZCwKKyAgICAgICAgICAgIEdMdm9pZCogdmVydGljZXMsIEdMdm9pZCogdGV4Q29vcmRzLCBHTHZvaWQqIGluZGljZXMsIEdMc2l6ZWkgZWxlbWVudHNDb3VudCA9IDApOworCisgICAgLyoqCisgICAgICogUHJlcGFyZXMgdGhlIHJlbmRlcmVyIHRvIGRyYXcgdGhlIHNwZWNpZmllZCBzaGFkb3cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dHVyZSBUaGUgc2hhZG93IHRleHR1cmUKKyAgICAgKiBAcGFyYW0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzaGFkb3cKKyAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBzaGFkb3cKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgYmxlbmRpbmcgbW9kZQorICAgICAqIEBwYXJhbSBhbHBoYSBUaGUgYWxwaGEgdmFsdWUKKyAgICAgKi8KKyAgICB2b2lkIHNldHVwU2hhZG93KGNvbnN0IFNoYWRvd1RleHR1cmUqIHRleHR1cmUsIGZsb2F0IHgsIGZsb2F0IHksIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwKKyAgICAgICAgICAgIGZsb2F0IGFscGhhKTsKKworICAgIC8qKgorICAgICAqIFByZXBhcmVzIHRoZSByZW5kZXJlciB0byBkcmF3IHRoZSBzcGVjaWZpZWQgQWxwaGE4IHRleHR1cmUgYXMgYSByZWN0YW5nbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dHVyZSBUaGUgdGV4dHVyZSB0byByZW5kZXIgd2l0aAorICAgICAqIEBwYXJhbSB0ZXh0dXJlVW5pdCBUaGUgdGV4dHVyZSB1bml0IHRvIHVzZSwgbWF5IGJlIG1vZGlmaWVkCisgICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRyYXcKKyAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgdG8gZHJhdworICAgICAqIEBwYXJhbSByIFRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBjb2xvcgorICAgICAqIEBwYXJhbSBnIFRoZSBncmVlbiBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIGIgVGhlIGJsdWUgY29tcG9uZW50IG9mIHRoZSBjb2xvcgorICAgICAqIEBwYXJhbSBhIFRoZSBhbHBoYSBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIG1vZGUgVGhlIGJsZW5kaW5nIG1vZGUKKyAgICAgKiBAcGFyYW0gdHJhbnNmb3JtcyBUcnVlIGlmIHRoZSBtYXRyaXggcGFzc2VkIHRvIHRoZSBzaGFkZXIgc2hvdWxkIGJlIG11bHRpcGxpZWQKKyAgICAgKiAgICAgICAgYnkgdGhlIG1vZGVsLXZpZXcgbWF0cml4CisgICAgICogQHBhcmFtIGFwcGx5RmlsdGVycyBXaGV0aGVyIG9yIG5vdCB0byB0YWtlIGNvbG9yIGZpbHRlcnMgYW5kCisgICAgICogICAgICAgIHNoYWRlcnMgaW50byBhY2NvdW50CisgICAgICovCisgICAgdm9pZCBzZXR1cFRleHR1cmVBbHBoYTgoY29uc3QgVGV4dHVyZSogdGV4dHVyZSwgR0x1aW50JiB0ZXh0dXJlVW5pdCwgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCB0cmFuc2Zvcm1zLAorICAgICAgICAgICAgYm9vbCBhcHBseUZpbHRlcnMpOworCisgICAgLyoqCisgICAgICogUHJlcGFyZXMgdGhlIHJlbmRlcmVyIHRvIGRyYXcgdGhlIHNwZWNpZmllZCBBbHBoYTggdGV4dHVyZSBhcyBhIHJlY3RhbmdsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0dXJlIFRoZSB0ZXh0dXJlIHRvIHJlbmRlciB3aXRoCisgICAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgdGV4dHVyZQorICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgdGV4dHVyZQorICAgICAqIEBwYXJhbSB0ZXh0dXJlVW5pdCBUaGUgdGV4dHVyZSB1bml0IHRvIHVzZSwgbWF5IGJlIG1vZGlmaWVkCisgICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRyYXcKKyAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgdG8gZHJhdworICAgICAqIEBwYXJhbSByIFRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBjb2xvcgorICAgICAqIEBwYXJhbSBnIFRoZSBncmVlbiBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIGIgVGhlIGJsdWUgY29tcG9uZW50IG9mIHRoZSBjb2xvcgorICAgICAqIEBwYXJhbSBhIFRoZSBhbHBoYSBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIG1vZGUgVGhlIGJsZW5kaW5nIG1vZGUKKyAgICAgKiBAcGFyYW0gdHJhbnNmb3JtcyBUcnVlIGlmIHRoZSBtYXRyaXggcGFzc2VkIHRvIHRoZSBzaGFkZXIgc2hvdWxkIGJlIG11bHRpcGxpZWQKKyAgICAgKiAgICAgICAgYnkgdGhlIG1vZGVsLXZpZXcgbWF0cml4CisgICAgICogQHBhcmFtIGFwcGx5RmlsdGVycyBXaGV0aGVyIG9yIG5vdCB0byB0YWtlIGNvbG9yIGZpbHRlcnMgYW5kCisgICAgICogICAgICAgIHNoYWRlcnMgaW50byBhY2NvdW50CisgICAgICovCisgICAgdm9pZCBzZXR1cFRleHR1cmVBbHBoYTgoR0x1aW50IHRleHR1cmUsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICBHTHVpbnQmIHRleHR1cmVVbml0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhLAorICAgICAgICAgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIHRyYW5zZm9ybXMsIGJvb2wgYXBwbHlGaWx0ZXJzKTsKKworICAgIC8qKgorICAgICAqIERyYXdzIHRleHQgdW5kZXJsaW5lIGFuZCBzdHJpa2UtdGhyb3VnaCBpZiBuZWVkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBkZWNvcgorICAgICAqIEBwYXJhbSBieXRlc0NvdW50IFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggaW4gcGl4ZWxzIG9mIHRoZSB0ZXh0LCBjYW4gYmUgPD0gMC4wZiB0byBmb3JjZSBhIG1lYXN1cmVtZW50CisgICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dCB3aWxsIGJlIGRyYXduCisgICAgICogQHBhcmFtIHkgVGhlIHkgY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dCB3aWxsIGJlIGRyYXduCisgICAgICogQHBhcmFtIHBhaW50IFRoZSBwYWludCB0byBkcmF3IHRoZSB0ZXh0IHdpdGgKKyAgICAgKi8KKyAgICB2b2lkIGRyYXdUZXh0RGVjb3JhdGlvbnMoY29uc3QgY2hhciogdGV4dCwgaW50IGJ5dGVzQ291bnQsIGZsb2F0IGxlbmd0aCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIFNrUGFpbnQqIHBhaW50KTsKKworICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGUgdGV4dHVyZSBjb29yZGluYXRlcyBzdG9yZWQgaW4gbU1lc2hWZXJ0aWNlcy4gU2V0dGluZyB0aGUgdmFsdWVzCisgICAgICogYmFjayB0byBkZWZhdWx0IGlzIGFjaGlldmVkIGJ5IGNhbGxpbmc6CisgICAgICoKKyAgICAgKiByZXNldERyYXdUZXh0dXJlVGV4Q29vcmRzKDAuMGYsIDAuMGYsIDEuMGYsIDEuMGYpOworICAgICAqCisgICAgICogQHBhcmFtIHUxIFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHRleHR1cmUKKyAgICAgKiBAcGFyYW0gdjEgVGhlIGJvdHRvbSBjb29yZGluYXRlIG9mIHRoZSB0ZXh0dXJlCisgICAgICogQHBhcmFtIHUyIFRoZSByaWdodCBjb29yZGluYXRlIG9mIHRoZSB0ZXh0dXJlCisgICAgICogQHBhcmFtIHYyIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgdGV4dHVyZQorICAgICAqLworICAgIHZvaWQgcmVzZXREcmF3VGV4dHVyZVRleENvb3JkcyhmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHUyLCBmbG9hdCB2Mik7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhbHBoYSBhbmQgeGZlcm1vZGUgb3V0IG9mIGEgcGFpbnQgb2JqZWN0LiBJZiB0aGUgcGFpbnQgaXMgbnVsbAorICAgICAqIGFscGhhIHdpbGwgYmUgMjU1IGFuZCB0aGUgeGZlcm1vZGUgd2lsbCBiZSBTUkNfT1ZFUi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWludCBUaGUgcGFpbnQgdG8gZXh0cmFjdCB2YWx1ZXMgZnJvbQorICAgICAqIEBwYXJhbSBhbHBoYSBXaGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0aW5nIGFscGhhCisgICAgICogQHBhcmFtIG1vZGUgV2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdGluZyB4ZmVybW9kZQorICAgICAqLworICAgIGlubGluZSB2b2lkIGdldEFscGhhQW5kTW9kZShjb25zdCBTa1BhaW50KiBwYWludCwgaW50KiBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSogbW9kZSk7CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyB0aGUgc3BlY2lmaWVkIHRleHR1cmUgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXAgbW9kZXMuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgYmluZFRleHR1cmUoR0x1aW50IHRleHR1cmUsIEdMZW51bSB3cmFwUywgR0xlbnVtIHdyYXBULCBHTHVpbnQgdGV4dHVyZVVuaXQgPSAwKTsKKworICAgIC8qKgorICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIGJsZW5kaW5nIGFzIG5lY2Vzc2FyeS4gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBhcHByb3ByaWF0ZQorICAgICAqIGJsZW5kIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgeGZlcm1vZGUuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgY2hvb3NlQmxlbmRpbmcoYm9vbCBibGVuZCwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGlzUHJlbXVsdGlwbGllZCA9IHRydWUpOworCisgICAgLyoqCisgICAgICogVXNlIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbSB3aXRoIHRoZSBjdXJyZW50IEdMIGNvbnRleHQuIElmIHRoZSBwcm9ncmFtIGlzIGFscmVhZHkKKyAgICAgKiBpbiB1c2UsIGl0IHdpbGwgbm90IGJlIGJvdW5kIGFnYWluLiBJZiBpdCBpcyBub3QgaW4gdXNlLCB0aGUgY3VycmVudCBwcm9ncmFtIGlzCisgICAgICogbWFya2VkIHVudXNlZCBhbmQgdGhlIHNwZWNpZmllZCBwcm9ncmFtIGJlY29tZXMgdXNlZCBhbmQgYmVjb21lcyB0aGUgbmV3CisgICAgICogY3VycmVudCBwcm9ncmFtLgorICAgICAqCisgICAgICogQHBhcmFtIHByb2dyYW0gVGhlIHByb2dyYW0gdG8gdXNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgSWYgdGhlIHNwZWNpZmllZCBwcm9ncmFtIHdhcyBhbHJlYWR5IGluIHVzZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGlubGluZSBib29sIHVzZVByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSk7CisKKyAgICAvLyBEaW1lbnNpb25zIG9mIHRoZSBkcmF3aW5nIHN1cmZhY2UKKyAgICBpbnQgbVdpZHRoLCBtSGVpZ2h0OworCisgICAgLy8gTWF0cml4IHVzZWQgZm9yIG9ydGhvIHByb2plY3Rpb24gaW4gc2hhZGVycworICAgIG1hdDQgbU9ydGhvTWF0cml4OworCisgICAgLy8gTW9kZWwtdmlldyBtYXRyaXggdXNlZCB0byBwb3NpdGlvbi9zaXplIG9iamVjdHMKKyAgICBtYXQ0IG1Nb2RlbFZpZXc7CisKKyAgICAvLyBOdW1iZXIgb2Ygc2F2ZWQgc3RhdGVzCisgICAgaW50IG1TYXZlQ291bnQ7CisgICAgLy8gQmFzZSBzdGF0ZQorICAgIHNwPFNuYXBzaG90PiBtRmlyc3RTbmFwc2hvdDsKKyAgICAvLyBDdXJyZW50IHN0YXRlCisgICAgc3A8U25hcHNob3Q+IG1TbmFwc2hvdDsKKworICAgIC8vIFNoYWRlcnMKKyAgICBTa2lhU2hhZGVyKiBtU2hhZGVyOworCisgICAgLy8gQ29sb3IgZmlsdGVycworICAgIFNraWFDb2xvckZpbHRlciogbUNvbG9yRmlsdGVyOworCisgICAgLy8gVXNlZCB0byBkcmF3IHRleHR1cmVkIHF1YWRzCisgICAgVGV4dHVyZVZlcnRleCBtTWVzaFZlcnRpY2VzWzRdOworCisgICAgLy8gR0wgZXh0ZW5zaW9ucworICAgIEV4dGVuc2lvbnMgbUV4dGVuc2lvbnM7CisKKyAgICAvLyBEcm9wIHNoYWRvdworICAgIGJvb2wgbUhhc1NoYWRvdzsKKyAgICBmbG9hdCBtU2hhZG93UmFkaXVzOworICAgIGZsb2F0IG1TaGFkb3dEeDsKKyAgICBmbG9hdCBtU2hhZG93RHk7CisgICAgaW50IG1TaGFkb3dDb2xvcjsKKworICAgIC8vIFZhcmlvdXMgY2FjaGVzCisgICAgQ2FjaGVzJiBtQ2FjaGVzOworfTsgLy8gY2xhc3MgT3BlbkdMUmVuZGVyZXIKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX09QRU5HTF9SRU5ERVJFUl9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUGF0Y2guY3BwIGIvbGlicy9od3VpL1BhdGNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjZiYjM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1BhdGNoLmNwcApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJQYXRjaC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1BhdGNoOjpQYXRjaChjb25zdCB1aW50MzJfdCB4Q291bnQsIGNvbnN0IHVpbnQzMl90IHlDb3VudCk6CisgICAgICAgIHhDb3VudCh4Q291bnQgKyAyKSwgeUNvdW50KHlDb3VudCArIDIpIHsKKyAgICB2ZXJ0aWNlc0NvdW50ID0gKHhDb3VudCArIDIpICogKHlDb3VudCArIDIpOworICAgIHZlcnRpY2VzID0gbmV3IFRleHR1cmVWZXJ0ZXhbdmVydGljZXNDb3VudF07CisKKyAgICAvLyAyIHRyaWFuZ2xlcyBwZXIgcGF0Y2gsIDMgdmVydGljZXMgcGVyIHRyaWFuZ2xlCisgICAgaW5kaWNlc0NvdW50ID0gKHhDb3VudCArIDEpICogKHlDb3VudCArIDEpICogMiAqIDM7CisgICAgaW5kaWNlcyA9IG5ldyB1aW50MTZfdFtpbmRpY2VzQ291bnRdOworCisgICAgY29uc3QgdWludDMyX3QgeE51bSA9IHhDb3VudCArIDE7CisgICAgY29uc3QgdWludDMyX3QgeU51bSA9IHlDb3VudCArIDE7CisKKyAgICB1aW50MTZfdCogc3RhcnRJbmRpY2VzID0gaW5kaWNlczsKKyAgICB1aW50MzJfdCBuID0gMDsKKyAgICBmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgeU51bTsgeSsrKSB7CisgICAgICAgIGZvciAodWludDMyX3QgeCA9IDA7IHggPCB4TnVtOyB4KyspIHsKKyAgICAgICAgICAgICpzdGFydEluZGljZXMrKyA9IG47CisgICAgICAgICAgICAqc3RhcnRJbmRpY2VzKysgPSBuICsgMTsKKyAgICAgICAgICAgICpzdGFydEluZGljZXMrKyA9IG4gKyB4TnVtICsgMjsKKworICAgICAgICAgICAgKnN0YXJ0SW5kaWNlcysrID0gbjsKKyAgICAgICAgICAgICpzdGFydEluZGljZXMrKyA9IG4gKyB4TnVtICsgMjsKKyAgICAgICAgICAgICpzdGFydEluZGljZXMrKyA9IG4gKyB4TnVtICsgMTsKKworICAgICAgICAgICAgbiArPSAxOworICAgICAgICB9CisgICAgICAgIG4gKz0gMTsKKyAgICB9Cit9CisKK1BhdGNoOjp+UGF0Y2goKSB7CisgICAgZGVsZXRlIGluZGljZXM7CisgICAgZGVsZXRlIHZlcnRpY2VzOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBWZXJ0aWNlcyBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgUGF0Y2g6OnVwZGF0ZVZlcnRpY2VzKGNvbnN0IFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsCisgICAgICAgIGZsb2F0IGJvdHRvbSwgY29uc3QgaW50MzJfdCogeERpdnMsICBjb25zdCBpbnQzMl90KiB5RGl2cywgY29uc3QgdWludDMyX3Qgd2lkdGgsCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGhlaWdodCkgeworICAgIGNvbnN0IHVpbnQzMl90IHhTdHJldGNoQ291bnQgPSAod2lkdGggKyAxKSA+PiAxOworICAgIGNvbnN0IHVpbnQzMl90IHlTdHJldGNoQ291bnQgPSAoaGVpZ2h0ICsgMSkgPj4gMTsKKworICAgIGZsb2F0IHhTdHJldGNoID0gMDsKKyAgICBmbG9hdCB5U3RyZXRjaCA9IDA7CisgICAgZmxvYXQgeFN0cmV0Y2hUZXggPSAwOworICAgIGZsb2F0IHlTdHJldGNoVGV4ID0gMDsKKworICAgIGNvbnN0IGZsb2F0IG1lc2hXaWR0aCA9IHJpZ2h0IC0gbGVmdDsKKworICAgIGNvbnN0IGZsb2F0IGJpdG1hcFdpZHRoID0gZmxvYXQoYml0bWFwLT53aWR0aCgpKTsKKyAgICBjb25zdCBmbG9hdCBiaXRtYXBIZWlnaHQgPSBmbG9hdChiaXRtYXAtPmhlaWdodCgpKTsKKworICAgIGlmICh4U3RyZXRjaENvdW50ID4gMCkgeworICAgICAgICB1aW50MzJfdCBzdHJldGNoU2l6ZSA9IDA7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDE7IGkgPCB3aWR0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBzdHJldGNoU2l6ZSArPSB4RGl2c1tpXSAtIHhEaXZzW2kgLSAxXTsKKyAgICAgICAgfQorICAgICAgICB4U3RyZXRjaFRleCA9IChzdHJldGNoU2l6ZSAvIGJpdG1hcFdpZHRoKSAvIHhTdHJldGNoQ291bnQ7CisgICAgICAgIGNvbnN0IGZsb2F0IGZpeGVkID0gYml0bWFwV2lkdGggLSBzdHJldGNoU2l6ZTsKKyAgICAgICAgeFN0cmV0Y2ggPSAocmlnaHQgLSBsZWZ0IC0gZml4ZWQpIC8geFN0cmV0Y2hDb3VudDsKKyAgICB9CisKKyAgICBpZiAoeVN0cmV0Y2hDb3VudCA+IDApIHsKKyAgICAgICAgdWludDMyX3Qgc3RyZXRjaFNpemUgPSAwOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAxOyBpIDwgaGVpZ2h0OyBpICs9IDIpIHsKKyAgICAgICAgICAgIHN0cmV0Y2hTaXplICs9IHlEaXZzW2ldIC0geURpdnNbaSAtIDFdOworICAgICAgICB9CisgICAgICAgIHlTdHJldGNoVGV4ID0gKHN0cmV0Y2hTaXplIC8gYml0bWFwSGVpZ2h0KSAvIHlTdHJldGNoQ291bnQ7CisgICAgICAgIGNvbnN0IGZsb2F0IGZpeGVkID0gYml0bWFwSGVpZ2h0IC0gc3RyZXRjaFNpemU7CisgICAgICAgIHlTdHJldGNoID0gKGJvdHRvbSAtIHRvcCAtIGZpeGVkKSAvIHlTdHJldGNoQ291bnQ7CisgICAgfQorCisgICAgZmxvYXQgdnkgPSAwLjBmOworICAgIGZsb2F0IHR5ID0gMC4wZjsKKyAgICBUZXh0dXJlVmVydGV4KiB2ZXJ0ZXggPSB2ZXJ0aWNlczsKKworICAgIGdlbmVyYXRlVmVydGljZXModmVydGV4LCAwLjBmLCAwLjBmLCB4RGl2cywgd2lkdGgsIHhTdHJldGNoLCB4U3RyZXRjaFRleCwKKyAgICAgICAgICAgIG1lc2hXaWR0aCwgYml0bWFwV2lkdGgpOworICAgIHZlcnRleCArPSB3aWR0aCArIDI7CisKKyAgICBmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgaWYgKHkgJiAxKSB7CisgICAgICAgICAgICB2eSArPSB5U3RyZXRjaDsKKyAgICAgICAgICAgIHR5ICs9IHlTdHJldGNoVGV4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgc3RlcCA9IGZsb2F0KHlEaXZzW3ldKTsKKyAgICAgICAgICAgIHZ5ICs9IHN0ZXA7CisgICAgICAgICAgICB0eSArPSBzdGVwIC8gYml0bWFwSGVpZ2h0OworICAgICAgICB9CisgICAgICAgIGdlbmVyYXRlVmVydGljZXModmVydGV4LCB2eSwgdHksIHhEaXZzLCB3aWR0aCwgeFN0cmV0Y2gsIHhTdHJldGNoVGV4LAorICAgICAgICAgICAgICAgIG1lc2hXaWR0aCwgYml0bWFwV2lkdGgpOworICAgICAgICB2ZXJ0ZXggKz0gd2lkdGggKyAyOworICAgIH0KKworICAgIGdlbmVyYXRlVmVydGljZXModmVydGV4LCBib3R0b20gLSB0b3AsIDEuMGYsIHhEaXZzLCB3aWR0aCwgeFN0cmV0Y2gsIHhTdHJldGNoVGV4LAorICAgICAgICAgICAgbWVzaFdpZHRoLCBiaXRtYXBXaWR0aCk7Cit9CisKK2lubGluZSB2b2lkIFBhdGNoOjpnZW5lcmF0ZVZlcnRpY2VzKFRleHR1cmVWZXJ0ZXgqIHZlcnRleCwgZmxvYXQgeSwgZmxvYXQgdiwKKyAgICAgICAgY29uc3QgaW50MzJfdCB4RGl2c1tdLCB1aW50MzJfdCB4Q291bnQsIGZsb2F0IHhTdHJldGNoLCBmbG9hdCB4U3RyZXRjaFRleCwKKyAgICAgICAgZmxvYXQgd2lkdGgsIGZsb2F0IHdpZHRoVGV4KSB7CisgICAgZmxvYXQgdnggPSAwLjBmOworICAgIGZsb2F0IHR4ID0gMC4wZjsKKworICAgIFRleHR1cmVWZXJ0ZXg6OnNldCh2ZXJ0ZXgsIHZ4LCB5LCB0eCwgdik7CisgICAgdmVydGV4Kys7CisKKyAgICBmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgeENvdW50OyB4KyspIHsKKyAgICAgICAgaWYgKHggJiAxKSB7CisgICAgICAgICAgICB2eCArPSB4U3RyZXRjaDsKKyAgICAgICAgICAgIHR4ICs9IHhTdHJldGNoVGV4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgc3RlcCA9IGZsb2F0KHhEaXZzW3hdKTsKKyAgICAgICAgICAgIHZ4ICs9IHN0ZXA7CisgICAgICAgICAgICB0eCArPSBzdGVwIC8gd2lkdGhUZXg7CisgICAgICAgIH0KKworICAgICAgICBUZXh0dXJlVmVydGV4OjpzZXQodmVydGV4LCB2eCwgeSwgdHgsIHYpOworICAgICAgICB2ZXJ0ZXgrKzsKKyAgICB9CisKKyAgICBUZXh0dXJlVmVydGV4OjpzZXQodmVydGV4LCB3aWR0aCwgeSwgMS4wZiwgdik7CisgICAgdmVydGV4Kys7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlYnVnIHRvb2xzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgUGF0Y2g6OmR1bXAoKSB7CisgICAgTE9HRCgiVmVydGljZXMgWyIpOworICAgIGZvciAodWludDMyX3QgeSA9IDA7IHkgPCB5Q291bnQ7IHkrKykgeworICAgICAgICBjaGFyIGJ1ZmZlcls1MTJdOworICAgICAgICBidWZmZXJbMF0gPSAnXDAnOworICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSAwOworICAgICAgICBmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgeENvdW50OyB4KyspIHsKKyAgICAgICAgICAgIFRleHR1cmVWZXJ0ZXgqIHYgPSAmdmVydGljZXNbeSAqIHhDb3VudCArIHhdOworICAgICAgICAgICAgb2Zmc2V0ICs9IHNwcmludGYoJmJ1ZmZlcltvZmZzZXRdLCAiICglLjRmLCUuNGYpLSglLjRmLCUuNGYpIiwKKyAgICAgICAgICAgICAgICAgICAgdi0+cG9zaXRpb25bMF0sIHYtPnBvc2l0aW9uWzFdLCB2LT50ZXh0dXJlWzBdLCB2LT50ZXh0dXJlWzFdKTsKKyAgICAgICAgfQorICAgICAgICBMT0dEKCIgIFslcyBdIiwgYnVmZmVyKTsKKyAgICB9CisgICAgTE9HRCgiXVxuSW5kaWNlcyBbICIpOworICAgIGNoYXIgYnVmZmVyWzQwOTZdOworICAgIGJ1ZmZlclswXSA9ICdcMCc7CisgICAgdWludDMyX3Qgb2Zmc2V0ID0gMDsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW5kaWNlc0NvdW50OyBpKyspIHsKKyAgICAgICAgb2Zmc2V0ICs9IHNwcmludGYoJmJ1ZmZlcltvZmZzZXRdLCAiJWQgIiwgaW5kaWNlc1tpXSk7CisgICAgfQorICAgIExPR0QoIiAgJXNcbl0iLCBidWZmZXIpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9QYXRjaC5oIGIvbGlicy9od3VpL1BhdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzYWQwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9QYXRjaC5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUEFUQ0hfSAorI2RlZmluZSBBTkRST0lEX1VJX1BBVENIX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8U2tCaXRtYXAuaD4KKworI2luY2x1ZGUgIlZlcnRleC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgYSBwYXRjaC4KKyAqLworc3RydWN0IFBhdGNoRGVzY3JpcHRpb24geworICAgIFBhdGNoRGVzY3JpcHRpb24oKTogeENvdW50KDApLCB5Q291bnQoMCkgeyB9CisgICAgUGF0Y2hEZXNjcmlwdGlvbihjb25zdCB1aW50MzJfdCB4Q291bnQsIGNvbnN0IHVpbnQzMl90IHlDb3VudCk6CisgICAgICAgICAgICB4Q291bnQoeENvdW50KSwgeUNvdW50KHlDb3VudCkgeyB9CisgICAgUGF0Y2hEZXNjcmlwdGlvbihjb25zdCBQYXRjaERlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik6CisgICAgICAgICAgICB4Q291bnQoZGVzY3JpcHRpb24ueENvdW50KSwgeUNvdW50KGRlc2NyaXB0aW9uLnlDb3VudCkgeyB9CisKKyAgICB1aW50MzJfdCB4Q291bnQ7CisgICAgdWludDMyX3QgeUNvdW50OworCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUGF0Y2hEZXNjcmlwdGlvbiYgcmhzKSBjb25zdCB7CisgICAgICAgIGlmICh4Q291bnQgPT0gcmhzLnhDb3VudCkgeworICAgICAgICAgICAgcmV0dXJuIHlDb3VudCA8IHJocy55Q291bnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHhDb3VudCA8IHJocy54Q291bnQ7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBhdGNoRGVzY3JpcHRpb24mIHJocykgY29uc3QgeworICAgICAgICByZXR1cm4geENvdW50ID09IHJocy54Q291bnQgJiYgeUNvdW50ID09IHJocy55Q291bnQ7CisgICAgfQorfTsgLy8gc3RydWN0IFBhdGNoRGVzY3JpcHRpb24KKworLyoqCisgKiBBbiBPcGVuR0wgcGF0Y2guIFRoaXMgY29udGFpbnMgYW4gYXJyYXkgb2YgdmVydGljZXMgYW5kIGFuIGFycmF5IG9mCisgKiBpbmRpY2VzIHRvIHJlbmRlciB0aGUgdmVydGljZXMuCisgKi8KK3N0cnVjdCBQYXRjaCB7CisgICAgUGF0Y2goY29uc3QgdWludDMyX3QgeENvdW50LCBjb25zdCB1aW50MzJfdCB5Q291bnQpOworICAgIH5QYXRjaCgpOworCisgICAgdm9pZCB1cGRhdGVWZXJ0aWNlcyhjb25zdCBTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBjb25zdCBpbnQzMl90KiB4RGl2cywgIGNvbnN0IGludDMyX3QqIHlEaXZzLAorICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgd2lkdGgsIGNvbnN0IHVpbnQzMl90IGhlaWdodCk7CisgICAgdm9pZCBkdW1wKCk7CisKKyAgICB1aW50MzJfdCB4Q291bnQ7CisgICAgdWludDMyX3QgeUNvdW50OworCisgICAgdWludDE2X3QqIGluZGljZXM7CisgICAgdWludDMyX3QgaW5kaWNlc0NvdW50OworCisgICAgVGV4dHVyZVZlcnRleCogdmVydGljZXM7CisgICAgdWludDMyX3QgdmVydGljZXNDb3VudDsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgZ2VuZXJhdGVWZXJ0aWNlcyhUZXh0dXJlVmVydGV4KiB2ZXJ0ZXgsIGZsb2F0IHksIGZsb2F0IHYsCisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHhEaXZzW10sIHVpbnQzMl90IHhDb3VudCwgZmxvYXQgeFN0cmV0Y2gsIGZsb2F0IHhTdHJldGNoVGV4LAorICAgICAgICAgICAgZmxvYXQgd2lkdGgsIGZsb2F0IHdpZHRoVGV4KTsKK307IC8vIHN0cnVjdCBQYXRjaAorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfUEFUQ0hfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1BhdGNoQ2FjaGUuY3BwIGIvbGlicy9od3VpL1BhdGNoQ2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YzBjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUGF0Y2hDYWNoZS5jcHAKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZXNvdXJjZVR5cGVzLmg+CisKKyNpbmNsdWRlICJQYXRjaENhY2hlLmgiCisjaW5jbHVkZSAiUHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1BhdGNoQ2FjaGU6OlBhdGNoQ2FjaGUoKTogbUNhY2hlKERFRkFVTFRfUEFUQ0hfQ0FDSEVfU0laRSkgeworfQorCitQYXRjaENhY2hlOjpQYXRjaENhY2hlKHVpbnQzMl90IG1heEVudHJpZXMpOiBtQ2FjaGUobWF4RW50cmllcykgeworfQorCitQYXRjaENhY2hlOjp+UGF0Y2hDYWNoZSgpIHsKKyAgICBjbGVhcigpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWxsYmFja3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRjaENhY2hlOjpvcGVyYXRvcigpKFBhdGNoRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBQYXRjaComIG1lc2gpIHsKKyAgICBpZiAobWVzaCkgZGVsZXRlIG1lc2g7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRjaENhY2hlOjpjbGVhcigpIHsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKKyAgICBtQ2FjaGUuY2xlYXIoKTsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcihOVUxMKTsKK30KKworUGF0Y2gqIFBhdGNoQ2FjaGU6OmdldChjb25zdCBSZXNfcG5nXzlwYXRjaCogcGF0Y2gpIHsKKyAgICBjb25zdCB1aW50MzJfdCB3aWR0aCA9IHBhdGNoLT5udW1YRGl2czsKKyAgICBjb25zdCB1aW50MzJfdCBoZWlnaHQgPSBwYXRjaC0+bnVtWURpdnM7CisgICAgY29uc3QgUGF0Y2hEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbih3aWR0aCwgaGVpZ2h0KTsKKworICAgIFBhdGNoKiBtZXNoID0gbUNhY2hlLmdldChkZXNjcmlwdGlvbik7CisgICAgaWYgKCFtZXNoKSB7CisgICAgICAgIFBBVENIX0xPR0QoIkNyZWF0aW5nIG5ldyBwYXRjaCBtZXNoLCB3PSVkIGg9JWQiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgbWVzaCA9IG5ldyBQYXRjaCh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgbUNhY2hlLnB1dChkZXNjcmlwdGlvbiwgbWVzaCk7CisgICAgfQorCisgICAgcmV0dXJuIG1lc2g7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1BhdGNoQ2FjaGUuaCBiL2xpYnMvaHd1aS9QYXRjaENhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg3NGExNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9QYXRjaENhY2hlLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9QQVRDSF9DQUNIRV9ICisjZGVmaW5lIEFORFJPSURfVUlfUEFUQ0hfQ0FDSEVfSAorCisjaW5jbHVkZSAiUGF0Y2guaCIKKyNpbmNsdWRlICJHZW5lcmF0aW9uQ2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWZpbmVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIERlYnVnCisjZGVmaW5lIERFQlVHX1BBVENIRVMgMAorCisvLyBEZWJ1ZworI2lmIERFQlVHX1BBVENIRVMKKyAgICAjZGVmaW5lIFBBVENIX0xPR0QoLi4uKSBMT0dEKF9fVkFfQVJHU19fKQorI2Vsc2UKKyAgICAjZGVmaW5lIFBBVENIX0xPR0QoLi4uKQorI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIFBhdGNoQ2FjaGU6IHB1YmxpYyBPbkVudHJ5UmVtb3ZlZDxQYXRjaERlc2NyaXB0aW9uLCBQYXRjaCo+IHsKK3B1YmxpYzoKKyAgICBQYXRjaENhY2hlKCk7CisgICAgUGF0Y2hDYWNoZSh1aW50MzJfdCBtYXhDYXBhY2l0eSk7CisgICAgflBhdGNoQ2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoUGF0Y2hEZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIFBhdGNoKiYgbWVzaCk7CisKKyAgICBQYXRjaCogZ2V0KGNvbnN0IFJlc19wbmdfOXBhdGNoKiBwYXRjaCk7CisgICAgdm9pZCBjbGVhcigpOworCitwcml2YXRlOgorICAgIEdlbmVyYXRpb25DYWNoZTxQYXRjaERlc2NyaXB0aW9uLCBQYXRjaCo+IG1DYWNoZTsKK307IC8vIGNsYXNzIFBhdGNoQ2FjaGUKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1BBVENIX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9QYXRoQ2FjaGUuY3BwIGIvbGlicy9od3VpL1BhdGhDYWNoZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4YzBjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9QYXRoQ2FjaGUuY3BwCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8U2tDYW52YXMuaD4KKyNpbmNsdWRlIDxTa1JlY3QuaD4KKworI2luY2x1ZGUgIlBhdGhDYWNoZS5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQYXRoQ2FjaGU6OlBhdGhDYWNoZSgpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPFBhdGhDYWNoZUVudHJ5LCBQYXRoVGV4dHVyZSo+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUoTUIoREVGQVVMVF9QQVRIX0NBQ0hFX1NJWkUpKSB7CisgICAgY2hhciBwcm9wZXJ0eVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUEVSVFlfUEFUSF9DQUNIRV9TSVpFLCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyBwYXRoIGNhY2hlIHNpemUgdG8gJXNNQiIsIHByb3BlcnR5KTsKKyAgICAgICAgc2V0TWF4U2l6ZShNQihhdG9mKHByb3BlcnR5KSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCBwYXRoIGNhY2hlIHNpemUgb2YgJS4yZk1CIiwgREVGQVVMVF9QQVRIX0NBQ0hFX1NJWkUpOworICAgIH0KKyAgICBpbml0KCk7Cit9CisKK1BhdGhDYWNoZTo6UGF0aENhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxQYXRoQ2FjaGVFbnRyeSwgUGF0aFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKG1heEJ5dGVTaXplKSB7CisgICAgaW5pdCgpOworfQorCitQYXRoQ2FjaGU6On5QYXRoQ2FjaGUoKSB7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK3ZvaWQgUGF0aENhY2hlOjppbml0KCkgeworICAgIG1DYWNoZS5zZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKHRoaXMpOworCisgICAgR0xpbnQgbWF4VGV4dHVyZVNpemU7CisgICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfVEVYVFVSRV9TSVpFLCAmbWF4VGV4dHVyZVNpemUpOworICAgIG1NYXhUZXh0dXJlU2l6ZSA9IG1heFRleHR1cmVTaXplOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaXplIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWludDMyX3QgUGF0aENhY2hlOjpnZXRTaXplKCkgeworICAgIHJldHVybiBtU2l6ZTsKK30KKwordWludDMyX3QgUGF0aENhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIHJldHVybiBtTWF4U2l6ZTsKK30KKwordm9pZCBQYXRoQ2FjaGU6OnNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIG1NYXhTaXplID0gbWF4U2l6ZTsKKyAgICB3aGlsZSAobVNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWxsYmFja3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRoQ2FjaGU6Om9wZXJhdG9yKCkoUGF0aENhY2hlRW50cnkmIHBhdGgsIFBhdGhUZXh0dXJlKiYgdGV4dHVyZSkgeworICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSB0ZXh0dXJlLT53aWR0aCAqIHRleHR1cmUtPmhlaWdodDsKKyAgICBtU2l6ZSAtPSBzaXplOworCisgICAgaWYgKHRleHR1cmUpIHsKKyAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmdGV4dHVyZS0+aWQpOworICAgICAgICBkZWxldGUgdGV4dHVyZTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUGF0aFRleHR1cmUqIFBhdGhDYWNoZTo6Z2V0KFNrUGF0aCogcGF0aCwgU2tQYWludCogcGFpbnQpIHsKKyAgICBQYXRoQ2FjaGVFbnRyeSBlbnRyeShwYXRoLCBwYWludCk7CisgICAgUGF0aFRleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGUuZ2V0KGVudHJ5KTsKKworICAgIGlmICghdGV4dHVyZSkgeworICAgICAgICB0ZXh0dXJlID0gYWRkVGV4dHVyZShlbnRyeSwgcGF0aCwgcGFpbnQpOworICAgIH0gZWxzZSBpZiAocGF0aC0+Z2V0R2VuZXJhdGlvbklEKCkgIT0gdGV4dHVyZS0+Z2VuZXJhdGlvbikgeworICAgICAgICBtQ2FjaGUucmVtb3ZlKGVudHJ5KTsKKyAgICAgICAgdGV4dHVyZSA9IGFkZFRleHR1cmUoZW50cnksIHBhdGgsIHBhaW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gdGV4dHVyZTsKK30KKworUGF0aFRleHR1cmUqIFBhdGhDYWNoZTo6YWRkVGV4dHVyZShjb25zdCBQYXRoQ2FjaGVFbnRyeSYgZW50cnksCisgICAgICAgIGNvbnN0IFNrUGF0aCAqcGF0aCwgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBjb25zdCBTa1JlY3QmIGJvdW5kcyA9IHBhdGgtPmdldEJvdW5kcygpOworCisgICAgY29uc3QgZmxvYXQgcGF0aFdpZHRoID0gYm91bmRzLndpZHRoKCk7CisgICAgY29uc3QgZmxvYXQgcGF0aEhlaWdodCA9IGJvdW5kcy5oZWlnaHQoKTsKKworICAgIGlmIChwYXRoV2lkdGggPiBtTWF4VGV4dHVyZVNpemUgfHwgcGF0aEhlaWdodCA+IG1NYXhUZXh0dXJlU2l6ZSkgeworICAgICAgICBMT0dXKCJQYXRoIHRvbyBsYXJnZSB0byBiZSByZW5kZXJlZCBpbnRvIGEgdGV4dHVyZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjb25zdCBmbG9hdCBvZmZzZXQgPSBlbnRyeS5zdHJva2VXaWR0aCAqIDEuNWY7CisgICAgY29uc3QgdWludDMyX3Qgd2lkdGggPSB1aW50MzJfdChwYXRoV2lkdGggKyBvZmZzZXQgKiAyLjAgKyAwLjUpOworICAgIGNvbnN0IHVpbnQzMl90IGhlaWdodCA9IHVpbnQzMl90KHBhdGhIZWlnaHQgKyBvZmZzZXQgKiAyLjAgKyAwLjUpOworCisgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IHdpZHRoICogaGVpZ2h0OworICAgIC8vIERvbid0IGV2ZW4gdHJ5IHRvIGNhY2hlIGEgYml0bWFwIHRoYXQncyBiaWdnZXIgdGhhbiB0aGUgY2FjaGUKKyAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgIHdoaWxlIChtU2l6ZSArIHNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICAgICAgbUNhY2hlLnJlbW92ZU9sZGVzdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgUGF0aFRleHR1cmUqIHRleHR1cmUgPSBuZXcgUGF0aFRleHR1cmU7CisgICAgdGV4dHVyZS0+bGVmdCA9IGJvdW5kcy5mTGVmdDsKKyAgICB0ZXh0dXJlLT50b3AgPSBib3VuZHMuZlRvcDsKKyAgICB0ZXh0dXJlLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgdGV4dHVyZS0+d2lkdGggPSB3aWR0aDsKKyAgICB0ZXh0dXJlLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgdGV4dHVyZS0+Z2VuZXJhdGlvbiA9IHBhdGgtPmdldEdlbmVyYXRpb25JRCgpOworCisgICAgU2tCaXRtYXAgYml0bWFwOworICAgIGJpdG1hcC5zZXRDb25maWcoU2tCaXRtYXA6OmtBOF9Db25maWcsIHdpZHRoLCBoZWlnaHQpOworICAgIGJpdG1hcC5hbGxvY1BpeGVscygpOworICAgIGJpdG1hcC5lcmFzZUNvbG9yKDApOworCisgICAgU2tDYW52YXMgY2FudmFzKGJpdG1hcCk7CisgICAgY2FudmFzLnRyYW5zbGF0ZSgtYm91bmRzLmZMZWZ0ICsgb2Zmc2V0LCAtYm91bmRzLmZUb3AgKyBvZmZzZXQpOworICAgIGNhbnZhcy5kcmF3UGF0aCgqcGF0aCwgKnBhaW50KTsKKworICAgIGdlbmVyYXRlVGV4dHVyZShiaXRtYXAsIHRleHR1cmUpOworCisgICAgaWYgKHNpemUgPCBtTWF4U2l6ZSkgeworICAgICAgICBtU2l6ZSArPSBzaXplOworICAgICAgICBtQ2FjaGUucHV0KGVudHJ5LCB0ZXh0dXJlKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXh0dXJlLT5jbGVhbnVwID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdGV4dHVyZTsKK30KKwordm9pZCBQYXRoQ2FjaGU6OmNsZWFyKCkgeworICAgIG1DYWNoZS5jbGVhcigpOworfQorCit2b2lkIFBhdGhDYWNoZTo6Z2VuZXJhdGVUZXh0dXJlKFNrQml0bWFwJiBiaXRtYXAsIFRleHR1cmUqIHRleHR1cmUpIHsKKyAgICBTa0F1dG9Mb2NrUGl4ZWxzIGFscChiaXRtYXApOworICAgIGlmICghYml0bWFwLnJlYWR5VG9EcmF3KCkpIHsKKyAgICAgICAgTE9HRSgiQ2Fubm90IGdlbmVyYXRlIHRleHR1cmUgZnJvbSBiaXRtYXAiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsR2VuVGV4dHVyZXMoMSwgJnRleHR1cmUtPmlkKTsKKworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZS0+aWQpOworICAgIC8vIFRleHR1cmVzIGFyZSBBbHBoYTgKKyAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDEpOworCisgICAgdGV4dHVyZS0+YmxlbmQgPSB0cnVlOworICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9BTFBIQSwgdGV4dHVyZS0+d2lkdGgsIHRleHR1cmUtPmhlaWdodCwgMCwKKyAgICAgICAgICAgIEdMX0FMUEhBLCBHTF9VTlNJR05FRF9CWVRFLCBiaXRtYXAuZ2V0UGl4ZWxzKCkpOworCisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworCisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9QYXRoQ2FjaGUuaCBiL2xpYnMvaHd1aS9QYXRoQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjJlNWUwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1BhdGhDYWNoZS5oCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1BBVEhfQ0FDSEVfSAorI2RlZmluZSBBTkRST0lEX1VJX1BBVEhfQ0FDSEVfSAorCisjaW5jbHVkZSA8U2tCaXRtYXAuaD4KKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisjaW5jbHVkZSA8U2tQYXRoLmg+CisKKyNpbmNsdWRlICJUZXh0dXJlLmgiCisjaW5jbHVkZSAiR2VuZXJhdGlvbkNhY2hlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBEZXNjcmliZSBhIHBhdGggaW4gdGhlIHBhdGggY2FjaGUuCisgKi8KK3N0cnVjdCBQYXRoQ2FjaGVFbnRyeSB7CisgICAgUGF0aENhY2hlRW50cnkoKSB7CisgICAgICAgIHBhdGggPSBOVUxMOworICAgICAgICBqb2luID0gU2tQYWludDo6a0RlZmF1bHRfSm9pbjsKKyAgICAgICAgY2FwID0gU2tQYWludDo6a0RlZmF1bHRfQ2FwOworICAgICAgICBzdHlsZSA9IFNrUGFpbnQ6OmtGaWxsX1N0eWxlOworICAgICAgICBtaXRlciA9IDQuMGY7CisgICAgICAgIHN0cm9rZVdpZHRoID0gMS4wZjsKKyAgICB9CisKKyAgICBQYXRoQ2FjaGVFbnRyeShjb25zdCBQYXRoQ2FjaGVFbnRyeSYgZW50cnkpOgorICAgICAgICBwYXRoKGVudHJ5LnBhdGgpLCBqb2luKGVudHJ5LmpvaW4pLCBjYXAoZW50cnkuY2FwKSwKKyAgICAgICAgc3R5bGUoZW50cnkuc3R5bGUpLCBtaXRlcihlbnRyeS5taXRlciksCisgICAgICAgIHN0cm9rZVdpZHRoKGVudHJ5LnN0cm9rZVdpZHRoKSB7CisgICAgfQorCisgICAgUGF0aENhY2hlRW50cnkoU2tQYXRoKiBwYXRoLCBTa1BhaW50KiBwYWludCkgeworICAgICAgICB0aGlzLT5wYXRoID0gcGF0aDsKKyAgICAgICAgam9pbiA9IHBhaW50LT5nZXRTdHJva2VKb2luKCk7CisgICAgICAgIGNhcCA9IHBhaW50LT5nZXRTdHJva2VDYXAoKTsKKyAgICAgICAgbWl0ZXIgPSBwYWludC0+Z2V0U3Ryb2tlTWl0ZXIoKTsKKyAgICAgICAgc3Ryb2tlV2lkdGggPSBwYWludC0+Z2V0U3Ryb2tlV2lkdGgoKTsKKyAgICAgICAgc3R5bGUgPSBwYWludC0+Z2V0U3R5bGUoKTsKKyAgICB9CisKKyAgICBTa1BhdGgqIHBhdGg7CisgICAgU2tQYWludDo6Sm9pbiBqb2luOworICAgIFNrUGFpbnQ6OkNhcCBjYXA7CisgICAgU2tQYWludDo6U3R5bGUgc3R5bGU7CisgICAgZmxvYXQgbWl0ZXI7CisgICAgZmxvYXQgc3Ryb2tlV2lkdGg7CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBQYXRoQ2FjaGVFbnRyeSYgcmhzKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtZW1jbXAodGhpcywgJnJocywgc2l6ZW9mKFBhdGhDYWNoZUVudHJ5KSkgPCAwOworICAgIH0KK307IC8vIHN0cnVjdCBQYXRoQ2FjaGVFbnRyeQorCisvKioKKyAqIEFscGhhIHRleHR1cmUgdXNlZCB0byByZXByZXNlbnQgYSBwYXRoLgorICovCitzdHJ1Y3QgUGF0aFRleHR1cmU6IHB1YmxpYyBUZXh0dXJlIHsKKyAgICBQYXRoVGV4dHVyZSgpOiBUZXh0dXJlKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIExlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcGF0aCBib3VuZHMuCisgICAgICovCisgICAgZmxvYXQgbGVmdDsKKyAgICAvKioKKyAgICAgKiBUb3AgY29vcmRpbmF0ZSBvZiB0aGUgcGF0aCBib3VuZHMuCisgICAgICovCisgICAgZmxvYXQgdG9wOworICAgIC8qKgorICAgICAqIE9mZnNldCB0byBkcmF3IHRoZSBwYXRoIGF0IHRoZSBjb3JyZWN0IG9yaWdpbi4KKyAgICAgKi8KKyAgICBmbG9hdCBvZmZzZXQ7Cit9OyAvLyBzdHJ1Y3QgUGF0aFRleHR1cmUKKworLyoqCisgKiBBIHNpbXBsZSBMUlUgcGF0aCBjYWNoZS4gVGhlIGNhY2hlIGhhcyBhIG1heGltdW0gc2l6ZSBleHByZXNzZWQgaW4gYnl0ZXMuCisgKiBBbnkgdGV4dHVyZSBhZGRlZCB0byB0aGUgY2FjaGUgY2F1c2luZyB0aGUgY2FjaGUgdG8gZ3JvdyBiZXlvbmQgdGhlIG1heGltdW0KKyAqIGFsbG93ZWQgc2l6ZSB3aWxsIGFsc28gY2F1c2UgdGhlIG9sZGVzdCB0ZXh0dXJlIHRvIGJlIGtpY2tlZCBvdXQuCisgKi8KK2NsYXNzIFBhdGhDYWNoZTogcHVibGljIE9uRW50cnlSZW1vdmVkPFBhdGhDYWNoZUVudHJ5LCBQYXRoVGV4dHVyZSo+IHsKK3B1YmxpYzoKKyAgICBQYXRoQ2FjaGUoKTsKKyAgICBQYXRoQ2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOworICAgIH5QYXRoQ2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoUGF0aENhY2hlRW50cnkmIHBhdGgsIFBhdGhUZXh0dXJlKiYgdGV4dHVyZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGguIElmIHRoZSB0ZXh0dXJlCisgICAgICogY2Fubm90IGJlIGZvdW5kIGluIHRoZSBjYWNoZSwgYSBuZXcgdGV4dHVyZSBpcyBnZW5lcmF0ZWQuCisgICAgICovCisgICAgUGF0aFRleHR1cmUqIGdldChTa1BhdGgqIHBhdGgsIFNrUGFpbnQqIHBhaW50KTsKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIGNhY2hlLiBUaGlzIGNhdXNlcyBhbGwgdGV4dHVyZXMgdG8gYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHZvaWQgc2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldE1heFNpemUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldFNpemUoKTsKKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIHRleHR1cmUgZnJvbSBhIGJpdG1hcCBpbnRvIHRoZSBzcGVjaWZpZWQgdGV4dHVyZSBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgdm9pZCBnZW5lcmF0ZVRleHR1cmUoU2tCaXRtYXAmIGJpdG1hcCwgVGV4dHVyZSogdGV4dHVyZSk7CisKKyAgICBQYXRoVGV4dHVyZSogYWRkVGV4dHVyZShjb25zdCBQYXRoQ2FjaGVFbnRyeSYgZW50cnksIGNvbnN0IFNrUGF0aCAqcGF0aCwgY29uc3QgU2tQYWludCogcGFpbnQpOworCisgICAgdm9pZCBpbml0KCk7CisKKyAgICBHZW5lcmF0aW9uQ2FjaGU8UGF0aENhY2hlRW50cnksIFBhdGhUZXh0dXJlKj4gbUNhY2hlOworCisgICAgdWludDMyX3QgbVNpemU7CisgICAgdWludDMyX3QgbU1heFNpemU7CisgICAgR0x1aW50IG1NYXhUZXh0dXJlU2l6ZTsKK307IC8vIGNsYXNzIFBhdGhDYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfUEFUSF9DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUHJvZ3JhbS5jcHAgYi9saWJzL2h3dWkvUHJvZ3JhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyOGQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Qcm9ncmFtLmNwcApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlICJQcm9ncmFtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2hhZGVycworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIFNIQURFUl9TT1VSQ0UobmFtZSwgc291cmNlKSBjb25zdCBjaGFyKiBuYW1lID0gI3NvdXJjZQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCYXNlIHByb2dyYW0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUHJvZ3JhbTo6UHJvZ3JhbShjb25zdCBjaGFyKiB2ZXJ0ZXgsIGNvbnN0IGNoYXIqIGZyYWdtZW50KSB7CisgICAgdmVydGV4U2hhZGVyID0gYnVpbGRTaGFkZXIodmVydGV4LCBHTF9WRVJURVhfU0hBREVSKTsKKyAgICBmcmFnbWVudFNoYWRlciA9IGJ1aWxkU2hhZGVyKGZyYWdtZW50LCBHTF9GUkFHTUVOVF9TSEFERVIpOworCisgICAgaWQgPSBnbENyZWF0ZVByb2dyYW0oKTsKKyAgICBnbEF0dGFjaFNoYWRlcihpZCwgdmVydGV4U2hhZGVyKTsKKyAgICBnbEF0dGFjaFNoYWRlcihpZCwgZnJhZ21lbnRTaGFkZXIpOworICAgIGdsTGlua1Byb2dyYW0oaWQpOworCisgICAgR0xpbnQgc3RhdHVzOworICAgIGdsR2V0UHJvZ3JhbWl2KGlkLCBHTF9MSU5LX1NUQVRVUywgJnN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyAhPSBHTF9UUlVFKSB7CisgICAgICAgIEdMaW50IGluZm9MZW4gPSAwOworICAgICAgICBnbEdldFByb2dyYW1pdihpZCwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7CisgICAgICAgIGlmIChpbmZvTGVuID4gMSkgeworICAgICAgICAgICAgY2hhciogbG9nID0gKGNoYXIqKSBtYWxsb2Moc2l6ZW9mKGNoYXIpICogaW5mb0xlbik7CisgICAgICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nKGlkLCBpbmZvTGVuLCAwLCBsb2cpOworICAgICAgICAgICAgTE9HRSgiRXJyb3Igd2hpbGUgbGlua2luZyBzaGFkZXJzOiAlcyIsIGxvZyk7CisgICAgICAgICAgICBkZWxldGUgbG9nOworICAgICAgICB9CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcik7CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKKyAgICAgICAgZ2xEZWxldGVQcm9ncmFtKGlkKTsKKyAgICB9CisKKyAgICBtVXNlID0gZmFsc2U7CisKKyAgICBwb3NpdGlvbiA9IGFkZEF0dHJpYigicG9zaXRpb24iKTsKKyAgICBjb2xvciA9IGFkZFVuaWZvcm0oImNvbG9yIik7CisgICAgdHJhbnNmb3JtID0gYWRkVW5pZm9ybSgidHJhbnNmb3JtIik7Cit9CisKK1Byb2dyYW06On5Qcm9ncmFtKCkgeworICAgIGdsRGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcik7CisgICAgZ2xEZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOworICAgIGdsRGVsZXRlUHJvZ3JhbShpZCk7Cit9CisKK2ludCBQcm9ncmFtOjphZGRBdHRyaWIoY29uc3QgY2hhciogbmFtZSkgeworICAgIGludCBzbG90ID0gZ2xHZXRBdHRyaWJMb2NhdGlvbihpZCwgbmFtZSk7CisgICAgYXR0cmlidXRlcy5hZGQobmFtZSwgc2xvdCk7CisgICAgcmV0dXJuIHNsb3Q7Cit9CisKK2ludCBQcm9ncmFtOjpnZXRBdHRyaWIoY29uc3QgY2hhciogbmFtZSkgeworICAgIHNzaXplX3QgaW5kZXggPSBhdHRyaWJ1dGVzLmluZGV4T2ZLZXkobmFtZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMudmFsdWVBdChpbmRleCk7CisgICAgfQorICAgIHJldHVybiBhZGRBdHRyaWIobmFtZSk7Cit9CisKK2ludCBQcm9ncmFtOjphZGRVbmlmb3JtKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBpbnQgc2xvdCA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKGlkLCBuYW1lKTsKKyAgICB1bmlmb3Jtcy5hZGQobmFtZSwgc2xvdCk7CisgICAgcmV0dXJuIHNsb3Q7Cit9CisKK2ludCBQcm9ncmFtOjpnZXRVbmlmb3JtKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gdW5pZm9ybXMuaW5kZXhPZktleShuYW1lKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICByZXR1cm4gdW5pZm9ybXMudmFsdWVBdChpbmRleCk7CisgICAgfQorICAgIHJldHVybiBhZGRVbmlmb3JtKG5hbWUpOworfQorCitHTHVpbnQgUHJvZ3JhbTo6YnVpbGRTaGFkZXIoY29uc3QgY2hhciogc291cmNlLCBHTGVudW0gdHlwZSkgeworICAgIEdMdWludCBzaGFkZXIgPSBnbENyZWF0ZVNoYWRlcih0eXBlKTsKKyAgICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZzb3VyY2UsIDApOworICAgIGdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOworCisgICAgR0xpbnQgc3RhdHVzOworICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJnN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyAhPSBHTF9UUlVFKSB7CisgICAgICAgIC8vIFNvbWUgZHJpdmVycyByZXR1cm4gd3JvbmcgdmFsdWVzIGZvciBHTF9JTkZPX0xPR19MRU5HVEgKKyAgICAgICAgLy8gdXNlIGEgZml4ZWQgc2l6ZSBpbnN0ZWFkCisgICAgICAgIEdMY2hhciBsb2dbNTEyXTsKKyAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgc2l6ZW9mKGxvZyksIDAsICZsb2dbMF0pOworICAgICAgICBMT0dFKCJFcnJvciB3aGlsZSBjb21waWxpbmcgc2hhZGVyOiAlcyIsIGxvZyk7CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7CisgICAgfQorCisgICAgcmV0dXJuIHNoYWRlcjsKK30KKwordm9pZCBQcm9ncmFtOjpzZXQoY29uc3QgbWF0NCYgcHJvamVjdGlvbk1hdHJpeCwgY29uc3QgbWF0NCYgbW9kZWxWaWV3TWF0cml4LAorICAgICAgICBjb25zdCBtYXQ0JiB0cmFuc2Zvcm1NYXRyaXgpIHsKKyAgICBtYXQ0IHQocHJvamVjdGlvbk1hdHJpeCk7CisgICAgdC5tdWx0aXBseSh0cmFuc2Zvcm1NYXRyaXgpOworICAgIHQubXVsdGlwbHkobW9kZWxWaWV3TWF0cml4KTsKKworICAgIGdsVW5pZm9ybU1hdHJpeDRmdih0cmFuc2Zvcm0sIDEsIEdMX0ZBTFNFLCAmdC5kYXRhWzBdKTsKK30KKwordm9pZCBQcm9ncmFtOjp1c2UoKSB7CisgICAgZ2xVc2VQcm9ncmFtKGlkKTsKKyAgICBtVXNlID0gdHJ1ZTsKKworICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb24pOworfQorCit2b2lkIFByb2dyYW06OnJlbW92ZSgpIHsKKyAgICBtVXNlID0gZmFsc2U7CisKKyAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShwb3NpdGlvbik7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1Byb2dyYW0uaCBiL2xpYnMvaHd1aS9Qcm9ncmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUzMWM3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Qcm9ncmFtLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUFJPR1JBTV9ICisjZGVmaW5lIEFORFJPSURfVUlfUFJPR1JBTV9ICisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKKyNpbmNsdWRlICJNYXRyaXguaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvKioKKyAqIEEgcHJvZ3JhbSBob2xkcyBhIHZlcnRleCBhbmQgYSBmcmFnbWVudCBzaGFkZXIuIEl0IG9mZmVycyBzZXZlcmFsIHV0aWxpdHkKKyAqIG1ldGhvZHMgdG8gcXVlcnkgYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMuCisgKi8KK2NsYXNzIFByb2dyYW0geworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgcHJvZ3JhbSB3aXRoIHRoZSBzcGVjaWZpZWQgdmVydGV4IGFuZCBmcmFnbWVudAorICAgICAqIHNoYWRlcnMgc291cmNlcy4KKyAgICAgKi8KKyAgICBQcm9ncmFtKGNvbnN0IGNoYXIqIHZlcnRleCwgY29uc3QgY2hhciogZnJhZ21lbnQpOworICAgIHZpcnR1YWwgflByb2dyYW0oKTsKKworICAgIC8qKgorICAgICAqIEJpbmRzIHRoaXMgcHJvZ3JhbSB0byB0aGUgR0wgY29udGV4dC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgdXNlKCk7CisKKyAgICAvKioKKyAgICAgKiBNYXJrcyB0aGlzIHByb2dyYW0gYXMgdW51c2VkLiBUaGlzIHdpbGwgbm90IHVuYmluZAorICAgICAqIHRoZSBwcm9ncmFtIGZyb20gdGhlIEdMIGNvbnRleHQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHJlbW92ZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgT3BlbkdMIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUuCisgICAgICovCisgICAgaW50IGdldEF0dHJpYihjb25zdCBjaGFyKiBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIE9wZW5HTCBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgdW5pZm9ybS4KKyAgICAgKi8KKyAgICBpbnQgZ2V0VW5pZm9ybShjb25zdCBjaGFyKiBuYW1lKTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcHJvZ3JhbSBpcyBjdXJyZW50bHkgaW4gdXNlIHdpdGgKKyAgICAgKiB0aGUgR0wgY29udGV4dC4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc0luVXNlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVVzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyB0aGUgcHJvZ3JhbSB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvamVjdGlvbiwgbW9kZWxWaWV3IGFuZAorICAgICAqIHRyYW5zZm9ybSBtYXRyaWNlcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldChjb25zdCBtYXQ0JiBwcm9qZWN0aW9uTWF0cml4LCBjb25zdCBtYXQ0JiBtb2RlbFZpZXdNYXRyaXgsCisgICAgICAgICAgICAgY29uc3QgbWF0NCYgdHJhbnNmb3JtTWF0cml4KTsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHBvc2l0aW9uIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBpbnQgcG9zaXRpb247CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSBjb2xvciB1bmlmb3JtLgorICAgICAqLworICAgIGludCBjb2xvcjsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHRyYW5zZm9ybSB1bmlmb3JtLgorICAgICAqLworICAgIGludCB0cmFuc2Zvcm07CisKK3Byb3RlY3RlZDoKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIE9wZW5HTCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICovCisgICAgaW50IGFkZEF0dHJpYihjb25zdCBjaGFyKiBuYW1lKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSB1bmlmb3JtIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgT3BlbkdMIG5hbWUgb2YgdGhlIHVuaWZvcm0uCisgICAgICovCisgICAgaW50IGFkZFVuaWZvcm0oY29uc3QgY2hhciogbmFtZSk7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQ29tcGlsZXMgdGhlIHNwZWNpZmllZCBzaGFkZXIgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgY29tcGlsZWQgc2hhZGVyLgorICAgICAqLworICAgIEdMdWludCBidWlsZFNoYWRlcihjb25zdCBjaGFyKiBzb3VyY2UsIEdMZW51bSB0eXBlKTsKKworICAgIC8vIE5hbWUgb2YgdGhlIE9wZW5HTCBwcm9ncmFtCisgICAgR0x1aW50IGlkOworCisgICAgLy8gTmFtZSBvZiB0aGUgc2hhZGVycworICAgIEdMdWludCB2ZXJ0ZXhTaGFkZXI7CisgICAgR0x1aW50IGZyYWdtZW50U2hhZGVyOworCisgICAgLy8gS2VlcHMgdHJhY2sgb2YgYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMgc2xvdHMKKyAgICBLZXllZFZlY3Rvcjxjb25zdCBjaGFyKiwgaW50PiBhdHRyaWJ1dGVzOworICAgIEtleWVkVmVjdG9yPGNvbnN0IGNoYXIqLCBpbnQ+IHVuaWZvcm1zOworCisgICAgYm9vbCBtVXNlOworfTsgLy8gY2xhc3MgUHJvZ3JhbQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfUFJPR1JBTV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUHJvZ3JhbUNhY2hlLmNwcCBiL2xpYnMvaHd1aS9Qcm9ncmFtQ2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZmU4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUHJvZ3JhbUNhY2hlLmNwcApAQCAtMCwwICsxLDQzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlICJQcm9ncmFtQ2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBWZXJ0ZXggc2hhZGVycyBzbmlwcGV0cworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjb25zdCBjaGFyKiBnVlNfSGVhZGVyX0F0dHJpYnV0ZXMgPQorICAgICAgICAiYXR0cmlidXRlIHZlYzQgcG9zaXRpb247XG4iOworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9BdHRyaWJ1dGVzX1RleENvb3JkcyA9CisgICAgICAgICJhdHRyaWJ1dGUgdmVjMiB0ZXhDb29yZHM7XG4iOworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9Vbmlmb3JtcyA9CisgICAgICAgICJ1bmlmb3JtIG1hdDQgdHJhbnNmb3JtO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19IZWFkZXJfVW5pZm9ybXNfSGFzR3JhZGllbnQgPQorICAgICAgICAidW5pZm9ybSBmbG9hdCBncmFkaWVudExlbmd0aDtcbiIKKyAgICAgICAgInVuaWZvcm0gdmVjMiBncmFkaWVudDtcbiIKKyAgICAgICAgInVuaWZvcm0gdmVjMiBncmFkaWVudFN0YXJ0O1xuIgorICAgICAgICAidW5pZm9ybSBtYXQ0IHNjcmVlblNwYWNlO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19IZWFkZXJfVW5pZm9ybXNfSGFzQml0bWFwID0KKyAgICAgICAgInVuaWZvcm0gbWF0NCB0ZXh0dXJlVHJhbnNmb3JtO1xuIgorICAgICAgICAidW5pZm9ybSB2ZWMyIHRleHR1cmVEaW1lbnNpb247XG4iOworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9WYXJ5aW5nc19IYXNUZXh0dXJlID0KKyAgICAgICAgInZhcnlpbmcgdmVjMiBvdXRUZXhDb29yZHM7XG4iOworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9WYXJ5aW5nc19IYXNCaXRtYXAgPQorICAgICAgICAidmFyeWluZyB2ZWMyIG91dEJpdG1hcFRleENvb3JkcztcbiI7Citjb25zdCBjaGFyKiBnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc0dyYWRpZW50ID0KKyAgICAgICAgInZhcnlpbmcgZmxvYXQgaW5kZXg7XG4iOworY29uc3QgY2hhciogZ1ZTX01haW4gPQorICAgICAgICAiXG52b2lkIG1haW4odm9pZCkge1xuIjsKK2NvbnN0IGNoYXIqIGdWU19NYWluX091dFRleENvb3JkcyA9CisgICAgICAgICIgICAgb3V0VGV4Q29vcmRzID0gdGV4Q29vcmRzO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19NYWluX091dEdyYWRpZW50SW5kZXggPQorICAgICAgICAiICAgIHZlYzQgbG9jYXRpb24gPSBzY3JlZW5TcGFjZSAqIHBvc2l0aW9uO1xuIgorICAgICAgICAiICAgIGluZGV4ID0gZG90KGxvY2F0aW9uLnh5IC0gZ3JhZGllbnRTdGFydCwgZ3JhZGllbnQpICogZ3JhZGllbnRMZW5ndGg7XG4iOworY29uc3QgY2hhciogZ1ZTX01haW5fT3V0Qml0bWFwVGV4Q29vcmRzID0KKyAgICAgICAgIiAgICB2ZWM0IGJpdG1hcENvb3JkcyA9IHRleHR1cmVUcmFuc2Zvcm0gKiBwb3NpdGlvbjtcbiIKKyAgICAgICAgIiAgICBvdXRCaXRtYXBUZXhDb29yZHMgPSBiaXRtYXBDb29yZHMueHkgKiB0ZXh0dXJlRGltZW5zaW9uO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19NYWluX1Bvc2l0aW9uID0KKyAgICAgICAgIiAgICBnbF9Qb3NpdGlvbiA9IHRyYW5zZm9ybSAqIHBvc2l0aW9uO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19Gb290ZXIgPQorICAgICAgICAifVxuXG4iOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGcmFnbWVudCBzaGFkZXJzIHNuaXBwZXRzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NvbnN0IGNoYXIqIGdGU19IZWFkZXIgPQorICAgICAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbiI7Citjb25zdCBjaGFyKiBnRlNfVW5pZm9ybXNfQ29sb3IgPQorICAgICAgICAidW5pZm9ybSB2ZWM0IGNvbG9yO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19Vbmlmb3Jtc19UZXh0dXJlU2FtcGxlciA9CisgICAgICAgICJ1bmlmb3JtIHNhbXBsZXIyRCBzYW1wbGVyO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19Vbmlmb3Jtc19HcmFkaWVudFNhbXBsZXIgPQorICAgICAgICAidW5pZm9ybSBzYW1wbGVyMkQgZ3JhZGllbnRTYW1wbGVyO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19Vbmlmb3Jtc19CaXRtYXBTYW1wbGVyID0KKyAgICAgICAgInVuaWZvcm0gc2FtcGxlcjJEIGJpdG1hcFNhbXBsZXI7XG4iOworY29uc3QgY2hhciogZ0ZTX1VuaWZvcm1zX0NvbG9yT3BbNF0gPSB7CisgICAgICAgIC8vIE5vbmUKKyAgICAgICAgIiIsCisgICAgICAgIC8vIE1hdHJpeAorICAgICAgICAidW5pZm9ybSBtYXQ0IGNvbG9yTWF0cml4O1xuIgorICAgICAgICAidW5pZm9ybSB2ZWM0IGNvbG9yTWF0cml4VmVjdG9yO1xuIiwKKyAgICAgICAgLy8gTGlnaHRpbmcKKyAgICAgICAgInVuaWZvcm0gdmVjNCBsaWdodGluZ011bDtcbiIKKyAgICAgICAgInVuaWZvcm0gdmVjNCBsaWdodGluZ0FkZDtcbiIsCisgICAgICAgIC8vIFBvcnRlckR1ZmYKKyAgICAgICAgInVuaWZvcm0gdmVjNCBjb2xvckJsZW5kO1xuIgorfTsKK2NvbnN0IGNoYXIqIGdGU19NYWluID0KKyAgICAgICAgIlxudm9pZCBtYWluKHZvaWQpIHtcbiIKKyAgICAgICAgIiAgICBsb3dwIHZlYzQgZnJhZ0NvbG9yO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZldGNoQ29sb3IgPQorICAgICAgICAiICAgIGZyYWdDb2xvciA9IGNvbG9yO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZldGNoVGV4dHVyZSA9CisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gY29sb3IgKiB0ZXh0dXJlMkQoc2FtcGxlciwgb3V0VGV4Q29vcmRzKTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GZXRjaEE4VGV4dHVyZSA9CisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gY29sb3IgKiB0ZXh0dXJlMkQoc2FtcGxlciwgb3V0VGV4Q29vcmRzKS5hO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZldGNoR3JhZGllbnQgPQorICAgICAgICAiICAgIHZlYzQgZ3JhZGllbnRDb2xvciA9IHRleHR1cmUyRChncmFkaWVudFNhbXBsZXIsIHZlYzIoaW5kZXgsIDAuNSkpO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZldGNoQml0bWFwID0KKyAgICAgICAgIiAgICB2ZWM0IGJpdG1hcENvbG9yID0gdGV4dHVyZTJEKGJpdG1hcFNhbXBsZXIsIG91dEJpdG1hcFRleENvb3Jkcyk7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fRmV0Y2hCaXRtYXBOcG90ID0KKyAgICAgICAgIiAgICB2ZWM0IGJpdG1hcENvbG9yID0gdGV4dHVyZTJEKGJpdG1hcFNhbXBsZXIsIHdyYXAob3V0Qml0bWFwVGV4Q29vcmRzKSk7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fQmxlbmRTaGFkZXJzQkcgPQorICAgICAgICAiICAgIGZyYWdDb2xvciA9IGJsZW5kU2hhZGVycyhncmFkaWVudENvbG9yLCBiaXRtYXBDb2xvcikiOworY29uc3QgY2hhciogZ0ZTX01haW5fQmxlbmRTaGFkZXJzR0IgPQorICAgICAgICAiICAgIGZyYWdDb2xvciA9IGJsZW5kU2hhZGVycyhiaXRtYXBDb2xvciwgZ3JhZGllbnRDb2xvcikiOworY29uc3QgY2hhciogZ0ZTX01haW5fQmxlbmRTaGFkZXJzX01vZHVsYXRlID0KKyAgICAgICAgIiAqIGZyYWdDb2xvci5hO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0dyYWRpZW50U2hhZGVyX01vZHVsYXRlID0KKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBncmFkaWVudENvbG9yICogZnJhZ0NvbG9yLmE7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fQml0bWFwU2hhZGVyX01vZHVsYXRlID0KKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBiaXRtYXBDb2xvciAqIGZyYWdDb2xvci5hO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZyYWdDb2xvciA9CisgICAgICAgICIgICAgZ2xfRnJhZ0NvbG9yID0gZnJhZ0NvbG9yO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0FwcGx5Q29sb3JPcFs0XSA9IHsKKyAgICAgICAgLy8gTm9uZQorICAgICAgICAiIiwKKyAgICAgICAgLy8gTWF0cml4CisgICAgICAgIC8vIFRPRE86IEZpeCBwcmVtdWx0aXBsaWVkIGFscGhhIGNvbXB1dGF0aW9ucyBmb3IgY29sb3IgbWF0cml4CisgICAgICAgICIgICAgZnJhZ0NvbG9yICo9IGNvbG9yTWF0cml4O1xuIgorICAgICAgICAiICAgIGZyYWdDb2xvciArPSBjb2xvck1hdHJpeFZlY3RvcjtcbiIKKyAgICAgICAgIiAgICBmcmFnQ29sb3IucmdiICo9IGZyYWdDb2xvci5hO1xuIiwKKyAgICAgICAgLy8gTGlnaHRpbmcKKyAgICAgICAgIiAgICBmbG9hdCBsaWdodGluZ0FscGhhID0gZnJhZ0NvbG9yLmE7XG4iCisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gbWluKGZyYWdDb2xvciAqIGxpZ2h0aW5nTXVsICsgKGxpZ2h0aW5nQWRkICogbGlnaHRpbmdBbHBoYSksIGxpZ2h0aW5nQWxwaGEpO1xuIgorICAgICAgICAiICAgIGZyYWdDb2xvci5hID0gbGlnaHRpbmdBbHBoYTtcbiIsCisgICAgICAgIC8vIFBvcnRlckR1ZmYKKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBibGVuZENvbG9ycyhjb2xvckJsZW5kLCBmcmFnQ29sb3IpO1xuIgorfTsKK2NvbnN0IGNoYXIqIGdGU19Gb290ZXIgPQorICAgICAgICAifVxuXG4iOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQb3J0ZXJEdWZmIHNuaXBwZXRzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NvbnN0IGNoYXIqIGdCbGVuZE9wc1sxOF0gPSB7CisgICAgICAgIC8vIENsZWFyCisgICAgICAgICJyZXR1cm4gdmVjNCgwLjAsIDAuMCwgMC4wLCAwLjApO1xuIiwKKyAgICAgICAgLy8gU3JjCisgICAgICAgICJyZXR1cm4gc3JjO1xuIiwKKyAgICAgICAgLy8gRHN0CisgICAgICAgICJyZXR1cm4gZHN0O1xuIiwKKyAgICAgICAgLy8gU3JjT3ZlcgorICAgICAgICAicmV0dXJuIHNyYyArIGRzdCAqICgxLjAgLSBzcmMuYSk7XG4iLAorICAgICAgICAvLyBEc3RPdmVyCisgICAgICAgICJyZXR1cm4gZHN0ICsgc3JjICogKDEuMCAtIGRzdC5hKTtcbiIsCisgICAgICAgIC8vIFNyY0luCisgICAgICAgICJyZXR1cm4gc3JjICogZHN0LmE7XG4iLAorICAgICAgICAvLyBEc3RJbgorICAgICAgICAicmV0dXJuIGRzdCAqIHNyYy5hO1xuIiwKKyAgICAgICAgLy8gU3JjT3V0CisgICAgICAgICJyZXR1cm4gc3JjICogKDEuMCAtIGRzdC5hKTtcbiIsCisgICAgICAgIC8vIERzdE91dAorICAgICAgICAicmV0dXJuIGRzdCAqICgxLjAgLSBzcmMuYSk7XG4iLAorICAgICAgICAvLyBTcmNBdG9wCisgICAgICAgICJyZXR1cm4gdmVjNChzcmMucmdiICogZHN0LmEgKyAoMS4wIC0gc3JjLmEpICogZHN0LnJnYiwgZHN0LmEpO1xuIiwKKyAgICAgICAgLy8gRHN0QXRvcAorICAgICAgICAicmV0dXJuIHZlYzQoZHN0LnJnYiAqIHNyYy5hICsgKDEuMCAtIGRzdC5hKSAqIHNyYy5yZ2IsIHNyYy5hKTtcbiIsCisgICAgICAgIC8vIFhvcgorICAgICAgICAicmV0dXJuIHZlYzQoc3JjLnJnYiAqICgxLjAgLSBkc3QuYSkgKyAoMS4wIC0gc3JjLmEpICogZHN0LnJnYiwgIgorICAgICAgICAgICAgICAgICJzcmMuYSArIGRzdC5hIC0gMi4wICogc3JjLmEgKiBkc3QuYSk7XG4iLAorICAgICAgICAvLyBBZGQKKyAgICAgICAgInJldHVybiBtaW4oc3JjICsgZHN0LCAxLjApO1xuIiwKKyAgICAgICAgLy8gTXVsdGlwbHkKKyAgICAgICAgInJldHVybiBzcmMgKiBkc3Q7XG4iLAorICAgICAgICAvLyBTY3JlZW4KKyAgICAgICAgInJldHVybiBzcmMgKyBkc3QgLSBzcmMgKiBkc3Q7XG4iLAorICAgICAgICAvLyBPdmVybGF5CisgICAgICAgICJyZXR1cm4gY2xhbXAodmVjNChtaXgoIgorICAgICAgICAgICAgICAgICIyLjAgKiBzcmMucmdiICogZHN0LnJnYiArIHNyYy5yZ2IgKiAoMS4wIC0gZHN0LmEpICsgZHN0LnJnYiAqICgxLjAgLSBzcmMuYSksICIKKyAgICAgICAgICAgICAgICAic3JjLmEgKiBkc3QuYSAtIDIuMCAqIChkc3QuYSAtIGRzdC5yZ2IpICogKHNyYy5hIC0gc3JjLnJnYikgKyBzcmMucmdiICogKDEuMCAtIGRzdC5hKSArIGRzdC5yZ2IgKiAoMS4wIC0gc3JjLmEpLCAiCisgICAgICAgICAgICAgICAgInN0ZXAoZHN0LmEsIDIuMCAqIGRzdC5yZ2IpKSwgIgorICAgICAgICAgICAgICAgICJzcmMuYSArIGRzdC5hIC0gc3JjLmEgKiBkc3QuYSksIDAuMCwgMS4wKTtcbiIsCisgICAgICAgIC8vIERhcmtlbgorICAgICAgICAicmV0dXJuIHZlYzQoc3JjLnJnYiAqICgxLjAgLSBkc3QuYSkgKyAoMS4wIC0gc3JjLmEpICogZHN0LnJnYiArICIKKyAgICAgICAgICAgICAgICAibWluKHNyYy5yZ2IgKiBkc3QuYSwgZHN0LnJnYiAqIHNyYy5hKSwgc3JjLmEgKyBkc3QuYSAtIHNyYy5hICogZHN0LmEpO1xuIiwKKyAgICAgICAgLy8gTGlnaHRlbgorICAgICAgICAicmV0dXJuIHZlYzQoc3JjLnJnYiAqICgxLjAgLSBkc3QuYSkgKyAoMS4wIC0gc3JjLmEpICogZHN0LnJnYiArICIKKyAgICAgICAgICAgICAgICAibWF4KHNyYy5yZ2IgKiBkc3QuYSwgZHN0LnJnYiAqIHNyYy5hKSwgc3JjLmEgKyBkc3QuYSAtIHNyYy5hICogZHN0LmEpO1xuIiwKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQcm9ncmFtQ2FjaGU6OlByb2dyYW1DYWNoZSgpIHsKK30KKworUHJvZ3JhbUNhY2hlOjp+UHJvZ3JhbUNhY2hlKCkgeworICAgIGNsZWFyKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hlIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQcm9ncmFtQ2FjaGU6OmNsZWFyKCkgeworICAgIHNpemVfdCBjb3VudCA9IG1DYWNoZS5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGRlbGV0ZSBtQ2FjaGUudmFsdWVBdChpKTsKKyAgICB9CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK1Byb2dyYW0qIFByb2dyYW1DYWNoZTo6Z2V0KGNvbnN0IFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKKyAgICBwcm9ncmFtaWQga2V5ID0gZGVzY3JpcHRpb24ua2V5KCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7CisgICAgUHJvZ3JhbSogcHJvZ3JhbSA9IE5VTEw7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBQUk9HUkFNX0xPR0QoIkNvdWxkIG5vdCBmaW5kIHByb2dyYW0gd2l0aCBrZXkgMHgleCIsIGtleSk7CisgICAgICAgIHByb2dyYW0gPSBnZW5lcmF0ZVByb2dyYW0oZGVzY3JpcHRpb24sIGtleSk7CisgICAgICAgIG1DYWNoZS5hZGQoa2V5LCBwcm9ncmFtKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcm9ncmFtID0gbUNhY2hlLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gcHJvZ3JhbTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUHJvZ3JhbSBnZW5lcmF0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1Byb2dyYW0qIFByb2dyYW1DYWNoZTo6Z2VuZXJhdGVQcm9ncmFtKGNvbnN0IFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIHByb2dyYW1pZCBrZXkpIHsKKyAgICBTdHJpbmc4IHZlcnRleFNoYWRlciA9IGdlbmVyYXRlVmVydGV4U2hhZGVyKGRlc2NyaXB0aW9uKTsKKyAgICBTdHJpbmc4IGZyYWdtZW50U2hhZGVyID0gZ2VuZXJhdGVGcmFnbWVudFNoYWRlcihkZXNjcmlwdGlvbik7CisKKyAgICBQcm9ncmFtKiBwcm9ncmFtID0gbmV3IFByb2dyYW0odmVydGV4U2hhZGVyLnN0cmluZygpLCBmcmFnbWVudFNoYWRlci5zdHJpbmcoKSk7CisgICAgcmV0dXJuIHByb2dyYW07Cit9CisKK1N0cmluZzggUHJvZ3JhbUNhY2hlOjpnZW5lcmF0ZVZlcnRleFNoYWRlcihjb25zdCBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKSB7CisgICAgLy8gQWRkIGF0dHJpYnV0ZXMKKyAgICBTdHJpbmc4IHNoYWRlcihnVlNfSGVhZGVyX0F0dHJpYnV0ZXMpOworICAgIGlmIChkZXNjcmlwdGlvbi5oYXNUZXh0dXJlKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0hlYWRlcl9BdHRyaWJ1dGVzX1RleENvb3Jkcyk7CisgICAgfQorICAgIC8vIFVuaWZvcm1zCisgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1VuaWZvcm1zKTsKKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzR3JhZGllbnQpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1VuaWZvcm1zX0hhc0dyYWRpZW50KTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVW5pZm9ybXNfSGFzQml0bWFwKTsKKyAgICB9CisgICAgLy8gVmFyeWluZ3MKKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzVGV4dHVyZSkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzVGV4dHVyZSk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzR3JhZGllbnQpOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzQml0bWFwKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0hlYWRlcl9WYXJ5aW5nc19IYXNCaXRtYXApOworICAgIH0KKworICAgIC8vIEJlZ2luIHRoZSBzaGFkZXIKKyAgICBzaGFkZXIuYXBwZW5kKGdWU19NYWluKTsgeworICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzVGV4dHVyZSkgeworICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfTWFpbl9PdXRUZXhDb29yZHMpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCkgeworICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfTWFpbl9PdXRHcmFkaWVudEluZGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzQml0bWFwKSB7CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19NYWluX091dEJpdG1hcFRleENvb3Jkcyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gT3V0cHV0IHRyYW5zZm9ybWVkIHBvc2l0aW9uCisgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX01haW5fUG9zaXRpb24pOworICAgIH0KKyAgICAvLyBFbmQgdGhlIHNoYWRlcgorICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0Zvb3Rlcik7CisKKyAgICBQUk9HUkFNX0xPR0QoIioqKiBHZW5lcmF0ZWQgdmVydGV4IHNoYWRlcjpcblxuJXMiLCBzaGFkZXIuc3RyaW5nKCkpOworCisgICAgcmV0dXJuIHNoYWRlcjsKK30KKworU3RyaW5nOCBQcm9ncmFtQ2FjaGU6OmdlbmVyYXRlRnJhZ21lbnRTaGFkZXIoY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgeworICAgIC8vIFNldCB0aGUgZGVmYXVsdCBwcmVjaXNpb24KKyAgICBTdHJpbmc4IHNoYWRlcihnRlNfSGVhZGVyKTsKKworICAgIC8vIFZhcnlpbmdzCisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc1RleHR1cmUpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc1RleHR1cmUpOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzR3JhZGllbnQpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc0dyYWRpZW50KTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzQml0bWFwKTsKKyAgICB9CisKKworICAgIC8vIFVuaWZvcm1zCisgICAgc2hhZGVyLmFwcGVuZChnRlNfVW5pZm9ybXNfQ29sb3IpOworICAgIGlmIChkZXNjcmlwdGlvbi5oYXNUZXh0dXJlKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX1VuaWZvcm1zX1RleHR1cmVTYW1wbGVyKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50KSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX1VuaWZvcm1zX0dyYWRpZW50U2FtcGxlcik7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfVW5pZm9ybXNfQml0bWFwU2FtcGxlcik7CisgICAgfQorICAgIHNoYWRlci5hcHBlbmQoZ0ZTX1VuaWZvcm1zX0NvbG9yT3BbZGVzY3JpcHRpb24uY29sb3JPcF0pOworCisgICAgLy8gR2VuZXJhdGUgcmVxdWlyZWQgZnVuY3Rpb25zCisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50ICYmIGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICBnZW5lcmF0ZUJsZW5kKHNoYWRlciwgImJsZW5kU2hhZGVycyIsIGRlc2NyaXB0aW9uLnNoYWRlcnNNb2RlKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmNvbG9yT3AgPT0gUHJvZ3JhbURlc2NyaXB0aW9uOjprQ29sb3JCbGVuZCkgeworICAgICAgICBnZW5lcmF0ZUJsZW5kKHNoYWRlciwgImJsZW5kQ29sb3JzIiwgZGVzY3JpcHRpb24uY29sb3JNb2RlKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmlzQml0bWFwTnBvdCkgeworICAgICAgICBnZW5lcmF0ZVRleHR1cmVXcmFwKHNoYWRlciwgZGVzY3JpcHRpb24uYml0bWFwV3JhcFMsIGRlc2NyaXB0aW9uLmJpdG1hcFdyYXBUKTsKKyAgICB9CisKKyAgICAvLyBCZWdpbiB0aGUgc2hhZGVyCisgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbik7IHsKKyAgICAgICAgLy8gU3RvcmVzIHRoZSByZXN1bHQgaW4gZnJhZ0NvbG9yIGRpcmVjdGx5CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNUZXh0dXJlKSB7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzQWxwaGE4VGV4dHVyZSkgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fRmV0Y2hBOFRleHR1cmUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZldGNoVGV4dHVyZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZldGNoQ29sb3IpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCkgeworICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9GZXRjaEdyYWRpZW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzQml0bWFwKSB7CisgICAgICAgICAgICBpZiAoIWRlc2NyaXB0aW9uLmlzQml0bWFwTnBvdCkgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fRmV0Y2hCaXRtYXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZldGNoQml0bWFwTnBvdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2FzZSB3aGVuIHdlIGhhdmUgdHdvIHNoYWRlcnMgc2V0CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCAmJiBkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbi5pc0JpdG1hcEZpcnN0KSB7CisgICAgICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9CbGVuZFNoYWRlcnNCRyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fQmxlbmRTaGFkZXJzR0IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9CbGVuZFNoYWRlcnNfTW9kdWxhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50KSB7CisgICAgICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9HcmFkaWVudFNoYWRlcl9Nb2R1bGF0ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fQml0bWFwU2hhZGVyX01vZHVsYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBBcHBseSB0aGUgY29sb3Igb3AgaWYgbmVlZGVkCisgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fQXBwbHlDb2xvck9wW2Rlc2NyaXB0aW9uLmNvbG9yT3BdKTsKKyAgICAgICAgLy8gT3V0cHV0IHRoZSBmcmFnbWVudAorICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZyYWdDb2xvcik7CisgICAgfQorICAgIC8vIEVuZCB0aGUgc2hhZGVyCisgICAgc2hhZGVyLmFwcGVuZChnRlNfRm9vdGVyKTsKKworICAgIGlmIChERUJVR19QUk9HUkFNX0NBQ0hFKSB7CisgICAgICAgIFBST0dSQU1fTE9HRCgiKioqIEdlbmVyYXRlZCBmcmFnbWVudCBzaGFkZXI6XG5cbiIpOworICAgICAgICBwcmludExvbmdTdHJpbmcoc2hhZGVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2hhZGVyOworfQorCit2b2lkIFByb2dyYW1DYWNoZTo6Z2VuZXJhdGVCbGVuZChTdHJpbmc4JiBzaGFkZXIsIGNvbnN0IGNoYXIqIG5hbWUsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSkgeworICAgIHNoYWRlci5hcHBlbmQoIlxudmVjNCAiKTsKKyAgICBzaGFkZXIuYXBwZW5kKG5hbWUpOworICAgIHNoYWRlci5hcHBlbmQoIih2ZWM0IHNyYywgdmVjNCBkc3QpIHtcbiIpOworICAgIHNoYWRlci5hcHBlbmQoIiAgICAiKTsKKyAgICBzaGFkZXIuYXBwZW5kKGdCbGVuZE9wc1ttb2RlXSk7CisgICAgc2hhZGVyLmFwcGVuZCgifVxuIik7Cit9CisKK3ZvaWQgUHJvZ3JhbUNhY2hlOjpnZW5lcmF0ZVRleHR1cmVXcmFwKFN0cmluZzgmIHNoYWRlciwgR0xlbnVtIHdyYXBTLCBHTGVudW0gd3JhcFQpIHsKKyAgICBzaGFkZXIuYXBwZW5kKCJcbnZlYzIgd3JhcCh2ZWMyIHRleENvb3Jkcykge1xuIik7CisgICAgaWYgKHdyYXBTID09IEdMX01JUlJPUkVEX1JFUEVBVCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKCIgICAgZmxvYXQgeE1vZDIgPSBtb2QodGV4Q29vcmRzLngsIDIuMCk7XG4iKTsKKyAgICAgICAgc2hhZGVyLmFwcGVuZCgiICAgIGlmICh4TW9kMiA+IDEuMCkgeE1vZDIgPSAyLjAgLSB4TW9kMjtcbiIpOworICAgIH0KKyAgICBpZiAod3JhcFQgPT0gR0xfTUlSUk9SRURfUkVQRUFUKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoIiAgICBmbG9hdCB5TW9kMiA9IG1vZCh0ZXhDb29yZHMueSwgMi4wKTtcbiIpOworICAgICAgICBzaGFkZXIuYXBwZW5kKCIgICAgaWYgKHlNb2QyID4gMS4wKSB5TW9kMiA9IDIuMCAtIHlNb2QyO1xuIik7CisgICAgfQorICAgIHNoYWRlci5hcHBlbmQoIiAgICByZXR1cm4gdmVjMigiKTsKKyAgICBzd2l0Y2ggKHdyYXBTKSB7CisgICAgICAgIGNhc2UgR0xfQ0xBTVBfVE9fRURHRToKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoInRleENvb3Jkcy54Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9SRVBFQVQ6CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKCJtb2QodGV4Q29vcmRzLngsIDEuMCkiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX01JUlJPUkVEX1JFUEVBVDoKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoInhNb2QyIik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgc2hhZGVyLmFwcGVuZCgiLCAiKTsKKyAgICBzd2l0Y2ggKHdyYXBUKSB7CisgICAgICAgIGNhc2UgR0xfQ0xBTVBfVE9fRURHRToKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoInRleENvb3Jkcy55Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9SRVBFQVQ6CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKCJtb2QodGV4Q29vcmRzLnksIDEuMCkiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX01JUlJPUkVEX1JFUEVBVDoKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoInlNb2QyIik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgc2hhZGVyLmFwcGVuZCgiKTtcbiIpOworICAgIHNoYWRlci5hcHBlbmQoIn1cbiIpOworfQorCit2b2lkIFByb2dyYW1DYWNoZTo6cHJpbnRMb25nU3RyaW5nKGNvbnN0IFN0cmluZzgmIHNoYWRlcikgY29uc3QgeworICAgIHNzaXplX3QgaW5kZXggPSAwOworICAgIHNzaXplX3QgbGFzdEluZGV4ID0gMDsKKyAgICBjb25zdCBjaGFyKiBzdHIgPSBzaGFkZXIuc3RyaW5nKCk7CisgICAgd2hpbGUgKChpbmRleCA9IHNoYWRlci5maW5kKCJcbiIsIGluZGV4KSkgPiAtMSkgeworICAgICAgICBTdHJpbmc4IGxpbmUoc3RyLCBpbmRleCAtIGxhc3RJbmRleCk7CisgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID09IDApIGxpbmUuYXBwZW5kKCJcbiIpOworICAgICAgICBQUk9HUkFNX0xPR0QoIiVzIiwgbGluZS5zdHJpbmcoKSk7CisgICAgICAgIGluZGV4Kys7CisgICAgICAgIHN0ciArPSAoaW5kZXggLSBsYXN0SW5kZXgpOworICAgICAgICBsYXN0SW5kZXggPSBpbmRleDsKKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1Byb2dyYW1DYWNoZS5oIGIvbGlicy9od3VpL1Byb2dyYW1DYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMTFhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUHJvZ3JhbUNhY2hlLmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUFJPR1JBTV9DQUNIRV9ICisjZGVmaW5lIEFORFJPSURfVUlfUFJPR1JBTV9DQUNIRV9ICisKKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8U2tYZmVybW9kZS5oPgorCisjaW5jbHVkZSAiUHJvZ3JhbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlZmluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gRGVidWcKKyNkZWZpbmUgREVCVUdfUFJPR1JBTV9DQUNIRSAwCisKKy8vIERlYnVnCisjaWYgREVCVUdfUFJPR1JBTV9DQUNIRQorICAgICNkZWZpbmUgUFJPR1JBTV9MT0dEKC4uLikgTE9HRChfX1ZBX0FSR1NfXykKKyNlbHNlCisgICAgI2RlZmluZSBQUk9HUkFNX0xPR0QoLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgUFJPR1JBTV9LRVlfVEVYVFVSRSAweDEKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQThfVEVYVFVSRSAweDIKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQklUTUFQIDB4NAorI2RlZmluZSBQUk9HUkFNX0tFWV9HUkFESUVOVCAweDgKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQklUTUFQX0ZJUlNUIDB4MTAKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQ09MT1JfTUFUUklYIDB4MjAKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQ09MT1JfTElHSFRJTkcgMHg0MAorI2RlZmluZSBQUk9HUkFNX0tFWV9DT0xPUl9CTEVORCAweDgwCisjZGVmaW5lIFBST0dSQU1fS0VZX0JJVE1BUF9OUE9UIDB4MTAwCisKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQklUTUFQX1dSQVBTX01BU0sgMHg2MDAKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQklUTUFQX1dSQVBUX01BU0sgMHgxODAwCisKKy8vIEVuY29kZSB0aGUgeGZlcm1vZGVzIG9uIDYgYml0cworI2RlZmluZSBQUk9HUkFNX01BWF9YRkVSTU9ERSAweDFmCisjZGVmaW5lIFBST0dSQU1fWEZFUk1PREVfU0hBREVSX1NISUZUIDI2CisjZGVmaW5lIFBST0dSQU1fWEZFUk1PREVfQ09MT1JfT1BfU0hJRlQgMjAKKworI2RlZmluZSBQUk9HUkFNX0JJVE1BUF9XUkFQU19TSElGVCA5CisjZGVmaW5lIFBST0dSQU1fQklUTUFQX1dSQVBUX1NISUZUIDExCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFR5cGVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3R5cGVkZWYgdWludDMyX3QgcHJvZ3JhbWlkOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIERlc2NyaWJlIHRoZSBmZWF0dXJlcyByZXF1aXJlZCBmb3IgYSBnaXZlbiBwcm9ncmFtLiBUaGUgZmVhdHVyZXMKKyAqIGRldGVybWluZSB0aGUgZ2VuZXJhdGlvbiBvZiBib3RoIHRoZSB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlcnMuCisgKiBBIFByb2dyYW1EZXNjcmlwdGlvbiBtdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhIFByb2dyYW1DYWNoZS4KKyAqLworc3RydWN0IFByb2dyYW1EZXNjcmlwdGlvbiB7CisgICAgZW51bSBDb2xvck1vZGlmaWVyIHsKKyAgICAgICAga0NvbG9yTm9uZSwKKyAgICAgICAga0NvbG9yTWF0cml4LAorICAgICAgICBrQ29sb3JMaWdodGluZywKKyAgICAgICAga0NvbG9yQmxlbmQKKyAgICB9OworCisgICAgUHJvZ3JhbURlc2NyaXB0aW9uKCk6CisgICAgICAgIGhhc1RleHR1cmUoZmFsc2UpLCBoYXNBbHBoYThUZXh0dXJlKGZhbHNlKSwKKyAgICAgICAgaGFzQml0bWFwKGZhbHNlKSwgaXNCaXRtYXBOcG90KGZhbHNlKSwgaGFzR3JhZGllbnQoZmFsc2UpLAorICAgICAgICBzaGFkZXJzTW9kZShTa1hmZXJtb2RlOjprQ2xlYXJfTW9kZSksIGlzQml0bWFwRmlyc3QoZmFsc2UpLAorICAgICAgICBiaXRtYXBXcmFwUyhHTF9DTEFNUF9UT19FREdFKSwgYml0bWFwV3JhcFQoR0xfQ0xBTVBfVE9fRURHRSksCisgICAgICAgIGNvbG9yT3Aoa0NvbG9yTm9uZSksIGNvbG9yTW9kZShTa1hmZXJtb2RlOjprQ2xlYXJfTW9kZSkgeworICAgIH0KKworICAgIC8vIFRleHR1cmluZworICAgIGJvb2wgaGFzVGV4dHVyZTsKKyAgICBib29sIGhhc0FscGhhOFRleHR1cmU7CisKKyAgICAvLyBTaGFkZXJzCisgICAgYm9vbCBoYXNCaXRtYXA7CisgICAgYm9vbCBpc0JpdG1hcE5wb3Q7CisgICAgYm9vbCBoYXNHcmFkaWVudDsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIHNoYWRlcnNNb2RlOworICAgIGJvb2wgaXNCaXRtYXBGaXJzdDsKKyAgICBHTGVudW0gYml0bWFwV3JhcFM7CisgICAgR0xlbnVtIGJpdG1hcFdyYXBUOworCisgICAgLy8gQ29sb3Igb3BlcmF0aW9ucworICAgIGludCBjb2xvck9wOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgY29sb3JNb2RlOworCisgICAgaW5saW5lIHVpbnQzMl90IGdldEVudW1Gb3JXcmFwKEdMZW51bSB3cmFwKSBjb25zdCB7CisgICAgICAgIHN3aXRjaCAod3JhcCkgeworICAgICAgICAgICAgY2FzZSBHTF9DTEFNUF9UT19FREdFOgorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgY2FzZSBHTF9SRVBFQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBjYXNlIEdMX01JUlJPUkVEX1JFUEVBVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwcm9ncmFtaWQga2V5KCkgY29uc3QgeworICAgICAgICBwcm9ncmFtaWQga2V5ID0gMDsKKyAgICAgICAgaWYgKGhhc1RleHR1cmUpIGtleSB8PSBQUk9HUkFNX0tFWV9URVhUVVJFOworICAgICAgICBpZiAoaGFzQWxwaGE4VGV4dHVyZSkga2V5IHw9IFBST0dSQU1fS0VZX0E4X1RFWFRVUkU7CisgICAgICAgIGlmIChoYXNCaXRtYXApIHsKKyAgICAgICAgICAgIGtleSB8PSBQUk9HUkFNX0tFWV9CSVRNQVA7CisgICAgICAgICAgICBpZiAoaXNCaXRtYXBOcG90KSB7CisgICAgICAgICAgICAgICAga2V5IHw9IFBST0dSQU1fS0VZX0JJVE1BUF9OUE9UOworICAgICAgICAgICAgICAgIGtleSB8PSBnZXRFbnVtRm9yV3JhcChiaXRtYXBXcmFwUykgPDwgUFJPR1JBTV9CSVRNQVBfV1JBUFNfU0hJRlQ7CisgICAgICAgICAgICAgICAga2V5IHw9IGdldEVudW1Gb3JXcmFwKGJpdG1hcFdyYXBUKSA8PCBQUk9HUkFNX0JJVE1BUF9XUkFQVF9TSElGVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaGFzR3JhZGllbnQpIGtleSB8PSBQUk9HUkFNX0tFWV9HUkFESUVOVDsKKyAgICAgICAgaWYgKGlzQml0bWFwRmlyc3QpIGtleSAgfD0gUFJPR1JBTV9LRVlfQklUTUFQX0ZJUlNUOworICAgICAgICBpZiAoaGFzQml0bWFwICYmIGhhc0dyYWRpZW50KSB7CisgICAgICAgICAgICBrZXkgfD0gKHNoYWRlcnNNb2RlICYgUFJPR1JBTV9NQVhfWEZFUk1PREUpIDw8IFBST0dSQU1fWEZFUk1PREVfU0hBREVSX1NISUZUOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29sb3JPcCkgeworICAgICAgICAgICAgY2FzZSBrQ29sb3JNYXRyaXg6CisgICAgICAgICAgICAgICAga2V5IHw9IFBST0dSQU1fS0VZX0NPTE9SX01BVFJJWDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga0NvbG9yTGlnaHRpbmc6CisgICAgICAgICAgICAgICAga2V5IHw9IFBST0dSQU1fS0VZX0NPTE9SX0xJR0hUSU5HOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrQ29sb3JCbGVuZDoKKyAgICAgICAgICAgICAgICBrZXkgfD0gUFJPR1JBTV9LRVlfQ09MT1JfQkxFTkQ7CisgICAgICAgICAgICAgICAga2V5IHw9IChjb2xvck1vZGUgJiBQUk9HUkFNX01BWF9YRkVSTU9ERSkgPDwgUFJPR1JBTV9YRkVSTU9ERV9DT0xPUl9PUF9TSElGVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga0NvbG9yTm9uZToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4ga2V5OworICAgIH0KK307IC8vIHN0cnVjdCBQcm9ncmFtRGVzY3JpcHRpb24KKworLyoqCisgKiBHZW5lcmF0ZXMgYW5kIGNhY2hlcyBwcm9ncmFtLiBQcm9ncmFtcyBhcmUgZ2VuZXJhdGVkIGJhc2VkIG9uCisgKiBQcm9ncmFtRGVzY3JpcHRpb25zLgorICovCitjbGFzcyBQcm9ncmFtQ2FjaGUgeworcHVibGljOgorICAgIFByb2dyYW1DYWNoZSgpOworICAgIH5Qcm9ncmFtQ2FjaGUoKTsKKworICAgIFByb2dyYW0qIGdldChjb25zdCBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKKworICAgIHZvaWQgY2xlYXIoKTsKKworcHJpdmF0ZToKKyAgICBQcm9ncmFtKiBnZW5lcmF0ZVByb2dyYW0oY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgcHJvZ3JhbWlkIGtleSk7CisgICAgU3RyaW5nOCBnZW5lcmF0ZVZlcnRleFNoYWRlcihjb25zdCBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKKyAgICBTdHJpbmc4IGdlbmVyYXRlRnJhZ21lbnRTaGFkZXIoY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisgICAgdm9pZCBnZW5lcmF0ZUJsZW5kKFN0cmluZzgmIHNoYWRlciwgY29uc3QgY2hhciogbmFtZSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlKTsKKyAgICB2b2lkIGdlbmVyYXRlVGV4dHVyZVdyYXAoU3RyaW5nOCYgc2hhZGVyLCBHTGVudW0gd3JhcFMsIEdMZW51bSB3cmFwVCk7CisKKyAgICB2b2lkIHByaW50TG9uZ1N0cmluZyhjb25zdCBTdHJpbmc4JiBzaGFkZXIpIGNvbnN0OworCisgICAgS2V5ZWRWZWN0b3I8cHJvZ3JhbWlkLCBQcm9ncmFtKj4gbUNhY2hlOworfTsgLy8gY2xhc3MgUHJvZ3JhbUNhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9QUk9HUkFNX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9wZXJ0aWVzLmggYi9saWJzL2h3dWkvUHJvcGVydGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMmYwOTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUHJvcGVydGllcy5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUFJPUEVSVElFU19ICisjZGVmaW5lIEFORFJPSURfVUlfUFJPUEVSVElFU19ICisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisvKioKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbGlzdCBvZiBzeXN0ZW0gcHJvcGVydGllcyB1c2VkIHRvIGNvbmZpZ3VyZQorICogdGhlIE9wZW5HTFJlbmRlcmVyLgorICovCisKKy8vIFRoZXNlIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgaW4gbWVnYS1ieXRlcworI2RlZmluZSBQUk9QRVJUWV9URVhUVVJFX0NBQ0hFX1NJWkUgInJvLmh3dWkudGV4dHVyZV9jYWNoZV9zaXplIgorI2RlZmluZSBQUk9QRVJUWV9MQVlFUl9DQUNIRV9TSVpFICJyby5od3VpLmxheWVyX2NhY2hlX3NpemUiCisjZGVmaW5lIFBST1BFUlRZX0dSQURJRU5UX0NBQ0hFX1NJWkUgInJvLmh3dWkuZ3JhZGllbnRfY2FjaGVfc2l6ZSIKKyNkZWZpbmUgUFJPUEVSVFlfUEFUSF9DQUNIRV9TSVpFICJyby5od3VpLnBhdGhfY2FjaGVfc2l6ZSIKKyNkZWZpbmUgUFJPUEVSVFlfRFJPUF9TSEFET1dfQ0FDSEVfU0laRSAicm8uaHd1aS5kcm9wX3NoYWRvd19jYWNoZV9zaXplIgorCisvLyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIGluIHBpeGVscworI2RlZmluZSBQUk9QRVJUWV9URVhUX0NBQ0hFX1dJRFRIICJyby5od3VpLnRleHRfY2FjaGVfd2lkdGgiCisjZGVmaW5lIFBST1BFUlRZX1RFWFRfQ0FDSEVfSEVJR0hUICJyby5od3VpLnRleHRfY2FjaGVfaGVpZ2h0IgorCisvLyBHYW1tYSAoPj0gMS4wLCA8PSAxMC4wKQorI2RlZmluZSBQUk9QRVJUWV9URVhUX0dBTU1BICJyby50ZXh0X2dhbW1hIgorI2RlZmluZSBQUk9QRVJUWV9URVhUX0JMQUNLX0dBTU1BX1RIUkVTSE9MRCAicm8udGV4dF9nYW1tYS5ibGFja190aHJlc2hvbGQiCisjZGVmaW5lIFBST1BFUlRZX1RFWFRfV0hJVEVfR0FNTUFfVEhSRVNIT0xEICJyby50ZXh0X2dhbW1hLndoaXRlX3RocmVzaG9sZCIKKworLy8gQ29udmVydHMgYSBudW1iZXIgb2YgbWVnYS1ieXRlcyBpbnRvIGJ5dGVzCisjZGVmaW5lIE1CKHMpIHMgKiAxMDI0ICogMTAyNAorCisjZGVmaW5lIERFRkFVTFRfVEVYVFVSRV9DQUNIRV9TSVpFIDIwLjBmCisjZGVmaW5lIERFRkFVTFRfTEFZRVJfQ0FDSEVfU0laRSA2LjBmCisjZGVmaW5lIERFRkFVTFRfUEFUSF9DQUNIRV9TSVpFIDYuMGYKKyNkZWZpbmUgREVGQVVMVF9QQVRDSF9DQUNIRV9TSVpFIDEwMAorI2RlZmluZSBERUZBVUxUX0dSQURJRU5UX0NBQ0hFX1NJWkUgMC41ZgorI2RlZmluZSBERUZBVUxUX0RST1BfU0hBRE9XX0NBQ0hFX1NJWkUgMi4wZgorCisjZGVmaW5lIERFRkFVTFRfVEVYVF9HQU1NQSAxLjRmCisjZGVmaW5lIERFRkFVTFRfVEVYVF9CTEFDS19HQU1NQV9USFJFU0hPTEQgNjQKKyNkZWZpbmUgREVGQVVMVF9URVhUX1dISVRFX0dBTU1BX1RIUkVTSE9MRCAxOTIKKworI2VuZGlmIC8vIEFORFJPSURfVUlfUFJPUEVSVElFU19ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUmVjdC5oIGIvbGlicy9od3VpL1JlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmUwYzM0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9SZWN0LmgKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUkVDVF9ICisjZGVmaW5lIEFORFJPSURfVUlfUkVDVF9ICisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTdHJ1Y3RzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0cnVjdCBSZWN0IHsKKyAgICBmbG9hdCBsZWZ0OworICAgIGZsb2F0IHRvcDsKKyAgICBmbG9hdCByaWdodDsKKyAgICBmbG9hdCBib3R0b207CisKKyAgICBSZWN0KCk6CisgICAgICAgICAgICBsZWZ0KDApLAorICAgICAgICAgICAgdG9wKDApLAorICAgICAgICAgICAgcmlnaHQoMCksCisgICAgICAgICAgICBib3R0b20oMCkgeworICAgIH0KKworICAgIFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKToKKyAgICAgICAgICAgIGxlZnQobGVmdCksCisgICAgICAgICAgICB0b3AodG9wKSwKKyAgICAgICAgICAgIHJpZ2h0KHJpZ2h0KSwKKyAgICAgICAgICAgIGJvdHRvbShib3R0b20pIHsKKyAgICB9CisKKyAgICBSZWN0KGNvbnN0IFJlY3QmIHIpIHsKKyAgICAgICAgc2V0KHIpOworICAgIH0KKworICAgIFJlY3QoUmVjdCYgcikgeworICAgICAgICBzZXQocik7CisgICAgfQorCisgICAgUmVjdCYgb3BlcmF0b3I9KGNvbnN0IFJlY3QmIHIpIHsKKyAgICAgICAgc2V0KHIpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVjdCYgb3BlcmF0b3I9KFJlY3QmIHIpIHsKKyAgICAgICAgc2V0KHIpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgZnJpZW5kIGludCBvcGVyYXRvcj09KGNvbnN0IFJlY3QmIGEsIGNvbnN0IFJlY3QmIGIpIHsKKyAgICAgICAgcmV0dXJuICFtZW1jbXAoJmEsICZiLCBzaXplb2YoYSkpOworICAgIH0KKworICAgIGZyaWVuZCBpbnQgb3BlcmF0b3IhPShjb25zdCBSZWN0JiBhLCBjb25zdCBSZWN0JiBiKSB7CisgICAgICAgIHJldHVybiBtZW1jbXAoJmEsICZiLCBzaXplb2YoYSkpOworICAgIH0KKworICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxlZnQgPj0gcmlnaHQgfHwgdG9wID49IGJvdHRvbTsKKyAgICB9CisKKyAgICB2b2lkIHNldEVtcHR5KCkgeworICAgICAgICBtZW1zZXQodGhpcywgMCwgc2l6ZW9mKCp0aGlzKSk7CisgICAgfQorCisgICAgdm9pZCBzZXQoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKSB7CisgICAgICAgIHRoaXMtPmxlZnQgPSBsZWZ0OworICAgICAgICB0aGlzLT5yaWdodCA9IHJpZ2h0OworICAgICAgICB0aGlzLT50b3AgPSB0b3A7CisgICAgICAgIHRoaXMtPmJvdHRvbSA9IGJvdHRvbTsKKyAgICB9CisKKyAgICB2b2lkIHNldChjb25zdCBSZWN0JiByKSB7CisgICAgICAgIHNldChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSk7CisgICAgfQorCisgICAgZmxvYXQgZ2V0V2lkdGgoKSBjb25zdCB7CisgICAgICAgIHJldHVybiByaWdodCAtIGxlZnQ7CisgICAgfQorCisgICAgZmxvYXQgZ2V0SGVpZ2h0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gYm90dG9tIC0gdG9wOworICAgIH0KKworICAgIGJvb2wgaW50ZXJzZWN0cyhmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxlZnQgPCByaWdodCAmJiB0b3AgPCBib3R0b20gJiYKKyAgICAgICAgICAgICAgICB0aGlzLT5sZWZ0IDwgdGhpcy0+cmlnaHQgJiYgdGhpcy0+dG9wIDwgdGhpcy0+Ym90dG9tICYmCisgICAgICAgICAgICAgICAgdGhpcy0+bGVmdCA8IHJpZ2h0ICYmIGxlZnQgPCB0aGlzLT5yaWdodCAmJgorICAgICAgICAgICAgICAgIHRoaXMtPnRvcCA8IGJvdHRvbSAmJiB0b3AgPCB0aGlzLT5ib3R0b207CisgICAgfQorCisgICAgYm9vbCBpbnRlcnNlY3RzKGNvbnN0IFJlY3QmIHIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGludGVyc2VjdHMoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20pOworICAgIH0KKworICAgIGJvb2wgaW50ZXJzZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSkgeworICAgICAgICBpZiAobGVmdCA8IHJpZ2h0ICYmIHRvcCA8IGJvdHRvbSAmJiAhdGhpcy0+aXNFbXB0eSgpICYmCisgICAgICAgICAgICAgICAgdGhpcy0+bGVmdCA8IHJpZ2h0ICYmIGxlZnQgPCB0aGlzLT5yaWdodCAmJgorICAgICAgICAgICAgICAgIHRoaXMtPnRvcCA8IGJvdHRvbSAmJiB0b3AgPCB0aGlzLT5ib3R0b20pIHsKKworICAgICAgICAgICAgaWYgKHRoaXMtPmxlZnQgPCBsZWZ0KSB0aGlzLT5sZWZ0ID0gbGVmdDsKKyAgICAgICAgICAgIGlmICh0aGlzLT50b3AgPCB0b3ApIHRoaXMtPnRvcCA9IHRvcDsKKyAgICAgICAgICAgIGlmICh0aGlzLT5yaWdodCA+IHJpZ2h0KSB0aGlzLT5yaWdodCA9IHJpZ2h0OworICAgICAgICAgICAgaWYgKHRoaXMtPmJvdHRvbSA+IGJvdHRvbSkgdGhpcy0+Ym90dG9tID0gYm90dG9tOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBpbnRlcnNlY3QoY29uc3QgUmVjdCYgcikgeworICAgICAgICByZXR1cm4gaW50ZXJzZWN0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tKTsKKyAgICB9CisKKyAgICBib29sIHVuaW9uV2l0aChjb25zdCBSZWN0JiByKSB7CisgICAgICAgIGlmIChyLmxlZnQgPCByLnJpZ2h0ICYmIHIudG9wIDwgci5ib3R0b20pIHsKKyAgICAgICAgICAgIGlmIChsZWZ0IDwgcmlnaHQgJiYgdG9wIDwgYm90dG9tKSB7CisgICAgICAgICAgICAgICAgaWYgKGxlZnQgPiByLmxlZnQpIGxlZnQgPSByLmxlZnQ7CisgICAgICAgICAgICAgICAgaWYgKHRvcCA+IHIudG9wKSB0b3AgPSByLnRvcDsKKyAgICAgICAgICAgICAgICBpZiAocmlnaHQgPCByLnJpZ2h0KSByaWdodCA9IHIucmlnaHQ7CisgICAgICAgICAgICAgICAgaWYgKGJvdHRvbSA8IHIuYm90dG9tKSBib3R0b20gPSByLmJvdHRvbTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGVmdCA9IHIubGVmdDsKKyAgICAgICAgICAgICAgICB0b3AgPSByLnRvcDsKKyAgICAgICAgICAgICAgICByaWdodCA9IHIucmlnaHQ7CisgICAgICAgICAgICAgICAgYm90dG9tID0gci5ib3R0b207CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQgZHVtcCgpIGNvbnN0IHsKKyAgICAgICAgTE9HRCgiUmVjdFtsPSVmIHQ9JWYgcj0lZiBiPSVmXSIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgfQorCit9OyAvLyBzdHJ1Y3QgUmVjdAorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfUkVDVF9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvU2tpYUNvbG9yRmlsdGVyLmNwcCBiL2xpYnMvaHd1aS9Ta2lhQ29sb3JGaWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNTdhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvU2tpYUNvbG9yRmlsdGVyLmNwcApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJTa2lhQ29sb3JGaWx0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCYXNlIGNvbG9yIGZpbHRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTa2lhQ29sb3JGaWx0ZXI6OlNraWFDb2xvckZpbHRlcihUeXBlIHR5cGUsIGJvb2wgYmxlbmQpOiBtVHlwZSh0eXBlKSwgbUJsZW5kKGJsZW5kKSB7Cit9CisKK1NraWFDb2xvckZpbHRlcjo6flNraWFDb2xvckZpbHRlcigpIHsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29sb3IgbWF0cml4IGZpbHRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTa2lhQ29sb3JNYXRyaXhGaWx0ZXI6OlNraWFDb2xvck1hdHJpeEZpbHRlcihmbG9hdCogbWF0cml4LCBmbG9hdCogdmVjdG9yKToKKyAgICAgICAgU2tpYUNvbG9yRmlsdGVyKGtDb2xvck1hdHJpeCwgdHJ1ZSksIG1NYXRyaXgobWF0cml4KSwgbVZlY3Rvcih2ZWN0b3IpIHsKK30KKworU2tpYUNvbG9yTWF0cml4RmlsdGVyOjp+U2tpYUNvbG9yTWF0cml4RmlsdGVyKCkgeworICAgIGRlbGV0ZVtdIG1NYXRyaXg7CisgICAgZGVsZXRlW10gbVZlY3RvcjsKK30KKwordm9pZCBTa2lhQ29sb3JNYXRyaXhGaWx0ZXI6OmRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sCisgICAgICAgIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpIHsKKyAgICBkZXNjcmlwdGlvbi5jb2xvck9wID0gUHJvZ3JhbURlc2NyaXB0aW9uOjprQ29sb3JNYXRyaXg7Cit9CisKK3ZvaWQgU2tpYUNvbG9yTWF0cml4RmlsdGVyOjpzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSkgeworICAgIGdsVW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLT5nZXRVbmlmb3JtKCJjb2xvck1hdHJpeCIpLCAxLCBHTF9GQUxTRSwgJm1NYXRyaXhbMF0pOworICAgIGdsVW5pZm9ybTRmdihwcm9ncmFtLT5nZXRVbmlmb3JtKCJjb2xvck1hdHJpeFZlY3RvciIpLCAxLCBtVmVjdG9yKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTGlnaHRpbmcgY29sb3IgZmlsdGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFMaWdodGluZ0ZpbHRlcjo6U2tpYUxpZ2h0aW5nRmlsdGVyKGludCBtdWx0aXBseSwgaW50IGFkZCk6CisgICAgICAgIFNraWFDb2xvckZpbHRlcihrTGlnaHRpbmcsIHRydWUpIHsKKyAgICBtTXVsUiA9ICgobXVsdGlwbHkgPj4gMTYpICYgMHhGRikgLyAyNTUuMGY7CisgICAgbU11bEcgPSAoKG11bHRpcGx5ID4+ICA4KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIG1NdWxCID0gKChtdWx0aXBseSAgICAgICkgJiAweEZGKSAvIDI1NS4wZjsKKworICAgIG1BZGRSID0gKChhZGQgPj4gMTYpICYgMHhGRikgLyAyNTUuMGY7CisgICAgbUFkZEcgPSAoKGFkZCA+PiAgOCkgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBtQWRkQiA9ICgoYWRkICAgICAgKSAmIDB4RkYpIC8gMjU1LjBmOworfQorCit2b2lkIFNraWFMaWdodGluZ0ZpbHRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworICAgIGRlc2NyaXB0aW9uLmNvbG9yT3AgPSBQcm9ncmFtRGVzY3JpcHRpb246OmtDb2xvckxpZ2h0aW5nOworfQorCit2b2lkIFNraWFMaWdodGluZ0ZpbHRlcjo6c2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pIHsKKyAgICBnbFVuaWZvcm00Zihwcm9ncmFtLT5nZXRVbmlmb3JtKCJsaWdodGluZ011bCIpLCBtTXVsUiwgbU11bEcsIG1NdWxCLCAxLjBmKTsKKyAgICBnbFVuaWZvcm00Zihwcm9ncmFtLT5nZXRVbmlmb3JtKCJsaWdodGluZ0FkZCIpLCBtQWRkUiwgbUFkZEcsIG1BZGRCLCAwLjBmKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQmxlbmQgY29sb3IgZmlsdGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFCbGVuZEZpbHRlcjo6U2tpYUJsZW5kRmlsdGVyKGludCBjb2xvciwgU2tYZmVybW9kZTo6TW9kZSBtb2RlKToKKyAgICAgICAgU2tpYUNvbG9yRmlsdGVyKGtCbGVuZCwgdHJ1ZSksIG1Nb2RlKG1vZGUpIHsKKyAgICBjb25zdCBpbnQgYWxwaGEgPSAoY29sb3IgPj4gMjQpICYgMHhGRjsKKyAgICBtQSA9IGFscGhhIC8gMjU1LjBmOworICAgIG1SID0gbUEgKiAoKGNvbG9yID4+IDE2KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIG1HID0gbUEgKiAoKGNvbG9yID4+ICA4KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIG1CID0gbUEgKiAoKGNvbG9yICAgICAgKSAmIDB4RkYpIC8gMjU1LjBmOworfQorCit2b2lkIFNraWFCbGVuZEZpbHRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworICAgIGRlc2NyaXB0aW9uLmNvbG9yT3AgPSBQcm9ncmFtRGVzY3JpcHRpb246OmtDb2xvckJsZW5kOworICAgIGRlc2NyaXB0aW9uLmNvbG9yTW9kZSA9IG1Nb2RlOworfQorCit2b2lkIFNraWFCbGVuZEZpbHRlcjo6c2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pIHsKKyAgICBnbFVuaWZvcm00Zihwcm9ncmFtLT5nZXRVbmlmb3JtKCJjb2xvckJsZW5kIiksIG1SLCBtRywgbUIsIG1BKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvU2tpYUNvbG9yRmlsdGVyLmggYi9saWJzL2h3dWkvU2tpYUNvbG9yRmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY1YjZmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Ta2lhQ29sb3JGaWx0ZXIuaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9TS0lBX0NPTE9SX0ZJTFRFUl9ICisjZGVmaW5lIEFORFJPSURfVUlfU0tJQV9DT0xPUl9GSUxURVJfSAorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlICJQcm9ncmFtQ2FjaGUuaCIKKyNpbmNsdWRlICJFeHRlbnNpb25zLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQmFzZSBjb2xvciBmaWx0ZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBSZXByZXNlbnRzIGEgU2tpYSBjb2xvciBmaWx0ZXIuIEEgY29sb3IgZmlsdGVyIG1vZGlmaWVzIGEgUHJvZ3JhbURlc2NyaXB0aW9uCisgKiBhbmQgc2V0cyB1bmlmb3JtcyBvbiB0aGUgcmVzdWx0aW5nIHNoYWRlcnMuCisgKi8KK3N0cnVjdCBTa2lhQ29sb3JGaWx0ZXIgeworICAgIC8qKgorICAgICAqIFR5cGUgb2YgU2tpYSBjb2xvciBmaWx0ZXIgaW4gdXNlLgorICAgICAqLworICAgIGVudW0gVHlwZSB7CisgICAgICAgIGtOb25lLAorICAgICAgICBrQ29sb3JNYXRyaXgsCisgICAgICAgIGtMaWdodGluZywKKyAgICAgICAga0JsZW5kLAorICAgIH07CisKKyAgICBTa2lhQ29sb3JGaWx0ZXIoVHlwZSB0eXBlLCBib29sIGJsZW5kKTsKKyAgICB2aXJ0dWFsIH5Ta2lhQ29sb3JGaWx0ZXIoKTsKKworICAgIHZpcnR1YWwgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKSA9IDA7CisKKyAgICBpbmxpbmUgYm9vbCBibGVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CbGVuZDsKKyAgICB9CisKKyAgICBUeXBlIHR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHlwZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBUeXBlIG1UeXBlOworICAgIGJvb2wgbUJsZW5kOworfTsgLy8gc3RydWN0IFNraWFDb2xvckZpbHRlcgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJbXBsZW1lbnRhdGlvbnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBBIGNvbG9yIGZpbHRlciB0aGF0IG11bHRpcGxpZXMgdGhlIHNvdXJjZSBjb2xvciB3aXRoIGEgbWF0cml4IGFuZCBhZGRzIGEgdmVjdG9yLgorICovCitzdHJ1Y3QgU2tpYUNvbG9yTWF0cml4RmlsdGVyOiBwdWJsaWMgU2tpYUNvbG9yRmlsdGVyIHsKKyAgICBTa2lhQ29sb3JNYXRyaXhGaWx0ZXIoZmxvYXQqIG1hdHJpeCwgZmxvYXQqIHZlY3Rvcik7CisgICAgflNraWFDb2xvck1hdHJpeEZpbHRlcigpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKTsKKworcHJpdmF0ZToKKyAgICBmbG9hdCogbU1hdHJpeDsKKyAgICBmbG9hdCogbVZlY3RvcjsKK307IC8vIHN0cnVjdCBTa2lhQ29sb3JNYXRyaXhGaWx0ZXIKKworLyoqCisgKiBBIGNvbG9yIGZpbHRlcnMgdGhhdCBtdWx0aXBsaWVzIHRoZSBzb3VyY2UgY29sb3Igd2l0aCBhIGZpeGVkIHZhbHVlIGFuZCBhZGRzCisgKiBhbm90aGVyIGZpeGVkIHZhbHVlLiBJZ25vcmVzIHRoZSBhbHBoYSBjaGFubmVsIG9mIGJvdGggYXJndW1lbnRzLgorICovCitzdHJ1Y3QgU2tpYUxpZ2h0aW5nRmlsdGVyOiBwdWJsaWMgU2tpYUNvbG9yRmlsdGVyIHsKKyAgICBTa2lhTGlnaHRpbmdGaWx0ZXIoaW50IG11bHRpcGx5LCBpbnQgYWRkKTsKKworICAgIHZvaWQgZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucyk7CisgICAgdm9pZCBzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSk7CisKK3ByaXZhdGU6CisgICAgR0xmbG9hdCBtTXVsUiwgbU11bEcsIG1NdWxCOworICAgIEdMZmxvYXQgbUFkZFIsIG1BZGRHLCBtQWRkQjsKK307IC8vIHN0cnVjdCBTa2lhTGlnaHRpbmdGaWx0ZXIKKworLyoqCisgKiBBIGNvbG9yIGZpbHRlcnMgdGhhdCBibGVuZHMgdGhlIHNvdXJjZSBjb2xvciB3aXRoIGEgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIGNvbG9yCisgKiBhbmQgUG9ydGVyRHVmZiBibGVuZGluZyBtb2RlLgorICovCitzdHJ1Y3QgU2tpYUJsZW5kRmlsdGVyOiBwdWJsaWMgU2tpYUNvbG9yRmlsdGVyIHsKKyAgICBTa2lhQmxlbmRGaWx0ZXIoaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKTsKKworcHJpdmF0ZToKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1Nb2RlOworICAgIEdMZmxvYXQgbVIsIG1HLCBtQiwgbUE7Cit9OyAvLyBzdHJ1Y3QgU2tpYUJsZW5kRmlsdGVyCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9TS0lBX0NPTE9SX0ZJTFRFUl9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvU2tpYVNoYWRlci5jcHAgYi9saWJzL2h3dWkvU2tpYVNoYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhMDFiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Ta2lhU2hhZGVyLmNwcApAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPFNrTWF0cml4Lmg+CisKKyNpbmNsdWRlICJTa2lhU2hhZGVyLmgiCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorI2luY2x1ZGUgIk1hdHJpeC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFN1cHBvcnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGNvbnN0IEdMZW51bSBnVGV4dHVyZVVuaXRzTWFwW10gPSB7CisgICAgICAgIEdMX1RFWFRVUkUwLAorICAgICAgICBHTF9URVhUVVJFMSwKKyAgICAgICAgR0xfVEVYVFVSRTIKK307CisKK3N0YXRpYyBjb25zdCBHTGludCBnVGlsZU1vZGVzW10gPSB7CisgICAgICAgIEdMX0NMQU1QX1RPX0VER0UsICAgLy8gPT0gU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZQorICAgICAgICBHTF9SRVBFQVQsICAgICAgICAgIC8vID09IFNrU2hhZGVyOjprUmVwZWF0X01vZGUKKyAgICAgICAgR0xfTUlSUk9SRURfUkVQRUFUICAvLyA9PSBTa1NoYWRlcjo6a01pcnJvcl9UaWxlTW9kZQorfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQmFzZSBzaGFkZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2tpYVNoYWRlcjo6U2tpYVNoYWRlcihUeXBlIHR5cGUsIFNrU2hhZGVyKiBrZXksIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlWCwKKyAgICAgICAgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVZLCBTa01hdHJpeCogbWF0cml4LCBib29sIGJsZW5kKToKKyAgICAgICAgbVR5cGUodHlwZSksIG1LZXkoa2V5KSwgbVRpbGVYKHRpbGVYKSwgbVRpbGVZKHRpbGVZKSwgbU1hdHJpeChtYXRyaXgpLCBtQmxlbmQoYmxlbmQpIHsKK30KKworU2tpYVNoYWRlcjo6flNraWFTaGFkZXIoKSB7Cit9CisKK3ZvaWQgU2tpYVNoYWRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworfQorCit2b2lkIFNraWFTaGFkZXI6OnNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwKKyAgICAgICAgR0x1aW50KiB0ZXh0dXJlVW5pdCkgeworfQorCit2b2lkIFNraWFTaGFkZXI6OmJpbmRUZXh0dXJlKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gd3JhcFMsIEdMZW51bSB3cmFwVCwgR0x1aW50IHRleHR1cmVVbml0KSB7CisgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNNYXBbdGV4dHVyZVVuaXRdKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgd3JhcFMpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgd3JhcFQpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCaXRtYXAgc2hhZGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFCaXRtYXBTaGFkZXI6OlNraWFCaXRtYXBTaGFkZXIoU2tCaXRtYXAqIGJpdG1hcCwgU2tTaGFkZXIqIGtleSwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVYLAorICAgICAgICBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVksIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOgorICAgICAgICBTa2lhU2hhZGVyKGtCaXRtYXAsIGtleSwgdGlsZVgsIHRpbGVZLCBtYXRyaXgsIGJsZW5kKSwgbUJpdG1hcChiaXRtYXApLCBtVGV4dHVyZShOVUxMKSB7Cit9CisKK3ZvaWQgU2tpYUJpdG1hcFNoYWRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUgPSBtVGV4dHVyZUNhY2hlLT5nZXQobUJpdG1hcCk7CisgICAgaWYgKCF0ZXh0dXJlKSByZXR1cm47CisgICAgbVRleHR1cmUgPSB0ZXh0dXJlOworCisgICAgY29uc3QgZmxvYXQgd2lkdGggPSB0ZXh0dXJlLT53aWR0aDsKKyAgICBjb25zdCBmbG9hdCBoZWlnaHQgPSB0ZXh0dXJlLT5oZWlnaHQ7CisKKyAgICBkZXNjcmlwdGlvbi5oYXNCaXRtYXAgPSB0cnVlOworICAgIC8vIFRoZSBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBub24tcG93ZXIgb2YgdHdvIG1pcnJvcmVkL3JlcGVhdGVkCisgICAgLy8gdGV4dHVyZXMsIHNvIGRvIGl0IG91cnNlbHZlcworICAgIGlmICghZXh0ZW5zaW9ucy5oYXNOUG90KCkgJiYgKCFpc1Bvd2VyT2ZUd28od2lkdGgpIHx8ICFpc1Bvd2VyT2ZUd28oaGVpZ2h0KSkgJiYKKyAgICAgICAgICAgIChtVGlsZVggIT0gU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZSB8fCBtVGlsZVkgIT0gU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZSkpIHsKKyAgICAgICAgZGVzY3JpcHRpb24uaXNCaXRtYXBOcG90ID0gdHJ1ZTsKKyAgICAgICAgZGVzY3JpcHRpb24uYml0bWFwV3JhcFMgPSBnVGlsZU1vZGVzW21UaWxlWF07CisgICAgICAgIGRlc2NyaXB0aW9uLmJpdG1hcFdyYXBUID0gZ1RpbGVNb2Rlc1ttVGlsZVldOworICAgIH0KK30KKwordm9pZCBTa2lhQml0bWFwU2hhZGVyOjpzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LAorICAgICAgICBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsIEdMdWludCogdGV4dHVyZVVuaXQpIHsKKyAgICBHTHVpbnQgdGV4dHVyZVNsb3QgPSAoKnRleHR1cmVVbml0KSsrOworICAgIGdsQWN0aXZlVGV4dHVyZShnVGV4dHVyZVVuaXRzTWFwW3RleHR1cmVTbG90XSk7CisKKyAgICBjb25zdCBUZXh0dXJlKiB0ZXh0dXJlID0gbVRleHR1cmU7CisgICAgbVRleHR1cmUgPSBOVUxMOworICAgIGlmICghdGV4dHVyZSkgcmV0dXJuOworICAgIGNvbnN0IEF1dG9UZXh0dXJlIGF1dG9DbGVhbnVwKHRleHR1cmUpOworCisgICAgY29uc3QgZmxvYXQgd2lkdGggPSB0ZXh0dXJlLT53aWR0aDsKKyAgICBjb25zdCBmbG9hdCBoZWlnaHQgPSB0ZXh0dXJlLT5oZWlnaHQ7CisKKyAgICBtYXQ0IHRleHR1cmVUcmFuc2Zvcm07CisgICAgaWYgKG1NYXRyaXgpIHsKKyAgICAgICAgU2tNYXRyaXggaW52ZXJzZTsKKyAgICAgICAgbU1hdHJpeC0+aW52ZXJ0KCZpbnZlcnNlKTsKKyAgICAgICAgdGV4dHVyZVRyYW5zZm9ybS5sb2FkKGludmVyc2UpOworICAgICAgICB0ZXh0dXJlVHJhbnNmb3JtLm11bHRpcGx5KG1vZGVsVmlldyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGV4dHVyZVRyYW5zZm9ybS5sb2FkKG1vZGVsVmlldyk7CisgICAgfQorCisgICAgLy8gVW5pZm9ybXMKKyAgICBiaW5kVGV4dHVyZSh0ZXh0dXJlLT5pZCwgZ1RpbGVNb2Rlc1ttVGlsZVhdLCBnVGlsZU1vZGVzW21UaWxlWV0sIHRleHR1cmVTbG90KTsKKyAgICBnbFVuaWZvcm0xaShwcm9ncmFtLT5nZXRVbmlmb3JtKCJiaXRtYXBTYW1wbGVyIiksIHRleHR1cmVTbG90KTsKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgidGV4dHVyZVRyYW5zZm9ybSIpLCAxLAorICAgICAgICAgICAgR0xfRkFMU0UsICZ0ZXh0dXJlVHJhbnNmb3JtLmRhdGFbMF0pOworICAgIGdsVW5pZm9ybTJmKHByb2dyYW0tPmdldFVuaWZvcm0oInRleHR1cmVEaW1lbnNpb24iKSwgMS4wZiAvIHdpZHRoLCAxLjBmIC8gaGVpZ2h0KTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTGluZWFyIGdyYWRpZW50IHNoYWRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTa2lhTGluZWFyR3JhZGllbnRTaGFkZXI6OlNraWFMaW5lYXJHcmFkaWVudFNoYWRlcihmbG9hdCogYm91bmRzLCB1aW50MzJfdCogY29sb3JzLAorICAgICAgICBmbG9hdCogcG9zaXRpb25zLCBpbnQgY291bnQsIFNrU2hhZGVyKiBrZXksIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlTW9kZSwKKyAgICAgICAgU2tNYXRyaXgqIG1hdHJpeCwgYm9vbCBibGVuZCk6CisgICAgICAgIFNraWFTaGFkZXIoa0xpbmVhckdyYWRpZW50LCBrZXksIHRpbGVNb2RlLCB0aWxlTW9kZSwgbWF0cml4LCBibGVuZCksCisgICAgICAgIG1Cb3VuZHMoYm91bmRzKSwgbUNvbG9ycyhjb2xvcnMpLCBtUG9zaXRpb25zKHBvc2l0aW9ucyksIG1Db3VudChjb3VudCkgeworfQorCitTa2lhTGluZWFyR3JhZGllbnRTaGFkZXI6On5Ta2lhTGluZWFyR3JhZGllbnRTaGFkZXIoKSB7CisgICAgZGVsZXRlW10gbUJvdW5kczsKKyAgICBkZWxldGVbXSBtQ29sb3JzOworICAgIGRlbGV0ZVtdIG1Qb3NpdGlvbnM7Cit9CisKK3ZvaWQgU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyOjpkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLAorICAgICAgICBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKSB7CisgICAgZGVzY3JpcHRpb24uaGFzR3JhZGllbnQgPSB0cnVlOworfQorCit2b2lkIFNraWFMaW5lYXJHcmFkaWVudFNoYWRlcjo6c2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywKKyAgICAgICAgY29uc3QgU25hcHNob3QmIHNuYXBzaG90LCBHTHVpbnQqIHRleHR1cmVVbml0KSB7CisgICAgR0x1aW50IHRleHR1cmVTbG90ID0gKCp0ZXh0dXJlVW5pdCkrKzsKKyAgICBnbEFjdGl2ZVRleHR1cmUoZ1RleHR1cmVVbml0c01hcFt0ZXh0dXJlU2xvdF0pOworCisgICAgVGV4dHVyZSogdGV4dHVyZSA9IG1HcmFkaWVudENhY2hlLT5nZXQobUtleSk7CisgICAgaWYgKCF0ZXh0dXJlKSB7CisgICAgICAgIHRleHR1cmUgPSBtR3JhZGllbnRDYWNoZS0+YWRkTGluZWFyR3JhZGllbnQobUtleSwgbUJvdW5kcywgbUNvbG9ycywgbVBvc2l0aW9ucywKKyAgICAgICAgICAgICAgICBtQ291bnQsIG1UaWxlWCk7CisgICAgfQorCisgICAgUmVjdCBzdGFydChtQm91bmRzWzBdLCBtQm91bmRzWzFdLCBtQm91bmRzWzJdLCBtQm91bmRzWzNdKTsKKyAgICBpZiAobU1hdHJpeCkgeworICAgICAgICBtYXQ0IHNoYWRlck1hdHJpeCgqbU1hdHJpeCk7CisgICAgICAgIHNoYWRlck1hdHJpeC5tYXBQb2ludChzdGFydC5sZWZ0LCBzdGFydC50b3ApOworICAgICAgICBzaGFkZXJNYXRyaXgubWFwUG9pbnQoc3RhcnQucmlnaHQsIHN0YXJ0LmJvdHRvbSk7CisgICAgfQorICAgIHNuYXBzaG90LnRyYW5zZm9ybS5tYXBSZWN0KHN0YXJ0KTsKKworICAgIGNvbnN0IGZsb2F0IGdyYWRpZW50WCA9IHN0YXJ0LnJpZ2h0IC0gc3RhcnQubGVmdDsKKyAgICBjb25zdCBmbG9hdCBncmFkaWVudFkgPSBzdGFydC5ib3R0b20gLSBzdGFydC50b3A7CisKKyAgICBtYXQ0IHNjcmVlblNwYWNlKHNuYXBzaG90LnRyYW5zZm9ybSk7CisgICAgc2NyZWVuU3BhY2UubXVsdGlwbHkobW9kZWxWaWV3KTsKKworICAgIC8vIFVuaWZvcm1zCisgICAgYmluZFRleHR1cmUodGV4dHVyZS0+aWQsIGdUaWxlTW9kZXNbbVRpbGVYXSwgZ1RpbGVNb2Rlc1ttVGlsZVldLCB0ZXh0dXJlU2xvdCk7CisgICAgZ2xVbmlmb3JtMWkocHJvZ3JhbS0+Z2V0VW5pZm9ybSgiZ3JhZGllbnRTYW1wbGVyIiksIHRleHR1cmVTbG90KTsKKyAgICBnbFVuaWZvcm0yZihwcm9ncmFtLT5nZXRVbmlmb3JtKCJncmFkaWVudFN0YXJ0IiksIHN0YXJ0LmxlZnQsIHN0YXJ0LnRvcCk7CisgICAgZ2xVbmlmb3JtMmYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgiZ3JhZGllbnQiKSwgZ3JhZGllbnRYLCBncmFkaWVudFkpOworICAgIGdsVW5pZm9ybTFmKHByb2dyYW0tPmdldFVuaWZvcm0oImdyYWRpZW50TGVuZ3RoIiksCisgICAgICAgICAgICAxLjBmIC8gKGdyYWRpZW50WCAqIGdyYWRpZW50WCArIGdyYWRpZW50WSAqIGdyYWRpZW50WSkpOworICAgIGdsVW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLT5nZXRVbmlmb3JtKCJzY3JlZW5TcGFjZSIpLCAxLCBHTF9GQUxTRSwgJnNjcmVlblNwYWNlLmRhdGFbMF0pOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb21wb3NlIHNoYWRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTa2lhQ29tcG9zZVNoYWRlcjo6U2tpYUNvbXBvc2VTaGFkZXIoU2tpYVNoYWRlciogZmlyc3QsIFNraWFTaGFkZXIqIHNlY29uZCwKKyAgICAgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBTa1NoYWRlcioga2V5KToKKyAgICAgICAgU2tpYVNoYWRlcihrQ29tcG9zZSwga2V5LCBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlLCBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlLAorICAgICAgICBOVUxMLCBmaXJzdC0+YmxlbmQoKSB8fCBzZWNvbmQtPmJsZW5kKCkpLCBtRmlyc3QoZmlyc3QpLCBtU2Vjb25kKHNlY29uZCksIG1Nb2RlKG1vZGUpIHsKK30KKwordm9pZCBTa2lhQ29tcG9zZVNoYWRlcjo6c2V0KFRleHR1cmVDYWNoZSogdGV4dHVyZUNhY2hlLCBHcmFkaWVudENhY2hlKiBncmFkaWVudENhY2hlKSB7CisgICAgU2tpYVNoYWRlcjo6c2V0KHRleHR1cmVDYWNoZSwgZ3JhZGllbnRDYWNoZSk7CisgICAgbUZpcnN0LT5zZXQodGV4dHVyZUNhY2hlLCBncmFkaWVudENhY2hlKTsKKyAgICBtU2Vjb25kLT5zZXQodGV4dHVyZUNhY2hlLCBncmFkaWVudENhY2hlKTsKK30KKwordm9pZCBTa2lhQ29tcG9zZVNoYWRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworICAgIG1GaXJzdC0+ZGVzY3JpYmUoZGVzY3JpcHRpb24sIGV4dGVuc2lvbnMpOworICAgIG1TZWNvbmQtPmRlc2NyaWJlKGRlc2NyaXB0aW9uLCBleHRlbnNpb25zKTsKKyAgICBpZiAobUZpcnN0LT50eXBlKCkgPT0ga0JpdG1hcCkgeworICAgICAgICBkZXNjcmlwdGlvbi5pc0JpdG1hcEZpcnN0ID0gdHJ1ZTsKKyAgICB9CisgICAgZGVzY3JpcHRpb24uc2hhZGVyc01vZGUgPSBtTW9kZTsKK30KKwordm9pZCBTa2lhQ29tcG9zZVNoYWRlcjo6c2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywKKyAgICAgICAgY29uc3QgU25hcHNob3QmIHNuYXBzaG90LCBHTHVpbnQqIHRleHR1cmVVbml0KSB7CisgICAgbUZpcnN0LT5zZXR1cFByb2dyYW0ocHJvZ3JhbSwgbW9kZWxWaWV3LCBzbmFwc2hvdCwgdGV4dHVyZVVuaXQpOworICAgIG1TZWNvbmQtPnNldHVwUHJvZ3JhbShwcm9ncmFtLCBtb2RlbFZpZXcsIHNuYXBzaG90LCB0ZXh0dXJlVW5pdCk7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1NraWFTaGFkZXIuaCBiL2xpYnMvaHd1aS9Ta2lhU2hhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1ZTNiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Ta2lhU2hhZGVyLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfU0tJQV9TSEFERVJfSAorI2RlZmluZSBBTkRST0lEX1VJX1NLSUFfU0hBREVSX0gKKworI2luY2x1ZGUgPFNrU2hhZGVyLmg+CisjaW5jbHVkZSA8U2tYZmVybW9kZS5oPgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlICJFeHRlbnNpb25zLmgiCisjaW5jbHVkZSAiUHJvZ3JhbUNhY2hlLmgiCisjaW5jbHVkZSAiVGV4dHVyZUNhY2hlLmgiCisjaW5jbHVkZSAiR3JhZGllbnRDYWNoZS5oIgorI2luY2x1ZGUgIlNuYXBzaG90LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQmFzZSBzaGFkZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBSZXByZXNlbnRzIGEgU2tpYSBzaGFkZXIuIEEgc2hhZGVyIHdpbGwgbW9kaWZ5IHRoZSBHTCBjb250ZXh0IGFuZCBhY3RpdmUKKyAqIHByb2dyYW0gdG8gcmVjcmVhdGUgdGhlIG9yaWdpbmFsIGVmZmVjdC4KKyAqLworc3RydWN0IFNraWFTaGFkZXIgeworICAgIC8qKgorICAgICAqIFR5cGUgb2YgU2tpYSBzaGFkZXIgaW4gdXNlLgorICAgICAqLworICAgIGVudW0gVHlwZSB7CisgICAgICAgIGtOb25lLAorICAgICAgICBrQml0bWFwLAorICAgICAgICBrTGluZWFyR3JhZGllbnQsCisgICAgICAgIGtDaXJjdWxhckdyYWRpZW50LAorICAgICAgICBrU3dlZXBHcmFkaWVudCwKKyAgICAgICAga0NvbXBvc2UKKyAgICB9OworCisgICAgU2tpYVNoYWRlcihUeXBlIHR5cGUsIFNrU2hhZGVyKiBrZXksIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlWCwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVZLAorICAgICAgICAgICAgU2tNYXRyaXgqIG1hdHJpeCwgYm9vbCBibGVuZCk7CisgICAgdmlydHVhbCB+U2tpYVNoYWRlcigpOworCisgICAgdmlydHVhbCB2b2lkIGRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpOworICAgIHZpcnR1YWwgdm9pZCBzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LCBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsCisgICAgICAgICAgICBHTHVpbnQqIHRleHR1cmVVbml0KTsKKworICAgIGlubGluZSBib29sIGJsZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJsZW5kOworICAgIH0KKworICAgIFR5cGUgdHlwZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UeXBlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBzZXQoVGV4dHVyZUNhY2hlKiB0ZXh0dXJlQ2FjaGUsIEdyYWRpZW50Q2FjaGUqIGdyYWRpZW50Q2FjaGUpIHsKKyAgICAgICAgbVRleHR1cmVDYWNoZSA9IHRleHR1cmVDYWNoZTsKKyAgICAgICAgbUdyYWRpZW50Q2FjaGUgPSBncmFkaWVudENhY2hlOworICAgIH0KKworICAgIHZvaWQgc2V0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICAgICAgbU1hdHJpeCA9IG1hdHJpeDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBpbmxpbmUgdm9pZCBiaW5kVGV4dHVyZShHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHdyYXBTLCBHTGVudW0gd3JhcFQsIEdMdWludCB0ZXh0dXJlVW5pdCk7CisKKyAgICBUeXBlIG1UeXBlOworICAgIFNrU2hhZGVyKiBtS2V5OworICAgIFNrU2hhZGVyOjpUaWxlTW9kZSBtVGlsZVg7CisgICAgU2tTaGFkZXI6OlRpbGVNb2RlIG1UaWxlWTsKKyAgICBTa01hdHJpeCogbU1hdHJpeDsKKyAgICBib29sIG1CbGVuZDsKKworICAgIFRleHR1cmVDYWNoZSogbVRleHR1cmVDYWNoZTsKKyAgICBHcmFkaWVudENhY2hlKiBtR3JhZGllbnRDYWNoZTsKK307IC8vIHN0cnVjdCBTa2lhU2hhZGVyCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSW1wbGVtZW50YXRpb25zCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogQSBzaGFkZXIgdGhhdCBkcmF3cyBhIGJpdG1hcC4KKyAqLworc3RydWN0IFNraWFCaXRtYXBTaGFkZXI6IHB1YmxpYyBTa2lhU2hhZGVyIHsKKyAgICBTa2lhQml0bWFwU2hhZGVyKFNrQml0bWFwKiBiaXRtYXAsIFNrU2hhZGVyKiBrZXksIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlWCwKKyAgICAgICAgICAgIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlWSwgU2tNYXRyaXgqIG1hdHJpeCwgYm9vbCBibGVuZCk7CisKKyAgICB2b2lkIGRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpOworICAgIHZvaWQgc2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywgY29uc3QgU25hcHNob3QmIHNuYXBzaG90LAorICAgICAgICAgICAgR0x1aW50KiB0ZXh0dXJlVW5pdCk7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBmb3IgbiA9PSAwLgorICAgICAqLworICAgIGlubGluZSBib29sIGlzUG93ZXJPZlR3byh1bnNpZ25lZCBpbnQgbikgeworICAgICAgICByZXR1cm4gIShuICYgKG4gLSAxKSk7CisgICAgfQorCisgICAgU2tCaXRtYXAqIG1CaXRtYXA7CisgICAgY29uc3QgVGV4dHVyZSogbVRleHR1cmU7Cit9OyAvLyBzdHJ1Y3QgU2tpYUJpdG1hcFNoYWRlcgorCisvKioKKyAqIEEgc2hhZGVyIHRoYXQgZHJhd3MgYSBsaW5lYXIgZ3JhZGllbnQuCisgKi8KK3N0cnVjdCBTa2lhTGluZWFyR3JhZGllbnRTaGFkZXI6IHB1YmxpYyBTa2lhU2hhZGVyIHsKKyAgICBTa2lhTGluZWFyR3JhZGllbnRTaGFkZXIoZmxvYXQqIGJvdW5kcywgdWludDMyX3QqIGNvbG9ycywgZmxvYXQqIHBvc2l0aW9ucywgaW50IGNvdW50LAorICAgICAgICAgICAgU2tTaGFkZXIqIGtleSwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVNb2RlLCBTa01hdHJpeCogbWF0cml4LCBib29sIGJsZW5kKTsKKyAgICB+U2tpYUxpbmVhckdyYWRpZW50U2hhZGVyKCk7CisKKyAgICB2b2lkIGRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpOworICAgIHZvaWQgc2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywgY29uc3QgU25hcHNob3QmIHNuYXBzaG90LAorICAgICAgICAgICAgR0x1aW50KiB0ZXh0dXJlVW5pdCk7CisKK3ByaXZhdGU6CisgICAgZmxvYXQqIG1Cb3VuZHM7CisgICAgdWludDMyX3QqIG1Db2xvcnM7CisgICAgZmxvYXQqIG1Qb3NpdGlvbnM7CisgICAgaW50IG1Db3VudDsKK307IC8vIHN0cnVjdCBTa2lhTGluZWFyR3JhZGllbnRTaGFkZXIKKworLyoqCisgKiBBIHNoYWRlciB0aGF0IGRyYXdzIHR3byBzaGFkZXJzLCBjb21wb3NpdGVkIHdpdGggYW4geGZlcm1vZGUuCisgKi8KK3N0cnVjdCBTa2lhQ29tcG9zZVNoYWRlcjogcHVibGljIFNraWFTaGFkZXIgeworICAgIFNraWFDb21wb3NlU2hhZGVyKFNraWFTaGFkZXIqIGZpcnN0LCBTa2lhU2hhZGVyKiBzZWNvbmQsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgU2tTaGFkZXIqIGtleSk7CisKKyAgICB2b2lkIHNldChUZXh0dXJlQ2FjaGUqIHRleHR1cmVDYWNoZSwgR3JhZGllbnRDYWNoZSogZ3JhZGllbnRDYWNoZSk7CisKKyAgICB2b2lkIGRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpOworICAgIHZvaWQgc2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywgY29uc3QgU25hcHNob3QmIHNuYXBzaG90LAorICAgICAgICAgICAgR0x1aW50KiB0ZXh0dXJlVW5pdCk7CisKK3ByaXZhdGU6CisgICAgU2tpYVNoYWRlciogbUZpcnN0OworICAgIFNraWFTaGFkZXIqIG1TZWNvbmQ7CisgICAgU2tYZmVybW9kZTo6TW9kZSBtTW9kZTsKK307IC8vIHN0cnVjdCBTa2lhQ29tcG9zZVNoYWRlcgorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfU0tJQV9TSEFERVJfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1NuYXBzaG90LmggYi9saWJzL2h3dWkvU25hcHNob3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2U3Y2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1NuYXBzaG90LmgKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfU05BUFNIT1RfSAorI2RlZmluZSBBTkRST0lEX1VJX1NOQVBTSE9UX0gKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8U2tSZWdpb24uaD4KKworI2luY2x1ZGUgIkxheWVyLmgiCisjaW5jbHVkZSAiTWF0cml4LmgiCisjaW5jbHVkZSAiUmVjdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogQSBzbmFwc2hvdCBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcmVuZGVyaW5nCisgKiBzdXJmYWNlLiBBIHNuYXBzaG90IGlzIHVzdWFsbHkgY3JlYXRlZCB3aGVuZXZlciB0aGUgdXNlciBjYWxscyBzYXZlKCkKKyAqIGFuZCBkaXNjYXJkZWQgd2hlbiB0aGUgdXNlciBjYWxscyByZXN0b3JlKCkuIE9uY2UgYSBzbmFwc2hvdCBpcyBjcmVhdGVkLAorICogaXQgY2FuIGhvbGQgaW5mb3JtYXRpb24gZm9yIGRlZmVycmVkIHJlbmRlcmluZy4KKyAqCisgKiBFYWNoIHNuYXBzaG90IGhhcyBhIGxpbmsgdG8gYSBwcmV2aW91cyBzbmFwc2hvdCwgaW5kaWNhdGluZyB0aGUgcHJldmlvdXMKKyAqIHN0YXRlIG9mIHRoZSByZW5kZXJlci4KKyAqLworY2xhc3MgU25hcHNob3Q6IHB1YmxpYyBMaWdodFJlZkJhc2U8U25hcHNob3Q+IHsKK3B1YmxpYzoKKyAgICBTbmFwc2hvdCgpOiBpbnZpc2libGUoZmFsc2UpLCBmbGFncygwKSwgcHJldmlvdXMoTlVMTCksIGxheWVyKE5VTEwpLCBmYm8oMCkgeyB9CisKKyAgICAvKioKKyAgICAgKiBDb3BpZXMgdGhlIHNwZWNpZmllZCBzbmFwc2hvdC4gT25seSB0aGUgdHJhbnNmb3JtIGFuZCBjbGlwIHJlY3RhbmdsZQorICAgICAqIGFyZSBjb3BpZWQuIFRoZSBsYXllciBpbmZvcm1hdGlvbiBpcyBzZXQgdG8gMCBhbmQgdGhlIHRyYW5zZm9ybSBpcworICAgICAqIGFzc3VtZWQgdG8gYmUgZGlydHkuIFRoZSBzcGVjaWZpZWQgc25hcHNob3QgaXMgc3RvcmVkIGFzIHRoZSBwcmV2aW91cworICAgICAqIHNuYXBzaG90LgorICAgICAqLworICAgIFNuYXBzaG90KGNvbnN0IHNwPFNuYXBzaG90PiYgcyk6CisgICAgICAgICAgICBoZWlnaHQocy0+aGVpZ2h0KSwKKyAgICAgICAgICAgIHRyYW5zZm9ybShzLT50cmFuc2Zvcm0pLAorICAgICAgICAgICAgY2xpcFJlY3Qocy0+Y2xpcFJlY3QpLAorICAgICAgICAgICAgaW52aXNpYmxlKHMtPmludmlzaWJsZSksCisgICAgICAgICAgICBmbGFncygwKSwKKyAgICAgICAgICAgIHByZXZpb3VzKHMpLAorICAgICAgICAgICAgbGF5ZXIoTlVMTCksCisgICAgICAgICAgICBmYm8ocy0+ZmJvKSwKKyAgICAgICAgICAgIHZpZXdwb3J0KHMtPnZpZXdwb3J0KSB7CisgICAgICAgIGlmICgocy0+ZmxhZ3MgJiBTbmFwc2hvdDo6a0ZsYWdDbGlwU2V0KSAmJgorICAgICAgICAgICAgICAgICEocy0+ZmxhZ3MgJiBTbmFwc2hvdDo6a0ZsYWdEaXJ0eUxvY2FsQ2xpcCkpIHsKKyAgICAgICAgICAgIGxvY2FsQ2xpcC5zZXQocy0+bG9jYWxDbGlwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IFNuYXBzaG90OjprRmxhZ0RpcnR5TG9jYWxDbGlwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFyaW91cyBmbGFncyBzZXQgb24gI2ZsYWdzLgorICAgICAqLworICAgIGVudW0gRmxhZ3MgeworICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGNsaXAgcmVnaW9uIHdhcyBtb2RpZmllZC4gV2hlbiB0aGlzCisgICAgICAgICAqIHNuYXBzaG90IGlzIHJlc3RvcmVkIHNvIG11c3QgdGhlIGNsaXAuCisgICAgICAgICAqLworICAgICAgICBrRmxhZ0NsaXBTZXQgPSAweDEsCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGlzIHNuYXBzaG90IHdhcyBjcmVhdGVkIHdoZW4gc2F2aW5nCisgICAgICAgICAqIGEgbmV3IGxheWVyLgorICAgICAgICAgKi8KKyAgICAgICAga0ZsYWdJc0xheWVyID0gMHgyLAorICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGVzIHRoYXQgdGhpcyBzbmFwc2hvdCBoYXMgY2hhbmdlZCB0aGUgb3J0aG8gbWF0cml4LgorICAgICAgICAgKi8KKyAgICAgICAga0ZsYWdEaXJ0eU9ydGhvID0gMHg0LAorICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGxvY2FsIGNsaXAgc2hvdWxkIGJlIHJlY29tcHV0ZWQuCisgICAgICAgICAqLworICAgICAgICBrRmxhZ0RpcnR5TG9jYWxDbGlwID0gMHg4LAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBJbnRlcnNlY3RzIHRoZSBjdXJyZW50IGNsaXAgd2l0aCB0aGUgbmV3IGNsaXAgcmVjdGFuZ2xlLgorICAgICAqLworICAgIGJvb2wgY2xpcChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIFNrUmVnaW9uOjpPcCBvcCkgeworICAgICAgICBib29sIGNsaXBwZWQgPSBmYWxzZTsKKworICAgICAgICBSZWN0IHIobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICAgICAgdHJhbnNmb3JtLm1hcFJlY3Qocik7CisKKyAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBTa1JlZ2lvbjo6a0RpZmZlcmVuY2VfT3A6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNrUmVnaW9uOjprSW50ZXJzZWN0X09wOgorICAgICAgICAgICAgICAgIGNsaXBwZWQgPSBjbGlwUmVjdC5pbnRlcnNlY3Qocik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNrUmVnaW9uOjprVW5pb25fT3A6CisgICAgICAgICAgICAgICAgY2xpcHBlZCA9IGNsaXBSZWN0LnVuaW9uV2l0aChyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tSZWdpb246OmtYT1JfT3A6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNrUmVnaW9uOjprUmV2ZXJzZURpZmZlcmVuY2VfT3A6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNrUmVnaW9uOjprUmVwbGFjZV9PcDoKKyAgICAgICAgICAgICAgICBjbGlwUmVjdC5zZXQocik7CisgICAgICAgICAgICAgICAgY2xpcHBlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xpcHBlZCkgeworICAgICAgICAgICAgZmxhZ3MgfD0gU25hcHNob3Q6OmtGbGFnQ2xpcFNldCB8IFNuYXBzaG90OjprRmxhZ0RpcnR5TG9jYWxDbGlwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNsaXBwZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY3VycmVudCBjbGlwLgorICAgICAqLworICAgIHZvaWQgc2V0Q2xpcChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIHsKKyAgICAgICAgY2xpcFJlY3Quc2V0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgICAgIGZsYWdzIHw9IFNuYXBzaG90OjprRmxhZ0NsaXBTZXQgfCBTbmFwc2hvdDo6a0ZsYWdEaXJ0eUxvY2FsQ2xpcDsKKyAgICB9CisKKyAgICBjb25zdCBSZWN0JiBnZXRMb2NhbENsaXAoKSB7CisgICAgICAgIGlmIChmbGFncyAmIFNuYXBzaG90OjprRmxhZ0RpcnR5TG9jYWxDbGlwKSB7CisgICAgICAgICAgICBtYXQ0IGludmVyc2U7CisgICAgICAgICAgICBpbnZlcnNlLmxvYWRJbnZlcnNlKHRyYW5zZm9ybSk7CisKKyAgICAgICAgICAgIGxvY2FsQ2xpcC5zZXQoY2xpcFJlY3QpOworICAgICAgICAgICAgaW52ZXJzZS5tYXBSZWN0KGxvY2FsQ2xpcCk7CisKKyAgICAgICAgICAgIGZsYWdzICY9IH5TbmFwc2hvdDo6a0ZsYWdEaXJ0eUxvY2FsQ2xpcDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbG9jYWxDbGlwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlaWdodCBvZiB0aGUgZnJhbWVidWZmZXIgdGhlIHNuYXBzaG90IGlzIHJlbmRlcmluZyBpbnRvLgorICAgICAqLworICAgIGludCBoZWlnaHQ7CisKKyAgICAvKioKKyAgICAgKiBMb2NhbCB0cmFuc2Zvcm1hdGlvbi4gSG9sZHMgdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24sIHNjYWxlIGFuZAorICAgICAqIHJvdGF0aW9uIHZhbHVlcy4KKyAgICAgKi8KKyAgICBtYXQ0IHRyYW5zZm9ybTsKKworICAgIC8qKgorICAgICAqIEN1cnJlbnQgY2xpcCByZWdpb24uIFRoZSBjbGlwIGlzIHN0b3JlZCBpbiBjYW52YXMtc3BhY2UgY29vcmRpbmF0ZXMsCisgICAgICogKHNjcmVlbi1zcGFjZSBjb29yZGluYXRlcyBpbiB0aGUgcmVndWxhciBjYXNlLikKKyAgICAgKi8KKyAgICBSZWN0IGNsaXBSZWN0OworCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgdGhlIGxheWVyIHdvbid0IGJlIHJlbmRlcmVkLgorICAgICAqLworICAgIGJvb2wgaW52aXNpYmxlOworCisgICAgLyoqCisgICAgICogRGlydHkgZmxhZ3MuCisgICAgICovCisgICAgaW50IGZsYWdzOworCisgICAgLyoqCisgICAgICogUHJldmlvdXMgc25hcHNob3QuCisgICAgICovCisgICAgc3A8U25hcHNob3Q+IHByZXZpb3VzOworCisgICAgLyoqCisgICAgICogT25seSBzZXQgd2hlbiB0aGUgZmxhZyBrRmxhZ0lzTGF5ZXIgaXMgc2V0LgorICAgICAqLworICAgIExheWVyKiBsYXllcjsKKyAgICBHTHVpbnQgZmJvOworCisgICAgLyoqCisgICAgICogQ3VycmVudCB2aWV3cG9ydC4KKyAgICAgKi8KKyAgICBSZWN0IHZpZXdwb3J0OworCisgICAgLyoqCisgICAgICogQ29udGFpbnMgdGhlIHByZXZpb3VzIG9ydGhvIG1hdHJpeC4KKyAgICAgKi8KKyAgICBtYXQ0IG9ydGhvTWF0cml4OworCitwcml2YXRlOgorICAgIFJlY3QgbG9jYWxDbGlwOworCit9OyAvLyBjbGFzcyBTbmFwc2hvdAorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfU05BUFNIT1RfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1RleHREcm9wU2hhZG93Q2FjaGUuY3BwIGIvbGlicy9od3VpL1RleHREcm9wU2hhZG93Q2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNTQyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvVGV4dERyb3BTaGFkb3dDYWNoZS5jcHAKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSAiVGV4dERyb3BTaGFkb3dDYWNoZS5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitUZXh0RHJvcFNoYWRvd0NhY2hlOjpUZXh0RHJvcFNoYWRvd0NhY2hlKCk6CisgICAgICAgIG1DYWNoZShHZW5lcmF0aW9uQ2FjaGU8U2hhZG93VGV4dCwgU2hhZG93VGV4dHVyZSo+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUoTUIoREVGQVVMVF9EUk9QX1NIQURPV19DQUNIRV9TSVpFKSkgeworICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX0RST1BfU0hBRE9XX0NBQ0hFX1NJWkUsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKKyAgICAgICAgTE9HRCgiICBTZXR0aW5nIGRyb3Agc2hhZG93IGNhY2hlIHNpemUgdG8gJXNNQiIsIHByb3BlcnR5KTsKKyAgICAgICAgc2V0TWF4U2l6ZShNQihhdG9mKHByb3BlcnR5KSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCBkcm9wIHNoYWRvdyBjYWNoZSBzaXplIG9mICUuMmZNQiIsIERFRkFVTFRfRFJPUF9TSEFET1dfQ0FDSEVfU0laRSk7CisgICAgfQorCisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7Cit9CisKK1RleHREcm9wU2hhZG93Q2FjaGU6OlRleHREcm9wU2hhZG93Q2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPFNoYWRvd1RleHQsIFNoYWRvd1RleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKG1heEJ5dGVTaXplKSB7CisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7Cit9CisKK1RleHREcm9wU2hhZG93Q2FjaGU6On5UZXh0RHJvcFNoYWRvd0NhY2hlKCkgeworICAgIG1DYWNoZS5jbGVhcigpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaXplIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWludDMyX3QgVGV4dERyb3BTaGFkb3dDYWNoZTo6Z2V0U2l6ZSgpIHsKKyAgICByZXR1cm4gbVNpemU7Cit9CisKK3VpbnQzMl90IFRleHREcm9wU2hhZG93Q2FjaGU6OmdldE1heFNpemUoKSB7CisgICAgcmV0dXJuIG1NYXhTaXplOworfQorCit2b2lkIFRleHREcm9wU2hhZG93Q2FjaGU6OnNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIG1NYXhTaXplID0gbWF4U2l6ZTsKKyAgICB3aGlsZSAobVNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWxsYmFja3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBUZXh0RHJvcFNoYWRvd0NhY2hlOjpvcGVyYXRvcigpKFNoYWRvd1RleHQmIHRleHQsIFNoYWRvd1RleHR1cmUqJiB0ZXh0dXJlKSB7CisgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IHRleHR1cmUtPndpZHRoICogdGV4dHVyZS0+aGVpZ2h0OworICAgIG1TaXplIC09IHNpemU7CisKKyAgICBpZiAodGV4dHVyZSkgeworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisgICAgICAgIGRlbGV0ZSB0ZXh0dXJlOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFRleHREcm9wU2hhZG93Q2FjaGU6OmNsZWFyKCkgeworICAgIG1DYWNoZS5jbGVhcigpOworfQorCitTaGFkb3dUZXh0dXJlKiBUZXh0RHJvcFNoYWRvd0NhY2hlOjpnZXQoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIqIHRleHQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgaW50IG51bUdseXBocywgdWludDMyX3QgcmFkaXVzKSB7CisgICAgU2hhZG93VGV4dCBlbnRyeShwYWludCwgcmFkaXVzLCBsZW4sIHRleHQpOworICAgIFNoYWRvd1RleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGUuZ2V0KGVudHJ5KTsKKworICAgIGlmICghdGV4dHVyZSkgeworICAgICAgICBGb250UmVuZGVyZXI6OkRyb3BTaGFkb3cgc2hhZG93ID0gbVJlbmRlcmVyLT5yZW5kZXJEcm9wU2hhZG93KHBhaW50LCB0ZXh0LCAwLAorICAgICAgICAgICAgICAgIGxlbiwgbnVtR2x5cGhzLCByYWRpdXMpOworCisgICAgICAgIHRleHR1cmUgPSBuZXcgU2hhZG93VGV4dHVyZTsKKyAgICAgICAgdGV4dHVyZS0+bGVmdCA9IHNoYWRvdy5wZW5YOworICAgICAgICB0ZXh0dXJlLT50b3AgPSBzaGFkb3cucGVuWTsKKyAgICAgICAgdGV4dHVyZS0+d2lkdGggPSBzaGFkb3cud2lkdGg7CisgICAgICAgIHRleHR1cmUtPmhlaWdodCA9IHNoYWRvdy5oZWlnaHQ7CisgICAgICAgIHRleHR1cmUtPmdlbmVyYXRpb24gPSAwOworICAgICAgICB0ZXh0dXJlLT5ibGVuZCA9IHRydWU7CisKKyAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IHNoYWRvdy53aWR0aCAqIHNoYWRvdy5oZWlnaHQ7CisgICAgICAgIC8vIERvbid0IGV2ZW4gdHJ5IHRvIGNhY2hlIGEgYml0bWFwIHRoYXQncyBiaWdnZXIgdGhhbiB0aGUgY2FjaGUKKyAgICAgICAgaWYgKHNpemUgPCBtTWF4U2l6ZSkgeworICAgICAgICAgICAgd2hpbGUgKG1TaXplICsgc2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlLnJlbW92ZU9sZGVzdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4dHVyZS0+aWQpOworCisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZS0+aWQpOworICAgICAgICAvLyBUZXh0dXJlcyBhcmUgQWxwaGE4CisgICAgICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgMSk7CisKKyAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0FMUEhBLCB0ZXh0dXJlLT53aWR0aCwgdGV4dHVyZS0+aGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgIEdMX0FMUEhBLCBHTF9VTlNJR05FRF9CWVRFLCBzaGFkb3cuaW1hZ2UpOworCisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKKworICAgICAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgICAgICBtU2l6ZSArPSBzaXplOworICAgICAgICAgICAgbUNhY2hlLnB1dChlbnRyeSwgdGV4dHVyZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZXh0dXJlLT5jbGVhbnVwID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENsZWFudXAgc2hhZG93CisgICAgICAgIGRlbGV0ZVtdIHNoYWRvdy5pbWFnZTsKKyAgICB9CisKKyAgICByZXR1cm4gdGV4dHVyZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVGV4dERyb3BTaGFkb3dDYWNoZS5oIGIvbGlicy9od3VpL1RleHREcm9wU2hhZG93Q2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjVkNjJhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1RleHREcm9wU2hhZG93Q2FjaGUuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9URVhUX0RST1BfU0hBRE9XX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9URVhUX0RST1BfU0hBRE9XX0NBQ0hFX0gKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8U2tQYWludC5oPgorCisjaW5jbHVkZSAiR2VuZXJhdGlvbkNhY2hlLmgiCisjaW5jbHVkZSAiRm9udFJlbmRlcmVyLmgiCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKK3N0cnVjdCBTaGFkb3dUZXh0IHsKKyAgICBTaGFkb3dUZXh0KCkgeworICAgICAgICB0ZXh0ID0gTlVMTDsKKyAgICB9CisKKyAgICBTaGFkb3dUZXh0KFNrUGFpbnQqIHBhaW50LCB1aW50MzJfdCByYWRpdXMsIHVpbnQzMl90IGxlbiwgY29uc3QgY2hhciogc3JjVGV4dCk6CisgICAgICAgICAgICByYWRpdXMocmFkaXVzKSwgbGVuKGxlbikgeworICAgICAgICB0ZXh0ID0gbmV3IGNoYXJbbGVuXTsKKyAgICAgICAgbWVtY3B5KHRleHQsIHNyY1RleHQsIGxlbik7CisKKyAgICAgICAgdGV4dFNpemUgPSBwYWludC0+Z2V0VGV4dFNpemUoKTsKKyAgICAgICAgdHlwZWZhY2UgPSBwYWludC0+Z2V0VHlwZWZhY2UoKTsKKworICAgICAgICBoYXNoID0gMDsKKyAgICAgICAgdWludDMyX3QgbXVsdGlwbGllciA9IDE7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgaGFzaCArPSB0ZXh0W2ldICogbXVsdGlwbGllcjsKKyAgICAgICAgICAgIHVpbnQzMl90IHNoaWZ0ZWQgPSBtdWx0aXBsaWVyIDw8IDU7CisgICAgICAgICAgICBtdWx0aXBsaWVyID0gc2hpZnRlZCAtIG11bHRpcGxpZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTaGFkb3dUZXh0KGNvbnN0IFNoYWRvd1RleHQmIHNoYWRvdyk6CisgICAgICAgICAgICByYWRpdXMoc2hhZG93LnJhZGl1cyksIGxlbihzaGFkb3cubGVuKSwgaGFzaChzaGFkb3cuaGFzaCksCisgICAgICAgICAgICB0ZXh0U2l6ZShzaGFkb3cudGV4dFNpemUpLCB0eXBlZmFjZShzaGFkb3cudHlwZWZhY2UpIHsKKyAgICAgICAgdGV4dCA9IG5ldyBjaGFyW3NoYWRvdy5sZW5dOworICAgICAgICBtZW1jcHkodGV4dCwgc2hhZG93LnRleHQsIHNoYWRvdy5sZW4pOworICAgIH0KKworICAgIH5TaGFkb3dUZXh0KCkgeworICAgICAgICBkZWxldGVbXSB0ZXh0OworICAgIH0KKworICAgIHVpbnQzMl90IHJhZGl1czsKKyAgICB1aW50MzJfdCBsZW47CisgICAgdWludDMyX3QgaGFzaDsKKyAgICBmbG9hdCB0ZXh0U2l6ZTsKKyAgICBTa1R5cGVmYWNlKiB0eXBlZmFjZTsKKyAgICBjaGFyICp0ZXh0OworCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgU2hhZG93VGV4dCYgcmhzKSBjb25zdCB7CisgICAgICAgIGlmIChoYXNoIDwgcmhzLmhhc2gpIHJldHVybiB0cnVlOworICAgICAgICBlbHNlIGlmIChoYXNoID09IHJocy5oYXNoKSB7CisgICAgICAgICAgICBpZiAobGVuIDwgcmhzLmxlbikgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBlbHNlIGlmIChsZW4gPT0gcmhzLmxlbikgeworICAgICAgICAgICAgICAgIGlmIChyYWRpdXMgPCByaHMucmFkaXVzKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyYWRpdXMgPT0gcmhzLnJhZGl1cykgeworICAgICAgICAgICAgICAgICAgICBpZiAodGV4dFNpemUgPCByaHMudGV4dFNpemUpIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZXh0U2l6ZSA9PSByaHMudGV4dFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZmFjZSA8IHJocy50eXBlZmFjZSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlZmFjZSA9PSByaHMudHlwZWZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RybmNtcCh0ZXh0LCByaHMudGV4dCwgbGVuKSA8IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK307IC8vIHN0cnVjdCBTaGFkb3dUZXh0CisKKy8qKgorICogQWxwaGEgdGV4dHVyZSB1c2VkIHRvIHJlcHJlc2VudCBhIHNoYWRvdy4KKyAqLworc3RydWN0IFNoYWRvd1RleHR1cmU6IHB1YmxpYyBUZXh0dXJlIHsKKyAgICBTaGFkb3dUZXh0dXJlKCk6IFRleHR1cmUoKSB7CisgICAgfQorCisgICAgZmxvYXQgbGVmdDsKKyAgICBmbG9hdCB0b3A7Cit9OyAvLyBzdHJ1Y3QgU2hhZG93VGV4dHVyZQorCitjbGFzcyBUZXh0RHJvcFNoYWRvd0NhY2hlOiBwdWJsaWMgT25FbnRyeVJlbW92ZWQ8U2hhZG93VGV4dCwgU2hhZG93VGV4dHVyZSo+IHsKK3B1YmxpYzoKKyAgICBUZXh0RHJvcFNoYWRvd0NhY2hlKCk7CisgICAgVGV4dERyb3BTaGFkb3dDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk7CisgICAgflRleHREcm9wU2hhZG93Q2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoU2hhZG93VGV4dCYgdGV4dCwgU2hhZG93VGV4dHVyZSomIHRleHR1cmUpOworCisgICAgU2hhZG93VGV4dHVyZSogZ2V0KFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyKiB0ZXh0LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLCB1aW50MzJfdCByYWRpdXMpOworCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjYWNoZS4gVGhpcyBjYXVzZXMgYWxsIHRleHR1cmVzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgdm9pZCBzZXRGb250UmVuZGVyZXIoRm9udFJlbmRlcmVyJiBmb250UmVuZGVyZXIpIHsKKyAgICAgICAgbVJlbmRlcmVyID0gJmZvbnRSZW5kZXJlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHZvaWQgc2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldE1heFNpemUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldFNpemUoKTsKKworcHJpdmF0ZToKKyAgICBHZW5lcmF0aW9uQ2FjaGU8U2hhZG93VGV4dCwgU2hhZG93VGV4dHVyZSo+IG1DYWNoZTsKKworICAgIHVpbnQzMl90IG1TaXplOworICAgIHVpbnQzMl90IG1NYXhTaXplOworICAgIEZvbnRSZW5kZXJlciogbVJlbmRlcmVyOworfTsgLy8gY2xhc3MgVGV4dERyb3BTaGFkb3dDYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfVEVYVF9EUk9QX1NIQURPV19DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVGV4dHVyZS5oIGIvbGlicy9od3VpL1RleHR1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGY1NDhiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1RleHR1cmUuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1RFWFRVUkVfSAorI2RlZmluZSBBTkRST0lEX1VJX1RFWFRVUkVfSAorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIE9wZW5HTCB0ZXh0dXJlLgorICovCitzdHJ1Y3QgVGV4dHVyZSB7CisgICAgVGV4dHVyZSgpIHsKKyAgICAgICAgY2xlYW51cCA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHRleHR1cmUuCisgICAgICovCisgICAgR0x1aW50IGlkOworICAgIC8qKgorICAgICAqIEdlbmVyYXRpb24gb2YgdGhlIGJhY2tpbmcgYml0bWFwLAorICAgICAqLworICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRleHR1cmUgcmVxdWlyZXMgYmxlbmRpbmcuCisgICAgICovCisgICAgYm9vbCBibGVuZDsKKyAgICAvKioKKyAgICAgKiBXaWR0aCBvZiB0aGUgYmFja2luZyBiaXRtYXAuCisgICAgICovCisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgLyoqCisgICAgICogSGVpZ2h0IG9mIHRoZSBiYWNraW5nIGJpdG1hcC4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0ZXh0dXJlIHNob3VsZCBiZSBjbGVhbmVkIHVwIGFmdGVyIHVzZS4KKyAgICAgKi8KKyAgICBib29sIGNsZWFudXA7Cit9OyAvLyBzdHJ1Y3QgVGV4dHVyZQorCitjbGFzcyBBdXRvVGV4dHVyZSB7CitwdWJsaWM6CisgICAgQXV0b1RleHR1cmUoY29uc3QgVGV4dHVyZSogdGV4dHVyZSk6IG1UZXh0dXJlKHRleHR1cmUpIHsgfQorICAgIH5BdXRvVGV4dHVyZSgpIHsKKyAgICAgICAgaWYgKG1UZXh0dXJlICYmIG1UZXh0dXJlLT5jbGVhbnVwKSB7CisgICAgICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZtVGV4dHVyZS0+aWQpOworICAgICAgICAgICAgZGVsZXRlIG1UZXh0dXJlOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IFRleHR1cmUqIG1UZXh0dXJlOworfTsgLy8gY2xhc3MgQXV0b1RleHR1cmUKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1RFWFRVUkVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1RleHR1cmVDYWNoZS5jcHAgYi9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTNjNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1RleHR1cmVDYWNoZS5jcHAKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlICJUZXh0dXJlQ2FjaGUuaCIKKyNpbmNsdWRlICJQcm9wZXJ0aWVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworVGV4dHVyZUNhY2hlOjpUZXh0dXJlQ2FjaGUoKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxTa0JpdG1hcCosIFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKE1CKERFRkFVTFRfVEVYVFVSRV9DQUNIRV9TSVpFKSkgeworICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX1RFWFRVUkVfQ0FDSEVfU0laRSwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgdGV4dHVyZSBjYWNoZSBzaXplIHRvICVzTUIiLCBwcm9wZXJ0eSk7CisgICAgICAgIHNldE1heFNpemUoTUIoYXRvZihwcm9wZXJ0eSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgdGV4dHVyZSBjYWNoZSBzaXplIG9mICUuMmZNQiIsIERFRkFVTFRfVEVYVFVSRV9DQUNIRV9TSVpFKTsKKyAgICB9CisKKyAgICBpbml0KCk7Cit9CisKK1RleHR1cmVDYWNoZTo6VGV4dHVyZUNhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxTa0JpdG1hcCosIFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKG1heEJ5dGVTaXplKSB7CisgICAgaW5pdCgpOworfQorCitUZXh0dXJlQ2FjaGU6On5UZXh0dXJlQ2FjaGUoKSB7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK3ZvaWQgVGV4dHVyZUNhY2hlOjppbml0KCkgeworICAgIG1DYWNoZS5zZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKHRoaXMpOworCisgICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfVEVYVFVSRV9TSVpFLCAmbU1heFRleHR1cmVTaXplKTsKKyAgICBMT0dEKCIgICAgTWF4aW11bSB0ZXh0dXJlIGRpbWVuc2lvbiBpcyAlZCBwaXhlbHMiLCBtTWF4VGV4dHVyZVNpemUpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaXplIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWludDMyX3QgVGV4dHVyZUNhY2hlOjpnZXRTaXplKCkgeworICAgIHJldHVybiBtU2l6ZTsKK30KKwordWludDMyX3QgVGV4dHVyZUNhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIHJldHVybiBtTWF4U2l6ZTsKK30KKwordm9pZCBUZXh0dXJlQ2FjaGU6OnNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIG1NYXhTaXplID0gbWF4U2l6ZTsKKyAgICB3aGlsZSAobVNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWxsYmFja3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBUZXh0dXJlQ2FjaGU6Om9wZXJhdG9yKCkoU2tCaXRtYXAqJiBiaXRtYXAsIFRleHR1cmUqJiB0ZXh0dXJlKSB7CisgICAgaWYgKGJpdG1hcCkgeworICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplID0gYml0bWFwLT5yb3dCeXRlcygpICogYml0bWFwLT5oZWlnaHQoKTsKKyAgICAgICAgbVNpemUgLT0gc2l6ZTsKKyAgICB9CisKKyAgICBpZiAodGV4dHVyZSkgeworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisgICAgICAgIGRlbGV0ZSB0ZXh0dXJlOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitUZXh0dXJlKiBUZXh0dXJlQ2FjaGU6OmdldChTa0JpdG1hcCogYml0bWFwKSB7CisgICAgVGV4dHVyZSogdGV4dHVyZSA9IG1DYWNoZS5nZXQoYml0bWFwKTsKKyAgICBpZiAoIXRleHR1cmUpIHsKKyAgICAgICAgaWYgKGJpdG1hcC0+d2lkdGgoKSA+IG1NYXhUZXh0dXJlU2l6ZSB8fCBiaXRtYXAtPmhlaWdodCgpID4gbU1heFRleHR1cmVTaXplKSB7CisgICAgICAgICAgICBMT0dXKCJCaXRtYXAgdG9vIGxhcmdlIHRvIGJlIHVwbG9hZGVkIGludG8gYSB0ZXh0dXJlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBiaXRtYXAtPnJvd0J5dGVzKCkgKiBiaXRtYXAtPmhlaWdodCgpOworICAgICAgICAvLyBEb24ndCBldmVuIHRyeSB0byBjYWNoZSBhIGJpdG1hcCB0aGF0J3MgYmlnZ2VyIHRoYW4gdGhlIGNhY2hlCisgICAgICAgIGlmIChzaXplIDwgbU1heFNpemUpIHsKKyAgICAgICAgICAgIHdoaWxlIChtU2l6ZSArIHNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICAgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRleHR1cmUgPSBuZXcgVGV4dHVyZTsKKyAgICAgICAgZ2VuZXJhdGVUZXh0dXJlKGJpdG1hcCwgdGV4dHVyZSwgZmFsc2UpOworCisgICAgICAgIGlmIChzaXplIDwgbU1heFNpemUpIHsKKyAgICAgICAgICAgIG1TaXplICs9IHNpemU7CisgICAgICAgICAgICBtQ2FjaGUucHV0KGJpdG1hcCwgdGV4dHVyZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZXh0dXJlLT5jbGVhbnVwID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYml0bWFwLT5nZXRHZW5lcmF0aW9uSUQoKSAhPSB0ZXh0dXJlLT5nZW5lcmF0aW9uKSB7CisgICAgICAgIGdlbmVyYXRlVGV4dHVyZShiaXRtYXAsIHRleHR1cmUsIHRydWUpOworICAgIH0KKworICAgIHJldHVybiB0ZXh0dXJlOworfQorCit2b2lkIFRleHR1cmVDYWNoZTo6cmVtb3ZlKFNrQml0bWFwKiBiaXRtYXApIHsKKyAgICBtQ2FjaGUucmVtb3ZlKGJpdG1hcCk7Cit9CisKK3ZvaWQgVGV4dHVyZUNhY2hlOjpjbGVhcigpIHsKKyAgICBtQ2FjaGUuY2xlYXIoKTsKK30KKwordm9pZCBUZXh0dXJlQ2FjaGU6OmdlbmVyYXRlVGV4dHVyZShTa0JpdG1hcCogYml0bWFwLCBUZXh0dXJlKiB0ZXh0dXJlLCBib29sIHJlZ2VuZXJhdGUpIHsKKyAgICBTa0F1dG9Mb2NrUGl4ZWxzIGFscCgqYml0bWFwKTsKKyAgICBpZiAoIWJpdG1hcC0+cmVhZHlUb0RyYXcoKSkgeworICAgICAgICBMT0dFKCJDYW5ub3QgZ2VuZXJhdGUgdGV4dHVyZSBmcm9tIGJpdG1hcCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFyZWdlbmVyYXRlKSB7CisgICAgICAgIHRleHR1cmUtPmdlbmVyYXRpb24gPSBiaXRtYXAtPmdldEdlbmVyYXRpb25JRCgpOworICAgICAgICB0ZXh0dXJlLT53aWR0aCA9IGJpdG1hcC0+d2lkdGgoKTsKKyAgICAgICAgdGV4dHVyZS0+aGVpZ2h0ID0gYml0bWFwLT5oZWlnaHQoKTsKKworICAgICAgICBnbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisgICAgfQorCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlLT5pZCk7CisgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCBiaXRtYXAtPmJ5dGVzUGVyUGl4ZWwoKSk7CisKKyAgICBzd2l0Y2ggKGJpdG1hcC0+Z2V0Q29uZmlnKCkpIHsKKyAgICBjYXNlIFNrQml0bWFwOjprQThfQ29uZmlnOgorICAgICAgICB0ZXh0dXJlLT5ibGVuZCA9IHRydWU7CisgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9BTFBIQSwgYml0bWFwLT5yb3dCeXRlc0FzUGl4ZWxzKCksIHRleHR1cmUtPmhlaWdodCwgMCwKKyAgICAgICAgICAgICAgICBHTF9BTFBIQSwgR0xfVU5TSUdORURfQllURSwgYml0bWFwLT5nZXRQaXhlbHMoKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2tCaXRtYXA6OmtSR0JfNTY1X0NvbmZpZzoKKyAgICAgICAgdGV4dHVyZS0+YmxlbmQgPSBmYWxzZTsKKyAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwgYml0bWFwLT5yb3dCeXRlc0FzUGl4ZWxzKCksIHRleHR1cmUtPmhlaWdodCwgMCwKKyAgICAgICAgICAgICAgICBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCBiaXRtYXAtPmdldFBpeGVscygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTa0JpdG1hcDo6a0FSR0JfODg4OF9Db25maWc6CisgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCBiaXRtYXAtPnJvd0J5dGVzQXNQaXhlbHMoKSwgdGV4dHVyZS0+aGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIGJpdG1hcC0+Z2V0UGl4ZWxzKCkpOworICAgICAgICAvLyBEbyB0aGlzIGFmdGVyIGNhbGxpbmcgZ2V0UGl4ZWxzKCkgdG8gbWFrZSBzdXJlIFNraWEncyBkZWZlcnJlZAorICAgICAgICAvLyBkZWNvZGluZyBoYXBwZW5lZAorICAgICAgICB0ZXh0dXJlLT5ibGVuZCA9ICFiaXRtYXAtPmlzT3BhcXVlKCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmggYi9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVlNGM3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9UZXh0dXJlQ2FjaGUuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1RFWFRVUkVfQ0FDSEVfSAorI2RlZmluZSBBTkRST0lEX1VJX1RFWFRVUkVfQ0FDSEVfSAorCisjaW5jbHVkZSA8U2tCaXRtYXAuaD4KKworI2luY2x1ZGUgIlRleHR1cmUuaCIKKyNpbmNsdWRlICJHZW5lcmF0aW9uQ2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvKioKKyAqIEEgc2ltcGxlIExSVSB0ZXh0dXJlIGNhY2hlLiBUaGUgY2FjaGUgaGFzIGEgbWF4aW11bSBzaXplIGV4cHJlc3NlZCBpbiBieXRlcy4KKyAqIEFueSB0ZXh0dXJlIGFkZGVkIHRvIHRoZSBjYWNoZSBjYXVzaW5nIHRoZSBjYWNoZSB0byBncm93IGJleW9uZCB0aGUgbWF4aW11bQorICogYWxsb3dlZCBzaXplIHdpbGwgYWxzbyBjYXVzZSB0aGUgb2xkZXN0IHRleHR1cmUgdG8gYmUga2lja2VkIG91dC4KKyAqLworY2xhc3MgVGV4dHVyZUNhY2hlOiBwdWJsaWMgT25FbnRyeVJlbW92ZWQ8U2tCaXRtYXAqLCBUZXh0dXJlKj4geworcHVibGljOgorICAgIFRleHR1cmVDYWNoZSgpOworICAgIFRleHR1cmVDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk7CisgICAgflRleHR1cmVDYWNoZSgpOworCisgICAgLyoqCisgICAgICogVXNlZCBhcyBhIGNhbGxiYWNrIHdoZW4gYW4gZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKiBEbyBub3QgaW52b2tlIGRpcmVjdGx5LgorICAgICAqLworICAgIHZvaWQgb3BlcmF0b3IoKShTa0JpdG1hcComIGJpdG1hcCwgVGV4dHVyZSomIHRleHR1cmUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGV4dHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBiaXRtYXAuIElmIHRoZSB0ZXh0dXJlCisgICAgICogY2Fubm90IGJlIGZvdW5kIGluIHRoZSBjYWNoZSwgYSBuZXcgdGV4dHVyZSBpcyBnZW5lcmF0ZWQuCisgICAgICovCisgICAgVGV4dHVyZSogZ2V0KFNrQml0bWFwKiBiaXRtYXApOworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIHRleHR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgYml0bWFwLiBSZXR1cm5zIE5VTEwKKyAgICAgKiBpZiB0aGUgdGV4dHVyZSBjYW5ub3QgYmUgZm91bmQuIFVwb24gcmVtb3ZlIHRoZSB0ZXh0dXJlIGlzIGZyZWVkLgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlKFNrQml0bWFwKiBiaXRtYXApOworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgY2FjaGUuIFRoaXMgY2F1c2VzIGFsbCB0ZXh0dXJlcyB0byBiZSBkZWxldGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYXIoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdm9pZCBzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0TWF4U2l6ZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0U2l6ZSgpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgdGV4dHVyZSBmcm9tIGEgYml0bWFwIGludG8gdGhlIHNwZWNpZmllZCB0ZXh0dXJlIHN0cnVjdHVyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWdlbmVyYXRlIElmIHRydWUsIHRoZSBiaXRtYXAgZGF0YSBpcyByZXVwbG9hZGVkIGludG8gdGhlIHRleHR1cmUsIGJ1dAorICAgICAqICAgICAgICBubyBuZXcgdGV4dHVyZSBpcyBnZW5lcmF0ZWQuCisgICAgICovCisgICAgdm9pZCBnZW5lcmF0ZVRleHR1cmUoU2tCaXRtYXAqIGJpdG1hcCwgVGV4dHVyZSogdGV4dHVyZSwgYm9vbCByZWdlbmVyYXRlID0gZmFsc2UpOworCisgICAgdm9pZCBpbml0KCk7CisKKyAgICBHZW5lcmF0aW9uQ2FjaGU8U2tCaXRtYXAqLCBUZXh0dXJlKj4gbUNhY2hlOworCisgICAgdWludDMyX3QgbVNpemU7CisgICAgdWludDMyX3QgbU1heFNpemU7CisgICAgR0xpbnQgbU1heFRleHR1cmVTaXplOworfTsgLy8gY2xhc3MgVGV4dHVyZUNhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9URVhUVVJFX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9WZXJ0ZXguaCBiL2xpYnMvaHd1aS9WZXJ0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjU0MDg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1ZlcnRleC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfVkVSVEVYX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9WRVJURVhfSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogU2ltcGxlIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHZlcnRleCB3aXRoIGEgcG9zaXRpb24gYW5kIGEgdGV4dHVyZS4KKyAqLworc3RydWN0IFRleHR1cmVWZXJ0ZXggeworICAgIGZsb2F0IHBvc2l0aW9uWzJdOworICAgIGZsb2F0IHRleHR1cmVbMl07CisKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgc2V0KFRleHR1cmVWZXJ0ZXgqIHZlcnRleCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgdSwgZmxvYXQgdikgeworICAgICAgICB2ZXJ0ZXhbMF0ucG9zaXRpb25bMF0gPSB4OworICAgICAgICB2ZXJ0ZXhbMF0ucG9zaXRpb25bMV0gPSB5OworICAgICAgICB2ZXJ0ZXhbMF0udGV4dHVyZVswXSA9IHU7CisgICAgICAgIHZlcnRleFswXS50ZXh0dXJlWzFdID0gdjsKKyAgICB9CisKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgc2V0VVYoVGV4dHVyZVZlcnRleCogdmVydGV4LCBmbG9hdCB1LCBmbG9hdCB2KSB7CisgICAgICAgIHZlcnRleFswXS50ZXh0dXJlWzBdID0gdTsKKyAgICAgICAgdmVydGV4WzBdLnRleHR1cmVbMV0gPSB2OworICAgIH0KK307IC8vIHN0cnVjdCBUZXh0dXJlVmVydGV4CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9WRVJURVhfSApkaWZmIC0tZ2l0IGEvbGlicy9ycy9BbmRyb2lkLm1rIGIvbGlicy9ycy9BbmRyb2lkLm1rCmluZGV4IDk4NDY0YTAuLjM3YzQxOGIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvQW5kcm9pZC5taworKysgYi9saWJzL3JzL0FuZHJvaWQubWsKQEAgLTc2LDM0ICs3Niw0NCBAQAogTE9DQUxfU1JDX0ZJTEVTOj0gXAogCXJzQWRhcHRlci5jcHAgXAogCXJzQWxsb2NhdGlvbi5jcHAgXAorCXJzQW5pbWF0aW9uLmNwcCBcCiAJcnNDb21wb25lbnQuY3BwIFwKIAlyc0NvbnRleHQuY3BwIFwKIAlyc0RldmljZS5jcHAgXAogCXJzRWxlbWVudC5jcHAgXAotICAgICAgICByc0ZpbGVBM0QuY3BwIFwKKwlyc0ZpbGVBM0QuY3BwIFwKKwlyc0ZvbnQuY3BwIFwKIAlyc0xpZ2h0LmNwcCBcCiAJcnNMb2NrbGVzc0ZpZm8uY3BwIFwKIAlyc09iamVjdEJhc2UuY3BwIFwKIAlyc01hdHJpeC5jcHAgXAotICAgICAgICByc01lc2guY3BwIFwKLQlyc05vaXNlLmNwcCBcCisJcnNNZXNoLmNwcCBcCisJcnNNdXRleC5jcHAgXAogCXJzUHJvZ3JhbS5jcHAgXAogCXJzUHJvZ3JhbUZyYWdtZW50LmNwcCBcCi0JcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5jcHAgXAorCXJzUHJvZ3JhbVN0b3JlLmNwcCBcCiAJcnNQcm9ncmFtUmFzdGVyLmNwcCBcCiAJcnNQcm9ncmFtVmVydGV4LmNwcCBcCiAJcnNTYW1wbGVyLmNwcCBcCiAJcnNTY3JpcHQuY3BwIFwKIAlyc1NjcmlwdEMuY3BwIFwKIAlyc1NjcmlwdENfTGliLmNwcCBcCi0gICAgICAgIHJzU2hhZGVyQ2FjaGUuY3BwIFwKLQlyc1NpbXBsZU1lc2guY3BwIFwKKwlyc1NjcmlwdENfTGliQ0wuY3BwIFwKKwlyc1NjcmlwdENfTGliR0wuY3BwIFwKKwlyc1NoYWRlckNhY2hlLmNwcCBcCisJcnNTaWduYWwuY3BwIFwKKwlyc1N0cmVhbS5jcHAgXAogCXJzVGhyZWFkSU8uY3BwIFwKIAlyc1R5cGUuY3BwIFwKIAlyc1ZlcnRleEFycmF5LmNwcAogCiAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliY3V0aWxzIGxpYnV0aWxzIGxpYkVHTCBsaWJHTEVTdjFfQ00gbGliR0xFU3YyIGxpYnVpIGxpYmFjYworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJjdXRpbHMgbGlidXRpbHMgbGliRUdMIGxpYkdMRVN2MV9DTSBsaWJHTEVTdjIgbGlidWkgbGliYmNjCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZnQyCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gZXh0ZXJuYWwvZnJlZXR5cGUvaW5jbHVkZQorCiBMT0NBTF9MRExJQlMgOj0gLWxwdGhyZWFkIC1sZGwKIExPQ0FMX01PRFVMRTo9IGxpYlJTCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbApkaWZmIC0tZ2l0IGEvbGlicy9ycy9SZW5kZXJTY3JpcHQuaCBiL2xpYnMvcnMvUmVuZGVyU2NyaXB0LmgKaW5kZXggZDI4MGY1MC4uNzkwMmI5YSAxMDA2NDQKLS0tIGEvbGlicy9ycy9SZW5kZXJTY3JpcHQuaAorKysgYi9saWJzL3JzL1JlbmRlclNjcmlwdC5oCkBAIC0zMCwyMCArMzAsMjMgQEAKIHR5cGVkZWYgdm9pZCAqIFJzQWRhcHRlcjFEOwogdHlwZWRlZiB2b2lkICogUnNBZGFwdGVyMkQ7CiB0eXBlZGVmIHZvaWQgKiBSc0FsbG9jYXRpb247Cit0eXBlZGVmIHZvaWQgKiBSc0FuaW1hdGlvbjsKIHR5cGVkZWYgdm9pZCAqIFJzQ29udGV4dDsKIHR5cGVkZWYgdm9pZCAqIFJzRGV2aWNlOwogdHlwZWRlZiB2b2lkICogUnNFbGVtZW50OwogdHlwZWRlZiB2b2lkICogUnNGaWxlOwordHlwZWRlZiB2b2lkICogUnNGb250OwogdHlwZWRlZiB2b2lkICogUnNTYW1wbGVyOwogdHlwZWRlZiB2b2lkICogUnNTY3JpcHQ7Ci10eXBlZGVmIHZvaWQgKiBSc1NpbXBsZU1lc2g7Cit0eXBlZGVmIHZvaWQgKiBSc01lc2g7CiB0eXBlZGVmIHZvaWQgKiBSc1R5cGU7CiB0eXBlZGVmIHZvaWQgKiBSc0xpZ2h0OwordHlwZWRlZiB2b2lkICogUnNPYmplY3RCYXNlOwogCiB0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW07CiB0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1WZXJ0ZXg7CiB0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1GcmFnbWVudDsKLXR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbUZyYWdtZW50U3RvcmU7Cit0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1TdG9yZTsKIHR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbVJhc3RlcjsKIAogdHlwZWRlZiB2b2lkICgqIFJzQml0bWFwQ2FsbGJhY2tfdCkodm9pZCAqKTsKQEAgLTYwLDcgKzYzLDYgQEAKIFJzQ29udGV4dCByc0NvbnRleHRDcmVhdGUoUnNEZXZpY2UsIHVpbnQzMl90IHZlcnNpb24pOwogUnNDb250ZXh0IHJzQ29udGV4dENyZWF0ZUdMKFJzRGV2aWNlLCB1aW50MzJfdCB2ZXJzaW9uLCBib29sIHVzZURlcHRoKTsKIHZvaWQgcnNDb250ZXh0RGVzdHJveShSc0NvbnRleHQpOwotdm9pZCByc09iakRlc3Ryb3lPT0IoUnNDb250ZXh0LCB2b2lkICopOwogCiB1aW50MzJfdCByc0NvbnRleHRHZXRNZXNzYWdlKFJzQ29udGV4dCwgdm9pZCAqZGF0YSwgc2l6ZV90ICpyZWNlaXZlTGVuLCBzaXplX3QgYnVmZmVyTGVuLCBib29sIHdhaXQpOwogdm9pZCByc0NvbnRleHRJbml0VG9DbGllbnQoUnNDb250ZXh0KTsKQEAgLTgzLDExICs4NSwxNyBAQAogICAgIFJTX1RZUEVfVU5TSUdORURfMzIsCiAgICAgUlNfVFlQRV9VTlNJR05FRF82NCwKIAorICAgIFJTX1RZUEVfQk9PTEVBTiwKKwogICAgIFJTX1RZUEVfVU5TSUdORURfNV82XzUsCiAgICAgUlNfVFlQRV9VTlNJR05FRF81XzVfNV8xLAogICAgIFJTX1RZUEVfVU5TSUdORURfNF80XzRfNCwKIAotICAgIFJTX1RZUEVfRUxFTUVOVCwKKyAgICBSU19UWVBFX01BVFJJWF80WDQsCisgICAgUlNfVFlQRV9NQVRSSVhfM1gzLAorICAgIFJTX1RZUEVfTUFUUklYXzJYMiwKKworICAgIFJTX1RZUEVfRUxFTUVOVCA9IDEwMDAsCiAgICAgUlNfVFlQRV9UWVBFLAogICAgIFJTX1RZUEVfQUxMT0NBVElPTiwKICAgICBSU19UWVBFX1NBTVBMRVIsCkBAIC05NiwyNCArMTA0LDE3IEBACiAgICAgUlNfVFlQRV9QUk9HUkFNX0ZSQUdNRU5ULAogICAgIFJTX1RZUEVfUFJPR1JBTV9WRVJURVgsCiAgICAgUlNfVFlQRV9QUk9HUkFNX1JBU1RFUiwKLSAgICBSU19UWVBFX1BST0dSQU1fU1RPUkUKKyAgICBSU19UWVBFX1BST0dSQU1fU1RPUkUsCiB9OwogCiBlbnVtIFJzRGF0YUtpbmQgewogICAgIFJTX0tJTkRfVVNFUiwKLSAgICBSU19LSU5EX0NPTE9SLAotICAgIFJTX0tJTkRfUE9TSVRJT04sCi0gICAgUlNfS0lORF9URVhUVVJFLAotICAgIFJTX0tJTkRfTk9STUFMLAotICAgIFJTX0tJTkRfSU5ERVgsCi0gICAgUlNfS0lORF9QT0lOVF9TSVpFLAogCi0gICAgUlNfS0lORF9QSVhFTF9MLAorICAgIFJTX0tJTkRfUElYRUxfTCA9IDcsCiAgICAgUlNfS0lORF9QSVhFTF9BLAogICAgIFJTX0tJTkRfUElYRUxfTEEsCiAgICAgUlNfS0lORF9QSVhFTF9SR0IsCiAgICAgUlNfS0lORF9QSVhFTF9SR0JBLAotCiB9OwogCiBlbnVtIFJzU2FtcGxlclBhcmFtIHsKQEAgLTIwNSw5ICsyMDYsNzEgQEAKIGVudW0gUnNFcnJvciB7CiAgICAgUlNfRVJST1JfTk9ORSwKICAgICBSU19FUlJPUl9CQURfU0hBREVSLAotICAgIFJTX0VSUk9SX0JBRF9TQ1JJUFQKKyAgICBSU19FUlJPUl9CQURfU0NSSVBULAorICAgIFJTX0VSUk9SX0JBRF9WQUxVRSwKKyAgICBSU19FUlJPUl9PVVRfT0ZfTUVNT1JZCiB9OwogCitlbnVtIFJzQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiB7CisgICAgUlNfQU5JTUFUSU9OX0lOVEVSUE9MQVRJT05fU1RFUCwKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9MSU5FQVIsCisgICAgUlNfQU5JTUFUSU9OX0lOVEVSUE9MQVRJT05fQkVaSUVSLAorICAgIFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX0NBUkRJTkFMLAorICAgIFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX0hFUk1JVEUsCisgICAgUlNfQU5JTUFUSU9OX0lOVEVSUE9MQVRJT05fQlNQTElORQorfTsKKworZW51bSBSc0FuaW1hdGlvbkVkZ2UgeworICAgIFJTX0FOSU1BVElPTl9FREdFX1VOREVGSU5FRCwKKyAgICBSU19BTklNQVRJT05fRURHRV9DT05TVEFOVCwKKyAgICBSU19BTklNQVRJT05fRURHRV9HUkFESUVOVCwKKyAgICBSU19BTklNQVRJT05fRURHRV9DWUNMRSwKKyAgICBSU19BTklNQVRJT05fRURHRV9PU0NJTExBVEUsCisgICAgUlNfQU5JTUFUSU9OX0VER0VfQ1lMRV9SRUxBVElWRQorfTsKKworZW51bSBSc0EzRENsYXNzSUQgeworICAgIFJTX0EzRF9DTEFTU19JRF9VTktOT1dOLAorICAgIFJTX0EzRF9DTEFTU19JRF9NRVNILAorICAgIFJTX0EzRF9DTEFTU19JRF9UWVBFLAorICAgIFJTX0EzRF9DTEFTU19JRF9FTEVNRU5ULAorICAgIFJTX0EzRF9DTEFTU19JRF9BTExPQ0FUSU9OLAorICAgIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1ZFUlRFWCwKKyAgICBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9SQVNURVIsCisgICAgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fRlJBR01FTlQsCisgICAgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fU1RPUkUsCisgICAgUlNfQTNEX0NMQVNTX0lEX1NBTVBMRVIsCisgICAgUlNfQTNEX0NMQVNTX0lEX0FOSU1BVElPTiwKKyAgICBSU19BM0RfQ0xBU1NfSURfTElHSFQsCisgICAgUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMUQsCisgICAgUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMkQsCisgICAgUlNfQTNEX0NMQVNTX0lEX1NDUklQVF9DCit9OworCitlbnVtIFJzQ3VsbE1vZGUgeworICAgIFJTX0NVTExfQkFDSywKKyAgICBSU19DVUxMX0ZST05ULAorICAgIFJTX0NVTExfTk9ORQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFJzQTNEQ2xhc3NJRCBjbGFzc0lEOworICAgIGNvbnN0IGNoYXIqIG9iamVjdE5hbWU7Cit9IFJzRmlsZUluZGV4RW50cnk7CisKKy8vIFNjcmlwdCB0byBTY3JpcHQKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCB4U3RhcnQ7CisgICAgdWludDMyX3QgeEVuZDsKKyAgICB1aW50MzJfdCB5U3RhcnQ7CisgICAgdWludDMyX3QgeUVuZDsKKyAgICB1aW50MzJfdCB6U3RhcnQ7CisgICAgdWludDMyX3QgekVuZDsKKyAgICB1aW50MzJfdCBhcnJheVN0YXJ0OworICAgIHVpbnQzMl90IGFycmF5RW5kOworCit9IFJzU2NyaXB0Q2FsbDsKKwogI2lmbmRlZiBOT19SU19GVU5DUwogI2luY2x1ZGUgInJzZ0FwaUZ1bmNEZWNsLmgiCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvUmVuZGVyU2NyaXB0RW52LmggYi9saWJzL3JzL1JlbmRlclNjcmlwdEVudi5oCmluZGV4IDk5YjhjMDQuLjkyMjU5MDQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvUmVuZGVyU2NyaXB0RW52LmgKKysrIGIvbGlicy9ycy9SZW5kZXJTY3JpcHRFbnYuaApAQCAtOSwxMCArOSwxMCBAQAogdHlwZWRlZiB2b2lkICogUnNFbGVtZW50OwogdHlwZWRlZiB2b2lkICogUnNTYW1wbGVyOwogdHlwZWRlZiB2b2lkICogUnNTY3JpcHQ7Ci10eXBlZGVmIHZvaWQgKiBSc1NpbXBsZU1lc2g7Cit0eXBlZGVmIHZvaWQgKiBSc01lc2g7CiB0eXBlZGVmIHZvaWQgKiBSc1R5cGU7CiB0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1GcmFnbWVudDsKLXR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbUZyYWdtZW50U3RvcmU7Cit0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1TdG9yZTsKIHR5cGVkZWYgdm9pZCAqIFJzTGlnaHQ7CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vQW5kcm9pZC5tayBiL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNmVkN2UuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCi0jTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQucmVuZGVyc2NyaXB0Ci0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBGaWxtCi0KLWluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Y2U4YTEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmZpbG0iPgotICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJGaWxtIj4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iRmlsbSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249InBvcnRyYWl0IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuQmxhY2suTm9UaXRsZUJhciI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAxLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWI5YmRiLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMi5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2MmM4Mi4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDMucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZTI2YzAuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA0LnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWVlNjAzLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNS5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA1LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFjNTI0OC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDYucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNTEyNjEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA3LnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGJkOTM4Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOC5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxNzVlOC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDkucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjM4NzQuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEwLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDg4MjdkLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMS5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDExLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI4OWY3MS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDExLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTIucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYWYxNmE0Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMy5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA4YmNiZS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9yYXcvZmlsbWltYWdlLmMgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvcmF3L2ZpbG1pbWFnZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTU0YzY4Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9yYXcvZmlsbWltYWdlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLy8gRm91bnRhaW4gdGVzdCBzY3JpcHQKLQotI3ByYWdtYSB2ZXJzaW9uKDEpCi0jcHJhZ21hIHN0YXRlVmVydGV4KG9ydGhvV2luZG93KQotI3ByYWdtYSBzdGF0ZVJhc3RlcihmbGF0KQotI3ByYWdtYSBzdGF0ZUZyYWdtZW50KFBnbUZyYWdCYWNrZ3JvdW5kKQotI3ByYWdtYSBzdGF0ZVN0b3JlKE15QmxlbmQpCi0KLQotaW50IG1haW4odm9pZCogY29uLCBpbnQgZnQsIGludCBsYXVuY2hJRCkgewotICAgIGludCBjb3VudCwgdG91Y2gsIHgsIHksIHJhdGUsIG1heExpZmUsIGxpZmVTaGlmdDsKLSAgICBpbnQgbGlmZTsKLSAgICBpbnQgY3QsIGN0MjsKLSAgICBpbnQgbmV3UGFydDsKLSAgICBpbnQgZHJhd0NvdW50OwotICAgIGludCBkeCwgZHksIGlkeDsKLSAgICBpbnQgcG9zeCxwb3N5OwotICAgIGludCBjOwotICAgIGludCBzcmNJZHg7Ci0gICAgaW50IGRzdElkeDsKLQotICAgIGNvdW50ID0gbG9hZEkzMihjb24sIDAsIDEpOwotICAgIHRvdWNoID0gbG9hZEkzMihjb24sIDAsIDIpOwotICAgIHggPSBsb2FkSTMyKGNvbiwgMCwgMyk7Ci0gICAgeSA9IGxvYWRJMzIoY29uLCAwLCA0KTsKLQotICAgIHJhdGUgPSA0OwotICAgIG1heExpZmUgPSAoY291bnQgLyByYXRlKSAtIDE7Ci0gICAgbGlmZVNoaWZ0ID0gMDsKLSAgICB7Ci0gICAgICAgIGxpZmUgPSBtYXhMaWZlOwotICAgICAgICB3aGlsZSAobGlmZSA+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+CisgICAgPHN0cmluZyBuYW1lPSJiZW5jaG1hcmsiPkJlbmNobWFyazwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0ltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5LmphdmEgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9JbWFnZVByb2Nlc3NpbmdBY3Rpdml0eS5qYXZhCmluZGV4IDljZTUzZDguLjRhNGQ4MzcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0ltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5LmphdmEKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkuamF2YQpAQCAtMzEsNTMgKzMxLDU2IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgamF2YS5sYW5nLk1hdGg7CiAKLXB1YmxpYyBjbGFzcyBJbWFnZVByb2Nlc3NpbmdBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IGltcGxlbWVudHMgU3VyZmFjZUhvbGRlci5DYWxsYmFjayB7Ci0gICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcDsKLSAgICBwcml2YXRlIFBhcmFtcyBtUGFyYW1zOwotICAgIHByaXZhdGUgU2NyaXB0Lkludm9rYWJsZSBtSW52b2thYmxlOwotICAgIHByaXZhdGUgaW50W10gbUluRGF0YTsKLSAgICBwcml2YXRlIGludFtdIG1PdXREYXRhOworcHVibGljIGNsYXNzIEltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgU3VyZmFjZUhvbGRlci5DYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIgeworICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXBJbjsKKyAgICBwcml2YXRlIEJpdG1hcCBtQml0bWFwT3V0OworICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXBTY3JhdGNoOworICAgIHByaXZhdGUgU2NyaXB0Q19UaHJlc2hvbGQgbVNjcmlwdDsKKyAgICBwcml2YXRlIFNjcmlwdENfVmVydGljYWxfYmx1ciBtU2NyaXB0VkJsdXI7CisgICAgcHJpdmF0ZSBTY3JpcHRDX0hvcml6b250YWxfYmx1ciBtU2NyaXB0SEJsdXI7CisgICAgcHJpdmF0ZSBpbnQgbVJhZGl1cyA9IDA7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1SYWRpdXNTZWVrQmFyOworCisgICAgcHJpdmF0ZSBmbG9hdCBtSW5CbGFjayA9IDAuMGY7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1JbkJsYWNrU2Vla0JhcjsKKyAgICBwcml2YXRlIGZsb2F0IG1PdXRCbGFjayA9IDAuMGY7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1PdXRCbGFja1NlZWtCYXI7CisgICAgcHJpdmF0ZSBmbG9hdCBtSW5XaGl0ZSA9IDI1NS4wZjsKKyAgICBwcml2YXRlIFNlZWtCYXIgbUluV2hpdGVTZWVrQmFyOworICAgIHByaXZhdGUgZmxvYXQgbU91dFdoaXRlID0gMjU1LjBmOworICAgIHByaXZhdGUgU2Vla0JhciBtT3V0V2hpdGVTZWVrQmFyOworICAgIHByaXZhdGUgZmxvYXQgbUdhbW1hID0gMS4wZjsKKyAgICBwcml2YXRlIFNlZWtCYXIgbUdhbW1hU2Vla0JhcjsKKworICAgIHByaXZhdGUgZmxvYXQgbVNhdHVyYXRpb24gPSAxLjBmOworICAgIHByaXZhdGUgU2Vla0JhciBtU2F0dXJhdGlvblNlZWtCYXI7CisKKyAgICBwcml2YXRlIFRleHRWaWV3IG1CZW5jaG1hcmtSZXN1bHQ7CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCJ9KQogICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0IG1SUzsKICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCJ9KQotICAgIHByaXZhdGUgVHlwZSBtUGFyYW1zVHlwZTsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCJ9KQotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtUGFyYW1zQWxsb2NhdGlvbjsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCJ9KQogICAgIHByaXZhdGUgVHlwZSBtUGl4ZWxUeXBlOwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCiAgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1JblBpeGVsc0FsbG9jYXRpb247CiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKICAgICBwcml2YXRlIEFsbG9jYXRpb24gbU91dFBpeGVsc0FsbG9jYXRpb247CisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uMTsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uMjsKIAogICAgIHByaXZhdGUgU3VyZmFjZVZpZXcgbVN1cmZhY2VWaWV3OwogICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1EaXNwbGF5VmlldzsKIAotICAgIHN0YXRpYyBjbGFzcyBQYXJhbXMgewotICAgICAgICBwdWJsaWMgaW50IGluV2lkdGg7Ci0gICAgICAgIHB1YmxpYyBpbnQgb3V0V2lkdGg7Ci0gICAgICAgIHB1YmxpYyBpbnQgaW5IZWlnaHQ7Ci0gICAgICAgIHB1YmxpYyBpbnQgb3V0SGVpZ2h0OwotCi0gICAgICAgIHB1YmxpYyBmbG9hdCB0aHJlc2hvbGQ7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFBpeGVsIHsKLSAgICAgICAgcHVibGljIGJ5dGUgYTsKLSAgICAgICAgcHVibGljIGJ5dGUgcjsKLSAgICAgICAgcHVibGljIGJ5dGUgZzsKLSAgICAgICAgcHVibGljIGJ5dGUgYjsKLSAgICB9Ci0KICAgICBjbGFzcyBGaWx0ZXJDYWxsYmFjayBleHRlbmRzIFJlbmRlclNjcmlwdC5SU01lc3NhZ2UgewogICAgICAgICBwcml2YXRlIFJ1bm5hYmxlIG1BY3Rpb24gPSBuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgbU91dFBpeGVsc0FsbG9jYXRpb24ucmVhZERhdGEobU91dERhdGEpOwotICAgICAgICAgICAgICAgIG1CaXRtYXAuc2V0UGl4ZWxzKG1PdXREYXRhLCAwLCBtUGFyYW1zLm91dFdpZHRoLCAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtcy5vdXRXaWR0aCwgbVBhcmFtcy5vdXRIZWlnaHQpOwogICAgICAgICAgICAgICAgIG1EaXNwbGF5Vmlldy5pbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CkBAIC04OSwyOSArOTIsMjE4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgamF2YUZpbHRlcigpIHsKKyAgICBpbnQgaW5bXTsKKyAgICBpbnQgaW50ZXJtW107CisgICAgaW50IG91dFtdOworICAgIGludCBNQVhfUkFESVVTID0gMjU7CisgICAgLy8gU3RvcmUgb3VyIGNvZWZmaWNpZW50cyBoZXJlCisgICAgZmxvYXQgZ2F1c3NpYW5bXTsKKworICAgIHByaXZhdGUgbG9uZyBqYXZhRmlsdGVyKCkgeworICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBtQml0bWFwSW4uZ2V0V2lkdGgoKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IG1CaXRtYXBJbi5nZXRIZWlnaHQoKTsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gd2lkdGggKiBoZWlnaHQ7CisKKyAgICAgICAgaWYgKGluID09IG51bGwpIHsKKyAgICAgICAgICAgIGluID0gbmV3IGludFtjb3VudF07CisgICAgICAgICAgICBpbnRlcm0gPSBuZXcgaW50W2NvdW50XTsKKyAgICAgICAgICAgIG91dCA9IG5ldyBpbnRbY291bnRdOworICAgICAgICAgICAgZ2F1c3NpYW4gPSBuZXcgZmxvYXRbTUFYX1JBRElVUyAqIDIgKyAxXTsKKyAgICAgICAgICAgIG1CaXRtYXBJbi5nZXRQaXhlbHMoaW4sIDAsIHdpZHRoLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfQorCiAgICAgICAgIGxvbmcgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgaW50IGNvdW50ID0gbVBhcmFtcy5pbldpZHRoICogbVBhcmFtcy5pbkhlaWdodDsKLSAgICAgICAgZmxvYXQgdGhyZXNob2xkID0gbVBhcmFtcy50aHJlc2hvbGQgKiAyNTUuZjsKIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IHIgPSAoZmxvYXQpKChtSW5EYXRhW2ldID4+IDApICYgMHhmZik7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCBnID0gKGZsb2F0KSgobUluRGF0YVtpXSA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgZmluYWwgZmxvYXQgYiA9IChmbG9hdCkoKG1JbkRhdGFbaV0gPj4gMTYpICYgMHhmZik7CisgICAgICAgIGludCB3LCBoLCByOwogCi0gICAgICAgICAgICBmaW5hbCBmbG9hdCBsdW1pbmFuY2UgPSAwLjIxMjVmICogciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcxNTRmICogZyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA3MjFmICogYjsKLSAgICAgICAgICAgIGlmIChsdW1pbmFuY2UgPiB0aHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICBtT3V0RGF0YVtpXSA9IG1JbkRhdGFbaV07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1PdXREYXRhW2ldID0gbUluRGF0YVtpXSAmIDB4ZmYwMDAwMDA7CisgICAgICAgIGZsb2F0IGZSYWRpdXMgPSAoZmxvYXQpbVJhZGl1czsKKyAgICAgICAgaW50IHJhZGl1cyA9IChpbnQpbVJhZGl1czsKKworICAgICAgICAvLyBDb21wdXRlIGdhdXNzaWFuIHdlaWdodHMgZm9yIHRoZSBibHVyCisgICAgICAgIC8vIGUgaXMgdGhlIGV1bGVyJ3MgbnVtYmVyCisgICAgICAgIGZsb2F0IGUgPSAyLjcxODI4MTgyODQ1OTA0NWY7CisgICAgICAgIGZsb2F0IHBpID0gMy4xNDE1OTI2NTM1ODk3OTMyZjsKKyAgICAgICAgLy8gZyh4KSA9ICggMSAvIHNxcnQoIDIgKiBwaSApICogc2lnbWEpICogZSBeICggLXheMiAvIDIgKiBzaWdtYV4yICkKKyAgICAgICAgLy8geCBpcyBvZiB0aGUgZm9ybSBbLXJhZGl1cyAuLiAwIC4uIHJhZGl1c10KKyAgICAgICAgLy8gYW5kIHNpZ21hIHZhcmllcyB3aXRoIHJhZGl1cy4KKyAgICAgICAgLy8gQmFzZWQgb24gc29tZSBleHBlcmltZW50YWwgcmFkaXVzIHZhbHVlcyBhbmQgc2lnbWEncworICAgICAgICAvLyB3ZSBhcHByb3hpbWF0ZWx5IGZpdCBzaWdtYSA9IGYocmFkaXVzKSBhcworICAgICAgICAvLyBzaWdtYSA9IHJhZGl1cyAqIDAuNCAgKyAwLjYKKyAgICAgICAgLy8gVGhlIGxhcmdlciB0aGUgcmFkaXVzIGdldHMsIHRoZSBtb3JlIG91ciBnYXVzc2lhbiBibHVyCisgICAgICAgIC8vIHdpbGwgcmVzZW1ibGUgYSBib3ggYmx1ciBzaW5jZSB3aXRoIGxhcmdlIHNpZ21hCisgICAgICAgIC8vIHRoZSBnYXVzc2lhbiBjdXJ2ZSBiZWdpbnMgdG8gbG9zZSBpdHMgc2hhcGUKKyAgICAgICAgZmxvYXQgc2lnbWEgPSAwLjRmICogZlJhZGl1cyArIDAuNmY7CisgICAgICAgIC8vIE5vdyBjb21wdXRlIHRoZSBjb2VmZmljaW50cworICAgICAgICAvLyBXZSB3aWxsIHN0b3JlIHNvbWUgcmVkdW5kYW50IHZhbHVlcyB0byBzYXZlIHNvbWUgbWF0aCBkdXJpbmcKKyAgICAgICAgLy8gdGhlIGJsdXIgY2FsY3VsYXRpb25zCisgICAgICAgIC8vIHByZWNvbXB1dGUgc29tZSB2YWx1ZXMKKyAgICAgICAgZmxvYXQgY29lZmYxID0gMS4wZiAvIChmbG9hdCkoTWF0aC5zcXJ0KCAyLjBmICogcGkgKSAqIHNpZ21hKTsKKyAgICAgICAgZmxvYXQgY29lZmYyID0gLSAxLjBmIC8gKDIuMGYgKiBzaWdtYSAqIHNpZ21hKTsKKyAgICAgICAgZmxvYXQgbm9ybWFsaXplRmFjdG9yID0gMC4wZjsKKyAgICAgICAgZmxvYXQgZmxvYXRSID0gMC4wZjsKKyAgICAgICAgZm9yKHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICAgICAgZmxvYXRSID0gKGZsb2F0KXI7CisgICAgICAgICAgICBnYXVzc2lhbltyICsgcmFkaXVzXSA9IGNvZWZmMSAqIChmbG9hdClNYXRoLnBvdyhlLCBmbG9hdFIgKiBmbG9hdFIgKiBjb2VmZjIpOworICAgICAgICAgICAgbm9ybWFsaXplRmFjdG9yICs9IGdhdXNzaWFuW3IgKyByYWRpdXNdOworICAgICAgICB9CisKKyAgICAgICAgLy9Ob3cgd2UgbmVlZCB0byBub3JtYWxpemUgdGhlIHdlaWdodHMgYmVjYXVzZSBhbGwgb3VyIGNvZWZmaWNpZW50cyBuZWVkIHRvIGFkZCB1cCB0byBvbmUKKyAgICAgICAgbm9ybWFsaXplRmFjdG9yID0gMS4wZiAvIG5vcm1hbGl6ZUZhY3RvcjsKKyAgICAgICAgZm9yKHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICAgICAgZmxvYXRSID0gKGZsb2F0KXI7CisgICAgICAgICAgICBnYXVzc2lhbltyICsgcmFkaXVzXSAqPSBub3JtYWxpemVGYWN0b3I7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBibHVycmVkUGl4ZWxSID0gMC4wZjsKKyAgICAgICAgZmxvYXQgYmx1cnJlZFBpeGVsRyA9IDAuMGY7CisgICAgICAgIGZsb2F0IGJsdXJyZWRQaXhlbEIgPSAwLjBmOworICAgICAgICBmbG9hdCBibHVycmVkUGl4ZWxBID0gMC4wZjsKKworICAgICAgICBmb3IoaCA9IDA7IGggPCBoZWlnaHQ7IGggKyspIHsKKyAgICAgICAgICAgIGZvcih3ID0gMDsgdyA8IHdpZHRoOyB3ICsrKSB7CisKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxSID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxHID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxCID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxBID0gMC4wZjsKKworICAgICAgICAgICAgICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RlcHBpbmcgbGVmdCBhbmQgcmlnaHQgYXdheSBmcm9tIHRoZSBwaXhlbAorICAgICAgICAgICAgICAgICAgICBpbnQgdmFsaWRXID0gdyArIHI7CisgICAgICAgICAgICAgICAgICAgIC8vIENsYW1wIHRvIHplcm8gYW5kIHdpZHRoIG1heCgpIGlzbid0IGV4cG9zZWQgZm9yIGludHMgeWV0CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkVyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkVyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRXID4gd2lkdGggLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFcgPSB3aWR0aCAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXQgPSBpbltoKndpZHRoICsgdmFsaWRXXTsKKworICAgICAgICAgICAgICAgICAgICBpbnQgUiA9ICgoaW5wdXQgPj4gMjQpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIGludCBHID0gKChpbnB1dCA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IEIgPSAoKGlucHV0ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIGludCBBID0gKGlucHV0ICYgMHhmZik7CisKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2VpZ2h0ID0gZ2F1c3NpYW5bciArIHJhZGl1c107CisKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsUiArPSAoZmxvYXQpKFIpKndlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsRyArPSAoZmxvYXQpKEcpKndlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQiArPSAoZmxvYXQpKEIpKndlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQSArPSAoZmxvYXQpKEEpKndlaWdodDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgUiA9IChpbnQpYmx1cnJlZFBpeGVsUjsKKyAgICAgICAgICAgICAgICBpbnQgRyA9IChpbnQpYmx1cnJlZFBpeGVsRzsKKyAgICAgICAgICAgICAgICBpbnQgQiA9IChpbnQpYmx1cnJlZFBpeGVsQjsKKyAgICAgICAgICAgICAgICBpbnQgQSA9IChpbnQpYmx1cnJlZFBpeGVsQTsKKworICAgICAgICAgICAgICAgIGludGVybVtoKndpZHRoICsgd10gPSAoUiA8PCAyNCkgfCAoRyA8PCAxNikgfCAoQiA8PCA4KSB8IChBKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvcihoID0gMDsgaCA8IGhlaWdodDsgaCArKykgeworICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgd2lkdGg7IHcgKyspIHsKKworICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbFIgPSAwLjBmOworICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEcgPSAwLjBmOworICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEIgPSAwLjBmOworICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEEgPSAwLjBmOworICAgICAgICAgICAgICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbGlkSCA9IGggKyByOworICAgICAgICAgICAgICAgICAgICAvLyBDbGFtcCB0byB6ZXJvIGFuZCB3aWR0aAorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZEggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEggPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkSCA+IGhlaWdodCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkSCA9IGhlaWdodCAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXQgPSBpbnRlcm1bdmFsaWRIKndpZHRoICsgd107CisKKyAgICAgICAgICAgICAgICAgICAgaW50IFIgPSAoKGlucHV0ID4+IDI0KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgRyA9ICgoaW5wdXQgPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIGludCBCID0gKChpbnB1dCA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgQSA9IChpbnB1dCAmIDB4ZmYpOworCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdlaWdodCA9IGdhdXNzaWFuW3IgKyByYWRpdXNdOworCisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbFIgKz0gKGZsb2F0KShSKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEcgKz0gKGZsb2F0KShHKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEIgKz0gKGZsb2F0KShCKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEEgKz0gKGZsb2F0KShBKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IFIgPSAoaW50KWJsdXJyZWRQaXhlbFI7CisgICAgICAgICAgICAgICAgaW50IEcgPSAoaW50KWJsdXJyZWRQaXhlbEc7CisgICAgICAgICAgICAgICAgaW50IEIgPSAoaW50KWJsdXJyZWRQaXhlbEI7CisgICAgICAgICAgICAgICAgaW50IEEgPSAoaW50KWJsdXJyZWRQaXhlbEE7CisKKyAgICAgICAgICAgICAgICBvdXRbaCp3aWR0aCArIHddID0gKFIgPDwgMjQpIHwgKEcgPDwgMTYpIHwgKEIgPDwgOCkgfCAoQSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICB0ID0gamF2YS5sYW5nLlN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdDsKKyAgICAgICAgYW5kcm9pZC51dGlsLkxvZy52KCJJbWciLCAiSmF2YSBmcmFtZSB0aW1lIG1zICIgKyB0KTsKKyAgICAgICAgbUJpdG1hcE91dC5zZXRQaXhlbHMob3V0LCAwLCB3aWR0aCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHJldHVybiB0OworICAgIH0KIAotICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLnYoIkltZyIsICJmcmFtZSB0aW1lIG1zICIgKyB0KTsKKyAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIHNlZWtCYXIsIGludCBwcm9ncmVzcywgYm9vbGVhbiBmcm9tVXNlcikgeworICAgICAgICBpZiAoZnJvbVVzZXIpIHsKKworICAgICAgICAgICAgaWYoc2Vla0JhciA9PSBtUmFkaXVzU2Vla0JhcikgeworICAgICAgICAgICAgICAgIGZsb2F0IGZSYWRpdXMgPSBwcm9ncmVzcyAvIDEwMC4wZjsKKyAgICAgICAgICAgICAgICBmUmFkaXVzICo9IChmbG9hdCkoTUFYX1JBRElVUyk7CisgICAgICAgICAgICAgICAgbVJhZGl1cyA9IChpbnQpZlJhZGl1czsKKworICAgICAgICAgICAgICAgIG1TY3JpcHQuc2V0X3JhZGl1cyhtUmFkaXVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoc2Vla0JhciA9PSBtSW5CbGFja1NlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBtSW5CbGFjayA9IChmbG9hdClwcm9ncmVzczsKKyAgICAgICAgICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldExldmVscyhtSW5CbGFjaywgbU91dEJsYWNrLCBtSW5XaGl0ZSwgbU91dFdoaXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoc2Vla0JhciA9PSBtT3V0QmxhY2tTZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgbU91dEJsYWNrID0gKGZsb2F0KXByb2dyZXNzOworICAgICAgICAgICAgICAgIG1TY3JpcHRWQmx1ci5pbnZva2Vfc2V0TGV2ZWxzKG1JbkJsYWNrLCBtT3V0QmxhY2ssIG1JbldoaXRlLCBtT3V0V2hpdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihzZWVrQmFyID09IG1JbldoaXRlU2Vla0JhcikgeworICAgICAgICAgICAgICAgIG1JbldoaXRlID0gKGZsb2F0KXByb2dyZXNzICsgMTI3LjBmOworICAgICAgICAgICAgICAgIG1TY3JpcHRWQmx1ci5pbnZva2Vfc2V0TGV2ZWxzKG1JbkJsYWNrLCBtT3V0QmxhY2ssIG1JbldoaXRlLCBtT3V0V2hpdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihzZWVrQmFyID09IG1PdXRXaGl0ZVNlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBtT3V0V2hpdGUgPSAoZmxvYXQpcHJvZ3Jlc3MgKyAxMjcuMGY7CisgICAgICAgICAgICAgICAgbVNjcmlwdFZCbHVyLmludm9rZV9zZXRMZXZlbHMobUluQmxhY2ssIG1PdXRCbGFjaywgbUluV2hpdGUsIG1PdXRXaGl0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbUdhbW1hU2Vla0JhcikgeworICAgICAgICAgICAgICAgIG1HYW1tYSA9IChmbG9hdClwcm9ncmVzcy8xMDAuMGY7CisgICAgICAgICAgICAgICAgbUdhbW1hID0gTWF0aC5tYXgobUdhbW1hLCAwLjFmKTsKKyAgICAgICAgICAgICAgICBtR2FtbWEgPSAxLjBmIC8gbUdhbW1hOworICAgICAgICAgICAgICAgIG1TY3JpcHRWQmx1ci5pbnZva2Vfc2V0R2FtbWEobUdhbW1hKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoc2Vla0JhciA9PSBtU2F0dXJhdGlvblNlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBtU2F0dXJhdGlvbiA9IChmbG9hdClwcm9ncmVzcyAvIDUwLjBmOworICAgICAgICAgICAgICAgIG1TY3JpcHRWQmx1ci5pbnZva2Vfc2V0U2F0dXJhdGlvbihtU2F0dXJhdGlvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvbmcgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGlmICh0cnVlKSB7CisgICAgICAgICAgICAgICAgbVNjcmlwdC5pbnZva2VfZmlsdGVyKCk7CisgICAgICAgICAgICAgICAgbVJTLmZpbmlzaCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBqYXZhRmlsdGVyKCk7CisgICAgICAgICAgICAgICAgbURpc3BsYXlWaWV3LmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHQ7CisgICAgICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLnYoIkltZyIsICJSZW5kZXJzY3JpcHQgZnJhbWUgdGltZSBjb3JlIG1zICIgKyB0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMTksNDUgKzMxMSw1NCBAQAogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5tYWluKTsKIAotICAgICAgICBtQml0bWFwID0gbG9hZEJpdG1hcChSLmRyYXdhYmxlLmRhdGEpOworICAgICAgICBtQml0bWFwSW4gPSBsb2FkQml0bWFwKFIuZHJhd2FibGUuZGF0YSk7CisgICAgICAgIG1CaXRtYXBPdXQgPSBsb2FkQml0bWFwKFIuZHJhd2FibGUuZGF0YSk7CisgICAgICAgIG1CaXRtYXBTY3JhdGNoID0gbG9hZEJpdG1hcChSLmRyYXdhYmxlLmRhdGEpOwogCiAgICAgICAgIG1TdXJmYWNlVmlldyA9IChTdXJmYWNlVmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3VyZmFjZSk7CiAgICAgICAgIG1TdXJmYWNlVmlldy5nZXRIb2xkZXIoKS5hZGRDYWxsYmFjayh0aGlzKTsKIAogICAgICAgICBtRGlzcGxheVZpZXcgPSAoSW1hZ2VWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5kaXNwbGF5KTsKLSAgICAgICAgbURpc3BsYXlWaWV3LnNldEltYWdlQml0bWFwKG1CaXRtYXApOworICAgICAgICBtRGlzcGxheVZpZXcuc2V0SW1hZ2VCaXRtYXAobUJpdG1hcE91dCk7CiAKLSAgICAgICAgKChTZWVrQmFyKSBmaW5kVmlld0J5SWQoUi5pZC50aHJlc2hvbGQpKS5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICBuZXcgU2Vla0Jhci5PblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgc2Vla0JhciwgaW50IHByb2dyZXNzLCBib29sZWFuIGZyb21Vc2VyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZyb21Vc2VyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QYXJhbXMudGhyZXNob2xkID0gcHJvZ3Jlc3MgLyAxMDAuMGY7Ci0gICAgICAgICAgICAgICAgICAgIG1QYXJhbXNBbGxvY2F0aW9uLmRhdGEobVBhcmFtcyk7CisgICAgICAgIG1SYWRpdXNTZWVrQmFyID0gKFNlZWtCYXIpIGZpbmRWaWV3QnlJZChSLmlkLnJhZGl1cyk7CisgICAgICAgIG1SYWRpdXNTZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW52b2thYmxlLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmFGaWx0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRtYXAuc2V0UGl4ZWxzKG1PdXREYXRhLCAwLCBtUGFyYW1zLm91dFdpZHRoLCAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1zLm91dFdpZHRoLCBtUGFyYW1zLm91dEhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGlzcGxheVZpZXcuaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICBtSW5CbGFja1NlZWtCYXIgPSAoU2Vla0JhcilmaW5kVmlld0J5SWQoUi5pZC5pbkJsYWNrKTsKKyAgICAgICAgbUluQmxhY2tTZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtSW5CbGFja1NlZWtCYXIuc2V0TWF4KDEyOCk7CisgICAgICAgIG1JbkJsYWNrU2Vla0Jhci5zZXRQcm9ncmVzcygwKTsKKyAgICAgICAgbU91dEJsYWNrU2Vla0JhciA9IChTZWVrQmFyKWZpbmRWaWV3QnlJZChSLmlkLm91dEJsYWNrKTsKKyAgICAgICAgbU91dEJsYWNrU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbU91dEJsYWNrU2Vla0Jhci5zZXRNYXgoMTI4KTsKKyAgICAgICAgbU91dEJsYWNrU2Vla0Jhci5zZXRQcm9ncmVzcygwKTsKIAotICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7Ci0gICAgICAgICAgICB9CisgICAgICAgIG1JbldoaXRlU2Vla0JhciA9IChTZWVrQmFyKWZpbmRWaWV3QnlJZChSLmlkLmluV2hpdGUpOworICAgICAgICBtSW5XaGl0ZVNlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1JbldoaXRlU2Vla0Jhci5zZXRNYXgoMTI4KTsKKyAgICAgICAgbUluV2hpdGVTZWVrQmFyLnNldFByb2dyZXNzKDEyOCk7CisgICAgICAgIG1PdXRXaGl0ZVNlZWtCYXIgPSAoU2Vla0JhcilmaW5kVmlld0J5SWQoUi5pZC5vdXRXaGl0ZSk7CisgICAgICAgIG1PdXRXaGl0ZVNlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1PdXRXaGl0ZVNlZWtCYXIuc2V0TWF4KDEyOCk7CisgICAgICAgIG1PdXRXaGl0ZVNlZWtCYXIuc2V0UHJvZ3Jlc3MoMTI4KTsKIAotICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7CisgICAgICAgIG1HYW1tYVNlZWtCYXIgPSAoU2Vla0JhcilmaW5kVmlld0J5SWQoUi5pZC5pbkdhbW1hKTsKKyAgICAgICAgbUdhbW1hU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbUdhbW1hU2Vla0Jhci5zZXRNYXgoMTUwKTsKKyAgICAgICAgbUdhbW1hU2Vla0Jhci5zZXRQcm9ncmVzcygxMDApOworCisgICAgICAgIG1TYXR1cmF0aW9uU2Vla0JhciA9IChTZWVrQmFyKWZpbmRWaWV3QnlJZChSLmlkLmluU2F0dXJhdGlvbik7CisgICAgICAgIG1TYXR1cmF0aW9uU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbVNhdHVyYXRpb25TZWVrQmFyLnNldFByb2dyZXNzKDUwKTsKKworICAgICAgICBtQmVuY2htYXJrUmVzdWx0ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5iZW5jaG1hcmtUZXh0KTsKKyAgICAgICAgbUJlbmNobWFya1Jlc3VsdC5zZXRUZXh0KCJCZW5jaG1hcmsgbm8geWV0IHJ1biIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDcmVhdGVkKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7Ci0gICAgICAgIG1QYXJhbXMgPSBjcmVhdGVQYXJhbXMoKTsKLSAgICAgICAgbUludm9rYWJsZSA9IGNyZWF0ZVNjcmlwdCgpOwotCi0gICAgICAgIG1JbnZva2FibGUuZXhlY3V0ZSgpOworICAgICAgICBjcmVhdGVTY3JpcHQoKTsKKyAgICAgICAgbVNjcmlwdC5pbnZva2VfZmlsdGVyKCk7CisgICAgICAgIG1SUy5maW5pc2goKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CkBAIC0xNjYsNTQgKzM2NywzOCBAQAogICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VEZXN0cm95ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKICAgICB9CiAKLSAgICBwcml2YXRlIFNjcmlwdC5JbnZva2FibGUgY3JlYXRlU2NyaXB0KCkgeworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTY3JpcHQoKSB7CiAgICAgICAgIG1SUyA9IFJlbmRlclNjcmlwdC5jcmVhdGUoKTsKICAgICAgICAgbVJTLm1NZXNzYWdlQ2FsbGJhY2sgPSBuZXcgRmlsdGVyQ2FsbGJhY2soKTsKIAotICAgICAgICBtUGFyYW1zVHlwZSA9IFR5cGUuY3JlYXRlRnJvbUNsYXNzKG1SUywgUGFyYW1zLmNsYXNzLCAxLCAiUGFyYW1ldGVycyIpOwotICAgICAgICBtUGFyYW1zQWxsb2NhdGlvbiA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQobVJTLCBtUGFyYW1zVHlwZSk7Ci0gICAgICAgIG1QYXJhbXNBbGxvY2F0aW9uLmRhdGEobVBhcmFtcyk7CisgICAgICAgIG1JblBpeGVsc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZUJpdG1hcFJlZihtUlMsIG1CaXRtYXBJbik7CisgICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVCaXRtYXBSZWYobVJTLCBtQml0bWFwT3V0KTsKIAotICAgICAgICBmaW5hbCBpbnQgcGl4ZWxDb3VudCA9IG1QYXJhbXMuaW5XaWR0aCAqIG1QYXJhbXMuaW5IZWlnaHQ7CisgICAgICAgIFR5cGUuQnVpbGRlciB0YiA9IG5ldyBUeXBlLkJ1aWxkZXIobVJTLCBFbGVtZW50LkYzMl80KG1SUykpOworICAgICAgICB0Yi5hZGQoYW5kcm9pZC5yZW5kZXJzY3JpcHQuRGltZW5zaW9uLlgsIG1CaXRtYXBJbi5nZXRXaWR0aCgpKTsKKyAgICAgICAgdGIuYWRkKGFuZHJvaWQucmVuZGVyc2NyaXB0LkRpbWVuc2lvbi5ZLCBtQml0bWFwSW4uZ2V0SGVpZ2h0KCkpOworICAgICAgICBtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24xID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIHRiLmNyZWF0ZSgpKTsKKyAgICAgICAgbVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uMiA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQobVJTLCB0Yi5jcmVhdGUoKSk7CiAKLSAgICAgICAgbVBpeGVsVHlwZSA9IFR5cGUuY3JlYXRlRnJvbUNsYXNzKG1SUywgUGl4ZWwuY2xhc3MsIDEsICJQaXhlbCIpOwotICAgICAgICBtSW5QaXhlbHNBbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChtUlMsCi0gICAgICAgICAgICAgICAgRWxlbWVudC5jcmVhdGVVc2VyKG1SUywgRWxlbWVudC5EYXRhVHlwZS5TSUdORURfMzIpLAotICAgICAgICAgICAgICAgIHBpeGVsQ291bnQpOwotICAgICAgICBtT3V0UGl4ZWxzQWxsb2NhdGlvbiA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQobVJTLAotICAgICAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlVXNlcihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuU0lHTkVEXzMyKSwKLSAgICAgICAgICAgICAgICBwaXhlbENvdW50KTsKKyAgICAgICAgbVNjcmlwdFZCbHVyID0gbmV3IFNjcmlwdENfVmVydGljYWxfYmx1cihtUlMsIGdldFJlc291cmNlcygpLCBSLnJhdy52ZXJ0aWNhbF9ibHVyLCBmYWxzZSk7CisgICAgICAgIG1TY3JpcHRIQmx1ciA9IG5ldyBTY3JpcHRDX0hvcml6b250YWxfYmx1cihtUlMsIGdldFJlc291cmNlcygpLCBSLnJhdy5ob3Jpem9udGFsX2JsdXIsIGZhbHNlKTsKIAotICAgICAgICBtSW5EYXRhID0gbmV3IGludFtwaXhlbENvdW50XTsKLSAgICAgICAgbUJpdG1hcC5nZXRQaXhlbHMobUluRGF0YSwgMCwgbVBhcmFtcy5pbldpZHRoLCAwLCAwLCBtUGFyYW1zLmluV2lkdGgsIG1QYXJhbXMuaW5IZWlnaHQpOwotICAgICAgICBtSW5QaXhlbHNBbGxvY2F0aW9uLmRhdGEobUluRGF0YSk7CisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19UaHJlc2hvbGQobVJTLCBnZXRSZXNvdXJjZXMoKSwgUi5yYXcudGhyZXNob2xkLCBmYWxzZSk7CisgICAgICAgIG1TY3JpcHQuc2V0X3dpZHRoKG1CaXRtYXBJbi5nZXRXaWR0aCgpKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfaGVpZ2h0KG1CaXRtYXBJbi5nZXRIZWlnaHQoKSk7CisgICAgICAgIG1TY3JpcHQuc2V0X3JhZGl1cyhtUmFkaXVzKTsKIAotICAgICAgICBtT3V0RGF0YSA9IG5ldyBpbnRbcGl4ZWxDb3VudF07Ci0gICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uLmRhdGEobU91dERhdGEpOworICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldExldmVscyhtSW5CbGFjaywgbU91dEJsYWNrLCBtSW5XaGl0ZSwgbU91dFdoaXRlKTsKKyAgICAgICAgbVNjcmlwdFZCbHVyLmludm9rZV9zZXRHYW1tYShtR2FtbWEpOworICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldFNhdHVyYXRpb24obVNhdHVyYXRpb24pOwogCi0gICAgICAgIFNjcmlwdEMuQnVpbGRlciBzYiA9IG5ldyBTY3JpcHRDLkJ1aWxkZXIobVJTKTsKLSAgICAgICAgc2Iuc2V0VHlwZShtUGFyYW1zVHlwZSwgIlBhcmFtcyIsIDApOwotICAgICAgICBzYi5zZXRUeXBlKG1QaXhlbFR5cGUsICJJblBpeGVsIiwgMSk7Ci0gICAgICAgIHNiLnNldFR5cGUobVBpeGVsVHlwZSwgIk91dFBpeGVsIiwgMik7Ci0gICAgICAgIHNiLnNldFR5cGUodHJ1ZSwgMik7Ci0gICAgICAgIFNjcmlwdC5JbnZva2FibGUgaW52b2thYmxlID0gc2IuYWRkSW52b2thYmxlKCJtYWluIik7Ci0gICAgICAgIHNiLnNldFNjcmlwdChnZXRSZXNvdXJjZXMoKSwgUi5yYXcudGhyZXNob2xkKTsKLSAgICAgICAgLy9zYi5zZXRSb290KHRydWUpOworICAgICAgICBtU2NyaXB0LmJpbmRfSW5QaXhlbChtSW5QaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX091dFBpeGVsKG1PdXRQaXhlbHNBbGxvY2F0aW9uKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX1NjcmF0Y2hQaXhlbDEobVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uMSk7CisgICAgICAgIG1TY3JpcHQuYmluZF9TY3JhdGNoUGl4ZWwyKG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjIpOwogCi0gICAgICAgIFNjcmlwdEMgc2NyaXB0ID0gc2IuY3JlYXRlKCk7Ci0gICAgICAgIHNjcmlwdC5iaW5kQWxsb2NhdGlvbihtUGFyYW1zQWxsb2NhdGlvbiwgMCk7Ci0gICAgICAgIHNjcmlwdC5iaW5kQWxsb2NhdGlvbihtSW5QaXhlbHNBbGxvY2F0aW9uLCAxKTsKLSAgICAgICAgc2NyaXB0LmJpbmRBbGxvY2F0aW9uKG1PdXRQaXhlbHNBbGxvY2F0aW9uLCAyKTsKLQotICAgICAgICByZXR1cm4gaW52b2thYmxlOwotICAgIH0KLQotICAgIHByaXZhdGUgUGFyYW1zIGNyZWF0ZVBhcmFtcygpIHsKLSAgICAgICAgZmluYWwgUGFyYW1zIHBhcmFtcyA9IG5ldyBQYXJhbXMoKTsKLSAgICAgICAgcGFyYW1zLmluV2lkdGggPSBwYXJhbXMub3V0V2lkdGggPSBtQml0bWFwLmdldFdpZHRoKCk7Ci0gICAgICAgIHBhcmFtcy5pbkhlaWdodCA9IHBhcmFtcy5vdXRIZWlnaHQgPSBtQml0bWFwLmdldEhlaWdodCgpOwotICAgICAgICBwYXJhbXMudGhyZXNob2xkID0gMC41ZjsKLSAgICAgICAgcmV0dXJuIHBhcmFtczsKKyAgICAgICAgbVNjcmlwdC5zZXRfdkJsdXJTY3JpcHQobVNjcmlwdFZCbHVyKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfaEJsdXJTY3JpcHQobVNjcmlwdEhCbHVyKTsKICAgICB9CiAKICAgICBwcml2YXRlIEJpdG1hcCBsb2FkQml0bWFwKGludCByZXNvdXJjZSkgewpAQCAtMjI5LDQgKzQxNCwzMCBAQAogICAgICAgICBzb3VyY2UucmVjeWNsZSgpOwogICAgICAgICByZXR1cm4gYjsKICAgICB9CisKKyAgICAvLyBidXR0b24gaG9vaworICAgIHB1YmxpYyB2b2lkIGJlbmNobWFyayhWaWV3IHYpIHsKKyAgICAgICAgYW5kcm9pZC51dGlsLkxvZy52KCJJbWciLCAiQmVuY2htYXJraW5nIik7CisgICAgICAgIGludCBvbGRSYWRpdXMgPSBtUmFkaXVzOworICAgICAgICBtUmFkaXVzID0gTUFYX1JBRElVUzsKKyAgICAgICAgbVNjcmlwdC5zZXRfcmFkaXVzKG1SYWRpdXMpOworCisgICAgICAgIGxvbmcgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBtU2NyaXB0Lmludm9rZV9maWx0ZXIoKTsKKyAgICAgICAgbVJTLmZpbmlzaCgpOworCisgICAgICAgIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0OworICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLnYoIkltZyIsICJSZW5kZXJzY3JpcHQgZnJhbWUgdGltZSBjb3JlIG1zICIgKyB0KTsKKworICAgICAgICAvL2xvbmcgamF2YVRpbWUgPSBqYXZhRmlsdGVyKCk7CisgICAgICAgIC8vbUJlbmNobWFya1Jlc3VsdC5zZXRUZXh0KCJSUzogIiArIHQgKyAiIG1zICBKYXZhOiAiICsgamF2YVRpbWUgKyAiIG1zIik7CisgICAgICAgIG1CZW5jaG1hcmtSZXN1bHQuc2V0VGV4dCgiUlM6ICIgKyB0ICsgIiBtcyIpOworCisgICAgICAgIG1SYWRpdXMgPSBvbGRSYWRpdXM7CisgICAgICAgIG1TY3JpcHQuc2V0X3JhZGl1cyhtUmFkaXVzKTsKKworICAgICAgICBtU2NyaXB0Lmludm9rZV9maWx0ZXIoKTsKKyAgICAgICAgbVJTLmZpbmlzaCgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL2hvcml6b250YWxfYmx1ci5ycyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL2hvcml6b250YWxfYmx1ci5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmZmYWM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvaG9yaXpvbnRhbF9ibHVyLnJzCkBAIC0wLDAgKzEsMzAgQEAKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjaW5jbHVkZSAiaXAucnNoIgorCit2b2lkIHJvb3QoY29uc3Qgdm9pZCAqdl9pbiwgdm9pZCAqdl9vdXQsIGNvbnN0IHZvaWQgKnVzckRhdGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICBmbG9hdDQgKm91dHB1dCA9IChmbG9hdDQgKil2X291dDsKKyAgICBjb25zdCBGaWx0ZXJTdHJ1Y3QgKmZzID0gKGNvbnN0IEZpbHRlclN0cnVjdCAqKXVzckRhdGE7CisgICAgY29uc3QgZmxvYXQ0ICppbnB1dCA9IChjb25zdCBmbG9hdDQgKilyc0dldEVsZW1lbnRBdChmcy0+YWluLCAwLCB5KTsKKworICAgIGZsb2F0MyBibHVycmVkUGl4ZWwgPSAwOworICAgIGNvbnN0IGZsb2F0ICpnUHRyID0gZnMtPmdhdXNzaWFuOworICAgIGlmICgoeCA+IGZzLT5yYWRpdXMpICYmICh4IDwgKGZzLT53aWR0aCAtIGZzLT5yYWRpdXMpKSkgeworICAgICAgICBjb25zdCBmbG9hdDQgKmkgPSBpbnB1dCArICh4IC0gZnMtPnJhZGl1cyk7CisgICAgICAgIGZvcihpbnQgciA9IC1mcy0+cmFkaXVzOyByIDw9IGZzLT5yYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBpLT54eXogKiBnUHRyWzBdOworICAgICAgICAgICAgZ1B0cisrOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yKGludCByID0gLWZzLT5yYWRpdXM7IHIgPD0gZnMtPnJhZGl1czsgciArKykgeworICAgICAgICAgICAgLy8gU3RlcHBpbmcgbGVmdCBhbmQgcmlnaHQgYXdheSBmcm9tIHRoZSBwaXhlbAorICAgICAgICAgICAgaW50IHZhbGlkVyA9IHJzQ2xhbXAoeCArIHIsICh1aW50KTAsICh1aW50KShmcy0+d2lkdGggLSAxKSk7CisgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gaW5wdXRbdmFsaWRXXS54eXogKiBnUHRyWzBdOworICAgICAgICAgICAgZ1B0cisrOworICAgICAgICB9CisgICAgfQorCisgICAgb3V0cHV0LT54eXogPSBibHVycmVkUGl4ZWw7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL2lwLnJzaCBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL2lwLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDdhNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvaXAucnNoCkBAIC0wLDAgKzEsMTUgQEAKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQucnMuaW1hZ2UpCisKKyNkZWZpbmUgTUFYX1JBRElVUyAyNQorCit0eXBlZGVmIHN0cnVjdCBGaWx0ZXJTdHJ1Y3RfcyB7CisgICAgcnNfYWxsb2NhdGlvbiBhaW47CisKKyAgICBmbG9hdCAqZ2F1c3NpYW47IC8vW01BWF9SQURJVVMgKiAyICsgMV07CisgICAgaW50IGhlaWdodDsKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IHJhZGl1czsKKworfSBGaWx0ZXJTdHJ1Y3Q7CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvdGhyZXNob2xkLnJzIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvdGhyZXNob2xkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOTQ1YTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS90aHJlc2hvbGQucnMKQEAgLTAsMCArMSw5NyBAQAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNpbmNsdWRlICJpcC5yc2giCisKK2ludCBoZWlnaHQ7CitpbnQgd2lkdGg7CitpbnQgcmFkaXVzOworCit1Y2hhcjQgKiBJblBpeGVsOwordWNoYXI0ICogT3V0UGl4ZWw7CitmbG9hdDQgKiBTY3JhdGNoUGl4ZWwxOworZmxvYXQ0ICogU2NyYXRjaFBpeGVsMjsKKworI3ByYWdtYSBycyBleHBvcnRfdmFyKGhlaWdodCwgd2lkdGgsIHJhZGl1cywgSW5QaXhlbCwgT3V0UGl4ZWwsIFNjcmF0Y2hQaXhlbDEsIFNjcmF0Y2hQaXhlbDIsIHZCbHVyU2NyaXB0LCBoQmx1clNjcmlwdCkKKyNwcmFnbWEgcnMgZXhwb3J0X2Z1bmMoZmlsdGVyKTsKKworcnNfc2NyaXB0IHZCbHVyU2NyaXB0OworcnNfc2NyaXB0IGhCbHVyU2NyaXB0OworCitjb25zdCBpbnQgQ01EX0ZJTklTSEVEID0gMTsKKworLy8gU3RvcmUgb3VyIGNvZWZmaWNpZW50cyBoZXJlCitzdGF0aWMgZmxvYXQgZ2F1c3NpYW5bTUFYX1JBRElVUyAqIDIgKyAxXTsKKworCitzdGF0aWMgdm9pZCBjb21wdXRlR2F1c3NpYW5XZWlnaHRzKCkgeworICAgIC8vIENvbXB1dGUgZ2F1c3NpYW4gd2VpZ2h0cyBmb3IgdGhlIGJsdXIKKyAgICAvLyBlIGlzIHRoZSBldWxlcidzIG51bWJlcgorICAgIGZsb2F0IGUgPSAyLjcxODI4MTgyODQ1OTA0NWY7CisgICAgZmxvYXQgcGkgPSAzLjE0MTU5MjY1MzU4OTc5MzJmOworICAgIC8vIGcoeCkgPSAoIDEgLyBzcXJ0KCAyICogcGkgKSAqIHNpZ21hKSAqIGUgXiAoIC14XjIgLyAyICogc2lnbWFeMiApCisgICAgLy8geCBpcyBvZiB0aGUgZm9ybSBbLXJhZGl1cyAuLiAwIC4uIHJhZGl1c10KKyAgICAvLyBhbmQgc2lnbWEgdmFyaWVzIHdpdGggcmFkaXVzLgorICAgIC8vIEJhc2VkIG9uIHNvbWUgZXhwZXJpbWVudGFsIHJhZGl1cyB2YWx1ZXMgYW5kIHNpZ21hJ3MKKyAgICAvLyB3ZSBhcHByb3hpbWF0ZWx5IGZpdCBzaWdtYSA9IGYocmFkaXVzKSBhcworICAgIC8vIHNpZ21hID0gcmFkaXVzICogMC40ICArIDAuNgorICAgIC8vIFRoZSBsYXJnZXIgdGhlIHJhZGl1cyBnZXRzLCB0aGUgbW9yZSBvdXIgZ2F1c3NpYW4gYmx1cgorICAgIC8vIHdpbGwgcmVzZW1ibGUgYSBib3ggYmx1ciBzaW5jZSB3aXRoIGxhcmdlIHNpZ21hCisgICAgLy8gdGhlIGdhdXNzaWFuIGN1cnZlIGJlZ2lucyB0byBsb3NlIGl0cyBzaGFwZQorICAgIGZsb2F0IHNpZ21hID0gMC40ZiAqIChmbG9hdClyYWRpdXMgKyAwLjZmOworCisgICAgLy8gTm93IGNvbXB1dGUgdGhlIGNvZWZmaWNpbnRzCisgICAgLy8gV2Ugd2lsbCBzdG9yZSBzb21lIHJlZHVuZGFudCB2YWx1ZXMgdG8gc2F2ZSBzb21lIG1hdGggZHVyaW5nCisgICAgLy8gdGhlIGJsdXIgY2FsY3VsYXRpb25zCisgICAgLy8gcHJlY29tcHV0ZSBzb21lIHZhbHVlcworICAgIGZsb2F0IGNvZWZmMSA9IDEuMGYgLyAoc3FydCggMi4wZiAqIHBpICkgKiBzaWdtYSk7CisgICAgZmxvYXQgY29lZmYyID0gLSAxLjBmIC8gKDIuMGYgKiBzaWdtYSAqIHNpZ21hKTsKKworICAgIGZsb2F0IG5vcm1hbGl6ZUZhY3RvciA9IDAuMGY7CisgICAgZmxvYXQgZmxvYXRSID0gMC4wZjsKKyAgICBpbnQgcjsKKyAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgIGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICBnYXVzc2lhbltyICsgcmFkaXVzXSA9IGNvZWZmMSAqIHBvdyhlLCBmbG9hdFIgKiBmbG9hdFIgKiBjb2VmZjIpOworICAgICAgICBub3JtYWxpemVGYWN0b3IgKz0gZ2F1c3NpYW5bciArIHJhZGl1c107CisgICAgfQorCisgICAgLy9Ob3cgd2UgbmVlZCB0byBub3JtYWxpemUgdGhlIHdlaWdodHMgYmVjYXVzZSBhbGwgb3VyIGNvZWZmaWNpZW50cyBuZWVkIHRvIGFkZCB1cCB0byBvbmUKKyAgICBub3JtYWxpemVGYWN0b3IgPSAxLjBmIC8gbm9ybWFsaXplRmFjdG9yOworICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgZmxvYXRSID0gKGZsb2F0KXI7CisgICAgICAgIGdhdXNzaWFuW3IgKyByYWRpdXNdICo9IG5vcm1hbGl6ZUZhY3RvcjsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgY29weUlucHV0KCkgeworICAgIFJTX0RFQlVHX01BUktFUjsKKyAgICByc19hbGxvY2F0aW9uIGFpbiA9IHJzR2V0QWxsb2NhdGlvbihJblBpeGVsKTsKKyAgICB1aW50MzJfdCBkaW14ID0gcnNBbGxvY2F0aW9uR2V0RGltWChhaW4pOworICAgIHVpbnQzMl90IGRpbXkgPSByc0FsbG9jYXRpb25HZXREaW1ZKGFpbik7CisgICAgZm9yKHVpbnQzMl90IHkgPSAwOyB5IDwgZGlteTsgeSsrKSB7CisgICAgICAgIGZvcih1aW50MzJfdCB4ID0gMDsgeCA8IGRpbXg7IHgrKykgeworICAgICAgICAgICAgU2NyYXRjaFBpeGVsMVt4ICsgeSAqIGRpbXhdID0gY29udmVydF9mbG9hdDQoSW5QaXhlbFt4ICsgeSAqIGRpbXhdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBSU19ERUJVR19NQVJLRVI7Cit9CisKK3ZvaWQgZmlsdGVyKCkgeworICAgIGNvcHlJbnB1dCgpOworICAgIGNvbXB1dGVHYXVzc2lhbldlaWdodHMoKTsKKworICAgIEZpbHRlclN0cnVjdCBmczsKKyAgICBmcy5nYXVzc2lhbiA9IGdhdXNzaWFuOworICAgIGZzLndpZHRoID0gd2lkdGg7CisgICAgZnMuaGVpZ2h0ID0gaGVpZ2h0OworICAgIGZzLnJhZGl1cyA9IHJhZGl1czsKKworICAgIGZzLmFpbiA9IHJzR2V0QWxsb2NhdGlvbihTY3JhdGNoUGl4ZWwxKTsKKyAgICByc0ZvckVhY2goaEJsdXJTY3JpcHQsIGZzLmFpbiwgcnNHZXRBbGxvY2F0aW9uKFNjcmF0Y2hQaXhlbDIpLCAmZnMpOworCisgICAgZnMuYWluID0gcnNHZXRBbGxvY2F0aW9uKFNjcmF0Y2hQaXhlbDIpOworICAgIHJzRm9yRWFjaCh2Qmx1clNjcmlwdCwgZnMuYWluLCByc0dldEFsbG9jYXRpb24oT3V0UGl4ZWwpLCAmZnMpOworICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoQ01EX0ZJTklTSEVEKTsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvdmVydGljYWxfYmx1ci5ycyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL3ZlcnRpY2FsX2JsdXIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkwMWQyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL3ZlcnRpY2FsX2JsdXIucnMKQEAgLTAsMCArMSw5MiBAQAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNpbmNsdWRlICJpcC5yc2giCisKK3N0YXRpYyBmbG9hdCBpbkJsYWNrOworc3RhdGljIGZsb2F0IG91dEJsYWNrOworc3RhdGljIGZsb2F0IGluV2hpdGU7CitzdGF0aWMgZmxvYXQgb3V0V2hpdGU7CitzdGF0aWMgZmxvYXQzIGdhbW1hOworc3RhdGljIGZsb2F0IHNhdHVyYXRpb247CisKK3N0YXRpYyBmbG9hdCBpbldNaW5JbkI7CitzdGF0aWMgZmxvYXQgb3V0V01pbk91dEI7CitzdGF0aWMgZmxvYXQgb3ZlckluV01pbkluQjsKK3N0YXRpYyByc19tYXRyaXgzeDMgY29sb3JNYXQ7CisKKyNwcmFnbWEgcnMgZXhwb3J0X2Z1bmMoc2V0TGV2ZWxzLCBzZXRTYXR1cmF0aW9uLCBzZXRHYW1tYSk7CisKK3ZvaWQgc2V0TGV2ZWxzKGZsb2F0IGlCbGssIGZsb2F0IG9CbGssIGZsb2F0IGlXaHQsIGZsb2F0IG9XaHQpIHsKKyAgICBpbkJsYWNrID0gaUJsazsKKyAgICBvdXRCbGFjayA9IG9CbGs7CisgICAgaW5XaGl0ZSA9IGlXaHQ7CisgICAgb3V0V2hpdGUgPSBvV2h0OworCisgICAgaW5XTWluSW5CID0gaW5XaGl0ZSAtIGluQmxhY2s7CisgICAgb3V0V01pbk91dEIgPSBvdXRXaGl0ZSAtIG91dEJsYWNrOworICAgIG92ZXJJbldNaW5JbkIgPSAxLmYgLyBpbldNaW5JbkI7Cit9CisKK3ZvaWQgc2V0U2F0dXJhdGlvbihmbG9hdCBzYXQpIHsKKyAgICBzYXR1cmF0aW9uID0gc2F0OworCisgICAgLy8gU2F0dXJhdGlvbgorICAgIC8vIExpbmVhciB3ZWlnaHRzCisgICAgLy9mbG9hdCByV2VpZ2h0ID0gMC4zMDg2ZjsKKyAgICAvL2Zsb2F0IGdXZWlnaHQgPSAwLjYwOTRmOworICAgIC8vZmxvYXQgYldlaWdodCA9IDAuMDgyMGY7CisKKyAgICAvLyBHYW1tYSAyLjIgd2VpZ2h0cyAod2UgaGF2ZW4ndCBjb252ZXJ0ZWQgb3VyIGltYWdlIHRvIGxpbmVhciBzcGFjZSB5ZXQgZm9yIHBlcmYgcmVhc29ucykKKyAgICBmbG9hdCByV2VpZ2h0ID0gMC4yOTlmOworICAgIGZsb2F0IGdXZWlnaHQgPSAwLjU4N2Y7CisgICAgZmxvYXQgYldlaWdodCA9IDAuMTE0ZjsKKworICAgIGZsb2F0IG9uZU1pbnVzUyA9IDEuMGYgLSBzYXR1cmF0aW9uOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMCwgMCwgb25lTWludXNTICogcldlaWdodCArIHNhdHVyYXRpb24pOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMCwgMSwgb25lTWludXNTICogcldlaWdodCk7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAwLCAyLCBvbmVNaW51c1MgKiByV2VpZ2h0KTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDEsIDAsIG9uZU1pbnVzUyAqIGdXZWlnaHQpOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMSwgMSwgb25lTWludXNTICogZ1dlaWdodCArIHNhdHVyYXRpb24pOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMSwgMiwgb25lTWludXNTICogZ1dlaWdodCk7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAyLCAwLCBvbmVNaW51c1MgKiBiV2VpZ2h0KTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDIsIDEsIG9uZU1pbnVzUyAqIGJXZWlnaHQpOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMiwgMiwgb25lTWludXNTICogYldlaWdodCArIHNhdHVyYXRpb24pOworfQorCit2b2lkIHNldEdhbW1hKGZsb2F0IGcpIHsKKyAgICBnYW1tYSA9IChmbG9hdDMpZzsKK30KKwordm9pZCByb290KGNvbnN0IHZvaWQgKnZfaW4sIHZvaWQgKnZfb3V0LCBjb25zdCB2b2lkICp1c3JEYXRhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgdWNoYXI0ICpvdXRwdXQgPSAodWNoYXI0ICopdl9vdXQ7CisgICAgY29uc3QgRmlsdGVyU3RydWN0ICpmcyA9IChjb25zdCBGaWx0ZXJTdHJ1Y3QgKil1c3JEYXRhOworICAgIGNvbnN0IGZsb2F0NCAqaW5wdXQgPSAoY29uc3QgZmxvYXQ0ICopcnNHZXRFbGVtZW50QXQoZnMtPmFpbiwgeCwgMCk7CisKKyAgICBmbG9hdDMgYmx1cnJlZFBpeGVsID0gMDsKKyAgICBjb25zdCBmbG9hdCAqZ1B0ciA9IGZzLT5nYXVzc2lhbjsKKyAgICBpZiAoKHkgPiBmcy0+cmFkaXVzKSAmJiAoeSA8IChmcy0+aGVpZ2h0IC0gZnMtPnJhZGl1cykpKSB7CisgICAgICAgIGNvbnN0IGZsb2F0NCAqaSA9IGlucHV0ICsgKCh5IC0gZnMtPnJhZGl1cykgKiBmcy0+d2lkdGgpOworICAgICAgICBmb3IoaW50IHIgPSAtZnMtPnJhZGl1czsgciA8PSBmcy0+cmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gaS0+eHl6ICogZ1B0clswXTsKKyAgICAgICAgICAgIGdQdHIrKzsKKyAgICAgICAgICAgIGkgKz0gZnMtPndpZHRoOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yKGludCByID0gLWZzLT5yYWRpdXM7IHIgPD0gZnMtPnJhZGl1czsgciArKykgeworICAgICAgICAgICAgaW50IHZhbGlkSCA9IHJzQ2xhbXAoeSArIHIsICh1aW50KTAsICh1aW50KShmcy0+aGVpZ2h0IC0gMSkpOworICAgICAgICAgICAgY29uc3QgZmxvYXQ0ICppID0gaW5wdXQgKyB2YWxpZEggKiBmcy0+d2lkdGg7CisgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gaS0+eHl6ICogZ1B0clswXTsKKyAgICAgICAgICAgIGdQdHIrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0MyB0ZW1wID0gcnNNYXRyaXhNdWx0aXBseSgmY29sb3JNYXQsIGJsdXJyZWRQaXhlbCk7CisgICAgdGVtcCA9IChjbGFtcCh0ZW1wLCAwLmYsIDI1NS5mKSAtIGluQmxhY2spICogb3ZlckluV01pbkluQjsKKyAgICBpZiAoZ2FtbWEueCAhPSAxLjBmKQorICAgICAgICB0ZW1wID0gcG93KHRlbXAsIChmbG9hdDMpZ2FtbWEpOworICAgIHRlbXAgPSBjbGFtcCh0ZW1wICogb3V0V01pbk91dEIgKyBvdXRCbGFjaywgMC5mLCAyNTUuZik7CisKKyAgICBvdXRwdXQtPnh5eiA9IGNvbnZlcnRfdWNoYXIzKHRlbXApOworICAgIC8vb3V0cHV0LT53ID0gaW5wdXQtPnc7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkLm1rIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZlNzdkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpICQoY2FsbCBhbGwtcmVuZGVyc2NyaXB0LWZpbGVzLXVuZGVyLCBzcmMpCisjTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQucmVuZGVyc2NyaXB0CisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBNb2RlbFZpZXdlcgorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5ZmU1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1vZGVsdmlld2VyIj4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iTW9kZWxWaWV3ZXIiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJTaW1wbGVNb2RlbCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlNpbXBsZU1vZGVsIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5CbGFjay5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iU2NlbmVHcmFwaCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlNjZW5lR3JhcGgiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5CbGFjay5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvZHJhd2FibGUvcm9ib3QucG5nIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3Jlcy9kcmF3YWJsZS9yb2JvdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczNTNmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvZHJhd2FibGUvcm9ib3QucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvcmF3L3JvYm90LmEzZCBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvcmF3L3JvYm90LmEzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDdkMzJiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3Jlcy9yYXcvcm9ib3QuYTNkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaC5qYXZhIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TY2VuZUdyYXBoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3ZTBjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaC5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCitpbXBvcnQgamF2YS5sYW5nLlJ1bnRpbWU7CisKK3B1YmxpYyBjbGFzcyBTY2VuZUdyYXBoIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBTY2VuZUdyYXBoVmlldyBtVmlldzsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICAvLyBDcmVhdGUgb3VyIFByZXZpZXcgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91cgorICAgICAgICAvLyBBY3Rpdml0eQorICAgICAgICBtVmlldyA9IG5ldyBTY2VuZUdyYXBoVmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtVmlldy5vblBhdXNlKCk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaFJTLmphdmEgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjZW5lR3JhcGhSUy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NzJhNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjZW5lR3JhcGhSUy5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5CdWlsZGVyOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5EZXB0aEZ1bmM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCitwdWJsaWMgY2xhc3MgU2NlbmVHcmFwaFJTIHsKKworICAgIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0xBU1RfRk9DVVMgPSAxOworCisgICAgaW50IG1XaWR0aDsKKyAgICBpbnQgbUhlaWdodDsKKyAgICBpbnQgbVJvdGF0aW9uOworCisgICAgcHVibGljIFNjZW5lR3JhcGhSUygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgbVJTID0gcnM7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgICAgIG1XaWR0aCA9IHdpZHRoOworICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBtUm90YXRpb24gPSAwOworICAgICAgICBpbml0UlMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgU2FtcGxlciBtU2FtcGxlcjsKKyAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUFNCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1QRkJhY2tncm91bmQ7CisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1QVkJhY2tncm91bmQ7CisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4Lk1hdHJpeEFsbG9jYXRpb24gbVBWQTsKKworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtR3JpZEltYWdlOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NQVjsKKworICAgIHByaXZhdGUgTWVzaCBtTWVzaDsKKworICAgIHByaXZhdGUgRm9udCBtSXRhbGljOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtVGV4dEFsbG9jOworCisgICAgcHJpdmF0ZSBTY3JpcHRDX1NjZW5lZ3JhcGggbVNjcmlwdDsKKyAgICBwcml2YXRlIFNjcmlwdENfVHJhbnNmb3JtIG1UcmFuc2Zvcm1TY3JpcHQ7CisKKyAgICBpbnQgbUxhc3RYOworICAgIGludCBtTGFzdFk7CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaEV2ZW50KGludCB4LCBpbnQgeSkgeworICAgICAgICBpbnQgZHggPSBtTGFzdFggLSB4OworICAgICAgICBpZihNYXRoLmFicyhkeCkgPiA1MCB8fCBNYXRoLmFicyhkeCkgPCAzKSB7CisgICAgICAgICAgICBkeCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtUm90YXRpb24gLT0gZHg7CisgICAgICAgIGlmKG1Sb3RhdGlvbiA+IDM2MCkgeworICAgICAgICAgICAgbVJvdGF0aW9uIC09IDM2MDsKKyAgICAgICAgfQorICAgICAgICBpZihtUm90YXRpb24gPCAwKSB7CisgICAgICAgICAgICBtUm90YXRpb24gKz0gMzYwOworICAgICAgICB9CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1JvdGF0ZSgtKGZsb2F0KW1Sb3RhdGlvbik7CisKKyAgICAgICAgbUxhc3RYID0geDsKKyAgICAgICAgbUxhc3RZID0geTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFBGUygpIHsKKyAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYiA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihtUlMpOworCisgICAgICAgIGIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7CisgICAgICAgIGIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgYi5zZXREZXB0aE1hc2sodHJ1ZSk7CisgICAgICAgIG1QU0JhY2tncm91bmQgPSBiLmNyZWF0ZSgpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQRlNCYWNrZ3JvdW5kKG1QU0JhY2tncm91bmQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UEYoKSB7CisgICAgICAgIFNhbXBsZXIuQnVpbGRlciBicyA9IG5ldyBTYW1wbGVyLkJ1aWxkZXIobVJTKTsKKyAgICAgICAgYnMuc2V0TWluKFNhbXBsZXIuVmFsdWUuTElORUFSKTsKKyAgICAgICAgYnMuc2V0TWFnKFNhbXBsZXIuVmFsdWUuTElORUFSKTsKKyAgICAgICAgYnMuc2V0V3JhcFMoU2FtcGxlci5WYWx1ZS5DTEFNUCk7CisgICAgICAgIGJzLnNldFdyYXBUKFNhbXBsZXIuVmFsdWUuV1JBUCk7CisgICAgICAgIG1TYW1wbGVyID0gYnMuY3JlYXRlKCk7CisKKyAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIgYiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlcihtUlMpOworICAgICAgICBiLnNldFRleHR1cmUoUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRW52TW9kZS5SRVBMQUNFLAorICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRm9ybWF0LlJHQkEsIDApOworICAgICAgICBtUEZCYWNrZ3JvdW5kID0gYi5jcmVhdGUoKTsKKyAgICAgICAgbVBGQmFja2dyb3VuZC5iaW5kU2FtcGxlcihtU2FtcGxlciwgMCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1BGQmFja2dyb3VuZChtUEZCYWNrZ3JvdW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFBWKCkgeworICAgICAgICBQcm9ncmFtVmVydGV4LkJ1aWxkZXIgcHZiID0gbmV3IFByb2dyYW1WZXJ0ZXguQnVpbGRlcihtUlMpOworICAgICAgICBtUFZCYWNrZ3JvdW5kID0gcHZiLmNyZWF0ZSgpOworCisgICAgICAgIG1QVkEgPSBuZXcgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uKG1SUyk7CisgICAgICAgIG1QVkJhY2tncm91bmQuYmluZEFsbG9jYXRpb24obVBWQSk7CisgICAgICAgIG1QVkEuc2V0dXBQcm9qZWN0aW9uTm9ybWFsaXplZChtV2lkdGgsIG1IZWlnaHQpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQVkJhY2tncm91bmQobVBWQmFja2dyb3VuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvYWRJbWFnZSgpIHsKKyAgICAgICAgbUdyaWRJbWFnZSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnJvYm90LCBFbGVtZW50LlJHQl81NjUobVJTKSwgdHJ1ZSk7CisgICAgICAgIG1HcmlkSW1hZ2UudXBsb2FkVG9UZXh0dXJlKDApOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dUR3JpZChtR3JpZEltYWdlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFRleHRBbGxvY2F0aW9uKCkgeworICAgICAgICBTdHJpbmcgYWxsb2NTdHJpbmcgPSAiRGlzcGxheWluZyBmaWxlOiBSLnJhdy5yb2JvdCI7CisgICAgICAgIG1UZXh0QWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21TdHJpbmcobVJTLCBhbGxvY1N0cmluZyk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dUZXh0QWxsb2MobVRleHRBbGxvYyk7CisgICAgfQorCisgICAgU2dUcmFuc2Zvcm0gbVJvb3RUcmFuc2Zvcm07CisgICAgU2dUcmFuc2Zvcm0gbUdyb3VwMTsKKworICAgIFNnVHJhbnNmb3JtIG1Sb2JvdDE7CisgICAgU2dUcmFuc2Zvcm0gbVJvYm90MjsKKworICAgIHZvaWQgaW5pdFRyYW5zZm9ybUhpZXJhcmNoeSgpIHsKKyAgICAgICAgbVJvb3RUcmFuc2Zvcm0gPSBuZXcgU2dUcmFuc2Zvcm0obVJTKTsKKworICAgICAgICBtR3JvdXAxID0gbmV3IFNnVHJhbnNmb3JtKG1SUyk7CisgICAgICAgIG1Sb290VHJhbnNmb3JtLmFkZENoaWxkKG1Hcm91cDEpOworCisgICAgICAgIG1Sb2JvdDEgPSBuZXcgU2dUcmFuc2Zvcm0obVJTKTsKKyAgICAgICAgbVJvYm90MiA9IG5ldyBTZ1RyYW5zZm9ybShtUlMpOworCisgICAgICAgIG1Hcm91cDEuYWRkQ2hpbGQobVJvYm90MSk7CisgICAgICAgIG1Hcm91cDEuYWRkQ2hpbGQobVJvYm90Mik7CisKKyAgICAgICAgbUdyb3VwMS5zZXRUcmFuc2Zvcm0oMCwgbmV3IEZsb2F0NCgwLjBmLCAwLjBmLCA1LjBmLCAwLjBmKSwgVHJhbnNmb3JtVHlwZS5UUkFOU0xBVEUpOworICAgICAgICBtR3JvdXAxLnNldFRyYW5zZm9ybSgxLCBuZXcgRmxvYXQ0KDAuMGYsIDEuMGYsIDAuMGYsIDE1LjBmKSwgVHJhbnNmb3JtVHlwZS5ST1RBVEUpOworCisgICAgICAgIG1Sb2JvdDEuc2V0VHJhbnNmb3JtKDAsIG5ldyBGbG9hdDQoLTIuMGYsIC0wLjVmLCAwLjBmLCAwLjBmKSwgVHJhbnNmb3JtVHlwZS5UUkFOU0xBVEUpOworICAgICAgICBtUm9ib3QxLnNldFRyYW5zZm9ybSgxLCBuZXcgRmxvYXQ0KDAuMGYsIDEuMGYsIDAuMGYsIDIwLjBmKSwgVHJhbnNmb3JtVHlwZS5ST1RBVEUpOworICAgICAgICBtUm9ib3QxLnNldFRyYW5zZm9ybSgyLCBuZXcgRmxvYXQ0KDAuMmYsIDAuMmYsIDAuMmYsIDAuMGYpLCBUcmFuc2Zvcm1UeXBlLlNDQUxFKTsKKworICAgICAgICBtUm9ib3QyLnNldFRyYW5zZm9ybSgwLCBuZXcgRmxvYXQ0KDIuMGYsIDAuMGYsIDAuMGYsIDAuMGYpLCBUcmFuc2Zvcm1UeXBlLlRSQU5TTEFURSk7CisgICAgICAgIG1Sb2JvdDIuc2V0VHJhbnNmb3JtKDEsIG5ldyBGbG9hdDQoMC4wZiwgMS4wZiwgMC4wZiwgLTIwLjBmKSwgVHJhbnNmb3JtVHlwZS5ST1RBVEUpOworICAgICAgICBtUm9ib3QyLnNldFRyYW5zZm9ybSgyLCBuZXcgRmxvYXQ0KDAuM2YsIDAuM2YsIDAuM2YsIDAuMGYpLCBUcmFuc2Zvcm1UeXBlLlNDQUxFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgeworCisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19TY2VuZWdyYXBoKG1SUywgbVJlcywgUi5yYXcuc2NlbmVncmFwaCwgdHJ1ZSk7CisgICAgICAgIG1UcmFuc2Zvcm1TY3JpcHQgPSBuZXcgU2NyaXB0Q19UcmFuc2Zvcm0obVJTLCBtUmVzLCBSLnJhdy50cmFuc2Zvcm0sIGZhbHNlKTsKKyAgICAgICAgbVRyYW5zZm9ybVNjcmlwdC5zZXRfdHJhbnNmb3JtU2NyaXB0KG1UcmFuc2Zvcm1TY3JpcHQpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dUcmFuc2Zvcm1SUyhtVHJhbnNmb3JtU2NyaXB0KTsKKworICAgICAgICBpbml0UEZTKCk7CisgICAgICAgIGluaXRQRigpOworICAgICAgICBpbml0UFYoKTsKKworICAgICAgICBsb2FkSW1hZ2UoKTsKKworICAgICAgICBGaWxlQTNEIG1vZGVsID0gRmlsZUEzRC5jcmVhdGVGcm9tUmVzb3VyY2UobVJTLCBtUmVzLCBSLnJhdy5yb2JvdCk7CisgICAgICAgIEZpbGVBM0QuSW5kZXhFbnRyeSBlbnRyeSA9IG1vZGVsLmdldEluZGV4RW50cnkoMCk7CisgICAgICAgIGlmKGVudHJ5ID09IG51bGwgfHwgZW50cnkuZ2V0Q2xhc3NJRCgpICE9IEZpbGVBM0QuQ2xhc3NJRC5NRVNIKSB7CisgICAgICAgICAgICBMb2cuZSgicnMiLCAiY291bGQgbm90IGxvYWQgbW9kZWwiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1NZXNoID0gKE1lc2gpZW50cnkuZ2V0T2JqZWN0KCk7CisgICAgICAgICAgICBtU2NyaXB0LnNldF9nVGVzdE1lc2gobU1lc2gpOworICAgICAgICB9CisKKyAgICAgICAgbUl0YWxpYyA9IEZvbnQuY3JlYXRlKG1SUywgbVJlcywgIkRyb2lkU2VyaWYtSXRhbGljLnR0ZiIsIDgpOworICAgICAgICBtU2NyaXB0LnNldF9nSXRhbGljKG1JdGFsaWMpOworCisgICAgICAgIGluaXRUZXh0QWxsb2NhdGlvbigpOworCisgICAgICAgIGluaXRUcmFuc2Zvcm1IaWVyYXJjaHkoKTsKKworICAgICAgICBMb2cudigiPT09PT09PT1TY2VuZUdyYXBoPT09PT09PT0iLCAidHJhbnNmb3JtIGhpZXJhcmNoeSBpbml0aWFsaXplZCIpOworCisgICAgICAgIG1TY3JpcHQuYmluZF9nUm9vdE5vZGUobVJvb3RUcmFuc2Zvcm0uZ2V0RmllbGQoKSk7CisKKyAgICAgICAgbVNjcmlwdC5iaW5kX2dHcm91cChtR3JvdXAxLm1QYXJlbnQubUNoaWxkRmllbGQpOworICAgICAgICBtU2NyaXB0LmJpbmRfZ1JvYm90MShtUm9ib3QxLm1QYXJlbnQubUNoaWxkRmllbGQpOworICAgICAgICBtU2NyaXB0LnNldF9nUm9ib3QxSW5kZXgobVJvYm90MS5tSW5kZXhJblBhcmVudEdyb3VwKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX2dSb2JvdDIobVJvYm90Mi5tUGFyZW50Lm1DaGlsZEZpZWxkKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1JvYm90MkluZGV4KG1Sb2JvdDIubUluZGV4SW5QYXJlbnRHcm91cCk7CisKKyAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjZW5lR3JhcGhWaWV3LmphdmEgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjZW5lR3JhcGhWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRhNTliMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaFZpZXcuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0w7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CisKK3B1YmxpYyBjbGFzcyBTY2VuZUdyYXBoVmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgeworCisgICAgcHVibGljIFNjZW5lR3JhcGhWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgLy9zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBTY2VuZUdyYXBoUlMgbVJlbmRlcjsKKworCisgICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCkgeworICAgICAgICBzdXBlci5zdXJmYWNlQ2hhbmdlZChob2xkZXIsIGZvcm1hdCwgdywgaCk7CisgICAgICAgIGlmIChtUlMgPT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gY3JlYXRlUmVuZGVyU2NyaXB0KHRydWUpOworICAgICAgICAgICAgbVJTLmNvbnRleHRTZXRTdXJmYWNlKHcsIGgsIGhvbGRlci5nZXRTdXJmYWNlKCkpOworICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBTY2VuZUdyYXBoUlMoKTsKKyAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpLCB3LCBoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBpZihtUlMgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gbnVsbDsKKyAgICAgICAgICAgIGRlc3Ryb3lSZW5kZXJTY3JpcHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpCisgICAgeworICAgICAgICAvLyBicmVhayBwb2ludCBhdCBoZXJlCisgICAgICAgIC8vIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgd29yayB3aGVuICdleHRlbmRzIFZpZXcnIGluY2x1ZGUgJ2V4dGVuZHMgU2Nyb2xsVmlldycuCisgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQorICAgIHsKKyAgICAgICAgYm9vbGVhbiByZXQgPSB0cnVlOworICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGlmIChhY3QgPT0gZXYuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICByZXQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIG1SZW5kZXIudG91Y2hFdmVudCgoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NnVHJhbnNmb3JtLmphdmEgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NnVHJhbnNmb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwZTgxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2dUcmFuc2Zvcm0uamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubW9kZWx2aWV3ZXI7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuQnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2VudW0gVHJhbnNmb3JtVHlwZSB7CisKKyAgICBOT05FKDApLAorICAgIFRSQU5TTEFURSgxKSwKKyAgICBST1RBVEUoMiksCisgICAgU0NBTEUoMyk7CisKKyAgICBpbnQgbUlEOworICAgIFRyYW5zZm9ybVR5cGUoaW50IGlkKSB7CisgICAgICAgIG1JRCA9IGlkOworICAgIH0KK30KKworcHVibGljIGNsYXNzIFNnVHJhbnNmb3JtIHsKKworCisgICAgU2NyaXB0RmllbGRfU2dUcmFuc2Zvcm0gbVRyYW5zZm9ybUZpZWxkOworICAgIFNjcmlwdEZpZWxkX1NnVHJhbnNmb3JtIG1DaGlsZEZpZWxkOworICAgIHB1YmxpYyBTY3JpcHRGaWVsZF9TZ1RyYW5zZm9ybS5JdGVtIG1UcmFuc2Zvcm1EYXRhOworCisgICAgRmxvYXQ0W10gbVRyYW5zZm9ybXM7CisgICAgVHJhbnNmb3JtVHlwZVtdIG1UcmFuc2Zvcm1UeXBlczsKKworICAgIFJlbmRlclNjcmlwdCBtUlM7CisKKyAgICBWZWN0b3IgbUNoaWxkcmVuOworICAgIFNnVHJhbnNmb3JtIG1QYXJlbnQ7CisgICAgaW50IG1JbmRleEluUGFyZW50R3JvdXA7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoU2dUcmFuc2Zvcm0gcGFyZW50LCBpbnQgcGFyZW50SW5kZXgpIHsKKyAgICAgICAgbVBhcmVudCA9IHBhcmVudDsKKyAgICAgICAgbUluZGV4SW5QYXJlbnRHcm91cCA9IHBhcmVudEluZGV4OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKFNnVHJhbnNmb3JtIGNoaWxkKSB7CisgICAgICAgIG1DaGlsZHJlbi5hZGQoY2hpbGQpOworICAgICAgICBjaGlsZC5zZXRQYXJlbnQodGhpcywgbUNoaWxkcmVuLnNpemUoKSAtIDEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zZm9ybShpbnQgaW5kZXgsIEZsb2F0NCB2YWx1ZSwgVHJhbnNmb3JtVHlwZSB0eXBlKSB7CisgICAgICAgIG1UcmFuc2Zvcm1zW2luZGV4XSA9IHZhbHVlOworICAgICAgICBtVHJhbnNmb3JtVHlwZXNbaW5kZXhdID0gdHlwZTsKKyAgICB9CisKKyAgICB2b2lkIGluaXREYXRhKCkgeworICAgICAgICBpbnQgbnVtVHJhbnNmb3JtcyA9IDE2OworICAgICAgICBtVHJhbnNmb3JtcyA9IG5ldyBGbG9hdDRbbnVtVHJhbnNmb3Jtc107CisgICAgICAgIG1UcmFuc2Zvcm1UeXBlcyA9IG5ldyBUcmFuc2Zvcm1UeXBlW251bVRyYW5zZm9ybXNdOworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtVHJhbnNmb3JtczsgaSArKykgeworICAgICAgICAgICAgbVRyYW5zZm9ybXNbaV0gPSBuZXcgRmxvYXQ0KDAsIDAsIDAsIDApOworICAgICAgICAgICAgbVRyYW5zZm9ybVR5cGVzW2ldID0gVHJhbnNmb3JtVHlwZS5OT05FOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZXREYXRhKCkgeworCisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLmdsb2JhbE1hdCA9IG5ldyBNYXRyaXg0ZigpOworICAgICAgICBtVHJhbnNmb3JtRGF0YS5sb2NhbE1hdCA9IG5ldyBNYXRyaXg0ZigpOworCisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMwID0gbVRyYW5zZm9ybXNbMF07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMxID0gbVRyYW5zZm9ybXNbMV07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMyID0gbVRyYW5zZm9ybXNbMl07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMzID0gbVRyYW5zZm9ybXNbM107CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXM0ID0gbVRyYW5zZm9ybXNbNF07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXM1ID0gbVRyYW5zZm9ybXNbNV07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXM2ID0gbVRyYW5zZm9ybXNbNl07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXM3ID0gbVRyYW5zZm9ybXNbN107CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXM4ID0gbVRyYW5zZm9ybXNbOF07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXM5ID0gbVRyYW5zZm9ybXNbOV07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMxMCA9IG1UcmFuc2Zvcm1zWzEwXTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczExID0gbVRyYW5zZm9ybXNbMTFdOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zMTIgPSBtVHJhbnNmb3Jtc1sxMl07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMxMyA9IG1UcmFuc2Zvcm1zWzEzXTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczE0ID0gbVRyYW5zZm9ybXNbMTRdOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zMTUgPSBtVHJhbnNmb3Jtc1sxNV07CisKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTAgPSBtVHJhbnNmb3JtVHlwZXNbMF0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMSA9IG1UcmFuc2Zvcm1UeXBlc1sxXS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGUyID0gbVRyYW5zZm9ybVR5cGVzWzJdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTMgPSBtVHJhbnNmb3JtVHlwZXNbM10ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlNCA9IG1UcmFuc2Zvcm1UeXBlc1s0XS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGU1ID0gbVRyYW5zZm9ybVR5cGVzWzVdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTYgPSBtVHJhbnNmb3JtVHlwZXNbNl0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlNyA9IG1UcmFuc2Zvcm1UeXBlc1s3XS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGU4ID0gbVRyYW5zZm9ybVR5cGVzWzhdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTkgPSBtVHJhbnNmb3JtVHlwZXNbOV0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMTAgPSBtVHJhbnNmb3JtVHlwZXNbMTBdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTExID0gbVRyYW5zZm9ybVR5cGVzWzExXS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGUxMiA9IG1UcmFuc2Zvcm1UeXBlc1sxMl0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMTMgPSBtVHJhbnNmb3JtVHlwZXNbMTNdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTE0ID0gbVRyYW5zZm9ybVR5cGVzWzE0XS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGUxNSA9IG1UcmFuc2Zvcm1UeXBlc1sxNV0ubUlEOworCisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLmlzRGlydHkgPSAxOworICAgICAgICBtVHJhbnNmb3JtRGF0YS5jaGlsZHJlbiA9IG51bGw7CisKKyAgICB9CisKKyAgICBwdWJsaWMgU2dUcmFuc2Zvcm0oUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtVHJhbnNmb3JtRGF0YSA9IG5ldyBTY3JpcHRGaWVsZF9TZ1RyYW5zZm9ybS5JdGVtKCk7CisgICAgICAgIG1DaGlsZHJlbiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgaW5pdERhdGEoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NyaXB0RmllbGRfU2dUcmFuc2Zvcm0uSXRlbSBnZXREYXRhKCkgeworICAgICAgICBzZXREYXRhKCk7CisgICAgICAgIGlmKG1DaGlsZHJlbi5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgbUNoaWxkRmllbGQgPSBuZXcgU2NyaXB0RmllbGRfU2dUcmFuc2Zvcm0obVJTLCBtQ2hpbGRyZW4uc2l6ZSgpKTsKKyAgICAgICAgICAgIG1UcmFuc2Zvcm1EYXRhLmNoaWxkcmVuID0gbUNoaWxkRmllbGQuZ2V0QWxsb2NhdGlvbigpOworCisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbUNoaWxkcmVuLnNpemUoKTsgaSArKykgeworICAgICAgICAgICAgICAgIFNnVHJhbnNmb3JtIGNoaWxkID0gKFNnVHJhbnNmb3JtKW1DaGlsZHJlbi5nZXQoaSk7CisgICAgICAgICAgICAgICAgbUNoaWxkRmllbGQuc2V0KGNoaWxkLmdldERhdGEoKSwgaSwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNoaWxkRmllbGQuY29weUFsbCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1UcmFuc2Zvcm1EYXRhOworICAgIH0KKworICAgIHB1YmxpYyBTY3JpcHRGaWVsZF9TZ1RyYW5zZm9ybSBnZXRGaWVsZCgpIHsKKyAgICAgICAgbVRyYW5zZm9ybUZpZWxkID0gbmV3IFNjcmlwdEZpZWxkX1NnVHJhbnNmb3JtKG1SUywgMSk7CisgICAgICAgIG1UcmFuc2Zvcm1GaWVsZC5zZXQoZ2V0RGF0YSgpLCAwLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1UcmFuc2Zvcm1GaWVsZDsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsLmphdmEgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3YzM5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWwuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW07CitpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOworCitwdWJsaWMgY2xhc3MgU2ltcGxlTW9kZWwgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIFNpbXBsZU1vZGVsVmlldyBtVmlldzsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICAvLyBDcmVhdGUgb3VyIFByZXZpZXcgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91cgorICAgICAgICAvLyBBY3Rpdml0eQorICAgICAgICBtVmlldyA9IG5ldyBTaW1wbGVNb2RlbFZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsUlMuamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWxSUy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YjAxMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsUlMuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubW9kZWx2aWV3ZXI7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKK3B1YmxpYyBjbGFzcyBTaW1wbGVNb2RlbFJTIHsKKworICAgIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0xBU1RfRk9DVVMgPSAxOworCisgICAgaW50IG1XaWR0aDsKKyAgICBpbnQgbUhlaWdodDsKKyAgICBpbnQgbVJvdGF0aW9uOworCisgICAgcHVibGljIFNpbXBsZU1vZGVsUlMoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtUmVzID0gcmVzOworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgbVJvdGF0aW9uID0gMDsKKyAgICAgICAgaW5pdFJTKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFNhbXBsZXIgbVNhbXBsZXI7CisgICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVBTQmFja2dyb3VuZDsKKyAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUEZCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtUFZCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uIG1QVkE7CisKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbUdyaWRJbWFnZTsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jUFY7CisKKyAgICBwcml2YXRlIE1lc2ggbU1lc2g7CisKKyAgICBwcml2YXRlIEZvbnQgbUl0YWxpYzsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVRleHRBbGxvYzsKKworICAgIHByaXZhdGUgU2NyaXB0Q19TaW1wbGVtb2RlbCBtU2NyaXB0OworCisgICAgaW50IG1MYXN0WDsKKyAgICBpbnQgbUxhc3RZOworCisgICAgcHVibGljIHZvaWQgdG91Y2hFdmVudChpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgaW50IGR4ID0gbUxhc3RYIC0geDsKKyAgICAgICAgaWYoTWF0aC5hYnMoZHgpID4gNTAgfHwgTWF0aC5hYnMoZHgpIDwgMykgeworICAgICAgICAgICAgZHggPSAwOworICAgICAgICB9CisKKyAgICAgICAgbVJvdGF0aW9uIC09IGR4OworICAgICAgICBpZihtUm90YXRpb24gPiAzNjApIHsKKyAgICAgICAgICAgIG1Sb3RhdGlvbiAtPSAzNjA7CisgICAgICAgIH0KKyAgICAgICAgaWYobVJvdGF0aW9uIDwgMCkgeworICAgICAgICAgICAgbVJvdGF0aW9uICs9IDM2MDsKKyAgICAgICAgfQorCisgICAgICAgIG1TY3JpcHQuc2V0X2dSb3RhdGUoLShmbG9hdCltUm90YXRpb24pOworCisgICAgICAgIG1MYXN0WCA9IHg7CisgICAgICAgIG1MYXN0WSA9IHk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQRlMoKSB7CisgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIobVJTKTsKKworICAgICAgICBiLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkxFU1MpOworICAgICAgICBiLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgIGIuc2V0RGVwdGhNYXNrKHRydWUpOworICAgICAgICBtUFNCYWNrZ3JvdW5kID0gYi5jcmVhdGUoKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUEZTQmFja2dyb3VuZChtUFNCYWNrZ3JvdW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFBGKCkgeworICAgICAgICBTYW1wbGVyLkJ1aWxkZXIgYnMgPSBuZXcgU2FtcGxlci5CdWlsZGVyKG1SUyk7CisgICAgICAgIGJzLnNldE1pbihTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldE1hZyhTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldFdyYXBTKFNhbXBsZXIuVmFsdWUuQ0xBTVApOworICAgICAgICBicy5zZXRXcmFwVChTYW1wbGVyLlZhbHVlLldSQVApOworICAgICAgICBtU2FtcGxlciA9IGJzLmNyZWF0ZSgpOworCisgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgYi5zZXRUZXh0dXJlKFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkVudk1vZGUuUkVQTEFDRSwKKyAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkZvcm1hdC5SR0JBLCAwKTsKKyAgICAgICAgbVBGQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7CisgICAgICAgIG1QRkJhY2tncm91bmQuYmluZFNhbXBsZXIobVNhbXBsZXIsIDApOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQRkJhY2tncm91bmQobVBGQmFja2dyb3VuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQVigpIHsKKyAgICAgICAgUHJvZ3JhbVZlcnRleC5CdWlsZGVyIHB2YiA9IG5ldyBQcm9ncmFtVmVydGV4LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgbVBWQmFja2dyb3VuZCA9IHB2Yi5jcmVhdGUoKTsKKworICAgICAgICBtUFZBID0gbmV3IFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbihtUlMpOworICAgICAgICBtUFZCYWNrZ3JvdW5kLmJpbmRBbGxvY2F0aW9uKG1QVkEpOworICAgICAgICBtUFZBLnNldHVwUHJvamVjdGlvbk5vcm1hbGl6ZWQobVdpZHRoLCBtSGVpZ2h0KTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUFZCYWNrZ3JvdW5kKG1QVkJhY2tncm91bmQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2FkSW1hZ2UoKSB7CisgICAgICAgIG1HcmlkSW1hZ2UgPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5yb2JvdCwgRWxlbWVudC5SR0JfNTY1KG1SUyksIHRydWUpOworICAgICAgICBtR3JpZEltYWdlLnVwbG9hZFRvVGV4dHVyZSgwKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nVEdyaWQobUdyaWRJbWFnZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRUZXh0QWxsb2NhdGlvbigpIHsKKyAgICAgICAgU3RyaW5nIGFsbG9jU3RyaW5nID0gIkRpc3BsYXlpbmcgZmlsZTogUi5yYXcucm9ib3QiOworICAgICAgICBtVGV4dEFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tU3RyaW5nKG1SUywgYWxsb2NTdHJpbmcpOworICAgICAgICBtU2NyaXB0LnNldF9nVGV4dEFsbG9jKG1UZXh0QWxsb2MpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX1NpbXBsZW1vZGVsKG1SUywgbVJlcywgUi5yYXcuc2ltcGxlbW9kZWwsIHRydWUpOworCisgICAgICAgIGluaXRQRlMoKTsKKyAgICAgICAgaW5pdFBGKCk7CisgICAgICAgIGluaXRQVigpOworCisgICAgICAgIGxvYWRJbWFnZSgpOworCisgICAgICAgIEZpbGVBM0QgbW9kZWwgPSBGaWxlQTNELmNyZWF0ZUZyb21SZXNvdXJjZShtUlMsIG1SZXMsIFIucmF3LnJvYm90KTsKKyAgICAgICAgRmlsZUEzRC5JbmRleEVudHJ5IGVudHJ5ID0gbW9kZWwuZ2V0SW5kZXhFbnRyeSgwKTsKKyAgICAgICAgaWYoZW50cnkgPT0gbnVsbCB8fCBlbnRyeS5nZXRDbGFzc0lEKCkgIT0gRmlsZUEzRC5DbGFzc0lELk1FU0gpIHsKKyAgICAgICAgICAgIExvZy5lKCJycyIsICJjb3VsZCBub3QgbG9hZCBtb2RlbCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbU1lc2ggPSAoTWVzaCllbnRyeS5nZXRPYmplY3QoKTsKKyAgICAgICAgICAgIG1TY3JpcHQuc2V0X2dUZXN0TWVzaChtTWVzaCk7CisgICAgICAgIH0KKworICAgICAgICBtSXRhbGljID0gRm9udC5jcmVhdGUobVJTLCBtUmVzLCAiRHJvaWRTZXJpZi1JdGFsaWMudHRmIiwgOCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dJdGFsaWMobUl0YWxpYyk7CisKKyAgICAgICAgaW5pdFRleHRBbGxvY2F0aW9uKCk7CisKKyAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsVmlldy5qYXZhIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TaW1wbGVNb2RlbFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTc0ZmRkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TaW1wbGVNb2RlbFZpZXcuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0w7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CisKK3B1YmxpYyBjbGFzcyBTaW1wbGVNb2RlbFZpZXcgZXh0ZW5kcyBSU1N1cmZhY2VWaWV3IHsKKworICAgIHB1YmxpYyBTaW1wbGVNb2RlbFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAvL3NldEZvY3VzYWJsZSh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFNpbXBsZU1vZGVsUlMgbVJlbmRlcjsKKworCisgICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCkgeworICAgICAgICBzdXBlci5zdXJmYWNlQ2hhbmdlZChob2xkZXIsIGZvcm1hdCwgdywgaCk7CisgICAgICAgIGlmIChtUlMgPT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gY3JlYXRlUmVuZGVyU2NyaXB0KHRydWUpOworICAgICAgICAgICAgbVJTLmNvbnRleHRTZXRTdXJmYWNlKHcsIGgsIGhvbGRlci5nZXRTdXJmYWNlKCkpOworICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBTaW1wbGVNb2RlbFJTKCk7CisgICAgICAgICAgICBtUmVuZGVyLmluaXQobVJTLCBnZXRSZXNvdXJjZXMoKSwgdywgaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgaWYobVJTICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IG51bGw7CisgICAgICAgICAgICBkZXN0cm95UmVuZGVyU2NyaXB0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KQorICAgIHsKKyAgICAgICAgLy8gYnJlYWsgcG9pbnQgYXQgaGVyZQorICAgICAgICAvLyB0aGlzIG1ldGhvZCBkb2Vzbid0IHdvcmsgd2hlbiAnZXh0ZW5kcyBWaWV3JyBpbmNsdWRlICdleHRlbmRzIFNjcm9sbFZpZXcnLgorICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikKKyAgICB7CisgICAgICAgIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9VUCkgeworICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBtUmVuZGVyLnRvdWNoRXZlbnQoKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9zY2VuZWdyYXBoLnJzIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9zY2VuZWdyYXBoLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OTQ0MzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3NjZW5lZ3JhcGgucnMKQEAgLTAsMCArMSw5MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyKQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorI2luY2x1ZGUgInRyYW5zZm9ybV9kZWYucnNoIgorCityc19wcm9ncmFtX3ZlcnRleCBnUFZCYWNrZ3JvdW5kOworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUEZCYWNrZ3JvdW5kOworCityc19hbGxvY2F0aW9uIGdUR3JpZDsKK3JzX21lc2ggZ1Rlc3RNZXNoOworCityc19wcm9ncmFtX3N0b3JlIGdQRlNCYWNrZ3JvdW5kOworCitmbG9hdCBnUm90YXRlOworCityc19mb250IGdJdGFsaWM7Cityc19hbGxvY2F0aW9uIGdUZXh0QWxsb2M7CisKK3JzX3NjcmlwdCBnVHJhbnNmb3JtUlM7CisKK1NnVHJhbnNmb3JtICpnR3JvdXA7CitTZ1RyYW5zZm9ybSAqZ1JvYm90MTsKK2ludCBnUm9ib3QxSW5kZXg7CitTZ1RyYW5zZm9ybSAqZ1JvYm90MjsKK2ludCBnUm9ib3QySW5kZXg7CisKK1NnVHJhbnNmb3JtICpnUm9vdE5vZGU7CisKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihnUFZCYWNrZ3JvdW5kLCBnUEZCYWNrZ3JvdW5kLCBnVEdyaWQsIGdUZXN0TWVzaCwgZ1BGU0JhY2tncm91bmQsIGdSb3RhdGUsIGdJdGFsaWMsIGdUZXh0QWxsb2MsIGdUcmFuc2Zvcm1SUywgZ0dyb3VwLCBnUm9ib3QxLCBnUm9ib3QxSW5kZXgsIGdSb2JvdDIsIGdSb2JvdDJJbmRleCwgZ1Jvb3ROb2RlKQorCitmbG9hdCBnRFQ7CitpbnQ2NF90IGdMYXN0VGltZTsKKwordm9pZCBpbml0KCkgeworICAgIGdSb3RhdGUgPSAwLjBmOworfQorCitpbnQgcm9vdChpbnQgbGF1bmNoSUQpIHsKKworICAgIGdHcm91cC0+dHJhbnNmb3JtczEudyArPSAwLjVmOworICAgIGdHcm91cC0+aXNEaXJ0eSA9IDE7CisKKyAgICBTZ1RyYW5zZm9ybSAqcm9ib3QxUHRyID0gZ1JvYm90MSArIGdSb2JvdDFJbmRleDsKKworICAgIHJvYm90MVB0ci0+dHJhbnNmb3JtczEudyAtPSAxLjVmOworICAgIHJvYm90MVB0ci0+aXNEaXJ0eSA9IDE7CisKKyAgICBTZ1RyYW5zZm9ybSAqcm9ib3QyUHRyID0gZ1JvYm90MiArIGdSb2JvdDJJbmRleDsKKyAgICByb2JvdDJQdHItPnRyYW5zZm9ybXMxLncgKz0gMi41ZjsKKyAgICByb2JvdDJQdHItPmlzRGlydHkgPSAxOworCisgICAgcnNGb3JFYWNoKGdUcmFuc2Zvcm1SUywgZ1Jvb3ROb2RlLT5jaGlsZHJlbiwgZ1Jvb3ROb2RlLT5jaGlsZHJlbiwgMCk7CisKKyAgICByc2dDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0NsZWFyRGVwdGgoMS4wZik7CisKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChnUFZCYWNrZ3JvdW5kKTsKKworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1BGQmFja2dyb3VuZCk7CisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUEZTQmFja2dyb3VuZCk7CisgICAgcnNnQmluZFRleHR1cmUoZ1BGQmFja2dyb3VuZCwgMCwgZ1RHcmlkKTsKKworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJnJvYm90MVB0ci0+Z2xvYmFsTWF0KTsKKyAgICByc2dEcmF3TWVzaChnVGVzdE1lc2gpOworCisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmcm9ib3QyUHRyLT5nbG9iYWxNYXQpOworICAgIHJzZ0RyYXdNZXNoKGdUZXN0TWVzaCk7CisKKyAgICBjb2xvcigwLjNmLCAwLjNmLCAwLjNmLCAxLjBmKTsKKyAgICByc2dEcmF3VGV4dCgiUmVuZGVyc2NyaXB0IHRyYW5zZm9ybSB0ZXN0IiwgMzAsIDY5NSk7CisKKyAgICByc2dCaW5kRm9udChnSXRhbGljKTsKKyAgICByc2dEcmF3VGV4dChnVGV4dEFsbG9jLCAzMCwgNzMwKTsKKworICAgIHJldHVybiAxMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvc2ltcGxlbW9kZWwucnMgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3NpbXBsZW1vZGVsLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYjYwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3NpbXBsZW1vZGVsLnJzCkBAIC0wLDAgKzEsNzIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5tb2RlbHZpZXdlcikKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworcnNfcHJvZ3JhbV92ZXJ0ZXggZ1BWQmFja2dyb3VuZDsKK3JzX3Byb2dyYW1fZnJhZ21lbnQgZ1BGQmFja2dyb3VuZDsKKworcnNfYWxsb2NhdGlvbiBnVEdyaWQ7Cityc19tZXNoIGdUZXN0TWVzaDsKKworcnNfcHJvZ3JhbV9zdG9yZSBnUEZTQmFja2dyb3VuZDsKKworZmxvYXQgZ1JvdGF0ZTsKKworcnNfZm9udCBnSXRhbGljOworcnNfYWxsb2NhdGlvbiBnVGV4dEFsbG9jOworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ1BWQmFja2dyb3VuZCwgZ1BGQmFja2dyb3VuZCwgZ1RHcmlkLCBnVGVzdE1lc2gsIGdQRlNCYWNrZ3JvdW5kLCBnUm90YXRlLCBnSXRhbGljLCBnVGV4dEFsbG9jKQorCitmbG9hdCBnRFQ7CitpbnQ2NF90IGdMYXN0VGltZTsKKwordm9pZCBpbml0KCkgeworICAgIGdSb3RhdGUgPSAwLjBmOworfQorCitpbnQgcm9vdChpbnQgbGF1bmNoSUQpIHsKKworICAgIHJzZ0NsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQ2xlYXJEZXB0aCgxLjBmKTsKKworICAgIHJzZ0JpbmRQcm9ncmFtVmVydGV4KGdQVkJhY2tncm91bmQpOworCisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUEZCYWNrZ3JvdW5kKTsKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQRlNCYWNrZ3JvdW5kKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUEZCYWNrZ3JvdW5kLCAwLCBnVEdyaWQpOworCisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eSgmbWF0cml4KTsKKyAgICAvLyBQb3NpdGlvbiBvdXIgbW9kZWwgb24gdGhlIHNjcmVlbgorICAgIHJzTWF0cml4VHJhbnNsYXRlKCZtYXRyaXgsIDAuMGYsIC0wLjNmLCAxLjJmKTsKKyAgICByc01hdHJpeFNjYWxlKCZtYXRyaXgsIDAuMmYsIDAuMmYsIDAuMmYpOworICAgIHJzTWF0cml4Um90YXRlKCZtYXRyaXgsIC0yNS4wZiwgMS4wZiwgMC4wZiwgMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgZ1JvdGF0ZSwgMC4wZiwgMS4wZiwgMC4wZik7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbWF0cml4KTsKKworICAgIHJzZ0RyYXdNZXNoKGdUZXN0TWVzaCk7CisKKyAgICByc2dGb250Q29sb3IoMC4zZiwgMC4zZiwgMC4zZiwgMS4wZik7CisgICAgcnNnRHJhd1RleHQoIlJlbmRlcnNjcmlwdCBtb2RlbCB0ZXN0IiwgMzAsIDY5NSk7CisKKyAgICByc2dCaW5kRm9udChnSXRhbGljKTsKKyAgICByc2dEcmF3VGV4dChnVGV4dEFsbG9jLCAzMCwgNzMwKTsKKworICAgIHJldHVybiAxMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvdHJhbnNmb3JtLnJzIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci90cmFuc2Zvcm0ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmMjljZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvdHJhbnNmb3JtLnJzCkBAIC0wLDAgKzEsMTAyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQubW9kZWx2aWV3ZXIpCisKKyNpbmNsdWRlICJ0cmFuc2Zvcm1fZGVmLnJzaCIKKworcnNfc2NyaXB0IHRyYW5zZm9ybVNjcmlwdDsKKworI3ByYWdtYSBycyBleHBvcnRfdmFyKHRyYW5zZm9ybVNjcmlwdCkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBjaGFuZ2VkOworICAgIHJzX21hdHJpeDR4NCAqbWF0OworfSBQYXJlbnREYXRhOworCit2b2lkIGFwcGVuZFRyYW5zZm9ybWF0aW9uKGludCB0eXBlLCBmbG9hdDQgZGF0YSwgcnNfbWF0cml4NHg0ICptYXQpIHsKKyAgICByc19tYXRyaXg0eDQgdGVtcDsKKworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgY2FzZSBUUkFOU0ZPUk1fVFJBTlNMQVRFOgorICAgICAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJnRlbXAsIGRhdGEueCwgZGF0YS55LCBkYXRhLnopOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRSQU5TRk9STV9ST1RBVEU6CisgICAgICAgIHJzTWF0cml4TG9hZFJvdGF0ZSgmdGVtcCwgZGF0YS53LCBkYXRhLngsIGRhdGEueSwgZGF0YS56KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFOU0ZPUk1fU0NBTEU6CisgICAgICAgIHJzTWF0cml4TG9hZFNjYWxlKCZ0ZW1wLCBkYXRhLngsIGRhdGEueSwgZGF0YS56KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJzTWF0cml4TXVsdGlwbHkobWF0LCAmdGVtcCk7Cit9CisKK3ZvaWQgcm9vdChjb25zdCB2b2lkICp2X2luLCB2b2lkICp2X291dCwgY29uc3Qgdm9pZCAqdXNyRGF0YSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworCisgICAgU2dUcmFuc2Zvcm0gKmRhdGEgPSAoU2dUcmFuc2Zvcm0gKil2X291dDsKKyAgICBjb25zdCBQYXJlbnREYXRhICpwYXJlbnQgPSAoY29uc3QgUGFyZW50RGF0YSAqKXVzckRhdGE7CisKKyAgICAvL3JzRGVidWcoIlRyYW5zZm9ybSBkYXRhIiwgKGludClkYXRhKTsKKyAgICAvL3JzRGVidWcoIkVudGVyaW5nIHBhcmVudCIsIChpbnQpcGFyZW50KTsKKworICAgIHJzX21hdHJpeDR4NCAqbG9jYWxNYXQgPSAmZGF0YS0+bG9jYWxNYXQ7CisgICAgcnNfbWF0cml4NHg0ICpnbG9iYWxNYXQgPSAmZGF0YS0+Z2xvYmFsTWF0OworCisgICAgUGFyZW50RGF0YSB0b0NoaWxkOworICAgIHRvQ2hpbGQuY2hhbmdlZCA9IDA7CisgICAgdG9DaGlsZC5tYXQgPSBnbG9iYWxNYXQ7CisKKyAgICAvL3JzRGVidWcoIlRyYW5zZm9ybSBpcyBkaXJ0eSIsIGRhdGEtPmlzRGlydHkpOworCisgICAgLy8gUmVmcmVzaCBtYXRyaWNlcyBpZiBkaXJ0eQorICAgIGlmKGRhdGEtPmlzRGlydHkpIHsKKyAgICAgICAgZGF0YS0+aXNEaXJ0eSA9IDA7CisgICAgICAgIHRvQ2hpbGQuY2hhbmdlZCA9IDE7CisKKyAgICAgICAgLy8gUmVzZXQgb3VyIGxvY2FsIG1hdHJpeAorICAgICAgICByc01hdHJpeExvYWRJZGVudGl0eShsb2NhbE1hdCk7CisKKyAgICAgICAgZmxvYXQ0ICp0cmFuc2Zvcm1Tb3VyY2UgPSAmZGF0YS0+dHJhbnNmb3JtczA7CisgICAgICAgIGludCAqdHJhbnNmb3JtVHlwZXMgPSAmZGF0YS0+dHJhbnNmb3JtVHlwZTA7CisKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDE2OyBpICsrKSB7CisgICAgICAgICAgICBpZih0cmFuc2Zvcm1UeXBlc1tpXSA9PSBUUkFOU0ZPUk1fTk9ORSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9yc0RlYnVnKCJUcmFuc2Zvcm0gYWRkaW5nIHRyYW5zZm9ybWF0aW9uIiwgdHJhbnNmb3JtVHlwZXNbaV0pOworICAgICAgICAgICAgYXBwZW5kVHJhbnNmb3JtYXRpb24odHJhbnNmb3JtVHlwZXNbaV0sIHRyYW5zZm9ybVNvdXJjZVtpXSwgbG9jYWxNYXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy9yc0RlYnVnKCJUcmFuc2Zvcm0gY2hlY2tpbmcgcGFyZW50IiwgKGludCkwKTsKKworICAgIGlmKHBhcmVudCkgeworICAgICAgICBpZihwYXJlbnQtPmNoYW5nZWQpIHsKKyAgICAgICAgICAgIHRvQ2hpbGQuY2hhbmdlZCA9IDE7CisKKyAgICAgICAgICAgIHJzTWF0cml4TG9hZChnbG9iYWxNYXQsIHBhcmVudC0+bWF0KTsKKyAgICAgICAgICAgIHJzTWF0cml4TXVsdGlwbHkoZ2xvYmFsTWF0LCBsb2NhbE1hdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzTWF0cml4TG9hZChnbG9iYWxNYXQsIGxvY2FsTWF0KTsKKyAgICB9CisKKyAgICAvL3JzRGVidWcoIlRyYW5zZm9ybSBjYWxsaW5nIHNlbGYgd2l0aCBjaGlsZCAiLCAoaW50KWRhdGEtPmNoaWxkcmVuLnApOworICAgIGlmKGRhdGEtPmNoaWxkcmVuLnApIHsKKyAgICAgICAgcnNGb3JFYWNoKHRyYW5zZm9ybVNjcmlwdCwgZGF0YS0+Y2hpbGRyZW4sIGRhdGEtPmNoaWxkcmVuLCAodm9pZCopJnRvQ2hpbGQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvdHJhbnNmb3JtX2RlZi5yc2ggYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3RyYW5zZm9ybV9kZWYucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjODcyYTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3RyYW5zZm9ybV9kZWYucnNoCkBAIC0wLDAgKzEsNjYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5tb2RlbHZpZXdlcikKKworI2RlZmluZSBUUkFOU0ZPUk1fTk9ORSAwCisjZGVmaW5lIFRSQU5TRk9STV9UUkFOU0xBVEUgMQorI2RlZmluZSBUUkFOU0ZPUk1fUk9UQVRFIDIKKyNkZWZpbmUgVFJBTlNGT1JNX1NDQUxFIDMKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHJzX21hdHJpeDR4NCBnbG9iYWxNYXQ7CisgICAgcnNfbWF0cml4NHg0IGxvY2FsTWF0OworCisgICAgZmxvYXQ0IHRyYW5zZm9ybXMwOworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMTsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczI7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXMzOworICAgIGZsb2F0NCB0cmFuc2Zvcm1zNDsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczU7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXM2OworICAgIGZsb2F0NCB0cmFuc2Zvcm1zNzsKKyAgICBmbG9hdDQgdHJhbnNmb3Jtczg7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXM5OworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMTA7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXMxMTsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczEyOworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMTM7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXMxNDsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczE1OworCisgICAgaW50IHRyYW5zZm9ybVR5cGUwOworICAgIGludCB0cmFuc2Zvcm1UeXBlMTsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTI7CisgICAgaW50IHRyYW5zZm9ybVR5cGUzOworICAgIGludCB0cmFuc2Zvcm1UeXBlNDsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTU7CisgICAgaW50IHRyYW5zZm9ybVR5cGU2OworICAgIGludCB0cmFuc2Zvcm1UeXBlNzsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTg7CisgICAgaW50IHRyYW5zZm9ybVR5cGU5OworICAgIGludCB0cmFuc2Zvcm1UeXBlMTA7CisgICAgaW50IHRyYW5zZm9ybVR5cGUxMTsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTEyOworICAgIGludCB0cmFuc2Zvcm1UeXBlMTM7CisgICAgaW50IHRyYW5zZm9ybVR5cGUxNDsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTE1OworCisgICAgaW50IGlzRGlydHk7CisKKyAgICByc19hbGxvY2F0aW9uIGNoaWxkcmVuOworCit9IFNnVHJhbnNmb3JtOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvQW5kcm9pZC5tayBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVhZTczNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMSBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgJChjYWxsIGFsbC1yZW5kZXJzY3JpcHQtZmlsZXMtdW5kZXIsIHNyYykKKyNMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC5yZW5kZXJzY3JpcHQKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFNhbXBsZXMKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTE5MWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5zYW1wbGVzIj4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iU2FtcGxlcyIKKyAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS90ZXN0X3BhdHRlcm4iPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJSc0xpc3QiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJSc0xpc3QiICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5CbGFjay5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlJzUmVuZGVyU3RhdGVzIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iUnNTdGF0ZXMiICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5CbGFjay5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS9kYXRhLnBuZyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS9kYXRhLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTM0NzE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL2RhdGEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS9sZWFmLnBuZyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS9sZWFmLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2QzNzc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL2xlYWYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL3Rlc3RfcGF0dGVybi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkMTQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS90b3J1c21hcC5wbmcgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvdG9ydXNtYXAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDhmM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvdG9ydXNtYXAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9yYXcvc2hhZGVyZi5nbHNsIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXJmLmdsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjZjQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9yYXcvc2hhZGVyZi5nbHNsCkBAIC0wLDAgKzEsMTUgQEAKKwordmFyeWluZyBsb3dwIGZsb2F0IGxpZ2h0MF9EaWZmdXNlOwordmFyeWluZyBsb3dwIGZsb2F0IGxpZ2h0MF9TcGVjdWxhcjsKK3ZhcnlpbmcgbG93cCBmbG9hdCBsaWdodDFfRGlmZnVzZTsKK3ZhcnlpbmcgbG93cCBmbG9hdCBsaWdodDFfU3BlY3VsYXI7CisKK3ZvaWQgbWFpbigpIHsKKyAgIHZlYzIgdDAgPSB2YXJUZXgwLnh5OworICAgbG93cCB2ZWM0IGNvbCA9IHRleHR1cmUyRCh1bmlfVGV4MCwgdDApLnJnYmE7CisgICBjb2wueHl6ID0gY29sLnh5eiAqIChsaWdodDBfRGlmZnVzZSAqIFVOSV9saWdodDBfRGlmZnVzZUNvbG9yICsgbGlnaHQxX0RpZmZ1c2UgKiBVTklfbGlnaHQxX0RpZmZ1c2VDb2xvcik7CisgICBjb2wueHl6ICs9IGxpZ2h0MF9TcGVjdWxhciAqIFVOSV9saWdodDBfU3BlY3VsYXJDb2xvcjsKKyAgIGNvbC54eXogKz0gbGlnaHQxX1NwZWN1bGFyICogVU5JX2xpZ2h0MV9TcGVjdWxhckNvbG9yOworICAgZ2xfRnJhZ0NvbG9yID0gY29sOworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L3NoYWRlcnYuZ2xzbCBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9yYXcvc2hhZGVydi5nbHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNjExOTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L3NoYWRlcnYuZ2xzbApAQCAtMCwwICsxLDQyIEBACit2YXJ5aW5nIGZsb2F0IGxpZ2h0MF9EaWZmdXNlOwordmFyeWluZyBmbG9hdCBsaWdodDBfU3BlY3VsYXI7Cit2YXJ5aW5nIGZsb2F0IGxpZ2h0MV9EaWZmdXNlOwordmFyeWluZyBmbG9hdCBsaWdodDFfU3BlY3VsYXI7CisKKy8qCityc19tYXRyaXg0eDQgbW9kZWw7CisgZmxvYXQzIGxpZ2h0MF9Qb3Npc2lvbjsKKyBmbG9hdCBsaWdodDBfRGlmZnVzZTsKKyBmbG9hdCBsaWdodDBfU3BlY3VsYXI7CisgZmxvYXQgbGlnaHQwX0Nvc2luZVBvd2VyOworCisgZmxvYXQzIGxpZ2h0MV9Qb3Npc2lvbjsKKyBmbG9hdCBsaWdodDFfRGlmZnVzZTsKKyBmbG9hdCBsaWdodDFfU3BlY3VsYXI7CisgZmxvYXQgbGlnaHQxX0Nvc2luZVBvd2VyOworKi8KKworLy8gVGhpcyBpcyB3aGVyZSBhY3R1YWwgc2hhZGVyIGNvZGUgYmVnaW5zCit2b2lkIG1haW4oKSB7CisgICB2ZWM0IHdvcmxkUG9zID0gVU5JX21vZGVsICogQVRUUklCX3Bvc2l0aW9uOworICAgZ2xfUG9zaXRpb24gPSBVTklfTVZQICogd29ybGRQb3M7CisKKyAgIG1hdDMgbW9kZWwzID0gbWF0MyhVTklfbW9kZWxbMF0ueHl6LCBVTklfbW9kZWxbMV0ueHl6LCBVTklfbW9kZWxbMl0ueHl6KTsKKyAgIHZlYzMgd29ybGROb3JtID0gbW9kZWwzICogQVRUUklCX25vcm1hbDsKKyAgIHZlYzMgViA9IG5vcm1hbGl6ZSgtd29ybGRQb3MueHl6KTsKKworICAgdmVjMyBsaWdodDBWZWMgPSBub3JtYWxpemUoVU5JX2xpZ2h0MF9Qb3Npc2lvbiAtIHdvcmxkUG9zLnh5eik7CisgICB2ZWMzIGxpZ2h0MFIgPSByZWZsZWN0KGxpZ2h0MFZlYywgd29ybGROb3JtKTsKKyAgIGxpZ2h0MF9EaWZmdXNlID0gY2xhbXAoZG90KHdvcmxkTm9ybSwgbGlnaHQwVmVjKSwgMC4wLCAxLjApICogVU5JX2xpZ2h0MF9EaWZmdXNlOworICAgZmxvYXQgbGlnaHQwU3BlYyA9IGNsYW1wKGRvdChsaWdodDBSLCBWKSwgMC4wMDEsIDEuMCk7CisgICBsaWdodDBfU3BlY3VsYXIgPSBwb3cobGlnaHQwU3BlYywgVU5JX2xpZ2h0MF9Db3NpbmVQb3dlcikgKiBVTklfbGlnaHQwX1NwZWN1bGFyOworCisgICB2ZWMzIGxpZ2h0MVZlYyA9IG5vcm1hbGl6ZShVTklfbGlnaHQxX1Bvc2lzaW9uIC0gd29ybGRQb3MueHl6KTsKKyAgIHZlYzMgbGlnaHQxUiA9IHJlZmxlY3QobGlnaHQxVmVjLCB3b3JsZE5vcm0pOworICAgbGlnaHQxX0RpZmZ1c2UgPSBjbGFtcChkb3Qod29ybGROb3JtLCBsaWdodDFWZWMpLCAwLjAsIDEuMCkgKiBVTklfbGlnaHQxX0RpZmZ1c2U7CisgICBmbG9hdCBsaWdodDFTcGVjID0gY2xhbXAoZG90KGxpZ2h0MVIsIFYpLCAwLjAwMSwgMS4wKTsKKyAgIGxpZ2h0MV9TcGVjdWxhciA9IHBvdyhsaWdodDFTcGVjLCBVTklfbGlnaHQxX0Nvc2luZVBvd2VyKSAqIFVOSV9saWdodDFfU3BlY3VsYXI7CisKKyAgIGdsX1BvaW50U2l6ZSA9IDEuMDsKKyAgIHZhclRleDAgPSBBVFRSSUJfdGV4dHVyZTA7Cit9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L3RvcnVzLmEzZCBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9yYXcvdG9ydXMuYTNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOWJjMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L3RvcnVzLmEzZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3QuamF2YSBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YzczM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3QuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zYW1wbGVzOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCitpbXBvcnQgamF2YS5sYW5nLlJ1bnRpbWU7CisKK3B1YmxpYyBjbGFzcyBSc0xpc3QgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIFJzTGlzdFZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIG91ciBQcmV2aWV3IHZpZXcgYW5kIHNldCBpdCBhcyB0aGUgY29udGVudCBvZiBvdXIKKyAgICAgICAgLy8gQWN0aXZpdHkKKyAgICAgICAgbVZpZXcgPSBuZXcgUnNMaXN0Vmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtVmlldy5vblBhdXNlKCk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzTGlzdFJTLmphdmEgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3RSUy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ODJlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3RSUy5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zYW1wbGVzOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKK3B1YmxpYyBjbGFzcyBSc0xpc3RSUyB7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBTVEFURV9MQVNUX0ZPQ1VTID0gMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERBVEFfTElTVCA9IHsKKyAgICAiQWZnaGFuaXN0YW4iLCAiQWxiYW5pYSIsICJBbGdlcmlhIiwgIkFtZXJpY2FuIFNhbW9hIiwgIkFuZG9ycmEiLAorICAgICJBbmdvbGEiLCAiQW5ndWlsbGEiLCAiQW50YXJjdGljYSIsICJBbnRpZ3VhIGFuZCBCYXJidWRhIiwgIkFyZ2VudGluYSIsCisgICAgIkFybWVuaWEiLCAiQXJ1YmEiLCAiQXVzdHJhbGlhIiwgIkF1c3RyaWEiLCAiQXplcmJhaWphbiIsCisgICAgIkJhaHJhaW4iLCAiQmFuZ2xhZGVzaCIsICJCYXJiYWRvcyIsICJCZWxhcnVzIiwgIkJlbGdpdW0iLAorICAgICJCZWxpemUiLCAiQmVuaW4iLCAiQmVybXVkYSIsICJCaHV0YW4iLCAiQm9saXZpYSIsCisgICAgIkJvc25pYSBhbmQgSGVyemVnb3ZpbmEiLCAiQm90c3dhbmEiLCAiQm91dmV0IElzbGFuZCIsICJCcmF6aWwiLAorICAgICJCcml0aXNoIEluZGlhbiBPY2VhbiBUZXJyaXRvcnkiLCAiQnJpdGlzaCBWaXJnaW4gSXNsYW5kcyIsICJCcnVuZWkiLCAiQnVsZ2FyaWEiLAorICAgICJCdXJraW5hIEZhc28iLCAiQnVydW5kaSIsICJDb3RlIGQnSXZvaXJlIiwgIkNhbWJvZGlhIiwgIkNhbWVyb29uIiwgIkNhbmFkYSIsICJDYXBlIFZlcmRlIiwKKyAgICAiQ2F5bWFuIElzbGFuZHMiLCAiQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljIiwgIkNoYWQiLCAiQ2hpbGUiLCAiQ2hpbmEiLAorICAgICJDaHJpc3RtYXMgSXNsYW5kIiwgIkNvY29zIChLZWVsaW5nKSBJc2xhbmRzIiwgIkNvbG9tYmlhIiwgIkNvbW9yb3MiLCAiQ29uZ28iLAorICAgICJDb29rIElzbGFuZHMiLCAiQ29zdGEgUmljYSIsICJDcm9hdGlhIiwgIkN1YmEiLCAiQ3lwcnVzIiwgIkN6ZWNoIFJlcHVibGljIiwKKyAgICAiRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28iLCAiRGVubWFyayIsICJEamlib3V0aSIsICJEb21pbmljYSIsICJEb21pbmljYW4gUmVwdWJsaWMiLAorICAgICJFYXN0IFRpbW9yIiwgIkVjdWFkb3IiLCAiRWd5cHQiLCAiRWwgU2FsdmFkb3IiLCAiRXF1YXRvcmlhbCBHdWluZWEiLCAiRXJpdHJlYSIsCisgICAgIkVzdG9uaWEiLCAiRXRoaW9waWEiLCAiRmFlcm9lIElzbGFuZHMiLCAiRmFsa2xhbmQgSXNsYW5kcyIsICJGaWppIiwgIkZpbmxhbmQiLAorICAgICJGb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YgTWFjZWRvbmlhIiwgIkZyYW5jZSIsICJGcmVuY2ggR3VpYW5hIiwgIkZyZW5jaCBQb2x5bmVzaWEiLAorICAgICJGcmVuY2ggU291dGhlcm4gVGVycml0b3JpZXMiLCAiR2Fib24iLCAiR2VvcmdpYSIsICJHZXJtYW55IiwgIkdoYW5hIiwgIkdpYnJhbHRhciIsCisgICAgIkdyZWVjZSIsICJHcmVlbmxhbmQiLCAiR3JlbmFkYSIsICJHdWFkZWxvdXBlIiwgIkd1YW0iLCAiR3VhdGVtYWxhIiwgIkd1aW5lYSIsICJHdWluZWEtQmlzc2F1IiwKKyAgICAiR3V5YW5hIiwgIkhhaXRpIiwgIkhlYXJkIElzbGFuZCBhbmQgTWNEb25hbGQgSXNsYW5kcyIsICJIb25kdXJhcyIsICJIb25nIEtvbmciLCAiSHVuZ2FyeSIsCisgICAgIkljZWxhbmQiLCAiSW5kaWEiLCAiSW5kb25lc2lhIiwgIklyYW4iLCAiSXJhcSIsICJJcmVsYW5kIiwgIklzcmFlbCIsICJJdGFseSIsICJKYW1haWNhIiwKKyAgICAiSmFwYW4iLCAiSm9yZGFuIiwgIkthemFraHN0YW4iLCAiS2VueWEiLCAiS2lyaWJhdGkiLCAiS3V3YWl0IiwgIkt5cmd5enN0YW4iLCAiTGFvcyIsCisgICAgIkxhdHZpYSIsICJMZWJhbm9uIiwgIkxlc290aG8iLCAiTGliZXJpYSIsICJMaWJ5YSIsICJMaWVjaHRlbnN0ZWluIiwgIkxpdGh1YW5pYSIsICJMdXhlbWJvdXJnIiwKKyAgICAiTWFjYXUiLCAiTWFkYWdhc2NhciIsICJNYWxhd2kiLCAiTWFsYXlzaWEiLCAiTWFsZGl2ZXMiLCAiTWFsaSIsICJNYWx0YSIsICJNYXJzaGFsbCBJc2xhbmRzIiwKKyAgICAiTWFydGluaXF1ZSIsICJNYXVyaXRhbmlhIiwgIk1hdXJpdGl1cyIsICJNYXlvdHRlIiwgIk1leGljbyIsICJNaWNyb25lc2lhIiwgIk1vbGRvdmEiLAorICAgICJNb25hY28iLCAiTW9uZ29saWEiLCAiTW9udHNlcnJhdCIsICJNb3JvY2NvIiwgIk1vemFtYmlxdWUiLCAiTXlhbm1hciIsICJOYW1pYmlhIiwKKyAgICAiTmF1cnUiLCAiTmVwYWwiLCAiTmV0aGVybGFuZHMiLCAiTmV0aGVybGFuZHMgQW50aWxsZXMiLCAiTmV3IENhbGVkb25pYSIsICJOZXcgWmVhbGFuZCIsCisgICAgIk5pY2FyYWd1YSIsICJOaWdlciIsICJOaWdlcmlhIiwgIk5pdWUiLCAiTm9yZm9sayBJc2xhbmQiLCAiTm9ydGggS29yZWEiLCAiTm9ydGhlcm4gTWFyaWFuYXMiLAorICAgICJOb3J3YXkiLCAiT21hbiIsICJQYWtpc3RhbiIsICJQYWxhdSIsICJQYW5hbWEiLCAiUGFwdWEgTmV3IEd1aW5lYSIsICJQYXJhZ3VheSIsICJQZXJ1IiwKKyAgICAiUGhpbGlwcGluZXMiLCAiUGl0Y2Fpcm4gSXNsYW5kcyIsICJQb2xhbmQiLCAiUG9ydHVnYWwiLCAiUHVlcnRvIFJpY28iLCAiUWF0YXIiLAorICAgICJSZXVuaW9uIiwgIlJvbWFuaWEiLCAiUnVzc2lhIiwgIlJ3YW5kYSIsICJTcW8gVG9tZSBhbmQgUHJpbmNpcGUiLCAiU2FpbnQgSGVsZW5hIiwKKyAgICAiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwgIlNhaW50IEx1Y2lhIiwgIlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iLAorICAgICJTYWludCBWaW5jZW50IGFuZCB0aGUgR3JlbmFkaW5lcyIsICJTYW1vYSIsICJTYW4gTWFyaW5vIiwgIlNhdWRpIEFyYWJpYSIsICJTZW5lZ2FsIiwKKyAgICAiU2V5Y2hlbGxlcyIsICJTaWVycmEgTGVvbmUiLCAiU2luZ2Fwb3JlIiwgIlNsb3Zha2lhIiwgIlNsb3ZlbmlhIiwgIlNvbG9tb24gSXNsYW5kcyIsCisgICAgIlNvbWFsaWEiLCAiU291dGggQWZyaWNhIiwgIlNvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzIiwgIlNvdXRoIEtvcmVhIiwKKyAgICAiU3BhaW4iLCAiU3JpIExhbmthIiwgIlN1ZGFuIiwgIlN1cmluYW1lIiwgIlN2YWxiYXJkIGFuZCBKYW4gTWF5ZW4iLCAiU3dhemlsYW5kIiwgIlN3ZWRlbiIsCisgICAgIlN3aXR6ZXJsYW5kIiwgIlN5cmlhIiwgIlRhaXdhbiIsICJUYWppa2lzdGFuIiwgIlRhbnphbmlhIiwgIlRoYWlsYW5kIiwgIlRoZSBCYWhhbWFzIiwKKyAgICAiVGhlIEdhbWJpYSIsICJUb2dvIiwgIlRva2VsYXUiLCAiVG9uZ2EiLCAiVHJpbmlkYWQgYW5kIFRvYmFnbyIsICJUdW5pc2lhIiwgIlR1cmtleSIsCisgICAgIlR1cmttZW5pc3RhbiIsICJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMiLCAiVHV2YWx1IiwgIlZpcmdpbiBJc2xhbmRzIiwgIlVnYW5kYSIsCisgICAgIlVrcmFpbmUiLCAiVW5pdGVkIEFyYWIgRW1pcmF0ZXMiLCAiVW5pdGVkIEtpbmdkb20iLAorICAgICJVbml0ZWQgU3RhdGVzIiwgIlVuaXRlZCBTdGF0ZXMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyIsICJVcnVndWF5IiwgIlV6YmVraXN0YW4iLAorICAgICJWYW51YXR1IiwgIlZhdGljYW4gQ2l0eSIsICJWZW5lenVlbGEiLCAiVmlldG5hbSIsICJXYWxsaXMgYW5kIEZ1dHVuYSIsICJXZXN0ZXJuIFNhaGFyYSIsCisgICAgIlllbWVuIiwgIll1Z29zbGF2aWEiLCAiWmFtYmlhIiwgIlppbWJhYndlIgorICAgIH07CisKKyAgICBpbnQgbVdpZHRoOworICAgIGludCBtSGVpZ2h0OworCisgICAgcHVibGljIFJzTGlzdFJTKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXQoUmVuZGVyU2NyaXB0R0wgcnMsIFJlc291cmNlcyByZXMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBtUlMgPSByczsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICAgICAgbVdpZHRoID0gd2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIGluaXRSUygpOworICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBGb250IG1JdGFsaWM7CisKKyAgICBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MgbUxpc3RBbGxvY3M7CisKKyAgICBwcml2YXRlIFNjcmlwdENfUnNsaXN0IG1TY3JpcHQ7CisKKyAgICBpbnQgbUxhc3RYOworICAgIGludCBtTGFzdFk7CisKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGlvbkRvd24oaW50IHgsIGludCB5KSB7CisgICAgICAgIG1TY3JpcHQuc2V0X2dEWSgwLjBmKTsKKworICAgICAgICBtTGFzdFggPSB4OworICAgICAgICBtTGFzdFkgPSB5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQWN0aW9uTW92ZShpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgaW50IGR4ID0gbUxhc3RYIC0geDsKKyAgICAgICAgaW50IGR5ID0gbUxhc3RZIC0geTsKKworICAgICAgICBpZihNYXRoLmFicyhkeSkgPD0gMikgeworICAgICAgICAgICAgZHkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0RZKGR5KTsKKworICAgICAgICBtTGFzdFggPSB4OworICAgICAgICBtTGFzdFkgPSB5OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX1JzbGlzdChtUlMsIG1SZXMsIFIucmF3LnJzbGlzdCwgdHJ1ZSk7CisKKyAgICAgICAgbUxpc3RBbGxvY3MgPSBuZXcgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zKG1SUywgREFUQV9MSVNULmxlbmd0aCk7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBEQVRBX0xJU1QubGVuZ3RoOyBpICsrKSB7CisgICAgICAgICAgICBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MuSXRlbSBsaXN0RWxlbSA9IG5ldyBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MuSXRlbSgpOworICAgICAgICAgICAgbGlzdEVsZW0udGV4dCA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbVN0cmluZyhtUlMsIERBVEFfTElTVFtpXSk7CisgICAgICAgICAgICBtTGlzdEFsbG9jcy5zZXQobGlzdEVsZW0sIGksIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1MaXN0QWxsb2NzLmNvcHlBbGwoKTsKKworICAgICAgICBtU2NyaXB0LmJpbmRfZ0xpc3QobUxpc3RBbGxvY3MpOworCisgICAgICAgIG1JdGFsaWMgPSBGb250LmNyZWF0ZUZyb21GYW1pbHkobVJTLCBtUmVzLCAic2VyaWYiLCBGb250LlN0eWxlLkJPTERfSVRBTElDLCA4KTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0l0YWxpYyhtSXRhbGljKTsKKworICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzTGlzdFZpZXcuamF2YSBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzTGlzdFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOThlYTA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNMaXN0Vmlldy5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNhbXBsZXM7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCitwdWJsaWMgY2xhc3MgUnNMaXN0VmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgeworCisgICAgcHVibGljIFJzTGlzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAvL3NldEZvY3VzYWJsZSh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFJzTGlzdFJTIG1SZW5kZXI7CisKKworICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgc3VwZXIuc3VyZmFjZUNoYW5nZWQoaG9sZGVyLCBmb3JtYXQsIHcsIGgpOworICAgICAgICBpZiAobVJTID09IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdCh0cnVlKTsKKyAgICAgICAgICAgIG1SUy5jb250ZXh0U2V0U3VyZmFjZSh3LCBoLCBob2xkZXIuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgIG1SZW5kZXIgPSBuZXcgUnNMaXN0UlMoKTsKKyAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpLCB3LCBoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBpZihtUlMgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gbnVsbDsKKyAgICAgICAgICAgIGRlc3Ryb3lSZW5kZXJTY3JpcHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpCisgICAgeworICAgICAgICAvLyBicmVhayBwb2ludCBhdCBoZXJlCisgICAgICAgIC8vIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgd29yayB3aGVuICdleHRlbmRzIFZpZXcnIGluY2x1ZGUgJ2V4dGVuZHMgU2Nyb2xsVmlldycuCisgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQorICAgIHsKKyAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICBtUmVuZGVyLm9uQWN0aW9uRG93bigoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkpOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhY3QgPT0gZXYuQUNUSU9OX01PVkUpIHsKKyAgICAgICAgICAgIG1SZW5kZXIub25BY3Rpb25Nb3ZlKChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSk7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXMuamF2YSBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxMDA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2FtcGxlczsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW07CitpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOworCitwdWJsaWMgY2xhc3MgUnNSZW5kZXJTdGF0ZXMgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIFJzUmVuZGVyU3RhdGVzVmlldyBtVmlldzsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICAvLyBDcmVhdGUgb3VyIFByZXZpZXcgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91cgorICAgICAgICAvLyBBY3Rpdml0eQorICAgICAgICBtVmlldyA9IG5ldyBSc1JlbmRlclN0YXRlc1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlc1JTLmphdmEgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlc1JTLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc2ZTc0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzUlMuamF2YQpAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2FtcGxlczsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworCisKK3B1YmxpYyBjbGFzcyBSc1JlbmRlclN0YXRlc1JTIHsKKworICAgIGludCBtV2lkdGg7CisgICAgaW50IG1IZWlnaHQ7CisKKyAgICBwdWJsaWMgUnNSZW5kZXJTdGF0ZXNSUygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgbVJTID0gcnM7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgICAgIG1XaWR0aCA9IHdpZHRoOworICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBtT3B0aW9uc0FSR0IuaW5TY2FsZWQgPSBmYWxzZTsKKyAgICAgICAgbU9wdGlvbnNBUkdCLmluUHJlZmVycmVkQ29uZmlnID0gQml0bWFwLkNvbmZpZy5BUkdCXzg4ODg7CisgICAgICAgIG1Nb2RlID0gMDsKKyAgICAgICAgbU1heE1vZGVzID0gNzsKKyAgICAgICAgaW5pdFJTKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKworICAgIHByaXZhdGUgU2FtcGxlciBtTGluZWFyQ2xhbXA7CisgICAgcHJpdmF0ZSBTYW1wbGVyIG1MaW5lYXJXcmFwOworICAgIHByaXZhdGUgU2FtcGxlciBtTWlwTGluZWFyV3JhcDsKKyAgICBwcml2YXRlIFNhbXBsZXIgbU5lYXJlc3RDbGFtcDsKKworICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1Qcm9nU3RvcmVCbGVuZE5vbmVEZXB0aDsKKyAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUHJvZ1N0b3JlQmxlbmROb25lOworICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1Qcm9nU3RvcmVCbGVuZEFscGhhOworICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1Qcm9nU3RvcmVCbGVuZEFkZDsKKworICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1Qcm9nRnJhZ21lbnRUZXh0dXJlOworICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1Qcm9nRnJhZ21lbnRDb2xvcjsKKworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtUHJvZ1ZlcnRleDsKKyAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbiBtUFZBOworCisgICAgLy8gQ3VzdG9tIHNoYWRlcnMKKyAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXggbVByb2dWZXJ0ZXhDdXN0b207CisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4Lk1hdHJpeEFsbG9jYXRpb24gbVBWQUN1c3RvbTsKKyAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUHJvZ0ZyYWdtZW50Q3VzdG9tOworICAgIHByaXZhdGUgU2NyaXB0RmllbGRfVmVydGV4U2hhZGVyQ29uc3RhbnRzX3MgbVZTQ29uc3Q7CisgICAgcHJpdmF0ZSBTY3JpcHRGaWVsZF9GcmFnZW50U2hhZGVyQ29uc3RhbnRzX3MgbUZTQ29uc3Q7CisKKyAgICBwcml2YXRlIFByb2dyYW1SYXN0ZXIgbUN1bGxCYWNrOworICAgIHByaXZhdGUgUHJvZ3JhbVJhc3RlciBtQ3VsbEZyb250OworCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1UZXhUb3J1czsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVRleE9wYXF1ZTsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVRleFRyYW5zcGFyZW50OworCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY1BWOworCisgICAgcHJpdmF0ZSBNZXNoIG1NYnlOTWVzaDsKKyAgICBwcml2YXRlIE1lc2ggbVRvcnVzOworCisgICAgRm9udCBtRm9udFNhbnM7CisgICAgRm9udCBtRm9udFNlcmlmOworICAgIEZvbnQgbUZvbnRTZXJpZkJvbGQ7CisgICAgRm9udCBtRm9udFNlcmlmSXRhbGljOworICAgIEZvbnQgbUZvbnRTZXJpZkJvbGRJdGFsaWM7CisgICAgRm9udCBtRm9udE1vbm87CisKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVRleHRBbGxvYzsKKworICAgIHByaXZhdGUgU2NyaXB0Q19Sc3JlbmRlcnN0YXRlcyBtU2NyaXB0OworCisgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXBGYWN0b3J5Lk9wdGlvbnMgbU9wdGlvbnNBUkdCID0gbmV3IEJpdG1hcEZhY3RvcnkuT3B0aW9ucygpOworCisgICAgaW50IG1Nb2RlOworICAgIGludCBtTWF4TW9kZXM7CisKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGlvbkRvd24oaW50IHgsIGludCB5KSB7CisgICAgICAgIG1Nb2RlICsrOworICAgICAgICBtTW9kZSA9IG1Nb2RlICUgbU1heE1vZGVzOworICAgICAgICBtU2NyaXB0LnNldF9nRGlzcGxheU1vZGUobU1vZGUpOworICAgIH0KKworICAgIHByaXZhdGUgTWVzaCBnZXRNYnlOTWVzaChmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0LCBpbnQgd1Jlc29sdXRpb24sIGludCBoUmVzb2x1dGlvbikgeworCisgICAgICAgIE1lc2guVHJpYW5nbGVNZXNoQnVpbGRlciB0bWIgPSBuZXcgTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyKG1SUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCBNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIuVEVYVFVSRV8wKTsKKworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8PSBoUmVzb2x1dGlvbjsgeSsrKSB7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBub3JtYWxpemVkWSA9IChmbG9hdCl5IC8gaFJlc29sdXRpb247CisgICAgICAgICAgICBmaW5hbCBmbG9hdCB5T2Zmc2V0ID0gKG5vcm1hbGl6ZWRZIC0gMC41ZikgKiBoZWlnaHQ7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8PSB3UmVzb2x1dGlvbjsgeCsrKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgbm9ybWFsaXplZFggPSAoZmxvYXQpeCAvIHdSZXNvbHV0aW9uOworICAgICAgICAgICAgICAgIGZsb2F0IHhPZmZzZXQgPSAobm9ybWFsaXplZFggLSAwLjVmKSAqIHdpZHRoOworICAgICAgICAgICAgICAgIHRtYi5zZXRUZXh0dXJlKG5vcm1hbGl6ZWRYLCBub3JtYWxpemVkWSk7CisgICAgICAgICAgICAgICAgdG1iLmFkZFZlcnRleCh4T2Zmc2V0LCB5T2Zmc2V0KTsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhSZXNvbHV0aW9uOyB5KyspIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBjdXJZID0geSAqICh3UmVzb2x1dGlvbiArIDEpOworICAgICAgICAgICAgZmluYWwgaW50IGJlbG93WSA9ICh5ICsgMSkgKiAod1Jlc29sdXRpb24gKyAxKTsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd1Jlc29sdXRpb247IHgrKykgeworICAgICAgICAgICAgICAgIGludCBjdXJWID0gY3VyWSArIHg7CisgICAgICAgICAgICAgICAgaW50IGJlbG93ViA9IGJlbG93WSArIHg7CisgICAgICAgICAgICAgICAgdG1iLmFkZFRyaWFuZ2xlKGN1clYsIGJlbG93ViwgY3VyViArIDEpOworICAgICAgICAgICAgICAgIHRtYi5hZGRUcmlhbmdsZShiZWxvd1YsIGJlbG93ViArIDEsIGN1clYgKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0bWIuY3JlYXRlKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UHJvZ3JhbVN0b3JlKCkgeworICAgICAgICAvLyBVc2Ugc3RvY2sgdGhlIHN0b2NrIHByb2dyYW0gc3RvcmUgb2JqZWN0CisgICAgICAgIG1Qcm9nU3RvcmVCbGVuZE5vbmVEZXB0aCA9IFByb2dyYW1TdG9yZS5CTEVORF9OT05FX0RFUFRIX1RFU1QobVJTKTsKKyAgICAgICAgbVByb2dTdG9yZUJsZW5kTm9uZSA9IFByb2dyYW1TdG9yZS5CTEVORF9OT05FX0RFUFRIX05PX0RFUFRIKG1SUyk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgY3VzdG9tIHByb2dyYW0gc3RvcmUKKyAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihtUlMpOworICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkFMV0FZUyk7CisgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKFByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmMuU1JDX0FMUEhBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jLk9ORV9NSU5VU19TUkNfQUxQSEEpOworICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKGZhbHNlKTsKKyAgICAgICAgbVByb2dTdG9yZUJsZW5kQWxwaGEgPSBidWlsZGVyLmNyZWF0ZSgpOworCisgICAgICAgIG1Qcm9nU3RvcmVCbGVuZEFkZCA9IFByb2dyYW1TdG9yZS5CTEVORF9BRERfREVQVEhfTk9fREVQVEgobVJTKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ1N0b3JlQmxlbmROb25lRGVwdGgobVByb2dTdG9yZUJsZW5kTm9uZURlcHRoKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dTdG9yZUJsZW5kTm9uZShtUHJvZ1N0b3JlQmxlbmROb25lKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dTdG9yZUJsZW5kQWxwaGEobVByb2dTdG9yZUJsZW5kQWxwaGEpOworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ1N0b3JlQmxlbmRBZGQobVByb2dTdG9yZUJsZW5kQWRkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFByb2dyYW1GcmFnbWVudCgpIHsKKworICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlciB0ZXhCdWlsZGVyID0gbmV3IFByb2dyYW1GcmFnbWVudC5CdWlsZGVyKG1SUyk7CisgICAgICAgIHRleEJ1aWxkZXIuc2V0VGV4dHVyZShQcm9ncmFtRnJhZ21lbnQuQnVpbGRlci5FbnZNb2RlLlJFUExBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlci5Gb3JtYXQuUkdCQSwgMCk7CisgICAgICAgIG1Qcm9nRnJhZ21lbnRUZXh0dXJlID0gdGV4QnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgbVByb2dGcmFnbWVudFRleHR1cmUuYmluZFNhbXBsZXIobUxpbmVhckNsYW1wLCAwKTsKKworICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlciBjb2xCdWlsZGVyID0gbmV3IFByb2dyYW1GcmFnbWVudC5CdWlsZGVyKG1SUyk7CisgICAgICAgIGNvbEJ1aWxkZXIuc2V0VmFyeWluZ0NvbG9yKGZhbHNlKTsKKyAgICAgICAgbVByb2dGcmFnbWVudENvbG9yID0gY29sQnVpbGRlci5jcmVhdGUoKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ0ZyYWdtZW50Q29sb3IobVByb2dGcmFnbWVudENvbG9yKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dGcmFnbWVudFRleHR1cmUobVByb2dGcmFnbWVudFRleHR1cmUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UHJvZ3JhbVZlcnRleCgpIHsKKyAgICAgICAgUHJvZ3JhbVZlcnRleC5CdWlsZGVyIHB2YiA9IG5ldyBQcm9ncmFtVmVydGV4LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgbVByb2dWZXJ0ZXggPSBwdmIuY3JlYXRlKCk7CisKKyAgICAgICAgbVBWQSA9IG5ldyBQcm9ncmFtVmVydGV4Lk1hdHJpeEFsbG9jYXRpb24obVJTKTsKKyAgICAgICAgbVByb2dWZXJ0ZXguYmluZEFsbG9jYXRpb24obVBWQSk7CisgICAgICAgIG1QVkEuc2V0dXBPcnRob1dpbmRvdyhtV2lkdGgsIG1IZWlnaHQpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nVmVydGV4KG1Qcm9nVmVydGV4KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdEN1c3RvbVNoYWRlcnMoKSB7CisgICAgICAgIG1WU0NvbnN0ID0gbmV3IFNjcmlwdEZpZWxkX1ZlcnRleFNoYWRlckNvbnN0YW50c19zKG1SUywgMSk7CisgICAgICAgIG1GU0NvbnN0ID0gbmV3IFNjcmlwdEZpZWxkX0ZyYWdlbnRTaGFkZXJDb25zdGFudHNfcyhtUlMsIDEpOworCisgICAgICAgIG1TY3JpcHQuYmluZF9nVlNDb25zdGFudHMobVZTQ29uc3QpOworICAgICAgICBtU2NyaXB0LmJpbmRfZ0ZTQ29uc3RhbnRzKG1GU0NvbnN0KTsKKworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBzaGFkZXIgYnVpbGRlcgorICAgICAgICBQcm9ncmFtVmVydGV4LlNoYWRlckJ1aWxkZXIgcHZiQ3VzdG9tID0gbmV3IFByb2dyYW1WZXJ0ZXguU2hhZGVyQnVpbGRlcihtUlMpOworICAgICAgICAvLyBTcGVjaWZ5IHRoZSByZXNvdXJjZSB0aGF0IGNvbnRhaW5zIHRoZSBzaGFkZXIgc3RyaW5nCisgICAgICAgIHB2YkN1c3RvbS5zZXRTaGFkZXIobVJlcywgUi5yYXcuc2hhZGVydik7CisgICAgICAgIC8vIFVzZSBhIHNjcmlwdCBmaWVsZCB0byBzcGNpZnkgdGhlIGlucHV0IGxheW91dAorICAgICAgICBwdmJDdXN0b20uYWRkSW5wdXQoU2NyaXB0RmllbGRfVmVydGV4U2hhZGVySW5wdXRzX3MuY3JlYXRlRWxlbWVudChtUlMpKTsKKyAgICAgICAgLy8gRGVmaW5lIHRoZSBjb25zdGFudCBpbnB1dCBsYXlvdXQKKyAgICAgICAgcHZiQ3VzdG9tLmFkZENvbnN0YW50KG1WU0NvbnN0LmdldEFsbG9jYXRpb24oKS5nZXRUeXBlKCkpOworICAgICAgICBtUHJvZ1ZlcnRleEN1c3RvbSA9IHB2YkN1c3RvbS5jcmVhdGUoKTsKKyAgICAgICAgLy8gQmluZCB0aGUgc291cmNlIG9mIGNvbnN0YW50IGRhdGEKKyAgICAgICAgbVByb2dWZXJ0ZXhDdXN0b20uYmluZENvbnN0YW50cyhtVlNDb25zdC5nZXRBbGxvY2F0aW9uKCksIDEpOworICAgICAgICBtUFZBQ3VzdG9tID0gbmV3IFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbihtUlMpOworICAgICAgICBtUHJvZ1ZlcnRleEN1c3RvbS5iaW5kQWxsb2NhdGlvbihtUFZBQ3VzdG9tKTsKKworICAgICAgICBQcm9ncmFtRnJhZ21lbnQuU2hhZGVyQnVpbGRlciBwZmJDdXN0b20gPSBuZXcgUHJvZ3JhbUZyYWdtZW50LlNoYWRlckJ1aWxkZXIobVJTKTsKKyAgICAgICAgLy8gU3BlY2lmeSB0aGUgcmVzb3VyY2UgdGhhdCBjb250YWlucyB0aGUgc2hhZGVyIHN0cmluZworICAgICAgICBwZmJDdXN0b20uc2V0U2hhZGVyKG1SZXMsIFIucmF3LnNoYWRlcmYpOworICAgICAgICAvL1RlbGwgdGhlIGJ1aWxkZXIgaG93IG1hbnkgdGV4dHVyZXMgd2UgaGF2ZQorICAgICAgICBwZmJDdXN0b20uc2V0VGV4dHVyZUNvdW50KDEpOworICAgICAgICAvLyBEZWZpbmUgdGhlIGNvbnN0YW50IGlucHV0IGxheW91dAorICAgICAgICBwZmJDdXN0b20uYWRkQ29uc3RhbnQobUZTQ29uc3QuZ2V0QWxsb2NhdGlvbigpLmdldFR5cGUoKSk7CisgICAgICAgIG1Qcm9nRnJhZ21lbnRDdXN0b20gPSBwZmJDdXN0b20uY3JlYXRlKCk7CisgICAgICAgIC8vIEJpbmQgdGhlIHNvdXJjZSBvZiBjb25zdGFudCBkYXRhCisgICAgICAgIG1Qcm9nRnJhZ21lbnRDdXN0b20uYmluZENvbnN0YW50cyhtRlNDb25zdC5nZXRBbGxvY2F0aW9uKCksIDEpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nVmVydGV4Q3VzdG9tKG1Qcm9nVmVydGV4Q3VzdG9tKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dGcmFnbWVudEN1c3RvbShtUHJvZ0ZyYWdtZW50Q3VzdG9tKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbG9hZFRleHR1cmVSR0IoaW50IGlkKSB7CisgICAgICAgIGZpbmFsIEFsbG9jYXRpb24gYWxsb2NhdGlvbiA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlKG1SUywgbVJlcywKKyAgICAgICAgICAgICAgICBpZCwgRWxlbWVudC5SR0JfNTY1KG1SUyksIHRydWUpOworICAgICAgICBhbGxvY2F0aW9uLnVwbG9hZFRvVGV4dHVyZSgwKTsKKyAgICAgICAgcmV0dXJuIGFsbG9jYXRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIGxvYWRUZXh0dXJlQVJHQihpbnQgaWQpIHsKKyAgICAgICAgQml0bWFwIGIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKG1SZXMsIGlkLCBtT3B0aW9uc0FSR0IpOworICAgICAgICBmaW5hbCBBbGxvY2F0aW9uIGFsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXAobVJTLCBiLCBFbGVtZW50LlJHQkFfODg4OChtUlMpLCB0cnVlKTsKKyAgICAgICAgYWxsb2NhdGlvbi51cGxvYWRUb1RleHR1cmUoMCk7CisgICAgICAgIHJldHVybiBhbGxvY2F0aW9uOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2FkSW1hZ2VzKCkgeworICAgICAgICBtVGV4VG9ydXMgPSBsb2FkVGV4dHVyZVJHQihSLmRyYXdhYmxlLnRvcnVzbWFwKTsKKyAgICAgICAgbVRleE9wYXF1ZSA9IGxvYWRUZXh0dXJlUkdCKFIuZHJhd2FibGUuZGF0YSk7CisgICAgICAgIG1UZXhUcmFuc3BhcmVudCA9IGxvYWRUZXh0dXJlQVJHQihSLmRyYXdhYmxlLmxlYWYpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dUZXhUb3J1cyhtVGV4VG9ydXMpOworICAgICAgICBtU2NyaXB0LnNldF9nVGV4T3BhcXVlKG1UZXhPcGFxdWUpOworICAgICAgICBtU2NyaXB0LnNldF9nVGV4VHJhbnNwYXJlbnQobVRleFRyYW5zcGFyZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdEZvbnRzKCkgeworICAgICAgICAvLyBTYW5zIGZvbnQgYnkgZmFtaWx5IG5hbWUKKyAgICAgICAgbUZvbnRTYW5zID0gRm9udC5jcmVhdGVGcm9tRmFtaWx5KG1SUywgbVJlcywgInNhbnMtc2VyaWYiLCBGb250LlN0eWxlLk5PUk1BTCwgOCk7CisgICAgICAgIC8vIENyZWF0ZSBmb250IGJ5IGZpbGUgbmFtZQorICAgICAgICBtRm9udFNlcmlmID0gRm9udC5jcmVhdGUobVJTLCBtUmVzLCAiRHJvaWRTZXJpZi1SZWd1bGFyLnR0ZiIsIDgpOworICAgICAgICAvLyBDcmVhdGUgZm9udHMgYnkgZmFtaWx5IGFuZCBzdHlsZQorICAgICAgICBtRm9udFNlcmlmQm9sZCA9IEZvbnQuY3JlYXRlRnJvbUZhbWlseShtUlMsIG1SZXMsICJzZXJpZiIsIEZvbnQuU3R5bGUuQk9MRCwgOCk7CisgICAgICAgIG1Gb250U2VyaWZJdGFsaWMgPSBGb250LmNyZWF0ZUZyb21GYW1pbHkobVJTLCBtUmVzLCAic2VyaWYiLCBGb250LlN0eWxlLklUQUxJQywgOCk7CisgICAgICAgIG1Gb250U2VyaWZCb2xkSXRhbGljID0gRm9udC5jcmVhdGVGcm9tRmFtaWx5KG1SUywgbVJlcywgInNlcmlmIiwgRm9udC5TdHlsZS5CT0xEX0lUQUxJQywgOCk7CisgICAgICAgIG1Gb250TW9ubyA9IEZvbnQuY3JlYXRlRnJvbUZhbWlseShtUlMsIG1SZXMsICJtb25vIiwgRm9udC5TdHlsZS5OT1JNQUwsIDgpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dGb250U2FucyhtRm9udFNhbnMpOworICAgICAgICBtU2NyaXB0LnNldF9nRm9udFNlcmlmKG1Gb250U2VyaWYpOworICAgICAgICBtU2NyaXB0LnNldF9nRm9udFNlcmlmQm9sZChtRm9udFNlcmlmQm9sZCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dGb250U2VyaWZJdGFsaWMobUZvbnRTZXJpZkl0YWxpYyk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dGb250U2VyaWZCb2xkSXRhbGljKG1Gb250U2VyaWZCb2xkSXRhbGljKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0ZvbnRNb25vKG1Gb250TW9ubyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRNZXNoKCkgeworICAgICAgICBtTWJ5Tk1lc2ggPSBnZXRNYnlOTWVzaCgyNTYsIDI1NiwgMTAsIDEwKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ01ieU5NZXNoKG1NYnlOTWVzaCk7CisKKyAgICAgICAgRmlsZUEzRCBtb2RlbCA9IEZpbGVBM0QuY3JlYXRlRnJvbVJlc291cmNlKG1SUywgbVJlcywgUi5yYXcudG9ydXMpOworICAgICAgICBGaWxlQTNELkluZGV4RW50cnkgZW50cnkgPSBtb2RlbC5nZXRJbmRleEVudHJ5KDApOworICAgICAgICBpZihlbnRyeSA9PSBudWxsIHx8IGVudHJ5LmdldENsYXNzSUQoKSAhPSBGaWxlQTNELkNsYXNzSUQuTUVTSCkgeworICAgICAgICAgICAgTG9nLmUoInJzIiwgImNvdWxkIG5vdCBsb2FkIG1vZGVsIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtVG9ydXMgPSAoTWVzaCllbnRyeS5nZXRPYmplY3QoKTsKKyAgICAgICAgICAgIG1TY3JpcHQuc2V0X2dUb3J1c01lc2gobVRvcnVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0U2FtcGxlcnMoKSB7CisgICAgICAgIFNhbXBsZXIuQnVpbGRlciBicyA9IG5ldyBTYW1wbGVyLkJ1aWxkZXIobVJTKTsKKyAgICAgICAgYnMuc2V0TWluKFNhbXBsZXIuVmFsdWUuTElORUFSKTsKKyAgICAgICAgYnMuc2V0TWFnKFNhbXBsZXIuVmFsdWUuTElORUFSKTsKKyAgICAgICAgYnMuc2V0V3JhcFMoU2FtcGxlci5WYWx1ZS5XUkFQKTsKKyAgICAgICAgYnMuc2V0V3JhcFQoU2FtcGxlci5WYWx1ZS5XUkFQKTsKKyAgICAgICAgbUxpbmVhcldyYXAgPSBicy5jcmVhdGUoKTsKKworICAgICAgICBtTGluZWFyQ2xhbXAgPSBTYW1wbGVyLkNMQU1QX0xJTkVBUihtUlMpOworICAgICAgICBtTmVhcmVzdENsYW1wID0gU2FtcGxlci5DTEFNUF9ORUFSRVNUKG1SUyk7CisgICAgICAgIG1NaXBMaW5lYXJXcmFwID0gU2FtcGxlci5XUkFQX0xJTkVBUl9NSVBfTElORUFSKG1SUyk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0xpbmVhckNsYW1wKG1MaW5lYXJDbGFtcCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dMaW5lYXJXcmFwKG1MaW5lYXJXcmFwKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ01pcExpbmVhcldyYXAobU1pcExpbmVhcldyYXApOworICAgICAgICBtU2NyaXB0LnNldF9nTmVhcmVzdENsYW1wKG1OZWFyZXN0Q2xhbXApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UHJvZ3JhbVJhc3RlcigpIHsKKyAgICAgICAgbUN1bGxCYWNrID0gUHJvZ3JhbVJhc3Rlci5DVUxMX0JBQ0sobVJTKTsKKyAgICAgICAgbUN1bGxGcm9udCA9IFByb2dyYW1SYXN0ZXIuQ1VMTF9GUk9OVChtUlMpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dDdWxsQmFjayhtQ3VsbEJhY2spOworICAgICAgICBtU2NyaXB0LnNldF9nQ3VsbEZyb250KG1DdWxsRnJvbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX1JzcmVuZGVyc3RhdGVzKG1SUywgbVJlcywgUi5yYXcucnNyZW5kZXJzdGF0ZXMsIHRydWUpOworCisgICAgICAgIGluaXRTYW1wbGVycygpOworICAgICAgICBpbml0UHJvZ3JhbVN0b3JlKCk7CisgICAgICAgIGluaXRQcm9ncmFtRnJhZ21lbnQoKTsKKyAgICAgICAgaW5pdFByb2dyYW1WZXJ0ZXgoKTsKKyAgICAgICAgaW5pdEZvbnRzKCk7CisgICAgICAgIGxvYWRJbWFnZXMoKTsKKyAgICAgICAgaW5pdE1lc2goKTsKKyAgICAgICAgaW5pdFByb2dyYW1SYXN0ZXIoKTsKKyAgICAgICAgaW5pdEN1c3RvbVNoYWRlcnMoKTsKKworICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzVmlldy5qYXZhIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXNWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0OGRlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzVmlldy5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNhbXBsZXM7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCitwdWJsaWMgY2xhc3MgUnNSZW5kZXJTdGF0ZXNWaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisKKyAgICBwdWJsaWMgUnNSZW5kZXJTdGF0ZXNWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgLy9zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBSc1JlbmRlclN0YXRlc1JTIG1SZW5kZXI7CisKKworICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgc3VwZXIuc3VyZmFjZUNoYW5nZWQoaG9sZGVyLCBmb3JtYXQsIHcsIGgpOworICAgICAgICBpZiAobVJTID09IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdCh0cnVlKTsKKyAgICAgICAgICAgIG1SUy5jb250ZXh0U2V0U3VyZmFjZSh3LCBoLCBob2xkZXIuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgIG1SZW5kZXIgPSBuZXcgUnNSZW5kZXJTdGF0ZXNSUygpOworICAgICAgICAgICAgbVJlbmRlci5pbml0KG1SUywgZ2V0UmVzb3VyY2VzKCksIHcsIGgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIGlmKG1SUyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBudWxsOworICAgICAgICAgICAgZGVzdHJveVJlbmRlclNjcmlwdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkKKyAgICB7CisgICAgICAgIC8vIGJyZWFrIHBvaW50IGF0IGhlcmUKKyAgICAgICAgLy8gdGhpcyBtZXRob2QgZG9lc24ndCB3b3JrIHdoZW4gJ2V4dGVuZHMgVmlldycgaW5jbHVkZSAnZXh0ZW5kcyBTY3JvbGxWaWV3Jy4KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpCisgICAgeworICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOworICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGlmIChhY3QgPT0gZXYuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgIG1SZW5kZXIub25BY3Rpb25Eb3duKChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSk7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvcnNsaXN0LnJzIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvcnNsaXN0LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjM2Y0NjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9yc2xpc3QucnMKQEAgLTAsMCArMSw3MyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnNhbXBsZXMpCisKKyNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCisKK2Zsb2F0IGdEWTsKKworcnNfZm9udCBnSXRhbGljOworCit0eXBlZGVmIHN0cnVjdCBMaXN0QWxsb2NzX3MgeworICAgIHJzX2FsbG9jYXRpb24gdGV4dDsKK30gTGlzdEFsbG9jczsKKworTGlzdEFsbG9jcyAqZ0xpc3Q7CisKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihnRFksIGdJdGFsaWMsIGdMaXN0KQorCit2b2lkIGluaXQoKSB7CisgICAgZ0RZID0gMC4wZjsKK30KKworaW50IHRleHRQb3MgPSAwOworCitpbnQgcm9vdChpbnQgbGF1bmNoSUQpIHsKKworICAgIHJzZ0NsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisgICAgcnNnQ2xlYXJEZXB0aCgxLjBmKTsKKworICAgIHRleHRQb3MgLT0gKGludClnRFkqMjsKKyAgICBnRFkgKj0gMC45NTsKKworICAgIHJzZ0ZvbnRDb2xvcigwLjlmLCAwLjlmLCAwLjlmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnSXRhbGljKTsKKyAgICBjb2xvcigwLjIsIDAuMiwgMC4yLCAwKTsKKworICAgIHJzX2FsbG9jYXRpb24gbGlzdEFsbG9jID0gcnNHZXRBbGxvY2F0aW9uKGdMaXN0KTsKKyAgICBpbnQgYWxsb2NTaXplID0gcnNBbGxvY2F0aW9uR2V0RGltWChsaXN0QWxsb2MpOworCisgICAgaW50IHdpZHRoID0gcnNnR2V0V2lkdGgoKTsKKyAgICBpbnQgaGVpZ2h0ID0gcnNnR2V0SGVpZ2h0KCk7CisKKyAgICBpbnQgaXRlbUhlaWdodCA9IDgwOworICAgIGludCBjdXJyZW50WVBvcyA9IGl0ZW1IZWlnaHQgKyB0ZXh0UG9zOworCisgICAgZm9yKGludCBpID0gMDsgaSA8IGFsbG9jU2l6ZTsgaSArKykgeworICAgICAgICBpZihjdXJyZW50WVBvcyAtIGl0ZW1IZWlnaHQgPiBoZWlnaHQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYoY3VycmVudFlQb3MgPiAwKSB7CisgICAgICAgICAgICByc2dEcmF3UmVjdCgwLCBjdXJyZW50WVBvcyAtIDEsIHdpZHRoLCBjdXJyZW50WVBvcywgMCk7CisgICAgICAgICAgICByc2dEcmF3VGV4dChnTGlzdFtpXS50ZXh0LCAzMCwgY3VycmVudFlQb3MgLSAzMik7CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudFlQb3MgKz0gaXRlbUhlaWdodDsKKyAgICB9CisKKyAgICByZXR1cm4gMTA7Cit9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9yc3JlbmRlcnN0YXRlcy5ycyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL3JzcmVuZGVyc3RhdGVzLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNjEzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9yc3JlbmRlcnN0YXRlcy5ycwpAQCAtMCwwICsxLDQ1MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnNhbXBsZXMpCisKKyNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCisjaW5jbHVkZSAic2hhZGVyX2RlZi5yc2giCisKK3JzX3Byb2dyYW1fdmVydGV4IGdQcm9nVmVydGV4OworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUHJvZ0ZyYWdtZW50Q29sb3I7Cityc19wcm9ncmFtX2ZyYWdtZW50IGdQcm9nRnJhZ21lbnRUZXh0dXJlOworCityc19wcm9ncmFtX3N0b3JlIGdQcm9nU3RvcmVCbGVuZE5vbmVEZXB0aDsKK3JzX3Byb2dyYW1fc3RvcmUgZ1Byb2dTdG9yZUJsZW5kTm9uZTsKK3JzX3Byb2dyYW1fc3RvcmUgZ1Byb2dTdG9yZUJsZW5kQWxwaGE7Cityc19wcm9ncmFtX3N0b3JlIGdQcm9nU3RvcmVCbGVuZEFkZDsKKworcnNfYWxsb2NhdGlvbiBnVGV4T3BhcXVlOworcnNfYWxsb2NhdGlvbiBnVGV4VG9ydXM7Cityc19hbGxvY2F0aW9uIGdUZXhUcmFuc3BhcmVudDsKKworcnNfbWVzaCBnTWJ5Tk1lc2g7Cityc19tZXNoIGdUb3J1c01lc2g7CisKK3JzX2ZvbnQgZ0ZvbnRTYW5zOworcnNfZm9udCBnRm9udFNlcmlmOworcnNfZm9udCBnRm9udFNlcmlmQm9sZDsKK3JzX2ZvbnQgZ0ZvbnRTZXJpZkl0YWxpYzsKK3JzX2ZvbnQgZ0ZvbnRTZXJpZkJvbGRJdGFsaWM7Cityc19mb250IGdGb250TW9ubzsKKworaW50IGdEaXNwbGF5TW9kZTsKKworcnNfc2FtcGxlciBnTGluZWFyQ2xhbXA7Cityc19zYW1wbGVyIGdMaW5lYXJXcmFwOworcnNfc2FtcGxlciBnTWlwTGluZWFyV3JhcDsKK3JzX3NhbXBsZXIgZ05lYXJlc3RDbGFtcDsKKworcnNfcHJvZ3JhbV9yYXN0ZXIgZ0N1bGxCYWNrOworcnNfcHJvZ3JhbV9yYXN0ZXIgZ0N1bGxGcm9udDsKKworLy8gQ3VzdG9tIHZlcnRleCBzaGFkZXIgY29tcHVuZW50cworVmVydGV4U2hhZGVyQ29uc3RhbnRzICpnVlNDb25zdGFudHM7CitGcmFnZW50U2hhZGVyQ29uc3RhbnRzICpnRlNDb25zdGFudHM7CisvLyBFeHBvcnQgdGhlc2Ugb3V0IHRvIGVhc2lseSBzZXQgdGhlIGlucHV0cyB0byBzaGFkZXIKK1ZlcnRleFNoYWRlcklucHV0cyAqZ1ZTSW5wdXRzOworLy8gQ3VzdG9tIHNoYWRlcnMgd2UgdXNlIGZvciBsaWdodGluZworcnNfcHJvZ3JhbV92ZXJ0ZXggZ1Byb2dWZXJ0ZXhDdXN0b207Cityc19wcm9ncmFtX2ZyYWdtZW50IGdQcm9nRnJhZ21lbnRDdXN0b207CisKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihnUHJvZ1ZlcnRleCwgZ1Byb2dGcmFnbWVudENvbG9yLCBnUHJvZ0ZyYWdtZW50VGV4dHVyZSkKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihnUHJvZ1N0b3JlQmxlbmROb25lRGVwdGgsIGdQcm9nU3RvcmVCbGVuZE5vbmUsIGdQcm9nU3RvcmVCbGVuZEFscGhhLCBnUHJvZ1N0b3JlQmxlbmRBZGQpCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ1RleE9wYXF1ZSwgZ1RleFRvcnVzLCBnVGV4VHJhbnNwYXJlbnQpCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ01ieU5NZXNoLCBnVG9ydXNNZXNoKQorI3ByYWdtYSBycyBleHBvcnRfdmFyKGdGb250U2FucywgZ0ZvbnRTZXJpZiwgZ0ZvbnRTZXJpZkJvbGQsIGdGb250U2VyaWZJdGFsaWMsIGdGb250U2VyaWZCb2xkSXRhbGljLCBnRm9udE1vbm8pCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ0xpbmVhckNsYW1wLCBnTGluZWFyV3JhcCwgZ01pcExpbmVhcldyYXAsIGdOZWFyZXN0Q2xhbXApCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ0N1bGxCYWNrLCBnQ3VsbEZyb250KQorI3ByYWdtYSBycyBleHBvcnRfdmFyKGdWU0NvbnN0YW50cywgZ0ZTQ29uc3RhbnRzLCBnVlNJbnB1dHMsIGdQcm9nVmVydGV4Q3VzdG9tLCBnUHJvZ0ZyYWdtZW50Q3VzdG9tKQorCisvL1doYXQgd2UgYXJlIHNob3dpbmcKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihnRGlzcGxheU1vZGUpCisKK2Zsb2F0IGdEdCA9IDA7CisKK3ZvaWQgaW5pdCgpIHsKK30KKwordm9pZCBkaXNwbGF5Rm9udFNhbXBsZXMoKSB7CisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIGludCB5UG9zID0gMzA7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRTYW5zKTsKKyAgICByc2dEcmF3VGV4dCgiU2FucyBmb250IHNhbXBsZSIsIDMwLCB5UG9zKTsKKyAgICB5UG9zICs9IDMwOworICAgIHJzZ0ZvbnRDb2xvcigwLjVmLCAwLjlmLCAwLjVmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udFNlcmlmKTsKKyAgICByc2dEcmF3VGV4dCgiU2VyaWYgZm9udCBzYW1wbGUiLCAzMCwgeVBvcyk7CisgICAgeVBvcyArPSAzMDsKKyAgICByc2dGb250Q29sb3IoMC43ZiwgMC43ZiwgMC43ZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRTZXJpZkJvbGQpOworICAgIHJzZ0RyYXdUZXh0KCJTZXJpZiBCb2xkIGZvbnQgc2FtcGxlIiwgMzAsIHlQb3MpOworICAgIHlQb3MgKz0gMzA7CisgICAgcnNnRm9udENvbG9yKDAuNWYsIDAuNWYsIDAuOWYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250U2VyaWZJdGFsaWMpOworICAgIHJzZ0RyYXdUZXh0KCJTZXJpZiBJdGFsaWMgZm9udCBzYW1wbGUiLCAzMCwgeVBvcyk7CisgICAgeVBvcyArPSAzMDsKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRTZXJpZkJvbGRJdGFsaWMpOworICAgIHJzZ0RyYXdUZXh0KCJTZXJpZiBCb2xkIEl0YWxpYyBmb250IHNhbXBsZSIsIDMwLCB5UG9zKTsKKyAgICB5UG9zICs9IDMwOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgcnNnRHJhd1RleHQoIk1vbm9zcGFjZSBmb250IHNhbXBsZSIsIDMwLCB5UG9zKTsKK30KKwordm9pZCBiaW5kUHJvZ3JhbVZlcnRleE9ydGhvKCkgeworICAgIC8vIERlZmF1bHQgdmVydGV4IHNhaGRlcgorICAgIHJzZ0JpbmRQcm9ncmFtVmVydGV4KGdQcm9nVmVydGV4KTsKKyAgICAvLyBTZXR1cCB0aGUgcHJvamVjdGlvbmkgbWF0cml4CisgICAgcnNfbWF0cml4NHg0IHByb2o7CisgICAgcnNNYXRyaXhMb2FkT3J0aG8oJnByb2osIDAsIHJzZ0dldFdpZHRoKCksIHJzZ0dldEhlaWdodCgpLCAwLCAtMSwxKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZFByb2plY3Rpb25NYXRyaXgoJnByb2opOworfQorCit2b2lkIGRpc3BsYXlTaGFkZXJTYW1wbGVzKCkgeworICAgIGJpbmRQcm9ncmFtVmVydGV4T3J0aG8oKTsKKyAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KCZtYXRyaXgpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisKKyAgICAvLyBGcmFnbWVudCBzaGFkZXIgd2l0aCB0ZXh0dXJlCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmROb25lKTsKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQcm9nRnJhZ21lbnRUZXh0dXJlKTsKKyAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ0xpbmVhckNsYW1wKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ1RleE9wYXF1ZSk7CisKKyAgICBmbG9hdCBzdGFydFggPSAwLCBzdGFydFkgPSAwOworICAgIGZsb2F0IHdpZHRoID0gMjU2LCBoZWlnaHQgPSAyNTY7CisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoc3RhcnRYLCBzdGFydFksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYLCBzdGFydFkgKyBoZWlnaHQsIDAsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZLCAwLCAxLCAwKTsKKworICAgIHN0YXJ0WCA9IDIwMDsgc3RhcnRZID0gMDsKKyAgICB3aWR0aCA9IDEyODsgaGVpZ2h0ID0gMTI4OworICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKHN0YXJ0WCwgc3RhcnRZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSwgMCwgMSwgMCk7CisKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZEFscGhhKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ1RleFRyYW5zcGFyZW50KTsKKyAgICBzdGFydFggPSAwOyBzdGFydFkgPSAyMDA7CisgICAgd2lkdGggPSAxMjg7IGhlaWdodCA9IDEyODsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEsIDApOworCisgICAgLy8gRnJhZ21lbnQgcHJvZ3JhbSB3aXRoIHNpbXBsZSBjb2xvcgorICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudENvbG9yKTsKKyAgICByc2dQcm9ncmFtRnJhZ21lbnRDb25zdGFudENvbG9yKGdQcm9nRnJhZ21lbnRDb2xvciwgMC45LCAwLjMsIDAuMywgMSk7CisgICAgcnNnRHJhd1JlY3QoMjAwLCAzMDAsIDM1MCwgNDUwLCAwKTsKKyAgICByc2dQcm9ncmFtRnJhZ21lbnRDb25zdGFudENvbG9yKGdQcm9nRnJhZ21lbnRDb2xvciwgMC4zLCAwLjksIDAuMywgMSk7CisgICAgcnNnRHJhd1JlY3QoNTAsIDQwMCwgNDAwLCA2MDAsIDApOworCisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgcnNnRHJhd1RleHQoIlRleHR1cmUgc2hhZGVyIiwgMTAsIDUwKTsKKyAgICByc2dEcmF3VGV4dCgiQWxwaGEtYmxlbmRlZCB0ZXh0dXJlIHNoYWRlciIsIDEwLCAyODApOworICAgIHJzZ0RyYXdUZXh0KCJGbGF0IGNvbG9yIHNoYWRlciIsIDEwMCwgNDUwKTsKK30KKwordm9pZCBkaXNwbGF5QmxlbmRpbmdTYW1wbGVzKCkgeworICAgIGludCBpOworCisgICAgYmluZFByb2dyYW1WZXJ0ZXhPcnRobygpOworICAgIHJzX21hdHJpeDR4NCBtYXRyaXg7CisgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkoJm1hdHJpeCk7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbWF0cml4KTsKKworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudENvbG9yKTsKKworICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kTm9uZSk7CisgICAgZm9yKGkgPSAwOyBpIDwgMzsgaSArKykgeworICAgICAgICBmbG9hdCBpUGx1c09uZSA9IChmbG9hdCkoaSArIDEpOworICAgICAgICByc2dQcm9ncmFtRnJhZ21lbnRDb25zdGFudENvbG9yKGdQcm9nRnJhZ21lbnRDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjFmKmlQbHVzT25lLCAwLjJmKmlQbHVzT25lLCAwLjNmKmlQbHVzT25lLCAxKTsKKyAgICAgICAgZmxvYXQgeVBvcyA9IDE1MCAqIChmbG9hdClpOworICAgICAgICByc2dEcmF3UmVjdCgwLCB5UG9zLCAyMDAsIHlQb3MgKyAyMDAsIDApOworICAgIH0KKworICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kQWxwaGEpOworICAgIGZvcihpID0gMDsgaSA8IDM7IGkgKyspIHsKKyAgICAgICAgZmxvYXQgaVBsdXNPbmUgPSAoZmxvYXQpKGkgKyAxKTsKKyAgICAgICAgcnNnUHJvZ3JhbUZyYWdtZW50Q29uc3RhbnRDb2xvcihnUHJvZ0ZyYWdtZW50Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yZippUGx1c09uZSwgMC4zZippUGx1c09uZSwgMC4xZippUGx1c09uZSwgMC41KTsKKyAgICAgICAgZmxvYXQgeVBvcyA9IDE1MCAqIChmbG9hdClpOworICAgICAgICByc2dEcmF3UmVjdCgxNTAsIHlQb3MsIDM1MCwgeVBvcyArIDIwMCwgMCk7CisgICAgfQorCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmRBZGQpOworICAgIGZvcihpID0gMDsgaSA8IDM7IGkgKyspIHsKKyAgICAgICAgZmxvYXQgaVBsdXNPbmUgPSAoZmxvYXQpKGkgKyAxKTsKKyAgICAgICAgcnNnUHJvZ3JhbUZyYWdtZW50Q29uc3RhbnRDb2xvcihnUHJvZ0ZyYWdtZW50Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zZippUGx1c09uZSwgMC4xZippUGx1c09uZSwgMC4yZippUGx1c09uZSwgMC41KTsKKyAgICAgICAgZmxvYXQgeVBvcyA9IDE1MCAqIChmbG9hdClpOworICAgICAgICByc2dEcmF3UmVjdCgzMDAsIHlQb3MsIDUwMCwgeVBvcyArIDIwMCwgMCk7CisgICAgfQorCisKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRNb25vKTsKKyAgICByc2dEcmF3VGV4dCgiTm8gQmxlbmRpbmciLCAxMCwgNTApOworICAgIHJzZ0RyYXdUZXh0KCJBbHBoYSBCbGVuZGluZyIsIDE2MCwgMTUwKTsKKyAgICByc2dEcmF3VGV4dCgiQWRkaXRpdmUgQmxlbmRpbmciLCAzMjAsIDI1MCk7CisKK30KKwordm9pZCBkaXNwbGF5TWVzaFNhbXBsZXMoKSB7CisKKyAgICBiaW5kUHJvZ3JhbVZlcnRleE9ydGhvKCk7CisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDsKKyAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJm1hdHJpeCwgMTI4LCAxMjgsIDApOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisKKyAgICAvLyBGcmFnbWVudCBzaGFkZXIgd2l0aCB0ZXh0dXJlCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmROb25lKTsKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQcm9nRnJhZ21lbnRUZXh0dXJlKTsKKyAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ0xpbmVhckNsYW1wKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ1RleE9wYXF1ZSk7CisKKyAgICByc2dEcmF3TWVzaChnTWJ5Tk1lc2gpOworCisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgcnNnRHJhd1RleHQoIlVzZXIgZ2VuIDEwIGJ5IDEwIGdyaWQgbWVzaCIsIDEwLCAyNTApOworfQorCit2b2lkIGRpc3BsYXlUZXh0dXJlU2FtcGxlcnMoKSB7CisKKyAgICBiaW5kUHJvZ3JhbVZlcnRleE9ydGhvKCk7CisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eSgmbWF0cml4KTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworCisgICAgLy8gRnJhZ21lbnQgc2hhZGVyIHdpdGggdGV4dHVyZQorICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kTm9uZSk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdUZXhPcGFxdWUpOworCisgICAgLy8gTGluZWFyIGNsYW1wCisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdMaW5lYXJDbGFtcCk7CisgICAgZmxvYXQgc3RhcnRYID0gMCwgc3RhcnRZID0gMDsKKyAgICBmbG9hdCB3aWR0aCA9IDMwMCwgaGVpZ2h0ID0gMzAwOworICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKHN0YXJ0WCwgc3RhcnRZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAwLCAxLjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMS4xLCAxLjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSwgMCwgMS4xLCAwKTsKKworICAgIC8vIExpbmVhciBXcmFwCisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdMaW5lYXJXcmFwKTsKKyAgICBzdGFydFggPSAwOyBzdGFydFkgPSAzMDA7CisgICAgd2lkdGggPSAzMDA7IGhlaWdodCA9IDMwMDsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMS4xLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEuMSwgMS4xLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEuMSwgMCk7CisKKyAgICAvLyBOZWFyZXN0CisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdOZWFyZXN0Q2xhbXApOworICAgIHN0YXJ0WCA9IDMwMDsgc3RhcnRZID0gMDsKKyAgICB3aWR0aCA9IDMwMDsgaGVpZ2h0ID0gMzAwOworICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKHN0YXJ0WCwgc3RhcnRZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAwLCAxLjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMS4xLCAxLjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSwgMCwgMS4xLCAwKTsKKworICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnTWlwTGluZWFyV3JhcCk7CisgICAgc3RhcnRYID0gMzAwOyBzdGFydFkgPSAzMDA7CisgICAgd2lkdGggPSAzMDA7IGhlaWdodCA9IDMwMDsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMS41LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEuNSwgMS41LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEuNSwgMCk7CisKKworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIHJzZ0RyYXdUZXh0KCJGaWx0ZXJpbmc6IGxpbmVhciBjbGFtcCIsIDEwLCAyOTApOworICAgIHJzZ0RyYXdUZXh0KCJGaWx0ZXJpbmc6IGxpbmVhciB3cmFwIiwgMTAsIDU5MCk7CisgICAgcnNnRHJhd1RleHQoIkZpbHRlcmluZzogbmVhcmVzdCBjbGFtcCIsIDMxMCwgMjkwKTsKKyAgICByc2dEcmF3VGV4dCgiRmlsdGVyaW5nOiBtaXBsaW5lYXIgd3JhcCIsIDMxMCwgNTkwKTsKKworfQorCitmbG9hdCBnVG9ydXNSb3RhdGlvbiA9IDA7CisKK3ZvaWQgZGlzcGxheUN1bGxpbmdTYW1wbGVzKCkgeworICAgIHJzZ0JpbmRQcm9ncmFtVmVydGV4KGdQcm9nVmVydGV4KTsKKyAgICAvLyBTZXR1cCB0aGUgcHJvamVjdGlvbmkgbWF0cml4IHdpdGggNjAgZGVncmVlIGZpZWxkIG9mIHZpZXcKKyAgICByc19tYXRyaXg0eDQgcHJvajsKKyAgICBmbG9hdCBhc3BlY3QgPSAoZmxvYXQpcnNnR2V0V2lkdGgoKSAvIChmbG9hdClyc2dHZXRIZWlnaHQoKTsKKyAgICByc01hdHJpeExvYWRQZXJzcGVjdGl2ZSgmcHJvaiwgMzAuMGYsIGFzcGVjdCwgMC4xZiwgMTAwLjBmKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZFByb2plY3Rpb25NYXRyaXgoJnByb2opOworCisgICAgLy8gRnJhZ21lbnQgc2hhZGVyIHdpdGggdGV4dHVyZQorICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kTm9uZURlcHRoKTsKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQcm9nRnJhZ21lbnRUZXh0dXJlKTsKKyAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ0xpbmVhckNsYW1wKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ1RleFRvcnVzKTsKKworICAgIC8vIEFwbGx5IGEgcm90YXRpb24gdG8gb3VyIG1lc2gKKyAgICBnVG9ydXNSb3RhdGlvbiArPSA1MC4wZiAqIGdEdDsKKyAgICBpZihnVG9ydXNSb3RhdGlvbiA+IDM2MC4wZikgeworICAgICAgICBnVG9ydXNSb3RhdGlvbiAtPSAzNjAuMGY7CisgICAgfQorCisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDsKKyAgICAvLyBQb3NpdGlvbiBvdXIgbW9kZWwgb24gdGhlIHNjcmVlbgorICAgIHJzTWF0cml4TG9hZFRyYW5zbGF0ZSgmbWF0cml4LCAtMi4wZiwgMC4wZiwgLTEwLjBmKTsKKyAgICByc01hdHJpeFJvdGF0ZSgmbWF0cml4LCBnVG9ydXNSb3RhdGlvbiwgMS4wZiwgMC4wZiwgMC4wZik7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbWF0cml4KTsKKyAgICAvLyBVc2UgZnJvbnQgZmFjZSBjdWxsaW5nCisgICAgcnNnQmluZFByb2dyYW1SYXN0ZXIoZ0N1bGxGcm9udCk7CisgICAgcnNnRHJhd01lc2goZ1RvcnVzTWVzaCk7CisKKyAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJm1hdHJpeCwgMi4wZiwgMC4wZiwgLTEwLjBmKTsKKyAgICByc01hdHJpeFJvdGF0ZSgmbWF0cml4LCBnVG9ydXNSb3RhdGlvbiwgMS4wZiwgMC4wZiwgMC4wZik7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbWF0cml4KTsKKyAgICAvLyBVc2UgYmFjayBmYWNlIGN1bGxpbmcKKyAgICByc2dCaW5kUHJvZ3JhbVJhc3RlcihnQ3VsbEJhY2spOworICAgIHJzZ0RyYXdNZXNoKGdUb3J1c01lc2gpOworCisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgcnNnRHJhd1RleHQoIkRpc3BsYXlpbmcgbWVzaCBmcm9udC9iYWNrIGZhY2UgY3VsbGluZyIsIDEwLCByc2dHZXRIZWlnaHQoKSAtIDEwKTsKK30KKworZmxvYXQgZ0xpZ2h0MFJvdGF0aW9uID0gMDsKK2Zsb2F0IGdMaWdodDFSb3RhdGlvbiA9IDA7CisKK3ZvaWQgc2V0dXBDdXN0b21TaGFkZXJMaWdodHMoKSB7CisgICAgZmxvYXQ0IGxpZ2h0MFBvcyA9IHstNS4wZiwgNS4wZiwgLTEwLjBmLCAxLjBmfTsKKyAgICBmbG9hdDQgbGlnaHQxUG9zID0gezIuMGYsIDUuMGYsIDE1LjBmLCAxLjBmfTsKKyAgICBmbG9hdDMgbGlnaHQwRGlmZkNvbCA9IHswLjlmLCAwLjdmLCAwLjdmfTsKKyAgICBmbG9hdDMgbGlnaHQwU3BlY0NvbCA9IHswLjlmLCAwLjZmLCAwLjZmfTsKKyAgICBmbG9hdDMgbGlnaHQxRGlmZkNvbCA9IHswLjVmLCAwLjVmLCAwLjlmfTsKKyAgICBmbG9hdDMgbGlnaHQxU3BlY0NvbCA9IHswLjVmLCAwLjVmLCAwLjlmfTsKKworICAgIGdMaWdodDBSb3RhdGlvbiArPSA1MC4wZiAqIGdEdDsKKyAgICBpZihnTGlnaHQwUm90YXRpb24gPiAzNjAuMGYpIHsKKyAgICAgICAgZ0xpZ2h0MFJvdGF0aW9uIC09IDM2MC4wZjsKKyAgICB9CisgICAgZ0xpZ2h0MVJvdGF0aW9uIC09IDUwLjBmICogZ0R0OworICAgIGlmKGdMaWdodDFSb3RhdGlvbiA+IDM2MC4wZikgeworICAgICAgICBnTGlnaHQxUm90YXRpb24gLT0gMzYwLjBmOworICAgIH0KKworICAgIHJzX21hdHJpeDR4NCBsME1hdDsKKyAgICByc01hdHJpeExvYWRSb3RhdGUoJmwwTWF0LCBnTGlnaHQwUm90YXRpb24sIDEuMGYsIDAuMGYsIDAuMGYpOworICAgIGxpZ2h0MFBvcyA9IHJzTWF0cml4TXVsdGlwbHkoJmwwTWF0LCBsaWdodDBQb3MpOworICAgIHJzX21hdHJpeDR4NCBsMU1hdDsKKyAgICByc01hdHJpeExvYWRSb3RhdGUoJmwxTWF0LCBnTGlnaHQxUm90YXRpb24sIDAuMGYsIDAuMGYsIDEuMGYpOworICAgIGxpZ2h0MVBvcyA9IHJzTWF0cml4TXVsdGlwbHkoJmwxTWF0LCBsaWdodDFQb3MpOworCisgICAgLy8gU2V0IGxpZ2h0IDAgcHJvcGVydGllcworICAgIGdWU0NvbnN0YW50cy0+bGlnaHQwX1Bvc2lzaW9uLnggPSBsaWdodDBQb3MueDsKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MF9Qb3Npc2lvbi55ID0gbGlnaHQwUG9zLnk7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDBfUG9zaXNpb24ueiA9IGxpZ2h0MFBvcy56OworICAgIGdWU0NvbnN0YW50cy0+bGlnaHQwX0RpZmZ1c2UgPSAxLjBmOworICAgIGdWU0NvbnN0YW50cy0+bGlnaHQwX1NwZWN1bGFyID0gMC41ZjsKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MF9Db3NpbmVQb3dlciA9IDQwLjBmOworICAgIC8vIFNldCBsaWdodCAxIHByb3BlcnRpZXMKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MV9Qb3Npc2lvbi54ID0gbGlnaHQxUG9zLng7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDFfUG9zaXNpb24ueSA9IGxpZ2h0MVBvcy55OworICAgIGdWU0NvbnN0YW50cy0+bGlnaHQxX1Bvc2lzaW9uLnogPSBsaWdodDFQb3MuejsKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MV9EaWZmdXNlID0gMS4wZjsKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MV9TcGVjdWxhciA9IDAuN2Y7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDFfQ29zaW5lUG93ZXIgPSA1MC4wZjsKKworICAgIC8vIFVwZGF0ZSBmcmFnbWV0biBzaGFkZXIgY29uc3RhbnRzCisgICAgLy8gU2V0IGxpZ2h0IDAgY29sb3JzCisgICAgZ0ZTQ29uc3RhbnRzLT5saWdodDBfRGlmZnVzZUNvbG9yID0gbGlnaHQwRGlmZkNvbDsKKyAgICBnRlNDb25zdGFudHMtPmxpZ2h0MF9TcGVjdWxhckNvbG9yID0gbGlnaHQwU3BlY0NvbDsKKyAgICAvLyBTZXQgbGlnaHQgMSBjb2xvcnMKKyAgICBnRlNDb25zdGFudHMtPmxpZ2h0MV9EaWZmdXNlQ29sb3IgPSBsaWdodDFEaWZmQ29sOworICAgIGdGU0NvbnN0YW50cy0+bGlnaHQxX1NwZWN1bGFyQ29sb3IgPSBsaWdodDFTcGVjQ29sOworfQorCit2b2lkIGRpc3BsYXlDdXN0b21TaGFkZXJTYW1wbGVzKCkgeworCisgICAgLy8gVXBkYXRlIHZlcnRleCBzaGFkZXIgY29uc3RhbnRzCisgICAgLy8gTG9hZCBtb2RlbCBtYXRyaXgKKyAgICAvLyBBcGxseSBhIHJvdGF0aW9uIHRvIG91ciBtZXNoCisgICAgZ1RvcnVzUm90YXRpb24gKz0gNTAuMGYgKiBnRHQ7CisgICAgaWYoZ1RvcnVzUm90YXRpb24gPiAzNjAuMGYpIHsKKyAgICAgICAgZ1RvcnVzUm90YXRpb24gLT0gMzYwLjBmOworICAgIH0KKworICAgIC8vIFBvc2l0aW9uIG91ciBtb2RlbCBvbiB0aGUgc2NyZWVuCisgICAgcnNNYXRyaXhMb2FkVHJhbnNsYXRlKCZnVlNDb25zdGFudHMtPm1vZGVsLCAwLjBmLCAwLjBmLCAtMTAuMGYpOworICAgIHJzTWF0cml4Um90YXRlKCZnVlNDb25zdGFudHMtPm1vZGVsLCBnVG9ydXNSb3RhdGlvbiwgMS4wZiwgMC4wZiwgMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJmdWU0NvbnN0YW50cy0+bW9kZWwsIGdUb3J1c1JvdGF0aW9uLCAwLjBmLCAwLjBmLCAxLjBmKTsKKyAgICBzZXR1cEN1c3RvbVNoYWRlckxpZ2h0cygpOworCisgICAgcnNnQmluZFByb2dyYW1WZXJ0ZXgoZ1Byb2dWZXJ0ZXhDdXN0b20pOworICAgIC8vIFNldHVwIHRoZSBwcm9qZWN0aW9uaSBtYXRyaXggd2l0aCA2MCBkZWdyZWUgZmllbGQgb2YgdmlldworICAgIHJzX21hdHJpeDR4NCBwcm9qOworICAgIGZsb2F0IGFzcGVjdCA9IChmbG9hdClyc2dHZXRXaWR0aCgpIC8gKGZsb2F0KXJzZ0dldEhlaWdodCgpOworICAgIHJzTWF0cml4TG9hZFBlcnNwZWN0aXZlKCZwcm9qLCAzMC4wZiwgYXNwZWN0LCAwLjFmLCAxMDAuMGYpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkUHJvamVjdGlvbk1hdHJpeCgmcHJvaik7CisKKyAgICAvLyBGcmFnbWVudCBzaGFkZXIgd2l0aCB0ZXh0dXJlCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmROb25lRGVwdGgpOworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudEN1c3RvbSk7CisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudEN1c3RvbSwgMCwgZ0xpbmVhckNsYW1wKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50Q3VzdG9tLCAwLCBnVGV4VG9ydXMpOworCisgICAgLy8gVXNlIGJhY2sgZmFjZSBjdWxsaW5nCisgICAgcnNnQmluZFByb2dyYW1SYXN0ZXIoZ0N1bGxCYWNrKTsKKyAgICByc2dEcmF3TWVzaChnVG9ydXNNZXNoKTsKKworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIHJzZ0RyYXdUZXh0KCJDdXN0b20gc2hhZGVyIHNhbXBsZSIsIDEwLCByc2dHZXRIZWlnaHQoKSAtIDEwKTsKK30KKworaW50IHJvb3QoaW50IGxhdW5jaElEKSB7CisKKyAgICBnRHQgPSByc0dldER0KCk7CisKKyAgICByc2dDbGVhckNvbG9yKDAuMmYsIDAuMmYsIDAuMmYsIDAuMGYpOworICAgIHJzZ0NsZWFyRGVwdGgoMS4wZik7CisKKyAgICBzd2l0Y2goZ0Rpc3BsYXlNb2RlKSB7CisgICAgY2FzZSAwOgorICAgICAgICBkaXNwbGF5Rm9udFNhbXBsZXMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBkaXNwbGF5U2hhZGVyU2FtcGxlcygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGRpc3BsYXlCbGVuZGluZ1NhbXBsZXMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBkaXNwbGF5TWVzaFNhbXBsZXMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBkaXNwbGF5VGV4dHVyZVNhbXBsZXJzKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgZGlzcGxheUN1bGxpbmdTYW1wbGVzKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgICAgZGlzcGxheUN1c3RvbVNoYWRlclNhbXBsZXMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDEwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvc2hhZGVyX2RlZi5yc2ggYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9zaGFkZXJfZGVmLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjY5N2NhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvc2hhZGVyX2RlZi5yc2gKQEAgLTAsMCArMSw0NyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnNhbXBsZXMpCisKK3R5cGVkZWYgc3RydWN0IFZlcnRleFNoYWRlckNvbnN0YW50c19zIHsKKyAgICByc19tYXRyaXg0eDQgbW9kZWw7CisgICAgZmxvYXQzIGxpZ2h0MF9Qb3Npc2lvbjsKKyAgICBmbG9hdCBsaWdodDBfRGlmZnVzZTsKKyAgICBmbG9hdCBsaWdodDBfU3BlY3VsYXI7CisgICAgZmxvYXQgbGlnaHQwX0Nvc2luZVBvd2VyOworCisgICAgZmxvYXQzIGxpZ2h0MV9Qb3Npc2lvbjsKKyAgICBmbG9hdCBsaWdodDFfRGlmZnVzZTsKKyAgICBmbG9hdCBsaWdodDFfU3BlY3VsYXI7CisgICAgZmxvYXQgbGlnaHQxX0Nvc2luZVBvd2VyOworCit9IFZlcnRleFNoYWRlckNvbnN0YW50czsKKwordHlwZWRlZiBzdHJ1Y3QgRnJhZ2VudFNoYWRlckNvbnN0YW50c19zIHsKKyAgICBmbG9hdDMgbGlnaHQwX0RpZmZ1c2VDb2xvcjsKKyAgICBmbG9hdDMgbGlnaHQwX1NwZWN1bGFyQ29sb3I7CisKKyAgICBmbG9hdDMgbGlnaHQxX0RpZmZ1c2VDb2xvcjsKKyAgICBmbG9hdDMgbGlnaHQxX1NwZWN1bGFyQ29sb3I7CisKK30gRnJhZ2VudFNoYWRlckNvbnN0YW50czsKKwordHlwZWRlZiBzdHJ1Y3QgVmVydGV4U2hhZGVySW5wdXRzX3MgeworICAgIGZsb2F0NCBwb3NpdGlvbjsKKyAgICBmbG9hdDMgbm9ybWFsOworICAgIGZsb2F0NCB0ZXh0dXJlMDsKK30gVmVydGV4U2hhZGVySW5wdXRzOworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvQW5kcm9pZC5tayBiL2xpYnMvcnMvamF2YS90ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOTkyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMwIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSAkKGNhbGwgYWxsLXJlbmRlcnNjcmlwdC1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gUlNUZXN0CisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9saWJzL3JzL2phdmEvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzE0NGFiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwxNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQucnMudGVzdCI+CisgICAgPGFwcGxpY2F0aW9uIAorICAgICAgICBhbmRyb2lkOmxhYmVsPSJfUlNfVGVzdCIKKyAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvdGVzdF9wYXR0ZXJuIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iUlNUZXN0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZyBiL2xpYnMvcnMvamF2YS90ZXN0cy9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2QxNDU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3QuamF2YSBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjE3OTNkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3Q7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU3lzdGVtOworaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CisKK2ltcG9ydCBqYXZhLmxhbmcuUnVudGltZTsKKworcHVibGljIGNsYXNzIFJTVGVzdCBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICAvL0V2ZW50TGlzdGVuZXIgbUxpc3RlbmVyID0gbmV3IEV2ZW50TGlzdGVuZXIoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gImxpYlJTX2puaSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyAgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPR19FTkFCTEVEID0gREVCVUcgPyBDb25maWcuTE9HRCA6IENvbmZpZy5MT0dWOworCisgICAgcHJpdmF0ZSBSU1Rlc3RWaWV3IG1WaWV3OworCisgICAgLy8gZ2V0IHRoZSBjdXJyZW50IGxvb3BlciAoZnJvbSB5b3VyIEFjdGl2aXR5IFVJIHRocmVhZCBmb3IgaW5zdGFuY2UKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICAvLyBDcmVhdGUgb3VyIFByZXZpZXcgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91cgorICAgICAgICAvLyBBY3Rpdml0eQorICAgICAgICBtVmlldyA9IG5ldyBSU1Rlc3RWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50VmlldyhtVmlldyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5vblJlc3VtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgaWYgKExPR19FTkFCTEVEKSB7CisgICAgICAgICAgICBMb2cudihMT0dfVEFHLCBtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RDb3JlLmphdmEgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0Q29yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYTE2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0Q29yZS5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworcHVibGljIGNsYXNzIFJTVGVzdENvcmUgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlRfQ09VTlQgPSA1MDAwMDsKKworICAgIHB1YmxpYyBSU1Rlc3RDb3JlKCkgeworICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisKKyAgICBwcml2YXRlIFNjcmlwdENfVGVzdF9yb290IG1Sb290U2NyaXB0OworCisgICAgcHJpdmF0ZSBib29sZWFuIGZwX21hZCgpIHsKKyAgICAgICAgU2NyaXB0Q19GcF9tYWQgcyA9IG5ldyBTY3JpcHRDX0ZwX21hZChtUlMsIG1SZXMsIFIucmF3LmZwX21hZCwgdHJ1ZSk7CisgICAgICAgIHMuaW52b2tlX2RvVGVzdCgwLCAwKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy9wcml2YXRlIFNjcmlwdENfRm91bnRhaW4gbVNjcmlwdDsKKyAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgbVJTID0gcnM7CisgICAgICAgIG1SZXMgPSByZXM7CisKKyAgICAgICAgbVJvb3RTY3JpcHQgPSBuZXcgU2NyaXB0Q19UZXN0X3Jvb3QobVJTLCBtUmVzLCBSLnJhdy50ZXN0X3Jvb3QsIHRydWUpOworCisgICAgICAgIGZwX21hZCgpOworCisKKyAgICAgICAgLyoKKyAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIgcGZiID0gbmV3IFByb2dyYW1GcmFnbWVudC5CdWlsZGVyKHJzKTsKKyAgICAgICAgcGZiLnNldFZhcnlpbmdDb2xvcih0cnVlKTsKKyAgICAgICAgcnMuY29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQocGZiLmNyZWF0ZSgpKTsKKworICAgICAgICBTY3JpcHRGaWVsZF9Qb2ludCBwb2ludHMgPSBuZXcgU2NyaXB0RmllbGRfUG9pbnQobVJTLCBQQVJUX0NPVU5UKTsKKworICAgICAgICBNZXNoLkFsbG9jYXRpb25CdWlsZGVyIHNtYiA9IG5ldyBNZXNoLkFsbG9jYXRpb25CdWlsZGVyKG1SUyk7CisgICAgICAgIHNtYi5hZGRWZXJ0ZXhBbGxvY2F0aW9uKHBvaW50cy5nZXRBbGxvY2F0aW9uKCkpOworICAgICAgICBzbWIuYWRkSW5kZXhUeXBlKFByaW1pdGl2ZS5QT0lOVCk7CisgICAgICAgIE1lc2ggc20gPSBzbWIuY3JlYXRlKCk7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX0ZvdW50YWluKG1SUywgbVJlcywgUi5yYXcuZm91bnRhaW4sIHRydWUpOworICAgICAgICBtU2NyaXB0LnNldF9wYXJ0TWVzaChzbSk7CisgICAgICAgIG1TY3JpcHQuYmluZF9wb2ludChwb2ludHMpOworICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworICAgICAgICAqLworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5ld1RvdWNoUG9zaXRpb24oZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcHJlc3N1cmUsIGludCBpZCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RWaWV3LmphdmEgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0Vmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZTBjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0Vmlldy5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0OworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworcHVibGljIGNsYXNzIFJTVGVzdFZpZXcgZXh0ZW5kcyBSU1N1cmZhY2VWaWV3IHsKKworICAgIHB1YmxpYyBSU1Rlc3RWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgLy9zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBSU1Rlc3RDb3JlIG1SZW5kZXI7CisKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHQoZmFsc2UpOworICAgICAgICAgICAgbVJTLmNvbnRleHRTZXRTdXJmYWNlKHcsIGgsIGhvbGRlci5nZXRTdXJmYWNlKCkpOworICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBSU1Rlc3RDb3JlKCk7CisgICAgICAgICAgICBtUmVuZGVyLmluaXQobVJTLCBnZXRSZXNvdXJjZXMoKSwgdywgaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgaWYobVJTICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IG51bGw7CisgICAgICAgICAgICBkZXN0cm95UmVuZGVyU2NyaXB0KCk7CisgICAgICAgIH0KKyAgICB9CisKKy8qCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQorICAgIHsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbk1hc2tlZCgpOworICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9VUCkgeworICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKDAsIDAsIDAsIGV2LmdldFBvaW50ZXJJZCgwKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoYWN0ID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7CisgICAgICAgICAgICAvLyBvbmx5IG9uZSBwb2ludGVyIGdvaW5nIHVwLCB3ZSBjYW4gZ2V0IHRoZSBpbmRleCBsaWtlIHRoaXMKKyAgICAgICAgICAgIGludCBwb2ludGVySW5kZXggPSBldi5nZXRBY3Rpb25JbmRleCgpOworICAgICAgICAgICAgaW50IHBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZChwb2ludGVySW5kZXgpOworICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKDAsIDAsIDAsIHBvaW50ZXJJZCk7CisgICAgICAgIH0KKyAgICAgICAgaW50IGNvdW50ID0gZXYuZ2V0SGlzdG9yeVNpemUoKTsKKyAgICAgICAgaW50IHBjb3VudCA9IGV2LmdldFBvaW50ZXJDb3VudCgpOworCisgICAgICAgIGZvciAoaW50IHA9MDsgcCA8IHBjb3VudDsgcCsrKSB7CisgICAgICAgICAgICBpbnQgaWQgPSBldi5nZXRQb2ludGVySWQocCk7CisgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oZXYuZ2V0WChwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXRZKHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldFByZXNzdXJlKHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbihldi5nZXRIaXN0b3JpY2FsWChwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0SGlzdG9yaWNhbFkocCwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldEhpc3RvcmljYWxQcmVzc3VyZShwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAqLworfQorCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9mcF9tYWQucnMgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvZnBfbWFkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NGZmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvZnBfbWFkLnJzCkBAIC0wLDAgKzEsMTczIEBACisjaW5jbHVkZSAic2hhcmVkLnJzaCIKKworY29uc3QgaW50IFRFU1RfQ09VTlQgPSAxOworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ19yZXN1bHRzKQorI3ByYWdtYSBycyBleHBvcnRfZnVuYyhkb1Rlc3QpCisKKworc3RhdGljIGZsb2F0IGRhdGFfZjFbMTAyNV07CitzdGF0aWMgZmxvYXQ0IGRhdGFfZjRbMTAyNV07CisKK3N0YXRpYyB2b2lkIHRlc3RfbWFkNCh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICBmbG9hdCB0b3RhbCA9IDA7CisgICAgLy8gRG8gfjEgYmlsbGlvbiBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAoMTAwMCAvIDgwKTsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mNFtpXSA9IChkYXRhX2Y0W2ldICogMC4wMmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krMV0gKiAwLjA0ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSsyXSAqIDAuMDVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzNdICogMC4xZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs0XSAqIDAuMmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krNV0gKiAwLjJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzZdICogMC4xZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs3XSAqIDAuMDVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzhdICogMC4wNGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krOV0gKiAwLjAyZiArIDEuZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9tYWQ0IE0gb3BzIiwgMTAwMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfbWFkKHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MSBiaWxsaW9uIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqICgxMDAwIC8gMjApOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2YxW2ldID0gKGRhdGFfZjFbaV0gKiAwLjAyZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSsxXSAqIDAuMDRmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzJdICogMC4wNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krM10gKiAwLjFmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzRdICogMC4yZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs1XSAqIDAuMmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krNl0gKiAwLjFmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzddICogMC4wNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krOF0gKiAwLjA0ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs5XSAqIDAuMDJmICsgMS5mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX21hZCBNIG9wcyIsIDEwMDAuZiAvIHRpbWUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X25vcm0odWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xMCBNIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqIDEwOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2Y0W2ldID0gbm9ybWFsaXplKGRhdGFfZjRbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfbm9ybSBNIG9wcyIsIDEwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9zaW5jb3M0KHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MTAgTSBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAxMCAvIDQ7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjRbaV0gPSBzaW4oZGF0YV9mNFtpXSkgKiBjb3MoZGF0YV9mNFtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9zaW5jb3M0IE0gb3BzIiwgMTAuZiAvIHRpbWUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NpbmNvcyh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICBmbG9hdCB0b3RhbCA9IDA7CisgICAgLy8gRG8gfjEwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTA7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjFbaV0gPSBzaW4oZGF0YV9mMVtpXSkgKiBjb3MoZGF0YV9mMVtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9zaW5jb3MgTSBvcHMiLCAxMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfY2xhbXAodWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgLy8gRG8gfjEwMCBNIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqIDEwMDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mMVtpXSA9IGNsYW1wKGRhdGFfZjFbaV0sIC0xLmYsIDEuZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9jbGFtcCBNIG9wcyIsIDEwMC5mIC8gdGltZSk7CisKKyAgICBzdGFydCgpOworICAgIC8vIERvIH4xMDAgTSBvcHMKKyAgICBmb3IgKGN0PTA7IGN0IDwgMTAwMCAqIDEwMDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGRhdGFfZjFbaV0gPCAtMS5mKSBkYXRhX2YxW2ldID0gLTEuZjsKKyAgICAgICAgICAgIGlmIChkYXRhX2YxW2ldID4gLTEuZikgZGF0YV9mMVtpXSA9IDEuZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX2NsYW1wIHJlZiBNIG9wcyIsIDEwMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfY2xhbXA0KHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MTAwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTAwIC80OyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2Y0W2ldID0gY2xhbXAoZGF0YV9mNFtpXSwgLTEuZiwgMS5mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX2NsYW1wNCBNIG9wcyIsIDEwMC5mIC8gdGltZSk7Cit9CisKK3ZvaWQgZG9UZXN0KHVpbnQzMl90IGluZGV4LCBpbnQgdGVzdF9udW0pIHsKKyAgICBmb3IgKGludCB4PTA7IHggPCAxMDI1OyB4KyspIHsKKyAgICAgICAgZGF0YV9mMVt4XSA9ICh4ICYgMHhmKSAqIDAuMWY7CisgICAgICAgIGRhdGFfZjRbeF0ueCA9ICh4ICYgMHhmKSAqIDAuMWY7CisgICAgICAgIGRhdGFfZjRbeF0ueSA9ICh4ICYgMHhmMCkgKiAwLjFmOworICAgICAgICBkYXRhX2Y0W3hdLnogPSAoeCAmIDB4MzMpICogMC4xZjsKKyAgICAgICAgZGF0YV9mNFt4XS53ID0gKHggJiAweDc3KSAqIDAuMWY7CisgICAgfQorCisgICAgdGVzdF9tYWQ0KGluZGV4KTsKKyAgICB0ZXN0X21hZChpbmRleCk7CisKKyAgICBmb3IgKHg9MDsgeCA8IDEwMjU7IHgrKykgeworICAgICAgICBkYXRhX2YxW3hdID0gKHggJiAweGYpICogMC4xZiArIDEuZjsKKyAgICAgICAgZGF0YV9mNFt4XS54ID0gKHggJiAweGYpICogMC4xZiArIDEuZjsKKyAgICAgICAgZGF0YV9mNFt4XS55ID0gKHggJiAweGYwKSAqIDAuMWYgKyAxLmY7CisgICAgICAgIGRhdGFfZjRbeF0ueiA9ICh4ICYgMHgzMykgKiAwLjFmICsgMS5mOworICAgICAgICBkYXRhX2Y0W3hdLncgPSAoeCAmIDB4NzcpICogMC4xZiArIDEuZjsKKyAgICB9CisKKyAgICB0ZXN0X25vcm0oaW5kZXgpOworICAgIHRlc3Rfc2luY29zNChpbmRleCk7CisgICAgdGVzdF9zaW5jb3MoaW5kZXgpOworICAgIHRlc3RfY2xhbXA0KGluZGV4KTsKKyAgICB0ZXN0X2NsYW1wKGluZGV4KTsKK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3Qvc2hhcmVkLnJzaCBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9zaGFyZWQucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NzNlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3Qvc2hhcmVkLnJzaApAQCAtMCwwICsxLDI1IEBACisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5ycy50ZXN0KQorCit0eXBlZGVmIHN0cnVjdCBUZXN0UmVzdWx0X3MgeworICAgIHJzX2FsbG9jYXRpb24gbmFtZTsKKyAgICBib29sIHBhc3M7CisgICAgZmxvYXQgc2NvcmU7CisgICAgaW50NjRfdCB0aW1lOworfSBUZXN0UmVzdWx0OworVGVzdFJlc3VsdCAqZ19yZXN1bHRzOworCitzdGF0aWMgaW50NjRfdCBnX3RpbWU7CisKK3N0YXRpYyB2b2lkIHN0YXJ0KHZvaWQpIHsKKyAgICBnX3RpbWUgPSByc1VwdGltZU1pbGxpcygpOworfQorCitzdGF0aWMgZmxvYXQgZW5kKHVpbnQzMl90IGlkeCkgeworICAgIGludDY0X3QgdCA9IHJzVXB0aW1lTWlsbGlzKCkgLSBnX3RpbWU7CisgICAgLy9nX3Jlc3VsdHNbaWR4XS50aW1lID0gdDsKKyAgICAvL3JzRGVidWcoInRlc3QgdGltZSIsIChpbnQpdCk7CisgICAgcmV0dXJuICgoZmxvYXQpdCkgLyAxMDAwLmY7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC90ZXN0X3Jvb3QucnMgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvdGVzdF9yb290LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYjM5MWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3Rlc3Rfcm9vdC5ycwpAQCAtMCwwICsxLDI2IEBACisvLyBGb3VudGFpbiB0ZXN0IHNjcmlwdAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQucnMudGVzdCkKKworI3ByYWdtYSBzdGF0ZUZyYWdtZW50KHBhcmVudCkKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworCit0eXBlZGVmIHN0cnVjdCBUZXN0UmVzdWx0IHsKKyAgICByc19hbGxvY2F0aW9uIG5hbWU7CisgICAgYm9vbCBwYXNzOworICAgIGZsb2F0IHNjb3JlOworfSBUZXN0UmVzdWx0X3Q7CitUZXN0UmVzdWx0X3QgKnJlc3VsdHM7CisKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihyZXN1bHRzKQorLy8jcHJhZ21hIHJzIGV4cG9ydF9mdW5jKGFkZFBhcnRpY2xlcykKKworaW50IHJvb3QoKSB7CisKKyAgICByZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzLnNwZWMgYi9saWJzL3JzL3JzLnNwZWMKaW5kZXggNWFlOGQwMS4uYWQxNjJiYiAxMDA2NDQKLS0tIGEvbGlicy9ycy9ycy5zcGVjCisrKyBiL2xpYnMvcnMvcnMuc3BlYwpAQCAtMSwxMSArMSwxNCBAQAogCitDb250ZXh0RmluaXNoIHsKKwloYW5kY29kZUFwaQorCX0KIAogQ29udGV4dEJpbmRSb290U2NyaXB0IHsKIAlwYXJhbSBSc1NjcmlwdCBzYW1wbGVyCiAJfQogCi1Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlIHsKLQlwYXJhbSBSc1Byb2dyYW1GcmFnbWVudFN0b3JlIHBnbQorQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUgeworCXBhcmFtIFJzUHJvZ3JhbVN0b3JlIHBnbQogCX0KIAogQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQgewpAQCAtMjAsNiArMjMsMTAgQEAKIAlwYXJhbSBSc1Byb2dyYW1SYXN0ZXIgcGdtCiAJfQogCitDb250ZXh0QmluZEZvbnQgeworCXBhcmFtIFJzRm9udCBwZ20KKwl9CisKIENvbnRleHRQYXVzZSB7CiAJfQogCkBAIC01MSw2ICs1OCwxMSBAQAogCXBhcmFtIHNpemVfdCBsZW4KIAl9CiAKK0dldE5hbWUgeworCXBhcmFtIHZvaWQgKm9iagorCXBhcmFtIGNvbnN0IGNoYXIgKipuYW1lCisJfQorCiBPYmpEZXN0cm95IHsKIAlwYXJhbSB2b2lkICpvYmoKIAl9CkBAIC03MSw2ICs4MywxOSBAQAogCXJldCBSc0VsZW1lbnQKIAl9CiAKK0VsZW1lbnRHZXROYXRpdmVEYXRhIHsKKwlwYXJhbSBSc0VsZW1lbnQgZWxlbQorCXBhcmFtIHVpbnQzMl90ICplbGVtRGF0YQorCXBhcmFtIHVpbnQzMl90IGVsZW1EYXRhU2l6ZQorCX0KKworRWxlbWVudEdldFN1YkVsZW1lbnRzIHsKKwlwYXJhbSBSc0VsZW1lbnQgZWxlbQorCXBhcmFtIHVpbnQzMl90ICppZHMKKwlwYXJhbSBjb25zdCBjaGFyICoqbmFtZXMKKwlwYXJhbSB1aW50MzJfdCBkYXRhU2l6ZQorCX0KKwogVHlwZUJlZ2luIHsKIAlwYXJhbSBSc0VsZW1lbnQgdHlwZQogCX0KQEAgLTg0LDYgKzEwOSwxMiBAQAogCXJldCBSc1R5cGUKIAl9CiAKK1R5cGVHZXROYXRpdmVEYXRhIHsKKwlwYXJhbSBSc1R5cGUgdHlwZQorCXBhcmFtIHVpbnQzMl90ICogdHlwZURhdGEKKwlwYXJhbSB1aW50MzJfdCB0eXBlRGF0YVNpemUKKwl9CisKIEFsbG9jYXRpb25DcmVhdGVUeXBlZCB7CiAJcGFyYW0gUnNUeXBlIHR5cGUKIAlyZXQgUnNBbGxvY2F0aW9uCkBAIC0xNTMsNiArMTg0LDE2IEBACiAJdG9nZ2xlUGxheQogCX0KIAorQWxsb2NhdGlvbjFEU3ViRWxlbWVudERhdGEgeworCXBhcmFtIFJzQWxsb2NhdGlvbiB2YQorCXBhcmFtIHVpbnQzMl90IHgKKwlwYXJhbSBjb25zdCB2b2lkICpkYXRhCisJcGFyYW0gdWludDMyX3QgY29tcF9vZmZzZXQKKwlwYXJhbSB1aW50MzJfdCBieXRlcworCWhhbmRjb2RlQXBpCisJdG9nZ2xlUGxheQorCX0KKwogQWxsb2NhdGlvbjJEU3ViRGF0YSB7CiAJcGFyYW0gUnNBbGxvY2F0aW9uIHZhCiAJcGFyYW0gdWludDMyX3QgeG9mZgpAQCAtMTYzLDYgKzIwNCwxNSBAQAogCXBhcmFtIHVpbnQzMl90IGJ5dGVzCiAJfQogCitBbGxvY2F0aW9uMkRTdWJFbGVtZW50RGF0YSB7CisJcGFyYW0gUnNBbGxvY2F0aW9uIHZhCisJcGFyYW0gdWludDMyX3QgeAorCXBhcmFtIHVpbnQzMl90IHkKKwlwYXJhbSBjb25zdCB2b2lkICpkYXRhCisJcGFyYW0gdWludDMyX3QgZWxlbWVudF9vZmZzZXQKKwlwYXJhbSB1aW50MzJfdCBieXRlcworCX0KKwogQWxsb2NhdGlvblJlYWQgewogCXBhcmFtIFJzQWxsb2NhdGlvbiB2YQogCXBhcmFtIHZvaWQgKiBkYXRhCkBAIC0yMjQsNiArMjc0LDExIEBACiAJcGFyYW0gY29uc3Qgdm9pZCAqZGF0YQogCX0KIAorQWxsb2NhdGlvbkdldFR5cGUgeworCXBhcmFtIFJzQWxsb2NhdGlvbiB2YQorCXJldCBjb25zdCB2b2lkKgorCX0KKwogU2FtcGxlckJlZ2luIHsKIAl9CiAKQEAgLTI0OCwxMyArMzAzLDYgQEAKIFNjcmlwdENCZWdpbiB7CiAJfQogCi1TY3JpcHRTZXRDbGVhckNvbG9yIHsKLQlwYXJhbSBSc1NjcmlwdCBzCi0JcGFyYW0gZmxvYXQgcgotCXBhcmFtIGZsb2F0IGcKLQlwYXJhbSBmbG9hdCBiCi0JcGFyYW0gZmxvYXQgYQotCX0KIAogU2NyaXB0U2V0VGltZVpvbmUgewogCXBhcmFtIFJzU2NyaXB0IHMKQEAgLTI2MiwzNyArMzEwLDQxIEBACiAJcGFyYW0gdWludDMyX3QgbGVuZ3RoCiAJfQogCi1TY3JpcHRTZXRDbGVhckRlcHRoIHsKLQlwYXJhbSBSc1NjcmlwdCBzCi0JcGFyYW0gZmxvYXQgZGVwdGgKLQl9Ci0KLVNjcmlwdFNldENsZWFyU3RlbmNpbCB7Ci0JcGFyYW0gUnNTY3JpcHQgcwotCXBhcmFtIHVpbnQzMl90IHN0ZW5jaWwKLQl9Ci0KLVNjcmlwdFNldFR5cGUgewotCXBhcmFtIFJzVHlwZSB0eXBlCi0JcGFyYW0gdWludDMyX3Qgc2xvdAotCXBhcmFtIGJvb2wgaXNXcml0YWJsZQotCXBhcmFtIGNvbnN0IGNoYXIgKiBuYW1lCi0JfQotCi1TY3JpcHRTZXRJbnZva2UgewotCXBhcmFtIGNvbnN0IGNoYXIgKiBuYW1lCi0JcGFyYW0gdWludDMyX3Qgc2xvdAotCX0KIAogU2NyaXB0SW52b2tlIHsKIAlwYXJhbSBSc1NjcmlwdCBzCiAJcGFyYW0gdWludDMyX3Qgc2xvdAogCX0KIAotU2NyaXB0U2V0Um9vdCB7Ci0JcGFyYW0gYm9vbCBpc1Jvb3QKK1NjcmlwdEludm9rZVYgeworCXBhcmFtIFJzU2NyaXB0IHMKKwlwYXJhbSB1aW50MzJfdCBzbG90CisJcGFyYW0gY29uc3Qgdm9pZCAqIGRhdGEKKwlwYXJhbSB1aW50MzJfdCBkYXRhTGVuCisJaGFuZGNvZGVBcGkKKwl0b2dnbGVQbGF5CiAJfQogCitTY3JpcHRTZXRWYXJJIHsKKwlwYXJhbSBSc1NjcmlwdCBzCisJcGFyYW0gdWludDMyX3Qgc2xvdAorCXBhcmFtIGludCB2YWx1ZQorCX0KKworU2NyaXB0U2V0VmFyRiB7CisJcGFyYW0gUnNTY3JpcHQgcworCXBhcmFtIHVpbnQzMl90IHNsb3QKKwlwYXJhbSBmbG9hdCB2YWx1ZQorCX0KKworU2NyaXB0U2V0VmFyViB7CisJcGFyYW0gUnNTY3JpcHQgcworCXBhcmFtIHVpbnQzMl90IHNsb3QKKwlwYXJhbSBjb25zdCB2b2lkICogZGF0YQorCXBhcmFtIHVpbnQzMl90IGRhdGFMZW4KKwloYW5kY29kZUFwaQorCXRvZ2dsZVBsYXkKKwl9CiAKIAogU2NyaXB0Q1NldFNjcmlwdCB7CkBAIC0zMDgsNTIgKzM2MCw0MSBAQAogCXJldCBSc1NjcmlwdAogCX0KIAotU2NyaXB0Q1NldERlZmluZUYgewotICAgIHBhcmFtIGNvbnN0IGNoYXIqIG5hbWUKLSAgICBwYXJhbSBmbG9hdCB2YWx1ZQotICAgIH0KIAotU2NyaXB0Q1NldERlZmluZUkzMiB7Ci0gICAgcGFyYW0gY29uc3QgY2hhciogbmFtZQotICAgIHBhcmFtIGludDMyX3QgdmFsdWUKLSAgICB9Ci0KLVByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4geworUHJvZ3JhbVN0b3JlQmVnaW4gewogCXBhcmFtIFJzRWxlbWVudCBpbgogCXBhcmFtIFJzRWxlbWVudCBvdXQKIAl9CiAKLVByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrIHsKK1Byb2dyYW1TdG9yZUNvbG9yTWFzayB7CiAJcGFyYW0gYm9vbCByCiAJcGFyYW0gYm9vbCBnCiAJcGFyYW0gYm9vbCBiCiAJcGFyYW0gYm9vbCBhCiAJfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyB7CitQcm9ncmFtU3RvcmVCbGVuZEZ1bmMgewogCXBhcmFtIFJzQmxlbmRTcmNGdW5jIHNyY0Z1bmMKIAlwYXJhbSBSc0JsZW5kRHN0RnVuYyBkZXN0RnVuYwogCX0KIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2sgeworUHJvZ3JhbVN0b3JlRGVwdGhNYXNrIHsKIAlwYXJhbSBib29sIGVuYWJsZQogfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlciB7CitQcm9ncmFtU3RvcmVEaXRoZXIgewogCXBhcmFtIGJvb2wgZW5hYmxlCiB9CiAKLVByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jIHsKK1Byb2dyYW1TdG9yZURlcHRoRnVuYyB7CiAJcGFyYW0gUnNEZXB0aEZ1bmMgZnVuYwogfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZSB7Ci0JcmV0IFJzUHJvZ3JhbUZyYWdtZW50U3RvcmUKK1Byb2dyYW1TdG9yZUNyZWF0ZSB7CisJcmV0IFJzUHJvZ3JhbVN0b3JlCiAJfQogCiBQcm9ncmFtUmFzdGVyQ3JlYXRlIHsKLQlwYXJhbSBSc0VsZW1lbnQgaW4KLQlwYXJhbSBSc0VsZW1lbnQgb3V0CiAJcGFyYW0gYm9vbCBwb2ludFNtb290aAogCXBhcmFtIGJvb2wgbGluZVNtb290aAogCXBhcmFtIGJvb2wgcG9pbnRTcHJpdGUKQEAgLTM2NSwxMiArNDA2LDExIEBACiAJcGFyYW0gZmxvYXQgbHcKIH0KIAotUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZXsKK1Byb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZSB7CiAJcGFyYW0gUnNQcm9ncmFtUmFzdGVyIHByCi0JcGFyYW0gZmxvYXQgcHMKKwlwYXJhbSBSc0N1bGxNb2RlIG1vZGUKIH0KIAotCiBQcm9ncmFtQmluZENvbnN0YW50cyB7CiAJcGFyYW0gUnNQcm9ncmFtIHZwCiAJcGFyYW0gdWludDMyX3Qgc2xvdApAQCAtNDE3LDM0ICs0NTcsMTAgQEAKIAlyZXQgUnNQcm9ncmFtVmVydGV4CiAJfQogCi1MaWdodEJlZ2luIHsKLQl9Ci0KLUxpZ2h0U2V0TG9jYWwgewotCXBhcmFtIGJvb2wgaXNMb2NhbAotCX0KLQotTGlnaHRTZXRNb25vY2hyb21hdGljIHsKLQlwYXJhbSBib29sIGlzTW9ubwotCX0KLQotTGlnaHRDcmVhdGUgewotCXJldCBSc0xpZ2h0IGxpZ2h0Ci0JfQotCi0KLUxpZ2h0U2V0UG9zaXRpb24gewotCXBhcmFtIFJzTGlnaHQgbGlnaHQKLQlwYXJhbSBmbG9hdCB4Ci0JcGFyYW0gZmxvYXQgeQotCXBhcmFtIGZsb2F0IHoKLQl9Ci0KLUxpZ2h0U2V0Q29sb3IgewotCXBhcmFtIFJzTGlnaHQgbGlnaHQKLQlwYXJhbSBmbG9hdCByCi0JcGFyYW0gZmxvYXQgZwotCXBhcmFtIGZsb2F0IGIKK0ZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0geworCXBhcmFtIGNvbnN0IHZvaWQgKiBkYXRhCisJcGFyYW0gc2l6ZV90IGxlbgorCXJldCBSc0ZpbGUKIAl9CiAKIEZpbGVPcGVuIHsKQEAgLTQ1MywzMCArNDY5LDc5IEBACiAJcGFyYW0gc2l6ZV90IGxlbgogCX0KIAorRmlsZUEzREdldE51bUluZGV4RW50cmllcyB7CisJcGFyYW0gaW50MzJfdCAqIG51bUVudHJpZXMKKwlwYXJhbSBSc0ZpbGUgZmlsZQorCX0KIAotU2ltcGxlTWVzaENyZWF0ZSB7Ci0JcmV0IFJzU2ltcGxlTWVzaAotCXBhcmFtIFJzQWxsb2NhdGlvbiBwcmltCi0JcGFyYW0gUnNBbGxvY2F0aW9uIGluZGV4Ci0JcGFyYW0gUnNBbGxvY2F0aW9uICp2dHgKK0ZpbGVBM0RHZXRJbmRleEVudHJpZXMgeworCXBhcmFtIFJzRmlsZUluZGV4RW50cnkgKiBmaWxlRW50cmllcworCXBhcmFtIHVpbnQzMl90IG51bUVudHJpZXMKKwlwYXJhbSBSc0ZpbGUgZmlsZUEzRAorCX0KKworRmlsZUEzREdldEVudHJ5QnlJbmRleCB7CisJcGFyYW0gdWludDMyX3QgaW5kZXgKKwlwYXJhbSBSc0ZpbGUgZmlsZQorCXJldCBSc09iamVjdEJhc2UKKwl9CisKK0ZvbnRDcmVhdGVGcm9tRmlsZSB7CisJcGFyYW0gY29uc3QgY2hhciAqbmFtZQorCXBhcmFtIHVpbnQzMl90IGZvbnRTaXplCisJcGFyYW0gdWludDMyX3QgZHBpCisJcmV0IFJzRm9udAorCX0KKworTWVzaENyZWF0ZSB7CisJcmV0IFJzTWVzaAogCXBhcmFtIHVpbnQzMl90IHZ0eENvdW50Ci0JcGFyYW0gdWludDMyX3QgcHJpbVR5cGUKKwlwYXJhbSB1aW50MzJfdCBpZHhDb3VudAogCX0KIAotCi1TaW1wbGVNZXNoQmluZEluZGV4IHsKLQlwYXJhbSBSc1NpbXBsZU1lc2ggbWVzaAorTWVzaEJpbmRJbmRleCB7CisJcGFyYW0gUnNNZXNoIG1lc2gKIAlwYXJhbSBSc0FsbG9jYXRpb24gaWR4CisJcGFyYW0gdWludDMyX3QgcHJpbVR5cGUKKwlwYXJhbSB1aW50MzJfdCBzbG90CiAJfQogCi1TaW1wbGVNZXNoQmluZFByaW1pdGl2ZSB7Ci0JcGFyYW0gUnNTaW1wbGVNZXNoIG1lc2gKLQlwYXJhbSBSc0FsbG9jYXRpb24gcHJpbQotCX0KLQotU2ltcGxlTWVzaEJpbmRWZXJ0ZXggewotCXBhcmFtIFJzU2ltcGxlTWVzaCBtZXNoCitNZXNoQmluZFZlcnRleCB7CisJcGFyYW0gUnNNZXNoIG1lc2gKIAlwYXJhbSBSc0FsbG9jYXRpb24gdnR4CiAJcGFyYW0gdWludDMyX3Qgc2xvdAogCX0KIAorTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50IHsKKwlwYXJhbSBSc01lc2ggbWVzaAorCXBhcmFtIGludDMyX3QgKm51bVZ0eAorCX0KKworTWVzaEdldEluZGV4Q291bnQgeworCXBhcmFtIFJzTWVzaCBtZXNoCisJcGFyYW0gaW50MzJfdCAqbnVtSWR4CisJfQorCitNZXNoR2V0VmVydGljZXMgeworCXBhcmFtIFJzTWVzaCBtdgorCXBhcmFtIFJzQWxsb2NhdGlvbiAqdnR4RGF0YQorCXBhcmFtIHVpbnQzMl90IHZ0eERhdGFDb3VudAorCX0KKworTWVzaEdldEluZGljZXMgeworCXBhcmFtIFJzTWVzaCBtdgorCXBhcmFtIFJzQWxsb2NhdGlvbiAqdmEKKwlwYXJhbSB1aW50MzJfdCAqcHJpbVR5cGUKKwlwYXJhbSB1aW50MzJfdCBpZHhEYXRhQ291bnQKKwl9CisKK0FuaW1hdGlvbkNyZWF0ZSB7CisJcGFyYW0gY29uc3QgZmxvYXQgKmluVmFsdWVzCisJcGFyYW0gY29uc3QgZmxvYXQgKm91dFZhbHVlcworCXBhcmFtIHVpbnQzMl90IHZhbHVlQ291bnQKKwlwYXJhbSBSc0FuaW1hdGlvbkludGVycG9sYXRpb24gaW50ZXJwCisJcGFyYW0gUnNBbmltYXRpb25FZGdlIHByZQorCXBhcmFtIFJzQW5pbWF0aW9uRWRnZSBwb3N0CisJcmV0IFJzQW5pbWF0aW9uCisJfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQWRhcHRlci5jcHAgYi9saWJzL3JzL3JzQWRhcHRlci5jcHAKaW5kZXggMGQzMWZhYy4uYjRlYzI1MCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0FkYXB0ZXIuY3BwCisrKyBiL2xpYnMvcnMvcnNBZGFwdGVyLmNwcApAQCAtMTUsNyArMTUsMTEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTcwLDYgKzc0LDE2IEBACiAgICAgICAgICAgIG1BbGxvY2F0aW9uLmdldCgpLT5nZXRUeXBlKCktPmdldFNpemVCeXRlcygpKTsKIH0KIAordm9pZCBBZGFwdGVyMUQ6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgCit9CisKK0FkYXB0ZXIxRCAqQWRhcHRlcjFEOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIHJldHVybiBOVUxMOworfQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIApAQCAtMTg1LDYgKzE5OSwxNSBAQAogICAgICAgICAgICBtQWxsb2NhdGlvbi5nZXQoKS0+Z2V0VHlwZSgpLT5nZXRTaXplQnl0ZXMoKSk7CiB9CiAKK3ZvaWQgQWRhcHRlcjJEOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIAorfQorCitBZGFwdGVyMkQgKkFkYXB0ZXIyRDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KIAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQWRhcHRlci5oIGIvbGlicy9ycy9yc0FkYXB0ZXIuaAppbmRleCBjYjI4NzJlLi40NDllN2FkIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQWRhcHRlci5oCisrKyBiL2xpYnMvcnMvcnNBZGFwdGVyLmgKQEAgLTUwLDYgKzUwLDEwIEBACiAgICAgdm9pZCBzdWJEYXRhKHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IGNvdW50LCBjb25zdCB2b2lkICpkYXRhKTsKICAgICB2b2lkIGRhdGEoY29uc3Qgdm9pZCAqZGF0YSk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9BREFQVEVSXzFEOyB9CisgICAgc3RhdGljIEFkYXB0ZXIxRCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CisKIHByb3RlY3RlZDoKICAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1BbGxvY2F0aW9uOwogICAgIHVpbnQzMl90IG1ZOwpAQCAtODIsNiArODYsMTAgQEAKICAgICB2b2lkIGRhdGEoY29uc3Qgdm9pZCAqZGF0YSk7CiAgICAgdm9pZCBzdWJEYXRhKHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGNvbnN0IHZvaWQgKmRhdGEpOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfQURBUFRFUl8yRDsgfQorICAgIHN0YXRpYyBBZGFwdGVyMkQgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCiBwcm90ZWN0ZWQ6CiAgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKICAgICB1aW50MzJfdCBtWjsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmNwcCBiL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmNwcAppbmRleCA0ZTgyNzhkLi42MDk5OGMzMSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0FsbG9jYXRpb24uY3BwCisrKyBiL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmNwcApAQCAtMTMsMTIgKzEzLDE4IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKIAogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0yOCw2ICszNCw5IEBACiAgICAgaW5pdChyc2MsIHR5cGUpOwogCiAgICAgbVB0ciA9IG1hbGxvYyhtVHlwZS0+Z2V0U2l6ZUJ5dGVzKCkpOworICAgIGlmIChtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRIYXNSZWZlcmVuY2VzKCkpIHsKKyAgICAgICAgbWVtc2V0KG1QdHIsIDAsIG1UeXBlLT5nZXRTaXplQnl0ZXMoKSk7CisgICAgfQogICAgIGlmICghbVB0cikgewogICAgICAgICBMT0dFKCJBbGxvY2F0aW9uOjpBbGxvY2F0aW9uLCBhbGxvYyBmYWlsdXJlIik7CiAgICAgfQpAQCAtMTY3LDkgKzE3NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgMCwgZm9ybWF0LCB0eXBlLCBwdHIpOwogICAgIH0KICAgICBpZiAobVRleHR1cmVHZW5NaXBtYXApIHsKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogICAgICAgICBnbEdlbmVyYXRlTWlwbWFwKEdMX1RFWFRVUkVfMkQpOworI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogICAgIH0KIAorICAgIHJzYy0+Y2hlY2tFcnJvcigiQWxsb2NhdGlvbjo6dXBsb2FkVG9UZXh0dXJlIik7CiB9CiAKIHZvaWQgQWxsb2NhdGlvbjo6ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KGNvbnN0IENvbnRleHQgKnJzYykKQEAgLTIwMSw2ICsyMTMsNyBAQAogICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1CdWZmZXJJRCk7CiAgICAgZ2xCdWZmZXJEYXRhKEdMX0FSUkFZX0JVRkZFUiwgbVR5cGUtPmdldFNpemVCeXRlcygpLCBnZXRQdHIoKSwgR0xfRFlOQU1JQ19EUkFXKTsKICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCAwKTsKKyAgICByc2MtPmNoZWNrRXJyb3IoIkFsbG9jYXRpb246OnVwbG9hZFRvQnVmZmVyT2JqZWN0Iik7CiB9CiAKIHZvaWQgQWxsb2NhdGlvbjo6dXBsb2FkQ2hlY2soY29uc3QgQ29udGV4dCAqcnNjKQpAQCAtMjE3LDEzICsyMzAsMTkgQEAKIH0KIAogCi12b2lkIEFsbG9jYXRpb246OmRhdGEoY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQordm9pZCBBbGxvY2F0aW9uOjpkYXRhKENvbnRleHQgKnJzYywgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQogewogICAgIHVpbnQzMl90IHNpemUgPSBtVHlwZS0+Z2V0U2l6ZUJ5dGVzKCk7CiAgICAgaWYgKHNpemUgIT0gc2l6ZUJ5dGVzKSB7CiAgICAgICAgIExPR0UoIkFsbG9jYXRpb246OmRhdGEgY2FsbGVkIHdpdGggbWlzbWF0Y2hlZCBzaXplIGV4cGVjdGVkICVpLCBnb3QgJWkiLCBzaXplLCBzaXplQnl0ZXMpOwogICAgICAgICByZXR1cm47CiAgICAgfQorCisgICAgaWYgKG1UeXBlLT5nZXRFbGVtZW50KCktPmdldEhhc1JlZmVyZW5jZXMoKSkgeworICAgICAgICBpbmNSZWZzKGRhdGEsIHNpemVCeXRlcyAvIG1UeXBlLT5nZXRFbGVtZW50KCktPmdldFNpemVCeXRlcygpKTsKKyAgICAgICAgZGVjUmVmcyhtUHRyLCBzaXplQnl0ZXMgLyBtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRTaXplQnl0ZXMoKSk7CisgICAgfQorCiAgICAgbWVtY3B5KG1QdHIsIGRhdGEsIHNpemUpOwogICAgIHNlbmREaXJ0eSgpOwogICAgIG1VcGxvYWREZWZlcmVkID0gdHJ1ZTsKQEAgLTIzNCw3ICsyNTMsNyBAQAogICAgIG1lbWNweShkYXRhLCBtUHRyLCBtVHlwZS0+Z2V0U2l6ZUJ5dGVzKCkpOwogfQogCi12b2lkIEFsbG9jYXRpb246OnN1YkRhdGEodWludDMyX3QgeG9mZiwgdWludDMyX3QgY291bnQsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKK3ZvaWQgQWxsb2NhdGlvbjo6c3ViRGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IGNvdW50LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCiB7CiAgICAgdWludDMyX3QgZVNpemUgPSBtVHlwZS0+Z2V0RWxlbWVudFNpemVCeXRlcygpOwogICAgIHVpbnQ4X3QgKiBwdHIgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+KG1QdHIpOwpAQCAtMjQ2LDEyICsyNjUsMTggQEAKICAgICAgICAgbVR5cGUtPmR1bXBMT0dWKCJ0eXBlIGluZm8iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIGlmIChtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRIYXNSZWZlcmVuY2VzKCkpIHsKKyAgICAgICAgaW5jUmVmcyhkYXRhLCBjb3VudCk7CisgICAgICAgIGRlY1JlZnMocHRyLCBjb3VudCk7CisgICAgfQorCiAgICAgbWVtY3B5KHB0ciwgZGF0YSwgc2l6ZSk7CiAgICAgc2VuZERpcnR5KCk7CiAgICAgbVVwbG9hZERlZmVyZWQgPSB0cnVlOwogfQogCi12b2lkIEFsbG9jYXRpb246OnN1YkRhdGEodWludDMyX3QgeG9mZiwgdWludDMyX3QgeW9mZiwKK3ZvaWQgQWxsb2NhdGlvbjo6c3ViRGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsCiAgICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQogewogICAgIHVpbnQzMl90IGVTaXplID0gbVR5cGUtPmdldEVsZW1lbnRTaXplQnl0ZXMoKTsKQEAgLTI2OSw2ICsyOTQsMTAgQEAKIAogICAgIGZvciAodWludDMyX3QgbGluZT15b2ZmOyBsaW5lIDwgKHlvZmYraCk7IGxpbmUrKykgewogICAgICAgICB1aW50OF90ICogcHRyID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihtUHRyKTsKKyAgICAgICAgaWYgKG1UeXBlLT5nZXRFbGVtZW50KCktPmdldEhhc1JlZmVyZW5jZXMoKSkgeworICAgICAgICAgICAgaW5jUmVmcyhzcmMsIHcpOworICAgICAgICAgICAgZGVjUmVmcyhkc3QsIHcpOworICAgICAgICB9CiAgICAgICAgIG1lbWNweShkc3QsIHNyYywgbGluZVNpemUpOwogICAgICAgICBzcmMgKz0gbGluZVNpemU7CiAgICAgICAgIGRzdCArPSBkZXN0VyAqIGVTaXplOwpAQCAtMjc3LDE0ICszMDYsOTYgQEAKICAgICBtVXBsb2FkRGVmZXJlZCA9IHRydWU7CiB9CiAKLXZvaWQgQWxsb2NhdGlvbjo6c3ViRGF0YSh1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLCB1aW50MzJfdCB6b2ZmLAordm9pZCBBbGxvY2F0aW9uOjpzdWJEYXRhKENvbnRleHQgKnJzYywgdWludDMyX3QgeG9mZiwgdWludDMyX3QgeW9mZiwgdWludDMyX3Qgem9mZiwKICAgICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCB1aW50MzJfdCBkLCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCiB7CiB9CiAKK3ZvaWQgQWxsb2NhdGlvbjo6c3ViRWxlbWVudERhdGEoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB4LCBjb25zdCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjSWR4LCB1aW50MzJfdCBzaXplQnl0ZXMpCit7CisgICAgdWludDMyX3QgZVNpemUgPSBtVHlwZS0+Z2V0RWxlbWVudFNpemVCeXRlcygpOworICAgIHVpbnQ4X3QgKiBwdHIgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+KG1QdHIpOworICAgIHB0ciArPSBlU2l6ZSAqIHg7CisKKyAgICBpZiAoY0lkeCA+PSBtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRGaWVsZENvdW50KCkpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgQWxsb2NhdGlvbjo6c3ViRWxlbWVudERhdGEgY29tcG9uZW50ICVpIG91dCBvZiByYW5nZS4iLCBjSWR4KTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsICJzdWJFbGVtZW50RGF0YSBjb21wb25lbnQgb3V0IG9mIHJhbmdlLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHggPj0gbVR5cGUtPmdldERpbVgoKSkgeworICAgICAgICBMT0dFKCJFcnJvciBBbGxvY2F0aW9uOjpzdWJFbGVtZW50RGF0YSBYIG9mZnNldCAlaSBvdXQgb2YgcmFuZ2UuIiwgeCk7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1ZBTFVFLCAic3ViRWxlbWVudERhdGEgWCBvZmZzZXQgb3V0IG9mIHJhbmdlLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgRWxlbWVudCAqIGUgPSBtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRGaWVsZChjSWR4KTsKKyAgICBwdHIgKz0gbVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjSWR4KTsKKworICAgIGlmIChzaXplQnl0ZXMgIT0gZS0+Z2V0U2l6ZUJ5dGVzKCkpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgQWxsb2NhdGlvbjo6c3ViRWxlbWVudERhdGEgZGF0YSBzaXplICVpIGRvZXMgbm90IG1hdGNoIGZpZWxkIHNpemUgJWkuIiwgc2l6ZUJ5dGVzLCBlLT5nZXRTaXplQnl0ZXMoKSk7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1ZBTFVFLCAic3ViRWxlbWVudERhdGEgYmFkIHNpemUuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZS0+Z2V0SGFzUmVmZXJlbmNlcygpKSB7CisgICAgICAgIGUtPmluY1JlZnMoZGF0YSk7CisgICAgICAgIGUtPmRlY1JlZnMocHRyKTsKKyAgICB9CisKKyAgICBtZW1jcHkocHRyLCBkYXRhLCBzaXplQnl0ZXMpOworICAgIHNlbmREaXJ0eSgpOworICAgIG1VcGxvYWREZWZlcmVkID0gdHJ1ZTsKK30KKwordm9pZCBBbGxvY2F0aW9uOjpzdWJFbGVtZW50RGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGNJZHgsIHVpbnQzMl90IHNpemVCeXRlcykKK3sKKyAgICB1aW50MzJfdCBlU2l6ZSA9IG1UeXBlLT5nZXRFbGVtZW50U2l6ZUJ5dGVzKCk7CisgICAgdWludDhfdCAqIHB0ciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4obVB0cik7CisgICAgcHRyICs9IGVTaXplICogKHggKyB5ICogbVR5cGUtPmdldERpbVgoKSk7CisKKyAgICBpZiAoeCA+PSBtVHlwZS0+Z2V0RGltWCgpKSB7CisgICAgICAgIExPR0UoIkVycm9yIEFsbG9jYXRpb246OnN1YkVsZW1lbnREYXRhIFggb2Zmc2V0ICVpIG91dCBvZiByYW5nZS4iLCB4KTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsICJzdWJFbGVtZW50RGF0YSBYIG9mZnNldCBvdXQgb2YgcmFuZ2UuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoeSA+PSBtVHlwZS0+Z2V0RGltWSgpKSB7CisgICAgICAgIExPR0UoIkVycm9yIEFsbG9jYXRpb246OnN1YkVsZW1lbnREYXRhIFggb2Zmc2V0ICVpIG91dCBvZiByYW5nZS4iLCB4KTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsICJzdWJFbGVtZW50RGF0YSBYIG9mZnNldCBvdXQgb2YgcmFuZ2UuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoY0lkeCA+PSBtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRGaWVsZENvdW50KCkpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgQWxsb2NhdGlvbjo6c3ViRWxlbWVudERhdGEgY29tcG9uZW50ICVpIG91dCBvZiByYW5nZS4iLCBjSWR4KTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsICJzdWJFbGVtZW50RGF0YSBjb21wb25lbnQgb3V0IG9mIHJhbmdlLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgRWxlbWVudCAqIGUgPSBtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRGaWVsZChjSWR4KTsKKyAgICBwdHIgKz0gbVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjSWR4KTsKKworICAgIGlmIChzaXplQnl0ZXMgIT0gZS0+Z2V0U2l6ZUJ5dGVzKCkpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgQWxsb2NhdGlvbjo6c3ViRWxlbWVudERhdGEgZGF0YSBzaXplICVpIGRvZXMgbm90IG1hdGNoIGZpZWxkIHNpemUgJWkuIiwgc2l6ZUJ5dGVzLCBlLT5nZXRTaXplQnl0ZXMoKSk7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1ZBTFVFLCAic3ViRWxlbWVudERhdGEgYmFkIHNpemUuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZS0+Z2V0SGFzUmVmZXJlbmNlcygpKSB7CisgICAgICAgIGUtPmluY1JlZnMoZGF0YSk7CisgICAgICAgIGUtPmRlY1JlZnMocHRyKTsKKyAgICB9CisKKyAgICBtZW1jcHkocHRyLCBkYXRhLCBzaXplQnl0ZXMpOworICAgIHNlbmREaXJ0eSgpOworICAgIG1VcGxvYWREZWZlcmVkID0gdHJ1ZTsKK30KKwogdm9pZCBBbGxvY2F0aW9uOjphZGRQcm9ncmFtVG9EaXJ0eShjb25zdCBQcm9ncmFtICpwKQogewotICAgIG1Ub0RpcnR5TGlzdC5hZGQocCk7CisgICAgbVRvRGlydHlMaXN0LnB1c2gocCk7CiB9CiAKIHZvaWQgQWxsb2NhdGlvbjo6cmVtb3ZlUHJvZ3JhbVRvRGlydHkoY29uc3QgUHJvZ3JhbSAqcCkKQEAgLTMxNiw2ICs0MjcsNjEgQEAKIAogfQogCit2b2lkIEFsbG9jYXRpb246OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgLy8gTmVlZCB0byBpZGVudGlmeSBvdXJzZWx2ZXMKKyAgICBzdHJlYW0tPmFkZFUzMigodWludDMyX3QpZ2V0Q2xhc3NJZCgpKTsKKworICAgIFN0cmluZzggbmFtZShnZXROYW1lKCkpOworICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZuYW1lKTsKKworICAgIC8vIEZpcnN0IHRoaW5nIHdlIG5lZWQgdG8gc2VyaWFsaXplIGlzIHRoZSB0eXBlIG9iamVjdCBzaW5jZSBpdCB3aWxsIGJlIG5lZWRlZAorICAgIC8vIHRvIGluaXRpYWxpemUgdGhlIGNsYXNzCisgICAgbVR5cGUtPnNlcmlhbGl6ZShzdHJlYW0pOworCisgICAgdWludDMyX3QgZGF0YVNpemUgPSBtVHlwZS0+Z2V0U2l6ZUJ5dGVzKCk7CisgICAgLy8gV3JpdGUgaG93IG11Y2ggZGF0YSB3ZSBhcmUgc3RvcmluZworICAgIHN0cmVhbS0+YWRkVTMyKGRhdGFTaXplKTsKKyAgICAvLyBOb3cgd3JpdGUgdGhlIGRhdGEKKyAgICBzdHJlYW0tPmFkZEJ5dGVBcnJheShtUHRyLCBkYXRhU2l6ZSk7Cit9CisKK0FsbG9jYXRpb24gKkFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGFyZSByZWFkaW5nIHRoZSBjb3JyZWN0IG9iamVjdAorICAgIFJzQTNEQ2xhc3NJRCBjbGFzc0lEID0gKFJzQTNEQ2xhc3NJRClzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihjbGFzc0lEICE9IFJTX0EzRF9DTEFTU19JRF9BTExPQ0FUSU9OKSB7CisgICAgICAgIExPR0UoImFsbG9jYXRpb24gbG9hZGluZyBza2lwcGVkIGR1ZSB0byBpbnZhbGlkIGNsYXNzIGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgU3RyaW5nOCBuYW1lOworICAgIHN0cmVhbS0+bG9hZFN0cmluZygmbmFtZSk7CisKKyAgICBUeXBlICp0eXBlID0gVHlwZTo6Y3JlYXRlRnJvbVN0cmVhbShyc2MsIHN0cmVhbSk7CisgICAgaWYoIXR5cGUpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHR5cGUtPmNvbXB1dGUoKTsKKworICAgIC8vIE51bWJlciBvZiBieXRlcyB3ZSB3cm90ZSBvdXQgZm9yIHRoaXMgYWxsb2NhdGlvbgorICAgIHVpbnQzMl90IGRhdGFTaXplID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYoZGF0YVNpemUgIT0gdHlwZS0+Z2V0U2l6ZUJ5dGVzKCkpIHsKKyAgICAgICAgTE9HRSgiZmFpbGVkIHRvIHJlYWQgYWxsb2NhdGlvbiBiZWNhdXNlIG51bWJ5dGVzIHdyaXR0ZW4gaXMgbm90IHRoZSBzYW1lIGxvYWRlZCB0eXBlIHdhbnRzXG4iKTsKKyAgICAgICAgZGVsZXRlIHR5cGU7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEFsbG9jYXRpb24gKmFsbG9jID0gbmV3IEFsbG9jYXRpb24ocnNjLCB0eXBlKTsKKyAgICBhbGxvYy0+c2V0TmFtZShuYW1lLnN0cmluZygpLCBuYW1lLnNpemUoKSk7CisKKyAgICAvLyBSZWFkIGluIGFsbCBvZiBvdXIgYWxsb2NhdGlvbiBkYXRhCisgICAgYWxsb2MtPmRhdGEocnNjLCBzdHJlYW0tPmdldFB0cigpICsgc3RyZWFtLT5nZXRQb3MoKSwgZGF0YVNpemUpOworICAgIHN0cmVhbS0+cmVzZXQoc3RyZWFtLT5nZXRQb3MoKSArIGRhdGFTaXplKTsKKworICAgIHJldHVybiBhbGxvYzsKK30KKwogdm9pZCBBbGxvY2F0aW9uOjpzZW5kRGlydHkoKSBjb25zdAogewogICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgbVRvRGlydHlMaXN0LnNpemUoKTsgY3QrKykgewpAQCAtMzIzLDYgKzQ4OSwzMiBAQAogICAgIH0KIH0KIAordm9pZCBBbGxvY2F0aW9uOjppbmNSZWZzKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IGN0KSBjb25zdAoreworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90ICo+KHB0cik7CisgICAgY29uc3QgRWxlbWVudCAqZSA9IG1UeXBlLT5nZXRFbGVtZW50KCk7CisgICAgdWludDMyX3Qgc3RyaWRlID0gZS0+Z2V0U2l6ZUJ5dGVzKCk7CisKKyAgICB3aGlsZSAoY3QgPiAwKSB7CisgICAgICAgIGUtPmluY1JlZnMocCk7CisgICAgICAgIGN0IC0tOworICAgICAgICBwICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3ZvaWQgQWxsb2NhdGlvbjo6ZGVjUmVmcyhjb25zdCB2b2lkICpwdHIsIHNpemVfdCBjdCkgY29uc3QKK3sKKyAgICBjb25zdCB1aW50OF90ICpwID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCAqPihwdHIpOworICAgIGNvbnN0IEVsZW1lbnQgKmUgPSBtVHlwZS0+Z2V0RWxlbWVudCgpOworICAgIHVpbnQzMl90IHN0cmlkZSA9IGUtPmdldFNpemVCeXRlcygpOworCisgICAgd2hpbGUgKGN0ID4gMCkgeworICAgICAgICBlLT5kZWNSZWZzKHApOworICAgICAgICBjdCAtLTsKKyAgICAgICAgcCArPSBzdHJpZGU7CisgICAgfQorfQorCiAvLy8vLy8vLy8vLy8vLy8vLwogLy8KIApAQCAtNDk1LDcgKzY4Nyw3IEBACiAgICAgaWYgKHNyY0dMVHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFICYmCiAgICAgICAgIHNyY0dMRm10ID09IEdMX1JHQiAmJgogICAgICAgICBkc3RHTFR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfNV82XzUgJiYKLSAgICAgICAgZHN0R0xUeXBlID09IEdMX1JHQikgeworICAgICAgICBkc3RHTEZtdCA9PSBHTF9SR0IpIHsKIAogICAgICAgICByZXR1cm4gZWxlbWVudENvbnZlcnRlcl84ODhfdG9fNTY1OwogICAgIH0KQEAgLTUwMywxNSArNjk1LDIxIEBACiAgICAgaWYgKHNyY0dMVHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFICYmCiAgICAgICAgIHNyY0dMRm10ID09IEdMX1JHQkEgJiYKICAgICAgICAgZHN0R0xUeXBlID09IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICYmCi0gICAgICAgIGRzdEdMVHlwZSA9PSBHTF9SR0IpIHsKKyAgICAgICAgZHN0R0xGbXQgPT0gR0xfUkdCKSB7CiAKICAgICAgICAgcmV0dXJuIGVsZW1lbnRDb252ZXJ0ZXJfODg4OF90b181NjU7CiAgICAgfQogCiAgICAgTE9HRSgicGlja0NvbnZlcnRlciwgdW5zdXBvcnRlZCBjb21ibywgc3JjICVwLCAgZHN0ICVwIiwgc3JjLCBkc3QpOworICAgIExPR0UoInBpY2tDb252ZXJ0ZXIsIHNyY0dMVHlwZSA9ICV4LCAgc3JjR0xGbXQgPSAleCIsIHNyY0dMVHlwZSwgc3JjR0xGbXQpOworICAgIExPR0UoInBpY2tDb252ZXJ0ZXIsIGRzdEdMVHlwZSA9ICV4LCAgZHN0R0xGbXQgPSAleCIsIGRzdEdMVHlwZSwgZHN0R0xGbXQpOworICAgIHNyYy0+ZHVtcExPR1YoIlNSQyAiKTsKKyAgICBkc3QtPmR1bXBMT0dWKCJEU1QgIik7CiAgICAgcmV0dXJuIDA7CiB9CiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCiBSc0FsbG9jYXRpb24gcnNpX0FsbG9jYXRpb25DcmVhdGVCaXRtYXBSZWYoQ29udGV4dCAqcnNjLCBSc1R5cGUgdnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYm1wLCB2b2lkICpjYWxsYmFja0RhdGEsIFJzQml0bWFwQ2FsbGJhY2tfdCBjYWxsYmFjaykKIHsKQEAgLTU0NiwxNiArNzQ0LDE5IEBACiAgICAgfQogCiAgICAgRWxlbWVudENvbnZlcnRlcl90IGN2dCA9IHBpY2tDb252ZXJ0ZXIoZHN0LCBzcmMpOwotICAgIGN2dCh0ZXhBbGxvYy0+Z2V0UHRyKCksIGRhdGEsIHcgKiBoKTsKLQotICAgIGlmIChnZW5NaXBzKSB7Ci0gICAgICAgIEFkYXB0ZXIyRCBhZGFwdChyc2MsIHRleEFsbG9jKTsKLSAgICAgICAgQWRhcHRlcjJEIGFkYXB0Mihyc2MsIHRleEFsbG9jKTsKLSAgICAgICAgZm9yKHVpbnQzMl90IGxvZD0wOyBsb2QgPCAodGV4QWxsb2MtPmdldFR5cGUoKS0+Z2V0TE9EQ291bnQoKSAtMSk7IGxvZCsrKSB7Ci0gICAgICAgICAgICBhZGFwdC5zZXRMT0QobG9kKTsKLSAgICAgICAgICAgIGFkYXB0Mi5zZXRMT0QobG9kICsgMSk7Ci0gICAgICAgICAgICBtaXAoYWRhcHQyLCBhZGFwdCk7CisgICAgaWYgKGN2dCkgeworICAgICAgICBjdnQodGV4QWxsb2MtPmdldFB0cigpLCBkYXRhLCB3ICogaCk7CisgICAgICAgIGlmIChnZW5NaXBzKSB7CisgICAgICAgICAgICBBZGFwdGVyMkQgYWRhcHQocnNjLCB0ZXhBbGxvYyk7CisgICAgICAgICAgICBBZGFwdGVyMkQgYWRhcHQyKHJzYywgdGV4QWxsb2MpOworICAgICAgICAgICAgZm9yKHVpbnQzMl90IGxvZD0wOyBsb2QgPCAodGV4QWxsb2MtPmdldFR5cGUoKS0+Z2V0TE9EQ291bnQoKSAtMSk7IGxvZCsrKSB7CisgICAgICAgICAgICAgICAgYWRhcHQuc2V0TE9EKGxvZCk7CisgICAgICAgICAgICAgICAgYWRhcHQyLnNldExPRChsb2QgKyAxKTsKKyAgICAgICAgICAgICAgICBtaXAoYWRhcHQyLCBhZGFwdCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9WQUxVRSwgIlVuc3VwcG9ydGVkIGJpdG1hcCBmb3JtYXQiKTsKICAgICB9CiAKICAgICByZXR1cm4gdGV4QWxsb2M7CkBAIC01OTIsMTkgKzc5MywzMSBAQAogdm9pZCByc2lfQWxsb2NhdGlvbkRhdGEoQ29udGV4dCAqcnNjLCBSc0FsbG9jYXRpb24gdmEsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKIHsKICAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7Ci0gICAgYS0+ZGF0YShkYXRhLCBzaXplQnl0ZXMpOworICAgIGEtPmRhdGEocnNjLCBkYXRhLCBzaXplQnl0ZXMpOwogfQogCiB2b2lkIHJzaV9BbGxvY2F0aW9uMURTdWJEYXRhKENvbnRleHQgKnJzYywgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCBjb3VudCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQogewogICAgIEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKLSAgICBhLT5zdWJEYXRhKHhvZmYsIGNvdW50LCBkYXRhLCBzaXplQnl0ZXMpOworICAgIGEtPnN1YkRhdGEocnNjLCB4b2ZmLCBjb3VudCwgZGF0YSwgc2l6ZUJ5dGVzKTsKK30KKwordm9pZCByc2lfQWxsb2NhdGlvbjJEU3ViRWxlbWVudERhdGEoQ29udGV4dCAqcnNjLCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGVvZmYsIHVpbnQzMl90IHNpemVCeXRlcykKK3sKKyAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7CisgICAgYS0+c3ViRWxlbWVudERhdGEocnNjLCB4LCB5LCBkYXRhLCBlb2ZmLCBzaXplQnl0ZXMpOworfQorCit2b2lkIHJzaV9BbGxvY2F0aW9uMURTdWJFbGVtZW50RGF0YShDb250ZXh0ICpyc2MsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgeCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgZW9mZiwgdWludDMyX3Qgc2l6ZUJ5dGVzKQoreworICAgIEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBhLT5zdWJFbGVtZW50RGF0YShyc2MsIHgsIGRhdGEsIGVvZmYsIHNpemVCeXRlcyk7CiB9CiAKIHZvaWQgcnNpX0FsbG9jYXRpb24yRFN1YkRhdGEoQ29udGV4dCAqcnNjLCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKIHsKICAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7Ci0gICAgYS0+c3ViRGF0YSh4b2ZmLCB5b2ZmLCB3LCBoLCBkYXRhLCBzaXplQnl0ZXMpOworICAgIGEtPnN1YkRhdGEocnNjLCB4b2ZmLCB5b2ZmLCB3LCBoLCBkYXRhLCBzaXplQnl0ZXMpOwogfQogCiB2b2lkIHJzaV9BbGxvY2F0aW9uUmVhZChDb250ZXh0ICpyc2MsIFJzQWxsb2NhdGlvbiB2YSwgdm9pZCAqZGF0YSkKQEAgLTYxMyw2ICs4MjYsMTUgQEAKICAgICBhLT5yZWFkKGRhdGEpOwogfQogCitjb25zdCB2b2lkKiByc2lfQWxsb2NhdGlvbkdldFR5cGUoQ29udGV4dCAqcnNjLCBSc0FsbG9jYXRpb24gdmEpCit7CisgICAgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpOworICAgIGEtPmdldFR5cGUoKS0+aW5jVXNlclJlZigpOworCisgICAgcmV0dXJuIGEtPmdldFR5cGUoKTsKK30KKworI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogCiB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQWxsb2NhdGlvbi5oIGIvbGlicy9ycy9yc0FsbG9jYXRpb24uaAppbmRleCA1MTZmOGI3Li45NjdmMjIwIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQWxsb2NhdGlvbi5oCisrKyBiL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmgKQEAgLTU2LDEzICs1NiwxOCBAQAogICAgIHVpbnQzMl90IGdldEJ1ZmZlck9iamVjdElEKCkgY29uc3Qge3JldHVybiBtQnVmZmVySUQ7fQogCiAKLSAgICB2b2lkIGRhdGEoY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKTsKLSAgICB2b2lkIHN1YkRhdGEodWludDMyX3QgeG9mZiwgdWludDMyX3QgY291bnQsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcyk7Ci0gICAgdm9pZCBzdWJEYXRhKHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsCisgICAgdm9pZCBkYXRhKENvbnRleHQgKnJzYywgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKTsKKyAgICB2b2lkIHN1YkRhdGEoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCBjb3VudCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKTsKKyAgICB2b2lkIHN1YkRhdGEoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLAogICAgICAgICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpOwotICAgIHZvaWQgc3ViRGF0YSh1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLCB1aW50MzJfdCB6b2ZmLAorICAgIHZvaWQgc3ViRGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsIHVpbnQzMl90IHpvZmYsCiAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIHVpbnQzMl90IGQsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcyk7CiAKKyAgICB2b2lkIHN1YkVsZW1lbnREYXRhKENvbnRleHQgKnJzYywgdWludDMyX3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGVsZW1lbnRPZmYsIHVpbnQzMl90IHNpemVCeXRlcyk7CisgICAgdm9pZCBzdWJFbGVtZW50RGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBlbGVtZW50T2ZmLCB1aW50MzJfdCBzaXplQnl0ZXMpOworCiAgICAgdm9pZCByZWFkKHZvaWQgKmRhdGEpOwogCiAgICAgdm9pZCBlbmFibGVHTFZlcnRleEJ1ZmZlcnMoKSBjb25zdDsKQEAgLTcyLDkgKzc3LDE4IEBACiAgICAgdm9pZCByZW1vdmVQcm9ncmFtVG9EaXJ0eShjb25zdCBQcm9ncmFtICopOwogCiAgICAgdmlydHVhbCB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfQUxMT0NBVElPTjsgfQorICAgIHN0YXRpYyBBbGxvY2F0aW9uICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAogICAgIHZpcnR1YWwgdm9pZCB1cGxvYWRDaGVjayhjb25zdCBDb250ZXh0ICpyc2MpOwogCisgICAgYm9vbCBnZXRJc1RleHR1cmUoKSBjb25zdCB7cmV0dXJuIG1Jc1RleHR1cmU7fQorICAgIGJvb2wgZ2V0SXNCdWZmZXJPYmplY3QoKSBjb25zdCB7cmV0dXJuIG1Jc1ZlcnRleEJ1ZmZlcjt9CisKKyAgICB2b2lkIGluY1JlZnMoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgY3QpIGNvbnN0OworICAgIHZvaWQgZGVjUmVmcyhjb25zdCB2b2lkICpwdHIsIHNpemVfdCBjdCkgY29uc3Q7CisKIHByb3RlY3RlZDoKICAgICB2b2lkIHNlbmREaXJ0eSgpIGNvbnN0OwogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQW5pbWF0aW9uLmNwcCBiL2xpYnMvcnMvcnNBbmltYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMDA3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzQW5pbWF0aW9uLmNwcApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNBbmltYXRpb24uaCIKKworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKK3ZvaWQgQW5pbWF0aW9uOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIAorfQorCitBbmltYXRpb24gKkFuaW1hdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKK0FuaW1hdGlvbjo6QW5pbWF0aW9uKENvbnRleHQgKnJzYykgOiBPYmplY3RCYXNlKHJzYykKK3sKKyAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CisgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOworCisgICAgbVZhbHVlc0lucHV0ID0gTlVMTDsKKyAgICBtVmFsdWVzT3V0cHV0ID0gTlVMTDsKKyAgICBtVmFsdWVDb3VudCA9IDA7CisgICAgbUludGVycG9sYXRpb24gPSBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9TVEVQOworICAgIG1FZGdlUHJlID0gUlNfQU5JTUFUSU9OX0VER0VfVU5ERUZJTkVEOworICAgIG1FZGdlUG9zdCA9IFJTX0FOSU1BVElPTl9FREdFX1VOREVGSU5FRDsKKyAgICBtSW5wdXRNaW4gPSAwOworICAgIG1JbnB1dE1heCA9IDA7Cit9CisKK0FuaW1hdGlvbiAqIEFuaW1hdGlvbjo6Y3JlYXRlKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICppblZhbHVlcywgY29uc3QgZmxvYXQgKm91dFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlQ291bnQsIFJzQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiBpbnRlcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcHJlLCBSc0FuaW1hdGlvbkVkZ2UgcG9zdCkKK3sKKyAgICBpZiAodmFsdWVDb3VudCA8IDIpIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsICJBbmltYXRpb25zIHJlcXVpcmUgbW9yZSB0aGFuIDIgdmFsdWVzLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgQW5pbWF0aW9uICphID0gbmV3IEFuaW1hdGlvbihyc2MpOworICAgIGlmICghYSkgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX09VVF9PRl9NRU1PUlkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmbG9hdCAqdmluID0gKGZsb2F0ICopbWFsbG9jKHZhbHVlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBmbG9hdCAqdm91dCA9IChmbG9hdCAqKW1hbGxvYyh2YWx1ZUNvdW50ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgYS0+bVZhbHVlc0lucHV0ID0gdmluOworICAgIGEtPm1WYWx1ZXNPdXRwdXQgPSB2b3V0OworICAgIGlmIChhLT5tVmFsdWVzSW5wdXQgPT0gTlVMTCB8fCBhLT5tVmFsdWVzT3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIGE7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGEtPm1FZGdlUHJlID0gcHJlOworICAgIGEtPm1FZGdlUG9zdCA9IHBvc3Q7CisgICAgYS0+bUludGVycG9sYXRpb24gPSBpbnRlcnA7CisgICAgYS0+bVZhbHVlQ291bnQgPSB2YWx1ZUNvdW50OworCisgICAgbWVtY3B5KHZpbiwgaW5WYWx1ZXMsIHZhbHVlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBtZW1jcHkodm91dCwgb3V0VmFsdWVzLCB2YWx1ZUNvdW50ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgYS0+bUlucHV0TWluID0gaW5WYWx1ZXNbMF07CisgICAgYS0+bUlucHV0TWF4ID0gaW5WYWx1ZXNbMF07CisKKyAgICBib29sIG5lZWRTb3J0ID0gZmFsc2U7CisgICAgZm9yICh1aW50MzJfdCBjdD0xOyBjdCA8IHZhbHVlQ291bnQ7IGN0KyspIHsKKyAgICAgICAgaWYgKGEtPm1JbnB1dE1pbiA+IHZpbltjdF0pIHsKKyAgICAgICAgICAgIG5lZWRTb3J0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGEtPm1JbnB1dE1pbiA9IHZpbltjdF07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGEtPm1JbnB1dE1heCA8IHZpbltjdF0pIHsKKyAgICAgICAgICAgIGEtPm1JbnB1dE1heCA9IHZpbltjdF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZWVkU29ydCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBjdD0xOyBjdCA8IHZhbHVlQ291bnQ7IGN0KyspIHsKKyAgICAgICAgICAgIGlmICh2aW5bY3QtMV0gPiB2aW5bY3RdKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgdCA9IHZpbltjdC0xXTsKKyAgICAgICAgICAgICAgICB2aW5bY3QtMV0gPSB2aW5bY3RdOworICAgICAgICAgICAgICAgIHZpbltjdF0gPSB0OworICAgICAgICAgICAgICAgIHQgPSB2b3V0W2N0LTFdOworICAgICAgICAgICAgICAgIHZvdXRbY3QtMV0gPSB2b3V0W2N0XTsKKyAgICAgICAgICAgICAgICB2b3V0W2N0XSA9IHQ7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjaGFuZ2VkKSBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gYTsKK30KKyovCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitSc0FuaW1hdGlvbiByc2lfQW5pbWF0aW9uQ3JlYXRlKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmluVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqb3V0VmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkludGVycG9sYXRpb24gaW50ZXJwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcHJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcG9zdCkKK3sKKyAgICAvL0xPR0UoInJzaV9FbGVtZW50Q3JlYXRlICVpICVpICVpICVpIiwgZHQsIGRrLCBub3JtLCB2ZWNTaXplKTsKKyAgICBBbmltYXRpb24gKmEgPSBOVUxMOy8vQW5pbWF0aW9uOjpjcmVhdGUocnNjLCBpblZhbHVlcywgb3V0VmFsdWVzLCB2YWx1ZUNvdW50LCBpbnRlcnAsIHByZSwgcG9zdCk7CisgICAgaWYgKGEgIT0gTlVMTCkgeworICAgICAgICBhLT5pbmNVc2VyUmVmKCk7CisgICAgfQorICAgIHJldHVybiAoUnNBbmltYXRpb24pYTsKK30KKworCit9Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNBbmltYXRpb24uaCBiL2xpYnMvcnMvcnNBbmltYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDAzMTRlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc0FuaW1hdGlvbi5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfQU5JTUFUSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19BTklNQVRJT05fSAorCisjaW5jbHVkZSAicnNVdGlscy5oIgorI2luY2x1ZGUgInJzT2JqZWN0QmFzZS5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCisKK2NsYXNzIEFuaW1hdGlvbiA6IHB1YmxpYyBPYmplY3RCYXNlCit7CitwdWJsaWM6CisgICAgfkFuaW1hdGlvbigpOworCisgICAgc3RhdGljIEFuaW1hdGlvbiAqIGNyZWF0ZShDb250ZXh0ICpyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqaW5WYWx1ZXMsIGNvbnN0IGZsb2F0ICpvdXRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZUNvdW50LCBSc0FuaW1hdGlvbkludGVycG9sYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcHJlLCBSc0FuaW1hdGlvbkVkZ2UgcG9zdCk7CisKKyAgICBmbG9hdCBldmFsKGZsb2F0KSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX0FOSU1BVElPTjsgfQorICAgIHN0YXRpYyBBbmltYXRpb24gKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCitwcm90ZWN0ZWQ6CisgICAgQW5pbWF0aW9uKENvbnRleHQgKnJzYyk7CisKKworCisgICAgZmxvYXQgZXZhbEluUmFuZ2UoZmxvYXQpIGNvbnN0OworCisKKworICAgIGNvbnN0IGZsb2F0ICptVmFsdWVzSW5wdXQ7CisgICAgY29uc3QgZmxvYXQgKm1WYWx1ZXNPdXRwdXQ7CisgICAgdWludDMyX3QgbVZhbHVlQ291bnQ7CisgICAgUnNBbmltYXRpb25JbnRlcnBvbGF0aW9uIG1JbnRlcnBvbGF0aW9uOworICAgIFJzQW5pbWF0aW9uRWRnZSBtRWRnZVByZTsKKyAgICBSc0FuaW1hdGlvbkVkZ2UgbUVkZ2VQb3N0OworCisgICAgLy8gZGVyaXZlZAorICAgIGZsb2F0IG1JbnB1dE1pbjsKKyAgICBmbG9hdCBtSW5wdXRNYXg7Cit9OworCisKKworCit9Cit9CisjZW5kaWYgLy9BTkRST0lEX1NUUlVDVFVSRURfRUxFTUVOVF9ICisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNDb21wb25lbnQuY3BwIGIvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAKaW5kZXggMTVhNTZmNy4uZjUxYjIzZSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAKKysrIGIvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAKQEAgLTE2LDcgKzE2LDExIEBACiAKICNpbmNsdWRlICJyc0NvbXBvbmVudC5oIgogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlIDxHTEVTL2dsLmg+CisjZWxzZQorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTkxLDYgKzk1LDI2IEBACiAgICAgICAgIG1Ob3JtYWxpemVkID0gdHJ1ZTsKICAgICAgICAgcnNBc3NlcnQobUtpbmQgPT0gUlNfS0lORF9QSVhFTF9SR0JBKTsKICAgICAgICAgcmV0dXJuOworCisgICAgY2FzZSBSU19UWVBFX01BVFJJWF80WDQ6CisgICAgICAgIG1UeXBlQml0cyA9IDE2ICogMzI7CisgICAgICAgIHJzQXNzZXJ0KG1WZWN0b3JTaXplID09IDEpOworICAgICAgICByc0Fzc2VydChtTm9ybWFsaXplZCA9PSBmYWxzZSk7CisgICAgICAgIHJzQXNzZXJ0KG1LaW5kID09IFJTX0tJTkRfVVNFUik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfVFlQRV9NQVRSSVhfM1gzOgorICAgICAgICBtVHlwZUJpdHMgPSA5ICogMzI7CisgICAgICAgIHJzQXNzZXJ0KG1WZWN0b3JTaXplID09IDEpOworICAgICAgICByc0Fzc2VydChtTm9ybWFsaXplZCA9PSBmYWxzZSk7CisgICAgICAgIHJzQXNzZXJ0KG1LaW5kID09IFJTX0tJTkRfVVNFUik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfVFlQRV9NQVRSSVhfMlgyOgorICAgICAgICBtVHlwZUJpdHMgPSA0ICogMzI7CisgICAgICAgIHJzQXNzZXJ0KG1WZWN0b3JTaXplID09IDEpOworICAgICAgICByc0Fzc2VydChtTm9ybWFsaXplZCA9PSBmYWxzZSk7CisgICAgICAgIHJzQXNzZXJ0KG1LaW5kID09IFJTX0tJTkRfVVNFUik7CisgICAgICAgIGJyZWFrOworCiAgICAgY2FzZSBSU19UWVBFX0VMRU1FTlQ6CiAgICAgY2FzZSBSU19UWVBFX1RZUEU6CiAgICAgY2FzZSBSU19UWVBFX0FMTE9DQVRJT046CkBAIC0xNDgsMTEgKzE3MiwxOSBAQAogICAgIGNhc2UgUlNfVFlQRV9VTlNJR05FRF82NDoKICAgICAgICAgbVR5cGVCaXRzID0gNjQ7CiAgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBSU19UWVBFX0JPT0xFQU46CisgICAgICAgIG1UeXBlQml0cyA9IDg7CisgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIG1CaXRzID0gbVR5cGVCaXRzICogbVZlY3RvclNpemU7CiB9CiAKK2Jvb2wgQ29tcG9uZW50Ojppc1JlZmVyZW5jZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIChtVHlwZSA+PSBSU19UWVBFX0VMRU1FTlQpOworfQogCiAKIApAQCAtMTg4LDgyICsyMjAsNiBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqIGdDVHlwZVN0cmluZ3NbXSA9IHsKLSAgICAwLAotICAgIDAsLy8iRjE2IiwKLSAgICAiZmxvYXQiLAotICAgICJkb3VibGUiLAotICAgICJjaGFyIiwKLSAgICAic2hvcnQiLAotICAgICJpbnQiLAotICAgIDAsLy8iUzY0IiwKLSAgICAiY2hhciIsLy9VOCIsCi0gICAgInNob3J0IiwvL1UxNiIsCi0gICAgImludCIsLy9VMzIiLAotICAgIDAsLy8iVTY0IiwKLSAgICAwLC8vIlVQXzU2NSIsCi0gICAgMCwvLyJVUF81NTUxIiwKLSAgICAwLC8vIlVQXzQ0NDQiLAotICAgIDAsLy8iRUxFTUVOVCIsCi0gICAgMCwvLyJUWVBFIiwKLSAgICAwLC8vIkFMTE9DQVRJT04iLAotICAgIDAsLy8iU0FNUExFUiIsCi0gICAgMCwvLyJTQ1JJUFQiLAotICAgIDAsLy8iTUVTSCIsCi0gICAgMCwvLyJQUk9HUkFNX0ZSQUdNRU5UIiwKLSAgICAwLC8vIlBST0dSQU1fVkVSVEVYIiwKLSAgICAwLC8vIlBST0dSQU1fUkFTVEVSIiwKLSAgICAwLC8vIlBST0dSQU1fU1RPUkUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBnQ1ZlY1R5cGVTdHJpbmdzW10gPSB7Ci0gICAgMCwKLSAgICAwLC8vIkYxNiIsCi0gICAgInZlY0YzMiIsCi0gICAgInZlY0Y2NCIsCi0gICAgInZlY0k4IiwKLSAgICAidmVjSTE2IiwKLSAgICAidmVjSTMyIiwKLSAgICAwLC8vIlM2NCIsCi0gICAgInZlY1U4IiwvL1U4IiwKLSAgICAidmVjVTE2IiwvL1UxNiIsCi0gICAgInZlY1UzMiIsLy9VMzIiLAotICAgIDAsLy8iVTY0IiwKLSAgICAwLC8vIlVQXzU2NSIsCi0gICAgMCwvLyJVUF81NTUxIiwKLSAgICAwLC8vIlVQXzQ0NDQiLAotICAgIDAsLy8iRUxFTUVOVCIsCi0gICAgMCwvLyJUWVBFIiwKLSAgICAwLC8vIkFMTE9DQVRJT04iLAotICAgIDAsLy8iU0FNUExFUiIsCi0gICAgMCwvLyJTQ1JJUFQiLAotICAgIDAsLy8iTUVTSCIsCi0gICAgMCwvLyJQUk9HUkFNX0ZSQUdNRU5UIiwKLSAgICAwLC8vIlBST0dSQU1fVkVSVEVYIiwKLSAgICAwLC8vIlBST0dSQU1fUkFTVEVSIiwKLSAgICAwLC8vIlBST0dSQU1fU1RPUkUiLAotfTsKLQotU3RyaW5nOCBDb21wb25lbnQ6OmdldENUeXBlKCkgY29uc3QKLXsKLSAgICBjaGFyIGJ1Zls2NF07Ci0gICAgaWYgKG1WZWN0b3JTaXplID09IDEpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoZ0NUeXBlU3RyaW5nc1ttVHlwZV0pOwotICAgIH0KLQotICAgIC8vIFl1Y2ssIGFjYyBXQVIKLSAgICAvLyBBcHBlYXJzIHRvIGhhdmUgcHJvYmxlbXMgcGFja2luZyBjaGFycwotICAgIGlmIChtVmVjdG9yU2l6ZSA9PSA0ICYmIG1UeXBlID09IFJTX1RZUEVfVU5TSUdORURfOCkgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgiaW50Iik7Ci0gICAgfQotCi0KLSAgICBTdHJpbmc4IHMoZ0NWZWNUeXBlU3RyaW5nc1ttVHlwZV0pOwotICAgIHNwcmludGYoYnVmLCAiXyVpX3QiLCBtVmVjdG9yU2l6ZSk7Ci0gICAgcy5hcHBlbmQoYnVmKTsKLSAgICByZXR1cm4gczsKLX0KLQogU3RyaW5nOCBDb21wb25lbnQ6OmdldEdMU0xUeXBlKCkgY29uc3QKIHsKICAgICBpZiAobVR5cGUgPT0gUlNfVFlQRV9TSUdORURfMzIpIHsKQEAgLTI4MiwxMCArMjM4LDE5IEBACiAgICAgICAgIGNhc2UgNDogcmV0dXJuIFN0cmluZzgoInZlYzQiKTsKICAgICAgICAgfQogICAgIH0KKyAgICBpZiAoKG1UeXBlID09IFJTX1RZUEVfTUFUUklYXzRYNCkgJiYgKG1WZWN0b3JTaXplID09IDEpKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJtYXQ0Iik7CisgICAgfQorICAgIGlmICgobVR5cGUgPT0gUlNfVFlQRV9NQVRSSVhfM1gzKSAmJiAobVZlY3RvclNpemUgPT0gMSkpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoIm1hdDMiKTsKKyAgICB9CisgICAgaWYgKChtVHlwZSA9PSBSU19UWVBFX01BVFJJWF8yWDIpICYmIChtVmVjdG9yU2l6ZSA9PSAxKSkgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgibWF0MiIpOworICAgIH0KICAgICByZXR1cm4gU3RyaW5nOCgpOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqIGdUeXBlU3RyaW5nc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBnVHlwZUJhc2ljU3RyaW5nc1tdID0gewogICAgICJOT05FIiwKICAgICAiRjE2IiwKICAgICAiRjMyIiwKQEAgLTI5OCw5ICsyNjMsMTYgQEAKICAgICAiVTE2IiwKICAgICAiVTMyIiwKICAgICAiVTY0IiwKKyAgICAiQk9PTEVBTiIsCiAgICAgIlVQXzU2NSIsCiAgICAgIlVQXzU1NTEiLAogICAgICJVUF80NDQ0IiwKKyAgICAiTUFUUklYXzRYNCIsCisgICAgIk1BVFJJWF8zWDMiLAorICAgICJNQVRSSVhfMlgyIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogZ1R5cGVPYmpTdHJpbmdzW10gPSB7CiAgICAgIkVMRU1FTlQiLAogICAgICJUWVBFIiwKICAgICAiQUxMT0NBVElPTiIsCkBAIC0zMzAsOCArMzAyLDM0IEBACiAKIHZvaWQgQ29tcG9uZW50OjpkdW1wTE9HVihjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0CiB7Ci0gICAgTE9HVigiJXMgICBDb21wb25lbnQ6ICVzLCAlcywgdmVjdG9yU2l6ZT0laSwgYml0cz0laSIsCi0gICAgICAgICBwcmVmaXgsIGdUeXBlU3RyaW5nc1ttVHlwZV0sIGdLaW5kU3RyaW5nc1ttS2luZF0sIG1WZWN0b3JTaXplLCBtQml0cyk7CisgICAgaWYgKG1UeXBlID49IFJTX1RZUEVfRUxFTUVOVCkgeworICAgICAgICBMT0dWKCIlcyAgIENvbXBvbmVudDogJXMsICVzLCB2ZWN0b3JTaXplPSVpLCBiaXRzPSVpIiwKKyAgICAgICAgICAgICBwcmVmaXgsIGdUeXBlT2JqU3RyaW5nc1ttVHlwZSAtIFJTX1RZUEVfRUxFTUVOVF0sIGdLaW5kU3RyaW5nc1ttS2luZF0sIG1WZWN0b3JTaXplLCBtQml0cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HVigiJXMgICBDb21wb25lbnQ6ICVzLCAlcywgdmVjdG9yU2l6ZT0laSwgYml0cz0laSIsCisgICAgICAgICAgICAgcHJlZml4LCBnVHlwZUJhc2ljU3RyaW5nc1ttVHlwZV0sIGdLaW5kU3RyaW5nc1ttS2luZF0sIG1WZWN0b3JTaXplLCBtQml0cyk7CisgICAgfQogfQogCit2b2lkIENvbXBvbmVudDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KW1UeXBlKTsKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KW1LaW5kKTsKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KShtTm9ybWFsaXplZCA/IDEgOiAwKSk7CisgICAgc3RyZWFtLT5hZGRVMzIobVZlY3RvclNpemUpOworfQorCit2b2lkIENvbXBvbmVudDo6bG9hZEZyb21TdHJlYW0oSVN0cmVhbSAqc3RyZWFtKQoreworICAgIG1UeXBlID0gKFJzRGF0YVR5cGUpc3RyZWFtLT5sb2FkVTgoKTsKKyAgICBtS2luZCA9IChSc0RhdGFLaW5kKXN0cmVhbS0+bG9hZFU4KCk7CisgICAgdWludDhfdCB0ZW1wID0gc3RyZWFtLT5sb2FkVTgoKTsKKyAgICBtTm9ybWFsaXplZCA9IHRlbXAgIT0gMDsKKyAgICBtVmVjdG9yU2l6ZSA9IHN0cmVhbS0+bG9hZFUzMigpOworCisgICAgc2V0KG1UeXBlLCBtS2luZCwgbU5vcm1hbGl6ZWQsIG1WZWN0b3JTaXplKTsKK30KKworCisKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbXBvbmVudC5oIGIvbGlicy9ycy9yc0NvbXBvbmVudC5oCmluZGV4IDcxZGUzMjQuLmE3NzUwNTEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNDb21wb25lbnQuaAorKysgYi9saWJzL3JzL3JzQ29tcG9uZW50LmgKQEAgLTM1LDcgKzM1LDYgQEAKIAogICAgIHVpbnQzMl90IGdldEdMVHlwZSgpIGNvbnN0OwogICAgIHVpbnQzMl90IGdldEdMRm9ybWF0KCkgY29uc3Q7Ci0gICAgU3RyaW5nOCBnZXRDVHlwZSgpIGNvbnN0OwogICAgIFN0cmluZzggZ2V0R0xTTFR5cGUoKSBjb25zdDsKICAgICB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CiAKQEAgLTQ4LDYgKzQ3LDEyIEBACiAgICAgYm9vbCBnZXRJc1NpZ25lZCgpIGNvbnN0IHtyZXR1cm4gbUlzU2lnbmVkO30KICAgICB1aW50MzJfdCBnZXRCaXRzKCkgY29uc3Qge3JldHVybiBtQml0czt9CiAKKyAgICAvLyBIZWxwZXJzIGZvciByZWFkaW5nIC8gd3JpdGluZyB0aGlzIGNsYXNzIG91dAorICAgIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdm9pZCBsb2FkRnJvbVN0cmVhbShJU3RyZWFtICpzdHJlYW0pOworCisgICAgYm9vbCBpc1JlZmVyZW5jZSgpIGNvbnN0OworCiBwcm90ZWN0ZWQ6CiAgICAgUnNEYXRhVHlwZSBtVHlwZTsKICAgICBSc0RhdGFLaW5kIG1LaW5kOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbnRleHQuY3BwIGIvbGlicy9ycy9yc0NvbnRleHQuY3BwCmluZGV4IDU5NmY1MzMuLmY2N2E5ZDUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNDb250ZXh0LmNwcAorKysgYi9saWJzL3JzL3JzQ29udGV4dC5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCkBAIC0xMjcsMTkgKzEyOCwyMSBAQAogfQogCiAKLXVpbnQzMl90IENvbnRleHQ6OnJ1blNjcmlwdChTY3JpcHQgKnMsIHVpbnQzMl90IGxhdW5jaElEKQordWludDMyX3QgQ29udGV4dDo6cnVuU2NyaXB0KFNjcmlwdCAqcykKIHsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudD4gZnJhZyhtRnJhZ21lbnQpOwogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVZlcnRleD4gdnR4KG1WZXJ0ZXgpOwotICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50U3RvcmU+IHN0b3JlKG1GcmFnbWVudFN0b3JlKTsKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gc3RvcmUobUZyYWdtZW50U3RvcmUpOwogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVJhc3Rlcj4gcmFzdGVyKG1SYXN0ZXIpOworICAgIE9iamVjdEJhc2VSZWY8Rm9udD4gZm9udChtRm9udCk7CiAKLSAgICB1aW50MzJfdCByZXQgPSBzLT5ydW4odGhpcywgbGF1bmNoSUQpOworICAgIHVpbnQzMl90IHJldCA9IHMtPnJ1bih0aGlzKTsKIAogICAgIG1GcmFnbWVudC5zZXQoZnJhZyk7CiAgICAgbVZlcnRleC5zZXQodnR4KTsKICAgICBtRnJhZ21lbnRTdG9yZS5zZXQoc3RvcmUpOwogICAgIG1SYXN0ZXIuc2V0KHJhc3Rlcik7CisgICAgbUZvbnQuc2V0KGZvbnQpOwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTE1MywyOSArMTU2LDExIEBACiAKIHVpbnQzMl90IENvbnRleHQ6OnJ1blJvb3RTY3JpcHQoKQogewotICAgIHRpbWVyU2V0KFJTX1RJTUVSX0NMRUFSX1NXQVApOwotICAgIHJzQXNzZXJ0KG1Sb290U2NyaXB0LT5tRW52aXJvbWVudC5tSXNSb290KTsKLQotICAgIGVnbFF1ZXJ5U3VyZmFjZShtRUdMLm1EaXNwbGF5LCBtRUdMLm1TdXJmYWNlLCBFR0xfV0lEVEgsICZtRUdMLm1XaWR0aCk7Ci0gICAgZWdsUXVlcnlTdXJmYWNlKG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIEVHTF9IRUlHSFQsICZtRUdMLm1IZWlnaHQpOwotICAgIGdsVmlld3BvcnQoMCwgMCwgbUVHTC5tV2lkdGgsIG1FR0wubUhlaWdodCk7Ci0gICAgZ2xDb2xvck1hc2soR0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRSk7Ci0KLSAgICBnbENsZWFyQ29sb3IobVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzBdLAotICAgICAgICAgICAgICAgICBtUm9vdFNjcmlwdC0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMV0sCi0gICAgICAgICAgICAgICAgIG1Sb290U2NyaXB0LT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsyXSwKLSAgICAgICAgICAgICAgICAgbVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzNdKTsKLSAgICBpZiAobVVzZURlcHRoKSB7Ci0gICAgICAgIGdsRGVwdGhNYXNrKEdMX1RSVUUpOwotICAgICAgICBnbENsZWFyRGVwdGhmKG1Sb290U2NyaXB0LT5tRW52aXJvbWVudC5tQ2xlYXJEZXB0aCk7Ci0gICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMX0RFUFRIX0JVRkZFUl9CSVQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgfQorICAgIGdsVmlld3BvcnQoMCwgMCwgbVdpZHRoLCBtSGVpZ2h0KTsKIAogICAgIHRpbWVyU2V0KFJTX1RJTUVSX1NDUklQVCk7CiAgICAgbVN0YXRlRnJhZ21lbnRTdG9yZS5tTGFzdC5jbGVhcigpOwotICAgIHVpbnQzMl90IHJldCA9IHJ1blNjcmlwdChtUm9vdFNjcmlwdC5nZXQoKSwgMCk7CisgICAgdWludDMyX3QgcmV0ID0gcnVuU2NyaXB0KG1Sb290U2NyaXB0LmdldCgpKTsKIAogICAgIGNoZWNrRXJyb3IoInJ1blJvb3RTY3JpcHQiKTsKICAgICBpZiAobUVycm9yICE9IFJTX0VSUk9SX05PTkUpIHsKQEAgLTI3NCw2ICsyNTksMjQgQEAKICAgICByZXR1cm4gMCAhPSBzdHJjbXAoYnVmLCAiMCIpOwogfQogCit2b2lkIENvbnRleHQ6OmRpc3BsYXlEZWJ1Z1N0YXRzKCkKK3sKKyAgICBjaGFyIGJ1ZmZlclsxMjhdOworICAgIHNwcmludGYoYnVmZmVyLCAiRnJhbWUgJWkgbXMsIFNjcmlwdCAlaSBtcyIsIG1UaW1lTVNMYXN0RnJhbWUsIG1UaW1lTVNMYXN0U2NyaXB0KTsKKyAgICBmbG9hdCBvbGRSLCBvbGRHLCBvbGRCLCBvbGRBOworICAgIG1TdGF0ZUZvbnQuZ2V0Rm9udENvbG9yKCZvbGRSLCAmb2xkRywgJm9sZEIsICZvbGRBKTsKKworICAgIGZsb2F0IHNoYWRvd0NvbCA9IDAuMmY7CisgICAgbVN0YXRlRm9udC5zZXRGb250Q29sb3Ioc2hhZG93Q29sLCBzaGFkb3dDb2wsIHNoYWRvd0NvbCwgMS4wZik7CisgICAgbVN0YXRlRm9udC5yZW5kZXJUZXh0KGJ1ZmZlciwgNSwgZ2V0SGVpZ2h0KCkgLSA1KTsKKworICAgIGZsb2F0IHRleHRDb2wgPSAwLjlmOworICAgIG1TdGF0ZUZvbnQuc2V0Rm9udENvbG9yKHRleHRDb2wsIHRleHRDb2wsIHRleHRDb2wsIDEuMGYpOworICAgIG1TdGF0ZUZvbnQucmVuZGVyVGV4dChidWZmZXIsIDQsIGdldEhlaWdodCgpIC0gNik7CisKKyAgICBtU3RhdGVGb250LnNldEZvbnRDb2xvcihvbGRSLCBvbGRHLCBvbGRCLCBvbGRBKTsKK30KKwogdm9pZCAqIENvbnRleHQ6OnRocmVhZFByb2Modm9pZCAqdnJzYykKIHsKICAgICAgQ29udGV4dCAqcnNjID0gc3RhdGljX2Nhc3Q8Q29udGV4dCAqPih2cnNjKTsKQEAgLTI4Niw2ICsyODksNyBAQAogICAgICByc2MtPnByb3BzLm1Mb2dTY3JpcHRzID0gZ2V0UHJvcCgiZGVidWcucnMuc2NyaXB0Iik7CiAgICAgIHJzYy0+cHJvcHMubUxvZ09iamVjdHMgPSBnZXRQcm9wKCJkZWJ1Zy5ycy5vYmplY3QiKTsKICAgICAgcnNjLT5wcm9wcy5tTG9nU2hhZGVycyA9IGdldFByb3AoImRlYnVnLnJzLnNoYWRlciIpOworICAgICByc2MtPnByb3BzLm1Mb2dWaXN1YWwgPSBnZXRQcm9wKCJkZWJ1Zy5ycy52aXN1YWwiKTsKIAogICAgICBTY3JpcHRUTFNTdHJ1Y3QgKnRsc1N0cnVjdCA9IG5ldyBTY3JpcHRUTFNTdHJ1Y3Q7CiAgICAgIGlmICghdGxzU3RydWN0KSB7CkBAIC0zMDAsMTQgKzMwNCwxNiBAQAogICAgICB9CiAKICAgICAgaWYgKHJzYy0+bUlzR3JhcGhpY3NDb250ZXh0KSB7Ci0gICAgICAgICByc2MtPm1TdGF0ZVJhc3Rlci5pbml0KHJzYywgcnNjLT5tRUdMLm1XaWR0aCwgcnNjLT5tRUdMLm1IZWlnaHQpOworICAgICAgICAgcnNjLT5tU3RhdGVSYXN0ZXIuaW5pdChyc2MpOwogICAgICAgICAgcnNjLT5zZXRSYXN0ZXIoTlVMTCk7Ci0gICAgICAgICByc2MtPm1TdGF0ZVZlcnRleC5pbml0KHJzYywgcnNjLT5tRUdMLm1XaWR0aCwgcnNjLT5tRUdMLm1IZWlnaHQpOworICAgICAgICAgcnNjLT5tU3RhdGVWZXJ0ZXguaW5pdChyc2MpOwogICAgICAgICAgcnNjLT5zZXRWZXJ0ZXgoTlVMTCk7Ci0gICAgICAgICByc2MtPm1TdGF0ZUZyYWdtZW50LmluaXQocnNjLCByc2MtPm1FR0wubVdpZHRoLCByc2MtPm1FR0wubUhlaWdodCk7CisgICAgICAgICByc2MtPm1TdGF0ZUZyYWdtZW50LmluaXQocnNjKTsKICAgICAgICAgIHJzYy0+c2V0RnJhZ21lbnQoTlVMTCk7Ci0gICAgICAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUuaW5pdChyc2MsIHJzYy0+bUVHTC5tV2lkdGgsIHJzYy0+bUVHTC5tSGVpZ2h0KTsKKyAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5pbml0KHJzYyk7CiAgICAgICAgICByc2MtPnNldEZyYWdtZW50U3RvcmUoTlVMTCk7CisgICAgICAgICByc2MtPm1TdGF0ZUZvbnQuaW5pdChyc2MpOworICAgICAgICAgcnNjLT5zZXRGb250KE5VTEwpOwogICAgICAgICAgcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheS5pbml0KHJzYyk7CiAgICAgIH0KIApAQCAtMzIxLDYgKzMyNywxMSBAQAogICAgICAgICAgdWludDMyX3QgdGFyZ2V0VGltZSA9IDA7CiAgICAgICAgICBpZiAobURyYXcgJiYgcnNjLT5tSXNHcmFwaGljc0NvbnRleHQpIHsKICAgICAgICAgICAgICB0YXJnZXRUaW1lID0gcnNjLT5ydW5Sb290U2NyaXB0KCk7CisKKyAgICAgICAgICAgICBpZihyc2MtPnByb3BzLm1Mb2dWaXN1YWwpIHsKKyAgICAgICAgICAgICAgICAgcnNjLT5kaXNwbGF5RGVidWdTdGF0cygpOworICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgIG1EcmF3ID0gdGFyZ2V0VGltZSAmJiAhcnNjLT5tUGF1c2VkOwogICAgICAgICAgICAgIHJzYy0+dGltZXJTZXQoUlNfVElNRVJfQ0xFQVJfU1dBUCk7CiAgICAgICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMocnNjLT5tRUdMLm1EaXNwbGF5LCByc2MtPm1FR0wubVN1cmZhY2UpOwpAQCAtMzI5LDkgKzM0MCw2IEBACiAgICAgICAgICAgICAgcnNjLT50aW1lclByaW50KCk7CiAgICAgICAgICAgICAgcnNjLT50aW1lclJlc2V0KCk7CiAgICAgICAgICB9Ci0gICAgICAgICBpZiAocnNjLT5tT2JqRGVzdHJveS5tTmVlZFRvRW1wdHkpIHsKLSAgICAgICAgICAgICByc2MtPm9iakRlc3Ryb3lPT0JSdW4oKTsKLSAgICAgICAgIH0KICAgICAgICAgIGlmIChyc2MtPm1UaHJlYWRQcmlvcml0eSA+IDAgJiYgdGFyZ2V0VGltZSkgewogICAgICAgICAgICAgIGludDMyX3QgdCA9ICh0YXJnZXRUaW1lIC0gKGludDMyX3QpKHJzYy0+bVRpbWVNU0xhc3RTY3JpcHQgKyByc2MtPm1UaW1lTVNMYXN0U3dhcCkpICogMTAwMDsKICAgICAgICAgICAgICBpZiAodCA+IDApIHsKQEAgLTM0NiwxNyArMzU0LDE2IEBACiAgICAgICAgICByc2MtPm1GcmFnbWVudC5jbGVhcigpOwogICAgICAgICAgcnNjLT5tVmVydGV4LmNsZWFyKCk7CiAgICAgICAgICByc2MtPm1GcmFnbWVudFN0b3JlLmNsZWFyKCk7CisgICAgICAgICByc2MtPm1Gb250LmNsZWFyKCk7CiAgICAgICAgICByc2MtPm1Sb290U2NyaXB0LmNsZWFyKCk7CiAgICAgICAgICByc2MtPm1TdGF0ZVJhc3Rlci5kZWluaXQocnNjKTsKICAgICAgICAgIHJzYy0+bVN0YXRlVmVydGV4LmRlaW5pdChyc2MpOwogICAgICAgICAgcnNjLT5tU3RhdGVGcmFnbWVudC5kZWluaXQocnNjKTsKICAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5kZWluaXQocnNjKTsKKyAgICAgICAgIHJzYy0+bVN0YXRlRm9udC5kZWluaXQocnNjKTsKICAgICAgfQogICAgICBPYmplY3RCYXNlOjp6ZXJvQWxsVXNlclJlZihyc2MpOwogCi0gICAgIHJzYy0+bU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5ID0gdHJ1ZTsKLSAgICAgcnNjLT5vYmpEZXN0cm95T09CUnVuKCk7Ci0KICAgICAgaWYgKHJzYy0+bUlzR3JhcGhpY3NDb250ZXh0KSB7CiAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmdJbml0TXV0ZXgpOwogICAgICAgICAgcnNjLT5kZWluaXRFR0woKTsKQEAgLTM2Nyw2ICszNzQsNDkgQEAKICAgICAgcmV0dXJuIE5VTEw7CiB9CiAKK3ZvaWQgKiBDb250ZXh0OjpoZWxwZXJUaHJlYWRQcm9jKHZvaWQgKnZyc2MpCit7CisgICAgIENvbnRleHQgKnJzYyA9IHN0YXRpY19jYXN0PENvbnRleHQgKj4odnJzYyk7CisgICAgIHVpbnQzMl90IGlkeCA9ICh1aW50MzJfdClhbmRyb2lkX2F0b21pY19pbmMoJnJzYy0+bVdvcmtlcnMubUxhdW5jaENvdW50KTsKKworICAgICBMT0dWKCJSUyBoZWxwZXJUaHJlYWQgc3RhcnRpbmcgJXAgaWR4PSVpIiwgcnNjLCBpZHgpOworCisgICAgIHJzYy0+bVdvcmtlcnMubUxhdW5jaFNpZ25hbHNbaWR4XS5pbml0KCk7CisgICAgIHJzYy0+bVdvcmtlcnMubU5hdGl2ZVRocmVhZElkW2lkeF0gPSBnZXR0aWQoKTsKKworICAgICAvL2NwdV9zZXRfdCBjcHNldFsxNl07CisgICAgIC8vaW50IHJldCA9IHNjaGVkX2dldGFmZmluaXR5KHJzYy0+bVdvcmtlcnMubU5hdGl2ZVRocmVhZElkW2lkeF0sIHNpemVvZihjcHNldCksICZjcHNldCk7CisgICAgIC8vTE9HRSgicmV0ID0gJWkiLCByZXQpOworCisvL3NjaGVkX3NldGFmZmluaXR5CisKKyAgICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCByc2MtPm1Xb3JrZXJzLm1OYXRpdmVUaHJlYWRJZFtpZHhdLCByc2MtPm1UaHJlYWRQcmlvcml0eSk7CisgICAgIHdoaWxlKHJzYy0+bVJ1bm5pbmcpIHsKKyAgICAgICAgIHJzYy0+bVdvcmtlcnMubUxhdW5jaFNpZ25hbHNbaWR4XS53YWl0KCk7CisgICAgICAgICBpZiAocnNjLT5tV29ya2Vycy5tTGF1bmNoQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJzYy0+bVdvcmtlcnMubUxhdW5jaENhbGxiYWNrKHJzYy0+bVdvcmtlcnMubUxhdW5jaERhdGEsIGlkeCk7CisgICAgICAgICB9CisgICAgICAgICBhbmRyb2lkX2F0b21pY19kZWMoJnJzYy0+bVdvcmtlcnMubVJ1bm5pbmdDb3VudCk7CisgICAgICAgICByc2MtPm1Xb3JrZXJzLm1Db21wbGV0ZVNpZ25hbC5zZXQoKTsKKyAgICAgfQorCisgICAgIExPR1YoIlJTIGhlbHBlclRocmVhZCBleGl0aW5nICVwIGlkeD0laSIsIHJzYywgaWR4KTsKKyAgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgQ29udGV4dDo6bGF1bmNoVGhyZWFkcyhXb3JrZXJDYWxsYmFja190IGNiaywgdm9pZCAqZGF0YSkKK3sKKyAgICBtV29ya2Vycy5tTGF1bmNoRGF0YSA9IGRhdGE7CisgICAgbVdvcmtlcnMubUxhdW5jaENhbGxiYWNrID0gY2JrOworICAgIG1Xb3JrZXJzLm1SdW5uaW5nQ291bnQgPSAoaW50KW1Xb3JrZXJzLm1Db3VudDsKKyAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtV29ya2Vycy5tQ291bnQ7IGN0KyspIHsKKyAgICAgICAgbVdvcmtlcnMubUxhdW5jaFNpZ25hbHNbY3RdLnNldCgpOworICAgIH0KKyAgICB3aGlsZShtV29ya2Vycy5tUnVubmluZ0NvdW50KSB7CisgICAgICAgIG1Xb3JrZXJzLm1Db21wbGV0ZVNpZ25hbC53YWl0KCk7CisgICAgfQorfQorCiB2b2lkIENvbnRleHQ6OnNldFByaW9yaXR5KGludDMyX3QgcCkKIHsKICAgICAvLyBOb3RlOiBJZiB3ZSBwdXQgdGhpcyBpbiB0aGUgcHJvcGVyICJiYWNrZ3JvdW5kIiBwb2xpY3kKQEAgLTM4Myw3ICs0MzMsMTAgQEAKICAgICAgICAgLy8gc3VjY2VzczsgcmVzZXQgdGhlIHByaW9yaXR5IGFzIHdlbGwKICAgICB9CiAjZWxzZQotICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIG1OYXRpdmVUaHJlYWRJZCwgcCk7CisgICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCBtTmF0aXZlVGhyZWFkSWQsIHApOworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtV29ya2Vycy5tQ291bnQ7IGN0KyspIHsKKyAgICAgICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCBtV29ya2Vycy5tTmF0aXZlVGhyZWFkSWRbY3RdLCBwKTsKKyAgICB9CiAjZW5kaWYKIH0KIApAQCAtNDI5LDIwICs0ODIsMzkgQEAKIAogICAgIG1XbmRTdXJmYWNlID0gTlVMTDsKIAotICAgIG9iakRlc3Ryb3lPT0JJbml0KCk7CiAgICAgdGltZXJJbml0KCk7CiAgICAgdGltZXJTZXQoUlNfVElNRVJfSU5URVJOQUwpOwogCi0gICAgTE9HVigiUlMgTGF1bmNoaW5nIHRocmVhZCIpOworICAgIGludCBjcHUgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyAgICBMT0dWKCJSUyBMYXVuY2hpbmcgdGhyZWFkKHMpLCByZXBvcnRlZCBDUFUgY291bnQgJWkiLCBjcHUpOworICAgIGlmIChjcHUgPCAyKSBjcHUgPSAwOworCisgICAgbVdvcmtlcnMubUNvdW50ID0gKHVpbnQzMl90KWNwdTsKKyAgICBtV29ya2Vycy5tVGhyZWFkSWQgPSAocHRocmVhZF90ICopIGNhbGxvYyhtV29ya2Vycy5tQ291bnQsIHNpemVvZihwdGhyZWFkX3QpKTsKKyAgICBtV29ya2Vycy5tTmF0aXZlVGhyZWFkSWQgPSAocGlkX3QgKikgY2FsbG9jKG1Xb3JrZXJzLm1Db3VudCwgc2l6ZW9mKHBpZF90KSk7CisgICAgbVdvcmtlcnMubUxhdW5jaFNpZ25hbHMgPSBuZXcgU2lnbmFsW21Xb3JrZXJzLm1Db3VudF07CisgICAgbVdvcmtlcnMubUxhdW5jaENhbGxiYWNrID0gTlVMTDsKICAgICBzdGF0dXMgPSBwdGhyZWFkX2NyZWF0ZSgmbVRocmVhZElkLCAmdGhyZWFkQXR0ciwgdGhyZWFkUHJvYywgdGhpcyk7CiAgICAgaWYgKHN0YXR1cykgewogICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc3RhcnQgcnMgY29udGV4dCB0aHJlYWQuIik7CisgICAgICAgIHJldHVybjsKICAgICB9Ci0KICAgICB3aGlsZSghbVJ1bm5pbmcpIHsKICAgICAgICAgdXNsZWVwKDEwMCk7CiAgICAgfQogCisgICAgbVdvcmtlcnMubVJ1bm5pbmdDb3VudCA9IDA7CisgICAgbVdvcmtlcnMubUxhdW5jaENvdW50ID0gMDsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVdvcmtlcnMubUNvdW50OyBjdCsrKSB7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY3JlYXRlKCZtV29ya2Vycy5tVGhyZWFkSWRbY3RdLCAmdGhyZWFkQXR0ciwgaGVscGVyVGhyZWFkUHJvYywgdGhpcyk7CisgICAgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgICAgIG1Xb3JrZXJzLm1Db3VudCA9IGN0OworICAgICAgICAgICAgTE9HRSgiQ3JlYXRlZCBmZXdlciB0aGFuIGV4cGVjdGVkIG51bWJlciBvZiBSUyB0aHJlYWRzLiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKwogICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZ0aHJlYWRBdHRyKTsKIH0KIApAQCAtNDU1LDggKzUyNyw2IEBACiAKICAgICBtSU8uc2h1dGRvd24oKTsKICAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9qb2luKG1UaHJlYWRJZCwgJnJlcyk7Ci0gICAgbU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5ID0gdHJ1ZTsKLSAgICBvYmpEZXN0cm95T09CUnVuKCk7CiAKICAgICAvLyBHbG9iYWwgc3RydWN0dXJlIGNsZWFudXAuCiAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnSW5pdE11dGV4KTsKQEAgLTQ2OSw4ICs1MzksNiBAQAogICAgICAgICBtRGV2ID0gTlVMTDsKICAgICB9CiAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdJbml0TXV0ZXgpOwotCi0gICAgb2JqRGVzdHJveU9PQkRlc3Ryb3koKTsKIH0KIAogdm9pZCBDb250ZXh0OjpzZXRTdXJmYWNlKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIEFOYXRpdmVXaW5kb3cgKnN1cikKQEAgLTQ4NiwxNCArNTU0LDE0IEBACiAgICAgICAgIGNoZWNrRWdsRXJyb3IoImVnbERlc3Ryb3lTdXJmYWNlIiwgcmV0KTsKIAogICAgICAgICBtRUdMLm1TdXJmYWNlID0gTlVMTDsKLSAgICAgICAgbUVHTC5tV2lkdGggPSAwOwotICAgICAgICBtRUdMLm1IZWlnaHQgPSAwOwogICAgICAgICBtV2lkdGggPSAwOwogICAgICAgICBtSGVpZ2h0ID0gMDsKICAgICB9CiAKICAgICBtV25kU3VyZmFjZSA9IHN1cjsKICAgICBpZiAobVduZFN1cmZhY2UgIT0gTlVMTCkgeworICAgICAgICBtV2lkdGggPSB3OworICAgICAgICBtSGVpZ2h0ID0gaDsKICAgICAgICAgYm9vbCBmaXJzdCA9IGZhbHNlOwogICAgICAgICBpZiAoIW1FR0wubUNvbnRleHQpIHsKICAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKQEAgLTUxMSwxNSArNTc5LDcgQEAKICAgICAgICAgcmV0ID0gZWdsTWFrZUN1cnJlbnQobUVHTC5tRGlzcGxheSwgbUVHTC5tU3VyZmFjZSwgbUVHTC5tU3VyZmFjZSwgbUVHTC5tQ29udGV4dCk7CiAgICAgICAgIGNoZWNrRWdsRXJyb3IoImVnbE1ha2VDdXJyZW50IiwgcmV0KTsKIAotICAgICAgICBlZ2xRdWVyeVN1cmZhY2UobUVHTC5tRGlzcGxheSwgbUVHTC5tU3VyZmFjZSwgRUdMX1dJRFRILCAmbUVHTC5tV2lkdGgpOwotICAgICAgICBlZ2xRdWVyeVN1cmZhY2UobUVHTC5tRGlzcGxheSwgbUVHTC5tU3VyZmFjZSwgRUdMX0hFSUdIVCwgJm1FR0wubUhlaWdodCk7Ci0gICAgICAgIG1XaWR0aCA9IHc7Ci0gICAgICAgIG1IZWlnaHQgPSBoOwotICAgICAgICBtU3RhdGVWZXJ0ZXgudXBkYXRlU2l6ZSh0aGlzLCB3LCBoKTsKLQotICAgICAgICBpZiAoKGludCltV2lkdGggIT0gbUVHTC5tV2lkdGggfHwgKGludCltSGVpZ2h0ICE9IG1FR0wubUhlaWdodCkgewotICAgICAgICAgICAgTE9HRSgiRUdML1N1cmZhY2UgbWlzbWF0Y2ggIEVHTCAoJWkgeCAlaSkgIFNGICglaSB4ICVpKSIsIG1FR0wubVdpZHRoLCBtRUdMLm1IZWlnaHQsIG1XaWR0aCwgbUhlaWdodCk7Ci0gICAgICAgIH0KKyAgICAgICAgbVN0YXRlVmVydGV4LnVwZGF0ZVNpemUodGhpcyk7CiAKICAgICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgICAgICBtR0wubVZlcnNpb24gPSBnbEdldFN0cmluZyhHTF9WRVJTSU9OKTsKQEAgLTU4Myw3ICs2NDMsNyBAQAogICAgIG1Sb290U2NyaXB0LnNldChzKTsKIH0KIAotdm9pZCBDb250ZXh0OjpzZXRGcmFnbWVudFN0b3JlKFByb2dyYW1GcmFnbWVudFN0b3JlICpwZnMpCit2b2lkIENvbnRleHQ6OnNldEZyYWdtZW50U3RvcmUoUHJvZ3JhbVN0b3JlICpwZnMpCiB7CiAgICAgcnNBc3NlcnQobUlzR3JhcGhpY3NDb250ZXh0KTsKICAgICBpZiAocGZzID09IE5VTEwpIHsKQEAgLTYyMyw2ICs2ODMsMTYgQEAKICAgICB9CiB9CiAKK3ZvaWQgQ29udGV4dDo6c2V0Rm9udChGb250ICpmKQoreworICAgIHJzQXNzZXJ0KG1Jc0dyYXBoaWNzQ29udGV4dCk7CisgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICBtRm9udC5zZXQobVN0YXRlRm9udC5tRGVmYXVsdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUZvbnQuc2V0KGYpOworICAgIH0KK30KKwogdm9pZCBDb250ZXh0Ojphc3NpZ25OYW1lKE9iamVjdEJhc2UgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgbGVuKQogewogICAgIHJzQXNzZXJ0KCFvYmotPmdldE5hbWUoKSk7CkBAIC02NDAsOTAgKzcxMCwxMyBAQAogICAgIH0KIH0KIAotT2JqZWN0QmFzZSAqIENvbnRleHQ6Omxvb2t1cE5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QKLXsKLSAgICBmb3Ioc2l6ZV90IGN0PTA7IGN0IDwgbU5hbWVzLnNpemUoKTsgY3QrKykgewotICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCBtTmFtZXNbY3RdLT5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU5hbWVzW2N0XTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBDb250ZXh0OjphcHBlbmROYW1lRGVmaW5lcyhTdHJpbmc4ICpzdHIpIGNvbnN0Ci17Ci0gICAgY2hhciBidWZbMjU2XTsKLSAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IG1OYW1lcy5zaXplKCk7IGN0KyspIHsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgTkFNRURfIik7Ci0gICAgICAgIHN0ci0+YXBwZW5kKG1OYW1lc1tjdF0tPmdldE5hbWUoKSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHNwcmludGYoYnVmLCAiJWlcbiIsIChpbnQpbU5hbWVzW2N0XSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKGJ1Zik7Ci0gICAgfQotfQotCi1ib29sIENvbnRleHQ6Om9iakRlc3Ryb3lPT0JJbml0KCkKLXsKLSAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZtT2JqRGVzdHJveS5tTXV0ZXgsIE5VTEwpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiQ29udGV4dDo6T2JqRGVzdHJveU9PQkluaXQgbXV0ZXggaW5pdCBmYWlsdXJlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ29udGV4dDo6b2JqRGVzdHJveU9PQlJ1bigpCi17Ci0gICAgaWYgKG1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSkgewotICAgICAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtT2JqRGVzdHJveS5tTXV0ZXgpOwotICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CUnVuOiBlcnJvciAlaSBsb2NraW5nIGZvciBPT0JSdW4uIiwgc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoc2l6ZV90IGN0ID0gMDsgY3QgPCBtT2JqRGVzdHJveS5tRGVzdHJveUxpc3Quc2l6ZSgpOyBjdCsrKSB7Ci0gICAgICAgICAgICBtT2JqRGVzdHJveS5tRGVzdHJveUxpc3RbY3RdLT5kZWNVc2VyUmVmKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbU9iakRlc3Ryb3kubURlc3Ryb3lMaXN0LmNsZWFyKCk7Ci0gICAgICAgIG1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSA9IGZhbHNlOwotCi0gICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtT2JqRGVzdHJveS5tTXV0ZXgpOwotICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CUnVuOiBlcnJvciAlaSB1bmxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBDb250ZXh0OjpvYmpEZXN0cm95T09CRGVzdHJveSgpCi17Ci0gICAgcnNBc3NlcnQoIW1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSk7Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtT2JqRGVzdHJveS5tTXV0ZXgpOwotfQotCi12b2lkIENvbnRleHQ6Om9iakRlc3Ryb3lBZGQoT2JqZWN0QmFzZSAqb2JqKQotewotICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CUnVuOiBlcnJvciAlaSBsb2NraW5nIGZvciBPT0JSdW4uIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSA9IHRydWU7Ci0gICAgbU9iakRlc3Ryb3kubURlc3Ryb3lMaXN0LmFkZChvYmopOwotCi0gICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CUnVuOiBlcnJvciAlaSB1bmxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICB9Ci19Ci0KIHVpbnQzMl90IENvbnRleHQ6OmdldE1lc3NhZ2VUb0NsaWVudCh2b2lkICpkYXRhLCBzaXplX3QgKnJlY2VpdmVMZW4sIHNpemVfdCBidWZmZXJMZW4sIGJvb2wgd2FpdCkKIHsKICAgICAvL0xPR0UoImdldE1lc3NhZ2VUb0NsaWVudCAlaSAlaSIsIGJ1ZmZlckxlbiwgd2FpdCk7CisgICAgKnJlY2VpdmVMZW4gPSAwOwogICAgIGlmICghd2FpdCkgewogICAgICAgICBpZiAobUlPLm1Ub0NsaWVudC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIC8vIE5vIG1lc3NhZ2UgdG8gZ2V0IGFuZCBub3QgZ29pbmcgdG8gd2FpdCBmb3Igb25lLgotICAgICAgICAgICAgcmVjZWl2ZUxlbiA9IDA7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgIH0KQEAgLTc1MSwxNSArNzQ0LDE5IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCF3YWl0Rm9yU3BhY2UpIHsKLSAgICAgICAgaWYgKG1JTy5tVG9DbGllbnQuZ2V0RnJlZVNwYWNlKCkgPCBsZW4pIHsKKyAgICAgICAgaWYgKCFtSU8ubVRvQ2xpZW50Lm1ha2VTcGFjZU5vbkJsb2NraW5nKGxlbiArIDgpKSB7CiAgICAgICAgICAgICAvLyBOb3QgZW5vdWdoIHJvb20sIGFuZCBub3Qgd2FpdGluZy4KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICAvL0xPR0UoInNlbmRNZXNzYWdlVG9DbGllbnQgMiIpOwotICAgIHZvaWQgKnAgPSBtSU8ubVRvQ2xpZW50LnJlc2VydmUobGVuKTsKLSAgICBtZW1jcHkocCwgZGF0YSwgbGVuKTsKLSAgICBtSU8ubVRvQ2xpZW50LmNvbW1pdChjbWRJRCwgbGVuKTsKKyAgICBpZiAobGVuID4gMCkgeworICAgICAgICB2b2lkICpwID0gbUlPLm1Ub0NsaWVudC5yZXNlcnZlKGxlbik7CisgICAgICAgIG1lbWNweShwLCBkYXRhLCBsZW4pOworICAgICAgICBtSU8ubVRvQ2xpZW50LmNvbW1pdChjbWRJRCwgbGVuKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSU8ubVRvQ2xpZW50LmNvbW1pdChjbWRJRCwgMCk7CisgICAgfQogICAgIC8vTE9HRSgic2VuZE1lc3NhZ2VUb0NsaWVudCAzIik7CiAgICAgcmV0dXJuIHRydWU7CiB9CkBAIC03OTksOCArNzk2LDcgQEAKICAgICBMT0dFKCJSUyBDb250ZXh0IGRlYnVnIik7CiAKICAgICBMT0dFKCIgRUdMIHZlciAlaSAlaSIsIG1FR0wubU1ham9yVmVyc2lvbiwgbUVHTC5tTWlub3JWZXJzaW9uKTsKLSAgICBMT0dFKCIgRUdMIGNvbnRleHQgJXAgIHN1cmZhY2UgJXAsICB3PSVpIGg9JWkgIERpc3BsYXk9JXAiLCBtRUdMLm1Db250ZXh0LAotICAgICAgICAgbUVHTC5tU3VyZmFjZSwgbUVHTC5tV2lkdGgsIG1FR0wubUhlaWdodCwgbUVHTC5tRGlzcGxheSk7CisgICAgTE9HRSgiIEVHTCBjb250ZXh0ICVwICBzdXJmYWNlICVwLCAgRGlzcGxheT0lcCIsIG1FR0wubUNvbnRleHQsIG1FR0wubVN1cmZhY2UsIG1FR0wubURpc3BsYXkpOwogICAgIExPR0UoIiBHTCB2ZW5kb3I6ICVzIiwgbUdMLm1WZW5kb3IpOwogICAgIExPR0UoIiBHTCByZW5kZXJlcjogJXMiLCBtR0wubVJlbmRlcmVyKTsKICAgICBMT0dFKCIgR0wgVmVyc2lvbjogJXMiLCBtR0wubVZlcnNpb24pOwpAQCAtODIyLDYgKzgxOCw5IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIAordm9pZCByc2lfQ29udGV4dEZpbmlzaChDb250ZXh0ICpyc2MpCit7Cit9CiAKIHZvaWQgcnNpX0NvbnRleHRCaW5kUm9vdFNjcmlwdChDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzKQogewpAQCAtODQxLDkgKzg0MCw5IEBACiAgICAgcy0+YmluZFRvQ29udGV4dCgmcnNjLT5tU3RhdGVTYW1wbGVyLCBzbG90KTsKIH0KIAotdm9pZCByc2lfQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShDb250ZXh0ICpyc2MsIFJzUHJvZ3JhbUZyYWdtZW50U3RvcmUgdnBmcykKK3ZvaWQgcnNpX0NvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKENvbnRleHQgKnJzYywgUnNQcm9ncmFtU3RvcmUgdnBmcykKIHsKLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZSAqcGZzID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbUZyYWdtZW50U3RvcmUgKj4odnBmcyk7CisgICAgUHJvZ3JhbVN0b3JlICpwZnMgPSBzdGF0aWNfY2FzdDxQcm9ncmFtU3RvcmUgKj4odnBmcyk7CiAgICAgcnNjLT5zZXRGcmFnbWVudFN0b3JlKHBmcyk7CiB9CiAKQEAgLTg2NSwxMiArODY0LDI0IEBACiAgICAgcnNjLT5zZXRWZXJ0ZXgocHYpOwogfQogCit2b2lkIHJzaV9Db250ZXh0QmluZEZvbnQoQ29udGV4dCAqcnNjLCBSc0ZvbnQgdmZvbnQpCit7CisgICAgRm9udCAqZm9udCA9IHN0YXRpY19jYXN0PEZvbnQgKj4odmZvbnQpOworICAgIHJzYy0+c2V0Rm9udChmb250KTsKK30KKwogdm9pZCByc2lfQXNzaWduTmFtZShDb250ZXh0ICpyc2MsIHZvaWQgKiBvYmosIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGxlbikKIHsKICAgICBPYmplY3RCYXNlICpvYiA9IHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKj4ob2JqKTsKICAgICByc2MtPmFzc2lnbk5hbWUob2IsIG5hbWUsIGxlbik7CiB9CiAKK3ZvaWQgcnNpX0dldE5hbWUoQ29udGV4dCAqcnNjLCB2b2lkICogb2JqLCBjb25zdCBjaGFyICoqbmFtZSkKK3sKKyAgICBPYmplY3RCYXNlICpvYiA9IHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKj4ob2JqKTsKKyAgICAoKm5hbWUpID0gb2ItPmdldE5hbWUoKTsKK30KKwogdm9pZCByc2lfT2JqRGVzdHJveShDb250ZXh0ICpyc2MsIHZvaWQgKm9iaikKIHsKICAgICBPYmplY3RCYXNlICpvYiA9IHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKj4ob2JqKTsKQEAgLTkzOCwxMiArOTQ5LDYgQEAKICAgICBkZWxldGUgcnNjOwogfQogCi12b2lkIHJzT2JqRGVzdHJveU9PQihSc0NvbnRleHQgdnJzYywgdm9pZCAqb2JqKQotewotICAgIENvbnRleHQgKiByc2MgPSBzdGF0aWNfY2FzdDxDb250ZXh0ICo+KHZyc2MpOwotICAgIHJzYy0+b2JqRGVzdHJveUFkZChzdGF0aWNfY2FzdDxPYmplY3RCYXNlICo+KG9iaikpOwotfQotCiB1aW50MzJfdCByc0NvbnRleHRHZXRNZXNzYWdlKFJzQ29udGV4dCB2cnNjLCB2b2lkICpkYXRhLCBzaXplX3QgKnJlY2VpdmVMZW4sIHNpemVfdCBidWZmZXJMZW4sIGJvb2wgd2FpdCkKIHsKICAgICBDb250ZXh0ICogcnNjID0gc3RhdGljX2Nhc3Q8Q29udGV4dCAqPih2cnNjKTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNDb250ZXh0LmggYi9saWJzL3JzL3JzQ29udGV4dC5oCmluZGV4IDcwOTczMGUuLjZkMWE0MWQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNDb250ZXh0LmgKKysrIGIvbGlicy9ycy9yc0NvbnRleHQuaApAQCAtMTgsMTIgKzE4LDEyIEBACiAjZGVmaW5lIEFORFJPSURfUlNfQ09OVEVYVF9ICiAKICNpbmNsdWRlICJyc1V0aWxzLmgiCisjaW5jbHVkZSAicnNNdXRleC5oIgogCiAjaW5jbHVkZSAicnNUaHJlYWRJTy5oIgogI2luY2x1ZGUgInJzVHlwZS5oIgogI2luY2x1ZGUgInJzTWF0cml4LmgiCiAjaW5jbHVkZSAicnNBbGxvY2F0aW9uLmgiCi0jaW5jbHVkZSAicnNTaW1wbGVNZXNoLmgiCiAjaW5jbHVkZSAicnNNZXNoLmgiCiAjaW5jbHVkZSAicnNEZXZpY2UuaCIKICNpbmNsdWRlICJyc1NjcmlwdEMuaCIKQEAgLTMxLDggKzMxLDkgQEAKICNpbmNsdWRlICJyc0FkYXB0ZXIuaCIKICNpbmNsdWRlICJyc1NhbXBsZXIuaCIKICNpbmNsdWRlICJyc0xpZ2h0LmgiCisjaW5jbHVkZSAicnNGb250LmgiCiAjaW5jbHVkZSAicnNQcm9ncmFtRnJhZ21lbnQuaCIKLSNpbmNsdWRlICJyc1Byb2dyYW1GcmFnbWVudFN0b3JlLmgiCisjaW5jbHVkZSAicnNQcm9ncmFtU3RvcmUuaCIKICNpbmNsdWRlICJyc1Byb2dyYW1SYXN0ZXIuaCIKICNpbmNsdWRlICJyc1Byb2dyYW1WZXJ0ZXguaCIKICNpbmNsdWRlICJyc1NoYWRlckNhY2hlLmgiCkBAIC02NCwxNyArNjUsMTkgQEAKICAgICAgICAgU2NyaXB0ICogbVNjcmlwdDsKICAgICB9OwogCisgICAgdHlwZWRlZiB2b2lkICgqV29ya2VyQ2FsbGJhY2tfdCkodm9pZCAqdXNyLCB1aW50MzJfdCBpZHgpOwogCiAgICAgLy9TdHJ1Y3R1cmVkQWxsb2NhdGlvbkNvbnRleHQgbVN0YXRlQWxsb2NhdGlvbjsKICAgICBFbGVtZW50U3RhdGUgbVN0YXRlRWxlbWVudDsKICAgICBUeXBlU3RhdGUgbVN0YXRlVHlwZTsKICAgICBTYW1wbGVyU3RhdGUgbVN0YXRlU2FtcGxlcjsKICAgICBQcm9ncmFtRnJhZ21lbnRTdGF0ZSBtU3RhdGVGcmFnbWVudDsKLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlIG1TdGF0ZUZyYWdtZW50U3RvcmU7CisgICAgUHJvZ3JhbVN0b3JlU3RhdGUgbVN0YXRlRnJhZ21lbnRTdG9yZTsKICAgICBQcm9ncmFtUmFzdGVyU3RhdGUgbVN0YXRlUmFzdGVyOwogICAgIFByb2dyYW1WZXJ0ZXhTdGF0ZSBtU3RhdGVWZXJ0ZXg7CiAgICAgTGlnaHRTdGF0ZSBtU3RhdGVMaWdodDsKICAgICBWZXJ0ZXhBcnJheVN0YXRlIG1TdGF0ZVZlcnRleEFycmF5OworICAgIEZvbnRTdGF0ZSBtU3RhdGVGb250OwogCiAgICAgU2NyaXB0Q1N0YXRlIG1TY3JpcHRDOwogICAgIFNoYWRlckNhY2hlIG1TaGFkZXJDYWNoZTsKQEAgLTg0LDE0ICs4NywxNiBAQAogICAgIHZvaWQgc2V0UmFzdGVyKFByb2dyYW1SYXN0ZXIgKik7CiAgICAgdm9pZCBzZXRWZXJ0ZXgoUHJvZ3JhbVZlcnRleCAqKTsKICAgICB2b2lkIHNldEZyYWdtZW50KFByb2dyYW1GcmFnbWVudCAqKTsKLSAgICB2b2lkIHNldEZyYWdtZW50U3RvcmUoUHJvZ3JhbUZyYWdtZW50U3RvcmUgKik7CisgICAgdm9pZCBzZXRGcmFnbWVudFN0b3JlKFByb2dyYW1TdG9yZSAqKTsKKyAgICB2b2lkIHNldEZvbnQoRm9udCAqKTsKIAogICAgIHZvaWQgdXBkYXRlU3VyZmFjZSh2b2lkICpzdXIpOwogCiAgICAgY29uc3QgUHJvZ3JhbUZyYWdtZW50ICogZ2V0RnJhZ21lbnQoKSB7cmV0dXJuIG1GcmFnbWVudC5nZXQoKTt9Ci0gICAgY29uc3QgUHJvZ3JhbUZyYWdtZW50U3RvcmUgKiBnZXRGcmFnbWVudFN0b3JlKCkge3JldHVybiBtRnJhZ21lbnRTdG9yZS5nZXQoKTt9CisgICAgY29uc3QgUHJvZ3JhbVN0b3JlICogZ2V0RnJhZ21lbnRTdG9yZSgpIHtyZXR1cm4gbUZyYWdtZW50U3RvcmUuZ2V0KCk7fQogICAgIGNvbnN0IFByb2dyYW1SYXN0ZXIgKiBnZXRSYXN0ZXIoKSB7cmV0dXJuIG1SYXN0ZXIuZ2V0KCk7fQogICAgIGNvbnN0IFByb2dyYW1WZXJ0ZXggKiBnZXRWZXJ0ZXgoKSB7cmV0dXJuIG1WZXJ0ZXguZ2V0KCk7fQorICAgIEZvbnQgKiBnZXRGb250KCkge3JldHVybiBtRm9udC5nZXQoKTt9CiAKICAgICBib29sIHNldHVwQ2hlY2soKTsKICAgICBib29sIGNoZWNrRHJpdmVyKCkgY29uc3Qge3JldHVybiBtRUdMLm1TdXJmYWNlICE9IDA7fQpAQCAtMTAzLDEyICsxMDgsMTAgQEAKIAogICAgIHZvaWQgYXNzaWduTmFtZShPYmplY3RCYXNlICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGxlbik7CiAgICAgdm9pZCByZW1vdmVOYW1lKE9iamVjdEJhc2UgKm9iaik7Ci0gICAgT2JqZWN0QmFzZSAqIGxvb2t1cE5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7Ci0gICAgdm9pZCBhcHBlbmROYW1lRGVmaW5lcyhTdHJpbmc4ICpzdHIpIGNvbnN0OwogCiAgICAgdWludDMyX3QgZ2V0TWVzc2FnZVRvQ2xpZW50KHZvaWQgKmRhdGEsIHNpemVfdCAqcmVjZWl2ZUxlbiwgc2l6ZV90IGJ1ZmZlckxlbiwgYm9vbCB3YWl0KTsKICAgICBib29sIHNlbmRNZXNzYWdlVG9DbGllbnQodm9pZCAqZGF0YSwgdWludDMyX3QgY21kSUQsIHNpemVfdCBsZW4sIGJvb2wgd2FpdEZvclNwYWNlKTsKLSAgICB1aW50MzJfdCBydW5TY3JpcHQoU2NyaXB0ICpzLCB1aW50MzJfdCBsYXVuY2hJRCk7CisgICAgdWludDMyX3QgcnVuU2NyaXB0KFNjcmlwdCAqcyk7CiAKICAgICB2b2lkIGluaXRUb0NsaWVudCgpOwogICAgIHZvaWQgZGVpbml0VG9DbGllbnQoKTsKQEAgLTExOSwxOSArMTIyLDIxIEBACiAgICAgUHJvZ3JhbVZlcnRleCAqIGdldERlZmF1bHRQcm9ncmFtVmVydGV4KCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVN0YXRlVmVydGV4Lm1EZWZhdWx0LmdldCgpOwogICAgIH0KLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZSAqIGdldERlZmF1bHRQcm9ncmFtRnJhZ21lbnRTdG9yZSgpIGNvbnN0IHsKKyAgICBQcm9ncmFtU3RvcmUgKiBnZXREZWZhdWx0UHJvZ3JhbVN0b3JlKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVN0YXRlRnJhZ21lbnRTdG9yZS5tRGVmYXVsdC5nZXQoKTsKICAgICB9CiAgICAgUHJvZ3JhbVJhc3RlciAqIGdldERlZmF1bHRQcm9ncmFtUmFzdGVyKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVN0YXRlUmFzdGVyLm1EZWZhdWx0LmdldCgpOwogICAgIH0KKyAgICBGb250KiBnZXREZWZhdWx0Rm9udCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdGF0ZUZvbnQubURlZmF1bHQuZ2V0KCk7CisgICAgfQogCi0gICAgdWludDMyX3QgZ2V0V2lkdGgoKSBjb25zdCB7cmV0dXJuIG1FR0wubVdpZHRoO30KLSAgICB1aW50MzJfdCBnZXRIZWlnaHQoKSBjb25zdCB7cmV0dXJuIG1FR0wubUhlaWdodDt9CisgICAgdWludDMyX3QgZ2V0V2lkdGgoKSBjb25zdCB7cmV0dXJuIG1XaWR0aDt9CisgICAgdWludDMyX3QgZ2V0SGVpZ2h0KCkgY29uc3Qge3JldHVybiBtSGVpZ2h0O30KIAogCiAgICAgVGhyZWFkSU8gbUlPOwotICAgIHZvaWQgb2JqRGVzdHJveUFkZChPYmplY3RCYXNlICopOwogCiAgICAgLy8gVGltZXJzCiAgICAgZW51bSBUaW1lcnMgewpAQCAtMTU2LDE3ICsxNjEsMjEgQEAKICAgICAgICAgYm9vbCBtTG9nU2NyaXB0czsKICAgICAgICAgYm9vbCBtTG9nT2JqZWN0czsKICAgICAgICAgYm9vbCBtTG9nU2hhZGVyczsKKyAgICAgICAgYm9vbCBtTG9nVmlzdWFsOwogICAgIH0gcHJvcHM7CiAKICAgICB2b2lkIGR1bXBEZWJ1ZygpIGNvbnN0OwogICAgIHZvaWQgY2hlY2tFcnJvcihjb25zdCBjaGFyICopIGNvbnN0OwogICAgIGNvbnN0IGNoYXIgKiBnZXRFcnJvcihSc0Vycm9yICopOwotICAgIHZvaWQgc2V0RXJyb3IoUnNFcnJvciBlLCBjb25zdCBjaGFyICptc2cpOworICAgIHZvaWQgc2V0RXJyb3IoUnNFcnJvciBlLCBjb25zdCBjaGFyICptc2cgPSBOVUxMKTsKIAogICAgIG11dGFibGUgY29uc3QgT2JqZWN0QmFzZSAqIG1PYmpIZWFkOwogCiAgICAgYm9vbCBleHRfT0VTX3RleHR1cmVfbnBvdCgpIGNvbnN0IHtyZXR1cm4gbUdMLk9FU190ZXh0dXJlX25wb3Q7fQogCisgICAgdm9pZCBsYXVuY2hUaHJlYWRzKFdvcmtlckNhbGxiYWNrX3QgY2JrLCB2b2lkICpkYXRhKTsKKyAgICB1aW50MzJfdCBnZXRXb3JrZXJQb29sU2l6ZSgpIGNvbnN0IHtyZXR1cm4gKHVpbnQzMl90KW1Xb3JrZXJzLm1SdW5uaW5nQ291bnQ7fQorCiBwcm90ZWN0ZWQ6CiAgICAgRGV2aWNlICptRGV2OwogCkBAIC0xNzcsOCArMTg2LDYgQEAKICAgICAgICAgRUdMQ29uZmlnIG1Db25maWc7CiAgICAgICAgIEVHTENvbnRleHQgbUNvbnRleHQ7CiAgICAgICAgIEVHTFN1cmZhY2UgbVN1cmZhY2U7Ci0gICAgICAgIEVHTGludCBtV2lkdGg7Ci0gICAgICAgIEVHTGludCBtSGVpZ2h0OwogICAgICAgICBFR0xEaXNwbGF5IG1EaXNwbGF5OwogICAgIH0gbUVHTDsKIApAQCAtMjE5LDIyICsyMjYsMjggQEAKICAgICBwdGhyZWFkX3QgbVRocmVhZElkOwogICAgIHBpZF90IG1OYXRpdmVUaHJlYWRJZDsKIAorICAgIHN0cnVjdCBXb3JrZXJzIHsKKyAgICAgICAgdm9sYXRpbGUgaW50IG1SdW5uaW5nQ291bnQ7CisgICAgICAgIHZvbGF0aWxlIGludCBtTGF1bmNoQ291bnQ7CisgICAgICAgIHVpbnQzMl90IG1Db3VudDsKKyAgICAgICAgcHRocmVhZF90ICptVGhyZWFkSWQ7CisgICAgICAgIHBpZF90ICptTmF0aXZlVGhyZWFkSWQ7CisgICAgICAgIFNpZ25hbCBtQ29tcGxldGVTaWduYWw7CisKKyAgICAgICAgU2lnbmFsICptTGF1bmNoU2lnbmFsczsKKyAgICAgICAgV29ya2VyQ2FsbGJhY2tfdCBtTGF1bmNoQ2FsbGJhY2s7CisgICAgICAgIHZvaWQgKm1MYXVuY2hEYXRhOworICAgIH07CisgICAgV29ya2VycyBtV29ya2VyczsKKwogICAgIE9iamVjdEJhc2VSZWY8U2NyaXB0PiBtUm9vdFNjcmlwdDsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudD4gbUZyYWdtZW50OwogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVZlcnRleD4gbVZlcnRleDsKLSAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudFN0b3JlPiBtRnJhZ21lbnRTdG9yZTsKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbUZyYWdtZW50U3RvcmU7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtUmFzdGVyPiBtUmFzdGVyOworICAgIE9iamVjdEJhc2VSZWY8Rm9udD4gbUZvbnQ7CiAKLQotICAgIHN0cnVjdCBPYmpEZXN0cm95T09CIHsKLSAgICAgICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKLSAgICAgICAgVmVjdG9yPE9iamVjdEJhc2UgKj4gbURlc3Ryb3lMaXN0OwotICAgICAgICBib29sIG1OZWVkVG9FbXB0eTsKLSAgICB9OwotICAgIE9iakRlc3Ryb3lPT0IgbU9iakRlc3Ryb3k7Ci0gICAgYm9vbCBvYmpEZXN0cm95T09CSW5pdCgpOwotICAgIHZvaWQgb2JqRGVzdHJveU9PQlJ1bigpOwotICAgIHZvaWQgb2JqRGVzdHJveU9PQkRlc3Ryb3koKTsKKyAgICB2b2lkIGRpc3BsYXlEZWJ1Z1N0YXRzKCk7CiAKIHByaXZhdGU6CiAgICAgQ29udGV4dCgpOwpAQCAtMjQ1LDYgKzI1OCw3IEBACiAgICAgdWludDMyX3QgcnVuUm9vdFNjcmlwdCgpOwogCiAgICAgc3RhdGljIHZvaWQgKiB0aHJlYWRQcm9jKHZvaWQgKik7CisgICAgc3RhdGljIHZvaWQgKiBoZWxwZXJUaHJlYWRQcm9jKHZvaWQgKik7CiAKICAgICBBTmF0aXZlV2luZG93ICptV25kU3VyZmFjZTsKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbnRleHRIb3N0U3R1Yi5oIGIvbGlicy9ycy9yc0NvbnRleHRIb3N0U3R1Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0Mzc2MDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzQ29udGV4dEhvc3RTdHViLmgKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfQ09OVEVYVF9IT1NUX1NUVUJfSAorI2RlZmluZSBBTkRST0lEX1JTX0NPTlRFWFRfSE9TVF9TVFVCX0gKKworI2luY2x1ZGUgInJzVXRpbHMuaCIKKy8vI2luY2x1ZGUgInJzTXV0ZXguaCIKKworLy8jaW5jbHVkZSAicnNUaHJlYWRJTy5oIgorI2luY2x1ZGUgInJzVHlwZS5oIgorI2luY2x1ZGUgInJzTWF0cml4LmgiCisjaW5jbHVkZSAicnNBbGxvY2F0aW9uLmgiCisjaW5jbHVkZSAicnNNZXNoLmgiCisvLyNpbmNsdWRlICJyc0RldmljZS5oIgorI2luY2x1ZGUgInJzU2NyaXB0Qy5oIgorI2luY2x1ZGUgInJzQWxsb2NhdGlvbi5oIgorI2luY2x1ZGUgInJzQWRhcHRlci5oIgorI2luY2x1ZGUgInJzU2FtcGxlci5oIgorI2luY2x1ZGUgInJzTGlnaHQuaCIKKyNpbmNsdWRlICJyc1Byb2dyYW1GcmFnbWVudC5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbVN0b3JlLmgiCisjaW5jbHVkZSAicnNQcm9ncmFtUmFzdGVyLmgiCisjaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCisjaW5jbHVkZSAicnNTaGFkZXJDYWNoZS5oIgorI2luY2x1ZGUgInJzVmVydGV4QXJyYXkuaCIKKworLy8jaW5jbHVkZSAicnNnQXBpU3RydWN0cy5oIgorLy8jaW5jbHVkZSAicnNMb2NrbGVzc0ZpZm8uaCIKKworLy8jaW5jbHVkZSA8dWkvZWdsL2FuZHJvaWRfbmF0aXZlcy5oPgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK2NsYXNzIERldmljZTsKKworY2xhc3MgQ29udGV4dAoreworcHVibGljOgorICAgIENvbnRleHQoRGV2aWNlICosIGJvb2wgaXNHcmFwaGljcywgYm9vbCB1c2VEZXB0aCkgeworICAgICAgICBtT2JqSGVhZCA9IE5VTEw7CisgICAgfQorICAgIH5Db250ZXh0KCkgeworICAgIH0KKworCisgICAgLy9TdHJ1Y3R1cmVkQWxsb2NhdGlvbkNvbnRleHQgbVN0YXRlQWxsb2NhdGlvbjsKKyAgICBFbGVtZW50U3RhdGUgbVN0YXRlRWxlbWVudDsKKyAgICBUeXBlU3RhdGUgbVN0YXRlVHlwZTsKKyAgICBTYW1wbGVyU3RhdGUgbVN0YXRlU2FtcGxlcjsKKyAgICAvL1Byb2dyYW1GcmFnbWVudFN0YXRlIG1TdGF0ZUZyYWdtZW50OworICAgIFByb2dyYW1TdG9yZVN0YXRlIG1TdGF0ZUZyYWdtZW50U3RvcmU7CisgICAgLy9Qcm9ncmFtUmFzdGVyU3RhdGUgbVN0YXRlUmFzdGVyOworICAgIC8vUHJvZ3JhbVZlcnRleFN0YXRlIG1TdGF0ZVZlcnRleDsKKyAgICBMaWdodFN0YXRlIG1TdGF0ZUxpZ2h0OworICAgIFZlcnRleEFycmF5U3RhdGUgbVN0YXRlVmVydGV4QXJyYXk7CisKKyAgICAvL1NjcmlwdENTdGF0ZSBtU2NyaXB0QzsKKyAgICBTaGFkZXJDYWNoZSBtU2hhZGVyQ2FjaGU7CisKKworICAgIC8vYm9vbCBzZXR1cENoZWNrKCk7CisgICAgYm9vbCBjaGVja0RyaXZlcigpIGNvbnN0IHtyZXR1cm4gZmFsc2U7fQorCisgICAgUHJvZ3JhbUZyYWdtZW50ICogZ2V0RGVmYXVsdFByb2dyYW1GcmFnbWVudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFByb2dyYW1WZXJ0ZXggKiBnZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFByb2dyYW1TdG9yZSAqIGdldERlZmF1bHRQcm9ncmFtU3RvcmUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQcm9ncmFtUmFzdGVyICogZ2V0RGVmYXVsdFByb2dyYW1SYXN0ZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFdpZHRoKCkgY29uc3Qge3JldHVybiAwO30KKyAgICB1aW50MzJfdCBnZXRIZWlnaHQoKSBjb25zdCB7cmV0dXJuIDA7fQorCisgICAgLy8gVGltZXJzCisgICAgZW51bSBUaW1lcnMgeworICAgICAgICBSU19USU1FUl9JRExFLAorICAgICAgICBSU19USU1FUl9JTlRFUk5BTCwKKyAgICAgICAgUlNfVElNRVJfU0NSSVBULAorICAgICAgICBSU19USU1FUl9DTEVBUl9TV0FQLAorICAgICAgICBfUlNfVElNRVJfVE9UQUwKKyAgICB9OworCisgICAgYm9vbCBjaGVja1ZlcnNpb24xXzEoKSBjb25zdCB7cmV0dXJuIGZhbHNlOyB9CisgICAgYm9vbCBjaGVja1ZlcnNpb24yXzAoKSBjb25zdCB7cmV0dXJuIGZhbHNlOyB9CisKKyAgICBzdHJ1Y3QgeworICAgICAgICBib29sIG1Mb2dUaW1lczsKKyAgICAgICAgYm9vbCBtTG9nU2NyaXB0czsKKyAgICAgICAgYm9vbCBtTG9nT2JqZWN0czsKKyAgICAgICAgYm9vbCBtTG9nU2hhZGVyczsKKyAgICB9IHByb3BzOworCisgICAgdm9pZCBkdW1wRGVidWcoKSBjb25zdCB7ICAgIH0KKyAgICB2b2lkIGNoZWNrRXJyb3IoY29uc3QgY2hhciAqKSBjb25zdCB7ICB9OworICAgIHZvaWQgc2V0RXJyb3IoUnNFcnJvciBlLCBjb25zdCBjaGFyICptc2cgPSBOVUxMKSB7ICB9CisKKyAgICBtdXRhYmxlIGNvbnN0IE9iamVjdEJhc2UgKiBtT2JqSGVhZDsKKworICAgIGJvb2wgZXh0X09FU190ZXh0dXJlX25wb3QoKSBjb25zdCB7cmV0dXJuIG1HTC5PRVNfdGV4dHVyZV9ucG90O30KKworcHJvdGVjdGVkOgorCisgICAgc3RydWN0IHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqIG1WZW5kb3I7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBtUmVuZGVyZXI7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBtVmVyc2lvbjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqIG1FeHRlbnNpb25zOworCisgICAgICAgIHVpbnQzMl90IG1NYWpvclZlcnNpb247CisgICAgICAgIHVpbnQzMl90IG1NaW5vclZlcnNpb247CisKKyAgICAgICAgaW50MzJfdCBtTWF4VmFyeWluZ1ZlY3RvcnM7CisgICAgICAgIGludDMyX3QgbU1heFRleHR1cmVJbWFnZVVuaXRzOworCisgICAgICAgIGludDMyX3QgbU1heEZyYWdtZW50VGV4dHVyZUltYWdlVW5pdHM7CisgICAgICAgIGludDMyX3QgbU1heEZyYWdtZW50VW5pZm9ybVZlY3RvcnM7CisKKyAgICAgICAgaW50MzJfdCBtTWF4VmVydGV4QXR0cmliczsKKyAgICAgICAgaW50MzJfdCBtTWF4VmVydGV4VW5pZm9ybVZlY3RvcnM7CisgICAgICAgIGludDMyX3QgbU1heFZlcnRleFRleHR1cmVVbml0czsKKworICAgICAgICBib29sIE9FU190ZXh0dXJlX25wb3Q7CisgICAgfSBtR0w7CisKK307CisKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0RldmljZS5jcHAgYi9saWJzL3JzL3JzRGV2aWNlLmNwcAppbmRleCBiNjcwYWQ0Li5hOTZiMTE0IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzRGV2aWNlLmNwcAorKysgYi9saWJzL3JzL3JzRGV2aWNlLmNwcApAQCAtMTUsNyArMTUsMTEgQEAKICAqLwogCiAjaW5jbHVkZSAicnNEZXZpY2UuaCIKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTMzLDcgKzM3LDcgQEAKIAogdm9pZCBEZXZpY2U6OmFkZENvbnRleHQoQ29udGV4dCAqcnNjKQogewotICAgIG1Db250ZXh0cy5hZGQocnNjKTsKKyAgICBtQ29udGV4dHMucHVzaChyc2MpOwogfQogCiB2b2lkIERldmljZTo6cmVtb3ZlQ29udGV4dChDb250ZXh0ICpyc2MpCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRWxlbWVudC5jcHAgYi9saWJzL3JzL3JzRWxlbWVudC5jcHAKaW5kZXggNjI4OGJjNC4uMjYwMmRkNCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0VsZW1lbnQuY3BwCisrKyBiL2xpYnMvcnMvcnNFbGVtZW50LmNwcApAQCAtMTQsOSArMTQsMTQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJyc0NvbnRleHQuaCIKIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTI5LDYgKzM0LDcgQEAKICAgICBtQWxsb2NMaW5lID0gX19MSU5FX187CiAgICAgbUZpZWxkcyA9IE5VTEw7CiAgICAgbUZpZWxkQ291bnQgPSAwOworICAgIG1IYXNSZWZlcmVuY2UgPSBmYWxzZTsKIH0KIAogCkBAIC00OCw2ICs1NCw3IEBACiAgICAgZGVsZXRlIFtdIG1GaWVsZHM7CiAgICAgbUZpZWxkcyA9IE5VTEw7CiAgICAgbUZpZWxkQ291bnQgPSAwOworICAgIG1IYXNSZWZlcmVuY2UgPSBmYWxzZTsKIH0KIAogc2l6ZV90IEVsZW1lbnQ6OmdldFNpemVCaXRzKCkgY29uc3QKQEAgLTYzLDE1ICs3MCw2IEBACiAgICAgcmV0dXJuIHRvdGFsOwogfQogCi1zaXplX3QgRWxlbWVudDo6Z2V0RmllbGRPZmZzZXRCaXRzKHVpbnQzMl90IGNvbXBvbmVudE51bWJlcikgY29uc3QKLXsKLSAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBjb21wb25lbnROdW1iZXI7IGN0KyspIHsKLSAgICAgICAgb2Zmc2V0ICs9IG1GaWVsZHNbY3RdLmUtPm1CaXRzOwotICAgIH0KLSAgICByZXR1cm4gb2Zmc2V0OwotfQotCiB2b2lkIEVsZW1lbnQ6OmR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3QKIHsKICAgICBPYmplY3RCYXNlOjpkdW1wTE9HVihwcmVmaXgpOwpAQCAtODMsNiArODEsOTggQEAKICAgICB9CiB9CiAKK3ZvaWQgRWxlbWVudDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAvLyBOZWVkIHRvIGlkZW50aWZ5IG91cnNlbHZlcworICAgIHN0cmVhbS0+YWRkVTMyKCh1aW50MzJfdClnZXRDbGFzc0lkKCkpOworCisgICAgU3RyaW5nOCBuYW1lKGdldE5hbWUoKSk7CisgICAgc3RyZWFtLT5hZGRTdHJpbmcoJm5hbWUpOworCisgICAgbUNvbXBvbmVudC5zZXJpYWxpemUoc3RyZWFtKTsKKworICAgIC8vIE5vdyBzZXJpYWxpemUgYWxsIHRoZSBmaWVsZHMKKyAgICBzdHJlYW0tPmFkZFUzMihtRmllbGRDb3VudCk7CisgICAgZm9yKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtRmllbGRDb3VudDsgY3QrKykgeworICAgICAgICBzdHJlYW0tPmFkZFN0cmluZygmbUZpZWxkc1tjdF0ubmFtZSk7CisgICAgICAgIG1GaWVsZHNbY3RdLmUtPnNlcmlhbGl6ZShzdHJlYW0pOworICAgIH0KK30KKworRWxlbWVudCAqRWxlbWVudDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICAvLyBGaXJzdCBtYWtlIHN1cmUgd2UgYXJlIHJlYWRpbmcgdGhlIGNvcnJlY3Qgb2JqZWN0CisgICAgUnNBM0RDbGFzc0lEIGNsYXNzSUQgPSAoUnNBM0RDbGFzc0lEKXN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKGNsYXNzSUQgIT0gUlNfQTNEX0NMQVNTX0lEX0VMRU1FTlQpIHsKKyAgICAgICAgTE9HRSgiZWxlbWVudCBsb2FkaW5nIHNraXBwZWQgZHVlIHRvIGludmFsaWQgY2xhc3MgaWRcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTdHJpbmc4IG5hbWU7CisgICAgc3RyZWFtLT5sb2FkU3RyaW5nKCZuYW1lKTsKKworICAgIEVsZW1lbnQgKmVsZW0gPSBuZXcgRWxlbWVudChyc2MpOworICAgIGVsZW0tPm1Db21wb25lbnQubG9hZEZyb21TdHJlYW0oc3RyZWFtKTsKKyAgICBlbGVtLT5tQml0cyA9IGVsZW0tPm1Db21wb25lbnQuZ2V0Qml0cygpOworICAgIGVsZW0tPm1IYXNSZWZlcmVuY2UgPSBlbGVtLT5tQ29tcG9uZW50LmlzUmVmZXJlbmNlKCk7CisKKyAgICBlbGVtLT5tRmllbGRDb3VudCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKGVsZW0tPm1GaWVsZENvdW50KSB7CisgICAgICAgIHVpbnQzMl90IG9mZnNldCA9IDA7CisgICAgICAgIGVsZW0tPm1GaWVsZHMgPSBuZXcgRWxlbWVudEZpZWxkX3QgW2VsZW0tPm1GaWVsZENvdW50XTsKKyAgICAgICAgZm9yKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBlbGVtLT5tRmllbGRDb3VudDsgY3QgKyspIHsKKyAgICAgICAgICAgIHN0cmVhbS0+bG9hZFN0cmluZygmZWxlbS0+bUZpZWxkc1tjdF0ubmFtZSk7CisgICAgICAgICAgICBFbGVtZW50ICpmaWVsZEVsZW0gPSBFbGVtZW50OjpjcmVhdGVGcm9tU3RyZWFtKHJzYywgc3RyZWFtKTsKKyAgICAgICAgICAgIGVsZW0tPm1GaWVsZHNbY3RdLmUuc2V0KGZpZWxkRWxlbSk7CisgICAgICAgICAgICBlbGVtLT5tRmllbGRzW2N0XS5vZmZzZXRCaXRzID0gb2Zmc2V0OworICAgICAgICAgICAgb2Zmc2V0ICs9IGZpZWxkRWxlbS0+Z2V0U2l6ZUJpdHMoKTsKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIG91ciBzdWItZWxlbWVudHMgaGF2ZSByZWZlcmVuY2VzCisgICAgICAgICAgICBpZihmaWVsZEVsZW0tPm1IYXNSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgICAgICBlbGVtLT5tSGFzUmVmZXJlbmNlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhpcyBhbHJlYWR5IGV4aXN0cworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCByc2MtPm1TdGF0ZUVsZW1lbnQubUVsZW1lbnRzLnNpemUoKTsgY3QrKykgeworICAgICAgICBFbGVtZW50ICplZSA9IHJzYy0+bVN0YXRlRWxlbWVudC5tRWxlbWVudHNbY3RdOworCisgICAgICAgIGlmICghZWUtPmdldEZpZWxkQ291bnQoKSApIHsKKworICAgICAgICAgICAgaWYoKGVlLT5nZXRDb21wb25lbnQoKS5nZXRUeXBlKCkgPT0gZWxlbS0+Z2V0Q29tcG9uZW50KCkuZ2V0VHlwZSgpKSAmJgorICAgICAgICAgICAgICAgKGVlLT5nZXRDb21wb25lbnQoKS5nZXRLaW5kKCkgPT0gZWxlbS0+Z2V0Q29tcG9uZW50KCkuZ2V0S2luZCgpKSAmJgorICAgICAgICAgICAgICAgKGVlLT5nZXRDb21wb25lbnQoKS5nZXRJc05vcm1hbGl6ZWQoKSA9PSBlbGVtLT5nZXRDb21wb25lbnQoKS5nZXRJc05vcm1hbGl6ZWQoKSkgJiYKKyAgICAgICAgICAgICAgIChlZS0+Z2V0Q29tcG9uZW50KCkuZ2V0VmVjdG9yU2l6ZSgpID09IGVsZW0tPmdldENvbXBvbmVudCgpLmdldFZlY3RvclNpemUoKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBNYXRjaAorICAgICAgICAgICAgICAgIGRlbGV0ZSBlbGVtOworICAgICAgICAgICAgICAgIGVlLT5pbmNVc2VyUmVmKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAoZWUtPmdldEZpZWxkQ291bnQoKSA9PSBlbGVtLT5tRmllbGRDb3VudCkgeworCisgICAgICAgICAgICBib29sIG1hdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaT0wOyBpIDwgZWxlbS0+bUZpZWxkQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoZWUtPm1GaWVsZHNbaV0uZS5nZXQoKSAhPSBlbGVtLT5tRmllbGRzW2ldLmUuZ2V0KCkpIHx8CisgICAgICAgICAgICAgICAgICAgIChlZS0+bUZpZWxkc1tpXS5uYW1lLmxlbmd0aCgpICE9IGVsZW0tPm1GaWVsZHNbaV0ubmFtZS5sZW5ndGgoKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGVlLT5tRmllbGRzW2ldLm5hbWUgIT0gZWxlbS0+bUZpZWxkc1tpXS5uYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgZWxlbTsKKyAgICAgICAgICAgICAgICBlZS0+aW5jVXNlclJlZigpOworICAgICAgICAgICAgICAgIHJldHVybiBlZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgcnNjLT5tU3RhdGVFbGVtZW50Lm1FbGVtZW50cy5wdXNoKGVsZW0pOworICAgIHJldHVybiBlbGVtOworfQorCiAKIGNvbnN0IEVsZW1lbnQgKiBFbGVtZW50OjpjcmVhdGUoQ29udGV4dCAqcnNjLCBSc0RhdGFUeXBlIGR0LCBSc0RhdGFLaW5kIGRrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNOb3JtLCB1aW50MzJfdCB2ZWNTaXplKQpAQCAtMTA0LDYgKzE5NCw3IEBACiAgICAgRWxlbWVudCAqZSA9IG5ldyBFbGVtZW50KHJzYyk7CiAgICAgZS0+bUNvbXBvbmVudC5zZXQoZHQsIGRrLCBpc05vcm0sIHZlY1NpemUpOwogICAgIGUtPm1CaXRzID0gZS0+bUNvbXBvbmVudC5nZXRCaXRzKCk7CisgICAgZS0+bUhhc1JlZmVyZW5jZSA9IGUtPm1Db21wb25lbnQuaXNSZWZlcmVuY2UoKTsKICAgICByc2MtPm1TdGF0ZUVsZW1lbnQubUVsZW1lbnRzLnB1c2goZSk7CiAgICAgcmV0dXJuIGU7CiB9CkBAIC0xMzQsNTQgKzIyNSwyMiBAQAogICAgIEVsZW1lbnQgKmUgPSBuZXcgRWxlbWVudChyc2MpOwogICAgIGUtPm1GaWVsZHMgPSBuZXcgRWxlbWVudEZpZWxkX3QgW2NvdW50XTsKICAgICBlLT5tRmllbGRDb3VudCA9IGNvdW50OworICAgIHNpemVfdCBiaXRzID0gMDsKICAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IGNvdW50OyBjdCsrKSB7CiAgICAgICAgIGUtPm1GaWVsZHNbY3RdLmUuc2V0KGVpbltjdF0pOwogICAgICAgICBlLT5tRmllbGRzW2N0XS5uYW1lLnNldFRvKG5pbltjdF0sIGxlbmd0aHNbY3RdKTsKKyAgICAgICAgZS0+bUZpZWxkc1tjdF0ub2Zmc2V0Qml0cyA9IGJpdHM7CisgICAgICAgIGJpdHMgKz0gZWluW2N0XS0+Z2V0U2l6ZUJpdHMoKTsKKworICAgICAgICBpZiAoZWluW2N0XS0+bUhhc1JlZmVyZW5jZSkgeworICAgICAgICAgICAgZS0+bUhhc1JlZmVyZW5jZSA9IHRydWU7CisgICAgICAgIH0KICAgICB9CiAKICAgICByc2MtPm1TdGF0ZUVsZW1lbnQubUVsZW1lbnRzLnB1c2goZSk7CiAgICAgcmV0dXJuIGU7CiB9CiAKLVN0cmluZzggRWxlbWVudDo6Z2V0Q1N0cnVjdEJvZHkodWludDMyX3QgaW5kZW50KSBjb25zdAotewotICAgIFN0cmluZzggc2k7Ci0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IGluZGVudDsgY3QrKykgewotICAgICAgICBzaS5hcHBlbmQoIiAiKTsKLSAgICB9Ci0KLSAgICBTdHJpbmc4IHMoc2kpOwotICAgIHMuYXBwZW5kKCJ7XG4iKTsKLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtRmllbGRDb3VudDsgY3QrKykgewotICAgICAgICBzLmFwcGVuZChzaSk7Ci0gICAgICAgIHMuYXBwZW5kKG1GaWVsZHNbY3RdLmUtPmdldENUeXBlKGluZGVudCs0KSk7Ci0gICAgICAgIHMuYXBwZW5kKCIgIik7Ci0gICAgICAgIHMuYXBwZW5kKG1GaWVsZHNbY3RdLm5hbWUpOwotICAgICAgICBzLmFwcGVuZCgiO1xuIik7Ci0gICAgfQotICAgIHMuYXBwZW5kKHNpKTsKLSAgICBzLmFwcGVuZCgifSIpOwotICAgIHJldHVybiBzOwotfQotCi1TdHJpbmc4IEVsZW1lbnQ6OmdldENUeXBlKHVpbnQzMl90IGluZGVudCkgY29uc3QKLXsKLSAgICBTdHJpbmc4IHM7Ci0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IGluZGVudDsgY3QrKykgewotICAgICAgICBzLmFwcGVuZCgiICIpOwotICAgIH0KLQotICAgIGlmICghbUZpZWxkQ291bnQpIHsKLSAgICAgICAgLy8gQmFzaWMgY29tcG9uZW50LgotICAgICAgICBzLmFwcGVuZChtQ29tcG9uZW50LmdldENUeXBlKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHMuYXBwZW5kKCJzdHJ1Y3QgIik7Ci0gICAgICAgIHMuYXBwZW5kKGdldENTdHJ1Y3RCb2R5KGluZGVudCkpOwotICAgIH0KLQotICAgIHJldHVybiBzOwotfQotCiBTdHJpbmc4IEVsZW1lbnQ6OmdldEdMU0xUeXBlKHVpbnQzMl90IGluZGVudCkgY29uc3QKIHsKICAgICBTdHJpbmc4IHM7CkBAIC0yMDEsNiArMjYwLDQzIEBACiAgICAgcmV0dXJuIHM7CiB9CiAKK3ZvaWQgRWxlbWVudDo6aW5jUmVmcyhjb25zdCB2b2lkICpwdHIpIGNvbnN0Cit7CisgICAgaWYgKCFtRmllbGRDb3VudCkgeworICAgICAgICBpZiAobUNvbXBvbmVudC5pc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICBPYmplY3RCYXNlICpjb25zdCpvYnAgPSBzdGF0aWNfY2FzdDxPYmplY3RCYXNlICpjb25zdCo+KHB0cik7CisgICAgICAgICAgICBPYmplY3RCYXNlICpvYiA9IG9icFswXTsKKyAgICAgICAgICAgIGlmIChvYikgb2ItPmluY1N5c1JlZigpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpwID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCAqPihwdHIpOworICAgIGZvciAodWludDMyX3QgaT0wOyBpIDwgbUZpZWxkQ291bnQ7IGkrKykgeworICAgICAgICBpZiAobUZpZWxkc1tpXS5lLT5tSGFzUmVmZXJlbmNlKSB7CisgICAgICAgICAgICBtRmllbGRzW2ldLmUtPmluY1JlZnMoJnBbbUZpZWxkc1tpXS5vZmZzZXRCaXRzID4+IDNdKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBFbGVtZW50OjpkZWNSZWZzKGNvbnN0IHZvaWQgKnB0cikgY29uc3QKK3sKKyAgICBpZiAoIW1GaWVsZENvdW50KSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50LmlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIE9iamVjdEJhc2UgKmNvbnN0Km9icCA9IHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKmNvbnN0Kj4ocHRyKTsKKyAgICAgICAgICAgIE9iamVjdEJhc2UgKm9iID0gb2JwWzBdOworICAgICAgICAgICAgaWYgKG9iKSBvYi0+ZGVjU3lzUmVmKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90ICo+KHB0cik7CisgICAgZm9yICh1aW50MzJfdCBpPTA7IGkgPCBtRmllbGRDb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChtRmllbGRzW2ldLmUtPm1IYXNSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIG1GaWVsZHNbaV0uZS0+ZGVjUmVmcygmcFttRmllbGRzW2ldLm9mZnNldEJpdHMgPj4gM10pOworICAgICAgICB9CisgICAgfQorfQogCiAKIEVsZW1lbnRTdGF0ZTo6RWxlbWVudFN0YXRlKCkKQEAgLTI0Myw2ICszMzksMzIgQEAKICAgICByZXR1cm4gKFJzRWxlbWVudCllOwogfQogCit2b2lkIHJzaV9FbGVtZW50R2V0TmF0aXZlRGF0YShDb250ZXh0ICpyc2MsIFJzRWxlbWVudCBlbGVtLCB1aW50MzJfdCAqZWxlbURhdGEsIHVpbnQzMl90IGVsZW1EYXRhU2l6ZSkKK3sKKyAgICByc0Fzc2VydChlbGVtRGF0YVNpemUgPT0gNSk7CisgICAgLy8gd2Ugd2lsbCBwYWNrIG1UeXBlOyBtS2luZDsgbU5vcm1hbGl6ZWQ7IG1WZWN0b3JTaXplOyBOdW1TdWJFbGVtZW50cworICAgIEVsZW1lbnQgKmUgPSBzdGF0aWNfY2FzdDxFbGVtZW50ICo+KGVsZW0pOworCisgICAgKCplbGVtRGF0YSsrKSA9ICh1aW50MzJfdCllLT5nZXRUeXBlKCk7CisgICAgKCplbGVtRGF0YSsrKSA9ICh1aW50MzJfdCllLT5nZXRLaW5kKCk7CisgICAgKCplbGVtRGF0YSsrKSA9IGUtPmdldENvbXBvbmVudCgpLmdldElzTm9ybWFsaXplZCgpID8gMSA6IDA7CisgICAgKCplbGVtRGF0YSsrKSA9IGUtPmdldENvbXBvbmVudCgpLmdldFZlY3RvclNpemUoKTsKKyAgICAoKmVsZW1EYXRhKyspID0gZS0+Z2V0RmllbGRDb3VudCgpOworCit9CisKK3ZvaWQgcnNpX0VsZW1lbnRHZXRTdWJFbGVtZW50cyhDb250ZXh0ICpyc2MsIFJzRWxlbWVudCBlbGVtLCB1aW50MzJfdCAqaWRzLCBjb25zdCBjaGFyICoqbmFtZXMsIHVpbnQzMl90IGRhdGFTaXplKQoreworICAgIEVsZW1lbnQgKmUgPSBzdGF0aWNfY2FzdDxFbGVtZW50ICo+KGVsZW0pOworICAgIHJzQXNzZXJ0KGUtPmdldEZpZWxkQ291bnQoKSA9PSBkYXRhU2l6ZSk7CisKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBkYXRhU2l6ZTsgaSArKykgeworICAgICAgICBpZHNbaV0gPSAodWludDMyX3QpZS0+Z2V0RmllbGQoaSk7CisgICAgICAgIG5hbWVzW2ldID0gZS0+Z2V0RmllbGROYW1lKGkpOworICAgIH0KKworfQorCiAKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNFbGVtZW50LmggYi9saWJzL3JzL3JzRWxlbWVudC5oCmluZGV4IDAyYTFjYTIuLmI1ZGFkN2EyIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzRWxlbWVudC5oCisrKyBiL2xpYnMvcnMvcnNFbGVtZW50LmgKQEAgLTQwLDkgKzQwLDExIEBACiAgICAgICAgIHJldHVybiAoZ2V0U2l6ZUJpdHMoKSArIDcpID4+IDM7CiAgICAgfQogCi0gICAgc2l6ZV90IGdldEZpZWxkT2Zmc2V0Qml0cyh1aW50MzJfdCBjb21wb25lbnROdW1iZXIpIGNvbnN0OworICAgIHNpemVfdCBnZXRGaWVsZE9mZnNldEJpdHModWludDMyX3QgY29tcG9uZW50TnVtYmVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRmllbGRzW2NvbXBvbmVudE51bWJlcl0ub2Zmc2V0Qml0czsKKyAgICB9CiAgICAgc2l6ZV90IGdldEZpZWxkT2Zmc2V0Qnl0ZXModWludDMyX3QgY29tcG9uZW50TnVtYmVyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAoZ2V0RmllbGRPZmZzZXRCaXRzKGNvbXBvbmVudE51bWJlcikgKyA3KSA+PiAzOworICAgICAgICByZXR1cm4gbUZpZWxkc1tjb21wb25lbnROdW1iZXJdLm9mZnNldEJpdHMgPj4gMzsKICAgICB9CiAKICAgICB1aW50MzJfdCBnZXRGaWVsZENvdW50KCkgY29uc3Qge3JldHVybiBtRmllbGRDb3VudDt9CkBAIC01NCwxNyArNTYsMjIgQEAKICAgICBSc0RhdGFLaW5kIGdldEtpbmQoKSBjb25zdCB7cmV0dXJuIG1Db21wb25lbnQuZ2V0S2luZCgpO30KICAgICB1aW50MzJfdCBnZXRCaXRzKCkgY29uc3Qge3JldHVybiBtQml0czt9CiAKLSAgICBTdHJpbmc4IGdldENUeXBlKHVpbnQzMl90IGluZGVudD0wKSBjb25zdDsKLSAgICBTdHJpbmc4IGdldENTdHJ1Y3RCb2R5KHVpbnQzMl90IGluZGVudD0wKSBjb25zdDsKICAgICBTdHJpbmc4IGdldEdMU0xUeXBlKHVpbnQzMl90IGluZGVudD0wKSBjb25zdDsKIAogICAgIHZvaWQgZHVtcExPR1YoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9FTEVNRU5UOyB9CisgICAgc3RhdGljIEVsZW1lbnQgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOwogCiAgICAgc3RhdGljIGNvbnN0IEVsZW1lbnQgKiBjcmVhdGUoQ29udGV4dCAqcnNjLCBSc0RhdGFUeXBlIGR0LCBSc0RhdGFLaW5kIGRrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNOb3JtLCB1aW50MzJfdCB2ZWNTaXplKTsKICAgICBzdGF0aWMgY29uc3QgRWxlbWVudCAqIGNyZWF0ZShDb250ZXh0ICpyc2MsIHNpemVfdCBjb3VudCwgY29uc3QgRWxlbWVudCAqKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqLCBjb25zdCBzaXplX3QgKiBsZW5ndGhzKTsKIAorICAgIHZvaWQgaW5jUmVmcyhjb25zdCB2b2lkICopIGNvbnN0OworICAgIHZvaWQgZGVjUmVmcyhjb25zdCB2b2lkICopIGNvbnN0OworICAgIGJvb2wgZ2V0SGFzUmVmZXJlbmNlcygpIGNvbnN0IHtyZXR1cm4gbUhhc1JlZmVyZW5jZTt9CisKIHByb3RlY3RlZDoKICAgICAvLyBkZWFsbG9jYXRlIGFueSBjb21wb25lbnRzIHRoYXQgYXJlIHBhcnQgb2YgdGhpcyBlbGVtZW50LgogICAgIHZvaWQgY2xlYXIoKTsKQEAgLTcyLDkgKzc5LDExIEBACiAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICBTdHJpbmc4IG5hbWU7CiAgICAgICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgRWxlbWVudD4gZTsKKyAgICAgICAgdWludDMyX3Qgb2Zmc2V0Qml0czsKICAgICB9IEVsZW1lbnRGaWVsZF90OwogICAgIEVsZW1lbnRGaWVsZF90ICptRmllbGRzOwogICAgIHNpemVfdCBtRmllbGRDb3VudDsKKyAgICBib29sIG1IYXNSZWZlcmVuY2U7CiAKIAogICAgIEVsZW1lbnQoQ29udGV4dCAqKTsKQEAgLTkwLDcgKzk5LDcgQEAKICAgICB+RWxlbWVudFN0YXRlKCk7CiAKICAgICAvLyBDYWNoZSBvZiBhbGwgZXhpc3RpbmcgZWxlbWVudHMuCi0gICAgVmVjdG9yPGNvbnN0IEVsZW1lbnQgKj4gbUVsZW1lbnRzOworICAgIFZlY3RvcjxFbGVtZW50ICo+IG1FbGVtZW50czsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0ZpbGVBM0QuY3BwIGIvbGlicy9ycy9yc0ZpbGVBM0QuY3BwCmluZGV4IGUzMjcyYzUuLjU3MDlmMmEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNGaWxlQTNELmNwcAorKysgYi9saWJzL3JzL3JzRmlsZUEzRC5jcHAKQEAgLTE1LDI5ICsxNSwxNTYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2VuZGlmCiAKLQotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlICJyc0ZpbGVBM0QuaCIKIAogI2luY2x1ZGUgInJzTWVzaC5oIgorI2luY2x1ZGUgInJzQW5pbWF0aW9uLmgiCisKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwogCi0KLQotRmlsZUEzRDo6RmlsZUEzRCgpCitGaWxlQTNEOjpGaWxlQTNEKENvbnRleHQgKnJzYykgOiBPYmplY3RCYXNlKHJzYykKIHsKLSAgICBtUnNjID0gTlVMTDsKKyAgICBtQWxsb2MgPSBOVUxMOworICAgIG1EYXRhID0gTlVMTDsKKyAgICBtV3JpdGVTdHJlYW0gPSBOVUxMOworICAgIG1SZWFkU3RyZWFtID0gTlVMTDsKKworICAgIG1NYWpvclZlcnNpb24gPSAwOworICAgIG1NaW5vclZlcnNpb24gPSAxOworICAgIG1EYXRhU2l6ZSA9IDA7CiB9CiAKIEZpbGVBM0Q6On5GaWxlQTNEKCkKIHsKKyAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgbUluZGV4LnNpemUoKTsgaSArKykgeworICAgICAgICBkZWxldGUgbUluZGV4W2ldOworICAgIH0KKyAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgbVdyaXRlSW5kZXguc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGRlbGV0ZSBtV3JpdGVJbmRleFtpXTsKKyAgICB9CisgICAgaWYobVdyaXRlU3RyZWFtKSB7CisgICAgICAgIGRlbGV0ZSBtV3JpdGVTdHJlYW07CisgICAgfQorICAgIGlmKG1SZWFkU3RyZWFtKSB7CisgICAgICAgIGRlbGV0ZSBtV3JpdGVTdHJlYW07CisgICAgfQorICAgIGlmKG1BbGxvYykgeworICAgICAgICBmcmVlKG1BbGxvYyk7CisgICAgfQogfQogCi1ib29sIEZpbGVBM0Q6OmxvYWQoQ29udGV4dCAqcnNjLCBGSUxFICpmKQordm9pZCBGaWxlQTNEOjpwYXJzZUhlYWRlcihJU3RyZWFtICpoZWFkZXJTdHJlYW0pCit7CisgICAgbU1ham9yVmVyc2lvbiA9IGhlYWRlclN0cmVhbS0+bG9hZFUzMigpOworICAgIG1NaW5vclZlcnNpb24gPSBoZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICB1aW50MzJfdCBmbGFncyA9IGhlYWRlclN0cmVhbS0+bG9hZFUzMigpOworICAgIG1Vc2U2NEJpdE9mZnNldHMgPSAoZmxhZ3MgJiAxKSAhPSAwOworCisgICAgTE9HRSgiZmlsZSBvcGVuIDY0Yml0ID0gJWkiLCBtVXNlNjRCaXRPZmZzZXRzKTsKKworICAgIHVpbnQzMl90IG51bUluZGV4RW50cmllcyA9IGhlYWRlclN0cmVhbS0+bG9hZFUzMigpOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG51bUluZGV4RW50cmllczsgaSArKykgeworICAgICAgICBBM0RJbmRleEVudHJ5ICplbnRyeSA9IG5ldyBBM0RJbmRleEVudHJ5KCk7CisgICAgICAgIGhlYWRlclN0cmVhbS0+bG9hZFN0cmluZygmZW50cnktPm1PYmplY3ROYW1lKTsKKyAgICAgICAgTE9HRSgiSGVhZGVyIGRhdGEsIGVudHJ5IG5hbWUgPSAlcyIsIGVudHJ5LT5tT2JqZWN0TmFtZS5zdHJpbmcoKSk7CisgICAgICAgIGVudHJ5LT5tVHlwZSA9IChSc0EzRENsYXNzSUQpaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgICAgIGlmKG1Vc2U2NEJpdE9mZnNldHMpeworICAgICAgICAgICAgZW50cnktPm1PZmZzZXQgPSBoZWFkZXJTdHJlYW0tPmxvYWRPZmZzZXQoKTsKKyAgICAgICAgICAgIGVudHJ5LT5tTGVuZ3RoID0gaGVhZGVyU3RyZWFtLT5sb2FkT2Zmc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBlbnRyeS0+bU9mZnNldCA9IGhlYWRlclN0cmVhbS0+bG9hZFUzMigpOworICAgICAgICAgICAgZW50cnktPm1MZW5ndGggPSBoZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgfQorICAgICAgICBlbnRyeS0+bVJzT2JqID0gTlVMTDsKKyAgICAgICAgbUluZGV4LnB1c2goZW50cnkpOworICAgIH0KK30KKworYm9vbCBGaWxlQTNEOjpsb2FkKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCit7CisgICAgTE9HRSgiTG9hZGluZyBkYXRhLiBTaXplOiAldSIsIGxlbmd0aCk7CisgICAgY29uc3QgdWludDhfdCAqbG9jYWxEYXRhID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworCisgICAgc2l6ZV90IGxlbmd0aFJlbWFpbmluZyA9IGxlbmd0aDsKKyAgICBzaXplX3QgbWFnaWNTdHJMZW4gPSAxMjsKKyAgICBpZiAoKGxlbmd0aCA8IG1hZ2ljU3RyTGVuKSB8fAorICAgICAgICBtZW1jbXAoZGF0YSwgIkFuZHJvaWQzRF9mZiIsIG1hZ2ljU3RyTGVuKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbG9jYWxEYXRhICs9IG1hZ2ljU3RyTGVuOworICAgIGxlbmd0aFJlbWFpbmluZyAtPSBtYWdpY1N0ckxlbjsKKworICAgIC8vIE5leHQgd2UgZ2V0IG91ciBoZWFkZXIgc2l6ZQorICAgIHVpbnQ2NF90IGhlYWRlclNpemUgPSAwOworICAgIGlmKGxlbmd0aFJlbWFpbmluZyA8IHNpemVvZihoZWFkZXJTaXplKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbWVtY3B5KCZoZWFkZXJTaXplLCBsb2NhbERhdGEsIHNpemVvZihoZWFkZXJTaXplKSk7CisgICAgbG9jYWxEYXRhICs9IHNpemVvZihoZWFkZXJTaXplKTsKKyAgICBsZW5ndGhSZW1haW5pbmcgLT0gc2l6ZW9mKGhlYWRlclNpemUpOworCisgICAgTE9HRSgiTG9hZGluZyBkYXRhLCBoZWFkZXJTaXplID0gJWxsaSIsIGhlYWRlclNpemUpOworCisgICAgaWYobGVuZ3RoUmVtYWluaW5nIDwgaGVhZGVyU2l6ZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDhfdCAqaGVhZGVyRGF0YSA9ICh1aW50OF90ICopbWFsbG9jKGhlYWRlclNpemUpOworICAgIGlmKCFoZWFkZXJEYXRhKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtZW1jcHkoaGVhZGVyRGF0YSwgbG9jYWxEYXRhLCBoZWFkZXJTaXplKTsKKworICAgIC8vIE5vdyBvcGVuIHRoZSBzdHJlYW0gdG8gcGFyc2UgdGhlIGhlYWRlcgorICAgIElTdHJlYW0gaGVhZGVyU3RyZWFtKGhlYWRlckRhdGEsIGZhbHNlKTsKKyAgICBwYXJzZUhlYWRlcigmaGVhZGVyU3RyZWFtKTsKKworICAgIGZyZWUoaGVhZGVyRGF0YSk7CisKKyAgICBsb2NhbERhdGEgKz0gaGVhZGVyU2l6ZTsKKyAgICBsZW5ndGhSZW1haW5pbmcgLT0gaGVhZGVyU2l6ZTsKKworICAgIGlmKGxlbmd0aFJlbWFpbmluZyA8IHNpemVvZihtRGF0YVNpemUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBSZWFkIHRoZSBzaXplIG9mIHRoZSBkYXRhCisgICAgbWVtY3B5KCZtRGF0YVNpemUsIGxvY2FsRGF0YSwgc2l6ZW9mKG1EYXRhU2l6ZSkpOworICAgIGxvY2FsRGF0YSArPSBzaXplb2YobURhdGFTaXplKTsKKyAgICBsZW5ndGhSZW1haW5pbmcgLT0gc2l6ZW9mKG1EYXRhU2l6ZSk7CisKKyAgICBMT0dFKCJMb2FkaW5nIGRhdGEsIG1EYXRhU2l6ZSA9ICVsbGkiLCBtRGF0YVNpemUpOworCisgICAgaWYobGVuZ3RoUmVtYWluaW5nIDwgbURhdGFTaXplKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBXZSBzaG91bGQga25vdyBlbm91Z2ggdG8gcmVhZCB0aGUgZmlsZSBpbiBhdCB0aGlzIHBvaW50LgorICAgIG1BbGxvYyA9IG1hbGxvYyhtRGF0YVNpemUpOworICAgIGlmICghbUFsbG9jKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbURhdGEgPSAodWludDhfdCAqKW1BbGxvYzsKKyAgICBtZW1jcHkobUFsbG9jLCBsb2NhbERhdGEsIG1EYXRhU2l6ZSk7CisKKyAgICBtUmVhZFN0cmVhbSA9IG5ldyBJU3RyZWFtKG1EYXRhLCBtVXNlNjRCaXRPZmZzZXRzKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEZpbGVBM0Q6OmxvYWQoRklMRSAqZikKIHsKICAgICBjaGFyIG1hZ2ljU3RyaW5nWzEyXTsKICAgICBzaXplX3QgbGVuOwpAQCAtNDksNDcgKzE3NiwzOSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgTE9HRSgiZmlsZSBvcGVuIDIiKTsKLSAgICBsZW4gPSBmcmVhZCgmbU1ham9yVmVyc2lvbiwgMSwgc2l6ZW9mKG1NYWpvclZlcnNpb24pLCBmKTsKLSAgICBpZiAobGVuICE9IHNpemVvZihtTWFqb3JWZXJzaW9uKSkgeworICAgIC8vIE5leHQgdGhpbmcgaXMgdGhlIHNpemUgb2YgdGhlIGhlYWRlcgorICAgIHVpbnQ2NF90IGhlYWRlclNpemUgPSAwOworICAgIGxlbiA9IGZyZWFkKCZoZWFkZXJTaXplLCAxLCBzaXplb2YoaGVhZGVyU2l6ZSksIGYpOworICAgIGlmIChsZW4gIT0gc2l6ZW9mKGhlYWRlclNpemUpIHx8IGhlYWRlclNpemUgPT0gMCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgTE9HRSgiZmlsZSBvcGVuIDMiKTsKLSAgICBsZW4gPSBmcmVhZCgmbU1pbm9yVmVyc2lvbiwgMSwgc2l6ZW9mKG1NaW5vclZlcnNpb24pLCBmKTsKLSAgICBpZiAobGVuICE9IHNpemVvZihtTWlub3JWZXJzaW9uKSkgeworICAgIHVpbnQ4X3QgKmhlYWRlckRhdGEgPSAodWludDhfdCAqKW1hbGxvYyhoZWFkZXJTaXplKTsKKyAgICBpZighaGVhZGVyRGF0YSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgTE9HRSgiZmlsZSBvcGVuIDQiKTsKLSAgICB1aW50MzJfdCBmbGFnczsKLSAgICBsZW4gPSBmcmVhZCgmZmxhZ3MsIDEsIHNpemVvZihmbGFncyksIGYpOwotICAgIGlmIChsZW4gIT0gc2l6ZW9mKGZsYWdzKSkgeworICAgIGxlbiA9IGZyZWFkKGhlYWRlckRhdGEsIDEsIGhlYWRlclNpemUsIGYpOworICAgIGlmIChsZW4gIT0gaGVhZGVyU2l6ZSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIG1Vc2U2NEJpdE9mZnNldHMgPSAoZmxhZ3MgJiAxKSAhPSAwOwogCi0gICAgTE9HRSgiZmlsZSBvcGVuIDY0Yml0ID0gJWkiLCBtVXNlNjRCaXRPZmZzZXRzKTsKKyAgICAvLyBOb3cgb3BlbiB0aGUgc3RyZWFtIHRvIHBhcnNlIHRoZSBoZWFkZXIKKyAgICBJU3RyZWFtIGhlYWRlclN0cmVhbShoZWFkZXJEYXRhLCBmYWxzZSk7CisgICAgcGFyc2VIZWFkZXIoJmhlYWRlclN0cmVhbSk7CiAKLSAgICBpZiAobVVzZTY0Qml0T2Zmc2V0cykgewotICAgICAgICBsZW4gPSBmcmVhZCgmbURhdGFTaXplLCAxLCBzaXplb2YobURhdGFTaXplKSwgZik7Ci0gICAgICAgIGlmIChsZW4gIT0gc2l6ZW9mKG1EYXRhU2l6ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQzMl90IHRtcDsKLSAgICAgICAgbGVuID0gZnJlYWQoJnRtcCwgMSwgc2l6ZW9mKHRtcCksIGYpOwotICAgICAgICBpZiAobGVuICE9IHNpemVvZih0bXApKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbURhdGFTaXplID0gdG1wOworICAgIGZyZWUoaGVhZGVyRGF0YSk7CisKKyAgICAvLyBOZXh0IHRoaW5nIGlzIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIKKyAgICBsZW4gPSBmcmVhZCgmbURhdGFTaXplLCAxLCBzaXplb2YobURhdGFTaXplKSwgZik7CisgICAgaWYgKGxlbiAhPSBzaXplb2YobURhdGFTaXplKSB8fCBtRGF0YVNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgTE9HRSgiZmlsZSBvcGVuIHNpemUgPSAlbGxpIiwgbURhdGFTaXplKTsKIAogICAgIC8vIFdlIHNob3VsZCBrbm93IGVub3VnaCB0byByZWFkIHRoZSBmaWxlIGluIGF0IHRoaXMgcG9pbnQuCi0gICAgZnNlZWsoZiwgU0VFS19TRVQsIDApOwotICAgIG1BbGxvYz0gbWFsbG9jKG1EYXRhU2l6ZSk7CisgICAgbUFsbG9jID0gbWFsbG9jKG1EYXRhU2l6ZSk7CiAgICAgaWYgKCFtQWxsb2MpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTk5LDI4MiArMjE4LDI1NSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgTE9HRSgiZmlsZSBzdGFydCBwcm9jZXNzaW5nIik7Ci0gICAgcmV0dXJuIHByb2Nlc3MocnNjKTsKKyAgICBtUmVhZFN0cmVhbSA9IG5ldyBJU3RyZWFtKG1EYXRhLCBtVXNlNjRCaXRPZmZzZXRzKTsKKworICAgIExPR0UoIkhlYWRlciBpcyByZWFkIGFuIHN0cmVhbSBpbml0aWFsaXplZCIpOworICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIEZpbGVBM0Q6OnByb2Nlc3NJbmRleChDb250ZXh0ICpyc2MsIEEzREluZGV4RW50cnkgKmllKQotewotICAgIGJvb2wgcmV0ID0gZmFsc2U7Ci0gICAgSU8gaW8obURhdGEgKyBpZS0+bU9mZnNldCwgbVVzZTY0Qml0T2Zmc2V0cyk7CitzaXplX3QgRmlsZUEzRDo6Z2V0TnVtSW5kZXhFbnRyaWVzKCkgY29uc3QgeworICAgIHJldHVybiBtSW5kZXguc2l6ZSgpOworfQogCi0gICAgTE9HRSgicHJvY2VzcyBpbmRleCwgdHlwZSAlaSIsIGllLT5tVHlwZSk7Ci0KLSAgICBzd2l0Y2goaWUtPm1UeXBlKSB7Ci0gICAgY2FzZSBDSFVOS19FTEVNRU5UOgotICAgICAgICBwcm9jZXNzQ2h1bmtfRWxlbWVudChyc2MsICZpbywgaWUpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIENIVU5LX0VMRU1FTlRfU09VUkNFOgotICAgICAgICBwcm9jZXNzQ2h1bmtfRWxlbWVudFNvdXJjZShyc2MsICZpbywgaWUpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIENIVU5LX1ZFUlRJQ0lFUzoKLSAgICAgICAgcHJvY2Vzc0NodW5rX1ZlcnRpY2llcyhyc2MsICZpbywgaWUpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIENIVU5LX01FU0g6Ci0gICAgICAgIHByb2Nlc3NDaHVua19NZXNoKHJzYywgJmlvLCBpZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hVTktfUFJJTUlUSVZFOgotICAgICAgICBwcm9jZXNzQ2h1bmtfUHJpbWl0aXZlKHJzYywgJmlvLCBpZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR0UoIkZpbGVBM0QgVW5rbm93biBjaHVuayB0eXBlIik7Ci0gICAgICAgIGJyZWFrOworY29uc3QgRmlsZUEzRDo6QTNESW5kZXhFbnRyeSAqRmlsZUEzRDo6Z2V0SW5kZXhFbnRyeShzaXplX3QgaW5kZXgpIGNvbnN0IHsKKyAgICBpZihpbmRleCA8IG1JbmRleC5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbmRleFtpbmRleF07CiAgICAgfQotICAgIHJldHVybiAoaWUtPm1Sc09iaiAhPSBOVUxMKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAotYm9vbCBGaWxlQTNEOjpwcm9jZXNzKENvbnRleHQgKnJzYykKLXsKLSAgICBMT0dFKCJwcm9jZXNzIik7Ci0gICAgSU8gaW8obURhdGEgKyAxMiwgbVVzZTY0Qml0T2Zmc2V0cyk7Ci0gICAgYm9vbCByZXQgPSB0cnVlOwotCi0gICAgLy8gQnVpbGQgdGhlIGluZGV4IGZpcnN0Ci0gICAgTE9HRSgicHJvY2VzcyAxIik7Ci0gICAgaW8ubG9hZFUzMigpOyAvLyBtYWpvciB2ZXJzaW9uLCBhbHJlYWR5IGxvYWRlZAotICAgIGlvLmxvYWRVMzIoKTsgLy8gbWlub3IgdmVyc2lvbiwgYWxyZWFkeSBsb2FkZWQKLSAgICBMT0dFKCJwcm9jZXNzIDIiKTsKLQotICAgIGlvLmxvYWRVMzIoKTsgIC8vIGZsYWdzCi0gICAgaW8ubG9hZE9mZnNldCgpOyAvLyBmaWxlc2l6ZSwgYWxyZWFkeSBsb2FkZWQuCi0gICAgTE9HRSgicHJvY2VzcyA0Iik7Ci0gICAgdWludDY0X3QgbUluZGV4T2Zmc2V0ID0gaW8ubG9hZE9mZnNldCgpOwotICAgIHVpbnQ2NF90IG1TdHJpbmdPZmZzZXQgPSBpby5sb2FkT2Zmc2V0KCk7Ci0KLSAgICBMT0dFKCJwcm9jZXNzIG1JbmRleE9mZnNldD0gMHglMDE2bGx4IiwgbUluZGV4T2Zmc2V0KTsKLSAgICBMT0dFKCJwcm9jZXNzIG1TdHJpbmdPZmZzZXQ9IDB4JTAxNmxseCIsIG1TdHJpbmdPZmZzZXQpOwotCi0gICAgSU8gaW5kZXgobURhdGEgKyBtSW5kZXhPZmZzZXQsIG1Vc2U2NEJpdE9mZnNldHMpOwotICAgIElPIHN0cmluZ1RhYmxlKG1EYXRhICsgbVN0cmluZ09mZnNldCwgbVVzZTY0Qml0T2Zmc2V0cyk7Ci0KLSAgICB1aW50MzJfdCBzdHJpbmdFbnRyeUNvdW50ID0gc3RyaW5nVGFibGUubG9hZFUzMigpOwotICAgIExPR0UoInN0cmluZ0VudHJ5Q291bnQgJWkiLCBzdHJpbmdFbnRyeUNvdW50KTsKLSAgICBtU3RyaW5ncy5zZXRDYXBhY2l0eShzdHJpbmdFbnRyeUNvdW50KTsKLSAgICBtU3RyaW5nSW5kZXhWYWx1ZXMuc2V0Q2FwYWNpdHkoc3RyaW5nRW50cnlDb3VudCk7Ci0gICAgaWYgKHN0cmluZ0VudHJ5Q291bnQpIHsKLSAgICAgICAgdWludDMyX3Qgc3RyaW5nVHlwZSA9IHN0cmluZ1RhYmxlLmxvYWRVMzIoKTsKLSAgICAgICAgTE9HRSgic3RyaW5nVHlwZSAlaSIsIHN0cmluZ1R5cGUpOwotICAgICAgICByc0Fzc2VydChzdHJpbmdUeXBlPT0wKTsKLSAgICAgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgc3RyaW5nRW50cnlDb3VudDsgY3QrKykgewotICAgICAgICAgICAgdWludDY0X3Qgb2Zmc2V0ID0gc3RyaW5nVGFibGUubG9hZE9mZnNldCgpOwotICAgICAgICAgICAgTE9HRSgic3RyaW5nIG9mZnNldCAweCUwMTZsbHgiLCBvZmZzZXQpOwotICAgICAgICAgICAgSU8gdG1wKG1EYXRhICsgb2Zmc2V0LCBtVXNlNjRCaXRPZmZzZXRzKTsKLSAgICAgICAgICAgIFN0cmluZzggczsKLSAgICAgICAgICAgIHRtcC5sb2FkU3RyaW5nKCZzKTsKLSAgICAgICAgICAgIExPR0UoInN0cmluZyAlcyIsIHMuc3RyaW5nKCkpOwotICAgICAgICAgICAgbVN0cmluZ3MucHVzaChzKTsKLSAgICAgICAgfQorT2JqZWN0QmFzZSAqRmlsZUEzRDo6aW5pdGlhbGl6ZUZyb21FbnRyeShzaXplX3QgaW5kZXgpIHsKKyAgICBpZihpbmRleCA+PSBtSW5kZXguc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIExPR0UoInN0cmluZ3MgZG9uZSIpOwotICAgIHVpbnQzMl90IGluZGV4RW50cnlDb3VudCA9IGluZGV4LmxvYWRVMzIoKTsKLSAgICBMT0dFKCJpbmRleCBjb3VudCAlaSIsIGluZGV4RW50cnlDb3VudCk7Ci0gICAgbUluZGV4LnNldENhcGFjaXR5KGluZGV4RW50cnlDb3VudCk7Ci0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgaW5kZXhFbnRyeUNvdW50OyBjdCsrKSB7Ci0gICAgICAgIEEzREluZGV4RW50cnkgZTsKLSAgICAgICAgdWludDMyX3Qgc3RyaW5nSW5kZXggPSBpbmRleC5sb2FkVTMyKCk7Ci0gICAgICAgIExPR0UoImluZGV4ICVpIiwgY3QpOwotICAgICAgICBMT0dFKCIgIHN0cmluZyBpbmRleCAlaSIsIHN0cmluZ0luZGV4KTsKLSAgICAgICAgZS5tVHlwZSA9IChBM0RDaHVua1R5cGUpaW5kZXgubG9hZFUzMigpOwotICAgICAgICBMT0dFKCIgIHR5cGUgJWkiLCBlLm1UeXBlKTsKLSAgICAgICAgZS5tT2Zmc2V0ID0gaW5kZXgubG9hZE9mZnNldCgpOwotICAgICAgICBMT0dFKCIgIG9mZnNldCAweCUwMTZsbHgiLCBlLm1PZmZzZXQpOwotCi0gICAgICAgIGlmIChzdHJpbmdJbmRleCAmJiAoc3RyaW5nSW5kZXggPCBtU3RyaW5ncy5zaXplKCkpKSB7Ci0gICAgICAgICAgICBlLm1JRCA9IG1TdHJpbmdzW3N0cmluZ0luZGV4XTsKLSAgICAgICAgICAgIG1TdHJpbmdJbmRleFZhbHVlcy5lZGl0SXRlbUF0KHN0cmluZ0luZGV4KSA9IGN0OwotICAgICAgICAgICAgTE9HRSgiICBpZCAlcyIsIGUubUlELnN0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1JbmRleC5wdXNoKGUpOwotICAgIH0KLSAgICBMT0dFKCJpbmRleCBkb25lIik7Ci0KLSAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBpbmRleCBzaG91bGQgYmUgZnVsbHkgcG9wdWxhdGVkLgotICAgIC8vIFdlIGNhbiBub3cgd2FsayB0aG91Z2ggaXQgYW5kIGxvYWQgYWxsIHRoZSBvYmplY3RzLgotICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IGluZGV4RW50cnlDb3VudDsgY3QrKykgewotICAgICAgICBMT0dFKCJwcm9jZXNzaW5nIGluZGV4IGVudHJ5ICVpIiwgY3QpOwotICAgICAgICBwcm9jZXNzSW5kZXgocnNjLCAmbUluZGV4LmVkaXRJdGVtQXQoY3QpKTsKKyAgICBGaWxlQTNEOjpBM0RJbmRleEVudHJ5ICplbnRyeSA9IG1JbmRleFtpbmRleF07CisgICAgaWYoIWVudHJ5KSB7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHJldHVybiByZXQ7Ci19Ci0KLQotRmlsZUEzRDo6SU86OklPKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgYm9vbCB1c2U2NCkKLXsKLSAgICBtRGF0YSA9IGJ1ZjsKLSAgICBtUG9zID0gMDsKLSAgICBtVXNlNjQgPSB1c2U2NDsKLX0KLQotdWludDY0X3QgRmlsZUEzRDo6SU86OmxvYWRPZmZzZXQoKQotewotICAgIHVpbnQ2NF90IHRtcDsKLSAgICBpZiAobVVzZTY0KSB7Ci0gICAgICAgIG1Qb3MgPSAobVBvcyArIDcpICYgKH43KTsKLSAgICAgICAgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCAqPigmbURhdGFbbVBvc10pWzBdOwotICAgICAgICBtUG9zICs9IHNpemVvZih1aW50NjRfdCk7Ci0gICAgICAgIHJldHVybiB0bXA7CisgICAgaWYoZW50cnktPm1Sc09iaikgeworICAgICAgICBlbnRyeS0+bVJzT2JqLT5pbmNVc2VyUmVmKCk7CisgICAgICAgIHJldHVybiBlbnRyeS0+bVJzT2JqOwogICAgIH0KLSAgICByZXR1cm4gbG9hZFUzMigpOwotfQogCi12b2lkIEZpbGVBM0Q6OklPOjpsb2FkU3RyaW5nKFN0cmluZzggKnMpCi17Ci0gICAgTE9HRSgibG9hZFN0cmluZyIpOwotICAgIHVpbnQzMl90IGxlbiA9IGxvYWRVMzIoKTsKLSAgICBMT0dFKCJsb2FkU3RyaW5nIGxlbiAlaSIsIGxlbik7Ci0gICAgcy0+c2V0VG8oKGNvbnN0IGNoYXIgKikmbURhdGFbbVBvc10sIGxlbik7Ci0gICAgbVBvcyArPSBsZW47Ci19Ci0KLQotdm9pZCBGaWxlQTNEOjpwcm9jZXNzQ2h1bmtfTWVzaChDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpCi17Ci0gICAgTWVzaCAqIG0gPSBuZXcgTWVzaChyc2MpOwotCi0gICAgbS0+bVByaW1pdGl2ZXNDb3VudCA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgbS0+bVByaW1pdGl2ZXMgPSBuZXcgTWVzaDo6UHJpbWl0aXZlX3QgKlttLT5tUHJpbWl0aXZlc0NvdW50XTsKLQotICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IG0tPm1QcmltaXRpdmVzQ291bnQ7IGN0KyspIHsKLSAgICAgICAgdWludDMyX3QgaW5kZXggPSBpby0+bG9hZFUzMigpOwotCi0gICAgICAgIG0tPm1QcmltaXRpdmVzW2N0XSA9IChNZXNoOjpQcmltaXRpdmVfdCAqKW1JbmRleFtpbmRleF0ubVJzT2JqOwotICAgIH0KLSAgICBpZS0+bVJzT2JqID0gbTsKLX0KLQotdm9pZCBGaWxlQTNEOjpwcm9jZXNzQ2h1bmtfUHJpbWl0aXZlKENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSkKLXsKLSAgICBNZXNoOjpQcmltaXRpdmVfdCAqIHAgPSBuZXcgTWVzaDo6UHJpbWl0aXZlX3Q7Ci0KLSAgICBwLT5tSW5kZXhDb3VudCA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgdWludDMyX3QgdmVydElkeCA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgcC0+bVJlc3RhcnRDb3VudHMgPSBpby0+bG9hZFUxNigpOwotICAgIHVpbnQzMl90IGJpdHMgPSBpby0+bG9hZFU4KCk7Ci0gICAgcC0+bVR5cGUgPSAoUnNQcmltaXRpdmUpaW8tPmxvYWRVOCgpOwotCi0gICAgTE9HRSgicHJvY2Vzc0NodW5rX1ByaW1pdGl2ZSBjb3VudCAlaSwgYml0cyAlaSIsIHAtPm1JbmRleENvdW50LCBiaXRzKTsKLQotICAgIHAtPm1WZXJ0aWNpZXMgPSAoTWVzaDo6VmVydGljaWVzX3QgKiltSW5kZXhbdmVydElkeF0ubVJzT2JqOwotCi0gICAgcC0+bUluZGljaWVzID0gbmV3IHVpbnQxNl90W3AtPm1JbmRleENvdW50XTsKLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBwLT5tSW5kZXhDb3VudDsgY3QrKykgewotICAgICAgICBzd2l0Y2goYml0cykgewotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICBwLT5tSW5kaWNpZXNbY3RdID0gaW8tPmxvYWRVOCgpOworICAgIC8vIFNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiBvYmplY3QKKyAgICBtUmVhZFN0cmVhbS0+cmVzZXQoZW50cnktPm1PZmZzZXQpOworICAgIHN3aXRjaCAoZW50cnktPm1UeXBlKSB7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1VOS05PV046CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfTUVTSDoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBNZXNoOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgcC0+bUluZGljaWVzW2N0XSA9IGlvLT5sb2FkVTE2KCk7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1RZUEU6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gVHlwZTo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgIHAtPm1JbmRpY2llc1tjdF0gPSBpby0+bG9hZFUzMigpOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9FTEVNRU5UOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IEVsZW1lbnQ6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX0FMTE9DQVRJT046CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gQWxsb2NhdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9WRVJURVg6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gUHJvZ3JhbVZlcnRleDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9SQVNURVI6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gUHJvZ3JhbVJhc3Rlcjo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9GUkFHTUVOVDoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBQcm9ncmFtRnJhZ21lbnQ6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fU1RPUkU6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gUHJvZ3JhbVN0b3JlOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9TQU1QTEVSOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFNhbXBsZXI6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX0FOSU1BVElPTjoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBBbmltYXRpb246OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX0xJR0hUOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IExpZ2h0OjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9BREFQVEVSXzFEOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IEFkYXB0ZXIxRDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfQURBUFRFUl8yRDoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBBZGFwdGVyMkQ6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1NDUklQVF9DOgorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmKGVudHJ5LT5tUnNPYmopIHsKKyAgICAgICAgZW50cnktPm1Sc09iai0+aW5jVXNlclJlZigpOworICAgIH0KKyAgICByZXR1cm4gZW50cnktPm1Sc09iajsKK30KKworYm9vbCBGaWxlQTNEOjp3cml0ZUZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgaWYoIW1Xcml0ZVN0cmVhbSkgeworICAgICAgICBMT0dFKCJObyBvYmplY3RzIHRvIHdyaXRlXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZihtV3JpdGVTdHJlYW0tPmdldFBvcygpID09IDApIHsKKyAgICAgICAgTE9HRSgiTm8gb2JqZWN0cyB0byB3cml0ZVxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBGSUxFICp3cml0ZUhhbmRsZSA9IGZvcGVuKGZpbGVuYW1lLCAid2IiKTsKKyAgICBpZighd3JpdGVIYW5kbGUpIHsKKyAgICAgICAgTE9HRSgiQ291bGRuJ3Qgb3BlbiB0aGUgZmlsZSBmb3Igd3JpdGluZ1xuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBPcGVuIGEgbmV3IHN0cmVhbSB0byBtYWtlIHdyaXRpbmcgdGhlIGhlYWRlciBlYXNpZXIKKyAgICBPU3RyZWFtIGhlYWRlclN0cmVhbSg1KjEwMjQsIGZhbHNlKTsKKyAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKG1NYWpvclZlcnNpb24pOworICAgIGhlYWRlclN0cmVhbS5hZGRVMzIobU1pbm9yVmVyc2lvbik7CisgICAgdWludDMyX3QgaXM2NEJpdCA9IDA7CisgICAgaGVhZGVyU3RyZWFtLmFkZFUzMihpczY0Qml0KTsKKworICAgIHVpbnQzMl90IHdyaXRlSW5kZXhTaXplID0gbVdyaXRlSW5kZXguc2l6ZSgpOworICAgIGhlYWRlclN0cmVhbS5hZGRVMzIod3JpdGVJbmRleFNpemUpOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IHdyaXRlSW5kZXhTaXplOyBpICsrKSB7CisgICAgICAgIGhlYWRlclN0cmVhbS5hZGRTdHJpbmcoJm1Xcml0ZUluZGV4W2ldLT5tT2JqZWN0TmFtZSk7CisgICAgICAgIGhlYWRlclN0cmVhbS5hZGRVMzIoKHVpbnQzMl90KW1Xcml0ZUluZGV4W2ldLT5tVHlwZSk7CisgICAgICAgIGlmKG1Vc2U2NEJpdE9mZnNldHMpeworICAgICAgICAgICAgaGVhZGVyU3RyZWFtLmFkZE9mZnNldChtV3JpdGVJbmRleFtpXS0+bU9mZnNldCk7CisgICAgICAgICAgICBoZWFkZXJTdHJlYW0uYWRkT2Zmc2V0KG1Xcml0ZUluZGV4W2ldLT5tTGVuZ3RoKTsKICAgICAgICAgfQotICAgICAgICBMT0dFKCIgIGlkeCAlaSIsIHAtPm1JbmRpY2llc1tjdF0pOwotICAgIH0KLQotICAgIGlmIChwLT5tUmVzdGFydENvdW50cykgewotICAgICAgICBwLT5tUmVzdGFydHMgPSBuZXcgdWludDE2X3RbcC0+bVJlc3RhcnRDb3VudHNdOwotICAgICAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBwLT5tUmVzdGFydENvdW50czsgY3QrKykgewotICAgICAgICAgICAgc3dpdGNoKGJpdHMpIHsKLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICBwLT5tUmVzdGFydHNbY3RdID0gaW8tPmxvYWRVOCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgICBwLT5tUmVzdGFydHNbY3RdID0gaW8tPmxvYWRVMTYoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAgICAgcC0+bVJlc3RhcnRzW2N0XSA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMT0dFKCIgIGlkeCAlaSIsIHAtPm1SZXN0YXJ0c1tjdF0pOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCA9ICh1aW50MzJfdCltV3JpdGVJbmRleFtpXS0+bU9mZnNldDsKKyAgICAgICAgICAgIGhlYWRlclN0cmVhbS5hZGRVMzIob2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCA9ICh1aW50MzJfdCltV3JpdGVJbmRleFtpXS0+bUxlbmd0aDsKKyAgICAgICAgICAgIGhlYWRlclN0cmVhbS5hZGRVMzIob2Zmc2V0KTsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHAtPm1SZXN0YXJ0cyA9IE5VTEw7CiAgICAgfQogCi0gICAgaWUtPm1Sc09iaiA9IHA7CisgICAgLy8gV3JpdGUgb3VyIG1hZ2ljIHN0cmluZyBzbyB3ZSBrbm93IHdlIGFyZSByZWFkaW5nIHRoZSByaWdodCBmaWxlCisgICAgU3RyaW5nOCBtYWdpY1N0cmluZyhBM0RfTUFHSUNfS0VZKTsKKyAgICBmd3JpdGUobWFnaWNTdHJpbmcuc3RyaW5nKCksIHNpemVvZihjaGFyKSwgbWFnaWNTdHJpbmcuc2l6ZSgpLCB3cml0ZUhhbmRsZSk7CisKKyAgICAvLyBTdG9yZSB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHBhcnNlIHdoZW4gd2UgcmVhZCBpdAorICAgIHVpbnQ2NF90IGhlYWRlclNpemUgPSBoZWFkZXJTdHJlYW0uZ2V0UG9zKCk7CisgICAgZndyaXRlKCZoZWFkZXJTaXplLCBzaXplb2YoaGVhZGVyU2l6ZSksIDEsIHdyaXRlSGFuZGxlKTsKKworICAgIC8vIE5vdyB3cml0ZSBvdXIgaGVhZGVyCisgICAgZndyaXRlKGhlYWRlclN0cmVhbS5nZXRQdHIoKSwgc2l6ZW9mKHVpbnQ4X3QpLCBoZWFkZXJTdHJlYW0uZ2V0UG9zKCksIHdyaXRlSGFuZGxlKTsKKworICAgIC8vIE5vdyB3cml0ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBwYXJ0IG9mIHRoZSBmaWxlIGZvciBlYXNpZXIgcGFyc2luZyBsYXRlcgorICAgIHVpbnQ2NF90IGZpbGVEYXRhU2l6ZSA9IG1Xcml0ZVN0cmVhbS0+Z2V0UG9zKCk7CisgICAgZndyaXRlKCZmaWxlRGF0YVNpemUsIHNpemVvZihmaWxlRGF0YVNpemUpLCAxLCB3cml0ZUhhbmRsZSk7CisKKyAgICBmd3JpdGUobVdyaXRlU3RyZWFtLT5nZXRQdHIoKSwgc2l6ZW9mKHVpbnQ4X3QpLCBtV3JpdGVTdHJlYW0tPmdldFBvcygpLCB3cml0ZUhhbmRsZSk7CisKKyAgICBpbnQgc3RhdHVzID0gZmNsb3NlKHdyaXRlSGFuZGxlKTsKKworICAgIGlmKHN0YXR1cyAhPSAwKSB7CisgICAgICAgIExPR0UoIkNvdWxkbid0IGNsb3NlIGZpbGVcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgRmlsZUEzRDo6cHJvY2Vzc0NodW5rX1ZlcnRpY2llcyhDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpCi17Ci0gICAgTWVzaDo6VmVydGljaWVzX3QgKmN2ID0gbmV3IE1lc2g6OlZlcnRpY2llc190OwotICAgIGN2LT5tQWxsb2NhdGlvbkNvdW50ID0gaW8tPmxvYWRVMzIoKTsKLSAgICBjdi0+bUFsbG9jYXRpb25zID0gbmV3IEFsbG9jYXRpb24gKltjdi0+bUFsbG9jYXRpb25Db3VudF07Ci0gICAgTE9HRSgicHJvY2Vzc0NodW5rX1ZlcnRpY2llcyBjb3VudCAlaSIsIGN2LT5tQWxsb2NhdGlvbkNvdW50KTsKLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBjdi0+bUFsbG9jYXRpb25Db3VudDsgY3QrKykgewotICAgICAgICB1aW50MzJfdCBpID0gaW8tPmxvYWRVMzIoKTsKLSAgICAgICAgY3YtPm1BbGxvY2F0aW9uc1tjdF0gPSAoQWxsb2NhdGlvbiAqKW1JbmRleFtpXS5tUnNPYmo7Ci0gICAgICAgIExPR0UoIiAgaWR4ICVpIiwgaSk7Cit2b2lkIEZpbGVBM0Q6OmFwcGVuZFRvRmlsZShPYmplY3RCYXNlICpvYmopIHsKKyAgICBpZighb2JqKSB7CisgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgaWUtPm1Sc09iaiA9IGN2OwotfQotCi12b2lkIEZpbGVBM0Q6OnByb2Nlc3NDaHVua19FbGVtZW50KENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSkKLXsKLSAgICAvKgotICAgIHJzaV9FbGVtZW50QmVnaW4ocnNjKTsKLQotICAgIHVpbnQzMl90IGNvdW50ID0gaW8tPmxvYWRVMzIoKTsKLSAgICBMT0dFKCJwcm9jZXNzQ2h1bmtfRWxlbWVudCBjb3VudCAlaSIsIGNvdW50KTsKLSAgICB3aGlsZSAoY291bnQtLSkgewotICAgICAgICBSc0RhdGFLaW5kIGRrID0gKFJzRGF0YUtpbmQpaW8tPmxvYWRVOCgpOwotICAgICAgICBSc0RhdGFUeXBlIGR0ID0gKFJzRGF0YVR5cGUpaW8tPmxvYWRVOCgpOwotICAgICAgICB1aW50MzJfdCBiaXRzID0gaW8tPmxvYWRVOCgpOwotICAgICAgICBib29sIGlzTm9ybSA9IGlvLT5sb2FkVTgoKSAhPSAwOwotICAgICAgICBMT0dFKCIgICVpICVpICVpICVpIiwgZGssIGR0LCBiaXRzLCBpc05vcm0pOwotICAgICAgICByc2lfRWxlbWVudEFkZChyc2MsIGRrLCBkdCwgaXNOb3JtLCBiaXRzLCAwKTsKKyAgICBpZighbVdyaXRlU3RyZWFtKSB7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IGluaXRpYWxTdHJlYW1TaXplID0gMjU2KjEwMjQ7CisgICAgICAgIG1Xcml0ZVN0cmVhbSA9IG5ldyBPU3RyZWFtKGluaXRpYWxTdHJlYW1TaXplLCBmYWxzZSk7CiAgICAgfQotICAgIExPR0UoInByb2Nlc3NDaHVua19FbGVtZW50IGNyZWF0ZSIpOwotICAgIGllLT5tUnNPYmogPSByc2lfRWxlbWVudENyZWF0ZShyc2MpOwotICAgICovCi19Ci0KLXZvaWQgRmlsZUEzRDo6cHJvY2Vzc0NodW5rX0VsZW1lbnRTb3VyY2UoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKQotewotICAgIHVpbnQzMl90IGluZGV4ID0gaW8tPmxvYWRVMzIoKTsKLSAgICB1aW50MzJfdCBjb3VudCA9IGlvLT5sb2FkVTMyKCk7Ci0KLSAgICBMT0dFKCJwcm9jZXNzQ2h1bmtfRWxlbWVudFNvdXJjZSBjb3VudCAlaSwgaW5kZXggJWkiLCBjb3VudCwgaW5kZXgpOwotCi0gICAgUnNFbGVtZW50IGUgPSAoUnNFbGVtZW50KW1JbmRleFtpbmRleF0ubVJzT2JqOwotCi0gICAgUnNBbGxvY2F0aW9uIGEgPSByc2lfQWxsb2NhdGlvbkNyZWF0ZVNpemVkKHJzYywgZSwgY291bnQpOwotICAgIEFsbG9jYXRpb24gKiBhbGxvYyA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4oYSk7Ci0KLSAgICBmbG9hdCAqIGRhdGEgPSAoZmxvYXQgKilhbGxvYy0+Z2V0UHRyKCk7Ci0gICAgd2hpbGUoY291bnQtLSkgewotICAgICAgICAqZGF0YSA9IGlvLT5sb2FkRigpOwotICAgICAgICBMT0dFKCIgICVmIiwgKmRhdGEpOwotICAgICAgICBkYXRhKys7Ci0gICAgfQotICAgIGllLT5tUnNPYmogPSBhbGxvYzsKKyAgICBBM0RJbmRleEVudHJ5ICppbmRleEVudHJ5ID0gbmV3IEEzREluZGV4RW50cnkoKTsKKyAgICBpbmRleEVudHJ5LT5tT2JqZWN0TmFtZS5zZXRUbyhvYmotPmdldE5hbWUoKSk7CisgICAgaW5kZXhFbnRyeS0+bVR5cGUgPSBvYmotPmdldENsYXNzSWQoKTsKKyAgICBpbmRleEVudHJ5LT5tT2Zmc2V0ID0gbVdyaXRlU3RyZWFtLT5nZXRQb3MoKTsKKyAgICBpbmRleEVudHJ5LT5tUnNPYmogPSBvYmo7CisgICAgbVdyaXRlSW5kZXgucHVzaChpbmRleEVudHJ5KTsKKyAgICBvYmotPnNlcmlhbGl6ZShtV3JpdGVTdHJlYW0pOworICAgIGluZGV4RW50cnktPm1MZW5ndGggPSBtV3JpdGVTdHJlYW0tPmdldFBvcygpIC0gaW5kZXhFbnRyeS0+bU9mZnNldDsKKyAgICBtV3JpdGVTdHJlYW0tPmFsaWduKDQpOwogfQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIAordm9pZCByc2lfRmlsZUEzREdldE51bUluZGV4RW50cmllcyhDb250ZXh0ICpyc2MsIGludDMyX3QgKm51bUVudHJpZXMsIFJzRmlsZSBmaWxlKQoreworICAgIEZpbGVBM0QgKmZhM2QgPSBzdGF0aWNfY2FzdDxGaWxlQTNEICo+KGZpbGUpOworCisgICAgaWYoZmEzZCkgeworICAgICAgICAqbnVtRW50cmllcyA9IGZhM2QtPmdldE51bUluZGV4RW50cmllcygpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgKm51bUVudHJpZXMgPSAwOworICAgIH0KK30KKwordm9pZCByc2lfRmlsZUEzREdldEluZGV4RW50cmllcyhDb250ZXh0ICpyc2MsIFJzRmlsZUluZGV4RW50cnkgKmZpbGVFbnRyaWVzLCB1aW50MzJfdCBudW1FbnRyaWVzLCBSc0ZpbGUgZmlsZSkKK3sKKyAgICBGaWxlQTNEICpmYTNkID0gc3RhdGljX2Nhc3Q8RmlsZUEzRCAqPihmaWxlKTsKKworICAgIGlmKCFmYTNkKSB7CisgICAgICAgIExPR0UoIkNhbid0IGxvYWQgaW5kZXggZW50cmllcy4gTm8gdmFsaWQgZmlsZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDMyX3QgbnVtRmlsZUVudHJpZXMgPSBmYTNkLT5nZXROdW1JbmRleEVudHJpZXMoKTsKKyAgICBpZihudW1GaWxlRW50cmllcyAhPSBudW1FbnRyaWVzIHx8IG51bUVudHJpZXMgPT0gMCB8fCBmaWxlRW50cmllcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGxvYWQgaW5kZXggZW50cmllcy4gSW52YWxpZCBudW1iZXIgcmVxdWVzdGVkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBudW1GaWxlRW50cmllczsgaSArKykgeworICAgICAgICBjb25zdCBGaWxlQTNEOjpBM0RJbmRleEVudHJ5ICplbnRyeSA9IGZhM2QtPmdldEluZGV4RW50cnkoaSk7CisgICAgICAgIGZpbGVFbnRyaWVzW2ldLmNsYXNzSUQgPSBlbnRyeS0+Z2V0VHlwZSgpOworICAgICAgICBmaWxlRW50cmllc1tpXS5vYmplY3ROYW1lID0gZW50cnktPmdldE9iamVjdE5hbWUoKS5zdHJpbmcoKTsKKyAgICB9CisKK30KKworUnNPYmplY3RCYXNlIHJzaV9GaWxlQTNER2V0RW50cnlCeUluZGV4KENvbnRleHQgKnJzYywgdWludDMyX3QgaW5kZXgsIFJzRmlsZSBmaWxlKQoreworICAgIEZpbGVBM0QgKmZhM2QgPSBzdGF0aWNfY2FzdDxGaWxlQTNEICo+KGZpbGUpOworICAgIGlmKCFmYTNkKSB7CisgICAgICAgIExPR0UoIkNhbid0IGxvYWQgZW50cnkuIE5vIHZhbGlkIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgT2JqZWN0QmFzZSAqb2JqID0gZmEzZC0+aW5pdGlhbGl6ZUZyb21FbnRyeShpbmRleCk7CisgICAgTE9HRSgiUmV0dXJuaW5nIG9iamVjdCB3aXRoIG5hbWUgJXMiLCBvYmotPmdldE5hbWUoKSk7CisKKyAgICByZXR1cm4gb2JqOworfQorCitSc0ZpbGUgcnNpX0ZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0oQ29udGV4dCAqcnNjLCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pCit7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJGaWxlIGxvYWQgZmFpbGVkLiBBc3NldCBzdHJlYW0gaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBGaWxlQTNEICpmYTNkID0gbmV3IEZpbGVBM0QocnNjKTsKKworICAgIGZhM2QtPmxvYWQoZGF0YSwgbGVuKTsKKyAgICBmYTNkLT5pbmNVc2VyUmVmKCk7CisKKyAgICByZXR1cm4gZmEzZDsKK30KKwogCiBSc0ZpbGUgcnNpX0ZpbGVPcGVuKENvbnRleHQgKnJzYywgY2hhciBjb25zdCAqcGF0aCwgdW5zaWduZWQgaW50IGxlbikKIHsKLSAgICBGaWxlQTNEICpmYTNkID0gbmV3IEZpbGVBM0Q7CisgICAgRmlsZUEzRCAqZmEzZCA9IG5ldyBGaWxlQTNEKHJzYyk7CiAKICAgICBGSUxFICpmID0gZm9wZW4oIi9zZGNhcmQvdGVzdC5hM2QiLCAicmIiKTsKICAgICBpZiAoZikgewotICAgICAgICBmYTNkLT5sb2FkKHJzYywgZik7CisgICAgICAgIGZhM2QtPmxvYWQoZik7CiAgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgZmEzZC0+aW5jVXNlclJlZigpOwogICAgICAgICByZXR1cm4gZmEzZDsKICAgICB9CiAgICAgZGVsZXRlIGZhM2Q7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRmlsZUEzRC5oIGIvbGlicy9ycy9yc0ZpbGVBM0QuaAppbmRleCA5ZWUwOGVjLi5iOTg1OTA3IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzRmlsZUEzRC5oCisrKyBiL2xpYnMvcnMvcnNGaWxlQTNELmgKQEAgLTE4LDIwICsxOCwyMyBAQAogI2RlZmluZSBBTkRST0lEX1JTX0ZJTEVfQTNEX0gKIAogI2luY2x1ZGUgIlJlbmRlclNjcmlwdC5oIgotI2luY2x1ZGUgInJzRmlsZUEzRERlY2xzLmgiCiAjaW5jbHVkZSAicnNNZXNoLmgiCiAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSAicnNTdHJlYW0uaCIKICNpbmNsdWRlIDxzdGRpby5oPgogCisjZGVmaW5lIEEzRF9NQUdJQ19LRVkgIkFuZHJvaWQzRF9mZiIKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBuYW1lc3BhY2UgYW5kcm9pZCB7CisKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCi1jbGFzcyBGaWxlQTNECitjbGFzcyBGaWxlQTNEIDogcHVibGljIE9iamVjdEJhc2UKIHsKIHB1YmxpYzoKLSAgICBGaWxlQTNEKCk7CisgICAgRmlsZUEzRChDb250ZXh0ICpyc2MpOwogICAgIH5GaWxlQTNEKCk7CiAKICAgICB1aW50MzJfdCBtTWFqb3JWZXJzaW9uOwpAQCAtNDAsNzggKzQzLDUzIEBACiAgICAgdWludDY0X3QgbVN0cmluZ1RhYmxlT2Zmc2V0OwogICAgIGJvb2wgbVVzZTY0Qml0T2Zmc2V0czsKIAotICAgIHN0cnVjdCBBM0RJbmRleEVudHJ5IHsKLSAgICAgICAgU3RyaW5nOCBtSUQ7Ci0gICAgICAgIEEzRENodW5rVHlwZSBtVHlwZTsKKyAgICBjbGFzcyBBM0RJbmRleEVudHJ5IHsKKyAgICAgICAgU3RyaW5nOCBtT2JqZWN0TmFtZTsKKyAgICAgICAgUnNBM0RDbGFzc0lEIG1UeXBlOwogICAgICAgICB1aW50NjRfdCBtT2Zmc2V0OwotICAgICAgICB2b2lkICogbVJzT2JqOworICAgICAgICB1aW50NjRfdCBtTGVuZ3RoOworICAgICAgICBPYmplY3RCYXNlICptUnNPYmo7CisgICAgcHVibGljOgorICAgICAgICBmcmllbmQgY2xhc3MgRmlsZUEzRDsKKyAgICAgICAgY29uc3QgU3RyaW5nOCAmZ2V0T2JqZWN0TmFtZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtT2JqZWN0TmFtZTsKKyAgICAgICAgfQorICAgICAgICBSc0EzRENsYXNzSUQgZ2V0VHlwZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtVHlwZTsKKyAgICAgICAgfQogICAgIH07CiAKLSAgICBib29sIGxvYWQoQ29udGV4dCAqcnNjLCBGSUxFICpmKTsKKyAgICBib29sIGxvYWQoRklMRSAqZik7CisgICAgYm9vbCBsb2FkKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpOworCisgICAgc2l6ZV90IGdldE51bUluZGV4RW50cmllcygpIGNvbnN0OworICAgIGNvbnN0IEEzREluZGV4RW50cnkqIGdldEluZGV4RW50cnkoc2l6ZV90IGluZGV4KSBjb25zdDsKKyAgICBPYmplY3RCYXNlICppbml0aWFsaXplRnJvbUVudHJ5KHNpemVfdCBpbmRleCk7CisKKyAgICB2b2lkIGFwcGVuZFRvRmlsZShPYmplY3RCYXNlICpvYmopOworICAgIGJvb2wgd3JpdGVGaWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKworICAgIC8vIEN1cnJlbnRseSBmaWxlcyBkbyBub3QgZ2V0IHNlcmlhbGl6ZWQsCisgICAgLy8gYnV0IHdlIG5lZWQgdG8gaW5oZXJpdCBmcm9tIE9iamVjdEJhc2UgZm9yIHJlZiB0cmFja2luZworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdCB7CisgICAgfQorICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBSU19BM0RfQ0xBU1NfSURfVU5LTk9XTjsKKyAgICB9CiAKIHByb3RlY3RlZDoKLSAgICBjbGFzcyBJTwotICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIElPKGNvbnN0IHVpbnQ4X3QgKiwgYm9vbCB1c2U2NCk7Ci0gICAgCi0gICAgICAgIGZsb2F0IGxvYWRGKCkgewotICAgICAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOwotICAgICAgICAgICAgZmxvYXQgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCAqPigmbURhdGFbbVBvc10pWzBdOwotICAgICAgICAgICAgbVBvcyArPSBzaXplb2YoZmxvYXQpOwotICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgfQotICAgICAgICBpbnQzMl90IGxvYWRJMzIoKSB7Ci0gICAgICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7Ci0gICAgICAgICAgICBpbnQzMl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MzJfdCAqPigmbURhdGFbbVBvc10pWzBdOwotICAgICAgICAgICAgbVBvcyArPSBzaXplb2YoaW50MzJfdCk7Ci0gICAgICAgICAgICByZXR1cm4gdG1wOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQzMl90IGxvYWRVMzIoKSB7Ci0gICAgICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7Ci0gICAgICAgICAgICB1aW50MzJfdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KCZtRGF0YVttUG9zXSlbMF07Ci0gICAgICAgICAgICBtUG9zICs9IHNpemVvZih1aW50MzJfdCk7Ci0gICAgICAgICAgICByZXR1cm4gdG1wOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQxNl90IGxvYWRVMTYoKSB7Ci0gICAgICAgICAgICBtUG9zID0gKG1Qb3MgKyAxKSAmICh+MSk7Ci0gICAgICAgICAgICB1aW50MTZfdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxNl90ICo+KCZtRGF0YVttUG9zXSlbMF07Ci0gICAgICAgICAgICBtUG9zICs9IHNpemVvZih1aW50MTZfdCk7Ci0gICAgICAgICAgICByZXR1cm4gdG1wOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQ4X3QgbG9hZFU4KCkgewotICAgICAgICAgICAgdWludDhfdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKLSAgICAgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQ4X3QpOwotICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgfQotICAgICAgICB1aW50NjRfdCBsb2FkT2Zmc2V0KCk7Ci0gICAgICAgIHZvaWQgbG9hZFN0cmluZyhTdHJpbmc4ICpzKTsKLSAgICAgICAgdWludDY0X3QgZ2V0UG9zKCkgY29uc3Qge3JldHVybiBtUG9zO30KLSAgICAgICAgY29uc3QgdWludDhfdCAqIGdldFB0cigpIGNvbnN0OwotICAgIHByb3RlY3RlZDoKLSAgICAgICAgY29uc3QgdWludDhfdCAqIG1EYXRhOwotICAgICAgICB1aW50NjRfdCBtUG9zOwotICAgICAgICBib29sIG1Vc2U2NDsKLSAgICB9OwogCi0KLSAgICBib29sIHByb2Nlc3MoQ29udGV4dCAqcnNjKTsKLSAgICBib29sIHByb2Nlc3NJbmRleChDb250ZXh0ICpyc2MsIEEzREluZGV4RW50cnkgKik7Ci0gICAgdm9pZCBwcm9jZXNzQ2h1bmtfTWVzaChDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpOwotICAgIHZvaWQgcHJvY2Vzc0NodW5rX1ByaW1pdGl2ZShDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpOwotICAgIHZvaWQgcHJvY2Vzc0NodW5rX1ZlcnRpY2llcyhDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpOwotICAgIHZvaWQgcHJvY2Vzc0NodW5rX0VsZW1lbnQoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKTsKLSAgICB2b2lkIHByb2Nlc3NDaHVua19FbGVtZW50U291cmNlKENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSk7CisgICAgdm9pZCBwYXJzZUhlYWRlcihJU3RyZWFtICpoZWFkZXJTdHJlYW0pOwogCiAgICAgY29uc3QgdWludDhfdCAqIG1EYXRhOwogICAgIHZvaWQgKiBtQWxsb2M7CiAgICAgdWludDY0X3QgbURhdGFTaXplOwotICAgIENvbnRleHQgKiBtUnNjOwogCi0gICAgVmVjdG9yPEEzREluZGV4RW50cnk+IG1JbmRleDsKLSAgICBWZWN0b3I8U3RyaW5nOD4gbVN0cmluZ3M7Ci0gICAgVmVjdG9yPHVpbnQzMl90PiBtU3RyaW5nSW5kZXhWYWx1ZXM7CisgICAgT1N0cmVhbSAqbVdyaXRlU3RyZWFtOworICAgIFZlY3RvcjxBM0RJbmRleEVudHJ5Kj4gbVdyaXRlSW5kZXg7CiAKKyAgICBJU3RyZWFtICptUmVhZFN0cmVhbTsKKyAgICBWZWN0b3I8QTNESW5kZXhFbnRyeSo+IG1JbmRleDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0ZpbGVBM0REZWNscy5oIGIvbGlicy9ycy9yc0ZpbGVBM0REZWNscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTA4YmQzLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvcnNGaWxlQTNERGVjbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfUlNfRklMRV9BM0RfREVDTFNfSAotI2RlZmluZSBBTkRST0lEX1JTX0ZJTEVfQTNEX0RFQ0xTX0gKLQotCi0jZGVmaW5lIEEzRF9NQUdJQ19LRVkgIkFuZHJvaWQzRF9mZiIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7Ci0KLSAgICBlbnVtIEEzRENodW5rVHlwZSB7Ci0gICAgICAgIENIVU5LX0VNUFRZLAotCi0gICAgICAgIENIVU5LX0VMRU1FTlQsCi0gICAgICAgIENIVU5LX0VMRU1FTlRfU09VUkNFLAotICAgICAgICBDSFVOS19WRVJUSUNJRVMsCi0gICAgICAgIENIVU5LX01FU0gsCi0gICAgICAgIENIVU5LX1BSSU1JVElWRSwKLQotICAgICAgICBDSFVOS19MQVNUCi0gICAgfTsKLQotCi19Ci19Ci0jZW5kaWYgLy9BTkRST0lEX1JTX0ZJTEVfQTNEX0gKLQotCi0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNGb250LmNwcCBiL2xpYnMvcnMvcnNGb250LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjYxZDQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNGb250LmNwcApAQCAtMCwwICsxLDc2NCBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInJzRm9udC5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCisjaW5jbHVkZSBGVF9CSVRNQVBfSAorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCitGb250OjpGb250KENvbnRleHQgKnJzYykgOiBPYmplY3RCYXNlKHJzYyksIG1DYWNoZWRHbHlwaHMoTlVMTCkKK3sKKyAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CisgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIG1IYXNLZXJuaW5nID0gZmFsc2U7CisgICAgbUZhY2UgPSBOVUxMOworfQorCitib29sIEZvbnQ6OmluaXQoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgZm9udFNpemUsIHVpbnQzMl90IGRwaSkKK3sKKyAgICBpZihtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgTE9HRSgiUmVpbml0aWFsaXphdGlvbiBvZiBmb250cyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHJpbmc4IGZvbnRzRGlyKCIvZm9udHMvIik7CisgICAgU3RyaW5nOCBmdWxsUGF0aChnZXRlbnYoIkFORFJPSURfUk9PVCIpKTsKKyAgICBmdWxsUGF0aCArPSBmb250c0RpcjsKKyAgICBmdWxsUGF0aCArPSBuYW1lOworCisgICAgRlRfRXJyb3IgZXJyb3IgPSBGVF9OZXdfRmFjZShtUlNDLT5tU3RhdGVGb250LmdldExpYigpLCBmdWxsUGF0aC5zdHJpbmcoKSwgMCwgJm1GYWNlKTsKKyAgICBpZihlcnJvcikgeworICAgICAgICBMT0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBmb250ICVzIiwgZnVsbFBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbUZvbnROYW1lID0gbmFtZTsKKyAgICBtRm9udFNpemUgPSBmb250U2l6ZTsKKyAgICBtRHBpID0gZHBpOworCisgICAgZXJyb3IgPSBGVF9TZXRfQ2hhcl9TaXplKG1GYWNlLCBmb250U2l6ZSAqIDY0LCAwLCBkcGksIDApOworICAgIGlmKGVycm9yKSB7CisgICAgICAgIExPR0UoIlVuYWJsZSB0byBzZXQgZm9udCBzaXplIG9uICVzIiwgZnVsbFBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbUhhc0tlcm5pbmcgPSBGVF9IQVNfS0VSTklORyhtRmFjZSk7CisKKyAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZvbnQ6OmludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKQoreworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZWRHbHlwaHMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIG1DYWNoZWRHbHlwaHMudmFsdWVBdChpKS0+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+YmluZFRleHR1cmUoMCwgbVRleHRUZXh0dXJlLmdldCgpKTsKKworICAgIC8vIFNvbWUgZGVidWcgY29kZQorICAgIC8qZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIExPR0UoIkNhY2hlIExpbmU6IEg6ICV1IEVtcHR5IFNwYWNlOiAlZiIsCisgICAgICAgICAgICAgbUNhY2hlTGluZXNbaV0tPm1NYXhIZWlnaHQsCisgICAgICAgICAgICAgICgxLjBmIC0gKGZsb2F0KW1DYWNoZUxpbmVzW2ldLT5tQ3VycmVudENvbC8oZmxvYXQpbUNhY2hlTGluZXNbaV0tPm1NYXhXaWR0aCkqMTAwLjBmKTsKKworICAgIH0qLworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjppbml0UmVuZGVyU3RhdGUoKQoreworICAgIHVpbnQzMl90IHRtcFtdID0geworICAgICAgICBSU19URVhfRU5WX01PREVfUkVQTEFDRSwgMSwKKyAgICAgICAgUlNfVEVYX0VOVl9NT0RFX05PTkUsIDAsCisgICAgICAgIDAsIDAKKyAgICB9OworICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSBuZXcgUHJvZ3JhbUZyYWdtZW50KG1SU0MsIHRtcCwgNik7CisgICAgbUZvbnRTaGFkZXJGLnNldChwZik7CisgICAgbUZvbnRTaGFkZXJGLT5pbml0KG1SU0MpOworCisgICAgU2FtcGxlciAqc2FtcGxlciA9IG5ldyBTYW1wbGVyKG1SU0MsIFJTX1NBTVBMRVJfTkVBUkVTVCwgUlNfU0FNUExFUl9ORUFSRVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU19TQU1QTEVSX0NMQU1QLCBSU19TQU1QTEVSX0NMQU1QLCBSU19TQU1QTEVSX0NMQU1QKTsKKyAgICBtRm9udFNhbXBsZXIuc2V0KHNhbXBsZXIpOworICAgIG1Gb250U2hhZGVyRi0+YmluZFNhbXBsZXIoMCwgc2FtcGxlcik7CisKKyAgICBQcm9ncmFtU3RvcmUgKmZvbnRTdG9yZSA9IG5ldyBQcm9ncmFtU3RvcmUobVJTQyk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUuc2V0KGZvbnRTdG9yZSk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUtPnNldERlcHRoRnVuYyhSU19ERVBUSF9GVU5DX0FMV0FZUyk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUtPnNldEJsZW5kRnVuYyhSU19CTEVORF9TUkNfU1JDX0FMUEhBLCBSU19CTEVORF9EU1RfT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUtPnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUtPnNldERlcHRoTWFzayhmYWxzZSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjppbml0VGV4dFRleHR1cmUoKQoreworICAgIGNvbnN0IEVsZW1lbnQgKmFscGhhRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShtUlNDLCBSU19UWVBFX1VOU0lHTkVEXzgsIFJTX0tJTkRfUElYRUxfQSwgdHJ1ZSwgMSk7CisKKyAgICAvLyBXZSB3aWxsIGFsbG9jYXRlIGEgdGV4dHVyZSB0byBpbml0aWFsbHkgaG9sZCAzMiBjaGFyYWN0ZXIgYml0bWFwcworICAgIFR5cGUgKnRleFR5cGUgPSBuZXcgVHlwZShtUlNDKTsKKyAgICB0ZXhUeXBlLT5zZXRFbGVtZW50KGFscGhhRWxlbSk7CisgICAgdGV4VHlwZS0+c2V0RGltWCgxMDI0KTsKKyAgICB0ZXhUeXBlLT5zZXREaW1ZKDI1Nik7CisgICAgdGV4VHlwZS0+Y29tcHV0ZSgpOworCisgICAgQWxsb2NhdGlvbiAqY2FjaGVBbGxvYyA9IG5ldyBBbGxvY2F0aW9uKG1SU0MsIHRleFR5cGUpOworICAgIG1UZXh0VGV4dHVyZS5zZXQoY2FjaGVBbGxvYyk7CisgICAgbVRleHRUZXh0dXJlLT5kZWZlcmVkVXBsb2FkVG9UZXh0dXJlKG1SU0MsIGZhbHNlLCAwKTsKKworICAgIC8vIFNwbGl0IHVwIG91ciBjYWNoZSB0ZXh0dXJlIGludG8gbGluZXMgb2YgY2VydGFpbiB3aWR0aHMKKyAgICBpbnQgbmV4dExpbmUgPSAwOworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUoMTYsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKDI0LCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZSgyNCwgdGV4VHlwZS0+Z2V0RGltWCgpLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUoMzIsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKDMyLCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZSg0MCwgdGV4VHlwZS0+Z2V0RGltWCgpLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUodGV4VHlwZS0+Z2V0RGltWSgpIC0gbmV4dExpbmUsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKK30KKworLy8gQXZvaWQgaGF2aW5nIHRvIHJlYWxsb2NhdGUgbWVtb3J5IGFuZCByZW5kZXIgcXVhZCBieSBxdWFkCit2b2lkIEZvbnRTdGF0ZTo6aW5pdFZlcnRleEFycmF5QnVmZmVycygpCit7CisgICAgLy8gTm93IGxldHMgd3JpdGUgaW5kZXggZGF0YQorICAgIGNvbnN0IEVsZW1lbnQgKmluZGV4RWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShtUlNDLCBSU19UWVBFX1VOU0lHTkVEXzE2LCBSU19LSU5EX1VTRVIsIGZhbHNlLCAxKTsKKyAgICBUeXBlICppbmRleFR5cGUgPSBuZXcgVHlwZShtUlNDKTsKKyAgICB1aW50MzJfdCBudW1JbmRpY2llcyA9IG1NYXhOdW1iZXJPZlF1YWRzICogNjsKKyAgICBpbmRleFR5cGUtPnNldERpbVgobnVtSW5kaWNpZXMpOworICAgIGluZGV4VHlwZS0+c2V0RWxlbWVudChpbmRleEVsZW0pOworICAgIGluZGV4VHlwZS0+Y29tcHV0ZSgpOworCisgICAgQWxsb2NhdGlvbiAqaW5kZXhBbGxvYyA9IG5ldyBBbGxvY2F0aW9uKG1SU0MsIGluZGV4VHlwZSk7CisgICAgdWludDE2X3QgKmluZGV4UHRyID0gKHVpbnQxNl90KilpbmRleEFsbG9jLT5nZXRQdHIoKTsKKworICAgIC8vIEZvdXIgdmVydHMsIHR3byB0cmlhbmdsZXMgLCBzaXggaW5kaWNlcyBwZXIgcXVhZAorICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1NYXhOdW1iZXJPZlF1YWRzOyBpICsrKSB7CisgICAgICAgIGludCBpNiA9IGkgKiA2OworICAgICAgICBpbnQgaTQgPSBpICogNDsKKworICAgICAgICBpbmRleFB0cltpNiArIDBdID0gaTQgKyAwOworICAgICAgICBpbmRleFB0cltpNiArIDFdID0gaTQgKyAxOworICAgICAgICBpbmRleFB0cltpNiArIDJdID0gaTQgKyAyOworCisgICAgICAgIGluZGV4UHRyW2k2ICsgM10gPSBpNCArIDA7CisgICAgICAgIGluZGV4UHRyW2k2ICsgNF0gPSBpNCArIDI7CisgICAgICAgIGluZGV4UHRyW2k2ICsgNV0gPSBpNCArIDM7CisgICAgfQorCisgICAgaW5kZXhBbGxvYy0+ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KG1SU0MpOworICAgIG1JbmRleEJ1ZmZlci5zZXQoaW5kZXhBbGxvYyk7CisKKyAgICBjb25zdCBFbGVtZW50ICpwb3NFbGVtID0gRWxlbWVudDo6Y3JlYXRlKG1SU0MsIFJTX1RZUEVfRkxPQVRfMzIsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDMpOworICAgIGNvbnN0IEVsZW1lbnQgKnRleEVsZW0gPSBFbGVtZW50OjpjcmVhdGUobVJTQywgUlNfVFlQRV9GTE9BVF8zMiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgMik7CisKKyAgICBjb25zdCBFbGVtZW50ICplbGVtQXJyYXlbMl07CisgICAgZWxlbUFycmF5WzBdID0gcG9zRWxlbTsKKyAgICBlbGVtQXJyYXlbMV0gPSB0ZXhFbGVtOworCisgICAgU3RyaW5nOCBwb3NOYW1lKCJwb3NpdGlvbiIpOworICAgIFN0cmluZzggdGV4TmFtZSgidGV4dHVyZTAiKTsKKworICAgIGNvbnN0IGNoYXIgKm5hbWVBcnJheVsyXTsKKyAgICBuYW1lQXJyYXlbMF0gPSBwb3NOYW1lLnN0cmluZygpOworICAgIG5hbWVBcnJheVsxXSA9IHRleE5hbWUuc3RyaW5nKCk7CisgICAgc2l6ZV90IGxlbmd0aHNbMl07CisgICAgbGVuZ3Roc1swXSA9IHBvc05hbWUuc2l6ZSgpOworICAgIGxlbmd0aHNbMV0gPSB0ZXhOYW1lLnNpemUoKTsKKworICAgIGNvbnN0IEVsZW1lbnQgKnZlcnRleERhdGFFbGVtID0gRWxlbWVudDo6Y3JlYXRlKG1SU0MsIDIsIGVsZW1BcnJheSwgbmFtZUFycmF5LCBsZW5ndGhzKTsKKworICAgIFR5cGUgKnZlcnRleERhdGFUeXBlID0gbmV3IFR5cGUobVJTQyk7CisgICAgdmVydGV4RGF0YVR5cGUtPnNldERpbVgobU1heE51bWJlck9mUXVhZHMgKiA0KTsKKyAgICB2ZXJ0ZXhEYXRhVHlwZS0+c2V0RWxlbWVudCh2ZXJ0ZXhEYXRhRWxlbSk7CisgICAgdmVydGV4RGF0YVR5cGUtPmNvbXB1dGUoKTsKKworICAgIEFsbG9jYXRpb24gKnZlcnRleEFsbG9jID0gbmV3IEFsbG9jYXRpb24obVJTQywgdmVydGV4RGF0YVR5cGUpOworICAgIG1UZXh0TWVzaFB0ciA9IChmbG9hdCopdmVydGV4QWxsb2MtPmdldFB0cigpOworCisgICAgbVZlcnRleEFycmF5LnNldCh2ZXJ0ZXhBbGxvYyk7Cit9CisKKy8vIFdlIGRvbid0IHdhbnQgdG8gYWxsb2NhdGUgYW55dGhpbmcgdW5sZXNzIHdlIGFjdHVhbGx5IGRyYXcgdGV4dAordm9pZCBGb250U3RhdGU6OmNoZWNrSW5pdCgpCit7CisgICAgaWYobUluaXRpYWxpemVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbml0VGV4dFRleHR1cmUoKTsKKyAgICBpbml0UmVuZGVyU3RhdGUoKTsKKworICAgIGluaXRWZXJ0ZXhBcnJheUJ1ZmZlcnMoKTsKKworICAgIC8vIFdlIHN0b3JlIGEgc3RyaW5nIHdpdGggbGV0dGVycyBpbiBhIHJvdWdoIGZyZXF1ZW5jeSBvZiBvY2N1cnJlbmNlCisgICAgbUxhdGluUHJlY2FjaGUgPSBTdHJpbmc4KCIgZWlzYXJudG9sY2R1Z3BtaGJ5ZnZrd3p4anEiKTsKKyAgICBtTGF0aW5QcmVjYWNoZSArPSBTdHJpbmc4KCJFSVNBUk5UT0xDRFVHUE1IQllGVktXWlhKUSIpOworICAgIG1MYXRpblByZWNhY2hlICs9IFN0cmluZzgoIiwuPyEoKS0rQDs6YCciKTsKKyAgICBtTGF0aW5QcmVjYWNoZSArPSBTdHJpbmc4KCIwMTIzNDU2Nzg5Iik7CisKKyAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworfQorCit2b2lkIEZvbnRTdGF0ZTo6aXNzdWVEcmF3Q29tbWFuZCgpIHsKKworICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgUHJvZ3JhbVZlcnRleD4gdG1wVihtUlNDLT5nZXRWZXJ0ZXgoKSk7CisgICAgbVJTQy0+c2V0VmVydGV4KG1SU0MtPmdldERlZmF1bHRQcm9ncmFtVmVydGV4KCkpOworCisgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBQcm9ncmFtUmFzdGVyPiB0bXBSKG1SU0MtPmdldFJhc3RlcigpKTsKKyAgICBtUlNDLT5zZXRSYXN0ZXIobVJTQy0+Z2V0RGVmYXVsdFByb2dyYW1SYXN0ZXIoKSk7CisKKyAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFByb2dyYW1GcmFnbWVudD4gdG1wRihtUlNDLT5nZXRGcmFnbWVudCgpKTsKKyAgICBtUlNDLT5zZXRGcmFnbWVudChtRm9udFNoYWRlckYuZ2V0KCkpOworCisgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBQcm9ncmFtU3RvcmU+IHRtcFBTKG1SU0MtPmdldEZyYWdtZW50U3RvcmUoKSk7CisgICAgbVJTQy0+c2V0RnJhZ21lbnRTdG9yZShtRm9udFByb2dyYW1TdG9yZS5nZXQoKSk7CisKKyAgICBpZihtRm9udENvbG9yRGlydHkpIHsKKyAgICAgICAgbUZvbnRTaGFkZXJGLT5zZXRDb25zdGFudENvbG9yKG1Gb250Q29sb3JbMF0sIG1Gb250Q29sb3JbMV0sIG1Gb250Q29sb3JbMl0sIG1Gb250Q29sb3JbM10pOworICAgICAgICBtRm9udENvbG9yRGlydHkgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIW1SU0MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICBtUlNDLT5zZXRWZXJ0ZXgoKFByb2dyYW1WZXJ0ZXggKil0bXBWLmdldCgpKTsKKyAgICAgICAgbVJTQy0+c2V0UmFzdGVyKChQcm9ncmFtUmFzdGVyICopdG1wUi5nZXQoKSk7CisgICAgICAgIG1SU0MtPnNldEZyYWdtZW50KChQcm9ncmFtRnJhZ21lbnQgKil0bXBGLmdldCgpKTsKKyAgICAgICAgbVJTQy0+c2V0RnJhZ21lbnRTdG9yZSgoUHJvZ3JhbVN0b3JlICopdG1wUFMuZ2V0KCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZmxvYXQgKnZ0eCA9IChmbG9hdCopbVZlcnRleEFycmF5LT5nZXRQdHIoKTsKKyAgICBmbG9hdCAqdGV4ID0gdnR4ICsgMzsKKworICAgIFZlcnRleEFycmF5IHZhOworICAgIHZhLmFkZChHTF9GTE9BVCwgMywgMjAsIGZhbHNlLCAodWludDMyX3QpdnR4LCAicG9zaXRpb24iKTsKKyAgICB2YS5hZGQoR0xfRkxPQVQsIDIsIDIwLCBmYWxzZSwgKHVpbnQzMl90KXRleCwgInRleHR1cmUwIik7CisgICAgdmEuc2V0dXBHTDIobVJTQywgJm1SU0MtPm1TdGF0ZVZlcnRleEFycmF5LCAmbVJTQy0+bVNoYWRlckNhY2hlKTsKKworICAgIG1JbmRleEJ1ZmZlci0+dXBsb2FkQ2hlY2sobVJTQyk7CisgICAgZ2xCaW5kQnVmZmVyKEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBtSW5kZXhCdWZmZXItPmdldEJ1ZmZlck9iamVjdElEKCkpOworICAgIGdsRHJhd0VsZW1lbnRzKEdMX1RSSUFOR0xFUywgbUN1cnJlbnRRdWFkSW5kZXggKiA2LCBHTF9VTlNJR05FRF9TSE9SVCwgKHVpbnQxNl90ICopKDApKTsKKworICAgIC8vIFJlc2V0IHRoZSBzdGF0ZQorICAgIG1SU0MtPnNldFZlcnRleCgoUHJvZ3JhbVZlcnRleCAqKXRtcFYuZ2V0KCkpOworICAgIG1SU0MtPnNldFJhc3RlcigoUHJvZ3JhbVJhc3RlciAqKXRtcFIuZ2V0KCkpOworICAgIG1SU0MtPnNldEZyYWdtZW50KChQcm9ncmFtRnJhZ21lbnQgKil0bXBGLmdldCgpKTsKKyAgICBtUlNDLT5zZXRGcmFnbWVudFN0b3JlKChQcm9ncmFtU3RvcmUgKil0bXBQUy5nZXQoKSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjphcHBlbmRNZXNoUXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUxLCBmbG9hdCB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUyLCBmbG9hdCB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUzLCBmbG9hdCB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHU0LCBmbG9hdCB2NCkKK3sKKyAgICBjb25zdCB1aW50MzJfdCB2ZXJ0c1BlclF1YWQgPSA0OworICAgIGNvbnN0IHVpbnQzMl90IGZsb2F0c1BlclZlcnQgPSA1OworICAgIGZsb2F0ICpjdXJyZW50UG9zID0gbVRleHRNZXNoUHRyICsgbUN1cnJlbnRRdWFkSW5kZXggKiB2ZXJ0c1BlclF1YWQgKiBmbG9hdHNQZXJWZXJ0OworCisgICAgLy8gQ3VsbCB0aGluZ3MgdGhhdCBhcmUgb2ZmIHRoZSBzY3JlZW4KKyAgICBmbG9hdCB3aWR0aCA9IChmbG9hdCltUlNDLT5nZXRXaWR0aCgpOworICAgIGZsb2F0IGhlaWdodCA9IChmbG9hdCltUlNDLT5nZXRIZWlnaHQoKTsKKworICAgIGlmKHgxID4gd2lkdGggfHwgeTEgPCAwLjBmIHx8IHgyIDwgMCB8fCB5NCA+IGhlaWdodCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLypMT0dFKCJWMCB4OiAlZiB5OiAlZiB6OiAlZiIsIHgxLCB5MSwgejEpOworICAgIExPR0UoIlYxIHg6ICVmIHk6ICVmIHo6ICVmIiwgeDIsIHkyLCB6Mik7CisgICAgTE9HRSgiVjIgeDogJWYgeTogJWYgejogJWYiLCB4MywgeTMsIHozKTsKKyAgICBMT0dFKCJWMyB4OiAlZiB5OiAlZiB6OiAlZiIsIHg0LCB5NCwgejQpOyovCisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4MTsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5MTsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6MTsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1MTsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2MTsKKworICAgICgqY3VycmVudFBvcysrKSA9IHgyOworICAgICgqY3VycmVudFBvcysrKSA9IHkyOworICAgICgqY3VycmVudFBvcysrKSA9IHoyOworICAgICgqY3VycmVudFBvcysrKSA9IHUyOworICAgICgqY3VycmVudFBvcysrKSA9IHYyOworCisgICAgKCpjdXJyZW50UG9zKyspID0geDM7CisgICAgKCpjdXJyZW50UG9zKyspID0geTM7CisgICAgKCpjdXJyZW50UG9zKyspID0gejM7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTM7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjM7CisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4NDsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5NDsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6NDsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1NDsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2NDsKKworICAgIG1DdXJyZW50UXVhZEluZGV4ICsrOworCisgICAgaWYobUN1cnJlbnRRdWFkSW5kZXggPT0gbU1heE51bWJlck9mUXVhZHMpIHsKKyAgICAgICAgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgICAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgfQorfQorCit1aW50MzJfdCBGb250U3RhdGU6OmdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKSB7CisgICAgdWludDMyX3QgcmVtYWluaW5nQ2FwYWNpdHkgPSAwOworICAgIHVpbnQzMl90IHRvdGFsUGl4ZWxzID0gMDsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgIHJlbWFpbmluZ0NhcGFjaXR5ICs9IChtQ2FjaGVMaW5lc1tpXS0+bU1heFdpZHRoIC0gbUNhY2hlTGluZXNbaV0tPm1DdXJyZW50Q29sKTsKKyAgICAgICAgIHRvdGFsUGl4ZWxzICs9IG1DYWNoZUxpbmVzW2ldLT5tTWF4V2lkdGg7CisgICAgfQorICAgIHJlbWFpbmluZ0NhcGFjaXR5ID0gKHJlbWFpbmluZ0NhcGFjaXR5ICogMTAwKSAvIHRvdGFsUGl4ZWxzOworICAgIHJldHVybiByZW1haW5pbmdDYXBhY2l0eTsKK30KKwordm9pZCBGb250U3RhdGU6OnByZWNhY2hlTGF0aW4oRm9udCAqZm9udCkgeworICAgIC8vIFJlbWFpbmluZyBjYXBhY2l0eSBpcyBtZWFzdXJlZCBpbiAlCisgICAgdWludDMyX3QgcmVtYWluaW5nQ2FwYWNpdHkgPSBnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCk7CisgICAgdWludDMyX3QgcHJlY2FjaGVJZHggPSAwOworICAgIHdoaWxlKHJlbWFpbmluZ0NhcGFjaXR5ID4gMjUgJiYgcHJlY2FjaGVJZHggPCBtTGF0aW5QcmVjYWNoZS5zaXplKCkpIHsKKyAgICAgICAgZm9udC0+Z2V0Q2FjaGVkVVRGQ2hhcigoaW50MzJfdCltTGF0aW5QcmVjYWNoZVtwcmVjYWNoZUlkeF0pOworICAgICAgICByZW1haW5pbmdDYXBhY2l0eSA9IGdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKTsKKyAgICAgICAgcHJlY2FjaGVJZHggKys7CisgICAgfQorfQorCisKK3ZvaWQgRm9udFN0YXRlOjpyZW5kZXJUZXh0KGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IGxlbiwgdWludDMyX3Qgc3RhcnRJbmRleCwgaW50IG51bUdseXBocywgaW50IHgsIGludCB5KQoreworICAgIGNoZWNrSW5pdCgpOworCisgICAgLy8gUmVuZGVyIGNvZGUgaGVyZQorICAgIEZvbnQgKmN1cnJlbnRGb250ID0gbVJTQy0+Z2V0Rm9udCgpOworICAgIGlmKCFjdXJyZW50Rm9udCkgeworICAgICAgICBpZighbURlZmF1bHQuZ2V0KCkpIHsKKyAgICAgICAgICAgIG1EZWZhdWx0LnNldChGb250OjpjcmVhdGUobVJTQywgIkRyb2lkU2Fucy50dGYiLCAxNiwgOTYpKTsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50Rm9udCA9IG1EZWZhdWx0LmdldCgpOworICAgIH0KKyAgICBpZighY3VycmVudEZvbnQpIHsKKyAgICAgICAgTE9HRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgYW55IGZvbnRzIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjdXJyZW50Rm9udC0+cmVuZGVyVVRGKHRleHQsIGxlbiwgc3RhcnRJbmRleCwgbnVtR2x5cGhzLCB4LCB5KTsKKworICAgIGlmKG1DdXJyZW50UXVhZEluZGV4ICE9IDApIHsKKyAgICAgICAgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgICAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgfQorfQorCit2b2lkIEZvbnRTdGF0ZTo6cmVuZGVyVGV4dChjb25zdCBjaGFyICp0ZXh0LCBpbnQgeCwgaW50IHkpCit7CisgICAgc2l6ZV90IHRleHRMZW4gPSBzdHJsZW4odGV4dCk7CisgICAgcmVuZGVyVGV4dCh0ZXh0LCB0ZXh0TGVuLCAwLCAtMSwgeCwgeSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpyZW5kZXJUZXh0KEFsbG9jYXRpb24gKmFsbG9jLCBpbnQgeCwgaW50IHkpCit7CisgICAgaWYoIWFsbG9jKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICp0ZXh0ID0gKGNvbnN0IGNoYXIgKilhbGxvYy0+Z2V0UHRyKCk7CisgICAgc2l6ZV90IGFsbG9jU2l6ZSA9IGFsbG9jLT5nZXRUeXBlKCktPmdldFNpemVCeXRlcygpOworICAgIHJlbmRlclRleHQodGV4dCwgYWxsb2NTaXplLCAwLCAtMSwgeCwgeSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpyZW5kZXJUZXh0KEFsbG9jYXRpb24gKmFsbG9jLCB1aW50MzJfdCBzdGFydCwgaW50IGxlbiwgaW50IHgsIGludCB5KQoreworICAgIGlmKCFhbGxvYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgY2hhciAqdGV4dCA9IChjb25zdCBjaGFyICopYWxsb2MtPmdldFB0cigpOworICAgIHNpemVfdCBhbGxvY1NpemUgPSBhbGxvYy0+Z2V0VHlwZSgpLT5nZXRTaXplQnl0ZXMoKTsKKyAgICByZW5kZXJUZXh0KHRleHQsIGFsbG9jU2l6ZSwgc3RhcnQsIGxlbiwgeCwgeSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpzZXRGb250Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkgeworICAgIG1Gb250Q29sb3JbMF0gPSByOworICAgIG1Gb250Q29sb3JbMV0gPSBnOworICAgIG1Gb250Q29sb3JbMl0gPSBiOworICAgIG1Gb250Q29sb3JbM10gPSBhOworICAgIG1Gb250Q29sb3JEaXJ0eSA9IHRydWU7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpnZXRGb250Q29sb3IoZmxvYXQgKnIsIGZsb2F0ICpnLCBmbG9hdCAqYiwgZmxvYXQgKmEpIGNvbnN0IHsKKyAgICAqciA9IG1Gb250Q29sb3JbMF07CisgICAgKmcgPSBtRm9udENvbG9yWzFdOworICAgICpiID0gbUZvbnRDb2xvclsyXTsKKyAgICAqYSA9IG1Gb250Q29sb3JbM107Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpkZWluaXQoQ29udGV4dCAqcnNjKQoreworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgbUluZGV4QnVmZmVyLmNsZWFyKCk7CisgICAgbVZlcnRleEFycmF5LmNsZWFyKCk7CisKKyAgICBtRm9udFNoYWRlckYuY2xlYXIoKTsKKyAgICBtRm9udFNhbXBsZXIuY2xlYXIoKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS5jbGVhcigpOworCisgICAgbVRleHRUZXh0dXJlLmNsZWFyKCk7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGRlbGV0ZSBtQ2FjaGVMaW5lc1tpXTsKKyAgICB9CisgICAgbUNhY2hlTGluZXMuY2xlYXIoKTsKKworICAgIG1EZWZhdWx0LmNsZWFyKCk7CisKKyAgICBWZWN0b3I8Rm9udCo+IGZvbnRzVG9EZXJlZmVyZW5jZSA9IG1BY3RpdmVGb250czsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBmb250c1RvRGVyZWZlcmVuY2Uuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGZvbnRzVG9EZXJlZmVyZW5jZVtpXS0+emVyb1VzZXJSZWYoKTsKKyAgICB9CisKKyAgICBpZihtTGlicmFyeSkgeworICAgICAgICBGVF9Eb25lX0ZyZWVUeXBlKCBtTGlicmFyeSApOworICAgICAgICBtTGlicmFyeSA9IE5VTEw7CisgICAgfQorfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworUnNGb250IHJzaV9Gb250Q3JlYXRlRnJvbUZpbGUoQ29udGV4dCAqcnNjLCBjaGFyIGNvbnN0ICpuYW1lLCB1aW50MzJfdCBmb250U2l6ZSwgdWludDMyX3QgZHBpKQoreworICAgIEZvbnQgKm5ld0ZvbnQgPSBGb250OjpjcmVhdGUocnNjLCBuYW1lLCBmb250U2l6ZSwgZHBpKTsKKyAgICBpZihuZXdGb250KSB7CisgICAgICAgIG5ld0ZvbnQtPmluY1VzZXJSZWYoKTsKKyAgICB9CisgICAgcmV0dXJuIG5ld0ZvbnQ7Cit9CisKK30gLy8gcmVuZGVyc2NyaXB0Cit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNGb250LmggYi9saWJzL3JzL3JzRm9udC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZmUzOGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzRm9udC5oCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0ZPTlRfSAorI2RlZmluZSBBTkRST0lEX1JTX0ZPTlRfSAorCisjaW5jbHVkZSAiUmVuZGVyU2NyaXB0LmgiCisjaW5jbHVkZSAicnNTdHJlYW0uaCIKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgRm9udFN0YXRlOworCitjbGFzcyBGb250IDogcHVibGljIE9iamVjdEJhc2UKK3sKK3B1YmxpYzoKKyAgICB+Rm9udCgpOworCisgICAgLy8gUG9pbnRlciB0byB0aGUgdXRmIGRhdGEsIGxlbmd0aCBvZiBkYXRhLCB3aGVyZSB0byBzdGFydCwgbnVtYmVyIG9mIGdseXBocyBvdCByZWFkCisgICAgLy8gKGVhY2ggZ2x5cGggbWF5IGJlIGxvbmdlciB0aGFuIGEgY2hhciBiZWNhdXNlIHdlIGFyZSBkZWFsaW5nIHdpdGggdXRmIGRhdGEpCisgICAgLy8gTGFzdCB0d28gdmFyaWFibGVzIGFyZSB0aGUgaW5pdGlhbCBwZW4gcG9zaXRpb24KKyAgICB2b2lkIHJlbmRlclVURihjb25zdCBjaGFyICp0ZXh0LCB1aW50MzJfdCBsZW4sIHVpbnQzMl90IHN0YXJ0LCBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHkpOworCisgICAgLy8gQ3VycmVudGx5IGZpbGVzIGRvIG5vdCBnZXQgc2VyaWFsaXplZCwKKyAgICAvLyBidXQgd2UgbmVlZCB0byBpbmhlcml0IGZyb20gT2JqZWN0QmFzZSBmb3IgcmVmIHRyYWNraW5nCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0IHsKKyAgICB9CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9VTktOT1dOOworICAgIH0KKworICAgIHN0YXRpYyBGb250ICogY3JlYXRlKENvbnRleHQgKnJzYywgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgZm9udFNpemUsIHVpbnQzMl90IGRwaSk7CisKK3Byb3RlY3RlZDoKKworICAgIGZyaWVuZCBjbGFzcyBGb250U3RhdGU7CisKKyAgICB2b2lkIGludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKTsKKyAgICBzdHJ1Y3QgQ2FjaGVkR2x5cGhJbmZvCisgICAgeworICAgICAgICAvLyBIYXMgdGhlIGNhY2hlIGJlZW4gaW52YWxpZGF0ZWQ/CisgICAgICAgIGJvb2wgbUlzVmFsaWQ7CisgICAgICAgIC8vIExvY2F0aW9uIG9mIHRoZSBjYWNoZWQgZ2x5cGggaW4gdGhlIGJpdG1hcAorICAgICAgICAvLyBpbiBjYXNlIHdlIG5lZWQgdG8gcmVzaXplIHRoZSB0ZXh0dXJlCisgICAgICAgIHVpbnQzMl90IG1CaXRtYXBNaW5YOworICAgICAgICB1aW50MzJfdCBtQml0bWFwTWluWTsKKyAgICAgICAgdWludDMyX3QgbUJpdG1hcFdpZHRoOworICAgICAgICB1aW50MzJfdCBtQml0bWFwSGVpZ2h0OworICAgICAgICAvLyBBbHNvIGNhY2hlIHRleHR1cmUgY29vcmRzIGZvciB0aGUgcXVhZAorICAgICAgICBmbG9hdCBtQml0bWFwTWluVTsKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1pblY7CisgICAgICAgIGZsb2F0IG1CaXRtYXBNYXhVOworICAgICAgICBmbG9hdCBtQml0bWFwTWF4VjsKKyAgICAgICAgLy8gTWluaW1pemUgaG93IG11Y2ggd2UgY2FsbCBmcmVldHlwZQorICAgICAgICBGVF9VSW50IG1HbHlwaEluZGV4OworICAgICAgICBGVF9WZWN0b3IgbUFkdmFuY2U7CisgICAgICAgIC8vIFZhbHVlcyBiZWxvdyBjb250YWluIGEgZ2x5cGgncyBvcmlnaW4gaW4gdGhlIGJpdG1hcAorICAgICAgICBGVF9JbnQgbUJpdG1hcExlZnQ7CisgICAgICAgIEZUX0ludCBtQml0bWFwVG9wOworICAgIH07CisKKyAgICBTdHJpbmc4IG1Gb250TmFtZTsKKyAgICB1aW50MzJfdCBtRm9udFNpemU7CisgICAgdWludDMyX3QgbURwaTsKKworICAgIEZvbnQoQ29udGV4dCAqcnNjKTsKKyAgICBib29sIGluaXQoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgZm9udFNpemUsIHVpbnQzMl90IGRwaSk7CisKKyAgICBGVF9GYWNlIG1GYWNlOworICAgIGJvb2wgbUluaXRpYWxpemVkOworICAgIGJvb2wgbUhhc0tlcm5pbmc7CisKKyAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8dWludDMyX3QsIENhY2hlZEdseXBoSW5mbyogPiBtQ2FjaGVkR2x5cGhzOworICAgIENhY2hlZEdseXBoSW5mbyogZ2V0Q2FjaGVkVVRGQ2hhcihpbnQzMl90IHV0ZkNoYXIpOworCisgICAgQ2FjaGVkR2x5cGhJbmZvICpjYWNoZUdseXBoKHVpbnQzMl90IGdseXBoKTsKKyAgICB2b2lkIHVwZGF0ZUdseXBoQ2FjaGUoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCk7CisgICAgdm9pZCBkcmF3Q2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5KTsKK307CisKK2NsYXNzIEZvbnRTdGF0ZQoreworcHVibGljOgorICAgIEZvbnRTdGF0ZSgpOworICAgIH5Gb250U3RhdGUoKTsKKworICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MpOworICAgIHZvaWQgZGVpbml0KENvbnRleHQgKnJzYyk7CisKKyAgICBPYmplY3RCYXNlUmVmPEZvbnQ+IG1EZWZhdWx0OworICAgIE9iamVjdEJhc2VSZWY8Rm9udD4gbUxhc3Q7CisKKyAgICB2b2lkIHJlbmRlclRleHQoY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuLCB1aW50MzJfdCBzdGFydEluZGV4LCBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHkpOworICAgIHZvaWQgcmVuZGVyVGV4dChjb25zdCBjaGFyICp0ZXh0LCBpbnQgeCwgaW50IHkpOworICAgIHZvaWQgcmVuZGVyVGV4dChBbGxvY2F0aW9uICphbGxvYywgaW50IHgsIGludCB5KTsKKyAgICB2b2lkIHJlbmRlclRleHQoQWxsb2NhdGlvbiAqYWxsb2MsIHVpbnQzMl90IHN0YXJ0LCBpbnQgbGVuLCBpbnQgeCwgaW50IHkpOworCisgICAgdm9pZCBzZXRGb250Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSk7CisgICAgdm9pZCBnZXRGb250Q29sb3IoZmxvYXQgKnIsIGZsb2F0ICpnLCBmbG9hdCAqYiwgZmxvYXQgKmEpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisKKyAgICBmcmllbmQgY2xhc3MgRm9udDsKKworICAgIHN0cnVjdCBDYWNoZVRleHR1cmVMaW5lCisgICAgeworICAgICAgICB1aW50MzJfdCBtTWF4SGVpZ2h0OworICAgICAgICB1aW50MzJfdCBtTWF4V2lkdGg7CisgICAgICAgIHVpbnQzMl90IG1DdXJyZW50Um93OworICAgICAgICB1aW50MzJfdCBtQ3VycmVudENvbDsKKyAgICAgICAgYm9vbCBtRGlydHk7CisKKyAgICAgICAgQ2FjaGVUZXh0dXJlTGluZSh1aW50MzJfdCBtYXhIZWlnaHQsIHVpbnQzMl90IG1heFdpZHRoLCB1aW50MzJfdCBjdXJyZW50Um93LCB1aW50MzJfdCBjdXJyZW50Q29sKSA6CisgICAgICAgICAgICBtTWF4SGVpZ2h0KG1heEhlaWdodCksIG1NYXhXaWR0aChtYXhXaWR0aCksIG1DdXJyZW50Um93KGN1cnJlbnRSb3cpLCBtQ3VycmVudENvbChjdXJyZW50Q29sKSwKKyAgICAgICAgICAgIG1EaXJ0eShmYWxzZSkgIHsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgZml0Qml0bWFwKEZUX0JpdG1hcCAqYml0bWFwLCB1aW50MzJfdCAqcmV0T3JpZ2luWCwgdWludDMyX3QgKnJldE9yaWdpblkpIHsKKyAgICAgICAgICAgIGlmKCh1aW50MzJfdCliaXRtYXAtPnJvd3MgPiBtTWF4SGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihtQ3VycmVudENvbCArICh1aW50MzJfdCliaXRtYXAtPndpZHRoIDwgbU1heFdpZHRoKSB7CisgICAgICAgICAgICAgICAqcmV0T3JpZ2luWCA9IG1DdXJyZW50Q29sOworICAgICAgICAgICAgICAgKnJldE9yaWdpblkgPSBtQ3VycmVudFJvdzsKKyAgICAgICAgICAgICAgIG1DdXJyZW50Q29sICs9IGJpdG1hcC0+d2lkdGg7CisgICAgICAgICAgICAgICBtRGlydHkgPSB0cnVlOworICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBWZWN0b3I8Q2FjaGVUZXh0dXJlTGluZSo+IG1DYWNoZUxpbmVzOworICAgIHVpbnQzMl90IGdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKTsKKworICAgIHZvaWQgcHJlY2FjaGVMYXRpbihGb250ICpmb250KTsKKyAgICBTdHJpbmc4IG1MYXRpblByZWNhY2hlOworCisgICAgQ29udGV4dCAqbVJTQzsKKworICAgIGZsb2F0IG1Gb250Q29sb3JbNF07CisgICAgYm9vbCBtRm9udENvbG9yRGlydHk7CisKKyAgICAvLyBGcmVlIHR5cGUgbGlicmFyeSwgd2Ugb25seSBuZWVkIG9uZSBjb3B5CisgICAgRlRfTGlicmFyeSBtTGlicmFyeTsKKyAgICBGVF9MaWJyYXJ5IGdldExpYigpOworICAgIFZlY3RvcjxGb250Kj4gbUFjdGl2ZUZvbnRzOworCisgICAgLy8gUmVuZGVyIHN0YXRlIGZvciB0aGUgZm9udAorICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50PiBtRm9udFNoYWRlckY7CisgICAgT2JqZWN0QmFzZVJlZjxTYW1wbGVyPiBtRm9udFNhbXBsZXI7CisgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IG1Gb250UHJvZ3JhbVN0b3JlOworICAgIHZvaWQgaW5pdFJlbmRlclN0YXRlKCk7CisKKyAgICAvLyBUZXh0dXJlIHRvIGNhY2hlIGdseXBoIGJpdG1hcHMKKyAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1UZXh0VGV4dHVyZTsKKyAgICB2b2lkIGluaXRUZXh0VGV4dHVyZSgpOworCisgICAgYm9vbCBjYWNoZUJpdG1hcChGVF9CaXRtYXAgKmJpdG1hcCwgdWludDMyX3QgKnJldE9yaWdpblgsIHVpbnQzMl90ICpyZXRPcmlnaW5ZKTsKKyAgICBjb25zdCBUeXBlKiBnZXRDYWNoZVRleHR1cmVUeXBlKCkgeworICAgICAgICByZXR1cm4gbVRleHRUZXh0dXJlLT5nZXRUeXBlKCk7CisgICAgfQorCisgICAgdm9pZCBmbHVzaEFsbEFuZEludmFsaWRhdGUoKTsKKworICAgIC8vIFBvaW50ZXIgdG8gdmVydGV4IGRhdGEgdG8gc3BlZWQgdXAgZnJhbWUgdG8gZnJhbWUgd29yaworICAgIGZsb2F0ICptVGV4dE1lc2hQdHI7CisgICAgdWludDMyX3QgbUN1cnJlbnRRdWFkSW5kZXg7CisgICAgdWludDMyX3QgbU1heE51bWJlck9mUXVhZHM7CisKKyAgICB2b2lkIGluaXRWZXJ0ZXhBcnJheUJ1ZmZlcnMoKTsKKyAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1JbmRleEJ1ZmZlcjsKKyAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1WZXJ0ZXhBcnJheTsKKworCisgICAgYm9vbCBtSW5pdGlhbGl6ZWQ7CisKKyAgICB2b2lkIGNoZWNrSW5pdCgpOworCisgICAgdm9pZCBpc3N1ZURyYXdDb21tYW5kKCk7CisKKyAgICB2b2lkIGFwcGVuZE1lc2hRdWFkKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUxLCBmbG9hdCB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTIsIGZsb2F0IHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MywgZmxvYXQgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHU0LCBmbG9hdCB2NCk7CisKK307CisKKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNIYW5kY29kZS5oIGIvbGlicy9ycy9yc0hhbmRjb2RlLmgKaW5kZXggODAwZWRkZC4uYzAyZmQ0MiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0hhbmRjb2RlLmgKKysrIGIvbGlicy9ycy9yc0hhbmRjb2RlLmgKQEAgLTEsNiArMSw1NyBAQAogCiAjZGVmaW5lIERBVEFfU1lOQ19TSVpFIDEwMjQKIAorc3RhdGljIGlubGluZSB2b2lkIHJzSENBUElfQ29udGV4dEZpbmlzaCAoUnNDb250ZXh0IHJzYykKK3sKKyAgICBUaHJlYWRJTyAqaW8gPSAmKChDb250ZXh0ICopcnNjKS0+bUlPOworICAgIHVpbnQzMl90IHNpemUgPSBzaXplb2YoUlNfQ01EX0NvbnRleHRGaW5pc2gpOworICAgIFJTX0NNRF9Db250ZXh0RmluaXNoICpjbWQgPSBzdGF0aWNfY2FzdDxSU19DTURfQ29udGV4dEZpbmlzaCAqPihpby0+bVRvQ29yZS5yZXNlcnZlKHNpemUpKTsKKyAgICBpby0+bVRvQ29yZS5jb21taXRTeW5jKFJTX0NNRF9JRF9Db250ZXh0RmluaXNoLCBzaXplKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJzSENBUElfU2NyaXB0SW52b2tlViAoUnNDb250ZXh0IHJzYywgUnNTY3JpcHQgdmEsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKiBkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCit7CisgICAgVGhyZWFkSU8gKmlvID0gJigoQ29udGV4dCAqKXJzYyktPm1JTzsKKyAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKFJTX0NNRF9TY3JpcHRJbnZva2VWKTsKKyAgICBpZiAoc2l6ZUJ5dGVzIDwgREFUQV9TWU5DX1NJWkUpIHsKKyAgICAgICAgc2l6ZSArPSAoc2l6ZUJ5dGVzICsgMykgJiB+MzsKKyAgICB9CisgICAgUlNfQ01EX1NjcmlwdEludm9rZVYgKmNtZCA9IHN0YXRpY19jYXN0PFJTX0NNRF9TY3JpcHRJbnZva2VWICo+KGlvLT5tVG9Db3JlLnJlc2VydmUoc2l6ZSkpOworICAgIGNtZC0+cyA9IHZhOworICAgIGNtZC0+c2xvdCA9IHNsb3Q7CisgICAgY21kLT5kYXRhTGVuID0gc2l6ZUJ5dGVzOworICAgIGNtZC0+ZGF0YSA9IGRhdGE7CisgICAgaWYgKHNpemVCeXRlcyA8IERBVEFfU1lOQ19TSVpFKSB7CisgICAgICAgIGNtZC0+ZGF0YSA9ICh2b2lkICopKGNtZCsxKTsKKyAgICAgICAgbWVtY3B5KGNtZCsxLCBkYXRhLCBzaXplQnl0ZXMpOworICAgICAgICBpby0+bVRvQ29yZS5jb21taXQoUlNfQ01EX0lEX1NjcmlwdEludm9rZVYsIHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlvLT5tVG9Db3JlLmNvbW1pdFN5bmMoUlNfQ01EX0lEX1NjcmlwdEludm9rZVYsIHNpemUpOworICAgIH0KK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgcnNIQ0FQSV9TY3JpcHRTZXRWYXJWIChSc0NvbnRleHQgcnNjLCBSc1NjcmlwdCB2YSwgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqIGRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKK3sKKyAgICBUaHJlYWRJTyAqaW8gPSAmKChDb250ZXh0ICopcnNjKS0+bUlPOworICAgIHVpbnQzMl90IHNpemUgPSBzaXplb2YoUlNfQ01EX1NjcmlwdFNldFZhclYpOworICAgIGlmIChzaXplQnl0ZXMgPCBEQVRBX1NZTkNfU0laRSkgeworICAgICAgICBzaXplICs9IChzaXplQnl0ZXMgKyAzKSAmIH4zOworICAgIH0KKyAgICBSU19DTURfU2NyaXB0U2V0VmFyViAqY21kID0gc3RhdGljX2Nhc3Q8UlNfQ01EX1NjcmlwdFNldFZhclYgKj4oaW8tPm1Ub0NvcmUucmVzZXJ2ZShzaXplKSk7CisgICAgY21kLT5zID0gdmE7CisgICAgY21kLT5zbG90ID0gc2xvdDsKKyAgICBjbWQtPmRhdGFMZW4gPSBzaXplQnl0ZXM7CisgICAgY21kLT5kYXRhID0gZGF0YTsKKyAgICBpZiAoc2l6ZUJ5dGVzIDwgREFUQV9TWU5DX1NJWkUpIHsKKyAgICAgICAgY21kLT5kYXRhID0gKHZvaWQgKikoY21kKzEpOworICAgICAgICBtZW1jcHkoY21kKzEsIGRhdGEsIHNpemVCeXRlcyk7CisgICAgICAgIGlvLT5tVG9Db3JlLmNvbW1pdChSU19DTURfSURfU2NyaXB0U2V0VmFyViwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW8tPm1Ub0NvcmUuY29tbWl0U3luYyhSU19DTURfSURfU2NyaXB0U2V0VmFyViwgc2l6ZSk7CisgICAgfQorfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgcnNIQ0FQSV9BbGxvY2F0aW9uRGF0YSAoUnNDb250ZXh0IHJzYywgUnNBbGxvY2F0aW9uIHZhLCBjb25zdCB2b2lkICogZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQogewogICAgIFRocmVhZElPICppbyA9ICYoKENvbnRleHQgKilyc2MpLT5tSU87CkBAIC00NSwzICs5NiwyNiBAQAogCiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCByc0hDQVBJX0FsbG9jYXRpb24xRFN1YkVsZW1lbnREYXRhIChSc0NvbnRleHQgcnNjLCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHgsIGNvbnN0IHZvaWQgKiBkYXRhLCB1aW50MzJfdCBjb21wX29mZnNldCwgdWludDMyX3Qgc2l6ZUJ5dGVzKQoreworICAgIFRocmVhZElPICppbyA9ICYoKENvbnRleHQgKilyc2MpLT5tSU87CisgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihSU19DTURfQWxsb2NhdGlvbjFEU3ViRWxlbWVudERhdGEpOworICAgIGlmIChzaXplQnl0ZXMgPCBEQVRBX1NZTkNfU0laRSkgeworICAgICAgICBzaXplICs9IChzaXplQnl0ZXMgKyAzKSAmIH4zOworICAgIH0KKyAgICBSU19DTURfQWxsb2NhdGlvbjFEU3ViRWxlbWVudERhdGEgKmNtZCA9IHN0YXRpY19jYXN0PFJTX0NNRF9BbGxvY2F0aW9uMURTdWJFbGVtZW50RGF0YSAqPihpby0+bVRvQ29yZS5yZXNlcnZlKHNpemUpKTsKKyAgICBjbWQtPnZhID0gdmE7CisgICAgY21kLT54ID0geDsKKyAgICBjbWQtPmRhdGEgPSBkYXRhOworICAgIGNtZC0+Y29tcF9vZmZzZXQgPSBjb21wX29mZnNldDsKKyAgICBjbWQtPmJ5dGVzID0gc2l6ZUJ5dGVzOworICAgIGlmIChzaXplQnl0ZXMgPCBEQVRBX1NZTkNfU0laRSkgeworICAgICAgICBjbWQtPmRhdGEgPSAodm9pZCAqKShjbWQrMSk7CisgICAgICAgIG1lbWNweShjbWQrMSwgZGF0YSwgc2l6ZUJ5dGVzKTsKKyAgICAgICAgaW8tPm1Ub0NvcmUuY29tbWl0KFJTX0NNRF9JRF9BbGxvY2F0aW9uMURTdWJFbGVtZW50RGF0YSwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW8tPm1Ub0NvcmUuY29tbWl0U3luYyhSU19DTURfSURfQWxsb2NhdGlvbjFEU3ViRWxlbWVudERhdGEsIHNpemUpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTGlnaHQuY3BwIGIvbGlicy9ycy9yc0xpZ2h0LmNwcAppbmRleCA2ZjJjZjNlLi5lYWI5YTA3IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTGlnaHQuY3BwCisrKyBiL2xpYnMvcnMvcnNMaWdodC5jcHAKQEAgLTE0LDkgKzE0LDEzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKLQogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtNjUsNiArNjksMTYgQEAKICAgICBnbExpZ2h0ZnYoR0xfTElHSFQwICsgbnVtLCBHTF9QT1NJVElPTiwgbVBvc2l0aW9uKTsKIH0KIAordm9pZCBMaWdodDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAKK30KKworTGlnaHQgKkxpZ2h0OjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIHJldHVybiBOVUxMOworfQorCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBMaWdodFN0YXRlOjpMaWdodFN0YXRlKCkKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNMaWdodC5oIGIvbGlicy9ycy9yc0xpZ2h0LmgKaW5kZXggZDg3OTZlNi4uYmQ1ODk3OSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0xpZ2h0LmgKKysrIGIvbGlicy9ycy9yc0xpZ2h0LmgKQEAgLTM3LDYgKzM3LDkgQEAKICAgICB2b2lkIHNldENvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpOwogCiAgICAgdm9pZCBzZXR1cEdMKHVpbnQzMl90IG51bSkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfTElHSFQ7IH0KKyAgICBzdGF0aWMgTGlnaHQgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOwogCiBwcm90ZWN0ZWQ6CiAgICAgZmxvYXQgbUNvbG9yWzRdOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5jcHAgYi9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmNwcAppbmRleCBjNzk2NTIwLi4wMTllYTcyIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmNwcAorKysgYi9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmNwcApAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgInJzTG9ja2xlc3NGaWZvLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwogCiBMb2NrbGVzc0NvbW1hbmRGaWZvOjpMb2NrbGVzc0NvbW1hbmRGaWZvKCkKIHsKQEAgLTEyOCwxNSArMTI4LDE5IEBACiAgICAgLy9kdW1wU3RhdGUoImZsdXNoIDIiKTsKIH0KIAordm9pZCBMb2NrbGVzc0NvbW1hbmRGaWZvOjp3YWl0KCkKK3sKKyAgICB3aGlsZShpc0VtcHR5KCkgJiYgIW1JblNodXRkb3duKSB7CisgICAgICAgIG1TaWduYWxUb0NvbnRyb2wuc2V0KCk7CisgICAgICAgIG1TaWduYWxUb1dvcmtlci53YWl0KCk7CisgICAgfQorfQorCiBjb25zdCB2b2lkICogTG9ja2xlc3NDb21tYW5kRmlmbzo6Z2V0KHVpbnQzMl90ICpjb21tYW5kLCB1aW50MzJfdCAqYnl0ZXNEYXRhKQogewogICAgIHdoaWxlKDEpIHsKICAgICAgICAgLy9kdW1wU3RhdGUoImdldCIpOwotICAgICAgICB3aGlsZShpc0VtcHR5KCkgJiYgIW1JblNodXRkb3duKSB7Ci0gICAgICAgICAgICBtU2lnbmFsVG9Db250cm9sLnNldCgpOwotICAgICAgICAgICAgbVNpZ25hbFRvV29ya2VyLndhaXQoKTsKLSAgICAgICAgfQotCisgICAgICAgIHdhaXQoKTsKICAgICAgICAgaWYgKG1JblNodXRkb3duKSB7CiAgICAgICAgICAgICAqY29tbWFuZCA9IDA7CiAgICAgICAgICAgICAqYnl0ZXNEYXRhID0gMDsKQEAgLTE2NSw2ICsxNjksMzAgQEAKICAgICAvL2R1bXBTdGF0ZSgibmV4dCIpOwogfQogCitib29sIExvY2tsZXNzQ29tbWFuZEZpZm86Om1ha2VTcGFjZU5vbkJsb2NraW5nKHVpbnQzMl90IGJ5dGVzKQoreworICAgIC8vZHVtcFN0YXRlKCJtYWtlIHNwYWNlIG5vbi1ibG9ja2luZyIpOworICAgIGlmICgobVB1dCtieXRlcykgPiBtRW5kKSB7CisgICAgICAgIC8vIE5lZWQgdG8gbG9vcCByZWdhcmRsZXNzIG9mIHdoZXJlIGdldCBpcy4KKyAgICAgICAgaWYoKG1HZXQgPiBtUHV0KSAmJiAobUJ1ZmZlcis0ID49IG1HZXQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUb3NzIGluIGEgcmVzZXQgdGhlbiB0aGUgbm9ybWFsIHdhaXQgZm9yIHNwYWNlIHdpbGwgZG8gdGhlIHJlc3QuCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QgKj4obVB1dClbMF0gPSAwOworICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQxNl90ICo+KG1QdXQpWzFdID0gMDsKKyAgICAgICAgbVB1dCA9IG1CdWZmZXI7CisgICAgICAgIG1TaWduYWxUb1dvcmtlci5zZXQoKTsKKyAgICB9CisKKyAgICAvLyBpdCB3aWxsIGZpdCBoZXJlIHNvIHdlIGp1c3QgbmVlZCB0byB3YWl0IGZvciBzcGFjZS4KKyAgICBpZihnZXRGcmVlU3BhY2UoKSA8IGJ5dGVzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogdm9pZCBMb2NrbGVzc0NvbW1hbmRGaWZvOjptYWtlU3BhY2UodWludDMyX3QgYnl0ZXMpCiB7CiAgICAgLy9kdW1wU3RhdGUoIm1ha2Ugc3BhY2UiKTsKQEAgLTE3OCw2ICsyMDYsNyBAQAogICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQxNl90ICo+KG1QdXQpWzBdID0gMDsKICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCAqPihtUHV0KVsxXSA9IDA7CiAgICAgICAgIG1QdXQgPSBtQnVmZmVyOworICAgICAgICBtU2lnbmFsVG9Xb3JrZXIuc2V0KCk7CiAgICAgfQogCiAgICAgLy8gaXQgd2lsbCBmaXQgaGVyZSBzbyB3ZSBqdXN0IG5lZWQgdG8gd2FpdCBmb3Igc3BhY2UuCkBAIC0xODksODIgKzIxOCw2IEBACiAKIHZvaWQgTG9ja2xlc3NDb21tYW5kRmlmbzo6ZHVtcFN0YXRlKGNvbnN0IGNoYXIgKnMpIGNvbnN0CiB7Ci0gICAgTE9HVigiJXMgIHB1dCAlcCwgZ2V0ICVwLCAgYnVmICVwLCAgZW5kICVwIiwgcywgbVB1dCwgbUdldCwgbUJ1ZmZlciwgbUVuZCk7Ci19Ci0KLUxvY2tsZXNzQ29tbWFuZEZpZm86OlNpZ25hbDo6U2lnbmFsKCkKLXsKLSAgICBtU2V0ID0gdHJ1ZTsKLX0KLQotTG9ja2xlc3NDb21tYW5kRmlmbzo6U2lnbmFsOjp+U2lnbmFsKCkKLXsKLSAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1NdXRleCk7Ci0gICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJm1Db25kaXRpb24pOwotfQotCi1ib29sIExvY2tsZXNzQ29tbWFuZEZpZm86OlNpZ25hbDo6aW5pdCgpCi17Ci0gICAgaW50IHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfaW5pdCgmbU11dGV4LCBOVUxMKTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkxvY2tsZXNzRmlmbyBtdXRleCBpbml0IGZhaWx1cmUiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9pbml0KCZtQ29uZGl0aW9uLCBOVUxMKTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkxvY2tsZXNzRmlmbyBjb25kaXRpb24gaW5pdCBmYWlsdXJlIik7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbU11dGV4KTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIExvY2tsZXNzQ29tbWFuZEZpZm86OlNpZ25hbDo6c2V0KCkKLXsKLSAgICBpbnQgc3RhdHVzOwotCi0gICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgbG9ja2luZyBmb3Igc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbVNldCA9IHRydWU7Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfc2lnbmFsKCZtQ29uZGl0aW9uKTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIG9uIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIHVubG9ja2luZyBmb3Igc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgIH0KLX0KLQotdm9pZCBMb2NrbGVzc0NvbW1hbmRGaWZvOjpTaWduYWw6OndhaXQoKQotewotICAgIGludCBzdGF0dXM7Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSBsb2NraW5nIGZvciBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghbVNldCkgewotICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfd2FpdCgmbUNvbmRpdGlvbiwgJm1NdXRleCk7Ci0gICAgICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIHdhaXRpbmcgb24gY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbVNldCA9IGZhbHNlOwotCi0gICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSB1bmxvY2tpbmcgZm9yIGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgIH0KKyAgICBMT0dWKCIlcyAlcCAgcHV0ICVwLCBnZXQgJXAsICBidWYgJXAsICBlbmQgJXAiLCBzLCB0aGlzLCBtUHV0LCBtR2V0LCBtQnVmZmVyLCBtRW5kKTsKIH0KIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5oIGIvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5oCmluZGV4IGQwYTQzNTYuLmI4Y2VlZWQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uaAorKysgYi9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmgKQEAgLTE5LDggKzE5LDEwIEBACiAKIAogI2luY2x1ZGUgInJzVXRpbHMuaCIKKyNpbmNsdWRlICJyc1NpZ25hbC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIAogCiAvLyBBIHNpbXBsZSBGSUZPIHRvIGJlIHVzZWQgYXMgYSBwcm9kdWNlciAvIGNvbnN1bWVyIGJldHdlZW4gdHdvCkBAIC0zNywyNCArMzksNyBAQAogICAgIExvY2tsZXNzQ29tbWFuZEZpZm8oKTsKICAgICB+TG9ja2xlc3NDb21tYW5kRmlmbygpOwogCi0KIHByb3RlY3RlZDoKLSAgICBjbGFzcyBTaWduYWwgewotICAgIHB1YmxpYzoKLSAgICAgICAgU2lnbmFsKCk7Ci0gICAgICAgIH5TaWduYWwoKTsKLQotICAgICAgICBib29sIGluaXQoKTsKLQotICAgICAgICB2b2lkIHNldCgpOwotICAgICAgICB2b2lkIHdhaXQoKTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgYm9vbCBtU2V0OwotICAgICAgICBwdGhyZWFkX211dGV4X3QgbU11dGV4OwotICAgICAgICBwdGhyZWFkX2NvbmRfdCBtQ29uZGl0aW9uOwotICAgIH07Ci0KICAgICB1aW50OF90ICogdm9sYXRpbGUgbVB1dDsKICAgICB1aW50OF90ICogdm9sYXRpbGUgbUdldDsKICAgICB1aW50OF90ICogbUJ1ZmZlcjsKQEAgLTY1LDE4ICs1MCwxOSBAQAogICAgIFNpZ25hbCBtU2lnbmFsVG9Xb3JrZXI7CiAgICAgU2lnbmFsIG1TaWduYWxUb0NvbnRyb2w7CiAKLQotCiBwdWJsaWM6CiAgICAgdm9pZCAqIHJlc2VydmUodWludDMyX3QgYnl0ZXMpOwogICAgIHZvaWQgY29tbWl0KHVpbnQzMl90IGNvbW1hbmQsIHVpbnQzMl90IGJ5dGVzKTsKICAgICB2b2lkIGNvbW1pdFN5bmModWludDMyX3QgY29tbWFuZCwgdWludDMyX3QgYnl0ZXMpOwogCiAgICAgdm9pZCBmbHVzaCgpOworICAgIHZvaWQgd2FpdCgpOworCiAgICAgY29uc3Qgdm9pZCAqIGdldCh1aW50MzJfdCAqY29tbWFuZCwgdWludDMyX3QgKmJ5dGVzRGF0YSk7CiAgICAgdm9pZCBuZXh0KCk7CiAKICAgICB2b2lkIG1ha2VTcGFjZSh1aW50MzJfdCBieXRlcyk7CisgICAgYm9vbCBtYWtlU3BhY2VOb25CbG9ja2luZyh1aW50MzJfdCBieXRlcyk7CiAKICAgICBib29sIGlzRW1wdHkoKSBjb25zdDsKICAgICB1aW50MzJfdCBnZXRGcmVlU3BhY2UoKSBjb25zdDsKQEAgLTg4LDQgKzc0LDUgQEAKIAogCiB9Cit9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNNYXRyaXguY3BwIGIvbGlicy9ycy9yc01hdHJpeC5jcHAKaW5kZXggMmYyMTQwNS4uOTRlZWYxMyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc01hdHJpeC5jcHAKKysrIGIvbGlicy9ycy9yc01hdHJpeC5jcHAKQEAgLTczLDcgKzczLDcgQEAKICAgICBzID0gc2luZihyb3QpOwogCiAgICAgY29uc3QgZmxvYXQgbGVuID0gc3FydGYoeCp4ICsgeSp5ICsgeip6KTsKLSAgICBpZiAoIShsZW4gIT0gMSkpIHsKKyAgICBpZiAobGVuICE9IDEpIHsKICAgICAgICAgY29uc3QgZmxvYXQgcmVjaXBMZW4gPSAxLmYgLyBsZW47CiAgICAgICAgIHggKj0gcmVjaXBMZW47CiAgICAgICAgIHkgKj0gcmVjaXBMZW47CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTWVzaC5jcHAgYi9saWJzL3JzL3JzTWVzaC5jcHAKaW5kZXggZDU5NWI0ZS4uODEwZTRmZiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc01lc2guY3BwCisrKyBiL2xpYnMvcnMvcnNNZXNoLmNwcApAQCAtMTQsMjggKzE0LDI1OCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCiAKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjaW5jbHVkZSA8T3BlbkdsL2dsZXh0Lmg+CisjZW5kaWYKKworCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CiAKLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCiBNZXNoOjpNZXNoKENvbnRleHQgKnJzYykgOiBPYmplY3RCYXNlKHJzYykKIHsKICAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CiAgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwotICAgIG1WZXJ0aWNpZXMgPSBOVUxMOwotICAgIG1WZXJ0aWNpZXNDb3VudCA9IDA7CiAgICAgbVByaW1pdGl2ZXMgPSBOVUxMOwogICAgIG1QcmltaXRpdmVzQ291bnQgPSAwOworICAgIG1WZXJ0ZXhCdWZmZXJzID0gTlVMTDsKKyAgICBtVmVydGV4QnVmZmVyQ291bnQgPSAwOwogfQogCiBNZXNoOjp+TWVzaCgpCiB7CisgICAgaWYobVZlcnRleEJ1ZmZlcnMpIHsKKyAgICAgICAgZGVsZXRlW10gbVZlcnRleEJ1ZmZlcnM7CisgICAgfQorCisgICAgaWYobVByaW1pdGl2ZXMpIHsKKyAgICAgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbVByaW1pdGl2ZXNDb3VudDsgaSArKykgeworICAgICAgICAgICAgZGVsZXRlIG1QcmltaXRpdmVzW2ldOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZVtdIG1QcmltaXRpdmVzOworICAgIH0KIH0KIAordm9pZCBNZXNoOjpyZW5kZXIoQ29udGV4dCAqcnNjKSBjb25zdAoreworICAgIGZvcih1aW50MzJfdCBjdCA9IDA7IGN0IDwgbVByaW1pdGl2ZXNDb3VudDsgY3QgKyspIHsKKyAgICAgICAgcmVuZGVyUHJpbWl0aXZlKHJzYywgY3QpOworICAgIH0KK30KKwordm9pZCBNZXNoOjpyZW5kZXJQcmltaXRpdmUoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBwcmltSW5kZXgpIGNvbnN0IHsKKyAgICBpZiAocHJpbUluZGV4ID49IG1QcmltaXRpdmVzQ291bnQpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBwcmltaXRpdmUgaW5kZXgiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFByaW1pdGl2ZV90ICpwcmltID0gbVByaW1pdGl2ZXNbcHJpbUluZGV4XTsKKworICAgIGlmIChwcmltLT5tSW5kZXhCdWZmZXIuZ2V0KCkpIHsKKyAgICAgICAgcmVuZGVyUHJpbWl0aXZlUmFuZ2UocnNjLCBwcmltSW5kZXgsIDAsIHByaW0tPm1JbmRleEJ1ZmZlci0+Z2V0VHlwZSgpLT5nZXREaW1YKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmVuZGVyUHJpbWl0aXZlUmFuZ2UocnNjLCBwcmltSW5kZXgsIDAsIG1WZXJ0ZXhCdWZmZXJzWzBdLT5nZXRUeXBlKCktPmdldERpbVgoKSk7Cit9CisKK3ZvaWQgTWVzaDo6cmVuZGVyUHJpbWl0aXZlUmFuZ2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBwcmltSW5kZXgsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pIGNvbnN0Cit7CisgICAgaWYgKGxlbiA8IDEgfHwgcHJpbUluZGV4ID49IG1QcmltaXRpdmVzQ291bnQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJzYy0+Y2hlY2tFcnJvcigiTWVzaDo6cmVuZGVyUHJpbWl0aXZlUmFuZ2UgMSIpOworICAgIFZlcnRleEFycmF5IHZhOworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVmVydGV4QnVmZmVyQ291bnQ7IGN0KyspIHsKKyAgICAgICAgbVZlcnRleEJ1ZmZlcnNbY3RdLT51cGxvYWRDaGVjayhyc2MpOworICAgICAgICBpZiAobVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRJc0J1ZmZlck9iamVjdCgpKSB7CisgICAgICAgICAgICB2YS5zZXRBY3RpdmVCdWZmZXIobVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRCdWZmZXJPYmplY3RJRCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhLnNldEFjdGl2ZUJ1ZmZlcihtVmVydGV4QnVmZmVyc1tjdF0tPmdldFB0cigpKTsKKyAgICAgICAgfQorICAgICAgICBtVmVydGV4QnVmZmVyc1tjdF0tPmdldFR5cGUoKS0+ZW5hYmxlR0xWZXJ0ZXhCdWZmZXIoJnZhKTsKKyAgICB9CisgICAgdmEuc2V0dXBHTDIocnNjLCAmcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheSwgJnJzYy0+bVNoYWRlckNhY2hlKTsKKworICAgIHJzYy0+Y2hlY2tFcnJvcigiTWVzaDo6cmVuZGVyUHJpbWl0aXZlUmFuZ2UgMiIpOworICAgIFByaW1pdGl2ZV90ICpwcmltID0gbVByaW1pdGl2ZXNbcHJpbUluZGV4XTsKKyAgICBpZiAocHJpbS0+bUluZGV4QnVmZmVyLmdldCgpKSB7CisgICAgICAgIHByaW0tPm1JbmRleEJ1ZmZlci0+dXBsb2FkQ2hlY2socnNjKTsKKyAgICAgICAgZ2xCaW5kQnVmZmVyKEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBwcmltLT5tSW5kZXhCdWZmZXItPmdldEJ1ZmZlck9iamVjdElEKCkpOworICAgICAgICBnbERyYXdFbGVtZW50cyhwcmltLT5tR0xQcmltaXRpdmUsIGxlbiwgR0xfVU5TSUdORURfU0hPUlQsICh1aW50MTZfdCAqKShzdGFydCAqIDIpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnbERyYXdBcnJheXMocHJpbS0+bUdMUHJpbWl0aXZlLCBzdGFydCwgbGVuKTsKKyAgICB9CisKKyAgICByc2MtPmNoZWNrRXJyb3IoIk1lc2g6OnJlbmRlclByaW1pdGl2ZVJhbmdlIik7Cit9CisKKwordm9pZCBNZXNoOjp1cGxvYWRBbGwoQ29udGV4dCAqcnNjKQoreworICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IG1WZXJ0ZXhCdWZmZXJDb3VudDsgY3QgKyspIHsKKyAgICAgICAgaWYgKG1WZXJ0ZXhCdWZmZXJzW2N0XS5nZXQoKSkgeworICAgICAgICAgICAgbVZlcnRleEJ1ZmZlcnNbY3RdLT5kZWZlcmVkVXBsb2FkVG9CdWZmZXJPYmplY3QocnNjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IG1QcmltaXRpdmVzQ291bnQ7IGN0ICsrKSB7CisgICAgICAgIGlmIChtUHJpbWl0aXZlc1tjdF0tPm1JbmRleEJ1ZmZlci5nZXQoKSkgeworICAgICAgICAgICAgbVByaW1pdGl2ZXNbY3RdLT5tSW5kZXhCdWZmZXItPmRlZmVyZWRVcGxvYWRUb0J1ZmZlck9iamVjdChyc2MpOworICAgICAgICB9CisgICAgfQorCisgICAgcnNjLT5jaGVja0Vycm9yKCJNZXNoOjp1cGxvYWRBbGwiKTsKK30KKwordm9pZCBNZXNoOjp1cGRhdGVHTFByaW1pdGl2ZXMoKQoreworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1QcmltaXRpdmVzQ291bnQ7IGkgKyspIHsKKyAgICAgICAgc3dpdGNoKG1QcmltaXRpdmVzW2ldLT5tUHJpbWl0aXZlKSB7CisgICAgICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9QT0lOVDogICAgICAgICAgbVByaW1pdGl2ZXNbaV0tPm1HTFByaW1pdGl2ZSA9IEdMX1BPSU5UUzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9MSU5FOiAgICAgICAgICAgbVByaW1pdGl2ZXNbaV0tPm1HTFByaW1pdGl2ZSA9IEdMX0xJTkVTOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlNfUFJJTUlUSVZFX0xJTkVfU1RSSVA6ICAgICBtUHJpbWl0aXZlc1tpXS0+bUdMUHJpbWl0aXZlID0gR0xfTElORV9TVFJJUDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRTogICAgICAgbVByaW1pdGl2ZXNbaV0tPm1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFUzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRV9TVFJJUDogbVByaW1pdGl2ZXNbaV0tPm1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFX1NUUklQOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlNfUFJJTUlUSVZFX1RSSUFOR0xFX0ZBTjogICBtUHJpbWl0aXZlc1tpXS0+bUdMUHJpbWl0aXZlID0gR0xfVFJJQU5HTEVfRkFOOyBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNZXNoOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIC8vIE5lZWQgdG8gaWRlbnRpZnkgb3Vyc2VsdmVzCisgICAgc3RyZWFtLT5hZGRVMzIoKHVpbnQzMl90KWdldENsYXNzSWQoKSk7CisKKyAgICBTdHJpbmc4IG5hbWUoZ2V0TmFtZSgpKTsKKyAgICBzdHJlYW0tPmFkZFN0cmluZygmbmFtZSk7CisKKyAgICAvLyBTdG9yZSBudW1iZXIgb2YgdmVydGV4IHN0cmVhbXMKKyAgICBzdHJlYW0tPmFkZFUzMihtVmVydGV4QnVmZmVyQ291bnQpOworICAgIGZvcih1aW50MzJfdCB2Q291bnQgPSAwOyB2Q291bnQgPCBtVmVydGV4QnVmZmVyQ291bnQ7IHZDb3VudCArKykgeworICAgICAgICBtVmVydGV4QnVmZmVyc1t2Q291bnRdLT5zZXJpYWxpemUoc3RyZWFtKTsKKyAgICB9CisKKyAgICBzdHJlYW0tPmFkZFUzMihtUHJpbWl0aXZlc0NvdW50KTsKKyAgICAvLyBTdG9yZSB0aGUgcHJpbWl0aXZlcworICAgIGZvciAodWludDMyX3QgcENvdW50ID0gMDsgcENvdW50IDwgbVByaW1pdGl2ZXNDb3VudDsgcENvdW50ICsrKSB7CisgICAgICAgIFByaW1pdGl2ZV90ICogcHJpbSA9IG1QcmltaXRpdmVzW3BDb3VudF07CisKKyAgICAgICAgc3RyZWFtLT5hZGRVOCgodWludDhfdClwcmltLT5tUHJpbWl0aXZlKTsKKworICAgICAgICBpZihwcmltLT5tSW5kZXhCdWZmZXIuZ2V0KCkpIHsKKyAgICAgICAgICAgIHN0cmVhbS0+YWRkVTMyKDEpOworICAgICAgICAgICAgcHJpbS0+bUluZGV4QnVmZmVyLT5zZXJpYWxpemUoc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHN0cmVhbS0+YWRkVTMyKDApOworICAgICAgICB9CisgICAgfQorfQorCitNZXNoICpNZXNoOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSB3ZSBhcmUgcmVhZGluZyB0aGUgY29ycmVjdCBvYmplY3QKKyAgICBSc0EzRENsYXNzSUQgY2xhc3NJRCA9IChSc0EzRENsYXNzSUQpc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYoY2xhc3NJRCAhPSBSU19BM0RfQ0xBU1NfSURfTUVTSCkgeworICAgICAgICBMT0dFKCJtZXNoIGxvYWRpbmcgc2tpcHBlZCBkdWUgdG8gaW52YWxpZCBjbGFzcyBpZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBNZXNoICogbWVzaCA9IG5ldyBNZXNoKHJzYyk7CisKKyAgICBTdHJpbmc4IG5hbWU7CisgICAgc3RyZWFtLT5sb2FkU3RyaW5nKCZuYW1lKTsKKyAgICBtZXNoLT5zZXROYW1lKG5hbWUuc3RyaW5nKCksIG5hbWUuc2l6ZSgpKTsKKworICAgIG1lc2gtPm1WZXJ0ZXhCdWZmZXJDb3VudCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKG1lc2gtPm1WZXJ0ZXhCdWZmZXJDb3VudCkgeworICAgICAgICBtZXNoLT5tVmVydGV4QnVmZmVycyA9IG5ldyBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+W21lc2gtPm1WZXJ0ZXhCdWZmZXJDb3VudF07CisKKyAgICAgICAgZm9yKHVpbnQzMl90IHZDb3VudCA9IDA7IHZDb3VudCA8IG1lc2gtPm1WZXJ0ZXhCdWZmZXJDb3VudDsgdkNvdW50ICsrKSB7CisgICAgICAgICAgICBBbGxvY2F0aW9uICp2ZXJ0ZXhBbGxvYyA9IEFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pOworICAgICAgICAgICAgbWVzaC0+bVZlcnRleEJ1ZmZlcnNbdkNvdW50XS5zZXQodmVydGV4QWxsb2MpOworICAgICAgICB9CisgICAgfQorCisgICAgbWVzaC0+bVByaW1pdGl2ZXNDb3VudCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKG1lc2gtPm1QcmltaXRpdmVzQ291bnQpIHsKKyAgICAgICAgbWVzaC0+bVByaW1pdGl2ZXMgPSBuZXcgUHJpbWl0aXZlX3QgKlttZXNoLT5tUHJpbWl0aXZlc0NvdW50XTsKKworICAgICAgICAvLyBsb2FkIGFsbCBwcmltaXRpdmVzCisgICAgICAgIGZvciAodWludDMyX3QgcENvdW50ID0gMDsgcENvdW50IDwgbWVzaC0+bVByaW1pdGl2ZXNDb3VudDsgcENvdW50ICsrKSB7CisgICAgICAgICAgICBQcmltaXRpdmVfdCAqIHByaW0gPSBuZXcgUHJpbWl0aXZlX3Q7CisgICAgICAgICAgICBtZXNoLT5tUHJpbWl0aXZlc1twQ291bnRdID0gcHJpbTsKKworICAgICAgICAgICAgcHJpbS0+bVByaW1pdGl2ZSA9IChSc1ByaW1pdGl2ZSlzdHJlYW0tPmxvYWRVOCgpOworCisgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGluZGV4IGJ1ZmZlciB3YXMgc3RvcmVkCisgICAgICAgICAgICB1aW50MzJfdCBpc0luZGV4UHJlc2VudCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgICAgICAgICAgaWYoaXNJbmRleFByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICBBbGxvY2F0aW9uICppbmRleEFsbG9jID0gQWxsb2NhdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShyc2MsIHN0cmVhbSk7CisgICAgICAgICAgICAgICAgcHJpbS0+bUluZGV4QnVmZmVyLnNldChpbmRleEFsbG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1lc2gtPnVwZGF0ZUdMUHJpbWl0aXZlcygpOworICAgIG1lc2gtPnVwbG9hZEFsbChyc2MpOworCisgICAgcmV0dXJuIG1lc2g7Cit9CisKK3ZvaWQgTWVzaDo6Y29tcHV0ZUJCb3goKSB7CisgICAgZmxvYXQgKnBvc1B0ciA9IE5VTEw7CisgICAgdWludDMyX3QgdmVjdG9yU2l6ZSA9IDA7CisgICAgdWludDMyX3Qgc3RyaWRlID0gMDsKKyAgICB1aW50MzJfdCBudW1WZXJ0cyA9IDA7CisgICAgLy8gRmlyc3Qgd2UgbmVlZCB0byBmaW5kIHRoZSBwb3NpdGlvbiBwdHIgYW5kIHN0cmlkZQorICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVmVydGV4QnVmZmVyQ291bnQ7IGN0KyspIHsKKyAgICAgICAgY29uc3QgVHlwZSAqYnVmZmVyVHlwZSA9IG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0VHlwZSgpOworICAgICAgICBjb25zdCBFbGVtZW50ICpidWZmZXJFbGVtID0gYnVmZmVyVHlwZS0+Z2V0RWxlbWVudCgpOworCisgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBidWZmZXJFbGVtLT5nZXRGaWVsZENvdW50KCk7IGN0KyspIHsKKyAgICAgICAgICAgIGlmKHN0cmNtcChidWZmZXJFbGVtLT5nZXRGaWVsZE5hbWUoY3QpLCAicG9zaXRpb24iKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdmVjdG9yU2l6ZSA9IGJ1ZmZlckVsZW0tPmdldEZpZWxkKGN0KS0+Z2V0Q29tcG9uZW50KCkuZ2V0VmVjdG9yU2l6ZSgpOworICAgICAgICAgICAgICAgIHN0cmlkZSA9IGJ1ZmZlckVsZW0tPmdldFNpemVCeXRlcygpIC8gc2l6ZW9mKGZsb2F0KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSBidWZmZXJFbGVtLT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKKyAgICAgICAgICAgICAgICBwb3NQdHIgPSAoZmxvYXQqKSgodWludDhfdCopbVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRQdHIoKSArIG9mZnNldCk7CisgICAgICAgICAgICAgICAgbnVtVmVydHMgPSBidWZmZXJUeXBlLT5nZXREaW1YKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYocG9zUHRyKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1CQm94TWluWzBdID0gbUJCb3hNaW5bMV0gPSBtQkJveE1pblsyXSA9IDFlNjsKKyAgICBtQkJveE1heFswXSA9IG1CQm94TWF4WzFdID0gbUJCb3hNYXhbMl0gPSAtMWU2OworICAgIGlmKCFwb3NQdHIpIHsKKyAgICAgICAgTE9HRSgiVW5hYmxlIHRvIGNvbXB1dGUgYm91bmRpbmcgYm94Iik7CisgICAgICAgIG1CQm94TWluWzBdID0gbUJCb3hNaW5bMV0gPSBtQkJveE1pblsyXSA9IDAuMGY7CisgICAgICAgIG1CQm94TWF4WzBdID0gbUJCb3hNYXhbMV0gPSBtQkJveE1heFsyXSA9IDAuMGY7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBudW1WZXJ0czsgaSArKykgeworICAgICAgICBmb3IodWludDMyX3QgdiA9IDA7IHYgPCB2ZWN0b3JTaXplOyB2ICsrKSB7CisgICAgICAgICAgICBtQkJveE1pblt2XSA9IHJzTWluKG1CQm94TWluW3ZdLCBwb3NQdHJbdl0pOworICAgICAgICAgICAgbUJCb3hNYXhbdl0gPSByc01heChtQkJveE1heFt2XSwgcG9zUHRyW3ZdKTsKKyAgICAgICAgfQorICAgICAgICBwb3NQdHIgKz0gc3RyaWRlOworICAgIH0KK30KIAogCiBNZXNoQ29udGV4dDo6TWVzaENvbnRleHQoKQpAQCAtNDYsMyArMjc2LDgzIEBACiB7CiB9CiAKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitSc01lc2ggcnNpX01lc2hDcmVhdGUoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB2dHhDb3VudCwgdWludDMyX3QgaWR4Q291bnQpCit7CisgICAgTWVzaCAqc20gPSBuZXcgTWVzaChyc2MpOworICAgIHNtLT5pbmNVc2VyUmVmKCk7CisKKyAgICBzbS0+bVByaW1pdGl2ZXNDb3VudCA9IGlkeENvdW50OworICAgIHNtLT5tUHJpbWl0aXZlcyA9IG5ldyBNZXNoOjpQcmltaXRpdmVfdCAqW3NtLT5tUHJpbWl0aXZlc0NvdW50XTsKKyAgICBmb3IodWludDMyX3QgY3QgPSAwOyBjdCA8IGlkeENvdW50OyBjdCArKykgeworICAgICAgICBzbS0+bVByaW1pdGl2ZXNbY3RdID0gbmV3IE1lc2g6OlByaW1pdGl2ZV90OworICAgIH0KKworICAgIHNtLT5tVmVydGV4QnVmZmVyQ291bnQgPSB2dHhDb3VudDsKKyAgICBzbS0+bVZlcnRleEJ1ZmZlcnMgPSBuZXcgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPlt2dHhDb3VudF07CisKKyAgICByZXR1cm4gc207Cit9CisKK3ZvaWQgcnNpX01lc2hCaW5kVmVydGV4KENvbnRleHQgKnJzYywgUnNNZXNoIG12LCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHNsb3QpCit7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KG12KTsKKyAgICByc0Fzc2VydChzbG90IDwgc20tPm1WZXJ0ZXhCdWZmZXJDb3VudCk7CisKKyAgICBzbS0+bVZlcnRleEJ1ZmZlcnNbc2xvdF0uc2V0KChBbGxvY2F0aW9uICopdmEpOworfQorCit2b2lkIHJzaV9NZXNoQmluZEluZGV4KENvbnRleHQgKnJzYywgUnNNZXNoIG12LCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHByaW1UeXBlLCB1aW50MzJfdCBzbG90KQoreworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPihtdik7CisgICAgcnNBc3NlcnQoc2xvdCA8IHNtLT5tUHJpbWl0aXZlc0NvdW50KTsKKworICAgIHNtLT5tUHJpbWl0aXZlc1tzbG90XS0+bUluZGV4QnVmZmVyLnNldCgoQWxsb2NhdGlvbiAqKXZhKTsKKyAgICBzbS0+bVByaW1pdGl2ZXNbc2xvdF0tPm1QcmltaXRpdmUgPSAoUnNQcmltaXRpdmUpcHJpbVR5cGU7CisgICAgc20tPnVwZGF0ZUdMUHJpbWl0aXZlcygpOworfQorCit2b2lkIHJzaV9NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQoQ29udGV4dCAqcnNjLCBSc01lc2ggbXYsIGludDMyX3QgKm51bVZ0eCkKK3sKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4obXYpOworICAgICpudW1WdHggPSBzbS0+bVZlcnRleEJ1ZmZlckNvdW50OworfQorCit2b2lkIHJzaV9NZXNoR2V0SW5kZXhDb3VudChDb250ZXh0ICpyc2MsIFJzTWVzaCBtdiwgaW50MzJfdCAqbnVtSWR4KQoreworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPihtdik7CisgICAgKm51bUlkeCA9IHNtLT5tUHJpbWl0aXZlc0NvdW50OworfQorCit2b2lkIHJzaV9NZXNoR2V0VmVydGljZXMoQ29udGV4dCAqcnNjLCBSc01lc2ggbXYsIFJzQWxsb2NhdGlvbiAqdnR4RGF0YSwgdWludDMyX3QgdnR4RGF0YUNvdW50KQoreworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPihtdik7CisgICAgcnNBc3NlcnQodnR4RGF0YUNvdW50ID09IHNtLT5tVmVydGV4QnVmZmVyQ291bnQpOworCisgICAgZm9yKHVpbnQzMl90IGN0ID0gMDsgY3QgPCB2dHhEYXRhQ291bnQ7IGN0ICsrKSB7CisgICAgICAgIHZ0eERhdGFbY3RdID0gc20tPm1WZXJ0ZXhCdWZmZXJzW2N0XS5nZXQoKTsKKyAgICAgICAgc20tPm1WZXJ0ZXhCdWZmZXJzW2N0XS0+aW5jVXNlclJlZigpOworICAgIH0KK30KKwordm9pZCByc2lfTWVzaEdldEluZGljZXMoQ29udGV4dCAqcnNjLCBSc01lc2ggbXYsIFJzQWxsb2NhdGlvbiAqdmEsIHVpbnQzMl90ICpwcmltVHlwZSwgdWludDMyX3QgaWR4RGF0YUNvdW50KQoreworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPihtdik7CisgICAgcnNBc3NlcnQoaWR4RGF0YUNvdW50ID09IHNtLT5tUHJpbWl0aXZlc0NvdW50KTsKKworICAgIGZvcih1aW50MzJfdCBjdCA9IDA7IGN0IDwgaWR4RGF0YUNvdW50OyBjdCArKykgeworICAgICAgICB2YVtjdF0gPSBzbS0+bVByaW1pdGl2ZXNbY3RdLT5tSW5kZXhCdWZmZXIuZ2V0KCk7CisgICAgICAgIHByaW1UeXBlW2N0XSA9IHNtLT5tUHJpbWl0aXZlc1tjdF0tPm1QcmltaXRpdmU7CisgICAgICAgIGlmKHNtLT5tUHJpbWl0aXZlc1tjdF0tPm1JbmRleEJ1ZmZlci5nZXQoKSkgeworICAgICAgICAgICAgc20tPm1QcmltaXRpdmVzW2N0XS0+bUluZGV4QnVmZmVyLT5pbmNVc2VyUmVmKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KKworCisKKworfX0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNNZXNoLmggYi9saWJzL3JzL3JzTWVzaC5oCmluZGV4IDUyMDFhYmQuLmVkMDFjMzggMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNNZXNoLmgKKysrIGIvbGlicy9ycy9yc01lc2guaApAQCAtMzIsNDUgKzMyLDQwIEBACiAgICAgTWVzaChDb250ZXh0ICopOwogICAgIH5NZXNoKCk7CiAKLSAgICBzdHJ1Y3QgVmVydGljaWVzX3QKLSAgICB7Ci0gICAgICAgIEFsbG9jYXRpb24gKiogbUFsbG9jYXRpb25zOwotICAgICAgICB1aW50MzJfdCBtQWxsb2NhdGlvbkNvdW50OworICAgIC8vIENvbnRhaW5zIHZlcnRleCBkYXRhCisgICAgLy8gUG9zaXRpb24sIG5vcm1hbCwgdGV4Y29vcmQsIGV0YyBjb3VsZCBlaXRoZXIgYmUgc3RyaWRlZCBpbiBvbmUgYWxsb2NhdGlvbgorICAgIC8vIG9mIHByb3ZpZGVkIHNlcGFyZXRlbHkgaW4gbXVsdGlwbGUgb25lcworICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gKm1WZXJ0ZXhCdWZmZXJzOworICAgIHVpbnQzMl90IG1WZXJ0ZXhCdWZmZXJDb3VudDsKIAotICAgICAgICBzaXplX3QgbVZlcnRleERhdGFTaXplOwotCi0gICAgICAgIHNpemVfdCBtT2Zmc2V0Q29vcmQ7Ci0gICAgICAgIHNpemVfdCBtT2Zmc2V0VGV4OwotICAgICAgICBzaXplX3QgbU9mZnNldE5vcm07Ci0KLSAgICAgICAgc2l6ZV90IG1TaXplQ29vcmQ7Ci0gICAgICAgIHNpemVfdCBtU2l6ZVRleDsKLSAgICAgICAgc2l6ZV90IG1TaXplTm9ybTsKLQotICAgICAgICB1aW50MzJfdCBtQnVmZmVyT2JqZWN0OwotICAgIH07Ci0KKyAgICAvLyBFaXRoZXIgbUluZGV4QnVmZmVyLCBtUHJpbWl0aXZlQnVmZmVyIG9yIGJvdGggY291bGQgaGF2ZSBhIE5VTEwgcmVmZXJlbmNlCisgICAgLy8gSWYgYm90aCBhcmUgbnVsbCwgbVByaW1pdGl2ZSBvbmx5IHdvdWxkIGJlIHVzZWQgdG8gcmVuZGVyIHRoZSBtZXNoCiAgICAgc3RydWN0IFByaW1pdGl2ZV90CiAgICAgewotICAgICAgICBSc1ByaW1pdGl2ZSBtVHlwZTsKLSAgICAgICAgVmVydGljaWVzX3QgKm1WZXJ0aWNpZXM7CisgICAgICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUluZGV4QnVmZmVyOwogCi0gICAgICAgIHVpbnQzMl90IG1JbmRleENvdW50OwotICAgICAgICB1aW50MTZfdCAqbUluZGljaWVzOwotCi0gICAgICAgIHVpbnQzMl90IG1SZXN0YXJ0Q291bnRzOwotICAgICAgICB1aW50MTZfdCAqbVJlc3RhcnRzOworICAgICAgICBSc1ByaW1pdGl2ZSBtUHJpbWl0aXZlOworICAgICAgICB1aW50MzJfdCBtR0xQcmltaXRpdmU7CiAgICAgfTsKIAotICAgIFZlcnRpY2llc190ICogbVZlcnRpY2llczsKLSAgICB1aW50MzJfdCBtVmVydGljaWVzQ291bnQ7Ci0KICAgICBQcmltaXRpdmVfdCAqKiBtUHJpbWl0aXZlczsKICAgICB1aW50MzJfdCBtUHJpbWl0aXZlc0NvdW50OwogCisgICAgdm9pZCByZW5kZXIoQ29udGV4dCAqKSBjb25zdDsKKyAgICB2b2lkIHJlbmRlclByaW1pdGl2ZShDb250ZXh0ICosIHVpbnQzMl90IHByaW1JbmRleCkgY29uc3Q7CisgICAgdm9pZCByZW5kZXJQcmltaXRpdmVSYW5nZShDb250ZXh0ICosIHVpbnQzMl90IHByaW1JbmRleCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbikgY29uc3Q7CisgICAgdm9pZCB1cGxvYWRBbGwoQ29udGV4dCAqKTsKKyAgICB2b2lkIHVwZGF0ZUdMUHJpbWl0aXZlcygpOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfTUVTSDsgfQorICAgIHN0YXRpYyBNZXNoICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAotICAgIHZvaWQgYW5hbHl6ZUVsZW1lbnQoKTsKKyAgICAvLyBCb3VuZGluZyB2b2x1bWVzCisgICAgZmxvYXQgbUJCb3hNaW5bM107CisgICAgZmxvYXQgbUJCb3hNYXhbM107CisgICAgdm9pZCBjb21wdXRlQkJveCgpOworCiBwcm90ZWN0ZWQ6CiB9OwogCkBAIC04OCwzICs4Myw0IEBACiAjZW5kaWYgLy9BTkRST0lEX1JTX1RSSUFOR0xFX01FU0hfSAogCiAKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc011dGV4LmNwcCBiL2xpYnMvcnMvcnNNdXRleC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3NTJmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNNdXRleC5jcHAKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJyc011dGV4LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworCitNdXRleDo6TXV0ZXgoKQoreworfQorCitNdXRleDo6fk11dGV4KCkKK3sKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1NdXRleCk7Cit9CisKK2Jvb2wgTXV0ZXg6OmluaXQoKQoreworICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2luaXQoJm1NdXRleCwgTlVMTCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJNdXRleDo6TXV0ZXggaW5pdCBmYWlsdXJlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTXV0ZXg6OmxvY2soKQoreworICAgIGludCBzdGF0dXM7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTXV0ZXg6IGVycm9yICVpIGxvY2tpbmcuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdXRleDo6dW5sb2NrKCkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTXV0ZXggZXJyb3IgJWkgdW5sb2NraW5nLiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc011dGV4LmggYi9saWJzL3JzL3JzTXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzcyNWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc011dGV4LmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19NVVRFWF9ICisjZGVmaW5lIEFORFJPSURfUlNfTVVURVhfSAorCisKKyNpbmNsdWRlICJyc1V0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitjbGFzcyBNdXRleCB7CitwdWJsaWM6CisgICAgTXV0ZXgoKTsKKyAgICB+TXV0ZXgoKTsKKworICAgIGJvb2wgaW5pdCgpOworICAgIGJvb2wgbG9jaygpOworICAgIGJvb2wgdW5sb2NrKCk7CisKK3Byb3RlY3RlZDoKKyAgICBwdGhyZWFkX211dGV4X3QgbU11dGV4OworfTsKKworfQorfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc05vaXNlLmNwcCBiL2xpYnMvcnMvcnNOb2lzZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNjc1ODYuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9yc05vaXNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbm9pc2UgZnVuY3Rpb25zIHdhcyBwb3J0ZWQgZnJvbSB0aGUgSmF2YQotICogaW1wbGVtZW50YXRpb24gYnkgSmVycnkgSHV4dGFibGUgKGh0dHA6Ly93d3cuamhsYWJzLmNvbSkgdW5kZXIKLSAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoc2VlIGh0dHA6Ly9qaGxhYnMuY29tL2lwL2ZpbHRlcnMvZG93bmxvYWQuaHRtbCkKLSAqCi0gKiBPcmlnaW5hbCBoZWFkZXI6Ci0gKgotICogQ29weXJpZ2h0IDIwMDYgSmVycnkgSHV4dGFibGUKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInJzTm9pc2UuaCIKLQotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi0jZGVmaW5lIEIgMHgxMDAKLSNkZWZpbmUgQk0gMHhmZgotI2RlZmluZSBOIDB4MTAwMAotCi1zdGF0aWMgaW50IHBbQiArIEIgKyAyXTsKLXN0YXRpYyBmbG9hdCBnM1tCICsgQiArIDJdWzNdOwotc3RhdGljIGZsb2F0IGcyW0IgKyBCICsgMl1bMl07Ci1zdGF0aWMgZmxvYXQgZzFbQiArIEIgKyAyXTsKLXN0YXRpYyBib29sIG5vaXNlX3N0YXJ0ID0gdHJ1ZTsKLQotI2RlZmluZSBsZXJwZihzdGFydCwgc3RvcCwgYW1vdW50KSBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50Ci0KLXN0YXRpYyBpbmxpbmUgZmxvYXQgbm9pc2Vfc0N1cnZlKGZsb2F0IHQpCi17Ci0gICAgcmV0dXJuIHQgKiB0ICogKDMuMGYgLSAyLjBmICogdCk7Ci19Ci0KLWlubGluZSB2b2lkIFNDX25vcm1hbGl6ZWYyKGZsb2F0IHZbXSkKLXsKLSAgICBmbG9hdCBzID0gKGZsb2F0KXNxcnRmKHZbMF0gKiB2WzBdICsgdlsxXSAqIHZbMV0pOwotICAgIHZbMF0gPSB2WzBdIC8gczsKLSAgICB2WzFdID0gdlsxXSAvIHM7Ci19Ci0KLWlubGluZSB2b2lkIFNDX25vcm1hbGl6ZWYzKGZsb2F0IHZbXSkKLXsKLSAgICBmbG9hdCBzID0gKGZsb2F0KXNxcnRmKHZbMF0gKiB2WzBdICsgdlsxXSAqIHZbMV0gKyB2WzJdICogdlsyXSk7Ci0gICAgdlswXSA9IHZbMF0gLyBzOwotICAgIHZbMV0gPSB2WzFdIC8gczsKLSAgICB2WzJdID0gdlsyXSAvIHM7Ci19Ci0KLXN0YXRpYyB2b2lkIG5vaXNlX2luaXQoKQotewotICAgIGludCBpLCBqLCBrOwotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCBCOyBpKyspIHsKLSAgICAgICAgcFtpXSA9IGk7Ci0gICAgICAgIAotICAgICAgICBnMVtpXSA9IChmbG9hdCkoKHJhbmQoKSAlIChCICsgQikpIC0gQikgLyBCOwotICAgICAgICAKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLSAgICAgICAgICAgIGcyW2ldW2pdID0gKGZsb2F0KSgocmFuZCgpICUgKEIgKyBCKSkgLSBCKSAvIEI7Ci0gICAgICAgIFNDX25vcm1hbGl6ZWYyKGcyW2ldKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspCi0gICAgICAgICAgICBnM1tpXVtqXSA9IChmbG9hdCkoKHJhbmQoKSAlIChCICsgQikpIC0gQikgLyBCOwotICAgICAgICBTQ19ub3JtYWxpemVmMyhnM1tpXSk7Ci0gICAgfQotICAgIAotICAgIGZvciAoaSA9IEItMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgayA9IHBbaV07Ci0gICAgICAgIHBbaV0gPSBwW2ogPSByYW5kKCkgJSBCXTsKLSAgICAgICAgcFtqXSA9IGs7Ci0gICAgfQotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCBCICsgMjsgaSsrKSB7Ci0gICAgICAgIHBbQiArIGldID0gcFtpXTsKLSAgICAgICAgZzFbQiArIGldID0gZzFbaV07Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0gICAgICAgICAgICBnMltCICsgaV1bal0gPSBnMltpXVtqXTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKLSAgICAgICAgICAgIGczW0IgKyBpXVtqXSA9IGczW2ldW2pdOwotICAgIH0KLX0KLQotZmxvYXQgU0Nfbm9pc2VmKGZsb2F0IHgpCi17Ci0gICAgc3JhbmQodGltZShOVUxMKSk7Ci0gICAgaW50IGJ4MCwgYngxOwotICAgIGZsb2F0IHJ4MCwgcngxLCBzeCwgdCwgdSwgdjsKLSAgICAKLSAgICBpZiAobm9pc2Vfc3RhcnQpIHsKLSAgICAgICAgbm9pc2Vfc3RhcnQgPSBmYWxzZTsKLSAgICAgICAgbm9pc2VfaW5pdCgpOwotICAgIH0KLSAgICAKLSAgICB0ID0geCArIE47Ci0gICAgYngwID0gKChpbnQpdCkgJiBCTTsKLSAgICBieDEgPSAoYngwKzEpICYgQk07Ci0gICAgcngwID0gdCAtIChpbnQpdDsKLSAgICByeDEgPSByeDAgLSAxLjBmOwotICAgIAotICAgIHN4ID0gbm9pc2Vfc0N1cnZlKHJ4MCk7Ci0gICAgCi0gICAgdSA9IHJ4MCAqIGcxW3BbYngwXV07Ci0gICAgdiA9IHJ4MSAqIGcxW3BbYngxXV07Ci0gICAgcmV0dXJuIDIuM2YgKiBsZXJwZih1LCB2LCBzeCk7Ci19Ci0KLWZsb2F0IFNDX25vaXNlZjIoZmxvYXQgeCwgZmxvYXQgeSkKLXsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgICBpbnQgYngwLCBieDEsIGJ5MCwgYnkxLCBiMDAsIGIxMCwgYjAxLCBiMTE7Ci0gICAgZmxvYXQgcngwLCByeDEsIHJ5MCwgcnkxLCBzeCwgc3ksIGEsIGIsIHQsIHUsIHY7Ci0gICAgZmxvYXQgKnE7Ci0gICAgaW50IGksIGo7Ci0gICAgCi0gICAgaWYgKG5vaXNlX3N0YXJ0KSB7Ci0gICAgICAgIG5vaXNlX3N0YXJ0ID0gZmFsc2U7Ci0gICAgICAgIG5vaXNlX2luaXQoKTsKLSAgICB9Ci0gICAgCi0gICAgdCA9IHggKyBOOwotICAgIGJ4MCA9ICgoaW50KXQpICYgQk07Ci0gICAgYngxID0gKGJ4MCsxKSAmIEJNOwotICAgIHJ4MCA9IHQgLSAoaW50KXQ7Ci0gICAgcngxID0gcngwIC0gMS4wZjsKLQkKLSAgICB0ID0geSArIE47Ci0gICAgYnkwID0gKChpbnQpdCkgJiBCTTsKLSAgICBieTEgPSAoYnkwKzEpICYgQk07Ci0gICAgcnkwID0gdCAtIChpbnQpdDsKLSAgICByeTEgPSByeTAgLSAxLjBmOwotCQotICAgIGkgPSBwW2J4MF07Ci0gICAgaiA9IHBbYngxXTsKLSAgICAKLSAgICBiMDAgPSBwW2kgKyBieTBdOwotICAgIGIxMCA9IHBbaiArIGJ5MF07Ci0gICAgYjAxID0gcFtpICsgYnkxXTsKLSAgICBiMTEgPSBwW2ogKyBieTFdOwotICAgIAotICAgIHN4ID0gbm9pc2Vfc0N1cnZlKHJ4MCk7Ci0gICAgc3kgPSBub2lzZV9zQ3VydmUocnkwKTsKLSAgICAKLSAgICBxID0gZzJbYjAwXTsgdSA9IHJ4MCAqIHFbMF0gKyByeTAgKiBxWzFdOwotICAgIHEgPSBnMltiMTBdOyB2ID0gcngxICogcVswXSArIHJ5MCAqIHFbMV07Ci0gICAgYSA9IGxlcnBmKHUsIHYsIHN4KTsKLSAgICAKLSAgICBxID0gZzJbYjAxXTsgdSA9IHJ4MCAqIHFbMF0gKyByeTEgKiBxWzFdOwotICAgIHEgPSBnMltiMTFdOyB2ID0gcngxICogcVswXSArIHJ5MSAqIHFbMV07Ci0gICAgYiA9IGxlcnBmKHUsIHYsIHN4KTsKLSAgICAKLSAgICByZXR1cm4gMS41ZipsZXJwZihhLCBiLCBzeSk7Ci19Ci0KLWZsb2F0IFNDX25vaXNlZjMoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgICBpbnQgYngwLCBieDEsIGJ5MCwgYnkxLCBiejAsIGJ6MSwgYjAwLCBiMTAsIGIwMSwgYjExOwotICAgIGZsb2F0IHJ4MCwgcngxLCByeTAsIHJ5MSwgcnowLCByejEsIHN5LCBzeiwgYSwgYiwgYywgZCwgdCwgdSwgdjsKLSAgICBmbG9hdCAqcTsKLSAgICBpbnQgaSwgajsKLSAgICAKLSAgICBpZiAobm9pc2Vfc3RhcnQpIHsKLSAgICAgICAgbm9pc2Vfc3RhcnQgPSBmYWxzZTsKLSAgICAgICAgbm9pc2VfaW5pdCgpOwotICAgIH0KLSAgICAKLSAgICB0ID0geCArIE47Ci0gICAgYngwID0gKChpbnQpdCkgJiBCTTsKLSAgICBieDEgPSAoYngwKzEpICYgQk07Ci0gICAgcngwID0gdCAtIChpbnQpdDsKLSAgICByeDEgPSByeDAgLSAxLjBmOwotICAgIAotICAgIHQgPSB5ICsgTjsKLSAgICBieTAgPSAoKGludCl0KSAmIEJNOwotICAgIGJ5MSA9IChieTArMSkgJiBCTTsKLSAgICByeTAgPSB0IC0gKGludCl0OwotICAgIHJ5MSA9IHJ5MCAtIDEuMGY7Ci0JCi0gICAgdCA9IHogKyBOOwotICAgIGJ6MCA9ICgoaW50KXQpICYgQk07Ci0gICAgYnoxID0gKGJ6MCsxKSAmIEJNOwotICAgIHJ6MCA9IHQgLSAoaW50KXQ7Ci0gICAgcnoxID0gcnowIC0gMS4wZjsKLQkKLSAgICBpID0gcFtieDBdOwotICAgIGogPSBwW2J4MV07Ci0gICAgCi0gICAgYjAwID0gcFtpICsgYnkwXTsKLSAgICBiMTAgPSBwW2ogKyBieTBdOwotICAgIGIwMSA9IHBbaSArIGJ5MV07Ci0gICAgYjExID0gcFtqICsgYnkxXTsKLSAgICAKLSAgICB0ICA9IG5vaXNlX3NDdXJ2ZShyeDApOwotICAgIHN5ID0gbm9pc2Vfc0N1cnZlKHJ5MCk7Ci0gICAgc3ogPSBub2lzZV9zQ3VydmUocnowKTsKLSAgICAKLSAgICBxID0gZzNbYjAwICsgYnowXTsgdSA9IHJ4MCAqIHFbMF0gKyByeTAgKiBxWzFdICsgcnowICogcVsyXTsKLSAgICBxID0gZzNbYjEwICsgYnowXTsgdiA9IHJ4MSAqIHFbMF0gKyByeTAgKiBxWzFdICsgcnowICogcVsyXTsKLSAgICBhID0gbGVycGYodSwgdiwgdCk7Ci0gICAgCi0gICAgcSA9IGczW2IwMSArIGJ6MF07IHUgPSByeDAgKiBxWzBdICsgcnkxICogcVsxXSArIHJ6MCAqIHFbMl07Ci0gICAgcSA9IGczW2IxMSArIGJ6MF07IHYgPSByeDEgKiBxWzBdICsgcnkxICogcVsxXSArIHJ6MCAqIHFbMl07Ci0gICAgYiA9IGxlcnBmKHUsIHYsIHQpOwotICAgIAotICAgIGMgPSBsZXJwZihhLCBiLCBzeSk7Ci0gICAgCi0gICAgcSA9IGczW2IwMCArIGJ6MV07IHUgPSByeDAgKiBxWzBdICsgcnkwICogcVsxXSArIHJ6MSAqIHFbMl07Ci0gICAgcSA9IGczW2IxMCArIGJ6MV07IHYgPSByeDEgKiBxWzBdICsgcnkwICogcVsxXSArIHJ6MSAqIHFbMl07Ci0gICAgYSA9IGxlcnBmKHUsIHYsIHQpOwotICAgIAotICAgIHEgPSBnM1tiMDEgKyBiejFdOyB1ID0gcngwICogcVswXSArIHJ5MSAqIHFbMV0gKyByejEgKiBxWzJdOwotICAgIHEgPSBnM1tiMTEgKyBiejFdOyB2ID0gcngxICogcVswXSArIHJ5MSAqIHFbMV0gKyByejEgKiBxWzJdOwotICAgIGIgPSBsZXJwZih1LCB2LCB0KTsKLSAgICAKLSAgICBkID0gbGVycGYoYSwgYiwgc3kpOwotICAgIAotICAgIHJldHVybiAxLjVmKmxlcnBmKGMsIGQsIHN6KTsKLX0KLQotZmxvYXQgU0NfdHVyYnVsZW5jZWYyKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IG9jdGF2ZXMpCi17Ci0gICAgc3JhbmQodGltZShOVUxMKSk7Ci0gICAgZmxvYXQgdCA9IDAuMGY7Ci0gICAgCi0gICAgZm9yIChmbG9hdCBmID0gMS4wZjsgZiA8PSBvY3RhdmVzOyBmICo9IDIpCi0gICAgICAgIHQgKz0gZmFicyhTQ19ub2lzZWYyKGYgKiB4LCBmICogeSkpIC8gZjsKLSAgICByZXR1cm4gdDsKLX0KLQotZmxvYXQgU0NfdHVyYnVsZW5jZWYzKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IG9jdGF2ZXMpCi17Ci0gICAgc3JhbmQodGltZShOVUxMKSk7Ci0gICAgZmxvYXQgdCA9IDAuMGY7Ci0gICAgCi0gICAgZm9yIChmbG9hdCBmID0gMS4wZjsgZiA8PSBvY3RhdmVzOyBmICo9IDIpCi0gICAgICAgIHQgKz0gZmFicyhTQ19ub2lzZWYzKGYgKiB4LCBmICogeSwgZiAqIHopKSAvIGY7Ci0gICAgcmV0dXJuIHQ7Ci19Ci0KLX0KLX0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNOb2lzZS5oIGIvbGlicy9ycy9yc05vaXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDA3NTEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9yc05vaXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1JTX05PSVNFX0gKLSNkZWZpbmUgQU5EUk9JRF9SU19OT0lTRV9ICi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7Ci0KLXZvaWQgU0Nfbm9ybWFsaXplZjIoZmxvYXQgdltdKTsKLXZvaWQgU0Nfbm9ybWFsaXplZjMoZmxvYXQgdltdKTsKLWZsb2F0IFNDX25vaXNlZihmbG9hdCB4KTsKLWZsb2F0IFNDX25vaXNlZjIoZmxvYXQgeCwgZmxvYXQgeSk7Ci1mbG9hdCBTQ19ub2lzZWYzKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopOwotZmxvYXQgU0NfdHVyYnVsZW5jZWYyKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IG9jdGF2ZXMpOwotZmxvYXQgU0NfdHVyYnVsZW5jZWYzKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IG9jdGF2ZXMpOwotCi19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc09iamVjdEJhc2UuY3BwIGIvbGlicy9ycy9yc09iamVjdEJhc2UuY3BwCmluZGV4IDY3NzQxM2UuLjQ4ZjFmZWUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNPYmplY3RCYXNlLmNwcAorKysgYi9saWJzL3JzL3JzT2JqZWN0QmFzZS5jcHAKQEAgLTE1LDcgKzE1LDEyIEBACiAgKi8KIAogI2luY2x1ZGUgInJzT2JqZWN0QmFzZS5oIgorCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0yNCw3ICsyOSw2IEBACiB7CiAgICAgbVVzZXJSZWZDb3VudCA9IDA7CiAgICAgbVN5c1JlZkNvdW50ID0gMDsKLSAgICBtTmFtZSA9IE5VTEw7CiAgICAgbVJTQyA9IE5VTEw7CiAgICAgbU5leHQgPSBOVUxMOwogICAgIG1QcmV2ID0gTlVMTDsKQEAgLTM5LDE0ICs0MywxMyBAQAogICAgIHJzQXNzZXJ0KCFtVXNlclJlZkNvdW50KTsKICAgICByc0Fzc2VydCghbVN5c1JlZkNvdW50KTsKICAgICByZW1vdmUoKTsKLSAgICBkZWxldGVbXSBtTmFtZTsKIH0KIAogdm9pZCBPYmplY3RCYXNlOjpkdW1wTE9HVihjb25zdCBjaGFyICpvcCkgY29uc3QKIHsKLSAgICBpZiAobU5hbWUpIHsKKyAgICBpZiAobU5hbWUuc2l6ZSgpKSB7CiAgICAgICAgIExPR1YoIiVzIFJTb2JqICVwLCBuYW1lICVzLCByZWZzICVpLCVpICBmcm9tICVzLCVpIGxpbmtzICVwLCVwLCVwIiwKLSAgICAgICAgICAgICBvcCwgdGhpcywgbU5hbWUsIG1Vc2VyUmVmQ291bnQsIG1TeXNSZWZDb3VudCwgbUFsbG9jRmlsZSwgbUFsbG9jTGluZSwgbU5leHQsIG1QcmV2LCBtUlNDKTsKKyAgICAgICAgICAgICBvcCwgdGhpcywgbU5hbWUuc3RyaW5nKCksIG1Vc2VyUmVmQ291bnQsIG1TeXNSZWZDb3VudCwgbUFsbG9jRmlsZSwgbUFsbG9jTGluZSwgbU5leHQsIG1QcmV2LCBtUlNDKTsKICAgICB9IGVsc2UgewogICAgICAgICBMT0dWKCIlcyBSU29iaiAlcCwgbm8tbmFtZSwgcmVmcyAlaSwlaSAgZnJvbSAlcywlaSBsaW5rcyAlcCwlcCwlcCIsCiAgICAgICAgICAgICAgb3AsIHRoaXMsIG1Vc2VyUmVmQ291bnQsIG1TeXNSZWZDb3VudCwgbUFsbG9jRmlsZSwgbUFsbG9jTGluZSwgbU5leHQsIG1QcmV2LCBtUlNDKTsKQEAgLTExMywxOCArMTE2LDEyIEBACiAKIHZvaWQgT2JqZWN0QmFzZTo6c2V0TmFtZShjb25zdCBjaGFyICpuYW1lKQogewotICAgIHNldE5hbWUobmFtZSwgc3RybGVuKG5hbWUpKTsKKyAgICBtTmFtZS5zZXRUbyhuYW1lKTsKIH0KIAogdm9pZCBPYmplY3RCYXNlOjpzZXROYW1lKGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGxlbikKIHsKLSAgICBkZWxldGUgbU5hbWU7Ci0gICAgbU5hbWUgPSBOVUxMOwotICAgIGlmIChuYW1lKSB7Ci0gICAgICAgIG1OYW1lID0gbmV3IGNoYXJbbGVuICsgMV07Ci0gICAgICAgIG1lbWNweShtTmFtZSwgbmFtZSwgbGVuKTsKLSAgICAgICAgbU5hbWVbbGVuXSA9IDA7Ci0gICAgfQorICAgIG1OYW1lLnNldFRvKG5hbWUsIGxlbik7CiB9CiAKIHZvaWQgT2JqZWN0QmFzZTo6YWRkKCkgY29uc3QKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNPYmplY3RCYXNlLmggYi9saWJzL3JzL3JzT2JqZWN0QmFzZS5oCmluZGV4IGJiMDNiODcuLmFkOTViODEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNPYmplY3RCYXNlLmgKKysrIGIvbGlicy9ycy9yc09iamVjdEJhc2UuaApAQCAtMjQsNiArMjQsNyBAQAogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKIGNsYXNzIENvbnRleHQ7CitjbGFzcyBPU3RyZWFtOwogCiAvLyBBbiBlbGVtZW50IGlzIGEgZ3JvdXAgb2YgQ29tcG9uZW50cyB0aGF0IG9jY3VwaWVzIG9uZSBjZWxsIGluIGEgc3RydWN0dXJlLgogY2xhc3MgT2JqZWN0QmFzZQpAQCAtNDAsNyArNDEsNyBAQAogICAgIGJvb2wgemVyb1VzZXJSZWYoKSBjb25zdDsKIAogICAgIGNvbnN0IGNoYXIgKiBnZXROYW1lKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgICAgIHJldHVybiBtTmFtZS5zdHJpbmcoKTsKICAgICB9CiAgICAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIgKik7CiAgICAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIgKiwgdWludDMyX3QgbGVuKTsKQEAgLTUyLDYgKzUzLDggQEAKICAgICBzdGF0aWMgdm9pZCBkdW1wQWxsKENvbnRleHQgKnJzYyk7CiAKICAgICB2aXJ0dWFsIHZvaWQgZHVtcExPR1YoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCA9IDA7CiAKIHByb3RlY3RlZDoKICAgICBjb25zdCBjaGFyICptQWxsb2NGaWxlOwpAQCAtNjQsNyArNjcsNyBAQAogCiAgICAgYm9vbCBjaGVja0RlbGV0ZSgpIGNvbnN0OwogCi0gICAgY2hhciAqIG1OYW1lOworICAgIFN0cmluZzggbU5hbWU7CiAgICAgbXV0YWJsZSBpbnQzMl90IG1TeXNSZWZDb3VudDsKICAgICBtdXRhYmxlIGludDMyX3QgbVVzZXJSZWZDb3VudDsKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW0uY3BwIGIvbGlicy9ycy9yc1Byb2dyYW0uY3BwCmluZGV4IDcwZTI4NjguLjYwNDFkYjggMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtLmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbS5jcHAKQEAgLTE0LDExICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtLmgiCi0KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0yMzUsNyArMjQxLDEyOSBAQAogICAgIG1Vc2VyU2hhZGVyLnNldFRvKHR4dCwgbGVuKTsKIH0KIAordm9pZCBQcm9ncmFtOjphcHBlbmRVc2VyQ29uc3RhbnRzKCkgeworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ29uc3RhbnRDb3VudDsgY3QrKykgeworICAgICAgICBjb25zdCBFbGVtZW50ICplID0gbUNvbnN0YW50VHlwZXNbY3RdLT5nZXRFbGVtZW50KCk7CisgICAgICAgIGZvciAodWludDMyX3QgZmllbGQ9MDsgZmllbGQgPCBlLT5nZXRGaWVsZENvdW50KCk7IGZpZWxkKyspIHsKKyAgICAgICAgICAgIGNvbnN0IEVsZW1lbnQgKmYgPSBlLT5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpmbiA9IGUtPmdldEZpZWxkTmFtZShmaWVsZCk7CiAKKyAgICAgICAgICAgIGlmIChmblswXSA9PSAnIycpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2Fubm90IGJlIGNvbXBsZXgKKyAgICAgICAgICAgIHJzQXNzZXJ0KCFmLT5nZXRGaWVsZENvdW50KCkpOworICAgICAgICAgICAgaWYoZi0+Z2V0VHlwZSgpID09IFJTX1RZUEVfTUFUUklYXzRYNCkgeworICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIG1hdDQgVU5JXyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihmLT5nZXRUeXBlKCkgPT0gUlNfVFlQRV9NQVRSSVhfM1gzKSB7CisgICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoInVuaWZvcm0gbWF0MyBVTklfIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGYtPmdldFR5cGUoKSA9PSBSU19UWVBFX01BVFJJWF8yWDIpIHsKKyAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSBtYXQyIFVOSV8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaChmLT5nZXRDb21wb25lbnQoKS5nZXRWZWN0b3JTaXplKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIGZsb2F0IFVOSV8iKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSB2ZWMyIFVOSV8iKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOiBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSB2ZWMzIFVOSV8iKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0OiBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSB2ZWM0IFVOSV8iKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcnNBc3NlcnQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZChmbik7CisgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiO1xuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUHJvZ3JhbTo6c2V0dXBVc2VyQ29uc3RhbnRzKFNoYWRlckNhY2hlICpzYywgYm9vbCBpc0ZyYWdtZW50KSB7CisgICAgdWludDMyX3QgdWlkeCA9IDE7CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1Db25zdGFudENvdW50OyBjdCsrKSB7CisgICAgICAgIEFsbG9jYXRpb24gKmFsbG9jID0gbUNvbnN0YW50c1tjdCsxXS5nZXQoKTsKKyAgICAgICAgaWYgKCFhbGxvYykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCAqPihhbGxvYy0+Z2V0UHRyKCkpOworICAgICAgICBjb25zdCBFbGVtZW50ICplID0gbUNvbnN0YW50VHlwZXNbY3RdLT5nZXRFbGVtZW50KCk7CisgICAgICAgIGZvciAodWludDMyX3QgZmllbGQ9MDsgZmllbGQgPCBlLT5nZXRGaWVsZENvdW50KCk7IGZpZWxkKyspIHsKKyAgICAgICAgICAgIGNvbnN0IEVsZW1lbnQgKmYgPSBlLT5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpmaWVsZE5hbWUgPSBlLT5nZXRGaWVsZE5hbWUoZmllbGQpOworICAgICAgICAgICAgLy8gSWYgdGhpcyBmaWVsZCBpcyBwYWRkaW5nLCBza2lwIGl0CisgICAgICAgICAgICBpZihmaWVsZE5hbWVbMF0gPT0gJyMnKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCA9IGUtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoZmllbGQpOworICAgICAgICAgICAgY29uc3QgZmxvYXQgKmZkID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCAqPigmZGF0YVtvZmZzZXRdKTsKKworICAgICAgICAgICAgaW50MzJfdCBzbG90ID0gLTE7CisgICAgICAgICAgICBpZighaXNGcmFnbWVudCkgeworICAgICAgICAgICAgICAgIHNsb3QgPSBzYy0+dnR4VW5pZm9ybVNsb3QodWlkeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzbG90ID0gc2MtPmZyYWdVbmlmb3JtU2xvdCh1aWR4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9MT0dFKCJVbmlmb3JtICBzbG90PSVpLCBvZmZzZXQ9JWksIGNvbnN0YW50PSVpLCBmaWVsZD0laSwgdWlkeD0laSwgbmFtZT0lcyIsIHNsb3QsIG9mZnNldCwgY3QsIGZpZWxkLCB1aWR4LCBmaWVsZE5hbWUpOworICAgICAgICAgICAgaWYgKHNsb3QgPj0gMCkgeworICAgICAgICAgICAgICAgIGlmKGYtPmdldFR5cGUoKSA9PSBSU19UWVBFX01BVFJJWF80WDQpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtTWF0cml4NGZ2KHNsb3QsIDEsIEdMX0ZBTFNFLCBmZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoZi0+Z2V0VHlwZSgpID09IFJTX1RZUEVfTUFUUklYXzNYMykgeworICAgICAgICAgICAgICAgICAgICBnbFVuaWZvcm1NYXRyaXgzZnYoc2xvdCwgMSwgR0xfRkFMU0UsIGZkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihmLT5nZXRUeXBlKCkgPT0gUlNfVFlQRV9NQVRSSVhfMlgyKSB7CisgICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybU1hdHJpeDJmdihzbG90LCAxLCBHTF9GQUxTRSwgZmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGYtPmdldENvbXBvbmVudCgpLmdldFZlY3RvclNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAvL0xPR0UoIlVuaWZvcm0gMSA9ICVmIiwgZmRbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtMWZ2KHNsb3QsIDEsIGZkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAvL0xPR0UoIlVuaWZvcm0gMiA9ICVmICVmIiwgZmRbMF0sIGZkWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybTJmdihzbG90LCAxLCBmZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgLy9MT0dFKCJVbmlmb3JtIDMgPSAlZiAlZiAlZiIsIGZkWzBdLCBmZFsxXSwgZmRbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtM2Z2KHNsb3QsIDEsIGZkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvL0xPR0UoIlVuaWZvcm0gNCA9ICVmICVmICVmICVmIiwgZmRbMF0sIGZkWzFdLCBmZFsyXSwgZmRbM10pOworICAgICAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtNGZ2KHNsb3QsIDEsIGZkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcnNBc3NlcnQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aWR4ICsrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFByb2dyYW06OmluaXRBZGRVc2VyRWxlbWVudChjb25zdCBFbGVtZW50ICplLCBTdHJpbmc4ICpuYW1lcywgdWludDMyX3QgKmNvdW50LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisgICAgcnNBc3NlcnQoZS0+Z2V0RmllbGRDb3VudCgpKTsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgZS0+Z2V0RmllbGRDb3VudCgpOyBjdCsrKSB7CisgICAgICAgIGNvbnN0IEVsZW1lbnQgKmNlID0gZS0+Z2V0RmllbGQoY3QpOworICAgICAgICBpZiAoY2UtPmdldEZpZWxkQ291bnQoKSkgeworICAgICAgICAgICAgaW5pdEFkZFVzZXJFbGVtZW50KGNlLCBuYW1lcywgY291bnQsIHByZWZpeCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihlLT5nZXRGaWVsZE5hbWUoY3QpWzBdICE9ICcjJykgeworICAgICAgICAgICAgU3RyaW5nOCB0bXAocHJlZml4KTsKKyAgICAgICAgICAgIHRtcC5hcHBlbmQoZS0+Z2V0RmllbGROYW1lKGN0KSk7CisgICAgICAgICAgICBuYW1lc1sqY291bnRdLnNldFRvKHRtcC5zdHJpbmcoKSk7CisgICAgICAgICAgICAoKmNvdW50KSsrOworICAgICAgICB9CisgICAgfQorfQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtLmggYi9saWJzL3JzL3JzUHJvZ3JhbS5oCmluZGV4IDg2Zjg1ZmIuLmRkYzVlOGEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtLmgKKysrIGIvbGlicy9ycy9yc1Byb2dyYW0uaApAQCAtNzIsNiArNzIsMTEgQEAKICAgICB1aW50MzJfdCBtQ29uc3RhbnRDb3VudDsKICAgICBib29sIG1Jc1ZhbGlkOwogCisgICAgLy8gQXBwbGllcyB0byB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlcnMgb25seQorICAgIHZvaWQgYXBwZW5kVXNlckNvbnN0YW50cygpOworICAgIHZvaWQgc2V0dXBVc2VyQ29uc3RhbnRzKFNoYWRlckNhY2hlICpzYywgYm9vbCBpc0ZyYWdtZW50KTsKKyAgICB2b2lkIGluaXRBZGRVc2VyRWxlbWVudChjb25zdCBFbGVtZW50ICplLCBTdHJpbmc4ICpuYW1lcywgdWludDMyX3QgKmNvdW50LCBjb25zdCBjaGFyICpwcmVmaXgpOworCiAgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtQ29uc3RhbnRzW01BWF9VTklGT1JNU107CiAKICAgICBtdXRhYmxlIGJvb2wgbURpcnR5OwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudC5jcHAgYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmNwcAppbmRleCBjMTdiOTRjLi5lYzljNTY5IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmNwcApAQCAtMTQsMTMgKzE0LDE5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKLSNpbmNsdWRlICJyc1Byb2dyYW1GcmFnbWVudC5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTMyLDEzICszOCwyMSBAQAogewogICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKICAgICBtQWxsb2NMaW5lID0gX19MSU5FX187Ci0gICAgcnNBc3NlcnQocGFyYW1MZW5ndGggPSA1KTsKKyAgICByc0Fzc2VydChwYXJhbUxlbmd0aCA9PSA2KTsKKworICAgIG1Db25zdGFudENvbG9yWzBdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzFdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzJdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzNdID0gMS5mOwogCiAgICAgbUVudk1vZGVzWzBdID0gKFJzVGV4RW52TW9kZSlwYXJhbXNbMF07CiAgICAgbVRleHR1cmVGb3JtYXRzWzBdID0gcGFyYW1zWzFdOwogICAgIG1FbnZNb2Rlc1sxXSA9IChSc1RleEVudk1vZGUpcGFyYW1zWzJdOwogICAgIG1UZXh0dXJlRm9ybWF0c1sxXSA9IHBhcmFtc1szXTsKICAgICBtUG9pbnRTcHJpdGVFbmFibGUgPSBwYXJhbXNbNF0gIT0gMDsKKyAgICBtVmFyeWluZ0NvbG9yID0gZmFsc2U7CisgICAgaWYgKHBhcmFtTGVuZ3RoID4gNSkKKyAgICAgICAgbVZhcnlpbmdDb2xvciA9IHBhcmFtc1s1XSAhPSAwOwogCiAgICAgbVRleHR1cmVFbmFibGVNYXNrID0gMDsKICAgICBpZiAobUVudk1vZGVzWzBdKSB7CkBAIC00Nyw2ICs2MSwxNiBAQAogICAgIGlmIChtRW52TW9kZXNbMV0pIHsKICAgICAgICAgbVRleHR1cmVFbmFibGVNYXNrIHw9IDI7CiAgICAgfQorCisgICAgbVVuaWZvcm1Db3VudCA9IDA7CisgICAgbVVuaWZvcm1OYW1lc1ttVW5pZm9ybUNvdW50KytdLnNldFRvKCJ1bmlfVGV4MCIpOworICAgIG1Vbmlmb3JtTmFtZXNbbVVuaWZvcm1Db3VudCsrXS5zZXRUbygidW5pX1RleDEiKTsKKworICAgIG1Db25zdGFudENvbG9yVW5pZm9ybUluZGV4ID0gLTE7CisgICAgLy9pZiAoIW1WYXJ5aW5nQ29sb3IpIHsKKyAgICAgICAgbUNvbnN0YW50Q29sb3JVbmlmb3JtSW5kZXggPSBtVW5pZm9ybUNvdW50OworICAgICAgICBtVW5pZm9ybU5hbWVzW21Vbmlmb3JtQ291bnQrK10uc2V0VG8oInVuaV9Db2xvciIpOworICAgIC8vfQogICAgIGluaXQocnNjKTsKIH0KIApAQCAtNTgsOCArODIsMjAgQEAKICAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CiAgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwogCi0gICAgaW5pdChyc2MpOworICAgIG1Db25zdGFudENvbG9yWzBdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzFdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzJdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzNdID0gMS5mOworCisgICAgTE9HRSgiQ3VzdG9tIEZQIik7CisKKyAgICBtVW5pZm9ybUNvdW50ID0gMjsKKyAgICBtVW5pZm9ybU5hbWVzWzBdLnNldFRvKCJ1bmlfVGV4MCIpOworICAgIG1Vbmlmb3JtTmFtZXNbMV0uc2V0VG8oInVuaV9UZXgxIik7CisKICAgICBtVGV4dHVyZUVuYWJsZU1hc2sgPSAoMSA8PCBtVGV4dHVyZUNvdW50KSAtMTsKKworICAgIGluaXQocnNjKTsKIH0KIAogCkBAIC02Nyw3NiArMTAzLDE3IEBACiB7CiB9CiAKK3ZvaWQgUHJvZ3JhbUZyYWdtZW50OjpzZXRDb25zdGFudENvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgbUNvbnN0YW50Q29sb3JbMF0gPSByOworICAgIG1Db25zdGFudENvbG9yWzFdID0gZzsKKyAgICBtQ29uc3RhbnRDb2xvclsyXSA9IGI7CisgICAgbUNvbnN0YW50Q29sb3JbM10gPSBhOworICAgIG1EaXJ0eSA9IHRydWU7Cit9CisKIHZvaWQgUHJvZ3JhbUZyYWdtZW50OjpzZXR1cEdMKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbUZyYWdtZW50U3RhdGUgKnN0YXRlKQogewotICAgIGlmICgoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpICYmICFtRGlydHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOwotCi0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IE1BWF9URVhUVVJFOyBjdCsrKSB7Ci0gICAgICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCArIGN0KTsKLSAgICAgICAgaWYgKCEobVRleHR1cmVFbmFibGVNYXNrICYgKDEgPDwgY3QpKSB8fCAhbVRleHR1cmVzW2N0XS5nZXQoKSkgewotICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICAgICAgaWYgKHJzYy0+Y2hlY2tWZXJzaW9uMV8xKCkpIHsKLSAgICAgICAgICAgIGlmIChtUG9pbnRTcHJpdGVFbmFibGUpIHsKLSAgICAgICAgICAgICAgICBnbEVuYWJsZShHTF9QT0lOVF9TUFJJVEVfT0VTKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1BPSU5UX1NQUklURV9PRVMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1BPSU5UX1NQUklURV9PRVMsIEdMX0NPT1JEX1JFUExBQ0VfT0VTLCBtUG9pbnRTcHJpdGVFbmFibGUpOwotICAgICAgICB9Ci0gICAgICAgIG1UZXh0dXJlc1tjdF0tPnVwbG9hZENoZWNrKHJzYyk7Ci0gICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbVRleHR1cmVzW2N0XS0+Z2V0VGV4dHVyZUlEKCkpOwotCi0gICAgICAgIHN3aXRjaChtRW52TW9kZXNbY3RdKSB7Ci0gICAgICAgIGNhc2UgUlNfVEVYX0VOVl9NT0RFX05PTkU6Ci0gICAgICAgICAgICByc0Fzc2VydCgwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJTX1RFWF9FTlZfTU9ERV9SRVBMQUNFOgotICAgICAgICAgICAgZ2xUZXhFbnZmKEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJTX1RFWF9FTlZfTU9ERV9NT0RVTEFURToKLSAgICAgICAgICAgIGdsVGV4RW52ZihHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfTU9EVUxBVEUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlNfVEVYX0VOVl9NT0RFX0RFQ0FMOgotICAgICAgICAgICAgZ2xUZXhFbnZmKEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9ERUNBTCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU2FtcGxlcnNbY3RdLmdldCgpKSB7Ci0gICAgICAgICAgICBtU2FtcGxlcnNbY3RdLT5zZXR1cEdMKHJzYywgbVRleHR1cmVzW2N0XS0+Z2V0VHlwZSgpLT5nZXRJc05wMigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOwotICAgICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX1JFUEVBVCk7Ci0gICAgICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX1JFUEVBVCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHcm9zcyBoYWNrLgotICAgICAgICBpZiAoY3QgPT0gMikgewotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9DT01CSU5FKTsKLQotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9DT01CSU5FX1JHQiwgR0xfQUREKTsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfU1JDMF9SR0IsIEdMX1BSRVZJT1VTKTsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfU1JDMV9SR0IsIEdMX1RFWFRVUkUpOwotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9PUEVSQU5EMF9SR0IsIEdMX1NSQ19DT0xPUik7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX09QRVJBTkQxX1JHQiwgR0xfU1JDX0NPTE9SKTsKLQotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9DT01CSU5FX0FMUEhBLCBHTF9BREQpOwotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9TUkMwX0FMUEhBLCBHTF9QUkVWSU9VUyk7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX1NSQzFfQUxQSEEsIEdMX1RFWFRVUkUpOwotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9PUEVSQU5EMF9BTFBIQSwgR0xfU1JDX0FMUEhBKTsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfT1BFUkFORDFfQUxQSEEsIEdMX1NSQ19BTFBIQSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKLSAgICBtRGlydHkgPSBmYWxzZTsKLSAgICByc2MtPmNoZWNrRXJyb3IoIlByb2dyYW1GcmFnbWVudDo6c2V0dXBHTCIpOwogfQogCiB2b2lkIFByb2dyYW1GcmFnbWVudDo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtRnJhZ21lbnRTdGF0ZSAqc3RhdGUsIFNoYWRlckNhY2hlICpzYykKQEAgLTE0NCwxMSArMTIxLDIyIEBACiAKICAgICAvL0xPR0UoInNnbDIgZnJhZzEgJXgiLCBnbEdldEVycm9yKCkpOwogICAgIGlmICgoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpICYmICFtRGlydHkpIHsKLSAgICAgICAgLy9yZXR1cm47CisgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKIAogICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbUZyYWdtZW50OjpzZXR1cEdMMiBzdGFydCIpOworCisgICAgaWYgKCFtVmFyeWluZ0NvbG9yICYmCisgICAgICAgIChzYy0+ZnJhZ1VuaWZvcm1TbG90KG1Db25zdGFudENvbG9yVW5pZm9ybUluZGV4KSA+PSAwKSkgeworICAgICAgICAvL0xPR0UoIm1Db25zdGFudENvbG9yVW5pZm9ybUluZGV4ICVpICVpIiwgbUNvbnN0YW50Q29sb3JVbmlmb3JtSW5kZXgsIHNjLT5mcmFnVW5pZm9ybVNsb3QobUNvbnN0YW50Q29sb3JVbmlmb3JtSW5kZXgpKTsKKyAgICAgICAgZ2xVbmlmb3JtNGZ2KHNjLT5mcmFnVW5pZm9ybVNsb3QobUNvbnN0YW50Q29sb3JVbmlmb3JtSW5kZXgpLCAxLCBtQ29uc3RhbnRDb2xvcik7CisgICAgICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbUZyYWdtZW50Ojpjb2xvciBzZXR1cCIpOworICAgIH0KKworICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbUZyYWdtZW50OjpzZXR1cEdMMiBiZWdpbiB1bmlmb3JtcyIpOworICAgIHNldHVwVXNlckNvbnN0YW50cyhzYywgdHJ1ZSk7CisKICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgTUFYX1RFWFRVUkU7IGN0KyspIHsKICAgICAgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwICsgY3QpOwogICAgICAgICBpZiAoIShtVGV4dHVyZUVuYWJsZU1hc2sgJiAoMSA8PCBjdCkpIHx8ICFtVGV4dHVyZXNbY3RdLmdldCgpKSB7CkBAIC0xODQsOCArMTcyLDkgQEAKIHZvaWQgUHJvZ3JhbUZyYWdtZW50OjpjcmVhdGVTaGFkZXIoKQogewogICAgIG1TaGFkZXIuc2V0VG8oInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIik7Ci0gICAgbVNoYWRlci5hcHBlbmQoInZhcnlpbmcgdmVjNCB2YXJDb2xvcjtcbiIpOworICAgIG1TaGFkZXIuYXBwZW5kKCJ2YXJ5aW5nIGxvd3AgdmVjNCB2YXJDb2xvcjtcbiIpOwogICAgIG1TaGFkZXIuYXBwZW5kKCJ2YXJ5aW5nIHZlYzQgdmFyVGV4MDtcbiIpOworICAgIG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIHZlYzQgdW5pX0NvbG9yO1xuIik7CiAKICAgICBpZiAobVVzZXJTaGFkZXIubGVuZ3RoKCkgPiAxKSB7CiAgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVGV4dHVyZUNvdW50OyBjdCsrKSB7CkBAIC0xOTMsNyArMTgyLDcgQEAKICAgICAgICAgICAgIHNwcmludGYoYnVmLCAidW5pZm9ybSBzYW1wbGVyMkQgdW5pX1RleCVpO1xuIiwgY3QpOwogICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoYnVmKTsKICAgICAgICAgfQotCisgICAgICAgIGFwcGVuZFVzZXJDb25zdGFudHMoKTsKICAgICAgICAgbVNoYWRlci5hcHBlbmQobVVzZXJTaGFkZXIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHVpbnQzMl90IG1hc2sgPSBtVGV4dHVyZUVuYWJsZU1hc2s7CkBAIC0yMTIsNyArMjAxLDExIEBACiAKIAogICAgICAgICBtU2hhZGVyLmFwcGVuZCgidm9pZCBtYWluKCkge1xuIik7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZlYzQgY29sID0gdmFyQ29sb3I7XG4iKTsKKyAgICAgICAgaWYgKG1WYXJ5aW5nQ29sb3IpIHsKKyAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGxvd3AgdmVjNCBjb2wgPSB2YXJDb2xvcjtcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgbG93cCB2ZWM0IGNvbCA9IHVuaV9Db2xvcjtcbiIpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKG1UZXh0dXJlRW5hYmxlTWFzaykgewogICAgICAgICAgICAgaWYgKG1Qb2ludFNwcml0ZUVuYWJsZSkgewpAQCAtMjgyLDEzICsyNzUsMjUgQEAKIAogdm9pZCBQcm9ncmFtRnJhZ21lbnQ6OmluaXQoQ29udGV4dCAqcnNjKQogewotICAgIG1Vbmlmb3JtQ291bnQgPSAyOwotICAgIG1Vbmlmb3JtTmFtZXNbMF0uc2V0VG8oInVuaV9UZXgwIik7Ci0gICAgbVVuaWZvcm1OYW1lc1sxXS5zZXRUbygidW5pX1RleDEiKTsKKyAgICBpZiAobVVzZXJTaGFkZXIuc2l6ZSgpID4gMCkgeworICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvbnN0YW50Q291bnQ7IGN0KyspIHsKKyAgICAgICAgICAgIGluaXRBZGRVc2VyRWxlbWVudChtQ29uc3RhbnRUeXBlc1tjdF0tPmdldEVsZW1lbnQoKSwgbVVuaWZvcm1OYW1lcywgJm1Vbmlmb3JtQ291bnQsICJVTklfIik7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBjcmVhdGVTaGFkZXIoKTsKIH0KIAordm9pZCBQcm9ncmFtRnJhZ21lbnQ6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisKK30KKworUHJvZ3JhbUZyYWdtZW50ICpQcm9ncmFtRnJhZ21lbnQ6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIFByb2dyYW1GcmFnbWVudFN0YXRlOjpQcm9ncmFtRnJhZ21lbnRTdGF0ZSgpCiB7CiAgICAgbVBGID0gTlVMTDsKQEAgLTMwMCwxNiArMzA1LDE1IEBACiAKIH0KIAotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKQordm9pZCBQcm9ncmFtRnJhZ21lbnRTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MpCiB7Ci0gICAgdWludDMyX3QgdG1wWzVdID0geworICAgIHVpbnQzMl90IHRtcFtdID0gewogICAgICAgICBSU19URVhfRU5WX01PREVfTk9ORSwgMCwKICAgICAgICAgUlNfVEVYX0VOVl9NT0RFX05PTkUsIDAsCi0gICAgICAgIDAKKyAgICAgICAgMCwgMAogICAgIH07Ci0gICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQocnNjLCB0bXAsIDUpOworICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSBuZXcgUHJvZ3JhbUZyYWdtZW50KHJzYywgdG1wLCA2KTsKICAgICBtRGVmYXVsdC5zZXQocGYpOwotICAgIHBmLT5pbml0KHJzYyk7CiB9CiAKIHZvaWQgUHJvZ3JhbUZyYWdtZW50U3RhdGU6OmRlaW5pdChDb250ZXh0ICpyc2MpCkBAIC0zMjgsNiArMzMyLDcgQEAKIHsKICAgICBQcm9ncmFtRnJhZ21lbnQgKnBmID0gbmV3IFByb2dyYW1GcmFnbWVudChyc2MsIHBhcmFtcywgcGFyYW1MZW5ndGgpOwogICAgIHBmLT5pbmNVc2VyUmVmKCk7CisgICAgLy9MT0dFKCJyc2lfUHJvZ3JhbUZyYWdtZW50Q3JlYXRlICVwIiwgcGYpOwogICAgIHJldHVybiBwZjsKIH0KIApAQCAtMzM3LDYgKzM0Miw3IEBACiB7CiAgICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQocnNjLCBzaGFkZXJUZXh0LCBzaGFkZXJMZW5ndGgsIHBhcmFtcywgcGFyYW1MZW5ndGgpOwogICAgIHBmLT5pbmNVc2VyUmVmKCk7CisgICAgLy9MT0dFKCJyc2lfUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMiAlcCIsIHBmKTsKICAgICByZXR1cm4gcGY7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuaCBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuaAppbmRleCA5ZmE1NjVkLi43YzE1OThlIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmgKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudC5oCkBAIC00MCw2ICs0MCwxMSBAQAogICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVTaGFkZXIoKTsKICAgICB2aXJ0dWFsIHZvaWQgbG9hZFNoYWRlcihDb250ZXh0ICpyc2MpOwogICAgIHZpcnR1YWwgdm9pZCBpbml0KENvbnRleHQgKnJzYyk7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9GUkFHTUVOVDsgfQorICAgIHN0YXRpYyBQcm9ncmFtRnJhZ21lbnQgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCisgICAgdm9pZCBzZXRDb25zdGFudENvbG9yKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKIAogcHJvdGVjdGVkOgogICAgIC8vIEhhY2tzIHRvIGNyZWF0ZSBhIHByb2dyYW0gZm9yIG5vdwpAQCAtNDgsNiArNTMsMTAgQEAKICAgICBSc1RleEVudk1vZGUgbUVudk1vZGVzW01BWF9URVhUVVJFXTsKICAgICB1aW50MzJfdCBtVGV4dHVyZUVuYWJsZU1hc2s7CiAgICAgYm9vbCBtUG9pbnRTcHJpdGVFbmFibGU7CisgICAgYm9vbCBtVmFyeWluZ0NvbG9yOworCisgICAgZmxvYXQgbUNvbnN0YW50Q29sb3JbNF07CisgICAgaW50MzJfdCBtQ29uc3RhbnRDb2xvclVuaWZvcm1JbmRleDsKIH07CiAKIGNsYXNzIFByb2dyYW1GcmFnbWVudFN0YXRlCkBAIC01Nyw3ICs2Niw3IEBACiAgICAgflByb2dyYW1GcmFnbWVudFN0YXRlKCk7CiAKICAgICBQcm9ncmFtRnJhZ21lbnQgKm1QRjsKLSAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCk7CisgICAgdm9pZCBpbml0KENvbnRleHQgKnJzYyk7CiAgICAgdm9pZCBkZWluaXQoQ29udGV4dCAqcnNjKTsKIAogICAgIE9iamVjdEJhc2VSZWY8VHlwZT4gbVRleHR1cmVUeXBlc1tQcm9ncmFtRnJhZ21lbnQ6Ok1BWF9URVhUVVJFXTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5jcHAgYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50U3RvcmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTIxNTdmLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJyc0NvbnRleHQuaCIKLSNpbmNsdWRlICJyc1Byb2dyYW1GcmFnbWVudFN0b3JlLmgiCi0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7Ci0KLQotUHJvZ3JhbUZyYWdtZW50U3RvcmU6OlByb2dyYW1GcmFnbWVudFN0b3JlKENvbnRleHQgKnJzYykgOgotICAgIFByb2dyYW0ocnNjKQotewotICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKLSAgICBtQWxsb2NMaW5lID0gX19MSU5FX187Ci0gICAgbURpdGhlckVuYWJsZSA9IHRydWU7Ci0gICAgbUJsZW5kRW5hYmxlID0gZmFsc2U7Ci0gICAgbUNvbG9yUldyaXRlRW5hYmxlID0gdHJ1ZTsKLSAgICBtQ29sb3JHV3JpdGVFbmFibGUgPSB0cnVlOwotICAgIG1Db2xvckJXcml0ZUVuYWJsZSA9IHRydWU7Ci0gICAgbUNvbG9yQVdyaXRlRW5hYmxlID0gdHJ1ZTsKLSAgICBtQmxlbmRTcmMgPSBHTF9PTkU7Ci0gICAgbUJsZW5kRHN0ID0gR0xfWkVSTzsKLQotCi0gICAgbURlcHRoVGVzdEVuYWJsZSA9IGZhbHNlOwotICAgIG1EZXB0aFdyaXRlRW5hYmxlID0gdHJ1ZTsKLSAgICBtRGVwdGhGdW5jID0gR0xfTEVTUzsKLQotCi19Ci0KLVByb2dyYW1GcmFnbWVudFN0b3JlOjp+UHJvZ3JhbUZyYWdtZW50U3RvcmUoKQotewotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXR1cEdMKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSAqc3RhdGUpCi17Ci0gICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKLQotICAgIGdsQ29sb3JNYXNrKG1Db2xvclJXcml0ZUVuYWJsZSwKLSAgICAgICAgICAgICAgICBtQ29sb3JHV3JpdGVFbmFibGUsCi0gICAgICAgICAgICAgICAgbUNvbG9yQldyaXRlRW5hYmxlLAotICAgICAgICAgICAgICAgIG1Db2xvckFXcml0ZUVuYWJsZSk7Ci0gICAgaWYgKG1CbGVuZEVuYWJsZSkgewotICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7Ci0gICAgICAgIGdsQmxlbmRGdW5jKG1CbGVuZFNyYywgbUJsZW5kRHN0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOwotICAgIH0KLQotICAgIC8vTE9HRSgicGZzICAlaSwgJWksICV4IiwgbURlcHRoV3JpdGVFbmFibGUsIG1EZXB0aFRlc3RFbmFibGUsIG1EZXB0aEZ1bmMpOwotCi0gICAgZ2xEZXB0aE1hc2sobURlcHRoV3JpdGVFbmFibGUpOwotICAgIGlmKG1EZXB0aFRlc3RFbmFibGUgfHwgbURlcHRoV3JpdGVFbmFibGUpIHsKLSAgICAgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7Ci0gICAgICAgIGdsRGVwdGhGdW5jKG1EZXB0aEZ1bmMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKLSAgICB9Ci0KLSAgICBpZiAobURpdGhlckVuYWJsZSkgewotICAgICAgICBnbEVuYWJsZShHTF9ESVRIRVIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOwotICAgIH0KLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZTo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlICpzdGF0ZSkKLXsKLSAgICBpZiAoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOwotCi0gICAgZ2xDb2xvck1hc2sobUNvbG9yUldyaXRlRW5hYmxlLAotICAgICAgICAgICAgICAgIG1Db2xvckdXcml0ZUVuYWJsZSwKLSAgICAgICAgICAgICAgICBtQ29sb3JCV3JpdGVFbmFibGUsCi0gICAgICAgICAgICAgICAgbUNvbG9yQVdyaXRlRW5hYmxlKTsKLSAgICBpZiAobUJsZW5kRW5hYmxlKSB7Ci0gICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKLSAgICAgICAgZ2xCbGVuZEZ1bmMobUJsZW5kU3JjLCBtQmxlbmREc3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0gICAgfQotCi0gICAgLy9MT0dFKCJwZnMgICVpLCAlaSwgJXgiLCBtRGVwdGhXcml0ZUVuYWJsZSwgbURlcHRoVGVzdEVuYWJsZSwgbURlcHRoRnVuYyk7Ci0KLSAgICBnbERlcHRoTWFzayhtRGVwdGhXcml0ZUVuYWJsZSk7Ci0gICAgaWYobURlcHRoVGVzdEVuYWJsZSB8fCBtRGVwdGhXcml0ZUVuYWJsZSkgewotICAgICAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKLSAgICAgICAgZ2xEZXB0aEZ1bmMobURlcHRoRnVuYyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOwotICAgIH0KLQotICAgIGlmIChtRGl0aGVyRW5hYmxlKSB7Ci0gICAgICAgIGdsRW5hYmxlKEdMX0RJVEhFUik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0gICAgfQotfQotCi0KLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmU6OnNldERpdGhlckVuYWJsZShib29sIGVuYWJsZSkKLXsKLSAgICBtRGl0aGVyRW5hYmxlID0gZW5hYmxlOwotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMgZnVuYykKLXsKLSAgICBtRGVwdGhUZXN0RW5hYmxlID0gdHJ1ZTsKLQotICAgIHN3aXRjaChmdW5jKSB7Ci0gICAgY2FzZSBSU19ERVBUSF9GVU5DX0FMV0FZUzoKLSAgICAgICAgbURlcHRoVGVzdEVuYWJsZSA9IGZhbHNlOwotICAgICAgICBtRGVwdGhGdW5jID0gR0xfQUxXQVlTOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfTEVTUzoKLSAgICAgICAgbURlcHRoRnVuYyA9IEdMX0xFU1M7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfREVQVEhfRlVOQ19MRVFVQUw6Ci0gICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9MRVFVQUw7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfREVQVEhfRlVOQ19HUkVBVEVSOgotICAgICAgICBtRGVwdGhGdW5jID0gR0xfR1JFQVRFUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19ERVBUSF9GVU5DX0dFUVVBTDoKLSAgICAgICAgbURlcHRoRnVuYyA9IEdMX0dFUVVBTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19ERVBUSF9GVU5DX0VRVUFMOgotICAgICAgICBtRGVwdGhGdW5jID0gR0xfRVFVQUw7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfREVQVEhfRlVOQ19OT1RFUVVBTDoKLSAgICAgICAgbURlcHRoRnVuYyA9IEdMX05PVEVRVUFMOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmU6OnNldERlcHRoTWFzayhib29sIG1hc2spCi17Ci0gICAgbURlcHRoV3JpdGVFbmFibGUgPSBtYXNrOwotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXRCbGVuZEZ1bmMoUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpCi17Ci0gICAgbUJsZW5kRW5hYmxlID0gdHJ1ZTsKLSAgICBpZiAoKHNyYyA9PSBSU19CTEVORF9TUkNfT05FKSAmJgotICAgICAgICAoZHN0ID09IFJTX0JMRU5EX0RTVF9aRVJPKSkgewotICAgICAgICBtQmxlbmRFbmFibGUgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBzd2l0Y2goc3JjKSB7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfWkVSTzoKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfWkVSTzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfT05FOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX0RTVF9DT0xPUjoKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfRFNUX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkVfTUlOVVNfRFNUX0NPTE9SOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX1NSQ19TUkNfQUxQSEE6Ci0gICAgICAgIG1CbGVuZFNyYyA9IEdMX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfT05FX01JTlVTX1NSQ19BTFBIQToKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfRFNUX0FMUEhBOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX09ORV9NSU5VU19EU1RfQUxQSEE6Ci0gICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORV9NSU5VU19EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX1NSQ19BTFBIQV9TQVRVUkFURToKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfU1JDX0FMUEhBX1NBVFVSQVRFOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzd2l0Y2goZHN0KSB7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfWkVSTzoKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfWkVSTzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfT05FOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfRFNUX1NSQ19DT0xPUjoKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfU1JDX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkVfTUlOVVNfU1JDX0NPTE9SOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX0RTVF9TUkNfQUxQSEE6Ci0gICAgICAgIG1CbGVuZERzdCA9IEdMX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfT05FX01JTlVTX1NSQ19BTFBIQToKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfRFNUX0FMUEhBOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfRFNUX09ORV9NSU5VU19EU1RfQUxQSEE6Ci0gICAgICAgIG1CbGVuZERzdCA9IEdMX09ORV9NSU5VU19EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZTo6c2V0Q29sb3JNYXNrKGJvb2wgciwgYm9vbCBnLCBib29sIGIsIGJvb2wgYSkKLXsKLSAgICBtQ29sb3JSV3JpdGVFbmFibGUgPSByOwotICAgIG1Db2xvckdXcml0ZUVuYWJsZSA9IGc7Ci0gICAgbUNvbG9yQldyaXRlRW5hYmxlID0gYjsKLSAgICBtQ29sb3JBV3JpdGVFbmFibGUgPSBhOwotfQotCi0KLVByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGU6OlByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUoKQotewotICAgIG1QRlMgPSBOVUxMOwotfQotCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlOjp+UHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSgpCi17Ci0gICAgZGVsZXRlIG1QRlM7Ci0KLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlOjppbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpCi17Ci0gICAgUHJvZ3JhbUZyYWdtZW50U3RvcmUgKnBmcyA9IG5ldyBQcm9ncmFtRnJhZ21lbnRTdG9yZShyc2MpOwotICAgIG1EZWZhdWx0LnNldChwZnMpOwotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGU6OmRlaW5pdChDb250ZXh0ICpyc2MpCi17Ci0gICAgbURlZmF1bHQuY2xlYXIoKTsKLSAgICBtTGFzdC5jbGVhcigpOwotfQotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi12b2lkIHJzaV9Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luKENvbnRleHQgKiByc2MsIFJzRWxlbWVudCBpbiwgUnNFbGVtZW50IG91dCkKLXsKLSAgICBkZWxldGUgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlM7Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMgPSBuZXcgUHJvZ3JhbUZyYWdtZW50U3RvcmUocnNjKTsKLQotfQotCi12b2lkIHJzaV9Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyhDb250ZXh0ICpyc2MsIFJzRGVwdGhGdW5jIGZ1bmMpCi17Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldERlcHRoRnVuYyhmdW5jKTsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2soQ29udGV4dCAqcnNjLCBib29sIG1hc2spCi17Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldERlcHRoTWFzayhtYXNrKTsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soQ29udGV4dCAqcnNjLCBib29sIHIsIGJvb2wgZywgYm9vbCBiLCBib29sIGEpCi17Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldENvbG9yTWFzayhyLCBnLCBiLCBhKTsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMoQ29udGV4dCAqcnNjLCBSc0JsZW5kU3JjRnVuYyBzcmMsIFJzQmxlbmREc3RGdW5jIGRzdCkKLXsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0QmxlbmRGdW5jKHNyYywgZHN0KTsKLX0KLQotUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUoQ29udGV4dCAqcnNjKQotewotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICpwZnMgPSByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUzsKLSAgICBwZnMtPmluY1VzZXJSZWYoKTsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUyA9IDA7Ci0gICAgcmV0dXJuIHBmczsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoQ29udGV4dCAqcnNjLCBib29sIGVuYWJsZSkKLXsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0RGl0aGVyRW5hYmxlKGVuYWJsZSk7Ci19Ci0KLQotfQotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudFN0b3JlLmggYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50U3RvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxMmM5OS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50U3RvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfUlNfUFJPR1JBTV9GUkFHTUVOVF9TVE9SRV9ICi0jZGVmaW5lIEFORFJPSURfUlNfUFJPR1JBTV9GUkFHTUVOVF9TVE9SRV9ICi0KLSNpbmNsdWRlICJyc1Byb2dyYW0uaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZTsKLQotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmUgOiBwdWJsaWMgUHJvZ3JhbQotewotcHVibGljOgotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlKENvbnRleHQgKik7Ci0gICAgdmlydHVhbCB+UHJvZ3JhbUZyYWdtZW50U3RvcmUoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXR1cEdMKGNvbnN0IENvbnRleHQgKiwgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTDIoY29uc3QgQ29udGV4dCAqLCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlICopOwotCi0gICAgdm9pZCBzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMpOwotICAgIHZvaWQgc2V0RGVwdGhNYXNrKGJvb2wpOwotCi0gICAgdm9pZCBzZXRCbGVuZEZ1bmMoUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpOwotICAgIHZvaWQgc2V0Q29sb3JNYXNrKGJvb2wsIGJvb2wsIGJvb2wsIGJvb2wpOwotCi0gICAgdm9pZCBzZXREaXRoZXJFbmFibGUoYm9vbCk7Ci0KLXByb3RlY3RlZDoKLSAgICBib29sIG1EaXRoZXJFbmFibGU7Ci0KLSAgICBib29sIG1CbGVuZEVuYWJsZTsKLSAgICBib29sIG1Db2xvclJXcml0ZUVuYWJsZTsKLSAgICBib29sIG1Db2xvckdXcml0ZUVuYWJsZTsKLSAgICBib29sIG1Db2xvckJXcml0ZUVuYWJsZTsKLSAgICBib29sIG1Db2xvckFXcml0ZUVuYWJsZTsKLSAgICBpbnQzMl90IG1CbGVuZFNyYzsKLSAgICBpbnQzMl90IG1CbGVuZERzdDsKLQotICAgIGJvb2wgbURlcHRoVGVzdEVuYWJsZTsKLSAgICBib29sIG1EZXB0aFdyaXRlRW5hYmxlOwotICAgIGludDMyX3QgbURlcHRoRnVuYzsKLQotICAgIGJvb2wgbVN0ZW5jaWxUZXN0RW5hYmxlOwotfTsKLQotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZQotewotcHVibGljOgotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUoKTsKLSAgICB+UHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSgpOwotICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKLSAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOwotCi0gICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gbURlZmF1bHQ7Ci0gICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gbUxhc3Q7Ci0KLQotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICptUEZTOwotfTsKLQotCi19Ci19Ci0jZW5kaWYKLQotCi0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmNwcCBiL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmNwcAppbmRleCAxMzg4N2QxLi41YjY5MzcwIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5jcHAKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuY3BwCkBAIC0xNCwxMSArMTQsMTcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotI2luY2x1ZGUgInJzUHJvZ3JhbVJhc3Rlci5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbVJhc3Rlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0zNSw5ICs0MSw4IEBACiAgICAgbVBvaW50U21vb3RoID0gcG9pbnRTbW9vdGg7CiAgICAgbUxpbmVTbW9vdGggPSBsaW5lU21vb3RoOwogICAgIG1Qb2ludFNwcml0ZSA9IHBvaW50U3ByaXRlOwotCi0gICAgbVBvaW50U2l6ZSA9IDEuMGY7CiAgICAgbUxpbmVXaWR0aCA9IDEuMGY7CisgICAgbUN1bGwgPSBSU19DVUxMX0JBQ0s7CiB9CiAKIFByb2dyYW1SYXN0ZXI6On5Qcm9ncmFtUmFzdGVyKCkKQEAgLTQ3LDIxICs1MiwyMyBAQAogdm9pZCBQcm9ncmFtUmFzdGVyOjpzZXRMaW5lV2lkdGgoZmxvYXQgcykKIHsKICAgICBtTGluZVdpZHRoID0gczsKKyAgICBtRGlydHkgPSB0cnVlOwogfQogCi12b2lkIFByb2dyYW1SYXN0ZXI6OnNldFBvaW50U2l6ZShmbG9hdCBzKQordm9pZCBQcm9ncmFtUmFzdGVyOjpzZXRDdWxsTW9kZShSc0N1bGxNb2RlIG1vZGUpCiB7Ci0gICAgbVBvaW50U2l6ZSA9IHM7CisgICAgbUN1bGwgPSBtb2RlOworICAgIG1EaXJ0eSA9IHRydWU7CiB9CiAKIHZvaWQgUHJvZ3JhbVJhc3Rlcjo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1SYXN0ZXJTdGF0ZSAqc3RhdGUpCiB7Ci0gICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSB7CisgICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzICYmICFtRGlydHkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOworICAgIG1EaXJ0eSA9IGZhbHNlOwogCi0gICAgZ2xQb2ludFNpemUobVBvaW50U2l6ZSk7CiAgICAgaWYgKG1Qb2ludFNtb290aCkgewogICAgICAgICBnbEVuYWJsZShHTF9QT0lOVF9TTU9PVEgpOwogICAgIH0gZWxzZSB7CkBAIC03NiwyMyArODMsNjIgQEAKICAgICB9CiAKICAgICBpZiAocnNjLT5jaGVja1ZlcnNpb24xXzEoKSkgeworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAgICAgICAgIGlmIChtUG9pbnRTcHJpdGUpIHsKICAgICAgICAgICAgIGdsRW5hYmxlKEdMX1BPSU5UX1NQUklURV9PRVMpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1BPSU5UX1NQUklURV9PRVMpOwogICAgICAgICB9CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisgICAgfQorCisgICAgc3dpdGNoKG1DdWxsKSB7CisgICAgICAgIGNhc2UgUlNfQ1VMTF9CQUNLOgorICAgICAgICAgICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICAgICAgICAgIGdsQ3VsbEZhY2UoR0xfQkFDSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19DVUxMX0ZST05UOgorICAgICAgICAgICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICAgICAgICAgIGdsQ3VsbEZhY2UoR0xfRlJPTlQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQ1VMTF9OT05FOgorICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBicmVhazsKICAgICB9CiB9CiAKIHZvaWQgUHJvZ3JhbVJhc3Rlcjo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtUmFzdGVyU3RhdGUgKnN0YXRlKQogewotICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgeworICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcyAmJiAhbURpcnR5KSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKKyAgICBtRGlydHkgPSBmYWxzZTsKKworICAgIHN3aXRjaChtQ3VsbCkgeworICAgICAgICBjYXNlIFJTX0NVTExfQkFDSzoKKyAgICAgICAgICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBnbEN1bGxGYWNlKEdMX0JBQ0spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQ1VMTF9GUk9OVDoKKyAgICAgICAgICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBnbEN1bGxGYWNlKEdMX0ZST05UKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0NVTExfTk9ORToKKyAgICAgICAgICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQogfQogCit2b2lkIFByb2dyYW1SYXN0ZXI6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CiAKK30KKworUHJvZ3JhbVJhc3RlciAqUHJvZ3JhbVJhc3Rlcjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KIAogUHJvZ3JhbVJhc3RlclN0YXRlOjpQcm9ncmFtUmFzdGVyU3RhdGUoKQogewpAQCAtMTAyLDcgKzE0OCw3IEBACiB7CiB9CiAKLXZvaWQgUHJvZ3JhbVJhc3RlclN0YXRlOjppbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpCit2b2lkIFByb2dyYW1SYXN0ZXJTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MpCiB7CiAgICAgUHJvZ3JhbVJhc3RlciAqcHIgPSBuZXcgUHJvZ3JhbVJhc3Rlcihyc2MsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwogICAgIG1EZWZhdWx0LnNldChwcik7CkBAIC0xMTgsNyArMTY0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCi1Sc1Byb2dyYW1SYXN0ZXIgcnNpX1Byb2dyYW1SYXN0ZXJDcmVhdGUoQ29udGV4dCAqIHJzYywgUnNFbGVtZW50IGluLCBSc0VsZW1lbnQgb3V0LAorUnNQcm9ncmFtUmFzdGVyIHJzaV9Qcm9ncmFtUmFzdGVyQ3JlYXRlKENvbnRleHQgKiByc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRTbW9vdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGluZVNtb290aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludFNwcml0ZSkKQEAgLTEzMSwxOCArMTc3LDE4IEBACiAgICAgcmV0dXJuIHByOwogfQogCi12b2lkIHJzaV9Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplKENvbnRleHQgKiByc2MsIFJzUHJvZ3JhbVJhc3RlciB2cHIsIGZsb2F0IHMpCi17Ci0gICAgUHJvZ3JhbVJhc3RlciAqcHIgPSBzdGF0aWNfY2FzdDxQcm9ncmFtUmFzdGVyICo+KHZwcik7Ci0gICAgcHItPnNldFBvaW50U2l6ZShzKTsKLX0KLQogdm9pZCByc2lfUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChDb250ZXh0ICogcnNjLCBSc1Byb2dyYW1SYXN0ZXIgdnByLCBmbG9hdCBzKQogewogICAgIFByb2dyYW1SYXN0ZXIgKnByID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbVJhc3RlciAqPih2cHIpOwogICAgIHByLT5zZXRMaW5lV2lkdGgocyk7CiB9CiAKK3ZvaWQgcnNpX1Byb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShDb250ZXh0ICogcnNjLCBSc1Byb2dyYW1SYXN0ZXIgdnByLCBSc0N1bGxNb2RlIG1vZGUpCit7CisgICAgUHJvZ3JhbVJhc3RlciAqcHIgPSBzdGF0aWNfY2FzdDxQcm9ncmFtUmFzdGVyICo+KHZwcik7CisgICAgcHItPnNldEN1bGxNb2RlKG1vZGUpOworfQorCiAKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmggYi9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5oCmluZGV4IGMzYTljOTAuLjgwMWFiMmEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmgKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuaApAQCAtMzYsMTkgKzM2LDE5IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICosIFByb2dyYW1SYXN0ZXJTdGF0ZSAqKTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTDIoY29uc3QgQ29udGV4dCAqLCBQcm9ncmFtUmFzdGVyU3RhdGUgKik7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9SQVNURVI7IH0KKyAgICBzdGF0aWMgUHJvZ3JhbVJhc3RlciAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKICAgICB2b2lkIHNldExpbmVXaWR0aChmbG9hdCB3KTsKLSAgICB2b2lkIHNldFBvaW50U2l6ZShmbG9hdCBzKTsKKyAgICB2b2lkIHNldEN1bGxNb2RlKFJzQ3VsbE1vZGUgbW9kZSk7CiAKIHByb3RlY3RlZDoKICAgICBib29sIG1Qb2ludFNtb290aDsKICAgICBib29sIG1MaW5lU21vb3RoOwogICAgIGJvb2wgbVBvaW50U3ByaXRlOwotCi0gICAgZmxvYXQgbVBvaW50U2l6ZTsKICAgICBmbG9hdCBtTGluZVdpZHRoOwotCi0KKyAgICBSc0N1bGxNb2RlIG1DdWxsOwogfTsKIAogY2xhc3MgUHJvZ3JhbVJhc3RlclN0YXRlCkBAIC01Niw3ICs1Niw3IEBACiBwdWJsaWM6CiAgICAgUHJvZ3JhbVJhc3RlclN0YXRlKCk7CiAgICAgflByb2dyYW1SYXN0ZXJTdGF0ZSgpOwotICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKICAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOwogCiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtUmFzdGVyPiBtRGVmYXVsdDsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuY3BwIGIvbGlicy9ycy9yc1Byb2dyYW1TdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0MWMwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuY3BwCkBAIC0wLDAgKzEsMzI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbVN0b3JlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworCitQcm9ncmFtU3RvcmU6OlByb2dyYW1TdG9yZShDb250ZXh0ICpyc2MpIDoKKyAgICBQcm9ncmFtKHJzYykKK3sKKyAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CisgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOworICAgIG1EaXRoZXJFbmFibGUgPSB0cnVlOworICAgIG1CbGVuZEVuYWJsZSA9IGZhbHNlOworICAgIG1Db2xvclJXcml0ZUVuYWJsZSA9IHRydWU7CisgICAgbUNvbG9yR1dyaXRlRW5hYmxlID0gdHJ1ZTsKKyAgICBtQ29sb3JCV3JpdGVFbmFibGUgPSB0cnVlOworICAgIG1Db2xvckFXcml0ZUVuYWJsZSA9IHRydWU7CisgICAgbUJsZW5kU3JjID0gR0xfT05FOworICAgIG1CbGVuZERzdCA9IEdMX1pFUk87CisKKworICAgIG1EZXB0aFRlc3RFbmFibGUgPSBmYWxzZTsKKyAgICBtRGVwdGhXcml0ZUVuYWJsZSA9IHRydWU7CisgICAgbURlcHRoRnVuYyA9IEdMX0xFU1M7CisKKworfQorCitQcm9ncmFtU3RvcmU6On5Qcm9ncmFtU3RvcmUoKQoreworfQorCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1TdG9yZVN0YXRlICpzdGF0ZSkKK3sKKyAgICBpZiAoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOworCisgICAgZ2xDb2xvck1hc2sobUNvbG9yUldyaXRlRW5hYmxlLAorICAgICAgICAgICAgICAgIG1Db2xvckdXcml0ZUVuYWJsZSwKKyAgICAgICAgICAgICAgICBtQ29sb3JCV3JpdGVFbmFibGUsCisgICAgICAgICAgICAgICAgbUNvbG9yQVdyaXRlRW5hYmxlKTsKKyAgICBpZiAobUJsZW5kRW5hYmxlKSB7CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xCbGVuZEZ1bmMobUJsZW5kU3JjLCBtQmxlbmREc3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgfQorCisgICAgLy9MT0dFKCJwZnMgICVpLCAlaSwgJXgiLCBtRGVwdGhXcml0ZUVuYWJsZSwgbURlcHRoVGVzdEVuYWJsZSwgbURlcHRoRnVuYyk7CisKKyAgICBnbERlcHRoTWFzayhtRGVwdGhXcml0ZUVuYWJsZSk7CisgICAgaWYobURlcHRoVGVzdEVuYWJsZSB8fCBtRGVwdGhXcml0ZUVuYWJsZSkgeworICAgICAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICAgICAgZ2xEZXB0aEZ1bmMobURlcHRoRnVuYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOworICAgIH0KKworICAgIGlmIChtRGl0aGVyRW5hYmxlKSB7CisgICAgICAgIGdsRW5hYmxlKEdMX0RJVEhFUik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7CisgICAgfQorfQorCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtU3RvcmVTdGF0ZSAqc3RhdGUpCit7CisgICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKKworICAgIGdsQ29sb3JNYXNrKG1Db2xvclJXcml0ZUVuYWJsZSwKKyAgICAgICAgICAgICAgICBtQ29sb3JHV3JpdGVFbmFibGUsCisgICAgICAgICAgICAgICAgbUNvbG9yQldyaXRlRW5hYmxlLAorICAgICAgICAgICAgICAgIG1Db2xvckFXcml0ZUVuYWJsZSk7CisgICAgaWYgKG1CbGVuZEVuYWJsZSkgeworICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKG1CbGVuZFNyYywgbUJsZW5kRHN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgIH0KKworICAgIC8vTE9HRSgicGZzICAlaSwgJWksICV4IiwgbURlcHRoV3JpdGVFbmFibGUsIG1EZXB0aFRlc3RFbmFibGUsIG1EZXB0aEZ1bmMpOworCisgICAgZ2xEZXB0aE1hc2sobURlcHRoV3JpdGVFbmFibGUpOworICAgIGlmKG1EZXB0aFRlc3RFbmFibGUgfHwgbURlcHRoV3JpdGVFbmFibGUpIHsKKyAgICAgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7CisgICAgICAgIGdsRGVwdGhGdW5jKG1EZXB0aEZ1bmMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICB9CisKKyAgICBpZiAobURpdGhlckVuYWJsZSkgeworICAgICAgICBnbEVuYWJsZShHTF9ESVRIRVIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOworICAgIH0KK30KKworCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0RGl0aGVyRW5hYmxlKGJvb2wgZW5hYmxlKQoreworICAgIG1EaXRoZXJFbmFibGUgPSBlbmFibGU7Cit9CisKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworCit9CisKK1Byb2dyYW1TdG9yZSAqUHJvZ3JhbVN0b3JlOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIHJldHVybiBOVUxMOworfQorCisKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMgZnVuYykKK3sKKyAgICBtRGVwdGhUZXN0RW5hYmxlID0gdHJ1ZTsKKworICAgIHN3aXRjaChmdW5jKSB7CisgICAgY2FzZSBSU19ERVBUSF9GVU5DX0FMV0FZUzoKKyAgICAgICAgbURlcHRoVGVzdEVuYWJsZSA9IGZhbHNlOworICAgICAgICBtRGVwdGhGdW5jID0gR0xfQUxXQVlTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfTEVTUzoKKyAgICAgICAgbURlcHRoRnVuYyA9IEdMX0xFU1M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfREVQVEhfRlVOQ19MRVFVQUw6CisgICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9MRVFVQUw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfREVQVEhfRlVOQ19HUkVBVEVSOgorICAgICAgICBtRGVwdGhGdW5jID0gR0xfR1JFQVRFUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19ERVBUSF9GVU5DX0dFUVVBTDoKKyAgICAgICAgbURlcHRoRnVuYyA9IEdMX0dFUVVBTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19ERVBUSF9GVU5DX0VRVUFMOgorICAgICAgICBtRGVwdGhGdW5jID0gR0xfRVFVQUw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfREVQVEhfRlVOQ19OT1RFUVVBTDoKKyAgICAgICAgbURlcHRoRnVuYyA9IEdMX05PVEVRVUFMOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXREZXB0aE1hc2soYm9vbCBtYXNrKQoreworICAgIG1EZXB0aFdyaXRlRW5hYmxlID0gbWFzazsKK30KKwordm9pZCBQcm9ncmFtU3RvcmU6OnNldEJsZW5kRnVuYyhSc0JsZW5kU3JjRnVuYyBzcmMsIFJzQmxlbmREc3RGdW5jIGRzdCkKK3sKKyAgICBtQmxlbmRFbmFibGUgPSB0cnVlOworICAgIGlmICgoc3JjID09IFJTX0JMRU5EX1NSQ19PTkUpICYmCisgICAgICAgIChkc3QgPT0gUlNfQkxFTkRfRFNUX1pFUk8pKSB7CisgICAgICAgIG1CbGVuZEVuYWJsZSA9IGZhbHNlOworICAgIH0KKworICAgIHN3aXRjaChzcmMpIHsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19aRVJPOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9aRVJPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkU6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfRFNUX0NPTE9SOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9EU1RfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfU1JDX09ORV9NSU5VU19EU1RfQ09MT1I6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORV9NSU5VU19EU1RfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfU1JDX1NSQ19BTFBIQToKKyAgICAgICAgbUJsZW5kU3JjID0gR0xfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkVfTUlOVVNfU1JDX0FMUEhBOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19EU1RfQUxQSEE6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfT05FX01JTlVTX0RTVF9BTFBIQToKKyAgICAgICAgbUJsZW5kU3JjID0gR0xfT05FX01JTlVTX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfU1JDX0FMUEhBX1NBVFVSQVRFOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9TUkNfQUxQSEFfU0FUVVJBVEU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaChkc3QpIHsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9aRVJPOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9aRVJPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkU6CisgICAgICAgIG1CbGVuZERzdCA9IEdMX09ORTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9EU1RfU1JDX0NPTE9SOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9TUkNfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfRFNUX09ORV9NSU5VU19TUkNfQ09MT1I6CisgICAgICAgIG1CbGVuZERzdCA9IEdMX09ORV9NSU5VU19TUkNfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfRFNUX1NSQ19BTFBIQToKKyAgICAgICAgbUJsZW5kRHN0ID0gR0xfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkVfTUlOVVNfU1JDX0FMUEhBOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9EU1RfQUxQSEE6CisgICAgICAgIG1CbGVuZERzdCA9IEdMX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9EU1RfT05FX01JTlVTX0RTVF9BTFBIQToKKyAgICAgICAgbUJsZW5kRHN0ID0gR0xfT05FX01JTlVTX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0Q29sb3JNYXNrKGJvb2wgciwgYm9vbCBnLCBib29sIGIsIGJvb2wgYSkKK3sKKyAgICBtQ29sb3JSV3JpdGVFbmFibGUgPSByOworICAgIG1Db2xvckdXcml0ZUVuYWJsZSA9IGc7CisgICAgbUNvbG9yQldyaXRlRW5hYmxlID0gYjsKKyAgICBtQ29sb3JBV3JpdGVFbmFibGUgPSBhOworfQorCisKK1Byb2dyYW1TdG9yZVN0YXRlOjpQcm9ncmFtU3RvcmVTdGF0ZSgpCit7CisgICAgbVBGUyA9IE5VTEw7Cit9CisKK1Byb2dyYW1TdG9yZVN0YXRlOjp+UHJvZ3JhbVN0b3JlU3RhdGUoKQoreworICAgIGRlbGV0ZSBtUEZTOworCit9CisKK3ZvaWQgUHJvZ3JhbVN0b3JlU3RhdGU6OmluaXQoQ29udGV4dCAqcnNjKQoreworICAgIFByb2dyYW1TdG9yZSAqcGZzID0gbmV3IFByb2dyYW1TdG9yZShyc2MpOworICAgIG1EZWZhdWx0LnNldChwZnMpOworfQorCit2b2lkIFByb2dyYW1TdG9yZVN0YXRlOjpkZWluaXQoQ29udGV4dCAqcnNjKQoreworICAgIG1EZWZhdWx0LmNsZWFyKCk7CisgICAgbUxhc3QuY2xlYXIoKTsKK30KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKwordm9pZCByc2lfUHJvZ3JhbVN0b3JlQmVnaW4oQ29udGV4dCAqIHJzYywgUnNFbGVtZW50IGluLCBSc0VsZW1lbnQgb3V0KQoreworICAgIGRlbGV0ZSByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUzsKKyAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUyA9IG5ldyBQcm9ncmFtU3RvcmUocnNjKTsKKworfQorCit2b2lkIHJzaV9Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMoQ29udGV4dCAqcnNjLCBSc0RlcHRoRnVuYyBmdW5jKQoreworICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXREZXB0aEZ1bmMoZnVuYyk7Cit9CisKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZURlcHRoTWFzayhDb250ZXh0ICpyc2MsIGJvb2wgbWFzaykKK3sKKyAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0RGVwdGhNYXNrKG1hc2spOworfQorCit2b2lkIHJzaV9Qcm9ncmFtU3RvcmVDb2xvck1hc2soQ29udGV4dCAqcnNjLCBib29sIHIsIGJvb2wgZywgYm9vbCBiLCBib29sIGEpCit7CisgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldENvbG9yTWFzayhyLCBnLCBiLCBhKTsKK30KKwordm9pZCByc2lfUHJvZ3JhbVN0b3JlQmxlbmRGdW5jKENvbnRleHQgKnJzYywgUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpCit7CisgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldEJsZW5kRnVuYyhzcmMsIGRzdCk7Cit9CisKK1JzUHJvZ3JhbVN0b3JlIHJzaV9Qcm9ncmFtU3RvcmVDcmVhdGUoQ29udGV4dCAqcnNjKQoreworICAgIFByb2dyYW1TdG9yZSAqcGZzID0gcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlM7CisgICAgcGZzLT5pbmNVc2VyUmVmKCk7CisgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMgPSAwOworICAgIHJldHVybiBwZnM7Cit9CisKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZURpdGhlcihDb250ZXh0ICpyc2MsIGJvb2wgZW5hYmxlKQoreworICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXREaXRoZXJFbmFibGUoZW5hYmxlKTsKK30KKworCit9Cit9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbVN0b3JlLmggYi9saWJzL3JzL3JzUHJvZ3JhbVN0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4ZDc4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX1BST0dSQU1fRlJBR01FTlRfU1RPUkVfSAorI2RlZmluZSBBTkRST0lEX1JTX1BST0dSQU1fRlJBR01FTlRfU1RPUkVfSAorCisjaW5jbHVkZSAicnNQcm9ncmFtLmgiCisjaW5jbHVkZSAicnNTdHJlYW0uaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgUHJvZ3JhbVN0b3JlU3RhdGU7CisKK2NsYXNzIFByb2dyYW1TdG9yZSA6IHB1YmxpYyBQcm9ncmFtCit7CitwdWJsaWM6CisgICAgUHJvZ3JhbVN0b3JlKENvbnRleHQgKik7CisgICAgdmlydHVhbCB+UHJvZ3JhbVN0b3JlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICosIFByb2dyYW1TdG9yZVN0YXRlICopOworICAgIHZpcnR1YWwgdm9pZCBzZXR1cEdMMihjb25zdCBDb250ZXh0ICosIFByb2dyYW1TdG9yZVN0YXRlICopOworCisgICAgdm9pZCBzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMpOworICAgIHZvaWQgc2V0RGVwdGhNYXNrKGJvb2wpOworCisgICAgdm9pZCBzZXRCbGVuZEZ1bmMoUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpOworICAgIHZvaWQgc2V0Q29sb3JNYXNrKGJvb2wsIGJvb2wsIGJvb2wsIGJvb2wpOworCisgICAgdm9pZCBzZXREaXRoZXJFbmFibGUoYm9vbCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1NUT1JFOyB9CisgICAgc3RhdGljIFByb2dyYW1TdG9yZSAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CisKK3Byb3RlY3RlZDoKKyAgICBib29sIG1EaXRoZXJFbmFibGU7CisKKyAgICBib29sIG1CbGVuZEVuYWJsZTsKKyAgICBib29sIG1Db2xvclJXcml0ZUVuYWJsZTsKKyAgICBib29sIG1Db2xvckdXcml0ZUVuYWJsZTsKKyAgICBib29sIG1Db2xvckJXcml0ZUVuYWJsZTsKKyAgICBib29sIG1Db2xvckFXcml0ZUVuYWJsZTsKKyAgICBpbnQzMl90IG1CbGVuZFNyYzsKKyAgICBpbnQzMl90IG1CbGVuZERzdDsKKworICAgIGJvb2wgbURlcHRoVGVzdEVuYWJsZTsKKyAgICBib29sIG1EZXB0aFdyaXRlRW5hYmxlOworICAgIGludDMyX3QgbURlcHRoRnVuYzsKKworICAgIGJvb2wgbVN0ZW5jaWxUZXN0RW5hYmxlOworfTsKKworY2xhc3MgUHJvZ3JhbVN0b3JlU3RhdGUKK3sKK3B1YmxpYzoKKyAgICBQcm9ncmFtU3RvcmVTdGF0ZSgpOworICAgIH5Qcm9ncmFtU3RvcmVTdGF0ZSgpOworICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MpOworICAgIHZvaWQgZGVpbml0KENvbnRleHQgKnJzYyk7CisKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbURlZmF1bHQ7CisgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IG1MYXN0OworCisKKyAgICBQcm9ncmFtU3RvcmUgKm1QRlM7Cit9OworCisKK30KK30KKyNlbmRpZgorCisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguY3BwIGIvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguY3BwCmluZGV4IGEyYjJkZjQuLmUxNjI4ZjQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5jcHAKQEAgLTE0LDEzICsxNCwxOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HTC9nbGV4dC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTgxLDkgKzg3LDEyIEBACiAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CiAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKICAgICBpZiAobUxpZ2h0Q291bnQpIHsKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVCAvLyBHTEVTIE9ubHkKICAgICAgICAgaW50IHYgPSAwOwogICAgICAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7CisKICAgICAgICAgZ2xMaWdodE1vZGVseHYoR0xfTElHSFRfTU9ERUxfVFdPX1NJREUsICZ2KTsKKwogICAgICAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtTGlnaHRDb3VudDsgY3QrKykgewogICAgICAgICAgICAgY29uc3QgTGlnaHQgKmwgPSBtTGlnaHRzW2N0XS5nZXQoKTsKICAgICAgICAgICAgIGdsRW5hYmxlKEdMX0xJR0hUMCArIGN0KTsKQEAgLTkyLDYgKzEwMSw3IEBACiAgICAgICAgIGZvciAodWludDMyX3QgY3QgPSBtTGlnaHRDb3VudDsgY3QgPCBNQVhfTElHSFRTOyBjdCsrKSB7CiAgICAgICAgICAgICBnbERpc2FibGUoR0xfTElHSFQwICsgY3QpOwogICAgICAgICB9CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAgICAgfSBlbHNlIHsKICAgICAgICAgZ2xEaXNhYmxlKEdMX0xJR0hUSU5HKTsKICAgICB9CkBAIC0xMjQsMzIgKzEzNCwxNyBAQAogICAgICAgICBtU2hhZGVyLmFwcGVuZChtVW5pZm9ybU5hbWVzWzBdKTsKICAgICAgICAgbVNoYWRlci5hcHBlbmQoIjtcbiIpOwogCi0gICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ29uc3RhbnRDb3VudDsgY3QrKykgewotICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZSA9IG1Db25zdGFudFR5cGVzW2N0XS0+Z2V0RWxlbWVudCgpOwotICAgICAgICAgICAgZm9yICh1aW50MzJfdCBmaWVsZD0wOyBmaWVsZCA8IGUtPmdldEZpZWxkQ291bnQoKTsgZmllbGQrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IEVsZW1lbnQgKmYgPSBlLT5nZXRGaWVsZChmaWVsZCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBDYW5ub3QgYmUgY29tcGxleAotICAgICAgICAgICAgICAgIHJzQXNzZXJ0KCFmLT5nZXRGaWVsZENvdW50KCkpOwotICAgICAgICAgICAgICAgIHN3aXRjaChmLT5nZXRDb21wb25lbnQoKS5nZXRWZWN0b3JTaXplKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIGZsb2F0IFVOSV8iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSB2ZWMyIFVOSV8iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSB2ZWMzIFVOSV8iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OiBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSB2ZWM0IFVOSV8iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcnNBc3NlcnQoMCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoZS0+Z2V0RmllbGROYW1lKGZpZWxkKSk7Ci0gICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIjtcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KKyAgICAgICAgYXBwZW5kVXNlckNvbnN0YW50cygpOwogCiAgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtSW5wdXRDb3VudDsgY3QrKykgewogICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZSA9IG1JbnB1dEVsZW1lbnRzW2N0XS5nZXQoKTsKICAgICAgICAgICAgIGZvciAodWludDMyX3QgZmllbGQ9MDsgZmllbGQgPCBlLT5nZXRGaWVsZENvdW50KCk7IGZpZWxkKyspIHsKICAgICAgICAgICAgICAgICBjb25zdCBFbGVtZW50ICpmID0gZS0+Z2V0RmllbGQoZmllbGQpOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZuID0gZS0+Z2V0RmllbGROYW1lKGZpZWxkKTsKKworICAgICAgICAgICAgICAgIGlmIChmblswXSA9PSAnIycpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gQ2Fubm90IGJlIGNvbXBsZXgKICAgICAgICAgICAgICAgICByc0Fzc2VydCghZi0+Z2V0RmllbGRDb3VudCgpKTsKQEAgLTE2MiwxNyArMTU3LDE2IEBACiAgICAgICAgICAgICAgICAgICAgIHJzQXNzZXJ0KDApOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKGUtPmdldEZpZWxkTmFtZShmaWVsZCkpOworICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKGZuKTsKICAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiO1xuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbVNoYWRlci5hcHBlbmQobVVzZXJTaGFkZXIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgdmVjNCBBVFRSSUJfTGVnYWN5UG9zaXRpb247XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl9MZWdhY3lDb2xvcjtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzMgQVRUUklCX0xlZ2FjeU5vcm1hbDtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIGZsb2F0IEFUVFJJQl9MZWdhY3lQb2ludFNpemU7XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl9MZWdhY3lUZXh0dXJlO1xuIik7CisgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgdmVjNCBBVFRSSUJfcG9zaXRpb247XG4iKTsKKyAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl9jb2xvcjtcbiIpOworICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzMgQVRUUklCX25vcm1hbDtcbiIpOworICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzQgQVRUUklCX3RleHR1cmUwO1xuIik7CiAKICAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1Vbmlmb3JtQ291bnQ7IGN0KyspIHsKICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIG1hdDQgIik7CkBAIC0xODEsMTggKzE3NSwxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgbVNoYWRlci5hcHBlbmQoInZvaWQgbWFpbigpIHtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBnbF9Qb3NpdGlvbiA9IFVOSV9NVlAgKiBBVFRSSUJfTGVnYWN5UG9zaXRpb247XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9pbnRTaXplID0gQVRUUklCX0xlZ2FjeVBvaW50U2l6ZTtcbiIpOworICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBnbF9Qb3NpdGlvbiA9IFVOSV9NVlAgKiBBVFRSSUJfcG9zaXRpb247XG4iKTsKKyAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9pbnRTaXplID0gMS4wO1xuIik7CiAKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmFyQ29sb3IgPSBBVFRSSUJfTGVnYWN5Q29sb3I7XG4iKTsKKyAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmFyQ29sb3IgPSBBVFRSSUJfY29sb3I7XG4iKTsKICAgICAgICAgaWYgKG1UZXh0dXJlTWF0cml4RW5hYmxlKSB7Ci0gICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICB2YXJUZXgwID0gVU5JX1RleE1hdHJpeCAqIEFUVFJJQl9MZWdhY3lUZXh0dXJlO1xuIik7CisgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICB2YXJUZXgwID0gVU5JX1RleE1hdHJpeCAqIEFUVFJJQl90ZXh0dXJlMDtcbiIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmFyVGV4MCA9IEFUVFJJQl9MZWdhY3lUZXh0dXJlO1xuIik7CisgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICB2YXJUZXgwID0gQVRUUklCX3RleHR1cmUwO1xuIik7CiAgICAgICAgIH0KLSAgICAgICAgLy9tU2hhZGVyLmFwcGVuZCgiICBwb3MueCA9IHBvcy54IC8gNDgwLjA7XG4iKTsKLSAgICAgICAgLy9tU2hhZGVyLmFwcGVuZCgiICBwb3MueSA9IHBvcy55IC8gODAwLjA7XG4iKTsKLSAgICAgICAgLy9tU2hhZGVyLmFwcGVuZCgiICBnbF9Qb3NpdGlvbiA9IHBvcztcbiIpOwogICAgICAgICBtU2hhZGVyLmFwcGVuZCgifVxuIik7CiAgICAgfQogfQpAQCAtMjAxLDExICsxOTIsMTAgQEAKIHsKICAgICAvL0xPR0UoInNnbDIgdnR4MSAleCIsIGdsR2V0RXJyb3IoKSk7CiAgICAgaWYgKChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgJiYgIW1EaXJ0eSkgewotICAgICAgICAvL3JldHVybjsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbVZlcnRleDo6c2V0dXBHTDIgc3RhcnQiKTsKLSAgICBnbFZlcnRleEF0dHJpYjRmKDEsIHN0YXRlLT5jb2xvclswXSwgc3RhdGUtPmNvbG9yWzFdLCBzdGF0ZS0+Y29sb3JbMl0sIHN0YXRlLT5jb2xvclszXSk7CiAKICAgICBjb25zdCBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKIApAQCAtMjIyLDUzICsyMTIsNyBAQAogICAgIH0KIAogICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbVZlcnRleDo6c2V0dXBHTDIgYmVnaW4gdW5pZm9ybXMiKTsKLSAgICB1aW50MzJfdCB1aWR4ID0gMTsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvbnN0YW50Q291bnQ7IGN0KyspIHsKLSAgICAgICAgQWxsb2NhdGlvbiAqYWxsb2MgPSBtQ29uc3RhbnRzW2N0KzFdLmdldCgpOwotICAgICAgICBpZiAoIWFsbG9jKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90ICo+KGFsbG9jLT5nZXRQdHIoKSk7Ci0gICAgICAgIGNvbnN0IEVsZW1lbnQgKmUgPSBtQ29uc3RhbnRUeXBlc1tjdF0tPmdldEVsZW1lbnQoKTsKLSAgICAgICAgZm9yICh1aW50MzJfdCBmaWVsZD0wOyBmaWVsZCA8IGUtPmdldEZpZWxkQ291bnQoKTsgZmllbGQrKykgewotICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZiA9IGUtPmdldEZpZWxkKGZpZWxkKTsKLSAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCA9IGUtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoZmllbGQpOwotICAgICAgICAgICAgaW50MzJfdCBzbG90ID0gc2MtPnZ0eFVuaWZvcm1TbG90KHVpZHgpOwotCi0gICAgICAgICAgICBjb25zdCBmbG9hdCAqZmQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICo+KCZkYXRhW29mZnNldF0pOwotCi0gICAgICAgICAgICAvL0xPR0UoIlVuaWZvcm0gIHNsb3Q9JWksIG9mZnNldD0laSwgY29uc3RhbnQ9JWksIGZpZWxkPSVpLCB1aWR4PSVpIiwgc2xvdCwgb2Zmc2V0LCBjdCwgZmllbGQsIHVpZHgpOwotICAgICAgICAgICAgaWYgKHNsb3QgPj0gMCkgewotICAgICAgICAgICAgICAgIHN3aXRjaChmLT5nZXRDb21wb25lbnQoKS5nZXRWZWN0b3JTaXplKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIC8vTE9HRSgiVW5pZm9ybSAxID0gJWYiLCBmZFswXSk7Ci0gICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybTFmdihzbG90LCAxLCBmZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgLy9MT0dFKCJVbmlmb3JtIDIgPSAlZiAlZiIsIGZkWzBdLCBmZFsxXSk7Ci0gICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybTJmdihzbG90LCAxLCBmZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgLy9MT0dFKCJVbmlmb3JtIDMgPSAlZiAlZiAlZiIsIGZkWzBdLCBmZFsxXSwgZmRbMl0pOwotICAgICAgICAgICAgICAgICAgICBnbFVuaWZvcm0zZnYoc2xvdCwgMSwgZmQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vTE9HRSgiVW5pZm9ybSA0ID0gJWYgJWYgJWYgJWYiLCBmZFswXSwgZmRbMV0sIGZkWzJdLCBmZFszXSk7Ci0gICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybTRmdihzbG90LCAxLCBmZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJzQXNzZXJ0KDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpZHggKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvbnN0YW50Q291bnQ7IGN0KyspIHsKLSAgICAgICAgdWludDMyX3QgZ2xTbG90ID0gc2MtPnZ0eFVuaWZvcm1TbG90KGN0ICsgMSk7Ci0KLSAgICB9CisgICAgc2V0dXBVc2VyQ29uc3RhbnRzKHNjLCBmYWxzZSk7CiAKICAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOwogICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbVZlcnRleDo6c2V0dXBHTDIiKTsKQEAgLTMwMyw2ICsyNDcsMTIgQEAKICAgICBtRGlydHkgPSB0cnVlOwogfQogCit2b2lkIFByb2dyYW1WZXJ0ZXg6OmdldFByb2plY3Rpb25NYXRyaXgocnNjX01hdHJpeCAqbSkgY29uc3QKK3sKKyAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKKyAgICBtZW1jcHkobSwgJmZbUlNfUFJPR1JBTV9WRVJURVhfUFJPSkVDVElPTl9PRkZTRVRdLCBzaXplb2YocnNjX01hdHJpeCkpOworfQorCiB2b2lkIFByb2dyYW1WZXJ0ZXg6OnRyYW5zZm9ybVRvU2NyZWVuKGNvbnN0IENvbnRleHQgKnJzYywgZmxvYXQgKnY0b3V0LCBjb25zdCBmbG9hdCAqdjNpbikgY29uc3QKIHsKICAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKQEAgLTMxMiwyMyArMjYyLDYgQEAKICAgICBtdnAudmVjdG9yTXVsdGlwbHkodjRvdXQsIHYzaW4pOwogfQogCi12b2lkIFByb2dyYW1WZXJ0ZXg6OmluaXRBZGRVc2VyRWxlbWVudChjb25zdCBFbGVtZW50ICplLCBTdHJpbmc4ICpuYW1lcywgdWludDMyX3QgKmNvdW50LCBjb25zdCBjaGFyICpwcmVmaXgpCi17Ci0gICAgcnNBc3NlcnQoZS0+Z2V0RmllbGRDb3VudCgpKTsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgZS0+Z2V0RmllbGRDb3VudCgpOyBjdCsrKSB7Ci0gICAgICAgIGNvbnN0IEVsZW1lbnQgKmNlID0gZS0+Z2V0RmllbGQoY3QpOwotICAgICAgICBpZiAoY2UtPmdldEZpZWxkQ291bnQoKSkgewotICAgICAgICAgICAgaW5pdEFkZFVzZXJFbGVtZW50KGNlLCBuYW1lcywgY291bnQsIHByZWZpeCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmc4IHRtcChwcmVmaXgpOwotICAgICAgICAgICAgdG1wLmFwcGVuZChlLT5nZXRGaWVsZE5hbWUoY3QpKTsKLSAgICAgICAgICAgIG5hbWVzWypjb3VudF0uc2V0VG8odG1wLnN0cmluZygpKTsKLSAgICAgICAgICAgICgqY291bnQpKys7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQogdm9pZCBQcm9ncmFtVmVydGV4Ojppbml0KENvbnRleHQgKnJzYykKIHsKICAgICBtQXR0cmliQ291bnQgPSAwOwpAQCAtMzUxLDYgKzI4NCwxNiBAQAogICAgIGNyZWF0ZVNoYWRlcigpOwogfQogCit2b2lkIFByb2dyYW1WZXJ0ZXg6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisKK30KKworUHJvZ3JhbVZlcnRleCAqUHJvZ3JhbVZlcnRleDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCkBAIC0zNjIsOCArMzA1LDkgQEAKIHsKIH0KIAotdm9pZCBQcm9ncmFtVmVydGV4U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCkKK3ZvaWQgUHJvZ3JhbVZlcnRleFN0YXRlOjppbml0KENvbnRleHQgKnJzYykKIHsKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogICAgIFJzRWxlbWVudCBlID0gKFJzRWxlbWVudCkgRWxlbWVudDo6Y3JlYXRlKHJzYywgUlNfVFlQRV9GTE9BVF8zMiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgMSk7CiAKICAgICByc2lfVHlwZUJlZ2luKHJzYywgZSk7CkBAIC0zNzIsMjcgKzMxNiwyNSBAQAogCiAgICAgUHJvZ3JhbVZlcnRleCAqcHYgPSBuZXcgUHJvZ3JhbVZlcnRleChyc2MsIGZhbHNlKTsKICAgICBBbGxvY2F0aW9uICphbGxvYyA9IChBbGxvY2F0aW9uICopcnNpX0FsbG9jYXRpb25DcmVhdGVUeXBlZChyc2MsIG1BbGxvY1R5cGUuZ2V0KCkpOworCiAgICAgbURlZmF1bHRBbGxvYy5zZXQoYWxsb2MpOwogICAgIG1EZWZhdWx0LnNldChwdik7CiAgICAgcHYtPmluaXQocnNjKTsKICAgICBwdi0+YmluZEFsbG9jYXRpb24oYWxsb2MsIDApOwogCi0gICAgY29sb3JbMF0gPSAxLmY7Ci0gICAgY29sb3JbMV0gPSAxLmY7Ci0gICAgY29sb3JbMl0gPSAxLmY7Ci0gICAgY29sb3JbM10gPSAxLmY7CisgICAgdXBkYXRlU2l6ZShyc2MpOworI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogCi0gICAgdXBkYXRlU2l6ZShyc2MsIHcsIGgpOwogfQogCi12b2lkIFByb2dyYW1WZXJ0ZXhTdGF0ZTo6dXBkYXRlU2l6ZShDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKQordm9pZCBQcm9ncmFtVmVydGV4U3RhdGU6OnVwZGF0ZVNpemUoQ29udGV4dCAqcnNjKQogewogICAgIE1hdHJpeCBtOwotICAgIG0ubG9hZE9ydGhvKDAsdywgaCwwLCAtMSwxKTsKLSAgICBtRGVmYXVsdEFsbG9jLT5zdWJEYXRhKFJTX1BST0dSQU1fVkVSVEVYX1BST0pFQ1RJT05fT0ZGU0VULCAxNiwgJm0ubVswXSwgMTYqNCk7CisgICAgbS5sb2FkT3J0aG8oMCxyc2MtPmdldFdpZHRoKCksIHJzYy0+Z2V0SGVpZ2h0KCksMCwgLTEsMSk7CisgICAgbURlZmF1bHRBbGxvYy0+c3ViRGF0YShyc2MsIFJTX1BST0dSQU1fVkVSVEVYX1BST0pFQ1RJT05fT0ZGU0VULCAxNiwgJm0ubVswXSwgMTYqNCk7CiAKICAgICBtLmxvYWRJZGVudGl0eSgpOwotICAgIG1EZWZhdWx0QWxsb2MtPnN1YkRhdGEoUlNfUFJPR1JBTV9WRVJURVhfTU9ERUxWSUVXX09GRlNFVCwgMTYsICZtLm1bMF0sIDE2KjQpOworICAgIG1EZWZhdWx0QWxsb2MtPnN1YkRhdGEocnNjLCBSU19QUk9HUkFNX1ZFUlRFWF9NT0RFTFZJRVdfT0ZGU0VULCAxNiwgJm0ubVswXSwgMTYqNCk7CiB9CiAKIHZvaWQgUHJvZ3JhbVZlcnRleFN0YXRlOjpkZWluaXQoQ29udGV4dCAqcnNjKQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguaCBiL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmgKaW5kZXggMjg1NTRjYy4uNTlmZDMxOTUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmgKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguaApAQCAtNDMsNiArNDMsNyBAQAogICAgIHZvaWQgYWRkTGlnaHQoY29uc3QgTGlnaHQgKik7CiAKICAgICB2b2lkIHNldFByb2plY3Rpb25NYXRyaXgoY29uc3QgcnNjX01hdHJpeCAqKSBjb25zdDsKKyAgICB2b2lkIGdldFByb2plY3Rpb25NYXRyaXgocnNjX01hdHJpeCAqKSBjb25zdDsKICAgICB2b2lkIHNldE1vZGVsdmlld01hdHJpeChjb25zdCByc2NfTWF0cml4ICopIGNvbnN0OwogICAgIHZvaWQgc2V0VGV4dHVyZU1hdHJpeChjb25zdCByc2NfTWF0cml4ICopIGNvbnN0OwogCkBAIC01Miw2ICs1Myw5IEBACiAgICAgdmlydHVhbCB2b2lkIGxvYWRTaGFkZXIoQ29udGV4dCAqKTsKICAgICB2aXJ0dWFsIHZvaWQgaW5pdChDb250ZXh0ICopOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9WRVJURVg7IH0KKyAgICBzdGF0aWMgUHJvZ3JhbVZlcnRleCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKIHByb3RlY3RlZDoKICAgICB1aW50MzJfdCBtTGlnaHRDb3VudDsKQEAgLTU5LDkgKzYzLDYgQEAKIAogICAgIC8vIEhhY2tzIHRvIGNyZWF0ZSBhIHByb2dyYW0gZm9yIG5vdwogICAgIGJvb2wgbVRleHR1cmVNYXRyaXhFbmFibGU7Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBpbml0QWRkVXNlckVsZW1lbnQoY29uc3QgRWxlbWVudCAqZSwgU3RyaW5nOCAqbmFtZXMsIHVpbnQzMl90ICpjb3VudCwgY29uc3QgY2hhciAqcHJlZml4KTsKIH07CiAKIApAQCAtNzEsMTggKzcyLDE1IEBACiAgICAgUHJvZ3JhbVZlcnRleFN0YXRlKCk7CiAgICAgflByb2dyYW1WZXJ0ZXhTdGF0ZSgpOwogCi0gICAgdm9pZCBpbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpOworICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MpOwogICAgIHZvaWQgZGVpbml0KENvbnRleHQgKnJzYyk7Ci0gICAgdm9pZCB1cGRhdGVTaXplKENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpOworICAgIHZvaWQgdXBkYXRlU2l6ZShDb250ZXh0ICpyc2MpOwogCiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtVmVydGV4PiBtRGVmYXVsdDsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1WZXJ0ZXg+IG1MYXN0OwogICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbURlZmF1bHRBbGxvYzsKIAogICAgIE9iamVjdEJhc2VSZWY8VHlwZT4gbUFsbG9jVHlwZTsKLQotCi0gICAgZmxvYXQgY29sb3JbNF07CiB9OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTYW1wbGVyLmNwcCBiL2xpYnMvcnMvcnNTYW1wbGVyLmNwcAppbmRleCA3MWY1MDhmLi5mNDFmMjk1IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2FtcGxlci5jcHAKKysrIGIvbGlicy9ycy9yc1NhbXBsZXIuY3BwCkBAIC0xNCwxMCArMTQsMTYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKwogI2luY2x1ZGUgInJzU2FtcGxlci5oIgogCiAKQEAgLTk0LDYgKzEwMCwxNyBAQAogICAgIG1Cb3VuZFNsb3QgPSAtMTsKICAgICBzcy0+bVNhbXBsZXJzW3Nsb3RdLmNsZWFyKCk7CiB9CisKK3ZvaWQgU2FtcGxlcjo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAKK30KKworU2FtcGxlciAqU2FtcGxlcjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwogLyoKIHZvaWQgU2FtcGxlclN0YXRlOjpzZXR1cEdMKCkKIHsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTYW1wbGVyLmggYi9saWJzL3JzL3JzU2FtcGxlci5oCmluZGV4IDA1MDYwODEuLjM3ODY0MzkgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTYW1wbGVyLmgKKysrIGIvbGlicy9ycy9yc1NhbXBsZXIuaApAQCAtNDYsNiArNDYsMTAgQEAKICAgICB2b2lkIGJpbmRUb0NvbnRleHQoU2FtcGxlclN0YXRlICosIHVpbnQzMl90IHNsb3QpOwogICAgIHZvaWQgdW5iaW5kRnJvbUNvbnRleHQoU2FtcGxlclN0YXRlICopOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfU0FNUExFUjsgfQorICAgIHN0YXRpYyBTYW1wbGVyICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKKwogcHJvdGVjdGVkOgogICAgIFJzU2FtcGxlclZhbHVlIG1NYWdGaWx0ZXI7CiAgICAgUnNTYW1wbGVyVmFsdWUgbU1pbkZpbHRlcjsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHQuY3BwIGIvbGlicy9ycy9yc1NjcmlwdC5jcHAKaW5kZXggYTMzOTMzYi4uZmMyMmZjMyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdC5jcHAKKysrIGIvbGlicy9ycy9yc1NjcmlwdC5jcHAKQEAgLTI0LDE5ICsyNCwyNSBAQAogICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKICAgICBtQWxsb2NMaW5lID0gX19MSU5FX187CiAgICAgbWVtc2V0KCZtRW52aXJvbWVudCwgMCwgc2l6ZW9mKG1FbnZpcm9tZW50KSk7Ci0gICAgbUVudmlyb21lbnQubUNsZWFyQ29sb3JbMF0gPSAwOwotICAgIG1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzFdID0gMDsKLSAgICBtRW52aXJvbWVudC5tQ2xlYXJDb2xvclsyXSA9IDA7Ci0gICAgbUVudmlyb21lbnQubUNsZWFyQ29sb3JbM10gPSAxOwotICAgIG1FbnZpcm9tZW50Lm1DbGVhckRlcHRoID0gMTsKLSAgICBtRW52aXJvbWVudC5tQ2xlYXJTdGVuY2lsID0gMDsKLSAgICBtRW52aXJvbWVudC5tSXNSb290ID0gZmFsc2U7CiB9CiAKIFNjcmlwdDo6flNjcmlwdCgpCiB7CiB9CiAKK3ZvaWQgU2NyaXB0OjpzZXRWYXIodWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqdmFsLCB1aW50MzJfdCBsZW4pCit7CisgICAgaW50MzJfdCAqZGVzdFB0ciA9ICgoaW50MzJfdCAqKiltRW52aXJvbWVudC5tRmllbGRBZGRyZXNzKVtzbG90XTsKKyAgICBpZiAoZGVzdFB0cikgeworICAgICAgICAvL0xPR0UoInNldFZhciBmMSAgJWYiLCAoKGNvbnN0IGZsb2F0ICopZGVzdFB0cilbMF0pOworICAgICAgICAvL0xPR0UoInNldFZhciAlcCAlaSIsIGRlc3RQdHIsIGxlbik7CisgICAgICAgIG1lbWNweShkZXN0UHRyLCB2YWwsIGxlbik7CisgICAgICAgIC8vTE9HRSgic2V0VmFyIGYyICAlZiIsICgoY29uc3QgZmxvYXQgKilkZXN0UHRyKVswXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiQ2FsbGluZyBzZXRWYXIgb24gc2xvdCA9ICVpIHdoaWNoIGlzIG51bGwiLCBzbG90KTsKKyAgICB9Cit9CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCkBAIC00NCwxNiArNTAsOSBAQAogdm9pZCByc2lfU2NyaXB0QmluZEFsbG9jYXRpb24oQ29udGV4dCAqIHJzYywgUnNTY3JpcHQgdnMsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3Qgc2xvdCkKIHsKICAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOwotICAgIHMtPm1TbG90c1tzbG90XS5zZXQoc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSkpOwotfQotCi12b2lkIHJzaV9TY3JpcHRTZXRDbGVhckNvbG9yKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQotewotICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMF0gPSByOwotICAgIHMtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzFdID0gZzsKLSAgICBzLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsyXSA9IGI7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbM10gPSBhOworICAgIEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBzLT5tU2xvdHNbc2xvdF0uc2V0KGEpOworICAgIC8vTE9HRSgicnNpX1NjcmlwdEJpbmRBbGxvY2F0aW9uICVpICAlcCAgJXAiLCBzbG90LCBhLCBhLT5nZXRQdHIoKSk7CiB9CiAKIHZvaWQgcnNpX1NjcmlwdFNldFRpbWVab25lKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCBjb25zdCBjaGFyICogdGltZVpvbmUsIHVpbnQzMl90IGxlbmd0aCkKQEAgLTYyLDUzICs2MSw1MSBAQAogICAgIHMtPm1FbnZpcm9tZW50Lm1UaW1lWm9uZSA9IHRpbWVab25lOwogfQogCi12b2lkIHJzaV9TY3JpcHRTZXRDbGVhckRlcHRoKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCBmbG9hdCB2KQotewotICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyRGVwdGggPSB2OwotfQotCi12b2lkIHJzaV9TY3JpcHRTZXRDbGVhclN0ZW5jaWwoQ29udGV4dCAqIHJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHYpCi17Ci0gICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKLSAgICBzLT5tRW52aXJvbWVudC5tQ2xlYXJTdGVuY2lsID0gdjsKLX0KLQogdm9pZCByc2lfU2NyaXB0U2V0VHlwZShDb250ZXh0ICogcnNjLCBSc1R5cGUgdnQsIHVpbnQzMl90IHNsb3QsIGJvb2wgd3JpdGFibGUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAgICAgU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwogICAgIGNvbnN0IFR5cGUgKnQgPSBzdGF0aWNfY2FzdDxjb25zdCBUeXBlICo+KHZ0KTsKICAgICBzcy0+bUNvbnN0YW50QnVmZmVyVHlwZXNbc2xvdF0uc2V0KHQpOwogICAgIHNzLT5tU2xvdFdyaXRhYmxlW3Nsb3RdID0gd3JpdGFibGU7Ci0gICAgaWYgKG5hbWUpIHsKLSAgICAgICAgc3MtPm1TbG90TmFtZXNbc2xvdF0uc2V0VG8obmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3MtPm1TbG90TmFtZXNbc2xvdF0uc2V0VG8oIiIpOwotICAgIH0KLX0KLQotdm9pZCByc2lfU2NyaXB0U2V0SW52b2tlKENvbnRleHQgKnJzYywgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3Qgc2xvdCkKLXsKLSAgICBTY3JpcHRDU3RhdGUgKnNzID0gJnJzYy0+bVNjcmlwdEM7Ci0gICAgc3MtPm1JbnZva2FibGVOYW1lc1tzbG90XSA9IG5hbWU7CisgICAgTE9HRSgicnNpX1NjcmlwdFNldFR5cGUiKTsKIH0KIAogdm9pZCByc2lfU2NyaXB0SW52b2tlKENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHNsb3QpCiB7CiAgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKLSAgICBpZiAocy0+bUVudmlyb21lbnQubUludm9rYWJsZXNbc2xvdF0gPT0gTlVMTCkgewotICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TQ1JJUFQsICJDYWxsaW5nIGludm9rZSBvbiBiYWQgc2NyaXB0Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcy0+c2V0dXBTY3JpcHQoKTsKLSAgICBzLT5tRW52aXJvbWVudC5tSW52b2thYmxlc1tzbG90XSgpOworICAgIHMtPkludm9rZShyc2MsIHNsb3QsIE5VTEwsIDApOwogfQogCiAKLXZvaWQgcnNpX1NjcmlwdFNldFJvb3QoQ29udGV4dCAqIHJzYywgYm9vbCBpc1Jvb3QpCit2b2lkIHJzaV9TY3JpcHRJbnZva2VEYXRhKENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHNsb3QsIHZvaWQgKmRhdGEpCiB7Ci0gICAgU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwotICAgIHNzLT5tU2NyaXB0LT5tRW52aXJvbWVudC5tSXNSb290ID0gaXNSb290OworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+SW52b2tlKHJzYywgc2xvdCwgTlVMTCwgMCk7Cit9CisKK3ZvaWQgcnNpX1NjcmlwdEludm9rZVYoQ29udGV4dCAqcnNjLCBSc1NjcmlwdCB2cywgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuKQoreworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+SW52b2tlKHJzYywgc2xvdCwgZGF0YSwgbGVuKTsKK30KKwordm9pZCByc2lfU2NyaXB0U2V0VmFySShDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LCBpbnQgdmFsdWUpCit7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBzLT5zZXRWYXIoc2xvdCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKK30KKwordm9pZCByc2lfU2NyaXB0U2V0VmFyRihDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LCBmbG9hdCB2YWx1ZSkKK3sKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPnNldFZhcihzbG90LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworfQorCit2b2lkIHJzaV9TY3JpcHRTZXRWYXJWKENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbikKK3sKKyAgICBjb25zdCBmbG9hdCAqZnAgPSAoY29uc3QgZmxvYXQgKilkYXRhOworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+c2V0VmFyKHNsb3QsIGRhdGEsIGxlbik7CiB9CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdC5oIGIvbGlicy9ycy9yc1NjcmlwdC5oCmluZGV4IDVmNGE1MzYuLjBhMjAzNDQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTY3JpcHQuaAorKysgYi9saWJzL3JzL3JzU2NyaXB0LmgKQEAgLTI3LDkgKzI3LDkgQEAKIGNsYXNzIFByb2dyYW1WZXJ0ZXg7CiBjbGFzcyBQcm9ncmFtRnJhZ21lbnQ7CiBjbGFzcyBQcm9ncmFtUmFzdGVyOwotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmU7CitjbGFzcyBQcm9ncmFtU3RvcmU7CiAKLSNkZWZpbmUgTUFYX1NDUklQVF9CQU5LUyAxNgorI2RlZmluZSBNQVhfU0NSSVBUX0JBTktTIDMyCiAKIGNsYXNzIFNjcmlwdCA6IHB1YmxpYyBPYmplY3RCYXNlCiB7CkBAIC0zOSwzOCArMzksNDMgQEAKICAgICBTY3JpcHQoQ29udGV4dCAqKTsKICAgICB2aXJ0dWFsIH5TY3JpcHQoKTsKIAotCiAgICAgc3RydWN0IEVudmlyb21lbnRfdCB7Ci0gICAgICAgIGJvb2wgbUlzUm9vdDsKLSAgICAgICAgZmxvYXQgbUNsZWFyQ29sb3JbNF07Ci0gICAgICAgIGZsb2F0IG1DbGVhckRlcHRoOwotICAgICAgICB1aW50MzJfdCBtQ2xlYXJTdGVuY2lsOwotCi0gICAgICAgIHVpbnQzMl90IG1TdGFydFRpbWVNaWxsaXM7CisgICAgICAgIGludDY0X3QgbVN0YXJ0VGltZU1pbGxpczsKKyAgICAgICAgaW50NjRfdCBtTGFzdER0VGltZTsKICAgICAgICAgY29uc3QgY2hhciogbVRpbWVab25lOwogCiAgICAgICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVZlcnRleD4gbVZlcnRleDsKICAgICAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnQ+IG1GcmFnbWVudDsKICAgICAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtUmFzdGVyPiBtUmFzdGVyOwotICAgICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudFN0b3JlPiBtRnJhZ21lbnRTdG9yZTsKLSAgICAgICAgSW52b2tlRnVuY190IG1JbnZva2FibGVzW01BWF9TQ1JJUFRfQkFOS1NdOworICAgICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbUZyYWdtZW50U3RvcmU7CisKKyAgICAgICAgdWludDMyX3QgbUludm9rZUZ1bmN0aW9uQ291bnQ7CisgICAgICAgIEludm9rZUZ1bmNfdCAqbUludm9rZUZ1bmN0aW9uczsKKyAgICAgICAgdWludDMyX3QgbUZpZWxkQ291bnQ7CisgICAgICAgIHZvaWQgKiogbUZpZWxkQWRkcmVzczsKKwogICAgICAgICBjaGFyICogbVNjcmlwdFRleHQ7CiAgICAgICAgIHVpbnQzMl90IG1TY3JpcHRUZXh0TGVuZ3RoOworCisgICAgICAgIGJvb2wgbUlzVGhyZWFkYWJsZTsKICAgICB9OwogICAgIEVudmlyb21lbnRfdCBtRW52aXJvbWVudDsKIAotICAgIHVpbnQzMl90IG1Db3Vuc3RhbnRCdWZmZXJDb3VudDsKLQotCiAgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtU2xvdHNbTUFYX1NDUklQVF9CQU5LU107CiAgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBUeXBlPiBtVHlwZXNbTUFYX1NDUklQVF9CQU5LU107Ci0gICAgU3RyaW5nOCBtU2xvdE5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOwogICAgIGJvb2wgbVNsb3RXcml0YWJsZVtNQVhfU0NSSVBUX0JBTktTXTsKIAorICAgIHZvaWQgc2V0VmFyKHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKnZhbCwgdWludDMyX3QgbGVuKTsKIAorICAgIHZpcnR1YWwgdm9pZCBydW5Gb3JFYWNoKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbGxvY2F0aW9uICogYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb24gKiBhb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiB1c3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnNTY3JpcHRDYWxsICpzYyA9IE5VTEwpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCBzZXR1cFNjcmlwdCgpID0gMDsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IHJ1bihDb250ZXh0ICosIHVpbnQzMl90IGxhdW5jaElEKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIEludm9rZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzZXR1cFNjcmlwdChDb250ZXh0ICpyc2MpID0gMDsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IHJ1bihDb250ZXh0ICopID0gMDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdEMuY3BwIGIvbGlicy9ycy9yc1NjcmlwdEMuY3BwCmluZGV4IGY0ZDI0NTEuLmExNDBlMjIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTY3JpcHRDLmNwcAorKysgYi9saWJzL3JzL3JzU2NyaXB0Qy5jcHAKQEAgLTE3LDggKzE3LDcgQEAKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKICNpbmNsdWRlICJyc1NjcmlwdEMuaCIKICNpbmNsdWRlICJyc01hdHJpeC5oIgotCi0jaW5jbHVkZSAiYWNjL2FjYy5oIgorI2luY2x1ZGUgIi4uLy4uLy4uL2V4dGVybmFsL2xsdm0vbGliYmNjL2luY2x1ZGUvYmNjL2JjYy5oIgogI2luY2x1ZGUgInV0aWxzL1RpbWVycy5oIgogCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgpAQCAtMzcsNDAgKzM2LDc0IEBACiB7CiAgICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwogICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKLSAgICBtQWNjU2NyaXB0ID0gTlVMTDsKKyAgICBtQmNjU2NyaXB0ID0gTlVMTDsKICAgICBtZW1zZXQoJm1Qcm9ncmFtLCAwLCBzaXplb2YobVByb2dyYW0pKTsKIH0KIAogU2NyaXB0Qzo6flNjcmlwdEMoKQogewotICAgIGlmIChtQWNjU2NyaXB0KSB7Ci0gICAgICAgIGFjY0RlbGV0ZVNjcmlwdChtQWNjU2NyaXB0KTsKKyAgICBpZiAobUJjY1NjcmlwdCkgeworICAgICAgICBiY2NEZWxldGVTY3JpcHQobUJjY1NjcmlwdCk7CiAgICAgfQogICAgIGZyZWUobUVudmlyb21lbnQubVNjcmlwdFRleHQpOwogICAgIG1FbnZpcm9tZW50Lm1TY3JpcHRUZXh0ID0gTlVMTDsKIH0KIAotdm9pZCBTY3JpcHRDOjpzZXR1cFNjcmlwdCgpCit2b2lkIFNjcmlwdEM6OnNldHVwU2NyaXB0KENvbnRleHQgKnJzYykKIHsKLSAgICBmb3IgKGludCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKLSAgICAgICAgaWYgKG1Qcm9ncmFtLm1TbG90UG9pbnRlcnNbY3RdKSB7Ci0gICAgICAgICAgICAqbVByb2dyYW0ubVNsb3RQb2ludGVyc1tjdF0gPSBtU2xvdHNbY3RdLT5nZXRQdHIoKTsKKyAgICBzZXR1cEdMU3RhdGUocnNjKTsKKyAgICBtRW52aXJvbWVudC5tU3RhcnRUaW1lTWlsbGlzCisgICAgICAgICAgICAgICAgPSBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMoc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpKTsKKworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtRW52aXJvbWVudC5tRmllbGRDb3VudDsgY3QrKykgeworICAgICAgICBpZiAoIW1TbG90c1tjdF0uZ2V0KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgdm9pZCAqcHRyID0gbVNsb3RzW2N0XS0+Z2V0UHRyKCk7CisgICAgICAgIHZvaWQgKipkZXN0ID0gKCh2b2lkICoqKiltRW52aXJvbWVudC5tRmllbGRBZGRyZXNzKVtjdF07CisgICAgICAgIC8vTE9HRSgic2V0dXBTY3JpcHQgJWkgJXAgPSAlcCAgICAlcCAlaSIsIGN0LCBkZXN0LCBwdHIsIG1TbG90c1tjdF0tPmdldFR5cGUoKSwgbVNsb3RzW2N0XS0+Z2V0VHlwZSgpLT5nZXREaW1YKCkpOworCisgICAgICAgIC8vY29uc3QgdWludDMyX3QgKnAzMiA9IChjb25zdCB1aW50MzJfdCAqKXB0cjsKKyAgICAgICAgLy9mb3IgKHVpbnQzMl90IGN0Mj0wOyBjdDIgPCBtU2xvdHNbY3RdLT5nZXRUeXBlKCktPmdldERpbVgoKTsgY3QyKyspIHsKKyAgICAgICAgICAgIC8vTE9HRSgiICAlaSA9IDB4JTA4eCAiLCBjdDIsIHAzMltjdDJdKTsKKyAgICAgICAgLy99CisKKyAgICAgICAgaWYgKGRlc3QpIHsKKyAgICAgICAgICAgICpkZXN0ID0gcHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiU2NyaXB0Qzo6c2V0dXBTY3JpcHQsIE5VTEwgdmFyIGJpbmRpbmcgYWRkcmVzcy4iKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotCi11aW50MzJfdCBTY3JpcHRDOjpydW4oQ29udGV4dCAqcnNjLCB1aW50MzJfdCBsYXVuY2hJbmRleCkKK2NvbnN0IEFsbG9jYXRpb24gKlNjcmlwdEM6OnB0clRvQWxsb2NhdGlvbihjb25zdCB2b2lkICpwdHIpIGNvbnN0CiB7Ci0gICAgaWYgKG1Qcm9ncmFtLm1TY3JpcHQgPT0gTlVMTCkgewotICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TQ1JJUFQsICJBdHRlbXB0ZWQgdG8gcnVuIGJhZCBzY3JpcHQiKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtRW52aXJvbWVudC5tRmllbGRDb3VudDsgY3QrKykgeworICAgICAgICBpZiAoIW1TbG90c1tjdF0uZ2V0KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKG1TbG90c1tjdF0tPmdldFB0cigpID09IHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG1TbG90c1tjdF0uZ2V0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HRSgiU2NyaXB0Qzo6cHRyVG9BbGxvY2F0aW9uLCBmYWlsZWQgdG8gZmluZCAlcCIsIHB0cik7CisgICAgcmV0dXJuIE5VTEw7Cit9CiAKLSAgICBDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKiB0bHMgPQotICAgIChDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKilwdGhyZWFkX2dldHNwZWNpZmljKENvbnRleHQ6OmdUaHJlYWRUTFNLZXkpOworU2NyaXB0ICogU2NyaXB0Qzo6c2V0VExTKFNjcmlwdCAqc2MpCit7CisgICAgQ29udGV4dDo6U2NyaXB0VExTU3RydWN0ICogdGxzID0gKENvbnRleHQ6OlNjcmlwdFRMU1N0cnVjdCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfZ2V0c3BlY2lmaWMoQ29udGV4dDo6Z1RocmVhZFRMU0tleSk7CiAgICAgcnNBc3NlcnQodGxzKTsKKyAgICBTY3JpcHQgKm9sZCA9IHRscy0+bVNjcmlwdDsKKyAgICB0bHMtPm1TY3JpcHQgPSBzYzsKKyAgICByZXR1cm4gb2xkOworfQogCisKK3ZvaWQgU2NyaXB0Qzo6c2V0dXBHTFN0YXRlKENvbnRleHQgKnJzYykKK3sKICAgICBpZiAobUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuZ2V0KCkpIHsKICAgICAgICAgcnNjLT5zZXRGcmFnbWVudFN0b3JlKG1FbnZpcm9tZW50Lm1GcmFnbWVudFN0b3JlLmdldCgpKTsKICAgICB9CkBAIC04MywyMCArMTE2LDIxNCBAQAogICAgIGlmIChtRW52aXJvbWVudC5tUmFzdGVyLmdldCgpKSB7CiAgICAgICAgIHJzYy0+c2V0UmFzdGVyKG1FbnZpcm9tZW50Lm1SYXN0ZXIuZ2V0KCkpOwogICAgIH0KK30KIAotICAgIGlmIChsYXVuY2hJbmRleCA9PSAwKSB7Ci0gICAgICAgIG1FbnZpcm9tZW50Lm1TdGFydFRpbWVNaWxsaXMKLSAgICAgICAgICAgICAgICA9IG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyhzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykpOwordWludDMyX3QgU2NyaXB0Qzo6cnVuKENvbnRleHQgKnJzYykKK3sKKyAgICBpZiAobVByb2dyYW0ubVJvb3QgPT0gTlVMTCkgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TQ1JJUFQsICJBdHRlbXB0ZWQgdG8gcnVuIGJhZCBzY3JpcHQiKTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHNldHVwU2NyaXB0KCk7CisKKyAgICBzZXR1cFNjcmlwdChyc2MpOwogCiAgICAgdWludDMyX3QgcmV0ID0gMDsKLSAgICB0bHMtPm1TY3JpcHQgPSB0aGlzOwotICAgIHJldCA9IG1Qcm9ncmFtLm1TY3JpcHQobGF1bmNoSW5kZXgpOwotICAgIHRscy0+bVNjcmlwdCA9IE5VTEw7CisgICAgU2NyaXB0ICogb2xkVExTID0gc2V0VExTKHRoaXMpOworICAgIC8vTE9HRSgiU2NyaXB0Qzo6cnVuICVwIiwgbVByb2dyYW0ubVJvb3QpOworICAgIHJldCA9IG1Qcm9ncmFtLm1Sb290KCk7CisgICAgc2V0VExTKG9sZFRMUyk7CisgICAgLy9MT0dFKCJTY3JpcHRDOjpydW4gcmV0ICVpIiwgcmV0KTsKICAgICByZXR1cm4gcmV0OwogfQogCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDb250ZXh0ICpyc2M7CisgICAgU2NyaXB0QyAqc2NyaXB0OworICAgIGNvbnN0IEFsbG9jYXRpb24gKiBhaW47CisgICAgQWxsb2NhdGlvbiAqIGFvdXQ7CisgICAgY29uc3Qgdm9pZCAqIHVzcjsKKworICAgIHVpbnQzMl90IG1TbGljZVNpemU7CisgICAgdm9sYXRpbGUgaW50IG1TbGljZU51bTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnB0ckluOworICAgIHVpbnQzMl90IGVTdHJpZGVJbjsKKyAgICB1aW50OF90ICpwdHJPdXQ7CisgICAgdWludDMyX3QgZVN0cmlkZU91dDsKKworICAgIHVpbnQzMl90IHhTdGFydDsKKyAgICB1aW50MzJfdCB4RW5kOworICAgIHVpbnQzMl90IHlTdGFydDsKKyAgICB1aW50MzJfdCB5RW5kOworICAgIHVpbnQzMl90IHpTdGFydDsKKyAgICB1aW50MzJfdCB6RW5kOworICAgIHVpbnQzMl90IGFycmF5U3RhcnQ7CisgICAgdWludDMyX3QgYXJyYXlFbmQ7CisKKyAgICB1aW50MzJfdCBkaW1YOworICAgIHVpbnQzMl90IGRpbVk7CisgICAgdWludDMyX3QgZGltWjsKKyAgICB1aW50MzJfdCBkaW1BcnJheTsKK30gTVRMYXVuY2hTdHJ1Y3Q7Cit0eXBlZGVmIGludCAoKnJzX3QpKGNvbnN0IHZvaWQgKiwgdm9pZCAqLCBjb25zdCB2b2lkICosIHVpbnQzMl90LCB1aW50MzJfdCwgdWludDMyX3QsIHVpbnQzMl90KTsKKworc3RhdGljIHZvaWQgd2NfeHkodm9pZCAqdXNyLCB1aW50MzJfdCBpZHgpCit7CisgICAgTVRMYXVuY2hTdHJ1Y3QgKm10bHMgPSAoTVRMYXVuY2hTdHJ1Y3QgKil1c3I7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICB1aW50MzJfdCBzbGljZSA9ICh1aW50MzJfdClhbmRyb2lkX2F0b21pY19pbmMoJm10bHMtPm1TbGljZU51bSk7CisgICAgICAgIHVpbnQzMl90IHlTdGFydCA9IG10bHMtPnlTdGFydCArIHNsaWNlICogbXRscy0+bVNsaWNlU2l6ZTsKKyAgICAgICAgdWludDMyX3QgeUVuZCA9IHlTdGFydCArIG10bHMtPm1TbGljZVNpemU7CisgICAgICAgIHlFbmQgPSByc01pbih5RW5kLCBtdGxzLT55RW5kKTsKKyAgICAgICAgaWYgKHlFbmQgPD0geVN0YXJ0KSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvL0xPR0UoInVzciBpZHggJWksIHggJWksJWkgIHkgJWksJWkiLCBpZHgsIG10bHMtPnhTdGFydCwgbXRscy0+eEVuZCwgeVN0YXJ0LCB5RW5kKTsKKworICAgICAgICBmb3IgKHVpbnQzMl90IHkgPSB5U3RhcnQ7IHkgPCB5RW5kOyB5KyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCA9IG10bHMtPmRpbVggKiB5OworICAgICAgICAgICAgdWludDhfdCAqeFB0ck91dCA9IG10bHMtPnB0ck91dCArIChtdGxzLT5lU3RyaWRlT3V0ICogb2Zmc2V0KTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnhQdHJJbiA9IG10bHMtPnB0ckluICsgKG10bHMtPmVTdHJpZGVJbiAqIG9mZnNldCk7CisKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgeCA9IG10bHMtPnhTdGFydDsgeCA8IG10bHMtPnhFbmQ7IHgrKykgeworICAgICAgICAgICAgICAgICgocnNfdCltdGxzLT5zY3JpcHQtPm1Qcm9ncmFtLm1Sb290KSAoeFB0ckluLCB4UHRyT3V0LCBtdGxzLT51c3IsIHgsIHksIDAsIDApOworICAgICAgICAgICAgICAgIHhQdHJJbiArPSBtdGxzLT5lU3RyaWRlSW47CisgICAgICAgICAgICAgICAgeFB0ck91dCArPSBtdGxzLT5lU3RyaWRlT3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisKK3ZvaWQgU2NyaXB0Qzo6cnVuRm9yRWFjaChDb250ZXh0ICpyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxsb2NhdGlvbiAqIGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uICogYW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogdXNyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJzU2NyaXB0Q2FsbCAqc2MpCit7CisgICAgTVRMYXVuY2hTdHJ1Y3QgbXRsczsKKyAgICBtZW1zZXQoJm10bHMsIDAsIHNpemVvZihtdGxzKSk7CisKKyAgICBpZiAoYWluKSB7CisgICAgICAgIG10bHMuZGltWCA9IGFpbi0+Z2V0VHlwZSgpLT5nZXREaW1YKCk7CisgICAgICAgIG10bHMuZGltWSA9IGFpbi0+Z2V0VHlwZSgpLT5nZXREaW1ZKCk7CisgICAgICAgIG10bHMuZGltWiA9IGFpbi0+Z2V0VHlwZSgpLT5nZXREaW1aKCk7CisgICAgICAgIC8vbXRscy5kaW1BcnJheSA9IGFpbi0+Z2V0VHlwZSgpLT5nZXREaW1BcnJheSgpOworICAgIH0gZWxzZSBpZiAoYW91dCkgeworICAgICAgICBtdGxzLmRpbVggPSBhb3V0LT5nZXRUeXBlKCktPmdldERpbVgoKTsKKyAgICAgICAgbXRscy5kaW1ZID0gYW91dC0+Z2V0VHlwZSgpLT5nZXREaW1ZKCk7CisgICAgICAgIG10bHMuZGltWiA9IGFvdXQtPmdldFR5cGUoKS0+Z2V0RGltWigpOworICAgICAgICAvL210bHMuZGltQXJyYXkgPSBhb3V0LT5nZXRUeXBlKCktPmdldERpbUFycmF5KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAicnNGb3JFYWNoIGNhbGxlZCB3aXRoIG51bGwgYWxsb2NhdGlvbnMiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghc2MgfHwgKHNjLT54RW5kID09IDApKSB7CisgICAgICAgIG10bHMueEVuZCA9IG10bHMuZGltWDsKKyAgICB9IGVsc2UgeworICAgICAgICByc0Fzc2VydChzYy0+eFN0YXJ0IDwgbXRscy5kaW1YKTsKKyAgICAgICAgcnNBc3NlcnQoc2MtPnhFbmQgPD0gbXRscy5kaW1YKTsKKyAgICAgICAgcnNBc3NlcnQoc2MtPnhTdGFydCA8IHNjLT54RW5kKTsKKyAgICAgICAgbXRscy54U3RhcnQgPSByc01pbihtdGxzLmRpbVgsIHNjLT54U3RhcnQpOworICAgICAgICBtdGxzLnhFbmQgPSByc01pbihtdGxzLmRpbVgsIHNjLT54RW5kKTsKKyAgICAgICAgaWYgKG10bHMueFN0YXJ0ID49IG10bHMueEVuZCkgcmV0dXJuOworICAgIH0KKworICAgIGlmICghc2MgfHwgKHNjLT55RW5kID09IDApKSB7CisgICAgICAgIG10bHMueUVuZCA9IG10bHMuZGltWTsKKyAgICB9IGVsc2UgeworICAgICAgICByc0Fzc2VydChzYy0+eVN0YXJ0IDwgbXRscy5kaW1ZKTsKKyAgICAgICAgcnNBc3NlcnQoc2MtPnlFbmQgPD0gbXRscy5kaW1ZKTsKKyAgICAgICAgcnNBc3NlcnQoc2MtPnlTdGFydCA8IHNjLT55RW5kKTsKKyAgICAgICAgbXRscy55U3RhcnQgPSByc01pbihtdGxzLmRpbVksIHNjLT55U3RhcnQpOworICAgICAgICBtdGxzLnlFbmQgPSByc01pbihtdGxzLmRpbVksIHNjLT55RW5kKTsKKyAgICAgICAgaWYgKG10bHMueVN0YXJ0ID49IG10bHMueUVuZCkgcmV0dXJuOworICAgIH0KKworICAgIG10bHMueEVuZCA9IHJzTWF4KCh1aW50MzJfdCkxLCBtdGxzLnhFbmQpOworICAgIG10bHMueUVuZCA9IHJzTWF4KCh1aW50MzJfdCkxLCBtdGxzLnlFbmQpOworICAgIG10bHMuekVuZCA9IHJzTWF4KCh1aW50MzJfdCkxLCBtdGxzLnpFbmQpOworICAgIG10bHMuYXJyYXlFbmQgPSByc01heCgodWludDMyX3QpMSwgbXRscy5hcnJheUVuZCk7CisKKyAgICByc0Fzc2VydChhaW4tPmdldFR5cGUoKS0+Z2V0RGltWigpID09IDApOworCisgICAgc2V0dXBTY3JpcHQocnNjKTsKKyAgICBTY3JpcHQgKiBvbGRUTFMgPSBzZXRUTFModGhpcyk7CisKKworICAgIG10bHMucnNjID0gcnNjOworICAgIG10bHMuYWluID0gYWluOworICAgIG10bHMuYW91dCA9IGFvdXQ7CisgICAgbXRscy5zY3JpcHQgPSB0aGlzOworICAgIG10bHMudXNyID0gdXNyOworICAgIG10bHMubVNsaWNlU2l6ZSA9IDEwOworICAgIG10bHMubVNsaWNlTnVtID0gMDsKKworICAgIG10bHMucHRySW4gPSBOVUxMOworICAgIG10bHMuZVN0cmlkZUluID0gMDsKKyAgICBpZiAoYWluKSB7CisgICAgICAgIG10bHMucHRySW4gPSAoY29uc3QgdWludDhfdCAqKWFpbi0+Z2V0UHRyKCk7CisgICAgICAgIG10bHMuZVN0cmlkZUluID0gYWluLT5nZXRUeXBlKCktPmdldEVsZW1lbnRTaXplQnl0ZXMoKTsKKyAgICB9CisKKyAgICBtdGxzLnB0ck91dCA9IE5VTEw7CisgICAgbXRscy5lU3RyaWRlT3V0ID0gMDsKKyAgICBpZiAoYW91dCkgeworICAgICAgICBtdGxzLnB0ck91dCA9ICh1aW50OF90ICopYW91dC0+Z2V0UHRyKCk7CisgICAgICAgIG10bHMuZVN0cmlkZU91dCA9IGFvdXQtPmdldFR5cGUoKS0+Z2V0RWxlbWVudFNpemVCeXRlcygpOworICAgIH0KKworCisgICAgaWYgKChyc2MtPmdldFdvcmtlclBvb2xTaXplKCkgPiAxKSAmJiBtRW52aXJvbWVudC5tSXNUaHJlYWRhYmxlICYmCisgICAgICAgICgobXRscy5kaW1ZICogbXRscy5kaW1aICogbXRscy5kaW1BcnJheSkgPiAxKSkgeworCisgICAgICAgIC8vTE9HRSgibGF1bmNoIDEiKTsKKyAgICAgICAgcnNjLT5sYXVuY2hUaHJlYWRzKHdjX3h5LCAmbXRscyk7CisgICAgICAgIC8vTE9HRSgibGF1bmNoIDIiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHVpbnQzMl90IGFyID0gbXRscy5hcnJheVN0YXJ0OyBhciA8IG10bHMuYXJyYXlFbmQ7IGFyKyspIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgeiA9IG10bHMuelN0YXJ0OyB6IDwgbXRscy56RW5kOyB6KyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHkgPSBtdGxzLnlTdGFydDsgeSA8IG10bHMueUVuZDsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCA9IG10bHMuZGltWCAqIG10bHMuZGltWSAqIG10bHMuZGltWiAqIGFyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXRscy5kaW1YICogbXRscy5kaW1ZICogeiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10bHMuZGltWCAqIHk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnhQdHJPdXQgPSBtdGxzLnB0ck91dCArIChtdGxzLmVTdHJpZGVPdXQgKiBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp4UHRySW4gPSBtdGxzLnB0ckluICsgKG10bHMuZVN0cmlkZUluICogb2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHggPSBtdGxzLnhTdGFydDsgeCA8IG10bHMueEVuZDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKHJzX3QpbVByb2dyYW0ubVJvb3QpICh4UHRySW4sIHhQdHJPdXQsIHVzciwgeCwgeSwgeiwgYXIpOworICAgICAgICAgICAgICAgICAgICAgICAgeFB0ckluICs9IG10bHMuZVN0cmlkZUluOworICAgICAgICAgICAgICAgICAgICAgICAgeFB0ck91dCArPSBtdGxzLmVTdHJpZGVPdXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzZXRUTFMob2xkVExTKTsKK30KKwordm9pZCBTY3JpcHRDOjpJbnZva2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pCit7CisgICAgLy9MT0dFKCJyc2lfU2NyaXB0SW52b2tlICVpIiwgc2xvdCk7CisgICAgaWYgKChzbG90ID49IG1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbkNvdW50KSB8fAorICAgICAgICAobUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uc1tzbG90XSA9PSBOVUxMKSkgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TQ1JJUFQsICJDYWxsaW5nIGludm9rZSBvbiBiYWQgc2NyaXB0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2V0dXBTY3JpcHQocnNjKTsKKyAgICBTY3JpcHQgKiBvbGRUTFMgPSBzZXRUTFModGhpcyk7CisKKyAgICAoKHZvaWQgKCopKGNvbnN0IHZvaWQgKiwgdWludDMyX3QpKQorICAgICAgICBtRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25zW3Nsb3RdKShkYXRhLCBsZW4pOworCisgICAgc2V0VExTKG9sZFRMUyk7Cit9CisKIFNjcmlwdENTdGF0ZTo6U2NyaXB0Q1N0YXRlKCkKIHsKICAgICBtU2NyaXB0ID0gTlVMTDsKQEAgLTExMywyMSArMzQwLDI3IEBACiB7CiAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKICAgICAgICAgbUNvbnN0YW50QnVmZmVyVHlwZXNbY3RdLmNsZWFyKCk7Ci0gICAgICAgIG1TbG90TmFtZXNbY3RdLnNldFRvKCIiKTsKLSAgICAgICAgbUludm9rYWJsZU5hbWVzW2N0XS5zZXRUbygiIik7CiAgICAgICAgIG1TbG90V3JpdGFibGVbY3RdID0gZmFsc2U7CiAgICAgfQogCiAgICAgZGVsZXRlIG1TY3JpcHQ7CiAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDKE5VTEwpOwotCi0gICAgbUludDMyRGVmaW5lcy5jbGVhcigpOwotICAgIG1GbG9hdERlZmluZXMuY2xlYXIoKTsKIH0KIAotc3RhdGljIEFDQ3ZvaWQqIHN5bWJvbExvb2t1cChBQ0N2b2lkKiBwQ29udGV4dCwgY29uc3QgQUNDY2hhciogbmFtZSkKK3N0YXRpYyBCQ0N2b2lkKiBzeW1ib2xMb29rdXAoQkNDdm9pZCogcENvbnRleHQsIGNvbnN0IEJDQ2NoYXIqIG5hbWUpCiB7Ci0gICAgY29uc3QgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICpzeW0gPSBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbChuYW1lKTsKKyAgICBjb25zdCBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKnN5bTsKKyAgICBTY3JpcHRDICpzID0gKFNjcmlwdEMgKilwQ29udGV4dDsKKyAgICBzeW0gPSBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbChuYW1lKTsKKyAgICBpZiAoc3ltKSB7CisgICAgICAgIHJldHVybiBzeW0tPm1QdHI7CisgICAgfQorICAgIHMtPm1FbnZpcm9tZW50Lm1Jc1RocmVhZGFibGUgPSBmYWxzZTsKKyAgICBzeW0gPSBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbENMKG5hbWUpOworICAgIGlmIChzeW0pIHsKKyAgICAgICAgcmV0dXJuIHN5bS0+bVB0cjsKKyAgICB9CisgICAgc3ltID0gU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2xHTChuYW1lKTsKICAgICBpZiAoc3ltKSB7CiAgICAgICAgIHJldHVybiBzeW0tPm1QdHI7CiAgICAgfQpAQCAtMTM3LDY1ICszNzAsNTMgQEAKIAogdm9pZCBTY3JpcHRDU3RhdGU6OnJ1bkNvbXBpbGVyKENvbnRleHQgKnJzYywgU2NyaXB0QyAqcykKIHsKLSAgICBzLT5tQWNjU2NyaXB0ID0gYWNjQ3JlYXRlU2NyaXB0KCk7Ci0gICAgU3RyaW5nOCB0bXA7CisgICAgTE9HVigiU2NyaXB0Q1N0YXRlOjpydW5Db21waWxlciAiKTsKIAotICAgIHJzYy0+YXBwZW5kTmFtZURlZmluZXMoJnRtcCk7Ci0gICAgYXBwZW5kRGVjbHMoJnRtcCk7Ci0gICAgYXBwZW5kVmFyRGVmaW5lcyhyc2MsICZ0bXApOwotICAgIGFwcGVuZFR5cGVzKHJzYywgJnRtcCk7Ci0gICAgdG1wLmFwcGVuZCgiI2xpbmUgMVxuIik7Ci0KLSAgICBjb25zdCBjaGFyKiBzY3JpcHRTb3VyY2VbXSA9IHt0bXAuc3RyaW5nKCksIHMtPm1FbnZpcm9tZW50Lm1TY3JpcHRUZXh0fTsKLSAgICBpbnQgc2NyaXB0TGVuZ3RoW10gPSB7dG1wLmxlbmd0aCgpLCBzLT5tRW52aXJvbWVudC5tU2NyaXB0VGV4dExlbmd0aH0gOwotICAgIGFjY1NjcmlwdFNvdXJjZShzLT5tQWNjU2NyaXB0LCBzaXplb2Yoc2NyaXB0TGVuZ3RoKSAvIHNpemVvZihpbnQpLCBzY3JpcHRTb3VyY2UsIHNjcmlwdExlbmd0aCk7Ci0gICAgYWNjUmVnaXN0ZXJTeW1ib2xDYWxsYmFjayhzLT5tQWNjU2NyaXB0LCBzeW1ib2xMb29rdXAsIE5VTEwpOwotICAgIGFjY0NvbXBpbGVTY3JpcHQocy0+bUFjY1NjcmlwdCk7Ci0gICAgYWNjR2V0U2NyaXB0TGFiZWwocy0+bUFjY1NjcmlwdCwgIm1haW4iLCAoQUNDdm9pZCoqKSAmcy0+bVByb2dyYW0ubVNjcmlwdCk7Ci0gICAgYWNjR2V0U2NyaXB0TGFiZWwocy0+bUFjY1NjcmlwdCwgImluaXQiLCAoQUNDdm9pZCoqKSAmcy0+bVByb2dyYW0ubUluaXQpOwotICAgIHJzQXNzZXJ0KHMtPm1Qcm9ncmFtLm1TY3JpcHQpOwotCi0gICAgaWYgKCFzLT5tUHJvZ3JhbS5tU2NyaXB0KSB7Ci0gICAgICAgIEFDQ2NoYXIgYnVmWzQwOTZdOwotICAgICAgICBBQ0NzaXplaSBsZW47Ci0gICAgICAgIGFjY0dldFNjcmlwdEluZm9Mb2cocy0+bUFjY1NjcmlwdCwgc2l6ZW9mKGJ1ZiksICZsZW4sIGJ1Zik7Ci0gICAgICAgIExPR0UoIiVzIiwgYnVmKTsKLSAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiRXJyb3IgY29tcGlsaW5nIHVzZXIgc2NyaXB0LiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQorICAgIHMtPm1CY2NTY3JpcHQgPSBiY2NDcmVhdGVTY3JpcHQoKTsKKyAgICBzLT5tRW52aXJvbWVudC5tSXNUaHJlYWRhYmxlID0gdHJ1ZTsKKyAgICBiY2NTY3JpcHRCaXRjb2RlKHMtPm1CY2NTY3JpcHQsIHMtPm1FbnZpcm9tZW50Lm1TY3JpcHRUZXh0LCBzLT5tRW52aXJvbWVudC5tU2NyaXB0VGV4dExlbmd0aCk7CisgICAgYmNjUmVnaXN0ZXJTeW1ib2xDYWxsYmFjayhzLT5tQmNjU2NyaXB0LCBzeW1ib2xMb29rdXAsIHMpOworICAgIGJjY0NvbXBpbGVTY3JpcHQocy0+bUJjY1NjcmlwdCk7CisgICAgYmNjR2V0U2NyaXB0TGFiZWwocy0+bUJjY1NjcmlwdCwgInJvb3QiLCAoQkNDdm9pZCoqKSAmcy0+bVByb2dyYW0ubVJvb3QpOworICAgIGJjY0dldFNjcmlwdExhYmVsKHMtPm1CY2NTY3JpcHQsICJpbml0IiwgKEJDQ3ZvaWQqKikgJnMtPm1Qcm9ncmFtLm1Jbml0KTsKKyAgICBMT0dWKCJyb290ICVwLCAgaW5pdCAlcCIsIHMtPm1Qcm9ncmFtLm1Sb290LCBzLT5tUHJvZ3JhbS5tSW5pdCk7CiAKICAgICBpZiAocy0+bVByb2dyYW0ubUluaXQpIHsKICAgICAgICAgcy0+bVByb2dyYW0ubUluaXQoKTsKICAgICB9CiAKLSAgICBmb3IgKGludCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKLSAgICAgICAgaWYgKG1TbG90TmFtZXNbY3RdLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgYWNjR2V0U2NyaXB0TGFiZWwocy0+bUFjY1NjcmlwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TbG90TmFtZXNbY3RdLnN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFDQ3ZvaWQqKikgJnMtPm1Qcm9ncmFtLm1TbG90UG9pbnRlcnNbY3RdKTsKLSAgICAgICAgfQorICAgIGJjY0dldEV4cG9ydEZ1bmNzKHMtPm1CY2NTY3JpcHQsIChCQ0NzaXplaSopICZzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25Db3VudCwgMCwgTlVMTCk7CisgICAgaWYocy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uQ291bnQgPD0gMCkKKyAgICAgICAgcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9ucyA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbnMgPSAoU2NyaXB0OjpJbnZva2VGdW5jX3QqKSBjYWxsb2Mocy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uQ291bnQsIHNpemVvZihTY3JpcHQ6Okludm9rZUZ1bmNfdCkpOworICAgICAgICBiY2NHZXRFeHBvcnRGdW5jcyhzLT5tQmNjU2NyaXB0LCBOVUxMLCBzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25Db3VudCwgKEJDQ3ZvaWQgKiopIHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbnMpOwogICAgIH0KIAotICAgIGZvciAoaW50IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewotICAgICAgICBpZiAobUludm9rYWJsZU5hbWVzW2N0XS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGFjY0dldFNjcmlwdExhYmVsKHMtPm1BY2NTY3JpcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW52b2thYmxlTmFtZXNbY3RdLnN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFDQ3ZvaWQqKikgJnMtPm1FbnZpcm9tZW50Lm1JbnZva2FibGVzW2N0XSk7Ci0gICAgICAgIH0KKyAgICBiY2NHZXRFeHBvcnRWYXJzKHMtPm1CY2NTY3JpcHQsIChCQ0NzaXplaSopICZzLT5tRW52aXJvbWVudC5tRmllbGRDb3VudCwgMCwgTlVMTCk7CisgICAgaWYocy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQgPD0gMCkKKyAgICAgICAgcy0+bUVudmlyb21lbnQubUZpZWxkQWRkcmVzcyA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1GaWVsZEFkZHJlc3MgPSAodm9pZCAqKikgY2FsbG9jKHMtPm1FbnZpcm9tZW50Lm1GaWVsZENvdW50LCBzaXplb2Yodm9pZCAqKSk7CisgICAgICAgIGJjY0dldEV4cG9ydFZhcnMocy0+bUJjY1NjcmlwdCwgTlVMTCwgcy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQsIChCQ0N2b2lkICoqKSBzLT5tRW52aXJvbWVudC5tRmllbGRBZGRyZXNzKTsKICAgICB9CisgICAgLy9mb3IgKGludCBjdDI9MDsgY3QyIDwgcy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQ7IGN0MisrICkgeworICAgICAgICAvL0xPR0UoIlNjcmlwdCBmaWVsZCAlaSA9ICVwIiwgY3QyLCBzLT5tRW52aXJvbWVudC5tRmllbGRBZGRyZXNzW2N0Ml0pOworICAgIC8vfQogCiAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50LnNldChyc2MtPmdldERlZmF1bHRQcm9ncmFtRnJhZ21lbnQoKSk7CiAgICAgcy0+bUVudmlyb21lbnQubVZlcnRleC5zZXQocnNjLT5nZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpKTsKLSAgICBzLT5tRW52aXJvbWVudC5tRnJhZ21lbnRTdG9yZS5zZXQocnNjLT5nZXREZWZhdWx0UHJvZ3JhbUZyYWdtZW50U3RvcmUoKSk7CisgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuc2V0KHJzYy0+Z2V0RGVmYXVsdFByb2dyYW1TdG9yZSgpKTsKICAgICBzLT5tRW52aXJvbWVudC5tUmFzdGVyLnNldChyc2MtPmdldERlZmF1bHRQcm9ncmFtUmFzdGVyKCkpOwogCi0gICAgaWYgKHMtPm1Qcm9ncmFtLm1TY3JpcHQpIHsKKyAgICBpZiAocy0+bVByb2dyYW0ubVJvb3QpIHsKICAgICAgICAgY29uc3Qgc3RhdGljIGludCBwcmFnbWFNYXggPSAxNjsKLSAgICAgICAgQUNDc2l6ZWkgcHJhZ21hQ291bnQ7Ci0gICAgICAgIEFDQ2NoYXIgKiBzdHJbcHJhZ21hTWF4XTsKLSAgICAgICAgYWNjR2V0UHJhZ21hcyhzLT5tQWNjU2NyaXB0LCAmcHJhZ21hQ291bnQsIHByYWdtYU1heCwgJnN0clswXSk7CisgICAgICAgIEJDQ3NpemVpIHByYWdtYUNvdW50OworICAgICAgICBCQ0NjaGFyICogc3RyW3ByYWdtYU1heF07CisgICAgICAgIGJjY0dldFByYWdtYXMocy0+bUJjY1NjcmlwdCwgJnByYWdtYUNvdW50LCBwcmFnbWFNYXgsICZzdHJbMF0pOwogCiAgICAgICAgIGZvciAoaW50IGN0PTA7IGN0IDwgcHJhZ21hQ291bnQ7IGN0Kz0yKSB7CisgICAgICAgICAgICAvL0xPR0UoInByYWdtZSAlcyAlcyIsIHN0cltjdF0sIHN0cltjdCsxXSk7CiAgICAgICAgICAgICBpZiAoIXN0cmNtcChzdHJbY3RdLCAidmVyc2lvbiIpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBAIC0yMDgsMTEgKzQyOSw2IEBACiAgICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1WZXJ0ZXguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFByb2dyYW1WZXJ0ZXggKiBwdiA9IChQcm9ncmFtVmVydGV4ICopcnNjLT5sb29rdXBOYW1lKHN0cltjdCsxXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHB2ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubVZlcnRleC5zZXQocHYpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgTE9HRSgiVW5yZWNvbml6ZWQgdmFsdWUgJXMgcGFzc2VkIHRvIHN0YXRlVmVydGV4Iiwgc3RyW2N0KzFdKTsKICAgICAgICAgICAgIH0KIApAQCAtMjI0LDExICs0NDAsNiBAQAogICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tUmFzdGVyLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQcm9ncmFtUmFzdGVyICogcHIgPSAoUHJvZ3JhbVJhc3RlciAqKXJzYy0+bG9va3VwTmFtZShzdHJbY3QrMV0pOwotICAgICAgICAgICAgICAgIGlmIChwciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1SYXN0ZXIuc2V0KHByKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIExPR0UoIlVucmVjb25pemVkIHZhbHVlICVzIHBhc3NlZCB0byBzdGF0ZVJhc3RlciIsIHN0cltjdCsxXSk7CiAgICAgICAgICAgICB9CiAKQEAgLTI0MCwxMSArNDUxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50LmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQcm9ncmFtRnJhZ21lbnQgKiBwZiA9IChQcm9ncmFtRnJhZ21lbnQgKilyc2MtPmxvb2t1cE5hbWUoc3RyW2N0KzFdKTsKLSAgICAgICAgICAgICAgICBpZiAocGYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tRnJhZ21lbnQuc2V0KHBmKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIExPR0UoIlVucmVjb25pemVkIHZhbHVlICVzIHBhc3NlZCB0byBzdGF0ZUZyYWdtZW50Iiwgc3RyW2N0KzFdKTsKICAgICAgICAgICAgIH0KIApAQCAtMjU2LDEyICs0NjIsNiBAQAogICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tRnJhZ21lbnRTdG9yZS5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50U3RvcmUgKiBwZnMgPQotICAgICAgICAgICAgICAgICAgICAoUHJvZ3JhbUZyYWdtZW50U3RvcmUgKilyc2MtPmxvb2t1cE5hbWUoc3RyW2N0KzFdKTsKLSAgICAgICAgICAgICAgICBpZiAocGZzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuc2V0KHBmcyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBMT0dFKCJVbnJlY29uaXplZCB2YWx1ZSAlcyBwYXNzZWQgdG8gc3RhdGVTdG9yZSIsIHN0cltjdCsxXSk7CiAgICAgICAgICAgICB9CiAKQEAgLTI3MywxMTEgKzQ3Myw2IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBhcHBlbmRFbGVtZW50Qm9keShTdHJpbmc4ICpzLCBjb25zdCBFbGVtZW50ICplKQotewotICAgIHMtPmFwcGVuZCgiIHtcbiIpOwotICAgIGZvciAoc2l6ZV90IGN0Mj0wOyBjdDIgPCBlLT5nZXRGaWVsZENvdW50KCk7IGN0MisrKSB7Ci0gICAgICAgIGNvbnN0IEVsZW1lbnQgKmMgPSBlLT5nZXRGaWVsZChjdDIpOwotICAgICAgICBzLT5hcHBlbmQoIiAgICAiKTsKLSAgICAgICAgcy0+YXBwZW5kKGMtPmdldENUeXBlKCkpOwotICAgICAgICBzLT5hcHBlbmQoIiAiKTsKLSAgICAgICAgcy0+YXBwZW5kKGUtPmdldEZpZWxkTmFtZShjdDIpKTsKLSAgICAgICAgcy0+YXBwZW5kKCI7XG4iKTsKLSAgICB9Ci0gICAgcy0+YXBwZW5kKCJ9Iik7Ci19Ci0KLXZvaWQgU2NyaXB0Q1N0YXRlOjphcHBlbmRWYXJEZWZpbmVzKGNvbnN0IENvbnRleHQgKnJzYywgU3RyaW5nOCAqc3RyKQotewotICAgIGNoYXIgYnVmWzI1Nl07Ci0gICAgaWYgKHJzYy0+cHJvcHMubUxvZ1NjcmlwdHMpIHsKLSAgICAgICAgTE9HRCgiYXBwZW5kVmFyRGVmaW5lcyBtSW50MzJEZWZpbmVzLnNpemUoKT0lZCBtRmxvYXREZWZpbmVzLnNpemUoKT0lZFxuIiwKLSAgICAgICAgICAgICAgICBtSW50MzJEZWZpbmVzLnNpemUoKSwgbUZsb2F0RGVmaW5lcy5zaXplKCkpOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IG1JbnQzMkRlZmluZXMuc2l6ZSgpOyBjdCsrKSB7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lICIpOwotICAgICAgICBzdHItPmFwcGVuZChtSW50MzJEZWZpbmVzLmtleUF0KGN0KSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHNwcmludGYoYnVmLCAiJWlcbiIsIChpbnQpbUludDMyRGVmaW5lcy52YWx1ZUF0KGN0KSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKGJ1Zik7Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgbUZsb2F0RGVmaW5lcy5zaXplKCk7IGN0KyspIHsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgIik7Ci0gICAgICAgIHN0ci0+YXBwZW5kKG1GbG9hdERlZmluZXMua2V5QXQoY3QpKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiAiKTsKLSAgICAgICAgc3ByaW50ZihidWYsICIlZmZcbiIsIG1GbG9hdERlZmluZXMudmFsdWVBdChjdCkpOwotICAgICAgICBzdHItPmFwcGVuZChidWYpOwotICAgIH0KLX0KLQotCi0KLXZvaWQgU2NyaXB0Q1N0YXRlOjphcHBlbmRUeXBlcyhjb25zdCBDb250ZXh0ICpyc2MsIFN0cmluZzggKnN0cikKLXsKLSAgICBjaGFyIGJ1ZlsyNTZdOwotICAgIFN0cmluZzggdG1wOwotCi0gICAgc3RyLT5hcHBlbmQoInN0cnVjdCB2ZWNGMzJfMl9zIHtmbG9hdCB4OyBmbG9hdCB5O307XG4iKTsKLSAgICBzdHItPmFwcGVuZCgic3RydWN0IHZlY0YzMl8zX3Mge2Zsb2F0IHg7IGZsb2F0IHk7IGZsb2F0IHo7fTtcbiIpOwotICAgIHN0ci0+YXBwZW5kKCJzdHJ1Y3QgdmVjRjMyXzRfcyB7ZmxvYXQgeDsgZmxvYXQgeTsgZmxvYXQgejsgZmxvYXQgdzt9O1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoInN0cnVjdCB2ZWNVOF80X3Mge2NoYXIgcjsgY2hhciBnOyBjaGFyIGI7IGNoYXIgYTt9O1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjRjMyXzJfdCBzdHJ1Y3QgdmVjRjMyXzJfc1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjRjMyXzNfdCBzdHJ1Y3QgdmVjRjMyXzNfc1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjRjMyXzRfdCBzdHJ1Y3QgdmVjRjMyXzRfc1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjVThfNF90IHN0cnVjdCB2ZWNVOF80X3NcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY0k4XzRfdCBzdHJ1Y3QgdmVjVThfNF9zXG4iKTsKLQotICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewotICAgICAgICBjb25zdCBUeXBlICp0ID0gbUNvbnN0YW50QnVmZmVyVHlwZXNbY3RdLmdldCgpOwotICAgICAgICBpZiAoIXQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IEVsZW1lbnQgKmUgPSB0LT5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChlLT5nZXROYW1lKCkgJiYgKGUtPmdldEZpZWxkQ291bnQoKSA+IDEpKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IHMoInN0cnVjdCBzdHJ1Y3RfIik7Ci0gICAgICAgICAgICBzLmFwcGVuZChlLT5nZXROYW1lKCkpOwotICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0Q1N0cnVjdEJvZHkoKSk7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiO1xuIik7Ci0KLSAgICAgICAgICAgIHMuYXBwZW5kKCIjZGVmaW5lICIpOwotICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKCJfdCBzdHJ1Y3Qgc3RydWN0XyIpOwotICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKCJcblxuIik7Ci0gICAgICAgICAgICBpZiAocnNjLT5wcm9wcy5tTG9nU2NyaXB0cykgewotICAgICAgICAgICAgICAgIExPR1YoIiVzIiwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ci0+YXBwZW5kKHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TbG90TmFtZXNbY3RdLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgU3RyaW5nOCBzOwotICAgICAgICAgICAgaWYgKGUtPmdldE5hbWUoKSkgewotICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgbmFtZWQgc3RydWN0Ci0gICAgICAgICAgICAgICAgcy5zZXRUbyhlLT5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYW4gc3RydWN0IG5hbWVkIGZyb20gdGhlIHNsb3QuCi0gICAgICAgICAgICAgICAgcy5zZXRUbygic3RydWN0ICIpOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kKG1TbG90TmFtZXNbY3RdKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZCgiX3MiKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZChlLT5nZXRDU3RydWN0Qm9keSgpKTsKLSAgICAgICAgICAgICAgICAvL2FwcGVuZEVsZW1lbnRCb2R5KCZzLCBlKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZCgiO1xuIik7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoInN0cnVjdCAiKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZChtU2xvdE5hbWVzW2N0XSk7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoIl9zIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHMuYXBwZW5kKCIgKiAiKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKG1TbG90TmFtZXNbY3RdKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKCI7XG4iKTsKLSAgICAgICAgICAgIGlmIChyc2MtPnByb3BzLm1Mb2dTY3JpcHRzKSB7Ci0gICAgICAgICAgICAgICAgTE9HVigiJXMiLCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4ocykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RyLT5hcHBlbmQocyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CiAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNDIwLDcgKzUxNSw2IEBACiAgICAgcy0+c2V0Q29udGV4dChyc2MpOwogICAgIGZvciAoaW50IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewogICAgICAgICBzLT5tVHlwZXNbY3RdLnNldChzcy0+bUNvbnN0YW50QnVmZmVyVHlwZXNbY3RdLmdldCgpKTsKLSAgICAgICAgcy0+bVNsb3ROYW1lc1tjdF0gPSBzcy0+bVNsb3ROYW1lc1tjdF07CiAgICAgICAgIHMtPm1TbG90V3JpdGFibGVbY3RdID0gc3MtPm1TbG90V3JpdGFibGVbY3RdOwogICAgIH0KIApAQCAtNDI4LDE4ICs1MjIsNiBAQAogICAgIHJldHVybiBzOwogfQogCi12b2lkIHJzaV9TY3JpcHRDU2V0RGVmaW5lRihDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIqIG5hbWUsIGZsb2F0IHZhbHVlKQotewotICAgIFNjcmlwdENTdGF0ZSAqc3MgPSAmcnNjLT5tU2NyaXB0QzsKLSAgICBzcy0+bUZsb2F0RGVmaW5lcy5hZGQoU3RyaW5nOChuYW1lKSwgdmFsdWUpOwotfQotCi12b2lkIHJzaV9TY3JpcHRDU2V0RGVmaW5lSTMyKENvbnRleHQgKnJzYywgY29uc3QgY2hhciogbmFtZSwgaW50MzJfdCB2YWx1ZSkKLXsKLSAgICBTY3JpcHRDU3RhdGUgKnNzID0gJnJzYy0+bVNjcmlwdEM7Ci0gICAgc3MtPm1JbnQzMkRlZmluZXMuYWRkKFN0cmluZzgobmFtZSksIHZhbHVlKTsKLX0KLQogfQogfQogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0Qy5oIGIvbGlicy9ycy9yc1NjcmlwdEMuaAppbmRleCAzNWFiYWRmLi45ZDA5YjBiIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2NyaXB0Qy5oCisrKyBiL2xpYnMvcnMvcnNTY3JpcHRDLmgKQEAgLTIxLDkgKzIxLDcgQEAKIAogI2luY2x1ZGUgIlJlbmRlclNjcmlwdEVudi5oIgogCi0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLQotc3RydWN0IEFDQ3NjcmlwdDsKK3N0cnVjdCBCQ0NzY3JpcHQ7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzQsNyArMzIsNyBAQAogY2xhc3MgU2NyaXB0QyA6IHB1YmxpYyBTY3JpcHQKIHsKIHB1YmxpYzoKLSAgICB0eXBlZGVmIGludCAoKlJ1blNjcmlwdF90KSh1aW50MzJfdCBsYXVuY2hJbmRleCk7CisgICAgdHlwZWRlZiBpbnQgKCpSdW5TY3JpcHRfdCkoKTsKICAgICB0eXBlZGVmIHZvaWQgKCpWb2lkRnVuY190KSgpOwogCiAgICAgU2NyaXB0QyhDb250ZXh0ICopOwpAQCAtNDQsMTggKzQyLDM1IEBACiAgICAgICAgIGludCBtVmVyc2lvbk1ham9yOwogICAgICAgICBpbnQgbVZlcnNpb25NaW5vcjsKIAotICAgICAgICBSdW5TY3JpcHRfdCBtU2NyaXB0OworICAgICAgICBSdW5TY3JpcHRfdCBtUm9vdDsKICAgICAgICAgVm9pZEZ1bmNfdCBtSW5pdDsKLQotICAgICAgICB2b2lkICoqIG1TbG90UG9pbnRlcnNbTUFYX1NDUklQVF9CQU5LU107CiAgICAgfTsKIAogICAgIFByb2dyYW1fdCBtUHJvZ3JhbTsKIAotICAgIEFDQ3NjcmlwdCogICAgbUFjY1NjcmlwdDsKKyAgICBCQ0NzY3JpcHQqICAgIG1CY2NTY3JpcHQ7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0dXBTY3JpcHQoKTsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IHJ1bihDb250ZXh0ICosIHVpbnQzMl90IGxhdW5jaElEKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICpwdHJUb0FsbG9jYXRpb24oY29uc3Qgdm9pZCAqKSBjb25zdDsKKworCisgICAgdmlydHVhbCB2b2lkIEludm9rZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbik7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IHJ1bihDb250ZXh0ICopOworCisgICAgdmlydHVhbCB2b2lkIHJ1bkZvckVhY2goQ29udGV4dCAqcnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFsbG9jYXRpb24gKiBhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdGlvbiAqIGFvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIHVzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSc1NjcmlwdENhbGwgKnNjID0gTlVMTCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QgeyAgICB9CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9TQ1JJUFRfQzsgfQorICAgIHN0YXRpYyBUeXBlICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKSB7IHJldHVybiBOVUxMOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIHNldHVwU2NyaXB0KENvbnRleHQgKik7CisgICAgdm9pZCBzZXR1cEdMU3RhdGUoQ29udGV4dCAqKTsKKyAgICBTY3JpcHQgKiBzZXRUTFMoU2NyaXB0ICopOwogfTsKIAogY2xhc3MgU2NyaXB0Q1N0YXRlCkBAIC02NywyNyArODIsMjEgQEAKICAgICBTY3JpcHRDICptU2NyaXB0OwogCiAgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBUeXBlPiBtQ29uc3RhbnRCdWZmZXJUeXBlc1tNQVhfU0NSSVBUX0JBTktTXTsKLSAgICBTdHJpbmc4IG1TbG90TmFtZXNbTUFYX1NDUklQVF9CQU5LU107CisgICAgLy9TdHJpbmc4IG1TbG90TmFtZXNbTUFYX1NDUklQVF9CQU5LU107CiAgICAgYm9vbCBtU2xvdFdyaXRhYmxlW01BWF9TQ1JJUFRfQkFOS1NdOwotICAgIFN0cmluZzggbUludm9rYWJsZU5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOworICAgIC8vU3RyaW5nOCBtSW52b2thYmxlTmFtZXNbTUFYX1NDUklQVF9CQU5LU107CiAKICAgICB2b2lkIGNsZWFyKCk7CiAgICAgdm9pZCBydW5Db21waWxlcihDb250ZXh0ICpyc2MsIFNjcmlwdEMgKnMpOwotICAgIHZvaWQgYXBwZW5kVmFyRGVmaW5lcyhjb25zdCBDb250ZXh0ICpyc2MsIFN0cmluZzggKnN0cik7Ci0gICAgdm9pZCBhcHBlbmRUeXBlcyhjb25zdCBDb250ZXh0ICpyc2MsIFN0cmluZzggKnN0cik7CiAKICAgICBzdHJ1Y3QgU3ltYm9sVGFibGVfdCB7CiAgICAgICAgIGNvbnN0IGNoYXIgKiBtTmFtZTsKICAgICAgICAgdm9pZCAqIG1QdHI7Ci0gICAgICAgIGNvbnN0IGNoYXIgKiBtUmV0OwotICAgICAgICBjb25zdCBjaGFyICogbVBhcmFtOwogICAgIH07Ci0gICAgc3RhdGljIFN5bWJvbFRhYmxlX3QgZ1N5bXNbXTsKKyAgICAvL3N0YXRpYyBTeW1ib2xUYWJsZV90IGdTeW1zW107CiAgICAgc3RhdGljIGNvbnN0IFN5bWJvbFRhYmxlX3QgKiBsb29rdXBTeW1ib2woY29uc3QgY2hhciAqKTsKLSAgICBzdGF0aWMgdm9pZCBhcHBlbmREZWNscyhTdHJpbmc4ICpzdHIpOwotCi0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCxpbnQ+IG1JbnQzMkRlZmluZXM7Ci0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCxmbG9hdD4gbUZsb2F0RGVmaW5lczsKKyAgICBzdGF0aWMgY29uc3QgU3ltYm9sVGFibGVfdCAqIGxvb2t1cFN5bWJvbENMKGNvbnN0IGNoYXIgKik7CisgICAgc3RhdGljIGNvbnN0IFN5bWJvbFRhYmxlX3QgKiBsb29rdXBTeW1ib2xHTChjb25zdCBjaGFyICopOwogfTsKIAogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0Q19MaWIuY3BwIGIvbGlicy9ycy9yc1NjcmlwdENfTGliLmNwcAppbmRleCAyMDJjYTNkLi41YTJiNmJhIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2NyaXB0Q19MaWIuY3BwCisrKyBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYi5jcHAKQEAgLTE3LDE4ICsxNywxMCBAQAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgogI2luY2x1ZGUgInJzU2NyaXB0Qy5oIgogI2luY2x1ZGUgInJzTWF0cml4LmgiCi0jaW5jbHVkZSAicnNOb2lzZS5oIgogCiAjaW5jbHVkZSAiYWNjL2FjYy5oIgogI2luY2x1ZGUgInV0aWxzL1RpbWVycy5oIgogCi0jZGVmaW5lIEdMX0dMRVhUX1BST1RPVFlQRVMKLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0KICNpbmNsdWRlIDx0aW1lLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwpAQCAtMzksMjUyICszMSwxMSBAQAogICAgIENvbnRleHQgKiByc2MgPSB0bHMtPm1Db250ZXh0OyBcCiAgICAgU2NyaXB0QyAqIHNjID0gKFNjcmlwdEMgKikgdGxzLT5tU2NyaXB0CiAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBmbG9hdCB4OwotICAgIGZsb2F0IHk7Ci0gICAgZmxvYXQgejsKLX0gdmVjM190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgZmxvYXQgeDsKLSAgICBmbG9hdCB5OwotICAgIGZsb2F0IHo7Ci0gICAgZmxvYXQgdzsKLX0gdmVjNF90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgZmxvYXQgeDsKLSAgICBmbG9hdCB5OwotfSB2ZWMyX3Q7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSU8gcm91dGluZXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgZmxvYXQgU0NfbG9hZEYodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0KQotewotICAgIEdFVF9UTFMoKTsKLSAgICBjb25zdCB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGNvbnN0IGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8Y29uc3QgZmxvYXQgKj4odnApOwotICAgIC8vTE9HRSgibG9hZEYgJWkgJWkgPSAlZiAleCIsIGJhbmssIG9mZnNldCwgZiwgKChpbnQgKikmZilbMF0pOwotICAgIHJldHVybiBmW29mZnNldF07Ci19Ci0KLXN0YXRpYyBpbnQzMl90IFNDX2xvYWRJMzIodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0KQotewotICAgIEdFVF9UTFMoKTsKLSAgICBjb25zdCB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGNvbnN0IGludDMyX3QgKmkgPSBzdGF0aWNfY2FzdDxjb25zdCBpbnQzMl90ICo+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+dyAqPSBzY2FsZTsKLX0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBNYXRoIHJvdXRpbmVzCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotI2RlZmluZSBQSSAzLjE0MTU5MjZmCi0jZGVmaW5lIERFR19UT19SQUQgUEkgLyAxODAuMGYKLSNkZWZpbmUgUkFEX1RPX0RFRyAxODAuMGYgLyBQSQotCiBzdGF0aWMgZmxvYXQgU0Nfc2luZl9mYXN0KGZsb2F0IHgpCiB7CiAgICAgY29uc3QgZmxvYXQgQSA9ICAgMS4wZiAvICgyLjBmICogTV9QSSk7CkBAIC0zMjMsNiArNzQsNyBAQAogICAgIHJldHVybiAwLjIyMTVmICogKHkgKiBmYWJzZih5KSAtIHkpICsgeTsKIH0KIAorCiBzdGF0aWMgZmxvYXQgU0NfcmFuZGYoZmxvYXQgbWF4KQogewogICAgIGZsb2F0IHIgPSAoZmxvYXQpcmFuZCgpOwpAQCAtMzM1LDEwNCArODcsMjAgQEAKICAgICByZXR1cm4gciAvIFJBTkRfTUFYICogKG1heCAtIG1pbikgKyBtaW47CiB9CiAKLXN0YXRpYyBpbnQgU0Nfc2lnbihpbnQgdmFsdWUpCitzdGF0aWMgaW50IFNDX3JhbmRpKGludCBtYXgpCiB7Ci0gICAgcmV0dXJuICh2YWx1ZSA+IDApIC0gKHZhbHVlIDwgMCk7CisgICAgcmV0dXJuIChpbnQpU0NfcmFuZGYobWF4KTsKIH0KIAotc3RhdGljIGZsb2F0IFNDX3NpZ25mKGZsb2F0IHZhbHVlKQorc3RhdGljIGludCBTQ19yYW5kaTIoaW50IG1pbiwgaW50IG1heCkKIHsKLSAgICByZXR1cm4gKHZhbHVlID4gMCkgLSAodmFsdWUgPCAwKTsKKyAgICByZXR1cm4gKGludClTQ19yYW5kZjIobWluLCBtYXgpOwogfQogCi1zdGF0aWMgZmxvYXQgU0NfY2xhbXBmKGZsb2F0IGFtb3VudCwgZmxvYXQgbG93LCBmbG9hdCBoaWdoKQorc3RhdGljIGZsb2F0IFNDX2ZyYWMoZmxvYXQgdikKIHsKLSAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKLX0KLQotc3RhdGljIGludCBTQ19jbGFtcChpbnQgYW1vdW50LCBpbnQgbG93LCBpbnQgaGlnaCkKLXsKLSAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX21heGYoZmxvYXQgYSwgZmxvYXQgYikKLXsKLSAgICByZXR1cm4gYSA+IGIgPyBhIDogYjsKLX0KLQotc3RhdGljIGZsb2F0IFNDX21pbmYoZmxvYXQgYSwgZmxvYXQgYikKLXsKLSAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKLX0KLQotc3RhdGljIGZsb2F0IFNDX3NxcmYoZmxvYXQgdikKLXsKLSAgICByZXR1cm4gdiAqIHY7Ci19Ci0KLXN0YXRpYyBpbnQgU0Nfc3FyKGludCB2KQotewotICAgIHJldHVybiB2ICogdjsKLX0KLQotc3RhdGljIGZsb2F0IFNDX2ZyYWNmKGZsb2F0IHYpCi17Ci0gICAgcmV0dXJuIHYgLSBmbG9vcmYodik7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19yb3VuZGYoZmxvYXQgdikKLXsKLSAgICByZXR1cm4gZmxvb3JmKHYgKyAwLjQ5OTk5OTk5OTkpOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfZGlzdGYyKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyKQotewotICAgIGZsb2F0IHggPSB4MiAtIHgxOwotICAgIGZsb2F0IHkgPSB5MiAtIHkxOwotICAgIHJldHVybiBzcXJ0Zih4ICogeCArIHkgKiB5KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX2Rpc3RmMyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyKQotewotICAgIGZsb2F0IHggPSB4MiAtIHgxOwotICAgIGZsb2F0IHkgPSB5MiAtIHkxOwotICAgIGZsb2F0IHogPSB6MiAtIHoxOwotICAgIHJldHVybiBzcXJ0Zih4ICogeCArIHkgKiB5ICsgeiAqIHopOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfbWFnZjIoZmxvYXQgYSwgZmxvYXQgYikKLXsKLSAgICByZXR1cm4gc3FydGYoYSAqIGEgKyBiICogYik7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19tYWdmMyhmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBjKQotewotICAgIHJldHVybiBzcXJ0ZihhICogYSArIGIgKiBiICsgYyAqIGMpOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfcmFkZihmbG9hdCBkZWdyZWVzKQotewotICAgIHJldHVybiBkZWdyZWVzICogREVHX1RPX1JBRDsKLX0KLQotc3RhdGljIGZsb2F0IFNDX2RlZ2YoZmxvYXQgcmFkaWFucykKLXsKLSAgICByZXR1cm4gcmFkaWFucyAqIFJBRF9UT19ERUc7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19sZXJwZihmbG9hdCBzdGFydCwgZmxvYXQgc3RvcCwgZmxvYXQgYW1vdW50KQotewotICAgIHJldHVybiBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50OwotfQotCi1zdGF0aWMgZmxvYXQgU0Nfbm9ybWYoZmxvYXQgc3RhcnQsIGZsb2F0IHN0b3AsIGZsb2F0IHZhbHVlKQotewotICAgIHJldHVybiAodmFsdWUgLSBzdGFydCkgLyAoc3RvcCAtIHN0YXJ0KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX21hcGYoZmxvYXQgbWluU3RhcnQsIGZsb2F0IG1pblN0b3AsIGZsb2F0IG1heFN0YXJ0LCBmbG9hdCBtYXhTdG9wLCBmbG9hdCB2YWx1ZSkKLXsKLSAgICByZXR1cm4gbWF4U3RhcnQgKyAobWF4U3RhcnQgLSBtYXhTdG9wKSAqICgodmFsdWUgLSBtaW5TdGFydCkgLyAobWluU3RvcCAtIG1pblN0YXJ0KSk7CisgICAgaW50IGkgPSAoaW50KWZsb29yKHYpOworICAgIHJldHVybiBmbWluKHYgLSBpLCAweDEuZmZmZmZlcC0xZik7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNTExLDM0OCArMTc5LDIyIEBACiAgICAgcmV0dXJuIHRpbWVpbmZvLT50bV95ZWFyOwogfQogCi1zdGF0aWMgaW50MzJfdCBTQ191cHRpbWVNaWxsaXMoKQorc3RhdGljIGludDY0X3QgU0NfdXB0aW1lTWlsbGlzKCkKIHsKICAgICByZXR1cm4gbmFub3NlY29uZHNfdG9fbWlsbGlzZWNvbmRzKHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSk7CiB9CiAKLXN0YXRpYyBpbnQzMl90IFNDX3N0YXJ0VGltZU1pbGxpcygpCitzdGF0aWMgaW50NjRfdCBTQ191cHRpbWVOYW5vcygpCit7CisgICAgcmV0dXJuIHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKK30KKworc3RhdGljIGZsb2F0IFNDX2dldER0KCkKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgcmV0dXJuIHNjLT5tRW52aXJvbWVudC5tU3RhcnRUaW1lTWlsbGlzOwotfQotCi1zdGF0aWMgaW50MzJfdCBTQ19lbGFwc2VkVGltZU1pbGxpcygpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJldHVybiBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMoc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpKQotICAgICAgICAgICAgLSBzYy0+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+bUVudmlyb21lbnQubUxhc3REdFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisgICAgcmV0dXJuICgoZmxvYXQpKHNjLT5tRW52aXJvbWVudC5tTGFzdER0VGltZSAtIGwpKSAvIDEuMGU5OwogfQogCiAKQEAgLTg2MCw1MzEgKzIwMiwyNzIgQEAKIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIHZvaWQgU0NfY29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKK3N0YXRpYyB1aW50MzJfdCBTQ19hbGxvY0dldERpbVgoUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByc2MtPm1TdGF0ZVZlcnRleC5jb2xvclswXSA9IHI7Ci0gICAgcnNjLT5tU3RhdGVWZXJ0ZXguY29sb3JbMV0gPSBnOwotICAgIHJzYy0+bVN0YXRlVmVydGV4LmNvbG9yWzJdID0gYjsKLSAgICByc2MtPm1TdGF0ZVZlcnRleC5jb2xvclszXSA9IGE7Ci0gICAgaWYgKCFyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIGdsQ29sb3I0ZihyLCBnLCBiLCBhKTsKLSAgICB9CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmEpOworICAgIC8vTE9HRSgiU0NfYWxsb2NHZXREaW1YIGE9JXAiLCBhKTsKKyAgICAvL0xPR0UoIiB0eXBlPSVwIiwgYS0+Z2V0VHlwZSgpKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1YKCk7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX2FtYmllbnQoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyByLCBnLCBiLCBhIH07Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9BTUJJRU5ULCBwYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kaWZmdXNlKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCi17Ci0gICAgR0xmbG9hdCBwYXJhbXNbXSA9IHsgciwgZywgYiwgYSB9OwotICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfRElGRlVTRSwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc3BlY3VsYXIoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyByLCBnLCBiLCBhIH07Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TUEVDVUxBUiwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZW1pc3Npb24oZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyByLCBnLCBiLCBhIH07Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9FTUlTU0lPTiwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc2hpbmluZXNzKGZsb2F0IHMpCi17Ci0gICAgZ2xNYXRlcmlhbGYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NISU5JTkVTUywgcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3BvaW50QXR0ZW51YXRpb24oZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgYykKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyBhLCBiLCBjIH07Ci0gICAgZ2xQb2ludFBhcmFtZXRlcmZ2KEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OLCBwYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19oc2JUb1JnYihmbG9hdCBoLCBmbG9hdCBzLCBmbG9hdCBiLCBmbG9hdCogcmdiKQotewotICAgIGZsb2F0IHJlZCA9IDAuMGY7Ci0gICAgZmxvYXQgZ3JlZW4gPSAwLjBmOwotICAgIGZsb2F0IGJsdWUgPSAwLjBmOwotCi0gICAgZmxvYXQgeCA9IGg7Ci0gICAgZmxvYXQgeSA9IHM7Ci0gICAgZmxvYXQgeiA9IGI7Ci0KLSAgICBmbG9hdCBoZiA9ICh4IC0gKGludCkgeCkgKiA2LjBmOwotICAgIGludCBpaGYgPSAoaW50KSBoZjsKLSAgICBmbG9hdCBmID0gaGYgLSBpaGY7Ci0gICAgZmxvYXQgcHYgPSB6ICogKDEuMGYgLSB5KTsKLSAgICBmbG9hdCBxdiA9IHogKiAoMS4wZiAtIHkgKiBmKTsKLSAgICBmbG9hdCB0diA9IHogKiAoMS4wZiAtIHkgKiAoMS4wZiAtIGYpKTsKLQotICAgIHN3aXRjaCAoaWhmKSB7Ci0gICAgICAgIGNhc2UgMDogICAgICAgICAvLyBSZWQgaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSB6OwotICAgICAgICAgICAgZ3JlZW4gPSB0djsKLSAgICAgICAgICAgIGJsdWUgPSBwdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6ICAgICAgICAgLy8gR3JlZW4gaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSBxdjsKLSAgICAgICAgICAgIGdyZWVuID0gejsKLSAgICAgICAgICAgIGJsdWUgPSBwdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICByZWQgPSBwdjsKLSAgICAgICAgICAgIGdyZWVuID0gejsKLSAgICAgICAgICAgIGJsdWUgPSB0djsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6ICAgICAgICAgLy8gQmx1ZSBpcyB0aGUgZG9taW5hbnQgY29sb3IKLSAgICAgICAgICAgIHJlZCA9IHB2OwotICAgICAgICAgICAgZ3JlZW4gPSBxdjsKLSAgICAgICAgICAgIGJsdWUgPSB6OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHJlZCA9IHR2OwotICAgICAgICAgICAgZ3JlZW4gPSBwdjsKLSAgICAgICAgICAgIGJsdWUgPSB6OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogICAgICAgICAvLyBSZWQgaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSB6OwotICAgICAgICAgICAgZ3JlZW4gPSBwdjsKLSAgICAgICAgICAgIGJsdWUgPSBxdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJnYlswXSA9IHJlZDsKLSAgICByZ2JbMV0gPSBncmVlbjsKLSAgICByZ2JbMl0gPSBibHVlOwotfQotCi1zdGF0aWMgaW50IFNDX2hzYlRvQWJncihmbG9hdCBoLCBmbG9hdCBzLCBmbG9hdCBiLCBmbG9hdCBhKQotewotICAgIGZsb2F0IHJnYlszXTsKLSAgICBTQ19oc2JUb1JnYihoLCBzLCBiLCByZ2IpOwotICAgIHJldHVybiBpbnQoYSAgICAgICogMjU1LjBmKSA8PCAyNCB8Ci0gICAgICAgICAgIGludChyZ2JbMl0gKiAyNTUuMGYpIDw8IDE2IHwKLSAgICAgICAgICAgaW50KHJnYlsxXSAqIDI1NS4wZikgPDwgIDggfAotICAgICAgICAgICBpbnQocmdiWzBdICogMjU1LjBmKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfaHNiKGZsb2F0IGgsIGZsb2F0IHMsIGZsb2F0IGIsIGZsb2F0IGEpCitzdGF0aWMgdWludDMyX3QgU0NfYWxsb2NHZXREaW1ZKFJzQWxsb2NhdGlvbiB2YSkKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgZmxvYXQgcmdiWzNdOwotICAgIFNDX2hzYlRvUmdiKGgsIHMsIGIsIHJnYik7Ci0gICAgaWYgKHJzYy0+Y2hlY2tWZXJzaW9uMl8wKCkpIHsKLSAgICAgICAgZ2xWZXJ0ZXhBdHRyaWI0ZigxLCByZ2JbMF0sIHJnYlsxXSwgcmdiWzJdLCBhKTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbENvbG9yNGYocmdiWzBdLCByZ2JbMV0sIHJnYlsyXSwgYSk7Ci0gICAgfQorICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1ZKCk7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX3VwbG9hZFRvVGV4dHVyZShSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IGJhc2VNaXBMZXZlbCkKK3N0YXRpYyB1aW50MzJfdCBTQ19hbGxvY0dldERpbVooUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShyc2MsIHZhLCBmYWxzZSwgYmFzZU1pcExldmVsKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgcmV0dXJuIGEtPmdldFR5cGUoKS0+Z2V0RGltWigpOwogfQogCi1zdGF0aWMgdm9pZCBTQ191cGxvYWRUb0J1ZmZlck9iamVjdChSc0FsbG9jYXRpb24gdmEpCitzdGF0aWMgdWludDMyX3QgU0NfYWxsb2NHZXREaW1MT0QoUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYywgdmEpOworICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1MT0QoKTsKIH0KIAotc3RhdGljIHZvaWQgU0Nfc3luY1RvR0woUnNBbGxvY2F0aW9uIHZhKQorc3RhdGljIHVpbnQzMl90IFNDX2FsbG9jR2V0RGltRmFjZXMoUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7Ci0KKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgcmV0dXJuIGEtPmdldFR5cGUoKS0+Z2V0RGltRmFjZXMoKTsKIH0KIAotc3RhdGljIHZvaWQgU0NfQ2xlYXJDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQorc3RhdGljIGNvbnN0IHZvaWQgKiBTQ19nZXRFbGVtZW50QXRYKFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgeCkKIHsKLSAgICAvL0xPR0UoImMgJWYgJWYgJWYgJWYiLCByLCBnLCBiLCBhKTsKLSAgICBHRVRfVExTKCk7Ci0gICAgc2MtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzBdID0gcjsKLSAgICBzYy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMV0gPSBnOwotICAgIHNjLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsyXSA9IGI7Ci0gICAgc2MtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzNdID0gYTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgY29uc3QgVHlwZSAqdCA9IGEtPmdldFR5cGUoKTsKKyAgICBjb25zdCB1aW50OF90ICpwID0gKGNvbnN0IHVpbnQ4X3QgKilhLT5nZXRQdHIoKTsKKyAgICByZXR1cm4gJnBbdC0+Z2V0RWxlbWVudFNpemVCeXRlcygpICogeF07CiB9CiAKLXN0YXRpYyB2b2lkIFNDX2RlYnVnRihjb25zdCBjaGFyICpzLCBmbG9hdCBmKQorc3RhdGljIGNvbnN0IHZvaWQgKiBTQ19nZXRFbGVtZW50QXRYWShSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpCiB7Ci0gICAgTE9HRSgiJXMgJWYiLCBzLCBmKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgY29uc3QgVHlwZSAqdCA9IGEtPmdldFR5cGUoKTsKKyAgICBjb25zdCB1aW50OF90ICpwID0gKGNvbnN0IHVpbnQ4X3QgKilhLT5nZXRQdHIoKTsKKyAgICByZXR1cm4gJnBbdC0+Z2V0RWxlbWVudFNpemVCeXRlcygpICogKHggKyB5KnQtPmdldERpbVgoKSldOwogfQogCi1zdGF0aWMgdm9pZCBTQ19kZWJ1Z0hleEYoY29uc3QgY2hhciAqcywgZmxvYXQgZikKK3N0YXRpYyBjb25zdCB2b2lkICogU0NfZ2V0RWxlbWVudEF0WFlaKFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikKIHsKLSAgICBMT0dFKCIlcyAweCV4IiwgcywgKigoaW50ICopICgmZikpKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgY29uc3QgVHlwZSAqdCA9IGEtPmdldFR5cGUoKTsKKyAgICBjb25zdCB1aW50OF90ICpwID0gKGNvbnN0IHVpbnQ4X3QgKilhLT5nZXRQdHIoKTsKKyAgICByZXR1cm4gJnBbdC0+Z2V0RWxlbWVudFNpemVCeXRlcygpICogKHggKyB5KnQtPmdldERpbVgoKSldOwogfQogCi1zdGF0aWMgdm9pZCBTQ19kZWJ1Z0kzMihjb25zdCBjaGFyICpzLCBpbnQzMl90IGkpCi17Ci0gICAgTE9HRSgiJXMgJWkiLCBzLCBpKTsKK3N0YXRpYyB2b2lkIFNDX3NldE9iamVjdCh2b2lkICoqdmRzdCwgdm9pZCAqIHZzcmMpIHsKKyAgICBzdGF0aWNfY2FzdDxPYmplY3RCYXNlICo+KHZzcmMpLT5pbmNTeXNSZWYoKTsKKyAgICBzdGF0aWNfY2FzdDxPYmplY3RCYXNlICo+KHZkc3RbMF0pLT5kZWNTeXNSZWYoKTsKKyAgICAqdmRzdCA9IHZzcmM7Cit9CitzdGF0aWMgdm9pZCBTQ19jbGVhck9iamVjdCh2b2lkICoqdmRzdCkgeworICAgIHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKj4odmRzdFswXSktPmRlY1N5c1JlZigpOworICAgICp2ZHN0ID0gTlVMTDsKK30KK3N0YXRpYyBib29sIFNDX2lzT2JqZWN0KFJzQWxsb2NhdGlvbiB2c3JjKSB7CisgICAgcmV0dXJuIHZzcmMgIT0gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgU0NfZGVidWdIZXhJMzIoY29uc3QgY2hhciAqcywgaW50MzJfdCBpKQotewotICAgIExPR0UoIiVzIDB4JXgiLCBzLCBpKTsKKworCitzdGF0aWMgdm9pZCBTQ19kZWJ1Z0YoY29uc3QgY2hhciAqcywgZmxvYXQgZikgeworICAgIExPR0UoIiVzICVmLCAweCUwOHgiLCBzLCBmLCAqKChpbnQgKikgKCZmKSkpOworfQorc3RhdGljIHZvaWQgU0NfZGVidWdGdjIoY29uc3QgY2hhciAqcywgZmxvYXQgZjEsIGZsb2F0IGYyKSB7CisgICAgTE9HRSgiJXMgeyVmLCAlZn0iLCBzLCBmMSwgZjIpOworfQorc3RhdGljIHZvaWQgU0NfZGVidWdGdjMoY29uc3QgY2hhciAqcywgZmxvYXQgZjEsIGZsb2F0IGYyLCBmbG9hdCBmMykgeworICAgIExPR0UoIiVzIHslZiwgJWYsICVmfSIsIHMsIGYxLCBmMiwgZjMpOworfQorc3RhdGljIHZvaWQgU0NfZGVidWdGdjQoY29uc3QgY2hhciAqcywgZmxvYXQgZjEsIGZsb2F0IGYyLCBmbG9hdCBmMywgZmxvYXQgZjQpIHsKKyAgICBMT0dFKCIlcyB7JWYsICVmLCAlZiwgJWZ9IiwgcywgZjEsIGYyLCBmMywgZjQpOworfQorc3RhdGljIHZvaWQgU0NfZGVidWdGTTR2NChjb25zdCBjaGFyICpzLCBjb25zdCBmbG9hdCAqZikgeworICAgIExPR0UoIiVzIHslZiwgJWYsICVmLCAlZiIsIHMsIGZbMF0sIGZbNF0sIGZbOF0sIGZbMTJdKTsKKyAgICBMT0dFKCIlcyAgJWYsICVmLCAlZiwgJWYiLCBzLCBmWzFdLCBmWzVdLCBmWzldLCBmWzEzXSk7CisgICAgTE9HRSgiJXMgICVmLCAlZiwgJWYsICVmIiwgcywgZlsyXSwgZls2XSwgZlsxMF0sIGZbMTRdKTsKKyAgICBMT0dFKCIlcyAgJWYsICVmLCAlZiwgJWZ9IiwgcywgZlszXSwgZls3XSwgZlsxMV0sIGZbMTVdKTsKK30KK3N0YXRpYyB2b2lkIFNDX2RlYnVnRk0zdjMoY29uc3QgY2hhciAqcywgY29uc3QgZmxvYXQgKmYpIHsKKyAgICBMT0dFKCIlcyB7JWYsICVmLCAlZiIsIHMsIGZbMF0sIGZbM10sIGZbNl0pOworICAgIExPR0UoIiVzICAlZiwgJWYsICVmIiwgcywgZlsxXSwgZls0XSwgZls3XSk7CisgICAgTE9HRSgiJXMgICVmLCAlZiwgJWZ9IixzLCBmWzJdLCBmWzVdLCBmWzhdKTsKK30KK3N0YXRpYyB2b2lkIFNDX2RlYnVnRk0ydjIoY29uc3QgY2hhciAqcywgY29uc3QgZmxvYXQgKmYpIHsKKyAgICBMT0dFKCIlcyB7JWYsICVmIiwgcywgZlswXSwgZlsyXSk7CisgICAgTE9HRSgiJXMgICVmLCAlZn0iLHMsIGZbMV0sIGZbM10pOwogfQogCi1zdGF0aWMgdWludDMyX3QgU0NfZ2V0V2lkdGgoKQorc3RhdGljIHZvaWQgU0NfZGVidWdJMzIoY29uc3QgY2hhciAqcywgaW50MzJfdCBpKSB7CisgICAgTE9HRSgiJXMgJWkgIDB4JXgiLCBzLCBpLCBpKTsKK30KK3N0YXRpYyB2b2lkIFNDX2RlYnVnVTMyKGNvbnN0IGNoYXIgKnMsIHVpbnQzMl90IGkpIHsKKyAgICBMT0dFKCIlcyAlaSAgMHgleCIsIHMsIGksIGkpOworfQorCitzdGF0aWMgdm9pZCBTQ19kZWJ1Z1AoY29uc3QgY2hhciAqcywgY29uc3Qgdm9pZCAqcCkgeworICAgIExPR0UoIiVzICVwIiwgcywgcCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBTQ190b0NsaWVudDIoaW50IGNtZElELCB2b2lkICpkYXRhLCBpbnQgbGVuKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByZXR1cm4gcnNjLT5nZXRXaWR0aCgpOworICAgIC8vTE9HRSgiU0NfdG9DbGllbnQgJWkgJWkgJWkiLCBjbWRJRCwgbGVuKTsKKyAgICByZXR1cm4gcnNjLT5zZW5kTWVzc2FnZVRvQ2xpZW50KGRhdGEsIGNtZElELCBsZW4sIGZhbHNlKTsKIH0KIAotc3RhdGljIHVpbnQzMl90IFNDX2dldEhlaWdodCgpCitzdGF0aWMgdWludDMyX3QgU0NfdG9DbGllbnQoaW50IGNtZElEKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByZXR1cm4gcnNjLT5nZXRIZWlnaHQoKTsKKyAgICAvL0xPR0UoIlNDX3RvQ2xpZW50ICVpIiwgY21kSUQpOworICAgIHJldHVybiByc2MtPnNlbmRNZXNzYWdlVG9DbGllbnQoTlVMTCwgY21kSUQsIDAsIGZhbHNlKTsKIH0KIAotc3RhdGljIHVpbnQzMl90IFNDX2NvbG9yRmxvYXRSR0JBdG9VTm9ybTgoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICB1aW50MzJfdCBjID0gMDsKLSAgICBjIHw9ICh1aW50MzJfdCkociAqIDI1NS5mICsgMC41Zik7Ci0gICAgYyB8PSAoKHVpbnQzMl90KShnICogMjU1LmYgKyAwLjVmKSkgPDwgODsKLSAgICBjIHw9ICgodWludDMyX3QpKGIgKiAyNTUuZiArIDAuNWYpKSA8PCAxNjsKLSAgICBjIHw9ICgodWludDMyX3QpKGEgKiAyNTUuZiArIDAuNWYpKSA8PCAyNDsKLSAgICByZXR1cm4gYzsKLX0KLQotc3RhdGljIHVpbnQzMl90IFNDX2NvbG9yRmxvYXRSR0JBdG81NjUoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYikKLXsKLSAgICB1aW50MzJfdCBpciA9ICh1aW50MzJfdCkociAqIDI1NS5mICsgMC41Zik7Ci0gICAgdWludDMyX3QgaWcgPSAodWludDMyX3QpKGcgKiAyNTUuZiArIDAuNWYpOwotICAgIHVpbnQzMl90IGliID0gKHVpbnQzMl90KShiICogMjU1LmYgKyAwLjVmKTsKLSAgICByZXR1cm4gcnM4ODh0bzU2NShpciwgaWcsIGliKTsKLX0KLQotc3RhdGljIHVpbnQzMl90IFNDX3RvQ2xpZW50KHZvaWQgKmRhdGEsIGludCBjbWRJRCwgaW50IGxlbiwgaW50IHdhaXRGb3JTcGFjZSkKK3N0YXRpYyB1aW50MzJfdCBTQ190b0NsaWVudEJsb2NraW5nMihpbnQgY21kSUQsIHZvaWQgKmRhdGEsIGludCBsZW4pCiB7CiAgICAgR0VUX1RMUygpOwotICAgIHJldHVybiByc2MtPnNlbmRNZXNzYWdlVG9DbGllbnQoZGF0YSwgY21kSUQsIGxlbiwgd2FpdEZvclNwYWNlICE9IDApOworICAgIC8vTE9HRSgiU0NfdG9DbGllbnRCbG9ja2luZyAlaSAlaSIsIGNtZElELCBsZW4pOworICAgIHJldHVybiByc2MtPnNlbmRNZXNzYWdlVG9DbGllbnQoZGF0YSwgY21kSUQsIGxlbiwgdHJ1ZSk7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX3NjcmlwdENhbGwoaW50IHNjcmlwdElEKQorc3RhdGljIHVpbnQzMl90IFNDX3RvQ2xpZW50QmxvY2tpbmcoaW50IGNtZElEKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByc2MtPnJ1blNjcmlwdCgoU2NyaXB0ICopc2NyaXB0SUQsIDApOworICAgIC8vTE9HRSgiU0NfdG9DbGllbnRCbG9ja2luZyAlaSIsIGNtZElEKTsKKyAgICByZXR1cm4gcnNjLT5zZW5kTWVzc2FnZVRvQ2xpZW50KE5VTEwsIGNtZElELCAwLCB0cnVlKTsKIH0KIAoraW50IFNDX2RpdnNpMyhpbnQgYSwgaW50IGIpCit7CisgICAgcmV0dXJuIGEgLyBiOworfQorCitpbnQgU0NfZ2V0QWxsb2NhdGlvbihjb25zdCB2b2lkICpwdHIpCit7CisgICAgR0VUX1RMUygpOworICAgIGNvbnN0IEFsbG9jYXRpb24gKmFsbG9jID0gc2MtPnB0clRvQWxsb2NhdGlvbihwdHIpOworICAgIHJldHVybiAoaW50KWFsbG9jOworfQorCisKK3ZvaWQgU0NfRm9yRWFjaChSc1NjcmlwdCB2cywKKyAgICAgICAgICAgICAgICBSc0FsbG9jYXRpb24gdmluLAorICAgICAgICAgICAgICAgIFJzQWxsb2NhdGlvbiB2b3V0LAorICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnVzcikKK3sKKyAgICBHRVRfVExTKCk7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYWluID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2aW4pOworICAgIEFsbG9jYXRpb24gKmFvdXQgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZvdXQpOworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+cnVuRm9yRWFjaChyc2MsIGFpbiwgYW91dCwgdXNyKTsKK30KKwordm9pZCBTQ19Gb3JFYWNoMihSc1NjcmlwdCB2cywKKyAgICAgICAgICAgICAgICBSc0FsbG9jYXRpb24gdmluLAorICAgICAgICAgICAgICAgIFJzQWxsb2NhdGlvbiB2b3V0LAorICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnVzciwKKyAgICAgICAgICAgICAgICBjb25zdCBSc1NjcmlwdENhbGwgKmNhbGwpCit7CisgICAgR0VUX1RMUygpOworICAgIGNvbnN0IEFsbG9jYXRpb24gKmFpbiA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmluKTsKKyAgICBBbGxvY2F0aW9uICphb3V0ID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2b3V0KTsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPnJ1bkZvckVhY2gocnNjLCBhaW4sIGFvdXQsIHVzciwgY2FsbCk7Cit9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gQ2xhc3MgaW1wbGVtZW50YXRpb24KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1TY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgU2NyaXB0Q1N0YXRlOjpnU3ltc1tdID0gewotICAgIC8vIElPCi0gICAgeyAibG9hZEkzMiIsICh2b2lkICopJlNDX2xvYWRJMzIsCi0gICAgICAgICJpbnQiLCAiKGludCwgaW50KSIgfSwKLSAgICAvL3sgImxvYWRVMzIiLCAodm9pZCAqKSZTQ19sb2FkVTMyLCAidW5zaWduZWQgaW50IiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAibG9hZEYiLCAodm9pZCAqKSZTQ19sb2FkRiwKLSAgICAgICAgImZsb2F0IiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAibG9hZEFycmF5RiIsICh2b2lkICopJlNDX2xvYWRBcnJheUYsCi0gICAgICAgICJmbG9hdCoiLCAiKGludCwgaW50KSIgfSwKLSAgICB7ICJsb2FkQXJyYXlJMzIiLCAodm9pZCAqKSZTQ19sb2FkQXJyYXlJMzIsCi0gICAgICAgICJpbnQqIiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAibG9hZFZlYzQiLCAodm9pZCAqKSZTQ19sb2FkVmVjNCwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBmbG9hdCAqKSIgfSwKLSAgICB7ICJsb2FkTWF0cml4IiwgKHZvaWQgKikmU0NfbG9hZE1hdHJpeCwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBmbG9hdCAqKSIgfSwKLSAgICB7ICJzdG9yZUkzMiIsICh2b2lkICopJlNDX3N0b3JlSTMyLAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGludCkiIH0sCi0gICAgLy97ICJzdG9yZVUzMiIsICh2b2lkICopJlNDX3N0b3JlVTMyLCAidm9pZCIsICIoaW50LCBpbnQsIHVuc2lnbmVkIGludCkiIH0sCi0gICAgeyAic3RvcmVGIiwgKHZvaWQgKikmU0Nfc3RvcmVGLAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGZsb2F0KSIgfSwKLSAgICB7ICJzdG9yZVZlYzQiLCAodm9pZCAqKSZTQ19zdG9yZVZlYzQsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgZmxvYXQgKikiIH0sCi0gICAgeyAic3RvcmVNYXRyaXgiLCAodm9pZCAqKSZTQ19zdG9yZU1hdHJpeCwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBmbG9hdCAqKSIgfSwKLSAgICB7ICJsb2FkU2ltcGxlTWVzaFZlcnRpY2VzRiIsICh2b2lkICopJlNDX2xvYWRTaW1wbGVNZXNoVmVydGljZXNGLAotICAgICAgICAiZmxvYXQqIiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAidXBkYXRlU2ltcGxlTWVzaCIsICh2b2lkICopJlNDX3VwZGF0ZVNpbXBsZU1lc2gsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAorLy8gbGx2bSBuYW1lIG1hbmdsaW5nIHJlZgorLy8gIDxidWlsdGluLXR5cGU+IDo6PSB2ICAjIHZvaWQKKy8vICAgICAgICAgICAgICAgICA6Oj0gYiAgIyBib29sCisvLyAgICAgICAgICAgICAgICAgOjo9IGMgICMgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBhICAjIHNpZ25lZCBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IGggICMgdW5zaWduZWQgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBzICAjIHNob3J0CisvLyAgICAgICAgICAgICAgICAgOjo9IHQgICMgdW5zaWduZWQgc2hvcnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaSAgIyBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaiAgIyB1bnNpZ25lZCBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gbCAgIyBsb25nCisvLyAgICAgICAgICAgICAgICAgOjo9IG0gICMgdW5zaWduZWQgbG9uZworLy8gICAgICAgICAgICAgICAgIDo6PSB4ICAjIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSB5ICAjIHVuc2lnbmVkIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSBmICAjIGZsb2F0CisvLyAgICAgICAgICAgICAgICAgOjo9IGQgICMgZG91YmxlCiAKLSAgICAvLyBtYXRoCi0gICAgeyAibW9kZiIsICh2b2lkICopJmZtb2QsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJhYnMiLCAodm9pZCAqKSZhYnMsCi0gICAgICAgICJpbnQiLCAiKGludCkiIH0sCi0gICAgeyAiYWJzZiIsICh2b2lkICopJmZhYnNmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJzaW5mX2Zhc3QiLCAodm9pZCAqKSZTQ19zaW5mX2Zhc3QsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImNvc2ZfZmFzdCIsICh2b2lkICopJlNDX2Nvc2ZfZmFzdCwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAic2luZiIsICh2b2lkICopJnNpbmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImNvc2YiLCAodm9pZCAqKSZjb3NmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJhc2luZiIsICh2b2lkICopJmFzaW5mLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJhY29zZiIsICh2b2lkICopJmFjb3NmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJhdGFuZiIsICh2b2lkICopJmF0YW5mLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJhdGFuMmYiLCAodm9pZCAqKSZhdGFuMmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJmYWJzZiIsICh2b2lkICopJmZhYnNmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJyYW5kZiIsICh2b2lkICopJlNDX3JhbmRmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJyYW5kZjIiLCAodm9pZCAqKSZTQ19yYW5kZjIsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJmbG9vcmYiLCAodm9pZCAqKSZmbG9vcmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImZyYWNmIiwgKHZvaWQgKikmU0NfZnJhY2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImNlaWxmIiwgKHZvaWQgKikmY2VpbGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInJvdW5kZiIsICh2b2lkICopJlNDX3JvdW5kZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiZXhwZiIsICh2b2lkICopJmV4cGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImxvZ2YiLCAodm9pZCAqKSZsb2dmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJwb3dmIiwgKHZvaWQgKikmcG93ZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm1heGYiLCAodm9pZCAqKSZTQ19tYXhmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibWluZiIsICh2b2lkICopJlNDX21pbmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJzcXJ0IiwgKHZvaWQgKikmc3FydCwKLSAgICAgICAgImludCIsICIoaW50KSIgfSwKLSAgICB7ICJzcXJ0ZiIsICh2b2lkICopJnNxcnRmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJzcXIiLCAodm9pZCAqKSZTQ19zcXIsCi0gICAgICAgICJpbnQiLCAiKGludCkiIH0sCi0gICAgeyAic3FyZiIsICh2b2lkICopJlNDX3NxcmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInNpZ24iLCAodm9pZCAqKSZTQ19zaWduLAotICAgICAgICAiaW50IiwgIihpbnQpIiB9LAotICAgIHsgInNpZ25mIiwgKHZvaWQgKikmU0Nfc2lnbmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImNsYW1wIiwgKHZvaWQgKikmU0NfY2xhbXAsCi0gICAgICAgICJpbnQiLCAiKGludCwgaW50LCBpbnQpIiB9LAotICAgIHsgImNsYW1wZiIsICh2b2lkICopJlNDX2NsYW1wZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJkaXN0ZjIiLCAodm9pZCAqKSZTQ19kaXN0ZjIsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImRpc3RmMyIsICh2b2lkICopJlNDX2Rpc3RmMywKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJtYWdmMiIsICh2b2lkICopJlNDX21hZ2YyLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibWFnZjMiLCAodm9pZCAqKSZTQ19tYWdmMywKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJyYWRmIiwgKHZvaWQgKikmU0NfcmFkZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiZGVnZiIsICh2b2lkICopJlNDX2RlZ2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImxlcnBmIiwgKHZvaWQgKikmU0NfbGVycGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibm9ybWYiLCAodm9pZCAqKSZTQ19ub3JtZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJtYXBmIiwgKHZvaWQgKikmU0NfbWFwZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm5vaXNlZiIsICh2b2lkICopJlNDX25vaXNlZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAibm9pc2VmMiIsICh2b2lkICopJlNDX25vaXNlZjIsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJub2lzZWYzIiwgKHZvaWQgKikmU0Nfbm9pc2VmMywKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJ0dXJidWxlbmNlZjIiLCAodm9pZCAqKSZTQ190dXJidWxlbmNlZjIsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAidHVyYnVsZW5jZWYzIiwgKHZvaWQgKikmU0NfdHVyYnVsZW5jZWYzLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKK3N0YXRpYyBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgZ1N5bXNbXSA9IHsKKyAgICB7ICJfX2RpdnNpMyIsICh2b2lkICopJlNDX2RpdnNpMyB9LAorCisgICAgLy8gYWxsb2NhdGlvbgorICAgIHsgIl9aMTlyc0FsbG9jYXRpb25HZXREaW1YMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfYWxsb2NHZXREaW1YIH0sCisgICAgeyAiX1oxOXJzQWxsb2NhdGlvbkdldERpbVkxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19hbGxvY0dldERpbVkgfSwKKyAgICB7ICJfWjE5cnNBbGxvY2F0aW9uR2V0RGltWjEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2FsbG9jR2V0RGltWiB9LAorICAgIHsgIl9aMjFyc0FsbG9jYXRpb25HZXREaW1MT0QxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19hbGxvY0dldERpbUxPRCB9LAorICAgIHsgIl9aMjNyc0FsbG9jYXRpb25HZXREaW1GYWNlczEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2FsbG9jR2V0RGltRmFjZXMgfSwKKyAgICB7ICJfWjE1cnNHZXRBbGxvY2F0aW9uUEt2IiwgKHZvaWQgKikmU0NfZ2V0QWxsb2NhdGlvbiB9LAorCisgICAgeyAiX1oxNHJzR2V0RWxlbWVudEF0MTNyc19hbGxvY2F0aW9uaiIsICh2b2lkICopJlNDX2dldEVsZW1lbnRBdFggfSwKKyAgICB7ICJfWjE0cnNHZXRFbGVtZW50QXQxM3JzX2FsbG9jYXRpb25qaiIsICh2b2lkICopJlNDX2dldEVsZW1lbnRBdFhZIH0sCisgICAgeyAiX1oxNHJzR2V0RWxlbWVudEF0MTNyc19hbGxvY2F0aW9uampqIiwgKHZvaWQgKikmU0NfZ2V0RWxlbWVudEF0WFlaIH0sCisKKyAgICB7ICJfWjExcnNTZXRPYmplY3RQMTNyc19hbGxvY2F0aW9uMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0Nfc2V0T2JqZWN0IH0sCisgICAgeyAiX1oxM3JzQ2xlYXJPYmplY3RQMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfY2xlYXJPYmplY3QgfSwKKyAgICB7ICJfWjEwcnNJc09iamVjdDEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2lzT2JqZWN0IH0sCisKKworICAgIC8vIERlYnVnCisgICAgeyAiX1o3cnNEZWJ1Z1BLY2YiLCAodm9pZCAqKSZTQ19kZWJ1Z0YgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjZmYiLCAodm9pZCAqKSZTQ19kZWJ1Z0Z2MiB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NmZmYiLCAodm9pZCAqKSZTQ19kZWJ1Z0Z2MyB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NmZmZmIiwgKHZvaWQgKikmU0NfZGVidWdGdjQgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjUEsxMnJzX21hdHJpeDR4NCIsICh2b2lkICopJlNDX2RlYnVnRk00djQgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjUEsxMnJzX21hdHJpeDN4MyIsICh2b2lkICopJlNDX2RlYnVnRk0zdjMgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjUEsxMnJzX21hdHJpeDJ4MiIsICh2b2lkICopJlNDX2RlYnVnRk0ydjIgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjaSIsICh2b2lkICopJlNDX2RlYnVnSTMyIH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY2oiLCAodm9pZCAqKSZTQ19kZWJ1Z1UzMiB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NQS3YiLCAodm9pZCAqKSZTQ19kZWJ1Z1AgfSwKKworICAgIC8vIFJTIE1hdGgKKyAgICB7ICJfWjZyc1JhbmRpIiwgKHZvaWQgKikmU0NfcmFuZGkgfSwKKyAgICB7ICJfWjZyc1JhbmRpaSIsICh2b2lkICopJlNDX3JhbmRpMiB9LAorICAgIHsgIl9aNnJzUmFuZGYiLCAodm9pZCAqKSZTQ19yYW5kZiB9LAorICAgIHsgIl9aNnJzUmFuZGZmIiwgKHZvaWQgKikmU0NfcmFuZGYyIH0sCisgICAgeyAiX1o2cnNGcmFjZiIsICh2b2lkICopJlNDX2ZyYWMgfSwKIAogICAgIC8vIHRpbWUKLSAgICB7ICJzZWNvbmQiLCAodm9pZCAqKSZTQ19zZWNvbmQsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0gICAgeyAibWludXRlIiwgKHZvaWQgKikmU0NfbWludXRlLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgImhvdXIiLCAodm9pZCAqKSZTQ19ob3VyLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgImRheSIsICh2b2lkICopJlNDX2RheSwKLSAgICAgICAgImludCIsICIoKSIgfSwKLSAgICB7ICJtb250aCIsICh2b2lkICopJlNDX21vbnRoLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgInllYXIiLCAodm9pZCAqKSZTQ195ZWFyLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgInVwdGltZU1pbGxpcyIsICh2b2lkKikmU0NfdXB0aW1lTWlsbGlzLAotICAgICAgICAiaW50IiwgIigpIiB9LCAgICAgIC8vIFRPRE86IHVzZSBsb25nIGluc3RlYWQKLSAgICB7ICJzdGFydFRpbWVNaWxsaXMiLCAodm9pZCopJlNDX3N0YXJ0VGltZU1pbGxpcywKLSAgICAgICAgImludCIsICIoKSIgfSwgICAgICAvLyBUT0RPOiB1c2UgbG9uZyBpbnN0ZWFkCi0gICAgeyAiZWxhcHNlZFRpbWVNaWxsaXMiLCAodm9pZCopJlNDX2VsYXBzZWRUaW1lTWlsbGlzLAotICAgICAgICAiaW50IiwgIigpIiB9LCAgICAgIC8vIFRPRE86IHVzZSBsb25nIGluc3RlYWQKKyAgICB7ICJfWjhyc1NlY29uZHYiLCAodm9pZCAqKSZTQ19zZWNvbmQgfSwKKyAgICB7ICJfWjhyc01pbnV0ZXYiLCAodm9pZCAqKSZTQ19taW51dGUgfSwKKyAgICB7ICJfWjZyc0hvdXJ2IiwgKHZvaWQgKikmU0NfaG91ciB9LAorICAgIHsgIl9aNXJzRGF5diIsICh2b2lkICopJlNDX2RheSB9LAorICAgIHsgIl9aN3JzTW9udGh2IiwgKHZvaWQgKikmU0NfbW9udGggfSwKKyAgICB7ICJfWjZyc1llYXJ2IiwgKHZvaWQgKikmU0NfeWVhciB9LAorICAgIHsgIl9aMTRyc1VwdGltZU1pbGxpc3YiLCAodm9pZCopJlNDX3VwdGltZU1pbGxpcyB9LAorICAgIHsgIl9aMTNyc1VwdGltZU5hbm9zdiIsICh2b2lkKikmU0NfdXB0aW1lTmFub3MgfSwKKyAgICB7ICJfWjdyc0dldER0diIsICh2b2lkKikmU0NfZ2V0RHQgfSwKIAotICAgIC8vIG1hdHJpeAotICAgIHsgIm1hdHJpeExvYWRJZGVudGl0eSIsICh2b2lkICopJlNDX21hdHJpeExvYWRJZGVudGl0eSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQpIiB9LAotICAgIHsgIm1hdHJpeExvYWRGbG9hdCIsICh2b2lkICopJlNDX21hdHJpeExvYWRGbG9hdCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0ICpmKSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkTWF0IiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZE1hdCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0ICpuZXdtYXQpIiB9LAotICAgIHsgIm1hdHJpeExvYWRSb3RhdGUiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkUm90YXRlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkU2NhbGUiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkU2NhbGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkVHJhbnNsYXRlIiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZFRyYW5zbGF0ZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIiB9LAotICAgIHsgIm1hdHJpeExvYWRNdWx0aXBseSIsICh2b2lkICopJlNDX21hdHJpeExvYWRNdWx0aXBseSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0ICpsaHMsIGZsb2F0ICpyaHMpIiB9LAotICAgIHsgIm1hdHJpeE11bHRpcGx5IiwgKHZvaWQgKikmU0NfbWF0cml4TXVsdGlwbHksCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCAqcmhzKSIgfSwKLSAgICB7ICJtYXRyaXhSb3RhdGUiLCAodm9pZCAqKSZTQ19tYXRyaXhSb3RhdGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIiB9LAotICAgIHsgIm1hdHJpeFNjYWxlIiwgKHZvaWQgKikmU0NfbWF0cml4U2NhbGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKLSAgICB7ICJtYXRyaXhUcmFuc2xhdGUiLCAodm9pZCAqKSZTQ19tYXRyaXhUcmFuc2xhdGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKKyAgICB7ICJfWjE0cnNTZW5kVG9DbGllbnRpIiwgKHZvaWQgKikmU0NfdG9DbGllbnQgfSwKKyAgICB7ICJfWjE0cnNTZW5kVG9DbGllbnRpUEt2aiIsICh2b2lkICopJlNDX3RvQ2xpZW50MiB9LAorICAgIHsgIl9aMjJyc1NlbmRUb0NsaWVudEJsb2NraW5naSIsICh2b2lkICopJlNDX3RvQ2xpZW50QmxvY2tpbmcgfSwKKyAgICB7ICJfWjIycnNTZW5kVG9DbGllbnRCbG9ja2luZ2lQS3ZqIiwgKHZvaWQgKikmU0NfdG9DbGllbnRCbG9ja2luZzIgfSwKIAotICAgIC8vIHZlY3RvcgotICAgIHsgInZlYzJSYW5kIiwgKHZvaWQgKikmU0NfdmVjMlJhbmQsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqdmVjLCBmbG9hdCBtYXhMZW4pIiB9LAorICAgIHsgIl9aOXJzRm9yRWFjaDlyc19zY3JpcHQxM3JzX2FsbG9jYXRpb25TMF9QS3YiLCAodm9pZCAqKSZTQ19Gb3JFYWNoIH0sCisgICAgLy97ICJfWjlyc0ZvckVhY2g5cnNfc2NyaXB0MTNyc19hbGxvY2F0aW9uUzBfUEt2IiwgKHZvaWQgKikmU0NfRm9yRWFjaDIgfSwKIAotICAgIC8vIHZlYzMKLSAgICB7ICJ2ZWMzTm9ybSIsICh2b2lkICopJlNDX3ZlYzNOb3JtLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKikiIH0sCi0gICAgeyAidmVjM0xlbmd0aCIsICh2b2lkICopJlNDX3ZlYzNMZW5ndGgsCi0gICAgICAgICJmbG9hdCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKikiIH0sCi0gICAgeyAidmVjM0FkZCIsICh2b2lkICopJlNDX3ZlYzNBZGQsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqZGVzdCwgc3RydWN0IHZlY0YzMl8zX3MgKmxocywgc3RydWN0IHZlY0YzMl8zX3MgKnJocykiIH0sCi0gICAgeyAidmVjM1N1YiIsICh2b2lkICopJlNDX3ZlYzNTdWIsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqZGVzdCwgc3RydWN0IHZlY0YzMl8zX3MgKmxocywgc3RydWN0IHZlY0YzMl8zX3MgKnJocykiIH0sCi0gICAgeyAidmVjM0Nyb3NzIiwgKHZvaWQgKikmU0NfdmVjM0Nyb3NzLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKmRlc3QsIHN0cnVjdCB2ZWNGMzJfM19zICpsaHMsIHN0cnVjdCB2ZWNGMzJfM19zICpyaHMpIiB9LAotICAgIHsgInZlYzNEb3QiLCAodm9pZCAqKSZTQ192ZWMzRG90LAotICAgICAgICAiZmxvYXQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICpsaHMsIHN0cnVjdCB2ZWNGMzJfM19zICpyaHMpIiB9LAotICAgIHsgInZlYzNTY2FsZSIsICh2b2lkICopJlNDX3ZlYzNTY2FsZSwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICpsaHMsIGZsb2F0IHNjYWxlKSIgfSwKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLSAgICAvLyB2ZWM0Ci0gICAgeyAidmVjNE5vcm0iLCAodm9pZCAqKSZTQ192ZWM0Tm9ybSwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfNF9zICopIiB9LAotICAgIHsgInZlYzRMZW5ndGgiLCAodm9pZCAqKSZTQ192ZWM0TGVuZ3RoLAotICAgICAgICAiZmxvYXQiLCAiKHN0cnVjdCB2ZWNGMzJfNF9zICopIiB9LAotICAgIHsgInZlYzRBZGQiLCAodm9pZCAqKSZTQ192ZWM0QWRkLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl80X3MgKmRlc3QsIHN0cnVjdCB2ZWNGMzJfNF9zICpsaHMsIHN0cnVjdCB2ZWNGMzJfNF9zICpyaHMpIiB9LAotICAgIHsgInZlYzRTdWIiLCAodm9pZCAqKSZTQ192ZWM0U3ViLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl80X3MgKmRlc3QsIHN0cnVjdCB2ZWNGMzJfNF9zICpsaHMsIHN0cnVjdCB2ZWNGMzJfNF9zICpyaHMpIiB9LAotICAgIHsgInZlYzREb3QiLCAodm9pZCAqKSZTQ192ZWM0RG90LAotICAgICAgICAiZmxvYXQiLCAiKHN0cnVjdCB2ZWNGMzJfNF9zICpsaHMsIHN0cnVjdCB2ZWNGMzJfNF9zICpyaHMpIiB9LAotICAgIHsgInZlYzRTY2FsZSIsICh2b2lkICopJlNDX3ZlYzRTY2FsZSwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfNF9zICpsaHMsIGZsb2F0IHNjYWxlKSIgfSwKKyAgICAvL3sgInNpbmZfZmFzdCIsICh2b2lkICopJlNDX3NpbmZfZmFzdCB9LAorICAgIC8veyAiY29zZl9mYXN0IiwgKHZvaWQgKikmU0NfY29zZl9mYXN0IH0sCiAKLSAgICAvLyBjb250ZXh0Ci0gICAgeyAiYmluZFByb2dyYW1GcmFnbWVudCIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtRnJhZ21lbnQsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotICAgIHsgImJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0gICAgeyAiYmluZFByb2dyYW1TdG9yZSIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0gICAgeyAiYmluZFByb2dyYW1WZXJ0ZXgiLCAodm9pZCAqKSZTQ19iaW5kUHJvZ3JhbVZlcnRleCwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0gICAgeyAiYmluZFNhbXBsZXIiLCAodm9pZCAqKSZTQ19iaW5kU2FtcGxlciwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBpbnQpIiB9LAotICAgIHsgImJpbmRUZXh0dXJlIiwgKHZvaWQgKikmU0NfYmluZFRleHR1cmUsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgaW50KSIgfSwKLQotICAgIC8vIHZwCi0gICAgeyAidnBMb2FkTW9kZWxNYXRyaXgiLCAodm9pZCAqKSZTQ192cExvYWRNb2RlbE1hdHJpeCwKLSAgICAgICAgInZvaWQiLCAiKHZvaWQgKikiIH0sCi0gICAgeyAidnBMb2FkVGV4dHVyZU1hdHJpeCIsICh2b2lkICopJlNDX3ZwTG9hZFRleHR1cmVNYXRyaXgsCi0gICAgICAgICJ2b2lkIiwgIih2b2lkICopIiB9LAotCi0KLQotICAgIC8vIGRyYXdpbmcKLSAgICB7ICJkcmF3UmVjdCIsICh2b2lkICopJlNDX2RyYXdSZWN0LAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHopIiB9LAotICAgIHsgImRyYXdRdWFkIiwgKHZvaWQgKikmU0NfZHJhd1F1YWQsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0KSIgfSwKLSAgICB7ICJkcmF3UXVhZFRleENvb3JkcyIsICh2b2lkICopJlNDX2RyYXdRdWFkVGV4Q29vcmRzLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgdTEsIGZsb2F0IHYxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLCBmbG9hdCB1MiwgZmxvYXQgdjIsIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsIGZsb2F0IHUzLCBmbG9hdCB2MywgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwgZmxvYXQgdTQsIGZsb2F0IHY0KSIgfSwKLSAgICB7ICJkcmF3U3ByaXRlIiwgKHZvaWQgKikmU0NfZHJhd1Nwcml0ZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpIiB9LAotICAgIHsgImRyYXdTcHJpdGVTY3JlZW5zcGFjZSIsICh2b2lkICopJlNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpIiB9LAotICAgIHsgImRyYXdTcHJpdGVTY3JlZW5zcGFjZUNyb3BwZWQiLCAodm9pZCAqKSZTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2VDcm9wcGVkLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCwgZmxvYXQgY3gwLCBmbG9hdCBjeTAsIGZsb2F0IGN4MSwgZmxvYXQgY3kxKSIgfSwKLSAgICB7ICJkcmF3TGluZSIsICh2b2lkICopJlNDX2RyYXdMaW5lLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MikiIH0sCi0gICAgeyAiZHJhd1BvaW50IiwgKHZvaWQgKikmU0NfZHJhd1BvaW50LAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSkiIH0sCi0gICAgeyAiZHJhd1NpbXBsZU1lc2giLCAodm9pZCAqKSZTQ19kcmF3U2ltcGxlTWVzaCwKLSAgICAgICAgInZvaWQiLCAiKGludCBpc20pIiB9LAotICAgIHsgImRyYXdTaW1wbGVNZXNoUmFuZ2UiLCAodm9pZCAqKSZTQ19kcmF3U2ltcGxlTWVzaFJhbmdlLAotICAgICAgICAidm9pZCIsICIoaW50IGlzbSwgaW50IHN0YXJ0LCBpbnQgbGVuKSIgfSwKLQotCi0gICAgLy8gbWlzYwotICAgIHsgInBmQ2xlYXJDb2xvciIsICh2b2lkICopJlNDX0NsZWFyQ29sb3IsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiY29sb3IiLCAodm9pZCAqKSZTQ19jb2xvciwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJoc2IiLCAodm9pZCAqKSZTQ19oc2IsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiaHNiVG9SZ2IiLCAodm9pZCAqKSZTQ19oc2JUb1JnYiwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KikiIH0sCi0gICAgeyAiaHNiVG9BYmdyIiwgKHZvaWQgKikmU0NfaHNiVG9BYmdyLAotICAgICAgICAiaW50IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiYW1iaWVudCIsICh2b2lkICopJlNDX2FtYmllbnQsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiZGlmZnVzZSIsICh2b2lkICopJlNDX2RpZmZ1c2UsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAic3BlY3VsYXIiLCAodm9pZCAqKSZTQ19zcGVjdWxhciwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJlbWlzc2lvbiIsICh2b2lkICopJlNDX2VtaXNzaW9uLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgInNoaW5pbmVzcyIsICh2b2lkICopJlNDX3NoaW5pbmVzcywKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJwb2ludEF0dGVudWF0aW9uIiwgKHZvaWQgKikmU0NfcG9pbnRBdHRlbnVhdGlvbiwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotCi0gICAgeyAidXBsb2FkVG9UZXh0dXJlIiwgKHZvaWQgKikmU0NfdXBsb2FkVG9UZXh0dXJlLAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQpIiB9LAotICAgIHsgInVwbG9hZFRvQnVmZmVyT2JqZWN0IiwgKHZvaWQgKikmU0NfdXBsb2FkVG9CdWZmZXJPYmplY3QsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotCi0gICAgeyAic3luY1RvR0wiLCAodm9pZCAqKSZTQ19zeW5jVG9HTCwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0KLSAgICB7ICJjb2xvckZsb2F0UkdCQXRvVU5vcm04IiwgKHZvaWQgKikmU0NfY29sb3JGbG9hdFJHQkF0b1VOb3JtOCwKLSAgICAgICAgImludCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImNvbG9yRmxvYXRSR0J0bzU2NSIsICh2b2lkICopJlNDX2NvbG9yRmxvYXRSR0JBdG81NjUsCi0gICAgICAgICJpbnQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotCi0KLSAgICB7ICJnZXRXaWR0aCIsICh2b2lkICopJlNDX2dldFdpZHRoLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgImdldEhlaWdodCIsICh2b2lkICopJlNDX2dldEhlaWdodCwKLSAgICAgICAgImludCIsICIoKSIgfSwKLQotICAgIHsgInNlbmRUb0NsaWVudCIsICh2b2lkICopJlNDX3RvQ2xpZW50LAotICAgICAgICAiaW50IiwgIih2b2lkICpkYXRhLCBpbnQgY21kSUQsIGludCBsZW4sIGludCB3YWl0Rm9yU3BhY2UpIiB9LAotCi0KLSAgICB7ICJkZWJ1Z0YiLCAodm9pZCAqKSZTQ19kZWJ1Z0YsCi0gICAgICAgICJ2b2lkIiwgIih2b2lkICosIGZsb2F0KSIgfSwKLSAgICB7ICJkZWJ1Z0kzMiIsICh2b2lkICopJlNDX2RlYnVnSTMyLAotICAgICAgICAidm9pZCIsICIodm9pZCAqLCBpbnQpIiB9LAotICAgIHsgImRlYnVnSGV4RiIsICh2b2lkICopJlNDX2RlYnVnSGV4RiwKLSAgICAgICAgInZvaWQiLCAiKHZvaWQgKiwgZmxvYXQpIiB9LAotICAgIHsgImRlYnVnSGV4STMyIiwgKHZvaWQgKikmU0NfZGVidWdIZXhJMzIsCi0gICAgICAgICJ2b2lkIiwgIih2b2lkICosIGludCkiIH0sCi0KLSAgICB7ICJzY3JpcHRDYWxsIiwgKHZvaWQgKikmU0Nfc2NyaXB0Q2FsbCwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0KLQotICAgIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9CisgICAgeyBOVUxMLCBOVUxMIH0KIH07CiAKIGNvbnN0IFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqIFNjcmlwdENTdGF0ZTo6bG9va3VwU3ltYm9sKGNvbnN0IGNoYXIgKnN5bSkKQEAgLTE0MDAsMTcgKzQ4MywzIEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgU2NyaXB0Q1N0YXRlOjphcHBlbmREZWNscyhTdHJpbmc4ICpzdHIpCi17Ci0gICAgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICpzeW1zID0gZ1N5bXM7Ci0gICAgd2hpbGUgKHN5bXMtPm1QdHIpIHsKLSAgICAgICAgc3RyLT5hcHBlbmQoc3ltcy0+bVJldCk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHN0ci0+YXBwZW5kKHN5bXMtPm1OYW1lKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoc3ltcy0+bVBhcmFtKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoIjtcbiIpOwotICAgICAgICBzeW1zKys7Ci0gICAgfQotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHRDX0xpYkNMLmNwcCBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYkNMLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZThlN2IyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1NjcmlwdENfTGliQ0wuY3BwCkBAIC0wLDAgKzEsMzE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2luY2x1ZGUgInJzU2NyaXB0Qy5oIgorCisvLyBJbXBsZW1lbnRzIHJzX2NsLnJzaAorCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworCitzdGF0aWMgZmxvYXQgU0NfYWNvc3BpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gYWNvc2YodikvIE1fUEk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19hc2lucGkoZmxvYXQgdikgeworICAgIHJldHVybiBhc2luZih2KSAvIE1fUEk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19hdGFucGkoZmxvYXQgdikgeworICAgIHJldHVybiBhdGFuZih2KSAvIE1fUEk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19hdGFuMnBpKGZsb2F0IHksIGZsb2F0IHgpIHsKKyAgICByZXR1cm4gYXRhbjJmKHksIHgpIC8gTV9QSTsKK30KKworc3RhdGljIGZsb2F0IFNDX2Nvc3BpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gY29zZih2ICogTV9QSSk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19leHAxMChmbG9hdCB2KSB7CisgICAgcmV0dXJuIHBvdygxMC5mLCB2KTsKKworfQorCitzdGF0aWMgZmxvYXQgU0NfZnJhY3QoZmxvYXQgdiwgaW50ICppcHRyKSB7CisgICAgaW50IGkgPSAoaW50KWZsb29yKHYpOworICAgIGlwdHJbMF0gPSBpOworICAgIHJldHVybiBmbWluKHYgLSBpLCAweDEuZmZmZmZlcC0xZik7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19sb2cyKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gbG9nMTAodikgLyBsb2cxMCgyLmYpOworfQorCitzdGF0aWMgZmxvYXQgU0NfcG93bihmbG9hdCB2LCBpbnQgcCkgeworICAgIHJldHVybiBwb3dmKHYsIChmbG9hdClwKTsKK30KKworc3RhdGljIGZsb2F0IFNDX3Bvd3IoZmxvYXQgdiwgZmxvYXQgcCkgeworICAgIHJldHVybiBwb3dmKHYsIHApOworfQorCitmbG9hdCBTQ19yb290bihmbG9hdCB2LCBpbnQgcikgeworICAgIHJldHVybiBwb3codiwgMS5mIC8gcik7Cit9CisKK2Zsb2F0IFNDX3JzcXJ0KGZsb2F0IHYpIHsKKyAgICByZXR1cm4gMS5mIC8gc3FydGYodik7Cit9CisKK2Zsb2F0IFNDX3NpbmNvcyhmbG9hdCB2LCBmbG9hdCAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvc2Yodik7CisgICAgcmV0dXJuIHNpbmYodik7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19zaW5waShmbG9hdCB2KSB7CisgICAgcmV0dXJuIHNpbmYodiAqIE1fUEkpOworfQorCitzdGF0aWMgZmxvYXQgU0NfdGFucGkoZmxvYXQgdikgeworICAgIHJldHVybiB0YW5mKHYgKiBNX1BJKTsKK30KKworICAgIC8veyAibG9nYiIsICh2b2lkICopJiB9LAorICAgIC8veyAibWFkIiwgKHZvaWQgKikmIH0sCisgICAgLy97ICJuYW4iLCAodm9pZCAqKSYgfSwKKyAgICAvL3sgInRnYW1tYSIsICh2b2lkICopJiB9LAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEludGVnZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKK3N0YXRpYyB1aW50MzJfdCBTQ19hYnNfaTMyKGludDMyX3Qgdikge3JldHVybiBhYnModik7fQorc3RhdGljIHVpbnQxNl90IFNDX2Fic19pMTYoaW50MTZfdCB2KSB7cmV0dXJuICh1aW50MTZfdClhYnModik7fQorc3RhdGljIHVpbnQ4X3QgU0NfYWJzX2k4KGludDhfdCB2KSB7cmV0dXJuICh1aW50OF90KWFicyh2KTt9CisKK3N0YXRpYyB1aW50MzJfdCBTQ19jbHpfdTMyKHVpbnQzMl90IHYpIHtyZXR1cm4gX19idWlsdGluX2Nseih2KTt9CitzdGF0aWMgdWludDE2X3QgU0NfY2x6X3UxNih1aW50MTZfdCB2KSB7cmV0dXJuICh1aW50MTZfdClfX2J1aWx0aW5fY2x6KHYpO30KK3N0YXRpYyB1aW50OF90IFNDX2Nsel91OCh1aW50OF90IHYpIHtyZXR1cm4gKHVpbnQ4X3QpX19idWlsdGluX2Nseih2KTt9CitzdGF0aWMgaW50MzJfdCBTQ19jbHpfaTMyKGludDMyX3Qgdikge3JldHVybiAoaW50MzJfdClfX2J1aWx0aW5fY2x6KCh1aW50MzJfdCl2KTt9CitzdGF0aWMgaW50MTZfdCBTQ19jbHpfaTE2KGludDE2X3Qgdikge3JldHVybiAoaW50MTZfdClfX2J1aWx0aW5fY2x6KHYpO30KK3N0YXRpYyBpbnQ4X3QgU0NfY2x6X2k4KGludDhfdCB2KSB7cmV0dXJuIChpbnQ4X3QpX19idWlsdGluX2Nseih2KTt9CisKK3N0YXRpYyB1aW50MzJfdCBTQ19tYXhfdTMyKHVpbnQzMl90IHYsIHVpbnQzMl90IHYyKSB7cmV0dXJuIHJzTWF4KHYsIHYyKTt9CitzdGF0aWMgdWludDE2X3QgU0NfbWF4X3UxNih1aW50MTZfdCB2LCB1aW50MTZfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorc3RhdGljIHVpbnQ4X3QgU0NfbWF4X3U4KHVpbnQ4X3QgdiwgdWludDhfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorc3RhdGljIGludDMyX3QgU0NfbWF4X2kzMihpbnQzMl90IHYsIGludDMyX3QgdjIpIHtyZXR1cm4gcnNNYXgodiwgdjIpO30KK3N0YXRpYyBpbnQxNl90IFNDX21heF9pMTYoaW50MTZfdCB2LCBpbnQxNl90IHYyKSB7cmV0dXJuIHJzTWF4KHYsIHYyKTt9CitzdGF0aWMgaW50OF90IFNDX21heF9pOChpbnQ4X3QgdiwgaW50OF90IHYyKSB7cmV0dXJuIHJzTWF4KHYsIHYyKTt9CisKK3N0YXRpYyB1aW50MzJfdCBTQ19taW5fdTMyKHVpbnQzMl90IHYsIHVpbnQzMl90IHYyKSB7cmV0dXJuIHJzTWluKHYsIHYyKTt9CitzdGF0aWMgdWludDE2X3QgU0NfbWluX3UxNih1aW50MTZfdCB2LCB1aW50MTZfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorc3RhdGljIHVpbnQ4X3QgU0NfbWluX3U4KHVpbnQ4X3QgdiwgdWludDhfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorc3RhdGljIGludDMyX3QgU0NfbWluX2kzMihpbnQzMl90IHYsIGludDMyX3QgdjIpIHtyZXR1cm4gcnNNaW4odiwgdjIpO30KK3N0YXRpYyBpbnQxNl90IFNDX21pbl9pMTYoaW50MTZfdCB2LCBpbnQxNl90IHYyKSB7cmV0dXJuIHJzTWluKHYsIHYyKTt9CitzdGF0aWMgaW50OF90IFNDX21pbl9pOChpbnQ4X3QgdiwgaW50OF90IHYyKSB7cmV0dXJuIHJzTWluKHYsIHYyKTt9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRmxvYXQgdXRpbAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBmbG9hdCBTQ19jbGFtcF9mMzIoZmxvYXQgYW1vdW50LCBmbG9hdCBsb3csIGZsb2F0IGhpZ2gpCit7CisgICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19kZWdyZWVzKGZsb2F0IHJhZGlhbnMpCit7CisgICAgcmV0dXJuIHJhZGlhbnMgKiAoMTgwLmYgLyBNX1BJKTsKK30KKworc3RhdGljIGZsb2F0IFNDX21heF9mMzIoZmxvYXQgdiwgZmxvYXQgdjIpCit7CisgICAgcmV0dXJuIHJzTWF4KHYsIHYyKTsKK30KKworc3RhdGljIGZsb2F0IFNDX21pbl9mMzIoZmxvYXQgdiwgZmxvYXQgdjIpCit7CisgICAgcmV0dXJuIHJzTWluKHYsIHYyKTsKK30KKworc3RhdGljIGZsb2F0IFNDX21peF9mMzIoZmxvYXQgc3RhcnQsIGZsb2F0IHN0b3AsIGZsb2F0IGFtb3VudCkKK3sKKyAgICAvL0xPR0UoImxlcnBmICVmICAlZiAgJWYiLCBzdGFydCwgc3RvcCwgYW1vdW50KTsKKyAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKK30KKworc3RhdGljIGZsb2F0IFNDX3JhZGlhbnMoZmxvYXQgZGVncmVlcykKK3sKKyAgICByZXR1cm4gZGVncmVlcyAqIChNX1BJIC8gMTgwLmYpOworfQorCitzdGF0aWMgZmxvYXQgU0Nfc3RlcF9mMzIoZmxvYXQgZWRnZSwgZmxvYXQgdikKK3sKKyAgICBpZiAodiA8IGVkZ2UpIHJldHVybiAwLmY7CisgICAgcmV0dXJuIDEuZjsKK30KKworc3RhdGljIGZsb2F0IFNDX3NpZ25fZjMyKGZsb2F0IHZhbHVlKQoreworICAgIGlmICh2YWx1ZSA+IDApIHJldHVybiAxLmY7CisgICAgaWYgKHZhbHVlIDwgMCkgcmV0dXJuIC0xLmY7CisgICAgcmV0dXJuIHZhbHVlOworfQorCisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2xhc3MgaW1wbGVtZW50YXRpb24KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBsbHZtIG5hbWUgbWFuZ2xpbmcgcmVmCisvLyAgPGJ1aWx0aW4tdHlwZT4gOjo9IHYgICMgdm9pZAorLy8gICAgICAgICAgICAgICAgIDo6PSBiICAjIGJvb2wKKy8vICAgICAgICAgICAgICAgICA6Oj0gYyAgIyBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IGEgICMgc2lnbmVkIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gaCAgIyB1bnNpZ25lZCBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IHMgICMgc2hvcnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gdCAgIyB1bnNpZ25lZCBzaG9ydAorLy8gICAgICAgICAgICAgICAgIDo6PSBpICAjIGludAorLy8gICAgICAgICAgICAgICAgIDo6PSBqICAjIHVuc2lnbmVkIGludAorLy8gICAgICAgICAgICAgICAgIDo6PSBsICAjIGxvbmcKKy8vICAgICAgICAgICAgICAgICA6Oj0gbSAgIyB1bnNpZ25lZCBsb25nCisvLyAgICAgICAgICAgICAgICAgOjo9IHggICMgbG9uZyBsb25nLCBfX2ludDY0CisvLyAgICAgICAgICAgICAgICAgOjo9IHkgICMgdW5zaWduZWQgbG9uZyBsb25nLCBfX2ludDY0CisvLyAgICAgICAgICAgICAgICAgOjo9IGYgICMgZmxvYXQKKy8vICAgICAgICAgICAgICAgICA6Oj0gZCAgIyBkb3VibGUKKworc3RhdGljIFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCBnU3ltc1tdID0geworICAgIC8vIE9wZW5DTCBtYXRoCisgICAgeyAiX1o0YWNvc2YiLCAodm9pZCAqKSZhY29zZiB9LAorICAgIHsgIl9aNWFjb3NoZiIsICh2b2lkICopJmFjb3NoZiB9LAorICAgIHsgIl9aNmFjb3NwaWYiLCAodm9pZCAqKSZTQ19hY29zcGkgfSwKKyAgICB7ICJfWjRhc2luZiIsICh2b2lkICopJmFzaW5mIH0sCisgICAgeyAiX1o1YXNpbmhmIiwgKHZvaWQgKikmYXNpbmhmIH0sCisgICAgeyAiX1o2YXNpbnBpZiIsICh2b2lkICopJlNDX2FzaW5waSB9LAorICAgIHsgIl9aNGF0YW5mIiwgKHZvaWQgKikmYXRhbmYgfSwKKyAgICB7ICJfWjVhdGFuMmYiLCAodm9pZCAqKSZhdGFuMmYgfSwKKyAgICB7ICJfWjZhdGFucGlmIiwgKHZvaWQgKikmU0NfYXRhbnBpIH0sCisgICAgeyAiX1o3YXRhbjJwaWYiLCAodm9pZCAqKSZTQ19hdGFuMnBpIH0sCisgICAgeyAiX1o0Y2JydGYiLCAodm9pZCAqKSZjYnJ0ZiB9LAorICAgIHsgIl9aNGNlaWxmIiwgKHZvaWQgKikmY2VpbGYgfSwKKyAgICB7ICJfWjhjb3B5c2lnbmZmIiwgKHZvaWQgKikmY29weXNpZ25mIH0sCisgICAgeyAiX1ozY29zZiIsICh2b2lkICopJmNvc2YgfSwKKyAgICB7ICJfWjRjb3NoZiIsICh2b2lkICopJmNvc2hmIH0sCisgICAgeyAiX1o1Y29zcGlmIiwgKHZvaWQgKikmU0NfY29zcGkgfSwKKyAgICB7ICJfWjRlcmZjZiIsICh2b2lkICopJmVyZmNmIH0sCisgICAgeyAiX1ozZXJmZiIsICh2b2lkICopJmVyZmYgfSwKKyAgICB7ICJfWjNleHBmIiwgKHZvaWQgKikmZXhwZiB9LAorICAgIHsgIl9aNGV4cDJmIiwgKHZvaWQgKikmZXhwMmYgfSwKKyAgICB7ICJfWjVleHAxMGYiLCAodm9pZCAqKSZTQ19leHAxMCB9LAorICAgIHsgIl9aNWV4cG0xZiIsICh2b2lkICopJmV4cG0xZiB9LAorICAgIHsgIl9aNGZhYnNmIiwgKHZvaWQgKikmZmFic2YgfSwKKyAgICB7ICJfWjRmZGltZmYiLCAodm9pZCAqKSZmZGltZiB9LAorICAgIHsgIl9aNWZsb29yZiIsICh2b2lkICopJmZsb29yZiB9LAorICAgIHsgIl9aM2ZtYWZmZiIsICh2b2lkICopJmZtYWYgfSwKKyAgICB7ICJfWjRmbWF4ZmYiLCAodm9pZCAqKSZmbWF4ZiB9LAorICAgIHsgIl9aNGZtaW5mZiIsICh2b2lkICopJmZtaW5mIH0sICAvLyBmbG9hdCBmbWluKGZsb2F0LCBmbG9hdCkKKyAgICB7ICJfWjRmbW9kZmYiLCAodm9pZCAqKSZmbW9kZiB9LAorICAgIHsgIl9aNWZyYWN0ZlBmIiwgKHZvaWQgKikmU0NfZnJhY3QgfSwKKyAgICB7ICJfWjVmcmV4cGZQaSIsICh2b2lkICopJmZyZXhwZiB9LAorICAgIHsgIl9aNWh5cG90ZmYiLCAodm9pZCAqKSZoeXBvdGYgfSwKKyAgICB7ICJfWjVpbG9nYmYiLCAodm9pZCAqKSZpbG9nYmYgfSwKKyAgICB7ICJfWjVsZGV4cGZpIiwgKHZvaWQgKikmbGRleHBmIH0sCisgICAgeyAiX1o2bGdhbW1hZiIsICh2b2lkICopJmxnYW1tYWYgfSwKKyAgICB7ICJfWjNsb2dmIiwgKHZvaWQgKikmbG9nZiB9LAorICAgIHsgIl9aNGxvZzJmIiwgKHZvaWQgKikmU0NfbG9nMiB9LAorICAgIHsgIl9aNWxvZzEwZiIsICh2b2lkICopJmxvZzEwZiB9LAorICAgIHsgIl9aNWxvZzFwZiIsICh2b2lkICopJmxvZzFwZiB9LAorICAgIC8veyAibG9nYiIsICh2b2lkICopJiB9LAorICAgIC8veyAibWFkIiwgKHZvaWQgKikmIH0sCisgICAgeyAibW9kZiIsICh2b2lkICopJm1vZGZmIH0sCisgICAgLy97ICJuYW4iLCAodm9pZCAqKSYgfSwKKyAgICB7ICJfWjluZXh0YWZ0ZXJmZiIsICh2b2lkICopJm5leHRhZnRlcmYgfSwKKyAgICB7ICJfWjNwb3dmZiIsICh2b2lkICopJnBvd2YgfSwKKyAgICB7ICJfWjRwb3duZmkiLCAodm9pZCAqKSZTQ19wb3duIH0sCisgICAgeyAiX1o0cG93cmZmIiwgKHZvaWQgKikmU0NfcG93ciB9LAorICAgIHsgIl9aOXJlbWFpbmRlcmZmIiwgKHZvaWQgKikmcmVtYWluZGVyZiB9LAorICAgIHsgInJlbXF1byIsICh2b2lkICopJnJlbXF1b2YgfSwKKyAgICB7ICJfWjRyaW50ZiIsICh2b2lkICopJnJpbnRmIH0sCisgICAgeyAiX1o1cm9vdG5maSIsICh2b2lkICopJlNDX3Jvb3RuIH0sCisgICAgeyAiX1o1cm91bmRmIiwgKHZvaWQgKikmcm91bmRmIH0sCisgICAgeyAiX1o1cnNxcnRmIiwgKHZvaWQgKikmU0NfcnNxcnQgfSwKKyAgICB7ICJfWjNzaW5mIiwgKHZvaWQgKikmc2luZiB9LAorICAgIHsgInNpbmNvcyIsICh2b2lkICopJlNDX3NpbmNvcyB9LAorICAgIHsgIl9aNHNpbmhmIiwgKHZvaWQgKikmc2luaGYgfSwKKyAgICB7ICJfWjVzaW5waWYiLCAodm9pZCAqKSZTQ19zaW5waSB9LAorICAgIHsgIl9aNHNxcnRmIiwgKHZvaWQgKikmc3FydGYgfSwKKyAgICB7ICJfWjN0YW5mIiwgKHZvaWQgKikmdGFuZiB9LAorICAgIHsgIl9aNHRhbmhmIiwgKHZvaWQgKikmdGFuaGYgfSwKKyAgICB7ICJfWjV0YW5waWYiLCAodm9pZCAqKSZTQ190YW5waSB9LAorICAgIC8veyAidGdhbW1hIiwgKHZvaWQgKikmIH0sCisgICAgeyAiX1o1dHJ1bmNmIiwgKHZvaWQgKikmdHJ1bmNmIH0sCisKKyAgICAvLyBPcGVuQ0wgSW50CisgICAgeyAiX1ozYWJzaSIsICh2b2lkICopJlNDX2Fic19pMzIgfSwKKyAgICB7ICJfWjNhYnNzIiwgKHZvaWQgKikmU0NfYWJzX2kxNiB9LAorICAgIHsgIl9aM2Fic2MiLCAodm9pZCAqKSZTQ19hYnNfaTggfSwKKyAgICB7ICJfWjNjbHpqIiwgKHZvaWQgKikmU0NfY2x6X3UzMiB9LAorICAgIHsgIl9aM2NsenQiLCAodm9pZCAqKSZTQ19jbHpfdTE2IH0sCisgICAgeyAiX1ozY2x6aCIsICh2b2lkICopJlNDX2Nsel91OCB9LAorICAgIHsgIl9aM2NsemkiLCAodm9pZCAqKSZTQ19jbHpfaTMyIH0sCisgICAgeyAiX1ozY2x6cyIsICh2b2lkICopJlNDX2Nsel9pMTYgfSwKKyAgICB7ICJfWjNjbHpjIiwgKHZvaWQgKikmU0NfY2x6X2k4IH0sCisgICAgeyAiX1ozbWF4amoiLCAodm9pZCAqKSZTQ19tYXhfdTMyIH0sCisgICAgeyAiX1ozbWF4dHQiLCAodm9pZCAqKSZTQ19tYXhfdTE2IH0sCisgICAgeyAiX1ozbWF4aGgiLCAodm9pZCAqKSZTQ19tYXhfdTggfSwKKyAgICB7ICJfWjNtYXhpaSIsICh2b2lkICopJlNDX21heF9pMzIgfSwKKyAgICB7ICJfWjNtYXhzcyIsICh2b2lkICopJlNDX21heF9pMTYgfSwKKyAgICB7ICJfWjNtYXhjYyIsICh2b2lkICopJlNDX21heF9pOCB9LAorICAgIHsgIl9aM21pbmpqIiwgKHZvaWQgKikmU0NfbWluX3UzMiB9LAorICAgIHsgIl9aM21pbnR0IiwgKHZvaWQgKikmU0NfbWluX3UxNiB9LAorICAgIHsgIl9aM21pbmhoIiwgKHZvaWQgKikmU0NfbWluX3U4IH0sCisgICAgeyAiX1ozbWluaWkiLCAodm9pZCAqKSZTQ19taW5faTMyIH0sCisgICAgeyAiX1ozbWluc3MiLCAodm9pZCAqKSZTQ19taW5faTE2IH0sCisgICAgeyAiX1ozbWluY2MiLCAodm9pZCAqKSZTQ19taW5faTggfSwKKworICAgIC8vIE9wZW5DTCA2LjExLjQKKyAgICB7ICJfWjVjbGFtcGZmZiIsICh2b2lkICopJlNDX2NsYW1wX2YzMiB9LAorICAgIHsgIl9aN2RlZ3JlZXNmIiwgKHZvaWQgKikmU0NfZGVncmVlcyB9LAorICAgIHsgIl9aM21heGZmIiwgKHZvaWQgKikmU0NfbWF4X2YzMiB9LAorICAgIHsgIl9aM21pbmZmIiwgKHZvaWQgKikmU0NfbWluX2YzMiB9LAorICAgIHsgIl9aM21peGZmZiIsICh2b2lkICopJlNDX21peF9mMzIgfSwKKyAgICB7ICJfWjdyYWRpYW5zZiIsICh2b2lkICopJlNDX3JhZGlhbnMgfSwKKyAgICB7ICJfWjRzdGVwZmYiLCAodm9pZCAqKSZTQ19zdGVwX2YzMiB9LAorICAgIC8veyAic21vb3Roc3RlcCIsICh2b2lkICopJiB9LAorICAgIHsgIl9aNHNpZ25mIiwgKHZvaWQgKikmU0Nfc2lnbl9mMzIgfSwKKworICAgIHsgTlVMTCwgTlVMTCB9Cit9OworCitjb25zdCBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKiBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbENMKGNvbnN0IGNoYXIgKnN5bSkKK3sKKyAgICBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKnN5bXMgPSBnU3ltczsKKworICAgIHdoaWxlIChzeW1zLT5tUHRyKSB7CisgICAgICAgIGlmICghc3RyY21wKHN5bXMtPm1OYW1lLCBzeW0pKSB7CisgICAgICAgICAgICByZXR1cm4gc3ltczsKKyAgICAgICAgfQorICAgICAgICBzeW1zKys7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0Q19MaWJHTC5jcHAgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWJHTC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc4NzdjZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWJHTC5jcHAKQEAgLTAsMCArMSw0NDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjaW5jbHVkZSAicnNTY3JpcHRDLmgiCisjaW5jbHVkZSAicnNNYXRyaXguaCIKKworI2luY2x1ZGUgImFjYy9hY2MuaCIKKyNpbmNsdWRlICJ1dGlscy9UaW1lcnMuaCIKKworI2RlZmluZSBHTF9HTEVYVF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSA8dGltZS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKKyNkZWZpbmUgR0VUX1RMUygpICBDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKiB0bHMgPSBcCisgICAgKENvbnRleHQ6OlNjcmlwdFRMU1N0cnVjdCAqKXB0aHJlYWRfZ2V0c3BlY2lmaWMoQ29udGV4dDo6Z1RocmVhZFRMU0tleSk7IFwKKyAgICBDb250ZXh0ICogcnNjID0gdGxzLT5tQ29udGV4dDsgXAorICAgIFNjcmlwdEMgKiBzYyA9IChTY3JpcHRDICopIHRscy0+bVNjcmlwdAorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29udGV4dAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIFNDX2JpbmRUZXh0dXJlKFJzUHJvZ3JhbUZyYWdtZW50IHZwZiwgdWludDMyX3Qgc2xvdCwgUnNBbGxvY2F0aW9uIHZhKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfUHJvZ3JhbUJpbmRUZXh0dXJlKHJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFByb2dyYW1GcmFnbWVudCAqPih2cGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpKTsKKworfQorCitzdGF0aWMgdm9pZCBTQ19iaW5kU2FtcGxlcihSc1Byb2dyYW1GcmFnbWVudCB2cGYsIHVpbnQzMl90IHNsb3QsIFJzU2FtcGxlciB2cykKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNpX1Byb2dyYW1CaW5kU2FtcGxlcihyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnQgKj4odnBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTYW1wbGVyICo+KHZzKSk7CisKK30KKworc3RhdGljIHZvaWQgU0NfYmluZFByb2dyYW1TdG9yZShSc1Byb2dyYW1TdG9yZSBwZnMpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1TdG9yZShyc2MsIHBmcyk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtRnJhZ21lbnQoUnNQcm9ncmFtRnJhZ21lbnQgcGYpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudChyc2MsIHBmKTsKK30KKworc3RhdGljIHZvaWQgU0NfYmluZFByb2dyYW1WZXJ0ZXgoUnNQcm9ncmFtVmVydGV4IHB2KQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4KHJzYywgcHYpOworfQorCitzdGF0aWMgdm9pZCBTQ19iaW5kUHJvZ3JhbVJhc3RlcihSc1Byb2dyYW1SYXN0ZXIgcHYpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIocnNjLCBwdik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVlAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBTQ192cExvYWRQcm9qZWN0aW9uTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKm0pCit7CisgICAgR0VUX1RMUygpOworICAgIHJzYy0+Z2V0VmVydGV4KCktPnNldFByb2plY3Rpb25NYXRyaXgobSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX3ZwTG9hZE1vZGVsTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKm0pCit7CisgICAgR0VUX1RMUygpOworICAgIHJzYy0+Z2V0VmVydGV4KCktPnNldE1vZGVsdmlld01hdHJpeChtKTsKK30KKworc3RhdGljIHZvaWQgU0NfdnBMb2FkVGV4dHVyZU1hdHJpeChjb25zdCByc2NfTWF0cml4ICptKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2MtPmdldFZlcnRleCgpLT5zZXRUZXh0dXJlTWF0cml4KG0pOworfQorCisKK3N0YXRpYyB2b2lkIFNDX3BmQ29uc3RhbnRDb2xvcihSc1Byb2dyYW1GcmFnbWVudCB2cGYsIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgLy9HRVRfVExTKCk7CisgICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IHN0YXRpY19jYXN0PFByb2dyYW1GcmFnbWVudCAqPih2cGYpOworICAgIHBmLT5zZXRDb25zdGFudENvbG9yKHIsIGcsIGIsIGEpOworfQorCitzdGF0aWMgdm9pZCBTQ192cEdldFByb2plY3Rpb25NYXRyaXgocnNjX01hdHJpeCAqbSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNjLT5nZXRWZXJ0ZXgoKS0+Z2V0UHJvamVjdGlvbk1hdHJpeChtKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERyYXdpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBTQ19kcmF3UXVhZFRleENvb3JkcyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTEsIGZsb2F0IHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUyLCBmbG9hdCB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MywgZmxvYXQgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTQsIGZsb2F0IHY0KQoreworICAgIEdFVF9UTFMoKTsKKyAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvL0xPR0UoIlF1YWQiKTsKKyAgICAvL0xPR0UoIiU0LjJmLCAlNC4yZiwgJTQuMmYiLCB4MSwgeTEsIHoxKTsKKyAgICAvL0xPR0UoIiU0LjJmLCAlNC4yZiwgJTQuMmYiLCB4MiwgeTIsIHoyKTsKKyAgICAvL0xPR0UoIiU0LjJmLCAlNC4yZiwgJTQuMmYiLCB4MywgeTMsIHozKTsKKyAgICAvL0xPR0UoIiU0LjJmLCAlNC4yZiwgJTQuMmYiLCB4NCwgeTQsIHo0KTsKKworICAgIGZsb2F0IHZ0eFtdID0ge3gxLHkxLHoxLCB4Mix5Mix6MiwgeDMseTMsejMsIHg0LHk0LHo0fTsKKyAgICBjb25zdCBmbG9hdCB0ZXhbXSA9IHt1MSx2MSwgdTIsdjIsIHUzLHYzLCB1NCx2NH07CisKKyAgICBWZXJ0ZXhBcnJheSB2YTsKKyAgICB2YS5hZGQoR0xfRkxPQVQsIDMsIDEyLCBmYWxzZSwgKHVpbnQzMl90KXZ0eCwgInBvc2l0aW9uIik7CisgICAgdmEuYWRkKEdMX0ZMT0FULCAyLCA4LCBmYWxzZSwgKHVpbnQzMl90KXRleCwgInRleHR1cmUwIik7CisgICAgdmEuc2V0dXBHTDIocnNjLCAmcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheSwgJnJzYy0+bVNoYWRlckNhY2hlKTsKKworICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOworfQorCitzdGF0aWMgdm9pZCBTQ19kcmF3UXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0KQoreworICAgIFNDX2RyYXdRdWFkVGV4Q29vcmRzKHgxLCB5MSwgejEsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgeDIsIHkyLCB6MiwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4MywgeTMsIHozLCAxLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHg0LCB5NCwgejQsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2UoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBQcm9ncmFtVmVydGV4PiB0bXAocnNjLT5nZXRWZXJ0ZXgoKSk7CisgICAgcnNjLT5zZXRWZXJ0ZXgocnNjLT5nZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpKTsKKyAgICAvL3JzYy0+c2V0dXBDaGVjaygpOworCisgICAgLy9HTGludCBjcm9wWzRdID0gezAsIGgsIHcsIC1ofTsKKworICAgIGZsb2F0IHNoID0gcnNjLT5nZXRIZWlnaHQoKTsKKworICAgIFNDX2RyYXdRdWFkKHgsICAgc2ggLSB5LCAgICAgeiwKKyAgICAgICAgICAgICAgICB4K3csIHNoIC0geSwgICAgIHosCisgICAgICAgICAgICAgICAgeCt3LCBzaCAtICh5K2gpLCB6LAorICAgICAgICAgICAgICAgIHgsICAgc2ggLSAoeStoKSwgeik7CisgICAgcnNjLT5zZXRWZXJ0ZXgoKFByb2dyYW1WZXJ0ZXggKil0bXAuZ2V0KCkpOworfQorLyoKK3N0YXRpYyB2b2lkIFNDX2RyYXdTcHJpdGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgZmxvYXQgdmluWzNdID0ge3gsIHksIHp9OworICAgIGZsb2F0IHZvdXRbNF07CisKKyAgICAvL0xPR0UoImRzICBpbiAlZiAlZiAlZiIsIHgsIHksIHopOworICAgIHJzYy0+Z2V0VmVydGV4KCktPnRyYW5zZm9ybVRvU2NyZWVuKHJzYywgdm91dCwgdmluKTsKKyAgICAvL0xPR0UoImRzICBvdXQgJWYgJWYgJWYgJWYiLCB2b3V0WzBdLCB2b3V0WzFdLCB2b3V0WzJdLCB2b3V0WzNdKTsKKyAgICB2b3V0WzBdIC89IHZvdXRbM107CisgICAgdm91dFsxXSAvPSB2b3V0WzNdOworICAgIHZvdXRbMl0gLz0gdm91dFszXTsKKworICAgIHZvdXRbMF0gKj0gcnNjLT5nZXRXaWR0aCgpIC8gMjsKKyAgICB2b3V0WzFdICo9IHJzYy0+Z2V0SGVpZ2h0KCkgLyAyOworICAgIHZvdXRbMF0gKz0gcnNjLT5nZXRXaWR0aCgpIC8gMjsKKyAgICB2b3V0WzFdICs9IHJzYy0+Z2V0SGVpZ2h0KCkgLyAyOworCisgICAgdm91dFswXSAtPSB3LzI7CisgICAgdm91dFsxXSAtPSBoLzI7CisKKyAgICAvL0xPR0UoImRzICBvdXQyICVmICVmICVmIiwgdm91dFswXSwgdm91dFsxXSwgdm91dFsyXSk7CisKKyAgICAvLyBVLCBWLCBXLCBICisgICAgU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlKHZvdXRbMF0sIHZvdXRbMV0sIHosIGgsIHcpOworICAgIC8vcnNjLT5zZXR1cENoZWNrKCk7Cit9CisqLworCitzdGF0aWMgdm9pZCBTQ19kcmF3UmVjdChmbG9hdCB4MSwgZmxvYXQgeTEsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHopCit7CisgICAgLy9MT0dFKCJTQ19kcmF3UmVjdCAlZiwlZiAgJWYsJWYgICVmIiwgeDEsIHkxLCB4MiwgeTIsIHopOworICAgIFNDX2RyYXdRdWFkKHgxLCB5MiwgeiwKKyAgICAgICAgICAgICAgICB4MiwgeTIsIHosCisgICAgICAgICAgICAgICAgeDIsIHkxLCB6LAorICAgICAgICAgICAgICAgIHgxLCB5MSwgeik7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2RyYXdNZXNoKFJzTWVzaCB2c20pCit7CisgICAgR0VUX1RMUygpOworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPih2c20pOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzbS0+cmVuZGVyKHJzYyk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2RyYXdNZXNoUHJpbWl0aXZlKFJzTWVzaCB2c20sIHVpbnQzMl90IHByaW1JbmRleCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KHZzbSk7CisgICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNtLT5yZW5kZXJQcmltaXRpdmUocnNjLCBwcmltSW5kZXgpOworfQorCitzdGF0aWMgdm9pZCBTQ19kcmF3TWVzaFByaW1pdGl2ZVJhbmdlKFJzTWVzaCB2c20sIHVpbnQzMl90IHByaW1JbmRleCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbikKK3sKKyAgICBHRVRfVExTKCk7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KHZzbSk7CisgICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNtLT5yZW5kZXJQcmltaXRpdmVSYW5nZShyc2MsIHByaW1JbmRleCwgc3RhcnQsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIFNDX21lc2hDb21wdXRlQm91bmRpbmdCb3goUnNNZXNoIHZzbSwgZmxvYXQgKm1pblgsIGZsb2F0ICptaW5ZLCBmbG9hdCAqbWluWiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKm1heFgsIGZsb2F0ICptYXhZLCBmbG9hdCAqbWF4WikKK3sKKyAgICBHRVRfVExTKCk7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KHZzbSk7CisgICAgc20tPmNvbXB1dGVCQm94KCk7CisgICAgKm1pblggPSBzbS0+bUJCb3hNaW5bMF07CisgICAgKm1pblkgPSBzbS0+bUJCb3hNaW5bMV07CisgICAgKm1pblogPSBzbS0+bUJCb3hNaW5bMl07CisgICAgKm1heFggPSBzbS0+bUJCb3hNYXhbMF07CisgICAgKm1heFkgPSBzbS0+bUJCb3hNYXhbMV07CisgICAgKm1heFogPSBzbS0+bUJCb3hNYXhbMl07Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworc3RhdGljIHZvaWQgU0NfY29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IChQcm9ncmFtRnJhZ21lbnQgKilyc2MtPmdldEZyYWdtZW50KCk7CisgICAgcGYtPnNldENvbnN0YW50Q29sb3IociwgZywgYiwgYSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX3VwbG9hZFRvVGV4dHVyZTIoUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCBiYXNlTWlwTGV2ZWwpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKHJzYywgdmEsIGZhbHNlLCBiYXNlTWlwTGV2ZWwpOworfQorc3RhdGljIHZvaWQgU0NfdXBsb2FkVG9UZXh0dXJlKFJzQWxsb2NhdGlvbiB2YSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNpX0FsbG9jYXRpb25VcGxvYWRUb1RleHR1cmUocnNjLCB2YSwgZmFsc2UsIDApOworfQorCitzdGF0aWMgdm9pZCBTQ191cGxvYWRUb0J1ZmZlck9iamVjdChSc0FsbG9jYXRpb24gdmEpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QocnNjLCB2YSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX0NsZWFyQ29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xDbGVhckNvbG9yKHIsIGcsIGIsIGEpOworICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX0NsZWFyRGVwdGgoZmxvYXQgdikKK3sKKyAgICBHRVRfVExTKCk7CisgICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xDbGVhckRlcHRoZih2KTsKKyAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQpOworfQorCitzdGF0aWMgdWludDMyX3QgU0NfZ2V0V2lkdGgoKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByZXR1cm4gcnNjLT5nZXRXaWR0aCgpOworfQorCitzdGF0aWMgdWludDMyX3QgU0NfZ2V0SGVpZ2h0KCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcmV0dXJuIHJzYy0+Z2V0SGVpZ2h0KCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX0RyYXdUZXh0QWxsb2MoUnNBbGxvY2F0aW9uIHZhLCBpbnQgeCwgaW50IHkpCit7CisgICAgR0VUX1RMUygpOworICAgIEFsbG9jYXRpb24gKmFsbG9jID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7CisgICAgcnNjLT5tU3RhdGVGb250LnJlbmRlclRleHQoYWxsb2MsIHgsIHkpOworfQorCitzdGF0aWMgdm9pZCBTQ19EcmF3VGV4dChjb25zdCBjaGFyICp0ZXh0LCBpbnQgeCwgaW50IHkpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzYy0+bVN0YXRlRm9udC5yZW5kZXJUZXh0KHRleHQsIHgsIHkpOworfQorCitzdGF0aWMgdm9pZCBTQ19CaW5kRm9udChSc0ZvbnQgZm9udCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNpX0NvbnRleHRCaW5kRm9udChyc2MsIGZvbnQpOworfQorCitzdGF0aWMgdm9pZCBTQ19Gb250Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNjLT5tU3RhdGVGb250LnNldEZvbnRDb2xvcihyLCBnLCBiLCBhKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGFzcyBpbXBsZW1lbnRhdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIGxsdm0gbmFtZSBtYW5nbGluZyByZWYKKy8vICA8YnVpbHRpbi10eXBlPiA6Oj0gdiAgIyB2b2lkCisvLyAgICAgICAgICAgICAgICAgOjo9IGIgICMgYm9vbAorLy8gICAgICAgICAgICAgICAgIDo6PSBjICAjIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gYSAgIyBzaWduZWQgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBoICAjIHVuc2lnbmVkIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gcyAgIyBzaG9ydAorLy8gICAgICAgICAgICAgICAgIDo6PSB0ICAjIHVuc2lnbmVkIHNob3J0CisvLyAgICAgICAgICAgICAgICAgOjo9IGkgICMgaW50CisvLyAgICAgICAgICAgICAgICAgOjo9IGogICMgdW5zaWduZWQgaW50CisvLyAgICAgICAgICAgICAgICAgOjo9IGwgICMgbG9uZworLy8gICAgICAgICAgICAgICAgIDo6PSBtICAjIHVuc2lnbmVkIGxvbmcKKy8vICAgICAgICAgICAgICAgICA6Oj0geCAgIyBsb25nIGxvbmcsIF9faW50NjQKKy8vICAgICAgICAgICAgICAgICA6Oj0geSAgIyB1bnNpZ25lZCBsb25nIGxvbmcsIF9faW50NjQKKy8vICAgICAgICAgICAgICAgICA6Oj0gZiAgIyBmbG9hdAorLy8gICAgICAgICAgICAgICAgIDo6PSBkICAjIGRvdWJsZQorCitzdGF0aWMgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90IGdTeW1zW10gPSB7CisgICAgeyAiX1oyMnJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQxOXJzX3Byb2dyYW1fZnJhZ21lbnQiLCAodm9pZCAqKSZTQ19iaW5kUHJvZ3JhbUZyYWdtZW50IH0sCisgICAgeyAiX1oxOXJzZ0JpbmRQcm9ncmFtU3RvcmUxNnJzX3Byb2dyYW1fc3RvcmUiLCAodm9pZCAqKSZTQ19iaW5kUHJvZ3JhbVN0b3JlIH0sCisgICAgeyAiX1oyMHJzZ0JpbmRQcm9ncmFtVmVydGV4MTdyc19wcm9ncmFtX3ZlcnRleCIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtVmVydGV4IH0sCisgICAgeyAiX1oyMHJzZ0JpbmRQcm9ncmFtUmFzdGVyMTdyc19wcm9ncmFtX3Jhc3RlciIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtUmFzdGVyIH0sCisgICAgeyAiX1oxNHJzZ0JpbmRTYW1wbGVyMTlyc19wcm9ncmFtX2ZyYWdtZW50ajEwcnNfc2FtcGxlciIsICh2b2lkICopJlNDX2JpbmRTYW1wbGVyIH0sCisgICAgeyAiX1oxNHJzZ0JpbmRUZXh0dXJlMTlyc19wcm9ncmFtX2ZyYWdtZW50ajEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2JpbmRUZXh0dXJlIH0sCisKKyAgICB7ICJfWjM2cnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4UEsxMnJzX21hdHJpeDR4NCIsICh2b2lkICopJlNDX3ZwTG9hZFByb2plY3Rpb25NYXRyaXggfSwKKyAgICB7ICJfWjMxcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeFBLMTJyc19tYXRyaXg0eDQiLCAodm9pZCAqKSZTQ192cExvYWRNb2RlbE1hdHJpeCB9LAorICAgIHsgIl9aMzNyc2dQcm9ncmFtVmVydGV4TG9hZFRleHR1cmVNYXRyaXhQSzEycnNfbWF0cml4NHg0IiwgKHZvaWQgKikmU0NfdnBMb2FkVGV4dHVyZU1hdHJpeCB9LAorCisgICAgeyAiX1ozNXJzZ1Byb2dyYW1WZXJ0ZXhHZXRQcm9qZWN0aW9uTWF0cml4UDEycnNfbWF0cml4NHg0IiwgKHZvaWQgKikmU0NfdnBHZXRQcm9qZWN0aW9uTWF0cml4IH0sCisKKyAgICB7ICJfWjMxcnNnUHJvZ3JhbUZyYWdtZW50Q29uc3RhbnRDb2xvcjE5cnNfcHJvZ3JhbV9mcmFnbWVudGZmZmYiLCAodm9pZCAqKSZTQ19wZkNvbnN0YW50Q29sb3IgfSwKKworICAgIHsgIl9aMTFyc2dHZXRXaWR0aHYiLCAodm9pZCAqKSZTQ19nZXRXaWR0aCB9LAorICAgIHsgIl9aMTJyc2dHZXRIZWlnaHR2IiwgKHZvaWQgKikmU0NfZ2V0SGVpZ2h0IH0sCisKKyAgICB7ICJfWjE4cnNnVXBsb2FkVG9UZXh0dXJlMTNyc19hbGxvY2F0aW9uaiIsICh2b2lkICopJlNDX3VwbG9hZFRvVGV4dHVyZTIgfSwKKyAgICB7ICJfWjE4cnNnVXBsb2FkVG9UZXh0dXJlMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfdXBsb2FkVG9UZXh0dXJlIH0sCisgICAgeyAiX1oyM3JzZ1VwbG9hZFRvQnVmZmVyT2JqZWN0MTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfdXBsb2FkVG9CdWZmZXJPYmplY3QgfSwKKworICAgIHsgIl9aMTFyc2dEcmF3UmVjdGZmZmZmIiwgKHZvaWQgKikmU0NfZHJhd1JlY3QgfSwKKyAgICB7ICJfWjExcnNnRHJhd1F1YWRmZmZmZmZmZmZmZmYiLCAodm9pZCAqKSZTQ19kcmF3UXVhZCB9LAorICAgIHsgIl9aMjByc2dEcmF3UXVhZFRleENvb3Jkc2ZmZmZmZmZmZmZmZmZmZmZmZmZmIiwgKHZvaWQgKikmU0NfZHJhd1F1YWRUZXhDb29yZHMgfSwKKyAgICB7ICJfWjI0cnNnRHJhd1Nwcml0ZVNjcmVlbnNwYWNlZmZmZmYiLCAodm9pZCAqKSZTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2UgfSwKKworICAgIHsgIl9aMTFyc2dEcmF3TWVzaDdyc19tZXNoIiwgKHZvaWQgKikmU0NfZHJhd01lc2ggfSwKKyAgICB7ICJfWjExcnNnRHJhd01lc2g3cnNfbWVzaGoiLCAodm9pZCAqKSZTQ19kcmF3TWVzaFByaW1pdGl2ZSB9LAorICAgIHsgIl9aMTFyc2dEcmF3TWVzaDdyc19tZXNoampqIiwgKHZvaWQgKikmU0NfZHJhd01lc2hQcmltaXRpdmVSYW5nZSB9LAorICAgIHsgIl9aMjVyc2dNZXNoQ29tcHV0ZUJvdW5kaW5nQm94N3JzX21lc2hQZlMwX1MwX1MwX1MwX1MwXyIsICh2b2lkICopJlNDX21lc2hDb21wdXRlQm91bmRpbmdCb3ggfSwKKworICAgIHsgIl9aMTNyc2dDbGVhckNvbG9yZmZmZiIsICh2b2lkICopJlNDX0NsZWFyQ29sb3IgfSwKKyAgICB7ICJfWjEzcnNnQ2xlYXJEZXB0aGYiLCAodm9pZCAqKSZTQ19DbGVhckRlcHRoIH0sCisKKyAgICB7ICJfWjExcnNnRHJhd1RleHRQS2NpaSIsICh2b2lkICopJlNDX0RyYXdUZXh0IH0sCisgICAgeyAiX1oxMXJzZ0RyYXdUZXh0MTNyc19hbGxvY2F0aW9uaWkiLCAodm9pZCAqKSZTQ19EcmF3VGV4dEFsbG9jIH0sCisKKyAgICB7ICJfWjExcnNnQmluZEZvbnQ3cnNfZm9udCIsICh2b2lkICopJlNDX0JpbmRGb250IH0sCisgICAgeyAiX1oxMnJzZ0ZvbnRDb2xvcmZmZmYiLCAodm9pZCAqKSZTQ19Gb250Q29sb3IgfSwKKworICAgIC8vIG1pc2MKKyAgICB7ICJfWjVjb2xvcmZmZmYiLCAodm9pZCAqKSZTQ19jb2xvciB9LAorCisgICAgeyBOVUxMLCBOVUxMIH0KK307CisKK2NvbnN0IFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqIFNjcmlwdENTdGF0ZTo6bG9va3VwU3ltYm9sR0woY29uc3QgY2hhciAqc3ltKQoreworICAgIFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqc3ltcyA9IGdTeW1zOworCisgICAgd2hpbGUgKHN5bXMtPm1QdHIpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoc3ltcy0+bU5hbWUsIHN5bSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzeW1zOworICAgICAgICB9CisgICAgICAgIHN5bXMrKzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTaGFkZXJDYWNoZS5jcHAgYi9saWJzL3JzL3JzU2hhZGVyQ2FjaGUuY3BwCmluZGV4IDQ3MTFkMWIuLjVjMDczYjMgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTaGFkZXJDYWNoZS5jcHAKKysrIGIvbGlicy9ycy9yc1NoYWRlckNhY2hlLmNwcApAQCAtMTQsMTAgKzE0LDE0IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKLQogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtOTQsMTYgKzk4LDEwIEBACiAgICAgICAgIGdsQXR0YWNoU2hhZGVyKHBnbSwgZnJhZy0+Z2V0U2hhZGVySUQoKSk7CiAKICAgICAgICAgaWYgKCF2dHgtPmlzVXNlclByb2dyYW0oKSkgewotICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAwLCAiQVRUUklCX0xlZ2FjeVBvc2l0aW9uIik7Ci0gICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDEsICJBVFRSSUJfTGVnYWN5Q29sb3IiKTsKLSAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMiwgIkFUVFJJQl9MZWdhY3lOb3JtYWwiKTsKLSAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMywgIkFUVFJJQl9MZWdhY3lQb2ludFNpemUiKTsKLSAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgNCwgIkFUVFJJQl9MZWdhY3lUZXh0dXJlIik7Ci0gICAgICAgICAgICBlLT5tVnR4QXR0cmliU2xvdHNbUlNfS0lORF9QT1NJVElPTl0gPSAwOwotICAgICAgICAgICAgZS0+bVZ0eEF0dHJpYlNsb3RzW1JTX0tJTkRfQ09MT1JdID0gMTsKLSAgICAgICAgICAgIGUtPm1WdHhBdHRyaWJTbG90c1tSU19LSU5EX05PUk1BTF0gPSAyOwotICAgICAgICAgICAgZS0+bVZ0eEF0dHJpYlNsb3RzW1JTX0tJTkRfUE9JTlRfU0laRV0gPSAzOwotICAgICAgICAgICAgZS0+bVZ0eEF0dHJpYlNsb3RzW1JTX0tJTkRfVEVYVFVSRV0gPSA0OworICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAwLCAiQVRUUklCX3Bvc2l0aW9uIik7CisgICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDEsICJBVFRSSUJfY29sb3IiKTsKKyAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMiwgIkFUVFJJQl9ub3JtYWwiKTsKKyAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMywgIkFUVFJJQl90ZXh0dXJlMCIpOwogICAgICAgICB9CiAKICAgICAgICAgLy9MT0dFKCJlMiAleCIsIGdsR2V0RXJyb3IoKSk7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2lnbmFsLmNwcCBiL2xpYnMvcnMvcnNTaWduYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMzliZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU2lnbmFsLmNwcApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInJzU2lnbmFsLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworCitTaWduYWw6OlNpZ25hbCgpCit7CisgICAgbVNldCA9IHRydWU7Cit9CisKK1NpZ25hbDo6flNpZ25hbCgpCit7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtTXV0ZXgpOworICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZtQ29uZGl0aW9uKTsKK30KKworYm9vbCBTaWduYWw6OmluaXQoKQoreworICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2luaXQoJm1NdXRleCwgTlVMTCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJMb2NrbGVzc0ZpZm8gbXV0ZXggaW5pdCBmYWlsdXJlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfaW5pdCgmbUNvbmRpdGlvbiwgTlVMTCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJMb2NrbGVzc0ZpZm8gY29uZGl0aW9uIGluaXQgZmFpbHVyZSIpOworICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1NdXRleCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTaWduYWw6OnNldCgpCit7CisgICAgaW50IHN0YXR1czsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIGxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1TZXQgPSB0cnVlOworCisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3NpZ25hbCgmbUNvbmRpdGlvbik7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSBvbiBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgfQorCisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSB1bmxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKKyAgICB9Cit9CisKK3ZvaWQgU2lnbmFsOjp3YWl0KCkKK3sKKyAgICBpbnQgc3RhdHVzOworCisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgbG9ja2luZyBmb3IgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIW1TZXQpIHsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3dhaXQoJm1Db25kaXRpb24sICZtTXV0ZXgpOworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSB3YWl0aW5nIG9uIGNvbmRpdGlvbi4iLCBzdGF0dXMpOworICAgICAgICB9CisgICAgfQorICAgIG1TZXQgPSBmYWxzZTsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgdW5sb2NraW5nIGZvciBjb25kaXRpb24uIiwgc3RhdHVzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTaWduYWwuaCBiL2xpYnMvcnMvcnNTaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTc2MGYxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1NpZ25hbC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfU0lHTkFMX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19TSUdOQUxfSAorCisKKyNpbmNsdWRlICJyc1V0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitjbGFzcyBTaWduYWwgeworcHVibGljOgorICAgIFNpZ25hbCgpOworICAgIH5TaWduYWwoKTsKKworICAgIGJvb2wgaW5pdCgpOworCisgICAgdm9pZCBzZXQoKTsKKyAgICB2b2lkIHdhaXQoKTsKKworcHJvdGVjdGVkOgorICAgIGJvb2wgbVNldDsKKyAgICBwdGhyZWFkX211dGV4X3QgbU11dGV4OworICAgIHB0aHJlYWRfY29uZF90IG1Db25kaXRpb247Cit9OworCit9Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2ltcGxlTWVzaC5jcHAgYi9saWJzL3JzL3JzU2ltcGxlTWVzaC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzY2U1Y2QuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9yc1NpbXBsZU1lc2guY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicnNDb250ZXh0LmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLVNpbXBsZU1lc2g6OlNpbXBsZU1lc2goQ29udGV4dCAqcnNjKSA6IE9iamVjdEJhc2UocnNjKQotewotICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKLSAgICBtQWxsb2NMaW5lID0gX19MSU5FX187Ci19Ci0KLVNpbXBsZU1lc2g6On5TaW1wbGVNZXNoKCkKLXsKLSAgICBkZWxldGVbXSBtVmVydGV4VHlwZXM7Ci0gICAgZGVsZXRlW10gbVZlcnRleEJ1ZmZlcnM7Ci19Ci0KLXZvaWQgU2ltcGxlTWVzaDo6cmVuZGVyKENvbnRleHQgKnJzYykgY29uc3QKLXsKLSAgICBpZiAobVByaW1pdGl2ZVR5cGUuZ2V0KCkpIHsKLSAgICAgICAgcmVuZGVyUmFuZ2UocnNjLCAwLCBtUHJpbWl0aXZlVHlwZS0+Z2V0RGltWCgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtSW5kZXhUeXBlLmdldCgpKSB7Ci0gICAgICAgIHJlbmRlclJhbmdlKHJzYywgMCwgbUluZGV4VHlwZS0+Z2V0RGltWCgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJlbmRlclJhbmdlKHJzYywgMCwgbVZlcnRleFR5cGVzWzBdLT5nZXREaW1YKCkpOwotfQotCi12b2lkIFNpbXBsZU1lc2g6OnJlbmRlclJhbmdlKENvbnRleHQgKnJzYywgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbikgY29uc3QKLXsKLSAgICBpZiAobGVuIDwgMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcnNjLT5jaGVja0Vycm9yKCJTaW1wbGVNZXNoOjpyZW5kZXJSYW5nZSAxIik7Ci0gICAgVmVydGV4QXJyYXkgdmE7Ci0gICAgaWYgKHJzYy0+Y2hlY2tWZXJzaW9uMl8wKCkpIHsKLSAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1WZXJ0ZXhUeXBlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+dXBsb2FkQ2hlY2socnNjKTsKLSAgICAgICAgICAgIHZhLnNldEFjdGl2ZUJ1ZmZlcihtVmVydGV4QnVmZmVyc1tjdF0tPmdldEJ1ZmZlck9iamVjdElEKCkpOwotICAgICAgICAgICAgbVZlcnRleFR5cGVzW2N0XS0+ZW5hYmxlR0xWZXJ0ZXhCdWZmZXIyKCZ2YSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmEuc2V0dXBHTDIocnNjLCAmcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheSwgJnJzYy0+bVNoYWRlckNhY2hlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVZlcnRleFR5cGVDb3VudDsgY3QrKykgewotICAgICAgICAgICAgbVZlcnRleEJ1ZmZlcnNbY3RdLT51cGxvYWRDaGVjayhyc2MpOwotICAgICAgICAgICAgdmEuc2V0QWN0aXZlQnVmZmVyKG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0QnVmZmVyT2JqZWN0SUQoKSk7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbY3RdLT5lbmFibGVHTFZlcnRleEJ1ZmZlcigmdmEpOwotICAgICAgICB9Ci0gICAgICAgIHZhLnNldHVwR0wocnNjLCAwKTsKLSAgICB9Ci0KLSAgICByc2MtPmNoZWNrRXJyb3IoIlNpbXBsZU1lc2g6OnJlbmRlclJhbmdlIDIiKTsKLSAgICBpZiAobUluZGV4VHlwZS5nZXQoKSkgewotICAgICAgICBtSW5kZXhCdWZmZXItPnVwbG9hZENoZWNrKHJzYyk7Ci0gICAgICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUluZGV4QnVmZmVyLT5nZXRCdWZmZXJPYmplY3RJRCgpKTsKLSAgICAgICAgZ2xEcmF3RWxlbWVudHMobUdMUHJpbWl0aXZlLCBsZW4sIEdMX1VOU0lHTkVEX1NIT1JULCAodWludDE2X3QgKikoc3RhcnQgKiAyKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xEcmF3QXJyYXlzKG1HTFByaW1pdGl2ZSwgc3RhcnQsIGxlbik7Ci0gICAgfQotCi0gICAgcnNjLT5jaGVja0Vycm9yKCJTaW1wbGVNZXNoOjpyZW5kZXJSYW5nZSIpOwotfQotCi12b2lkIFNpbXBsZU1lc2g6OnVwbG9hZEFsbChDb250ZXh0ICpyc2MpCi17Ci0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1WZXJ0ZXhUeXBlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgaWYgKG1WZXJ0ZXhCdWZmZXJzW2N0XS5nZXQoKSkgewotICAgICAgICAgICAgbVZlcnRleEJ1ZmZlcnNbY3RdLT5kZWZlcmVkVXBsb2FkVG9CdWZmZXJPYmplY3QocnNjKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobUluZGV4QnVmZmVyLmdldCgpKSB7Ci0gICAgICAgIG1JbmRleEJ1ZmZlci0+ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYyk7Ci0gICAgfQotICAgIGlmIChtUHJpbWl0aXZlQnVmZmVyLmdldCgpKSB7Ci0gICAgICAgIG1QcmltaXRpdmVCdWZmZXItPmRlZmVyZWRVcGxvYWRUb0J1ZmZlck9iamVjdChyc2MpOwotICAgIH0KLSAgICByc2MtPmNoZWNrRXJyb3IoIlNpbXBsZU1lc2g6OnVwbG9hZEFsbCIpOwotfQotCi0KLVNpbXBsZU1lc2hDb250ZXh0OjpTaW1wbGVNZXNoQ29udGV4dCgpCi17Ci19Ci0KLVNpbXBsZU1lc2hDb250ZXh0Ojp+U2ltcGxlTWVzaENvbnRleHQoKQotewotfQotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi0KLVJzU2ltcGxlTWVzaCByc2lfU2ltcGxlTWVzaENyZWF0ZShDb250ZXh0ICpyc2MsIFJzVHlwZSBwcmltLCBSc1R5cGUgaWR4LCBSc1R5cGUgKnZ0eCwgdWludDMyX3QgdnR4Q291bnQsIHVpbnQzMl90IHByaW1UeXBlKQotewotICAgIFNpbXBsZU1lc2ggKnNtID0gbmV3IFNpbXBsZU1lc2gocnNjKTsKLSAgICBzbS0+aW5jVXNlclJlZigpOwotCi0gICAgc20tPm1JbmRleFR5cGUuc2V0KChjb25zdCBUeXBlICopaWR4KTsKLSAgICBzbS0+bVByaW1pdGl2ZVR5cGUuc2V0KChjb25zdCBUeXBlICopcHJpbSk7Ci0KLSAgICBzbS0+bVZlcnRleFR5cGVDb3VudCA9IHZ0eENvdW50OwotICAgIHNtLT5tVmVydGV4VHlwZXMgPSBuZXcgT2JqZWN0QmFzZVJlZjxjb25zdCBUeXBlPlt2dHhDb3VudF07Ci0gICAgc20tPm1WZXJ0ZXhCdWZmZXJzID0gbmV3IE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj5bdnR4Q291bnRdOwotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCB2dHhDb3VudDsgY3QrKykgewotICAgICAgICBzbS0+bVZlcnRleFR5cGVzW2N0XS5zZXQoKGNvbnN0IFR5cGUgKil2dHhbY3RdKTsKLSAgICB9Ci0KLSAgICBzbS0+bVByaW1pdGl2ZSA9IChSc1ByaW1pdGl2ZSlwcmltVHlwZTsKLSAgICBzd2l0Y2goc20tPm1QcmltaXRpdmUpIHsKLSAgICBjYXNlIFJTX1BSSU1JVElWRV9QT0lOVDogICAgICAgICAgc20tPm1HTFByaW1pdGl2ZSA9IEdMX1BPSU5UUzsgYnJlYWs7Ci0gICAgY2FzZSBSU19QUklNSVRJVkVfTElORTogICAgICAgICAgIHNtLT5tR0xQcmltaXRpdmUgPSBHTF9MSU5FUzsgYnJlYWs7Ci0gICAgY2FzZSBSU19QUklNSVRJVkVfTElORV9TVFJJUDogICAgIHNtLT5tR0xQcmltaXRpdmUgPSBHTF9MSU5FX1NUUklQOyBicmVhazsKLSAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRTogICAgICAgc20tPm1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFUzsgYnJlYWs7Ci0gICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEVfU1RSSVA6IHNtLT5tR0xQcmltaXRpdmUgPSBHTF9UUklBTkdMRV9TVFJJUDsgYnJlYWs7Ci0gICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEVfRkFOOiAgIHNtLT5tR0xQcmltaXRpdmUgPSBHTF9UUklBTkdMRV9GQU47IGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gc207Ci19Ci0KLXZvaWQgcnNpX1NpbXBsZU1lc2hCaW5kVmVydGV4KENvbnRleHQgKnJzYywgUnNTaW1wbGVNZXNoIG12LCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHNsb3QpCi17Ci0gICAgU2ltcGxlTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxTaW1wbGVNZXNoICo+KG12KTsKLSAgICByc0Fzc2VydChzbG90IDwgc20tPm1WZXJ0ZXhUeXBlQ291bnQpOwotCi0gICAgc20tPm1WZXJ0ZXhCdWZmZXJzW3Nsb3RdLnNldCgoQWxsb2NhdGlvbiAqKXZhKTsKLX0KLQotdm9pZCByc2lfU2ltcGxlTWVzaEJpbmRJbmRleChDb250ZXh0ICpyc2MsIFJzU2ltcGxlTWVzaCBtdiwgUnNBbGxvY2F0aW9uIHZhKQotewotICAgIFNpbXBsZU1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPihtdik7Ci0gICAgc20tPm1JbmRleEJ1ZmZlci5zZXQoKEFsbG9jYXRpb24gKil2YSk7Ci19Ci0KLXZvaWQgcnNpX1NpbXBsZU1lc2hCaW5kUHJpbWl0aXZlKENvbnRleHQgKnJzYywgUnNTaW1wbGVNZXNoIG12LCBSc0FsbG9jYXRpb24gdmEpCi17Ci0gICAgU2ltcGxlTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxTaW1wbGVNZXNoICo+KG12KTsKLSAgICBzbS0+bVByaW1pdGl2ZUJ1ZmZlci5zZXQoKEFsbG9jYXRpb24gKil2YSk7Ci19Ci0KLQotCi0KLX19Ci0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTaW1wbGVNZXNoLmggYi9saWJzL3JzL3JzU2ltcGxlTWVzaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGVmYmRhLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvcnNTaW1wbGVNZXNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1JTX1NJTVBMRV9NRVNIX0gKLSNkZWZpbmUgQU5EUk9JRF9SU19TSU1QTEVfTUVTSF9ICi0KLQotI2luY2x1ZGUgIlJlbmRlclNjcmlwdC5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi0KLS8vIEFuIGVsZW1lbnQgaXMgYSBncm91cCBvZiBDb21wb25lbnRzIHRoYXQgb2NjdXBpZXMgb25lIGNlbGwgaW4gYSBzdHJ1Y3R1cmUuCi1jbGFzcyBTaW1wbGVNZXNoIDogcHVibGljIE9iamVjdEJhc2UKLXsKLXB1YmxpYzoKLSAgICBTaW1wbGVNZXNoKENvbnRleHQgKik7Ci0gICAgflNpbXBsZU1lc2goKTsKLQotICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT4gbUluZGV4VHlwZTsKLSAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFR5cGU+IG1QcmltaXRpdmVUeXBlOwotICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT4gKm1WZXJ0ZXhUeXBlczsKLSAgICB1aW50MzJfdCBtVmVydGV4VHlwZUNvdW50OwotCi0gICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtSW5kZXhCdWZmZXI7Ci0gICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtUHJpbWl0aXZlQnVmZmVyOwotICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gKm1WZXJ0ZXhCdWZmZXJzOwotCi0gICAgUnNQcmltaXRpdmUgbVByaW1pdGl2ZTsKLSAgICB1aW50MzJfdCBtR0xQcmltaXRpdmU7Ci0KLQotICAgIHZvaWQgcmVuZGVyKENvbnRleHQgKikgY29uc3Q7Ci0gICAgdm9pZCByZW5kZXJSYW5nZShDb250ZXh0ICosIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pIGNvbnN0OwotICAgIHZvaWQgdXBsb2FkQWxsKENvbnRleHQgKik7Ci0KLQotcHJvdGVjdGVkOgotfTsKLQotY2xhc3MgU2ltcGxlTWVzaENvbnRleHQKLXsKLXB1YmxpYzoKLSAgICBTaW1wbGVNZXNoQ29udGV4dCgpOwotICAgIH5TaW1wbGVNZXNoQ29udGV4dCgpOwotCi0KLX07Ci0KLQotfQotfQotI2VuZGlmIC8vQU5EUk9JRF9SU19TSU1QTEVfTUVTSF9ICi0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTdHJlYW0uY3BwIGIvbGlicy9ycy9yc1N0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyNDFmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNTdHJlYW0uY3BwCkBAIC0wLDAgKzEsMTMxIEBACisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKyNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAicnNTdHJlYW0uaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCitJU3RyZWFtOjpJU3RyZWFtKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgYm9vbCB1c2U2NCkKK3sKKyAgICBtRGF0YSA9IGJ1ZjsKKyAgICBtUG9zID0gMDsKKyAgICBtVXNlNjQgPSB1c2U2NDsKK30KKwordm9pZCBJU3RyZWFtOjpsb2FkQnl0ZUFycmF5KHZvaWQgKmRlc3QsIHNpemVfdCBudW1CeXRlcykKK3sKKyAgICBtZW1jcHkoZGVzdCwgbURhdGEgKyBtUG9zLCBudW1CeXRlcyk7CisgICAgbVBvcyArPSBudW1CeXRlczsKK30KKwordWludDY0X3QgSVN0cmVhbTo6bG9hZE9mZnNldCgpCit7CisgICAgdWludDY0X3QgdG1wOworICAgIGlmIChtVXNlNjQpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgNykgJiAofjcpOworICAgICAgICB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgcmV0dXJuIGxvYWRVMzIoKTsKK30KKwordm9pZCBJU3RyZWFtOjpsb2FkU3RyaW5nKFN0cmluZzggKnMpCit7CisgICAgdWludDMyX3QgbGVuID0gbG9hZFUzMigpOworICAgIHMtPnNldFRvKChjb25zdCBjaGFyICopJm1EYXRhW21Qb3NdLCBsZW4pOworICAgIG1Qb3MgKz0gbGVuOworfQorCisKKy8vIE91dHB1dCBzdHJlYW0gaW1wbGVtZW50YXRpb24KKworT1N0cmVhbTo6T1N0cmVhbSh1aW50NjRfdCBsZW4sIGJvb2wgdXNlNjQpCit7CisgICAgbURhdGEgPSAodWludDhfdCopbWFsbG9jKGxlbik7CisgICAgbUxlbmd0aCA9IGxlbjsKKyAgICBtUG9zID0gMDsKKyAgICBtVXNlNjQgPSB1c2U2NDsKK30KKworT1N0cmVhbTo6fk9TdHJlYW0oKQoreworICAgIGZyZWUobURhdGEpOworfQorCit2b2lkIE9TdHJlYW06OmFkZEJ5dGVBcnJheShjb25zdCB2b2lkICpzcmMsIHNpemVfdCBudW1CeXRlcykKK3sKKyAgICAvLyBXZSBuZWVkIHRvIHBvdGVudGlhbGx5IGdyb3cgbW9yZSB0aGFuIG9uY2UgaWYgdGhlIG51bWJlciBvZiBieWVzIHdlIHdyaXRlIGlzIHN1YnN0YW50aWFsCisgICAgd2hpbGUobVBvcyArIG51bUJ5dGVzID49IG1MZW5ndGgpIHsKKyAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICB9CisgICAgbWVtY3B5KG1EYXRhICsgbVBvcywgc3JjLCBudW1CeXRlcyk7CisgICAgbVBvcyArPSBudW1CeXRlczsKK30KKwordm9pZCBPU3RyZWFtOjphZGRPZmZzZXQodWludDY0X3QgdikKK3sKKyAgICBpZiAobVVzZTY0KSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDcpICYgKH43KTsKKyAgICAgICAgaWYobVBvcyArIHNpemVvZih2KSA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICBncm93U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkodiAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMTYpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMjQpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMzIpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gNDApICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gNDgpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gNTYpICYgMHhmZik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhZGRVMzIodik7CisgICAgfQorfQorCit2b2lkIE9TdHJlYW06OmFkZFN0cmluZyhTdHJpbmc4ICpzKQoreworICAgIHVpbnQzMl90IGxlbiA9IHMtPnNpemUoKTsKKyAgICBhZGRVMzIobGVuKTsKKyAgICBpZihtUG9zICsgbGVuKnNpemVvZihjaGFyKSA+PSBtTGVuZ3RoKSB7CisgICAgICAgIGdyb3dTaXplKCk7CisgICAgfQorICAgIGNoYXIgKnN0cmluZ0RhdGEgPSByZWludGVycHJldF9jYXN0PGNoYXIgKj4oJm1EYXRhW21Qb3NdKTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkgKyspIHsKKyAgICAgICAgc3RyaW5nRGF0YVtpXSA9IHMtPnN0cmluZygpW2ldOworICAgIH0KKyAgICBtUG9zICs9IGxlbipzaXplb2YoY2hhcik7Cit9CisKK3ZvaWQgT1N0cmVhbTo6Z3Jvd1NpemUoKQoreworICAgIHVpbnQ4X3QgKm5ld0RhdGEgPSAodWludDhfdCopbWFsbG9jKG1MZW5ndGgqMik7CisgICAgbWVtY3B5KG5ld0RhdGEsIG1EYXRhLCBtTGVuZ3RoKnNpemVvZih1aW50OF90KSk7CisgICAgbUxlbmd0aCA9IG1MZW5ndGggKiAyOworICAgIGZyZWUobURhdGEpOworICAgIG1EYXRhID0gbmV3RGF0YTsKK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU3RyZWFtLmggYi9saWJzL3JzL3JzU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwMWNkMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU3RyZWFtLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfU1RSRUFNX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19TVFJFQU1fSAorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK2NsYXNzIElTdHJlYW0KK3sKK3B1YmxpYzoKKyAgICBJU3RyZWFtKGNvbnN0IHVpbnQ4X3QgKiwgYm9vbCB1c2U2NCk7CisKKyAgICBmbG9hdCBsb2FkRigpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOworICAgICAgICBmbG9hdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKGZsb2F0KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgaW50MzJfdCBsb2FkSTMyKCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7CisgICAgICAgIGludDMyX3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKGludDMyX3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICB1aW50MzJfdCBsb2FkVTMyKCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7CisgICAgICAgIHVpbnQzMl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKKyAgICAgICAgbVBvcyArPSBzaXplb2YodWludDMyX3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICB1aW50MTZfdCBsb2FkVTE2KCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAxKSAmICh+MSk7CisgICAgICAgIHVpbnQxNl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDE2X3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKKyAgICAgICAgbVBvcyArPSBzaXplb2YodWludDE2X3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICBpbmxpbmUgdWludDhfdCBsb2FkVTgoKSB7CisgICAgICAgIHVpbnQ4X3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQ4X3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICB2b2lkIGxvYWRCeXRlQXJyYXkodm9pZCAqZGVzdCwgc2l6ZV90IG51bUJ5dGVzKTsKKyAgICB1aW50NjRfdCBsb2FkT2Zmc2V0KCk7CisgICAgdm9pZCBsb2FkU3RyaW5nKFN0cmluZzggKnMpOworICAgIHVpbnQ2NF90IGdldFBvcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Qb3M7CisgICAgfQorICAgIHZvaWQgcmVzZXQodWludDY0X3QgcG9zKSB7CisgICAgICAgIG1Qb3MgPSBwb3M7CisgICAgfQorICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1Qb3MgPSAwOworICAgIH0KKyAgICAKKyAgICBjb25zdCB1aW50OF90ICogZ2V0UHRyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURhdGE7CisgICAgfQorcHJvdGVjdGVkOgorICAgIGNvbnN0IHVpbnQ4X3QgKiBtRGF0YTsKKyAgICB1aW50NjRfdCBtUG9zOworICAgIGJvb2wgbVVzZTY0OworfTsKKworY2xhc3MgT1N0cmVhbQoreworcHVibGljOgorICAgIE9TdHJlYW0odWludDY0X3QgbGVuZ3RoLCBib29sIHVzZTY0KTsKKyAgICB+T1N0cmVhbSgpOworICAgIAorICAgIHZvaWQgYWxpZ24odWludDMyX3QgYnl0ZXMpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgKGJ5dGVzIC0gMSkpICYgKH4oYnl0ZXMgLSAxKSk7CisgICAgICAgIGlmKG1Qb3MgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIGFkZEYoZmxvYXQgdikgeworICAgICAgICB1aW50MzJfdCB1aW50ViA9ICpyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4gKCZ2KTsKKyAgICAgICAgYWRkVTMyKHVpbnRWKTsKKyAgICB9CisgICAgdm9pZCBhZGRJMzIoaW50MzJfdCB2KSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKKyAgICAgICAgaWYobVBvcyArIHNpemVvZih2KSA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICBncm93U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkodiAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMTYpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMjQpICYgMHhmZik7CisgICAgfQorICAgIHZvaWQgYWRkVTMyKHVpbnQzMl90IHYpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOworICAgICAgICBpZihtUG9zICsgc2l6ZW9mKHYpID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIGdyb3dTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSh2ICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiAyNCkgJiAweGZmKTsKKyAgICB9CisgICAgdm9pZCBhZGRVMTYodWludDE2X3QgdikgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAxKSAmICh+MSk7CisgICAgICAgIGlmKG1Qb3MgKyBzaXplb2YodikgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKHYgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSh2ID4+IDgpOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBhZGRVOCh1aW50OF90IHYpIHsKKyAgICAgICAgaWYobVBvcyArIDEgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJm1EYXRhW21Qb3NdKVswXSA9IHY7CisgICAgICAgIG1Qb3MgKys7CisgICAgfQorICAgIHZvaWQgYWRkQnl0ZUFycmF5KGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG51bUJ5dGVzKTsKKyAgICB2b2lkIGFkZE9mZnNldCh1aW50NjRfdCB2KTsKKyAgICB2b2lkIGFkZFN0cmluZyhTdHJpbmc4ICpzKTsKKyAgICB1aW50NjRfdCBnZXRQb3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUG9zOworICAgIH0KKyAgICB2b2lkIHJlc2V0KHVpbnQ2NF90IHBvcykgeworICAgICAgICBtUG9zID0gcG9zOworICAgIH0KKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICBtUG9zID0gMDsKKyAgICB9CisgICAgY29uc3QgdWludDhfdCAqIGdldFB0cigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KK3Byb3RlY3RlZDoKKyAgICB2b2lkIGdyb3dTaXplKCk7CisgICAgdWludDhfdCAqIG1EYXRhOworICAgIHVpbnQ2NF90IG1MZW5ndGg7CisgICAgdWludDY0X3QgbVBvczsKKyAgICBib29sIG1Vc2U2NDsKK307CisgICAgCisKK30gLy8gcmVuZGVyc2NyaXB0Cit9IC8vIGFuZHJvaWQKKyNlbmRpZiAvL0FORFJPSURfUlNfU1RSRUFNX0gKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzVHlwZS5jcHAgYi9saWJzL3JzL3JzVHlwZS5jcHAKaW5kZXggYzA5ZTk3OS4uNzljZmQ0MSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1R5cGUuY3BwCisrKyBiL2xpYnMvcnMvcnNUeXBlLmNwcApAQCAtMTQsOCArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC04NCw3ICs4OSw5IEBACiAgICAgICAgIG1MT0RDb3VudCA9IDE7CiAgICAgfQogICAgIGlmIChtTE9EQ291bnQgIT0gb2xkTE9EQ291bnQpIHsKLSAgICAgICAgZGVsZXRlIFtdIG1MT0RzOworICAgICAgICBpZihtTE9Ecyl7CisgICAgICAgICAgICBkZWxldGUgW10gbUxPRHM7CisgICAgICAgIH0KICAgICAgICAgbUxPRHMgPSBuZXcgTE9EW21MT0RDb3VudF07CiAgICAgfQogCkBAIC0xMzgsMTM2ICsxNDUsMzEgQEAKIAogdm9pZCBUeXBlOjptYWtlR0xDb21wb25lbnRzKCkKIHsKKyAgICBpZihnZXRFbGVtZW50KCktPmdldEZpZWxkQ291bnQoKSA+PSBSU19NQVhfQVRUUklCUykgeworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgdWludDMyX3QgdXNlck51bSA9IDA7CiAKICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgZ2V0RWxlbWVudCgpLT5nZXRGaWVsZENvdW50KCk7IGN0KyspIHsKICAgICAgICAgY29uc3QgQ29tcG9uZW50ICZjID0gZ2V0RWxlbWVudCgpLT5nZXRGaWVsZChjdCktPmdldENvbXBvbmVudCgpOwogCi0gICAgICAgIHN3aXRjaChjLmdldEtpbmQoKSkgewotICAgICAgICBjYXNlIFJTX0tJTkRfVVNFUjoKLSAgICAgICAgICAgIG1HTC5tVXNlclt1c2VyTnVtXS5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7Ci0gICAgICAgICAgICBtR0wubVVzZXJbdXNlck51bV0ub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOwotICAgICAgICAgICAgbUdMLm1Vc2VyW3VzZXJOdW1dLnR5cGUgPSBjLmdldEdMVHlwZSgpOwotICAgICAgICAgICAgbUdMLm1Vc2VyW3VzZXJOdW1dLm5vcm1hbGl6ZWQgPSBjLmdldFR5cGUoKSAhPSBSU19UWVBFX0ZMT0FUXzMyOy8vYy5nZXRJc05vcm1hbGl6ZWQoKTsKLSAgICAgICAgICAgIG1HTC5tVXNlclt1c2VyTnVtXS5uYW1lLnNldFRvKGdldEVsZW1lbnQoKS0+Z2V0RmllbGROYW1lKGN0KSk7Ci0gICAgICAgICAgICB1c2VyTnVtICsrOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX1BPU0lUSU9OOgotICAgICAgICAgICAgcnNBc3NlcnQobUdMLm1WdHguc2l6ZSA9PSAwKTsKLSAgICAgICAgICAgIG1HTC5tVnR4LnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKLSAgICAgICAgICAgIG1HTC5tVnR4Lm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKLSAgICAgICAgICAgIG1HTC5tVnR4LnR5cGUgPSBjLmdldEdMVHlwZSgpOwotICAgICAgICAgICAgbUdMLm1WdHgubm9ybWFsaXplZCA9IGZhbHNlOwotICAgICAgICAgICAgbUdMLm1WdHgubmFtZS5zZXRUbygiUG9zaXRpb24iKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9DT0xPUjoKLSAgICAgICAgICAgIHJzQXNzZXJ0KG1HTC5tQ29sb3Iuc2l6ZSA9PSAwKTsKLSAgICAgICAgICAgIG1HTC5tQ29sb3Iuc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOwotICAgICAgICAgICAgbUdMLm1Db2xvci5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7Ci0gICAgICAgICAgICBtR0wubUNvbG9yLnR5cGUgPSBjLmdldEdMVHlwZSgpOwotICAgICAgICAgICAgbUdMLm1Db2xvci5ub3JtYWxpemVkID0gYy5nZXRUeXBlKCkgIT0gUlNfVFlQRV9GTE9BVF8zMjsKLSAgICAgICAgICAgIG1HTC5tQ29sb3IubmFtZS5zZXRUbygiQ29sb3IiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9OT1JNQUw6Ci0gICAgICAgICAgICByc0Fzc2VydChtR0wubU5vcm0uc2l6ZSA9PSAwKTsKLSAgICAgICAgICAgIG1HTC5tTm9ybS5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7Ci0gICAgICAgICAgICBtR0wubU5vcm0ub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOwotICAgICAgICAgICAgbUdMLm1Ob3JtLnR5cGUgPSBjLmdldEdMVHlwZSgpOwotICAgICAgICAgICAgbUdMLm1Ob3JtLm5vcm1hbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1HTC5tTm9ybS5uYW1lLnNldFRvKCJOb3JtYWwiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9URVhUVVJFOgotICAgICAgICAgICAgcnNBc3NlcnQobUdMLm1UZXguc2l6ZSA9PSAwKTsKLSAgICAgICAgICAgIG1HTC5tVGV4LnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKLSAgICAgICAgICAgIG1HTC5tVGV4Lm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKLSAgICAgICAgICAgIG1HTC5tVGV4LnR5cGUgPSBjLmdldEdMVHlwZSgpOwotICAgICAgICAgICAgbUdMLm1UZXgubm9ybWFsaXplZCA9IGZhbHNlOwotICAgICAgICAgICAgbUdMLm1UZXgubmFtZS5zZXRUbygiVGV4dHVyZSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX1BPSU5UX1NJWkU6Ci0gICAgICAgICAgICByc0Fzc2VydCghbUdMLm1Qb2ludFNpemUuc2l6ZSk7Ci0gICAgICAgICAgICBtR0wubVBvaW50U2l6ZS5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7Ci0gICAgICAgICAgICBtR0wubVBvaW50U2l6ZS5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7Ci0gICAgICAgICAgICBtR0wubVBvaW50U2l6ZS50eXBlID0gYy5nZXRHTFR5cGUoKTsKLSAgICAgICAgICAgIG1HTC5tUG9pbnRTaXplLm5vcm1hbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1HTC5tUG9pbnRTaXplLm5hbWUuc2V0VG8oIlBvaW50U2l6ZSIpOwotICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKyAgICAgICAgbUF0dHJpYnNbdXNlck51bV0uc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOworICAgICAgICBtQXR0cmlic1t1c2VyTnVtXS5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7CisgICAgICAgIG1BdHRyaWJzW3VzZXJOdW1dLnR5cGUgPSBjLmdldEdMVHlwZSgpOworICAgICAgICBtQXR0cmlic1t1c2VyTnVtXS5ub3JtYWxpemVkID0gYy5nZXRUeXBlKCkgIT0gUlNfVFlQRV9GTE9BVF8zMjsvL2MuZ2V0SXNOb3JtYWxpemVkKCk7CisgICAgICAgIG1BdHRyaWJzW3VzZXJOdW1dLm5hbWUuc2V0VG8oZ2V0RWxlbWVudCgpLT5nZXRGaWVsZE5hbWUoY3QpKTsKKyAgICAgICAgdXNlck51bSArKzsKICAgICB9CiB9CiAKKwogdm9pZCBUeXBlOjplbmFibGVHTFZlcnRleEJ1ZmZlcihWZXJ0ZXhBcnJheSAqdmEpIGNvbnN0CiB7Ci0gICAgLy8gTm90ZTogV2UgYXJlIG9ubHkgZ29pbmcgdG8gZW5hYmxlIGJ1ZmZlcnMgYW5kIG5ldmVyIGRpc2FibGUgdGhlbQotICAgIC8vIGhlcmUuICBUaGUgcmVhc29uIGlzIG1vcmUgdGhhbiBvbmUgQWxsb2NhdGlvbiBtYXkgYmUgdXNlZCBhcyBhIHZlcnRleAotICAgIC8vIHNvdXJjZS4gIFNvIHdlIGNhbm5vdCBkaXNhYmxlIGFycmF5cyB0aGF0IG1heSBoYXZlIGJlZW4gaW4gdXNlIGJ5Ci0gICAgLy8gYW5vdGhlciBhbGxvY2F0aW9uLgotCi0gICAgdWludDMyX3Qgc3RyaWRlID0gbUVsZW1lbnQtPmdldFNpemVCeXRlcygpOwotICAgIGlmIChtR0wubVZ0eC5zaXplKSB7Ci0gICAgICAgIHZhLT5hZGRMZWdhY3kobUdMLm1WdHgudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBtR0wubVZ0eC5zaXplLAotICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICBSU19LSU5EX1BPU0lUSU9OLAotICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgIG1HTC5tVnR4Lm9mZnNldCk7Ci0gICAgfQotCi0gICAgaWYgKG1HTC5tTm9ybS5zaXplKSB7Ci0gICAgICAgIHZhLT5hZGRMZWdhY3kobUdMLm1Ob3JtLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAzLAotICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgUlNfS0lORF9OT1JNQUwsCi0gICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgIG1HTC5tTm9ybS5vZmZzZXQpOwotICAgIH0KLQotICAgIGlmIChtR0wubUNvbG9yLnNpemUpIHsKLSAgICAgICAgdmEtPmFkZExlZ2FjeShtR0wubUNvbG9yLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICBtR0wubUNvbG9yLnNpemUsCi0gICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICBSU19LSU5EX0NPTE9SLAotICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgIG1HTC5tQ29sb3Iub2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBpZiAobUdMLm1UZXguc2l6ZSkgewotICAgICAgICB2YS0+YWRkTGVnYWN5KG1HTC5tVGV4LnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICBtR0wubVRleC5zaXplLAotICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgUlNfS0lORF9URVhUVVJFLAotICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICBtR0wubVRleC5vZmZzZXQpOwotICAgIH0KLQotICAgIGlmIChtR0wubVBvaW50U2l6ZS5zaXplKSB7Ci0gICAgICAgIHZhLT5hZGRMZWdhY3kobUdMLm1Qb2ludFNpemUudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICBSU19LSU5EX1BPSU5UX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgIG1HTC5tUG9pbnRTaXplLm9mZnNldCk7Ci0gICAgfQotCi19Ci0KLXZvaWQgVHlwZTo6ZW5hYmxlR0xWZXJ0ZXhCdWZmZXIyKFZlcnRleEFycmF5ICp2YSkgY29uc3QKLXsKLSAgICAvLyBEbyBsZWdhY3kgYnVmZmVycwotICAgIGVuYWJsZUdMVmVydGV4QnVmZmVyKHZhKTsKLQogICAgIHVpbnQzMl90IHN0cmlkZSA9IG1FbGVtZW50LT5nZXRTaXplQnl0ZXMoKTsKICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgUlNfTUFYX0FUVFJJQlM7IGN0KyspIHsKLSAgICAgICAgaWYgKG1HTC5tVXNlcltjdF0uc2l6ZSkgewotICAgICAgICAgICAgdmEtPmFkZFVzZXIobUdMLm1Vc2VyW2N0XSwgc3RyaWRlKTsKKyAgICAgICAgaWYgKG1BdHRyaWJzW2N0XS5zaXplKSB7CisgICAgICAgICAgICB2YS0+YWRkKG1BdHRyaWJzW2N0XSwgc3RyaWRlKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTI4Myw2ICsxODUsNTcgQEAKICAgICBtRWxlbWVudC0+ZHVtcExPR1YoYnVmKTsKIH0KIAordm9pZCBUeXBlOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIC8vIE5lZWQgdG8gaWRlbnRpZnkgb3Vyc2VsdmVzCisgICAgc3RyZWFtLT5hZGRVMzIoKHVpbnQzMl90KWdldENsYXNzSWQoKSk7CisKKyAgICBTdHJpbmc4IG5hbWUoZ2V0TmFtZSgpKTsKKyAgICBzdHJlYW0tPmFkZFN0cmluZygmbmFtZSk7CisKKyAgICBtRWxlbWVudC0+c2VyaWFsaXplKHN0cmVhbSk7CisKKyAgICBzdHJlYW0tPmFkZFUzMihtRGltWCk7CisgICAgc3RyZWFtLT5hZGRVMzIobURpbVkpOworICAgIHN0cmVhbS0+YWRkVTMyKG1EaW1aKTsKKworICAgIHN0cmVhbS0+YWRkVTgoKHVpbnQ4X3QpKG1EaW1MT0QgPyAxIDogMCkpOworICAgIHN0cmVhbS0+YWRkVTgoKHVpbnQ4X3QpKG1GYWNlcyA/IDEgOiAwKSk7Cit9CisKK1R5cGUgKlR5cGU6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGFyZSByZWFkaW5nIHRoZSBjb3JyZWN0IG9iamVjdAorICAgIFJzQTNEQ2xhc3NJRCBjbGFzc0lEID0gKFJzQTNEQ2xhc3NJRClzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihjbGFzc0lEICE9IFJTX0EzRF9DTEFTU19JRF9UWVBFKSB7CisgICAgICAgIExPR0UoInR5cGUgbG9hZGluZyBza2lwcGVkIGR1ZSB0byBpbnZhbGlkIGNsYXNzIGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgU3RyaW5nOCBuYW1lOworICAgIHN0cmVhbS0+bG9hZFN0cmluZygmbmFtZSk7CisKKyAgICBFbGVtZW50ICplbGVtID0gRWxlbWVudDo6Y3JlYXRlRnJvbVN0cmVhbShyc2MsIHN0cmVhbSk7CisgICAgaWYoIWVsZW0pIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgVHlwZSAqdHlwZSA9IG5ldyBUeXBlKHJzYyk7CisgICAgdHlwZS0+bURpbVggPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICB0eXBlLT5tRGltWSA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgIHR5cGUtPm1EaW1aID0gc3RyZWFtLT5sb2FkVTMyKCk7CisKKyAgICB1aW50OF90IHRlbXAgPSBzdHJlYW0tPmxvYWRVOCgpOworICAgIHR5cGUtPm1EaW1MT0QgPSB0ZW1wICE9IDA7CisKKyAgICB0ZW1wID0gc3RyZWFtLT5sb2FkVTgoKTsKKyAgICB0eXBlLT5tRmFjZXMgPSB0ZW1wICE9IDA7CisKKyAgICB0eXBlLT5zZXRFbGVtZW50KGVsZW0pOworCisgICAgcmV0dXJuIHR5cGU7Cit9CisKIGJvb2wgVHlwZTo6Z2V0SXNOcDIoKSBjb25zdAogewogICAgIHVpbnQzMl90IHggPSBnZXREaW1YKCk7CkBAIC0zOTEsNiArMzQ0LDIyIEBACiAgICAgcmV0dXJuIHN0OwogfQogCit2b2lkIHJzaV9UeXBlR2V0TmF0aXZlRGF0YShDb250ZXh0ICpyc2MsIFJzVHlwZSB0eXBlLCB1aW50MzJfdCAqdHlwZURhdGEsIHVpbnQzMl90IHR5cGVEYXRhU2l6ZSkKK3sKKyAgICByc0Fzc2VydCh0eXBlRGF0YVNpemUgPT0gNik7CisgICAgLy8gUGFjayB0aGUgZGF0YSBpbiB0aGUgZm9sbG9maW5nIHdheSBtRGltWDsgbURpbVk7IG1EaW1aOworICAgIC8vIG1EaW1MT0Q7IG1EaW1GYWNlczsgbUVsZW1lbnQ7IGludG8gdHlwZURhdGEKKyAgICBUeXBlICp0ID0gc3RhdGljX2Nhc3Q8VHlwZSAqPih0eXBlKTsKKworICAgICgqdHlwZURhdGErKykgPSB0LT5nZXREaW1YKCk7CisgICAgKCp0eXBlRGF0YSsrKSA9IHQtPmdldERpbVkoKTsKKyAgICAoKnR5cGVEYXRhKyspID0gdC0+Z2V0RGltWigpOworICAgICgqdHlwZURhdGErKykgPSB0LT5nZXREaW1MT0QoKTsKKyAgICAoKnR5cGVEYXRhKyspID0gdC0+Z2V0RGltRmFjZXMoKSA/IDEgOiAwOworICAgICgqdHlwZURhdGErKykgPSAodWludDMyX3QpdC0+Z2V0RWxlbWVudCgpOworCit9CisKIAogfQogfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1R5cGUuaCBiL2xpYnMvcnMvcnNUeXBlLmgKaW5kZXggYzI1NTc3Yy4uNWI1MWUyMCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1R5cGUuaAorKysgYi9saWJzL3JzL3JzVHlwZS5oCkBAIC03MSw5ICs3MSwxMSBAQAogICAgIHZvaWQgY29tcHV0ZSgpOwogCiAgICAgdm9pZCBlbmFibGVHTFZlcnRleEJ1ZmZlcihjbGFzcyBWZXJ0ZXhBcnJheSAqKSBjb25zdDsKLSAgICB2b2lkIGVuYWJsZUdMVmVydGV4QnVmZmVyMihjbGFzcyBWZXJ0ZXhBcnJheSAqKSBjb25zdDsKIAogICAgIHZvaWQgZHVtcExPR1YoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9UWVBFOyB9CisgICAgc3RhdGljIFR5cGUgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOwogCiBwcm90ZWN0ZWQ6CiAgICAgc3RydWN0IExPRCB7CkBAIC0xMTIsMTUgKzExNCw3IEBACiAgICAgTE9EICptTE9EczsKICAgICB1aW50MzJfdCBtTE9EQ291bnQ7CiAKLSAgICBzdHJ1Y3QgR0xTdGF0ZV90IHsKLSAgICAgICAgVmVydGV4QXJyYXk6OkF0dHJpYiBtVXNlcltSU19NQVhfQVRUUklCU107Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbVZ0eDsKLSAgICAgICAgVmVydGV4QXJyYXk6OkF0dHJpYiBtTm9ybTsKLSAgICAgICAgVmVydGV4QXJyYXk6OkF0dHJpYiBtQ29sb3I7Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbVRleDsKLSAgICAgICAgVmVydGV4QXJyYXk6OkF0dHJpYiBtUG9pbnRTaXplOwotICAgIH07Ci0gICAgR0xTdGF0ZV90IG1HTDsKKyAgICBWZXJ0ZXhBcnJheTo6QXR0cmliIG1BdHRyaWJzW1JTX01BWF9BVFRSSUJTXTsKICAgICB2b2lkIG1ha2VHTENvbXBvbmVudHMoKTsKIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNVdGlscy5oIGIvbGlicy9ycy9yc1V0aWxzLmgKaW5kZXggMDdmODkzMy4uMTdmZWIyMiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1V0aWxzLmgKKysrIGIvbGlicy9ycy9yc1V0aWxzLmgKQEAgLTE5LDE1ICsxOSwyMyBAQAogCiAjZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJSZW5kZXJTY3JpcHQiCisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorCisjaW5jbHVkZSAicnNTdHJlYW0uaCIKKwogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKwogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlIDxFR0wvZWdsLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPG1hdGguaD4KIAogI2luY2x1ZGUgIlJlbmRlclNjcmlwdC5oIgpAQCAtNDEsNiArNDksMjYgQEAKICNkZWZpbmUgcnNBc3NlcnQodikgd2hpbGUoMCkKICNlbmRpZgogCit0eXBlZGVmIGZsb2F0IHJzdkZfMiBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDgpKSk7Cit0eXBlZGVmIGZsb2F0IHJzdkZfNCBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDE2KSkpOwordHlwZWRlZiB1aW50OF90IHJzdlU4XzQgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICg0KSkpOworCit1bmlvbiBmbG9hdDIgeworICAgIHJzdkZfMiB2OworICAgIGZsb2F0IGZbMl07Cit9OworCit1bmlvbiBmbG9hdDQgeworICAgIHJzdkZfNCB2OworICAgIGZsb2F0IGZbNF07Cit9OworCit1bmlvbiB1Y2hhcjQgeworICAgIHJzdlU4XzQgdjsKKyAgICB1aW50OF90IGZbNF07CisgICAgdWludDMyX3QgcGFja2VkOworfTsKKwogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIFQgcnNNaW4oVCBpbjEsIFQgaW4yKQogewpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1ZlcnRleEFycmF5LmNwcCBiL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5jcHAKaW5kZXggNmMyMDAyZC4uMDc1YTcwZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1ZlcnRleEFycmF5LmNwcAorKysgYi9saWJzL3JzL3JzVmVydGV4QXJyYXkuY3BwCkBAIC0xNCwxMCArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmCisKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMzksNiArNDQsNyBAQAogICAgICAgICBtQXR0cmlic1tjdF0uY2xlYXIoKTsKICAgICB9CiAgICAgbUFjdGl2ZUJ1ZmZlciA9IDA7CisgICAgbUFjdGl2ZVBvaW50ZXIgPSBOVUxMOwogICAgIG1Db3VudCA9IDA7CiB9CiAKQEAgLTUwLDEyICs1NiwxMiBAQAogdm9pZCBWZXJ0ZXhBcnJheTo6QXR0cmliOjpzZXQoY29uc3QgQXR0cmliICZhKQogewogICAgIGJ1ZmZlciA9IGEuYnVmZmVyOworICAgIHB0ciA9IGEucHRyOwogICAgIG9mZnNldCA9IGEub2Zmc2V0OwogICAgIHR5cGUgPSBhLnR5cGU7CiAgICAgc2l6ZSA9IGEuc2l6ZTsKICAgICBzdHJpZGUgPSBhLnN0cmlkZTsKICAgICBub3JtYWxpemVkID0gYS5ub3JtYWxpemVkOwotICAgIGtpbmQgPSBSU19LSU5EX1VTRVI7CiAgICAgbmFtZS5zZXRUbyhhLm5hbWUpOwogfQogCkBAIC02Niw2ICs3Miw3IEBACiAgICAgdHlwZSA9IDA7CiAgICAgc2l6ZSA9IDA7CiAgICAgc3RyaWRlID0gMDsKKyAgICBwdHIgPSBOVUxMOwogICAgIG5vcm1hbGl6ZWQgPSBmYWxzZTsKICAgICBuYW1lLnNldFRvKCIiKTsKIH0KQEAgLTc1LDEzOCArODIsODcgQEAKICAgICBtQXR0cmlic1tuXS5jbGVhcigpOwogfQogCi12b2lkIFZlcnRleEFycmF5OjphZGRVc2VyKGNvbnN0IEF0dHJpYiAmYSwgdWludDMyX3Qgc3RyaWRlKQordm9pZCBWZXJ0ZXhBcnJheTo6YWRkKGNvbnN0IEF0dHJpYiAmYSwgdWludDMyX3Qgc3RyaWRlKQogewotICAgIGFzc2VydChtQ291bnQgPCBSU19NQVhfQVRUUklCUyk7CisgICAgcnNBc3NlcnQobUNvdW50IDwgUlNfTUFYX0FUVFJJQlMpOwogICAgIG1BdHRyaWJzW21Db3VudF0uc2V0KGEpOwogICAgIG1BdHRyaWJzW21Db3VudF0uYnVmZmVyID0gbUFjdGl2ZUJ1ZmZlcjsKKyAgICBtQXR0cmlic1ttQ291bnRdLnB0ciA9IG1BY3RpdmVQb2ludGVyOwogICAgIG1BdHRyaWJzW21Db3VudF0uc3RyaWRlID0gc3RyaWRlOwotICAgIG1BdHRyaWJzW21Db3VudF0ua2luZCA9IFJTX0tJTkRfVVNFUjsKICAgICBtQ291bnQgKys7CiB9CiAKLXZvaWQgVmVydGV4QXJyYXk6OmFkZExlZ2FjeSh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBzdHJpZGUsIFJzRGF0YUtpbmQga2luZCwgYm9vbCBub3JtYWxpemVkLCB1aW50MzJfdCBvZmZzZXQpCit2b2lkIFZlcnRleEFycmF5OjphZGQodWludDMyX3QgdHlwZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3Qgc3RyaWRlLCBib29sIG5vcm1hbGl6ZWQsIHVpbnQzMl90IG9mZnNldCwgY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgICBhc3NlcnQobUNvdW50IDwgUlNfTUFYX0FUVFJJQlMpOworICAgIHJzQXNzZXJ0KG1Db3VudCA8IFJTX01BWF9BVFRSSUJTKTsKICAgICBtQXR0cmlic1ttQ291bnRdLmNsZWFyKCk7CiAgICAgbUF0dHJpYnNbbUNvdW50XS50eXBlID0gdHlwZTsKICAgICBtQXR0cmlic1ttQ291bnRdLnNpemUgPSBzaXplOwogICAgIG1BdHRyaWJzW21Db3VudF0ub2Zmc2V0ID0gb2Zmc2V0OwogICAgIG1BdHRyaWJzW21Db3VudF0ubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQ7Ci0gICAgbUF0dHJpYnNbbUNvdW50XS5idWZmZXIgPSBtQWN0aXZlQnVmZmVyOwogICAgIG1BdHRyaWJzW21Db3VudF0uc3RyaWRlID0gc3RyaWRlOwotICAgIG1BdHRyaWJzW21Db3VudF0ua2luZCA9IGtpbmQ7CisgICAgbUF0dHJpYnNbbUNvdW50XS5uYW1lLnNldFRvKG5hbWUpOworCisgICAgbUF0dHJpYnNbbUNvdW50XS5idWZmZXIgPSBtQWN0aXZlQnVmZmVyOworICAgIG1BdHRyaWJzW21Db3VudF0ucHRyID0gbUFjdGl2ZVBvaW50ZXI7CiAgICAgbUNvdW50ICsrOwogfQogCiB2b2lkIFZlcnRleEFycmF5Ojpsb2dBdHRyaWIodWludDMyX3QgaWR4LCB1aW50MzJfdCBzbG90KSBjb25zdCB7Ci0gICAgTE9HRSgidmEgJWk6IHNsb3Q9JWkgbmFtZT0lcyBidWY9JWkgIHNpemU9JWkgIHR5cGU9MHgleCAga2luZD0laSAgc3RyaWRlPTB4JXggIG5vcm09JWkgIG9mZnNldD0weCV4IiwgaWR4LCBzbG90LAorICAgIExPR0UoInZhICVpOiBzbG90PSVpIG5hbWU9JXMgYnVmPSVpIHB0cj0lcCBzaXplPSVpICB0eXBlPTB4JXggIHN0cmlkZT0weCV4ICBub3JtPSVpICBvZmZzZXQ9MHgleCIsIGlkeCwgc2xvdCwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0ubmFtZS5zdHJpbmcoKSwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0uYnVmZmVyLAorICAgICAgICAgbUF0dHJpYnNbaWR4XS5wdHIsCiAgICAgICAgICBtQXR0cmlic1tpZHhdLnNpemUsCiAgICAgICAgICBtQXR0cmlic1tpZHhdLnR5cGUsCi0gICAgICAgICBtQXR0cmlic1tpZHhdLmtpbmQsCiAgICAgICAgICBtQXR0cmlic1tpZHhdLnN0cmlkZSwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0ubm9ybWFsaXplZCwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0ub2Zmc2V0KTsKIH0KIAotdm9pZCBWZXJ0ZXhBcnJheTo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIGNsYXNzIFZlcnRleEFycmF5U3RhdGUgKnN0YXRlKSBjb25zdAotewotICAgIGdsQ2xpZW50QWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7Ci0gICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKLSAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7Ci0gICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Ci0gICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfUE9JTlRfU0laRV9BUlJBWV9PRVMpOwotCi0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1Db3VudDsgY3QrKykgewotICAgICAgICBzd2l0Y2gobUF0dHJpYnNbY3RdLmtpbmQpIHsKLSAgICAgICAgY2FzZSBSU19LSU5EX1BPU0lUSU9OOgotICAgICAgICAgICAgLy9sb2dBdHRyaWIoUE9TSVRJT04pOwotICAgICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOwotICAgICAgICAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUF0dHJpYnNbY3RdLmJ1ZmZlcik7Ci0gICAgICAgICAgICBnbFZlcnRleFBvaW50ZXIobUF0dHJpYnNbY3RdLnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1BdHRyaWJzW2N0XS5vZmZzZXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX05PUk1BTDoKLSAgICAgICAgICAgIC8vbG9nQXR0cmliKE5PUk1BTCk7Ci0gICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7Ci0gICAgICAgICAgICByc0Fzc2VydChtQXR0cmlic1tjdF0uc2l6ZSA9PSAzKTsKLSAgICAgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1BdHRyaWJzW2N0XS5idWZmZXIpOwotICAgICAgICAgICAgZ2xOb3JtYWxQb2ludGVyKG1BdHRyaWJzW2N0XS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltQXR0cmlic1tjdF0ub2Zmc2V0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9DT0xPUjoKLSAgICAgICAgICAgIC8vbG9nQXR0cmliKENPTE9SKTsKLSAgICAgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfQ09MT1JfQVJSQVkpOwotICAgICAgICAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUF0dHJpYnNbY3RdLmJ1ZmZlcik7Ci0gICAgICAgICAgICBnbENvbG9yUG9pbnRlcihtQXR0cmlic1tjdF0uc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfVEVYVFVSRToKLSAgICAgICAgICAgIC8vbG9nQXR0cmliKFRFWFRVUkUpOwotICAgICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKLSAgICAgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1BdHRyaWJzW2N0XS5idWZmZXIpOwotICAgICAgICAgICAgZ2xUZXhDb29yZFBvaW50ZXIobUF0dHJpYnNbY3RdLnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1BdHRyaWJzW2N0XS5vZmZzZXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX1BPSU5UX1NJWkU6Ci0gICAgICAgICAgICAvL2xvZ0F0dHJpYihQT0lOVF9TSVpFKTsKLSAgICAgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfUE9JTlRfU0laRV9BUlJBWV9PRVMpOwotICAgICAgICAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUF0dHJpYnNbY3RdLmJ1ZmZlcik7Ci0gICAgICAgICAgICBnbFBvaW50U2l6ZVBvaW50ZXJPRVMobUF0dHJpYnNbY3RdLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1BdHRyaWJzW2N0XS5vZmZzZXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJzQXNzZXJ0KDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcnNjLT5jaGVja0Vycm9yKCJWZXJ0ZXhBcnJheTo6c2V0dXBHTCIpOwotfQotCiB2b2lkIFZlcnRleEFycmF5OjpzZXR1cEdMMihjb25zdCBDb250ZXh0ICpyc2MsIGNsYXNzIFZlcnRleEFycmF5U3RhdGUgKnN0YXRlLCBTaGFkZXJDYWNoZSAqc2MpIGNvbnN0CiB7CiAgICAgcnNjLT5jaGVja0Vycm9yKCJWZXJ0ZXhBcnJheTo6c2V0dXBHTDIgc3RhcnQiKTsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTE7IGN0IDw9IHN0YXRlLT5tTGFzdEVuYWJsZUNvdW50OyBjdCsrKSB7CisgICAgZm9yICh1aW50MzJfdCBjdD0xOyBjdCA8PSAweGYvKnN0YXRlLT5tTGFzdEVuYWJsZUNvdW50Ki87IGN0KyspIHsKICAgICAgICAgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoY3QpOwogICAgIH0KIAogICAgIHJzYy0+Y2hlY2tFcnJvcigiVmVydGV4QXJyYXk6OnNldHVwR0wyIGRpc2FibGVkIik7CiAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1Db3VudDsgY3QrKykgewotICAgICAgICB1aW50MzJfdCBzbG90ID0gMDsKKyAgICAgICAgaW50MzJfdCBzbG90ID0gMDsKKworICAgICAgICBpZiAobUF0dHJpYnNbY3RdLm5hbWVbMF0gPT0gJyMnKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChzYy0+aXNVc2VyVmVydGV4UHJvZ3JhbSgpKSB7CiAgICAgICAgICAgICBzbG90ID0gc2MtPnZ0eEF0dHJpYlNsb3QoY3QpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1BdHRyaWJzW2N0XS5raW5kID09IFJTX0tJTkRfVVNFUikgeworICAgICAgICAgICAgaWYgKG1BdHRyaWJzW2N0XS5uYW1lID09ICJwb3NpdGlvbiIpIHsKKyAgICAgICAgICAgICAgICBzbG90ID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUF0dHJpYnNbY3RdLm5hbWUgPT0gImNvbG9yIikgeworICAgICAgICAgICAgICAgIHNsb3QgPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChtQXR0cmlic1tjdF0ubmFtZSA9PSAibm9ybWFsIikgeworICAgICAgICAgICAgICAgIHNsb3QgPSAyOworICAgICAgICAgICAgfSBlbHNlIGlmIChtQXR0cmlic1tjdF0ubmFtZSA9PSAidGV4dHVyZTAiKSB7CisgICAgICAgICAgICAgICAgc2xvdCA9IDM7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xvdCA9IHNjLT52dHhBdHRyaWJTbG90KG1BdHRyaWJzW2N0XS5raW5kKTsKKyAgICAgICAgfQorICAgICAgICBpZihzbG90IDwgMCkgeworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAogICAgICAgICAvL2xvZ0F0dHJpYihjdCwgc2xvdCk7CiAgICAgICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoc2xvdCk7CiAgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1BdHRyaWJzW2N0XS5idWZmZXIpOwotCiAgICAgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihzbG90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0udHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5ub3JtYWxpemVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0ucHRyICsgbUF0dHJpYnNbY3RdLm9mZnNldCk7CiAgICAgfQogICAgIHN0YXRlLT5tTGFzdEVuYWJsZUNvdW50ID0gbUNvdW50OwogICAgIHJzYy0+Y2hlY2tFcnJvcigiVmVydGV4QXJyYXk6OnNldHVwR0wyIGRvbmUiKTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5oIGIvbGlicy9ycy9yc1ZlcnRleEFycmF5LmgKaW5kZXggMzkwNGNiNi4uN2M2MDliMiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1ZlcnRleEFycmF5LmgKKysrIGIvbGlicy9ycy9yc1ZlcnRleEFycmF5LmgKQEAgLTM3LDEzICszNywxMyBAQAogICAgIGNsYXNzIEF0dHJpYiB7CiAgICAgcHVibGljOgogICAgICAgICB1aW50MzJfdCBidWZmZXI7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBwdHI7CiAgICAgICAgIHVpbnQzMl90IG9mZnNldDsKICAgICAgICAgdWludDMyX3QgdHlwZTsKICAgICAgICAgdWludDMyX3Qgc2l6ZTsKICAgICAgICAgdWludDMyX3Qgc3RyaWRlOwogICAgICAgICBib29sIG5vcm1hbGl6ZWQ7CiAgICAgICAgIFN0cmluZzggbmFtZTsKLSAgICAgICAgUnNEYXRhS2luZCBraW5kOwogCiAgICAgICAgIEF0dHJpYigpOwogICAgICAgICB2b2lkIHNldChjb25zdCBBdHRyaWIgJik7CkBAIC01Miw5ICs1MiwxOCBAQAogCiAKICAgICB2b2lkIGNsZWFyQWxsKCk7Ci0gICAgdm9pZCBzZXRBY3RpdmVCdWZmZXIodWludDMyX3QgaWQpIHttQWN0aXZlQnVmZmVyID0gaWQ7fQotICAgIHZvaWQgYWRkVXNlcihjb25zdCBBdHRyaWIgJiwgdWludDMyX3Qgc3RyaWRlKTsKLSAgICB2b2lkIGFkZExlZ2FjeSh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBzdHJpZGUsIFJzRGF0YUtpbmQga2luZCwgYm9vbCBub3JtYWxpemVkLCB1aW50MzJfdCBvZmZzZXQpOworICAgIHZvaWQgc2V0QWN0aXZlQnVmZmVyKHVpbnQzMl90IGlkKSB7CisgICAgICAgIG1BY3RpdmVCdWZmZXIgPSBpZDsKKyAgICAgICAgbUFjdGl2ZVBvaW50ZXIgPSBOVUxMOworICAgIH0KKyAgICB2b2lkIHNldEFjdGl2ZUJ1ZmZlcihjb25zdCB2b2lkICpwdHIpIHsKKyAgICAgICAgbUFjdGl2ZUJ1ZmZlciA9IDA7CisgICAgICAgIG1BY3RpdmVQb2ludGVyID0gKGNvbnN0IHVpbnQ4X3QgKilwdHI7CisgICAgfQorCisgICAgdm9pZCBhZGQoY29uc3QgQXR0cmliICYsIHVpbnQzMl90IHN0cmlkZSk7CisgICAgLy92b2lkIGFkZExlZ2FjeSh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBzdHJpZGUsIGJvb2wgbm9ybWFsaXplZCwgdWludDMyX3Qgb2Zmc2V0KTsKKyAgICB2b2lkIGFkZCh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBzdHJpZGUsIGJvb2wgbm9ybWFsaXplZCwgdWludDMyX3Qgb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lKTsKIAogICAgIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIGNsYXNzIFZlcnRleEFycmF5U3RhdGUgKikgY29uc3Q7CiAgICAgdm9pZCBzZXR1cEdMMihjb25zdCBDb250ZXh0ICpyc2MsIGNsYXNzIFZlcnRleEFycmF5U3RhdGUgKiwgU2hhZGVyQ2FjaGUgKikgY29uc3Q7CkBAIC02Myw2ICs3Miw3IEBACiBwcm90ZWN0ZWQ6CiAgICAgdm9pZCBjbGVhcih1aW50MzJfdCBpbmRleCk7CiAgICAgdWludDMyX3QgbUFjdGl2ZUJ1ZmZlcjsKKyAgICBjb25zdCB1aW50OF90ICogbUFjdGl2ZVBvaW50ZXI7CiAgICAgdWludDMyX3QgbUNvdW50OwogCiAgICAgQXR0cmliIG1BdHRyaWJzW1JTX01BWF9BVFRSSUJTXTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNnX1NjcmlwdEphdmFDbGFzcy5jcHAgYi9saWJzL3JzL3JzZ19TY3JpcHRKYXZhQ2xhc3MuY3BwCmluZGV4IGNlZTlmNTIuLjAxNjliOTggMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNnX1NjcmlwdEphdmFDbGFzcy5jcHAKKysrIGIvbGlicy9ycy9yc2dfU2NyaXB0SmF2YUNsYXNzLmNwcApAQCAtNyw4ICs3LDEyIEBACiBzdHJ1Y3QgRWxlbWVudDsKIAogc3RydWN0IEVsZW1lbnRGaWVsZCB7CisgICAgLy8gQW4gRWxlbWVudCBGaWVsZCBpcyBhIGNvbWJpbmF0aW9uIG9mIGFuIEVsZW1lbnQgd2l0aCBhIG5hbWUgYXNzaWduZWQuCisKICAgICBjb25zdCBjaGFyICpuYW1lOwogICAgIEVsZW1lbnQgKmU7CisKKwogICAgIEVsZW1lbnRGaWVsZChjb25zdCBjaGFyICpuLCBFbGVtZW50ICpfZSkgewogICAgICAgICBuYW1lID0gbjsKICAgICAgICAgZSA9IF9lOwpAQCAtMjAsMTIgKzI0LDIxIEBACiB9OwogCiBzdHJ1Y3QgRWxlbWVudCB7CisgICAgLy8gQW4gRWxlbWVudCBjYW4gdGFrZSBvbmUgb2YgdHdvIGZvcm1zLgorICAgIC8vIDE6IEJhc2ljLiAgSXQgY29udGFpbnMgYSBzaW5nbGUgYmFzaWMgdHlwZSBhbmQgdmVjdG9yIHNpemUuCisgICAgLy8gMjogQ29tcGxleC4gIEl0IGNvbnRhaW5zIGEgbGlzdCBvZiBmaWVsZHMgd2l0aCBuYW1lcy4gIEVhY2ggZmllbGQKKyAgICAvLyB3aWxsIGluIHR1cm4gYmUgYW5vdGhlciBlbGVtZW50LgorCiAgICAgRWxlbWVudEZpZWxkICpmaWVsZHM7Ci0gICAgc2l6ZV90IGZpZWxkQ291bnQ7CisgICAgc2l6ZV90IGZpZWxkQ291bnQ7ICAvLyBJZiBmaWVsZCBjb3VudCBpcyAwLCB0aGUgZWxlbWVudCBpcyBhIEJhc2ljIHR5cGUuCiAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICBib29sIGdlbmVyYXRlZDsKIAorICAgIC8vIFRoZSBiYXNpYyBkYXRhIHR5cGUgZnJvbSBSZW5kZXJTY3JpcHQuaAogICAgIFJzRGF0YVR5cGUgY29tcFR5cGU7CisKKyAgICAvLyBUaGUgdmVjdG9yIHNpemUgb2YgdGhlIGRhdGEgdHlwZSBmb3IgZmxvYXQyLCBmbG9hdDMsIC4uLi4KKyAgICAvLyBBbGxvd2VkIHNpemVzIGFyZSAyLDMsNCw4LDE2CiAgICAgdWludDMyX3QgY29tcFZlY3RvclNpemU7CiAKICAgICBFbGVtZW50KCkgewpkaWZmIC0tZ2l0IGEvbGlicy9ycy9zY3JpcHRjL3JzX2NsLnJzaCBiL2xpYnMvcnMvc2NyaXB0Yy9yc19jbC5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4NDRhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvc2NyaXB0Yy9yc19jbC5yc2gKQEAgLTAsMCArMSw3ODUgQEAKKyNpZm5kZWYgX19SU19DTF9SU0hfXworI2RlZmluZSBfX1JTX0NMX1JTSF9fCisKKyNkZWZpbmUgTV9QSSAgICAgICAgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI4OGYgICAvKiBwaSAqLworCisKKy8vIENvbnZlcnNpb25zCisjZGVmaW5lIENWVF9GVU5DXzIodHlwZW91dCwgdHlwZWluKSBcCitzdGF0aWMgdHlwZW91dCMjMiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb252ZXJ0XyMjdHlwZW91dCMjMih0eXBlaW4jIzIgdikgeyBcCisgICAgdHlwZW91dCMjMiByID0geyh0eXBlb3V0KXYueCwgKHR5cGVvdXQpdi55fTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyB0eXBlb3V0IyMzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvbnZlcnRfIyN0eXBlb3V0IyMzKHR5cGVpbiMjMyB2KSB7IFwKKyAgICB0eXBlb3V0IyMzIHIgPSB7KHR5cGVvdXQpdi54LCAodHlwZW91dCl2LnksICh0eXBlb3V0KXYuen07IFwKKyAgICByZXR1cm4gcjsgXAorfSBcCitzdGF0aWMgdHlwZW91dCMjNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb252ZXJ0XyMjdHlwZW91dCMjNCh0eXBlaW4jIzQgdikgeyBcCisgICAgdHlwZW91dCMjNCByID0geyh0eXBlb3V0KXYueCwgKHR5cGVvdXQpdi55LCAodHlwZW91dCl2LnosICh0eXBlb3V0KXYud307IFwKKyAgICByZXR1cm4gcjsgXAorfQorCisjZGVmaW5lIENWVF9GVU5DKHR5cGUpICAgICAgQ1ZUX0ZVTkNfMih0eXBlLCB1Y2hhcikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgY2hhcikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgdXNob3J0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZUX0ZVTkNfMih0eXBlLCBzaG9ydCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgaW50KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZUX0ZVTkNfMih0eXBlLCB1aW50KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZUX0ZVTkNfMih0eXBlLCBmbG9hdCkKKworQ1ZUX0ZVTkMoY2hhcikKK0NWVF9GVU5DKHVjaGFyKQorQ1ZUX0ZVTkMoc2hvcnQpCitDVlRfRlVOQyh1c2hvcnQpCitDVlRfRlVOQyhpbnQpCitDVlRfRlVOQyh1aW50KQorQ1ZUX0ZVTkMoZmxvYXQpCisKKworCisvLyBGbG9hdCBvcHMsIDYuMTEuMgorCisjZGVmaW5lIERFRl9GVU5DXzEoZm5jKSBcCitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZuYyhmbG9hdDIgdikgeyBcCisgICAgZmxvYXQyIHI7IFwKKyAgICByLnggPSBmbmModi54KTsgXAorICAgIHIueSA9IGZuYyh2LnkpOyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQzIHYpIHsgXAorICAgIGZsb2F0MyByOyBcCisgICAgci54ID0gZm5jKHYueCk7IFwKKyAgICByLnkgPSBmbmModi55KTsgXAorICAgIHIueiA9IGZuYyh2LnopOyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQ0IHYpIHsgXAorICAgIGZsb2F0NCByOyBcCisgICAgci54ID0gZm5jKHYueCk7IFwKKyAgICByLnkgPSBmbmModi55KTsgXAorICAgIHIueiA9IGZuYyh2LnopOyBcCisgICAgci53ID0gZm5jKHYudyk7IFwKKyAgICByZXR1cm4gcjsgXAorfQorCisjZGVmaW5lIERFRl9GVU5DXzIoZm5jKSBcCitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZuYyhmbG9hdDIgdjEsIGZsb2F0MiB2MikgeyBcCisgICAgZmxvYXQyIHI7IFwKKyAgICByLnggPSBmbmModjEueCwgdjIueCk7IFwKKyAgICByLnkgPSBmbmModjEueSwgdjIueSk7IFwKKyAgICByZXR1cm4gcjsgXAorfSBcCitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZuYyhmbG9hdDMgdjEsIGZsb2F0MyB2MikgeyBcCisgICAgZmxvYXQzIHI7IFwKKyAgICByLnggPSBmbmModjEueCwgdjIueCk7IFwKKyAgICByLnkgPSBmbmModjEueSwgdjIueSk7IFwKKyAgICByLnogPSBmbmModjEueiwgdjIueik7IFwKKyAgICByZXR1cm4gcjsgXAorfSBcCitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZuYyhmbG9hdDQgdjEsIGZsb2F0NCB2MikgeyBcCisgICAgZmxvYXQ0IHI7IFwKKyAgICByLnggPSBmbmModjEueCwgdjIueCk7IFwKKyAgICByLnkgPSBmbmModjEueSwgdjIueSk7IFwKKyAgICByLnogPSBmbmModjEueiwgdjIueik7IFwKKyAgICByLncgPSBmbmModjEudywgdjIueik7IFwKKyAgICByZXR1cm4gcjsgXAorfQorCisjZGVmaW5lIERFRl9GVU5DXzJGKGZuYykgXAorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQyIHYxLCBmbG9hdCB2MikgeyBcCisgICAgZmxvYXQyIHI7IFwKKyAgICByLnggPSBmbmModjEueCwgdjIpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyKTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0MyB2MSwgZmxvYXQgdjIpIHsgXAorICAgIGZsb2F0MyByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyKTsgXAorICAgIHIueSA9IGZuYyh2MS55LCB2Mik7IFwKKyAgICByLnogPSBmbmModjEueiwgdjIpOyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQ0IHYxLCBmbG9hdCB2MikgeyBcCisgICAgZmxvYXQ0IHI7IFwKKyAgICByLnggPSBmbmModjEueCwgdjIpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyKTsgXAorICAgIHIueiA9IGZuYyh2MS56LCB2Mik7IFwKKyAgICByLncgPSBmbmModjEudywgdjIpOyBcCisgICAgcmV0dXJuIHI7IFwKK30KKworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdCk7CitERUZfRlVOQ18xKGFjb3MpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zaChmbG9hdCk7CitERUZfRlVOQ18xKGFjb3NoKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvc3BpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gYWNvcyh2KSAvIE1fUEk7Cit9CitERUZfRlVOQ18xKGFjb3NwaSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQpOworREVGX0ZVTkNfMShhc2luKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXNpbmgoZmxvYXQpOworREVGX0ZVTkNfMShhc2luaCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW5waShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGFzaW4odikgLyBNX1BJOworfQorREVGX0ZVTkNfMShhc2lucGkpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuKGZsb2F0KTsKK0RFRl9GVU5DXzEoYXRhbikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4yKGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGF0YW4yKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbmgoZmxvYXQpOworREVGX0ZVTkNfMShhdGFuaCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW5waShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGF0YW4odikgLyBNX1BJOworfQorREVGX0ZVTkNfMShhdGFucGkpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMnBpKGZsb2F0IHksIGZsb2F0IHgpIHsKKyAgICByZXR1cm4gYXRhbjIoeSwgeCkgLyBNX1BJOworfQorREVGX0ZVTkNfMihhdGFuMnBpKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2JydChmbG9hdCk7CitERUZfRlVOQ18xKGNicnQpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0KTsKK0RFRl9GVU5DXzEoY2VpbCkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcHlzaWduKGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGNvcHlzaWduKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zKGZsb2F0KTsKK0RFRl9GVU5DXzEoY29zKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zaChmbG9hdCk7CitERUZfRlVOQ18xKGNvc2gpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3NwaShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGNvcyh2ICogTV9QSSk7Cit9CitERUZfRlVOQ18xKGNvc3BpKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXJmYyhmbG9hdCk7CitERUZfRlVOQ18xKGVyZmMpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBlcmYoZmxvYXQpOworREVGX0ZVTkNfMShlcmYpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQpOworREVGX0ZVTkNfMShleHApCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0KTsKK0RFRl9GVU5DXzEoZXhwMikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvdyhmbG9hdCwgZmxvYXQpOworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDEwKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gcG93KDEwLmYsIHYpOworfQorREVGX0ZVTkNfMShleHAxMCkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cG0xKGZsb2F0KTsKK0RFRl9GVU5DXzEoZXhwbTEpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmYWJzKGZsb2F0KTsKK0RFRl9GVU5DXzEoZmFicykKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZkaW0oZmxvYXQsIGZsb2F0KTsKK0RFRl9GVU5DXzIoZmRpbSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0KTsKK0RFRl9GVU5DXzEoZmxvb3IpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWEoZmxvYXQsIGZsb2F0LCBmbG9hdCk7CitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYShmbG9hdDIsIGZsb2F0MiwgZmxvYXQyKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1hKGZsb2F0MywgZmxvYXQzLCBmbG9hdDMpOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWEoZmxvYXQ0LCBmbG9hdDQsIGZsb2F0NCk7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGZtYXgpOworREVGX0ZVTkNfMkYoZm1heCk7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGZtaW4pOworREVGX0ZVTkNfMkYoZm1pbik7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGZtb2QpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmcmFjdChmbG9hdCB2LCBmbG9hdCAqaXB0cikgeworICAgIGludCBpID0gKGludClmbG9vcih2KTsKKyAgICBpcHRyWzBdID0gaTsKKyAgICByZXR1cm4gZm1pbih2IC0gaSwgMHgxLmZmZmZmZXAtMWYpOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmcmFjdChmbG9hdDIgdiwgZmxvYXQyICppcHRyKSB7CisgICAgZmxvYXQgdFsyXTsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSBmcmFjdCh2LngsICZ0WzBdKTsKKyAgICByLnkgPSBmcmFjdCh2LnksICZ0WzFdKTsKKyAgICBpcHRyWzBdID0gdFswXTsKKyAgICBpcHRyWzFdID0gdFsxXTsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJhY3QoZmxvYXQzIHYsIGZsb2F0MyAqaXB0cikgeworICAgIGZsb2F0IHRbM107CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gZnJhY3Qodi54LCAmdFswXSk7CisgICAgci55ID0gZnJhY3Qodi55LCAmdFsxXSk7CisgICAgci56ID0gZnJhY3Qodi56LCAmdFsyXSk7CisgICAgaXB0clswXSA9IHRbMF07CisgICAgaXB0clsxXSA9IHRbMV07CisgICAgaXB0clsyXSA9IHRbMl07CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyYWN0KGZsb2F0NCB2LCBmbG9hdDQgKmlwdHIpIHsKKyAgICBmbG9hdCB0WzRdOworICAgIGZsb2F0NCByOworICAgIHIueCA9IGZyYWN0KHYueCwgJnRbMF0pOworICAgIHIueSA9IGZyYWN0KHYueSwgJnRbMV0pOworICAgIHIueiA9IGZyYWN0KHYueiwgJnRbMl0pOworICAgIHIudyA9IGZyYWN0KHYudywgJnRbM10pOworICAgIGlwdHJbMF0gPSB0WzBdOworICAgIGlwdHJbMV0gPSB0WzFdOworICAgIGlwdHJbMl0gPSB0WzJdOworICAgIGlwdHJbM10gPSB0WzNdOworICAgIHJldHVybiByOworfQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJleHAoZmxvYXQsIGZsb2F0ICopOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmcmV4cChmbG9hdDIsIGZsb2F0MiAqKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJleHAoZmxvYXQzLCBmbG9hdDMgKik7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyZXhwKGZsb2F0NCwgZmxvYXQ0ICopOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgaHlwb3QoZmxvYXQsIGZsb2F0KTsKK0RFRl9GVU5DXzIoaHlwb3QpCisKK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgaWxvZ2IoZmxvYXQpOworREVGX0ZVTkNfMShpbG9nYikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxkZXhwKGZsb2F0LCBpbnQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZGV4cChmbG9hdDIsIGludDIpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZGV4cChmbG9hdDMsIGludDMpOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZGV4cChmbG9hdDQsIGludDQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZGV4cChmbG9hdDIsIGludCk7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxkZXhwKGZsb2F0MywgaW50KTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQ0LCBpbnQpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGdhbW1hKGZsb2F0KTsKK0RFRl9GVU5DXzEobGdhbW1hKQorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxnYW1tYShmbG9hdCwgZmxvYXQgKik7CitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxnYW1tYShmbG9hdDIsIGZsb2F0MiAqKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGdhbW1hKGZsb2F0MywgZmxvYXQzICopOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZ2FtbWEoZmxvYXQ0LCBmbG9hdDQgKik7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2coZmxvYXQpOworREVGX0ZVTkNfMShsb2cpCisKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0KTsKK0RFRl9GVU5DXzEobG9nMTApCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cyKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gbG9nMTAodikgLyBsb2cxMCgyLmYpOworfQorREVGX0ZVTkNfMShsb2cyKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMXAoZmxvYXQpOworREVGX0ZVTkNfMShsb2cxcCkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZ2IoZmxvYXQpOworREVGX0ZVTkNfMShsb2diKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWFkKGZsb2F0LCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYWQoZmxvYXQyLCBmbG9hdDIsIGZsb2F0Mik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1hZChmbG9hdDMsIGZsb2F0MywgZmxvYXQzKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWFkKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbW9kZihmbG9hdCwgZmxvYXQgKik7CitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1vZGYoZmxvYXQyLCBmbG9hdDIgKik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1vZGYoZmxvYXQzLCBmbG9hdDMgKik7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1vZGYoZmxvYXQ0LCBmbG9hdDQgKik7CisKKy8vZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG5hbih1aW50KTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG5leHRhZnRlcihmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihuZXh0YWZ0ZXIpCisKK0RFRl9GVU5DXzIocG93KQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93bihmbG9hdCB2LCBpbnQgcCkgeworICAgIHJldHVybiBwb3codiwgKGZsb2F0KXApOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3duKGZsb2F0MiB2LCBpbnQyIHApIHsKKyAgICByZXR1cm4gcG93KHYsIChmbG9hdDIpcCk7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd24oZmxvYXQzIHYsIGludDMgcCkgeworICAgIHJldHVybiBwb3codiwgKGZsb2F0MylwKTsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93bihmbG9hdDQgdiwgaW50NCBwKSB7CisgICAgcmV0dXJuIHBvdyh2LCAoZmxvYXQ0KXApOworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93cihmbG9hdCB2LCBmbG9hdCBwKSB7CisgICAgcmV0dXJuIHBvdyh2LCBwKTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93cihmbG9hdDIgdiwgZmxvYXQyIHApIHsKKyAgICByZXR1cm4gcG93KHYsIHApOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3dyKGZsb2F0MyB2LCBmbG9hdDMgcCkgeworICAgIHJldHVybiBwb3codiwgcCk7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd3IoZmxvYXQ0IHYsIGZsb2F0NCBwKSB7CisgICAgcmV0dXJuIHBvdyh2LCBwKTsKK30KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJlbWFpbmRlcihmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihyZW1haW5kZXIpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByZW1xdW8oZmxvYXQsIGZsb2F0LCBmbG9hdCAqKTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmVtcXVvKGZsb2F0MiwgZmxvYXQyLCBmbG9hdDIgKik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJlbXF1byhmbG9hdDMsIGZsb2F0MywgZmxvYXQzICopOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByZW1xdW8oZmxvYXQ0LCBmbG9hdDQsIGZsb2F0NCAqKTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJpbnQoZmxvYXQpOworREVGX0ZVTkNfMShyaW50KQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm9vdG4oZmxvYXQgdiwgaW50IHIpIHsKKyAgICByZXR1cm4gcG93KHYsIDEuZiAvIHIpOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByb290bihmbG9hdDIgdiwgaW50MiByKSB7CisgICAgZmxvYXQyIHQgPSB7MS5mIC8gci54LCAxLmYgLyByLnl9OworICAgIHJldHVybiBwb3codiwgdCk7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvb3RuKGZsb2F0MyB2LCBpbnQzIHIpIHsKKyAgICBmbG9hdDMgdCA9IHsxLmYgLyByLngsIDEuZiAvIHIueSwgMS5mIC8gci56fTsKKyAgICByZXR1cm4gcG93KHYsIHQpOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByb290bihmbG9hdDQgdiwgaW50NCByKSB7CisgICAgZmxvYXQ0IHQgPSB7MS5mIC8gci54LCAxLmYgLyByLnksIDEuZiAvIHIueiwgMS5mIC8gci53fTsKKyAgICByZXR1cm4gcG93KHYsIHQpOworfQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQpOworREVGX0ZVTkNfMShyb3VuZCkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQpOworLypzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQgdikgeworICAgIHJldHVybiAxLmYgLyBzcXJ0KHYpOworfQorREVGX0ZVTkNfMShyc3FydCkqLworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luKGZsb2F0KTsKK0RFRl9GVU5DXzEoc2luKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luY29zKGZsb2F0IHYsIGZsb2F0ICpjb3NwdHIpIHsKKyAgICAqY29zcHRyID0gY29zKHYpOworICAgIHJldHVybiBzaW4odik7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbmNvcyhmbG9hdDIgdiwgZmxvYXQyICpjb3NwdHIpIHsKKyAgICAqY29zcHRyID0gY29zKHYpOworICAgIHJldHVybiBzaW4odik7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbmNvcyhmbG9hdDMgdiwgZmxvYXQzICpjb3NwdHIpIHsKKyAgICAqY29zcHRyID0gY29zKHYpOworICAgIHJldHVybiBzaW4odik7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbmNvcyhmbG9hdDQgdiwgZmxvYXQ0ICpjb3NwdHIpIHsKKyAgICAqY29zcHRyID0gY29zKHYpOworICAgIHJldHVybiBzaW4odik7Cit9CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5oKGZsb2F0KTsKK0RFRl9GVU5DXzEoc2luaCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gc2luKHYgKiBNX1BJKTsKK30KK0RFRl9GVU5DXzEoc2lucGkpCisKK0RFRl9GVU5DXzEoc3FydCkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbihmbG9hdCk7CitERUZfRlVOQ18xKHRhbikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbmgoZmxvYXQpOworREVGX0ZVTkNfMSh0YW5oKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGFucGkoZmxvYXQgdikgeworICAgIHJldHVybiB0YW4odiAqIE1fUEkpOworfQorREVGX0ZVTkNfMSh0YW5waSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRnYW1tYShmbG9hdCk7CitERUZfRlVOQ18xKHRnYW1tYSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0KTsKK0RFRl9GVU5DXzEodHJ1bmMpCisKKy8vIEludCBvcHMgKHBhcnRpYWwpLCA2LjExLjMKK2V4dGVybiB1aW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhpbnQpOworZXh0ZXJuIHVzaG9ydCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoc2hvcnQpOworZXh0ZXJuIHVjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhjaGFyKTsKKworZXh0ZXJuIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2x6KHVpbnQpOworZXh0ZXJuIGludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbHooaW50KTsKK2V4dGVybiB1c2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2x6KHVzaG9ydCk7CitleHRlcm4gc2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2x6KHNob3J0KTsKK2V4dGVybiB1Y2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbHoodWNoYXIpOworZXh0ZXJuIGNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2x6KGNoYXIpOworCitzdGF0aWMgdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4odWludCB2MSwgdWludCB2MikgeworICAgIHJldHVybiB2MSA8IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGludCB2MSwgaW50IHYyKSB7CisgICAgcmV0dXJuIHYxIDwgdjIgPyB2MSA6IHYyOworfQorc3RhdGljIHVzaG9ydCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4odXNob3J0IHYxLCB1c2hvcnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPCB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgc2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKHNob3J0IHYxLCBzaG9ydCB2MikgeworICAgIHJldHVybiB2MSA8IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyB1Y2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4odWNoYXIgdjEsIHVjaGFyIHYyKSB7CisgICAgcmV0dXJuIHYxIDwgdjIgPyB2MSA6IHYyOworfQorc3RhdGljIGNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGNoYXIgdjEsIGNoYXIgdjIpIHsKKyAgICByZXR1cm4gdjEgPCB2MiA/IHYxIDogdjI7Cit9CisKK3N0YXRpYyB1aW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heCh1aW50IHYxLCB1aW50IHYyKSB7CisgICAgcmV0dXJuIHYxID4gdjIgPyB2MSA6IHYyOworfQorc3RhdGljIGludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoaW50IHYxLCBpbnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPiB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgdXNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heCh1c2hvcnQgdjEsIHVzaG9ydCB2MikgeworICAgIHJldHVybiB2MSA+IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyBzaG9ydCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoc2hvcnQgdjEsIHNob3J0IHYyKSB7CisgICAgcmV0dXJuIHYxID4gdjIgPyB2MSA6IHYyOworfQorc3RhdGljIHVjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heCh1Y2hhciB2MSwgdWNoYXIgdjIpIHsKKyAgICByZXR1cm4gdjEgPiB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgY2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoY2hhciB2MSwgY2hhciB2MikgeworICAgIHJldHVybiB2MSA+IHYyID8gdjEgOiB2MjsKK30KKworCisKKworLy8gNi4xMS40CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdCBhbW91bnQsIGZsb2F0IGxvdywgZmxvYXQgaGlnaCkgeworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDIgYW1vdW50LCBmbG9hdDIgbG93LCBmbG9hdDIgaGlnaCkgeworICAgIGZsb2F0MiByOworICAgIHIueCA9IGFtb3VudC54IDwgbG93LnggPyBsb3cueCA6IChhbW91bnQueCA+IGhpZ2gueCA/IGhpZ2gueCA6IGFtb3VudC54KTsKKyAgICByLnkgPSBhbW91bnQueSA8IGxvdy55ID8gbG93LnkgOiAoYW1vdW50LnkgPiBoaWdoLnkgPyBoaWdoLnkgOiBhbW91bnQueSk7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MyBhbW91bnQsIGZsb2F0MyBsb3csIGZsb2F0MyBoaWdoKSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gYW1vdW50LnggPCBsb3cueCA/IGxvdy54IDogKGFtb3VudC54ID4gaGlnaC54ID8gaGlnaC54IDogYW1vdW50LngpOworICAgIHIueSA9IGFtb3VudC55IDwgbG93LnkgPyBsb3cueSA6IChhbW91bnQueSA+IGhpZ2gueSA/IGhpZ2gueSA6IGFtb3VudC55KTsKKyAgICByLnogPSBhbW91bnQueiA8IGxvdy56ID8gbG93LnogOiAoYW1vdW50LnogPiBoaWdoLnogPyBoaWdoLnogOiBhbW91bnQueik7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0NCBhbW91bnQsIGZsb2F0NCBsb3csIGZsb2F0NCBoaWdoKSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gYW1vdW50LnggPCBsb3cueCA/IGxvdy54IDogKGFtb3VudC54ID4gaGlnaC54ID8gaGlnaC54IDogYW1vdW50LngpOworICAgIHIueSA9IGFtb3VudC55IDwgbG93LnkgPyBsb3cueSA6IChhbW91bnQueSA+IGhpZ2gueSA/IGhpZ2gueSA6IGFtb3VudC55KTsKKyAgICByLnogPSBhbW91bnQueiA8IGxvdy56ID8gbG93LnogOiAoYW1vdW50LnogPiBoaWdoLnogPyBoaWdoLnogOiBhbW91bnQueik7CisgICAgci53ID0gYW1vdW50LncgPCBsb3cudyA/IGxvdy53IDogKGFtb3VudC53ID4gaGlnaC53ID8gaGlnaC53IDogYW1vdW50LncpOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDIgYW1vdW50LCBmbG9hdCBsb3csIGZsb2F0IGhpZ2gpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSBhbW91bnQueCA8IGxvdyA/IGxvdyA6IChhbW91bnQueCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LngpOworICAgIHIueSA9IGFtb3VudC55IDwgbG93ID8gbG93IDogKGFtb3VudC55ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQueSk7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MyBhbW91bnQsIGZsb2F0IGxvdywgZmxvYXQgaGlnaCkgeworICAgIGZsb2F0MyByOworICAgIHIueCA9IGFtb3VudC54IDwgbG93ID8gbG93IDogKGFtb3VudC54ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQueCk7CisgICAgci55ID0gYW1vdW50LnkgPCBsb3cgPyBsb3cgOiAoYW1vdW50LnkgPiBoaWdoID8gaGlnaCA6IGFtb3VudC55KTsKKyAgICByLnogPSBhbW91bnQueiA8IGxvdyA/IGxvdyA6IChhbW91bnQueiA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LnopOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDQgYW1vdW50LCBmbG9hdCBsb3csIGZsb2F0IGhpZ2gpIHsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSBhbW91bnQueCA8IGxvdyA/IGxvdyA6IChhbW91bnQueCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LngpOworICAgIHIueSA9IGFtb3VudC55IDwgbG93ID8gbG93IDogKGFtb3VudC55ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQueSk7CisgICAgci56ID0gYW1vdW50LnogPCBsb3cgPyBsb3cgOiAoYW1vdW50LnogPiBoaWdoID8gaGlnaCA6IGFtb3VudC56KTsKKyAgICByLncgPSBhbW91bnQudyA8IGxvdyA/IGxvdyA6IChhbW91bnQudyA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LncpOworICAgIHJldHVybiByOworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGVncmVlcyhmbG9hdCByYWRpYW5zKSB7CisgICAgcmV0dXJuIHJhZGlhbnMgKiAoMTgwLmYgLyBNX1BJKTsKK30KK0RFRl9GVU5DXzEoZGVncmVlcykKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdCB2MSwgZmxvYXQgdjIpIHsKKyAgICByZXR1cm4gdjEgPiB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDIgdjEsIGZsb2F0MiB2MikgeworICAgIGZsb2F0MiByOworICAgIHIueCA9IHYxLnggPiB2Mi54ID8gdjEueCA6IHYyLng7CisgICAgci55ID0gdjEueSA+IHYyLnkgPyB2MS55IDogdjIueTsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0MyB2MSwgZmxvYXQzIHYyKSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gdjEueCA+IHYyLnggPyB2MS54IDogdjIueDsKKyAgICByLnkgPSB2MS55ID4gdjIueSA/IHYxLnkgOiB2Mi55OworICAgIHIueiA9IHYxLnogPiB2Mi56ID8gdjEueiA6IHYyLno7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDQgdjEsIGZsb2F0NCB2MikgeworICAgIGZsb2F0NCByOworICAgIHIueCA9IHYxLnggPiB2Mi54ID8gdjEueCA6IHYyLng7CisgICAgci55ID0gdjEueSA+IHYyLnkgPyB2MS55IDogdjIueTsKKyAgICByLnogPSB2MS56ID4gdjIueiA/IHYxLnogOiB2Mi56OworICAgIHIudyA9IHYxLncgPiB2Mi53ID8gdjEudyA6IHYyLnc7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDIgdjEsIGZsb2F0IHYyKSB7CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gdjEueCA+IHYyID8gdjEueCA6IHYyOworICAgIHIueSA9IHYxLnkgPiB2MiA/IHYxLnkgOiB2MjsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0MyB2MSwgZmxvYXQgdjIpIHsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSB2MS54ID4gdjIgPyB2MS54IDogdjI7CisgICAgci55ID0gdjEueSA+IHYyID8gdjEueSA6IHYyOworICAgIHIueiA9IHYxLnogPiB2MiA/IHYxLnogOiB2MjsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0NCB2MSwgZmxvYXQgdjIpIHsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSB2MS54ID4gdjIgPyB2MS54IDogdjI7CisgICAgci55ID0gdjEueSA+IHYyID8gdjEueSA6IHYyOworICAgIHIueiA9IHYxLnogPiB2MiA/IHYxLnogOiB2MjsKKyAgICByLncgPSB2MS53ID4gdjIgPyB2MS53IDogdjI7CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQgdjEsIGZsb2F0IHYyKSB7CisgICAgcmV0dXJuIHYxIDwgdjIgPyB2MSA6IHYyOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQyIHYxLCBmbG9hdDIgdjIpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSB2MS54IDwgdjIueCA/IHYxLnggOiB2Mi54OworICAgIHIueSA9IHYxLnkgPCB2Mi55ID8gdjEueSA6IHYyLnk7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDMgdjEsIGZsb2F0MyB2MikgeworICAgIGZsb2F0MyByOworICAgIHIueCA9IHYxLnggPCB2Mi54ID8gdjEueCA6IHYyLng7CisgICAgci55ID0gdjEueSA8IHYyLnkgPyB2MS55IDogdjIueTsKKyAgICByLnogPSB2MS56IDwgdjIueiA/IHYxLnogOiB2Mi56OworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQ0IHYxLCBmbG9hdDQgdjIpIHsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSB2MS54IDwgdjIueCA/IHYxLnggOiB2Mi54OworICAgIHIueSA9IHYxLnkgPCB2Mi55ID8gdjEueSA6IHYyLnk7CisgICAgci56ID0gdjEueiA8IHYyLnogPyB2MS56IDogdjIuejsKKyAgICByLncgPSB2MS53IDwgdjIudyA/IHYxLncgOiB2Mi53OworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQyIHYxLCBmbG9hdCB2MikgeworICAgIGZsb2F0MiByOworICAgIHIueCA9IHYxLnggPCB2MiA/IHYxLnggOiB2MjsKKyAgICByLnkgPSB2MS55IDwgdjIgPyB2MS55IDogdjI7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDMgdjEsIGZsb2F0IHYyKSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gdjEueCA8IHYyID8gdjEueCA6IHYyOworICAgIHIueSA9IHYxLnkgPCB2MiA/IHYxLnkgOiB2MjsKKyAgICByLnogPSB2MS56IDwgdjIgPyB2MS56IDogdjI7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDQgdjEsIGZsb2F0IHYyKSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gdjEueCA8IHYyID8gdjEueCA6IHYyOworICAgIHIueSA9IHYxLnkgPCB2MiA/IHYxLnkgOiB2MjsKKyAgICByLnogPSB2MS56IDwgdjIgPyB2MS56IDogdjI7CisgICAgci53ID0gdjEudyA8IHYyID8gdjEudyA6IHYyOworICAgIHJldHVybiByOworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0IHN0YXJ0LCBmbG9hdCBzdG9wLCBmbG9hdCBhbW91bnQpIHsKKyAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MiBzdGFydCwgZmxvYXQyIHN0b3AsIGZsb2F0MiBhbW91bnQpIHsKKyAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MyBzdGFydCwgZmxvYXQzIHN0b3AsIGZsb2F0MyBhbW91bnQpIHsKKyAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0NCBzdGFydCwgZmxvYXQ0IHN0b3AsIGZsb2F0NCBhbW91bnQpIHsKKyAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MiBzdGFydCwgZmxvYXQyIHN0b3AsIGZsb2F0IGFtb3VudCkgeworICAgIHJldHVybiBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50OworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQzIHN0YXJ0LCBmbG9hdDMgc3RvcCwgZmxvYXQgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDQgc3RhcnQsIGZsb2F0NCBzdG9wLCBmbG9hdCBhbW91bnQpIHsKKyAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQgZGVncmVlcykgeworICAgIHJldHVybiBkZWdyZWVzICogKE1fUEkgLyAxODAuZik7Cit9CitERUZfRlVOQ18xKHJhZGlhbnMpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzdGVwKGZsb2F0IGVkZ2UsIGZsb2F0IHYpIHsKKyAgICByZXR1cm4gKHYgPCBlZGdlKSA/IDAuZiA6IDEuZjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3RlcChmbG9hdDIgZWRnZSwgZmxvYXQyIHYpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSAodi54IDwgZWRnZS54KSA/IDAuZiA6IDEuZjsKKyAgICByLnkgPSAodi55IDwgZWRnZS55KSA/IDAuZiA6IDEuZjsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3RlcChmbG9hdDMgZWRnZSwgZmxvYXQzIHYpIHsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSAodi54IDwgZWRnZS54KSA/IDAuZiA6IDEuZjsKKyAgICByLnkgPSAodi55IDwgZWRnZS55KSA/IDAuZiA6IDEuZjsKKyAgICByLnogPSAodi56IDwgZWRnZS56KSA/IDAuZiA6IDEuZjsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3RlcChmbG9hdDQgZWRnZSwgZmxvYXQ0IHYpIHsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSAodi54IDwgZWRnZS54KSA/IDAuZiA6IDEuZjsKKyAgICByLnkgPSAodi55IDwgZWRnZS55KSA/IDAuZiA6IDEuZjsKKyAgICByLnogPSAodi56IDwgZWRnZS56KSA/IDAuZiA6IDEuZjsKKyAgICByLncgPSAodi53IDwgZWRnZS53KSA/IDAuZiA6IDEuZjsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3RlcChmbG9hdDIgZWRnZSwgZmxvYXQgdikgeworICAgIGZsb2F0MiByOworICAgIHIueCA9ICh2IDwgZWRnZS54KSA/IDAuZiA6IDEuZjsKKyAgICByLnkgPSAodiA8IGVkZ2UueSkgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQzIGVkZ2UsIGZsb2F0IHYpIHsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSAodiA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYgPCBlZGdlLnkpID8gMC5mIDogMS5mOworICAgIHIueiA9ICh2IDwgZWRnZS56KSA/IDAuZiA6IDEuZjsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3RlcChmbG9hdDQgZWRnZSwgZmxvYXQgdikgeworICAgIGZsb2F0NCByOworICAgIHIueCA9ICh2IDwgZWRnZS54KSA/IDAuZiA6IDEuZjsKKyAgICByLnkgPSAodiA8IGVkZ2UueSkgPyAwLmYgOiAxLmY7CisgICAgci56ID0gKHYgPCBlZGdlLnopID8gMC5mIDogMS5mOworICAgIHIudyA9ICh2IDwgZWRnZS53KSA/IDAuZiA6IDEuZjsKKyAgICByZXR1cm4gcjsKK30KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNtb290aHN0ZXAoZmxvYXQsIGZsb2F0LCBmbG9hdCk7CitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNtb290aHN0ZXAoZmxvYXQyLCBmbG9hdDIsIGZsb2F0Mik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNtb290aHN0ZXAoZmxvYXQzLCBmbG9hdDMsIGZsb2F0Myk7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNtb290aHN0ZXAoZmxvYXQ0LCBmbG9hdDQsIGZsb2F0NCk7CitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNtb290aHN0ZXAoZmxvYXQsIGZsb2F0LCBmbG9hdDIpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0LCBmbG9hdCwgZmxvYXQzKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc21vb3Roc3RlcChmbG9hdCwgZmxvYXQsIGZsb2F0NCk7CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaWduKGZsb2F0IHYpIHsKKyAgICBpZiAodiA+IDApIHJldHVybiAxLmY7CisgICAgaWYgKHYgPCAwKSByZXR1cm4gLTEuZjsKKyAgICByZXR1cm4gdjsKK30KK0RFRl9GVU5DXzEoc2lnbikKKworLy8gNi4xMS41CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNyb3NzKGZsb2F0MyBsaHMsIGZsb2F0MyByaHMpIHsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSBsaHMueSAqIHJocy56ICAtIGxocy56ICogcmhzLnk7CisgICAgci55ID0gbGhzLnogKiByaHMueCAgLSBsaHMueCAqIHJocy56OworICAgIHIueiA9IGxocy54ICogcmhzLnkgIC0gbGhzLnkgKiByaHMueDsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjcm9zcyhmbG9hdDQgbGhzLCBmbG9hdDQgcmhzKSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gbGhzLnkgKiByaHMueiAgLSBsaHMueiAqIHJocy55OworICAgIHIueSA9IGxocy56ICogcmhzLnggIC0gbGhzLnggKiByaHMuejsKKyAgICByLnogPSBsaHMueCAqIHJocy55ICAtIGxocy55ICogcmhzLng7CisgICAgci53ID0gMC5mOworICAgIHJldHVybiByOworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZG90KGZsb2F0IGxocywgZmxvYXQgcmhzKSB7CisgICAgcmV0dXJuIGxocyAqIHJoczsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkb3QoZmxvYXQyIGxocywgZmxvYXQyIHJocykgeworICAgIHJldHVybiBsaHMueCpyaHMueCArIGxocy55KnJocy55OworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRvdChmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKSB7CisgICAgcmV0dXJuIGxocy54KnJocy54ICsgbGhzLnkqcmhzLnkgKyBsaHMueipyaHMuejsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkb3QoZmxvYXQ0IGxocywgZmxvYXQ0IHJocykgeworICAgIHJldHVybiBsaHMueCpyaHMueCArIGxocy55KnJocy55ICsgbGhzLnoqcmhzLnogKyBsaHMudypyaHMudzsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxlbmd0aChmbG9hdCB2KSB7CisgICAgcmV0dXJuIHY7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGVuZ3RoKGZsb2F0MiB2KSB7CisgICAgcmV0dXJuIHNxcnQodi54KnYueCArIHYueSp2LnkpOworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxlbmd0aChmbG9hdDMgdikgeworICAgIHJldHVybiBzcXJ0KHYueCp2LnggKyB2Lnkqdi55ICsgdi56KnYueik7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGVuZ3RoKGZsb2F0NCB2KSB7CisgICAgcmV0dXJuIHNxcnQodi54KnYueCArIHYueSp2LnkgKyB2Lnoqdi56ICsgdi53KnYudyk7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkaXN0YW5jZShmbG9hdCBsaHMsIGZsb2F0IHJocykgeworICAgIHJldHVybiBsZW5ndGgobGhzIC0gcmhzKTsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkaXN0YW5jZShmbG9hdDIgbGhzLCBmbG9hdDIgcmhzKSB7CisgICAgcmV0dXJuIGxlbmd0aChsaHMgLSByaHMpOworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRpc3RhbmNlKGZsb2F0MyBsaHMsIGZsb2F0MyByaHMpIHsKKyAgICByZXR1cm4gbGVuZ3RoKGxocyAtIHJocyk7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGlzdGFuY2UoZmxvYXQ0IGxocywgZmxvYXQ0IHJocykgeworICAgIHJldHVybiBsZW5ndGgobGhzIC0gcmhzKTsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG5vcm1hbGl6ZShmbG9hdCB2KSB7CisgICAgcmV0dXJuIDEuZjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbm9ybWFsaXplKGZsb2F0MiB2KSB7CisgICAgcmV0dXJuIHYgLyBsZW5ndGgodik7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG5vcm1hbGl6ZShmbG9hdDMgdikgeworICAgIHJldHVybiB2IC8gbGVuZ3RoKHYpOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBub3JtYWxpemUoZmxvYXQ0IHYpIHsKKyAgICByZXR1cm4gdiAvIGxlbmd0aCh2KTsKK30KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvc2NyaXB0Yy9yc19jb3JlLnJzaCBiL2xpYnMvcnMvc2NyaXB0Yy9yc19jb3JlLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWZjMTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9zY3JpcHRjL3JzX2NvcmUucnNoCkBAIC0wLDAgKzEsODkyIEBACisjaWZuZGVmIF9fUlNfQ09SRV9SU0hfXworI2RlZmluZSBfX1JTX0NPUkVfUlNIX18KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNEZWJ1Zyhjb25zdCBjaGFyICpzLCBmbG9hdDIgdikgeworICAgIHJzRGVidWcocywgdi54LCB2LnkpOworfQorc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNEZWJ1Zyhjb25zdCBjaGFyICpzLCBmbG9hdDMgdikgeworICAgIHJzRGVidWcocywgdi54LCB2LnksIHYueik7Cit9CitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc0RlYnVnKGNvbnN0IGNoYXIgKnMsIGZsb2F0NCB2KSB7CisgICAgcnNEZWJ1ZyhzLCB2LngsIHYueSwgdi56LCB2LncpOworfQorCitzdGF0aWMgdWNoYXI0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzUGFja0NvbG9yVG84ODg4KGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpCit7CisgICAgdWNoYXI0IGM7CisgICAgYy54ID0gKHVjaGFyKShyICogMjU1LmYpOworICAgIGMueSA9ICh1Y2hhcikoZyAqIDI1NS5mKTsKKyAgICBjLnogPSAodWNoYXIpKGIgKiAyNTUuZik7CisgICAgYy53ID0gMjU1OworICAgIHJldHVybiBjOworfQorCitzdGF0aWMgdWNoYXI0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzUGFja0NvbG9yVG84ODg4KGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgdWNoYXI0IGM7CisgICAgYy54ID0gKHVjaGFyKShyICogMjU1LmYpOworICAgIGMueSA9ICh1Y2hhcikoZyAqIDI1NS5mKTsKKyAgICBjLnogPSAodWNoYXIpKGIgKiAyNTUuZik7CisgICAgYy53ID0gKHVjaGFyKShhICogMjU1LmYpOworICAgIHJldHVybiBjOworfQorCitzdGF0aWMgdWNoYXI0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzUGFja0NvbG9yVG84ODg4KGZsb2F0MyBjb2xvcikKK3sKKyAgICBjb2xvciAqPSAyNTUuZjsKKyAgICB1Y2hhcjQgYyA9IHtjb2xvci54LCBjb2xvci55LCBjb2xvci56LCAyNTV9OworICAgIHJldHVybiBjOworfQorCitzdGF0aWMgdWNoYXI0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzUGFja0NvbG9yVG84ODg4KGZsb2F0NCBjb2xvcikKK3sKKyAgICBjb2xvciAqPSAyNTUuZjsKKyAgICB1Y2hhcjQgYyA9IHtjb2xvci54LCBjb2xvci55LCBjb2xvci56LCBjb2xvci53fTsKKyAgICByZXR1cm4gYzsKK30KKworc3RhdGljIGZsb2F0NCByc1VucGFja0NvbG9yODg4OCh1Y2hhcjQgYykKK3sKKyAgICBmbG9hdDQgcmV0ID0gKGZsb2F0NCkwLjAwMzkxNTY4NjI3NDVmOworICAgIHJldCAqPSBjb252ZXJ0X2Zsb2F0NChjKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvL2V4dGVybiB1Y2hhcjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNQYWNrQ29sb3JUbzU2NShmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKTsKKy8vZXh0ZXJuIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvNTY1KGZsb2F0Myk7CisvL2V4dGVybiBmbG9hdDQgcnNVbnBhY2tDb2xvcjU2NSh1Y2hhcjQpOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNYXRyaXggb3BzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhTZXQocnNfbWF0cml4NHg0ICptLCB1aW50MzJfdCByb3csIHVpbnQzMl90IGNvbCwgZmxvYXQgdikgeworICAgIG0tPm1bcm93ICogNCArIGNvbF0gPSB2OworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4R2V0KGNvbnN0IHJzX21hdHJpeDR4NCAqbSwgdWludDMyX3Qgcm93LCB1aW50MzJfdCBjb2wpIHsKKyAgICByZXR1cm4gbS0+bVtyb3cgKiA0ICsgY29sXTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4U2V0KHJzX21hdHJpeDN4MyAqbSwgdWludDMyX3Qgcm93LCB1aW50MzJfdCBjb2wsIGZsb2F0IHYpIHsKKyAgICBtLT5tW3JvdyAqIDMgKyBjb2xdID0gdjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeEdldChjb25zdCByc19tYXRyaXgzeDMgKm0sIHVpbnQzMl90IHJvdywgdWludDMyX3QgY29sKSB7CisgICAgcmV0dXJuIG0tPm1bcm93ICogMyArIGNvbF07Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFNldChyc19tYXRyaXgyeDIgKm0sIHVpbnQzMl90IHJvdywgdWludDMyX3QgY29sLCBmbG9hdCB2KSB7CisgICAgbS0+bVtyb3cgKiAyICsgY29sXSA9IHY7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhHZXQoY29uc3QgcnNfbWF0cml4MngyICptLCB1aW50MzJfdCByb3csIHVpbnQzMl90IGNvbCkgeworICAgIHJldHVybiBtLT5tW3JvdyAqIDIgKyBjb2xdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkSWRlbnRpdHkocnNfbWF0cml4NHg0ICptKSB7CisgICAgbS0+bVswXSA9IDEuZjsKKyAgICBtLT5tWzFdID0gMC5mOworICAgIG0tPm1bMl0gPSAwLmY7CisgICAgbS0+bVszXSA9IDAuZjsKKyAgICBtLT5tWzRdID0gMC5mOworICAgIG0tPm1bNV0gPSAxLmY7CisgICAgbS0+bVs2XSA9IDAuZjsKKyAgICBtLT5tWzddID0gMC5mOworICAgIG0tPm1bOF0gPSAwLmY7CisgICAgbS0+bVs5XSA9IDAuZjsKKyAgICBtLT5tWzEwXSA9IDEuZjsKKyAgICBtLT5tWzExXSA9IDAuZjsKKyAgICBtLT5tWzEyXSA9IDAuZjsKKyAgICBtLT5tWzEzXSA9IDAuZjsKKyAgICBtLT5tWzE0XSA9IDAuZjsKKyAgICBtLT5tWzE1XSA9IDEuZjsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZElkZW50aXR5KHJzX21hdHJpeDN4MyAqbSkgeworICAgIG0tPm1bMF0gPSAxLmY7CisgICAgbS0+bVsxXSA9IDAuZjsKKyAgICBtLT5tWzJdID0gMC5mOworICAgIG0tPm1bM10gPSAwLmY7CisgICAgbS0+bVs0XSA9IDEuZjsKKyAgICBtLT5tWzVdID0gMC5mOworICAgIG0tPm1bNl0gPSAwLmY7CisgICAgbS0+bVs3XSA9IDAuZjsKKyAgICBtLT5tWzhdID0gMS5mOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkSWRlbnRpdHkocnNfbWF0cml4MngyICptKSB7CisgICAgbS0+bVswXSA9IDEuZjsKKyAgICBtLT5tWzFdID0gMC5mOworICAgIG0tPm1bMl0gPSAwLmY7CisgICAgbS0+bVszXSA9IDEuZjsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXg0eDQgKm0sIGNvbnN0IGZsb2F0ICp2KSB7CisgICAgbS0+bVswXSA9IHZbMF07CisgICAgbS0+bVsxXSA9IHZbMV07CisgICAgbS0+bVsyXSA9IHZbMl07CisgICAgbS0+bVszXSA9IHZbM107CisgICAgbS0+bVs0XSA9IHZbNF07CisgICAgbS0+bVs1XSA9IHZbNV07CisgICAgbS0+bVs2XSA9IHZbNl07CisgICAgbS0+bVs3XSA9IHZbN107CisgICAgbS0+bVs4XSA9IHZbOF07CisgICAgbS0+bVs5XSA9IHZbOV07CisgICAgbS0+bVsxMF0gPSB2WzEwXTsKKyAgICBtLT5tWzExXSA9IHZbMTFdOworICAgIG0tPm1bMTJdID0gdlsxMl07CisgICAgbS0+bVsxM10gPSB2WzEzXTsKKyAgICBtLT5tWzE0XSA9IHZbMTRdOworICAgIG0tPm1bMTVdID0gdlsxNV07Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4M3gzICptLCBjb25zdCBmbG9hdCAqdikgeworICAgIG0tPm1bMF0gPSB2WzBdOworICAgIG0tPm1bMV0gPSB2WzFdOworICAgIG0tPm1bMl0gPSB2WzJdOworICAgIG0tPm1bM10gPSB2WzNdOworICAgIG0tPm1bNF0gPSB2WzRdOworICAgIG0tPm1bNV0gPSB2WzVdOworICAgIG0tPm1bNl0gPSB2WzZdOworICAgIG0tPm1bN10gPSB2WzddOworICAgIG0tPm1bOF0gPSB2WzhdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkKHJzX21hdHJpeDJ4MiAqbSwgY29uc3QgZmxvYXQgKnYpIHsKKyAgICBtLT5tWzBdID0gdlswXTsKKyAgICBtLT5tWzFdID0gdlsxXTsKKyAgICBtLT5tWzJdID0gdlsyXTsKKyAgICBtLT5tWzNdID0gdlszXTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX21hdHJpeDR4NCAqdikgeworICAgIG0tPm1bMF0gPSB2LT5tWzBdOworICAgIG0tPm1bMV0gPSB2LT5tWzFdOworICAgIG0tPm1bMl0gPSB2LT5tWzJdOworICAgIG0tPm1bM10gPSB2LT5tWzNdOworICAgIG0tPm1bNF0gPSB2LT5tWzRdOworICAgIG0tPm1bNV0gPSB2LT5tWzVdOworICAgIG0tPm1bNl0gPSB2LT5tWzZdOworICAgIG0tPm1bN10gPSB2LT5tWzddOworICAgIG0tPm1bOF0gPSB2LT5tWzhdOworICAgIG0tPm1bOV0gPSB2LT5tWzldOworICAgIG0tPm1bMTBdID0gdi0+bVsxMF07CisgICAgbS0+bVsxMV0gPSB2LT5tWzExXTsKKyAgICBtLT5tWzEyXSA9IHYtPm1bMTJdOworICAgIG0tPm1bMTNdID0gdi0+bVsxM107CisgICAgbS0+bVsxNF0gPSB2LT5tWzE0XTsKKyAgICBtLT5tWzE1XSA9IHYtPm1bMTVdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkKHJzX21hdHJpeDR4NCAqbSwgY29uc3QgcnNfbWF0cml4M3gzICp2KSB7CisgICAgbS0+bVswXSA9IHYtPm1bMF07CisgICAgbS0+bVsxXSA9IHYtPm1bMV07CisgICAgbS0+bVsyXSA9IHYtPm1bMl07CisgICAgbS0+bVszXSA9IDAuZjsKKyAgICBtLT5tWzRdID0gdi0+bVszXTsKKyAgICBtLT5tWzVdID0gdi0+bVs0XTsKKyAgICBtLT5tWzZdID0gdi0+bVs1XTsKKyAgICBtLT5tWzddID0gMC5mOworICAgIG0tPm1bOF0gPSB2LT5tWzZdOworICAgIG0tPm1bOV0gPSB2LT5tWzddOworICAgIG0tPm1bMTBdID0gdi0+bVs4XTsKKyAgICBtLT5tWzExXSA9IDAuZjsKKyAgICBtLT5tWzEyXSA9IDAuZjsKKyAgICBtLT5tWzEzXSA9IDAuZjsKKyAgICBtLT5tWzE0XSA9IDAuZjsKKyAgICBtLT5tWzE1XSA9IDEuZjsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX21hdHJpeDJ4MiAqdikgeworICAgIG0tPm1bMF0gPSB2LT5tWzBdOworICAgIG0tPm1bMV0gPSB2LT5tWzFdOworICAgIG0tPm1bMl0gPSAwLmY7CisgICAgbS0+bVszXSA9IDAuZjsKKyAgICBtLT5tWzRdID0gdi0+bVszXTsKKyAgICBtLT5tWzVdID0gdi0+bVs0XTsKKyAgICBtLT5tWzZdID0gMC5mOworICAgIG0tPm1bN10gPSAwLmY7CisgICAgbS0+bVs4XSA9IHYtPm1bNl07CisgICAgbS0+bVs5XSA9IHYtPm1bN107CisgICAgbS0+bVsxMF0gPSAxLmY7CisgICAgbS0+bVsxMV0gPSAwLmY7CisgICAgbS0+bVsxMl0gPSAwLmY7CisgICAgbS0+bVsxM10gPSAwLmY7CisgICAgbS0+bVsxNF0gPSAwLmY7CisgICAgbS0+bVsxNV0gPSAxLmY7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4M3gzICptLCBjb25zdCByc19tYXRyaXgzeDMgKnYpIHsKKyAgICBtLT5tWzBdID0gdi0+bVswXTsKKyAgICBtLT5tWzFdID0gdi0+bVsxXTsKKyAgICBtLT5tWzJdID0gdi0+bVsyXTsKKyAgICBtLT5tWzNdID0gdi0+bVszXTsKKyAgICBtLT5tWzRdID0gdi0+bVs0XTsKKyAgICBtLT5tWzVdID0gdi0+bVs1XTsKKyAgICBtLT5tWzZdID0gdi0+bVs2XTsKKyAgICBtLT5tWzddID0gdi0+bVs3XTsKKyAgICBtLT5tWzhdID0gdi0+bVs4XTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXgyeDIgKm0sIGNvbnN0IHJzX21hdHJpeDJ4MiAqdikgeworICAgIG0tPm1bMF0gPSB2LT5tWzBdOworICAgIG0tPm1bMV0gPSB2LT5tWzFdOworICAgIG0tPm1bMl0gPSB2LT5tWzJdOworICAgIG0tPm1bM10gPSB2LT5tWzNdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkUm90YXRlKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgZmxvYXQgYywgczsKKyAgICBtLT5tWzNdID0gMDsKKyAgICBtLT5tWzddID0gMDsKKyAgICBtLT5tWzExXT0gMDsKKyAgICBtLT5tWzEyXT0gMDsKKyAgICBtLT5tWzEzXT0gMDsKKyAgICBtLT5tWzE0XT0gMDsKKyAgICBtLT5tWzE1XT0gMTsKKyAgICByb3QgKj0gKGZsb2F0KShNX1BJIC8gMTgwLjBmKTsKKyAgICBjID0gY29zKHJvdCk7CisgICAgcyA9IHNpbihyb3QpOworCisgICAgY29uc3QgZmxvYXQgbGVuID0geCp4ICsgeSp5ICsgeip6OworICAgIGlmIChsZW4gIT0gMSkgeworICAgICAgICBjb25zdCBmbG9hdCByZWNpcExlbiA9IDEuZiAvIHNxcnQobGVuKTsKKyAgICAgICAgeCAqPSByZWNpcExlbjsKKyAgICAgICAgeSAqPSByZWNpcExlbjsKKyAgICAgICAgeiAqPSByZWNpcExlbjsKKyAgICB9CisgICAgY29uc3QgZmxvYXQgbmMgPSAxLjBmIC0gYzsKKyAgICBjb25zdCBmbG9hdCB4eSA9IHggKiB5OworICAgIGNvbnN0IGZsb2F0IHl6ID0geSAqIHo7CisgICAgY29uc3QgZmxvYXQgenggPSB6ICogeDsKKyAgICBjb25zdCBmbG9hdCB4cyA9IHggKiBzOworICAgIGNvbnN0IGZsb2F0IHlzID0geSAqIHM7CisgICAgY29uc3QgZmxvYXQgenMgPSB6ICogczsKKyAgICBtLT5tWyAwXSA9IHgqeCpuYyArICBjOworICAgIG0tPm1bIDRdID0gIHh5Km5jIC0genM7CisgICAgbS0+bVsgOF0gPSAgengqbmMgKyB5czsKKyAgICBtLT5tWyAxXSA9ICB4eSpuYyArIHpzOworICAgIG0tPm1bIDVdID0geSp5Km5jICsgIGM7CisgICAgbS0+bVsgOV0gPSAgeXoqbmMgLSB4czsKKyAgICBtLT5tWyAyXSA9ICB6eCpuYyAtIHlzOworICAgIG0tPm1bIDZdID0gIHl6Km5jICsgeHM7CisgICAgbS0+bVsxMF0gPSB6KnoqbmMgKyAgYzsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZFNjYWxlKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KG0pOworICAgIG0tPm1bMF0gPSB4OworICAgIG0tPm1bNV0gPSB5OworICAgIG0tPm1bMTBdID0gejsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZFRyYW5zbGF0ZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eShtKTsKKyAgICBtLT5tWzEyXSA9IHg7CisgICAgbS0+bVsxM10gPSB5OworICAgIG0tPm1bMTRdID0gejsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZE11bHRpcGx5KHJzX21hdHJpeDR4NCAqbSwgY29uc3QgcnNfbWF0cml4NHg0ICpsaHMsIGNvbnN0IHJzX21hdHJpeDR4NCAqcmhzKSB7CisgICAgZm9yIChpbnQgaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgIGZsb2F0IHJpMCA9IDA7CisgICAgICAgIGZsb2F0IHJpMSA9IDA7CisgICAgICAgIGZsb2F0IHJpMiA9IDA7CisgICAgICAgIGZsb2F0IHJpMyA9IDA7CisgICAgICAgIGZvciAoaW50IGo9MCA7IGo8NCA7IGorKykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgcmhzX2lqID0gcnNNYXRyaXhHZXQocmhzLCBpLGopOworICAgICAgICAgICAgcmkwICs9IHJzTWF0cml4R2V0KGxocywgaiwgMCkgKiByaHNfaWo7CisgICAgICAgICAgICByaTEgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAxKSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMiArPSByc01hdHJpeEdldChsaHMsIGosIDIpICogcmhzX2lqOworICAgICAgICAgICAgcmkzICs9IHJzTWF0cml4R2V0KGxocywgaiwgMykgKiByaHNfaWo7CisgICAgICAgIH0KKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMCwgcmkwKTsKKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMSwgcmkxKTsKKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMiwgcmkyKTsKKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMywgcmkzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDR4NCAqbSwgY29uc3QgcnNfbWF0cml4NHg0ICpyaHMpIHsKKyAgICByc19tYXRyaXg0eDQgbXQ7CisgICAgcnNNYXRyaXhMb2FkTXVsdGlwbHkoJm10LCBtLCByaHMpOworICAgIHJzTWF0cml4TG9hZChtLCAmbXQpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkTXVsdGlwbHkocnNfbWF0cml4M3gzICptLCBjb25zdCByc19tYXRyaXgzeDMgKmxocywgY29uc3QgcnNfbWF0cml4M3gzICpyaHMpIHsKKyAgICBmb3IgKGludCBpPTAgOyBpPDMgOyBpKyspIHsKKyAgICAgICAgZmxvYXQgcmkwID0gMDsKKyAgICAgICAgZmxvYXQgcmkxID0gMDsKKyAgICAgICAgZmxvYXQgcmkyID0gMDsKKyAgICAgICAgZm9yIChpbnQgaj0wIDsgajwzIDsgaisrKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCByaHNfaWogPSByc01hdHJpeEdldChyaHMsIGksaik7CisgICAgICAgICAgICByaTAgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAwKSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMSArPSByc01hdHJpeEdldChsaHMsIGosIDEpICogcmhzX2lqOworICAgICAgICAgICAgcmkyICs9IHJzTWF0cml4R2V0KGxocywgaiwgMikgKiByaHNfaWo7CisgICAgICAgIH0KKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMCwgcmkwKTsKKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMSwgcmkxKTsKKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMiwgcmkyKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDN4MyAqbSwgY29uc3QgcnNfbWF0cml4M3gzICpyaHMpIHsKKyAgICByc19tYXRyaXgzeDMgbXQ7CisgICAgcnNNYXRyaXhMb2FkTXVsdGlwbHkoJm10LCBtLCByaHMpOworICAgIHJzTWF0cml4TG9hZChtLCAmbXQpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkTXVsdGlwbHkocnNfbWF0cml4MngyICptLCBjb25zdCByc19tYXRyaXgyeDIgKmxocywgY29uc3QgcnNfbWF0cml4MngyICpyaHMpIHsKKyAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgZmxvYXQgcmkwID0gMDsKKyAgICAgICAgZmxvYXQgcmkxID0gMDsKKyAgICAgICAgZm9yIChpbnQgaj0wIDsgajwyIDsgaisrKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCByaHNfaWogPSByc01hdHJpeEdldChyaHMsIGksaik7CisgICAgICAgICAgICByaTAgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAwKSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMSArPSByc01hdHJpeEdldChsaHMsIGosIDEpICogcmhzX2lqOworICAgICAgICB9CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDAsIHJpMCk7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDEsIHJpMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXgyeDIgKm0sIGNvbnN0IHJzX21hdHJpeDJ4MiAqcmhzKSB7CisgICAgcnNfbWF0cml4MngyIG10OworICAgIHJzTWF0cml4TG9hZE11bHRpcGx5KCZtdCwgbSwgcmhzKTsKKyAgICByc01hdHJpeExvYWQobSwgJm10KTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4Um90YXRlKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcnNfbWF0cml4NHg0IG0xOworICAgIHJzTWF0cml4TG9hZFJvdGF0ZSgmbTEsIHJvdCwgeCwgeSwgeik7CisgICAgcnNNYXRyaXhNdWx0aXBseShtLCAmbTEpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhTY2FsZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICByc19tYXRyaXg0eDQgbTE7CisgICAgcnNNYXRyaXhMb2FkU2NhbGUoJm0xLCB4LCB5LCB6KTsKKyAgICByc01hdHJpeE11bHRpcGx5KG0sICZtMSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFRyYW5zbGF0ZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICByc19tYXRyaXg0eDQgbTE7CisgICAgcnNNYXRyaXhMb2FkVHJhbnNsYXRlKCZtMSwgeCwgeSwgeik7CisgICAgcnNNYXRyaXhNdWx0aXBseShtLCAmbTEpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkT3J0aG8ocnNfbWF0cml4NHg0ICptLCBmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBmbG9hdCB0b3AsIGZsb2F0IG5lYXIsIGZsb2F0IGZhcikgeworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KG0pOworICAgIG0tPm1bMF0gPSAyLmYgLyAocmlnaHQgLSBsZWZ0KTsKKyAgICBtLT5tWzVdID0gMi5mIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgbS0+bVsxMF09IC0yLmYgLyAoZmFyIC0gbmVhcik7CisgICAgbS0+bVsxMl09IC0ocmlnaHQgKyBsZWZ0KSAvIChyaWdodCAtIGxlZnQpOworICAgIG0tPm1bMTNdPSAtKHRvcCArIGJvdHRvbSkgLyAodG9wIC0gYm90dG9tKTsKKyAgICBtLT5tWzE0XT0gLShmYXIgKyBuZWFyKSAvIChmYXIgLSBuZWFyKTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZEZydXN0dW0ocnNfbWF0cml4NHg0ICptLCBmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBmbG9hdCB0b3AsIGZsb2F0IG5lYXIsIGZsb2F0IGZhcikgeworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KG0pOworICAgIG0tPm1bMF0gPSAyLmYgKiBuZWFyIC8gKHJpZ2h0IC0gbGVmdCk7CisgICAgbS0+bVs1XSA9IDIuZiAqIG5lYXIgLyAodG9wIC0gYm90dG9tKTsKKyAgICBtLT5tWzhdID0gKHJpZ2h0ICsgbGVmdCkgLyAocmlnaHQgLSBsZWZ0KTsKKyAgICBtLT5tWzldID0gKHRvcCArIGJvdHRvbSkgLyAodG9wIC0gYm90dG9tKTsKKyAgICBtLT5tWzEwXT0gLShmYXIgKyBuZWFyKSAvIChmYXIgLSBuZWFyKTsKKyAgICBtLT5tWzExXT0gLTEuZjsKKyAgICBtLT5tWzE0XT0gLTIuZiAqIGZhciAqIG5lYXIgLyAoZmFyIC0gbmVhcik7CisgICAgbS0+bVsxNV09IDAuZjsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZFBlcnNwZWN0aXZlKHJzX21hdHJpeDR4NCogbSwgZmxvYXQgZm92eSwgZmxvYXQgYXNwZWN0LCBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpIHsKKyAgICBmbG9hdCB0b3AgPSBuZWFyICogdGFuKChmbG9hdCkgKGZvdnkgKiBNX1BJIC8gMzYwLjBmKSk7CisgICAgZmxvYXQgYm90dG9tID0gLXRvcDsKKyAgICBmbG9hdCBsZWZ0ID0gYm90dG9tICogYXNwZWN0OworICAgIGZsb2F0IHJpZ2h0ID0gdG9wICogYXNwZWN0OworICAgIHJzTWF0cml4TG9hZEZydXN0dW0obSwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpOworfQorCitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDR4NCAqbSwgZmxvYXQ0IGluKSB7CisgICAgZmxvYXQ0IHJldDsKKyAgICByZXQueCA9IChtLT5tWzBdICogaW4ueCkgKyAobS0+bVs0XSAqIGluLnkpICsgKG0tPm1bOF0gKiBpbi56KSArIChtLT5tWzEyXSAqIGluLncpOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzVdICogaW4ueSkgKyAobS0+bVs5XSAqIGluLnopICsgKG0tPm1bMTNdICogaW4udyk7CisgICAgcmV0LnogPSAobS0+bVsyXSAqIGluLngpICsgKG0tPm1bNl0gKiBpbi55KSArIChtLT5tWzEwXSAqIGluLnopICsgKG0tPm1bMTRdICogaW4udyk7CisgICAgcmV0LncgPSAobS0+bVszXSAqIGluLngpICsgKG0tPm1bN10gKiBpbi55KSArIChtLT5tWzExXSAqIGluLnopICsgKG0tPm1bMTVdICogaW4udyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXg0eDQgKm0sIGZsb2F0MyBpbikgeworICAgIGZsb2F0NCByZXQ7CisgICAgcmV0LnggPSAobS0+bVswXSAqIGluLngpICsgKG0tPm1bNF0gKiBpbi55KSArIChtLT5tWzhdICogaW4ueikgKyBtLT5tWzEyXTsKKyAgICByZXQueSA9IChtLT5tWzFdICogaW4ueCkgKyAobS0+bVs1XSAqIGluLnkpICsgKG0tPm1bOV0gKiBpbi56KSArIG0tPm1bMTNdOworICAgIHJldC56ID0gKG0tPm1bMl0gKiBpbi54KSArIChtLT5tWzZdICogaW4ueSkgKyAobS0+bVsxMF0gKiBpbi56KSArIG0tPm1bMTRdOworICAgIHJldC53ID0gKG0tPm1bM10gKiBpbi54KSArIChtLT5tWzddICogaW4ueSkgKyAobS0+bVsxMV0gKiBpbi56KSArIG0tPm1bMTVdOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4NHg0ICptLCBmbG9hdDIgaW4pIHsKKyAgICBmbG9hdDQgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzRdICogaW4ueSkgKyBtLT5tWzEyXTsKKyAgICByZXQueSA9IChtLT5tWzFdICogaW4ueCkgKyAobS0+bVs1XSAqIGluLnkpICsgbS0+bVsxM107CisgICAgcmV0LnogPSAobS0+bVsyXSAqIGluLngpICsgKG0tPm1bNl0gKiBpbi55KSArIG0tPm1bMTRdOworICAgIHJldC53ID0gKG0tPm1bM10gKiBpbi54KSArIChtLT5tWzddICogaW4ueSkgKyBtLT5tWzE1XTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDN4MyAqbSwgZmxvYXQzIGluKSB7CisgICAgZmxvYXQzIHJldDsKKyAgICByZXQueCA9IChtLT5tWzBdICogaW4ueCkgKyAobS0+bVszXSAqIGluLnkpICsgKG0tPm1bNl0gKiBpbi56KTsKKyAgICByZXQueSA9IChtLT5tWzFdICogaW4ueCkgKyAobS0+bVs0XSAqIGluLnkpICsgKG0tPm1bN10gKiBpbi56KTsKKyAgICByZXQueiA9IChtLT5tWzJdICogaW4ueCkgKyAobS0+bVs1XSAqIGluLnkpICsgKG0tPm1bOF0gKiBpbi56KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDN4MyAqbSwgZmxvYXQyIGluKSB7CisgICAgZmxvYXQzIHJldDsKKyAgICByZXQueCA9IChtLT5tWzBdICogaW4ueCkgKyAobS0+bVszXSAqIGluLnkpOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzRdICogaW4ueSk7CisgICAgcmV0LnogPSAobS0+bVsyXSAqIGluLngpICsgKG0tPm1bNV0gKiBpbi55KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDJ4MiAqbSwgZmxvYXQyIGluKSB7CisgICAgZmxvYXQyIHJldDsKKyAgICByZXQueCA9IChtLT5tWzBdICogaW4ueCkgKyAobS0+bVsyXSAqIGluLnkpOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzNdICogaW4ueSk7CisgICAgcmV0dXJuIHJldDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBtYXRyaXggd2FzIHN1Y2Nlc3NmdWxseSBpbnZlcnNlZAorc3RhdGljIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4SW52ZXJzZShyc19tYXRyaXg0eDQgKm0pIHsKKyAgICByc19tYXRyaXg0eDQgcmVzdWx0OworCisgICAgaW50IGksIGo7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgKytqKSB7CisgICAgICAgICAgICAvLyBjb21wdXRlQ29mYWN0b3IgZm9yIGludCBpLCBpbnQgagorICAgICAgICAgICAgaW50IGMwID0gKGkrMSkgJSA0OworICAgICAgICAgICAgaW50IGMxID0gKGkrMikgJSA0OworICAgICAgICAgICAgaW50IGMyID0gKGkrMykgJSA0OworICAgICAgICAgICAgaW50IHIwID0gKGorMSkgJSA0OworICAgICAgICAgICAgaW50IHIxID0gKGorMikgJSA0OworICAgICAgICAgICAgaW50IHIyID0gKGorMykgJSA0OworCisgICAgICAgICAgICBmbG9hdCBtaW5vciA9IChtLT5tW2MwICsgNCpyMF0gKiAobS0+bVtjMSArIDQqcjFdICogbS0+bVtjMiArIDQqcjJdIC0gbS0+bVtjMSArIDQqcjJdICogbS0+bVtjMiArIDQqcjFdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAtIChtLT5tW2MwICsgNCpyMV0gKiAobS0+bVtjMSArIDQqcjBdICogbS0+bVtjMiArIDQqcjJdIC0gbS0+bVtjMSArIDQqcjJdICogbS0+bVtjMiArIDQqcjBdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICArIChtLT5tW2MwICsgNCpyMl0gKiAobS0+bVtjMSArIDQqcjBdICogbS0+bVtjMiArIDQqcjFdIC0gbS0+bVtjMSArIDQqcjFdICogbS0+bVtjMiArIDQqcjBdKSk7CisKKyAgICAgICAgICAgIGZsb2F0IGNvZmFjdG9yID0gKGkraikgJiAxID8gLW1pbm9yIDogbWlub3I7CisKKyAgICAgICAgICAgIHJlc3VsdC5tWzQqaSArIGpdID0gY29mYWN0b3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEb3QgcHJvZHVjdCBvZiAwdGggY29sdW1uIG9mIHNvdXJjZSBhbmQgMHRoIHJvdyBvZiByZXN1bHQKKyAgICBmbG9hdCBkZXQgPSBtLT5tWzBdKnJlc3VsdC5tWzBdICsgbS0+bVs0XSpyZXN1bHQubVsxXSArCisgICAgICAgICAgICAgICAgIG0tPm1bOF0qcmVzdWx0Lm1bMl0gKyBtLT5tWzEyXSpyZXN1bHQubVszXTsKKworICAgIGlmIChmYWJzKGRldCkgPCAxZS02KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkZXQgPSAxLjBmIC8gZGV0OworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICAgIG0tPm1baV0gPSByZXN1bHQubVtpXSAqIGRldDsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBtYXRyaXggd2FzIHN1Y2Nlc3NmdWxseSBpbnZlcnNlZAorc3RhdGljIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4SW52ZXJzZVRyYW5zcG9zZShyc19tYXRyaXg0eDQgKm0pIHsKKyAgICByc19tYXRyaXg0eDQgcmVzdWx0OworCisgICAgaW50IGksIGo7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgKytqKSB7CisgICAgICAgICAgICAvLyBjb21wdXRlQ29mYWN0b3IgZm9yIGludCBpLCBpbnQgagorICAgICAgICAgICAgaW50IGMwID0gKGkrMSkgJSA0OworICAgICAgICAgICAgaW50IGMxID0gKGkrMikgJSA0OworICAgICAgICAgICAgaW50IGMyID0gKGkrMykgJSA0OworICAgICAgICAgICAgaW50IHIwID0gKGorMSkgJSA0OworICAgICAgICAgICAgaW50IHIxID0gKGorMikgJSA0OworICAgICAgICAgICAgaW50IHIyID0gKGorMykgJSA0OworCisgICAgICAgICAgICBmbG9hdCBtaW5vciA9IChtLT5tW2MwICsgNCpyMF0gKiAobS0+bVtjMSArIDQqcjFdICogbS0+bVtjMiArIDQqcjJdIC0gbS0+bVtjMSArIDQqcjJdICogbS0+bVtjMiArIDQqcjFdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAtIChtLT5tW2MwICsgNCpyMV0gKiAobS0+bVtjMSArIDQqcjBdICogbS0+bVtjMiArIDQqcjJdIC0gbS0+bVtjMSArIDQqcjJdICogbS0+bVtjMiArIDQqcjBdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICArIChtLT5tW2MwICsgNCpyMl0gKiAobS0+bVtjMSArIDQqcjBdICogbS0+bVtjMiArIDQqcjFdIC0gbS0+bVtjMSArIDQqcjFdICogbS0+bVtjMiArIDQqcjBdKSk7CisKKyAgICAgICAgICAgIGZsb2F0IGNvZmFjdG9yID0gKGkraikgJiAxID8gLW1pbm9yIDogbWlub3I7CisKKyAgICAgICAgICAgIHJlc3VsdC5tWzQqaiArIGldID0gY29mYWN0b3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEb3QgcHJvZHVjdCBvZiAwdGggY29sdW1uIG9mIHNvdXJjZSBhbmQgMHRoIGNvbHVtbiBvZiByZXN1bHQKKyAgICBmbG9hdCBkZXQgPSBtLT5tWzBdKnJlc3VsdC5tWzBdICsgbS0+bVs0XSpyZXN1bHQubVs0XSArCisgICAgICAgICAgICAgICAgIG0tPm1bOF0qcmVzdWx0Lm1bOF0gKyBtLT5tWzEyXSpyZXN1bHQubVsxMl07CisKKyAgICBpZiAoZmFicyhkZXQpIDwgMWUtNikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZGV0ID0gMS4wZiAvIGRldDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgICBtLT5tW2ldID0gcmVzdWx0Lm1baV0gKiBkZXQ7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFRyYW5zcG9zZShyc19tYXRyaXg0eDQgKm0pIHsKKyAgICBpbnQgaSwgajsKKyAgICBmbG9hdCB0ZW1wOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCA0OyArK2opIHsKKyAgICAgICAgICAgIHRlbXAgPSBtLT5tW2kqNCArIGpdOworICAgICAgICAgICAgbS0+bVtpKjQgKyBqXSA9IG0tPm1baio0ICsgaV07CisgICAgICAgICAgICBtLT5tW2oqNCArIGldID0gdGVtcDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4VHJhbnNwb3NlKHJzX21hdHJpeDN4MyAqbSkgeworICAgIGludCBpLCBqOworICAgIGZsb2F0IHRlbXA7CisgICAgZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IDM7ICsraikgeworICAgICAgICAgICAgdGVtcCA9IG0tPm1baSozICsgal07CisgICAgICAgICAgICBtLT5tW2kqMyArIGpdID0gbS0+bVtqKjQgKyBpXTsKKyAgICAgICAgICAgIG0tPm1baiozICsgaV0gPSB0ZW1wOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhUcmFuc3Bvc2UocnNfbWF0cml4MngyICptKSB7CisgICAgZmxvYXQgdGVtcCA9IG0tPm1bMV07CisgICAgbS0+bVsxXSA9IG0tPm1bMl07CisgICAgbS0+bVsyXSA9IHRlbXA7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBxdWF0ZXJuaW9uIG9wcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzUXVhdGVybmlvblNldChyc19xdWF0ZXJuaW9uICpxLCBmbG9hdCB3LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcS0+dyA9IHc7CisgICAgcS0+eCA9IHg7CisgICAgcS0+eSA9IHk7CisgICAgcS0+eiA9IHo7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc1F1YXRlcm5pb25TZXQocnNfcXVhdGVybmlvbiAqcSwgY29uc3QgcnNfcXVhdGVybmlvbiAqcmhzKSB7CisgICAgcS0+dyA9IHJocy0+dzsKKyAgICBxLT54ID0gcmhzLT54OworICAgIHEtPnkgPSByaHMtPnk7CisgICAgcS0+eiA9IHJocy0+ejsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzUXVhdGVybmlvbk11bHRpcGx5KHJzX3F1YXRlcm5pb24gKnEsIGZsb2F0IHMpIHsKKyAgICBxLT53ICo9IHM7CisgICAgcS0+eCAqPSBzOworICAgIHEtPnkgKj0gczsKKyAgICBxLT56ICo9IHM7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc1F1YXRlcm5pb25NdWx0aXBseShyc19xdWF0ZXJuaW9uICpxLCBjb25zdCByc19xdWF0ZXJuaW9uICpyaHMpIHsKKyAgICBxLT53ID0gLXEtPngqcmhzLT54IC0gcS0+eSpyaHMtPnkgLSBxLT56KnJocy0+eiArIHEtPncqcmhzLT53OworICAgIHEtPnggPSAgcS0+eCpyaHMtPncgKyBxLT55KnJocy0+eiAtIHEtPnoqcmhzLT55ICsgcS0+dypyaHMtPng7CisgICAgcS0+eSA9IC1xLT54KnJocy0+eiArIHEtPnkqcmhzLT53ICsgcS0+eipyaHMtPnogKyBxLT53KnJocy0+eTsKKyAgICBxLT56ID0gIHEtPngqcmhzLT55IC0gcS0+eSpyaHMtPnggKyBxLT56KnJocy0+dyArIHEtPncqcmhzLT56OworfQorCitzdGF0aWMgdm9pZAorcnNRdWF0ZXJuaW9uQWRkKHJzX3F1YXRlcm5pb24gKnEsIGNvbnN0IHJzX3F1YXRlcm5pb24gKnJocykgeworICAgIHEtPncgKj0gcmhzLT53OworICAgIHEtPnggKj0gcmhzLT54OworICAgIHEtPnkgKj0gcmhzLT55OworICAgIHEtPnogKj0gcmhzLT56OworfQorCitzdGF0aWMgdm9pZAorcnNRdWF0ZXJuaW9uTG9hZFJvdGF0ZVVuaXQocnNfcXVhdGVybmlvbiAqcSwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcm90ICo9IChmbG9hdCkoTV9QSSAvIDE4MC4wZikgKiAwLjVmOworICAgIGZsb2F0IGMgPSBjb3Mocm90KTsKKyAgICBmbG9hdCBzID0gc2luKHJvdCk7CisKKyAgICBxLT53ID0gYzsKKyAgICBxLT54ID0geCAqIHM7CisgICAgcS0+eSA9IHkgKiBzOworICAgIHEtPnogPSB6ICogczsKK30KKworc3RhdGljIHZvaWQKK3JzUXVhdGVybmlvbkxvYWRSb3RhdGUocnNfcXVhdGVybmlvbiAqcSwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgY29uc3QgZmxvYXQgbGVuID0geCp4ICsgeSp5ICsgeip6OworICAgIGlmIChsZW4gIT0gMSkgeworICAgICAgICBjb25zdCBmbG9hdCByZWNpcExlbiA9IDEuZiAvIHNxcnQobGVuKTsKKyAgICAgICAgeCAqPSByZWNpcExlbjsKKyAgICAgICAgeSAqPSByZWNpcExlbjsKKyAgICAgICAgeiAqPSByZWNpcExlbjsKKyAgICB9CisgICAgcnNRdWF0ZXJuaW9uTG9hZFJvdGF0ZVVuaXQocSwgcm90LCB4LCB5LCB6KTsKK30KKworc3RhdGljIHZvaWQKK3JzUXVhdGVybmlvbkNvbmp1Z2F0ZShyc19xdWF0ZXJuaW9uICpxKSB7CisgICAgcS0+eCA9IC1xLT54OworICAgIHEtPnkgPSAtcS0+eTsKKyAgICBxLT56ID0gLXEtPno7Cit9CisKK3N0YXRpYyBmbG9hdAorcnNRdWF0ZXJuaW9uRG90KGNvbnN0IHJzX3F1YXRlcm5pb24gKnEwLCBjb25zdCByc19xdWF0ZXJuaW9uICpxMSkgeworICAgIHJldHVybiBxMC0+dypxMS0+dyArIHEwLT54KnExLT54ICsgcTAtPnkqcTEtPnkgKyBxMC0+eipxMS0+ejsKK30KKworc3RhdGljIHZvaWQKK3JzUXVhdGVybmlvbk5vcm1hbGl6ZShyc19xdWF0ZXJuaW9uICpxKSB7CisgICAgY29uc3QgZmxvYXQgbGVuID0gcnNRdWF0ZXJuaW9uRG90KHEsIHEpOworICAgIGlmIChsZW4gIT0gMSkgeworICAgICAgICBjb25zdCBmbG9hdCByZWNpcExlbiA9IDEuZiAvIHNxcnQobGVuKTsKKyAgICAgICAgcnNRdWF0ZXJuaW9uTXVsdGlwbHkocSwgcmVjaXBMZW4pOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3JzUXVhdGVybmlvblNsZXJwKHJzX3F1YXRlcm5pb24gKnEsIGNvbnN0IHJzX3F1YXRlcm5pb24gKnEwLCBjb25zdCByc19xdWF0ZXJuaW9uICpxMSwgZmxvYXQgdCkgeworICAgIGlmKHQgPD0gMC4wZikgeworICAgICAgICByc1F1YXRlcm5pb25TZXQocSwgcTApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHQgPj0gMS4wZikgeworICAgICAgICByc1F1YXRlcm5pb25TZXQocSwgcTEpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcnNfcXVhdGVybmlvbiB0ZW1wcTAsIHRlbXBxMTsKKyAgICByc1F1YXRlcm5pb25TZXQoJnRlbXBxMCwgcTApOworICAgIHJzUXVhdGVybmlvblNldCgmdGVtcHExLCBxMSk7CisKKyAgICBmbG9hdCBhbmdsZSA9IHJzUXVhdGVybmlvbkRvdChxMCwgcTEpOworICAgIGlmKGFuZ2xlIDwgMCkgeworICAgICAgICByc1F1YXRlcm5pb25NdWx0aXBseSgmdGVtcHEwLCAtMS4wZik7CisgICAgICAgIGFuZ2xlICo9IC0xLjBmOworICAgIH0KKworICAgIGZsb2F0IHNjYWxlLCBpbnZTY2FsZTsKKyAgICBpZiAoYW5nbGUgKyAxLjBmID4gMC4wNWYpIHsKKyAgICAgICAgaWYgKDEuMGYgLSBhbmdsZSA+PSAwLjA1ZikgeworICAgICAgICAgICAgZmxvYXQgdGhldGEgPSBhY29zKGFuZ2xlKTsKKyAgICAgICAgICAgIGZsb2F0IGludlNpblRoZXRhID0gMS4wZiAvIHNpbih0aGV0YSk7CisgICAgICAgICAgICBzY2FsZSA9IHNpbih0aGV0YSAqICgxLjBmIC0gdCkpICogaW52U2luVGhldGE7CisgICAgICAgICAgICBpbnZTY2FsZSA9IHNpbih0aGV0YSAqIHQpICogaW52U2luVGhldGE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzY2FsZSA9IDEuMGYgLSB0OworICAgICAgICAgICAgaW52U2NhbGUgPSB0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc1F1YXRlcm5pb25TZXQoJnRlbXBxMSwgdGVtcHEwLnosIC10ZW1wcTAueSwgdGVtcHEwLngsIC10ZW1wcTAudyk7CisgICAgICAgIHNjYWxlID0gc2luKE1fUEkgKiAoMC41ZiAtIHQpKTsKKyAgICAgICAgaW52U2NhbGUgPSBzaW4oTV9QSSAqIHQpOworICAgIH0KKworICAgIHJzUXVhdGVybmlvblNldChxLCB0ZW1wcTAudypzY2FsZSArIHRlbXBxMS53KmludlNjYWxlLCB0ZW1wcTAueCpzY2FsZSArIHRlbXBxMS54KmludlNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHEwLnkqc2NhbGUgKyB0ZW1wcTEueSppbnZTY2FsZSwgdGVtcHEwLnoqc2NhbGUgKyB0ZW1wcTEueippbnZTY2FsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJzUXVhdGVybmlvbkdldE1hdHJpeFVuaXQocnNfbWF0cml4NHg0ICptLCBjb25zdCByc19xdWF0ZXJuaW9uICpxKSB7CisgICAgZmxvYXQgeDIgPSAyLjBmICogcS0+eCAqIHEtPng7CisgICAgZmxvYXQgeTIgPSAyLjBmICogcS0+eSAqIHEtPnk7CisgICAgZmxvYXQgejIgPSAyLjBmICogcS0+eiAqIHEtPno7CisgICAgZmxvYXQgeHkgPSAyLjBmICogcS0+eCAqIHEtPnk7CisgICAgZmxvYXQgd3ogPSAyLjBmICogcS0+dyAqIHEtPno7CisgICAgZmxvYXQgeHogPSAyLjBmICogcS0+eCAqIHEtPno7CisgICAgZmxvYXQgd3kgPSAyLjBmICogcS0+dyAqIHEtPnk7CisgICAgZmxvYXQgd3ggPSAyLjBmICogcS0+dyAqIHEtPng7CisgICAgZmxvYXQgeXogPSAyLjBmICogcS0+eSAqIHEtPno7CisKKyAgICBtLT5tWzBdID0gMS4wZiAtIHkyIC0gejI7CisgICAgbS0+bVsxXSA9IHh5IC0gd3o7CisgICAgbS0+bVsyXSA9IHh6ICsgd3k7CisgICAgbS0+bVszXSA9IDAuMGY7CisKKyAgICBtLT5tWzRdID0geHkgKyB3ejsKKyAgICBtLT5tWzVdID0gMS4wZiAtIHgyIC0gejI7CisgICAgbS0+bVs2XSA9IHl6IC0gd3g7CisgICAgbS0+bVs3XSA9IDAuMGY7CisKKyAgICBtLT5tWzhdID0geHogLSB3eTsKKyAgICBtLT5tWzldID0geXogLSB3eDsKKyAgICBtLT5tWzEwXSA9IDEuMGYgLSB4MiAtIHkyOworICAgIG0tPm1bMTFdID0gMC4wZjsKKworICAgIG0tPm1bMTJdID0gMC4wZjsKKyAgICBtLT5tWzEzXSA9IDAuMGY7CisgICAgbS0+bVsxNF0gPSAwLjBmOworICAgIG0tPm1bMTVdID0gMS4wZjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIHV0aWxpdHkgZnVuY3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc0V4dHJhY3RGcnVzdHVtUGxhbmVzKGNvbnN0IHJzX21hdHJpeDR4NCAqbW9kZWxWaWV3UHJvaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdDQgKmxlZnQsIGZsb2F0NCAqcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQ0ICp0b3AsIGZsb2F0NCAqYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0NCAqbmVhciwgZmxvYXQ0ICpmYXIpIHsKKyAgICAvLyB4IHkgeiB3ID0gYSBiIGMgZCBpbiB0aGUgcGxhbmUgZXF1YXRpb24KKyAgICBsZWZ0LT54ID0gbW9kZWxWaWV3UHJvai0+bVszXSArIG1vZGVsVmlld1Byb2otPm1bMF07CisgICAgbGVmdC0+eSA9IG1vZGVsVmlld1Byb2otPm1bN10gKyBtb2RlbFZpZXdQcm9qLT5tWzRdOworICAgIGxlZnQtPnogPSBtb2RlbFZpZXdQcm9qLT5tWzExXSArIG1vZGVsVmlld1Byb2otPm1bOF07CisgICAgbGVmdC0+dyA9IG1vZGVsVmlld1Byb2otPm1bMTVdICsgbW9kZWxWaWV3UHJvai0+bVsxMl07CisKKyAgICByaWdodC0+eCA9IG1vZGVsVmlld1Byb2otPm1bM10gLSBtb2RlbFZpZXdQcm9qLT5tWzBdOworICAgIHJpZ2h0LT55ID0gbW9kZWxWaWV3UHJvai0+bVs3XSAtIG1vZGVsVmlld1Byb2otPm1bNF07CisgICAgcmlnaHQtPnogPSBtb2RlbFZpZXdQcm9qLT5tWzExXSAtIG1vZGVsVmlld1Byb2otPm1bOF07CisgICAgcmlnaHQtPncgPSBtb2RlbFZpZXdQcm9qLT5tWzE1XSAtIG1vZGVsVmlld1Byb2otPm1bMTJdOworCisgICAgdG9wLT54ID0gbW9kZWxWaWV3UHJvai0+bVszXSAtIG1vZGVsVmlld1Byb2otPm1bMV07CisgICAgdG9wLT55ID0gbW9kZWxWaWV3UHJvai0+bVs3XSAtIG1vZGVsVmlld1Byb2otPm1bNV07CisgICAgdG9wLT56ID0gbW9kZWxWaWV3UHJvai0+bVsxMV0gLSBtb2RlbFZpZXdQcm9qLT5tWzldOworICAgIHRvcC0+dyA9IG1vZGVsVmlld1Byb2otPm1bMTVdIC0gbW9kZWxWaWV3UHJvai0+bVsxM107CisKKyAgICBib3R0b20tPnggPSBtb2RlbFZpZXdQcm9qLT5tWzNdICsgbW9kZWxWaWV3UHJvai0+bVsxXTsKKyAgICBib3R0b20tPnkgPSBtb2RlbFZpZXdQcm9qLT5tWzddICsgbW9kZWxWaWV3UHJvai0+bVs1XTsKKyAgICBib3R0b20tPnogPSBtb2RlbFZpZXdQcm9qLT5tWzExXSArIG1vZGVsVmlld1Byb2otPm1bOV07CisgICAgYm90dG9tLT53ID0gbW9kZWxWaWV3UHJvai0+bVsxNV0gKyBtb2RlbFZpZXdQcm9qLT5tWzEzXTsKKworICAgIG5lYXItPnggPSBtb2RlbFZpZXdQcm9qLT5tWzNdICsgbW9kZWxWaWV3UHJvai0+bVsyXTsKKyAgICBuZWFyLT55ID0gbW9kZWxWaWV3UHJvai0+bVs3XSArIG1vZGVsVmlld1Byb2otPm1bNl07CisgICAgbmVhci0+eiA9IG1vZGVsVmlld1Byb2otPm1bMTFdICsgbW9kZWxWaWV3UHJvai0+bVsxMF07CisgICAgbmVhci0+dyA9IG1vZGVsVmlld1Byb2otPm1bMTVdICsgbW9kZWxWaWV3UHJvai0+bVsxNF07CisKKyAgICBmYXItPnggPSBtb2RlbFZpZXdQcm9qLT5tWzNdIC0gbW9kZWxWaWV3UHJvai0+bVsyXTsKKyAgICBmYXItPnkgPSBtb2RlbFZpZXdQcm9qLT5tWzddIC0gbW9kZWxWaWV3UHJvai0+bVs2XTsKKyAgICBmYXItPnogPSBtb2RlbFZpZXdQcm9qLT5tWzExXSAtIG1vZGVsVmlld1Byb2otPm1bMTBdOworICAgIGZhci0+dyA9IG1vZGVsVmlld1Byb2otPm1bMTVdIC0gbW9kZWxWaWV3UHJvai0+bVsxNF07CisKKyAgICBmbG9hdCBsZW4gPSBsZW5ndGgobGVmdC0+eHl6KTsKKyAgICAqbGVmdCAvPSBsZW47CisgICAgbGVuID0gbGVuZ3RoKHJpZ2h0LT54eXopOworICAgICpyaWdodCAvPSBsZW47CisgICAgbGVuID0gbGVuZ3RoKHRvcC0+eHl6KTsKKyAgICAqdG9wIC89IGxlbjsKKyAgICBsZW4gPSBsZW5ndGgoYm90dG9tLT54eXopOworICAgICpib3R0b20gLz0gbGVuOworICAgIGxlbiA9IGxlbmd0aChuZWFyLT54eXopOworICAgICpuZWFyIC89IGxlbjsKKyAgICBsZW4gPSBsZW5ndGgoZmFyLT54eXopOworICAgICpmYXIgLz0gbGVuOworfQorCitib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc0lzU3BoZXJlSW5GcnVzdHVtKGZsb2F0NCAqc3BoZXJlLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0NCAqbGVmdCwgZmxvYXQ0ICpyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdDQgKnRvcCwgZmxvYXQ0ICpib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQ0ICpuZWFyLCBmbG9hdDQgKmZhcikgeworCisgICAgZmxvYXQgZGlzdFRvQ2VudGVyID0gZG90KGxlZnQtPnh5eiwgc3BoZXJlLT54eXopICsgbGVmdC0+dzsKKyAgICBpZihkaXN0VG9DZW50ZXIgPCAtc3BoZXJlLT53KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZGlzdFRvQ2VudGVyID0gZG90KHJpZ2h0LT54eXosIHNwaGVyZS0+eHl6KSArIHJpZ2h0LT53OworICAgIGlmKGRpc3RUb0NlbnRlciA8IC1zcGhlcmUtPncpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkaXN0VG9DZW50ZXIgPSBkb3QodG9wLT54eXosIHNwaGVyZS0+eHl6KSArIHRvcC0+dzsKKyAgICBpZihkaXN0VG9DZW50ZXIgPCAtc3BoZXJlLT53KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZGlzdFRvQ2VudGVyID0gZG90KGJvdHRvbS0+eHl6LCBzcGhlcmUtPnh5eikgKyBib3R0b20tPnc7CisgICAgaWYoZGlzdFRvQ2VudGVyIDwgLXNwaGVyZS0+dykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGRpc3RUb0NlbnRlciA9IGRvdChuZWFyLT54eXosIHNwaGVyZS0+eHl6KSArIG5lYXItPnc7CisgICAgaWYoZGlzdFRvQ2VudGVyIDwgLXNwaGVyZS0+dykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGRpc3RUb0NlbnRlciA9IGRvdChmYXItPnh5eiwgc3BoZXJlLT54eXopICsgZmFyLT53OworICAgIGlmKGRpc3RUb0NlbnRlciA8IC1zcGhlcmUtPncpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gaW50IG9wcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworX19pbmxpbmVfXyBzdGF0aWMgdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUsIGFsd2F5c19pbmxpbmUpKSByc0NsYW1wKHVpbnQgYW1vdW50LCB1aW50IGxvdywgdWludCBoaWdoKSB7CisgICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Cit9CitfX2lubGluZV9fIHN0YXRpYyBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlLCBhbHdheXNfaW5saW5lKSkgcnNDbGFtcChpbnQgYW1vdW50LCBpbnQgbG93LCBpbnQgaGlnaCkgeworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorX19pbmxpbmVfXyBzdGF0aWMgdXNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSwgYWx3YXlzX2lubGluZSkpIHJzQ2xhbXAodXNob3J0IGFtb3VudCwgdXNob3J0IGxvdywgdXNob3J0IGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK19faW5saW5lX18gc3RhdGljIHNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSwgYWx3YXlzX2lubGluZSkpIHJzQ2xhbXAoc2hvcnQgYW1vdW50LCBzaG9ydCBsb3csIHNob3J0IGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK19faW5saW5lX18gc3RhdGljIHVjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSwgYWx3YXlzX2lubGluZSkpIHJzQ2xhbXAodWNoYXIgYW1vdW50LCB1Y2hhciBsb3csIHVjaGFyIGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK19faW5saW5lX18gc3RhdGljIGNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlLCBhbHdheXNfaW5saW5lKSkgcnNDbGFtcChjaGFyIGFtb3VudCwgY2hhciBsb3csIGNoYXIgaGlnaCkgeworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvc2NyaXB0Yy9yc19ncmFwaGljcy5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfZ3JhcGhpY3MucnNoCmluZGV4IDcwY2Q1NjIuLmMwYjJkMmQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvc2NyaXB0Yy9yc19ncmFwaGljcy5yc2gKKysrIGIvbGlicy9ycy9zY3JpcHRjL3JzX2dyYXBoaWNzLnJzaApAQCAtMSw2NSArMSwxMDYgQEAKKyNpZm5kZWYgX19SU19HUkFQSElDU19SU0hfXworI2RlZmluZSBfX1JTX0dSQVBISUNTX1JTSF9fCisKKyNpbmNsdWRlICJyc19tYXRoLnJzaCIKIAogCi1leHRlcm4gZmxvYXQyIHZlYzJSYW5kKGZsb2F0IGxlbik7CisvLyBCaW5kIGEgUHJvZ3JhbUZyYWdtZW50IHRvIHRoZSBSUyBjb250ZXh0LgorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KHJzX3Byb2dyYW1fZnJhZ21lbnQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKHJzX3Byb2dyYW1fc3RvcmUpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChyc19wcm9ncmFtX3ZlcnRleCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0JpbmRQcm9ncmFtUmFzdGVyKHJzX3Byb2dyYW1fcmFzdGVyKTsKIAotZXh0ZXJuIGZsb2F0MyBmbG9hdDNOb3JtKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQgZmxvYXQzTGVuZ3RoKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQzIGZsb2F0M0FkZChmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKTsKLWV4dGVybiBmbG9hdDMgZmxvYXQzU3ViKGZsb2F0MyBsaHMsIGZsb2F0MyByaHMpOwotZXh0ZXJuIGZsb2F0MyBmbG9hdDNDcm9zcyhmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKTsKLWV4dGVybiBmbG9hdCBmbG9hdDNEb3QoZmxvYXQzIGxocywgZmxvYXQzIHJocyk7Ci1leHRlcm4gZmxvYXQzIGZsb2F0M1NjYWxlKGZsb2F0MyB2LCBmbG9hdCBzY2FsZSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0JpbmRTYW1wbGVyKHJzX3Byb2dyYW1fZnJhZ21lbnQsIHVpbnQgc2xvdCwgcnNfc2FtcGxlcik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0JpbmRUZXh0dXJlKHJzX3Byb2dyYW1fZnJhZ21lbnQsIHVpbnQgc2xvdCwgcnNfYWxsb2NhdGlvbik7CiAKLWV4dGVybiBmbG9hdDQgZmxvYXQ0QWRkKGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpOwotZXh0ZXJuIGZsb2F0NCBmbG9hdDRTdWIoZmxvYXQ0IGxocywgZmxvYXQ0IHJocyk7Ci1leHRlcm4gZmxvYXQ0IGZsb2F0NENyb3NzKGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpOwotZXh0ZXJuIGZsb2F0IGZsb2F0NERvdChmbG9hdDQgbGhzLCBmbG9hdDQgcmhzKTsKLWV4dGVybiBmbG9hdDQgZmxvYXQ0U2NhbGUoZmxvYXQ0IHYsIGZsb2F0IHNjYWxlKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4KGNvbnN0IHJzX21hdHJpeDR4NCAqKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeChjb25zdCByc19tYXRyaXg0eDQgKik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkVGV4dHVyZU1hdHJpeChjb25zdCByc19tYXRyaXg0eDQgKik7CiAKLSAgICAvLyBjb250ZXh0Ci1leHRlcm4gdm9pZCBiaW5kUHJvZ3JhbUZyYWdtZW50KHJzX3Byb2dyYW1fZnJhZ21lbnQpOwotZXh0ZXJuIHZvaWQgYmluZFByb2dyYW1TdG9yZShyc19wcm9ncmFtX3N0b3JlKTsKLWV4dGVybiB2b2lkIGJpbmRQcm9ncmFtVmVydGV4KHJzX3Byb2dyYW1fdmVydGV4KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnUHJvZ3JhbVZlcnRleEdldFByb2plY3Rpb25NYXRyaXgocnNfbWF0cml4NHg0ICopOwogCi1leHRlcm4gdm9pZCBiaW5kU2FtcGxlcihyc19wcm9ncmFtX2ZyYWdtZW50LCBpbnQgc2xvdCwgcnNfc2FtcGxlcik7Ci1leHRlcm4gdm9pZCBiaW5kU2FtcGxlcihyc19wcm9ncmFtX2ZyYWdtZW50LCBpbnQgc2xvdCwgcnNfYWxsb2NhdGlvbik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ1Byb2dyYW1GcmFnbWVudENvbnN0YW50Q29sb3IocnNfcHJvZ3JhbV9mcmFnbWVudCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwogCi1leHRlcm4gdm9pZCB2cExvYWRNb2RlbE1hdHJpeChjb25zdCBmbG9hdCAqKTsKLWV4dGVybiB2b2lkIHZwTG9hZFRleHR1cmVNYXRyaXgoY29uc3QgZmxvYXQgKik7CitleHRlcm4gdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0dldFdpZHRoKHZvaWQpOworZXh0ZXJuIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dHZXRIZWlnaHQodm9pZCk7CiAKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnVXBsb2FkVG9UZXh0dXJlKHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dVcGxvYWRUb1RleHR1cmUocnNfYWxsb2NhdGlvbiwgdWludCBtaXBMZXZlbCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ1VwbG9hZFRvQnVmZmVyT2JqZWN0KHJzX2FsbG9jYXRpb24pOwogCi0vLyBkcmF3aW5nCi1leHRlcm4gdm9pZCBkcmF3UmVjdChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgeik7Ci1leHRlcm4gdm9pZCBkcmF3UXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0KTsKLWV4dGVybiB2b2lkIGRyYXdRdWFkVGV4Q29vcmRzKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHUxLCBmbG9hdCB2MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwgZmxvYXQgdTIsIGZsb2F0IHYyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB1MywgZmxvYXQgdjMsIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsIGZsb2F0IHU0LCBmbG9hdCB2NCk7Ci1leHRlcm4gdm9pZCBkcmF3U3ByaXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpOwotZXh0ZXJuIHZvaWQgZHJhd1Nwcml0ZVNjcmVlbnNwYWNlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpOwotZXh0ZXJuIHZvaWQgZHJhd0xpbmUoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6Mik7Ci1leHRlcm4gdm9pZCBkcmF3UG9pbnQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSk7Ci1leHRlcm4gdm9pZCBkcmF3U2ltcGxlTWVzaChpbnQgaXNtKTsKLWV4dGVybiB2b2lkIGRyYXdTaW1wbGVNZXNoUmFuZ2UoaW50IGlzbSwgaW50IHN0YXJ0LCBpbnQgbGVuKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRHJhd1JlY3QoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHopOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dEcmF3UXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAorICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsCisgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKKyAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgdTEsIGZsb2F0IHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsIGZsb2F0IHUyLCBmbG9hdCB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB1MywgZmxvYXQgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwgZmxvYXQgdTQsIGZsb2F0IHY0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRHJhd1Nwcml0ZVNjcmVlbnNwYWNlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpOwogCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0RyYXdNZXNoKHJzX21lc2ggaXNtKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRHJhd01lc2gocnNfbWVzaCBpc20sIHVpbnQgcHJpbWl0aXZlSW5kZXgpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dEcmF3TWVzaChyc19tZXNoIGlzbSwgdWludCBwcmltaXRpdmVJbmRleCwgdWludCBzdGFydCwgdWludCBsZW4pOworCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0NsZWFyQ29sb3IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dDbGVhckRlcHRoKGZsb2F0KTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dEcmF3VGV4dChjb25zdCBjaGFyICosIGludCB4LCBpbnQgeSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0RyYXdUZXh0KHJzX2FsbG9jYXRpb24sIGludCB4LCBpbnQgeSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0JpbmRGb250KHJzX2ZvbnQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dGb250Q29sb3IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOworCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ01lc2hDb21wdXRlQm91bmRpbmdCb3gocnNfbWVzaCBtZXNoLCBmbG9hdCAqbWluWCwgZmxvYXQgKm1pblksIGZsb2F0ICptaW5aLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKm1heFgsIGZsb2F0ICptYXhZLCBmbG9hdCAqbWF4Wik7Cit2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc2dNZXNoQ29tcHV0ZUJvdW5kaW5nQm94KHJzX21lc2ggbWVzaCwgZmxvYXQzICpiQm94TWluLCBmbG9hdDMgKmJCb3hNYXgpIHsKKyAgICBmbG9hdCB4MSwgeTEsIHoxLCB4MiwgeTIsIHoyOworICAgIHJzZ01lc2hDb21wdXRlQm91bmRpbmdCb3gobWVzaCwgJngxLCAmeTEsICZ6MSwgJngyLCAmeTIsICZ6Mik7CisgICAgYkJveE1pbi0+eCA9IHgxOworICAgIGJCb3hNaW4tPnkgPSB5MTsKKyAgICBiQm94TWluLT56ID0gejE7CisgICAgYkJveE1heC0+eCA9IHgyOworICAgIGJCb3hNYXgtPnkgPSB5MjsKKyAgICBiQm94TWF4LT56ID0gejI7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIG1pc2MKLWV4dGVybiB2b2lkIHBmQ2xlYXJDb2xvcihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gdm9pZCBjb2xvcihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gdm9pZCBoc2IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIHZvaWQgaHNiVG9SZ2IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQqKTsKLWV4dGVybiBpbnQgaHNiVG9BYmdyKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKIAotZXh0ZXJuIHZvaWQgdXBsb2FkVG9UZXh0dXJlKGludCwgaW50KTsKLWV4dGVybiB2b2lkIHVwbG9hZFRvQnVmZmVyT2JqZWN0KGludCk7CisvLyBEZXByaWNhdGVkCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIGNvbG9yKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKIAotZXh0ZXJuIGludCBjb2xvckZsb2F0UkdCQXRvVU5vcm04KGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBpbnQgY29sb3JGbG9hdFJHQnRvNTY1KGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotCi1leHRlcm4gaW50IGdldFdpZHRoKCk7Ci1leHRlcm4gaW50IGdldEhlaWdodCgpOwotCi1leHRlcm4gaW50IHNlbmRUb0NsaWVudCh2b2lkICpkYXRhLCBpbnQgY21kSUQsIGludCBsZW4sIGludCB3YWl0Rm9yU3BhY2UpOwotCi1leHRlcm4gdm9pZCBkZWJ1Z0YoY29uc3QgY2hhciAqLCBmbG9hdCk7Ci1leHRlcm4gdm9pZCBkZWJ1Z0kzMihjb25zdCBjaGFyICosIGludCk7Ci1leHRlcm4gdm9pZCBkZWJ1Z0hleEkzMihjb25zdCBjaGFyICosIGludCk7Ci0KLQorI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvc2NyaXB0Yy9yc19tYXRoLnJzaCBiL2xpYnMvcnMvc2NyaXB0Yy9yc19tYXRoLnJzaAppbmRleCA2MTNjN2NhLi5jODQyZWYxIDEwMDY0NAotLS0gYS9saWJzL3JzL3NjcmlwdGMvcnNfbWF0aC5yc2gKKysrIGIvbGlicy9ycy9zY3JpcHRjL3JzX21hdGgucnNoCkBAIC0xLDI4NyArMSwyMTggQEAKLS8vIEZsb2F0IG9wcworI2lmbmRlZiBfX1JTX01BVEhfUlNIX18KKyNkZWZpbmUgX19SU19NQVRIX1JTSF9fCiAKLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhmbG9hdDE2KTsKKy8vIERlYnVnZ2luZywgcHJpbnQgdG8gdGhlIExPRyBhIGRlc2NyaXB0aW9uIHN0cmluZyBhbmQgYSB2YWx1ZS4KK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGZsb2F0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGZsb2F0LCBmbG9hdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGNvbnN0IHJzX21hdHJpeDR4NCAqKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGNvbnN0IHJzX21hdHJpeDN4MyAqKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGNvbnN0IHJzX21hdHJpeDJ4MiAqKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGludCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCB1aW50KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKik7CisjZGVmaW5lIFJTX0RFQlVHKGEpIHJzRGVidWcoI2EsIGEpCisjZGVmaW5lIFJTX0RFQlVHX01BUktFUiByc0RlYnVnKF9fRklMRV9fLCBfX0xJTkVfXykKIAotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3MoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3MoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0MTYpOwogCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXNpbihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXNpbihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQxNik7CisjaW5jbHVkZSAicnNfY2wucnNoIgorI2luY2x1ZGUgInJzX2NvcmUucnNoIgogCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQxNik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX2VsZW1lbnQgKmRzdCwgcnNfZWxlbWVudCBzcmMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc190eXBlICpkc3QsIHJzX3R5cGUgc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfYWxsb2NhdGlvbiAqZHN0LCByc19hbGxvY2F0aW9uIHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX3NhbXBsZXIgKmRzdCwgcnNfc2FtcGxlciBzcmMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19zY3JpcHQgKmRzdCwgcnNfc2NyaXB0IHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX21lc2ggKmRzdCwgcnNfbWVzaCBzcmMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19wcm9ncmFtX2ZyYWdtZW50ICpkc3QsIHJzX3Byb2dyYW1fZnJhZ21lbnQgc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfcHJvZ3JhbV92ZXJ0ZXggKmRzdCwgcnNfcHJvZ3JhbV92ZXJ0ZXggc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfcHJvZ3JhbV9yYXN0ZXIgKmRzdCwgcnNfcHJvZ3JhbV9yYXN0ZXIgc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfcHJvZ3JhbV9zdG9yZSAqZHN0LCByc19wcm9ncmFtX3N0b3JlIHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX2ZvbnQgKmRzdCwgcnNfZm9udCBzcmMpOwogCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4yKGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQxNiwgZmxvYXQxNik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfZWxlbWVudCAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc190eXBlICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX2FsbG9jYXRpb24gKmRzdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfc2FtcGxlciAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19zY3JpcHQgKmRzdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfbWVzaCAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19wcm9ncmFtX2ZyYWdtZW50ICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX3Byb2dyYW1fdmVydGV4ICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX3Byb2dyYW1fcmFzdGVyICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX3Byb2dyYW1fc3RvcmUgKmRzdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfZm9udCAqZHN0KTsKIAotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNlaWwoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNlaWwoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MiwgZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDMsIGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQ0LCBmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0OCwgZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQxNiwgZmxvYXQxNiwgZmxvYXQxNik7Ci1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MiwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQzLCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0OCwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MTYsIGZsb2F0LCBmbG9hdCk7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcHlzaWduKGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29weXNpZ24oZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3MoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGVncmVlcyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGVncmVlcyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkZWdyZWVzKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDIoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDIoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmYWJzKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmYWJzKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZhYnMoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQxNiwgZmxvYXQxNik7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQyLCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQzLCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQ0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQ4LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MTYsIGZsb2F0KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MTYsIGZsb2F0MTYpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MiwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MywgZmxvYXQpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0NCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0OCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDE2LCBmbG9hdCk7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtb2QoZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtb2QoZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2coZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cyKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0MTYsIGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQxNiwgZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIsIGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MywgZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQ0LCBmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDgsIGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDE2LCBmbG9hdDE2LCBmbG9hdDE2KTsKLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIsIGZsb2F0MiwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQzLCBmbG9hdDMsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0NCwgZmxvYXQ0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDgsIGZsb2F0OCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MTYsIGZsb2F0MTYsIGZsb2F0KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvdyhmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93KGZsb2F0MTYsIGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmFkaWFucyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmFkaWFucyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByYWRpYW5zKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJpbnQoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaWduKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaWduKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpZ24oZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW4oZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3FydChmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3FydChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGFuKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0MTYpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX2VsZW1lbnQpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX3R5cGUpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX3NhbXBsZXIpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX3NjcmlwdCk7CitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfbWVzaCk7CitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfcHJvZ3JhbV9mcmFnbWVudCk7CitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfcHJvZ3JhbV92ZXJ0ZXgpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX3Byb2dyYW1fcmFzdGVyKTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19wcm9ncmFtX3N0b3JlKTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19mb250KTsKIAogCiAKKy8vIEFsbG9jYXRpb25zCisKKy8vIFJldHVybiB0aGUgcnNfYWxsb2NhdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBib3VuZCBkYXRhCisvLyBwb2ludGVyLgorZXh0ZXJuIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEFsbG9jYXRpb24oY29uc3Qgdm9pZCAqKTsKKworLy8gUmV0dXJuIHRoZSBkaW1lbnNpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBhbGxvY2F0aW9uLgorZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uR2V0RGltWChyc19hbGxvY2F0aW9uKTsKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbkdldERpbVkocnNfYWxsb2NhdGlvbik7CitleHRlcm4gdWludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25HZXREaW1aKHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uR2V0RGltTE9EKHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uR2V0RGltRmFjZXMocnNfYWxsb2NhdGlvbik7CisKKy8vIEV4dHJhY3QgYSBzaW5nbGUgZWxlbWVudCBmcm9tIGFuIGFsbG9jYXRpb24uCitleHRlcm4gY29uc3Qgdm9pZCAqIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXQocnNfYWxsb2NhdGlvbiwgdWludDMyX3QgeCk7CitleHRlcm4gY29uc3Qgdm9pZCAqIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXQocnNfYWxsb2NhdGlvbiwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CitleHRlcm4gY29uc3Qgdm9pZCAqIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXQocnNfYWxsb2NhdGlvbiwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisKKy8vIFJldHVybiBhIHJhbmRvbSB2YWx1ZSBiZXR3ZWVuIDAgKG9yIG1pbl92YWx1ZSkgYW5kIG1heF9tYWx1ZS4KK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1JhbmQoaW50IG1heF92YWx1ZSk7CitleHRlcm4gaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNSYW5kKGludCBtaW5fdmFsdWUsIGludCBtYXhfdmFsdWUpOworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNSYW5kKGZsb2F0IG1heF92YWx1ZSk7CitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1JhbmQoZmxvYXQgbWluX3ZhbHVlLCBmbG9hdCBtYXhfdmFsdWUpOworCisvLyByZXR1cm4gdGhlIGZyYWN0aW9uYWwgcGFydCBvZiBhIGZsb2F0CisvLyBtaW4odiAtICgoaW50KWZsb29yKHYpKSwgMHgxLmZmZmZmZXAtMWYpOworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNGcmFjKGZsb2F0KTsKKworLy8gdGltZQorZXh0ZXJuIGludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NlY29uZCh2b2lkKTsKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNaW51dGUodm9pZCk7CitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSG91cih2b2lkKTsKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEYXkodm9pZCk7CitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzTW9udGgodm9pZCk7CitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzWWVhcih2b2lkKTsKKworLy8gUmV0dXJuIHRoZSBjdXJyZW50IHN5c3RlbSBjbG9jayBpbiBtaWxsaXNlY29uZHMKK2V4dGVybiBpbnQ2NF90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNVcHRpbWVNaWxsaXModm9pZCk7CisKKy8vIFJldHVybiB0aGUgY3VycmVudCBzeXN0ZW0gY2xvY2sgaW4gbmFub3NlY29uZHMKK2V4dGVybiBpbnQ2NF90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNVcHRpbWVOYW5vcyh2b2lkKTsKKworLy8gUmV0dXJuIHRoZSB0aW1lIGluIHNlY29uZHMgc2luY2UgZnVuY3Rpb24gd2FzIGxhc3QgY2FsbGVkIGluIHRoaXMgc2NyaXB0LgorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXREdCh2b2lkKTsKKworLy8gU2VuZCBhIG1lc3NhZ2UgYmFjayB0byB0aGUgY2xpZW50LiAgV2lsbCBub3QgYmxvY2sgYW5kIHJldHVybnMgdHJ1ZQorLy8gaWYgdGhlIG1lc3NhZ2Ugd2FzIHNlbmRhYmxlIGFuZCBmYWxzZSBpZiB0aGUgZmlmbyB3YXMgZnVsbC4KKy8vIEEgbWVzc2FnZSBJRCBpcyByZXF1aXJlZC4gIERhdGEgcGF5bG9hZCBpcyBvcHRpb25hbC4KK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZW5kVG9DbGllbnQoaW50IGNtZElEKTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZW5kVG9DbGllbnQoaW50IGNtZElELCBjb25zdCB2b2lkICpkYXRhLCB1aW50IGxlbik7CisKKy8vIFNlbmQgYSBtZXNzYWdlIGJhY2sgdG8gdGhlIGNsaWVudCwgYmxvY2tpbmcgdW50aWwgdGhlIG1lc3NhZ2UgaXMgcXVldWVkLgorLy8gQSBtZXNzYWdlIElEIGlzIHJlcXVpcmVkLiAgRGF0YSBwYXlsb2FkIGlzIG9wdGlvbmFsLgorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKGludCBjbWRJRCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoaW50IGNtZElELCBjb25zdCB2b2lkICpkYXRhLCB1aW50IGxlbik7CiAKIAorLy8gU2NyaXB0IHRvIFNjcmlwdAorZW51bSByc19mb3JfZWFjaF9zdHJhdGVneSB7CisgICAgUlNfRk9SX0VBQ0hfU1RSQVRFR1lfU0VSSUFMLAorICAgIFJTX0ZPUl9FQUNIX1NUUkFURUdZX0RPTlRfQ0FSRSwKKyAgICBSU19GT1JfRUFDSF9TVFJBVEVHWV9EU1RfTElORUFSLAorICAgIFJTX0ZPUl9FQUNIX1NUUkFURUdZX1RJTEVfU01BTEwsCisgICAgUlNfRk9SX0VBQ0hfU1RSQVRFR1lfVElMRV9NRURJVU0sCisgICAgUlNfRk9SX0VBQ0hfU1RSQVRFR1lfVElMRV9MQVJHRQorfTsKIAotLy8gSW50IG9wcwordHlwZWRlZiBzdHJ1Y3QgcnNfc2NyaXB0X2NhbGwgeworICAgIGVudW0gcnNfZm9yX2VhY2hfc3RyYXRlZ3kgc3RyYXRlZ3k7CisgICAgdWludDMyX3QgeFN0YXJ0OworICAgIHVpbnQzMl90IHhFbmQ7CisgICAgdWludDMyX3QgeVN0YXJ0OworICAgIHVpbnQzMl90IHlFbmQ7CisgICAgdWludDMyX3QgelN0YXJ0OworICAgIHVpbnQzMl90IHpFbmQ7CisgICAgdWludDMyX3QgYXJyYXlTdGFydDsKKyAgICB1aW50MzJfdCBhcnJheUVuZDsKK30gcnNfc2NyaXB0X2NhbGxfdDsKIAotZXh0ZXJuIGludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50KTsKLWV4dGVybiBpbnQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhpbnQyKTsKLWV4dGVybiBpbnQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhpbnQzKTsKLWV4dGVybiBpbnQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhpbnQ0KTsKLWV4dGVybiBpbnQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhpbnQ4KTsKLWV4dGVybiBpbnQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50MTYpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0ZvckVhY2gocnNfc2NyaXB0IHNjcmlwdCwgcnNfYWxsb2NhdGlvbiBpbnB1dCwKKyAgICAgICAgICAgICAgcnNfYWxsb2NhdGlvbiBvdXRwdXQsIGNvbnN0IHZvaWQgKiB1c3JEYXRhKTsKIAorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0ZvckVhY2gocnNfc2NyaXB0IHNjcmlwdCwgcnNfYWxsb2NhdGlvbiBpbnB1dCwKKyAgICAgICAgICAgICAgcnNfYWxsb2NhdGlvbiBvdXRwdXQsIGNvbnN0IHZvaWQgKiB1c3JEYXRhLAorICAgICAgICAgICAgICBjb25zdCByc19zY3JpcHRfY2FsbF90ICopOwogCi0KLS8qCi1leHRlcm4gZmxvYXQgbW9kZihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0IHJhbmRmKGZsb2F0KTsKLWV4dGVybiBmbG9hdCByYW5kZjIoZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdCBmcmFjZihmbG9hdCk7Ci1leHRlcm4gZmxvYXQgbGVycGYoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQgbWFwZihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotKi8KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3NjcmlwdGMvcnNfdHlwZXMucnNoIGIvbGlicy9ycy9zY3JpcHRjL3JzX3R5cGVzLnJzaAppbmRleCA0MTk4YTc0Li5kZDQyOTcyIDEwMDY0NAotLS0gYS9saWJzL3JzL3NjcmlwdGMvcnNfdHlwZXMucnNoCisrKyBiL2xpYnMvcnMvc2NyaXB0Yy9yc190eXBlcy5yc2gKQEAgLTIsNzAgKzIsNzMgQEAKIHR5cGVkZWYgY2hhciBpbnQ4X3Q7CiB0eXBlZGVmIHNob3J0IGludDE2X3Q7CiB0eXBlZGVmIGludCBpbnQzMl90OwotLy90eXBlZGVmIGxvbmcgaW50NjRfdDsKK3R5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7CiAKIHR5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OwogdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1aW50MTZfdDsKIHR5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMl90OwotLy90eXBlZGVmIGxvbmcgdWludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKIAogdHlwZWRlZiB1aW50OF90IHVjaGFyOwogdHlwZWRlZiB1aW50MTZfdCB1c2hvcnQ7CiB0eXBlZGVmIHVpbnQzMl90IHVpbnQ7Ci0vL3R5cGVkZWYgdWludDY0X3QgdWxvbmc7Cit0eXBlZGVmIHVpbnQ2NF90IHVsb25nOwogCi10eXBlZGVmIGludCByc19lbGVtZW50OwotdHlwZWRlZiBpbnQgcnNfdHlwZTsKLXR5cGVkZWYgaW50IHJzX2FsbG9jYXRpb247Ci10eXBlZGVmIGludCByc19zYW1wbGVyOwotdHlwZWRlZiBpbnQgcnNfc2NyaXB0OwotdHlwZWRlZiBpbnQgcnNfbWVzaDsKLXR5cGVkZWYgaW50IHJzX3Byb2dyYW1fZnJhZ21lbnQ7Ci10eXBlZGVmIGludCByc19wcm9ncmFtX3ZlcnRleDsKLXR5cGVkZWYgaW50IHJzX3Byb2dyYW1fcmFzdGVyOwotdHlwZWRlZiBpbnQgcnNfcHJvZ3JhbV9zdG9yZTsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX2VsZW1lbnQ7Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc190eXBlOwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfYWxsb2NhdGlvbjsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX3NhbXBsZXI7Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19zY3JpcHQ7Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19tZXNoOwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfcHJvZ3JhbV9mcmFnbWVudDsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX3Byb2dyYW1fdmVydGV4OwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfcHJvZ3JhbV9yYXN0ZXI7Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19wcm9ncmFtX3N0b3JlOwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfZm9udDsKKwogCiB0eXBlZGVmIGZsb2F0IGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgZmxvYXQgZmxvYXQzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiBmbG9hdCBmbG9hdDQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIGZsb2F0IGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgZmxvYXQgZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIHR5cGVkZWYgdWNoYXIgdWNoYXIyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwogdHlwZWRlZiB1Y2hhciB1Y2hhcjMgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSk7CiB0eXBlZGVmIHVjaGFyIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgdWNoYXIgdWNoYXI4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwotdHlwZWRlZiB1Y2hhciB1Y2hhcjE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKIAogdHlwZWRlZiB1c2hvcnQgdXNob3J0MiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgdXNob3J0IHVzaG9ydDMgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSk7CiB0eXBlZGVmIHVzaG9ydCB1c2hvcnQ0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiB1c2hvcnQgdXNob3J0OCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgdXNob3J0IHVzaG9ydDE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKIAogdHlwZWRlZiB1aW50IHVpbnQyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwogdHlwZWRlZiB1aW50IHVpbnQzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiB1aW50IHVpbnQ0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiB1aW50IHVpbnQ4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwotdHlwZWRlZiB1aW50IHVpbnQxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIHR5cGVkZWYgY2hhciBjaGFyMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgY2hhciBjaGFyMyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgY2hhciBjaGFyNCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgY2hhciBjaGFyOCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgY2hhciBjaGFyMTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiB0eXBlZGVmIHNob3J0IHNob3J0MiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgc2hvcnQgc2hvcnQzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiBzaG9ydCBzaG9ydDQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIHNob3J0IHNob3J0OCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgc2hvcnQgc2hvcnQxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIHR5cGVkZWYgaW50IGludDIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIGludCBpbnQzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiBpbnQgaW50NCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgaW50IGludDggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIGludCBpbnQxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIAordHlwZWRlZiBzdHJ1Y3QgeworICAgIGZsb2F0IG1bMTZdOworfSByc19tYXRyaXg0eDQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBmbG9hdCBtWzldOworfSByc19tYXRyaXgzeDM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBmbG9hdCBtWzRdOworfSByc19tYXRyaXgyeDI7CisKK3R5cGVkZWYgZmxvYXQ0IHJzX3F1YXRlcm5pb247CisKKyNkZWZpbmUgUlNfUEFDS0VEIF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpCiAKZGlmZiAtLWdpdCBhL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L1NoYXJlZEJ1ZmZlclN0YWNrLmNwcCBiL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L1NoYXJlZEJ1ZmZlclN0YWNrLmNwcAppbmRleCAzOGIyZmFlLi5hNDNiNDQwMiAxMDA2NDQKLS0tIGEvbGlicy9zdXJmYWNlZmxpbmdlcl9jbGllbnQvU2hhcmVkQnVmZmVyU3RhY2suY3BwCisrKyBiL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L1NoYXJlZEJ1ZmZlclN0YWNrLmNwcApAQCAtMzc2LDExICszNzYsNiBAQAogewogICAgIFNoYXJlZEJ1ZmZlclN0YWNrJiBzdGFjayggKm1TaGFyZWRTdGFjayApOwogCi0gICAgaWYgKHN0YWNrLmhlYWQgPT0gdGFpbCAmJiBzdGFjay5hdmFpbGFibGUgPT0gbU51bUJ1ZmZlcnMpIHsKLSAgICAgICAgTE9HVygiZGVxdWV1ZTogdGFpbD0lZCwgaGVhZD0lZCwgYXZhaWw9JWQsIHF1ZXVlZD0lZCIsCi0gICAgICAgICAgICAgICAgdGFpbCwgc3RhY2suaGVhZCwgc3RhY2suYXZhaWxhYmxlLCBzdGFjay5xdWV1ZWQpOwotICAgIH0KLQogICAgIFJXTG9jazo6QXV0b1JMb2NrIF9yZChtTG9jayk7CiAKICAgICBjb25zdCBuc2Vjc190IGRlcXVldWVUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwpkaWZmIC0tZ2l0IGEvbGlicy9zdXJmYWNlZmxpbmdlcl9jbGllbnQvU3VyZmFjZS5jcHAgYi9saWJzL3N1cmZhY2VmbGluZ2VyX2NsaWVudC9TdXJmYWNlLmNwcAppbmRleCBjYjc2MDkxLi4yYmM1ZmFkIDEwMDY0NAotLS0gYS9saWJzL3N1cmZhY2VmbGluZ2VyX2NsaWVudC9TdXJmYWNlLmNwcAorKysgYi9saWJzL3N1cmZhY2VmbGluZ2VyX2NsaWVudC9TdXJmYWNlLmNwcApAQCAtMzYzLDYgKzM2MywxMyBAQAogICAgICAgICBoZWlnaHQgICA9IHN1cmZhY2UtPm1IZWlnaHQ7CiAgICAgICAgIGZvcm1hdCAgID0gc3VyZmFjZS0+bUZvcm1hdDsKICAgICAgICAgZmxhZ3MgICAgPSBzdXJmYWNlLT5tRmxhZ3M7CisgICAgfSBlbHNlIGlmIChzdXJmYWNlICE9IDAgJiYgc3VyZmFjZS0+bVN1cmZhY2UgIT0gMCkgeworICAgICAgICBMT0dXKCJQYXJjZWxpbmcgaW52YWxpZCBzdXJmYWNlIHdpdGggbm9uLU5VTEwgSVN1cmZhY2UgYXMgTlVMTDogIgorICAgICAgICAgICAgICJtU3VyZmFjZSA9ICVwLCBtSWRlbnRpdHkgPSAlZCwgbVdpZHRoID0gJWQsIG1IZWlnaHQgPSAlZCwgIgorICAgICAgICAgICAgICJtRm9ybWF0ID0gJWQsIG1GbGFncyA9IDB4JTA4eCwgbUluaXRDaGVjayA9ICVkIiwKKyAgICAgICAgICAgICBzdXJmYWNlLT5tU3VyZmFjZS5nZXQoKSwgc3VyZmFjZS0+bUlkZW50aXR5LCBzdXJmYWNlLT5tV2lkdGgsCisgICAgICAgICAgICAgc3VyZmFjZS0+bUhlaWdodCwgc3VyZmFjZS0+bUZvcm1hdCwgc3VyZmFjZS0+bUZsYWdzLAorICAgICAgICAgICAgIHN1cmZhY2UtPm1Jbml0Q2hlY2spOwogICAgIH0KICAgICBwYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKHN1ciE9MCA/IHN1ci0+YXNCaW5kZXIoKSA6IE5VTEwpOwogICAgIHBhcmNlbC0+d3JpdGVJbnQzMihpZGVudGl0eSk7CkBAIC00MzYsNiArNDQzLDkgQEAKICAgICAgICAgICAgIG1TaGFyZWRCdWZmZXJDbGllbnQgPSBuZXcgU2hhcmVkQnVmZmVyQ2xpZW50KAogICAgICAgICAgICAgICAgICAgICBtQ2xpZW50LmdldFNoYXJlZENsaWVudCgpLCB0b2tlbiwgMiwgbUlkZW50aXR5KTsKICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBtQ2xpZW50LmdldFNoYXJlZENsaWVudCgpLT52YWxpZGF0ZSh0b2tlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dXKCJOb3QgaW5pdGlhbGl6aW5nIHRoZSBzaGFyZWQgYnVmZmVyIGNsaWVudCBiZWNhdXNlIHRva2VuID0gJWQiLAorICAgICAgICAgICAgICAgICAgICB0b2tlbik7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwIGIvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcAppbmRleCBhMTQwMWFkLi40MzYyZDE0IDEwMDY0NAotLS0gYS9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwCisrKyBiL2xpYnMvdXRpbHMvUmVzb3VyY2VUeXBlcy5jcHAKQEAgLTMxNyw2ICszMTcsMTIgQEAKICAgICAgICAgICAgIG1TdHJpbmdQb29sU2l6ZSA9CiAgICAgICAgICAgICAgICAgKG1IZWFkZXItPmhlYWRlci5zaXplLW1IZWFkZXItPnN0cmluZ3NTdGFydCkvY2hhclNpemU7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBjaGVjayBpbnZhcmlhbnQ6IHN0eWxlcyBzdGFydHMgYmVmb3JlIGVuZCBvZiBkYXRhCisgICAgICAgICAgICBpZiAobUhlYWRlci0+c3R5bGVzU3RhcnQgPj0gKG1IZWFkZXItPmhlYWRlci5zaXplLXNpemVvZih1aW50MTZfdCkpKSB7CisgICAgICAgICAgICAgICAgTE9HVygiQmFkIHN0eWxlIGJsb2NrOiBzdHlsZSBibG9jayBzdGFydHMgYXQgJWQgcGFzdCBkYXRhIHNpemUgb2YgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIChpbnQpbUhlYWRlci0+c3R5bGVzU3RhcnQsIChpbnQpbUhlYWRlci0+aGVhZGVyLnNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAobUVycm9yPUJBRF9UWVBFKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGNoZWNrIGludmFyaWFudDogc3R5bGVzIGZvbGxvdyB0aGUgc3RyaW5ncwogICAgICAgICAgICAgaWYgKG1IZWFkZXItPnN0eWxlc1N0YXJ0IDw9IG1IZWFkZXItPnN0cmluZ3NTdGFydCkgewogICAgICAgICAgICAgICAgIExPR1coIkJhZCBzdHlsZSBibG9jazogc3R5bGUgYmxvY2sgc3RhcnRzIGF0ICVkLCBiZWZvcmUgc3RyaW5ncyBhdCAlZFxuIiwKQEAgLTE4NzgsNiArMTg4NCwxMiBAQAogICAgICAgICBvdXROYW1lLT50eXBlID0gZ3JwLT5iYXNlUGFja2FnZS0+dHlwZVN0cmluZ3Muc3RyaW5nQXQodCwgJm91dE5hbWUtPnR5cGVMZW4pOwogICAgICAgICBvdXROYW1lLT5uYW1lID0gZ3JwLT5iYXNlUGFja2FnZS0+a2V5U3RyaW5ncy5zdHJpbmdBdCgKICAgICAgICAgICAgIGR0b2hsKGVudHJ5LT5rZXkuaW5kZXgpLCAmb3V0TmFtZS0+bmFtZUxlbik7CisKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGJhZCBpbmRleCBmb3Igc29tZSByZWFzb24sIHdlIHNob3VsZCBhYm9ydC4KKyAgICAgICAgaWYgKG91dE5hbWUtPnR5cGUgPT0gTlVMTCB8fCBvdXROYW1lLT5uYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtMjYwOSw2ICsyNjIxLDI0IEBACiAgICAgICAgICpvdXRUeXBlID0gKmRlZlR5cGU7CiAgICAgfQogICAgICpvdXROYW1lID0gU3RyaW5nMTYocCwgZW5kLXApOworICAgIGlmKCoqb3V0UGFja2FnZSA9PSAwKSB7CisgICAgICAgIGlmKG91dEVycm9yTXNnKSB7CisgICAgICAgICAgICAqb3V0RXJyb3JNc2cgPSAiUmVzb3VyY2UgcGFja2FnZSBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmKCoqb3V0VHlwZSA9PSAwKSB7CisgICAgICAgIGlmKG91dEVycm9yTXNnKSB7CisgICAgICAgICAgICAqb3V0RXJyb3JNc2cgPSAiUmVzb3VyY2UgdHlwZSBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmKCoqb3V0TmFtZSA9PSAwKSB7CisgICAgICAgIGlmKG91dEVycm9yTXNnKSB7CisgICAgICAgICAgICAqb3V0RXJyb3JNc2cgPSAiUmVzb3VyY2UgaWQgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZyI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtNDEyNywxMyArNDE1NywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHgwMGZmMDAwMCAmICgodHlwZUluZGV4KzEpPDwxNikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgweDAwMDBmZmZmICYgKGVudHJ5SW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX25hbWUgcmVzTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICBzcGVjIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogZmxhZ3M9MHglMDh4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUucGFja2FnZSwgcmVzTmFtZS5wYWNrYWdlTGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnR5cGUsIHJlc05hbWUudHlwZUxlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5uYW1lLCByZXNOYW1lLm5hbWVMZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0b2hsKHR5cGVDb25maWdzLT50eXBlU3BlY0ZsYWdzW2VudHJ5SW5kZXhdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy0+Z2V0UmVzb3VyY2VOYW1lKHJlc0lELCAmcmVzTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgIHNwZWMgcmVzb3VyY2UgMHglMDh4ICVzOiVzLyVzOiBmbGFncz0weCUwOHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnBhY2thZ2UsIHJlc05hbWUucGFja2FnZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUudHlwZSwgcmVzTmFtZS50eXBlTGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5uYW1lLCByZXNOYW1lLm5hbWVMZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdG9obCh0eXBlQ29uZmlncy0+dHlwZVNwZWNGbGFnc1tlbnRyeUluZGV4XSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgIElOVkFMSUQgVFlQRSBDT05GSUcgRk9SIFJFU09VUkNFIDB4JTA4eFxuIiwgcmVzSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGNvbmZpZ0luZGV4PTA7IGNvbmZpZ0luZGV4PE5UQzsgY29uZmlnSW5kZXgrKykgewpAQCAtNDM0MCwxMSArNDM3MywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHgwMGZmMDAwMCAmICgodHlwZUluZGV4KzEpPDwxNikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgweDAwMDBmZmZmICYgKGVudHJ5SW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX25hbWUgcmVzTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogIiwgcmVzSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUucGFja2FnZSwgcmVzTmFtZS5wYWNrYWdlTGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS50eXBlLCByZXNOYW1lLnR5cGVMZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLm5hbWUsIHJlc05hbWUubmFtZUxlbikpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogIiwgcmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnBhY2thZ2UsIHJlc05hbWUucGFja2FnZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnR5cGUsIHJlc05hbWUudHlwZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLm5hbWUsIHJlc05hbWUubmFtZUxlbikpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgICAgSU5WQUxJRCBSRVNPVVJDRSAweCUwOHg6ICIsIHJlc0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhpc09mZnNldCYweDMpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIk5PTi1JTlRFR0VSIE9GRlNFVDogJXBcbiIsICh2b2lkKil0aGlzT2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQ0MDIsMTggKzQ0MzgsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdmFsdWUocGtnLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiYWdQdHIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgTiA9IGR0b2hsKGJhZ1B0ci0+Y291bnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXNUYWJsZV9tYXAqIG1hcFB0ciA9IChjb25zdCBSZXNUYWJsZV9tYXAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGNvbnN0IHVpbnQ4X3QqKWVudCkgKyBlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJhc2VNYXBQdHIgPSAoY29uc3QgdWludDhfdCopZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWFwT2Zmc2V0ID0gZXNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlc1RhYmxlX21hcCogbWFwUHRyID0gKFJlc1RhYmxlX21hcCopKGJhc2VNYXBQdHIrbWFwT2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgUGFyZW50PTB4JTA4eCwgQ291bnQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdG9obChiYWdQdHItPnBhcmVudC5pZGVudCksIE4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOICYmIG1hcE9mZnNldCA8ICh0eXBlU2l6ZS1zaXplb2YoUmVzVGFibGVfbWFwKSk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgIyVpIChLZXk9MHglMDh4KTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBkdG9obChtYXBQdHItPm5hbWUuaWRlbnQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNvcHlGcm9tX2R0b2gobWFwUHRyLT52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF92YWx1ZShwa2csIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gZHRvaHMobWFwUHRyLT52YWx1ZS5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFB0ciA9IChSZXNUYWJsZV9tYXAqKSgoKGNvbnN0IHVpbnQ4X3QqKW1hcFB0cikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplICsgc2l6ZW9mKCptYXBQdHIpLXNpemVvZihtYXBQdHItPnZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBPZmZzZXQgKz0gc2l6ZSArIHNpemVvZigqbWFwUHRyKS1zaXplb2YobWFwUHRyLT52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBQdHIgPSAoUmVzVGFibGVfbWFwKikoYmFzZU1hcFB0cittYXBPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnkuYWlkbCBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgzZDY0NQotLS0gL2Rldi9udWxsCisrKyBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5LmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5sb2NhdGlvbjsKKworcGFyY2VsYWJsZSBDb3VudHJ5OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5LmphdmEgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNjMDU0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeS5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CisKKy8qKgorICogVGhpcyBjbGFzcyB3cmFwcyB0aGUgY291bnRyeSBpbmZvcm1hdGlvbi4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQ291bnRyeSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIC8qKgorICAgICAqIFRoZSBjb3VudHJ5IGNvZGUgY2FtZSBmcm9tIHRoZSBtb2JpbGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPVU5UUllfU09VUkNFX05FVFdPUksgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIGNvdW50cnkgY29kZSBjYW1lIGZyb20gdGhlIGxvY2F0aW9uIHNlcnZpY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1VOVFJZX1NPVVJDRV9MT0NBVElPTiA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY291bnRyeSBjb2RlIHdhcyByZWFkIGZyb20gdGhlIFNJTSBjYXJkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRSWV9TT1VSQ0VfU0lNID0gMjsKKworICAgIC8qKgorICAgICAqIFRoZSBjb3VudHJ5IGNvZGUgY2FtZSBmcm9tIHRoZSBzeXN0ZW0gbG9jYWxlIHNldHRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1VOVFJZX1NPVVJDRV9MT0NBTEUgPSAzOworCisgICAgLyoqCisgICAgICogVGhlIElTTyAzMTY2LTEgdHdvIGxldHRlcnMgY291bnRyeSBjb2RlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Db3VudHJ5SXNvOworCisgICAgLyoqCisgICAgICogV2hlcmUgdGhlIGNvdW50cnkgY29kZSBjYW1lIGZyb20uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVNvdXJjZTsKKworICAgIHByaXZhdGUgaW50IG1IYXNoQ29kZTsKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb3VudHJ5SXNvIHRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZS4KKyAgICAgKiBAcGFyYW0gc291cmNlIHdoZXJlIHRoZSBjb3VudHJ5SXNvIGNhbWUgZnJvbSwgY291bGQgYmUgb25lIG9mIGJlbG93CisgICAgICogICAgICAgIHZhbHVlcworICAgICAqICAgICAgICA8cD4KKyAgICAgKiAgICAgICAgPHVsPgorICAgICAqICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9ORVRXT1JLfTwvbGk+CisgICAgICogICAgICAgIDxsaT57QGxpbmsgI0NPVU5UUllfU09VUkNFX0xPQ0FUSU9OfTwvbGk+CisgICAgICogICAgICAgIDxsaT57QGxpbmsgI0NPVU5UUllfU09VUkNFX1NJTX08L2xpPgorICAgICAqICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9MT0NBTEV9PC9saT4KKyAgICAgKiAgICAgICAgPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ291bnRyeShmaW5hbCBTdHJpbmcgY291bnRyeUlzbywgZmluYWwgaW50IHNvdXJjZSkgeworICAgICAgICBpZiAoY291bnRyeUlzbyA9PSBudWxsIHx8IHNvdXJjZSA8IENPVU5UUllfU09VUkNFX05FVFdPUksKKyAgICAgICAgICAgICAgICB8fCBzb3VyY2UgPiBDT1VOVFJZX1NPVVJDRV9MT0NBTEUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBtQ291bnRyeUlzbyA9IGNvdW50cnlJc28udG9Mb3dlckNhc2UoKTsKKyAgICAgICAgbVNvdXJjZSA9IHNvdXJjZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ291bnRyeShDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgbUNvdW50cnlJc28gPSBjb3VudHJ5Lm1Db3VudHJ5SXNvOworICAgICAgICBtU291cmNlID0gY291bnRyeS5tU291cmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIElTTyAzMTY2LTEgdHdvIGxldHRlcnMgY291bnRyeSBjb2RlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRDb3VudHJ5SXNvKCkgeworICAgICAgICByZXR1cm4gbUNvdW50cnlJc287CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB3aGVyZSB0aGUgY291bnRyeSBjb2RlIGNhbWUgZnJvbSwgY291bGQgYmUgb25lIG9mIGJlbG93IHZhbHVlcworICAgICAqICAgICAgICAgPHA+CisgICAgICogICAgICAgICA8dWw+CisgICAgICogICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9ORVRXT1JLfTwvbGk+CisgICAgICogICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9MT0NBVElPTn08L2xpPgorICAgICAqICAgICAgICAgPGxpPntAbGluayAjQ09VTlRSWV9TT1VSQ0VfU0lNfTwvbGk+CisgICAgICogICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9MT0NBTEV9PC9saT4KKyAgICAgKiAgICAgICAgIDwvdWw+CisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRTb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBtU291cmNlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPENvdW50cnk+IENSRUFUT1IgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPENvdW50cnk+KCkgeworICAgICAgICBwdWJsaWMgQ291bnRyeSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3VudHJ5KGluLnJlYWRTdHJpbmcoKSwgaW4ucmVhZEludCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb3VudHJ5W10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ291bnRyeVtzaXplXTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIHBhcmNlbCwgaW50IGZsYWdzKSB7CisgICAgICAgIHBhcmNlbC53cml0ZVN0cmluZyhtQ291bnRyeUlzbyk7CisgICAgICAgIHBhcmNlbC53cml0ZUludChtU291cmNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICBpZiAob2JqZWN0ID09IHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDb3VudHJ5KSB7CisgICAgICAgICAgICBDb3VudHJ5IGMgPSAoQ291bnRyeSkgb2JqZWN0OworICAgICAgICAgICAgcmV0dXJuIG1Db3VudHJ5SXNvLmVxdWFscyhjLmdldENvdW50cnlJc28oKSkgJiYgbVNvdXJjZSA9PSBjLmdldFNvdXJjZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IG1IYXNoQ29kZTsKKyAgICAgICAgaWYgKGhhc2ggPT0gMCkgeworICAgICAgICAgICAgaGFzaCA9IDE3OworICAgICAgICAgICAgaGFzaCA9IGhhc2ggKiAxMyArIG1Db3VudHJ5SXNvLmhhc2hDb2RlKCk7CisgICAgICAgICAgICBoYXNoID0gaGFzaCAqIDEzICsgbVNvdXJjZTsKKyAgICAgICAgICAgIG1IYXNoQ29kZSA9IGhhc2g7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1IYXNoQ29kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHRoZSBzcGVjaWZpZWQgY291bnRyeSB0byB0aGlzIGNvdW50cnkgb2JqZWN0IGlnbm9yaW5nIHRoZSBtU291cmNlCisgICAgICogZmllbGQsIHJldHVybiB0cnVlIGlmIHRoZSBjb3VudHJ5SXNvIGZpZWxkcyBhcmUgZXF1YWwKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb3VudHJ5IHRoZSBjb3VudHJ5IHRvIGNvbXBhcmUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjb3VudHJ5J3MgY291bnRyeUlzbyBmaWVsZCBpcyBlcXVhbCB0byB0aGlzCisgICAgICogICAgICAgICBjb3VudHJ5J3MsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNJZ25vcmVTb3VyY2UoQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgIHJldHVybiBjb3VudHJ5ICE9IG51bGwgJiYgbUNvdW50cnlJc28uZXF1YWxzKGNvdW50cnkuZ2V0Q291bnRyeUlzbygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeURldGVjdG9yLmphdmEgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeURldGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI3ODBjZQotLS0gL2Rldi9udWxsCisrKyBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5RGV0ZWN0b3IuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBzeXN0ZW0gY291bnRyeSBkZXRlY3RvciBzZXJ2aWNlLiBUaGlzCisgKiBzZXJ2aWNlIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gb2J0YWluIHRoZSBjb3VudHJ5IHRoYXQgdGhlIHVzZXIgaXMgaW4uCisgKiA8cD4KKyAqIFRoZSBjb3VudHJ5IHdpbGwgYmUgZGV0ZWN0ZWQgaW4gb3JkZXIgb2YgcmVsaWFiaWxpdHksIGxpa2UKKyAqIDx1bD4KKyAqIDxsaT5Nb2JpbGUgbmV0d29yazwvbGk+CisgKiA8bGk+TG9jYXRpb248L2xpPgorICogPGxpPlNJTSdzIGNvdW50cnk8L2xpPgorICogPGxpPlBob25lJ3MgbG9jYWxlPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIENhbGwgdGhlIHtAbGluayAjZGV0ZWN0Q291bnRyeSgpfSB0byBnZXQgdGhlIGF2YWlsYWJsZSBjb3VudHJ5IGltbWVkaWF0ZWx5LgorICogPHA+CisgKiBUbyBiZSBub3RpZmllZCBvZiB0aGUgZnV0dXJlIGNvdW50cnkgY2hhbmdlLCB1c2UgdGhlCisgKiB7QGxpbmsgI2FkZENvdW50cnlMaXN0ZW5lcn0KKyAqIDxwPgorICogPHA+CisgKiBZb3UgZG8gbm90IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MgZGlyZWN0bHk7IGluc3RlYWQsIHJldHJpZXZlIGl0IHRocm91Z2gKKyAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNnZXRTeXN0ZW1TZXJ2aWNlCisgKiBDb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT1VOVFJZX0RFVEVDVE9SKX0uCisgKiA8cD4KKyAqIEJvdGggQUNDRVNTX0ZJTkVfTE9DQVRJT04gYW5kIEFDQ0VTU19DT0FSU0VfTE9DQVRJT04gcGVybWlzc2lvbnMgYXJlIG5lZWRlZC4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQ291bnRyeURldGVjdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyB0byB3cmFwIHRoZSBJQ291bnRyeUxpc3RlbmVyLlN0dWIgYW5kIENvdW50cnlMaXN0ZW5lciBvYmplY3RzCisgICAgICogdG9nZXRoZXIuIFRoZSBDb3VudHJ5TGlzdGVuZXIgd2lsbCBiZSBub3RpZmllZCB0aHJvdWdoIHRoZSBzcGVjaWZpYworICAgICAqIGxvb3BlciBvbmNlIHRoZSBjb3VudHJ5IGNoYW5nZWQgYW5kIGRldGVjdGVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIExpc3RlbmVyVHJhbnNwb3J0IGV4dGVuZHMgSUNvdW50cnlMaXN0ZW5lci5TdHViIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENvdW50cnlMaXN0ZW5lciBtTGlzdGVuZXI7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOworCisgICAgICAgIHB1YmxpYyBMaXN0ZW5lclRyYW5zcG9ydChDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIsIExvb3BlciBsb29wZXIpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICAgICAgaWYgKGxvb3BlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihsb29wZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvdW50cnlEZXRlY3RlZChmaW5hbCBDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQ291bnRyeURldGVjdGVkKGNvdW50cnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJDb3VudHJ5RGV0ZWN0b3IiOworICAgIHByaXZhdGUgZmluYWwgSUNvdW50cnlEZXRlY3RvciBtU2VydmljZTsKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8Q291bnRyeUxpc3RlbmVyLCBMaXN0ZW5lclRyYW5zcG9ydD4gbUxpc3RlbmVyczsKKworICAgIC8qKgorICAgICAqIEBoaWRlIC0gaGlkZSB0aGlzIGNvbnN0cnVjdG9yIGJlY2F1c2UgaXQgaGFzIGEgcGFyYW1ldGVyIG9mIHR5cGUKKyAgICAgKiAgICAgICBJQ291bnRyeURldGVjdG9yLCB3aGljaCBpcyBhIHN5c3RlbSBwcml2YXRlIGNsYXNzLiBUaGUgcmlnaHQgd2F5IHRvCisgICAgICogICAgICAgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgdXNpbmcgdGhlIGZhY3RvcnkKKyAgICAgKiAgICAgICBDb250ZXh0LmdldFN5c3RlbVNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIENvdW50cnlEZXRlY3RvcihJQ291bnRyeURldGVjdG9yIHNlcnZpY2UpIHsKKyAgICAgICAgbVNlcnZpY2UgPSBzZXJ2aWNlOworICAgICAgICBtTGlzdGVuZXJzID0gbmV3IEhhc2hNYXA8Q291bnRyeUxpc3RlbmVyLCBMaXN0ZW5lclRyYW5zcG9ydD4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBkZXRlY3RpbmcgdGhlIGNvdW50cnkgdGhhdCB0aGUgdXNlciBpcyBpbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgaWYgaXQgaXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LCBvdGhlcndpc2UgbnVsbCB3aWxsCisgICAgICogICAgICAgICBiZSByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ291bnRyeSBkZXRlY3RDb3VudHJ5KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgImRldGVjdENvdW50cnk6IFJlbW90ZUV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaXN0ZW5lciB0byByZWNlaXZlIHRoZSBub3RpZmljYXRpb24gd2hlbiB0aGUgY291bnRyeSBpcyBkZXRlY3RlZAorICAgICAqIG9yIGNoYW5nZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgY291bnRyeSBpcyBkZXRlY3RlZCBvciBjaGFuZ2VkLgorICAgICAqIEBwYXJhbSBsb29wZXIgYSBMb29wZXIgb2JqZWN0IHdob3NlIG1lc3NhZ2UgcXVldWUgd2lsbCBiZSB1c2VkIHRvCisgICAgICogICAgICAgIGltcGxlbWVudCB0aGUgY2FsbGJhY2sgbWVjaGFuaXNtLiBJZiBsb29wZXIgaXMgbnVsbCB0aGVuIHRoZQorICAgICAqICAgICAgICBjYWxsYmFja3Mgd2lsbCBiZSBjYWxsZWQgb24gdGhlIG1haW4gdGhyZWFkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvdW50cnlMaXN0ZW5lcihDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIsIExvb3BlciBsb29wZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBpZiAoIW1MaXN0ZW5lcnMuY29udGFpbnNLZXkobGlzdGVuZXIpKSB7CisgICAgICAgICAgICAgICAgTGlzdGVuZXJUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbmV3IExpc3RlbmVyVHJhbnNwb3J0KGxpc3RlbmVyLCBsb29wZXIpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLmFkZENvdW50cnlMaXN0ZW5lcih0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXJzLnB1dChsaXN0ZW5lciwgdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJhZGRDb3VudHJ5TGlzdGVuZXI6IFJlbW90ZUV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgbGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb3VudHJ5TGlzdGVuZXIoQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxpc3RlbmVycykgeworICAgICAgICAgICAgTGlzdGVuZXJUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbUxpc3RlbmVycy5nZXQobGlzdGVuZXIpOworICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5yZW1vdmVDb3VudHJ5TGlzdGVuZXIodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJyZW1vdmVDb3VudHJ5TGlzdGVuZXI6IFJlbW90ZUV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5TGlzdGVuZXIuamF2YSBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzZkYjQxCi0tLSAvZGV2L251bGwKKysrIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnlMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5sb2NhdGlvbjsKKworLyoqCisgKiBUaGUgbGlzdGVuZXIgZm9yIHJlY2VpdmluZyB0aGUgbm90aWZpY2F0aW9uIHdoZW4gdGhlIGNvdW50cnkgaXMgZGV0ZWN0ZWQgb3IKKyAqIGNoYW5nZWQKKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgaW50ZXJmYWNlIENvdW50cnlMaXN0ZW5lciB7CisgICAgLyoqCisgICAgICogQHBhcmFtIGNvdW50cnkgdGhlIGNoYW5nZWQgb3IgZGV0ZWN0ZWQgY291bnRyeS4KKyAgICAgKi8KKyAgICB2b2lkIG9uQ291bnRyeURldGVjdGVkKENvdW50cnkgY291bnRyeSk7Cit9CmRpZmYgLS1naXQgYS9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUNvdW50cnlEZXRlY3Rvci5haWRsIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5RGV0ZWN0b3IuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWFmMDdjCi0tLSAvZGV2L251bGwKKysrIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5RGV0ZWN0b3IuYWlkbApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmxvY2F0aW9uOworCitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uSUNvdW50cnlMaXN0ZW5lcjsKKworLyoqCisgKiBUaGUgQVBJIGZvciBkZXRlY3RpbmcgdGhlIGNvdW50cnkgd2hlcmUgdGhlIHVzZXIgaXMuCisgKgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSUNvdW50cnlEZXRlY3RvcgoreworICAgIC8qKgorICAgICAqIFN0YXJ0IGRldGVjdGluZyB0aGUgY291bnRyeSB0aGF0IHRoZSB1c2VyIGlzIGluLgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgaWYgaXQgaXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LCBvdGhlcndpc2UgbnVsbCB3aWxsIGJlIHJldHVybmVkLgorICAgICAqLworICAgIENvdW50cnkgZGV0ZWN0Q291bnRyeSgpOworCisgICAgLyoqCisgICAgICogQWRkIGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSB0aGUgbm90aWZpY2F0aW9uIHdoZW4gdGhlIGNvdW50cnkgaXMgZGV0ZWN0ZWQgb3IgY2hhbmdlZC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZENvdW50cnlMaXN0ZW5lcihpbiBJQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgbGlzdGVuZXIKKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZUNvdW50cnlMaXN0ZW5lcihpbiBJQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUNvdW50cnlMaXN0ZW5lci5haWRsIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5TGlzdGVuZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmVjYjEzCi0tLSAvZGV2L251bGwKKysrIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5TGlzdGVuZXIuYWlkbApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmxvY2F0aW9uOworCitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworLyoqCisgKiB7QGhpZGV9CisgKi8KK29uZXdheSBpbnRlcmZhY2UgSUNvdW50cnlMaXN0ZW5lcgoreworICAgIHZvaWQgb25Db3VudHJ5RGV0ZWN0ZWQoaW4gQ291bnRyeSBjb3VudHJ5KTsKK30KZGlmZiAtLWdpdCBhL2xvY2F0aW9uL3Rlc3RzL2xvY2F0aW9udGVzdHMvc3JjL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeVRlc3Rlci5qYXZhIGIvbG9jYXRpb24vdGVzdHMvbG9jYXRpb250ZXN0cy9zcmMvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5VGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgwMmQ1YQotLS0gL2Rldi9udWxsCisrKyBiL2xvY2F0aW9uL3Rlc3RzL2xvY2F0aW9udGVzdHMvc3JjL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeVRlc3Rlci5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgQ291bnRyeVRlc3RlciBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHVibGljIHZvaWQgdGVzdENvdW50cnlFcXVhbHMoKSB7CisgICAgICAgIENvdW50cnkgY291bnRyeUEgPSBuZXcgQ291bnRyeSgiVVMiLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX05FVFdPUkspOworICAgICAgICBDb3VudHJ5IGNvdW50cnlCID0gbmV3IENvdW50cnkoIlVTIiwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9MT0NBTEUpOworICAgICAgICBDb3VudHJ5IGNvdW50cnlDID0gbmV3IENvdW50cnkoIkNOIiwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9MT0NBTEUpOworICAgICAgICBDb3VudHJ5IGNvdW50cnlEID0gbmV3IENvdW50cnkoInVzIiwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9ORVRXT1JLKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5QS5lcXVhbHNJZ25vcmVTb3VyY2UoY291bnRyeUIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY291bnRyeUEuZXF1YWxzSWdub3JlU291cmNlKGNvdW50cnlDKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvdW50cnlBLmVxdWFscyhjb3VudHJ5QykpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlBLmVxdWFscyhjb3VudHJ5RCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlBLmhhc2hDb2RlKCkgPT0gY291bnRyeUQuaGFzaENvZGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0LmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQuamF2YQppbmRleCBmMWZhMWU4Li4zMWU0NjMxIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQuamF2YQpAQCAtMzEsOSArMzEsOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ESU5HX0lOVkFMSUQgPSAwOwogICAgIC8qKiBEZWZhdWx0IGF1ZGlvIGRhdGEgZm9ybWF0ICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfREVGQVVMVCA9IDE7Ci0gICAgLyoqIEF1ZGlvIGRhdGEgZm9ybWF0OiBQQ00gMTYgYml0IHBlciBzYW1wbGUgKi8KKyAgICAvKiogQXVkaW8gZGF0YSBmb3JtYXQ6IFBDTSAxNiBiaXQgcGVyIHNhbXBsZS4gR3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQgYnkgZGV2aWNlcy4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR19QQ01fMTZCSVQgPSAyOyAvLyBhY2Nlc3NlZCBieSBuYXRpdmUgY29kZQotICAgIC8qKiBBdWRpbyBkYXRhIGZvcm1hdDogUENNIDggYml0IHBlciBzYW1wbGUgKi8KKyAgICAvKiogQXVkaW8gZGF0YSBmb3JtYXQ6IFBDTSA4IGJpdCBwZXIgc2FtcGxlLiBOb3QgZ3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQgYnkgZGV2aWNlcy4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR19QQ01fOEJJVCA9IDM7ICAvLyBhY2Nlc3NlZCBieSBuYXRpdmUgY29kZQogCiAgICAgLyoqIEludmFsaWQgYXVkaW8gY2hhbm5lbCBjb25maWd1cmF0aW9uICovCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9NYW5hZ2VyLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9NYW5hZ2VyLmphdmEKaW5kZXggYmJiYmE3NC4uYjIzZGNkZSAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvTWFuYWdlci5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb01hbmFnZXIuamF2YQpAQCAtMTUyNSw0ICsxNTI1LDIyIEBACiAgICAgICAqIHtAaGlkZX0KICAgICAgICovCiAgICAgIHByaXZhdGUgSUJpbmRlciBtSUNhbGxCYWNrID0gbmV3IEJpbmRlcigpOworCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHBob25lIGlzIGluIHNpbGVudCBtb2RlLCB3aXRoIG9yIHdpdGhvdXQgdmlicmF0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBwaG9uZSBpcyBpbiBzaWxlbnQgbW9kZSwgd2l0aCBvciB3aXRob3V0IHZpYnJhdGUuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRSaW5nZXJNb2RlKCkKKyAgICAgKgorICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIENvdW5jaWwgYXBwcm92YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbGVudE1vZGUoKSB7CisgICAgICAgIGludCByaW5nZXJNb2RlID0gZ2V0UmluZ2VyTW9kZSgpOworICAgICAgICBib29sZWFuIHNpbGVudE1vZGUgPQorICAgICAgICAgICAgKHJpbmdlck1vZGUgPT0gUklOR0VSX01PREVfU0lMRU5UKSB8fAorICAgICAgICAgICAgKHJpbmdlck1vZGUgPT0gUklOR0VSX01PREVfVklCUkFURSk7CisgICAgICAgIHJldHVybiBzaWxlbnRNb2RlOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvUmVjb3JkLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9SZWNvcmQuamF2YQppbmRleCBjNDhlYWFkLi5jNTY3YTZlIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9SZWNvcmQuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9SZWNvcmQuamF2YQpAQCAtMTk0LDExICsxOTQsMTMgQEAKICAgICAgKiBDbGFzcyBjb25zdHJ1Y3Rvci4KICAgICAgKiBAcGFyYW0gYXVkaW9Tb3VyY2UgdGhlIHJlY29yZGluZyBzb3VyY2UuIFNlZSB7QGxpbmsgTWVkaWFSZWNvcmRlci5BdWRpb1NvdXJjZX0gZm9yCiAgICAgICogICAgcmVjb3JkaW5nIHNvdXJjZSBkZWZpbml0aW9ucy4KLSAgICAgKiBAcGFyYW0gc2FtcGxlUmF0ZUluSHogdGhlIHNhbXBsZSByYXRlIGV4cHJlc3NlZCBpbiBIZXJ0ei4gRXhhbXBsZXMgb2YgcmF0ZXMgYXJlIChidXQKLSAgICAgKiAgIG5vdCBsaW1pdGVkIHRvKSA0NDEwMCwgMjIwNTAgYW5kIDExMDI1LgorICAgICAqIEBwYXJhbSBzYW1wbGVSYXRlSW5IeiB0aGUgc2FtcGxlIHJhdGUgZXhwcmVzc2VkIGluIEhlcnR6LiA0NDEwMEh6IGlzIGN1cnJlbnRseSB0aGUgb25seQorICAgICAqICAgcmF0ZSB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gd29yayBvbiBhbGwgZGV2aWNlcywgYnV0IG90aGVyIHJhdGVzIHN1Y2ggYXMgMjIwNTAsCisgICAgICogICAxNjAwMCwgYW5kIDExMDI1IG1heSB3b3JrIG9uIHNvbWUgZGV2aWNlcy4KICAgICAgKiBAcGFyYW0gY2hhbm5lbENvbmZpZyBkZXNjcmliZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGF1ZGlvIGNoYW5uZWxzLiAKICAgICAgKiAgIFNlZSB7QGxpbmsgQXVkaW9Gb3JtYXQjQ0hBTk5FTF9JTl9NT05PfSBhbmQKLSAgICAgKiAgIHtAbGluayBBdWRpb0Zvcm1hdCNDSEFOTkVMX0lOX1NURVJFT30KKyAgICAgKiAgIHtAbGluayBBdWRpb0Zvcm1hdCNDSEFOTkVMX0lOX1NURVJFT30uICB7QGxpbmsgQXVkaW9Gb3JtYXQjQ0hBTk5FTF9JTl9NT05PfSBpcyBndWFyYW50ZWVkCisgICAgICogICB0byB3b3JrIG9uIGFsbCBkZXZpY2VzLgogICAgICAqIEBwYXJhbSBhdWRpb0Zvcm1hdCB0aGUgZm9ybWF0IGluIHdoaWNoIHRoZSBhdWRpbyBkYXRhIGlzIHJlcHJlc2VudGVkLiAKICAgICAgKiAgIFNlZSB7QGxpbmsgQXVkaW9Gb3JtYXQjRU5DT0RJTkdfUENNXzE2QklUfSBhbmQgCiAgICAgICogICB7QGxpbmsgQXVkaW9Gb3JtYXQjRU5DT0RJTkdfUENNXzhCSVR9CkBAIC00NDQsNiArNDQ2LDggQEAKICAgICAgKiAgb3Ige0BsaW5rICNFUlJPUn0gaWYgdGhlIGltcGxlbWVudGF0aW9uIHdhcyB1bmFibGUgdG8gcXVlcnkgdGhlIGhhcmR3YXJlIGZvciBpdHMgCiAgICAgICogIG91dHB1dCBwcm9wZXJ0aWVzLCAKICAgICAgKiAgIG9yIHRoZSBtaW5pbXVtIGJ1ZmZlciBzaXplIGV4cHJlc3NlZCBpbiBieXRlcy4KKyAgICAgKiBAc2VlICNBdWRpb1JlY29yZChpbnQsIGludCwgaW50LCBpbnQsIGludCkgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdmFsaWQKKyAgICAgKiAgIGNvbmZpZ3VyYXRpb24gdmFsdWVzLgogICAgICAqLwogICAgIHN0YXRpYyBwdWJsaWMgaW50IGdldE1pbkJ1ZmZlclNpemUoaW50IHNhbXBsZVJhdGVJbkh6LCBpbnQgY2hhbm5lbENvbmZpZywgaW50IGF1ZGlvRm9ybWF0KSB7CiAgICAgICAgIGludCBjaGFubmVsQ291bnQgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRmlsZS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRmlsZS5qYXZhCmluZGV4IDZlNTI3ZDkuLmZiMjQ4MGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYUZpbGUuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFGaWxlLmphdmEKQEAgLTk2LDE1ICs5NiwzMiBAQAogICAgICAgICB9CiAgICAgfQogICAgIAotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBNZWRpYUZpbGVUeXBlPiBzRmlsZVR5cGVNYXAgCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIE1lZGlhRmlsZVR5cGU+IHNGaWxlVHlwZU1hcAogICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1lZGlhRmlsZVR5cGU+KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNNaW1lVHlwZU1hcCAKLSAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOyAgICAgICAgICAgIAorICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzTWltZVR5cGVNYXAKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgIC8vIG1hcHMgZmlsZSBleHRlbnNpb24gdG8gTVRQIGZvcm1hdCBjb2RlCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNGaWxlVHlwZVRvRm9ybWF0TWFwCisgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAvLyBtYXBzIG1pbWUgdHlwZSB0byBNVFAgZm9ybWF0IGNvZGUKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gc01pbWVUeXBlVG9Gb3JtYXRNYXAKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgIC8vIG1hcHMgTVRQIGZvcm1hdCBjb2RlIHRvIG1pbWUgdHlwZQorICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPiBzRm9ybWF0VG9NaW1lVHlwZU1hcAorICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7CisKICAgICBzdGF0aWMgdm9pZCBhZGRGaWxlVHlwZShTdHJpbmcgZXh0ZW5zaW9uLCBpbnQgZmlsZVR5cGUsIFN0cmluZyBtaW1lVHlwZSkgewogICAgICAgICBzRmlsZVR5cGVNYXAucHV0KGV4dGVuc2lvbiwgbmV3IE1lZGlhRmlsZVR5cGUoZmlsZVR5cGUsIG1pbWVUeXBlKSk7CiAgICAgICAgIHNNaW1lVHlwZU1hcC5wdXQobWltZVR5cGUsIEludGVnZXIudmFsdWVPZihmaWxlVHlwZSkpOwogICAgIH0KIAorICAgIHN0YXRpYyB2b2lkIGFkZEZpbGVUeXBlKFN0cmluZyBleHRlbnNpb24sIGludCBmaWxlVHlwZSwgU3RyaW5nIG1pbWVUeXBlLCBpbnQgbXRwRm9ybWF0Q29kZSkgeworICAgICAgICBhZGRGaWxlVHlwZShleHRlbnNpb24sIGZpbGVUeXBlLCBtaW1lVHlwZSk7CisgICAgICAgIHNGaWxlVHlwZVRvRm9ybWF0TWFwLnB1dChleHRlbnNpb24sIEludGVnZXIudmFsdWVPZihtdHBGb3JtYXRDb2RlKSk7CisgICAgICAgIHNNaW1lVHlwZVRvRm9ybWF0TWFwLnB1dChtaW1lVHlwZSwgSW50ZWdlci52YWx1ZU9mKG10cEZvcm1hdENvZGUpKTsKKyAgICAgICAgc0Zvcm1hdFRvTWltZVR5cGVNYXAucHV0KG10cEZvcm1hdENvZGUsIG1pbWVUeXBlKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV01BRW5hYmxlZCgpIHsKICAgICAgICAgTGlzdDxBdWRpb0RlY29kZXI+IGRlY29kZXJzID0gRGVjb2RlckNhcGFiaWxpdGllcy5nZXRBdWRpb0RlY29kZXJzKCk7CiAgICAgICAgIGZvciAoQXVkaW9EZWNvZGVyIGRlY29kZXI6IGRlY29kZXJzKSB7CkBAIC0xMjYsMTcgKzE0MywxNyBAQAogICAgIH0KIAogICAgIHN0YXRpYyB7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJNUDMiLCBGSUxFX1RZUEVfTVAzLCAiYXVkaW8vbXBlZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiTTRBIiwgRklMRV9UWVBFX000QSwgImF1ZGlvL21wNCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiV0FWIiwgRklMRV9UWVBFX1dBViwgImF1ZGlvL3gtd2F2Iik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJNUDMiLCBGSUxFX1RZUEVfTVAzLCAiYXVkaW8vbXBlZyIsIE10cENvbnN0YW50cy5GT1JNQVRfTVAzKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk00QSIsIEZJTEVfVFlQRV9NNEEsICJhdWRpby9tcDQiLCBNdHBDb25zdGFudHMuRk9STUFUX01QRUcpOworICAgICAgICBhZGRGaWxlVHlwZSgiV0FWIiwgRklMRV9UWVBFX1dBViwgImF1ZGlvL3gtd2F2IiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9XQVYpOwogICAgICAgICBhZGRGaWxlVHlwZSgiQU1SIiwgRklMRV9UWVBFX0FNUiwgImF1ZGlvL2FtciIpOwogICAgICAgICBhZGRGaWxlVHlwZSgiQVdCIiwgRklMRV9UWVBFX0FXQiwgImF1ZGlvL2Ftci13YiIpOwogICAgICAgICBpZiAoaXNXTUFFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGFkZEZpbGVUeXBlKCJXTUEiLCBGSUxFX1RZUEVfV01BLCAiYXVkaW8veC1tcy13bWEiKTsKKyAgICAgICAgICAgIGFkZEZpbGVUeXBlKCJXTUEiLCBGSUxFX1RZUEVfV01BLCAiYXVkaW8veC1tcy13bWEiLCBNdHBDb25zdGFudHMuRk9STUFUX1dNQSk7CiAgICAgICAgIH0KLSAgICAgICAgYWRkRmlsZVR5cGUoIk9HRyIsIEZJTEVfVFlQRV9PR0csICJhcHBsaWNhdGlvbi9vZ2ciKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIk9HQSIsIEZJTEVfVFlQRV9PR0csICJhcHBsaWNhdGlvbi9vZ2ciKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIkFBQyIsIEZJTEVfVFlQRV9BQUMsICJhdWRpby9hYWMiKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk9HRyIsIEZJTEVfVFlQRV9PR0csICJhcHBsaWNhdGlvbi9vZ2ciLCBNdHBDb25zdGFudHMuRk9STUFUX09HRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJPR0EiLCBGSUxFX1RZUEVfT0dHLCAiYXBwbGljYXRpb24vb2dnIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9PR0cpOworICAgICAgICBhZGRGaWxlVHlwZSgiQUFDIiwgRklMRV9UWVBFX0FBQywgImF1ZGlvL2FhYyIsIE10cENvbnN0YW50cy5GT1JNQVRfQUFDKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIk1LQSIsIEZJTEVfVFlQRV9NS0EsICJhdWRpby94LW1hdHJvc2thIik7CiAgCiAgICAgICAgIGFkZEZpbGVUeXBlKCJNSUQiLCBGSUxFX1RZUEVfTUlELCAiYXVkaW8vbWlkaSIpOwpAQCAtMTQ4LDMyICsxNjUsMzIgQEAKICAgICAgICAgYWRkRmlsZVR5cGUoIlJUWCIsIEZJTEVfVFlQRV9NSUQsICJhdWRpby9taWRpIik7CiAgICAgICAgIGFkZEZpbGVUeXBlKCJPVEEiLCBGSUxFX1RZUEVfTUlELCAiYXVkaW8vbWlkaSIpOwogICAgICAgICAKLSAgICAgICAgYWRkRmlsZVR5cGUoIk1QRUciLCBGSUxFX1RZUEVfTVA0LCAidmlkZW8vbXBlZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiTVA0IiwgRklMRV9UWVBFX01QNCwgInZpZGVvL21wNCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiTTRWIiwgRklMRV9UWVBFX000ViwgInZpZGVvL21wNCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiM0dQIiwgRklMRV9UWVBFXzNHUFAsICJ2aWRlby8zZ3BwIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCIzR1BQIiwgRklMRV9UWVBFXzNHUFAsICJ2aWRlby8zZ3BwIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCIzRzIiLCBGSUxFX1RZUEVfM0dQUDIsICJ2aWRlby8zZ3BwMiIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiM0dQUDIiLCBGSUxFX1RZUEVfM0dQUDIsICJ2aWRlby8zZ3BwMiIpOworICAgICAgICBhZGRGaWxlVHlwZSgiTVBFRyIsIEZJTEVfVFlQRV9NUDQsICJ2aWRlby9tcGVnIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9NUEVHKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk1QNCIsIEZJTEVfVFlQRV9NUDQsICJ2aWRlby9tcDQiLCBNdHBDb25zdGFudHMuRk9STUFUX01QRUcpOworICAgICAgICBhZGRGaWxlVHlwZSgiTTRWIiwgRklMRV9UWVBFX000ViwgInZpZGVvL21wNCIsIE10cENvbnN0YW50cy5GT1JNQVRfTVBFRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCIzR1AiLCBGSUxFX1RZUEVfM0dQUCwgInZpZGVvLzNncHAiLCAgTXRwQ29uc3RhbnRzLkZPUk1BVF8zR1BfQ09OVEFJTkVSKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIjNHUFAiLCBGSUxFX1RZUEVfM0dQUCwgInZpZGVvLzNncHAiLCBNdHBDb25zdGFudHMuRk9STUFUXzNHUF9DT05UQUlORVIpOworICAgICAgICBhZGRGaWxlVHlwZSgiM0cyIiwgRklMRV9UWVBFXzNHUFAyLCAidmlkZW8vM2dwcDIiLCBNdHBDb25zdGFudHMuRk9STUFUXzNHUF9DT05UQUlORVIpOworICAgICAgICBhZGRGaWxlVHlwZSgiM0dQUDIiLCBGSUxFX1RZUEVfM0dQUDIsICJ2aWRlby8zZ3BwMiIsIE10cENvbnN0YW50cy5GT1JNQVRfM0dQX0NPTlRBSU5FUik7CiAgICAgICAgIGFkZEZpbGVUeXBlKCJNS1YiLCBGSUxFX1RZUEVfTUtWLCAidmlkZW8veC1tYXRyb3NrYSIpOwogICAgICAgICBhZGRGaWxlVHlwZSgiV0VCTSIsIEZJTEVfVFlQRV9NS1YsICJ2aWRlby94LW1hdHJvc2thIik7CiAgICAgICAgIGFkZEZpbGVUeXBlKCJUUyIsIEZJTEVfVFlQRV9NUDJUUywgInZpZGVvL21wMnRzIik7CiAKICAgICAgICAgaWYgKGlzV01WRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBhZGRGaWxlVHlwZSgiV01WIiwgRklMRV9UWVBFX1dNViwgInZpZGVvL3gtbXMtd212Iik7CisgICAgICAgICAgICBhZGRGaWxlVHlwZSgiV01WIiwgRklMRV9UWVBFX1dNViwgInZpZGVvL3gtbXMtd212IiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9XTVYpOwogICAgICAgICAgICAgYWRkRmlsZVR5cGUoIkFTRiIsIEZJTEVfVFlQRV9BU0YsICJ2aWRlby94LW1zLWFzZiIpOwogICAgICAgICB9CiAKLSAgICAgICAgYWRkRmlsZVR5cGUoIkpQRyIsIEZJTEVfVFlQRV9KUEVHLCAiaW1hZ2UvanBlZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiSlBFRyIsIEZJTEVfVFlQRV9KUEVHLCAiaW1hZ2UvanBlZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiR0lGIiwgRklMRV9UWVBFX0dJRiwgImltYWdlL2dpZiIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiUE5HIiwgRklMRV9UWVBFX1BORywgImltYWdlL3BuZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiQk1QIiwgRklMRV9UWVBFX0JNUCwgImltYWdlL3gtbXMtYm1wIik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJKUEciLCBGSUxFX1RZUEVfSlBFRywgImltYWdlL2pwZWciLCBNdHBDb25zdGFudHMuRk9STUFUX0VYSUZfSlBFRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJKUEVHIiwgRklMRV9UWVBFX0pQRUcsICJpbWFnZS9qcGVnIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9FWElGX0pQRUcpOworICAgICAgICBhZGRGaWxlVHlwZSgiR0lGIiwgRklMRV9UWVBFX0dJRiwgImltYWdlL2dpZiIsIE10cENvbnN0YW50cy5GT1JNQVRfR0lGKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIlBORyIsIEZJTEVfVFlQRV9QTkcsICJpbWFnZS9wbmciLCBNdHBDb25zdGFudHMuRk9STUFUX1BORyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJCTVAiLCBGSUxFX1RZUEVfQk1QLCAiaW1hZ2UveC1tcy1ibXAiLCBNdHBDb25zdGFudHMuRk9STUFUX0JNUCk7CiAgICAgICAgIGFkZEZpbGVUeXBlKCJXQk1QIiwgRklMRV9UWVBFX1dCTVAsICJpbWFnZS92bmQud2FwLndibXAiKTsKICAKLSAgICAgICAgYWRkRmlsZVR5cGUoIk0zVSIsIEZJTEVfVFlQRV9NM1UsICJhdWRpby94LW1wZWd1cmwiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIlBMUyIsIEZJTEVfVFlQRV9QTFMsICJhdWRpby94LXNjcGxzIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJXUEwiLCBGSUxFX1RZUEVfV1BMLCAiYXBwbGljYXRpb24vdm5kLm1zLXdwbCIpOworICAgICAgICBhZGRGaWxlVHlwZSgiTTNVIiwgRklMRV9UWVBFX00zVSwgImF1ZGlvL3gtbXBlZ3VybCIsIE10cENvbnN0YW50cy5GT1JNQVRfTTNVX1BMQVlMSVNUKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIlBMUyIsIEZJTEVfVFlQRV9QTFMsICJhdWRpby94LXNjcGxzIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9QTFNfUExBWUxJU1QpOworICAgICAgICBhZGRGaWxlVHlwZSgiV1BMIiwgRklMRV9UWVBFX1dQTCwgImFwcGxpY2F0aW9uL3ZuZC5tcy13cGwiLCBNdHBDb25zdGFudHMuRk9STUFUX1dQTF9QTEFZTElTVCk7CiAKICAgICAgICAgLy8gY29tcHV0ZSBmaWxlIGV4dGVuc2lvbnMgbGlzdCBmb3IgbmF0aXZlIE1lZGlhIFNjYW5uZXIKICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKQEAgLTIyMiw0ICsyMzksMjUgQEAKICAgICAgICAgcmV0dXJuICh2YWx1ZSA9PSBudWxsID8gMCA6IHZhbHVlLmludFZhbHVlKCkpOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEZvcm1hdENvZGUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgbWltZVR5cGUpIHsKKyAgICAgICAgaWYgKG1pbWVUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEludGVnZXIgdmFsdWUgPSBzTWltZVR5cGVUb0Zvcm1hdE1hcC5nZXQobWltZVR5cGUpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnQgbGFzdERvdCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChsYXN0RG90ID4gMCkgeworICAgICAgICAgICAgU3RyaW5nIGV4dGVuc2lvbiA9IGZpbGVOYW1lLnN1YnN0cmluZyhsYXN0RG90ICsgMSk7CisgICAgICAgICAgICBJbnRlZ2VyIHZhbHVlID0gc0ZpbGVUeXBlVG9Gb3JtYXRNYXAuZ2V0KGV4dGVuc2lvbik7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuRk9STUFUX1VOREVGSU5FRDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNaW1lVHlwZUZvckZvcm1hdENvZGUoaW50IGZvcm1hdENvZGUpIHsKKyAgICAgICAgcmV0dXJuIHNGb3JtYXRUb01pbWVUeXBlTWFwLmdldChmb3JtYXRDb2RlKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUmVjb3JkZXIuamF2YQppbmRleCAzNGE4NmVjLi5jYTM2NGY1IDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlci5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyLmphdmEKQEAgLTcyLDYgKzcyLDkgQEAKIAogICAgIHByaXZhdGUgU3RyaW5nIG1QYXRoOwogICAgIHByaXZhdGUgRmlsZURlc2NyaXB0b3IgbUZkOworICAgIHByaXZhdGUgYm9vbGVhbiBtUHJlcGFyZUF1eGlsaWFyeUZpbGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIFN0cmluZyBtUGF0aEF1eDsKKyAgICBwcml2YXRlIEZpbGVEZXNjcmlwdG9yIG1GZEF1eDsKICAgICBwcml2YXRlIEV2ZW50SGFuZGxlciBtRXZlbnRIYW5kbGVyOwogICAgIHByaXZhdGUgT25FcnJvckxpc3RlbmVyIG1PbkVycm9yTGlzdGVuZXI7CiAgICAgcHJpdmF0ZSBPbkluZm9MaXN0ZW5lciBtT25JbmZvTGlzdGVuZXI7CkBAIC0yODIsNiArMjg1LDI4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRW5hYmxlcy9EaXNhYmxlcyB0aW1lIGxhcHNlIGNhcHR1cmUgYW5kIHNldHMgaXRzIHBhcmFtZXRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZAorICAgICAqIGJlIGNhbGxlZCBhZnRlciBzZXRQcm9maWxlKCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5hYmxlVGltZUxhcHNlIFBhc3MgdHJ1ZSB0byBlbmFibGUgdGltZSBsYXBzZSBjYXB0dXJlLCBmYWxzZSB0byBkaXNhYmxlIGl0LgorICAgICAqIEBwYXJhbSB1c2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSBQYXNzIHRydWUgdG8gdXNlIHN0aWxsIGNhbWVyYSBmb3IgY2FwdHVyaW5nIHRpbWUgbGFwc2UKKyAgICAgKiBmcmFtZXMsIGZhbHNlIHRvIHVzZSB0aGUgdmlkZW8gY2FtZXJhLgorICAgICAqIEBwYXJhbSB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zIHRpbWUgYmV0d2VlbiB0d28gY2FwdHVyZXMgb2YgdGltZSBsYXBzZSBmcmFtZXMuCisgICAgICogQHBhcmFtIGVuY29kZXJMZXZlbCB0aGUgdmlkZW8gZW5jb2RlciBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUaW1lTGFwc2VQYXJhbWV0ZXJzKGJvb2xlYW4gZW5hYmxlVGltZUxhcHNlLAorICAgICAgICAgICAgYm9vbGVhbiB1c2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSwKKyAgICAgICAgICAgIGludCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zLCBpbnQgZW5jb2RlckxldmVsKSB7CisgICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJ0aW1lLWxhcHNlLWVuYWJsZT0lZCIsCisgICAgICAgICAgICAgICAgICAgIChlbmFibGVUaW1lTGFwc2UpID8gMSA6IDApKTsKKyAgICAgICAgc2V0UGFyYW1ldGVyKFN0cmluZy5mb3JtYXQoInVzZS1zdGlsbC1jYW1lcmEtZm9yLXRpbWUtbGFwc2U9JWQiLAorICAgICAgICAgICAgICAgICAgICAodXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpID8gMSA6IDApKTsKKyAgICAgICAgc2V0UGFyYW1ldGVyKFN0cmluZy5mb3JtYXQoInRpbWUtYmV0d2Vlbi10aW1lLWxhcHNlLWZyYW1lLWNhcHR1cmU9JWQiLAorICAgICAgICAgICAgICAgICAgICB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zKSk7CisgICAgICAgIHNldFZpZGVvRW5jb2RlckxldmVsKGVuY29kZXJMZXZlbCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQgZmlsZSBwcm9kdWNlZCBkdXJpbmcgcmVjb3JkaW5nLiBDYWxsIHRoaXMKICAgICAgKiBhZnRlciBzZXRBdWRpb1NvdXJjZSgpL3NldFZpZGVvU291cmNlKCkgYnV0IGJlZm9yZSBwcmVwYXJlKCkuCiAgICAgICoKQEAgLTQ0OCw2ICs0NzMsNDggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsZXZlbCBvZiB0aGUgZW5jb2Rlci4gQ2FsbCB0aGlzIGJlZm9yZSBwcmVwYXJlKCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5jb2RlckxldmVsIHRoZSB2aWRlbyBlbmNvZGVyIGxldmVsLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmlkZW9FbmNvZGVyTGV2ZWwoaW50IGVuY29kZXJMZXZlbCkgeworICAgICAgICBzZXRQYXJhbWV0ZXIoU3RyaW5nLmZvcm1hdCgidmlkZW8tcGFyYW0tZW5jb2Rlci1sZXZlbD0lZCIsIGVuY29kZXJMZXZlbCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhc3MgaW4gdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgYXV4aWxpYXJ5IGZpbGUgdG8gYmUgd3JpdHRlbi4gQ2FsbCB0aGlzIGFmdGVyCisgICAgICogc2V0T3V0cHV0Rm9ybWF0KCkgYnV0IGJlZm9yZSBwcmVwYXJlKCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmQgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IgdG8gYmUgd3JpdHRlbiBpbnRvLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGl0IGlzIGNhbGxlZCBiZWZvcmUKKyAgICAgKiBzZXRPdXRwdXRGb3JtYXQoKSBvciBhZnRlciBwcmVwYXJlKCkKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1eGlsaWFyeU91dHB1dEZpbGUoRmlsZURlc2NyaXB0b3IgZmQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICB7CisgICAgICAgIG1QcmVwYXJlQXV4aWxpYXJ5RmlsZSA9IHRydWU7CisgICAgICAgIG1QYXRoQXV4ID0gbnVsbDsKKyAgICAgICAgbUZkQXV4ID0gZmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcGF0aCBvZiB0aGUgYXV4aWxpYXJ5IG91dHB1dCBmaWxlIHRvIGJlIHByb2R1Y2VkLiBDYWxsIHRoaXMgYWZ0ZXIKKyAgICAgKiBzZXRPdXRwdXRGb3JtYXQoKSBidXQgYmVmb3JlIHByZXBhcmUoKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRobmFtZSB0byB1c2UuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgaXQgaXMgY2FsbGVkIGJlZm9yZQorICAgICAqIHNldE91dHB1dEZvcm1hdCgpIG9yIGFmdGVyIHByZXBhcmUoKQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV4aWxpYXJ5T3V0cHV0RmlsZShTdHJpbmcgcGF0aCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbVByZXBhcmVBdXhpbGlhcnlGaWxlID0gdHJ1ZTsKKyAgICAgICAgbUZkQXV4ID0gbnVsbDsKKyAgICAgICAgbVBhdGhBdXggPSBwYXRoOworICAgIH0KKworICAgIC8qKgogICAgICAqIFBhc3MgaW4gdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgZmlsZSB0byBiZSB3cml0dGVuLiBDYWxsIHRoaXMgYWZ0ZXIKICAgICAgKiBzZXRPdXRwdXRGb3JtYXQoKSBidXQgYmVmb3JlIHByZXBhcmUoKS4KICAgICAgKgpAQCAtNDc4LDYgKzU0NSw4IEBACiAgICAgLy8gbmF0aXZlIGltcGxlbWVudGF0aW9uCiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBfc2V0T3V0cHV0RmlsZShGaWxlRGVzY3JpcHRvciBmZCwgbG9uZyBvZmZzZXQsIGxvbmcgbGVuZ3RoKQogICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIF9zZXRPdXRwdXRGaWxlQXV4KEZpbGVEZXNjcmlwdG9yIGZkKQorICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIF9wcmVwYXJlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CiAKICAgICAvKioKQEAgLTUwMyw2ICs1NzIsMjIgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTm8gdmFsaWQgb3V0cHV0IGZpbGUiKTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChtUHJlcGFyZUF1eGlsaWFyeUZpbGUpIHsKKyAgICAgICAgICAgIGlmIChtUGF0aEF1eCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShtUGF0aEF1eCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgX3NldE91dHB1dEZpbGVBdXgoZm9zLmdldEZEKCkpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUZkQXV4ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBfc2V0T3V0cHV0RmlsZUF1eChtRmRBdXgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk5vIHZhbGlkIG91dHB1dCBmaWxlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBfcHJlcGFyZSgpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lci5qYXZhCmluZGV4IDMzMzMyNjguLjdkOGVmNTggMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXIuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFTY2FubmVyLmphdmEKQEAgLTMwNSw2ICszMDUsNyBAQAogICAgIHByaXZhdGUgVXJpIG1HZW5yZXNVcmk7CiAgICAgcHJpdmF0ZSBVcmkgbVBsYXlsaXN0c1VyaTsKICAgICBwcml2YXRlIGJvb2xlYW4gbVByb2Nlc3NQbGF5bGlzdHMsIG1Qcm9jZXNzR2VucmVzOworICAgIHByaXZhdGUgaW50IG1NdHBPYmplY3RIYW5kbGU7CiAKICAgICAvLyB1c2VkIHdoZW4gc2Nhbm5pbmcgdGhlIGltYWdlIGRhdGFiYXNlIHNvIHdlIGtub3cgd2hldGhlciB3ZSBoYXZlIHRvIHBydW5lCiAgICAgLy8gb2xkIHRodW1ibmFpbCBmaWxlcwpAQCAtNTU1LDcgKzU1Niw4IEBACiAgICAgICAgICAgICAgICAgbVRpdGxlID0gdmFsdWU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYXJ0aXN0IikgfHwgbmFtZS5zdGFydHNXaXRoKCJhcnRpc3Q7IikpIHsKICAgICAgICAgICAgICAgICBtQXJ0aXN0ID0gdmFsdWUudHJpbSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImFsYnVtYXJ0aXN0IikgfHwgbmFtZS5zdGFydHNXaXRoKCJhbGJ1bWFydGlzdDsiKSkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImFsYnVtYXJ0aXN0IikgfHwgbmFtZS5zdGFydHNXaXRoKCJhbGJ1bWFydGlzdDsiKQorICAgICAgICAgICAgICAgICAgICB8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImJhbmQiKSB8fCBuYW1lLnN0YXJ0c1dpdGgoImJhbmQ7IikpIHsKICAgICAgICAgICAgICAgICBtQWxidW1BcnRpc3QgPSB2YWx1ZS50cmltKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYWxidW0iKSB8fCBuYW1lLnN0YXJ0c1dpdGgoImFsYnVtOyIpKSB7CiAgICAgICAgICAgICAgICAgbUFsYnVtID0gdmFsdWUudHJpbSgpOwpAQCAtNjI1LDYgKzYyNyw5IEBACiAgICAgICAgICAgICBtYXAucHV0KE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLkRBVEVfTU9ESUZJRUQsIG1MYXN0TW9kaWZpZWQpOwogICAgICAgICAgICAgbWFwLnB1dChNZWRpYVN0b3JlLk1lZGlhQ29sdW1ucy5TSVpFLCBtRmlsZVNpemUpOwogICAgICAgICAgICAgbWFwLnB1dChNZWRpYVN0b3JlLk1lZGlhQ29sdW1ucy5NSU1FX1RZUEUsIG1NaW1lVHlwZSk7CisgICAgICAgICAgICBpZiAobU10cE9iamVjdEhhbmRsZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbWFwLnB1dChNZWRpYVN0b3JlLk1lZGlhQ29sdW1ucy5NRURJQV9TQ0FOTkVSX05FV19PQkpFQ1RfSUQsIG1NdHBPYmplY3RIYW5kbGUpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoTWVkaWFGaWxlLmlzVmlkZW9GaWxlVHlwZShtRmlsZVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgbWFwLnB1dChWaWRlby5NZWRpYS5BUlRJU1QsIChtQXJ0aXN0ICE9IG51bGwgJiYgbUFydGlzdC5sZW5ndGgoKSA+IDAgPyBtQXJ0aXN0IDogTWVkaWFTdG9yZS5VTktOT1dOX1NUUklORykpOwpAQCAtMTIyNyw2ICsxMjMyLDE0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgVXJpIHNjYW5NdHBGaWxlKFN0cmluZyBwYXRoLCBTdHJpbmcgdm9sdW1lTmFtZSwgaW50IG9iamVjdEhhbmRsZSwgaW50IGZvcm1hdCkgeworICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBNZWRpYUZpbGUuZ2V0TWltZVR5cGVGb3JGb3JtYXRDb2RlKGZvcm1hdCk7CisgICAgICAgIG1NdHBPYmplY3RIYW5kbGUgPSBvYmplY3RIYW5kbGU7CisgICAgICAgIFVyaSByZXN1bHQgPSBzY2FuU2luZ2xlRmlsZShwYXRoLCB2b2x1bWVOYW1lLCBtaW1lVHlwZSk7CisgICAgICAgIG1NdHBPYmplY3RIYW5kbGUgPSAwOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwogICAgIC8vIHJldHVybnMgdGhlIG51bWJlciBvZiBtYXRjaGluZyBmaWxlL2RpcmVjdG9yeSBuYW1lcywgc3RhcnRpbmcgZnJvbSB0aGUgcmlnaHQKICAgICBwcml2YXRlIGludCBtYXRjaFBhdGhzKFN0cmluZyBwYXRoMSwgU3RyaW5nIHBhdGgyKSB7CiAgICAgICAgIGludCByZXN1bHQgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENsaWVudC5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YzBjZTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ2xpZW50LmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICoge0BoaWRlfQorICovCitwdWJsaWMgY2xhc3MgTXRwQ2xpZW50IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTXRwQ2xpZW50IjsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdGVuZXIgbUxpc3RlbmVyOworCisgICAgc3RhdGljIHsKKyAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJtZWRpYV9qbmkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTXRwQ2xpZW50KExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG5hdGl2ZV9zZXR1cCgpOworICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJNdHBDbGllbnQ6IGxpc3RlbmVyIGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmF0aXZlX2ZpbmFsaXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3RhcnQoKSB7CisgICAgICAgIHJldHVybiBuYXRpdmVfc3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBuYXRpdmVfc3RvcCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZU9iamVjdChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX2RlbGV0ZV9vYmplY3QoZGV2aWNlSUQsIG9iamVjdElEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhcmVudChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX2dldF9wYXJlbnQoZGV2aWNlSUQsIG9iamVjdElEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFN0b3JhZ2VJRChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX2dldF9zdG9yYWdlX2lkKGRldmljZUlELCBvYmplY3RJRCk7CisgICAgfQorCisgICAgLy8gY3JlYXRlIGEgZmlsZSBkZXNjcmlwdG9yIGZvciByZWFkaW5nIHRoZSBjb250ZW50cyBvZiBhbiBvYmplY3Qgb3ZlciBNVFAKKyAgICBwdWJsaWMgUGFyY2VsRmlsZURlc2NyaXB0b3Igb3BlbkZpbGUoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpIHsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV9vcGVuX2ZpbGUoZGV2aWNlSUQsIG9iamVjdElEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIHsKKyAgICAgICAgLy8gY2FsbGVkIHdoZW4gYSBuZXcgTVRQIGRldmljZSBoYXMgYmVlbiBkaXNjb3ZlcmVkCisgICAgICAgIHZvaWQgZGV2aWNlQWRkZWQoaW50IGlkKTsKKworICAgICAgICAvLyBjYWxsZWQgd2hlbiBhbiBNVFAgZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgICAgdm9pZCBkZXZpY2VSZW1vdmVkKGludCBpZCk7CisgICAgfQorCisgICAgLy8gY2FsbGVkIGZyb20gbmF0aXZlIGNvZGUKKyAgICBwcml2YXRlIHZvaWQgZGV2aWNlQWRkZWQoaW50IGlkKSB7CisgICAgICAgIExvZy5kKFRBRywgImRldmljZUFkZGVkICIgKyBpZCk7CisgICAgICAgIG1MaXN0ZW5lci5kZXZpY2VBZGRlZChpZCk7CisgICAgfQorCisgICAgLy8gY2FsbGVkIGZyb20gbmF0aXZlIGNvZGUKKyAgICBwcml2YXRlIHZvaWQgZGV2aWNlUmVtb3ZlZChpbnQgaWQpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZGV2aWNlUmVtb3ZlZCAiICsgaWQpOworICAgICAgICBtTGlzdGVuZXIuZGV2aWNlUmVtb3ZlZChpZCk7CisgICAgfQorCisgICAgLy8gdXNlZCBieSB0aGUgSk5JIGNvZGUKKyAgICBwcml2YXRlIGludCBtTmF0aXZlQ29udGV4dDsKKworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NldHVwKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9zdGFydCgpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX3N0b3AoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9kZWxldGVfb2JqZWN0KGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2dldF9wYXJlbnQoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpOworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfZ2V0X3N0b3JhZ2VfaWQoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpOworICAgIHByaXZhdGUgbmF0aXZlIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG5hdGl2ZV9vcGVuX2ZpbGUoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENvbnN0YW50cy5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1M2Y2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwzODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTXRwQ29uc3RhbnRzIHsKKworLy8gTVRQIFJlc3BvbnNlIENvZGVzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfVU5ERUZJTkVEID0gMHgyMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX09LID0gMHgyMDAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0dFTkVSQUxfRVJST1IgPSAweDIwMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTiA9IDB4MjAwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX1RSQU5TQUNUSU9OX0lEID0gMHgyMDA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEID0gMHgyMDA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1BBUkFNRVRFUl9OT1RfU1VQUE9SVEVEID0gMHgyMDA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOQ09NUExFVEVfVFJBTlNGRVIgPSAweDIwMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9TVE9SQUdFX0lEID0gMHgyMDA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRSA9IDB4MjAwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9ERVZJQ0VfUFJPUF9OT1RfU1VQUE9SVEVEID0gMHgyMDBBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0ZPUk1BVF9DT0RFID0gMHgyMDBCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NUT1JBR0VfRlVMTCA9IDB4MjAwQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9PQkpFQ1RfV1JJVEVfUFJPVEVDVEVEID0gMHgyMDBEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NUT1JFX1JFQURfT05MWSA9IDB4MjAwRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9BQ0NFU1NfREVOSUVEID0gMHgyMDBGOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX05PX1RIVU1CTkFJTF9QUkVTRU5UID0gMHgyMDEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NFTEZfVEVTVF9GQUlMRUQgPSAweDIwMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfUEFSVElBTF9ERUxFVElPTiA9IDB4MjAxMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TVE9SRV9OT1RfQVZBSUxBQkxFID0gMHgyMDEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NQRUNJRklDQVRJT05fQllfRk9STUFUX1VOU1VQUE9SVEVEID0gMHgyMDE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX05PX1ZBTElEX09CSkVDVF9JTkZPID0gMHgyMDE1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOVkFMSURfQ09ERV9GT1JNQVQgPSAweDIwMTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfVU5LTk9XTl9WRU5ET1JfQ09ERSA9IDB4MjAxNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9DQVBUVVJFX0FMUkVBRFlfVEVSTUlOQVRFRCA9IDB4MjAxODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9ERVZJQ0VfQlVTWSA9IDB4MjAxOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX1BBUkVOVF9PQkpFQ1QgPSAweDIwMUE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9ERVZJQ0VfUFJPUF9GT1JNQVQgPSAweDIwMUI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9ERVZJQ0VfUFJPUF9WQUxVRSA9IDB4MjAxQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX1BBUkFNRVRFUiA9IDB4MjAxRDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TRVNTSU9OX0FMUkVBRFlfT1BFTiA9IDB4MjAxRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQgPSAweDIwMUY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1BFQ0lGSUNBVElPTl9PRl9ERVNUSU5BVElPTl9VTlNVUFBPUlRFRCA9IDB4MjAyMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX0NPREUgPSAweEE4MDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUFJPUF9GT1JNQVQgPSAweEE4MDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUFJPUF9WQUxVRSA9IDB4QTgwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX09CSkVDVF9SRUZFUkVOQ0UgPSAweEE4MDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfR1JPVVBfTk9UX1NVUFBPUlRFRCA9IDB4QTgwNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX0RBVEFTRVQgPSAweEE4MDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1BFQ0lGSUNBVElPTl9CWV9HUk9VUF9VTlNVUFBPUlRFRCA9IDB4QTgwNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TUEVDSUZJQ0FUSU9OX0JZX0RFUFRIX1VOU1VQUE9SVEVEID0gMHhBODA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX09CSkVDVF9UT09fTEFSR0UgPSAweEE4MDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfT0JKRUNUX1BST1BfTk9UX1NVUFBPUlRFRCA9IDB4QTgwQTsKKworICAgIC8vIE1UUCBmb3JtYXQgY29kZXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEID0gMHgzMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BU1NPQ0lBVElPTiA9IDB4MzAwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfU0NSSVBUID0gMHgzMDAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9FWEVDVVRBQkxFID0gMHgzMDAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9URVhUID0gMHgzMDA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9IVE1MID0gMHgzMDA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9EUE9GID0gMHgzMDA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BSUZGID0gMHgzMDA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XQVYgPSAweDMwMDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01QMyA9IDB4MzAwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQVZJID0gMHgzMDBBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NUEVHID0gMHgzMDBCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BU0YgPSAweDMwMEM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0RFRklORUQgPSAweDM4MDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0VYSUZfSlBFRyA9IDB4MzgwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVElGRl9FUCA9IDB4MzgwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRkxBU0hQSVggPSAweDM4MDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0JNUCA9IDB4MzgwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQ0lGRiA9IDB4MzgwNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfR0lGID0gMHgzODA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9KRklGID0gMHgzODA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9DRCA9IDB4MzgwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfUElDVCA9IDB4MzgwQTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfUE5HID0gMHgzODBCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9USUZGID0gMHgzODBEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9USUZGX0lUID0gMHgzODBFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9KUDIgPSAweDM4MEY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0pQWCA9IDB4MzgxMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0ZJUk1XQVJFID0gMHhCODAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XSU5ET1dTX0lNQUdFX0ZPUk1BVCA9IDB4Qjg4MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0FVRElPID0gMHhCOTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XTUEgPSAweEI5MDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX09HRyA9IDB4QjkwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUFDID0gMHhCOTAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BVURJQkxFID0gMHhCOTA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9GTEFDID0gMHhCOTA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfVklERU8gPSAweEI5ODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1dNViA9IDB4Qjk4MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVA0X0NPTlRBSU5FUiA9IDB4Qjk4MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVAyID0gMHhCOTgzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF8zR1BfQ09OVEFJTkVSID0gMHhCOTg0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfQ09MTEVDVElPTiA9IDB4QkEwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfTVVMVElNRURJQV9BTEJVTSA9IDB4QkEwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfSU1BR0VfQUxCVU0gPSAweEJBMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0FVRElPX0FMQlVNID0gMHhCQTAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9WSURFT19BTEJVTSA9IDB4QkEwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1QgPSAweEJBMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1RfR1JPVVAgPSAweEJBMDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX01FU1NBR0VfRk9MREVSID0gMHhCQTA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9DSEFQVEVSRURfUFJPRFVDVElPTiA9IDB4QkEwODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfQVVESU9fUExBWUxJU1QgPSAweEJBMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX1ZJREVPX1BMQVlMSVNUID0gMHhCQTBBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9NRURJQUNBU1QgPSAweEJBMEI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1dQTF9QTEFZTElTVCA9IDB4QkExMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTTNVX1BMQVlMSVNUID0gMHhCQTExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NUExfUExBWUxJU1QgPSAweEJBMTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FTWF9QTEFZTElTVCA9IDB4QkExMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfUExTX1BMQVlMSVNUID0gMHhCQTE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfRE9DVU1FTlQgPSAweEJBODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0RPQ1VNRU5UID0gMHhCQTgxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9YTUxfRE9DVU1FTlQgPSAweEJBODI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01TX1dPUkRfRE9DVU1FTlQgPSAweEJBODM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01IVF9DT01QSUxFRF9IVE1MX0RPQ1VNRU5UID0gMHhCQTg0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NU19FWENFTF9TUFJFQURTSEVFVCA9IDB4QkE4NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVNfUE9XRVJQT0lOVF9QUkVTRU5UQVRJT04gPSAweEJBODY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1VOREVGSU5FRF9NRVNTQUdFID0gMHhCQjAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9NRVNTU0FHRSA9IDB4QkIwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0NPTlRBQ1QgPSAweEJCODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1QgPSAweEJCODE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1ZDQVJEXzIgPSAweEJCODI7CisKKyAgICAvLyBNVFAgb2JqZWN0IHByb3BlcnRpZXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TVE9SQUdFX0lEID0gMHhEQzAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX09CSkVDVF9GT1JNQVQgPSAweERDMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUFJPVEVDVElPTl9TVEFUVVMgPSAweERDMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfT0JKRUNUX1NJWkUgPSAweERDMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQVNTT0NJQVRJT05fVFlQRSA9IDB4REMwNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BU1NPQ0lBVElPTl9ERVNDID0gMHhEQzA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX09CSkVDVF9GSUxFX05BTUUgPSAweERDMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfREFURV9DUkVBVEVEID0gMHhEQzA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0RBVEVfTU9ESUZJRUQgPSAweERDMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfS0VZV09SRFMgPSAweERDMEE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEFSRU5UX09CSkVDVCA9IDB4REMwQjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BTExPV0VEX0ZPTERFUl9DT05URU5UUyA9IDB4REMwQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9ISURERU4gPSAweERDMEQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU1lTVEVNX09CSkVDVCA9IDB4REMwRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QRVJTSVNURU5UX1VJRCA9IDB4REM0MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TWU5DX0lEID0gMHhEQzQyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BST1BFUlRZX0JBRyA9IDB4REM0MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9OQU1FID0gMHhEQzQ0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0NSRUFURURfQlkgPSAweERDNDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQVJUSVNUID0gMHhEQzQ2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0RBVEVfQVVUSE9SRUQgPSAweERDNDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfREVTQ1JJUFRJT04gPSAweERDNDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfVVJMX1JFRkVSRU5DRSA9IDB4REM0OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9MQU5HVUFHRV9MT0NBTEUgPSAweERDNEE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQ09QWVJJR0hUX0lORk9STUFUSU9OID0gMHhEQzRCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1NPVVJDRSA9IDB4REM0QzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PUklHSU5fTE9DQVRJT04gPSAweERDNEQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfREFURV9BRERFRCA9IDB4REM0RTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9OT05fQ09OU1VNQUJMRSA9IDB4REM0RjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9DT1JSVVBUX1VOUExBWUFCTEUgPSAweERDNTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUFJPRFVDRVJfU0VSSUFMX05VTUJFUiA9IDB4REM1MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfRk9STUFUID0gMHhEQzgxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9TSVpFID0gMHhEQzgyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9IRUlHSFQgPSAweERDODM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX1dJRFRIID0gMHhEQzg0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9EVVJBVElPTiA9IDB4REM4NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfREFUQSA9IDB4REM4NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9XSURUSCA9IDB4REM4NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9IRUlHSFQgPSAweERDODg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRFVSQVRJT04gPSAweERDODk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUkFUSU5HID0gMHhEQzhBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1RSQUNLID0gMHhEQzhCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0dFTlJFID0gMHhEQzhDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0NSRURJVFMgPSAweERDOEQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTFlSSUNTID0gMHhEQzhFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1NVQlNDUklQVElPTl9DT05URU5UX0lEID0gMHhEQzhGOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BST0RVQ0VEX0JZID0gMHhEQzkwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1VTRV9DT1VOVCA9IDB4REM5MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TS0lQX0NPVU5UID0gMHhEQzkyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0xBU1RfQUNDRVNTRUQgPSAweERDOTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEFSRU5UQUxfUkFUSU5HID0gMHhEQzk0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01FVEFfR0VOUkUgPSAweERDOTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQ09NUE9TRVIgPSAweERDOTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRUZGRUNUSVZFX1JBVElORyA9IDB4REM5NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TVUJUSVRMRSA9IDB4REM5ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PUklHSU5BTF9SRUxFQVNFX0RBVEUgPSAweERDOTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUxCVU1fTkFNRSA9IDB4REM5QTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BTEJVTV9BUlRJU1QgPSAweERDOUI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTU9PRCA9IDB4REM5QzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9EUk1fU1RBVFVTID0gMHhEQzlEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1NVQl9ERVNDUklQVElPTiA9IDB4REM5RTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9JU19DUk9QUEVEID0gMHhEQ0QxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0lTX0NPTE9VUl9DT1JSRUNURUQgPSAweERDRDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfSU1BR0VfQklUX0RFUFRIID0gMHhEQ0QzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0ZfTlVNQkVSID0gMHhEQ0Q0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VYUE9TVVJFX1RJTUUgPSAweERDRDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRVhQT1NVUkVfSU5ERVggPSAweERDRDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfVE9UQUxfQklUUkFURSA9IDB4REU5MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9CSVRSQVRFX1RZUEUgPSAweERFOTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU0FNUExFX1JBVEUgPSAweERFOTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTlVNQkVSX09GX0NIQU5ORUxTID0gMHhERTk0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FVRElPX0JJVF9ERVBUSCA9IDB4REU5NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TQ0FOX1RZUEUgPSAweERFOTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQVVESU9fV0FWRV9DT0RFQyA9IDB4REU5OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BVURJT19CSVRSQVRFID0gMHhERTlBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1ZJREVPX0ZPVVJDQ19DT0RFQyA9IDB4REU5QjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9WSURFT19CSVRSQVRFID0gMHhERTlDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0ZSQU1FU19QRVJfVEhPVVNBTkRfU0VDT05EUyA9IDB4REU5RDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9LRVlGUkFNRV9ESVNUQU5DRSA9IDB4REU5RTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9CVUZGRVJfU0laRSA9IDB4REU5RjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FTkNPRElOR19RVUFMSVRZID0gMHhERUEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VOQ09ESU5HX1BST0ZJTEUgPSAweERFQTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRElTUExBWV9OQU1FID0gMHhEQ0UwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0JPRFlfVEVYVCA9IDB4RENFMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TVUJKRUNUID0gMHhEQ0UyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BSSU9SSVRZID0gMHhEQ0UzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0dJVkVOX05BTUUgPSAweEREMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTUlERExFX05BTUVTID0gMHhERDAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0ZBTUlMWV9OQU1FID0gMHhERDAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BSRUZJWCA9IDB4REQwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TVUZGSVggPSAweEREMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVUSUNfR0lWRU5fTkFNRSA9IDB4REQwNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QSE9ORVRJQ19GQU1JTFlfTkFNRSA9IDB4REQwNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FTUFJTF9QUklNQVJZID0gMHhERDA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VNQUlMX1BFUlNPTkFMXzEgPSAweEREMDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRU1BSUxfUEVSU09OQUxfMiA9IDB4REQwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FTUFJTF9CVVNJTkVTU18xID0gMHhERDBBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VNQUlMX0JVU0lORVNTXzIgPSAweEREMEI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRU1BSUxfT1RIRVJTID0gMHhERDBDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BIT05FX05VTUJFUl9QUklNQVJZID0gMHhERDBEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BIT05FX05VTUJFUl9QRVJTT05BTCA9IDB4REQwRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QSE9ORV9OVU1CRVJfUEVSU09OQUxfMiA9IDB4REQwRjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QSE9ORV9OVU1CRVJfQlVTSU5FU1MgPSAweEREMTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVfTlVNQkVSX0JVU0lORVNTXzIgPSAweEREMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVfTlVNQkVSX01PQklMRT0gMHhERDEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BIT05FX05VTUJFUl9NT0JJTEVfMiA9IDB4REQxMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9GQVhfTlVNQkVSX1BSSU1BUlkgPSAweEREMTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRkFYX05VTUJFUl9QRVJTT05BTD0gMHhERDE1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0ZBWF9OVU1CRVJfQlVTSU5FU1M9IDB4REQxNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QQUdFUl9OVU1CRVIgPSAweEREMTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVfTlVNQkVSX09USEVSUz0gMHhERDE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BSSU1BUllfV0VCX0FERFJFU1M9IDB4REQxOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QRVJTT05BTF9XRUJfQUREUkVTUyA9IDB4REQxQTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9CVVNJTkVTU19XRUJfQUREUkVTUyA9IDB4REQxQjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTID0gMHhERDFDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0lOU1RBTlRfTUVTU0FOR0VSX0FERFJFU1NfMiA9IDB4REQxRDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTXzMgPSAweEREMUU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfRlVMTCA9IDB4REQxRjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9MSU5FXzEgPSAweEREMjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfTElORV8yID0gMHhERDIxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0NJVFkgPSAweEREMjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfUkVHSU9OID0gMHhERDIzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX1BPU1RBTF9DT0RFID0gMHhERDI0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0NPVU5UUlkgPSAweEREMjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfRlVMTCA9IDB4REQyNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19MSU5FXzEgPSAweEREMjc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfTElORV8yID0gMHhERDI4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0NJVFkgPSAweEREMjk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfUkVHSU9OID0gMHhERDJBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX1BPU1RBTF9DT0RFID0gMHhERDJCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0NPVU5UUlkgPSAweEREMkM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfRlVMTCA9IDB4REQyRDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9MSU5FXzEgPSAweEREMkU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfTElORV8yID0gMHhERDJGOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0NJVFkgPSAweEREMzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfUkVHSU9OID0gMHhERDMxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX1BPU1RBTF9DT0RFID0gMHhERDMyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0NPVU5UUlkgPSAweEREMzM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfT1JHQU5JWkFUSU9OX05BTUUgPSAweEREMzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVUSUNfT1JHQU5JWkFUSU9OX05BTUUgPSAweEREMzU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUk9MRSA9IDB4REQzNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9CSVJUSERBVEUgPSAweEREMzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTUVTU0FHRV9UTyA9IDB4REQ0MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9NRVNTQUdFX0NDID0gMHhERDQxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01FU1NBR0VfQkNDID0gMHhERDQyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01FU1NBR0VfUkVBRCA9IDB4REQ0MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9NRVNTQUdFX1JFQ0VJVkVEX1RJTUUgPSAweERENDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTUVTU0FHRV9TRU5ERVIgPSAweERENDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfQkVHSU5fVElNRSA9IDB4REQ1MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BQ1RJVklUWV9FTkRfVElNRSA9IDB4REQ1MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BQ1RJVklUWV9MT0NBVElPTiA9IDB4REQ1MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BQ1RJVklUWV9SRVFVSVJFRF9BVFRFTkRFRVMgPSAweERENTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfT1BUSU9OQUxfQVRURU5ERUVTID0gMHhERDU1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FDVElWSVRZX1JFU09VUkNFUyA9IDB4REQ1NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BQ1RJVklUWV9BQ0NFUFRFRCA9IDB4REQ1NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BQ1RJVklUWV9URU5UQVRJVkUgPSAweERENTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfREVDTElORUQgPSAweERENTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfUkVNQUlOREVSX1RJTUUgPSAweERENUE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfT1dORVIgPSAweERENUI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfU1RBVFVTID0gMHhERDVDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX09XTkVSID0gMHhERDVEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VESVRPUiA9IDB4REQ1RTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9XRUJNQVNURVIgPSAweERENUY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfVVJMX1NPVVJDRSA9IDB4REQ2MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9VUkxfREVTVElOQVRJT04gPSAweERENjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfVElNRV9CT09LTUFSSyA9IDB4REQ2MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PQkpFQ1RfQk9PS01BUksgPSAweERENjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQllURV9CT09LTUFSSyA9IDB4REQ2NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9MQVNUX0JVSUxEX0RBVEUgPSAweERENzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfVElNRV9UT19MSVZFID0gMHhERDcxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01FRElBX0dVSUQgPSAweERENzI7CisKKyAgICAvLyBNVFAgZGV2aWNlIHByb3BlcnRpZXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfVU5ERUZJTkVEID0gMHg1MDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9CQVRURVJZX0xFVkVMID0gMHg1MDAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9GVU5DVElPTkFMX01PREUgPSAweDUwMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0lNQUdFX1NJWkUgPSAweDUwMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0NPTVBSRVNTSU9OX1NFVFRJTkcgPSAweDUwMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1dISVRFX0JBTEFOQ0UgPSAweDUwMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1JHQl9HQUlOID0gMHg1MDA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9GX05VTUJFUiA9IDB4NTAwNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRk9DQUxfTEVOR1RIID0gMHg1MDA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9GT0NVU19ESVNUQU5DRSA9IDB4NTAwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRk9DVVNfTU9ERSA9IDB4NTAwQTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfTUVURVJJTkdfTU9ERSA9IDB4NTAwQjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRkxBU0hfTU9ERSA9IDB4NTAwQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfVElNRSA9IDB4NTAwRDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfUFJPR1JBTV9NT0RFID0gMHg1MDBFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9JTkRFWCA9IDB4NTAwRjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfQklBU19DT01QRU5TQVRJT04gPSAweDUwMTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0RBVEVUSU1FID0gMHg1MDExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9DQVBUVVJFX0RFTEFZID0gMHg1MDEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9TVElMTF9DQVBUVVJFX01PREUgPSAweDUwMTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0NPTlRSQVNUID0gMHg1MDE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9TSEFSUE5FU1MgPSAweDUwMTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0RJR0lUQUxfWk9PTSA9IDB4NTAxNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRUZGRUNUX01PREUgPSAweDUwMTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0JVUlNUX05VTUJFUj0gMHg1MDE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9CVVJTVF9JTlRFUlZBTCA9IDB4NTAxOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfVElNRUxBUFNFX05VTUJFUiA9IDB4NTAxQTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfVElNRUxBUFNFX0lOVEVSVkFMID0gMHg1MDFCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9GT0NVU19NRVRFUklOR19NT0RFID0gMHg1MDFDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9VUExPQURfVVJMID0gMHg1MDFEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9BUlRJU1QgPSAweDUwMUU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0NPUFlSSUdIVF9JTkZPID0gMHg1MDFGOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9TWU5DSFJPTklaQVRJT05fUEFSVE5FUiA9IDB4RDQwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0ZSSUVORExZX05BTUUgPSAweEQ0MDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1ZPTFVNRSA9IDB4RDQwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfU1VQUE9SVEVEX0ZPUk1BVFNfT1JERVJFRCA9IDB4RDQwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0lDT04gPSAweEQ0MDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX1JBVEUgPSAweEQ0MTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX09CSkVDVCA9IDB4RDQxMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfUExBWUJBQ0tfQ09OVEFJTkVSX0lOREVYID0gMHhENDEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9TRVNTSU9OX0lOSVRJQVRPUl9WRVJTSU9OX0lORk8gPSAweEQ0MDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1BFUkNFSVZFRF9ERVZJQ0VfVFlQRSA9IDB4RDQwNzsKKworCisgICAgLyoqCisgICAgICogT2JqZWN0IGlzIG5vdCBwcm90ZWN0ZWQuIEl0IG1heSBiZSBtb2RpZmllZCBhbmQgZGVsZXRlZCwgYW5kIGl0cyBwcm9wZXJ0aWVzCisgICAgICogbWF5IGJlIG1vZGlmaWVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1RFQ1RJT05fU1RBVFVTX05PTkUgPSAwOworCisgICAgLyoqCisgICAgICogT2JqZWN0IGNhbiBub3QgYmUgbW9kaWZpZWQgb3IgZGVsZXRlZCBhbmQgaXRzIHByb3BlcnRpZXMgY2FuIG5vdCBiZSBtb2RpZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNUSU9OX1NUQVRVU19SRUFEX09OTFkgPSAweDgwMDE7CisKKyAgICAvKioKKyAgICAgKiBPYmplY3QgY2FuIG5vdCBiZSBtb2RpZmllZCBvciBkZWxldGVkIGJ1dCBpdHMgcHJvcGVydGllcyBhcmUgbW9kaWZpYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNUSU9OX1NUQVRVU19SRUFEX09OTFlfREFUQSA9IDB4ODAwMjsKKworICAgIC8qKgorICAgICAqIE9iamVjdCdzIGNvbnRlbnRzIGNhbiBub3QgYmUgdHJhbnNmZXJlZCBmcm9tIHRoZSBkZXZpY2UsIGJ1dCB0aGUgb2JqZWN0CisgICAgICogbWF5IGJlIG1vdmVkIG9yIGRlbGV0ZWQgYW5kIGl0cyBwcm9wZXJ0aWVzIG1heSBiZSBtb2RpZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNUSU9OX1NUQVRVU19OT05fVFJBTlNGRVJBQkxFX0RBVEEgPSAweDgwMDM7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1NPQ0lBVElPTl9UWVBFX0dFTkVSSUNfRk9MREVSID0gMHgwMDAxOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cEN1cnNvci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cEN1cnNvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MTQyZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yLmphdmEKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkFic3RyYWN0V2luZG93ZWRDdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXaW5kb3c7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAgKiBDdXJzb3IgY2xhc3MgZm9yIE1UUCBjb250ZW50IHByb3ZpZGVyCisgICogQGhpZGUKKyAgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNdHBDdXJzb3IgZXh0ZW5kcyBBYnN0cmFjdFdpbmRvd2VkQ3Vyc29yIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNdHBDdXJzb3IiOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fQ09VTlQgPSAtMTsKKworICAgIC8qIGNvbnN0YW50cyBmb3IgbVF1ZXJ5VHlwZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRSAgICAgICAgICAgICAgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9JRCAgICAgICAgICAgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JBR0UgICAgICAgICAgICAgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JBR0VfSUQgICAgICAgICAgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9CSkVDVCAgICAgICAgICAgICAgPSA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9JRCAgICAgICAgICAgPSA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JBR0VfQ0hJTERSRU4gICAgPSA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9DSElMRFJFTiAgICAgPSA4OworCisgICAgcHJpdmF0ZSBpbnQgbVF1ZXJ5VHlwZTsKKyAgICBwcml2YXRlIGludCBtRGV2aWNlSUQ7CisgICAgcHJpdmF0ZSBpbnQgbVN0b3JhZ2VJRDsKKyAgICBwcml2YXRlIGludCBtUWJqZWN0SUQ7CisKKyAgICAvKiogVGhlIG5hbWVzIG9mIHRoZSBjb2x1bW5zIGluIHRoZSBwcm9qZWN0aW9uICovCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBtQ29sdW1uczsKKworICAgIC8qKiBUaGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGN1cnNvciAqLworICAgIHByaXZhdGUgaW50IG1Db3VudCA9IE5PX0NPVU5UOworCisgICAgcHJpdmF0ZSBmaW5hbCBNdHBDbGllbnQgbUNsaWVudDsKKworICAgIHB1YmxpYyBNdHBDdXJzb3IoTXRwQ2xpZW50IGNsaWVudCwgaW50IHF1ZXJ5VHlwZSwgaW50IGRldmljZUlELCBpbnQgc3RvcmFnZUlELCBpbnQgb2JqZWN0SUQsCisgICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0aW9uKSB7CisKKyAgICAgICAgbUNsaWVudCA9IGNsaWVudDsKKyAgICAgICAgbVF1ZXJ5VHlwZSA9IHF1ZXJ5VHlwZTsKKyAgICAgICAgbURldmljZUlEID0gZGV2aWNlSUQ7CisgICAgICAgIG1TdG9yYWdlSUQgPSBzdG9yYWdlSUQ7CisgICAgICAgIG1RYmplY3RJRCA9IG9iamVjdElEOworICAgICAgICBtQ29sdW1ucyA9IHByb2plY3Rpb247CisKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IG1hcDsKKyAgICAgICAgc3dpdGNoIChxdWVyeVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgREVWSUNFOgorICAgICAgICAgICAgY2FzZSBERVZJQ0VfSUQ6CisgICAgICAgICAgICAgICAgbWFwID0gc0RldmljZVByb2plY3Rpb25NYXA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNUT1JBR0U6CisgICAgICAgICAgICBjYXNlIFNUT1JBR0VfSUQ6CisgICAgICAgICAgICAgICAgbWFwID0gc1N0b3JhZ2VQcm9qZWN0aW9uTWFwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1Q6CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9JRDoKKyAgICAgICAgICAgIGNhc2UgU1RPUkFHRV9DSElMRFJFTjoKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0NISUxEUkVOOgorICAgICAgICAgICAgICAgIG1hcCA9IHNPYmplY3RQcm9qZWN0aW9uTWFwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIHF1ZXJ5IHR5cGUgIiAgKyBxdWVyeVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgaW50W10gY29sdW1ucyA9IG5ldyBpbnRbcHJvamVjdGlvbi5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3Rpb24ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEludGVnZXIgaWQgPSBtYXAuZ2V0KHByb2plY3Rpb25baV0pOworICAgICAgICAgICAgaWYgKGlkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNvbHVtbiAiICArIHByb2plY3Rpb25baV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29sdW1uc1tpXSA9IGlkLmludFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlX3NldHVwKGNsaWVudCwgcXVlcnlUeXBlLCBkZXZpY2VJRCwgc3RvcmFnZUlELCBvYmplY3RJRCwgY29sdW1ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuYXRpdmVfZmluYWxpemUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICBpZiAobUNvdW50ID09IE5PX0NPVU5UKSB7CisgICAgICAgICAgICBmaWxsV2luZG93KDApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQ291bnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWVyeSgpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAicmVxdWVyeSIpOworICAgICAgICBtQ291bnQgPSBOT19DT1VOVDsKKyAgICAgICAgaWYgKG1XaW5kb3cgIT0gbnVsbCkgeworICAgICAgICAgICAgbVdpbmRvdy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXF1ZXJ5KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZpbGxXaW5kb3coaW50IHN0YXJ0UG9zKSB7CisgICAgICAgIGlmIChtV2luZG93ID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzbid0IGEgd2luZG93IHNldCBhbHJlYWR5IGl0IHdpbGwgb25seSBiZSBhY2Nlc3NlZCBsb2NhbGx5CisgICAgICAgICAgICBtV2luZG93ID0gbmV3IEN1cnNvcldpbmRvdyh0cnVlIC8qIHRoZSB3aW5kb3cgaXMgbG9jYWwgb25seSAqLyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVdpbmRvdy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIG1XaW5kb3cuc2V0U3RhcnRQb3NpdGlvbihzdGFydFBvcyk7CisgICAgICAgIG1Db3VudCA9IG5hdGl2ZV9maWxsX3dpbmRvdyhtV2luZG93LCBzdGFydFBvcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkgeworICAgICAgICBMb2cuZChUQUcsICJnZXRDb2x1bW5OYW1lcyByZXR1cm5pbmcgIiArIG1Db2x1bW5zKTsKKyAgICAgICAgcmV0dXJuIG1Db2x1bW5zOworICAgIH0KKworICAgIC8qIERldmljZSBDb2x1bW4gSURzICovCisgICAgIC8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBNdHBDdXJzb3IuY3BwICovCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1JPV19JRCAgICAgICAgICA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVklDRV9NQU5VRkFDVFVSRVIgICAgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfTU9ERUwgICAgICAgICAgID0gMzsKKworICAgIC8qIFN0b3JhZ2UgQ29sdW1uIElEcyAqLworICAgIC8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBNdHBDdXJzb3IuY3BwICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUT1JBR0VfUk9XX0lEICAgICAgICAgPSAxMDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUT1JBR0VfSURFTlRJRklFUiAgICAgPSAxMDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUT1JBR0VfREVTQ1JJUFRJT04gICAgPSAxMDM7CisKKyAgICAvKiBPYmplY3QgQ29sdW1uIElEcyAqLworICAgIC8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBNdHBDdXJzb3IuY3BwICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9ST1dfSUQgICAgICAgICAgICAgID0gMjAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfU1RPUkFHRV9JRCAgICAgICAgICA9IDIwMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0ZPUk1BVCAgICAgICAgICAgICAgPSAyMDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9QUk9URUNUSU9OX1NUQVRVUyAgID0gMjA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfU0laRSAgICAgICAgICAgICAgICA9IDIwNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1RIVU1CX0ZPUk1BVCAgICAgICAgPSAyMDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9USFVNQl9TSVpFICAgICAgICAgID0gMjA3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfVEhVTUJfV0lEVEggICAgICAgICA9IDIwODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1RIVU1CX0hFSUdIVCAgICAgICAgPSAyMDk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9JTUFHRV9XSURUSCAgICAgICAgID0gMjEwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfSU1BR0VfSEVJR0hUICAgICAgICA9IDIxMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0lNQUdFX0RFUFRIICAgICAgICAgPSAyMTI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9QQVJFTlQgICAgICAgICAgICAgID0gMjEzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfQVNTT0NJQVRJT05fVFlQRSAgICA9IDIxNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0FTU09DSUFUSU9OX0RFU0MgICAgPSAyMTU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9TRVFVRU5DRV9OVU1CRVIgICAgID0gMjE2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfTkFNRSAgICAgICAgICAgICAgICA9IDIxNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0RBVEVfQ1JFQVRFRCAgICAgICAgPSAyMTg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9EQVRFX01PRElGSUVEICAgICAgID0gMjE5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfS0VZV09SRFMgICAgICAgICAgICA9IDIyMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1RIVU1CICAgICAgICAgICAgICAgPSAyMjE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gc0RldmljZVByb2plY3Rpb25NYXA7CisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNTdG9yYWdlUHJvamVjdGlvbk1hcDsKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gc09iamVjdFByb2plY3Rpb25NYXA7CisKKyAgICBzdGF0aWMgeworICAgICAgICBzRGV2aWNlUHJvamVjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgICAgc0RldmljZVByb2plY3Rpb25NYXAucHV0KE10cC5EZXZpY2UuX0lELCBuZXcgSW50ZWdlcihERVZJQ0VfUk9XX0lEKSk7CisgICAgICAgIHNEZXZpY2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuRGV2aWNlLk1BTlVGQUNUVVJFUiwgbmV3IEludGVnZXIoREVWSUNFX01BTlVGQUNUVVJFUikpOworICAgICAgICBzRGV2aWNlUHJvamVjdGlvbk1hcC5wdXQoTXRwLkRldmljZS5NT0RFTCwgbmV3IEludGVnZXIoREVWSUNFX01PREVMKSk7CisKKyAgICAgICAgc1N0b3JhZ2VQcm9qZWN0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgICAgICBzU3RvcmFnZVByb2plY3Rpb25NYXAucHV0KE10cC5TdG9yYWdlLl9JRCwgbmV3IEludGVnZXIoU1RPUkFHRV9ST1dfSUQpKTsKKyAgICAgICAgc1N0b3JhZ2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuU3RvcmFnZS5JREVOVElGSUVSLCBuZXcgSW50ZWdlcihTVE9SQUdFX0lERU5USUZJRVIpKTsKKyAgICAgICAgc1N0b3JhZ2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuU3RvcmFnZS5ERVNDUklQVElPTiwgbmV3IEludGVnZXIoU1RPUkFHRV9ERVNDUklQVElPTikpOworCisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5fSUQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9ST1dfSUQpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuU1RPUkFHRV9JRCwgbmV3IEludGVnZXIoT0JKRUNUX1NUT1JBR0VfSUQpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuRk9STUFULCBuZXcgSW50ZWdlcihPQkpFQ1RfRk9STUFUKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlBST1RFQ1RJT05fU1RBVFVTLCBuZXcgSW50ZWdlcihPQkpFQ1RfUFJPVEVDVElPTl9TVEFUVVMpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuU0laRSwgbmV3IEludGVnZXIoT0JKRUNUX1NJWkUpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuVEhVTUJfRk9STUFULCBuZXcgSW50ZWdlcihPQkpFQ1RfVEhVTUJfRk9STUFUKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlRIVU1CX1NJWkUsIG5ldyBJbnRlZ2VyKE9CSkVDVF9USFVNQl9TSVpFKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlRIVU1CX1dJRFRILCBuZXcgSW50ZWdlcihPQkpFQ1RfVEhVTUJfV0lEVEgpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuVEhVTUJfSEVJR0hULCBuZXcgSW50ZWdlcihPQkpFQ1RfVEhVTUJfSEVJR0hUKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LklNQUdFX1dJRFRILCBuZXcgSW50ZWdlcihPQkpFQ1RfSU1BR0VfV0lEVEgpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuSU1BR0VfSEVJR0hULCBuZXcgSW50ZWdlcihPQkpFQ1RfSU1BR0VfSEVJR0hUKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LklNQUdFX0RFUFRILCBuZXcgSW50ZWdlcihPQkpFQ1RfSU1BR0VfREVQVEgpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuUEFSRU5ULCBuZXcgSW50ZWdlcihPQkpFQ1RfUEFSRU5UKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LkFTU09DSUFUSU9OX1RZUEUsIG5ldyBJbnRlZ2VyKE9CSkVDVF9BU1NPQ0lBVElPTl9UWVBFKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LkFTU09DSUFUSU9OX0RFU0MsIG5ldyBJbnRlZ2VyKE9CSkVDVF9BU1NPQ0lBVElPTl9ERVNDKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlNFUVVFTkNFX05VTUJFUiwgbmV3IEludGVnZXIoT0JKRUNUX1NFUVVFTkNFX05VTUJFUikpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5OQU1FLCBuZXcgSW50ZWdlcihPQkpFQ1RfTkFNRSkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5EQVRFX0NSRUFURUQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9EQVRFX0NSRUFURUQpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuREFURV9NT0RJRklFRCwgbmV3IEludGVnZXIoT0JKRUNUX0RBVEVfTU9ESUZJRUQpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuS0VZV09SRFMsIG5ldyBJbnRlZ2VyKE9CSkVDVF9LRVlXT1JEUykpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5USFVNQiwgbmV3IEludGVnZXIoT0JKRUNUX1RIVU1CKSk7CisKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuTkFNRSwgbmV3IEludGVnZXIoT0JKRUNUX05BTUUpKTsKKyAgICB9CisKKyAgICAvLyB1c2VkIGJ5IHRoZSBKTkkgY29kZQorICAgIHByaXZhdGUgaW50IG1OYXRpdmVDb250ZXh0OworCisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc2V0dXAoTXRwQ2xpZW50IGNsaWVudCwgaW50IHF1ZXJ5VHlwZSwKKyAgICAgICAgICAgIGludCBkZXZpY2VJRCwgaW50IHN0b3JhZ2VJRCwgaW50IG9iamVjdElELCBpbnRbXSBjb2x1bW5zKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX3dhaXRfZm9yX2V2ZW50KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9maWxsX3dpbmRvdyhDdXJzb3JXaW5kb3cgd2luZG93LCBpbnQgc3RhcnRQb3MpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cERhdGFiYXNlLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwRGF0YWJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzgzMjZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cERhdGFiYXNlLmphdmEKQEAgLTAsMCArMSw0OTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuQXVkaW87CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLk1lZGlhQ29sdW1uczsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuTXRwT2JqZWN0czsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk10cDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcHVibGljIGNsYXNzIE10cERhdGFiYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTXRwRGF0YWJhc2UiOworCisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgZmluYWwgSUNvbnRlbnRQcm92aWRlciBtTWVkaWFQcm92aWRlcjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVm9sdW1lTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFVyaSBtT2JqZWN0c1VyaTsKKworICAgIC8vIHRydWUgaWYgdGhlIGRhdGFiYXNlIGhhcyBiZWVuIG1vZGlmaWVkIGluIHRoZSBjdXJyZW50IE1UUCBzZXNzaW9uCisgICAgcHJpdmF0ZSBib29sZWFuIG1EYXRhYmFzZU1vZGlmaWVkOworCisgICAgLy8gRklYTUUgLSB0aGlzIHNob3VsZCBiZSBwYXNzZWQgaW4gdmlhIHRoZSBjb25zdHJ1Y3RvcgorICAgIHByaXZhdGUgZmluYWwgaW50IG1TdG9yYWdlSUQgPSAweDAwMDEwMDAxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSURfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuX0lELCAvLyAwCisgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQQVRIX1NJWkVfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuX0lELCAvLyAwCisgICAgICAgICAgICBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuREFUQSwgLy8gMQorICAgICAgICAgICAgTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLlNJWkUsIC8vIDIKKyAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE9CSkVDVF9JTkZPX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLl9JRCwgLy8gMAorICAgICAgICAgICAgTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLkRBVEEsIC8vIDEKKyAgICAgICAgICAgIE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5GT1JNQVQsIC8vIDIKKyAgICAgICAgICAgIE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5QQVJFTlQsIC8vIDMKKyAgICAgICAgICAgIE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5TSVpFLCAvLyA0CisgICAgICAgICAgICBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuREFURV9NT0RJRklFRCwgLy8gNQorICAgIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1dIRVJFID0gTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLl9JRCArICI9PyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfV0hFUkUgPSBNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuREFUQSArICI9PyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9XSEVSRSA9IE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5QQVJFTlQgKyAiPT8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfRk9STUFUX1dIRVJFID0gUEFSRU5UX1dIRVJFICsgIiBBTkQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5GT1JNQVQgKyAiPT8iOworCisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNjYW5uZXIgbU1lZGlhU2Nhbm5lcjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgibWVkaWFfam5pIik7CisgICAgfQorCisgICAgcHVibGljIE10cERhdGFiYXNlKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHZvbHVtZU5hbWUpIHsKKyAgICAgICAgbmF0aXZlX3NldHVwKCk7CisKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtTWVkaWFQcm92aWRlciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkuYWNxdWlyZVByb3ZpZGVyKCJtZWRpYSIpOworICAgICAgICBtVm9sdW1lTmFtZSA9IHZvbHVtZU5hbWU7CisgICAgICAgIG1PYmplY3RzVXJpID0gTXRwT2JqZWN0cy5nZXRDb250ZW50VXJpKHZvbHVtZU5hbWUpOworICAgICAgICBtTWVkaWFTY2FubmVyID0gbmV3IE1lZGlhU2Nhbm5lcihjb250ZXh0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmF0aXZlX2ZpbmFsaXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgYmVnaW5TZW5kT2JqZWN0KFN0cmluZyBwYXRoLCBpbnQgZm9ybWF0LCBpbnQgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdG9yYWdlLCBsb25nIHNpemUsIGxvbmcgbW9kaWZpZWQpIHsKKyAgICAgICAgbURhdGFiYXNlTW9kaWZpZWQgPSB0cnVlOworICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIHZhbHVlcy5wdXQoTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLkRBVEEsIHBhdGgpOworICAgICAgICB2YWx1ZXMucHV0KE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5GT1JNQVQsIGZvcm1hdCk7CisgICAgICAgIHZhbHVlcy5wdXQoTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLlBBUkVOVCwgcGFyZW50KTsKKyAgICAgICAgLy8gc3RvcmFnZSBpcyBpZ25vcmVkIGZvciBub3cKKyAgICAgICAgdmFsdWVzLnB1dChNdHBPYmplY3RzLk9iamVjdENvbHVtbnMuU0laRSwgc2l6ZSk7CisgICAgICAgIHZhbHVlcy5wdXQoTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLkRBVEVfTU9ESUZJRUQsIG1vZGlmaWVkKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVXJpIHVyaSA9IG1NZWRpYVByb3ZpZGVyLmluc2VydChtT2JqZWN0c1VyaSwgdmFsdWVzKTsKKyAgICAgICAgICAgIGlmICh1cmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHVyaS5nZXRQYXRoU2VnbWVudHMoKS5nZXQoMikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gYmVnaW5TZW5kT2JqZWN0IiwgZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5kU2VuZE9iamVjdChTdHJpbmcgcGF0aCwgaW50IGhhbmRsZSwgaW50IGZvcm1hdCwgYm9vbGVhbiBzdWNjZWVkZWQpIHsKKyAgICAgICAgaWYgKHN1Y2NlZWRlZCkgeworICAgICAgICAgICAgLy8gaGFuZGxlIGFic3RyYWN0IHBsYXlsaXN0cyBzZXBhcmF0ZWx5CisgICAgICAgICAgICAvLyB0aGV5IGRvIG5vdCBleGlzdCBpbiB0aGUgZmlsZSBzeXN0ZW0gc28gZG9uJ3QgdXNlIHRoZSBtZWRpYSBzY2FubmVyIGhlcmUKKyAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gTXRwQ29uc3RhbnRzLkZPUk1BVF9BQlNUUkFDVF9BVl9QTEFZTElTVCkgeworICAgICAgICAgICAgICAgIC8vIFN0cmlwIFdpbmRvd3MgTWVkaWEgUGxheWVyIGZpbGUgZXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoIi5wbGEiKSkgeworICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGV4dHJhY3QgbmFtZSBmcm9tIHBhdGgKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhdGg7CisgICAgICAgICAgICAgICAgaW50IGxhc3RTbGFzaCA9IG5hbWUubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGxhc3RTbGFzaCArIDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoMSk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChBdWRpby5QbGF5bGlzdHMuREFUQSwgcGF0aCk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChBdWRpby5QbGF5bGlzdHMuTkFNRSwgbmFtZSk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChNZWRpYUNvbHVtbnMuTUVESUFfU0NBTk5FUl9ORVdfT0JKRUNUX0lELCBoYW5kbGUpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFVyaSB1cmkgPSBtTWVkaWFQcm92aWRlci5pbnNlcnQoQXVkaW8uUGxheWxpc3RzLkVYVEVSTkFMX0NPTlRFTlRfVVJJLCB2YWx1ZXMpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBlbmRTZW5kT2JqZWN0IiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBVcmkgdXJpID0gbU1lZGlhU2Nhbm5lci5zY2FuTXRwRmlsZShwYXRoLCBtVm9sdW1lTmFtZSwgaGFuZGxlLCBmb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVsZXRlRmlsZShoYW5kbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnRbXSBnZXRPYmplY3RMaXN0KGludCBzdG9yYWdlSUQsIGludCBmb3JtYXQsIGludCBwYXJlbnQpIHsKKyAgICAgICAgLy8gd2UgY2FuIGlnbm9yZSBzdG9yYWdlSUQgdW50aWwgd2Ugc3VwcG9ydCBtdWx0aXBsZSBzdG9yYWdlcworICAgICAgICBMb2cuZChUQUcsICJnZXRPYmplY3RMaXN0IHBhcmVudDogIiArIHBhcmVudCk7CisgICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gMCkgeworICAgICAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwgSURfUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJFTlRfRk9STUFUX1dIRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEludGVnZXIudG9TdHJpbmcocGFyZW50KSwgSW50ZWdlci50b1N0cmluZyhmb3JtYXQpIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIElEX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSRU5UX1dIRVJFLCBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKHBhcmVudCkgfSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibnVsbCBjdXJzb3IiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBjb3VudCA9IGMuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnRbXSByZXN1bHQgPSBuZXcgaW50W2NvdW50XTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYy5tb3ZlVG9OZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IGMuZ2V0SW50KDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZXR1cm5pbmcgIiArIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBnZXRPYmplY3RMaXN0IiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldE51bU9iamVjdHMoaW50IHN0b3JhZ2VJRCwgaW50IGZvcm1hdCwgaW50IHBhcmVudCkgeworICAgICAgICAvLyB3ZSBjYW4gaWdub3JlIHN0b3JhZ2VJRCB1bnRpbCB3ZSBzdXBwb3J0IG11bHRpcGxlIHN0b3JhZ2VzCisgICAgICAgIExvZy5kKFRBRywgImdldE9iamVjdExpc3QgcGFyZW50OiAiICsgcGFyZW50KTsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1PYmplY3RzVXJpLCBJRF9QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkVOVF9GT1JNQVRfV0hFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhwYXJlbnQpLCBJbnRlZ2VyLnRvU3RyaW5nKGZvcm1hdCkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwgSURfUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJFTlRfV0hFUkUsIG5ldyBTdHJpbmdbXSB7IEludGVnZXIudG9TdHJpbmcocGFyZW50KSB9LCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYy5nZXRDb3VudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGdldE51bU9iamVjdHMiLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHByaXZhdGUgaW50W10gZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzKCkgeworICAgICAgICByZXR1cm4gbmV3IGludFtdIHsKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfQVNTT0NJQVRJT04sCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX01QMywKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfTVBFRywKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfRVhJRl9KUEVHLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9USUZGX0VQLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9HSUYsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX0pGSUYsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX1BORywKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfVElGRiwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfV01BLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9PR0csCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX0FBQywKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfTVA0X0NPTlRBSU5FUiwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfTVAyLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF8zR1BfQ09OVEFJTkVSLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9BQlNUUkFDVF9BVl9QTEFZTElTVCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfV1BMX1BMQVlMSVNULAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9NM1VfUExBWUxJU1QsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX1BMU19QTEFZTElTVCwKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludFtdIGdldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzKCkgeworICAgICAgICAvLyBubyBjYXB0dXJlIGZvcm1hdHMgeWV0CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgaW50W10gZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyhpbnQgaGFuZGxlKSB7CisgICAgICAgIHJldHVybiBuZXcgaW50W10geworICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX1NUT1JBR0VfSUQsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9PQkpFQ1RfU0laRSwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX1BBUkVOVF9PQkpFQ1QsCisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnRbXSBnZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzKCkgeworICAgICAgICAvLyBubyBkZXZpY2UgcHJvcGVydGllcyB5ZXQKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0T2JqZWN0UHJvcGVydHkoaW50IGhhbmRsZSwgaW50IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdbXSBvdXRJbnRWYWx1ZSwgY2hhcltdIG91dFN0cmluZ1ZhbHVlKSB7CisgICAgICAgIExvZy5kKFRBRywgImdldE9iamVjdFByb3BlcnR5OiAiICsgcHJvcGVydHkpOworICAgICAgICBTdHJpbmcgY29sdW1uID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBpc1N0cmluZyA9IGZhbHNlOworCisgICAgICAgIHN3aXRjaCAocHJvcGVydHkpIHsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX1NUT1JBR0VfSUQ6CisgICAgICAgICAgICAgICAgb3V0SW50VmFsdWVbMF0gPSBtU3RvcmFnZUlEOworICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5QUk9QRVJUWV9PQkpFQ1RfRk9STUFUOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5GT1JNQVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5QUk9QRVJUWV9QUk9URUNUSU9OX1NUQVRVUzoKKyAgICAgICAgICAgICAgICAvLyBwcm90ZWN0aW9uIHN0YXR1cyBpcyBhbHdheXMgMAorICAgICAgICAgICAgICAgIG91dEludFZhbHVlWzBdID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09LOworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX1NJWkU6CisgICAgICAgICAgICAgICAgY29sdW1uID0gTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLlNJWkU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5EQVRBOworICAgICAgICAgICAgICAgIGlzU3RyaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0RBVEVfTU9ESUZJRUQ6CisgICAgICAgICAgICAgICAgY29sdW1uID0gTXRwT2JqZWN0cy5PYmplY3RDb2x1bW5zLkRBVEVfTU9ESUZJRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5QUk9QRVJUWV9QQVJFTlRfT0JKRUNUOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5QQVJFTlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5QUk9QRVJUWV9QRVJTSVNURU5UX1VJRDoKKyAgICAgICAgICAgICAgICAvLyBQVUlEIGlzIGNvbmNhdGVuYXRpb24gb2Ygc3RvcmFnZUlEIGFuZCBvYmplY3QgaGFuZGxlCisgICAgICAgICAgICAgICAgbG9uZyBwdWlkID0gbVN0b3JhZ2VJRDsKKyAgICAgICAgICAgICAgICBwdWlkIDw8PSAzMjsKKyAgICAgICAgICAgICAgICBwdWlkICs9IGhhbmRsZTsKKyAgICAgICAgICAgICAgICBvdXRJbnRWYWx1ZVswXSA9IHB1aWQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9PQkpFQ1RfUFJPUF9OT1RfU1VQUE9SVEVEOworICAgICAgICB9CisKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gZm9yIG5vdyB3ZSBhcmUgb25seSByZWFkaW5nIHByb3BlcnRpZXMgZnJvbSB0aGUgIm9iamVjdHMiIHRhYmxlCisgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyBbXSB7IE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5fSUQsIGNvbHVtbiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX1dIRVJFLCBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKGhhbmRsZSkgfSwgbnVsbCk7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsICYmIGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGMuZ2V0U3RyaW5nKDEpOworICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSAwOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCBuYW1lIGZyb20gZnVsbCBwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdFNsYXNoID0gdmFsdWUubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2xhc2ggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gbGFzdFNsYXNoICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgZW5kID0gdmFsdWUubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmQgLSBzdGFydCA+IDI1NSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gc3RhcnQgKyAyNTU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdmFsdWUuZ2V0Q2hhcnMoc3RhcnQsIGVuZCwgb3V0U3RyaW5nVmFsdWUsIDApOworICAgICAgICAgICAgICAgICAgICBvdXRTdHJpbmdWYWx1ZVtlbmQgLSBzdGFydF0gPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dEludFZhbHVlWzBdID0gYy5nZXRMb25nKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09LOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBxdWVyeSBmYWlsZWQgaWYgd2UgZ2V0IGhlcmUKKyAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGdldE9iamVjdEluZm8oaW50IGhhbmRsZSwgaW50W10gb3V0U3RvcmFnZUZvcm1hdFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBvdXROYW1lLCBsb25nW10gb3V0U2l6ZU1vZGlmaWVkKSB7CisgICAgICAgIExvZy5kKFRBRywgImdldE9iamVjdEluZm86ICIgKyBoYW5kbGUpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIE9CSkVDVF9JTkZPX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURfV0hFUkUsIG5ldyBTdHJpbmdbXSB7ICBJbnRlZ2VyLnRvU3RyaW5nKGhhbmRsZSkgfSwgbnVsbCk7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsICYmIGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgb3V0U3RvcmFnZUZvcm1hdFBhcmVudFswXSA9IG1TdG9yYWdlSUQ7CisgICAgICAgICAgICAgICAgb3V0U3RvcmFnZUZvcm1hdFBhcmVudFsxXSA9IGMuZ2V0SW50KDIpOworICAgICAgICAgICAgICAgIG91dFN0b3JhZ2VGb3JtYXRQYXJlbnRbMl0gPSBjLmdldEludCgzKTsKKworICAgICAgICAgICAgICAgIC8vIGV4dHJhY3QgbmFtZSBmcm9tIHBhdGgKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGMuZ2V0U3RyaW5nKDEpOworICAgICAgICAgICAgICAgIGludCBsYXN0U2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gKGxhc3RTbGFzaCA+PSAwID8gbGFzdFNsYXNoICsgMSA6IDApOworICAgICAgICAgICAgICAgIGludCBlbmQgPSBwYXRoLmxlbmd0aCgpOworICAgICAgICAgICAgICAgIGlmIChlbmQgLSBzdGFydCA+IDI1NSkgeworICAgICAgICAgICAgICAgICAgICBlbmQgPSBzdGFydCArIDI1NTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGF0aC5nZXRDaGFycyhzdGFydCwgZW5kLCBvdXROYW1lLCAwKTsKKyAgICAgICAgICAgICAgICBvdXROYW1lW2VuZCAtIHN0YXJ0XSA9IDA7CisKKyAgICAgICAgICAgICAgICBvdXRTaXplTW9kaWZpZWRbMF0gPSBjLmdldExvbmcoNCk7CisgICAgICAgICAgICAgICAgb3V0U2l6ZU1vZGlmaWVkWzFdID0gYy5nZXRMb25nKDUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGdldE9iamVjdFByb3BlcnR5IiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRPYmplY3RGaWxlUGF0aChpbnQgaGFuZGxlLCBjaGFyW10gb3V0RmlsZVBhdGgsIGxvbmdbXSBvdXRGaWxlTGVuZ3RoKSB7CisgICAgICAgIExvZy5kKFRBRywgImdldE9iamVjdEZpbGVQYXRoOiAiICsgaGFuZGxlKTsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1PYmplY3RzVXJpLCBQQVRIX1NJWkVfUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9XSEVSRSwgbmV3IFN0cmluZ1tdIHsgIEludGVnZXIudG9TdHJpbmcoaGFuZGxlKSB9LCBudWxsKTsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGMuZ2V0U3RyaW5nKDEpOworICAgICAgICAgICAgICAgIHBhdGguZ2V0Q2hhcnMoMCwgcGF0aC5sZW5ndGgoKSwgb3V0RmlsZVBhdGgsIDApOworICAgICAgICAgICAgICAgIG91dEZpbGVQYXRoW3BhdGgubGVuZ3RoKCldID0gMDsKKyAgICAgICAgICAgICAgICBvdXRGaWxlTGVuZ3RoWzBdID0gYy5nZXRMb25nKDIpOworICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGdldE9iamVjdEZpbGVQYXRoIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZGVsZXRlRmlsZShpbnQgaGFuZGxlKSB7CisgICAgICAgIExvZy5kKFRBRywgImRlbGV0ZUZpbGU6ICIgKyBoYW5kbGUpOworICAgICAgICBtRGF0YWJhc2VNb2RpZmllZCA9IHRydWU7CisgICAgICAgIFVyaSB1cmkgPSBNdHBPYmplY3RzLmdldENvbnRlbnRVcmkobVZvbHVtZU5hbWUsIGhhbmRsZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobU1lZGlhUHJvdmlkZXIuZGVsZXRlKHVyaSwgbnVsbCwgbnVsbCkgPT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGRlbGV0ZUZpbGUiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50W10gZ2V0T2JqZWN0UmVmZXJlbmNlcyhpbnQgaGFuZGxlKSB7CisgICAgICAgIExvZy5kKFRBRywgImdldE9iamVjdFJlZmVyZW5jZXMgZm9yOiAiICsgaGFuZGxlKTsKKyAgICAgICAgVXJpIHVyaSA9IE10cE9iamVjdHMuZ2V0UmVmZXJlbmNlc1VyaShtVm9sdW1lTmFtZSwgaGFuZGxlKTsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KHVyaSwgSURfUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgY291bnQgPSBjLmdldENvdW50KCk7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFtjb3VudF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGMubW92ZVRvTmV4dCgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBjLmdldEludCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBnZXRPYmplY3RMaXN0IiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgaW50IHNldE9iamVjdFJlZmVyZW5jZXMoaW50IGhhbmRsZSwgaW50W10gcmVmZXJlbmNlcykgeworICAgICAgICBtRGF0YWJhc2VNb2RpZmllZCA9IHRydWU7CisgICAgICAgIFVyaSB1cmkgPSBNdHBPYmplY3RzLmdldFJlZmVyZW5jZXNVcmkobVZvbHVtZU5hbWUsIGhhbmRsZSk7CisgICAgICAgIGludCBjb3VudCA9IHJlZmVyZW5jZXMubGVuZ3RoOworICAgICAgICBDb250ZW50VmFsdWVzW10gdmFsdWVzTGlzdCA9IG5ldyBDb250ZW50VmFsdWVzW2NvdW50XTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICB2YWx1ZXMucHV0KE10cE9iamVjdHMuT2JqZWN0Q29sdW1ucy5fSUQsIHJlZmVyZW5jZXNbaV0pOworICAgICAgICAgICAgdmFsdWVzTGlzdFtpXSA9IHZhbHVlczsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGNvdW50ID09IG1NZWRpYVByb3ZpZGVyLmJ1bGtJbnNlcnQodXJpLCB2YWx1ZXNMaXN0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gc2V0T2JqZWN0UmVmZXJlbmNlcyIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2Vzc2lvblN0YXJ0ZWQoKSB7CisgICAgICAgIExvZy5kKFRBRywgInNlc3Npb25TdGFydGVkIik7CisgICAgICAgIG1EYXRhYmFzZU1vZGlmaWVkID0gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlc3Npb25FbmRlZCgpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAic2Vzc2lvbkVuZGVkIik7CisgICAgICAgIGlmIChtRGF0YWJhc2VNb2RpZmllZCkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAic2VuZGluZyBBQ1RJT05fTVRQX1NFU1NJT05fRU5EIik7CisgICAgICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoTXRwLkFDVElPTl9NVFBfU0VTU0lPTl9FTkQpKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZU1vZGlmaWVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1c2VkIGJ5IHRoZSBKTkkgY29kZQorICAgIHByaXZhdGUgaW50IG1OYXRpdmVDb250ZXh0OworCisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc2V0dXAoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cFNlcnZlci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cFNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMTUyNzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwU2VydmVyLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogSmF2YSB3cmFwcGVyIGZvciBNVFAvUFRQIHN1cHBvcnQgYXMgVVNCIHJlc3BvbmRlci4KKyAqIHtAaGlkZX0KKyAqLworcHVibGljIGNsYXNzIE10cFNlcnZlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk10cFNlcnZlciI7CisKKyAgICBzdGF0aWMgeworICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIm1lZGlhX2puaSIpOworICAgIH0KKworICAgIHB1YmxpYyBNdHBTZXJ2ZXIoTXRwRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyBzdG9yYWdlUGF0aCkgeworICAgICAgICBuYXRpdmVfc2V0dXAoZGF0YWJhc2UsIHN0b3JhZ2VQYXRoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmF0aXZlX2ZpbmFsaXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIG5hdGl2ZV9zdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIG5hdGl2ZV9zdG9wKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VuZE9iamVjdEFkZGVkKGludCBoYW5kbGUpIHsKKyAgICAgICAgbmF0aXZlX3NlbmRfb2JqZWN0X2FkZGVkKGhhbmRsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VuZE9iamVjdFJlbW92ZWQoaW50IGhhbmRsZSkgeworICAgICAgICBuYXRpdmVfc2VuZF9vYmplY3RfcmVtb3ZlZChoYW5kbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFB0cE1vZGUoYm9vbGVhbiB1c2VQdHApIHsKKyAgICAgICAgbmF0aXZlX3NldF9wdHBfbW9kZSh1c2VQdHApOworICAgIH0KKworICAgIC8vIHVzZWQgYnkgdGhlIEpOSSBjb2RlCisgICAgcHJpdmF0ZSBpbnQgbU5hdGl2ZUNvbnRleHQ7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zZXR1cChNdHBEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHN0b3JhZ2VQYXRoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3N0YXJ0KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc3RvcCgpOworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NlbmRfb2JqZWN0X2FkZGVkKGludCBoYW5kbGUpOworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NlbmRfb2JqZWN0X3JlbW92ZWQoaW50IGhhbmRsZSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc2V0X3B0cF9tb2RlKGJvb2xlYW4gdXNlUHRwKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2puaS9BbmRyb2lkLm1rIGIvbWVkaWEvam5pL0FuZHJvaWQubWsKaW5kZXggNmVlYzIxNWEuLjY1MzUzMmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2puaS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2puaS9BbmRyb2lkLm1rCkBAIC0xMiw3ICsxMiwxMSBAQAogICAgIGFuZHJvaWRfbWVkaWFfTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAgXAogICAgIGFuZHJvaWRfbWVkaWFfUmVzYW1wbGVJbnB1dFN0cmVhbS5jcHAgXAogICAgIGFuZHJvaWRfbWVkaWFfTWVkaWFQcm9maWxlcy5jcHAgXAotICAgIGFuZHJvaWRfbWVkaWFfQW1ySW5wdXRTdHJlYW0uY3BwCisgICAgYW5kcm9pZF9tZWRpYV9BbXJJbnB1dFN0cmVhbS5jcHAgXAorCWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50LmNwcCBcCisJYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IuY3BwIFwKKwlhbmRyb2lkX21lZGlhX010cERhdGFiYXNlLmNwcCBcCisJYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIuY3BwIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliYW5kcm9pZF9ydW50aW1lIFwKQEAgLTI1LDcgKzI5LDggQEAKICAgICBsaWJjdXRpbHMgXAogICAgIGxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudCBcCiAgICAgbGlic3RhZ2VmcmlnaHQgXAotICAgIGxpYmNhbWVyYV9jbGllbnQKKyAgICBsaWJjYW1lcmFfY2xpZW50IFwKKwlsaWJzcWxpdGUKIAogaWZuZXEgKCQoQlVJTERfV0lUSE9VVF9QViksdHJ1ZSkKIApAQCAtMzUsNyArNDAsOSBAQAogICAgIExPQ0FMX0NGTEFHUyArPSAtRE5PX09QRU5DT1JFCiBlbmRpZgogCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9CitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJtdHAgbGlidXNiaG9zdAorZW5kaWYKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgZXh0ZXJuYWwvdHJlbW9yL1RyZW1vciBcCkBAIC00NCw2ICs1MSw3IEBACiAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjIFwKICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbiBcCiAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZSBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL210cCBcCiAgICAgJChQVl9JTkNMVURFUykgXAogICAgICQoSk5JX0hfSU5DTFVERSkgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBjb3JlY2cgZ3JhcGhpY3MpCmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAKaW5kZXggNDc0YTE3NC4uNjcxMGRiMCAxMDA2NDQKLS0tIGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUGxheWVyLmNwcApAQCAtNzg4LDYgKzc4OCwxMCBAQAogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX01lZGlhU2Nhbm5lcihKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfUmVzYW1wbGVJbnB1dFN0cmVhbShKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTWVkaWFQcm9maWxlcyhKTklFbnYgKmVudik7CitleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50KEpOSUVudiAqZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IoSk5JRW52ICplbnYpOworZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cERhdGFiYXNlKEpOSUVudiAqZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIoSk5JRW52ICplbnYpOwogCiAjaWZuZGVmIE5PX09QRU5DT1JFCiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfQW1ySW5wdXRTdHJlYW0oSk5JRW52ICplbnYpOwpAQCAtODQxLDYgKzg0NSwyNiBAQAogICAgICAgICBnb3RvIGJhaWw7CiAgICAgfQogCisgICAgaWYgKHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50KGVudikgPCAwKSB7CisgICAgICAgIExPR0UoIkVSUk9SOiBNdHBDbGllbnQgbmF0aXZlIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cEN1cnNvcihlbnYpIDwgMCkgeworICAgICAgICBMT0dFKCJFUlJPUjogTXRwQ3Vyc29yIG5hdGl2ZSByZWdpc3RyYXRpb24gZmFpbGVkIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAocmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZShlbnYpIDwgMCkgeworICAgICAgICBMT0dFKCJFUlJPUjogTXRwRGF0YWJhc2UgbmF0aXZlIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cFNlcnZlcihlbnYpIDwgMCkgeworICAgICAgICBMT0dFKCJFUlJPUjogTXRwU2VydmVyIG5hdGl2ZSByZWdpc3RyYXRpb24gZmFpbGVkIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKICAgICAvKiBzdWNjZXNzIC0tIHJldHVybiB2YWxpZCB2ZXJzaW9uIG51bWJlciAqLwogICAgIHJlc3VsdCA9IEpOSV9WRVJTSU9OXzFfNDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlci5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVJlY29yZGVyLmNwcAppbmRleCBmNjliOGFkLi4yNGZlMmRiIDEwMDY0NAotLS0gYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVJlY29yZGVyLmNwcApAQCAtMjYwLDYgKzI2MCwyMCBAQAogfQogCiBzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NZWRpYVJlY29yZGVyX3NldE91dHB1dEZpbGVBdXhGRChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqb2JqZWN0IGZpbGVEZXNjcmlwdG9yKQoreworICAgIExPR1YoInNldE91dHB1dEZpbGUiKTsKKyAgICBpZiAoZmlsZURlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwgTlVMTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50IGZkID0gZ2V0UGFyY2VsRmlsZURlc2NyaXB0b3JGRChlbnYsIGZpbGVEZXNjcmlwdG9yKTsKKyAgICBzcDxNZWRpYVJlY29yZGVyPiBtciA9IGdldE1lZGlhUmVjb3JkZXIoZW52LCB0aGl6KTsKKyAgICBzdGF0dXNfdCBvcFN0YXR1cyA9IG1yLT5zZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGZkKTsKKyAgICBwcm9jZXNzX21lZGlhX3JlY29yZGVyX2NhbGwoZW52LCBvcFN0YXR1cywgImphdmEvaW8vSU9FeGNlcHRpb24iLCAic2V0T3V0cHV0RmlsZSBmYWlsZWQuIik7Cit9CisKK3N0YXRpYyB2b2lkCiBhbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXJfc2V0VmlkZW9TaXplKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KQogewogICAgIExPR1YoInNldFZpZGVvU2l6ZSglZCwgJWQpIiwgd2lkdGgsIGhlaWdodCk7CkBAIC00NjYsNiArNDgwLDcgQEAKICAgICB7InNldEF1ZGlvRW5jb2RlciIsICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlcl9zZXRBdWRpb0VuY29kZXJ9LAogICAgIHsic2V0UGFyYW1ldGVyIiwgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVJlY29yZGVyX3NldFBhcmFtZXRlcn0sCiAgICAgeyJfc2V0T3V0cHV0RmlsZSIsICAgICAgICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7SkopViIsICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXJfc2V0T3V0cHV0RmlsZUZEfSwKKyAgICB7Il9zZXRPdXRwdXRGaWxlQXV4IiwgICAgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjspViIsICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlcl9zZXRPdXRwdXRGaWxlQXV4RkR9LAogICAgIHsic2V0VmlkZW9TaXplIiwgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVJlY29yZGVyX3NldFZpZGVvU2l6ZX0sCiAgICAgeyJzZXRWaWRlb0ZyYW1lUmF0ZSIsICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXJfc2V0VmlkZW9GcmFtZVJhdGV9LAogICAgIHsic2V0TWF4RHVyYXRpb24iLCAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVJlY29yZGVyX3NldE1heER1cmF0aW9ufSwKZGlmZiAtLWdpdCBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NzQwYmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQuY3BwCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBDbGllbnRKTkkiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJKTklIZWxwLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisKKyNpbmNsdWRlICJNdHBDbGllbnQuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2UuaCIKKyNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2RldmljZUFkZGVkOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZGV2aWNlUmVtb3ZlZDsKK3N0YXRpYyBqZmllbGRJRCBmaWVsZF9jb250ZXh0OworCitzdGF0aWMgc3RydWN0IGZpbGVfZGVzY3JpcHRvcl9vZmZzZXRzX3QKK3sKKyAgICBqY2xhc3MgbUNsYXNzOworICAgIGptZXRob2RJRCBtQ29uc3RydWN0b3I7CisgICAgamZpZWxkSUQgbURlc2NyaXB0b3I7Cit9IGdGaWxlRGVzY3JpcHRvck9mZnNldHM7CisKK3N0YXRpYyBzdHJ1Y3QgcGFyY2VsX2ZpbGVfZGVzY3JpcHRvcl9vZmZzZXRzX3QKK3sKKyAgICBqY2xhc3MgbUNsYXNzOworICAgIGptZXRob2RJRCBtQ29uc3RydWN0b3I7Cit9IGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHM7CisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKworc3RhdGljIHZvaWQgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhKTklFbnYqIGVudiwgY29uc3QgY2hhciogbWV0aG9kTmFtZSkgeworICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgTE9HRSgiQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgY2FsbGJhY2sgJyVzJy4iLCBtZXRob2ROYW1lKTsKKyAgICAgICAgTE9HRV9FWChlbnYpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgfQorfQorCitjbGFzcyBNeUNsaWVudCA6IHB1YmxpYyBNdHBDbGllbnQgeworcHJpdmF0ZToKKyAgICB2aXJ0dWFsIHZvaWQgICAgZGV2aWNlQWRkZWQoTXRwRGV2aWNlICpkZXZpY2UpOworICAgIHZpcnR1YWwgdm9pZCAgICBkZXZpY2VSZW1vdmVkKE10cERldmljZSAqZGV2aWNlKTsKKworICAgIGpvYmplY3QgICAgICAgICBtQ2xpZW50OworICAgIE10cERldmljZSogICAgICBtRXZlbnREZXZpY2U7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgTXlDbGllbnQoSk5JRW52ICplbnYsIGpvYmplY3QgY2xpZW50KTsKKyAgICB2b2lkICAgICAgICAgICAgY2xlYW51cChKTklFbnYgKmVudik7Cit9OworCitNdHBDbGllbnQqIGdldF9jbGllbnRfZnJvbV9vYmplY3QoSk5JRW52KiBlbnYsIGpvYmplY3QgamF2YUNsaWVudCkKK3sKKyAgICByZXR1cm4gKE10cENsaWVudCopZW52LT5HZXRJbnRGaWVsZChqYXZhQ2xpZW50LCBmaWVsZF9jb250ZXh0KTsKK30KKworCitNeUNsaWVudDo6TXlDbGllbnQoSk5JRW52ICplbnYsIGpvYmplY3QgY2xpZW50KQorICAgIDogICBtQ2xpZW50KGVudi0+TmV3R2xvYmFsUmVmKGNsaWVudCkpCit7Cit9CisKK3ZvaWQgTXlDbGllbnQ6OmNsZWFudXAoSk5JRW52ICplbnYpIHsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQ2xpZW50KTsKK30KKwordm9pZCBNeUNsaWVudDo6ZGV2aWNlQWRkZWQoTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gZGV2aWNlLT5nZXREZXZpY2VOYW1lKCk7CisgICAgTE9HRCgiTXlDbGllbnQ6OmRldmljZUFkZGVkICVzXG4iLCBuYW1lKTsKKworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUNsaWVudCwgbWV0aG9kX2RldmljZUFkZGVkLCBkZXZpY2UtPmdldElEKCkpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7Cit9CisKK3ZvaWQgTXlDbGllbnQ6OmRldmljZVJlbW92ZWQoTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gZGV2aWNlLT5nZXREZXZpY2VOYW1lKCk7CisgICAgTE9HRCgiTXlDbGllbnQ6OmRldmljZVJlbW92ZWQgJXNcbiIsIG5hbWUpOworCisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQ2xpZW50LCBtZXRob2RfZGV2aWNlUmVtb3ZlZCwgZGV2aWNlLT5nZXRJRCgpKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworfQorCisjZW5kaWYgLy8gSEFWRV9BTkRST0lEX09TCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3NldHVwKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic2V0dXBcbiIpOworICAgIE15Q2xpZW50KiBjbGllbnQgPSBuZXcgTXlDbGllbnQoZW52LCB0aGl6KTsKKyAgICBjbGllbnQtPnN0YXJ0KCk7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAoaW50KWNsaWVudCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2ZpbmFsaXplKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgiZmluYWxpemVcbiIpOworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGNsaWVudC0+Y2xlYW51cChlbnYpOworICAgIGRlbGV0ZSBjbGllbnQ7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAwKTsKKyNlbmRpZgorfQorCitzdGF0aWMgamJvb2xlYW4KK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3N0YXJ0KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic3RhcnRcbiIpOworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIHJldHVybiBjbGllbnQtPnN0YXJ0KCk7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfc3RvcChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInN0b3BcbiIpOworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGNsaWVudC0+c3RvcCgpOworI2VuZGlmCit9CisKK3N0YXRpYyBqYm9vbGVhbgorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZGVsZXRlX29iamVjdChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LAorICAgICAgICBqaW50IGRldmljZV9pZCwgamludCBvYmplY3RfaWQpCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBjbGllbnQtPmdldERldmljZShkZXZpY2VfaWQpOworICAgIGlmIChkZXZpY2UpCisgICAgICAgIHJldHVybiBkZXZpY2UtPmRlbGV0ZU9iamVjdChvYmplY3RfaWQpOworICAgIGVsc2UKKyAjZW5kaWYKKyAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBqaW50CithbmRyb2lkX21lZGlhX010cENsaWVudF9nZXRfcGFyZW50KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosCisgICAgICAgIGppbnQgZGV2aWNlX2lkLCBqaW50IG9iamVjdF9pZCkKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBNeUNsaWVudCAqY2xpZW50ID0gKE15Q2xpZW50ICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IGNsaWVudC0+Z2V0RGV2aWNlKGRldmljZV9pZCk7CisgICAgaWYgKGRldmljZSkKKyAgICAgICAgcmV0dXJuIGRldmljZS0+Z2V0UGFyZW50KG9iamVjdF9pZCk7CisgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGppbnQKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2dldF9zdG9yYWdlX2lkKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosCisgICAgICAgIGppbnQgZGV2aWNlX2lkLCBqaW50IG9iamVjdF9pZCkKK3sKKyAjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBjbGllbnQtPmdldERldmljZShkZXZpY2VfaWQpOworICAgIGlmIChkZXZpY2UpCisgICAgICAgIHJldHVybiBkZXZpY2UtPmdldFN0b3JhZ2VJRChvYmplY3RfaWQpOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBqb2JqZWN0CithbmRyb2lkX21lZGlhX010cENsaWVudF9vcGVuX2ZpbGUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwKKyAgICAgICAgamludCBkZXZpY2VfaWQsIGppbnQgb2JqZWN0X2lkKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIE10cERldmljZSogZGV2aWNlID0gY2xpZW50LT5nZXREZXZpY2UoZGV2aWNlX2lkKTsKKyAgICBpZiAoIWRldmljZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gZGV2aWNlLT5nZXRPYmplY3RJbmZvKG9iamVjdF9pZCk7CisgICAgaWYgKCFpbmZvKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbnQgb2JqZWN0X3NpemUgPSBpbmZvLT5tQ29tcHJlc3NlZFNpemU7CisgICAgZGVsZXRlIGluZm87CisgICAgaW50IGZkID0gZGV2aWNlLT5yZWFkT2JqZWN0KG9iamVjdF9pZCwgb2JqZWN0X3NpemUpOworICAgIGlmIChmZCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgam9iamVjdCBmaWxlRGVzY3JpcHRvciA9IGVudi0+TmV3T2JqZWN0KGdGaWxlRGVzY3JpcHRvck9mZnNldHMubUNsYXNzLAorICAgICAgICBnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3Rvcik7CisgICAgaWYgKGZpbGVEZXNjcmlwdG9yICE9IE5VTEwpIHsKKyAgICAgICAgZW52LT5TZXRJbnRGaWVsZChmaWxlRGVzY3JpcHRvciwgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tRGVzY3JpcHRvciwgZmQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZW52LT5OZXdPYmplY3QoZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ2xhc3MsCisgICAgICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yLCBmaWxlRGVzY3JpcHRvcik7CisjZW5kaWYKKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyJuYXRpdmVfc2V0dXAiLCAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9zZXR1cH0sCisgICAgeyJuYXRpdmVfZmluYWxpemUiLCAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9maW5hbGl6ZX0sCisgICAgeyJuYXRpdmVfc3RhcnQiLCAgICAgICAgICAgICIoKVoiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9zdGFydH0sCisgICAgeyJuYXRpdmVfc3RvcCIsICAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9zdG9wfSwKKyAgICB7Im5hdGl2ZV9kZWxldGVfb2JqZWN0IiwgICAiKElJKVoiLCAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2RlbGV0ZV9vYmplY3R9LAorICAgIHsibmF0aXZlX2dldF9wYXJlbnQiLCAgICAgICIoSUkpSSIsICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZ2V0X3BhcmVudH0sCisgICAgeyJuYXRpdmVfZ2V0X3N0b3JhZ2VfaWQiLCAgIihJSSlJIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9nZXRfc3RvcmFnZV9pZH0sCisgICAgeyJuYXRpdmVfb3Blbl9maWxlIiwgICAgICAgIihJSSlMYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvcjsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfb3Blbl9maWxlfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrQ2xhc3NQYXRoTmFtZSA9ICJhbmRyb2lkL21lZGlhL010cENsaWVudCI7CisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cENsaWVudChKTklFbnYgKmVudikKK3sKKyAgICBqY2xhc3MgY2xheno7CisKKyAgICBMT0dEKCJyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cENsaWVudFxuIik7CisKKyAgICBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL010cENsaWVudCIpOworICAgIGlmIChjbGF6eiA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZGV2aWNlQWRkZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZGV2aWNlQWRkZWQiLCAiKEkpViIpOworICAgIGlmIChtZXRob2RfZGV2aWNlQWRkZWQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGRldmljZUFkZGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2RldmljZVJlbW92ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZGV2aWNlUmVtb3ZlZCIsICIoSSlWIik7CisgICAgaWYgKG1ldGhvZF9kZXZpY2VSZW1vdmVkID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBkZXZpY2VSZW1vdmVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZmllbGRfY29udGV4dCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm1OYXRpdmVDb250ZXh0IiwgIkkiKTsKKyAgICBpZiAoZmllbGRfY29udGV4dCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgTXRwQ2xpZW50Lm1OYXRpdmVDb250ZXh0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImphdmEvaW8vRmlsZURlc2NyaXB0b3IiKTsKKyAgICBMT0dfRkFUQUxfSUYoY2xhenogPT0gTlVMTCwgIlVuYWJsZSB0byBmaW5kIGNsYXNzIGphdmEuaW8uRmlsZURlc2NyaXB0b3IiKTsKKyAgICBnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1DbGFzcyA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKGNsYXp6KTsKKyAgICBnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3RvciA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICI8aW5pdD4iLCAiKClWIik7CisgICAgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tRGVzY3JpcHRvciA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgImRlc2NyaXB0b3IiLCAiSSIpOworICAgIExPR19GQVRBTF9JRihnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1EZXNjcmlwdG9yID09IE5VTEwsCisgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBkZXNjcmlwdG9yIGZpZWxkIGluIGphdmEuaW8uRmlsZURlc2NyaXB0b3IiKTsKKworICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvciIpOworICAgIExPR19GQVRBTF9JRihjbGF6eiA9PSBOVUxMLCAiVW5hYmxlIHRvIGZpbmQgY2xhc3MgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIpOworICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYoY2xhenopOworICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIjxpbml0PiIsICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7KVYiKTsKKyAgICBMT0dfRkFUQUxfSUYoZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ29uc3RydWN0b3IgPT0gTlVMTCwKKyAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBmaW5kIGNvbnN0cnVjdG9yIGZvciBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIik7CisKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsCisgICAgICAgICAgICAgICAgImFuZHJvaWQvbWVkaWEvTXRwQ2xpZW50IiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IuY3BwIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjI4YjVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yLmNwcApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwQ3Vyc29ySk5JIgorI2luY2x1ZGUgInV0aWxzL0xvZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAiSk5JSGVscC5oIgorI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorI2luY2x1ZGUgImJpbmRlci9DdXJzb3JXaW5kb3cuaCIKKworI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cEN1cnNvci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgamZpZWxkSUQgZmllbGRfY29udGV4dDsKKworLy8gRnJvbSBhbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAKK010cENsaWVudCAqIGdldF9jbGllbnRfZnJvbV9vYmplY3QoSk5JRW52ICogZW52LCBqb2JqZWN0IGphdmFDbGllbnQpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBib29sIEV4Y2VwdGlvbkNoZWNrKHZvaWQqIGVudikKK3sKKyAgICByZXR1cm4gKChKTklFbnYgKillbnYpLT5FeGNlcHRpb25DaGVjaygpOworfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3Jfc2V0dXAoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgam9iamVjdCBqYXZhQ2xpZW50LAorICAgICAgICBqaW50IHF1ZXJ5VHlwZSwgamludCBkZXZpY2VJRCwgamludCBzdG9yYWdlSUQsIGppbnQgb2JqZWN0SUQsIGppbnRBcnJheSBqYXZhQ29sdW1ucykKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJhbmRyb2lkX21lZGlhX010cEN1cnNvcl9zZXR1cCBxdWVyeVR5cGU6ICVkIGRldmljZUlEOiAlZCBzdG9yYWdlSUQ6ICVkIG9iamVjdElEOiAlZFxuIiwKKyAgICAgICAgICAgICAgICBxdWVyeVR5cGUsIGRldmljZUlELCBzdG9yYWdlSUQsIG9iamVjdElEKTsKKworICAgIGludCogY29sdW1ucyA9IE5VTEw7CisgICAgaW50IGNvbHVtbkNvdW50ID0gMDsKKyAgICBpZiAoamF2YUNvbHVtbnMpIHsKKyAgICAgICAgY29sdW1ucyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhqYXZhQ29sdW1ucywgMCk7CisgICAgICAgIGNvbHVtbkNvdW50ID0gZW52LT5HZXRBcnJheUxlbmd0aChqYXZhQ29sdW1ucyk7CisgICAgfQorCisgICAgTXRwQ2xpZW50KiBjbGllbnQgPSBnZXRfY2xpZW50X2Zyb21fb2JqZWN0KGVudiwgamF2YUNsaWVudCk7CisgICAgTXRwQ3Vyc29yKiBjdXJzb3IgPSBuZXcgTXRwQ3Vyc29yKGNsaWVudCwgcXVlcnlUeXBlLAorICAgICAgICAgICAgZGV2aWNlSUQsIHN0b3JhZ2VJRCwgb2JqZWN0SUQsIGNvbHVtbkNvdW50LCBjb2x1bW5zKTsKKworICAgIGlmIChjb2x1bW5zKQorICAgICAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGphdmFDb2x1bW5zLCBjb2x1bW5zLCAwKTsKKyAgICBlbnYtPlNldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQsIChpbnQpY3Vyc29yKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3JfZmluYWxpemUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJmaW5hbGl6ZVxuIik7CisgICAgTXRwQ3Vyc29yICpjdXJzb3IgPSAoTXRwQ3Vyc29yICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBkZWxldGUgY3Vyc29yOworI2VuZGlmCit9CisKK3N0YXRpYyBqaW50CithbmRyb2lkX21lZGlhX010cEN1cnNvcl9maWxsX3dpbmRvdyhKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqb2JqZWN0IGphdmFXaW5kb3csIGppbnQgc3RhcnRQb3MpCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgQ3Vyc29yV2luZG93KiB3aW5kb3cgPSBnZXRfd2luZG93X2Zyb21fb2JqZWN0KGVudiwgamF2YVdpbmRvdyk7CisgICAgaWYgKCF3aW5kb3cpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBDdXJzb3JXaW5kb3ciKTsKKyAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgQ3Vyc29yV2luZG93Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBNdHBDdXJzb3IgKmN1cnNvciA9IChNdHBDdXJzb3IgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworCisgICAgcmV0dXJuIGN1cnNvci0+ZmlsbFdpbmRvdyh3aW5kb3csIHN0YXJ0UG9zKTsKKyNlbHNlCisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyJuYXRpdmVfc2V0dXAiLCAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvTXRwQ2xpZW50O0lJSUlbSSlWIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX3NldHVwfSwKKyAgICB7Im5hdGl2ZV9maW5hbGl6ZSIsICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX2ZpbmFsaXplfSwKKyAgICB7Im5hdGl2ZV9maWxsX3dpbmRvdyIsICAgICAgIihMYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3c7SSlJIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX2ZpbGxfd2luZG93fSwKKworfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yIjsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yKEpOSUVudiAqZW52KQoreworICAgIGpjbGFzcyBjbGF6ejsKKworICAgIExPR0QoInJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yXG4iKTsKKworICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yIik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBhbmRyb2lkL21lZGlhL010cEN1cnNvciIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZpZWxkX2NvbnRleHQgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosICJtTmF0aXZlQ29udGV4dCIsICJJIik7CisgICAgaWYgKGZpZWxkX2NvbnRleHQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIE10cEN1cnNvci5tTmF0aXZlQ29udGV4dCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LAorICAgICAgICAgICAgICAgICJhbmRyb2lkL21lZGlhL010cEN1cnNvciIsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2UuY3BwIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNDYyODcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZS5jcHAKQEAgLTAsMCArMSw3NDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cERhdGFiYXNlSk5JIgorI2luY2x1ZGUgInV0aWxzL0xvZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAiSk5JSGVscC5oIgorI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorCisjaW5jbHVkZSAiTXRwRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwUHJvcGVydHkuaCIKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorI2luY2x1ZGUgIm10cC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9iZWdpblNlbmRPYmplY3Q7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9lbmRTZW5kT2JqZWN0Oworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0T2JqZWN0TGlzdDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldE51bU9iamVjdHM7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHM7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0czsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXM7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0T2JqZWN0UHJvcGVydHk7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9zZXRPYmplY3RQcm9wZXJ0eTsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldE9iamVjdEluZm87CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRPYmplY3RGaWxlUGF0aDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2RlbGV0ZUZpbGU7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRPYmplY3RSZWZlcmVuY2VzOworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfc2V0T2JqZWN0UmVmZXJlbmNlczsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX3Nlc3Npb25TdGFydGVkOworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfc2Vzc2lvbkVuZGVkOworCitzdGF0aWMgamZpZWxkSUQgZmllbGRfY29udGV4dDsKKworTXRwRGF0YWJhc2UqIGdldE10cERhdGFiYXNlKEpOSUVudiAqZW52LCBqb2JqZWN0IGRhdGFiYXNlKSB7CisgICAgcmV0dXJuIChNdHBEYXRhYmFzZSAqKWVudi0+R2V0SW50RmllbGQoZGF0YWJhc2UsIGZpZWxkX2NvbnRleHQpOworfQorCisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIE15TXRwRGF0YWJhc2UgOiBwdWJsaWMgTXRwRGF0YWJhc2UgeworcHJpdmF0ZToKKyAgICBqb2JqZWN0ICAgICAgICAgbURhdGFiYXNlOworICAgIGppbnRBcnJheSAgICAgICBtSW50QnVmZmVyOworICAgIGpsb25nQXJyYXkgICAgICBtTG9uZ0J1ZmZlcjsKKyAgICBqY2hhckFycmF5ICAgICAgbVN0cmluZ0J1ZmZlcjsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXlNdHBEYXRhYmFzZShKTklFbnYgKmVudiwgam9iamVjdCBjbGllbnQpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgICAgICAgICAgfk15TXRwRGF0YWJhc2UoKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXAoSk5JRW52ICplbnYpOworCisgICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGUgICAgICAgICBiZWdpblNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBtb2RpZmllZCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGVuZFNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZWVkZWQpOworCisgICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RMaXN0KE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCk7CisKKyAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICAgICAgICAgIGdldE51bU9iamVjdHMoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCk7CisKKyAgICAvLyBjYWxsZWUgc2hvdWxkIGRlbGV0ZVtdIHRoZSByZXN1bHRzIGZyb20gdGhlc2UKKyAgICAvLyByZXN1bHRzIGNhbiBiZSBOVUxMCisgICAgdmlydHVhbCBNdHBPYmplY3RGb3JtYXRMaXN0KiAgICBnZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMoKTsKKyAgICB2aXJ0dWFsIE10cE9iamVjdEZvcm1hdExpc3QqICAgIGdldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzKCk7CisgICAgdmlydHVhbCBNdHBPYmplY3RQcm9wZXJ0eUxpc3QqICBnZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzKE10cE9iamVjdEZvcm1hdCBmb3JtYXQpOworICAgIHZpcnR1YWwgTXRwRGV2aWNlUHJvcGVydHlMaXN0KiAgZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcygpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RQcm9wZXJ0eVZhbHVlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBzZXRPYmplY3RQcm9wZXJ0eVZhbHVlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXREZXZpY2VQcm9wZXJ0eVZhbHVlKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBzZXREZXZpY2VQcm9wZXJ0eVZhbHVlKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICByZXNldERldmljZVByb3BlcnR5KE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KTsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RGaWxlUGF0aChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmcmIGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90JiBmaWxlTGVuZ3RoKTsKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGRlbGV0ZUZpbGUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb3BlcnR5SW5mbyhNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwgaW50JiB0eXBlKTsKKworICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlTGlzdCogICAgZ2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgc2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiByZWZlcmVuY2VzKTsKKworICAgIHZpcnR1YWwgTXRwUHJvcGVydHkqICAgICAgICAgICAgZ2V0T2JqZWN0UHJvcGVydHlEZXNjKE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0KTsKKworICAgIHZpcnR1YWwgTXRwUHJvcGVydHkqICAgICAgICAgICAgZ2V0RGV2aWNlUHJvcGVydHlEZXNjKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KTsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0YXJ0ZWQoKTsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbkVuZGVkKCk7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIG1ldGhvZE5hbWUpIHsKKyAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgICAgIExPR0UoIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGJ5IGNhbGxiYWNrICclcycuIiwgbWV0aG9kTmFtZSk7CisgICAgICAgIExPR0VfRVgoZW52KTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNeU10cERhdGFiYXNlOjpNeU10cERhdGFiYXNlKEpOSUVudiAqZW52LCBqb2JqZWN0IGNsaWVudCkKKyAgICA6ICAgbURhdGFiYXNlKGVudi0+TmV3R2xvYmFsUmVmKGNsaWVudCkpLAorICAgICAgICBtSW50QnVmZmVyKE5VTEwpLAorICAgICAgICBtTG9uZ0J1ZmZlcihOVUxMKSwKKyAgICAgICAgbVN0cmluZ0J1ZmZlcihOVUxMKQoreworICAgIGppbnRBcnJheSBpbnRBcnJheTsKKyAgICBqbG9uZ0FycmF5IGxvbmdBcnJheTsKKyAgICBqY2hhckFycmF5IGNoYXJBcnJheTsKKworICAgIC8vIGNyZWF0ZSBidWZmZXJzIGZvciBvdXQgYXJndW1lbnRzCisgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byBiZSB0aHJlYWQtc2FmZSBzbyB0aGlzIGlzIE9LCisgICAgaW50QXJyYXkgPSBlbnYtPk5ld0ludEFycmF5KDMpOworICAgIGlmICghaW50QXJyYXkpCisgICAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKKyAgICBtSW50QnVmZmVyID0gKGppbnRBcnJheSllbnYtPk5ld0dsb2JhbFJlZihpbnRBcnJheSk7CisgICAgbG9uZ0FycmF5ID0gZW52LT5OZXdMb25nQXJyYXkoMik7CisgICAgaWYgKCFsb25nQXJyYXkpCisgICAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKKyAgICBtTG9uZ0J1ZmZlciA9IChqbG9uZ0FycmF5KWVudi0+TmV3R2xvYmFsUmVmKGxvbmdBcnJheSk7CisgICAgY2hhckFycmF5ID0gZW52LT5OZXdDaGFyQXJyYXkoMjU2KTsKKyAgICBpZiAoIWNoYXJBcnJheSkKKyAgICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OworICAgIG1TdHJpbmdCdWZmZXIgPSAoamNoYXJBcnJheSllbnYtPk5ld0dsb2JhbFJlZihjaGFyQXJyYXkpOworICAgIHJldHVybjsKKworb3V0X29mX21lbW9yeToKKyAgICBlbnYtPlRocm93TmV3KGVudi0+RmluZENsYXNzKCJqYXZhL2xhbmcvT3V0T2ZNZW1vcnlFcnJvciIpLCBOVUxMKTsKK30KKwordm9pZCBNeU10cERhdGFiYXNlOjpjbGVhbnVwKEpOSUVudiAqZW52KSB7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobURhdGFiYXNlKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtSW50QnVmZmVyKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtTG9uZ0J1ZmZlcik7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobVN0cmluZ0J1ZmZlcik7Cit9CisKK015TXRwRGF0YWJhc2U6On5NeU10cERhdGFiYXNlKCkgeworfQorCitNdHBPYmplY3RIYW5kbGUgTXlNdHBEYXRhYmFzZTo6YmVnaW5TZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3QgbW9kaWZpZWQpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX2JlZ2luU2VuZE9iamVjdCwKKyAgICAgICAgICAgIGVudi0+TmV3U3RyaW5nVVRGKHBhdGgpLCAoamludClmb3JtYXQsIChqaW50KXBhcmVudCwgKGppbnQpc3RvcmFnZSwKKyAgICAgICAgICAgIChqbG9uZylzaXplLCAoamxvbmcpbW9kaWZpZWQpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBNeU10cERhdGFiYXNlOjplbmRTZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsIE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsIGJvb2wgc3VjY2VlZGVkKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9lbmRTZW5kT2JqZWN0LCBlbnYtPk5ld1N0cmluZ1VURihwYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSwgKGppbnQpZm9ybWF0LCAoamJvb2xlYW4pc3VjY2VlZGVkKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworfQorCitNdHBPYmplY3RIYW5kbGVMaXN0KiBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RMaXN0KE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGppbnRBcnJheSBhcnJheSA9IChqaW50QXJyYXkpZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX2dldE9iamVjdExpc3QsCisgICAgICAgICAgICAgICAgKGppbnQpc3RvcmFnZUlELCAoamludClmb3JtYXQsIChqaW50KXBhcmVudCk7CisgICAgaWYgKCFhcnJheSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogbGlzdCA9IG5ldyBNdHBPYmplY3RIYW5kbGVMaXN0KCk7CisgICAgamludCogaGFuZGxlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnJheSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgbGlzdC0+cHVzaChoYW5kbGVzW2ldKTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBoYW5kbGVzLCAwKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBsaXN0OworfQorCitpbnQgTXlNdHBEYXRhYmFzZTo6Z2V0TnVtT2JqZWN0cyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXROdW1PYmplY3RzLAorICAgICAgICAgICAgICAgIChqaW50KXN0b3JhZ2VJRCwgKGppbnQpZm9ybWF0LCAoamludClwYXJlbnQpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwT2JqZWN0Rm9ybWF0TGlzdCogTXlNdHBEYXRhYmFzZTo6Z2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzKCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGppbnRBcnJheSBhcnJheSA9IChqaW50QXJyYXkpZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1EYXRhYmFzZSwKKyAgICAgICAgICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMpOworICAgIGlmICghYXJyYXkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cE9iamVjdEZvcm1hdExpc3QqIGxpc3QgPSBuZXcgTXRwT2JqZWN0Rm9ybWF0TGlzdCgpOworICAgIGppbnQqIGZvcm1hdHMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoYXJyYXksIDApOworICAgIGpzaXplIGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYXJyYXkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIGxpc3QtPnB1c2goZm9ybWF0c1tpXSk7CisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhhcnJheSwgZm9ybWF0cywgMCk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gbGlzdDsKK30KKworTXRwT2JqZWN0Rm9ybWF0TGlzdCogTXlNdHBEYXRhYmFzZTo6Z2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMoKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludEFycmF5IGFycmF5ID0gKGppbnRBcnJheSllbnYtPkNhbGxPYmplY3RNZXRob2QobURhdGFiYXNlLAorICAgICAgICAgICAgbWV0aG9kX2dldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzKTsKKyAgICBpZiAoIWFycmF5KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBPYmplY3RGb3JtYXRMaXN0KiBsaXN0ID0gbmV3IE10cE9iamVjdEZvcm1hdExpc3QoKTsKKyAgICBqaW50KiBmb3JtYXRzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGFycmF5LCAwKTsKKyAgICBqc2l6ZSBsZW5ndGggPSBlbnYtPkdldEFycmF5TGVuZ3RoKGFycmF5KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICBsaXN0LT5wdXNoKGZvcm1hdHNbaV0pOworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoYXJyYXksIGZvcm1hdHMsIDApOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIGxpc3Q7Cit9CisKK010cE9iamVjdFByb3BlcnR5TGlzdCogTXlNdHBEYXRhYmFzZTo6Z2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyhNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludEFycmF5IGFycmF5ID0gKGppbnRBcnJheSllbnYtPkNhbGxPYmplY3RNZXRob2QobURhdGFiYXNlLAorICAgICAgICAgICAgbWV0aG9kX2dldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMsIChqaW50KWZvcm1hdCk7CisgICAgaWYgKCFhcnJheSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwT2JqZWN0UHJvcGVydHlMaXN0KiBsaXN0ID0gbmV3IE10cE9iamVjdFByb3BlcnR5TGlzdCgpOworICAgIGppbnQqIHByb3BlcnRpZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoYXJyYXksIDApOworICAgIGpzaXplIGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYXJyYXkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIGxpc3QtPnB1c2gocHJvcGVydGllc1tpXSk7CisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhhcnJheSwgcHJvcGVydGllcywgMCk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gbGlzdDsKK30KKworTXRwRGV2aWNlUHJvcGVydHlMaXN0KiBNeU10cERhdGFiYXNlOjpnZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzKCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGppbnRBcnJheSBhcnJheSA9IChqaW50QXJyYXkpZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1EYXRhYmFzZSwKKyAgICAgICAgICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzKTsKKyAgICBpZiAoIWFycmF5KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqIGxpc3QgPSBuZXcgTXRwRGV2aWNlUHJvcGVydHlMaXN0KCk7CisgICAgamludCogcHJvcGVydGllcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnJheSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgbGlzdC0+cHVzaChwcm9wZXJ0aWVzW2ldKTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBwcm9wZXJ0aWVzLCAwKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBsaXN0OworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0UHJvcGVydHlWYWx1ZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgaW50ICAgICAgICAgdHlwZTsKKworICAgIGlmICghZ2V0UHJvcGVydHlJbmZvKHByb3BlcnR5LCB0eXBlKSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX0NPREU7CisKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXRPYmplY3RQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAoamludCloYW5kbGUsIChqaW50KXByb3BlcnR5LCBtTG9uZ0J1ZmZlciwgbVN0cmluZ0J1ZmZlcik7CisgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBqbG9uZyogbG9uZ1ZhbHVlcyA9IGVudi0+R2V0TG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIDApOworICAgIGpsb25nIGxvbmdWYWx1ZSA9IGxvbmdWYWx1ZXNbMF07CisgICAgZW52LT5SZWxlYXNlTG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIGxvbmdWYWx1ZXMsIDApOworCisgICAgLy8gc3BlY2lhbCBjYXNlIE1UUF9QUk9QRVJUWV9EQVRFX01PRElGSUVELCB3aGljaCBpcyBhIHN0cmluZyB0byBNVFAKKyAgICAvLyBidXQgc3RvcmVkIGludGVybmFsbHkgYXMgYSB1aW50NjQKKyAgICBpZiAocHJvcGVydHkgPT0gTVRQX1BST1BFUlRZX0RBVEVfTU9ESUZJRUQpIHsKKyAgICAgICAgY2hhciAgICBkYXRlWzIwXTsKKyAgICAgICAgZm9ybWF0RGF0ZVRpbWUobG9uZ1ZhbHVlLCBkYXRlLCBzaXplb2YoZGF0ZSkpOworICAgICAgICBwYWNrZXQucHV0U3RyaW5nKGRhdGUpOworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworICAgIH0KKworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDg6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50OChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDg6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDgobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDE2OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDE2KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTY6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDE2KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQzMjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQzMihsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDMyOgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQzMihsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50NjQobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50NjQobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDEyODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQxMjgobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxMjg6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MTI4KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9TVFI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGpjaGFyKiBzdHIgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIDApOworICAgICAgICAgICAgcGFja2V0LnB1dFN0cmluZyhzdHIpOworICAgICAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHMobVN0cmluZ0J1ZmZlciwgc3RyLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgidW5zdXBwb3J0ZWQgb2JqZWN0IHR5cGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisgICAgfQorCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE15TXRwRGF0YWJhc2U6OnNldE9iamVjdFByb3BlcnR5VmFsdWUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIHJldHVybiAtMTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE15TXRwRGF0YWJhc2U6OmdldERldmljZVByb3BlcnR5VmFsdWUoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIHJldHVybiAtMTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE15TXRwRGF0YWJhc2U6OnNldERldmljZVByb3BlcnR5VmFsdWUoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIHJldHVybiAtMTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE15TXRwRGF0YWJhc2U6OnJlc2V0RGV2aWNlUHJvcGVydHkoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpIHsKKyAgICByZXR1cm4gLTE7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIGNoYXIgICAgZGF0ZVsyMF07CisKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqYm9vbGVhbiByZXN1bHQgPSBlbnYtPkNhbGxCb29sZWFuTWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX2dldE9iamVjdEluZm8sCisgICAgICAgICAgICAgICAgKGppbnQpaGFuZGxlLCBtSW50QnVmZmVyLCBtU3RyaW5nQnVmZmVyLCBtTG9uZ0J1ZmZlcik7CisgICAgaWYgKCFyZXN1bHQpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworCisgICAgamludCogaW50VmFsdWVzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKG1JbnRCdWZmZXIsIDApOworICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQgPSBpbnRWYWx1ZXNbMF07CisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IGludFZhbHVlc1sxXTsKKyAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gaW50VmFsdWVzWzJdOworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMobUludEJ1ZmZlciwgaW50VmFsdWVzLCAwKTsKKworICAgIGpsb25nKiBsb25nVmFsdWVzID0gZW52LT5HZXRMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgMCk7CisgICAgdWludDY0X3Qgc2l6ZSA9IGxvbmdWYWx1ZXNbMF07CisgICAgdWludDY0X3QgbW9kaWZpZWQgPSBsb25nVmFsdWVzWzFdOworICAgIGVudi0+UmVsZWFzZUxvbmdBcnJheUVsZW1lbnRzKG1Mb25nQnVmZmVyLCBsb25nVmFsdWVzLCAwKTsKKworLy8gICAgaW50IGFzc29jaWF0aW9uVHlwZSA9IChmb3JtYXQgPT0gTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTiA/CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVFBfQVNTT0NJQVRJT05fVFlQRV9HRU5FUklDX0ZPTERFUiA6CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVFBfQVNTT0NJQVRJT05fVFlQRV9VTkRFRklORUQpOworICAgIGludCBhc3NvY2lhdGlvblR5cGUgPSBNVFBfQVNTT0NJQVRJT05fVFlQRV9VTkRFRklORUQ7CisKKyAgICBwYWNrZXQucHV0VUludDMyKHN0b3JhZ2VJRCk7CisgICAgcGFja2V0LnB1dFVJbnQxNihmb3JtYXQpOworICAgIHBhY2tldC5wdXRVSW50MTYoMCk7ICAgLy8gcHJvdGVjdGlvbiBzdGF0dXMKKyAgICBwYWNrZXQucHV0VUludDMyKChzaXplID4gMHhGRkZGRkZGRkxMID8gMHhGRkZGRkZGRiA6IHNpemUpKTsKKyAgICBwYWNrZXQucHV0VUludDE2KDApOyAgIC8vIHRodW1iIGZvcm1hdAorICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gdGh1bWIgY29tcHJlc3NlZCBzaXplCisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyB0aHVtYiBwaXggd2lkdGgKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIHRodW1iIHBpeCBoZWlnaHQKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIGltYWdlIHBpeCB3aWR0aAorICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gaW1hZ2UgcGl4IGhlaWdodAorICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gaW1hZ2UgYml0IGRlcHRoCisgICAgcGFja2V0LnB1dFVJbnQzMihwYXJlbnQpOworICAgIHBhY2tldC5wdXRVSW50MTYoYXNzb2NpYXRpb25UeXBlKTsKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIGFzc29jaWF0aW9uIGRlc2MKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIHNlcXVlbmNlIG51bWJlcgorCisgICAgamNoYXIqIHN0ciA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHMobVN0cmluZ0J1ZmZlciwgMCk7CisgICAgcGFja2V0LnB1dFN0cmluZyhzdHIpOyAgIC8vIGZpbGUgbmFtZQorICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIHN0ciwgMCk7CisKKyAgICBwYWNrZXQucHV0RW1wdHlTdHJpbmcoKTsKKyAgICBmb3JtYXREYXRlVGltZShtb2RpZmllZCwgZGF0ZSwgc2l6ZW9mKGRhdGUpKTsKKyAgICBwYWNrZXQucHV0U3RyaW5nKGRhdGUpOyAgIC8vIGRhdGUgbW9kaWZpZWQKKyAgICBwYWNrZXQucHV0RW1wdHlTdHJpbmcoKTsgICAvLyBrZXl3b3JkcworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE15TXRwRGF0YWJhc2U6OmdldE9iamVjdEZpbGVQYXRoKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZyYgZmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QmIGZpbGVMZW5ndGgpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXRPYmplY3RGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAoamludCloYW5kbGUsIG1TdHJpbmdCdWZmZXIsIG1Mb25nQnVmZmVyKTsKKyAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIGpjaGFyKiBzdHIgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIDApOworICAgIGZpbGVQYXRoLnNldFRvKHN0ciwgc3RybGVuMTYoc3RyKSk7CisgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHMobVN0cmluZ0J1ZmZlciwgc3RyLCAwKTsKKworICAgIGpsb25nKiBsb25nVmFsdWVzID0gZW52LT5HZXRMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgMCk7CisgICAgZmlsZUxlbmd0aCA9IGxvbmdWYWx1ZXNbMF07CisgICAgZW52LT5SZWxlYXNlTG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIGxvbmdWYWx1ZXMsIDApOworICAgIAorICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpkZWxldGVGaWxlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX2RlbGV0ZUZpbGUsIChqaW50KWhhbmRsZSk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdHJ1Y3QgUHJvcGVydHlUYWJsZUVudHJ5IHsKKyAgICBNdHBPYmplY3RQcm9wZXJ0eSAgIHByb3BlcnR5OworICAgIGludCAgICAgICAgICAgICAgICAgdHlwZTsKK307CisKK3N0YXRpYyBjb25zdCBQcm9wZXJ0eVRhYmxlRW50cnkgICBrUHJvcGVydHlUYWJsZVtdID0geworICAgIHsgICBNVFBfUFJPUEVSVFlfUEFSRU5UX09CSkVDVCwgICAgIE1UUF9UWVBFX1VJTlQzMiB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfU1RPUkFHRV9JRCwgICAgICAgIE1UUF9UWVBFX1VJTlQzMiB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVCwgICAgIE1UUF9UWVBFX1VJTlQxNiB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRSwgIE1UUF9UWVBFX1NUUiAgICB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfT0JKRUNUX1NJWkUsICAgICAgIE1UUF9UWVBFX1VJTlQ2NCB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfREFURV9NT0RJRklFRCwgICAgIE1UUF9UWVBFX1NUUiAgICB9LAorfTsKKworYm9vbCBNeU10cERhdGFiYXNlOjpnZXRQcm9wZXJ0eUluZm8oTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksIGludCYgdHlwZSkgeworICAgIGludCBjb3VudCA9IHNpemVvZihrUHJvcGVydHlUYWJsZSkgLyBzaXplb2Yoa1Byb3BlcnR5VGFibGVbMF0pOworICAgIGNvbnN0IFByb3BlcnR5VGFibGVFbnRyeSogZW50cnkgPSBrUHJvcGVydHlUYWJsZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyssIGVudHJ5KyspIHsKKyAgICAgICAgaWYgKGVudHJ5LT5wcm9wZXJ0eSA9PSBwcm9wZXJ0eSkgeworICAgICAgICAgICAgdHlwZSA9IGVudHJ5LT50eXBlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitNdHBPYmplY3RIYW5kbGVMaXN0KiBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqaW50QXJyYXkgYXJyYXkgPSAoamludEFycmF5KWVudi0+Q2FsbE9iamVjdE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXRPYmplY3RSZWZlcmVuY2VzLAorICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSk7CisgICAgaWYgKCFhcnJheSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogbGlzdCA9IG5ldyBNdHBPYmplY3RIYW5kbGVMaXN0KCk7CisgICAgamludCogaGFuZGxlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnJheSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgbGlzdC0+cHVzaChoYW5kbGVzW2ldKTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBoYW5kbGVzLCAwKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBsaXN0OworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6c2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIHJlZmVyZW5jZXMpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBpbnQgY291bnQgPSByZWZlcmVuY2VzLT5zaXplKCk7CisgICAgamludEFycmF5IGFycmF5ID0gZW52LT5OZXdJbnRBcnJheShjb3VudCk7CisgICAgaWYgKCFhcnJheSkgeworICAgICAgICBMT0dFKCJvdXQgb2YgbWVtb3J5IGluIHNldE9iamVjdFJlZmVyZW5jZXMiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBqaW50KiBoYW5kbGVzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGFycmF5LCAwKTsKKyAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBoYW5kbGVzW2ldID0gKCpyZWZlcmVuY2VzKVtpXTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBoYW5kbGVzLCAwKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX3NldE9iamVjdFJlZmVyZW5jZXMsCisgICAgICAgICAgICAgICAgKGppbnQpaGFuZGxlLCBhcnJheSk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitNdHBQcm9wZXJ0eSogTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0UHJvcGVydHlEZXNjKE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSB7CisgICAgTXRwUHJvcGVydHkqIHJlc3VsdCA9IE5VTEw7CisgICAgc3dpdGNoIChwcm9wZXJ0eSkgeworICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9PQkpFQ1RfRk9STUFUOgorICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9QUk9URUNUSU9OX1NUQVRVUzoKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBNdHBQcm9wZXJ0eShwcm9wZXJ0eSwgTVRQX1RZUEVfVUlOVDE2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9TVE9SQUdFX0lEOgorICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9QQVJFTlRfT0JKRUNUOgorICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE10cFByb3BlcnR5KHByb3BlcnR5LCBNVFBfVFlQRV9VSU5UMzIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1BST1BFUlRZX09CSkVDVF9TSVpFOgorICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE10cFByb3BlcnR5KHByb3BlcnR5LCBNVFBfVFlQRV9VSU5UNjQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1BST1BFUlRZX1BFUlNJU1RFTlRfVUlEOgorICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE10cFByb3BlcnR5KHByb3BlcnR5LCBNVFBfVFlQRV9VSU5UMTI4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FOgorICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9EQVRFX01PRElGSUVEOgorICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE10cFByb3BlcnR5KHByb3BlcnR5LCBNVFBfVFlQRV9TVFIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwUHJvcGVydHkqIE15TXRwRGF0YWJhc2U6OmdldERldmljZVByb3BlcnR5RGVzYyhNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSkgeworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIE15TXRwRGF0YWJhc2U6OnNlc3Npb25TdGFydGVkKCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobURhdGFiYXNlLCBtZXRob2Rfc2Vzc2lvblN0YXJ0ZWQpOworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworfQorCit2b2lkIE15TXRwRGF0YWJhc2U6OnNlc3Npb25FbmRlZCgpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX3Nlc3Npb25FbmRlZCk7CisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7Cit9CisKKyNlbmRpZiAvLyBIQVZFX0FORFJPSURfT1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZV9zZXR1cChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInNldHVwXG4iKTsKKyAgICBNeU10cERhdGFiYXNlKiBkYXRhYmFzZSA9IG5ldyBNeU10cERhdGFiYXNlKGVudiwgdGhpeik7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAoaW50KWRhdGFiYXNlKTsKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZV9maW5hbGl6ZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoImZpbmFsaXplXG4iKTsKKyAgICBNeU10cERhdGFiYXNlKiBkYXRhYmFzZSA9IChNeU10cERhdGFiYXNlICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBkYXRhYmFzZS0+Y2xlYW51cChlbnYpOworICAgIGRlbGV0ZSBkYXRhYmFzZTsKKyAgICBlbnYtPlNldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQsIDApOworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworI2VuZGlmCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0geworICAgIHsibmF0aXZlX3NldHVwIiwgICAgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZV9zZXR1cH0sCisgICAgeyJuYXRpdmVfZmluYWxpemUiLCAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cERhdGFiYXNlX2ZpbmFsaXplfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrQ2xhc3NQYXRoTmFtZSA9ICJhbmRyb2lkL21lZGlhL010cERhdGFiYXNlIjsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2UoSk5JRW52ICplbnYpCit7CisgICAgamNsYXNzIGNsYXp6OworCisgICAgTE9HRCgicmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZVxuIik7CisKKyAgICBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL010cERhdGFiYXNlIik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBhbmRyb2lkL21lZGlhL010cERhdGFiYXNlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2JlZ2luU2VuZE9iamVjdCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJiZWdpblNlbmRPYmplY3QiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0lJSUpKKUkiKTsKKyAgICBpZiAobWV0aG9kX2JlZ2luU2VuZE9iamVjdCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgYmVnaW5TZW5kT2JqZWN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2VuZFNlbmRPYmplY3QgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZW5kU2VuZE9iamVjdCIsICIoTGphdmEvbGFuZy9TdHJpbmc7SUlaKVYiKTsKKyAgICBpZiAobWV0aG9kX2VuZFNlbmRPYmplY3QgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGVuZFNlbmRPYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0T2JqZWN0TGlzdCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRPYmplY3RMaXN0IiwgIihJSUkpW0kiKTsKKyAgICBpZiAobWV0aG9kX2dldE9iamVjdExpc3QgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldE9iamVjdExpc3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0TnVtT2JqZWN0cyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXROdW1PYmplY3RzIiwgIihJSUkpSSIpOworICAgIGlmIChtZXRob2RfZ2V0TnVtT2JqZWN0cyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0TnVtT2JqZWN0cyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzIiwgIigpW0kiKTsKKyAgICBpZiAobWV0aG9kX2dldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzIiwgIigpW0kiKTsKKyAgICBpZiAobWV0aG9kX2dldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMiLCAiKEkpW0kiKTsKKyAgICBpZiAobWV0aG9kX2dldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzIiwgIigpW0kiKTsKKyAgICBpZiAobWV0aG9kX2dldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0T2JqZWN0UHJvcGVydHkgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0T2JqZWN0UHJvcGVydHkiLCAiKElJW0pbQylJIik7CisgICAgaWYgKG1ldGhvZF9nZXRPYmplY3RQcm9wZXJ0eSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0T2JqZWN0UHJvcGVydHkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0T2JqZWN0SW5mbyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRPYmplY3RJbmZvIiwgIihJW0lbQ1tKKVoiKTsKKyAgICBpZiAobWV0aG9kX2dldE9iamVjdEluZm8gPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldE9iamVjdEluZm8iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0T2JqZWN0RmlsZVBhdGggPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0T2JqZWN0RmlsZVBhdGgiLCAiKElbQ1tKKUkiKTsKKyAgICBpZiAobWV0aG9kX2dldE9iamVjdEZpbGVQYXRoID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRPYmplY3RGaWxlUGF0aCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9kZWxldGVGaWxlID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImRlbGV0ZUZpbGUiLCAiKEkpSSIpOworICAgIGlmIChtZXRob2RfZGVsZXRlRmlsZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZGVsZXRlRmlsZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRPYmplY3RSZWZlcmVuY2VzID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldE9iamVjdFJlZmVyZW5jZXMiLCAiKEkpW0kiKTsKKyAgICBpZiAobWV0aG9kX2dldE9iamVjdFJlZmVyZW5jZXMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldE9iamVjdFJlZmVyZW5jZXMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2Rfc2V0T2JqZWN0UmVmZXJlbmNlcyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJzZXRPYmplY3RSZWZlcmVuY2VzIiwgIihJW0kpSSIpOworICAgIGlmIChtZXRob2Rfc2V0T2JqZWN0UmVmZXJlbmNlcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgc2V0T2JqZWN0UmVmZXJlbmNlcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9zZXNzaW9uU3RhcnRlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJzZXNzaW9uU3RhcnRlZCIsICIoKVYiKTsKKyAgICBpZiAobWV0aG9kX3Nlc3Npb25TdGFydGVkID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBzZXNzaW9uU3RhcnRlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9zZXNzaW9uRW5kZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAic2Vzc2lvbkVuZGVkIiwgIigpViIpOworICAgIGlmIChtZXRob2Rfc2Vzc2lvbkVuZGVkID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBzZXNzaW9uRW5kZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGZpZWxkX2NvbnRleHQgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosICJtTmF0aXZlQ29udGV4dCIsICJJIik7CisgICAgaWYgKGZpZWxkX2NvbnRleHQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIE10cERhdGFiYXNlLm1OYXRpdmVDb250ZXh0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsCisgICAgICAgICAgICAgICAgImFuZHJvaWQvbWVkaWEvTXRwRGF0YWJhc2UiLCBnTWV0aG9kcywgTkVMRU0oZ01ldGhvZHMpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cFNlcnZlci5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYTMxNjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMjU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBTZXJ2ZXJKTkkiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCisjaW5jbHVkZSA8bGludXgvdXNiL2ZfbXRwLmg+CisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJKTklIZWxwLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisjaW5jbHVkZSAicHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmgiCisKKyNpbmNsdWRlICJNdHBTZXJ2ZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGpmaWVsZElEIGZpZWxkX2NvbnRleHQ7CitzdGF0aWMgTXV0ZXggICAgc011dGV4OworCisvLyBpbiBhbmRyb2lkX21lZGlhX010cERhdGFiYXNlLmNwcAorZXh0ZXJuIE10cERhdGFiYXNlKiBnZXRNdHBEYXRhYmFzZShKTklFbnYgKmVudiwgam9iamVjdCBkYXRhYmFzZSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworCitzdGF0aWMgYm9vbCBFeGNlcHRpb25DaGVjayh2b2lkKiBlbnYpCit7CisgICAgcmV0dXJuICgoSk5JRW52ICopZW52KS0+RXhjZXB0aW9uQ2hlY2soKTsKK30KKworY2xhc3MgTXRwVGhyZWFkIDogcHVibGljIFRocmVhZCB7Citwcml2YXRlOgorICAgIE10cERhdGFiYXNlKiAgICBtRGF0YWJhc2U7CisgICAgTXRwU2VydmVyKiAgICAgIG1TZXJ2ZXI7CisgICAgU3RyaW5nOCAgICAgICAgIG1TdG9yYWdlUGF0aDsKKyAgICBqb2JqZWN0ICAgICAgICAgbUphdmFTZXJ2ZXI7CisgICAgaW50ICAgICAgICAgICAgIG1GZDsKKworcHVibGljOgorICAgIE10cFRocmVhZChNdHBEYXRhYmFzZSogZGF0YWJhc2UsIGNvbnN0IGNoYXIqIHN0b3JhZ2VQYXRoLCBqb2JqZWN0IGphdmFTZXJ2ZXIpCisgICAgICAgIDogICBtRGF0YWJhc2UoZGF0YWJhc2UpLAorICAgICAgICAgICAgbVNlcnZlcihOVUxMKSwKKyAgICAgICAgICAgIG1TdG9yYWdlUGF0aChzdG9yYWdlUGF0aCksCisgICAgICAgICAgICBtSmF2YVNlcnZlcihqYXZhU2VydmVyKSwKKyAgICAgICAgICAgIG1GZCgtMSkKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBzZXRQdHBNb2RlKGJvb2wgdXNlUHRwKSB7CisgICAgICAgIHNNdXRleC5sb2NrKCk7CisgICAgICAgIGlmIChtRmQgPj0gMCkgeworICAgICAgICAgICAgaW9jdGwobUZkLCBNVFBfU0VUX0lOVEVSRkFDRV9NT0RFLAorICAgICAgICAgICAgICAgICAgICAodXNlUHRwID8gTVRQX0lOVEVSRkFDRV9NT0RFX1BUUCA6IE1UUF9JTlRFUkZBQ0VfTU9ERV9NVFApKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBmZCA9IG9wZW4oIi9kZXYvbXRwX3VzYiIsIE9fUkRXUik7CisgICAgICAgICAgICBpZiAoZmQgPj0gMCkgeworICAgICAgICAgICAgICAgIGlvY3RsKGZkLCBNVFBfU0VUX0lOVEVSRkFDRV9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVzZVB0cCA/IE1UUF9JTlRFUkZBQ0VfTU9ERV9QVFAgOiBNVFBfSU5URVJGQUNFX01PREVfTVRQKSk7CisgICAgICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNNdXRleC51bmxvY2soKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIHsKKyAgICAgICAgc011dGV4LmxvY2soKTsKKyAgICAgICAgbUZkID0gb3BlbigiL2Rldi9tdHBfdXNiIiwgT19SRFdSKTsKKyAgICAgICAgcHJpbnRmKCJvcGVuIHJldHVybmVkICVkXG4iLCBtRmQpOworICAgICAgICBpZiAobUZkIDwgMCkgeworICAgICAgICAgICAgTE9HRSgiY291bGQgbm90IG9wZW4gTVRQIGRyaXZlclxuIik7CisgICAgICAgICAgICBzTXV0ZXgudW5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBtU2VydmVyID0gbmV3IE10cFNlcnZlcihtRmQsIG1EYXRhYmFzZSwgQUlEX1NEQ0FSRF9SVywgMDY2NCwgMDc3NSk7CisgICAgICAgIG1TZXJ2ZXItPmFkZFN0b3JhZ2UobVN0b3JhZ2VQYXRoKTsKKyAgICAgICAgc011dGV4LnVubG9jaygpOworCisgICAgICAgIExPR0QoIk10cFRocmVhZCBtU2VydmVyLT5ydW4iKTsKKyAgICAgICAgbVNlcnZlci0+cnVuKCk7CisKKyAgICAgICAgc011dGV4LmxvY2soKTsKKyAgICAgICAgY2xvc2UobUZkKTsKKyAgICAgICAgbUZkID0gLTE7CisgICAgICAgIGRlbGV0ZSBtU2VydmVyOworICAgICAgICBtU2VydmVyID0gTlVMTDsKKworICAgICAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICAgICAgZW52LT5TZXRJbnRGaWVsZChtSmF2YVNlcnZlciwgZmllbGRfY29udGV4dCwgMCk7CisgICAgICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1KYXZhU2VydmVyKTsKKyAgICAgICAgc011dGV4LnVubG9jaygpOworCisgICAgICAgIExPR0QoInRocmVhZExvb3AgcmV0dXJuaW5nIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIHNlbmRPYmplY3RBZGRlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgICAgIHNNdXRleC5sb2NrKCk7CisgICAgICAgIGlmIChtU2VydmVyKQorICAgICAgICAgICAgbVNlcnZlci0+c2VuZE9iamVjdEFkZGVkKGhhbmRsZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIExPR0UoInNlbmRPYmplY3RBZGRlZCBjYWxsZWQgd2hpbGUgZGlzY29ubmVjdGVkXG4iKTsKKyAgICAgICAgc011dGV4LnVubG9jaygpOworICAgIH0KKworICAgIHZvaWQgc2VuZE9iamVjdFJlbW92ZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgICAgICBzTXV0ZXgubG9jaygpOworICAgICAgICBpZiAobVNlcnZlcikKKyAgICAgICAgICAgIG1TZXJ2ZXItPnNlbmRPYmplY3RSZW1vdmVkKGhhbmRsZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIExPR0UoInNlbmRPYmplY3RSZW1vdmVkIGNhbGxlZCB3aGlsZSBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgICBzTXV0ZXgudW5sb2NrKCk7CisgICAgfQorfTsKKworI2VuZGlmIC8vIEhBVkVfQU5EUk9JRF9PUworCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2V0dXAoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgam9iamVjdCBqYXZhRGF0YWJhc2UsIGpzdHJpbmcgc3RvcmFnZVBhdGgpCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic2V0dXBcbiIpOworCisgICAgTXRwRGF0YWJhc2UqIGRhdGFiYXNlID0gZ2V0TXRwRGF0YWJhc2UoZW52LCBqYXZhRGF0YWJhc2UpOworICAgIGNvbnN0IGNoYXIgKnN0b3JhZ2VQYXRoU3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzdG9yYWdlUGF0aCwgTlVMTCk7CisKKyAgICBNdHBUaHJlYWQqIHRocmVhZCA9IG5ldyBNdHBUaHJlYWQoZGF0YWJhc2UsIHN0b3JhZ2VQYXRoU3RyLCBlbnYtPk5ld0dsb2JhbFJlZih0aGl6KSk7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAoaW50KXRocmVhZCk7CisKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzdG9yYWdlUGF0aCwgc3RvcmFnZVBhdGhTdHIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cFNlcnZlcl9maW5hbGl6ZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworICAgIExPR0QoImZpbmFsaXplXG4iKTsKK30KKworCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc3RhcnQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzdGFydFxuIik7CisgICAgTXRwVGhyZWFkICp0aHJlYWQgPSAoTXRwVGhyZWFkICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICB0aHJlYWQtPnJ1bigiTXRwVGhyZWFkIik7CisjZW5kaWYgLy8gSEFWRV9BTkRST0lEX09TCit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cFNlcnZlcl9zdG9wKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic3RvcFxuIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3NlbmRfb2JqZWN0X2FkZGVkKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgaGFuZGxlKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInNlbmRfb2JqZWN0X2FkZGVkICVkXG4iLCBoYW5kbGUpOworICAgIE10cFRocmVhZCAqdGhyZWFkID0gKE10cFRocmVhZCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgaWYgKHRocmVhZCkKKyAgICAgICAgdGhyZWFkLT5zZW5kT2JqZWN0QWRkZWQoaGFuZGxlKTsKKyAgICBlbHNlCisgICAgICAgIExPR0UoInNlbmRPYmplY3RBZGRlZCBjYWxsZWQgd2hpbGUgZGlzY29ubmVjdGVkXG4iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2VuZF9vYmplY3RfcmVtb3ZlZChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGhhbmRsZSkKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzZW5kX29iamVjdF9yZW1vdmVkICVkXG4iLCBoYW5kbGUpOworICAgIE10cFRocmVhZCAqdGhyZWFkID0gKE10cFRocmVhZCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgaWYgKHRocmVhZCkKKyAgICAgICAgdGhyZWFkLT5zZW5kT2JqZWN0UmVtb3ZlZChoYW5kbGUpOworICAgIGVsc2UKKyAgICAgICAgTE9HRSgic2VuZE9iamVjdFJlbW92ZWQgY2FsbGVkIHdoaWxlIGRpc2Nvbm5lY3RlZFxuIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3NldF9wdHBfbW9kZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqYm9vbGVhbiB1c2VQdHApCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic2V0X3B0cF9tb2RlXG4iKTsKKyAgICBNdHBUaHJlYWQgKnRocmVhZCA9IChNdHBUaHJlYWQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGlmICh0aHJlYWQpCisgICAgICAgIHRocmVhZC0+c2V0UHRwTW9kZSh1c2VQdHApOworICNlbmRpZgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgICB7Im5hdGl2ZV9zZXR1cCIsICAgICAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvTXRwRGF0YWJhc2U7TGphdmEvbGFuZy9TdHJpbmc7KVYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3NldHVwfSwKKyAgICB7Im5hdGl2ZV9maW5hbGl6ZSIsICAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9maW5hbGl6ZX0sCisgICAgeyJuYXRpdmVfc3RhcnQiLCAgICAgICAgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc3RhcnR9LAorICAgIHsibmF0aXZlX3N0b3AiLCAgICAgICAgICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3N0b3B9LAorICAgIHsibmF0aXZlX3NlbmRfb2JqZWN0X2FkZGVkIiwgICAgIihJKVYiLCAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3NlbmRfb2JqZWN0X2FkZGVkfSwKKyAgICB7Im5hdGl2ZV9zZW5kX29iamVjdF9yZW1vdmVkIiwgICIoSSlWIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZW5kX29iamVjdF9yZW1vdmVkfSwKKyAgICB7Im5hdGl2ZV9zZXRfcHRwX21vZGUiLCAgICAgICAgICIoWilWIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZXRfcHRwX21vZGV9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvbWVkaWEvTXRwU2VydmVyIjsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyKEpOSUVudiAqZW52KQoreworICAgIGpjbGFzcyBjbGF6ejsKKworICAgIExPR0QoInJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyXG4iKTsKKworICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTXRwU2VydmVyIik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBhbmRyb2lkL21lZGlhL010cFNlcnZlciIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZpZWxkX2NvbnRleHQgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosICJtTmF0aXZlQ29udGV4dCIsICJJIik7CisgICAgaWYgKGZpZWxkX2NvbnRleHQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIE10cFNlcnZlci5tTmF0aXZlQ29udGV4dCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LAorICAgICAgICAgICAgICAgICJhbmRyb2lkL21lZGlhL010cFNlcnZlciIsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawppbmRleCA0OGI0NWZmLi5lNmZmNjU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawpAQCAtMjcsNCArMjcsNCBAQAogCiBMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQogCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoraW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCmluZGV4IDdlM2I3NDMuLjljMmE4YmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKQEAgLTc2Myw3ICs3NjMsOCBAQAogICAgIGlmICgocG9wQ291bnQoZGV2aWNlKSA9PSAxICkgJiYKICAgICAgICAgKGRldmljZSAmIChBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPIHwKICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQgfAotICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUKSkpIHsKKyAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCB8CisgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OkRFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpKSkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAppbmRleCAwZjU1YjE5ZC4uOWRmZGNiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCkBAIC0yMiwxMiArMjIsMTQgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllci5oPgogI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlLmg+CisjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGVudW0gewogICAgIERJU0NPTk5FQ1QgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAogICAgIFNFVF9WSURFT19TVVJGQUNFLAorICAgIFNFVF9WSURFT19JU1VSRkFDRSwKICAgICBQUkVQQVJFX0FTWU5DLAogICAgIFNUQVJULAogICAgIFNUT1AsCkBAIC02NSwxMSArNjcsMjAgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERJU0NPTk5FQ1QsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCi0gICAgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkKKyAgICBzdGF0dXNfdCBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihzdXJmYWNlLT5hc0JpbmRlcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9WSURFT19JU1VSRkFDRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgU3VyZmFjZTo6d3JpdGVUb1BhcmNlbChzdXJmYWNlLCAmZGF0YSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfVklERU9fU1VSRkFDRSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTI1Niw5ICsyNjcsMTUgQEAKICAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfVklERU9fU1VSRkFDRTogeworICAgICAgICBjYXNlIFNFVF9WSURFT19JU1VSRkFDRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SVN1cmZhY2U+IHN1cmZhY2UgPSBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0VmlkZW9JU3VyZmFjZShzdXJmYWNlKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgU0VUX1ZJREVPX1NVUkZBQ0U6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSBTdXJmYWNlOjpyZWFkRnJvbVBhcmNlbChkYXRhKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldFZpZGVvU3VyZmFjZShzdXJmYWNlKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKaW5kZXggOTQ3ZmYzNC4uNTljZDFiNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcApAQCAtMTksNyArMTksNyBAQAogI2RlZmluZSBMT0dfVEFHICJJTWVkaWFSZWNvcmRlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KKyNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmEuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyLmg+CkBAIC00Myw2ICs0Myw3IEBACiAgICAgU0VUX0FVRElPX0VOQ09ERVIsCiAgICAgU0VUX09VVFBVVF9GSUxFX1BBVEgsCiAgICAgU0VUX09VVFBVVF9GSUxFX0ZELAorICAgIFNFVF9PVVRQVVRfRklMRV9BVVhJTElBUllfRkQsCiAgICAgU0VUX1ZJREVPX1NJWkUsCiAgICAgU0VUX1ZJREVPX0ZSQU1FUkFURSwKICAgICBTRVRfUEFSQU1FVEVSUywKQEAgLTY5LDEyICs3MCwxMiBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgc3RhdHVzX3Qgc2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQorICAgIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKQogICAgIHsKICAgICAgICAgTE9HVigic2V0UHJldmlld1N1cmZhY2UoJXApIiwgc3VyZmFjZS5nZXQoKSk7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVJlY29yZGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHN1cmZhY2UtPmFzQmluZGVyKCkpOworICAgICAgICBTdXJmYWNlOjp3cml0ZVRvUGFyY2VsKHN1cmZhY2UsICZkYXRhKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9QUkVWSUVXX1NVUkZBQ0UsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC0xNTksNiArMTYwLDE1IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGludCBmZCkgeworICAgICAgICBMT0dWKCJzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KCVkKSIsIGZkKTsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVGaWxlRGVzY3JpcHRvcihmZCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfT1VUUFVUX0ZJTEVfQVVYSUxJQVJZX0ZELCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCiAgICAgc3RhdHVzX3Qgc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkKICAgICB7CiAgICAgICAgIExPR1YoInNldFZpZGVvU2l6ZSglZHglZCkiLCB3aWR0aCwgaGVpZ2h0KTsKQEAgLTM3Nyw2ICszODcsMTMgQEAKICAgICAgICAgICAgIDo6Y2xvc2UoZmQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNFVF9PVVRQVVRfRklMRV9BVVhJTElBUllfRkQ6IHsKKyAgICAgICAgICAgIExPR1YoIlNFVF9PVVRQVVRfRklMRV9BVVhJTElBUllfRkQiKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50IGZkID0gZHVwKGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0T3V0cHV0RmlsZUF1eGlsaWFyeShmZCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9WSURFT19TSVpFOiB7CiAgICAgICAgICAgICBMT0dWKCJTRVRfVklERU9fU0laRSIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7CkBAIC00MDksNyArNDI2LDcgQEAKICAgICAgICAgY2FzZSBTRVRfUFJFVklFV19TVVJGQUNFOiB7CiAgICAgICAgICAgICBMT0dWKCJTRVRfUFJFVklFV19TVVJGQUNFIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPElTdXJmYWNlPiBzdXJmYWNlID0gaW50ZXJmYWNlX2Nhc3Q8SVN1cmZhY2U+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSBTdXJmYWNlOjpyZWFkRnJvbVBhcmNlbChkYXRhKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldFByZXZpZXdTdXJmYWNlKHN1cmZhY2UpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCmluZGV4IGM1MTEyYTUuLmJhOThmMDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcApAQCAtMTMzLDYgKzEzMywxMyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAorICAgICAgICBpbnQgbmFtZUxlbmd0aCA9IHN0cmxlbihuYW1lKTsKKyAgICAgICAgaWYgKG5hbWVMZW5ndGggKyAxID4gcGF0aFJlbWFpbmluZykgeworICAgICAgICAgICAgLy8gcGF0aCB0b28gbG9uZyEKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0cmNweShmaWxlU3BvdCwgbmFtZSk7CisKICAgICAgICAgaW50IHR5cGUgPSBlbnRyeS0+ZF90eXBlOwogICAgICAgICBpZiAodHlwZSA9PSBEVF9VTktOT1dOKSB7CiAgICAgICAgICAgICAvLyBJZiB0aGUgdHlwZSBpcyB1bmtub3duLCBzdGF0KCkgdGhlIGZpbGUgaW5zdGVhZC4KQEAgLTE1MCwxNiArMTU3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAodHlwZSA9PSBEVF9SRUcgfHwgdHlwZSA9PSBEVF9ESVIpIHsKLSAgICAgICAgICAgIGludCBuYW1lTGVuZ3RoID0gc3RybGVuKG5hbWUpOwotICAgICAgICAgICAgYm9vbCBpc0RpcmVjdG9yeSA9ICh0eXBlID09IERUX0RJUik7Ci0KLSAgICAgICAgICAgIGlmIChuYW1lTGVuZ3RoID4gcGF0aFJlbWFpbmluZyB8fCAoaXNEaXJlY3RvcnkgJiYgbmFtZUxlbmd0aCArIDEgPiBwYXRoUmVtYWluaW5nKSkgewotICAgICAgICAgICAgICAgIC8vIHBhdGggdG9vIGxvbmchCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0cmNweShmaWxlU3BvdCwgbmFtZSk7Ci0gICAgICAgICAgICBpZiAoaXNEaXJlY3RvcnkpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IERUX0RJUikgewogICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBkaXJlY3RvcmllcyB3aXRoIGEgbmFtZSB0aGF0IHN0YXJ0cyB3aXRoICcuJwogICAgICAgICAgICAgICAgIC8vIGZvciBleGFtcGxlLCB0aGUgTWFjICIuVHJhc2hlcyIgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAgaWYgKG5hbWVbMF0gPT0gJy4nKSBjb250aW51ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcAppbmRleCBmMzIyOWMwLi4zMmIyMGM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCkBAIC0yMDYsMTAgKzIwNiwxNSBAQAogICAgIExPR1YoInNldFZpZGVvU3VyZmFjZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1QbGF5ZXIgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKHN1cmZhY2UgIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuICBtUGxheWVyLT5zZXRWaWRlb1N1cmZhY2Uoc3VyZmFjZS0+Z2V0SVN1cmZhY2UoKSk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gIG1QbGF5ZXItPnNldFZpZGVvU3VyZmFjZShOVUxMKTsKKworICAgIHN0YXR1c190IGVyciA9IG1QbGF5ZXItPnNldFZpZGVvSVN1cmZhY2UoCisgICAgICAgICAgICBzdXJmYWNlID09IE5VTEwgPyBOVUxMIDogc3VyZmFjZS0+Z2V0SVN1cmZhY2UoKSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIG1QbGF5ZXItPnNldFZpZGVvU3VyZmFjZShzdXJmYWNlKTsKIH0KIAogLy8gbXVzdCBjYWxsIHdpdGggbG9jayBoZWxkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwCmluZGV4IDlkNTNjMjU3ZS4uNTFkOTFmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKQEAgLTY1LDcgKzY1LDcgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHN0YXR1c190IHJldCA9IG1NZWRpYVJlY29yZGVyLT5zZXRQcmV2aWV3U3VyZmFjZShzdXJmYWNlLT5nZXRJU3VyZmFjZSgpKTsKKyAgICBzdGF0dXNfdCByZXQgPSBtTWVkaWFSZWNvcmRlci0+c2V0UHJldmlld1N1cmZhY2Uoc3VyZmFjZSk7CiAgICAgaWYgKE9LICE9IHJldCkgewogICAgICAgICBMT0dWKCJzZXRQcmV2aWV3U3VyZmFjZSBmYWlsZWQ6ICVkIiwgcmV0KTsKICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1JFQ09SREVSX0VSUk9SOwpAQCAtMzA4LDYgKzMwOCwzMiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK3N0YXR1c190IE1lZGlhUmVjb3JkZXI6OnNldE91dHB1dEZpbGVBdXhpbGlhcnkoaW50IGZkKQoreworICAgIExPR1YoInNldE91dHB1dEZpbGVBdXhpbGlhcnkoJWQpIiwgZmQpOworICAgIGlmKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgibWVkaWEgcmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChtSXNBdXhpbGlhcnlPdXRwdXRGaWxlU2V0KSB7CisgICAgICAgIExPR0UoIm91dHB1dCBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gc2V0Iik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKCEobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1JFQ09SREVSX0RBVEFTT1VSQ0VfQ09ORklHVVJFRCkpIHsKKyAgICAgICAgTE9HRSgic2V0T3V0cHV0RmlsZSBjYWxsZWQgaW4gYW4gaW52YWxpZCBzdGF0ZSglZCkiLCBtQ3VycmVudFN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IHJldCA9IG1NZWRpYVJlY29yZGVyLT5zZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGZkKTsKKyAgICBpZiAoT0sgIT0gcmV0KSB7CisgICAgICAgIExPR1YoInNldE91dHB1dEZpbGVBdXhpbGlhcnkgZmFpbGVkOiAlZCIsIHJldCk7CisgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9SRUNPUkRFUl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgbUlzQXV4aWxpYXJ5T3V0cHV0RmlsZVNldCA9IHRydWU7CisgICAgcmV0dXJuIHJldDsKK30KKwogc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkKIHsKICAgICBMT0dWKCJzZXRWaWRlb1NpemUoJWQsICVkKSIsIHdpZHRoLCBoZWlnaHQpOwpAQCAtNTcxLDYgKzU5Nyw3IEBACiAgICAgbUlzQXVkaW9FbmNvZGVyU2V0ID0gZmFsc2U7CiAgICAgbUlzVmlkZW9FbmNvZGVyU2V0ID0gZmFsc2U7CiAgICAgbUlzT3V0cHV0RmlsZVNldCAgID0gZmFsc2U7CisgICAgbUlzQXV4aWxpYXJ5T3V0cHV0RmlsZVNldCA9IGZhbHNlOwogfQogCiAvLyBSZWxlYXNlIHNob3VsZCBiZSBPSyBpbiBhbnkgc3RhdGUKQEAgLTY0Myw0ICs2NzAsMyBAQAogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IGFiYTVmNTIuLmZmZTE5ODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC04ODksNyArODg5LDE1IEBACiAgICAgcmV0dXJuIG1TdGF0dXM7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldFZpZGVvSVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQoreworICAgIExPR1YoIlslZF0gc2V0VmlkZW9JU3VyZmFjZSglcCkiLCBtQ29ubklkLCBzdXJmYWNlLmdldCgpKTsKKyAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICBpZiAocCA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICByZXR1cm4gcC0+c2V0VmlkZW9JU3VyZmFjZShzdXJmYWNlKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkKIHsKICAgICBMT0dWKCJbJWRdIHNldFZpZGVvU3VyZmFjZSglcCkiLCBtQ29ubklkLCBzdXJmYWNlLmdldCgpKTsKICAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCBhOTY3ZWUyLi5kZWI0NThjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCkBAIC0yMDQsNyArMjA0LDggQEAKIAogICAgICAgICAvLyBJTWVkaWFQbGF5ZXIgaW50ZXJmYWNlCiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvSVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgcHJlcGFyZUFzeW5jKCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0YXJ0KCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0b3AoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAppbmRleCAxOTkxNWYxLi5iZTZhOGJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCkBAIC03MCw3ICs3MCw3IEBACiAgICAgcmV0dXJuIG1SZWNvcmRlci0+c2V0Q2FtZXJhKGNhbWVyYSk7CiB9CiAKLXN0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkKK3N0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKQogewogICAgIExPR1YoInNldFByZXZpZXdTdXJmYWNlIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwpAQCAtMTY0LDYgKzE2NCwxNyBAQAogICAgIHJldHVybiBtUmVjb3JkZXItPnNldE91dHB1dEZpbGUoZmQsIG9mZnNldCwgbGVuZ3RoKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6c2V0T3V0cHV0RmlsZUF1eGlsaWFyeShpbnQgZmQpCit7CisgICAgTE9HVigic2V0T3V0cHV0RmlsZUF1eGlsaWFyeSglZCkiLCBmZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtUmVjb3JkZXIgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJyZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtUmVjb3JkZXItPnNldE91dHB1dEZpbGVBdXhpbGlhcnkoZmQpOworfQorCiBzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogewogICAgIExPR1YoInNldFZpZGVvU2l6ZSglZHglZCkiLCB3aWR0aCwgaGVpZ2h0KTsKQEAgLTMzNyw0ICszNDgsMyBAQAogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaAppbmRleCAxZDE5MTNkLi5mZGVkOThlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKQEAgLTI5LDcgKzI5LDcgQEAKIHsKIHB1YmxpYzoKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0Q2FtZXJhKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEpOwotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU291cmNlKGludCB2cyk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvU291cmNlKGludCBhcyk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldE91dHB1dEZvcm1hdChpbnQgb2YpOwpAQCAtMzcsNiArMzcsNyBAQAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb0VuY29kZXIoaW50IGFlKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKiBwYXRoKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldE91dHB1dEZpbGVBdXhpbGlhcnkoaW50IGZkKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvRnJhbWVSYXRlKGludCBmcmFtZXNfcGVyX3NlY29uZCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKTsKQEAgLTY2LDQgKzY3LDMgQEAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBBTkRST0lEX01FRElBUkVDT1JERVJDTElFTlRfSAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5oCmluZGV4IDRhNjBlY2UuLjA2ZTRiNzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5oCkBAIC0zNSw3ICszNSw4IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkgeyByZXR1cm4gVU5LTk9XTl9FUlJPUjsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9JU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpIHsgcmV0dXJuIFVOS05PV05fRVJST1I7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgeyByZXR1cm4gVU5LTk9XTl9FUlJPUjsgfQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZUFzeW5jKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKaW5kZXggMmM5NmQ2ZC4uNmI5YmY4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCkBAIC00NCwxMyArNDQsMjAgQEAKICAgICByZXR1cm4gbVBsYXllci0+c2V0RGF0YVNvdXJjZShkdXAoZmQpLCBvZmZzZXQsIGxlbmd0aCk7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlKSB7Ci0gICAgTE9HVigic2V0VmlkZW9TdXJmYWNlIik7CitzdGF0dXNfdCBTdGFnZWZyaWdodFBsYXllcjo6c2V0VmlkZW9JU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBMT0dWKCJzZXRWaWRlb0lTdXJmYWNlIik7CiAKICAgICBtUGxheWVyLT5zZXRJU3VyZmFjZShzdXJmYWNlKTsKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBMT0dWKCJzZXRWaWRlb1N1cmZhY2UiKTsKKworICAgIG1QbGF5ZXItPnNldFN1cmZhY2Uoc3VyZmFjZSk7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBTdGFnZWZyaWdodFBsYXllcjo6cHJlcGFyZSgpIHsKICAgICByZXR1cm4gbVBsYXllci0+cHJlcGFyZSgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuaAppbmRleCA3ODFlYjQ0Li5kZDM3MTAyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuaApAQCAtMzUsNyArMzUsOCBAQAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCmluZGV4IGNmMDFmZjYuLmJiYmY0NWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKQEAgLTI0LDYgKzI0LDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FNUldyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlU3BsaXR0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTM0LDE5ICszNiwxOSBAQAogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+Ci0jaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KKyNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgIkFSVFBXcml0ZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBTdGFnZWZyaWdodFJlY29yZGVyOjpTdGFnZWZyaWdodFJlY29yZGVyKCkKLSAgICA6IG1Xcml0ZXIoTlVMTCksCi0gICAgICBtT3V0cHV0RmQoLTEpIHsKKyAgICA6IG1Xcml0ZXIoTlVMTCksIG1Xcml0ZXJBdXgoTlVMTCksCisgICAgICBtT3V0cHV0RmQoLTEpLCBtT3V0cHV0RmRBdXgoLTEpIHsKIAogICAgIExPR1YoIkNvbnN0cnVjdG9yIik7CiAgICAgcmVzZXQoKTsKQEAgLTIwMCw3ICsyMDIsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgewogICAgIExPR1YoInNldFByZXZpZXdTdXJmYWNlOiAlcCIsIHN1cmZhY2UuZ2V0KCkpOwogICAgIG1QcmV2aWV3U3VyZmFjZSA9IHN1cmZhY2U7CiAKQEAgLTIzNCw2ICsyMzYsMjQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldE91dHB1dEZpbGVBdXhpbGlhcnkoaW50IGZkKSB7CisgICAgTE9HVigic2V0T3V0cHV0RmlsZUF1eGlsaWFyeTogJWQiLCBmZCk7CisKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgZmlsZSBkZXNjcmlwdG9yOiAlZCIsIGZkKTsKKyAgICAgICAgcmV0dXJuIC1FQkFERjsKKyAgICB9CisKKyAgICBtQ2FwdHVyZUF1eFZpZGVvID0gdHJ1ZTsKKworICAgIGlmIChtT3V0cHV0RmRBdXggPj0gMCkgeworICAgICAgICA6OmNsb3NlKG1PdXRwdXRGZEF1eCk7CisgICAgfQorICAgIG1PdXRwdXRGZEF1eCA9IGR1cChmZCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIC8vIEF0dGVtcHQgdG8gcGFyc2UgYW4gaW50NjQgbGl0ZXJhbCBvcHRpb25hbGx5IHN1cnJvdW5kZWQgYnkgd2hpdGVzcGFjZSwKIC8vIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCiBzdGF0aWMgYm9vbCBzYWZlX3N0cnRvaTY0KGNvbnN0IGNoYXIgKnMsIGludDY0X3QgKnZhbCkgewpAQCAtNDczLDYgKzQ5Myw0NSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1UaW1lTGFwc2VFbmFibGUoaW50MzJfdCB0aW1lTGFwc2VFbmFibGUpIHsKKyAgICBMT0dWKCJzZXRQYXJhbVRpbWVMYXBzZUVuYWJsZTogJWQiLCB0aW1lTGFwc2VFbmFibGUpOworCisgICAgaWYodGltZUxhcHNlRW5hYmxlID09IDApIHsKKyAgICAgICAgbUNhcHR1cmVUaW1lTGFwc2UgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHRpbWVMYXBzZUVuYWJsZSA9PSAxKSB7CisgICAgICAgIG1DYXB0dXJlVGltZUxhcHNlID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UoaW50MzJfdCB1c2VTdGlsbENhbWVyYSkgeworICAgIExPR1YoInNldFBhcmFtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2U6ICVkIiwgdXNlU3RpbGxDYW1lcmEpOworCisgICAgaWYodXNlU3RpbGxDYW1lcmEgPT0gMCkgeworICAgICAgICBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2U9IGZhbHNlOworICAgIH0gZWxzZSBpZiAodXNlU3RpbGxDYW1lcmEgPT0gMSkgeworICAgICAgICBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2U9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlKGludDY0X3QgdGltZVVzKSB7CisgICAgTE9HVigic2V0UGFyYW1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZTogJWxsZCB1cyIsIHRpbWVVcyk7CisKKyAgICAvLyBOb3QgYWxsb3dpbmcgdGltZSBtb3JlIHRoYW4gYSBkYXkKKyAgICBpZiAodGltZVVzIDw9IDAgfHwgdGltZVVzID4gODY0MDAqMUU2KSB7CisgICAgICAgIExPR0UoIlRpbWUgYmV0d2VlbiB0aW1lIGxhcHNlIGZyYW1lIGNhcHR1cmUgKCVsbGQpIGlzIG91dCBvZiByYW5nZSBbMCwgMSBEYXldIiwgdGltZVVzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyA9IHRpbWVVczsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtZXRlcigKICAgICAgICAgY29uc3QgU3RyaW5nOCAma2V5LCBjb25zdCBTdHJpbmc4ICZ2YWx1ZSkgewogICAgIExPR1YoInNldFBhcmFtZXRlcjoga2V5ICglcykgPT4gdmFsdWUgKCVzKSIsIGtleS5zdHJpbmcoKSwgdmFsdWUuc3RyaW5nKCkpOwpAQCAtNTU2LDYgKzYxNSwyMiBAQAogICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJnRpbWVTY2FsZSkpIHsKICAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVZpZGVvVGltZVNjYWxlKHRpbWVTY2FsZSk7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidGltZS1sYXBzZS1lbmFibGUiKSB7CisgICAgICAgIGludDMyX3QgdGltZUxhcHNlRW5hYmxlOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJnRpbWVMYXBzZUVuYWJsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVRpbWVMYXBzZUVuYWJsZSh0aW1lTGFwc2VFbmFibGUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInVzZS1zdGlsbC1jYW1lcmEtZm9yLXRpbWUtbGFwc2UiKSB7CisgICAgICAgIGludDMyX3QgdXNlU3RpbGxDYW1lcmE7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmdXNlU3RpbGxDYW1lcmEpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSh1c2VTdGlsbENhbWVyYSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidGltZS1iZXR3ZWVuLXRpbWUtbGFwc2UtZnJhbWUtY2FwdHVyZSIpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2k2NCh2YWx1ZS5zdHJpbmcoKSwgJnRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXMpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZSgKKyAgICAgICAgICAgICAgICAgICAgMTAwMExMICogdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVNcyk7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBMT0dFKCJzZXRQYXJhbWV0ZXI6IGZhaWxlZCB0byBmaW5kIGtleSAlcyIsIGtleS5zdHJpbmcoKSk7CiAgICAgfQpAQCAtNzg2LDcgKzg2MSwxNCBAQAogICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0xJU1RfRU5EKSB7CiAgICAgICAgIHNvdXJjZSA9IGNyZWF0ZUF1ZGlvU291cmNlKCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIoJnNvdXJjZSk7CisKKyAgICAgICAgc3A8Q2FtZXJhU291cmNlPiBjYW1lcmFTb3VyY2U7CisgICAgICAgIHN0YXR1c190IGVyciA9IHNldHVwQ2FtZXJhU291cmNlKCZjYW1lcmFTb3VyY2UpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIoY2FtZXJhU291cmNlLCBtVmlkZW9CaXRSYXRlLCAmc291cmNlKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQpAQCAtODUwLDExICs5MzIsMTUgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQ2FtZXJhU291cmNlKCkgewotICAgIGNsaXBWaWRlb0JpdFJhdGUoKTsKLSAgICBjbGlwVmlkZW9GcmFtZVJhdGUoKTsKLSAgICBjbGlwVmlkZW9GcmFtZVdpZHRoKCk7Ci0gICAgY2xpcFZpZGVvRnJhbWVIZWlnaHQoKTsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQ2FtZXJhKCkgeworICAgIGlmICghbUNhcHR1cmVUaW1lTGFwc2UpIHsKKyAgICAgICAgLy8gRG9udCBjbGlwIGZvciB0aW1lIGxhcHNlIGNhcHR1cmUgYXMgZW5jb2RlciB3aWxsIGhhdmUgZW5vdWdoCisgICAgICAgIC8vIHRpbWUgdG8gZW5jb2RlIGJlY2F1c2Ugb2Ygc2xvdyBjYXB0dXJlIHJhdGUgb2YgdGltZSBsYXBzZS4KKyAgICAgICAgY2xpcFZpZGVvQml0UmF0ZSgpOworICAgICAgICBjbGlwVmlkZW9GcmFtZVJhdGUoKTsKKyAgICAgICAgY2xpcFZpZGVvRnJhbWVXaWR0aCgpOworICAgICAgICBjbGlwVmlkZW9GcmFtZUhlaWdodCgpOworICAgIH0KIAogICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgIGlmIChtQ2FtZXJhID09IDApIHsKQEAgLTg2OSw3ICs5NTUsMTQgQEAKIAogICAgIC8vIFNldCB0aGUgYWN0dWFsIHZpZGVvIHJlY29yZGluZyBmcmFtZSBzaXplCiAgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMobUNhbWVyYS0+Z2V0UGFyYW1ldGVycygpKTsKLSAgICBwYXJhbXMuc2V0UHJldmlld1NpemUobVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisKKyAgICAvLyBkb250IGNoYW5nZSB0aGUgcHJldmlldyBzaXplIHdoZW4gdXNpbmcgc3RpbGwgY2FtZXJhIGZvciB0aW1lIGxhcHNlCisgICAgLy8gYXMgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCBtYXkgY29ycmVzcG9uZCB0byBIRCByZXNvbHV0aW9uIG5vdAorICAgIC8vIHN1cHBvcnRlZCBieSB0aGUgdmlkZW8gY2FtZXJhLgorICAgIGlmICghKG1DYXB0dXJlVGltZUxhcHNlICYmIG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSkpIHsKKyAgICAgICAgcGFyYW1zLnNldFByZXZpZXdTaXplKG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgIH0KKwogICAgIHBhcmFtcy5zZXRQcmV2aWV3RnJhbWVSYXRlKG1GcmFtZVJhdGUpOwogICAgIFN0cmluZzggcyA9IHBhcmFtcy5mbGF0dGVuKCk7CiAgICAgaWYgKE9LICE9IG1DYW1lcmEtPnNldFBhcmFtZXRlcnMocykpIHsKQEAgLTg4Miw4ICs5NzUsOSBAQAogICAgIC8vIENoZWNrIG9uIHZpZGVvIGZyYW1lIHNpemUKICAgICBpbnQgZnJhbWVXaWR0aCA9IDAsIGZyYW1lSGVpZ2h0ID0gMDsKICAgICBuZXdDYW1lcmFQYXJhbXMuZ2V0UHJldmlld1NpemUoJmZyYW1lV2lkdGgsICZmcmFtZUhlaWdodCk7Ci0gICAgaWYgKGZyYW1lV2lkdGggIDwgMCB8fCBmcmFtZVdpZHRoICAhPSBtVmlkZW9XaWR0aCB8fAotICAgICAgICBmcmFtZUhlaWdodCA8IDAgfHwgZnJhbWVIZWlnaHQgIT0gbVZpZGVvSGVpZ2h0KSB7CisgICAgaWYgKCEobUNhcHR1cmVUaW1lTGFwc2UgJiYgbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKSAmJgorICAgICAgICAoZnJhbWVXaWR0aCAgPCAwIHx8IGZyYW1lV2lkdGggICE9IG1WaWRlb1dpZHRoIHx8CisgICAgICAgIGZyYW1lSGVpZ2h0IDwgMCB8fCBmcmFtZUhlaWdodCAhPSBtVmlkZW9IZWlnaHQpKSB7CiAgICAgICAgIExPR0UoIkZhaWxlZCB0byBzZXQgdGhlIHZpZGVvIGZyYW1lIHNpemUgdG8gJWR4JWQiLAogICAgICAgICAgICAgICAgIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKQEAgLTkyMSwxNyArMTAxNSwyNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBWaWRlb0VuY29kZXIoc3A8TWVkaWFTb3VyY2U+ICpzb3VyY2UpIHsKLSAgICBzb3VyY2UtPmNsZWFyKCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cENhbWVyYVNvdXJjZSgpOworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBDYW1lcmFTb3VyY2Uoc3A8Q2FtZXJhU291cmNlPiAqY2FtZXJhU291cmNlKSB7CisgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBDYW1lcmEoKTsKICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOwogCi0gICAgc3A8Q2FtZXJhU291cmNlPiBjYW1lcmFTb3VyY2UgPSBDYW1lcmFTb3VyY2U6OkNyZWF0ZUZyb21DYW1lcmEobUNhbWVyYSk7Ci0gICAgQ0hFQ0soY2FtZXJhU291cmNlICE9IE5VTEwpOworICAgICpjYW1lcmFTb3VyY2UgPSAobUNhcHR1cmVUaW1lTGFwc2UpID8KKyAgICAgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpDcmVhdGVGcm9tQ2FtZXJhKG1DYW1lcmEsIG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSwKKyAgICAgICAgICAgICAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCwgbUZyYW1lUmF0ZSk6CisgICAgICAgIENhbWVyYVNvdXJjZTo6Q3JlYXRlRnJvbUNhbWVyYShtQ2FtZXJhKTsKKyAgICBDSEVDSygqY2FtZXJhU291cmNlICE9IE5VTEwpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cFZpZGVvRW5jb2RlcigKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGNhbWVyYVNvdXJjZSwKKyAgICAgICAgaW50MzJfdCB2aWRlb0JpdFJhdGUsCisgICAgICAgIHNwPE1lZGlhU291cmNlPiAqc291cmNlKSB7CisgICAgc291cmNlLT5jbGVhcigpOwogCiAgICAgc3A8TWV0YURhdGE+IGVuY19tZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgbVZpZGVvQml0UmF0ZSk7CisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCB2aWRlb0JpdFJhdGUpOwogICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbUZyYW1lUmF0ZSk7CiAKICAgICBzd2l0Y2ggKG1WaWRlb0VuY29kZXIpIHsKQEAgLTk4MCw5ICsxMDg0LDEyIEBACiAgICAgT01YQ2xpZW50IGNsaWVudDsKICAgICBDSEVDS19FUShjbGllbnQuY29ubmVjdCgpLCBPSyk7CiAKKyAgICAvLyBVc2Ugc29mdHdhcmUgY29kZWMgZm9yIHRpbWUgbGFwc2UKKyAgICB1aW50MzJfdCBlbmNvZGVyX2ZsYWdzID0gKG1DYXB0dXJlVGltZUxhcHNlKSA/IE9NWENvZGVjOjprUHJlZmVyU29mdHdhcmVDb2RlY3MgOiAwOwogICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKICAgICAgICAgICAgIGNsaWVudC5pbnRlcmZhY2UoKSwgZW5jX21ldGEsCi0gICAgICAgICAgICB0cnVlIC8qIGNyZWF0ZUVuY29kZXIgKi8sIGNhbWVyYVNvdXJjZSk7CisgICAgICAgICAgICB0cnVlIC8qIGNyZWF0ZUVuY29kZXIgKi8sIGNhbWVyYVNvdXJjZSwKKyAgICAgICAgICAgIE5VTEwsIGVuY29kZXJfZmxhZ3MpOwogICAgIGlmIChlbmNvZGVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQpAQCAtMTAxMyw1MSArMTEyMCwxMjggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0TVBFRzRSZWNvcmRpbmcoKSB7Ci0gICAgaW50MzJfdCB0b3RhbEJpdFJhdGUgPSAwOworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBNUEVHNFJlY29yZGluZygKKyAgICAgICAgYm9vbCB1c2VTcGxpdENhbWVyYVNvdXJjZSwKKyAgICAgICAgaW50IG91dHB1dEZkLCBpbnQzMl90IGF1ZGlvQml0UmF0ZSwgaW50MzJfdCB2aWRlb0JpdFJhdGUsCisgICAgICAgIGludDMyX3QgKnRvdGFsQml0UmF0ZSwKKyAgICAgICAgc3A8TWVkaWFXcml0ZXI+ICptZWRpYVdyaXRlcikgeworICAgIG1lZGlhV3JpdGVyLT5jbGVhcigpOworICAgICp0b3RhbEJpdFJhdGUgPSAwOwogICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIHNwPE1lZGlhV3JpdGVyPiB3cml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIoZHVwKG1PdXRwdXRGZCkpOworICAgIHNwPE1lZGlhV3JpdGVyPiB3cml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIoZHVwKG91dHB1dEZkKSk7CiAKICAgICAvLyBBZGQgYXVkaW8gc291cmNlIGZpcnN0IGlmIGl0IGV4aXN0cwotICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0xJU1RfRU5EKSB7CisgICAgaWYgKCFtQ2FwdHVyZVRpbWVMYXBzZSAmJiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9MSVNUX0VORCkpIHsKICAgICAgICAgZXJyID0gc2V0dXBBdWRpb0VuY29kZXIod3JpdGVyKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKLSAgICAgICAgdG90YWxCaXRSYXRlICs9IG1BdWRpb0JpdFJhdGU7CisgICAgICAgICp0b3RhbEJpdFJhdGUgKz0gYXVkaW9CaXRSYXRlOwogICAgIH0KICAgICBpZiAobVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9ERUZBVUxUCiAgICAgICAgICAgICB8fCBtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX0NBTUVSQSkgeworCisgICAgICAgIHNwPE1lZGlhU291cmNlPiBjYW1lcmFNZWRpYVNvdXJjZTsKKyAgICAgICAgaWYgKHVzZVNwbGl0Q2FtZXJhU291cmNlKSB7CisgICAgICAgICAgICBMT0dWKCJVc2luZyBTcGxpdCBjYW1lcmEgc291cmNlIik7CisgICAgICAgICAgICBjYW1lcmFNZWRpYVNvdXJjZSA9IG1DYW1lcmFTb3VyY2VTcGxpdHRlci0+Y3JlYXRlQ2xpZW50KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcDxDYW1lcmFTb3VyY2U+IGNhbWVyYVNvdXJjZTsKKyAgICAgICAgICAgIGVyciA9IHNldHVwQ2FtZXJhU291cmNlKCZjYW1lcmFTb3VyY2UpOworICAgICAgICAgICAgY2FtZXJhTWVkaWFTb3VyY2UgPSBjYW1lcmFTb3VyY2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCiAgICAgICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyOwotICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRW5jb2RlcigmZW5jb2Rlcik7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisgICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKGNhbWVyYU1lZGlhU291cmNlLCB2aWRlb0JpdFJhdGUsICZlbmNvZGVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCiAgICAgICAgIHdyaXRlci0+YWRkU291cmNlKGVuY29kZXIpOwotICAgICAgICB0b3RhbEJpdFJhdGUgKz0gbVZpZGVvQml0UmF0ZTsKKyAgICAgICAgKnRvdGFsQml0UmF0ZSArPSB2aWRlb0JpdFJhdGU7CiAgICAgfQogCiAgICAgaWYgKG1JbnRlcmxlYXZlRHVyYXRpb25VcyA+IDApIHsKICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxNUEVHNFdyaXRlciAqPih3cml0ZXIuZ2V0KCkpLT4KICAgICAgICAgICAgIHNldEludGVybGVhdmVEdXJhdGlvbihtSW50ZXJsZWF2ZUR1cmF0aW9uVXMpOwogICAgIH0KLQogICAgIGlmIChtTWF4RmlsZUR1cmF0aW9uVXMgIT0gMCkgewogICAgICAgICB3cml0ZXItPnNldE1heEZpbGVEdXJhdGlvbihtTWF4RmlsZUR1cmF0aW9uVXMpOwogICAgIH0KICAgICBpZiAobU1heEZpbGVTaXplQnl0ZXMgIT0gMCkgewogICAgICAgICB3cml0ZXItPnNldE1heEZpbGVTaXplKG1NYXhGaWxlU2l6ZUJ5dGVzKTsKICAgICB9Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0SW50NjQoa0tleVRpbWUsIHN5c3RlbVRpbWUoKSAvIDEwMDApOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgbU91dHB1dEZvcm1hdCk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIHRvdGFsQml0UmF0ZSk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleTY0Qml0RmlsZU9mZnNldCwgbVVzZTY0Qml0RmlsZU9mZnNldCk7CisKKyAgICB3cml0ZXItPnNldExpc3RlbmVyKG1MaXN0ZW5lcik7CisgICAgKm1lZGlhV3JpdGVyID0gd3JpdGVyOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cE1QRUc0TWV0YURhdGEoaW50NjRfdCBzdGFydFRpbWVVcywgaW50MzJfdCB0b3RhbEJpdFJhdGUsCisgICAgICAgIHNwPE1ldGFEYXRhPiAqbWV0YSkgeworICAgICgqbWV0YSktPnNldEludDY0KGtLZXlUaW1lLCBzdGFydFRpbWVVcyk7CisgICAgKCptZXRhKS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBtT3V0cHV0Rm9ybWF0KTsKKyAgICAoKm1ldGEpLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgdG90YWxCaXRSYXRlKTsKKyAgICAoKm1ldGEpLT5zZXRJbnQzMihrS2V5NjRCaXRGaWxlT2Zmc2V0LCBtVXNlNjRCaXRGaWxlT2Zmc2V0KTsKICAgICBpZiAobU1vdmllVGltZVNjYWxlID4gMCkgewotICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGltZVNjYWxlLCBtTW92aWVUaW1lU2NhbGUpOworICAgICAgICAoKm1ldGEpLT5zZXRJbnQzMihrS2V5VGltZVNjYWxlLCBtTW92aWVUaW1lU2NhbGUpOwogICAgIH0KICAgICBpZiAobVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcyA+IDApIHsKLSAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleVRyYWNrVGltZVN0YXR1cywgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25Vcyk7CisgICAgICAgICgqbWV0YSktPnNldEludDY0KGtLZXlUcmFja1RpbWVTdGF0dXMsIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMpOwogICAgIH0KLSAgICB3cml0ZXItPnNldExpc3RlbmVyKG1MaXN0ZW5lcik7Ci0gICAgbVdyaXRlciA9IHdyaXRlcjsKLSAgICByZXR1cm4gbVdyaXRlci0+c3RhcnQobWV0YS5nZXQoKSk7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0TVBFRzRSZWNvcmRpbmcoKSB7CisgICAgaWYgKG1DYXB0dXJlQXV4VmlkZW8pIHsKKyAgICAgICAgTE9HVigiQ3JlYXRpbmcgTWVkaWFTb3VyY2VTcGxpdHRlciIpOworICAgICAgICBzcDxDYW1lcmFTb3VyY2U+IGNhbWVyYVNvdXJjZTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBDYW1lcmFTb3VyY2UoJmNhbWVyYVNvdXJjZSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgbUNhbWVyYVNvdXJjZVNwbGl0dGVyID0gbmV3IE1lZGlhU291cmNlU3BsaXR0ZXIoY2FtZXJhU291cmNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ2FtZXJhU291cmNlU3BsaXR0ZXIgPSBOVUxMOworICAgIH0KKworICAgIGludDMyX3QgdG90YWxCaXRSYXRlOworICAgIHN0YXR1c190IGVyciA9IHNldHVwTVBFRzRSZWNvcmRpbmcobUNhcHR1cmVBdXhWaWRlbywKKyAgICAgICAgICAgIG1PdXRwdXRGZCwgbUF1ZGlvQml0UmF0ZSwgbVZpZGVvQml0UmF0ZSwgJnRvdGFsQml0UmF0ZSwgJm1Xcml0ZXIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBzZXR1cE1QRUc0TWV0YURhdGEoc3RhcnRUaW1lVXMsIHRvdGFsQml0UmF0ZSwgJm1ldGEpOworCisgICAgZXJyID0gbVdyaXRlci0+c3RhcnQobWV0YS5nZXQoKSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChtQ2FwdHVyZUF1eFZpZGVvKSB7CisgICAgICAgIENIRUNLKG1PdXRwdXRGZEF1eCA+PSAwKTsKKyAgICAgICAgaWYgKG1Xcml0ZXJBdXggIT0gTlVMTCkgeworICAgICAgICAgICAgTE9HRSgiQXV4aWxpYXJ5IEZpbGUgd3JpdGVyIGlzIG5vdCBhdmFpYWxibGUiKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCB0b3RhbEJpdHJhdGVBdXg7CisgICAgICAgIGVyciA9IHNldHVwTVBFRzRSZWNvcmRpbmcobUNhcHR1cmVBdXhWaWRlbywKKyAgICAgICAgICAgICAgICBtT3V0cHV0RmRBdXgsIG1BdWRpb0JpdFJhdGVBdXgsIG1WaWRlb0JpdFJhdGVBdXgsICZ0b3RhbEJpdHJhdGVBdXgsICZtV3JpdGVyQXV4KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhQXV4ID0gbmV3IE1ldGFEYXRhOworICAgICAgICBzZXR1cE1QRUc0TWV0YURhdGEoc3RhcnRUaW1lVXMsIHRvdGFsQml0cmF0ZUF1eCwgJm1ldGFBdXgpOworCisgICAgICAgIHJldHVybiBtV3JpdGVyQXV4LT5zdGFydChtZXRhQXV4LmdldCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnBhdXNlKCkgewpAQCAtMTA2NiwxMiArMTI1MCwyOCBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAgICAgbVdyaXRlci0+cGF1c2UoKTsKKworICAgIGlmIChtQ2FwdHVyZUF1eFZpZGVvKSB7CisgICAgICAgIGlmIChtV3JpdGVyQXV4ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1Xcml0ZXJBdXgtPnBhdXNlKCk7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdG9wKCkgewogICAgIExPR1YoInN0b3AiKTsKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgIGlmIChtQ2FwdHVyZUF1eFZpZGVvKSB7CisgICAgICAgIGlmIChtV3JpdGVyQXV4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1Xcml0ZXJBdXgtPnN0b3AoKTsKKyAgICAgICAgICAgIG1Xcml0ZXJBdXguY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGlmIChtV3JpdGVyICE9IE5VTEwpIHsKICAgICAgICAgZXJyID0gbVdyaXRlci0+c3RvcCgpOwogICAgICAgICBtV3JpdGVyLmNsZWFyKCk7CkBAIC0xMDk1LDYgKzEyOTUsMTMgQEAKICAgICAgICAgbU91dHB1dEZkID0gLTE7CiAgICAgfQogCisgICAgaWYgKG1DYXB0dXJlQXV4VmlkZW8pIHsKKyAgICAgICAgaWYgKG1PdXRwdXRGZEF1eCA+PSAwKSB7CisgICAgICAgICAgICA6OmNsb3NlKG1PdXRwdXRGZEF1eCk7CisgICAgICAgICAgICBtT3V0cHV0RmRBdXggPSAtMTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBlcnI7CiB9CiAKQEAgLTExMjEsOSArMTMyOCwxMSBAQAogICAgIG1WaWRlb0hlaWdodCAgID0gMTQ0OwogICAgIG1GcmFtZVJhdGUgICAgID0gMjA7CiAgICAgbVZpZGVvQml0UmF0ZSAgPSAxOTIwMDA7CisgICAgbVZpZGVvQml0UmF0ZUF1eCA9IDIwMDAwMDAwOwogICAgIG1TYW1wbGVSYXRlICAgID0gODAwMDsKICAgICBtQXVkaW9DaGFubmVscyA9IDE7CiAgICAgbUF1ZGlvQml0UmF0ZSAgPSAxMjIwMDsKKyAgICBtQXVkaW9CaXRSYXRlQXV4ICA9IDEyMjAwOwogICAgIG1JbnRlcmxlYXZlRHVyYXRpb25VcyA9IDA7CiAgICAgbUlGcmFtZXNJbnRlcnZhbFNlYyA9IDE7CiAgICAgbUF1ZGlvU291cmNlTm9kZSA9IDA7CkBAIC0xMTM3LDkgKzEzNDYsMTUgQEAKICAgICBtTWF4RmlsZUR1cmF0aW9uVXMgPSAwOwogICAgIG1NYXhGaWxlU2l6ZUJ5dGVzID0gMDsKICAgICBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzID0gMDsKKyAgICBtQ2FwdHVyZVRpbWVMYXBzZSA9IGZhbHNlOworICAgIG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSA9IHRydWU7CisgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMgPSAtMTsKKyAgICBtQ2FwdHVyZUF1eFZpZGVvID0gZmFsc2U7CisgICAgbUNhbWVyYVNvdXJjZVNwbGl0dGVyID0gTlVMTDsKICAgICBtRW5jb2RlclByb2ZpbGVzID0gTWVkaWFQcm9maWxlczo6Z2V0SW5zdGFuY2UoKTsKIAogICAgIG1PdXRwdXRGZCA9IC0xOworICAgIG1PdXRwdXRGZEF1eCA9IC0xOwogICAgIG1GbGFncyA9IDA7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xMTc3LDYgKzEzOTIsOCBAQAogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgIFJlY29yZGVyOiAlcFxuIiwgdGhpcyk7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgT3V0cHV0IGZpbGUgKGZkICVkKTpcbiIsIG1PdXRwdXRGZCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgIE91dHB1dCBmaWxlIEF1eGlsaWFyeSAoZmQgJWQpOlxuIiwgbU91dHB1dEZkQXV4KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBGaWxlIGZvcm1hdDogJWRcbiIsIG1PdXRwdXRGb3JtYXQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIE1heCBmaWxlIHNpemUgKGJ5dGVzKTogJWxsZFxuIiwgbU1heEZpbGVTaXplQnl0ZXMpOwpAQCAtMTE5Nyw2ICsxNDE0LDggQEAKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBCaXQgcmF0ZSAoYnBzKTogJWRcbiIsIG1BdWRpb0JpdFJhdGUpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEJpdCByYXRlIGF1eGlsaWFyeSAoYnBzKTogJWRcbiIsIG1BdWRpb0JpdFJhdGVBdXgpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIFNhbXBsaW5nIHJhdGUgKGh6KTogJWRcbiIsIG1TYW1wbGVSYXRlKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBOdW1iZXIgb2YgY2hhbm5lbHM6ICVkXG4iLCBtQXVkaW9DaGFubmVscyk7CkBAIC0xMjI1LDYgKzE0NDQsOCBAQAogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEJpdCByYXRlIChicHMpOiAlZFxuIiwgbVZpZGVvQml0UmF0ZSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgQml0IHJhdGUgQXV4aWxpYXJ5IChicHMpOiAlZFxuIiwgbVZpZGVvQml0UmF0ZUF1eCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKaW5kZXggMjE2ZjZiYy4uZDc1YTU0MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCkBAIC0yNCw4ICsyNCwxMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBDYW1lcmE7CitjbGFzcyBDYW1lcmFTb3VyY2U7CitjbGFzcyBNZWRpYVNvdXJjZVNwbGl0dGVyOwogc3RydWN0IE1lZGlhU291cmNlOwogc3RydWN0IE1lZGlhV3JpdGVyOworY2xhc3MgTWV0YURhdGE7CiBzdHJ1Y3QgQXVkaW9Tb3VyY2U7CiBjbGFzcyBNZWRpYVByb2ZpbGVzOwogCkBAIC00Miw5ICs0NSwxMCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FtZXJhKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGUoY29uc3QgY2hhciAqcGF0aCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGVBdXhpbGlhcnkoaW50IGZkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiYgbGlzdGVuZXIpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZSgpOwpAQCAtNjMsOSArNjcsOSBAQAogICAgIH07CiAKICAgICBzcDxDYW1lcmE+IG1DYW1lcmE7Ci0gICAgc3A8SVN1cmZhY2U+IG1QcmV2aWV3U3VyZmFjZTsKKyAgICBzcDxTdXJmYWNlPiBtUHJldmlld1N1cmZhY2U7CiAgICAgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+IG1MaXN0ZW5lcjsKLSAgICBzcDxNZWRpYVdyaXRlcj4gbVdyaXRlcjsKKyAgICBzcDxNZWRpYVdyaXRlcj4gbVdyaXRlciwgbVdyaXRlckF1eDsKICAgICBzcDxBdWRpb1NvdXJjZT4gbUF1ZGlvU291cmNlTm9kZTsKIAogICAgIGF1ZGlvX3NvdXJjZSBtQXVkaW9Tb3VyY2U7CkBAIC03Niw4ICs4MCw4IEBACiAgICAgYm9vbCBtVXNlNjRCaXRGaWxlT2Zmc2V0OwogICAgIGludDMyX3QgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodDsKICAgICBpbnQzMl90IG1GcmFtZVJhdGU7Ci0gICAgaW50MzJfdCBtVmlkZW9CaXRSYXRlOwotICAgIGludDMyX3QgbUF1ZGlvQml0UmF0ZTsKKyAgICBpbnQzMl90IG1WaWRlb0JpdFJhdGUsIG1WaWRlb0JpdFJhdGVBdXg7CisgICAgaW50MzJfdCBtQXVkaW9CaXRSYXRlLCBtQXVkaW9CaXRSYXRlQXV4OwogICAgIGludDMyX3QgbUF1ZGlvQ2hhbm5lbHM7CiAgICAgaW50MzJfdCBtU2FtcGxlUmF0ZTsKICAgICBpbnQzMl90IG1JbnRlcmxlYXZlRHVyYXRpb25VczsKQEAgLTkyLDIwICs5NiwzNyBAQAogICAgIGludDY0X3QgbU1heEZpbGVEdXJhdGlvblVzOwogICAgIGludDY0X3QgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VczsKIAorICAgIGJvb2wgbUNhcHR1cmVUaW1lTGFwc2U7CisgICAgYm9vbCBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2U7CisgICAgaW50NjRfdCBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVczsKKyAgICBib29sIG1DYXB0dXJlQXV4VmlkZW87CisgICAgc3A8TWVkaWFTb3VyY2VTcGxpdHRlcj4gbUNhbWVyYVNvdXJjZVNwbGl0dGVyOworCiAgICAgU3RyaW5nOCBtUGFyYW1zOwotICAgIGludCBtT3V0cHV0RmQ7CisgICAgaW50IG1PdXRwdXRGZCwgbU91dHB1dEZkQXV4OwogICAgIGludDMyX3QgbUZsYWdzOwogCiAgICAgTWVkaWFQcm9maWxlcyAqbUVuY29kZXJQcm9maWxlczsKIAorICAgIHN0YXR1c190IHNldHVwTVBFRzRSZWNvcmRpbmcoCisgICAgICAgIGJvb2wgdXNlQXV4aWxpYXJ5Q2FtZXJhU291cmNlLAorICAgICAgICBpbnQgb3V0cHV0RmQsIGludDMyX3QgYXVkaW9CaXRSYXRlLCBpbnQzMl90IHZpZGVvQml0UmF0ZSwKKyAgICAgICAgaW50MzJfdCAqdG90YWxCaXRSYXRlLAorICAgICAgICBzcDxNZWRpYVdyaXRlcj4gKm1lZGlhV3JpdGVyKTsKKyAgICB2b2lkIHNldHVwTVBFRzRNZXRhRGF0YShpbnQ2NF90IHN0YXJ0VGltZVVzLCBpbnQzMl90IHRvdGFsQml0UmF0ZSwKKyAgICAgICAgc3A8TWV0YURhdGE+ICptZXRhKTsKICAgICBzdGF0dXNfdCBzdGFydE1QRUc0UmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc3RhcnRBTVJSZWNvcmRpbmcoKTsKICAgICBzdGF0dXNfdCBzdGFydEFBQ1JlY29yZGluZygpOwogICAgIHN0YXR1c190IHN0YXJ0UlRQUmVjb3JkaW5nKCk7CiAgICAgc3A8TWVkaWFTb3VyY2U+IGNyZWF0ZUF1ZGlvU291cmNlKCk7Ci0gICAgc3RhdHVzX3Qgc2V0dXBDYW1lcmFTb3VyY2UoKTsKKyAgICBzdGF0dXNfdCBzZXR1cENhbWVyYSgpOworICAgIHN0YXR1c190IHNldHVwQ2FtZXJhU291cmNlKHNwPENhbWVyYVNvdXJjZT4gKmNhbWVyYVNvdXJjZSk7CiAgICAgc3RhdHVzX3Qgc2V0dXBBdWRpb0VuY29kZXIoY29uc3Qgc3A8TWVkaWFXcml0ZXI+JiB3cml0ZXIpOwotICAgIHN0YXR1c190IHNldHVwVmlkZW9FbmNvZGVyKHNwPE1lZGlhU291cmNlPiAqc291cmNlKTsKKyAgICBzdGF0dXNfdCBzZXR1cFZpZGVvRW5jb2RlcigKKyAgICAgICAgICAgIHNwPE1lZGlhU291cmNlPiBjYW1lcmFTb3VyY2UsCisgICAgICAgICAgICBpbnQzMl90IHZpZGVvQml0UmF0ZSwKKyAgICAgICAgICAgIHNwPE1lZGlhU291cmNlPiAqc291cmNlKTsKIAogICAgIC8vIEVuY29kaW5nIHBhcmFtZXRlciBoYW5kbGluZyB1dGlsaXRpZXMKICAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoY29uc3QgU3RyaW5nOCAma2V5LCBjb25zdCBTdHJpbmc4ICZ2YWx1ZSk7CkBAIC0xMTMsNiArMTM0LDkgQEAKICAgICBzdGF0dXNfdCBzZXRQYXJhbUF1ZGlvTnVtYmVyT2ZDaGFubmVscyhpbnQzMl90IGNoYW5ubGVzKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbUF1ZGlvU2FtcGxpbmdSYXRlKGludDMyX3Qgc2FtcGxlUmF0ZSk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdWRpb1RpbWVTY2FsZShpbnQzMl90IHRpbWVTY2FsZSk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1UaW1lTGFwc2VFbmFibGUoaW50MzJfdCB0aW1lTGFwc2VFbmFibGUpOworICAgIHN0YXR1c190IHNldFBhcmFtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UoaW50MzJfdCB1c2VTdGlsbENhbWVyYSk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZShpbnQ2NF90IHRpbWVVcyk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb0VuY29kaW5nQml0UmF0ZShpbnQzMl90IGJpdFJhdGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9JRnJhbWVzSW50ZXJ2YWwoaW50MzJfdCBzZWNvbmRzKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvRW5jb2RlclByb2ZpbGUoaW50MzJfdCBwcm9maWxlKTsKQEAgLTEzNyw0ICsxNjEsMyBAQAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBTVEFHRUZSSUdIVF9SRUNPUkRFUl9IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5oCmluZGV4IDZlNmMzY2QuLjVlYWY1OTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5oCkBAIC03NSw3ICs3NSwxMCBAQAogCiAKICAgICAvLyBBbGwgdGhlIG1ldGhvZHMgYmVsb3cgd3JhcCB0aGUgbVBsYXllciBpbnN0YW5jZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpJU3VyZmFjZT4mIHMpICB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklTdXJmYWNlPiYgcykgIHsKKyAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNldFZpZGVvSVN1cmZhY2Uocyk7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OlN1cmZhY2U+JiBzKSAgewogICAgICAgICByZXR1cm4gbVBsYXllci0+c2V0VmlkZW9TdXJmYWNlKHMpOwogICAgIH0KICAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmUoKSB7cmV0dXJuIG1QbGF5ZXItPnByZXBhcmUoKTt9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawppbmRleCA4NmZhNjY4Li4wZDExYjMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKQEAgLTEwLDYgKzEwLDggQEAKICAgICAgICAgQXVkaW9Tb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQXdlc29tZVBsYXllci5jcHAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQ2FtZXJhU291cmNlLmNwcCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcCAgICAgICAgIFwKKyAgICAgICAgVmlkZW9Tb3VyY2VEb3duU2FtcGxlci5jcHAgICAgICAgIFwKICAgICAgICAgRGF0YVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRVNEUy5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRmlsZVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTIzLDYgKzI1LDcgQEAKICAgICAgICAgTWVkaWFEZWZzLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTWVkaWFFeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgIFwKICAgICAgICAgTWVkaWFTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTWVkaWFTb3VyY2VTcGxpdHRlci5jcHAgICAgICAgICAgIFwKICAgICAgICAgTWV0YURhdGEuY3BwICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTnVDYWNoZWRTb3VyY2UyLmNwcCAgICAgICAgICAgICAgIFwKICAgICAgICAgTnVIVFRQRGF0YVNvdXJjZS5jcHAgICAgICAgICAgICAgIFwKQEAgLTU4LDYgKzYxLDcgQEAKICAgICAgICAgbGlic29uaXZveCAgICAgICAgXAogICAgICAgICBsaWJ2b3JiaXNpZGVjICAgICBcCiAgICAgICAgIGxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudCBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X3l1diBcCiAgICAgICAgIGxpYmNhbWVyYV9jbGllbnQKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCmluZGV4IDdkYWFjOTYuLjA4NWU5MmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCkBAIC00NCw3ICs0NCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgogCi0jaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KKyNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9TdXJmYWNlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KIApAQCAtOTcsMTMgKzk3LDE0IEBACiAgICAgICAgICAgICBib29sIHByZXZpZXdPbmx5LAogICAgICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwKICAgICAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0LAotICAgICAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlLAorICAgICAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2U+ICZpc3VyZmFjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAogICAgICAgICAgICAgc2l6ZV90IGRpc3BsYXlXaWR0aCwgc2l6ZV90IGRpc3BsYXlIZWlnaHQsCiAgICAgICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCkKICAgICAgICAgOiBtVGFyZ2V0KE5VTEwpLAogICAgICAgICAgIG1MaWJIYW5kbGUoTlVMTCkgewogICAgICAgICAgICAgaW5pdChwcmV2aWV3T25seSwgY29tcG9uZW50TmFtZSwKLSAgICAgICAgICAgICAgICAgY29sb3JGb3JtYXQsIHN1cmZhY2UsIGRpc3BsYXlXaWR0aCwKKyAgICAgICAgICAgICAgICAgY29sb3JGb3JtYXQsIGlzdXJmYWNlLCBzdXJmYWNlLCBkaXNwbGF5V2lkdGgsCiAgICAgICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQsIGRlY29kZWRXaWR0aCwgZGVjb2RlZEhlaWdodCk7CiAgICAgfQogCkBAIC0xMzUsNyArMTM2LDggQEAKICAgICAgICAgICAgIGJvb2wgcHJldmlld09ubHksCiAgICAgICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLAogICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQsCi0gICAgICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UsCisgICAgICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJmlzdXJmYWNlLAorICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgICAgICBzaXplX3QgZGlzcGxheVdpZHRoLCBzaXplX3QgZGlzcGxheUhlaWdodCwKICAgICAgICAgICAgIHNpemVfdCBkZWNvZGVkV2lkdGgsIHNpemVfdCBkZWNvZGVkSGVpZ2h0KTsKIApAQCAtMTQ3LDcgKzE0OSw4IEBACiAgICAgICAgIGJvb2wgcHJldmlld09ubHksCiAgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsCiAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0LAotICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UsCisgICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiAmaXN1cmZhY2UsCisgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAogICAgICAgICBzaXplX3QgZGlzcGxheVdpZHRoLCBzaXplX3QgZGlzcGxheUhlaWdodCwKICAgICAgICAgc2l6ZV90IGRlY29kZWRXaWR0aCwgc2l6ZV90IGRlY29kZWRIZWlnaHQpIHsKICAgICBpZiAoIXByZXZpZXdPbmx5KSB7CkBAIC0xNzMsNyArMTc2LDcgQEAKIAogICAgICAgICAgICAgaWYgKGZ1bmMpIHsKICAgICAgICAgICAgICAgICBtVGFyZ2V0ID0KLSAgICAgICAgICAgICAgICAgICAgKCpmdW5jKShzdXJmYWNlLCBjb21wb25lbnROYW1lLCBjb2xvckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgKCpmdW5jKShpc3VyZmFjZSwgY29tcG9uZW50TmFtZSwgY29sb3JGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQpOwogICAgICAgICAgICAgfQpAQCAtNjMwLDggKzYzMywxOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBBd2Vzb21lUGxheWVyOjpub3RpZnlWaWRlb1NpemVfbCgpIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCk7CisKKyAgICBpbnQzMl90IGRlY29kZWRXaWR0aCwgZGVjb2RlZEhlaWdodDsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmZGVjb2RlZFdpZHRoKSk7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZkZWNvZGVkSGVpZ2h0KSk7CisKKyAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NFVF9WSURFT19TSVpFLCBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQpOworfQorCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6OmluaXRSZW5kZXJlcl9sKCkgewotICAgIGlmIChtSVN1cmZhY2UgIT0gTlVMTCkgeworICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMIHx8IG1JU3VyZmFjZSAhPSBOVUxMKSB7CiAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKTsKIAogICAgICAgICBpbnQzMl90IGZvcm1hdDsKQEAgLTY0OCw3ICs2NjEsMTggQEAKICAgICAgICAgLy8gYmVmb3JlIGNyZWF0aW5nIGEgbmV3IG9uZS4KICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogCi0gICAgICAgIGlmICghc3RybmNtcCgiT01YLiIsIGNvbXBvbmVudCwgNCkpIHsKKyAgICAgICAgaWYgKG1TdXJmYWNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIE90aGVyIGRlY29kZXJzIGFyZSBpbnN0YW50aWF0ZWQgbG9jYWxseSBhbmQgYXMgYSBjb25zZXF1ZW5jZQorICAgICAgICAgICAgLy8gYWxsb2NhdGUgdGhlaXIgYnVmZmVycyBpbiBsb2NhbCBhZGRyZXNzIHNwYWNlLgorICAgICAgICAgICAgbVZpZGVvUmVuZGVyZXIgPSBuZXcgQXdlc29tZUxvY2FsUmVuZGVyZXIoCisgICAgICAgICAgICAgICAgZmFsc2UsICAvLyBwcmV2aWV3T25seQorICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpZm9ybWF0LAorICAgICAgICAgICAgICAgIG1JU3VyZmFjZSwKKyAgICAgICAgICAgICAgICBtU3VyZmFjZSwKKyAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0LAorICAgICAgICAgICAgICAgIGRlY29kZWRXaWR0aCwgZGVjb2RlZEhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBPdXIgT01YIGNvZGVjcyBhbGxvY2F0ZSBidWZmZXJzIG9uIHRoZSBtZWRpYV9zZXJ2ZXIgc2lkZQogICAgICAgICAgICAgLy8gdGhlcmVmb3JlIHRoZXkgcmVxdWlyZSBhIHJlbW90ZSBJT01YUmVuZGVyZXIgdGhhdCBrbm93cyBob3cKICAgICAgICAgICAgIC8vIHRvIGRpc3BsYXkgdGhlbS4KQEAgLTY1OCwxNiArNjgyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfQ09MT1JfRk9STUFUVFlQRSlmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBPdGhlciBkZWNvZGVycyBhcmUgaW5zdGFudGlhdGVkIGxvY2FsbHkgYW5kIGFzIGEgY29uc2VxdWVuY2UKLSAgICAgICAgICAgIC8vIGFsbG9jYXRlIHRoZWlyIGJ1ZmZlcnMgaW4gbG9jYWwgYWRkcmVzcyBzcGFjZS4KLSAgICAgICAgICAgIG1WaWRlb1JlbmRlcmVyID0gbmV3IEF3ZXNvbWVMb2NhbFJlbmRlcmVyKAotICAgICAgICAgICAgICAgIGZhbHNlLCAgLy8gcHJldmlld09ubHkKLSAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgKE9NWF9DT0xPUl9GT1JNQVRUWVBFKWZvcm1hdCwKLSAgICAgICAgICAgICAgICBtSVN1cmZhY2UsCi0gICAgICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCwKLSAgICAgICAgICAgICAgICBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtNzA2LDYgKzcyMCwxMiBAQAogICAgIG1JU3VyZmFjZSA9IGlzdXJmYWNlOwogfQogCit2b2lkIEF3ZXNvbWVQbGF5ZXI6OnNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgbVN1cmZhY2UgPSBzdXJmYWNlOworfQorCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6OnNldEF1ZGlvU2luaygKICAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZhdWRpb1NpbmspIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwpAQCAtOTU5LDYgKzk3OSw4IEBACiAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7CiAgICAgICAgICAgICAgICAgICAgIExPR1YoIlZpZGVvU291cmNlIHNpZ25hbGxlZCBmb3JtYXQgY2hhbmdlLiIpOwogCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZV9sKCk7CisKICAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb1JlbmRlcmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb1JlbmRlcmVySXNQcmV2aWV3ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbml0UmVuZGVyZXJfbCgpOwpAQCAtMTQ0NiwxMCArMTQ2OCwxMCBAQAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpZiAobUlzQXN5bmNQcmVwYXJlKSB7Ci0gICAgICAgIGlmIChtVmlkZW9XaWR0aCA8IDAgfHwgbVZpZGVvSGVpZ2h0IDwgMCkgeworICAgICAgICBpZiAobVZpZGVvU291cmNlID09IE5VTEwpIHsKICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU0VUX1ZJREVPX1NJWkUsIDAsIDApOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TRVRfVklERU9fU0laRSwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVfbCgpOwogICAgICAgICB9CiAKICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9QUkVQQVJFRCk7CkBAIC0xNTY0LDEzICsxNTg2LDE0IEBACiAKICAgICBtRmxhZ3MgPSBzdGF0ZS0+bUZsYWdzICYgKExPT1BJTkcgfCBBVF9FT1MpOwogCi0gICAgaWYgKHN0YXRlLT5tTGFzdFZpZGVvRnJhbWUgJiYgbUlTdXJmYWNlICE9IE5VTEwpIHsKKyAgICBpZiAoc3RhdGUtPm1MYXN0VmlkZW9GcmFtZSAmJiAobVN1cmZhY2UgIT0gTlVMTCB8fCBtSVN1cmZhY2UgIT0gTlVMTCkpIHsKICAgICAgICAgbVZpZGVvUmVuZGVyZXIgPQogICAgICAgICAgICAgbmV3IEF3ZXNvbWVMb2NhbFJlbmRlcmVyKAogICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLy8gcHJldmlld09ubHkKICAgICAgICAgICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAgICAgICAgIChPTVhfQ09MT1JfRk9STUFUVFlQRSlzdGF0ZS0+bUNvbG9yRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICBtSVN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bVZpZGVvV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tVmlkZW9IZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tRGVjb2RlZFdpZHRoLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKaW5kZXggM2UzMWQ2MS4uOWNjZDE0MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCkBAIC02NSw2ICs2NSwxMSBAQAogdm9pZCBDYW1lcmFTb3VyY2VMaXN0ZW5lcjo6cG9zdERhdGEoaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YVB0cikgewogICAgIExPR1YoInBvc3REYXRhKCVkLCBwdHI6JXAsIHNpemU6JWQpIiwKICAgICAgICAgIG1zZ1R5cGUsIGRhdGFQdHItPnBvaW50ZXIoKSwgZGF0YVB0ci0+c2l6ZSgpKTsKKworICAgIHNwPENhbWVyYVNvdXJjZT4gc291cmNlID0gbVNvdXJjZS5wcm9tb3RlKCk7CisgICAgaWYgKHNvdXJjZS5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgIHNvdXJjZS0+ZGF0YUNhbGxiYWNrKG1zZ1R5cGUsIGRhdGFQdHIpOworICAgIH0KIH0KIAogdm9pZCBDYW1lcmFTb3VyY2VMaXN0ZW5lcjo6cG9zdERhdGFUaW1lc3RhbXAoCkBAIC0xMTgsMTUgKzEyMywxNSBAQAogCiBDYW1lcmFTb3VyY2U6OkNhbWVyYVNvdXJjZShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEpCiAgICAgOiBtQ2FtZXJhKGNhbWVyYSksCi0gICAgICBtRmlyc3RGcmFtZVRpbWVVcygwKSwKLSAgICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcygwKSwKICAgICAgIG1OdW1GcmFtZXNSZWNlaXZlZCgwKSwKKyAgICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcygwKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1GaXJzdEZyYW1lVGltZVVzKDApLAogICAgICAgbU51bUZyYW1lc0VuY29kZWQoMCksCiAgICAgICBtTnVtRnJhbWVzRHJvcHBlZCgwKSwKICAgICAgIG1OdW1HbGl0Y2hlcygwKSwKICAgICAgIG1HbGl0Y2hEdXJhdGlvblRocmVzaG9sZFVzKDIwMDAwMCksCi0gICAgICBtQ29sbGVjdFN0YXRzKGZhbHNlKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSB7CisgICAgICBtQ29sbGVjdFN0YXRzKGZhbHNlKSB7CiAKICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICBTdHJpbmc4IHMgPSBtQ2FtZXJhLT5nZXRQYXJhbWV0ZXJzKCk7CkBAIC0xNjEsNyArMTY2LDYgQEAKICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKICAgICBtTWV0YS0+c2V0SW50MzIoa0tleVN0cmlkZSwgc3RyaWRlKTsKICAgICBtTWV0YS0+c2V0SW50MzIoa0tleVNsaWNlSGVpZ2h0LCBzbGljZUhlaWdodCk7Ci0KIH0KIAogQ2FtZXJhU291cmNlOjp+Q2FtZXJhU291cmNlKCkgewpAQCAtMTcwLDYgKzE3NCwxMCBAQAogICAgIH0KIH0KIAordm9pZCBDYW1lcmFTb3VyY2U6OnN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCkgeworICAgIENIRUNLX0VRKE9LLCBtQ2FtZXJhLT5zdGFydFJlY29yZGluZygpKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhU291cmNlOjpzdGFydChNZXRhRGF0YSAqbWV0YSkgewogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAKQEAgLTE4NywxMyArMTk1LDE3IEBACiAKICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICBtQ2FtZXJhLT5zZXRMaXN0ZW5lcihuZXcgQ2FtZXJhU291cmNlTGlzdGVuZXIodGhpcykpOwotICAgIENIRUNLX0VRKE9LLCBtQ2FtZXJhLT5zdGFydFJlY29yZGluZygpKTsKKyAgICBzdGFydENhbWVyYVJlY29yZGluZygpOwogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogCiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBDYW1lcmFTb3VyY2U6OnN0b3BDYW1lcmFSZWNvcmRpbmcoKSB7CisgICAgbUNhbWVyYS0+c3RvcFJlY29yZGluZygpOworfQorCiBzdGF0dXNfdCBDYW1lcmFTb3VyY2U6OnN0b3AoKSB7CiAgICAgTE9HVigic3RvcCIpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CkBAIC0yMDIsNyArMjE0LDcgQEAKIAogICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgIG1DYW1lcmEtPnNldExpc3RlbmVyKE5VTEwpOwotICAgIG1DYW1lcmEtPnN0b3BSZWNvcmRpbmcoKTsKKyAgICBzdG9wQ2FtZXJhUmVjb3JkaW5nKCk7CiAgICAgcmVsZWFzZVF1ZXVlZEZyYW1lcygpOwogICAgIHdoaWxlICghbUZyYW1lc0JlaW5nRW5jb2RlZC5lbXB0eSgpKSB7CiAgICAgICAgIExPR0koIldhaXRpbmcgZm9yIG91dHN0YW5kaW5nIGZyYW1lcyBiZWluZyBlbmNvZGVkOiAlZCIsCkBAIC0yMjIsMTEgKzIzNCwxNSBAQAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBDYW1lcmFTb3VyY2U6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpIHsKKyAgICBtQ2FtZXJhLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUoZnJhbWUpOworfQorCiB2b2lkIENhbWVyYVNvdXJjZTo6cmVsZWFzZVF1ZXVlZEZyYW1lcygpIHsKICAgICBMaXN0PHNwPElNZW1vcnk+ID46Oml0ZXJhdG9yIGl0OwogICAgIHdoaWxlICghbUZyYW1lc1JlY2VpdmVkLmVtcHR5KCkpIHsKICAgICAgICAgaXQgPSBtRnJhbWVzUmVjZWl2ZWQuYmVnaW4oKTsKLSAgICAgICAgbUNhbWVyYS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKCppdCk7CisgICAgICAgIHJlbGVhc2VSZWNvcmRpbmdGcmFtZSgqaXQpOwogICAgICAgICBtRnJhbWVzUmVjZWl2ZWQuZXJhc2UoaXQpOwogICAgICAgICArK21OdW1GcmFtZXNEcm9wcGVkOwogICAgIH0KQEAgLTIzOCw3ICsyNTQsNyBAQAogCiB2b2lkIENhbWVyYVNvdXJjZTo6cmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSkgewogICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgIG1DYW1lcmEtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZShmcmFtZSk7CisgICAgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKGZyYW1lKTsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKIH0KIApAQCAtMjQ4LDcgKzI2NCw2IEBACiAgICAgZm9yIChMaXN0PHNwPElNZW1vcnk+ID46Oml0ZXJhdG9yIGl0ID0gbUZyYW1lc0JlaW5nRW5jb2RlZC5iZWdpbigpOwogICAgICAgICAgaXQgIT0gbUZyYW1lc0JlaW5nRW5jb2RlZC5lbmQoKTsgKytpdCkgewogICAgICAgICBpZiAoKCppdCktPnBvaW50ZXIoKSA9PSAgYnVmZmVyLT5kYXRhKCkpIHsKLQogICAgICAgICAgICAgcmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKCgqaXQpKTsKICAgICAgICAgICAgIG1GcmFtZXNCZWluZ0VuY29kZWQuZXJhc2UoaXQpOwogICAgICAgICAgICAgKyttTnVtRnJhbWVzRW5jb2RlZDsKQEAgLTM0MCw2ICszNTUsMTMgQEAKICAgICAgICAgKyttTnVtR2xpdGNoZXM7CiAgICAgfQogCisgICAgLy8gTWF5IG5lZWQgdG8gc2tpcCBmcmFtZSBvciBtb2RpZnkgdGltZXN0YW1wLiBDdXJyZW50bHkgaW1wbGVtZW50ZWQKKyAgICAvLyBieSB0aGUgc3ViY2xhc3MgQ2FtZXJhU291cmNlVGltZUxhcHNlLgorICAgIGlmKHNraXBDdXJyZW50RnJhbWUodGltZXN0YW1wVXMpKSB7CisgICAgICAgIHJlbGVhc2VPbmVSZWNvcmRpbmdGcmFtZShkYXRhKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOwogICAgIGlmIChtTnVtRnJhbWVzUmVjZWl2ZWQgPT0gMCkgewogICAgICAgICBtRmlyc3RGcmFtZVRpbWVVcyA9IHRpbWVzdGFtcFVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5OTUwMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAKQEAgLTAsMCArMSwzNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNvdXJjZVRpbWVMYXBzZSIKKworI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvWVVWSW1hZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ZVVZDYW52YXMuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KKyNpbmNsdWRlIDx1aS9SZWN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgIk9NWF9WaWRlby5oIgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYworQ2FtZXJhU291cmNlVGltZUxhcHNlICpDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OkNyZWF0ZShib29sIHVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlLAorICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICBpbnQzMl90IHZpZGVvRnJhbWVSYXRlKSB7CisgICAgc3A8Q2FtZXJhPiBjYW1lcmEgPSBDYW1lcmE6OmNvbm5lY3QoMCk7CisKKyAgICBpZiAoY2FtZXJhLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBDYW1lcmFTb3VyY2VUaW1lTGFwc2UoY2FtZXJhLCB1c2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSwKKyAgICAgICAgICAgIHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMsIHdpZHRoLCBoZWlnaHQsIHZpZGVvRnJhbWVSYXRlKTsKK30KKworLy8gc3RhdGljCitDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKkNhbWVyYVNvdXJjZVRpbWVMYXBzZTo6Q3JlYXRlRnJvbUNhbWVyYShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEsCisgICAgICAgIGJvb2wgdXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UsCisgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgIGludDMyX3QgdmlkZW9GcmFtZVJhdGUpIHsKKyAgICBpZiAoY2FtZXJhLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBDYW1lcmFTb3VyY2VUaW1lTGFwc2UoY2FtZXJhLCB1c2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSwKKyAgICAgICAgICAgIHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMsIHdpZHRoLCBoZWlnaHQsIHZpZGVvRnJhbWVSYXRlKTsKK30KKworQ2FtZXJhU291cmNlVGltZUxhcHNlOjpDYW1lcmFTb3VyY2VUaW1lTGFwc2UoY29uc3Qgc3A8Q2FtZXJhPiAmY2FtZXJhLAorICAgICAgICBib29sIHVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlLAorICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICBpbnQzMl90IHZpZGVvRnJhbWVSYXRlKQorICAgIDogQ2FtZXJhU291cmNlKGNhbWVyYSksCisgICAgICBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UodXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpLAorICAgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXModGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyksCisgICAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VWaWRlb0ZyYW1lc1VzKDFFNi92aWRlb0ZyYW1lUmF0ZSksCisgICAgICBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzKDApLAorICAgICAgbVNraXBDdXJyZW50RnJhbWUoZmFsc2UpIHsKKworICAgIExPR1YoInN0YXJ0aW5nIHRpbWUgbGFwc2UgbW9kZSIpOworICAgIG1WaWRlb1dpZHRoID0gd2lkdGg7CisgICAgbVZpZGVvSGVpZ2h0ID0gaGVpZ2h0OworICAgIGlmIChtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpIHsKKyAgICAgICAgQ0hFQ0soc2V0UGljdHVyZVNpemVUb0Nsb3Nlc3RTdXBwb3J0ZWQod2lkdGgsIGhlaWdodCkpOworICAgICAgICBtTmVlZENyb3BwaW5nID0gY29tcHV0ZUNyb3BSZWN0YW5nbGVPZmZzZXQoKTsKKyAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOworICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKyAgICB9Cit9CisKK0NhbWVyYVNvdXJjZVRpbWVMYXBzZTo6fkNhbWVyYVNvdXJjZVRpbWVMYXBzZSgpIHsKK30KKworYm9vbCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnNldFBpY3R1cmVTaXplVG9DbG9zZXN0U3VwcG9ydGVkKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgU3RyaW5nOCBzID0gbUNhbWVyYS0+Z2V0UGFyYW1ldGVycygpOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworCisgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMocyk7CisgICAgVmVjdG9yPFNpemU+IHN1cHBvcnRlZFNpemVzOworICAgIHBhcmFtcy5nZXRTdXBwb3J0ZWRQaWN0dXJlU2l6ZXMoc3VwcG9ydGVkU2l6ZXMpOworCisgICAgaW50MzJfdCBtaW5QaWN0dXJlU2l6ZSA9IElOVF9NQVg7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN1cHBvcnRlZFNpemVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGludDMyX3QgcGljdHVyZVdpZHRoID0gc3VwcG9ydGVkU2l6ZXNbaV0ud2lkdGg7CisgICAgICAgIGludDMyX3QgcGljdHVyZUhlaWdodCA9IHN1cHBvcnRlZFNpemVzW2ldLmhlaWdodDsKKworICAgICAgICBpZiAoKHBpY3R1cmVXaWR0aCA+PSB3aWR0aCkgJiYgKHBpY3R1cmVIZWlnaHQgPj0gaGVpZ2h0KSkgeworICAgICAgICAgICAgaW50MzJfdCBwaWN0dXJlU2l6ZSA9IHBpY3R1cmVXaWR0aCpwaWN0dXJlSGVpZ2h0OworICAgICAgICAgICAgaWYgKHBpY3R1cmVTaXplIDwgbWluUGljdHVyZVNpemUpIHsKKyAgICAgICAgICAgICAgICBtaW5QaWN0dXJlU2l6ZSA9IHBpY3R1cmVTaXplOworICAgICAgICAgICAgICAgIG1QaWN0dXJlV2lkdGggPSBwaWN0dXJlV2lkdGg7CisgICAgICAgICAgICAgICAgbVBpY3R1cmVIZWlnaHQgPSBwaWN0dXJlSGVpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIExPR1YoIlBpY3R1cmUgc2l6ZSA9ICglZCwgJWQpIiwgbVBpY3R1cmVXaWR0aCwgbVBpY3R1cmVIZWlnaHQpOworICAgIHJldHVybiAobWluUGljdHVyZVNpemUgIT0gSU5UX01BWCk7Cit9CisKK2Jvb2wgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpjb21wdXRlQ3JvcFJlY3RhbmdsZU9mZnNldCgpIHsKKyAgICBpZiAoKG1QaWN0dXJlV2lkdGggPT0gbVZpZGVvV2lkdGgpICYmIChtUGljdHVyZUhlaWdodCA9PSBtVmlkZW9IZWlnaHQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDSEVDSygobVBpY3R1cmVXaWR0aCA+IG1WaWRlb1dpZHRoKSAmJiAobVBpY3R1cmVIZWlnaHQgPiBtVmlkZW9IZWlnaHQpKTsKKworICAgIGludDMyX3Qgd2lkdGhEaWZmZXJlbmNlID0gbVBpY3R1cmVXaWR0aCAtIG1WaWRlb1dpZHRoOworICAgIGludDMyX3QgaGVpZ2h0RGlmZmVyZW5jZSA9IG1QaWN0dXJlSGVpZ2h0IC0gbVZpZGVvSGVpZ2h0OworCisgICAgbUNyb3BSZWN0U3RhcnRYID0gd2lkdGhEaWZmZXJlbmNlLzI7CisgICAgbUNyb3BSZWN0U3RhcnRZID0gaGVpZ2h0RGlmZmVyZW5jZS8yOworCisgICAgTE9HVigic2V0dGluZyBjcm9wIHJlY3RhbmdsZSBvZmZzZXQgdG8gKCVkLCAlZCkiLCBtQ3JvcFJlY3RTdGFydFgsIG1Dcm9wUmVjdFN0YXJ0WSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gc3RhdGljCit2b2lkICpDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OlRocmVhZFRpbWVMYXBzZVdyYXBwZXIodm9pZCAqbWUpIHsKKyAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PENhbWVyYVNvdXJjZVRpbWVMYXBzZSAqPihtZSk7CisgICAgc291cmNlLT50aHJlYWRUaW1lTGFwc2VFbnRyeSgpOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6dGhyZWFkVGltZUxhcHNlRW50cnkoKSB7CisgICAgd2hpbGUobVN0YXJ0ZWQpIHsKKyAgICAgICAgaWYgKG1DYW1lcmFJZGxlKSB7CisgICAgICAgICAgICBMT0dWKCJ0aHJlYWRUaW1lTGFwc2VFbnRyeTogdGFraW5nIHBpY3R1cmUiKTsKKyAgICAgICAgICAgIENIRUNLX0VRKE9LLCBtQ2FtZXJhLT50YWtlUGljdHVyZSgpKTsKKyAgICAgICAgICAgIG1DYW1lcmFJZGxlID0gZmFsc2U7CisgICAgICAgICAgICB1c2xlZXAobVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HVigidGhyZWFkVGltZUxhcHNlRW50cnk6IGNhbWVyYSBidXN5IHdpdGggb2xkIHRha2VQaWN0dXJlLiBTbGVlcGluZyBhIGxpdHRsZS4iKTsKKyAgICAgICAgICAgIHVzbGVlcCgxRTQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c3RhcnRDYW1lcmFSZWNvcmRpbmcoKSB7CisgICAgaWYgKG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSkgeworICAgICAgICBMT0dWKCJzdGFydCB0aW1lIGxhcHNlIHJlY29yZGluZyB1c2luZyBzdGlsbCBjYW1lcmEiKTsKKworICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgU3RyaW5nOCBzID0gbUNhbWVyYS0+Z2V0UGFyYW1ldGVycygpOworICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKworICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhzKTsKKyAgICAgICAgcGFyYW1zLnNldFBpY3R1cmVTaXplKG1QaWN0dXJlV2lkdGgsIG1QaWN0dXJlSGVpZ2h0KTsKKyAgICAgICAgbUNhbWVyYS0+c2V0UGFyYW1ldGVycyhwYXJhbXMuZmxhdHRlbigpKTsKKyAgICAgICAgbUNhbWVyYUlkbGUgPSB0cnVlOworCisgICAgICAgIC8vIGNyZWF0ZSBhIHRocmVhZCB3aGljaCB0YWtlcyBwaWN0dXJlcyBpbiBhIGxvb3AKKyAgICAgICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKKyAgICAgICAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOworICAgICAgICBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHIsIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFKTsKKworICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmbVRocmVhZFRpbWVMYXBzZSwgJmF0dHIsIFRocmVhZFRpbWVMYXBzZVdyYXBwZXIsIHRoaXMpOworICAgICAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HVigic3RhcnQgdGltZSBsYXBzZSByZWNvcmRpbmcgdXNpbmcgdmlkZW8gY2FtZXJhIik7CisgICAgICAgIENIRUNLX0VRKE9LLCBtQ2FtZXJhLT5zdGFydFJlY29yZGluZygpKTsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpzdG9wQ2FtZXJhUmVjb3JkaW5nKCkgeworICAgIGlmIChtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpIHsKKyAgICAgICAgdm9pZCAqZHVtbXk7CisgICAgICAgIHB0aHJlYWRfam9pbihtVGhyZWFkVGltZUxhcHNlLCAmZHVtbXkpOworICAgICAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+c3RhcnRQcmV2aWV3KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1DYW1lcmEtPnN0b3BSZWNvcmRpbmcoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpyZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKSB7CisgICAgaWYgKCFtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpIHsKKyAgICAgICAgbUNhbWVyYS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGZyYW1lKTsKKyAgICB9Cit9CisKK3NwPElNZW1vcnk+IENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6Y3JlYXRlSU1lbW9yeUNvcHkoY29uc3Qgc3A8SU1lbW9yeT4gJnNvdXJjZV9kYXRhKSB7CisgICAgc2l6ZV90IHNvdXJjZV9zaXplID0gc291cmNlX2RhdGEtPnNpemUoKTsKKyAgICB2b2lkKiBzb3VyY2VfcG9pbnRlciA9IHNvdXJjZV9kYXRhLT5wb2ludGVyKCk7CisKKyAgICBzcDxNZW1vcnlIZWFwQmFzZT4gbmV3TWVtb3J5SGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZShzb3VyY2Vfc2l6ZSk7CisgICAgc3A8TWVtb3J5QmFzZT4gbmV3TWVtb3J5ID0gbmV3IE1lbW9yeUJhc2UobmV3TWVtb3J5SGVhcCwgMCwgc291cmNlX3NpemUpOworICAgIG1lbWNweShuZXdNZW1vcnktPnBvaW50ZXIoKSwgc291cmNlX3BvaW50ZXIsIHNvdXJjZV9zaXplKTsKKyAgICByZXR1cm4gbmV3TWVtb3J5OworfQorCisvLyBBbGxvY2F0ZXMgSU1lbW9yeSBvZiBmaW5hbCB0eXBlIE1lbW9yeUJhc2Ugd2l0aCB0aGUgZ2l2ZW4gc2l6ZS4KK3NwPElNZW1vcnk+IGFsbG9jYXRlSU1lbW9yeShzaXplX3Qgc2l6ZSkgeworICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBuZXdNZW1vcnlIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKHNpemUpOworICAgIHNwPE1lbW9yeUJhc2U+IG5ld01lbW9yeSA9IG5ldyBNZW1vcnlCYXNlKG5ld01lbW9yeUhlYXAsIDAsIHNpemUpOworICAgIHJldHVybiBuZXdNZW1vcnk7Cit9CisKKy8vIHN0YXRpYwordm9pZCAqQ2FtZXJhU291cmNlVGltZUxhcHNlOjpUaHJlYWRTdGFydFByZXZpZXdXcmFwcGVyKHZvaWQgKm1lKSB7CisgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKj4obWUpOworICAgIHNvdXJjZS0+dGhyZWFkU3RhcnRQcmV2aWV3KCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjp0aHJlYWRTdGFydFByZXZpZXcoKSB7CisgICAgQ0hFQ0tfRVEoT0ssIG1DYW1lcmEtPnN0YXJ0UHJldmlldygpKTsKKyAgICBtQ2FtZXJhSWRsZSA9IHRydWU7Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpyZXN0YXJ0UHJldmlldygpIHsKKyAgICAvLyBTdGFydCB0aGlzIGluIGEgZGlmZmVyZW50IHRocmVhZCwgc28gdGhhdCB0aGUgZGF0YUNhbGxiYWNrIGNhbiByZXR1cm4KKyAgICBMT0dWKCJyZXN0YXJ0UHJldmlldyIpOworICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOworICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOworCisgICAgcHRocmVhZF90IHRocmVhZFByZXZpZXc7CisgICAgcHRocmVhZF9jcmVhdGUoJnRocmVhZFByZXZpZXcsICZhdHRyLCBUaHJlYWRTdGFydFByZXZpZXdXcmFwcGVyLCB0aGlzKTsKKyAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7Cit9CisKK3NwPElNZW1vcnk+IENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6Y3JvcFlVVkltYWdlKGNvbnN0IHNwPElNZW1vcnk+ICZzb3VyY2VfZGF0YSkgeworICAgIC8vIGZpbmQgdGhlIFlVViBmb3JtYXQKKyAgICBpbnQzMl90IHNyY0Zvcm1hdDsKKyAgICBDSEVDSyhtTWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJnNyY0Zvcm1hdCkpOworICAgIFlVVkltYWdlOjpZVVZGb3JtYXQgeXV2Rm9ybWF0OworICAgIGlmIChzcmNGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICAgICAgeXV2Rm9ybWF0ID0gWVVWSW1hZ2U6OllVVjQyMFNlbWlQbGFuYXI7CisgICAgfSBlbHNlIGlmIChzcmNGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgeworICAgICAgICB5dXZGb3JtYXQgPSBZVVZJbWFnZTo6WVVWNDIwUGxhbmFyOworICAgIH0KKworICAgIC8vIGFsbG9jYXRlIG1lbW9yeSBmb3IgY3JvcHBlZCBpbWFnZSBhbmQgc2V0dXAgYSBjYW52YXMgdXNpbmcgaXQuCisgICAgc3A8SU1lbW9yeT4gY3JvcHBlZEltYWdlTWVtb3J5ID0gYWxsb2NhdGVJTWVtb3J5KAorICAgICAgICAgICAgWVVWSW1hZ2U6OmJ1ZmZlclNpemUoeXV2Rm9ybWF0LCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KSk7CisgICAgWVVWSW1hZ2UgeXV2SW1hZ2VDcm9wcGVkKHl1dkZvcm1hdCwKKyAgICAgICAgICAgIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQsCisgICAgICAgICAgICAodWludDhfdCAqKWNyb3BwZWRJbWFnZU1lbW9yeS0+cG9pbnRlcigpKTsKKyAgICBZVVZDYW52YXMgeXV2Q2FudmFzQ3JvcCh5dXZJbWFnZUNyb3BwZWQpOworCisgICAgWVVWSW1hZ2UgeXV2SW1hZ2VTb3VyY2UoeXV2Rm9ybWF0LAorICAgICAgICAgICAgbVBpY3R1cmVXaWR0aCwgbVBpY3R1cmVIZWlnaHQsCisgICAgICAgICAgICAodWludDhfdCAqKXNvdXJjZV9kYXRhLT5wb2ludGVyKCkpOworICAgIHl1dkNhbnZhc0Nyb3AuQ29weUltYWdlUmVjdCgKKyAgICAgICAgICAgIFJlY3QobUNyb3BSZWN0U3RhcnRYLCBtQ3JvcFJlY3RTdGFydFksCisgICAgICAgICAgICAgICAgbUNyb3BSZWN0U3RhcnRYICsgbVZpZGVvV2lkdGgsCisgICAgICAgICAgICAgICAgbUNyb3BSZWN0U3RhcnRZICsgbVZpZGVvSGVpZ2h0KSwKKyAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICB5dXZJbWFnZVNvdXJjZSk7CisKKyAgICByZXR1cm4gY3JvcHBlZEltYWdlTWVtb3J5OworfQorCit2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6ZGF0YUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpIHsKKyAgICBpZiAobXNnVHlwZSA9PSBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UpIHsKKyAgICAgICAgLy8gdGFrZVBpY3R1cmUgd2lsbCBjb21wbGV0ZSBhZnRlciB0aGlzIGNhbGxiYWNrLCBzbyByZXN0YXJ0IHByZXZpZXcuCisgICAgICAgIHJlc3RhcnRQcmV2aWV3KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1zZ1R5cGUgIT0gQ0FNRVJBX01TR19SQVdfSU1BR0UpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExPR1YoImRhdGFDYWxsYmFjayBmb3IgdGltZWxhcHNlIHN0aWxsIGZyYW1lIik7CisgICAgQ0hFQ0tfRVEodHJ1ZSwgbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKTsKKworICAgIGludDY0X3QgdGltZXN0YW1wVXM7CisgICAgaWYgKG1OdW1GcmFtZXNSZWNlaXZlZCA9PSAwKSB7CisgICAgICAgIHRpbWVzdGFtcFVzID0gbVN0YXJ0VGltZVVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHRpbWVzdGFtcFVzID0gbUxhc3RGcmFtZVRpbWVzdGFtcFVzICsgbVRpbWVCZXR3ZWVuVGltZUxhcHNlVmlkZW9GcmFtZXNVczsKKyAgICB9CisKKyAgICBpZiAobU5lZWRDcm9wcGluZykgeworICAgICAgICBzcDxJTWVtb3J5PiBjcm9wcGVkSW1hZ2VEYXRhID0gY3JvcFlVVkltYWdlKGRhdGEpOworICAgICAgICBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wVXMsIG1zZ1R5cGUsIGNyb3BwZWRJbWFnZURhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNwPElNZW1vcnk+IGRhdGFDb3B5ID0gY3JlYXRlSU1lbW9yeUNvcHkoZGF0YSk7CisgICAgICAgIGRhdGFDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXBVcywgbXNnVHlwZSwgZGF0YUNvcHkpOworICAgIH0KK30KKworYm9vbCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnNraXBDdXJyZW50RnJhbWUoaW50NjRfdCB0aW1lc3RhbXBVcykgeworICAgIGlmIChtU2tpcEN1cnJlbnRGcmFtZSkgeworICAgICAgICBtU2tpcEN1cnJlbnRGcmFtZSA9IGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c2tpcEZyYW1lQW5kTW9kaWZ5VGltZVN0YW1wKGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgaWYgKCFtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpIHsKKyAgICAgICAgaWYgKG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgPT0gMCkgeworICAgICAgICAgICAgLy8gRmlyc3QgdGltZSBsYXBzZSBmcmFtZS4gSW5pdGlhbGl6ZSBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzCisgICAgICAgICAgICAvLyB0byBjdXJyZW50IHRpbWUgKHRpbWVzdGFtcFVzKSBhbmQgc2F2ZSBmcmFtZSBkYXRhLgorICAgICAgICAgICAgTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wIHRpbWVsYXBzZTogaW5pdGlhbCBmcmFtZSIpOworCisgICAgICAgICAgICBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzID0gKnRpbWVzdGFtcFVzOworICAgICAgICB9IGVsc2UgaWYgKCp0aW1lc3RhbXBVcyA8CisgICAgICAgICAgICAgICAgKG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgKyBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcykpIHsKKyAgICAgICAgICAgIC8vIFNraXAgYWxsIGZyYW1lcyBmcm9tIGxhc3QgZW5jb2RlZCBmcmFtZSB1bnRpbAorICAgICAgICAgICAgLy8gc3VmZmljaWVudCB0aW1lIChtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcykgaGFzIHBhc3NlZC4KKyAgICAgICAgICAgIC8vIFRlbGwgdGhlIGNhbWVyYSB0byByZWxlYXNlIGl0cyByZWNvcmRpbmcgZnJhbWUgYW5kIHJldHVybi4KKyAgICAgICAgICAgIExPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcCB0aW1lbGFwc2U6IHNraXBwaW5nIGludGVybWVkaWF0ZSBmcmFtZSIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBEZXNpcmVkIGZyYW1lIGhhcyBhcnJpdmVkIGFmdGVyIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzIHRpbWU6CisgICAgICAgICAgICAvLyAtIFJlc2V0IG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgdG8gY3VycmVudCB0aW1lLgorICAgICAgICAgICAgLy8gLSBBcnRpZmljaWFsbHkgbW9kaWZ5IHRpbWVzdGFtcFVzIHRvIGJlIG9uZSBmcmFtZSB0aW1lICgxL2ZyYW1lcmF0ZSkgYWhlYWQKKyAgICAgICAgICAgIC8vIG9mIHRoZSBsYXN0IGVuY29kZWQgZnJhbWUncyB0aW1lIHN0YW1wLgorICAgICAgICAgICAgTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wIHRpbWVsYXBzZTogZ290IHRpbWVsYXBzZSBmcmFtZSIpOworCisgICAgICAgICAgICBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzID0gKnRpbWVzdGFtcFVzOworICAgICAgICAgICAgKnRpbWVzdGFtcFVzID0gbUxhc3RGcmFtZVRpbWVzdGFtcFVzICsgbVRpbWVCZXR3ZWVuVGltZUxhcHNlVmlkZW9GcmFtZXNVczsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywgaW50MzJfdCBtc2dUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpIHsKKyAgICBpZiAoIW1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSkgeworICAgICAgICBtU2tpcEN1cnJlbnRGcmFtZSA9IHNraXBGcmFtZUFuZE1vZGlmeVRpbWVTdGFtcCgmdGltZXN0YW1wVXMpOworICAgIH0KKyAgICBDYW1lcmFTb3VyY2U6OmRhdGFDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXBVcywgbXNnVHlwZSwgZGF0YSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZVNwbGl0dGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlU3BsaXR0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYzcwMTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZVNwbGl0dGVyLmNwcApAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFTb3VyY2VTcGxpdHRlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlU3BsaXR0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK01lZGlhU291cmNlU3BsaXR0ZXI6Ok1lZGlhU291cmNlU3BsaXR0ZXIoc3A8TWVkaWFTb3VyY2U+IG1lZGlhU291cmNlKSB7CisgICAgbU51bWJlck9mQ2xpZW50cyA9IDA7CisgICAgbVNvdXJjZSA9IG1lZGlhU291cmNlOworICAgIG1Tb3VyY2VTdGFydGVkID0gZmFsc2U7CisKKyAgICBtTnVtYmVyT2ZDbGllbnRzU3RhcnRlZCA9IDA7CisgICAgbU51bWJlck9mQ3VycmVudFJlYWRzID0gMDsKKyAgICBtQ3VycmVudFJlYWRCaXQgPSAwOworICAgIG1MYXN0UmVhZENvbXBsZXRlZCA9IHRydWU7Cit9CisKK01lZGlhU291cmNlU3BsaXR0ZXI6On5NZWRpYVNvdXJjZVNwbGl0dGVyKCkgeworfQorCitzcDxNZWRpYVNvdXJjZT4gTWVkaWFTb3VyY2VTcGxpdHRlcjo6Y3JlYXRlQ2xpZW50KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBzcDxNZWRpYVNvdXJjZT4gY2xpZW50ID0gbmV3IENsaWVudCh0aGlzLCBtTnVtYmVyT2ZDbGllbnRzKyspOworICAgIG1DbGllbnRzU3RhcnRlZC5wdXNoKGZhbHNlKTsKKyAgICBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0LnB1c2goMCk7CisgICAgcmV0dXJuIGNsaWVudDsKK30KKworc3RhdHVzX3QgTWVkaWFTb3VyY2VTcGxpdHRlcjo6c3RhcnQoaW50IGNsaWVudElkLCBNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIExPR1YoInN0YXJ0IGNsaWVudCAoJWQpIiwgY2xpZW50SWQpOworICAgIGlmIChtQ2xpZW50c1N0YXJ0ZWRbY2xpZW50SWRdKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtTnVtYmVyT2ZDbGllbnRzU3RhcnRlZCsrOworCisgICAgaWYgKCFtU291cmNlU3RhcnRlZCkgeworICAgICAgICBMT0dWKCJTdGFydGluZyByZWFsIHNvdXJjZSBmcm9tIGNsaWVudCAoJWQpIiwgY2xpZW50SWQpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdGFydChwYXJhbXMpOworCisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1DbGllbnRzU3RhcnRlZC5lZGl0SXRlbUF0KGNsaWVudElkKSA9IHRydWU7CisgICAgICAgICAgICBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0LmVkaXRJdGVtQXQoY2xpZW50SWQpID0gIW1DdXJyZW50UmVhZEJpdDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNsaWVudHNTdGFydGVkLmVkaXRJdGVtQXQoY2xpZW50SWQpID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1MYXN0UmVhZENvbXBsZXRlZCkgeworICAgICAgICAgICAgLy8gTGFzdCByZWFkIHdhcyBjb21wbGV0ZWQuIFNvIGpvaW4gaW4gdGhlIHRocmVhZHMgZm9yIHRoZSBuZXh0IHJlYWQuCisgICAgICAgICAgICBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0LmVkaXRJdGVtQXQoY2xpZW50SWQpID0gIW1DdXJyZW50UmVhZEJpdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIExhc3QgcmVhZCBpcyBvbmdvaW5nLiBTbyBqb2luIGluIHRoZSB0aHJlYWRzIGZvciB0aGUgY3VycmVudCByZWFkLgorICAgICAgICAgICAgbUNsaWVudHNEZXNpcmVkUmVhZEJpdC5lZGl0SXRlbUF0KGNsaWVudElkKSA9IG1DdXJyZW50UmVhZEJpdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorfQorCitzdGF0dXNfdCBNZWRpYVNvdXJjZVNwbGl0dGVyOjpzdG9wKGludCBjbGllbnRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBMT0dWKCJzdG9wIGNsaWVudCAoJWQpIiwgY2xpZW50SWQpOworICAgIENIRUNLKGNsaWVudElkID49IDAgJiYgY2xpZW50SWQgPCBtTnVtYmVyT2ZDbGllbnRzKTsKKyAgICBDSEVDSyhtQ2xpZW50c1N0YXJ0ZWRbY2xpZW50SWRdKTsKKworICAgIGlmICgtLW1OdW1iZXJPZkNsaWVudHNTdGFydGVkID09IDApIHsKKyAgICAgICAgTE9HVigiU3RvcHBpbmcgcmVhbCBzb3VyY2UgZnJvbSBjbGllbnQgKCVkKSIsIGNsaWVudElkKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RvcCgpOworICAgICAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOworICAgICAgICBtQ2xpZW50c1N0YXJ0ZWQuZWRpdEl0ZW1BdChjbGllbnRJZCkgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ2xpZW50c1N0YXJ0ZWQuZWRpdEl0ZW1BdChjbGllbnRJZCkgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFtTGFzdFJlYWRDb21wbGV0ZWQgJiYgKG1DbGllbnRzRGVzaXJlZFJlYWRCaXRbY2xpZW50SWRdID09IG1DdXJyZW50UmVhZEJpdCkpIHsKKyAgICAgICAgICAgIC8vICFtTGFzdFJlYWRDb21wbGV0ZWQgaW1wbGllcyB0aGF0IGJ1ZmZlciBoYXMgYmVlbiByZWFkIGZyb20gc291cmNlLCBidXQgYWxsCisgICAgICAgICAgICAvLyBjbGllbnRzIGhhdmVuJ3QgcmVhZCBpdC4KKyAgICAgICAgICAgIC8vIG1DbGllbnRzRGVzaXJlZFJlYWRCaXRbY2xpZW50SWRdID09IG1DdXJyZW50UmVhZEJpdCBpbXBsaWVzIHRoYXQgdGhpcworICAgICAgICAgICAgLy8gY2xpZW50IHdvdWxkIGhhdmUgd2FudGVkIHRvIHJlYWQgZnJvbSB0aGlzIGJ1ZmZlci4gKGkuZS4gaXQgaGFzIG5vdCB5ZXQKKyAgICAgICAgICAgIC8vIGNhbGxlZCByZWFkKCkgZm9yIHRoZSBjdXJyZW50IHJlYWQgYnVmZmVyLikKKyAgICAgICAgICAgIC8vIFNpbmNlIG90aGVyIHRocmVhZHMgbWF5IGJlIHdhaXRpbmcgZm9yIGFsbCB0aGUgY2xpZW50cycgcmVhZHMgdG8gY29tcGxldGUsCisgICAgICAgICAgICAvLyBzaWduYWwgdGhhdCB0aGlzIHJlYWQgaGFzIGJlZW4gYWJvcnRlZC4KKyAgICAgICAgICAgIHNpZ25hbFJlYWRDb21wbGV0ZV9sb2NrKHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9Cit9CisKK3NwPE1ldGFEYXRhPiBNZWRpYVNvdXJjZVNwbGl0dGVyOjpnZXRGb3JtYXQoaW50IGNsaWVudElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIExPR1YoImdldEZvcm1hdCBjbGllbnQgKCVkKSIsIGNsaWVudElkKTsKKyAgICByZXR1cm4gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Cit9CisKK3N0YXR1c190IE1lZGlhU291cmNlU3BsaXR0ZXI6OnJlYWQoaW50IGNsaWVudElkLAorICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIENIRUNLKGNsaWVudElkID49IDAgJiYgY2xpZW50SWQgPCBtTnVtYmVyT2ZDbGllbnRzKTsKKworICAgIExPR1YoInJlYWQgY2xpZW50ICglZCkiLCBjbGllbnRJZCk7CisgICAgKmJ1ZmZlciA9IE5VTEw7CisKKyAgICBpZiAoIW1DbGllbnRzU3RhcnRlZFtjbGllbnRJZF0pIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChtQ3VycmVudFJlYWRCaXQgIT0gbUNsaWVudHNEZXNpcmVkUmVhZEJpdFtjbGllbnRJZF0pIHsKKyAgICAgICAgLy8gRGVzaXJlZCBidWZmZXIgaGFzIG5vdCBiZWVuIHJlYWQgZnJvbSBzb3VyY2UgeWV0LgorCisgICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGNsaWVudCBpcyB0aGUgc3BlY2lhbCBjbGllbnQgd2l0aCBjbGllbnRJZCA9IDAKKyAgICAgICAgLy8gdGhlbiByZWFkIGZyb20gc291cmNlLCBlbHNlIHdhaXQgdW50aWwgdGhlIGNsaWVudCAwIGhhcyBmaW5pc2hlZAorICAgICAgICAvLyByZWFkaW5nIGZyb20gc291cmNlLgorICAgICAgICBpZiAoY2xpZW50SWQgPT0gMCkgeworICAgICAgICAgICAgLy8gV2FpdCBmb3IgYWxsIGNsaWVudCdzIGxhc3QgcmVhZCB0byBjb21wbGV0ZSBmaXJzdCBzbyBhcyB0byBub3QKKyAgICAgICAgICAgIC8vIGNvcnJ1cHQgdGhlIGJ1ZmZlciBhdCBtTGFzdFJlYWRNZWRpYUJ1ZmZlci4KKyAgICAgICAgICAgIHdhaXRGb3JBbGxDbGllbnRzTGFzdFJlYWRfbG9jayhjbGllbnRJZCk7CisKKyAgICAgICAgICAgIHJlYWRGcm9tU291cmNlX2xvY2sob3B0aW9ucyk7CisgICAgICAgICAgICAqYnVmZmVyID0gbUxhc3RSZWFkTWVkaWFCdWZmZXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3YWl0Rm9yUmVhZEZyb21Tb3VyY2VfbG9jayhjbGllbnRJZCk7CisKKyAgICAgICAgICAgICpidWZmZXIgPSBtTGFzdFJlYWRNZWRpYUJ1ZmZlcjsKKyAgICAgICAgICAgICgqYnVmZmVyKS0+YWRkX3JlZigpOworICAgICAgICB9CisgICAgICAgIENIRUNLKG1DdXJyZW50UmVhZEJpdCA9PSBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0W2NsaWVudElkXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRGVzaXJlZCBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiByZWFkIGZyb20gc291cmNlLiBVc2UgdGhlIGNhY2hlZCBkYXRhLgorICAgICAgICBDSEVDSyhjbGllbnRJZCAhPSAwKTsKKworICAgICAgICAqYnVmZmVyID0gbUxhc3RSZWFkTWVkaWFCdWZmZXI7CisgICAgICAgICgqYnVmZmVyKS0+YWRkX3JlZigpOworICAgIH0KKworICAgIG1DbGllbnRzRGVzaXJlZFJlYWRCaXQuZWRpdEl0ZW1BdChjbGllbnRJZCkgPSAhbUNsaWVudHNEZXNpcmVkUmVhZEJpdFtjbGllbnRJZF07CisgICAgc2lnbmFsUmVhZENvbXBsZXRlX2xvY2soZmFsc2UpOworCisgICAgcmV0dXJuIG1MYXN0UmVhZFN0YXR1czsKK30KKwordm9pZCBNZWRpYVNvdXJjZVNwbGl0dGVyOjpyZWFkRnJvbVNvdXJjZV9sb2NrKGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgIG1MYXN0UmVhZFN0YXR1cyA9IG1Tb3VyY2UtPnJlYWQoJm1MYXN0UmVhZE1lZGlhQnVmZmVyICwgb3B0aW9ucyk7CisKKyAgICBtQ3VycmVudFJlYWRCaXQgPSAhbUN1cnJlbnRSZWFkQml0OworICAgIG1MYXN0UmVhZENvbXBsZXRlZCA9IGZhbHNlOworICAgIG1SZWFkRnJvbVNvdXJjZUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKK30KKwordm9pZCBNZWRpYVNvdXJjZVNwbGl0dGVyOjp3YWl0Rm9yUmVhZEZyb21Tb3VyY2VfbG9jayhpbnQzMl90IGNsaWVudElkKSB7CisgICAgbVJlYWRGcm9tU291cmNlQ29uZGl0aW9uLndhaXQobUxvY2spOworfQorCit2b2lkIE1lZGlhU291cmNlU3BsaXR0ZXI6OndhaXRGb3JBbGxDbGllbnRzTGFzdFJlYWRfbG9jayhpbnQzMl90IGNsaWVudElkKSB7CisgICAgaWYgKG1MYXN0UmVhZENvbXBsZXRlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1BbGxSZWFkc0NvbXBsZXRlQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIENIRUNLKG1MYXN0UmVhZENvbXBsZXRlZCk7Cit9CisKK3ZvaWQgTWVkaWFTb3VyY2VTcGxpdHRlcjo6c2lnbmFsUmVhZENvbXBsZXRlX2xvY2soYm9vbCByZWFkQWJvcnRlZCkgeworICAgIGlmICghcmVhZEFib3J0ZWQpIHsKKyAgICAgICAgbU51bWJlck9mQ3VycmVudFJlYWRzKys7CisgICAgfQorCisgICAgaWYgKG1OdW1iZXJPZkN1cnJlbnRSZWFkcyA9PSBtTnVtYmVyT2ZDbGllbnRzU3RhcnRlZCkgeworICAgICAgICBtTGFzdFJlYWRDb21wbGV0ZWQgPSB0cnVlOworICAgICAgICBtTnVtYmVyT2ZDdXJyZW50UmVhZHMgPSAwOworICAgICAgICBtQWxsUmVhZHNDb21wbGV0ZUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IE1lZGlhU291cmNlU3BsaXR0ZXI6OnBhdXNlKGludCBjbGllbnRJZCkgeworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworLy8gQ2xpZW50CisKK01lZGlhU291cmNlU3BsaXR0ZXI6OkNsaWVudDo6Q2xpZW50KAorICAgICAgICBzcDxNZWRpYVNvdXJjZVNwbGl0dGVyPiBzcGxpdHRlciwKKyAgICAgICAgaW50MzJfdCBjbGllbnRJZCkgeworICAgIG1TcGxpdHRlciA9IHNwbGl0dGVyOworICAgIG1DbGllbnRJZCA9IGNsaWVudElkOworfQorCitzdGF0dXNfdCBNZWRpYVNvdXJjZVNwbGl0dGVyOjpDbGllbnQ6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICByZXR1cm4gbVNwbGl0dGVyLT5zdGFydChtQ2xpZW50SWQsIHBhcmFtcyk7Cit9CisKK3N0YXR1c190IE1lZGlhU291cmNlU3BsaXR0ZXI6OkNsaWVudDo6c3RvcCgpIHsKKyAgICByZXR1cm4gbVNwbGl0dGVyLT5zdG9wKG1DbGllbnRJZCk7Cit9CisKK3NwPE1ldGFEYXRhPiBNZWRpYVNvdXJjZVNwbGl0dGVyOjpDbGllbnQ6OmdldEZvcm1hdCgpIHsKKyAgICByZXR1cm4gbVNwbGl0dGVyLT5nZXRGb3JtYXQobUNsaWVudElkKTsKK30KKworc3RhdHVzX3QgTWVkaWFTb3VyY2VTcGxpdHRlcjo6Q2xpZW50OjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICByZXR1cm4gbVNwbGl0dGVyLT5yZWFkKG1DbGllbnRJZCwgYnVmZmVyLCBvcHRpb25zKTsKK30KKworc3RhdHVzX3QgTWVkaWFTb3VyY2VTcGxpdHRlcjo6Q2xpZW50OjpwYXVzZSgpIHsKKyAgICByZXR1cm4gbVNwbGl0dGVyLT5wYXVzZShtQ2xpZW50SWQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcAppbmRleCBhYjkyODVkLi4zMzJiYWIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcApAQCAtNDIsNyArNDIsNyBAQAogICAgICAgICBwYXRoLT5zZXRUbyhzbGFzaFBvcyk7CiAgICAgfQogCi0gICAgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIoaG9zdC0+c3RyaW5nKCksICc6Jyk7CisgICAgY29uc3QgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIoaG9zdC0+c3RyaW5nKCksICc6Jyk7CiAKICAgICBpZiAoY29sb25Qb3MgIT0gTlVMTCkgewogICAgICAgICB1bnNpZ25lZCBsb25nIHg7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKaW5kZXggMTY1Y2VjOS4uZjY4YzA4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcApAQCAtMTQ2LDI5ICsxNDYsMzYgQEAKIAogc3RhdGljIGNvbnN0IENvZGVjSW5mbyBrRGVjb2RlckluZm9bXSA9IHsKICAgICB7IE1FRElBX01JTUVUWVBFX0lNQUdFX0pQRUcsICJPTVguVEkuSlBFRy5kZWNvZGUiIH0sCisvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcsICJPTVguTnZpZGlhLm1wMy5kZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHLCAiT01YLlRJLk1QMy5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHLCAiTVAzRGVjb2RlciIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRywgIk9NWC5QVi5tcDNkZWMiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgIk9NWC5USS5BTVIuZGVjb2RlIiB9LAorLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJPTVguTnZpZGlhLmFtci5kZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCAiQU1STkJEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJPTVguUFYuYW1yZGVjIiB9LAorLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJPTVguTnZpZGlhLmFtcndiLmRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJPTVguVEkuV0JBTVIuZGVjb2RlIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCAiQU1SV0JEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJPTVguUFYuYW1yZGVjIiB9LAorLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJPTVguTnZpZGlhLmFhYy5kZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAiT01YLlRJLkFBQy5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJBQUNEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJPTVguUFYuYWFjZGVjIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXLCAiRzcxMURlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcsICJHNzExRGVjb2RlciIgfSwKKy8vICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVguTnZpZGlhLm1wNC5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5xY29tLjd4MzAudmlkZW8uZGVjb2Rlci5tcGVnNCIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnNCIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLlRJLlZpZGVvLkRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk00dkgyNjNEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5QVi5tcGVnNGRlYyIgfSwKKy8vICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5OdmlkaWEuaDI2My5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLnFjb20uN3gzMC52aWRlby5kZWNvZGVyLmgyNjMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5oMjYzIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk00dkgyNjNEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLlBWLmgyNjNkZWMiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguTnZpZGlhLmgyNjQuZGVjb2RlIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLnFjb20uN3gzMC52aWRlby5kZWNvZGVyLmF2YyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuYXZjIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLlRJLlZpZGVvLkRlY29kZXIiIH0sCkBAIC0xOTksNiArMjA2LDcgQEAKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5xY29tLjd4MzAudmlkZW8uZW5jb2Rlci5hdmMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2YyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5USS5WaWRlby5lbmNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLk52aWRpYS5oMjY0LmVuY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJBVkNFbmNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguUFYuYXZjZW5jIiB9LAogfTsKQEAgLTMzNyw2ICszNDUsMTMgQEAKIHVpbnQzMl90IE9NWENvZGVjOjpnZXRDb21wb25lbnRRdWlya3MoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSkgewogICAgIHVpbnQzMl90IHF1aXJrcyA9IDA7CiAKKyAgICBpZiAoIXN0cmNtcChjb21wb25lbnROYW1lLCAiT01YLk52aWRpYS5hbXIuZGVjb2RlciIpIHx8CisgICAgICAgICAhc3RyY21wKGNvbXBvbmVudE5hbWUsICJPTVguTnZpZGlhLmFtcndiLmRlY29kZXIiKSB8fAorICAgICAgICAgIXN0cmNtcChjb21wb25lbnROYW1lLCAiT01YLk52aWRpYS5hYWMuZGVjb2RlciIpIHx8CisgICAgICAgICAhc3RyY21wKGNvbXBvbmVudE5hbWUsICJPTVguTnZpZGlhLm1wMy5kZWNvZGVyIikpIHsKKyAgICAgICAgcXVpcmtzIHw9IGtEZWNvZGVyTGllc0Fib3V0TnVtYmVyT2ZDaGFubmVsczsKKyAgICB9CisKICAgICBpZiAoIXN0cmNtcChjb21wb25lbnROYW1lLCAiT01YLlBWLmF2Y2RlYyIpKSB7CiAgICAgICAgIHF1aXJrcyB8PSBrV2FudHNOQUxGcmFnbWVudHM7CiAgICAgfQpAQCAtODYzLDYgKzg3OCwxMCBAQAogICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0OwogICAgIENIRUNLX0VRKE9LLCBmaW5kVGFyZ2V0Q29sb3JGb3JtYXQobWV0YSwgJmNvbG9yRm9ybWF0KSk7CiAKKyAgICBpZiAoIXN0cmNhc2VjbXAoIk9NWC5OdmlkaWEuaDI2NC5lbmNvZGVyIiwgbUNvbXBvbmVudE5hbWUpKSB7CisgICAgICAgIGNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKKyAgICB9CisKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CiAgICAgT01YX1ZJREVPX1BPUlRERUZJTklUSU9OVFlQRSAqdmlkZW9fZGVmID0gJmRlZi5mb3JtYXQudmlkZW87CkBAIC0xMjA2LDYgKzEyMjUsMTAgQEAKICAgICBoMjY0dHlwZS5iTUJBRkYgPSBPTVhfRkFMU0U7CiAgICAgaDI2NHR5cGUuZUxvb3BGaWx0ZXJNb2RlID0gT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJFbmFibGU7CiAKKyAgICBpZiAoIXN0cmNhc2VjbXAoIk9NWC5OdmlkaWEuaDI2NC5lbmNvZGVyIiwgbUNvbXBvbmVudE5hbWUpKSB7CisgICAgICAgIGgyNjR0eXBlLmVMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbE1heDsKKyAgICB9CisKICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1WaWRlb0F2YywgJmgyNjR0eXBlLCBzaXplb2YoaDI2NHR5cGUpKTsKICAgICBDSEVDS19FUShlcnIsIE9LKTsKQEAgLTE3ODgsNyArMTgxMSw5IEBACiAKICAgICAgICAgY2FzZSBPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkOgogICAgICAgICB7Ci0gICAgICAgICAgICBvblBvcnRTZXR0aW5nc0NoYW5nZWQoZGF0YTEpOworICAgICAgICAgICAgaWYgKGRhdGEyID09IDAgfHwgZGF0YTIgPT0gT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbikgeworICAgICAgICAgICAgICAgIG9uUG9ydFNldHRpbmdzQ2hhbmdlZChkYXRhMSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yMTc4LDYgKzIyMDMsNyBAQAogICAgIENIRUNLX0VRKG1Qb3J0U3RhdHVzW3BvcnRJbmRleF0sIEVOQUJMRUQpOwogICAgIG1Qb3J0U3RhdHVzW3BvcnRJbmRleF0gPSBESVNBQkxJTkc7CiAKKyAgICBDT0RFQ19MT0dWKCJzZW5kaW5nIE9NWF9Db21tYW5kUG9ydERpc2FibGUoJWxkKSIsIHBvcnRJbmRleCk7CiAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgbU9NWC0+c2VuZENvbW1hbmQobU5vZGUsIE9NWF9Db21tYW5kUG9ydERpc2FibGUsIHBvcnRJbmRleCk7CiAgICAgQ0hFQ0tfRVEoZXJyLCBPSyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb1NvdXJjZURvd25TYW1wbGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvU291cmNlRG93blNhbXBsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhN2IwOWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb1NvdXJjZURvd25TYW1wbGVyLmNwcApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVmlkZW9Tb3VyY2VEb3duU2FtcGxlciIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvU291cmNlRG93blNhbXBsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1lVVkltYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvWVVWQ2FudmFzLmg+CisjaW5jbHVkZSAiT01YX1ZpZGVvLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6VmlkZW9Tb3VyY2VEb3duU2FtcGxlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnZpZGVvU291cmNlLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIExPR1YoIkNvbnN0cnVjdCBWaWRlb1NvdXJjZURvd25TYW1wbGVyIik7CisgICAgQ0hFQ0sod2lkdGggPiAwKTsKKyAgICBDSEVDSyhoZWlnaHQgPiAwKTsKKworICAgIG1SZWFsVmlkZW9Tb3VyY2UgPSB2aWRlb1NvdXJjZTsKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0OworCisgICAgbU1ldGEgPSBuZXcgTWV0YURhdGEoKihtUmVhbFZpZGVvU291cmNlLT5nZXRGb3JtYXQoKSkpOworICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmbVJlYWxTb3VyY2VXaWR0aCkpOworICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJm1SZWFsU291cmNlSGVpZ2h0KSk7CisKKyAgICBpZiAoKG1XaWR0aCAhPSBtUmVhbFNvdXJjZVdpZHRoKSB8fCAobUhlaWdodCAhPSBtUmVhbFNvdXJjZUhlaWdodCkpIHsKKyAgICAgICAgLy8gQ2hhbmdlIG1ldGEgZGF0YSBmb3Igd2lkdGggYW5kIGhlaWdodC4KKyAgICAgICAgQ0hFQ0sobVdpZHRoIDw9IG1SZWFsU291cmNlV2lkdGgpOworICAgICAgICBDSEVDSyhtSGVpZ2h0IDw9IG1SZWFsU291cmNlSGVpZ2h0KTsKKworICAgICAgICBtTmVlZERvd25TYW1wbGluZyA9IHRydWU7CisgICAgICAgIGNvbXB1dGVEb3duU2FtcGxpbmdQYXJhbWV0ZXJzKCk7CisgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIG1XaWR0aCk7CisgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBtSGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtTmVlZERvd25TYW1wbGluZyA9IGZhbHNlOworICAgIH0KK30KKworVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6flZpZGVvU291cmNlRG93blNhbXBsZXIoKSB7Cit9CisKK3ZvaWQgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6Y29tcHV0ZURvd25TYW1wbGluZ1BhcmFtZXRlcnMoKSB7CisgICAgbURvd25TYW1wbGVTa2lwWCA9IG1SZWFsU291cmNlV2lkdGggLyBtV2lkdGg7CisgICAgbURvd25TYW1wbGVTa2lwWSA9IG1SZWFsU291cmNlSGVpZ2h0IC8gbUhlaWdodDsKKworICAgIG1Eb3duU2FtcGxlT2Zmc2V0WCA9IG1SZWFsU291cmNlV2lkdGggLSBtRG93blNhbXBsZVNraXBYICogbVdpZHRoOworICAgIG1Eb3duU2FtcGxlT2Zmc2V0WSA9IG1SZWFsU291cmNlSGVpZ2h0IC0gbURvd25TYW1wbGVTa2lwWSAqIG1IZWlnaHQ7Cit9CisKK3ZvaWQgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6ZG93blNhbXBsZVlVVkltYWdlKAorICAgICAgICBjb25zdCBNZWRpYUJ1ZmZlciAmc291cmNlQnVmZmVyLCBNZWRpYUJ1ZmZlciAqKmJ1ZmZlcikgY29uc3QgeworICAgIC8vIGZpbmQgdGhlIFlVViBmb3JtYXQKKyAgICBpbnQzMl90IHNyY0Zvcm1hdDsKKyAgICBDSEVDSyhtTWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJnNyY0Zvcm1hdCkpOworICAgIFlVVkltYWdlOjpZVVZGb3JtYXQgeXV2Rm9ybWF0OworICAgIGlmIChzcmNGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICAgICAgeXV2Rm9ybWF0ID0gWVVWSW1hZ2U6OllVVjQyMFNlbWlQbGFuYXI7CisgICAgfSBlbHNlIGlmIChzcmNGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgeworICAgICAgICB5dXZGb3JtYXQgPSBZVVZJbWFnZTo6WVVWNDIwUGxhbmFyOworICAgIH0KKworICAgIC8vIGFsbG9jYXRlIG1lZGlhQnVmZmVyIGZvciBkb3duIHNhbXBsZWQgaW1hZ2UgYW5kIHNldHVwIGEgY2FudmFzLgorICAgICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoWVVWSW1hZ2U6OmJ1ZmZlclNpemUoeXV2Rm9ybWF0LCBtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBZVVZJbWFnZSB5dXZEb3duU2FtcGxlZEltYWdlKHl1dkZvcm1hdCwKKyAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwKKyAgICAgICAgICAgICh1aW50OF90ICopKCpidWZmZXIpLT5kYXRhKCkpOworICAgIFlVVkNhbnZhcyB5dXZDYW52YXNEb3duU2FtcGxlKHl1dkRvd25TYW1wbGVkSW1hZ2UpOworCisgICAgWVVWSW1hZ2UgeXV2SW1hZ2VTb3VyY2UoeXV2Rm9ybWF0LAorICAgICAgICAgICAgbVJlYWxTb3VyY2VXaWR0aCwgbVJlYWxTb3VyY2VIZWlnaHQsCisgICAgICAgICAgICAodWludDhfdCAqKXNvdXJjZUJ1ZmZlci5kYXRhKCkpOworICAgIHl1dkNhbnZhc0Rvd25TYW1wbGUuZG93bnNhbXBsZShtRG93blNhbXBsZU9mZnNldFgsIG1Eb3duU2FtcGxlT2Zmc2V0WSwKKyAgICAgICAgICAgIG1Eb3duU2FtcGxlU2tpcFgsIG1Eb3duU2FtcGxlU2tpcFksCisgICAgICAgICAgICB5dXZJbWFnZVNvdXJjZSk7Cit9CisKK3N0YXR1c190IFZpZGVvU291cmNlRG93blNhbXBsZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICBMT0dWKCJzdGFydCIpOworICAgIHJldHVybiBtUmVhbFZpZGVvU291cmNlLT5zdGFydCgpOworfQorCitzdGF0dXNfdCBWaWRlb1NvdXJjZURvd25TYW1wbGVyOjpzdG9wKCkgeworICAgIExPR1YoInN0b3AiKTsKKyAgICByZXR1cm4gbVJlYWxWaWRlb1NvdXJjZS0+c3RvcCgpOworfQorCitzcDxNZXRhRGF0YT4gVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6Z2V0Rm9ybWF0KCkgeworICAgIExPR1YoImdldEZvcm1hdCIpOworICAgIHJldHVybiBtTWV0YTsKK30KKworc3RhdHVzX3QgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgTE9HVigicmVhZCIpOworICAgIE1lZGlhQnVmZmVyICpyZWFsQnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1SZWFsVmlkZW9Tb3VyY2UtPnJlYWQoJnJlYWxCdWZmZXIsIG9wdGlvbnMpOworCisgICAgaWYgKG1OZWVkRG93blNhbXBsaW5nKSB7CisgICAgICAgIGRvd25TYW1wbGVZVVZJbWFnZSgqcmVhbEJ1ZmZlciwgYnVmZmVyKTsKKworICAgICAgICBpbnQ2NF90IGZyYW1lVGltZTsKKyAgICAgICAgcmVhbEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJmZyYW1lVGltZSk7CisgICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBmcmFtZVRpbWUpOworCisgICAgICAgIC8vIFdlIGp1c3Qgd2FudCB0aGlzIGJ1ZmZlciB0byBiZSBkZWxldGVkIHdoZW4gdGhlIGVuY29kZXIgcmVsZWFzZXMgaXQuCisgICAgICAgIC8vIFNvIGRvbid0IGFkZCBhIHJlZmVyZW5jZSB0byBpdCBhbmQgc2V0IHRoZSBvYnNlcnZlciB0byBOVUxMLgorICAgICAgICAoKmJ1ZmZlciktPnNldE9ic2VydmVyKE5VTEwpOworCisgICAgICAgIC8vIFRoZSBvcmlnaW5hbCBidWZmZXIgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLiBSZWxlYXNlIGl0LgorICAgICAgICByZWFsQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmJ1ZmZlciA9IHJlYWxCdWZmZXI7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6cGF1c2UoKSB7CisgICAgTE9HVigicGF1c2UiKTsKKyAgICByZXR1cm4gbVJlYWxWaWRlb1NvdXJjZS0+cGF1c2UoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKaW5kZXggYjliYTFiZS4uMmI2MzIzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKQEAgLTYsNyArNiw4IEBACiAgICAgICAgIFNvZnR3YXJlUmVuZGVyZXIuY3BwCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvb3BlbmNvcmUvZXh0ZXJuX2xpYnNfdjIva2hyb25vcy9vcGVubWF4L2luY2x1ZGUKKyAgICAgICAgJChUT1ApL2V4dGVybmFsL29wZW5jb3JlL2V4dGVybl9saWJzX3YyL2tocm9ub3Mvb3Blbm1heC9pbmNsdWRlIFwKKyAgICAgICAgJChUT1ApL2hhcmR3YXJlL21zbTdrCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgICAgXAogICAgICAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICBcCkBAIC0xNyw2ICsxOCwxMSBAQAogICAgICAgICBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnRcCiAgICAgICAgIGxpYmNhbWVyYV9jbGllbnQKIAorIyBpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksbXNtN2spCitpZmVxICgkKFRBUkdFVF9QUk9EVUNUKSxwYXNzaW9uKQorCUxPQ0FMX0NGTEFHUyArPSAtREhBU19ZQ0JDUjQyMF9TUF9BRFJFTk8KK2VuZGlmCisKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X2NvbG9yX2NvbnZlcnNpb24KIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCmluZGV4IGE2ZGJmNjkuLjUwN2ZhNWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKQEAgLTIyLDY1ICsyMiwxNzIgQEAKICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcFBtZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+Ci0jaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KKyNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9TdXJmYWNlLmg+CisjaW5jbHVkZSA8dWkvYW5kcm9pZF9uYXRpdmVfYnVmZmVyLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oPgorCisvLyBYWFg6IFRlbXBvcmFyeSBoYWNrIHRvIGFsbG93IHJlZmVyZW5jaW5nIHRoZSBfQURSRU5PIHBpeGVsIGZvcm1hdCBoZXJlLgorI2luY2x1ZGUgPGxpYmdyYWxsb2MtcXNkOGsvZ3JhbGxvY19wcml2Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogU29mdHdhcmVSZW5kZXJlcjo6U29mdHdhcmVSZW5kZXJlcigKICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQsCi0gICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSwKKyAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAogICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCkKICAgICA6IG1Db2xvckZvcm1hdChjb2xvckZvcm1hdCksCi0gICAgICBtQ29udmVydGVyKGNvbG9yRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUpLAotICAgICAgbUlTdXJmYWNlKHN1cmZhY2UpLAorICAgICAgbUNvbnZlcnRlcihOVUxMKSwKKyAgICAgIG1ZVVZNb2RlKE5vbmUpLAorICAgICAgbVN1cmZhY2Uoc3VyZmFjZSksCiAgICAgICBtRGlzcGxheVdpZHRoKGRpc3BsYXlXaWR0aCksCiAgICAgICBtRGlzcGxheUhlaWdodChkaXNwbGF5SGVpZ2h0KSwKICAgICAgIG1EZWNvZGVkV2lkdGgoZGVjb2RlZFdpZHRoKSwKLSAgICAgIG1EZWNvZGVkSGVpZ2h0KGRlY29kZWRIZWlnaHQpLAotICAgICAgbUZyYW1lU2l6ZShtRGVjb2RlZFdpZHRoICogbURlY29kZWRIZWlnaHQgKiAyKSwgIC8vIFJHQjU2NQotICAgICAgbUluZGV4KDApIHsKLSAgICBtTWVtb3J5SGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZSgiL2Rldi9wbWVtX2Fkc3AiLCAyICogbUZyYW1lU2l6ZSk7Ci0gICAgaWYgKG1NZW1vcnlIZWFwLT5oZWFwSUQoKSA8IDApIHsKLSAgICAgICAgTE9HSSgiQ3JlYXRpbmcgcGh5c2ljYWwgbWVtb3J5IGhlYXAgZmFpbGVkLCByZXZlcnRpbmcgdG8gcmVndWxhciBoZWFwLiIpOwotICAgICAgICBtTWVtb3J5SGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZSgyICogbUZyYW1lU2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3A8TWVtb3J5SGVhcFBtZW0+IHBtZW1IZWFwID0gbmV3IE1lbW9yeUhlYXBQbWVtKG1NZW1vcnlIZWFwKTsKLSAgICAgICAgcG1lbUhlYXAtPnNsYXAoKTsKLSAgICAgICAgbU1lbW9yeUhlYXAgPSBwbWVtSGVhcDsKKyAgICAgIG1EZWNvZGVkSGVpZ2h0KGRlY29kZWRIZWlnaHQpIHsKKyAgICBMT0dJKCJpbnB1dCBmb3JtYXQgPSAlZCIsIG1Db2xvckZvcm1hdCk7CisgICAgTE9HSSgiZGlzcGxheSA9ICVkIHggJWQsIGRlY29kZWQgPSAlZCB4ICVkIiwKKyAgICAgICAgICAgIG1EaXNwbGF5V2lkdGgsIG1EaXNwbGF5SGVpZ2h0LCBtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodCk7CisKKyAgICBpbnQgaGFsRm9ybWF0OworICAgIHN3aXRjaCAobUNvbG9yRm9ybWF0KSB7CisjaWYgSEFTX1lDQkNSNDIwX1NQX0FEUkVOTworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQX0FEUkVOTzsKKyAgICAgICAgICAgIG1ZVVZNb2RlID0gWVVWNDIwVG9ZVVY0MjBzcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAweDdmYTMwYzAwOgorICAgICAgICB7CisgICAgICAgICAgICBoYWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUF9BRFJFTk87CisgICAgICAgICAgICBtWVVWTW9kZSA9IFlVVjQyMHNwVG9ZVVY0MjBzcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaGFsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OworCisgICAgICAgICAgICBtQ29udmVydGVyID0gbmV3IENvbG9yQ29udmVydGVyKAorICAgICAgICAgICAgICAgICAgICBtQ29sb3JGb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NSk7CisgICAgICAgICAgICBDSEVDSyhtQ29udmVydGVyLT5pc1ZhbGlkKCkpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgQ0hFQ0sobUlTdXJmYWNlLmdldCgpICE9IE5VTEwpOworICAgIENIRUNLKG1TdXJmYWNlLmdldCgpICE9IE5VTEwpOwogICAgIENIRUNLKG1EZWNvZGVkV2lkdGggPiAwKTsKICAgICBDSEVDSyhtRGVjb2RlZEhlaWdodCA+IDApOwotICAgIENIRUNLKG1NZW1vcnlIZWFwLT5oZWFwSUQoKSA+PSAwKTsKLSAgICBDSEVDSyhtQ29udmVydGVyLmlzVmFsaWQoKSk7CisgICAgQ0hFQ0sobUNvbnZlcnRlciA9PSBOVUxMIHx8IG1Db252ZXJ0ZXItPmlzVmFsaWQoKSk7CiAKLSAgICBJU3VyZmFjZTo6QnVmZmVySGVhcCBidWZmZXJIZWFwKAotICAgICAgICAgICAgbURpc3BsYXlXaWR0aCwgbURpc3BsYXlIZWlnaHQsCi0gICAgICAgICAgICBtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodCwKLSAgICAgICAgICAgIFBJWEVMX0ZPUk1BVF9SR0JfNTY1LAotICAgICAgICAgICAgbU1lbW9yeUhlYXApOworICAgIENIRUNLX0VRKDAsCisgICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF91c2FnZSgKKyAgICAgICAgICAgIG1TdXJmYWNlLmdldCgpLAorICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX05FVkVSIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTgorICAgICAgICAgICAgfCBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUpKTsKIAotICAgIHN0YXR1c190IGVyciA9IG1JU3VyZmFjZS0+cmVnaXN0ZXJCdWZmZXJzKGJ1ZmZlckhlYXApOwotICAgIENIRUNLX0VRKGVyciwgT0spOworICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtU3VyZmFjZS5nZXQoKSwgMikpOworCisgICAgLy8gV2lkdGggbXVzdCBiZSBtdWx0aXBsZSBvZiAzMj8/PworICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoCisgICAgICAgICAgICAgICAgbVN1cmZhY2UuZ2V0KCksIG1EZWNvZGVkV2lkdGgsIG1EZWNvZGVkSGVpZ2h0LAorICAgICAgICAgICAgICAgIGhhbEZvcm1hdCkpOwogfQogCiBTb2Z0d2FyZVJlbmRlcmVyOjp+U29mdHdhcmVSZW5kZXJlcigpIHsKLSAgICBtSVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7CisgICAgZGVsZXRlIG1Db252ZXJ0ZXI7CisgICAgbUNvbnZlcnRlciA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IEFMSUdOKHNpemVfdCB4LCBzaXplX3QgYWxpZ25tZW50KSB7CisgICAgcmV0dXJuICh4ICsgYWxpZ25tZW50IC0gMSkgJiB+KGFsaWdubWVudCAtIDEpOwogfQogCiB2b2lkIFNvZnR3YXJlUmVuZGVyZXI6OnJlbmRlcigKICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKnBsYXRmb3JtUHJpdmF0ZSkgewotICAgIHNpemVfdCBvZmZzZXQgPSBtSW5kZXggKiBtRnJhbWVTaXplOwotICAgIHZvaWQgKmRzdCA9ICh1aW50OF90ICopbU1lbW9yeUhlYXAtPmdldEJhc2UoKSArIG9mZnNldDsKKyAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCAqYnVmOworICAgIENIRUNLX0VRKDAsIG1TdXJmYWNlLT5kZXF1ZXVlQnVmZmVyKG1TdXJmYWNlLmdldCgpLCAmYnVmKSk7CisgICAgQ0hFQ0tfRVEoMCwgbVN1cmZhY2UtPmxvY2tCdWZmZXIobVN1cmZhY2UuZ2V0KCksIGJ1ZikpOwogCi0gICAgbUNvbnZlcnRlci5jb252ZXJ0KAotICAgICAgICAgICAgbURlY29kZWRXaWR0aCwgbURlY29kZWRIZWlnaHQsCi0gICAgICAgICAgICBkYXRhLCAwLCBkc3QsIDIgKiBtRGVjb2RlZFdpZHRoKTsKKyAgICBHcmFwaGljQnVmZmVyTWFwcGVyICZtYXBwZXIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKTsKIAotICAgIG1JU3VyZmFjZS0+cG9zdEJ1ZmZlcihvZmZzZXQpOwotICAgIG1JbmRleCA9IDEgLSBtSW5kZXg7CisgICAgUmVjdCBib3VuZHMobURlY29kZWRXaWR0aCwgbURlY29kZWRIZWlnaHQpOworCisgICAgdm9pZCAqZHN0OworICAgIENIRUNLX0VRKDAsIG1hcHBlci5sb2NrKAorICAgICAgICAgICAgICAgIGJ1Zi0+aGFuZGxlLCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCBib3VuZHMsICZkc3QpKTsKKworICAgIGlmIChtQ29udmVydGVyKSB7CisgICAgICAgIG1Db252ZXJ0ZXItPmNvbnZlcnQoCisgICAgICAgICAgICAgICAgbURlY29kZWRXaWR0aCwgbURlY29kZWRIZWlnaHQsCisgICAgICAgICAgICAgICAgZGF0YSwgMCwgZHN0LCBidWYtPnN0cmlkZSAqIDIpOworICAgIH0gZWxzZSBpZiAobVlVVk1vZGUgPT0gWVVWNDIwc3BUb1lVVjQyMHNwKSB7CisgICAgICAgIC8vIElucHV0IGFuZCBvdXRwdXQgYXJlIGJvdGggWVVWNDIwc3AsIGJ1dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cworICAgICAgICAvLyBhcmUgZGlmZmVyZW50LgorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSA9IG1EZWNvZGVkV2lkdGg7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisgICAgICAgIHVpbnQ4X3QgKmRzdFkgPSAodWludDhfdCAqKWRzdDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGVjb2RlZEhlaWdodDsgKytpKSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0WSwgc3JjWSwgbURlY29kZWRXaWR0aCk7CisgICAgICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7CisgICAgICAgICAgICBkc3RZICs9IGJ1Zi0+c3RyaWRlOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IHNyY1VWU3RyaWRlID0gKG1EZWNvZGVkV2lkdGggKyAxKSAmIH4xOworICAgICAgICBzaXplX3QgZHN0VVZTdHJpZGUgPSBBTElHTihtRGVjb2RlZFdpZHRoIC8gMiwgMzIpICogMjsKKworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVViA9IChjb25zdCB1aW50OF90ICopZGF0YQorICAgICAgICAgICAgKyBtRGVjb2RlZEhlaWdodCAqIG1EZWNvZGVkV2lkdGg7CisKKyAgICAgICAgc2l6ZV90IGRzdFVWT2Zmc2V0ID0gQUxJR04oQUxJR04obURlY29kZWRIZWlnaHQsIDMyKSAqIGJ1Zi0+c3RyaWRlLCA0MDk2KTsKKyAgICAgICAgdWludDhfdCAqZHN0VVYgPSAodWludDhfdCAqKWRzdCArIGRzdFVWT2Zmc2V0OworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgKG1EZWNvZGVkSGVpZ2h0ICsgMSkgLyAyOyArK2kpIHsKKyAgICAgICAgICAgIG1lbWNweShkc3RVViwgc3JjVVYsIChtRGVjb2RlZFdpZHRoICsgMSkgJiB+MSk7CisgICAgICAgICAgICBzcmNVViArPSBzcmNVVlN0cmlkZTsKKyAgICAgICAgICAgIGRzdFVWICs9IGRzdFVWU3RyaWRlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtWVVWTW9kZSA9PSBZVVY0MjBUb1lVVjQyMHNwKSB7CisgICAgICAgIC8vIElucHV0IGlzIFlVVjQyMCBwbGFuYXIsIG91dHB1dCBpcyBZVVY0MjBzcCwgYWRoZXJlIHRvIHByb3BlcgorICAgICAgICAvLyBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzLgorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSA9IG1EZWNvZGVkV2lkdGg7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisgICAgICAgIHVpbnQ4X3QgKmRzdFkgPSAodWludDhfdCAqKWRzdDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGVjb2RlZEhlaWdodDsgKytpKSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0WSwgc3JjWSwgbURlY29kZWRXaWR0aCk7CisgICAgICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7CisgICAgICAgICAgICBkc3RZICs9IGJ1Zi0+c3RyaWRlOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IHNyY1VWU3RyaWRlID0gKG1EZWNvZGVkV2lkdGggKyAxKSAvIDI7CisgICAgICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IEFMSUdOKG1EZWNvZGVkV2lkdGggLyAyLCAzMikgKiAyOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSAoY29uc3QgdWludDhfdCAqKWRhdGEKKyAgICAgICAgICAgICsgbURlY29kZWRIZWlnaHQgKiBtRGVjb2RlZFdpZHRoOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPQorICAgICAgICAgICAgc3JjVSArICgobURlY29kZWRXaWR0aCArIDEpIC8gMikgKiAoKG1EZWNvZGVkSGVpZ2h0ICsgMSkgLyAyKTsKKworICAgICAgICBzaXplX3QgZHN0VVZPZmZzZXQgPSBBTElHTihBTElHTihtRGVjb2RlZEhlaWdodCwgMzIpICogYnVmLT5zdHJpZGUsIDQwOTYpOworICAgICAgICB1aW50OF90ICpkc3RVViA9ICh1aW50OF90ICopZHN0ICsgZHN0VVZPZmZzZXQ7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAobURlY29kZWRIZWlnaHQgKyAxKSAvIDI7ICsraSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCAobURlY29kZWRXaWR0aCArIDEpIC8gMjsgKytqKSB7CisgICAgICAgICAgICAgICAgZHN0VVZbMiAqIGogKyAxXSA9IHNyY1Vbal07CisgICAgICAgICAgICAgICAgZHN0VVZbMiAqIGpdID0gc3JjVltqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNyY1UgKz0gc3JjVVZTdHJpZGU7CisgICAgICAgICAgICBzcmNWICs9IHNyY1VWU3RyaWRlOworICAgICAgICAgICAgZHN0VVYgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtZW1jcHkoZHN0LCBkYXRhLCBzaXplKTsKKyAgICB9CisKKyAgICBDSEVDS19FUSgwLCBtYXBwZXIudW5sb2NrKGJ1Zi0+aGFuZGxlKSk7CisKKyAgICBDSEVDS19FUSgwLCBtU3VyZmFjZS0+cXVldWVCdWZmZXIobVN1cmZhY2UuZ2V0KCksIGJ1ZikpOworICAgIGJ1ZiA9IE5VTEw7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcAppbmRleCBlZGQ4NjQ4Li4xNzc3MWM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKQEAgLTkwLDcgKzkwLDcgQEAKICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMKTsKICAgICAgICAgb3V0LT5hcHBlbmQodXJsKTsKICAgICB9IGVsc2UgewotICAgICAgICBjaGFyICpzbGFzaFBvcyA9IHN0cnJjaHIoYmFzZVVSTCwgJy8nKTsKKyAgICAgICAgY29uc3QgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7CiAKICAgICAgICAgaWYgKHNsYXNoUG9zID4gJmJhc2VVUkxbNl0pIHsKICAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCwgc2xhc2hQb3MgLSBiYXNlVVJMKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKaW5kZXggNTVlMmMzNi4uZjM0ZWI0NTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCkBAIC03Niw2ICs3Niw3IEBACiAgICAgYm9vbCBpc1BsYXlpbmcoKSBjb25zdDsKIAogICAgIHZvaWQgc2V0SVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+ICZpc3VyZmFjZSk7CisgICAgdm9pZCBzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKICAgICB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJmF1ZGlvU2luayk7CiAgICAgc3RhdHVzX3Qgc2V0TG9vcGluZyhib29sIHNob3VsZExvb3ApOwogCkBAIC0xMTcsNiArMTE4LDcgQEAKICAgICB3cDxNZWRpYVBsYXllckJhc2U+IG1MaXN0ZW5lcjsKIAogICAgIHNwPElTdXJmYWNlPiBtSVN1cmZhY2U7CisgICAgc3A8U3VyZmFjZT4gbVN1cmZhY2U7CiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+IG1BdWRpb1Npbms7CiAKICAgICBTeXN0ZW1UaW1lU291cmNlIG1TeXN0ZW1UaW1lU291cmNlOwpAQCAtMjE5LDYgKzIyMSw3IEBACiAgICAgc3RhdHVzX3Qgc2Vla1RvX2woaW50NjRfdCB0aW1lVXMpOwogICAgIHN0YXR1c190IHBhdXNlX2woKTsKICAgICB2b2lkIGluaXRSZW5kZXJlcl9sKCk7CisgICAgdm9pZCBub3RpZnlWaWRlb1NpemVfbCgpOwogICAgIHZvaWQgc2Vla0F1ZGlvSWZOZWNlc3NhcnlfbCgpOwogCiAgICAgdm9pZCBjYW5jZWxQbGF5ZXJFdmVudHMoYm9vbCBrZWVwQnVmZmVyaW5nR29pbmcgPSBmYWxzZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCmluZGV4IDllZWQwODkuLjhkNTgwNTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCkBAIC0yNCwxNCArMjQsMTQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBJU3VyZmFjZTsKK2NsYXNzIFN1cmZhY2U7CiBjbGFzcyBNZW1vcnlIZWFwQmFzZTsKIAogY2xhc3MgU29mdHdhcmVSZW5kZXJlciA6IHB1YmxpYyBWaWRlb1JlbmRlcmVyIHsKIHB1YmxpYzoKICAgICBTb2Z0d2FyZVJlbmRlcmVyKAogICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQsCi0gICAgICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UsCisgICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKICAgICAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAogICAgICAgICAgICAgc2l6ZV90IGRlY29kZWRXaWR0aCwgc2l6ZV90IGRlY29kZWRIZWlnaHQpOwogCkBAIC00MSwxNCArNDEsMTggQEAKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCB2b2lkICpwbGF0Zm9ybVByaXZhdGUpOwogCiBwcml2YXRlOgorICAgIGVudW0gWVVWTW9kZSB7CisgICAgICAgIE5vbmUsCisgICAgICAgIFlVVjQyMFRvWVVWNDIwc3AsCisgICAgICAgIFlVVjQyMHNwVG9ZVVY0MjBzcCwKKyAgICB9OworCiAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgbUNvbG9yRm9ybWF0OwotICAgIENvbG9yQ29udmVydGVyIG1Db252ZXJ0ZXI7Ci0gICAgc3A8SVN1cmZhY2U+IG1JU3VyZmFjZTsKKyAgICBDb2xvckNvbnZlcnRlciAqbUNvbnZlcnRlcjsKKyAgICBZVVZNb2RlIG1ZVVZNb2RlOworICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOwogICAgIHNpemVfdCBtRGlzcGxheVdpZHRoLCBtRGlzcGxheUhlaWdodDsKICAgICBzaXplX3QgbURlY29kZWRXaWR0aCwgbURlY29kZWRIZWlnaHQ7Ci0gICAgc2l6ZV90IG1GcmFtZVNpemU7Ci0gICAgc3A8TWVtb3J5SGVhcEJhc2U+IG1NZW1vcnlIZWFwOwotICAgIGludCBtSW5kZXg7CiAKICAgICBTb2Z0d2FyZVJlbmRlcmVyKGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7CiAgICAgU29mdHdhcmVSZW5kZXJlciAmb3BlcmF0b3I9KGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCmluZGV4IDZkZTc2MWYuLjg4Yjk2MDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCkBAIC00OTUsMTIgKzQ5NSwxNyBAQAogICAgIH0KIAogICAgIGlmICghaW1wbCkgeworI2lmIDAKICAgICAgICAgTE9HVygiVXNpbmcgc29mdHdhcmUgcmVuZGVyZXIuIik7CiAgICAgICAgIGltcGwgPSBuZXcgU29mdHdhcmVSZW5kZXJlcigKICAgICAgICAgICAgICAgICBjb2xvckZvcm1hdCwKICAgICAgICAgICAgICAgICBzdXJmYWNlLAogICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCwKICAgICAgICAgICAgICAgICBlbmNvZGVkV2lkdGgsIGVuY29kZWRIZWlnaHQpOworI2Vsc2UKKyAgICAgICAgQ0hFQ0soISJTaG91bGQgbm90IGJlIGhlcmUuIik7CisgICAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCiAgICAgfQogCiAgICAgcmV0dXJuIG5ldyBPTVhSZW5kZXJlcihpbXBsKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAppbmRleCBjYmQ0ODM2Li5mZDZhYTYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCkBAIC0xMjksNyArMTI5LDcgQEAKICAgICAgICAgcGF0aC0+c2V0VG8oc2xhc2hQb3MpOwogICAgIH0KIAotICAgIGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKGhvc3QtPmNfc3RyKCksICc6Jyk7CisgICAgY29uc3QgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIoaG9zdC0+Y19zdHIoKSwgJzonKTsKIAogICAgIGlmIChjb2xvblBvcyAhPSBOVUxMKSB7CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgeDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCmluZGV4IDRlYTdmZGEuLjRhOGNjZTg1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKQEAgLTE4Miw3ICsxODIsNyBAQAogICAgIEFTdHJpbmcgZm9ybWF0OwogICAgIGdldEZvcm1hdChpbmRleCwgJmZvcm1hdCk7CiAKLSAgICBjaGFyICpsYXN0U3BhY2VQb3MgPSBzdHJyY2hyKGZvcm1hdC5jX3N0cigpLCAnICcpOworICAgIGNvbnN0IGNoYXIgKmxhc3RTcGFjZVBvcyA9IHN0cnJjaHIoZm9ybWF0LmNfc3RyKCksICcgJyk7CiAgICAgQ0hFQ0sobGFzdFNwYWNlUG9zICE9IE5VTEwpOwogCiAgICAgY2hhciAqZW5kOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKaW5kZXggYjg0OTExNy4uMGFlZmQ1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCkBAIC04NzMsNyArODczLDcgQEAKICAgICAgICAgICAgIG91dC0+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+Y29kZSA9PSBjb2RlKQorICAgICAgICAgICAgcmV0dXJuIGVudHJ5LT5uYW1lOworICAgICAgICBlbnRyeSsrOworICAgIH0KKyAgICByZXR1cm4gIlVOS05PV04iOworfQorCitjb25zdCBjaGFyKiBNdHBEZWJ1Zzo6Z2V0T3BlcmF0aW9uQ29kZU5hbWUoTXRwT3BlcmF0aW9uQ29kZSBjb2RlKSB7CisgICAgcmV0dXJuIGdldENvZGVOYW1lKGNvZGUsIHNPcGVyYXRpb25Db2Rlcyk7Cit9CisKK2NvbnN0IGNoYXIqIE10cERlYnVnOjpnZXRGb3JtYXRDb2RlTmFtZShNdHBPcGVyYXRpb25Db2RlIGNvZGUpIHsKKyAgICByZXR1cm4gZ2V0Q29kZU5hbWUoY29kZSwgc0Zvcm1hdENvZGVzKTsKK30KKworY29uc3QgY2hhciogTXRwRGVidWc6OmdldE9iamVjdFByb3BDb2RlTmFtZShNdHBQcm9wZXJ0eUNvZGUgY29kZSkgeworICAgIHJldHVybiBnZXRDb2RlTmFtZShjb2RlLCBzT2JqZWN0UHJvcENvZGVzKTsKK30KKworY29uc3QgY2hhciogTXRwRGVidWc6OmdldERldmljZVByb3BDb2RlTmFtZShNdHBQcm9wZXJ0eUNvZGUgY29kZSkgeworICAgIHJldHVybiBnZXRDb2RlTmFtZShjb2RlLCBzRGV2aWNlUHJvcENvZGVzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZWJ1Zy5oIGIvbWVkaWEvbXRwL010cERlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1M2UzMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZWJ1Zy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfREVCVUdfSAorI2RlZmluZSBfTVRQX0RFQlVHX0gKKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGVidWcgeworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRPcGVyYXRpb25Db2RlTmFtZShNdHBPcGVyYXRpb25Db2RlIGNvZGUpOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRGb3JtYXRDb2RlTmFtZShNdHBPYmplY3RGb3JtYXQgY29kZSk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE9iamVjdFByb3BDb2RlTmFtZShNdHBQcm9wZXJ0eUNvZGUgY29kZSk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGdldERldmljZVByb3BDb2RlTmFtZShNdHBQcm9wZXJ0eUNvZGUgY29kZSk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9ERUJVR19ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcCBiL21lZGlhL210cC9NdHBEZXZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNjhmNzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcApAQCAtMCwwICsxLDQ5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwRGV2aWNlIgorCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2UuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2VJbmZvLmgiCisjaW5jbHVkZSAiTXRwT2JqZWN0SW5mby5oIgorI2luY2x1ZGUgIk10cFByb3BlcnR5LmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZUluZm8uaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKworI2luY2x1ZGUgPHVzYmhvc3QvdXNiaG9zdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cERldmljZTo6TXRwRGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlKiBkZXZpY2UsIGludCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9pbiwgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfb3V0LAorICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfaW50cikKKyAgICA6ICAgbURldmljZShkZXZpY2UpLAorICAgICAgICBtSW50ZXJmYWNlKGludGVyZmFjZSksCisgICAgICAgIG1FbmRwb2ludEluKGVwX2luKSwKKyAgICAgICAgbUVuZHBvaW50T3V0KGVwX291dCksCisgICAgICAgIG1FbmRwb2ludEludHIoZXBfaW50ciksCisgICAgICAgIG1EZXZpY2VJbmZvKE5VTEwpLAorICAgICAgICBtSUQodXNiX2RldmljZV9nZXRfdW5pcXVlX2lkKGRldmljZSkpLAorICAgICAgICBtU2Vzc2lvbklEKDApLAorICAgICAgICBtVHJhbnNhY3Rpb25JRCgwKQoreworfQorCitNdHBEZXZpY2U6On5NdHBEZXZpY2UoKSB7CisgICAgY2xvc2UoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1EZXZpY2VQcm9wZXJ0aWVzLnNpemUoKTsgaSsrKQorICAgICAgICBkZWxldGUgbURldmljZVByb3BlcnRpZXNbaV07Cit9CisKK3ZvaWQgTXRwRGV2aWNlOjppbml0aWFsaXplKCkgeworICAgIG9wZW5TZXNzaW9uKCk7CisgICAgbURldmljZUluZm8gPSBnZXREZXZpY2VJbmZvKCk7CisgICAgaWYgKG1EZXZpY2VJbmZvKSB7CisgICAgICAgIG1EZXZpY2VJbmZvLT5wcmludCgpOworCisgICAgICAgIGlmIChtRGV2aWNlSW5mby0+bURldmljZVByb3BlcnRpZXMpIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IG1EZXZpY2VJbmZvLT5tRGV2aWNlUHJvcGVydGllcy0+c2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgTXRwRGV2aWNlUHJvcGVydHkgcHJvcENvZGUgPSAoKm1EZXZpY2VJbmZvLT5tRGV2aWNlUHJvcGVydGllcylbaV07CisgICAgICAgICAgICAgICAgTXRwUHJvcGVydHkqIHByb3BlcnR5ID0gZ2V0RGV2aWNlUHJvcERlc2MocHJvcENvZGUpOworICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSkgeworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS0+cHJpbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgbURldmljZVByb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE10cERldmljZTo6Y2xvc2UoKSB7CisgICAgaWYgKG1EZXZpY2UpIHsKKyAgICAgICAgdXNiX2RldmljZV9yZWxlYXNlX2ludGVyZmFjZShtRGV2aWNlLCBtSW50ZXJmYWNlKTsKKyAgICAgICAgdXNiX2RldmljZV9jbG9zZShtRGV2aWNlKTsKKyAgICAgICAgbURldmljZSA9IE5VTEw7CisgICAgfQorfQorCitjb25zdCBjaGFyKiBNdHBEZXZpY2U6OmdldERldmljZU5hbWUoKSB7CisgICAgaWYgKG1EZXZpY2UpCisgICAgICAgIHJldHVybiB1c2JfZGV2aWNlX2dldF9uYW1lKG1EZXZpY2UpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICI/Pz8iOworfQorCitib29sIE10cERldmljZTo6b3BlblNlc3Npb24oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtU2Vzc2lvbklEID0gMDsKKyAgICBtVHJhbnNhY3Rpb25JRCA9IDA7CisgICAgTXRwU2Vzc2lvbklEIG5ld1Nlc3Npb24gPSAxOworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIG5ld1Nlc3Npb24pOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9PUEVOX1NFU1NJT04pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX1NFU1NJT05fQUxSRUFEWV9PUEVOKQorICAgICAgICBuZXdTZXNzaW9uID0gbVJlc3BvbnNlLmdldFBhcmFtZXRlcigxKTsKKyAgICBlbHNlIGlmIChyZXQgIT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBtU2Vzc2lvbklEID0gbmV3U2Vzc2lvbjsKKyAgICBtVHJhbnNhY3Rpb25JRCA9IDE7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpjbG9zZVNlc3Npb24oKSB7CisgICAgLy8gRklYTUUKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworTXRwRGV2aWNlSW5mbyogTXRwRGV2aWNlOjpnZXREZXZpY2VJbmZvKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9JTkZPKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFyZWFkRGF0YSgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgTXRwRGV2aWNlSW5mbyogaW5mbyA9IG5ldyBNdHBEZXZpY2VJbmZvOworICAgICAgICBpbmZvLT5yZWFkKG1EYXRhKTsKKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitNdHBTdG9yYWdlSURMaXN0KiBNdHBEZXZpY2U6OmdldFN0b3JhZ2VJRHMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JRFMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIXJlYWREYXRhKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICByZXR1cm4gbURhdGEuZ2V0QVVJbnQzMigpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworTXRwU3RvcmFnZUluZm8qIE10cERldmljZTo6Z2V0U3RvcmFnZUluZm8oTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgc3RvcmFnZUlEKTsKKyAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSU5GTykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIE10cFN0b3JhZ2VJbmZvKiBpbmZvID0gbmV3IE10cFN0b3JhZ2VJbmZvKHN0b3JhZ2VJRCk7CisgICAgICAgIGluZm8tPnJlYWQobURhdGEpOworICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK010cE9iamVjdEhhbmRsZUxpc3QqIE10cERldmljZTo6Z2V0T2JqZWN0SGFuZGxlcyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgc3RvcmFnZUlEKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMiwgZm9ybWF0KTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMywgcGFyZW50KTsKKyAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9IQU5ETEVTKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFyZWFkRGF0YSgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhLmdldEFVSW50MzIoKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK010cE9iamVjdEluZm8qIE10cERldmljZTo6Z2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICAvLyBGSVhNRSAtIHdlIG1pZ2h0IHdhbnQgdG8gYWRkIHNvbWUgY2FjaGluZyBoZXJlCisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBoYW5kbGUpOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0lORk8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIXJlYWREYXRhKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gbmV3IE10cE9iamVjdEluZm8oaGFuZGxlKTsKKyAgICAgICAgaW5mby0+cmVhZChtRGF0YSk7CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCogTXRwRGV2aWNlOjpnZXRUaHVtYm5haWwoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50JiBvdXRMZW5ndGgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CisgICAgaWYgKHNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX1RIVU1CKSAmJiByZWFkRGF0YSgpKSB7CisgICAgICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICAgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBtRGF0YS5nZXREYXRhKG91dExlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgb3V0TGVuZ3RoID0gMDsKKyAgICByZXR1cm4gTlVMTDsKK30KKworTXRwT2JqZWN0SGFuZGxlIE10cERldmljZTo6c2VuZE9iamVjdEluZm8oTXRwT2JqZWN0SW5mbyogaW5mbykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gaW5mby0+bVBhcmVudDsKKyAgICBpZiAocGFyZW50ID09IDApCisgICAgICAgIHBhcmVudCA9IE1UUF9QQVJFTlRfUk9PVDsKKworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBpbmZvLT5tU3RvcmFnZUlEKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMiwgaW5mby0+bVBhcmVudCk7CisKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bVN0b3JhZ2VJRCk7CisgICAgbURhdGEucHV0VUludDE2KGluZm8tPm1Gb3JtYXQpOworICAgIG1EYXRhLnB1dFVJbnQxNihpbmZvLT5tUHJvdGVjdGlvblN0YXR1cyk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1Db21wcmVzc2VkU2l6ZSk7CisgICAgbURhdGEucHV0VUludDE2KGluZm8tPm1UaHVtYkZvcm1hdCk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1UaHVtYkNvbXByZXNzZWRTaXplKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bVRodW1iUGl4V2lkdGgpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tVGh1bWJQaXhIZWlnaHQpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tSW1hZ2VQaXhXaWR0aCk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1JbWFnZVBpeEhlaWdodCk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1JbWFnZVBpeERlcHRoKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bVBhcmVudCk7CisgICAgbURhdGEucHV0VUludDE2KGluZm8tPm1Bc3NvY2lhdGlvblR5cGUpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tQXNzb2NpYXRpb25EZXNjKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bVNlcXVlbmNlTnVtYmVyKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoaW5mby0+bU5hbWUpOworCisgICAgY2hhciBjcmVhdGVkWzEwMF0sIG1vZGlmaWVkWzEwMF07CisgICAgZm9ybWF0RGF0ZVRpbWUoaW5mby0+bURhdGVDcmVhdGVkLCBjcmVhdGVkLCBzaXplb2YoY3JlYXRlZCkpOworICAgIGZvcm1hdERhdGVUaW1lKGluZm8tPm1EYXRlTW9kaWZpZWQsIG1vZGlmaWVkLCBzaXplb2YobW9kaWZpZWQpKTsKKworICAgIG1EYXRhLnB1dFN0cmluZyhjcmVhdGVkKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcobW9kaWZpZWQpOworICAgIGlmIChpbmZvLT5tS2V5d29yZHMpCisgICAgICAgIG1EYXRhLnB1dFN0cmluZyhpbmZvLT5tS2V5d29yZHMpOworICAgIGVsc2UKKyAgICAgICAgbURhdGEucHV0RW1wdHlTdHJpbmcoKTsKKworICAgaWYgKHNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1RfSU5GTykgJiYgc2VuZERhdGEoKSkgeworICAgICAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgICAgICBpbmZvLT5tU3RvcmFnZUlEID0gbVJlc3BvbnNlLmdldFBhcmFtZXRlcigxKTsKKyAgICAgICAgICAgIGluZm8tPm1QYXJlbnQgPSBtUmVzcG9uc2UuZ2V0UGFyYW1ldGVyKDIpOworICAgICAgICAgICAgaW5mby0+bUhhbmRsZSA9IG1SZXNwb25zZS5nZXRQYXJhbWV0ZXIoMyk7CisgICAgICAgICAgICByZXR1cm4gaW5mby0+bUhhbmRsZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKE10cE9iamVjdEhhbmRsZSktMTsKK30KKworYm9vbCBNdHBEZXZpY2U6OnNlbmRPYmplY3QoTXRwT2JqZWN0SW5mbyogaW5mbywgaW50IHNyY0ZEKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBpbnQgcmVtYWluaW5nID0gaW5mby0+bUNvbXByZXNzZWRTaXplOworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGluZm8tPm1IYW5kbGUpOworICAgIGlmIChzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUKSkgeworICAgICAgICAvLyBzZW5kIGRhdGEgaGVhZGVyCisgICAgICAgIHdyaXRlRGF0YUhlYWRlcihNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNULCByZW1haW5pbmcpOworCisgICAgICAgIGNoYXIgYnVmZmVyWzY1NTM2XTsKKyAgICAgICAgd2hpbGUgKHJlbWFpbmluZyA+IDApIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IHJlYWQoc3JjRkQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIGludCB3cml0dGVuID0gbURhdGEud3JpdGUobUVuZHBvaW50T3V0LCBidWZmZXIsIGNvdW50KTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSBjaGVjayBlcnJvcgorICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSBjb3VudDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIHJldHVybiAocmVtYWluaW5nID09IDAgJiYgcmV0ID09IE1UUF9SRVNQT05TRV9PSyk7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpkZWxldGVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgaGFuZGxlKTsKKyAgICBpZiAoc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9ERUxFVEVfT0JKRUNUKSkgeworICAgICAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworTXRwT2JqZWN0SGFuZGxlIE10cERldmljZTo6Z2V0UGFyZW50KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gZ2V0T2JqZWN0SW5mbyhoYW5kbGUpOworICAgIGlmIChpbmZvKQorICAgICAgICByZXR1cm4gaW5mby0+bVBhcmVudDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKK30KKworTXRwT2JqZWN0SGFuZGxlIE10cERldmljZTo6Z2V0U3RvcmFnZUlEKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gZ2V0T2JqZWN0SW5mbyhoYW5kbGUpOworICAgIGlmIChpbmZvKQorICAgICAgICByZXR1cm4gaW5mby0+bVN0b3JhZ2VJRDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKK30KKworTXRwUHJvcGVydHkqIE10cERldmljZTo6Z2V0RGV2aWNlUHJvcERlc2MoTXRwRGV2aWNlUHJvcGVydHkgY29kZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgY29kZSk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9ERVNDKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFyZWFkRGF0YSgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgTXRwUHJvcGVydHkqIHByb3BlcnR5ID0gbmV3IE10cFByb3BlcnR5OworICAgICAgICBwcm9wZXJ0eS0+cmVhZChtRGF0YSwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2NsYXNzIFJlYWRPYmplY3RUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKK3ByaXZhdGU6CisgICAgTXRwRGV2aWNlKiAgICAgICAgICBtRGV2aWNlOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgbUhhbmRsZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1PYmplY3RTaXplOworICAgIHZvaWQqICAgICAgICAgICAgICAgbUluaXRpYWxEYXRhOworICAgIGludCAgICAgICAgICAgICAgICAgbUluaXRpYWxEYXRhTGVuZ3RoOworICAgIGludCAgICAgICAgICAgICAgICAgbUZEOworCitwdWJsaWM6CisgICAgUmVhZE9iamVjdFRocmVhZChNdHBEZXZpY2UqIGRldmljZSwgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50IG9iamVjdFNpemUpCisgICAgICAgIDogbURldmljZShkZXZpY2UpLAorICAgICAgICAgIG1IYW5kbGUoaGFuZGxlKSwKKyAgICAgICAgICBtT2JqZWN0U2l6ZShvYmplY3RTaXplKSwKKyAgICAgICAgICBtSW5pdGlhbERhdGEoTlVMTCksCisgICAgICAgICAgbUluaXRpYWxEYXRhTGVuZ3RoKDApCisgICAgeworICAgIH0KKworICAgIHZpcnR1YWwgflJlYWRPYmplY3RUaHJlYWQoKSB7CisgICAgICAgIGlmIChtRkQgPj0gMCkKKyAgICAgICAgICAgIGNsb3NlKG1GRCk7CisgICAgICAgIGZyZWUobUluaXRpYWxEYXRhKTsKKyAgICB9CisKKyAgICAvLyByZXR1cm5zIGZpbGUgZGVzY3JpcHRvcgorICAgIGludCBpbml0KCkgeworICAgICAgICBtRGV2aWNlLT5tUmVxdWVzdC5yZXNldCgpOworICAgICAgICBtRGV2aWNlLT5tUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgbUhhbmRsZSk7CisgICAgICAgIGlmIChtRGV2aWNlLT5zZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1QpCisgICAgICAgICAgICAgICAgJiYgbURldmljZS0+bURhdGEucmVhZERhdGFIZWFkZXIobURldmljZS0+bUVuZHBvaW50SW4pKSB7CisKKyAgICAgICAgICAgIC8vIG1EYXRhIHdpbGwgY29udGFpbiBoZWFkZXIgYW5kIHBvc3NpYmx5IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9iamVjdCBkYXRhCisgICAgICAgICAgICBtSW5pdGlhbERhdGEgPSBtRGV2aWNlLT5tRGF0YS5nZXREYXRhKG1Jbml0aWFsRGF0YUxlbmd0aCk7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHBpcGUgZm9yIHRoZSBjbGllbnQgdG8gcmVhZCBmcm9tCisgICAgICAgICAgICBpbnQgcGlwZWZkWzJdOworICAgICAgICAgICAgaWYgKHBpcGUocGlwZWZkKSA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJwaXBlIGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1GRCA9IHBpcGVmZFsxXTsKKyAgICAgICAgICAgIHJldHVybiBwaXBlZmRbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgeworICAgICAgICBpbnQgcmVtYWluaW5nID0gbU9iamVjdFNpemU7CisgICAgICAgIGlmIChtSW5pdGlhbERhdGEpIHsKKyAgICAgICAgICAgIHdyaXRlKG1GRCwgbUluaXRpYWxEYXRhLCBtSW5pdGlhbERhdGFMZW5ndGgpOworICAgICAgICAgICAgcmVtYWluaW5nIC09IG1Jbml0aWFsRGF0YUxlbmd0aDsKKyAgICAgICAgICAgIGZyZWUobUluaXRpYWxEYXRhKTsKKyAgICAgICAgICAgIG1Jbml0aWFsRGF0YSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBjaGFyIGJ1ZmZlclsxNjM4NF07CisgICAgICAgIHdoaWxlIChyZW1haW5pbmcgPiAwKSB7CisgICAgICAgICAgICBpbnQgcmVhZFNpemUgPSAocmVtYWluaW5nID4gc2l6ZW9mKGJ1ZmZlcikgPyBzaXplb2YoYnVmZmVyKSA6IHJlbWFpbmluZyk7CisgICAgICAgICAgICBpbnQgY291bnQgPSBtRGV2aWNlLT5tRGF0YS5yZWFkRGF0YShtRGV2aWNlLT5tRW5kcG9pbnRJbiwgYnVmZmVyLCByZWFkU2l6ZSk7CisgICAgICAgICAgICBpbnQgd3JpdHRlbjsKKyAgICAgICAgICAgIGlmIChjb3VudCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaW50IHdyaXR0ZW4gPSB3cml0ZShtRkQsIGJ1ZmZlciwgY291bnQpOworICAgICAgICAgICAgICAgIC8vIEZJWE1FIGNoZWNrIGVycm9yCisgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IGNvdW50OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSBtRGV2aWNlLT5yZWFkUmVzcG9uc2UoKTsKKyAgICAgICAgbURldmljZS0+bU11dGV4LnVubG9jaygpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfTsKKworICAgIC8vIHJldHVybnMgdGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgYSBwaXBlIHRvIHJlYWQgdGhlIG9iamVjdCdzIGRhdGEKK2ludCBNdHBEZXZpY2U6OnJlYWRPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50IG9iamVjdFNpemUpIHsKKyAgICBtTXV0ZXgubG9jaygpOworCisgICAgUmVhZE9iamVjdFRocmVhZCogdGhyZWFkID0gbmV3IFJlYWRPYmplY3RUaHJlYWQodGhpcywgaGFuZGxlLCBvYmplY3RTaXplKTsKKyAgICBpbnQgZmQgPSB0aHJlYWQtPmluaXQoKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIGRlbGV0ZSB0aHJlYWQ7CisgICAgICAgIG1NdXRleC51bmxvY2soKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0aHJlYWQtPnJ1bigiUmVhZE9iamVjdFRocmVhZCIpOworICAgIH0KKyAgICByZXR1cm4gZmQ7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpzZW5kUmVxdWVzdChNdHBPcGVyYXRpb25Db2RlIG9wZXJhdGlvbikgeworICAgIExPR1YoInNlbmRSZXF1ZXN0OiAlc1xuIiwgTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKG9wZXJhdGlvbikpOworICAgIG1SZXF1ZXN0LnNldE9wZXJhdGlvbkNvZGUob3BlcmF0aW9uKTsKKyAgICBpZiAobVRyYW5zYWN0aW9uSUQgPiAwKQorICAgICAgICBtUmVxdWVzdC5zZXRUcmFuc2FjdGlvbklEKG1UcmFuc2FjdGlvbklEKyspOworICAgIGludCByZXQgPSBtUmVxdWVzdC53cml0ZShtRW5kcG9pbnRPdXQpOworICAgIG1SZXF1ZXN0LmR1bXAoKTsKKyAgICByZXR1cm4gKHJldCA+IDApOworfQorCitib29sIE10cERldmljZTo6c2VuZERhdGEoKSB7CisgICAgTE9HVigic2VuZERhdGFcbiIpOworICAgIG1EYXRhLnNldE9wZXJhdGlvbkNvZGUobVJlcXVlc3QuZ2V0T3BlcmF0aW9uQ29kZSgpKTsKKyAgICBtRGF0YS5zZXRUcmFuc2FjdGlvbklEKG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKSk7CisgICAgaW50IHJldCA9IG1EYXRhLndyaXRlKG1FbmRwb2ludE91dCk7CisgICAgbURhdGEuZHVtcCgpOworICAgIHJldHVybiAocmV0ID4gMCk7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpyZWFkRGF0YSgpIHsKKyAgICBtRGF0YS5yZXNldCgpOworICAgIGludCByZXQgPSBtRGF0YS5yZWFkKG1FbmRwb2ludEluKTsKKyAgICBMT0dWKCJyZWFkRGF0YSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKyAgICBpZiAocmV0ID49IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgbURhdGEuZHVtcCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIExPR1YoInJlYWRSZXNwb25zZSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIE10cERldmljZTo6d3JpdGVEYXRhSGVhZGVyKE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uLCBpbnQgZGF0YUxlbmd0aCkgeworICAgIG1EYXRhLnNldE9wZXJhdGlvbkNvZGUob3BlcmF0aW9uKTsKKyAgICBtRGF0YS5zZXRUcmFuc2FjdGlvbklEKG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKSk7CisgICAgcmV0dXJuICghbURhdGEud3JpdGVEYXRhSGVhZGVyKG1FbmRwb2ludE91dCwgZGF0YUxlbmd0aCkpOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwRGV2aWNlOjpyZWFkUmVzcG9uc2UoKSB7CisgICAgTE9HVigicmVhZFJlc3BvbnNlXG4iKTsKKyAgICBpbnQgcmV0ID0gbVJlc3BvbnNlLnJlYWQobUVuZHBvaW50SW4pOworICAgIGlmIChyZXQgPj0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkgeworICAgICAgICBtUmVzcG9uc2UuZHVtcCgpOworICAgICAgICByZXR1cm4gbVJlc3BvbnNlLmdldFJlc3BvbnNlQ29kZSgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgTE9HRCgicmVhZFJlc3BvbnNlIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmggYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmNDkyZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZXZpY2UuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9ERVZJQ0VfSAorI2RlZmluZSBfTVRQX0RFVklDRV9ICisKKyNpbmNsdWRlICJNdHBSZXF1ZXN0UGFja2V0LmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFJlc3BvbnNlUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworc3RydWN0IHVzYl9kZXZpY2U7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGV2aWNlSW5mbzsKK2NsYXNzIE10cE9iamVjdEluZm87CitjbGFzcyBNdHBTdG9yYWdlSW5mbzsKKworY2xhc3MgTXRwRGV2aWNlIHsKK3ByaXZhdGU6CisgICAgc3RydWN0IHVzYl9kZXZpY2UqICAgICAgbURldmljZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlOworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQqICAgIG1FbmRwb2ludEluOworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQqICAgIG1FbmRwb2ludE91dDsKKyAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50KiAgICBtRW5kcG9pbnRJbnRyOworICAgIE10cERldmljZUluZm8qICAgICAgICAgIG1EZXZpY2VJbmZvOworICAgIE10cFByb3BlcnR5TGlzdCAgICAgICAgIG1EZXZpY2VQcm9wZXJ0aWVzOworCisgICAgLy8gYSB1bmlxdWUgSUQgZm9yIHRoZSBkZXZpY2UKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtSUQ7CisKKyAgICAvLyBjdXJyZW50IHNlc3Npb24gSUQKKyAgICBNdHBTZXNzaW9uSUQgICAgICAgICAgICBtU2Vzc2lvbklEOworICAgIC8vIGN1cnJlbnQgdHJhbnNhY3Rpb24gSUQKKyAgICBNdHBUcmFuc2FjdGlvbklEICAgICAgICBtVHJhbnNhY3Rpb25JRDsKKworICAgIE10cFJlcXVlc3RQYWNrZXQgICAgICAgIG1SZXF1ZXN0OworICAgIE10cERhdGFQYWNrZXQgICAgICAgICAgIG1EYXRhOworICAgIE10cFJlc3BvbnNlUGFja2V0ICAgICAgIG1SZXNwb25zZTsKKworICAgIC8vIHRvIGVuc3VyZSBvbmx5IG9uZSBNVFAgdHJhbnNhY3Rpb24gYXQgYSB0aW1lCisgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbU11dGV4OworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlKiBkZXZpY2UsIGludCBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9pbiwgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfaW50cik7CisgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfk10cERldmljZSgpOworCisgICAgaW5saW5lIGludCAgICAgICAgICAgICAgZ2V0SUQoKSBjb25zdCB7IHJldHVybiBtSUQ7IH0KKworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemUoKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICBjbG9zZSgpOworICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgIGdldERldmljZU5hbWUoKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG9wZW5TZXNzaW9uKCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgY2xvc2VTZXNzaW9uKCk7CisKKyAgICBNdHBEZXZpY2VJbmZvKiAgICAgICAgICBnZXREZXZpY2VJbmZvKCk7CisgICAgTXRwU3RvcmFnZUlETGlzdCogICAgICAgZ2V0U3RvcmFnZUlEcygpOworICAgIE10cFN0b3JhZ2VJbmZvKiAgICAgICAgIGdldFN0b3JhZ2VJbmZvKE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQpOworICAgIE10cE9iamVjdEhhbmRsZUxpc3QqICAgIGdldE9iamVjdEhhbmRsZXMoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCk7CisgICAgTXRwT2JqZWN0SW5mbyogICAgICAgICAgZ2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBnZXRUaHVtYm5haWwoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50JiBvdXRMZW5ndGgpOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgICAgIHNlbmRPYmplY3RJbmZvKE10cE9iamVjdEluZm8qIGluZm8pOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHNlbmRPYmplY3QoTXRwT2JqZWN0SW5mbyogaW5mbywgaW50IHNyY0ZEKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBkZWxldGVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgZ2V0UGFyZW50KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgICAgIGdldFN0b3JhZ2VJRChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKworICAgIE10cFByb3BlcnR5KiAgICAgICAgICAgIGdldERldmljZVByb3BEZXNjKE10cERldmljZVByb3BlcnR5IGNvZGUpOworCisgICAgLy8gcmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciBhIHBpcGUgdG8gcmVhZCB0aGUgb2JqZWN0J3MgZGF0YQorICAgIGludCAgICAgICAgICAgICAgICAgICAgIHJlYWRPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50IG9iamVjdFNpemUpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBSZWFkT2JqZWN0VGhyZWFkOworCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgc2VuZFJlcXVlc3QoTXRwT3BlcmF0aW9uQ29kZSBvcGVyYXRpb24pOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHNlbmREYXRhKCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgcmVhZERhdGEoKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICB3cml0ZURhdGFIZWFkZXIoTXRwT3BlcmF0aW9uQ29kZSBvcGVyYXRpb24sIGludCBkYXRhTGVuZ3RoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgICAgICByZWFkUmVzcG9uc2UoKTsKKworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfREVWSUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmNwcCBiL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTkzMjJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERldmljZUluZm8uY3BwCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cERldmljZUluZm8iCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2VJbmZvLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwRGV2aWNlSW5mbzo6TXRwRGV2aWNlSW5mbygpCisgICAgOiAgIG1TdGFuZGFyZFZlcnNpb24oMCksCisgICAgICAgIG1WZW5kb3JFeHRlbnNpb25JRCgwKSwKKyAgICAgICAgbVZlbmRvckV4dGVuc2lvblZlcnNpb24oMCksCisgICAgICAgIG1WZW5kb3JFeHRlbnNpb25EZXNjKE5VTEwpLAorICAgICAgICBtRnVuY3Rpb25hbENvZGUoMCksCisgICAgICAgIG1PcGVyYXRpb25zKE5VTEwpLAorICAgICAgICBtRXZlbnRzKE5VTEwpLAorICAgICAgICBtRGV2aWNlUHJvcGVydGllcyhOVUxMKSwKKyAgICAgICAgbUNhcHR1cmVGb3JtYXRzKE5VTEwpLAorICAgICAgICBtUGxheWJhY2tGb3JtYXRzKE5VTEwpLAorICAgICAgICBtTWFudWZhY3R1cmVyKE5VTEwpLAorICAgICAgICBtTW9kZWwoTlVMTCksCisgICAgICAgIG1WZXJzaW9uKE5VTEwpLAorICAgICAgICBtU2VyaWFsKE5VTEwpCit7Cit9CisKK010cERldmljZUluZm86On5NdHBEZXZpY2VJbmZvKCkgeworICAgIGlmIChtVmVuZG9yRXh0ZW5zaW9uRGVzYykKKyAgICAgICAgZnJlZShtVmVuZG9yRXh0ZW5zaW9uRGVzYyk7CisgICAgZGVsZXRlIG1PcGVyYXRpb25zOworICAgIGRlbGV0ZSBtRXZlbnRzOworICAgIGRlbGV0ZSBtRGV2aWNlUHJvcGVydGllczsKKyAgICBkZWxldGUgbUNhcHR1cmVGb3JtYXRzOworICAgIGRlbGV0ZSBtUGxheWJhY2tGb3JtYXRzOworICAgIGlmIChtTWFudWZhY3R1cmVyKQorICAgICAgICBmcmVlKG1NYW51ZmFjdHVyZXIpOworICAgIGlmIChtTW9kZWwpCisgICAgICAgIGZyZWUobU1vZGVsKTsKKyAgICBpZiAobVZlcnNpb24pCisgICAgICAgIGZyZWUobVZlcnNpb24pOworICAgIGlmIChtU2VyaWFsKQorICAgICAgICBmcmVlKG1TZXJpYWwpOworfQorCit2b2lkIE10cERldmljZUluZm86OnJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgTXRwU3RyaW5nQnVmZmVyIHN0cmluZzsKKworICAgIC8vIHJlYWQgdGhlIGRldmljZSBpbmZvCisgICAgbVN0YW5kYXJkVmVyc2lvbiA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtVmVuZG9yRXh0ZW5zaW9uSUQgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbVZlbmRvckV4dGVuc2lvblZlcnNpb24gPSBwYWNrZXQuZ2V0VUludDE2KCk7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbVZlbmRvckV4dGVuc2lvbkRlc2MgPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworCisgICAgbUZ1bmN0aW9uYWxDb2RlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1PcGVyYXRpb25zID0gcGFja2V0LmdldEFVSW50MTYoKTsKKyAgICBtRXZlbnRzID0gcGFja2V0LmdldEFVSW50MTYoKTsKKyAgICBtRGV2aWNlUHJvcGVydGllcyA9IHBhY2tldC5nZXRBVUludDE2KCk7CisgICAgbUNhcHR1cmVGb3JtYXRzID0gcGFja2V0LmdldEFVSW50MTYoKTsKKyAgICBtUGxheWJhY2tGb3JtYXRzID0gcGFja2V0LmdldEFVSW50MTYoKTsKKworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtTWFudWZhY3R1cmVyID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbU1vZGVsID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbVZlcnNpb24gPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtU2VyaWFsID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKK30KKwordm9pZCBNdHBEZXZpY2VJbmZvOjpwcmludCgpIHsKKyAgICBMT0dWKCJEZXZpY2UgSW5mbzpcblx0bVN0YW5kYXJkVmVyc2lvbjogJWRcblx0bVZlbmRvckV4dGVuc2lvbklEOiAlZFxuXHRtVmVuZG9yRXh0ZW5zaW9uVmVyc2lvbnk6ICVkXG4iLAorICAgICAgICAgICAgbVN0YW5kYXJkVmVyc2lvbiwgbVZlbmRvckV4dGVuc2lvbklELCBtVmVuZG9yRXh0ZW5zaW9uVmVyc2lvbik7CisgICAgTE9HVigiXHRtVmVuZG9yRXh0ZW5zaW9uRGVzYzogJXNcblx0bUZ1bmN0aW9uYWxDb2RlOiAlZFxuXHRtTWFudWZhY3R1cmVyOiAlc1xuXHRtTW9kZWw6ICVzXG5cdG1WZXJzaW9uOiAlc1xuXHRtU2VyaWFsOiAlc1xuIiwKKyAgICAgICAgICAgIG1WZW5kb3JFeHRlbnNpb25EZXNjLCBtRnVuY3Rpb25hbENvZGUsIG1NYW51ZmFjdHVyZXIsIG1Nb2RlbCwgbVZlcnNpb24sIG1TZXJpYWwpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERldmljZUluZm8uaCBiL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiYWExMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9ERVZJQ0VfSU5GT19ICisjZGVmaW5lIF9NVFBfREVWSUNFX0lORk9fSAorCitzdHJ1Y3Qgc3RhdDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworCitjbGFzcyBNdHBEZXZpY2VJbmZvIHsKK3B1YmxpYzoKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICBtU3RhbmRhcmRWZXJzaW9uOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1WZW5kb3JFeHRlbnNpb25JRDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uVmVyc2lvbjsKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uRGVzYzsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICBtRnVuY3Rpb25hbENvZGU7CisgICAgVUludDE2TGlzdCogICAgICAgICAgICAgbU9wZXJhdGlvbnM7CisgICAgVUludDE2TGlzdCogICAgICAgICAgICAgbUV2ZW50czsKKyAgICBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqICBtRGV2aWNlUHJvcGVydGllczsKKyAgICBNdHBPYmplY3RGb3JtYXRMaXN0KiAgICBtQ2FwdHVyZUZvcm1hdHM7CisgICAgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgbVBsYXliYWNrRm9ybWF0czsKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICBtTWFudWZhY3R1cmVyOworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgIG1Nb2RlbDsKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICBtVmVyc2lvbjsKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICBtU2VyaWFsOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGV2aWNlSW5mbygpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NdHBEZXZpY2VJbmZvKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICByZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICBwcmludCgpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfREVWSUNFX0lORk9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEV2ZW50UGFja2V0LmNwcCBiL21lZGlhL210cC9NdHBFdmVudFBhY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3NDU0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBFdmVudFBhY2tldC5jcHAKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwRXZlbnRQYWNrZXQiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKyNpZmRlZiBNVFBfREVWSUNFCisjaW5jbHVkZSA8bGludXgvdXNiL2ZfbXRwLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIk10cEV2ZW50UGFja2V0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwRXZlbnRQYWNrZXQ6Ok10cEV2ZW50UGFja2V0KCkKKyAgICA6ICAgTXRwUGFja2V0KDUxMikKK3sKK30KKworTXRwRXZlbnRQYWNrZXQ6On5NdHBFdmVudFBhY2tldCgpIHsKK30KKworI2lmZGVmIE1UUF9ERVZJQ0UKK2ludCBNdHBFdmVudFBhY2tldDo6d3JpdGUoaW50IGZkKSB7CisgICAgc3RydWN0IG10cF9ldmVudCAgICBldmVudDsKKworICAgIHB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIG1QYWNrZXRTaXplKTsKKyAgICBwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX0VWRU5UKTsKKworICAgIGV2ZW50LmRhdGEgPSBtQnVmZmVyOworICAgIGV2ZW50Lmxlbmd0aCA9IG1QYWNrZXRTaXplOworICAgIGludCByZXQgPSA6OmlvY3RsKGZkLCBNVFBfU0VORF9FVkVOVCwgKHVuc2lnbmVkIGxvbmcpJmV2ZW50KTsKKyAgICByZXR1cm4gKHJldCA8IDAgPyByZXQgOiAwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgTVRQX0hPU1QKKyAgICAvLyByZWFkIG91ciBidWZmZXIgZnJvbSB0aGUgZ2l2ZW4gZW5kcG9pbnQKK2ludCBNdHBFdmVudFBhY2tldDo6cmVhZChzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCkgeworICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciwgbUJ1ZmZlclNpemUpOworICAgICBpZiAocmV0ID49IDApCisgICAgICAgIG1QYWNrZXRTaXplID0gcmV0OworICAgIGVsc2UKKyAgICAgICAgbVBhY2tldFNpemUgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEV2ZW50UGFja2V0LmggYi9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGFlODY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cEV2ZW50UGFja2V0LmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9FVkVOVF9QQUNLRVRfSAorI2RlZmluZSBfTVRQX0VWRU5UX1BBQ0tFVF9ICisKKyNpbmNsdWRlICJNdHBQYWNrZXQuaCIKKyNpbmNsdWRlICJtdHAuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBFdmVudFBhY2tldCA6IHB1YmxpYyBNdHBQYWNrZXQgeworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBFdmVudFBhY2tldCgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cEV2ZW50UGFja2V0KCk7CisKKyNpZmRlZiBNVFBfREVWSUNFCisgICAgLy8gd3JpdGUgb3VyIGRhdGEgdG8gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvcgorICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGUoaW50IGZkKTsKKyNlbmRpZgorCisjaWZkZWYgTVRQX0hPU1QKKyAgICAvLyByZWFkIG91ciBidWZmZXIgZnJvbSB0aGUgZ2l2ZW4gZW5kcG9pbnQKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWQoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApOworI2VuZGlmCisKKyAgICBpbmxpbmUgTXRwRXZlbnRDb2RlICAgICBnZXRFdmVudENvZGUoKSBjb25zdCB7IHJldHVybiBnZXRDb250YWluZXJDb2RlKCk7IH0KKyAgICBpbmxpbmUgdm9pZCAgICAgICAgICAgICBzZXRFdmVudENvZGUoTXRwRXZlbnRDb2RlIGNvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHNldENvbnRhaW5lckNvZGUoY29kZSk7IH0KK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0VWRU5UX1BBQ0tFVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwT2JqZWN0SW5mby5jcHAgYi9tZWRpYS9tdHAvTXRwT2JqZWN0SW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0MzA0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBPYmplY3RJbmZvLmNwcApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwT2JqZWN0SW5mbyIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cE9iamVjdEluZm8uaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cE9iamVjdEluZm86Ok10cE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkKKyAgICA6ICAgbUhhbmRsZShoYW5kbGUpLAorICAgICAgICBtU3RvcmFnZUlEKDApLAorICAgICAgICBtRm9ybWF0KDApLAorICAgICAgICBtUHJvdGVjdGlvblN0YXR1cygwKSwKKyAgICAgICAgbUNvbXByZXNzZWRTaXplKDApLAorICAgICAgICBtVGh1bWJGb3JtYXQoMCksCisgICAgICAgIG1UaHVtYkNvbXByZXNzZWRTaXplKDApLAorICAgICAgICBtVGh1bWJQaXhXaWR0aCgwKSwKKyAgICAgICAgbVRodW1iUGl4SGVpZ2h0KDApLAorICAgICAgICBtSW1hZ2VQaXhXaWR0aCgwKSwKKyAgICAgICAgbUltYWdlUGl4SGVpZ2h0KDApLAorICAgICAgICBtSW1hZ2VQaXhEZXB0aCgwKSwKKyAgICAgICAgbVBhcmVudCgwKSwKKyAgICAgICAgbUFzc29jaWF0aW9uVHlwZSgwKSwKKyAgICAgICAgbUFzc29jaWF0aW9uRGVzYygwKSwKKyAgICAgICAgbVNlcXVlbmNlTnVtYmVyKDApLAorICAgICAgICBtTmFtZShOVUxMKSwKKyAgICAgICAgbURhdGVDcmVhdGVkKDApLAorICAgICAgICBtRGF0ZU1vZGlmaWVkKDApLAorICAgICAgICBtS2V5d29yZHMoTlVMTCkKK3sKK30KKworTXRwT2JqZWN0SW5mbzo6fk10cE9iamVjdEluZm8oKSB7CisgICAgaWYgKG1OYW1lKQorICAgICAgICBmcmVlKG1OYW1lKTsKKyAgICBpZiAobUtleXdvcmRzKQorICAgICAgICBmcmVlKG1LZXl3b3Jkcyk7Cit9CisKK3ZvaWQgTXRwT2JqZWN0SW5mbzo6cmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgc3RyaW5nOworICAgIHRpbWVfdCB0aW1lOworCisgICAgbVN0b3JhZ2VJRCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtRm9ybWF0ID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1Qcm90ZWN0aW9uU3RhdHVzID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1Db21wcmVzc2VkU2l6ZSA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtVGh1bWJGb3JtYXQgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbVRodW1iQ29tcHJlc3NlZFNpemUgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbVRodW1iUGl4V2lkdGggPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbVRodW1iUGl4SGVpZ2h0ID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1JbWFnZVBpeFdpZHRoID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1JbWFnZVBpeEhlaWdodCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtSW1hZ2VQaXhEZXB0aCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtUGFyZW50ID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1Bc3NvY2lhdGlvblR5cGUgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbUFzc29jaWF0aW9uRGVzYyA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtU2VxdWVuY2VOdW1iZXIgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbU5hbWUgPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIGlmIChwYXJzZURhdGVUaW1lKChjb25zdCBjaGFyKilzdHJpbmcsIHRpbWUpKQorICAgICAgICBtRGF0ZUNyZWF0ZWQgPSB0aW1lOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIGlmIChwYXJzZURhdGVUaW1lKChjb25zdCBjaGFyKilzdHJpbmcsIHRpbWUpKQorICAgICAgICBtRGF0ZU1vZGlmaWVkID0gdGltZTsKKworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtS2V5d29yZHMgPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworfQorCit2b2lkIE10cE9iamVjdEluZm86OnByaW50KCkgeworICAgIExPR0QoIk10cE9iamVjdCBJbmZvICUwOFg6ICVzXG4iLCBtSGFuZGxlLCBtTmFtZSk7CisgICAgTE9HRCgiICBtU3RvcmFnZUlEOiAlMDhYIG1Gb3JtYXQ6ICUwNFggbVByb3RlY3Rpb25TdGF0dXM6ICVkXG4iLAorICAgICAgICAgICAgbVN0b3JhZ2VJRCwgbUZvcm1hdCwgbVByb3RlY3Rpb25TdGF0dXMpOworICAgIExPR0QoIiAgbUNvbXByZXNzZWRTaXplOiAlZCBtVGh1bWJGb3JtYXQ6ICUwNFggbVRodW1iQ29tcHJlc3NlZFNpemU6ICVkXG4iLAorICAgICAgICAgICAgbUNvbXByZXNzZWRTaXplLCBtRm9ybWF0LCBtVGh1bWJDb21wcmVzc2VkU2l6ZSk7CisgICAgTE9HRCgiICBtVGh1bWJQaXhXaWR0aDogJWQgbVRodW1iUGl4SGVpZ2h0OiAlZFxuIiwgbVRodW1iUGl4V2lkdGgsIG1UaHVtYlBpeEhlaWdodCk7CisgICAgTE9HRCgiICBtSW1hZ2VQaXhXaWR0aDogJWQgbUltYWdlUGl4SGVpZ2h0OiAlZCBtSW1hZ2VQaXhEZXB0aDogJWRcbiIsCisgICAgICAgICAgICBtSW1hZ2VQaXhXaWR0aCwgbUltYWdlUGl4SGVpZ2h0LCBtSW1hZ2VQaXhEZXB0aCk7CisgICAgTE9HRCgiICBtUGFyZW50OiAlMDhYIG1Bc3NvY2lhdGlvblR5cGU6ICUwNFggbUFzc29jaWF0aW9uRGVzYzogJTA0WFxuIiwKKyAgICAgICAgICAgIG1QYXJlbnQsIG1Bc3NvY2lhdGlvblR5cGUsIG1Bc3NvY2lhdGlvbkRlc2MpOworICAgIExPR0QoIiAgbVNlcXVlbmNlTnVtYmVyOiAlZCBtRGF0ZUNyZWF0ZWQ6ICVkIG1EYXRlTW9kaWZpZWQ6ICVkIG1LZXl3b3JkczogJXNcbiIsCisgICAgICAgICAgICBtU2VxdWVuY2VOdW1iZXIsIG1EYXRlQ3JlYXRlZCwgbURhdGVNb2RpZmllZCwgbUtleXdvcmRzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBPYmplY3RJbmZvLmggYi9tZWRpYS9tdHAvTXRwT2JqZWN0SW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YTQ0OWNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cE9iamVjdEluZm8uaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX09CSkVDVF9JTkZPX0gKKyNkZWZpbmUgX01UUF9PQkpFQ1RfSU5GT19ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFQYWNrZXQ7CisKK2NsYXNzIE10cE9iamVjdEluZm8geworcHVibGljOgorICAgIE10cE9iamVjdEhhbmRsZSAgICAgbUhhbmRsZTsKKyAgICBNdHBTdG9yYWdlSUQgICAgICAgIG1TdG9yYWdlSUQ7CisgICAgTXRwT2JqZWN0Rm9ybWF0ICAgICBtRm9ybWF0OworICAgIHVpbnQxNl90ICAgICAgICAgICAgbVByb3RlY3Rpb25TdGF0dXM7CisgICAgdWludDMyX3QgICAgICAgICAgICBtQ29tcHJlc3NlZFNpemU7CisgICAgTXRwT2JqZWN0Rm9ybWF0ICAgICBtVGh1bWJGb3JtYXQ7CisgICAgdWludDMyX3QgICAgICAgICAgICBtVGh1bWJDb21wcmVzc2VkU2l6ZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1UaHVtYlBpeFdpZHRoOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbVRodW1iUGl4SGVpZ2h0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgbUltYWdlUGl4V2lkdGg7CisgICAgdWludDMyX3QgICAgICAgICAgICBtSW1hZ2VQaXhIZWlnaHQ7CisgICAgdWludDMyX3QgICAgICAgICAgICBtSW1hZ2VQaXhEZXB0aDsKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgIG1QYXJlbnQ7CisgICAgdWludDE2X3QgICAgICAgICAgICBtQXNzb2NpYXRpb25UeXBlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbUFzc29jaWF0aW9uRGVzYzsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1TZXF1ZW5jZU51bWJlcjsKKyAgICBjaGFyKiAgICAgICAgICAgICAgIG1OYW1lOworICAgIHRpbWVfdCAgICAgICAgICAgICAgbURhdGVDcmVhdGVkOworICAgIHRpbWVfdCAgICAgICAgICAgICAgbURhdGVNb2RpZmllZDsKKyAgICBjaGFyKiAgICAgICAgICAgICAgIG1LZXl3b3JkczsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBPYmplY3RJbmZvKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcHJpbnQoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX09CSkVDVF9JTkZPX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBQYWNrZXQuY3BwIGIvbWVkaWEvbXRwL010cFBhY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiZjhiYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBQYWNrZXQuY3BwCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBQYWNrZXQiCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cFBhY2tldC5oIgorI2luY2x1ZGUgIm10cC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8dXNiaG9zdC91c2Job3N0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwUGFja2V0OjpNdHBQYWNrZXQoaW50IGJ1ZmZlclNpemUpCisgICAgOiAgIG1CdWZmZXIoTlVMTCksCisgICAgICAgIG1CdWZmZXJTaXplKGJ1ZmZlclNpemUpLAorICAgICAgICBtQWxsb2NhdGlvbkluY3JlbWVudChidWZmZXJTaXplKSwKKyAgICAgICAgbVBhY2tldFNpemUoMCkKK3sKKyAgICBtQnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2MoYnVmZmVyU2l6ZSk7CisgICAgaWYgKCFtQnVmZmVyKSB7CisgICAgICAgIExPR0UoIm91dCBvZiBtZW1vcnkhIik7CisgICAgICAgIGFib3J0KCk7CisgICAgfQorfQorCitNdHBQYWNrZXQ6On5NdHBQYWNrZXQoKSB7CisgICAgaWYgKG1CdWZmZXIpCisgICAgICAgIGZyZWUobUJ1ZmZlcik7Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpyZXNldCgpIHsKKyAgICBhbGxvY2F0ZShNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICBtUGFja2V0U2l6ZSA9IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7CisgICAgbWVtc2V0KG1CdWZmZXIsIDAsIG1CdWZmZXJTaXplKTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OmFsbG9jYXRlKGludCBsZW5ndGgpIHsKKyAgICBpZiAobGVuZ3RoID4gbUJ1ZmZlclNpemUpIHsKKyAgICAgICAgaW50IG5ld0xlbmd0aCA9IGxlbmd0aCArIG1BbGxvY2F0aW9uSW5jcmVtZW50OworICAgICAgICBtQnVmZmVyID0gKHVpbnQ4X3QgKilyZWFsbG9jKG1CdWZmZXIsIG5ld0xlbmd0aCk7CisgICAgICAgIGlmICghbUJ1ZmZlcikgeworICAgICAgICAgICAgTE9HRSgib3V0IG9mIG1lbW9yeSEiKTsKKyAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlclNpemUgPSBuZXdMZW5ndGg7CisgICAgfQorfQorCit2b2lkIE10cFBhY2tldDo6ZHVtcCgpIHsKKyNkZWZpbmUgRFVNUF9CWVRFU19QRVJfUk9XICAxNgorICAgIGNoYXIgYnVmZmVyWzUwMF07CisgICAgY2hhciogYnVmcHRyID0gYnVmZmVyOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtUGFja2V0U2l6ZTsgaSsrKSB7CisgICAgICAgIHNwcmludGYoYnVmcHRyLCAiJTAyWCAiLCBtQnVmZmVyW2ldKTsKKyAgICAgICAgYnVmcHRyICs9IHN0cmxlbihidWZwdHIpOworICAgICAgICBpZiAoaSAlIERVTVBfQllURVNfUEVSX1JPVyA9PSAoRFVNUF9CWVRFU19QRVJfUk9XIC0gMSkpIHsKKyAgICAgICAgICAgIExPR1YoIiVzIiwgYnVmZmVyKTsKKyAgICAgICAgICAgIGJ1ZnB0ciA9IGJ1ZmZlcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYnVmcHRyICE9IGJ1ZmZlcikgeworICAgICAgICAvLyBwcmludCBsYXN0IGxpbmUKKyAgICAgICAgTE9HVigiJXMiLCBidWZmZXIpOworICAgIH0KKyAgICBMT0dWKCJcbiIpOworfQorCit1aW50MTZfdCBNdHBQYWNrZXQ6OmdldFVJbnQxNihpbnQgb2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuICgodWludDE2X3QpbUJ1ZmZlcltvZmZzZXQgKyAxXSA8PCA4KSB8ICh1aW50MTZfdCltQnVmZmVyW29mZnNldF07Cit9CisKK3VpbnQzMl90IE10cFBhY2tldDo6Z2V0VUludDMyKGludCBvZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gKCh1aW50MzJfdCltQnVmZmVyW29mZnNldCArIDNdIDw8IDI0KSB8ICgodWludDMyX3QpbUJ1ZmZlcltvZmZzZXQgKyAyXSA8PCAxNikgfAorICAgICAgICAgICAoKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0ICsgMV0gPDwgOCkgIHwgKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0XTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OnB1dFVJbnQxNihpbnQgb2Zmc2V0LCB1aW50MTZfdCB2YWx1ZSkgeworICAgIG1CdWZmZXJbb2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpwdXRVSW50MzIoaW50IG9mZnNldCwgdWludDMyX3QgdmFsdWUpIHsKKyAgICBtQnVmZmVyW29mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbb2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbb2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgICBtQnVmZmVyW29mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMjQpICYgMHhGRik7Cit9CisKK3VpbnQxNl90IE10cFBhY2tldDo6Z2V0Q29udGFpbmVyQ29kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VUludDE2KE1UUF9DT05UQUlORVJfQ09ERV9PRkZTRVQpOworfQorCit2b2lkIE10cFBhY2tldDo6c2V0Q29udGFpbmVyQ29kZSh1aW50MTZfdCBjb2RlKSB7CisgICAgcHV0VUludDE2KE1UUF9DT05UQUlORVJfQ09ERV9PRkZTRVQsIGNvZGUpOworfQorCitNdHBUcmFuc2FjdGlvbklEIE10cFBhY2tldDo6Z2V0VHJhbnNhY3Rpb25JRCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VUludDMyKE1UUF9DT05UQUlORVJfVFJBTlNBQ1RJT05fSURfT0ZGU0VUKTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OnNldFRyYW5zYWN0aW9uSUQoTXRwVHJhbnNhY3Rpb25JRCBpZCkgeworICAgIHB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX1RSQU5TQUNUSU9OX0lEX09GRlNFVCwgaWQpOworfQorCit1aW50MzJfdCBNdHBQYWNrZXQ6OmdldFBhcmFtZXRlcihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgICBpZiAoaW5kZXggPCAxIHx8IGluZGV4ID4gNSkgeworICAgICAgICBMT0dFKCJpbmRleCAlZCBvdXQgb2YgcmFuZ2UgaW4gTXRwUmVxdWVzdFBhY2tldDo6Z2V0UGFyYW1ldGVyIiwgaW5kZXgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGdldFVJbnQzMihNVFBfQ09OVEFJTkVSX1BBUkFNRVRFUl9PRkZTRVQgKyAoaW5kZXggLSAxKSAqIHNpemVvZih1aW50MzJfdCkpOworfQorCit2b2lkIE10cFBhY2tldDo6c2V0UGFyYW1ldGVyKGludCBpbmRleCwgdWludDMyX3QgdmFsdWUpIHsKKyAgICBpZiAoaW5kZXggPCAxIHx8IGluZGV4ID4gNSkgeworICAgICAgICBMT0dFKCJpbmRleCAlZCBvdXQgb2YgcmFuZ2UgaW4gTXRwUmVzcG9uc2VQYWNrZXQ6OnNldFBhcmFtZXRlciIsIGluZGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQgb2Zmc2V0ID0gTVRQX0NPTlRBSU5FUl9QQVJBTUVURVJfT0ZGU0VUICsgKGluZGV4IC0gMSkgKiBzaXplb2YodWludDMyX3QpOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG9mZnNldCArIHNpemVvZih1aW50MzJfdCkpCisgICAgICAgIG1QYWNrZXRTaXplID0gb2Zmc2V0ICsgc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBwdXRVSW50MzIob2Zmc2V0LCB2YWx1ZSk7Cit9CisKKyNpZmRlZiBNVFBfSE9TVAoraW50IE10cFBhY2tldDo6dHJhbnNmZXIoc3RydWN0IHVzYl9lbmRwb2ludCAqZXAsIHZvaWQqIGJ1ZmZlciwgaW50IGxlbmd0aCkgeworICAgIGlmICh1c2JfZW5kcG9pbnRfcXVldWUoZXAsIGJ1ZmZlciwgbGVuZ3RoKSkgeworICAgICAgICBMT0dFKCJ1c2JfZW5kcG9pbnRfcXVldWUgZmFpbGVkLCBlcnJubzogJWQiLCBlcnJubyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaW50IGVwX251bTsKKyAgICByZXR1cm4gdXNiX2VuZHBvaW50X3dhaXQodXNiX2VuZHBvaW50X2dldF9kZXZpY2UoZXApLCAmZXBfbnVtKTsKK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFBhY2tldC5oIGIvbWVkaWEvbXRwL010cFBhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOGQ2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUGFja2V0LmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9QQUNLRVRfSAorI2RlZmluZSBfTVRQX1BBQ0tFVF9ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCitzdHJ1Y3QgdXNiX2VuZHBvaW50OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cFBhY2tldCB7CisKK3Byb3RlY3RlZDoKKyAgICB1aW50OF90KiAgICAgICAgICAgIG1CdWZmZXI7CisgICAgLy8gY3VycmVudCBzaXplIG9mIHRoZSBidWZmZXIKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1CdWZmZXJTaXplOworICAgIC8vIG51bWJlciBvZiBieXRlcyB0byBhZGQgd2hlbiByZXNpemluZyB0aGUgYnVmZmVyCisgICAgaW50ICAgICAgICAgICAgICAgICBtQWxsb2NhdGlvbkluY3JlbWVudDsKKyAgICAvLyBzaXplIG9mIHRoZSBkYXRhIGluIHRoZSBwYWNrZXQKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1QYWNrZXRTaXplOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBQYWNrZXQoaW50IGJ1ZmZlclNpemUpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFBhY2tldCgpOworCisgICAgLy8gc2V0cyBwYWNrZXQgc2l6ZSB0byB0aGUgZGVmYXVsdCBjb250YWluZXIgc2l6ZSBhbmQgc2V0cyBidWZmZXIgdG8gemVybworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVzZXQoKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgYWxsb2NhdGUoaW50IGxlbmd0aCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBkdW1wKCk7CisKKyAgICB1aW50MTZfdCAgICAgICAgICAgIGdldENvbnRhaW5lckNvZGUoKSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNldENvbnRhaW5lckNvZGUodWludDE2X3QgY29kZSk7CisKKyAgICBNdHBUcmFuc2FjdGlvbklEICAgIGdldFRyYW5zYWN0aW9uSUQoKSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNldFRyYW5zYWN0aW9uSUQoTXRwVHJhbnNhY3Rpb25JRCBpZCk7CisKKyAgICB1aW50MzJfdCAgICAgICAgICAgIGdldFBhcmFtZXRlcihpbnQgaW5kZXgpIGNvbnN0OworICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyKGludCBpbmRleCwgdWludDMyX3QgdmFsdWUpOworCisjaWZkZWYgTVRQX0hPU1QKKyAgICBpbnQgICAgICAgICAgICAgICAgIHRyYW5zZmVyKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwLCB2b2lkKiBidWZmZXIsIGludCBsZW5ndGgpOworI2VuZGlmCisKK3Byb3RlY3RlZDoKKyAgICB1aW50MTZfdCAgICAgICAgICAgIGdldFVJbnQxNihpbnQgb2Zmc2V0KSBjb25zdDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIGdldFVJbnQzMihpbnQgb2Zmc2V0KSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQxNihpbnQgb2Zmc2V0LCB1aW50MTZfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRVSW50MzIoaW50IG9mZnNldCwgdWludDMyX3QgdmFsdWUpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfUEFDS0VUX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBQcm9wZXJ0eS5jcHAgYi9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMmFkNmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwCkBAIC0wLDAgKzEsMzI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBQcm9wZXJ0eSIKKworI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBQcm9wZXJ0eS5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorI2luY2x1ZGUgIk10cFV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwUHJvcGVydHk6Ok10cFByb3BlcnR5KCkKKyAgICA6ICAgbUNvZGUoMCksCisgICAgICAgIG1UeXBlKDApLAorICAgICAgICBtV3JpdGVhYmxlKGZhbHNlKSwKKyAgICAgICAgbURlZmF1bHRBcnJheUxlbmd0aCgwKSwKKyAgICAgICAgbURlZmF1bHRBcnJheVZhbHVlcyhOVUxMKSwKKyAgICAgICAgbUN1cnJlbnRBcnJheUxlbmd0aCgwKSwKKyAgICAgICAgbUN1cnJlbnRBcnJheVZhbHVlcyhOVUxMKSwKKyAgICAgICAgbUdyb3VwQ29kZSgwKSwKKyAgICAgICAgbUZvcm1GbGFnKGtGb3JtTm9uZSksCisgICAgICAgIG1FbnVtTGVuZ3RoKDApLAorICAgICAgICBtRW51bVZhbHVlcyhOVUxMKQoreworICAgIG1EZWZhdWx0VmFsdWUuc3RyID0gTlVMTDsKKyAgICBtQ3VycmVudFZhbHVlLnN0ciA9IE5VTEw7CisgICAgbU1pbmltdW1WYWx1ZS5zdHIgPSBOVUxMOworICAgIG1NYXhpbXVtVmFsdWUuc3RyID0gTlVMTDsKK30KKworTXRwUHJvcGVydHk6Ok10cFByb3BlcnR5KE10cFByb3BlcnR5Q29kZSBwcm9wQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGVhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0VmFsdWUpCisgICAgOiAgIG1Db2RlKHByb3BDb2RlKSwKKyAgICAgICAgbVR5cGUodHlwZSksCisgICAgICAgIG1Xcml0ZWFibGUod3JpdGVhYmxlKSwKKyAgICAgICAgbURlZmF1bHRBcnJheUxlbmd0aCgwKSwKKyAgICAgICAgbURlZmF1bHRBcnJheVZhbHVlcyhOVUxMKSwKKyAgICAgICAgbUN1cnJlbnRBcnJheUxlbmd0aCgwKSwKKyAgICAgICAgbUN1cnJlbnRBcnJheVZhbHVlcyhOVUxMKSwKKyAgICAgICAgbUdyb3VwQ29kZSgwKSwKKyAgICAgICAgbUZvcm1GbGFnKGtGb3JtTm9uZSksCisgICAgICAgIG1FbnVtTGVuZ3RoKDApLAorICAgICAgICBtRW51bVZhbHVlcyhOVUxMKQoreworICAgIG1lbXNldCgmbURlZmF1bHRWYWx1ZSwgMCwgc2l6ZW9mKG1EZWZhdWx0VmFsdWUpKTsKKyAgICBtZW1zZXQoJm1DdXJyZW50VmFsdWUsIDAsIHNpemVvZihtQ3VycmVudFZhbHVlKSk7CisgICAgbWVtc2V0KCZtTWluaW11bVZhbHVlLCAwLCBzaXplb2YobU1pbmltdW1WYWx1ZSkpOworICAgIG1lbXNldCgmbU1heGltdW1WYWx1ZSwgMCwgc2l6ZW9mKG1NYXhpbXVtVmFsdWUpKTsKKworICAgIGlmIChkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDg6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS5pOCA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDg6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS51OCA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTY6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS5pMTYgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxNjoKKyAgICAgICAgICAgICAgICBtRGVmYXVsdFZhbHVlLnUxNiA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMzI6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS5pMzIgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQzMjoKKyAgICAgICAgICAgICAgICBtRGVmYXVsdFZhbHVlLnUzMiA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS5pNjQgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgICAgICAgICBtRGVmYXVsdFZhbHVlLnU2NCA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HRSgidW5rbm93biB0eXBlICUwNFggaW4gTXRwUHJvcGVydHk6Ok10cFByb3BlcnR5IiwgdHlwZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK010cFByb3BlcnR5Ojp+TXRwUHJvcGVydHkoKSB7CisgICAgaWYgKG1UeXBlID09IE1UUF9UWVBFX1NUUikgeworICAgICAgICAvLyBmcmVlIGFsbCBzdHJpbmdzCisgICAgICAgIGZyZWUobURlZmF1bHRWYWx1ZS5zdHIpOworICAgICAgICBmcmVlKG1DdXJyZW50VmFsdWUuc3RyKTsKKyAgICAgICAgZnJlZShtTWluaW11bVZhbHVlLnN0cik7CisgICAgICAgIGZyZWUobU1heGltdW1WYWx1ZS5zdHIpOworICAgICAgICBpZiAobURlZmF1bHRBcnJheVZhbHVlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRGVmYXVsdEFycmF5TGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgZnJlZShtRGVmYXVsdEFycmF5VmFsdWVzW2ldLnN0cik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DdXJyZW50QXJyYXlWYWx1ZXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUN1cnJlbnRBcnJheUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGZyZWUobUN1cnJlbnRBcnJheVZhbHVlc1tpXS5zdHIpOworICAgICAgICB9CisgICAgICAgIGlmIChtRW51bVZhbHVlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRW51bUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGZyZWUobUVudW1WYWx1ZXNbaV0uc3RyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWxldGVbXSBtRGVmYXVsdEFycmF5VmFsdWVzOworICAgIGRlbGV0ZVtdIG1DdXJyZW50QXJyYXlWYWx1ZXM7CisgICAgZGVsZXRlW10gbUVudW1WYWx1ZXM7Cit9CisKK3ZvaWQgTXRwUHJvcGVydHk6OnJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBib29sIGRldmljZVByb3ApIHsKKworICAgIG1Db2RlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1UeXBlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1Xcml0ZWFibGUgPSAocGFja2V0LmdldFVJbnQ4KCkgPT0gMSk7CisgICAgc3dpdGNoIChtVHlwZSkgeworICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQ4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxNjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMzI6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMTI4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMTI4OgorICAgICAgICAgICAgbURlZmF1bHRBcnJheVZhbHVlcyA9IHJlYWRBcnJheVZhbHVlcyhwYWNrZXQsIG1EZWZhdWx0QXJyYXlMZW5ndGgpOworICAgICAgICAgICAgbUN1cnJlbnRBcnJheVZhbHVlcyA9IHJlYWRBcnJheVZhbHVlcyhwYWNrZXQsIG1DdXJyZW50QXJyYXlMZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZWFkVmFsdWUocGFja2V0LCBtRGVmYXVsdFZhbHVlKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2VQcm9wKQorICAgICAgICAgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIG1DdXJyZW50VmFsdWUpOworICAgIH0KKyAgICBtR3JvdXBDb2RlID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1Gb3JtRmxhZyA9IHBhY2tldC5nZXRVSW50OCgpOworCisgICAgaWYgKG1Gb3JtRmxhZyA9PSBrRm9ybVJhbmdlKSB7CisgICAgICAgICAgICByZWFkVmFsdWUocGFja2V0LCBtTWluaW11bVZhbHVlKTsKKyAgICAgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIG1NYXhpbXVtVmFsdWUpOworICAgICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgbVN0ZXBTaXplKTsKKyAgICB9IGVsc2UgaWYgKG1Gb3JtRmxhZyA9PSBrRm9ybUVudW0pIHsKKyAgICAgICAgbUVudW1MZW5ndGggPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgICAgIG1FbnVtVmFsdWVzID0gbmV3IE10cFByb3BlcnR5VmFsdWVbbUVudW1MZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1FbnVtTGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZWFkVmFsdWUocGFja2V0LCBtRW51bVZhbHVlc1tpXSk7CisgICAgfQorfQorCisvLyBGSVhNRSAtIG9ubHkgd29ya3MgZm9yIG9iamVjdCBwcm9wZXJ0aWVzCit2b2lkIE10cFByb3BlcnR5Ojp3cml0ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBwYWNrZXQucHV0VUludDE2KG1Db2RlKTsKKyAgICBwYWNrZXQucHV0VUludDE2KG1UeXBlKTsKKyAgICBwYWNrZXQucHV0VUludDgobVdyaXRlYWJsZSA/IDEgOiAwKTsKKworICAgIHN3aXRjaCAobVR5cGUpIHsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMzI6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDY0OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDEyODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDEyODoKKyAgICAgICAgICAgIHdyaXRlQXJyYXlWYWx1ZXMocGFja2V0LCBtRGVmYXVsdEFycmF5VmFsdWVzLCBtRGVmYXVsdEFycmF5TGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1EZWZhdWx0VmFsdWUpOworICAgIH0KKyAgICBwYWNrZXQucHV0VUludDMyKG1Hcm91cENvZGUpOworICAgIHBhY2tldC5wdXRVSW50OChtRm9ybUZsYWcpOworICAgIGlmIChtRm9ybUZsYWcgPT0ga0Zvcm1SYW5nZSkgeworICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1NaW5pbXVtVmFsdWUpOworICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1NYXhpbXVtVmFsdWUpOworICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1TdGVwU2l6ZSk7CisgICAgfSBlbHNlIGlmIChtRm9ybUZsYWcgPT0ga0Zvcm1FbnVtKSB7CisgICAgICAgIHBhY2tldC5wdXRVSW50MTYobUVudW1MZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1FbnVtTGVuZ3RoOyBpKyspCisgICAgICAgICAgICB3cml0ZVZhbHVlKHBhY2tldCwgbUVudW1WYWx1ZXNbaV0pOworICAgIH0KK30KKwordm9pZCBNdHBQcm9wZXJ0eTo6cHJpbnQoKSB7CisgICAgTE9HVigiTXRwUHJvcGVydHkgJTA0WFxuIiwgbUNvZGUpOworICAgIExPR1YoIiAgICB0eXBlICUwNFhcbiIsIG1UeXBlKTsKKyAgICBMT0dWKCIgICAgd3JpdGVhYmxlICVzXG4iLCAobVdyaXRlYWJsZSA/ICJ0cnVlIiA6ICJmYWxzZSIpKTsKK30KKwordm9pZCBNdHBQcm9wZXJ0eTo6cmVhZFZhbHVlKE10cERhdGFQYWNrZXQmIHBhY2tldCwgTXRwUHJvcGVydHlWYWx1ZSYgdmFsdWUpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyOworCisgICAgc3dpdGNoIChtVHlwZSkgeworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDg6CisgICAgICAgICAgICB2YWx1ZS5pOCA9IHBhY2tldC5nZXRJbnQ4KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDg6CisgICAgICAgICAgICB2YWx1ZS51OCA9IHBhY2tldC5nZXRVSW50OCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDE2OgorICAgICAgICAgICAgdmFsdWUuaTE2ID0gcGFja2V0LmdldEludDE2KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxNjoKKyAgICAgICAgICAgIHZhbHVlLnUxNiA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQzMjoKKyAgICAgICAgICAgIHZhbHVlLmkzMiA9IHBhY2tldC5nZXRJbnQzMigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMzI6CisgICAgICAgICAgICB2YWx1ZS51MzIgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UNjQ6CisgICAgICAgICAgICB2YWx1ZS5pNjQgPSBwYWNrZXQuZ2V0SW50NjQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDY0OgorICAgICAgICAgICAgdmFsdWUudTY0ID0gcGFja2V0LmdldFVJbnQ2NCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTI4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxMjg6CisgICAgICAgICAgICBwYWNrZXQuZ2V0SW50MTI4KHZhbHVlLmkxMjgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDEyODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDEyODoKKyAgICAgICAgICAgIHBhY2tldC5nZXRVSW50MTI4KHZhbHVlLnUxMjgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfU1RSOgorICAgICAgICAgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmdCdWZmZXIpOworICAgICAgICAgICAgdmFsdWUuc3RyID0gc3RyZHVwKHN0cmluZ0J1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoInVua25vd24gdHlwZSAlMDRYIGluIE10cFByb3BlcnR5OjpyZWFkVmFsdWUiLCBtVHlwZSk7CisgICAgfQorfQorCit2b2lkIE10cFByb3BlcnR5Ojp3cml0ZVZhbHVlKE10cERhdGFQYWNrZXQmIHBhY2tldCwgTXRwUHJvcGVydHlWYWx1ZSYgdmFsdWUpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyOworCisgICAgc3dpdGNoIChtVHlwZSkgeworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDg6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50OCh2YWx1ZS5pOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDg6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDgodmFsdWUudTgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDE2OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDE2KHZhbHVlLmkxNik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxNjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MTYodmFsdWUudTE2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQzMjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQzMih2YWx1ZS5pMzIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMzI6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDMyKHZhbHVlLnUzMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UNjQ6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50NjQodmFsdWUuaTY0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDY0OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQ2NCh2YWx1ZS51NjQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTI4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxMjg6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MTI4KHZhbHVlLmkxMjgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDEyODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDEyODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MTI4KHZhbHVlLnUxMjgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfU1RSOgorICAgICAgICAgICAgaWYgKHZhbHVlLnN0cikKKyAgICAgICAgICAgICAgICBwYWNrZXQucHV0U3RyaW5nKHZhbHVlLnN0cik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcGFja2V0LnB1dEVtcHR5U3RyaW5nKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoInVua25vd24gdHlwZSAlMDRYIGluIE10cFByb3BlcnR5Ojp3cml0ZVZhbHVlIiwgbVR5cGUpOworICAgIH0KK30KKworTXRwUHJvcGVydHlWYWx1ZSogTXRwUHJvcGVydHk6OnJlYWRBcnJheVZhbHVlcyhNdHBEYXRhUGFja2V0JiBwYWNrZXQsIGludCYgbGVuZ3RoKSB7CisgICAgbGVuZ3RoID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUHJvcGVydHlWYWx1ZSogcmVzdWx0ID0gbmV3IE10cFByb3BlcnR5VmFsdWVbbGVuZ3RoXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICByZWFkVmFsdWUocGFja2V0LCByZXN1bHRbaV0pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgTXRwUHJvcGVydHk6OndyaXRlQXJyYXlWYWx1ZXMoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBNdHBQcm9wZXJ0eVZhbHVlKiB2YWx1ZXMsIGludCBsZW5ndGgpIHsKKyAgICBwYWNrZXQucHV0VUludDMyKGxlbmd0aCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIHZhbHVlc1tpXSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUHJvcGVydHkuaCBiL21lZGlhL210cC9NdHBQcm9wZXJ0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjRlMjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUHJvcGVydHkuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1BST1BFUlRZX0gKKyNkZWZpbmUgX01UUF9QUk9QRVJUWV9ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFQYWNrZXQ7CisKK2NsYXNzIE10cFByb3BlcnR5IHsKK3B1YmxpYzoKKyAgICBNdHBQcm9wZXJ0eUNvZGUgICAgIG1Db2RlOworICAgIE10cERhdGFUeXBlICAgICAgICAgbVR5cGU7CisgICAgYm9vbCAgICAgICAgICAgICAgICBtV3JpdGVhYmxlOworICAgIE10cFByb3BlcnR5VmFsdWUgICAgbURlZmF1bHRWYWx1ZTsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlICAgIG1DdXJyZW50VmFsdWU7CisKKyAgICAvLyBmb3IgYXJyYXkgdHlwZXMKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1EZWZhdWx0QXJyYXlMZW5ndGg7CisgICAgTXRwUHJvcGVydHlWYWx1ZSogICBtRGVmYXVsdEFycmF5VmFsdWVzOworICAgIGludCAgICAgICAgICAgICAgICAgbUN1cnJlbnRBcnJheUxlbmd0aDsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlKiAgIG1DdXJyZW50QXJyYXlWYWx1ZXM7CisKKyAgICBlbnVtIHsKKyAgICAgICAga0Zvcm1Ob25lID0gMCwKKyAgICAgICAga0Zvcm1SYW5nZSA9IDEsCisgICAgICAgIGtGb3JtRW51bSA9IDIsCisgICAgfTsKKworICAgIHVpbnQzMl90ICAgICAgICAgICAgbUdyb3VwQ29kZTsKKyAgICB1aW50OF90ICAgICAgICAgICAgIG1Gb3JtRmxhZzsKKworICAgIC8vIGZvciByYW5nZSBmb3JtCisgICAgTXRwUHJvcGVydHlWYWx1ZSAgICBtTWluaW11bVZhbHVlOworICAgIE10cFByb3BlcnR5VmFsdWUgICAgbU1heGltdW1WYWx1ZTsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlICAgIG1TdGVwU2l6ZTsKKworICAgIC8vIGZvciBlbnVtIGZvcm0KKyAgICBpbnQgICAgICAgICAgICAgICAgIG1FbnVtTGVuZ3RoOworICAgIE10cFByb3BlcnR5VmFsdWUqICAgbUVudW1WYWx1ZXM7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFByb3BlcnR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBQcm9wZXJ0eShNdHBQcm9wZXJ0eUNvZGUgcHJvcENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlYWJsZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0VmFsdWUgPSAwKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBQcm9wZXJ0eSgpOworCisgICAgaW5saW5lIE10cFByb3BlcnR5Q29kZSBnZXRQcm9wZXJ0eUNvZGUoKSBjb25zdCB7IHJldHVybiBtQ29kZTsgfQorCisgICAgdm9pZCAgICAgICAgICAgICAgICByZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCwgYm9vbCBkZXZpY2VQcm9wKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHdyaXRlKE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHByaW50KCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCAgICAgICAgICAgICAgICByZWFkVmFsdWUoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBNdHBQcm9wZXJ0eVZhbHVlJiB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICB3cml0ZVZhbHVlKE10cERhdGFQYWNrZXQmIHBhY2tldCwgTXRwUHJvcGVydHlWYWx1ZSYgdmFsdWUpOworICAgIE10cFByb3BlcnR5VmFsdWUqICAgcmVhZEFycmF5VmFsdWVzKE10cERhdGFQYWNrZXQmIHBhY2tldCwgaW50JiBsZW5ndGgpOworICAgIHZvaWQgICAgICAgICAgICAgICAgd3JpdGVBcnJheVZhbHVlcyhNdHBEYXRhUGFja2V0JiBwYWNrZXQsIE10cFByb3BlcnR5VmFsdWUqIHZhbHVlcywgaW50IGxlbmd0aCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9QUk9QRVJUWV9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUmVxdWVzdFBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwUmVxdWVzdFBhY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjZTU4MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmNwcApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBSZXF1ZXN0UGFja2V0IgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiTXRwUmVxdWVzdFBhY2tldC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFJlcXVlc3RQYWNrZXQ6Ok10cFJlcXVlc3RQYWNrZXQoKQorICAgIDogICBNdHBQYWNrZXQoNTEyKQoreworfQorCitNdHBSZXF1ZXN0UGFja2V0Ojp+TXRwUmVxdWVzdFBhY2tldCgpIHsKK30KKworI2lmZGVmIE1UUF9ERVZJQ0UKK2ludCBNdHBSZXF1ZXN0UGFja2V0OjpyZWFkKGludCBmZCkgeworICAgIGludCByZXQgPSA6OnJlYWQoZmQsIG1CdWZmZXIsIG1CdWZmZXJTaXplKTsKKyAgICBpZiAocmV0ID49IDApCisgICAgICAgIG1QYWNrZXRTaXplID0gcmV0OworICAgIGVsc2UKKyAgICAgICAgbVBhY2tldFNpemUgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgLy8gd3JpdGUgb3VyIGJ1ZmZlciB0byB0aGUgZ2l2ZW4gZW5kcG9pbnQgKGhvc3QgbW9kZSkKK2ludCBNdHBSZXF1ZXN0UGFja2V0Ojp3cml0ZShzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCkKK3sKKyAgICBwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBtUGFja2V0U2l6ZSk7CisgICAgcHV0VUludDE2KE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQsIE1UUF9DT05UQUlORVJfVFlQRV9DT01NQU5EKTsKKyAgICByZXR1cm4gdHJhbnNmZXIoZXAsIG1CdWZmZXIsIG1QYWNrZXRTaXplKTsKK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFJlcXVlc3RQYWNrZXQuaCBiL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1MThmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9SRVFVRVNUX1BBQ0tFVF9ICisjZGVmaW5lIF9NVFBfUkVRVUVTVF9QQUNLRVRfSAorCisjaW5jbHVkZSAiTXRwUGFja2V0LmgiCisjaW5jbHVkZSAibXRwLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwUmVxdWVzdFBhY2tldCA6IHB1YmxpYyBNdHBQYWNrZXQgeworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBSZXF1ZXN0UGFja2V0KCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwUmVxdWVzdFBhY2tldCgpOworCisjaWZkZWYgTVRQX0RFVklDRQorICAgIC8vIGZpbGwgb3VyIGJ1ZmZlciB3aXRoIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkKGludCBmZCk7CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgLy8gd3JpdGUgb3VyIGJ1ZmZlciB0byB0aGUgZ2l2ZW4gZW5kcG9pbnQKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKTsKKyNlbmRpZgorCisgICAgaW5saW5lIE10cE9wZXJhdGlvbkNvZGUgICAgZ2V0T3BlcmF0aW9uQ29kZSgpIGNvbnN0IHsgcmV0dXJuIGdldENvbnRhaW5lckNvZGUoKTsgfQorICAgIGlubGluZSB2b2lkICAgICAgICAgICAgICAgIHNldE9wZXJhdGlvbkNvZGUoTXRwT3BlcmF0aW9uQ29kZSBjb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHNldENvbnRhaW5lckNvZGUoY29kZSk7IH0KK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1JFUVVFU1RfUEFDS0VUX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBSZXNwb25zZVBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZjcxNGVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFJlc3BvbnNlUGFja2V0LmNwcApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBSZXNwb25zZVBhY2tldCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgIk10cFJlc3BvbnNlUGFja2V0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwUmVzcG9uc2VQYWNrZXQ6Ok10cFJlc3BvbnNlUGFja2V0KCkKKyAgICA6ICAgTXRwUGFja2V0KDUxMikKK3sKK30KKworTXRwUmVzcG9uc2VQYWNrZXQ6On5NdHBSZXNwb25zZVBhY2tldCgpIHsKK30KKworI2lmZGVmIE1UUF9ERVZJQ0UKK2ludCBNdHBSZXNwb25zZVBhY2tldDo6d3JpdGUoaW50IGZkKSB7CisgICAgcHV0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCwgbVBhY2tldFNpemUpOworICAgIHB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VULCBNVFBfQ09OVEFJTkVSX1RZUEVfUkVTUE9OU0UpOworICAgIGludCByZXQgPSA6OndyaXRlKGZkLCBtQnVmZmVyLCBtUGFja2V0U2l6ZSk7CisgICAgcmV0dXJuIChyZXQgPCAwID8gcmV0IDogMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgLy8gcmVhZCBvdXIgYnVmZmVyIGZyb20gdGhlIGdpdmVuIGVuZHBvaW50CitpbnQgTXRwUmVzcG9uc2VQYWNrZXQ6OnJlYWQoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApIHsKKyAgICBpbnQgcmV0ID0gdHJhbnNmZXIoZXAsIG1CdWZmZXIsIG1CdWZmZXJTaXplKTsKKyAgICAgaWYgKHJldCA+PSAwKQorICAgICAgICBtUGFja2V0U2l6ZSA9IHJldDsKKyAgICBlbHNlCisgICAgICAgIG1QYWNrZXRTaXplID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBSZXNwb25zZVBhY2tldC5oIGIvbWVkaWEvbXRwL010cFJlc3BvbnNlUGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczZjhmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBSZXNwb25zZVBhY2tldC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfUkVTUE9OU0VfUEFDS0VUX0gKKyNkZWZpbmUgX01UUF9SRVNQT05TRV9QQUNLRVRfSAorCisjaW5jbHVkZSAiTXRwUGFja2V0LmgiCisjaW5jbHVkZSAibXRwLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwUmVzcG9uc2VQYWNrZXQgOiBwdWJsaWMgTXRwUGFja2V0IHsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwUmVzcG9uc2VQYWNrZXQoKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBSZXNwb25zZVBhY2tldCgpOworCisjaWZkZWYgTVRQX0RFVklDRQorICAgIC8vIHdyaXRlIG91ciBkYXRhIHRvIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlKGludCBmZCk7CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgLy8gcmVhZCBvdXIgYnVmZmVyIGZyb20gdGhlIGdpdmVuIGVuZHBvaW50CisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKTsKKyNlbmRpZgorCisgICAgaW5saW5lIE10cFJlc3BvbnNlQ29kZSAgICAgIGdldFJlc3BvbnNlQ29kZSgpIGNvbnN0IHsgcmV0dXJuIGdldENvbnRhaW5lckNvZGUoKTsgfQorICAgIGlubGluZSB2b2lkICAgICAgICAgICAgICAgICBzZXRSZXNwb25zZUNvZGUoTXRwUmVzcG9uc2VDb2RlIGNvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHNldENvbnRhaW5lckNvZGUoY29kZSk7IH0KK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1JFU1BPTlNFX1BBQ0tFVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcCBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ODIxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcApAQCAtMCwwICsxLDczMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJNdHBQcm9wZXJ0eS5oIgorI2luY2x1ZGUgIk10cFNlcnZlci5oIgorI2luY2x1ZGUgIk10cFN0b3JhZ2UuaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKworI2luY2x1ZGUgPGxpbnV4L3VzYi9mX210cC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBNdHBPcGVyYXRpb25Db2RlIGtTdXBwb3J0ZWRPcGVyYXRpb25Db2Rlc1tdID0geworICAgIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9JTkZPLAorICAgIE1UUF9PUEVSQVRJT05fT1BFTl9TRVNTSU9OLAorICAgIE1UUF9PUEVSQVRJT05fQ0xPU0VfU0VTU0lPTiwKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lEUywKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lORk8sCisgICAgTVRQX09QRVJBVElPTl9HRVRfTlVNX09CSkVDVFMsCisgICAgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0hBTkRMRVMsCisgICAgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0lORk8sCisgICAgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNULAorLy8gICAgTVRQX09QRVJBVElPTl9HRVRfVEhVTUIsCisgICAgTVRQX09QRVJBVElPTl9ERUxFVEVfT0JKRUNULAorICAgIE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1RfSU5GTywKKyAgICBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNULAorLy8gICAgTVRQX09QRVJBVElPTl9JTklUSUFURV9DQVBUVVJFLAorLy8gICAgTVRQX09QRVJBVElPTl9GT1JNQVRfU1RPUkUsCisvLyAgICBNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRSwKKy8vICAgIE1UUF9PUEVSQVRJT05fU0VMRl9URVNULAorLy8gICAgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1RFQ1RJT04sCisvLyAgICBNVFBfT1BFUkFUSU9OX1BPV0VSX0RPV04sCisvLyAgICBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9ERVNDLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX1ZBTFVFLAorICAgIE1UUF9PUEVSQVRJT05fU0VUX0RFVklDRV9QUk9QX1ZBTFVFLAorICAgIE1UUF9PUEVSQVRJT05fUkVTRVRfREVWSUNFX1BST1BfVkFMVUUsCisvLyAgICBNVFBfT1BFUkFUSU9OX1RFUk1JTkFURV9PUEVOX0NBUFRVUkUsCisvLyAgICBNVFBfT1BFUkFUSU9OX01PVkVfT0JKRUNULAorLy8gICAgTVRQX09QRVJBVElPTl9DT1BZX09CSkVDVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fR0VUX1BBUlRJQUxfT0JKRUNULAorLy8gICAgTVRQX09QRVJBVElPTl9JTklUSUFURV9PUEVOX0NBUFRVUkUsCisgICAgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BTX1NVUFBPUlRFRCwKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9ERVNDLAorLy8gICAgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfVkFMVUUsCisvLyAgICBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPUF9WQUxVRSwKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUkVGRVJFTkNFUywKKyAgICBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUkVGRVJFTkNFUywKKy8vICAgIE1UUF9PUEVSQVRJT05fU0tJUCwKK307CisKK3N0YXRpYyBjb25zdCBNdHBFdmVudENvZGUga1N1cHBvcnRlZEV2ZW50Q29kZXNbXSA9IHsKKyAgICBNVFBfRVZFTlRfT0JKRUNUX0FEREVELAorICAgIE1UUF9FVkVOVF9PQkpFQ1RfUkVNT1ZFRCwKK307CisKK010cFNlcnZlcjo6TXRwU2VydmVyKGludCBmZCwgTXRwRGF0YWJhc2UqIGRhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICBpbnQgZmlsZUdyb3VwLCBpbnQgZmlsZVBlcm0sIGludCBkaXJlY3RvcnlQZXJtKQorICAgIDogICBtRkQoZmQpLAorICAgICAgICBtRGF0YWJhc2UoZGF0YWJhc2UpLAorICAgICAgICBtRmlsZUdyb3VwKGZpbGVHcm91cCksCisgICAgICAgIG1GaWxlUGVybWlzc2lvbihmaWxlUGVybSksCisgICAgICAgIG1EaXJlY3RvcnlQZXJtaXNzaW9uKGRpcmVjdG9yeVBlcm0pLAorICAgICAgICBtU2Vzc2lvbklEKDApLAorICAgICAgICBtU2Vzc2lvbk9wZW4oZmFsc2UpLAorICAgICAgICBtU2VuZE9iamVjdEhhbmRsZShrSW52YWxpZE9iamVjdEhhbmRsZSksCisgICAgICAgIG1TZW5kT2JqZWN0Rm9ybWF0KDApLAorICAgICAgICBtU2VuZE9iamVjdEZpbGVTaXplKDApCit7Cit9CisKK010cFNlcnZlcjo6fk10cFNlcnZlcigpIHsKK30KKwordm9pZCBNdHBTZXJ2ZXI6OmFkZFN0b3JhZ2UoY29uc3QgY2hhciogZmlsZVBhdGgpIHsKKyAgICBpbnQgaW5kZXggPSBtU3RvcmFnZXMuc2l6ZSgpICsgMTsKKyAgICBpbmRleCB8PSBpbmRleCA8PCAxNjsgICAvLyBzZXQgaGlnaCBhbmQgbG93IHBhcnQgdG8gb3VyIGluZGV4CisgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9IG5ldyBNdHBTdG9yYWdlKGluZGV4LCBmaWxlUGF0aCwgbURhdGFiYXNlKTsKKyAgICBhZGRTdG9yYWdlKHN0b3JhZ2UpOworfQorCitNdHBTdG9yYWdlKiBNdHBTZXJ2ZXI6OmdldFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU3RvcmFnZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9ICBtU3RvcmFnZXNbaV07CisgICAgICAgIGlmIChzdG9yYWdlLT5nZXRTdG9yYWdlSUQoKSA9PSBpZCkKKyAgICAgICAgICAgIHJldHVybiBzdG9yYWdlOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBNdHBTZXJ2ZXI6OnJ1bigpIHsKKyAgICBpbnQgZmQgPSBtRkQ7CisKKyAgICBMT0dWKCJNdHBTZXJ2ZXI6OnJ1biBmZDogJWRcbiIsIGZkKTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludCByZXQgPSBtUmVxdWVzdC5yZWFkKGZkKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIExPR0UoInJlcXVlc3QgcmVhZCByZXR1cm5lZCAlZCwgZXJybm86ICVkIiwgcmV0LCBlcnJubyk7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKSB7CisgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRvIHRvcCBvZiBsb29wIGFuZCB3YWl0IGZvciBuZXh0IGNvbW1hbmQKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uID0gbVJlcXVlc3QuZ2V0T3BlcmF0aW9uQ29kZSgpOworICAgICAgICBNdHBUcmFuc2FjdGlvbklEIHRyYW5zYWN0aW9uID0gbVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpOworCisgICAgICAgIExPR1YoIm9wZXJhdGlvbjogJXMiLCBNdHBEZWJ1Zzo6Z2V0T3BlcmF0aW9uQ29kZU5hbWUob3BlcmF0aW9uKSk7CisgICAgICAgIG1SZXF1ZXN0LmR1bXAoKTsKKworICAgICAgICAvLyBGSVhNRSBuZWVkIHRvIGdlbmVyYWxpemUgdGhpcworICAgICAgICBib29sIGRhdGFJbiA9IChvcGVyYXRpb24gPT0gTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVF9JTkZPCisgICAgICAgICAgICAgICAgICAgIHx8IG9wZXJhdGlvbiA9PSBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUkVGRVJFTkNFUworICAgICAgICAgICAgICAgICAgICB8fCBvcGVyYXRpb24gPT0gTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1BfVkFMVUUKKyAgICAgICAgICAgICAgICAgICAgfHwgb3BlcmF0aW9uID09IE1UUF9PUEVSQVRJT05fU0VUX0RFVklDRV9QUk9QX1ZBTFVFKTsKKyAgICAgICAgaWYgKGRhdGFJbikgeworICAgICAgICAgICAgaW50IHJldCA9IG1EYXRhLnJlYWQoZmQpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJkYXRhIHJlYWQgcmV0dXJuZWQgJWQsIGVycm5vOiAlZCIsIHJldCwgZXJybm8pOworICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRvIHRvcCBvZiBsb29wIGFuZCB3YWl0IGZvciBuZXh0IGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTE9HVigicmVjZWl2ZWQgZGF0YToiKTsKKyAgICAgICAgICAgIG1EYXRhLmR1bXAoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1EYXRhLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGFuZGxlUmVxdWVzdCgpKSB7CisgICAgICAgICAgICBpZiAoIWRhdGFJbiAmJiBtRGF0YS5oYXNEYXRhKCkpIHsKKyAgICAgICAgICAgICAgICBtRGF0YS5zZXRPcGVyYXRpb25Db2RlKG9wZXJhdGlvbik7CisgICAgICAgICAgICAgICAgbURhdGEuc2V0VHJhbnNhY3Rpb25JRCh0cmFuc2FjdGlvbik7CisgICAgICAgICAgICAgICAgTE9HVigic2VuZGluZyBkYXRhOiIpOworICAgICAgICAgICAgICAgIHJldCA9IG1EYXRhLndyaXRlKGZkKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJyZXF1ZXN0IHdyaXRlIHJldHVybmVkICVkLCBlcnJubzogJWQiLCByZXQsIGVycm5vKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRvIHRvcCBvZiBsb29wIGFuZCB3YWl0IGZvciBuZXh0IGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVJlc3BvbnNlLnNldFRyYW5zYWN0aW9uSUQodHJhbnNhY3Rpb24pOworICAgICAgICAgICAgTE9HVigic2VuZGluZyByZXNwb25zZSAlMDRYIiwgbVJlc3BvbnNlLmdldFJlc3BvbnNlQ29kZSgpKTsKKyAgICAgICAgICAgIHJldCA9IG1SZXNwb25zZS53cml0ZShmZCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoInJlcXVlc3Qgd3JpdGUgcmV0dXJuZWQgJWQsIGVycm5vOiAlZCIsIHJldCwgZXJybm8pOworICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRvIHRvcCBvZiBsb29wIGFuZCB3YWl0IGZvciBuZXh0IGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HVigic2tpcHBpbmcgcmVzcG9uc2VcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1TZXNzaW9uT3BlbikKKyAgICAgICAgbURhdGFiYXNlLT5zZXNzaW9uRW5kZWQoKTsKK30KKwordm9pZCBNdHBTZXJ2ZXI6OnNlbmRPYmplY3RBZGRlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgaWYgKG1TZXNzaW9uT3BlbikgeworICAgICAgICBMT0dEKCJzZW5kT2JqZWN0QWRkZWQgJWRcbiIsIGhhbmRsZSk7CisgICAgICAgIG1FdmVudC5zZXRFdmVudENvZGUoTVRQX0VWRU5UX09CSkVDVF9BRERFRCk7CisgICAgICAgIG1FdmVudC5zZXRUcmFuc2FjdGlvbklEKG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKSk7CisgICAgICAgIG1FdmVudC5zZXRQYXJhbWV0ZXIoMSwgaGFuZGxlKTsKKyAgICAgICAgaW50IHJldCA9IG1FdmVudC53cml0ZShtRkQpOworICAgICAgICBMT0dEKCJtRXZlbnQud3JpdGUgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisgICAgfQorfQorCit2b2lkIE10cFNlcnZlcjo6c2VuZE9iamVjdFJlbW92ZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIGlmIChtU2Vzc2lvbk9wZW4pIHsKKyAgICAgICAgTE9HRCgic2VuZE9iamVjdFJlbW92ZWQgJWRcbiIsIGhhbmRsZSk7CisgICAgICAgIG1FdmVudC5zZXRFdmVudENvZGUoTVRQX0VWRU5UX09CSkVDVF9SRU1PVkVEKTsKKyAgICAgICAgbUV2ZW50LnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICAgICAgbUV2ZW50LnNldFBhcmFtZXRlcigxLCBoYW5kbGUpOworICAgICAgICBpbnQgcmV0ID0gbUV2ZW50LndyaXRlKG1GRCk7CisgICAgICAgIExPR0QoIm1FdmVudC53cml0ZSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKyAgICB9Cit9CisKK2Jvb2wgTXRwU2VydmVyOjpoYW5kbGVSZXF1ZXN0KCkgeworICAgIE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uID0gbVJlcXVlc3QuZ2V0T3BlcmF0aW9uQ29kZSgpOworICAgIE10cFJlc3BvbnNlQ29kZSByZXNwb25zZTsKKworICAgIG1SZXNwb25zZS5yZXNldCgpOworCisgICAgaWYgKG1TZW5kT2JqZWN0SGFuZGxlICE9IGtJbnZhbGlkT2JqZWN0SGFuZGxlICYmIG9wZXJhdGlvbiAhPSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUKSB7CisgICAgICAgIC8vIEZJWE1FIC0gbmVlZCB0byBkZWxldGUgbVNlbmRPYmplY3RIYW5kbGUgZnJvbSB0aGUgZGF0YWJhc2UKKyAgICAgICAgTE9HRSgiZXhwZWN0ZWQgU2VuZE9iamVjdCBhZnRlciBTZW5kT2JqZWN0SW5mbyIpOworICAgICAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGtJbnZhbGlkT2JqZWN0SGFuZGxlOworICAgIH0KKworICAgIHN3aXRjaCAob3BlcmF0aW9uKSB7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX0lORk86CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0RGV2aWNlSW5mbygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9PUEVOX1NFU1NJT046CisgICAgICAgICAgICByZXNwb25zZSA9IGRvT3BlblNlc3Npb24oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fQ0xPU0VfU0VTU0lPTjoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9DbG9zZVNlc3Npb24oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSURTOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldFN0b3JhZ2VJRHMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lORk86CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0U3RvcmFnZUluZm8oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QU19TVVBQT1JURUQ6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0UHJvcHNTdXBwb3J0ZWQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9IQU5ETEVTOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldE9iamVjdEhhbmRsZXMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX05VTV9PQkpFQ1RTOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldE51bU9iamVjdHMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9SRUZFUkVOQ0VTOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldE9iamVjdFJlZmVyZW5jZXMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9SRUZFUkVOQ0VTOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb1NldE9iamVjdFJlZmVyZW5jZXMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX1ZBTFVFOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldE9iamVjdFByb3BWYWx1ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1BfVkFMVUU6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvU2V0T2JqZWN0UHJvcFZhbHVlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9WQUxVRToKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXREZXZpY2VQcm9wVmFsdWUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fU0VUX0RFVklDRV9QUk9QX1ZBTFVFOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb1NldERldmljZVByb3BWYWx1ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9SRVNFVF9ERVZJQ0VfUFJPUF9WQUxVRToKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9SZXNldERldmljZVByb3BWYWx1ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0lORk86CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0SW5mbygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldE9iamVjdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVF9JTkZPOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb1NlbmRPYmplY3RJbmZvKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb1NlbmRPYmplY3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fREVMRVRFX09CSkVDVDoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9EZWxldGVPYmplY3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX0RFU0M6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0UHJvcERlc2MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmVzcG9uc2UgPSBNVFBfUkVTUE9OU0VfT1BFUkFUSU9OX05PVF9TVVBQT1JURUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocmVzcG9uc2UgPT0gTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIG1SZXNwb25zZS5zZXRSZXNwb25zZUNvZGUocmVzcG9uc2UpOworICAgIHJldHVybiB0cnVlOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldERldmljZUluZm8oKSB7CisgICAgTXRwU3RyaW5nQnVmZmVyICAgc3RyaW5nOworICAgIGNoYXIgcHJvcF92YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworCisgICAgTXRwT2JqZWN0Rm9ybWF0TGlzdCogcGxheWJhY2tGb3JtYXRzID0gbURhdGFiYXNlLT5nZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMoKTsKKyAgICBNdHBPYmplY3RGb3JtYXRMaXN0KiBjYXB0dXJlRm9ybWF0cyA9IG1EYXRhYmFzZS0+Z2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMoKTsKKyAgICBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqIGRldmljZVByb3BlcnRpZXMgPSBtRGF0YWJhc2UtPmdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMoKTsKKworICAgIC8vIGZpbGwgaW4gZGV2aWNlIGluZm8KKyAgICBtRGF0YS5wdXRVSW50MTYoTVRQX1NUQU5EQVJEX1ZFUlNJT04pOworICAgIG1EYXRhLnB1dFVJbnQzMig2KTsgLy8gTVRQIFZlbmRvciBFeHRlbnNpb24gSUQKKyAgICBtRGF0YS5wdXRVSW50MTYoTVRQX1NUQU5EQVJEX1ZFUlNJT04pOworICAgIHN0cmluZy5zZXQoIm1pY3Jvc29mdC5jb206IDEuMDsiKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgLy8gTVRQIEV4dGVuc2lvbnMKKyAgICBtRGF0YS5wdXRVSW50MTYoMCk7IC8vRnVuY3Rpb25hbCBNb2RlCisgICAgbURhdGEucHV0QVVJbnQxNihrU3VwcG9ydGVkT3BlcmF0aW9uQ29kZXMsCisgICAgICAgICAgICBzaXplb2Yoa1N1cHBvcnRlZE9wZXJhdGlvbkNvZGVzKSAvIHNpemVvZih1aW50MTZfdCkpOyAvLyBPcGVyYXRpb25zIFN1cHBvcnRlZAorICAgIG1EYXRhLnB1dEFVSW50MTYoa1N1cHBvcnRlZEV2ZW50Q29kZXMsCisgICAgICAgICAgICBzaXplb2Yoa1N1cHBvcnRlZEV2ZW50Q29kZXMpIC8gc2l6ZW9mKHVpbnQxNl90KSk7IC8vIEV2ZW50cyBTdXBwb3J0ZWQKKyAgICBtRGF0YS5wdXRBVUludDE2KGRldmljZVByb3BlcnRpZXMpOyAvLyBEZXZpY2UgUHJvcGVydGllcyBTdXBwb3J0ZWQKKyAgICBtRGF0YS5wdXRBVUludDE2KGNhcHR1cmVGb3JtYXRzKTsgLy8gQ2FwdHVyZSBGb3JtYXRzCisgICAgbURhdGEucHV0QVVJbnQxNihwbGF5YmFja0Zvcm1hdHMpOyAgLy8gUGxheWJhY2sgRm9ybWF0cworICAgIC8vIEZJWE1FCisgICAgc3RyaW5nLnNldCgiR29vZ2xlLCBJbmMuIik7CisgICAgbURhdGEucHV0U3RyaW5nKHN0cmluZyk7ICAgLy8gTWFudWZhY3R1cmVyCisKKyAgICBwcm9wZXJ0eV9nZXQoInJvLnByb2R1Y3QubW9kZWwiLCBwcm9wX3ZhbHVlLCAiTVRQIERldmljZSIpOworICAgIHN0cmluZy5zZXQocHJvcF92YWx1ZSk7CisgICAgbURhdGEucHV0U3RyaW5nKHN0cmluZyk7ICAgLy8gTW9kZWwKKyAgICBzdHJpbmcuc2V0KCIxLjAiKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBEZXZpY2UgVmVyc2lvbgorCisgICAgcHJvcGVydHlfZ2V0KCJyby5zZXJpYWxubyIsIHByb3BfdmFsdWUsICI/Pz8/Pz8/PyIpOworICAgIHN0cmluZy5zZXQocHJvcF92YWx1ZSk7CisgICAgbURhdGEucHV0U3RyaW5nKHN0cmluZyk7ICAgLy8gU2VyaWFsIE51bWJlcgorCisgICAgZGVsZXRlIHBsYXliYWNrRm9ybWF0czsKKyAgICBkZWxldGUgY2FwdHVyZUZvcm1hdHM7CisgICAgZGVsZXRlIGRldmljZVByb3BlcnRpZXM7CisKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb09wZW5TZXNzaW9uKCkgeworICAgIGlmIChtU2Vzc2lvbk9wZW4pIHsKKyAgICAgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCBtU2Vzc2lvbklEKTsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX0FMUkVBRFlfT1BFTjsKKyAgICB9CisgICAgbVNlc3Npb25JRCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBtU2Vzc2lvbk9wZW4gPSB0cnVlOworCisgICAgbURhdGFiYXNlLT5zZXNzaW9uU3RhcnRlZCgpOworCisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9DbG9zZVNlc3Npb24oKSB7CisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKyAgICBtU2Vzc2lvbklEID0gMDsKKyAgICBtU2Vzc2lvbk9wZW4gPSBmYWxzZTsKKyAgICBtRGF0YWJhc2UtPnNlc3Npb25FbmRlZCgpOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0U3RvcmFnZUlEcygpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworCisgICAgaW50IGNvdW50ID0gbVN0b3JhZ2VzLnNpemUoKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgbURhdGEucHV0VUludDMyKG1TdG9yYWdlc1tpXS0+Z2V0U3RvcmFnZUlEKCkpOworCisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRTdG9yYWdlSW5mbygpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgICBzdHJpbmc7CisKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIE10cFN0b3JhZ2VJRCBpZCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBTdG9yYWdlKiBzdG9yYWdlID0gZ2V0U3RvcmFnZShpZCk7CisgICAgaWYgKCFzdG9yYWdlKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfU1RPUkFHRV9JRDsKKworICAgIG1EYXRhLnB1dFVJbnQxNihzdG9yYWdlLT5nZXRUeXBlKCkpOworICAgIG1EYXRhLnB1dFVJbnQxNihzdG9yYWdlLT5nZXRGaWxlU3lzdGVtVHlwZSgpKTsKKyAgICBtRGF0YS5wdXRVSW50MTYoc3RvcmFnZS0+Z2V0QWNjZXNzQ2FwYWJpbGl0eSgpKTsKKyAgICBtRGF0YS5wdXRVSW50NjQoc3RvcmFnZS0+Z2V0TWF4Q2FwYWNpdHkoKSk7CisgICAgbURhdGEucHV0VUludDY0KHN0b3JhZ2UtPmdldEZyZWVTcGFjZSgpKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoMTAyNCoxMDI0KjEwMjQpOyAvLyBGcmVlIFNwYWNlIGluIE9iamVjdHMKKyAgICBzdHJpbmcuc2V0KHN0b3JhZ2UtPmdldERlc2NyaXB0aW9uKCkpOworICAgIG1EYXRhLnB1dFN0cmluZyhzdHJpbmcpOworICAgIG1EYXRhLnB1dEVtcHR5U3RyaW5nKCk7ICAgLy8gVm9sdW1lIElkZW50aWZpZXIKKworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0T2JqZWN0UHJvcHNTdXBwb3J0ZWQoKSB7CisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKyAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIE10cERldmljZVByb3BlcnR5TGlzdCogcHJvcGVydGllcyA9IG1EYXRhYmFzZS0+Z2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyhmb3JtYXQpOworICAgIG1EYXRhLnB1dEFVSW50MTYocHJvcGVydGllcyk7CisgICAgZGVsZXRlIHByb3BlcnRpZXM7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RIYW5kbGVzKCkgeworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsgICAgICAvLyAweEZGRkZGRkZGIGZvciBhbGwgc3RvcmFnZQorICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMik7ICAgICAgLy8gMCBmb3IgYWxsIGZvcm1hdHMKKyAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDMpOyAgICAgIC8vIDB4RkZGRkZGRkYgZm9yIG9iamVjdHMgd2l0aCBubyBwYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDB4MDAwMDAwMDAgZm9yIGFsbCBvYmplY3RzPworICAgIGlmIChwYXJlbnQgPT0gMHhGRkZGRkZGRikKKyAgICAgICAgcGFyZW50ID0gMDsKKworICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGhhbmRsZXMgPSBtRGF0YWJhc2UtPmdldE9iamVjdExpc3Qoc3RvcmFnZUlELCBmb3JtYXQsIHBhcmVudCk7CisgICAgbURhdGEucHV0QVVJbnQzMihoYW5kbGVzKTsKKyAgICBkZWxldGUgaGFuZGxlczsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldE51bU9iamVjdHMoKSB7CisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKyAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOyAgICAgIC8vIDB4RkZGRkZGRkYgZm9yIGFsbCBzdG9yYWdlCisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsgICAgICAvLyAwIGZvciBhbGwgZm9ybWF0cworICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMyk7ICAgICAgLy8gMHhGRkZGRkZGRiBmb3Igb2JqZWN0cyB3aXRoIG5vIHBhcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMDAwMDAwMCBmb3IgYWxsIG9iamVjdHM/CisgICAgaWYgKHBhcmVudCA9PSAweEZGRkZGRkZGKQorICAgICAgICBwYXJlbnQgPSAwOworCisgICAgaW50IGNvdW50ID0gbURhdGFiYXNlLT5nZXROdW1PYmplY3RzKHN0b3JhZ2VJRCwgZm9ybWF0LCBwYXJlbnQpOworICAgIGlmIChjb3VudCA+PSAwKSB7CisgICAgICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMSwgY291bnQpOworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworICAgIH0gZWxzZSB7CisgICAgICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMSwgMCk7CisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgIH0KK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RSZWZlcmVuY2VzKCkgeworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisgICAgTXRwU3RvcmFnZUlEIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKworICAgIC8vIEZJWE1FIC0gY2hlY2sgZm9yIGludmFsaWQgb2JqZWN0IGhhbmRsZQorICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGhhbmRsZXMgPSBtRGF0YWJhc2UtPmdldE9iamVjdFJlZmVyZW5jZXMoaGFuZGxlKTsKKyAgICBpZiAoaGFuZGxlcykgeworICAgICAgICBtRGF0YS5wdXRBVUludDMyKGhhbmRsZXMpOworICAgICAgICBkZWxldGUgaGFuZGxlczsKKyAgICB9IGVsc2UgeworICAgICAgICBtRGF0YS5wdXRFbXB0eUFycmF5KCk7CisgICAgfQorICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvU2V0T2JqZWN0UmVmZXJlbmNlcygpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIE10cFN0b3JhZ2VJRCBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogcmVmZXJlbmNlcyA9IG1EYXRhLmdldEFVSW50MzIoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmVzdWx0ID0gbURhdGFiYXNlLT5zZXRPYmplY3RSZWZlcmVuY2VzKGhhbmRsZSwgcmVmZXJlbmNlcyk7CisgICAgZGVsZXRlIHJlZmVyZW5jZXM7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RQcm9wVmFsdWUoKSB7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKKyAgICBMT0dEKCJHZXRPYmplY3RQcm9wVmFsdWUgJWQgJXNcbiIsIGhhbmRsZSwKKyAgICAgICAgICAgIE10cERlYnVnOjpnZXRPYmplY3RQcm9wQ29kZU5hbWUocHJvcGVydHkpKTsKKworICAgIHJldHVybiBtRGF0YWJhc2UtPmdldE9iamVjdFByb3BlcnR5VmFsdWUoaGFuZGxlLCBwcm9wZXJ0eSwgbURhdGEpOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb1NldE9iamVjdFByb3BWYWx1ZSgpIHsKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOworICAgIExPR0QoIlNldE9iamVjdFByb3BWYWx1ZSAlZCAlc1xuIiwgaGFuZGxlLAorICAgICAgICAgICAgTXRwRGVidWc6OmdldE9iamVjdFByb3BDb2RlTmFtZShwcm9wZXJ0eSkpOworCisgICAgcmV0dXJuIG1EYXRhYmFzZS0+c2V0T2JqZWN0UHJvcGVydHlWYWx1ZShoYW5kbGUsIHByb3BlcnR5LCBtRGF0YSk7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0RGV2aWNlUHJvcFZhbHVlKCkgeworICAgIE10cERldmljZVByb3BlcnR5IHByb3BlcnR5ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIExPR0QoIkdldERldmljZVByb3BWYWx1ZSAlc1xuIiwKKyAgICAgICAgICAgIE10cERlYnVnOjpnZXREZXZpY2VQcm9wQ29kZU5hbWUocHJvcGVydHkpKTsKKworICAgIHJldHVybiBtRGF0YWJhc2UtPmdldERldmljZVByb3BlcnR5VmFsdWUocHJvcGVydHksIG1EYXRhKTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9TZXREZXZpY2VQcm9wVmFsdWUoKSB7CisgICAgTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTE9HRCgiU2V0RGV2aWNlUHJvcFZhbHVlICVzXG4iLAorICAgICAgICAgICAgTXRwRGVidWc6OmdldERldmljZVByb3BDb2RlTmFtZShwcm9wZXJ0eSkpOworCisgICAgcmV0dXJuIG1EYXRhYmFzZS0+c2V0RGV2aWNlUHJvcGVydHlWYWx1ZShwcm9wZXJ0eSwgbURhdGEpOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb1Jlc2V0RGV2aWNlUHJvcFZhbHVlKCkgeworICAgIE10cERldmljZVByb3BlcnR5IHByb3BlcnR5ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIExPR0QoIlJlc2V0RGV2aWNlUHJvcFZhbHVlICVzXG4iLAorICAgICAgICAgICAgTXRwRGVidWc6OmdldERldmljZVByb3BDb2RlTmFtZShwcm9wZXJ0eSkpOworCisgICAgcmV0dXJuIG1EYXRhYmFzZS0+cmVzZXREZXZpY2VQcm9wZXJ0eShwcm9wZXJ0eSk7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0T2JqZWN0SW5mbygpIHsKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIHJldHVybiBtRGF0YWJhc2UtPmdldE9iamVjdEluZm8oaGFuZGxlLCBtRGF0YSk7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0T2JqZWN0KCkgeworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwU3RyaW5nIHBhdGhCdWY7CisgICAgaW50NjRfdCBmaWxlTGVuZ3RoOworICAgIGludCByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKGhhbmRsZSwgcGF0aEJ1ZiwgZmlsZUxlbmd0aCk7CisgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBjb25zdCBjaGFyKiBmaWxlUGF0aCA9IChjb25zdCBjaGFyICopcGF0aEJ1ZjsKKyAgICBtdHBfZmlsZV9yYW5nZSAgbWZyOworICAgIG1mci5mZCA9IG9wZW4oZmlsZVBhdGgsIE9fUkRPTkxZKTsKKyAgICBpZiAobWZyLmZkIDwgMCkgeworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgfQorICAgIG1mci5vZmZzZXQgPSAwOworICAgIG1mci5sZW5ndGggPSBmaWxlTGVuZ3RoOworCisgICAgLy8gc2VuZCBkYXRhIGhlYWRlcgorICAgIG1EYXRhLnNldE9wZXJhdGlvbkNvZGUobVJlcXVlc3QuZ2V0T3BlcmF0aW9uQ29kZSgpKTsKKyAgICBtRGF0YS5zZXRUcmFuc2FjdGlvbklEKG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKSk7CisgICAgbURhdGEud3JpdGVEYXRhSGVhZGVyKG1GRCwgZmlsZUxlbmd0aCk7CisKKyAgICAvLyB0aGVuIHRyYW5zZmVyIHRoZSBmaWxlCisgICAgaW50IHJldCA9IGlvY3RsKG1GRCwgTVRQX1NFTkRfRklMRSwgKHVuc2lnbmVkIGxvbmcpJm1mcik7CisgICAgY2xvc2UobWZyLmZkKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKQorICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9TZW5kT2JqZWN0SW5mbygpIHsKKyAgICBNdHBTdHJpbmcgcGF0aDsKKyAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIE10cFN0b3JhZ2UqIHN0b3JhZ2UgPSBnZXRTdG9yYWdlKHN0b3JhZ2VJRCk7CisgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKKyAgICBpZiAoIXN0b3JhZ2UpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9TVE9SQUdFX0lEOworCisgICAgLy8gc3BlY2lhbCBjYXNlIHRoZSByb290CisgICAgaWYgKHBhcmVudCA9PSBNVFBfUEFSRU5UX1JPT1QpIHsKKyAgICAgICAgcGF0aCA9IHN0b3JhZ2UtPmdldFBhdGgoKTsKKyAgICAgICAgcGFyZW50ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQ2NF90IGR1bW15OworICAgICAgICBpbnQgcmVzdWx0ID0gbURhdGFiYXNlLT5nZXRPYmplY3RGaWxlUGF0aChwYXJlbnQsIHBhdGgsIGR1bW15KTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vIHJlYWQgb25seSB0aGUgZmllbGRzIHdlIG5lZWQKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHN0b3JhZ2UgSUQKKyAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gbURhdGEuZ2V0VUludDE2KCk7CisgICAgbURhdGEuZ2V0VUludDE2KCk7ICAvLyBwcm90ZWN0aW9uIHN0YXR1cworICAgIG1TZW5kT2JqZWN0RmlsZVNpemUgPSBtRGF0YS5nZXRVSW50MzIoKTsKKyAgICBtRGF0YS5nZXRVSW50MTYoKTsgIC8vIHRodW1iIGZvcm1hdAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gdGh1bWIgY29tcHJlc3NlZCBzaXplCisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyB0aHVtYiBwaXggd2lkdGgKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHRodW1iIHBpeCBoZWlnaHQKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIGltYWdlIHBpeCB3aWR0aAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gaW1hZ2UgcGl4IGhlaWdodAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gaW1hZ2UgYml0IGRlcHRoCisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyBwYXJlbnQKKyAgICB1aW50MTZfdCBhc3NvY2lhdGlvblR5cGUgPSBtRGF0YS5nZXRVSW50MTYoKTsKKyAgICB1aW50MzJfdCBhc3NvY2lhdGlvbkRlc2MgPSBtRGF0YS5nZXRVSW50MzIoKTsgICAvLyBhc3NvY2lhdGlvbiBkZXNjCisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyBzZXF1ZW5jZSBudW1iZXIKKyAgICBNdHBTdHJpbmdCdWZmZXIgbmFtZSwgY3JlYXRlZCwgbW9kaWZpZWQ7CisgICAgbURhdGEuZ2V0U3RyaW5nKG5hbWUpOyAgICAvLyBmaWxlIG5hbWUKKyAgICBtRGF0YS5nZXRTdHJpbmcoY3JlYXRlZCk7ICAgICAgLy8gZGF0ZSBjcmVhdGVkCisgICAgbURhdGEuZ2V0U3RyaW5nKG1vZGlmaWVkKTsgICAgIC8vIGRhdGUgbW9kaWZpZWQKKyAgICAvLyBrZXl3b3JkcyBmb2xsb3cKKworICAgIHRpbWVfdCBtb2RpZmllZFRpbWU7CisgICAgaWYgKCFwYXJzZURhdGVUaW1lKG1vZGlmaWVkLCBtb2RpZmllZFRpbWUpKQorICAgICAgICBtb2RpZmllZFRpbWUgPSAwOworCisgICAgaWYgKHBhdGhbcGF0aC5zaXplKCkgLSAxXSAhPSAnLycpCisgICAgICAgIHBhdGggKz0gIi8iOworICAgIHBhdGggKz0gKGNvbnN0IGNoYXIgKiluYW1lOworCisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1EYXRhYmFzZS0+YmVnaW5TZW5kT2JqZWN0KChjb25zdCBjaGFyKilwYXRoLAorICAgICAgICAgICAgZm9ybWF0LCBwYXJlbnQsIHN0b3JhZ2VJRCwgbVNlbmRPYmplY3RGaWxlU2l6ZSwgbW9kaWZpZWRUaW1lKTsKKyAgICBpZiAoaGFuZGxlID09IGtJbnZhbGlkT2JqZWN0SGFuZGxlKSB7CisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9CisKKyAgaWYgKGZvcm1hdCA9PSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKSB7CisgICAgICAgIG1vZGVfdCBtYXNrID0gdW1hc2soMCk7CisgICAgICAgIGludCByZXQgPSBta2RpcigoY29uc3QgY2hhciAqKXBhdGgsIG1EaXJlY3RvcnlQZXJtaXNzaW9uKTsKKyAgICAgICAgdW1hc2sobWFzayk7CisgICAgICAgIGlmIChyZXQgJiYgcmV0ICE9IC1FRVhJU1QpCisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgICAgIGNob3duKChjb25zdCBjaGFyICopcGF0aCwgZ2V0dWlkKCksIG1GaWxlR3JvdXApOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TZW5kT2JqZWN0RmlsZVBhdGggPSBwYXRoOworICAgICAgICAvLyBzYXZlIHRoZSBoYW5kbGUgZm9yIHRoZSBTZW5kT2JqZWN0IGNhbGwsIHdoaWNoIHNob3VsZCBmb2xsb3cKKyAgICAgICAgbVNlbmRPYmplY3RIYW5kbGUgPSBoYW5kbGU7CisgICAgICAgIG1TZW5kT2JqZWN0Rm9ybWF0ID0gZm9ybWF0OworICAgIH0KKworICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMSwgc3RvcmFnZUlEKTsKKyAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDIsIHBhcmVudCk7CisgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigzLCBoYW5kbGUpOworCisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9TZW5kT2JqZWN0KCkgeworICAgIE10cFJlc3BvbnNlQ29kZSByZXN1bHQgPSBNVFBfUkVTUE9OU0VfT0s7CisgICAgbW9kZV90IG1hc2s7CisgICAgaW50IHJldDsKKworICAgIGlmIChtU2VuZE9iamVjdEhhbmRsZSA9PSBrSW52YWxpZE9iamVjdEhhbmRsZSkgeworICAgICAgICBMT0dFKCJFeHBlY3RlZCBTZW5kT2JqZWN0SW5mbyBiZWZvcmUgU2VuZE9iamVjdCIpOworICAgICAgICByZXN1bHQgPSBNVFBfUkVTUE9OU0VfTk9fVkFMSURfT0JKRUNUX0lORk87CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICAvLyByZWFkIHRoZSBoZWFkZXIKKyAgICByZXQgPSBtRGF0YS5yZWFkRGF0YUhlYWRlcihtRkQpOworICAgIC8vIEZJWE1FIC0gY2hlY2sgZm9yIGVycm9ycyBoZXJlLgorCisgICAgLy8gcmVzZXQgc28gd2UgZG9uJ3QgYXR0ZW1wdCB0byBzZW5kIHRoaXMgYmFjaworICAgIG1EYXRhLnJlc2V0KCk7CisKKyAgICBtdHBfZmlsZV9yYW5nZSAgbWZyOworICAgIG1mci5mZCA9IG9wZW4obVNlbmRPYmplY3RGaWxlUGF0aCwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMpOworICAgIGlmIChtZnIuZmQgPCAwKSB7CisgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIGZjaG93bihtZnIuZmQsIGdldHVpZCgpLCBtRmlsZUdyb3VwKTsKKyAgICAvLyBzZXQgcGVybWlzc2lvbnMKKyAgICBtYXNrID0gdW1hc2soMCk7CisgICAgZmNobW9kKG1mci5mZCwgbUZpbGVQZXJtaXNzaW9uKTsKKyAgICB1bWFzayhtYXNrKTsKKworICAgIG1mci5vZmZzZXQgPSAwOworICAgIG1mci5sZW5ndGggPSBtU2VuZE9iamVjdEZpbGVTaXplOworCisgICAgLy8gdHJhbnNmZXIgdGhlIGZpbGUKKyAgICByZXQgPSBpb2N0bChtRkQsIE1UUF9SRUNFSVZFX0ZJTEUsICh1bnNpZ25lZCBsb25nKSZtZnIpOworICAgIGNsb3NlKG1mci5mZCk7CisKKyAgICBMT0dWKCJNVFBfUkVDRUlWRV9GSUxFIHJldHVybmVkICVkIiwgcmV0KTsKKworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHVubGluayhtU2VuZE9iamVjdEZpbGVQYXRoKTsKKyAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkKKyAgICAgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0KKworZG9uZToKKyAgICBtRGF0YWJhc2UtPmVuZFNlbmRPYmplY3QobVNlbmRPYmplY3RGaWxlUGF0aCwgbVNlbmRPYmplY3RIYW5kbGUsIG1TZW5kT2JqZWN0Rm9ybWF0LAorICAgICAgICAgICAgcmVzdWx0ID09IE1UUF9SRVNQT05TRV9PSyk7CisgICAgbVNlbmRPYmplY3RIYW5kbGUgPSBrSW52YWxpZE9iamVjdEhhbmRsZTsKKyAgICBtU2VuZE9iamVjdEZvcm1hdCA9IDA7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9EZWxldGVPYmplY3QoKSB7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIC8vIEZJWE1FIC0gc3VwcG9ydCBkZWxldGluZyBhbGwgb2JqZWN0cyBpZiBoYW5kbGUgaXMgMHhGRkZGRkZGRgorICAgIC8vIEZJWE1FIC0gaW1wbGVtZW50IGRlbGV0aW5nIG9iamVjdHMgYnkgZm9ybWF0CisgICAgLy8gRklYTUUgLSBoYW5kbGUgbm9uLWVtcHR5IGRpcmVjdG9yaWVzCisKKyAgICBNdHBTdHJpbmcgZmlsZVBhdGg7CisgICAgaW50NjRfdCBmaWxlTGVuZ3RoOworICAgIGludCByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKGhhbmRsZSwgZmlsZVBhdGgsIGZpbGVMZW5ndGgpOworICAgIGlmIChyZXN1bHQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIExPR1YoImRlbGV0aW5nICVzIiwgKGNvbnN0IGNoYXIgKilmaWxlUGF0aCk7CisgICAgICAgIC8vIG9uZSBvZiB0aGVzZSBzaG91bGQgd29yaworICAgICAgICBybWRpcigoY29uc3QgY2hhciAqKWZpbGVQYXRoKTsKKyAgICAgICAgdW5saW5rKChjb25zdCBjaGFyICopZmlsZVBhdGgpOworICAgICAgICByZXR1cm4gbURhdGFiYXNlLT5kZWxldGVGaWxlKGhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0T2JqZWN0UHJvcERlc2MoKSB7CisgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcENvZGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKKyAgICBMT0dEKCJHZXRPYmplY3RQcm9wRGVzYyAlcyAlc1xuIiwgTXRwRGVidWc6OmdldE9iamVjdFByb3BDb2RlTmFtZShwcm9wQ29kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGVidWc6OmdldEZvcm1hdENvZGVOYW1lKGZvcm1hdCkpOworICAgIE10cFByb3BlcnR5KiBwcm9wZXJ0eSA9IG1EYXRhYmFzZS0+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+JiBzdXJmYWNlKSB7cmV0dXJuIE9LO30KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmUoKSB7cmV0dXJuIE9LO30KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmVBc3luYygpIHtyZXR1cm4gT0s7fQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoKSB7cmV0dXJuIE9LO30KZGlmZiAtLWdpdCBhL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvdHRzLmggYi9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL3R0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMTUxMDgKLS0tIC9kZXYvbnVsbAorKysgYi9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL3R0cy5oCkBAIC0wLDAgKzEsMzEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEFORFJPSURfVFRTX0gKKyNkZWZpbmUgQU5EUk9JRF9UVFNfSCAKKworLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHVzZWQgYnkgdGhlIEFuZHJvaWQgcGxhdGZvcm0KKy8vIHRvIGFjY2VzcyBUZXh0LVRvLVNwZWVjaCBmdW5jdGlvbmFsaXR5IGluIHNoYXJlZCBsaWJyYXJpZXMgdGhhdCBpbXBsZW1lbnQKKy8vIHNwZWVjaCBzeW50aGVzaXMgYW5kIHRoZSBtYW5hZ2VtZW50IG9mIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlCisvLyBzeW50aGVzaXMuCisKKy8vIFRoZSBzaGFyZWQgbGlicmFyeSBtdXN0IGNvbnRhaW4gYSBmdW5jdGlvbiBuYW1lZCAiYW5kcm9pZF9nZXRUdHNFbmdpbmUiCisvLyB0aGF0IHJldHVybnMgYW4gJ2FuZHJvaWRfdHRzX2VuZ2luZV90JyBpbnN0YW5jZS4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIEFORFJPSURfVFRTX0VOR0lORV9QUk9QRVJUWV9DT05GSUcgImVuZ2luZUNvbmZpZyIKKyNkZWZpbmUgQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX1BJVENIICAicGl0Y2giCisjZGVmaW5lIEFORFJPSURfVFRTX0VOR0lORV9QUk9QRVJUWV9SQVRFICAgInJhdGUiCisjZGVmaW5lIEFORFJPSURfVFRTX0VOR0lORV9QUk9QRVJUWV9WT0xVTUUgInZvbHVtZSIKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTkRST0lEX1RUU19TVUNDRVNTICAgICAgICAgICAgICAgICA9IDAsCisgICAgQU5EUk9JRF9UVFNfRkFJTFVSRSAgICAgICAgICAgICAgICAgPSAtMSwKKyAgICBBTkRST0lEX1RUU19GRUFUVVJFX1VOU1VQUE9SVEVEICAgICA9IC0yLAorICAgIEFORFJPSURfVFRTX1ZBTFVFX0lOVkFMSUQgICAgICAgICAgID0gLTMsCisgICAgQU5EUk9JRF9UVFNfUFJPUEVSVFlfVU5TVVBQT1JURUQgICAgPSAtNCwKKyAgICBBTkRST0lEX1RUU19QUk9QRVJUWV9TSVpFX1RPT19TTUFMTCA9IC01LAorICAgIEFORFJPSURfVFRTX01JU1NJTkdfUkVTT1VSQ0VTICAgICAgID0gLTYKK30gYW5kcm9pZF90dHNfcmVzdWx0X3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQU5EUk9JRF9UVFNfTEFOR19DT1VOVFJZX1ZBUl9BVkFJTEFCTEUgPSAyLAorICAgIEFORFJPSURfVFRTX0xBTkdfQ09VTlRSWV9BVkFJTEFCTEUgICAgPSAxLAorICAgIEFORFJPSURfVFRTX0xBTkdfQVZBSUxBQkxFICAgICAgICAgICAgPSAwLAorICAgIEFORFJPSURfVFRTX0xBTkdfTUlTU0lOR19EQVRBICAgICAgICAgPSAtMSwKKyAgICBBTkRST0lEX1RUU19MQU5HX05PVF9TVVBQT1JURUQgICAgICAgID0gLTIKK30gYW5kcm9pZF90dHNfc3VwcG9ydF9yZXN1bHRfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTkRST0lEX1RUU19TWU5USF9ET05FICAgICAgICAgICAgICA9IDAsCisgICAgQU5EUk9JRF9UVFNfU1lOVEhfUEVORElORyAgICAgICAgICAgPSAxCit9IGFuZHJvaWRfdHRzX3N5bnRoX3N0YXR1c190OworCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfVFRTX0NBTExCQUNLX0hBTFQgICAgICAgICAgID0gMCwKKyAgICBBTkRST0lEX1RUU19DQUxMQkFDS19DT05USU5VRSAgICAgICA9IDEKK30gYW5kcm9pZF90dHNfY2FsbGJhY2tfc3RhdHVzX3Q7CisKKy8vIFN1cHBvcnRlZCBhdWRpbyBmb3JtYXRzCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9JTlZBTElEICAgID0gLTEsCisgICAgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX0RFRkFVTFQgICAgPSAwLAorICAgIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9QQ01fMTZfQklUID0gMSwKKyAgICBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfUENNXzhfQklUICA9IDIsCit9IGFuZHJvaWRfdHRzX2F1ZGlvX2Zvcm1hdF90OworCisKKy8qIEFuIGFuZHJvaWRfdHRzX2VuZ2luZV90IG9iamVjdCBjYW4gYmUgYW55dGhpbmcsIGJ1dCBtdXN0IGhhdmUsCisgKiBhcyBpdHMgZmlyc3QgZmllbGQsIGEgcG9pbnRlciB0byBhIHRhYmxlIG9mIGZ1bmN0aW9ucy4KKyAqCisgKiBTZWUgdGhlIGZ1bGwgZGVmaW5pdGlvbiBvZiBzdHJ1Y3QgYW5kcm9pZF90dHNfZW5naW5lX3RfZnVuY3NfdAorICogYmVsb3cgZm9yIGRldGFpbHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFuZHJvaWRfdHRzX2VuZ2luZV9mdW5jc190ICBhbmRyb2lkX3R0c19lbmdpbmVfZnVuY3NfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV9mdW5jc190ICpmdW5jczsKK30gYW5kcm9pZF90dHNfZW5naW5lX3Q7CisKKy8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBsb2NhdGVkIGluIHRoZSBUVFMgRW5naW5lIHNoYXJlZCBsaWJyYXJ5CisgKiBhbmQgbXVzdCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgYW4gYW5kcm9pZF90dHNfZW5naW5lX3QgbGlicmFyeS4KKyAqLworZXh0ZXJuIGFuZHJvaWRfdHRzX2VuZ2luZV90ICphbmRyb2lkX2dldFR0c0VuZ2luZSgpOworCisvKiBJbmNsdWRpbmcgdGhlIG9sZCB2ZXJzaW9uIGZvciBsZWdhY3kgc3VwcG9ydCAoRnJveW8gY29tcGF0aWJpbGl0eSkuCisgKiBUaGlzIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgdGhpbmcgYXMgYW5kcm9pZF9nZXRUdHNFbmdpbmUuCisgKi8KK2V4dGVybiAiQyIgYW5kcm9pZF90dHNfZW5naW5lX3QgKmdldFR0c0VuZ2luZSgpOworCisvLyBBIGNhbGxiYWNrIHR5cGUgdXNlZCB0byBub3RpZnkgdGhlIGZyYW1ld29yayBvZiBuZXcgc3ludGhldGl6ZWQKKy8vIGF1ZGlvIHNhbXBsZXMsIHN0YXR1cyB3aWxsIGJlIFNZTlRIX0RPTkUgZm9yIHRoZSBsYXN0IHNhbXBsZSBvZgorLy8gdGhlIGxhc3QgcmVxdWVzdCwgb2YgU1lOVEhfUEVORElORyBvdGhlcndpc2UuCisvLworLy8gVGhpcyBpcyBwYXNzZWQgYnkgdGhlIGZyYW1ld29yayB0byB0aGUgZW5naW5lIHRocm91Z2ggdGhlCisvLyAnZW5naW5lX2luaXQnIGZ1bmN0aW9uIChzZWUgYmVsb3cpLgorLy8KKy8vIFRoZSBjYWxsYmFjayBmb3Igc3ludGhlc2lzIGNvbXBsZXRlZCB0YWtlczoKKy8vIEBwYXJhbSBbaW5vdXRdIHZvaWQgKiYgICAgICAgLSBUaGUgdXNlcmRhdGEgcG9pbnRlciBzZXQgaW4gdGhlIG9yaWdpbmFsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRoIGNhbGwKKy8vIEBwYXJhbSBbaW5dICAgIHVpbnQzMl90ICAgICAgLSBUcmFjayBzYW1wbGluZyByYXRlIGluIEh6CisvLyBAcGFyYW0gW2luXSAgICB1aW50MzJfdCAgICAgIC0gVGhlIGF1ZGlvIGZvcm1hdAorLy8gQHBhcmFtIFtpbl0gICAgaW50ICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKy8vIEBwYXJhbSBbaW5vdXRdIGludDhfdCAqJiAgICAgLSBBIGJ1ZmZlciBvZiBhdWRpbyBkYXRhIG9ubHkgdmFsaWQgZHVyaW5nIHRoZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbiBvZiB0aGUgY2FsbGJhY2sKKy8vIEBwYXJhbSBbaW5vdXRdIHNpemVfdCAgJiAgICAgLSBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyCisvLyBAcGFyYW0gW2luXSB0dHNfc3ludGhfc3RhdHVzIC0gaW5kaWNhdGUgd2hldGhlciB0aGUgc3ludGhlc2lzIGlzIGRvbmUsIG9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1vcmUgZGF0YSBpcyB0byBiZSBzeW50aGVzaXplZC4KKy8vIEByZXR1cm4gVFRTX0NBTExCQUNLX0hBTFQgdG8gaW5kaWNhdGUgdGhlIHN5bnRoZXNpcyBtdXN0IHN0b3AsCisvLyAgICAgICAgIFRUU19DQUxMQkFDS19DT05USU5VRSB0byBpbmRpY2F0ZSB0aGUgc3ludGhlc2lzIG11c3QgY29udGludWUgaWYKKy8vICAgICAgICAgICAgdGhlcmUgaXMgbW9yZSBkYXRhIHRvIHByb2R1Y2UuCit0eXBlZGVmIGFuZHJvaWRfdHRzX2NhbGxiYWNrX3N0YXR1c190ICgqYW5kcm9pZF90dHNfc3ludGhfY2JfdCkKKyAgICAgICAgICAgICh2b2lkICoqcFVzZXJEYXRhLAorICAgICAgICAgICAgIHVpbnQzMl90IHRyYWNrU2FtcGxpbmdIeiwKKyAgICAgICAgICAgICBhbmRyb2lkX3R0c19hdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwKKyAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgIGludDhfdCAqKnBBdWRpb0J1ZmZlciwKKyAgICAgICAgICAgICBzaXplX3QgKnBCdWZmZXJTaXplLAorICAgICAgICAgICAgIGFuZHJvaWRfdHRzX3N5bnRoX3N0YXR1c190IHN0YXR1cyk7CisKKworLy8gVGhlIHRhYmxlIG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHRoYXQgdGhlIGFuZHJvaWRfdHRzX2VuZ2luZV90IG11c3QgcG9pbnQgdG8uCisvLyBOb3RlIHRoYXQgZWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMgd2lsbCB0YWtlIGEgaGFuZGxlIHRvIHRoZSBlbmdpbmUgaXRzZWxmCisvLyBhcyB0aGVpciBmaXJzdCBwYXJhbWV0ZXIuCisvLworCitzdHJ1Y3QgYW5kcm9pZF90dHNfZW5naW5lX2Z1bmNzX3QgeworICAgIC8vIHJlc2VydmVkIGZpZWxkcywgaWdub3JlZCBieSB0aGUgZnJhbWV3b3JrCisgICAgLy8gdGhleSBtdXN0IGJlIHBsYWNlZCBoZXJlIHRvIGVuc3VyZSBiaW5hcnkgY29tcGF0aWJpbGl0eQorICAgIC8vIG9mIGxlZ2FjeSBiaW5hcnkgcGx1Z2lucy4KKyAgICB2b2lkICpyZXNlcnZlZFsyXTsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIFRUUyBlbmdpbmUgYW5kIHJldHVybnMgd2hldGhlciBpbml0aWFsaXphdGlvbiBzdWNjZWVkZWQuCisgICAgLy8gQHBhcmFtIHN5bnRoRG9uZUNCUHRyIHN5bnRoZXNpcyBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyCisgICAgLy8gQHJldHVybiBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKmluaXQpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGFuZHJvaWRfdHRzX3N5bnRoX2NiX3Qgc3ludGhEb25lUHRyLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZ2luZUNvbmZpZyk7CisKKyAgICAvLyBTaHV0IGRvd24gdGhlIFRUUyBlbmdpbmUgYW5kIHJlbGVhc2VzIGFsbCBhc3NvY2lhdGVkIHJlc291cmNlcy4KKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqc2h1dGRvd24pCisgICAgICAgICAgICAodm9pZCAqZW5naW5lKTsKKworICAgIC8vIEludGVycnVwdCBzeW50aGVzaXMgYW5kIGZsdXNoZXMgYW55IHN5bnRoZXNpemVkIGRhdGEgdGhhdCBoYXNuJ3QgYmVlbgorICAgIC8vIG91dHB1dCB5ZXQuIFRoaXMgd2lsbCBibG9jayB1bnRpbCBjYWxsYmFja3MgdW5kZXJ3YXkgYXJlIGNvbXBsZXRlZC4KKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqc3RvcCkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUpOworCisgICAgLy8gUmV0dXJucyB0aGUgbGV2ZWwgb2Ygc3VwcG9ydCBmb3IgdGhlIGxhbmd1YWdlLCBjb3VudHJ5IGFuZCB2YXJpYW50LgorICAgIC8vIEByZXR1cm4gVFRTX0xBTkdfQ09VTlRSWV9WQVJfQVZBSUxBQkxFIGlmIHRoZSBsYW5ndWFnZSwgY291bnRyeSBhbmQgdmFyaWFudCBhcmUgc3VwcG9ydGVkLAorICAgIC8vICAgICAgICAgICAgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlcyBhcmUgY29ycmVjdGx5IGluc3RhbGxlZAorICAgIC8vICAgICAgICAgVFRTX0xBTkdfQ09VTlRSWV9BVkFJTEFCTEUgaWYgdGhlIGxhbmd1YWdlIGFuZCBjb3VudHJ5IGFyZSBzdXBwb3J0ZWQgYW5kIHRoZQorICAgIC8vICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2VzIGFyZSBjb3JyZWN0bHkgaW5zdGFsbGVkLCBidXQgdGhlcmUgaXMgbm8gbWF0Y2ggZm9yCisgICAgLy8gICAgICAgICAgICAgdGhlIHNwZWNpZmllZCB2YXJpYW50CisgICAgLy8gICAgICAgICBUVFNfTEFOR19BVkFJTEFCTEUgaWYgdGhlIGxhbmd1YWdlIGlzIHN1cHBvcnRlZCBhbmQgdGhlCisgICAgLy8gICAgICAgICAgICAgY29ycmVzcG9uZGluZyByZXNvdXJjZXMgYXJlIGNvcnJlY3RseSBpbnN0YWxsZWQsIGJ1dCB0aGVyZSBpcyBubyBtYXRjaCBmb3IKKyAgICAvLyAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGNvdW50cnkgYW5kIHZhcmlhbnQKKyAgICAvLyAgICAgICAgIFRUU19MQU5HX01JU1NJTkdfREFUQSBpZiB0aGUgcmVxdWlyZWQgcmVzb3VyY2VzIHRvIHByb3ZpZGUgYW55IGxldmVsIG9mIHN1cHBvcnQKKyAgICAvLyAgICAgICAgICAgICBmb3IgdGhlIGxhbmd1YWdlIGFyZSBub3QgY29ycmVjdGx5IGluc3RhbGxlZAorICAgIC8vICAgICAgICAgVFRTX0xBTkdfTk9UX1NVUFBPUlRFRCBpZiB0aGUgbGFuZ3VhZ2UgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgVFRTIGVuZ2luZS4KKyAgICBhbmRyb2lkX3R0c19zdXBwb3J0X3Jlc3VsdF90ICgqaXNMYW5ndWFnZUF2YWlsYWJsZSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqbGFuZywKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpjb3VudHJ5LAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcmlhbnQpOworCisgICAgLy8gTG9hZCB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlLiBUaGUgbG9hZGVkCisgICAgLy8gbGFuZ3VhZ2Ugd2lsbCBvbmx5IGJlIHVzZWQgb25jZSBhIGNhbGwgdG8gc2V0TGFuZ3VhZ2UoKSB3aXRoIHRoZSBzYW1lCisgICAgLy8gbGFuZ3VhZ2UgdmFsdWUgaXMgaXNzdWVkLiBMYW5ndWFnZSBhbmQgY291bnRyeSB2YWx1ZXMgYXJlIGNvZGVkIGFjY29yZGluZyB0byB0aGUgSVNPIHRocmVlCisgICAgLy8gbGV0dGVyIGNvZGVzIGZvciBsYW5ndWFnZXMgYW5kIGNvdW50cmllcywgYXMgY2FuIGJlIHJldHJpZXZlZCBmcm9tIGEgamF2YS51dGlsLkxvY2FsZQorICAgIC8vIGluc3RhbmNlLiBUaGUgdmFyaWFudCB2YWx1ZSBpcyBlbmNvZGVkIGFzIHRoZSB2YXJpYW50IHN0cmluZyByZXRyaWV2ZWQgZnJvbSBhCisgICAgLy8gamF2YS51dGlsLkxvY2FsZSBpbnN0YW5jZSBidWlsdCB3aXRoIHRoYXQgdmFyaWFudCBkYXRhLgorICAgIC8vIEBwYXJhbSBsYW5nIHBvaW50ZXIgdG8gdGhlIElTTyB0aHJlZSBsZXR0ZXIgY29kZSBmb3IgdGhlIGxhbmd1YWdlCisgICAgLy8gQHBhcmFtIGNvdW50cnkgcG9pbnRlciB0byB0aGUgSVNPIHRocmVlIGxldHRlciBjb2RlIGZvciB0aGUgY291bnRyeQorICAgIC8vIEBwYXJhbSB2YXJpYW50IHBvaW50ZXIgdG8gdGhlIHZhcmlhbnQgY29kZQorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpsb2FkTGFuZ3VhZ2UpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxhbmcsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqY291bnRyeSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICp2YXJpYW50KTsKKworICAgIC8vIExvYWQgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBsYW5ndWFnZSwgY291bnRyeSBhbmQgTG9jYWxlIHZhcmlhbnQuCisgICAgLy8gVGhlIGxvYWRlZCBsYW5ndWFnZSB3aWxsIG9ubHkgYmUgdXNlZCBvbmNlIGEgY2FsbCB0byBzZXRMYW5ndWFnZUZyb21Mb2NhbGUoKSB3aXRoIHRoZSBzYW1lCisgICAgLy8gbGFuZ3VhZ2UgdmFsdWUgaXMgaXNzdWVkLiBMYW5ndWFnZSBhbmQgY291bnRyeSB2YWx1ZXMgYXJlIGNvZGVkIGFjY29yZGluZyB0byB0aGUgSVNPIHRocmVlCisgICAgLy8gbGV0dGVyIGNvZGVzIGZvciBsYW5ndWFnZXMgYW5kIGNvdW50cmllcywgYXMgY2FuIGJlIHJldHJpZXZlZCBmcm9tIGEgamF2YS51dGlsLkxvY2FsZQorICAgIC8vIGluc3RhbmNlLiBUaGUgdmFyaWFudCB2YWx1ZSBpcyBlbmNvZGVkIGFzIHRoZSB2YXJpYW50IHN0cmluZyByZXRyaWV2ZWQgZnJvbSBhCisgICAgLy8gamF2YS51dGlsLkxvY2FsZSBpbnN0YW5jZSBidWlsdCB3aXRoIHRoYXQgdmFyaWFudCBkYXRhLgorICAgIC8vIEBwYXJhbSBsYW5nIHBvaW50ZXIgdG8gdGhlIElTTyB0aHJlZSBsZXR0ZXIgY29kZSBmb3IgdGhlIGxhbmd1YWdlCisgICAgLy8gQHBhcmFtIGNvdW50cnkgcG9pbnRlciB0byB0aGUgSVNPIHRocmVlIGxldHRlciBjb2RlIGZvciB0aGUgY291bnRyeQorICAgIC8vIEBwYXJhbSB2YXJpYW50IHBvaW50ZXIgdG8gdGhlIHZhcmlhbnQgY29kZQorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpzZXRMYW5ndWFnZSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqbGFuZywKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpjb3VudHJ5LAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcmlhbnQpOworCisgICAgLy8gUmV0cmlldmUgdGhlIGN1cnJlbnRseSBzZXQgbGFuZ3VhZ2UsIGNvdW50cnkgYW5kIHZhcmlhbnQsIG9yIGVtcHR5IHN0cmluZ3MgaWYgbm9uZSBvZgorICAgIC8vIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHNldC4gTGFuZ3VhZ2UgYW5kIGNvdW50cnkgYXJlIHJlcHJlc2VudGVkIGJ5IHRoZWlyIDMtbGV0dGVyIElTTyBjb2RlCisgICAgLy8gQHBhcmFtW291dF0gICBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgMy1sZXR0ZXIgY29kZSBsYW5ndWFnZSB2YWx1ZQorICAgIC8vIEBwYXJhbVtvdXRdICAgcG9pbnRlciB0byB0aGUgcmV0cmlldmVkIDMtbGV0dGVyIGNvZGUgY291bnRyeSB2YWx1ZQorICAgIC8vIEBwYXJhbVtvdXRdICAgcG9pbnRlciB0byB0aGUgcmV0cmlldmVkIHZhcmlhbnQgdmFsdWUKKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqZ2V0TGFuZ3VhZ2UpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGNoYXIgKmxhbmd1YWdlLAorICAgICAgICAgICAgIGNoYXIgKmNvdW50cnksCisgICAgICAgICAgICAgY2hhciAqdmFyaWFudCk7CisKKyAgICAvLyBOb3RpZmllcyB0aGUgZW5naW5lIHdoYXQgYXVkaW8gcGFyYW1ldGVycyBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHN5bnRoZXNpcy4KKyAgICAvLyBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgYXMgYSBoaW50LCB0aGUgZW5naW5lIGltcGxlbWVudGF0aW9uIHdpbGwgc2V0IHRoZSBvdXRwdXQgdmFsdWVzCisgICAgLy8gdG8gdGhvc2Ugb2YgdGhlIHN5bnRoZXNpcyBmb3JtYXQsIGJhc2VkIG9uIGEgZ2l2ZW4gaGludC4KKyAgICAvLyBAcGFyYW1baW5vdXRdIGVuY29kaW5nIGluOiB0aGUgZGVzaXJlZCBhdWRpbyBzYW1wbGUgZm9ybWF0CisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3V0OiB0aGUgZm9ybWF0IHVzZWQgYnkgdGhlIFRUUyBlbmdpbmUKKyAgICAvLyBAcGFyYW1baW5vdXRdIHJhdGUgaW46IHRoZSBkZXNpcmVkIGF1ZGlvIHNhbXBsZSByYXRlCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3V0OiB0aGUgc2FtcGxlIHJhdGUgdXNlZCBieSB0aGUgVFRTIGVuZ2luZQorICAgIC8vIEBwYXJhbVtpbm91dF0gY2hhbm5lbHMgaW46IHRoZSBkZXNpcmVkIG51bWJlciBvZiBhdWRpbyBjaGFubmVscworICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIG91dDogdGhlIG51bWJlciBvZiBjaGFubmVscyB1c2VkIGJ5IHRoZSBUVFMgZW5naW5lCisgICAgLy8gQHJldHVybiBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKnNldEF1ZGlvRm9ybWF0KQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBhbmRyb2lkX3R0c19hdWRpb19mb3JtYXRfdCogcEVuY29kaW5nLAorICAgICAgICAgICAgIHVpbnQzMl90KiBwUmF0ZSwKKyAgICAgICAgICAgICBpbnQqIHBDaGFubmVscyk7CisKKyAgICAvLyBTZXQgYSBwcm9wZXJ0eSBmb3IgdGhlIHRoZSBUVFMgZW5naW5lCisgICAgLy8gInNpemUiIGlzIHRoZSBtYXhpbXVtIHNpemUgb2YgInZhbHVlIiBmb3IgcHJvcGVydGllcyAicHJvcGVydHkiCisgICAgLy8gQHBhcmFtIHByb3BlcnR5IHBvaW50ZXIgdG8gdGhlIHByb3BlcnR5IG5hbWUKKyAgICAvLyBAcGFyYW0gdmFsdWUgICAgcG9pbnRlciB0byB0aGUgcHJvcGVydHkgdmFsdWUKKyAgICAvLyBAcGFyYW0gc2l6ZSAgICAgbWF4aW11bSBzaXplIHJlcXVpcmVkIHRvIHN0b3JlIHRoaXMgdHlwZSBvZiBwcm9wZXJ0eQorICAgIC8vIEByZXR1cm4gICAgICAgICBUVFNfUFJPUEVSVFlfVU5TVVBQT1JURUQsIG9yIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRSwKKyAgICAvLyAgICAgICAgICAgICAgICAgIG9yIFRUU19WQUxVRV9JTlZBTElECisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpzZXRQcm9wZXJ0eSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHksCisgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUpOworCisgICAgLy8gUmV0cmlldmUgYSBwcm9wZXJ0eSBmcm9tIHRoZSBUVFMgZW5naW5lCisgICAgLy8gQHBhcmFtICAgICAgICBwcm9wZXJ0eSBwb2ludGVyIHRvIHRoZSBwcm9wZXJ0eSBuYW1lCisgICAgLy8gQHBhcmFtW291dF0gICB2YWx1ZSAgICBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgbGFuZ3VhZ2UgdmFsdWUKKyAgICAvLyBAcGFyYW1baW5vdXRdIGlvc2l6ZSAgIGluOiBzdG9yZXMgdGhlIHNpemUgYXZhaWxhYmxlIHRvIHN0b3JlIHRoZQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIG91dDogc3RvcmVzIHRoZSBzaXplIHJlcXVpcmVkIHRvIGhvbGQgdGhlIGxhbmd1YWdlCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGlmIGdldExhbmd1YWdlKCkgcmV0dXJuZWQKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgVFRTX1BST1BFUlRZX1NJWkVfVE9PX1NNQUxMLCB1bmNoYW5nZWQgb3RoZXJ3aXNlCisgICAgLy8gQHJldHVybiBUVFNfUFJPUEVSVFlfVU5TVVBQT1JURUQsIG9yIFRUU19TVUNDRVNTLAorICAgIC8vICAgICAgICAgb3IgVFRTX1BST1BFUlRZX1NJWkVfVE9PX1NNQUxMCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpnZXRQcm9wZXJ0eSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHksCisgICAgICAgICAgICAgY2hhciAqdmFsdWUsCisgICAgICAgICAgICAgc2l6ZV90ICppb3NpemUpOworCisgICAgLy8gU3ludGhlc2l6ZSB0aGUgdGV4dC4KKyAgICAvLyBBcyB0aGUgc3ludGhlc2lzIGlzIHBlcmZvcm1lZCwgdGhlIGVuZ2luZSBpbnZva2VzIHRoZSBjYWxsYmFjayB0byBub3RpZnkKKyAgICAvLyB0aGUgVFRTIGZyYW1ld29yayB0aGF0IGl0IGhhcyBmaWxsZWQgdGhlIGdpdmVuIGJ1ZmZlciwgYW5kIGluZGljYXRlcyBob3cKKyAgICAvLyBtYW55IGJ5dGVzIGl0IHdyb3RlLiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHJlcGVhdGVkbHkgdW50aWwgdGhlIGVuZ2luZQorICAgIC8vIGhhcyBnZW5lcmF0ZWQgYWxsIHRoZSBhdWRpbyBkYXRhIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRleHQuCisgICAgLy8gTm90ZSBhYm91dCB0aGUgZm9ybWF0IG9mIHRoZSBpbnB1dDogdGhlIHRleHQgcGFyYW1ldGVyIG1heSB1c2UgdGhlCisgICAgLy8gZm9sbG93aW5nIGVsZW1lbnRzCisgICAgLy8gYW5kIHRoZWlyIHJlc3BlY3RpdmUgYXR0cmlidXRlcyBhcyBkZWZpbmVkIGluIHRoZSBTU01MIDEuMCBzcGVjaWZpY2F0aW9uOgorICAgIC8vICAgICogbGFuZworICAgIC8vICAgICogc2F5LWFzOgorICAgIC8vICAgICAgICAgIG8gaW50ZXJwcmV0LWFzCisgICAgLy8gICAgKiBwaG9uZW1lCisgICAgLy8gICAgKiB2b2ljZToKKyAgICAvLyAgICAgICAgICBvIGdlbmRlciwKKyAgICAvLyAgICAgICAgICBvIGFnZSwKKyAgICAvLyAgICAgICAgICBvIHZhcmlhbnQsCisgICAgLy8gICAgICAgICAgbyBuYW1lCisgICAgLy8gICAgKiBlbXBoYXNpcworICAgIC8vICAgICogYnJlYWs6CisgICAgLy8gICAgICAgICAgbyBzdHJlbmd0aCwKKyAgICAvLyAgICAgICAgICBvIHRpbWUKKyAgICAvLyAgICAqIHByb3NvZHk6CisgICAgLy8gICAgICAgICAgbyBwaXRjaCwKKyAgICAvLyAgICAgICAgICBvIGNvbnRvdXIsCisgICAgLy8gICAgICAgICAgbyByYW5nZSwKKyAgICAvLyAgICAgICAgICBvIHJhdGUsCisgICAgLy8gICAgICAgICAgbyBkdXJhdGlvbiwKKyAgICAvLyAgICAgICAgICBvIHZvbHVtZQorICAgIC8vICAgICogbWFyaworICAgIC8vIERpZmZlcmVuY2VzIGJldHdlZW4gdGhpcyB0ZXh0IGZvcm1hdCBhbmQgU1NNTCBhcmU6CisgICAgLy8gICAgKiBmdWxsIFNTTUwgZG9jdW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkCisgICAgLy8gICAgKiBuYW1lc3BhY2VzIGFyZSBub3Qgc3VwcG9ydGVkCisgICAgLy8gVGV4dCBpcyBjb2RlZCBpbiBVVEYtOC4KKyAgICAvLyBAcGFyYW0gdGV4dCAgICAgIHRoZSBVVEYtOCB0ZXh0IHRvIHN5bnRoZXNpemUKKyAgICAvLyBAcGFyYW0gdXNlcmRhdGEgIHBvaW50ZXIgdG8gYmUgcmV0dXJuZWQgd2hlbiB0aGUgY2FsbCBpcyBpbnZva2VkCisgICAgLy8gQHBhcmFtIGJ1ZmZlciAgICB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHN5bnRoZXNpemVkIGRhdGEgbXVzdCBiZSB3cml0dGVuCisgICAgLy8gQHBhcmFtIGJ1ZmZlclNpemUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSB3cml0dGVuIGluIGJ1ZmZlcgorICAgIC8vIEByZXR1cm4gICAgICAgICAgVFRTX1NVQ0NFU1Mgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKnN5bnRoZXNpemVUZXh0KQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICp0ZXh0LAorICAgICAgICAgICAgIGludDhfdCAqYnVmZmVyLAorICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAorICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBBTkRST0lEX1RUU19IICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9FR0wvZWdsLmNwcCBiL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwCmluZGV4IDVlNjE2MDcuLjkyMjhiMGIgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwCisrKyBiL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwCkBAIC01OSw2ICs1OSw3IEBACiAgICAgICAgICJFR0xfS0hSX2ltYWdlICIKICAgICAgICAgIkVHTF9LSFJfaW1hZ2VfYmFzZSAiCiAgICAgICAgICJFR0xfS0hSX2ltYWdlX3BpeG1hcCAiCisgICAgICAgICJFR0xfS0hSX2dsX3RleHR1cmVfMkRfaW1hZ2UgIgogICAgICAgICAiRUdMX0FORFJPSURfaW1hZ2VfbmF0aXZlX2J1ZmZlciAiCiAgICAgICAgICJFR0xfQU5EUk9JRF9zd2FwX3JlY3RhbmdsZSAiCiAgICAgICAgIDsKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVMyL2dsMi5jcHAgYi9vcGVuZ2wvbGlicy9HTEVTMi9nbDIuY3BwCmluZGV4IDkyNDczN2UuLmExMmVkZjIgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJzL0dMRVMyL2dsMi5jcHAKKysrIGIvb3BlbmdsL2xpYnMvR0xFUzIvZ2wyLmNwcApAQCAtMzksNiArMzksOCBAQAogI3VuZGVmIENBTExfR0xfQVBJCiAjdW5kZWYgQ0FMTF9HTF9BUElfUkVUVVJOCiAKKyNkZWZpbmUgREVCVUdfQ0FMTF9HTF9BUEkgMAorCiAjaWYgVVNFX0ZBU1RfVExTX0tFWQogCiAgICAgI2lmZGVmIEhBVkVfQVJNX1RMU19SRUdJU1RFUgpAQCAtNzMsMTAgKzc1LDI0IEBACiAKICAgICAjZGVmaW5lIEFQSV9FTlRSWShfYXBpKSBfYXBpCiAKKyNpZiBERUJVR19DQUxMX0dMX0FQSQorCiAgICAgI2RlZmluZSBDQUxMX0dMX0FQSShfYXBpLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBnbF9ob29rc190OjpnbF90IGNvbnN0ICogY29uc3QgX2MgPSAmZ2V0R2xUaHJlYWRTcGVjaWZpYygpLT5nbDsgIFwKLSAgICAgICAgX2MtPl9hcGkoX19WQV9BUkdTX18pCi0gICAgCisgICAgICAgIF9jLT5fYXBpKF9fVkFfQVJHU19fKTsgXAorICAgICAgICBHTGVudW0gc3RhdHVzID0gR0xfTk9fRVJST1I7IFwKKyAgICAgICAgd2hpbGUgKChzdGF0dXMgPSBnbEdldEVycm9yKCkpICE9IEdMX05PX0VSUk9SKSB7IFwKKyAgICAgICAgICAgIExPR0QoIlsiICNfYXBpICJdIDB4JXgiLCBzdGF0dXMpOyBcCisgICAgICAgIH0KKworI2Vsc2UKKworICAgICNkZWZpbmUgQ0FMTF9HTF9BUEkoX2FwaSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ2xfaG9va3NfdDo6Z2xfdCBjb25zdCAqIGNvbnN0IF9jID0gJmdldEdsVGhyZWFkU3BlY2lmaWMoKS0+Z2w7ICBcCisgICAgICAgIF9jLT5fYXBpKF9fVkFfQVJHU19fKTsKKworI2VuZGlmCisKICAgICAjZGVmaW5lIENBTExfR0xfQVBJX1JFVFVSTihfYXBpLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGdsX2hvb2tzX3Q6OmdsX3QgY29uc3QgKiBjb25zdCBfYyA9ICZnZXRHbFRocmVhZFNwZWNpZmljKCktPmdsOyAgXAogICAgICAgICByZXR1cm4gX2MtPl9hcGkoX19WQV9BUkdTX18pCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzY0N2NhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIwIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJZ2wyX3BlcmYuY3BwIFwKKwlmaWxsdGVzdC5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzIFwKKyAgICBsaWJFR0wgXAorICAgIGxpYkdMRVN2MiBcCisgICAgbGlidWkKKworTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtZ2wyX3BlcmYKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfQ0ZMQUdTIDo9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUworCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGxfY29tbW9uLmNwcCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGxfY29tbW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmRiMWIwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZmlsbF9jb21tb24uY3BwCkBAIC0wLDAgKzEsMzE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworRklMRSAqIGZPdXQgPSBOVUxMOwordm9pZCBwdFN3YXAoKTsKKworc3RhdGljIHZvaWQgY2hlY2tHbEVycm9yKGNvbnN0IGNoYXIqIG9wKSB7CisgICAgZm9yIChHTGludCBlcnJvciA9IGdsR2V0RXJyb3IoKTsgZXJyb3I7IGVycm9yCisgICAgICAgICAgICA9IGdsR2V0RXJyb3IoKSkgeworICAgICAgICBMT0dFKCJhZnRlciAlcygpIGdsRXJyb3IgKDB4JXgpXG4iLCBvcCwgZXJyb3IpOworICAgIH0KK30KKworR0x1aW50IGxvYWRTaGFkZXIoR0xlbnVtIHNoYWRlclR5cGUsIGNvbnN0IGNoYXIqIHBTb3VyY2UpIHsKKyAgICBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIoc2hhZGVyVHlwZSk7CisgICAgaWYgKHNoYWRlcikgeworICAgICAgICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZwU291cmNlLCBOVUxMKTsKKyAgICAgICAgZ2xDb21waWxlU2hhZGVyKHNoYWRlcik7CisgICAgICAgIEdMaW50IGNvbXBpbGVkID0gMDsKKyAgICAgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0NPTVBJTEVfU1RBVFVTLCAmY29tcGlsZWQpOworICAgICAgICBpZiAoIWNvbXBpbGVkKSB7CisgICAgICAgICAgICBHTGludCBpbmZvTGVuID0gMDsKKyAgICAgICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZpbmZvTGVuKTsKKyAgICAgICAgICAgIGlmIChpbmZvTGVuKSB7CisgICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoaW5mb0xlbik7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZikgeworICAgICAgICAgICAgICAgICAgICBnbEdldFNoYWRlckluZm9Mb2coc2hhZGVyLCBpbmZvTGVuLCBOVUxMLCBidWYpOworICAgICAgICAgICAgICAgICAgICBMT0dFKCJDb3VsZCBub3QgY29tcGlsZSBzaGFkZXIgJWQ6XG4lc1xuIiwgc2hhZGVyVHlwZSwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOworICAgICAgICAgICAgICAgIHNoYWRlciA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNoYWRlcjsKK30KKworZW51bSB7CisgICAgQV9QT1MsCisgICAgQV9DT0xPUiwKKyAgICBBX1RFWDAsCisgICAgQV9URVgxCit9OworCitHTHVpbnQgY3JlYXRlUHJvZ3JhbShjb25zdCBjaGFyKiBwVmVydGV4U291cmNlLCBjb25zdCBjaGFyKiBwRnJhZ21lbnRTb3VyY2UpIHsKKyAgICBHTHVpbnQgdmVydGV4U2hhZGVyID0gbG9hZFNoYWRlcihHTF9WRVJURVhfU0hBREVSLCBwVmVydGV4U291cmNlKTsKKyAgICBpZiAoIXZlcnRleFNoYWRlcikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBHTHVpbnQgcGl4ZWxTaGFkZXIgPSBsb2FkU2hhZGVyKEdMX0ZSQUdNRU5UX1NIQURFUiwgcEZyYWdtZW50U291cmNlKTsKKyAgICBpZiAoIXBpeGVsU2hhZGVyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEdMdWludCBwcm9ncmFtID0gZ2xDcmVhdGVQcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0pIHsKKyAgICAgICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTsKKyAgICAgICAgY2hlY2tHbEVycm9yKCJnbEF0dGFjaFNoYWRlciB2Iik7CisgICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHBpeGVsU2hhZGVyKTsKKyAgICAgICAgY2hlY2tHbEVycm9yKCJnbEF0dGFjaFNoYWRlciBwIik7CisKKyAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgQV9QT1MsICJhX3BvcyIpOworICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBBX0NPTE9SLCAiYV9jb2xvciIpOworICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBBX1RFWDAsICJhX3RleDAiKTsKKyAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgQV9URVgxLCAiYV90ZXgxIik7CisgICAgICAgIGdsTGlua1Byb2dyYW0ocHJvZ3JhbSk7CisgICAgICAgIEdMaW50IGxpbmtTdGF0dXMgPSBHTF9GQUxTRTsKKyAgICAgICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfTElOS19TVEFUVVMsICZsaW5rU3RhdHVzKTsKKyAgICAgICAgaWYgKGxpbmtTdGF0dXMgIT0gR0xfVFJVRSkgeworICAgICAgICAgICAgR0xpbnQgYnVmTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0lORk9fTE9HX0xFTkdUSCwgJmJ1Zkxlbmd0aCk7CisgICAgICAgICAgICBpZiAoYnVmTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoYnVmTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmKSB7CisgICAgICAgICAgICAgICAgICAgIGdsR2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSwgYnVmTGVuZ3RoLCBOVUxMLCBidWYpOworICAgICAgICAgICAgICAgICAgICBMT0dFKCJDb3VsZCBub3QgbGluayBwcm9ncmFtOlxuJXNcbiIsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnbERlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7CisgICAgICAgICAgICBwcm9ncmFtID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBjaGVja0dsRXJyb3IoImNyZWF0ZVByb2dyYW0iKTsKKyAgICBnbFVzZVByb2dyYW0ocHJvZ3JhbSk7CisgICAgcmV0dXJuIHByb2dyYW07Cit9CisKK3VpbnQ2NF90IGdldFRpbWUoKSB7CisgICAgc3RydWN0IHRpbWVzcGVjIHQ7CisgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0KTsKKyAgICByZXR1cm4gdC50dl9uc2VjICsgKCh1aW50NjRfdCl0LnR2X3NlYyAqIDEwMDAgKiAxMDAwICogMTAwMCk7Cit9CisKK3VpbnQ2NF90IGdUaW1lOwordm9pZCBzdGFydFRpbWVyKCkgeworICAgIGdUaW1lID0gZ2V0VGltZSgpOworfQorCit2b2lkIGVuZFRpbWVyKGNvbnN0IGNoYXIgKnN0ciwgaW50IHcsIGludCBoLCBkb3VibGUgZGMsIGludCBjb3VudCkgeworICAgIHVpbnQ2NF90IHQyID0gZ2V0VGltZSgpOworICAgIGRvdWJsZSBkZWx0YSA9ICgoZG91YmxlKSh0MiAtIGdUaW1lKSkgLyAxMDAwMDAwMDAwOworICAgIGRvdWJsZSBwaXhlbHMgPSBkYyAqICh3ICogaCkgKiBjb3VudDsKKyAgICBkb3VibGUgbXBwcyA9IHBpeGVscyAvIGRlbHRhIC8gMTAwMDAwMDsKKyAgICBkb3VibGUgZGM2MCA9IHBpeGVscyAvIGRlbHRhIC8gKHcgKiBoKSAvIDYwOworCisgICAgaWYgKGZPdXQpIHsKKyAgICAgICAgZnByaW50ZihmT3V0LCAiJXMsICVmLCAlZlxyXG4iLCBzdHIsIG1wcHMsIGRjNjApOworICAgICAgICBmZmx1c2goZk91dCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcywgJWYsICVmXG4iLCBzdHIsIG1wcHMsIGRjNjApOworICAgIH0KKyAgICBMT0dJKCIlcywgJWYsICVmXHJcbiIsIHN0ciwgbXBwcywgZGM2MCk7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgZ1ZlcnRleFNoYWRlcltdID0KKyAgICAiYXR0cmlidXRlIHZlYzQgYV9wb3M7XG4iCisgICAgImF0dHJpYnV0ZSB2ZWM0IGFfY29sb3I7XG4iCisgICAgImF0dHJpYnV0ZSB2ZWMyIGFfdGV4MDtcbiIKKyAgICAiYXR0cmlidXRlIHZlYzIgYV90ZXgxO1xuIgorICAgICJ2YXJ5aW5nIHZlYzQgdl9jb2xvcjtcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZfdGV4MDtcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZfdGV4MTtcbiIKKworICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgIiAgICB2X2NvbG9yID0gYV9jb2xvcjtcbiIKKyAgICAiICAgIHZfdGV4MCA9IGFfdGV4MDtcbiIKKyAgICAiICAgIHZfdGV4MSA9IGFfdGV4MTtcbiIKKyAgICAiICAgIGdsX1Bvc2l0aW9uID0gYV9wb3M7XG4iCisgICAgIn1cbiI7CisKK3N0YXRpYyBjb25zdCBjaGFyIGdTaGFkZXJQcmVmaXhbXSA9CisgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgorICAgICJ1bmlmb3JtIHZlYzQgdV9jb2xvcjtcbiIKKyAgICAidW5pZm9ybSB2ZWM0IHVfMDtcbiIKKyAgICAidW5pZm9ybSB2ZWM0IHVfMTtcbiIKKyAgICAidW5pZm9ybSB2ZWM0IHVfMjtcbiIKKyAgICAidW5pZm9ybSB2ZWM0IHVfMztcbiIKKyAgICAidmFyeWluZyB2ZWM0IHZfY29sb3I7XG4iCisgICAgInZhcnlpbmcgdmVjMiB2X3RleDA7XG4iCisgICAgInZhcnlpbmcgdmVjMiB2X3RleDE7XG4iCisgICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4MDtcbiIKKyAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXgxO1xuIgorICAgICJ2b2lkIG1haW4oKSB7XG4iOworCitzdGF0aWMgY29uc3QgY2hhciBnU2hhZGVyUG9zdGZpeFtdID0KKyAgICAiICBnbF9GcmFnQ29sb3IgPSBjO1xuIgorICAgICJ9XG4iOworCisKK3N0YXRpYyBjaGFyICogYXBwZW5kKGNoYXIgKmQsIGNvbnN0IGNoYXIgKnMpIHsKKyAgICBzaXplX3QgbGVuID0gc3RybGVuKHMpOworICAgIG1lbWNweShkLCBzLCBsZW4pOworICAgIHJldHVybiBkICsgbGVuOworfQorCitzdGF0aWMgY2hhciAqIGdlblNoYWRlcigKKyAgICBib29sIHVzZVZhckNvbG9yLAorICAgIGludCB0ZXhDb3VudCwKKyAgICBib29sIG1vZHVsYXRlRmlyc3RUZXgsCisgICAgaW50IGV4dHJhTWF0aCkKK3sKKyAgICBjaGFyICpzdHIgPSAoY2hhciAqKWNhbGxvYygxNiAqIDEwMjQsIDEpOworICAgIGNoYXIgKnRtcCA9IGFwcGVuZChzdHIsIGdTaGFkZXJQcmVmaXgpOworCisgICAgaWYgKG1vZHVsYXRlRmlyc3RUZXggfHwgIXRleENvdW50KSB7CisgICAgICAgIGlmICh1c2VWYXJDb2xvcikgeworICAgICAgICAgICAgdG1wID0gYXBwZW5kKHRtcCwgIiAgdmVjNCBjID0gdl9jb2xvcjtcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdG1wID0gYXBwZW5kKHRtcCwgIiAgdmVjNCBjID0gdV9jb2xvcjtcbiIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdG1wID0gYXBwZW5kKHRtcCwgIiAgdmVjNCBjID0gdGV4dHVyZTJEKHVfdGV4MCwgdl90ZXgwKTtcbiIpOworICAgIH0KKworICAgIGlmIChtb2R1bGF0ZUZpcnN0VGV4ICYmIHRleENvdW50KSB7CisgICAgICAgIHRtcCA9IGFwcGVuZCh0bXAsICIgIGMgKj0gdGV4dHVyZTJEKHVfdGV4MCwgdl90ZXgwKTtcbiIpOworICAgIH0KKyAgICBpZiAodGV4Q291bnQgPiAxKSB7CisgICAgICAgIHRtcCA9IGFwcGVuZCh0bXAsICIgIGMgKj0gdGV4dHVyZTJEKHVfdGV4MSwgdl90ZXgxKTtcbiIpOworICAgIH0KKworICAgIGlmIChleHRyYU1hdGggPiAwKSB7CisgICAgICAgIHRtcCA9IGFwcGVuZCh0bXAsICIgIGMgKj0gdV8wO1xuIik7CisgICAgfQorICAgIGlmIChleHRyYU1hdGggPiAxKSB7CisgICAgICAgIHRtcCA9IGFwcGVuZCh0bXAsICIgIGMgKz0gdV8xO1xuIik7CisgICAgfQorICAgIGlmIChleHRyYU1hdGggPiAyKSB7CisgICAgICAgIHRtcCA9IGFwcGVuZCh0bXAsICIgIGMgKj0gdV8yO1xuIik7CisgICAgfQorICAgIGlmIChleHRyYU1hdGggPiAzKSB7CisgICAgICAgIHRtcCA9IGFwcGVuZCh0bXAsICIgIGMgKz0gdV8zO1xuIik7CisgICAgfQorCisKKyAgICB0bXAgPSBhcHBlbmQodG1wLCBnU2hhZGVyUG9zdGZpeCk7CisgICAgdG1wWzBdID0gMDsKKworICAgIC8vcHJpbnRmKCIlcyIsIHN0cik7CisgICAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIHZvaWQgc2V0dXBWQSgpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgdnR4W10gPSB7CisgICAgICAgIC0xLjBmLC0xLjBmLAorICAgICAgICAgMS4wZiwtMS4wZiwKKyAgICAgICAgLTEuMGYsIDEuMGYsCisgICAgICAgICAxLjBmLCAxLjBmIH07CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGNvbG9yW10gPSB7CisgICAgICAgIDEuMGYsMC4wZiwxLjBmLDEuMGYsCisgICAgICAgIDAuMGYsMC4wZiwxLjBmLDEuMGYsCisgICAgICAgIDEuMGYsMS4wZiwwLjBmLDEuMGYsCisgICAgICAgIDEuMGYsMS4wZiwxLjBmLDEuMGYgfTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgdGV4MFtdID0geworICAgICAgICAwLjBmLDAuMGYsCisgICAgICAgIDEuMGYsMC4wZiwKKyAgICAgICAgMS4wZiwxLjBmLAorICAgICAgICAwLjBmLDEuMGYgfTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgdGV4MVtdID0geworICAgICAgICAxLjBmLDAuMGYsCisgICAgICAgIDEuMGYsMS4wZiwKKyAgICAgICAgMC4wZiwxLjBmLAorICAgICAgICAwLjBmLDAuMGYgfTsKKworICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoQV9QT1MpOworICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoQV9DT0xPUik7CisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShBX1RFWDApOworICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoQV9URVgxKTsKKworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihBX1BPUywgMiwgR0xfRkxPQVQsIGZhbHNlLCA4LCB2dHgpOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihBX0NPTE9SLCA0LCBHTF9GTE9BVCwgZmFsc2UsIDE2LCBjb2xvcik7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKEFfVEVYMCwgMiwgR0xfRkxPQVQsIGZhbHNlLCA4LCB0ZXgwKTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoQV9URVgxLCAyLCBHTF9GTE9BVCwgZmFsc2UsIDgsIHRleDEpOworfQorCitzdGF0aWMgdm9pZCByYW5kVW5pZm9ybShpbnQgcGdtLCBjb25zdCBjaGFyICp2YXIpIHsKKyAgICBpbnQgbG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocGdtLCB2YXIpOworICAgIGlmIChsb2MgPj0gMCkgeworICAgICAgICBmbG9hdCB4ID0gKChmbG9hdClyYW5kKCkpIC8gUkFORF9NQVg7CisgICAgICAgIGZsb2F0IHkgPSAoKGZsb2F0KXJhbmQoKSkgLyBSQU5EX01BWDsKKyAgICAgICAgZmxvYXQgeiA9ICgoZmxvYXQpcmFuZCgpKSAvIFJBTkRfTUFYOworICAgICAgICBmbG9hdCB3ID0gKChmbG9hdClyYW5kKCkpIC8gUkFORF9NQVg7CisgICAgICAgIGdsVW5pZm9ybTRmKGxvYywgeCwgeSwgeiwgdyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkb0xvb3AoYm9vbCBjbGVhciwgaW50IHBnbSwgdWludDMyX3QgdywgdWludDMyX3QgaCwgY29uc3QgY2hhciAqc3RyKSB7CisgICAgaWYgKGNsZWFyKSB7CisgICAgICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfU1RSSVAsIDAsIDQpOworICAgICAgICBwdFN3YXAoKTsKKyAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXJ0VGltZXIoKTsKKyAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDsgY3QrKykgeworICAgICAgICByYW5kVW5pZm9ybShwZ20sICJ1X2NvbG9yIik7CisgICAgICAgIHJhbmRVbmlmb3JtKHBnbSwgInVfMCIpOworICAgICAgICByYW5kVW5pZm9ybShwZ20sICJ1XzEiKTsKKyAgICAgICAgcmFuZFVuaWZvcm0ocGdtLCAidV8yIik7CisgICAgICAgIHJhbmRVbmlmb3JtKHBnbSwgInVfMyIpOworICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfU1RSSVAsIDAsIDQpOworICAgIH0KKyAgICBwdFN3YXAoKTsKKyAgICBnbEZpbmlzaCgpOworICAgIGVuZFRpbWVyKHN0ciwgdywgaCwgMSwgMTAwKTsKK30KKwordm9pZCBnZW5UZXh0dXJlcygpIHsKKyAgICB1aW50MzJfdCAqbSA9ICh1aW50MzJfdCAqKW1hbGxvYygxMDI0KjEwMjQqNCk7CisgICAgZm9yIChpbnQgeT0wOyB5IDwgMTAyNDsgeSsrKXsKKyAgICAgICAgZm9yIChpbnQgeD0wOyB4IDwgMTAyNDsgeCsrKXsKKyAgICAgICAgICAgIG1beSoxMDI0ICsgeF0gPSAweGZmMDAwMGZmIHwgKCh4ICYgMHhmZikgPDwgOCkgfCAoeSA8PCAxNik7CisgICAgICAgIH0KKyAgICB9CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAxKTsKKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgMTAyNCwgMTAyNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgbSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfUkVQRUFUKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX1JFUEVBVCk7CisKKyAgICBmb3IgKGludCB5PTA7IHkgPCAxNjsgeSsrKXsKKyAgICAgICAgZm9yIChpbnQgeD0wOyB4IDwgMTY7IHgrKyl7CisgICAgICAgICAgICBtW3kqMTYgKyB4XSA9IDB4ZmYwMDAwZmYgfCAoeDw8MTIpIHwgKHk8PDIwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDIpOworICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCAxNiwgMTYsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIG0pOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX1JFUEVBVCk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9SRVBFQVQpOworCit9CisKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZmlsbHRlc3QuY3BwIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZmlsbHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZDRlMjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9maWxsdGVzdC5jcHAKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworCisjaW5jbHVkZSAiZmlsbF9jb21tb24uY3BwIgorCitzdGF0aWMgdm9pZCBkb1NpbmdsZVRlc3QodWludDMyX3QgdywgdWludDMyX3QgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZVZhckNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0ZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1vZHVsYXRlRmlyc3RUZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4dHJhTWF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGV4MCwgaW50IHRleDEpIHsKKyAgICBjaGFyICpwZ21UeHQgPSBnZW5TaGFkZXIodXNlVmFyQ29sb3IsIHRleENvdW50LCBtb2R1bGF0ZUZpcnN0VGV4LCBleHRyYU1hdGgpOworICAgIGludCBwZ20gPSBjcmVhdGVQcm9ncmFtKGdWZXJ0ZXhTaGFkZXIsIHBnbVR4dCk7CisgICAgaWYgKCFwZ20pIHsKKyAgICAgICAgcHJpbnRmKCJlcnJvciBydW5uaW5nIHRlc3RcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludCBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwZ20sICJ1X3RleDAiKTsKKyAgICBpZiAobG9jID49IDApIGdsVW5pZm9ybTFpKGxvYywgMCk7CisgICAgbG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocGdtLCAidV90ZXgxIik7CisgICAgaWYgKGxvYyA+PSAwKSBnbFVuaWZvcm0xaShsb2MsIDEpOworCisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleDApOworICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMSk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXgxKTsKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworCisgICAgY2hhciBzdHIyWzEwMjRdOworCisgICAgZ2xCbGVuZEZ1bmMoR0xfT05FLCBHTF9PTkUpOworICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgLy9zcHJpbnRmKHN0cjIsICIlaSwgJWksICVpLCAlaSwgJWksIDAiLAorICAgICAgICAgICAgLy91c2VWYXJDb2xvciwgdGV4Q291bnQsIG1vZHVsYXRlRmlyc3RUZXgsIGV4dHJhTWF0aCwgdGV4MCk7CisgICAgLy9kb0xvb3AodHJ1ZSwgcGdtLCB3LCBoLCBzdHIyKTsKKyAgICAvL2RvTG9vcChmYWxzZSwgcGdtLCB3LCBoLCBzdHIyKTsKKworICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICBzcHJpbnRmKHN0cjIsICIlaSwgJWksICVpLCAlaSwgJWksIDEiLAorICAgICAgICAgICAgdXNlVmFyQ29sb3IsIHRleENvdW50LCBtb2R1bGF0ZUZpcnN0VGV4LCBleHRyYU1hdGgsIHRleDApOworICAgIGRvTG9vcCh0cnVlLCBwZ20sIHcsIGgsIHN0cjIpOworICAgIGRvTG9vcChmYWxzZSwgcGdtLCB3LCBoLCBzdHIyKTsKK30KKworYm9vbCBkb1Rlc3QodWludDMyX3QgdywgdWludDMyX3QgaCkgeworICAgIHNldHVwVkEoKTsKKyAgICBnZW5UZXh0dXJlcygpOworCisgICAgcHJpbnRmKCJcbnZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGUsIGV4dHJhTWF0aCwgdGV4U2l6ZSwgYmxlbmQsIE1wcHMsIERDNjBcbiIpOworCisgICAgZm9yIChpbnQgdGV4Q291bnQgPSAwOyB0ZXhDb3VudCA8IDI7IHRleENvdW50KyspIHsKKyAgICAgICAgZm9yIChpbnQgZXh0cmFNYXRoID0gMDsgZXh0cmFNYXRoIDwgNTsgZXh0cmFNYXRoKyspIHsKKworICAgICAgICAgICAgZG9TaW5nbGVUZXN0KHcsIGgsIGZhbHNlLCB0ZXhDb3VudCwgZmFsc2UsIGV4dHJhTWF0aCwgMSwgMSk7CisgICAgICAgICAgICBkb1NpbmdsZVRlc3QodywgaCwgdHJ1ZSwgdGV4Q291bnQsIGZhbHNlLCBleHRyYU1hdGgsIDEsIDEpOworICAgICAgICAgICAgaWYgKHRleENvdW50KSB7CisgICAgICAgICAgICAgICAgZG9TaW5nbGVUZXN0KHcsIGgsIGZhbHNlLCB0ZXhDb3VudCwgdHJ1ZSwgZXh0cmFNYXRoLCAxLCAxKTsKKyAgICAgICAgICAgICAgICBkb1NpbmdsZVRlc3QodywgaCwgdHJ1ZSwgdGV4Q291bnQsIHRydWUsIGV4dHJhTWF0aCwgMSwgMSk7CisKKyAgICAgICAgICAgICAgICBkb1NpbmdsZVRlc3QodywgaCwgZmFsc2UsIHRleENvdW50LCBmYWxzZSwgZXh0cmFNYXRoLCAyLCAyKTsKKyAgICAgICAgICAgICAgICBkb1NpbmdsZVRlc3QodywgaCwgdHJ1ZSwgdGV4Q291bnQsIGZhbHNlLCBleHRyYU1hdGgsIDIsIDIpOworICAgICAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCBmYWxzZSwgdGV4Q291bnQsIHRydWUsIGV4dHJhTWF0aCwgMiwgMik7CisgICAgICAgICAgICAgICAgZG9TaW5nbGVUZXN0KHcsIGgsIHRydWUsIHRleENvdW50LCB0cnVlLCBleHRyYU1hdGgsIDIsIDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZXhpdCgwKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL2dsMl9wZXJmLmNwcCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2dsMl9wZXJmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGZjZjFjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZ2wyX3BlcmYuY3BwCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworI2luY2x1ZGUgPHVpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93Lmg+CisjaW5jbHVkZSA8dWkvRUdMVXRpbHMuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKworc3RhdGljIHZvaWQgY2hlY2tFZ2xFcnJvcihjb25zdCBjaGFyKiBvcCwgRUdMQm9vbGVhbiByZXR1cm5WYWwgPSBFR0xfVFJVRSkgeworICAgIGlmIChyZXR1cm5WYWwgIT0gRUdMX1RSVUUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcygpIHJldHVybmVkICVkXG4iLCBvcCwgcmV0dXJuVmFsKTsKKyAgICB9CisKKyAgICBmb3IgKEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7IGVycm9yICE9IEVHTF9TVUNDRVNTOyBlcnJvcgorICAgICAgICAgICAgPSBlZ2xHZXRFcnJvcigpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYWZ0ZXIgJXMoKSBlZ2xFcnJvciAlcyAoMHgleClcbiIsIG9wLCBFR0xVdGlsczo6c3RyZXJyb3IoZXJyb3IpLAorICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrR2xFcnJvcihjb25zdCBjaGFyKiBvcCkgeworICAgIGZvciAoR0xpbnQgZXJyb3IgPSBnbEdldEVycm9yKCk7IGVycm9yOyBlcnJvcgorICAgICAgICAgICAgPSBnbEdldEVycm9yKCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZnRlciAlcygpIGdsRXJyb3IgKDB4JXgpXG4iLCBvcCwgZXJyb3IpOworICAgIH0KK30KKworYm9vbCBkb1Rlc3QodWludDMyX3QgdywgdWludDMyX3QgaCk7CisKK3N0YXRpYyBFR0xEaXNwbGF5IGRweTsKK3N0YXRpYyBFR0xTdXJmYWNlIHN1cmZhY2U7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIEVHTEJvb2xlYW4gcmV0dXJuVmFsdWU7CisgICAgRUdMQ29uZmlnIG15Q29uZmlnID0gezB9OworCisgICAgRUdMaW50IGNvbnRleHRfYXR0cmlic1tdID0geyBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMiwgRUdMX05PTkUgfTsKKyAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7CisgICAgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfV0lORE9XX0JJVCwKKyAgICAgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKKyAgICAgICAgICAgIEVHTF9OT05FIH07CisgICAgRUdMaW50IG1ham9yVmVyc2lvbjsKKyAgICBFR0xpbnQgbWlub3JWZXJzaW9uOworICAgIEVHTENvbnRleHQgY29udGV4dDsKKyAgICBFR0xpbnQgdywgaDsKKworCisgICAgY2hlY2tFZ2xFcnJvcigiPGluaXQ+Iik7CisgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICBjaGVja0VnbEVycm9yKCJlZ2xHZXREaXNwbGF5Iik7CisgICAgaWYgKGRweSA9PSBFR0xfTk9fRElTUExBWSkgeworICAgICAgICBwcmludGYoImVnbEdldERpc3BsYXkgcmV0dXJuZWQgRUdMX05PX0RJU1BMQVkuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuVmFsdWUgPSBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsSW5pdGlhbGl6ZSIsIHJldHVyblZhbHVlKTsKKyAgICBpZiAocmV0dXJuVmFsdWUgIT0gRUdMX1RSVUUpIHsKKyAgICAgICAgcHJpbnRmKCJlZ2xJbml0aWFsaXplIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93ID0gYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpOw0KKyAgICByZXR1cm5WYWx1ZSA9IEVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coZHB5LCBzX2NvbmZpZ0F0dHJpYnMsIHdpbmRvdywgJm15Q29uZmlnKTsKKyAgICBpZiAocmV0dXJuVmFsdWUpIHsKKyAgICAgICAgcHJpbnRmKCJFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KCkgcmV0dXJuZWQgJWQiLCByZXR1cm5WYWx1ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGNoZWNrRWdsRXJyb3IoIkVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3ciKTsKKworICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgbXlDb25maWcsIHdpbmRvdywgTlVMTCk7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsQ3JlYXRlV2luZG93U3VyZmFjZSIpOworICAgIGlmIChzdXJmYWNlID09IEVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgIHByaW50ZigiZ2VsQ3JlYXRlV2luZG93U3VyZmFjZSBmYWlsZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBteUNvbmZpZywgRUdMX05PX0NPTlRFWFQsIGNvbnRleHRfYXR0cmlicyk7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsQ3JlYXRlQ29udGV4dCIpOworICAgIGlmIChjb250ZXh0ID09IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgIHByaW50ZigiZWdsQ3JlYXRlQ29udGV4dCBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuVmFsdWUgPSBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOworICAgIGNoZWNrRWdsRXJyb3IoImVnbE1ha2VDdXJyZW50IiwgcmV0dXJuVmFsdWUpOworICAgIGlmIChyZXR1cm5WYWx1ZSAhPSBFR0xfVFJVRSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmdyk7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsUXVlcnlTdXJmYWNlIik7CisgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpOworICAgIGNoZWNrRWdsRXJyb3IoImVnbFF1ZXJ5U3VyZmFjZSIpOworICAgIEdMaW50IGRpbSA9IHcgPCBoID8gdyA6IGg7CisKKyAgICBnbFZpZXdwb3J0KDAsIDAsIHcsIGgpOworCisgICAgZm9yICg7OykgeworICAgICAgICBkb1Rlc3QodywgaCk7CisgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgICAgIGNoZWNrRWdsRXJyb3IoImVnbFN3YXBCdWZmZXJzIik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgcHRTd2FwKCkgeworICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNzVhNzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTQgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgT3BlbkdMIEVTIFBlcmYgQXBwCisjIFRoaXMgbWFrZWZpbGUgYnVpbGRzIGJvdGggYW4gYWN0aXZpdHkgYW5kIGEgc2hhcmVkIGxpYnJhcnkuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKSAjIG5vdCA2NCBiaXQgY2xlYW4KKworVE9QX0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjIEJ1aWxkIGFjdGl2aXR5CisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gR0xQZXJmCisKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmdscGVyZgorCisjIFJ1biBvbiBFY2xhaXIKK0xPQ0FMX1NES19WRVJTSU9OIDo9IDcKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQnVpbGQgSk5JIFNoYXJlZCBMaWJyYXJ5CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0xPQ0FMX1BBVEg6PSAkKExPQ0FMX1BBVEgpL2puaQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBPcHRpb25hbCB0YWcgd291bGQgbWVhbiBpdCBkb2Vzbid0IGdldCBpbnN0YWxsZWQgYnkgZGVmYXVsdAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICBnbF9jb2RlLmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJ1dGlscyBcCisJbGliRUdMIFwKKwlsaWJHTEVTdjIKKworTE9DQUxfTU9EVUxFIDo9IGxpYmdscGVyZgorCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK2VuZGlmICMgVEFSR0VUX1NJTVVMQVRPUgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA1ZDk1ZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmdscGVyZiIKKyAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAuMCIgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMTAwMDAiID4KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSI3IiBhbmRyb2lkOm1pblNka1ZlcnNpb249IjciIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgorICAgIDxhcHBsaWNhdGlvbgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9nbHBlcmZfYWN0aXZpdHkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJHTFBlcmZBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyLkZ1bGxzY3JlZW4iCisgICAgICAgICAgICAJYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVUYXNrIgorICAgICAgICAgICAgCWFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258a2V5Ym9hcmRIaWRkZW4iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvam5pL2dsX2NvZGUuY3BwIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvam5pL2dsX2NvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NDMyOTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9qbmkvZ2xfY29kZS5jcHAKQEAgLTAsMCArMSwxOTQgQEAKKy8vIE9wZW5HTCBFUyAyLjAgY29kZQorCisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL2puaS5oPgorI2RlZmluZSBMT0dfVEFHICJHTFBlcmYgZ2xfY29kZS5jcHAiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIi4uLy4uL2dsX3BlcmYvZmlsbF9jb21tb24uY3BwIgorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHNjcmVlbgorCit1aW50MzJfdCB3OwordWludDMyX3QgaDsKKworLy8gVGhlIHN0YXRlQ2xvY2sgc3RhcnRzIGF0IHplcm8gYW5kIGluY3JlbWVudHMgYnkgMSBldmVyeSB0aW1lIHdlIGRyYXcgYSBmcmFtZS4gSXQgaXMgdXNlZCB0byBjb250cm9sIHdoaWNoIHBoYXNlIG9mIHRoZSB0ZXN0IHdlIGFyZSBpbi4KKworaW50IHN0YXRlQ2xvY2s7Citjb25zdCBpbnQgZG9Mb29wU3RhdGVzID0gMjsKK2NvbnN0IGludCBkb1NpbmdsZVRlc3RTdGF0ZXMgPSAyOworYm9vbCBkb25lOworCisvLyBTYXZlcyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgdGVzdCAoc28gd2UgY2FuIHByaW50IHRoZW0gb3V0IHdoZW4gd2UgZmluaXNoIHRoZSB0aW1pbmcuKQorCitjaGFyIHNhdmVCdWZbMTAyNF07CisKKworaW50IHBnbTsKKwordm9pZCBwdFN3YXAoKSB7Cit9CisKK3N0YXRpYyB2b2lkIGRvU2luZ2xlVGVzdCh1aW50MzJfdCB3LCB1aW50MzJfdCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlVmFyQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRleENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbW9kdWxhdGVGaXJzdFRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXh0cmFNYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0ZXgwLCBpbnQgdGV4MSkgeworICAgIGludCBkb1NpbmdsZVRlc3RTdGF0ZSA9IChzdGF0ZUNsb2NrIC8gZG9Mb29wU3RhdGVzKSAlIGRvU2luZ2xlVGVzdFN0YXRlczsKKyAgICAvLyBMT0dJKCJkb1NpbmdsZVRlc3QgJWRcbiIsIGRvU2luZ2xlVGVzdFN0YXRlKTsKKyAgICBzd2l0Y2ggKGRvU2luZ2xlVGVzdFN0YXRlKSB7CisJY2FzZSAwOiB7CisJICAgIGNoYXIgKnBnbVR4dCA9IGdlblNoYWRlcih1c2VWYXJDb2xvciwgdGV4Q291bnQsIG1vZHVsYXRlRmlyc3RUZXgsIGV4dHJhTWF0aCk7CisJICAgIHBnbSA9IGNyZWF0ZVByb2dyYW0oZ1ZlcnRleFNoYWRlciwgcGdtVHh0KTsKKwkgICAgaWYgKCFwZ20pIHsKKwkJTE9HRSgiZXJyb3IgcnVubmluZyB0ZXN0XG4iKTsKKwkJcmV0dXJuOworCSAgICB9CisJICAgIGludCBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwZ20sICJ1X3RleDAiKTsKKwkgICAgaWYgKGxvYyA+PSAwKSBnbFVuaWZvcm0xaShsb2MsIDApOworCSAgICBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwZ20sICJ1X3RleDEiKTsKKwkgICAgaWYgKGxvYyA+PSAwKSBnbFVuaWZvcm0xaShsb2MsIDEpOworCisJICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7CisJICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4MCk7CisJICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMSk7CisJICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4MSk7CisJICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7CisKKworCSAgICBnbEJsZW5kRnVuYyhHTF9PTkUsIEdMX09ORSk7CisJICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgICAgICAgICBjaGFyIHN0cjJbMTAyNF07CisJICAgIHNwcmludGYoc3RyMiwgIiVpLCAlaSwgJWksICVpLCAlaSwgMCIsCisJCSAgICB1c2VWYXJDb2xvciwgdGV4Q291bnQsIG1vZHVsYXRlRmlyc3RUZXgsIGV4dHJhTWF0aCwgdGV4MCk7CisKKyAgICAJICAgIGRvTG9vcCgoc3RhdGVDbG9jayAlIGRvTG9vcFN0YXRlcykgIT0gMCwgcGdtLCB3LCBoLCBzdHIyKTsKKwkgfQorICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIDE6IHsKKyAgICAgICAgICAgIGNoYXIgc3RyMlsxMDI0XTsKKwkgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworCSAgICBzcHJpbnRmKHN0cjIsICIlaSwgJWksICVpLCAlaSwgJWksIDEiLAorCQkgICAgdXNlVmFyQ29sb3IsIHRleENvdW50LCBtb2R1bGF0ZUZpcnN0VGV4LCBleHRyYU1hdGgsIHRleDApOworCSAgICBkb0xvb3AoKHN0YXRlQ2xvY2sgJSBkb0xvb3BTdGF0ZXMpICE9IDAsIHBnbSwgdywgaCwgc3RyMik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKK3ZvaWQgZG9UZXN0KHVpbnQzMl90IHcsIHVpbnQzMl90IGgpIHsKKyAgICBpbnQgdGVzdFN0YXRlID0gc3RhdGVDbG9jayAvIChkb0xvb3BTdGF0ZXMgKiBkb1NpbmdsZVRlc3RTdGF0ZXMpOworICAgIGludCB0ZXhDb3VudDsKKyAgICBpbnQgZXh0cmFNYXRoOworICAgIGludCB0ZXN0U3ViU3RhdGU7CisgICAgY29uc3QgaW50IGV4dHJhTWF0aENvdW50ID0gNTsKKyAgICBjb25zdCBpbnQgdGV4Q291bnQwU3ViVGVzdENvdW50ID0gMjsKKyAgICBjb25zdCBpbnQgdGV4Q291bnROU3ViVGVzdENvdW50ID0gODsKKworICAgIGlmICggdGVzdFN0YXRlIDwgZXh0cmFNYXRoQ291bnQgKiB0ZXhDb3VudDBTdWJUZXN0Q291bnQpIHsKKyAgICAgICB0ZXhDb3VudCA9IDA7IC8vIE9ubHkgMTAgdGVzdHMgZm9yIHRleENvdW50IDAKKyAgICAgICBleHRyYU1hdGggPSAodGVzdFN0YXRlIC8gdGV4Q291bnQwU3ViVGVzdENvdW50KSAlIGV4dHJhTWF0aENvdW50OworICAgICAgIHRlc3RTdWJTdGF0ZSA9IHRlc3RTdGF0ZSAlIHRleENvdW50MFN1YlRlc3RDb3VudDsKKyAgICB9IGVsc2UgeworICAgICAgIHRleENvdW50ID0gMSArICh0ZXN0U3RhdGUgLSBleHRyYU1hdGhDb3VudCAqIHRleENvdW50MFN1YlRlc3RDb3VudCkgLyAoZXh0cmFNYXRoQ291bnQgKiB0ZXhDb3VudE5TdWJUZXN0Q291bnQpOworICAgICAgIGV4dHJhTWF0aCA9ICh0ZXN0U3RhdGUgLyB0ZXhDb3VudE5TdWJUZXN0Q291bnQpICUgZXh0cmFNYXRoQ291bnQ7CisgICAgICAgdGVzdFN1YlN0YXRlID0gdGVzdFN0YXRlICUgdGV4Q291bnROU3ViVGVzdENvdW50OworICAgIH0KKyAgICBpZiAodGV4Q291bnQgPj0gMykgeworICAgICAgIExPR0koImRvbmVcbiIpOworICAgICAgIGlmIChmT3V0KSB7CisgICAgICAgICAgIGZjbG9zZShmT3V0KTsKKyAgICAgICAgICAgZk91dCA9IE5VTEw7CisgICAgICAgfQorICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIC8vIExPR0koImRvVGVzdCAlZCAlZCAlZFxuIiwgdGV4Q291bnQsIGV4dHJhTWF0aCwgdGVzdFN1YlN0YXRlKTsKKworICAgIHN3aXRjaCh0ZXN0U3ViU3RhdGUpIHsKKwljYXNlIDA6CisgICAgICAgICAgICBkb1NpbmdsZVRlc3QodywgaCwgZmFsc2UsIHRleENvdW50LCBmYWxzZSwgZXh0cmFNYXRoLCAxLCAxKTsKKwlicmVhazsKKwljYXNlIDE6CisgICAgICAgICAgICBkb1NpbmdsZVRlc3QodywgaCwgdHJ1ZSwgdGV4Q291bnQsIGZhbHNlLCBleHRyYU1hdGgsIDEsIDEpOworCWJyZWFrOworCWNhc2UgMjoKKyAgICAgICAgICAgICAgICBkb1NpbmdsZVRlc3QodywgaCwgZmFsc2UsIHRleENvdW50LCB0cnVlLCBleHRyYU1hdGgsIDEsIDEpOworCWJyZWFrOworCWNhc2UgMzoKKyAgICAgICAgICAgICAgICBkb1NpbmdsZVRlc3QodywgaCwgdHJ1ZSwgdGV4Q291bnQsIHRydWUsIGV4dHJhTWF0aCwgMSwgMSk7CisJYnJlYWs7CisKKwljYXNlIDQ6CisgICAgICAgICAgICAgICAgZG9TaW5nbGVUZXN0KHcsIGgsIGZhbHNlLCB0ZXhDb3VudCwgZmFsc2UsIGV4dHJhTWF0aCwgMiwgMik7CisJYnJlYWs7CisJY2FzZSA1OgorICAgICAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCB0cnVlLCB0ZXhDb3VudCwgZmFsc2UsIGV4dHJhTWF0aCwgMiwgMik7CisJYnJlYWs7CisJY2FzZSA2OgorICAgICAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCBmYWxzZSwgdGV4Q291bnQsIHRydWUsIGV4dHJhTWF0aCwgMiwgMik7CisJYnJlYWs7CisJY2FzZSA3OgorICAgICAgICAgICAgICAgIGRvU2luZ2xlVGVzdCh3LCBoLCB0cnVlLCB0ZXhDb3VudCwgdHJ1ZSwgZXh0cmFNYXRoLCAyLCAyKTsKKwlicmVhazsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgeworICAgIEpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbHBlcmZfR0xQZXJmTGliX2luaXQoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaiwgIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KTsKKyAgICBKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2xwZXJmX0dMUGVyZkxpYl9zdGVwKEpOSUVudiAqIGVudiwgam9iamVjdCBvYmopOworfTsKKworSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dscGVyZl9HTFBlcmZMaWJfaW5pdChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqLCAgamludCB3aWR0aCwgamludCBoZWlnaHQpCit7CisgICAgaWYgKCFkb25lKSB7CisJICAgIHcgPSB3aWR0aDsKKwkgICAgaCA9IGhlaWdodDsKKwkgICAgc3RhdGVDbG9jayA9IDA7CisJICAgIGRvbmUgPSBmYWxzZTsKKwkgICAgc2V0dXBWQSgpOworCSAgICBnZW5UZXh0dXJlcygpOworCSAgICBjb25zdCBjaGFyKiBmaWxlTmFtZSA9ICIvc2RjYXJkL2dscGVyZi5jc3YiOworICAgICAgICAgICAgaWYgKGZPdXQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICBMT0dJKCJDbG9zaW5nIHBhcnRpYWxseSB3cml0dGVuIG91dHB1dC5uIik7CisgICAgICAgICAgICAgICAgIGZjbG9zZShmT3V0KTsKKyAgICAgICAgICAgICAgICAgZk91dCA9IE5VTEw7CisgICAgICAgICAgICB9CisJICAgIExPR0koIldyaXRpbmcgdG86ICVzXG4iLGZpbGVOYW1lKTsKKwkgICAgZk91dCA9IGZvcGVuKGZpbGVOYW1lLCAidyIpOworCSAgICBpZiAoZk91dCA9PSBOVUxMKSB7CisJCUxPR0UoIkNvdWxkIG5vdCBvcGVuOiAlc1xuIiwgZmlsZU5hbWUpOworCSAgICB9CisKKwkgICAgTE9HSSgiXG52YXJDb2xvciwgdGV4Q291bnQsIG1vZHVsYXRlLCBleHRyYU1hdGgsIHRleFNpemUsIGJsZW5kLCBNcHBzLCBEQzYwXG4iKTsKKwkgICAgaWYgKGZPdXQpIGZwcmludGYoZk91dCwidmFyQ29sb3IsIHRleENvdW50LCBtb2R1bGF0ZSwgZXh0cmFNYXRoLCB0ZXhTaXplLCBibGVuZCwgTXBwcywgREM2MFxyXG4iKTsKKyAgICB9Cit9CisKK0pOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbHBlcmZfR0xQZXJmTGliX3N0ZXAoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaikKK3sKKyAgICBpZiAoISBkb25lKSB7CisgICAgICAgIGlmIChzdGF0ZUNsb2NrID4gMCAmJiAoKHN0YXRlQ2xvY2sgJiAxKSA9PSAwKSkgeworCSAgICBlbmRUaW1lcihzYXZlQnVmLCB3LCBoLCAxLCAxMDApOworICAgICAgICB9CisgICAgICAgIGRvVGVzdCh3LCBoKTsKKyAgICAgICAgc3RhdGVDbG9jaysrOworICAgIH0gZWxzZSB7CisJICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMjEwNzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSBUaGlzIGZpbGUgY29udGFpbnMgcmVzb3VyY2UgZGVmaW5pdGlvbnMgZm9yIGRpc3BsYXllZCBzdHJpbmdzLCBhbGxvd2luZworICAgICB0aGVtIHRvIGJlIGNoYW5nZWQgYmFzZWQgb24gdGhlIGxvY2FsZSBhbmQgb3B0aW9ucy4gLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPCEtLSBTaW1wbGUgc3RyaW5ncy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJnbHBlcmZfYWN0aXZpdHkiPkdMUGVyZjwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZBY3Rpdml0eS5qYXZhIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZjNhYmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZkFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZ2xwZXJmOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworCitwdWJsaWMgY2xhc3MgR0xQZXJmQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBHTFBlcmZWaWV3IG1WaWV3OworCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKwlnZXRXaW5kb3coKS5zZXRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0tFRVBfU0NSRUVOX09OLCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0tFRVBfU0NSRUVOX09OKTsKKyAgICAgICAgbVZpZXcgPSBuZXcgR0xQZXJmVmlldyhnZXRBcHBsaWNhdGlvbigpKTsKKwlzZXRDb250ZW50VmlldyhtVmlldyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZkxpYi5qYXZhIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZMaWIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWEwZTU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZMaWIuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5nbHBlcmY7CisKKy8vIFdyYXBwZXIgZm9yIG5hdGl2ZSBsaWJyYXJ5CisKK3B1YmxpYyBjbGFzcyBHTFBlcmZMaWIgeworCisgICAgIHN0YXRpYyB7CisgICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoImdscGVyZiIpOworICAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gd2lkdGggdGhlIGN1cnJlbnQgdmlldyB3aWR0aAorICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGN1cnJlbnQgdmlldyBoZWlnaHQKKyAgICAgKi8KKyAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBpbml0KGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc3RlcCgpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZWaWV3LmphdmEgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZlZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2U0YTRkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZWaWV3LmphdmEKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmdscGVyZjsKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQ7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXk7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTdXJmYWNlVmlldyB0aGF0IHVzZXMgdGhlIGRlZGljYXRlZCBzdXJmYWNlIGZvcgorICogZGlzcGxheWluZyBhbiBPcGVuR0wgYW5pbWF0aW9uLiAgVGhpcyBhbGxvd3MgdGhlIGFuaW1hdGlvbiB0byBydW4gaW4gYQorICogc2VwYXJhdGUgdGhyZWFkLCB3aXRob3V0IHJlcXVpcmluZyB0aGF0IGl0IGJlIGRyaXZlbiBieSB0aGUgdXBkYXRlIG1lY2hhbmlzbQorICogb2YgdGhlIHZpZXcgaGllcmFyY2h5LgorICoKKyAqIFRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZW5kZXJpbmcgY29kZSBpcyBkZWxlZ2F0ZWQgdG8gYSBHTFZpZXcuUmVuZGVyZXIKKyAqIGluc3RhbmNlLgorICovCitjbGFzcyBHTFBlcmZWaWV3IGV4dGVuZHMgR0xTdXJmYWNlVmlldyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRBRyA9ICJHTFBlcmZWaWV3IjsKKworICAgIHB1YmxpYyBHTFBlcmZWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgaW5pdChmYWxzZSwgMCwgMCk7CisgICAgfQorCisgICAgcHVibGljIEdMUGVyZlZpZXcoQ29udGV4dCBjb250ZXh0LCBib29sZWFuIHRyYW5zbHVjZW50LCBpbnQgZGVwdGgsIGludCBzdGVuY2lsKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBpbml0KHRyYW5zbHVjZW50LCBkZXB0aCwgc3RlbmNpbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXQoYm9vbGVhbiB0cmFuc2x1Y2VudCwgaW50IGRlcHRoLCBpbnQgc3RlbmNpbCkgeworICAgICAgICBzZXRFR0xDb250ZXh0RmFjdG9yeShuZXcgQ29udGV4dEZhY3RvcnkoKSk7CisgICAgICAgIHNldEVHTENvbmZpZ0Nob29zZXIoIHRyYW5zbHVjZW50ID8KKyAgICAgICAgICAgICAgbmV3IENvbmZpZ0Nob29zZXIoOCw4LDgsOCwgZGVwdGgsIHN0ZW5jaWwpIDoKKyAgICAgICAgICAgICAgbmV3IENvbmZpZ0Nob29zZXIoNSw2LDUsMCwgZGVwdGgsIHN0ZW5jaWwpKTsKKyAgICAgICAgc2V0UmVuZGVyZXIobmV3IFJlbmRlcmVyKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbnRleHRGYWN0b3J5IGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5FR0xDb250ZXh0RmFjdG9yeSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiA9IDB4MzA5ODsKKyAgICAgICAgcHVibGljIEVHTENvbnRleHQgY3JlYXRlQ29udGV4dChFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGVnbENvbmZpZykgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiY3JlYXRpbmcgT3BlbkdMIEVTIDIuMCBjb250ZXh0Iik7CisgICAgICAgICAgICBjaGVja0VnbEVycm9yKCJCZWZvcmUgZWdsQ3JlYXRlQ29udGV4dCIsIGVnbCk7CisgICAgICAgICAgICBpbnRbXSBhdHRyaWJfbGlzdCA9IHtFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMiwgRUdMMTAuRUdMX05PTkUgfTsKKyAgICAgICAgICAgIEVHTENvbnRleHQgY29udGV4dCA9IGVnbC5lZ2xDcmVhdGVDb250ZXh0KGRpc3BsYXksIGVnbENvbmZpZywgRUdMMTAuRUdMX05PX0NPTlRFWFQsIGF0dHJpYl9saXN0KTsKKyAgICAgICAgICAgIGNoZWNrRWdsRXJyb3IoIkFmdGVyIGVnbENyZWF0ZUNvbnRleHQiLCBlZ2wpOworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkZXN0cm95Q29udGV4dChFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBlZ2wuZWdsRGVzdHJveUNvbnRleHQoZGlzcGxheSwgY29udGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRWdsRXJyb3IoU3RyaW5nIHByb21wdCwgRUdMMTAgZWdsKSB7CisgICAgICAgIGludCBlcnJvcjsKKyAgICAgICAgd2hpbGUgKChlcnJvciA9IGVnbC5lZ2xHZXRFcnJvcigpKSAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgeworICAgICAgICAgICAgTG9nLmUoVEFHLCBTdHJpbmcuZm9ybWF0KCIlczogRUdMIGVycm9yOiAweCV4IiwgcHJvbXB0LCBlcnJvcikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29uZmlnQ2hvb3NlciBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuRUdMQ29uZmlnQ2hvb3NlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBFR0xfT1BFTkdMX0VTMl9CSVQgPSA0OworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBzX2NvbmZpZ0F0dHJpYnMyID0KKyAgICAgICAgeworICAgICAgICAgICAgRUdMMTAuRUdMX1JFRF9TSVpFLCA0LAorICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsIDQsCisgICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLCA0LAorICAgICAgICAgICAgRUdMMTAuRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FUzJfQklULAorICAgICAgICAgICAgRUdMMTAuRUdMX05PTkUKKyAgICAgICAgfTsKKworICAgICAgICBwdWJsaWMgQ29uZmlnQ2hvb3NlcihpbnQgciwgaW50IGcsIGludCBiLCBpbnQgYSwgaW50IGRlcHRoLCBpbnQgc3RlbmNpbCkgeworICAgICAgICAgICAgbVJlZFNpemUgPSByOworICAgICAgICAgICAgbUdyZWVuU2l6ZSA9IGc7CisgICAgICAgICAgICBtQmx1ZVNpemUgPSBiOworICAgICAgICAgICAgbUFscGhhU2l6ZSA9IGE7CisgICAgICAgICAgICBtRGVwdGhTaXplID0gZGVwdGg7CisgICAgICAgICAgICBtU3RlbmNpbFNpemUgPSBzdGVuY2lsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEVHTENvbmZpZyBjaG9vc2VDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXkpIHsKKworICAgICAgICAgICAgaW50W10gbnVtX2NvbmZpZyA9IG5ldyBpbnRbMV07CisgICAgICAgICAgICBlZ2wuZWdsQ2hvb3NlQ29uZmlnKGRpc3BsYXksIHNfY29uZmlnQXR0cmliczIsIG51bGwsIDAsIG51bV9jb25maWcpOworCisgICAgICAgICAgICBpbnQgbnVtQ29uZmlncyA9IG51bV9jb25maWdbMF07CisKKyAgICAgICAgICAgIGlmIChudW1Db25maWdzIDw9IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJObyBjb25maWdzIG1hdGNoIGNvbmZpZ1NwZWMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVHTENvbmZpZ1tdIGNvbmZpZ3MgPSBuZXcgRUdMQ29uZmlnW251bUNvbmZpZ3NdOworICAgICAgICAgICAgZWdsLmVnbENob29zZUNvbmZpZyhkaXNwbGF5LCBzX2NvbmZpZ0F0dHJpYnMyLCBjb25maWdzLCBudW1Db25maWdzLCBudW1fY29uZmlnKTsKKyAgICAgICAgICAgIC8vIHByaW50Q29uZmlncyhlZ2wsIGRpc3BsYXksIGNvbmZpZ3MpOworICAgICAgICAgICAgcmV0dXJuIGNob29zZUNvbmZpZyhlZ2wsIGRpc3BsYXksIGNvbmZpZ3MpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEVHTENvbmZpZyBjaG9vc2VDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCisgICAgICAgICAgICAgICAgRUdMQ29uZmlnW10gY29uZmlncykgeworICAgICAgICAgICAgRUdMQ29uZmlnIGNsb3Nlc3RDb25maWcgPSBudWxsOworICAgICAgICAgICAgaW50IGNsb3Nlc3REaXN0YW5jZSA9IDEwMDA7CisgICAgICAgICAgICBmb3IoRUdMQ29uZmlnIGNvbmZpZyA6IGNvbmZpZ3MpIHsKKyAgICAgICAgICAgICAgICBpbnQgZCA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfREVQVEhfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgaW50IHMgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NURU5DSUxfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgaWYgKGQgPj0gbURlcHRoU2l6ZSAmJiBzPj0gbVN0ZW5jaWxTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGludCByID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICBpbnQgZyA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9HUkVFTl9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGIgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGludCBhID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQUxQSEFfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGludCBkaXN0YW5jZSA9IE1hdGguYWJzKHIgLSBtUmVkU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNYXRoLmFicyhnIC0gbUdyZWVuU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNYXRoLmFicyhiIC0gbUJsdWVTaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1hdGguYWJzKGEgLSBtQWxwaGFTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDwgY2xvc2VzdERpc3RhbmNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RDb25maWcgPSBjb25maWc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2xvc2VzdENvbmZpZzsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IGZpbmRDb25maWdBdHRyaWIoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCisgICAgICAgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywgaW50IGF0dHJpYnV0ZSwgaW50IGRlZmF1bHRWYWx1ZSkgeworCisgICAgICAgICAgICBpZiAoZWdsLmVnbEdldENvbmZpZ0F0dHJpYihkaXNwbGF5LCBjb25maWcsIGF0dHJpYnV0ZSwgbVZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtVmFsdWVbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHByaW50Q29uZmlncyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwKKyAgICAgICAgICAgIEVHTENvbmZpZ1tdIGNvbmZpZ3MpIHsKKyAgICAgICAgICAgIGludCBudW1Db25maWdzID0gY29uZmlncy5sZW5ndGg7CisgICAgICAgICAgICBMb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIiVkIGNvbmZpZ3VyYXRpb25zIiwgbnVtQ29uZmlncykpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db25maWdzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIkNvbmZpZ3VyYXRpb24gJWQ6XG4iLCBpKSk7CisgICAgICAgICAgICAgICAgcHJpbnRDb25maWcoZWdsLCBkaXNwbGF5LCBjb25maWdzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwcmludENvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwKKyAgICAgICAgICAgICAgICBFR0xDb25maWcgY29uZmlnKSB7CisgICAgICAgICAgICBpbnRbXSBhdHRyaWJ1dGVzID0geworICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQlVGRkVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9BTFBIQV9TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1JFRF9TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfREVQVEhfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NURU5DSUxfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0NPTkZJR19DQVZFQVQsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9DT05GSUdfSUQsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX01BWF9QQlVGRkVSX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX01BWF9QQlVGRkVSX1BJWEVMUywKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX01BWF9QQlVGRkVSX1dJRFRILAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTkFUSVZFX1JFTkRFUkFCTEUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OQVRJVkVfVklTVUFMX0lELAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTkFUSVZFX1ZJU1VBTF9UWVBFLAorICAgICAgICAgICAgICAgICAgICAweDMwMzAsIC8vIEVHTDEwLkVHTF9QUkVTRVJWRURfUkVTT1VSQ0VTLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU0FNUExFUywKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NBTVBMRV9CVUZGRVJTLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU1VSRkFDRV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfVFJBTlNQQVJFTlRfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgMHgzMDM5LCAvLyBFR0wxMC5FR0xfQklORF9UT19URVhUVVJFX1JHQiwKKyAgICAgICAgICAgICAgICAgICAgMHgzMDNBLCAvLyBFR0wxMC5FR0xfQklORF9UT19URVhUVVJFX1JHQkEsCisgICAgICAgICAgICAgICAgICAgIDB4MzAzQiwgLy8gRUdMMTAuRUdMX01JTl9TV0FQX0lOVEVSVkFMLAorICAgICAgICAgICAgICAgICAgICAweDMwM0MsIC8vIEVHTDEwLkVHTF9NQVhfU1dBUF9JTlRFUlZBTCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0xVTUlOQU5DRV9TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQUxQSEFfTUFTS19TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQ09MT1JfQlVGRkVSX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRU5ERVJBQkxFX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIDB4MzA0MiAvLyBFR0wxMC5FR0xfQ09ORk9STUFOVAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIFN0cmluZ1tdIG5hbWVzID0geworICAgICAgICAgICAgICAgICAgICAiRUdMX0JVRkZFUl9TSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9BTFBIQV9TSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9CTFVFX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0dSRUVOX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1JFRF9TSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9ERVBUSF9TSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9TVEVOQ0lMX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0NPTkZJR19DQVZFQVQiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0NPTkZJR19JRCIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTEVWRUwiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX01BWF9QQlVGRkVSX0hFSUdIVCIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTUFYX1BCVUZGRVJfUElYRUxTIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9NQVhfUEJVRkZFUl9XSURUSCIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTkFUSVZFX1JFTkRFUkFCTEUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX05BVElWRV9WSVNVQUxfSUQiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX05BVElWRV9WSVNVQUxfVFlQRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfUFJFU0VSVkVEX1JFU09VUkNFUyIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfU0FNUExFUyIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfU0FNUExFX0JVRkZFUlMiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1NVUkZBQ0VfVFlQRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfVFJBTlNQQVJFTlRfVFlQRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQklORF9UT19URVhUVVJFX1JHQiIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQklORF9UT19URVhUVVJFX1JHQkEiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX01JTl9TV0FQX0lOVEVSVkFMIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9NQVhfU1dBUF9JTlRFUlZBTCIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTFVNSU5BTkNFX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0FMUEhBX01BU0tfU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQ09MT1JfQlVGRkVSX1RZUEUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1JFTkRFUkFCTEVfVFlQRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQ09ORk9STUFOVCIKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBpbnRbXSB2YWx1ZSA9IG5ldyBpbnRbMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgYXR0cmlidXRlID0gYXR0cmlidXRlc1tpXTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOworICAgICAgICAgICAgICAgIGlmICggZWdsLmVnbEdldENvbmZpZ0F0dHJpYihkaXNwbGF5LCBjb25maWcsIGF0dHJpYnV0ZSwgdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiICAlczogJWRcbiIsIG5hbWUsIHZhbHVlWzBdKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCIgICVzOiBmYWlsZWRcbiIsIG5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGVnbC5lZ2xHZXRFcnJvcigpICE9IEVHTDEwLkVHTF9TVUNDRVNTKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTdWJjbGFzc2VzIGNhbiBhZGp1c3QgdGhlc2UgdmFsdWVzOgorICAgICAgICBwcm90ZWN0ZWQgaW50IG1SZWRTaXplOworICAgICAgICBwcm90ZWN0ZWQgaW50IG1HcmVlblNpemU7CisgICAgICAgIHByb3RlY3RlZCBpbnQgbUJsdWVTaXplOworICAgICAgICBwcm90ZWN0ZWQgaW50IG1BbHBoYVNpemU7CisgICAgICAgIHByb3RlY3RlZCBpbnQgbURlcHRoU2l6ZTsKKyAgICAgICAgcHJvdGVjdGVkIGludCBtU3RlbmNpbFNpemU7CisgICAgICAgIHByaXZhdGUgaW50W10gbVZhbHVlID0gbmV3IGludFsxXTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZW5kZXJlciBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuUmVuZGVyZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkRyYXdGcmFtZShHTDEwIGdsKSB7CisgICAgICAgICAgICBHTFBlcmZMaWIuc3RlcCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChHTDEwIGdsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgICAgIEdMUGVyZkxpYi5pbml0KHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChHTDEwIGdsLCBFR0xDb25maWcgY29uZmlnKSB7CisgICAgICAgICAgICAvLyBEbyBub3RoaW5nLgorICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIzNzgwOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI2IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE9wZW5HTCBFUyBKTkkgc2FtcGxlCisjIFRoaXMgbWFrZWZpbGUgYnVpbGRzIGJvdGggYW4gYWN0aXZpdHkgYW5kIGEgc2hhcmVkIGxpYnJhcnkuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKSAjIG5vdCA2NCBiaXQgY2xlYW4KKworVE9QX0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjIEJ1aWxkIGFjdGl2aXR5CisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gVGVzdFZpZXdwb3J0CisKKyMgU2V0IGEgc3BlY2lmaWMgU0RLIHZlcnNpb24gc28gd2UgY2FuIHJ1biBvbiBGcm95by4KKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gOAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworZW5kaWYgIyBUQVJHRVRfU0lNVUxBVE9SCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhOWQyZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQudGVzdCI+CisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iOCIgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSI4IiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgorICAgIDxhcHBsaWNhdGlvbgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy90ZXN0X2FjdGl2aXR5Ij4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iVGVzdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLk5vVGl0bGVCYXIuRnVsbHNjcmVlbiIKKyAgICAgICAgICAgIAlhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufGtleWJvYXJkSGlkZGVuIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvUkVBRE1FIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2YWJjOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvUkVBRE1FCkBAIC0wLDAgKzEsMjggQEAKK1JlcHJvIHN0ZXBzOgorCitidWlsZCwgaW5zdGFsbCBhbmQgcnVuIHRoZSBhdHRhY2hlZCB0ZXN0IHByb2dyYW0gVGVzdFZpZXdwb3J0LmFwaworCitSdW4gb24gU2FwcGhpcmUgd2l0aCBGcm95by4KKworVGhlIHByb2dyYW0gY2xlYXJzIHRoZSBzY3JlZW4gdG8gYmx1ZSwgdGhlbiBkcmF3cyBhIGZ1bGwgc2NyZWVuIHdoaXRlIHF1YWQgdGhhdAoraXMgYWxsaWduZWQgdG8gdGhlIHNjcmVlbi4KKyhUaGVyZWZvcmUgdGhlIHdob2xlIHNjcmVlbiBzaG91bGQgYXBwZWFyIHRvIGJlIHdoaXRlLikKKworCitOb3RlIHRoYXQgc2NyZWVuIGlzIGFsbCB3aGl0ZS4KKworUm90YXRlIHNjcmVlbiA5MCBkZWdyZWVzLgorCitFeHBlY3RlZDogc2NyZWVuIGlzIHN0aWxsIGFsbCB3aGl0ZS4KKworQWN0dWFsOiBzY3JlZW4gaXMgYmx1ZSB3aXRoIG9mZnNldCB3aGl0ZSByZWN0YW5nbGUuCisKK1RoaXMgYnVnIG9ubHkgaGFwcGVucyBvbiBTYXBwaGlyZSwgaXQgd29ya3MgY29ycmVjdGx5IG9uIFBhc3Npb24uCisKK1doYXQgaGFwcGVuczoKKworSSB0aGluayB0aGUgYnVnIGlzIHRoYXQgdGhlIGdsLmdsVmlld3BvcnQoKSBjYWxsIGluIG9uU3VyZmFjZUNoYW5nZWQoKSBpcworYmVpbmcgaWdub3JlZCBieSB0aGUgT3BlbkdMIGRyaXZlci4KKworTk9URTogSWYgYSBnbC5nbFZpZXdwb3J0IGNhbGwgaXMgYWRkZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgb25EcmF3RnJhbWUoKQorY2FsbCAod2hpY2ggbWVhbnMgaXQgaXMgY2FsbGVkIGJlZm9yZSBldmVyeSBkcmF3KSwgdGhlIHByb2dyYW0gcnVucyBjb3JyZWN0bHkuCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRiOGJiYgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gVGhpcyBmaWxlIGNvbnRhaW5zIHJlc291cmNlIGRlZmluaXRpb25zIGZvciBkaXNwbGF5ZWQgc3RyaW5ncywgYWxsb3dpbmcKKyAgICAgdGhlbSB0byBiZSBjaGFuZ2VkIGJhc2VkIG9uIHRoZSBsb2NhbGUgYW5kIG9wdGlvbnMuIC0tPgorCis8cmVzb3VyY2VzPgorICAgIDwhLS0gU2ltcGxlIHN0cmluZ3MuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0idGVzdF9hY3Rpdml0eSI+VGVzdCBWaWV3cG9ydDwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0QWN0aXZpdHkuamF2YSBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3ZTQ1MAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK3B1YmxpYyBjbGFzcyBUZXN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJUZXN0QWN0aXZpdHkiOworICAgIFRlc3RWaWV3IG1WaWV3OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworICAgICAgICBtVmlldyA9IG5ldyBUZXN0VmlldyhnZXRBcHBsaWNhdGlvbigpKTsKKwkgICAgbVZpZXcuc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7CisJICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RWaWV3LmphdmEgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjYzM3ZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdFZpZXcuamF2YQpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdDsKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7CitpbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5GbG9hdEJ1ZmZlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CisKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTA7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTE7CisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIFN1cmZhY2VWaWV3IHRoYXQgdXNlcyB0aGUgZGVkaWNhdGVkIHN1cmZhY2UgZm9yCisgKiBkaXNwbGF5aW5nIGFuIE9wZW5HTCBhbmltYXRpb24uICBUaGlzIGFsbG93cyB0aGUgYW5pbWF0aW9uIHRvIHJ1biBpbiBhCisgKiBzZXBhcmF0ZSB0aHJlYWQsIHdpdGhvdXQgcmVxdWlyaW5nIHRoYXQgaXQgYmUgZHJpdmVuIGJ5IHRoZSB1cGRhdGUgbWVjaGFuaXNtCisgKiBvZiB0aGUgdmlldyBoaWVyYXJjaHkuCisgKgorICogVGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHJlbmRlcmluZyBjb2RlIGlzIGRlbGVnYXRlZCB0byBhIEdMVmlldy5SZW5kZXJlcgorICogaW5zdGFuY2UuCisgKi8KK2NsYXNzIFRlc3RWaWV3IGV4dGVuZHMgR0xTdXJmYWNlVmlldyB7CisgICAgVGVzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBpbml0KCk7CisgICAgfQorCisgICAgcHVibGljIFRlc3RWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgaW5pdCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0KCkgeworICAgICAgICBzZXRSZW5kZXJlcihuZXcgUmVuZGVyZXIoKSk7CisgICAgICAgIHNldFJlbmRlck1vZGUoUkVOREVSTU9ERV9XSEVOX0RJUlRZKTsKKyAgICB9CisgICAgCisgICAgICAgIC8qKiBBIGdyaWQgaXMgYSB0b3BvbG9naWNhbGx5IHJlY3Rhbmd1bGFyIGFycmF5IG9mIHZlcnRpY2VzLgorICAgICoKKyAgICAqIFRoZSB2ZXJ0ZXggYW5kIGluZGV4IGRhdGEgYXJlIGhlbGQgaW4gVkJPIG9iamVjdHMgYmVjYXVzZSBvbiBtb3N0CisgICAgKiBHUFVzIFZCTyBvYmplY3RzIGFyZSB0aGUgZmFzdGVzdCB3YXkgb2YgcmVuZGVyaW5nIHN0YXRpYyB2ZXJ0ZXgKKyAgICAqIGFuZCBpbmRleCBkYXRhLgorICAgICoKKyAgICAqLworCisgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBHcmlkIHsKKyAgICAgICAvLyBTaXplIG9mIHZlcnRleCBkYXRhIGVsZW1lbnRzIGluIGJ5dGVzOgorICAgICAgIGZpbmFsIHN0YXRpYyBpbnQgRkxPQVRfU0laRSA9IDQ7CisgICAgICAgZmluYWwgc3RhdGljIGludCBDSEFSX1NJWkUgPSAyOworCisgICAgICAgLy8gVmVydGV4IHN0cnVjdHVyZToKKyAgICAgICAvLyBmbG9hdCB4LCB5LCB6OworCisgICAgICAgZmluYWwgc3RhdGljIGludCBWRVJURVhfU0laRSA9IDMgKiBGTE9BVF9TSVpFOworCisgICAgICAgcHJpdmF0ZSBpbnQgbVZlcnRleEJ1ZmZlck9iamVjdElkOworICAgICAgIHByaXZhdGUgaW50IG1FbGVtZW50QnVmZmVyT2JqZWN0SWQ7CisKKyAgICAgICAvLyBUaGVzZSBidWZmZXJzIGFyZSB1c2VkIHRvIGhvbGQgdGhlIHZlcnRleCBhbmQgaW5kZXggZGF0YSB3aGlsZQorICAgICAgIC8vIGNvbnN0cnVjdGluZyB0aGUgZ3JpZC4gT25jZSBjcmVhdGVCdWZmZXJPYmplY3RzKCkgaXMgY2FsbGVkCisgICAgICAgLy8gdGhlIGJ1ZmZlcnMgYXJlIG51bGxlZCBvdXQgdG8gc2F2ZSBtZW1vcnkuCisKKyAgICAgICBwcml2YXRlIEJ5dGVCdWZmZXIgbVZlcnRleEJ5dGVCdWZmZXI7CisgICAgICAgcHJpdmF0ZSBGbG9hdEJ1ZmZlciBtVmVydGV4QnVmZmVyOworICAgICAgIHByaXZhdGUgQ2hhckJ1ZmZlciBtSW5kZXhCdWZmZXI7CisKKyAgICAgICBwcml2YXRlIGludCBtVzsKKyAgICAgICBwcml2YXRlIGludCBtSDsKKyAgICAgICBwcml2YXRlIGludCBtSW5kZXhDb3VudDsKKworICAgICAgIHB1YmxpYyBHcmlkKGludCB3LCBpbnQgaCkgeworICAgICAgICAgICBpZiAodyA8IDAgfHwgdyA+PSA2NTUzNikgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidyIpOworICAgICAgICAgICB9CisgICAgICAgICAgIGlmIChoIDwgMCB8fCBoID49IDY1NTM2KSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJoIik7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgaWYgKHcgKiBoID49IDY1NTM2KSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3ICogaCA+PSA2NTUzNiIpOworICAgICAgICAgICB9CisKKyAgICAgICAgICAgbVcgPSB3OworICAgICAgICAgICBtSCA9IGg7CisgICAgICAgICAgIGludCBzaXplID0gdyAqIGg7CisKKyAgICAgICAgICAgbVZlcnRleEJ5dGVCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KFZFUlRFWF9TSVpFICogc2l6ZSkKKyAgICAgICAgICAgICAgIC5vcmRlcihCeXRlT3JkZXIubmF0aXZlT3JkZXIoKSk7CisgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIgPSBtVmVydGV4Qnl0ZUJ1ZmZlci5hc0Zsb2F0QnVmZmVyKCk7CisKKyAgICAgICAgICAgaW50IHF1YWRXID0gbVcgLSAxOworICAgICAgICAgICBpbnQgcXVhZEggPSBtSCAtIDE7CisgICAgICAgICAgIGludCBxdWFkQ291bnQgPSBxdWFkVyAqIHF1YWRIOworICAgICAgICAgICBpbnQgaW5kZXhDb3VudCA9IHF1YWRDb3VudCAqIDY7CisgICAgICAgICAgIG1JbmRleENvdW50ID0gaW5kZXhDb3VudDsKKyAgICAgICAgICAgbUluZGV4QnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChDSEFSX1NJWkUgKiBpbmRleENvdW50KQorICAgICAgICAgICAgICAgLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKS5hc0NoYXJCdWZmZXIoKTsKKworICAgICAgICAgICAvKgorICAgICAgICAgICAgKiBJbml0aWFsaXplIHRyaWFuZ2xlIGxpc3QgbWVzaC4KKyAgICAgICAgICAgICoKKyAgICAgICAgICAgICogICAgIFswXS0tLS0tWyAgMV0gLi4uCisgICAgICAgICAgICAqICAgICAgfCAgICAvICAgfAorICAgICAgICAgICAgKiAgICAgIHwgICAvICAgIHwKKyAgICAgICAgICAgICogICAgICB8ICAvICAgICB8CisgICAgICAgICAgICAqICAgICBbd10tLS0tLVt3KzFdIC4uLgorICAgICAgICAgICAgKiAgICAgIHwgICAgICAgfAorICAgICAgICAgICAgKgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IHF1YWRIOyB5KyspIHsKKyAgICAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHF1YWRXOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciBhID0gKGNoYXIpICh5ICogbVcgKyB4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciBiID0gKGNoYXIpICh5ICogbVcgKyB4ICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IChjaGFyKSAoKHkgKyAxKSAqIG1XICsgeCk7CisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZCA9IChjaGFyKSAoKHkgKyAxKSAqIG1XICsgeCArIDEpOworCisgICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGMpOworICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgYik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGIpOworICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgYyk7CisgICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBkKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKworICAgICAgIH0KKworICAgICAgIHB1YmxpYyB2b2lkIHNldChpbnQgaSwgaW50IGosIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgICAgaWYgKGkgPCAwIHx8IGkgPj0gbVcpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImkiKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBpZiAoaiA8IDAgfHwgaiA+PSBtSCkgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaiIpOworICAgICAgICAgICB9CisKKyAgICAgICAgICAgaW50IGluZGV4ID0gbVcgKiBqICsgaTsKKworICAgICAgICAgICBtVmVydGV4QnVmZmVyLnBvc2l0aW9uKGluZGV4ICogVkVSVEVYX1NJWkUgLyBGTE9BVF9TSVpFKTsKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlci5wdXQoeCk7CisgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIucHV0KHkpOworICAgICAgICAgICBtVmVydGV4QnVmZmVyLnB1dCh6KTsKKyAgICAgICB9CisKKyAgICAgICBwdWJsaWMgdm9pZCBjcmVhdGVCdWZmZXJPYmplY3RzKEdMIGdsKSB7CisgICAgICAgICAgIC8vIEdlbmVyYXRlIGEgdGhlIHZlcnRleCBhbmQgZWxlbWVudCBidWZmZXIgSURzCisgICAgICAgICAgIGludFtdIHZib0lkcyA9IG5ldyBpbnRbMl07CisgICAgICAgICAgIEdMMTEgZ2wxMSA9IChHTDExKSBnbDsKKyAgICAgICAgICAgZ2wxMS5nbEdlbkJ1ZmZlcnMoMiwgdmJvSWRzLCAwKTsKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlck9iamVjdElkID0gdmJvSWRzWzBdOworICAgICAgICAgICBtRWxlbWVudEJ1ZmZlck9iamVjdElkID0gdmJvSWRzWzFdOworCisgICAgICAgICAgIC8vIFVwbG9hZCB0aGUgdmVydGV4IGRhdGEKKyAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9BUlJBWV9CVUZGRVIsIG1WZXJ0ZXhCdWZmZXJPYmplY3RJZCk7CisgICAgICAgICAgIG1WZXJ0ZXhCeXRlQnVmZmVyLnBvc2l0aW9uKDApOworICAgICAgICAgICBnbDExLmdsQnVmZmVyRGF0YShHTDExLkdMX0FSUkFZX0JVRkZFUiwgbVZlcnRleEJ5dGVCdWZmZXIuY2FwYWNpdHkoKSwgbVZlcnRleEJ5dGVCdWZmZXIsIEdMMTEuR0xfU1RBVElDX0RSQVcpOworCisgICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1FbGVtZW50QnVmZmVyT2JqZWN0SWQpOworICAgICAgICAgICBtSW5kZXhCdWZmZXIucG9zaXRpb24oMCk7CisgICAgICAgICAgIGdsMTEuZ2xCdWZmZXJEYXRhKEdMMTEuR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1JbmRleEJ1ZmZlci5jYXBhY2l0eSgpICogQ0hBUl9TSVpFLCBtSW5kZXhCdWZmZXIsIEdMMTEuR0xfU1RBVElDX0RSQVcpOworCisgICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdGhlIGluLW1lbW9yeSBkYXRhIGFueSBtb3JlCisgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIgPSBudWxsOworICAgICAgICAgICBtVmVydGV4Qnl0ZUJ1ZmZlciA9IG51bGw7CisgICAgICAgICAgIG1JbmRleEJ1ZmZlciA9IG51bGw7CisgICAgICAgfQorCisgICAgICAgcHVibGljIHZvaWQgZHJhdyhHTDEwIGdsKSB7CisgICAgICAgICAgIEdMMTEgZ2wxMSA9IChHTDExKSBnbDsKKworICAgICAgICAgICBnbC5nbEVuYWJsZUNsaWVudFN0YXRlKEdMMTAuR0xfVkVSVEVYX0FSUkFZKTsKKworICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0FSUkFZX0JVRkZFUiwgbVZlcnRleEJ1ZmZlck9iamVjdElkKTsKKyAgICAgICAgICAgZ2wxMS5nbFZlcnRleFBvaW50ZXIoMywgR0wxMC5HTF9GTE9BVCwgVkVSVEVYX1NJWkUsIDApOworICAgICAgICAgICAKKyAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUVsZW1lbnRCdWZmZXJPYmplY3RJZCk7CisgICAgICAgICAgIGdsMTEuZ2xEcmF3RWxlbWVudHMoR0wxMC5HTF9UUklBTkdMRVMsIG1JbmRleENvdW50LCBHTDEwLkdMX1VOU0lHTkVEX1NIT1JULCAwKTsKKyAgICAgICAgICAgZ2wuZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0wxMC5HTF9WRVJURVhfQVJSQVkpOworICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0FSUkFZX0JVRkZFUiwgMCk7CisgICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIDApOworICAgICAgIH0KKyAgIH0KKworCisgICAgcHJpdmF0ZSBjbGFzcyBSZW5kZXJlciBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuUmVuZGVyZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJlbmRlcmVyIjsKKyAgICAgICAgcHJpdmF0ZSBHcmlkIG1HcmlkOworICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgb25EcmF3RnJhbWUoR0wxMCBnbCkgeworCQkJZ2wuZ2xDbGVhckNvbG9yKDAsMCwxLDEpOworCQkJZ2wuZ2xDbGVhcihHTDEwLkdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICAgICAgICAgbUdyaWQuZHJhdyhnbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKEdMMTAgZ2wsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICAgICAgZ2wuZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKwkJCWdsLmdsTWF0cml4TW9kZShHTDExLkdMX1BST0pFQ1RJT04pOworCQkJZ2wuZ2xMb2FkSWRlbnRpdHkoKTsKKwkJCWdsLmdsT3J0aG9mKDAsIHdpZHRoLCBoZWlnaHQsIDAsIC0xLCAxKTsKKwkJCWdsLmdsTWF0cml4TW9kZShHTDExLkdMX01PREVMVklFVyk7CisgICAgICAgICAgICBjcmVhdGVHcmlkKGdsLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoR0wxMCBnbCwgRUdMQ29uZmlnIGNvbmZpZykgeworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlR3JpZChHTDEwIGdsLCBmbG9hdCB3LCBmbG9hdCBoKSB7CisgICAgICAgIG1HcmlkID0gbmV3IEdyaWQoMiwgMik7CisJCQlmb3IgKGludCBqID0gMDsgaiA8IDI7IGorKykgeworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQkJCWZsb2F0IHggPSB3ICogaTsKKwkJCQkJZmxvYXQgeSA9IGggKiBqOworCQkJCQlmbG9hdCB6ID0gMC4wZjsKKwkJCQkJbUdyaWQuc2V0KGksaiwgeCwgeSwgeik7CisJCQkJfQorCQkJfQorCQkJbUdyaWQuY3JlYXRlQnVmZmVyT2JqZWN0cyhnbCk7CisJCX0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IDM3ZjViNjEuLmZmZDZiNTkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMTgsNiArMTgsNiBAQAogKi8KIC0tPgogPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPCEtLSBzZXJ2aWNlIG5hbWUgIC0tPgorICAgIDwhLS0gc2VydmljZSBuYW1lIFtDSEFSIExJTUlUPTI1XSAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJzZXJ2aWNlX25hbWUiPlBhY2thZ2UgQWNjZXNzIEhlbHBlcjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Jlcy92YWx1ZXMtcm0vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Jlcy92YWx1ZXMtcm0vc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYxZTYyNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvcmVzL3ZhbHVlcy1ybS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJhcHBfbGFiZWwiIG1zZ2lkPSI0NTY3NTY2MDk4NTI4NTg4ODYzIj4iTWVtb3JpYSBkYWxzIHBhcmFtZXRlcnMiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvcmVzL3ZhbHVlcy9kZWZhdWx0cy54bWwgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Jlcy92YWx1ZXMvZGVmYXVsdHMueG1sCmluZGV4IDUyZTA0ZDcuLjJhZTM0ZTMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvcmVzL3ZhbHVlcy9kZWZhdWx0cy54bWwKKysrIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzL2RlZmF1bHRzLnhtbApAQCAtNzIsNCArNzIsNiBAQAogCiAgICAgPCEtLSBEZWZhdWx0IGZvciBTZXR0aW5ncy5TeXN0ZW0uVklCUkFURV9JTl9TSUxFTlQgLS0+CiAgICAgPGJvb2wgbmFtZT0iZGVmX3ZpYnJhdGVfaW5fc2lsZW50Ij50cnVlPC9ib29sPgorCisgICAgPGJvb2wgbmFtZT0iZGVmX3VzZV9wdHBfaW50ZXJmYWNlIj5mYWxzZTwvYm9vbD4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0RhdGFiYXNlSGVscGVyLmphdmEgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvRGF0YWJhc2VIZWxwZXIuamF2YQppbmRleCBhZDA0YmI0Li5jMWFkMWNhIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvRGF0YWJhc2VIZWxwZXIuamF2YQorKysgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvRGF0YWJhc2VIZWxwZXIuamF2YQpAQCAtMTA2OCw2ICsxMDY4LDkgQEAKICAgICAKICAgICAgICAgICAgIGxvYWRCb29sZWFuU2V0dGluZyhzdG10LCBTZXR0aW5ncy5TeXN0ZW0uVklCUkFURV9JTl9TSUxFTlQsCiAgICAgICAgICAgICAgICAgICAgIFIuYm9vbC5kZWZfdmlicmF0ZV9pbl9zaWxlbnQpOworCisgICAgICAgICAgICBsb2FkQm9vbGVhblNldHRpbmcoc3RtdCwgU2V0dGluZ3MuU3lzdGVtLlVTRV9QVFBfSU5URVJGQUNFLAorICAgICAgICAgICAgICAgICAgICBSLmJvb2wuZGVmX3VzZV9wdHBfaW50ZXJmYWNlKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGlmIChzdG10ICE9IG51bGwpIHN0bXQuY2xvc2UoKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZC5tayBiL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWQubWsKaW5kZXggNGM4Mzc2OC4uOTEwZTg0ZSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZC5taworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkLm1rCkBAIC0xMCw0ICsxMCw2IEBACiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gU3lzdGVtVUkKIExPQ0FMX0NFUlRJRklDQVRFIDo9IHBsYXRmb3JtCiAKK0xPQ0FMX1BST0dVQVJEX0ZMQUdTIDo9IC1pbmNsdWRlICQoTE9DQUxfUEFUSCkvcHJvZ3VhcmQuZmxhZ3MKKwogaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAwZmNjYmU3Li4xOGUyZjQ3OSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC01LDYgKzUsNyBAQAogICAgICAgICA+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlNUQVRVU19CQVJfU0VSVklDRSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkdFVF9UQVNLUyIgLz4KIAogICAgIDxhcHBsaWNhdGlvbgogICAgICAgICBhbmRyb2lkOnBlcnNpc3RlbnQ9InRydWUiCkBAIC0xMyw3ICsxNCwxMiBAQAogICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19sYXVuY2hlcl9zZXR0aW5ncyI+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICA8c2VydmljZQotICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSIuc3RhdHVzYmFyLlN0YXR1c0JhclNlcnZpY2UiCisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5zdGF0dXNiYXIuUGhvbmVTdGF0dXNCYXJTZXJ2aWNlIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDxzZXJ2aWNlCisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5zdGF0dXNiYXIudGFibGV0LlRhYmxldFN0YXR1c0JhclNlcnZpY2UiCiAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJmYWxzZSIKICAgICAgICAgICAgIC8+CiAKQEAgLTIxLDUgKzI3LDExIEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZDpleGNsdWRlRnJvbVJlY2VudHM9InRydWUiPgogICAgICAgICA8L2FjdGl2aXR5PgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5zdGF0dXNiYXIuUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyIgorICAgICAgICAgICAgYW5kcm9pZDpleGNsdWRlRnJvbVJlY2VudHM9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKwogICAgIDwvYXBwbGljYXRpb24+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcHJvZ3VhcmQuZmxhZ3MgYi9wYWNrYWdlcy9TeXN0ZW1VSS9wcm9ndWFyZC5mbGFncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmJkNzc2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcHJvZ3VhcmQuZmxhZ3MKQEAgLTAsMCArMSw1IEBACista2VlcCBjbGFzcyBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0LlRhYmxldFN0YXR1c0JhclNlcnZpY2UgeworICBwdWJsaWMgdm9pZCBub3RpZmljYXRpb25JY29uc0NsaWNrZWQoYW5kcm9pZC52aWV3LlZpZXcpOworICBwdWJsaWMgdm9pZCBzeXN0ZW1JbmZvQ2xpY2tlZChhbmRyb2lkLnZpZXcuVmlldyk7CisgIHB1YmxpYyB2b2lkIHJlY2VudEJ1dHRvbkNsaWNrZWQoYW5kcm9pZC52aWV3LlZpZXcpOworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfbm9ybWFsLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMTI3YmQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9hbGVydF9iYXJfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlhZjgwNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV8wLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQxMDNhOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV8xMDAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV8xMDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MWNiZTUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzEwMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV8yMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzIwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDY0MDI3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV8yMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV80MC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzQwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGRlMGU3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV80MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV82MC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzYwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTJiOGVmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV82MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV84MC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzgwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTIzMWYwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV84MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYnV0dG9uX2ZyYW1lX2RlZmF1bHQuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9idXR0b25fZnJhbWVfZGVmYXVsdC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODA5Yjg0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYnV0dG9uX2ZyYW1lX2RlZmF1bHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYnV0dG9uX2ZyYW1lX3ByZXNzZWQuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9idXR0b25fZnJhbWVfcHJlc3NlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2MwMDdjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYnV0dG9uX2ZyYW1lX3ByZXNzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvZG90c19lbXB0eS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kb3RzX2VtcHR5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWU3NjU0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvZG90c19lbXB0eS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvZG90c19mdWxsLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RvdHNfZnVsbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1YzYwNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RvdHNfZnVsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZTM2YzQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzEwMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMTAwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmU1MmZmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzEwMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzIwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF8yMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmNjUyYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF8yMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzQwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF80MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1ZGQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF80MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzYwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF82MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlMzFiYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF82MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzgwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF84MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhNjU2ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF84MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9iYWNrX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9iYWNrX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5Zjk1NDAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2JhY2tfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9iYWNrX3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9iYWNrX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YWExOTAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2JhY2tfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9leHBhbmRfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmZjN2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9leHBhbmRfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9leHBhbmRfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2YwOWFjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9leHBhbmRfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9ob21lX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9ob21lX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiOTUxZGQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9ob21lX3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9ob21lX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MzVhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pY29uX3RyYXkuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWYwNDFjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pY29uX3RyYXkuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9tZW51X2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9tZW51X2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Nzc5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9tZW51X3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9tZW51X3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjM2Q0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl92ZXRvX25vcm1hbC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fbm9ybWFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjUzMmI4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl92ZXRvX25vcm1hbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl92ZXRvX3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl92ZXRvX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOGMwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX2FpcnBsYW5lX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX2FpcnBsYW5lX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNzVlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfYWlycGxhbmVfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX2JyaWdodG5lc3NfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfYnJpZ2h0bmVzc19kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjI1MDJiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX2JyaWdodG5lc3NfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODdmYjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2xvY2tlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fbG9ja2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODE1OWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2xvY2tlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX3NvdW5kX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX3NvdW5kX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlODU3YjUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfc291bmRfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfbm9ybWFsLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OGRlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9hbGVydF9iYXJfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4ZGUxMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYmF0dGVyeV8wLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2JhdHRlcnlfMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxNjM4ZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2JhdHRlcnlfMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYmF0dGVyeV8xMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9iYXR0ZXJ5XzEwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzM5ZjUwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYmF0dGVyeV8xMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYmF0dGVyeV8xMDAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYmF0dGVyeV8xMDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNjZkYjM4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYmF0dGVyeV8xMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2JhdHRlcnlfMjUucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYmF0dGVyeV8yNS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FlN2ViYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2JhdHRlcnlfMjUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2JhdHRlcnlfNS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9iYXR0ZXJ5XzUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMTVhMjEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9iYXR0ZXJ5XzUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2JhdHRlcnlfNTAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYmF0dGVyeV81MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA4ODA2NgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2JhdHRlcnlfNTAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2JhdHRlcnlfNzUucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYmF0dGVyeV83NS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRjZmI2ZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2JhdHRlcnlfNzUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2J1dHRvbl9mcmFtZV9kZWZhdWx0LjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYnV0dG9uX2ZyYW1lX2RlZmF1bHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiMWYyNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2J1dHRvbl9mcmFtZV9kZWZhdWx0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2J1dHRvbl9mcmFtZV9wcmVzc2VkLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYnV0dG9uX2ZyYW1lX3ByZXNzZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmN2E0ZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2J1dHRvbl9mcmFtZV9wcmVzc2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RvdHNfZW1wdHkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvZG90c19lbXB0eS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhZGE0MQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RvdHNfZW1wdHkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RvdHNfZnVsbC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9kb3RzX2Z1bGwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMzQ2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9kb3RzX2Z1bGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3NpZ25hbF8wLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3NpZ25hbF8wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjI3MjdiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc2lnbmFsXzAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3NpZ25hbF8xMDAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc2lnbmFsXzEwMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjMzRmZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3NpZ25hbF8xMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3NpZ25hbF8yNS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zaWduYWxfMjUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MTU1OTYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zaWduYWxfMjUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3NpZ25hbF81MC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zaWduYWxfNTAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNWE3MDhiMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3NpZ25hbF81MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc2lnbmFsXzc1LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3NpZ25hbF83NS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE3NmYzNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3NpZ25hbF83NS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc2lnbmFsX3NjYW4xLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3NpZ25hbF9zY2FuMS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY0YjljYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3NpZ25hbF9zY2FuMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc2lnbmFsX3NjYW4yLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3NpZ25hbF9zY2FuMi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyZmViNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3NpZ25hbF9zY2FuMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc2lnbmFsX3NjYW4zLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3NpZ25hbF9zY2FuMy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRjMDY4OQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3NpZ25hbF9zY2FuMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc2lnbmFsX3NjYW40LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3NpZ25hbF9zY2FuNC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFlOTVmZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3NpZ25hbF9zY2FuNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9iYWNrX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9iYWNrX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNTc4MDIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2JhY2tfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9iYWNrX3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9iYWNrX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNTI3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2JhY2tfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9leHBhbmRfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTY0OTI2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9leHBhbmRfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9leHBhbmRfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjNjNDI2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9leHBhbmRfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9ob21lX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9ob21lX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMTlkZWQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9ob21lX3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9ob21lX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNjRmZTgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9pY29uX3RyYXkuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDJhY2NlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9pY29uX3RyYXkuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9tZW51X2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9tZW51X2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmM2E3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9tZW51X3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9tZW51X3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZTIxZDczCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9tZW51X3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfcmVjZW50X2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9yZWNlbnRfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkOGRjNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfcmVjZW50X2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfcmVjZW50X3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9yZWNlbnRfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwYTNlOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfcmVjZW50X3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfdmV0b19ub3JtYWwucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl92ZXRvX25vcm1hbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhN2NjMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfdmV0b19ub3JtYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfdmV0b19wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfdmV0b19wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDYxYWM4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl92ZXRvX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9haXJwbGFuZV9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9haXJwbGFuZV9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjg3NTMyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX2FpcnBsYW5lX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9icmlnaHRuZXNzX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX2JyaWdodG5lc3NfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JmYzgzZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9icmlnaHRuZXNzX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDg0NzljCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9sb2NrZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2xvY2tlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYxZDI2YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9sb2NrZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9zb3VuZF9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9zb3VuZF9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjYzNmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX3NvdW5kX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3dpZmlfMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS93aWZpXzAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MTYzOGQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS93aWZpXzAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3dpZmlfMTAwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3dpZmlfMTAwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDY4Mzg5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvd2lmaV8xMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3dpZmlfMjUucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvd2lmaV8yNS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUzODlhNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3dpZmlfMjUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3dpZmlfNTAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvd2lmaV81MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNhZDBkMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3dpZmlfNTAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3dpZmlfNzUucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvd2lmaV83NS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyZDdkYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3dpZmlfNzUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3dpZmlfc2NhbjEucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvd2lmaV9zY2FuMS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUzODlhNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3dpZmlfc2NhbjEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3dpZmlfc2NhbjIucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvd2lmaV9zY2FuMi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRlN2M3MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3dpZmlfc2NhbjIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3dpZmlfc2NhbjMucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvd2lmaV9zY2FuMy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMyYTllMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3dpZmlfc2NhbjMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3dpZmlfc2NhbjQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvd2lmaV9zY2FuNC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwNDEzMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3dpZmlfc2NhbjQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9hbGVydF9iYXJfYmFja2dyb3VuZC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvYWxlcnRfYmFyX2JhY2tncm91bmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YjZhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvYWxlcnRfYmFyX2JhY2tncm91bmQueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9hbGVydF9iYXJfYmFja2dyb3VuZF9wcmVzc2VkIiAvPgorICAgIDxpdGVtCisgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYWxlcnRfYmFyX2JhY2tncm91bmRfbm9ybWFsIiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2JhdHRlcnkueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2JhdHRlcnkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYzBjNzQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvYmF0dGVyeS54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL3Jlcy9kcmF3YWJsZS9zdGF0X3N5c19iYXR0ZXJ5LnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPGxldmVsLWxpc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIxIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYmF0dGVyeV8wIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9iYXR0ZXJ5XzUiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMTAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9iYXR0ZXJ5XzEwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjI1IiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYmF0dGVyeV8yNSIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI1MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2JhdHRlcnlfNTAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNzUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9iYXR0ZXJ5Xzc1IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjEwMSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2JhdHRlcnlfMTAwIiAvPgorPC9sZXZlbC1saXN0PgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvYmF0dGVyeV9jaGFyZ2luZy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvYmF0dGVyeV9jaGFyZ2luZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliNzdkZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9iYXR0ZXJ5X2NoYXJnaW5nLnhtbApAQCAtMCwwICsxLDQ4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vcmVzL2RyYXdhYmxlL3N0YXRfc3lzX2JhdHRlcnkueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8bGV2ZWwtbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjI1Ij4KKyAgICAgICAgPGFuaW1hdGlvbi1saXN0IGFuZHJvaWQ6b25lc2hvdD0iZmFsc2UiPgorICAgICAgICAgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2JhdHRlcnlfMCIgYW5kcm9pZDpkdXJhdGlvbj0iMTAwMCIgLz4KKyAgICAgICAgICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9iYXR0ZXJ5XzI1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMDAwIiAvPgorICAgICAgICA8L2FuaW1hdGlvbi1saXN0PgorICAgIDwvaXRlbT4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI1MCI+CisgICAgICAgIDxhbmltYXRpb24tbGlzdCBhbmRyb2lkOm9uZXNob3Q9ImZhbHNlIj4KKyAgICAgICAgICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9iYXR0ZXJ5XzI1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMDAwIiAvPgorICAgICAgICAgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2JhdHRlcnlfNTAiIGFuZHJvaWQ6ZHVyYXRpb249IjEwMDAiIC8+CisgICAgICAgIDwvYW5pbWF0aW9uLWxpc3Q+CisgICAgPC9pdGVtPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9Ijc1Ij4KKyAgICAgICAgPGFuaW1hdGlvbi1saXN0IGFuZHJvaWQ6b25lc2hvdD0iZmFsc2UiPgorICAgICAgICAgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2JhdHRlcnlfNTAiIGFuZHJvaWQ6ZHVyYXRpb249IjEwMDAiIC8+CisgICAgICAgICAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYmF0dGVyeV83NSIgYW5kcm9pZDpkdXJhdGlvbj0iMTAwMCIgLz4KKyAgICAgICAgPC9hbmltYXRpb24tbGlzdD4KKyAgICA8L2l0ZW0+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iOTIiPgorICAgICAgICA8YW5pbWF0aW9uLWxpc3QgYW5kcm9pZDpvbmVzaG90PSJmYWxzZSI+CisgICAgICAgICAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYmF0dGVyeV83NSIgYW5kcm9pZDpkdXJhdGlvbj0iMTAwMCIgLz4KKyAgICAgICAgICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9iYXR0ZXJ5XzEwMCIgYW5kcm9pZDpkdXJhdGlvbj0iMTAwMCIgLz4KKyAgICAgICAgPC9hbmltYXRpb24tbGlzdD4KKyAgICA8L2l0ZW0+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMTAxIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYmF0dGVyeV8xMDAiIC8+Cis8L2xldmVsLWxpc3Q+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9idXR0b25fZnJhbWUueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2J1dHRvbl9mcmFtZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiMzlhNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9idXR0b25fZnJhbWUueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J1dHRvbl9mcmFtZV9wcmVzc2VkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idXR0b25fZnJhbWVfZGVmYXVsdCIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zaWduYWwueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3NpZ25hbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2NzQxOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zaWduYWwueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9yZXMvZHJhd2FibGUvc3RhdF9zeXNfYmF0dGVyeS54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxsZXZlbC1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMDEiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zaWduYWxfMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIyNSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3NpZ25hbF8yNSIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI1MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3NpZ25hbF81MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI3NSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3NpZ25hbF83NSIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIxMDEiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zaWduYWxfMTAwIiAvPgorPC9sZXZlbC1saXN0PgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc2lnbmFsX3NjYW4ueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3NpZ25hbF9zY2FuLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTIxOTkyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3NpZ25hbF9zY2FuLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vcmVzL2RyYXdhYmxlL3N0YXRfc3lzX2JhdHRlcnkueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8YW5pbWF0aW9uLWxpc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc2lnbmFsX3NjYW4xIiBhbmRyb2lkOmR1cmF0aW9uPSI1MDAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3NpZ25hbF9zY2FuMiIgYW5kcm9pZDpkdXJhdGlvbj0iNTAwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zaWduYWxfc2NhbjMiIGFuZHJvaWQ6ZHVyYXRpb249IjUwMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc2lnbmFsX3NjYW40IiBhbmRyb2lkOmR1cmF0aW9uPSI1MDAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3NpZ25hbF9zY2FuMyIgYW5kcm9pZDpkdXJhdGlvbj0iNTAwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zaWduYWxfc2NhbjIiIGFuZHJvaWQ6ZHVyYXRpb249IjUwMCIgLz4KKzwvYW5pbWF0aW9uLWxpc3Q+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2sueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfYmFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiZjE0NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2sueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfYmFja19wcmVzc2VkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2tfZGVmYXVsdCIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2V4cGFuZC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9leHBhbmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjY5MjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9leHBhbmQueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfZXhwYW5kX3ByZXNzZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfZXhwYW5kX2RlZmF1bHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2hvbWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMTE3MTEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lX2RlZmF1bHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX21lbnUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNzI4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51LnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51X2RlZmF1bHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9yZWNlbnQueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfcmVjZW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNzA4NDU1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfcmVjZW50LnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX3JlY2VudF9wcmVzc2VkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX3JlY2VudF9kZWZhdWx0IiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfdmV0by54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl92ZXRvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTFiNjgxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfdmV0by54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl92ZXRvX3ByZXNzZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfdmV0b19ub3JtYWwiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvd2lmaS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvd2lmaS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2M2FmNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS93aWZpLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vcmVzL2RyYXdhYmxlL3N0YXRfc3lzX2JhdHRlcnkueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8bGV2ZWwtbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjAxIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvd2lmaV8wIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjI1IiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvd2lmaV8yNSIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI1MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3dpZmlfNTAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNzUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS93aWZpXzc1IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjEwMSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3dpZmlfMTAwIiAvPgorCis8L2xldmVsLWxpc3Q+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS93aWZpX3NjYW4ueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3dpZmlfc2Nhbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4OGQwZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS93aWZpX3NjYW4ueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9yZXMvZHJhd2FibGUvc3RhdF9zeXNfYmF0dGVyeS54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxhbmltYXRpb24tbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS93aWZpX3NjYW4xIiBhbmRyb2lkOmR1cmF0aW9uPSI1MDAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3dpZmlfc2NhbjIiIGFuZHJvaWQ6ZHVyYXRpb249IjUwMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvd2lmaV9zY2FuMyIgYW5kcm9pZDpkdXJhdGlvbj0iNTAwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS93aWZpX3NjYW40IiBhbmRyb2lkOmR1cmF0aW9uPSI1MDAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3dpZmlfc2NhbjMiIGFuZHJvaWQ6ZHVyYXRpb249IjUwMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvd2lmaV9zY2FuMiIgYW5kcm9pZDpkdXJhdGlvbj0iNTAwIiAvPgorPC9hbmltYXRpb24tbGlzdD4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhci54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGMyYzk1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhci54bWwKQEAgLTAsMCArMSwxNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiBhcHBzL2NvbW1vbi9hc3NldHMvZGVmYXVsdC9kZWZhdWx0L3NraW5zL1N0YXR1c0Jhci54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9jbG9zZWRfZGVmYXVsdF9iYWNrZ3JvdW5kIiAtLT4KKzxSZWxhdGl2ZUxheW91dAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczpzeXN0ZW11aT0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9jb20uYW5kcm9pZC5zeXN0ZW11aSIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2tncm91bmQiCisgICAgYW5kcm9pZDpmb2N1c2FibGU9InRydWUiCisgICAgYW5kcm9pZDpkZXNjZW5kYW50Rm9jdXNhYmlsaXR5PSJhZnRlckRlc2NlbmRhbnRzIgorICAgID4KKworICAgICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5Ob3RpZmljYXRpb25JY29uQXJlYQorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ub3RpZmljYXRpb25JY29ucyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6b25DbGljaz0ibm90aWZpY2F0aW9uSWNvbnNDbGlja2VkIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9pY29uX3RyYXkiCisgICAgICAgICAgICA+CisgICAgICAgICAgICA8SW1hZ2VWaWV3CisgICAgICAgICAgICAgICAgY2xhc3M9ImNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuTm90aWZpY2F0aW9uSWNvbkFyZWEkTW9yZVZpZXciCisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9leHBhbmQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3N0YXR1c19iYXJfZXhwYW5kIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6b25DbGljaz0ibm90aWZpY2F0aW9uSWNvbnNDbGlja2VkIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8dmlldworICAgICAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0Lk5vdGlmaWNhdGlvbkljb25BcmVhJEljb25MYXlvdXQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pY29ucyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQCphbmRyb2lkOmRpbWVuL3N0YXR1c19iYXJfaWNvbl9zaXplIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjhkaXAiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDx2aWV3CisgICAgICAgICAgICAgICAgY2xhc3M9ImNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuTm90aWZpY2F0aW9uSWNvbkFyZWEkRHJhZ2dlclZpZXciCisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9oYW5kbGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI0ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjhkaXAiCisgICAgICAgICAgICAgICAgLz4KKworICAgICAgICA8L2NvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuTm90aWZpY2F0aW9uSWNvbkFyZWE+CisKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3RpY2tlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMDBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmFuaW1hdGlvbkNhY2hlPSJmYWxzZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduTGVmdD0iQGlkL25vdGlmaWNhdGlvbkljb25zIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25Ub3A9IkBpZC9ub3RpZmljYXRpb25JY29ucyIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICA+CisgICAgICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGlja2VySWNvbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLlRpY2tlclZpZXcgYW5kcm9pZDppZD0iQCtpZC90aWNrZXJUZXh0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjJkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEwZGlwIj4KKyAgICAgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQCphbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaWNrZXIiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkAqYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuVGlja2VyIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuVGlja2VyVmlldz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L3N0YXR1c19iYXJfY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE2MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySW5QYXJlbnQ9InRydWUiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuS2V5QnV0dG9uVmlldyBhbmRyb2lkOmlkPSJAK2lkL2JhY2siCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQCtpZC9tZW51IgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2siCisgICAgICAgICAgICBzeXN0ZW11aTprZXlDb2RlPSI0IgorICAgICAgICAgICAgLz4KKyAgICAgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5LZXlCdXR0b25WaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbWVudSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAK2lkL3JlY2VudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51IgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI0ZGlwIgorICAgICAgICAgICAgc3lzdGVtdWk6a2V5Q29kZT0iODIiCisgICAgICAgICAgICAvPgorICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcmVjZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkAraWQvaG9tZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N0YXR1c19iYXJfcmVjZW50IgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJyZWNlbnRCdXR0b25DbGlja2VkIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5LZXlCdXR0b25WaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaG9tZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3N0YXR1c19iYXJfaG9tZSIKKyAgICAgICAgICAgIHN5c3RlbXVpOmtleUNvZGU9IjMiCisgICAgICAgICAgICAvPgorPC9SZWxhdGl2ZUxheW91dD4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhcl9jZW50ZXIueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhcl9jZW50ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZjgzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2NlbnRlci54bWwKQEAgLTAsMCArMSw1NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBDZW50ZXIgb2Ygc3RhdHVzIGJhcjogU3lzdGVtIGluZm8gZGlzcGxheSwgc3lzdGVtIGluZm8gcGFuZWwgdHJpZ2dlciAtLT4KKzxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3N5c3RlbUluZm8iCisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnN5c3RlbXVpPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2NvbS5hbmRyb2lkLnN5c3RlbXVpIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxNjBkaXAiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySW5QYXJlbnQ9InRydWUiCisgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCisgICAgYW5kcm9pZDpvbkNsaWNrPSJzeXN0ZW1JbmZvQ2xpY2tlZCIKKyAgICA+CisgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5DbG9jaworICAgICAgICBzdHlsZT0iQCphbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5JY29uIgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Nsb2NrIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNjRkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDhkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlckluUGFyZW50PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNnNwIgorICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIyZGlwIgorICAgICAgICAvPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9iYXR0ZXJ5IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNDhkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDhkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAaWQvY2xvY2siCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvYmF0dGVyeSIKKyAgICAgICAgLz4KKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2lnbmFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNDhkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDhkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL2Nsb2NrIgorICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3NpZ25hbCIKKyAgICAgICAgLz4KKzwvUmVsYXRpdmVMYXlvdXQ+CisKKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnQueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNDkyZDAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudC54bWwKQEAgLTAsMCArMSwzNiBAQAorPFJlbGF0aXZlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjVzcCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kIgorICAgID4KKworICAgIDxJbWFnZUJ1dHRvbgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3ZldG8iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX3ZldG8iCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQG51bGwiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMmRpcCIKKyAgICAgICAgLz4KKworICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuTGF0ZXN0SXRlbVZpZXcgYW5kcm9pZDppZD0iQCtpZC9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC92ZXRvIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjY0c3AiCisgICAgICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjZzcCIKKyAgICAgICAgLz4KKworICAgIDxWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMXNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfZGFyayIKKyAgICAgICAgLz4KKworPC9SZWxhdGl2ZUxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N5c2Jhcl9wYW5lbF9ub3RpZmljYXRpb25zLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N5c2Jhcl9wYW5lbF9ub3RpZmljYXRpb25zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDg5ZWVjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3lzYmFyX3BhbmVsX25vdGlmaWNhdGlvbnMueG1sCkBAIC0wLDAgKzEsNjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiBhcHBzL2NvbW1vbi9hc3NldHMvZGVmYXVsdC9kZWZhdWx0L3NraW5zL1N0YXR1c0Jhci54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9jbG9zZWRfZGVmYXVsdF9iYWNrZ3JvdW5kIiAtLT4KKzxMaW5lYXJMYXlvdXQKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICA+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9jbGVhcl9hbGxfYnV0dG9uIgorICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0fGNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIyZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjFkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSI2ZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNHNwIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc3RhdHVzX2Jhcl9jbGVhcl9hbGxfYnV0dG9uIgorICAgICAgICAvPgorCisgICAgPFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxc3AiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsiCisgICAgICAgIC8+CisKKyAgICA8U2Nyb2xsVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vdGlmaWNhdGlvblNjcm9sbGVyIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgPgorICAgICAgICA8TGluZWFyTGF5b3V0IAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbHxib3R0b20iCisgICAgICAgICAgICBhbmRyb2lkOmFuaW1hdGlvbkNhY2hlPSJmYWxzZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrZ3JvdW5kIgorICAgICAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZGVzY2VuZGFudEZvY3VzYWJpbGl0eT0iYWZ0ZXJEZXNjZW5kYW50cyIKKyAgICAgICAgICAgID4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPC9TY3JvbGxWaWV3PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zeXNiYXJfcGFuZWxfc3lzdGVtLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N5c2Jhcl9wYW5lbF9zeXN0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YzYzODgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zeXNiYXJfcGFuZWxfc3lzdGVtLnhtbApAQCAtMCwwICsxLDE1MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIGFwcHMvY29tbW9uL2Fzc2V0cy9kZWZhdWx0L2RlZmF1bHQvc2tpbnMvU3RhdHVzQmFyLnhtbAorKioKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuU3lzdGVtUGFuZWwKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICA+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zZXR0aW5nc19idXR0b24iCisgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0ibGVmdHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjBzcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3N5c3RlbV9wYW5lbF9zZXR0aW5nc19idXR0b24iCisgICAgICAgIC8+CisKKyAgICA8VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFzcCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfZGFyayIKKyAgICAgICAgLz4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSI4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgID4KKyAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYnJpZ2h0bmVzcyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvc3lzdGVtX3BhbmVsX2JyaWdodG5lc3NfZGVmYXVsdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2J1dHRvbl9mcmFtZSIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3NvdW5kIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvc3lzdGVtX3BhbmVsX3NvdW5kX2RlZmF1bHQiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9idXR0b25fZnJhbWUiCisgICAgICAgICAgICAvPgorICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9vcmllbnRhdGlvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9kZWZhdWx0IgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvYnV0dG9uX2ZyYW1lIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYWlycGxhbmUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9zeXN0ZW1fcGFuZWxfYWlycGxhbmVfZGVmYXVsdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2J1dHRvbl9mcmFtZSIKKyAgICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSI4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgPgorICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9iYXR0ZXJ5X21ldGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI5NmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJIb3Jpem9udGFsPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJjZW50ZXJDcm9wIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvYmF0dGVyeSIKKyAgICAgICAgICAgICAgICAvPgorCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9iYXR0ZXJ5X2luZm8iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2JhdHRlcnlfbWV0ZXIiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLkNsb2NrCisgICAgICAgICAgICBzdHlsZT0iQCphbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5JY29uIgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jbG9jayIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIwc3AiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlckhvcml6b250YWw9InRydWUiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2RhdGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2Nsb2NrIgorICAgICAgICAgICAgLz4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICA+CisgICAgICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2lnbmFsX21ldGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI5NmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJIb3Jpem9udGFsPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJjZW50ZXJDcm9wIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvc2lnbmFsIgorICAgICAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3NpZ25hbF9pbmZvIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9zaWduYWxfbWV0ZXIiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKzwvY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5TeXN0ZW1QYW5lbD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvaW50cnVkZXJfYWxlcnQueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9pbnRydWRlcl9hbGVydC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0YTc3NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvaW50cnVkZXJfYWxlcnQueG1sCkBAIC0wLDAgKzEsNTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiBhcHBzL2NvbW1vbi9hc3NldHMvZGVmYXVsdC9kZWZhdWx0L3NraW5zL1N0YXR1c0Jhci54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9jbG9zZWRfZGVmYXVsdF9iYWNrZ3JvdW5kIiAtLT4KKzxGcmFtZUxheW91dAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjMyZGlwIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iOGRpcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iOGRpcCIKKyAgICA+CisgICAgICAgIAorICAgIDxMaW5lYXJMYXlvdXQgCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW50cnVkZXJfYWxlcnRfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOmFuaW1hdGlvbkNhY2hlPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvYWxlcnRfYmFyX2JhY2tncm91bmQiCisgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkZXNjZW5kYW50Rm9jdXNhYmlsaXR5PSJhZnRlckRlc2NlbmRhbnRzIgorICAgICAgICA+CisKKyAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGVydEljb24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FsZXJ0VGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuSW50cnVkZXJBbGVydCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0ZyYW1lTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhci54bWwKaW5kZXggNWZlOGU3OS4uMmYxYjM2ZTggMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhci54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyLnhtbApAQCAtMjEsNiArMjEsNyBAQAogPCEtLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2Nsb3NlZF9kZWZhdWx0X2JhY2tncm91bmQiIC0tPgogPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5TdGF0dXNCYXJWaWV3CiAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnN5c3RlbXVpPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2NvbS5hbmRyb2lkLnN5c3RlbXVpIgogICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N0YXR1c19iYXJfYmFja2dyb3VuZCIKICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2NvbG9ycy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9jb2xvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MTYxYzNmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UvY29sb3JzLnhtbApAQCAtMCwwICsxLDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cmVzb3VyY2VzPgorICAgIDxkcmF3YWJsZSBuYW1lPSJzdGF0dXNfYmFyX2JhY2tncm91bmQiPiMwMDAwMDA8L2RyYXdhYmxlPgorPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2NvbmZpZy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZjVkMThkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9jb25maWcueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoZXNlIHJlc291cmNlcyBhcmUgYXJvdW5kIGp1c3QgdG8gYWxsb3cgdGhlaXIgdmFsdWVzIHRvIGJlIGN1c3RvbWl6ZWQKKyAgICAgZm9yIGRpZmZlcmVudCBoYXJkd2FyZSBhbmQgcHJvZHVjdCBidWlsZHMuIC0tPgorPHJlc291cmNlcz4KKyAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfc3RhdHVzX2Jhcl9wb3NpdGlvbiI+MTwvaW50ZWdlcj4KKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNTljOTIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDc3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCistLT4KKzxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gVGhlIHRleHQgZm9yIHRoZSBidXR0b24gaW4gdGhlIG5vdGlmaWNhdGlvbiB3aW5kb3ctc2hhZGUgdGhhdCBjbGVhcnMKKyAgICAgICAgIGFsbCBvZiB0aGUgY3VycmVudGx5IHZpc2libGUgbm90aWZpY2F0aW9ucy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24iPkNsZWFyIGFsbDwvc3RyaW5nPgorCisgICAgPCEtLSBTeXN0ZW0gcGFuZWwgKCJRdWljayBTZXR0aW5ncyIpIC0tPgorCisgICAgPCEtLSBUZXh0IHRvIGRpc3BsYXkgdW5kZXJuZWF0aCB0aGUgZ3JhcGhpY2FsIGJhdHRlcnkgbWV0ZXIuIFNob3VsZAorICAgICAgICAgaW5jbHVkZSB0aGUgd29yZCBmb3IgImJhdHRlcnkiIGFuZCBhIHBsYWNlIGZvciB0aGUgcGVyY2VudGFnZSBjaGFyZ2UKKyAgICAgICAgIGF2YWlsYWJsZS4gW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3lzdGVtX3BhbmVsX2JhdHRlcnlfbWV0ZXJfZm9ybWF0Ij4KKyAgICAgICAgQmF0dGVyeTogPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9InBlcmNlbnQiPiUlPC94bGlmZjpnPgorICAgIDwvc3RyaW5nPgorCisgICAgPCEtLSBUZXh0IHRvIGRpc3BsYXkgdW5kZXJuZWF0aCB0aGUgZ3JhcGhpY2FsIHNpZ25hbCBzdHJlbmd0aCBtZXRlciB3aGVuCisgICAgICAgICBubyBjb25uZWN0aW9uIGlzIGF2YWlsYWJsZS4gW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl9kaXNjb25uZWN0ZWQiPgorICAgICAgICBubyBpbnRlcm5ldCBjb25uZWN0aW9uCisgICAgPC9zdHJpbmc+CisKKyAgICA8IS0tIFRleHQgdG8gZGlzcGxheSB1bmRlcm5lYXRoIHRoZSBncmFwaGljYWwgc2lnbmFsIHN0cmVuZ3RoIG1ldGVyIHdoZW4KKyAgICAgICAgIGl0IGlzIGRpc3BsYXlpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBjb25uZWN0ZWQsIG5hbWVkIFdpLUZpIG5ldHdvcmsuCisgICAgICAgICBTaG91bGQgaW5jbHVkZSB0aGUgd29yZCBmb3IgIldpLUZpIiBhbmQgYSBwbGFjZWhvbGRlciBmb3IgdGhlCisgICAgICAgICB3aXJlbGVzcyBuZXR3b3JrJ3MgU1NJRC4gW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl93aWZpX3NzaWRfZm9ybWF0Ij4KKyAgICAgICAgV2ktRmk6IDx4bGlmZjpnIGlkPSJzc2lkIj4lczwveGxpZmY6Zz4KKyAgICA8L3N0cmluZz4KKworICAgIDwhLS0gVGV4dCB0byBkaXNwbGF5IHVuZGVybmVhdGggdGhlIGdyYXBoaWNhbCBzaWduYWwgc3RyZW5ndGggbWV0ZXIgd2hlbgorICAgICAgICAgaXQgaXMgZGlzcGxheWluZyBXaS1GaSBzdGF0dXMgYW5kIFdpLUZpIGlzIGNvbm5lY3RlZCB0byBhIG5ldHdvcmsKKyAgICAgICAgIHdob3NlIFNTSUQgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgICAgIFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InN5c3RlbV9wYW5lbF9zaWduYWxfbWV0ZXJfd2lmaV9ub3NzaWQiPgorICAgICAgICBXaS1GaTogY29ubmVjdGVkCisgICAgPC9zdHJpbmc+CisKKyAgICA8IS0tIFRleHQgdG8gZGlzcGxheSB1bmRlcm5lYXRoIHRoZSBncmFwaGljYWwgc2lnbmFsIHN0cmVuZ3RoIG1ldGVyIHdoZW4KKyAgICAgICAgIGl0IGlzIGRpc3BsYXlpbmcgV2ktRmkgc3RhdHVzIGFuZCBXaS1GaSBpcyBpbiB0aGUgcHJvY2VzcyBvZgorICAgICAgICAgY29ubmVjdGluZyB0byBhIG5ldHdvcmsuICBbQ0hBUiBMSU1JVD0yMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzeXN0ZW1fcGFuZWxfc2lnbmFsX21ldGVyX3dpZmlfY29ubmVjdGluZyI+CisgICAgICAgIFdpLUZpOiBjb25uZWN0aW5n4oCmCisgICAgPC9zdHJpbmc+CisgCisgICAgPCEtLSBUZXh0IHRvIGRpc3BsYXkgdW5kZXJuZWF0aCB0aGUgZ3JhcGhpY2FsIHNpZ25hbCBzdHJlbmd0aCBtZXRlciB3aGVuCisgICAgICAgICBpdCBpcyBkaXNwbGF5aW5nIG1vYmlsZSBkYXRhICgzRykgc3RhdHVzIGFuZCBhIG5ldHdvcmsgY29ubmVjdGlvbiBpcworICAgICAgICAgYXZhaWxhYmxlLgorICAgICAgICAgW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl9kYXRhX2Nvbm5lY3RlZCI+CisgICAgICAgIE1vYmlsZSBkYXRhOiBjb25uZWN0ZWQKKyAgICA8L3N0cmluZz4KKworICAgIDwhLS0gVGV4dCB0byBkaXNwbGF5IHVuZGVybmVhdGggdGhlIGdyYXBoaWNhbCBzaWduYWwgc3RyZW5ndGggbWV0ZXIgd2hlbgorICAgICAgICAgaXQgaXMgZGlzcGxheWluZyBtb2JpbGUgZGF0YSAoM0cpIHN0YXR1cyBhbmQgYSBuZXR3b3JrIGNvbm5lY3Rpb24gaXMKKyAgICAgICAgIHVuYXZhaWxhYmxlLgorICAgICAgICAgW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl9kYXRhX2Nvbm5lY3RpbmciPgorICAgICAgICBNb2JpbGUgZGF0YTogY29ubmVjdGluZ+KApgorICAgIDwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2F0dHJzLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvYXR0cnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYmNmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2F0dHJzLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJLZXlCdXR0b25WaWV3Ij4KKyAgICAgICAgPGF0dHIgbmFtZT0ia2V5Q29kZSIgZm9ybWF0PSJpbnRlZ2VyIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+Cis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb25maWcueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb25maWcueG1sCmluZGV4IDhlYTQ2ZTUuLmFjMDBjNjkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvY29uZmlnLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbmZpZy54bWwKQEAgLTIwLDcgKzIwLDE2IEBACiA8IS0tIFRoZXNlIHJlc291cmNlcyBhcmUgYXJvdW5kIGp1c3QgdG8gYWxsb3cgdGhlaXIgdmFsdWVzIHRvIGJlIGN1c3RvbWl6ZWQKICAgICAgZm9yIGRpZmZlcmVudCBoYXJkd2FyZSBhbmQgcHJvZHVjdCBidWlsZHMuIC0tPgogPHJlc291cmNlcz4KLSAgICA8IS0tIENvbnRyb2wgd2hldGhlciBzdGF0dXMgYmFyIHNob3VsZCBkaXN0aW5ndWlzaCBIU1BBIGRhdGEgaWNvbiBmb3JtIFVNVFMgZGF0YSBpY29uIG9uIGRldmljZXMgLS0+CisKKyAgICA8IS0tIENvbnRyb2wgd2hldGhlciBzdGF0dXMgYmFyIHNob3VsZCBkaXN0aW5ndWlzaCBIU1BBIGRhdGEgaWNvbiBmb3JtIFVNVFMKKyAgICBkYXRhIGljb24gb24gZGV2aWNlcyAtLT4KICAgICA8Ym9vbCBuYW1lPSJjb25maWdfaHNwYV9kYXRhX2Rpc3Rpbmd1aXNoYWJsZSI+ZmFsc2U8L2Jvb2w+CisKKyAgICA8IS0tIFRoZSBsb2NhdGlvbiBvZiB0aGUgc3RhdHVzIGJhci4KKyAgICAgICAgMCAtIHRvcAorICAgICAgICAxIC0gYm90dG9tCisgICAgLS0+CisgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX3N0YXR1c19iYXJfcG9zaXRpb24iPjA8L2ludGVnZXI+CisKIDwvcmVzb3VyY2VzPgogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCBiYTNhM2QxLi4yZGYzYjZkIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTUxLDQgKzUxLDcgQEAKICAgICAgICAgIHBvd2VyIHVzYWdlIGFjdGl2aXR5IHRvIGZpbmQgb3V0IHdoYXQgZHJhaW5lZCB0aGUgYmF0dGVyeS4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJiYXR0ZXJ5X2xvd193aHkiPkJhdHRlcnkgdXNlPC9zdHJpbmc+CiAKKyAgICA8IS0tIE5hbWUgb2YgdGhlIGJ1dHRvbiB0aGF0IGxpbmtzIHRvIHRoZSBTZXR0aW5ncyBhcHAuIFtNQVhDSEFSUz1OT05FXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InN5c3RlbV9wYW5lbF9zZXR0aW5nc19idXR0b24iPlNldHRpbmdzPC9zdHJpbmc+CisKIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9DbG9zZURyYWdIYW5kbGUuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ2xvc2VEcmFnSGFuZGxlLmphdmEKaW5kZXggZjQ1Y2FmNTEuLjBmNjcyM2UgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ2xvc2VEcmFnSGFuZGxlLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9DbG9zZURyYWdIYW5kbGUuamF2YQpAQCAtMjMsNyArMjMsNyBAQAogCiAKIHB1YmxpYyBjbGFzcyBDbG9zZURyYWdIYW5kbGUgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgewotICAgIFN0YXR1c0JhclNlcnZpY2UgbVNlcnZpY2U7CisgICAgUGhvbmVTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOwogCiAgICAgcHVibGljIENsb3NlRHJhZ0hhbmRsZShDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewogICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0NvbW1hbmRRdWV1ZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Db21tYW5kUXVldWUuamF2YQppbmRleCBmOTM0N2IxLi4yYzBhZjY1IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0NvbW1hbmRRdWV1ZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ29tbWFuZFF1ZXVlLmphdmEKQEAgLTMyLDcgKzMyLDcgQEAKICAqIGNvYWxlc2NpbmcgdGhlc2UgY2FsbHMgc28gdGhleSBkb24ndCBzdGFjayB1cC4gIEZvciB0aGUgY2FsbHMKICAqIGFyZSBjb2FsZXNjZWQsIG5vdGUgdGhhdCB0aGV5IGFyZSBhbGwgaWRlbXBvdGVudC4KICAqLwotY2xhc3MgQ29tbWFuZFF1ZXVlIGV4dGVuZHMgSVN0YXR1c0Jhci5TdHViIHsKK3B1YmxpYyBjbGFzcyBDb21tYW5kUXVldWUgZXh0ZW5kcyBJU3RhdHVzQmFyLlN0dWIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RhdHVzQmFyLkNvbW1hbmRRdWV1ZSI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX01BU0sgPSAweGZmZmYwMDAwOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9FeHBhbmRlZFZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvRXhwYW5kZWRWaWV3LmphdmEKaW5kZXggM2Q4NWYyNy4uYTJkNGI5NSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9FeHBhbmRlZFZpZXcuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0V4cGFuZGVkVmlldy5qYXZhCkBAIC0yNyw3ICsyNyw3IEBACiAKIAogcHVibGljIGNsYXNzIEV4cGFuZGVkVmlldyBleHRlbmRzIExpbmVhckxheW91dCB7Ci0gICAgU3RhdHVzQmFyU2VydmljZSBtU2VydmljZTsKKyAgICBQaG9uZVN0YXR1c0JhclNlcnZpY2UgbVNlcnZpY2U7CiAgICAgaW50IG1QcmV2SGVpZ2h0ID0gLTE7CiAKICAgICBwdWJsaWMgRXhwYW5kZWRWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CkBAIC01Myw3ICs1Myw3IEBACiAgICAgICAgICAgICAgLy9TbG9nLmQoU3RhdHVzQmFyU2VydmljZS5UQUcsICJoZWlnaHQgY2hhbmdlZCBvbGQ9IiArIG1QcmV2SGVpZ2h0CiAgICAgICAgICAgICAgLy8gICAgICsgIiBuZXc9IiArIGhlaWdodCk7CiAgICAgICAgICAgICAgbVByZXZIZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgICAgICAgbVNlcnZpY2UudXBkYXRlRXhwYW5kZWRWaWV3UG9zKFN0YXR1c0JhclNlcnZpY2UuRVhQQU5ERURfTEVBVkVfQUxPTkUpOworICAgICAgICAgICAgIG1TZXJ2aWNlLnVwZGF0ZUV4cGFuZGVkVmlld1BvcyhQaG9uZVN0YXR1c0JhclNlcnZpY2UuRVhQQU5ERURfTEVBVkVfQUxPTkUpOwogICAgICAgICAgfQogICAgICB9CiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0tleUJ1dHRvblZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvS2V5QnV0dG9uVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNTA4YjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0tleUJ1dHRvblZpZXcuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0aW9uRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSVdpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0RGV2aWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzLlJlbW90ZVZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOworCitwdWJsaWMgY2xhc3MgS2V5QnV0dG9uVmlldyBleHRlbmRzIEltYWdlVmlldyB7CisgICAgSVdpbmRvd01hbmFnZXIgbVdpbmRvd01hbmFnZXI7CisgICAgbG9uZyBtRG93blRpbWU7CisgICAgYm9vbGVhbiBtU2VuZGluZzsKKyAgICBpbnQgbUNvZGU7CisgICAgaW50IG1SZXBlYXQ7CisKKyAgICBwdWJsaWMgS2V5QnV0dG9uVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgS2V5QnV0dG9uVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKworICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIFIuc3R5bGVhYmxlLktleUJ1dHRvblZpZXcsCisgICAgICAgICAgICAgICAgZGVmU3R5bGUsIDApOworCisgICAgICAgIG1Db2RlID0gYS5nZXRJbnRlZ2VyKFIuc3R5bGVhYmxlLktleUJ1dHRvblZpZXdfa2V5Q29kZSwgMCk7CisgICAgICAgIGlmIChtQ29kZSA9PSAwKSB7CisgICAgICAgICAgICBTbG9nLncoU3RhdHVzQmFyU2VydmljZS5UQUcsICJLZXlCdXR0b25WaWV3IHdpdGhvdXQga2V5IGNvZGUgaWQ9MHgiCisgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhnZXRJZCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIG1XaW5kb3dNYW5hZ2VyID0gSVdpbmRvd01hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZSgKKyAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpbnQgeCwgeTsKKworICAgICAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjoKKyAgICAgICAgICAgICAgICBtRG93blRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBtUmVwZWF0ID0gMDsKKyAgICAgICAgICAgICAgICBtU2VuZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgc2VuZEV2ZW50KEtleUV2ZW50LkFDVElPTl9ET1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuRkxBR19GUk9NX1NZU1RFTSB8IEtleUV2ZW50LkZMQUdfU09GVF9LRVlCT0FSRCwgbURvd25UaW1lKTsKKyAgICAgICAgICAgICAgICBzZXRQcmVzc2VkKHRydWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRToKKyAgICAgICAgICAgICAgICBpZiAobVNlbmRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IChpbnQpZXYuZ2V0WCgpOworICAgICAgICAgICAgICAgICAgICB5ID0gKGludClldi5nZXRZKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh4IDwgMCB8fCB4ID49IGdldFdpZHRoKCkgfHwgeSA8IDAgfHwgeSA+PSBnZXRIZWlnaHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVNlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFdmVudChLZXlFdmVudC5BQ1RJT05fVVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LkZMQUdfRlJPTV9TWVNURU0gfCBLZXlFdmVudC5GTEFHX1NPRlRfS0VZQk9BUkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEtleUV2ZW50LkZMQUdfQ0FOQ0VMRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJlc3NlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDoKKyAgICAgICAgICAgICAgICBpZiAobVNlbmRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZEV2ZW50KEtleUV2ZW50LkFDVElPTl9VUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNIHwgS2V5RXZlbnQuRkxBR19TT0ZUX0tFWUJPQVJEKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0UHJlc3NlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdm9pZCBzZW5kRXZlbnQoaW50IGFjdGlvbiwgaW50IGZsYWdzKSB7CisgICAgICAgIHNlbmRFdmVudChhY3Rpb24sIGZsYWdzLCBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSk7CisgICAgfQorCisgICAgdm9pZCBzZW5kRXZlbnQoaW50IGFjdGlvbiwgaW50IGZsYWdzLCBsb25nIHdoZW4pIHsKKyAgICAgICAgZmluYWwgS2V5RXZlbnQgZXYgPSBuZXcgS2V5RXZlbnQobURvd25UaW1lLCB3aGVuLCBhY3Rpb24sIG1Db2RlLCBtUmVwZWF0LAorICAgICAgICAgICAgICAgIDAsIDAsIDAsIGZsYWdzLCBJbnB1dERldmljZS5TT1VSQ0VfS0VZQk9BUkQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU2xvZy5kKFN0YXR1c0JhclNlcnZpY2UuVEFHLCAiaW5qZWN0aW5nIGV2ZW50ICIgKyBldik7CisgICAgICAgICAgICBtV2luZG93TWFuYWdlci5pbmplY3RJbnB1dEV2ZW50Tm9XYWl0KGV2KTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBTeXN0ZW0gcHJvY2VzcyBpcyBkZWFkCisgICAgICAgIH0KKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Ob3RpZmljYXRpb25EYXRhLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL05vdGlmaWNhdGlvbkRhdGEuamF2YQppbmRleCA3YTgyMjY3Li40NWFiZTkzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL05vdGlmaWNhdGlvbkRhdGEuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL05vdGlmaWNhdGlvbkRhdGEuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLlN0YXR1c0Jhck5vdGlmaWNhdGlvbjsKIAoraW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIC8qKgpAQCAtMzUsMjYgKzM2LDQ3IEBACiAgICAgICAgIHB1YmxpYyBWaWV3IHJvdzsgLy8gdGhlIG91dGVyIGV4cGFuZGVkIHZpZXcKICAgICAgICAgcHVibGljIFZpZXcgY29udGVudDsgLy8gdGFrZXMgdGhlIGNsaWNrIGV2ZW50cyBhbmQgc2VuZHMgdGhlIFBlbmRpbmdJbnRlbnQKICAgICAgICAgcHVibGljIFZpZXcgZXhwYW5kZWQ7IC8vIHRoZSBpbmZsYXRlZCBSZW1vdGVWaWV3cworICAgICAgICBwdWJsaWMgRW50cnkoKSB7fQorICAgICAgICBwdWJsaWMgRW50cnkoSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuLCBTdGF0dXNCYXJJY29uVmlldyBpYykgeworICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbiA9IG47CisgICAgICAgICAgICB0aGlzLmljb24gPSBpYzsKKyAgICAgICAgfQogICAgIH0KICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxFbnRyeT4gbUVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PEVudHJ5PigpOworICAgIHByaXZhdGUgZmluYWwgQ29tcGFyYXRvcjxFbnRyeT4gbUVudHJ5Q21wID0gbmV3IENvbXBhcmF0b3I8RW50cnk+KCkgeworICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoRW50cnkgYSwgRW50cnkgYikgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpKGEubm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuIC0gYi5ub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4pOworICAgICAgICB9CisgICAgfTsKIAogICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKICAgICAgICAgcmV0dXJuIG1FbnRyaWVzLnNpemUoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgRW50cnkgZ2V0RW50cnlBdChpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIG1FbnRyaWVzLmdldChpbmRleCk7CisgICAgcHVibGljIEVudHJ5IGdldChpbnQgaSkgeworICAgICAgICByZXR1cm4gbUVudHJpZXMuZ2V0KGkpOwogICAgIH0KIAotICAgIHB1YmxpYyBpbnQgZmluZEVudHJ5KElCaW5kZXIga2V5KSB7Ci0gICAgICAgIGZpbmFsIGludCBOID0gbUVudHJpZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICBFbnRyeSBlbnRyeSA9IG1FbnRyaWVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChlbnRyeS5rZXkgPT0ga2V5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgcHVibGljIEVudHJ5IGZpbmRCeUtleShJQmluZGVyIGtleSkgeworICAgICAgICBmb3IgKEVudHJ5IGUgOiBtRW50cmllcykgeworICAgICAgICAgICAgaWYgKGUua2V5ID09IGtleSkgeworICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGludCBhZGQoRW50cnkgZW50cnkpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBOID0gbUVudHJpZXMuc2l6ZSgpOworICAgICAgICBmb3IgKGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtRW50cnlDbXAuY29tcGFyZShtRW50cmllcy5nZXQoaSksIGVudHJ5KSA+IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRW50cmllcy5hZGQoaSwgZW50cnkpOworICAgICAgICByZXR1cm4gaTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGFkZChJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwgVmlldyByb3csIFZpZXcgY29udGVudCwKQEAgLTY2LDQyICs4OCwyMyBAQAogICAgICAgICBlbnRyeS5jb250ZW50ID0gY29udGVudDsKICAgICAgICAgZW50cnkuZXhwYW5kZWQgPSBleHBhbmRlZDsKICAgICAgICAgZW50cnkuaWNvbiA9IGljb247Ci0gICAgICAgIGZpbmFsIGludCBpbmRleCA9IGNob29zZUluZGV4KG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbik7Ci0gICAgICAgIG1FbnRyaWVzLmFkZChpbmRleCwgZW50cnkpOwotICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgIHJldHVybiBhZGQoZW50cnkpOwogICAgIH0KIAogICAgIHB1YmxpYyBFbnRyeSByZW1vdmUoSUJpbmRlciBrZXkpIHsKLSAgICAgICAgZmluYWwgaW50IE4gPSBtRW50cmllcy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gbUVudHJpZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGVudHJ5LmtleSA9PSBrZXkpIHsKLSAgICAgICAgICAgICAgICBtRW50cmllcy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgICAgICAgICAgfQorICAgICAgICBFbnRyeSBlID0gZmluZEJ5S2V5KGtleSk7CisgICAgICAgIGlmIChlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1FbnRyaWVzLnJlbW92ZShlKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBjaG9vc2VJbmRleChmaW5hbCBsb25nIHdoZW4pIHsKLSAgICAgICAgZmluYWwgaW50IE4gPSBtRW50cmllcy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gbUVudHJpZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGVudHJ5Lm5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbiA+IHdoZW4pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTjsKKyAgICAgICAgcmV0dXJuIGU7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSB2aXNpYmxlIGl0ZW1zIChpLmUuIGl0ZW1zIHdpdGhvdXQgYW4gZXJyb3IpLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc1Zpc2libGVJdGVtcygpIHsKLSAgICAgICAgZmluYWwgaW50IE4gPSBtRW50cmllcy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gbUVudHJpZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGVudHJ5LmV4cGFuZGVkICE9IG51bGwpIHsgLy8gdGhlIHZpZXcgc3VjY2Vzc2Z1bGx5IGluZmxhdGVkCisgICAgICAgIGZvciAoRW50cnkgZSA6IG1FbnRyaWVzKSB7CisgICAgICAgICAgICBpZiAoZS5leHBhbmRlZCAhPSBudWxsKSB7IC8vIHRoZSB2aWV3IHN1Y2Nlc3NmdWxseSBpbmZsYXRlZAogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMTIsMTEgKzExNSw5IEBACiAgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBjbGVhcmFibGUgaXRlbXMgKHRoYXQgYXJlbid0IGVycm9ycykuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2xlYXJhYmxlSXRlbXMoKSB7Ci0gICAgICAgIGZpbmFsIGludCBOID0gbUVudHJpZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICBFbnRyeSBlbnRyeSA9IG1FbnRyaWVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChlbnRyeS5leHBhbmRlZCAhPSBudWxsKSB7IC8vIHRoZSB2aWV3IHN1Y2Nlc3NmdWxseSBpbmZsYXRlZAotICAgICAgICAgICAgICAgIGlmICgoZW50cnkubm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5mbGFncyAmIE5vdGlmaWNhdGlvbi5GTEFHX05PX0NMRUFSKSA9PSAwKSB7CisgICAgICAgIGZvciAoRW50cnkgZSA6IG1FbnRyaWVzKSB7CisgICAgICAgICAgICBpZiAoZS5leHBhbmRlZCAhPSBudWxsKSB7IC8vIHRoZSB2aWV3IHN1Y2Nlc3NmdWxseSBpbmZsYXRlZAorICAgICAgICAgICAgICAgIGlmICgoZS5ub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZsYWdzICYgTm90aWZpY2F0aW9uLkZMQUdfTk9fQ0xFQVIpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9QaG9uZVN0YXR1c0JhclNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhY2VjYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxNTUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TdGF0dXNCYXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmVsb2NpdHlUcmFja2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlckltcGw7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLklTdGF0dXNCYXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLklTdGF0dXNCYXJTZXJ2aWNlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uTGlzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFyTm90aWZpY2F0aW9uOworCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucG9saWN5LlN0YXR1c0JhclBvbGljeTsKKworCisKK3B1YmxpYyBjbGFzcyBQaG9uZVN0YXR1c0JhclNlcnZpY2UgZXh0ZW5kcyBTdGF0dXNCYXJTZXJ2aWNlIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJQaG9uZVN0YXR1c0JhclNlcnZpY2UiOworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIFNQRVcgPSBmYWxzZTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVEFUVVNCQVJfU1RBUlQKKyAgICAgICAgICAgID0gImNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5zdGF0dXNiYXIuU1RBUlQiOworCisgICAgc3RhdGljIGZpbmFsIGludCBFWFBBTkRFRF9MRUFWRV9BTE9ORSA9IC0xMDAwMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IEVYUEFOREVEX0ZVTExfT1BFTiA9IC0xMDAwMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQU5JTUFURSA9IDEwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19BTklNQVRFX1JFVkVBTCA9IDEwMDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TSE9XX0lOVFJVREVSID0gMTAwMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0hJREVfSU5UUlVERVIgPSAxMDAzOworCisgICAgLy8gd2lsbCBsaWtlbHkgbW92ZSB0byBhIHJlc291cmNlIG9yIG90aGVyIHR1bmFibGUgcGFyYW0gYXQgc29tZSBwb2ludAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlRSVURFUl9BTEVSVF9ERUNBWV9NUyA9IDEwMDAwOworCisgICAgU3RhdHVzQmFyUG9saWN5IG1JY29uUG9saWN5OworCisgICAgaW50IG1JY29uU2l6ZTsKKyAgICBEaXNwbGF5IG1EaXNwbGF5OworCisgICAgU3RhdHVzQmFyVmlldyBtU3RhdHVzQmFyVmlldzsKKyAgICBpbnQgbVBpeGVsRm9ybWF0OworICAgIEggbUhhbmRsZXIgPSBuZXcgSCgpOworICAgIE9iamVjdCBtUXVldWVMb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgLy8gaWNvbnMKKyAgICBMaW5lYXJMYXlvdXQgbUljb25zOworICAgIEljb25NZXJnZXIgbU5vdGlmaWNhdGlvbkljb25zOworICAgIExpbmVhckxheW91dCBtU3RhdHVzSWNvbnM7CisKKyAgICAvLyBleHBhbmRlZCBub3RpZmljYXRpb25zCisgICAgRGlhbG9nIG1FeHBhbmRlZERpYWxvZzsKKyAgICBFeHBhbmRlZFZpZXcgbUV4cGFuZGVkVmlldzsKKyAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBtRXhwYW5kZWRQYXJhbXM7CisgICAgU2Nyb2xsVmlldyBtU2Nyb2xsVmlldzsKKyAgICBWaWV3IG1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQ7CisgICAgVmlldyBtRXhwYW5kZWRDb250ZW50czsKKyAgICAvLyB0b3AgYmFyCisgICAgVGV4dFZpZXcgbU5vTm90aWZpY2F0aW9uc1RpdGxlOworICAgIFRleHRWaWV3IG1DbGVhckJ1dHRvbjsKKyAgICAvLyBkcmFnIGJhcgorICAgIENsb3NlRHJhZ0hhbmRsZSBtQ2xvc2VWaWV3OworICAgIC8vIG9uZ29pbmcKKyAgICBOb3RpZmljYXRpb25EYXRhIG1PbmdvaW5nID0gbmV3IE5vdGlmaWNhdGlvbkRhdGEoKTsKKyAgICBUZXh0VmlldyBtT25nb2luZ1RpdGxlOworICAgIExpbmVhckxheW91dCBtT25nb2luZ0l0ZW1zOworICAgIC8vIGxhdGVzdAorICAgIE5vdGlmaWNhdGlvbkRhdGEgbUxhdGVzdCA9IG5ldyBOb3RpZmljYXRpb25EYXRhKCk7CisgICAgVGV4dFZpZXcgbUxhdGVzdFRpdGxlOworICAgIExpbmVhckxheW91dCBtTGF0ZXN0SXRlbXM7CisgICAgLy8gcG9zaXRpb24KKyAgICBpbnRbXSBtUG9zaXRpb25UbXAgPSBuZXcgaW50WzJdOworICAgIGJvb2xlYW4gbUV4cGFuZGVkOworICAgIGJvb2xlYW4gbUV4cGFuZGVkVmlzaWJsZTsKKworICAgIC8vIHRoZSBkYXRlIHZpZXcKKyAgICBEYXRlVmlldyBtRGF0ZVZpZXc7CisKKyAgICAvLyBmb3IgaW1tZXJzaXZlIGFjdGl2aXRpZXMKKyAgICBwcml2YXRlIFZpZXcgbUludHJ1ZGVyQWxlcnRWaWV3OworCisgICAgLy8gdGhlIHRyYWNrZXIgdmlldworICAgIFRyYWNraW5nVmlldyBtVHJhY2tpbmdWaWV3OworICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIG1UcmFja2luZ1BhcmFtczsKKyAgICBpbnQgbVRyYWNraW5nUG9zaXRpb247IC8vIHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9wIG9mIHRoZSB0cmFja2luZyB2aWV3LgorICAgIHByaXZhdGUgYm9vbGVhbiBtUGFuZWxTbGlnaHRseVZpc2libGU7CisKKyAgICAvLyB0aWNrZXIKKyAgICBwcml2YXRlIFRpY2tlciBtVGlja2VyOworICAgIHByaXZhdGUgVmlldyBtVGlja2VyVmlldzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVRpY2tpbmc7CisKKyAgICAvLyBUcmFja2luZyBmaW5nZXIgZm9yIG9wZW5pbmcvY2xvc2luZy4KKyAgICBpbnQgbUVkZ2VCb3JkZXI7IC8vIGNvcnJlc3BvbmRzIHRvIFIuZGltZW4uc3RhdHVzX2Jhcl9lZGdlX2lnbm9yZQorICAgIGJvb2xlYW4gbVRyYWNraW5nOworICAgIFZlbG9jaXR5VHJhY2tlciBtVmVsb2NpdHlUcmFja2VyOworCisgICAgc3RhdGljIGZpbmFsIGludCBBTklNX0ZSQU1FX0RVUkFUSU9OID0gKDEwMDAvNjApOworCisgICAgYm9vbGVhbiBtQW5pbWF0aW5nOworICAgIGxvbmcgbUN1ckFuaW1hdGlvblRpbWU7CisgICAgZmxvYXQgbURpc3BsYXlIZWlnaHQ7CisgICAgZmxvYXQgbUFuaW1ZOworICAgIGZsb2F0IG1BbmltVmVsOworICAgIGZsb2F0IG1BbmltQWNjZWw7CisgICAgbG9uZyBtQW5pbUxhc3RUaW1lOworICAgIGJvb2xlYW4gbUFuaW1hdGluZ1JldmVhbCA9IGZhbHNlOworICAgIGludCBtVmlld0RlbHRhOworICAgIGludFtdIG1BYnNQb3MgPSBuZXcgaW50WzJdOworCisgICAgLy8gZm9yIGRpc2FibGluZyB0aGUgc3RhdHVzIGJhcgorICAgIGludCBtRGlzYWJsZWQgPSAwOworCisgICAgcHJpdmF0ZSBjbGFzcyBFeHBhbmRlZERpYWxvZyBleHRlbmRzIERpYWxvZyB7CisgICAgICAgIEV4cGFuZGVkRGlhbG9nKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9MaWdodF9Ob1RpdGxlQmFyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaEtleUV2ZW50KEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBib29sZWFuIGRvd24gPSBldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTjsKKyAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0S2V5Q29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfQkFDSzoKKyAgICAgICAgICAgICAgICBpZiAoIWRvd24pIHsKKyAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoS2V5RXZlbnQoZXZlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CisgICAgICAgIG1EaXNwbGF5ID0gKChXaW5kb3dNYW5hZ2VyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSkpLmdldERlZmF1bHREaXNwbGF5KCk7CisKKyAgICAgICAgc3VwZXIub25DcmVhdGUoKTsKKworICAgICAgICBhZGRJbnRydWRlclZpZXcoKTsKKworICAgICAgICAvLyBMYXN0bHksIGNhbGwgdG8gdGhlIGljb24gcG9saWN5IHRvIGluc3RhbGwvdXBkYXRlIGFsbCB0aGUgaWNvbnMuCisgICAgICAgIG1JY29uUG9saWN5ID0gbmV3IFN0YXR1c0JhclBvbGljeSh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIC8vIHdlJ3JlIG5ldmVyIGRlc3Ryb3llZAorICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gQ29uc3RydWN0aW5nIHRoZSB2aWV3CisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBwcm90ZWN0ZWQgVmlldyBtYWtlU3RhdHVzQmFyVmlldygpIHsKKyAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gdGhpczsKKworICAgICAgICBSZXNvdXJjZXMgcmVzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKworICAgICAgICBtSWNvblNpemUgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3RhdHVzX2Jhcl9pY29uX3NpemUpOworCisgICAgICAgIEV4cGFuZGVkVmlldyBleHBhbmRlZCA9IChFeHBhbmRlZFZpZXcpVmlldy5pbmZsYXRlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgUi5sYXlvdXQuc3RhdHVzX2Jhcl9leHBhbmRlZCwgbnVsbCk7CisgICAgICAgIGV4cGFuZGVkLm1TZXJ2aWNlID0gdGhpczsKKworICAgICAgICBtSW50cnVkZXJBbGVydFZpZXcgPSBWaWV3LmluZmxhdGUoY29udGV4dCwgUi5sYXlvdXQuaW50cnVkZXJfYWxlcnQsIG51bGwpOworICAgICAgICBtSW50cnVkZXJBbGVydFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICBtSW50cnVkZXJBbGVydFZpZXcuc2V0Q2xpY2thYmxlKHRydWUpOworCisgICAgICAgIFN0YXR1c0JhclZpZXcgc2IgPSAoU3RhdHVzQmFyVmlldylWaWV3LmluZmxhdGUoY29udGV4dCwgUi5sYXlvdXQuc3RhdHVzX2JhciwgbnVsbCk7CisgICAgICAgIHNiLm1TZXJ2aWNlID0gdGhpczsKKworICAgICAgICAvLyBmaWd1cmUgb3V0IHdoaWNoIHBpeGVsLWZvcm1hdCB0byB1c2UgZm9yIHRoZSBzdGF0dXMgYmFyLgorICAgICAgICBtUGl4ZWxGb3JtYXQgPSBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVDsKKyAgICAgICAgRHJhd2FibGUgYmcgPSBzYi5nZXRCYWNrZ3JvdW5kKCk7CisgICAgICAgIGlmIChiZyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUGl4ZWxGb3JtYXQgPSBiZy5nZXRPcGFjaXR5KCk7CisgICAgICAgIH0KKworICAgICAgICBtU3RhdHVzQmFyVmlldyA9IHNiOworICAgICAgICBtU3RhdHVzSWNvbnMgPSAoTGluZWFyTGF5b3V0KXNiLmZpbmRWaWV3QnlJZChSLmlkLnN0YXR1c0ljb25zKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zID0gKEljb25NZXJnZXIpc2IuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uSWNvbnMpOworICAgICAgICBtSWNvbnMgPSAoTGluZWFyTGF5b3V0KXNiLmZpbmRWaWV3QnlJZChSLmlkLmljb25zKTsKKyAgICAgICAgbVRpY2tlclZpZXcgPSBzYi5maW5kVmlld0J5SWQoUi5pZC50aWNrZXIpOworICAgICAgICBtRGF0ZVZpZXcgPSAoRGF0ZVZpZXcpc2IuZmluZFZpZXdCeUlkKFIuaWQuZGF0ZSk7CisKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nID0gbmV3IEV4cGFuZGVkRGlhbG9nKGNvbnRleHQpOworICAgICAgICBtRXhwYW5kZWRWaWV3ID0gZXhwYW5kZWQ7CisgICAgICAgIG1FeHBhbmRlZENvbnRlbnRzID0gZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uTGluZWFyTGF5b3V0KTsKKyAgICAgICAgbU9uZ29pbmdUaXRsZSA9IChUZXh0VmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5vbmdvaW5nVGl0bGUpOworICAgICAgICBtT25nb2luZ0l0ZW1zID0gKExpbmVhckxheW91dClleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5vbmdvaW5nSXRlbXMpOworICAgICAgICBtTGF0ZXN0VGl0bGUgPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubGF0ZXN0VGl0bGUpOworICAgICAgICBtTGF0ZXN0SXRlbXMgPSAoTGluZWFyTGF5b3V0KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLmxhdGVzdEl0ZW1zKTsKKyAgICAgICAgbU5vTm90aWZpY2F0aW9uc1RpdGxlID0gKFRleHRWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm5vTm90aWZpY2F0aW9uc1RpdGxlKTsKKyAgICAgICAgbUNsZWFyQnV0dG9uID0gKFRleHRWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLmNsZWFyX2FsbF9idXR0b24pOworICAgICAgICBtQ2xlYXJCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1DbGVhckJ1dHRvbkxpc3RlbmVyKTsKKyAgICAgICAgbVNjcm9sbFZpZXcgPSAoU2Nyb2xsVmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5zY3JvbGwpOworICAgICAgICBtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0ID0gZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uTGluZWFyTGF5b3V0KTsKKworICAgICAgICBtT25nb2luZ1RpdGxlLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgbUxhdGVzdFRpdGxlLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKworICAgICAgICBtVGlja2VyID0gbmV3IE15VGlja2VyKGNvbnRleHQsIHNiKTsKKworICAgICAgICBUaWNrZXJWaWV3IHRpY2tlclZpZXcgPSAoVGlja2VyVmlldylzYi5maW5kVmlld0J5SWQoUi5pZC50aWNrZXJUZXh0KTsKKyAgICAgICAgdGlja2VyVmlldy5tVGlja2VyID0gbVRpY2tlcjsKKworICAgICAgICBtVHJhY2tpbmdWaWV3ID0gKFRyYWNraW5nVmlldylWaWV3LmluZmxhdGUoY29udGV4dCwgUi5sYXlvdXQuc3RhdHVzX2Jhcl90cmFja2luZywgbnVsbCk7CisgICAgICAgIG1UcmFja2luZ1ZpZXcubVNlcnZpY2UgPSB0aGlzOworICAgICAgICBtQ2xvc2VWaWV3ID0gKENsb3NlRHJhZ0hhbmRsZSltVHJhY2tpbmdWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmNsb3NlKTsKKyAgICAgICAgbUNsb3NlVmlldy5tU2VydmljZSA9IHRoaXM7CisKKyAgICAgICAgbUVkZ2VCb3JkZXIgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4uc3RhdHVzX2Jhcl9lZGdlX2lnbm9yZSk7CisKKyAgICAgICAgLy8gdGhlIG1vcmUgbm90aWZpY2F0aW9ucyBpY29uCisgICAgICAgIFN0YXR1c0Jhckljb25WaWV3IG1vcmVWaWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsICJtb3JlIik7CisgICAgICAgIG1vcmVWaWV3LnNldChuZXcgU3RhdHVzQmFySWNvbihudWxsLCBSLmRyYXdhYmxlLnN0YXRfbm90aWZ5X21vcmUsIDApKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLmFkZE1vcmVWaWV3KG1vcmVWaWV3LAorICAgICAgICAgICAgICAgIG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKG1JY29uU2l6ZSwgbUljb25TaXplKSk7CisKKyAgICAgICAgLy8gc2V0IHRoZSBpbml0YWwgdmlldyB2aXNpYmlsaXR5CisgICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOworICAgICAgICBtRGF0ZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisKKyAgICAgICAgLy8gcmVjZWl2ZSBicm9hZGNhc3RzCisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9DT05GSUdVUkFUSU9OX0NIQU5HRUQpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1MpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fU0NSRUVOX09GRik7CisgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtQnJvYWRjYXN0UmVjZWl2ZXIsIGZpbHRlcik7CisKKyAgICAgICAgcmV0dXJuIHNiOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgZ2V0U3RhdHVzQmFyR3Jhdml0eSgpIHsKKyAgICAgICAgcmV0dXJuIEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEludHJ1ZGVyVmlldygpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0PSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3RhdHVzX2Jhcl9oZWlnaHQpOworCisgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1RBVFVTX0JBUl9QQU5FTCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4KKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9OT19MSU1JVFMKKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSF9NT0RBTAorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRQorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTSwKKyAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVCk7CisgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LlRPUCB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOworICAgICAgICBscC55ICs9IGhlaWdodCAqIDEuNTsgLy8gRklYTUUKKyAgICAgICAgbHAuc2V0VGl0bGUoIkludHJ1ZGVyQWxlcnQiKTsKKyAgICAgICAgbHAud2luZG93QW5pbWF0aW9ucyA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuQW5pbWF0aW9uX1N0YXR1c0Jhcl9JbnRydWRlckFsZXJ0OworCisgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5hZGRWaWV3KG1JbnRydWRlckFsZXJ0VmlldywgbHApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwgU3RhdHVzQmFySWNvbiBpY29uKSB7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiYWRkSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXggKyAiIHZpZXdJbmRleD0iICsgdmlld0luZGV4CisgICAgICAgICAgICAgICAgKyAiIGljb249IiArIGljb24pOworICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsIHNsb3QpOworICAgICAgICB2aWV3LnNldChpY29uKTsKKyAgICAgICAgbVN0YXR1c0ljb25zLmFkZFZpZXcodmlldywgdmlld0luZGV4LCBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyhtSWNvblNpemUsIG1JY29uU2l6ZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwKKyAgICAgICAgICAgIFN0YXR1c0Jhckljb24gb2xkLCBTdGF0dXNCYXJJY29uIGljb24pIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJ1cGRhdGVJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleCArICIgdmlld0luZGV4PSIgKyB2aWV3SW5kZXgKKyAgICAgICAgICAgICAgICArICIgb2xkPSIgKyBvbGQgKyAiIGljb249IiArIGljb24pOworICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gKFN0YXR1c0Jhckljb25WaWV3KW1TdGF0dXNJY29ucy5nZXRDaGlsZEF0KHZpZXdJbmRleCk7CisgICAgICAgIHZpZXcuc2V0KGljb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCkgeworICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInJlbW92ZUljb24gc2xvdD0iICsgc2xvdCArICIgaW5kZXg9IiArIGluZGV4ICsgIiB2aWV3SW5kZXg9IiArIHZpZXdJbmRleCk7CisgICAgICAgIG1TdGF0dXNJY29ucy5yZW1vdmVWaWV3QXQodmlld0luZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGROb3RpZmljYXRpb24oSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKyAgICAgICAgU3RhdHVzQmFySWNvblZpZXcgaWNvblZpZXcgPSBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7CisgICAgICAgIGlmIChpY29uVmlldyA9PSBudWxsKSByZXR1cm47CisKKyAgICAgICAgYm9vbGVhbiBpbW1lcnNpdmUgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGltbWVyc2l2ZSA9IEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkuaXNUb3BBY3Rpdml0eUltbWVyc2l2ZSgpOworICAgICAgICAgICAgU2xvZy5kKFRBRywgIlRvcCBhY3Rpdml0eSBpcyAiICsgKGltbWVyc2l2ZT8iaW1tZXJzaXZlIjoibm90IGltbWVyc2l2ZSIpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGltbWVyc2l2ZSkgeworICAgICAgICAgICAgaWYgKChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZsYWdzICYgTm90aWZpY2F0aW9uLkZMQUdfSElHSF9QUklPUklUWSkgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJQcmVzZW50aW5nIGhpZ2gtcHJpb3JpdHkgbm90aWZpY2F0aW9uIGluIGltbWVyc2l2ZSBhY3Rpdml0eSIpOworICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgbmV3IHRyYW5zaWVudCB0aWNrZXIgbW9kZQorICAgICAgICAgICAgICAgIC8vIDEuIFBvcHVsYXRlIG1JbnRydWRlckFsZXJ0VmlldworCisgICAgICAgICAgICAgICAgSW1hZ2VWaWV3IGFsZXJ0SWNvbiA9IChJbWFnZVZpZXcpIG1JbnRydWRlckFsZXJ0Vmlldy5maW5kVmlld0J5SWQoUi5pZC5hbGVydEljb24pOworICAgICAgICAgICAgICAgIFRleHRWaWV3IGFsZXJ0VGV4dCA9IChUZXh0VmlldykgbUludHJ1ZGVyQWxlcnRWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmFsZXJ0VGV4dCk7CisgICAgICAgICAgICAgICAgYWxlcnRJY29uLnNldEltYWdlRHJhd2FibGUoU3RhdHVzQmFySWNvblZpZXcuZ2V0SWNvbigKKyAgICAgICAgICAgICAgICAgICAgYWxlcnRJY29uLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgaWNvblZpZXcuZ2V0U3RhdHVzQmFySWNvbigpKSk7CisgICAgICAgICAgICAgICAgYWxlcnRUZXh0LnNldFRleHQobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi50aWNrZXJUZXh0KTsKKworICAgICAgICAgICAgICAgIFZpZXcgYnV0dG9uID0gbUludHJ1ZGVyQWxlcnRWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmludHJ1ZGVyX2FsZXJ0X2NvbnRlbnQpOworICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgIG5ldyBMYXVuY2hlcihub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ucGtnLCBub3RpZmljYXRpb24udGFnLCBub3RpZmljYXRpb24uaWQpKTsKKworICAgICAgICAgICAgICAgIC8vIDIuIEFuaW1hdGUgbUludHJ1ZGVyQWxlcnRWaWV3IGluCisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfU0hPV19JTlRSVURFUik7CisKKyAgICAgICAgICAgICAgICAvLyAzLiBTZXQgYWxhcm0gdG8gYWdlIHRoZSBub3RpZmljYXRpb24gb2ZmIChUT0RPKQorICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19ISURFX0lOVFJVREVSKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChNU0dfSElERV9JTlRSVURFUiwgSU5UUlVERVJfQUxFUlRfREVDQVlfTVMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZnVsbFNjcmVlbkludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBub3QgaW1tZXJzaXZlICYgYSBmdWxsLXNjcmVlbiBhbGVydCBzaG91bGQgYmUgc2hvd24KKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJOb3RpZmljYXRpb24gaGFzIGZ1bGxTY3JlZW5JbnRlbnQgYW5kIGFjdGl2aXR5IGlzIG5vdCBpbW1lcnNpdmU7IgorICAgICAgICAgICAgICAgICAgICArICIgc2VuZGluZyBmdWxsU2NyZWVuSW50ZW50Iik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZnVsbFNjcmVlbkludGVudC5zZW5kKCk7CisgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHVzdWFsIGNhc2U6IHN0YXR1cyBiYXIgdmlzaWJsZSAmIG5vdCBpbW1lcnNpdmUKKworICAgICAgICAgICAgLy8gc2hvdyB0aGUgdGlja2VyCisgICAgICAgICAgICB0aWNrKG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHNsaWRpbmcgd2luZG93cyBhbmQgdGhlIHRpdGxlcy4KKyAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7CisgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9MRUFWRV9BTE9ORSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlTm90aWZpY2F0aW9uKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgICAgIFNsb2cuZChUQUcsICJ1cGRhdGVOb3RpZmljYXRpb24ga2V5PSIgKyBrZXkgKyAiIG5vdGlmaWNhdGlvbj0iICsgbm90aWZpY2F0aW9uKTsKKworICAgICAgICBOb3RpZmljYXRpb25EYXRhIG9sZExpc3Q7CisgICAgICAgIE5vdGlmaWNhdGlvbkRhdGEuRW50cnkgb2xkRW50cnkgPSBtT25nb2luZy5maW5kQnlLZXkoa2V5KTsKKyAgICAgICAgaWYgKG9sZEVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG9sZExpc3QgPSBtT25nb2luZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9sZEVudHJ5ID0gbUxhdGVzdC5maW5kQnlLZXkoa2V5KTsKKyAgICAgICAgICAgIGlmIChvbGRFbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInVwZGF0ZU5vdGlmaWNhdGlvbiBmb3IgdW5rbm93biBrZXk6ICIgKyBrZXkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9sZExpc3QgPSBtTGF0ZXN0OworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBvbGROb3RpZmljYXRpb24gPSBvbGRFbnRyeS5ub3RpZmljYXRpb247CisgICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzIG9sZENvbnRlbnRWaWV3ID0gb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50VmlldzsKKworICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBjb250ZW50VmlldyA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudFZpZXc7CisKKyAgICAgICAgaWYgKGZhbHNlKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAib2xkIG5vdGlmaWNhdGlvbjogd2hlbj0iICsgb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCisgICAgICAgICAgICAgICAgICAgICsgIiBvbmdvaW5nPSIgKyBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGV4cGFuZGVkPSIgKyBvbGRFbnRyeS5leHBhbmRlZAorICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIG9sZENvbnRlbnRWaWV3KTsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJuZXcgbm90aWZpY2F0aW9uOiB3aGVuPSIgKyBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KKyAgICAgICAgICAgICAgICAgICAgKyAiIG9uZ29pbmc9IiArIG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQorICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIGNvbnRlbnRWaWV3KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhbiB3ZSBqdXN0IHJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzIGluIHBsYWNlPyAgSWYgd2hlbiBkaWRuJ3QgY2hhbmdlLCB0aGUgb3JkZXIKKyAgICAgICAgLy8gZGlkbid0IGNoYW5nZS4KKyAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbiA9PSBvbGROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KKyAgICAgICAgICAgICAgICAmJiBub3RpZmljYXRpb24uaXNPbmdvaW5nKCkgPT0gb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCisgICAgICAgICAgICAgICAgJiYgb2xkRW50cnkuZXhwYW5kZWQgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRWaWV3ICE9IG51bGwgJiYgb2xkQ29udGVudFZpZXcgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0UGFja2FnZSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRQYWNrYWdlKCkuZXF1YWxzKGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSkKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRMYXlvdXRJZCgpID09IGNvbnRlbnRWaWV3LmdldExheW91dElkKCkpIHsKKyAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicmV1c2luZyBub3RpZmljYXRpb24iKTsKKyAgICAgICAgICAgIG9sZEVudHJ5Lm5vdGlmaWNhdGlvbiA9IG5vdGlmaWNhdGlvbjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gUmVhcHBseSB0aGUgUmVtb3RlVmlld3MKKyAgICAgICAgICAgICAgICBjb250ZW50Vmlldy5yZWFwcGx5KHRoaXMsIG9sZEVudHJ5LmNvbnRlbnQpOworICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY29udGVudEludGVudAorICAgICAgICAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgY29udGVudEludGVudCA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudEludGVudDsKKyAgICAgICAgICAgICAgICBpZiAoY29udGVudEludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG9sZEVudHJ5LmNvbnRlbnQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBMYXVuY2hlcihjb250ZW50SW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ucGtnLCBub3RpZmljYXRpb24udGFnLCBub3RpZmljYXRpb24uaWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBpY29uLgorICAgICAgICAgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb24gaWMgPSBuZXcgU3RhdHVzQmFySWNvbihub3RpZmljYXRpb24ucGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb25MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ubnVtYmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9sZEVudHJ5Lmljb24uc2V0KGljKSkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IHVwZGF0ZSBpY29uOiAiICsgaWMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIEl0IGZhaWxlZCB0byBhZGQgY2xlYW5seS4gIExvZywgYW5kIHJlbW92ZSB0aGUgdmlldyBmcm9tIHRoZSBwYW5lbC4KKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQ291bGRuJ3QgcmVhcHBseSB2aWV3cyBmb3IgcGFja2FnZSAiICsgY29udGVudFZpZXcuZ2V0UGFja2FnZSgpLCBlKTsKKyAgICAgICAgICAgICAgICByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOworICAgICAgICAgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAibm90IHJldXNpbmcgbm90aWZpY2F0aW9uIik7CisgICAgICAgICAgICByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOworICAgICAgICAgICAgYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5LCBub3RpZmljYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzdGFydCB0aGUgdGlja2VyIGlmIGl0J3Mgc3RpbGwgcnVubmluZworICAgICAgICB0aWNrKG5vdGlmaWNhdGlvbik7CisKKyAgICAgICAgLy8gUmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBzbGlkaW5nIHdpbmRvd3MgYW5kIHRoZSB0aXRsZXMuCisgICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOworICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbihJQmluZGVyIGtleSkgeworICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInJlbW92ZU5vdGlmaWNhdGlvbiBrZXk9IiArIGtleSk7CisgICAgICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBvbGQgPSByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOworCisgICAgICAgIGlmIChvbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gQ2FuY2VsIHRoZSB0aWNrZXIgaWYgaXQncyBzdGlsbCBydW5uaW5nCisgICAgICAgICAgICBtVGlja2VyLnJlbW92ZUVudHJ5KG9sZCk7CisKKyAgICAgICAgICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2xpZGluZyB3aW5kb3dzIGFuZCB0aGUgdGl0bGVzLgorICAgICAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7CisgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgY2hvb3NlSWNvbkluZGV4KGJvb2xlYW4gaXNPbmdvaW5nLCBpbnQgdmlld0luZGV4KSB7CisgICAgICAgIGZpbmFsIGludCBsYXRlc3RTaXplID0gbUxhdGVzdC5zaXplKCk7CisgICAgICAgIGlmIChpc09uZ29pbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBsYXRlc3RTaXplICsgKG1PbmdvaW5nLnNpemUoKSAtIHZpZXdJbmRleCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbGF0ZXN0U2l6ZSAtIHZpZXdJbmRleDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFZpZXdbXSBtYWtlTm90aWZpY2F0aW9uVmlldyhTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbjsKKyAgICAgICAgUmVtb3RlVmlld3MgcmVtb3RlVmlld3MgPSBuLmNvbnRlbnRWaWV3OworICAgICAgICBpZiAocmVtb3RlVmlld3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgdGhlIHJvdyB2aWV3CisgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gKExheW91dEluZmxhdGVyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7CisgICAgICAgIFZpZXcgcm93ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5zdGF0dXNfYmFyX2xhdGVzdF9ldmVudCwgcGFyZW50LCBmYWxzZSk7CisKKyAgICAgICAgLy8gYmluZCB0aGUgY2xpY2sgZXZlbnQgdG8gdGhlIGNvbnRlbnQgYXJlYQorICAgICAgICBWaWV3R3JvdXAgY29udGVudCA9IChWaWV3R3JvdXApcm93LmZpbmRWaWV3QnlJZChSLmlkLmNvbnRlbnQpOworICAgICAgICBjb250ZW50LnNldERlc2NlbmRhbnRGb2N1c2FiaWxpdHkoVmlld0dyb3VwLkZPQ1VTX0JMT0NLX0RFU0NFTkRBTlRTKTsKKyAgICAgICAgY29udGVudC5zZXRPbkZvY3VzQ2hhbmdlTGlzdGVuZXIobUZvY3VzQ2hhbmdlTGlzdGVuZXIpOworICAgICAgICBQZW5kaW5nSW50ZW50IGNvbnRlbnRJbnRlbnQgPSBuLmNvbnRlbnRJbnRlbnQ7CisgICAgICAgIGlmIChjb250ZW50SW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRlbnQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBMYXVuY2hlcihjb250ZW50SW50ZW50LCBub3RpZmljYXRpb24ucGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnRhZywgbm90aWZpY2F0aW9uLmlkKSk7CisgICAgICAgIH0KKworICAgICAgICBWaWV3IGV4cGFuZGVkID0gbnVsbDsKKyAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleHBhbmRlZCA9IHJlbW90ZVZpZXdzLmFwcGx5KHRoaXMsIGNvbnRlbnQpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4cGFuZGVkID09IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBpZGVudCA9IG5vdGlmaWNhdGlvbi5wa2cgKyAiLzB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobm90aWZpY2F0aW9uLmlkKTsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJjb3VsZG4ndCBpbmZsYXRlIHZpZXcgZm9yIG5vdGlmaWNhdGlvbiAiICsgaWRlbnQsIGV4Y2VwdGlvbik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnRlbnQuYWRkVmlldyhleHBhbmRlZCk7CisgICAgICAgICAgICByb3cuc2V0RHJhd2luZ0NhY2hlRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgVmlld1tdIHsgcm93LCBjb250ZW50LCBleHBhbmRlZCB9OworICAgIH0KKworICAgIFN0YXR1c0Jhckljb25WaWV3IGFkZE5vdGlmaWNhdGlvblZpZXdzKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgICAgIE5vdGlmaWNhdGlvbkRhdGEgbGlzdDsKKyAgICAgICAgVmlld0dyb3VwIHBhcmVudDsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc09uZ29pbmcgPSBub3RpZmljYXRpb24uaXNPbmdvaW5nKCk7CisgICAgICAgIGlmIChpc09uZ29pbmcpIHsKKyAgICAgICAgICAgIGxpc3QgPSBtT25nb2luZzsKKyAgICAgICAgICAgIHBhcmVudCA9IG1PbmdvaW5nSXRlbXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsaXN0ID0gbUxhdGVzdDsKKyAgICAgICAgICAgIHBhcmVudCA9IG1MYXRlc3RJdGVtczsKKyAgICAgICAgfQorICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGV4cGFuZGVkIHZpZXcuCisgICAgICAgIGZpbmFsIFZpZXdbXSB2aWV3cyA9IG1ha2VOb3RpZmljYXRpb25WaWV3KG5vdGlmaWNhdGlvbiwgcGFyZW50KTsKKyAgICAgICAgaWYgKHZpZXdzID09IG51bGwpIHsKKyAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKGtleSwgbm90aWZpY2F0aW9uLCAiQ291bGRuJ3QgZXhwYW5kIFJlbW90ZVZpZXdzIGZvcjogIgorICAgICAgICAgICAgICAgICAgICArIG5vdGlmaWNhdGlvbik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBWaWV3IHJvdyA9IHZpZXdzWzBdOworICAgICAgICBmaW5hbCBWaWV3IGNvbnRlbnQgPSB2aWV3c1sxXTsKKyAgICAgICAgZmluYWwgVmlldyBleHBhbmRlZCA9IHZpZXdzWzJdOworICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGljb24uCisgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb25WaWV3IGljb25WaWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsCisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnBrZyArICIvMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhub3RpZmljYXRpb24uaWQpKTsKKyAgICAgICAgZmluYWwgU3RhdHVzQmFySWNvbiBpYyA9IG5ldyBTdGF0dXNCYXJJY29uKG5vdGlmaWNhdGlvbi5wa2csIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbiwKKyAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uTGV2ZWwsIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ubnVtYmVyKTsKKyAgICAgICAgaWYgKCFpY29uVmlldy5zZXQoaWMpKSB7CisgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkaW5nIGNyZWF0ZSBpY29uOiAiICsgaWMpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gQWRkIHRoZSBleHBhbmRlZCB2aWV3LgorICAgICAgICBmaW5hbCBpbnQgdmlld0luZGV4ID0gbGlzdC5hZGQoa2V5LCBub3RpZmljYXRpb24sIHJvdywgY29udGVudCwgZXhwYW5kZWQsIGljb25WaWV3KTsKKyAgICAgICAgcGFyZW50LmFkZFZpZXcocm93LCB2aWV3SW5kZXgpOworICAgICAgICAvLyBBZGQgdGhlIGljb24uCisgICAgICAgIGZpbmFsIGludCBpY29uSW5kZXggPSBjaG9vc2VJY29uSW5kZXgoaXNPbmdvaW5nLCB2aWV3SW5kZXgpOworICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuYWRkVmlldyhpY29uVmlldywgaWNvbkluZGV4LAorICAgICAgICAgICAgICAgIG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKG1JY29uU2l6ZSwgbUljb25TaXplKSk7CisgICAgICAgIHJldHVybiBpY29uVmlldzsKKyAgICB9CisKKyAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gcmVtb3ZlTm90aWZpY2F0aW9uVmlld3MoSUJpbmRlciBrZXkpIHsKKyAgICAgICAgTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBlbnRyeSA9IG1PbmdvaW5nLnJlbW92ZShrZXkpOworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgZW50cnkgPSBtTGF0ZXN0LnJlbW92ZShrZXkpOworICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVtb3ZlTm90aWZpY2F0aW9uIGZvciB1bmtub3duIGtleTogIiArIGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBleHBhbmRlZCB2aWV3LgorICAgICAgICAoKFZpZXdHcm91cCllbnRyeS5yb3cuZ2V0UGFyZW50KCkpLnJlbW92ZVZpZXcoZW50cnkucm93KTsKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBpY29uLgorICAgICAgICAoKFZpZXdHcm91cCllbnRyeS5pY29uLmdldFBhcmVudCgpKS5yZW1vdmVWaWV3KGVudHJ5Lmljb24pOworCisgICAgICAgIHJldHVybiBlbnRyeS5ub3RpZmljYXRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpIHsKKyAgICAgICAgYm9vbGVhbiBvbmdvaW5nID0gbU9uZ29pbmcuaGFzVmlzaWJsZUl0ZW1zKCk7CisgICAgICAgIGJvb2xlYW4gbGF0ZXN0ID0gbUxhdGVzdC5oYXNWaXNpYmxlSXRlbXMoKTsKKworICAgICAgICAvLyAobm8gb25nb2luZyBub3RpZmljYXRpb25zIGFyZSBjbGVhcmFibGUpCisgICAgICAgIGlmIChtTGF0ZXN0Lmhhc0NsZWFyYWJsZUl0ZW1zKCkpIHsKKyAgICAgICAgICAgIG1DbGVhckJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ2xlYXJCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgIH0KKworICAgICAgICBtT25nb2luZ1RpdGxlLnNldFZpc2liaWxpdHkob25nb2luZyA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgICAgIG1MYXRlc3RUaXRsZS5zZXRWaXNpYmlsaXR5KGxhdGVzdCA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisKKyAgICAgICAgaWYgKG9uZ29pbmcgfHwgbGF0ZXN0KSB7CisgICAgICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU5vTm90aWZpY2F0aW9uc1RpdGxlLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RhdGUgaXMgb25lIG9yIG1vcmUgb2YgdGhlIERJU0FCTEUgY29uc3RhbnRzIGZyb20gU3RhdHVzQmFyTWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNhYmxlKGludCBzdGF0ZSkgeworICAgICAgICBmaW5hbCBpbnQgb2xkID0gbURpc2FibGVkOworICAgICAgICBmaW5hbCBpbnQgZGlmZiA9IHN0YXRlIF4gb2xkOworICAgICAgICBtRGlzYWJsZWQgPSBzdGF0ZTsKKworICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX0VYUEFORDogeWVzIik7CisgICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgeworICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IHllcyIpOworICAgICAgICAgICAgICAgIGlmIChtVGlja2luZykgeworICAgICAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogbm8iKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAobVRpY2tpbmcgJiYgKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSOiB5ZXMiKTsKKyAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbCBjaGFuZ2VzIHRvIHRoZSBzdGF0dXMgYmFyIGFuZCBub3RpZmljYXRpb25zIGZ1bm5lbCB0aHJvdWdoIGhlcmUgYW5kIGFyZSBiYXRjaGVkLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgSCBleHRlbmRzIEhhbmRsZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbSkgeworICAgICAgICAgICAgc3dpdGNoIChtLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19BTklNQVRFOgorICAgICAgICAgICAgICAgICAgICBkb0FuaW1hdGlvbigpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19BTklNQVRFX1JFVkVBTDoKKyAgICAgICAgICAgICAgICAgICAgZG9SZXZlYWxBbmltYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfU0hPV19JTlRSVURFUjoKKyAgICAgICAgICAgICAgICAgICAgc2V0SW50cnVkZXJBbGVydFZpc2liaWxpdHkodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0hJREVfSU5UUlVERVI6CisgICAgICAgICAgICAgICAgICAgIHNldEludHJ1ZGVyQWxlcnRWaXNpYmlsaXR5KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWaWV3Lk9uRm9jdXNDaGFuZ2VMaXN0ZW5lciBtRm9jdXNDaGFuZ2VMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uRm9jdXNDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25Gb2N1c0NoYW5nZShWaWV3IHYsIGJvb2xlYW4gaGFzRm9jdXMpIHsKKyAgICAgICAgICAgIC8vIEJlY2F1c2UgJ3YnIGlzIGEgVmlld0dyb3VwLCBhbGwgaXRzIGNoaWxkcmVuIHdpbGwgYmUgKHVuKXNlbGVjdGVkCisgICAgICAgICAgICAvLyB0b28sIHdoaWNoIGFsbG93cyBtYXJxdWVlaW5nIHRvIHdvcmsuCisgICAgICAgICAgICB2LnNldFNlbGVjdGVkKGhhc0ZvY3VzKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIHZvaWQgbWFrZUV4cGFuZGVkVmlzaWJsZSgpIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJNYWtlIGV4cGFuZGVkIHZpc2libGU6IGV4cGFuZGVkIHZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUpOworICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1FeHBhbmRlZFZpc2libGUgPSB0cnVlOworICAgICAgICB2aXNpYmlsaXR5Q2hhbmdlZCh0cnVlKTsKKworICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOworICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgJj0gfldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRTsKKyAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzIHw9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTTsKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKKyAgICAgICAgbUV4cGFuZGVkVmlldy5yZXF1ZXN0Rm9jdXMoVmlldy5GT0NVU19GT1JXQVJEKTsKKyAgICAgICAgbVRyYWNraW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisKKyAgICAgICAgaWYgKCFtVGlja2luZykgeworICAgICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFuaW1hdGVFeHBhbmQoKSB7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiQW5pbWF0ZSBleHBhbmQ6IGV4cGFuZGVkPSIgKyBtRXhwYW5kZWQpOworICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1FeHBhbmRlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcHJlcGFyZVRyYWNraW5nKDAsIHRydWUpOworICAgICAgICBwZXJmb3JtRmxpbmcoMCwgMjAwMC4wZiwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYW5pbWF0ZUNvbGxhcHNlKCkgeworICAgICAgICBpZiAoU1BFVykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgImFuaW1hdGVDb2xsYXBzZSgpOiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAorICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkVmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZQorICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltYXRpbmc9IiArIG1BbmltYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltWT0iICsgbUFuaW1ZCisgICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbVZlbD0iICsgbUFuaW1WZWwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgeTsKKyAgICAgICAgaWYgKG1BbmltYXRpbmcpIHsKKyAgICAgICAgICAgIHkgPSAoaW50KW1BbmltWTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHkgPSBtRGlzcGxheS5nZXRIZWlnaHQoKS0xOworICAgICAgICB9CisgICAgICAgIC8vIExldCB0aGUgZmxpbmcgdGhpbmsgdGhhdCB3ZSdyZSBvcGVuIHNvIGl0IGdvZXMgaW4gdGhlIHJpZ2h0IGRpcmVjdGlvbgorICAgICAgICAvLyBhbmQgZG9lc24ndCB0cnkgdG8gcmUtb3BlbiB0aGUgd2luZG93c2hhZGUuCisgICAgICAgIG1FeHBhbmRlZCA9IHRydWU7CisgICAgICAgIHByZXBhcmVUcmFja2luZyh5LCBmYWxzZSk7CisgICAgICAgIHBlcmZvcm1GbGluZyh5LCAtMjAwMC4wZiwgdHJ1ZSk7CisgICAgfQorCisgICAgdm9pZCBwZXJmb3JtRXhwYW5kKCkgeworICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInBlcmZvcm1FeHBhbmQ6IG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkKTsKKyAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisgICAgICAgIGlmIChtRXhwYW5kZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1FeHBhbmRlZCA9IHRydWU7CisgICAgICAgIG1ha2VFeHBhbmRlZFZpc2libGUoKTsKKyAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0ZVTExfT1BFTik7CisKKyAgICAgICAgaWYgKGZhbHNlKSBwb3N0U3RhcnRUcmFjaW5nKCk7CisgICAgfQorCisgICAgdm9pZCBwZXJmb3JtQ29sbGFwc2UoKSB7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicGVyZm9ybUNvbGxhcHNlOiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAorICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWRWaXNpYmxlPSIgKyBtRXhwYW5kZWRWaXNpYmxlKTsKKworICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtRXhwYW5kZWRWaXNpYmxlID0gZmFsc2U7CisgICAgICAgIHZpc2liaWxpdHlDaGFuZ2VkKGZhbHNlKTsKKyAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzIHw9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRTsKKyAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzICY9IH5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU07CisgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7CisgICAgICAgIG1UcmFja2luZ1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworCisgICAgICAgIGlmICgobURpc2FibGVkICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgPT0gMCkgeworICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOworICAgICAgICB9CisgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0KTsKKworICAgICAgICBpZiAoIW1FeHBhbmRlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1FeHBhbmRlZCA9IGZhbHNlOworICAgIH0KKworICAgIHZvaWQgZG9BbmltYXRpb24oKSB7CisgICAgICAgIGlmIChtQW5pbWF0aW5nKSB7CisgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgImRvQW5pbWF0aW9uIik7CisgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgImRvQW5pbWF0aW9uIGJlZm9yZSBtQW5pbVk9IiArIG1BbmltWSk7CisgICAgICAgICAgICBpbmNyZW1lbnRBbmltKCk7CisgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgImRvQW5pbWF0aW9uIGFmdGVyICBtQW5pbVk9IiArIG1BbmltWSk7CisgICAgICAgICAgICBpZiAobUFuaW1ZID49IG1EaXNwbGF5LmdldEhlaWdodCgpLTEpIHsKKyAgICAgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIkFuaW1hdGlvbiBjb21wbGV0ZWQgdG8gZXhwYW5kZWQgc3RhdGUuIik7CisgICAgICAgICAgICAgICAgbUFuaW1hdGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9GVUxMX09QRU4pOworICAgICAgICAgICAgICAgIHBlcmZvcm1FeHBhbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG1BbmltWSA8IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJBbmltYXRpb24gY29tcGxldGVkIHRvIGNvbGxhcHNlZCBzdGF0ZS4iKTsKKyAgICAgICAgICAgICAgICBtQW5pbWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKDApOworICAgICAgICAgICAgICAgIHBlcmZvcm1Db2xsYXBzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKKyAgICAgICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSArPSBBTklNX0ZSQU1FX0RVUkFUSU9OOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEUpLCBtQ3VyQW5pbWF0aW9uVGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHN0b3BUcmFja2luZygpIHsKKyAgICAgICAgbVRyYWNraW5nID0gZmFsc2U7CisgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOworICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKKyAgICB9CisKKyAgICB2b2lkIGluY3JlbWVudEFuaW0oKSB7CisgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIGZsb2F0IHQgPSAoKGZsb2F0KShub3cgLSBtQW5pbUxhc3RUaW1lKSkgLyAxMDAwOyAgICAgICAgICAgIC8vIG1zIC0+IHMKKyAgICAgICAgZmluYWwgZmxvYXQgeSA9IG1BbmltWTsKKyAgICAgICAgZmluYWwgZmxvYXQgdiA9IG1BbmltVmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHgvcworICAgICAgICBmaW5hbCBmbG9hdCBhID0gbUFuaW1BY2NlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweC9zL3MKKyAgICAgICAgbUFuaW1ZID0geSArICh2KnQpICsgKDAuNWYqYSp0KnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHgKKyAgICAgICAgbUFuaW1WZWwgPSB2ICsgKGEqdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHgvcworICAgICAgICBtQW5pbUxhc3RUaW1lID0gbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtcworICAgICAgICAvL1Nsb2cuZChUQUcsICJ5PSIgKyB5ICsgIiB2PSIgKyB2ICsgIiBhPSIgKyBhICsgIiB0PSIgKyB0ICsgIiBtQW5pbVk9IiArIG1BbmltWQorICAgICAgICAvLyAgICAgICAgKyAiIG1BbmltQWNjZWw9IiArIG1BbmltQWNjZWwpOworICAgIH0KKworICAgIHZvaWQgZG9SZXZlYWxBbmltYXRpb24oKSB7CisgICAgICAgIGZpbmFsIGludCBoID0gbUNsb3NlVmlldy5nZXRIZWlnaHQoKSArIG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOworICAgICAgICBpZiAobUFuaW1hdGluZ1JldmVhbCAmJiBtQW5pbWF0aW5nICYmIG1BbmltWSA8IGgpIHsKKyAgICAgICAgICAgIGluY3JlbWVudEFuaW0oKTsKKyAgICAgICAgICAgIGlmIChtQW5pbVkgPj0gaCkgeworICAgICAgICAgICAgICAgIG1BbmltWSA9IGg7CisgICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKKyAgICAgICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSArPSBBTklNX0ZSQU1FX0RVUkFUSU9OOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEVfUkVWRUFMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcHJlcGFyZVRyYWNraW5nKGludCB5LCBib29sZWFuIG9wZW5pbmcpIHsKKyAgICAgICAgbVRyYWNraW5nID0gdHJ1ZTsKKyAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IFZlbG9jaXR5VHJhY2tlci5vYnRhaW4oKTsKKyAgICAgICAgaWYgKG9wZW5pbmcpIHsKKyAgICAgICAgICAgIG1BbmltQWNjZWwgPSAyMDAwLjBmOworICAgICAgICAgICAgbUFuaW1WZWwgPSAyMDA7CisgICAgICAgICAgICBtQW5pbVkgPSBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcygoaW50KW1BbmltWSk7CisgICAgICAgICAgICBtQW5pbWF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIG1BbmltYXRpbmdSZXZlYWwgPSB0cnVlOworICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEUpOworICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEVfUkVWRUFMKTsKKyAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgICAgICBtQW5pbUxhc3RUaW1lID0gbm93OworICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUgPSBub3cgKyBBTklNX0ZSQU1FX0RVUkFUSU9OOworICAgICAgICAgICAgbUFuaW1hdGluZyA9IHRydWU7CisgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BTklNQVRFX1JFVkVBTCksCisgICAgICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lKTsKKyAgICAgICAgICAgIG1ha2VFeHBhbmRlZFZpc2libGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGl0J3Mgb3BlbiwgY2xvc2UgaXQ/CisgICAgICAgICAgICBpZiAobUFuaW1hdGluZykgeworICAgICAgICAgICAgICAgIG1BbmltYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoeSArIG1WaWV3RGVsdGEpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBwZXJmb3JtRmxpbmcoaW50IHksIGZsb2F0IHZlbCwgYm9vbGVhbiBhbHdheXMpIHsKKyAgICAgICAgbUFuaW1hdGluZ1JldmVhbCA9IGZhbHNlOworICAgICAgICBtRGlzcGxheUhlaWdodCA9IG1EaXNwbGF5LmdldEhlaWdodCgpOworCisgICAgICAgIG1BbmltWSA9IHk7CisgICAgICAgIG1BbmltVmVsID0gdmVsOworCisgICAgICAgIC8vU2xvZy5kKFRBRywgInN0YXJ0aW5nIHdpdGggbUFuaW1ZPSIgKyBtQW5pbVkgKyAiIG1BbmltVmVsPSIgKyBtQW5pbVZlbCk7CisKKyAgICAgICAgaWYgKG1FeHBhbmRlZCkgeworICAgICAgICAgICAgaWYgKCFhbHdheXMgJiYgKAorICAgICAgICAgICAgICAgICAgICB2ZWwgPiAyMDAuMGYKKyAgICAgICAgICAgICAgICAgICAgfHwgKHkgPiAobURpc3BsYXlIZWlnaHQtMjUpICYmIHZlbCA+IC0yMDAuMGYpKSkgeworICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBleHBhbmRlZCwgYnV0IHRoZXkgZGlkbid0IG1vdmUgc3VmZmljaWVudGx5IHRvIGNhdXNlCisgICAgICAgICAgICAgICAgLy8gdXMgdG8gcmV0cmFjdC4gIEFuaW1hdGUgYmFjayB0byB0aGUgZXhwYW5kZWQgcG9zaXRpb24uCisgICAgICAgICAgICAgICAgbUFuaW1BY2NlbCA9IDIwMDAuMGY7CisgICAgICAgICAgICAgICAgaWYgKHZlbCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBleHBhbmRlZCBhbmQgYXJlIG5vdyBnb2luZyB0byBhbmltYXRlIGF3YXkuCisgICAgICAgICAgICAgICAgbUFuaW1BY2NlbCA9IC0yMDAwLjBmOworICAgICAgICAgICAgICAgIGlmICh2ZWwgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1BbmltVmVsID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYWx3YXlzIHx8ICgKKyAgICAgICAgICAgICAgICAgICAgdmVsID4gMjAwLjBmCisgICAgICAgICAgICAgICAgICAgIHx8ICh5ID4gKG1EaXNwbGF5SGVpZ2h0LzIpICYmIHZlbCA+IC0yMDAuMGYpKSkgeworICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBjb2xsYXBzZWQsIGFuZCB0aGV5IG1vdmVkIGVub3VnaCB0byBhbGxvdyB1cyB0bworICAgICAgICAgICAgICAgIC8vIGV4cGFuZC4gIEFuaW1hdGUgaW4gdGhlIG5vdGlmaWNhdGlvbnMuCisgICAgICAgICAgICAgICAgbUFuaW1BY2NlbCA9IDIwMDAuMGY7CisgICAgICAgICAgICAgICAgaWYgKHZlbCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBjb2xsYXBzZWQsIGJ1dCB0aGV5IGRpZG4ndCBtb3ZlIHN1ZmZpY2llbnRseSB0byBjYXVzZQorICAgICAgICAgICAgICAgIC8vIHVzIHRvIHJldHJhY3QuICBBbmltYXRlIGJhY2sgdG8gdGhlIGNvbGxhcHNlZCBwb3NpdGlvbi4KKyAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gLTIwMDAuMGY7CisgICAgICAgICAgICAgICAgaWYgKHZlbCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL1Nsb2cuZChUQUcsICJtQW5pbVk9IiArIG1BbmltWSArICIgbUFuaW1WZWw9IiArIG1BbmltVmVsCisgICAgICAgIC8vICAgICAgICArICIgbUFuaW1BY2NlbD0iICsgbUFuaW1BY2NlbCk7CisKKyAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgbUFuaW1MYXN0VGltZSA9IG5vdzsKKyAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUgPSBub3cgKyBBTklNX0ZSQU1FX0RVUkFUSU9OOworICAgICAgICBtQW5pbWF0aW5nID0gdHJ1ZTsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEUpOworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURV9SRVZFQUwpOworICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BTklNQVRFKSwgbUN1ckFuaW1hdGlvblRpbWUpOworICAgICAgICBzdG9wVHJhY2tpbmcoKTsKKyAgICB9CisKKyAgICBib29sZWFuIGludGVyY2VwdFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKFNQRVcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJUb3VjaDogcmF3WT0iICsgZXZlbnQuZ2V0UmF3WSgpICsgIiBldmVudD0iICsgZXZlbnQgKyAiIG1EaXNhYmxlZD0iCisgICAgICAgICAgICAgICAgKyBtRGlzYWJsZWQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgc3RhdHVzQmFyU2l6ZSA9IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOworICAgICAgICBmaW5hbCBpbnQgaGl0U2l6ZSA9IHN0YXR1c0JhclNpemUqMjsKKyAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgeSA9IChpbnQpZXZlbnQuZ2V0UmF3WSgpOworCisgICAgICAgICAgICBpZiAoIW1FeHBhbmRlZCkgeworICAgICAgICAgICAgICAgIG1WaWV3RGVsdGEgPSBzdGF0dXNCYXJTaXplIC0geTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVRyYWNraW5nVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKG1BYnNQb3MpOworICAgICAgICAgICAgICAgIG1WaWV3RGVsdGEgPSBtQWJzUG9zWzFdICsgbVRyYWNraW5nVmlldy5nZXRIZWlnaHQoKSAtIHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKCFtRXhwYW5kZWQgJiYgeSA8IGhpdFNpemUpIHx8CisgICAgICAgICAgICAgICAgICAgIChtRXhwYW5kZWQgJiYgeSA+IChtRGlzcGxheS5nZXRIZWlnaHQoKS1oaXRTaXplKSkpIHsKKworICAgICAgICAgICAgICAgIC8vIFdlIGRyb3AgZXZlbnRzIGF0IHRoZSBlZGdlIG9mIHRoZSBzY3JlZW4gdG8gbWFrZSB0aGUgd2luZG93c2hhZGUgY29tZQorICAgICAgICAgICAgICAgIC8vIGRvd24gYnkgYWNjaWRlbnQgbGVzcywgZXNwZWNpYWxseSB3aGVuIHB1c2hpbmcgb3BlbiBhIGRldmljZSB3aXRoIGEga2V5Ym9hcmQKKyAgICAgICAgICAgICAgICAvLyB0aGF0IHJvdGF0ZXMgKGxpa2UgZzEgYW5kIGRyb2lkKQorICAgICAgICAgICAgICAgIGludCB4ID0gKGludClldmVudC5nZXRSYXdYKCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGVkZ2VCb3JkZXIgPSBtRWRnZUJvcmRlcjsKKyAgICAgICAgICAgICAgICBpZiAoeCA+PSBlZGdlQm9yZGVyICYmIHggPCBtRGlzcGxheS5nZXRXaWR0aCgpIC0gZWRnZUJvcmRlcikgeworICAgICAgICAgICAgICAgICAgICBwcmVwYXJlVHJhY2tpbmcoeSwgIW1FeHBhbmRlZCk7Ly8gb3BlbmluZyBpZiB3ZSdyZSBub3QgYWxyZWFkeSBmdWxseSB2aXNpYmxlCisgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuYWRkTW92ZW1lbnQoZXZlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtVHJhY2tpbmcpIHsKKyAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuYWRkTW92ZW1lbnQoZXZlbnQpOworICAgICAgICAgICAgZmluYWwgaW50IG1pblkgPSBzdGF0dXNCYXJTaXplICsgbUNsb3NlVmlldy5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSkgeworICAgICAgICAgICAgICAgIGludCB5ID0gKGludClldmVudC5nZXRSYXdZKCk7CisgICAgICAgICAgICAgICAgaWYgKG1BbmltYXRpbmdSZXZlYWwgJiYgeSA8IG1pblkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZworICAgICAgICAgICAgICAgIH0gZWxzZSAgeworICAgICAgICAgICAgICAgICAgICBtQW5pbWF0aW5nUmV2ZWFsID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1Bvcyh5ICsgbVZpZXdEZWx0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNvbXB1dGVDdXJyZW50VmVsb2NpdHkoMTAwMCk7CisKKyAgICAgICAgICAgICAgICBmbG9hdCB5VmVsID0gbVZlbG9jaXR5VHJhY2tlci5nZXRZVmVsb2NpdHkoKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIG5lZ2F0aXZlID0geVZlbCA8IDA7CisKKyAgICAgICAgICAgICAgICBmbG9hdCB4VmVsID0gbVZlbG9jaXR5VHJhY2tlci5nZXRYVmVsb2NpdHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoeFZlbCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgeFZlbCA9IC14VmVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoeFZlbCA+IDE1MC4wZikgeworICAgICAgICAgICAgICAgICAgICB4VmVsID0gMTUwLjBmOyAvLyBsaW1pdCBob3cgbXVjaCB3ZSBjYXJlIGFib3V0IHRoZSB4IGF4aXMKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmbG9hdCB2ZWwgPSAoZmxvYXQpTWF0aC5oeXBvdCh5VmVsLCB4VmVsKTsKKyAgICAgICAgICAgICAgICBpZiAobmVnYXRpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgdmVsID0gLXZlbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwZXJmb3JtRmxpbmcoKGludClldmVudC5nZXRSYXdZKCksIHZlbCwgZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTGF1bmNoZXIgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtSW50ZW50OworICAgICAgICBwcml2YXRlIFN0cmluZyBtUGtnOworICAgICAgICBwcml2YXRlIFN0cmluZyBtVGFnOworICAgICAgICBwcml2YXRlIGludCBtSWQ7CisKKyAgICAgICAgTGF1bmNoZXIoUGVuZGluZ0ludGVudCBpbnRlbnQsIFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCkgeworICAgICAgICAgICAgbUludGVudCA9IGludGVudDsKKyAgICAgICAgICAgIG1Qa2cgPSBwa2c7CisgICAgICAgICAgICBtVGFnID0gdGFnOworICAgICAgICAgICAgbUlkID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgaW50ZW50IHdlIGFyZSBzZW5kaW5nIGlzIGZvciB0aGUgYXBwbGljYXRpb24sIHdoaWNoCisgICAgICAgICAgICAgICAgLy8gd29uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGltbWVkaWF0ZWx5IHN0YXJ0IGFuIGFjdGl2aXR5IGFmdGVyCisgICAgICAgICAgICAgICAgLy8gdGhlIHVzZXIgc3dpdGNoZXMgdG8gaG9tZS4gIFdlIGtub3cgaXQgaXMgc2FmZSB0byBkbyBhdCB0aGlzCisgICAgICAgICAgICAgICAgLy8gcG9pbnQsIHNvIG1ha2Ugc3VyZSBuZXcgYWN0aXZpdHkgc3dpdGNoZXMgYXJlIG5vdyBhbGxvd2VkLgorICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkucmVzdW1lQXBwU3dpdGNoZXMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnRbXSBwb3MgPSBuZXcgaW50WzJdOworICAgICAgICAgICAgICAgIHYuZ2V0TG9jYXRpb25PblNjcmVlbihwb3MpOworICAgICAgICAgICAgICAgIEludGVudCBvdmVybGF5ID0gbmV3IEludGVudCgpOworICAgICAgICAgICAgICAgIG92ZXJsYXkuc2V0U291cmNlQm91bmRzKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3QocG9zWzBdLCBwb3NbMV0sIHBvc1swXSt2LmdldFdpZHRoKCksIHBvc1sxXSt2LmdldEhlaWdodCgpKSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbUludGVudC5zZW5kKFBob25lU3RhdHVzQmFyU2VydmljZS50aGlzLCAwLCBvdmVybGF5KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YWNrIHRyYWNlIGlzbid0IHZlcnkgaGVscGZ1bCBoZXJlLiAgSnVzdCBsb2cgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlLgorICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiU2VuZGluZyBjb250ZW50SW50ZW50IGZhaWxlZDogIiArIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vbk5vdGlmaWNhdGlvbkNsaWNrKG1Qa2csIG1UYWcsIG1JZCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkIGlmIHdlJ3JlIGhlcmUuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBzaGFkZSBpZiBpdCB3YXMgb3BlbgorICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisKKyAgICAgICAgICAgIC8vIElmIHRoaXMgY2xpY2sgd2FzIG9uIHRoZSBpbnRydWRlciBhbGVydCwgaGlkZSB0aGF0IGluc3RlYWQKKyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0hJREVfSU5UUlVERVIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRpY2soU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4pIHsKKyAgICAgICAgLy8gU2hvdyB0aGUgdGlja2VyIGlmIG9uZSBpcyByZXF1ZXN0ZWQuIEFsc28gZG9uJ3QgZG8gdGhpcworICAgICAgICAvLyB1bnRpbCBzdGF0dXMgYmFyIHdpbmRvdyBpcyBhdHRhY2hlZCB0byB0aGUgd2luZG93IG1hbmFnZXIsCisgICAgICAgIC8vIGJlY2F1c2UuLi4gIHdlbGwsIHdoYXQncyB0aGUgcG9pbnQgb3RoZXJ3aXNlPyAgQW5kIHRyeWluZyB0bworICAgICAgICAvLyBydW4gYSB0aWNrZXIgd2l0aG91dCBiZWluZyBhdHRhY2hlZCB3aWxsIGNyYXNoIQorICAgICAgICBpZiAobi5ub3RpZmljYXRpb24udGlja2VyVGV4dCAhPSBudWxsICYmIG1TdGF0dXNCYXJWaWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKDAgPT0gKG1EaXNhYmxlZCAmIChTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikpKSB7CisgICAgICAgICAgICAgICAgbVRpY2tlci5hZGRFbnRyeShuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbmNlbCB0aGlzIG5vdGlmaWNhdGlvbiBhbmQgdGVsbCB0aGUgU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UgLyBOb3RpZmljYXRpb25NYW5hZ2VyU2VydmljZQorICAgICAqIGFib3V0IHRoZSBmYWlsdXJlLgorICAgICAqCisgICAgICogV0FSTklORzogdGhpcyB3aWxsIGNhbGwgYmFjayBpbnRvIHVzLiAgRG9uJ3QgaG9sZCBhbnkgbG9ja3MuCisgICAgICovCisgICAgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4sIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvbihrZXkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJhclNlcnZpY2Uub25Ob3RpZmljYXRpb25FcnJvcihuLnBrZywgbi50YWcsIG4uaWQsIG4udWlkLCBuLmluaXRpYWxQaWQsIG1lc3NhZ2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIFRoZSBlbmQgaXMgbmlnaC4KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTXlUaWNrZXIgZXh0ZW5kcyBUaWNrZXIgeworICAgICAgICBNeVRpY2tlcihDb250ZXh0IGNvbnRleHQsIFZpZXcgc2IpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHNiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB0aWNrZXJTdGFydGluZygpIHsKKyAgICAgICAgICAgIG1UaWNraW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIG1JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtVGlja2VyVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtVGlja2VyVmlldy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF91cF9pbiwgbnVsbCkpOworICAgICAgICAgICAgbUljb25zLnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX3VwX291dCwgbnVsbCkpOworICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkoZmFsc2UsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX3VwX291dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdGlja2VyRG9uZSgpIHsKKyAgICAgICAgICAgIG1JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtVGlja2VyVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfZG93bl9pbiwgbnVsbCkpOworICAgICAgICAgICAgbVRpY2tlclZpZXcuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfZG93bl9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBtVGlja2luZ0RvbmVMaXN0ZW5lcikpOworICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfZG93bl9pbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0aWNrZXJIYWx0aW5nKCkgeworICAgICAgICAgICAgbUljb25zLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1UaWNrZXJWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1JY29ucy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbiwgbnVsbCkpOworICAgICAgICAgICAgbVRpY2tlclZpZXcuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgbVRpY2tpbmdEb25lTGlzdGVuZXIpKTsKKyAgICAgICAgICAgIGlmIChtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBtVGlja2luZ0RvbmVMaXN0ZW5lciA9IG5ldyBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIoKSB7OworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRpb24gYW5pbWF0aW9uKSB7CisgICAgICAgICAgICBtVGlja2luZyA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uUmVwZWF0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIEFuaW1hdGlvbiBsb2FkQW5pbShpbnQgaWQsIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBBbmltYXRpb24gYW5pbSA9IEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLnRoaXMsIGlkKTsKKyAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFuaW0uc2V0QW5pbWF0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmltOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdmlld0luZm8oVmlldyB2KSB7CisgICAgICAgIHJldHVybiAiKCIgKyB2LmdldExlZnQoKSArICIsIiArIHYuZ2V0VG9wKCkgKyAiKSgiICsgdi5nZXRSaWdodCgpICsgIiwiICsgdi5nZXRCb3R0b20oKQorICAgICAgICAgICAgICAgICsgIiAiICsgdi5nZXRXaWR0aCgpICsgIngiICsgdi5nZXRIZWlnaHQoKSArICIpIjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdywgU3RyaW5nW10gYXJncykgeworICAgICAgICBpZiAoY2hlY2tDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uRFVNUCkKKyAgICAgICAgICAgICAgICAhPSBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQpIHsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIFN0YXR1c0JhciBmcm9tIGZyb20gcGlkPSIKKyAgICAgICAgICAgICAgICAgICAgKyBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpCisgICAgICAgICAgICAgICAgICAgICsgIiwgdWlkPSIgKyBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAobVF1ZXVlTG9jaykgeworICAgICAgICAgICAgcHcucHJpbnRsbigiQ3VycmVudCBTdGF0dXMgQmFyIHN0YXRlOiIpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAorICAgICAgICAgICAgICAgICAgICArICIsIG1FeHBhbmRlZFZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVGlja2luZz0iICsgbVRpY2tpbmcpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVHJhY2tpbmc9IiArIG1UcmFja2luZyk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1BbmltYXRpbmc9IiArIG1BbmltYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBtQW5pbVk9IiArIG1BbmltWSArICIsIG1BbmltVmVsPSIgKyBtQW5pbVZlbAorICAgICAgICAgICAgICAgICAgICArICIsIG1BbmltQWNjZWw9IiArIG1BbmltQWNjZWwpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtQ3VyQW5pbWF0aW9uVGltZT0iICsgbUN1ckFuaW1hdGlvblRpbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltTGFzdFRpbWU9IiArIG1BbmltTGFzdFRpbWUpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGlzcGxheUhlaWdodD0iICsgbURpc3BsYXlIZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltYXRpbmdSZXZlYWw9IiArIG1BbmltYXRpbmdSZXZlYWwKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1WaWV3RGVsdGE9IiArIG1WaWV3RGVsdGEpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGlzcGxheUhlaWdodD0iICsgbURpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRXhwYW5kZWRQYXJhbXM6ICIgKyBtRXhwYW5kZWRQYXJhbXMpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRXhwYW5kZWRWaWV3OiAiICsgdmlld0luZm8obUV4cGFuZGVkVmlldykpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRXhwYW5kZWREaWFsb2c6ICIgKyBtRXhwYW5kZWREaWFsb2cpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVHJhY2tpbmdQYXJhbXM6ICIgKyBtVHJhY2tpbmdQYXJhbXMpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVHJhY2tpbmdWaWV3OiAiICsgdmlld0luZm8obVRyYWNraW5nVmlldykpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtT25nb2luZ1RpdGxlOiAiICsgdmlld0luZm8obU9uZ29pbmdUaXRsZSkpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtT25nb2luZ0l0ZW1zOiAiICsgdmlld0luZm8obU9uZ29pbmdJdGVtcykpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtTGF0ZXN0VGl0bGU6ICIgKyB2aWV3SW5mbyhtTGF0ZXN0VGl0bGUpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUxhdGVzdEl0ZW1zOiAiICsgdmlld0luZm8obUxhdGVzdEl0ZW1zKSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZTogIiArIHZpZXdJbmZvKG1Ob05vdGlmaWNhdGlvbnNUaXRsZSkpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtQ2xvc2VWaWV3OiAiICsgdmlld0luZm8obUNsb3NlVmlldykpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVGlja2VyVmlldzogIiArIHZpZXdJbmZvKG1UaWNrZXJWaWV3KSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1TY3JvbGxWaWV3OiAiICsgdmlld0luZm8obVNjcm9sbFZpZXcpCisgICAgICAgICAgICAgICAgICAgICsgIiBzY3JvbGwgIiArIG1TY3JvbGxWaWV3LmdldFNjcm9sbFgoKSArICIsIiArIG1TY3JvbGxWaWV3LmdldFNjcm9sbFkoKSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCJtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0OiAiICsgdmlld0luZm8obU5vdGlmaWNhdGlvbkxpbmVhckxheW91dCkpOworICAgICAgICB9CisgICAgICAgIC8qCisgICAgICAgIHN5bmNocm9uaXplZCAobU5vdGlmaWNhdGlvbkRhdGEpIHsKKyAgICAgICAgICAgIGludCBOID0gbU5vdGlmaWNhdGlvbkRhdGEub25nb2luZ0NvdW50KCk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG9uZ29pbmdDb3VudC5zaXplPSIgKyBOKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gbiA9IG1Ob3RpZmljYXRpb25EYXRhLmdldE9uZ29pbmcoaSk7CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgIFsiICsgaSArICJdIGtleT0iICsgbi5rZXkgKyAiIHZpZXc9IiArIG4udmlldyk7CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgICAgICAgICBkYXRhPSIgKyBuLmRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTiA9IG1Ob3RpZmljYXRpb25EYXRhLmxhdGVzdENvdW50KCk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG9uZ29pbmdDb3VudC5zaXplPSIgKyBOKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gbiA9IG1Ob3RpZmljYXRpb25EYXRhLmdldExhdGVzdChpKTsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgWyIgKyBpICsgIl0ga2V5PSIgKyBuLmtleSArICIgdmlldz0iICsgbi52aWV3KTsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgICAgICAgIGRhdGE9IiArIG4uZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICBpZiAoZmFsc2UpIHsKKyAgICAgICAgICAgIHB3LnByaW50bG4oInNlZSB0aGUgbG9nY2F0IGZvciBhIGR1bXAgb2YgdGhlIHZpZXdzIHdlIGhhdmUgY3JlYXRlZC4iKTsKKyAgICAgICAgICAgIC8vIG11c3QgaGFwcGVuIG9uIHVpIHRocmVhZAorICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJWaWV3LmdldExvY2F0aW9uT25TY3JlZW4obUFic1Bvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAibVN0YXR1c0JhclZpZXc6IC0tLS0tICgiICsgbUFic1Bvc1swXSArICIsIiArIG1BYnNQb3NbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSAiICsgbVN0YXR1c0JhclZpZXcuZ2V0V2lkdGgoKSArICJ4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJWaWV3LmRlYnVnKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1FeHBhbmRlZFZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihtQWJzUG9zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJtRXhwYW5kZWRWaWV3OiAtLS0tLSAoIiArIG1BYnNQb3NbMF0gKyAiLCIgKyBtQWJzUG9zWzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgIiArIG1FeHBhbmRlZFZpZXcuZ2V0V2lkdGgoKSArICJ4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1FeHBhbmRlZFZpZXcuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGVkVmlldy5kZWJ1ZygpOworCisgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tpbmdWaWV3LmdldExvY2F0aW9uT25TY3JlZW4obUFic1Bvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAibVRyYWNraW5nVmlldzogLS0tLS0gKCIgKyBtQWJzUG9zWzBdICsgIiwiICsgbUFic1Bvc1sxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpICIgKyBtVHJhY2tpbmdWaWV3LmdldFdpZHRoKCkgKyAieCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtVHJhY2tpbmdWaWV3LmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja2luZ1ZpZXcuZGVidWcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBvbkJhclZpZXdBdHRhY2hlZCgpIHsKKyAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHA7CisgICAgICAgIGludCBwaXhlbEZvcm1hdDsKKyAgICAgICAgRHJhd2FibGUgYmc7CisKKyAgICAgICAgLy8vIC0tLS0tLS0tLS0gVHJhY2tpbmcgVmlldyAtLS0tLS0tLS0tLS0tLQorICAgICAgICBwaXhlbEZvcm1hdCA9IFBpeGVsRm9ybWF0LlJHQlhfODg4ODsKKyAgICAgICAgYmcgPSBtVHJhY2tpbmdWaWV3LmdldEJhY2tncm91bmQoKTsKKyAgICAgICAgaWYgKGJnICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBpeGVsRm9ybWF0ID0gYmcuZ2V0T3BhY2l0eSgpOworICAgICAgICB9CisKKyAgICAgICAgbHAgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMLAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgorICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfTk9fTElNSVRTCisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU0sCisgICAgICAgICAgICAgICAgcGl4ZWxGb3JtYXQpOworLy8gICAgICAgIGxwLnRva2VuID0gbVN0YXR1c0JhclZpZXcuZ2V0V2luZG93VG9rZW4oKTsKKyAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgICAgIGxwLnNldFRpdGxlKCJUcmFja2luZ1ZpZXciKTsKKyAgICAgICAgbHAueSA9IG1UcmFja2luZ1Bvc2l0aW9uOworICAgICAgICBtVHJhY2tpbmdQYXJhbXMgPSBscDsKKworICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhtVHJhY2tpbmdWaWV3LCBscCk7CisgICAgfQorCisgICAgdm9pZCBvblRyYWNraW5nVmlld0F0dGFjaGVkKCkgeworICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscDsKKyAgICAgICAgaW50IHBpeGVsRm9ybWF0OworICAgICAgICBEcmF3YWJsZSBiZzsKKworICAgICAgICAvLy8gLS0tLS0tLS0tLSBFeHBhbmRlZCBWaWV3IC0tLS0tLS0tLS0tLS0tCisgICAgICAgIHBpeGVsRm9ybWF0ID0gUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQ7CisKKyAgICAgICAgZmluYWwgaW50IGRpc3BoID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7CisgICAgICAgIGxwID0gbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgbHAud2lkdGggPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKKyAgICAgICAgbHAuaGVpZ2h0ID0gZ2V0RXhwYW5kZWRIZWlnaHQoKTsKKyAgICAgICAgbHAueCA9IDA7CisgICAgICAgIG1UcmFja2luZ1Bvc2l0aW9uID0gbHAueSA9IC1kaXNwaDsgLy8gc3VmZmljaWVudGx5IGxhcmdlIG5lZ2F0aXZlCisgICAgICAgIGxwLnR5cGUgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUw7CisgICAgICAgIGxwLmZsYWdzID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9OT19MSU1JVFMKKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIX01PREFMCisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0RJVEhFUgorICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFOworICAgICAgICBscC5mb3JtYXQgPSBwaXhlbEZvcm1hdDsKKyAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgICAgIGxwLnNldFRpdGxlKCJTdGF0dXNCYXJFeHBhbmRlZCIpOworICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhscCk7CisgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRGb3JtYXQocGl4ZWxGb3JtYXQpOworICAgICAgICBtRXhwYW5kZWRQYXJhbXMgPSBscDsKKworICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkucmVxdWVzdEZlYXR1cmUoV2luZG93LkZFQVRVUkVfTk9fVElUTEUpOworICAgICAgICBtRXhwYW5kZWREaWFsb2cuc2V0Q29udGVudFZpZXcobUV4cGFuZGVkVmlldywKKyAgICAgICAgICAgICAgICBuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcyhWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkpOworICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QmFja2dyb3VuZERyYXdhYmxlKG51bGwpOworICAgICAgICBtRXhwYW5kZWREaWFsb2cuc2hvdygpOworICAgICAgICBGcmFtZUxheW91dCBoYWNrID0gKEZyYW1lTGF5b3V0KW1FeHBhbmRlZFZpZXcuZ2V0UGFyZW50KCk7CisgICAgfQorCisgICAgdm9pZCBzZXREYXRlVmlld1Zpc2liaWxpdHkoYm9vbGVhbiB2aXNpYmxlLCBpbnQgYW5pbSkgeworICAgICAgICBtRGF0ZVZpZXcuc2V0VXBkYXRlcyh2aXNpYmxlKTsKKyAgICAgICAgbURhdGVWaWV3LnNldFZpc2liaWxpdHkodmlzaWJsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgbURhdGVWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGFuaW0sIG51bGwpKTsKKyAgICB9CisKKyAgICB2b2lkIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KGJvb2xlYW4gdmlzaWJsZSwgaW50IGFuaW0pIHsKKyAgICAgICAgaW50IG9sZCA9IG1Ob3RpZmljYXRpb25JY29ucy5nZXRWaXNpYmlsaXR5KCk7CisgICAgICAgIGludCB2ID0gdmlzaWJsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuSU5WSVNJQkxFOworICAgICAgICBpZiAob2xkICE9IHYpIHsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5zZXRWaXNpYmlsaXR5KHYpOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGFuaW0sIG51bGwpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKGludCBleHBhbmRlZFBvc2l0aW9uKSB7CisgICAgICAgIGlmIChTUEVXKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlRXhwYW5kZWRWaWV3UG9zIGJlZm9yZSBleHBhbmRlZFBvc2l0aW9uPSIgKyBleHBhbmRlZFBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tpbmdQYXJhbXMueT0iICsgbVRyYWNraW5nUGFyYW1zLnkKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2luZ1Bvc2l0aW9uPSIgKyBtVHJhY2tpbmdQb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBpbnQgaCA9IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOworICAgICAgICBpbnQgZGlzcGggPSBtRGlzcGxheS5nZXRIZWlnaHQoKTsKKworICAgICAgICAvLyBJZiB0aGUgZXhwYW5kZWQgdmlldyBpcyBub3QgdmlzaWJsZSwgbWFrZSBzdXJlIHRoZXkncmUgc3RpbGwgb2ZmIHNjcmVlbi4KKyAgICAgICAgLy8gTWF5YmUgdGhlIHZpZXcgd2FzIHJlc2l6ZWQuCisgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgaWYgKG1UcmFja2luZ1ZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1UcmFja2luZ1Bvc2l0aW9uID0gLWRpc3BoOworICAgICAgICAgICAgICAgIGlmIChtVHJhY2tpbmdQYXJhbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtVHJhY2tpbmdQYXJhbXMueSA9IG1UcmFja2luZ1Bvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkudXBkYXRlVmlld0xheW91dChtVHJhY2tpbmdWaWV3LCBtVHJhY2tpbmdQYXJhbXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRXhwYW5kZWRQYXJhbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gLWRpc3BoOworICAgICAgICAgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyB0cmFja2luZyB2aWV3Li4uCisgICAgICAgIGludCBwb3M7CisgICAgICAgIGlmIChleHBhbmRlZFBvc2l0aW9uID09IEVYUEFOREVEX0ZVTExfT1BFTikgeworICAgICAgICAgICAgcG9zID0gaDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChleHBhbmRlZFBvc2l0aW9uID09IEVYUEFOREVEX0xFQVZFX0FMT05FKSB7CisgICAgICAgICAgICBwb3MgPSBtVHJhY2tpbmdQb3NpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChleHBhbmRlZFBvc2l0aW9uIDw9IGRpc3BoKSB7CisgICAgICAgICAgICAgICAgcG9zID0gZXhwYW5kZWRQb3NpdGlvbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcG9zID0gZGlzcGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3MgLT0gZGlzcGgtaDsKKyAgICAgICAgfQorICAgICAgICBtVHJhY2tpbmdQb3NpdGlvbiA9IG1UcmFja2luZ1BhcmFtcy55ID0gcG9zOworICAgICAgICBtVHJhY2tpbmdQYXJhbXMuaGVpZ2h0ID0gZGlzcGgtaDsKKyAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLnVwZGF0ZVZpZXdMYXlvdXQobVRyYWNraW5nVmlldywgbVRyYWNraW5nUGFyYW1zKTsKKworICAgICAgICBpZiAobUV4cGFuZGVkUGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DbG9zZVZpZXcuZ2V0TG9jYXRpb25JbldpbmRvdyhtUG9zaXRpb25UbXApOworICAgICAgICAgICAgZmluYWwgaW50IGNsb3NlUG9zID0gbVBvc2l0aW9uVG1wWzFdOworCisgICAgICAgICAgICBtRXhwYW5kZWRDb250ZW50cy5nZXRMb2NhdGlvbkluV2luZG93KG1Qb3NpdGlvblRtcCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgY29udGVudHNCb3R0b20gPSBtUG9zaXRpb25UbXBbMV0gKyBtRXhwYW5kZWRDb250ZW50cy5nZXRIZWlnaHQoKTsKKworICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSBwb3MgKyBtVHJhY2tpbmdWaWV3LmdldEhlaWdodCgpCisgICAgICAgICAgICAgICAgICAgIC0gKG1UcmFja2luZ1BhcmFtcy5oZWlnaHQtY2xvc2VQb3MpIC0gY29udGVudHNCb3R0b207CisgICAgICAgICAgICBpbnQgbWF4ID0gaDsKKyAgICAgICAgICAgIGlmIChtRXhwYW5kZWRQYXJhbXMueSA+IG1heCkgeworICAgICAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gbWF4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IG1pbiA9IG1UcmFja2luZ1Bvc2l0aW9uOworICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFBhcmFtcy55IDwgbWluKSB7CisgICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSBtaW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2xlYW4gdmlzaWJsZSA9IChtVHJhY2tpbmdQb3NpdGlvbiArIG1UcmFja2luZ1ZpZXcuZ2V0SGVpZ2h0KCkpID4gaDsKKyAgICAgICAgICAgIGlmICghdmlzaWJsZSkgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjb250ZW50cyBhcmVuJ3QgdmlzaWJsZSwgbW92ZSB0aGUgZXhwYW5kZWQgdmlldyB3YXkgb2ZmIHNjcmVlbgorICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIHdpbmRvdyBpdHNlbGYgZXh0ZW5kcyBiZWxvdyB0aGUgY29udGVudCB2aWV3LgorICAgICAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gLWRpc3BoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKKworICAgICAgICAgICAgLy8gQXMgbG9uZyBhcyB0aGlzIGlzbid0IGp1c3QgYSByZXBvc2l0aW9uaW5nIHRoYXQncyBub3Qgc3VwcG9zZWQgdG8gYWZmZWN0CisgICAgICAgICAgICAvLyB0aGUgdXNlcidzIHBlcmNlcHRpb24gb2Ygd2hhdCdzIHNob3dpbmcsIGNhbGwgdG8gc2F5IHRoYXQgdGhlIHZpc2liaWxpdHkKKyAgICAgICAgICAgIC8vIGhhcyBjaGFuZ2VkLiAoT3RoZXJ3aXNlLCBzb21lb25lIGVsc2Ugd2lsbCBjYWxsIHRvIGRvIHRoYXQpLgorICAgICAgICAgICAgaWYgKGV4cGFuZGVkUG9zaXRpb24gIT0gRVhQQU5ERURfTEVBVkVfQUxPTkUpIHsKKyAgICAgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInVwZGF0ZUV4cGFuZGVkVmlld1BvcyB2aXNpYmlsaXR5Q2hhbmdlZCgiICsgdmlzaWJsZSArICIpIik7CisgICAgICAgICAgICAgICAgdmlzaWJpbGl0eUNoYW5nZWQodmlzaWJsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoU1BFVykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZUV4cGFuZGVkVmlld1BvcyBhZnRlciAgZXhwYW5kZWRQb3NpdGlvbj0iICsgZXhwYW5kZWRQb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNraW5nUGFyYW1zLnk9IiArIG1UcmFja2luZ1BhcmFtcy55CisgICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tpbmdQb3NpdGlvbj0iICsgbVRyYWNraW5nUG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFBhcmFtcy55PSIgKyBtRXhwYW5kZWRQYXJhbXMueQorICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkUGFyYW1zLmhlaWdodD0iICsgbUV4cGFuZGVkUGFyYW1zLmhlaWdodCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgZ2V0RXhwYW5kZWRIZWlnaHQoKSB7CisgICAgICAgIHJldHVybiBtRGlzcGxheS5nZXRIZWlnaHQoKSAtIG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpIC0gbUNsb3NlVmlldy5nZXRIZWlnaHQoKTsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZUV4cGFuZGVkSGVpZ2h0KCkgeworICAgICAgICBpZiAobUV4cGFuZGVkVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMuaGVpZ2h0ID0gZ2V0RXhwYW5kZWRIZWlnaHQoKTsKKyAgICAgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgTEVEcyBhcmUgdHVybmVkIG8pZmYgd2hlbiB0aGUgbm90aWZpY2F0aW9uIHBhbmVsIGlzIHNob3duLCBldmVuIGp1c3QgYSBsaXR0bGUgYml0LgorICAgICAqIFRoaXMgd2FzIGFkZGVkIGxhc3QtbWludXRlIGFuZCBpcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IHRoZSByZXN0IG9mIHRoZSBub3RpZmljYXRpb25zCisgICAgICogYXJlIGhhbmRsZWQsIGJlY2F1c2UgdGhlIG5vdGlmaWNhdGlvbiBpc24ndCByZWFsbHkgY2FuY2VsbGVkLiAgVGhlIGxpZ2h0cyBhcmUganVzdAorICAgICAqIHR1cm5lZCBvZmYuICBJZiBhbnkgb3RoZXIgbm90aWZpY2F0aW9ucyBoYXBwZW4sIHRoZSBsaWdodHMgd2lsbCB0dXJuIGJhY2sgb24uICBTdGV2ZSBzYXlzCisgICAgICogdGhpcyBpcyB3aGF0IGhlIHdhbnRzLiAoc2VlIGJ1ZyAxMTMxNDYxKQorICAgICAqLworICAgIHZvaWQgdmlzaWJpbGl0eUNoYW5nZWQoYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIGlmIChtUGFuZWxTbGlnaHRseVZpc2libGUgIT0gdmlzaWJsZSkgeworICAgICAgICAgICAgbVBhbmVsU2xpZ2h0bHlWaXNpYmxlID0gdmlzaWJsZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25QYW5lbFJldmVhbGVkKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBXb24ndCBmYWlsIHVubGVzcyB0aGUgd29ybGQgaGFzIGVuZGVkLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBwZXJmb3JtRGlzYWJsZUFjdGlvbnMoaW50IG5ldCkgeworICAgICAgICBpbnQgb2xkID0gbURpc2FibGVkOworICAgICAgICBpbnQgZGlmZiA9IG5ldCBeIG9sZDsKKyAgICAgICAgbURpc2FibGVkID0gbmV0OworCisgICAgICAgIC8vIGFjdCBhY2NvcmRpbmdseQorICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9FWFBBTkQ6IHllcyIpOworICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogeWVzIik7CisgICAgICAgICAgICAgICAgaWYgKG1UaWNraW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgbVRpY2tlci5oYWx0KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkoZmFsc2UsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX291dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IG5vIik7CisgICAgICAgICAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgeworICAgICAgICAgICAgaWYgKG1UaWNraW5nICYmIChuZXQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgeworICAgICAgICAgICAgICAgIG1UaWNrZXIuaGFsdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtQ2xlYXJCdXR0b25MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25DbGVhckFsbE5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQgaWYgd2UncmUgaGVyZS4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbUJyb2FkY2FzdFJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOworICAgICAgICAgICAgaWYgKEludGVudC5BQ1RJT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1MuZXF1YWxzKGFjdGlvbikKKyAgICAgICAgICAgICAgICAgICAgfHwgSW50ZW50LkFDVElPTl9TQ1JFRU5fT0ZGLmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChJbnRlbnQuQUNUSU9OX0NPTkZJR1VSQVRJT05fQ0hBTkdFRC5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZVJlc291cmNlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgdm9pZCBzZXRJbnRydWRlckFsZXJ0VmlzaWJpbGl0eShib29sZWFuIHZpcykgeworICAgICAgICBtSW50cnVkZXJBbGVydFZpZXcuc2V0VmlzaWJpbGl0eSh2aXMgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbG9hZCBzb21lIG9mIG91ciByZXNvdXJjZXMgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzLgorICAgICAqCisgICAgICogV2UgZG9uJ3QgcmVsb2FkIGV2ZXJ5dGhpbmcgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIC0tIHdlIHByb2JhYmx5CisgICAgICogc2hvdWxkLCBidXQgZ2V0dGluZyB0aGF0IHNtb290aCBpcyB0b3VnaC4gIFNvbWVkYXkgd2UnbGwgZml4IHRoYXQuICBJbiB0aGUKKyAgICAgKiBtZWFudGltZSwganVzdCB1cGRhdGUgdGhlIHRoaW5ncyB0aGF0IHdlIGtub3cgY2hhbmdlLgorICAgICAqLworICAgIHZvaWQgdXBkYXRlUmVzb3VyY2VzKCkgeworICAgICAgICBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisKKyAgICAgICAgbUNsZWFyQnV0dG9uLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5zdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24pKTsKKyAgICAgICAgbU9uZ29pbmdUaXRsZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuc3RhdHVzX2Jhcl9vbmdvaW5nX2V2ZW50c190aXRsZSkpOworICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfbGF0ZXN0X2V2ZW50c190aXRsZSkpOworICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUuc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfbm9fbm90aWZpY2F0aW9uc190aXRsZSkpOworCisgICAgICAgIG1FZGdlQm9yZGVyID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLnN0YXR1c19iYXJfZWRnZV9pZ25vcmUpOworCisgICAgICAgIGlmIChmYWxzZSkgU2xvZy52KFRBRywgInVwZGF0ZVJlc291cmNlcyIpOworICAgIH0KKworICAgIC8vCisgICAgLy8gdHJhY2luZworICAgIC8vCisKKyAgICB2b2lkIHBvc3RTdGFydFRyYWNpbmcoKSB7CisgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1TdGFydFRyYWNpbmcsIDMwMDApOworICAgIH0KKworICAgIHZvaWQgdmlicmF0ZSgpIHsKKyAgICAgICAgYW5kcm9pZC5vcy5WaWJyYXRvciB2aWIgPSAoYW5kcm9pZC5vcy5WaWJyYXRvcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVklCUkFUT1JfU0VSVklDRSk7CisgICAgICAgIHZpYi52aWJyYXRlKDI1MCk7CisgICAgfQorCisgICAgUnVubmFibGUgbVN0YXJ0VHJhY2luZyA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgdmlicmF0ZSgpOworICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMjUwKTsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJzdGFydFRyYWNpbmciKTsKKyAgICAgICAgICAgIGFuZHJvaWQub3MuRGVidWcuc3RhcnRNZXRob2RUcmFjaW5nKCIvZGF0YS9zdGF0dXNiYXItdHJhY2VzL3RyYWNlIik7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChtU3RvcFRyYWNpbmcsIDEwMDAwKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBSdW5uYWJsZSBtU3RvcFRyYWNpbmcgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGFuZHJvaWQub3MuRGVidWcuc3RvcE1ldGhvZFRyYWNpbmcoKTsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJzdG9wVHJhY2luZyIpOworICAgICAgICAgICAgdmlicmF0ZSgpOworICAgICAgICB9CisgICAgfTsKK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9SZWNlbnRBcHBsaWNhdGlvbnNBY3Rpdml0eS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9SZWNlbnRBcHBsaWNhdGlvbnNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YmE3ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1JlY2VudEFwcGxpY2F0aW9uc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQ2Fyb3VzZWxWaWV3OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5DYXJvdXNlbFJTLkNhcm91c2VsQ2FsbGJhY2s7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuSVRodW1ibmFpbFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlci5SdW5uaW5nVGFza0luZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworcHVibGljIGNsYXNzIFJlY2VudEFwcGxpY2F0aW9uc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkiOworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gREJHID0gdHJ1ZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FSRF9TTE9UUyA9IDU2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWSVNJQkxFX1NMT1RTID0gNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1RBU0tTID0gVklTSUJMRV9TTE9UUyAqIDI7CisgICAgcHJpdmF0ZSBBY3Rpdml0eU1hbmFnZXIgbUFjdGl2aXR5TWFuYWdlcjsKKyAgICBwcml2YXRlIExpc3Q8UnVubmluZ1Rhc2tJbmZvPiBtUnVubmluZ1Rhc2tMaXN0OworICAgIHByaXZhdGUgYm9vbGVhbiBtUG9ydHJhaXRNb2RlID0gdHJ1ZTsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxBY3Rpdml0eURlc2NyaXB0aW9uPiBtQWN0aXZpdHlEZXNjcmlwdGlvbnMKKyAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eURlc2NyaXB0aW9uPigpOworICAgIHByaXZhdGUgQ2Fyb3VzZWxWaWV3IG1DYXJvdXNlbFZpZXc7CisgICAgcHJpdmF0ZSBWaWV3IG1Ob1JlY2VudHNWaWV3OworICAgIHByaXZhdGUgQml0bWFwIG1CbGFua0JpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoCisgICAgICAgICAgICBuZXcgaW50W10gezB4ZmY4MDgwODAsIDB4ZmZmZmZmZmYsIDB4ZmY4MDgwODAsIDB4ZmZmZmZmZmZ9LCAyLCAyLCBDb25maWcuUkdCXzU2NSk7CisKKyAgICBzdGF0aWMgY2xhc3MgQWN0aXZpdHlEZXNjcmlwdGlvbiB7CisgICAgICAgIGludCBpZDsKKyAgICAgICAgQml0bWFwIHRodW1ibmFpbDsgLy8gZ2VuZXJhdGVkIGJ5IEFjdGl2aXR5Lm9uQ3JlYXRlVGh1bWJuYWlsKCkKKyAgICAgICAgRHJhd2FibGUgaWNvbjsgLy8gYXBwbGljYXRpb24gcGFja2FnZSBpY29uCisgICAgICAgIFN0cmluZyBsYWJlbDsgLy8gYXBwbGljYXRpb24gcGFja2FnZSBsYWJlbAorICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb247IC8vIGdlbmVyYXRlZCBieSBBY3Rpdml0eS5vbkNyZWF0ZURlc2NyaXB0aW9uKCkKKyAgICAgICAgSW50ZW50IGludGVudDsgLy8gbGF1bmNoIGludGVudCBmb3IgYXBwbGljYXRpb24KKyAgICAgICAgTWF0cml4IG1hdHJpeDsgLy8gYXJiaXRyYXJ5IHJvdGF0aW9uIG1hdHJpeCB0byBjb3JyZWN0IG9yaWVudGF0aW9uCisgICAgICAgIGludCBwb3NpdGlvbjsgLy8gcG9zaXRpb24gaW4gbGlzdAorCisgICAgICAgIHB1YmxpYyBBY3Rpdml0eURlc2NyaXB0aW9uKEJpdG1hcCBfdGh1bWJuYWlsLAorICAgICAgICAgICAgICAgIERyYXdhYmxlIF9pY29uLCBTdHJpbmcgX2xhYmVsLCBTdHJpbmcgX2Rlc2MsIGludCBfaWQsIGludCBfcG9zKQorICAgICAgICB7CisgICAgICAgICAgICB0aHVtYm5haWwgPSBfdGh1bWJuYWlsOworICAgICAgICAgICAgaWNvbiA9IF9pY29uOworICAgICAgICAgICAgbGFiZWwgPSBfbGFiZWw7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IF9kZXNjOworICAgICAgICAgICAgaWQgPSBfaWQ7CisgICAgICAgICAgICBwb3NpdGlvbiA9IF9wb3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIGljb24gPSBudWxsOworICAgICAgICAgICAgdGh1bWJuYWlsID0gbnVsbDsKKyAgICAgICAgICAgIGxhYmVsID0gbnVsbDsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIGludGVudCA9IG51bGw7CisgICAgICAgICAgICBtYXRyaXggPSBudWxsOworICAgICAgICAgICAgaWQgPSAtMTsKKyAgICAgICAgICAgIHBvc2l0aW9uID0gLTE7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBBY3Rpdml0eURlc2NyaXB0aW9uIGZpbmRBY3Rpdml0eURlc2NyaXB0aW9uKGludCBpZCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1BY3Rpdml0eURlc2NyaXB0aW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQWN0aXZpdHlEZXNjcmlwdGlvbiBpdGVtID0gbUFjdGl2aXR5RGVzY3JpcHRpb25zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgaXRlbS5pZCA9PSBpZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGZpbmFsIENhcm91c2VsQ2FsbGJhY2sgbUNhcm91c2VsQ2FsbGJhY2sgPSBuZXcgQ2Fyb3VzZWxDYWxsYmFjaygpIHsKKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkZpbmlzaGVkKCkgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0ZWQoKSB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FyZFNlbGVjdGVkKGludCBuKSB7CisgICAgICAgICAgICBpZiAobiA8IG1BY3Rpdml0eURlc2NyaXB0aW9ucy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBBY3Rpdml0eURlc2NyaXB0aW9uIGl0ZW0gPSBtQWN0aXZpdHlEZXNjcmlwdGlvbnMuZ2V0KG4pOworICAgICAgICAgICAgICAgIC8vIHByZXBhcmUgYSBsYXVuY2ggaW50ZW50IGFuZCBzZW5kIGl0CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5pbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTEFVTkNIRURfRlJPTV9ISVNUT1JZKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIlN0YXJ0aW5nIGludGVudCAiICsgaXRlbS5pbnRlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShpdGVtLmludGVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL292ZXJyaWRlUGVuZGluZ1RyYW5zaXRpb24oUi5hbmltLnpvb21fZW50ZXIsIFIuYW5pbS56b29tX2V4aXQpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChBY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy53KCJSZWNlbnQiLCAiVW5hYmxlIHRvIGxhdW5jaCByZWNlbnQgdGFzayIsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSW52YWxpZGF0ZVRleHR1cmUoaW50IG4pIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25SZXF1ZXN0R2VvbWV0cnkoaW50IG4pIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25JbnZhbGlkYXRlR2VvbWV0cnkoaW50IG4pIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25SZXF1ZXN0VGV4dHVyZShmaW5hbCBpbnQgbikgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAib25SZXF1ZXN0VGV4dHVyZSgiICsgbiArICIpIik7CisgICAgICAgICAgICBpZiAobiA8IG1BY3Rpdml0eURlc2NyaXB0aW9ucy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURlc2NyaXB0aW9uIGluZm8gPSBtQWN0aXZpdHlEZXNjcmlwdGlvbnMuZ2V0KG4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIkZPVU5EIEFDVElWSVRZIFRIVU1CTkFJTCAiICsgaW5mby50aHVtYm5haWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBpbmZvLnRodW1ibmFpbCA9PSBudWxsID8gbUJsYW5rQml0bWFwIDogaW5mby50aHVtYm5haWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhcm91c2VsVmlldy5zZXRUZXh0dXJlRm9ySXRlbShuLCBiaXRtYXApOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJGQUlMRUQgVE8gR0VUIEFDVElWSVRZIFRIVU1CTkFJTCBGT1IgSVRFTSAiICsgbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIElUaHVtYm5haWxSZWNlaXZlciBtVGh1bWJuYWlsUmVjZWl2ZXIgPSBuZXcgSVRodW1ibmFpbFJlY2VpdmVyLlN0dWIoKSB7CisKKyAgICAgICAgcHVibGljIHZvaWQgZmluaXNoZWQoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbmV3VGh1bWJuYWlsKGZpbmFsIGludCBpZCwgZmluYWwgQml0bWFwIGJpdG1hcCwgQ2hhclNlcXVlbmNlIGRlc2NyaXB0aW9uKQorICAgICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgaW50IHcgPSBiaXRtYXAuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIGludCBoID0gYml0bWFwLmdldEhlaWdodCgpOworICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiTmV3IHRodW1ibmFpbCBmb3IgaWQ9IiArIGlkICsgIiwgZGltZW5zaW9ucz0iICsgdyArICJ4IiArIGgKKyAgICAgICAgICAgICAgICAgICAgKyAiIGRlc2NyaXB0aW9uICciICsgZGVzY3JpcHRpb24gKyAiJyIpOworICAgICAgICAgICAgQWN0aXZpdHlEZXNjcmlwdGlvbiBpbmZvID0gZmluZEFjdGl2aXR5RGVzY3JpcHRpb24oaWQpOworICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGluZm8udGh1bWJuYWlsID0gYml0bWFwOworICAgICAgICAgICAgICAgIGZpbmFsIGludCB0aHVtYldpZHRoID0gYml0bWFwLmdldFdpZHRoKCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHRodW1iSGVpZ2h0ID0gYml0bWFwLmdldEhlaWdodCgpOworICAgICAgICAgICAgICAgIGlmICgobVBvcnRyYWl0TW9kZSAmJiB0aHVtYldpZHRoID4gdGh1bWJIZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoIW1Qb3J0cmFpdE1vZGUgJiYgdGh1bWJXaWR0aCA8IHRodW1iSGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICBNYXRyaXggbWF0cml4ID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgICAgICAgICBtYXRyaXguc2V0Um90YXRlKDkwLjBmLCAoZmxvYXQpIHRodW1iV2lkdGggLyAyLCAoZmxvYXQpIHRodW1iSGVpZ2h0IC8gMik7CisgICAgICAgICAgICAgICAgICAgIGluZm8ubWF0cml4ID0gbWF0cml4OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8ubWF0cml4ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNhcm91c2VsVmlldy5zZXRUZXh0dXJlRm9ySXRlbShpbmZvLnBvc2l0aW9uLCBpbmZvLnRodW1ibmFpbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIkNhbid0IGZpbmQgdmlldyBmb3IgaWQgIiArIGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworICAgICAgICBmaW5hbCBWaWV3IGRlY29yVmlldyA9IGdldFdpbmRvdygpLmdldERlY29yVmlldygpOworCisgICAgICAgIGdldFdpbmRvdygpLmdldERlY29yVmlldygpLnNldEJhY2tncm91bmRDb2xvcigweDgwMDAwMDAwKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQucmVjZW50X2FwcHNfYWN0aXZpdHkpOworICAgICAgICBtQ2Fyb3VzZWxWaWV3ID0gKENhcm91c2VsVmlldylmaW5kVmlld0J5SWQoUi5pZC5jYXJvdXNlbCk7CisgICAgICAgIG1Ob1JlY2VudHNWaWV3ID0gKFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLm5vX2FwcGxpY2F0aW9uc19tZXNzYWdlKTsKKyAgICAgICAgLy9tQ2Fyb3VzZWxWaWV3ID0gbmV3IENhcm91c2VsVmlldyh0aGlzKTsKKyAgICAgICAgLy9zZXRDb250ZW50VmlldyhtQ2Fyb3VzZWxWaWV3KTsKKyAgICAgICAgbUNhcm91c2VsVmlldy5zZXRTbG90Q291bnQoQ0FSRF9TTE9UUyk7CisgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0VmlzaWJsZVNsb3RzKFZJU0lCTEVfU0xPVFMpOworICAgICAgICBtQ2Fyb3VzZWxWaWV3LmNyZWF0ZUNhcmRzKDEpOworICAgICAgICBtQ2Fyb3VzZWxWaWV3LnNldFN0YXJ0QW5nbGUoKGZsb2F0KSAtKDIuMGYqTWF0aC5QSSAqIDUgLyBDQVJEX1NMT1RTKSk7CisgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0RGVmYXVsdEJpdG1hcChtQmxhbmtCaXRtYXApOworICAgICAgICBtQ2Fyb3VzZWxWaWV3LnNldExvYWRpbmdCaXRtYXAobUJsYW5rQml0bWFwKTsKKyAgICAgICAgbUNhcm91c2VsVmlldy5zZXRDYWxsYmFjayhtQ2Fyb3VzZWxDYWxsYmFjayk7CisgICAgICAgIG1DYXJvdXNlbFZpZXcuZ2V0SG9sZGVyKCkuc2V0Rm9ybWF0KFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UKTsKKworICAgICAgICBtQWN0aXZpdHlNYW5hZ2VyID0gKEFjdGl2aXR5TWFuYWdlcikgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICBtUG9ydHJhaXRNb2RlID0gZGVjb3JWaWV3LmdldEhlaWdodCgpID4gZGVjb3JWaWV3LmdldFdpZHRoKCk7CisKKyAgICAgICAgcmVmcmVzaCgpOworCisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgcmVmcmVzaCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOworICAgICAgICBtUG9ydHJhaXRNb2RlID0gbmV3Q29uZmlnLm9yaWVudGF0aW9uID09IENvbmZpZ3VyYXRpb24uT1JJRU5UQVRJT05fUE9SVFJBSVQ7CisgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIkNPTkZJRyBDSEFOR0UsIG1Qb3J0cmFpdE1vZGUgPSAiICsgbVBvcnRyYWl0TW9kZSk7CisgICAgICAgIHJlZnJlc2goKTsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZVJ1bm5pbmdUYXNrcygpIHsKKyAgICAgICAgbVJ1bm5pbmdUYXNrTGlzdCA9IG1BY3Rpdml0eU1hbmFnZXIuZ2V0UnVubmluZ1Rhc2tzKE1BWF9UQVNLUywgMCwgbVRodW1ibmFpbFJlY2VpdmVyKTsKKyAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiUG9ydHJhaXQ6ICIgKyBtUG9ydHJhaXRNb2RlKTsKKyAgICAgICAgZm9yIChSdW5uaW5nVGFza0luZm8gciA6IG1SdW5uaW5nVGFza0xpc3QpIHsKKyAgICAgICAgICAgIGlmIChyLnRodW1ibmFpbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50IHRodW1iV2lkdGggPSByLnRodW1ibmFpbC5nZXRXaWR0aCgpOworICAgICAgICAgICAgICAgIGludCB0aHVtYkhlaWdodCA9IHIudGh1bWJuYWlsLmdldEhlaWdodCgpOworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIkdvdCB0aHVtYm5haWwgIiArIHRodW1iV2lkdGggKyAieCIgKyB0aHVtYkhlaWdodCk7CisgICAgICAgICAgICAgICAgQWN0aXZpdHlEZXNjcmlwdGlvbiBkZXNjID0gZmluZEFjdGl2aXR5RGVzY3JpcHRpb24oci5pZCk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBkZXNjLnRodW1ibmFpbCA9IHIudGh1bWJuYWlsOworICAgICAgICAgICAgICAgICAgICBkZXNjLmxhYmVsID0gci50b3BBY3Rpdml0eS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBpZiAoKG1Qb3J0cmFpdE1vZGUgJiYgdGh1bWJXaWR0aCA+IHRodW1iSGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICghbVBvcnRyYWl0TW9kZSAmJiB0aHVtYldpZHRoIDwgdGh1bWJIZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNYXRyaXggbWF0cml4ID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LnNldFJvdGF0ZSg5MC4wZiwgKGZsb2F0KSB0aHVtYldpZHRoIC8gMiwgKGZsb2F0KSB0aHVtYkhlaWdodCAvIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5tYXRyaXggPSBtYXRyaXg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJDb3VsZG4ndCBmaW5kIEFjdGl2aXR5RGVzYyBmb3IgaWQ9IiArIHIuaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiKioqIFJVTk5JTkcgVEhVTUJOQUlMIFdBUyBOVUxMICoqKiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1DYXJvdXNlbFZpZXcuY3JlYXRlQ2FyZHMobUFjdGl2aXR5RGVzY3JpcHRpb25zLnNpemUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJlY2VudFRhc2tzKCkgeworICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9IGdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlciBhbSA9IChBY3Rpdml0eU1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BQ1RJVklUWV9TRVJWSUNFKTsKKworICAgICAgICBmaW5hbCBMaXN0PEFjdGl2aXR5TWFuYWdlci5SZWNlbnRUYXNrSW5mbz4gcmVjZW50VGFza3MgPQorICAgICAgICAgICAgICAgIGFtLmdldFJlY2VudFRhc2tzKE1BWF9UQVNLUywgQWN0aXZpdHlNYW5hZ2VyLlJFQ0VOVF9JR05PUkVfVU5BVkFJTEFCTEUpOworCisgICAgICAgIEFjdGl2aXR5SW5mbyBob21lSW5mbyA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9NQUlOKS5hZGRDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfSE9NRSkKKyAgICAgICAgICAgICAgICAgICAgLnJlc29sdmVBY3Rpdml0eUluZm8ocG0sIDApOworCisgICAgICAgIC8vIEljb25VdGlsaXRpZXMgaWNvblV0aWxpdGllcyA9IG5ldyBJY29uVXRpbGl0aWVzKHRoaXMpOyAvLyBGSVhNRQorCisgICAgICAgIGludCBudW1UYXNrcyA9IHJlY2VudFRhc2tzLnNpemUoKTsKKyAgICAgICAgbUFjdGl2aXR5RGVzY3JpcHRpb25zLmNsZWFyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBpbmRleCA9IDA7IGkgPCBudW1UYXNrcyAmJiAoaW5kZXggPCBNQVhfVEFTS1MpOyArK2kpIHsKKyAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5TWFuYWdlci5SZWNlbnRUYXNrSW5mbyByZWNlbnRJbmZvID0gcmVjZW50VGFza3MuZ2V0KGkpOworCisgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChyZWNlbnRJbmZvLmJhc2VJbnRlbnQpOworICAgICAgICAgICAgaWYgKHJlY2VudEluZm8ub3JpZ0FjdGl2aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnRlbnQuc2V0Q29tcG9uZW50KHJlY2VudEluZm8ub3JpZ0FjdGl2aXR5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2tpcCB0aGUgY3VycmVudCBob21lIGFjdGl2aXR5LgorICAgICAgICAgICAgaWYgKGhvbWVJbmZvICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgaG9tZUluZm8ucGFja2FnZU5hbWUuZXF1YWxzKGludGVudC5nZXRDb21wb25lbnQoKS5nZXRQYWNrYWdlTmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAmJiBob21lSW5mby5uYW1lLmVxdWFscyhpbnRlbnQuZ2V0Q29tcG9uZW50KCkuZ2V0Q2xhc3NOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludGVudC5zZXRGbGFncygoaW50ZW50LmdldEZsYWdzKCkmfkludGVudC5GTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVEKQorICAgICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgICAgIGZpbmFsIFJlc29sdmVJbmZvIHJlc29sdmVJbmZvID0gcG0ucmVzb2x2ZUFjdGl2aXR5KGludGVudCwgMCk7CisgICAgICAgICAgICBpZiAocmVzb2x2ZUluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5SW5mbyBpbmZvID0gcmVzb2x2ZUluZm8uYWN0aXZpdHlJbmZvOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0aXRsZSA9IGluZm8ubG9hZExhYmVsKHBtKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIERyYXdhYmxlIGljb24gPSBpbmZvLmxvYWRJY29uKHBtKTsKKworICAgICAgICAgICAgICAgIGludCBpZCA9IHJlY2VudFRhc2tzLmdldChpKS5pZDsKKyAgICAgICAgICAgICAgICBpZiAoaWQgIT0gLTEgJiYgdGl0bGUgIT0gbnVsbCAmJiB0aXRsZS5sZW5ndGgoKSA+IDAgJiYgaWNvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGljb24gPSBudWxsOyBGSVhNRTogaWNvblV0aWxpdGllcy5jcmVhdGVJY29uRHJhd2FibGUoaWNvbik7CisgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RGVzY3JpcHRpb24gaXRlbSA9IG5ldyBBY3Rpdml0eURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIGljb24sIHRpdGxlLCBudWxsLCBpZCwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpdGVtLmludGVudCA9IGludGVudDsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5RGVzY3JpcHRpb25zLmFkZChpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiQWRkZWQgaXRlbVsiICsgaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdLCBpZD0iICsgaXRlbS5pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgdGl0bGU9IiArIGl0ZW0ubGFiZWwpOworICAgICAgICAgICAgICAgICAgICArK2luZGV4OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIlNLSVBQSU5HIGl0ZW0gIiArIGlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVmcmVzaCgpIHsKKyAgICAgICAgdXBkYXRlUmVjZW50VGFza3MoKTsKKyAgICAgICAgdXBkYXRlUnVubmluZ1Rhc2tzKCk7CisgICAgICAgIGlmIChtQWN0aXZpdHlEZXNjcmlwdGlvbnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIC8vIHNob3cgIk5vIFJlY2VudCBUYWtzcyIKKyAgICAgICAgICAgIG1Ob1JlY2VudHNWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU5vUmVjZW50c1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUNhcm91c2VsVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LmNyZWF0ZUNhcmRzKG1BY3Rpdml0eURlc2NyaXB0aW9ucy5zaXplKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJTZXJ2aWNlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclNlcnZpY2UuamF2YQppbmRleCA4ZjJkYTdhLi5hNjRjM2U3IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclNlcnZpY2UuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclNlcnZpY2UuamF2YQpAQCAtMTcsMTgzICsxNyw1MyBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXI7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXJJbXBsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5JU3RhdHVzQmFyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5JU3RhdHVzQmFyU2VydmljZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFySWNvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFySWNvbkxpc3Q7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLlN0YXR1c0Jhck5vdGlmaWNhdGlvbjsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmFwcC5TdGF0dXNCYXJNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WZWxvY2l0eVRyYWNrZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VySW1wbDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Nyb2xsVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5wb2xpY3kuU3RhdHVzQmFyUG9saWN5OwogCi0KLQotcHVibGljIGNsYXNzIFN0YXR1c0JhclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIGltcGxlbWVudHMgQ29tbWFuZFF1ZXVlLkNhbGxiYWNrcyB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhdHVzQmFyU2VydmljZSBleHRlbmRzIFNlcnZpY2UgaW1wbGVtZW50cyBDb21tYW5kUXVldWUuQ2FsbGJhY2tzIHsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdGF0dXNCYXJTZXJ2aWNlIjsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBTUEVXID0gZmFsc2U7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU1RBVFVTQkFSX1NUQVJUCi0gICAgICAgICAgICA9ICJjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuc3RhdHVzYmFyLlNUQVJUIjsKKyAgICBwcm90ZWN0ZWQgQ29tbWFuZFF1ZXVlIG1Db21tYW5kUXVldWU7CisgICAgcHJvdGVjdGVkIElTdGF0dXNCYXJTZXJ2aWNlIG1CYXJTZXJ2aWNlOwogCi0gICAgc3RhdGljIGZpbmFsIGludCBFWFBBTkRFRF9MRUFWRV9BTE9ORSA9IC0xMDAwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEVYUEFOREVEX0ZVTExfT1BFTiA9IC0xMDAwMTsKKyAgICAvLyBVcC1jYWxsIG1ldGhvZHMKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVmlldyBtYWtlU3RhdHVzQmFyVmlldygpOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0U3RhdHVzQmFyR3Jhdml0eSgpOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19BTklNQVRFID0gMTAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FOSU1BVEVfUkVWRUFMID0gMTAwMTsKLQotICAgIFN0YXR1c0JhclBvbGljeSBtSWNvblBvbGljeTsKLQotICAgIENvbW1hbmRRdWV1ZSBtQ29tbWFuZFF1ZXVlOwotICAgIElTdGF0dXNCYXJTZXJ2aWNlIG1CYXJTZXJ2aWNlOwotCi0gICAgaW50IG1JY29uU2l6ZTsKLSAgICBEaXNwbGF5IG1EaXNwbGF5OwotICAgIFN0YXR1c0JhclZpZXcgbVN0YXR1c0JhclZpZXc7Ci0gICAgaW50IG1QaXhlbEZvcm1hdDsKLSAgICBIIG1IYW5kbGVyID0gbmV3IEgoKTsKLSAgICBPYmplY3QgbVF1ZXVlTG9jayA9IG5ldyBPYmplY3QoKTsKLQotICAgIC8vIGljb25zCi0gICAgTGluZWFyTGF5b3V0IG1JY29uczsKLSAgICBJY29uTWVyZ2VyIG1Ob3RpZmljYXRpb25JY29uczsKLSAgICBMaW5lYXJMYXlvdXQgbVN0YXR1c0ljb25zOwotCi0gICAgLy8gZXhwYW5kZWQgbm90aWZpY2F0aW9ucwotICAgIERpYWxvZyBtRXhwYW5kZWREaWFsb2c7Ci0gICAgRXhwYW5kZWRWaWV3IG1FeHBhbmRlZFZpZXc7Ci0gICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbUV4cGFuZGVkUGFyYW1zOwotICAgIFNjcm9sbFZpZXcgbVNjcm9sbFZpZXc7Ci0gICAgVmlldyBtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0OwotICAgIFZpZXcgbUV4cGFuZGVkQ29udGVudHM7Ci0gICAgLy8gdG9wIGJhcgotICAgIFRleHRWaWV3IG1Ob05vdGlmaWNhdGlvbnNUaXRsZTsKLSAgICBUZXh0VmlldyBtQ2xlYXJCdXR0b247Ci0gICAgLy8gZHJhZyBiYXIKLSAgICBDbG9zZURyYWdIYW5kbGUgbUNsb3NlVmlldzsKLSAgICAvLyBvbmdvaW5nCi0gICAgTm90aWZpY2F0aW9uRGF0YSBtT25nb2luZyA9IG5ldyBOb3RpZmljYXRpb25EYXRhKCk7Ci0gICAgVGV4dFZpZXcgbU9uZ29pbmdUaXRsZTsKLSAgICBMaW5lYXJMYXlvdXQgbU9uZ29pbmdJdGVtczsKLSAgICAvLyBsYXRlc3QKLSAgICBOb3RpZmljYXRpb25EYXRhIG1MYXRlc3QgPSBuZXcgTm90aWZpY2F0aW9uRGF0YSgpOwotICAgIFRleHRWaWV3IG1MYXRlc3RUaXRsZTsKLSAgICBMaW5lYXJMYXlvdXQgbUxhdGVzdEl0ZW1zOwotICAgIC8vIHBvc2l0aW9uCi0gICAgaW50W10gbVBvc2l0aW9uVG1wID0gbmV3IGludFsyXTsKLSAgICBib29sZWFuIG1FeHBhbmRlZDsKLSAgICBib29sZWFuIG1FeHBhbmRlZFZpc2libGU7Ci0KLSAgICAvLyB0aGUgZGF0ZSB2aWV3Ci0gICAgRGF0ZVZpZXcgbURhdGVWaWV3OwotCi0gICAgLy8gdGhlIHRyYWNrZXIgdmlldwotICAgIFRyYWNraW5nVmlldyBtVHJhY2tpbmdWaWV3OwotICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIG1UcmFja2luZ1BhcmFtczsKLSAgICBpbnQgbVRyYWNraW5nUG9zaXRpb247IC8vIHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9wIG9mIHRoZSB0cmFja2luZyB2aWV3LgotICAgIHByaXZhdGUgYm9vbGVhbiBtUGFuZWxTbGlnaHRseVZpc2libGU7Ci0KLSAgICAvLyB0aWNrZXIKLSAgICBwcml2YXRlIFRpY2tlciBtVGlja2VyOwotICAgIHByaXZhdGUgVmlldyBtVGlja2VyVmlldzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVRpY2tpbmc7Ci0KLSAgICAvLyBUcmFja2luZyBmaW5nZXIgZm9yIG9wZW5pbmcvY2xvc2luZy4KLSAgICBpbnQgbUVkZ2VCb3JkZXI7IC8vIGNvcnJlc3BvbmRzIHRvIFIuZGltZW4uc3RhdHVzX2Jhcl9lZGdlX2lnbm9yZQotICAgIGJvb2xlYW4gbVRyYWNraW5nOwotICAgIFZlbG9jaXR5VHJhY2tlciBtVmVsb2NpdHlUcmFja2VyOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBBTklNX0ZSQU1FX0RVUkFUSU9OID0gKDEwMDAvNjApOwotCi0gICAgYm9vbGVhbiBtQW5pbWF0aW5nOwotICAgIGxvbmcgbUN1ckFuaW1hdGlvblRpbWU7Ci0gICAgZmxvYXQgbURpc3BsYXlIZWlnaHQ7Ci0gICAgZmxvYXQgbUFuaW1ZOwotICAgIGZsb2F0IG1BbmltVmVsOwotICAgIGZsb2F0IG1BbmltQWNjZWw7Ci0gICAgbG9uZyBtQW5pbUxhc3RUaW1lOwotICAgIGJvb2xlYW4gbUFuaW1hdGluZ1JldmVhbCA9IGZhbHNlOwotICAgIGludCBtVmlld0RlbHRhOwotICAgIGludFtdIG1BYnNQb3MgPSBuZXcgaW50WzJdOwotCi0gICAgLy8gZm9yIGRpc2FibGluZyB0aGUgc3RhdHVzIGJhcgotICAgIGludCBtRGlzYWJsZWQgPSAwOwotCi0gICAgcHJpdmF0ZSBjbGFzcyBFeHBhbmRlZERpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0gICAgICAgIEV4cGFuZGVkRGlhbG9nKENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9MaWdodF9Ob1RpdGxlQmFyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaEtleUV2ZW50KEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBib29sZWFuIGRvd24gPSBldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTjsKLSAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0S2V5Q29kZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfQkFDSzoKLSAgICAgICAgICAgICAgICBpZiAoIWRvd24pIHsKLSAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoS2V5RXZlbnQoZXZlbnQpOwotICAgICAgICB9CisgICAgLyoqCisgICAgICogTm9ib2R5IGJpbmRzIHRvIHVzLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CiAgICAgICAgIC8vIEZpcnN0IHNldCB1cCBvdXIgdmlld3MgYW5kIHN0dWZmLgotICAgICAgICBtRGlzcGxheSA9ICgoV2luZG93TWFuYWdlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpKS5nZXREZWZhdWx0RGlzcGxheSgpOwotICAgICAgICBtYWtlU3RhdHVzQmFyVmlldyh0aGlzKTsKKyAgICAgICAgVmlldyBzYiA9IG1ha2VTdGF0dXNCYXJWaWV3KCk7CiAKICAgICAgICAgLy8gQ29ubmVjdCBpbiB0byB0aGUgc3RhdHVzIGJhciBtYW5hZ2VyIHNlcnZpY2UKICAgICAgICAgU3RhdHVzQmFySWNvbkxpc3QgaWNvbkxpc3QgPSBuZXcgU3RhdHVzQmFySWNvbkxpc3QoKTsKQEAgLTIzMSwxMzAyICsxMDEsMjIgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFB1dCB1cCB0aGUgdmlldwotICAgICAgICBhZGRTdGF0dXNCYXJWaWV3KCk7Ci0KLSAgICAgICAgLy8gTGFzdGx5LCBjYWxsIHRvIHRoZSBpY29uIHBvbGljeSB0byBpbnN0YWxsL3VwZGF0ZSBhbGwgdGhlIGljb25zLgotICAgICAgICBtSWNvblBvbGljeSA9IG5ldyBTdGF0dXNCYXJQb2xpY3kodGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgewotICAgICAgICAvLyB3ZSdyZSBuZXZlciBkZXN0cm95ZWQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb2JvZHkgYmluZHMgdG8gdXMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBDb25zdHJ1Y3RpbmcgdGhlIHZpZXcKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHByaXZhdGUgdm9pZCBtYWtlU3RhdHVzQmFyVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7Ci0KLSAgICAgICAgbUljb25TaXplID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN0YXR1c19iYXJfaWNvbl9zaXplKTsKLQotICAgICAgICBFeHBhbmRlZFZpZXcgZXhwYW5kZWQgPSAoRXhwYW5kZWRWaWV3KVZpZXcuaW5mbGF0ZShjb250ZXh0LAotICAgICAgICAgICAgICAgIFIubGF5b3V0LnN0YXR1c19iYXJfZXhwYW5kZWQsIG51bGwpOwotICAgICAgICBleHBhbmRlZC5tU2VydmljZSA9IHRoaXM7Ci0KLSAgICAgICAgU3RhdHVzQmFyVmlldyBzYiA9IChTdGF0dXNCYXJWaWV3KVZpZXcuaW5mbGF0ZShjb250ZXh0LCBSLmxheW91dC5zdGF0dXNfYmFyLCBudWxsKTsKLSAgICAgICAgc2IubVNlcnZpY2UgPSB0aGlzOwotCi0gICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hpY2ggcGl4ZWwtZm9ybWF0IHRvIHVzZSBmb3IgdGhlIHN0YXR1cyBiYXIuCi0gICAgICAgIG1QaXhlbEZvcm1hdCA9IFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UOwotICAgICAgICBEcmF3YWJsZSBiZyA9IHNiLmdldEJhY2tncm91bmQoKTsKLSAgICAgICAgaWYgKGJnICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QaXhlbEZvcm1hdCA9IGJnLmdldE9wYWNpdHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TdGF0dXNCYXJWaWV3ID0gc2I7Ci0gICAgICAgIG1TdGF0dXNJY29ucyA9IChMaW5lYXJMYXlvdXQpc2IuZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzSWNvbnMpOwotICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMgPSAoSWNvbk1lcmdlcilzYi5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25JY29ucyk7Ci0gICAgICAgIG1JY29ucyA9IChMaW5lYXJMYXlvdXQpc2IuZmluZFZpZXdCeUlkKFIuaWQuaWNvbnMpOwotICAgICAgICBtVGlja2VyVmlldyA9IHNiLmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlcik7Ci0gICAgICAgIG1EYXRlVmlldyA9IChEYXRlVmlldylzYi5maW5kVmlld0J5SWQoUi5pZC5kYXRlKTsKLQotICAgICAgICBtRXhwYW5kZWREaWFsb2cgPSBuZXcgRXhwYW5kZWREaWFsb2coY29udGV4dCk7Ci0gICAgICAgIG1FeHBhbmRlZFZpZXcgPSBleHBhbmRlZDsKLSAgICAgICAgbUV4cGFuZGVkQ29udGVudHMgPSBleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25MaW5lYXJMYXlvdXQpOwotICAgICAgICBtT25nb2luZ1RpdGxlID0gKFRleHRWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm9uZ29pbmdUaXRsZSk7Ci0gICAgICAgIG1PbmdvaW5nSXRlbXMgPSAoTGluZWFyTGF5b3V0KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm9uZ29pbmdJdGVtcyk7Ci0gICAgICAgIG1MYXRlc3RUaXRsZSA9IChUZXh0VmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5sYXRlc3RUaXRsZSk7Ci0gICAgICAgIG1MYXRlc3RJdGVtcyA9IChMaW5lYXJMYXlvdXQpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubGF0ZXN0SXRlbXMpOwotICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUgPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubm9Ob3RpZmljYXRpb25zVGl0bGUpOwotICAgICAgICBtQ2xlYXJCdXR0b24gPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQuY2xlYXJfYWxsX2J1dHRvbik7Ci0gICAgICAgIG1DbGVhckJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUNsZWFyQnV0dG9uTGlzdGVuZXIpOwotICAgICAgICBtU2Nyb2xsVmlldyA9IChTY3JvbGxWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLnNjcm9sbCk7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQgPSBleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25MaW5lYXJMYXlvdXQpOwotCi0gICAgICAgIG1PbmdvaW5nVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgIG1UaWNrZXIgPSBuZXcgTXlUaWNrZXIoY29udGV4dCwgc2IpOwotCi0gICAgICAgIFRpY2tlclZpZXcgdGlja2VyVmlldyA9IChUaWNrZXJWaWV3KXNiLmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlclRleHQpOwotICAgICAgICB0aWNrZXJWaWV3Lm1UaWNrZXIgPSBtVGlja2VyOwotCi0gICAgICAgIG1UcmFja2luZ1ZpZXcgPSAoVHJhY2tpbmdWaWV3KVZpZXcuaW5mbGF0ZShjb250ZXh0LCBSLmxheW91dC5zdGF0dXNfYmFyX3RyYWNraW5nLCBudWxsKTsKLSAgICAgICAgbVRyYWNraW5nVmlldy5tU2VydmljZSA9IHRoaXM7Ci0gICAgICAgIG1DbG9zZVZpZXcgPSAoQ2xvc2VEcmFnSGFuZGxlKW1UcmFja2luZ1ZpZXcuZmluZFZpZXdCeUlkKFIuaWQuY2xvc2UpOwotICAgICAgICBtQ2xvc2VWaWV3Lm1TZXJ2aWNlID0gdGhpczsKLQotICAgICAgICBtRWRnZUJvcmRlciA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5zdGF0dXNfYmFyX2VkZ2VfaWdub3JlKTsKLQotICAgICAgICAvLyB0aGUgbW9yZSBub3RpZmljYXRpb25zIGljb24KLSAgICAgICAgU3RhdHVzQmFySWNvblZpZXcgbW9yZVZpZXcgPSBuZXcgU3RhdHVzQmFySWNvblZpZXcodGhpcywgIm1vcmUiKTsKLSAgICAgICAgbW9yZVZpZXcuc2V0KG5ldyBTdGF0dXNCYXJJY29uKG51bGwsIFIuZHJhd2FibGUuc3RhdF9ub3RpZnlfbW9yZSwgMCkpOwotICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuYWRkTW9yZVZpZXcobW9yZVZpZXcsCi0gICAgICAgICAgICAgICAgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMobUljb25TaXplLCBtSWNvblNpemUpKTsKLQotICAgICAgICAvLyBzZXQgdGhlIGluaXRhbCB2aWV3IHZpc2liaWxpdHkKLSAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7Ci0gICAgICAgIG1EYXRlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLQotICAgICAgICAvLyByZWNlaXZlIGJyb2FkY2FzdHMKLSAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9DTE9TRV9TWVNURU1fRElBTE9HUyk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9TQ1JFRU5fT0ZGKTsKLSAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1Ccm9hZGNhc3RSZWNlaXZlciwgZmlsdGVyKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTdGF0dXNCYXJWaWV3KCkgewotICAgICAgICBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKICAgICAgICAgZmluYWwgaW50IGhlaWdodD0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN0YXR1c19iYXJfaGVpZ2h0KTsKIAotICAgICAgICBmaW5hbCBTdGF0dXNCYXJWaWV3IHZpZXcgPSBtU3RhdHVzQmFyVmlldzsKLSAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCisgICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAogICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAogICAgICAgICAgICAgICAgIGhlaWdodCwKICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVIsCiAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFCiAgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19UT1VDSEFCTEVfV0hFTl9XQUtJTkcsCiAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQuUkdCWF84ODg4KTsKLSAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgICAgIGxwLmdyYXZpdHkgPSBnZXRTdGF0dXNCYXJHcmF2aXR5KCk7CiAgICAgICAgIGxwLnNldFRpdGxlKCJTdGF0dXNCYXIiKTsKICAgICAgICAgLy8gVE9ETyBscC53aW5kb3dBbmltYXRpb25zID0gUi5zdHlsZS5BbmltYXRpb25fU3RhdHVzQmFyOworICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhzYiwgbHApOwogCi0gICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5hZGRWaWV3KHZpZXcsIGxwKTsKKyAgICAgICAgU2xvZy5kKFRBRywgIkFkZGVkIHN0YXR1cyBiYXIgdmlldyB3LyBncmF2aXR5IDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobHAuZ3Jhdml0eSkpOwogICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwgU3RhdHVzQmFySWNvbiBpY29uKSB7Ci0gICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiYWRkSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXggKyAiIHZpZXdJbmRleD0iICsgdmlld0luZGV4Ci0gICAgICAgICAgICAgICAgKyAiIGljb249IiArIGljb24pOwotICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsIHNsb3QpOwotICAgICAgICB2aWV3LnNldChpY29uKTsKLSAgICAgICAgbVN0YXR1c0ljb25zLmFkZFZpZXcodmlldywgdmlld0luZGV4LCBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyhtSWNvblNpemUsIG1JY29uU2l6ZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwKLSAgICAgICAgICAgIFN0YXR1c0Jhckljb24gb2xkLCBTdGF0dXNCYXJJY29uIGljb24pIHsKLSAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJ1cGRhdGVJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleCArICIgdmlld0luZGV4PSIgKyB2aWV3SW5kZXgKLSAgICAgICAgICAgICAgICArICIgb2xkPSIgKyBvbGQgKyAiIGljb249IiArIGljb24pOwotICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gKFN0YXR1c0Jhckljb25WaWV3KW1TdGF0dXNJY29ucy5nZXRDaGlsZEF0KHZpZXdJbmRleCk7Ci0gICAgICAgIHZpZXcuc2V0KGljb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCkgewotICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInJlbW92ZUljb24gc2xvdD0iICsgc2xvdCArICIgaW5kZXg9IiArIGluZGV4ICsgIiB2aWV3SW5kZXg9IiArIHZpZXdJbmRleCk7Ci0gICAgICAgIG1TdGF0dXNJY29ucy5yZW1vdmVWaWV3QXQodmlld0luZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGROb3RpZmljYXRpb24oSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgYm9vbGVhbiBzaG91bGRUaWNrID0gdHJ1ZTsKLSAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZnVsbFNjcmVlbkludGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzaG91bGRUaWNrID0gZmFsc2U7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAiTm90aWZpY2F0aW9uIGhhcyBmdWxsU2NyZWVuSW50ZW50OyBzZW5kaW5nIGZ1bGxTY3JlZW5JbnRlbnQiKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5mdWxsU2NyZWVuSW50ZW50LnNlbmQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9IAotCi0gICAgICAgIFN0YXR1c0Jhckljb25WaWV3IGljb25WaWV3ID0gYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5LCBub3RpZmljYXRpb24pOwotICAgICAgICBpZiAoaWNvblZpZXcgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIGlmIChzaG91bGRUaWNrKSB7Ci0gICAgICAgICAgICB0aWNrKG5vdGlmaWNhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2xpZGluZyB3aW5kb3dzIGFuZCB0aGUgdGl0bGVzLgotICAgICAgICBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKTsKLSAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0xFQVZFX0FMT05FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVOb3RpZmljYXRpb24oSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZU5vdGlmaWNhdGlvbiBrZXk9IiArIGtleSArICIgbm90aWZpY2F0aW9uPSIgKyBub3RpZmljYXRpb24pOwotCi0gICAgICAgIE5vdGlmaWNhdGlvbkRhdGEgb2xkTGlzdDsKLSAgICAgICAgaW50IG9sZEluZGV4ID0gbU9uZ29pbmcuZmluZEVudHJ5KGtleSk7Ci0gICAgICAgIGlmIChvbGRJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBvbGRMaXN0ID0gbU9uZ29pbmc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvbGRJbmRleCA9IG1MYXRlc3QuZmluZEVudHJ5KGtleSk7Ci0gICAgICAgICAgICBpZiAob2xkSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInVwZGF0ZU5vdGlmaWNhdGlvbiBmb3IgdW5rbm93biBrZXk6ICIgKyBrZXkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9sZExpc3QgPSBtTGF0ZXN0OwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE5vdGlmaWNhdGlvbkRhdGEuRW50cnkgb2xkRW50cnkgPSBvbGRMaXN0LmdldEVudHJ5QXQob2xkSW5kZXgpOwotICAgICAgICBmaW5hbCBTdGF0dXNCYXJOb3RpZmljYXRpb24gb2xkTm90aWZpY2F0aW9uID0gb2xkRW50cnkubm90aWZpY2F0aW9uOwotICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBvbGRDb250ZW50VmlldyA9IG9sZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudFZpZXc7Ci0KLSAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgY29udGVudFZpZXcgPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRWaWV3OwotCi0gICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9sZCBub3RpZmljYXRpb246IHdoZW49IiArIG9sZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbgotICAgICAgICAgICAgICAgICAgICArICIgb25nb2luZz0iICsgb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCi0gICAgICAgICAgICAgICAgICAgICsgIiBleHBhbmRlZD0iICsgb2xkRW50cnkuZXhwYW5kZWQKLSAgICAgICAgICAgICAgICAgICAgKyAiIGNvbnRlbnRWaWV3PSIgKyBvbGRDb250ZW50Vmlldyk7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAibmV3IG5vdGlmaWNhdGlvbjogd2hlbj0iICsgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCi0gICAgICAgICAgICAgICAgICAgICsgIiBvbmdvaW5nPSIgKyBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIGNvbnRlbnRWaWV3PSIgKyBjb250ZW50Vmlldyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDYW4gd2UganVzdCByZWFwcGx5IHRoZSBSZW1vdGVWaWV3cyBpbiBwbGFjZT8gIElmIHdoZW4gZGlkbid0IGNoYW5nZSwgdGhlIG9yZGVyCi0gICAgICAgIC8vIGRpZG4ndCBjaGFuZ2UuCi0gICAgICAgIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4gPT0gb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCi0gICAgICAgICAgICAgICAgJiYgbm90aWZpY2F0aW9uLmlzT25nb2luZygpID09IG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQotICAgICAgICAgICAgICAgICYmIG9sZEVudHJ5LmV4cGFuZGVkICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBjb250ZW50VmlldyAhPSBudWxsICYmIG9sZENvbnRlbnRWaWV3ICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBjb250ZW50Vmlldy5nZXRQYWNrYWdlKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0UGFja2FnZSgpLmVxdWFscyhjb250ZW50Vmlldy5nZXRQYWNrYWdlKCkpCi0gICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0TGF5b3V0SWQoKSA9PSBjb250ZW50Vmlldy5nZXRMYXlvdXRJZCgpKSB7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInJldXNpbmcgbm90aWZpY2F0aW9uIik7Ci0gICAgICAgICAgICBvbGRFbnRyeS5ub3RpZmljYXRpb24gPSBub3RpZmljYXRpb247Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzCi0gICAgICAgICAgICAgICAgY29udGVudFZpZXcucmVhcHBseSh0aGlzLCBvbGRFbnRyeS5jb250ZW50KTsKLSAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGNvbnRlbnRJbnRlbnQKLSAgICAgICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IGNvbnRlbnRJbnRlbnQgPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRJbnRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBvbGRFbnRyeS5jb250ZW50LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgTGF1bmNoZXIoY29udGVudEludGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnBrZywgbm90aWZpY2F0aW9uLnRhZywgbm90aWZpY2F0aW9uLmlkKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgaWNvbi4KLSAgICAgICAgICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uIGljID0gbmV3IFN0YXR1c0Jhckljb24obm90aWZpY2F0aW9uLnBrZywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbiwgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLm51bWJlcik7Ci0gICAgICAgICAgICAgICAgaWYgKCFvbGRFbnRyeS5pY29uLnNldChpYykpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZG4ndCB1cGRhdGUgaWNvbjogIiArIGljKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBJdCBmYWlsZWQgdG8gYWRkIGNsZWFubHkuICBMb2csIGFuZCByZW1vdmUgdGhlIHZpZXcgZnJvbSB0aGUgcGFuZWwuCi0gICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkNvdWxkbid0IHJlYXBwbHkgdmlld3MgZm9yIHBhY2thZ2UgIiArIGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSwgZSk7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKLSAgICAgICAgICAgICAgICBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIm5vdCByZXVzaW5nIG5vdGlmaWNhdGlvbiIpOwotICAgICAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKLSAgICAgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlc3RhcnQgdGhlIHRpY2tlciBpZiBpdCdzIHN0aWxsIHJ1bm5pbmcKLSAgICAgICAgdGljayhub3RpZmljYXRpb24pOwotCi0gICAgICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2xpZGluZyB3aW5kb3dzIGFuZCB0aGUgdGl0bGVzLgotICAgICAgICBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKTsKLSAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0xFQVZFX0FMT05FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVOb3RpZmljYXRpb24oSUJpbmRlciBrZXkpIHsKLSAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJyZW1vdmVOb3RpZmljYXRpb24ga2V5PSIgKyBrZXkpOwotICAgICAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gb2xkID0gcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKLQotICAgICAgICBpZiAob2xkICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIENhbmNlbCB0aGUgdGlja2VyIGlmIGl0J3Mgc3RpbGwgcnVubmluZwotICAgICAgICAgICAgbVRpY2tlci5yZW1vdmVFbnRyeShvbGQpOwotCi0gICAgICAgICAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHNsaWRpbmcgd2luZG93cyBhbmQgdGhlIHRpdGxlcy4KLSAgICAgICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOwotICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0xFQVZFX0FMT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNob29zZUljb25JbmRleChib29sZWFuIGlzT25nb2luZywgaW50IHZpZXdJbmRleCkgewotICAgICAgICBmaW5hbCBpbnQgbGF0ZXN0U2l6ZSA9IG1MYXRlc3Quc2l6ZSgpOwotICAgICAgICBpZiAoaXNPbmdvaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGF0ZXN0U2l6ZSArIChtT25nb2luZy5zaXplKCkgLSB2aWV3SW5kZXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGxhdGVzdFNpemUgLSB2aWV3SW5kZXg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBWaWV3W10gbWFrZU5vdGlmaWNhdGlvblZpZXcoU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICBOb3RpZmljYXRpb24gbiA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb247Ci0gICAgICAgIFJlbW90ZVZpZXdzIHJlbW90ZVZpZXdzID0gbi5jb250ZW50VmlldzsKLSAgICAgICAgaWYgKHJlbW90ZVZpZXdzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSByb3cgdmlldwotICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOwotICAgICAgICBWaWV3IHJvdyA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnQsIHBhcmVudCwgZmFsc2UpOwotCi0gICAgICAgIC8vIGJpbmQgdGhlIGNsaWNrIGV2ZW50IHRvIHRoZSBjb250ZW50IGFyZWEKLSAgICAgICAgVmlld0dyb3VwIGNvbnRlbnQgPSAoVmlld0dyb3VwKXJvdy5maW5kVmlld0J5SWQoUi5pZC5jb250ZW50KTsKLSAgICAgICAgY29udGVudC5zZXREZXNjZW5kYW50Rm9jdXNhYmlsaXR5KFZpZXdHcm91cC5GT0NVU19CTE9DS19ERVNDRU5EQU5UUyk7Ci0gICAgICAgIGNvbnRlbnQuc2V0T25Gb2N1c0NoYW5nZUxpc3RlbmVyKG1Gb2N1c0NoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgUGVuZGluZ0ludGVudCBjb250ZW50SW50ZW50ID0gbi5jb250ZW50SW50ZW50OwotICAgICAgICBpZiAoY29udGVudEludGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZW50LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgTGF1bmNoZXIoY29udGVudEludGVudCwgbm90aWZpY2F0aW9uLnBrZywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi50YWcsIG5vdGlmaWNhdGlvbi5pZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmlldyBleHBhbmRlZCA9IG51bGw7Ci0gICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhwYW5kZWQgPSByZW1vdGVWaWV3cy5hcHBseSh0aGlzLCBjb250ZW50KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBleGNlcHRpb24gPSBlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChleHBhbmRlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaWRlbnQgPSBub3RpZmljYXRpb24ucGtnICsgIi8weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG5vdGlmaWNhdGlvbi5pZCk7Ci0gICAgICAgICAgICBTbG9nLmUoVEFHLCAiY291bGRuJ3QgaW5mbGF0ZSB2aWV3IGZvciBub3RpZmljYXRpb24gIiArIGlkZW50LCBleGNlcHRpb24pOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb250ZW50LmFkZFZpZXcoZXhwYW5kZWQpOwotICAgICAgICAgICAgcm93LnNldERyYXdpbmdDYWNoZUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFZpZXdbXSB7IHJvdywgY29udGVudCwgZXhwYW5kZWQgfTsKLSAgICB9Ci0KLSAgICBTdGF0dXNCYXJJY29uVmlldyBhZGROb3RpZmljYXRpb25WaWV3cyhJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotICAgICAgICBOb3RpZmljYXRpb25EYXRhIGxpc3Q7Ci0gICAgICAgIFZpZXdHcm91cCBwYXJlbnQ7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNPbmdvaW5nID0gbm90aWZpY2F0aW9uLmlzT25nb2luZygpOwotICAgICAgICBpZiAoaXNPbmdvaW5nKSB7Ci0gICAgICAgICAgICBsaXN0ID0gbU9uZ29pbmc7Ci0gICAgICAgICAgICBwYXJlbnQgPSBtT25nb2luZ0l0ZW1zOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGlzdCA9IG1MYXRlc3Q7Ci0gICAgICAgICAgICBwYXJlbnQgPSBtTGF0ZXN0SXRlbXM7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBleHBhbmRlZCB2aWV3LgotICAgICAgICBmaW5hbCBWaWV3W10gdmlld3MgPSBtYWtlTm90aWZpY2F0aW9uVmlldyhub3RpZmljYXRpb24sIHBhcmVudCk7Ci0gICAgICAgIGlmICh2aWV3cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IGV4cGFuZCBSZW1vdGVWaWV3cyBmb3I6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBub3RpZmljYXRpb24pOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgVmlldyByb3cgPSB2aWV3c1swXTsKLSAgICAgICAgZmluYWwgVmlldyBjb250ZW50ID0gdmlld3NbMV07Ci0gICAgICAgIGZpbmFsIFZpZXcgZXhwYW5kZWQgPSB2aWV3c1syXTsKLSAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBpY29uLgotICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uVmlldyBpY29uVmlldyA9IG5ldyBTdGF0dXNCYXJJY29uVmlldyh0aGlzLAotICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5wa2cgKyAiLzB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobm90aWZpY2F0aW9uLmlkKSk7Ci0gICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb24gaWMgPSBuZXcgU3RhdHVzQmFySWNvbihub3RpZmljYXRpb24ucGtnLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb24sCi0gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbkxldmVsLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLm51bWJlcik7Ci0gICAgICAgIGlmICghaWNvblZpZXcuc2V0KGljKSkgewotICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZGluZyBjcmVhdGUgaWNvbjogIiArIGljKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIC8vIEFkZCB0aGUgZXhwYW5kZWQgdmlldy4KLSAgICAgICAgZmluYWwgaW50IHZpZXdJbmRleCA9IGxpc3QuYWRkKGtleSwgbm90aWZpY2F0aW9uLCByb3csIGNvbnRlbnQsIGV4cGFuZGVkLCBpY29uVmlldyk7Ci0gICAgICAgIHBhcmVudC5hZGRWaWV3KHJvdywgdmlld0luZGV4KTsKLSAgICAgICAgLy8gQWRkIHRoZSBpY29uLgotICAgICAgICBmaW5hbCBpbnQgaWNvbkluZGV4ID0gY2hvb3NlSWNvbkluZGV4KGlzT25nb2luZywgdmlld0luZGV4KTsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLmFkZFZpZXcoaWNvblZpZXcsIGljb25JbmRleCwKLSAgICAgICAgICAgICAgICBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyhtSWNvblNpemUsIG1JY29uU2l6ZSkpOwotICAgICAgICByZXR1cm4gaWNvblZpZXc7Ci0gICAgfQotCi0gICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKElCaW5kZXIga2V5KSB7Ci0gICAgICAgIE5vdGlmaWNhdGlvbkRhdGEuRW50cnkgZW50cnkgPSBtT25nb2luZy5yZW1vdmUoa2V5KTsKLSAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgIGVudHJ5ID0gbUxhdGVzdC5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlbW92ZU5vdGlmaWNhdGlvbiBmb3IgdW5rbm93biBrZXk6ICIgKyBrZXkpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFJlbW92ZSB0aGUgZXhwYW5kZWQgdmlldy4KLSAgICAgICAgKChWaWV3R3JvdXApZW50cnkucm93LmdldFBhcmVudCgpKS5yZW1vdmVWaWV3KGVudHJ5LnJvdyk7Ci0gICAgICAgIC8vIFJlbW92ZSB0aGUgaWNvbi4KLSAgICAgICAgKChWaWV3R3JvdXApZW50cnkuaWNvbi5nZXRQYXJlbnQoKSkucmVtb3ZlVmlldyhlbnRyeS5pY29uKTsKLQotICAgICAgICByZXR1cm4gZW50cnkubm90aWZpY2F0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKSB7Ci0gICAgICAgIGJvb2xlYW4gb25nb2luZyA9IG1PbmdvaW5nLmhhc1Zpc2libGVJdGVtcygpOwotICAgICAgICBib29sZWFuIGxhdGVzdCA9IG1MYXRlc3QuaGFzVmlzaWJsZUl0ZW1zKCk7Ci0KLSAgICAgICAgLy8gKG5vIG9uZ29pbmcgbm90aWZpY2F0aW9ucyBhcmUgY2xlYXJhYmxlKQotICAgICAgICBpZiAobUxhdGVzdC5oYXNDbGVhcmFibGVJdGVtcygpKSB7Ci0gICAgICAgICAgICBtQ2xlYXJCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNsZWFyQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbU9uZ29pbmdUaXRsZS5zZXRWaXNpYmlsaXR5KG9uZ29pbmcgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VmlzaWJpbGl0eShsYXRlc3QgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotCi0gICAgICAgIGlmIChvbmdvaW5nIHx8IGxhdGVzdCkgewotICAgICAgICAgICAgbU5vTm90aWZpY2F0aW9uc1RpdGxlLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFN0YXRlIGlzIG9uZSBvciBtb3JlIG9mIHRoZSBESVNBQkxFIGNvbnN0YW50cyBmcm9tIFN0YXR1c0Jhck1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzYWJsZShpbnQgc3RhdGUpIHsKLSAgICAgICAgZmluYWwgaW50IG9sZCA9IG1EaXNhYmxlZDsKLSAgICAgICAgZmluYWwgaW50IGRpZmYgPSBzdGF0ZSBeIG9sZDsKLSAgICAgICAgbURpc2FibGVkID0gc3RhdGU7Ci0KLSAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgewotICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9FWFBBTkQ6IHllcyIpOwotICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKLSAgICAgICAgICAgIGlmICgoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiB5ZXMiKTsKLSAgICAgICAgICAgICAgICBpZiAobVRpY2tpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRpY2tlci5oYWx0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkoZmFsc2UsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX291dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IG5vIik7Ci0gICAgICAgICAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgewotICAgICAgICAgICAgaWYgKG1UaWNraW5nICYmIChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUjogeWVzIik7Ci0gICAgICAgICAgICAgICAgbVRpY2tlci5oYWx0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGwgY2hhbmdlcyB0byB0aGUgc3RhdHVzIGJhciBhbmQgbm90aWZpY2F0aW9ucyBmdW5uZWwgdGhyb3VnaCBoZXJlIGFuZCBhcmUgYmF0Y2hlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIEggZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG0pIHsKLSAgICAgICAgICAgIHN3aXRjaCAobS53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfQU5JTUFURToKLSAgICAgICAgICAgICAgICAgICAgZG9BbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfQU5JTUFURV9SRVZFQUw6Ci0gICAgICAgICAgICAgICAgICAgIGRvUmV2ZWFsQW5pbWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgVmlldy5PbkZvY3VzQ2hhbmdlTGlzdGVuZXIgbUZvY3VzQ2hhbmdlTGlzdGVuZXIgPSBuZXcgVmlldy5PbkZvY3VzQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uRm9jdXNDaGFuZ2UoVmlldyB2LCBib29sZWFuIGhhc0ZvY3VzKSB7Ci0gICAgICAgICAgICAvLyBCZWNhdXNlICd2JyBpcyBhIFZpZXdHcm91cCwgYWxsIGl0cyBjaGlsZHJlbiB3aWxsIGJlICh1bilzZWxlY3RlZAotICAgICAgICAgICAgLy8gdG9vLCB3aGljaCBhbGxvd3MgbWFycXVlZWluZyB0byB3b3JrLgotICAgICAgICAgICAgdi5zZXRTZWxlY3RlZChoYXNGb2N1cyk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSB2b2lkIG1ha2VFeHBhbmRlZFZpc2libGUoKSB7Ci0gICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiTWFrZSBleHBhbmRlZCB2aXNpYmxlOiBleHBhbmRlZCB2aXNpYmxlPSIgKyBtRXhwYW5kZWRWaXNpYmxlKTsKLSAgICAgICAgaWYgKG1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtRXhwYW5kZWRWaXNpYmxlID0gdHJ1ZTsKLSAgICAgICAgdmlzaWJpbGl0eUNoYW5nZWQodHJ1ZSk7Ci0KLSAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0xFQVZFX0FMT05FKTsKLSAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzICY9IH5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEU7Ci0gICAgICAgIG1FeHBhbmRlZFBhcmFtcy5mbGFncyB8PSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU07Ci0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7Ci0gICAgICAgIG1FeHBhbmRlZFZpZXcucmVxdWVzdEZvY3VzKFZpZXcuRk9DVVNfRk9SV0FSRCk7Ci0gICAgICAgIG1UcmFja2luZ1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgIGlmICghbVRpY2tpbmcpIHsKLSAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhbmltYXRlRXhwYW5kKCkgewotICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIkFuaW1hdGUgZXhwYW5kOiBleHBhbmRlZD0iICsgbUV4cGFuZGVkKTsKLSAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRXhwYW5kZWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHByZXBhcmVUcmFja2luZygwLCB0cnVlKTsKLSAgICAgICAgcGVyZm9ybUZsaW5nKDAsIDIwMDAuMGYsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFuaW1hdGVDb2xsYXBzZSgpIHsKLSAgICAgICAgaWYgKFNQRVcpIHsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJhbmltYXRlQ29sbGFwc2UoKTogbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCi0gICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbWF0aW5nPSIgKyBtQW5pbWF0aW5nCi0gICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbVk9IiArIG1BbmltWQotICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1WZWw9IiArIG1BbmltVmVsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHk7Ci0gICAgICAgIGlmIChtQW5pbWF0aW5nKSB7Ci0gICAgICAgICAgICB5ID0gKGludCltQW5pbVk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB5ID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCktMTsKLSAgICAgICAgfQotICAgICAgICAvLyBMZXQgdGhlIGZsaW5nIHRoaW5rIHRoYXQgd2UncmUgb3BlbiBzbyBpdCBnb2VzIGluIHRoZSByaWdodCBkaXJlY3Rpb24KLSAgICAgICAgLy8gYW5kIGRvZXNuJ3QgdHJ5IHRvIHJlLW9wZW4gdGhlIHdpbmRvd3NoYWRlLgotICAgICAgICBtRXhwYW5kZWQgPSB0cnVlOwotICAgICAgICBwcmVwYXJlVHJhY2tpbmcoeSwgZmFsc2UpOwotICAgICAgICBwZXJmb3JtRmxpbmcoeSwgLTIwMDAuMGYsIHRydWUpOwotICAgIH0KLQotICAgIHZvaWQgcGVyZm9ybUV4cGFuZCgpIHsKLSAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJwZXJmb3JtRXhwYW5kOiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZCk7Ci0gICAgICAgIGlmICgobURpc2FibGVkICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDsKLSAgICAgICAgfQotICAgICAgICBpZiAobUV4cGFuZGVkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtRXhwYW5kZWQgPSB0cnVlOwotICAgICAgICBtYWtlRXhwYW5kZWRWaXNpYmxlKCk7Ci0gICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9GVUxMX09QRU4pOwotCi0gICAgICAgIGlmIChmYWxzZSkgcG9zdFN0YXJ0VHJhY2luZygpOwotICAgIH0KLQotICAgIHZvaWQgcGVyZm9ybUNvbGxhcHNlKCkgewotICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInBlcmZvcm1Db2xsYXBzZTogbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKLSAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkVmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZQotICAgICAgICAgICAgICAgICsgIiBtVGlja2luZz0iICsgbVRpY2tpbmcpOwotCi0gICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1FeHBhbmRlZFZpc2libGUgPSBmYWxzZTsKLSAgICAgICAgdmlzaWJpbGl0eUNoYW5nZWQoZmFsc2UpOwotICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgfD0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFOwotICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgJj0gfldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTTsKLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKLSAgICAgICAgbVRyYWNraW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSA9PSAwKSB7Ci0gICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1EYXRlVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkoZmFsc2UsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX291dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1FeHBhbmRlZCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1FeHBhbmRlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgZG9BbmltYXRpb24oKSB7Ci0gICAgICAgIGlmIChtQW5pbWF0aW5nKSB7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgImRvQW5pbWF0aW9uIik7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgImRvQW5pbWF0aW9uIGJlZm9yZSBtQW5pbVk9IiArIG1BbmltWSk7Ci0gICAgICAgICAgICBpbmNyZW1lbnRBbmltKCk7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgImRvQW5pbWF0aW9uIGFmdGVyICBtQW5pbVk9IiArIG1BbmltWSk7Ci0gICAgICAgICAgICBpZiAobUFuaW1ZID49IG1EaXNwbGF5LmdldEhlaWdodCgpLTEpIHsKLSAgICAgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIkFuaW1hdGlvbiBjb21wbGV0ZWQgdG8gZXhwYW5kZWQgc3RhdGUuIik7Ci0gICAgICAgICAgICAgICAgbUFuaW1hdGluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9GVUxMX09QRU4pOwotICAgICAgICAgICAgICAgIHBlcmZvcm1FeHBhbmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG1BbmltWSA8IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJBbmltYXRpb24gY29tcGxldGVkIHRvIGNvbGxhcHNlZCBzdGF0ZS4iKTsKLSAgICAgICAgICAgICAgICBtQW5pbWF0aW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKDApOwotICAgICAgICAgICAgICAgIHBlcmZvcm1Db2xsYXBzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKLSAgICAgICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSArPSBBTklNX0ZSQU1FX0RVUkFUSU9OOwotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEUpLCBtQ3VyQW5pbWF0aW9uVGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHN0b3BUcmFja2luZygpIHsKLSAgICAgICAgbVRyYWNraW5nID0gZmFsc2U7Ci0gICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOwotICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKLSAgICB9Ci0KLSAgICB2b2lkIGluY3JlbWVudEFuaW0oKSB7Ci0gICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIGZsb2F0IHQgPSAoKGZsb2F0KShub3cgLSBtQW5pbUxhc3RUaW1lKSkgLyAxMDAwOyAgICAgICAgICAgIC8vIG1zIC0+IHMKLSAgICAgICAgZmluYWwgZmxvYXQgeSA9IG1BbmltWTsKLSAgICAgICAgZmluYWwgZmxvYXQgdiA9IG1BbmltVmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHgvcwotICAgICAgICBmaW5hbCBmbG9hdCBhID0gbUFuaW1BY2NlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweC9zL3MKLSAgICAgICAgbUFuaW1ZID0geSArICh2KnQpICsgKDAuNWYqYSp0KnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHgKLSAgICAgICAgbUFuaW1WZWwgPSB2ICsgKGEqdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHgvcwotICAgICAgICBtQW5pbUxhc3RUaW1lID0gbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtcwotICAgICAgICAvL1Nsb2cuZChUQUcsICJ5PSIgKyB5ICsgIiB2PSIgKyB2ICsgIiBhPSIgKyBhICsgIiB0PSIgKyB0ICsgIiBtQW5pbVk9IiArIG1BbmltWQotICAgICAgICAvLyAgICAgICAgKyAiIG1BbmltQWNjZWw9IiArIG1BbmltQWNjZWwpOwotICAgIH0KLQotICAgIHZvaWQgZG9SZXZlYWxBbmltYXRpb24oKSB7Ci0gICAgICAgIGZpbmFsIGludCBoID0gbUNsb3NlVmlldy5nZXRIZWlnaHQoKSArIG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOwotICAgICAgICBpZiAobUFuaW1hdGluZ1JldmVhbCAmJiBtQW5pbWF0aW5nICYmIG1BbmltWSA8IGgpIHsKLSAgICAgICAgICAgIGluY3JlbWVudEFuaW0oKTsKLSAgICAgICAgICAgIGlmIChtQW5pbVkgPj0gaCkgewotICAgICAgICAgICAgICAgIG1BbmltWSA9IGg7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKLSAgICAgICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSArPSBBTklNX0ZSQU1FX0RVUkFUSU9OOwotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEVfUkVWRUFMKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcHJlcGFyZVRyYWNraW5nKGludCB5LCBib29sZWFuIG9wZW5pbmcpIHsKLSAgICAgICAgbVRyYWNraW5nID0gdHJ1ZTsKLSAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IFZlbG9jaXR5VHJhY2tlci5vYnRhaW4oKTsKLSAgICAgICAgaWYgKG9wZW5pbmcpIHsKLSAgICAgICAgICAgIG1BbmltQWNjZWwgPSAyMDAwLjBmOwotICAgICAgICAgICAgbUFuaW1WZWwgPSAyMDA7Ci0gICAgICAgICAgICBtQW5pbVkgPSBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKTsKLSAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcygoaW50KW1BbmltWSk7Ci0gICAgICAgICAgICBtQW5pbWF0aW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIG1BbmltYXRpbmdSZXZlYWwgPSB0cnVlOwotICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEUpOwotICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEVfUkVWRUFMKTsKLSAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtQW5pbUxhc3RUaW1lID0gbm93OwotICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUgPSBub3cgKyBBTklNX0ZSQU1FX0RVUkFUSU9OOwotICAgICAgICAgICAgbUFuaW1hdGluZyA9IHRydWU7Ci0gICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BTklNQVRFX1JFVkVBTCksCi0gICAgICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lKTsKLSAgICAgICAgICAgIG1ha2VFeHBhbmRlZFZpc2libGUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGl0J3Mgb3BlbiwgY2xvc2UgaXQ/Ci0gICAgICAgICAgICBpZiAobUFuaW1hdGluZykgewotICAgICAgICAgICAgICAgIG1BbmltYXRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoeSArIG1WaWV3RGVsdGEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwZXJmb3JtRmxpbmcoaW50IHksIGZsb2F0IHZlbCwgYm9vbGVhbiBhbHdheXMpIHsKLSAgICAgICAgbUFuaW1hdGluZ1JldmVhbCA9IGZhbHNlOwotICAgICAgICBtRGlzcGxheUhlaWdodCA9IG1EaXNwbGF5LmdldEhlaWdodCgpOwotCi0gICAgICAgIG1BbmltWSA9IHk7Ci0gICAgICAgIG1BbmltVmVsID0gdmVsOwotCi0gICAgICAgIC8vU2xvZy5kKFRBRywgInN0YXJ0aW5nIHdpdGggbUFuaW1ZPSIgKyBtQW5pbVkgKyAiIG1BbmltVmVsPSIgKyBtQW5pbVZlbCk7Ci0KLSAgICAgICAgaWYgKG1FeHBhbmRlZCkgewotICAgICAgICAgICAgaWYgKCFhbHdheXMgJiYgKAotICAgICAgICAgICAgICAgICAgICB2ZWwgPiAyMDAuMGYKLSAgICAgICAgICAgICAgICAgICAgfHwgKHkgPiAobURpc3BsYXlIZWlnaHQtMjUpICYmIHZlbCA+IC0yMDAuMGYpKSkgewotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBleHBhbmRlZCwgYnV0IHRoZXkgZGlkbid0IG1vdmUgc3VmZmljaWVudGx5IHRvIGNhdXNlCi0gICAgICAgICAgICAgICAgLy8gdXMgdG8gcmV0cmFjdC4gIEFuaW1hdGUgYmFjayB0byB0aGUgZXhwYW5kZWQgcG9zaXRpb24uCi0gICAgICAgICAgICAgICAgbUFuaW1BY2NlbCA9IDIwMDAuMGY7Ci0gICAgICAgICAgICAgICAgaWYgKHZlbCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBleHBhbmRlZCBhbmQgYXJlIG5vdyBnb2luZyB0byBhbmltYXRlIGF3YXkuCi0gICAgICAgICAgICAgICAgbUFuaW1BY2NlbCA9IC0yMDAwLjBmOwotICAgICAgICAgICAgICAgIGlmICh2ZWwgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmltVmVsID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYWx3YXlzIHx8ICgKLSAgICAgICAgICAgICAgICAgICAgdmVsID4gMjAwLjBmCi0gICAgICAgICAgICAgICAgICAgIHx8ICh5ID4gKG1EaXNwbGF5SGVpZ2h0LzIpICYmIHZlbCA+IC0yMDAuMGYpKSkgewotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBjb2xsYXBzZWQsIGFuZCB0aGV5IG1vdmVkIGVub3VnaCB0byBhbGxvdyB1cyB0bwotICAgICAgICAgICAgICAgIC8vIGV4cGFuZC4gIEFuaW1hdGUgaW4gdGhlIG5vdGlmaWNhdGlvbnMuCi0gICAgICAgICAgICAgICAgbUFuaW1BY2NlbCA9IDIwMDAuMGY7Ci0gICAgICAgICAgICAgICAgaWYgKHZlbCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBjb2xsYXBzZWQsIGJ1dCB0aGV5IGRpZG4ndCBtb3ZlIHN1ZmZpY2llbnRseSB0byBjYXVzZQotICAgICAgICAgICAgICAgIC8vIHVzIHRvIHJldHJhY3QuICBBbmltYXRlIGJhY2sgdG8gdGhlIGNvbGxhcHNlZCBwb3NpdGlvbi4KLSAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gLTIwMDAuMGY7Ci0gICAgICAgICAgICAgICAgaWYgKHZlbCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL1Nsb2cuZChUQUcsICJtQW5pbVk9IiArIG1BbmltWSArICIgbUFuaW1WZWw9IiArIG1BbmltVmVsCi0gICAgICAgIC8vICAgICAgICArICIgbUFuaW1BY2NlbD0iICsgbUFuaW1BY2NlbCk7Ci0KLSAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbUFuaW1MYXN0VGltZSA9IG5vdzsKLSAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUgPSBub3cgKyBBTklNX0ZSQU1FX0RVUkFUSU9OOwotICAgICAgICBtQW5pbWF0aW5nID0gdHJ1ZTsKLSAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEUpOwotICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURV9SRVZFQUwpOwotICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BTklNQVRFKSwgbUN1ckFuaW1hdGlvblRpbWUpOwotICAgICAgICBzdG9wVHJhY2tpbmcoKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGludGVyY2VwdFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKFNQRVcpIHsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJUb3VjaDogcmF3WT0iICsgZXZlbnQuZ2V0UmF3WSgpICsgIiBldmVudD0iICsgZXZlbnQgKyAiIG1EaXNhYmxlZD0iCi0gICAgICAgICAgICAgICAgKyBtRGlzYWJsZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBpbnQgc3RhdHVzQmFyU2l6ZSA9IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOwotICAgICAgICBmaW5hbCBpbnQgaGl0U2l6ZSA9IHN0YXR1c0JhclNpemUqMjsKLSAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgeSA9IChpbnQpZXZlbnQuZ2V0UmF3WSgpOwotCi0gICAgICAgICAgICBpZiAoIW1FeHBhbmRlZCkgewotICAgICAgICAgICAgICAgIG1WaWV3RGVsdGEgPSBzdGF0dXNCYXJTaXplIC0geTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVRyYWNraW5nVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKG1BYnNQb3MpOwotICAgICAgICAgICAgICAgIG1WaWV3RGVsdGEgPSBtQWJzUG9zWzFdICsgbVRyYWNraW5nVmlldy5nZXRIZWlnaHQoKSAtIHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKCFtRXhwYW5kZWQgJiYgeSA8IGhpdFNpemUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChtRXhwYW5kZWQgJiYgeSA+IChtRGlzcGxheS5nZXRIZWlnaHQoKS1oaXRTaXplKSkpIHsKLQotICAgICAgICAgICAgICAgIC8vIFdlIGRyb3AgZXZlbnRzIGF0IHRoZSBlZGdlIG9mIHRoZSBzY3JlZW4gdG8gbWFrZSB0aGUgd2luZG93c2hhZGUgY29tZQotICAgICAgICAgICAgICAgIC8vIGRvd24gYnkgYWNjaWRlbnQgbGVzcywgZXNwZWNpYWxseSB3aGVuIHB1c2hpbmcgb3BlbiBhIGRldmljZSB3aXRoIGEga2V5Ym9hcmQKLSAgICAgICAgICAgICAgICAvLyB0aGF0IHJvdGF0ZXMgKGxpa2UgZzEgYW5kIGRyb2lkKQotICAgICAgICAgICAgICAgIGludCB4ID0gKGludClldmVudC5nZXRSYXdYKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGVkZ2VCb3JkZXIgPSBtRWRnZUJvcmRlcjsKLSAgICAgICAgICAgICAgICBpZiAoeCA+PSBlZGdlQm9yZGVyICYmIHggPCBtRGlzcGxheS5nZXRXaWR0aCgpIC0gZWRnZUJvcmRlcikgewotICAgICAgICAgICAgICAgICAgICBwcmVwYXJlVHJhY2tpbmcoeSwgIW1FeHBhbmRlZCk7Ly8gb3BlbmluZyBpZiB3ZSdyZSBub3QgYWxyZWFkeSBmdWxseSB2aXNpYmxlCi0gICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuYWRkTW92ZW1lbnQoZXZlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtVHJhY2tpbmcpIHsKLSAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuYWRkTW92ZW1lbnQoZXZlbnQpOwotICAgICAgICAgICAgZmluYWwgaW50IG1pblkgPSBzdGF0dXNCYXJTaXplICsgbUNsb3NlVmlldy5nZXRIZWlnaHQoKTsKLSAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSkgewotICAgICAgICAgICAgICAgIGludCB5ID0gKGludClldmVudC5nZXRSYXdZKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1BbmltYXRpbmdSZXZlYWwgJiYgeSA8IG1pblkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZwotICAgICAgICAgICAgICAgIH0gZWxzZSAgewotICAgICAgICAgICAgICAgICAgICBtQW5pbWF0aW5nUmV2ZWFsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1Bvcyh5ICsgbVZpZXdEZWx0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVApIHsKLSAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNvbXB1dGVDdXJyZW50VmVsb2NpdHkoMTAwMCk7Ci0KLSAgICAgICAgICAgICAgICBmbG9hdCB5VmVsID0gbVZlbG9jaXR5VHJhY2tlci5nZXRZVmVsb2NpdHkoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIG5lZ2F0aXZlID0geVZlbCA8IDA7Ci0KLSAgICAgICAgICAgICAgICBmbG9hdCB4VmVsID0gbVZlbG9jaXR5VHJhY2tlci5nZXRYVmVsb2NpdHkoKTsKLSAgICAgICAgICAgICAgICBpZiAoeFZlbCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgeFZlbCA9IC14VmVsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoeFZlbCA+IDE1MC4wZikgewotICAgICAgICAgICAgICAgICAgICB4VmVsID0gMTUwLjBmOyAvLyBsaW1pdCBob3cgbXVjaCB3ZSBjYXJlIGFib3V0IHRoZSB4IGF4aXMKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmbG9hdCB2ZWwgPSAoZmxvYXQpTWF0aC5oeXBvdCh5VmVsLCB4VmVsKTsKLSAgICAgICAgICAgICAgICBpZiAobmVnYXRpdmUpIHsKLSAgICAgICAgICAgICAgICAgICAgdmVsID0gLXZlbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwZXJmb3JtRmxpbmcoKGludClldmVudC5nZXRSYXdZKCksIHZlbCwgZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgTGF1bmNoZXIgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtSW50ZW50OwotICAgICAgICBwcml2YXRlIFN0cmluZyBtUGtnOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtVGFnOwotICAgICAgICBwcml2YXRlIGludCBtSWQ7Ci0KLSAgICAgICAgTGF1bmNoZXIoUGVuZGluZ0ludGVudCBpbnRlbnQsIFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCkgewotICAgICAgICAgICAgbUludGVudCA9IGludGVudDsKLSAgICAgICAgICAgIG1Qa2cgPSBwa2c7Ci0gICAgICAgICAgICBtVGFnID0gdGFnOwotICAgICAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgaW50ZW50IHdlIGFyZSBzZW5kaW5nIGlzIGZvciB0aGUgYXBwbGljYXRpb24sIHdoaWNoCi0gICAgICAgICAgICAgICAgLy8gd29uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGltbWVkaWF0ZWx5IHN0YXJ0IGFuIGFjdGl2aXR5IGFmdGVyCi0gICAgICAgICAgICAgICAgLy8gdGhlIHVzZXIgc3dpdGNoZXMgdG8gaG9tZS4gIFdlIGtub3cgaXQgaXMgc2FmZSB0byBkbyBhdCB0aGlzCi0gICAgICAgICAgICAgICAgLy8gcG9pbnQsIHNvIG1ha2Ugc3VyZSBuZXcgYWN0aXZpdHkgc3dpdGNoZXMgYXJlIG5vdyBhbGxvd2VkLgotICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkucmVzdW1lQXBwU3dpdGNoZXMoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtSW50ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnRbXSBwb3MgPSBuZXcgaW50WzJdOwotICAgICAgICAgICAgICAgIHYuZ2V0TG9jYXRpb25PblNjcmVlbihwb3MpOwotICAgICAgICAgICAgICAgIEludGVudCBvdmVybGF5ID0gbmV3IEludGVudCgpOwotICAgICAgICAgICAgICAgIG92ZXJsYXkuc2V0U291cmNlQm91bmRzKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3QocG9zWzBdLCBwb3NbMV0sIHBvc1swXSt2LmdldFdpZHRoKCksIHBvc1sxXSt2LmdldEhlaWdodCgpKSk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbUludGVudC5zZW5kKFN0YXR1c0JhclNlcnZpY2UudGhpcywgMCwgb3ZlcmxheSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUGVuZGluZ0ludGVudC5DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFjayB0cmFjZSBpc24ndCB2ZXJ5IGhlbHBmdWwgaGVyZS4gIEp1c3QgbG9nIHRoZSBleGNlcHRpb24gbWVzc2FnZS4KLSAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlNlbmRpbmcgY29udGVudEludGVudCBmYWlsZWQ6ICIgKyBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25Ob3RpZmljYXRpb25DbGljayhtUGtnLCBtVGFnLCBtSWQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZCBpZiB3ZSdyZSBoZXJlLgotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjbG9zZSB0aGUgc2hhZGUgaWYgaXQgd2FzIG9wZW4KLSAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRpY2soU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4pIHsKLSAgICAgICAgLy8gU2hvdyB0aGUgdGlja2VyIGlmIG9uZSBpcyByZXF1ZXN0ZWQuIEFsc28gZG9uJ3QgZG8gdGhpcwotICAgICAgICAvLyB1bnRpbCBzdGF0dXMgYmFyIHdpbmRvdyBpcyBhdHRhY2hlZCB0byB0aGUgd2luZG93IG1hbmFnZXIsCi0gICAgICAgIC8vIGJlY2F1c2UuLi4gIHdlbGwsIHdoYXQncyB0aGUgcG9pbnQgb3RoZXJ3aXNlPyAgQW5kIHRyeWluZyB0bwotICAgICAgICAvLyBydW4gYSB0aWNrZXIgd2l0aG91dCBiZWluZyBhdHRhY2hlZCB3aWxsIGNyYXNoIQotICAgICAgICBpZiAobi5ub3RpZmljYXRpb24udGlja2VyVGV4dCAhPSBudWxsICYmIG1TdGF0dXNCYXJWaWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKDAgPT0gKG1EaXNhYmxlZCAmIChTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikpKSB7Ci0gICAgICAgICAgICAgICAgbVRpY2tlci5hZGRFbnRyeShuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbmNlbCB0aGlzIG5vdGlmaWNhdGlvbiBhbmQgdGVsbCB0aGUgU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UgLyBOb3RpZmljYXRpb25NYW5hZ2VyU2VydmljZQotICAgICAqIGFib3V0IHRoZSBmYWlsdXJlLgotICAgICAqCi0gICAgICogV0FSTklORzogdGhpcyB3aWxsIGNhbGwgYmFjayBpbnRvIHVzLiAgRG9uJ3QgaG9sZCBhbnkgbG9ja3MuCi0gICAgICovCi0gICAgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4sIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvbihrZXkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbUJhclNlcnZpY2Uub25Ob3RpZmljYXRpb25FcnJvcihuLnBrZywgbi50YWcsIG4uaWQsIG4udWlkLCBuLmluaXRpYWxQaWQsIG1lc3NhZ2UpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIFRoZSBlbmQgaXMgbmlnaC4KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgTXlUaWNrZXIgZXh0ZW5kcyBUaWNrZXIgewotICAgICAgICBNeVRpY2tlcihDb250ZXh0IGNvbnRleHQsIFN0YXR1c0JhclZpZXcgc2IpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHNiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICB2b2lkIHRpY2tlclN0YXJ0aW5nKCkgewotICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJ0aWNrZXJTdGFydGluZyIpOwotICAgICAgICAgICAgbVRpY2tpbmcgPSB0cnVlOwotICAgICAgICAgICAgbUljb25zLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1UaWNrZXJWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1UaWNrZXJWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX3VwX2luLCBudWxsKSk7Ci0gICAgICAgICAgICBtSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfdXBfb3V0LCBudWxsKSk7Ci0gICAgICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfdXBfb3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICB2b2lkIHRpY2tlckRvbmUoKSB7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInRpY2tlckRvbmUiKTsKLSAgICAgICAgICAgIG1UaWNraW5nID0gZmFsc2U7Ci0gICAgICAgICAgICBtSWNvbnMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVRpY2tlclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUljb25zLnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX2Rvd25faW4sIG51bGwpKTsKLSAgICAgICAgICAgIG1UaWNrZXJWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX2Rvd25fb3V0LCBudWxsKSk7Ci0gICAgICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF9kb3duX2luKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdGlja2VySGFsdGluZygpIHsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAidGlja2VySGFsdGluZyIpOwotICAgICAgICAgICAgbVRpY2tpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIG1JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtVGlja2VyVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4sIG51bGwpKTsKLSAgICAgICAgICAgIG1UaWNrZXJWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX291dCwgbnVsbCkpOwotICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBbmltYXRpb24gbG9hZEFuaW0oaW50IGlkLCBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgQW5pbWF0aW9uIGFuaW0gPSBBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKFN0YXR1c0JhclNlcnZpY2UudGhpcywgaWQpOwotICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgYW5pbS5zZXRBbmltYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuaW07Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2aWV3SW5mbyhWaWV3IHYpIHsKLSAgICAgICAgcmV0dXJuICIoIiArIHYuZ2V0TGVmdCgpICsgIiwiICsgdi5nZXRUb3AoKSArICIpKCIgKyB2LmdldFJpZ2h0KCkgKyAiLCIgKyB2LmdldEJvdHRvbSgpCi0gICAgICAgICAgICAgICAgKyAiICIgKyB2LmdldFdpZHRoKCkgKyAieCIgKyB2LmdldEhlaWdodCgpICsgIikiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3LCBTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIGlmIChjaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5EVU1QKQotICAgICAgICAgICAgICAgICE9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgewotICAgICAgICAgICAgcHcucHJpbnRsbigiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgU3RhdHVzQmFyIGZyb20gZnJvbSBwaWQ9IgotICAgICAgICAgICAgICAgICAgICArIEJpbmRlci5nZXRDYWxsaW5nUGlkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtUXVldWVMb2NrKSB7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCJDdXJyZW50IFN0YXR1cyBCYXIgc3RhdGU6Iik7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbUV4cGFuZGVkVmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UaWNraW5nPSIgKyBtVGlja2luZyk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UcmFja2luZz0iICsgbVRyYWNraW5nKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUFuaW1hdGluZz0iICsgbUFuaW1hdGluZwotICAgICAgICAgICAgICAgICAgICArICIsIG1BbmltWT0iICsgbUFuaW1ZICsgIiwgbUFuaW1WZWw9IiArIG1BbmltVmVsCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbUFuaW1BY2NlbD0iICsgbUFuaW1BY2NlbCk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1DdXJBbmltYXRpb25UaW1lPSIgKyBtQ3VyQW5pbWF0aW9uVGltZQotICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1MYXN0VGltZT0iICsgbUFuaW1MYXN0VGltZSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EaXNwbGF5SGVpZ2h0PSIgKyBtRGlzcGxheUhlaWdodAotICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1hdGluZ1JldmVhbD0iICsgbUFuaW1hdGluZ1JldmVhbAotICAgICAgICAgICAgICAgICAgICArICIgbVZpZXdEZWx0YT0iICsgbVZpZXdEZWx0YSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EaXNwbGF5SGVpZ2h0PSIgKyBtRGlzcGxheUhlaWdodCk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZFBhcmFtczogIiArIG1FeHBhbmRlZFBhcmFtcyk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZFZpZXc6ICIgKyB2aWV3SW5mbyhtRXhwYW5kZWRWaWV3KSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZERpYWxvZzogIiArIG1FeHBhbmRlZERpYWxvZyk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UcmFja2luZ1BhcmFtczogIiArIG1UcmFja2luZ1BhcmFtcyk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UcmFja2luZ1ZpZXc6ICIgKyB2aWV3SW5mbyhtVHJhY2tpbmdWaWV3KSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1PbmdvaW5nVGl0bGU6ICIgKyB2aWV3SW5mbyhtT25nb2luZ1RpdGxlKSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1PbmdvaW5nSXRlbXM6ICIgKyB2aWV3SW5mbyhtT25nb2luZ0l0ZW1zKSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1MYXRlc3RUaXRsZTogIiArIHZpZXdJbmZvKG1MYXRlc3RUaXRsZSkpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtTGF0ZXN0SXRlbXM6ICIgKyB2aWV3SW5mbyhtTGF0ZXN0SXRlbXMpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbU5vTm90aWZpY2F0aW9uc1RpdGxlOiAiICsgdmlld0luZm8obU5vTm90aWZpY2F0aW9uc1RpdGxlKSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1DbG9zZVZpZXc6ICIgKyB2aWV3SW5mbyhtQ2xvc2VWaWV3KSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UaWNrZXJWaWV3OiAiICsgdmlld0luZm8obVRpY2tlclZpZXcpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVNjcm9sbFZpZXc6ICIgKyB2aWV3SW5mbyhtU2Nyb2xsVmlldykKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNjcm9sbCAiICsgbVNjcm9sbFZpZXcuZ2V0U2Nyb2xsWCgpICsgIiwiICsgbVNjcm9sbFZpZXcuZ2V0U2Nyb2xsWSgpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIm1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQ6ICIgKyB2aWV3SW5mbyhtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0KSk7Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgc3luY2hyb25pemVkIChtTm90aWZpY2F0aW9uRGF0YSkgewotICAgICAgICAgICAgaW50IE4gPSBtTm90aWZpY2F0aW9uRGF0YS5vbmdvaW5nQ291bnQoKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgb25nb2luZ0NvdW50LnNpemU9IiArIE4pOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuID0gbU5vdGlmaWNhdGlvbkRhdGEuZ2V0T25nb2luZyhpKTsKLSAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgWyIgKyBpICsgIl0ga2V5PSIgKyBuLmtleSArICIgdmlldz0iICsgbi52aWV3KTsKLSAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgICAgICAgIGRhdGE9IiArIG4uZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBOID0gbU5vdGlmaWNhdGlvbkRhdGEubGF0ZXN0Q291bnQoKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgb25nb2luZ0NvdW50LnNpemU9IiArIE4pOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuID0gbU5vdGlmaWNhdGlvbkRhdGEuZ2V0TGF0ZXN0KGkpOwotICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICBbIiArIGkgKyAiXSBrZXk9IiArIG4ua2V5ICsgIiB2aWV3PSIgKyBuLnZpZXcpOwotICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICAgICAgICAgZGF0YT0iICsgbi5kYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAqLwotCi0gICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgcHcucHJpbnRsbigic2VlIHRoZSBsb2djYXQgZm9yIGEgZHVtcCBvZiB0aGUgdmlld3Mgd2UgaGF2ZSBjcmVhdGVkLiIpOwotICAgICAgICAgICAgLy8gbXVzdCBoYXBwZW4gb24gdWkgdGhyZWFkCi0gICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0JhclZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihtQWJzUG9zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJtU3RhdHVzQmFyVmlldzogLS0tLS0gKCIgKyBtQWJzUG9zWzBdICsgIiwiICsgbUFic1Bvc1sxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpICIgKyBtU3RhdHVzQmFyVmlldy5nZXRXaWR0aCgpICsgIngiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0JhclZpZXcuZGVidWcoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGVkVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKG1BYnNQb3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm1FeHBhbmRlZFZpZXc6IC0tLS0tICgiICsgbUFic1Bvc1swXSArICIsIiArIG1BYnNQb3NbMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSAiICsgbUV4cGFuZGVkVmlldy5nZXRXaWR0aCgpICsgIngiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUV4cGFuZGVkVmlldy5nZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRXhwYW5kZWRWaWV3LmRlYnVnKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja2luZ1ZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihtQWJzUG9zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJtVHJhY2tpbmdWaWV3OiAtLS0tLSAoIiArIG1BYnNQb3NbMF0gKyAiLCIgKyBtQWJzUG9zWzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgIiArIG1UcmFja2luZ1ZpZXcuZ2V0V2lkdGgoKSArICJ4IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1UcmFja2luZ1ZpZXcuZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNraW5nVmlldy5kZWJ1ZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIG9uQmFyVmlld0F0dGFjaGVkKCkgewotICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscDsKLSAgICAgICAgaW50IHBpeGVsRm9ybWF0OwotICAgICAgICBEcmF3YWJsZSBiZzsKLQotICAgICAgICAvLy8gLS0tLS0tLS0tLSBUcmFja2luZyBWaWV3IC0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHBpeGVsRm9ybWF0ID0gUGl4ZWxGb3JtYXQuUkdCWF84ODg4OwotICAgICAgICBiZyA9IG1UcmFja2luZ1ZpZXcuZ2V0QmFja2dyb3VuZCgpOwotICAgICAgICBpZiAoYmcgIT0gbnVsbCkgewotICAgICAgICAgICAgcGl4ZWxGb3JtYXQgPSBiZy5nZXRPcGFjaXR5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBscCA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUwsCi0gICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCi0gICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9OT19MSU1JVFMKLSAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTSwKLSAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdCk7Ci0vLyAgICAgICAgbHAudG9rZW4gPSBtU3RhdHVzQmFyVmlldy5nZXRXaW5kb3dUb2tlbigpOwotICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKLSAgICAgICAgbHAuc2V0VGl0bGUoIlRyYWNraW5nVmlldyIpOwotICAgICAgICBscC55ID0gbVRyYWNraW5nUG9zaXRpb247Ci0gICAgICAgIG1UcmFja2luZ1BhcmFtcyA9IGxwOwotCi0gICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5hZGRWaWV3KG1UcmFja2luZ1ZpZXcsIGxwKTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uVHJhY2tpbmdWaWV3QXR0YWNoZWQoKSB7Ci0gICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwOwotICAgICAgICBpbnQgcGl4ZWxGb3JtYXQ7Ci0gICAgICAgIERyYXdhYmxlIGJnOwotCi0gICAgICAgIC8vLyAtLS0tLS0tLS0tIEV4cGFuZGVkIFZpZXcgLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgcGl4ZWxGb3JtYXQgPSBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVDsKLQotICAgICAgICBmaW5hbCBpbnQgZGlzcGggPSBtRGlzcGxheS5nZXRIZWlnaHQoKTsKLSAgICAgICAgbHAgPSBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBscC53aWR0aCA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOwotICAgICAgICBscC5oZWlnaHQgPSBnZXRFeHBhbmRlZEhlaWdodCgpOwotICAgICAgICBscC54ID0gMDsKLSAgICAgICAgbVRyYWNraW5nUG9zaXRpb24gPSBscC55ID0gLWRpc3BoOyAvLyBzdWZmaWNpZW50bHkgbGFyZ2UgbmVnYXRpdmUKLSAgICAgICAgbHAudHlwZSA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1RBVFVTX0JBUl9QQU5FTDsKLSAgICAgICAgbHAuZmxhZ3MgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4KLSAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX05PX0xJTUlUUwotICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfVE9VQ0hfTU9EQUwKLSAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRElUSEVSCi0gICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEU7Ci0gICAgICAgIGxwLmZvcm1hdCA9IHBpeGVsRm9ybWF0OwotICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKLSAgICAgICAgbHAuc2V0VGl0bGUoIlN0YXR1c0JhckV4cGFuZGVkIik7Ci0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKGxwKTsKLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEZvcm1hdChwaXhlbEZvcm1hdCk7Ci0gICAgICAgIG1FeHBhbmRlZFBhcmFtcyA9IGxwOwotCi0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5yZXF1ZXN0RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9OT19USVRMRSk7Ci0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5zZXRDb250ZW50VmlldyhtRXhwYW5kZWRWaWV3LAotICAgICAgICAgICAgICAgIG5ldyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7Ci0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRCYWNrZ3JvdW5kRHJhd2FibGUobnVsbCk7Ci0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5zaG93KCk7Ci0gICAgICAgIEZyYW1lTGF5b3V0IGhhY2sgPSAoRnJhbWVMYXlvdXQpbUV4cGFuZGVkVmlldy5nZXRQYXJlbnQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldERhdGVWaWV3VmlzaWJpbGl0eShib29sZWFuIHZpc2libGUsIGludCBhbmltKSB7Ci0gICAgICAgIG1EYXRlVmlldy5zZXRVcGRhdGVzKHZpc2libGUpOwotICAgICAgICBtRGF0ZVZpZXcuc2V0VmlzaWJpbGl0eSh2aXNpYmxlID8gVmlldy5WSVNJQkxFIDogVmlldy5JTlZJU0lCTEUpOwotICAgICAgICBtRGF0ZVZpZXcuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oYW5pbSwgbnVsbCkpOwotICAgIH0KLQotICAgIHZvaWQgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkoYm9vbGVhbiB2aXNpYmxlLCBpbnQgYW5pbSkgewotICAgICAgICBpbnQgb2xkID0gbU5vdGlmaWNhdGlvbkljb25zLmdldFZpc2liaWxpdHkoKTsKLSAgICAgICAgaW50IHYgPSB2aXNpYmxlID8gVmlldy5WSVNJQkxFIDogVmlldy5JTlZJU0lCTEU7Ci0gICAgICAgIGlmIChvbGQgIT0gdikgewotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLnNldFZpc2liaWxpdHkodik7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oYW5pbSwgbnVsbCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoaW50IGV4cGFuZGVkUG9zaXRpb24pIHsKLSAgICAgICAgaWYgKFNQRVcpIHsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJ1cGRhdGVFeHBhbmRlZFZpZXdQb3MgYmVmb3JlIGV4cGFuZGVkUG9zaXRpb249IiArIGV4cGFuZGVkUG9zaXRpb24KLSAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2luZ1BhcmFtcy55PSIgCi0gICAgICAgICAgICAgICAgICAgICsgKChtVHJhY2tpbmdQYXJhbXMgPT0gbnVsbCkgPyAiPz8/IiA6IG1UcmFja2luZ1BhcmFtcy55KQotICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNraW5nUG9zaXRpb249IiArIG1UcmFja2luZ1Bvc2l0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBoID0gbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIGludCBkaXNwaCA9IG1EaXNwbGF5LmdldEhlaWdodCgpOwotCi0gICAgICAgIC8vIElmIHRoZSBleHBhbmRlZCB2aWV3IGlzIG5vdCB2aXNpYmxlLCBtYWtlIHN1cmUgdGhleSdyZSBzdGlsbCBvZmYgc2NyZWVuLgotICAgICAgICAvLyBNYXliZSB0aGUgdmlldyB3YXMgcmVzaXplZC4KLSAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICBpZiAobVRyYWNraW5nVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVRyYWNraW5nUG9zaXRpb24gPSAtZGlzcGg7Ci0gICAgICAgICAgICAgICAgaWYgKG1UcmFja2luZ1BhcmFtcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UcmFja2luZ1BhcmFtcy55ID0gbVRyYWNraW5nUG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS51cGRhdGVWaWV3TGF5b3V0KG1UcmFja2luZ1ZpZXcsIG1UcmFja2luZ1BhcmFtcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFBhcmFtcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSAtZGlzcGg7Ci0gICAgICAgICAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRyYWNraW5nIHZpZXcuLi4KLSAgICAgICAgaW50IHBvczsKLSAgICAgICAgaWYgKGV4cGFuZGVkUG9zaXRpb24gPT0gRVhQQU5ERURfRlVMTF9PUEVOKSB7Ci0gICAgICAgICAgICBwb3MgPSBoOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGV4cGFuZGVkUG9zaXRpb24gPT0gRVhQQU5ERURfTEVBVkVfQUxPTkUpIHsKLSAgICAgICAgICAgIHBvcyA9IG1UcmFja2luZ1Bvc2l0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKGV4cGFuZGVkUG9zaXRpb24gPD0gZGlzcGgpIHsKLSAgICAgICAgICAgICAgICBwb3MgPSBleHBhbmRlZFBvc2l0aW9uOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwb3MgPSBkaXNwaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBvcyAtPSBkaXNwaC1oOwotICAgICAgICB9Ci0gICAgICAgIG1UcmFja2luZ1Bvc2l0aW9uID0gbVRyYWNraW5nUGFyYW1zLnkgPSBwb3M7Ci0gICAgICAgIG1UcmFja2luZ1BhcmFtcy5oZWlnaHQgPSBkaXNwaC1oOwotICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkudXBkYXRlVmlld0xheW91dChtVHJhY2tpbmdWaWV3LCBtVHJhY2tpbmdQYXJhbXMpOwotCi0gICAgICAgIGlmIChtRXhwYW5kZWRQYXJhbXMgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNsb3NlVmlldy5nZXRMb2NhdGlvbkluV2luZG93KG1Qb3NpdGlvblRtcCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY2xvc2VQb3MgPSBtUG9zaXRpb25UbXBbMV07Ci0KLSAgICAgICAgICAgIG1FeHBhbmRlZENvbnRlbnRzLmdldExvY2F0aW9uSW5XaW5kb3cobVBvc2l0aW9uVG1wKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb250ZW50c0JvdHRvbSA9IG1Qb3NpdGlvblRtcFsxXSArIG1FeHBhbmRlZENvbnRlbnRzLmdldEhlaWdodCgpOwotCi0gICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IHBvcyArIG1UcmFja2luZ1ZpZXcuZ2V0SGVpZ2h0KCkKLSAgICAgICAgICAgICAgICAgICAgLSAobVRyYWNraW5nUGFyYW1zLmhlaWdodC1jbG9zZVBvcykgLSBjb250ZW50c0JvdHRvbTsKLSAgICAgICAgICAgIGludCBtYXggPSBoOwotICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFBhcmFtcy55ID4gbWF4KSB7Ci0gICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSBtYXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgbWluID0gbVRyYWNraW5nUG9zaXRpb247Ci0gICAgICAgICAgICBpZiAobUV4cGFuZGVkUGFyYW1zLnkgPCBtaW4pIHsKLSAgICAgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IG1pbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlID0gKG1UcmFja2luZ1Bvc2l0aW9uICsgbVRyYWNraW5nVmlldy5nZXRIZWlnaHQoKSkgPiBoOwotICAgICAgICAgICAgaWYgKCF2aXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNvbnRlbnRzIGFyZW4ndCB2aXNpYmxlLCBtb3ZlIHRoZSBleHBhbmRlZCB2aWV3IHdheSBvZmYgc2NyZWVuCi0gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgd2luZG93IGl0c2VsZiBleHRlbmRzIGJlbG93IHRoZSBjb250ZW50IHZpZXcuCi0gICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSAtZGlzcGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOwotCi0gICAgICAgICAgICAvLyBBcyBsb25nIGFzIHRoaXMgaXNuJ3QganVzdCBhIHJlcG9zaXRpb25pbmcgdGhhdCdzIG5vdCBzdXBwb3NlZCB0byBhZmZlY3QKLSAgICAgICAgICAgIC8vIHRoZSB1c2VyJ3MgcGVyY2VwdGlvbiBvZiB3aGF0J3Mgc2hvd2luZywgY2FsbCB0byBzYXkgdGhhdCB0aGUgdmlzaWJpbGl0eQotICAgICAgICAgICAgLy8gaGFzIGNoYW5nZWQuIChPdGhlcndpc2UsIHNvbWVvbmUgZWxzZSB3aWxsIGNhbGwgdG8gZG8gdGhhdCkuCi0gICAgICAgICAgICBpZiAoZXhwYW5kZWRQb3NpdGlvbiAhPSBFWFBBTkRFRF9MRUFWRV9BTE9ORSkgewotICAgICAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAidXBkYXRlRXhwYW5kZWRWaWV3UG9zIHZpc2liaWxpdHlDaGFuZ2VkKCIgKyB2aXNpYmxlICsgIikiKTsKLSAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q2hhbmdlZCh2aXNpYmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChTUEVXKSB7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlRXhwYW5kZWRWaWV3UG9zIGFmdGVyICBleHBhbmRlZFBvc2l0aW9uPSIgKyBleHBhbmRlZFBvc2l0aW9uCi0gICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tpbmdQYXJhbXMueT0iICsgbVRyYWNraW5nUGFyYW1zLnkKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2luZ1Bvc2l0aW9uPSIgKyBtVHJhY2tpbmdQb3NpdGlvbgotICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkUGFyYW1zLnk9IiArIG1FeHBhbmRlZFBhcmFtcy55Ci0gICAgICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWRQYXJhbXMuaGVpZ2h0PSIgKyBtRXhwYW5kZWRQYXJhbXMuaGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCBnZXRFeHBhbmRlZEhlaWdodCgpIHsKLSAgICAgICAgcmV0dXJuIG1EaXNwbGF5LmdldEhlaWdodCgpIC0gbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCkgLSBtQ2xvc2VWaWV3LmdldEhlaWdodCgpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlRXhwYW5kZWRIZWlnaHQoKSB7Ci0gICAgICAgIGlmIChtRXhwYW5kZWRWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy5oZWlnaHQgPSBnZXRFeHBhbmRlZEhlaWdodCgpOwotICAgICAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBMRURzIGFyZSB0dXJuZWQgbylmZiB3aGVuIHRoZSBub3RpZmljYXRpb24gcGFuZWwgaXMgc2hvd24sIGV2ZW4ganVzdCBhIGxpdHRsZSBiaXQuCi0gICAgICogVGhpcyB3YXMgYWRkZWQgbGFzdC1taW51dGUgYW5kIGlzIGluY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgdGhlIHJlc3Qgb2YgdGhlIG5vdGlmaWNhdGlvbnMKLSAgICAgKiBhcmUgaGFuZGxlZCwgYmVjYXVzZSB0aGUgbm90aWZpY2F0aW9uIGlzbid0IHJlYWxseSBjYW5jZWxsZWQuICBUaGUgbGlnaHRzIGFyZSBqdXN0Ci0gICAgICogdHVybmVkIG9mZi4gIElmIGFueSBvdGhlciBub3RpZmljYXRpb25zIGhhcHBlbiwgdGhlIGxpZ2h0cyB3aWxsIHR1cm4gYmFjayBvbi4gIFN0ZXZlIHNheXMKLSAgICAgKiB0aGlzIGlzIHdoYXQgaGUgd2FudHMuIChzZWUgYnVnIDExMzE0NjEpCi0gICAgICovCi0gICAgdm9pZCB2aXNpYmlsaXR5Q2hhbmdlZChib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgaWYgKG1QYW5lbFNsaWdodGx5VmlzaWJsZSAhPSB2aXNpYmxlKSB7Ci0gICAgICAgICAgICBtUGFuZWxTbGlnaHRseVZpc2libGUgPSB2aXNpYmxlOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vblBhbmVsUmV2ZWFsZWQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIFdvbid0IGZhaWwgdW5sZXNzIHRoZSB3b3JsZCBoYXMgZW5kZWQuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHBlcmZvcm1EaXNhYmxlQWN0aW9ucyhpbnQgbmV0KSB7Ci0gICAgICAgIGludCBvbGQgPSBtRGlzYWJsZWQ7Ci0gICAgICAgIGludCBkaWZmID0gbmV0IF4gb2xkOwotICAgICAgICBtRGlzYWJsZWQgPSBuZXQ7Ci0KLSAgICAgICAgLy8gYWN0IGFjY29yZGluZ2x5Ci0gICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKLSAgICAgICAgICAgIGlmICgobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX0VYUEFORDogeWVzIik7Ci0gICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgewotICAgICAgICAgICAgaWYgKChuZXQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiB5ZXMiKTsKLSAgICAgICAgICAgICAgICBpZiAobVRpY2tpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogbm8iKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSOiAiCi0gICAgICAgICAgICAgICAgKyAoKChuZXQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgPyAieWVzIiA6ICJubyIpKTsKLSAgICAgICAgICAgIGlmIChtVGlja2luZyAmJiAobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKLSAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUNsZWFyQnV0dG9uTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uQ2xlYXJBbGxOb3RpZmljYXRpb25zKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkIGlmIHdlJ3JlIGhlcmUuCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1Ccm9hZGNhc3RSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChJbnRlbnQuQUNUSU9OX0NMT1NFX1NZU1RFTV9ESUFMT0dTLmVxdWFscyhhY3Rpb24pCi0gICAgICAgICAgICAgICAgICAgIHx8IEludGVudC5BQ1RJT05fU0NSRUVOX09GRi5lcXVhbHMoYWN0aW9uKSkgewotICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoSW50ZW50LkFDVElPTl9DT05GSUdVUkFUSU9OX0NIQU5HRUQuZXF1YWxzKGFjdGlvbikpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBSZWxvYWQgc29tZSBvZiBvdXIgcmVzb3VyY2VzIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KLSAgICAgKgotICAgICAqIFdlIGRvbid0IHJlbG9hZCBldmVyeXRoaW5nIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyAtLSB3ZSBwcm9iYWJseQotICAgICAqIHNob3VsZCwgYnV0IGdldHRpbmcgdGhhdCBzbW9vdGggaXMgdG91Z2guICBTb21lZGF5IHdlJ2xsIGZpeCB0aGF0LiAgSW4gdGhlCi0gICAgICogbWVhbnRpbWUsIGp1c3QgdXBkYXRlIHRoZSB0aGluZ3MgdGhhdCB3ZSBrbm93IGNoYW5nZS4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZVJlc291cmNlcygpIHsKLSAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOwotCi0gICAgICAgIG1DbGVhckJ1dHRvbi5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuc3RhdHVzX2Jhcl9jbGVhcl9hbGxfYnV0dG9uKSk7Ci0gICAgICAgIG1PbmdvaW5nVGl0bGUuc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfb25nb2luZ19ldmVudHNfdGl0bGUpKTsKLSAgICAgICAgbUxhdGVzdFRpdGxlLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5zdGF0dXNfYmFyX2xhdGVzdF9ldmVudHNfdGl0bGUpKTsKLSAgICAgICAgbU5vTm90aWZpY2F0aW9uc1RpdGxlLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5zdGF0dXNfYmFyX25vX25vdGlmaWNhdGlvbnNfdGl0bGUpKTsKLQotICAgICAgICBtRWRnZUJvcmRlciA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5zdGF0dXNfYmFyX2VkZ2VfaWdub3JlKTsKLQotICAgICAgICBpZiAoZmFsc2UpIFNsb2cudihUQUcsICJ1cGRhdGVSZXNvdXJjZXMiKTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIHRyYWNpbmcKLSAgICAvLwotCi0gICAgdm9pZCBwb3N0U3RhcnRUcmFjaW5nKCkgewotICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChtU3RhcnRUcmFjaW5nLCAzMDAwKTsKLSAgICB9Ci0KLSAgICB2b2lkIHZpYnJhdGUoKSB7Ci0gICAgICAgIGFuZHJvaWQub3MuVmlicmF0b3IgdmliID0gKGFuZHJvaWQub3MuVmlicmF0b3IpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlZJQlJBVE9SX1NFUlZJQ0UpOwotICAgICAgICB2aWIudmlicmF0ZSgyNTApOwotICAgIH0KLQotICAgIFJ1bm5hYmxlIG1TdGFydFRyYWNpbmcgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHZpYnJhdGUoKTsKLSAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKDI1MCk7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAic3RhcnRUcmFjaW5nIik7Ci0gICAgICAgICAgICBhbmRyb2lkLm9zLkRlYnVnLnN0YXJ0TWV0aG9kVHJhY2luZygiL2RhdGEvc3RhdHVzYmFyLXRyYWNlcy90cmFjZSIpOwotICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobVN0b3BUcmFjaW5nLCAxMDAwMCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgUnVubmFibGUgbVN0b3BUcmFjaW5nID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBhbmRyb2lkLm9zLkRlYnVnLnN0b3BNZXRob2RUcmFjaW5nKCk7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAic3RvcFRyYWNpbmciKTsKLSAgICAgICAgICAgIHZpYnJhdGUoKTsKLSAgICAgICAgfQotICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyVmlldy5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJWaWV3LmphdmEKaW5kZXggMWUxNDBiOS4uMjBmYzQxZiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJWaWV3LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJWaWV3LmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CkBAIC0zNCw3ICszNSw3IEBACiAKICAgICBzdGF0aWMgZmluYWwgaW50IERJTV9BTklNX1RJTUUgPSA0MDA7CiAgICAgCi0gICAgU3RhdHVzQmFyU2VydmljZSBtU2VydmljZTsKKyAgICBQaG9uZVN0YXR1c0JhclNlcnZpY2UgbVNlcnZpY2U7CiAgICAgYm9vbGVhbiBtVHJhY2tpbmc7CiAgICAgaW50IG1TdGFydFgsIG1TdGFydFk7CiAgICAgVmlld0dyb3VwIG1Ob3RpZmljYXRpb25JY29uczsKQEAgLTQ2LDYgKzQ3LDkgQEAKICAgICBpbnQgbVN0YXJ0QWxwaGEgPSAwLCBtRW5kQWxwaGEgPSAwOwogICAgIGxvbmcgbUVuZFRpbWUgPSAwOwogCisgICAgUmVjdCBtQnV0dG9uQm91bmRzID0gbmV3IFJlY3QoKTsKKyAgICBib29sZWFuIG1DYXB0dXJpbmdFdmVudHMgPSB0cnVlOworCiAgICAgcHVibGljIFN0YXR1c0JhclZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwogICAgIH0KQEAgLTk0LDcgKzk4LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvblNpemVDaGFuZ2VkKGludCB3LCBpbnQgaCwgaW50IG9sZHcsIGludCBvbGRoKSB7CiAgICAgICAgIHN1cGVyLm9uU2l6ZUNoYW5nZWQodywgaCwgb2xkdywgb2xkaCk7Ci0gICAgICAgIG1TZXJ2aWNlLnVwZGF0ZUV4cGFuZGVkVmlld1BvcyhTdGF0dXNCYXJTZXJ2aWNlLkVYUEFOREVEX0xFQVZFX0FMT05FKTsKKyAgICAgICAgbVNlcnZpY2UudXBkYXRlRXhwYW5kZWRWaWV3UG9zKFBob25lU3RhdHVzQmFyU2VydmljZS5FWFBBTkRFRF9MRUFWRV9BTE9ORSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNzcsNiArMTgxLDkgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKCFtQ2FwdHVyaW5nRXZlbnRzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpICE9IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7CiAgICAgICAgICAgICBtU2VydmljZS5pbnRlcmNlcHRUb3VjaEV2ZW50KGV2ZW50KTsKICAgICAgICAgfQpAQCAtMTg1LDYgKzE5MiwxMyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25JbnRlcmNlcHRUb3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgeworICAgICAgICAgICAgaWYgKG1CdXR0b25Cb3VuZHMuY29udGFpbnMoKGludClldmVudC5nZXRYKCksIChpbnQpZXZlbnQuZ2V0WSgpKSkgeworICAgICAgICAgICAgICAgIG1DYXB0dXJpbmdFdmVudHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUNhcHR1cmluZ0V2ZW50cyA9IHRydWU7CiAgICAgICAgIHJldHVybiBtU2VydmljZS5pbnRlcmNlcHRUb3VjaEV2ZW50KGV2ZW50KQogICAgICAgICAgICAgICAgID8gdHJ1ZSA6IHN1cGVyLm9uSW50ZXJjZXB0VG91Y2hFdmVudChldmVudCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UaWNrZXIuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyLmphdmEKaW5kZXggM2E2OTdhNi4uZTdiMDUwOSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UaWNrZXIuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RpY2tlci5qYXZhCkBAIC0xNDEsNyArMTQxLDcgQEAKICAgICAgICAgfQogICAgIH07CiAKLSAgICBUaWNrZXIoQ29udGV4dCBjb250ZXh0LCBTdGF0dXNCYXJWaWV3IHNiKSB7CisgICAgcHVibGljIFRpY2tlcihDb250ZXh0IGNvbnRleHQsIFZpZXcgc2IpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtVGlja2VyVmlldyA9IHNiLmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlcik7CiAKQEAgLTE2Myw3ICsxNjMsNyBAQAogICAgIH0KIAogCi0gICAgdm9pZCBhZGRFbnRyeShTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgeworICAgIHB1YmxpYyB2b2lkIGFkZEVudHJ5KFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuKSB7CiAgICAgICAgIGludCBpbml0aWFsQ291bnQgPSBtU2VnbWVudHMuc2l6ZSgpOwogCiAgICAgICAgIC8vIElmIHdoYXQncyBiZWluZyBkaXNwbGF5ZWQgaGFzIHRoZSBzYW1lIHRleHQgYW5kIGljb24sIGp1c3QgZHJvcCBpdApAQCAtMjEyLDcgKzIxMiw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2b2lkIHJlbW92ZUVudHJ5KFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuKSB7CisgICAgcHVibGljIHZvaWQgcmVtb3ZlRW50cnkoU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4pIHsKICAgICAgICAgZm9yIChpbnQgaT1tU2VnbWVudHMuc2l6ZSgpLTE7IGk+PTA7IGktLSkgewogICAgICAgICAgICAgU2VnbWVudCBzZWcgPSBtU2VnbWVudHMuZ2V0KGkpOwogICAgICAgICAgICAgaWYgKG4uaWQgPT0gc2VnLm5vdGlmaWNhdGlvbi5pZCAmJiBuLnBrZy5lcXVhbHMoc2VnLm5vdGlmaWNhdGlvbi5wa2cpKSB7CkBAIC0yMjEsMTMgKzIyMSwxMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCBoYWx0KCkgeworICAgIHB1YmxpYyB2b2lkIGhhbHQoKSB7CiAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtQWR2YW5jZVRpY2tlcik7CiAgICAgICAgIG1TZWdtZW50cy5jbGVhcigpOwogICAgICAgICB0aWNrZXJIYWx0aW5nKCk7CiAgICAgfQogCi0gICAgdm9pZCByZWZsb3dUZXh0KCkgeworICAgIHB1YmxpYyB2b2lkIHJlZmxvd1RleHQoKSB7CiAgICAgICAgIGlmIChtU2VnbWVudHMuc2l6ZSgpID4gMCkgewogICAgICAgICAgICAgU2VnbWVudCBzZWcgPSBtU2VnbWVudHMuZ2V0KDApOwogICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBzZWcuZ2V0VGV4dCgpOwpAQCAtMjY2LDggKzI2Niw4IEBACiAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1BZHZhbmNlVGlja2VyLCBUSUNLRVJfU0VHTUVOVF9ERUxBWSk7CiAgICAgfQogCi0gICAgYWJzdHJhY3Qgdm9pZCB0aWNrZXJTdGFydGluZygpOwotICAgIGFic3RyYWN0IHZvaWQgdGlja2VyRG9uZSgpOwotICAgIGFic3RyYWN0IHZvaWQgdGlja2VySGFsdGluZygpOworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRpY2tlclN0YXJ0aW5nKCk7CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdGlja2VyRG9uZSgpOworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRpY2tlckhhbHRpbmcoKTsKIH0KIApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UaWNrZXJWaWV3LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RpY2tlclZpZXcuamF2YQppbmRleCA5NzQ5YWU0Li44MTQwODExIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RpY2tlclZpZXcuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RpY2tlclZpZXcuamF2YQpAQCAtMzQsNSArMzQsOSBAQAogICAgICAgICBzdXBlci5vblNpemVDaGFuZ2VkKHcsIGgsIG9sZHcsIG9sZGgpOwogICAgICAgICBtVGlja2VyLnJlZmxvd1RleHQoKTsKICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUaWNrZXIoVGlja2VyIHQpIHsKKyAgICAgICAgbVRpY2tlciA9IHQ7CisgICAgfQogfQogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RyYWNraW5nVmlldy5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UcmFja2luZ1ZpZXcuamF2YQppbmRleCA5MTA4ZWVlLi5jNTllYjZhIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RyYWNraW5nVmlldy5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVHJhY2tpbmdWaWV3LmphdmEKQEAgLTI2LDcgKzI2LDcgQEAKIAogcHVibGljIGNsYXNzIFRyYWNraW5nVmlldyBleHRlbmRzIExpbmVhckxheW91dCB7CiAgICAgZmluYWwgRGlzcGxheSBtRGlzcGxheTsKLSAgICBTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOworICAgIFBob25lU3RhdHVzQmFyU2VydmljZSBtU2VydmljZTsKICAgICBib29sZWFuIG1UcmFja2luZzsKICAgICBpbnQgbVN0YXJ0WCwgbVN0YXJ0WTsKIApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvTm90aWZpY2F0aW9uSWNvbkFyZWEuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L05vdGlmaWNhdGlvbkljb25BcmVhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3ZDc0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9Ob3RpZmljYXRpb25JY29uQXJlYS5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKKworCitwdWJsaWMgY2xhc3MgTm90aWZpY2F0aW9uSWNvbkFyZWEgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTm90aWZpY2F0aW9uSWNvbkFyZWEiOworCisgICAgSWNvbkxheW91dCBtSWNvbkxheW91dDsKKyAgICBEcmFnZ2VyVmlldyBtRHJhZ2dlclZpZXc7CisKKyAgICBwdWJsaWMgTm90aWZpY2F0aW9uSWNvbkFyZWEoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIG1JY29uTGF5b3V0ID0gKEljb25MYXlvdXQpZmluZFZpZXdCeUlkKFIuaWQuaWNvbnMpOworICAgICAgICBtRHJhZ2dlclZpZXcgPSAoRHJhZ2dlclZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmhhbmRsZSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEljb25MYXlvdXQgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgeworICAgICAgICBwdWJsaWMgSWNvbkxheW91dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIERyYWdnZXJWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHB1YmxpYyBEcmFnZ2VyVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9TeXN0ZW1QYW5lbC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvU3lzdGVtUGFuZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzJiMDFmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvU3lzdGVtUGFuZWwuamF2YQpAQCAtMCwwICsxLDYyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5hcHAuU3RhdHVzQmFyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGU7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklQb3dlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNpZ25hbFN0cmVuZ3RoOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlckltcGw7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Nyb2xsVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0U3dpdGNoZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NDYXJkOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlJbnRlbnRzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hLkVyaUluZm87CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuVHR5SW50ZW50OworCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLio7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKKworcHVibGljIGNsYXNzIFN5c3RlbVBhbmVsIGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN5c3RlbVBhbmVsIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gVGFibGV0U3RhdHVzQmFyU2VydmljZS5ERUJVRzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1NJR05BTCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTklNVU1fQkFDS0xJR0hUID0gYW5kcm9pZC5vcy5Qb3dlci5CUklHSFRORVNTX0RJTSArIDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fQkFDS0xJR0hUID0gYW5kcm9pZC5vcy5Qb3dlci5CUklHSFRORVNTX09OOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JBQ0tMSUdIVCA9IChpbnQpIChhbmRyb2lkLm9zLlBvd2VyLkJSSUdIVE5FU1NfT04gKiAwLjRmKTsKKworCisgICAgcHJpdmF0ZSBUYWJsZXRTdGF0dXNCYXJTZXJ2aWNlIG1CYXI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1BaXJwbGFuZU1vZGU7CisKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1CcmlnaHRuZXNzQnV0dG9uOworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVNvdW5kQnV0dG9uOworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbU9yaWVudGF0aW9uQnV0dG9uOworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUFpcnBsYW5lQnV0dG9uOworCisgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbUJhdHRlcnlNZXRlcjsKKyAgICBwcml2YXRlIEltYWdlVmlldyBtU2lnbmFsTWV0ZXI7CisKKyAgICBwcml2YXRlIFRleHRWaWV3IG1CYXR0ZXJ5VGV4dDsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1TaWduYWxUZXh0OworCisgICAgcHJpdmF0ZSBmaW5hbCBBdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcjsKKyAgICBwcml2YXRlIGZpbmFsIFdpZmlNYW5hZ2VyIG1XaWZpTWFuYWdlcjsKKyAgICBwcml2YXRlIGZpbmFsIFRlbGVwaG9ueU1hbmFnZXIgbVBob25lOworCisgICAgLy8gc3RhdGUgdHJhY2tlcnMgZm9yIHRlbGVwaG9ueSBjb2RlCisgICAgSWNjQ2FyZC5TdGF0ZSBtU2ltU3RhdGUgPSBJY2NDYXJkLlN0YXRlLlJFQURZOworICAgIGludCBtUGhvbmVTdGF0ZSA9IFRlbGVwaG9ueU1hbmFnZXIuQ0FMTF9TVEFURV9JRExFOworICAgIGludCBtRGF0YVN0YXRlID0gVGVsZXBob255TWFuYWdlci5EQVRBX0RJU0NPTk5FQ1RFRDsKKyAgICBTZXJ2aWNlU3RhdGUgbVNlcnZpY2VTdGF0ZTsKKyAgICBTaWduYWxTdHJlbmd0aCBtU2lnbmFsU3RyZW5ndGg7CisKKyAgICAvLyBzdGF0ZSBmb3IgdGhlIG1ldGVycworICAgIGJvb2xlYW4gbVdpZmlFbmFibGVkLCBtV2lmaUNvbm5lY3RlZDsKKyAgICBpbnQgbVdpZmlMZXZlbDsKKyAgICBTdHJpbmcgbVdpZmlTc2lkOworCisgICAgYm9vbGVhbiBtRGF0YUVuYWJsZWQsIG1EYXRhQ29ubmVjdGVkLCBtRGF0YVJvYW1pbmc7CisgICAgaW50IG1EYXRhTGV2ZWw7CisKKyAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhBdWRpb01hbmFnZXIuUklOR0VSX01PREVfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICAgICAgbVNvdW5kQnV0dG9uLnNldEFscGhhKGdldFNpbGVudE1vZGUoKSA/IDB4N0YgOiAweEZGKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhJbnRlbnQuQUNUSU9OX0JBVFRFUllfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVCYXR0ZXJ5KGludGVudCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuUlNTSV9DSEFOR0VEX0FDVElPTikKKyAgICAgICAgICAgICAgICAgICAgfHwgYWN0aW9uLmVxdWFscyhXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKQorICAgICAgICAgICAgICAgICAgICB8fCBhY3Rpb24uZXF1YWxzKFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pCisgICAgICAgICAgICAgICAgICAgIHx8IGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVXaWZpU3RhdGUoaW50ZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9TSU1fU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVTaW1TdGF0ZShpbnRlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgdm9pZCB1cGRhdGVTaW1TdGF0ZShJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIFN0cmluZyBzdGF0ZUV4dHJhID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKEljY0NhcmQuSU5URU5UX0tFWV9JQ0NfU1RBVEUpOworICAgICAgICBpZiAoSWNjQ2FyZC5JTlRFTlRfVkFMVUVfSUNDX0FCU0VOVC5lcXVhbHMoc3RhdGVFeHRyYSkpIHsKKyAgICAgICAgICAgIG1TaW1TdGF0ZSA9IEljY0NhcmQuU3RhdGUuQUJTRU5UOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEljY0NhcmQuSU5URU5UX1ZBTFVFX0lDQ19SRUFEWS5lcXVhbHMoc3RhdGVFeHRyYSkpIHsKKyAgICAgICAgICAgIG1TaW1TdGF0ZSA9IEljY0NhcmQuU3RhdGUuUkVBRFk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoSWNjQ2FyZC5JTlRFTlRfVkFMVUVfSUNDX0xPQ0tFRC5lcXVhbHMoc3RhdGVFeHRyYSkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NrZWRSZWFzb24gPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoSWNjQ2FyZC5JTlRFTlRfS0VZX0xPQ0tFRF9SRUFTT04pOworICAgICAgICAgICAgaWYgKEljY0NhcmQuSU5URU5UX1ZBTFVFX0xPQ0tFRF9PTl9QSU4uZXF1YWxzKGxvY2tlZFJlYXNvbikpIHsKKyAgICAgICAgICAgICAgICBtU2ltU3RhdGUgPSBJY2NDYXJkLlN0YXRlLlBJTl9SRVFVSVJFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKEljY0NhcmQuSU5URU5UX1ZBTFVFX0xPQ0tFRF9PTl9QVUsuZXF1YWxzKGxvY2tlZFJlYXNvbikpIHsKKyAgICAgICAgICAgICAgICBtU2ltU3RhdGUgPSBJY2NDYXJkLlN0YXRlLlBVS19SRVFVSVJFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1TaW1TdGF0ZSA9IEljY0NhcmQuU3RhdGUuTkVUV09SS19MT0NLRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2ltU3RhdGUgPSBJY2NDYXJkLlN0YXRlLlVOS05PV047CisgICAgICAgIH0KKyAgICAgICAgdXBkYXRlRGF0YVN0YXRlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQ2RtYSgpIHsKKyAgICAgICAgcmV0dXJuIChtU2lnbmFsU3RyZW5ndGggIT0gbnVsbCkgJiYgIW1TaWduYWxTdHJlbmd0aC5pc0dzbSgpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0V2ZG8oKSB7CisgICAgICAgIHJldHVybiAoIChtU2VydmljZVN0YXRlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICYmICgobVNlcnZpY2VTdGF0ZS5nZXRSYWRpb1RlY2hub2xvZ3koKQorICAgICAgICAgICAgICAgICAgICAgICAgPT0gU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfRVZET18wKQorICAgICAgICAgICAgICAgICAgICAgfHwgKG1TZXJ2aWNlU3RhdGUuZ2V0UmFkaW9UZWNobm9sb2d5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgID09IFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZX0VWRE9fQSkKKyAgICAgICAgICAgICAgICAgICAgIHx8IChtU2VydmljZVN0YXRlLmdldFJhZGlvVGVjaG5vbG9neSgpCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9FVkRPX0IpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1NlcnZpY2UoKSB7CisgICAgICAgIGlmIChtU2VydmljZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobVNlcnZpY2VTdGF0ZS5nZXRTdGF0ZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuU1RBVEVfT1VUX09GX1NFUlZJQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuU1RBVEVfUE9XRVJfT0ZGOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRDZG1hTGV2ZWwoKSB7CisgICAgICAgIGlmIChtU2lnbmFsU3RyZW5ndGggPT0gbnVsbCkgcmV0dXJuIDA7CisgICAgICAgIGZpbmFsIGludCBjZG1hRGJtID0gbVNpZ25hbFN0cmVuZ3RoLmdldENkbWFEYm0oKTsKKyAgICAgICAgZmluYWwgaW50IGNkbWFFY2lvID0gbVNpZ25hbFN0cmVuZ3RoLmdldENkbWFFY2lvKCk7CisgICAgICAgIGludCBsZXZlbERibSA9IDA7CisgICAgICAgIGludCBsZXZlbEVjaW8gPSAwOworCisgICAgICAgIGlmIChjZG1hRGJtID49IC03NSkgbGV2ZWxEYm0gPSA0OworICAgICAgICBlbHNlIGlmIChjZG1hRGJtID49IC04NSkgbGV2ZWxEYm0gPSAzOworICAgICAgICBlbHNlIGlmIChjZG1hRGJtID49IC05NSkgbGV2ZWxEYm0gPSAyOworICAgICAgICBlbHNlIGlmIChjZG1hRGJtID49IC0xMDApIGxldmVsRGJtID0gMTsKKyAgICAgICAgZWxzZSBsZXZlbERibSA9IDA7CisKKyAgICAgICAgLy8gRWMvSW8gYXJlIGluIGRCKjEwCisgICAgICAgIGlmIChjZG1hRWNpbyA+PSAtOTApIGxldmVsRWNpbyA9IDQ7CisgICAgICAgIGVsc2UgaWYgKGNkbWFFY2lvID49IC0xMTApIGxldmVsRWNpbyA9IDM7CisgICAgICAgIGVsc2UgaWYgKGNkbWFFY2lvID49IC0xMzApIGxldmVsRWNpbyA9IDI7CisgICAgICAgIGVsc2UgaWYgKGNkbWFFY2lvID49IC0xNTApIGxldmVsRWNpbyA9IDE7CisgICAgICAgIGVsc2UgbGV2ZWxFY2lvID0gMDsKKworICAgICAgICByZXR1cm4gKGxldmVsRGJtIDwgbGV2ZWxFY2lvKSA/IGxldmVsRGJtIDogbGV2ZWxFY2lvOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldEV2ZG9MZXZlbCgpIHsKKyAgICAgICAgaWYgKG1TaWduYWxTdHJlbmd0aCA9PSBudWxsKSByZXR1cm4gMDsKKyAgICAgICAgaW50IGV2ZG9EYm0gPSBtU2lnbmFsU3RyZW5ndGguZ2V0RXZkb0RibSgpOworICAgICAgICBpbnQgZXZkb1NuciA9IG1TaWduYWxTdHJlbmd0aC5nZXRFdmRvU25yKCk7CisgICAgICAgIGludCBsZXZlbEV2ZG9EYm0gPSAwOworICAgICAgICBpbnQgbGV2ZWxFdmRvU25yID0gMDsKKworICAgICAgICBpZiAoZXZkb0RibSA+PSAtNjUpIGxldmVsRXZkb0RibSA9IDQ7CisgICAgICAgIGVsc2UgaWYgKGV2ZG9EYm0gPj0gLTc1KSBsZXZlbEV2ZG9EYm0gPSAzOworICAgICAgICBlbHNlIGlmIChldmRvRGJtID49IC05MCkgbGV2ZWxFdmRvRGJtID0gMjsKKyAgICAgICAgZWxzZSBpZiAoZXZkb0RibSA+PSAtMTA1KSBsZXZlbEV2ZG9EYm0gPSAxOworICAgICAgICBlbHNlIGxldmVsRXZkb0RibSA9IDA7CisKKyAgICAgICAgaWYgKGV2ZG9TbnIgPj0gNykgbGV2ZWxFdmRvU25yID0gNDsKKyAgICAgICAgZWxzZSBpZiAoZXZkb1NuciA+PSA1KSBsZXZlbEV2ZG9TbnIgPSAzOworICAgICAgICBlbHNlIGlmIChldmRvU25yID49IDMpIGxldmVsRXZkb1NuciA9IDI7CisgICAgICAgIGVsc2UgaWYgKGV2ZG9TbnIgPj0gMSkgbGV2ZWxFdmRvU25yID0gMTsKKyAgICAgICAgZWxzZSBsZXZlbEV2ZG9TbnIgPSAwOworCisgICAgICAgIHJldHVybiAobGV2ZWxFdmRvRGJtIDwgbGV2ZWxFdmRvU25yKSA/IGxldmVsRXZkb0RibSA6IGxldmVsRXZkb1NucjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlRGF0YVN0YXRlKCkgeworICAgICAgICBtRGF0YUNvbm5lY3RlZCA9IGhhc1NlcnZpY2UoKSAmJiAobURhdGFTdGF0ZSA9PSBUZWxlcGhvbnlNYW5hZ2VyLkRBVEFfQ09OTkVDVEVEKTsKKworICAgICAgICBpZiAoaXNDZG1hKCkpIHsKKyAgICAgICAgICAgIC8vIHRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gYSB2YWx1ZSBmcm9tIDAgdG8gNCwgaW5jbHVzaXZlCisgICAgICAgICAgICBpZiAoKG1QaG9uZVN0YXRlID09IFRlbGVwaG9ueU1hbmFnZXIuQ0FMTF9TVEFURV9JRExFKSAmJiBpc0V2ZG8oKSl7CisgICAgICAgICAgICAgICAgbURhdGFMZXZlbCA9IGdldEV2ZG9MZXZlbCgpICogMjU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1EYXRhTGV2ZWwgPSBnZXRDZG1hTGV2ZWwoKSAqIDI1OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gR1NNCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBhc3UgPSAobVNpZ25hbFN0cmVuZ3RoID09IG51bGwpID8gMCA6IG1TaWduYWxTdHJlbmd0aC5nZXRHc21TaWduYWxTdHJlbmd0aCgpOworCisgICAgICAgICAgICAvLyBhc3Ugb24gWzAsMzFdOyA5OSA9IHVua25vd24KKyAgICAgICAgICAgIC8vIEFuZHJvaWQgaGFzIGhpc3RvcmljYWxseSBzaG93biBhbnl0aGluZyA+PTEyIGFzICJmdWxsIgorICAgICAgICAgICAgLy8gWFhYOiB0dW5lIHRoaXMgYmFzZWQgb24gSW5kdXN0cnkgQmVzdCBQcmFjdGljZXMoVE0pCisgICAgICAgICAgICBpZiAoYXN1IDw9IDIgfHwgYXN1ID09IDk5KSBtRGF0YUxldmVsID0gMDsKKyAgICAgICAgICAgIGVsc2UgbURhdGFMZXZlbCA9IChpbnQpKCgoZmxvYXQpTWF0aC5tYXgoYXN1LCAxNSkgLyAxNSkgKiAxMDApOworCisgICAgICAgICAgICBtRGF0YVJvYW1pbmcgPSBtUGhvbmUuaXNOZXR3b3JrUm9hbWluZygpOworCisgICAgICAgICAgICBtRGF0YUNvbm5lY3RlZCA9IG1EYXRhQ29ubmVjdGVkCisgICAgICAgICAgICAgICAgJiYgKG1TaW1TdGF0ZSA9PSBJY2NDYXJkLlN0YXRlLlJFQURZIHx8IG1TaW1TdGF0ZSA9PSBJY2NDYXJkLlN0YXRlLlVOS05PV04pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKERFQlVHX1NJR05BTCB8fCBERUJVRykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZURhdGFTdGF0ZTogY29ubmVjdGVkPSIgKyBtRGF0YUNvbm5lY3RlZCAKKyAgICAgICAgICAgICAgICAgICAgKyAiIGxldmVsPSIgKyBtRGF0YUxldmVsCisgICAgICAgICAgICAgICAgICAgICsgIiBpc0V2ZG89IiArIGlzRXZkbygpCisgICAgICAgICAgICAgICAgICAgICsgIiBpc0NkbWE9IiArIGlzQ2RtYSgpCisgICAgICAgICAgICAgICAgICAgICsgIiBtUGhvbmVTdGF0ZT0iICsgbVBob25lU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1EYXRhU3RhdGU9IiArIG1EYXRhU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlZnJlc2hTaWduYWxNZXRlcnMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlV2lmaVN0YXRlKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZVdpZmlTdGF0ZTogIiArIGludGVudCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiB3YXNDb25uZWN0ZWQgPSBtV2lmaUNvbm5lY3RlZDsKKworICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgbVdpZmlFbmFibGVkID0gaW50ZW50LmdldEludEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1dJRklfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfVU5LTk9XTikgPT0gV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9FTkFCTEVEOworICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtJbmZvIG5ldHdvcmtJbmZvID0gKE5ldHdvcmtJbmZvKQorICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FVFdPUktfSU5GTyk7CisgICAgICAgICAgICBtV2lmaUNvbm5lY3RlZCA9IG5ldHdvcmtJbmZvICE9IG51bGwgJiYgbmV0d29ya0luZm8uaXNDb25uZWN0ZWQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICBmaW5hbCBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIGRldGFpbGVkU3RhdGUgPSBXaWZpSW5mby5nZXREZXRhaWxlZFN0YXRlT2YoCisgICAgICAgICAgICAgICAgICAgIChTdXBwbGljYW50U3RhdGUpaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVdfU1RBVEUpKTsKKyAgICAgICAgICAgIG1XaWZpQ29ubmVjdGVkID0gZGV0YWlsZWRTdGF0ZSA9PSBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRDsKKyAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKFdpZmlNYW5hZ2VyLlJTU0lfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbmV3UnNzaSA9IGludGVudC5nZXRJbnRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVdfUlNTSSwgLTIwMCk7CisgICAgICAgICAgICBpbnQgbmV3U2lnbmFsTGV2ZWwgPSBXaWZpTWFuYWdlci5jYWxjdWxhdGVTaWduYWxMZXZlbChuZXdSc3NpLCA2KSAqIDIwOworICAgICAgICAgICAgbVdpZmlMZXZlbCA9IG1XaWZpQ29ubmVjdGVkID8gbmV3U2lnbmFsTGV2ZWwgOiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1XaWZpQ29ubmVjdGVkICYmICF3YXNDb25uZWN0ZWQpIHsKKyAgICAgICAgICAgIFdpZmlJbmZvIGluZm8gPSBtV2lmaU1hbmFnZXIuZ2V0Q29ubmVjdGlvbkluZm8oKTsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlV2lmaVN0YXRlOiBqdXN0IGNvbm5lY3RlZDogaW5mbz0iICsgaW5mbyk7CisKKyAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBncmFiIHRoZSBpbml0aWFsIHNpZ25hbCBzdHJlbmd0aAorICAgICAgICAgICAgICAgIG1XaWZpTGV2ZWwgPSBXaWZpTWFuYWdlci5jYWxjdWxhdGVTaWduYWxMZXZlbChpbmZvLmdldFJzc2koKSwgMTAxKTsKKworICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIFNTSUQKKyAgICAgICAgICAgICAgICBtV2lmaVNzaWQgPSBpbmZvLmdldFNTSUQoKTsKKyAgICAgICAgICAgICAgICBpZiAobVdpZmlTc2lkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gT0ssIGl0J3Mgbm90IGluIHRoZSBjb25uZWN0aW9uSW5mbzsgd2UgaGF2ZSB0byBnbyBodW50aW5nIGZvciBpdAorICAgICAgICAgICAgICAgICAgICBMaXN0PFdpZmlDb25maWd1cmF0aW9uPiBuZXR3b3JrcyA9IG1XaWZpTWFuYWdlci5nZXRDb25maWd1cmVkTmV0d29ya3MoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChXaWZpQ29uZmlndXJhdGlvbiBuZXQgOiBuZXR3b3JrcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ldC5uZXR3b3JrSWQgPT0gaW5mby5nZXROZXR3b3JrSWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWZpU3NpZCA9IG5ldC5TU0lEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVmcmVzaFNpZ25hbE1ldGVycygpOworICAgIH0KKworICAgIC8vIGZpZ3VyZSBvdXQgd2hhdCB0byBzaG93OiBmaXJzdCB3aWZpLCB0aGVuIDNHLCB0aGVuIG5vdGhpbmcKKyAgICB2b2lkIHJlZnJlc2hTaWduYWxNZXRlcnMoKSB7CisgICAgICAgIGlmIChtU2lnbmFsTWV0ZXIgPT0gbnVsbCkgcmV0dXJuOyAvLyBubyBVSSB5ZXQKKworICAgICAgICBDb250ZXh0IGN0eHQgPSBnZXRDb250ZXh0KCk7CisKKyAgICAgICAgU3RyaW5nIHRleHQgPSBudWxsOworICAgICAgICBpbnQgbGV2ZWwgPSAwOworCisgICAgICAgIGlmIChtV2lmaUNvbm5lY3RlZCkgeworICAgICAgICAgICAgaWYgKG1XaWZpU3NpZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGV4dCA9IGN0eHQuZ2V0U3RyaW5nKFIuc3RyaW5nLnN5c3RlbV9wYW5lbF9zaWduYWxfbWV0ZXJfd2lmaV9ub3NzaWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gY3R4dC5nZXRTdHJpbmcoUi5zdHJpbmcuc3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl93aWZpX3NzaWRfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lmaVNzaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGV2ZWwgPSBtV2lmaUxldmVsOworICAgICAgICB9IGVsc2UgaWYgKG1EYXRhQ29ubmVjdGVkKSB7CisgICAgICAgICAgICB0ZXh0ID0gY3R4dC5nZXRTdHJpbmcoUi5zdHJpbmcuc3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl9kYXRhX2Nvbm5lY3RlZCk7CisgICAgICAgICAgICBsZXZlbCA9IG1EYXRhTGV2ZWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZXh0ID0gY3R4dC5nZXRTdHJpbmcoUi5zdHJpbmcuc3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl9kaXNjb25uZWN0ZWQpOworICAgICAgICAgICAgbGV2ZWwgPSAwOworICAgICAgICB9CisKKyAgICAgICAgbVNpZ25hbE1ldGVyLnNldEltYWdlUmVzb3VyY2UobVdpZmlDb25uZWN0ZWQgPyBSLmRyYXdhYmxlLndpZmkgOiBSLmRyYXdhYmxlLnNpZ25hbCk7CisgICAgICAgIG1TaWduYWxNZXRlci5zZXRJbWFnZUxldmVsKGxldmVsKTsKKyAgICAgICAgbVNpZ25hbFRleHQuc2V0VGV4dCh0ZXh0KTsKKworICAgICAgICAvLyBoYWNrIGZvciBub3cKKyAgICAgICAgbUJhci5zZXRTaWduYWxNZXRlcihsZXZlbCwgbVdpZmlDb25uZWN0ZWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJhcihUYWJsZXRTdGF0dXNCYXJTZXJ2aWNlIGJhcikgeworICAgICAgICBtQmFyID0gYmFyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUJhdHRlcnkoSW50ZW50IGludGVudCkgeworICAgICAgICBmaW5hbCBpbnQgbGV2ZWwgPSBpbnRlbnQuZ2V0SW50RXh0cmEoImxldmVsIiwgMCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gcGx1Z2dlZCA9IGludGVudC5nZXRJbnRFeHRyYSgicGx1Z2dlZCIsIDApICE9IDA7CisKKyAgICAgICAgbUJhdHRlcnlNZXRlci5zZXRJbWFnZVJlc291cmNlKHBsdWdnZWQgPyBSLmRyYXdhYmxlLmJhdHRlcnlfY2hhcmdpbmcgOiBSLmRyYXdhYmxlLmJhdHRlcnkpOworICAgICAgICBtQmF0dGVyeU1ldGVyLnNldEltYWdlTGV2ZWwobGV2ZWwpOworICAgICAgICBtQmF0dGVyeVRleHQuc2V0VGV4dChnZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKFIuc3RyaW5nLnN5c3RlbV9wYW5lbF9iYXR0ZXJ5X21ldGVyX2Zvcm1hdCwgbGV2ZWwpKTsKKworICAgICAgICAvLyBoYWNrIGZvciBub3cKKyAgICAgICAgbUJhci5zZXRCYXR0ZXJ5TWV0ZXIobGV2ZWwsIHBsdWdnZWQpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3lzdGVtUGFuZWwoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7CisgICAgfQorCisgICAgcHVibGljIFN5c3RlbVBhbmVsKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKKworICAgICAgICAvLyBnZXQgbm90aWZpZWQgb2YgcGhvbmUgc3RhdGUgY2hhbmdlcworICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyIHRlbGVwaG9ueU1hbmFnZXIgPQorICAgICAgICAgICAgICAgIChUZWxlcGhvbnlNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5URUxFUEhPTllfU0VSVklDRSk7CisgICAgICAgIHRlbGVwaG9ueU1hbmFnZXIubGlzdGVuKG1QaG9uZVN0YXRlTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fU0VSVklDRV9TVEFURQorICAgICAgICAgICAgICAgICAgICAgICAgfCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX1NJR05BTF9TVFJFTkdUSFMKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9DQUxMX1NUQVRFCisgICAgICAgICAgICAgICAgICAgICAgICB8IFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fREFUQV9DT05ORUNUSU9OX1NUQVRFCisgICAgICAgICAgICAgICAgICAgICAgICB8IFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fREFUQV9BQ1RJVklUWSk7CisKKyAgICAgICAgLy8gd2lmaSBzdGF0dXMgaW5mbworICAgICAgICBtV2lmaU1hbmFnZXIgPSAoV2lmaU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJRklfU0VSVklDRSk7CisgICAgICAgIAorICAgICAgICAvLyBhdWRpbyBzdGF0dXMgCisgICAgICAgIG1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQVVESU9fU0VSVklDRSk7CisKKyAgICAgICAgLy8gbW9iaWxlIGRhdGEgCisgICAgICAgIG1QaG9uZSA9IChUZWxlcGhvbnlNYW5hZ2VyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlRFTEVQSE9OWV9TRVJWSUNFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7CisgICAgICAgIFRleHRWaWV3IHNldHRpbmdzQnV0dG9uID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnNldHRpbmdzX2J1dHRvbik7CisgICAgICAgIHNldHRpbmdzQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5zdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5BQ1RJT05fU0VUVElOR1MpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spKTsKKyAgICAgICAgICAgICAgICBtQmFyLmFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgfX0pOworCisgICAgICAgIG1CcmlnaHRuZXNzQnV0dG9uID0gKEltYWdlQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLmJyaWdodG5lc3MpOworICAgICAgICBtQnJpZ2h0bmVzc0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICByb3RhdGVCcmlnaHRuZXNzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIG1Tb3VuZEJ1dHRvbiA9IChJbWFnZUJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5zb3VuZCk7CisgICAgICAgIG1Tb3VuZEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBzZXRTaWxlbnRNb2RlKCFnZXRTaWxlbnRNb2RlKCkpOworICAgICAgICAgICAgICAgIG1Tb3VuZEJ1dHRvbi5zZXRBbHBoYShnZXRTaWxlbnRNb2RlKCkgPyAweDdGIDogMHhGRik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBtT3JpZW50YXRpb25CdXR0b24gPSAoSW1hZ2VCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQub3JpZW50YXRpb24pOworICAgICAgICBtT3JpZW50YXRpb25CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQoZ2V0Q29udGV4dCgpLCAiT3JpZW50YXRpb24gY29udHJvbCBub3QgaW1wbGVtZW50ZWQ7IHBsZWFzZSBhZGp1c3QgbmVjayBhbmdsZS4iLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgbUFpcnBsYW5lQnV0dG9uID0gKEltYWdlQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLmFpcnBsYW5lKTsKKyAgICAgICAgbUFpcnBsYW5lQnV0dG9uLnNldEFscGhhKG1BaXJwbGFuZU1vZGUgPyAweEZGIDogMHg3Rik7CisgICAgICAgIG1BaXJwbGFuZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIG5ld01vZGUgPSAhZ2V0QWlycGxhbmVNb2RlKCk7CisgICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQoZ2V0Q29udGV4dCgpLCAiQXR0ZW1wdGluZyB0byB0dXJuICIKKyAgICAgICAgICAgICAgICAgICAgKyAobmV3TW9kZSA/ICJvbiIgOiAib2ZmIikgKyAiIGFpcnBsYW5lIG1vZGUgKGZsYWt5KS4iLAorICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgICAgICBzZXRBaXJwbGFuZU1vZGUobmV3TW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIHJlZ2lzdGVyIGZvciBicm9hZGNhc3RzCisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0JBVFRFUllfQ0hBTkdFRCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuUlNTSV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oVGVsZXBob255SW50ZW50cy5BQ1RJT05fU0lNX1NUQVRFX0NIQU5HRUQpOworICAgICAgICBnZXRDb250ZXh0KCkucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGZpbHRlcik7CisgICAgICAgIAorICAgICAgICBtQmF0dGVyeU1ldGVyID0gKEltYWdlVmlldylmaW5kVmlld0J5SWQoUi5pZC5iYXR0ZXJ5X21ldGVyKTsKKyAgICAgICAgbUJhdHRlcnlNZXRlci5zZXRJbWFnZVJlc291cmNlKFIuZHJhd2FibGUuYmF0dGVyeSk7CisgICAgICAgIG1CYXR0ZXJ5TWV0ZXIuc2V0SW1hZ2VMZXZlbCgwKTsKKyAgICAgICAgbVNpZ25hbE1ldGVyID0gKEltYWdlVmlldylmaW5kVmlld0J5SWQoUi5pZC5zaWduYWxfbWV0ZXIpOworICAgICAgICBtQmF0dGVyeU1ldGVyLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5zaWduYWwpOworICAgICAgICBtQmF0dGVyeU1ldGVyLnNldEltYWdlTGV2ZWwoMCk7CisKKyAgICAgICAgbUJhdHRlcnlUZXh0ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLmJhdHRlcnlfaW5mbyk7CisgICAgICAgIG1TaWduYWxUZXh0ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnNpZ25hbF9pbmZvKTsKKworICAgICAgICByZWZyZXNoU2lnbmFsTWV0ZXJzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIGdldENvbnRleHQoKS51bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vICAgIHByaXZhdGUgYm9vbGVhbiBpc0F1dG9CcmlnaHRuZXNzKCkgeworLy8gICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKKy8vICAgICAgICB0cnkgeworLy8gICAgICAgICAgICBJUG93ZXJNYW5hZ2VyIHBvd2VyID0gSVBvd2VyTWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKAorLy8gICAgICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoInBvd2VyIikpOworLy8gICAgICAgICAgICBpZiAocG93ZXIgIT0gbnVsbCkgeworLy8gICAgICAgICAgICAgICAgaW50IGJyaWdodG5lc3NNb2RlID0gU2V0dGluZ3MuU3lzdGVtLmdldEludChjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERSk7CisvLyAgICAgICAgICAgICAgICByZXR1cm4gYnJpZ2h0bmVzc01vZGUgPT0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfQVVUT01BVElDOworLy8gICAgICAgICAgICB9CisvLyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKy8vICAgICAgICB9IGNhdGNoIChTZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZSkgeworLy8gICAgICAgIH0KKy8vICAgICAgICByZXR1cm4gZmFsc2U7CisvLyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcm90YXRlQnJpZ2h0bmVzcygpIHsKKyAgICAgICAgaW50IGFscGhhID0gMHhGRjsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSVBvd2VyTWFuYWdlciBwb3dlciA9IElQb3dlck1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgicG93ZXIiKSk7CisgICAgICAgICAgICBpZiAocG93ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgICAgICAgICAgaW50IGJyaWdodG5lc3MgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KGNyLAorICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTKTsKKyAgICAgICAgICAgICAgICBpbnQgYnJpZ2h0bmVzc01vZGUgPSBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERV9NQU5VQUw7CisgICAgICAgICAgICAgICAgLy9Pbmx5IGdldCBicmlnaHRuZXNzIHNldHRpbmcgaWYgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfYXV0b21hdGljX2JyaWdodG5lc3NfYXZhaWxhYmxlKSkgeworICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzTW9kZSA9IFNldHRpbmdzLlN5c3RlbS5nZXRJbnQoY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFJvdGF0ZSBBVVRPIC0+IE1JTklNVU0gLT4gREVGQVVMVCAtPiBNQVhJTVVNCisgICAgICAgICAgICAgICAgLy8gVGVjaG5pY2FsbHksIG5vdCBhIHRvZ2dsZS4uLgorICAgICAgICAgICAgICAgIGlmIChicmlnaHRuZXNzTW9kZSA9PSBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERV9BVVRPTUFUSUMpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzcyA9IE1JTklNVU1fQkFDS0xJR0hUOworICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzTW9kZSA9IFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFX01BTlVBTDsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAweDQwOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnJpZ2h0bmVzcyA8IERFRkFVTFRfQkFDS0xJR0hUKSB7CisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MgPSBERUZBVUxUX0JBQ0tMSUdIVDsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAweEMwOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnJpZ2h0bmVzcyA8IE1BWElNVU1fQkFDS0xJR0hUKSB7CisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MgPSBNQVhJTVVNX0JBQ0tMSUdIVDsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAweEZGOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3NNb2RlID0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfQVVUT01BVElDOworICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzID0gTUlOSU1VTV9CQUNLTElHSFQ7CisgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMHg2MDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5ib29sLmNvbmZpZ19hdXRvbWF0aWNfYnJpZ2h0bmVzc19hdmFpbGFibGUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNldCBzY3JlZW4gYnJpZ2h0bmVzcyBtb2RlIChhdXRvbWF0aWMgb3IgbWFudWFsKQorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0ucHV0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzc01vZGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGJyaWdodG5lc3MgaWYgYXV0b21hdGljIG1vZGUgaXNuJ3QgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3NNb2RlID0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfTUFOVUFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYnJpZ2h0bmVzc01vZGUgPT0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfTUFOVUFMKSB7CisgICAgICAgICAgICAgICAgICAgIHBvd2VyLnNldEJhY2tsaWdodEJyaWdodG5lc3MoYnJpZ2h0bmVzcyk7CisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5wdXRJbnQoY3IsIFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTUywgYnJpZ2h0bmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChTZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgbUJyaWdodG5lc3NCdXR0b24uc2V0QWxwaGEoYWxwaGEpOworICAgIH0KKworICAgIFBob25lU3RhdGVMaXN0ZW5lciBtUGhvbmVTdGF0ZUxpc3RlbmVyID0gbmV3IFBob25lU3RhdGVMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZVN0YXRlQ2hhbmdlZChTZXJ2aWNlU3RhdGUgc2VydmljZVN0YXRlKSB7CisgICAgICAgICAgICBpZiAoREVCVUdfU0lHTkFMIHx8IERFQlVHKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgInBob25lIHNlcnZpY2Ugc3RhdGUgY2hhbmdlZDogIiArIHNlcnZpY2VTdGF0ZS5nZXRTdGF0ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TZXJ2aWNlU3RhdGUgPSBzZXJ2aWNlU3RhdGU7CisgICAgICAgICAgICBtQWlycGxhbmVNb2RlID0gc2VydmljZVN0YXRlLmdldFN0YXRlKCkgPT0gU2VydmljZVN0YXRlLlNUQVRFX1BPV0VSX09GRjsKKyAgICAgICAgICAgIGlmIChtQWlycGxhbmVCdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BaXJwbGFuZUJ1dHRvbi5zZXRBbHBoYShtQWlycGxhbmVNb2RlID8gMHhGRiA6IDB4N0YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlRGF0YVN0YXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2lnbmFsU3RyZW5ndGhzQ2hhbmdlZChTaWduYWxTdHJlbmd0aCBzaWduYWxTdHJlbmd0aCkgeworICAgICAgICAgICAgaWYgKERFQlVHX1NJR05BTCB8fCBERUJVRykgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJvblNpZ25hbFN0cmVuZ3Roc0NoYW5nZWQ6ICIgKyBzaWduYWxTdHJlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2lnbmFsU3RyZW5ndGggPSBzaWduYWxTdHJlbmd0aDsKKyAgICAgICAgICAgIHVwZGF0ZURhdGFTdGF0ZSgpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbGxTdGF0ZUNoYW5nZWQoaW50IHN0YXRlLCBTdHJpbmcgaW5jb21pbmdOdW1iZXIpIHsKKyAgICAgICAgICAgIG1QaG9uZVN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICAvLyBJbiBjZG1hLCBpZiBhIHZvaWNlIGNhbGwgaXMgbWFkZSwgUlNTSSBzaG91bGQgc3dpdGNoIHRvIDF4LgorICAgICAgICAgICAgaWYgKGlzQ2RtYSgpKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlRGF0YVN0YXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChpbnQgc3RhdGUsIGludCBuZXR3b3JrVHlwZSkgeworICAgICAgICAgICAgaWYgKERFQlVHX1NJR05BTCB8fCBERUJVRykgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJvbkRhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkOiBzdGF0ZT0iICsgc3RhdGUgCisgICAgICAgICAgICAgICAgICAgICAgICArICIgdHlwZT0iICsgbmV0d29ya1R5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGFTdGF0ZSA9IHN0YXRlOworLy8gICAgICAgICAgICB1cGRhdGVEYXRhTmV0VHlwZShuZXR3b3JrVHlwZSk7CisgICAgICAgICAgICB1cGRhdGVEYXRhU3RhdGUoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZ2V0QWlycGxhbmVNb2RlKCkgeworICAgICAgICByZXR1cm4gbUFpcnBsYW5lTW9kZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0QWlycGxhbmVNb2RlKGJvb2xlYW4gb24pIHsKKyAgICAgICAgU2V0dGluZ3MuU3lzdGVtLnB1dEludCgKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uQUlSUExBTkVfTU9ERV9PTiwKKyAgICAgICAgICAgICAgICBvbiA/IDEgOiAwKTsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9BSVJQTEFORV9NT0RFX0NIQU5HRUQpOworICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVQTEFDRV9QRU5ESU5HKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJzdGF0ZSIsIG9uKTsKKyAgICAgICAgZ2V0Q29udGV4dCgpLnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBib29sZWFuIGdldFNpbGVudE1vZGUoKSB7CisgICAgICAgIHJldHVybiBtQXVkaW9NYW5hZ2VyLmdldFJpbmdlck1vZGUoKSAhPSBBdWRpb01hbmFnZXIuUklOR0VSX01PREVfTk9STUFMOworICAgIH0KKworICAgIHZvaWQgc2V0U2lsZW50TW9kZShib29sZWFuIG9uKSB7CisgICAgICAgIGlmIChvbikgeworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRSaW5nZXJNb2RlKChTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5WSUJSQVRFX0lOX1NJTEVOVCwgMSkgPT0gMSkKKyAgICAgICAgICAgICAgICA/IEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9WSUJSQVRFCisgICAgICAgICAgICAgICAgOiBBdWRpb01hbmFnZXIuUklOR0VSX01PREVfU0lMRU5UKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0UmluZ2VyTW9kZShBdWRpb01hbmFnZXIuUklOR0VSX01PREVfTk9STUFMKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvVGFibGV0U3RhdHVzQmFyU2VydmljZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvVGFibGV0U3RhdHVzQmFyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMmM1ZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvVGFibGV0U3RhdHVzQmFyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNzEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0OworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5hcHAuU3RhdHVzQmFyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VySW1wbDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TY3JvbGxWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRTd2l0Y2hlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uTGlzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFyTm90aWZpY2F0aW9uOworCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLio7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKKworcHVibGljIGNsYXNzIFRhYmxldFN0YXR1c0JhclNlcnZpY2UgZXh0ZW5kcyBTdGF0dXNCYXJTZXJ2aWNlIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVGFibGV0U3RhdHVzQmFyIjsKKworCisKKyAgICBpbnQgbUljb25TaXplOworCisgICAgSCBtSGFuZGxlciA9IG5ldyBIKCk7CisKKyAgICAvLyB0cmFja2luZyBhbGwgY3VycmVudCBub3RpZmljYXRpb25zCisgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25EYXRhIG1Ob3RucyA9IG5ldyBOb3RpZmljYXRpb25EYXRhKCk7CisgICAgCisgICAgVmlldyBtU3RhdHVzQmFyVmlldzsKKyAgICBOb3RpZmljYXRpb25JY29uQXJlYSBtTm90aWZpY2F0aW9uSWNvbkFyZWE7CisKKyAgICBWaWV3IG1Ob3RpZmljYXRpb25QYW5lbDsKKyAgICBTeXN0ZW1QYW5lbCBtU3lzdGVtUGFuZWw7CisKKyAgICBWaWV3R3JvdXAgbVBpbGU7CisgICAgVGV4dFZpZXcgbUNsZWFyQnV0dG9uOworCisgICAgSW1hZ2VWaWV3IG1CYXR0ZXJ5TWV0ZXI7CisgICAgSW1hZ2VWaWV3IG1TaWduYWxNZXRlcjsKKworICAgIE5vdGlmaWNhdGlvbkljb25BcmVhLkljb25MYXlvdXQgbUljb25MYXlvdXQ7CisKKyAgICBLaWNrZXJDb250cm9sbGVyIG1LaWNrZXI7CisgICAgVmlldyBtS2lja2VyVmlldzsKKyAgICBib29sZWFuIG1UaWNraW5nOworICAgIGJvb2xlYW4gbUV4cGFuZGVkVmlzaWJsZTsKKworICAgIC8vIGZvciBkaXNhYmxpbmcgdGhlIHN0YXR1cyBiYXIKKyAgICBpbnQgbURpc2FibGVkID0gMDsKKworICAgIHByb3RlY3RlZCB2b2lkIGFkZFBhbmVsV2luZG93cygpIHsKKyAgICAgICAgbU5vdGlmaWNhdGlvblBhbmVsID0gVmlldy5pbmZsYXRlKHRoaXMsIFIubGF5b3V0LnN5c2Jhcl9wYW5lbF9ub3RpZmljYXRpb25zLCBudWxsKTsKKyAgICAgICAgbVN5c3RlbVBhbmVsID0gKFN5c3RlbVBhbmVsKSBWaWV3LmluZmxhdGUodGhpcywgUi5sYXlvdXQuc3lzYmFyX3BhbmVsX3N5c3RlbSwgbnVsbCk7CisKKyAgICAgICAgbU5vdGlmaWNhdGlvblBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgbVN5c3RlbVBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIGZpbmFsIGludCBiYXJIZWlnaHQ9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCisgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN0YXR1c19iYXJfaGVpZ2h0KTsKKworICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscCA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICA0MDAsIC8vIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1RBVFVTX0JBUl9QQU5FTCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4KKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSF9NT0RBTAorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfV0FUQ0hfT1VUU0lERV9UT1VDSAorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRQorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTSwKKyAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVCk7CisgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LkJPVFRPTSB8IEdyYXZpdHkuTEVGVDsKKyAgICAgICAgbHAuc2V0VGl0bGUoIk5vdGlmaWNhdGlvblBhbmVsIik7CisgICAgICAgIGxwLndpbmRvd0FuaW1hdGlvbnMgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLkFuaW1hdGlvbl9TbGlkaW5nQ2FyZDsKKworICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhtTm90aWZpY2F0aW9uUGFuZWwsIGxwKTsKKworICAgICAgICBscCA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICA1MDAsIC8vIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1RBVFVTX0JBUl9QQU5FTCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4KKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSF9NT0RBTAorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfV0FUQ0hfT1VUU0lERV9UT1VDSAorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRQorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTSwKKyAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVCk7CisgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LkJPVFRPTSB8IEdyYXZpdHkuQ0VOVEVSX0hPUklaT05UQUw7CisgICAgICAgIGxwLnNldFRpdGxlKCJTeXN0ZW1QYW5lbCIpOworICAgICAgICBscC53aW5kb3dBbmltYXRpb25zID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5BbmltYXRpb25fU2xpZGluZ0NhcmQ7CisKKyAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLmFkZFZpZXcobVN5c3RlbVBhbmVsLCBscCk7CisgICAgICAgIG1TeXN0ZW1QYW5lbC5zZXRCYXIodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKCk7IC8vIHdpbGwgYWRkIHRoZSBtYWluIGJhciB2aWV3CisgICAgfQorCisgICAgcHJvdGVjdGVkIFZpZXcgbWFrZVN0YXR1c0JhclZpZXcoKSB7CisgICAgICAgIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKKworICAgICAgICBtSWNvblNpemUgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3RhdHVzX2Jhcl9pY29uX3NpemUpOworCisgICAgICAgIGZpbmFsIFZpZXcgc2IgPSBWaWV3LmluZmxhdGUodGhpcywgUi5sYXlvdXQuc3RhdHVzX2JhciwgbnVsbCk7CisgICAgICAgIG1TdGF0dXNCYXJWaWV3ID0gc2I7CisKKyAgICAgICAgLy8gdGhlIG1vcmUgbm90aWZpY2F0aW9ucyBpY29uCisgICAgICAgIG1Ob3RpZmljYXRpb25JY29uQXJlYSA9IChOb3RpZmljYXRpb25JY29uQXJlYSlzYi5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25JY29ucyk7CisKKyAgICAgICAgLy8gd2hlcmUgdGhlIGljb25zIGdvCisgICAgICAgIG1JY29uTGF5b3V0ID0gKE5vdGlmaWNhdGlvbkljb25BcmVhLkljb25MYXlvdXQpIHNiLmZpbmRWaWV3QnlJZChSLmlkLmljb25zKTsKKworICAgICAgICBtS2lja2VyID0gbmV3IEtpY2tlckNvbnRyb2xsZXIoKENvbnRleHQpdGhpcywgbVN0YXR1c0JhclZpZXcpOworCisgICAgICAgIC8vIFN5c3RlbSBpbmZvIChjZW50ZXIpCisgICAgICAgIG1CYXR0ZXJ5TWV0ZXIgPSAoSW1hZ2VWaWV3KSBzYi5maW5kVmlld0J5SWQoUi5pZC5iYXR0ZXJ5KTsKKyAgICAgICAgbVNpZ25hbE1ldGVyID0gKEltYWdlVmlldykgc2IuZmluZFZpZXdCeUlkKFIuaWQuc2lnbmFsKTsKKworICAgICAgICAvLyBBZGQgdGhlIHdpbmRvd3MKKyAgICAgICAgYWRkUGFuZWxXaW5kb3dzKCk7CisKKyAgICAgICAgbVBpbGUgPSAoVmlld0dyb3VwKW1Ob3RpZmljYXRpb25QYW5lbC5maW5kVmlld0J5SWQoUi5pZC5jb250ZW50KTsKKyAgICAgICAgbVBpbGUucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgCisgICAgICAgIFNjcm9sbFZpZXcgc2Nyb2xsZXIgPSAoU2Nyb2xsVmlldyltUGlsZS5nZXRQYXJlbnQoKTsKKyAgICAgICAgc2Nyb2xsZXIuc2V0RmlsbFZpZXdwb3J0KHRydWUpOworCisgICAgICAgIG1DbGVhckJ1dHRvbiA9IChUZXh0VmlldyltTm90aWZpY2F0aW9uUGFuZWwuZmluZFZpZXdCeUlkKFIuaWQuY2xlYXJfYWxsX2J1dHRvbik7CisgICAgICAgIG1DbGVhckJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUNsZWFyQnV0dG9uTGlzdGVuZXIpOworCisgICAgICAgIHJldHVybiBzYjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGdldFN0YXR1c0JhckdyYXZpdHkoKSB7CisgICAgICAgIHJldHVybiBHcmF2aXR5LkJPVFRPTSB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgSCBleHRlbmRzIEhhbmRsZXIgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfT1BFTl9OT1RJRklDQVRJT05fUEFORUwgPSAxMDAwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BBTkVMID0gMTAwMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX09QRU5fU1lTVEVNX1BBTkVMID0gMTAxMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NMT1NFX1NZU1RFTV9QQU5FTCA9IDEwMTE7CisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG0ud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgTVNHX09QRU5fTk9USUZJQ0FUSU9OX1BBTkVMOgorICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJvcGVuaW5nIG5vdGlmaWNhdGlvbnMgcGFuZWwiKTsKKyAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvblBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGVkVmlzaWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0NMT1NFX05PVElGSUNBVElPTl9QQU5FTDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiY2xvc2luZyBub3RpZmljYXRpb25zIHBhbmVsIik7CisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25QYW5lbC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgICAgIG1FeHBhbmRlZFZpc2libGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfT1BFTl9TWVNURU1fUEFORUw6CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIm9wZW5pbmcgc3lzdGVtIHBhbmVsIik7CisgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1QYW5lbC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0NMT1NFX1NZU1RFTV9QQU5FTDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiY2xvc2luZyBzeXN0ZW0gcGFuZWwiKTsKKyAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0QmF0dGVyeU1ldGVyKGludCBsZXZlbCwgYm9vbGVhbiBwbHVnZ2VkKSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgImJhdHRlcnk9IiArIGxldmVsICsgKHBsdWdnZWQgPyAiIC0gcGx1Z2dlZCIgOiAiIC0gdW5wbHVnZ2VkIikpOworICAgICAgICBtQmF0dGVyeU1ldGVyLnNldEltYWdlUmVzb3VyY2UocGx1Z2dlZCA/IFIuZHJhd2FibGUuYmF0dGVyeV9jaGFyZ2luZyA6IFIuZHJhd2FibGUuYmF0dGVyeSk7CisgICAgICAgIG1CYXR0ZXJ5TWV0ZXIuc2V0SW1hZ2VMZXZlbChsZXZlbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2lnbmFsTWV0ZXIoaW50IGxldmVsLCBib29sZWFuIGlzV2lmaSkgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJzaWduYWw9IiArIGxldmVsKTsKKyAgICAgICAgaWYgKGxldmVsIDwgMCkgeworICAgICAgICAgICAgbVNpZ25hbE1ldGVyLnNldEltYWdlUmVzb3VyY2UoaXNXaWZpID8gUi5kcmF3YWJsZS53aWZpX3NjYW4gOiBSLmRyYXdhYmxlLnNpZ25hbF9zY2FuKTsKKyAgICAgICAgICAgIG1TaWduYWxNZXRlci5zZXRJbWFnZUxldmVsKDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNpZ25hbE1ldGVyLnNldEltYWdlUmVzb3VyY2UoaXNXaWZpID8gUi5kcmF3YWJsZS53aWZpIDogUi5kcmF3YWJsZS5zaWduYWwpOworICAgICAgICAgICAgbVNpZ25hbE1ldGVyLnNldEltYWdlTGV2ZWwobGV2ZWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSWNvbihTdHJpbmcgc2xvdCwgaW50IGluZGV4LCBpbnQgdmlld0luZGV4LCBTdGF0dXNCYXJJY29uIGljb24pIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiYWRkSWNvbigiICsgc2xvdCArICIpIC0+ICIgKyBpY29uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgsCisgICAgICAgICAgICBTdGF0dXNCYXJJY29uIG9sZCwgU3RhdHVzQmFySWNvbiBpY29uKSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgInVwZGF0ZUljb24oIiArIHNsb3QgKyAiKSAtPiAiICsgaWNvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlSWNvbihTdHJpbmcgc2xvdCwgaW50IGluZGV4LCBpbnQgdmlld0luZGV4KSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgInJlbW92ZUljb24oIiArIHNsb3QgKyAiKSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE5vdGlmaWNhdGlvbihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJhZGROb3RpZmljYXRpb24oIiArIGtleSArICIgLT4gIiArIG5vdGlmaWNhdGlvbiArICIpIik7CisgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKKworICAgICAgICBib29sZWFuIGltbWVyc2l2ZSA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW1tZXJzaXZlID0gQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5pc1RvcEFjdGl2aXR5SW1tZXJzaXZlKCk7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiVG9wIGFjdGl2aXR5IGlzICIgKyAoaW1tZXJzaXZlPyJpbW1lcnNpdmUiOiJub3QgaW1tZXJzaXZlIikpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW1tZXJzaXZlKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBpbW1lcnNpdmUgbW9kZSBwb3B1cHMgZm9yIHRhYmxldAorICAgICAgICB9IGVsc2UgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZnVsbFNjcmVlbkludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBub3QgaW1tZXJzaXZlICYgYSBmdWxsLXNjcmVlbiBhbGVydCBzaG91bGQgYmUgc2hvd24KKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJOb3RpZmljYXRpb24gaGFzIGZ1bGxTY3JlZW5JbnRlbnQgYW5kIGFjdGl2aXR5IGlzIG5vdCBpbW1lcnNpdmU7IgorICAgICAgICAgICAgICAgICAgICArICIgc2VuZGluZyBmdWxsU2NyZWVuSW50ZW50Iik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZnVsbFNjcmVlbkludGVudC5zZW5kKCk7CisgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHRpY2soKQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlTm90aWZpY2F0aW9uKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgInVwZGF0ZU5vdGlmaWNhdGlvbigiICsga2V5ICsgIiAtPiAiICsgbm90aWZpY2F0aW9uICsgIikgLy8gVE9ETyIpOworICAgICAgICAKKyAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBvbGRFbnRyeSA9IG1Ob3Rucy5maW5kQnlLZXkoa2V5KTsKKyAgICAgICAgaWYgKG9sZEVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIFNsb2cudyhUQUcsICJ1cGRhdGVOb3RpZmljYXRpb24gZm9yIHVua25vd24ga2V5OiAiICsga2V5KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBvbGROb3RpZmljYXRpb24gPSBvbGRFbnRyeS5ub3RpZmljYXRpb247CisgICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzIG9sZENvbnRlbnRWaWV3ID0gb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50VmlldzsKKworICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBjb250ZW50VmlldyA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudFZpZXc7CisKKyAgICAgICAgaWYgKGZhbHNlKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAib2xkIG5vdGlmaWNhdGlvbjogd2hlbj0iICsgb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCisgICAgICAgICAgICAgICAgICAgICsgIiBvbmdvaW5nPSIgKyBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGV4cGFuZGVkPSIgKyBvbGRFbnRyeS5leHBhbmRlZAorICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIG9sZENvbnRlbnRWaWV3KTsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJuZXcgbm90aWZpY2F0aW9uOiB3aGVuPSIgKyBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KKyAgICAgICAgICAgICAgICAgICAgKyAiIG9uZ29pbmc9IiArIG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQorICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIGNvbnRlbnRWaWV3KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhbiB3ZSBqdXN0IHJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzIGluIHBsYWNlPyAgSWYgd2hlbiBkaWRuJ3QgY2hhbmdlLCB0aGUgb3JkZXIKKyAgICAgICAgLy8gZGlkbid0IGNoYW5nZS4KKyAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbiA9PSBvbGROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KKyAgICAgICAgICAgICAgICAmJiBub3RpZmljYXRpb24uaXNPbmdvaW5nKCkgPT0gb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCisgICAgICAgICAgICAgICAgJiYgb2xkRW50cnkuZXhwYW5kZWQgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRWaWV3ICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50VmlldyAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgY29udGVudFZpZXcuZ2V0UGFja2FnZSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRQYWNrYWdlKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldFBhY2thZ2UoKS5lcXVhbHMoY29udGVudFZpZXcuZ2V0UGFja2FnZSgpKQorICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldExheW91dElkKCkgPT0gY29udGVudFZpZXcuZ2V0TGF5b3V0SWQoKSkgeworICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAicmV1c2luZyBub3RpZmljYXRpb24gZm9yIGtleTogIiArIGtleSk7CisgICAgICAgICAgICBvbGRFbnRyeS5ub3RpZmljYXRpb24gPSBub3RpZmljYXRpb247CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIFJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzCisgICAgICAgICAgICAgICAgY29udGVudFZpZXcucmVhcHBseSh0aGlzLCBvbGRFbnRyeS5jb250ZW50KTsKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGNvbnRlbnRJbnRlbnQKKyAgICAgICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IGNvbnRlbnRJbnRlbnQgPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQ7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRJbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvbGRFbnRyeS5jb250ZW50LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgTm90aWZpY2F0aW9uQ2xpY2tlcihjb250ZW50SW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ucGtnLCBub3RpZmljYXRpb24udGFnLCBub3RpZmljYXRpb24uaWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBpY29uLgorICAgICAgICAgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb24gaWMgPSBuZXcgU3RhdHVzQmFySWNvbihub3RpZmljYXRpb24ucGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb25MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ubnVtYmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9sZEVudHJ5Lmljb24uc2V0KGljKSkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IHVwZGF0ZSBpY29uOiAiICsgaWMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIEl0IGZhaWxlZCB0byBhZGQgY2xlYW5seS4gIExvZywgYW5kIHJlbW92ZSB0aGUgdmlldyBmcm9tIHRoZSBwYW5lbC4KKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQ291bGRuJ3QgcmVhcHBseSB2aWV3cyBmb3IgcGFja2FnZSAiICsgY29udGVudFZpZXcuZ2V0UGFja2FnZSgpLCBlKTsKKyAgICAgICAgICAgICAgICByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOworICAgICAgICAgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIm5vdCByZXVzaW5nIG5vdGlmaWNhdGlvbiBmb3Iga2V5OiAiICsga2V5KTsKKyAgICAgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKGtleSk7CisgICAgICAgICAgICBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzoga2lja2VyOyBpbW1lcnNpdmUgbW9kZQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbihJQmluZGVyIGtleSkgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJyZW1vdmVOb3RpZmljYXRpb24oIiArIGtleSArICIpIC8vIFRPRE8iKTsKKyAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkaXNhYmxlKGludCBzdGF0ZSkgeworICAgICAgICAvKgorICAgICAgICBmaW5hbCBpbnQgb2xkID0gbURpc2FibGVkOworICAgICAgICBmaW5hbCBpbnQgZGlmZiA9IHN0YXRlIF4gb2xkOworICAgICAgICBtRGlzYWJsZWQgPSBzdGF0ZTsKKworICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX0VYUEFORDogeWVzIik7CisgICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgeworICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IHllcyIpOworICAgICAgICAgICAgICAgIGlmIChtVGlja2luZykgeworICAgICAgICAgICAgICAgICAgICBtS2lja2VyLmhhbHQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbkFyZWEuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IG5vIik7CisgICAgICAgICAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29uQXJlYS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChtVGlja2luZyAmJiAoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVI6IHllcyIpOworICAgICAgICAgICAgICAgIG1LaWNrZXIuaGFsdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICovCisgICAgfQorCisgICAgdm9pZCBwZXJmb3JtRGlzYWJsZUFjdGlvbnMoaW50IG5ldCkgeworICAgICAgICAvKgorICAgICAgICBpbnQgb2xkID0gbURpc2FibGVkOworICAgICAgICBpbnQgZGlmZiA9IG5ldCBeIG9sZDsKKyAgICAgICAgbURpc2FibGVkID0gbmV0OworCisgICAgICAgIC8vIGFjdCBhY2NvcmRpbmdseQorICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9FWFBBTkQ6IHllcyIpOworICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogeWVzIik7CisgICAgICAgICAgICAgICAgaWYgKG1UaWNraW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29uQXJlYS5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgbUtpY2tlci5oYWx0KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25BcmVhLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiBubyIpOworICAgICAgICAgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbkFyZWEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAobVRpY2tpbmcgJiYgKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUtpY2tlci5oYWx0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKi8KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGljayhTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgeworICAgICAgICAvLyBTaG93IHRoZSB0aWNrZXIgaWYgb25lIGlzIHJlcXVlc3RlZC4gQWxzbyBkb24ndCBkbyB0aGlzCisgICAgICAgIC8vIHVudGlsIHN0YXR1cyBiYXIgd2luZG93IGlzIGF0dGFjaGVkIHRvIHRoZSB3aW5kb3cgbWFuYWdlciwKKyAgICAgICAgLy8gYmVjYXVzZS4uLiAgd2VsbCwgd2hhdCdzIHRoZSBwb2ludCBvdGhlcndpc2U/ICBBbmQgdHJ5aW5nIHRvCisgICAgICAgIC8vIHJ1biBhIHRpY2tlciB3aXRob3V0IGJlaW5nIGF0dGFjaGVkIHdpbGwgY3Jhc2ghCisgICAgICAgIGlmIChuLm5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ICE9IG51bGwgJiYgbVN0YXR1c0JhclZpZXcuZ2V0V2luZG93VG9rZW4oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoMCA9PSAobURpc2FibGVkICYgKFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSkpIHsKKyAgICAgICAgICAgICAgICBtS2lja2VyLmFkZEVudHJ5KG4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBLaWNrZXJDb250cm9sbGVyIHsKKyAgICAgICAgVmlldyBtVmlldzsKKyAgICAgICAgSW1hZ2VWaWV3IG1LaWNrZXJJY29uOworICAgICAgICBUZXh0U3dpdGNoZXIgbUtpY2tlclRleHQ7CisKKyAgICAgICAgcHVibGljIEtpY2tlckNvbnRyb2xsZXIoQ29udGV4dCBjb250ZXh0LCBWaWV3IHNiKSB7CisgICAgICAgICAgICBtVmlldyA9IHNiLmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlcik7CisgICAgICAgICAgICBtS2lja2VySWNvbiA9IChJbWFnZVZpZXcpIG1WaWV3LmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlckljb24pOworICAgICAgICAgICAgbUtpY2tlclRleHQgPSAoVGV4dFN3aXRjaGVyKSBtVmlldy5maW5kVmlld0J5SWQoUi5pZC50aWNrZXJUZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbHQoKSB7CisgICAgICAgICAgICB0aWNrZXJIYWx0aW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGRFbnRyeShTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgeworICAgICAgICAgICAgbUtpY2tlckljb24uc2V0SW1hZ2VSZXNvdXJjZShuLm5vdGlmaWNhdGlvbi5pY29uKTsKKyAgICAgICAgICAgIG1LaWNrZXJUZXh0LnNldEN1cnJlbnRUZXh0KG4ubm90aWZpY2F0aW9uLnRpY2tlclRleHQpOworICAgICAgICAgICAgdGlja2VyU3RhcnRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHRpY2tlclN0YXJ0aW5nKCkgeworICAgICAgICAgICAgbVRpY2tpbmcgPSB0cnVlOworICAgICAgICAgICAgbUljb25MYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUtpY2tlclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdGlja2VyRG9uZSgpIHsKKyAgICAgICAgICAgIG1JY29uTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1LaWNrZXJWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1UaWNraW5nID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0aWNrZXJIYWx0aW5nKCkgeworICAgICAgICAgICAgbUljb25MYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbUtpY2tlclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbVRpY2tpbmcgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFuaW1hdGVFeHBhbmQoKSB7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEguTVNHX09QRU5fTk9USUZJQ0FUSU9OX1BBTkVMKTsKKyAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShILk1TR19PUEVOX05PVElGSUNBVElPTl9QQU5FTCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYW5pbWF0ZUNvbGxhcHNlKCkgeworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhILk1TR19DTE9TRV9OT1RJRklDQVRJT05fUEFORUwpOworICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKEguTVNHX0NMT1NFX05PVElGSUNBVElPTl9QQU5FTCk7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEguTVNHX0NMT1NFX1NZU1RFTV9QQU5FTCk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoSC5NU0dfQ0xPU0VfU1lTVEVNX1BBTkVMKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZmljYXRpb25JY29uc0NsaWNrZWQoVmlldyB2KSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgImNsaWNrZWQgbm90aWZpY2F0aW9uIGljb25zIik7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEguTVNHX0NMT1NFX1NZU1RFTV9QQU5FTCk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoSC5NU0dfQ0xPU0VfU1lTVEVNX1BBTkVMKTsKKworICAgICAgICBpbnQgbXNnID0gKG1Ob3RpZmljYXRpb25QYW5lbC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FKSAKKyAgICAgICAgICAgID8gSC5NU0dfT1BFTl9OT1RJRklDQVRJT05fUEFORUwKKyAgICAgICAgICAgIDogSC5NU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BBTkVMOworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhtc2cpOworICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKG1zZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3lzdGVtSW5mb0NsaWNrZWQoVmlldyB2KSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgImNsaWNrZWQgc3lzdGVtIGluZm8iKTsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoSC5NU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BBTkVMKTsKKyAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShILk1TR19DTE9TRV9OT1RJRklDQVRJT05fUEFORUwpOworCisgICAgICAgIGludCBtc2cgPSAobVN5c3RlbVBhbmVsLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUpIAorICAgICAgICAgICAgPyBILk1TR19PUEVOX1NZU1RFTV9QQU5FTAorICAgICAgICAgICAgOiBILk1TR19DTE9TRV9TWVNURU1fUEFORUw7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKG1zZyk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UobXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWNlbnRCdXR0b25DbGlja2VkKFZpZXcgdikgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJjbGlja2VkIHJlY2VudCBhcHBzIik7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgIGludGVudC5zZXRDbGFzcyh0aGlzLCBSZWNlbnRBcHBsaWNhdGlvbnNBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIGludGVudC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSworICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfRVhDTFVERV9GUk9NX1JFQ0VOVFMpOworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuY2VsIHRoaXMgbm90aWZpY2F0aW9uIGFuZCB0ZWxsIHRoZSBzdGF0dXMgYmFyIHNlcnZpY2UgYWJvdXQgdGhlIGZhaWx1cmUuIEhvbGQgbm8gbG9ja3MuCisgICAgICovCisgICAgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4sIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvbihrZXkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJhclNlcnZpY2Uub25Ob3RpZmljYXRpb25FcnJvcihuLnBrZywgbi50YWcsIG4uaWQsIG4udWlkLCBuLmluaXRpYWxQaWQsIG1lc3NhZ2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIFRoZSBlbmQgaXMgbmlnaC4KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUNsZWFyQnV0dG9uTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uQ2xlYXJBbGxOb3RpZmljYXRpb25zKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkIGlmIHdlJ3JlIGhlcmUuCisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGNsYXNzIE5vdGlmaWNhdGlvbkNsaWNrZXIgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtSW50ZW50OworICAgICAgICBwcml2YXRlIFN0cmluZyBtUGtnOworICAgICAgICBwcml2YXRlIFN0cmluZyBtVGFnOworICAgICAgICBwcml2YXRlIGludCBtSWQ7CisKKyAgICAgICAgTm90aWZpY2F0aW9uQ2xpY2tlcihQZW5kaW5nSW50ZW50IGludGVudCwgU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkKSB7CisgICAgICAgICAgICBtSW50ZW50ID0gaW50ZW50OworICAgICAgICAgICAgbVBrZyA9IHBrZzsKKyAgICAgICAgICAgIG1UYWcgPSB0YWc7CisgICAgICAgICAgICBtSWQgPSBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBpbnRlbnQgd2UgYXJlIHNlbmRpbmcgaXMgZm9yIHRoZSBhcHBsaWNhdGlvbiwgd2hpY2gKKyAgICAgICAgICAgICAgICAvLyB3b24ndCBoYXZlIHBlcm1pc3Npb24gdG8gaW1tZWRpYXRlbHkgc3RhcnQgYW4gYWN0aXZpdHkgYWZ0ZXIKKyAgICAgICAgICAgICAgICAvLyB0aGUgdXNlciBzd2l0Y2hlcyB0byBob21lLiAgV2Uga25vdyBpdCBpcyBzYWZlIHRvIGRvIGF0IHRoaXMKKyAgICAgICAgICAgICAgICAvLyBwb2ludCwgc28gbWFrZSBzdXJlIG5ldyBhY3Rpdml0eSBzd2l0Y2hlcyBhcmUgbm93IGFsbG93ZWQuCisgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5yZXN1bWVBcHBTd2l0Y2hlcygpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1JbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludFtdIHBvcyA9IG5ldyBpbnRbMl07CisgICAgICAgICAgICAgICAgdi5nZXRMb2NhdGlvbk9uU2NyZWVuKHBvcyk7CisgICAgICAgICAgICAgICAgSW50ZW50IG92ZXJsYXkgPSBuZXcgSW50ZW50KCk7CisgICAgICAgICAgICAgICAgb3ZlcmxheS5zZXRTb3VyY2VCb3VuZHMoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVjdChwb3NbMF0sIHBvc1sxXSwgcG9zWzBdK3YuZ2V0V2lkdGgoKSwgcG9zWzFdK3YuZ2V0SGVpZ2h0KCkpKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtSW50ZW50LnNlbmQoVGFibGV0U3RhdHVzQmFyU2VydmljZS50aGlzLCAwLCBvdmVybGF5KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YWNrIHRyYWNlIGlzbid0IHZlcnkgaGVscGZ1bCBoZXJlLiAgSnVzdCBsb2cgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlLgorICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiU2VuZGluZyBjb250ZW50SW50ZW50IGZhaWxlZDogIiArIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vbk5vdGlmaWNhdGlvbkNsaWNrKG1Qa2csIG1UYWcsIG1JZCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkIGlmIHdlJ3JlIGhlcmUuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBzaGFkZSBpZiBpdCB3YXMgb3BlbgorICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisKKyAgICAgICAgICAgIC8vIElmIHRoaXMgY2xpY2sgd2FzIG9uIHRoZSBpbnRydWRlciBhbGVydCwgaGlkZSB0aGF0IGluc3RlYWQKKy8vICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfSElERV9JTlRSVURFUik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gcmVtb3ZlTm90aWZpY2F0aW9uVmlld3MoSUJpbmRlciBrZXkpIHsKKyAgICAgICAgTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBlbnRyeSA9IG1Ob3Rucy5yZW1vdmUoa2V5KTsKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZW1vdmVOb3RpZmljYXRpb24gZm9yIHVua25vd24ga2V5OiAiICsga2V5KTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIC8vIFJlbW92ZSB0aGUgZXhwYW5kZWQgdmlldy4KKyAgICAgICAgVmlld0dyb3VwIHJvd1BhcmVudCA9IChWaWV3R3JvdXApZW50cnkucm93LmdldFBhcmVudCgpOworICAgICAgICBpZiAocm93UGFyZW50ICE9IG51bGwpIHJvd1BhcmVudC5yZW1vdmVWaWV3KGVudHJ5LnJvdyk7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgaWNvbi4KKy8vICAgICAgICBWaWV3R3JvdXAgaWNvblBhcmVudCA9IChWaWV3R3JvdXApZW50cnkuaWNvbi5nZXRQYXJlbnQoKTsKKy8vICAgICAgICBpZiAoaWNvblBhcmVudCAhPSBudWxsKSBpY29uUGFyZW50LnJlbW92ZVZpZXcoZW50cnkuaWNvbik7CisgICAgICAgIHJlZnJlc2hJY29ucygpOworCisgICAgICAgIHJldHVybiBlbnRyeS5ub3RpZmljYXRpb247CisgICAgfQorCisgICAgU3RhdHVzQmFySWNvblZpZXcgYWRkTm90aWZpY2F0aW9uVmlld3MoSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5PSIgKyBrZXkgKyAiLCBub3RpZmljYXRpb249IiArIG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBpY29uLgorICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uVmlldyBpY29uVmlldyA9IG5ldyBTdGF0dXNCYXJJY29uVmlldyh0aGlzLAorICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5wa2cgKyAiLzB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobm90aWZpY2F0aW9uLmlkKSk7CisgICAgICAgIGljb25WaWV3LnNldFNjYWxlVHlwZShJbWFnZVZpZXcuU2NhbGVUeXBlLkNFTlRFUl9JTlNJREUpOworCisgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb24gaWMgPSBuZXcgU3RhdHVzQmFySWNvbihub3RpZmljYXRpb24ucGtnLAorICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb24sCisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbkxldmVsLAorICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLm51bWJlcik7CisgICAgICAgIGlmICghaWNvblZpZXcuc2V0KGljKSkgeworICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZG4ndCBhdHRhY2ggU3RhdHVzQmFySWNvbjogIiArIGljKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgZXhwYW5kZWQgdmlldy4KKyAgICAgICAgTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBlbnRyeSA9IG5ldyBOb3RpZmljYXRpb25EYXRhLkVudHJ5KGtleSwgbm90aWZpY2F0aW9uLCBpY29uVmlldyk7CisgICAgICAgIGlmICghaW5mbGF0ZVZpZXdzKGVudHJ5LCBtUGlsZSkpIHsKKyAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKGtleSwgbm90aWZpY2F0aW9uLCAiQ291bGRuJ3QgZXhwYW5kIFJlbW90ZVZpZXdzIGZvcjogIgorICAgICAgICAgICAgICAgICAgICArIG5vdGlmaWNhdGlvbik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLyBBZGQgdGhlIGljb24uCisgICAgICAgIG1Ob3Rucy5hZGQoZW50cnkpOworICAgICAgICByZWZyZXNoSWNvbnMoKTsKKworICAgICAgICByZXR1cm4gaWNvblZpZXc7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hJY29ucygpIHsKKyAgICAgICAgLy8gWFhYOiBuZWVkIHRvIGltcGxlbWVudCBhIG5ldyBsaW1pdGVkIGxpbmVhciBsYXlvdXQgY2xhc3MKKyAgICAgICAgLy8gdG8gYXZvaWQgcmVtb3ZpbmcgJiByZWFkZGluZyBldmVyeXRoaW5nCisKKyAgICAgICAgaW50IE4gPSBtTm90bnMuc2l6ZSgpOworICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKG1JY29uU2l6ZSwgbUljb25TaXplKTsKKworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJyZWZyZXNoaW5nIGljb25zICgiICsgTiArICIgbm90aWZpY2F0aW9ucywgbUljb25MYXlvdXQ9IgorICAgICAgICAgICAgICAgICAgICArIG1JY29uTGF5b3V0ICsgIiwgbVBpbGU9IiArIG1QaWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1JY29uTGF5b3V0LnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpPj1OKSBicmVhazsKKyAgICAgICAgICAgIG1JY29uTGF5b3V0LmFkZFZpZXcobU5vdG5zLmdldChOLWktMSkuaWNvbiwgaSwgcGFyYW1zKTsKKyAgICAgICAgfQorCisgICAgICAgIG1QaWxlLnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgIG1QaWxlLmFkZFZpZXcobU5vdG5zLmdldChOLWktMSkucm93KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpbmZsYXRlVmlld3MoTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBlbnRyeSwgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gc2JuID0gZW50cnkubm90aWZpY2F0aW9uOworICAgICAgICBSZW1vdGVWaWV3cyByZW1vdGVWaWV3cyA9IHNibi5ub3RpZmljYXRpb24uY29udGVudFZpZXc7CisgICAgICAgIGlmIChyZW1vdGVWaWV3cyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgdGhlIHJvdyB2aWV3CisgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gKExheW91dEluZmxhdGVyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7CisgICAgICAgIFZpZXcgcm93ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5zdGF0dXNfYmFyX2xhdGVzdF9ldmVudCwgcGFyZW50LCBmYWxzZSk7CisgICAgICAgIFZpZXcgdmV0b0J1dHRvbiA9IHJvdy5maW5kVmlld0J5SWQoUi5pZC52ZXRvKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIF9wa2cgPSBzYm4ucGtnOworICAgICAgICBmaW5hbCBTdHJpbmcgX3RhZyA9IHNibi50YWc7CisgICAgICAgIGZpbmFsIGludCBfaWQgPSBzYm4uaWQ7CisgICAgICAgIHZldG9CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsgCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uTm90aWZpY2F0aW9uQ2xlYXIoX3BrZywgX3RhZywgX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkIGlmIHdlJ3JlIGhlcmUuCisgICAgICAgICAgICAgICAgICAgIH0KKy8vICAgICAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAvLyBiaW5kIHRoZSBjbGljayBldmVudCB0byB0aGUgY29udGVudCBhcmVhCisgICAgICAgIFZpZXdHcm91cCBjb250ZW50ID0gKFZpZXdHcm91cClyb3cuZmluZFZpZXdCeUlkKFIuaWQuY29udGVudCk7CisgICAgICAgIC8vIFhYWDogdXBkYXRlIHRvIGFsbG93IGNvbnRyb2xzIHdpdGhpbiBub3RpZmljYXRpb24gdmlld3MKKyAgICAgICAgY29udGVudC5zZXREZXNjZW5kYW50Rm9jdXNhYmlsaXR5KFZpZXdHcm91cC5GT0NVU19CTE9DS19ERVNDRU5EQU5UUyk7CisvLyAgICAgICAgY29udGVudC5zZXRPbkZvY3VzQ2hhbmdlTGlzdGVuZXIobUZvY3VzQ2hhbmdlTGlzdGVuZXIpOworICAgICAgICBQZW5kaW5nSW50ZW50IGNvbnRlbnRJbnRlbnQgPSBzYm4ubm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQ7CisgICAgICAgIGlmIChjb250ZW50SW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRlbnQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBOb3RpZmljYXRpb25DbGlja2VyKGNvbnRlbnRJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzYm4ucGtnLCBzYm4udGFnLCBzYm4uaWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIFZpZXcgZXhwYW5kZWQgPSBudWxsOworICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4cGFuZGVkID0gcmVtb3RlVmlld3MuYXBwbHkodGhpcywgY29udGVudCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXhwYW5kZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGlkZW50ID0gc2JuLnBrZyArICIvMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhzYm4uaWQpOworICAgICAgICAgICAgU2xvZy5lKFRBRywgImNvdWxkbid0IGluZmxhdGUgdmlldyBmb3Igbm90aWZpY2F0aW9uICIgKyBpZGVudCwgZXhjZXB0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnRlbnQuYWRkVmlldyhleHBhbmRlZCk7CisgICAgICAgICAgICByb3cuc2V0RHJhd2luZ0NhY2hlRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGVudHJ5LnJvdyA9IHJvdzsKKyAgICAgICAgZW50cnkuY29udGVudCA9IGNvbnRlbnQ7CisgICAgICAgIGVudHJ5LmV4cGFuZGVkID0gZXhwYW5kZWQ7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvQW5kcm9pZC5tayBiL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL0FuZHJvaWQubWsKaW5kZXggYjQxNzU5YS4uNWRjMGMzMCAxMDA3NTUKLS0tIGEvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvQW5kcm9pZC5taworKysgYi9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9BbmRyb2lkLm1rCkBAIC01LDYgKzUsNyBAQAogCWFuZHJvaWRfdHRzX1N5bnRoUHJveHkuY3BwCiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAorCWZyYW1ld29ya3MvYmFzZS9uYXRpdmUvaW5jbHVkZSBcCiAJJChKTklfSF9JTkNMVURFKQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL2FuZHJvaWRfdHRzX1N5bnRoUHJveHkuY3BwIGIvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvYW5kcm9pZF90dHNfU3ludGhQcm94eS5jcHAKaW5kZXggMWQ2OTM2MS4uOGRjODhkYiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvYW5kcm9pZF90dHNfU3ludGhQcm94eS5jcHAKKysrIGIvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvYW5kcm9pZF90dHNfU3ludGhQcm94eS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBHb29nbGUgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9qbmkuaD4KICNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvSk5JSGVscC5oPgogI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgotI2luY2x1ZGUgPHR0cy9UdHNFbmdpbmUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL3R0cy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDxtYXRoLmg+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+TmV3U3RyaW5nVVRGKHZhcmlhbnQpKTsKQEAgLTg2NCw4ICs5MTcsOSBAQAogICAgIGNoYXIgYnVmW2J1ZlNpemVdOwogICAgIG1lbXNldChidWYsIDAsIGJ1ZlNpemUpOwogICAgIC8vIFRPRE8gY2hlY2sgcmV0dXJuIGNvZGVzCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPmdldFByb3BlcnR5KCJyYXRlIiwgYnVmLCAmYnVmU2l6ZSk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICBlbmdpbmUtPmZ1bmNzLT5nZXRQcm9wZXJ0eShlbmdpbmUsInJhdGUiLCBidWYsICZidWZTaXplKTsKICAgICB9CiAgICAgcmV0dXJuIGF0b2koYnVmKTsKIH0KZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvS2V5Z3VhcmRWaWV3TWFuYWdlci5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKaW5kZXggYmExZDdmNS4uNzBhNGIyMCAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKQEAgLTExMyw3ICsxMTMsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UKTsKICAgICAgICAgICAgIGxwLnNvZnRJbnB1dE1vZGUgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX0FESlVTVF9QQU47CiAgICAgICAgICAgICBscC53aW5kb3dBbmltYXRpb25zID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5BbmltYXRpb25fTG9ja1NjcmVlbjsKLSAgICAgICAgICAgIGxwLnNjcmVlbk9yaWVudGF0aW9uID0gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9OT1NFTlNPUjsKKworICAgICAgICAgICAgaWYgKG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEJvb2xlYW4oUi5ib29sLmNvbmZpZ19lbmFibGVMb2NrU2NyZWVuUm90YXRpb24pKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm90YXRpb24gc2Vuc29yIGZvciBsb2NrIHNjcmVlbiBPbiEiKTsKKyAgICAgICAgICAgICAgICBscC5zY3JlZW5PcmllbnRhdGlvbiA9IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fU0VOU09SOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3RhdGlvbiBzZW5zb3IgZm9yIGxvY2sgc2NyZWVuIE9mZiEiKTsKKyAgICAgICAgICAgICAgICBscC5zY3JlZW5PcmllbnRhdGlvbiA9IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fTk9TRU5TT1I7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGxwLnNldFRpdGxlKCJLZXlndWFyZCIpOwogICAgICAgICAgICAgbVdpbmRvd0xheW91dFBhcmFtcyA9IGxwOwogCmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3LmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3LmphdmEKaW5kZXggMjc3MDZlZi4uODIyYmU0NiAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1BhdHRlcm5LZXlndWFyZFZpZXcuamF2YQpAQCAtNjQ1LDcgKzY0NSw5IEBACiAgICAgICAgICAgICAvLyBTaG93IExvY2tTY3JlZW4gZmlyc3QgZm9yIGFueSBzY3JlZW4gb3RoZXIgdGhhbiBQYXR0ZXJuIHVubG9jay4KICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdXNpbmdMb2NrUGF0dGVybiA9IG1Mb2NrUGF0dGVyblV0aWxzLmdldEtleWd1YXJkU3RvcmVkUGFzc3dvcmRRdWFsaXR5KCkKICAgICAgICAgICAgICAgICAgICAgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORzsKLSAgICAgICAgICAgIGlmIChpc1NlY3VyZSgpICYmIHVzaW5nTG9ja1BhdHRlcm4pIHsKKworICAgICAgICAgICAgYm9vbGVhbiBzaG93U2xpZGluZ1RhYiA9IGdldFJlc291cmNlcygpLmdldEJvb2xlYW4oUi5ib29sLmNvbmZpZ19lbmFibGVTbGlkaW5nVGFiRmlyc3QpOworICAgICAgICAgICAgaWYgKGlzU2VjdXJlKCkgJiYgKHVzaW5nTG9ja1BhdHRlcm4gfHwgIXNob3dTbGlkaW5nVGFiKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBNb2RlLlVubG9ja1NjcmVlbjsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE1vZGUuTG9ja1NjcmVlbjsKQEAgLTY2Nyw2ICs2NjksNyBAQAogICAgICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX05VTUVSSUM6CiAgICAgICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQzoKICAgICAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUM6CisgICAgICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWDoKICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1vZGUgPSBVbmxvY2tNb2RlLlBhc3N3b3JkOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkc6CkBAIC02ODcsOCArNjkwLDE3IEBACiAKICAgICBwcml2YXRlIHZvaWQgc2hvd1RpbWVvdXREaWFsb2coKSB7CiAgICAgICAgIGludCB0aW1lb3V0SW5TZWNvbmRzID0gKGludCkgTG9ja1BhdHRlcm5VdGlscy5GQUlMRURfQVRURU1QVF9USU1FT1VUX01TIC8gMTAwMDsKKyAgICAgICAgaW50IG1lc3NhZ2VJZCA9IFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlOworICAgICAgICBpZihnZXRVbmxvY2tNb2RlKCkgPT0gVW5sb2NrTW9kZS5QYXNzd29yZCkgeworICAgICAgICAgICAgaWYobUxvY2tQYXR0ZXJuVXRpbHMuZ2V0S2V5Z3VhcmRTdG9yZWRQYXNzd29yZFF1YWxpdHkoKSA9PQorICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDKSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZUlkID0gUi5zdHJpbmcubG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlSWQgPSBSLnN0cmluZy5sb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IG1Db250ZXh0LmdldFN0cmluZygKLSAgICAgICAgICAgICAgICBSLnN0cmluZy5sb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlSWQsCiAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IuZ2V0RmFpbGVkQXR0ZW1wdHMoKSwKICAgICAgICAgICAgICAgICB0aW1lb3V0SW5TZWNvbmRzKTsKICAgICAgICAgZmluYWwgQWxlcnREaWFsb2cgZGlhbG9nID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIobUNvbnRleHQpCmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tTY3JlZW4uamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1NjcmVlbi5qYXZhCmluZGV4IGE1ZWYxZmEuLmY4YzBhYmEgMTAwNjQ0Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1NjcmVlbi5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1NjcmVlbi5qYXZhCkBAIC01OSwxMiArNTksNyBAQAogICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRVcGRhdGVNb25pdG9yIG1VcGRhdGVNb25pdG9yOwogICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRTY3JlZW5DYWxsYmFjayBtQ2FsbGJhY2s7CiAKLSAgICBwcml2YXRlIFRleHRWaWV3IG1DYXJyaWVyOwogICAgIHByaXZhdGUgU2xpZGluZ1RhYiBtU2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtVGltZTsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1EYXRlOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1czE7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtU3RhdHVzMjsKICAgICBwcml2YXRlIFRleHRWaWV3IG1TY3JlZW5Mb2NrZWQ7CiAgICAgcHJpdmF0ZSBUZXh0VmlldyBtRW1lcmdlbmN5Q2FsbFRleHQ7CiAgICAgcHJpdmF0ZSBCdXR0b24gbUVtZXJnZW5jeUNhbGxCdXR0b247CkBAIC05Myw2ICs4OCw4IEBACiAgICAgcHJpdmF0ZSBqYXZhLnRleHQuRGF0ZUZvcm1hdCBtVGltZUZvcm1hdDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZU1lbnVLZXlJbkxvY2tTY3JlZW47CiAKKyAgICBwcml2YXRlIFN0YXR1c1ZpZXcgbVN0YXR1c1ZpZXc7CisKICAgICAvKioKICAgICAgKiBUaGUgc3RhdHVzIG9mIHRoaXMgbG9jayBzY3JlZW4uCiAgICAgICovCkBAIC0xOTUsMTQgKzE5Miw3IEBACiAgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmtleWd1YXJkX3NjcmVlbl90YWJfdW5sb2NrX2xhbmQsIHRoaXMsIHRydWUpOwogICAgICAgICB9CiAKLSAgICAgICAgbUNhcnJpZXIgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmNhcnJpZXIpOwotICAgICAgICAvLyBSZXF1aXJlZCBmb3IgTWFycXVlZSB0byB3b3JrCi0gICAgICAgIG1DYXJyaWVyLnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICBtQ2Fycmllci5zZXRUZXh0Q29sb3IoMHhmZmZmZmZmZik7Ci0KLSAgICAgICAgbURhdGUgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmRhdGUpOwotICAgICAgICBtU3RhdHVzMSA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzMSk7Ci0gICAgICAgIG1TdGF0dXMyID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdGF0dXMyKTsKKyAgICAgICAgbVN0YXR1c1ZpZXcgPSBuZXcgU3RhdHVzVmlldyh0aGlzLCBtVXBkYXRlTW9uaXRvciwgbUxvY2tQYXR0ZXJuVXRpbHMpOwogCiAgICAgICAgIG1TY3JlZW5Mb2NrZWQgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnNjcmVlbkxvY2tlZCk7CiAgICAgICAgIG1TZWxlY3RvciA9IChTbGlkaW5nVGFiKSBmaW5kVmlld0J5SWQoUi5pZC50YWJfc2VsZWN0b3IpOwpAQCAtMjIwLDcgKzIxMCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogCi0KICAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOwogICAgICAgICBzZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKICAgICAgICAgc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShWaWV3R3JvdXAuRk9DVVNfQkxPQ0tfREVTQ0VOREFOVFMpOwpAQCAtNDI4LDM4ICs0MTcsMTEgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVmcmVzaFRpbWVBbmREYXRlRGlzcGxheSgpIHsKLSAgICAgICAgbURhdGUuc2V0VGV4dChEYXRlRm9ybWF0LmZvcm1hdChtRGF0ZUZvcm1hdFN0cmluZywgbmV3IERhdGUoKSkpOworICAgICAgICBtU3RhdHVzVmlldy5yZWZyZXNoVGltZUFuZERhdGVEaXNwbGF5KCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0YXR1c0xpbmVzKCkgewotICAgICAgICBpZiAoIW1TdGF0dXMuc2hvd1N0YXR1c0xpbmVzKCkKLSAgICAgICAgICAgICAgICB8fCAobUNoYXJnaW5nID09IG51bGwgJiYgbU5leHRBbGFybSA9PSBudWxsKSkgewotICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIGlmIChtQ2hhcmdpbmcgIT0gbnVsbCAmJiBtTmV4dEFsYXJtID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGNoYXJnaW5nIG9ubHkKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1DaGFyZ2luZyk7Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMobUNoYXJnaW5nSWNvbiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobU5leHRBbGFybSAhPSBudWxsICYmIG1DaGFyZ2luZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBuZXh0IGFsYXJtIG9ubHkKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1OZXh0QWxhcm0pOwotICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKG1BbGFybUljb24sIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICB9IGVsc2UgaWYgKG1DaGFyZ2luZyAhPSBudWxsICYmIG1OZXh0QWxhcm0gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gYm90aCBjaGFyZ2luZyBhbmQgbmV4dCBhbGFybQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1DaGFyZ2luZyk7Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMobUNoYXJnaW5nSWNvbiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRUZXh0KG1OZXh0QWxhcm0pOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKG1BbGFybUljb24sIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICB9CisgICAgICAgIG1TdGF0dXNWaWV3LnVwZGF0ZVN0YXR1c0xpbmVzKG1TdGF0dXMuc2hvd1N0YXR1c0xpbmVzKCksIG1DaGFyZ2luZywgbUNoYXJnaW5nSWNvbiwgbUFsYXJtSWNvbik7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KQEAgLTUwOSw3ICs0NzEsNyBAQAogICAgICAgICBzd2l0Y2ggKHN0YXR1cykgewogICAgICAgICAgICAgY2FzZSBOb3JtYWw6CiAgICAgICAgICAgICAgICAgLy8gdGV4dAotICAgICAgICAgICAgICAgIG1DYXJyaWVyLnNldFRleHQoCisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0Q2FycmllclRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDYXJyaWVyU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5nZXRUZWxlcGhvbnlQbG1uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVNwbigpKSk7CkBAIC01MTgsMTQgKzQ4MCwxNCBAQAogICAgICAgICAgICAgICAgIG1TY3JlZW5Mb2NrZWQuc2V0VGV4dCgiIik7CiAKICAgICAgICAgICAgICAgICAvLyBsYXlvdXQKLSAgICAgICAgICAgICAgICBtU2NyZWVuTG9ja2VkLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICBtU2NyZWVuTG9ja2VkLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwogICAgICAgICAgICAgICAgIG1TZWxlY3Rvci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CiAgICAgICAgICAgICAgICAgbUVtZXJnZW5jeUNhbGxUZXh0LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTmV0d29ya0xvY2tlZDoKICAgICAgICAgICAgICAgICAvLyBUaGUgY2FycmllciBzdHJpbmcgc2hvd3MgYm90aCBzaW0gY2FyZCBzdGF0dXMgKGkuZS4gTm8gU2ltIENhcmQpIGFuZAogICAgICAgICAgICAgICAgIC8vIGNhcnJpZXIncyBuYW1lIGFuZC9vciAiRW1lcmdlbmN5IENhbGxzIE9ubHkiIHN0YXR1cwotICAgICAgICAgICAgICAgIG1DYXJyaWVyLnNldFRleHQoCisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0Q2FycmllclRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDYXJyaWVyU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5nZXRUZWxlcGhvbnlQbG1uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fbmV0d29ya19sb2NrZWRfbWVzc2FnZSkpKTsKQEAgLTUzOCw3ICs1MDAsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBTaW1NaXNzaW5nOgogICAgICAgICAgICAgICAgIC8vIHRleHQKLSAgICAgICAgICAgICAgICBtQ2Fycmllci5zZXRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fbWlzc2luZ19zaW1fbWVzc2FnZV9zaG9ydCk7CisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0Q2FycmllclRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlX3Nob3J0KTsKICAgICAgICAgICAgICAgICBtU2NyZWVuTG9ja2VkLnNldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9taXNzaW5nX3NpbV9pbnN0cnVjdGlvbnMpOwogCiAgICAgICAgICAgICAgICAgLy8gbGF5b3V0CkBAIC01NDksNyArNTExLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgU2ltTWlzc2luZ0xvY2tlZDoKICAgICAgICAgICAgICAgICAvLyB0ZXh0Ci0gICAgICAgICAgICAgICAgbUNhcnJpZXIuc2V0VGV4dCgKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRDYXJyaWVyVGV4dCgKICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhcnJpZXJTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVBsbW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlX3Nob3J0KSkpOwpAQCAtNTYzLDcgKzUyNSw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFNpbUxvY2tlZDoKICAgICAgICAgICAgICAgICAvLyB0ZXh0Ci0gICAgICAgICAgICAgICAgbUNhcnJpZXIuc2V0VGV4dCgKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRDYXJyaWVyVGV4dCgKICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhcnJpZXJTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVBsbW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UpKSk7CkBAIC01NzUsNyArNTM3LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgU2ltUHVrTG9ja2VkOgogICAgICAgICAgICAgICAgIC8vIHRleHQKLSAgICAgICAgICAgICAgICBtQ2Fycmllci5zZXRUZXh0KAorICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldENhcnJpZXJUZXh0KAogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FycmllclN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IuZ2V0VGVsZXBob255UGxtbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0VGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX3NpbV9wdWtfbG9ja2VkX21lc3NhZ2UpKSk7CkBAIC02NTgsNyArNjIwLDYgQEAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgewogICAgICAgICByZXNldFN0YXR1c0luZm8obVVwZGF0ZU1vbml0b3IpOwotICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCkBAIC02NzYsNiArNjM3LDUgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvblBob25lU3RhdGVDaGFuZ2VkKFN0cmluZyBuZXdTdGF0ZSkgewotICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGFzc3dvcmRVbmxvY2tTY3JlZW4uamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGFzc3dvcmRVbmxvY2tTY3JlZW4uamF2YQppbmRleCAzOWYyOTE3Li45ZGI4NmFhIDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bhc3N3b3JkVW5sb2NrU2NyZWVuLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXNzd29yZFVubG9ja1NjcmVlbi5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLkRpZ2l0c0tleUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTUwLDE5ICs1MSwyNSBAQAogcHVibGljIGNsYXNzIFBhc3N3b3JkVW5sb2NrU2NyZWVuIGV4dGVuZHMgTGluZWFyTGF5b3V0IGltcGxlbWVudHMgS2V5Z3VhcmRTY3JlZW4sCiAgICAgICAgIFZpZXcuT25DbGlja0xpc3RlbmVyLCBLZXlndWFyZFVwZGF0ZU1vbml0b3IuSW5mb0NhbGxiYWNrLCBPbkVkaXRvckFjdGlvbkxpc3RlbmVyIHsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUGFzc3dvcmRVbmxvY2tTY3JlZW4iOwogICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRVcGRhdGVNb25pdG9yIG1VcGRhdGVNb25pdG9yOwogICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRTY3JlZW5DYWxsYmFjayBtQ2FsbGJhY2s7CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWxwaGE7CisKICAgICBwcml2YXRlIEVkaXRUZXh0IG1QYXNzd29yZEVudHJ5OwogICAgIHByaXZhdGUgQnV0dG9uIG1FbWVyZ2VuY3lDYWxsQnV0dG9uOwogICAgIHByaXZhdGUgTG9ja1BhdHRlcm5VdGlscyBtTG9ja1BhdHRlcm5VdGlsczsKICAgICBwcml2YXRlIFBhc3N3b3JkRW50cnlLZXlib2FyZFZpZXcgbUtleWJvYXJkVmlldzsKKyAgICBwcml2YXRlIFBhc3N3b3JkRW50cnlLZXlib2FyZFZpZXcgbUtleWJvYXJkVmlld0FscGhhOwogICAgIHByaXZhdGUgUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyIG1LZXlib2FyZEhlbHBlcjsKKyAgICBwcml2YXRlIFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlciBtS2V5Ym9hcmRIZWxwZXJBbHBoYTsKIAogICAgIHByaXZhdGUgaW50IG1DcmVhdGlvbk9yaWVudGF0aW9uOwogICAgIHByaXZhdGUgaW50IG1DcmVhdGlvbkhhcmRLZXlib2FyZEhpZGRlbjsKICAgICBwcml2YXRlIENvdW50RG93blRpbWVyIG1Db3VudGRvd25UaW1lcjsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZTsKKworICAgIHByaXZhdGUgU3RhdHVzVmlldyBtU3RhdHVzVmlldzsKIAogICAgIC8vIFRvIGF2b2lkIGFjY2lkZW50YWwgbG9ja291dCBkdWUgdG8gZXZlbnRzIHdoaWxlIHRoZSBkZXZpY2UgaW4gaW4gdGhlIHBvY2tldCwgaWdub3JlCiAgICAgLy8gYW55IHBhc3N3b3JkcyB3aXRoIGxlbmd0aCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhpcyBsZW5ndGguCkBAIC04NiwzNiArOTMsNjUgQEAKICAgICAgICAgICAgIGxheW91dEluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQua2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX2xhbmRzY2FwZSwgdGhpcywgdHJ1ZSk7CiAgICAgICAgIH0KIAorICAgICAgICBtU3RhdHVzVmlldyA9IG5ldyBTdGF0dXNWaWV3KHRoaXMsIG1VcGRhdGVNb25pdG9yLCBtTG9ja1BhdHRlcm5VdGlscyk7CisKICAgICAgICAgZmluYWwgaW50IHF1YWxpdHkgPSBsb2NrUGF0dGVyblV0aWxzLmdldEtleWd1YXJkU3RvcmVkUGFzc3dvcmRRdWFsaXR5KCk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNBbHBoYSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDID09IHF1YWxpdHkKLSAgICAgICAgICAgICAgICB8fCBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDID09IHF1YWxpdHk7CisgICAgICAgIG1Jc0FscGhhID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUMgPT0gcXVhbGl0eQorICAgICAgICAgICAgICAgIHx8IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMgPT0gcXVhbGl0eQorICAgICAgICAgICAgICAgIHx8IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYID09IHF1YWxpdHk7CiAKICAgICAgICAgbUtleWJvYXJkVmlldyA9IChQYXNzd29yZEVudHJ5S2V5Ym9hcmRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5rZXlib2FyZCk7CisgICAgICAgIG1LZXlib2FyZFZpZXdBbHBoYSA9IChQYXNzd29yZEVudHJ5S2V5Ym9hcmRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5rZXlib2FyZEFscGhhKTsKICAgICAgICAgbVBhc3N3b3JkRW50cnkgPSAoRWRpdFRleHQpIGZpbmRWaWV3QnlJZChSLmlkLnBhc3N3b3JkRW50cnkpOwogICAgICAgICBtUGFzc3dvcmRFbnRyeS5zZXRPbkVkaXRvckFjdGlvbkxpc3RlbmVyKHRoaXMpOwogICAgICAgICBtRW1lcmdlbmN5Q2FsbEJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLmVtZXJnZW5jeUNhbGwpOwogICAgICAgICBtRW1lcmdlbmN5Q2FsbEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIG1Mb2NrUGF0dGVyblV0aWxzLnVwZGF0ZUVtZXJnZW5jeUNhbGxCdXR0b25TdGF0ZShtRW1lcmdlbmN5Q2FsbEJ1dHRvbik7Ci0gICAgICAgIG1UaXRsZSA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZW50ZXJfcGFzc3dvcmRfbGFiZWwpOwogCi0gICAgICAgIG1LZXlib2FyZEhlbHBlciA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIoY29udGV4dCwgbUtleWJvYXJkVmlldywgdGhpcyk7Ci0gICAgICAgIG1LZXlib2FyZEhlbHBlci5zZXRLZXlib2FyZE1vZGUoaXNBbHBoYSA/IFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX0FMUEhBCi0gICAgICAgICAgICAgICAgOiBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuS0VZQk9BUkRfTU9ERV9OVU1FUklDKTsKKyAgICAgICAgbUtleWJvYXJkSGVscGVyID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlcihjb250ZXh0LCBtS2V5Ym9hcmRWaWV3LCB0aGlzLCBmYWxzZSk7CisgICAgICAgIGlmIChtS2V5Ym9hcmRWaWV3QWxwaGEgPT0gbnVsbCB8fCAhbUlzQWxwaGEpIHsKKyAgICAgICAgICAgIG1LZXlib2FyZEhlbHBlci5zZXRLZXlib2FyZE1vZGUobUlzQWxwaGEgPworICAgICAgICAgICAgICAgICAgICBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuS0VZQk9BUkRfTU9ERV9BTFBIQQorICAgICAgICAgICAgICAgICAgICA6IFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX05VTUVSSUMpOworICAgICAgICAgICAgbUtleWJvYXJkVmlldy5zZXRWaXNpYmlsaXR5KAorICAgICAgICAgICAgICAgICAgICBtQ3JlYXRpb25IYXJkS2V5Ym9hcmRIaWRkZW4gPT0gQ29uZmlndXJhdGlvbi5IQVJES0VZQk9BUkRISURERU5fTk8KKyAgICAgICAgICAgICAgICAgICAgPyBWaWV3LklOVklTSUJMRSA6IFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtS2V5Ym9hcmRIZWxwZXJBbHBoYSA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIoY29udGV4dCwgbUtleWJvYXJkVmlld0FscGhhLAorICAgICAgICAgICAgICAgICAgICB0aGlzLCBmYWxzZSk7CisgICAgICAgICAgICBtS2V5Ym9hcmRIZWxwZXIuc2V0S2V5Ym9hcmRNb2RlKFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX05VTUVSSUMpOworICAgICAgICAgICAgbUtleWJvYXJkSGVscGVyQWxwaGEuc2V0S2V5Ym9hcmRNb2RlKFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX0FMUEhBKTsKKyAgICAgICAgICAgIG1LZXlib2FyZFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUtleWJvYXJkVmlld0FscGhhLnNldFZpc2liaWxpdHkoCisgICAgICAgICAgICAgICAgICAgIG1DcmVhdGlvbkhhcmRLZXlib2FyZEhpZGRlbiA9PSBDb25maWd1cmF0aW9uLkhBUkRLRVlCT0FSREhJRERFTl9OTworICAgICAgICAgICAgICAgICAgICA/IFZpZXcuSU5WSVNJQkxFIDogVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldFdpZHRoKG1LZXlib2FyZFZpZXdBbHBoYS5nZXRMYXlvdXRQYXJhbXMoKS53aWR0aCk7CisgICAgICAgIH0KIAotICAgICAgICBtS2V5Ym9hcmRWaWV3LnNldFZpc2liaWxpdHkobUNyZWF0aW9uSGFyZEtleWJvYXJkSGlkZGVuID09IENvbmZpZ3VyYXRpb24uSEFSREtFWUJPQVJESElEREVOX05PCi0gICAgICAgICAgICAgICAgPyBWaWV3LklOVklTSUJMRSA6IFZpZXcuVklTSUJMRSk7CisgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9sb2NrLCAwLAorICAgICAgICAgICAgICAgIDAsIDApOwogICAgICAgICBtUGFzc3dvcmRFbnRyeS5yZXF1ZXN0Rm9jdXMoKTsKIAogICAgICAgICAvLyBUaGlzIGFsbG93cyBrZXlib2FyZHMgd2l0aCBvdmVybGFwcGluZyBxd2VydHkvbnVtZXJpYyBrZXlzIHRvIGNob29zZSBqdXN0IHRoZQogICAgICAgICAvLyBudW1lcmljIGtleXMuCi0gICAgICAgIGlmIChpc0FscGhhKSB7CisgICAgICAgIGlmIChtSXNBbHBoYSkgewogICAgICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0S2V5TGlzdGVuZXIoVGV4dEtleUxpc3RlbmVyLmdldEluc3RhbmNlKCkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0S2V5TGlzdGVuZXIoRGlnaXRzS2V5TGlzdGVuZXIuZ2V0SW5zdGFuY2UoKSk7CisgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvblRleHQoUi5zdHJpbmcua2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUpOwogICAgICAgICB9CiAKICAgICAgICAgbUtleWJvYXJkSGVscGVyLnNldFZpYnJhdGVQYXR0ZXJuKG1Mb2NrUGF0dGVyblV0aWxzLmlzVGFjdGlsZUZlZWRiYWNrRW5hYmxlZCgpID8KICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LmNvbmZpZ192aXJ0dWFsS2V5VmliZVBhdHRlcm4gOiAwKTsKKyAgICAgICAgaWYgKG1LZXlib2FyZEhlbHBlckFscGhhICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1LZXlib2FyZEhlbHBlckFscGhhLnNldFZpYnJhdGVQYXR0ZXJuKG1Mb2NrUGF0dGVyblV0aWxzLmlzVGFjdGlsZUZlZWRiYWNrRW5hYmxlZCgpID8KKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfdmlydHVhbEtleVZpYmVQYXR0ZXJuIDogMCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB1bnRpbCB3ZSBnZXQgYW4gdXBkYXRlLi4uCisgICAgICAgIG1TdGF0dXNWaWV3LnNldENhcnJpZXJUZXh0KExvY2tTY3JlZW4uZ2V0Q2FycmllclN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVBsbW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVNwbigpKSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMzYsOCArMTcyLDEyIEBACiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICAvLyByZXNldCBzdGF0dXMKKyAgICAgICAgbVN0YXR1c1ZpZXcucmVzZXRTdGF0dXNJbmZvKG1VcGRhdGVNb25pdG9yLCBtTG9ja1BhdHRlcm5VdGlscyk7CisKICAgICAgICAgLy8gc3RhcnQgZnJlc2gKICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0VGV4dCgiIik7CisgICAgICAgIHJlc2V0U3RhdHVzSW5mbygpOwogICAgICAgICBtUGFzc3dvcmRFbnRyeS5yZXF1ZXN0Rm9jdXMoKTsKICAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMudXBkYXRlRW1lcmdlbmN5Q2FsbEJ1dHRvblN0YXRlKG1FbWVyZ2VuY3lDYWxsQnV0dG9uKTsKIApAQCAtMTc0LDYgKzIxNCw5IEBACiAgICAgICAgICAgICAgICAgbG9uZyBkZWFkbGluZSA9IG1Mb2NrUGF0dGVyblV0aWxzLnNldExvY2tvdXRBdHRlbXB0RGVhZGxpbmUoKTsKICAgICAgICAgICAgICAgICBoYW5kbGVBdHRlbXB0TG9ja291dChkZWFkbGluZSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvblRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyk7CisgICAgICAgIH0gZWxzZSBpZiAoZW50cnkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvblRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyk7CiAgICAgICAgIH0KICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0VGV4dCgiIik7CiAgICAgfQpAQCAtMTkxLDE0ICsyMzQsMTQgQEAKICAgICAgICAgICAgICAgICBTdHJpbmcgaW5zdHJ1Y3Rpb25zID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biwKICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHNSZW1haW5pbmcpOwotICAgICAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KGluc3RydWN0aW9ucyk7CisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9ucyk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgb25GaW5pc2goKSB7CiAgICAgICAgICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBtVGl0bGUuc2V0VGV4dChSLnN0cmluZy5rZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlKTsKICAgICAgICAgICAgICAgICBtS2V5Ym9hcmRWaWV3LnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgcmVzZXRTdGF0dXNJbmZvKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0uc3RhcnQoKTsKICAgICB9CkBAIC0yNDQsMjQgKzI4Nyw0MSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgLy8gLS0tLS0tLS0tLSBJbmZvQ2FsbGJhY2sKKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIHZvaWQgb25SZWZyZXNoQmF0dGVyeUluZm8oYm9vbGVhbiBzaG93QmF0dGVyeUluZm8sIGJvb2xlYW4gcGx1Z2dlZEluLCBpbnQgYmF0dGVyeUxldmVsKSB7CisgICAgICAgIG1TdGF0dXNWaWV3Lm9uUmVmcmVzaEJhdHRlcnlJbmZvKHNob3dCYXR0ZXJ5SW5mbywgcGx1Z2dlZEluLCBiYXR0ZXJ5TGV2ZWwpOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIHZvaWQgb25UaW1lQ2hhbmdlZCgpIHsKKyAgICAgICAgbVN0YXR1c1ZpZXcub25UaW1lQ2hhbmdlZCgpOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIHZvaWQgb25SZWZyZXNoQ2FycmllckluZm8oQ2hhclNlcXVlbmNlIHBsbW4sIENoYXJTZXF1ZW5jZSBzcG4pIHsKKyAgICAgICAgbVN0YXR1c1ZpZXcub25SZWZyZXNoQ2FycmllckluZm8ocGxtbiwgc3BuKTsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIHB1YmxpYyB2b2lkIG9uUmluZ2VyTW9kZUNoYW5nZWQoaW50IHN0YXRlKSB7CisgICAgICAgIC8vIG5vdCBjdXJyZW50bHkgdXNlZAorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0gU2ltU3RhdGVDYWxsYmFjaworCisgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvblBob25lU3RhdGVDaGFuZ2VkKFN0cmluZyBuZXdTdGF0ZSkgewogICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG9uUmVmcmVzaEJhdHRlcnlJbmZvKGJvb2xlYW4gc2hvd0JhdHRlcnlJbmZvLCBib29sZWFuIHBsdWdnZWRJbiwgaW50IGJhdHRlcnlMZXZlbCkgewotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25SZWZyZXNoQ2FycmllckluZm8oQ2hhclNlcXVlbmNlIHBsbW4sIENoYXJTZXF1ZW5jZSBzcG4pIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uUmluZ2VyTW9kZUNoYW5nZWQoaW50IHN0YXRlKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblRpbWVDaGFuZ2VkKCkgewotCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0U3RhdHVzSW5mbygpIHsKKyAgICAgICAgaWYobUlzQWxwaGEpIHsKKyAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldEluc3RydWN0aW9uVGV4dChSLnN0cmluZy5rZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldEluc3RydWN0aW9uVGV4dChSLnN0cmluZy5rZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSk7CisgICAgICAgIH0KICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGF0dGVyblVubG9ja1NjcmVlbi5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEKaW5kZXggNDE4ZTI0My4uMzVmYTNlNSAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEKQEAgLTI1LDkgKzI1LDYgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NDYXJkOwpAQCAtMzcsNyArMzQsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblZpZXcuQ2VsbDsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwogCiAvKioKICAqIFRoaXMgaXMgdGhlIHNjcmVlbiB0aGF0IHNob3dzIHRoZSA5IGNpcmNsZSB1bmxvY2sgd2lkZ2V0IGFuZCBpbnN0cnVjdHMKQEAgLTc1LDI3ICs3MSw3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVGYWxsYmFjazsKIAotICAgIHByaXZhdGUgU3RyaW5nIG1EYXRlRm9ybWF0U3RyaW5nOwotCi0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQ2FycmllcjsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1EYXRlOwotCi0gICAgLy8gYXJlIHdlIHNob3dpbmcgYmF0dGVyeSBpbmZvcm1hdGlvbj8KLSAgICBwcml2YXRlIGJvb2xlYW4gbVNob3dpbmdCYXR0ZXJ5SW5mbyA9IGZhbHNlOwotCi0gICAgLy8gbGFzdCBrbm93biBwbHVnZ2VkIGluIHN0YXRlCi0gICAgcHJpdmF0ZSBib29sZWFuIG1QbHVnZ2VkSW4gPSBmYWxzZTsKLQotICAgIC8vIGxhc3Qga25vd24gYmF0dGVyeSBsZXZlbAotICAgIHByaXZhdGUgaW50IG1CYXR0ZXJ5TGV2ZWwgPSAxMDA7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtTmV4dEFsYXJtID0gbnVsbDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1JbnN0cnVjdGlvbnMgPSBudWxsOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1czE7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtU3RhdHVzU2VwOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1czI7Ci0KKyAgICBwcml2YXRlIFN0YXR1c1ZpZXcgbVN0YXR1c1ZpZXc7CiAKICAgICBwcml2YXRlIExvY2tQYXR0ZXJuVmlldyBtTG9ja1BhdHRlcm5WaWV3OwogCkBAIC0xMzMsMTUgKzEwOSwxOCBAQAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVGb290ZXIoRm9vdGVyTW9kZSBtb2RlKSB7CiAgICAgICAgIHN3aXRjaCAobW9kZSkgewogICAgICAgICAgICAgY2FzZSBOb3JtYWw6CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibW9kZSBub3JtYWwiKTsKICAgICAgICAgICAgICAgICBtRm9vdGVyTm9ybWFsLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKICAgICAgICAgICAgICAgICBtRm9vdGVyRm9yZ290UGF0dGVybi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEZvcmdvdExvY2tQYXR0ZXJuOgorICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm1vZGUgRm9yZ290TG9ja1BhdHRlcm4iKTsKICAgICAgICAgICAgICAgICBtRm9vdGVyTm9ybWFsLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKICAgICAgICAgICAgICAgICBtRm9vdGVyRm9yZ290UGF0dGVybi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CiAgICAgICAgICAgICAgICAgbUZvcmdvdFBhdHRlcm5CdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBWZXJpZnlVbmxvY2tlZDoKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtb2RlIFZlcmlmeVVubG9ja2VkIik7CiAgICAgICAgICAgICAgICAgbUZvb3Rlck5vcm1hbC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CiAgICAgICAgICAgICAgICAgbUZvb3RlckZvcmdvdFBhdHRlcm4uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwogICAgICAgICB9CkBAIC0xODAsMjQgKzE1OSwxNiBAQAogICAgICAgICBtQ3JlYXRpb25PcmllbnRhdGlvbiA9IGNvbmZpZ3VyYXRpb24ub3JpZW50YXRpb247CiAKICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpOworCiAgICAgICAgIGlmIChtQ3JlYXRpb25PcmllbnRhdGlvbiAhPSBDb25maWd1cmF0aW9uLk9SSUVOVEFUSU9OX0xBTkRTQ0FQRSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAicG9ydHJhaXQgbW9kZSIpOwogICAgICAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LCB0aGlzLCB0cnVlKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgImxhbmRzY2FwZSBtb2RlIik7CiAgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmtleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLCB0aGlzLCB0cnVlKTsKICAgICAgICAgfQogCi0gICAgICAgIG1DYXJyaWVyID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5jYXJyaWVyKTsKLSAgICAgICAgbURhdGUgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmRhdGUpOwotCi0gICAgICAgIG1EYXRlRm9ybWF0U3RyaW5nID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5mdWxsX3dkYXlfbW9udGhfZGF5X25vX3llYXIpOwotICAgICAgICByZWZyZXNoVGltZUFuZERhdGVEaXNwbGF5KCk7Ci0KLSAgICAgICAgbVN0YXR1czEgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YXR1czEpOwotICAgICAgICBtU3RhdHVzU2VwID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdGF0dXNTZXApOwotICAgICAgICBtU3RhdHVzMiA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzMik7Ci0KLSAgICAgICAgcmVzZXRTdGF0dXNJbmZvKCk7Ci0KKyAgICAgICAgbVN0YXR1c1ZpZXcgPSBuZXcgU3RhdHVzVmlldyh0aGlzLCBtVXBkYXRlTW9uaXRvciwgbUxvY2tQYXR0ZXJuVXRpbHMpOwogCiAgICAgICAgIG1Mb2NrUGF0dGVyblZpZXcgPSAoTG9ja1BhdHRlcm5WaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5sb2NrUGF0dGVybik7CiAKQEAgLTI0OSwxNSArMjIwLDExIEBACiAgICAgICAgIHVwZGF0ZU1vbml0b3IucmVnaXN0ZXJTaW1TdGF0ZUNhbGxiYWNrKHRoaXMpOwogICAgICAgICBzZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKIAotICAgICAgICAvLyBSZXF1aXJlZCB0byBnZXQgTWFycXVlZSB0byB3b3JrLgotICAgICAgICBtQ2Fycmllci5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgbUNhcnJpZXIuc2V0VGV4dENvbG9yKDB4ZmZmZmZmZmYpOwotCiAgICAgICAgIC8vIHVudGlsIHdlIGdldCBhbiB1cGRhdGUuLi4KLSAgICAgICAgbUNhcnJpZXIuc2V0VGV4dCgKLSAgICAgICAgICAgICAgICBMb2NrU2NyZWVuLmdldENhcnJpZXJTdHJpbmcoCisgICAgICAgIG1TdGF0dXNWaWV3LnNldENhcnJpZXJUZXh0KExvY2tTY3JlZW4uZ2V0Q2FycmllclN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVBsbW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVNwbigpKSk7CisKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVmcmVzaEVtZXJnZW5jeUJ1dHRvblRleHQoKSB7CkBAIC0yNzAsODggKzIzNyw2IEBACiAgICAgICAgIG1FbmFibGVGYWxsYmFjayA9IHN0YXRlOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCByZXNldFN0YXR1c0luZm8oKSB7Ci0gICAgICAgIG1JbnN0cnVjdGlvbnMgPSBudWxsOwotICAgICAgICBtU2hvd2luZ0JhdHRlcnlJbmZvID0gbVVwZGF0ZU1vbml0b3Iuc2hvdWxkU2hvd0JhdHRlcnlJbmZvKCk7Ci0gICAgICAgIG1QbHVnZ2VkSW4gPSBtVXBkYXRlTW9uaXRvci5pc0RldmljZVBsdWdnZWRJbigpOwotICAgICAgICBtQmF0dGVyeUxldmVsID0gbVVwZGF0ZU1vbml0b3IuZ2V0QmF0dGVyeUxldmVsKCk7Ci0gICAgICAgIG1OZXh0QWxhcm0gPSBtTG9ja1BhdHRlcm5VdGlscy5nZXROZXh0QWxhcm0oKTsKLSAgICAgICAgdXBkYXRlU3RhdHVzTGluZXMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3RhdHVzTGluZXMoKSB7Ci0gICAgICAgIGlmIChtSW5zdHJ1Y3Rpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGluc3RydWN0aW9ucyBvbmx5Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1JbnN0cnVjdGlvbnMpOwotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KG1JbnN0cnVjdGlvbnMpKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKDAsIDAsIDAsIDApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9sb2NrLCAwLCAwLCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVN0YXR1c1NlcC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVNob3dpbmdCYXR0ZXJ5SW5mbyAmJiBtTmV4dEFsYXJtID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGJhdHRlcnkgb25seQotICAgICAgICAgICAgaWYgKG1QbHVnZ2VkSW4pIHsKLSAgICAgICAgICAgICAgaWYgKG1CYXR0ZXJ5TGV2ZWwgPj0gMTAwKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmxvY2tzY3JlZW5fY2hhcmdlZCkpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmxvY2tzY3JlZW5fcGx1Z2dlZF9pbiwgbUJhdHRlcnlMZXZlbCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQoZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5sb2Nrc2NyZWVuX2xvd19iYXR0ZXJ5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfY2hhcmdpbmcsIDAsIDAsIDApOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3RhdHVzU2VwLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICB9IGVsc2UgaWYgKG1OZXh0QWxhcm0gIT0gbnVsbCAmJiAhbVNob3dpbmdCYXR0ZXJ5SW5mbykgewotICAgICAgICAgICAgLy8gYWxhcm0gb25seQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChtTmV4dEFsYXJtKTsKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9hbGFybSwgMCwgMCwgMCk7Ci0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXNTZXAuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9IGVsc2UgaWYgKG1OZXh0QWxhcm0gIT0gbnVsbCAmJiBtU2hvd2luZ0JhdHRlcnlJbmZvKSB7Ci0gICAgICAgICAgICAvLyBib3RoIGJhdHRlcnkgYW5kIG5leHQgYWxhcm0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQobU5leHRBbGFybSk7Ci0gICAgICAgICAgICBtU3RhdHVzU2VwLnNldFRleHQoInwiKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFRleHQoZ2V0Q29udGV4dCgpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0LAotICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbigxMDAsIG1CYXR0ZXJ5TGV2ZWwpKSk7Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfYWxhcm0sIDAsIDAsIDApOwotICAgICAgICAgICAgaWYgKG1QbHVnZ2VkSW4pIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzMi5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfY2hhcmdpbmcsIDAsIDAsIDApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzMi5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXNTZXAuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbm90aGluZyBzcGVjaWZpYyB0byBzaG93OyBzaG93IGdlbmVyYWwgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fcGF0dGVybl9pbnN0cnVjdGlvbnMpOwotICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2xvY2ssIDAsIDAsIDApOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3RhdHVzU2VwLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hUaW1lQW5kRGF0ZURpc3BsYXkoKSB7Ci0gICAgICAgIG1EYXRlLnNldFRleHQoRGF0ZUZvcm1hdC5mb3JtYXQobURhdGVGb3JtYXRTdHJpbmcsIG5ldyBEYXRlKCkpKTsKLSAgICB9Ci0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikgewogICAgICAgICAvLyBhcyBsb25nIGFzIHRoZSB1c2VyIGlzIGVudGVyaW5nIGEgcGF0dGVybiAoaS5lIHNlbmRpbmcgYSB0b3VjaApAQCAtMzY2LDI1ICsyNTEsMjEgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKLQogICAgIC8vIC0tLS0tLS0tLS0gSW5mb0NhbGxiYWNrCiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uUmVmcmVzaEJhdHRlcnlJbmZvKGJvb2xlYW4gc2hvd0JhdHRlcnlJbmZvLCBib29sZWFuIHBsdWdnZWRJbiwgaW50IGJhdHRlcnlMZXZlbCkgewotICAgICAgICBtU2hvd2luZ0JhdHRlcnlJbmZvID0gc2hvd0JhdHRlcnlJbmZvOwotICAgICAgICBtUGx1Z2dlZEluID0gcGx1Z2dlZEluOwotICAgICAgICBtQmF0dGVyeUxldmVsID0gYmF0dGVyeUxldmVsOwotICAgICAgICB1cGRhdGVTdGF0dXNMaW5lcygpOworICAgICAgICBtU3RhdHVzVmlldy5vblJlZnJlc2hCYXR0ZXJ5SW5mbyhzaG93QmF0dGVyeUluZm8sIHBsdWdnZWRJbiwgYmF0dGVyeUxldmVsKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uVGltZUNoYW5nZWQoKSB7Ci0gICAgICAgIHJlZnJlc2hUaW1lQW5kRGF0ZURpc3BsYXkoKTsKKyAgICAgICAgbVN0YXR1c1ZpZXcub25UaW1lQ2hhbmdlZCgpOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgcHVibGljIHZvaWQgb25SZWZyZXNoQ2FycmllckluZm8oQ2hhclNlcXVlbmNlIHBsbW4sIENoYXJTZXF1ZW5jZSBzcG4pIHsKLSAgICAgICAgbUNhcnJpZXIuc2V0VGV4dChMb2NrU2NyZWVuLmdldENhcnJpZXJTdHJpbmcocGxtbiwgc3BuKSk7CisgICAgICAgIG1TdGF0dXNWaWV3Lm9uUmVmcmVzaENhcnJpZXJJbmZvKHBsbW4sIHNwbik7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KQEAgLTQ0NCw4ICszMjUsOCBAQAogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgLy8gcmVzZXQgaGVhZGVyCi0gICAgICAgIHJlc2V0U3RhdHVzSW5mbygpOworICAgICAgICAvLyByZXNldCBzdGF0dXMKKyAgICAgICAgbVN0YXR1c1ZpZXcucmVzZXRTdGF0dXNJbmZvKG1VcGRhdGVNb25pdG9yLCBtTG9ja1BhdHRlcm5VdGlscyk7CiAKICAgICAgICAgLy8gcmVzZXQgbG9jayBwYXR0ZXJuCiAgICAgICAgIG1Mb2NrUGF0dGVyblZpZXcuZW5hYmxlSW5wdXQoKTsKQEAgLTUxNCw4ICszOTUsOCBAQAogICAgICAgICAgICAgaWYgKG1Mb2NrUGF0dGVyblV0aWxzLmNoZWNrUGF0dGVybihwYXR0ZXJuKSkgewogICAgICAgICAgICAgICAgIG1Mb2NrUGF0dGVyblZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREaXNwbGF5TW9kZShMb2NrUGF0dGVyblZpZXcuRGlzcGxheU1vZGUuQ29ycmVjdCk7Ci0gICAgICAgICAgICAgICAgbUluc3RydWN0aW9ucyA9ICIiOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1c0xpbmVzKCk7CisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25zKCIiKTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy51cGRhdGVTdGF0dXNMaW5lcygpOwogICAgICAgICAgICAgICAgIG1DYWxsYmFjay5rZXlndWFyZERvbmUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLnJlcG9ydFN1Y2Nlc3NmdWxVbmxvY2tBdHRlbXB0KCk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNTMzLDggKzQxNCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUF0dGVtcHRMb2Nrb3V0KGRlYWRsaW5lKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIG1VbmxvY2tJY29uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgbUluc3RydWN0aW9ucyA9IGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzTGluZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25zKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nKSk7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnVwZGF0ZVN0YXR1c0xpbmVzKCk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrUGF0dGVyblZpZXcucG9zdERlbGF5ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbmNlbFBhdHRlcm5SdW5uYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVRURVJOX0NMRUFSX1RJTUVPVVRfTVMpOwpAQCAtNTUyLDE3ICs0MzQsMTggQEAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgb25UaWNrKGxvbmcgbWlsbGlzVW50aWxGaW5pc2hlZCkgewogICAgICAgICAgICAgICAgIGludCBzZWNvbmRzUmVtYWluaW5nID0gKGludCkgKG1pbGxpc1VudGlsRmluaXNoZWQgLyAxMDAwKTsKLSAgICAgICAgICAgICAgICBtSW5zdHJ1Y3Rpb25zID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvbnMoZ2V0Q29udGV4dCgpLmdldFN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHNSZW1haW5pbmcpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1c0xpbmVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzUmVtYWluaW5nKSk7CisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcudXBkYXRlU3RhdHVzTGluZXMoKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaCgpIHsKICAgICAgICAgICAgICAgICBtTG9ja1BhdHRlcm5WaWV3LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbUluc3RydWN0aW9ucyA9IGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXR0ZXJuX2luc3RydWN0aW9ucyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzTGluZXMoKTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvbnMoZ2V0Q29udGV4dCgpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmxvY2tzY3JlZW5fcGF0dGVybl9pbnN0cnVjdGlvbnMpKTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy51cGRhdGVTdGF0dXNMaW5lcygpOwogICAgICAgICAgICAgICAgIC8vIFRPRE8gbVVubG9ja0ljb24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogICAgICAgICAgICAgICAgIG1GYWlsZWRQYXR0ZXJuQXR0ZW1wdHNTaW5jZUxhc3RUaW1lb3V0ID0gMDsKICAgICAgICAgICAgICAgICBpZiAobUVuYWJsZUZhbGxiYWNrKSB7CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEKaW5kZXggYjkyMzJjOC4uY2E5YTQ4NCAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvdy5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3cuamF2YQpAQCAtMjQsMTEgKzI0LDE1IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LkJhc2VTdXJmYWNlSG9sZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuUm9vdFZpZXdTdXJmYWNlVGFrZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5TdGFuZGFsb25lQWN0aW9uTW9kZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQ29udGV4dE1lbnVCdWlsZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudURpYWxvZ0hlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudVBvcHVwSGVscGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51VmlldzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhckNvbnRleHRWaWV3OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJWaWV3OwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLlNlYXJjaE1hbmFnZXI7CkBAIC01Myw2ICs1Nyw3IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5IYXB0aWNGZWVkYmFja0NvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRRdWV1ZTsKQEAgLTY2LDYgKzcxLDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1N0dWI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZvbHVtZVBhbmVsOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CkBAIC05NSw3ICsxMDEsNyBAQAogICAgICAqIFNpbXBsZSBjYWxsYmFjayB1c2VkIGJ5IHRoZSBjb250ZXh0IG1lbnUgYW5kIGl0cyBzdWJtZW51cy4gVGhlIG9wdGlvbnMKICAgICAgKiBtZW51IHN1Ym1lbnVzIGRvIG5vdCB1c2UgdGhpcyAodGhlaXIgYmVoYXZpb3IgaXMgbW9yZSBjb21wbGV4KS4KICAgICAgKi8KLSAgICBDb250ZXh0TWVudUNhbGxiYWNrIG1Db250ZXh0TWVudUNhbGxiYWNrID0gbmV3IENvbnRleHRNZW51Q2FsbGJhY2soRkVBVFVSRV9DT05URVhUX01FTlUpOworICAgIERpYWxvZ01lbnVDYWxsYmFjayBtQ29udGV4dE1lbnVDYWxsYmFjayA9IG5ldyBEaWFsb2dNZW51Q2FsbGJhY2soRkVBVFVSRV9DT05URVhUX01FTlUpOwogCiAgICAgLy8gVGhpcyBpcyB0aGUgdG9wLWxldmVsIHZpZXcgb2YgdGhlIHdpbmRvdywgY29udGFpbmluZyB0aGUgd2luZG93IGRlY29yLgogICAgIHByaXZhdGUgRGVjb3JWaWV3IG1EZWNvcjsKQEAgLTExNCw2ICsxMjAsOCBAQAogICAgIHByaXZhdGUgTGF5b3V0SW5mbGF0ZXIgbUxheW91dEluZmxhdGVyOwogCiAgICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGVWaWV3OworICAgIAorICAgIHByaXZhdGUgQWN0aW9uQmFyVmlldyBtQWN0aW9uQmFyOwogCiAgICAgcHJpdmF0ZSBEcmF3YWJsZUZlYXR1cmVTdGF0ZVtdIG1EcmF3YWJsZXM7CiAKQEAgLTE5MSw4ICsxOTksMTIgQEAKICAgICAgICAgICAgIC8qIEN1c3RvbSB0aXRsZSBmZWF0dXJlIGlzIGVuYWJsZWQgYW5kIHRoZSB1c2VyIGlzIHRyeWluZyB0byBlbmFibGUgYW5vdGhlciBmZWF0dXJlICovCiAgICAgICAgICAgICB0aHJvdyBuZXcgQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24oIllvdSBjYW5ub3QgY29tYmluZSBjdXN0b20gdGl0bGVzIHdpdGggb3RoZXIgdGl0bGUgZmVhdHVyZXMiKTsKICAgICAgICAgfQotICAgICAgICBpZiAoZmVhdHVyZUlkID09IEZFQVRVUkVfT1BFTkdMKSB7Ci0gICAgICAgICAgICBnZXRBdHRyaWJ1dGVzKCkubWVtb3J5VHlwZSA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLk1FTU9SWV9UWVBFX0dQVTsKKyAgICAgICAgaWYgKChmZWF0dXJlcyAmICgxIDw8IEZFQVRVUkVfTk9fVElUTEUpKSAhPSAwICYmIGZlYXR1cmVJZCA9PSBGRUFUVVJFX0FDVElPTl9CQVIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gSWdub3JlLiBObyB0aXRsZSBkb21pbmF0ZXMuCisgICAgICAgIH0KKyAgICAgICAgaWYgKChmZWF0dXJlcyAmICgxIDw8IEZFQVRVUkVfQUNUSU9OX0JBUikpICE9IDAgJiYgZmVhdHVyZUlkID09IEZFQVRVUkVfTk9fVElUTEUpIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYWN0aW9uIGJhciBmZWF0dXJlIGlmIHdlIGhhdmUgbm8gdGl0bGUuIE5vIHRpdGxlIGRvbWluYXRlcy4KKyAgICAgICAgICAgIHJlbW92ZUZlYXR1cmUoRkVBVFVSRV9BQ1RJT05fQkFSKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3VwZXIucmVxdWVzdEZlYXR1cmUoZmVhdHVyZUlkKTsKICAgICB9CkBAIC0yNzYsNiArMjg4LDggQEAKICAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKICAgICAgICAgaWYgKG1UaXRsZVZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlKTsKKyAgICAgICAgfSBlbHNlIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BY3Rpb25CYXIuc2V0V2luZG93VGl0bGUodGl0bGUpOwogICAgICAgICB9CiAgICAgICAgIG1UaXRsZSA9IHRpdGxlOwogICAgIH0KQEAgLTMwMSw3ICszMTUsNyBAQAogICAgICAgICAvLyBBbHJlYWR5IHByZXBhcmVkIChpc1ByZXBhcmVkIHdpbGwgYmUgcmVzZXQgdG8gZmFsc2UgbGF0ZXIpCiAgICAgICAgIGlmIChzdC5pc1ByZXBhcmVkKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KKyAgICAgICAgCiAgICAgICAgIGlmICgobVByZXBhcmVkUGFuZWwgIT0gbnVsbCkgJiYgKG1QcmVwYXJlZFBhbmVsICE9IHN0KSkgewogICAgICAgICAgICAgLy8gQW5vdGhlciBQYW5lbCBpcyBwcmVwYXJlZCBhbmQgcG9zc2libHkgb3Blbiwgc28gY2xvc2UgaXQKICAgICAgICAgICAgIGNsb3NlUGFuZWwobVByZXBhcmVkUGFuZWwsIGZhbHNlKTsKQEAgLTMxNSw5ICszMjksMTEgQEAKIAogICAgICAgICBpZiAoc3QuY3JlYXRlZFBhbmVsVmlldyA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBJbml0IHRoZSBwYW5lbCBzdGF0ZSdzIG1lbnUtLXJldHVybiBmYWxzZSBpZiBpbml0IGZhaWxlZAotICAgICAgICAgICAgaWYgKHN0Lm1lbnUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZVBhbmVsTWVudShzdCkgfHwgKHN0Lm1lbnUgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKHN0Lm1lbnUgPT0gbnVsbCB8fCBzdC5yZWZyZXNoTWVudUNvbnRlbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3QubWVudSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZVBhbmVsTWVudShzdCkgfHwgKHN0Lm1lbnUgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBDYWxsIGNhbGxiYWNrLCBhbmQgcmV0dXJuIGlmIGl0IGRvZXNuJ3Qgd2FudCB0byBkaXNwbGF5IG1lbnUKICAgICAgICAgICAgICAgICBpZiAoKGNiID09IG51bGwpIHx8ICFjYi5vbkNyZWF0ZVBhbmVsTWVudShzdC5mZWF0dXJlSWQsIHN0Lm1lbnUpKSB7CkBAIC0zMjYsNiArMzQyLDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdC5yZWZyZXNoTWVudUNvbnRlbnQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5zZXRNZW51KHN0Lm1lbnUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gQ2FsbGJhY2sgYW5kIHJldHVybiBpZiB0aGUgY2FsbGJhY2sgZG9lcyBub3Qgd2FudCB0byBzaG93IHRoZSBtZW51CkBAIC0zNDksMzYgKzM3MSwzNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotICAgICAgICBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoRkVBVFVSRV9PUFRJT05TX1BBTkVMLCBmYWxzZSk7Ci0gICAgICAgIGlmICgoc3QgIT0gbnVsbCkgJiYgKHN0Lm1lbnUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lbnVCdWlsZGVyIG1lbnVCdWlsZGVyID0gKE1lbnVCdWlsZGVyKSBzdC5tZW51OworICAgICAgICAvLyBBY3Rpb24gYmFycyBoYW5kbGUgdGhlaXIgb3duIG1lbnUgc3RhdGUKKyAgICAgICAgaWYgKG1BY3Rpb25CYXIgPT0gbnVsbCkgeworICAgICAgICAgICAgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKEZFQVRVUkVfT1BUSU9OU19QQU5FTCwgZmFsc2UpOworICAgICAgICAgICAgaWYgKChzdCAhPSBudWxsKSAmJiAoc3QubWVudSAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIE1lbnVCdWlsZGVyIG1lbnVCdWlsZGVyID0gKE1lbnVCdWlsZGVyKSBzdC5tZW51OwogCi0gICAgICAgICAgICBpZiAoc3QuaXNPcGVuKSB7Ci0gICAgICAgICAgICAgICAgLy8gRnJlZXplIHN0YXRlCi0gICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIHN0YXRlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgICAgIG1lbnVCdWlsZGVyLnNhdmVIaWVyYXJjaHlTdGF0ZShzdGF0ZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0LmlzT3BlbikgeworICAgICAgICAgICAgICAgICAgICAvLyBGcmVlemUgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIHN0YXRlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICBtZW51QnVpbGRlci5zYXZlSGllcmFyY2h5U3RhdGUoc3RhdGUpOwogCi0gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBtZW51IHZpZXdzIHNpbmNlIHRoZXkgbmVlZCB0byBiZSByZWNyZWF0ZWQKLSAgICAgICAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIG5ldyBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgY2xlYXJNZW51Vmlld3Moc3QpOworICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG1lbnUgdmlld3Mgc2luY2UgdGhleSBuZWVkIHRvIGJlIHJlY3JlYXRlZAorICAgICAgICAgICAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIG5ldyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgICAgIGNsZWFyTWVudVZpZXdzKHN0KTsKIAotICAgICAgICAgICAgICAgIC8vIFJlLW9wZW4gdGhlIHNhbWUgbWVudQotICAgICAgICAgICAgICAgIHJlb3Blbk1lbnUoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAvLyBSZS1vcGVuIHRoZSBzYW1lIG1lbnUKKyAgICAgICAgICAgICAgICAgICAgcmVvcGVuTWVudShmYWxzZSk7CiAKLSAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHN0YXRlCi0gICAgICAgICAgICAgICAgbWVudUJ1aWxkZXIucmVzdG9yZUhpZXJhcmNoeVN0YXRlKHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICBtZW51QnVpbGRlci5yZXN0b3JlSGllcmFyY2h5U3RhdGUoc3RhdGUpOwogCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIENsZWFyIG1lbnUgdmlld3Mgc28gb24gbmV4dCBtZW51IG9wZW5pbmcsIGl0IHdpbGwgdXNlCi0gICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlciBsYXlvdXQKLSAgICAgICAgICAgICAgICBjbGVhck1lbnVWaWV3cyhzdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgbWVudSB2aWV3cyBzbyBvbiBuZXh0IG1lbnUgb3BlbmluZywgaXQgd2lsbCB1c2UKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlciBsYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgY2xlYXJNZW51Vmlld3Moc3QpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotCiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbGVhck1lbnVWaWV3cyhQYW5lbEZlYXR1cmVTdGF0ZSBzdCkgewotCiAgICAgICAgIC8vIFRoaXMgY2FuIGJlIGNhbGxlZCBvbiBjb25maWcgY2hhbmdlcywgc28gd2Ugc2hvdWxkIG1ha2Ugc3VyZQogICAgICAgICAvLyB0aGUgdmlld3Mgd2lsbCBiZSByZWNvbnN0cnVjdGVkIGJhc2VkIG9uIHRoZSBuZXcgb3JpZW50YXRpb24sIGV0Yy4KIApAQCAtMzkzLDcgKzQxNiwxMiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIHZvaWQgb3BlblBhbmVsKGludCBmZWF0dXJlSWQsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIG9wZW5QYW5lbChnZXRQYW5lbFN0YXRlKGZlYXR1cmVJZCwgdHJ1ZSksIGV2ZW50KTsKKyAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBGRUFUVVJFX09QVElPTlNfUEFORUwgJiYgbUFjdGlvbkJhciAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5pc092ZXJmbG93UmVzZXJ2ZWQoKSkgeworICAgICAgICAgICAgbUFjdGlvbkJhci5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcGVuUGFuZWwoZ2V0UGFuZWxTdGF0ZShmZWF0dXJlSWQsIHRydWUpLCBldmVudCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgb3BlblBhbmVsKFBhbmVsRmVhdHVyZVN0YXRlIHN0LCBLZXlFdmVudCBldmVudCkgewpAQCAtNDg0LDcgKzUxMiwxMCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIHZvaWQgY2xvc2VQYW5lbChpbnQgZmVhdHVyZUlkKSB7Ci0gICAgICAgIGlmIChmZWF0dXJlSWQgPT0gRkVBVFVSRV9DT05URVhUX01FTlUpIHsKKyAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBGRUFUVVJFX09QVElPTlNfUEFORUwgJiYgbUFjdGlvbkJhciAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5pc092ZXJmbG93UmVzZXJ2ZWQoKSkgeworICAgICAgICAgICAgbUFjdGlvbkJhci5oaWRlT3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0gZWxzZSBpZiAoZmVhdHVyZUlkID09IEZFQVRVUkVfQ09OVEVYVF9NRU5VKSB7CiAgICAgICAgICAgICBjbG9zZUNvbnRleHRNZW51KCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjbG9zZVBhbmVsKGdldFBhbmVsU3RhdGUoZmVhdHVyZUlkLCB0cnVlKSwgdHJ1ZSk7CkBAIC01NDUsNiArNTc2LDI2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlUGFuZWxNZW51KGludCBmZWF0dXJlSWQpIHsKKyAgICAgICAgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKGZlYXR1cmVJZCwgdHJ1ZSk7CisgICAgICAgIGlmIChzdC5tZW51ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0Lm1lbnUuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBzdC5yZWZyZXNoTWVudUNvbnRlbnQgPSB0cnVlOworICAgICAgICBzdC5yZWZyZXNoRGVjb3JWaWV3ID0gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIC8vIFByZXBhcmUgdGhlIG9wdGlvbnMgcGFuZWwgaWYgd2UgaGF2ZSBhbiBhY3Rpb24gYmFyCisgICAgICAgIGlmICgoZmVhdHVyZUlkID09IEZFQVRVUkVfQUNUSU9OX0JBUiB8fCBmZWF0dXJlSWQgPT0gRkVBVFVSRV9PUFRJT05TX1BBTkVMKQorICAgICAgICAgICAgICAgICYmIG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc3QgPSBnZXRQYW5lbFN0YXRlKFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUwsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3QuaXNQcmVwYXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHByZXBhcmVQYW5lbChzdCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHBhbmVsIGtleSBpcyBwdXNoZWQgZG93bi4KICAgICAgKiBAcGFyYW0gZmVhdHVyZUlkIFRoZSBmZWF0dXJlIElEIG9mIHRoZSByZWxldmFudCBwYW5lbCAoZGVmYXVsdHMgdG8gRkVBVFVSRV9PUFRJT05TX1BBTkVMfS4KQEAgLTU1OCw3ICs2MDksNyBAQAogICAgICAgICAgICAgLy8gVGhlIHBhbmVsIGtleSB3YXMgcHVzaGVkLCBzbyBzZXQgdGhlIGNob3JkaW5nIGtleQogICAgICAgICAgICAgbVBhbmVsQ2hvcmRpbmdLZXkgPSBrZXlDb2RlOwogICAgICAgICAgICAgbVBhbmVsTWF5TG9uZ1ByZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKGZlYXR1cmVJZCwgdHJ1ZSk7CiAgICAgICAgICAgICBpZiAoIXN0LmlzT3BlbikgewogICAgICAgICAgICAgICAgIGlmIChnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLmtleWJvYXJkCkBAIC01NjcsNyArNjE4LDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXBhcmVQYW5lbChzdCwgZXZlbnQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCiAgICAgICAgIH0gZWxzZSBpZiAobVBhbmVsTWF5TG9uZ1ByZXNzICYmIG1QYW5lbENob3JkaW5nS2V5ID09IGtleUNvZGUKICAgICAgICAgICAgICAgICAmJiAoZXZlbnQuZ2V0RmxhZ3MoKSZLZXlFdmVudC5GTEFHX0xPTkdfUFJFU1MpICE9IDApIHsKICAgICAgICAgICAgIC8vIFdlIGhhdmUgaGFkIGEgbG9uZyBwcmVzcyB3aGlsZSBpbiBhIHN0YXRlIHdoZXJlIHRoaXMKQEAgLTYwMiwyNSArNjUyLDM4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGJvb2xlYW4gcGxheVNvdW5kRWZmZWN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoZmVhdHVyZUlkLCB0cnVlKTsKLSAgICAgICAgICAgIGlmIChzdC5pc09wZW4gfHwgc3QuaXNIYW5kbGVkKSB7CisgICAgICAgICAgICBmaW5hbCBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoZmVhdHVyZUlkLCB0cnVlKTsKKyAgICAgICAgICAgIGlmIChmZWF0dXJlSWQgPT0gRkVBVFVSRV9PUFRJT05TX1BBTkVMICYmIG1BY3Rpb25CYXIgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICBtQWN0aW9uQmFyLmlzT3ZlcmZsb3dSZXNlcnZlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtQWN0aW9uQmFyLmlzT3ZlcmZsb3dNZW51U2hvd2luZygpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENhbGxiYWNrIGNiID0gZ2V0Q2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNiICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYi5vblByZXBhcmVQYW5lbChmZWF0dXJlSWQsIHN0LmNyZWF0ZWRQYW5lbFZpZXcsIHN0Lm1lbnUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QgPSBtQWN0aW9uQmFyLnNob3dPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdCA9IG1BY3Rpb25CYXIuaGlkZU92ZXJmbG93TWVudSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHN0LmlzT3BlbiB8fCBzdC5pc0hhbmRsZWQpIHsKIAotICAgICAgICAgICAgICAgIC8vIFBsYXkgdGhlIHNvdW5kIGVmZmVjdCBpZiB0aGUgdXNlciBjbG9zZWQgYW4gb3BlbiBtZW51IChhbmQgbm90IGlmCi0gICAgICAgICAgICAgICAgLy8gdGhleSBqdXN0IHJlbGVhc2VkIGEgbWVudSBzaG9ydGN1dCkKLSAgICAgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QgPSBzdC5pc09wZW47CisgICAgICAgICAgICAgICAgICAgIC8vIFBsYXkgdGhlIHNvdW5kIGVmZmVjdCBpZiB0aGUgdXNlciBjbG9zZWQgYW4gb3BlbiBtZW51IChhbmQgbm90IGlmCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZXkganVzdCByZWxlYXNlZCBhIG1lbnUgc2hvcnRjdXQpCisgICAgICAgICAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdCA9IHN0LmlzT3BlbjsKIAotICAgICAgICAgICAgICAgIC8vIENsb3NlIG1lbnUKLSAgICAgICAgICAgICAgICBjbG9zZVBhbmVsKHN0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgbWVudQorICAgICAgICAgICAgICAgICAgICBjbG9zZVBhbmVsKHN0LCB0cnVlKTsKIAotICAgICAgICAgICAgfSBlbHNlIGlmIChzdC5pc1ByZXBhcmVkKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdC5pc1ByZXBhcmVkKSB7CiAKLSAgICAgICAgICAgICAgICAvLyBXcml0ZSAnbWVudSBvcGVuZWQnIHRvIGV2ZW50IGxvZwotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNTAwMDEsIDApOworICAgICAgICAgICAgICAgICAgICAvLyBXcml0ZSAnbWVudSBvcGVuZWQnIHRvIGV2ZW50IGxvZworICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KDUwMDAxLCAwKTsKIAotICAgICAgICAgICAgICAgIC8vIFNob3cgbWVudQotICAgICAgICAgICAgICAgIG9wZW5QYW5lbChzdCwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAvLyBTaG93IG1lbnUKKyAgICAgICAgICAgICAgICAgICAgb3BlblBhbmVsKHN0LCBldmVudCk7CiAKLSAgICAgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHBsYXlTb3VuZEVmZmVjdCkgewpAQCAtNzc3LDggKzg0MCwyMCBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBUaGUgd2luZG93IG1hbmFnZXIgd2lsbCBnaXZlIHVzIGEgdmFsaWQgd2luZG93IHRva2VuCi0gICAgICAgIG5ldyBNZW51RGlhbG9nSGVscGVyKHN1Yk1lbnUpLnNob3cobnVsbCk7CisgICAgICAgIGZpbmFsIE1lbnUgcGFyZW50TWVudSA9IHN1Yk1lbnUuZ2V0Um9vdE1lbnUoKTsKKyAgICAgICAgZmluYWwgUGFuZWxGZWF0dXJlU3RhdGUgcGFuZWwgPSBmaW5kTWVudVBhbmVsKHBhcmVudE1lbnUpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVzZSB0aGUgcGFuZWwgb3BlbiBzdGF0ZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGNvbWluZyBmcm9tIGFuIG9wZW4gcGFuZWwKKyAgICAgICAgICogb3IgYW4gYWN0aW9uIGJ1dHRvbi4gSWYgaXQncyBhbiBvcGVuIHBhbmVsIHdlIHdhbnQgdG8gdXNlIE1lbnVEaWFsb2dIZWxwZXIuCisgICAgICAgICAqIElmIGl0J3MgY2xvc2VkIHdlIHdhbnQgdG8gZ3JhYiB0aGUgcmVsZXZhbnQgdmlldyBhbmQgY3JlYXRlIGEgcG9wdXAgYW5jaG9yZWQgdG8gaXQuCisgICAgICAgICAqLworICAgICAgICBpZiAocGFuZWwuaXNPcGVuKSB7CisgICAgICAgICAgICAvLyBUaGUgd2luZG93IG1hbmFnZXIgd2lsbCBnaXZlIHVzIGEgdmFsaWQgd2luZG93IHRva2VuCisgICAgICAgICAgICBuZXcgTWVudURpYWxvZ0hlbHBlcihzdWJNZW51KS5zaG93KG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmV3IE1lbnVQb3B1cEhlbHBlcihnZXRDb250ZXh0KCksIHN1Yk1lbnUpLnNob3coKTsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTc4OCw2ICs4NjMsMjEgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVvcGVuTWVudShib29sZWFuIHRvZ2dsZU1lbnVNb2RlKSB7CisgICAgICAgIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghbUFjdGlvbkJhci5pc092ZXJmbG93TWVudVNob3dpbmcoKSB8fCAhdG9nZ2xlTWVudU1vZGUpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDYWxsYmFjayBjYiA9IGdldENhbGxiYWNrKCk7CisgICAgICAgICAgICAgICAgaWYgKGNiICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKEZFQVRVUkVfT1BUSU9OU19QQU5FTCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYi5vblByZXBhcmVQYW5lbChGRUFUVVJFX09QVElPTlNfUEFORUwsIHN0LmNyZWF0ZWRQYW5lbFZpZXcsIHN0Lm1lbnUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aW9uQmFyLnNob3dPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5oaWRlT3ZlcmZsb3dNZW51KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoRkVBVFVSRV9PUFRJT05TX1BBTkVMLCB0cnVlKTsKIAogICAgICAgICAvLyBTYXZlIHRoZSBmdXR1cmUgZXhwYW5kZWQgbW9kZSBzdGF0ZSBzaW5jZSBjbG9zZVBhbmVsIHdpbGwgcmVzZXQgaXQKQEAgLTE0MzUsNiArMTUyNSw3IEBACiAgICAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIEZPQ1VTRURfSURfVEFHID0gImFuZHJvaWQ6Zm9jdXNlZFZpZXdJZCI7CiAgICAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFZJRVdTX1RBRyA9ICJhbmRyb2lkOnZpZXdzIjsKICAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUEFORUxTX1RBRyA9ICJhbmRyb2lkOlBhbmVscyI7CisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIEFDVElPTl9CQVJfVEFHID0gImFuZHJvaWQ6QWN0aW9uQmFyIjsKIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgQE92ZXJyaWRlCkBAIC0xNDY4LDYgKzE1NTksMTAgQEAKICAgICAgICAgICAgIG91dFN0YXRlLnB1dFNwYXJzZVBhcmNlbGFibGVBcnJheShQQU5FTFNfVEFHLCBwYW5lbFN0YXRlcyk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRCb29sZWFuKEFDVElPTl9CQVJfVEFHLCBtQWN0aW9uQmFyLmlzT3ZlcmZsb3dNZW51U2hvd2luZygpKTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiBvdXRTdGF0ZTsKICAgICB9CiAKQEAgLTE1MDIsNiArMTU5NywxMCBAQAogICAgICAgICBpZiAocGFuZWxTdGF0ZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgcmVzdG9yZVBhbmVsU3RhdGUocGFuZWxTdGF0ZXMpOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCAmJiBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0Qm9vbGVhbihBQ1RJT05fQkFSX1RBRykpIHsKKyAgICAgICAgICAgIG1BY3Rpb25CYXIucG9zdFNob3dPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTU5Miw2ICsxNjkxLDkgQEAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1XYXRjaGluZ0Zvck1lbnU7CiAgICAgICAgIHByaXZhdGUgaW50IG1Eb3duWTsKIAorICAgICAgICBwcml2YXRlIEFjdGlvbk1vZGUgbUFjdGlvbk1vZGU7CisgICAgICAgIHByaXZhdGUgQWN0aW9uQmFyQ29udGV4dFZpZXcgbUFjdGlvbk1vZGVWaWV3OworCiAgICAgICAgIHB1YmxpYyBEZWNvclZpZXcoQ29udGV4dCBjb250ZXh0LCBpbnQgZmVhdHVyZUlkKSB7CiAgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKICAgICAgICAgICAgIG1GZWF0dXJlSWQgPSBmZWF0dXJlSWQ7CkBAIC0xNjAwLDcgKzE3MDIsOCBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hLZXlFdmVudChLZXlFdmVudCBldmVudCkgewogICAgICAgICAgICAgZmluYWwgaW50IGtleUNvZGUgPSBldmVudC5nZXRLZXlDb2RlKCk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzRG93biA9IGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9ET1dOOworICAgICAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2ZW50LmdldEFjdGlvbigpOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0Rvd24gPSBhY3Rpb24gPT0gS2V5RXZlbnQuQUNUSU9OX0RPV047CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBJZiB0aGUgdXNlciBoaXRzIGFub3RoZXIga2V5IHdpdGhpbiB0aGUgcGxheSBzb3VuZCBkZWxheSwgdGhlbgpAQCAtMTY1Nyw2ICsxNzYwLDE0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBCYWNrIGNhbmNlbHMgYWN0aW9uIG1vZGVzIGZpcnN0LgorICAgICAgICAgICAgaWYgKG1BY3Rpb25Nb2RlICE9IG51bGwgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0JBQ0spIHsKKyAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IEtleUV2ZW50LkFDVElPTl9VUCkgeworICAgICAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZS5maW5pc2goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGZpbmFsIENhbGxiYWNrIGNiID0gZ2V0Q2FsbGJhY2soKTsKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFuZGxlZCA9IGNiICE9IG51bGwgJiYgbUZlYXR1cmVJZCA8IDAgPyBjYi5kaXNwYXRjaEtleUV2ZW50KGV2ZW50KQogICAgICAgICAgICAgICAgICAgICA6IHN1cGVyLmRpc3BhdGNoS2V5RXZlbnQoZXZlbnQpOwpAQCAtMTg3OSw2ICsxOTkwLDU1IEBACiAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHRNZW51SGVscGVyICE9IG51bGw7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQoVmlldyBvcmlnaW5hbFZpZXcsCisgICAgICAgICAgICAgICAgQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgLy8gb3JpZ2luYWxWaWV3IGNhbiBiZSB1c2VkIGhlcmUgdG8gYmUgc3VyZSB0aGF0IHdlIGRvbid0IG9ic2N1cmUKKyAgICAgICAgICAgIC8vIHJlbGV2YW50IGNvbnRlbnQgd2l0aCB0aGUgY29udGV4dCBtb2RlIFVJLgorICAgICAgICAgICAgcmV0dXJuIHN0YXJ0QWN0aW9uTW9kZShjYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGlmIChtQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIEFjdGlvbk1vZGUuQ2FsbGJhY2sgd3JhcHBlZENhbGxiYWNrID0gbmV3IEFjdGlvbk1vZGVDYWxsYmFja1dyYXBwZXIoY2FsbGJhY2spOworICAgICAgICAgICAgQWN0aW9uTW9kZSBtb2RlID0gZ2V0Q2FsbGJhY2soKS5vblN0YXJ0QWN0aW9uTW9kZSh3cmFwcGVkQ2FsbGJhY2spOworICAgICAgICAgICAgaWYgKG1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbW9kZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1BY3Rpb25Nb2RlVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYXNGZWF0dXJlKEZFQVRVUkVfQUNUSU9OX01PREVfT1ZFUkxBWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlVmlldyA9IG5ldyBBY3Rpb25CYXJDb250ZXh0VmlldyhtQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFUQ0hfUEFSRU5ULCBXUkFQX0NPTlRFTlQpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkVmlldyhtQWN0aW9uTW9kZVZpZXcsIHBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWaWV3U3R1YiBzdHViID0gKFZpZXdTdHViKSBmaW5kVmlld0J5SWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuYWN0aW9uX21vZGVfYmFyX3N0dWIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0dWIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlVmlldyA9IChBY3Rpb25CYXJDb250ZXh0Vmlldykgc3R1Yi5pbmZsYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobUFjdGlvbk1vZGVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbW9kZSA9IG5ldyBTdGFuZGFsb25lQWN0aW9uTW9kZShnZXRDb250ZXh0KCksIG1BY3Rpb25Nb2RlVmlldywgd3JhcHBlZENhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrLm9uQ3JlYXRlQWN0aW9uTW9kZShtb2RlLCBtb2RlLmdldE1lbnUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGVWaWV3LmluaXRGb3JNb2RlKG1vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtQWN0aW9uTW9kZTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q2hhbmdpbmcoKSB7CiAgICAgICAgICAgICBtQ2hhbmdpbmcgPSB0cnVlOwogICAgICAgICB9CkBAIC0yMDU4LDYgKzIyMTgsMzcgQEAKICAgICAgICAgICAgIGlmIChrZWVwT24pIFBob25lV2luZG93LnRoaXMuYWRkRmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19LRUVQX1NDUkVFTl9PTik7CiAgICAgICAgICAgICBlbHNlIFBob25lV2luZG93LnRoaXMuY2xlYXJGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0tFRVBfU0NSRUVOX09OKTsKICAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbGVhcnMgb3V0IGludGVybmFsIHJlZmVyZW5jZSB3aGVuIHRoZSBhY3Rpb24gbW9kZSBpcyBkZXN0cm95ZWQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGNsYXNzIEFjdGlvbk1vZGVDYWxsYmFja1dyYXBwZXIgaW1wbGVtZW50cyBBY3Rpb25Nb2RlLkNhbGxiYWNrIHsKKyAgICAgICAgICAgIHByaXZhdGUgQWN0aW9uTW9kZS5DYWxsYmFjayBtV3JhcHBlZDsKKworICAgICAgICAgICAgcHVibGljIEFjdGlvbk1vZGVDYWxsYmFja1dyYXBwZXIoQWN0aW9uTW9kZS5DYWxsYmFjayB3cmFwcGVkKSB7CisgICAgICAgICAgICAgICAgbVdyYXBwZWQgPSB3cmFwcGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVdyYXBwZWQub25DcmVhdGVBY3Rpb25Nb2RlKG1vZGUsIG1lbnUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVkLm9uUHJlcGFyZUFjdGlvbk1vZGUobW9kZSwgbWVudSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aW9uSXRlbUNsaWNrZWQoQWN0aW9uTW9kZSBtb2RlLCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVkLm9uQWN0aW9uSXRlbUNsaWNrZWQobW9kZSwgaXRlbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgICAgICAgICAgbVdyYXBwZWQub25EZXN0cm95QWN0aW9uTW9kZShtb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAobUFjdGlvbk1vZGVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGVWaWV3LnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHByb3RlY3RlZCBEZWNvclZpZXcgZ2VuZXJhdGVEZWNvcigpIHsKQEAgLTIxMDYsNiArMjI5NywxNyBAQAogCiAgICAgICAgIGlmIChhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93X3dpbmRvd05vVGl0bGUsIGZhbHNlKSkgewogICAgICAgICAgICAgcmVxdWVzdEZlYXR1cmUoRkVBVFVSRV9OT19USVRMRSk7CisgICAgICAgIH0gZWxzZSBpZiAoYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd193aW5kb3dBY3Rpb25CYXIsIGZhbHNlKSkgeworICAgICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgYW4gYWN0aW9uIGJhciBpZiB0aGVyZSBpcyBubyB0aXRsZS4KKyAgICAgICAgICAgIHJlcXVlc3RGZWF0dXJlKEZFQVRVUkVfQUNUSU9OX0JBUik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd193aW5kb3dBY3Rpb25CYXJPdmVybGF5LCBmYWxzZSkpIHsKKyAgICAgICAgICAgIHJlcXVlc3RGZWF0dXJlKEZFQVRVUkVfQUNUSU9OX0JBUl9PVkVSTEFZKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93X3dpbmRvd0FjdGlvbk1vZGVPdmVybGF5LCBmYWxzZSkpIHsKKyAgICAgICAgICAgIHJlcXVlc3RGZWF0dXJlKEZFQVRVUkVfQUNUSU9OX01PREVfT1ZFUkxBWSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd193aW5kb3dGdWxsc2NyZWVuLCBmYWxzZSkpIHsKQEAgLTIxNzAsMTEgKzIzNzIsMTUgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zY3JlZW5fdGl0bGVfaWNvbnM7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBYWFggUmVtb3ZlIHRoaXMgb25jZSBhY3Rpb24gYmFyIHN1cHBvcnRzIHRoZXNlIGZlYXR1cmVzLgorICAgICAgICAgICAgcmVtb3ZlRmVhdHVyZShGRUFUVVJFX0FDVElPTl9CQVIpOwogICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJUaXRsZSBJY29ucyEiKTsKICAgICAgICAgfSBlbHNlIGlmICgoZmVhdHVyZXMgJiAoKDEgPDwgRkVBVFVSRV9QUk9HUkVTUykgfCAoMSA8PCBGRUFUVVJFX0lOREVURVJNSU5BVEVfUFJPR1JFU1MpKSkgIT0gMCkgewogICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBhIHdpbmRvdyB3aXRoIG9ubHkgYSBwcm9ncmVzcyBiYXIgKGFuZCB0aXRsZSkuCiAgICAgICAgICAgICAvLyBYWFggTmVlZCB0byBoYXZlIGEgbm8tdGl0bGUgdmVyc2lvbiBvZiBlbWJlZGRlZCB3aW5kb3dzLgogICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zY3JlZW5fcHJvZ3Jlc3M7CisgICAgICAgICAgICAvLyBYWFggUmVtb3ZlIHRoaXMgb25jZSBhY3Rpb24gYmFyIHN1cHBvcnRzIHRoZXNlIGZlYXR1cmVzLgorICAgICAgICAgICAgcmVtb3ZlRmVhdHVyZShGRUFUVVJFX0FDVElPTl9CQVIpOwogICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcm9ncmVzcyEiKTsKICAgICAgICAgfSBlbHNlIGlmICgoZmVhdHVyZXMgJiAoMSA8PCBGRUFUVVJFX0NVU1RPTV9USVRMRSkpICE9IDApIHsKICAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgYSB3aW5kb3cgd2l0aCBhIGN1c3RvbSB0aXRsZS4KQEAgLTIxODQsMTEgKzIzOTAsMTkgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zY3JlZW5fY3VzdG9tX3RpdGxlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gWFhYIFJlbW92ZSB0aGlzIG9uY2UgYWN0aW9uIGJhciBzdXBwb3J0cyB0aGVzZSBmZWF0dXJlcy4KKyAgICAgICAgICAgIHJlbW92ZUZlYXR1cmUoRkVBVFVSRV9BQ1RJT05fQkFSKTsKICAgICAgICAgfSBlbHNlIGlmICgoZmVhdHVyZXMgJiAoMSA8PCBGRUFUVVJFX05PX1RJVExFKSkgPT0gMCkgewogICAgICAgICAgICAgLy8gSWYgbm8gb3RoZXIgZmVhdHVyZXMgYW5kIG5vdCBlbWJlZGRlZCwgb25seSBuZWVkIGEgdGl0bGUuCiAgICAgICAgICAgICAvLyBJZiB0aGUgd2luZG93IGlzIGZsb2F0aW5nLCB3ZSBuZWVkIGEgZGlhbG9nIGxheW91dAogICAgICAgICAgICAgaWYgKG1Jc0Zsb2F0aW5nKSB7CiAgICAgICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5kaWFsb2dfdGl0bGU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChmZWF0dXJlcyAmICgxIDw8IEZFQVRVUkVfQUNUSU9OX0JBUikpICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKGZlYXR1cmVzICYgKDEgPDwgRkVBVFVSRV9BQ1RJT05fQkFSX09WRVJMQVkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxheW91dFJlc291cmNlID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuc2NyZWVuX2FjdGlvbl9iYXJfb3ZlcmxheTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsYXlvdXRSZXNvdXJjZSA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnNjcmVlbl9hY3Rpb25fYmFyOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zY3JlZW5fdGl0bGU7CiAgICAgICAgICAgICB9CkBAIC0yMjczLDYgKzI0ODcsMjIgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQobVRpdGxlKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1BY3Rpb25CYXIgPSAoQWN0aW9uQmFyVmlldykgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuYWN0aW9uX2Jhcik7CisgICAgICAgICAgICAgICAgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGlvbkJhci5nZXRUaXRsZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25CYXIuc2V0V2luZG93VGl0bGUobVRpdGxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBQb3N0IHRoZSBwYW5lbCBpbnZhbGlkYXRlIGZvciBsYXRlcjsgYXZvaWQgYXBwbGljYXRpb24gb25DcmVhdGVPcHRpb25zTWVudQorICAgICAgICAgICAgICAgICAgICAvLyBiZWluZyBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZiBvbkNyZWF0ZSBvciBzaW1pbGFyLgorICAgICAgICAgICAgICAgICAgICBtRGVjb3IucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Rlc3Ryb3llZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVQYW5lbE1lbnUoRkVBVFVSRV9BQ1RJT05fQkFSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI2MjYsNiArMjg1Niw4IEBACiAKICAgICAgICAgYm9vbGVhbiByZWZyZXNoRGVjb3JWaWV3OwogCisgICAgICAgIGJvb2xlYW4gcmVmcmVzaE1lbnVDb250ZW50OworICAgICAgICAKICAgICAgICAgYm9vbGVhbiB3YXNMYXN0T3BlbjsKICAgICAgICAgCiAgICAgICAgIGJvb2xlYW4gd2FzTGFzdEV4cGFuZGVkOwpAQCAtMjc0OCwxMSArMjk4MCwxMSBAQAogICAgICAqIDxsaT4gQ2FsbHMgYmFjayB0byB0aGUgY2FsbGJhY2sncyBvbk1lbnVJdGVtU2VsZWN0ZWQgd2hlbiBhbiBpdGVtIGlzCiAgICAgICogc2VsZWN0ZWQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb250ZXh0TWVudUNhbGxiYWNrIGltcGxlbWVudHMgTWVudUJ1aWxkZXIuQ2FsbGJhY2sgeworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgRGlhbG9nTWVudUNhbGxiYWNrIGltcGxlbWVudHMgTWVudUJ1aWxkZXIuQ2FsbGJhY2sgewogICAgICAgICBwcml2YXRlIGludCBtRmVhdHVyZUlkOwogICAgICAgICBwcml2YXRlIE1lbnVEaWFsb2dIZWxwZXIgbVN1Yk1lbnVIZWxwZXI7CiAKLSAgICAgICAgcHVibGljIENvbnRleHRNZW51Q2FsbGJhY2soaW50IGZlYXR1cmVJZCkgeworICAgICAgICBwdWJsaWMgRGlhbG9nTWVudUNhbGxiYWNrKGludCBmZWF0dXJlSWQpIHsKICAgICAgICAgICAgIG1GZWF0dXJlSWQgPSBmZWF0dXJlSWQ7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvd01hbmFnZXIuamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3dNYW5hZ2VyLmphdmEKaW5kZXggMjc0MTI0Yi4uNmU1ZGIyYiAxMDA3NTUKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvd01hbmFnZXIuamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93TWFuYWdlci5qYXZhCkBAIC00Niw2ICs0Niw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5WaWJyYXRvcjsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuUG9saWN5TWFuYWdlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuSVN0YXR1c0JhclNlcnZpY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklUZWxlcGhvbnk7CkBAIC0xOTgsNiArMTk5LDcgQEAKICAgICAKICAgICBib29sZWFuIG1TYWZlTW9kZTsKICAgICBXaW5kb3dTdGF0ZSBtU3RhdHVzQmFyID0gbnVsbDsKKyAgICBib29sZWFuIG1TdGF0dXNCYXJDYW5IaWRlOwogICAgIGZpbmFsIEFycmF5TGlzdDxXaW5kb3dTdGF0ZT4gbVN0YXR1c0JhclBhbmVscyA9IG5ldyBBcnJheUxpc3Q8V2luZG93U3RhdGU+KCk7CiAgICAgV2luZG93U3RhdGUgbUtleWd1YXJkID0gbnVsbDsKICAgICBLZXlndWFyZFZpZXdNZWRpYXRvciBtS2V5Z3VhcmRNZWRpYXRvcjsKQEAgLTI4OCw2ICsyOTAsOSBAQAogCiAgICAgLy8gTm90aGluZyB0byBzZWUgaGVyZSwgbW92ZSBhbG9uZy4uLgogICAgIGludCBtRmFuY3lSb3RhdGlvbkFuaW1hdGlvbjsKKyAgICAKKyAgICAvLyBFbmFibGUgM0QgcmVjZW50cyBiYXNlZCBvbiBjb25maWcgc2V0dGluZ3MuCisgICAgcHJpdmF0ZSBCb29sZWFuIG1Vc2UzZFJlY2VudHM7CiAKICAgICBTaG9ydGN1dE1hbmFnZXIgbVNob3J0Y3V0TWFuYWdlcjsKICAgICBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbUJyb2FkY2FzdFdha2VMb2NrOwpAQCAtNDkwLDYgKzQ5NSwyNyBAQAogICAgICAqIENyZWF0ZSAoaWYgbmVjZXNzYXJ5KSBhbmQgbGF1bmNoIHRoZSByZWNlbnQgYXBwcyBkaWFsb2cKICAgICAgKi8KICAgICB2b2lkIHNob3dSZWNlbnRBcHBzRGlhbG9nKCkgeworICAgICAgICAvLyBXZSBjYW4ndCBpbml0aWFsaXplIHRoaXMgaW4gaW5pdCgpIHNpbmNlIHRoZSBjb25maWd1cmF0aW9uIGhhc24ndCBiZWVuIGxvYWRlZCB5ZXQuCisgICAgICAgIGlmIChtVXNlM2RSZWNlbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Vc2UzZFJlY2VudHMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKFIuYm9vbC5jb25maWdfZW5hYmxlUmVjZW50QXBwczNEKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gVXNlIDNkIFJlY2VudHMgZGlhbG9nCisgICAgICAgIGlmIChtVXNlM2RSZWNlbnRzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgICAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZSgiY29tLmFuZHJvaWQuc3lzdGVtdWkiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkiKTsKKyAgICAgICAgICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgCisgICAgICAgICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0FDVElWSVRZX0VYQ0xVREVfRlJPTV9SRUNFTlRTKTsKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBjYXRjaCAoQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGxhdW5jaCBSZWNlbnRBcHBzSW50ZW50IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBGYWxsYmFjayB0byBkaWFsb2cgaWYgd2UgZmFpbCB0byBsYXVuY2ggdGhlIGFib3ZlLgogICAgICAgICBpZiAobVJlY2VudEFwcHNEaWFsb2cgPT0gbnVsbCkgewogICAgICAgICAgICAgbVJlY2VudEFwcHNEaWFsb2cgPSBuZXcgUmVjZW50QXBwbGljYXRpb25zRGlhbG9nKG1Db250ZXh0KTsKICAgICAgICAgfQpAQCAtNTIxLDYgKzU0Nyw3IEBACiAgICAgICAgIG1EZXNrRG9ja0ludGVudC5hZGRDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfREVTS19ET0NLKTsKICAgICAgICAgbURlc2tEb2NrSW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLCiAgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9SRVNFVF9UQVNLX0lGX05FRURFRCk7CisKICAgICAgICAgUG93ZXJNYW5hZ2VyIHBtID0gKFBvd2VyTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKICAgICAgICAgbUJyb2FkY2FzdFdha2VMb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLAogICAgICAgICAgICAgICAgICJQaG9uZVdpbmRvd01hbmFnZXIubUJyb2FkY2FzdFdha2VMb2NrIik7CkBAIC01NjMsNiArNTkwLDkgQEAKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LmNvbmZpZ19zYWZlTW9kZURpc2FibGVkVmliZVBhdHRlcm4pOwogICAgICAgICBtU2FmZU1vZGVFbmFibGVkVmliZVBhdHRlcm4gPSBnZXRMb25nSW50QXJyYXkobUNvbnRleHQuZ2V0UmVzb3VyY2VzKCksCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfc2FmZU1vZGVFbmFibGVkVmliZVBhdHRlcm4pOworCisgICAgICAgIC8vIE5vdGU6IHRoZSBDb25maWd1cmF0aW9uIGlzIG5vdCBzdGFibGUgaGVyZSwgc28gd2UgY2Fubm90IGxvYWQgbVN0YXR1c0JhckNhbkhpZGUgZnJvbQorICAgICAgICAvLyBjb25maWdfc3RhdHVzQmFyQ2FuSGlkZSBiZWNhdXNlIHRoZSBsYXR0ZXIgZGVwZW5kcyBvbiB0aGUgc2NyZWVuIHNpemUKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB1cGRhdGVTZXR0aW5ncygpIHsKQEAgLTk3NSw2ICsxMDA1LDExIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXaW5kb3dNYW5hZ2VySW1wbC5BRERfTVVMVElQTEVfU0lOR0xFVE9OOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU3RhdHVzQmFyID0gd2luOworCisgICAgICAgICAgICAgICAgLy8gVGhlIENvbmZpZ3VyYXRpb24gd2lsbCBiZSBzdGFibGUgYnkgbm93LCBzbyB3ZSBjYW4gbG9hZCB0aGlzCisgICAgICAgICAgICAgICAgbVN0YXR1c0JhckNhbkhpZGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5ib29sLmNvbmZpZ19zdGF0dXNCYXJDYW5IaWRlKTsKKwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBUWVBFX1NUQVRVU19CQVJfUEFORUw6CiAgICAgICAgICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKApAQCAtMTIzMyw3ICsxMjY4LDcgQEAKICAgICBwdWJsaWMgdm9pZCBnZXRDb250ZW50SW5zZXRIaW50THcoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgYXR0cnMsIFJlY3QgY29udGVudEluc2V0KSB7CiAgICAgICAgIGZpbmFsIGludCBmbCA9IGF0dHJzLmZsYWdzOwogICAgICAgICAKLSAgICAgICAgaWYgKChmbCAmCisgICAgICAgIGlmIChtU3RhdHVzQmFyQ2FuSGlkZSAmJiAoZmwgJgogICAgICAgICAgICAgICAgIChGTEFHX0xBWU9VVF9JTl9TQ1JFRU4gfCBGTEFHX0ZVTExTQ1JFRU4gfCBGTEFHX0xBWU9VVF9JTlNFVF9ERUNPUikpCiAgICAgICAgICAgICAgICAgPT0gKEZMQUdfTEFZT1VUX0lOX1NDUkVFTiB8IEZMQUdfTEFZT1VUX0lOU0VUX0RFQ09SKSkgewogICAgICAgICAgICAgY29udGVudEluc2V0LnNldChtQ3VyTGVmdCwgbUN1clRvcCwgbVcgLSBtQ3VyUmlnaHQsIG1IIC0gbUN1ckJvdHRvbSk7CkBAIC0xMjY2LDEwICsxMzAxLDE3IEBACiAgICAgICAgICAgICBpZiAobVN0YXR1c0Jhci5pc1Zpc2libGVMdygpKSB7CiAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHN0YXR1cyBiYXIgaXMgaGlkZGVuLCB3ZSBkb24ndCB3YW50IHRvIGNhdXNlCiAgICAgICAgICAgICAgICAgLy8gd2luZG93cyBiZWhpbmQgaXQgdG8gc2Nyb2xsLgotICAgICAgICAgICAgICAgIG1Eb2NrVG9wID0gbUNvbnRlbnRUb3AgPSBtQ3VyVG9wID0gbVN0YXR1c0Jhci5nZXRGcmFtZUx3KCkuYm90dG9tOwotICAgICAgICAgICAgICAgIGlmIChERUJVR19MQVlPVVQpIExvZy52KFRBRywgIlN0YXR1cyBiYXI6IG1Eb2NrQm90dG9tPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbURvY2tCb3R0b20gKyAiIG1Db250ZW50Qm90dG9tPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUNvbnRlbnRCb3R0b20gKyAiIG1DdXJCb3R0b209IiArIG1DdXJCb3R0b20pOworICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgciA9IG1TdGF0dXNCYXIuZ2V0RnJhbWVMdygpOworICAgICAgICAgICAgICAgIGlmIChtRG9ja1RvcCA9PSByLnRvcCkgbURvY2tUb3AgPSByLmJvdHRvbTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtRG9ja0JvdHRvbSA9PSByLmJvdHRvbSkgbURvY2tCb3R0b20gPSByLnRvcDsKKyAgICAgICAgICAgICAgICBtQ29udGVudFRvcCA9IG1DdXJUb3AgPSBtRG9ja1RvcDsKKyAgICAgICAgICAgICAgICBtQ29udGVudEJvdHRvbSA9IG1DdXJCb3R0b20gPSBtRG9ja0JvdHRvbTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUdfTEFZT1VUKSBMb2cudihUQUcsICJTdGF0dXMgYmFyOiBtRG9ja1RvcD0iICsgbURvY2tUb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtQ29udGVudFRvcD0iICsgbUNvbnRlbnRUb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtQ3VyVG9wPSIgKyBtQ3VyVG9wCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbURvY2tCb3R0b209IiArIG1Eb2NrQm90dG9tCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbUNvbnRlbnRCb3R0b209IiArIG1Db250ZW50Qm90dG9tCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbUN1ckJvdHRvbT0iICsgbUN1ckJvdHRvbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzU0LDcgKzEzOTYsNyBAQAogICAgICAgICAgICAgYXR0cnMuZ3Jhdml0eSA9IEdyYXZpdHkuQk9UVE9NOwogICAgICAgICAgICAgbURvY2tMYXllciA9IHdpbi5nZXRTdXJmYWNlTGF5ZXIoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICgoZmwgJgorICAgICAgICAgICAgaWYgKG1TdGF0dXNCYXJDYW5IaWRlICYmIChmbCAmCiAgICAgICAgICAgICAgICAgICAgIChGTEFHX0xBWU9VVF9JTl9TQ1JFRU4gfCBGTEFHX0ZVTExTQ1JFRU4gfCBGTEFHX0xBWU9VVF9JTlNFVF9ERUNPUikpCiAgICAgICAgICAgICAgICAgICAgID09IChGTEFHX0xBWU9VVF9JTl9TQ1JFRU4gfCBGTEFHX0xBWU9VVF9JTlNFVF9ERUNPUikpIHsKICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIGZvciBhIG5vcm1hbCBhY3Rpdml0eSB3aW5kb3c6IHdlIHdhbnQgaXQKQEAgLTEzODYsNyArMTQyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHZmLnJpZ2h0ID0gbUN1clJpZ2h0OwogICAgICAgICAgICAgICAgICAgICB2Zi5ib3R0b20gPSBtQ3VyQm90dG9tOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsICYgRkxBR19MQVlPVVRfSU5fU0NSRUVOKSAhPSAwKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0dXNCYXJDYW5IaWRlICYmIChmbCAmIEZMQUdfTEFZT1VUX0lOX1NDUkVFTikgIT0gMCkgewogICAgICAgICAgICAgICAgIC8vIEEgd2luZG93IHRoYXQgaGFzIHJlcXVlc3RlZCB0byBmaWxsIHRoZSBlbnRpcmUgc2NyZWVuIGp1c3QKICAgICAgICAgICAgICAgICAvLyBnZXRzIGV2ZXJ5dGhpbmcsIHBlcmlvZC4KICAgICAgICAgICAgICAgICBwZi5sZWZ0ID0gZGYubGVmdCA9IGNmLmxlZnQgPSAwOwpAQCAtMTUzMCw5ICsxNTcyLDEzIEBACiAgICAgICAgICAgICAgICAgYm9vbGVhbiBoaWRlU3RhdHVzQmFyID0KICAgICAgICAgICAgICAgICAgICAgKGxwLmZsYWdzICYgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19GVUxMU0NSRUVOKSAhPSAwOwogICAgICAgICAgICAgICAgIGlmIChoaWRlU3RhdHVzQmFyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19MQVlPVVQpIExvZy52KFRBRywgIkhpZGluZyBzdGF0dXMgYmFyIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzQmFyLmhpZGVMdyh0cnVlKSkgY2hhbmdlcyB8PSBGSU5JU0hfTEFZT1VUX1JFRE9fTEFZT1VUOwotICAgICAgICAgICAgICAgICAgICBoaWRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0JhckNhbkhpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19MQVlPVVQpIExvZy52KFRBRywgIkhpZGluZyBzdGF0dXMgYmFyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0Jhci5oaWRlTHcodHJ1ZSkpIGNoYW5nZXMgfD0gRklOSVNIX0xBWU9VVF9SRURPX0xBWU9VVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxMT0dWKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJQcmV2ZW50aW5nIHN0YXR1cyBiYXIgZnJvbSBoaWRpbmcgYnkgcG9saWN5Iik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfTEFZT1VUKSBMb2cudihUQUcsICJTaG93aW5nIHN0YXR1cyBiYXIiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNCYXIuc2hvd0x3KHRydWUpKSBjaGFuZ2VzIHw9IEZJTklTSF9MQVlPVVRfUkVET19MQVlPVVQ7CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1N0YXR1c1ZpZXcuamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvU3RhdHVzVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMDhjZmQKLS0tIC9kZXYvbnVsbAorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1N0YXR1c1ZpZXcuamF2YQpAQCAtMCwwICsxLDI1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuaW1wbDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxvY2tQYXR0ZXJuVXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworY2xhc3MgU3RhdHVzVmlldyB7CisgICAgcHJpdmF0ZSBTdHJpbmcgbURhdGVGb3JtYXRTdHJpbmc7CisKKyAgICBwcml2YXRlIFRleHRWaWV3IG1DYXJyaWVyOworICAgIHByaXZhdGUgVGV4dFZpZXcgbURhdGU7CisKKyAgICAvLyBhcmUgd2Ugc2hvd2luZyBiYXR0ZXJ5IGluZm9ybWF0aW9uPworICAgIHByaXZhdGUgYm9vbGVhbiBtU2hvd2luZ0JhdHRlcnlJbmZvID0gZmFsc2U7CisKKyAgICAvLyBsYXN0IGtub3duIHBsdWdnZWQgaW4gc3RhdGUKKyAgICBwcml2YXRlIGJvb2xlYW4gbVBsdWdnZWRJbiA9IGZhbHNlOworCisgICAgLy8gbGFzdCBrbm93biBiYXR0ZXJ5IGxldmVsCisgICAgcHJpdmF0ZSBpbnQgbUJhdHRlcnlMZXZlbCA9IDEwMDsKKworICAgIHByaXZhdGUgU3RyaW5nIG1OZXh0QWxhcm0gPSBudWxsOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbUluc3RydWN0aW9ucyA9IG51bGw7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtU3RhdHVzMTsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXMyOworICAgIHByaXZhdGUgVGV4dFZpZXcgbVByb3BlcnR5T2Y7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhc1N0YXR1czI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNDYXJyaWVyOworICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzRGF0ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhc1Byb3BlcnR5OworCisgICAgcHJpdmF0ZSBWaWV3IG1WaWV3OworCisgICAgcHJpdmF0ZSBWaWV3IGZpbmRWaWV3QnlJZChpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIG1WaWV3LmZpbmRWaWV3QnlJZChpZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBtVmlldy5nZXRDb250ZXh0KCk7CisgICAgfQorCisgICAgdm9pZCBzZXRJbnN0cnVjdGlvbnMoU3RyaW5nIGluc3RydWN0aW9ucykgeworICAgICAgICBtSW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zOworICAgIH0KKworICAgIHZvaWQgc2V0Q2FycmllclRleHQoQ2hhclNlcXVlbmNlIGNhcnJpZXJUZXh0KSB7CisgICAgICAgIGlmIChtQ2FycmllciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2Fycmllci5zZXRUZXh0KGNhcnJpZXJUZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgb25SZWZyZXNoQmF0dGVyeUluZm8oYm9vbGVhbiBzaG93QmF0dGVyeUluZm8sIGJvb2xlYW4gcGx1Z2dlZEluLCBpbnQgYmF0dGVyeUxldmVsKSB7CisgICAgICAgIG1TaG93aW5nQmF0dGVyeUluZm8gPSBzaG93QmF0dGVyeUluZm87CisgICAgICAgIG1QbHVnZ2VkSW4gPSBwbHVnZ2VkSW47CisgICAgICAgIG1CYXR0ZXJ5TGV2ZWwgPSBiYXR0ZXJ5TGV2ZWw7CisgICAgICAgIHVwZGF0ZVN0YXR1c0xpbmVzKCk7CisgICAgfQorCisgICAgdm9pZCBvblRpbWVDaGFuZ2VkKCkgeworICAgICAgICByZWZyZXNoVGltZUFuZERhdGVEaXNwbGF5KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25SaW5nZXJNb2RlQ2hhbmdlZChpbnQgc3RhdGUpIHsKKyAgICB9CisKKyAgICB2b2lkIG9uUmVmcmVzaENhcnJpZXJJbmZvKENoYXJTZXF1ZW5jZSBwbG1uLCBDaGFyU2VxdWVuY2Ugc3BuKSB7CisgICAgICAgIHNldENhcnJpZXJUZXh0KExvY2tTY3JlZW4uZ2V0Q2FycmllclN0cmluZyhwbG1uLCBzcG4pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RhdHVzVmlldyhWaWV3IHZpZXcsIEtleWd1YXJkVXBkYXRlTW9uaXRvciB1cGRhdGVNb25pdG9yLAorICAgICAgICAgICAgICAgICAgTG9ja1BhdHRlcm5VdGlscyBsb2NrUGF0dGVyblV0aWxzKSB7CisgICAgICAgIG1WaWV3ID0gdmlldzsKKyAgICAgICAgbUNhcnJpZXIgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmNhcnJpZXIpOworICAgICAgICBtSGFzQ2FycmllciA9IChtQ2FycmllciAhPSBudWxsKTsKKyAgICAgICAgbURhdGUgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmRhdGUpOworICAgICAgICBtSGFzRGF0ZSA9IChtRGF0ZSAhPSBudWxsKTsKKyAgICAgICAgbURhdGVGb3JtYXRTdHJpbmcgPSBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmZ1bGxfd2RheV9tb250aF9kYXlfbm9feWVhcik7CisKKyAgICAgICAgcmVmcmVzaFRpbWVBbmREYXRlRGlzcGxheSgpOworCisgICAgICAgIG1TdGF0dXMxID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdGF0dXMxKTsKKyAgICAgICAgbVN0YXR1czIgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YXR1czIpOworICAgICAgICBtSGFzU3RhdHVzMiA9IChtU3RhdHVzMiAhPSBudWxsKTsKKyAgICAgICAgbVByb3BlcnR5T2YgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnByb3BlcnR5T2YpOworICAgICAgICBtSGFzUHJvcGVydHkgPSAobVByb3BlcnR5T2YgIT0gbnVsbCk7CisKKyAgICAgICAgcmVzZXRTdGF0dXNJbmZvKHVwZGF0ZU1vbml0b3IsIGxvY2tQYXR0ZXJuVXRpbHMpOworCisgICAgICAgIC8vIFJlcXVpcmVkIHRvIGdldCBNYXJxdWVlIHRvIHdvcmsuCisgICAgICAgIGlmIChtSGFzQ2FycmllcikgeworICAgICAgICAgICAgbUNhcnJpZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7CisgICAgICAgICAgICBtQ2Fycmllci5zZXRUZXh0Q29sb3IoMHhmZmZmZmZmZik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHZvaWQgcmVzZXRTdGF0dXNJbmZvKEtleWd1YXJkVXBkYXRlTW9uaXRvciB1cGRhdGVNb25pdG9yLCBMb2NrUGF0dGVyblV0aWxzIGxvY2tQYXR0ZXJuVXRpbHMpIHsKKyAgICAgICAgbUluc3RydWN0aW9ucyA9IG51bGw7CisgICAgICAgIG1TaG93aW5nQmF0dGVyeUluZm8gPSB1cGRhdGVNb25pdG9yLnNob3VsZFNob3dCYXR0ZXJ5SW5mbygpOworICAgICAgICBtUGx1Z2dlZEluID0gdXBkYXRlTW9uaXRvci5pc0RldmljZVBsdWdnZWRJbigpOworICAgICAgICBtQmF0dGVyeUxldmVsID0gdXBkYXRlTW9uaXRvci5nZXRCYXR0ZXJ5TGV2ZWwoKTsKKyAgICAgICAgbU5leHRBbGFybSA9IGxvY2tQYXR0ZXJuVXRpbHMuZ2V0TmV4dEFsYXJtKCk7CisgICAgICAgIHVwZGF0ZVN0YXR1c0xpbmVzKCk7CisgICAgfQorCisgICAgdm9pZCBzZXRJbnN0cnVjdGlvblRleHQoaW50IHN0cmluZ0lkKSB7CisgICAgICAgIG1TdGF0dXMxLnNldFRleHQoc3RyaW5nSWQpOworICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfbG9jaywgMCwgMCwgMCk7CisgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICB9CisKKyAgICB2b2lkIHNldEluc3RydWN0aW9uVGV4dChTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIG1TdGF0dXMxLnNldFRleHQoc3RyaW5nKTsKKyAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2xvY2ssIDAsIDAsIDApOworICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgfQorCisgICAgdm9pZCBzZXRDYXJyaWVyVGV4dChpbnQgc3RyaW5nSWQpIHsKKyAgICAgICAgbUNhcnJpZXIuc2V0VGV4dChzdHJpbmdJZCk7CisgICAgfQorICAgIHZvaWQgc2V0Q2FycmllclRleHQoU3RyaW5nIHN0cmluZykgeworICAgICAgICBtQ2Fycmllci5zZXRUZXh0KHN0cmluZyk7CisgICAgfQorCisgICAgLyoqIE9yaWdpbmF0ZWQgZnJvbSBQYXR0ZXJuVW5sb2NrU2NyZWVuICoqLworICAgIHZvaWQgdXBkYXRlU3RhdHVzTGluZXMoKSB7CisgICAgICAgIGlmIChtSGFzUHJvcGVydHkpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gR2V0IGFjdHVhbCBuYW1lICYgZW1haWwKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gIkpvaG4gU21pdGgiOworICAgICAgICAgICAgU3RyaW5nIGVtYWlsID0gImpzbWl0aEBnbWFpbC5jb20iOworICAgICAgICAgICAgbVByb3BlcnR5T2Yuc2V0VGV4dCgiUHJvcGVydHkgb2Y6XG4iICsgbmFtZSArICJcbiIgKyBlbWFpbCk7CisgICAgICAgICAgICBtUHJvcGVydHlPZi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1IYXNTdGF0dXMyKSByZXR1cm47CisKKyAgICAgICAgaWYgKG1JbnN0cnVjdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gaW5zdHJ1Y3Rpb25zIG9ubHkKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQobUluc3RydWN0aW9ucyk7CisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobUluc3RydWN0aW9ucykpIHsKKyAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcygKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2xvY2ssIDAsIDAsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgfSBlbHNlIGlmIChtU2hvd2luZ0JhdHRlcnlJbmZvICYmIG1OZXh0QWxhcm0gPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gYmF0dGVyeSBvbmx5CisgICAgICAgICAgICBpZiAobVBsdWdnZWRJbikgeworICAgICAgICAgICAgICBpZiAobUJhdHRlcnlMZXZlbCA+PSAxMDApIHsKKyAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9jaGFyZ2VkKSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9wbHVnZ2VkX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtQmF0dGVyeUxldmVsKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmxvY2tzY3JlZW5fbG93X2JhdHRlcnkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9jaGFyZ2luZywgMCwKKyAgICAgICAgICAgICAgICAgICAgMCwgMCk7CisKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworCisgICAgICAgIH0gZWxzZSBpZiAobU5leHRBbGFybSAhPSBudWxsICYmICFtU2hvd2luZ0JhdHRlcnlJbmZvKSB7CisgICAgICAgICAgICAvLyBhbGFybSBvbmx5CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1OZXh0QWxhcm0pOworICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2FsYXJtLCAwLAorICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKworICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSBpZiAobU5leHRBbGFybSAhPSBudWxsICYmIG1TaG93aW5nQmF0dGVyeUluZm8pIHsKKyAgICAgICAgICAgIC8vIGJvdGggYmF0dGVyeSBhbmQgbmV4dCBhbGFybQorICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChtTmV4dEFsYXJtKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFRleHQoZ2V0Q29udGV4dCgpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0LAorICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbigxMDAsIG1CYXR0ZXJ5TGV2ZWwpKSk7CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfYWxhcm0sIDAsCisgICAgICAgICAgICAgICAgICAgIDAsIDApOworICAgICAgICAgICAgaWYgKG1QbHVnZ2VkSW4pIHsKKyAgICAgICAgICAgICAgICBtU3RhdHVzMi5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfY2hhcmdpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN0YXR1czIuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKDAsIDAsIDAsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBub3RoaW5nIHNwZWNpZmljIHRvIHNob3c7IHNob3cgZ2VuZXJhbCBpbnN0cnVjdGlvbnMKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXR0ZXJuX2luc3RydWN0aW9ucyk7CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfbG9jaywgMCwKKyAgICAgICAgICAgICAgICAgICAgMCwgMCk7CisKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIE9yaWdpbmF0ZWQgZnJvbSBMb2NrU2NyZWVuICoqLworICAgIC8vIFRPRE8gTWVyZ2Ugd2l0aCBmdW5jdGlvbiBhYm92ZQorICAgIHZvaWQgdXBkYXRlU3RhdHVzTGluZXMoYm9vbGVhbiBzaG93U3RhdHVzTGluZXMsIFN0cmluZyBjaGFyZ2luZywgRHJhd2FibGUgY2hhcmdpbmdJY29uLAorICAgICAgICAgICAgRHJhd2FibGUgYWxhcm1JY29uKSB7CisgICAgICAgIGlmICghc2hvd1N0YXR1c0xpbmVzIHx8IChjaGFyZ2luZyA9PSBudWxsICYmIG1OZXh0QWxhcm0gPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSBpZiAoY2hhcmdpbmcgIT0gbnVsbCAmJiBtTmV4dEFsYXJtID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGNoYXJnaW5nIG9ubHkKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KGNoYXJnaW5nKTsKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhjaGFyZ2luZ0ljb24sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICB9IGVsc2UgaWYgKG1OZXh0QWxhcm0gIT0gbnVsbCAmJiBjaGFyZ2luZyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBuZXh0IGFsYXJtIG9ubHkKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1OZXh0QWxhcm0pOworICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKGFsYXJtSWNvbiwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0gZWxzZSBpZiAoY2hhcmdpbmcgIT0gbnVsbCAmJiBtTmV4dEFsYXJtICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGJvdGggY2hhcmdpbmcgYW5kIG5leHQgYWxhcm0KKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKworICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChjaGFyZ2luZyk7CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoY2hhcmdpbmdJY29uLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFRleHQobU5leHRBbGFybSk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoYWxhcm1JY29uLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcmVmcmVzaFRpbWVBbmREYXRlRGlzcGxheSgpIHsKKyAgICAgICAgaWYgKG1IYXNEYXRlKSB7CisgICAgICAgICAgICBtRGF0ZS5zZXRUZXh0KERhdGVGb3JtYXQuZm9ybWF0KG1EYXRlRm9ybWF0U3RyaW5nLCBuZXcgRGF0ZSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3ByZWxvYWRlZC1jbGFzc2VzIGIvcHJlbG9hZGVkLWNsYXNzZXMKaW5kZXggMWQ1ZmJjMDguLjMzMTcyODYgMTAwNjQ0Ci0tLSBhL3ByZWxvYWRlZC1jbGFzc2VzCisrKyBiL3ByZWxvYWRlZC1jbGFzc2VzCkBAIC0xMzgsNyArMTM4LDYgQEAKIGFuZHJvaWQuZGF0YWJhc2UuTWF0cml4Q3Vyc29yCiBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDbG9zYWJsZQogYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ29tcGlsZWRTcWwKLWFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNvbnRlbnRIZWxwZXIKIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUN1cnNvcgogYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UKIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURlYnVnCkBAIC01NjMsOCArNTYyLDYgQEAKIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3CiBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXIKIGFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3Ci1hbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldyREcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyCi1hbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldyREcm9wRG93bkxpc3RWaWV3CiBhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlcgogYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcgogYW5kcm9pZC53aWRnZXQuQ2hlY2tCb3gKQEAgLTU4Miw2ICs1NzksNyBAQAogYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3CiBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXckU2NhbGVUeXBlCiBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQKK2FuZHJvaWQud2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdwogYW5kcm9pZC53aWRnZXQuTGlzdFZpZXcKIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3JFNhdmVkU3RhdGUKIGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlcgpAQCAtNjg1LDcgKzY4Myw2IEBACiBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIKIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51SXRlbUltcGwKIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5TdWJNZW51QnVpbGRlcgotY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkNvbnRhY3RIZWFkZXJXaWRnZXQKIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5EaWFsb2dUaXRsZQogY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkVkaXRhYmxlSW5wdXRDb25uZWN0aW9uCiBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTGluZWFyTGF5b3V0V2l0aERlZmF1bHRUb3VjaFJlY2VwaWVudApAQCAtNzI3LDcgKzcyNCw2IEBACiBqYXZhLmlvLkZpbGUKIGphdmEuaW8uRmlsZURlc2NyaXB0b3IKIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtCi1qYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSRSZXBvc2l0aW9uaW5nTG9jawogamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24KIGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbQogamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbQpAQCAtMTEzMSw3ICsxMTI3LDYgQEAKIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uRmlsZUNoYW5uZWxGYWN0b3J5CiBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkRpcmVjdEJ1ZmZlcgogb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5GaWxlQ2hhbm5lbEltcGwKLW9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRmlsZUNoYW5uZWxJbXBsJFJlcG9zaXRpb25pbmdMb2NrCiBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkZpbGVMb2NrSW1wbAogb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5Mb2NrTWFuYWdlcgogb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5Mb2NrTWFuYWdlciQxCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZS5jcHAKaW5kZXggNDI1Y2EzMS4uNjVkOWVmNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeU1hbmFnZXJCYXNlLmNwcApAQCAtMTAxNyw4ICsxMDE3LDggQEAKICNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAogICAgIFRocmVhZChmYWxzZSksCiAjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotICAgIG1QaG9uZVN0YXRlKEF1ZGlvU3lzdGVtOjpNT0RFX05PUk1BTCksIG1SaW5nZXJNb2RlKDApLCBtTXVzaWNTdG9wVGltZSgwKSwKLSAgICBtTGltaXRSaW5ndG9uZVZvbHVtZShmYWxzZSksIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKDApLCBtVG90YWxFZmZlY3RzTWVtb3J5KDApCisgICAgbVBob25lU3RhdGUoQXVkaW9TeXN0ZW06Ok1PREVfTk9STUFMKSwgbVJpbmdlck1vZGUoMCksIG1NdXNpY1N0b3BUaW1lKDApLCBtTGltaXRSaW5ndG9uZVZvbHVtZShmYWxzZSksCisgICAgbUxhc3RWb2ljZVZvbHVtZSgtMS4wZiksIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKDApLCBtVG90YWxFZmZlY3RzTWVtb3J5KDApCiB7CiAgICAgbXBDbGllbnRJbnRlcmZhY2UgPSBjbGllbnRJbnRlcmZhY2U7CiAKQEAgLTE4MzUsMjkgKzE4MzUsMzggQEAKICAgICB9CiAKICAgICBmbG9hdCB2b2x1bWUgPSBjb21wdXRlVm9sdW1lKHN0cmVhbSwgaW5kZXgsIG91dHB1dCwgZGV2aWNlKTsKLSAgICAvLyBkbyBub3Qgc2V0IHZvbHVtZSBpZiB0aGUgZmxvYXQgdmFsdWUgZGlkIG5vdCBjaGFuZ2UKLSAgICBpZiAodm9sdW1lICE9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1DdXJWb2x1bWVbc3RyZWFtXSB8fCBmb3JjZSkgeworICAgIC8vIFdlIGFjdHVhbGx5IGNoYW5nZSB0aGUgdm9sdW1lIGlmOgorICAgIC8vIC0gdGhlIGZsb2F0IHZhbHVlIHJldHVybmVkIGJ5IGNvbXB1dGVWb2x1bWUoKSBjaGFuZ2VkCisgICAgLy8gLSB0aGUgZm9yY2UgZmxhZyBpcyBzZXQKKyAgICBpZiAodm9sdW1lICE9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1DdXJWb2x1bWVbc3RyZWFtXSB8fAorICAgICAgICAgICAgZm9yY2UpIHsKICAgICAgICAgbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bUN1clZvbHVtZVtzdHJlYW1dID0gdm9sdW1lOwogICAgICAgICBMT0dWKCJzZXRTdHJlYW1Wb2x1bWUoKSBmb3Igb3V0cHV0ICVkIHN0cmVhbSAlZCwgdm9sdW1lICVmLCBkZWxheSAlZCIsIG91dHB1dCwgc3RyZWFtLCB2b2x1bWUsIGRlbGF5TXMpOwogICAgICAgICBpZiAoc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpWT0lDRV9DQUxMIHx8CiAgICAgICAgICAgICBzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OkRUTUYgfHwKICAgICAgICAgICAgIHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6QkxVRVRPT1RIX1NDTykgewotICAgICAgICAgICAgZmxvYXQgdm9pY2VWb2x1bWUgPSAtMS4wOwogICAgICAgICAgICAgLy8gb2Zmc2V0IHZhbHVlIHRvIHJlZmxlY3QgYWN0dWFsIGhhcmR3YXJlIHZvbHVtZSB0aGF0IG5ldmVyIHJlYWNoZXMgMAogICAgICAgICAgICAgLy8gMSUgY29ycmVzcG9uZHMgcm91Z2hseSB0byBmaXJzdCBzdGVwIGluIFZPSUNFX0NBTEwgc3RyZWFtIHZvbHVtZSBzZXR0aW5nIChzZWUgQXVkaW9TZXJ2aWNlLmphdmEpCiAgICAgICAgICAgICB2b2x1bWUgPSAwLjAxICsgMC45OSAqIHZvbHVtZTsKLSAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEwpIHsKLSAgICAgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IChmbG9hdClpbmRleC8oZmxvYXQpbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXg7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6QkxVRVRPT1RIX1NDTykgewotICAgICAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gMS4wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZvaWNlVm9sdW1lID49IDAgJiYgb3V0cHV0ID09IG1IYXJkd2FyZU91dHB1dCkgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRWb2ljZVZvbHVtZSh2b2ljZVZvbHVtZSwgZGVsYXlNcyk7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZSgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKXN0cmVhbSwgdm9sdW1lLCBvdXRwdXQsIGRlbGF5TXMpOwogICAgIH0KIAorICAgIGlmIChzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEwgfHwKKyAgICAgICAgc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpCTFVFVE9PVEhfU0NPKSB7CisgICAgICAgIGZsb2F0IHZvaWNlVm9sdW1lOworICAgICAgICAvLyBGb3JjZSB2b2ljZSB2b2x1bWUgdG8gbWF4IGZvciBibHVldG9vdGggU0NPIGFzIHZvbHVtZSBpcyBtYW5hZ2VkIGJ5IHRoZSBoZWFkc2V0CisgICAgICAgIGlmIChzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEwpIHsKKyAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gKGZsb2F0KWluZGV4LyhmbG9hdCltU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1heDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gMS4wOworICAgICAgICB9CisgICAgICAgIGlmICh2b2ljZVZvbHVtZSAhPSBtTGFzdFZvaWNlVm9sdW1lICYmIG91dHB1dCA9PSBtSGFyZHdhcmVPdXRwdXQpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRWb2ljZVZvbHVtZSh2b2ljZVZvbHVtZSwgZGVsYXlNcyk7CisgICAgICAgICAgICBtTGFzdFZvaWNlVm9sdW1lID0gdm9pY2VWb2x1bWU7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZVN0dWIuY3BwCmluZGV4IGIzZTBlZTYuLjA3YjVhMzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmNwcApAQCAtMTAxLDkgKzEwMSw5IEBACiAgICAgbUZha2VDYW1lcmEgPSAwOyAvLyBwYXJhbm9pYQogfQogCi1zcDxJTWVtb3J5SGVhcD4gQ2FtZXJhSGFyZHdhcmVTdHViOjpnZXRQcmV2aWV3SGVhcCgpIGNvbnN0CitzdGF0dXNfdCBDYW1lcmFIYXJkd2FyZVN0dWI6OnNldFByZXZpZXdXaW5kb3coY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4mIGJ1ZikKIHsKLSAgICByZXR1cm4gbVByZXZpZXdIZWFwOworICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3A8SU1lbW9yeUhlYXA+IENhbWVyYUhhcmR3YXJlU3R1Yjo6Z2V0UmF3SGVhcCgpIGNvbnN0CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZVN0dWIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5oCmluZGV4IGQzNDI3YmEuLjliNjZhNzYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5oCkBAIC0yOSw3ICsyOSw3IEBACiAKIGNsYXNzIENhbWVyYUhhcmR3YXJlU3R1YiA6IHB1YmxpYyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gZ2V0UHJldmlld0hlYXAoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZXZpZXdXaW5kb3coY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4mIGJ1Zik7CiAgICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gZ2V0UmF3SGVhcCgpIGNvbnN0OwogCiAgICAgdmlydHVhbCB2b2lkICAgICAgICBzZXRDYWxsYmFja3Mobm90aWZ5X2NhbGxiYWNrIG5vdGlmeV9jYiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggZWEyYzVkNC4uYzZhOTkwOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTMzNiwxNiArMzM2LDkgQEAKICAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJDbGllbnQ6On5DbGllbnQgRSAocGlkICVkLCB0aGlzICVwKSIsIGNhbGxpbmdQaWQsIHRoaXMpOwogCi0gICAgaWYgKG1TdXJmYWNlICE9IDAgJiYgIW1Vc2VPdmVybGF5KSB7Ci0gICAgICAgIHB0aHJlYWRfdCB0aHI7Ci0gICAgICAgIC8vIFdlIHVucmVnaXN0ZXIgdGhlIGJ1ZmZlcnMgaW4gYSBkaWZmZXJlbnQgdGhyZWFkIGJlY2F1c2UgYmluZGVyIGRvZXMKLSAgICAgICAgLy8gbm90IGxldCB1cyBtYWtlIHN5Y2hyb25vdXMgdHJhbnNhY3Rpb25zIGluIGEgYmluZGVyIGRlc3RydWN0b3IgKHRoYXQKLSAgICAgICAgLy8gaXMsIHVwb24gb3VyIHJlYWNoaW5nIGEgcmVmY291bnQgb2YgemVyby4pCi0gICAgICAgIHB0aHJlYWRfY3JlYXRlKCZ0aHIsCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyBhdHRyCi0gICAgICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfc3VyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2UuZ2V0KCkpOwotICAgICAgICBwdGhyZWFkX2pvaW4odGhyLCBOVUxMKTsKKyAgICAvLyBDbGVhbiB1cCB0aGUgQU5hdGl2ZVdpbmRvdworICAgIGlmIChtU3VyZmFjZSAhPSAwKSB7CisgICAgICAgIHNldFByZXZpZXdEaXNwbGF5KDApOwogICAgIH0KIAogICAgIC8vIHNldCBtQ2xpZW50UGlkIHRvIGxldCBkaXNjb25uZXQoKSB0ZWFyIGRvd24gdGhlIGhhcmR3YXJlCkBAIC00NjUsNiArNDU4LDExIEBACiAgICAgaWYgKG1Vc2VPdmVybGF5KSB7CiAgICAgICAgIG1PdmVybGF5UmVmID0gMDsKICAgICB9CisgICAgLy8gUmVsZWFzZSB0aGUgaGVsZCBBTmF0aXZlV2luZG93IHJlc291cmNlcy4KKyAgICBpZiAobVByZXZpZXdXaW5kb3cgIT0gMCkgeworICAgICAgICBtUHJldmlld1dpbmRvdyA9IDA7CisgICAgICAgIG1IYXJkd2FyZS0+c2V0UHJldmlld1dpbmRvdyhtUHJldmlld1dpbmRvdyk7CisgICAgfQogICAgIG1IYXJkd2FyZS5jbGVhcigpOwogCiAgICAgbUNhbWVyYVNlcnZpY2UtPnJlbW92ZUNsaWVudChtQ2FtZXJhQ2xpZW50KTsKQEAgLTQ3NSw4ICs0NzMsOCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8vIHNldCB0aGUgSVN1cmZhY2UgdGhhdCB0aGUgcHJldmlldyB3aWxsIHVzZQotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpIHsKKy8vIHNldCB0aGUgU3VyZmFjZSB0aGF0IHRoZSBwcmV2aWV3IHdpbGwgdXNlCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSB7CiAgICAgTE9HMSgic2V0UHJldmlld0Rpc3BsYXkoJXApIChwaWQgJWQpIiwgc3VyZmFjZS5nZXQoKSwgZ2V0Q2FsbGluZ1BpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwpAQCAtNDg2LDcgKzQ4NCw3IEBACiAKICAgICAvLyByZXR1cm4gaWYgbm8gY2hhbmdlIGluIHN1cmZhY2UuCiAgICAgLy8gYXNCaW5kZXIoKSBpcyBzYWZlIG9uIE5VTEwgKHJldHVybnMgTlVMTCkKLSAgICBpZiAoc3VyZmFjZS0+YXNCaW5kZXIoKSA9PSBtU3VyZmFjZS0+YXNCaW5kZXIoKSkgeworICAgIGlmIChnZXRJU3VyZmFjZShzdXJmYWNlKS0+YXNCaW5kZXIoKSA9PSBtU3VyZmFjZS0+YXNCaW5kZXIoKSkgewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtNDk2LDQ0ICs0OTQsMjggQEAKICAgICAgICAgICAgIC8vIEZvcmNlIHRoZSBkZXN0cnVjdGlvbiBvZiBhbnkgcHJldmlvdXMgb3ZlcmxheQogICAgICAgICAgICAgc3A8T3ZlcmxheT4gZHVtbXk7CiAgICAgICAgICAgICBtSGFyZHdhcmUtPnNldE92ZXJsYXkoZHVtbXkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbVN1cmZhY2UgPSBzdXJmYWNlOworICAgIGlmIChzdXJmYWNlICE9IDApIHsKKyAgICAgICAgbVN1cmZhY2UgPSBnZXRJU3VyZmFjZShzdXJmYWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtU3VyZmFjZSA9IDA7CisgICAgfQorICAgIG1QcmV2aWV3V2luZG93ID0gc3VyZmFjZTsKICAgICBtT3ZlcmxheVJlZiA9IDA7CiAgICAgLy8gSWYgcHJldmlldyBoYXMgYmVlbiBhbHJlYWR5IHN0YXJ0ZWQsIHNldCBvdmVybGF5IG9yIHJlZ2lzdGVyIHByZXZpZXcKICAgICAvLyBidWZmZXJzIG5vdy4KICAgICBpZiAobUhhcmR3YXJlLT5wcmV2aWV3RW5hYmxlZCgpKSB7CiAgICAgICAgIGlmIChtVXNlT3ZlcmxheSkgewogICAgICAgICAgICAgcmVzdWx0ID0gc2V0T3ZlcmxheSgpOwotICAgICAgICB9IGVsc2UgaWYgKG1TdXJmYWNlICE9IDApIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlZ2lzdGVyUHJldmlld0J1ZmZlcnMoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtUHJldmlld1dpbmRvdyAhPSAwKSB7CisgICAgICAgICAgICByZXN1bHQgPSBtSGFyZHdhcmUtPnNldFByZXZpZXdXaW5kb3cobVByZXZpZXdXaW5kb3cpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpyZWdpc3RlclByZXZpZXdCdWZmZXJzKCkgewotICAgIGludCB3LCBoOwotICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKG1IYXJkd2FyZS0+Z2V0UGFyYW1ldGVycygpKTsKLSAgICBwYXJhbXMuZ2V0UHJldmlld1NpemUoJncsICZoKTsKLQotICAgIC8vIEZJWE1FOiBkb24ndCB1c2UgYSBoYXJkY29kZWQgZm9ybWF0IGhlcmUuCi0gICAgSVN1cmZhY2U6OkJ1ZmZlckhlYXAgYnVmZmVycyh3LCBoLCB3LCBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3JpZW50YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhcmR3YXJlLT5nZXRQcmV2aWV3SGVhcCgpKTsKLQotICAgIHN0YXR1c190IHJlc3VsdCA9IG1TdXJmYWNlLT5yZWdpc3RlckJ1ZmZlcnMoYnVmZmVycyk7Ci0gICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBMT0dFKCJyZWdpc3RlckJ1ZmZlcnMgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgcmVzdWx0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZXRPdmVybGF5KCkgewogICAgIGludCB3LCBoOwogICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKG1IYXJkd2FyZS0+Z2V0UGFyYW1ldGVycygpKTsKQEAgLTYyNCwxNCArNjA2LDE0IEBACiAKICAgICBzd2l0Y2gobW9kZSkgewogICAgICAgICBjYXNlIENBTUVSQV9QUkVWSUVXX01PREU6Ci0gICAgICAgICAgICBpZiAobVN1cmZhY2UgPT0gMCkgeworICAgICAgICAgICAgaWYgKG1TdXJmYWNlID09IDAgJiYgbVByZXZpZXdXaW5kb3cgPT0gMCkgewogICAgICAgICAgICAgICAgIExPRzEoIm1TdXJmYWNlIGlzIG5vdCBzZXQgeWV0LiIpOwogICAgICAgICAgICAgICAgIC8vIHN0aWxsIGFibGUgdG8gc3RhcnQgcHJldmlldyBpbiB0aGlzIGNhc2UuCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gc3RhcnRQcmV2aWV3TW9kZSgpOwogICAgICAgICBjYXNlIENBTUVSQV9SRUNPUkRJTkdfTU9ERToKLSAgICAgICAgICAgIGlmIChtU3VyZmFjZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgTE9HRSgibVN1cmZhY2UgbXVzdCBiZSBzZXQgYmVmb3JlIHN0YXJ0UmVjb3JkaW5nTW9kZS4iKTsKKyAgICAgICAgICAgIGlmIChtU3VyZmFjZSA9PSAwICYmIG1QcmV2aWV3V2luZG93ID09IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtU3VyZmFjZSBvciBtUHJldmlld1dpbmRvdyBtdXN0IGJlIHNldCBiZWZvcmUgc3RhcnRSZWNvcmRpbmdNb2RlLiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBzdGFydFJlY29yZGluZ01vZGUoKTsKQEAgLTY1NywxNiArNjM5LDEwIEBACiAgICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7CiAgICAgICAgIHJlc3VsdCA9IG1IYXJkd2FyZS0+c3RhcnRQcmV2aWV3KCk7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gWFhYOiBTZXQgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBBTmF0aXZlV2luZG93LgorICAgICAgICBtSGFyZHdhcmUtPnNldFByZXZpZXdXaW5kb3cobVByZXZpZXdXaW5kb3cpOwogICAgICAgICBlbmFibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7CiAgICAgICAgIHJlc3VsdCA9IG1IYXJkd2FyZS0+c3RhcnRQcmV2aWV3KCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIC8vIElmIHByZXZpZXcgZGlzcGxheSBoYXMgYmVlbiBzZXQsIHJlZ2lzdGVyIHByZXZpZXcgYnVmZmVycyBub3cuCi0gICAgICAgIGlmIChtU3VyZmFjZSAhPSAwKSB7Ci0gICAgICAgICAgIC8vIFVucmVnaXN0ZXIgaGVyZSBiZWNhdXNlIHRoZSBzdXJmYWNlIG1heSBiZSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQKLSAgICAgICAgICAgLy8gd2l0aCB0aGUgcmF3IChzbmFwc2hvdCkgaGVhcC4KLSAgICAgICAgICAgbVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7Ci0gICAgICAgICAgIHJlc3VsdCA9IHJlZ2lzdGVyUHJldmlld0J1ZmZlcnMoKTsKLSAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtNzA0LDEzICs2ODAsMTAgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuOwogCisKICAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOwogICAgIG1IYXJkd2FyZS0+c3RvcFByZXZpZXcoKTsKIAotICAgIGlmIChtU3VyZmFjZSAhPSAwICYmICFtVXNlT3ZlcmxheSkgewotICAgICAgICBtU3VyZmFjZS0+dW5yZWdpc3RlckJ1ZmZlcnMoKTsKLSAgICB9Ci0KICAgICBtUHJldmlld0J1ZmZlci5jbGVhcigpOwogfQogCkBAIC05OTgsMTEgKzk3MSw2IEBACiB2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6aGFuZGxlU2h1dHRlcihpbWFnZV9yZWN0X3R5cGUgKnNpemUpIHsKICAgICBtQ2FtZXJhU2VydmljZS0+cGxheVNvdW5kKFNPVU5EX1NIVVRURVIpOwogCi0gICAgLy8gU2NyZWVuIGdvZXMgYmxhY2sgYWZ0ZXIgdGhlIGJ1ZmZlciBpcyB1bnJlZ2lzdGVyZWQuCi0gICAgaWYgKG1TdXJmYWNlICE9IDAgJiYgIW1Vc2VPdmVybGF5KSB7Ci0gICAgICAgIG1TdXJmYWNlLT51bnJlZ2lzdGVyQnVmZmVycygpOwotICAgIH0KLQogICAgIHNwPElDYW1lcmFDbGllbnQ+IGMgPSBtQ2FtZXJhQ2xpZW50OwogICAgIGlmIChjICE9IDApIHsKICAgICAgICAgbUxvY2sudW5sb2NrKCk7CkBAIC0xMDMwLDcgKzk5OCw2IEBACiAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUCwgbU9yaWVudGF0aW9uLCAwLAogICAgICAgICAgICAgbUhhcmR3YXJlLT5nZXRSYXdIZWFwKCkpOwogCi0gICAgICAgIG1TdXJmYWNlLT5yZWdpc3RlckJ1ZmZlcnMoYnVmZmVycyk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKICAgICB9CiAKQEAgLTEwNDMsMTIgKzEwMTAsNiBAQAogICAgIHNpemVfdCBzaXplOwogICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOwogCi0gICAgaWYgKCFtVXNlT3ZlcmxheSkgewotICAgICAgICBpZiAobVN1cmZhY2UgIT0gMCkgewotICAgICAgICAgICAgbVN1cmZhY2UtPnBvc3RCdWZmZXIob2Zmc2V0KTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8vIGxvY2FsIGNvcHkgb2YgdGhlIGNhbGxiYWNrIGZsYWdzCiAgICAgaW50IGZsYWdzID0gbVByZXZpZXdDYWxsYmFja0ZsYWc7CiAKQEAgLTExMDgsMTEgKzEwNjksNiBAQAogICAgIHNpemVfdCBzaXplOwogICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOwogCi0gICAgLy8gUHV0IHRoZSBZVVYgdmVyc2lvbiBvZiB0aGUgc25hcHNob3QgaW4gdGhlIHByZXZpZXcgZGlzcGxheS4KLSAgICBpZiAobVN1cmZhY2UgIT0gMCAmJiAhbVVzZU92ZXJsYXkpIHsKLSAgICAgICAgbVN1cmZhY2UtPnBvc3RCdWZmZXIob2Zmc2V0KTsKLSAgICB9Ci0KICAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjID0gbUNhbWVyYUNsaWVudDsKICAgICBtTG9jay51bmxvY2soKTsKICAgICBpZiAoYyAhPSAwKSB7CkBAIC0xMjcwLDQgKzEyMjYsMTIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3NwPElTdXJmYWNlPiBDYW1lcmFTZXJ2aWNlOjpnZXRJU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgeworICAgIGlmIChzdXJmYWNlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHN1cmZhY2UtPmdldElTdXJmYWNlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHNwPElTdXJmYWNlPigwKTsKKyAgICB9Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKaW5kZXggMGQ2OTgzNi4uN2VkMTkyZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaApAQCAtNzksNiArNzksMTIgQEAKICAgICBzcDxNZWRpYVBsYXllcj4gICAgIG1Tb3VuZFBsYXllcltOVU1fU09VTkRTXTsKICAgICBpbnQgICAgICAgICAgICAgICAgIG1Tb3VuZFJlZjsgIC8vIHJlZmVyZW5jZSBjb3VudCAocmVsZWFzZSBhbGwgTWVkaWFQbGF5ZXIgd2hlbiAwKQogCisgICAgLy8gVXNlZCBieSBDbGllbnQgb2JqZWN0cyB0byBleHRyYWN0IHRoZSBJU3VyZmFjZSBmcm9tIGEgU3VyZmFjZSBvYmplY3QuCisgICAgLy8gVGhpcyBpcyB1c2VkIGJlY2F1c2UgbWFraW5nIENsaWVudCBhIGZyaWVuZCBjbGFzcyBvZiBTdXJmYWNlIHdvdWxkCisgICAgLy8gcmVxdWlyZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgaW4gU3VyZmFjZS5oIHNpbmNlIENsaWVudCBpcyBhIG5lc3RlZAorICAgIC8vIGNsYXNzLgorICAgIHN0YXRpYyBzcDxJU3VyZmFjZT4gZ2V0SVN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOworCiAgICAgY2xhc3MgQ2xpZW50IDogcHVibGljIEJuQ2FtZXJhCiAgICAgewogICAgIHB1YmxpYzoKQEAgLTg3LDcgKzkzLDcgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgY29ubmVjdChjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2xpZW50KTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgbG9jaygpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKGludCBmbGFnKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RhcnRQcmV2aWV3KCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHN0b3BQcmV2aWV3KCk7CkBAIC0xNjksNiArMTc1LDcgQEAKICAgICAgICAgLy8gRW5zdXJlcyBhdG9taWNpdHkgYW1vbmcgdGhlIHB1YmxpYyBtZXRob2RzCiAgICAgICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgICAgIHNwPElTdXJmYWNlPiAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2U7CisgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+ICAgICAgICAgICAgICAgbVByZXZpZXdXaW5kb3c7CiAKICAgICAgICAgLy8gSWYgdGhlIHVzZXIgd2FudCB1cyB0byByZXR1cm4gYSBjb3B5IG9mIHRoZSBwcmV2aWV3IGZyYW1lIChpbnN0ZWFkCiAgICAgICAgIC8vIG9mIHRoZSBvcmlnaW5hbCBvbmUpLCB3ZSBhbGxvY2F0ZSBtUHJldmlld0J1ZmZlciBhbmQgcmV1c2UgaXQgaWYgcG9zc2libGUuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDg3ZGU3OWEuLjgzY2UzZTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yNjksMTQgKzI2OSwxMCBAQAogICAgICAgICAgICAgfSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkQ2xpZW50KElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBjbGllbnQpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRDbGllbnQoSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGNsaWVudCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNsaWVudC5zZXRFbmFibGVkKG1Jc0VuYWJsZWQpOwotICAgICAgICAgICAgICAgIG1DbGllbnRzLmFkZChjbGllbnQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KExPR19UQUcsICJEZWFkIEFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50OiAiICsgY2xpZW50LCByZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2xpZW50cy5hZGQoY2xpZW50KTsKKyAgICAgICAgICAgIHJldHVybiBtSXNFbmFibGVkOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BcHBXaWRnZXRTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BcHBXaWRnZXRTZXJ2aWNlLmphdmEKaW5kZXggNzMxZmIyMi4uNWVmM2QzNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQXBwV2lkZ2V0U2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FwcFdpZGdldFNlcnZpY2UuamF2YQpAQCAtNDI2LDYgKzQyNiw0MCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgcGFydGlhbGx5VXBkYXRlQXBwV2lkZ2V0SWRzKGludFtdIGFwcFdpZGdldElkcywgUmVtb3RlVmlld3Mgdmlld3MpIHsKKyAgICAgICAgaWYgKGFwcFdpZGdldElkcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFwcFdpZGdldElkcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBOID0gYXBwV2lkZ2V0SWRzLmxlbmd0aDsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1BcHBXaWRnZXRJZHMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBcHBXaWRnZXRJZCBpZCA9IGxvb2t1cEFwcFdpZGdldElkTG9ja2VkKGFwcFdpZGdldElkc1tpXSk7CisgICAgICAgICAgICAgICAgdXBkYXRlQXBwV2lkZ2V0SW5zdGFuY2VMb2NrZWQoaWQsIHZpZXdzLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChpbnRbXSBhcHBXaWRnZXRJZHMsIGludCB2aWV3SWQpIHsKKyAgICAgICAgaWYgKGFwcFdpZGdldElkcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFwcFdpZGdldElkcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBOID0gYXBwV2lkZ2V0SWRzLmxlbmd0aDsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1BcHBXaWRnZXRJZHMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBcHBXaWRnZXRJZCBpZCA9IGxvb2t1cEFwcFdpZGdldElkTG9ja2VkKGFwcFdpZGdldElkc1tpXSk7CisgICAgICAgICAgICAgICAgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkSW5zdGFuY2VMb2NrZWQoaWQsIHZpZXdJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB1cGRhdGVBcHBXaWRnZXRQcm92aWRlcihDb21wb25lbnROYW1lIHByb3ZpZGVyLCBSZW1vdGVWaWV3cyB2aWV3cykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1BcHBXaWRnZXRJZHMpIHsKICAgICAgICAgICAgIFByb3ZpZGVyIHAgPSBsb29rdXBQcm92aWRlckxvY2tlZChwcm92aWRlcik7CkBAIC00NDMsMTEgKzQ3NywxNyBAQAogICAgIH0KIAogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0SW5zdGFuY2VMb2NrZWQoQXBwV2lkZ2V0SWQgaWQsIFJlbW90ZVZpZXdzIHZpZXdzKSB7CisgICAgICAgIHVwZGF0ZUFwcFdpZGdldEluc3RhbmNlTG9ja2VkKGlkLCB2aWV3cywgZmFsc2UpOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0SW5zdGFuY2VMb2NrZWQoQXBwV2lkZ2V0SWQgaWQsIFJlbW90ZVZpZXdzIHZpZXdzLCBib29sZWFuIGlzUGFydGlhbFVwZGF0ZSkgewogICAgICAgICAvLyBhbGxvdyBmb3Igc3RhbGUgYXBwV2lkZ2V0SWRzIGFuZCBvdGhlciBiYWRuZXNzCiAgICAgICAgIC8vIGxvb2t1cCBhbHNvIGNoZWNrcyB0aGF0IHRoZSBjYWxsaW5nIHByb2Nlc3MgY2FuIGFjY2VzcyB0aGUgYXBwV2lkZ2V0SWQKICAgICAgICAgLy8gZHJvcCB1bmJvdW5kIGFwcFdpZGdldElkcyAoc2hvdWxkbid0IGJlIHBvc3NpYmxlIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzKQogICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiBpZC5wcm92aWRlciAhPSBudWxsICYmICFpZC5wcm92aWRlci56b21iaWUgJiYgIWlkLmhvc3Quem9tYmllKSB7Ci0gICAgICAgICAgICBpZC52aWV3cyA9IHZpZXdzOworCisgICAgICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0byBzYXZlIHRoaXMgUmVtb3RlVmlld3MKKyAgICAgICAgICAgIGlmICghaXNQYXJ0aWFsVXBkYXRlKSBpZC52aWV3cyA9IHZpZXdzOwogCiAgICAgICAgICAgICAvLyBpcyBhbnlvbmUgbGlzdGVuaW5nPwogICAgICAgICAgICAgaWYgKGlkLmhvc3QuY2FsbGJhY2tzICE9IG51bGwpIHsKQEAgLTQ2Myw2ICs1MDMsMjUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHZvaWQgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkSW5zdGFuY2VMb2NrZWQoQXBwV2lkZ2V0SWQgaWQsIGludCB2aWV3SWQpIHsKKyAgICAgICAgLy8gYWxsb3cgZm9yIHN0YWxlIGFwcFdpZGdldElkcyBhbmQgb3RoZXIgYmFkbmVzcworICAgICAgICAvLyBsb29rdXAgYWxzbyBjaGVja3MgdGhhdCB0aGUgY2FsbGluZyBwcm9jZXNzIGNhbiBhY2Nlc3MgdGhlIGFwcFdpZGdldElkCisgICAgICAgIC8vIGRyb3AgdW5ib3VuZCBhcHBXaWRnZXRJZHMgKHNob3VsZG4ndCBiZSBwb3NzaWJsZSB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcykKKyAgICAgICAgaWYgKGlkICE9IG51bGwgJiYgaWQucHJvdmlkZXIgIT0gbnVsbCAmJiAhaWQucHJvdmlkZXIuem9tYmllICYmICFpZC5ob3N0LnpvbWJpZSkgeworICAgICAgICAgICAgLy8gaXMgYW55b25lIGxpc3RlbmluZz8KKyAgICAgICAgICAgIGlmIChpZC5ob3N0LmNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxvY2sgaXMgaGVsZCwgYnV0IHRoaXMgaXMgYSBvbmV3YXkgY2FsbAorICAgICAgICAgICAgICAgICAgICBpZC5ob3N0LmNhbGxiYWNrcy52aWV3RGF0YUNoYW5nZWQoaWQuYXBwV2lkZ2V0SWQsIHZpZXdJZCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSXQgZmFpbGVkOyByZW1vdmUgdGhlIGNhbGxiYWNrLiBObyBuZWVkIHRvIHBydW5lIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgLy8gd2Uga25vdyB0aGF0IHRoaXMgaG9zdCBpcyBzdGlsbCByZWZlcmVuY2VkIGJ5IHRoaXMgaW5zdGFuY2UuCisgICAgICAgICAgICAgICAgICAgIGlkLmhvc3QuY2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgaW50W10gc3RhcnRMaXN0ZW5pbmcoSUFwcFdpZGdldEhvc3QgY2FsbGJhY2tzLCBTdHJpbmcgcGFja2FnZU5hbWUsIGludCBob3N0SWQsCiAgICAgICAgICAgICBMaXN0PFJlbW90ZVZpZXdzPiB1cGRhdGVkVmlld3MpIHsKICAgICAgICAgaW50IGNhbGxpbmdVaWQgPSBlbmZvcmNlQ2FsbGluZ1VpZChwYWNrYWdlTmFtZSk7CkBAIC03NDIsNiArODAxLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGluZm8ubGFiZWwgPSBhY3Rpdml0eUluZm8ubG9hZExhYmVsKG1QYWNrYWdlTWFuYWdlcikudG9TdHJpbmcoKTsKICAgICAgICAgICAgIGluZm8uaWNvbiA9IHJpLmdldEljb25SZXNvdXJjZSgpOworICAgICAgICAgICAgaW5mby5wcmV2aWV3SW1hZ2UgPSBzYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgCQljb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BcHBXaWRnZXRQcm92aWRlckluZm9fcHJldmlld0ltYWdlLCAwKTsKKwogICAgICAgICAgICAgc2EucmVjeWNsZSgpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gT2sgdG8gY2F0Y2ggRXhjZXB0aW9uIGhlcmUsIGJlY2F1c2UgYW55dGhpbmcgZ29pbmcgd3JvbmcgYmVjYXVzZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ2xpcGJvYXJkU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ2xpcGJvYXJkU2VydmljZS5qYXZhCmluZGV4IGFhOGNkZWQuLjMwOGM5YzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0NsaXBib2FyZFNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9DbGlwYm9hcmRTZXJ2aWNlLmphdmEKQEAgLTE2LDQyICsxNiw4NCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKIAotaW1wb3J0IGFuZHJvaWQudGV4dC5JQ2xpcGJvYXJkOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGF0YTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JQ2xpcGJvYXJkOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUNhbGxiYWNrTGlzdDsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIAogLyoqCiAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2xpcGJvYXJkIGZvciBjb3B5IGFuZCBwYXN0ZS4KICAqLwogcHVibGljIGNsYXNzIENsaXBib2FyZFNlcnZpY2UgZXh0ZW5kcyBJQ2xpcGJvYXJkLlN0dWIgewotICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1DbGlwYm9hcmQgPSAiIjsKKyAgICBwcml2YXRlIENsaXBEYXRhIG1QcmltYXJ5Q2xpcDsKKyAgICBwcml2YXRlIGZpbmFsIFJlbW90ZUNhbGxiYWNrTGlzdDxJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcj4gbVByaW1hcnlDbGlwTGlzdGVuZXJzCisgICAgICAgICAgICA9IG5ldyBSZW1vdGVDYWxsYmFja0xpc3Q8SU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXI+KCk7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgdGhlIGNsaXBib2FyZC4KICAgICAgKi8KICAgICBwdWJsaWMgQ2xpcGJvYXJkU2VydmljZShDb250ZXh0IGNvbnRleHQpIHsgfQogCi0gICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQotICAgIHB1YmxpYyB2b2lkIHNldENsaXBib2FyZFRleHQoQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5Q2xpcChDbGlwRGF0YSBjbGlwKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRleHQgPSAiIjsKKyAgICAgICAgICAgIGlmIChjbGlwICE9IG51bGwgJiYgY2xpcC5nZXRJdGVtQ291bnQoKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gaXRlbXMiKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QcmltYXJ5Q2xpcCA9IGNsaXA7CisgICAgICAgICAgICBmaW5hbCBpbnQgbiA9IG1QcmltYXJ5Q2xpcExpc3RlbmVycy5iZWdpbkJyb2FkY2FzdCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMuZ2V0QnJvYWRjYXN0SXRlbShpKS5kaXNwYXRjaFByaW1hcnlDbGlwQ2hhbmdlZCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIFJlbW90ZUNhbGxiYWNrTGlzdCB3aWxsIHRha2UgY2FyZSBvZiByZW1vdmluZworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVhZCBvYmplY3QgZm9yIHVzLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QcmltYXJ5Q2xpcExpc3RlbmVycy5maW5pc2hCcm9hZGNhc3QoKTsKKyAgICAgICAgfQorICAgIH0KICAgICAKLSAgICAgICAgICAgIG1DbGlwYm9hcmQgPSB0ZXh0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0Q2xpcGJvYXJkVGV4dCgpIHsKKyAgICBwdWJsaWMgQ2xpcERhdGEgZ2V0UHJpbWFyeUNsaXAoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgcmV0dXJuIG1DbGlwYm9hcmQ7CisgICAgICAgICAgICByZXR1cm4gbVByaW1hcnlDbGlwOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQorICAgIHB1YmxpYyBDbGlwRGVzY3JpcHRpb24gZ2V0UHJpbWFyeUNsaXBEZXNjcmlwdGlvbigpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENsaXBEZXNjcmlwdGlvbihtUHJpbWFyeUNsaXApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzUHJpbWFyeUNsaXAoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1QcmltYXJ5Q2xpcCAhPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMucmVnaXN0ZXIobGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMudW5yZWdpc3RlcihsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDbGlwYm9hcmRUZXh0KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ2xpcGJvYXJkLmxlbmd0aCgpID4gMDsKKyAgICAgICAgICAgIGlmIChtUHJpbWFyeUNsaXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gbVByaW1hcnlDbGlwLmdldEl0ZW0oMCkuZ2V0VGV4dCgpOworICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db25uZWN0aXZpdHlTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db25uZWN0aXZpdHlTZXJ2aWNlLmphdmEKaW5kZXggNGM4MTM4MC4uNmYyMzgwNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ29ubmVjdGl2aXR5U2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Nvbm5lY3Rpdml0eVNlcnZpY2UuamF2YQpAQCAtMjYsMTQgKzI2LDE3IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTW9iaWxlRGF0YVN0YXRlVHJhY2tlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdGVUcmFja2VyOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtVdGlsczsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1V0aWxzOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwpAQCAtNDcsOCArNTAsMTMgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuY29ubmVjdGl2aXR5LlRldGhlcmluZzsKIAogaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwpAQCAtNjcsNyArNzUsNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVRXT1JLX1JFU1RPUkVfREVMQVlfUFJPUF9OQU1FID0KICAgICAgICAgICAgICJhbmRyb2lkLnRlbGVwaG9ueS5hcG4tcmVzdG9yZSI7CiAKLQogICAgIHByaXZhdGUgVGV0aGVyaW5nIG1UZXRoZXJpbmc7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1UZXRoZXJpbmdDb25maWdWYWxpZCA9IGZhbHNlOwogCkBAIC04NCw2ICs5MSw4IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBMaXN0IG1OZXRSZXF1ZXN0ZXJzUGlkc1tdOwogCisgICAgcHJpdmF0ZSBXaWZpV2F0Y2hkb2dTZXJ2aWNlIG1XaWZpV2F0Y2hkb2dTZXJ2aWNlOworCiAgICAgLy8gcHJpb3JpdHkgb3JkZXIgb2YgdGhlIG5ldHRyYWNrZXJzCiAgICAgLy8gKGV4Y2x1ZGluZyBkeW5hbWljYWxseSBzZXQgbU5ldHdvcmtQcmVmZXJlbmNlKQogICAgIC8vIFRPRE8gLSBtb3ZlIG1OZXR3b3JrVHlwZVByZWZlcmVuY2UgaW50byB0aGlzCkBAIC0xMDcsNiArMTE2LDExIEBACiAgICAgcHJpdmF0ZSBib29sZWFuIG1TeXN0ZW1SZWFkeTsKICAgICBwcml2YXRlIEludGVudCBtSW5pdGlhbEJyb2FkY2FzdDsKIAorICAgIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2s7CisgICAgcHJpdmF0ZSBTdHJpbmcgbU5ldFRyYW5zaXRpb25XYWtlTG9ja0NhdXNlZEJ5ID0gIiI7CisgICAgcHJpdmF0ZSBpbnQgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1NlcmlhbE51bWJlcjsKKyAgICBwcml2YXRlIGludCBtTmV0VHJhbnNpdGlvbldha2VMb2NrVGltZW91dDsKKwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5ldHdvcmtBdHRyaWJ1dGVzIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIENsYXNzIGZvciBob2xkaW5nIHNldHRpbmdzIHJlYWQgZnJvbSByZXNvdXJjZXMuCkBAIC0xOTcsNiArMjExLDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisKKyAgICAgICAgUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlciA9IChQb3dlck1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOworICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrID0gcG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgVEFHKTsKKyAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1RpbWVvdXQgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaW50ZWdlci5jb25maWdfbmV0d29ya1RyYW5zaXRpb25UaW1lb3V0KTsKKwogICAgICAgICBtTmV0VHJhY2tlcnMgPSBuZXcgTmV0d29ya1N0YXRlVHJhY2tlclsKICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLk1BWF9ORVRXT1JLX1RZUEUrMV07CiAgICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcigpOwpAQCAtMjk2LDE4ICszMTYsMjEgQEAKICAgICAgICAgICAgIHN3aXRjaCAobU5ldEF0dHJpYnV0ZXNbbmV0VHlwZV0ubVJhZGlvKSB7CiAgICAgICAgICAgICBjYXNlIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJOgogICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cudihUQUcsICJTdGFydGluZyBXaWZpIFNlcnZpY2UuIik7Ci0gICAgICAgICAgICAgICAgV2lmaVN0YXRlVHJhY2tlciB3c3QgPSBuZXcgV2lmaVN0YXRlVHJhY2tlcihjb250ZXh0LCBtSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgV2lmaVNlcnZpY2Ugd2lmaVNlcnZpY2UgPSBuZXcgV2lmaVNlcnZpY2UoY29udGV4dCwgd3N0KTsKKyAgICAgICAgICAgICAgICBXaWZpU3RhdGVUcmFja2VyIHdzdCA9IG5ldyBXaWZpU3RhdGVUcmFja2VyKCk7CisgICAgICAgICAgICAgICAgV2lmaVNlcnZpY2Ugd2lmaVNlcnZpY2UgPSBuZXcgV2lmaVNlcnZpY2UoY29udGV4dCk7CiAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZShDb250ZXh0LldJRklfU0VSVklDRSwgd2lmaVNlcnZpY2UpOwotICAgICAgICAgICAgICAgIHdpZmlTZXJ2aWNlLnN0YXJ0V2lmaSgpOworICAgICAgICAgICAgICAgIHdpZmlTZXJ2aWNlLmNoZWNrQW5kU3RhcnRXaWZpKCk7CiAgICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW0Nvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJXSA9IHdzdDsKLSAgICAgICAgICAgICAgICB3c3Quc3RhcnRNb25pdG9yaW5nKCk7CisgICAgICAgICAgICAgICAgd3N0LnN0YXJ0TW9uaXRvcmluZyhjb250ZXh0LCBtSGFuZGxlcik7CisKKyAgICAgICAgICAgICAgICAvL1RPRE86IGFzIHBhcnQgb2YgV1dTIHJlZmFjdG9yLCBjcmVhdGUgb25seSB3aGVuIG5lZWRlZAorICAgICAgICAgICAgICAgIG1XaWZpV2F0Y2hkb2dTZXJ2aWNlID0gbmV3IFdpZmlXYXRjaGRvZ1NlcnZpY2UoY29udGV4dCk7CiAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRToKLSAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbbmV0VHlwZV0gPSBuZXcgTW9iaWxlRGF0YVN0YXRlVHJhY2tlcihjb250ZXh0LCBtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgbmV0VHlwZSwgbU5ldEF0dHJpYnV0ZXNbbmV0VHlwZV0ubU5hbWUpOwotICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXS5zdGFydE1vbml0b3JpbmcoKTsKKyAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbbmV0VHlwZV0gPSBuZXcgTW9iaWxlRGF0YVN0YXRlVHJhY2tlcihuZXRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5ldEF0dHJpYnV0ZXNbbmV0VHlwZV0ubU5hbWUpOworICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXS5zdGFydE1vbml0b3JpbmcoY29udGV4dCwgbUhhbmRsZXIpOwogICAgICAgICAgICAgICAgIGlmIChub01vYmlsZURhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgInRlYXJpbmcgZG93biBNb2JpbGUgbmV0d29ya3MgZHVlIHRvIHNldHRpbmciKTsKICAgICAgICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLnRlYXJkb3duKCk7CkBAIC0zMjQsNyArMzQ3LDggQEAKICAgICAgICAgbVRldGhlcmluZ0NvbmZpZ1ZhbGlkID0gKCgobU5ldFRyYWNrZXJzW0Nvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEVfRFVOXSAhPSBudWxsKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtVGV0aGVyaW5nLmlzRHVuUmVxdWlyZWQoKSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVGV0aGVyaW5nLmdldFRldGhlcmFibGVVc2JSZWdleHMoKS5sZW5ndGggIT0gMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXRoZXJpbmcuZ2V0VGV0aGVyYWJsZVdpZmlSZWdleHMoKS5sZW5ndGggIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV0aGVyaW5nLmdldFRldGhlcmFibGVXaWZpUmVnZXhzKCkubGVuZ3RoICE9IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV0aGVyaW5nLmdldFRldGhlcmFibGVCbHVldG9vdGhSZWdleHMoKS5sZW5ndGggIT0gMCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXRoZXJpbmcuZ2V0VXBzdHJlYW1JZmFjZVJlZ2V4cygpLmxlbmd0aCAhPSAwKTsKIAogICAgIH0KQEAgLTYwMCwxNSArNjI0LDcgQEAKICAgICAgICAgICAgICAgICBuZXR3b3JrLnJlY29ubmVjdCgpOwogICAgICAgICAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fUkVRVUVTVF9TVEFSVEVEOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotICAgICAgICAgICAgICAgICAgICBtRmVhdHVyZVVzZXJzLmFkZChmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX1JFU1RPUkVfREVGQVVMVF9ORVRXT1JLLAotICAgICAgICAgICAgICAgICAgICAgICAgZiksIGdldFJlc3RvcmVEZWZhdWx0TmV0d29ya0RlbGF5KCkpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldHdvcmsuc3RhcnRVc2luZ05ldHdvcmtGZWF0dXJlKGZlYXR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRDYWxsaW5nUGlkKCksIGdldENhbGxpbmdVaWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fVFlQRV9OT1RfQVZBSUxBQkxFOwpAQCAtNzI3LDggKzc0Myw3IEBACiAgICAgICAgICAgICB0cmFja2VyLnRlYXJkb3duKCk7CiAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGRvIGl0IHRoZSBvbGQgZmFzaGlvbmVkIHdheQotICAgICAgICAgICAgcmV0dXJuIHRyYWNrZXIuc3RvcFVzaW5nTmV0d29ya0ZlYXR1cmUoZmVhdHVyZSwgcGlkLCB1aWQpOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgfQogCkBAIC03NzcsMTEgKzc5MiwzNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0KICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGhvc3RBZGRyZXNzKTsKLSAgICAgICAgICAgIHJldHVybiB0cmFja2VyLnJlcXVlc3RSb3V0ZVRvSG9zdChpbmV0QWRkcmVzcyk7Ci0gICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzIGFkZHIgPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaG9zdEFkZHJlc3MpOworICAgICAgICAgICAgcmV0dXJuIGFkZEhvc3RSb3V0ZSh0cmFja2VyLCBhZGRyKTsKKyAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkge30KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZSB0aGF0IGEgbmV0d29yayByb3V0ZSBleGlzdHMgdG8gZGVsaXZlciB0cmFmZmljIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBob3N0IHZpYSB0aGUgbW9iaWxlIGRhdGEgbmV0d29yay4KKyAgICAgKiBAcGFyYW0gaG9zdEFkZHJlc3MgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHJvdXRlIGlzIGRlc2lyZWQsCisgICAgICogaW4gbmV0d29yayBieXRlIG9yZGVyLgorICAgICAqIFRPRE8gLSBkZXByZWNhdGUKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBvbiBzdWNjZXNzLCB7QGNvZGUgZmFsc2V9IG9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gYWRkSG9zdFJvdXRlKE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQsIEluZXRBZGRyZXNzIGhvc3RBZGRyZXNzKSB7CisgICAgICAgIGlmIChudC5nZXROZXR3b3JrSW5mbygpLmdldFR5cGUoKSA9PSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgTGlua1Byb3BlcnRpZXMgcCA9IG50LmdldExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgIGlmIChwID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSBwLmdldEludGVyZmFjZU5hbWUoKTsKKworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiUmVxdWVzdGVkIGhvc3Qgcm91dGUgdG8gIiArIGhvc3RBZGRyZXNzICsgIigiICsgaW50ZXJmYWNlTmFtZSArICIpIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGludGVyZmFjZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIE5ldHdvcmtVdGlscy5hZGRIb3N0Um91dGUoaW50ZXJmYWNlTmFtZSwgaG9zdEFkZHJlc3MsIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKERCRykgU2xvZy5lKFRBRywgImFkZEhvc3RSb3V0ZSBmYWlsZWQgZHVlIHRvIG51bGwgaW50ZXJmYWNlIG5hbWUiKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTg5MCw2ICs5MzEsMTIgQEAKICAgICAgICAgICAgICAgICAiQ29ubmVjdGl2aXR5U2VydmljZSIpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBlbmZvcmNlQ29ubmVjdGl2aXR5SW50ZXJuYWxQZXJtaXNzaW9uKCkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNPTk5FQ1RJVklUWV9JTlRFUk5BTCwKKyAgICAgICAgICAgICAgICAiQ29ubmVjdGl2aXR5U2VydmljZSIpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEhhbmRsZSBhIHtAY29kZSBESVNDT05ORUNURUR9IGV2ZW50LiBJZiB0aGlzIHBlcnRhaW5zIHRvIHRoZSBub24tYWN0aXZlCiAgICAgICogbmV0d29yaywgd2UgaWdub3JlIGl0LiBJZiBpdCBpcyBmb3IgdGhlIGFjdGl2ZSBuZXR3b3JrLCB3ZSBzZW5kIG91dCBhCkBAIC0xMTU5LDQ0ICsxMjA2LDMwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiTmV0d29yayBkZWNsaW5lZCB0ZWFyZG93biByZXF1ZXN0Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmFpbG92ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyTmV0LnJlbGVhc2VXYWtlTG9jaygpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3luY2hyb25pemVkIChDb25uZWN0aXZpdHlTZXJ2aWNlLnRoaXMpIHsKKyAgICAgICAgICAgICAgICAvLyBoYXZlIGEgbmV3IGRlZmF1bHQgbmV0d29yaywgcmVsZWFzZSB0aGUgdHJhbnNpdGlvbiB3YWtlbG9jayBpbiBhIHNlY29uZAorICAgICAgICAgICAgICAgIC8vIGlmIGl0J3MgaGVsZC4gIFRoZSBzZWNvbmQgcGF1c2UgaXMgdG8gYWxsb3cgYXBwcyB0byByZWNvbm5lY3Qgb3ZlciB0aGUKKyAgICAgICAgICAgICAgICAvLyBuZXcgbmV0d29yaworICAgICAgICAgICAgICAgIGlmIChtTmV0VHJhbnNpdGlvbldha2VMb2NrLmlzSGVsZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfQ0xFQVJfTkVUX1RSQU5TSVRJT05fV0FLRUxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1NlcmlhbE51bWJlciwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUFjdGl2ZURlZmF1bHROZXR3b3JrID0gdHlwZTsKICAgICAgICAgfQogICAgICAgICB0aGlzTmV0LnNldFRlYXJkb3duUmVxdWVzdGVkKGZhbHNlKTsKLSAgICAgICAgdGhpc05ldC51cGRhdGVOZXR3b3JrU2V0dGluZ3MoKTsKKyAgICAgICAgdXBkYXRlTmV0d29ya1NldHRpbmdzKHRoaXNOZXQpOwogICAgICAgICBoYW5kbGVDb25uZWN0aXZpdHlDaGFuZ2UodHlwZSk7CiAgICAgICAgIHNlbmRDb25uZWN0ZWRCcm9hZGNhc3QoaW5mbyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNjYW5SZXN1bHRzQXZhaWxhYmxlKE5ldHdvcmtJbmZvIGluZm8pIHsKLSAgICAgICAgaW50IG5ldHdvcmtUeXBlID0gaW5mby5nZXRUeXBlKCk7Ci0gICAgICAgIGlmIChuZXR3b3JrVHlwZSAhPSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSkgewotICAgICAgICAgICAgaWYgKERCRykgU2xvZy52KFRBRywgIkdvdCBTY2FuUmVzdWx0c0F2YWlsYWJsZSBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgIGluZm8uZ2V0VHlwZU5hbWUoKSArICIgbmV0d29yay4gRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbU5ldFRyYWNrZXJzW25ldHdvcmtUeXBlXS5pbnRlcnByZXRTY2FuUmVzdWx0c0F2YWlsYWJsZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25DaGFuZ2UoYm9vbGVhbiB2aXNpYmxlLCBpbnQgaWQsCi0gICAgICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0gICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIgbm90aWZpY2F0aW9uTWFuYWdlciA9IChOb3RpZmljYXRpb25NYW5hZ2VyKSBtQ29udGV4dAotICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTk9USUZJQ0FUSU9OX1NFUlZJQ0UpOwotCi0gICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICBub3RpZmljYXRpb25NYW5hZ2VyLm5vdGlmeShpZCwgbm90aWZpY2F0aW9uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5vdGlmaWNhdGlvbk1hbmFnZXIuY2FuY2VsKGlkKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgotICAgICAqIEFmdGVyIGEgY2hhbmdlIGluIHRoZSBjb25uZWN0aXZpdHkgc3RhdGUgb2YgYW55IG5ldHdvcmssIFdlJ3JlIG1haW5seQotICAgICAqIGNvbmNlcm5lZCB3aXRoIG1ha2luZyBzdXJlIHRoYXQgdGhlIGxpc3Qgb2YgRE5TIHNlcnZlcnMgaXMgc2V0dXB1cAorICAgICAqIEFmdGVyIGEgY2hhbmdlIGluIHRoZSBjb25uZWN0aXZpdHkgc3RhdGUgb2YgYSBuZXR3b3JrLiBXZSdyZSBtYWlubHkKKyAgICAgKiBjb25jZXJuZWQgd2l0aCBtYWtpbmcgc3VyZSB0aGF0IHRoZSBsaXN0IG9mIEROUyBzZXJ2ZXJzIGlzIHNldCB1cAogICAgICAqIGFjY29yZGluZyB0byB3aGljaCBuZXR3b3JrcyBhcmUgY29ubmVjdGVkLCBhbmQgZW5zdXJpbmcgdGhhdCB0aGUKICAgICAgKiByaWdodCByb3V0aW5nIHRhYmxlIGVudHJpZXMgZXhpc3QuCiAgICAgICovCkBAIC0xMjA5LDE5ICsxMjQyLDE1OCBAQAogCiAgICAgICAgIGlmIChtTmV0VHJhY2tlcnNbbmV0VHlwZV0uZ2V0TmV0d29ya0luZm8oKS5pc0Nvbm5lY3RlZCgpKSB7CiAgICAgICAgICAgICBpZiAobU5ldEF0dHJpYnV0ZXNbbmV0VHlwZV0uaXNEZWZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbbmV0VHlwZV0uYWRkRGVmYXVsdFJvdXRlKCk7CisgICAgICAgICAgICAgICAgYWRkRGVmYXVsdFJvdXRlKG1OZXRUcmFja2Vyc1tuZXRUeXBlXSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXS5hZGRQcml2YXRlRG5zUm91dGVzKCk7CisgICAgICAgICAgICAgICAgYWRkUHJpdmF0ZURuc1JvdXRlcyhtTmV0VHJhY2tlcnNbbmV0VHlwZV0pOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKG1OZXRBdHRyaWJ1dGVzW25ldFR5cGVdLmlzRGVmYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLnJlbW92ZURlZmF1bHRSb3V0ZSgpOworICAgICAgICAgICAgICAgIHJlbW92ZURlZmF1bHRSb3V0ZShtTmV0VHJhY2tlcnNbbmV0VHlwZV0pOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbbmV0VHlwZV0ucmVtb3ZlUHJpdmF0ZURuc1JvdXRlcygpOworICAgICAgICAgICAgICAgIHJlbW92ZVByaXZhdGVEbnNSb3V0ZXMobU5ldFRyYWNrZXJzW25ldFR5cGVdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBhZGRQcml2YXRlRG5zUm91dGVzKE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQpIHsKKyAgICAgICAgYm9vbGVhbiBwcml2YXRlRG5zUm91dGVTZXQgPSBudC5pc1ByaXZhdGVEbnNSb3V0ZVNldCgpOworICAgICAgICBMaW5rUHJvcGVydGllcyBwID0gbnQuZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHAuZ2V0SW50ZXJmYWNlTmFtZSgpOworCisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJhZGRQcml2YXRlRG5zUm91dGVzIGZvciAiICsgbnQgKworICAgICAgICAgICAgICAgICAgICAiKCIgKyBpbnRlcmZhY2VOYW1lICsgIikgLSBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gIiArIHByaXZhdGVEbnNSb3V0ZVNldCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGludGVyZmFjZU5hbWUgIT0gbnVsbCAmJiAhcHJpdmF0ZURuc1JvdXRlU2V0KSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBkbnNMaXN0ID0gcC5nZXREbnNlcygpOworICAgICAgICAgICAgZm9yIChJbmV0QWRkcmVzcyBkbnMgOiBkbnNMaXN0KSB7CisgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgIiAgYWRkaW5nICIgKyBkbnMpOworICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlscy5hZGRIb3N0Um91dGUoaW50ZXJmYWNlTmFtZSwgZG5zLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG50LnByaXZhdGVEbnNSb3V0ZVNldCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVQcml2YXRlRG5zUm91dGVzKE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQpIHsKKyAgICAgICAgLy8gVE9ETyAtIHdlIHNob3VsZCBkbyB0aGlzIGV4cGxpY2l0bHkgYnV0IHRoZSBOZXRVdGlscyBhcGkgZG9lc250CisgICAgICAgIC8vIHN1cHBvcnQgdGhpcyB5ZXQgLSBtdXN0IHJlbW92ZSBhbGwuICBObyB3b3JzZSB0aGFuIGJlZm9yZQorICAgICAgICBMaW5rUHJvcGVydGllcyBwID0gbnQuZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHAuZ2V0SW50ZXJmYWNlTmFtZSgpOworICAgICAgICBib29sZWFuIHByaXZhdGVEbnNSb3V0ZVNldCA9IG50LmlzUHJpdmF0ZURuc1JvdXRlU2V0KCk7CisgICAgICAgIGlmIChpbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgcHJpdmF0ZURuc1JvdXRlU2V0KSB7CisgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgInJlbW92ZVByaXZhdGVEbnNSb3V0ZXMgZm9yICIgKyBudC5nZXROZXR3b3JrSW5mbygpLmdldFR5cGVOYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAoIiArIGludGVyZmFjZU5hbWUgKyAiKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTmV0d29ya1V0aWxzLnJlbW92ZUhvc3RSb3V0ZXMoaW50ZXJmYWNlTmFtZSk7CisgICAgICAgICAgICBudC5wcml2YXRlRG5zUm91dGVTZXQoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIHZvaWQgYWRkRGVmYXVsdFJvdXRlKE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQpIHsKKyAgICAgICAgTGlua1Byb3BlcnRpZXMgcCA9IG50LmdldExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgIGlmIChwID09IG51bGwpIHJldHVybjsKKyAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSBwLmdldEludGVyZmFjZU5hbWUoKTsKKyAgICAgICAgSW5ldEFkZHJlc3MgZGVmYXVsdEdhdGV3YXlBZGRyID0gcC5nZXRHYXRld2F5KCk7CisKKyAgICAgICAgaWYgKChpbnRlcmZhY2VOYW1lICE9IG51bGwpICYmIChkZWZhdWx0R2F0ZXdheUFkZHIgIT0gbnVsbCApKSB7CisgICAgICAgICAgICBpZiAoIU5ldHdvcmtVdGlscy5hZGREZWZhdWx0Um91dGUoaW50ZXJmYWNlTmFtZSwgZGVmYXVsdEdhdGV3YXlBZGRyKSAmJiBEQkcpIHsKKyAgICAgICAgICAgICAgICBOZXR3b3JrSW5mbyBuZXR3b3JrSW5mbyA9IG50LmdldE5ldHdvcmtJbmZvKCk7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImFkZERlZmF1bHRSb3V0ZSBmb3IgIiArIG5ldHdvcmtJbmZvLmdldFR5cGVOYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAoIiArIGludGVyZmFjZU5hbWUgKyAiKSwgR2F0ZXdheUFkZHI9IiArIGRlZmF1bHRHYXRld2F5QWRkcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZURlZmF1bHRSb3V0ZShOZXR3b3JrU3RhdGVUcmFja2VyIG50KSB7CisgICAgICAgIExpbmtQcm9wZXJ0aWVzIHAgPSBudC5nZXRMaW5rUHJvcGVydGllcygpOworICAgICAgICBpZiAocCA9PSBudWxsKSByZXR1cm47CisgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gcC5nZXRJbnRlcmZhY2VOYW1lKCk7CisKKyAgICAgICAgaWYgKGludGVyZmFjZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKChOZXR3b3JrVXRpbHMucmVtb3ZlRGVmYXVsdFJvdXRlKGludGVyZmFjZU5hbWUpID49IDApICYmIERCRykgeworICAgICAgICAgICAgICAgIE5ldHdvcmtJbmZvIG5ldHdvcmtJbmZvID0gbnQuZ2V0TmV0d29ya0luZm8oKTsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAicmVtb3ZlRGVmYXVsdFJvdXRlIGZvciAiICsgbmV0d29ya0luZm8uZ2V0VHlwZU5hbWUoKSArICIgKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSArICIpIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBuZXR3b3JrIHNwZWNpZmljIFRDUCBidWZmZXIgc2l6ZXMgZnJvbSBTeXN0ZW1Qcm9wZXJ0aWVzCisgICAgICogbmV0LnRjcC5idWZmZXJzaXplLltkZWZhdWx0fHdpZml8dW10c3xlZGdlfGdwcnNdIGFuZCBzZXQgdGhlbSBmb3Igc3lzdGVtCisgICAgICogd2lkZSB1c2UKKyAgICAgKi8KKyAgIHB1YmxpYyB2b2lkIHVwZGF0ZU5ldHdvcmtTZXR0aW5ncyhOZXR3b3JrU3RhdGVUcmFja2VyIG50KSB7CisgICAgICAgIFN0cmluZyBrZXkgPSBudC5nZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCk7CisgICAgICAgIFN0cmluZyBidWZmZXJTaXplcyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KGtleSk7CisKKyAgICAgICAgaWYgKGJ1ZmZlclNpemVzLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsIGtleSArICIgbm90IGZvdW5kIGluIHN5c3RlbSBwcm9wZXJ0aWVzLiBVc2luZyBkZWZhdWx0cyIpOworCisgICAgICAgICAgICAvLyBTZXR0aW5nIHRvIGRlZmF1bHQgdmFsdWVzIHNvIHdlIHdvbid0IGJlIHN0dWNrIHRvIHByZXZpb3VzIHZhbHVlcworICAgICAgICAgICAga2V5ID0gIm5ldC50Y3AuYnVmZmVyc2l6ZS5kZWZhdWx0IjsKKyAgICAgICAgICAgIGJ1ZmZlclNpemVzID0gU3lzdGVtUHJvcGVydGllcy5nZXQoa2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB2YWx1ZXMgaW4ga2VybmVsCisgICAgICAgIGlmIChidWZmZXJTaXplcy5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgU2xvZy52KFRBRywgIlNldHRpbmcgVENQIHZhbHVlczogWyIgKyBidWZmZXJTaXplcworICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSB3aGljaCBjb21lcyBmcm9tIFsiICsga2V5ICsgIl0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEJ1ZmZlclNpemUoYnVmZmVyU2l6ZXMpOworICAgICAgICB9CisgICAgfQorCisgICAvKioKKyAgICAgKiBXcml0ZXMgVENQIGJ1ZmZlciBzaXplcyB0byAvc3lzL2tlcm5lbC9pcHY0L3RjcF9bci93XW1lbV9bbWluL2RlZi9tYXhdCisgICAgICogd2hpY2ggbWFwcyB0byAvcHJvYy9zeXMvbmV0L2lwdjQvdGNwX3JtZW0gYW5kIHRjcHdtZW0KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWZmZXJTaXplcyBpbiB0aGUgZm9ybWF0IG9mICJyZWFkTWluLCByZWFkSW5pdGlhbCwgcmVhZE1heCwKKyAgICAgKiAgICAgICAgd3JpdGVNaW4sIHdyaXRlSW5pdGlhbCwgd3JpdGVNYXgiCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldEJ1ZmZlclNpemUoU3RyaW5nIGJ1ZmZlclNpemVzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBidWZmZXJTaXplcy5zcGxpdCgiLCIpOworCisgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PSA2KSB7CisgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSAiL3N5cy9rZXJuZWwvaXB2NC90Y3BfIjsKKyAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fbWluIiwgdmFsdWVzWzBdKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fZGVmIiwgdmFsdWVzWzFdKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fbWF4IiwgdmFsdWVzWzJdKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fbWluIiwgdmFsdWVzWzNdKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fZGVmIiwgdmFsdWVzWzRdKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fbWF4IiwgdmFsdWVzWzVdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkludmFsaWQgYnVmZmVyc2l6ZSBzdHJpbmc6ICIgKyBidWZmZXJTaXplcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJDYW4ndCBzZXQgdGNwIGJ1ZmZlciBzaXplczoiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgIC8qKgorICAgICAqIFdyaXRlcyBzdHJpbmcgdG8gZmlsZS4gQmFzaWNhbGx5IHNhbWUgYXMgImVjaG8gLW4gJHN0cmluZyA+ICRmaWxlbmFtZSIKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlbmFtZQorICAgICAqIEBwYXJhbSBzdHJpbmcKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0cmluZ1RvRmlsZShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBzdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGVXcml0ZXIgb3V0ID0gbmV3IEZpbGVXcml0ZXIoZmlsZW5hbWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0LndyaXRlKHN0cmluZyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworCiAgICAgLyoqCiAgICAgICogQWRqdXN0IHRoZSBwZXItcHJvY2VzcyBkbnMgZW50cmllcyAobmV0LmRuczx4Pi48cGlkPikgYmFzZWQKICAgICAgKiBvbiB0aGUgaGlnaGVzdCBwcmlvcml0eSBhY3RpdmUgbmV0IHdoaWNoIHRoaXMgcHJvY2VzcyByZXF1ZXN0ZWQuCkBAIC0xMjM3LDEyICsxNDA5LDE0IEBACiAgICAgICAgICAgICBOZXR3b3JrU3RhdGVUcmFja2VyIG50ID0gbU5ldFRyYWNrZXJzW2ldOwogICAgICAgICAgICAgaWYgKG50LmdldE5ldHdvcmtJbmZvKCkuaXNDb25uZWN0ZWQoKSAmJgogICAgICAgICAgICAgICAgICAgICAhbnQuaXNUZWFyZG93blJlcXVlc3RlZCgpKSB7CisgICAgICAgICAgICAgICAgTGlua1Byb3BlcnRpZXMgcCA9IG50LmdldExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCkgY29udGludWU7CiAgICAgICAgICAgICAgICAgTGlzdCBwaWRzID0gbU5ldFJlcXVlc3RlcnNQaWRzW2ldOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MDsgajxwaWRzLnNpemUoKTsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgcGlkID0gKEludGVnZXIpcGlkcy5nZXQoaik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwaWQuaW50VmFsdWUoKSA9PSBteVBpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZG5zTGlzdCA9IG50LmdldE5hbWVTZXJ2ZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVBpZERucyhkbnNMaXN0LCBteVBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBkbnNlcyA9IHAuZ2V0RG5zZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlUGlkRG5zKGRuc2VzLCBteVBpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9CdW1wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVtcERucygpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTI2NCwxMiArMTQzOCwxMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlUGlkRG5zKFN0cmluZ1tdIGRuc0xpc3QsIGludCBwaWQpIHsKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVQaWREbnMoQ29sbGVjdGlvbiA8SW5ldEFkZHJlc3M+IGRuc2VzLCBpbnQgcGlkKSB7CiAgICAgICAgIGludCBqID0gMTsKLSAgICAgICAgZm9yIChTdHJpbmcgZG5zIDogZG5zTGlzdCkgewotICAgICAgICAgICAgaWYgKGRucyAhPSBudWxsICYmICFUZXh0VXRpbHMuZXF1YWxzKGRucywgIjAuMC4wLjAiKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJuZXQuZG5zIiArIGorKyArICIuIiArIHBpZCwgZG5zKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgZm9yIChJbmV0QWRkcmVzcyBkbnMgOiBkbnNlcykgeworICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoIm5ldC5kbnMiICsgaisrICsgIi4iICsgcGlkLCBkbnMuZ2V0SG9zdEFkZHJlc3MoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEyOTIsMTcgKzE0NjQsMTcgQEAKICAgICAgICAgLy8gYWRkIGRlZmF1bHQgbmV0J3MgZG5zIGVudHJpZXMKICAgICAgICAgTmV0d29ya1N0YXRlVHJhY2tlciBudCA9IG1OZXRUcmFja2Vyc1tuZXRUeXBlXTsKICAgICAgICAgaWYgKG50ICE9IG51bGwgJiYgbnQuZ2V0TmV0d29ya0luZm8oKS5pc0Nvbm5lY3RlZCgpICYmICFudC5pc1RlYXJkb3duUmVxdWVzdGVkKCkpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGRuc0xpc3QgPSBudC5nZXROYW1lU2VydmVycygpOworICAgICAgICAgICAgTGlua1Byb3BlcnRpZXMgcCA9IG50LmdldExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBpZiAocCA9PSBudWxsKSByZXR1cm47CisgICAgICAgICAgICBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBkbnNlcyA9IHAuZ2V0RG5zZXMoKTsKICAgICAgICAgICAgIGlmIChtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5pc0RlZmF1bHQoKSkgewogICAgICAgICAgICAgICAgIGludCBqID0gMTsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBkbnMgOiBkbnNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkbnMgIT0gbnVsbCAmJiAhVGV4dFV0aWxzLmVxdWFscyhkbnMsICIwLjAuMC4wIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYWRkaW5nIGRucyAiICsgZG5zICsgIiBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudC5nZXROZXR3b3JrSW5mbygpLmdldFR5cGVOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoIm5ldC5kbnMiICsgaisrLCBkbnMpOworICAgICAgICAgICAgICAgIGZvciAoSW5ldEFkZHJlc3MgZG5zIDogZG5zZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImFkZGluZyBkbnMgIiArIGRucyArICIgZm9yICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudC5nZXROZXR3b3JrSW5mbygpLmdldFR5cGVOYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJuZXQuZG5zIiArIGorKywgZG5zLmdldEhvc3RBZGRyZXNzKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmb3IgKGludCBrPWogOyBrPG1OdW1EbnNFbnRyaWVzOyBrKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgImVyYXNpbmcgbmV0LmRucyIgKyBrKTsKQEAgLTEzMTQsMTEgKzE0ODYsMTEgQEAKICAgICAgICAgICAgICAgICBMaXN0IHBpZHMgPSBtTmV0UmVxdWVzdGVyc1BpZHNbbmV0VHlwZV07CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgeT0wOyB5PCBwaWRzLnNpemUoKTsgeSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgcGlkID0gKEludGVnZXIpcGlkcy5nZXQoeSk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlUGlkRG5zKGRuc0xpc3QsIHBpZC5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVQaWREbnMoZG5zZXMsIHBpZC5pbnRWYWx1ZSgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBidW1wRG5zKCk7CiAgICAgICAgIH0KLSAgICAgICAgYnVtcERucygpOwogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGdldFJlc3RvcmVEZWZhdWx0TmV0d29ya0RlbGF5KCkgewpAQCAtMTM3Myw2ICsxNTQ1LDEzIEBACiAgICAgICAgIH0KICAgICAgICAgcHcucHJpbnRsbigpOwogCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcHcucHJpbnRsbigiTmV0d29ya1RyYW5zdGlvbldha2VMb2NrIGlzIGN1cnJlbnRseSAiICsKKyAgICAgICAgICAgICAgICAgICAgKG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suaXNIZWxkKCkgPyAiIiA6ICJub3QgIikgKyAiaGVsZC4iKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIkl0IHdhcyBsYXN0IHJlcXVlc3RlZCBmb3IgIittTmV0VHJhbnNpdGlvbldha2VMb2NrQ2F1c2VkQnkpOworICAgICAgICB9CisgICAgICAgIHB3LnByaW50bG4oKTsKKwogICAgICAgICBtVGV0aGVyaW5nLmR1bXAoZmQsIHB3LCBhcmdzKTsKICAgICB9CiAKQEAgLTE0MzksMzQgKzE2MTgsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNvbm5lY3QoaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfU0NBTl9SRVNVTFRTX0FWQUlMQUJMRToKLSAgICAgICAgICAgICAgICAgICAgaW5mbyA9IChOZXR3b3JrSW5mbykgbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2NhblJlc3VsdHNBdmFpbGFibGUoaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX05PVElGSUNBVElPTl9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25DaGFuZ2UobXNnLmFyZzEgPT0gMSwgbXNnLmFyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vdGlmaWNhdGlvbikgbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCiAgICAgICAgICAgICAgICAgY2FzZSBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIG1ha2UgdGhpcyBoYW5kbGUgaXAvcHJveHkvZ2F0ZXdheS9kbnMgY2hhbmdlcwogICAgICAgICAgICAgICAgICAgICBpbmZvID0gKE5ldHdvcmtJbmZvKSBtc2cub2JqOwogICAgICAgICAgICAgICAgICAgICB0eXBlID0gaW5mby5nZXRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURuc0NvbmZpZ3VyYXRpb25DaGFuZ2UodHlwZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX1JPQU1JTkdfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgLy8gZmlsbCBtZSBpbgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTmV0d29ya1N0YXRlVHJhY2tlci5FVkVOVF9ORVRXT1JLX1NVQlRZUEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgLy8gZmlsbCBtZSBpbgotICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfUkVTVE9SRV9ERUZBVUxUX05FVFdPUks6CiAgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVVc2VyIHUgPSAoRmVhdHVyZVVzZXIpbXNnLm9iajsKICAgICAgICAgICAgICAgICAgICAgdS5leHBpcmUoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX0NMRUFSX05FVF9UUkFOU0lUSU9OX1dBS0VMT0NLOgorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2F1c2VkQnkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKENvbm5lY3Rpdml0eVNlcnZpY2UudGhpcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5hcmcxID09IG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tTZXJpYWxOdW1iZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9jay5pc0hlbGQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlZEJ5ID0gbU5ldFRyYW5zaXRpb25XYWtlTG9ja0NhdXNlZEJ5OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjYXVzZWRCeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiTmV0VHJhbnNpdGlvbiBXYWtlbG9jayBmb3IgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlZEJ5ICsgIiByZWxlYXNlZCBieSB0aW1lb3V0Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTIzLDYgKzE2OTgsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCkgeworICAgICAgICBlbmZvcmNlVGV0aGVyQWNjZXNzUGVybWlzc2lvbigpOworICAgICAgICBpZiAoaXNUZXRoZXJpbmdTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG1UZXRoZXJpbmcuZ2V0VGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4cygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBUT0RPIC0gbW92ZSBpZmFjZSBsaXN0aW5nLCBxdWVyaWVzLCBldGMgdG8gbmV3IG1vZHVsZQogICAgIC8vIGphdmFkb2MgZnJvbSBpbnRlcmZhY2UKICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VGV0aGVyYWJsZUlmYWNlcygpIHsKQEAgLTE1NTAsNCArMTczNCwyMyBAQAogICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5URVRIRVJfU1VQUE9SVEVELCBkZWZhdWx0VmFsKSAhPSAwKTsKICAgICAgICAgcmV0dXJuIHRldGhlckVuYWJsZWRJblNldHRpbmdzICYmIG1UZXRoZXJpbmdDb25maWdWYWxpZDsKICAgICB9CisKKyAgICAvLyBBbiBBUEkgTmV0d29ya1N0YXRlVHJhY2tlcnMgY2FuIGNhbGwgd2hlbiB0aGV5IGxvc2UgdGhlaXIgbmV0d29yay4KKyAgICAvLyBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBjbGVhcmVkIGFmdGVyIFggc2Vjb25kcyBvciBhIG5ldHdvcmsgYmVjb21lcyBDT05ORUNURUQsCisgICAgLy8gd2hpY2hldmVyIGhhcHBlbnMgZmlyc3QuICBUaGUgdGltZXIgaXMgc3RhcnRlZCBieSB0aGUgZmlyc3QgY2FsbGVyIGFuZCBub3QKKyAgICAvLyByZXN0YXJ0ZWQgYnkgc3Vic2VxdWVudCBjYWxsZXJzLgorICAgIHB1YmxpYyB2b2lkIHJlcXVlc3ROZXR3b3JrVHJhbnNpdGlvbldha2Vsb2NrKFN0cmluZyBmb3JXaG9tKSB7CisgICAgICAgIGVuZm9yY2VDb25uZWN0aXZpdHlJbnRlcm5hbFBlcm1pc3Npb24oKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAobU5ldFRyYW5zaXRpb25XYWtlTG9jay5pc0hlbGQoKSkgcmV0dXJuOworICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1NlcmlhbE51bWJlcisrOworICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrQ2F1c2VkQnkgPSBmb3JXaG9tOworICAgICAgICB9CisgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfQ0xFQVJfTkVUX1RSQU5TSVRJT05fV0FLRUxPQ0ssCisgICAgICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1NlcmlhbE51bWJlciwgMCksCisgICAgICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1RpbWVvdXQpOworICAgICAgICByZXR1cm47CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ291bnRyeURldGVjdG9yU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ291bnRyeURldGVjdG9yU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwODFlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db3VudHJ5RGV0ZWN0b3JTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5sb2NhdGlvbi5Db21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uSUNvdW50cnlEZXRlY3RvcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLklDb3VudHJ5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZXRlY3RzIHRoZSBjb3VudHJ5IHRoYXQgdGhlIHVzZXIgaXMgaW4gdGhyb3VnaAorICoge0BsaW5rIENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3J9LgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIGV4dGVuZHMgSUNvdW50cnlEZXRlY3Rvci5TdHViIGltcGxlbWVudHMgUnVubmFibGUgeworCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIHJlcHJlc2VudHMgdGhlIHJlbW90ZSBsaXN0ZW5lciwgaXQgd2lsbCBhbHNvIHJlbW92ZXMgaXRzZWxmCisgICAgICogZnJvbSBsaXN0ZW5lciBsaXN0IHdoZW4gdGhlIHJlbW90ZSBwcm9jZXNzIHdhcyBkaWVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUmVjZWl2ZXIgaW1wbGVtZW50cyBJQmluZGVyLkRlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJQ291bnRyeUxpc3RlbmVyIG1MaXN0ZW5lcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJQmluZGVyIG1LZXk7CisKKyAgICAgICAgcHVibGljIFJlY2VpdmVyKElDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICAgICAgbUtleSA9IGxpc3RlbmVyLmFzQmluZGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBiaW5kZXJEaWVkKCkgeworICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobUtleSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlck9iaikgeworICAgICAgICAgICAgaWYgKG90aGVyT2JqIGluc3RhbmNlb2YgUmVjZWl2ZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUtleS5lcXVhbHMoKChSZWNlaXZlcikgb3RoZXJPYmopLm1LZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUtleS5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElDb3VudHJ5TGlzdGVuZXIgZ2V0TGlzdGVuZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxpc3RlbmVyOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIjsKKworICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxJQmluZGVyLCBSZWNlaXZlcj4gbVJlY2VpdmVyczsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yIG1Db3VudHJ5RGV0ZWN0b3I7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TeXN0ZW1SZWFkeTsKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgcHJpdmF0ZSBDb3VudHJ5TGlzdGVuZXIgbUxvY2F0aW9uQmFzZWREZXRlY3Rvckxpc3RlbmVyOworCisgICAgcHVibGljIENvdW50cnlEZXRlY3RvclNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIG1SZWNlaXZlcnMgPSBuZXcgSGFzaE1hcDxJQmluZGVyLCBSZWNlaXZlcj4oKTsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb3VudHJ5IGRldGVjdENvdW50cnkoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtU3lzdGVtUmVhZHkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUNvdW50cnlEZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBJQ291bnRyeUxpc3RlbmVyIGludG8gdGhlIGxpc3RlbmVyIGxpc3QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkQ291bnRyeUxpc3RlbmVyKElDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBpZiAoIW1TeXN0ZW1SZWFkeSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW90ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIElDb3VudHJ5TGlzdGVuZXIgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb3VudHJ5TGlzdGVuZXIoSUNvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbVN5c3RlbVJlYWR5KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVtb3RlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIuYXNCaW5kZXIoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVyKElDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtUmVjZWl2ZXJzKSB7CisgICAgICAgICAgICBSZWNlaXZlciByID0gbmV3IFJlY2VpdmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuYXNCaW5kZXIoKS5saW5rVG9EZWF0aChyLCAwKTsKKyAgICAgICAgICAgICAgICBtUmVjZWl2ZXJzLnB1dChsaXN0ZW5lci5hc0JpbmRlcigpLCByKTsKKyAgICAgICAgICAgICAgICBpZiAobVJlY2VpdmVycy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiVGhlIGZpcnN0IGxpc3RlbmVyIGlzIGFkZGVkIik7CisgICAgICAgICAgICAgICAgICAgIHNldENvdW50cnlMaXN0ZW5lcihtTG9jYXRpb25CYXNlZERldGVjdG9yTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgImxpbmtUb0RlYXRoIGZhaWxlZDoiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVMaXN0ZW5lcihJQmluZGVyIGtleSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNlaXZlcnMpIHsKKyAgICAgICAgICAgIG1SZWNlaXZlcnMucmVtb3ZlKGtleSk7CisgICAgICAgICAgICBpZiAobVJlY2VpdmVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzZXRDb3VudHJ5TGlzdGVuZXIobnVsbCk7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIk5vIGxpc3RlbmVyIGlzIGxlZnQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5UmVjZWl2ZXJzKENvdW50cnkgY291bnRyeSkgeworICAgICAgICBzeW5jaHJvbml6ZWQobVJlY2VpdmVycykgeworICAgICAgICAgICAgZm9yIChSZWNlaXZlciByZWNlaXZlciA6IG1SZWNlaXZlcnMudmFsdWVzKCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZWNlaXZlci5nZXRMaXN0ZW5lcigpLm9uQ291bnRyeURldGVjdGVkKGNvdW50cnkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFNoYWxsIHdlIHJlbW92ZSB0aGUgcmVjZWl2ZXI/CisgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJub3RpZnlSZWNlaXZlcnMgZmFpbGVkOiIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3lzdGVtUmVhZHkoKSB7CisgICAgICAgIC8vIFNoYWxsIHdlIHdhaXQgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmaW5pc2guCisgICAgICAgIFRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKHRoaXMsICJDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIik7CisgICAgICAgIHRocmVhZC5zdGFydCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICBtQ291bnRyeURldGVjdG9yID0gbmV3IENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3IobUNvbnRleHQpOworICAgICAgICBtTG9jYXRpb25CYXNlZERldGVjdG9yTGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db3VudHJ5RGV0ZWN0ZWQoZmluYWwgQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeVJlY2VpdmVycyhjb3VudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgUHJvY2Vzcy5zZXRUaHJlYWRQcmlvcml0eShQcm9jZXNzLlRIUkVBRF9QUklPUklUWV9CQUNLR1JPVU5EKTsKKyAgICAgICAgTG9vcGVyLnByZXBhcmUoKTsKKyAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworICAgICAgICBpbml0aWFsaXplKCk7CisgICAgICAgIG1TeXN0ZW1SZWFkeSA9IHRydWU7CisgICAgICAgIExvb3Blci5sb29wKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q291bnRyeUxpc3RlbmVyKGZpbmFsIENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1Db3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLy8gRm9yIHRlc3RpbmcKKyAgICBib29sZWFuIGlzU3lzdGVtUmVhZHkoKSB7CisgICAgICAgIHJldHVybiBtU3lzdGVtUmVhZHk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGVtb0RhdGFTZXQuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RlbW9EYXRhU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Nzk4NWYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGVtb0RhdGFTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5JbWFnZXM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgRGVtb0RhdGFTZXQKLXsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HX1RBRyA9ICJEZW1vRGF0YVNldCI7Ci0KLSAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgYWRkKENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotCi0gICAgICAgIC8vIFJlbW92ZSBhbGwgdGhlIG9sZCBkYXRhCi0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIuZGVsZXRlKENvbnRhY3RzLlBlb3BsZS5DT05URU5UX1VSSSwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBuZXcgZGF0YQotICAgICAgICBhZGREZWZhdWx0RGF0YSgpOwotICAgICAgICAKLSAgICAgICAgLy8gQWRkIGltYWdlcyBmcm9tIC9hbmRyb2lkL2ltYWdlcwotICAgICAgICBhZGREZWZhdWx0SW1hZ2VzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGFkZERlZmF1bHRJbWFnZXMoKQotICAgIHsKLSAgICAgICAgRmlsZSByb290RGlyZWN0b3J5ID0gRW52aXJvbm1lbnQuZ2V0Um9vdERpcmVjdG9yeSgpOwotICAgICAgICBTdHJpbmcgW10gZmlsZXMKLSAgICAgICAgICAgID0gbmV3IEZpbGUocm9vdERpcmVjdG9yeSwgImltYWdlcyIpLmxpc3QoKTsKLSAgICAgICAgaW50IGNvdW50ID0gZmlsZXMubGVuZ3RoOwotCi0gICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBTbG9nLmkoTE9HX1RBRywgImFkZERlZmF1bHRJbWFnZXM6IG5vIGltYWdlcyBmb3VuZCEiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlc1tpXTsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gcm9vdERpcmVjdG9yeSArICIvIiArIG5hbWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSW1hZ2VzLk1lZGlhLmluc2VydEltYWdlKG1Db250ZW50UmVzb2x2ZXIsIHBhdGgsIG5hbWUsIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBpbXBvcnQgaW1hZ2UgIiArIHBhdGgsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgdm9pZCBhZGREZWZhdWx0RGF0YSgpCi0gICAgewotICAgICAgICBTbG9nLmkoTE9HX1RBRywgIkFkZGluZyBkZWZhdWx0IGRhdGEuLi4iKTsKLQotLy8gICAgICAgYWRkSW1hZ2UoIlZpb2xldCIsICJpbWFnZXMvdmlvbGV0LnBuZyIpOwotLy8gICAgICAgYWRkSW1hZ2UoIkNvcmt5IiwgImltYWdlcy9jb3JreS5wbmciKTsKLQotICAgICAgICAvLyBQRU5ESU5HOiBzaG91bGQgdGhpcyBiZSBkb25lIGhlcmU/IT8hCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KAotICAgICAgICAgICAgICAgIEludGVudC5BQ1RJT05fQ0FMTCwgVXJpLmZyb21QYXJ0cygidm9pY2VtYWlsIiwgIiIsIG51bGwpKTsKLSAgICAgICAgYWRkU2hvcnRjdXQoIjEiLCBpbnRlbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgVXJpIGFkZEltYWdlKFN0cmluZyBuYW1lLCBVcmkgZmlsZSkKLSAgICB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgaW1hZ2V2ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgaW1hZ2V2LnB1dCgibmFtZSIsIG5hbWUpOwotCi0gICAgICAgIFVyaSB1cmwgPSBudWxsOwotCi0gICAgICAgIEFzc2V0TWFuYWdlciBhc3MgPSBBc3NldE1hbmFnZXIuZ2V0U3lzdGVtKCk7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaW4gPSBhc3Mub3BlbihmaWxlLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICB1cmwgPSBtQ29udGVudFJlc29sdmVyLmluc2VydChJbWFnZXMuTWVkaWEuSU5URVJOQUxfQ09OVEVOVF9VUkksIGltYWdldik7Ci0gICAgICAgICAgICBvdXQgPSBtQ29udGVudFJlc29sdmVyLm9wZW5PdXRwdXRTdHJlYW0odXJsKTsKLQotICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSA4ICogMTAyNDsKLSAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKLQotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY291bnQgPSBpbi5yZWFkKGJ1ZiwgMCwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAoY291bnQgPiAwKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGluc2VydCBpbWFnZSAnIiArIGZpbGUgKyAiJyIsIGUpOwotICAgICAgICAgICAgdXJsID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBVcmkgYWRkU2hvcnRjdXQoU3RyaW5nIHNob3J0Y3V0LCBJbnRlbnQgaW50ZW50KQotICAgIHsKLSAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBTbG9nLnYoTE9HX1RBRywgImFkZFNob3J0Y3V0OiBzaG9ydGN1dD0iICsgc2hvcnRjdXQgKyAiLCBpbnRlbnQ9IiArIGludGVudCk7Ci0gICAgICAgIHJldHVybiBTZXR0aW5ncy5Cb29rbWFya3MuYWRkKG1Db250ZW50UmVzb2x2ZXIsIGludGVudCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRjdXQgIT0gbnVsbCA/IHNob3J0Y3V0LmNoYXJBdCgwKSA6IDAsIDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDE5ZDE0NmQuLjBjM2EwZTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMzMsNiArMzMsNyBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLklEZXZpY2VQb2xpY3lNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwpAQCAtNDYsNiArNDcsOCBAQAogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Qcm94eTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QcmludFdyaXRlclByaW50ZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlByaW50ZXI7CkBAIC01OCw0NiArNjEsNjYgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCiAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGV2aWNlIHBvbGljeSBBUElzLgogICovCiBwdWJsaWMgY2xhc3MgRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UgZXh0ZW5kcyBJRGV2aWNlUG9saWN5TWFuYWdlci5TdHViIHsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZSI7Ci0gICAgCisKICAgICBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwogICAgIGZpbmFsIE15UGFja2FnZU1vbml0b3IgbU1vbml0b3I7CiAKICAgICBJUG93ZXJNYW5hZ2VyIG1JUG93ZXJNYW5hZ2VyOwotICAgIAorCiAgICAgaW50IG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQ7CiAgICAgaW50IG1BY3RpdmVQYXNzd29yZExlbmd0aCA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZSA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZExldHRlcnMgPSAwOworICAgIGludCBtQWN0aXZlUGFzc3dvcmROdW1lcmljID0gMDsKKyAgICBpbnQgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA9IDA7CiAgICAgaW50IG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzID0gMDsKLSAgICAKKwogICAgIGludCBtUGFzc3dvcmRPd25lciA9IC0xOwotICAgIAorCiAgICAgZmluYWwgSGFzaE1hcDxDb21wb25lbnROYW1lLCBBY3RpdmVBZG1pbj4gbUFkbWluTWFwCiAgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPENvbXBvbmVudE5hbWUsIEFjdGl2ZUFkbWluPigpOwogICAgIGZpbmFsIEFycmF5TGlzdDxBY3RpdmVBZG1pbj4gbUFkbWluTGlzdAogICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PEFjdGl2ZUFkbWluPigpOwotICAgIAorCiAgICAgc3RhdGljIGNsYXNzIEFjdGl2ZUFkbWluIHsKICAgICAgICAgZmluYWwgRGV2aWNlQWRtaW5JbmZvIGluZm87Ci0gICAgICAgIAorCiAgICAgICAgIGludCBwYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQ7CiAgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmRMZW5ndGggPSAwOworICAgICAgICBpbnQgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gMDsKKyAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSA9IDA7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgPSAwOworICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTGV0dGVycyA9IDE7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmROdW1lcmljID0gMTsKKyAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZFN5bWJvbHMgPSAxOworICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTm9uTGV0dGVyID0gMDsKICAgICAgICAgbG9uZyBtYXhpbXVtVGltZVRvVW5sb2NrID0gMDsKICAgICAgICAgaW50IG1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlID0gMDsKLSAgICAgICAgCisKKyAgICAgICAgLy8gVE9ETzogcmV2aWV3IGltcGxlbWVudGF0aW9uIGRlY2lzaW9ucyB3aXRoIGZyYW1ld29ya3MgdGVhbQorICAgICAgICBib29sZWFuIHNwZWNpZmllc0dsb2JhbFByb3h5ID0gZmFsc2U7CisgICAgICAgIFN0cmluZyBnbG9iYWxQcm94eVNwZWMgPSBudWxsOworICAgICAgICBTdHJpbmcgZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ID0gbnVsbDsKKwogICAgICAgICBBY3RpdmVBZG1pbihEZXZpY2VBZG1pbkluZm8gX2luZm8pIHsKICAgICAgICAgICAgIGluZm8gPSBfaW5mbzsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBpbnQgZ2V0VWlkKCkgeyByZXR1cm4gaW5mby5nZXRBY3Rpdml0eUluZm8oKS5hcHBsaWNhdGlvbkluZm8udWlkOyB9Ci0gICAgICAgIAorCiAgICAgICAgIHZvaWQgd3JpdGVUb1htbChYbWxTZXJpYWxpemVyIG91dCkKICAgICAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAicG9saWNpZXMiKTsKQEAgLTExMCw3ICsxMzMsNDIgQEAKICAgICAgICAgICAgICAgICBpZiAobWluaW11bVBhc3N3b3JkTGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sZW5ndGgiKTsKICAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZExlbmd0aCkpOwotICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtbi1wYXNzd29yZC1sZW5ndGgiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxlbmd0aCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihwYXNzd29yZEhpc3RvcnlMZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAicGFzc3dvcmQtaGlzdG9yeS1sZW5ndGgiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKHBhc3N3b3JkSGlzdG9yeUxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJwYXNzd29yZC1oaXN0b3J5LWxlbmd0aCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWluaW11bVBhc3N3b3JkVXBwZXJDYXNlID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC11cHBlcmNhc2UiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSkpOworICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtaW4tcGFzc3dvcmQtdXBwZXJjYXNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxvd2VyY2FzZSIpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcobWluaW11bVBhc3N3b3JkTG93ZXJDYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sb3dlcmNhc2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZExldHRlcnMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxldHRlcnMiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZExldHRlcnMpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxldHRlcnMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZE51bWVyaWMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW51bWVyaWMiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZE51bWVyaWMpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW51bWVyaWMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZFN5bWJvbHMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLXN5bWJvbHMiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZFN5bWJvbHMpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLXN5bWJvbHMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZE5vbkxldHRlciA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJtaW4tcGFzc3dvcmQtbm9ubGV0dGVyIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtaW5pbXVtUGFzc3dvcmROb25MZXR0ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW5vbmxldHRlciIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtYXhpbXVtVGltZVRvVW5sb2NrICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCkgewpAQCAtMTIzLDggKzE4MSwyMyBAQAogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSkpOwogICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1heC1mYWlsZWQtcGFzc3dvcmQtd2lwZSIpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNwZWNpZmllc0dsb2JhbFByb3h5KSB7CisgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJzcGVjaWZpZXMtZ2xvYmFsLXByb3h5Iik7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBCb29sZWFuLnRvU3RyaW5nKHNwZWNpZmllc0dsb2JhbFByb3h5KSk7CisgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAic3BlY2lmaWVzX2dsb2JhbF9wcm94eSIpOworICAgICAgICAgICAgICAgIGlmIChnbG9iYWxQcm94eVNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgImdsb2JhbC1wcm94eS1zcGVjIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgZ2xvYmFsUHJveHlTcGVjKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiZ2xvYmFsLXByb3h5LXNwZWMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAiZ2xvYmFsLXByb3h5LWV4Y2x1c2lvbi1saXN0Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiZ2xvYmFsLXByb3h5LWV4Y2x1c2lvbi1saXN0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHZvaWQgcmVhZEZyb21YbWwoWG1sUHVsbFBhcnNlciBwYXJzZXIpCiAgICAgICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIGludCBvdXRlckRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CkBAIC0xNDMsMTkgKzIxNiw0OSBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC1sZW5ndGgiLmVxdWFscyh0YWcpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZExlbmd0aCA9IEludGVnZXIucGFyc2VJbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJwYXNzd29yZC1oaXN0b3J5LWxlbmd0aCIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC11cHBlcmNhc2UiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtaW4tcGFzc3dvcmQtbG93ZXJjYXNlIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLWxldHRlcnMiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZExldHRlcnMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLW51bWVyaWMiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZE51bWVyaWMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLXN5bWJvbHMiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZFN5bWJvbHMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLW5vbmxldHRlciIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgbWluaW11bVBhc3N3b3JkTm9uTGV0dGVyID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1heC10aW1lLXRvLXVubG9jayIuZXF1YWxzKHRhZykpIHsKICAgICAgICAgICAgICAgICAgICAgbWF4aW11bVRpbWVUb1VubG9jayA9IExvbmcucGFyc2VMb25nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWF4LWZhaWxlZC1wYXNzd29yZC13aXBlIi5lcXVhbHModGFnKSkgewogICAgICAgICAgICAgICAgICAgICBtYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSA9IEludGVnZXIucGFyc2VJbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJzcGVjaWZpZXMtZ2xvYmFsLXByb3h5Ii5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXNHbG9iYWxQcm94eSA9IEJvb2xlYW4uZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImdsb2JhbC1wcm94eS1zcGVjIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBnbG9iYWxQcm94eVNwZWMgPQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImdsb2JhbC1wcm94eS1leGNsdXNpb24tbGlzdCIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiVW5rbm93biBhZG1pbiB0YWc6ICIgKyB0YWcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBYbWxVdGlscy5za2lwQ3VycmVudFRhZyhwYXJzZXIpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHZvaWQgZHVtcChTdHJpbmcgcHJlZml4LCBQcmludFdyaXRlciBwdykgewogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInVpZD0iKTsgcHcucHJpbnRsbihnZXRVaWQoKSk7CiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludGxuKCJwb2xpY2llczoiKTsKQEAgLTE2NiwyMyArMjY5LDQ3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInBhc3N3b3JkUXVhbGl0eT0weCIpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludChJbnRlZ2VyLnRvSGV4U3RyaW5nKHBhc3N3b3JkUXVhbGl0eSkpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIG1pbmltdW1QYXNzd29yZExlbmd0aD0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihJbnRlZ2VyLnRvSGV4U3RyaW5nKHBhc3N3b3JkUXVhbGl0eSkpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZExlbmd0aD0iKTsKICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRMZW5ndGgpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInBhc3N3b3JkSGlzdG9yeUxlbmd0aD0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihwYXNzd29yZEhpc3RvcnlMZW5ndGgpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZT0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRVcHBlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZExvd2VyQ2FzZT0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZExldHRlcnM9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkTGV0dGVycyk7CisgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibWluaW11bVBhc3N3b3JkTnVtZXJpYz0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmROdW1lcmljKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmRTeW1ib2xzPSIpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKG1pbmltdW1QYXNzd29yZFN5bWJvbHMpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZE5vbkxldHRlcj0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmROb25MZXR0ZXIpOwogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1heGltdW1UaW1lVG9VbmxvY2s9Iik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWF4aW11bVRpbWVUb1VubG9jayk7CiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGU9Iik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInNwZWNpZmllc0dsb2JhbFByb3h5PSIpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKHNwZWNpZmllc0dsb2JhbFByb3h5KTsKKyAgICAgICAgICAgIGlmIChnbG9iYWxQcm94eVNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJnbG9iYWxQcm94eVNwZWM9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKGdsb2JhbFByb3h5U3BlYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiZ2xvYmFsUHJveHlFY2x1c2lvbkxpc3Q9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKGdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBjbGFzcyBNeVBhY2thZ2VNb25pdG9yIGV4dGVuZHMgUGFja2FnZU1vbml0b3IgewogICAgICAgICBwdWJsaWMgdm9pZCBvblNvbWVQYWNrYWdlc0NoYW5nZWQoKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKERldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLnRoaXMpIHsKICAgICAgICAgICAgICAgICBib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpPW1BZG1pbkxpc3Quc2l6ZSgpLTE7IGk+PTA7IGktLSkgewogICAgICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhYSA9IG1BZG1pbkxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbmdlID0gaXNQYWNrYWdlRGlzYXBwZWFyaW5nKGFhLmluZm8uZ2V0UGFja2FnZU5hbWUoKSk7IAorICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbmdlID0gaXNQYWNrYWdlRGlzYXBwZWFyaW5nKGFhLmluZm8uZ2V0UGFja2FnZU5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UgPT0gUEFDS0FHRV9QRVJNQU5FTlRfQ0hBTkdFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY2hhbmdlID09IFBBQ0tBR0VfVEVNUE9SQVJZX0NIQU5HRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkFkbWluIHVuZXhwZWN0ZWRseSB1bmluc3RhbGxlZDogIgpAQCAtMjA3LDcgKzMzNCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgdGhlIHNlcnZpY2UuCiAgICAgICovCkBAIC0yMjQsNyArMzUxLDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbUlQb3dlck1hbmFnZXI7CiAgICAgfQotICAgIAorCiAgICAgQWN0aXZlQWRtaW4gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQoQ29tcG9uZW50TmFtZSB3aG8pIHsKICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5NYXAuZ2V0KHdobyk7CiAgICAgICAgIGlmIChhZG1pbiAhPSBudWxsCkBAIC0yMzQsNyArMzYxLDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9Ci0gICAgCisKICAgICBBY3RpdmVBZG1pbiBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZChDb21wb25lbnROYW1lIHdobywgaW50IHJlcVBvbGljeSkKICAgICAgICAgICAgIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludCBjYWxsaW5nVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKQEAgLTI2NSwxMyArMzkyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICsgQmluZGVyLmdldENhbGxpbmdVaWQoKSArICIgZm9yIHBvbGljeSAjIiArIHJlcVBvbGljeSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICB2b2lkIHNlbmRBZG1pbkNvbW1hbmRMb2NrZWQoQWN0aXZlQWRtaW4gYWRtaW4sIFN0cmluZyBhY3Rpb24pIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoYWN0aW9uKTsKICAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChhZG1pbi5pbmZvLmdldENvbXBvbmVudCgpKTsKICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwogICAgIH0KLSAgICAKKwogICAgIHZvaWQgc2VuZEFkbWluQ29tbWFuZExvY2tlZChTdHJpbmcgYWN0aW9uLCBpbnQgcmVxUG9saWN5KSB7CiAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgIGlmIChOID4gMCkgewpAQCAtMjgzLDE5ICs0MTAsMjQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHZvaWQgcmVtb3ZlQWN0aXZlQWRtaW5Mb2NrZWQoQ29tcG9uZW50TmFtZSBhZG1pblJlY2VpdmVyKSB7CiAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQoYWRtaW5SZWNlaXZlcik7CiAgICAgICAgIGlmIChhZG1pbiAhPSBudWxsKSB7CisgICAgICAgICAgICBib29sZWFuIGRvUHJveHlDbGVhbnVwID0KKyAgICAgICAgICAgICAgICBhZG1pbi5pbmZvLnVzZXNQb2xpY3koRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZKTsKICAgICAgICAgICAgIHNlbmRBZG1pbkNvbW1hbmRMb2NrZWQoYWRtaW4sCiAgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluUmVjZWl2ZXIuQUNUSU9OX0RFVklDRV9BRE1JTl9ESVNBQkxFRCk7CiAgICAgICAgICAgICAvLyBYWFggbmVlZCB0byB3YWl0IGZvciBpdCB0byBjb21wbGV0ZS4KICAgICAgICAgICAgIG1BZG1pbkxpc3QucmVtb3ZlKGFkbWluKTsKICAgICAgICAgICAgIG1BZG1pbk1hcC5yZW1vdmUoYWRtaW5SZWNlaXZlcik7CiAgICAgICAgICAgICB2YWxpZGF0ZVBhc3N3b3JkT3duZXJMb2NrZWQoKTsKKyAgICAgICAgICAgIGlmIChkb1Byb3h5Q2xlYW51cCkgeworICAgICAgICAgICAgICAgIHJlc2V0R2xvYmFsUHJveHkoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBEZXZpY2VBZG1pbkluZm8gZmluZEFkbWluKENvbXBvbmVudE5hbWUgYWRtaW5OYW1lKSB7CiAgICAgICAgIEludGVudCByZXNvbHZlSW50ZW50ID0gbmV3IEludGVudCgpOwogICAgICAgICByZXNvbHZlSW50ZW50LnNldENvbXBvbmVudChhZG1pbk5hbWUpOwpAQCAtMzA0LDcgKzQzNiw3IEBACiAgICAgICAgIGlmIChpbmZvcyA9PSBudWxsIHx8IGluZm9zLnNpemUoKSA8PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGFkbWluOiAiICsgYWRtaW5OYW1lKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXZpY2VBZG1pbkluZm8obUNvbnRleHQsIGluZm9zLmdldCgwKSk7CiAgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgewpAQCAtMzE1LDcgKzQ0Nyw3IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHByaXZhdGUgc3RhdGljIEpvdXJuYWxlZEZpbGUgbWFrZUpvdXJuYWxlZEZpbGUoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBiYXNlID0gIi9kYXRhL3N5c3RlbS9kZXZpY2VfcG9saWNpZXMueG1sIjsKICAgICAgICAgcmV0dXJuIG5ldyBKb3VybmFsZWRGaWxlKG5ldyBGaWxlKGJhc2UpLCBuZXcgRmlsZShiYXNlICsgIi50bXAiKSk7CkBAIC0zMzEsNyArNDYzLDcgQEAKICAgICAgICAgICAgIG91dC5zdGFydERvY3VtZW50KG51bGwsIHRydWUpOwogCiAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInBvbGljaWVzIik7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IG1BZG1pbkxpc3QuZ2V0KGkpOwpAQCAtMzQyLDI2ICs0NzQsMzYgQEAKICAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiYWRtaW4iKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKG1QYXNzd29yZE93bmVyID49IDApIHsKICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInBhc3N3b3JkLW93bmVyIik7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1QYXNzd29yZE93bmVyKSk7CiAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAicGFzc3dvcmQtb3duZXIiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAobUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMgIT0gMCkgewogICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAiZmFpbGVkLXBhc3N3b3JkLWF0dGVtcHRzIik7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzKSk7CiAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiZmFpbGVkLXBhc3N3b3JkLWF0dGVtcHRzIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoICE9IDApIHsKKworICAgICAgICAgICAgaWYgKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmRMZW5ndGggIT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgIT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyAhPSAwCisgICAgICAgICAgICAgICAgICAgIHx8IG1BY3RpdmVQYXNzd29yZFN5bWJvbHMgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIgIT0gMCkgewogICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAiYWN0aXZlLXBhc3N3b3JkIik7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAicXVhbGl0eSIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSkpOwogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgImxlbmd0aCIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkTGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidXBwZXJjYXNlIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJsb3dlcmNhc2UiLCBJbnRlZ2VyLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSkpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgImxldHRlcnMiLCBJbnRlZ2VyLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZExldHRlcnMpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJudW1lcmljIiwgSW50ZWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZE51bWVyaWMpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJzeW1ib2xzIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmRTeW1ib2xzKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibm9ubGV0dGVyIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIpKTsKICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJhY3RpdmUtcGFzc3dvcmQiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJwb2xpY2llcyIpOwogCiAgICAgICAgICAgICBvdXQuZW5kRG9jdW1lbnQoKTsKQEAgLTQzOSw2ICs1ODEsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInF1YWxpdHkiKSk7CiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExlbmd0aCA9IEludGVnZXIucGFyc2VJbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJsZW5ndGgiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZSA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ1cHBlcmNhc2UiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJsb3dlcmNhc2UiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExldHRlcnMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibGV0dGVycyIpKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJudW1lcmljIikpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInN5bWJvbHMiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJub25sZXR0ZXIiKSk7CiAgICAgICAgICAgICAgICAgICAgIFhtbFV0aWxzLnNraXBDdXJyZW50VGFnKHBhcnNlcik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlVua25vd24gdGFnOiAiICsgdGFnKTsKQEAgLTQ3NiwxMCArNjMwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyh1dGlscy5nZXRBY3RpdmVQYXNzd29yZFF1YWxpdHkoKSkpOwogICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRDsKICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExlbmd0aCA9IDA7CisgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPSAwOworICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlID0gMDsKKyAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExldHRlcnMgPSAwOworICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyA9IDA7CisgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID0gMDsKKyAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgdmFsaWRhdGVQYXNzd29yZE93bmVyTG9ja2VkKCk7Ci0gICAgICAgIAorCiAgICAgICAgIGxvbmcgdGltZU1zID0gZ2V0TWF4aW11bVRpbWVUb0xvY2sobnVsbCk7CiAgICAgICAgIGlmICh0aW1lTXMgPD0gMCkgewogICAgICAgICAgICAgdGltZU1zID0gSW50ZWdlci5NQVhfVkFMVUU7CkBAIC00OTgsMTIgKzY1OCwxMyBAQAogICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQzoKICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUM6CiAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUM6CisgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYOgogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHF1YWxpdHkgY29uc3RhbnQ6IDB4IgogICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhxdWFsaXR5KSk7CiAgICAgfQotICAgIAorCiAgICAgdm9pZCB2YWxpZGF0ZVBhc3N3b3JkT3duZXJMb2NrZWQoKSB7CiAgICAgICAgIGlmIChtUGFzc3dvcmRPd25lciA+PSAwKSB7CiAgICAgICAgICAgICBib29sZWFuIGhhdmVPd25lciA9IGZhbHNlOwpAQCAtNTIwLDE3ICs2ODEsMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHN5c3RlbVJlYWR5KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGxvYWRTZXR0aW5nc0xvY2tlZCgpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlQWRtaW4oQ29tcG9uZW50TmFtZSBhZG1pblJlY2VpdmVyKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQklORF9ERVZJQ0VfQURNSU4sIG51bGwpOwotICAgICAgICAKKwogICAgICAgICBEZXZpY2VBZG1pbkluZm8gaW5mbyA9IGZpbmRBZG1pbihhZG1pblJlY2VpdmVyKTsKICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGFkbWluOiAiICsgYWRtaW5SZWNlaXZlcik7CkBAIC01NTIsMTMgKzcxMywxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGJvb2xlYW4gaXNBZG1pbkFjdGl2ZShDb21wb25lbnROYW1lIGFkbWluUmVjZWl2ZXIpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQoYWRtaW5SZWNlaXZlcikgIT0gbnVsbDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBMaXN0PENvbXBvbmVudE5hbWU+IGdldEFjdGl2ZUFkbWlucygpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwpAQCAtNTcyLDcgKzczMyw3IEBACiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGJvb2xlYW4gcGFja2FnZUhhc0FjdGl2ZUFkbWlucyhTdHJpbmcgcGFja2FnZU5hbWUpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwpAQCAtNTg0LDcgKzc0NSw3IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCByZW1vdmVBY3RpdmVBZG1pbihDb21wb25lbnROYW1lIGFkbWluUmVjZWl2ZXIpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKGFkbWluUmVjZWl2ZXIpOwpAQCAtNjAzLDEwICs3NjQsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkUXVhbGl0eShDb21wb25lbnROYW1lIHdobywgaW50IHF1YWxpdHkpIHsKICAgICAgICAgdmFsaWRhdGVRdWFsaXR5Q29uc3RhbnQocXVhbGl0eSk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKQEAgLTYxOSwxNiArNzgwLDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkUXVhbGl0eShDb21wb25lbnROYW1lIHdobykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGludCBtb2RlID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKICAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLnBhc3N3b3JkUXVhbGl0eSA6IG1vZGU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKICAgICAgICAgICAgIGZvciAgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKQEAgLTYzOSw3ICs4MDAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG1vZGU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1MZW5ndGgoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKQEAgLTY1MywxNiArODE0LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChDb21wb25lbnROYW1lIHdobykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGludCBsZW5ndGggPSAwOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKICAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZExlbmd0aCA6IGxlbmd0aDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICAgICAgZm9yICAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOwpAQCAtNjczLDE4ICs4MzQsMjY3IEBACiAgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOwogICAgICAgICB9CiAgICAgfQotICAgIAorCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLnBhc3N3b3JkSGlzdG9yeUxlbmd0aCAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5wYXNzd29yZEhpc3RvcnlMZW5ndGggPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5wYXNzd29yZEhpc3RvcnlMZW5ndGggOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLnBhc3N3b3JkSGlzdG9yeUxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5wYXNzd29yZEhpc3RvcnlMZW5ndGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5taW5pbXVtUGFzc3dvcmRVcHBlckNhc2UgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkVXBwZXJDYXNlID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWluaW11bVBhc3N3b3JkVXBwZXJDYXNlIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSkgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmRVcHBlckNhc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5taW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkTG93ZXJDYXNlID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWluaW11bVBhc3N3b3JkTG93ZXJDYXNlIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZExvd2VyQ2FzZSkgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmRMb3dlckNhc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxldHRlcnMoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7CisgICAgICAgICAgICBpZiAoYXAubWluaW11bVBhc3N3b3JkTGV0dGVycyAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5taW5pbXVtUGFzc3dvcmRMZXR0ZXJzID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZExldHRlcnMgOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgYWRtaW4ubWluaW11bVBhc3N3b3JkTGV0dGVycykgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmRMZXR0ZXJzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLm1pbmltdW1QYXNzd29yZE51bWVyaWMgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkTnVtZXJpYyA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmROdW1lcmljIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCBhZG1pbi5taW5pbXVtUGFzc3dvcmROdW1lcmljKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFkbWluLm1pbmltdW1QYXNzd29yZE51bWVyaWM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7CisgICAgICAgICAgICBpZiAoYXAubWluaW11bVBhc3N3b3JkU3ltYm9scyAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5taW5pbXVtUGFzc3dvcmRTeW1ib2xzID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZFN5bWJvbHMgOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZFN5bWJvbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYWRtaW4ubWluaW11bVBhc3N3b3JkU3ltYm9sczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLm1pbmltdW1QYXNzd29yZE5vbkxldHRlciAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5taW5pbXVtUGFzc3dvcmROb25MZXR0ZXIgPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmROb25MZXR0ZXIgOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgYWRtaW4ubWluaW11bVBhc3N3b3JkTm9uTGV0dGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFkbWluLm1pbmltdW1QYXNzd29yZE5vbkxldHRlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmVQYXNzd29yZFN1ZmZpY2llbnQoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgLy8gVGhpcyBBUEkgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IGFuIGFjdGl2ZSBkZXZpY2UgYWRtaW4sCiAgICAgICAgICAgICAvLyBzbyB0cnkgdG8gcmV0cmlldmUgaXQgdG8gY2hlY2sgdGhhdCB0aGUgY2FsbGVyIGlzIG9uZS4KICAgICAgICAgICAgIGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKG51bGwsCiAgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7Ci0gICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA+PSBnZXRQYXNzd29yZFF1YWxpdHkobnVsbCkKLSAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoID49IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChudWxsKTsKKyAgICAgICAgICAgIGlmIChtQWN0aXZlUGFzc3dvcmRRdWFsaXR5IDwgZ2V0UGFzc3dvcmRRdWFsaXR5KG51bGwpCisgICAgICAgICAgICAgICAgICAgIHx8IG1BY3RpdmVQYXNzd29yZExlbmd0aCA8IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChudWxsKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgIT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPj0gZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA+PSBnZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UobnVsbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycyA+PSBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZE51bWVyaWMgPj0gZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhudWxsKQorICAgICAgICAgICAgICAgICAgICAmJiBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID49IGdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMobnVsbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyID49IGdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihudWxsKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudEZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgLy8gVGhpcyBBUEkgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IGFuIGFjdGl2ZSBkZXZpY2UgYWRtaW4sCkBAIC02OTQsNyArMTEwNCw3IEBACiAgICAgICAgICAgICByZXR1cm4gbUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHM7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZShDb21wb25lbnROYW1lIHdobywgaW50IG51bSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgQVBJIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBhbiBhY3RpdmUgZGV2aWNlIGFkbWluLApAQCAtNzA5LDE2ICsxMTE5LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgaW50IGdldE1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlKENvbXBvbmVudE5hbWUgd2hvKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5tYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSA6IGNvdW50OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgICAgICBmb3IgIChpbnQgaT0wOyBpPE47IGkrKykgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CkBAIC03MzIsNyArMTE0Miw3IEBACiAgICAgICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgYm9vbGVhbiByZXNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCwgaW50IGZsYWdzKSB7CiAgICAgICAgIGludCBxdWFsaXR5OwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKQEAgLTc0MywxNCArMTE1MywxNSBAQAogICAgICAgICAgICAgcXVhbGl0eSA9IGdldFBhc3N3b3JkUXVhbGl0eShudWxsKTsKICAgICAgICAgICAgIGlmIChxdWFsaXR5ICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCkgewogICAgICAgICAgICAgICAgIGludCByZWFsUXVhbGl0eSA9IExvY2tQYXR0ZXJuVXRpbHMuY29tcHV0ZVBhc3N3b3JkUXVhbGl0eShwYXNzd29yZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxRdWFsaXR5IDwgcXVhbGl0eSkgeworICAgICAgICAgICAgICAgIGlmIChyZWFsUXVhbGl0eSA8IHF1YWxpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHF1YWxpdHkgIT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgpIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IHBhc3N3b3JkIHF1YWxpdHkgMHgiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHF1YWxpdHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgcXVhbGl0eSAweCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcocXVhbGl0eSkpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHF1YWxpdHkgPSByZWFsUXVhbGl0eTsKKyAgICAgICAgICAgICAgICBxdWFsaXR5ID0gTWF0aC5tYXgocmVhbFF1YWxpdHksIHF1YWxpdHkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaW50IGxlbmd0aCA9IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChudWxsKTsKICAgICAgICAgICAgIGlmIChwYXNzd29yZC5sZW5ndGgoKSA8IGxlbmd0aCkgewpAQCAtNzU4LDE0ICsxMTY5LDg2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBsZW5ndGggIiArIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHF1YWxpdHkgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGV0dGVycyA9IDA7CisgICAgICAgICAgICAgICAgaW50IHVwcGVyY2FzZSA9IDA7CisgICAgICAgICAgICAgICAgaW50IGxvd2VyY2FzZSA9IDA7CisgICAgICAgICAgICAgICAgaW50IG51bWJlcnMgPSAwOworICAgICAgICAgICAgICAgIGludCBzeW1ib2xzID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgbm9ubGV0dGVyID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhc3N3b3JkLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gcGFzc3dvcmQuY2hhckF0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyY2FzZSsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXR0ZXJzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcmNhc2UrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVycysrOworICAgICAgICAgICAgICAgICAgICAgICAgbm9ubGV0dGVyKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBub25sZXR0ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkTGV0dGVycyA9IGdldFBhc3N3b3JkTWluaW11bUxldHRlcnMobnVsbCk7CisgICAgICAgICAgICAgICAgaWYobGV0dGVycyA8IG5lZWRlZExldHRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiBsZXR0ZXJzICIgKyBsZXR0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIGxldHRlcnMgIiArIG5lZWRlZExldHRlcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWROdW1iZXJzID0gZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAobnVtYmVycyA8IG5lZWRlZE51bWJlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiBudW1lcmljYWwgZGlnaXRzICIgKyBudW1iZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBudW1iZXIgb2YgbnVtZXJpY2FsIGRpZ2l0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5lZWRlZE51bWJlcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWRMb3dlckNhc2UgPSBnZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKGxvd2VyY2FzZSA8IG5lZWRlZExvd2VyQ2FzZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogbnVtYmVyIG9mIGxvd2VyY2FzZSBsZXR0ZXJzICIgKyBsb3dlcmNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBudW1iZXIgb2YgbG93ZXJjYXNlIGxldHRlcnMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmVlZGVkTG93ZXJDYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkVXBwZXJDYXNlID0gZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKG51bGwpOworICAgICAgICAgICAgICAgIGlmICh1cHBlcmNhc2UgPCBuZWVkZWRVcHBlckNhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiB1cHBlcmNhc2UgbGV0dGVycyAiICsgdXBwZXJjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIHVwcGVyY2FzZSBsZXR0ZXJzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5lZWRlZFVwcGVyQ2FzZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG5lZWRlZFN5bWJvbHMgPSBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKG51bGwpOworICAgICAgICAgICAgICAgIGlmIChzeW1ib2xzIDwgbmVlZGVkU3ltYm9scykgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogbnVtYmVyIG9mIHNwZWNpYWwgc3ltYm9scyAiICsgc3ltYm9scworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIG51bWJlciBvZiBzcGVjaWFsIHN5bWJvbHMgIiArIG5lZWRlZFN5bWJvbHMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWROb25MZXR0ZXIgPSBnZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKG5vbmxldHRlciA8IG5lZWRlZE5vbkxldHRlcikgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogbnVtYmVyIG9mIG5vbi1sZXR0ZXIgY2hhcmFjdGVycyAiICsgbm9ubGV0dGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIG5vbi1sZXR0ZXIgY2hhcmFjdGVycyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZWVkZWROb25MZXR0ZXIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2NrUGF0dGVyblV0aWxzIHV0aWxzID0gbmV3IExvY2tQYXR0ZXJuVXRpbHMobUNvbnRleHQpOworICAgICAgICAgICAgaWYodXRpbHMuY2hlY2tQYXNzd29yZEhpc3RvcnkocGFzc3dvcmQpKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IHBhc3N3b3JkIGlzIHRoZSBzYW1lIGFzIG9uZSBvZiB0aGUgbGFzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChudWxsKSArICIgcGFzc3dvcmRzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGludCBjYWxsaW5nVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKICAgICAgICAgaWYgKG1QYXNzd29yZE93bmVyID49IDAgJiYgbVBhc3N3b3JkT3duZXIgIT0gY2FsbGluZ1VpZCkgewogICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IGFscmVhZHkgc2V0IGJ5IGFub3RoZXIgdWlkIGFuZCBub3QgZW50ZXJlZCBieSB1c2VyIik7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgLy8gRG9uJ3QgZG8gdGhpcyB3aXRoIHRoZSBsb2NrIGhlbGQsIGJlY2F1c2UgaXQgaXMgZ29pbmcgdG8gY2FsbAogICAgICAgICAvLyBiYWNrIGluIHRvIHRoZSBzZXJ2aWNlLgogICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CkBAIC03ODMsMTAgKzEyNjYsMTAgQEAKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtVGltZVRvTG9jayhDb21wb25lbnROYW1lIHdobywgbG9uZyB0aW1lTXMpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKQEAgLTc5NiwxNiArMTI3OSwxNiBAQAogICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfRk9SQ0VfTE9DSyk7CiAgICAgICAgICAgICBpZiAoYXAubWF4aW11bVRpbWVUb1VubG9jayAhPSB0aW1lTXMpIHsKICAgICAgICAgICAgICAgICBhcC5tYXhpbXVtVGltZVRvVW5sb2NrID0gdGltZU1zOwotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOwotICAgICAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgICAgICB0aW1lTXMgPSBnZXRNYXhpbXVtVGltZVRvTG9jayhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVNcyA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lTXMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SVBvd2VyTWFuYWdlcigpLnNldE1heGltdW1TY3JlZW5PZmZUaW1lb3VudCgoaW50KXRpbWVNcyk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CkBAIC04MTcsMTYgKzEzMDAsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBsb25nIGdldE1heGltdW1UaW1lVG9Mb2NrKENvbXBvbmVudE5hbWUgd2hvKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgbG9uZyB0aW1lID0gMDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5tYXhpbXVtVGltZVRvVW5sb2NrIDogdGltZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICAgICAgZm9yICAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOwpAQCAtODQwLDcgKzEzMjMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHRpbWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBsb2NrTm93KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgQVBJIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBhbiBhY3RpdmUgZGV2aWNlIGFkbWluLApAQCAtODU3LDcgKzEzNDAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgdm9pZCB3aXBlRGF0YUxvY2tlZChpbnQgZmxhZ3MpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFJlY292ZXJ5U3lzdGVtLnJlYm9vdFdpcGVVc2VyRGF0YShtQ29udGV4dCk7CkBAIC04NjUsNyArMTM0OCw3IEBACiAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRmFpbGVkIHJlcXVlc3RpbmcgZGF0YSB3aXBlIiwgZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCB3aXBlRGF0YShpbnQgZmxhZ3MpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAvLyBUaGlzIEFQSSBjYW4gb25seSBiZSBjYWxsZWQgYnkgYW4gYWN0aXZlIGRldmljZSBhZG1pbiwKQEAgLTg4MCwxMSArMTM2MywxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgZ2V0UmVtb3ZlV2FybmluZyhDb21wb25lbnROYW1lIGNvbXAsIGZpbmFsIFJlbW90ZUNhbGxiYWNrIHJlc3VsdCkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOLCBudWxsKTsKLSAgICAgICAgCisKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKGNvbXApOwogICAgICAgICAgICAgaWYgKGFkbWluID09IG51bGwpIHsKQEAgLTkwNywyMCArMTM5MCwzMCBAQAogICAgICAgICAgICAgfSwgbnVsbCwgQWN0aXZpdHkuUkVTVUxUX09LLCBudWxsLCBudWxsKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoKSB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoLCBpbnQgbGV0dGVycywgaW50IHVwcGVyY2FzZSwKKyAgICAgICAgICAgIGludCBsb3dlcmNhc2UsIGludCBudW1iZXJzLCBpbnQgc3ltYm9scywgaW50IG5vbmxldHRlcikgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOLCBudWxsKTsKLSAgICAgICAgCisKICAgICAgICAgdmFsaWRhdGVRdWFsaXR5Q29uc3RhbnQocXVhbGl0eSk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgIT0gcXVhbGl0eSB8fCBtQWN0aXZlUGFzc3dvcmRMZW5ndGggIT0gbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgIHx8IG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgfHwgbUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzICE9IGxldHRlcnMKKyAgICAgICAgICAgICAgICAgICAgfHwgbUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlICE9IHVwcGVyY2FzZQorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgIT0gbG93ZXJjYXNlIHx8IG1BY3RpdmVQYXNzd29yZE51bWVyaWMgIT0gbnVtYmVycworICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzICE9IHN5bWJvbHMgfHwgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyICE9IG5vbmxldHRlcikgewogICAgICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ID0gcXVhbGl0eTsKICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoID0gbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzID0gbGV0dGVyczsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlID0gbG93ZXJjYXNlOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPSB1cHBlcmNhc2U7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE51bWVyaWMgPSBudW1iZXJzOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID0gc3ltYm9sczsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyID0gbm9ubGV0dGVyOwogICAgICAgICAgICAgICAgICAgICBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOwogICAgICAgICAgICAgICAgICAgICBzZW5kQWRtaW5Db21tYW5kTG9ja2VkKERldmljZUFkbWluUmVjZWl2ZXIuQUNUSU9OX1BBU1NXT1JEX0NIQU5HRUQsCkBAIC05MzEsMTEgKzE0MjQsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHJlcG9ydEZhaWxlZFBhc3N3b3JkQXR0ZW1wdCgpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiwgbnVsbCk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICAgICAgdHJ5IHsKQEAgLTk1MiwxMSArMTQ0NSwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgcmVwb3J0U3VjY2Vzc2Z1bFBhc3N3b3JkQXR0ZW1wdCgpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiwgbnVsbCk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzICE9IDAgfHwgbVBhc3N3b3JkT3duZXIgPj0gMCkgewogICAgICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKQEAgLTk3Miw3ICsxNDY1LDk1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICBwdWJsaWMgQ29tcG9uZW50TmFtZSBzZXRHbG9iYWxQcm94eShDb21wb25lbnROYW1lIHdobywgU3RyaW5nIHByb3h5U3BlYywKKyAgICAgICAgICAgIFN0cmluZyBleGNsdXNpb25MaXN0KSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZKTsKKworICAgICAgICAgICAgLy8gU2NhbiB0aHJvdWdoIGFjdGl2ZSBhZG1pbnMgYW5kIGZpbmQgaWYgYW55b25lIGhhcyBhbHJlYWR5CisgICAgICAgICAgICAvLyBzZXQgdGhlIGdsb2JhbCBwcm94eS4KKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBTZXQ8Q29tcG9uZW50TmFtZT4gY29tcFNldCA9IG1BZG1pbk1hcC5rZXlTZXQoKTsKKyAgICAgICAgICAgIGZvciAgKENvbXBvbmVudE5hbWUgY29tcG9uZW50IDogY29tcFNldCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gbUFkbWluTWFwLmdldChjb21wb25lbnQpOworICAgICAgICAgICAgICAgIGlmICgoYXAuc3BlY2lmaWVzR2xvYmFsUHJveHkpICYmICghY29tcG9uZW50LmVxdWFscyh3aG8pKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBBbm90aGVyIGFkbWluIGFscmVhZHkgc2V0cyB0aGUgZ2xvYmFsIHByb3h5CisgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBpdCB0byB0aGUgY2FsbGVyLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcm94eVNwZWMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFkbWluLnNwZWNpZmllc0dsb2JhbFByb3h5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYWRtaW4uZ2xvYmFsUHJveHlTcGVjID0gbnVsbDsKKyAgICAgICAgICAgICAgICBhZG1pbi5nbG9iYWxQcm94eUV4Y2x1c2lvbkxpc3QgPSBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIGFkbWluLnNwZWNpZmllc0dsb2JhbFByb3h5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBhZG1pbi5nbG9iYWxQcm94eVNwZWMgPSBwcm94eVNwZWM7CisgICAgICAgICAgICAgICAgYWRtaW4uZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ID0gZXhjbHVzaW9uTGlzdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGdsb2JhbCBwcm94eSBhY2NvcmRpbmdseQorICAgICAgICAgICAgLy8gRG8gdGhpcyB1c2luZyBzeXN0ZW0gcGVybWlzc2lvbnMsIGFzIGFwcHMgY2Fubm90IHdyaXRlIHRvIHNlY3VyZSBzZXR0aW5ncworICAgICAgICAgICAgbG9uZyBvcmlnSWQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgICAgIHJlc2V0R2xvYmFsUHJveHkoKTsKKyAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KG9yaWdJZCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDb21wb25lbnROYW1lIGdldEdsb2JhbFByb3h5QWRtaW4oKSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICAvLyBTY2FuIHRocm91Z2ggYWN0aXZlIGFkbWlucyBhbmQgZmluZCBpZiBhbnlvbmUgaGFzIGFscmVhZHkKKyAgICAgICAgICAgIC8vIHNldCB0aGUgZ2xvYmFsIHByb3h5LgorICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoYXAuc3BlY2lmaWVzR2xvYmFsUHJveHkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGV2aWNlIGFkbWluIHNldHMgdGhlIGdsb2JhbCBwcm94eQorICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gaXQgdG8gdGhlIGNhbGxlci4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwLmluZm8uZ2V0Q29tcG9uZW50KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE5vIGRldmljZSBhZG1pbiBzZXRzIHRoZSBnbG9iYWwgcHJveHkuCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNldEdsb2JhbFByb3h5KCkgeworICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgIGlmIChhcC5zcGVjaWZpZXNHbG9iYWxQcm94eSkgeworICAgICAgICAgICAgICAgIHNhdmVHbG9iYWxQcm94eShhcC5nbG9iYWxQcm94eVNwZWMsIGFwLmdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE5vIGRldmljZSBhZG1pbnMgZGVmaW5pbmcgZ2xvYmFsIHByb3hpZXMgLSByZXNldCBnbG9iYWwgcHJveHkgc2V0dGluZ3MgdG8gbm9uZQorICAgICAgICBzYXZlR2xvYmFsUHJveHkobnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNhdmVHbG9iYWxQcm94eShTdHJpbmcgcHJveHlTcGVjLCBTdHJpbmcgZXhjbHVzaW9uTGlzdCkgeworICAgICAgICBpZiAoZXhjbHVzaW9uTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBleGNsdXNpb25MaXN0ID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb3h5U3BlYyA9PSBudWxsKSB7CisgICAgICAgICAgICBwcm94eVNwZWMgPSAiIjsKKyAgICAgICAgfQorICAgICAgICAvLyBSZW1vdmUgd2hpdGUgc3BhY2VzCisgICAgICAgIHByb3h5U3BlYyA9IHByb3h5U3BlYy50cmltKCk7CisgICAgICAgIGV4Y2x1c2lvbkxpc3QgPSBleGNsdXNpb25MaXN0LnRyaW0oKTsKKyAgICAgICAgQ29udGVudFJlc29sdmVyIHJlcyA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHJlcywgU2V0dGluZ3MuU2VjdXJlLkhUVFBfUFJPWFksIHByb3h5U3BlYyk7CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcocmVzLCBTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWV9FWENMVVNJT05fTElTVCwgZXhjbHVzaW9uTGlzdCk7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZHVtcChGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgcHcsIFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAgaWYgKG1Db250ZXh0LmNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkRVTVApCkBAIC05ODMsMTIgKzE1NjQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGZpbmFsIFByaW50ZXIgcCA9IG5ldyBQcmludFdyaXRlclByaW50ZXIocHcpOwotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIHAucHJpbnRsbigiQ3VycmVudCBEZXZpY2UgUG9saWN5IE1hbmFnZXIgc3RhdGU6Iik7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgcC5wcmludGxuKCIgIEVuYWJsZWQgRGV2aWNlIEFkbWluczoiKTsKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CkBAIC05OTksMTEgKzE1ODAsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgYXAuZHVtcCgiICAgICIsIHB3KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgcHcucHJpbnRsbigiICIpOwogICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eT0weCIpOwogICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKEludGVnZXIudG9IZXhTdHJpbmcobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSkpOwogICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZExlbmd0aCk7CisgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2U9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZT0iKTsgcHcucHJpbnRsbihtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycz0iKTsgcHcucHJpbnRsbihtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1BY3RpdmVQYXNzd29yZE51bWVyaWM9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyk7CisgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZFN5bWJvbHMpOworICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZE5vbkxldHRlcik7CiAgICAgICAgICAgICBwdy5wcmludCgiICBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cz0iKTsgcHcucHJpbnRsbihtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyk7CiAgICAgICAgICAgICBwdy5wcmludCgiICBtUGFzc3dvcmRPd25lcj0iKTsgcHcucHJpbnRsbihtUGFzc3dvcmRPd25lcik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0xvY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0xvY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCBhMzg5NzBmLi5hMzQzYzU5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Mb2NhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTG9jYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCkBAIC00NjUsMTAgKzQ2NSwxMSBAQAogICAgICAgICBtRW5hYmxlZFByb3ZpZGVycy5hZGQocGFzc2l2ZVByb3ZpZGVyLmdldE5hbWUoKSk7CiAKICAgICAgICAgLy8gaW5pdGlhbGl6ZSBleHRlcm5hbCBuZXR3b3JrIGxvY2F0aW9uIGFuZCBnZW9jb2RlciBzZXJ2aWNlcworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LiBnZXRQYWNrYWdlTWFuYWdlcigpOwogICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CiAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IHJlc291cmNlcy5nZXRTdHJpbmcoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29uZmlnX25ldHdvcmtMb2NhdGlvblByb3ZpZGVyKTsKLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwgJiYgcG0ucmVzb2x2ZVNlcnZpY2UobmV3IEludGVudChzZXJ2aWNlTmFtZSksIDApICE9IG51bGwpIHsKICAgICAgICAgICAgIG1OZXR3b3JrTG9jYXRpb25Qcm92aWRlciA9CiAgICAgICAgICAgICAgICAgbmV3IExvY2F0aW9uUHJvdmlkZXJQcm94eShtQ29udGV4dCwgTG9jYXRpb25NYW5hZ2VyLk5FVFdPUktfUFJPVklERVIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSwgbUxvY2F0aW9uSGFuZGxlcik7CkBAIC00NzYsNyArNDc3LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHNlcnZpY2VOYW1lID0gcmVzb3VyY2VzLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5jb25maWdfZ2VvY29kZVByb3ZpZGVyKTsKLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwgJiYgcG0ucmVzb2x2ZVNlcnZpY2UobmV3IEludGVudChzZXJ2aWNlTmFtZSksIDApICE9IG51bGwpIHsKICAgICAgICAgICAgIG1HZW9jb2RlUHJvdmlkZXIgPSBuZXcgR2VvY29kZXJQcm94eShtQ29udGV4dCwgc2VydmljZU5hbWUpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL01vdW50U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKaW5kZXggZmRlZDYyMy4uZDYwNDg4NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKQEAgLTEzNSw2ICsxMzUsOCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQm9vdGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWFkeSA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VuZFVtc0Nvbm5lY3RlZE9uQm9vdCA9IGZhbHNlOworICAgIC8vIHRydWUgaWYgd2Ugc2hvdWxkIGZha2UgTUVESUFfTU9VTlRFRCBzdGF0ZSBmb3IgZXh0ZXJuYWwgc3RvcmFnZQorICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW11bGF0ZUV4dGVybmFsU3RvcmFnZSA9IGZhbHNlOwogCiAgICAgLyoqCiAgICAgICogUHJpdmF0ZSBoYXNoIG9mIGN1cnJlbnRseSBtb3VudGVkIHNlY3VyZSBjb250YWluZXJzLgpAQCAtMzk1LDcgKzM5Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKS5nZXRQYXRoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0YXRlID0gZ2V0Vm9sdW1lU3RhdGUocGF0aCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZXF1YWxzKEVudmlyb25tZW50Lk1FRElBX1VOTU9VTlRFRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVtdWxhdGVFeHRlcm5hbFN0b3JhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5Vm9sdW1lU3RhdGVDaGFuZ2UobnVsbCwgcGF0aCwgVm9sdW1lU3RhdGUuTm9NZWRpYSwgVm9sdW1lU3RhdGUuTW91bnRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lcXVhbHMoRW52aXJvbm1lbnQuTUVESUFfVU5NT1VOVEVEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmMgPSBkb01vdW50Vm9sdW1lKHBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmMgIT0gU3RvcmFnZVJlc3VsdENvZGUuT3BlcmF0aW9uU3VjY2VlZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCBTdHJpbmcuZm9ybWF0KCJCb290LXRpbWUgbW91bnQgZmFpbGVkICglZCkiLCByYykpOwpAQCAtNDY2LDExICs0NzAsMTMgQEAKICAgICAgICAgICAgIFNsb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIkR1cGxpY2F0ZSBzdGF0ZSB0cmFuc2l0aW9uICglcyAtPiAlcykiLCBtTGVnYWN5U3RhdGUsIHN0YXRlKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgLy8gVXBkYXRlIHN0YXRlIG9uIFBhY2thZ2VNYW5hZ2VyCi0gICAgICAgIGlmIChFbnZpcm9ubWVudC5NRURJQV9VTk1PVU5URUQuZXF1YWxzKHN0YXRlKSkgewotICAgICAgICAgICAgbVBtcy51cGRhdGVFeHRlcm5hbE1lZGlhU3RhdHVzKGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoRW52aXJvbm1lbnQuTUVESUFfTU9VTlRFRC5lcXVhbHMoc3RhdGUpKSB7Ci0gICAgICAgICAgICBtUG1zLnVwZGF0ZUV4dGVybmFsTWVkaWFTdGF0dXModHJ1ZSwgZmFsc2UpOworICAgICAgICAvLyBVcGRhdGUgc3RhdGUgb24gUGFja2FnZU1hbmFnZXIsIGJ1dCBvbmx5IG9mIHJlYWwgZXZlbnRzCisgICAgICAgIGlmICghbUVtdWxhdGVFeHRlcm5hbFN0b3JhZ2UpIHsKKyAgICAgICAgICAgIGlmIChFbnZpcm9ubWVudC5NRURJQV9VTk1PVU5URUQuZXF1YWxzKHN0YXRlKSkgeworICAgICAgICAgICAgICAgIG1QbXMudXBkYXRlRXh0ZXJuYWxNZWRpYVN0YXR1cyhmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgfSBlbHNlIGlmIChFbnZpcm9ubWVudC5NRURJQV9NT1VOVEVELmVxdWFscyhzdGF0ZSkpIHsKKyAgICAgICAgICAgICAgICBtUG1zLnVwZGF0ZUV4dGVybmFsTWVkaWFTdGF0dXModHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIFN0cmluZyBvbGRTdGF0ZSA9IG1MZWdhY3lTdGF0ZTsKICAgICAgICAgbUxlZ2FjeVN0YXRlID0gc3RhdGU7CkBAIC05NzAsNiArOTc2LDEzIEBACiAgICAgcHVibGljIE1vdW50U2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogCisgICAgICAgIG1FbXVsYXRlRXh0ZXJuYWxTdG9yYWdlID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfZW11bGF0ZUV4dGVybmFsU3RvcmFnZSk7CisgICAgICAgIGlmIChtRW11bGF0ZUV4dGVybmFsU3RvcmFnZSkgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgInVzaW5nIGVtdWxhdGVkIGV4dGVybmFsIHN0b3JhZ2UiKTsKKyAgICAgICAgICAgIG1MZWdhY3lTdGF0ZSA9IEVudmlyb25tZW50Lk1FRElBX01PVU5URUQ7CisgICAgICAgIH0KKwogICAgICAgICAvLyBYWFg6IFRoaXMgd2lsbCBnbyBhd2F5IHNvb24gaW4gZmF2b3Igb2YgSU1vdW50U2VydmljZU9ic2VydmVyCiAgICAgICAgIG1QbXMgPSAoUGFja2FnZU1hbmFnZXJTZXJ2aWNlKSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKCJwYWNrYWdlIik7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05hdGl2ZURhZW1vbkNvbm5lY3Rvci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKaW5kZXggYzQ1MjU5MC4uMjQ5YzMyYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKQEAgLTEyOCwxMSArMTI4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCBTdHJpbmcuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgaGFuZGxpbmcgJyVzJyIsIGV2ZW50KSwgZXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNwb25zZVF1ZXVlLnB1dChldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byBwdXQgcmVzcG9uc2Ugb250byBxdWV1ZSIsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc3BvbnNlUXVldWUucHV0KGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsZWQgdG8gcHV0IHJlc3BvbnNlIG9udG8gcXVldWUiLCBleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiQmFkIG1zZyAoJXMpIiwgZXZlbnQpKTsKQEAgLTIwOSw2ICsyMTAsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQXJyYXlMaXN0PFN0cmluZz4gZG9Db21tYW5kKFN0cmluZyBjbWQpCiAgICAgICAgICAgICB0aHJvd3MgTmF0aXZlRGFlbW9uQ29ubmVjdG9yRXhjZXB0aW9uICB7CisgICAgICAgIG1SZXNwb25zZVF1ZXVlLmNsZWFyKCk7CiAgICAgICAgIHNlbmRDb21tYW5kKGNtZCk7CiAKICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcmVzcG9uc2UgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmphdmEKaW5kZXggYzE1NjE1MC4uY2I4ZmEzNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmphdmEKQEAgLTIwMywxMCArMjAzLDEwIEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVua25vd25Ib3N0RXhjZXB0aW9uKGFkZHJTdHJpbmcpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbnQgYSA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMF0pICAgICAgOwotICAgICAgICAgICAgaW50IGIgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzFdKSA8PCAgODsKLSAgICAgICAgICAgIGludCBjID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1syXSkgPDwgMTY7Ci0gICAgICAgICAgICBpbnQgZCA9IEludGVnZXIucGFyc2VJbnQocGFydHNbM10pIDw8IDI0OworICAgICAgICAgICAgaW50IGEgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzBdKSA8PCAyNDsKKyAgICAgICAgICAgIGludCBiID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1sxXSkgPDwgMTY7CisgICAgICAgICAgICBpbnQgYyA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMl0pIDw8ICA4OworICAgICAgICAgICAgaW50IGQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzNdKSAgICAgIDsKIAogICAgICAgICAgICAgcmV0dXJuIGEgfCBiIHwgYyB8IGQ7CiAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggZWQ4YjkwYi4uOWQyNjJiNiAxMDA3NTUKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ob3RpZmljYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCkBAIC02MSw2ICs2MSw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwpAQCAtMjgxLDYgKzI4MiwxMCBAQAogICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uRkxBR19GT1JFR1JPVU5EX1NFUlZJQ0UpOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgb25Ob3RpZmljYXRpb25DbGVhcihTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpIHsKKyAgICAgICAgICAgIGNhbmNlbE5vdGlmaWNhdGlvbihwa2csIHRhZywgaWQsIDAsIDApOyAvLyBtYXliZSBhZGQgc29tZSBmbGFncz8KKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFuZWxSZXZlYWxlZCgpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobU5vdGlmaWNhdGlvbkxpc3QpIHsKICAgICAgICAgICAgICAgICAvLyBzb3VuZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUGFja2FnZU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCBhYmY4YjdjLi4xYmZlYjc5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtOTQzNiw3ICs5NDM2LDggQEAKICAgICAqIFVwZGF0ZSBtZWRpYSBzdGF0dXMgb24gUGFja2FnZU1hbmFnZXIuCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUV4dGVybmFsTWVkaWFTdGF0dXMoZmluYWwgYm9vbGVhbiBtZWRpYVN0YXR1cywgZmluYWwgYm9vbGVhbiByZXBvcnRTdGF0dXMpIHsKLSAgICAgICBpZiAoQmluZGVyLmdldENhbGxpbmdVaWQoKSAhPSBQcm9jZXNzLlNZU1RFTV9VSUQpIHsKKyAgICAgICBpbnQgY2FsbGluZ1VpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CisgICAgICAgaWYgKGNhbGxpbmdVaWQgIT0gMCAmJiBjYWxsaW5nVWlkICE9IFByb2Nlc3MuU1lTVEVNX1VJRCkgewogICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIk1lZGlhIHN0YXR1cyBjYW4gb25seSBiZSB1cGRhdGVkIGJ5IHRoZSBzeXN0ZW0iKTsKICAgICAgICB9CiAgICAgICAgc3luY2hyb25pemVkIChtUGFja2FnZXMpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1NhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TYW1wbGluZ1Byb2ZpbGVyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YWY3ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TYW1wbGluZ1Byb2ZpbGVyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQub3MuRHJvcEJveE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5GaWxlT2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK3B1YmxpYyBjbGFzcyBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZSBleHRlbmRzIEJpbmRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMX0xPR1YgPSBmYWxzZTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTTkFQU0hPVF9ESVIgPSBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uU05BUFNIT1RfRElSOworCisgICAgcHJpdmF0ZSBGaWxlT2JzZXJ2ZXIgc25hcHNob3RPYnNlcnZlcjsKKworICAgIHB1YmxpYyBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmVnaXN0ZXJTZXR0aW5nT2JzZXJ2ZXIoY29udGV4dCk7CisgICAgICAgIHN0YXJ0V29ya2luZyhjb250ZXh0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRXb3JraW5nKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAoTE9DQUxfTE9HVikgU2xvZy52KFRBRywgInN0YXJ0aW5nIFNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlISIpOworCisgICAgICAgIGZpbmFsIERyb3BCb3hNYW5hZ2VyIGRyb3Bib3ggPQorICAgICAgICAgICAgICAgIChEcm9wQm94TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuRFJPUEJPWF9TRVJWSUNFKTsKKworICAgICAgICAvLyBiZWZvcmUgRmlsZU9ic2VydmVyIGlzIHJlYWR5LCB0aGVyZSBjb3VsZCBoYXZlIGFscmVhZHkgYmVlbiBzb21lIHNuYXBzaG90cworICAgICAgICAvLyBpbiB0aGUgZGlyZWN0b3J5LCB3ZSBkb24ndCB3YW50IHRvIG1pc3MgdGhlbQorICAgICAgICBGaWxlW10gc25hcHNob3RGaWxlcyA9IG5ldyBGaWxlKFNOQVBTSE9UX0RJUikubGlzdEZpbGVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBzbmFwc2hvdEZpbGVzICE9IG51bGwgJiYgaSA8IHNuYXBzaG90RmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGhhbmRsZVNuYXBzaG90RmlsZShzbmFwc2hvdEZpbGVzW2ldLCBkcm9wYm94KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRldGVjdCBuZXcgc25hcHNob3QgYW5kIHB1dCBpdCBpbiBkcm9wYm94CisgICAgICAgIC8vIGRlbGV0ZSBpdCBhZnRlcndhcmRzIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkIGJlZm9yZQorICAgICAgICAvLyBOb3RlOiBuZWVkcyBsaXN0ZW5pbmcgYXQgZXZlbnQgQVRUUklCIHJhdGhlciB0aGFuIENMT1NFX1dSSVRFLCBiZWNhdXNlIHdlIHNldCB0aGUKKyAgICAgICAgLy8gcmVhZGFiaWxpdHkgb2Ygc25hcHNob3QgZmlsZXMgYWZ0ZXIgd3JpdGluZyB0aGVtIQorICAgICAgICBzbmFwc2hvdE9ic2VydmVyID0gbmV3IEZpbGVPYnNlcnZlcihTTkFQU0hPVF9ESVIsIEZpbGVPYnNlcnZlci5BVFRSSUIpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25FdmVudChpbnQgZXZlbnQsIFN0cmluZyBwYXRoKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlU25hcHNob3RGaWxlKG5ldyBGaWxlKFNOQVBTSE9UX0RJUiwgcGF0aCksIGRyb3Bib3gpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBzbmFwc2hvdE9ic2VydmVyLnN0YXJ0V2F0Y2hpbmcoKTsKKworICAgICAgICBpZiAoTE9DQUxfTE9HVikgU2xvZy52KFRBRywgIlNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlIGFjdGl2YXRlZCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTbmFwc2hvdEZpbGUoRmlsZSBmaWxlLCBEcm9wQm94TWFuYWdlciBkcm9wYm94KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkcm9wYm94LmFkZEZpbGUoVEFHLCBmaWxlLCAwKTsKKyAgICAgICAgICAgIGlmIChMT0NBTF9MT0dWKSBTbG9nLnYoVEFHLCBmaWxlLmdldFBhdGgoKSArICIgYWRkZWQgdG8gZHJvcGJveCIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ2FuJ3QgYWRkICIgKyBmaWxlLmdldFBhdGgoKSArICIgdG8gZHJvcGJveCIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlclNldHRpbmdPYnNlcnZlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgIGNvbnRlbnRSZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcigKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0VXJpRm9yKFNldHRpbmdzLlNlY3VyZS5TQU1QTElOR19QUk9GSUxFUl9IWiksCisgICAgICAgICAgICAgICAgZmFsc2UsIG5ldyBTYW1wbGluZ1Byb2ZpbGVyU2V0dGluZ3NPYnNlcnZlcihjb250ZW50UmVzb2x2ZXIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdywgU3RyaW5nW10gYXJncykgeworICAgICAgICBwdy5wcmludGxuKCJTYW1wbGluZ1Byb2ZpbGVyU2VydmljZToiKTsKKyAgICAgICAgcHcucHJpbnRsbigiV2F0Y2hpbmcgZGlyZWN0b3J5OiAiICsgU05BUFNIT1RfRElSKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNhbXBsaW5nUHJvZmlsZXJTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAgICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKKyAgICAgICAgcHVibGljIFNhbXBsaW5nUHJvZmlsZXJTZXR0aW5nc09ic2VydmVyKENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKG51bGwpOworICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IGNvbnRlbnRSZXNvbHZlcjsKKyAgICAgICAgICAgIG9uQ2hhbmdlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICBJbnRlZ2VyIHNhbXBsaW5nUHJvZmlsZXJIeiA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoCisgICAgICAgICAgICAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIsIFNldHRpbmdzLlNlY3VyZS5TQU1QTElOR19QUk9GSUxFUl9IWiwgMCk7CisgICAgICAgICAgICAvLyBzZXR0aW5nIHRoaXMgc2VjdXJlIHByb3BlcnR5IHdpbGwgc3RhcnQgb3Igc3RvcCBzYW1wbGluZyBwcm9maWxlciwKKyAgICAgICAgICAgIC8vIGFzIHdlbGwgYXMgYWRqdXN0IHRoZSBmcmVxdWVuY3kgb2YgdGFraW5nIHNuYXBzaG90cy4KKyAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJwZXJzaXN0LnN5cy5wcm9maWxlcl9oeiIsIHNhbXBsaW5nUHJvZmlsZXJIei50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggNDE3NzQzMi4uNzE3YzMwOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TdGF0dXNCYXJNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC04NCw2ICs4NCw3IEBACiAgICAgICAgIHZvaWQgb25TZXREaXNhYmxlZChpbnQgc3RhdHVzKTsKICAgICAgICAgdm9pZCBvbkNsZWFyQWxsKCk7CiAgICAgICAgIHZvaWQgb25Ob3RpZmljYXRpb25DbGljayhTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpOworICAgICAgICB2b2lkIG9uTm90aWZpY2F0aW9uQ2xlYXIoU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkKTsKICAgICAgICAgdm9pZCBvblBhbmVsUmV2ZWFsZWQoKTsKICAgICAgICAgdm9pZCBvbk5vdGlmaWNhdGlvbkVycm9yKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCwKICAgICAgICAgICAgICAgICBpbnQgdWlkLCBpbnQgaW5pdGlhbFBpZCwgU3RyaW5nIG1lc3NhZ2UpOwpAQCAtMzAyLDYgKzMwMywxMiBAQAogICAgICAgICBtTm90aWZpY2F0aW9uQ2FsbGJhY2tzLm9uTm90aWZpY2F0aW9uRXJyb3IocGtnLCB0YWcsIGlkLCB1aWQsIGluaXRpYWxQaWQsIG1lc3NhZ2UpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIG9uTm90aWZpY2F0aW9uQ2xlYXIoU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkKSB7CisgICAgICAgIGVuZm9yY2VTdGF0dXNCYXJTZXJ2aWNlKCk7CisKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNhbGxiYWNrcy5vbk5vdGlmaWNhdGlvbkNsZWFyKHBrZywgdGFnLCBpZCk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgb25DbGVhckFsbE5vdGlmaWNhdGlvbnMoKSB7CiAgICAgICAgIGVuZm9yY2VTdGF0dXNCYXJTZXJ2aWNlKCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU3lzdGVtU2VydmVyLmphdmEKaW5kZXggMWEyMDllMi4uZDQ0Y2U5NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU3lzdGVtU2VydmVyLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU3lzdGVtU2VydmVyLmphdmEKQEAgLTI0LDI2ICsyNCwyNiBAQAogaW1wb3J0IGRhbHZpay5zeXN0ZW0uVk1SdW50aW1lOwogaW1wb3J0IGRhbHZpay5zeXN0ZW0uWnlnb3RlOwogCitpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TWFuYWdlclNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQub3MuKjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzLlBlb3BsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuQmx1ZXRvb3RoQTJkcFNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuQmx1ZXRvb3RoU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLnNlcnZlci5zZWFyY2guU2VhcmNoTWFuYWdlclNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwotaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1hbmFnZXJTZXJ2aWNlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKQEAgLTUxLDExICs1MSw4IEBACiAKIGNsYXNzIFNlcnZlclRocmVhZCBleHRlbmRzIFRocmVhZCB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTeXN0ZW1TZXJ2ZXIiOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gSU5DTFVERV9ERU1PID0gZmFsc2U7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0JPT1RfUFJPR1JFU1NfU1lTVEVNX1JVTiA9IDMwMTA7Ci0KLSAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOworICAgIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwogCiAgICAgcHJpdmF0ZSBjbGFzcyBBZGJTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKICAgICAgICAgcHVibGljIEFkYlNldHRpbmdzT2JzZXJ2ZXIoKSB7CkBAIC0yMTAsNiArMjA3LDcgQEAKICAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2Ugbm90aWZpY2F0aW9uID0gbnVsbDsKICAgICAgICAgV2FsbHBhcGVyTWFuYWdlclNlcnZpY2Ugd2FsbHBhcGVyID0gbnVsbDsKICAgICAgICAgTG9jYXRpb25NYW5hZ2VyU2VydmljZSBsb2NhdGlvbiA9IG51bGw7CisgICAgICAgIENvdW50cnlEZXRlY3RvclNlcnZpY2UgY291bnRyeURldGVjdG9yID0gbnVsbDsKIAogICAgICAgICBpZiAoZmFjdG9yeVRlc3QgIT0gU3lzdGVtU2VydmVyLkZBQ1RPUllfVEVTVF9MT1dfTEVWRUwpIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC0zMjAsNiArMzE4LDE0IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIkNvdW50cnkgRGV0ZWN0b3IiKTsKKyAgICAgICAgICAgICAgICBjb3VudHJ5RGV0ZWN0b3IgPSBuZXcgQ291bnRyeURldGVjdG9yU2VydmljZShjb250ZXh0KTsKKyAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKENvbnRleHQuQ09VTlRSWV9ERVRFQ1RPUiwgY291bnRyeURldGVjdG9yKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWx1cmUgc3RhcnRpbmcgQ291bnRyeSBEZXRlY3RvciIsIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJTZWFyY2ggU2VydmljZSIpOwogICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoQ29udGV4dC5TRUFSQ0hfU0VSVklDRSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZWFyY2hNYW5hZ2VyU2VydmljZShjb250ZXh0KSk7CkBAIC0zMjcsMTEgKzMzMyw2IEBACiAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWx1cmUgc3RhcnRpbmcgU2VhcmNoIFNlcnZpY2UiLCBlKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKElOQ0xVREVfREVNTykgewotICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJJbnN0YWxsaW5nIGRlbW8gZGF0YS4uLiIpOwotICAgICAgICAgICAgICAgIChuZXcgRGVtb1RocmVhZChjb250ZXh0KSkuc3RhcnQoKTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiRHJvcEJveCBTZXJ2aWNlIik7CiAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZShDb250ZXh0LkRST1BCT1hfU0VSVklDRSwKQEAgLTQxOCwxMCArNDE5LDIyIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBhZGQgdGhpcyBzZXJ2aWNlIGV2ZW4gaWYgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLmlzRW5hYmxlZCgpCisgICAgICAgICAgICAgICAgLy8gaXMgZmFsc2UsIGJlY2F1c2UgaXQgaXMgdGhpcyBzZXJ2aWNlIHRoYXQgZGV0ZWN0cyBzeXN0ZW0gcHJvcGVydHkgY2hhbmdlIGFuZAorICAgICAgICAgICAgICAgIC8vIHR1cm5zIG9uIFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi4gUGx1cywgd2hlbiBzYW1wbGluZyBwcm9maWxlciBkb2Vzbid0IHdvcmssCisgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgbGl0dGxlIG92ZXJoZWFkIGZvciBydW5uaW5nIHRoaXMgc2VydmljZS4KKyAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiU2FtcGxpbmdQcm9maWxlciBTZXJ2aWNlIik7CisgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZSgic2FtcGxpbmdwcm9maWxlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlKGNvbnRleHQpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWx1cmUgc3RhcnRpbmcgU2FtcGxpbmdQcm9maWxlciBTZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIlNpcCBTZXJ2aWNlIik7CiAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZSgic2lwIiwgbmV3IFNpcFNlcnZpY2UoY29udGV4dCkpOwogICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBEaXNrU3RhdHMgU2VydmljZSIsIGUpOworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsdXJlIHN0YXJ0aW5nIFNJUCBTZXJ2aWNlIiwgZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNDgzLDYgKzQ5Niw3IEBACiAgICAgICAgIGZpbmFsIElucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UgaW1tRiA9IGltbTsKICAgICAgICAgZmluYWwgUmVjb2duaXRpb25NYW5hZ2VyU2VydmljZSByZWNvZ25pdGlvbkYgPSByZWNvZ25pdGlvbjsKICAgICAgICAgZmluYWwgTG9jYXRpb25NYW5hZ2VyU2VydmljZSBsb2NhdGlvbkYgPSBsb2NhdGlvbjsKKyAgICAgICAgZmluYWwgQ291bnRyeURldGVjdG9yU2VydmljZSBjb3VudHJ5RGV0ZWN0b3JGID0gY291bnRyeURldGVjdG9yOwogCiAgICAgICAgIC8vIFdlIG5vdyB0ZWxsIHRoZSBhY3Rpdml0eSBtYW5hZ2VyIGl0IGlzIG9rYXkgdG8gcnVuIHRoaXJkIHBhcnR5CiAgICAgICAgIC8vIGNvZGUuICBJdCB3aWxsIGNhbGwgYmFjayBpbnRvIHVzIG9uY2UgaXQgaGFzIGdvdHRlbiB0byB0aGUgc3RhdGUKQEAgLTUxMCw2ICs1MjQsNyBAQAogICAgICAgICAgICAgICAgIGlmICh3YWxscGFwZXJGICE9IG51bGwpIHdhbGxwYXBlckYuc3lzdGVtUmVhZHkoKTsKICAgICAgICAgICAgICAgICBpZiAoaW1tRiAhPSBudWxsKSBpbW1GLnN5c3RlbVJlYWR5KCk7CiAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uRiAhPSBudWxsKSBsb2NhdGlvbkYuc3lzdGVtUmVhZHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoY291bnRyeURldGVjdG9yRiAhPSBudWxsKSBjb3VudHJ5RGV0ZWN0b3JGLnN5c3RlbVJlYWR5KCk7CiAgICAgICAgICAgICAgICAgaWYgKHRocm90dGxlRiAhPSBudWxsKSB0aHJvdHRsZUYuc3lzdGVtUmVhZHkoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CkBAIC01MTksMzcgKzUzNCw3IEBACiAgICAgfQogfQogCi1jbGFzcyBEZW1vVGhyZWFkIGV4dGVuZHMgVGhyZWFkCi17Ci0gICAgRGVtb1RocmVhZChDb250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDdXJzb3IgYyA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KFBlb3BsZS5DT05URU5UX1VSSSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBib29sZWFuIGhhc0RhdGEgPSBjICE9IG51bGwgJiYgYy5tb3ZlVG9GaXJzdCgpOwotICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGMuZGVhY3RpdmF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFoYXNEYXRhKSB7Ci0gICAgICAgICAgICAgICAgRGVtb0RhdGFTZXQgZGF0YXNldCA9IG5ldyBEZW1vRGF0YVNldCgpOwotICAgICAgICAgICAgICAgIGRhdGFzZXQuYWRkKG1Db250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIFNsb2cuZSgiU3lzdGVtU2VydmVyIiwgIkZhaWx1cmUgaW5zdGFsbGluZyBkZW1vIGRhdGEiLCBlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgQ29udGV4dCBtQ29udGV4dDsKLX0KLQotcHVibGljIGNsYXNzIFN5c3RlbVNlcnZlcgoteworcHVibGljIGNsYXNzIFN5c3RlbVNlcnZlciB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTeXN0ZW1TZXJ2ZXIiOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDVE9SWV9URVNUX09GRiA9IDA7CkBAIC01NzMsNyArNTU4LDcgQEAKICAgICAgICAgICAgIHRpbWVyLnNjaGVkdWxlKG5ldyBUaW1lclRhc2soKSB7CiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24ud3JpdGVTbmFwc2hvdCgic3lzdGVtX3NlcnZlciIpOworICAgICAgICAgICAgICAgICAgICBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24ud3JpdGVTbmFwc2hvdCgic3lzdGVtX3NlcnZlciIsIG51bGwpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0sIFNOQVBTSE9UX0lOVEVSVkFMLCBTTkFQU0hPVF9JTlRFUlZBTCk7CiAgICAgICAgIH0KQEAgLTU4MSw3ICs1NjYsNyBAQAogICAgICAgICAvLyBUaGUgc3lzdGVtIHNlcnZlciBoYXMgdG8gcnVuIGFsbCBvZiB0aGUgdGltZSwgc28gaXQgbmVlZHMgdG8gYmUKICAgICAgICAgLy8gYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlIHdpdGggaXRzIG1lbW9yeSB1c2FnZS4KICAgICAgICAgVk1SdW50aW1lLmdldFJ1bnRpbWUoKS5zZXRUYXJnZXRIZWFwVXRpbGl6YXRpb24oMC44Zik7Ci0gICAgICAgIAorCiAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiYW5kcm9pZF9zZXJ2ZXJzIik7CiAgICAgICAgIGluaXQxKGFyZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1RlbGVwaG9ueVJlZ2lzdHJ5LmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UZWxlcGhvbnlSZWdpc3RyeS5qYXZhCmluZGV4IDdlMjM0MjIuLjBhOTBhNGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1RlbGVwaG9ueVJlZ2lzdHJ5LmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVGVsZXBob255UmVnaXN0cnkuamF2YQpAQCAtMTksNyArMTksNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtVdGlsczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CkBAIC0zNSw2ICszNSw3IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5JQmF0dGVyeVN0YXRzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JVGVsZXBob255UmVnaXN0cnk7CkBAIC04OSw5ICs5MCw5IEBACiAKICAgICBwcml2YXRlIFN0cmluZyBtRGF0YUNvbm5lY3Rpb25BcG4gPSAiIjsKIAotICAgIHByaXZhdGUgU3RyaW5nW10gbURhdGFDb25uZWN0aW9uQXBuVHlwZXMgPSBudWxsOworICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbUNvbm5lY3RlZEFwbnM7CiAKLSAgICBwcml2YXRlIFN0cmluZyBtRGF0YUNvbm5lY3Rpb25JbnRlcmZhY2VOYW1lID0gIiI7CisgICAgcHJpdmF0ZSBMaW5rUHJvcGVydGllcyBtRGF0YUNvbm5lY3Rpb25Qcm9wZXJ0aWVzOwogCiAgICAgcHJpdmF0ZSBCdW5kbGUgbUNlbGxMb2NhdGlvbiA9IG5ldyBCdW5kbGUoKTsKIApAQCAtMTIxLDYgKzEyMiw3IEBACiAgICAgICAgIH0KICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtQmF0dGVyeVN0YXRzID0gQmF0dGVyeVN0YXRzU2VydmljZS5nZXRTZXJ2aWNlKCk7CisgICAgICAgIG1Db25uZWN0ZWRBcG5zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgbGlzdGVuKFN0cmluZyBwa2dGb3JEZWJ1ZywgSVBob25lU3RhdGVMaXN0ZW5lciBjYWxsYmFjaywgaW50IGV2ZW50cywKQEAgLTIzMywxOSArMjM1LDIwIEBACiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlDYWxsU3RhdGUoKSIpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1DYWxsU3RhdGUgPSBzdGF0ZTsKICAgICAgICAgICAgIG1DYWxsSW5jb21pbmdOdW1iZXIgPSBpbmNvbWluZ051bWJlcjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fQ0FMTF9TVEFURSkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkNhbGxTdGF0ZUNoYW5nZWQoc3RhdGUsIGluY29taW5nTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgIH0KICAgICAgICAgYnJvYWRjYXN0Q2FsbFN0YXRlQ2hhbmdlZChzdGF0ZSwgaW5jb21pbmdOdW1iZXIpOwogICAgIH0KQEAgLTI1Niw4ICsyNTksNyBAQAogICAgICAgICB9CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1TZXJ2aWNlU3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fU0VSVklDRV9TVEFURSkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kU2VydmljZVN0YXRlKHIsIHN0YXRlKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yNzAsMTAgKzI3MiwxMCBAQAogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5U2lnbmFsU3RyZW5ndGgoKSIpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1TaWduYWxTdHJlbmd0aCA9IHNpZ25hbFN0cmVuZ3RoOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1SZWNvcmRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgUmVjb3JkIHIgPSBtUmVjb3Jkcy5nZXQoaSk7CisgICAgICAgICAgICBmb3IgKFJlY29yZCByIDogbVJlY29yZHMpIHsKICAgICAgICAgICAgICAgICBpZiAoKHIuZXZlbnRzICYgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9TSUdOQUxfU1RSRU5HVEhTKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNlbmRTaWduYWxTdHJlbmd0aChyLCBzaWduYWxTdHJlbmd0aCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjgzLDEwICsyODUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25TaWduYWxTdHJlbmd0aENoYW5nZWQoKGdzbVNpZ25hbFN0cmVuZ3RoID09IDk5ID8gLTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnc21TaWduYWxTdHJlbmd0aCkpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShyLmJpbmRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0LmFkZChyLmJpbmRlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKElCaW5kZXIgYiA6IHJlbW92ZUxpc3QpIHJlbW92ZShiKTsKICAgICAgICAgfQogICAgICAgICBicm9hZGNhc3RTaWduYWxTdHJlbmd0aENoYW5nZWQoc2lnbmFsU3RyZW5ndGgpOwogICAgIH0KQEAgLTI5NSwxOCArMjk4LDE5IEBACiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlNZXNzYWdlV2FpdGluZ0NoYW5nZWQoKSIpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1NZXNzYWdlV2FpdGluZyA9IG13aTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fTUVTU0FHRV9XQUlUSU5HX0lORElDQVRPUikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbk1lc3NhZ2VXYWl0aW5nSW5kaWNhdG9yQ2hhbmdlZChtd2kpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShyLmJpbmRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0LmFkZChyLmJpbmRlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKElCaW5kZXIgYiA6IHJlbW92ZUxpc3QpIHJlbW92ZShiKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzE0LDE4ICszMTgsMTkgQEAKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeUNhbGxGb3J3YXJkaW5nQ2hhbmdlZCgpIikpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICBBcnJheUxpc3Q8SUJpbmRlcj4gcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3Q8SUJpbmRlcj4oKTsKICAgICAgICAgc3luY2hyb25pemVkIChtUmVjb3JkcykgewogICAgICAgICAgICAgbUNhbGxGb3J3YXJkaW5nID0gY2ZpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1SZWNvcmRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgUmVjb3JkIHIgPSBtUmVjb3Jkcy5nZXQoaSk7CisgICAgICAgICAgICBmb3IgKFJlY29yZCByIDogbVJlY29yZHMpIHsKICAgICAgICAgICAgICAgICBpZiAoKHIuZXZlbnRzICYgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9DQUxMX0ZPUldBUkRJTkdfSU5ESUNBVE9SKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByLmNhbGxiYWNrLm9uQ2FsbEZvcndhcmRpbmdJbmRpY2F0b3JDaGFuZ2VkKGNmaSk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSUJpbmRlciBiIDogcmVtb3ZlTGlzdCkgcmVtb3ZlKGIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zMzMsNTcgKzMzOCw4MSBAQAogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5RGF0YUFjdGl2aXR5KCkiICkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICBBcnJheUxpc3Q8SUJpbmRlcj4gcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3Q8SUJpbmRlcj4oKTsKICAgICAgICAgc3luY2hyb25pemVkIChtUmVjb3JkcykgewogICAgICAgICAgICAgbURhdGFBY3Rpdml0eSA9IHN0YXRlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1SZWNvcmRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgUmVjb3JkIHIgPSBtUmVjb3Jkcy5nZXQoaSk7CisgICAgICAgICAgICBmb3IgKFJlY29yZCByIDogbVJlY29yZHMpIHsKICAgICAgICAgICAgICAgICBpZiAoKHIuZXZlbnRzICYgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9EQVRBX0FDVElWSVRZKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByLmNhbGxiYWNrLm9uRGF0YUFjdGl2aXR5KHN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihpbnQgc3RhdGUsIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUsCi0gICAgICAgICAgICBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuLCBTdHJpbmdbXSBhcG5UeXBlcywgU3RyaW5nIGludGVyZmFjZU5hbWUsIGludCBuZXR3b3JrVHlwZSwKLSAgICAgICAgICAgIFN0cmluZyBnYXRld2F5KSB7CisgICAgICAgICAgICBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuLCBTdHJpbmcgYXBuVHlwZSwgTGlua1Byb3BlcnRpZXMgbGlua1Byb3BlcnRpZXMsCisgICAgICAgICAgICBpbnQgbmV0d29ya1R5cGUpIHsKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeURhdGFDb25uZWN0aW9uKCkiICkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7Ci0gICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25TdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKHN0YXRlID09IFRlbGVwaG9ueU1hbmFnZXIuREFUQV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1Db25uZWN0ZWRBcG5zLmNvbnRhaW5zKGFwblR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0ZWRBcG5zLmFkZChhcG5UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhQ29ubmVjdGlvblN0YXRlICE9IHN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25TdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGVkQXBucy5yZW1vdmUoYXBuVHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0ZWRBcG5zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25TdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbGVhdmUgbURhdGFDb25uZWN0aW9uU3RhdGUgYXMgaXMgYW5kCisgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgb3V0IHRoZSBuZXcgc3RhdHVzIGZvciB0aGUgQVBOIGluIHF1ZXN0aW9uLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvblBvc3NpYmxlID0gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGU7CiAgICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25SZWFzb24gPSByZWFzb247CiAgICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25BcG4gPSBhcG47Ci0gICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25BcG5UeXBlcyA9IGFwblR5cGVzOwotICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uSW50ZXJmYWNlTmFtZSA9IGludGVyZmFjZU5hbWU7Ci0gICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25OZXR3b3JrVHlwZSA9IG5ldHdvcmtUeXBlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1SZWNvcmRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgUmVjb3JkIHIgPSBtUmVjb3Jkcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fREFUQV9DT05ORUNUSU9OX1NUQVRFKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByLmNhbGxiYWNrLm9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoc3RhdGUsIG5ldHdvcmtUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uUHJvcGVydGllcyA9IGxpbmtQcm9wZXJ0aWVzOworICAgICAgICAgICAgaWYgKG1EYXRhQ29ubmVjdGlvbk5ldHdvcmtUeXBlICE9IG5ldHdvcmtUeXBlKSB7CisgICAgICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uTmV0d29ya1R5cGUgPSBuZXR3b3JrVHlwZTsKKyAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobW9kaWZpZWQpIHsKKyAgICAgICAgICAgICAgICBBcnJheUxpc3Q8SUJpbmRlcj4gcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3Q8SUJpbmRlcj4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKFJlY29yZCByIDogbVJlY29yZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fREFUQV9DT05ORUNUSU9OX1NUQVRFKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChzdGF0ZSwgbmV0d29ya1R5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoSUJpbmRlciBiIDogcmVtb3ZlTGlzdCkgcmVtb3ZlKGIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGJyb2FkY2FzdERhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkKHN0YXRlLCBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSwgcmVhc29uLCBhcG4sCi0gICAgICAgICAgICAgICAgYXBuVHlwZXMsIGludGVyZmFjZU5hbWUsIGdhdGV3YXkpOworICAgICAgICAgICAgICAgIGFwblR5cGUsIGxpbmtQcm9wZXJ0aWVzKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIC8qCi0gICAgICAgICAqIFRoaXMgaXMgY29tbWVudGVkIG91dCBiZWNhdXNlIHRoZXJlIGlzIG9uIG9uRGF0YUNvbm5lY3Rpb25GYWlsZWQgY2FsbGJhY2sKLSAgICAgICAgICogb24gUGhvbmVTdGF0ZUxpc3RlbmVyLiBUaGVyZSBzaG91bGQgYmUKKyAgICAgICAgICogVGhpcyBpcyBjb21tZW50ZWQgb3V0IGJlY2F1c2UgdGhlcmUgaXMgbm8gb25EYXRhQ29ubmVjdGlvbkZhaWxlZCBjYWxsYmFjaworICAgICAgICAgKiBpbiBQaG9uZVN0YXRlTGlzdGVuZXIuIFRoZXJlIHNob3VsZCBiZS4KICAgICAgICAgc3luY2hyb25pemVkIChtUmVjb3JkcykgewogICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uRmFpbGVkUmVhc29uID0gcmVhc29uOwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtUmVjb3Jkcy5zaXplKCk7CkBAIC0zOTUsNyArNDI0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAqLwotICAgICAgICBicm9hZGNhc3REYXRhQ29ubmVjdGlvbkZhaWxlZChyZWFzb24pOworICAgICAgICBicm9hZGNhc3REYXRhQ29ubmVjdGlvbkZhaWxlZChyZWFzb24sIGFwblR5cGUpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNlbGxMb2NhdGlvbihCdW5kbGUgY2VsbExvY2F0aW9uKSB7CkBAIC00MDQsOCArNDMzLDcgQEAKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtQ2VsbExvY2F0aW9uID0gY2VsbExvY2F0aW9uOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1SZWNvcmRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgUmVjb3JkIHIgPSBtUmVjb3Jkcy5nZXQoaSk7CisgICAgICAgICAgICBmb3IgKFJlY29yZCByIDogbVJlY29yZHMpIHsKICAgICAgICAgICAgICAgICBpZiAoKHIuZXZlbnRzICYgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9DRUxMX0xPQ0FUSU9OKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNlbmRDZWxsTG9jYXRpb24ociwgY2VsbExvY2F0aW9uKTsKICAgICAgICAgICAgICAgICB9CkBAIC00MTYsNyArNDQ0LDcgQEAKICAgICAvKioKICAgICAgKiBDb3B5IHRoZSBzZXJ2aWNlIHN0YXRlIG9iamVjdCBzbyB0aGV5IGNhbid0IG1lc3MgaXQgdXAgaW4gdGhlIGxvY2FsIGNhbGxzCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2VuZFNlcnZpY2VTdGF0ZShSZWNvcmQgciwgU2VydmljZVN0YXRlIHN0YXRlKSB7CisgICAgcHJpdmF0ZSB2b2lkIHNlbmRTZXJ2aWNlU3RhdGUoUmVjb3JkIHIsIFNlcnZpY2VTdGF0ZSBzdGF0ZSkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgci5jYWxsYmFjay5vblNlcnZpY2VTdGF0ZUNoYW5nZWQobmV3IFNlcnZpY2VTdGF0ZShzdGF0ZSkpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKQEAgLTQ2MiwxMSArNDkwLDEwIEBACiAgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EYXRhQ29ubmVjdGlvblBvc3NpYmxlPSIgKyBtRGF0YUNvbm5lY3Rpb25Qb3NzaWJsZSk7CiAgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EYXRhQ29ubmVjdGlvblJlYXNvbj0iICsgbURhdGFDb25uZWN0aW9uUmVhc29uKTsKICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbURhdGFDb25uZWN0aW9uQXBuPSIgKyBtRGF0YUNvbm5lY3Rpb25BcG4pOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGF0YUNvbm5lY3Rpb25JbnRlcmZhY2VOYW1lPSIgKyBtRGF0YUNvbm5lY3Rpb25JbnRlcmZhY2VOYW1lKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbURhdGFDb25uZWN0aW9uUHJvcGVydGllcz0iICsgbURhdGFDb25uZWN0aW9uUHJvcGVydGllcyk7CiAgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1DZWxsTG9jYXRpb249IiArIG1DZWxsTG9jYXRpb24pOwogICAgICAgICAgICAgcHcucHJpbnRsbigicmVnaXN0cmF0aW9uczogY291bnQ9IiArIHJlY29yZENvdW50KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVjb3JkQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAiICsgci5wa2dGb3JEZWJ1ZyArICIgMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhyLmV2ZW50cykpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MzcsNyArNTY0LDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBicm9hZGNhc3REYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChpbnQgc3RhdGUsCiAgICAgICAgICAgICBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlLAotICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgU3RyaW5nW10gYXBuVHlwZXMsIFN0cmluZyBpbnRlcmZhY2VOYW1lLCBTdHJpbmcgZ2F0ZXdheSkgeworICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgU3RyaW5nIGFwblR5cGUsIExpbmtQcm9wZXJ0aWVzIGxpbmtQcm9wZXJ0aWVzKSB7CiAgICAgICAgIC8vIE5vdGU6IG5vdCByZXBvcnRpbmcgdG8gdGhlIGJhdHRlcnkgc3RhdHMgc2VydmljZSBoZXJlLCBiZWNhdXNlIHRoZQogICAgICAgICAvLyBzdGF0dXMgYmFyIHRha2VzIGNhcmUgb2YgdGhhdCBhZnRlciB0YWtpbmcgaW50byBhY2NvdW50IGFsbCBvZiB0aGUKICAgICAgICAgLy8gcmVxdWlyZWQgaW5mby4KQEAgLTU1MCwyOSArNTc3LDIzIEBACiAgICAgICAgIGlmIChyZWFzb24gIT0gbnVsbCkgewogICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLlNUQVRFX0NIQU5HRV9SRUFTT05fS0VZLCByZWFzb24pOwogICAgICAgICB9Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0FQTl9LRVksIGFwbik7Ci0gICAgICAgIFN0cmluZyB0eXBlcyA9IG5ldyBTdHJpbmcoIiIpOwotICAgICAgICBpZiAoYXBuVHlwZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgdHlwZXMgPSBhcG5UeXBlc1swXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXBuVHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0eXBlcyA9IHR5cGVzKyIsIithcG5UeXBlc1tpXTsKKyAgICAgICAgaWYgKGxpbmtQcm9wZXJ0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0xJTktfUFJPUEVSVElFU19LRVksIGxpbmtQcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgIE5ldHdvcmtJbnRlcmZhY2UgaWZhY2UgPSBsaW5rUHJvcGVydGllcy5nZXRJbnRlcmZhY2UoKTsKKyAgICAgICAgICAgIGlmIChpZmFjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfSUZBQ0VfTkFNRV9LRVksIGlmYWNlLmdldE5hbWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVTX0tFWSwgdHlwZXMpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9JRkFDRV9OQU1FX0tFWSwgaW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgIGludCBnYXRld2F5QWRkciA9IDA7Ci0gICAgICAgIGlmIChnYXRld2F5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdhdGV3YXlBZGRyID0gTmV0d29ya1V0aWxzLnY0U3RyaW5nVG9JbnQoZ2F0ZXdheSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfR0FURVdBWV9LRVksIGdhdGV3YXlBZGRyKTsKLQorICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZLCBhcG4pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRV9LRVksIGFwblR5cGUpOwogICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGJyb2FkY2FzdERhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24pIHsKKyAgICBwcml2YXRlIHZvaWQgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVGVsZXBob255SW50ZW50cy5BQ1RJT05fREFUQV9DT05ORUNUSU9OX0ZBSUxFRCk7CiAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRVBMQUNFX1BFTkRJTkcpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuRkFJTFVSRV9SRUFTT05fS0VZLCByZWFzb24pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRV9LRVksIGFwblR5cGUpOwogICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Rocm90dGxlU2VydmljZS5qYXZhCmluZGV4IGE5M2E2ZWUuLmQ4NDFjYjMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Rocm90dGxlU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Rocm90dGxlU2VydmljZS5qYXZhCkBAIC02MCw2ICs2MCw4IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKIGltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKQEAgLTgzLDggKzg1LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRFU1RJTkdfVEhSRVNIT0xEID0gMSAqIDEwMjQgKiAxMDI0OwogCiAgICAgcHJpdmF0ZSBpbnQgbVBvbGljeVBvbGxQZXJpb2RTZWM7Ci0gICAgcHJpdmF0ZSBsb25nIG1Qb2xpY3lUaHJlc2hvbGQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVBvbGljeVRocm90dGxlVmFsdWU7CisgICAgcHJpdmF0ZSBBdG9taWNMb25nIG1Qb2xpY3lUaHJlc2hvbGQ7CisgICAgcHJpdmF0ZSBBdG9taWNJbnRlZ2VyIG1Qb2xpY3lUaHJvdHRsZVZhbHVlOwogICAgIHByaXZhdGUgaW50IG1Qb2xpY3lSZXNldERheTsgLy8gMS0yOAogICAgIHByaXZhdGUgaW50IG1Qb2xpY3lOb3RpZmljYXRpb25zQWxsb3dlZE1hc2s7CiAKQEAgLTExNCw3ICsxMTYsNyBAQAogICAgIHByaXZhdGUgSW50ZXJmYWNlT2JzZXJ2ZXIgbUludGVyZmFjZU9ic2VydmVyOwogICAgIHByaXZhdGUgU2V0dGluZ3NPYnNlcnZlciBtU2V0dGluZ3NPYnNlcnZlcjsKIAotICAgIHByaXZhdGUgaW50IG1UaHJvdHRsZUluZGV4OyAvLyAwIGZvciBub25lLCAxIGZvciBmaXJzdCB0aHJvdHRsZSB2YWwsIDIgZm9yIG5leHQsIGV0YworICAgIHByaXZhdGUgQXRvbWljSW50ZWdlciBtVGhyb3R0bGVJbmRleDsgLy8gMCBmb3Igbm9uZSwgMSBmb3IgZmlyc3QgdGhyb3R0bGUgdmFsLCAyIGZvciBuZXh0LCBldGMKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEhST1RUTEVfSU5ERVhfVU5JTklUSUFMSVpFRCA9IC0xOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRCAgID0gIDA7CiAKQEAgLTEyNiw2ICsxMjgsMTAgQEAKICAgICAgICAgaWYgKFZEQkcpIFNsb2cudihUQUcsICJTdGFydGluZyBUaHJvdHRsZVNlcnZpY2UiKTsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogCisgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQgPSBuZXcgQXRvbWljTG9uZygpOworICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZSA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKwogICAgICAgICBtTnRwQWN0aXZlID0gZmFsc2U7CiAKICAgICAgICAgbUlmYWNlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmNvbmZpZ19kYXRhdXNlX2lmYWNlKTsKQEAgLTIxNCw3ICsyMjAsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgbG9uZyBudHBUb1dhbGxUaW1lKGxvbmcgbnRwVGltZSkgewotICAgICAgICBsb25nIGJlc3ROb3cgPSBnZXRCZXN0VGltZSgpOworICAgICAgICBsb25nIGJlc3ROb3cgPSBnZXRCZXN0VGltZSh0cnVlKTsgLy8gZG8gaXQgcXVpY2tseQogICAgICAgICBsb25nIGxvY2FsTm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgIHJldHVybiBsb2NhbE5vdyArIChudHBUaW1lIC0gYmVzdE5vdyk7CiAgICAgfQpAQCAtMjIyLDQwICsyMjgsNDIgQEAKICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQogICAgIC8vIHJldHVybiB0aW1lIGluIHRoZSBsb2NhbCwgc3lzdGVtIHdhbGwgdGltZSwgY29ycmVjdGluZyBmb3IgdGhlIHVzZSBvZiBudHAKIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRSZXNldFRpbWUoU3RyaW5nIGlmYWNlKSB7CisgICAgcHVibGljIGxvbmcgZ2V0UmVzZXRUaW1lKFN0cmluZyBpZmFjZSkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBsb25nIHJlc2V0VGltZSA9IDA7CiAgICAgICAgIGlmIChtUmVjb3JkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzZXRUaW1lID0gbnRwVG9XYWxsVGltZShtUmVjb3JkZXIuZ2V0UGVyaW9kRW5kKCkpOworICAgICAgICAgICAgcmVzZXRUaW1lID0gbVJlY29yZGVyLmdldFBlcmlvZEVuZCgpOwogICAgICAgICB9CisgICAgICAgIHJlc2V0VGltZSA9IG50cFRvV2FsbFRpbWUocmVzZXRUaW1lKTsKICAgICAgICAgcmV0dXJuIHJlc2V0VGltZTsKICAgICB9CiAKICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQogICAgIC8vIHJldHVybiB0aW1lIGluIHRoZSBsb2NhbCwgc3lzdGVtIHdhbGwgdGltZSwgY29ycmVjdGluZyBmb3IgdGhlIHVzZSBvZiBudHAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0UGVyaW9kU3RhcnRUaW1lKFN0cmluZyBpZmFjZSkgewotICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOworICAgIHB1YmxpYyBsb25nIGdldFBlcmlvZFN0YXJ0VGltZShTdHJpbmcgaWZhY2UpIHsKICAgICAgICAgbG9uZyBzdGFydFRpbWUgPSAwOworICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBpZiAobVJlY29yZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0YXJ0VGltZSA9IG50cFRvV2FsbFRpbWUobVJlY29yZGVyLmdldFBlcmlvZFN0YXJ0KCkpOworICAgICAgICAgICAgc3RhcnRUaW1lID0gbVJlY29yZGVyLmdldFBlcmlvZFN0YXJ0KCk7CiAgICAgICAgIH0KKyAgICAgICAgc3RhcnRUaW1lID0gbnRwVG9XYWxsVGltZShzdGFydFRpbWUpOwogICAgICAgICByZXR1cm4gc3RhcnRUaW1lOwogICAgIH0KICAgICAvL1RPRE8gLSBhIGJldHRlciBuYW1lPyAgZ2V0Q2xpZmZCeXRlQ291bnRUaHJlc2hvbGQ/CiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0Q2xpZmZUaHJlc2hvbGQoU3RyaW5nIGlmYWNlLCBpbnQgY2xpZmYpIHsKKyAgICBwdWJsaWMgbG9uZyBnZXRDbGlmZlRocmVzaG9sZChTdHJpbmcgaWZhY2UsIGludCBjbGlmZikgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBpZiAoY2xpZmYgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJlc2hvbGQ7CisgICAgICAgICAgIHJldHVybiBtUG9saWN5VGhyZXNob2xkLmdldCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICAvLyBUT0RPIC0gYSBiZXR0ZXIgbmFtZT8gZ2V0VGhyb3R0bGVSYXRlPwogICAgIC8vIFRPRE8gLSBmZXRjaCBmb3IgdGhlIGlmYWNlCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0Q2xpZmZMZXZlbChTdHJpbmcgaWZhY2UsIGludCBjbGlmZikgeworICAgIHB1YmxpYyBpbnQgZ2V0Q2xpZmZMZXZlbChTdHJpbmcgaWZhY2UsIGludCBjbGlmZikgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBpZiAoY2xpZmYgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJvdHRsZVZhbHVlOworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTI2NywxMCArMjc1LDkgQEAKICAgICB9CiAKICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRCeXRlQ291bnQoU3RyaW5nIGlmYWNlLCBpbnQgZGlyLCBpbnQgcGVyaW9kLCBpbnQgYWdvKSB7CisgICAgcHVibGljIGxvbmcgZ2V0Qnl0ZUNvdW50KFN0cmluZyBpZmFjZSwgaW50IGRpciwgaW50IHBlcmlvZCwgaW50IGFnbykgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICBpZiAoKHBlcmlvZCA9PSBUaHJvdHRsZU1hbmFnZXIuUEVSSU9EX0NZQ0xFKSAmJgotICAgICAgICAgICAgICAgIChtUmVjb3JkZXIgIT0gbnVsbCkpIHsKKyAgICAgICAgaWYgKChwZXJpb2QgPT0gVGhyb3R0bGVNYW5hZ2VyLlBFUklPRF9DWUNMRSkgJiYgKG1SZWNvcmRlciAhPSBudWxsKSkgewogICAgICAgICAgICAgaWYgKGRpciA9PSBUaHJvdHRsZU1hbmFnZXIuRElSRUNUSU9OX1RYKSByZXR1cm4gbVJlY29yZGVyLmdldFBlcmlvZFR4KGFnbyk7CiAgICAgICAgICAgICBpZiAoZGlyID09IFRocm90dGxlTWFuYWdlci5ESVJFQ1RJT05fUlgpIHJldHVybiBtUmVjb3JkZXIuZ2V0UGVyaW9kUngoYWdvKTsKICAgICAgICAgfQpAQCAtMjc5LDEwICsyODYsMTAgQEAKIAogICAgIC8vIFRPRE8gLSBhIGJldHRlciBuYW1lIC0gZ2V0Q3VycmVudFRocm90dGxlUmF0ZT8KICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFRocm90dGxlKFN0cmluZyBpZmFjZSkgeworICAgIHB1YmxpYyBpbnQgZ2V0VGhyb3R0bGUoU3RyaW5nIGlmYWNlKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIGlmIChtVGhyb3R0bGVJbmRleCA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeVRocm90dGxlVmFsdWU7CisgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleC5nZXQoKSA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMzA1LDIyICszMTIsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0sIG5ldyBJbnRlbnRGaWx0ZXIoQUNUSU9OX1JFU0VUKSk7CiAKLSAgICAgICAgLy8gdXNlIGEgbmV3IHRocmVhZCBhcyB3ZSBkb24ndCB3YW50IHRvIHN0YWxsIHRoZSBzeXN0ZW0gZm9yIGZpbGUgd3JpdGVzCi0gICAgICAgIG1UaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZChUQUcpOwotICAgICAgICBtVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihtVGhyZWFkLmdldExvb3BlcigpKTsKLSAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9SRUJPT1RfUkVDT1ZFUlkpLnNlbmRUb1RhcmdldCgpOwotCi0gICAgICAgIG1JbnRlcmZhY2VPYnNlcnZlciA9IG5ldyBJbnRlcmZhY2VPYnNlcnZlcihtSGFuZGxlciwgRVZFTlRfSUZBQ0VfVVAsIG1JZmFjZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtTk1TZXJ2aWNlLnJlZ2lzdGVyT2JzZXJ2ZXIobUludGVyZmFjZU9ic2VydmVyKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICJDb3VsZCBub3QgcmVnaXN0ZXIgSW50ZXJmYWNlT2JzZXJ2ZXIgIiArIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXIgPSBuZXcgU2V0dGluZ3NPYnNlcnZlcihtSGFuZGxlciwgRVZFTlRfUE9MSUNZX0NIQU5HRUQpOwotICAgICAgICBtU2V0dGluZ3NPYnNlcnZlci5vYnNlcnZlKG1Db250ZXh0KTsKLQogICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CkBAIC0zMzcsNiArMzI4LDIyIEBACiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICAvLyB1c2UgYSBuZXcgdGhyZWFkIGFzIHdlIGRvbid0IHdhbnQgdG8gc3RhbGwgdGhlIHN5c3RlbSBmb3IgZmlsZSB3cml0ZXMKKyAgICAgICAgbVRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKFRBRyk7CisgICAgICAgIG1UaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbUhhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKG1UaHJlYWQuZ2V0TG9vcGVyKCkpOworICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKEVWRU5UX1JFQk9PVF9SRUNPVkVSWSkuc2VuZFRvVGFyZ2V0KCk7CisKKyAgICAgICAgbUludGVyZmFjZU9ic2VydmVyID0gbmV3IEludGVyZmFjZU9ic2VydmVyKG1IYW5kbGVyLCBFVkVOVF9JRkFDRV9VUCwgbUlmYWNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1OTVNlcnZpY2UucmVnaXN0ZXJPYnNlcnZlcihtSW50ZXJmYWNlT2JzZXJ2ZXIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCByZWdpc3RlciBJbnRlcmZhY2VPYnNlcnZlciAiICsgZSk7CisgICAgICAgIH0KKworICAgICAgICBtU2V0dGluZ3NPYnNlcnZlciA9IG5ldyBTZXR0aW5nc09ic2VydmVyKG1IYW5kbGVyLCBFVkVOVF9QT0xJQ1lfQ0hBTkdFRCk7CisgICAgICAgIG1TZXR0aW5nc09ic2VydmVyLm9ic2VydmUobUNvbnRleHQpOwogICAgIH0KIAogCkBAIC0zNzUsNyArMzgyLDcgQEAKICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBzaW0gY2hhbmdlIFRPRE8KICAgICAgICAgICAgIC8vIHJlcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiBvZiBwb2xpY3kgY2hhbmdlCiAKLSAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gVEhST1RUTEVfSU5ERVhfVU5JTklUSUFMSVpFRDsKKyAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4LnNldChUSFJPVFRMRV9JTkRFWF9VTklOSVRJQUxJWkVEKTsKIAogICAgICAgICAgICAgbVJlY29yZGVyID0gbmV3IERhdGFSZWNvcmRlcihtQ29udGV4dCwgVGhyb3R0bGVTZXJ2aWNlLnRoaXMpOwogCkBAIC00MDMsMTUgKzQxMCwxNiBAQAogICAgICAgICAgICAgICAgICAgICBSLmludGVnZXIuY29uZmlnX2RhdGF1c2VfdGhyZXNob2xkX2J5dGVzKTsKICAgICAgICAgICAgIGludCBkZWZhdWx0VmFsdWUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKAogICAgICAgICAgICAgICAgICAgICBSLmludGVnZXIuY29uZmlnX2RhdGF1c2VfdGhyb3R0bGVfa2JpdHNwcyk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRocm90dGxlU2VydmljZS50aGlzKSB7Ci0gICAgICAgICAgICAgICAgbVBvbGljeVRocmVzaG9sZCA9IFNldHRpbmdzLlNlY3VyZS5nZXRMb25nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlRIUk9UVExFX1RIUkVTSE9MRF9CWVRFUywgZGVmYXVsdFRocmVzaG9sZCk7Ci0gICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlRIUk9UVExFX1ZBTFVFX0tCSVRTUFMsIGRlZmF1bHRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRlc3RpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvbGljeVBvbGxQZXJpb2RTZWMgPSBURVNUSU5HX1BPTExJTkdfUEVSSU9EX1NFQzsKLSAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocmVzaG9sZCA9IFRFU1RJTkdfVEhSRVNIT0xEOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvbmcgdGhyZXNob2xkID0gU2V0dGluZ3MuU2VjdXJlLmdldExvbmcobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9USFJFU0hPTERfQllURVMsIGRlZmF1bHRUaHJlc2hvbGQpOworICAgICAgICAgICAgaW50IHZhbHVlID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlRIUk9UVExFX1ZBTFVFX0tCSVRTUFMsIGRlZmF1bHRWYWx1ZSk7CisKKyAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQuc2V0KHRocmVzaG9sZCk7CisgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZS5zZXQodmFsdWUpOworICAgICAgICAgICAgaWYgKHRlc3RpbmcpIHsKKyAgICAgICAgICAgICAgICBtUG9saWN5UG9sbFBlcmlvZFNlYyA9IFRFU1RJTkdfUE9MTElOR19QRVJJT0RfU0VDOworICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQuc2V0KFRFU1RJTkdfVEhSRVNIT0xEKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbVBvbGljeVJlc2V0RGF5ID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKQEAgLTQyMywxMCArNDMxLDggQEAKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9SRVNFVF9EQVksIG1Qb2xpY3lSZXNldERheSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRocm90dGxlU2VydmljZS50aGlzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1JZmFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQgPSAwOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSWZhY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQuc2V0KDApOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQgZGVmYXVsdE5vdGlmaWNhdGlvblR5cGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKApAQCAtNDM3LDE1ICs0NDMsMTYgQEAKICAgICAgICAgICAgIG1NYXhOdHBDYWNoZUFnZVNlYyA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCiAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9NQVhfTlRQX0NBQ0hFX0FHRV9TRUMsIE1BWF9OVFBfQ0FDSEVfQUdFX1NFQyk7CiAKLSAgICAgICAgICAgIGlmIChWREJHIHx8IChtUG9saWN5VGhyZXNob2xkICE9IDApKSB7CisgICAgICAgICAgICBpZiAoVkRCRyB8fCAobVBvbGljeVRocmVzaG9sZC5nZXQoKSAhPSAwKSkgewogICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJvblBvbGljeUNoYW5nZWQgdGVzdGluZz0iICsgdGVzdGluZyArIiwgcGVyaW9kPSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVBvbGxQZXJpb2RTZWMgKyAiLCB0aHJlc2hvbGQ9IiArIG1Qb2xpY3lUaHJlc2hvbGQgKyAiLCB2YWx1ZT0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlICsgIiwgcmVzZXREYXk9IiArIG1Qb2xpY3lSZXNldERheSArICIsIG5vdGVUeXBlPSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeU5vdGlmaWNhdGlvbnNBbGxvd2VkTWFzayArICIsIG1heE50cENhY2hlQWdlPSIgKyBtTWF4TnRwQ2FjaGVBZ2VTZWMpOworICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVBvbGxQZXJpb2RTZWMgKyAiLCB0aHJlc2hvbGQ9IiArIG1Qb2xpY3lUaHJlc2hvbGQuZ2V0KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiwgdmFsdWU9IiArIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpICsgIiwgcmVzZXREYXk9IiArIG1Qb2xpY3lSZXNldERheSArCisgICAgICAgICAgICAgICAgICAgICAgICAiLCBub3RlVHlwZT0iICsgbVBvbGljeU5vdGlmaWNhdGlvbnNBbGxvd2VkTWFzayArICIsIG1heE50cENhY2hlQWdlPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgbU1heE50cENhY2hlQWdlU2VjKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gZm9yY2UgdXBkYXRlcwotICAgICAgICAgICAgbVRocm90dGxlSW5kZXggPSBUSFJPVFRMRV9JTkRFWF9VTklOSVRJQUxJWkVEOworICAgICAgICAgICAgbVRocm90dGxlSW5kZXguc2V0KFRIUk9UVExFX0lOREVYX1VOSU5JVElBTElaRUQpOwogCiAgICAgICAgICAgICBvblJlc2V0QWxhcm0oKTsKIApAQCAtNDg3LDcgKzQ5NCw3IEBACiAgICAgICAgICAgICBsb25nIHBlcmlvZFJ4ID0gbVJlY29yZGVyLmdldFBlcmlvZFJ4KDApOwogICAgICAgICAgICAgbG9uZyBwZXJpb2RUeCA9IG1SZWNvcmRlci5nZXRQZXJpb2RUeCgwKTsKICAgICAgICAgICAgIGxvbmcgdG90YWwgPSBwZXJpb2RSeCArIHBlcmlvZFR4OwotICAgICAgICAgICAgaWYgKFZEQkcgfHwgKG1Qb2xpY3lUaHJlc2hvbGQgIT0gMCkpIHsKKyAgICAgICAgICAgIGlmIChWREJHIHx8IChtUG9saWN5VGhyZXNob2xkLmdldCgpICE9IDApKSB7CiAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9uUG9sbEFsYXJtIC0gcm9hbWluZyA9IiArIHJvYW1pbmcgKwogICAgICAgICAgICAgICAgICAgICAgICAgIiwgcmVhZCA9IiArIGluY1JlYWQgKyAiLCB3cml0dGVuID0iICsgaW5jV3JpdGUgKyAiLCBuZXcgdG90YWwgPSIgKyB0b3RhbCk7CiAgICAgICAgICAgICB9CkBAIC01MTAsMTEgKzUxNywxMSBAQAogICAgICAgICBwcml2YXRlIHZvaWQgb25JZmFjZVVwKCkgewogICAgICAgICAgICAgLy8gaWYgd2Ugd2VyZSB0aHJvdHRsZWQgYmVmb3JlLCBiZSBzdXJlIGFuZCBzZXQgaXQgYWdhaW4gLSB0aGUgaWZhY2Ugd2VudCBkb3duCiAgICAgICAgICAgICAvLyAoYW5kIG1heSBoYXZlIGRpc2FwcGVhcmVkIGFsbCB0b2dldGhlcikgYW5kIHRoZXNlIHNldHRpbmdzIHdlcmUgbG9zdAotICAgICAgICAgICAgaWYgKG1UaHJvdHRsZUluZGV4ID09IDEpIHsKKyAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleC5nZXQoKSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgbU5NU2VydmljZS5zZXRJbnRlcmZhY2VUaHJvdHRsZShtSWZhY2UsIC0xLCAtMSk7CiAgICAgICAgICAgICAgICAgICAgIG1OTVNlcnZpY2Uuc2V0SW50ZXJmYWNlVGhyb3R0bGUobUlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLCBtUG9saWN5VGhyb3R0bGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCksIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiZXJyb3Igc2V0dGluZyBUaHJvdHRsZTogIiArIGUpOwogICAgICAgICAgICAgICAgIH0KQEAgLTUyMyw3ICs1MzAsOCBAQAogCiAgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja1Rocm90dGxlQW5kUG9zdE5vdGlmaWNhdGlvbihsb25nIGN1cnJlbnRUb3RhbCkgewogICAgICAgICAgICAgLy8gaXMgdGhyb3R0bGluZyBlbmFibGVkPwotICAgICAgICAgICAgaWYgKG1Qb2xpY3lUaHJlc2hvbGQgPT0gMCkgeworICAgICAgICAgICAgbG9uZyB0aHJlc2hvbGQgPSBtUG9saWN5VGhyZXNob2xkLmdldCgpOworICAgICAgICAgICAgaWYgKHRocmVzaG9sZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgY2xlYXJUaHJvdHRsZUFuZE5vdGlmaWNhdGlvbigpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTUzNSwxNSArNTQzLDEzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gdGhyb3R0bGUKLSAgICAgICAgICAgIGlmIChjdXJyZW50VG90YWwgPiBtUG9saWN5VGhyZXNob2xkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1UaHJvdHRsZUluZGV4ICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChUaHJvdHRsZVNlcnZpY2UudGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgbVRocm90dGxlSW5kZXggPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJUaHJlc2hvbGQgIiArIG1Qb2xpY3lUaHJlc2hvbGQgKyAiIGV4Y2VlZGVkISIpOworICAgICAgICAgICAgaWYgKGN1cnJlbnRUb3RhbCA+IHRocmVzaG9sZCkgeworICAgICAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleC5nZXQoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4LnNldCgxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgIlRocmVzaG9sZCAiICsgdGhyZXNob2xkICsgIiBleGNlZWRlZCEiKTsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1OTVNlcnZpY2Uuc2V0SW50ZXJmYWNlVGhyb3R0bGUobUlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZSwgbVBvbGljeVRocm90dGxlVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSwgbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCkpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgImVycm9yIHNldHRpbmcgVGhyb3R0bGU6ICIgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTU2LDcgKzU2Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLkZMQUdfT05HT0lOR19FVkVOVCk7CiAKICAgICAgICAgICAgICAgICAgICAgSW50ZW50IGJyb2FkY2FzdCA9IG5ldyBJbnRlbnQoVGhyb3R0bGVNYW5hZ2VyLlRIUk9UVExFX0FDVElPTik7Ci0gICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdC5wdXRFeHRyYShUaHJvdHRsZU1hbmFnZXIuRVhUUkFfVEhST1RUTEVfTEVWRUwsIG1Qb2xpY3lUaHJvdHRsZVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0LnB1dEV4dHJhKFRocm90dGxlTWFuYWdlci5FWFRSQV9USFJPVFRMRV9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSk7CiAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoYnJvYWRjYXN0KTsKIAogICAgICAgICAgICAgICAgIH0gLy8gZWxzZSBhbHJlYWR5IHVwIQpAQCAtNTc5LDggKzU4Niw4IEBACiAgICAgICAgICAgICAgICAgICAgIGxvbmcgcGVyaW9kTGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZVVzZWQgPSBub3cgLSBzdGFydDsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyB3YXJuaW5nVGhyZXNob2xkID0gMiptUG9saWN5VGhyZXNob2xkKnRpbWVVc2VkLyh0aW1lVXNlZCtwZXJpb2RMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnRUb3RhbCA+IHdhcm5pbmdUaHJlc2hvbGQpICYmIChjdXJyZW50VG90YWwgPiBtUG9saWN5VGhyZXNob2xkLzQpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgd2FybmluZ1RocmVzaG9sZCA9IDIqdGhyZXNob2xkKnRpbWVVc2VkLyh0aW1lVXNlZCtwZXJpb2RMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnRUb3RhbCA+IHdhcm5pbmdUaHJlc2hvbGQpICYmIChjdXJyZW50VG90YWwgPiB0aHJlc2hvbGQvNCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtV2FybmluZ05vdGlmaWNhdGlvblNlbnQgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2FybmluZ05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmNhbmNlbChSLmRyYXdhYmxlLnN0YXRfc3lzX3Rocm90dGxlZCk7CkBAIC02MjUsMTEgKzYzMiw5IEBACiAgICAgICAgIH0KIAogCi0gICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2xlYXJUaHJvdHRsZUFuZE5vdGlmaWNhdGlvbigpIHsKLSAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleCAhPSBUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRCkgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoVGhyb3R0bGVTZXJ2aWNlLnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRocm90dGxlSW5kZXggPSBUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIHByaXZhdGUgdm9pZCBjbGVhclRocm90dGxlQW5kTm90aWZpY2F0aW9uKCkgeworICAgICAgICAgICAgaWYgKG1UaHJvdHRsZUluZGV4LmdldCgpICE9IFRIUk9UVExFX0lOREVYX1VOVEhST1RUTEVEKSB7CisgICAgICAgICAgICAgICAgbVRocm90dGxlSW5kZXguc2V0KFRIUk9UVExFX0lOREVYX1VOVEhST1RUTEVEKTsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBtTk1TZXJ2aWNlLnNldEludGVyZmFjZVRocm90dGxlKG1JZmFjZSwgLTEsIC0xKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewpAQCAtNjg3LDEyICs2OTIsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCBvblJlc2V0QWxhcm0oKSB7Ci0gICAgICAgICAgICBpZiAoVkRCRyB8fCAobVBvbGljeVRocmVzaG9sZCAhPSAwKSkgeworICAgICAgICAgICAgaWYgKFZEQkcgfHwgKG1Qb2xpY3lUaHJlc2hvbGQuZ2V0KCkgIT0gMCkpIHsKICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25SZXNldEFsYXJtIC0gbGFzdCBwZXJpb2QgaGFkICIgKyBtUmVjb3JkZXIuZ2V0UGVyaW9kUngoMCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyByZWFkIGFuZCAiICsgbVJlY29yZGVyLmdldFBlcmlvZFR4KDApICsgIiB3cml0dGVuIik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGxvbmcgbm93ID0gZ2V0QmVzdFRpbWUoKTsKKyAgICAgICAgICAgIGxvbmcgbm93ID0gZ2V0QmVzdFRpbWUoZmFsc2UpOwogCiAgICAgICAgICAgICBpZiAobU50cEFjdGl2ZSB8fCAobU50cFNlcnZlciA9PSBudWxsKSkgewogICAgICAgICAgICAgICAgIENhbGVuZGFyIGVuZCA9IGNhbGN1bGF0ZVBlcmlvZEVuZChub3cpOwpAQCAtNzE5LDIwICs3MjQsMjMgQEAKIAogICAgICAgICAvLyB3aWxsIHRyeSB0byBnZXQgdGhlIG50cCB0aW1lIGFuZCBzd2l0Y2ggdG8gaXQgaWYgZm91bmQuCiAgICAgICAgIC8vIHdpbGwgYWxzbyBjYWNoZSB0aGUgdGltZSBzbyB3ZSBkb24ndCBmZXRjaCBpdCByZXBlYXRlZGx5LgotICAgICAgICBnZXRCZXN0VGltZSgpOworICAgICAgICBnZXRCZXN0VGltZShmYWxzZSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9OVFBfQ0FDSEVfQUdFX1NFQyA9IDYwICogNjAgKiAyNDsgLy8gMSBkYXkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05UUF9GRVRDSF9XQUlUID0gMTAgKiAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlRQX0ZFVENIX1dBSVQgPSAyMCAqIDEwMDA7CiAgICAgcHJpdmF0ZSBpbnQgbU1heE50cENhY2hlQWdlU2VjID0gTUFYX05UUF9DQUNIRV9BR0VfU0VDOwogICAgIHByaXZhdGUgbG9uZyBjYWNoZWROdHA7CiAgICAgcHJpdmF0ZSBsb25nIGNhY2hlZE50cFRpbWVzdGFtcDsKIAotICAgIHByaXZhdGUgbG9uZyBnZXRCZXN0VGltZSgpIHsKKyAgICAvLyBpZiB0aGUgcmVxdWVzdCBpcyB0aWVkIHRvIFVJIGFuZCBBTlIncyBhcmUgYSBkYW5nZXIsIHJlcXVlc3QgYSBmYXN0IHJlc3VsdAorICAgIC8vIHRoZSByZWd1bGFyIHBvbGxpbmcgc2hvdWxkIGhhdmUgdXBkYXRlZCB0aGUgY2FjaGVkIHRpbWUgcmVjZW50bHkgdXNpbmcgdGhlCisgICAgLy8gc2xvd2VyIG1ldGhvZCAoIWZhc3QpCisgICAgcHJpdmF0ZSBsb25nIGdldEJlc3RUaW1lKGJvb2xlYW4gZmFzdCkgewogICAgICAgICBpZiAobU50cFNlcnZlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAobU50cEFjdGl2ZSkgewogICAgICAgICAgICAgICAgIGxvbmcgbnRwQWdlID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgLSBjYWNoZWROdHBUaW1lc3RhbXA7Ci0gICAgICAgICAgICAgICAgaWYgKG50cEFnZSA8IG1NYXhOdHBDYWNoZUFnZVNlYyAqIDEwMDApIHsKKyAgICAgICAgICAgICAgICBpZiAobnRwQWdlIDwgbU1heE50cENhY2hlQWdlU2VjICogMTAwMCB8fCBmYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSBTbG9nLnYoVEFHLCAidXNpbmcgY2FjaGVkIHRpbWUiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZE50cCArIG50cEFnZTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDI1LDM5ICsxMDMzLDU3IEBACiAgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgImRhdGEgZmlsZSBlbXB0eSIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVBhcmVudCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhcnNlZCA9IGRhdGEuc3BsaXQoIjoiKTsKLSAgICAgICAgICAgICAgICBpbnQgcGFyc2VkVXNlZCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGggPCA2KSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJyZWFkaW5nIGRhdGEgZmlsZSB3aXRoIGluc3VmZmljaWVudCBsZW5ndGggLSBpZ25vcmluZyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nW10gcGFyc2VkID0gZGF0YS5zcGxpdCgiOiIpOworICAgICAgICAgICAgaW50IHBhcnNlZFVzZWQgPSAwOworICAgICAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGggPCA2KSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgInJlYWRpbmcgZGF0YSBmaWxlIHdpdGggaW5zdWZmaWNpZW50IGxlbmd0aCAtIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpbnQgcGVyaW9kQ291bnQ7CisgICAgICAgICAgICBsb25nW10gcGVyaW9kUnhEYXRhOworICAgICAgICAgICAgbG9uZ1tdIHBlcmlvZFR4RGF0YTsKKyAgICAgICAgICAgIGludCBjdXJyZW50UGVyaW9kOworICAgICAgICAgICAgQ2FsZW5kYXIgcGVyaW9kU3RhcnQ7CisgICAgICAgICAgICBDYWxlbmRhciBwZXJpb2RFbmQ7CisgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGlmIChJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKSAhPSBEQVRBX0ZJTEVfVkVSU0lPTikgewogICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAicmVhZGluZyBkYXRhIGZpbGUgd2l0aCBiYWQgdmVyc2lvbiAtIGlnbm9yaW5nIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtUGVyaW9kQ291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKLSAgICAgICAgICAgICAgICBpZiAocGFyc2VkLmxlbmd0aCAhPSA1ICsgKDIgKiBtUGVyaW9kQ291bnQpKSB7CisgICAgICAgICAgICAgICAgcGVyaW9kQ291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VkLmxlbmd0aCAhPSA1ICsgKDIgKiBwZXJpb2RDb3VudCkpIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgInJlYWRpbmcgZGF0YSBmaWxlIHdpdGggYmFkIGxlbmd0aCAoIiArIHBhcnNlZC5sZW5ndGggKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIT0gIiArICg1KygyKm1QZXJpb2RDb3VudCkpICsgIikgLSBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIT0gIiArICg1ICsgKDIgKiBwZXJpb2RDb3VudCkpICsgIikgLSBpZ25vcmluZyIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBlcmlvZFJ4RGF0YSA9IG5ldyBsb25nW3BlcmlvZENvdW50XTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBlcmlvZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcGVyaW9kUnhEYXRhW2ldID0gTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZXJpb2RUeERhdGEgPSBuZXcgbG9uZ1twZXJpb2RDb3VudF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJpb2RDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcmlvZFR4RGF0YVtpXSA9IExvbmcucGFyc2VMb25nKHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtUGVyaW9kUnhEYXRhID0gbmV3IGxvbmdbbVBlcmlvZENvdW50XTsKLSAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbVBlcmlvZENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbVBlcmlvZFJ4RGF0YVtpXSA9IExvbmcucGFyc2VMb25nKHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBlcmlvZFR4RGF0YSA9IG5ldyBsb25nW21QZXJpb2RDb3VudF07Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG1QZXJpb2RDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QZXJpb2RUeERhdGFbaV0gPSBMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DdXJyZW50UGVyaW9kID0gSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSk7Ci0gICAgICAgICAgICAgICAgbVBlcmlvZFN0YXJ0ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0gICAgICAgICAgICAgICAgbVBlcmlvZFN0YXJ0LnNldFRpbWVJbk1pbGxpcyhMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSkpOwotICAgICAgICAgICAgICAgIG1QZXJpb2RFbmQgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLSAgICAgICAgICAgICAgICBtUGVyaW9kRW5kLnNldFRpbWVJbk1pbGxpcyhMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSkpOworICAgICAgICAgICAgICAgIGN1cnJlbnRQZXJpb2QgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKKworICAgICAgICAgICAgICAgIHBlcmlvZFN0YXJ0ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgICAgICAgICAgcGVyaW9kU3RhcnQuc2V0VGltZUluTWlsbGlzKExvbmcucGFyc2VMb25nKHBhcnNlZFtwYXJzZWRVc2VkKytdKSk7CisgICAgICAgICAgICAgICAgcGVyaW9kRW5kID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgICAgICAgICAgcGVyaW9kRW5kLnNldFRpbWVJbk1pbGxpcyhMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgcGFyc2luZyBkYXRhIGZpbGUgLSBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVBhcmVudCkgeworICAgICAgICAgICAgICAgIG1QZXJpb2RDb3VudCA9IHBlcmlvZENvdW50OworICAgICAgICAgICAgICAgIG1QZXJpb2RSeERhdGEgPSBwZXJpb2RSeERhdGE7CisgICAgICAgICAgICAgICAgbVBlcmlvZFR4RGF0YSA9IHBlcmlvZFR4RGF0YTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFBlcmlvZCA9IGN1cnJlbnRQZXJpb2Q7CisgICAgICAgICAgICAgICAgbVBlcmlvZFN0YXJ0ID0gcGVyaW9kU3RhcnQ7CisgICAgICAgICAgICAgICAgbVBlcmlvZEVuZCA9IHBlcmlvZEVuZDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMDkxLDE1ICsxMTE3LDE1IEBACiAgICAgICAgIH0KICAgICAgICAgcHcucHJpbnRsbigpOwogCi0gICAgICAgIHB3LnByaW50bG4oIlRoZSB0aHJlc2hvbGQgaXMgIiArIG1Qb2xpY3lUaHJlc2hvbGQgKworICAgICAgICBwdy5wcmludGxuKCJUaGUgdGhyZXNob2xkIGlzICIgKyBtUG9saWN5VGhyZXNob2xkLmdldCgpICsKICAgICAgICAgICAgICAgICAiLCBhZnRlciB3aGljaCB5b3UgZXhwZXJpbmNlIHRocm90dGxpbmcgdG8gIiArCi0gICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUgKyAia2JwcyIpOworICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpICsgImticHMiKTsKICAgICAgICAgcHcucHJpbnRsbigiQ3VycmVudCBwZXJpb2QgaXMgIiArCiAgICAgICAgICAgICAgICAgKG1SZWNvcmRlci5nZXRQZXJpb2RFbmQoKSAtIG1SZWNvcmRlci5nZXRQZXJpb2RTdGFydCgpKS8xMDAwICsgIiBzZWNvbmRzIGxvbmcgIiArCiAgICAgICAgICAgICAgICAgImFuZCBlbmRzIGluICIgKyAoZ2V0UmVzZXRUaW1lKG1JZmFjZSkgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkgLyAxMDAwICsKICAgICAgICAgICAgICAgICAiIHNlY29uZHMuIik7CiAgICAgICAgIHB3LnByaW50bG4oIlBvbGxpbmcgZXZlcnkgIiArIG1Qb2xpY3lQb2xsUGVyaW9kU2VjICsgIiBzZWNvbmRzIik7Ci0gICAgICAgIHB3LnByaW50bG4oIkN1cnJlbnQgVGhyb3R0bGUgSW5kZXggaXMgIiArIG1UaHJvdHRsZUluZGV4KTsKKyAgICAgICAgcHcucHJpbnRsbigiQ3VycmVudCBUaHJvdHRsZSBJbmRleCBpcyAiICsgbVRocm90dGxlSW5kZXguZ2V0KCkpOwogICAgICAgICBwdy5wcmludGxuKCJNYXggTlRQIENhY2hlIEFnZSBpcyAiICsgbU1heE50cENhY2hlQWdlU2VjKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1SZWNvcmRlci5nZXRQZXJpb2RDb3VudCgpOyBpKyspIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1VzYk9ic2VydmVyLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Vc2JPYnNlcnZlci5qYXZhCmluZGV4IGQwOGZlOWIuLjU0NmU1ZjhkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Vc2JPYnNlcnZlci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1VzYk9ic2VydmVyLmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuVUV2ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwpAQCAtMTQ3LDggKzE0OCw0MyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBtb25pdG9yVXNiSG9zdEJ1cygpOworCisgICAgLy8gY2FsbGVkIGZyb20gSk5JIGluIG1vbml0b3JVc2JIb3N0QnVzKCkKKyAgICBwcml2YXRlIHZvaWQgdXNiQ2FtZXJhQWRkZWQoaW50IGRldmljZUlEKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFVzYi5BQ1RJT05fVVNCX0NBTUVSQV9BVFRBQ0hFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwLkRldmljZS5nZXRDb250ZW50VXJpKGRldmljZUlEKSk7CisgICAgICAgIExvZy5kKFRBRywgInVzYkNhbWVyYUFkZGVkLCBzZW5kaW5nICIgKyBpbnRlbnQpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgLy8gY2FsbGVkIGZyb20gSk5JIGluIG1vbml0b3JVc2JIb3N0QnVzKCkKKyAgICBwcml2YXRlIHZvaWQgdXNiQ2FtZXJhUmVtb3ZlZChpbnQgZGV2aWNlSUQpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVXNiLkFDVElPTl9VU0JfQ0FNRVJBX0RFVEFDSEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHAuRGV2aWNlLmdldENvbnRlbnRVcmkoZGV2aWNlSUQpKTsKKyAgICAgICAgTG9nLmQoVEFHLCAidXNiQ2FtZXJhUmVtb3ZlZCwgc2VuZGluZyAiICsgaW50ZW50KTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0SG9zdFN1cHBvcnQoKSB7CisgICAgICAgIC8vIENyZWF0ZSBhIHRocmVhZCB0byBjYWxsIGludG8gbmF0aXZlIGNvZGUgdG8gd2FpdCBmb3IgVVNCIGhvc3QgZXZlbnRzLgorICAgICAgICAvLyBUaGlzIHRocmVhZCB3aWxsIGNhbGwgdXMgYmFjayBvbiB1c2JDYW1lcmFBZGRlZCBhbmQgdXNiQ2FtZXJhUmVtb3ZlZC4KKyAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbW9uaXRvclVzYkhvc3RCdXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbmV3IFRocmVhZChudWxsLCBydW5uYWJsZSwgIlVzYk9ic2VydmVyIGhvc3QgdGhyZWFkIikuc3RhcnQoKTsKKyAgICB9CisKICAgICB2b2lkIHN5c3RlbVJlYWR5KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmJvb2wuY29uZmlnX2hhc1VzYkhvc3RTdXBwb3J0KSkgeworICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG1vbml0b3JpbmcgZm9yIGNvbm5lY3RlZCBVU0IgZGV2aWNlcworICAgICAgICAgICAgICAgIGluaXRIb3N0U3VwcG9ydCgpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB1cGRhdGUoKTsKICAgICAgICAgICAgIG1TeXN0ZW1SZWFkeSA9IHRydWU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpU2VydmljZS5qYXZhCmluZGV4IDBlY2EwODIuLjZlY2M1MTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVNlcnZpY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE2LDE5ICsxNiw5IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9ESVNBQkxFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTElORzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9FTkFCTElORzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX1VOS05PV047Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0RJU0FCTEVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRElTQUJMSU5HOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRU5BQkxFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0VOQUJMSU5HOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRkFJTEVEOwotCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQTJkcDsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CkBAIC0zOCw2OSArMjgsNjAgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuSVdpZmlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUluZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlOYXRpdmU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpU3RhdGVUcmFja2VyOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlTWFjaGluZTsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLlNjYW5SZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uLktleU1nbXQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5JbnRlcmZhY2VDb25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuRGhjcEluZm87Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1V0aWxzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQml0U2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0czsKLWltcG9ydCBhbmRyb2lkLmFwcC5iYWNrdXAuSUJhY2t1cE1hbmFnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLkJhdHRlcnlTdGF0c1NlcnZpY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIAogLyoqCiAgKiBXaWZpU2VydmljZSBoYW5kbGVzIHJlbW90ZSBXaUZpIG9wZXJhdGlvbiByZXF1ZXN0cyBieSBpbXBsZW1lbnRpbmcKLSAqIHRoZSBJV2lmaU1hbmFnZXIgaW50ZXJmYWNlLiBJdCBhbHNvIGNyZWF0ZXMgYSBXaWZpTW9uaXRvciB0byBsaXN0ZW4KLSAqIGZvciBXaWZpLXJlbGF0ZWQgZXZlbnRzLgorICogdGhlIElXaWZpTWFuYWdlciBpbnRlcmZhY2UuCiAgKgogICogQGhpZGUKICAqLworLy9UT0RPOiBDbGVhbiB1cCBtdWx0aXBsZSBsb2NrcyBhbmQgaW1wbGVtZW50IFdpZmlTZXJ2aWNlCisvLyBhcyBhIFNNIHRvIHRyYWNrIHNvZnQgQVAvY2xpZW50L2FkaG9jIGJyaW5nIHVwIGJhc2VkCisvLyBvbiBkZXZpY2UgaWRsZSBzdGF0ZSwgYWlycGxhbmUgbW9kZSBhbmQgYm9vdC4KKwogcHVibGljIGNsYXNzIFdpZmlTZXJ2aWNlIGV4dGVuZHMgSVdpZmlNYW5hZ2VyLlN0dWIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiV2lmaVNlcnZpY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzY2FuUmVzdWx0UGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXHQrIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBXaWZpU3RhdGVUcmFja2VyIG1XaWZpU3RhdGVUcmFja2VyOwotICAgIC8qIFRPRE86IGZldGNoIGEgY29uZmlndXJhYmxlIGludGVyZmFjZSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0ZUQVBfSUZBQ0UgPSAid2wwLjEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKKworICAgIHByaXZhdGUgZmluYWwgV2lmaVN0YXRlTWFjaGluZSBtV2lmaVN0YXRlTWFjaGluZTsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGludCBtV2lmaUFwU3RhdGU7CiAKICAgICBwcml2YXRlIEFsYXJtTWFuYWdlciBtQWxhcm1NYW5hZ2VyOwogICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtSWRsZUludGVudDsKQEAgLTEwOSwxNSArOTAsMTEgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbURldmljZUlkbGU7CiAgICAgcHJpdmF0ZSBpbnQgbVBsdWdnZWRUeXBlOwogCi0gICAgcHJpdmF0ZSBlbnVtIERyaXZlckFjdGlvbiB7RFJJVkVSX1VOTE9BRCwgTk9fRFJJVkVSX1VOTE9BRH07Ci0KICAgICAvLyB0cnVlIGlmIHRoZSB1c2VyIGVuYWJsZWQgV2lmaSB3aGlsZSBpbiBhaXJwbGFuZSBtb2RlCi0gICAgcHJpdmF0ZSBib29sZWFuIG1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbjsKKyAgICBwcml2YXRlIEF0b21pY0Jvb2xlYW4gbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBMb2NrTGlzdCBtTG9ja3MgPSBuZXcgTG9ja0xpc3QoKTsKICAgICAvLyBzb21lIHdpZmkgbG9jayBzdGF0aXN0aWNzCi0gICAgcHJpdmF0ZSBpbnQgbUZ1bGxIaWdoUGVyZkxvY2tzQWNxdWlyZWQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUZ1bGxIaWdoUGVyZkxvY2tzUmVsZWFzZWQ7CiAgICAgcHJpdmF0ZSBpbnQgbUZ1bGxMb2Nrc0FjcXVpcmVkOwogICAgIHByaXZhdGUgaW50IG1GdWxsTG9ja3NSZWxlYXNlZDsKICAgICBwcml2YXRlIGludCBtU2NhbkxvY2tzQWNxdWlyZWQ7CkBAIC0xMzAsOSArMTA3LDcgQEAKIAogICAgIHByaXZhdGUgZmluYWwgSUJhdHRlcnlTdGF0cyBtQmF0dGVyeVN0YXRzOwogCi0gICAgcHJpdmF0ZSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIG53U2VydmljZTsKICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyIG1DbTsKLSAgICBwcml2YXRlIFdpZmlXYXRjaGRvZ1NlcnZpY2UgbVdpZmlXYXRjaGRvZ1NlcnZpY2UgPSBudWxsOwogICAgIHByaXZhdGUgU3RyaW5nW10gbVdpZmlSZWdleHM7CiAKICAgICAvKioKQEAgLTE0NCw2MSArMTE5LDYgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfSURMRV9NSUxMSVMgPSAxNSAqIDYwICogMTAwMDsgLyogMTUgbWludXRlcyAqLwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdBS0VMT0NLX1RBRyA9ICJXaWZpU2VydmljZSI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byBob2xkIHRoZSB3YWtlIGxvY2sgYWZ0ZXIgYSBkaXNjb25uZWN0Ci0gICAgICogY2F1c2VkIGJ5IHN0b3BwaW5nIHRoZSBkcml2ZXIuIEVzdGFibGlzaGluZyBhbiBFREdFIGNvbm5lY3Rpb24gaGFzIGJlZW4KLSAgICAgKiBvYnNlcnZlZCB0byB0YWtlIGFib3V0IDUgc2Vjb25kcyB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcy4gVGhpcwotICAgICAqIHByb3ZpZGVzIGEgYml0IG9mIGV4dHJhIG1hcmdpbi4KLSAgICAgKiA8cD4KLSAgICAgKiBTZWUge0BsaW5rIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlI1dJRklfTU9CSUxFX0RBVEFfVFJBTlNJVElPTl9XQUtFTE9DS19USU1FT1VUX01TfS4KLSAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGlmIGEgU2V0dGluZ3MuU2VjdXJlIHZhbHVlIGlzIG5vdCBwcmVzZW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dBS0VMT0NLX1RJTUVPVVQgPSA4MDAwOwotCi0gICAgLy8gV2FrZSBsb2NrIHVzZWQgYnkgZHJpdmVyLXN0b3Agb3BlcmF0aW9uCi0gICAgcHJpdmF0ZSBzdGF0aWMgUG93ZXJNYW5hZ2VyLldha2VMb2NrIHNEcml2ZXJTdG9wV2FrZUxvY2s7Ci0gICAgLy8gV2FrZSBsb2NrIHVzZWQgYnkgb3RoZXIgb3BlcmF0aW9ucwotICAgIHByaXZhdGUgc3RhdGljIFBvd2VyTWFuYWdlci5XYWtlTG9jayBzV2FrZUxvY2s7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9FTkFCTEVfV0lGSSAgICAgICAgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0RJU0FCTEVfV0lGSSAgICAgICA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU1RPUF9XSUZJICAgICAgICAgID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TVEFSVF9XSUZJICAgICAgICAgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1JFTEVBU0VfV0FLRUxPQ0sgICA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVVBEQVRFX1NUQVRFICAgICAgID0gNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TVEFSVF9BQ0NFU1NfUE9JTlQgPSA2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NUT1BfQUNDRVNTX1BPSU5UICA9IDc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU0VUX0NIQU5ORUxTICAgICAgID0gODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9FTkFCTEVfTkVUV09SS1MgICAgPSA5OwotCi0KLSAgICBwcml2YXRlIGZpbmFsICBXaWZpSGFuZGxlciBtV2lmaUhhbmRsZXI7Ci0KLSAgICAvKgotICAgICAqIENhY2hlIG9mIHNjYW4gcmVzdWx0cyBvYmplY3RzIChzaXplIGlzIHNvbWV3aGF0IGFyYml0cmFyeSkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRfQ0FDSEVfU0laRSA9IDgwOwotICAgIHByaXZhdGUgZmluYWwgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNjYW5SZXN1bHQ+IG1TY2FuUmVzdWx0Q2FjaGU7Ci0KLSAgICAvKgotICAgICAqIENoYXJhY3RlciBidWZmZXIgdXNlZCB0byBwYXJzZSBzY2FuIHJlc3VsdHMgKG9wdGltaXphdGlvbikKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRfQlVGRkVSX1NJWkUgPSA1MTI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkUmVjb25maWc7Ci0KLSAgICAvKgotICAgICAqIExhc3QgVUlEIHRoYXQgYXNrZWQgdG8gZW5hYmxlIFdJRkkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUxhc3RFbmFibGVVaWQgPSBQcm9jZXNzLm15VWlkKCk7Ci0KLSAgICAvKgotICAgICAqIExhc3QgVUlEIHRoYXQgYXNrZWQgdG8gZW5hYmxlIFdJRkkgQVAuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUxhc3RBcEVuYWJsZVVpZCA9IFByb2Nlc3MubXlVaWQoKTsKLQotCiAgICAgLyoqCiAgICAgICogTnVtYmVyIG9mIGFsbG93ZWQgcmFkaW8gZnJlcXVlbmN5IGNoYW5uZWxzIGluIHZhcmlvdXMgcmVndWxhdG9yeSBkb21haW5zLgogICAgICAqIFRoaXMgbGlzdCBpcyBzdWZmaWNpZW50IGZvciA4MDIuMTFiL2cgbmV0d29ya3MgKDIuNEdIeiByYW5nZSkuCkBAIC0yMDgsNDcgKzEyOCw4MCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fREVWSUNFX0lETEUgPQogICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5XaWZpTWFuYWdlci5hY3Rpb24uREVWSUNFX0lETEUiOwogCi0gICAgV2lmaVNlcnZpY2UoQ29udGV4dCBjb250ZXh0LCBXaWZpU3RhdGVUcmFja2VyIHRyYWNrZXIpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzUmVjZWl2ZXJSZWdpc3RlcmVkID0gZmFsc2U7CisKKworICAgIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbyA9IG5ldyBOZXR3b3JrSW5mbyhDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSwgMCwgIldJRkkiLCAiIik7CisKKyAgICAvLyBWYXJpYWJsZXMgcmVsYXRpbmcgdG8gdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbgorICAgIC8qKgorICAgICAqIFRoZSBpY29uIHRvIHNob3cgaW4gdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbi4gVGhpcyB3aWxsIGFsc28KKyAgICAgKiBiZSB0aGUgSUQgb2YgdGhlIE5vdGlmaWNhdGlvbiBnaXZlbiB0byB0aGUgTm90aWZpY2F0aW9uTWFuYWdlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUgPQorICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X25vdGlmeV93aWZpX2luX3JhbmdlOworICAgIC8qKgorICAgICAqIFdoZW4gYSBub3RpZmljYXRpb24gaXMgc2hvd24sIHdlIHdhaXQgdGhpcyBhbW91bnQgYmVmb3JlIHBvc3NpYmx5IHNob3dpbmcgaXQgYWdhaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIE5PVElGSUNBVElPTl9SRVBFQVRfREVMQVlfTVM7CisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgdXNlciBoYXMgc2V0IHRoZSBzZXR0aW5nIHRvIHNob3cgdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWNhdGlvbkVuYWJsZWQ7CisgICAgLyoqCisgICAgICogT2JzZXJ2ZXMgdGhlIHVzZXIgc2V0dGluZyB0byBrZWVwIHtAbGluayAjbU5vdGlmaWNhdGlvbkVuYWJsZWR9IGluIHN5bmMuCisgICAgICovCisgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyOworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgU3lzdGVtI2N1cnJlbnRUaW1lTWlsbGlzKCl9IG11c3QgYmUgYXQgbGVhc3QgdGhpcyB2YWx1ZSBmb3IgdXMKKyAgICAgKiB0byBzaG93IHRoZSBub3RpZmljYXRpb24gYWdhaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lOworICAgIC8qKgorICAgICAqIFRoZSBOb3RpZmljYXRpb24gb2JqZWN0IGdpdmVuIHRvIHRoZSBOb3RpZmljYXRpb25NYW5hZ2VyLgorICAgICAqLworICAgIHByaXZhdGUgTm90aWZpY2F0aW9uIG1Ob3RpZmljYXRpb247CisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgbm90aWZpY2F0aW9uIGlzIGJlaW5nIHNob3duLCBhcyBzZXQgYnkgdXMuIFRoYXQgaXMsIGlmIHRoZQorICAgICAqIHVzZXIgY2FuY2VscyB0aGUgbm90aWZpY2F0aW9uLCB3ZSB3aWxsIG5vdCByZWNlaXZlIHRoZSBjYWxsYmFjayBzbyB0aGlzCisgICAgICogd2lsbCBzdGlsbCBiZSB0cnVlLiBXZSBvbmx5IGd1YXJhbnRlZSBpZiB0aGlzIGlzIGZhbHNlLCB0aGVuIHRoZQorICAgICAqIG5vdGlmaWNhdGlvbiBpcyBub3Qgc2hvd2luZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWNhdGlvblNob3duOworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgY29udGludW91cyBzY2FucyB0aGF0IG11c3Qgb2NjdXIgYmVmb3JlIGNvbnNpZGVyIHRoZQorICAgICAqIHN1cHBsaWNhbnQgaW4gYSBzY2FubmluZyBzdGF0ZS4gVGhpcyBhbGxvd3Mgc3VwcGxpY2FudCB0byBhc3NvY2lhdGUgd2l0aAorICAgICAqIHJlbWVtYmVyZWQgbmV0d29ya3MgdGhhdCBhcmUgaW4gdGhlIHNjYW4gcmVzdWx0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1NDQU5TX0JFRk9SRV9BQ1RVQUxMWV9TQ0FOTklORyA9IDM7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBzY2FucyBzaW5jZSB0aGUgbGFzdCBuZXR3b3JrIHN0YXRlIGNoYW5nZS4gV2hlbiB0aGlzCisgICAgICogZXhjZWVkcyB7QGxpbmsgI05VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkd9LCB3ZSBjb25zaWRlciB0aGUKKyAgICAgKiBzdXBwbGljYW50IHRvIGFjdHVhbGx5IGJlIHNjYW5uaW5nLiBXaGVuIHRoZSBuZXR3b3JrIHN0YXRlIGNoYW5nZXMgdG8KKyAgICAgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiBzY2FubmluZywgd2UgcmVzZXQgdGhpcyB0byAwLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlOworCisKKyAgICBXaWZpU2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtV2lmaVN0YXRlVHJhY2tlciA9IHRyYWNrZXI7Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLmVuYWJsZVJzc2lQb2xsaW5nKHRydWUpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZSA9IG5ldyBXaWZpU3RhdGVNYWNoaW5lKG1Db250ZXh0KTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuZW5hYmxlUnNzaVBvbGxpbmcodHJ1ZSk7CiAgICAgICAgIG1CYXR0ZXJ5U3RhdHMgPSBCYXR0ZXJ5U3RhdHNTZXJ2aWNlLmdldFNlcnZpY2UoKTsKIAotICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuTkVUV09SS01BTkFHRU1FTlRfU0VSVklDRSk7Ci0gICAgICAgIG53U2VydmljZSA9IElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShiKTsKLQotICAgICAgICBtU2NhblJlc3VsdENhY2hlID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTY2FuUmVzdWx0PigKLSAgICAgICAgICAgIFNDQU5fUkVTVUxUX0NBQ0hFX1NJWkUsIDAuNzVmLCB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBMaW1pdCB0aGUgY2FjaGUgc2l6ZSBieSBTQ0FOX1JFU1VMVF9DQUNIRV9TSVpFCi0gICAgICAgICAgICAgICAgICogZWxlbWVudHMKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVFbGRlc3RFbnRyeShNYXAuRW50cnkgZWxkZXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTQ0FOX1JFU1VMVF9DQUNIRV9TSVpFIDwgdGhpcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICBIYW5kbGVyVGhyZWFkIHdpZmlUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiV2lmaVNlcnZpY2UiKTsKLSAgICAgICAgd2lmaVRocmVhZC5zdGFydCgpOwotICAgICAgICBtV2lmaUhhbmRsZXIgPSBuZXcgV2lmaUhhbmRsZXIod2lmaVRocmVhZC5nZXRMb29wZXIoKSk7Ci0KLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0V2lmaVN0YXRlKFdJRklfU1RBVEVfRElTQUJMRUQpOwotICAgICAgICBtV2lmaUFwU3RhdGUgPSBXSUZJX0FQX1NUQVRFX0RJU0FCTEVEOwotCiAgICAgICAgIG1BbGFybU1hbmFnZXIgPSAoQWxhcm1NYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BTEFSTV9TRVJWSUNFKTsKICAgICAgICAgSW50ZW50IGlkbGVJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9ERVZJQ0VfSURMRSwgbnVsbCk7CiAgICAgICAgIG1JZGxlSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QobUNvbnRleHQsIElETEVfUkVRVUVTVCwgaWRsZUludGVudCwgMCk7CiAKLSAgICAgICAgUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlciA9IChQb3dlck1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOwotICAgICAgICBzV2FrZUxvY2sgPSBwb3dlck1hbmFnZXIubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLCBXQUtFTE9DS19UQUcpOwotICAgICAgICBzRHJpdmVyU3RvcFdha2VMb2NrID0gcG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgV0FLRUxPQ0tfVEFHKTsKKyAgICAgICAgSGFuZGxlclRocmVhZCB3aWZpVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIldpZmlTZXJ2aWNlIik7CisgICAgICAgIHdpZmlUaHJlYWQuc3RhcnQoKTsKIAogICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKAogICAgICAgICAgICAgICAgIG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91ciBmbGFnIGluZGljYXRpbmcgdGhlIHVzZXIgaGFzIG92ZXJ3cmlkZGVuIGFpcnBsYW5lIG1vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuLnNldChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBhaXJwbGFuZSBkaXNhYmxlLCByZXN0b3JlIFdpZmkgaWYgdGhlIHNhdmVkIHN0YXRlIGluZGljYXRlcyBzbwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0FpcnBsYW5lTW9kZU9uKCkgJiYgdGVzdEFuZENsZWFyV2lmaVNhdmVkU3RhdGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RXaWZpRW5hYmxlZCh0cnVlKTsKQEAgLTI2MywxNCArMjE2LDUwIEBACiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewogCi0gICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhdmFpbGFibGUgPSBpbnRlbnQuZ2V0U3RyaW5nQXJyYXlMaXN0RXh0cmEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuRVhUUkFfQVZBSUxBQkxFX1RFVEhFUik7Ci0gICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhY3RpdmUgPSBpbnRlbnQuZ2V0U3RyaW5nQXJyYXlMaXN0RXh0cmEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuRVhUUkFfQUNUSVZFX1RFVEhFUik7Ci0gICAgICAgICAgICAgICAgICB1cGRhdGVUZXRoZXJTdGF0ZShhdmFpbGFibGUsIGFjdGl2ZSk7CisgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGF2YWlsYWJsZSA9IGludGVudC5nZXRTdHJpbmdBcnJheUxpc3RFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLkVYVFJBX0FWQUlMQUJMRV9URVRIRVIpOworICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhY3RpdmUgPSBpbnRlbnQuZ2V0U3RyaW5nQXJyYXlMaXN0RXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5FWFRSQV9BQ1RJVkVfVEVUSEVSKTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlVGV0aGVyU3RhdGUoYXZhaWxhYmxlLCBhY3RpdmUpOwogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSxuZXcgSW50ZW50RmlsdGVyKENvbm5lY3Rpdml0eU1hbmFnZXIuQUNUSU9OX1RFVEhFUl9TVEFURV9DSEFOR0VEKSk7CisKKyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFX0FDVElPTik7CisKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcigKKyAgICAgICAgICAgICAgICBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0ICYgY2xlYXIgbm90aWZpY2F0aW9uIG9uIGFueSB3aWZpIHN0YXRlIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0Tm90aWZpY2F0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLk5FVFdPUktfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvID0gKE5ldHdvcmtJbmZvKSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVhUUkFfTkVUV09SS19JTkZPKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCAmIGNsZWFyIG5vdGlmaWNhdGlvbiBvbiBhIG5ldHdvcmsgY29ubmVjdCAmIGRpc2Nvbm5lY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldE5vdGlmaWNhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0FuZFNldE5vdGlmaWNhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwgZmlsdGVyKTsKKworICAgICAgICAvLyBTZXR0aW5nIGlzIGluIHNlY29uZHMKKyAgICAgICAgTk9USUZJQ0FUSU9OX1JFUEVBVF9ERUxBWV9NUyA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfUkVQRUFUX0RFTEFZLCA5MDApICogMTAwMGw7CisgICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyID0gbmV3IE5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIobmV3IEhhbmRsZXIoKSk7CisgICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyLnJlZ2lzdGVyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNzksNyArMjY4LDcgQEAKICAgICAgKgogICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGF0IGJvb3QgdGltZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0V2lmaSgpIHsKKyAgICBwdWJsaWMgdm9pZCBjaGVja0FuZFN0YXJ0V2lmaSgpIHsKICAgICAgICAgLyogU3RhcnQgaWYgV2ktRmkgaXMgZW5hYmxlZCBvciB0aGUgc2F2ZWQgc3RhdGUgaW5kaWNhdGVzIFdpLUZpIHdhcyBvbiAqLwogICAgICAgICBib29sZWFuIHdpZmlFbmFibGVkID0gIWlzQWlycGxhbmVNb2RlT24oKQogICAgICAgICAgICAgICAgICYmIChnZXRQZXJzaXN0ZWRXaWZpRW5hYmxlZCgpIHx8IHRlc3RBbmRDbGVhcldpZmlTYXZlZFN0YXRlKCkpOwpAQCAtMjk2LDcgKzI4NSwxMCBAQAogICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuTkVUV09SS01BTkFHRU1FTlRfU0VSVklDRSk7CiAgICAgICAgIElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2Ugc2VydmljZSA9IElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShiKTsKIAotICAgICAgICBtQ20gPSAoQ29ubmVjdGl2aXR5TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICBpZiAobUNtID09IG51bGwpIHsKKyAgICAgICAgICAgIG1DbSA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgIH0KKwogICAgICAgICBtV2lmaVJlZ2V4cyA9IG1DbS5nZXRUZXRoZXJhYmxlV2lmaVJlZ2V4cygpOwogCiAgICAgICAgIGZvciAoU3RyaW5nIGludGYgOiBhdmFpbGFibGUpIHsKQEAgLTMxNiwxNyArMzA4LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgY29uZmlndXJpbmcgaW50ZXJmYWNlICIgKyBpbnRmICsgIiwgOiIgKyBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0b3BBY2Nlc3NQb2ludCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCBzdG9wIEFQLCA6IiArIGVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCwgMCwgRHJpdmVyQWN0aW9uLkRSSVZFUl9VTkxPQUQpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZChudWxsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZihtQ20udGV0aGVyKGludGYpICE9IENvbm5lY3Rpdml0eU1hbmFnZXIuVEVUSEVSX0VSUk9SX05PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgdGV0aGVyaW5nICIraW50Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgdGV0aGVyaW5nIG9uICIgKyBpbnRmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWQobnVsbCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTM2MiwxOTAgKzM1MSwyMSBAQAogICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KGNyLCBTZXR0aW5ncy5TZWN1cmUuV0lGSV9PTiwgZW5hYmxlZCA/IDEgOiAwKTsKICAgICB9CiAKLSAgICBOZXR3b3JrU3RhdGVUcmFja2VyIGdldE5ldHdvcmtTdGF0ZVRyYWNrZXIoKSB7Ci0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlcjsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjcGluZ1N1cHBsaWNhbnQoKX0KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBwaW5nU3VwcGxpY2FudCgpIHsKLSAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIucGluZygpOworICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY1BpbmdTdXBwbGljYW50KCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3N0YXJ0U2NhbigpfQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFNjYW4oYm9vbGVhbiBmb3JjZUFjdGl2ZSkgeworICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2Nhbihib29sZWFuIGZvcmNlQWN0aXZlKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgc3dpdGNoIChtV2lmaVN0YXRlVHJhY2tlci5nZXRTdXBwbGljYW50U3RhdGUoKSkgewotICAgICAgICAgICAgY2FzZSBESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICBjYXNlIElOQUNUSVZFOgotICAgICAgICAgICAgY2FzZSBTQ0FOTklORzoKLSAgICAgICAgICAgIGNhc2UgRE9STUFOVDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0U2NhblJlc3VsdEhhbmRsaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaVN0YXRlVHJhY2tlci5TVVBQTF9TQ0FOX0hBTkRMSU5HX0xJU1RfT05MWSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLnNjYW4oZm9yY2VBY3RpdmUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNzZXRXaWZpRW5hYmxlZChib29sZWFuKX0KLSAgICAgKiBAcGFyYW0gZW5hYmxlIHtAY29kZSB0cnVlfSB0byBlbmFibGUsIHtAY29kZSBmYWxzZX0gdG8gZGlzYWJsZS4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZW5hYmxlL2Rpc2FibGUgb3BlcmF0aW9uIHdhcwotICAgICAqICAgICAgICAgc3RhcnRlZCBvciBpcyBhbHJlYWR5IGluIHRoZSBxdWV1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRXaWZpRW5hYmxlZChib29sZWFuIGVuYWJsZSkgewotICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotICAgICAgICBpZiAobVdpZmlIYW5kbGVyID09IG51bGwpIHJldHVybiBmYWxzZTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaWZpSGFuZGxlcikgewotICAgICAgICAgICAgLy8gY2FsbGVyIG1heSBub3QgaGF2ZSBXQUtFX0xPQ0sgcGVybWlzc2lvbiAtIGl0J3Mgbm90IHJlcXVpcmVkIGhlcmUKLSAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7Ci0KLSAgICAgICAgICAgIG1MYXN0RW5hYmxlVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKLSAgICAgICAgICAgIC8vIHNldCBhIGZsYWcgaWYgdGhlIHVzZXIgaXMgZW5hYmxpbmcgV2lmaSB3aGlsZSBpbiBhaXJwbGFuZSBtb2RlCi0gICAgICAgICAgICBtQWlycGxhbmVNb2RlT3ZlcndyaWRkZW4gPSAoZW5hYmxlICYmIGlzQWlycGxhbmVNb2RlT24oKSAmJiBpc0FpcnBsYW5lVG9nZ2xlYWJsZSgpKTsKLSAgICAgICAgICAgIHNlbmRFbmFibGVNZXNzYWdlKGVuYWJsZSwgdHJ1ZSwgQmluZGVyLmdldENhbGxpbmdVaWQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGVzL2Rpc2FibGVzIFdpLUZpIHN5bmNocm9ub3VzbHkuCi0gICAgICogQHBhcmFtIGVuYWJsZSB7QGNvZGUgdHJ1ZX0gdG8gdHVybiBXaS1GaSBvbiwge0Bjb2RlIGZhbHNlfSB0byB0dXJuIGl0IG9mZi4KLSAgICAgKiBAcGFyYW0gcGVyc2lzdCB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNldHRpbmcgc2hvdWxkIGJlIHBlcnNpc3RlZC4KLSAgICAgKiBAcGFyYW0gdWlkIFRoZSBVSUQgb2YgdGhlIHByb2Nlc3MgbWFraW5nIHRoZSByZXF1ZXN0LgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgKG9yIGlmIHRoZSBleGlzdGluZyBzdGF0ZQotICAgICAqICAgICAgICAgaXMgdGhlIHNhbWUgYXMgdGhlIHJlcXVlc3RlZCBzdGF0ZSkKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0V2lmaUVuYWJsZWRCbG9ja2luZyhib29sZWFuIGVuYWJsZSwgYm9vbGVhbiBwZXJzaXN0LCBpbnQgdWlkKSB7Ci0gICAgICAgIGZpbmFsIGludCBldmVudHVhbFdpZmlTdGF0ZSA9IGVuYWJsZSA/IFdJRklfU1RBVEVfRU5BQkxFRCA6IFdJRklfU1RBVEVfRElTQUJMRUQ7Ci0gICAgICAgIGZpbmFsIGludCB3aWZpU3RhdGUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXRXaWZpU3RhdGUoKTsKLQotICAgICAgICBpZiAod2lmaVN0YXRlID09IGV2ZW50dWFsV2lmaVN0YXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW5hYmxlICYmIGlzQWlycGxhbmVNb2RlT24oKSAmJiAhbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTXVsdGlwbGUgY2FsbHMgdG8gdW5yZWdpc3RlclJlY2VpdmVyKCkgY2F1c2UgZXhjZXB0aW9uIGFuZCBhIHN5c3RlbSBjcmFzaC4KLSAgICAgICAgICogVGhpcyBjYW4gaGFwcGVuIGlmIGEgc3VwcGxpY2FudCBpcyBsb3N0IChvciBmaXJtd2FyZSBjcmFzaCBvY2N1cnMpIGFuZCB1c2VyIGluZGljYXRlcwotICAgICAgICAgKiBkaXNhYmxlIHdpZmkgYXQgdGhlIHNhbWUgdGltZS4KLSAgICAgICAgICogQXZvaWQgZG9pbmcgYSBkaXNhYmxlIHdoZW4gdGhlIGN1cnJlbnQgV2lmaSBzdGF0ZSBpcyBVTktOT1dOCi0gICAgICAgICAqIFRPRE86IEhhbmRsZSBkcml2ZXIgbG9hZCBmYWlsIGFuZCBzdXBwbGljYW50IGxvc3QgYXMgc2VwZXJhdGUgc3RhdGVzCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKHdpZmlTdGF0ZSA9PSBXSUZJX1NUQVRFX1VOS05PV04pICYmICFlbmFibGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGYWlsIFdpZmkgaWYgQVAgaXMgZW5hYmxlZAotICAgICAgICAgKiBUT0RPOiBEZXByZWNhdGUgV0lGSV9TVEFURV9VTktOT1dOIGFuZCByZW5hbWUgaXQKLSAgICAgICAgICogV0lGSV9TVEFURV9GQUlMRUQKLSAgICAgICAgICovCi0gICAgICAgIGlmICgobVdpZmlBcFN0YXRlID09IFdJRklfQVBfU1RBVEVfRU5BQkxFRCkgJiYgZW5hYmxlKSB7Ci0gICAgICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTiwgdWlkKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldFdpZmlFbmFibGVkU3RhdGUoZW5hYmxlID8gV0lGSV9TVEFURV9FTkFCTElORyA6IFdJRklfU1RBVEVfRElTQUJMSU5HLCB1aWQpOwotCi0gICAgICAgIGlmIChlbmFibGUpIHsKLSAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIubG9hZERyaXZlcigpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byBsb2FkIFdpLUZpIGRyaXZlci4iKTsKLSAgICAgICAgICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTiwgdWlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnN0YXJ0U3VwcGxpY2FudCgpKSB7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIudW5sb2FkRHJpdmVyKCk7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byBzdGFydCBzdXBwbGljYW50IGRhZW1vbi4iKTsKLSAgICAgICAgICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTiwgdWlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlZ2lzdGVyRm9yQnJvYWRjYXN0cygpOwotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc3RhcnRFdmVudExvb3AoKTsKLQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyKTsKLSAgICAgICAgICAgLy8gUmVtb3ZlIG5vdGlmaWNhdGlvbiAoaXQgd2lsbCBuby1vcCBpZiBpdCBpc24ndCB2aXNpYmxlKQotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOwotCi0gICAgICAgICAgICBib29sZWFuIGZhaWxlZFRvU3RvcFN1cHBsaWNhbnRPclVubG9hZERyaXZlciA9IGZhbHNlOwotCi0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnN0b3BTdXBwbGljYW50KCkpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbGVkIHRvIHN0b3Agc3VwcGxpY2FudCBkYWVtb24uIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04sIHVpZCk7Ci0gICAgICAgICAgICAgICAgZmFpbGVkVG9TdG9wU3VwcGxpY2FudE9yVW5sb2FkRHJpdmVyID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBSZXNldCBjb25uZWN0aW9ucyBhbmQgZGlzYWJsZSBpbnRlcmZhY2UKLSAgICAgICAgICAgICAqIGJlZm9yZSB3ZSB1bmxvYWQgdGhlIGRyaXZlcgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5yZXNldENvbm5lY3Rpb25zKHRydWUpOwotCi0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnVubG9hZERyaXZlcigpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byB1bmxvYWQgV2ktRmkgZHJpdmVyLiIpOwotICAgICAgICAgICAgICAgIGlmICghZmFpbGVkVG9TdG9wU3VwcGxpY2FudE9yVW5sb2FkRHJpdmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFdpZmlFbmFibGVkU3RhdGUoV0lGSV9TVEFURV9VTktOT1dOLCB1aWQpOwotICAgICAgICAgICAgICAgICAgICBmYWlsZWRUb1N0b3BTdXBwbGljYW50T3JVbmxvYWREcml2ZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZhaWxlZFRvU3RvcFN1cHBsaWNhbnRPclVubG9hZERyaXZlcikgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN1Y2Nlc3MhCi0KLSAgICAgICAgaWYgKHBlcnNpc3QpIHsKLSAgICAgICAgICAgIHBlcnNpc3RXaWZpRW5hYmxlZChlbmFibGUpOwotICAgICAgICB9Ci0gICAgICAgIHNldFdpZmlFbmFibGVkU3RhdGUoZXZlbnR1YWxXaWZpU3RhdGUsIHVpZCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRXaWZpRW5hYmxlZFN0YXRlKGludCB3aWZpU3RhdGUsIGludCB1aWQpIHsKLSAgICAgICAgZmluYWwgaW50IHByZXZpb3VzV2lmaVN0YXRlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0V2lmaVN0YXRlKCk7Ci0KLSAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHdpZmlTdGF0ZSA9PSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT24odWlkKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2lmaVN0YXRlID09IFdJRklfU1RBVEVfRElTQUJMRUQpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT2ZmKHVpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcGRhdGUgc3RhdGUKLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0V2lmaVN0YXRlKHdpZmlTdGF0ZSk7Ci0KLSAgICAgICAgLy8gQnJvYWRjYXN0Ci0gICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1dJRklfU1RBVEUsIHdpZmlTdGF0ZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9QUkVWSU9VU19XSUZJX1NUQVRFLCBwcmV2aW91c1dpZmlTdGF0ZSk7Ci0gICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc3RhcnRTY2FuKGZvcmNlQWN0aXZlKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKSB7CkBAIC01NjYsNiArMzg2LDQ3IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3NldFdpZmlFbmFibGVkKGJvb2xlYW4pfQorICAgICAqIEBwYXJhbSBlbmFibGUge0Bjb2RlIHRydWV9IHRvIGVuYWJsZSwge0Bjb2RlIGZhbHNlfSB0byBkaXNhYmxlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBlbmFibGUvZGlzYWJsZSBvcGVyYXRpb24gd2FzCisgICAgICogICAgICAgICBzdGFydGVkIG9yIGlzIGFscmVhZHkgaW4gdGhlIHF1ZXVlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRXaWZpRW5hYmxlZChib29sZWFuIGVuYWJsZSkgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworCisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJJbnZva2luZyBtV2lmaVN0YXRlTWFjaGluZS5zZXRXaWZpRW5hYmxlZFxuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBzZXQgYSBmbGFnIGlmIHRoZSB1c2VyIGlzIGVuYWJsaW5nIFdpZmkgd2hpbGUgaW4gYWlycGxhbmUgbW9kZQorICAgICAgICBpZiAoZW5hYmxlICYmIGlzQWlycGxhbmVNb2RlT24oKSAmJiBpc0FpcnBsYW5lVG9nZ2xlYWJsZSgpKSB7CisgICAgICAgICAgICBtQWlycGxhbmVNb2RlT3ZlcndyaWRkZW4uc2V0KHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0V2lmaUVuYWJsZWQoZW5hYmxlKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDYWxsZXIgbWlnaHQgbm90IGhhdmUgV1JJVEVfU0VDVVJFX1NFVFRJTkdTLAorICAgICAgICAgKiBvbmx5IENIQU5HRV9XSUZJX1NUQVRFIGlzIGVuZm9yY2VkCisgICAgICAgICAqLworICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIHBlcnNpc3RXaWZpRW5hYmxlZChlbmFibGUpOworICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7CisKKyAgICAgICAgaWYgKGVuYWJsZSkgeworICAgICAgICAgICAgaWYgKCFtSXNSZWNlaXZlclJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckZvckJyb2FkY2FzdHMoKTsKKyAgICAgICAgICAgICAgICBtSXNSZWNlaXZlclJlZ2lzdGVyZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1Jc1JlY2VpdmVyUmVnaXN0ZXJlZCl7CisgICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyKTsKKyAgICAgICAgICAgIG1Jc1JlY2VpdmVyUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCiAgICAgICogc2VlIHtAbGluayBXaWZpTWFuYWdlciNnZXRXaWZpU3RhdGUoKX0KICAgICAgKiBAcmV0dXJuIE9uZSBvZiB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxFRH0sCiAgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxJTkd9LApAQCAtNTc1LDY2ICs0MzYsNTkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFdpZmlFbmFibGVkU3RhdGUoKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5nZXRXaWZpU3RhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjZGlzY29ubmVjdCgpfQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0KCkgewotICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5kaXNjb25uZWN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3JlY29ubmVjdCgpfQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZWNvbm5lY3QoKSB7Ci0gICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLnJlY29ubmVjdENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjcmVhc3NvY2lhdGUoKX0KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVhc3NvY2lhdGUoKSB7Ci0gICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLnJlYXNzb2NpYXRlKCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jR2V0V2lmaVN0YXRlKCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3NldFdpZmlBcEVuYWJsZWQoV2lmaUNvbmZpZ3VyYXRpb24sIGJvb2xlYW4pfQogICAgICAqIEBwYXJhbSB3aWZpQ29uZmlnIFNTSUQsIHNlY3VyaXR5IGFuZCBjaGFubmVsIGRldGFpbHMgYXMKICAgICAgKiAgICAgICAgcGFydCBvZiBXaWZpQ29uZmlndXJhdGlvbgotICAgICAqIEBwYXJhbSBlbmFibGVkLCB0cnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZQorICAgICAqIEBwYXJhbSBlbmFibGVkIHRydWUgdG8gZW5hYmxlIGFuZCBmYWxzZSB0byBkaXNhYmxlCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHN0YXJ0IG9wZXJhdGlvbiB3YXMKICAgICAgKiAgICAgICAgIHN0YXJ0ZWQgb3IgaXMgYWxyZWFkeSBpbiB0aGUgcXVldWUuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2V0V2lmaUFwRW5hYmxlZChXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnLCBib29sZWFuIGVuYWJsZWQpIHsKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0V2lmaUFwRW5hYmxlZChXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnLCBib29sZWFuIGVuYWJsZWQpIHsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLSAgICAgICAgaWYgKG1XaWZpSGFuZGxlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgc3luY2hyb25pemVkIChtV2lmaUhhbmRsZXIpIHsKLQorICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgLyogVXNlIGRlZmF1bHQgY29uZmlnIGlmIHRoZXJlIGlzIG5vIGV4aXN0aW5nIGNvbmZpZyAqLworICAgICAgICAgICAgaWYgKHdpZmlDb25maWcgPT0gbnVsbCAmJiAoKHdpZmlDb25maWcgPSBnZXRXaWZpQXBDb25maWd1cmF0aW9uKCkpID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgd2lmaUNvbmZpZyA9IG5ldyBXaWZpQ29uZmlndXJhdGlvbigpOworICAgICAgICAgICAgICAgIHdpZmlDb25maWcuU1NJRCA9IG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy53aWZpX3RldGhlcl9jb25maWd1cmVfc3NpZF9kZWZhdWx0KTsKKyAgICAgICAgICAgICAgICB3aWZpQ29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LnNldChLZXlNZ210Lk5PTkUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENhbGxlciBtaWdodCBub3QgaGF2ZSBXUklURV9TRUNVUkVfU0VUVElOR1MsCisgICAgICAgICAgICAgKiBvbmx5IENIQU5HRV9XSUZJX1NUQVRFIGlzIGVuZm9yY2VkCisgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICBzZXRXaWZpQXBDb25maWd1cmF0aW9uKHdpZmlDb25maWcpOwogICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOwotCi0gICAgICAgICAgICBtTGFzdEFwRW5hYmxlVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKLSAgICAgICAgICAgIHNlbmRBY2Nlc3NQb2ludE1lc3NhZ2UoZW5hYmxlZCwgd2lmaUNvbmZpZywgQmluZGVyLmdldENhbGxpbmdVaWQoKSk7CiAgICAgICAgIH0KIAorICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXRXaWZpQXBFbmFibGVkKHdpZmlDb25maWcsIGVuYWJsZWQpOworCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHB1YmxpYyBXaWZpQ29uZmlndXJhdGlvbiBnZXRXaWZpQXBDb25maWd1cmF0aW9uKCkgeworICAgIC8qKgorICAgICAqIHNlZSB7QGxpbmsgV2lmaU1hbmFnZXIjZ2V0V2lmaUFwU3RhdGUoKX0KKyAgICAgKiBAcmV0dXJuIE9uZSBvZiB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9ESVNBQkxFRH0sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9ESVNBQkxJTkd9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRU5BQkxFRH0sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9FTkFCTElOR30sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9GQUlMRUR9CisgICAgICovCisgICAgcHVibGljIGludCBnZXRXaWZpQXBFbmFibGVkU3RhdGUoKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jR2V0V2lmaUFwU3RhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIFdpZmlNYW5hZ2VyI2dldFdpZmlBcENvbmZpZ3VyYXRpb24oKX0KKyAgICAgKiBAcmV0dXJuIHNvZnQgYWNjZXNzIHBvaW50IGNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFdpZmlDb25maWd1cmF0aW9uIGdldFdpZmlBcENvbmZpZ3VyYXRpb24oKSB7CiAgICAgICAgIGZpbmFsIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwogICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnID0gbmV3IFdpZmlDb25maWd1cmF0aW9uKCk7CiAgICAgICAgIGludCBhdXRoVHlwZTsKQEAgLTY1Miw3ICs1MDYsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldFdpZmlBcENvbmZpZ3VyYXRpb24oV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZykgeworICAgIC8qKgorICAgICAqIHNlZSB7QGxpbmsgV2lmaU1hbmFnZXIjc2V0V2lmaUFwQ29uZmlndXJhdGlvbihXaWZpQ29uZmlndXJhdGlvbil9CisgICAgICogQHBhcmFtIHdpZmlDb25maWcgV2lmaUNvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3Igc29mdCBhY2Nlc3MgcG9pbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0V2lmaUFwQ29uZmlndXJhdGlvbihXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CiAgICAgICAgIGZpbmFsIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwogICAgICAgICBib29sZWFuIGlzV3BhOwpAQCAtNjY4LDE0MyArNTI2LDI3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRW5hYmxlcy9kaXNhYmxlcyBXaS1GaSBBUCBzeW5jaHJvbm91c2x5LiBUaGUgZHJpdmVyIGlzIGxvYWRlZAotICAgICAqIGFuZCBzb2Z0IGFjY2VzcyBwb2ludCBjb25maWd1cmVkIGFzIGEgc2luZ2xlIG9wZXJhdGlvbi4KLSAgICAgKiBAcGFyYW0gZW5hYmxlIHtAY29kZSB0cnVlfSB0byB0dXJuIFdpLUZpIG9uLCB7QGNvZGUgZmFsc2V9IHRvIHR1cm4gaXQgb2ZmLgotICAgICAqIEBwYXJhbSB1aWQgVGhlIFVJRCBvZiB0aGUgcHJvY2VzcyBtYWtpbmcgdGhlIHJlcXVlc3QuCi0gICAgICogQHBhcmFtIHdpZmlDb25maWcgVGhlIFdpZmlDb25maWd1cmF0aW9uIGZvciBBUAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgKG9yIGlmIHRoZSBleGlzdGluZyBzdGF0ZQotICAgICAqICAgICAgICAgaXMgdGhlIHNhbWUgYXMgdGhlIHJlcXVlc3RlZCBzdGF0ZSkKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjZGlzY29ubmVjdCgpfQogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRXaWZpQXBFbmFibGVkQmxvY2tpbmcoYm9vbGVhbiBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQsIFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcpIHsKLSAgICAgICAgZmluYWwgaW50IGV2ZW50dWFsV2lmaUFwU3RhdGUgPSBlbmFibGUgPyBXSUZJX0FQX1NUQVRFX0VOQUJMRUQgOiBXSUZJX0FQX1NUQVRFX0RJU0FCTEVEOwotCi0gICAgICAgIGlmIChtV2lmaUFwU3RhdGUgPT0gZXZlbnR1YWxXaWZpQXBTdGF0ZSkgewotICAgICAgICAgICAgLyogQ29uZmlndXJhdGlvbiBjaGFuZ2VkIG9uIGEgcnVubmluZyBhY2Nlc3MgcG9pbnQgKi8KLSAgICAgICAgICAgIGlmKGVuYWJsZSAmJiAod2lmaUNvbmZpZyAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG53U2VydmljZS5zZXRBY2Nlc3NQb2ludCh3aWZpQ29uZmlnLCBtV2lmaVN0YXRlVHJhY2tlci5nZXRJbnRlcmZhY2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0ZUQVBfSUZBQ0UpOwotICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBDb25maWd1cmF0aW9uKHdpZmlDb25maWcpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJFeGNlcHRpb24gaW4gbndTZXJ2aWNlIGR1cmluZyBBUCByZXN0YXJ0Iik7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc3RvcEFjY2Vzc1BvaW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCBzdG9wIEFQLCA6IiArIGVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQsIHVpZCwgRHJpdmVyQWN0aW9uLkRSSVZFUl9VTkxPQUQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGYWlsIEFQIGlmIFdpZmkgaXMgZW5hYmxlZAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKChtV2lmaVN0YXRlVHJhY2tlci5nZXRXaWZpU3RhdGUoKSA9PSBXSUZJX1NUQVRFX0VOQUJMRUQpICYmIGVuYWJsZSkgewotICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5OT19EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShlbmFibGUgPyBXSUZJX0FQX1NUQVRFX0VOQUJMSU5HIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJRklfQVBfU1RBVEVfRElTQUJMSU5HLCB1aWQsIERyaXZlckFjdGlvbi5OT19EUklWRVJfVU5MT0FEKTsKLQotICAgICAgICBpZiAoZW5hYmxlKSB7Ci0KLSAgICAgICAgICAgIC8qIFVzZSBkZWZhdWx0IGNvbmZpZyBpZiB0aGVyZSBpcyBubyBleGlzdGluZyBjb25maWcgKi8KLSAgICAgICAgICAgIGlmICh3aWZpQ29uZmlnID09IG51bGwgJiYgKCh3aWZpQ29uZmlnID0gZ2V0V2lmaUFwQ29uZmlndXJhdGlvbigpKSA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgIHdpZmlDb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgICAgICB3aWZpQ29uZmlnLlNTSUQgPSBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcud2lmaV90ZXRoZXJfY29uZmlndXJlX3NzaWRfZGVmYXVsdCk7Ci0gICAgICAgICAgICAgICAgd2lmaUNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudC5zZXQoS2V5TWdtdC5OT05FKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5sb2FkRHJpdmVyKCkpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbGVkIHRvIGxvYWQgV2ktRmkgZHJpdmVyIGZvciBBUCBtb2RlIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5OT19EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0YXJ0QWNjZXNzUG9pbnQod2lmaUNvbmZpZywgbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0SW50ZXJmYWNlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPRlRBUF9JRkFDRSk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkV4Y2VwdGlvbiBpbiBzdGFydEFjY2Vzc1BvaW50KCkiKTsKLSAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQsIHVpZCwgRHJpdmVyQWN0aW9uLkRSSVZFUl9VTkxPQUQpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0V2lmaUFwQ29uZmlndXJhdGlvbih3aWZpQ29uZmlnKTsKLQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG53U2VydmljZS5zdG9wQWNjZXNzUG9pbnQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXhjZXB0aW9uIGluIHN0b3BBY2Nlc3NQb2ludCgpIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIudW5sb2FkRHJpdmVyKCkpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbGVkIHRvIHVubG9hZCBXaS1GaSBkcml2ZXIgZm9yIEFQIG1vZGUiKTsKLSAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQsIHVpZCwgRHJpdmVyQWN0aW9uLk5PX0RSSVZFUl9VTkxPQUQpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShldmVudHVhbFdpZmlBcFN0YXRlLCB1aWQsIERyaXZlckFjdGlvbi5OT19EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuZGlzY29ubmVjdENvbW1hbmQoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBzZWUge0BsaW5rIFdpZmlNYW5hZ2VyI2dldFdpZmlBcFN0YXRlKCl9Ci0gICAgICogQHJldHVybiBPbmUgb2Yge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMRUR9LAotICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMSU5HfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0VOQUJMRUR9LAotICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRU5BQkxJTkd9LAotICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRkFJTEVEfQorICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNyZWNvbm5lY3QoKX0KICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFdpZmlBcEVuYWJsZWRTdGF0ZSgpIHsKLSAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKLSAgICAgICAgcmV0dXJuIG1XaWZpQXBTdGF0ZTsKKyAgICBwdWJsaWMgdm9pZCByZWNvbm5lY3QoKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnJlY29ubmVjdENvbW1hbmQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKGludCB3aWZpQVBTdGF0ZSwgaW50IHVpZCwgRHJpdmVyQWN0aW9uIGZsYWcpIHsKLSAgICAgICAgZmluYWwgaW50IHByZXZpb3VzV2lmaUFwU3RhdGUgPSBtV2lmaUFwU3RhdGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVubG9hZCB0aGUgZHJpdmVyIGlmIGdvaW5nIHRvIGEgZmFpbGVkIHN0YXRlCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKG1XaWZpQXBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0ZBSUxFRCkgJiYgKGZsYWcgPT0gRHJpdmVyQWN0aW9uLkRSSVZFUl9VTkxPQUQpKSB7Ci0gICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci51bmxvYWREcml2ZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3aWZpQVBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT24odWlkKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2lmaUFQU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9ESVNBQkxFRCkgewotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlPZmYodWlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVwZGF0ZSBzdGF0ZQotICAgICAgICBtV2lmaUFwU3RhdGUgPSB3aWZpQVBTdGF0ZTsKLQotICAgICAgICAvLyBCcm9hZGNhc3QKLSAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuV0lGSV9BUF9TVEFURV9DSEFOR0VEX0FDVElPTik7Ci0gICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfV0lGSV9BUF9TVEFURSwgd2lmaUFQU3RhdGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfUFJFVklPVVNfV0lGSV9BUF9TVEFURSwgcHJldmlvdXNXaWZpQXBTdGF0ZSk7Ci0gICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjcmVhc3NvY2lhdGUoKX0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFzc29jaWF0ZSgpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUucmVhc3NvY2lhdGVDb21tYW5kKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04MTMsMjE3ICs1NTUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBMaXN0PFdpZmlDb25maWd1cmF0aW9uPiBnZXRDb25maWd1cmVkTmV0d29ya3MoKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIFN0cmluZyBsaXN0U3RyOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdlIGRvbid0IGNhY2hlIHRoZSBsaXN0LCBiZWNhdXNlIHdlIHdhbnQgdG8gYWxsb3cKLSAgICAgICAgICogZm9yIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGZpbGUKLSAgICAgICAgICogaGFzIGJlZW4gbW9kaWZpZWQgdGhyb3VnaCBzb21lIGV4dGVybmFsIG1lYW5zLAotICAgICAgICAgKiBzdWNoIGFzIHRoZSB3cGFfY2xpIGNvbW1hbmQgbGluZSBwcm9ncmFtLgotICAgICAgICAgKi8KLSAgICAgICAgbGlzdFN0ciA9IG1XaWZpU3RhdGVUcmFja2VyLmxpc3ROZXR3b3JrcygpOwotCi0gICAgICAgIExpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+IG5ldHdvcmtzID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+KCk7Ci0gICAgICAgIGlmIChsaXN0U3RyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbmV0d29ya3M7Ci0KLSAgICAgICAgU3RyaW5nW10gbGluZXMgPSBsaXN0U3RyLnNwbGl0KCJcbiIpOwotICAgICAgICAvLyBTa2lwIHRoZSBmaXJzdCBsaW5lLCB3aGljaCBpcyBhIGhlYWRlcgotICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbGluZXNbaV0uc3BsaXQoIlx0Iik7Ci0gICAgICAgICAgIC8vIG5ldHdvcmstaWQgfCBzc2lkIHwgYnNzaWQgfCBmbGFncwotICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgIGNvbmZpZy5uZXR3b3JrSWQgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3VsdFswXSk7Ci0gICAgICAgICAgIH0gY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMykgewotICAgICAgICAgICAgICAgaWYgKHJlc3VsdFszXS5pbmRleE9mKCJbQ1VSUkVOVF0iKSAhPSAtMSkKLSAgICAgICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzLkNVUlJFTlQ7Ci0gICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHRbM10uaW5kZXhPZigiW0RJU0FCTEVEXSIpICE9IC0xKQotICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRElTQUJMRUQ7Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyA9IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5FTkFCTEVEOwotICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyA9IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5FTkFCTEVEOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHJlYWROZXR3b3JrVmFyaWFibGVzKGNvbmZpZyk7Ci0gICAgICAgICAgIG5ldHdvcmtzLmFkZChjb25maWcpOwotICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV0d29ya3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgdmFyaWFibGVzIGZyb20gdGhlIHN1cHBsaWNhbnQgZGFlbW9uIHRoYXQgYXJlIG5lZWRlZCB0bwotICAgICAqIGZpbGwgaW4gdGhlIFdpZmlDb25maWd1cmF0aW9uIG9iamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIHN5bmNocm9uaXphdGlvbiBtb25pdG9yLgotICAgICAqIEBwYXJhbSBjb25maWcgdGhlIHtAbGluayBXaWZpQ29uZmlndXJhdGlvbn0gb2JqZWN0IHRvIGJlIGZpbGxlZCBpbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVhZE5ldHdvcmtWYXJpYWJsZXMoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0KLSAgICAgICAgaW50IG5ldElkID0gY29uZmlnLm5ldHdvcmtJZDsKLSAgICAgICAgaWYgKG5ldElkIDwgMCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvKgotICAgICAgICAgKiBUT0RPOiBtYXliZSBzaG91bGQgaGF2ZSBhIG5hdGl2ZSBtZXRob2QgdGhhdCB0YWtlcyBhbiBhcnJheSBvZgotICAgICAgICAgKiB2YXJpYWJsZSBuYW1lcyBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB2YWx1ZXMuIEJ1dCB3ZSdkIHN0aWxsCi0gICAgICAgICAqIGJlIGRvaW5nIGEgcm91bmQgdHJpcCB0byB0aGUgc3VwcGxpY2FudCBkYWVtb24gZm9yIGVhY2ggdmFyaWFibGUuCi0gICAgICAgICAqLwotICAgICAgICBTdHJpbmcgdmFsdWU7Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLnNzaWRWYXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIGNvbmZpZy5TU0lEID0gdmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25maWcuU1NJRCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24uYnNzaWRWYXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIGNvbmZpZy5CU1NJRCA9IHZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uZmlnLkJTU0lEID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5wcmlvcml0eVZhck5hbWUpOwotICAgICAgICBjb25maWcucHJpb3JpdHkgPSAtMTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLnByaW9yaXR5ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24uaGlkZGVuU1NJRFZhck5hbWUpOwotICAgICAgICBjb25maWcuaGlkZGVuU1NJRCA9IGZhbHNlOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb25maWcuaGlkZGVuU1NJRCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpICE9IDA7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24ud2VwVHhLZXlJZHhWYXJOYW1lKTsKLSAgICAgICAgY29uZmlnLndlcFR4S2V5SW5kZXggPSAtMTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLndlcFR4S2V5SW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB1cCB0byA0IFdFUCBrZXlzLiBOb3RlIHRoYXQgdGhlIGFjdHVhbCBrZXlzIGFyZSBub3QgcGFzc2VkIGJhY2ssCi0gICAgICAgICAqIGp1c3QgYSAiKiIgaWYgdGhlIGtleSBpcyBzZXQsIG9yIHRoZSBudWxsIHN0cmluZyBvdGhlcndpc2UuCi0gICAgICAgICAqLwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLndlcEtleVZhck5hbWVzW2ldKTsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLndlcEtleXNbaV0gPSB2YWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLndlcEtleXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBwcml2YXRlIHNoYXJlZCBrZXkuIE5vdGUgdGhhdCB0aGUgYWN0dWFsIGtleXMgYXJlIG5vdCBwYXNzZWQgYmFjaywKLSAgICAgICAgICoganVzdCBhICIqIiBpZiB0aGUga2V5IGlzIHNldCwgb3IgdGhlIG51bGwgc3RyaW5nIG90aGVyd2lzZS4KLSAgICAgICAgICovCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5wc2tWYXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIGNvbmZpZy5wcmVTaGFyZWRLZXkgPSB2YWx1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbmZpZy5wcmVTaGFyZWRLZXkgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUoY29uZmlnLm5ldHdvcmtJZCwKLSAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC52YXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9Ci0gICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLlByb3RvY29sLnN0cmluZ3MpOwotICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkUHJvdG9jb2xzLnNldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUoY29uZmlnLm5ldHdvcmtJZCwKLSAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210LnZhck5hbWUpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC5zdHJpbmdzKTsKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuc2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShjb25maWcubmV0d29ya0lkLAotICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLkF1dGhBbGdvcml0aG0udmFyTmFtZSk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQotICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5BdXRoQWxnb3JpdGhtLnN0cmluZ3MpOwotICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkQXV0aEFsZ29yaXRobXMuc2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShjb25maWcubmV0d29ya0lkLAotICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLlBhaXJ3aXNlQ2lwaGVyLnZhck5hbWUpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIuc3RyaW5ncyk7Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRQYWlyd2lzZUNpcGhlcnMuc2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShjb25maWcubmV0d29ya0lkLAotICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnZhck5hbWUpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uR3JvdXBDaXBoZXIuc3RyaW5ncyk7Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRHcm91cENpcGhlcnMuc2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uLkVudGVycHJpc2VGaWVsZCBmaWVsZCA6Ci0gICAgICAgICAgICAgICAgY29uZmlnLmVudGVycHJpc2VGaWVsZHMpIHsKLSAgICAgICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKG5ldElkLAotICAgICAgICAgICAgICAgICAgICBmaWVsZC52YXJOYW1lKCkpOwotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmllbGQgIT0gY29uZmlnLmVhcCkgdmFsdWUgPSByZW1vdmVEb3VibGVRdW90ZXModmFsdWUpOwotICAgICAgICAgICAgICAgIGZpZWxkLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZW1vdmVEb3VibGVRdW90ZXMoU3RyaW5nIHN0cmluZykgewotICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCgpIDw9IDIpIHJldHVybiAiIjsKLSAgICAgICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMSwgc3RyaW5nLmxlbmd0aCgpIC0gMSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1F1b3RlZFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgIHJldHVybiAiXCIiICsgc3RyaW5nICsgIlwiIjsKKyAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVNYWNoaW5lLnN5bmNHZXRDb25maWd1cmVkTmV0d29ya3MoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMzMsMjgwICs1NjUsMTAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGFkZE9yVXBkYXRlTmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiBjb25maWcpIHsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBJZiB0aGUgc3VwcGxpZWQgbmV0d29ya0lkIGlzIC0xLCB3ZSBjcmVhdGUgYSBuZXcgZW1wdHkKLSAgICAgICAgICogbmV0d29yayBjb25maWd1cmF0aW9uLiBPdGhlcndpc2UsIHRoZSBuZXR3b3JrSWQgc2hvdWxkCi0gICAgICAgICAqIHJlZmVyIHRvIGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24uCi0gICAgICAgICAqLwotICAgICAgICBpbnQgbmV0SWQgPSBjb25maWcubmV0d29ya0lkOwotICAgICAgICBib29sZWFuIG5ld05ldHdvcmsgPSBuZXRJZCA9PSAtMTsKLSAgICAgICAgYm9vbGVhbiBkb1JlY29uZmlnID0gZmFsc2U7Ci0gICAgICAgIC8vIG5ldHdvcmtJZCBvZiAtMSBtZWFucyB3ZSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBuZXR3b3JrCi0gICAgICAgIHN5bmNocm9uaXplZCAobVdpZmlTdGF0ZVRyYWNrZXIpIHsKLSAgICAgICAgICAgIGlmIChuZXdOZXR3b3JrKSB7Ci0gICAgICAgICAgICAgICAgbmV0SWQgPSBtV2lmaVN0YXRlVHJhY2tlci5hZGROZXR3b3JrKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ldElkIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRmFpbGVkIHRvIGFkZCBhIG5ldHdvcmshIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkb1JlY29uZmlnID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1OZWVkUmVjb25maWcgPSBtTmVlZFJlY29uZmlnIHx8IGRvUmVjb25maWc7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRWYXJpYWJsZXM6IHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBOb3RlIHRoYXQgaWYgYSBuZXR3b3JrSWQgZm9yIGEgbm9uLWV4aXN0ZW50IG5ldHdvcmsKLSAgICAgICAgICAgICAqIHdhcyBzdXBwbGllZCwgdGhlbiB0aGUgZmlyc3Qgc2V0TmV0d29ya1ZhcmlhYmxlKCkKLSAgICAgICAgICAgICAqIHdpbGwgZmFpbCwgc28gd2UgZG9uJ3QgYm90aGVyIHRvIG1ha2UgYSBzZXBhcmF0ZSBjaGVjawotICAgICAgICAgICAgICogZm9yIHRoZSB2YWxpZGl0eSBvZiB0aGUgSUQgdXAgZnJvbnQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChjb25maWcuU1NJRCAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLnNzaWRWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLlNTSUQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBTU0lEOiAiK2NvbmZpZy5TU0lEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY29uZmlnLkJTU0lEICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uYnNzaWRWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLkJTU0lEKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgQlNTSUQ6ICIrY29uZmlnLkJTU0lEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgYWxsb3dlZEtleU1hbmFnZW1lbnRTdHJpbmcgPQotICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LCBXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210LnN0cmluZ3MpOwotICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudC5jYXJkaW5hbGl0eSgpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC52YXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEtleU1hbmFnZW1lbnRTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBrZXlfbWdtdDogIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkS2V5TWFuYWdlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRQcm90b2NvbHNTdHJpbmcgPQotICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRQcm90b2NvbHMsIFdpZmlDb25maWd1cmF0aW9uLlByb3RvY29sLnN0cmluZ3MpOwotICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkUHJvdG9jb2xzLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAhbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC52YXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFByb3RvY29sc1N0cmluZykpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IHByb3RvOiAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRQcm90b2NvbHNTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBhbGxvd2VkQXV0aEFsZ29yaXRobXNTdHJpbmcgPQotICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRBdXRoQWxnb3JpdGhtcywgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS5zdHJpbmdzKTsKLSAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZEF1dGhBbGdvcml0aG1zLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAhbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5BdXRoQWxnb3JpdGhtLnZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQXV0aEFsZ29yaXRobXNTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBhdXRoX2FsZzogIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQXV0aEFsZ29yaXRobXNTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBhbGxvd2VkUGFpcndpc2VDaXBoZXJzU3RyaW5nID0KLSAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkUGFpcndpc2VDaXBoZXJzLCBXaWZpQ29uZmlndXJhdGlvbi5QYWlyd2lzZUNpcGhlci5zdHJpbmdzKTsKLSAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZFBhaXJ3aXNlQ2lwaGVycy5jYXJkaW5hbGl0eSgpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIudmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRQYWlyd2lzZUNpcGhlcnNTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBwYWlyd2lzZTogIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUGFpcndpc2VDaXBoZXJzU3RyaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgYWxsb3dlZEdyb3VwQ2lwaGVyc1N0cmluZyA9Ci0gICAgICAgICAgICAgICAgbWFrZVN0cmluZyhjb25maWcuYWxsb3dlZEdyb3VwQ2lwaGVycywgV2lmaUNvbmZpZ3VyYXRpb24uR3JvdXBDaXBoZXIuc3RyaW5ncyk7Ci0gICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRHcm91cENpcGhlcnMuY2FyZGluYWxpdHkoKSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkR3JvdXBDaXBoZXJzU3RyaW5nKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgZ3JvdXA6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEdyb3VwQ2lwaGVyc1N0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUHJldmVudCBjbGllbnQgc2NyZXctdXAgYnkgcGFzc2luZyBpbiBhIFdpZmlDb25maWd1cmF0aW9uIHdlIGdhdmUgaXQKLSAgICAgICAgICAgIC8vIGJ5IHByZXZlbnRpbmcgIioiIGFzIGEga2V5LgotICAgICAgICAgICAgaWYgKGNvbmZpZy5wcmVTaGFyZWRLZXkgIT0gbnVsbCAmJiAhY29uZmlnLnByZVNoYXJlZEtleS5lcXVhbHMoIioiKSAmJgotICAgICAgICAgICAgICAgICAgICAhbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5wc2tWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnByZVNoYXJlZEtleSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IHBzazogIitjb25maWcucHJlU2hhcmVkS2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sZWFuIGhhc1NldEtleSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGNvbmZpZy53ZXBLZXlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZy53ZXBLZXlzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgY2xpZW50IHNjcmV3LXVwIGJ5IHBhc3NpbmcgaW4gYSBXaWZpQ29uZmlndXJhdGlvbiB3ZSBnYXZlIGl0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJ5IHByZXZlbnRpbmcgIioiIGFzIGEga2V5LgotICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLndlcEtleXNbaV0gIT0gbnVsbCAmJiAhY29uZmlnLndlcEtleXNbaV0uZXF1YWxzKCIqIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi53ZXBLZXlWYXJOYW1lc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHNldCB3ZXBfa2V5IitpKyI6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaGFzU2V0S2V5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGhhc1NldEtleSkgewotICAgICAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLndlcFR4S2V5SWR4VmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvbmZpZy53ZXBUeEtleUluZGV4KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBzZXQgd2VwX3R4X2tleWlkeDogIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLndlcFR4S2V5SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5wcmlvcml0eVZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvbmZpZy5wcmlvcml0eSkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCBjb25maWcuU1NJRCArICI6IGZhaWxlZCB0byBzZXQgcHJpb3JpdHk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArY29uZmlnLnByaW9yaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY29uZmlnLmhpZGRlblNTSUQgJiYgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uaGlkZGVuU1NJRFZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvbmZpZy5oaWRkZW5TU0lEID8gMSA6IDApKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0IGhpZGRlblNTSUQ6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmhpZGRlblNTSUQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoV2lmaUNvbmZpZ3VyYXRpb24uRW50ZXJwcmlzZUZpZWxkIGZpZWxkCi0gICAgICAgICAgICAgICAgICAgIDogY29uZmlnLmVudGVycHJpc2VGaWVsZHMpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFyTmFtZSA9IGZpZWxkLnZhck5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBmaWVsZC52YWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZCAhPSBjb25maWcuZWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSA/ICJOVUxMIiA6IGNvbnZlcnRUb1F1b3RlZFN0cmluZyh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCBjb25maWcuU1NJRCArICI6IGZhaWxlZCB0byBzZXQgIiArIHZhck5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogIiArIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXRJZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEZvciBhbiB1cGRhdGUsIGlmIG9uZSBvZiB0aGUgc2V0TmV0d29ya1ZhcmlhYmxlIG9wZXJhdGlvbnMgZmFpbHMsCi0gICAgICAgICAqIHdlIG1pZ2h0IHdhbnQgdG8gcm9sbCBiYWNrIGFsbCB0aGUgY2hhbmdlcyBhbHJlYWR5IG1hZGUuIEJ1dCB0aGUKLSAgICAgICAgICogY2hhbmNlcyBhcmUgdGhhdCBpZiBhbnl0aGluZyBpcyBnb2luZyB0byBnbyB3cm9uZywgaXQnbGwgaGFwcGVuCi0gICAgICAgICAqIHRoZSBmaXJzdCB0aW1lIHdlIHRyeSB0byBzZXQgb25lIG9mIHRoZSB2YXJpYWJsZXMuCi0gICAgICAgICAqLwotICAgICAgICBpZiAobmV3TmV0d29yaykgewotICAgICAgICAgICAgcmVtb3ZlTmV0d29yayhuZXRJZCk7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5kKFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IGEgbmV0d29yayB2YXJpYWJsZSwgcmVtb3ZlZCBuZXR3b3JrOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG5ldElkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jQWRkT3JVcGRhdGVOZXR3b3JrKGNvbmZpZyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VTdHJpbmcoQml0U2V0IHNldCwgU3RyaW5nW10gc3RyaW5ncykgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBpbnQgbmV4dFNldEJpdCA9IC0xOwotCi0gICAgICAgIC8qIE1ha2Ugc3VyZSBhbGwgc2V0IGJpdHMgYXJlIGluIFswLCBzdHJpbmdzLmxlbmd0aCkgdG8gYXZvaWQKLSAgICAgICAgICogZ29pbmcgb3V0IG9mIGJvdW5kcyBvbiBzdHJpbmdzLiAgKFNob3VsZG4ndCBoYXBwZW4sIGJ1dC4uLikgKi8KLSAgICAgICAgc2V0ID0gc2V0LmdldCgwLCBzdHJpbmdzLmxlbmd0aCk7Ci0KLSAgICAgICAgd2hpbGUgKChuZXh0U2V0Qml0ID0gc2V0Lm5leHRTZXRCaXQobmV4dFNldEJpdCArIDEpKSAhPSAtMSkgewotICAgICAgICAgICAgYnVmLmFwcGVuZChzdHJpbmdzW25leHRTZXRCaXRdLnJlcGxhY2UoJ18nLCAnLScpKS5hcHBlbmQoJyAnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzcGFjZQotICAgICAgICBpZiAoc2V0LmNhcmRpbmFsaXR5KCkgPiAwKSB7Ci0gICAgICAgICAgICBidWYuc2V0TGVuZ3RoKGJ1Zi5sZW5ndGgoKSAtIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBsb29rdXBTdHJpbmcoU3RyaW5nIHN0cmluZywgU3RyaW5nW10gc3RyaW5ncykgewotICAgICAgICBpbnQgc2l6ZSA9IHN0cmluZ3MubGVuZ3RoOwotCi0gICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKCctJywgJ18nKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICAgIGlmIChzdHJpbmcuZXF1YWxzKHN0cmluZ3NbaV0pKQotICAgICAgICAgICAgICAgIHJldHVybiBpOwotCi0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIC8vIGlmIHdlIGV2ZXIgZ2V0IGhlcmUsIHdlIHNob3VsZCBwcm9iYWJseSBhZGQgdGhlCi0gICAgICAgICAgICAvLyB2YWx1ZSB0byBXaWZpQ29uZmlndXJhdGlvbiB0byByZWZsZWN0IHRoYXQgaXQncwotICAgICAgICAgICAgLy8gc3VwcG9ydGVkIGJ5IHRoZSBXUEEgc3VwcGxpY2FudAotICAgICAgICAgICAgU2xvZy53KFRBRywgIkZhaWxlZCB0byBsb29rLXVwIGEgc3RyaW5nOiAiICsgc3RyaW5nKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKioKKyAgICAgLyoqCiAgICAgICogU2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3JlbW92ZU5ldHdvcmsoaW50KX0KICAgICAgKiBAcGFyYW0gbmV0SWQgdGhlIGludGVnZXIgdGhhdCBpZGVudGlmaWVzIHRoZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24KICAgICAgKiB0byB0aGUgc3VwcGxpY2FudApAQCAtMTMxNCw4ICs1NzYsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZU5ldHdvcmsoaW50IG5ldElkKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLnJlbW92ZU5ldHdvcmsobmV0SWQpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY1JlbW92ZU5ldHdvcmsobmV0SWQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTMyNywxNCArNTg4LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVOZXR3b3JrKGludCBuZXRJZCwgYm9vbGVhbiBkaXNhYmxlT3RoZXJzKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgU3RyaW5nIGlmbmFtZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldEludGVyZmFjZU5hbWUoKTsKLSAgICAgICAgTmV0d29ya1V0aWxzLmVuYWJsZUludGVyZmFjZShpZm5hbWUpOwotICAgICAgICBib29sZWFuIHJlc3VsdCA9IG1XaWZpU3RhdGVUcmFja2VyLmVuYWJsZU5ldHdvcmsobmV0SWQsIGRpc2FibGVPdGhlcnMpOwotICAgICAgICBpZiAoIXJlc3VsdCkgewotICAgICAgICAgICAgTmV0d29ya1V0aWxzLmRpc2FibGVJbnRlcmZhY2UoaWZuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0VuYWJsZU5ldHdvcmsobmV0SWQsIGRpc2FibGVPdGhlcnMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM0NSw4ICs1OTksNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVOZXR3b3JrKGludCBuZXRJZCkgewogICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5kaXNhYmxlTmV0d29yayhuZXRJZCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jRGlzYWJsZU5ldHdvcmsobmV0SWQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM1OSw3ICs2MTIsNyBAQAogICAgICAgICAgKiBNYWtlIHN1cmUgd2UgaGF2ZSB0aGUgbGF0ZXN0IGluZm9ybWF0aW9uLCBieSBzZW5kaW5nCiAgICAgICAgICAqIGEgc3RhdHVzIHJlcXVlc3QgdG8gdGhlIHN1cHBsaWNhbnQuCiAgICAgICAgICAqLwotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIucmVxdWVzdENvbm5lY3Rpb25JbmZvKCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jUmVxdWVzdENvbm5lY3Rpb25JbmZvKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzY5LDE4MCArNjIyLDE5IEBACiAgICAgICovCiAgICAgcHVibGljIExpc3Q8U2NhblJlc3VsdD4gZ2V0U2NhblJlc3VsdHMoKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIFN0cmluZyByZXBseTsKLQotICAgICAgICByZXBseSA9IG1XaWZpU3RhdGVUcmFja2VyLnNjYW5SZXN1bHRzKCk7Ci0gICAgICAgIGlmIChyZXBseSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8U2NhblJlc3VsdD4gc2Nhbkxpc3QgPSBuZXcgQXJyYXlMaXN0PFNjYW5SZXN1bHQ+KCk7Ci0KLSAgICAgICAgaW50IGxpbmVDb3VudCA9IDA7Ci0KLSAgICAgICAgaW50IHJlcGx5TGVuID0gcmVwbHkubGVuZ3RoKCk7Ci0gICAgICAgIC8vIFBhcnNlIHRoZSByZXN1bHQgc3RyaW5nLCBrZWVwaW5nIGluIG1pbmQgdGhhdCB0aGUgbGFzdCBsaW5lIGRvZXMKLSAgICAgICAgLy8gbm90IGVuZCB3aXRoIGEgbmV3bGluZS4KLSAgICAgICAgZm9yIChpbnQgbGluZUJlZyA9IDAsIGxpbmVFbmQgPSAwOyBsaW5lRW5kIDw9IHJlcGx5TGVuOyArK2xpbmVFbmQpIHsKLSAgICAgICAgICAgIGlmIChsaW5lRW5kID09IHJlcGx5TGVuIHx8IHJlcGx5LmNoYXJBdChsaW5lRW5kKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgKytsaW5lQ291bnQ7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBTa2lwIHRoZSBmaXJzdCBsaW5lLCB3aGljaCBpcyBhIGhlYWRlcgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChsaW5lQ291bnQgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBsaW5lQmVnID0gbGluZUVuZCArIDE7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGluZUVuZCA+IGxpbmVCZWcpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSByZXBseS5zdWJzdHJpbmcobGluZUJlZywgbGluZUVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIFNjYW5SZXN1bHQgc2NhblJlc3VsdCA9IHBhcnNlU2NhblJlc3VsdChsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjYW5SZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbkxpc3QuYWRkKHNjYW5SZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIm1pc2Zvcm1hdHRlZCBzY2FuIHJlc3VsdCBmb3I6ICIgKyBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lQmVnID0gbGluZUVuZCArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0U2NhblJlc3VsdHNMaXN0KHNjYW5MaXN0KTsKLSAgICAgICAgcmV0dXJuIHNjYW5MaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSBzY2FuIHJlc3VsdCBsaW5lIHBhc3NlZCB0byB1cyBieSB3cGFfc3VwcGxpY2FudCAoaGVscGVyKS4KLSAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSB0byBwYXJzZQotICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBTY2FuUmVzdWx0fSBvYmplY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIFNjYW5SZXN1bHQgcGFyc2VTY2FuUmVzdWx0KFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIFNjYW5SZXN1bHQgc2NhblJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGlmIChsaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDYWNoZSBpbXBsZW1lbnRhdGlvbiAoTGlua2VkSGFzaE1hcCkgaXMgbm90IHN5bmNocm9uaXplZCwgdGh1cywKLSAgICAgICAgICAgICAqIG11c3Qgc3luY2hyb25pemVkIGhlcmUhCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVNjYW5SZXN1bHRDYWNoZSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IHNjYW5SZXN1bHRQYXR0ZXJuLnNwbGl0KGxpbmUpOwotICAgICAgICAgICAgICAgIGlmICgzIDw9IHJlc3VsdC5sZW5ndGggJiYgcmVzdWx0Lmxlbmd0aCA8PSA1KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBic3NpZCA9IHJlc3VsdFswXTsKLSAgICAgICAgICAgICAgICAgICAgLy8gYnNzaWQgfCBmcmVxdWVuY3kgfCBsZXZlbCB8IGZsYWdzIHwgc3NpZAotICAgICAgICAgICAgICAgICAgICBpbnQgZnJlcXVlbmN5OwotICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3VsdFsxXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IEludGVnZXIucGFyc2VJbnQocmVzdWx0WzJdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbWUgaW1wbGVtZW50YXRpb25zIGF2b2lkIG5lZ2F0aXZlIHZhbHVlcyBieSBhZGRpbmcgMjU2Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBzbyB3ZSBuZWVkIHRvIGFkanVzdCBmb3IgdGhhdCBoZXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPiAwKSBsZXZlbCAtPSAyNTY7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogVGhlIGZvcm1hdHRpbmcgb2YgdGhlIHJlc3VsdHMgcmV0dXJuZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICogd3BhX3N1cHBsaWNhbnQgaXMgaW50ZW5kZWQgdG8gbWFrZSB0aGUgZmllbGRzCi0gICAgICAgICAgICAgICAgICAgICAqIGxpbmUgdXAgbmljZWx5IHdoZW4gcHJpbnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICogbm90IHRvIG1ha2UgdGhlbSBlYXN5IHRvIHBhcnNlLiBTbyB3ZSBoYXZlIHRvCi0gICAgICAgICAgICAgICAgICAgICAqIGFwcGx5IHNvbWUgaGV1cmlzdGljcyB0byBmaWd1cmUgb3V0IHdoaWNoIGZpZWxkCi0gICAgICAgICAgICAgICAgICAgICAqIGlzIHRoZSBTU0lEIGFuZCB3aGljaCBmaWVsZCBpcyB0aGUgZmxhZ3MuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3NpZDsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZsYWdzOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0WzNdLmNoYXJBdCgwKSA9PSAnWycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlc3VsdFszXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2lkID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9IHJlc3VsdFszXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQubGVuZ3RoID09IDUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmVzdWx0WzNdOwotICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9IHJlc3VsdFs0XTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUsIHdlIG11c3QgaGF2ZSAzIGZpZWxkczogbm8gZmxhZ3MgYW5kIHNzaWQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldAotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGJzc2lkICsgc3NpZCBpcyB0aGUgaGFzaCBrZXkKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGJzc2lkICsgc3NpZDsKLSAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdCA9IG1TY2FuUmVzdWx0Q2FjaGUuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQubGV2ZWwgPSBsZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQuU1NJRCA9IHNzaWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0LmNhcGFiaWxpdGllcyA9IGZsYWdzOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdC5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgYWRkIHNjYW4gcmVzdWx0cyB0aGF0IGhhdmUgbm8gU1NJRCBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDwgc3NpZC50cmltKCkubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNjYW5SZXN1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2lkLCBic3NpZCwgZmxhZ3MsIGxldmVsLCBmcmVxdWVuY3kpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TY2FuUmVzdWx0Q2FjaGUucHV0KGtleSwgc2NhblJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiTWlzZm9ybWF0dGVkIHNjYW4gcmVzdWx0IHRleHQgd2l0aCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmxlbmd0aCArICIgZmllbGRzOiAiICsgbGluZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNjYW5SZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgdGhlICJmbGFncyIgZmllbGQgcGFzc2VkIGJhY2sgaW4gYSBzY2FuIHJlc3VsdCBieSB3cGFfc3VwcGxpY2FudCwKLSAgICAgKiBhbmQgY29uc3RydWN0IGEge0Bjb2RlIFdpZmlDb25maWd1cmF0aW9ufSB0aGF0IGRlc2NyaWJlcyB0aGUgZW5jcnlwdGlvbiwKLSAgICAgKiBrZXkgbWFuYWdlbWVudCwgYW5kIGF1dGhlbnRpY2Fpb24gY2FwYWJpbGl0aWVzIG9mIHRoZSBhY2Nlc3MgcG9pbnQuCi0gICAgICogQHBhcmFtIGZsYWdzIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgd3BhX3N1cHBsaWNhbnQKLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgV2lmaUNvbmZpZ3VyYXRpb259IG9iamVjdCwgZmlsbGVkIGluCi0gICAgICovCi0gICAgV2lmaUNvbmZpZ3VyYXRpb24gcGFyc2VTY2FuRmxhZ3MoU3RyaW5nIGZsYWdzKSB7Ci0gICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBXaWZpQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIGlmIChmbGFncy5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuc2V0KFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQuTk9ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gLi4uIHRvIGJlIGltcGxlbWVudGVkCi0gICAgICAgIHJldHVybiBjb25maWc7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jR2V0U2NhblJlc3VsdHNMaXN0KCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGVsbCB0aGUgc3VwcGxpY2FudCB0byBwZXJzaXN0IHRoZSBjdXJyZW50IGxpc3Qgb2YgY29uZmlndXJlZCBuZXR3b3Jrcy4KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZAorICAgICAqCisgICAgICogVE9ETzogZGVwcmVjYXRlIHRoaXMKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzYXZlQ29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQ7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaWZpU3RhdGVUcmFja2VyKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBtV2lmaVN0YXRlVHJhY2tlci5zYXZlQ29uZmlnKCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICYmIG1OZWVkUmVjb25maWcpIHsKLSAgICAgICAgICAgICAgICBtTmVlZFJlY29uZmlnID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbVdpZmlTdGF0ZVRyYWNrZXIucmVsb2FkQ29uZmlnKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLk5FVFdPUktfSURTX0NIQU5HRURfQUNUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBJbmZvcm0gdGhlIGJhY2t1cCBtYW5hZ2VyIGFib3V0IGEgZGF0YSBjaGFuZ2UKLSAgICAgICAgSUJhY2t1cE1hbmFnZXIgaWJtID0gSUJhY2t1cE1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZSgKLSAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuQkFDS1VQX1NFUlZJQ0UpKTsKLSAgICAgICAgaWYgKGlibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlibS5kYXRhQ2hhbmdlZCgiY29tLmFuZHJvaWQucHJvdmlkZXJzLnNldHRpbmdzIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRyeSBhZ2FpbiBsYXRlcgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jU2F2ZUNvbmZpZygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTU1Nyw3ICs2NDksNyBAQAogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLCBlLmcuLAogICAgICAqIHtAY29kZSBudW1DaGFubmVsc30gaXMgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2V0TnVtQWxsb3dlZENoYW5uZWxzKGludCBudW1DaGFubmVscywgYm9vbGVhbiBwZXJzaXN0KSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldE51bUFsbG93ZWRDaGFubmVscyhpbnQgbnVtQ2hhbm5lbHMsIGJvb2xlYW4gcGVyc2lzdCkgewogICAgICAgICBTbG9nLmkoVEFHLCAiV2lmaVNlcnZpY2UgdHJ5aW5nIHRvIHNldE51bUFsbG93ZWQgdG8gIitudW1DaGFubmVscysKICAgICAgICAgICAgICAgICAiIHdpdGggcGVyc2lzdCBzZXQgdG8gIitwZXJzaXN0KTsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKQEAgLTE1NzksMjggKzY3MSwxNSBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1XaWZpSGFuZGxlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdpZmlIYW5kbGVyLAotICAgICAgICAgICAgICAgIE1FU1NBR0VfU0VUX0NIQU5ORUxTLCBudW1DaGFubmVscywgKHBlcnNpc3QgPyAxIDogMCkpLnNlbmRUb1RhcmdldCgpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldHMgdGhlIG51bWJlciBvZiBhbGxvd2VkIHJhZGlvIGZyZXF1ZW5jeSBjaGFubmVscyBzeW5jaHJvbm91c2x5Ci0gICAgICogQHBhcmFtIG51bUNoYW5uZWxzIHRoZSBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscy4gTXVzdCBiZSBncmVhdGVyIHRoYW4gMAotICAgICAqIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYuCi0gICAgICogQHBhcmFtIHBlcnNpc3Qge0Bjb2RlIHRydWV9IGlmIHRoZSBzZXR0aW5nIHNob3VsZCBiZSByZW1lbWJlcmVkLgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldE51bUFsbG93ZWRDaGFubmVsc0Jsb2NraW5nKGludCBudW1DaGFubmVscywgYm9vbGVhbiBwZXJzaXN0KSB7CiAgICAgICAgIGlmIChwZXJzaXN0KSB7CiAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9OVU1fQUxMT1dFRF9DSEFOTkVMUywKICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5zZXROdW1BbGxvd2VkQ2hhbm5lbHMobnVtQ2hhbm5lbHMpOworCisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldE51bUFsbG93ZWRDaGFubmVscyhudW1DaGFubmVscyk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjE4LDcgKzY5Nyw3IEBACiAgICAgICAgICAqIFdpLUZpIGlzIG5vdCBjdXJyZW50bHkgZW5hYmxlZCksIGdldCB0aGUgdmFsdWUgZnJvbQogICAgICAgICAgKiBTZXR0aW5ncy4KICAgICAgICAgICovCi0gICAgICAgIG51bUNoYW5uZWxzID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TnVtQWxsb3dlZENoYW5uZWxzKCk7CisgICAgICAgIG51bUNoYW5uZWxzID0gbVdpZmlTdGF0ZU1hY2hpbmUuZ2V0TnVtQWxsb3dlZENoYW5uZWxzKCk7CiAgICAgICAgIGlmIChudW1DaGFubmVscyA8IDApIHsKICAgICAgICAgICAgIG51bUNoYW5uZWxzID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTlVNX0FMTE9XRURfQ0hBTk5FTFMsCkBAIC0xNjQ0LDcgKzcyMyw3NiBAQAogICAgICAqLwogICAgIHB1YmxpYyBEaGNwSW5mbyBnZXREaGNwSW5mbygpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLmdldERoY3BJbmZvKCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jR2V0RGhjcEluZm8oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjc3RhcnRXaWZpfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRXaWZpKCkgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworICAgICAgICAvKiBUT0RPOiBtYXkgYmUgYWRkIHBlcm1pc3Npb25zIGZvciBhY2Nlc3Mgb25seSB0byBjb25uZWN0aXZpdHkgc2VydmljZQorICAgICAgICAgKiBUT0RPOiBpZiBhIHN0YXJ0IGlzc3VlZCwga2VlcCB3aWZpIGFsaXZlIHVudGlsIGEgc3RvcCBpc3N1ZWQgaXJyZXNwZWN0aXZlCisgICAgICAgICAqIG9mIFdpZmlMb2NrICYgZGV2aWNlIGlkbGUgc3RhdHVzIHVubGVzcyB3aWZpIGVuYWJsZWQgc3RhdHVzIGlzIHRvZ2dsZWQKKyAgICAgICAgICovCisKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0RHJpdmVyU3RhcnQodHJ1ZSk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnJlY29ubmVjdENvbW1hbmQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjc3RvcFdpZml9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wV2lmaSgpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgLyogVE9ETzogbWF5IGJlIGFkZCBwZXJtaXNzaW9ucyBmb3IgYWNjZXNzIG9ubHkgdG8gY29ubmVjdGl2aXR5IHNlcnZpY2UKKyAgICAgICAgICogVE9ETzogaWYgYSBzdG9wIGlzIGlzc3VlZCwgd2lmaSBpcyBicm91Z2h0IHVwIG9ubHkgYnkgc3RhcnRXaWZpCisgICAgICAgICAqIHVubGVzcyB3aWZpIGVuYWJsZWQgc3RhdHVzIGlzIHRvZ2dsZWQKKyAgICAgICAgICovCisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldERyaXZlclN0YXJ0KGZhbHNlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNhZGRUb0JsYWNrbGlzdH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRvQmxhY2tsaXN0KFN0cmluZyBic3NpZCkgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworCisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmFkZFRvQmxhY2tsaXN0KGJzc2lkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjY2xlYXJCbGFja2xpc3R9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckJsYWNrbGlzdCgpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5jbGVhckJsYWNrbGlzdCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3ROZXR3b3JrV2l0aElkKGludCBuZXR3b3JrSWQpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuY29ubmVjdE5ldHdvcmsobmV0d29ya0lkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0TmV0d29ya1dpdGhDb25maWcoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmNvbm5lY3ROZXR3b3JrKGNvbmZpZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2F2ZU5ldHdvcmsoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNhdmVOZXR3b3JrKGNvbmZpZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZm9yZ2V0TmV0d29yayhpbnQgbmV0SWQpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuZm9yZ2V0TmV0d29yayhuZXRJZCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBmaW5hbCBCcm9hZGNhc3RSZWNlaXZlciBtUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CkBAIC0xNjYzLDE3ICs4MTEsMTEgQEAKICAgICAgICAgICAgICAgICBtQWxhcm1NYW5hZ2VyLmNhbmNlbChtSWRsZUludGVudCk7CiAgICAgICAgICAgICAgICAgbURldmljZUlkbGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBtU2NyZWVuT2ZmID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuZW5hYmxlUnNzaVBvbGxpbmcodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgLyogREhDUCBvciBvdGhlciB0ZW1wb3JhcnkgZmFpbHVyZXMgaW4gdGhlIHBhc3QgY2FuIHByZXZlbnQKLSAgICAgICAgICAgICAgICAgKiBhIGRpc2FibGVkIG5ldHdvcmsgZnJvbSBiZWluZyBjb25uZWN0ZWQgdG8sIGVuYWJsZSBvbiBzY3JlZW4gb24KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAobVdpZmlTdGF0ZVRyYWNrZXIuaXNBbnlOZXR3b3JrRGlzYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBzZW5kRW5hYmxlTmV0d29ya3NNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmVuYWJsZVJzc2lQb2xsaW5nKHRydWUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEludGVudC5BQ1RJT05fU0NSRUVOX09GRikpIHsKICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiQUNUSU9OX1NDUkVFTl9PRkYiKTsKICAgICAgICAgICAgICAgICBtU2NyZWVuT2ZmID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5lbmFibGVSc3NpUG9sbGluZyhmYWxzZSk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuZW5hYmxlUnNzaVBvbGxpbmcoZmFsc2UpOwogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogU2V0IGEgdGltZXIgdG8gcHV0IFdpLUZpIHRvIHNsZWVwLCBidXQgb25seSBpZiB0aGUgc2NyZWVuIGlzIG9mZgogICAgICAgICAgICAgICAgICAqIEFORCB0aGUgInN0YXkgb24gd2hpbGUgcGx1Z2dlZCBpbiIgc2V0dGluZyBkb2Vzbid0IG1hdGNoIHRoZQpAQCAtMTY4MSwxMSArODIzLDExIEBACiAgICAgICAgICAgICAgICAgICogb3IgcGx1Z2dlZCBpbiB0byBBQykuCiAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgaWYgKCFzaG91bGRXaWZpU3RheUF3YWtlKHN0YXlBd2FrZUNvbmRpdGlvbnMsIG1QbHVnZ2VkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgV2lmaUluZm8gaW5mbyA9IG1XaWZpU3RhdGVUcmFja2VyLnJlcXVlc3RDb25uZWN0aW9uSW5mbygpOworICAgICAgICAgICAgICAgICAgICBXaWZpSW5mbyBpbmZvID0gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY1JlcXVlc3RDb25uZWN0aW9uSW5mbygpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSAhPSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2VkIHRvIGdvIHRvIHNsZWVwIGltbWVkaWF0ZWx5LCBidXQgdGhpcyBjYXVzZWQgc29tZSByYWNlIGNvbmRpdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgdGltZSB0byB0cmFjayBkb3duIGZvciB0aGlzIHJlbGVhc2UuICBEZWxheSBpbnN0ZWFkLCBidXQgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBsb25nIGFzIHdlIHdvdWxkIGlmIGNvbm5lY3RlZCAoYmVsb3cpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIHRpbWUgdG8gdHJhY2sgZG93biBmb3IgdGhpcyByZWxlYXNlLiAgRGVsYXkgaW5zdGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBub3QgYXMgbG9uZyBhcyB3ZSB3b3VsZCBpZiBjb25uZWN0ZWQgKGJlbG93KQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGZpeCB0aGUgcmFjZSBjb25kaXRpb25zIGFuZCBzd2l0Y2ggYmFjayB0byB0aGUgaW1tZWRpYXRlIHR1cm4tb2ZmCiAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHRyaWdnZXJUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAoMio2MCoxMDAwKTsgLy8gMiBtaW4KICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJzZXR0aW5nIEFDVElPTl9ERVZJQ0VfSURMRSB0aW1lciBmb3IgMTIwLDAwMCBtcyIpOwpAQCAtMTczMiw3ICs4NzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaXNCbHVldG9vdGhQbGF5aW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5zZXRCbHVldG9vdGhTY2FuTW9kZShpc0JsdWV0b290aFBsYXlpbmcpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldEJsdWV0b290aFNjYW5Nb2RlKGlzQmx1ZXRvb3RoUGxheWluZyk7CiAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTc3MSw3ICs5MTMsNyBAQAogICAgICAgICAgKiBvZiB7QGNvZGUgMH0gaXNuJ3QgcmVhbGx5IGEgcGx1Z2dlZCB0eXBlLCBidXQgcmF0aGVyIGFuIGluZGljYXRpb24gdGhhdCB0aGUKICAgICAgICAgICogZGV2aWNlIGlzbid0IHBsdWdnZWQgaW4gYXQgYWxsLCB0aGVyZSBpcyBubyBiaXQgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhCiAgICAgICAgICAqIHtAY29kZSBwbHVnZ2VkVHlwZX0gdmFsdWUgb2Yge0Bjb2RlIDB9LiBUaGF0IGlzIHdoeSB3ZSBzaGlmdCBieQotICAgICAgICAgKiB7QGNvZGUgcGx1Z2dlZFR5cGUmbmJzcDsmIzgyMTI7Jm5ic3A7MX0gaW5zdGVhZCBvZiBieSB7QGNvZGUgcGx1Z2dlZFR5cGV9LgorICAgICAgICAgKiB7QGNvZGUgcGx1Z2dlZFR5cGUgLSAxfSBpbnN0ZWFkIG9mIGJ5IHtAY29kZSBwbHVnZ2VkVHlwZX0uCiAgICAgICAgICAqIEBwYXJhbSBzdGF5QXdha2VDb25kaXRpb25zIGEgYml0IHN0cmluZyBzcGVjaWZ5aW5nIHdoaWNoICJwbHVnZ2VkIHR5cGVzIiBzaG91bGQKICAgICAgICAgICoga2VlcCB0aGUgZGV2aWNlIChhbmQgaGVuY2UgV2ktRmkpIGF3YWtlLgogICAgICAgICAgKiBAcGFyYW0gcGx1Z2dlZFR5cGUgdGhlIHR5cGUgb2YgcGx1ZyAoVVNCLCBBQywgb3Igbm9uZSkgZm9yIHdoaWNoIHRoZSBjaGVjayBpcwpAQCAtMTc4NCw4NSArOTI2LDM2IEBACiAgICAgICAgIH0KICAgICB9OwogCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRFbmFibGVNZXNzYWdlKGJvb2xlYW4gZW5hYmxlLCBib29sZWFuIHBlcnNpc3QsIGludCB1aWQpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBNZXNzYWdlLm9idGFpbihtV2lmaUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVuYWJsZSA/IE1FU1NBR0VfRU5BQkxFX1dJRkkgOiBNRVNTQUdFX0RJU0FCTEVfV0lGSSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBlcnNpc3QgPyAxIDogMCksIHVpZCk7Ci0gICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZFN0YXJ0TWVzc2FnZShpbnQgbG9ja01vZGUpIHsKLSAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdpZmlIYW5kbGVyLCBNRVNTQUdFX1NUQVJUX1dJRkksIGxvY2tNb2RlLCAwKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZEFjY2Vzc1BvaW50TWVzc2FnZShib29sZWFuIGVuYWJsZSwgV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZywgaW50IHVpZCkgewotICAgICAgICBNZXNzYWdlLm9idGFpbihtV2lmaUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgKGVuYWJsZSA/IE1FU1NBR0VfU1RBUlRfQUNDRVNTX1BPSU5UIDogTUVTU0FHRV9TVE9QX0FDQ0VTU19QT0lOVCksCi0gICAgICAgICAgICAgICAgdWlkLCAwLCB3aWZpQ29uZmlnKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZEVuYWJsZU5ldHdvcmtzTWVzc2FnZSgpIHsKLSAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdpZmlIYW5kbGVyLCBNRVNTQUdFX0VOQUJMRV9ORVRXT1JLUykuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVdpZmlTdGF0ZSgpIHsKLSAgICAgICAgLy8gc2VuZCBhIG1lc3NhZ2Ugc28gaXQncyBhbGwgc2VyaWFsaXplZAotICAgICAgICBNZXNzYWdlLm9idGFpbihtV2lmaUhhbmRsZXIsIE1FU1NBR0VfVVBEQVRFX1NUQVRFLCAwLCAwKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9VcGRhdGVXaWZpU3RhdGUoKSB7CiAgICAgICAgIGJvb2xlYW4gd2lmaUVuYWJsZWQgPSBnZXRQZXJzaXN0ZWRXaWZpRW5hYmxlZCgpOwotICAgICAgICBib29sZWFuIGFpcnBsYW5lTW9kZSA9IGlzQWlycGxhbmVNb2RlT24oKSAmJiAhbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuOworICAgICAgICBib29sZWFuIGFpcnBsYW5lTW9kZSA9IGlzQWlycGxhbmVNb2RlT24oKSAmJiAhbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuLmdldCgpOwogICAgICAgICBib29sZWFuIGxvY2tIZWxkID0gbUxvY2tzLmhhc0xvY2tzKCk7Ci0gICAgICAgIGludCBzdHJvbmdlc3RMb2NrTW9kZSA9IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMOworICAgICAgICBpbnQgc3Ryb25nZXN0TG9ja01vZGU7CiAgICAgICAgIGJvb2xlYW4gd2lmaVNob3VsZEJlRW5hYmxlZCA9IHdpZmlFbmFibGVkICYmICFhaXJwbGFuZU1vZGU7CiAgICAgICAgIGJvb2xlYW4gd2lmaVNob3VsZEJlU3RhcnRlZCA9ICFtRGV2aWNlSWRsZSB8fCBsb2NrSGVsZDsKLQotICAgICAgICBpZiAobG9ja0hlbGQpIHsKKyAgICAgICAgaWYgKG1EZXZpY2VJZGxlICYmIGxvY2tIZWxkKSB7CiAgICAgICAgICAgICBzdHJvbmdlc3RMb2NrTW9kZSA9IG1Mb2Nrcy5nZXRTdHJvbmdlc3RMb2NrTW9kZSgpOwotICAgICAgICB9Ci0gICAgICAgIC8qIElmIGRldmljZSBpcyBub3QgaWRsZSwgbG9ja21vZGUgY2Fubm90IGJlIHNjYW4gb25seSAqLwotICAgICAgICBpZiAoIW1EZXZpY2VJZGxlICYmIHN0cm9uZ2VzdExvY2tNb2RlID09IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFkpIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN0cm9uZ2VzdExvY2tNb2RlID0gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTEw7CiAgICAgICAgIH0KIAotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaWZpSGFuZGxlcikgewotICAgICAgICAgICAgaWYgKChtV2lmaVN0YXRlVHJhY2tlci5nZXRXaWZpU3RhdGUoKSA9PSBXSUZJX1NUQVRFX0VOQUJMSU5HKSAmJiAhYWlycGxhbmVNb2RlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQorICAgICAgICAvKiBEaXNhYmxlIHRldGhlcmluZyB3aGVuIGFpcnBsYW5lIG1vZGUgaXMgZW5hYmxlZCAqLworICAgICAgICBpZiAoYWlycGxhbmVNb2RlKSB7CisgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXRXaWZpQXBFbmFibGVkKG51bGwsIGZhbHNlKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAvKiBEaXNhYmxlIHRldGhlcmluZyB3aGVuIGFpcnBsYW5lIG1vZGUgaXMgZW5hYmxlZCAqLwotICAgICAgICAgICAgaWYgKGFpcnBsYW5lTW9kZSAmJgotICAgICAgICAgICAgICAgIChtV2lmaUFwU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9FTkFCTElORyB8fCBtV2lmaUFwU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9FTkFCTEVEKSkgewotICAgICAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgc2VuZEFjY2Vzc1BvaW50TWVzc2FnZShmYWxzZSwgbnVsbCwgbUxhc3RBcEVuYWJsZVVpZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh3aWZpU2hvdWxkQmVFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHdpZmlTaG91bGRCZVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZEVuYWJsZU1lc3NhZ2UodHJ1ZSwgZmFsc2UsIG1MYXN0RW5hYmxlVWlkKTsKLSAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZFN0YXJ0TWVzc2FnZShzdHJvbmdlc3RMb2NrTW9kZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHdha2VMb2NrVGltZW91dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTU9CSUxFX0RBVEFfVFJBTlNJVElPTl9XQUtFTE9DS19USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9XQUtFTE9DS19USU1FT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogV2UgYXJlIGFzc3VtaW5nIHRoYXQgQ29ubmVjdGl2aXR5U2VydmljZSBjYW4gbWFrZQotICAgICAgICAgICAgICAgICAgICAgKiBhIHRyYW5zaXRpb24gdG8gY2VsbHVsYXIgZGF0YSB3aXRoaW4gd2FrZUxvY2tUaW1lb3V0IHRpbWUuCi0gICAgICAgICAgICAgICAgICAgICAqIFRoZSB3YWtlbG9jayBpcyByZWxlYXNlZCBieSB0aGUgZGVsYXllZCBtZXNzYWdlLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgc0RyaXZlclN0b3BXYWtlTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1FU1NBR0VfU1RPUF9XSUZJKTsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKE1FU1NBR0VfUkVMRUFTRV9XQUtFTE9DSywgd2FrZUxvY2tUaW1lb3V0KTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIGlmICh3aWZpU2hvdWxkQmVFbmFibGVkKSB7CisgICAgICAgICAgICBpZiAod2lmaVNob3VsZEJlU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldFdpZmlFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldFNjYW5Pbmx5TW9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9uZ2VzdExvY2tNb2RlID09IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFkpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldERyaXZlclN0YXJ0KHRydWUpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgIHNlbmRFbmFibGVNZXNzYWdlKGZhbHNlLCBmYWxzZSwgbUxhc3RFbmFibGVVaWQpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnJlcXVlc3RDbVdha2VMb2NrKCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0RHJpdmVyU3RhcnQoZmFsc2UpOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0V2lmaUVuYWJsZWQoZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xOTAwLDgxICs5OTMsNiBAQAogICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5BSVJQTEFORV9NT0RFX09OLCAwKSA9PSAxOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEhhbmRsZXIgdGhhdCBhbGxvd3MgcG9zdGluZyB0byB0aGUgV2lmaVRocmVhZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFdpZmlIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIHB1YmxpYyBXaWZpSGFuZGxlcihMb29wZXIgbG9vcGVyKSB7Ci0gICAgICAgICAgICBzdXBlcihsb29wZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9FTkFCTEVfV0lGSToKLSAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRCbG9ja2luZyh0cnVlLCBtc2cuYXJnMSA9PSAxLCBtc2cuYXJnMik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtV2lmaVdhdGNoZG9nU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV2lmaVdhdGNoZG9nU2VydmljZSA9IG5ldyBXaWZpV2F0Y2hkb2dTZXJ2aWNlKG1Db250ZXh0LCBtV2lmaVN0YXRlVHJhY2tlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfU1RBUlRfV0lGSToKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0U2Nhbk9ubHlNb2RlKG1zZy5hcmcxID09IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFkpOwotICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5yZXN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldEhpZ2hQZXJmTW9kZShtc2cuYXJnMSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMX0hJR0hfUEVSRik7Ci0gICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1VQREFURV9TVEFURToKLSAgICAgICAgICAgICAgICAgICAgZG9VcGRhdGVXaWZpU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfRElTQUJMRV9XSUZJOgotICAgICAgICAgICAgICAgICAgICAvLyBhIG5vbi16ZXJvIG1zZy5hcmcxIHZhbHVlIG1lYW5zIHRoZSAiZW5hYmxlZCIgc2V0dGluZwotICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgcGVyc2lzdGVkCi0gICAgICAgICAgICAgICAgICAgIHNldFdpZmlFbmFibGVkQmxvY2tpbmcoZmFsc2UsIG1zZy5hcmcxID09IDEsIG1zZy5hcmcyKTsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlXYXRjaGRvZ1NlcnZpY2UgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9TVE9QX1dJRkk6Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLmRpc2Nvbm5lY3RBbmRTdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHJlbGVhc2Ugd2FrZWxvY2sKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfUkVMRUFTRV9XQUtFTE9DSzoKLSAgICAgICAgICAgICAgICAgICAgc0RyaXZlclN0b3BXYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1NUQVJUX0FDQ0VTU19QT0lOVDoKLSAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZEJsb2NraW5nKHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXaWZpQ29uZmlndXJhdGlvbikgbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1NUT1BfQUNDRVNTX1BPSU5UOgotICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkQmxvY2tpbmcoZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXaWZpQ29uZmlndXJhdGlvbikgbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1NFVF9DSEFOTkVMUzoKLSAgICAgICAgICAgICAgICAgICAgc2V0TnVtQWxsb3dlZENoYW5uZWxzQmxvY2tpbmcobXNnLmFyZzEsIG1zZy5hcmcyID09IDEpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9FTkFCTEVfTkVUV09SS1M6Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLmVuYWJsZUFsbE5ldHdvcmtzKGdldENvbmZpZ3VyZWROZXR3b3JrcygpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3LCBTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgIGlmIChtQ29udGV4dC5jaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5EVU1QKQpAQCAtMTk4NCwxNyArMTAwMiwxNyBAQAogICAgICAgICAgICAgICAgICAgICArICIsIHVpZD0iICsgQmluZGVyLmdldENhbGxpbmdVaWQoKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgcHcucHJpbnRsbigiV2ktRmkgaXMgIiArIHN0YXRlTmFtZShtV2lmaVN0YXRlVHJhY2tlci5nZXRXaWZpU3RhdGUoKSkpOworICAgICAgICBwdy5wcmludGxuKCJXaS1GaSBpcyAiICsgbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldFdpZmlTdGF0ZUJ5TmFtZSgpKTsKICAgICAgICAgcHcucHJpbnRsbigiU3RheS1hd2FrZSBjb25kaXRpb25zOiAiICsKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlNUQVlfT05fV0hJTEVfUExVR0dFRF9JTiwgMCkpOwogICAgICAgICBwdy5wcmludGxuKCk7CiAKICAgICAgICAgcHcucHJpbnRsbigiSW50ZXJuYWwgc3RhdGU6Iik7Ci0gICAgICAgIHB3LnByaW50bG4obVdpZmlTdGF0ZVRyYWNrZXIpOworICAgICAgICBwdy5wcmludGxuKG1XaWZpU3RhdGVNYWNoaW5lKTsKICAgICAgICAgcHcucHJpbnRsbigpOwogICAgICAgICBwdy5wcmludGxuKCJMYXRlc3Qgc2NhbiByZXN1bHRzOiIpOwotICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5SZXN1bHRzID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0U2NhblJlc3VsdHNMaXN0KCk7CisgICAgICAgIExpc3Q8U2NhblJlc3VsdD4gc2NhblJlc3VsdHMgPSBtV2lmaVN0YXRlTWFjaGluZS5zeW5jR2V0U2NhblJlc3VsdHNMaXN0KCk7CiAgICAgICAgIGlmIChzY2FuUmVzdWx0cyAhPSBudWxsICYmIHNjYW5SZXN1bHRzLnNpemUoKSAhPSAwKSB7CiAgICAgICAgICAgICBwdy5wcmludGxuKCIgIEJTU0lEICAgICAgICAgICAgICBGcmVxdWVuY3kgICBSU1NJICBGbGFncyAgICAgICAgICAgICBTU0lEIik7CiAgICAgICAgICAgICBmb3IgKFNjYW5SZXN1bHQgciA6IHNjYW5SZXN1bHRzKSB7CkBAIC0yMDA4LDMzICsxMDI2LDE0IEBACiAgICAgICAgIH0KICAgICAgICAgcHcucHJpbnRsbigpOwogICAgICAgICBwdy5wcmludGxuKCJMb2NrcyBhY3F1aXJlZDogIiArIG1GdWxsTG9ja3NBY3F1aXJlZCArICIgZnVsbCwgIiArCi0gICAgICAgICAgICAgICAgbUZ1bGxIaWdoUGVyZkxvY2tzQWNxdWlyZWQgKyAiIGZ1bGwgaGlnaCBwZXJmLCAiICsKICAgICAgICAgICAgICAgICBtU2NhbkxvY2tzQWNxdWlyZWQgKyAiIHNjYW4iKTsKICAgICAgICAgcHcucHJpbnRsbigiTG9ja3MgcmVsZWFzZWQ6ICIgKyBtRnVsbExvY2tzUmVsZWFzZWQgKyAiIGZ1bGwsICIgKwotICAgICAgICAgICAgICAgIG1GdWxsSGlnaFBlcmZMb2Nrc1JlbGVhc2VkICsgIiBmdWxsIGhpZ2ggcGVyZiwgIiArCiAgICAgICAgICAgICAgICAgbVNjYW5Mb2Nrc1JlbGVhc2VkICsgIiBzY2FuIik7CiAgICAgICAgIHB3LnByaW50bG4oKTsKICAgICAgICAgcHcucHJpbnRsbigiTG9ja3MgaGVsZDoiKTsKICAgICAgICAgbUxvY2tzLmR1bXAocHcpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzdGF0ZU5hbWUoaW50IHdpZmlTdGF0ZSkgewotICAgICAgICBzd2l0Y2ggKHdpZmlTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0RJU0FCTElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gImRpc2FibGluZyI7Ci0gICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRElTQUJMRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJkaXNhYmxlZCI7Ci0gICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRU5BQkxJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJlbmFibGluZyI7Ci0gICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRU5BQkxFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImVuYWJsZWQiOwotICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX1VOS05PV046Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIHN0YXRlIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJbaW52YWxpZCBzdGF0ZV0iOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBjbGFzcyBXaWZpTG9jayBleHRlbmRzIERlYXRoUmVjaXBpZW50IHsKICAgICAgICAgV2lmaUxvY2soaW50IGxvY2tNb2RlLCBTdHJpbmcgdGFnLCBJQmluZGVyIGJpbmRlcikgewogICAgICAgICAgICAgc3VwZXIobG9ja01vZGUsIHRhZywgYmluZGVyKTsKQEAgLTIwNjYsMTUgKzEwNjUsMTEgQEAKICAgICAgICAgICAgIGlmIChtTGlzdC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTEw7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRnVsbEhpZ2hQZXJmTG9ja3NBY3F1aXJlZCA+IG1GdWxsSGlnaFBlcmZMb2Nrc1JlbGVhc2VkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMX0hJR0hfUEVSRjsKKyAgICAgICAgICAgIGZvciAoV2lmaUxvY2sgbCA6IG1MaXN0KSB7CisgICAgICAgICAgICAgICAgaWYgKGwubU1vZGUgPT0gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1GdWxsTG9ja3NBY3F1aXJlZCA+IG1GdWxsTG9ja3NSZWxlYXNlZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTDsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgcmV0dXJuIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFk7CiAgICAgICAgIH0KIApAQCAtMjExMywxMSArMTEwOCw3IEBACiAKICAgICBwdWJsaWMgYm9vbGVhbiBhY3F1aXJlV2lmaUxvY2soSUJpbmRlciBiaW5kZXIsIGludCBsb2NrTW9kZSwgU3RyaW5nIHRhZykgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLldBS0VfTE9DSywgbnVsbCk7Ci0gICAgICAgIGlmIChsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTCAmJgotICAgICAgICAgICAgICAgIGxvY2tNb2RlICE9IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFkgJiYKLSAgICAgICAgICAgICAgICBsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTF9ISUdIX1BFUkYpIHsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICJJbGxlZ2FsIGFyZ3VtZW50LCBsb2NrTW9kZT0gIiArIGxvY2tNb2RlKTsKLSAgICAgICAgICAgIGlmIChEQkcpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxvY2tNb2RlPSIgKyBsb2NrTW9kZSk7CisgICAgICAgIGlmIChsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTCAmJiBsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfU0NBTl9PTkxZKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgV2lmaUxvY2sgd2lmaUxvY2sgPSBuZXcgV2lmaUxvY2sobG9ja01vZGUsIHRhZywgYmluZGVyKTsKQEAgLTIxMzksMTIgKzExMzAsNiBAQAogICAgICAgICAgICAgICAgICsrbUZ1bGxMb2Nrc0FjcXVpcmVkOwogICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZUZ1bGxXaWZpTG9ja0FjcXVpcmVkKHVpZCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMX0hJR0hfUEVSRjoKLSAgICAgICAgICAgICAgICArK21GdWxsSGlnaFBlcmZMb2Nrc0FjcXVpcmVkOwotICAgICAgICAgICAgICAgIC8qIFRyZWF0IGhpZ2ggcG93ZXIgYXMgYSBmdWxsIGxvY2sgZm9yIGJhdHRlcnkgc3RhdHMgKi8KLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVGdWxsV2lmaUxvY2tBY3F1aXJlZCh1aWQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCiAgICAgICAgICAgICBjYXNlIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFk6CiAgICAgICAgICAgICAgICAgKyttU2NhbkxvY2tzQWNxdWlyZWQ7CiAgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlU2NhbldpZmlMb2NrQWNxdWlyZWQodWlkKTsKQEAgLTIxODQsMTAgKzExNjksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyttRnVsbExvY2tzUmVsZWFzZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVGdWxsV2lmaUxvY2tSZWxlYXNlZCh1aWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTExfSElHSF9QRVJGOgotICAgICAgICAgICAgICAgICAgICAgICAgKyttRnVsbEhpZ2hQZXJmTG9ja3NSZWxlYXNlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZUZ1bGxXaWZpTG9ja1JlbGVhc2VkKHVpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfU0NBTl9PTkxZOgogICAgICAgICAgICAgICAgICAgICAgICAgKyttU2NhbkxvY2tzUmVsZWFzZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVTY2FuV2lmaUxvY2tSZWxlYXNlZCh1aWQpOwpAQCAtMjI1OCw3ICsxMjM5LDcgQEAKICAgICAgICAgICAgIGlmIChtTXVsdGljYXN0ZXJzLnNpemUoKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5zdGFydFBhY2tldEZpbHRlcmluZygpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnN0YXJ0UGFja2V0RmlsdGVyaW5nKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yMjczLDcgKzEyNTQsNyBAQAogICAgICAgICAgICAgLy8gb3VyIG5ldyBzaXplID09IDEgKGZpcnN0IGNhbGwpLCBidXQgdGhpcyBmdW5jdGlvbiB3b24ndAogICAgICAgICAgICAgLy8gYmUgY2FsbGVkIG9mdGVuIGFuZCBieSBtYWtpbmcgdGhlIHN0b3BQYWNrZXQgY2FsbCBlYWNoCiAgICAgICAgICAgICAvLyB0aW1lIHdlJ3JlIGxlc3MgZnJhZ2lsZSBhbmQgc2VsZi1oZWFsaW5nLgotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc3RvcFBhY2tldEZpbHRlcmluZygpOworICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc3RvcFBhY2tldEZpbHRlcmluZygpOwogICAgICAgICB9CiAKICAgICAgICAgaW50IHVpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CkBAIC0yMzEwLDcgKzEyOTEsNyBAQAogICAgICAgICAgICAgcmVtb3ZlZC51bmxpbmtEZWF0aFJlY2lwaWVudCgpOwogICAgICAgICB9CiAgICAgICAgIGlmIChtTXVsdGljYXN0ZXJzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5zdGFydFBhY2tldEZpbHRlcmluZygpOworICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKTsKICAgICAgICAgfQogCiAgICAgICAgIExvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKQEAgLTIzMjksNCArMTMxMCwxNDQgQEAKICAgICAgICAgICAgIHJldHVybiAobU11bHRpY2FzdGVycy5zaXplKCkgPiAwKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0FuZFNldE5vdGlmaWNhdGlvbigpIHsKKyAgICAgICAgLy8gSWYgd2Ugc2hvdWxkbid0IHBsYWNlIGEgbm90aWZpY2F0aW9uIG9uIGF2YWlsYWJsZSBuZXR3b3JrcywgdGhlbgorICAgICAgICAvLyBkb24ndCBib3RoZXIgZG9pbmcgYW55IG9mIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgaWYgKCFtTm90aWZpY2F0aW9uRW5hYmxlZCkgcmV0dXJuOworCisgICAgICAgIFN0YXRlIHN0YXRlID0gbU5ldHdvcmtJbmZvLmdldFN0YXRlKCk7CisgICAgICAgIGlmICgoc3RhdGUgPT0gTmV0d29ya0luZm8uU3RhdGUuRElTQ09OTkVDVEVEKQorICAgICAgICAgICAgICAgIHx8IChzdGF0ZSA9PSBOZXR3b3JrSW5mby5TdGF0ZS5VTktOT1dOKSkgeworICAgICAgICAgICAgLy8gTG9vayBmb3IgYW4gb3BlbiBuZXR3b3JrCisgICAgICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5SZXN1bHRzID0gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldFNjYW5SZXN1bHRzTGlzdCgpOworICAgICAgICAgICAgaWYgKHNjYW5SZXN1bHRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgbnVtT3Blbk5ldHdvcmtzID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc2NhblJlc3VsdHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgU2NhblJlc3VsdCBzY2FuUmVzdWx0ID0gc2NhblJlc3VsdHMuZ2V0KGkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzY2FuUmVzdWx0LmNhcGFiaWxpdGllcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bU9wZW5OZXR3b3JrcysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG51bU9wZW5OZXR3b3JrcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCsrbU51bVNjYW5zU2luY2VOZXR3b3JrU3RhdGVDaGFuZ2UgPj0gTlVNX1NDQU5TX0JFRk9SRV9BQ1RVQUxMWV9TQ0FOTklORykgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFdlJ3ZlIHNjYW5uZWQgY29udGludW91c2x5IGF0IGxlYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBOVU1fU0NBTlNfQkVGT1JFX05PVElGSUNBVElPTiB0aW1lcy4gVGhlIHVzZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHByb2JhYmx5IGRvZXMgbm90IGhhdmUgYSByZW1lbWJlcmVkIG5ldHdvcmsgaW4gcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaW5jZSBvdGhlcndpc2Ugc3VwcGxpY2FudCB3b3VsZCBoYXZlIHRyaWVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBhc3NvY2lhdGUgYW5kIHRodXMgcmVzZXR0aW5nIHRoaXMgY291bnRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZSh0cnVlLCBudW1PcGVuTmV0d29ya3MsIGZhbHNlLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTm8gb3BlbiBuZXR3b3JrcyBpbiByYW5nZSwgcmVtb3ZlIHRoZSBub3RpZmljYXRpb24KKyAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFycyB2YXJpYWJsZXMgcmVsYXRlZCB0byB0cmFja2luZyB3aGV0aGVyIGEgbm90aWZpY2F0aW9uIGhhcyBiZWVuCisgICAgICogc2hvd24gcmVjZW50bHkgYW5kIGNsZWFycyB0aGUgY3VycmVudCBub3RpZmljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0Tm90aWZpY2F0aW9uKCkgeworICAgICAgICBtTm90aWZpY2F0aW9uUmVwZWF0VGltZSA9IDA7CisgICAgICAgIG1OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlID0gMDsKKyAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BsYXkgb3IgZG9uJ3QgZGlzcGxheSBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZXJlIGFyZSBvcGVuIFdpLUZpIG5ldHdvcmtzLgorICAgICAqIEBwYXJhbSB2aXNpYmxlIHtAY29kZSB0cnVlfSBpZiBub3RpZmljYXRpb24gc2hvdWxkIGJlIHZpc2libGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICogQHBhcmFtIG51bU5ldHdvcmtzIHRoZSBudW1iZXIgbmV0d29ya3Mgc2VlbgorICAgICAqIEBwYXJhbSBmb3JjZSB7QGNvZGUgdHJ1ZX0gdG8gZm9yY2Ugbm90aWZpY2F0aW9uIHRvIGJlIHNob3duL25vdC1zaG93biwKKyAgICAgKiBldmVuIGlmIGl0IGlzIGFscmVhZHkgc2hvd24vbm90LXNob3duLgorICAgICAqIEBwYXJhbSBkZWxheSB0aW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgbm90aWZpY2F0aW9uIHNob3VsZCBiZSBtYWRlCisgICAgICogdmlzaWJsZSBvciBpbnZpc2libGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldE5vdGlmaWNhdGlvblZpc2libGUoYm9vbGVhbiB2aXNpYmxlLCBpbnQgbnVtTmV0d29ya3MsIGJvb2xlYW4gZm9yY2UsCisgICAgICAgICAgICBpbnQgZGVsYXkpIHsKKworICAgICAgICAvLyBTaW5jZSB3ZSB1c2UgYXV0byBjYW5jZWwgb24gdGhlIG5vdGlmaWNhdGlvbiwgd2hlbiB0aGUKKyAgICAgICAgLy8gbU5ldHdvcmtzQXZhaWxhYmxlTm90aWZpY2F0aW9uU2hvd24gaXMgdHJ1ZSwgdGhlIG5vdGlmaWNhdGlvbiBtYXkKKyAgICAgICAgLy8gaGF2ZSBhY3R1YWxseSBiZWVuIGNhbmNlbGVkLiAgSG93ZXZlciwgd2hlbiBpdCBpcyBmYWxzZSB3ZSBrbm93CisgICAgICAgIC8vIGZvciBzdXJlIHRoYXQgaXQgaXMgbm90IGJlaW5nIHNob3duIChpdCB3aWxsIG5vdCBiZSBzaG93biBhbnkgb3RoZXIKKyAgICAgICAgLy8gcGxhY2UgdGhhbiBoZXJlKQorCisgICAgICAgIC8vIElmIGl0IHNob3VsZCBiZSBoaWRkZW4gYW5kIGl0IGlzIGFscmVhZHkgaGlkZGVuLCB0aGVuIG5vb3AKKyAgICAgICAgaWYgKCF2aXNpYmxlICYmICFtTm90aWZpY2F0aW9uU2hvd24gJiYgIWZvcmNlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyIG5vdGlmaWNhdGlvbk1hbmFnZXIgPSAoTm90aWZpY2F0aW9uTWFuYWdlcikgbUNvbnRleHQKKyAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk5PVElGSUNBVElPTl9TRVJWSUNFKTsKKworICAgICAgICBNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIGlmICh2aXNpYmxlKSB7CisKKyAgICAgICAgICAgIC8vIE5vdCBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIHRvIHNob3cgdGhlIG5vdGlmaWNhdGlvbiBhZ2FpbgorICAgICAgICAgICAgaWYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgbU5vdGlmaWNhdGlvblJlcGVhdFRpbWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgTm90aWZpY2F0aW9uIG9iamVjdC4KKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbigpOworICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24ud2hlbiA9IDA7CisgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5pY29uID0gSUNPTl9ORVRXT1JLU19BVkFJTEFCTEU7CisgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5mbGFncyA9IE5vdGlmaWNhdGlvbi5GTEFHX0FVVE9fQ0FOQ0VMOworICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uY29udGVudEludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QWN0aXZpdHkobUNvbnRleHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLkFDVElPTl9QSUNLX1dJRklfTkVUV09SSyksIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRRdWFudGl0eVRleHQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIucGx1cmFscy53aWZpX2F2YWlsYWJsZSwgbnVtTmV0d29ya3MpOworICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGRldGFpbHMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRRdWFudGl0eVRleHQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIucGx1cmFscy53aWZpX2F2YWlsYWJsZV9kZXRhaWxlZCwgbnVtTmV0d29ya3MpOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ID0gdGl0bGU7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uLnNldExhdGVzdEV2ZW50SW5mbyhtQ29udGV4dCwgdGl0bGUsIGRldGFpbHMsIG1Ob3RpZmljYXRpb24uY29udGVudEludGVudCk7CisKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBOT1RJRklDQVRJT05fUkVQRUFUX0RFTEFZX01TOworCisgICAgICAgICAgICBub3RpZmljYXRpb25NYW5hZ2VyLm5vdGlmeShJQ09OX05FVFdPUktTX0FWQUlMQUJMRSwgbU5vdGlmaWNhdGlvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub3RpZmljYXRpb25NYW5hZ2VyLmNhbmNlbChJQ09OX05FVFdPUktTX0FWQUlMQUJMRSk7CisgICAgICAgIH0KKworICAgICAgICBtTm90aWZpY2F0aW9uU2hvd24gPSB2aXNpYmxlOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CisKKyAgICAgICAgcHVibGljIE5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIoSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBzdXBlcihoYW5kbGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKCkgeworICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TZWN1cmUuZ2V0VXJpRm9yKAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX05FVFdPUktTX0FWQUlMQUJMRV9OT1RJRklDQVRJT05fT04pLCB0cnVlLCB0aGlzKTsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkID0gZ2V0VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ2hhbmdlKHNlbGZDaGFuZ2UpOworCisgICAgICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZCA9IGdldFZhbHVlKCk7CisgICAgICAgICAgICByZXNldE5vdGlmaWNhdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX05FVFdPUktTX0FWQUlMQUJMRV9OT1RJRklDQVRJT05fT04sIDEpID09IDE7CisgICAgICAgIH0KKyAgICB9CisKKwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVdhdGNoZG9nU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVdhdGNoZG9nU2VydmljZS5qYXZhCmluZGV4IDQ0NWRkMDMuLjQ2ZDZiZWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlXYXRjaGRvZ1NlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpV2F0Y2hkb2dTZXJ2aWNlLmphdmEKQEAgLTI3LDcgKzI3LDYgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLlNjYW5SZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpSW5mbzsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlVHJhY2tlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwpAQCAtNzcsNyArNzYsNiBAQAogICAgIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotICAgIHByaXZhdGUgV2lmaVN0YXRlVHJhY2tlciBtV2lmaVN0YXRlVHJhY2tlcjsKICAgICBwcml2YXRlIFdpZmlNYW5hZ2VyIG1XaWZpTWFuYWdlcjsKICAgICAKICAgICAvKioKQEAgLTEwOCwxMCArMTA2LDkgQEAKICAgICAvKiogV2hldGhlciB0aGUgY3VycmVudCBBUCBjaGVjayBzaG91bGQgYmUgY2FuY2VsZWQuICovCiAgICAgcHJpdmF0ZSBib29sZWFuIG1TaG91bGRDYW5jZWw7CiAgICAgCi0gICAgV2lmaVdhdGNoZG9nU2VydmljZShDb250ZXh0IGNvbnRleHQsIFdpZmlTdGF0ZVRyYWNrZXIgd2lmaVN0YXRlVHJhY2tlcikgeworICAgIFdpZmlXYXRjaGRvZ1NlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyID0gd2lmaVN0YXRlVHJhY2tlcjsKICAgICAgICAgbVdpZmlNYW5hZ2VyID0gKFdpZmlNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSUZJX1NFUlZJQ0UpOwogICAgICAgICAKICAgICAgICAgY3JlYXRlVGhyZWFkKCk7CkBAIC0yNzUsMTIgKzI3MiwxMyBAQAogICAgIC8qKgogICAgICAqIFVucmVnaXN0ZXIgYnJvYWRjYXN0cyBhbmQgcXVpdCB0aGUgd2F0Y2hkb2cgdGhyZWFkCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHF1aXQoKSB7Ci0gICAgICAgIHVucmVnaXN0ZXJGb3JXaWZpQnJvYWRjYXN0cygpOwotICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1Db250ZW50T2JzZXJ2ZXIpOwotICAgICAgICBtSGFuZGxlci5yZW1vdmVBbGxBY3Rpb25zKCk7Ci0gICAgICAgIG1IYW5kbGVyLmdldExvb3BlcigpLnF1aXQoKTsKLSAgICB9CisgICAgLy9UT0RPOiBDaGFuZ2UgYmFjayB0byBydW5uaW5nIFdXUyB3aGVuIG5lZWRlZAorLy8gICAgcHJpdmF0ZSB2b2lkIHF1aXQoKSB7CisvLyAgICAgICAgdW5yZWdpc3RlckZvcldpZmlCcm9hZGNhc3RzKCk7CisvLyAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ29udGVudE9ic2VydmVyKTsKKy8vICAgICAgICBtSGFuZGxlci5yZW1vdmVBbGxBY3Rpb25zKCk7CisvLyAgICAgICAgbUhhbmRsZXIuZ2V0TG9vcGVyKCkucXVpdCgpOworLy8gICAgfQogCiAgICAgLyoqCiAgICAgICogV2FpdHMgZm9yIHRoZSBtYWluIHdhdGNoZG9nIHRocmVhZCB0byBjcmVhdGUgdGhlIGhhbmRsZXIuCkBAIC03NTEsNyArNzQ5LDcgQEAKICAgICAgICAgLy8gQmxhY2sgbGlzdCB0aGlzICJiYWQiIEFQLCB0aGlzIHdpbGwgY2F1c2UgYW4gYXR0ZW1wdCB0byBjb25uZWN0IHRvIGFub3RoZXIKICAgICAgICAgYmxhY2tsaXN0QXAoYXAuYnNzaWQpOwogICAgICAgICAvLyBJbml0aWF0ZSBhbiBhc3NvY2lhdGlvbiB0byBhbiBhbHRlcm5hdGUgQVAKLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIucmVhc3NvY2lhdGUoKTsKKyAgICAgICAgbVdpZmlNYW5hZ2VyLnJlYXNzb2NpYXRlKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGJsYWNrbGlzdEFwKFN0cmluZyBic3NpZCkgewpAQCAtNzYyLDEwICs3NjAsNyBAQAogICAgICAgICAvLyBCZWZvcmUgdGFraW5nIGFjdGlvbiwgbWFrZSBzdXJlIHdlIHNob3VsZCBub3QgY2FuY2VsIG91ciBwcm9jZXNzaW5nCiAgICAgICAgIGlmIChzaG91bGRDYW5jZWwoKSkgcmV0dXJuOwogICAgICAgICAKLSAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5hZGRUb0JsYWNrbGlzdChic3NpZCkpIHsKLSAgICAgICAgICAgIC8vIFRoZXJlJ3MgYSBrbm93biBidWcgd2hlcmUgdGhpcyBtZXRob2QgcmV0dXJucyBmYWlsdXJlIG9uIHN1Y2Nlc3MKLSAgICAgICAgICAgIC8vU2xvZy5lKFRBRywgIkJsYWNrbGlzdGluZyAiICsgYnNzaWQgKyAiIGZhaWxlZCIpOwotICAgICAgICB9CisgICAgICAgIG1XaWZpTWFuYWdlci5hZGRUb0JsYWNrbGlzdChic3NpZCk7CiAKICAgICAgICAgaWYgKEQpIHsKICAgICAgICAgICAgIG15TG9nRCgiQmxhY2tsaXN0aW5nICIgKyBic3NpZCk7CkBAIC04NjAsMTAgKzg1NSw3IEBACiAgICAgICAgICAgICAgKiAoYW5kIGJsYWNrbGlzdGVkIHRoZW0pLiBDbGVhciB0aGUgYmxhY2tsaXN0IHNvIHRoZSBBUCB3aXRoIGJlc3QKICAgICAgICAgICAgICAqIHNpZ25hbCBpcyBjaG9zZW4uCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuY2xlYXJCbGFja2xpc3QoKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3MgYSBrbm93biBidWcgd2hlcmUgdGhpcyBtZXRob2QgcmV0dXJucyBmYWlsdXJlIG9uIHN1Y2Nlc3MKLSAgICAgICAgICAgICAgICAvL1Nsb2cuZShUQUcsICJDbGVhcmluZyBibGFja2xpc3QgZmFpbGVkIik7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtV2lmaU1hbmFnZXIuY2xlYXJCbGFja2xpc3QoKTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgaWYgKFYpIHsKICAgICAgICAgICAgICAgICBteUxvZ1YoImhhbmRsZVNsZWVwOiBTZXQgc3RhdGUgdG8gU0xFRVAgYW5kIGNsZWFyZWQgYmxhY2tsaXN0Iik7CkBAIC05MzQsNyArOTI2LDcgQEAKICAgICAgKiBzaG91bGQgcmV2ZXJ0IGFueXRoaW5nIGRvbmUgYnkgdGhlIHdhdGNoZG9nIG1vbml0b3JpbmcuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJlc2V0KCkgewotICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5jbGVhckJsYWNrbGlzdCgpOworICAgICAgICBtV2lmaU1hbmFnZXIuY2xlYXJCbGFja2xpc3QoKTsKICAgICAgICAgc2V0SWRsZVN0YXRlKHRydWUpOwogICAgIH0KICAgICAKQEAgLTExNTEsNyArMTE0Myw3IEBACiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVdpZmlTdGF0ZUNoYW5nZWQoaW50IHdpZmlTdGF0ZSkgewogICAgICAgICAgICAgaWYgKHdpZmlTdGF0ZSA9PSBXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTEVEKSB7Ci0gICAgICAgICAgICAgICAgcXVpdCgpOworICAgICAgICAgICAgICAgIG9uRGlzY29ubmVjdGVkKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpZmlTdGF0ZSA9PSBXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMRUQpIHsKICAgICAgICAgICAgICAgICBvbkVuYWJsZWQoKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDM4NDFmNzUuLjc5YmRlN2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2luZG93TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMTU4LDcgKzE1OCw2IEBACiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfU1RBUlRJTkdfV0lORE9XID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfUkVPUkRFUiA9IGZhbHNlOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1dBTExQQVBFUiA9IGZhbHNlOwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0ZSRUVaRSA9IGZhbHNlOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIFNIT1dfVFJBTlNBQ1RJT05TID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gSElERV9TVEFDS19DUkFXTFMgPSB0cnVlOwogCkBAIC0xNzg4LDE4ICsxNzg3LDExIEBACiAgICAgICAgIGJvb2xlYW4gcmVwb3J0TmV3Q29uZmlnID0gZmFsc2U7CiAgICAgICAgIFdpbmRvd1N0YXRlIGF0dGFjaGVkV2luZG93ID0gbnVsbDsKICAgICAgICAgV2luZG93U3RhdGUgd2luID0gbnVsbDsKKyAgICAgICAgbG9uZyBvcmlnSWQ7CiAKICAgICAgICAgc3luY2hyb25pemVkKG1XaW5kb3dNYXApIHsKLSAgICAgICAgICAgIC8vIEluc3RhbnRpYXRpbmcgYSBEaXNwbGF5IHJlcXVpcmVzIHRhbGtpbmcgd2l0aCB0aGUgc2ltdWxhdG9yLAotICAgICAgICAgICAgLy8gc28gZG9uJ3QgZG8gaXQgdW50aWwgd2Uga25vdyB0aGUgc3lzdGVtIGlzIG1vc3RseSB1cCBhbmQKLSAgICAgICAgICAgIC8vIHJ1bm5pbmcuCiAgICAgICAgICAgICBpZiAobURpc3BsYXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIgd20gPSAoV2luZG93TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOwotICAgICAgICAgICAgICAgIG1EaXNwbGF5ID0gd20uZ2V0RGVmYXVsdERpc3BsYXkoKTsKLSAgICAgICAgICAgICAgICBtSW5pdGlhbERpc3BsYXlXaWR0aCA9IG1EaXNwbGF5LmdldFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgbUluaXRpYWxEaXNwbGF5SGVpZ2h0ID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgbUlucHV0TWFuYWdlci5zZXREaXNwbGF5U2l6ZSgwLCBtSW5pdGlhbERpc3BsYXlXaWR0aCwgbUluaXRpYWxEaXNwbGF5SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICByZXBvcnROZXdDb25maWcgPSB0cnVlOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRpc3BsYXkgaGFzIG5vdCBiZWVuIGluaXRpYWxpYWxpemVkIik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtV2luZG93TWFwLmNvbnRhaW5zS2V5KGNsaWVudC5hc0JpbmRlcigpKSkgewpAQCAtMTkwNSw3ICsxODk3LDcgQEAKIAogICAgICAgICAgICAgcmVzID0gV2luZG93TWFuYWdlckltcGwuQUREX09LQVk7CiAKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgb3JpZ0lkID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICBvcmlnSWQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKIAogICAgICAgICAgICAgaWYgKGFkZFRva2VuKSB7CiAgICAgICAgICAgICAgICAgbVRva2VuTWFwLnB1dChhdHRycy50b2tlbiwgdG9rZW4pOwpAQCAtMTk4MiwxNCArMTk3NCwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gc2VuZE5ld0NvbmZpZ3VyYXRpb24oKSBjaGVja3MgY2FsbGVyIHBlcm1pc3Npb25zIHNvIHdlIG11c3QgY2FsbCBpdCB3aXRoCi0gICAgICAgIC8vIHByaXZpbGVnZS4gIHVwZGF0ZU9yaWVudGF0aW9uRnJvbUFwcFRva2VucygpIGNsZWFycyBhbmQgcmVzZXRzIHRoZSBjYWxsZXIKLSAgICAgICAgLy8gaWRlbnRpdHkgYW55d2F5LCBzbyBpdCdzIHNhZmUgdG8ganVzdCBjbGVhciAmIHJlc3RvcmUgYXJvdW5kIHRoaXMgd2hvbGUKLSAgICAgICAgLy8gYmxvY2suCi0gICAgICAgIGZpbmFsIGxvbmcgb3JpZ0lkID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIGlmIChyZXBvcnROZXdDb25maWcpIHsKICAgICAgICAgICAgIHNlbmROZXdDb25maWd1cmF0aW9uKCk7CiAgICAgICAgIH0KKwogICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShvcmlnSWQpOwogCiAgICAgICAgIHJldHVybiByZXM7CkBAIC0zMTAyLDggKzMwOTAsMTEgQEAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbmZpZyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgLy8gTm8gb2J2aW91cyBhY3Rpb24gd2UgbmVlZCB0byB0YWtlLCBidXQgaWYgb3VyIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAvLyBzdGF0ZSBtaXNtYXRjaGVzIHRoZSBhY3Rpdml0eSBtYWFuYWdlcidzLCB1cGRhdGUgaXQKKyAgICAgICAgICAgICAgICAvLyBzdGF0ZSBtaXNtYXRjaGVzIHRoZSBhY3Rpdml0eSBtYW5hZ2VyJ3MsIHVwZGF0ZSBpdCwKKyAgICAgICAgICAgICAgICAvLyBkaXNyZWdhcmRpbmcgZm9udCBzY2FsZSwgd2hpY2ggc2hvdWxkIHJlbWFpbiBzZXQgdG8KKyAgICAgICAgICAgICAgICAvLyB0aGUgdmFsdWUgb2YgdGhlIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgICAgICAgICAgbVRlbXBDb25maWd1cmF0aW9uLnNldFRvRGVmYXVsdHMoKTsKKyAgICAgICAgICAgICAgICBtVGVtcENvbmZpZ3VyYXRpb24uZm9udFNjYWxlID0gY3VycmVudENvbmZpZy5mb250U2NhbGU7CiAgICAgICAgICAgICAgICAgaWYgKGNvbXB1dGVOZXdDb25maWd1cmF0aW9uTG9ja2VkKG1UZW1wQ29uZmlndXJhdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDb25maWcuZGlmZihtVGVtcENvbmZpZ3VyYXRpb24pICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1XYWl0aW5nRm9yQ29uZmlnID0gdHJ1ZTsKQEAgLTQ0MzUsOCArNDQyNiw3IEBACiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1XaW5kb3dzLnNpemUoKTsKICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBXaW5kb3dTdGF0ZSB3ID0gbVdpbmRvd3MuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmICh3LmlzVmlzaWJsZUx3KCkgJiYgIXcubU9ic2N1cmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAody5tT3JpZW50YXRpb25DaGFuZ2luZyB8fCAhdy5pc0RyYXduTHcoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAody5pc1Zpc2libGVMdygpICYmICF3Lm1PYnNjdXJlZCAmJiAhdy5pc0RyYXduTHcoKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNTYxNSw2ICs1NjA1LDIyIEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc3lzdGVtUmVhZHkoKSB7CisgICAgICAgIHN5bmNocm9uaXplZChtV2luZG93TWFwKSB7CisgICAgICAgICAgICBpZiAobURpc3BsYXkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRpc3BsYXkgYWxyZWFkeSBpbml0aWFsaXplZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgV2luZG93TWFuYWdlciB3bSA9IChXaW5kb3dNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7CisgICAgICAgICAgICBtRGlzcGxheSA9IHdtLmdldERlZmF1bHREaXNwbGF5KCk7CisgICAgICAgICAgICBtSW5pdGlhbERpc3BsYXlXaWR0aCA9IG1EaXNwbGF5LmdldFdpZHRoKCk7CisgICAgICAgICAgICBtSW5pdGlhbERpc3BsYXlIZWlnaHQgPSBtRGlzcGxheS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIG1JbnB1dE1hbmFnZXIuc2V0RGlzcGxheVNpemUoMCwgbUluaXRpYWxEaXNwbGF5V2lkdGgsIG1Jbml0aWFsRGlzcGxheUhlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUFjdGl2aXR5TWFuYWdlci51cGRhdGVDb25maWd1cmF0aW9uKG51bGwpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIAogICAgICAgICBtUG9saWN5LnN5c3RlbVJlYWR5KCk7CiAgICAgfQogCkBAIC02ODkyLDcgKzY4OTgsNyBAQAogICAgICAgICAgICAgZmluYWwgQXBwV2luZG93VG9rZW4gYXRva2VuID0gbUFwcFRva2VuOwogICAgICAgICAgICAgcmV0dXJuIG1TdXJmYWNlICE9IG51bGwgJiYgIW1BdHRhY2hlZEhpZGRlbgogICAgICAgICAgICAgICAgICAgICAmJiAoYXRva2VuID09IG51bGwgPyBtUG9saWN5VmlzaWJpbGl0eSA6ICFhdG9rZW4uaGlkZGVuUmVxdWVzdGVkKQotICAgICAgICAgICAgICAgICAgICAmJiAobU9yaWVudGF0aW9uQ2hhbmdpbmcgfHwgKCFtRHJhd1BlbmRpbmcgJiYgIW1Db21taXREcmF3UGVuZGluZykpCisgICAgICAgICAgICAgICAgICAgICYmICFtRHJhd1BlbmRpbmcgJiYgIW1Db21taXREcmF3UGVuZGluZwogICAgICAgICAgICAgICAgICAgICAmJiAhbUV4aXRpbmcgJiYgIW1EZXN0cm95aW5nOwogICAgICAgICB9CiAKQEAgLTY5OTYsMTQgKzcwMDIsMTIgQEAKIAogICAgICAgICAvKioKICAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaGFzIGEgc3VyZmFjZSB0aGF0IGl0IGhhcyBkcmF3biBhCi0gICAgICAgICAqIGNvbXBsZXRlIFVJIGluIHRvLiAgTm90ZSB0aGF0IHRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBvcmllbnRhdGlvbgotICAgICAgICAgKiBpcyBjaGFuZ2luZyBldmVuIGlmIHRoZSB3aW5kb3cgaGFzbid0IHJlZHJhd24gYmVjYXVzZSB3ZSBkb24ndCB3YW50Ci0gICAgICAgICAqIHRvIHN0b3AgdGhpbmdzIGZyb20gZXhlY3V0aW5nIGR1cmluZyB0aGF0IHRpbWUuCisgICAgICAgICAqIGNvbXBsZXRlIFVJIGluIHRvLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEcmF3bkx3KCkgewogICAgICAgICAgICAgZmluYWwgQXBwV2luZG93VG9rZW4gYXRva2VuID0gbUFwcFRva2VuOwogICAgICAgICAgICAgcmV0dXJuIG1TdXJmYWNlICE9IG51bGwgJiYgIW1EZXN0cm95aW5nCi0gICAgICAgICAgICAgICAgJiYgKG1PcmllbnRhdGlvbkNoYW5naW5nIHx8ICghbURyYXdQZW5kaW5nICYmICFtQ29tbWl0RHJhd1BlbmRpbmcpKTsKKyAgICAgICAgICAgICAgICAmJiAhbURyYXdQZW5kaW5nICYmICFtQ29tbWl0RHJhd1BlbmRpbmc7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBmaWxsc1NjcmVlbkx3KGludCBzY3JlZW5XaWR0aCwgaW50IHNjcmVlbkhlaWdodCwKQEAgLTg1MjQsNiArODUyOCwxMSBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHBlcmZvcm1MYXlvdXRBbmRQbGFjZVN1cmZhY2VzTG9ja2VkSW5uZXIoCiAgICAgICAgICAgICBib29sZWFuIHJlY292ZXJpbmdNZW1vcnkpIHsKKyAgICAgICAgaWYgKG1EaXNwbGF5ID09IG51bGwpIHsKKyAgICAgICAgICAgIFNsb2cuaShUQUcsICJza2lwcGluZyBwZXJmb3JtTGF5b3V0QW5kUGxhY2VTdXJmYWNlc0xvY2tlZElubmVyIHdpdGggbm8gbURpc3BsYXkiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgZmluYWwgaW50IGR3ID0gbURpc3BsYXkuZ2V0V2lkdGgoKTsKICAgICAgICAgZmluYWwgaW50IGRoID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7CkBAIC05MzEyLDEyICs5MzIxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHcubUF0dGFjaGVkSGlkZGVuIHx8ICF3LmlzUmVhZHlGb3JEaXNwbGF5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdy5tTGFzdEhpZGRlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19DT05GSUdVUkFUSU9OKSBTbG9nLnYoVEFHLCAiV2luZG93IGhpZGluZzogd2FpdGluZ1RvU2hvdz0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHcubVJvb3RUb2tlbi53YWl0aW5nVG9TaG93ICsgIiBwb2x2aXM9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3Lm1Qb2xpY3lWaXNpYmlsaXR5ICsgIiBhdHRoaWQ9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3Lm1BdHRhY2hlZEhpZGRlbiArICIgdG9raGlkPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdy5tUm9vdFRva2VuLmhpZGRlbiArICIgdmlzPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdy5tVmlld1Zpc2liaWxpdHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcubUxhc3RIaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTSE9XX1RSQU5TQUNUSU9OUykgbG9nU3VyZmFjZSh3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhJREUgKHBlcmZvcm1MYXlvdXQpIiwgbnVsbCk7CkBAIC05NzE4LDMwICs5NzIxLDI2IEBACiAgICAgICAgIH0gZWxzZSBpZiAoYW5pbWF0aW5nKSB7CiAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uTG9ja2VkKGN1cnJlbnRUaW1lKygxMDAwLzYwKS1TeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgbUlucHV0TW9uaXRvci51cGRhdGVJbnB1dFdpbmRvd3NMdygpOwotICAgICAgICAKLSAgICAgICAgaWYgKERFQlVHX0ZSRUVaRSkgU2xvZy52KFRBRywgIkxheW91dDogbURpc3BsYXlGcm96ZW49IiArIG1EaXNwbGF5RnJvemVuCi0gICAgICAgICAgICAgICAgKyAiIGhvbGRTY3JlZW49IiArIGhvbGRTY3JlZW4pOwotICAgICAgICBpZiAoIW1EaXNwbGF5RnJvemVuKSB7Ci0gICAgICAgICAgICBzZXRIb2xkU2NyZWVuTG9ja2VkKGhvbGRTY3JlZW4gIT0gbnVsbCk7Ci0gICAgICAgICAgICBpZiAoc2NyZWVuQnJpZ2h0bmVzcyA8IDAgfHwgc2NyZWVuQnJpZ2h0bmVzcyA+IDEuMGYpIHsKLSAgICAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldFNjcmVlbkJyaWdodG5lc3NPdmVycmlkZSgtMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0U2NyZWVuQnJpZ2h0bmVzc092ZXJyaWRlKChpbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2NyZWVuQnJpZ2h0bmVzcyAqIFBvd2VyLkJSSUdIVE5FU1NfT04pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChidXR0b25CcmlnaHRuZXNzIDwgMCB8fCBidXR0b25CcmlnaHRuZXNzID4gMS4wZikgewotICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0QnV0dG9uQnJpZ2h0bmVzc092ZXJyaWRlKC0xKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRCdXR0b25CcmlnaHRuZXNzT3ZlcnJpZGUoKGludCkKLSAgICAgICAgICAgICAgICAgICAgICAgIChidXR0b25CcmlnaHRuZXNzICogUG93ZXIuQlJJR0hUTkVTU19PTikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGhvbGRTY3JlZW4gIT0gbUhvbGRpbmdTY3JlZW5PbikgewotICAgICAgICAgICAgICAgIG1Ib2xkaW5nU2NyZWVuT24gPSBob2xkU2NyZWVuOwotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1ILm9idGFpbk1lc3NhZ2UoSC5IT0xEX1NDUkVFTl9DSEFOR0VELCBob2xkU2NyZWVuKTsKLSAgICAgICAgICAgICAgICBtSC5zZW5kTWVzc2FnZShtKTsKLSAgICAgICAgICAgIH0KKworICAgICAgICBzZXRIb2xkU2NyZWVuTG9ja2VkKGhvbGRTY3JlZW4gIT0gbnVsbCk7CisgICAgICAgIGlmIChzY3JlZW5CcmlnaHRuZXNzIDwgMCB8fCBzY3JlZW5CcmlnaHRuZXNzID4gMS4wZikgeworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRTY3JlZW5CcmlnaHRuZXNzT3ZlcnJpZGUoLTEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRTY3JlZW5CcmlnaHRuZXNzT3ZlcnJpZGUoKGludCkKKyAgICAgICAgICAgICAgICAgICAgKHNjcmVlbkJyaWdodG5lc3MgKiBQb3dlci5CUklHSFRORVNTX09OKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1dHRvbkJyaWdodG5lc3MgPCAwIHx8IGJ1dHRvbkJyaWdodG5lc3MgPiAxLjBmKSB7CisgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldEJ1dHRvbkJyaWdodG5lc3NPdmVycmlkZSgtMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldEJ1dHRvbkJyaWdodG5lc3NPdmVycmlkZSgoaW50KQorICAgICAgICAgICAgICAgICAgICAoYnV0dG9uQnJpZ2h0bmVzcyAqIFBvd2VyLkJSSUdIVE5FU1NfT04pKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaG9sZFNjcmVlbiAhPSBtSG9sZGluZ1NjcmVlbk9uKSB7CisgICAgICAgICAgICBtSG9sZGluZ1NjcmVlbk9uID0gaG9sZFNjcmVlbjsKKyAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1ILm9idGFpbk1lc3NhZ2UoSC5IT0xEX1NDUkVFTl9DSEFOR0VELCBob2xkU2NyZWVuKTsKKyAgICAgICAgICAgIG1ILnNlbmRNZXNzYWdlKG0pOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1UdXJuT25TY3JlZW4pIHsKQEAgLTEwMDMwLDggKzEwMDI5LDYgQEAKICAgICAgICAgICAgIG1GcmVlemVHY1BlbmRpbmcgPSBub3c7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoREVCVUdfRlJFRVpFKSBTbG9nLnYoVEFHLCAiKioqIEZSRUVaSU5HIERJU1BMQVkiLCBuZXcgUnVudGltZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgCiAgICAgICAgIG1EaXNwbGF5RnJvemVuID0gdHJ1ZTsKICAgICAgICAgCiAgICAgICAgIG1JbnB1dE1vbml0b3IuZnJlZXplSW5wdXREaXNwYXRjaGluZ0x3KCk7CkBAIC0xMDA1OCw4ICsxMDA1NSw2IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGlmIChERUJVR19GUkVFWkUpIFNsb2cudihUQUcsICIqKiogVU5GUkVFWklORyBESVNQTEFZIiwgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKSk7Ci0gICAgICAgIAogICAgICAgICBtRGlzcGxheUZyb3plbiA9IGZhbHNlOwogICAgICAgICBtSC5yZW1vdmVNZXNzYWdlcyhILkFQUF9GUkVFWkVfVElNRU9VVCk7CiAgICAgICAgIGlmIChQUk9GSUxFX09SSUVOVEFUSU9OKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggYTQxYmE5Yy4uM2NjNjBkYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMjM3Nyw2ICsyMzc3LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGlmIChwcm9jLnRocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHByb2MucGlkID09IFByb2Nlc3MubXlQaWQoKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJjcmFzaEFwcGxpY2F0aW9uOiB0cnlpbmcgdG8gY3Jhc2ggc2VsZiEiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgcHJvYy50aHJlYWQuc2NoZWR1bGVDcmFzaChtZXNzYWdlKTsKQEAgLTU3NDksNiArNTc1MywzNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgc2V0SW1tZXJzaXZlKElCaW5kZXIgdG9rZW4sIGJvb2xlYW4gaW1tZXJzaXZlKSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSAodG9rZW4gIT0gbnVsbCkgPyBtTWFpblN0YWNrLmluZGV4T2ZUb2tlbkxvY2tlZCh0b2tlbikgOiAtMTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3Rpdml0eVJlY29yZCByID0gKEFjdGl2aXR5UmVjb3JkKW1NYWluU3RhY2subUhpc3RvcnkuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgIHIuaW1tZXJzaXZlID0gaW1tZXJzaXZlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJbW1lcnNpdmUoSUJpbmRlciB0b2tlbikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9ICh0b2tlbiAhPSBudWxsKSA/IG1NYWluU3RhY2suaW5kZXhPZlRva2VuTG9ja2VkKHRva2VuKSA6IC0xOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2aXR5UmVjb3JkIHIgPSAoQWN0aXZpdHlSZWNvcmQpbU1haW5TdGFjay5tSGlzdG9yeS5nZXQoaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIHIuaW1tZXJzaXZlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNUb3BBY3Rpdml0eUltbWVyc2l2ZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBBY3Rpdml0eVJlY29yZCByID0gbU1haW5TdGFjay50b3BSdW5uaW5nQWN0aXZpdHlMb2NrZWQobnVsbCk7CisgICAgICAgICAgICByZXR1cm4gKHIgIT0gbnVsbCkgPyByLmltbWVyc2l2ZSA6IGZhbHNlOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50ZXJTYWZlTW9kZSgpIHsKICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKICAgICAgICAgICAgIC8vIEl0IG9ubHkgbWFrZXMgc2Vuc2UgdG8gZG8gdGhpcyBiZWZvcmUgdGhlIHN5c3RlbSBpcyByZWFkeQpAQCAtMTIwMDQsNyArMTIwMzcsNjkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKworICAgIHB1YmxpYyBib29sZWFuIGR1bXBIZWFwKFN0cmluZyBwcm9jZXNzLCBib29sZWFuIG1hbmFnZWQsCisgICAgICAgICAgICBTdHJpbmcgcGF0aCwgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAvLyBub3RlOiBoaWphY2tpbmcgU0VUX0FDVElWSVRZX1dBVENIRVIsIGJ1dCBzaG91bGQgYmUgY2hhbmdlZCB0bworICAgICAgICAgICAgICAgIC8vIGl0cyBvd24gcGVybWlzc2lvbiAoc2FtZSBhcyBwcm9maWxlQ29udHJvbCkuCisgICAgICAgICAgICAgICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlNFVF9BQ1RJVklUWV9XQVRDSEVSKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiUmVxdWlyZXMgcGVybWlzc2lvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uU0VUX0FDVElWSVRZX1dBVENIRVIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm51bGwgZmQiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBQcm9jZXNzUmVjb3JkIHByb2MgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGludCBwaWQgPSBJbnRlZ2VyLnBhcnNlSW50KHByb2Nlc3MpOworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1QaWRzU2VsZkxvY2tlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvYyA9IG1QaWRzU2VsZkxvY2tlZC5nZXQocGlkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHByb2MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgU3BhcnNlQXJyYXk8UHJvY2Vzc1JlY29yZD4+IGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbVByb2Nlc3NOYW1lcy5nZXRNYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgU3BhcnNlQXJyYXk8UHJvY2Vzc1JlY29yZD4gcHJvY3MgPSBhbGwuZ2V0KHByb2Nlc3MpOworICAgICAgICAgICAgICAgICAgICBpZiAocHJvY3MgIT0gbnVsbCAmJiBwcm9jcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jID0gcHJvY3MudmFsdWVBdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwcm9jID09IG51bGwgfHwgcHJvYy50aHJlYWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHByb2Nlc3M6ICIgKyBwcm9jZXNzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzU2VjdXJlID0gIjEiLmVxdWFscyhTeXN0ZW1Qcm9wZXJ0aWVzLmdldChTWVNURU1fU0VDVVJFLCAiMCIpKTsKKyAgICAgICAgICAgICAgICBpZiAoaXNTZWN1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwcm9jLmluZm8uZmxhZ3MmQXBwbGljYXRpb25JbmZvLkZMQUdfREVCVUdHQUJMRSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJQcm9jZXNzIG5vdCBkZWJ1Z2dhYmxlOiAiICsgcHJvYyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcm9jLnRocmVhZC5kdW1wSGVhcChtYW5hZ2VkLCBwYXRoLCBmZCk7CisgICAgICAgICAgICAgICAgZmQgPSBudWxsOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUHJvY2VzcyBkaXNhcHBlYXJlZCIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGZkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmZC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKiogSW4gdGhpcyBtZXRob2Qgd2UgdHJ5IHRvIGFjcXVpcmUgb3VyIGxvY2sgdG8gbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBub3QgZGVhZGxvY2tlZCAqLwogICAgIHB1YmxpYyB2b2lkIG1vbml0b3IoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeyB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVJlY29yZC5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlSZWNvcmQuamF2YQppbmRleCAxNjg3ZGIxLi42MmJlOTE4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVJlY29yZC5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5UmVjb3JkLmphdmEKQEAgLTEwMyw2ICsxMDMsNyBAQAogICAgIGJvb2xlYW4gaWRsZTsgICAgICAgICAgIC8vIGhhcyB0aGUgYWN0aXZpdHkgZ29uZSBpZGxlPwogICAgIGJvb2xlYW4gaGFzQmVlbkxhdW5jaGVkOy8vIGhhcyB0aGlzIGFjdGl2aXR5IGV2ZXIgYmVlbiBsYXVuY2hlZD8KICAgICBib29sZWFuIGZyb3plbkJlZm9yZURlc3Ryb3k7Ly8gaGFzIGJlZW4gZnJvemVuIGJ1dCBub3QgeWV0IGRlc3Ryb3llZC4KKyAgICBib29sZWFuIGltbWVyc2l2ZTsgICAgICAvLyBpbW1lcnNpdmUgbW9kZSAoZG9uJ3QgaW50ZXJydXB0IGlmIHBvc3NpYmxlKQogCiAgICAgU3RyaW5nIHN0cmluZ05hbWU7ICAgICAgLy8gZm9yIGNhY2hpbmcgb2YgdG9TdHJpbmcoKS4KICAgICAKQEAgLTE1OSw2ICsxNjAsNyBAQAogICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgia2V5c1BhdXNlZD0iKTsgcHcucHJpbnQoa2V5c1BhdXNlZCk7CiAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBpbkhpc3Rvcnk9Iik7IHB3LnByaW50KGluSGlzdG9yeSk7CiAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBwZXJzaXN0ZW50PSIpOyBwdy5wcmludChwZXJzaXN0ZW50KTsKKyAgICAgICAgICAgICAgICBwdy5wcmludCgiIGltbWVyc2l2ZT0iKTsgcHcucHJpbnQoaW1tZXJzaXZlKTsKICAgICAgICAgICAgICAgICBwdy5wcmludCgiIGxhdW5jaE1vZGU9Iik7IHB3LnByaW50bG4obGF1bmNoTW9kZSk7CiAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJmdWxsc2NyZWVuPSIpOyBwdy5wcmludChmdWxsc2NyZWVuKTsKICAgICAgICAgICAgICAgICBwdy5wcmludCgiIHZpc2libGU9Iik7IHB3LnByaW50KHZpc2libGUpOwpAQCAtMjg1LDYgKzI4Nyw4IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlzSG9tZUFjdGl2aXR5ID0gZmFsc2U7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGltbWVyc2l2ZSA9IChhSW5mby5mbGFncyAmIEFjdGl2aXR5SW5mby5GTEFHX0lNTUVSU0lWRSkgIT0gMDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJlYWxBY3Rpdml0eSA9IG51bGw7CiAgICAgICAgICAgICB0YXNrQWZmaW5pdHkgPSBudWxsOwpAQCAtMjk2LDYgKzMwMCw3IEBACiAgICAgICAgICAgICBwYWNrYWdlTmFtZSA9IG51bGw7CiAgICAgICAgICAgICBmdWxsc2NyZWVuID0gdHJ1ZTsKICAgICAgICAgICAgIGlzSG9tZUFjdGl2aXR5ID0gZmFsc2U7CisgICAgICAgICAgICBpbW1lcnNpdmUgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY29ubmVjdGl2aXR5L1RldGhlcmluZy5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY29ubmVjdGl2aXR5L1RldGhlcmluZy5qYXZhCmluZGV4IGViMGE4YTkuLjUzY2U1YzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Nvbm5lY3Rpdml0eS9UZXRoZXJpbmcuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jb25uZWN0aXZpdHkvVGV0aGVyaW5nLmphdmEKQEAgLTE5LDggKzE5LDggQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFBhbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CkBAIC0zMiw5ICszMiw5IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuSU5ldHdvcmtNYW5hZ2VtZW50RXZlbnRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2U7CkBAIC01Myw2ICs1Myw3IEBACiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAvKioKICAqIEBoaWRlCkBAIC02NSw3ICs2Niw4IEBACiBwdWJsaWMgY2xhc3MgVGV0aGVyaW5nIGV4dGVuZHMgSU5ldHdvcmtNYW5hZ2VtZW50RXZlbnRPYnNlcnZlci5TdHViIHsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBUQUcgPSAiVGV0aGVyaW5nIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIlRldGhlcmluZyI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1Cb290ZWQgPSBmYWxzZTsKICAgICAvL3VzZWQgdG8gcmVtZW1iZXIgaWYgd2UgZ290IGNvbm5lY3RlZCBiZWZvcmUgYm9vdCBmaW5pc2hlZApAQCAtNzQsNiArNzYsNyBAQAogICAgIC8vIFRPRE8gLSByZW1vdmUgYm90aCBvZiB0aGVzZSAtIHNob3VsZCBiZSBwYXJ0IG9mIGludGVyZmFjZSBpbnNwZWN0aW9uL3NlbGVjdGlvbiBzdHVmZgogICAgIHByaXZhdGUgU3RyaW5nW10gbVRldGhlcmFibGVVc2JSZWdleHM7CiAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtVGV0aGVyYWJsZVdpZmlSZWdleHM7CisgICAgcHJpdmF0ZSBTdHJpbmdbXSBtVGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4czsKICAgICBwcml2YXRlIFN0cmluZ1tdIG1VcHN0cmVhbUlmYWNlUmVnZXhzOwogCiAgICAgcHJpdmF0ZSBMb29wZXIgbUxvb3BlcjsKQEAgLTkzLDYgKzk2LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFMV9TVE9QICA9ICIxOTIuMTY4LjQyLjI1NCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTJfU1RBUlQgPSAiMTkyLjE2OC40My4yIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFMl9TVE9QICA9ICIxOTIuMTY4LjQzLjI1NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTNfU1RBUlQgPSAiMTkyLjE2OC40NC45IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFM19TVE9QICA9ICIxOTIuMTY4LjQ0LjI1NCI7CiAKICAgICBwcml2YXRlIFN0cmluZ1tdIG1EbnNTZXJ2ZXJzOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBETlNfREVGQVVMVF9TRVJWRVIxID0gIjguOC44LjgiOwpAQCAtMTEwLDYgKzExNSwxNCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtVXNiTWFzc1N0b3JhZ2VPZmY7ICAvLyB0cmFjayB0aGUgc3RhdHVzIG9mIFVTQiBNYXNzIFN0b3JhZ2UKICAgICBwcml2YXRlIGJvb2xlYW4gbVVzYkNvbm5lY3RlZDsgICAgICAgLy8gdHJhY2sgdGhlIHN0YXR1cyBvZiBVU0IgY29ubmVjdGlvbgogCisgICAgLy8gbVVzYkhhbmRsZXIgbWVzc2FnZQorICAgIHN0YXRpYyBmaW5hbCBpbnQgVVNCX1NUQVRFX0NIQU5HRSA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBVU0JfRElTQ09OTkVDVEVEID0gMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IFVTQl9DT05ORUNURUQgPSAxOworCisgICAgLy8gVGltZSB0byBkZWxheSBiZWZvcmUgcHJvY2Vzc2luZyBVU0IgZGlzY29ubmVjdCBldmVudHMKKyAgICBzdGF0aWMgZmluYWwgbG9uZyBVU0JfRElTQ09OTkVDVF9ERUxBWSA9IDEwMDA7CisKICAgICBwdWJsaWMgVGV0aGVyaW5nKENvbnRleHQgY29udGV4dCwgTG9vcGVyIGxvb3BlcikgewogICAgICAgICBMb2cuZChUQUcsICJUZXRoZXJpbmcgc3RhcnRpbmciKTsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwpAQCAtMTUyLDExICsxNjUsMTMgQEAKICAgICAgICAgbURoY3BSYW5nZSA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nQXJyYXkoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfdGV0aGVyX2RoY3BfcmFuZ2UpOwogICAgICAgICBpZiAoKG1EaGNwUmFuZ2UubGVuZ3RoID09IDApIHx8IChtRGhjcFJhbmdlLmxlbmd0aCAlIDIgPT0xKSkgewotICAgICAgICAgICAgbURoY3BSYW5nZSA9IG5ldyBTdHJpbmdbNF07CisgICAgICAgICAgICBtRGhjcFJhbmdlID0gbmV3IFN0cmluZ1s2XTsKICAgICAgICAgICAgIG1EaGNwUmFuZ2VbMF0gPSBESENQX0RFRkFVTFRfUkFOR0UxX1NUQVJUOwogICAgICAgICAgICAgbURoY3BSYW5nZVsxXSA9IERIQ1BfREVGQVVMVF9SQU5HRTFfU1RPUDsKICAgICAgICAgICAgIG1EaGNwUmFuZ2VbMl0gPSBESENQX0RFRkFVTFRfUkFOR0UyX1NUQVJUOwogICAgICAgICAgICAgbURoY3BSYW5nZVszXSA9IERIQ1BfREVGQVVMVF9SQU5HRTJfU1RPUDsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2VbNF0gPSBESENQX0RFRkFVTFRfUkFOR0UzX1NUQVJUOworICAgICAgICAgICAgbURoY3BSYW5nZVs1XSA9IERIQ1BfREVGQVVMVF9SQU5HRTNfU1RPUDsKICAgICAgICAgfQogICAgICAgICBtRHVuUmVxdWlyZWQgPSBmYWxzZTsgLy8gcmVzYW1wbGUgd2hlbiB3ZSB0dXJuIG9uCiAKQEAgLTE2NCw2ICsxNzksOCBAQAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3RldGhlcl91c2JfcmVnZXhzKTsKICAgICAgICAgbVRldGhlcmFibGVXaWZpUmVnZXhzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmdBcnJheSgKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LmNvbmZpZ190ZXRoZXJfd2lmaV9yZWdleHMpOworICAgICAgICBtVGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4cyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nQXJyYXkoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfdGV0aGVyX2JsdWV0b290aF9yZWdleHMpOwogICAgICAgICBtVXBzdHJlYW1JZmFjZVJlZ2V4cyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nQXJyYXkoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfdGV0aGVyX3Vwc3RyZWFtX3JlZ2V4cyk7CiAKQEAgLTE3NCw3ICsxOTEsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGludGVyZmFjZUxpbmtTdGF0dXNDaGFuZ2VkKFN0cmluZyBpZmFjZSwgYm9vbGVhbiBsaW5rKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImludGVyZmFjZUxpbmtTdGF0dXNDaGFuZ2VkICIgKyBpZmFjZSArICIsICIgKyBsaW5rKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJpbnRlcmZhY2VMaW5rU3RhdHVzQ2hhbmdlZCAiICsgaWZhY2UgKyAiLCAiICsgbGluayk7CiAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKICAgICAgICAgYm9vbGVhbiB1c2IgPSBmYWxzZTsKICAgICAgICAgaWYgKGlzV2lmaShpZmFjZSkpIHsKQEAgLTE4Miw2ICsxOTksOCBAQAogICAgICAgICB9IGVsc2UgaWYgKGlzVXNiKGlmYWNlKSkgewogICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgdXNiID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpc0JsdWV0b290aChpZmFjZSkpIHsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoZm91bmQgPT0gZmFsc2UpIHJldHVybjsKIApAQCAtMjE2LDYgKzIzNSwxMiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaXNCbHVldG9vdGgoU3RyaW5nIGlmYWNlKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHJlZ2V4IDogbVRldGhlcmFibGVCbHVldG9vdGhSZWdleHMpIHsKKyAgICAgICAgICAgIGlmIChpZmFjZS5tYXRjaGVzKHJlZ2V4KSkgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICBwdWJsaWMgdm9pZCBpbnRlcmZhY2VBZGRlZChTdHJpbmcgaWZhY2UpIHsKICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOwogICAgICAgICBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIHNlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7CkBAIC0yMjgsMjkgKzI1MywzNCBAQAogICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgdXNiID0gdHJ1ZTsKICAgICAgICAgfQorICAgICAgICBpZiAoaXNCbHVldG9vdGgoaWZhY2UpKSB7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIH0KICAgICAgICAgaWYgKGZvdW5kID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsIGlmYWNlICsgIiBpcyBub3QgYSB0ZXRoZXJhYmxlIGlmYWNlLCBpZ25vcmluZyIpOworICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsIGlmYWNlICsgIiBpcyBub3QgYSB0ZXRoZXJhYmxlIGlmYWNlLCBpZ25vcmluZyIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgc3luY2hyb25pemVkIChtSWZhY2VzKSB7CiAgICAgICAgICAgICBUZXRoZXJJbnRlcmZhY2VTTSBzbSA9IG1JZmFjZXMuZ2V0KGlmYWNlKTsKICAgICAgICAgICAgIGlmIChzbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiYWN0aXZlIGlmYWNlICgiICsgaWZhY2UgKyAiKSByZXBvcnRlZCBhcyBhZGRlZCwgaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgImFjdGl2ZSBpZmFjZSAoIiArIGlmYWNlICsgIikgcmVwb3J0ZWQgYXMgYWRkZWQsIGlnbm9yaW5nIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc20gPSBuZXcgVGV0aGVySW50ZXJmYWNlU00oaWZhY2UsIG1Mb29wZXIsIHVzYik7CiAgICAgICAgICAgICBtSWZhY2VzLnB1dChpZmFjZSwgc20pOwogICAgICAgICAgICAgc20uc3RhcnQoKTsKICAgICAgICAgfQotICAgICAgICBMb2cuZChUQUcsICJpbnRlcmZhY2VBZGRlZCA6IiArIGlmYWNlKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJpbnRlcmZhY2VBZGRlZCA6IiArIGlmYWNlKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBpbnRlcmZhY2VSZW1vdmVkKFN0cmluZyBpZmFjZSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1JZmFjZXMpIHsKICAgICAgICAgICAgIFRldGhlckludGVyZmFjZVNNIHNtID0gbUlmYWNlcy5nZXQoaWZhY2UpOwogICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJhdHRlbXB0aW5nIHRvIHJlbW92ZSB1bmtub3duIGlmYWNlICgiICsgaWZhY2UgKyAiKSwgaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiYXR0ZW1wdGluZyB0byByZW1vdmUgdW5rbm93biBpZmFjZSAoIiArIGlmYWNlICsgIiksIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNtLnNlbmRNZXNzYWdlKFRldGhlckludGVyZmFjZVNNLkNNRF9JTlRFUkZBQ0VfRE9XTik7CkBAIC0zMjEsMTMgKzM1MSwxNCBAQAogCiAgICAgICAgIGJvb2xlYW4gd2lmaVRldGhlcmVkID0gZmFsc2U7CiAgICAgICAgIGJvb2xlYW4gdXNiVGV0aGVyZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBibHVldG9vdGhUZXRoZXJlZCA9IGZhbHNlOwogCiAgICAgICAgIHN5bmNocm9uaXplZCAobUlmYWNlcykgewogICAgICAgICAgICAgU2V0IGlmYWNlcyA9IG1JZmFjZXMua2V5U2V0KCk7CiAgICAgICAgICAgICBmb3IgKE9iamVjdCBpZmFjZSA6IGlmYWNlcykgewogICAgICAgICAgICAgICAgIFRldGhlckludGVyZmFjZVNNIHNtID0gbUlmYWNlcy5nZXQoaWZhY2UpOwogICAgICAgICAgICAgICAgIGlmIChzbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHNtLmlzRXJyb3JlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzbS5pc0Vycm9yZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JlZExpc3QuYWRkKChTdHJpbmcpaWZhY2UpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNtLmlzQXZhaWxhYmxlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUxpc3QuYWRkKChTdHJpbmcpaWZhY2UpOwpAQCAtMzM2LDYgKzM2Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiVGV0aGVyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1dpZmkoKFN0cmluZylpZmFjZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWZpVGV0aGVyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNCbHVldG9vdGgoKFN0cmluZylpZmFjZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGhUZXRoZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVMaXN0LmFkZCgoU3RyaW5nKWlmYWNlKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMzUwLDE3ICszODMsMjUgQEAKICAgICAgICAgYnJvYWRjYXN0LnB1dFN0cmluZ0FycmF5TGlzdEV4dHJhKENvbm5lY3Rpdml0eU1hbmFnZXIuRVhUUkFfRVJST1JFRF9URVRIRVIsCiAgICAgICAgICAgICAgICAgZXJyb3JlZExpc3QpOwogICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGJyb2FkY2FzdCk7Ci0gICAgICAgIExvZy5kKFRBRywgInNlbmRUZXRoZXJTdGF0ZUNoYW5nZWRCcm9hZGNhc3QgIiArIGF2YWlsYWJsZUxpc3Quc2l6ZSgpICsgIiwgIiArCi0gICAgICAgICAgICAgICAgYWN0aXZlTGlzdC5zaXplKCkgKyAiLCAiICsgZXJyb3JlZExpc3Quc2l6ZSgpKTsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJzZW5kVGV0aGVyU3RhdGVDaGFuZ2VkQnJvYWRjYXN0ICIgKyBhdmFpbGFibGVMaXN0LnNpemUoKSArICIsICIgKworICAgICAgICAgICAgICAgICAgICBhY3RpdmVMaXN0LnNpemUoKSArICIsICIgKyBlcnJvcmVkTGlzdC5zaXplKCkpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKHVzYlRldGhlcmVkKSB7Ci0gICAgICAgICAgICBpZiAod2lmaVRldGhlcmVkKSB7CisgICAgICAgICAgICBpZiAod2lmaVRldGhlcmVkIHx8IGJsdWV0b290aFRldGhlcmVkKSB7CiAgICAgICAgICAgICAgICAgc2hvd1RldGhlcmVkTm90aWZpY2F0aW9uKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuc3RhdF9zeXNfdGV0aGVyX2dlbmVyYWwpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzaG93VGV0aGVyZWROb3RpZmljYXRpb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X3N5c190ZXRoZXJfdXNiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICh3aWZpVGV0aGVyZWQpIHsKLSAgICAgICAgICAgIHNob3dUZXRoZXJlZE5vdGlmaWNhdGlvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLnN0YXRfc3lzX3RldGhlcl93aWZpKTsKKyAgICAgICAgICAgIGlmIChibHVldG9vdGhUZXRoZXJlZCkgeworICAgICAgICAgICAgICAgIHNob3dUZXRoZXJlZE5vdGlmaWNhdGlvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLnN0YXRfc3lzX3RldGhlcl9nZW5lcmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2hvd1RldGhlcmVkTm90aWZpY2F0aW9uKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuc3RhdF9zeXNfdGV0aGVyX3dpZmkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGJsdWV0b290aFRldGhlcmVkKSB7CisgICAgICAgICAgICBzaG93VGV0aGVyZWROb3RpZmljYXRpb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X3N5c190ZXRoZXJfYmx1ZXRvb3RoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGNsZWFyVGV0aGVyZWROb3RpZmljYXRpb24oKTsKICAgICAgICAgfQpAQCAtMzkxLDcgKzQzMiw3IEBACiAgICAgICAgIENoYXJTZXF1ZW5jZSBtZXNzYWdlID0gci5nZXRUZXh0KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLgogICAgICAgICAgICAgICAgIHRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlKTsKIAotICAgICAgICBpZihtVGV0aGVyZWROb3RpZmljYXRpb24gPT0gbnVsbCkgeworICAgICAgICBpZiAobVRldGhlcmVkTm90aWZpY2F0aW9uID09IG51bGwpIHsKICAgICAgICAgICAgIG1UZXRoZXJlZE5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oKTsKICAgICAgICAgICAgIG1UZXRoZXJlZE5vdGlmaWNhdGlvbi53aGVuID0gMDsKICAgICAgICAgfQpAQCAtNDIxLDEyICs0NjIsMjUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgSGFuZGxlciBtVXNiSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgbVVzYkNvbm5lY3RlZCA9IChtc2cuYXJnMSA9PSBVU0JfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIHVwZGF0ZVVzYlN0YXR1cygpOworICAgICAgICB9CisgICAgfTsKKwogICAgIHByaXZhdGUgY2xhc3MgU3RhdGVSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGVudCwgSW50ZW50IGludGVudCkgewogICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKICAgICAgICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKFVzYi5BQ1RJT05fVVNCX1NUQVRFKSkgewotICAgICAgICAgICAgICAgIG1Vc2JDb25uZWN0ZWQgPSBpbnRlbnQuZ2V0RXh0cmFzKCkuZ2V0Qm9vbGVhbihVc2IuVVNCX0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVXNiU3RhdHVzKCk7CisgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBjb25uZWN0IGV2ZW50cyBpbW1lZGlhdGVseSwgYnV0IGRlbGF5IGhhbmRsaW5nIGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgLy8gdG8gZGVib3VuY2UgVVNCIGNvbmZpZ3VyYXRpb24gY2hhbmdlcworICAgICAgICAgICAgICAgIGJvb2xlYW4gY29ubmVjdGVkID0gaW50ZW50LmdldEV4dHJhcygpLmdldEJvb2xlYW4oVXNiLlVTQl9DT05ORUNURUQpOworICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4obVVzYkhhbmRsZXIsIFVTQl9TVEFURV9DSEFOR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAoY29ubmVjdGVkID8gVVNCX0NPTk5FQ1RFRCA6IFVTQl9ESVNDT05ORUNURUQpLCAwKTsKKyAgICAgICAgICAgICAgICBtVXNiSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhVU0JfU1RBVEVfQ0hBTkdFKTsKKyAgICAgICAgICAgICAgICBtVXNiSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCBjb25uZWN0ZWQgPyAwIDogVVNCX0RJU0NPTk5FQ1RfREVMQVkpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEludGVudC5BQ1RJT05fTUVESUFfU0hBUkVEKSkgewogICAgICAgICAgICAgICAgIG1Vc2JNYXNzU3RvcmFnZU9mZiA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHVwZGF0ZVVzYlN0YXR1cygpOwpAQCAtNDM1LDcgKzQ4OSw3IEBACiAgICAgICAgICAgICAgICAgbVVzYk1hc3NTdG9yYWdlT2ZmID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB1cGRhdGVVc2JTdGF0dXMoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhDb25uZWN0aXZpdHlNYW5hZ2VyLkNPTk5FQ1RJVklUWV9BQ1RJT04pKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGV0aGVyaW5nIGdvdCBDT05ORUNUSVZJVFlfQUNUSU9OIik7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJUZXRoZXJpbmcgZ290IENPTk5FQ1RJVklUWV9BQ1RJT04iKTsKICAgICAgICAgICAgICAgICBtVGV0aGVyTWFzdGVyU00uc2VuZE1lc3NhZ2UoVGV0aGVyTWFzdGVyU00uQ01EX1VQU1RSRUFNX0NIQU5HRUQpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEludGVudC5BQ1RJT05fQk9PVF9DT01QTEVURUQpKSB7CiAgICAgICAgICAgICAgICAgbUJvb3RlZCA9IHRydWU7CkBAIC00NjYsOSArNTIwLDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIHRvZ2dsZWQgd2hlbiB3ZSBlbnRlci9sZWF2ZSB0aGUgZnVsbHkgdGVhdGhlcmVkIHN0YXRlCisgICAgLy8gdG9nZ2xlZCB3aGVuIHdlIGVudGVyL2xlYXZlIHRoZSBmdWxseSB0ZXRoZXJlZCBzdGF0ZQogICAgIHByaXZhdGUgYm9vbGVhbiBlbmFibGVVc2JSbmRpcyhib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiZW5hYmxlVXNiUm5kaXMoIiArIGVuYWJsZWQgKyAiKSIpOworICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgImVuYWJsZVVzYlJuZGlzKCIgKyBlbmFibGVkICsgIikiKTsKICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOwogICAgICAgICAgICAgICAgIElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2Ugc2VydmljZSA9IElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShiKTsKIApAQCAtNDkzLDcgKzU0Nyw3IEBACiAKICAgICAvLyBjb25maWd1cmVkIHdoZW4gd2Ugc3RhcnQgdGV0aGVyaW5nIGFuZCB1bmNvbmZpZydkIG9uIGVycm9yIG9yIGNvbmNsdXNpb24KICAgICBwcml2YXRlIGJvb2xlYW4gY29uZmlndXJlVXNiSWZhY2UoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImNvbmZpZ3VyZVVzYklmYWNlKCIgKyBlbmFibGVkICsgIikiKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJjb25maWd1cmVVc2JJZmFjZSgiICsgZW5hYmxlZCArICIpIik7CiAKICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOwogICAgICAgICBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIHNlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7CkBAIC01NDksNiArNjAzLDEwIEBACiAgICAgICAgIHJldHVybiBtVGV0aGVyYWJsZVdpZmlSZWdleHM7CiAgICAgfQogCisgICAgcHVibGljIFN0cmluZ1tdIGdldFRldGhlcmFibGVCbHVldG9vdGhSZWdleHMoKSB7CisgICAgICAgIHJldHVybiBtVGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4czsKKyAgICB9CisKICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VXBzdHJlYW1JZmFjZVJlZ2V4cygpIHsKICAgICAgICAgcmV0dXJuIG1VcHN0cmVhbUlmYWNlUmVnZXhzOwogICAgIH0KQEAgLTc0MCw3ICs3OTgsNyBAQAogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkluaXRpYWxTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiSW5pdGlhbFN0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfVEVUSEVSX1JFUVVFU1RFRDoKQEAgLTc4MSw3ICs4MzksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTdGFydGluZ1N0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJTdGFydGluZ1N0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbWF5YmUgYSBwYXJlbnQgY2xhc3M/CkBAIC04MzMsNyArODkxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobVVzYikgVGV0aGVyaW5nLnRoaXMuZW5hYmxlVXNiUm5kaXModHJ1ZSk7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGV0aGVyZWQgIiArIG1JZmFjZU5hbWUpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVGV0aGVyZWQgIiArIG1JZmFjZU5hbWUpOwogICAgICAgICAgICAgICAgIHNldEF2YWlsYWJsZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgc2V0VGV0aGVyZWQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgc2VuZFRldGhlclN0YXRlQ2hhbmdlZEJyb2FkY2FzdCgpOwpAQCAtODQ0LDcgKzkwMiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRldGhlcmVkU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIlRldGhlcmVkU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKICAgICAgICAgICAgICAgICBib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBib29sZWFuIGVycm9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKQEAgLTg4Nyw3ICs5NDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLndoYXQgPT0gQ01EX0lOVEVSRkFDRV9ET1dOKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1VbmF2YWlsYWJsZVN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlVudGV0aGVyZWQgIiArIG1JZmFjZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJVbnRldGhlcmVkICIgKyBtSWZhY2VOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9URVRIRVJfQ09OTkVDVElPTl9DSEFOR0VEOgogICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1Vwc3RyZWFtSWZhY2VOYW1lID0gKFN0cmluZykobWVzc2FnZS5vYmopOwpAQCAtOTYwLDcgKzEwMTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5URVRIRVJfRVJST1JfTUFTVEVSX0VSUk9SKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRldGhlciBsb3N0IHVwc3RyZWFtIGNvbm5lY3Rpb24gIiArIG1JZmFjZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJUZXRoZXIgbG9zdCB1cHN0cmVhbSBjb25uZWN0aW9uICIgKyBtSWZhY2VOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRUZXRoZXJTdGF0ZUNoYW5nZWRCcm9hZGNhc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVXNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXRoZXJpbmcudGhpcy5jb25maWd1cmVVc2JJZmFjZShmYWxzZSkpIHsKQEAgLTExOTgsOCArMTI1NiwxMCBAQAogICAgICAgICAgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CiAgICAgICAgICAgICAgICAgSUNvbm5lY3Rpdml0eU1hbmFnZXIgY20gPSBJQ29ubmVjdGl2aXR5TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKGIpOwogICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uUmVxdWVzdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY2hvb3NlVXBzdHJlYW1UeXBlKCIgKyB0cnlDZWxsICsgIiksICBkdW5SZXF1aXJlZCA9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtRHVuUmVxdWlyZWQgKyAiLCBpZmFjZT0iICsgaWZhY2UpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjaG9vc2VVcHN0cmVhbVR5cGUoIiArIHRyeUNlbGwgKyAiKSwgIGR1blJlcXVpcmVkID0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRHVuUmVxdWlyZWQgKyAiLCBpZmFjZT0iICsgaWZhY2UpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoaWZhY2UgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EdW5SZXF1aXJlZCkgewpAQCAtMTIwNyw3ICsxMjY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrSW5mbyBpbmZvID0gY20uZ2V0TmV0d29ya0luZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFX0RVTik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzZXR0aW5nIGR1biBpZmFjZW5hbWUgPSIgKyBpZmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAic2V0dGluZyBkdW4gaWZhY2VuYW1lID0iICsgaWZhY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVuIGlmIHdlJ3JlIGFscmVhZHkgY29ubmVjdGVkIC0gaXQgbWF5IGJlIHNvbWVib2R5IGVsc2UncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZjb3VudCwgc28gYWRkIG91ciBvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybk9uTW9iaWxlQ29ubmVjdGlvbigpOwpAQCAtMTIxOSwxMSArMTI3OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjaGVja2luZyBpZiBoaXByaSBicm91Z2h0IHVzIHRoaXMgY29ubmVjdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiY2hlY2tpbmcgaWYgaGlwcmkgYnJvdWdodCB1cyB0aGlzIGNvbm5lY3Rpb24iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrSW5mbyBpbmZvID0gY20uZ2V0TmV0d29ya0luZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFX0hJUFJJKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInllcyAtIGhpcHJpIGluIHVzZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInllcyAtIGhpcHJpIGluIHVzZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVuIGlmIHdlJ3JlIGFscmVhZHkgY29ubmVjdGVkIC0gaXQgbWF5IGJlIHNvbWJvZHkgZWxzZSdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmNvdW50LCBzbyBhZGQgb3VyIG93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJuT25Nb2JpbGVDb25uZWN0aW9uKCk7CkBAIC0xMjQ1LDcgKzEzMDUsNyBAQAogICAgICAgICAgICAgICAgIG5vdGlmeVRldGhlcmVkT2ZOZXdVcHN0cmVhbUlmYWNlKGlmYWNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeVRldGhlcmVkT2ZOZXdVcHN0cmVhbUlmYWNlKFN0cmluZyBpZmFjZU5hbWUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJub3RpZnlpbmcgdGV0aGVyZWQgd2l0aCBpZmFjZSA9IiArIGlmYWNlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJub3RpZnlpbmcgdGV0aGVyZWQgd2l0aCBpZmFjZSA9IiArIGlmYWNlTmFtZSk7CiAgICAgICAgICAgICAgICAgbVVwc3RyZWFtSWZhY2VOYW1lID0gaWZhY2VOYW1lOwogICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8gOiBtTm90aWZ5TGlzdCkgewogICAgICAgICAgICAgICAgICAgICBUZXRoZXJJbnRlcmZhY2VTTSBzbSA9IChUZXRoZXJJbnRlcmZhY2VTTSlvOwpAQCAtMTI2MiwxOSArMTMyMiwxOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJNYXN0ZXJJbml0aWFsU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIk1hc3RlckluaXRpYWxTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ01EX1RFVEhFUl9NT0RFX1JFUVVFU1RFRDoKICAgICAgICAgICAgICAgICAgICAgICAgIG1EdW5SZXF1aXJlZCA9IGlzRHVuUmVxdWlyZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFRldGhlckludGVyZmFjZVNNIHdobyA9IChUZXRoZXJJbnRlcmZhY2VTTSltZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRldGhlciBNb2RlIHJlcXVlc3RlZCBieSAiICsgd2hvLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJUZXRoZXIgTW9kZSByZXF1ZXN0ZWQgYnkgIiArIHdoby50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3RpZnlMaXN0LmFkZCh3aG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1UZXRoZXJNb2RlQWxpdmVTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfVEVUSEVSX01PREVfVU5SRVFVRVNURUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICB3aG8gPSAoVGV0aGVySW50ZXJmYWNlU00pbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUZXRoZXIgTW9kZSB1bnJlcXVlc3RlZCBieSAiICsgd2hvLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJUZXRoZXIgTW9kZSB1bnJlcXVlc3RlZCBieSAiICsgd2hvLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbU5vdGlmeUxpc3QuaW5kZXhPZih3aG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vdGlmeUxpc3QucmVtb3ZlKHdobyk7CkBAIC0xMzA0LDcgKzEzNjQsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUZXRoZXJNb2RlQWxpdmVTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVGV0aGVyTW9kZUFsaXZlU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKICAgICAgICAgICAgICAgICBib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9URVRIRVJfTU9ERV9SRVFVRVNURUQ6CkBAIC0xMzMyLDggKzEzOTIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSdyZSBzdGlsbCB1c2luZyBhIHJlcXVlc3RlZCBjb25uZWN0aW9uIC0gbWF5IGhhdmUgZm91bmQKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpZmkgb3Igc29tZXRoaW5nIHNpbmNlIHRoZW4uCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25SZXF1ZXN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZW5ld2luZyBtb2JpbGUgY29ubmVjdGlvbiAtIHJlcXVldWluZyBmb3IgYW5vdGhlciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTExfQ09OTkVDVElPTl9SRU5FV19NUyArICJtcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZW5ld2luZyBtb2JpbGUgY29ubmVjdGlvbiAtIHJlcXVldWluZyBmb3IgYW5vdGhlciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUxMX0NPTk5FQ1RJT05fUkVORVdfTVMgKyAibXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybk9uTW9iaWxlQ29ubmVjdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTY5MmY4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0NvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3IuamF2YQpAQCAtMCwwICsxLDM1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIubG9jYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uR2VvY29kZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBjb3VudHJ5IHdoZXJlIHRoZSB1c2VyIGlzLiBUaGUgc291cmNlcyBvZgorICogY291bnRyeSBhcmUgcXVlcmllZCBpbiBvcmRlciBvZiByZWxpYWJpbGl0eSwgbGlrZQorICogPHVsPgorICogPGxpPk1vYmlsZSBuZXR3b3JrPC9saT4KKyAqIDxsaT5Mb2NhdGlvbjwvbGk+CisgKiA8bGk+U0lNJ3MgY291bnRyeTwvbGk+CisgKiA8bGk+UGhvbmUncyBsb2NhbGU8L2xpPgorICogPC91bD4KKyAqIDxwPgorICogQ2FsbCB0aGUge0BsaW5rICNkZXRlY3RDb3VudHJ5KCl9IHRvIGdldCB0aGUgYXZhaWxhYmxlIGNvdW50cnkgaW1tZWRpYXRlbHkuCisgKiA8cD4KKyAqIFRvIGJlIG5vdGlmaWVkIG9mIHRoZSBmdXR1cmUgY291bnRyeSBjaGFuZ2UsIHVzaW5nIHRoZQorICoge0BsaW5rICNzZXRDb3VudHJ5TGlzdGVuZXIoQ291bnRyeUxpc3RlbmVyKX0KKyAqIDxwPgorICogVXNpbmcgdGhlIHtAbGluayAjc3RvcCgpfSB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgY291bnRyeSBjaGFuZ2UuCisgKiA8cD4KKyAqIFRoZSBjb3VudHJ5IGluZm9ybWF0aW9uIHdpbGwgYmUgcmVmcmVzaGVkIGV2ZXJ5CisgKiB7QGxpbmsgI0xPQ0FUSU9OX1JFRlJFU0hfSU5URVJWQUx9IG9uY2UgdGhlIGxvY2F0aW9uIGJhc2VkIGNvdW50cnkgaXMgdXNlZC4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvciBleHRlbmRzIENvdW50cnlEZXRlY3RvckJhc2UgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yIjsKKworICAgIC8qKgorICAgICAqIFRoZSByZWZyZXNoIGludGVydmFsIHdoZW4gdGhlIGxvY2F0aW9uIGJhc2VkIGNvdW50cnkgd2FzIHVzZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIExPQ0FUSU9OX1JFRlJFU0hfSU5URVJWQUwgPSAxMDAwICogNjAgKiA2MCAqIDI0OyAvLyAxIGRheQorCisgICAgcHJvdGVjdGVkIENvdW50cnlEZXRlY3RvckJhc2UgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3I7CisgICAgcHJvdGVjdGVkIFRpbWVyIG1Mb2NhdGlvblJlZnJlc2hUaW1lcjsKKworICAgIHByaXZhdGUgZmluYWwgaW50IG1QaG9uZVR5cGU7CisgICAgcHJpdmF0ZSBDb3VudHJ5IG1Db3VudHJ5OworICAgIHByaXZhdGUgVGVsZXBob255TWFuYWdlciBtVGVsZXBob255TWFuYWdlcjsKKyAgICBwcml2YXRlIENvdW50cnkgbUNvdW50cnlGcm9tTG9jYXRpb247CisgICAgcHJpdmF0ZSBib29sZWFuIG1TdG9wcGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTZXJ2aWNlU3RhdGUgbUxhc3RTdGF0ZTsKKworICAgIHByaXZhdGUgUGhvbmVTdGF0ZUxpc3RlbmVyIG1QaG9uZVN0YXRlTGlzdGVuZXIgPSBuZXcgUGhvbmVTdGF0ZUxpc3RlbmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlU3RhdGVDaGFuZ2VkKFNlcnZpY2VTdGF0ZSBzZXJ2aWNlU3RhdGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IEZpbmQgb3V0IGhvdyBvZnRlbiB3ZSB3aWxsIGJlIG5vdGlmaWVkLCBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgdG9vCisgICAgICAgICAgICAvLyBtYW55IHRpbWVzLCBsZXQncyBjb25zaWRlciBxdWVyeWluZyB0aGUgbmV0d29yay4KKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJvblNlcnZpY2VTdGF0ZUNoYW5nZWQiKTsKKyAgICAgICAgICAgIC8vIFdlIG9ubHkgY2FyZSB0aGUgc3RhdGUgY2hhbmdlCisgICAgICAgICAgICBpZiAobUxhc3RTdGF0ZSA9PSBudWxsIHx8IG1MYXN0U3RhdGUuZ2V0U3RhdGUoKSAhPSBzZXJ2aWNlU3RhdGUuZ2V0U3RhdGUoKSkgeworICAgICAgICAgICAgICAgIGRldGVjdENvdW50cnkodHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgbUxhc3RTdGF0ZSA9IG5ldyBTZXJ2aWNlU3RhdGUoc2VydmljZVN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdGVuZXIgZm9yIHJlY2VpdmluZyB0aGUgbm90aWZpY2F0aW9uIGZyb20gTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvdW50cnlMaXN0ZW5lciBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rpb25MaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ291bnRyeURldGVjdGVkKENvdW50cnkgY291bnRyeSkgeworICAgICAgICAgICAgbUNvdW50cnlGcm9tTG9jYXRpb24gPSBjb3VudHJ5OworICAgICAgICAgICAgLy8gRG9uJ3Qgc3RhcnQgdGhlIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IuCisgICAgICAgICAgICBkZXRlY3RDb3VudHJ5KHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgIHN0b3BMb2NhdGlvbkJhc2VkRGV0ZWN0b3IoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyID0gKFRlbGVwaG9ueU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlRFTEVQSE9OWV9TRVJWSUNFKTsKKyAgICAgICAgbVBob25lVHlwZSA9IG1UZWxlcGhvbnlNYW5hZ2VyLmdldFBob25lVHlwZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb3VudHJ5IGRldGVjdENvdW50cnkoKSB7CisgICAgICAgIC8vIERvbid0IHN0YXJ0IHRoZSBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIGlmIHdlIGhhdmUgYmVlbiBzdG9wcGVkLgorICAgICAgICByZXR1cm4gZGV0ZWN0Q291bnRyeShmYWxzZSwgIW1TdG9wcGVkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBTbG9nLmkoVEFHLCAiU3RvcCB0aGUgZGV0ZWN0b3IuIik7CisgICAgICAgIGNhbmNlbExvY2F0aW9uUmVmcmVzaCgpOworICAgICAgICByZW1vdmVQaG9uZVN0YXRlTGlzdGVuZXIoKTsKKyAgICAgICAgc3RvcExvY2F0aW9uQmFzZWREZXRlY3RvcigpOworICAgICAgICBtTGlzdGVuZXIgPSBudWxsOworICAgICAgICBtU3RvcHBlZCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb3VudHJ5IGZyb20gZGlmZmVyZW50IHNvdXJjZXMgaW4gb3JkZXIgb2YgdGhlIHJlbGlhYmlsaXR5LgorICAgICAqLworICAgIHByaXZhdGUgQ291bnRyeSBnZXRDb3VudHJ5KCkgeworICAgICAgICBDb3VudHJ5IHJlc3VsdCA9IG51bGw7CisgICAgICAgIHJlc3VsdCA9IGdldE5ldHdvcmtCYXNlZENvdW50cnkoKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQgPSBnZXRMYXN0S25vd25Mb2NhdGlvbkJhc2VkQ291bnRyeSgpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0ID0gZ2V0U2ltQmFzZWRDb3VudHJ5KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQgPSBnZXRMb2NhbGVDb3VudHJ5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjb3VudHJ5IGZyb20gdGhlIG1vYmlsZSBuZXR3b3JrLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldE5ldHdvcmtCYXNlZENvdW50cnkoKSB7CisgICAgICAgIFN0cmluZyBjb3VudHJ5SXNvID0gbnVsbDsKKyAgICAgICAgLy8gVE9ETzogVGhlIGRvY3VtZW50IHNheXMgdGhlIHJlc3VsdCBtYXkgYmUgdW5yZWxpYWJsZSBvbiBDRE1BIG5ldHdvcmtzLiBTaGFsbCB3ZSB1c2UKKyAgICAgICAgLy8gaXQgb24gQ0RNQSBwaG9uZT8gV2UgbWF5IHRlc3QgdGhlIEFuZHJvaWQgcHJpbWFyaWx5IHVzZWQgY291bnRyaWVzLgorICAgICAgICBpZiAobVBob25lVHlwZSA9PSBUZWxlcGhvbnlNYW5hZ2VyLlBIT05FX1RZUEVfR1NNKSB7CisgICAgICAgICAgICBjb3VudHJ5SXNvID0gbVRlbGVwaG9ueU1hbmFnZXIuZ2V0TmV0d29ya0NvdW50cnlJc28oKTsKKyAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoY291bnRyeUlzbykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvdW50cnkoY291bnRyeUlzbywgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9ORVRXT1JLKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjYWNoZWQgbG9jYXRpb24gYmFzZWQgY291bnRyeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRMYXN0S25vd25Mb2NhdGlvbkJhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgcmV0dXJuIG1Db3VudHJ5RnJvbUxvY2F0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgZnJvbSBTSU0gY2FyZAorICAgICAqLworICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldFNpbUJhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgU3RyaW5nIGNvdW50cnlJc28gPSBudWxsOworICAgICAgICBjb3VudHJ5SXNvID0gbVRlbGVwaG9ueU1hbmFnZXIuZ2V0U2ltQ291bnRyeUlzbygpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGNvdW50cnlJc28pKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvdW50cnkoY291bnRyeUlzbywgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9TSU0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgZnJvbSB0aGUgc3lzdGVtJ3MgbG9jYWxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldExvY2FsZUNvdW50cnkoKSB7CisgICAgICAgIExvY2FsZSBkZWZhdWx0TG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKKyAgICAgICAgaWYgKGRlZmF1bHRMb2NhbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3VudHJ5KGRlZmF1bHRMb2NhbGUuZ2V0Q291bnRyeSgpLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX0xPQ0FMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBub3RpZnlDaGFuZ2UgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGxpc3RlbmVyIHNob3VsZCBiZSBub3RpZmllZCB0aGUgY2hhbmdlIG9mIHRoZQorICAgICAqIGNvdW50cnkKKyAgICAgKiBAcGFyYW0gc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uIGluZGljYXRlcyB3aGV0aGVyIHRoZSBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIGNvdWxkCisgICAgICogYmUgc3RhcnRlZCBpZiB0aGUgY3VycmVudCBjb3VudHJ5IHNvdXJjZSBpcyBsZXNzIHJlbGlhYmxlIHRoYW4gdGhlIGxvY2F0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgYXZhaWxhYmxlIFVzZXJDb3VudHJ5CisgICAgICovCisgICAgcHJpdmF0ZSBDb3VudHJ5IGRldGVjdENvdW50cnkoYm9vbGVhbiBub3RpZnlDaGFuZ2UsIGJvb2xlYW4gc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uKSB7CisgICAgICAgIENvdW50cnkgY291bnRyeSA9IGdldENvdW50cnkoKTsKKyAgICAgICAgcnVuQWZ0ZXJEZXRlY3Rpb25Bc3luYyhtQ291bnRyeSAhPSBudWxsID8gbmV3IENvdW50cnkobUNvdW50cnkpIDogbUNvdW50cnksIGNvdW50cnksCisgICAgICAgICAgICAgICAgbm90aWZ5Q2hhbmdlLCBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24pOworICAgICAgICBtQ291bnRyeSA9IGNvdW50cnk7CisgICAgICAgIHJldHVybiBtQ291bnRyeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIHRhc2tzIGluIHRoZSBzZXJ2aWNlJ3MgdGhyZWFkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJ1bkFmdGVyRGV0ZWN0aW9uQXN5bmMoZmluYWwgQ291bnRyeSBjb3VudHJ5LCBmaW5hbCBDb3VudHJ5IGRldGVjdGVkQ291bnRyeSwKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbm90aWZ5Q2hhbmdlLCBmaW5hbCBib29sZWFuIHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdGlvbikgeworICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBydW5BZnRlckRldGVjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnksIGRldGVjdGVkQ291bnRyeSwgbm90aWZ5Q2hhbmdlLCBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRDb3VudHJ5TGlzdGVuZXIoQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIENvdW50cnlMaXN0ZW5lciBwcmV2TGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICBpZiAobUxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFN0b3AgbGlzdGVuaW5nIGFsbCBzZXJ2aWNlcworICAgICAgICAgICAgcmVtb3ZlUGhvbmVTdGF0ZUxpc3RlbmVyKCk7CisgICAgICAgICAgICBzdG9wTG9jYXRpb25CYXNlZERldGVjdG9yKCk7CisgICAgICAgICAgICBjYW5jZWxMb2NhdGlvblJlZnJlc2goKTsKKyAgICAgICAgfSBlbHNlIGlmIChwcmV2TGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgYWRkUGhvbmVTdGF0ZUxpc3RlbmVyKCk7CisgICAgICAgICAgICBkZXRlY3RDb3VudHJ5KGZhbHNlLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcnVuQWZ0ZXJEZXRlY3Rpb24oZmluYWwgQ291bnRyeSBjb3VudHJ5LCBmaW5hbCBDb3VudHJ5IGRldGVjdGVkQ291bnRyeSwKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbm90aWZ5Q2hhbmdlLCBmaW5hbCBib29sZWFuIHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdGlvbikgeworICAgICAgICBpZiAobm90aWZ5Q2hhbmdlKSB7CisgICAgICAgICAgICBub3RpZnlJZkNvdW50cnlDaGFuZ2VkKGNvdW50cnksIGRldGVjdGVkQ291bnRyeSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdGlvbiAmJiAoZGV0ZWN0ZWRDb3VudHJ5ID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCBkZXRlY3RlZENvdW50cnkuZ2V0U291cmNlKCkgPiBDb3VudHJ5LkNPVU5UUllfU09VUkNFX0xPQ0FUSU9OKQorICAgICAgICAgICAgICAgICYmIGlzQWlycGxhbmVNb2RlT2ZmKCkgJiYgbUxpc3RlbmVyICE9IG51bGwgJiYgaXNHZW9Db2RlckltcGxlbWVudGVkKCkpIHsKKyAgICAgICAgICAgIC8vIFN0YXJ0IGZpbmRpbmcgbG9jYXRpb24gd2hlbiB0aGUgc291cmNlIGlzIGxlc3MgcmVsaWFibGUgdGhhbiB0aGUKKyAgICAgICAgICAgIC8vIGxvY2F0aW9uIGFuZCB0aGUgYWlycGxhbmUgbW9kZSBpcyBvZmYgKGFzIGdlb2NvZGVyIHdpbGwgbm90CisgICAgICAgICAgICAvLyB3b3JrKS4KKyAgICAgICAgICAgIC8vIFRPRE8gOiBTaGFsbCB3ZSBnaXZlIHVwIHN0YXJ0aW5nIHRoZSBkZXRlY3RvciB3aXRoaW4gYQorICAgICAgICAgICAgLy8gcGVyaW9kIG9mIHRpbWU/CisgICAgICAgICAgICBzdGFydExvY2F0aW9uQmFzZWREZXRlY3RvcihtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rpb25MaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldGVjdGVkQ291bnRyeSA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgZGV0ZWN0ZWRDb3VudHJ5LmdldFNvdXJjZSgpID49IENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQVRJT04pIHsKKyAgICAgICAgICAgIC8vIFNjaGVkdWxlIHRoZSBsb2NhdGlvbiByZWZyZXNoIGlmIHRoZSBjb3VudHJ5IHNvdXJjZSBpcworICAgICAgICAgICAgLy8gbm90IG1vcmUgcmVsaWFibGUgdGhhbiB0aGUgbG9jYXRpb24gb3Igbm8gY291bnRyeSBpcworICAgICAgICAgICAgLy8gZm91bmQuCisgICAgICAgICAgICAvLyBUT0RPOiBMaXN0ZW4gdG8gdGhlIHByZWZlcmVuY2UgY2hhbmdlIG9mIEdQUywgV2lmaSBldGMsCisgICAgICAgICAgICAvLyBhbmQgc3RhcnQgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5LgorICAgICAgICAgICAgc2NoZWR1bGVMb2NhdGlvblJlZnJlc2goKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENhbmNlbCB0aGUgbG9jYXRpb24gcmVmcmVzaCBvbmNlIHRoZSBjdXJyZW50IHNvdXJjZSBpcworICAgICAgICAgICAgLy8gbW9yZSByZWxpYWJsZSB0aGFuIHRoZSBsb2NhdGlvbi4KKyAgICAgICAgICAgIGNhbmNlbExvY2F0aW9uUmVmcmVzaCgpOworICAgICAgICAgICAgc3RvcExvY2F0aW9uQmFzZWREZXRlY3RvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgY291bnRyeSBmcm9tIExvY2F0aW9uUHJvdmlkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydExvY2F0aW9uQmFzZWREZXRlY3RvcihDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciA9IGNyZWF0ZUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IoKTsKKyAgICAgICAgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc3RvcExvY2F0aW9uQmFzZWREZXRlY3RvcigpIHsKKyAgICAgICAgaWYgKG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLnN0b3AoKTsKKyAgICAgICAgICAgIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBDb3VudHJ5RGV0ZWN0b3JCYXNlIGNyZWF0ZUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvcihtQ29udGV4dCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBaXJwbGFuZU1vZGVPZmYoKSB7CisgICAgICAgIHJldHVybiBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KAorICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLCBTZXR0aW5ncy5TeXN0ZW0uQUlSUExBTkVfTU9ERV9PTiwgMCkgPT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIGNvdW50cnkgY2hhbmdlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBub3RpZnlJZkNvdW50cnlDaGFuZ2VkKGZpbmFsIENvdW50cnkgY291bnRyeSwgZmluYWwgQ291bnRyeSBkZXRlY3RlZENvdW50cnkpIHsKKyAgICAgICAgaWYgKGRldGVjdGVkQ291bnRyeSAhPSBudWxsICYmIG1MaXN0ZW5lciAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgKGNvdW50cnkgPT0gbnVsbCB8fCAhY291bnRyeS5lcXVhbHMoZGV0ZWN0ZWRDb3VudHJ5KSkpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsCisgICAgICAgICAgICAgICAgICAgICJUaGUgY291bnRyeSB3YXMgY2hhbmdlZCBmcm9tICIgKyBjb3VudHJ5ICE9IG51bGwgPyBjb3VudHJ5LmdldENvdW50cnlJc28oKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ICsgIiB0byAiICsgZGV0ZWN0ZWRDb3VudHJ5LmdldENvdW50cnlJc28oKSk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihkZXRlY3RlZENvdW50cnkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2NoZWR1bGUgdGhlIG5leHQgbG9jYXRpb24gcmVmcmVzaC4gV2Ugd2lsbCBkbyBub3RoaW5nIGlmIHRoZSBzY2hlZHVsZWQgdGFzayBleGlzdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzY2hlZHVsZUxvY2F0aW9uUmVmcmVzaCgpIHsKKyAgICAgICAgaWYgKG1Mb2NhdGlvblJlZnJlc2hUaW1lciAhPSBudWxsKSByZXR1cm47CisgICAgICAgIG1Mb2NhdGlvblJlZnJlc2hUaW1lciA9IG5ldyBUaW1lcigpOworICAgICAgICBtTG9jYXRpb25SZWZyZXNoVGltZXIuc2NoZWR1bGUobmV3IFRpbWVyVGFzaygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1Mb2NhdGlvblJlZnJlc2hUaW1lciA9IG51bGw7CisgICAgICAgICAgICAgICAgZGV0ZWN0Q291bnRyeShmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sIExPQ0FUSU9OX1JFRlJFU0hfSU5URVJWQUwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbmNlbCB0aGUgc2NoZWR1bGVkIHJlZnJlc2ggdGFzayBpZiBpdCBleGlzdHMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNhbmNlbExvY2F0aW9uUmVmcmVzaCgpIHsKKyAgICAgICAgaWYgKG1Mb2NhdGlvblJlZnJlc2hUaW1lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9jYXRpb25SZWZyZXNoVGltZXIuY2FuY2VsKCk7CisgICAgICAgICAgICBtTG9jYXRpb25SZWZyZXNoVGltZXIgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGFkZFBob25lU3RhdGVMaXN0ZW5lcigpIHsKKyAgICAgICAgaWYgKG1QaG9uZVN0YXRlTGlzdGVuZXIgPT0gbnVsbCAmJiBtUGhvbmVUeXBlID09IFRlbGVwaG9ueU1hbmFnZXIuUEhPTkVfVFlQRV9HU00pIHsKKyAgICAgICAgICAgIG1MYXN0U3RhdGUgPSBudWxsOworICAgICAgICAgICAgbVBob25lU3RhdGVMaXN0ZW5lciA9IG5ldyBQaG9uZVN0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlU3RhdGVDaGFuZ2VkKFNlcnZpY2VTdGF0ZSBzZXJ2aWNlU3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogRmluZCBvdXQgaG93IG9mdGVuIHdlIHdpbGwgYmUgbm90aWZpZWQsIGlmIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGlzIGNhbGxlZCB0b28KKyAgICAgICAgICAgICAgICAgICAgLy8gbWFueSB0aW1lcywgbGV0J3MgY29uc2lkZXIgcXVlcnlpbmcgdGhlIG5ldHdvcmsuCisgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJvblNlcnZpY2VTdGF0ZUNoYW5nZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBjYXJlIHRoZSBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0U3RhdGUgPT0gbnVsbCB8fCBtTGFzdFN0YXRlLmdldFN0YXRlKCkgIT0gc2VydmljZVN0YXRlLmdldFN0YXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdENvdW50cnkodHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFN0YXRlID0gbmV3IFNlcnZpY2VTdGF0ZShzZXJ2aWNlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyLmxpc3RlbihtUGhvbmVTdGF0ZUxpc3RlbmVyLCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX1NFUlZJQ0VfU1RBVEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVBob25lU3RhdGVMaXN0ZW5lcigpIHsKKyAgICAgICAgaWYgKG1QaG9uZVN0YXRlTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIubGlzdGVuKG1QaG9uZVN0YXRlTGlzdGVuZXIsIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fTk9ORSk7CisgICAgICAgICAgICBtUGhvbmVTdGF0ZUxpc3RlbmVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzR2VvQ29kZXJJbXBsZW1lbnRlZCgpIHsKKyAgICAgICAgcmV0dXJuIEdlb2NvZGVyLmlzSW1wbGVtZW50ZWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db3VudHJ5RGV0ZWN0b3JCYXNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db3VudHJ5RGV0ZWN0b3JCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMyNmVmOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0NvdW50cnlEZXRlY3RvckJhc2UuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5sb2NhdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeTsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBtZXRob2RzIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGNvdW50cnkKKyAqIGRldGVjdG9yLgorICogPHA+CisgKiBDYWxsaW5nIHtAbGluayAjZGV0ZWN0Q291bnRyeX0gdG8gc3RhcnQgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5LiBUaGUgY291bnRyeQorICogY291bGQgYmUgcmV0dXJuZWQgaW1tZWRpYXRlbHkgaWYgaXQgaXMgYXZhaWxhYmxlLgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb3VudHJ5RGV0ZWN0b3JCYXNlIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKKyAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcm90ZWN0ZWQgQ291bnRyeUxpc3RlbmVyIG1MaXN0ZW5lcjsKKyAgICBwcm90ZWN0ZWQgQ291bnRyeSBtRGV0ZWN0ZWRDb3VudHJ5OworCisgICAgcHVibGljIENvdW50cnlEZXRlY3RvckJhc2UoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjdHg7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBkZXRlY3RpbmcgdGhlIGNvdW50cnkgdGhhdCB0aGUgdXNlciBpcyBpbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgaWYgaXQgaXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LCBvdGhlcndpc2UgbnVsbCBzaG91bGQKKyAgICAgKiAgICAgICAgIGJlIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBDb3VudHJ5IGRldGVjdENvdW50cnkoKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSB0aGUgbm90aWZpY2F0aW9uIHdoZW4gdGhlIGNvdW50cnkgaXMgZGV0ZWN0ZWQgb3IgY2hhbmdlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcHJldmlvdXMgbGlzdGVuZXIgd2lsbCBiZSByZXBsYWNlZCBpZiBpdCBleGlzdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q291bnRyeUxpc3RlbmVyKENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wIGRldGVjdGluZyB0aGUgY291bnRyeS4gVGhlIGRldGVjdG9yIHNob3VsZCByZWxlYXNlIGFsbCBzeXN0ZW0gc2VydmljZXMgYW5kIGJlIHJlYWR5IHRvCisgICAgICogYmUgZnJlZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdG9wKCk7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcihDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdGVuZXIub25Db3VudHJ5RGV0ZWN0ZWQoY291bnRyeSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTM5ZjA1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0xvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IuamF2YQpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIubG9jYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkFkZHJlc3M7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uR2VvY29kZXI7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZXRlY3RzIHdoaWNoIGNvdW50cnkgdGhlIHVzZXIgY3VycmVudGx5IGlzIGluIHRocm91Z2ggdGhlIGVuYWJsZWQKKyAqIGxvY2F0aW9uIHByb3ZpZGVycyBhbmQgdGhlIEdlb0NvZGVyCisgKiA8cD4KKyAqIFVzZSB7QGxpbmsgI2RldGVjdENvdW50cnl9IHRvIHN0YXJ0IHF1ZXJ5aW5nLiBJZiB0aGUgbG9jYXRpb24gY2FuIG5vdCBiZQorICogcmVzb2x2ZWQgd2l0aGluIHRoZSBnaXZlbiB0aW1lLCB0aGUgbGFzdCBrbm93biBsb2NhdGlvbiB3aWxsIGJlIHVzZWQgdG8gZ2V0CisgKiB0aGUgdXNlciBjb3VudHJ5IHRocm91Z2ggdGhlIEdlb0NvZGVyLiBUaGUgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdpbGwgYmUKKyAqIHRocm93biBpZiB0aGVyZSBpcyBhIG9uZ29pbmcgcXVlcnkuCisgKiA8cD4KKyAqIFRoZSBjdXJyZW50IHF1ZXJ5IGNhbiBiZSBzdG9wcGVkIGJ5IHtAbGluayAjc3RvcCgpfQorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIGV4dGVuZHMgQ291bnRyeURldGVjdG9yQmFzZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIFFVRVJZX0xPQ0FUSU9OX1RJTUVPVVQgPSAxMDAwICogNjAgKiA1OyAvLyA1IG1pbnMKKworICAgIC8qKgorICAgICAqIFVzZWQgZm9yIGNhbmNlbGluZyBsb2NhdGlvbiBxdWVyeQorICAgICAqLworICAgIHByb3RlY3RlZCBUaW1lciBtVGltZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGhyZWFkIHRvIHF1ZXJ5IHRoZSBjb3VudHJ5IGZyb20gdGhlIEdlb0NvZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBUaHJlYWQgbVF1ZXJ5VGhyZWFkOworICAgIHByb3RlY3RlZCBMaXN0PExvY2F0aW9uTGlzdGVuZXI+IG1Mb2NhdGlvbkxpc3RlbmVyczsKKworICAgIHByaXZhdGUgTG9jYXRpb25NYW5hZ2VyIG1Mb2NhdGlvbk1hbmFnZXI7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbUVuYWJsZWRQcm92aWRlcnM7CisKKyAgICBwdWJsaWMgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvcihDb250ZXh0IGN0eCkgeworICAgICAgICBzdXBlcihjdHgpOworICAgICAgICBtTG9jYXRpb25NYW5hZ2VyID0gKExvY2F0aW9uTWFuYWdlcikgY3R4LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MT0NBVElPTl9TRVJWSUNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZSBmcm9tIHRoZSBsb2NhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q291bnRyeUZyb21Mb2NhdGlvbihMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICBTdHJpbmcgY291bnRyeSA9IG51bGw7CisgICAgICAgIEdlb2NvZGVyIGdlb0NvZGVyID0gbmV3IEdlb2NvZGVyKG1Db250ZXh0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpc3Q8QWRkcmVzcz4gYWRkcmVzc2VzID0gZ2VvQ29kZXIuZ2V0RnJvbUxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5nZXRMYXRpdHVkZSgpLCBsb2NhdGlvbi5nZXRMb25naXR1ZGUoKSwgMSk7CisgICAgICAgICAgICBpZiAoYWRkcmVzc2VzICE9IG51bGwgJiYgYWRkcmVzc2VzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBjb3VudHJ5ID0gYWRkcmVzc2VzLmdldCgwKS5nZXRDb3VudHJ5Q29kZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAiRXhjZXB0aW9uIG9jY3VycyB3aGVuIGdldHRpbmcgY291bnRyeSBmcm9tIGxvY2F0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50cnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgdGhlIGxpc3RlbmVycyB3aXRoIHRoZSBsb2NhdGlvbiBwcm92aWRlcnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckVuYWJsZWRQcm92aWRlcnMoTGlzdDxMb2NhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgaW50IHRvdGFsID0gbGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8IHRvdGFsOyBpKyspIHsKKyAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcygKKyAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWRQcm92aWRlcnMuZ2V0KGkpLCAwLCAwLCBsaXN0ZW5lcnMuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXIgdGhlIGxpc3RlbmVycyB3aXRoIHRoZSBsb2NhdGlvbiBwcm92aWRlcnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB1bnJlZ2lzdGVyUHJvdmlkZXJzKExpc3Q8TG9jYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXJzKSB7CisgICAgICAgIGZvciAoTG9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgeworICAgICAgICAgICAgbUxvY2F0aW9uTWFuYWdlci5yZW1vdmVVcGRhdGVzKGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGxhc3Qga25vd24gbG9jYXRpb24gZnJvbSBhbGwgcHJvdmlkZXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIExvY2F0aW9uIGdldExhc3RLbm93bkxvY2F0aW9uKCkgeworICAgICAgICBMaXN0PFN0cmluZz4gcHJvdmlkZXJzID0gbUxvY2F0aW9uTWFuYWdlci5nZXRBbGxQcm92aWRlcnMoKTsKKyAgICAgICAgTG9jYXRpb24gYmVzdExvY2F0aW9uID0gbnVsbDsKKyAgICAgICAgZm9yIChTdHJpbmcgcHJvdmlkZXIgOiBwcm92aWRlcnMpIHsKKyAgICAgICAgICAgIExvY2F0aW9uIGxhc3RLbm93bkxvY2F0aW9uID0gbUxvY2F0aW9uTWFuYWdlci5nZXRMYXN0S25vd25Mb2NhdGlvbihwcm92aWRlcik7CisgICAgICAgICAgICBpZiAobGFzdEtub3duTG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChiZXN0TG9jYXRpb24gPT0gbnVsbCB8fCBiZXN0TG9jYXRpb24uZ2V0VGltZSgpIDwgbGFzdEtub3duTG9jYXRpb24uZ2V0VGltZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGJlc3RMb2NhdGlvbiA9IGxhc3RLbm93bkxvY2F0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmVzdExvY2F0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHRpbWVvdXQgZm9yIHF1ZXJ5aW5nIHRoZSBsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBnZXRRdWVyeUxvY2F0aW9uVGltZW91dCgpIHsKKyAgICAgICAgcmV0dXJuIFFVRVJZX0xPQ0FUSU9OX1RJTUVPVVQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGVuYWJsZWQgbG9jYXRpb24gcHJvdmlkZXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBnZXRUb3RhbEVuYWJsZWRQcm92aWRlcnMoKSB7CisgICAgICAgIGlmIChtRW5hYmxlZFByb3ZpZGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtRW5hYmxlZFByb3ZpZGVycyA9IG1Mb2NhdGlvbk1hbmFnZXIuZ2V0UHJvdmlkZXJzKHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRW5hYmxlZFByb3ZpZGVycy5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5LgorICAgICAqIDxwPgorICAgICAqIFF1ZXJpZXMgdGhlIGxvY2F0aW9uIGZyb20gYWxsIGxvY2F0aW9uIHByb3ZpZGVycywgdGhlbiBzdGFydHMgYSB0aHJlYWQgdG8gcXVlcnkgdGhlCisgICAgICogY291bnRyeSBmcm9tIEdlb0NvZGVyLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ291bnRyeSBkZXRlY3RDb3VudHJ5KCkgeworICAgICAgICBpZiAobUxvY2F0aW9uTGlzdGVuZXJzICAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVxdWVzdCB0aGUgbG9jYXRpb24gZnJvbSBhbGwgZW5hYmxlZCBwcm92aWRlcnMuCisgICAgICAgIGludCB0b3RhbFByb3ZpZGVycyA9IGdldFRvdGFsRW5hYmxlZFByb3ZpZGVycygpOworICAgICAgICBpZiAodG90YWxQcm92aWRlcnMgPiAwKSB7CisgICAgICAgICAgICBtTG9jYXRpb25MaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PExvY2F0aW9uTGlzdGVuZXI+KHRvdGFsUHJvdmlkZXJzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxQcm92aWRlcnM7IGkrKykgeworICAgICAgICAgICAgICAgIExvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYXRpb25MaXN0ZW5lciAoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9jYXRpb25DaGFuZ2VkKExvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IudGhpcy5zdG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudHJ5Q29kZShsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckRpc2FibGVkKFN0cmluZyBwcm92aWRlcikgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJFbmFibGVkKFN0cmluZyBwcm92aWRlcikgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhdHVzQ2hhbmdlZChTdHJpbmcgcHJvdmlkZXIsIGludCBzdGF0dXMsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgbUxvY2F0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWdpc3RlckVuYWJsZWRQcm92aWRlcnMobUxvY2F0aW9uTGlzdGVuZXJzKTsKKyAgICAgICAgICAgIG1UaW1lciA9IG5ldyBUaW1lcigpOworICAgICAgICAgICAgbVRpbWVyLnNjaGVkdWxlKG5ldyBUaW1lclRhc2soKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBtVGltZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLnRoaXMuc3RvcCgpOworICAgICAgICAgICAgICAgICAgICAvLyBMb29rcyBsaWtlIG5vIHByb3ZpZGVyIGNvdWxkIHByb3ZpZGUgdGhlIGxvY2F0aW9uLCBsZXQncyB0cnkgdGhlIGxhc3QKKyAgICAgICAgICAgICAgICAgICAgLy8ga25vd24gbG9jYXRpb24uCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnRyeUNvZGUoZ2V0TGFzdEtub3duTG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgZ2V0UXVlcnlMb2NhdGlvblRpbWVvdXQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBwcm92aWRlciBlbmFibGVkLgorICAgICAgICAgICAgcXVlcnlDb3VudHJ5Q29kZShnZXRMYXN0S25vd25Mb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURldGVjdGVkQ291bnRyeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wIHRoZSBjdXJyZW50IHF1ZXJ5IHdpdGhvdXQgbm90aWZ5aW5nIHRoZSBsaXN0ZW5lci4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgaWYgKG1Mb2NhdGlvbkxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICB1bnJlZ2lzdGVyUHJvdmlkZXJzKG1Mb2NhdGlvbkxpc3RlbmVycyk7CisgICAgICAgICAgICBtTG9jYXRpb25MaXN0ZW5lcnMgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpbWVyLmNhbmNlbCgpOworICAgICAgICAgICAgbVRpbWVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgbmV3IHRocmVhZCB0byBxdWVyeSB0aGUgY291bnRyeSBmcm9tIEdlb2NvZGVyLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcXVlcnlDb3VudHJ5Q29kZShmaW5hbCBMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobnVsbCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1RdWVyeVRocmVhZCAhPSBudWxsKSByZXR1cm47CisgICAgICAgIG1RdWVyeVRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBjb3VudHJ5SXNvID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb3VudHJ5SXNvID0gZ2V0Q291bnRyeUZyb21Mb2NhdGlvbihsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb3VudHJ5SXNvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbURldGVjdGVkQ291bnRyeSA9IG5ldyBDb3VudHJ5KGNvdW50cnlJc28sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQVRJT04pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1EZXRlY3RlZENvdW50cnkgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtRGV0ZWN0ZWRDb3VudHJ5KTsKKyAgICAgICAgICAgICAgICBtUXVlcnlUaHJlYWQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgbVF1ZXJ5VGhyZWFkLnN0YXJ0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9qbmkvQW5kcm9pZC5tawppbmRleCBjZGMwYTZmLi40NTk1NTFkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qbmkvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9qbmkvQW5kcm9pZC5tawpAQCAtOCw2ICs4LDcgQEAKICAgICBjb21fYW5kcm9pZF9zZXJ2ZXJfTGlnaHRzU2VydmljZS5jcHAgXAogICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlLmNwcCBcCiAgICAgY29tX2FuZHJvaWRfc2VydmVyX1N5c3RlbVNlcnZlci5jcHAgXAorICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlci5jcHAgXAogICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9WaWJyYXRvclNlcnZpY2UuY3BwIFwKIAljb21fYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlci5jcHAgXAogICAgIG9ubG9hZC5jcHAKQEAgLTI1LDYgKzI2LDggQEAKIAlsaWJ1dGlscyBcCiAJbGlidWkKIAorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJ1c2Job3N0CisKIGlmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKIGlmZXEgKCQoVEFSR0VUX09TKSxsaW51eCkKIGlmZXEgKCQoVEFSR0VUX0FSQ0gpLHg4NikKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfVXNiT2JzZXJ2ZXIuY3BwIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0NzhkNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfVXNiT2JzZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJVc2JPYnNlcnZlciIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIkpOSUhlbHAuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKyNpbmNsdWRlICJ1dGlscy9WZWN0b3IuaCIKKworI2luY2x1ZGUgPHVzYmhvc3QvdXNiaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLCA2LCAyMCkKKyNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L3VzYl9jaDkuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKKworc3RhdGljIGptZXRob2RJRCBtZXRob2RfdXNiQ2FtZXJhQWRkZWQ7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF91c2JDYW1lcmFSZW1vdmVkOworCitWZWN0b3I8aW50PiBtRGV2aWNlTGlzdDsKKworc3RhdGljIHZvaWQgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhKTklFbnYqIGVudiwgY29uc3QgY2hhciogbWV0aG9kTmFtZSkgeworICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgTE9HRSgiQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgY2FsbGJhY2sgJyVzJy4iLCBtZXRob2ROYW1lKTsKKyAgICAgICAgTE9HRV9FWChlbnYpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IHVzYl9kZXZpY2VfYWRkZWQoY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCogY2xpZW50X2RhdGEpIHsKKyAgICAvLyBjaGVjayB0byBzZWUgaWYgaXQgaXMgYSBjYW1lcmEKKyAgICBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyKiBkZXNjOworICAgIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9pdGVyIGl0ZXI7CisKKyAgICBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlID0gdXNiX2RldmljZV9vcGVuKGRldm5hbWUpOworICAgIGlmICghZGV2aWNlKSB7CisgICAgICAgIExPR0UoInVzYl9kZXZpY2Vfb3BlbiBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1c2JfZGVzY3JpcHRvcl9pdGVyX2luaXQoZGV2aWNlLCAmaXRlcik7CisKKyAgICB3aGlsZSAoKGRlc2MgPSB1c2JfZGVzY3JpcHRvcl9pdGVyX25leHQoJml0ZXIpKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChkZXNjLT5iRGVzY3JpcHRvclR5cGUgPT0gVVNCX0RUX0lOVEVSRkFDRSkgeworICAgICAgICAgICAgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqaW50ZXJmYWNlID0gKHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKilkZXNjOworCisgICAgICAgICAgICBpZiAoaW50ZXJmYWNlLT5iSW50ZXJmYWNlQ2xhc3MgPT0gVVNCX0NMQVNTX1NUSUxMX0lNQUdFICYmCisgICAgICAgICAgICAgICAgaW50ZXJmYWNlLT5iSW50ZXJmYWNlU3ViQ2xhc3MgPT0gMSAmJiAvLyBTdGlsbCBJbWFnZSBDYXB0dXJlCisgICAgICAgICAgICAgICAgaW50ZXJmYWNlLT5iSW50ZXJmYWNlUHJvdG9jb2wgPT0gMSkgICAgIC8vIFBpY3R1cmUgVHJhbnNmZXIgUHJvdG9jb2wgKFBJTUEgMTU0NzApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTE9HRCgiRm91bmQgY2FtZXJhOiBcIiVzXCIgXCIlc1wiXG4iLCB1c2JfZGV2aWNlX2dldF9tYW51ZmFjdHVyZXJfbmFtZShkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgdXNiX2RldmljZV9nZXRfcHJvZHVjdF9uYW1lKGRldmljZSkpOworCisgICAgICAgICAgICAgICAgLy8gaW50ZXJmYWNlIHNob3VsZCBiZSBmb2xsb3dlZCBieSB0aHJlZSBlbmRwb2ludHMKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwOworICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfaW5fZGVzYyA9IE5VTEw7CisgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcF9vdXRfZGVzYyA9IE5VTEw7CisgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcF9pbnRyX2Rlc2MgPSBOVUxMOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGVwID0gKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqKXVzYl9kZXNjcmlwdG9yX2l0ZXJfbmV4dCgmaXRlcik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZXAgfHwgZXAtPmJEZXNjcmlwdG9yVHlwZSAhPSBVU0JfRFRfRU5EUE9JTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoImVuZHBvaW50cyBub3QgZm91bmRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChlcC0+Ym1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcF9pbl9kZXNjID0gZXA7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBfb3V0X2Rlc2MgPSBlcDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcC0+Ym1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVwX2ludHJfZGVzYyA9IGVwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZXBfaW5fZGVzYyB8fCAhZXBfb3V0X2Rlc2MgfHwgIWVwX2ludHJfZGVzYykgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJlbmRwb2ludHMgbm90IGZvdW5kXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGlmIHdlIGdvdCBoZXJlLCB3ZSBmb3VuZCBhIGNhbWVyYQorICAgICAgICAgICAgICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgICAgICAgICAgICAgIGpvYmplY3QgdGhpeiA9IChqb2JqZWN0KWNsaWVudF9kYXRhOworCisgICAgICAgICAgICAgICAgaW50IGlkID0gdXNiX2RldmljZV9nZXRfdW5pcXVlX2lkX2Zyb21fbmFtZShkZXZuYW1lKTsKKyAgICAgICAgICAgICAgICBtRGV2aWNlTGlzdC5hZGQoaWQpOworCisgICAgICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZCh0aGl6LCBtZXRob2RfdXNiQ2FtZXJhQWRkZWQsIGlkKTsKKyAgICAgICAgICAgICAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK2RvbmU6CisgICAgdXNiX2RldmljZV9jbG9zZShkZXZpY2UpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYl9kZXZpY2VfcmVtb3ZlZChjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkKiBjbGllbnRfZGF0YSkgeworICAgIGludCBpZCA9IHVzYl9kZXZpY2VfZ2V0X3VuaXF1ZV9pZF9mcm9tX25hbWUoZGV2bmFtZSk7CisKKyAgICAvLyBzZWUgaWYgaXQgaXMgYSBkZXZpY2Ugd2Uga25vdyBhYm91dAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURldmljZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGlkICA9PSBtRGV2aWNlTGlzdFtpXSkgeworICAgICAgICAgICAgbURldmljZUxpc3QucmVtb3ZlQXQoaSk7CisKKyAgICAgICAgICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgICAgICAgICAgam9iamVjdCB0aGl6ID0gKGpvYmplY3QpY2xpZW50X2RhdGE7CisKKyAgICAgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QodGhpeiwgbWV0aG9kX3VzYkNhbWVyYVJlbW92ZWQsIGlkKTsKKyAgICAgICAgICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfc2VydmVyX1VzYk9ic2VydmVyX21vbml0b3JVc2JIb3N0QnVzKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisgICAgc3RydWN0IHVzYl9ob3N0X2NvbnRleHQqIGNvbnRleHQgPSB1c2JfaG9zdF9pbml0KCk7CisgICAgaWYgKCFjb250ZXh0KSB7CisgICAgICAgIExPR0UoInVzYl9ob3N0X2luaXQgZmFpbGVkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gdGhpcyB3aWxsIG5ldmVyIHJldHVybiBzbyBpdCBpcyBzYWZlIHRvIHBhc3MgdGhpeiBkaXJlY3RseQorICAgIHVzYl9ob3N0X3J1bihjb250ZXh0LCB1c2JfZGV2aWNlX2FkZGVkLCB1c2JfZGV2aWNlX3JlbW92ZWQsIE5VTEwsICh2b2lkICopdGhpeik7Cit9CisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgbWV0aG9kX3RhYmxlW10gPSB7CisgICAgeyAibW9uaXRvclVzYkhvc3RCdXMiLCAiKClWIiwgKHZvaWQqKWFuZHJvaWRfc2VydmVyX1VzYk9ic2VydmVyX21vbml0b3JVc2JIb3N0QnVzIH0KK307CisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlcihKTklFbnYgKmVudikKK3sKKyAgICBqY2xhc3MgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiY29tL2FuZHJvaWQvc2VydmVyL1VzYk9ic2VydmVyIik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBjb20vYW5kcm9pZC9zZXJ2ZXIvVXNiT2JzZXJ2ZXIiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfdXNiQ2FtZXJhQWRkZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAidXNiQ2FtZXJhQWRkZWQiLCAiKEkpViIpOworICAgIGlmIChtZXRob2RfdXNiQ2FtZXJhQWRkZWQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIHVzYkNhbWVyYUFkZGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX3VzYkNhbWVyYVJlbW92ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAidXNiQ2FtZXJhUmVtb3ZlZCIsICIoSSlWIik7CisgICAgaWYgKG1ldGhvZF91c2JDYW1lcmFSZW1vdmVkID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCB1c2JDYW1lcmFSZW1vdmVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gam5pUmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImNvbS9hbmRyb2lkL3NlcnZlci9Vc2JPYnNlcnZlciIsCisgICAgICAgICAgICBtZXRob2RfdGFibGUsIE5FTEVNKG1ldGhvZF90YWJsZSkpOworfQorCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyLmNwcCBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlci5jcHAKaW5kZXggNTlkN2NkZS4uOTMwNjhlNiAxMDA3NTUKLS0tIGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyLmNwcAorKysgYi9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIuY3BwCkBAIC0yNDUsOSArMjQ1LDkgQEAKICAgICAgICAgc0FHcHNJbnRlcmZhY2UtPmluaXQoJnNBR3BzQ2FsbGJhY2tzKTsKIAogICAgIGlmICghc0dwc05pSW50ZXJmYWNlKQotICAgICAgIHNHcHNOaUludGVyZmFjZSA9IChjb25zdCBHcHNOaUludGVyZmFjZSopc0dwc0ludGVyZmFjZS0+Z2V0X2V4dGVuc2lvbihHUFNfTklfSU5URVJGQUNFKTsKKyAgICAgICAgc0dwc05pSW50ZXJmYWNlID0gKGNvbnN0IEdwc05pSW50ZXJmYWNlKilzR3BzSW50ZXJmYWNlLT5nZXRfZXh0ZW5zaW9uKEdQU19OSV9JTlRFUkZBQ0UpOwogICAgIGlmIChzR3BzTmlJbnRlcmZhY2UpCi0gICAgICAgc0dwc05pSW50ZXJmYWNlLT5pbml0KCZzR3BzTmlDYWxsYmFja3MpOworICAgICAgICBzR3BzTmlJbnRlcmZhY2UtPmluaXQoJnNHcHNOaUNhbGxiYWNrcyk7CiAKICAgICBpZiAoIXNHcHNEZWJ1Z0ludGVyZmFjZSkKICAgICAgICBzR3BzRGVidWdJbnRlcmZhY2UgPSAoY29uc3QgR3BzRGVidWdJbnRlcmZhY2UqKXNHcHNJbnRlcmZhY2UtPmdldF9leHRlbnNpb24oR1BTX0RFQlVHX0lOVEVSRkFDRSk7CkBAIC00MTMsMTIgKzQxMywxMCBAQAogc3RhdGljIHZvaWQgYW5kcm9pZF9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyX3NlbmRfbmlfcmVzcG9uc2UoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqLAogICAgICAgamludCBub3RpZklkLCBqaW50IHJlc3BvbnNlKQogewotICAgIGlmICghc0dwc05pSW50ZXJmYWNlKSB7CisgICAgaWYgKCFzR3BzTmlJbnRlcmZhY2UpCiAgICAgICAgIHNHcHNOaUludGVyZmFjZSA9IChjb25zdCBHcHNOaUludGVyZmFjZSopc0dwc0ludGVyZmFjZS0+Z2V0X2V4dGVuc2lvbihHUFNfTklfSU5URVJGQUNFKTsKLSAgICB9Ci0gICAgaWYgKHNHcHNOaUludGVyZmFjZSkgeworICAgIGlmIChzR3BzTmlJbnRlcmZhY2UpCiAgICAgICAgIHNHcHNOaUludGVyZmFjZS0+cmVzcG9uZChub3RpZklkLCByZXNwb25zZSk7Ci0gICAgfQogfQogCiBzdGF0aWMganN0cmluZyBhbmRyb2lkX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXJfZ2V0X2ludGVybmFsX3N0YXRlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaikKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2puaS9vbmxvYWQuY3BwIGIvc2VydmljZXMvam5pL29ubG9hZC5jcHAKaW5kZXggY2Q0ZjBhNC4uMzUwMmFjYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvam5pL29ubG9hZC5jcHAKKysrIGIvc2VydmljZXMvam5pL29ubG9hZC5jcHAKQEAgLTksNiArOSw3IEBACiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9MaWdodHNTZXJ2aWNlKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlKEpOSUVudiogZW52KTsKK2ludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlcihKTklFbnYqIGVudik7CiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfVmlicmF0b3JTZXJ2aWNlKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9TeXN0ZW1TZXJ2ZXIoSk5JRW52KiBlbnYpOwogaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIoSk5JRW52KiBlbnYpOwpAQCAtMzIsNiArMzMsNyBAQAogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0xpZ2h0c1NlcnZpY2UoZW52KTsKICAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9BbGFybU1hbmFnZXJTZXJ2aWNlKGVudik7CiAgICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQmF0dGVyeVNlcnZpY2UoZW52KTsKKyAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlcihlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1ZpYnJhdG9yU2VydmljZShlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1N5c3RlbVNlcnZlcihlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIoZW52KTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9BbmRyb2lkLm1rCmluZGV4IGExNGJmYjUuLmU0ODI1ZDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvQW5kcm9pZC5tawpAQCAtNSw2ICs1LDcgQEAKICAgICBjbHouY3BwLmFybSBcCiAgICAgRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5jcHAgXAogICAgIERpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmVCYXNlLmNwcCBcCisgICAgRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuY3BwIFwKICAgICBCbHVyRmlsdGVyLmNwcC5hcm0gXAogICAgIEdMRXh0ZW5zaW9ucy5jcHAgXAogICAgIExheWVyLmNwcCBcCkBAIC0yMSw3ICsyMiw3IEBACiBMT0NBTF9DRkxBR1MgKz0gLURHTF9HTEVYVF9QUk9UT1RZUEVTIC1ERUdMX0VHTEVYVF9QUk9UT1RZUEVTCiAKIGlmZXEgKCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSwgb21hcDMpCi0JTE9DQUxfQ0ZMQUdTICs9IC1ETk9fUkdCWF84ODg4CisJTE9DQUxfQ0ZMQUdTICs9IC1ETk9fUkdCWF84ODg4IC1ESEFTX1BVU0hfQlVGRkVSUwogZW5kaWYKIAogIyBuZWVkICItbHJ0IiBvbiBMaW51eCBzaW11bGF0b3IgdG8gcGljayB1cCBjbG9ja19nZXR0aW1lCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwCmluZGV4IDJlYWMwYTguLjE2NmM1MjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwCkBAIC0zNiwxMSArMzYsMTEgQEAKIAogI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCIKIAotI2luY2x1ZGUgPGhhcmR3YXJlL2NvcHliaXQuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9vdmVybGF5Lmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgogCiAjaW5jbHVkZSAiR0xFeHRlbnNpb25zLmgiCisjaW5jbHVkZSAiSFdDb21wb3Nlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtNzYsNyArNzYsNyBAQAogICAgICAgICBjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIsCiAgICAgICAgIHVpbnQzMl90IGRweSkKICAgICA6IERpc3BsYXlIYXJkd2FyZUJhc2UoZmxpbmdlciwgZHB5KSwKLSAgICAgIG1GbGFncygwKQorICAgICAgbUZsYWdzKDApLCBtSHdjKDApCiB7CiAgICAgaW5pdChkcHkpOwogfQpAQCAtMjYyLDYgKzI2MiwxNyBAQAogCiAgICAgLy8gVW5iaW5kIHRoZSBjb250ZXh0IGZyb20gdGhpcyB0aHJlYWQKICAgICBlZ2xNYWtlQ3VycmVudChkaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKTsKKworCisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgSC9XIGNvbXBvc2VyCisgICAgbUh3YyA9IG5ldyBIV0NvbXBvc2VyKCk7CisgICAgaWYgKG1Id2MtPmluaXRDaGVjaygpID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1Id2MtPnNldEZyYW1lQnVmZmVyKG1EaXNwbGF5LCBtU3VyZmFjZSk7CisgICAgfQorfQorCitIV0NvbXBvc2VyJiBEaXNwbGF5SGFyZHdhcmU6OmdldEh3Q29tcG9zZXIoKSBjb25zdCB7CisgICAgcmV0dXJuICptSHdjOwogfQogCiAvKgpAQCAtMzE3LDcgKzMyOCwxMiBAQAogICAgIH0KICAgICAKICAgICBtUGFnZUZsaXBDb3VudCsrOwotICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisKKyAgICBpZiAobUh3Yy0+aW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbUh3Yy0+Y29tbWl0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICB9CiAgICAgY2hlY2tFR0xFcnJvcnMoImVnbFN3YXBCdWZmZXJzIik7CiAKICAgICAvLyBmb3IgZGVidWdnaW5nCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgKaW5kZXggNjZiZjUyMS4uZjJjZmQyZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5oCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaApAQCAtMzQsMTIgKzM0LDExIEBACiAjaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZUJhc2UuaCIKIAogc3RydWN0IG92ZXJsYXlfY29udHJvbF9kZXZpY2VfdDsKLXN0cnVjdCBmcmFtZWJ1ZmZlcl9kZXZpY2VfdDsKLXN0cnVjdCBjb3B5Yml0X2ltYWdlX3Q7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgRnJhbWVidWZmZXJOYXRpdmVXaW5kb3c7CitjbGFzcyBIV0NvbXBvc2VyOwogCiBjbGFzcyBEaXNwbGF5SGFyZHdhcmUgOiBwdWJsaWMgRGlzcGxheUhhcmR3YXJlQmFzZQogewpAQCAtODAsNiArNzksOSBAQAogICAgIHVpbnQzMl90IGdldFBhZ2VGbGlwQ291bnQoKSBjb25zdDsKICAgICBFR0xEaXNwbGF5IGdldEVHTERpc3BsYXkoKSBjb25zdCB7IHJldHVybiBtRGlzcGxheTsgfQogICAgIG92ZXJsYXlfY29udHJvbF9kZXZpY2VfdCogZ2V0T3ZlcmxheUVuZ2luZSgpIGNvbnN0IHsgcmV0dXJuIG1PdmVybGF5RW5naW5lOyB9CisKKyAgICAvLyBIYXJkd2FyZSBDb21wb3NlcgorICAgIEhXQ29tcG9zZXImIGdldEh3Q29tcG9zZXIoKSBjb25zdDsKICAgICAKICAgICBzdGF0dXNfdCBjb21wb3NpdGlvbkNvbXBsZXRlKCkgY29uc3Q7CiAgICAgCkBAIC0xMDcsNiArMTA5LDggQEAKICAgICBHTGludCAgICAgICAgICAgbU1heFZpZXdwb3J0RGltczsKICAgICBHTGludCAgICAgICAgICAgbU1heFRleHR1cmVTaXplOwogICAgIAorICAgIEhXQ29tcG9zZXIqICAgICBtSHdjOworCiAgICAgc3A8RnJhbWVidWZmZXJOYXRpdmVXaW5kb3c+IG1OYXRpdmVXaW5kb3c7CiAgICAgb3ZlcmxheV9jb250cm9sX2RldmljZV90KiBtT3ZlcmxheUVuZ2luZTsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5MWQ3OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmNwcApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisKKyNpbmNsdWRlICJIV0NvbXBvc2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitIV0NvbXBvc2VyOjpIV0NvbXBvc2VyKCkKKyAgICA6IG1Nb2R1bGUoMCksIG1Id2MoMCksIG1MaXN0KDApLCBtQ2FwYWNpdHkoMCksCisgICAgICBtRHB5KEVHTF9OT19ESVNQTEFZKSwgbVN1cihFR0xfTk9fU1VSRkFDRSkKK3sKKyAgICBpbnQgZXJyID0gaHdfZ2V0X21vZHVsZShIV0NfSEFSRFdBUkVfTU9EVUxFX0lELCAmbU1vZHVsZSk7CisgICAgTE9HV19JRihlcnIsICIlcyBtb2R1bGUgbm90IGZvdW5kIiwgSFdDX0hBUkRXQVJFX01PRFVMRV9JRCk7CisgICAgaWYgKGVyciA9PSAwKSB7CisgICAgICAgIGVyciA9IGh3Y19vcGVuKG1Nb2R1bGUsICZtSHdjKTsKKyAgICAgICAgTE9HRV9JRihlcnIsICIlcyBkZXZpY2UgZmFpbGVkIHRvIGluaXRpYWxpemUgKCVzKSIsCisgICAgICAgICAgICAgICAgSFdDX0hBUkRXQVJFX0NPTVBPU0VSLCBzdHJlcnJvcigtZXJyKSk7CisgICAgfQorfQorCitIV0NvbXBvc2VyOjp+SFdDb21wb3NlcigpIHsKKyAgICBmcmVlKG1MaXN0KTsKKyAgICBpZiAobUh3YykgeworICAgICAgICBod2NfY2xvc2UobUh3Yyk7CisgICAgfQorfQorCitzdGF0dXNfdCBIV0NvbXBvc2VyOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Id2MgPyBOT19FUlJPUiA6IE5PX0lOSVQ7Cit9CisKK3ZvaWQgSFdDb21wb3Nlcjo6c2V0RnJhbWVCdWZmZXIoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyKSB7CisgICAgbURweSA9IChod2NfZGlzcGxheV90KWRweTsKKyAgICBtU3VyID0gKGh3Y19zdXJmYWNlX3Qpc3VyOworfQorCitzdGF0dXNfdCBIV0NvbXBvc2VyOjpjcmVhdGVXb3JrTGlzdChzaXplX3QgbnVtTGF5ZXJzKSB7CisgICAgaWYgKG1Id2MpIHsKKyAgICAgICAgaWYgKCFtTGlzdCB8fCBtQ2FwYWNpdHkgPCBudW1MYXllcnMpIHsKKyAgICAgICAgICAgIGZyZWUobUxpc3QpOworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBzaXplb2YoaHdjX2xheWVyX2xpc3QpICsgbnVtTGF5ZXJzKnNpemVvZihod2NfbGF5ZXJfdCk7CisgICAgICAgICAgICBtTGlzdCA9IChod2NfbGF5ZXJfbGlzdF90KiltYWxsb2Moc2l6ZSk7CisgICAgICAgICAgICBtQ2FwYWNpdHkgPSBudW1MYXllcnM7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3QtPmZsYWdzID0gSFdDX0dFT01FVFJZX0NIQU5HRUQ7CisgICAgICAgIG1MaXN0LT5udW1Id0xheWVycyA9IG51bUxheWVyczsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBIV0NvbXBvc2VyOjpwcmVwYXJlKCkgY29uc3QgeworICAgIGludCBlcnIgPSBtSHdjLT5wcmVwYXJlKG1Id2MsIG1MaXN0KTsKKyAgICByZXR1cm4gKHN0YXR1c190KWVycjsKK30KKworc3RhdHVzX3QgSFdDb21wb3Nlcjo6Y29tbWl0KCkgY29uc3QgeworICAgIGludCBlcnIgPSBtSHdjLT5zZXQobUh3YywgbURweSwgbVN1ciwgbUxpc3QpOworICAgIG1MaXN0LT5mbGFncyAmPSB+SFdDX0dFT01FVFJZX0NIQU5HRUQ7CisgICAgcmV0dXJuIChzdGF0dXNfdCllcnI7Cit9CisKK3NpemVfdCBIV0NvbXBvc2VyOjpnZXROdW1MYXllcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1MaXN0ID8gbUxpc3QtPm51bUh3TGF5ZXJzIDogMDsKK30KKworaHdjX2xheWVyX3QqIEhXQ29tcG9zZXI6OmdldExheWVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUxpc3QgPyBtTGlzdC0+aHdMYXllcnMgOiAwOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWQ1YzJiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NGX0hXQ09NUE9TRVJfSAorI2RlZmluZSBBTkRST0lEX1NGX0hXQ09NUE9TRVJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9od2NvbXBvc2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBIV0NvbXBvc2VyCit7CitwdWJsaWM6CisKKyAgICBIV0NvbXBvc2VyKCk7CisgICAgfkhXQ29tcG9zZXIoKTsKKworICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgLy8gdGVsbHMgdGhlIEhBTCB3aGF0IHRoZSBmcmFtZWJ1ZmZlciBpcworICAgIHZvaWQgc2V0RnJhbWVCdWZmZXIoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyKTsKKworICAgIC8vIGNyZWF0ZSBhIHdvcmsgbGlzdCBmb3IgbnVtTGF5ZXJzIGxheWVyCisgICAgc3RhdHVzX3QgY3JlYXRlV29ya0xpc3Qoc2l6ZV90IG51bUxheWVycyk7CisKKyAgICAvLyBBc2tzIHRoZSBIQUwgd2hhdCBpdCBjYW4gZG8KKyAgICBzdGF0dXNfdCBwcmVwYXJlKCkgY29uc3Q7CisKKyAgICAvLyBjb21taXRzIHRoZSBsaXN0CisgICAgc3RhdHVzX3QgY29tbWl0KCkgY29uc3Q7CisKKworICAgIHNpemVfdCBnZXROdW1MYXllcnMoKSBjb25zdDsKKyAgICBod2NfbGF5ZXJfdCogZ2V0TGF5ZXJzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgaHdfbW9kdWxlX3QgY29uc3QqICAgICAgbU1vZHVsZTsKKyAgICBod2NfY29tcG9zZXJfZGV2aWNlX3QqICBtSHdjOworICAgIGh3Y19sYXllcl9saXN0X3QqICAgICAgIG1MaXN0OworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1DYXBhY2l0eTsKKyAgICBod2NfZGlzcGxheV90ICAgICAgICAgICBtRHB5OworICAgIGh3Y19zdXJmYWNlX3QgICAgICAgICAgIG1TdXI7Cit9OworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0ZfSFdDT01QT1NFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5jcHAKaW5kZXggNjk1Y2JmYS4uMTk0YzI5NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuY3BwCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmNwcApAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgIkxheWVyLmgiCiAjaW5jbHVkZSAiU3VyZmFjZUZsaW5nZXIuaCIKICNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgiCisjaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuaCIKIAogCiAjZGVmaW5lIERFQlVHX1JFU0laRSAgICAwCkBAIC0xODEsNiArMTgyLDYyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCit2b2lkIExheWVyOjpzZXRHZW9tZXRyeShod2NfbGF5ZXJfdCogaHdjbCkKK3sKKyAgICBod2NsLT5jb21wb3NpdGlvblR5cGUgPSBIV0NfRlJBTUVCVUZGRVI7CisgICAgaHdjbC0+aGludHMgPSAwOworICAgIGh3Y2wtPmZsYWdzID0gMDsKKyAgICBod2NsLT50cmFuc2Zvcm0gPSAwOworICAgIGh3Y2wtPmJsZW5kaW5nID0gSFdDX0JMRU5ESU5HX05PTkU7CisKKyAgICAvLyB3ZSBjYW4ndCBkbyBhbHBoYS1mYWRlIHdpdGggdGhlIGh3YyBIQUwKKyAgICBjb25zdCBTdGF0ZSYgcyhkcmF3aW5nU3RhdGUoKSk7CisgICAgaWYgKHMuYWxwaGEgPCAweEZGKSB7CisgICAgICAgIGh3Y2wtPmZsYWdzID0gSFdDX1NLSVBfTEFZRVI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyB3ZSBjYW4gb25seSBoYW5kbGUgc2ltcGxlIHRyYW5zZm9ybWF0aW9uCisgICAgaWYgKG1PcmllbnRhdGlvbiAmIFRyYW5zZm9ybTo6Uk9UX0lOVkFMSUQpIHsKKyAgICAgICAgaHdjbC0+ZmxhZ3MgPSBIV0NfU0tJUF9MQVlFUjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGh3Y2wtPnRyYW5zZm9ybSA9IG1PcmllbnRhdGlvbjsKKworICAgIGlmIChuZWVkc0JsZW5kaW5nKCkpIHsKKyAgICAgICAgaHdjbC0+YmxlbmRpbmcgPSBtUHJlbXVsdGlwbGllZEFscGhhID8KKyAgICAgICAgICAgICAgICBIV0NfQkxFTkRJTkdfUFJFTVVMVCA6IEhXQ19CTEVORElOR19DT1ZFUkFHRTsKKyAgICB9CisKKyAgICBod2NsLT5kaXNwbGF5RnJhbWUubGVmdCAgID0gbVRyYW5zZm9ybWVkQm91bmRzLmxlZnQ7CisgICAgaHdjbC0+ZGlzcGxheUZyYW1lLnRvcCAgICA9IG1UcmFuc2Zvcm1lZEJvdW5kcy50b3A7CisgICAgaHdjbC0+ZGlzcGxheUZyYW1lLnJpZ2h0ICA9IG1UcmFuc2Zvcm1lZEJvdW5kcy5yaWdodDsKKyAgICBod2NsLT5kaXNwbGF5RnJhbWUuYm90dG9tID0gbVRyYW5zZm9ybWVkQm91bmRzLmJvdHRvbTsKKworICAgIGh3Y2wtPnZpc2libGVSZWdpb25TY3JlZW4ucmVjdHMgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxod2NfcmVjdF90IGNvbnN0ICo+KAorICAgICAgICAgICAgICAgICAgICB2aXNpYmxlUmVnaW9uU2NyZWVuLmdldEFycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZod2NsLT52aXNpYmxlUmVnaW9uU2NyZWVuLm51bVJlY3RzKSk7Cit9CisKK3ZvaWQgTGF5ZXI6OnNldFBlckZyYW1lRGF0YShod2NfbGF5ZXJfdCogaHdjbCkgeworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcihtQnVmZmVyTWFuYWdlci5nZXRBY3RpdmVCdWZmZXIoKSk7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIC8vIHRoaXMgc2l0dWF0aW9uIGNhbiBoYXBwZW4gaWYgd2UgcmFuIG91dCBvZiBtZW1vcnkgZm9yIGluc3RhbmNlLgorICAgICAgICAvLyBub3QgbXVjaCB3ZSBjYW4gZG8uIGNvbnRpbnVlIHRvIHVzZSB3aGF0ZXZlciB0ZXh0dXJlIHdhcyBib3VuZAorICAgICAgICAvLyB0byB0aGlzIGNvbnRleHQuCisgICAgICAgIGh3Y2wtPmhhbmRsZSA9IE5VTEw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaHdjbC0+aGFuZGxlID0gY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPihidWZmZXItPmhhbmRsZSk7CisgICAgLy8gVE9ETzogc2V0IHRoZSBjcm9wIHZhbHVlIHByb3Blcmx5CisgICAgaHdjbC0+c291cmNlQ3JvcC5sZWZ0ICAgPSAwOworICAgIGh3Y2wtPnNvdXJjZUNyb3AudG9wICAgID0gMDsKKyAgICBod2NsLT5zb3VyY2VDcm9wLnJpZ2h0ICA9IGJ1ZmZlci0+d2lkdGg7CisgICAgaHdjbC0+c291cmNlQ3JvcC5ib3R0b20gPSBidWZmZXItPmhlaWdodDsKK30KKwogdm9pZCBMYXllcjo6cmVsb2FkVGV4dHVyZShjb25zdCBSZWdpb24mIGRpcnR5KQogewogICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcihtQnVmZmVyTWFuYWdlci5nZXRBY3RpdmVCdWZmZXIoKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuaAppbmRleCBlMWQyODNiLi4xODhkYTZhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5oCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmgKQEAgLTY4LDYgKzY4LDggQEAKICAgICBib29sIGlzRml4ZWRTaXplKCkgY29uc3Q7CiAKICAgICAvLyBMYXllckJhc2UgaW50ZXJmYWNlCisgICAgdmlydHVhbCB2b2lkIHNldEdlb21ldHJ5KGh3Y19sYXllcl90KiBod2NsKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGVyRnJhbWVEYXRhKGh3Y19sYXllcl90KiBod2NsKTsKICAgICB2aXJ0dWFsIHZvaWQgb25EcmF3KGNvbnN0IFJlZ2lvbiYgY2xpcCkgY29uc3Q7CiAgICAgdmlydHVhbCB1aW50MzJfdCBkb1RyYW5zYWN0aW9uKHVpbnQzMl90IHRyYW5zYWN0aW9uRmxhZ3MpOwogICAgIHZpcnR1YWwgdm9pZCBsb2NrUGFnZUZsaXAoYm9vbCYgcmVjb21wdXRlVmlzaWJsZVJlZ2lvbnMpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5jcHAKaW5kZXggNmZjNTAxMC4uM2QwNDlhNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuY3BwCkBAIC0zMDksNiArMzA5LDE1IEBACiAgICAgfQogfQogCit2b2lkIExheWVyQmFzZTo6c2V0R2VvbWV0cnkoaHdjX2xheWVyX3QqIGh3Y2wpIHsKKyAgICBod2NsLT5mbGFncyB8PSBIV0NfU0tJUF9MQVlFUjsKK30KKwordm9pZCBMYXllckJhc2U6OnNldFBlckZyYW1lRGF0YShod2NfbGF5ZXJfdCogaHdjbCkgeworICAgIGh3Y2wtPmNvbXBvc2l0aW9uVHlwZSA9IEhXQ19GUkFNRUJVRkZFUjsKKyAgICBod2NsLT5oYW5kbGUgPSBOVUxMOworfQorCiB2b2lkIExheWVyQmFzZTo6ZHJhdyhjb25zdCBSZWdpb24mIGNsaXApIGNvbnN0CiB7CiAgICAgLy8gcmVzZXQgR0wgc3RhdGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmgKaW5kZXggOGNiYTI4Ny4uYzY2ZGMzNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmgKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmgKQEAgLTM1LDYgKzM1LDggQEAKIAogI2luY2x1ZGUgPHBpeGVsZmxpbmdlci9waXhlbGZsaW5nZXIuaD4KIAorI2luY2x1ZGUgPGhhcmR3YXJlL2h3Y29tcG9zZXIuaD4KKwogI2luY2x1ZGUgIlRyYW5zZm9ybS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0xMDgsNiArMTEwLDEwIEBACiAKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGdldFR5cGVJZCgpIGNvbnN0IHsgcmV0dXJuICJMYXllckJhc2UiOyB9CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0R2VvbWV0cnkoaHdjX2xheWVyX3QqIGh3Y2wpOworCisgICAgdmlydHVhbCB2b2lkIHNldFBlckZyYW1lRGF0YShod2NfbGF5ZXJfdCogaHdjbCk7CisKICAgICAvKioKICAgICAgKiBkcmF3IC0gcGVyZm9ybXMgc29tZSBnbG9iYWwgY2xpcHBpbmcgb3B0aW1pemF0aW9ucwogICAgICAqIGFuZCBjYWxscyBvbkRyYXcoKS4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmNwcAppbmRleCA2MzdhZTQ4Li5hNzhkOWI5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5jcHAKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuY3BwCkBAIC01Miw2ICs1Miw3IEBACiAjaW5jbHVkZSAiU3VyZmFjZUZsaW5nZXIuaCIKIAogI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCIKKyNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5oIgogCiAvKiBpZGVhbGx5IEFJRF9HUkFQSElDUyB3b3VsZCBiZSBpbiBhIHNlbWktcHVibGljIGhlYWRlcgogICogb3IgdGhlcmUgd291bGQgYmUgYSB3YXkgdG8gbWFwIGEgdXNlci9ncm91cCBuYW1lIHRvIGl0cyBpZApAQCAtNzYsNiArNzcsNyBAQAogICAgICAgICBtQWNjZXNzU3VyZmFjZUZsaW5nZXIoImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfU1VSRkFDRV9GTElOR0VSIiksCiAgICAgICAgIG1EdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpLAogICAgICAgICBtVmlzaWJsZVJlZ2lvbnNEaXJ0eShmYWxzZSksCisgICAgICAgIG1Id1dvcmtMaXN0RGlydHkoZmFsc2UpLAogICAgICAgICBtRGVmZXJSZWxlYXNlQ29uc29sZShmYWxzZSksCiAgICAgICAgIG1GcmVlemVEaXNwbGF5KGZhbHNlKSwKICAgICAgICAgbUZyZWV6ZUNvdW50KDApLApAQCAtMTYzLDcgKzE2NSw3IEBACiB7CiAgICAgY29uc3QgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7CiAgICAgY29uc3QgbnNlY3NfdCBkdXJhdGlvbiA9IG5vdyAtIG1Cb290VGltZTsKLSAgICBMT0dJKCJCb290IGlzIGZpbmlzaGVkICglbGQgbXMpIiwgbG9uZyhuczJtcyhkdXJhdGlvbikpICk7ICAKKyAgICBMT0dJKCJCb290IGlzIGZpbmlzaGVkICglbGQgbXMpIiwgbG9uZyhuczJtcyhkdXJhdGlvbikpICk7CiAgICAgbUJvb3RGaW5pc2hlZCA9IHRydWU7CiAgICAgcHJvcGVydHlfc2V0KCJjdGwuc3RvcCIsICJib290YW5pbSIpOwogfQpAQCAtMTk5LDEwICsyMDEsMTAgQEAKICAgICBtU2VydmVySGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZSg0MDk2LAogICAgICAgICAgICAgTWVtb3J5SGVhcEJhc2U6OlJFQURfT05MWSwgIlN1cmZhY2VGbGluZ2VyIHJlYWQtb25seSBoZWFwIik7CiAgICAgTE9HRV9JRihtU2VydmVySGVhcD09MCwgImNhbid0IGNyZWF0ZSBzaGFyZWQgbWVtb3J5IGRlYWxlciIpOwotICAgIAorCiAgICAgbVNlcnZlckNibGsgPSBzdGF0aWNfY2FzdDxzdXJmYWNlX2ZsaW5nZXJfY2Jsa190Kj4obVNlcnZlckhlYXAtPmdldEJhc2UoKSk7CiAgICAgTE9HRV9JRihtU2VydmVyQ2Jsaz09MCwgImNhbid0IGdldCB0byBzaGFyZWQgY29udHJvbCBibG9jaydzIGFkZHJlc3MiKTsKLSAgICAKKwogICAgIG5ldyhtU2VydmVyQ2Jsaykgc3VyZmFjZV9mbGluZ2VyX2NibGtfdDsKIAogICAgIC8vIGluaXRpYWxpemUgcHJpbWFyeSBzY3JlZW4KQEAgLTIzMSw3ICsyMzMsNyBAQAogCiAgICAgLy8gSW5pdGlhbGl6ZSBPcGVuR0x8RVMKICAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDQpOwotICAgIGdsUGl4ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQsIDQpOyAKKyAgICBnbFBpeGVsU3RvcmVpKEdMX1BBQ0tfQUxJR05NRU5ULCA0KTsKICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7CiAgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKICAgICBnbFNoYWRlTW9kZWwoR0xfRkxBVCk7CkBAIC0yNjUsNyArMjY3LDcgQEAKIAogICAgIC8vIHN0YXJ0IGJvb3QgYW5pbWF0aW9uCiAgICAgcHJvcGVydHlfc2V0KCJjdGwuc3RhcnQiLCAiYm9vdGFuaW0iKTsKLSAgICAKKwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMzY4LDYgKzM3MCwxMSBAQAogICAgIC8vIHBvc3Qgc3VyZmFjZXMgKGlmIG5lZWRlZCkKICAgICBoYW5kbGVQYWdlRmxpcCgpOwogCisgICAgaWYgKFVOTElLRUxZKG1Id1dvcmtMaXN0RGlydHkpKSB7CisgICAgICAgIC8vIGJ1aWxkIHRoZSBoL3cgd29yayBsaXN0CisgICAgICAgIGhhbmRsZVdvcmtMaXN0KCk7CisgICAgfQorCiAgICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkpOwogICAgIGlmIChMSUtFTFkoaHcuY2FuRHJhdygpICYmICFpc0Zyb3plbigpKSkgewogICAgICAgICAvLyByZXBhaW50IHRoZSBmcmFtZWJ1ZmZlciAoaWYgbmVlZGVkKQpAQCAtNDQzLDYgKzQ1MCw3IEBACiAgICAgICAgIGhhbmRsZVRyYW5zYWN0aW9uTG9ja2VkKHRyYW5zYWN0aW9uRmxhZ3MsIGRpdGNoZWRMYXllcnMpOwogICAgICAgICBtTGFzdFRyYW5zYWN0aW9uVGltZSA9IHN5c3RlbVRpbWUoKSAtIG5vdzsKICAgICAgICAgbURlYnVnSW5UcmFuc2FjdGlvbiA9IDA7CisgICAgICAgIG1Id1dvcmtMaXN0RGlydHkgPSB0cnVlOwogICAgICAgICAvLyBoZXJlIHRoZSB0cmFuc2FjdGlvbiBoYXMgYmVlbiBjb21taXR0ZWQKICAgICB9CiAKQEAgLTQ1MCw2ICs0NTgsNyBAQAogICAgICAqIENsZWFuLXVwIGFsbCBsYXllcnMgdGhhdCB3ZW50IGF3YXkKICAgICAgKiAoZG8gdGhpcyB3aXRob3V0IHRoZSBsb2NrIGhlbGQpCiAgICAgICovCisKICAgICBjb25zdCBzaXplX3QgY291bnQgPSBkaXRjaGVkTGF5ZXJzLnNpemUoKTsKICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7CiAgICAgICAgIGlmIChkaXRjaGVkTGF5ZXJzW2ldICE9IDApIHsKQEAgLTY1Myw3ICs2NjIsNyBAQAogCiAgICAgICAgIC8vIFVwZGF0ZSBhYm92ZU9wYXF1ZUxheWVycyBmb3IgbmV4dCAobG93ZXIpIGxheWVyCiAgICAgICAgIGFib3ZlT3BhcXVlTGF5ZXJzLm9yU2VsZihvcGFxdWVSZWdpb24pOwotICAgICAgICAKKwogICAgICAgICAvLyBTdG9yZSB0aGUgdmlzaWJsZSByZWdpb24gaXMgc2NyZWVuIHNwYWNlCiAgICAgICAgIGxheWVyLT5zZXRWaXNpYmxlUmVnaW9uKHZpc2libGVSZWdpb24pOwogICAgICAgICBsYXllci0+c2V0Q292ZXJlZFJlZ2lvbihjb3ZlcmVkUmVnaW9uKTsKQEAgLTY4Myw4ICs2OTIsOCBAQAogdm9pZCBTdXJmYWNlRmxpbmdlcjo6aGFuZGxlUGFnZUZsaXAoKQogewogICAgIGJvb2wgdmlzaWJsZVJlZ2lvbnMgPSBtVmlzaWJsZVJlZ2lvbnNEaXJ0eTsKLSAgICBMYXllclZlY3RvciYgY3VycmVudExheWVycyA9IGNvbnN0X2Nhc3Q8TGF5ZXJWZWN0b3ImPigKLSAgICAgICAgICAgIG1EcmF3aW5nU3RhdGUubGF5ZXJzU29ydGVkQnlaKTsKKyAgICBMYXllclZlY3RvciYgY3VycmVudExheWVycygKKyAgICAgICAgICAgIGNvbnN0X2Nhc3Q8TGF5ZXJWZWN0b3ImPihtRHJhd2luZ1N0YXRlLmxheWVyc1NvcnRlZEJ5WikpOwogICAgIHZpc2libGVSZWdpb25zIHw9IGxvY2tQYWdlRmxpcChjdXJyZW50TGF5ZXJzKTsKIAogICAgICAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3ID0gZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpOwpAQCAtNzA3LDYgKzcxNiw3IEBACiAKICAgICAgICAgICAgIG1Xb3JtaG9sZVJlZ2lvbiA9IHNjcmVlblJlZ2lvbi5zdWJ0cmFjdChvcGFxdWVSZWdpb24pOwogICAgICAgICAgICAgbVZpc2libGVSZWdpb25zRGlydHkgPSBmYWxzZTsKKyAgICAgICAgICAgIG1Id1dvcmtMaXN0RGlydHkgPSB0cnVlOwogICAgICAgICB9CiAKICAgICB1bmxvY2tQYWdlRmxpcChjdXJyZW50TGF5ZXJzKTsKQEAgLTczNyw2ICs3NDcsMjAgQEAKICAgICB9CiB9CiAKK3ZvaWQgU3VyZmFjZUZsaW5nZXI6OmhhbmRsZVdvcmtMaXN0KCkKK3sKKyAgICBtSHdXb3JrTGlzdERpcnR5ID0gZmFsc2U7CisgICAgSFdDb21wb3NlciYgaHdjKGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKS5nZXRId0NvbXBvc2VyKCkpOworICAgIGlmIChod2MuaW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgY29uc3QgVmVjdG9yPCBzcDxMYXllckJhc2U+ID4mIGN1cnJlbnRMYXllcnMobVZpc2libGVMYXllcnNTb3J0ZWRCeVopOworICAgICAgICBjb25zdCBzaXplX3QgY291bnQgPSBjdXJyZW50TGF5ZXJzLnNpemUoKTsKKyAgICAgICAgaHdjLmNyZWF0ZVdvcmtMaXN0KGNvdW50KTsKKyAgICAgICAgaHdjX2xheWVyX3QqIGNvbnN0IGN1cihod2MuZ2V0TGF5ZXJzKCkpOworICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBjdXIgJiYgaTxjb3VudCA7IGkrKykgeworICAgICAgICAgICAgY3VycmVudExheWVyc1tpXS0+c2V0R2VvbWV0cnkoJmN1cltpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CiAKIHZvaWQgU3VyZmFjZUZsaW5nZXI6OmhhbmRsZVJlcGFpbnQoKQogewpAQCAtNzU3LDggKzc4MSw4IEBACiAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKIAogICAgIHVpbnQzMl90IGZsYWdzID0gaHcuZ2V0RmxhZ3MoKTsKLSAgICBpZiAoKGZsYWdzICYgRGlzcGxheUhhcmR3YXJlOjpTV0FQX1JFQ1RBTkdMRSkgfHwgCi0gICAgICAgIChmbGFncyAmIERpc3BsYXlIYXJkd2FyZTo6QlVGRkVSX1BSRVNFUlZFRCkpIAorICAgIGlmICgoZmxhZ3MgJiBEaXNwbGF5SGFyZHdhcmU6OlNXQVBfUkVDVEFOR0xFKSB8fAorICAgICAgICAoZmxhZ3MgJiBEaXNwbGF5SGFyZHdhcmU6OkJVRkZFUl9QUkVTRVJWRUQpKQogICAgIHsKICAgICAgICAgLy8gd2UgY2FuIHJlZHJhdyBvbmx5IHdoYXQncyBkaXJ0eSwgYnV0IHNpbmNlIFNXQVBfUkVDVEFOR0xFIG9ubHkKICAgICAgICAgLy8gdGFrZXMgYSByZWN0YW5nbGUsIHdlIG11c3QgbWFrZSBzdXJlIHRvIHVwZGF0ZSB0aGF0IHdob2xlCkBAIC04MDEsOSArODI1LDcyIEBACiAgICAgICAgIC8vIGRyYXcgc29tZXRoaW5nLi4uCiAgICAgICAgIGRyYXdXb3JtaG9sZSgpOwogICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOwogICAgIGNvbnN0IFZlY3Rvcjwgc3A8TGF5ZXJCYXNlPiA+JiBsYXllcnMobVZpc2libGVMYXllcnNTb3J0ZWRCeVopOwotICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IGxheWVycy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7ICsraSkgeworICAgIHNpemVfdCBjb3VudCA9IGxheWVycy5zaXplKCk7CisKKyAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7CisgICAgSFdDb21wb3NlciYgaHdjKGh3LmdldEh3Q29tcG9zZXIoKSk7CisgICAgaHdjX2xheWVyX3QqIGNvbnN0IGN1cihod2MuZ2V0TGF5ZXJzKCkpOworCisgICAgTE9HRV9JRihjdXIgJiYgaHdjLmdldE51bUxheWVycygpICE9IGNvdW50LAorICAgICAgICAgICAgIkhBTCBudW1iZXIgb2YgbGF5ZXJzICglZCkgZG9lc24ndCBtYXRjaCBzdXJmYWNlZmxpbmdlciAoJWQpIiwKKyAgICAgICAgICAgIGh3Yy5nZXROdW1MYXllcnMoKSwgY291bnQpOworCisgICAgLy8ganVzdCB0byBiZSBleHRyYS1zYWZlLCB1c2UgdGhlIHNtYWxsZXN0IGNvdW50CisgICAgaWYgKGh3Yy5pbml0Q2hlY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICBjb3VudCA9IGNvdW50IDwgaHdjLmdldE51bUxheWVycygpID8gY291bnQgOiBod2MuZ2V0TnVtTGF5ZXJzKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgdXBkYXRlIHRoZSBwZXItZnJhbWUgaC93IGNvbXBvc2VyIGRhdGEgZm9yIGVhY2ggbGF5ZXIKKyAgICAgKiAgYW5kIGJ1aWxkIHRoZSB0cmFuc3BhcmVudCByZWdpb24gb2YgdGhlIEZCCisgICAgICovCisgICAgUmVnaW9uIHRyYW5zcGFyZW50OworICAgIGlmIChjdXIpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgeworICAgICAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIobGF5ZXJzW2ldKTsKKyAgICAgICAgICAgIGxheWVyLT5zZXRQZXJGcmFtZURhdGEoJmN1cltpXSk7CisgICAgICAgICAgICBpZiAoY3VyW2ldLmhpbnRzICYgSFdDX0hJTlRfQ0xFQVJfRkIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIShsYXllci0+bmVlZHNCbGVuZGluZygpKSkgeworICAgICAgICAgICAgICAgICAgICB0cmFuc3BhcmVudC5vclNlbGYobGF5ZXItPnZpc2libGVSZWdpb25TY3JlZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlcnIgPSBod2MucHJlcGFyZSgpOworICAgICAgICBMT0dFX0lGKGVyciwgIkhXQ29tcG9zZXI6OnByZXBhcmUgZmFpbGVkICglcykiLCBzdHJlcnJvcigtZXJyKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgY2xlYXIgdGhlIGFyZWEgb2YgdGhlIEZCIHRoYXQgbmVlZCB0byBiZSB0cmFuc3BhcmVudAorICAgICAqLworICAgIHRyYW5zcGFyZW50LmFuZFNlbGYoZGlydHkpOworICAgIGlmICghdHJhbnNwYXJlbnQuaXNFbXB0eSgpKSB7CisgICAgICAgIGdsQ2xlYXJDb2xvcigwLDAsMCwwKTsKKyAgICAgICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBpdCA9IHRyYW5zcGFyZW50LmJlZ2luKCk7CisgICAgICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgY29uc3QgZW5kID0gdHJhbnNwYXJlbnQuZW5kKCk7CisgICAgICAgIGNvbnN0IGludDMyX3QgaGVpZ2h0ID0gaHcuZ2V0SGVpZ2h0KCk7CisgICAgICAgIHdoaWxlIChpdCAhPSBlbmQpIHsKKyAgICAgICAgICAgIGNvbnN0IFJlY3QmIHIoKml0KyspOworICAgICAgICAgICAgY29uc3QgR0xpbnQgc3kgPSBoZWlnaHQgLSAoci50b3AgKyByLmhlaWdodCgpKTsKKyAgICAgICAgICAgIGdsU2Npc3NvcihyLmxlZnQsIHN5LCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOworICAgICAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBhbmQgdGhlbiwgcmVuZGVyIHRoZSBsYXllcnMgdGFyZ2V0ZWQgYXQgdGhlIGZyYW1lYnVmZmVyCisgICAgICovCisgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgeworICAgICAgICBpZiAoY3VyKSB7CisgICAgICAgICAgICBpZiAoIShjdXJbaV0uY29tcG9zaXRpb25UeXBlID09IEhXQ19GUkFNRUJVRkZFUikgfHwKKyAgICAgICAgICAgICAgICAgICAgY3VyW2ldLmZsYWdzICYgSFdDX1NLSVBfTEFZRVIpIHsKKyAgICAgICAgICAgICAgICAvLyBza2lwIGxheWVycyBoYW5kbGVkIGJ5IHRoZSBIQUwKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcihsYXllcnNbaV0pOwogICAgICAgICBjb25zdCBSZWdpb24gY2xpcChkaXJ0eS5pbnRlcnNlY3QobGF5ZXItPnZpc2libGVSZWdpb25TY3JlZW4pKTsKICAgICAgICAgaWYgKCFjbGlwLmlzRW1wdHkoKSkgewpAQCAtMTA0Miw3ICsxMTI5LDcgQEAKICAgICBpZiAoYW5kcm9pZF9hdG9taWNfZGVjKCZtVHJhbnNhY3Rpb25Db3VudCkgPT0gMSkgewogICAgICAgICBzaWduYWxFdmVudCgpOwogCi0gICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgdHJhbnNhY3Rpb24gd2l0aCBhIHJlc2l6ZSwgd2FpdCBmb3IgaXQgdG8gCisgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgdHJhbnNhY3Rpb24gd2l0aCBhIHJlc2l6ZSwgd2FpdCBmb3IgaXQgdG8KICAgICAgICAgLy8gdGFrZSBlZmZlY3QgYmVmb3JlIHJldHVybmluZy4KICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TdGF0ZUxvY2spOwogICAgICAgICB3aGlsZSAobVJlc2l6ZVRyYW5zYXRpb25QZW5kaW5nKSB7CkBAIC0xMDg2LDcgKzExNzMsNyBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotaW50IFN1cmZhY2VGbGluZ2VyOjpzZXRPcmllbnRhdGlvbihEaXNwbGF5SUQgZHB5LCAKK2ludCBTdXJmYWNlRmxpbmdlcjo6c2V0T3JpZW50YXRpb24oRGlzcGxheUlEIGRweSwKICAgICAgICAgaW50IG9yaWVudGF0aW9uLCB1aW50MzJfdCBmbGFncykKIHsKICAgICBpZiAoVU5MSUtFTFkodWludDMyX3QoZHB5KSA+PSBESVNQTEFZX0NPVU5UKSkKQEAgLTExMTksMTQgKzEyMDYsMTcgQEAKICAgICAgICAgICAgICAgICBpbnQodyksIGludChoKSk7CiAgICAgICAgIHJldHVybiBzdXJmYWNlSGFuZGxlOwogICAgIH0KLSAgICAKKwogICAgIC8vTE9HRCgiY3JlYXRlU3VyZmFjZSBmb3IgcGlkICVkICglZCB4ICVkKSIsIHBpZCwgdywgaCk7CiAgICAgc3A8TGF5ZXI+IG5vcm1hbExheWVyOwogICAgIHN3aXRjaCAoZmxhZ3MgJiBlRlhTdXJmYWNlTWFzaykgewogICAgICAgICBjYXNlIGVGWFN1cmZhY2VOb3JtYWw6CisjaWYgSEFTX1BVU0hfQlVGRkVSUwogICAgICAgICAgICAgaWYgKFVOTElLRUxZKGZsYWdzICYgZVB1c2hCdWZmZXJzKSkgewogICAgICAgICAgICAgICAgIGxheWVyID0gY3JlYXRlUHVzaEJ1ZmZlcnNTdXJmYWNlKGNsaWVudCwgZCwgdywgaCwgZmxhZ3MpOwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbm9ybWFsTGF5ZXIgPSBjcmVhdGVOb3JtYWxTdXJmYWNlKGNsaWVudCwgZCwgdywgaCwgZmxhZ3MsIGZvcm1hdCk7CiAgICAgICAgICAgICAgICAgbGF5ZXIgPSBub3JtYWxMYXllcjsKICAgICAgICAgICAgIH0KQEAgLTExNDUsNyArMTIzNSw3IEBACiAgICAgICAgIHNzaXplX3QgdG9rZW4gPSBhZGRDbGllbnRMYXllcihjbGllbnQsIGxheWVyKTsKIAogICAgICAgICBzdXJmYWNlSGFuZGxlID0gbGF5ZXItPmdldFN1cmZhY2UoKTsKLSAgICAgICAgaWYgKHN1cmZhY2VIYW5kbGUgIT0gMCkgeyAKKyAgICAgICAgaWYgKHN1cmZhY2VIYW5kbGUgIT0gMCkgewogICAgICAgICAgICAgcGFyYW1zLT50b2tlbiA9IHRva2VuOwogICAgICAgICAgICAgcGFyYW1zLT5pZGVudGl0eSA9IHN1cmZhY2VIYW5kbGUtPmdldElkZW50aXR5KCk7CiAgICAgICAgICAgICBwYXJhbXMtPndpZHRoID0gdzsKQEAgLTEyMjksNyArMTMxOSw3IEBACiAgICAgLyoKICAgICAgKiBjYWxsZWQgYnkgdGhlIHdpbmRvdyBtYW5hZ2VyLCB3aGVuIGEgc3VyZmFjZSBzaG91bGQgYmUgbWFya2VkIGZvcgogICAgICAqIGRlc3RydWN0aW9uLgotICAgICAqIAorICAgICAqCiAgICAgICogVGhlIHN1cmZhY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjdXJyZW50IGFuZCBkcmF3aW5nIGxpc3RzLCBidXQgcGxhY2VkCiAgICAgICogaW4gdGhlIHB1cmdhdG9yeSBxdWV1ZSwgc28gaXQncyBub3QgZGVzdHJveWVkIHJpZ2h0LWF3YXkgKHdlIG5lZWQKICAgICAgKiB0byB3YWl0IGZvciBhbGwgY2xpZW50J3MgcmVmZXJlbmNlcyB0byBnbyBhd2F5IGZpcnN0KS4KQEAgLTEyNTAsNyArMTM0MCw3IEBACiBzdGF0dXNfdCBTdXJmYWNlRmxpbmdlcjo6ZGVzdHJveVN1cmZhY2UoY29uc3Qgc3A8TGF5ZXJCYXNlQ2xpZW50PiYgbGF5ZXIpCiB7CiAgICAgLy8gY2FsbGVkIGJ5IH5JU3VyZmFjZSgpIHdoZW4gYWxsIHJlZmVyZW5jZXMgYXJlIGdvbmUKLSAgICAKKwogICAgIGNsYXNzIE1lc3NhZ2VEZXN0cm95U3VyZmFjZSA6IHB1YmxpYyBNZXNzYWdlQmFzZSB7CiAgICAgICAgIFN1cmZhY2VGbGluZ2VyKiBmbGluZ2VyOwogICAgICAgICBzcDxMYXllckJhc2VDbGllbnQ+IGxheWVyOwpAQCAtMTI2Myw5ICsxMzUzLDkgQEAKICAgICAgICAgICAgIGxheWVyLmNsZWFyKCk7IC8vIGNsZWFyIGl0IG91dHNpZGUgb2YgdGhlIGxvY2s7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZmxpbmdlci0+bVN0YXRlTG9jayk7CiAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICogcmVtb3ZlIHRoZSBsYXllciBmcm9tIHRoZSBjdXJyZW50IGxpc3QgLS0gY2hhbmNlcyBhcmUgdGhhdCBpdCdzIAotICAgICAgICAgICAgICogbm90IGluIHRoZSBsaXN0IGFueXdheSwgYmVjYXVzZSBpdCBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQgCi0gICAgICAgICAgICAgKiBhbHJlYWR5IHVwb24gcmVxdWVzdCBvZiB0aGUgY2xpZW50IChlZzogd2luZG93IG1hbmFnZXIpLiAKKyAgICAgICAgICAgICAqIHJlbW92ZSB0aGUgbGF5ZXIgZnJvbSB0aGUgY3VycmVudCBsaXN0IC0tIGNoYW5jZXMgYXJlIHRoYXQgaXQncworICAgICAgICAgICAgICogbm90IGluIHRoZSBsaXN0IGFueXdheSwgYmVjYXVzZSBpdCBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQKKyAgICAgICAgICAgICAqIGFscmVhZHkgdXBvbiByZXF1ZXN0IG9mIHRoZSBjbGllbnQgKGVnOiB3aW5kb3cgbWFuYWdlcikuCiAgICAgICAgICAgICAgKiBIb3dldmVyLCBhIGJ1Z2d5IGNsaWVudCBjb3VsZCBoYXZlIG5vdCBkb25lIHRoYXQuCiAgICAgICAgICAgICAgKiBTaW5jZSB3ZSBrbm93IHdlIGRvbid0IGhhdmUgYW55IG1vcmUgY2xpZW50cywgd2UgZG9uJ3QgbmVlZAogICAgICAgICAgICAgICogdG8gdXNlIHRoZSBwdXJnYXRvcnkuCkBAIC0xMzgwLDcgKzE0NzAsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNvbnN0IGJvb2wgbG9ja2VkKHJldHJ5ID49IDApOwogICAgICAgICBpZiAoIWxvY2tlZCkgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKICAgICAgICAgICAgICAgICAgICAgIlN1cmZhY2VGbGluZ2VyIGFwcGVhcnMgdG8gYmUgdW5yZXNwb25zaXZlLCAiCiAgICAgICAgICAgICAgICAgICAgICJkdW1waW5nIGFueXdheXMgKG5vIGxvY2tzIGhlbGQpXG4iKTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKQEAgLTE2NTUsMTIgKzE3NDUsMTUgQEAKIHsKICAgICBpbnQzMl90IG5hbWUgPSBOQU1FX05PVF9GT1VORDsKICAgICBzcDxMYXllcj4gbGF5ZXIobUZsaW5nZXItPmdldExheWVyKHN1cikpOwotICAgIGlmIChsYXllciA9PSAwKSByZXR1cm4gbmFtZTsKKyAgICBpZiAobGF5ZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CiAKICAgICAvLyBpZiB0aGlzIGxheWVyIGFscmVhZHkgaGFzIGEgdG9rZW4sIGp1c3QgcmV0dXJuIGl0CiAgICAgbmFtZSA9IGxheWVyLT5nZXRUb2tlbigpOwotICAgIGlmICgobmFtZSA+PSAwKSAmJiAobGF5ZXItPmdldENsaWVudCgpID09IHRoaXMpKQorICAgIGlmICgobmFtZSA+PSAwKSAmJiAobGF5ZXItPmdldENsaWVudCgpID09IHRoaXMpKSB7CiAgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KIAogICAgIG5hbWUgPSAwOwogICAgIGRvIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5oCmluZGV4IDhlY2ZjMDEuLjhlMjg2ZTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmgKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuaApAQCAtMjk2LDYgKzI5Niw3IEBACiAgICAgICAgICAgICB2b2lkICAgICAgICBoYW5kbGVQYWdlRmxpcCgpOwogICAgICAgICAgICAgYm9vbCAgICAgICAgbG9ja1BhZ2VGbGlwKGNvbnN0IExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIHVubG9ja1BhZ2VGbGlwKGNvbnN0IExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVdvcmtMaXN0KCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBoYW5kbGVSZXBhaW50KCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBwb3N0RnJhbWVidWZmZXIoKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGNvbXBvc2VTdXJmYWNlcyhjb25zdCBSZWdpb24mIGRpcnR5KTsKQEAgLTM3MCw2ICszNzEsNyBAQAogICAgICAgICAgICAgICAgIFJlZ2lvbiAgICAgICAgICAgICAgICAgICAgICBtSW52YWxpZFJlZ2lvbjsKICAgICAgICAgICAgICAgICBSZWdpb24gICAgICAgICAgICAgICAgICAgICAgbVdvcm1ob2xlUmVnaW9uOwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtVmlzaWJsZVJlZ2lvbnNEaXJ0eTsKKyAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUh3V29ya0xpc3REaXJ0eTsKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVyUmVsZWFzZUNvbnNvbGU7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1GcmVlemVEaXNwbGF5OwogICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtRnJlZXplQ291bnQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggYjA3YTEwYi4uMTg2YjM0OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZC5tawpAQCAtNyw4ICs3LDEwIEBACiAjIEluY2x1ZGUgYWxsIHRlc3QgamF2YSBmaWxlcy4KIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGVhc3ltb2NrbGliCiAKIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIgc2VydmljZXMKKwogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEZyYW1ld29ya3NTZXJ2aWNlc1Rlc3RzCiAKIExPQ0FMX0NFUlRJRklDQVRFIDo9IHBsYXRmb3JtCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNWNlMTA5Zi4uZjExNWY0MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjMsNiArMjMsMTkgQEAKICAgICAKICAgICA8YXBwbGljYXRpb24+CiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuc2VydmVyLkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QkTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSI+CisgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZSIvPgorICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9zZXJ2aWNlPgorCisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuc2VydmVyLkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QkTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UiPgorICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2UiLz4KKyAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvc2VydmljZT4KKwogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmUzYTgyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QuamF2YQpAQCAtMCwwICsxLDcyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LklBY2Nlc3NpYmlsaXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5JQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQ7CisKKy8qKgorICogVGhpcyB0ZXN0IGV4ZXJjaXNlcyB0aGUKKyAqIHtAbGluayBjb20uYW5kcm9pZC5zZXJ2ZXIuQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlfSBieSBtb2NraW5nIHRoZQorICoge0BsaW5rIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyfSB3aGljaCB0YWxrcyB0byB0byB0aGUKKyAqIHNlcnZpY2UuIFRoZSBzZXJ2aWNlIGl0c2VsZiBpcyBpbnRlcmFjdGluZyB3aXRoIHRoZSBwbGF0Zm9ybS4gTm90ZTogVGVzdGluZworICogdGhlIHNlcnZpY2UgaW4gZnVsbCBpc29sYXRpb24gd291bGQgcmVxdWlyZSBzaWduaWZpY2FudCBhbW91bnQgb2Ygd29yayBmb3IKKyAqIG1vY2tpbmcgYWxsIHN5c3RlbSBpbnRlcmFjdGlvbnMuIEl0IHdvdWxkIGFsc28gcmVxdWlyZSBhIGxvdCBvZiBtb2NraW5nIGNvZGUuCisgKi8KK3B1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIFRpbWVvdXQgcmVxdWlyZWQgZm9yIHBlbmRpbmcgQmluZGVyIGNhbGxzIG9yIGV2ZW50IHByb2Nlc3NpbmcgdG8KKyAgICAgKiBjb21wbGV0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfQklOREVSX0NBTEwgPSAxMDA7CisKKyAgICAvKioKKyAgICAgKiBUaW1lb3V0IGluIHdoaWNoIHdlIGFyZSB3YWl0aW5nIGZvciB0aGUgc3lzdGVtIHRvIHN0YXJ0IHRoZSBtb2NrCisgICAgICogYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfU1RBUlRfTU9DS19BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTID0gMzAwOworCisgICAgLyoqCisgICAgICogVGltZW91dCB1c2VkIGZvciB0ZXN0aW5nIHRoYXQgYSBzZXJ2aWNlIGlzIG5vdGlmaWVkIG9ubHkgdXBvbiBhCisgICAgICogbm90aWZpY2F0aW9uIHRpbWVvdXQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUX1RFU1RfTk9USUZJQ0FUSU9OX1RJTUVPVVQgPSAzMDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFja2FnZSBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzUGFja2FnZU5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW50ZXJmYWNlIHVzZWQgdG8gdGFsayB0byB0aGUgdGVzdGVkIHNlcnZpY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbU1hbmFnZXJTZXJ2aWNlOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIuc2V0Q29udGV4dChjb250ZXh0KTsKKyAgICAgICAgaWYgKHNQYWNrYWdlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBzUGFja2FnZU5hbWUgPSBjb250ZXh0LmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0KCkgeworICAgICAgICBJQmluZGVyIGlCaW5kZXIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuQUNDRVNTSUJJTElUWV9TRVJWSUNFKTsKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlID0gSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoaUJpbmRlcik7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRDbGllbnRfQWNjZXNzaWJpbGl0eURpc2FibGVkVGhlbkVuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIGFjY2Vzc2liaWxpdHkgaXMgZGlzYWJsZWQKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIGZhbHNlKTsKKworICAgICAgICAvLyBjcmVhdGUgYSBjbGllbnQgbW9jayBpbnN0YW5jZQorICAgICAgICBNeU1vY2tBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBtb2NrQ2xpZW50ID0gbmV3IE15TW9ja0FjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBib29sZWFuIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RGlzYWJsZWQgPSBtTWFuYWdlclNlcnZpY2UuYWRkQ2xpZW50KG1vY2tDbGllbnQpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNsaWVudCBtdXN0IGJlIGRpc2FibGVkIHNpbmNlIGFjY2Vzc2liaWxpdHkgaXMgZGlzYWJsZWQuIiwKKyAgICAgICAgICAgICAgICBlbmFibGVkQWNjZXNzaWJpbGl0eURpc2FibGVkKTsKKworICAgICAgICAvLyBlbmFibGUgYWNjZXNzaWJpbGl0eQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBib29sZWFuIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RW5hYmxlZCA9IG1NYW5hZ2VyU2VydmljZS5hZGRDbGllbnQobW9ja0NsaWVudCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjbGllbnQgbXVzdCBiZSBlbmFibGVkIHNpbmNlIGFjY2Vzc2liaWxpdHkgaXMgZW5hYmxlZC4iLAorICAgICAgICAgICAgICAgIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RW5hYmxlZCk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRDbGllbnRfQWNjZXNzaWJpbGl0eUVuYWJsZWRUaGVuRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZW5hYmxlIGFjY2Vzc2liaWxpdHkgYmVmb3JlIHJlZ2lzdGVyaW5nIHRoZSBjbGllbnQKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGNyZWF0ZSBhIGNsaWVudCBtb2NrIGluc3RhbmNlCisgICAgICAgIE15TW9ja0FjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IG1vY2tDbGllbnQgPSBuZXcgTXlNb2NrQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIGJvb2xlYW4gZW5hYmxlZEFjY2Vzc2liaWxpdHlFbmFibGVkID0gbU1hbmFnZXJTZXJ2aWNlLmFkZENsaWVudChtb2NrQ2xpZW50KTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNsaWVudCBtdXN0IGJlIGVuYWJsZWQgc2luY2UgYWNjZXNzaWJpbGl0eSBpcyBlbmFibGVkLiIsCisgICAgICAgICAgICAgICAgZW5hYmxlZEFjY2Vzc2liaWxpdHlFbmFibGVkKTsKKworICAgICAgICAvLyBkaXNhYmxlIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIGZhbHNlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIGJvb2xlYW4gZW5hYmxlZEFjY2Vzc2liaWxpdHlEaXNhYmxlZCA9IG1NYW5hZ2VyU2VydmljZS5hZGRDbGllbnQobW9ja0NsaWVudCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2xpZW50IG11c3QgYmUgZGlzYWJsZWQgc2luY2UgYWNjZXNzaWJpbGl0eSBpcyBkaXNhYmxlZC4iLAorICAgICAgICAgICAgICAgIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RGlzYWJsZWQpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VzTGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBib29sZWFuIGZpcnN0TW9ja1NlcnZpY2VJbnN0YWxsZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBzZWNvbmRNb2NrU2VydmljZUluc3RhbGxlZCA9IGZhbHNlOworCisgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICBTdHJpbmcgZmlyc3RNb2NrU2VydmljZUNsYXNzTmFtZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpOworICAgICAgICBTdHJpbmcgc2Vjb25kTW9ja1NlcnZpY2VDbGFzc05hbWUgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jbGFzcy5nZXROYW1lKCk7CisKKyAgICAgICAgLy8gbG9vayBmb3IgdGhlIHR3byBtb2NrIHNlcnZpY2VzCisgICAgICAgIGZvciAoU2VydmljZUluZm8gc2VydmljZUluZm8gOiBtTWFuYWdlclNlcnZpY2UuZ2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCkpIHsKKyAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS5lcXVhbHMoc2VydmljZUluZm8ucGFja2FnZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0TW9ja1NlcnZpY2VDbGFzc05hbWUuZXF1YWxzKHNlcnZpY2VJbmZvLm5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0TW9ja1NlcnZpY2VJbnN0YWxsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kTW9ja1NlcnZpY2VDbGFzc05hbWUuZXF1YWxzKHNlcnZpY2VJbmZvLm5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHNlY29uZE1vY2tTZXJ2aWNlSW5zdGFsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlyc3QgbW9jayBzZXJ2aWNlIG11c3QgYmUgaW5zdGFsbGVkIiwgZmlyc3RNb2NrU2VydmljZUluc3RhbGxlZCk7CisgICAgICAgIGFzc2VydFRydWUoIlNlY29uZCBtb2NrIHNlcnZpY2UgbXVzdCBiZSBpbnN0YWxsZWQiLCBzZWNvbmRNb2NrU2VydmljZUluc3RhbGxlZCk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X09uZVNlcnZpY2VfTWF0Y2hpbmdQYWNrYWdlQW5kRXZlbnRUeXBlKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZQorICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgZmFsc2UpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIHNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbCB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBhbiBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucworICAgICAgICBzZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIHNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfT25lU2VydmljZV9Ob3RNYXRjaGluZ1BhY2thZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIGZhbHNlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBzZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGwgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworICAgICAgICBzZW50RXZlbnQuc2V0UGFja2FnZU5hbWUoIm5vLnNlcnZpY2UucmVnaXN0ZXJlZC5mb3IudGhpcy5wYWNrYWdlIik7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucworICAgICAgICBzZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X09uZVNlcnZpY2VfTm90TWF0Y2hpbmdFdmVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIGZhbHNlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBzZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGwgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworICAgICAgICBzZW50RXZlbnQuc2V0RXZlbnRUeXBlKEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX05PVElGSUNBVElPTl9TVEFURV9DSEFOR0VEKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zCisgICAgICAgIHNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfT25lU2VydmljZV9Ob3RpZml2YXRpb25BZnRlclRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIGZhbHNlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gaW5mbyA9IE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpOworICAgICAgICBpbmZvLm5vdGlmaWNhdGlvblRpbWVvdXQgPSBUSU1FT1VUX1RFU1RfTk9USUZJQ0FUSU9OX1RJTUVPVVQ7CisgICAgICAgIHNlcnZpY2Uuc2V0U2VydmljZUluZm8oaW5mbyk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxsIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIHRoZSBmaXJzdCBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBmaXJzdEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChmaXJzdEV2ZW50KTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIHRoZSBzZWNvbmQgZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2Vjb25kRXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlY29uZEV2ZW50KTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zCisgICAgICAgIHNlcnZpY2UuZXhwZWN0RXZlbnQoc2Vjb25kRXZlbnQpOworICAgICAgICBzZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50cworICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChmaXJzdEV2ZW50KTsKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2Vjb25kRXZlbnQpOworCisgICAgICAgIC8vIHdhaXQgZm9yICNzZW5kQWNjZXNzaWJpbGl0eUV2ZW50IHRvIHJlYWNoIHRoZSBiYWNraW5nIHNlcnZpY2UKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXJ2aWNlLnZlcmlmeSgpOworICAgICAgICAgICAgZmFpbCgiTm8gZXZlbnRzIG11c3QgYmUgZGlzcGF0Y2hlZCBiZWZvcmUgdGhlIGV4cGlyYXRpb24gb2YgdGhlIG5vdGlmaWNhdGlvbiB0aW1lb3V0LiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7CisgICAgICAgICAgICAvKiBleHBlY3RlZCAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGNvbmZpZ3VyZWQgbm90aWZpY2F0aW9uIHRpbWVvdXQgdG8gZXhwaXJlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX1RFU1RfTk9USUZJQ0FUSU9OX1RJTUVPVVQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9Ud29TZXJ2aWNlc19NYXRjaGluZ1BhY2thZ2VBbmRFdmVudFR5cGVfRGlmZkZlZWRiYWNrKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBmaXJzdFNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGZpcnN0SW5mbyA9IE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpOworICAgICAgICBmaXJzdEluZm8uZmVlZGJhY2tUeXBlID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZFRURCQUNLX0FVRElCTEU7CisgICAgICAgIGZpcnN0U2VydmljZS5zZXRTZXJ2aWNlSW5mbyhmaXJzdEluZm8pOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2Vjb25kU2VydmljZSA9IE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIHNlY29uZEluZm8gPSBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgc2Vjb25kSW5mby5mZWVkYmFja1R5cGUgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfSEFQVElDOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKHNlY29uZEluZm8pOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbHMgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgZmlyc3RTZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIGZpcnN0U2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBzZWNvbmRTZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIHNlY29uZFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChmaXJzdFNlcnZpY2UpOworICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZWNvbmRTZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfVHdvU2VydmljZXNfTWF0Y2hpbmdQYWNrYWdlQW5kRXZlbnRUeXBlKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBmaXJzdFNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlY29uZFNlcnZpY2UgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIHNlY29uZFNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbHMgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgZmlyc3RTZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIGZpcnN0U2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBzZWNvbmRTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoZmlyc3RTZXJ2aWNlKTsKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2Vjb25kU2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X1R3b1NlcnZpY2VzX01hdGNoaW5nUGFja2FnZUFuZEV2ZW50VHlwZV9PbmVEZWZhdWx0KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBmaXJzdFNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGZpcnN0SW5mbyA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgZmlyc3RJbmZvLmZsYWdzID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkRFRkFVTFQ7CisgICAgICAgIGZpcnN0U2VydmljZS5zZXRTZXJ2aWNlSW5mbyhmaXJzdEluZm8pOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2Vjb25kU2VydmljZSA9IE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgc2Vjb25kU2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGxzIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIGZpcnN0U2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBzZWNvbmRTZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIHNlY29uZFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChmaXJzdFNlcnZpY2UpOworICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZWNvbmRTZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfVHdvU2VydmljZXNfTWF0Y2hpbmdQYWNrYWdlQW5kRXZlbnRUeXBlX1R3b0RlZmF1bHQoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcworICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGZpcnN0U2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gZmlyc3RJbmZvID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpOworICAgICAgICBmaXJzdEluZm8uZmxhZ3MgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uREVGQVVMVDsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKGZpcnN0SW5mbyk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZWNvbmRTZXJ2aWNlID0gTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gc2Vjb25kSW5mbyA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgc2Vjb25kSW5mby5mbGFncyA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5ERUZBVUxUOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKGZpcnN0SW5mbyk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxscyB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBhbiBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBmaXJzdFNlcnZpY2UuZXhwZWN0RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIHNlY29uZFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChmaXJzdFNlcnZpY2UpOworICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZWNvbmRTZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludGVycnVwdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBmaXJzdFNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlY29uZFNlcnZpY2UgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIHNlY29uZFNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbHMgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgZmlyc3RTZXJ2aWNlLmV4cGVjdEludGVycnVwdCgpOworICAgICAgICBmaXJzdFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgc2Vjb25kU2VydmljZS5leHBlY3RJbnRlcnJ1cHQoKTsKKyAgICAgICAgc2Vjb25kU2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBjYWxsIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBtTWFuYWdlclNlcnZpY2UuaW50ZXJydXB0KCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoZmlyc3RTZXJ2aWNlKTsKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2Vjb25kU2VydmljZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRnVsbHkgcG9wdWxhdGVzIHRoZSB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fSB0byBtYXJzaGFsLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbnRFdmVudCBUaGUgZXZlbnQgdG8gcG9wdWxhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQpIHsKKyAgICAgICAgc2VudEV2ZW50LnNldEFkZGVkQ291bnQoMSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRCZWZvcmVUZXh0KCJCZWZvcmVUZXh0Iik7CisgICAgICAgIHNlbnRFdmVudC5zZXRDaGVja2VkKHRydWUpOworICAgICAgICBzZW50RXZlbnQuc2V0Q2xhc3NOYW1lKCJmb28uYmFyLmJhei5DbGFzcyIpOworICAgICAgICBzZW50RXZlbnQuc2V0Q29udGVudERlc2NyaXB0aW9uKCJDb250ZW50RGVzY3JpcHRpb24iKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEN1cnJlbnRJdGVtSW5kZXgoMSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRFbmFibGVkKHRydWUpOworICAgICAgICBzZW50RXZlbnQuc2V0RXZlbnRUeXBlKEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfQ0xJQ0tFRCk7CisgICAgICAgIHNlbnRFdmVudC5zZXRFdmVudFRpbWUoMTAwMCk7CisgICAgICAgIHNlbnRFdmVudC5zZXRGcm9tSW5kZXgoMSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRGdWxsU2NyZWVuKHRydWUpOworICAgICAgICBzZW50RXZlbnQuc2V0SXRlbUNvdW50KDEpOworICAgICAgICBzZW50RXZlbnQuc2V0UGFja2FnZU5hbWUoImZvby5iYXIuYmF6Iik7CisgICAgICAgIHNlbnRFdmVudC5zZXRQYXJjZWxhYmxlRGF0YShNZXNzYWdlLm9idGFpbihudWxsLCAxLCBudWxsKSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRQYXNzd29yZCh0cnVlKTsKKyAgICAgICAgc2VudEV2ZW50LnNldFJlbW92ZWRDb3VudCgxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIGEgbW9jayB7QGxpbmsgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgTXlNb2NrQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgZXh0ZW5kcyBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQuU3R1YiB7CisgICAgICAgIGJvb2xlYW4gbUlzRW5hYmxlZDsKKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICAgICAgbUlzRW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIGFjY2Vzc2liaWxpdHkgaXMgaW4gYSBnaXZlbiBzdGF0ZSBieSB3cml0aW5nIHRoZSBzdGF0ZSB0byB0aGUKKyAgICAgKiBzZXR0aW5ncyBhbmQgd2FpdGluZyB1bnRpbCB0aGUgYWNjZXNzaWJpbGl0eSBtYW5hZ2VyIHNlcnZpY2UgcGljayBpdCB1cC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dCBoYW5kbGUgdG8gYWNjZXNzIHRoZSBzZXR0aW5ncy4KKyAgICAgKiBAcGFyYW0gZW5hYmxlZCBUaGUgYWNjZXNzaWJpbGl0eSBzdGF0ZSB0byB3cml0ZSB0byB0aGUgc2V0dGluZ3MuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQoQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGVuYWJsZWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBib29sZWFuIGlzRW5hYmxlZCA9IChTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkFDQ0VTU0lCSUxJVFlfRU5BQkxFRCwgMCkgPT0gMSA/IHRydWUgOiBmYWxzZSk7CisKKyAgICAgICAgaWYgKGlzRW5hYmxlZCA9PSBlbmFibGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX0VOQUJMRUQsCisgICAgICAgICAgICAgICAgZW5hYmxlZCA/IDEgOiAwKTsKKworICAgICAgICAvLyB3YWl0IHRoZSBhY2Nlc3NpYmlsaXR5IG1hbmFnZXIgc2VydmljZSB0byBwaWNrIHRoZSBjaGFuZ2UgdXAKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgdGhlIG9ubHkge0BsaW5rIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZX1zIHdpdGggZ2l2ZW4gY29tcG9uZW50CisgICAgICogbmFtZXMgYXJlIGVuYWJsZWQgYnkgd3JpdGluZyB0byB0aGUgc3lzdGVtIHNldHRpbmdzIGFuZCB3YWl0aW5nIHVudGlsIHRoZQorICAgICAqIGFjY2Vzc2liaWxpdHkgbWFuYWdlciBzZXJ2aWNlIHBpY2tzIHRoYXQgdXAgb3IgdGhlCisgICAgICoge0BsaW5rICNUSU1FT1VUX1NUQVJUX01PQ0tfQUNDRVNTSUJJTElUWV9TRVJWSUNFU30gaXMgZXhjZWVkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQgaGFuZGxlIHRvIGFjY2VzcyB0aGUgc2V0dGluZ3MuCisgICAgICogQHBhcmFtIGZpcnN0TW9ja1NlcnZpY2VFbmFibGVkIElmIHRoZSBmaXJzdCBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZSBpcyBlbmFibGVkLgorICAgICAqIEBwYXJhbSBzZWNvbmRNb2NrU2VydmljZUVuYWJsZWQgSWYgdGhlIHNlY29uZCBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZSBpcyBlbmFibGVkLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIHNvbWUgb2YgdGhlIHJlcXVlc3RlZCBmb3IgZW5hYmxpbmcgbW9jayBzZXJ2aWNlcworICAgICAqICAgICAgICAgaXMgbm90IHByb3Blcmx5IHN0YXJ0ZWQuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gRXhjZXB0aW9uIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKENvbnRleHQgY29udGV4dCwgYm9vbGVhbiBmaXJzdE1vY2tTZXJ2aWNlRW5hYmxlZCwKKyAgICAgICAgICAgIGJvb2xlYW4gc2Vjb25kTW9ja1NlcnZpY2VFbmFibGVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGVuYWJsZWRTZXJ2aWNlcyA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuRU5BQkxFRF9BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTKTsKKworICAgICAgICBTdHJpbmdCdWlsZGVyIHNlcnZpY2VzVG9FbmFibGUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBpZiAoZmlyc3RNb2NrU2VydmljZUVuYWJsZWQpIHsKKyAgICAgICAgICAgIHNlcnZpY2VzVG9FbmFibGUuYXBwZW5kKE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0NvbXBvbmVudE5hbWUpLmFwcGVuZCgiOiIpOworICAgICAgICB9CisgICAgICAgIGlmIChzZWNvbmRNb2NrU2VydmljZUVuYWJsZWQpIHsKKyAgICAgICAgICAgIHNlcnZpY2VzVG9FbmFibGUuYXBwZW5kKE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNDb21wb25lbnROYW1lKS5hcHBlbmQoIjoiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXJ2aWNlc1RvRW5hYmxlLmVxdWFscyhlbmFibGVkU2VydmljZXMpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfQUNDRVNTSUJJTElUWV9TRVJWSUNFUywgc2VydmljZXNUb0VuYWJsZS50b1N0cmluZygpKTsKKworICAgICAgICAvLyB3ZSBoYXZlIGVuYWJsZWQgdGhlIHNlcnZpY2VzIG9mIGludGVyZXN0IGFuZCBuZWVkIHRvIHdhaXQgdW50aWwgdGhleQorICAgICAgICAvLyBhcmUgaW5zdGFudGlhdGVkIGFuZCBzdGFydGVkIChpZiBuZWVkZWQpIGFuZCB0aGUgc3lzdGVtIGJpbmRzIHRvIHRoZW0KKyAgICAgICAgYm9vbGVhbiBmaXJzdE1vY2tTZXJ2aWNlT0sgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBzZWNvbmRNb2NrU2VydmljZU9LID0gZmFsc2U7CisgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgbG9uZyBwb2xsaW5nSW50ZXJ2YWwgPSBUSU1FT1VUX1NUQVJUX01PQ0tfQUNDRVNTSUJJTElUWV9TRVJWSUNFUyAvIDY7CisKKyAgICAgICAgd2hpbGUgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gc3RhcnQgPCBUSU1FT1VUX1NUQVJUX01PQ0tfQUNDRVNTSUJJTElUWV9TRVJWSUNFUykgIHsKKyAgICAgICAgICAgIGZpcnN0TW9ja1NlcnZpY2VPSyA9ICFmaXJzdE1vY2tTZXJ2aWNlRW5hYmxlZAorICAgICAgICAgICAgICAgICAgICB8fCAoTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2UgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZS5pc1N5c3RlbUJvdW5kQXNDbGllbnQoKSk7CisKKyAgICAgICAgICAgIHNlY29uZE1vY2tTZXJ2aWNlT0sgPSAhc2Vjb25kTW9ja1NlcnZpY2VFbmFibGVkCisgICAgICAgICAgICAgICAgICAgIHx8IChNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2UgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2UuaXNTeXN0ZW1Cb3VuZEFzQ2xpZW50KCkpOworCisgICAgICAgICAgICBpZiAoZmlyc3RNb2NrU2VydmljZU9LICYmIHNlY29uZE1vY2tTZXJ2aWNlT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChwb2xsaW5nSW50ZXJ2YWwpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgbWVzc2FnZS5hcHBlbmQoIk1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcyBub3Qgc3RhcnRlZCBvciBzeXN0ZW0gbm90IGJvdW5kIGFzIGEgY2xpZW50OiAiKTsKKyAgICAgICAgaWYgKCFmaXJzdE1vY2tTZXJ2aWNlT0spIHsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0NvbXBvbmVudE5hbWUpOworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoIiAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNlY29uZE1vY2tTZXJ2aWNlT0spIHsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNDb21wb25lbnROYW1lKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG1lc3NhZ2UudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB2ZXJpZmllZAorICAgICAqICh3aGljaCBpcyBpdCBoYXMgcmVjZWl2ZWQgdGhlIGV4cGVjdGVkIG1ldGhvZCBjYWxscyB3aXRoIGV4cGVjdGVkCisgICAgICogYXJndW1lbnRzKSB3aXRoaW4gdGhlIHtAbGluayAjVElNRU9VVF9CSU5ERVJfQ0FMTH0uIFRoZSB2ZXJpZmllZCBzdGF0ZSBpcworICAgICAqIGNoZWNrZWQgYnkgcG9sbGluZyB1cG9uIHNtYWxsIGludGVydmFscy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIHZlcmlmeS4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBmYWlsZWQgd2l0aCBleGNlcHRpb24gYWZ0ZXIgdGhlCisgICAgICogICAgICAgICAgICAge0BsaW5rICNUSU1FT1VUX0JJTkRFUl9DQUxMfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlcnZpY2UpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRXhjZXB0aW9uIGxhc3RWZXJpZnlFeGNlcHRpb24gPSBudWxsOworICAgICAgICBsb25nIGJlZ2luVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBsb25nIHBvbGxUbWVvdXQgPSBUSU1FT1VUX0JJTkRFUl9DQUxMIC8gNTsKKworICAgICAgICAvLyBwb2xsIHVudGlsIHRoZSB0aW1lb3V0IGhhcyBlbGFwc2VkCisgICAgICAgIHdoaWxlIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIGJlZ2luVGltZSA8IFRJTUVPVVRfQklOREVSX0NBTEwpIHsKKyAgICAgICAgICAgIC8vIHNsZWVwIGZpcnN0IHNpbmNlIGltbWVkaWF0ZSBjYWxsIHdpbGwgYWx3YXlzIGZhaWwKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHBvbGxUbWVvdXQpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHBvbGwgZm9yIHZlcmlmaWNhdGlvbiBhbmQgaWYgdGhpcyBmYWlscyBzYXZlIHRoZSBleGNlcHRpb24gYW5kCisgICAgICAgICAgICAvLyBrZWVwIHBvbGxpbmcKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2VydmljZS52ZXJpZnkoKTsKKyAgICAgICAgICAgICAgICAvLyByZXNldCBzbyBpdCBkb2VzIG5vdCBhY2NlcHQgbW9yZSBldmVudHMKKyAgICAgICAgICAgICAgICBzZXJ2aWNlLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsYXN0VmVyaWZ5RXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlc2V0LCB3ZSBoYXZlIGFscmVhZHkgZmFpbGVkCisgICAgICAgIHNlcnZpY2UucmVzZXQoKTsKKworICAgICAgICAvLyBhbHdheXMgbm90IG51bGwKKyAgICAgICAgdGhyb3cgbGFzdFZlcmlmeUV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIHRoZSBmaXJzdCBtb2NrIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGV4dGVuZHMgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHNlcnZpY2Uge0BsaW5rIENvbXBvbmVudE5hbWV9IGZsYXR0ZW5lZCBhcyBhIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgc0NvbXBvbmVudE5hbWUgPSBuZXcgQ29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgICAgICBzUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICApLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZSB0byB0aGUgc2VydmljZSBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNJbnN0YW5jZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlKCkgeworICAgICAgICAgICAgc0luc3RhbmNlID0gdGhpczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgaXMgdGhlIGZpcnN0IG1vY2sge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGV4dGVuZHMgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHNlcnZpY2Uge0BsaW5rIENvbXBvbmVudE5hbWV9IGZsYXR0ZW5lZCBhcyBhIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgc0NvbXBvbmVudE5hbWUgPSBuZXcgQ29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgICAgICBzUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgKS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGUgdG8gdGhlIHNlcnZpY2UgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc0luc3RhbmNlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlKCkgeworICAgICAgICAgICAgc0luc3RhbmNlID0gdGhpczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGZlZDIyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmNyZWF0ZVN0cmljdE1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBvcnRNYXRjaGVyOworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVzZXQ7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay52ZXJpZnk7CisKK2ltcG9ydCBvcmcuZWFzeW1vY2suSUFyZ3VtZW50TWF0Y2hlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LklBY2Nlc3NpYmlsaXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5JQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRlc3RzIGZvciB0aGUgQWNjZXNzaWJpbGl0eU1hbmFnZXIgd2hpY2ggbW9ja2luZyB0aGUgYmFja2luZyBzZXJ2aWNlLgorICovCitwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eU1hbmFnZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIFRpbWVvdXQgcmVxdWlyZWQgZm9yIHBlbmRpbmcgQmluZGVyIGNhbGxzIG9yIGV2ZW50IHByb2Nlc3NpbmcgdG8KKyAgICAgKiBjb21wbGV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVF9CSU5ERVJfQ0FMTCA9IDUwOworCisgICAgLyoqCisgICAgICogVGhlIHJldXNhYmxlIG1vY2sge0BsaW5rIElBY2Nlc3NpYmlsaXR5TWFuYWdlcn0uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbU1vY2tTZXJ2aWNlSW50ZXJmYWNlID0KKyAgICAgICAgY3JlYXRlU3RyaWN0TW9jayhJQWNjZXNzaWJpbGl0eU1hbmFnZXIuY2xhc3MpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmVzZXQobU1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY3JlYXRlIGEgbGlzdCBvZiBpbnN0YWxsZWQgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcyB0aGUgbW9jayBzZXJ2aWNlIHJldHVybnMKKyAgICAgICAgTGlzdDxTZXJ2aWNlSW5mbz4gZXhwZWN0ZWRTZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3Q8U2VydmljZUluZm8+KCk7CisgICAgICAgIFNlcnZpY2VJbmZvIHNlcnZpY2VJbmZvID0gbmV3IFNlcnZpY2VJbmZvKCk7CisgICAgICAgIHNlcnZpY2VJbmZvLm5hbWUgPSAiVGVzdFNlcnZpY2VJbmZvTmFtZSI7CisgICAgICAgIGV4cGVjdGVkU2VydmljZXMuYWRkKHNlcnZpY2VJbmZvKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZSBiZWhhdmlvcgorICAgICAgICBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbW9ja1NlcnZpY2VJbnRlcmZhY2UgPSBtTW9ja1NlcnZpY2VJbnRlcmZhY2U7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5hZGRDbGllbnQoYW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCkpKS5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5nZXRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKSkuYW5kUmV0dXJuKGV4cGVjdGVkU2VydmljZXMpOworICAgICAgICByZXBsYXkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbWFuYWdlciA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihtQ29udGV4dCwgbW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgICAgICBMaXN0PFNlcnZpY2VJbmZvPiByZWNlaXZlZFNlcnZpY2VzID0gbWFuYWdlci5nZXRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQgKGxpc3QgZXF1YWxzKCkgY29tcGFyZXMgaXQgY29udGVudHMgYXMgd2VsbCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBbGwgZXhwZWN0ZWQgc2VydmljZXMgbXVzdCBiZSByZXR1cm5lZCIsIHJlY2VpdmVkU2VydmljZXMsIGV4cGVjdGVkU2VydmljZXMpOworCisgICAgICAgIC8vIHZlcmlmeSB0aGUgbW9jayBzZXJ2aWNlIHdhcyBwcm9wZXJseSBjYWxsZWQKKyAgICAgICAgdmVyaWZ5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcnJ1cHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1vY2tTZXJ2aWNlSW50ZXJmYWNlID0gbU1vY2tTZXJ2aWNlSW50ZXJmYWNlOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuYWRkQ2xpZW50KGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpKSkuYW5kUmV0dXJuKHRydWUpOworICAgICAgICBtb2NrU2VydmljZUludGVyZmFjZS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgcmVwbGF5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIobUNvbnRleHQsIG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICAgICAgbWFuYWdlci5pbnRlcnJ1cHQoKTsKKworICAgICAgICAvLyB2ZXJpZnkgdGhlIG1vY2sgc2VydmljZSB3YXMgcHJvcGVybHkgY2FsbGVkCisgICAgICAgIHZlcmlmeShtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc0VuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1vY2tTZXJ2aWNlSW50ZXJmYWNlID0gbU1vY2tTZXJ2aWNlSW50ZXJmYWNlOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuYWRkQ2xpZW50KGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpKSkuYW5kUmV0dXJuKHRydWUpOworICAgICAgICByZXBsYXkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbWFuYWdlciA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihtQ29udGV4dCwgbW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgICAgICBib29sZWFuIGlzRW5hYmxlZFNlcnZpY2VFbmFibGVkID0gbWFuYWdlci5pc0VuYWJsZWQoKTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTXVzdCBiZSBlbmFibGVkIHNpbmNlIHRoZSBtb2NrIHNlcnZpY2UgaXMgZW5hYmxlZCIsIGlzRW5hYmxlZFNlcnZpY2VFbmFibGVkKTsKKworICAgICAgICAvLyBkaXNhYmxlIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgbWFuYWdlci5nZXRDbGllbnQoKS5zZXRFbmFibGVkKGZhbHNlKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYXN5bmNocm9ub3VzIElCaW5kZXIgY2FsbCB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBib29sZWFuIGlzRW5hYmxlZFNlcnZjaWVEaXNhYmxlZCA9IG1hbmFnZXIuaXNFbmFibGVkKCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydEZhbHNlKCJNdXN0IGJlIGRpc2FibGVkIHNpbmNlIHRoZSBtb2NrIHNlcnZpY2UgaXMgZGlzYWJsZWQiLAorICAgICAgICAgICAgICAgIGlzRW5hYmxlZFNlcnZjaWVEaXNhYmxlZCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoZSBtb2NrIHNlcnZpY2Ugd2FzIHByb3Blcmx5IGNhbGxlZAorICAgICAgICB2ZXJpZnkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfQWNjZXNzaWJpbGl0eUVuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY3JlYXRlIGFuIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZSBiZWhhdmlvcgorICAgICAgICBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbW9ja1NlcnZpY2VJbnRlcmZhY2UgPSBtTW9ja1NlcnZpY2VJbnRlcmZhY2U7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5hZGRDbGllbnQoYW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCkpKS5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGVxQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCkpKQorICAgICAgICAgICAgICAgIC5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGVxQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCkpKQorICAgICAgICAgICAgICAgIC5hbmRSZXR1cm4oZmFsc2UpOworICAgICAgICByZXBsYXkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QgKG1hbmFnZXIgYW5kIHNlcnZpY2UgaW4gZGlmZmVyZW50IHByb2Nlc3NlcykKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbWFuYWdlciA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihtQ29udGV4dCwgbW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgICAgICBtYW5hZ2VyLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IG5leHRFdmVudERpZmZlcmVudFByb2Nlc3NlcyA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgYXNzZXJ0U2FtZSgiVGhlIG1hbmFnZXIgYW5kIHRoZSBzZXJ2aWNlIGFyZSBpbiBkaWZmZXJlbnQgcHJvY2Vzc2VzLCBzbyB0aGUgZXZlbnQgbXVzdCBiZSAiICsKKyAgICAgICAgICAgICAgICAicmVjeWNsZWQiLCBzZW50RXZlbnQsIG5leHRFdmVudERpZmZlcmVudFByb2Nlc3Nlcyk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdCAobWFuYWdlciBhbmQgc2VydmljZSBpbiB0aGUgc2FtZSBwcm9jZXNzKQorICAgICAgICBtYW5hZ2VyLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IG5leHRFdmVudFNhbWVQcm9jZXNzID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBhc3NlcnROb3RTYW1lKCJUaGUgbWFuYWdlciBhbmQgdGhlIHNlcnZpY2UgYXJlIGluIHRoZSBzYW1lIHByb2Nlc3MsIHNvIHRoZSBldmVudCBtdXN0IG5vdCIgKworICAgICAgICAgICAgICAgICJiZSByZWN5Y2xlZCIsIHNlbnRFdmVudCwgbmV4dEV2ZW50U2FtZVByb2Nlc3MpOworCisgICAgICAgIC8vIHZlcmlmeSB0aGUgbW9jayBzZXJ2aWNlIHdhcyBwcm9wZXJseSBjYWxsZWQKKyAgICAgICAgdmVyaWZ5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X0FjY2Vzc2liaWxpdHlEaXNhYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBjcmVhdGUgYW4gZXZlbnQgdG8gYmUgZGlzcGF0Y2hlZAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBtb2NrU2VydmljZUludGVyZmFjZSA9IG1Nb2NrU2VydmljZUludGVyZmFjZTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLmFkZENsaWVudChhbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKSkpLmFuZFJldHVybihmYWxzZSk7CisgICAgICAgIHJlcGxheShtb2NrU2VydmljZUludGVyZmFjZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdCAoYWNjZXNzaWJpbGl0eSBkaXNhYmxlZCkKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbWFuYWdlciA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihtQ29udGV4dCwgbW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWFuYWdlci5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgICAgICBmYWlsKCJObyBhY2Nlc3NpYmlsaXR5IGV2ZW50cyBhcmUgc2VudCBpZiBhY2Nlc3NpYmlsaXR5IGlzIGRpc2FibGVkIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsKKyAgICAgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY2Nlc3NpYmlsaXR5IG9mZi4gRGlkIHlvdSBmb3JnZXQgdG8gY2hlY2sgdGhhdD8iLCBpc2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZlcmlmeSB0aGUgbW9jayBzZXJ2aWNlIHdhcyBwcm9wZXJseSBjYWxsZWQKKyAgICAgICAgdmVyaWZ5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnR9IHBhc3NlZCBhcyBhIG1ldGhvZCBhcmd1bWVudAorICAgICAqIG1hdGNoZXMgZXhwZWN0YXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIG1hdGNoZWQgVGhlIGV2ZW50IHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBleHBlY3RhdGlvbnMgYXJlIG1hdGNoZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQWNjZXNzaWJpbGl0eUV2ZW50IGVxQWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBtYXRjaGVkKSB7CisgICAgICAgIHJlcG9ydE1hdGNoZXIobmV3IEFjY2Vzc2liaWxpdHlFdmVudE1hdGhlcihtYXRjaGVkKSk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgYW4ge0BsaW5rIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudH0gcGFzc2VkIGFzIGEgbWV0aG9kIGFyZ3VtZW50CisgICAgICogbWF0Y2hlcyBleHBlY3RhdGlvbnMgd2hpY2ggaW4gdGhpcyBjYXNlIGFyZSB0aGF0IGFueSBpbnN0YW5jZSBpcyBhY2NlcHRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpIHsKKyAgICAgICAgcmVwb3J0TWF0Y2hlcihuZXcgQW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50TWF0aGVyKCkpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXRjaGVyIGZvciB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWNjZXNzaWJpbGl0eUV2ZW50TWF0aGVyIGltcGxlbWVudHMgSUFyZ3VtZW50TWF0Y2hlciB7CisgICAgICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eUV2ZW50IG1FeHBlY3RlZEV2ZW50OworCisgICAgICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5RXZlbnRNYXRoZXIoQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQpIHsKKyAgICAgICAgICAgIG1FeHBlY3RlZEV2ZW50ID0gZXhwZWN0ZWRFdmVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoT2JqZWN0IG1hdGNoZWQpIHsKKyAgICAgICAgICAgIGlmICghKG1hdGNoZWQgaW5zdGFuY2VvZiBBY2Nlc3NpYmlsaXR5RXZlbnQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHJlY2VpdmVkRXZlbnQgPSAoQWNjZXNzaWJpbGl0eUV2ZW50KSBtYXRjaGVkOworICAgICAgICAgICAgcmV0dXJuIG1FeHBlY3RlZEV2ZW50LmdldEV2ZW50VHlwZSgpID09IHJlY2VpdmVkRXZlbnQuZ2V0RXZlbnRUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJzZW5kQWNjZXNzaWJpbGl0eUV2ZW50KCkiKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiB3aXRoIGV2ZW50IHR5cGUgXCIiKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQobUV4cGVjdGVkRXZlbnQuZ2V0RXZlbnRUeXBlKCkpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1hdGNoZXIgZm9yIHtAbGluayBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnR9cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnRNYXRoZXIgaW1wbGVtZW50cyBJQXJndW1lbnRNYXRjaGVyIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3QgbWF0Y2hlZCkgeworICAgICAgICAgICAgaWYgKCEobWF0Y2hlZCBpbnN0YW5jZW9mIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoImFkZENsaWVudCgpIHdpdGggYW55IElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0NvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQ291bnRyeURldGVjdG9yU2VydmljZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2ExNTg1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0NvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0LmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uSUNvdW50cnlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgQ291bnRyeURldGVjdG9yU2VydmljZVRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgY2xhc3MgQ291bnRyeUxpc3RlbmVyVGVzdGVyIGV4dGVuZHMgSUNvdW50cnlMaXN0ZW5lci5TdHViIHsKKyAgICAgICAgcHJpdmF0ZSBDb3VudHJ5IG1Db3VudHJ5OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNvdW50cnlEZXRlY3RlZChDb3VudHJ5IGNvdW50cnkpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgbUNvdW50cnkgPSBjb3VudHJ5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvdW50cnkgZ2V0Q291bnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ291bnRyeTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTm90aWZpZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvdW50cnkgIT0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQ291bnRyeURldGVjdG9yU2VydmljZVRlc3RlciBleHRlbmRzIENvdW50cnlEZXRlY3RvclNlcnZpY2UgeworCisgICAgICAgIHByaXZhdGUgQ291bnRyeUxpc3RlbmVyIG1MaXN0ZW5lcjsKKworICAgICAgICBwdWJsaWMgQ291bnRyeURldGVjdG9yU2VydmljZVRlc3RlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeVJlY2VpdmVycyhDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgICAgIHN1cGVyLm5vdGlmeVJlY2VpdmVycyhjb3VudHJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDb3VudHJ5TGlzdGVuZXIoZmluYWwgQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTGlzdGVuZXJTZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxpc3RlbmVyICE9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTGlzdGVuZXIoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgQ291bnRyeURldGVjdG9yU2VydmljZVRlc3RlciBzZXJ2aWNlVGVzdGVyID0gbmV3IENvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0ZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5zeXN0ZW1SZWFkeSgpOworICAgICAgICB3YWl0Rm9yU3lzdGVtUmVhZHkoc2VydmljZVRlc3Rlcik7CisgICAgICAgIENvdW50cnlMaXN0ZW5lclRlc3RlciBsaXN0ZW5lclRlc3RlciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJUZXN0ZXIoKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5hZGRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXJUZXN0ZXIpOworICAgICAgICBhc3NlcnRUcnVlKHNlcnZpY2VUZXN0ZXIuaXNMaXN0ZW5lclNldCgpKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5yZW1vdmVDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXJUZXN0ZXIpOworICAgICAgICBhc3NlcnRGYWxzZShzZXJ2aWNlVGVzdGVyLmlzTGlzdGVuZXJTZXQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vdGlmeUxpc3RlbmVycygpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlVGVzdGVyIHNlcnZpY2VUZXN0ZXIgPSBuZXcgQ291bnRyeURldGVjdG9yU2VydmljZVRlc3RlcihnZXRDb250ZXh0KCkpOworICAgICAgICBDb3VudHJ5TGlzdGVuZXJUZXN0ZXIgbGlzdGVuZXJUZXN0ZXJBID0gbmV3IENvdW50cnlMaXN0ZW5lclRlc3RlcigpOworICAgICAgICBDb3VudHJ5TGlzdGVuZXJUZXN0ZXIgbGlzdGVuZXJUZXN0ZXJCID0gbmV3IENvdW50cnlMaXN0ZW5lclRlc3RlcigpOworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBuZXcgQ291bnRyeSgiVVMiLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX05FVFdPUkspOworICAgICAgICBzZXJ2aWNlVGVzdGVyLnN5c3RlbVJlYWR5KCk7CisgICAgICAgIHdhaXRGb3JTeXN0ZW1SZWFkeShzZXJ2aWNlVGVzdGVyKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5hZGRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXJUZXN0ZXJBKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5hZGRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXJUZXN0ZXJCKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5ub3RpZnlSZWNlaXZlcnMoY291bnRyeSk7CisgICAgICAgIGFzc2VydFRydWUoc2VydmljZVRlc3Rlci5pc0xpc3RlbmVyU2V0KCkpOworICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyVGVzdGVyQS5pc05vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyVGVzdGVyQi5pc05vdGlmaWVkKCkpOworICAgICAgICBzZXJ2aWNlVGVzdGVyLnJlbW92ZUNvdW50cnlMaXN0ZW5lcihsaXN0ZW5lclRlc3RlckEpOworICAgICAgICBzZXJ2aWNlVGVzdGVyLnJlbW92ZUNvdW50cnlMaXN0ZW5lcihsaXN0ZW5lclRlc3RlckIpOworICAgICAgICBhc3NlcnRGYWxzZShzZXJ2aWNlVGVzdGVyLmlzTGlzdGVuZXJTZXQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JTeXN0ZW1SZWFkeShDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIHNlcnZpY2UpIHsKKyAgICAgICAgaW50IGNvdW50ID0gNTsKKyAgICAgICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZXJ2aWNlLmlzU3lzdGVtUmVhZHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiV2FpdCBTeXN0ZW0gUmVhZHkgdGltZW91dCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9Nb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9Nb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmM5Yjg2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL01vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUXVldWU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgbW9jayB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2V9cy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBleHRlbmRzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHsKKworICAgIC8qKgorICAgICAqIFRoZSBldmVudCB0aGlzIHNlcnZpY2UgZXhwZWN0cyB0byByZWNlaXZlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgUXVldWU8QWNjZXNzaWJpbGl0eUV2ZW50PiBtRXhwZWN0ZWRFdmVudHMgPSBuZXcgTGlua2VkTGlzdDxBY2Nlc3NpYmlsaXR5RXZlbnQ+KCk7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcnJ1cHRpb24gY2FsbCB0aGlzIHNlcnZpY2UgZXhwZWN0cyB0byByZWNlaXZlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtRXhwZWN0ZWRJbnRlcnJ1cHQ7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGlmIHRoZSBtb2NrIGlzIGN1cnJlbnRseSByZXBsYXlpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1SZXBsYXlpbmc7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGlmIHRoZSBzeXN0ZW0gaXMgYm91bmQgYXMgYSBjbGllbnQgdG8gdGhpcyBzZXJ2aWNlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNTeXN0ZW1Cb3VuZEFzQ2xpZW50OworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvfSBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0CisgICAgICogdmFsdWVzLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgZGVmYXVsdCBpbmZvLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGNyZWF0ZURlZmF1bHRJbmZvKCkgeworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gZGVmYXVsdEluZm8gPSBuZXcgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKCk7CisgICAgICAgIGRlZmF1bHRJbmZvLmV2ZW50VHlwZXMgPSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0NMSUNLRUQ7CisgICAgICAgIGRlZmF1bHRJbmZvLmZlZWRiYWNrVHlwZSA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5GRUVEQkFDS19BVURJQkxFOworICAgICAgICBkZWZhdWx0SW5mby5mbGFncyA9IDA7CisgICAgICAgIGRlZmF1bHRJbmZvLm5vdGlmaWNhdGlvblRpbWVvdXQgPSAwOworICAgICAgICBkZWZhdWx0SW5mby5wYWNrYWdlTmFtZXMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgImZvby5iYXIuYmF6IgorICAgICAgICB9OworCisgICAgICAgIHJldHVybiBkZWZhdWx0SW5mbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydHMgcmVwbGF5aW5nIHRoZSBtb2NrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlcGxheSgpIHsKKyAgICAgICAgbVJlcGxheWluZyA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZpZXMgaWYgYWxsIGV4cGVjdGVkIHNlcnZpY2UgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKKyAgICAgICAgaWYgKCFtUmVwbGF5aW5nKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEaWQgeW91IGZvcmdldCB0byBjYWxsIHJlcGxheSgpIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUV4cGVjdGVkSW50ZXJydXB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBjYWxsIHRvICNpbnRlcnJ1cHQoKSBub3QgcmVjZWl2ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1FeHBlY3RlZEV2ZW50cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIGEgY2FsbCB0byBvbkFjY2Vzc2liaWxpdHlFdmVudCgpIGZvciAiCisgICAgICAgICAgICAgICAgICAgICsgImV2ZW50cyBcIiIgKyBtRXhwZWN0ZWRFdmVudHMgKyAiXCIgbm90IHJlY2VpdmVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhpcyBpbnN0YW5jZSBzbyBpdCBjYW4gYmUgcmV1c2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBtRXhwZWN0ZWRFdmVudHMuY2xlYXIoKTsKKyAgICAgICAgbUV4cGVjdGVkSW50ZXJydXB0ID0gZmFsc2U7CisgICAgICAgIG1SZXBsYXlpbmcgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGFuIGV4cGVjdGVkIGNhbGwgdG8KKyAgICAgKiB7QGxpbmsgI29uQWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCl9IHdpdGggZ2l2ZW4gZXZlbnQgYXMKKyAgICAgKiBhcmd1bWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHBlY3RlZEV2ZW50IFRoZSBleHBlY3RlZCBldmVudCBhcmd1bWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleHBlY3RFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgZXhwZWN0ZWRFdmVudCkgeworICAgICAgICBtRXhwZWN0ZWRFdmVudHMuYWRkKGV4cGVjdGVkRXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYW4gZXhwZWN0ZWQgY2FsbCBvZiB7QGxpbmsgI29uSW50ZXJydXB0KCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4cGVjdEludGVycnVwdCgpIHsKKyAgICAgICAgbUV4cGVjdGVkSW50ZXJydXB0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgcmVjZWl2ZWRFdmVudCkgeworICAgICAgICBpZiAoIW1SZXBsYXlpbmcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRXhwZWN0ZWRFdmVudHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGV2ZW50OiAiICsgcmVjZWl2ZWRFdmVudCk7CisgICAgICAgIH0KKworICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXhwZWN0ZWRFdmVudCA9IG1FeHBlY3RlZEV2ZW50cy5wb2xsKCk7CisgICAgICAgIGFzc2VydEVxdWFsc0FjY2Vzc2libGl0eUV2ZW50KGV4cGVjdGVkRXZlbnQsIHJlY2VpdmVkRXZlbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uSW50ZXJydXB0KCkgeworICAgICAgICBpZiAoIW1SZXBsYXlpbmcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUV4cGVjdGVkSW50ZXJydXB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGNhbGwgdG8gb25JbnRlcnJ1cHQoKSIpOworICAgICAgICB9CisKKyAgICAgICAgbUV4cGVjdGVkSW50ZXJydXB0ID0gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKCkgeworICAgICAgICBtSXNTeXN0ZW1Cb3VuZEFzQ2xpZW50ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblVuYmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIG1Jc1N5c3RlbUJvdW5kQXNDbGllbnQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaWYgdGhlIHN5c3RlbSBpcyBib3VuZCBhcyBjbGllbnQgdG8gdGhpcyBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzeXN0ZW0gaXMgYm91bmQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N5c3RlbUJvdW5kQXNDbGllbnQoKSB7CisgICAgICAgIHJldHVybiBtSXNTeXN0ZW1Cb3VuZEFzQ2xpZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmVzIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSA8Y29kZT5leHBlY3RlZEV2ZW50PC9jb2RlPiBhbmQgdGhlCisgICAgICogPGNvZGU+cmVjZXZpZWRFdmVudDwvY29kZT4gdG8gdmVyaWZ5IHRoYXQgdGhlIHJlY2VpdmVkIGV2ZW50IGlzIHRoZSBvbmUKKyAgICAgKiB0aGF0IGlzIGV4cGVjdGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHNBY2Nlc3NpYmxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgZXhwZWN0ZWRFdmVudCwKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCByZWNlaXZlZEV2ZW50KSB7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiYWRkZWRDb3VudCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRBZGRlZENvdW50KCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRBZGRlZENvdW50KCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImJlZm9yZVRleHQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0QmVmb3JlVGV4dCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0QmVmb3JlVGV4dCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJjaGVja2VkIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmlzQ2hlY2tlZCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuaXNDaGVja2VkKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImNsYXNzTmFtZSBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRDbGFzc05hbWUoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldENsYXNzTmFtZSgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJjb250ZW50RGVzY3JpcHRpb24gaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQKKyAgICAgICAgICAgICAgICAuZ2V0Q29udGVudERlc2NyaXB0aW9uKCksIHJlY2VpdmVkRXZlbnQuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImN1cnJlbnRJdGVtSW5kZXggaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQKKyAgICAgICAgICAgICAgICAuZ2V0Q3VycmVudEl0ZW1JbmRleCgpLCByZWNlaXZlZEV2ZW50LmdldEN1cnJlbnRJdGVtSW5kZXgoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiZW5hYmxlZCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5pc0VuYWJsZWQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmlzRW5hYmxlZCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJldmVudFR5cGUgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0RXZlbnRUeXBlKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRFdmVudFR5cGUoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiZnJvbUluZGV4IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldEZyb21JbmRleCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0RnJvbUluZGV4KCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImZ1bGxTY3JlZW4gaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuaXNGdWxsU2NyZWVuKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5pc0Z1bGxTY3JlZW4oKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiaXRlbUNvdW50IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldEl0ZW1Db3VudCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0SXRlbUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHNOb3RpZmljYXRpb25Bc1BhcmNlbGFibGVEYXRhKGV4cGVjdGVkRXZlbnQsIHJlY2VpdmVkRXZlbnQpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoInBhc3N3b3JkIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmlzUGFzc3dvcmQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmlzUGFzc3dvcmQoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygicmVtb3ZlZENvdW50IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldFJlbW92ZWRDb3VudCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0UmVtb3ZlZENvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHNUZXh0KGV4cGVjdGVkRXZlbnQsIHJlY2VpdmVkRXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmVzIHRoZSB7QGxpbmsgYW5kcm9pZC5vcy5QYXJjZWxhYmxlfSBkYXRhIG9mIHRoZQorICAgICAqIDxjb2RlPmV4cGVjdGVkRXZlbnQ8L2NvZGU+IGFuZCA8Y29kZT5yZWNlaXZlZEV2ZW50PC9jb2RlPiB0byB2ZXJpZnkgdGhhdAorICAgICAqIHRoZSByZWNlaXZlZCBldmVudCBpcyB0aGUgb25lIHRoYXQgaXMgZXhwZWN0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEVxdWFsc05vdGlmaWNhdGlvbkFzUGFyY2VsYWJsZURhdGEoQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQsCisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgcmVjZWl2ZWRFdmVudCkgeworICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJwYXJjZWxhYmxlRGF0YSBoYXMgaW5jb3JyZWN0IHZhbHVlIjsKKyAgICAgICAgTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPSAoTWVzc2FnZSkgZXhwZWN0ZWRFdmVudC5nZXRQYXJjZWxhYmxlRGF0YSgpOworICAgICAgICBNZXNzYWdlIHJlY2VpdmVkTWVzc2FnZSA9IChNZXNzYWdlKSByZWNlaXZlZEV2ZW50LmdldFBhcmNlbGFibGVEYXRhKCk7CisKKyAgICAgICAgaWYgKGV4cGVjdGVkTWVzc2FnZSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAocmVjZWl2ZWRNZXNzYWdlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKG1lc3NhZ2UsIHJlY2VpdmVkTWVzc2FnZSk7CisKKyAgICAgICAgLy8gd2UgZG8gYSB2ZXJ5IHNpbXBsZSBzYW5pdHkgY2hlY2sgc2luY2Ugd2UgZG8gbm90IHRlc3QgTWVzc2FnZQorICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWRNZXNzYWdlLndoYXQsIHJlY2VpdmVkTWVzc2FnZS53aGF0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0aGUgdGV4dCBvZiB0aGUgPGNvZGU+ZXhwZWN0ZWRFdmVudDwvY29kZT4gYW5kCisgICAgICogPGNvZGU+cmVjZWl2ZWRFdmVudDwvY29kZT4gYnkgY29tcGFyaW5nIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgICAgICogY29ycmVzcG9uZGluZyB7QGxpbmsgQ2hhclNlcXVlbmNlfXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEVxdWFsc1RleHQoQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQsCisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgcmVjZWl2ZWRFdmVudCkgeworICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJ0ZXh0IGhhcyBpbmNvcnJlY3QgdmFsdWUiOworICAgICAgICBMaXN0PENoYXJTZXF1ZW5jZT4gZXhwZWN0ZWRUZXh0ID0gZXhwZWN0ZWRFdmVudC5nZXRUZXh0KCk7CisgICAgICAgIExpc3Q8Q2hhclNlcXVlbmNlPiByZWNlaXZlZFRleHQgPSByZWNlaXZlZEV2ZW50LmdldFRleHQoKTsKKworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWRUZXh0LnNpemUoKSwgcmVjZWl2ZWRUZXh0LnNpemUoKSk7CisKKyAgICAgICAgSXRlcmF0b3I8Q2hhclNlcXVlbmNlPiBleHBlY3RlZFRleHRJdGVyYXRvciA9IGV4cGVjdGVkVGV4dC5pdGVyYXRvcigpOworICAgICAgICBJdGVyYXRvcjxDaGFyU2VxdWVuY2U+IHJlY2VpdmVkVGV4dEl0ZXJhdG9yID0gcmVjZWl2ZWRUZXh0Lml0ZXJhdG9yKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFRleHQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIC8vIGNvbXBhcmUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbgorICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkVGV4dEl0ZXJhdG9yLm5leHQoKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICByZWNlaXZlZFRleHRJdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvclRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OTY2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIubG9jYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnk7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3JUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIGNsYXNzIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZXh0ZW5kcyBDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yIHsKKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09VTlRSWV9JU08gPSAidXMiOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTG9jYXRpb25CYXNlZERldGVjdG9yU3RvcHBlZDsKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbU5vdGlmaWVkOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbGlzdGVuZXJBZGRlZCA9IGZhbHNlOworCisgICAgICAgIHByaXZhdGUgQ291bnRyeSBtTm90aWZpZWRDb3VudHJ5OworICAgICAgICBwdWJsaWMgVGVzdENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIHN1cGVyKGdldENvbnRleHQoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlMb2NhdGlvbkJhc2VkTGlzdGVuZXIoQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgICAgICBtTm90aWZpZWQgPSB0cnVlOworICAgICAgICAgICAgbU5vdGlmaWVkQ291bnRyeSA9IGNvdW50cnk7CisgICAgICAgICAgICBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rvci5ub3RpZnlMaXN0ZW5lcihjb3VudHJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IgIT0gbnVsbCAmJiBtTG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IgPT0gbnVsbCAmJiBtTG9jYXRpb25CYXNlZERldGVjdG9yU3RvcHBlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGxvY2F0aW9uUmVmcmVzaFN0YXJ0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvY2F0aW9uUmVmcmVzaFRpbWVyICE9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBsb2NhdGlvblJlZnJlc2hDYW5jZWxsZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvY2F0aW9uUmVmcmVzaFRpbWVyID09IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIENvdW50cnlEZXRlY3RvckJhc2UgY3JlYXRlTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ291bnRyeURldGVjdG9yQmFzZShtQ29udGV4dCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBDb3VudHJ5IGRldGVjdENvdW50cnkoKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0TmV0d29ya0Jhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldExhc3RLbm93bkxvY2F0aW9uQmFzZWRDb3VudHJ5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Ob3RpZmllZENvdW50cnk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0U2ltQmFzZWRDb3VudHJ5KCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0TG9jYWxlQ291bnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1bkFmdGVyRGV0ZWN0aW9uQXN5bmMoZmluYWwgQ291bnRyeSBjb3VudHJ5LCBmaW5hbCBDb3VudHJ5IGRldGVjdGVkQ291bnRyeSwKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIG5vdGlmeUNoYW5nZSwgZmluYWwgYm9vbGVhbiBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24pIHsKKyAgICAgICAgICAgIHJ1bkFmdGVyRGV0ZWN0aW9uKGNvdW50cnksIGRldGVjdGVkQ291bnRyeSwgbm90aWZ5Q2hhbmdlLCBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24pOworICAgICAgICB9OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FpcnBsYW5lTW9kZU9mZigpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQaG9uZVN0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBsaXN0ZW5lckFkZGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUGhvbmVTdGF0ZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgbGlzdGVuZXJBZGRlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzR2VvQ29kZXJJbXBsZW1lbnRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQaG9uZVN0YXRlTGlzdGVuZXJBZGRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lckFkZGVkOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBDb3VudHJ5TGlzdGVuZXJJbXBsIGltcGxlbWVudHMgQ291bnRyeUxpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Ob3RpZmllZDsKKyAgICAgICAgcHJpdmF0ZSBDb3VudHJ5IG1Db3VudHJ5OworCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ291bnRyeURldGVjdGVkKENvdW50cnkgY291bnRyeSkgeworICAgICAgICAgICAgbU5vdGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Db3VudHJ5ID0gY291bnRyeTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG5vdGlmaWVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Ob3RpZmllZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb3VudHJ5IGdldENvdW50cnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvdW50cnk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0ZWN0TmV0d29ya0Jhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgZmluYWwgQ291bnRyeSByZXN1bHRDb3VudHJ5ID0gbmV3IENvdW50cnkoCisgICAgICAgICAgICAgICAgVGVzdENvdW50cnlEZXRlY3Rvci5DT1VOVFJZX0lTTywgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9ORVRXT1JLKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBjb3VudHJ5RGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0TmV0d29ya0Jhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q291bnRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBjb3VudHJ5RGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGNvdW50cnksIHJlc3VsdENvdW50cnkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25SZWZyZXNoU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnN0b3AoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0ZWN0TG9jYXRpb25CYXNlZENvdW50cnkoKSB7CisgICAgICAgIGZpbmFsIENvdW50cnkgcmVzdWx0Q291bnRyeSA9IG5ldyBDb3VudHJ5KAorICAgICAgICAgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IuQ09VTlRSWV9JU08sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfU0lNKTsKKyAgICAgICAgZmluYWwgQ291bnRyeSBsb2NhdGlvbkJhc2VkQ291bnRyeSA9IG5ldyBDb3VudHJ5KAorICAgICAgICAgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IuQ09VTlRSWV9JU08sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQVRJT04pOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGNvdW50cnlEZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRTaW1CYXNlZENvdW50cnkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENvdW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gY291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShjb3VudHJ5LCByZXN1bHRDb3VudHJ5KSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5ub3RpZnlMb2NhdGlvbkJhc2VkTGlzdGVuZXIobG9jYXRpb25CYXNlZENvdW50cnkpOworICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGxpc3RlbmVyLmdldENvdW50cnkoKSwgbG9jYXRpb25CYXNlZENvdW50cnkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RvcHBlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25SZWZyZXNoU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnN0b3AoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25SZWZyZXNoQ2FuY2VsbGVkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbGVCYXNlZENvdW50cnkoKSB7CisgICAgICAgIGZpbmFsIENvdW50cnkgcmVzdWx0Q291bnRyeSA9IG5ldyBDb3VudHJ5KAorICAgICAgICAgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IuQ09VTlRSWV9JU08sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQUxFKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBjb3VudHJ5RGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0TG9jYWxlQ291bnRyeSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q291bnRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBjb3VudHJ5RGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGNvdW50cnksIHJlc3VsdENvdW50cnkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaFN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaENhbmNlbGxlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcHBpbmdEZXRlY3RvcigpIHsKKyAgICAgICAgLy8gVGVzdCBzdG9wcGluZyBkZXRlY3RvciB3aGVuIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3Igd2FzIHN0YXJ0ZWQKKyAgICAgICAgZmluYWwgQ291bnRyeSByZXN1bHRDb3VudHJ5ID0gbmV3IENvdW50cnkoCisgICAgICAgICAgICAgICAgVGVzdENvdW50cnlEZXRlY3Rvci5DT1VOVFJZX0lTTywgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9TSU0pOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGNvdW50cnlEZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRTaW1CYXNlZENvdW50cnkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENvdW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gY291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShjb3VudHJ5LCByZXN1bHRDb3VudHJ5KSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgICAgIC8vIFRoZSBMb2NhdGlvbkJhc2VkRGV0ZWN0b3Igc2hvdWxkIGJlIHN0b3BwZWQuCisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQoKSk7CisgICAgICAgIC8vIFRoZSBsb2NhdGlvbiByZWZyZXNoIHNob3VsZCBub3QgcnVubmluZy4KKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25SZWZyZXNoQ2FuY2VsbGVkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhdGlvbkJhc2VkQ291bnRyeU5vdEZvdW5kKCkgeworICAgICAgICBmaW5hbCBDb3VudHJ5IHJlc3VsdENvdW50cnkgPSBuZXcgQ291bnRyeSgKKyAgICAgICAgICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yLkNPVU5UUllfSVNPLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX1NJTSk7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldFNpbUJhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q291bnRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBjb3VudHJ5RGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGNvdW50cnksIHJlc3VsdENvdW50cnkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLm5vdGlmeUxvY2F0aW9uQmFzZWRMaXN0ZW5lcihudWxsKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoc2FtZUNvdW50cnkobGlzdGVuZXIuZ2V0Q291bnRyeSgpLCBudWxsKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaFN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaENhbmNlbGxlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Db3VudHJ5Rm91bmQoKSB7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBjb3VudHJ5RGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGNvdW50cnksIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLm5vdGlmeUxvY2F0aW9uQmFzZWRMaXN0ZW5lcihudWxsKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoc2FtZUNvdW50cnkobGlzdGVuZXIuZ2V0Q291bnRyeSgpLCBudWxsKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaFN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaENhbmNlbGxlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTGlzdGVuZXIoKSB7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5pc1Bob25lU3RhdGVMaXN0ZW5lckFkZGVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKG51bGwpOworICAgICAgICBhc3NlcnRGYWxzZShjb3VudHJ5RGV0ZWN0b3IuaXNQaG9uZVN0YXRlTGlzdGVuZXJBZGRlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RvcHBlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2VvY29kZXJOb3RJbXBsZW1lbnRlZCgpIHsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBjb3VudHJ5RGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNHZW9Db2RlckltcGxlbWVudGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5pc1Bob25lU3RhdGVMaXN0ZW5lckFkZGVkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihudWxsKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY291bnRyeURldGVjdG9yLmlzUGhvbmVTdGF0ZUxpc3RlbmVyQWRkZWQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNhbWVDb3VudHJ5KENvdW50cnkgY291bnRyeTEsIENvdW50cnkgY291bnRyeTIpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50cnkxID09IG51bGwgJiYgY291bnRyeTIgPT0gbnVsbCB8fCBjb3VudHJ5MSAhPSBudWxsICYmIGNvdW50cnkyICE9IG51bGwgJiYKKyAgICAgICAgY291bnRyeTEuZ2V0Q291bnRyeUlzbygpLmVxdWFsc0lnbm9yZUNhc2UoY291bnRyeTIuZ2V0Q291bnRyeUlzbygpKSAmJgorICAgICAgICBjb3VudHJ5MS5nZXRTb3VyY2UoKSA9PSBjb3VudHJ5Mi5nZXRTb3VyY2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvclRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcxZThlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDMyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmxvY2F0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXI7CisKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnk7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3JUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIGNsYXNzIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZXh0ZW5kcyBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9UQUxfUFJPVklERVJTID0gMjsKKyAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBjb3VudHJ5Rm91bmRMb2NrZXIgPSBuZXcgT2JqZWN0KCk7CisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIG5vdGlmeUNvdW50cnkgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMb2NhdGlvbiBtTG9jYXRpb247CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Db3VudHJ5OworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgbVF1ZXJ5TG9jYXRpb25UaW1lb3V0OworICAgICAgICBwcml2YXRlIExpc3Q8TG9jYXRpb25MaXN0ZW5lcj4gbUxpc3RlbmVyczsKKworICAgICAgICBwdWJsaWMgVGVzdENvdW50cnlEZXRlY3RvcihTdHJpbmcgY291bnRyeSwgU3RyaW5nIHByb3ZpZGVyKSB7CisgICAgICAgICAgICB0aGlzKGNvdW50cnksIHByb3ZpZGVyLCAxMDAwICogNjAgKiA1KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUZXN0Q291bnRyeURldGVjdG9yKFN0cmluZyBjb3VudHJ5LCBTdHJpbmcgcHJvdmlkZXIsIGxvbmcgcXVlcnlMb2NhdGlvblRpbWVvdXQpIHsKKyAgICAgICAgICAgIHN1cGVyKGdldENvbnRleHQoKSk7CisgICAgICAgICAgICBtQ291bnRyeSA9IGNvdW50cnk7CisgICAgICAgICAgICBtTG9jYXRpb24gPSBuZXcgTG9jYXRpb24ocHJvdmlkZXIpOworICAgICAgICAgICAgbVF1ZXJ5TG9jYXRpb25UaW1lb3V0ID0gcXVlcnlMb2NhdGlvblRpbWVvdXQ7CisgICAgICAgICAgICBtTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxMb2NhdGlvbkxpc3RlbmVyPigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q291bnRyeUZyb21Mb2NhdGlvbihMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChjb3VudHJ5Rm91bmRMb2NrZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW5vdGlmeUNvdW50cnkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlGb3VuZExvY2tlci53YWl0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtTG9jYXRpb24uZ2V0UHJvdmlkZXIoKS5lbmRzV2l0aChsb2NhdGlvbi5nZXRQcm92aWRlcigpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtQ291bnRyeTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIExvY2F0aW9uIGdldExhc3RLbm93bkxvY2F0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2NhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckVuYWJsZWRQcm92aWRlcnMoTGlzdDxMb2NhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lcnMuYWRkQWxsKGxpc3RlbmVycyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgdW5yZWdpc3RlclByb3ZpZGVycyhMaXN0PExvY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVycykgeworICAgICAgICAgICAgZm9yIChMb2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogbUxvY2F0aW9uTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBsb25nIGdldFF1ZXJ5TG9jYXRpb25UaW1lb3V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1RdWVyeUxvY2F0aW9uVGltZW91dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgaW50IGdldFRvdGFsRW5hYmxlZFByb3ZpZGVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBUT1RBTF9QUk9WSURFUlM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlMb2NhdGlvbkZvdW5kKCkgeworICAgICAgICAgICAgLy8gTGlzdGVuZXIgY291bGQgYmUgcmVtb3ZlZCBpbiB0aGUgbm90aWZpY2F0aW9uLgorICAgICAgICAgICAgTG9jYXRpb25MaXN0ZW5lcltdIGxpc3RlbmVycyA9IG5ldyBMb2NhdGlvbkxpc3RlbmVyW21MaXN0ZW5lcnMuc2l6ZSgpXTsKKyAgICAgICAgICAgIG1Mb2NhdGlvbkxpc3RlbmVycy50b0FycmF5KGxpc3RlbmVycyk7CisgICAgICAgICAgICBmb3IgKExvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOmxpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uTG9jYXRpb25DaGFuZ2VkKG1Mb2NhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldExpc3RlbmVyc0NvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1MaXN0ZW5lcnMuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5Q291bnRyeUZvdW5kKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChjb3VudHJ5Rm91bmRMb2NrZXIpIHsKKyAgICAgICAgICAgICAgICBub3RpZnlDb3VudHJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb3VudHJ5Rm91bmRMb2NrZXIubm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGltZXIgZ2V0VGltZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbVRpbWVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRocmVhZCBnZXRRdWVyeVRocmVhZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUXVlcnlUaHJlYWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIENvdW50cnlMaXN0ZW5lckltcGwgaW1wbGVtZW50cyBDb3VudHJ5TGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWVkOworICAgICAgICBwcml2YXRlIFN0cmluZyBtQ291bnRyeUNvZGU7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ291bnRyeURldGVjdGVkKENvdW50cnkgY291bnRyeSkgeworICAgICAgICAgICAgbU5vdGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChjb3VudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ291bnRyeUNvZGUgPSBjb3VudHJ5LmdldENvdW50cnlJc28oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG5vdGlmaWVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Ob3RpZmllZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q291bnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ291bnRyeUNvZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZGluZ0NvdW50cnkoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudHJ5ID0gInVzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3ZpZGVyID0gIkdvb2QiOworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGNvdW50cnlMaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3Rvcihjb3VudHJ5LCBwcm92aWRlcik7CisgICAgICAgIGRldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihjb3VudHJ5TGlzdGVuZXIpOworICAgICAgICBkZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCBUZXN0Q291bnRyeURldGVjdG9yLlRPVEFMX1BST1ZJREVSUyk7CisgICAgICAgIGRldGVjdG9yLm5vdGlmeUxvY2F0aW9uRm91bmQoKTsKKyAgICAgICAgLy8gQWxsIGxpc3RlbmVycyBzaG91bGQgYmUgdW5yZWdpc3RlcmVkCisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0TnVsbChkZXRlY3Rvci5nZXRUaW1lcigpKTsKKyAgICAgICAgVGhyZWFkIHF1ZXJ5VGhyZWFkID0gd2FpdEZvclF1ZXJ5VGhyZWFkTGF1bmNoZWQoZGV0ZWN0b3IpOworICAgICAgICBkZXRlY3Rvci5ub3RpZnlDb3VudHJ5Rm91bmQoKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgcXVlcnkgdGhyZWFkIGVuZGluZworICAgICAgICB3YWl0Rm9yVGhyZWFkRW5kaW5nKHF1ZXJ5VGhyZWFkKTsKKyAgICAgICAgLy8gUXVlcnlUaHJlYWQgc2hvdWxkIGJlIHNldCB0byBOVUxMCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeUxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoY291bnRyeUxpc3RlbmVyLmdldENvdW50cnkoKSwgY291bnRyeSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRpbmdDb3VudHJ5Q2FuY2VsbGVkKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9ICJ1cyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9ICJHb29kIjsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBjb3VudHJ5TGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoY291bnRyeSwgcHJvdmlkZXIpOworICAgICAgICBkZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIoY291bnRyeUxpc3RlbmVyKTsKKyAgICAgICAgZGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgVGVzdENvdW50cnlEZXRlY3Rvci5UT1RBTF9QUk9WSURFUlMpOworICAgICAgICBkZXRlY3Rvci5ub3RpZnlMb2NhdGlvbkZvdW5kKCk7CisgICAgICAgIC8vIEFsbCBsaXN0ZW5lcnMgc2hvdWxkIGJlIHVucmVnaXN0ZXJlZAorICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgMCk7CisgICAgICAgIC8vIFRoZSB0aW1lIHNob3VsZCBiZSBzdG9wcGVkCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0VGltZXIoKSk7CisgICAgICAgIFRocmVhZCBxdWVyeVRocmVhZCA9IHdhaXRGb3JRdWVyeVRocmVhZExhdW5jaGVkKGRldGVjdG9yKTsKKyAgICAgICAgZGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICAvLyBUaGVyZSBpcyBubyB3YXkgdG8gc3RvcCB0aGUgdGhyZWFkLCBsZXQncyB0ZXN0IGl0IGNvdWxkIGJlIHN0b3BwZWQsIGFmdGVyIGdldCBjb3VudHJ5CisgICAgICAgIGRldGVjdG9yLm5vdGlmeUNvdW50cnlGb3VuZCgpOworICAgICAgICAvLyBXYWl0IGZvciBxdWVyeSB0aHJlYWQgZW5kaW5nCisgICAgICAgIHdhaXRGb3JUaHJlYWRFbmRpbmcocXVlcnlUaHJlYWQpOworICAgICAgICAvLyBRdWVyeVRocmVhZCBzaG91bGQgYmUgc2V0IHRvIE5VTEwKKyAgICAgICAgYXNzZXJ0TnVsbChkZXRlY3Rvci5nZXRRdWVyeVRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5TGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjb3VudHJ5TGlzdGVuZXIuZ2V0Q291bnRyeSgpLCBjb3VudHJ5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZGluZ0xvY2F0aW9uQ2FuY2VsbGVkKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9ICJ1cyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9ICJHb29kIjsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBjb3VudHJ5TGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoY291bnRyeSwgcHJvdmlkZXIpOworICAgICAgICBkZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIoY291bnRyeUxpc3RlbmVyKTsKKyAgICAgICAgZGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgVGVzdENvdW50cnlEZXRlY3Rvci5UT1RBTF9QUk9WSURFUlMpOworICAgICAgICBkZXRlY3Rvci5zdG9wKCk7CisgICAgICAgIC8vIEFsbCBsaXN0ZW5lcnMgc2hvdWxkIGJlIHVucmVnaXN0ZXJlZAorICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgMCk7CisgICAgICAgIC8vIFRoZSB0aW1lIHNob3VsZCBiZSBzdG9wcGVkCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0VGltZXIoKSk7CisgICAgICAgIC8vIFF1ZXJ5VGhyZWFkIHNob3VsZCBzdGlsbCBiZSBOVUxMCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvdW50cnlMaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZGluZ0xvY2F0aW9uRmFpbGVkKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9ICJ1cyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9ICJHb29kIjsKKyAgICAgICAgbG9uZyB0aW1lb3V0ID0gMTAwMDsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBkZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKGNvdW50cnksIHByb3ZpZGVyLCB0aW1lb3V0KSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBMb2NhdGlvbiBnZXRMYXN0S25vd25Mb2NhdGlvbigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBjb3VudHJ5TGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBkZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIoY291bnRyeUxpc3RlbmVyKTsKKyAgICAgICAgZGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgVGVzdENvdW50cnlEZXRlY3Rvci5UT1RBTF9QUk9WSURFUlMpOworICAgICAgICB3YWl0Rm9yVGltZXJSZXNldChkZXRlY3Rvcik7CisgICAgICAgIC8vIEFsbCBsaXN0ZW5lcnMgc2hvdWxkIGJlIHVucmVnaXN0ZXJlZAorICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgMCk7CisgICAgICAgIC8vIFF1ZXJ5VGhyZWFkIHNob3VsZCBzdGlsbCBiZSBOVUxMCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeUxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnROdWxsKGNvdW50cnlMaXN0ZW5lci5nZXRDb3VudHJ5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kaW5nQ291bnRyeUZhaWxlZCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSAidXMiOworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXIgPSAiR29vZCI7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3Rvcihjb3VudHJ5LCBwcm92aWRlcikgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvdW50cnlGcm9tTG9jYXRpb24oTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNvdW50cnlGb3VuZExvY2tlcikgeworICAgICAgICAgICAgICAgICAgICBpZiAoISBub3RpZnlDb3VudHJ5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlGb3VuZExvY2tlci53YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gV2UgZGlkbid0IGZpbmQgY291bnRyeS4KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBjb3VudHJ5TGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBkZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIoY291bnRyeUxpc3RlbmVyKTsKKyAgICAgICAgZGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgVGVzdENvdW50cnlEZXRlY3Rvci5UT1RBTF9QUk9WSURFUlMpOworICAgICAgICBkZXRlY3Rvci5ub3RpZnlMb2NhdGlvbkZvdW5kKCk7CisgICAgICAgIC8vIEFsbCBsaXN0ZW5lcnMgc2hvdWxkIGJlIHVucmVnaXN0ZXJlZAorICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgMCk7CisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0VGltZXIoKSk7CisgICAgICAgIFRocmVhZCBxdWVyeVRocmVhZCA9IHdhaXRGb3JRdWVyeVRocmVhZExhdW5jaGVkKGRldGVjdG9yKTsKKyAgICAgICAgZGV0ZWN0b3Iubm90aWZ5Q291bnRyeUZvdW5kKCk7CisgICAgICAgIC8vIFdhaXQgZm9yIHF1ZXJ5IHRocmVhZCBlbmRpbmcKKyAgICAgICAgd2FpdEZvclRocmVhZEVuZGluZyhxdWVyeVRocmVhZCk7CisgICAgICAgIC8vIFF1ZXJ5VGhyZWFkIHNob3VsZCBiZSBzZXQgdG8gTlVMTAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCkpOworICAgICAgICAvLyBDb3VudHJ5TGlzdGVuZXIgc2hvdWxkIGJlIG5vdGlmaWVkCisgICAgICAgIGFzc2VydFRydWUoY291bnRyeUxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnROdWxsKGNvdW50cnlMaXN0ZW5lci5nZXRDb3VudHJ5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kaW5nQ291bnRyeVdpdGhMYXN0S25vd25Mb2NhdGlvbigpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSAidXMiOworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXIgPSAiR29vZCI7CisgICAgICAgIGxvbmcgdGltZW91dCA9IDEwMDA7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3Rvcihjb3VudHJ5LCBwcm92aWRlciwgdGltZW91dCk7CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgY291bnRyeUxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgZGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGNvdW50cnlMaXN0ZW5lcik7CisgICAgICAgIGRldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIFRlc3RDb3VudHJ5RGV0ZWN0b3IuVE9UQUxfUFJPVklERVJTKTsKKyAgICAgICAgd2FpdEZvclRpbWVyUmVzZXQoZGV0ZWN0b3IpOworICAgICAgICAvLyBBbGwgbGlzdGVuZXJzIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIDApOworICAgICAgICBUaHJlYWQgcXVlcnlUaHJlYWQgPSB3YWl0Rm9yUXVlcnlUaHJlYWRMYXVuY2hlZChkZXRlY3Rvcik7CisgICAgICAgIGRldGVjdG9yLm5vdGlmeUNvdW50cnlGb3VuZCgpOworICAgICAgICAvLyBXYWl0IGZvciBxdWVyeSB0aHJlYWQgZW5kaW5nCisgICAgICAgIHdhaXRGb3JUaHJlYWRFbmRpbmcocXVlcnlUaHJlYWQpOworICAgICAgICAvLyBRdWVyeVRocmVhZCBzaG91bGQgYmUgc2V0IHRvIE5VTEwKKyAgICAgICAgYXNzZXJ0TnVsbChkZXRlY3Rvci5nZXRRdWVyeVRocmVhZCgpKTsKKyAgICAgICAgLy8gQ291bnRyeUxpc3RlbmVyIHNob3VsZCBiZSBub3RpZmllZAorICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlMaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50cnlMaXN0ZW5lci5nZXRDb3VudHJ5KCksIGNvdW50cnkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yVGltZXJSZXNldChUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgIGludCBjb3VudCA9IDU7CisgICAgICAgIGxvbmcgaW50ZXJ2YWwgPSAxMDAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKGNvdW50LS0gPiAwICYmIGRldGVjdG9yLmdldFRpbWVyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChpbnRlcnZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBUaW1lciB0aW1lciA9IGRldGVjdG9yLmdldFRpbWVyKCk7CisgICAgICAgIGFzc2VydFRydWUodGltZXIgPT0gbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JUaHJlYWRFbmRpbmcoVGhyZWFkIHRocmVhZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhyZWFkLmpvaW4oNTAwMCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFRocmVhZCB3YWl0Rm9yUXVlcnlUaHJlYWRMYXVuY2hlZChUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgIGludCBjb3VudCA9IDU7CisgICAgICAgIGxvbmcgaW50ZXJ2YWwgPSAxMDAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKGNvdW50LS0gPiAwICYmIGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChpbnRlcnZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBUaHJlYWQgdGhyZWFkID0gZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0aHJlYWQgIT0gbnVsbCk7CisgICAgICAgIHJldHVybiB0aHJlYWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyLmphdmEKaW5kZXggOGE0NzMzOS4uZmZhYmI3YiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlci5qYXZhCkBAIC0xNiw4MyArMTYsMjAwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZWxlcGhvbnk7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmkxOG4ucGhvbmVudW1iZXJzLkFzWW91VHlwZUZvcm1hdHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmkxOG4ucGhvbmVudW1iZXJzLlBob25lTnVtYmVyVXRpbDsKKworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRXYXRjaGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogLyoqCi0gKiBXYXRjaGVzIGEge0BsaW5rIFRleHRWaWV3fSBhbmQgaWYgYSBwaG9uZSBudW1iZXIgaXMgZW50ZXJlZCB3aWxsIGZvcm1hdCBpdCB1c2luZwotICoge0BsaW5rIFBob25lTnVtYmVyVXRpbHMjZm9ybWF0TnVtYmVyKEVkaXRhYmxlLCBpbnQpfS4gVGhlIGZvcm1hdHRpbmcgaXMgYmFzZWQgb24KLSAqIHRoZSBjdXJyZW50IHN5c3RlbSBsb2NhbGUgd2hlbiB0aGlzIG9iamVjdCBpcyBjcmVhdGVkIGFuZCBmdXR1cmUgbG9jYWxlIGNoYW5nZXMKLSAqIG1heSBub3QgdGFrZSBlZmZlY3Qgb24gdGhpcyBpbnN0YW5jZS4KKyAqIFdhdGNoZXMgYSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXd9IGFuZCBpZiBhIHBob25lIG51bWJlciBpcyBlbnRlcmVkCisgKiB3aWxsIGZvcm1hdCBpdC4KKyAqIDxwPgorICogU3RvcCBmb3JtYXR0aW5nIHdoZW4gdGhlIHVzZXIKKyAqIDx1bD4KKyAqIDxsaT5JbnB1dHMgbm9uLWRpYWxhYmxlIGNoYXJhY3RlcnM8L2xpPgorICogPGxpPlJlbW92ZXMgdGhlIHNlcGFyYXRvciBpbiB0aGUgbWlkZGxlIG9mIHN0cmluZy48L2xpPgorICogPC91bD4KKyAqIDxwPgorICogVGhlIGZvcm1hdHRpbmcgd2lsbCBiZSByZXN0YXJ0ZWQgb25jZSB0aGUgdGV4dCBpcyBjbGVhcmVkLgogICovCiBwdWJsaWMgY2xhc3MgUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIgaW1wbGVtZW50cyBUZXh0V2F0Y2hlciB7CisgICAgLyoqCisgICAgICogT25lIG9yIG1vcmUgY2hhcmFjdGVycyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgZW5kLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVEFURV9SRU1PVkVfTEFTVCA9IDA7CiAKLSAgICBzdGF0aWMgcHJpdmF0ZSBpbnQgc0Zvcm1hdFR5cGU7Ci0gICAgc3RhdGljIHByaXZhdGUgTG9jYWxlIHNDYWNoZWRMb2NhbGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Gb3JtYXR0aW5nOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRGVsZXRpbmdIeXBoZW47Ci0gICAgcHJpdmF0ZSBpbnQgbUh5cGhlblN0YXJ0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtRGVsZXRpbmdCYWNrd2FyZDsKKyAgICAvKioKKyAgICAgKiBPbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIHdlcmUgYXBwZW5kZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX0FQUEVORCA9IDE7CiAKKyAgICAvKioKKyAgICAgKiBPbmUgb3IgbW9yZSBkaWdpdHMgd2VyZSBjaGFuZ2VkIGluIHRoZSBiZWdpbm5pbmcgb3IgdGhlIG1pZGRsZSBvZiB0ZXh0LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVEFURV9NT0RJRllfRElHSVRTID0gMjsKKworICAgIC8qKgorICAgICAqIFRoZSBjaGFuZ2VzIG90aGVyIHRoYW4gdGhlIGFib3ZlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVEFURV9PVEhFUiA9IDM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RhdGUgb2YgdGhpcyBjaGFuZ2UgY291bGQgYmUgb25lIHZhbHVlIG9mIHRoZSBhYm92ZQorICAgICAqLworICAgIHByaXZhdGUgaW50IG1TdGF0ZTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGUgY2hhbmdlIHdhcyBjYXVzZWQgYnkgb3Vyc2VsdmVzLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtU2VsZkNoYW5nZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoZSBmb3JtYXR0aW5nIGhhcyBiZWVuIHN0b3BwZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1TdG9wRm9ybWF0dGluZzsKKworICAgIHByaXZhdGUgQXNZb3VUeXBlRm9ybWF0dGVyIG1Gb3JtYXR0ZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZm9ybWF0dGluZyBpcyBiYXNlZCBvbiB0aGUgY3VycmVudCBzeXN0ZW0gbG9jYWxlIGFuZCBmdXR1cmUgbG9jYWxlIGNoYW5nZXMKKyAgICAgKiBtYXkgbm90IHRha2UgZWZmZWN0IG9uIHRoaXMgaW5zdGFuY2UuCisgICAgICovCiAgICAgcHVibGljIFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyKCkgewotICAgICAgICBpZiAoc0NhY2hlZExvY2FsZSA9PSBudWxsIHx8IHNDYWNoZWRMb2NhbGUgIT0gTG9jYWxlLmdldERlZmF1bHQoKSkgewotICAgICAgICAgICAgc0NhY2hlZExvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0gICAgICAgICAgICBzRm9ybWF0VHlwZSA9IFBob25lTnVtYmVyVXRpbHMuZ2V0Rm9ybWF0VHlwZUZvckxvY2FsZShzQ2FjaGVkTG9jYWxlKTsKLSAgICAgICAgfQorICAgICAgICB0aGlzKExvY2FsZS5nZXREZWZhdWx0KCkuZ2V0Q291bnRyeSgpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSB0ZXh0KSB7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0byBpZ25vcmUgY2FsbHMgdG8gYWZ0ZXJUZXh0Q2hhbmdlZCBjYXVzZWQgYnkgdGhlIHdvcmsgZG9uZSBiZWxvdwotICAgICAgICBpZiAoIW1Gb3JtYXR0aW5nKSB7Ci0gICAgICAgICAgICBtRm9ybWF0dGluZyA9IHRydWU7Ci0KLSAgICAgICAgICAgIC8vIElmIGRlbGV0aW5nIHRoZSBoeXBoZW4sIGFsc28gZGVsZXRlIHRoZSBjaGFyIGJlZm9yZSBvciBhZnRlciB0aGF0Ci0gICAgICAgICAgICBpZiAobURlbGV0aW5nSHlwaGVuICYmIG1IeXBoZW5TdGFydCA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobURlbGV0aW5nQmFja3dhcmQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1IeXBoZW5TdGFydCAtIDEgPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LmRlbGV0ZShtSHlwaGVuU3RhcnQgLSAxLCBtSHlwaGVuU3RhcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtSHlwaGVuU3RhcnQgPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQuZGVsZXRlKG1IeXBoZW5TdGFydCwgbUh5cGhlblN0YXJ0ICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcih0ZXh0LCBzRm9ybWF0VHlwZSk7Ci0KLSAgICAgICAgICAgIG1Gb3JtYXR0aW5nID0gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBUaGUgZm9ybWF0dGluZyBpcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gPGNvZGU+Y291bnRyeUNvZGU8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNvdW50cnlDb2RlIHRoZSBJU08gMzE2Ni0xIHR3by1sZXR0ZXIgY291bnRyeSBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBjb3VudHJ5L3JlZ2lvbgorICAgICAqIHdoZXJlIHRoZSBwaG9uZSBudW1iZXIgaXMgYmVpbmcgZW50ZXJlZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyKFN0cmluZyBjb3VudHJ5Q29kZSkgeworICAgICAgICBpZiAoY291bnRyeUNvZGUgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICBtRm9ybWF0dGVyID0gUGhvbmVOdW1iZXJVdGlsLmdldEluc3RhbmNlKCkuZ2V0QXNZb3VUeXBlRm9ybWF0dGVyKGNvdW50cnlDb2RlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsIGludCBhZnRlcikgewotICAgICAgICAvLyBDaGVjayBpZiB0aGUgdXNlciBpcyBkZWxldGluZyBhIGh5cGhlbgotICAgICAgICBpZiAoIW1Gb3JtYXR0aW5nKSB7Ci0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdXNlciBpcyBkZWxldGluZyBvbmUgY2hhciwgd2l0aG91dCBhIHNlbGVjdGlvbgotICAgICAgICAgICAgZmluYWwgaW50IHNlbFN0YXJ0ID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KHMpOwotICAgICAgICAgICAgZmluYWwgaW50IHNlbEVuZCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQocyk7Ci0gICAgICAgICAgICBpZiAocy5sZW5ndGgoKSA+IDEgLy8gQ2FuIGRlbGV0ZSBhbm90aGVyIGNoYXJhY3RlcgotICAgICAgICAgICAgICAgICAgICAmJiBjb3VudCA9PSAxIC8vIERlbGV0aW5nIG9ubHkgb25lIGNoYXJhY3RlcgotICAgICAgICAgICAgICAgICAgICAmJiBhZnRlciA9PSAwIC8vIERlbGV0aW5nCi0gICAgICAgICAgICAgICAgICAgICYmIHMuY2hhckF0KHN0YXJ0KSA9PSAnLScgLy8gYSBoeXBoZW4KLSAgICAgICAgICAgICAgICAgICAgJiYgc2VsU3RhcnQgPT0gc2VsRW5kKSB7IC8vIG5vIHNlbGVjdGlvbgotICAgICAgICAgICAgICAgIG1EZWxldGluZ0h5cGhlbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUh5cGhlblN0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHVzZXIgaXMgZGVsZXRpbmcgZm9yd2FyZCBvciBiYWNrd2FyZAotICAgICAgICAgICAgICAgIGlmIChzZWxTdGFydCA9PSBzdGFydCArIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgbURlbGV0aW5nQmFja3dhcmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZWxldGluZ0JhY2t3YXJkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRGVsZXRpbmdIeXBoZW4gPSBmYWxzZTsKLSAgICAgICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsCisgICAgICAgICAgICBpbnQgYWZ0ZXIpIHsKKyAgICAgICAgaWYgKG1TZWxmQ2hhbmdlIHx8IG1TdG9wRm9ybWF0dGluZykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChjb3VudCA9PSAwICYmIHMubGVuZ3RoKCkgPT0gc3RhcnQpIHsKKyAgICAgICAgICAgIC8vIEFwcGVuZCBvbmUgb3IgbW9yZSBuZXcgY2hhcnMKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0FQUEVORDsKKyAgICAgICAgfSBlbHNlIGlmIChhZnRlciA9PSAwICYmIHN0YXJ0ICsgY291bnQgPT0gcy5sZW5ndGgoKSAmJiBjb3VudCA+IDApIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSBvbmUgb3IgbW9yZSBjaGFycyBmcm9tIHRoZSBlbmQgb2Ygc3RyaW5nLgorICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUkVNT1ZFX0xBU1Q7CisgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPiAwICYmICFoYXNTZXBhcmF0b3Iocywgc3RhcnQsIGNvdW50KSkgeworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBkaWFsYWJsZSBjaGFycyBpbiB0aGUgYmVnaW4gb3IgbWlkZGxlIG9mIHRleHQuCisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9NT0RJRllfRElHSVRTOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfT1RIRVI7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBiZWZvcmUsIGludCBjb3VudCkgewotICAgICAgICAvLyBEb2VzIG5vdGhpbmcKKyAgICAgICAgaWYgKG1TZWxmQ2hhbmdlIHx8IG1TdG9wRm9ybWF0dGluZykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfT1RIRVIpIHsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IDAgJiYgIWhhc1NlcGFyYXRvcihzLCBzdGFydCwgY291bnQpKSB7CisgICAgICAgICAgICAgICAgLy8gVXNlciBpbnNlcnRlZCB0aGUgZGlhbGFibGUgY2hhcmFjdGVycyBpbiB0aGUgbWlkZGxlIG9mIHRleHQuCisgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfTU9ESUZZX0RJR0lUUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHdlIHNob3VsZCBzdG9wIGZvcm1hdHRpbmcuCisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQVBQRU5EICYmIGNvdW50ID4gMCAmJiBoYXNTZXBhcmF0b3Iocywgc3RhcnQsIGNvdW50KSkgeworICAgICAgICAgICAgLy8gVXNlciBhcHBlbmRlZCB0aGUgbm9uLWRpYWxhYmxlIGNoYXJhY3Rlciwgc3RvcCBmb3JtYXR0aW5nLgorICAgICAgICAgICAgc3RvcEZvcm1hdHRpbmcoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfT1RIRVIpIHsKKyAgICAgICAgICAgIC8vIFVzZXIgbXVzdCBpbnNlcnQgb3IgcmVtb3ZlIHRoZSBub24tZGlhbGFibGUgY2hhcmFjdGVycyBpbiB0aGUgYmVnaW4gb3IgbWlkZGxlIG9mCisgICAgICAgICAgICAvLyBudW1iZXIsIHN0b3AgZm9ybWF0dGluZy4KKyAgICAgICAgICAgIHN0b3BGb3JtYXR0aW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSBzKSB7CisgICAgICAgIGlmIChtU3RvcEZvcm1hdHRpbmcpIHsKKyAgICAgICAgICAgIC8vIFJlc3RhcnQgdGhlIGZvcm1hdHRpbmcgd2hlbiBhbGwgdGV4dHMgd2VyZSBjbGVhci4KKyAgICAgICAgICAgIG1TdG9wRm9ybWF0dGluZyA9ICEocy5sZW5ndGgoKSA9PSAwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobVNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZSB0aGUgY2hhbmdlIGNhdXNlZCBieSBzLnJlcGxhY2UoKS4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZm9ybWF0dGVkID0gcmVmb3JtYXQocywgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChzKSk7CisgICAgICAgIGlmIChmb3JtYXR0ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IHJlbWVtYmVyZWRQb3MgPSBtRm9ybWF0dGVyLmdldFJlbWVtYmVyZWRQb3NpdGlvbigpOworICAgICAgICAgICAgbVNlbGZDaGFuZ2UgPSB0cnVlOworICAgICAgICAgICAgcy5yZXBsYWNlKDAsIHMubGVuZ3RoKCksIGZvcm1hdHRlZCwgMCwgZm9ybWF0dGVkLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIC8vIFRoZSB0ZXh0IGNvdWxkIGJlIGNoYW5nZWQgYnkgb3RoZXIgVGV4dFdhdGNoZXIgYWZ0ZXIgd2UgY2hhbmdlZCBpdC4gSWYgd2UgZm91bmQgdGhlCisgICAgICAgICAgICAvLyB0ZXh0IGlzIG5vdCB0aGUgb25lIHdlIHdlcmUgZXhwZWN0aW5nLCBqdXN0IGdpdmUgdXAgY2FsbGluZyBzZXRTZWxlY3Rpb24oKS4KKyAgICAgICAgICAgIGlmIChmb3JtYXR0ZWQuZXF1YWxzKHMudG9TdHJpbmcoKSkpIHsKKyAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKHMsIHJlbWVtYmVyZWRQb3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNlbGZDaGFuZ2UgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIHRoZSBmb3JtYXR0ZWQgbnVtYmVyIGJ5IGlnbm9yaW5nIGFsbCBub24tZGlhbGFibGUgY2hhcnMgYW5kIHN0aWNrIHRoZSBjdXJzb3IgdG8gdGhlCisgICAgICogbmVhcmVzdCBkaWFsYWJsZSBjaGFyIHRvIHRoZSBsZWZ0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBudW1iZXIgaXMgICg2NTApIDEyMy00NTY3OCBhbmQgJzQnIGlzCisgICAgICogcmVtb3ZlZCB0aGVuIHRoZSBjdXJzb3Igc2hvdWxkIGJlIGJlaGluZCAnMycgaW5zdGVhZCBvZiAnLScuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVmb3JtYXQoQ2hhclNlcXVlbmNlIHMsIGludCBjdXJzb3IpIHsKKyAgICAgICAgLy8gVGhlIGluZGV4IG9mIGNoYXIgdG8gdGhlIGxlZnR3YXJkIG9mIHRoZSBjdXJzb3IuCisgICAgICAgIGludCBjdXJJbmRleCA9IGN1cnNvciAtIDE7CisgICAgICAgIFN0cmluZyBmb3JtYXR0ZWQgPSBudWxsOworICAgICAgICBtRm9ybWF0dGVyLmNsZWFyKCk7CisgICAgICAgIGNoYXIgbGFzdE5vblNlcGFyYXRvciA9IDA7CisgICAgICAgIGJvb2xlYW4gaGFzQ3Vyc29yID0gZmFsc2U7CisgICAgICAgIGludCBsZW4gPSBzLmxlbmd0aCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChQaG9uZU51bWJlclV0aWxzLmlzTm9uU2VwYXJhdG9yKGMpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxhc3ROb25TZXBhcmF0b3IgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQgPSBnZXRGb3JtYXR0ZWROdW1iZXIobGFzdE5vblNlcGFyYXRvciwgaGFzQ3Vyc29yKTsKKyAgICAgICAgICAgICAgICAgICAgaGFzQ3Vyc29yID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhc3ROb25TZXBhcmF0b3IgPSBjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPT0gY3VySW5kZXgpIHsKKyAgICAgICAgICAgICAgICBoYXNDdXJzb3IgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChsYXN0Tm9uU2VwYXJhdG9yICE9IDApIHsKKyAgICAgICAgICAgIGZvcm1hdHRlZCA9IGdldEZvcm1hdHRlZE51bWJlcihsYXN0Tm9uU2VwYXJhdG9yLCBoYXNDdXJzb3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmb3JtYXR0ZWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Rm9ybWF0dGVkTnVtYmVyKGNoYXIgbGFzdE5vblNlcGFyYXRvciwgYm9vbGVhbiBoYXNDdXJzb3IpIHsKKyAgICAgICAgcmV0dXJuIGhhc0N1cnNvciA/IG1Gb3JtYXR0ZXIuaW5wdXREaWdpdEFuZFJlbWVtYmVyUG9zaXRpb24obGFzdE5vblNlcGFyYXRvcikKKyAgICAgICAgICAgICAgICA6IG1Gb3JtYXR0ZXIuaW5wdXREaWdpdChsYXN0Tm9uU2VwYXJhdG9yKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RvcEZvcm1hdHRpbmcoKSB7CisgICAgICAgIG1TdG9wRm9ybWF0dGluZyA9IHRydWU7CisgICAgICAgIG1Gb3JtYXR0ZXIuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzU2VwYXJhdG9yKGZpbmFsIENoYXJTZXF1ZW5jZSBzLCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCBjb3VudCkgeworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBzdGFydCArIGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKCFQaG9uZU51bWJlclV0aWxzLmlzTm9uU2VwYXJhdG9yKGMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHMuamF2YQppbmRleCA3ODI5MDA2Li40ZjJkOTBmIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlscy5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGVsZXBob255OwogCitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5OdW1iZXJQYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmkxOG4ucGhvbmVudW1iZXJzLlBob25lTnVtYmVyVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmkxOG4ucGhvbmVudW1iZXJzLlBob25lTnVtYmVyVXRpbC5QaG9uZU51bWJlckZvcm1hdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmkxOG4ucGhvbmVudW1iZXJzLlBob25lbnVtYmVyLlBob25lTnVtYmVyOworCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKQEAgLTYxNyw3ICs2MjIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gSW4gdGhlIFVTLCAxLTY1MC01NTUtMTIzNCBtdXN0IGJlIGVxdWFsIHRvIDY1MC01NTUtMTIzNCwKLSAgICAgICAgICAgIC8vIHdoaWxlIDA5MC0xMjM0LTEyMzQgbXVzdCBub3QgYmUgZXF1YWx0IHRvIDkwLTEyMzQtMTIzNCBpbiBKYXBhbi4KKyAgICAgICAgICAgIC8vIHdoaWxlIDA5MC0xMjM0LTEyMzQgbXVzdCBub3QgYmUgZXF1YWwgdG8gOTAtMTIzNC0xMjM0IGluIEphcGFuLgogICAgICAgICAgICAgLy8gVGhpcyByZXF1ZXN0IGV4aXN0cyBqdXN0IGluIFVTICh3aXRoIDEgdHJ1bmsgKE5ERCkgcHJlZml4KS4KICAgICAgICAgICAgIC8vIEluIGFkZGl0aW9uLCAiMDExIDExIDcwMDU1NTQxNDEiIG11c3Qgbm90IGVxdWFsIHRvICIrMTcwMDU1NTQxNDEiLAogICAgICAgICAgICAgLy8gd2hpbGUgIjAxMSAxIDcwMDU1NTQxNDEiIG11c3QgZXF1YWwgdG8gIisxNzAwNTU1NDE0MSIKQEAgLTc3OSwxMCArNzg0LDEwIEBACiAgICAgICAgIGlmIChwcmVwZW5kUGx1cykgewogICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiAiaW50ZXJuYXRpb25hbCBudW1iZXIiIGFuZCBzaG91bGQgaGF2ZQogICAgICAgICAgICAgLy8gYSBwbHVzIHByZXBlbmRlZCB0byB0aGUgZGlhbGluZyBudW1iZXIuIEJ1dCB0aGVyZQotICAgICAgICAgICAgLy8gY2FuIGFsc28gYmUgR3NtIE1NSSBjb2RlcyBhcyBkZWZpbmVkIGluIFRTIDIyLjAzMCA2LjUuMgorICAgICAgICAgICAgLy8gY2FuIGFsc28gYmUgR1NNIE1NSSBjb2RlcyBhcyBkZWZpbmVkIGluIFRTIDIyLjAzMCA2LjUuMgogICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBoYW5kbGUgdGhvc2UgYWxzby4KICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBodHRwOi8vd2ViLnRlbGlhLmNvbS9+dTQ3OTA0Nzc2L2dzbWtvZGUuaHRtIGlzIGEKKyAgICAgICAgICAgIC8vIGh0dHA6Ly93ZWIudGVsaWEuY29tL351NDc5MDQ3NzYvZ3Nta29kZS5odG0KICAgICAgICAgICAgIC8vIGhhcyBhIG5pY2UgbGlzdCBvZiBzb21lIG9mIHRoZXNlIEdTTSBjb2Rlcy4KICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAvLyBFeGFtcGxlcyBhcmU6CkBAIC04NzAsMTAgKzg3NSwxMCBAQAogCiAgICAgICAgICAgICAvLyBGSVhNRShta2YpIFRTIDIzLjA0MCA5LjEuMi4zIHNheXMKICAgICAgICAgICAgIC8vICJpZiBhIG1vYmlsZSByZWNlaXZlcyAxMTExIGluIGEgcG9zaXRpb24gcHJpb3IgdG8KLSAgICAgICAgICAgIC8vIHRoZSBsYXN0IHNlbWktb2N0ZXQgdGhlbiBwcm9jZXNzaW5nIHNoYWxsIGNvbW1lbnNlIHdpdGgKKyAgICAgICAgICAgIC8vIHRoZSBsYXN0IHNlbWktb2N0ZXQgdGhlbiBwcm9jZXNzaW5nIHNoYWxsIGNvbW1lbmNlIHdpdGgKICAgICAgICAgICAgIC8vIHRoZSBuZXh0IHNlbWktb2N0ZXQgYW5kIHRoZSBpbnRlcnZlbmluZwogICAgICAgICAgICAgLy8gc2VtaS1vY3RldCBzaGFsbCBiZSBpZ25vcmVkIgotICAgICAgICAgICAgLy8gSG93IGRvZXMgdGhpcyBqaXZlIHdpdGggMjQsMDA4IDEwLjUuNC43CisgICAgICAgICAgICAvLyBIb3cgZG9lcyB0aGlzIGppdmUgd2l0aCAyNC4wMDggMTAuNS40LjcKIAogICAgICAgICAgICAgYiA9IChieXRlKSgoYnl0ZXNbaV0gPj4gNCkgJiAweGYpOwogCkBAIC0xMDA0LDcgKzEwMDksNyBAQAogICAgICAqIENvbnZlcnQgYSBkaWFsaW5nIG51bWJlciB0byBCQ0QgYnl0ZSBhcnJheQogICAgICAqCiAgICAgICogQHBhcmFtIG51bWJlciBkaWFsaW5nIG51bWJlciBzdHJpbmcKLSAgICAgKiAgICAgICAgaWYgdGhlIGRpYWxpbmcgbnVtYmVyIHN0YXJ0cyB3aXRoICcrJywgc2V0IHRvIGludGVybmF0aW9ubCBUT0EKKyAgICAgKiAgICAgICAgaWYgdGhlIGRpYWxpbmcgbnVtYmVyIHN0YXJ0cyB3aXRoICcrJywgc2V0IHRvIGludGVybmF0aW9uYWwgVE9BCiAgICAgICogQHJldHVybiBCQ0QgYnl0ZSBhcnJheQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdCkBAIC0xMTA4LDEwICsxMTEzLDEwIEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBwaG9uZSBudW1iZXIgdG8gZm9ybWF0CiAgICAgICogQHBhcmFtIGRlZmF1bHRGb3JtYXR0aW5nVHlwZSBUaGUgZGVmYXVsdCBmb3JtYXR0aW5nIHJ1bGVzIHRvIGFwcGx5IGlmIHRoZSBudW1iZXIgZG9lcwotICAgICAqIG5vdCBiZWdpbiB3aXRoICs8Y291bnRyeV9jb2RlPgorICAgICAqIG5vdCBiZWdpbiB3aXRoICtbY291bnRyeV9jb2RlXQogICAgICAqIEByZXR1cm4gVGhlIHBob25lIG51bWJlciBmb3JtYXR0ZWQgd2l0aCB0aGUgZ2l2ZW4gZm9ybWF0dGluZyB0eXBlLgogICAgICAqCi0gICAgICogQGhpZGUgVE9ETzpTaHVvbGQgYmUgdW5oaWRkZW4uCisgICAgICogQGhpZGUgVE9ETzogU2hvdWxkIGJlIHVuaGlkZGVuLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdE51bWJlcihTdHJpbmcgc291cmNlLCBpbnQgZGVmYXVsdEZvcm1hdHRpbmdUeXBlKSB7CiAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgdGV4dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHNvdXJjZSk7CkBAIC0xMTM4LDcgKzExNDMsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHRleHQgVGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQsIHdpbGwgYmUgbW9kaWZpZWQgd2l0aCB0aGUgZm9ybWF0dGluZwogICAgICAqIEBwYXJhbSBkZWZhdWx0Rm9ybWF0dGluZ1R5cGUgVGhlIGRlZmF1bHQgZm9ybWF0dGluZyBydWxlcyB0byBhcHBseSBpZiB0aGUgbnVtYmVyIGRvZXMKLSAgICAgKiBub3QgYmVnaW4gd2l0aCArPGNvdW50cnlfY29kZT4KKyAgICAgKiBub3QgYmVnaW4gd2l0aCArW2NvdW50cnlfY29kZV0KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZm9ybWF0TnVtYmVyKEVkaXRhYmxlIHRleHQsIGludCBkZWZhdWx0Rm9ybWF0dGluZ1R5cGUpIHsKICAgICAgICAgaW50IGZvcm1hdFR5cGUgPSBkZWZhdWx0Rm9ybWF0dGluZ1R5cGU7CkBAIC0xMzE5LDYgKzEzMjQsMTMyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBGb3JtYXQgdGhlIGdpdmVuIHBob25lTnVtYmVyIHRvIHRoZSBFLjE2NCByZXByZXNlbnRhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZ2l2ZW4gcGhvbmUgbnVtYmVyIG11c3QgaGF2ZSBhbiBhcmVhIGNvZGUgYW5kIGNvdWxkIGhhdmUgYSBjb3VudHJ5CisgICAgICogY29kZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdENvdW50cnlJc28gaXMgdXNlZCB0byB2YWxpZGF0ZSB0aGUgZ2l2ZW4gbnVtYmVyIGFuZCBnZW5lcmF0ZQorICAgICAqIHRoZSBFLjE2NCBwaG9uZSBudW1iZXIgaWYgdGhlIGdpdmVuIG51bWJlciBkb2Vzbid0IGhhdmUgYSBjb3VudHJ5IGNvZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGhvbmVOdW1iZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaG9uZSBudW1iZXIgdG8gZm9ybWF0CisgICAgICogQHBhcmFtIGRlZmF1bHRDb3VudHJ5SXNvCisgICAgICogICAgICAgICAgICB0aGUgSVNPIDMxNjYtMSB0d28gbGV0dGVycyBjb3VudHJ5IGNvZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBFLjE2NCByZXByZXNlbnRhdGlvbiwgb3IgbnVsbCBpZiB0aGUgZ2l2ZW4gcGhvbmUgbnVtYmVyIGlzCisgICAgICogICAgICAgICBub3QgdmFsaWQuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdE51bWJlclRvRTE2NChTdHJpbmcgcGhvbmVOdW1iZXIsIFN0cmluZyBkZWZhdWx0Q291bnRyeUlzbykgeworICAgICAgICBQaG9uZU51bWJlclV0aWwgdXRpbCA9IFBob25lTnVtYmVyVXRpbC5nZXRJbnN0YW5jZSgpOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFBob25lTnVtYmVyIHBuID0gdXRpbC5wYXJzZShwaG9uZU51bWJlciwgZGVmYXVsdENvdW50cnlJc28pOworICAgICAgICAgICAgaWYgKHV0aWwuaXNWYWxpZE51bWJlcihwbikpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB1dGlsLmZvcm1hdChwbiwgUGhvbmVOdW1iZXJGb3JtYXQuRTE2NCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE51bWJlclBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcm1hdCBhIHBob25lIG51bWJlci4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgZ2l2ZW4gbnVtYmVyIGRvZXNuJ3QgaGF2ZSB0aGUgY291bnRyeSBjb2RlLCB0aGUgcGhvbmUgd2lsbCBiZQorICAgICAqIGZvcm1hdHRlZCB0byB0aGUgZGVmYXVsdCBjb3VudHJ5J3MgY29udmVudGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwaG9uZU51bWJlcgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQuCisgICAgICogQHBhcmFtIGRlZmF1bHRDb3VudHJ5SXNvCisgICAgICogICAgICAgICAgICB0aGUgSVNPIDMxNjYtMSB0d28gbGV0dGVycyBjb3VudHJ5IGNvZGUgd2hvc2UgY29udmVudGlvbiB3aWxsCisgICAgICogICAgICAgICAgICBiZSB1c2VkIGlmIHRoZSBnaXZlbiBudW1iZXIgZG9lc24ndCBoYXZlIHRoZSBjb3VudHJ5IGNvZGUuCisgICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIG51bWJlciwgb3IgbnVsbCBpZiB0aGUgZ2l2ZW4gbnVtYmVyIGlzIG5vdCB2YWxpZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0TnVtYmVyKFN0cmluZyBwaG9uZU51bWJlciwgU3RyaW5nIGRlZmF1bHRDb3VudHJ5SXNvKSB7CisgICAgICAgIFBob25lTnVtYmVyVXRpbCB1dGlsID0gUGhvbmVOdW1iZXJVdGlsLmdldEluc3RhbmNlKCk7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgUGhvbmVOdW1iZXIgcG4gPSB1dGlsLnBhcnNlQW5kS2VlcFJhd0lucHV0KHBob25lTnVtYmVyLCBkZWZhdWx0Q291bnRyeUlzbyk7CisgICAgICAgICAgICByZXN1bHQgPSB1dGlsLmZvcm1hdEluT3JpZ2luYWxGb3JtYXQocG4sIGRlZmF1bHRDb3VudHJ5SXNvKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9ybWF0IHRoZSBwaG9uZSBudW1iZXIgb25seSBpZiB0aGUgZ2l2ZW4gbnVtYmVyIGhhc24ndCBiZWVuIGZvcm1hdHRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbnVtYmVyIHdoaWNoIGhhcyBvbmx5IGRhaWxhYmxlIGNoYXJhY3RlciBpcyB0cmVhdGVkIGFzIG5vdCBiZWluZworICAgICAqIGZvcm1hdHRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwaG9uZU51bWJlcgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQuCisgICAgICogQHBhcmFtIHBob25lTnVtYmVyRTE2NAorICAgICAqICAgICAgICAgICAgdGhlIEUxNjQgZm9ybWF0IG51bWJlciB3aG9zZSBjb3VudHJ5IGNvZGUgaXMgdXNlZCBpZiB0aGUgZ2l2ZW4KKyAgICAgKiAgICAgICAgICAgIHBob25lTnVtYmVyIGRvZXNuJ3QgaGF2ZSB0aGUgY291bnRyeSBjb2RlLgorICAgICAqIEBwYXJhbSBkZWZhdWx0Q291bnRyeUlzbworICAgICAqICAgICAgICAgICAgdGhlIElTTyAzMTY2LTEgdHdvIGxldHRlcnMgY291bnRyeSBjb2RlIHdob3NlIGNvbnZlbnRpb24gd2lsbAorICAgICAqICAgICAgICAgICAgYmUgdXNlZCBpZiB0aGUgcGhvbmVOdW1iZXJFMTY0IGlzIG51bGwgb3IgaW52YWxpZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgbnVtYmVyIGlmIHRoZSBnaXZlbiBudW1iZXIgaGFzIGJlZW4gZm9ybWF0dGVkLAorICAgICAqICAgICAgICAgICAgb3RoZXJ3aXNlLCByZXR1cm4gdGhlIGdpdmVuIG51bWJlci4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0TnVtYmVyKAorICAgICAgICAgICAgU3RyaW5nIHBob25lTnVtYmVyLCBTdHJpbmcgcGhvbmVOdW1iZXJFMTY0LCBTdHJpbmcgZGVmYXVsdENvdW50cnlJc28pIHsKKyAgICAgICAgaW50IGxlbiA9IHBob25lTnVtYmVyLmxlbmd0aCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWlzRGlhbGFibGUocGhvbmVOdW1iZXIuY2hhckF0KGkpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBwaG9uZU51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQaG9uZU51bWJlclV0aWwgdXRpbCA9IFBob25lTnVtYmVyVXRpbC5nZXRJbnN0YW5jZSgpOworICAgICAgICAvLyBHZXQgdGhlIGNvdW50cnkgY29kZSBmcm9tIHBob25lTnVtYmVyRTE2NAorICAgICAgICBpZiAocGhvbmVOdW1iZXJFMTY0ICE9IG51bGwgJiYgcGhvbmVOdW1iZXJFMTY0Lmxlbmd0aCgpID49IDIKKyAgICAgICAgICAgICAgICAmJiBwaG9uZU51bWJlckUxNjQuY2hhckF0KDApID09ICcrJykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlciBwbiA9IHV0aWwucGFyc2UocGhvbmVOdW1iZXJFMTY0LCBkZWZhdWx0Q291bnRyeUlzbyk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJlZ2lvbkNvZGUgPSB1dGlsLmdldFJlZ2lvbkNvZGVGb3JOdW1iZXIocG4pOworICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocmVnaW9uQ29kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvdW50cnlJc28gPSByZWdpb25Db2RlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlclBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZm9ybWF0TnVtYmVyKHBob25lTnVtYmVyLCBkZWZhdWx0Q291bnRyeUlzbyk7CisgICAgICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6IHBob25lTnVtYmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vcm1hbGl6ZSBhIHBob25lIG51bWJlciBieSByZW1vdmluZyB0aGUgY2hhcmFjdGVycyBvdGhlciB0aGFuIGRpZ2l0cy4gSWYKKyAgICAgKiB0aGUgZ2l2ZW4gbnVtYmVyIGhhcyBrZXlwYWQgbGV0dGVycywgdGhlIGxldHRlcnMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8KKyAgICAgKiBkaWdpdHMgZmlyc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGhvbmVOdW1iZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgdG8gYmUgbm9ybWFsaXplZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBub3JtYWxpemVkIG51bWJlci4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplTnVtYmVyKFN0cmluZyBwaG9uZU51bWJlcikgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaW50IGxlbiA9IHBob25lTnVtYmVyLmxlbmd0aCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBwaG9uZU51bWJlci5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoKGkgPT0gMCAmJiBjID09ICcrJykgfHwgUGhvbmVOdW1iZXJVdGlscy5pc0lTT0RpZ2l0KGMpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOworICAgICAgICAgICAgfSBlbHNlIGlmICgoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplTnVtYmVyKFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cyhwaG9uZU51bWJlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKwogICAgIC8vIFRocmVlIGFuZCBmb3VyIGRpZ2l0IHBob25lIG51bWJlcnMgZm9yIGVpdGhlciBzcGVjaWFsIHNlcnZpY2VzLAogICAgIC8vIG9yIDMtNiBkaWdpdCBhZGRyZXNzZXMgZnJvbSB0aGUgbmV0d29yayAoZWcgY2Fycmllci1vcmlnaW5hdGVkIFNNUyBtZXNzYWdlcykgc2hvdWxkCiAgICAgLy8gbm90IG1hdGNoLgpAQCAtMTU0Niw3ICsxNjc3LDcgQEAKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nCi0gICAgY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoU3RyaW5nIGRpYWxTdHIsaW50IGN1cnJGb3JtYXQsaW50IGRlZmF1bHRGb3JtdCkgeworICAgIGNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KFN0cmluZyBkaWFsU3RyLGludCBjdXJyRm9ybWF0LGludCBkZWZhdWx0Rm9ybWF0KSB7CiAgICAgICAgIFN0cmluZyByZXRTdHIgPSBkaWFsU3RyOwogCiAgICAgICAgIC8vIENoZWNrcyBpZiB0aGUgcGx1cyBzaWduIGNoYXJhY3RlciBpcyBpbiB0aGUgcGFzc2VkLWluIGRpYWwgc3RyaW5nCkBAIC0xNTU0LDcgKzE2ODUsNyBAQAogICAgICAgICAgICAgZGlhbFN0ci5sYXN0SW5kZXhPZihQTFVTX1NJR05fU1RSSU5HKSAhPSAtMSkgewogICAgICAgICAgICAgLy8gRm9ybWF0IHRoZSBzdHJpbmcgYmFzZWQgb24gdGhlIHJ1bGVzIGZvciB0aGUgY291bnRyeSB0aGUgbnVtYmVyIGlzIGZyb20sCiAgICAgICAgICAgICAvLyBhbmQgdGhlIGN1cnJlbnQgY291bnRyeSB0aGUgcGhvbmUgaXMgY2FtcGVkIG9uLgotICAgICAgICAgICAgaWYgKChjdXJyRm9ybWF0ID09IGRlZmF1bHRGb3JtdCkgJiYgKGN1cnJGb3JtYXQgPT0gRk9STUFUX05BTlApKSB7CisgICAgICAgICAgICBpZiAoKGN1cnJGb3JtYXQgPT0gZGVmYXVsdEZvcm1hdCkgJiYgKGN1cnJGb3JtYXQgPT0gRk9STUFUX05BTlApKSB7CiAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgZGVmYXVsdCBhbmQgY3VycmVudCB0ZWxlcGhvbmUgbnVtYmVyaW5nIHBsYW5zIGFyZSBOQU5QLgogICAgICAgICAgICAgICAgIFN0cmluZyBwb3N0RGlhbFN0ciA9IG51bGw7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHRlbXBEaWFsU3RyID0gZGlhbFN0cjsKQEAgLTE3NDEsNyArMTg3Miw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIGFwcGVuZHMgdGhlIG5vbi1kaWFibGFibGUgUC9XIGNoYXJhY3RlciB0byB0aGUgb3JpZ2luYWwKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGFwcGVuZHMgdGhlIG5vbi1kaWFsYWJsZSBQL1cgY2hhcmFjdGVyIHRvIHRoZSBvcmlnaW5hbAogICAgIC8vIGRpYWwgc3RyaW5nIGJhc2VkIG9uIHRoZSBkaWFsYWJsZSBpbmRleCBwYXNzZWQgaW4KICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcKICAgICBhcHBlbmRQd0NoYXJCYWNrVG9PcmlnRGlhbFN0cihpbnQgZGlhbGFibGVJbmRleCxTdHJpbmcgb3JpZ1N0ciwgU3RyaW5nIGRpYWxTdHIpIHsKQEAgLTE3NjEsNyArMTg5Miw3IEBACiAgICAgICAgIHJldHVybiByZXRTdHI7CiAgICAgfQogCi0gICAgLy89PT09PSBCZWdpbmluZyBvZiB1dGlsaXR5IG1ldGhvZHMgdXNlZCBpbiBjb21wYXJlTG9vc2VseSgpID09PT09CisgICAgLy89PT09PSBCZWdpbm5pbmcgb2YgdXRpbGl0eSBtZXRob2RzIHVzZWQgaW4gY29tcGFyZUxvb3NlbHkoKSA9PT09PQogCiAgICAgLyoqCiAgICAgICogUGhvbmUgbnVtYmVycyBhcmUgc3RvcmVkIGluICJsb29rdXAiIGZvcm0gaW4gdGhlIGRhdGFiYXNlCkBAIC0xODgzLDEyICsyMDE0LDEyIEBACiAKICAgICAvLz09PT09IEVuZCBvZiB1dGlsaXR5IG1ldGhvZHMgdXNlZCBvbmx5IGluIGNvbXBhcmVMb29zZWx5KCkgPT09PT0KIAotICAgIC8vPT09PT0gQmVnZ2luaW5nIG9mIHV0aWxpdHkgbWV0aG9kcyB1c2VkIG9ubHkgaW4gY29tcGFyZVN0cmljdGx5KCkgPT09PQorICAgIC8vPT09PT0gQmVnaW5uaW5nIG9mIHV0aWxpdHkgbWV0aG9kcyB1c2VkIG9ubHkgaW4gY29tcGFyZVN0cmljdGx5KCkgPT09PQogCiAgICAgLyoKICAgICAgKiBJZiB0cnVlLCB0aGUgbnVtYmVyIGlzIGNvdW50cnkgY2FsbGluZyBjb2RlLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ09VTlRMWV9DQUxMSU5HX0NBTExbXSA9IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIENPVU5UUllfQ0FMTElOR19DQUxMW10gPSB7CiAgICAgICAgIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLAogICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwKICAgICAgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsCkBAIC0xOTAwLDE4ICsyMDMxLDE4IEBACiAgICAgICAgIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlLAogICAgICAgICB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLAogICAgIH07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENDQ19MRU5HVEggPSBDT1VOVExZX0NBTExJTkdfQ0FMTC5sZW5ndGg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENDQ19MRU5HVEggPSBDT1VOVFJZX0NBTExJTkdfQ0FMTC5sZW5ndGg7CiAKICAgICAvKioKICAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiBpbnB1dCBpcyB2YWxpZCBDb3VudHJ5IENhbGxpbmcgQ29kZS4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ291bnRyeUNhbGxpbmdDb2RlKGludCBjb3VudHJ5Q2FsbGluZ0NvZGVDYW5kaWRhdGUpIHsKICAgICAgICAgcmV0dXJuIGNvdW50cnlDYWxsaW5nQ29kZUNhbmRpZGF0ZSA+IDAgJiYgY291bnRyeUNhbGxpbmdDb2RlQ2FuZGlkYXRlIDwgQ0NDX0xFTkdUSCAmJgotICAgICAgICAgICAgICAgIENPVU5UTFlfQ0FMTElOR19DQUxMW2NvdW50cnlDYWxsaW5nQ29kZUNhbmRpZGF0ZV07CisgICAgICAgICAgICAgICAgQ09VTlRSWV9DQUxMSU5HX0NBTExbY291bnRyeUNhbGxpbmdDb2RlQ2FuZGlkYXRlXTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGludGVyZ2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IGlmIGlucHV0ICJjaCIgaXMKKyAgICAgKiBSZXR1cm5zIGludGVnZXIgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgaWYgaW5wdXQgImNoIiBpcwogICAgICAqIElTTy1MQVRJTiBjaGFyYWN0ZXJzIDAtOS4KICAgICAgKiBSZXR1cm5zIC0xIG90aGVyd2lzZQogICAgICAqLwpAQCAtMjA0Niw3ICsyMTc3LDcgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBwcmVmaXggb2YgInN0ciIgaXMgImlnbm9yYWJsZSIuIEhlcmUsICJpZ25vcmFibGUiIG1lYW5zCi0gICAgICogdGhhdCAic3RyIiBoYXMgb25seSBvbmUgZGlnaXQgYW5kIHNlcGFyYXRlciBjaGFyYWN0ZXJzLiBUaGUgb25lIGRpZ2l0IGlzCisgICAgICogdGhhdCAic3RyIiBoYXMgb25seSBvbmUgZGlnaXQgYW5kIHNlcGFyYXRvciBjaGFyYWN0ZXJzLiBUaGUgb25lIGRpZ2l0IGlzCiAgICAgICogYXNzdW1lZCB0byBiZSB0cnVuayBwcmVmaXguCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVja1ByZWZpeElzSWdub3JhYmxlKGZpbmFsIFN0cmluZyBzdHIsCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZVN0YXRlTGlzdGVuZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lU3RhdGVMaXN0ZW5lci5qYXZhCmluZGV4IDgzMGFmNDcuLjM4ZjQ0ZDggMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lU3RhdGVMaXN0ZW5lci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lU3RhdGVMaXN0ZW5lci5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JUGhvbmVTdGF0ZUxpc3RlbmVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZTsKIAogLyoqCiAgKiBBIGxpc3RlbmVyIGNsYXNzIGZvciBtb25pdG9yaW5nIGNoYW5nZXMgaW4gc3BlY2lmaWMgdGVsZXBob255IHN0YXRlcwpAQCAtMjg0LDcgKzI4NSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBvbkRhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSwgaW50IG5ldHdvcmtUeXBlKSB7Ci0gICAgICAgICAgICBNZXNzYWdlLm9idGFpbihtSGFuZGxlciwgTElTVEVOX0RBVEFfQ09OTkVDVElPTl9TVEFURSwgc3RhdGUsIG5ldHdvcmtUeXBlLCBudWxsKS4KKyAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1IYW5kbGVyLCBMSVNURU5fREFUQV9DT05ORUNUSU9OX1NUQVRFLCBzdGF0ZSwgbmV0d29ya1R5cGUpLgogICAgICAgICAgICAgICAgICAgICBzZW5kVG9UYXJnZXQoKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNYW5hZ2VyLmphdmEKaW5kZXggZjVlOTc1MS4uOTUzNjk2YiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01hbmFnZXIuamF2YQpAQCAtMjEsNyArMjEsNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5FbmNvZGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklTbXM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0NvbnN0YW50czsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zUmF3RGF0YTsKQEAgLTMzLDcgKzMyLDcgQEAKIC8qCiAgKiBUT0RPKGNvZGUgcmV2aWV3KTogQ3VyaW91cyBxdWVzdGlvbi4uLiBXaHkgYXJlIGEgbG90IG9mIHRoZXNlCiAgKiBtZXRob2RzIG5vdCBkZWNsYXJlZCBhcyBzdGF0aWMsIHNpbmNlIHRoZXkgZG8gbm90IHNlZW0gdG8gcmVxdWlyZQotICogYW55IGxvY2FsIG9iamVjdCBzdGF0ZT8gIEFzc3VtZWRseSB0aGlzIGNhbm5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQKKyAqIGFueSBsb2NhbCBvYmplY3Qgc3RhdGU/ICBQcmVzdW1hYmx5IHRoaXMgY2Fubm90IGJlIGNoYW5nZWQgd2l0aG91dAogICogaW50ZXJmZXJpbmcgd2l0aCB0aGUgQVBJLi4uCiAgKi8KIApAQCAtNDIsNyArNDEsOCBAQAogICogR2V0IHRoaXMgb2JqZWN0IGJ5IGNhbGxpbmcgdGhlIHN0YXRpYyBtZXRob2QgU21zTWFuYWdlci5nZXREZWZhdWx0KCkuCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBTbXNNYW5hZ2VyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBTbXNNYW5hZ2VyIHNJbnN0YW5jZTsKKyAgICAvKiogU2luZ2xldG9uIG9iamVjdCBjb25zdHJ1Y3RlZCBkdXJpbmcgY2xhc3MgaW5pdGlhbGl6YXRpb24uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU21zTWFuYWdlciBzSW5zdGFuY2UgPSBuZXcgU21zTWFuYWdlcigpOwogCiAgICAgLyoqCiAgICAgICogU2VuZCBhIHRleHQgYmFzZWQgU01TLgpAQCAtNTIsOCArNTIsOCBAQAogICAgICAqICB0aGUgY3VycmVudCBkZWZhdWx0IFNNU0MKICAgICAgKiBAcGFyYW0gdGV4dCB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZSB0byBzZW5kCiAgICAgICogQHBhcmFtIHNlbnRJbnRlbnQgaWYgbm90IE5VTEwgdGhpcyA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPiBpcwotICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCi0gICAgICogIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzxjb2RlPiBmb3Igc3VjY2VzcywKKyAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjY2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KKyAgICAgKiAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPC9jb2RlPiBmb3Igc3VjY2VzcywKICAgICAgKiAgb3Igb25lIG9mIHRoZXNlIGVycm9yczo8YnI+CiAgICAgICogIDxjb2RlPlJFU1VMVF9FUlJPUl9HRU5FUklDX0ZBSUxVUkU8L2NvZGU+PGJyPgogICAgICAqICA8Y29kZT5SRVNVTFRfRVJST1JfUkFESU9fT0ZGPC9jb2RlPjxicj4KQEAgLTExNiw3ICsxMTYsNyBAQAogICAgICAqIEBwYXJhbSBzZW50SW50ZW50cyBpZiBub3QgbnVsbCwgYW4gPGNvZGU+QXJyYXlMaXN0PC9jb2RlPiBvZgogICAgICAqICAgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT5zIChvbmUgZm9yIGVhY2ggbWVzc2FnZSBwYXJ0KSB0aGF0IGlzCiAgICAgICogICBicm9hZGNhc3Qgd2hlbiB0aGUgY29ycmVzcG9uZGluZyBtZXNzYWdlIHBhcnQgaGFzIGJlZW4gc2VudC4KLSAgICAgKiAgIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzxjb2RlPiBmb3Igc3VjY2VzcywKKyAgICAgKiAgIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzwvY29kZT4gZm9yIHN1Y2Nlc3MsCiAgICAgICogICBvciBvbmUgb2YgdGhlc2UgZXJyb3JzOjxicj4KICAgICAgKiAgIDxjb2RlPlJFU1VMVF9FUlJPUl9HRU5FUklDX0ZBSUxVUkU8L2NvZGU+PGJyPgogICAgICAqICAgPGNvZGU+UkVTVUxUX0VSUk9SX1JBRElPX09GRjwvY29kZT48YnI+CkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICAgKiAgIHRoZSBleHRyYSAiZXJyb3JDb2RlIiBjb250YWluaW5nIGEgcmFkaW8gdGVjaG5vbG9neSBzcGVjaWZpYyB2YWx1ZSwKICAgICAgKiAgIGdlbmVyYWxseSBvbmx5IHVzZWZ1bCBmb3IgdHJvdWJsZXNob290aW5nLjxicj4KICAgICAgKiAgIFRoZSBwZXItYXBwbGljYXRpb24gYmFzZWQgU01TIGNvbnRyb2wgY2hlY2tzIHNlbnRJbnRlbnQuIElmIHNlbnRJbnRlbnQKLSAgICAgKiAgIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhaXRvbnMsCisgICAgICogICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYXRpb25zLAogICAgICAqICAgd2hpY2ggY2F1c2Ugc21hbGxlciBudW1iZXIgb2YgU01TIHRvIGJlIHNlbnQgaW4gY2hlY2tpbmcgcGVyaW9kLgogICAgICAqIEBwYXJhbSBkZWxpdmVyeUludGVudHMgaWYgbm90IG51bGwsIGFuIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gb2YKICAgICAgKiAgIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+cyAob25lIGZvciBlYWNoIG1lc3NhZ2UgcGFydCkgdGhhdCBpcwpAQCAtMTc4LDggKzE3OCw4IEBACiAgICAgICogQHBhcmFtIGRlc3RpbmF0aW9uUG9ydCB0aGUgcG9ydCB0byBkZWxpdmVyIHRoZSBtZXNzYWdlIHRvCiAgICAgICogQHBhcmFtIGRhdGEgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UgdG8gc2VuZAogICAgICAqIEBwYXJhbSBzZW50SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT4gaXMKLSAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgotICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8Y29kZT4gZm9yIHN1Y2Nlc3MsCisgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCisgICAgICogIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzwvY29kZT4gZm9yIHN1Y2Nlc3MsCiAgICAgICogIG9yIG9uZSBvZiB0aGVzZSBlcnJvcnM6PGJyPgogICAgICAqICA8Y29kZT5SRVNVTFRfRVJST1JfR0VORVJJQ19GQUlMVVJFPC9jb2RlPjxicj4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX1JBRElPX09GRjwvY29kZT48YnI+CkBAIC0xODgsNyArMTg4LDcgQEAKICAgICAgKiAgdGhlIGV4dHJhICJlcnJvckNvZGUiIGNvbnRhaW5pbmcgYSByYWRpbyB0ZWNobm9sb2d5IHNwZWNpZmljIHZhbHVlLAogICAgICAqICBnZW5lcmFsbHkgb25seSB1c2VmdWwgZm9yIHRyb3VibGVzaG9vdGluZy48YnI+CiAgICAgICogIFRoZSBwZXItYXBwbGljYXRpb24gYmFzZWQgU01TIGNvbnRyb2wgY2hlY2tzIHNlbnRJbnRlbnQuIElmIHNlbnRJbnRlbnQKLSAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2FpdG9ucywKKyAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2F0aW9ucywKICAgICAgKiAgd2hpY2ggY2F1c2Ugc21hbGxlciBudW1iZXIgb2YgU01TIHRvIGJlIHNlbnQgaW4gY2hlY2tpbmcgcGVyaW9kLgogICAgICAqIEBwYXJhbSBkZWxpdmVyeUludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCiAgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIGRlbGl2ZXJlZCB0byB0aGUgcmVjaXBpZW50LiAgVGhlCkBAIC0yMjQsOSArMjI0LDYgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGluc3RhbmNlIG9mIHRoZSBTbXNNYW5hZ2VyCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTbXNNYW5hZ2VyIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIGlmIChzSW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgc0luc3RhbmNlID0gbmV3IFNtc01hbmFnZXIoKTsKLSAgICAgICAgfQogICAgICAgICByZXR1cm4gc0luc3RhbmNlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWVzc2FnZS5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWVzc2FnZS5qYXZhCmluZGV4IGEyODRlYTUuLmQ4OTk0MzAgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01lc3NhZ2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNZXNzYWdlLmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkdzbUFscGhhYmV0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5FbmNvZGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc0hlYWRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zTWVzc2FnZUJhc2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlLlN1Ym1pdFBkdUJhc2U7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9UZWxlcGhvbnlNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9UZWxlcGhvbnlNYW5hZ2VyLmphdmEKaW5kZXggMjdlMDhkNC4uMjM3MGFkZCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvVGVsZXBob255TWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1RlbGVwaG9ueU1hbmFnZXIuamF2YQpAQCAtOTEyLDQgKzkxMiwyNSBAQAogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzICJ2b2ljZSBjYXBhYmxlIi4KKyAgICAgKiA8cD4KKyAgICAgKiAiVm9pY2UgY2FwYWJsZSIgbWVhbnMgdGhhdCB0aGlzIGRldmljZSBzdXBwb3J0cyBjaXJjdWl0LXN3aXRjaGVkCisgICAgICogKGkuZS4gdm9pY2UpIHBob25lIGNhbGxzIG92ZXIgdGhlIHRlbGVwaG9ueSBuZXR3b3JrLCBhbmQgaXMgYWxsb3dlZAorICAgICAqIHRvIGRpc3BsYXkgdGhlIGluLWNhbGwgVUkgd2hpbGUgYSBjZWxsdWxhciB2b2ljZSBjYWxsIGlzIGFjdGl2ZS4KKyAgICAgKiBUaGlzIHdpbGwgYmUgZmFsc2Ugb24gImRhdGEgb25seSIgZGV2aWNlcyB3aGljaCBjYW4ndCBtYWtlIHZvaWNlCisgICAgICogY2FsbHMgYW5kIGRvbid0IHN1cHBvcnQgYW55IGluLWNhbGwgVUkuCisgICAgICogPHA+CisgICAgICogTm90ZTogdGhlIG1lYW5pbmcgb2YgdGhpcyBmbGFnIGlzIHN1YnRseSBkaWZmZXJlbnQgZnJvbSB0aGUKKyAgICAgKiBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RFTEVQSE9OWSBzeXN0ZW0gZmVhdHVyZSwgd2hpY2ggaXMgYXZhaWxhYmxlCisgICAgICogb24gYW55IGRldmljZSB3aXRoIGEgdGVsZXBob255IHJhZGlvLCBldmVuIGlmIHRoZSBkZXZpY2UgaXMKKyAgICAgKiBkYXRhLW9ubHkuCisgICAgICoKKyAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSByZXZpZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZvaWNlQ2FwYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5ib29sLmNvbmZpZ192b2ljZV9jYXBhYmxlKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ29tbWFuZHNJbnRlcmZhY2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db21tYW5kc0ludGVyZmFjZS5qYXZhCmluZGV4IDVkZTA0MjYuLjI3YTRkY2EgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db21tYW5kc0ludGVyZmFjZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db21tYW5kc0ludGVyZmFjZS5qYXZhCkBAIC0yNyw4ICsyNyw4IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZHNJbnRlcmZhY2UgewogICAgIGVudW0gUmFkaW9TdGF0ZSB7Ci0gICAgICAgIFJBRElPX09GRiwgICAgICAgICAvKiBSYWRpbyBleHBsaWN0bHkgcG93ZXJlZCBvZmYgKGVnIENGVU49MCkgKi8KLSAgICAgICAgUkFESU9fVU5BVkFJTEFCTEUsIC8qIFJhZGlvIHVuYXZhaWxhYmxlIChlZywgcmVzZXR0aW5nIG9yIG5vdCBib290ZWQpICovCisgICAgICAgIFJBRElPX09GRiwgICAgICAgICAvKiBSYWRpbyBleHBsaWNpdGx5IHBvd2VyZWQgb2ZmIChlLmcuIENGVU49MCkgKi8KKyAgICAgICAgUkFESU9fVU5BVkFJTEFCTEUsIC8qIFJhZGlvIHVuYXZhaWxhYmxlIChlLmcuIHJlc2V0dGluZyBvciBub3QgYm9vdGVkKSAqLwogICAgICAgICBTSU1fTk9UX1JFQURZLCAgICAgLyogUmFkaW8gaXMgb24sIGJ1dCB0aGUgU0lNIGludGVyZmFjZSBpcyBub3QgcmVhZHkgKi8KICAgICAgICAgU0lNX0xPQ0tFRF9PUl9BQlNFTlQsICAvKiBTSU0gUElOIGxvY2tlZCwgUFVLIHJlcXVpcmVkLCBuZXR3b3JrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYWxpemF0aW9uLCBvciBTSU0gYWJzZW50ICovCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICAvLyBTZWUgMjcuMDA3ICtDQ0ZDIG9yICtDTENLCiAgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX05PTkUgICAgID0gMDsgLy8gbm8gdXNlciBpbnB1dAogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19WT0lDRSAgICA9ICgxIDw8IDApOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19EQVRBICAgICA9ICgxIDw8IDEpOyAvL3N5bm95bSBmb3IgMTYrMzIrNjQrMTI4CisgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX0RBVEEgICAgID0gKDEgPDwgMSk7IC8vc3lub255bSBmb3IgMTYrMzIrNjQrMTI4CiAgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX0ZBWCAgICAgID0gKDEgPDwgMik7CiAgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX1NNUyAgICAgID0gKDEgPDwgMyk7CiAgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX0RBVEFfU1lOQyA9ICgxIDw8IDQpOwpAQCAtOTUyLDE5ICs5NTIsMTkgQEAKICAgICB2b2lkIHdyaXRlU21zVG9SdWltKGludCBzdGF0dXMsIFN0cmluZyBwZHUsIE1lc3NhZ2UgcmVzcG9uc2UpOwogCiAgICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQKICAgICAgKiBAcGFyYW0gYXBuCiAgICAgICogQHBhcmFtIHVzZXIKICAgICAgKiBAcGFyYW0gcGFzc3dvcmQKICAgICAgKiBAcGFyYW0gcmVzcG9uc2UKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHZvaWQgc2V0dXBEZWZhdWx0UERQKFN0cmluZyBhcG4sIFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQsIE1lc3NhZ2UgcmVzcG9uc2UpOwogCiAgICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQKICAgICAgKiBAcGFyYW0gY2lkCiAgICAgICogQHBhcmFtIHJlc3BvbnNlCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICB2b2lkIGRlYWN0aXZhdGVEZWZhdWx0UERQKGludCBjaWQsIE1lc3NhZ2UgcmVzcG9uc2UpOwogCiAgICAgdm9pZCBzZXRSYWRpb1Bvd2VyKGJvb2xlYW4gb24sIE1lc3NhZ2UgcmVzcG9uc2UpOwpAQCAtOTc0LDcgKzk3NCw3IEBACiAgICAgdm9pZCBhY2tub3dsZWRnZUxhc3RJbmNvbWluZ0NkbWFTbXMoYm9vbGVhbiBzdWNjZXNzLCBpbnQgY2F1c2UsIE1lc3NhZ2UgcmVzcG9uc2UpOwogCiAgICAgLyoqCi0gICAgICogcGFyYW1ldGVycyBlcXVpdmlsaWVudCB0byAyNy4wMDcgQVQrQ1JTTSBjb21tYW5kCisgICAgICogcGFyYW1ldGVycyBlcXVpdmFsZW50IHRvIDI3LjAwNyBBVCtDUlNNIGNvbW1hbmQKICAgICAgKiByZXNwb25zZS5vYmogd2lsbCBiZSBhbiBBc3luY1Jlc3VsdAogICAgICAqIHJlc3BvbnNlLm9iai51c2VyT2JqIHdpbGwgYmUgYSBJY2NJb1Jlc3VsdCBvbiBzdWNjZXNzCiAgICAgICovCkBAIC0xMDc5LDcgKzEwNzksNyBAQAogCiAgICAgLyoqCiAgICAgICogKEFzeW5jUmVzdWx0KXJlc3BvbnNlLm9iaikucmVzdWx0IHdpbGwgYmUgYW4gSW50ZWdlciByZXByZXNlbnRpbmcKLSAgICAgKiB0aGUgc3VtIG9mIGVuYWJsZWQgc2VyaXZpY2UgY2xhc3NlcyAoc3VtIG9mIFNFUlZJQ0VfQ0xBU1NfKikKKyAgICAgKiB0aGUgc3VtIG9mIGVuYWJsZWQgc2VydmljZSBjbGFzc2VzIChzdW0gb2YgU0VSVklDRV9DTEFTU18qKQogICAgICAqCiAgICAgICogQHBhcmFtIGZhY2lsaXR5IG9uZSBvZiBDQl9GQUNJTFRZXyoKICAgICAgKiBAcGFyYW0gcGFzc3dvcmQgcGFzc3dvcmQgb3IgIiIgaWYgbm90IHJlcXVpcmVkCkBAIC0xMTUyLDcgKzExNTIsNyBAQAogCiAgICAgLyoqCiAgICAgICogUmVxdWVzdCB0byBlbmFibGUvZGlzYWJsZSBuZXR3b3JrIHN0YXRlIGNoYW5nZSBub3RpZmljYXRpb25zIHdoZW4KLSAgICAgKiBsb2NhdGlvbiBpbmZvcm1hdGVpb24gKGxhYyBhbmQvb3IgY2lkKSBoYXMgY2hhbmdlZC4KKyAgICAgKiBsb2NhdGlvbiBpbmZvcm1hdGlvbiAobGFjIGFuZC9vciBjaWQpIGhhcyBjaGFuZ2VkLgogICAgICAqCiAgICAgICogQHBhcmFtIGVuYWJsZSB0cnVlIHRvIGVuYWJsZSwgZmFsc2UgdG8gZGlzYWJsZQogICAgICAqIEBwYXJhbSByZXNwb25zZSBjYWxsYmFjayBtZXNzYWdlCkBAIC0xMTgzLDcgKzExODMsNyBAQAogCiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRvIHRoZSB2ZW5kb3IgcmlsIHRoYXQgU3RrU2VydmljZSBpcyBydW5uaW5nCi0gICAgICogcmFuZCBpcyBlYWR5IHRvIHJlY2VpdmUgUklMX1VOU09MX1NUS19YWFhYIGNvbW1hbmRzLgorICAgICAqIGFuZCBpcyByZWFkeSB0byByZWNlaXZlIFJJTF9VTlNPTF9TVEtfWFhYWCBjb21tYW5kcy4KICAgICAgKgogICAgICAqIEBwYXJhbSByZXN1bHQgY2FsbGJhY2sgbWVzc2FnZQogICAgICAqLwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb24uamF2YQppbmRleCA2NjM0MDE3Li41MjFkOTBjIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb24uamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb24uamF2YQpAQCAtMjEsMTEgKzIxLDE3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5IaWVyYXJjaGljYWxTdGF0ZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTsKIAoraW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CiAKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlOworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKKwogLyoqCiAgKiB7QGhpZGV9CiAgKgpAQCAtMjU1LDEwICsyNjEsNyBAQAogICAgIHByb3RlY3RlZCBpbnQgbVRhZzsKICAgICBwcm90ZWN0ZWQgUGhvbmVCYXNlIHBob25lOwogICAgIHByb3RlY3RlZCBpbnQgY2lkOwotICAgIHByb3RlY3RlZCBTdHJpbmcgaW50ZXJmYWNlTmFtZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGlwQWRkcmVzczsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdhdGV3YXlBZGRyZXNzOwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBkbnNTZXJ2ZXJzOworICAgIHByb3RlY3RlZCBMaW5rUHJvcGVydGllcyBtTGlua1Byb3BlcnRpZXMgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKICAgICBwcm90ZWN0ZWQgbG9uZyBjcmVhdGVUaW1lOwogICAgIHByb3RlY3RlZCBsb25nIGxhc3RGYWlsVGltZTsKICAgICBwcm90ZWN0ZWQgRmFpbENhdXNlIGxhc3RGYWlsQ2F1c2U7CkBAIC0yODMsOCArMjg2LDYgQEAKICAgICAgICAgaWYgKERCRykgbG9nKCJEYXRhQ29ubmVjdGlvbiBjb25zdHJ1Y3RvciBFIik7CiAgICAgICAgIHRoaXMucGhvbmUgPSBwaG9uZTsKICAgICAgICAgdGhpcy5jaWQgPSAtMTsKLSAgICAgICAgdGhpcy5kbnNTZXJ2ZXJzID0gbmV3IFN0cmluZ1syXTsKLQogICAgICAgICBjbGVhclNldHRpbmdzKCk7CiAKICAgICAgICAgc2V0RGJnKGZhbHNlKTsKQEAgLTM3NywxMSArMzc4LDcgQEAKICAgICAgICAgdGhpcy5sYXN0RmFpbFRpbWUgPSAtMTsKICAgICAgICAgdGhpcy5sYXN0RmFpbENhdXNlID0gRmFpbENhdXNlLk5PTkU7CiAKLSAgICAgICAgaW50ZXJmYWNlTmFtZSA9IG51bGw7Ci0gICAgICAgIGlwQWRkcmVzcyA9IG51bGw7Ci0gICAgICAgIGdhdGV3YXlBZGRyZXNzID0gbnVsbDsKLSAgICAgICAgZG5zU2VydmVyc1swXSA9IG51bGw7Ci0gICAgICAgIGRuc1NlcnZlcnNbMV0gPSBudWxsOworICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQxNiwzNSArNDEzLDY4IEBACiAvLyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzcG9uc2UubGVuZ3RoOyBpKyspIHsKIC8vICAgICAgICAgICAgICAgIGxvZygiICByZXNwb25zZVsiICsgaSArICJdPSciICsgcmVzcG9uc2VbaV0gKyAiJyIpOwogLy8gICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFN0YXJ0IHdpdGggY2xlYW4gbmV0d29yayBwcm9wZXJ0aWVzIGFuZCBpZiB3ZSBoYXZlCisgICAgICAgICAgICAvLyBhIGZhaWx1cmUgd2UnbGwgY2xlYXIgYWdhaW4gYXQgdGhlIGJvdHRvbSBvZiB0aGlzIGNvZGUuCisgICAgICAgICAgICBMaW5rUHJvcGVydGllcyBsaW5rUHJvcGVydGllcyA9IG5ldyBMaW5rUHJvcGVydGllcygpOwogICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmxlbmd0aCA+PSAyKSB7CiAgICAgICAgICAgICAgICAgY2lkID0gSW50ZWdlci5wYXJzZUludChyZXNwb25zZVswXSk7Ci0gICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSA9IHJlc3BvbnNlWzFdOwotICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5sZW5ndGggPiAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlwQWRkcmVzcyA9IHJlc3BvbnNlWzJdOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gIm5ldC4iICsgaW50ZXJmYWNlTmFtZSArICIuIjsKLSAgICAgICAgICAgICAgICAgICAgZ2F0ZXdheUFkZHJlc3MgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcmVmaXggKyAiZ3ciKTsKLSAgICAgICAgICAgICAgICAgICAgZG5zU2VydmVyc1swXSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KHByZWZpeCArICJkbnMxIik7Ci0gICAgICAgICAgICAgICAgICAgIGRuc1NlcnZlcnNbMV0gPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcmVmaXggKyAiZG5zMiIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coImludGVyZmFjZT0iICsgaW50ZXJmYWNlTmFtZSArICIgaXBBZGRyZXNzPSIgKyBpcEFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZ2F0ZXdheT0iICsgZ2F0ZXdheUFkZHJlc3MgKyAiIEROUzE9IiArIGRuc1NlcnZlcnNbMF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgRE5TMj0iICsgZG5zU2VydmVyc1sxXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHJlc3BvbnNlWzFdOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNldHVwUmVzdWx0LlNVQ0NFU1M7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzRG5zT2soZG5zU2VydmVycykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNldHVwUmVzdWx0LlNVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBTZXR1cFJlc3VsdC5FUlJfQmFkRG5zOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAibmV0LiIgKyBpbnRlcmZhY2VOYW1lICsgIi4iOworCisgICAgICAgICAgICAgICAgICAgIGxpbmtQcm9wZXJ0aWVzLnNldEludGVyZmFjZShOZXR3b3JrSW50ZXJmYWNlLmdldEJ5TmFtZShpbnRlcmZhY2VOYW1lKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogR2V0IGdhdGV3YXkgYW5kIGRucyB2aWEgUklMIGludGVyZmFjZSBub3QgcHJvcGVydHk/CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBnYXRld2F5QWRkcmVzcyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KHByZWZpeCArICJndyIpOworICAgICAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcy5zZXRHYXRld2F5KEluZXRBZGRyZXNzLmdldEJ5TmFtZShnYXRld2F5QWRkcmVzcykpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5sZW5ndGggPiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXBBZGRyZXNzID0gcmVzcG9uc2VbMl07CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcy5hZGRBZGRyZXNzKEluZXRBZGRyZXNzLmdldEJ5TmFtZShpcEFkZHJlc3MpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogR2V0IGdhdGV3YXkgYW5kIGRucyB2aWEgUklMIGludGVyZmFjZSBub3QgcHJvcGVydHk/CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZG5zU2VydmVyc1tdID0gbmV3IFN0cmluZ1syXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRuc1NlcnZlcnNbMF0gPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcmVmaXggKyAiZG5zMSIpOworICAgICAgICAgICAgICAgICAgICAgICAgZG5zU2VydmVyc1sxXSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KHByZWZpeCArICJkbnMyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEbnNPayhkbnNTZXJ2ZXJzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtQcm9wZXJ0aWVzLmFkZERucyhJbmV0QWRkcmVzcy5nZXRCeU5hbWUoZG5zU2VydmVyc1swXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtQcm9wZXJ0aWVzLmFkZERucyhJbmV0QWRkcmVzcy5nZXRCeU5hbWUoZG5zU2VydmVyc1sxXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBTZXR1cFJlc3VsdC5FUlJfQmFkRG5zOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gU2V0dXBSZXN1bHQuU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgICAgICAgICBsb2coIm9uU2V0dXBDb21wbGV0ZWQ6IFVua25vd0hvc3RFeGNlcHRpb24gIiArIGUxKTsKKyAgICAgICAgICAgICAgICAgICAgZTEucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNldHVwUmVzdWx0LkVSUl9PdGhlcjsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJvblNldHVwQ29tcGxldGVkOiBTb2NrZXRFeGNlcHRpb24gIiArIGUyKTsKKyAgICAgICAgICAgICAgICAgICAgZTIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNldHVwUmVzdWx0LkVSUl9PdGhlcjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZygib25TZXR1cENvbXBsZXRlZDogZXJyb3I7IGV4cGVjdGVkIG51bWJlciBvZiByZXNwb25zZXMgPj0gMiB3YXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNldHVwUmVzdWx0LkVSUl9PdGhlcjsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQgc28gY2xlYXIgcHJvcGVydGllcworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBTZXR1cFJlc3VsdC5TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgbG9nKCJvblNldHVwQ29tcGxldGVkIHdpdGggYW4gZXJyb3IgY2xlYXJpbmcgTGlua1Byb3BlcnRpZXMiKTsKKyAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcy5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzID0gbGlua1Byb3BlcnRpZXM7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoREJHKSBsb2coIkRhdGFDb25uZWN0aW9uIHNldHVwIHJlc3VsdD0nIiArIHJlc3VsdCArICInIG9uIGNpZD0iICsgY2lkKTsKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgbG9nKCJEYXRhQ29ubmVjdGlvbiBzZXR1cCByZXN1bHQ9JyIgKyByZXN1bHQgKyAiJyBvbiBjaWQ9IiArIGNpZCk7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IFNldHVwUmVzdWx0LlNVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBsb2coIkxpbmtQcm9wZXJ0aWVzOiAiICsgbUxpbmtQcm9wZXJ0aWVzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCkBAIC02MDYsNyArNjM2LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVSUl9CYWREbnM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiBzdWNjZWVkZWQgYnV0IEROUyBpbmZvIGlzIGJhZCBzbyBkaXNjb25uZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFdmVudExvZ1RhZ3MuUERQX0JBRF9ETlNfQUREUkVTUywgZG5zU2VydmVyc1swXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBkbnNBZGRyZXNzZXNTYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJbmV0QWRkcmVzcyBhZGRyIDogbUxpbmtQcm9wZXJ0aWVzLmdldERuc2VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRuc0FkZHJlc3Nlc1NiLmxlbmd0aCgpICE9IDApIGRuc0FkZHJlc3Nlc1NiLmFwcGVuZCgiICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbnNBZGRyZXNzZXNTYi5hcHBlbmQoYWRkci50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRuc0FkZHJlc3Nlc1NiLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5zQWRkcmVzc2VzU2IuYXBwZW5kKCJuby1kbnMtYWRkcmVzc2VzIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRXZlbnRMb2dUYWdzLlBEUF9CQURfRE5TX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbnNBZGRyZXNzZXNTYi50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFyRG93bkRhdGEoY3ApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGluZ0JhZERuc1N0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTg3MywzMSArOTEyLDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgaW50ZXJmYWNlIG5hbWUgYXMgYSBzdHJpbmcuCisgICAgICogQHJldHVybiB0aGUgY29ubmVjdGlvbnMgTGlua1Byb3BlcnRpZXMKICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGludGVyZmFjZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgaXAgYWRkcmVzcyBhcyBhIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElwQWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIGlwQWRkcmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBnYXRld2F5IGFkZHJlc3MgYXMgYSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRHYXRld2F5QWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIGdhdGV3YXlBZGRyZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgYXNzb2NpYXRlZCBETlMgYWRkcmVzc2VzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREbnNTZXJ2ZXJzKCkgewotICAgICAgICByZXR1cm4gZG5zU2VydmVyczsKKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgTGlua1Byb3BlcnRpZXMobUxpbmtQcm9wZXJ0aWVzKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQppbmRleCAzYjllNmNjLi43NjVmNjRiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCkBAIC0xNywxMCArMTcsMTAgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwpAQCAtMjgsNiArMjgsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAorCiAvKioKICAqIHtAaGlkZX0KICAqCkBAIC0xODgsNyArMTg5LDEzIEBACiAgICAgLyoqIENJRCBvZiBhY3RpdmUgZGF0YSBjb25uZWN0aW9uICovCiAgICAgcHJvdGVjdGVkIGludCBjaWRBY3RpdmU7CiAKLSAgIC8qKgorICAgIC8qKiBpbmRpY2F0aW9uIG9mIG91ciBhdmFpbGFiaWxpdHkgKHByZWNvbmRpdGlvbnMgdG8gdHJ5c2V0dXBEYXRhIGFyZSBtZXQpICoqLworICAgIHByb3RlY3RlZCBib29sZWFuIG1BdmFpbGFiaWxpdHkgPSBmYWxzZTsKKworICAgIC8qKiBhbGwgb3VyIGxpbmsgcHJvcGVydGllcyAoZG5zLCBnYXRld2F5LCBpcCwgZXRjKSAqLworICAgIHByb3RlY3RlZCBMaW5rUHJvcGVydGllcyBtTGlua1Byb3BlcnRpZXM7CisKKyAgICAvKioKICAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICovCiAgICAgcHJvdGVjdGVkIERhdGFDb25uZWN0aW9uVHJhY2tlcihQaG9uZUJhc2UgcGhvbmUpIHsKQEAgLTQxMSwxNyArNDE4LDk1IEBACiAKICAgICBwdWJsaWMgYWJzdHJhY3QgQXJyYXlMaXN0PERhdGFDb25uZWN0aW9uPiBnZXRBbGxEYXRhQ29ubmVjdGlvbnMoKTsKIAotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0SW50ZXJmYWNlTmFtZShTdHJpbmcgYXBuVHlwZSk7Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldElwQWRkcmVzcyhTdHJpbmcgYXBuVHlwZSk7Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEdhdGV3YXkoU3RyaW5nIGFwblR5cGUpOwotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZ1tdIGdldERuc1NlcnZlcnMoU3RyaW5nIGFwblR5cGUpOwotCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0U3RhdGUoU3RhdGUgcyk7CiAKLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGJvb2xlYW4gaXNFbmFibGVkKGludCBpZCkgeworICAgIHByb3RlY3RlZCBMaW5rUHJvcGVydGllcyBnZXRMaW5rUHJvcGVydGllcyhTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICBpbnQgaWQgPSBhcG5UeXBlVG9JZChhcG5UeXBlKTsKKyAgICAgICAgaWYgKGlzQXBuSWRFbmFibGVkKGlkKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBMaW5rUHJvcGVydGllcyhtTGlua1Byb3BlcnRpZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB0ZWxsIGFsbCBhY3RpdmUgYXBucyBvZiB0aGUgY3VycmVudCBjb25kaXRpb24KKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uKSB7CisgICAgICAgIGZvciAoaW50IGlkID0gMDsgaWQgPCBBUE5fTlVNX1RZUEVTOyBpZCsrKSB7CisgICAgICAgICAgICBpZiAoZGF0YUVuYWJsZWRbaWRdKSB7CisgICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uLCBhcG5JZFRvVHlwZShpZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkocmVhc29uKTsKKyAgICB9CisKKyAgICAvLyBhIG5ldyBBUE4gaGFzIGdvbmUgYWN0aXZlIGFuZCBuZWVkcyB0byBzZW5kIGV2ZW50cyB0byBjYXRjaCB1cCB3aXRoIHRoZSBjdXJyZW50IGNvbmRpdGlvbgorICAgIHByaXZhdGUgdm9pZCBub3RpZnlBcG5JZFVwVG9DdXJyZW50KFN0cmluZyByZWFzb24sIGludCBhcG5JZCkgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIElETEU6CisgICAgICAgICAgICBjYXNlIElOSVRJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENPTk5FQ1RJTkc6CisgICAgICAgICAgICBjYXNlIFNDQU5OSU5HOgorICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbiwgYXBuSWRUb1R5cGUoYXBuSWQpLCBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVElORyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENPTk5FQ1RFRDoKKyAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24sIGFwbklkVG9UeXBlKGFwbklkKSwgUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RJTkcpOworICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbiwgYXBuSWRUb1R5cGUoYXBuSWQpLCBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHNpbmNlIHdlIG5vcm1hbGx5IGRvbid0IHNlbmQgaW5mbyB0byBhIGRpc2Nvbm5lY3RlZCBBUE4sIHdlIG5lZWQgdG8gZG8gdGhpcyBzcGVjaWFsbHkKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5QXBuSWREaXNjb25uZWN0ZWQoU3RyaW5nIHJlYXNvbiwgaW50IGFwbklkKSB7CisgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbiwgYXBuSWRUb1R5cGUoYXBuSWQpLCBQaG9uZS5EYXRhU3RhdGUuRElTQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICAvLyBkaXNhYmxlZCBhcG4ncyBzdGlsbCBuZWVkIGF2YWlsL3VuYXZhaWwgbm90aWZpY2lhdGlvbnMgLSBzZW5kIHRoZW0gb3V0CisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KFN0cmluZyByZWFzb24sIGJvb2xlYW4gYXZhaWxhYmlsaXR5KSB7CisgICAgICAgIGlmIChtQXZhaWxhYmlsaXR5ID09IGF2YWlsYWJpbGl0eSkgcmV0dXJuOworICAgICAgICBtQXZhaWxhYmlsaXR5ID0gYXZhaWxhYmlsaXR5OworICAgICAgICBmb3IgKGludCBpZCA9IDA7IGlkIDwgQVBOX05VTV9UWVBFUzsgaWQrKykgeworICAgICAgICAgICAgaWYgKCFpc0FwbklkRW5hYmxlZChpZCkpIHsKKyAgICAgICAgICAgICAgICBub3RpZnlBcG5JZERpc2Nvbm5lY3RlZChyZWFzb24sIGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHdlIGhhZCBhbiBhdmFpbGFiaWxpdHkgY2hhbmdlIC0gdGVsbCB0aGUgbGlzdGVuZXJzCisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShTdHJpbmcgcmVhc29uKSB7CisgICAgICAgIC8vIG5vdGUgdGhhdCB3ZSBlaXRoZXIganVzdCB0dXJuZWQgYWxsIG9mZiBiZWNhdXNlIHdlIGxvc3QgYXZhaWxhYmlsaXR5CisgICAgICAgIC8vIG9yIGFsbCB3ZXJlIG9mZiBhbmQgY291bGQgbm93IGdvIG9uLCBzbyBvbmx5IGhhdmUgb2ZmIGFwbnMgdG8gd29ycnkgYWJvdXQKKyAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgaXNEYXRhUG9zc2libGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG9ubHkgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaCB3ZSByZXBvcnQgdGhhdCBkYXRhIGNvbm5lY3Rpdml0eSBpcyBub3QKKyAgICAgKiBwb3NzaWJsZSBhcmUKKyAgICAgKiA8dWw+CisgICAgICogPGxpPkRhdGEgaXMgZGlzYWxsb3dlZCAocm9hbWluZywgcG93ZXIgc3RhdGUsIHZvaWNlIGNhbGwsIGV0YykuPC9saT4KKyAgICAgKiA8bGk+VGhlIGN1cnJlbnQgZGF0YSBzdGF0ZSBpcyB7QGNvZGUgRElTQ09OTkVDVEVEfSBmb3IgYSByZWFzb24gb3RoZXIgdGhhbgorICAgICAqIGhhdmluZyBleHBsaWNpdGx5IGRpc2FibGVkIGNvbm5lY3Rpdml0eS4gSW4gb3RoZXIgd29yZHMsIGRhdGEgaXMgbm90IGF2YWlsYWJsZQorICAgICAqIGJlY2F1c2UgdGhlIHBob25lIGlzIG91dCBvZiBjb3ZlcmFnZSBvciBzb21lIGxpa2UgcmVhc29uLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBkYXRhIGNvbm5lY3Rpdml0eSBpcyBwb3NzaWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEYXRhUG9zc2libGUoKSB7CisgICAgICAgIGJvb2xlYW4gcG9zc2libGUgPSAoaXNEYXRhQWxsb3dlZCgpICYmCisgICAgICAgICAgICAhKGdldERhdGFFbmFibGVkKCkgJiYgKHN0YXRlID09IFN0YXRlLkZBSUxFRCB8fCBzdGF0ZSA9PSBTdGF0ZS5JRExFKSkpOworICAgICAgICBpZiAoIXBvc3NpYmxlICYmIERCRyAmJiBpc0RhdGFBbGxvd2VkKCkpIHsKKyAgICAgICAgICAgIGxvZygiRGF0YSBub3QgcG9zc2libGUuICBObyBjb3ZlcmFnZTogZGF0YVN0YXRlID0gIiArIHN0YXRlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcG9zc2libGU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNEYXRhQWxsb3dlZCgpOworCisgICAgcHVibGljIGJvb2xlYW4gaXNBcG5UeXBlRW5hYmxlZChTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICByZXR1cm4gaXNBcG5JZEVuYWJsZWQoYXBuVHlwZVRvSWQoYXBuVHlwZSkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0FwbklkRW5hYmxlZChpbnQgaWQpIHsKICAgICAgICAgaWYgKGlkICE9IEFQTl9JTlZBTElEX0lEKSB7CiAgICAgICAgICAgICByZXR1cm4gZGF0YUVuYWJsZWRbaWRdOwogICAgICAgICB9CkBAIC00NDQsMjIgKzUyOSwyMSBAQAogICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9SRVFVRVNUX0ZBSUxFRDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJlbmFibGVBcG5UeXBlKCIrdHlwZSsiKSwgaXNBcG5UeXBlQWN0aXZlID0gIgotICAgICAgICAgICAgICAgICsgaXNBcG5UeXBlQWN0aXZlKHR5cGUpICsgIiBhbmQgc3RhdGUgPSAiICsgc3RhdGUpOworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiZW5hYmxlQXBuVHlwZSgiICsgdHlwZSArICIpLCBpc0FwblR5cGVBY3RpdmUgPSAiCisgICAgICAgICAgICAgICAgICAgICsgaXNBcG5UeXBlQWN0aXZlKHR5cGUpICsgIiwgaXNBcG5JZEVuYWJsZWQgPSIgKyBpc0FwbklkRW5hYmxlZChpZCkgKworICAgICAgICAgICAgICAgICAgICAiIGFuZCBzdGF0ZSA9ICIgKyBzdGF0ZSk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoIWlzQXBuVHlwZUF2YWlsYWJsZSh0eXBlKSkgewogICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgInR5cGUgbm90IGF2YWlsYWJsZSIpOwogICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9UWVBFX05PVF9BVkFJTEFCTEU7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBqdXN0IGJlY2F1c2UgaXQncyBhY3RpdmUgZG9lc24ndCBtZWFuIHdlIGhhZCBpdCBleHBsaWNpdGx5IHJlcXVlc3RlZCBiZWZvcmUKLSAgICAgICAgLy8gKGEgYnJvYWQgZGVmYXVsdCBtYXkgaGFuZGxlIG1hbnkgdHlwZXMpLiAgbWFrZSBzdXJlIHdlIG1hcmsgaXQgZW5hYmxlZAotICAgICAgICAvLyBzbyBpZiB0aGUgZGVmYXVsdCBpcyBkaXNhYmxlZCB3ZSBrZWVwIHRoZSBjb25uZWN0aW9uIGZvciBvdGhlcnMKLSAgICAgICAgc2V0RW5hYmxlZChpZCwgdHJ1ZSk7Ci0KLSAgICAgICAgaWYgKGlzQXBuVHlwZUFjdGl2ZSh0eXBlKSkgewotICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLklOSVRJTkcpIHJldHVybiBQaG9uZS5BUE5fUkVRVUVTVF9TVEFSVEVEOwotICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEKSByZXR1cm4gUGhvbmUuQVBOX0FMUkVBRFlfQUNUSVZFOworICAgICAgICBpZiAoaXNBcG5JZEVuYWJsZWQoaWQpKSB7CisgICAgICAgICAgICByZXR1cm4gUGhvbmUuQVBOX0FMUkVBRFlfQUNUSVZFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0RW5hYmxlZChpZCwgdHJ1ZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9SRVFVRVNUX1NUQVJURUQ7CiAgICAgfQpAQCAtNDc4LDcgKzU2Miw3IEBACiAgICAgICAgIGlmIChpZCA9PSBBUE5fSU5WQUxJRF9JRCkgewogICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9SRVFVRVNUX0ZBSUxFRDsKICAgICAgICAgfQotICAgICAgICBpZiAoaXNFbmFibGVkKGlkKSkgeworICAgICAgICBpZiAoaXNBcG5JZEVuYWJsZWQoaWQpKSB7CiAgICAgICAgICAgICBzZXRFbmFibGVkKGlkLCBmYWxzZSk7CiAgICAgICAgICAgICBpZiAoaXNBcG5UeXBlQWN0aXZlKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGRhdGFFbmFibGVkW0FQTl9ERUZBVUxUX0lEXSkgewpAQCAtNDk1LDkgKzU3OSwxMCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZXRFbmFibGVkKGludCBpZCwgYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgInNldEVuYWJsZWQoIiArIGlkICsgIiwgIiArIGVuYWJsZSArICIpIHdpdGggb2xkIHN0YXRlID0gIiArCi0gICAgICAgICAgICAgICAgZGF0YUVuYWJsZWRbaWRdICsgIiBhbmQgZW5hYmxlZENvdW50ID0gIiArIGVuYWJsZWRDb3VudCk7Ci0KKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInNldEVuYWJsZWQoIiArIGlkICsgIiwgIiArIGVuYWJsZSArICIpIHdpdGggb2xkIHN0YXRlID0gIgorICAgICAgICAgICAgICAgICAgICArIGRhdGFFbmFibGVkW2lkXSArICIgYW5kIGVuYWJsZWRDb3VudCA9ICIgKyBlbmFibGVkQ291bnQpOworICAgICAgICB9CiAgICAgICAgIE1lc3NhZ2UgbXNnID0gb2J0YWluTWVzc2FnZShFVkVOVF9FTkFCTEVfTkVXX0FQTik7CiAgICAgICAgIG1zZy5hcmcxID0gaWQ7CiAgICAgICAgIG1zZy5hcmcyID0gKGVuYWJsZSA/IEVOQUJMRUQgOiBESVNBQkxFRCk7CkBAIC01MDcsOSArNTkyLDggQEAKICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgb25FbmFibGVBcG4oaW50IGFwbklkLCBpbnQgZW5hYmxlZCkgewogICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiRVZFTlRfQVBOX0VOQUJMRV9SRVFVRVNUICIgKyBhcG5JZCArICIsICIgKyBlbmFibGVkKTsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICIgZGF0YUVuYWJsZWQgPSAiICsgZGF0YUVuYWJsZWRbYXBuSWRdICsKLSAgICAgICAgICAgICAgICAgICAgIiwgZW5hYmxlZENvdW50ID0gIiArIGVuYWJsZWRDb3VudCArCi0gICAgICAgICAgICAgICAgICAgICIsIGlzQXBuVHlwZUFjdGl2ZSA9ICIgKyBpc0FwblR5cGVBY3RpdmUoYXBuSWRUb1R5cGUoYXBuSWQpKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiIGRhdGFFbmFibGVkID0gIiArIGRhdGFFbmFibGVkW2FwbklkXSArICIsIGVuYWJsZWRDb3VudCA9ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlbmFibGVkQ291bnQgKyAiLCBpc0FwblR5cGVBY3RpdmUgPSAiICsgaXNBcG5UeXBlQWN0aXZlKGFwbklkVG9UeXBlKGFwbklkKSkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChlbmFibGVkID09IEVOQUJMRUQpIHsKICAgICAgICAgICAgIGlmICghZGF0YUVuYWJsZWRbYXBuSWRdKSB7CkBAIC01MjAsNiArNjA0LDggQEAKICAgICAgICAgICAgIGlmICghaXNBcG5UeXBlQWN0aXZlKHR5cGUpKSB7CiAgICAgICAgICAgICAgICAgbVJlcXVlc3RlZEFwblR5cGUgPSB0eXBlOwogICAgICAgICAgICAgICAgIG9uRW5hYmxlTmV3QXBuKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5vdGlmeUFwbklkVXBUb0N1cnJlbnQoUGhvbmUuUkVBU09OX0FQTl9TV0lUQ0hFRCwgYXBuSWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gZGlzYWJsZQpAQCAtNTI4LDggKzYxNCwxNyBAQAogICAgICAgICAgICAgICAgIGVuYWJsZWRDb3VudC0tOwogICAgICAgICAgICAgICAgIGlmIChlbmFibGVkQ291bnQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBvbkNsZWFuVXBDb25uZWN0aW9uKHRydWUsIFBob25lLlJFQVNPTl9EQVRBX0RJU0FCTEVEKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFFbmFibGVkW0FQTl9ERUZBVUxUX0lEXSA9PSB0cnVlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhaXNBcG5UeXBlQWN0aXZlKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gc2VuZCB0aGUgZGlzY29ubmVjdCBtc2cgbWFudWFsbHksIHNpbmNlIHRoZSBub3JtYWwgcm91dGUgd29udCBzZW5kCisgICAgICAgICAgICAgICAgLy8gaXQgKGl0J3Mgbm90IGVuYWJsZWQpCisgICAgICAgICAgICAgICAgbm90aWZ5QXBuSWREaXNjb25uZWN0ZWQoUGhvbmUuUkVBU09OX0RBVEFfRElTQUJMRUQsIGFwbklkKTsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YUVuYWJsZWRbQVBOX0RFRkFVTFRfSURdID09IHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFpc0FwblR5cGVBY3RpdmUoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIHRoaXMgaXMgYW4gdWdseSB3YXkgdG8gcmVzdG9yZSB0aGUgZGVmYXVsdCBjb25uIC0gc2hvdWxkIGJlIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgLy8gYnkgYSByZWFsIGNvbnRlbnRpb24gbWFuYWdlciBhbmQgcG9saWN5IHRoYXQgZGlzY29ubmVjdHMgdGhlIGxvd2VyIHByaQorICAgICAgICAgICAgICAgICAgICAvLyBzdHVmZiBhcyBlbmFibGUgcmVxdWVzdHMgY29tZSBpbiBhbmQgcG9wcyB0aGVtIGJhY2sgb24gYXMgd2UgZGlzYWJsZSBiYWNrCisgICAgICAgICAgICAgICAgICAgIC8vIGRvd24gdG8gdGhlIGxvd2VyIHByaSBzdHVmZgogICAgICAgICAgICAgICAgICAgICBtUmVxdWVzdGVkQXBuVHlwZSA9IFBob25lLkFQTl9UWVBFX0RFRkFVTFQ7CiAgICAgICAgICAgICAgICAgICAgIG9uRW5hYmxlTmV3QXBuKCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTc0LDkgKzY2OSwxMSBAQAogICAgICAgICAgICAgICAgIG9uVHJ5U2V0dXBEYXRhKFBob25lLlJFQVNPTl9EQVRBX0VOQUJMRUQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBvbkNsZWFuVXBDb25uZWN0aW9uKHRydWUsIFBob25lLlJFQVNPTl9EQVRBX0RJU0FCTEVEKTsKLSAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0KKyAgICBwcm90ZWN0ZWQgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoRGF0YUNvbm5lY3Rpb24gY29ubmVjdGlvbikgeworICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5nZXRMaW5rUHJvcGVydGllcygpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EZWZhdWx0UGhvbmVOb3RpZmllci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RlZmF1bHRQaG9uZU5vdGlmaWVyLmphdmEKaW5kZXggMDU3YmEwYS4uYmYzYzRkMSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RlZmF1bHRQaG9uZU5vdGlmaWVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RlZmF1bHRQaG9uZU5vdGlmaWVyLmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwpAQCAtOTIsMjYgKzkzLDQyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24pIHsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIGRvTm90aWZ5RGF0YUNvbm5lY3Rpb24oc2VuZGVyLCByZWFzb24sIGFwblR5cGUsIHNlbmRlci5nZXREYXRhQ29ubmVjdGlvblN0YXRlKGFwblR5cGUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlLAorICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlKSB7CisgICAgICAgIGRvTm90aWZ5RGF0YUNvbm5lY3Rpb24oc2VuZGVyLCByZWFzb24sIGFwblR5cGUsIHN0YXRlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9Ob3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlLAorICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlKSB7CisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgLy8gdXNlIGFwblR5cGUgYXMgdGhlIGtleSB0byB3aGljaCBjb25uZWN0aW9uIHdlJ3JlIHRhbGtpbmcgYWJvdXQuCisgICAgICAgIC8vIHBhc3MgYXBuVHlwZSBiYWNrIHVwIHRvIGZldGNoIHBhcnRpY3VsYXIgZm9yIHRoaXMgb25lLgogICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyIHRlbGVwaG9ueSA9IFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpOworICAgICAgICBMaW5rUHJvcGVydGllcyBsaW5rUHJvcGVydGllcyA9IG51bGw7CisgICAgICAgIGlmIChzdGF0ZSA9PSBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVEVEKSB7CisgICAgICAgICAgICBsaW5rUHJvcGVydGllcyA9IHNlbmRlci5nZXRMaW5rUHJvcGVydGllcyhhcG5UeXBlKTsKKyAgICAgICAgfQogICAgICAgICB0cnkgewogICAgICAgICAgICAgbVJlZ2lzdHJ5Lm5vdGlmeURhdGFDb25uZWN0aW9uKAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0RGF0YVN0YXRlKHNlbmRlci5nZXREYXRhQ29ubmVjdGlvblN0YXRlKCkpLAorICAgICAgICAgICAgICAgICAgICBjb252ZXJ0RGF0YVN0YXRlKHN0YXRlKSwKICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlKCksIHJlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmdldEFjdGl2ZUFwbigpLAotICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0QWN0aXZlQXBuVHlwZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmdldEludGVyZmFjZU5hbWUobnVsbCksCisgICAgICAgICAgICAgICAgICAgIGFwblR5cGUsCisgICAgICAgICAgICAgICAgICAgIGxpbmtQcm9wZXJ0aWVzLAogICAgICAgICAgICAgICAgICAgICAoKHRlbGVwaG9ueSE9bnVsbCkgPyB0ZWxlcGhvbnkuZ2V0TmV0d29ya1R5cGUoKSA6Ci0gICAgICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuTkVUV09SS19UWVBFX1VOS05PV04pLAotICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0R2F0ZXdheShudWxsKSk7CisgICAgICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuTkVUV09SS19UWVBFX1VOS05PV04pKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkCiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24pIHsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtUmVnaXN0cnkubm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uKTsKKyAgICAgICAgICAgIG1SZWdpc3RyeS5ub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChyZWFzb24sIGFwblR5cGUpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0LmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXQuamF2YQppbmRleCA3ZWRmMDY1Li43NWVhMTE2IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXQuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXQuamF2YQpAQCAtMTYsNyArMTYsNiBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUludEFycmF5OwogCiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTE3MSw3ICsxNzAsNyBAQAogICAgICAqIGFycmF5IGNhbm5vdCBjb250YWluIG1vcmUgdGhhbiAyNTUgc2VwdGV0cy4KICAgICAgKgogICAgICAqIEBwYXJhbSBkYXRhIFRoZSB0ZXh0IHN0cmluZyB0byBlbmNvZGUuCi0gICAgICogQHBhcmFtIGhlYWRlciBPcHRpb25hbCBoZWFkZXIgKGluY2x1ZGVpbmcgbGVuZ3RoIGJ5dGUpIHRoYXQgcHJlY2VkZXMKKyAgICAgKiBAcGFyYW0gaGVhZGVyIE9wdGlvbmFsIGhlYWRlciAoaW5jbHVkaW5nIGxlbmd0aCBieXRlKSB0aGF0IHByZWNlZGVzCiAgICAgICogdGhlIGVuY29kZWQgZGF0YSwgcGFkZGVkIHRvIHNlcHRldCBib3VuZGFyeS4KICAgICAgKiBAcmV0dXJuIEJ5dGUgYXJyYXkgY29udGFpbmluZyBoZWFkZXIgYW5kIGVuY29kZWQgZGF0YS4KICAgICAgKi8KQEAgLTIwNCw3ICsyMDMsNyBAQAogICAgICAqIHRoZSBwYWNrZWQgc2VwdGV0cy4gVGhlIHJldHVybmVkIGFycmF5IGNhbm5vdCBjb250YWluIG1vcmUgdGhhbiAyNTUKICAgICAgKiBzZXB0ZXRzLgogICAgICAqCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgc3RyaW5nIHRvIGVuZGNvZGUKKyAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBzdHJpbmcgdG8gZW5jb2RlCiAgICAgICogQHRocm93cyBFbmNvZGVFeGNlcHRpb24gaWYgU3RyaW5nIGlzIHRvbyBsYXJnZSB0byBlbmNvZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBzdHJpbmdUb0dzbTdCaXRQYWNrZWQoU3RyaW5nIGRhdGEpCkBAIC0yMjMsNyArMjIyLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBkYXRhIHRoZSB0ZXh0IHRvIGNvbnZlcnQgdG8gc2VwdGV0cwogICAgICAqIEBwYXJhbSBzdGFydGluZ1NlcHRldE9mZnNldCB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgc2VwdGV0cyB0byBwdXQgYmVmb3JlCi0gICAgICogIHRoZSBjaGFyYWN0ZXIgZGF0YSBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIGFycmF5CisgICAgICogIHRoZSBjaGFyYWN0ZXIgZGF0YSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheQogICAgICAqIEBwYXJhbSB0aHJvd0V4Y2VwdGlvbiBJZiB0cnVlLCB0aHJvd3MgRW5jb2RlRXhjZXB0aW9uIG9uIGludmFsaWQgY2hhci4KICAgICAgKiAgIElmIGZhbHNlLCByZXBsYWNlcyB1bmVuY29kYWJsZSBjaGFyIHdpdGggR1NNIGFscGhhYmV0IHNwYWNlIGNoYXIuCiAgICAgICoKQEAgLTI1Nyw3ICsyNTYsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhY2sgYSA3LWJpdCBjaGFyIGludG8gaXRzIGFwcHJvcGlyYXRlIHBsYWNlIGluIGEgYnl0ZSBhcnJheQorICAgICAqIFBhY2sgYSA3LWJpdCBjaGFyIGludG8gaXRzIGFwcHJvcHJpYXRlIHBsYWNlIGluIGEgYnl0ZSBhcnJheQogICAgICAqCiAgICAgICogQHBhcmFtIGJpdE9mZnNldCB0aGUgYml0IG9mZnNldCB0aGF0IHRoZSBzZXB0ZXQgc2hvdWxkIGJlIHBhY2tlZCBhdAogICAgICAqICAgICAgICAgICAgICAgICAgKHNlcHRldCBpbmRleCAqIDcpCkBAIC0zMjAsNyArMzE5LDcgQEAKIAogICAgICAgICAgICAgICAgIGdzbVZhbCA9ICgweDdmICYgKHBkdVtvZmZzZXQgKyBieXRlT2Zmc2V0XSA+PiBzaGlmdCkpOwogCi0gICAgICAgICAgICAgICAgLy8gaWYgaXQgY3Jvc3NlcyBhIGJ5dGUgYm91bmRyeQorICAgICAgICAgICAgICAgIC8vIGlmIGl0IGNyb3NzZXMgYSBieXRlIGJvdW5kYXJ5CiAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID4gMSkgewogICAgICAgICAgICAgICAgICAgICAvLyBzZXQgbXNiIGJpdHMgdG8gMAogICAgICAgICAgICAgICAgICAgICBnc21WYWwgJj0gMHg3ZiA+PiAoc2hpZnQgLSAxKTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255LmFpZGwgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueS5haWRsCmluZGV4IDIzMjg3MTcuLjdhMTU4N2IgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255LmFpZGwKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnkuYWlkbApAQCAtMjM5LDkgKzIzOSwxMSBAQAogICAgIFN0cmluZyBnZXRDZG1hRXJpVGV4dCgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIENETUEgcHJvdmlzaW9uaW5nIG5lZWRzIHRvIHJ1bi4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgT1RBIHNlcnZpY2UgcHJvdmlzaW9uaW5nIG5lZWRzIHRvIHJ1bi4KKyAgICAgKiBPbmx5IHJlbGV2YW50IG9uIHNvbWUgdGVjaG5vbG9naWVzLCBvdGhlcnMgd2lsbCBhbHdheXMKKyAgICAgKiByZXR1cm4gZmFsc2UuCiAgICAgICovCi0gICAgYm9vbGVhbiBnZXRDZG1hTmVlZHNQcm92aXNpb25pbmcoKTsKKyAgICBib29sZWFuIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpOwogCiAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIHVucmVhZCBjb3VudCBvZiB2b2ljZW1haWxzCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueVJlZ2lzdHJ5LmFpZGwgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueVJlZ2lzdHJ5LmFpZGwKaW5kZXggODdlNGI1Mi4uZWI3ZTU2NiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnlSZWdpc3RyeS5haWRsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255UmVnaXN0cnkuYWlkbApAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TaWduYWxTdHJlbmd0aDsKQEAgLTMyLDggKzMzLDggQEAKICAgICB2b2lkIG5vdGlmeUNhbGxGb3J3YXJkaW5nQ2hhbmdlZChib29sZWFuIGNmaSk7CiAgICAgdm9pZCBub3RpZnlEYXRhQWN0aXZpdHkoaW50IHN0YXRlKTsKICAgICB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKGludCBzdGF0ZSwgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSwKLSAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIGluIFN0cmluZ1tdIGFwblR5cGVzLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgaW50IG5ldHdvcmtUeXBlLAotICAgICAgICAgICAgU3RyaW5nIGdhdGV3YXkpOwotICAgIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbik7CisgICAgICAgICAgICBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuLCBTdHJpbmcgYXBuVHlwZSwgaW4gTGlua1Byb3BlcnRpZXMgbGlua1Byb3BlcnRpZXMsCisgICAgICAgICAgICBpbnQgbmV0d29ya1R5cGUpOworICAgIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpOwogICAgIHZvaWQgbm90aWZ5Q2VsbExvY2F0aW9uKGluIEJ1bmRsZSBjZWxsTG9jYXRpb24pOwogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Ntc0ludGVyZmFjZU1hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NTbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKaW5kZXggOGE1YTZhZS4uNWZlZjZkZSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Ntc0ludGVyZmFjZU1hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgICogQHBhcmFtIGRlc3RQb3J0IHRoZSBwb3J0IHRvIGRlbGl2ZXIgdGhlIG1lc3NhZ2UgdG8KICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZSB0byBzZW5kCiAgICAgICogQHBhcmFtIHNlbnRJbnRlbnQgaWYgbm90IE5VTEwgdGhpcyA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPiBpcwotICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCisgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCiAgICAgICogIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzxjb2RlPiBmb3Igc3VjY2VzcywKICAgICAgKiAgb3Igb25lIG9mIHRoZXNlIGVycm9yczo8YnI+CiAgICAgICogIDxjb2RlPlJFU1VMVF9FUlJPUl9HRU5FUklDX0ZBSUxVUkU8L2NvZGU+PGJyPgpAQCAtNjcsNyArNjcsNyBAQAogICAgICAqICB0aGUgZXh0cmEgImVycm9yQ29kZSIgY29udGFpbmluZyBhIHJhZGlvIHRlY2hub2xvZ3kgc3BlY2lmaWMgdmFsdWUsCiAgICAgICogIGdlbmVyYWxseSBvbmx5IHVzZWZ1bCBmb3IgdHJvdWJsZXNob290aW5nLjxicj4KICAgICAgKiAgVGhlIHBlci1hcHBsaWNhdGlvbiBiYXNlZCBTTVMgY29udHJvbCBjaGVja3Mgc2VudEludGVudC4gSWYgc2VudEludGVudAotICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYWl0b25zLAorICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYXRpb25zLAogICAgICAqICB3aGljaCBjYXVzZSBzbWFsbGVyIG51bWJlciBvZiBTTVMgdG8gYmUgc2VudCBpbiBjaGVja2luZyBwZXJpb2QuCiAgICAgICogQHBhcmFtIGRlbGl2ZXJ5SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT4gaXMKICAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgZGVsaXZlcmVkIHRvIHRoZSByZWNpcGllbnQuICBUaGUKQEAgLTk0LDcgKzk0LDcgQEAKICAgICAgKiAgdGhlIGN1cnJlbnQgZGVmYXVsdCBTTVNDCiAgICAgICogQHBhcmFtIHRleHQgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UgdG8gc2VuZAogICAgICAqIEBwYXJhbSBzZW50SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT4gaXMKLSAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgorICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgogICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8Y29kZT4gZm9yIHN1Y2Nlc3MsCiAgICAgICogIG9yIG9uZSBvZiB0aGVzZSBlcnJvcnM6PGJyPgogICAgICAqICA8Y29kZT5SRVNVTFRfRVJST1JfR0VORVJJQ19GQUlMVVJFPC9jb2RlPjxicj4KQEAgLTE0MCw3ICsxNDAsNyBAQAogICAgICAqICAgPGNvZGU+UkVTVUxUX0VSUk9SX1JBRElPX09GRjwvY29kZT4KICAgICAgKiAgIDxjb2RlPlJFU1VMVF9FUlJPUl9OVUxMX1BEVTwvY29kZT4uCiAgICAgICogIFRoZSBwZXItYXBwbGljYXRpb24gYmFzZWQgU01TIGNvbnRyb2wgY2hlY2tzIHNlbnRJbnRlbnQuIElmIHNlbnRJbnRlbnQKLSAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2FpdG9ucywKKyAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2F0aW9ucywKICAgICAgKiAgd2hpY2ggY2F1c2Ugc21hbGxlciBudW1iZXIgb2YgU01TIHRvIGJlIHNlbnQgaW4gY2hlY2tpbmcgcGVyaW9kLgogICAgICAqIEBwYXJhbSBkZWxpdmVyeUludGVudHMgaWYgbm90IG51bGwsIGFuIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gb2YKICAgICAgKiAgIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+cyAob25lIGZvciBlYWNoIG1lc3NhZ2UgcGFydCkgdGhhdCBpcwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1V0aWxzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjVXRpbHMuamF2YQppbmRleCA5NTdlZGRkLi4wMDVhZTM3IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjVXRpbHMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjVXRpbHMuamF2YQpAQCAtMjY3LDkgKzI2NywxMSBAQAogCiAKICAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGJ5dGUgYXJyYXkgaW50byBhIFN0cmluZyBoZXhpZGVjaW1hbCBjaGFyYWN0ZXJzCisgICAgICogQ29udmVydHMgYSBieXRlIGFycmF5IGludG8gYSBTdHJpbmcgb2YgaGV4YWRlY2ltYWwgY2hhcmFjdGVycy4KICAgICAgKgotICAgICAqIG51bGwgcmV0dXJucyBudWxsCisgICAgICogQHBhcmFtIGJ5dGVzIGFuIGFycmF5IG9mIGJ5dGVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGhleCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYnl0ZXMgYXJyYXkKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZwogICAgIGJ5dGVzVG9IZXhTdHJpbmcoYnl0ZVtdIGJ5dGVzKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZS5qYXZhCmluZGV4IGI3M2MyZjcuLjliMGFhM2MgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZS5qYXZhCkBAIC0yMywzNDYgKzIzLDEzIEBACiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFRoZSB0YWJsZSBiZWxvdyBpcyBidWlsdCBmcm9tIHR3byByZXNvdXJjZXM6Ci0gKgotICogMSkgSVRVICJNb2JpbGUgTmV0d29yayBDb2RlIChNTkMpIGZvciB0aGUgaW50ZXJuYXRpb25hbAotICogICBpZGVudGlmaWNhdGlvbiBwbGFuIGZvciBtb2JpbGUgdGVybWluYWxzIGFuZCBtb2JpbGUgdXNlcnMiCi0gKiAgIHdoaWNoIGlzIGF2YWlsYWJsZSBhcyBhbiBhbm5leCB0byB0aGUgSVRVIG9wZXJhdGlvbmFsIGJ1bGxldGluCi0gKiAgIGF2YWlsYWJsZSBoZXJlOiBodHRwOi8vd3d3Lml0dS5pbnQvaXR1LXQvYnVsbGV0aW4vYW5uZXguaHRtbAotICoKLSAqIDIpIFRoZSBJU08gMzE2NiBjb3VudHJ5IGNvZGVzIGxpc3QsIGF2YWlsYWJsZSBoZXJlOgotICogICAgaHR0cDovL3d3dy5pc28ub3JnL2lzby9lbi9wcm9kcy1zZXJ2aWNlcy9pc28zMTY2bWEvMDJpc28tMzE2Ni1jb2RlLWxpc3RzL2luZGV4Lmh0bWwKLSAqCi0gKiBUaGlzIHRhYmxlIHdhcyB2ZXJpZmllZCAoMjggQXVnIDIwMDkpIGFnYWluc3QKLSAqIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGlzdF9vZl9tb2JpbGVfY291bnRyeV9jb2RlcyB3aXRoIHRoZQotICogb25seSB1bnJlc29sdmVkIGRpc2NyZXBhbmN5IGJlaW5nIHRoYXQgdGhpcyBsaXN0IGhhcyBhbiBleHRyYSBlbnRyeQotICogKDQ2MSkgZm9yIENoaW5hLgotICoKLSAqIFRPRE86IENvbXBsZXRlIHRoZSBtYXBwaW5ncyBmb3IgdGltZXpvbmVzIGFuZCBsYW5ndWFnZS9sb2NhbGUgY29kZXMuCi0gKgotICogVGhlIGFjdHVhbCB0YWJsZSBkYXRhIHVzZWQgaW4gdGhlIEphdmEgY29kZSBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUKLSAqIGJlbG93IFB5dGhvbiBjb2RlIGZvciBlZmZpY2llbmN5LiAgVGhlIGluZm9ybWF0aW9uIGlzIGV4cGVjdGVkIHRvCi0gKiBiZSBzdGF0aWMsIGJ1dCBpZiBjaGFuZ2VzIGFyZSByZXF1aXJlZCwgdGhlIHRhYmxlIGluIHRoZSBweXRob24KLSAqIGNvZGUgY2FuIGJlIG1vZGlmaWVkIGFuZCB0aGUgdHJhaWxpbmcgY29kZSBydW4gdG8gcmUtZ2VuZXJhdGUgdGhlCi0gKiB0YWJsZXMgdGhhdCBhcmUgdG8gYmUgdXNlZCBieSBKYXZhLgotCi1tY2NfdGFibGUgPSBbCi0gICgyMDIsICdncicsIDIsICdHcmVlY2UnKSwKLSAgKDIwNCwgJ25sJywgMiwgJ0V1cm9wZS9BbXN0ZXJkYW0nLCAnbmwnLCAxMywgJ05ldGhlcmxhbmRzIChLaW5nZG9tIG9mIHRoZSknKSwKLSAgKDIwNiwgJ2JlJywgMiwgJ0JlbGdpdW0nKSwKLSAgKDIwOCwgJ2ZyJywgMiwgJ0V1cm9wZS9QYXJpcycsICdmcicsICdGcmFuY2UnKSwKLSAgKDIxMiwgJ21jJywgMiwgJ01vbmFjbyAoUHJpbmNpcGFsaXR5IG9mKScpLAotICAoMjEzLCAnYWQnLCAyLCAnQW5kb3JyYSAoUHJpbmNpcGFsaXR5IG9mKScpLAotICAoMjE0LCAnZXMnLCAyLCAnRXVyb3BlL01hZHJpZCcsICdlcycsICdTcGFpbicpLAotICAoMjE2LCAnaHUnLCAyLCAnSHVuZ2FyeSAoUmVwdWJsaWMgb2YpJyksCi0gICgyMTgsICdiYScsIDIsICdCb3NuaWEgYW5kIEhlcnplZ292aW5hJyksCi0gICgyMTksICdocicsIDIsICdDcm9hdGlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDIyMCwgJ3JzJywgMiwgJ1NlcmJpYSBhbmQgTW9udGVuZWdybycpLAotICAoMjIyLCAnaXQnLCAyLCAnRXVyb3BlL1JvbWUnLCAnaXQnLCAnSXRhbHknKSwKLSAgKDIyNSwgJ3ZhJywgMiwgJ0V1cm9wZS9Sb21lJywgJ2l0JywgJ1ZhdGljYW4gQ2l0eSBTdGF0ZScpLAotICAoMjI2LCAncm8nLCAyLCAnUm9tYW5pYScpLAotICAoMjI4LCAnY2gnLCAyLCAnRXVyb3BlL1p1cmljaCcsICdkZScsICdTd2l0emVybGFuZCAoQ29uZmVkZXJhdGlvbiBvZiknKSwKLSAgKDIzMCwgJ2N6JywgMiwgJ0V1cm9wZS9QcmFndWUnLCAnY3MnLCAxMywgJ0N6ZWNoIFJlcHVibGljJyksCi0gICgyMzEsICdzaycsIDIsICdTbG92YWsgUmVwdWJsaWMnKSwKLSAgKDIzMiwgJ2F0JywgMiwgJ0V1cm9wZS9WaWVubmEnLCAnZGUnLCAxMywgJ0F1c3RyaWEnKSwKLSAgKDIzNCwgJ2diJywgMiwgJ0V1cm9wZS9Mb25kb24nLCAnZW4nLCAxMywgJ1VuaXRlZCBLaW5nZG9tIG9mIEdyZWF0IEJyaXRhaW4gYW5kIE5vcnRoZXJuIElyZWxhbmQnKSwKLSAgKDIzNSwgJ2diJywgMiwgJ0V1cm9wZS9Mb25kb24nLCAnZW4nLCAxMywgJ1VuaXRlZCBLaW5nZG9tIG9mIEdyZWF0IEJyaXRhaW4gYW5kIE5vcnRoZXJuIElyZWxhbmQnKSwKLSAgKDIzOCwgJ2RrJywgMiwgJ0Rlbm1hcmsnKSwKLSAgKDI0MCwgJ3NlJywgMiwgJ1N3ZWRlbicpLAotICAoMjQyLCAnbm8nLCAyLCAnTm9yd2F5JyksCi0gICgyNDQsICdmaScsIDIsICdGaW5sYW5kJyksCi0gICgyNDYsICdsdCcsIDIsICdMaXRodWFuaWEgKFJlcHVibGljIG9mKScpLAotICAoMjQ3LCAnbHYnLCAyLCAnTGF0dmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDI0OCwgJ2VlJywgMiwgJ0VzdG9uaWEgKFJlcHVibGljIG9mKScpLAotICAoMjUwLCAncnUnLCAyLCAnUnVzc2lhbiBGZWRlcmF0aW9uJyksCi0gICgyNTUsICd1YScsIDIsICdVa3JhaW5lJyksCi0gICgyNTcsICdieScsIDIsICdCZWxhcnVzIChSZXB1YmxpYyBvZiknKSwKLSAgKDI1OSwgJ21kJywgMiwgJ01vbGRvdmEgKFJlcHVibGljIG9mKScpLAotICAoMjYwLCAncGwnLCAyLCAnRXVyb3BlL1dhcnNhdycsICdQb2xhbmQgKFJlcHVibGljIG9mKScpLAotICAoMjYyLCAnZGUnLCAyLCAnRXVyb3BlL0JlcmxpbicsICdkZScsIDEzLCAnR2VybWFueSAoRmVkZXJhbCBSZXB1YmxpYyBvZiknKSwKLSAgKDI2NiwgJ2dpJywgMiwgJ0dpYnJhbHRhcicpLAotICAoMjY4LCAncHQnLCAyLCAnUG9ydHVnYWwnKSwKLSAgKDI3MCwgJ2x1JywgMiwgJ0x1eGVtYm91cmcnKSwKLSAgKDI3MiwgJ2llJywgMiwgJ0V1cm9wZS9EdWJsaW4nLCAnZW4nLCAnSXJlbGFuZCcpLAotICAoMjc0LCAnaXMnLCAyLCAnSWNlbGFuZCcpLAotICAoMjc2LCAnYWwnLCAyLCAnQWxiYW5pYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyNzgsICdtdCcsIDIsICdNYWx0YScpLAotICAoMjgwLCAnY3knLCAyLCAnQ3lwcnVzIChSZXB1YmxpYyBvZiknKSwKLSAgKDI4MiwgJ2dlJywgMiwgJ0dlb3JnaWEnKSwKLSAgKDI4MywgJ2FtJywgMiwgJ0FybWVuaWEgKFJlcHVibGljIG9mKScpLAotICAoMjg0LCAnYmcnLCAyLCAnQnVsZ2FyaWEgKFJlcHVibGljIG9mKScpLAotICAoMjg2LCAndHInLCAyLCAnVHVya2V5JyksCi0gICgyODgsICdmbycsIDIsICdGYXJvZSBJc2xhbmRzJyksCi0gICgyODksICdnZScsIDIsICdBYmtoYXppYSAoR2VvcmdpYSknKSwKLSAgKDI5MCwgJ2dsJywgMiwgJ0dyZWVubGFuZCAoRGVubWFyayknKSwKLSAgKDI5MiwgJ3NtJywgMiwgJ1NhbiBNYXJpbm8gKFJlcHVibGljIG9mKScpLAotICAoMjkzLCAnc2wnLCAyLCAnU2xvdmVuaWEgKFJlcHVibGljIG9mKScpLAotICAoMjk0LCAnbWsnLCAyLCAnVGhlIEZvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBvZiBNYWNlZG9uaWEnKSwKLSAgKDI5NSwgJ2xpJywgMiwgJ0xpZWNodGVuc3RlaW4gKFByaW5jaXBhbGl0eSBvZiknKSwKLSAgKDI5NywgJ21lJywgMiwgJ01vbnRlbmVncm8gKFJlcHVibGljIG9mKScpLAotICAoMzAyLCAnY2EnLCAzLCAnJywgJycsIDExLCAnQ2FuYWRhJyksCi0gICgzMDgsICdwbScsIDIsICdTYWludCBQaWVycmUgYW5kIE1pcXVlbG9uIChDb2xsZWN0aXZpdCB0ZXJyaXRvcmlhbGUgZGUgbGEgUnB1YmxpcXVlIGZyYW5haXNlKScpLAotICAoMzEwLCAndXMnLCAzLCAnJywgJ2VuJywgMTEsICdVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EnKSwKLSAgKDMxMSwgJ3VzJywgMywgJycsICdlbicsIDExLCAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJyksCi0gICgzMTIsICd1cycsIDMsICcnLCAnZW4nLCAxMSwgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpLAotICAoMzEzLCAndXMnLCAzLCAnJywgJ2VuJywgMTEsICdVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EnKSwKLSAgKDMxNCwgJ3VzJywgMywgJycsICdlbicsIDExLCAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJyksCi0gICgzMTUsICd1cycsIDMsICcnLCAnZW4nLCAxMSwgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpLAotICAoMzE2LCAndXMnLCAzLCAnJywgJ2VuJywgMTEsICdVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EnKSwKLSAgKDMzMCwgJ3ByJywgMiwgJ1B1ZXJ0byBSaWNvJyksCi0gICgzMzIsICd2aScsIDIsICdVbml0ZWQgU3RhdGVzIFZpcmdpbiBJc2xhbmRzJyksCi0gICgzMzQsICdteCcsIDMsICdNZXhpY28nKSwKLSAgKDMzOCwgJ2ptJywgMywgJ0phbWFpY2EnKSwKLSAgKDM0MCwgJ2dwJywgMiwgJ0d1YWRlbG91cGUgKEZyZW5jaCBEZXBhcnRtZW50IG9mKScpLAotICAoMzQyLCAnYmInLCAzLCAnQmFyYmFkb3MnKSwKLSAgKDM0NCwgJ2FnJywgMywgJ0FudGlndWEgYW5kIEJhcmJ1ZGEnKSwKLSAgKDM0NiwgJ2t5JywgMywgJ0NheW1hbiBJc2xhbmRzJyksCi0gICgzNDgsICd2ZycsIDMsICdCcml0aXNoIFZpcmdpbiBJc2xhbmRzJyksCi0gICgzNTAsICdibScsIDIsICdCZXJtdWRhJyksCi0gICgzNTIsICdnZCcsIDIsICdHcmVuYWRhJyksCi0gICgzNTQsICdtcycsIDIsICdNb250c2VycmF0JyksCi0gICgzNTYsICdrbicsIDIsICdTYWludCBLaXR0cyBhbmQgTmV2aXMnKSwKLSAgKDM1OCwgJ2xjJywgMiwgJ1NhaW50IEx1Y2lhJyksCi0gICgzNjAsICd2YycsIDIsICdTYWludCBWaW5jZW50IGFuZCB0aGUgR3JlbmFkaW5lcycpLAotICAoMzYyLCAnbmwnLCAyLCAnTmV0aGVybGFuZHMgQW50aWxsZXMnKSwKLSAgKDM2MywgJ2F3JywgMiwgJ0FydWJhJyksCi0gICgzNjQsICdicycsIDIsICdCYWhhbWFzIChDb21tb253ZWFsdGggb2YgdGhlKScpLAotICAoMzY1LCAnYWknLCAzLCAnQW5ndWlsbGEnKSwKLSAgKDM2NiwgJ2RtJywgMiwgJ0RvbWluaWNhIChDb21tb253ZWFsdGggb2YpJyksCi0gICgzNjgsICdjdScsIDIsICdDdWJhJyksCi0gICgzNzAsICdkbycsIDIsICdEb21pbmljYW4gUmVwdWJsaWMnKSwKLSAgKDM3MiwgJ2h0JywgMiwgJ0hhaXRpIChSZXB1YmxpYyBvZiknKSwKLSAgKDM3NCwgJ3R0JywgMiwgJ1RyaW5pZGFkIGFuZCBUb2JhZ28nKSwKLSAgKDM3NiwgJ3RjJywgMiwgJ1R1cmtzIGFuZCBDYWljb3MgSXNsYW5kcycpLAotICAoNDAwLCAnYXonLCAyLCAnQXplcmJhaWphbmkgUmVwdWJsaWMnKSwKLSAgKDQwMSwgJ2t6JywgMiwgJ0themFraHN0YW4gKFJlcHVibGljIG9mKScpLAotICAoNDAyLCAnYnQnLCAyLCAnQmh1dGFuIChLaW5nZG9tIG9mKScpLAotICAoNDA0LCAnaW4nLCAyLCAnSW5kaWEgKFJlcHVibGljIG9mKScpLAotICAoNDA1LCAnaW4nLCAyLCAnSW5kaWEgKFJlcHVibGljIG9mKScpLAotICAoNDEwLCAncGsnLCAyLCAnUGFraXN0YW4gKElzbGFtaWMgUmVwdWJsaWMgb2YpJyksCi0gICg0MTIsICdhZicsIDIsICdBZmdoYW5pc3RhbicpLAotICAoNDEzLCAnbGsnLCAyLCAnU3JpIExhbmthIChEZW1vY3JhdGljIFNvY2lhbGlzdCBSZXB1YmxpYyBvZiknKSwKLSAgKDQxNCwgJ21tJywgMiwgJ015YW5tYXIgKFVuaW9uIG9mKScpLAotICAoNDE1LCAnbGInLCAyLCAnTGViYW5vbicpLAotICAoNDE2LCAnam8nLCAyLCAnSm9yZGFuIChIYXNoZW1pdGUgS2luZ2RvbSBvZiknKSwKLSAgKDQxNywgJ3N5JywgMiwgJ1N5cmlhbiBBcmFiIFJlcHVibGljJyksCi0gICg0MTgsICdpcScsIDIsICdJcmFxIChSZXB1YmxpYyBvZiknKSwKLSAgKDQxOSwgJ2t3JywgMiwgJ0t1d2FpdCAoU3RhdGUgb2YpJyksCi0gICg0MjAsICdzYScsIDIsICdTYXVkaSBBcmFiaWEgKEtpbmdkb20gb2YpJyksCi0gICg0MjEsICd5ZScsIDIsICdZZW1lbiAoUmVwdWJsaWMgb2YpJyksCi0gICg0MjIsICdvbScsIDIsICdPbWFuIChTdWx0YW5hdGUgb2YpJyksCi0gICg0MjMsICdwcycsIDIsICdQYWxlc3RpbmUnKSwKLSAgKDQyNCwgJ2FlJywgMiwgJ1VuaXRlZCBBcmFiIEVtaXJhdGVzJyksCi0gICg0MjUsICdpbCcsIDIsICdJc3JhZWwgKFN0YXRlIG9mKScpLAotICAoNDI2LCAnYmgnLCAyLCAnQmFocmFpbiAoS2luZ2RvbSBvZiknKSwKLSAgKDQyNywgJ3FhJywgMiwgJ1FhdGFyIChTdGF0ZSBvZiknKSwKLSAgKDQyOCwgJ21uJywgMiwgJ01vbmdvbGlhJyksCi0gICg0MjksICducCcsIDIsICdOZXBhbCcpLAotICAoNDMwLCAnYWUnLCAyLCAnVW5pdGVkIEFyYWIgRW1pcmF0ZXMnKSwKLSAgKDQzMSwgJ2FlJywgMiwgJ1VuaXRlZCBBcmFiIEVtaXJhdGVzJyksCi0gICg0MzIsICdpcicsIDIsICdJcmFuIChJc2xhbWljIFJlcHVibGljIG9mKScpLAotICAoNDM0LCAndXonLCAyLCAnVXpiZWtpc3RhbiAoUmVwdWJsaWMgb2YpJyksCi0gICg0MzYsICd0aicsIDIsICdUYWppa2lzdGFuIChSZXB1YmxpYyBvZiknKSwKLSAgKDQzNywgJ2tnJywgMiwgJ0t5cmd5eiBSZXB1YmxpYycpLAotICAoNDM4LCAndG0nLCAyLCAnVHVya21lbmlzdGFuJyksCi0gICg0NDAsICdqcCcsIDIsICdBc2lhL1Rva3lvJywgJ2phJywgMTQsICdKYXBhbicpLAotICAoNDQxLCAnanAnLCAyLCAnQXNpYS9Ub2t5bycsICdqYScsIDE0LCAnSmFwYW4nKSwKLSAgKDQ1MCwgJ2tyJywgMiwgJ0tvcmVhIChSZXB1YmxpYyBvZiknKSwKLSAgKDQ1MiwgJ3ZuJywgMiwgJ1ZpZXQgTmFtIChTb2NpYWxpc3QgUmVwdWJsaWMgb2YpJyksCi0gICg0NTQsICdoaycsIDIsICciSG9uZyBLb25nLCBDaGluYSInKSwKLSAgKDQ1NSwgJ21vJywgMiwgJyJNYWNhbywgQ2hpbmEiJyksCi0gICg0NTYsICdraCcsIDIsICdDYW1ib2RpYSAoS2luZ2RvbSBvZiknKSwKLSAgKDQ1NywgJ2xhJywgMiwgIkxhbyBQZW9wbGUncyBEZW1vY3JhdGljIFJlcHVibGljIiksCi0gICg0NjAsICdjbicsIDIsICJBc2lhL0JlaWppbmciLCAnemgnLCAxMywgIkNoaW5hIChQZW9wbGUncyBSZXB1YmxpYyBvZikiKSwKLSAgKDQ2MSwgJ2NuJywgMiwgIkFzaWEvQmVpamluZyIsICd6aCcsIDEzLCAiQ2hpbmEgKFBlb3BsZSdzIFJlcHVibGljIG9mKSIpLAotICAoNDY2LCAndHcnLCAyLCAiVGFpd2FuIChSZXB1YmxpYyBvZiBDaGluYSkiKSwKLSAgKDQ2NywgJ2twJywgMiwgIkRlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YgS29yZWEiKSwKLSAgKDQ3MCwgJ2JkJywgMiwgIkJhbmdsYWRlc2ggKFBlb3BsZSdzIFJlcHVibGljIG9mKSIpLAotICAoNDcyLCAnbXYnLCAyLCAnTWFsZGl2ZXMgKFJlcHVibGljIG9mKScpLAotICAoNTAyLCAnbXknLCAyLCAnTWFsYXlzaWEnKSwKLSAgKDUwNSwgJ2F1JywgMiwgJ0F1c3RyYWxpYS9TeWRuZXknLCAnZW4nLCAxMSwgJ0F1c3RyYWxpYScpLAotICAoNTEwLCAnaWQnLCAyLCAnSW5kb25lc2lhIChSZXB1YmxpYyBvZiknKSwKLSAgKDUxNCwgJ3RsJywgMiwgJ0RlbW9jcmF0aWMgUmVwdWJsaWMgb2YgVGltb3ItTGVzdGUnKSwKLSAgKDUxNSwgJ3BoJywgMiwgJ1BoaWxpcHBpbmVzIChSZXB1YmxpYyBvZiB0aGUpJyksCi0gICg1MjAsICd0aCcsIDIsICdUaGFpbGFuZCcpLAotICAoNTI1LCAnc2cnLCAyLCAnQXNpYS9TaW5nYXBvcmUnLCAnZW4nLCAxMSwgJ1NpbmdhcG9yZSAoUmVwdWJsaWMgb2YpJyksCi0gICg1MjgsICdibicsIDIsICdCcnVuZWkgRGFydXNzYWxhbScpLAotICAoNTMwLCAnbnonLCAyLCAnUGFjaWZpYy9BdWNrbGFuZCcsICdlbicsICdOZXcgWmVhbGFuZCcpLAotICAoNTM0LCAnbXAnLCAyLCAnTm9ydGhlcm4gTWFyaWFuYSBJc2xhbmRzIChDb21tb253ZWFsdGggb2YgdGhlKScpLAotICAoNTM1LCAnZ3UnLCAyLCAnR3VhbScpLAotICAoNTM2LCAnbnInLCAyLCAnTmF1cnUgKFJlcHVibGljIG9mKScpLAotICAoNTM3LCAncGcnLCAyLCAnUGFwdWEgTmV3IEd1aW5lYScpLAotICAoNTM5LCAndG8nLCAyLCAnVG9uZ2EgKEtpbmdkb20gb2YpJyksCi0gICg1NDAsICdzYicsIDIsICdTb2xvbW9uIElzbGFuZHMnKSwKLSAgKDU0MSwgJ3Z1JywgMiwgJ1ZhbnVhdHUgKFJlcHVibGljIG9mKScpLAotICAoNTQyLCAnZmonLCAyLCAnRmlqaSAoUmVwdWJsaWMgb2YpJyksCi0gICg1NDMsICd3ZicsIDIsICJXYWxsaXMgYW5kIEZ1dHVuYSAoVGVycml0b2lyZSBmcmFuYWlzIGQnb3V0cmUtbWVyKSIpLAotICAoNTQ0LCAnYXMnLCAyLCAnQW1lcmljYW4gU2Ftb2EnKSwKLSAgKDU0NSwgJ2tpJywgMiwgJ0tpcmliYXRpIChSZXB1YmxpYyBvZiknKSwKLSAgKDU0NiwgJ25jJywgMiwgIk5ldyBDYWxlZG9uaWEgKFRlcnJpdG9pcmUgZnJhbmFpcyBkJ291dHJlLW1lcikiKSwKLSAgKDU0NywgJ3BmJywgMiwgIkZyZW5jaCBQb2x5bmVzaWEgKFRlcnJpdG9pcmUgZnJhbmFpcyBkJ291dHJlLW1lcikiKSwKLSAgKDU0OCwgJ2NrJywgMiwgJ0Nvb2sgSXNsYW5kcycpLAotICAoNTQ5LCAnd3MnLCAyLCAnU2Ftb2EgKEluZGVwZW5kZW50IFN0YXRlIG9mKScpLAotICAoNTUwLCAnZm0nLCAyLCAnTWljcm9uZXNpYSAoRmVkZXJhdGVkIFN0YXRlcyBvZiknKSwKLSAgKDU1MSwgJ21oJywgMiwgJ01hcnNoYWxsIElzbGFuZHMgKFJlcHVibGljIG9mIHRoZSknKSwKLSAgKDU1MiwgJ3B3JywgMiwgJ1BhbGF1IChSZXB1YmxpYyBvZiknKSwKLSAgKDYwMiwgJ2VnJywgMiwgJ0VneXB0IChBcmFiIFJlcHVibGljIG9mKScpLAotICAoNjAzLCAnZHonLCAyLCAiQWxnZXJpYSAoUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZikiKSwKLSAgKDYwNCwgJ21hJywgMiwgJ01vcm9jY28gKEtpbmdkb20gb2YpJyksCi0gICg2MDUsICd0bicsIDIsICdUdW5pc2lhJyksCi0gICg2MDYsICdseScsIDIsICJMaWJ5YSAoU29jaWFsaXN0IFBlb3BsZSdzIExpYnlhbiBBcmFiIEphbWFoaXJpeWEpIiksCi0gICg2MDcsICdnbScsIDIsICdHYW1iaWEgKFJlcHVibGljIG9mIHRoZSknKSwKLSAgKDYwOCwgJ3NuJywgMiwgJ1NlbmVnYWwgKFJlcHVibGljIG9mKScpLAotICAoNjA5LCAnbXInLCAyLCAnTWF1cml0YW5pYSAoSXNsYW1pYyBSZXB1YmxpYyBvZiknKSwKLSAgKDYxMCwgJ21sJywgMiwgJ01hbGkgKFJlcHVibGljIG9mKScpLAotICAoNjExLCAnZ24nLCAyLCAnR3VpbmVhIChSZXB1YmxpYyBvZiknKSwKLSAgKDYxMiwgJ2NpJywgMiwgIkN0ZSBkJ0l2b2lyZSAoUmVwdWJsaWMgb2YpIiksCi0gICg2MTMsICdiZicsIDIsICdCdXJraW5hIEZhc28nKSwKLSAgKDYxNCwgJ25lJywgMiwgJ05pZ2VyIChSZXB1YmxpYyBvZiB0aGUpJyksCi0gICg2MTUsICd0ZycsIDIsICdUb2dvbGVzZSBSZXB1YmxpYycpLAotICAoNjE2LCAnYmonLCAyLCAnQmVuaW4gKFJlcHVibGljIG9mKScpLAotICAoNjE3LCAnbXUnLCAyLCAnTWF1cml0aXVzIChSZXB1YmxpYyBvZiknKSwKLSAgKDYxOCwgJ2xyJywgMiwgJ0xpYmVyaWEgKFJlcHVibGljIG9mKScpLAotICAoNjE5LCAnc2wnLCAyLCAnU2llcnJhIExlb25lJyksCi0gICg2MjAsICdnaCcsIDIsICdHaGFuYScpLAotICAoNjIxLCAnbmcnLCAyLCAnTmlnZXJpYSAoRmVkZXJhbCBSZXB1YmxpYyBvZiknKSwKLSAgKDYyMiwgJ3RkJywgMiwgJ0NoYWQgKFJlcHVibGljIG9mKScpLAotICAoNjIzLCAnY2YnLCAyLCAnQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljJyksCi0gICg2MjQsICdjbScsIDIsICdDYW1lcm9vbiAoUmVwdWJsaWMgb2YpJyksCi0gICg2MjUsICdjdicsIDIsICdDYXBlIFZlcmRlIChSZXB1YmxpYyBvZiknKSwKLSAgKDYyNiwgJ3N0JywgMiwgJ1NhbyBUb21lIGFuZCBQcmluY2lwZSAoRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiknKSwKLSAgKDYyNywgJ2dxJywgMiwgJ0VxdWF0b3JpYWwgR3VpbmVhIChSZXB1YmxpYyBvZiknKSwKLSAgKDYyOCwgJ2dhJywgMiwgJ0dhYm9uZXNlIFJlcHVibGljJyksCi0gICg2MjksICdjZycsIDIsICdDb25nbyAoUmVwdWJsaWMgb2YgdGhlKScpLAotICAoNjMwLCAnY2cnLCAyLCAnRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28nKSwKLSAgKDYzMSwgJ2FvJywgMiwgJ0FuZ29sYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MzIsICdndycsIDIsICdHdWluZWEtQmlzc2F1IChSZXB1YmxpYyBvZiknKSwKLSAgKDYzMywgJ3NjJywgMiwgJ1NleWNoZWxsZXMgKFJlcHVibGljIG9mKScpLAotICAoNjM0LCAnc2QnLCAyLCAnU3VkYW4gKFJlcHVibGljIG9mIHRoZSknKSwKLSAgKDYzNSwgJ3J3JywgMiwgJ1J3YW5kYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MzYsICdldCcsIDIsICdFdGhpb3BpYSAoRmVkZXJhbCBEZW1vY3JhdGljIFJlcHVibGljIG9mKScpLAotICAoNjM3LCAnc28nLCAyLCAnU29tYWxpIERlbW9jcmF0aWMgUmVwdWJsaWMnKSwKLSAgKDYzOCwgJ2RqJywgMiwgJ0RqaWJvdXRpIChSZXB1YmxpYyBvZiknKSwKLSAgKDYzOSwgJ2tlJywgMiwgJ0tlbnlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDY0MCwgJ3R6JywgMiwgJ1RhbnphbmlhIChVbml0ZWQgUmVwdWJsaWMgb2YpJyksCi0gICg2NDEsICd1ZycsIDIsICdVZ2FuZGEgKFJlcHVibGljIG9mKScpLAotICAoNjQyLCAnYmknLCAyLCAnQnVydW5kaSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NDMsICdteicsIDIsICdNb3phbWJpcXVlIChSZXB1YmxpYyBvZiknKSwKLSAgKDY0NSwgJ3ptJywgMiwgJ1phbWJpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NDYsICdtZycsIDIsICdNYWRhZ2FzY2FyIChSZXB1YmxpYyBvZiknKSwKLSAgKDY0NywgJ3JlJywgMiwgJ1JldW5pb24gKEZyZW5jaCBEZXBhcnRtZW50IG9mKScpLAotICAoNjQ4LCAnencnLCAyLCAnWmltYmFid2UgKFJlcHVibGljIG9mKScpLAotICAoNjQ5LCAnbmEnLCAyLCAnTmFtaWJpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NTAsICdtdycsIDIsICdNYWxhd2knKSwKLSAgKDY1MSwgJ2xzJywgMiwgJ0xlc290aG8gKEtpbmdkb20gb2YpJyksCi0gICg2NTIsICdidycsIDIsICdCb3Rzd2FuYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NTMsICdzeicsIDIsICdTd2F6aWxhbmQgKEtpbmdkb20gb2YpJyksCi0gICg2NTQsICdrbScsIDIsICdDb21vcm9zIChVbmlvbiBvZiB0aGUpJyksCi0gICg2NTUsICd6YScsIDIsICdBZnJpY2EvSm9oYW5uZXNidXJnJywgJ2VuJywgJ1NvdXRoIEFmcmljYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NTcsICdlcicsIDIsICdFcml0cmVhJyksCi0gICg3MDIsICdieicsIDIsICdCZWxpemUnKSwKLSAgKDcwNCwgJ2d0JywgMiwgJ0d1YXRlbWFsYSAoUmVwdWJsaWMgb2YpJyksCi0gICg3MDYsICdzdicsIDIsICdFbCBTYWx2YWRvciAoUmVwdWJsaWMgb2YpJyksCi0gICg3MDgsICdobicsIDMsICdIb25kdXJhcyAoUmVwdWJsaWMgb2YpJyksCi0gICg3MTAsICduaScsIDIsICdOaWNhcmFndWEnKSwKLSAgKDcxMiwgJ2NyJywgMiwgJ0Nvc3RhIFJpY2EnKSwKLSAgKDcxNCwgJ3BhJywgMiwgJ1BhbmFtYSAoUmVwdWJsaWMgb2YpJyksCi0gICg3MTYsICdwZScsIDIsICdQZXJ1JyksCi0gICg3MjIsICdhcicsIDMsICdBcmdlbnRpbmUgUmVwdWJsaWMnKSwKLSAgKDcyNCwgJ2JyJywgMiwgJ0JyYXppbCAoRmVkZXJhdGl2ZSBSZXB1YmxpYyBvZiknKSwKLSAgKDczMCwgJ2NsJywgMiwgJ0NoaWxlJyksCi0gICg3MzIsICdjbycsIDMsICdDb2xvbWJpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg3MzQsICd2ZScsIDIsICdWZW5lenVlbGEgKEJvbGl2YXJpYW4gUmVwdWJsaWMgb2YpJyksCi0gICg3MzYsICdibycsIDIsICdCb2xpdmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDczOCwgJ2d5JywgMiwgJ0d1eWFuYScpLAotICAoNzQwLCAnZWMnLCAyLCAnRWN1YWRvcicpLAotICAoNzQyLCAnZ2YnLCAyLCAnRnJlbmNoIEd1aWFuYSAoRnJlbmNoIERlcGFydG1lbnQgb2YpJyksCi0gICg3NDQsICdweScsIDIsICdQYXJhZ3VheSAoUmVwdWJsaWMgb2YpJyksCi0gICg3NDYsICdzcicsIDIsICdTdXJpbmFtZSAoUmVwdWJsaWMgb2YpJyksCi0gICg3NDgsICd1eScsIDIsICdVcnVndWF5IChFYXN0ZXJuIFJlcHVibGljIG9mKScpLAotICAoNzUwLCAnZmsnLCAyLCAnRmFsa2xhbmQgSXNsYW5kcyAoTWFsdmluYXMpJyldCi0KLWdldF9tY2MgPSBsYW1iZGEgZWx0OiBlbHRbMF0KLWdldF9pc28gPSBsYW1iZGEgZWx0OiBlbHRbMV0KLWdldF9zZCA9IGxhbWJkYSBlbHQ6IGVsdFsyXQotZ2V0X3R6ID0gbGFtYmRhIGVsdDogbGVuKGVsdCkgPiA0IGFuZCBlbHRbM10gb3IgJycKLWdldF9sYW5nID0gbGFtYmRhIGVsdDogbGVuKGVsdCkgPiA1IGFuZCBlbHRbNF0gb3IgJycKLWdldF93aWZpID0gbGFtYmRhIGVsdDogbGVuKGVsdCkgPiA2IGFuZCBlbHRbNV0gb3IgMAotCi1tY2NfY29kZXMgPSBbJzB4JTA0eCcgJSBnZXRfbWNjKGVsdCkgZm9yIGVsdCBpbiBtY2NfdGFibGVdCi10el9zZXQgPSBzb3J0ZWQoeCBmb3IgeCBpbiBzZXQoZ2V0X3R6KGVsdCkgZm9yIGVsdCBpbiBtY2NfdGFibGUpKQotbGFuZ19zZXQgPSBzb3J0ZWQoeCBmb3IgeCBpbiBzZXQoZ2V0X2xhbmcoZWx0KSBmb3IgZWx0IGluIG1jY190YWJsZSkpCi0KLWRlZiBta19pbmRfY29kZShlbHQpOgotICBpc28gPSBnZXRfaXNvKGVsdCkKLSAgaXNvX2NvZGUgPSAoKG9yZChpc29bMF0pIDw8IDgpIHwgb3JkKGlzb1sxXSkpICYgMHhGRkZGICMgMTYgYml0cwotICB3aWZpID0gZ2V0X3dpZmkoZWx0KSAmIDB4MDAwRiAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgNCBiaXRzCi0gIHNkID0gZ2V0X3NkKGVsdCkgJiAweDAwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAyIGJpdHMKLSAgdHpfaW5kID0gdHpfc2V0LmluZGV4KGdldF90eihlbHQpKSAmIDB4MDAxRiAgICAgICAgICAgICMgIDUgYml0cwotICBsYW5nX2luZCA9IGxhbmdfc2V0LmluZGV4KGdldF9sYW5nKGVsdCkpICYgMHgwMDBGICAgICAgIyAgNCBiaXRzCi0gIHJldHVybiAoaXNvX2NvZGUgPDwgMTYpIHwgKHdpZmkgPDwgMTEpIHwgKHNkIDw8IDkpIHwgKHR6X2luZCA8PCA0KSB8IGxhbmdfaW5kCi0KLWluZF9jb2RlcyA9IFsnMHglMDh4JyAlIG1rX2luZF9jb2RlKGVsdCkgZm9yIGVsdCBpbiBtY2NfdGFibGVdCi0KLWRlZiBmbXRfbGlzdCh0aXRsZSwgbCwgYmF0Y2hfc3opOgotICBzbCA9IFtdCi0gIGZvciBpIGluIHJhbmdlKGxlbihsKSAvIGJhdGNoX3N6ICsgKGxlbihsKSAlIGJhdGNoX3N6IGFuZCAxIG9yIDApKToKLSAgICBqID0gaSAqIGJhdGNoX3N6Ci0gICAgc2wuYXBwZW5kKCgnICcgKiA4KSArICcsICcuam9pbihsW2o6aiArIGJhdGNoX3N6XSkpCi0gIHJldHVybiAnICAgIHByaXZhdGUgc3RhdGljIGZpbmFsICVzID0ge1xuJyAlIHRpdGxlICsgJyxcbicuam9pbihzbCkgKyAnXG4gICAgfTtcbicKLQotZGVmIGRvX2F1dG9nZW5fY29tbWVudChleHRyYV9kZXNjPVtdKToKLSAgcHJpbnQgJyAgICAvJyArICcqKlxuICAgICogQVVUTyBHRU5FUkFURUQgKGJ5IHRoZSBQeXRob24gY29kZSBhYm92ZSknCi0gIGZvciBsaW5lIGluIGV4dHJhX2Rlc2M6Ci0gICAgcHJpbnQgJyAgICAqICVzJyAlIGxpbmUKLSAgcHJpbnQgJyAgICAqJyArICcvJwotCi1kb19hdXRvZ2VuX2NvbW1lbnQoKQotcHJpbnQgZm10X2xpc3QoJ1N0cmluZ1tdIFRaX1NUUklOR1MnLCBbJyIlcyInICUgeCBmb3IgeCBpbiB0el9zZXRdLCAxKQotZG9fYXV0b2dlbl9jb21tZW50KCkKLXByaW50IGZtdF9saXN0KCdTdHJpbmdbXSBMQU5HX1NUUklOR1MnLCBbJyIlcyInICUgeCBmb3IgeCBpbiBsYW5nX3NldF0sIDEwKQotZG9fYXV0b2dlbl9jb21tZW50KFsnVGhpcyB0YWJsZSBpcyBhIGxpc3Qgb2YgTUNDIGNvZGVzLiAgVGhlIGluZGV4IGluIHRoaXMgdGFibGUnLAotICAgICAgICAgICAgICAgICAgICAnb2YgYSBnaXZlbiBNQ0MgY29kZSBpcyB0aGUgaW5kZXggb2YgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQnLAotICAgICAgICAgICAgICAgICAgICAndGhhdCBNQ0MgaW4gdGhlIElORF9DT0RFUyB0YWJsZS4nXSkKLXByaW50IGZtdF9saXN0KCdzaG9ydFtdIE1DQ19DT0RFUycsIG1jY19jb2RlcywgMTApCi1kb19hdXRvZ2VuX2NvbW1lbnQoWydUaGUgdmFsdWVzIGluIHRoaXMgdGFibGUgYXJlIGJyb2tlbiBkb3duIGFzIGZvbGxvd3MgKG1zYiB0byBsc2IpOicsCi0gICAgICAgICAgICAgICAgICAgICcgICAgaXNvIGNvdW50cnkgY29kZSAxNiBiaXRzJywKLSAgICAgICAgICAgICAgICAgICAgJyAgICAodW51c2VkKSAgICAgICAgICAxIGJpdCcsCi0gICAgICAgICAgICAgICAgICAgICcgICAgd2lmaSBjaGFubmVsICAgICAgNCBiaXRzJywKLSAgICAgICAgICAgICAgICAgICAgJyAgICBzbWFsbGVkIGRpZ2l0ICAgICAyIGJpdHMnLAotICAgICAgICAgICAgICAgICAgICAnICAgIGRlZmF1bHQgdGltZXpvbmUgIDUgYml0cycsCi0gICAgICAgICAgICAgICAgICAgICcgICAgZGVmYXVsdCBsYW5ndWFnZSAgNCBiaXRzJ10pCi1wcmludCBmbXRfbGlzdCgnaW50W10gSU5EX0NPREVTJywgaW5kX2NvZGVzLCA2KQotCi1kZWYgcGFyc2VfaW5kX2NvZGUoaW5kKToKLSAgbWNjID0gZXZhbChtY2NfY29kZXNbaW5kXSkKLSAgY29kZSA9IGV2YWwoaW5kX2NvZGVzW2luZF0pCi0gIGlzb19sc2IgPSBpbnQoKGNvZGUgPj4gMTYpICYgMHgwMEZGKQotICBpc29fbXNiID0gaW50KChjb2RlID4+IDI0KSAmIDB4MDBGRikKLSAgaXNvID0gJyVzJXMnICUgKGNocihpc29fbXNiKSwgY2hyKGlzb19sc2IpKQotICB3aWZpID0gaW50KChjb2RlID4+IDExKSAmIDB4MDAwRikKLSAgc2QgPSBpbnQoKGNvZGUgPj4gOSkgJiAweDAwMDMpCi0gIHR6X2luZCA9IChjb2RlID4+IDQpICYgMHgwMDFGCi0gIGxhbmdfaW5kID0gKGNvZGUgPj4gMCkgJiAweDAwMEYKLSAgcmV0dXJuIChtY2MsIGlzbywgc2QsIHR6X3NldFt0el9pbmRdLCBsYW5nX3NldFtsYW5nX2luZF0sIHdpZmkpCi0KLWZtdF9zdHIgPSAnbWNjID0gJXMsIGlzbyA9ICVzLCBzZCA9ICVzLCB0eiA9ICVzLCBsYW5nID0gJXMsIHdpZmkgPSAlcycKLW9yaWdfdGFibGUgPSBbZm10X3N0ciAlIChnZXRfbWNjKGVsdCksIGdldF9pc28oZWx0KSwgZ2V0X3NkKGVsdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3R6KGVsdCksIGdldF9sYW5nKGVsdCksIGdldF93aWZpKGVsdCkpCi0gICAgICAgICAgICAgIGZvciBlbHQgaW4gbWNjX3RhYmxlXQotZGVyaXZlZF90YWJsZSA9IFtmbXRfc3RyICUgcGFyc2VfaW5kX2NvZGUoaSkgZm9yIGkgaW4gcmFuZ2UobGVuKGluZF9jb2RlcykpXQotZm9yIGkgaW4gcmFuZ2UobGVuKG9yaWdfdGFibGUpKToKLSAgaWYgb3JpZ190YWJsZVtpXSA9PSBkZXJpdmVkX3RhYmxlW2ldOiBjb250aW51ZQotICBwcmludCAnTUlTTUFUQ0ggRVJST1IgOiAnLCBvcmlnX3RhYmxlW2ldLCAiICE9ICIsIGRlcml2ZWRfdGFibGVbaV0KLQotKi8KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGxpYmNvcmUuaWN1LlRpbWVab25lczsKIAogLyoqCiAgKiBNb2JpbGUgQ291bnRyeSBDb2RlCkBAIC0zNzEsMjAwICszOCwxNTMgQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIE1jY1RhYmxlCiB7Ci0gICAgLyoqCi0gICAgICogQVVUTyBHRU5FUkFURUQgKGJ5IHRoZSBQeXRob24gY29kZSBhYm92ZSkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBUWl9TVFJJTkdTID0gewotICAgICAgICAiIiwKLSAgICAgICAgIkFmcmljYS9Kb2hhbm5lc2J1cmciLAotICAgICAgICAiQXNpYS9CZWlqaW5nIiwKLSAgICAgICAgIkFzaWEvU2luZ2Fwb3JlIiwKLSAgICAgICAgIkFzaWEvVG9reW8iLAotICAgICAgICAiQXVzdHJhbGlhL1N5ZG5leSIsCi0gICAgICAgICJFdXJvcGUvQW1zdGVyZGFtIiwKLSAgICAgICAgIkV1cm9wZS9CZXJsaW4iLAotICAgICAgICAiRXVyb3BlL0R1YmxpbiIsCi0gICAgICAgICJFdXJvcGUvTG9uZG9uIiwKLSAgICAgICAgIkV1cm9wZS9NYWRyaWQiLAotICAgICAgICAiRXVyb3BlL1BhcmlzIiwKLSAgICAgICAgIkV1cm9wZS9QcmFndWUiLAotICAgICAgICAiRXVyb3BlL1JvbWUiLAotICAgICAgICAiRXVyb3BlL1ZpZW5uYSIsCi0gICAgICAgICJFdXJvcGUvV2Fyc2F3IiwKLSAgICAgICAgIkV1cm9wZS9adXJpY2giLAotICAgICAgICAiUGFjaWZpYy9BdWNrbGFuZCIKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQVVUTyBHRU5FUkFURUQgKGJ5IHRoZSBQeXRob24gY29kZSBhYm92ZSkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMQU5HX1NUUklOR1MgPSB7Ci0gICAgICAgICIiLCAiY3MiLCAiZGUiLCAiZW4iLCAiZXMiLCAiZnIiLCAiaXQiLCAiamEiLCAibmwiLCAiemgiCi0gICAgfTsKLQotICAgIC8qKgotICAgICAqIEFVVE8gR0VORVJBVEVEIChieSB0aGUgUHl0aG9uIGNvZGUgYWJvdmUpCi0gICAgICogVGhpcyB0YWJsZSBpcyBhIGxpc3Qgb2YgTUNDIGNvZGVzLiAgVGhlIGluZGV4IGluIHRoaXMgdGFibGUKLSAgICAgKiBvZiBhIGdpdmVuIE1DQyBjb2RlIGlzIHRoZSBpbmRleCBvZiBleHRyYSBpbmZvcm1hdGlvbiBhYm91dAotICAgICAqIHRoYXQgTUNDIGluIHRoZSBJTkRfQ09ERVMgdGFibGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgc2hvcnRbXSBNQ0NfQ09ERVMgPSB7Ci0gICAgICAgIDB4MDBjYSwgMHgwMGNjLCAweDAwY2UsIDB4MDBkMCwgMHgwMGQ0LCAweDAwZDUsIDB4MDBkNiwgMHgwMGQ4LCAweDAwZGEsIDB4MDBkYiwKLSAgICAgICAgMHgwMGRjLCAweDAwZGUsIDB4MDBlMSwgMHgwMGUyLCAweDAwZTQsIDB4MDBlNiwgMHgwMGU3LCAweDAwZTgsIDB4MDBlYSwgMHgwMGViLAotICAgICAgICAweDAwZWUsIDB4MDBmMCwgMHgwMGYyLCAweDAwZjQsIDB4MDBmNiwgMHgwMGY3LCAweDAwZjgsIDB4MDBmYSwgMHgwMGZmLCAweDAxMDEsCi0gICAgICAgIDB4MDEwMywgMHgwMTA0LCAweDAxMDYsIDB4MDEwYSwgMHgwMTBjLCAweDAxMGUsIDB4MDExMCwgMHgwMTEyLCAweDAxMTQsIDB4MDExNiwKLSAgICAgICAgMHgwMTE4LCAweDAxMWEsIDB4MDExYiwgMHgwMTFjLCAweDAxMWUsIDB4MDEyMCwgMHgwMTIxLCAweDAxMjIsIDB4MDEyNCwgMHgwMTI1LAotICAgICAgICAweDAxMjYsIDB4MDEyNywgMHgwMTI5LCAweDAxMmUsIDB4MDEzNCwgMHgwMTM2LCAweDAxMzcsIDB4MDEzOCwgMHgwMTM5LCAweDAxM2EsCi0gICAgICAgIDB4MDEzYiwgMHgwMTNjLCAweDAxNGEsIDB4MDE0YywgMHgwMTRlLCAweDAxNTIsIDB4MDE1NCwgMHgwMTU2LCAweDAxNTgsIDB4MDE1YSwKLSAgICAgICAgMHgwMTVjLCAweDAxNWUsIDB4MDE2MCwgMHgwMTYyLCAweDAxNjQsIDB4MDE2NiwgMHgwMTY4LCAweDAxNmEsIDB4MDE2YiwgMHgwMTZjLAotICAgICAgICAweDAxNmQsIDB4MDE2ZSwgMHgwMTcwLCAweDAxNzIsIDB4MDE3NCwgMHgwMTc2LCAweDAxNzgsIDB4MDE5MCwgMHgwMTkxLCAweDAxOTIsCi0gICAgICAgIDB4MDE5NCwgMHgwMTk1LCAweDAxOWEsIDB4MDE5YywgMHgwMTlkLCAweDAxOWUsIDB4MDE5ZiwgMHgwMWEwLCAweDAxYTEsIDB4MDFhMiwKLSAgICAgICAgMHgwMWEzLCAweDAxYTQsIDB4MDFhNSwgMHgwMWE2LCAweDAxYTcsIDB4MDFhOCwgMHgwMWE5LCAweDAxYWEsIDB4MDFhYiwgMHgwMWFjLAotICAgICAgICAweDAxYWQsIDB4MDFhZSwgMHgwMWFmLCAweDAxYjAsIDB4MDFiMiwgMHgwMWI0LCAweDAxYjUsIDB4MDFiNiwgMHgwMWI4LCAweDAxYjksCi0gICAgICAgIDB4MDFjMiwgMHgwMWM0LCAweDAxYzYsIDB4MDFjNywgMHgwMWM4LCAweDAxYzksIDB4MDFjYywgMHgwMWNkLCAweDAxZDIsIDB4MDFkMywKLSAgICAgICAgMHgwMWQ2LCAweDAxZDgsIDB4MDFmNiwgMHgwMWY5LCAweDAxZmUsIDB4MDIwMiwgMHgwMjAzLCAweDAyMDgsIDB4MDIwZCwgMHgwMjEwLAotICAgICAgICAweDAyMTIsIDB4MDIxNiwgMHgwMjE3LCAweDAyMTgsIDB4MDIxOSwgMHgwMjFiLCAweDAyMWMsIDB4MDIxZCwgMHgwMjFlLCAweDAyMWYsCi0gICAgICAgIDB4MDIyMCwgMHgwMjIxLCAweDAyMjIsIDB4MDIyMywgMHgwMjI0LCAweDAyMjUsIDB4MDIyNiwgMHgwMjI3LCAweDAyMjgsIDB4MDI1YSwKLSAgICAgICAgMHgwMjViLCAweDAyNWMsIDB4MDI1ZCwgMHgwMjVlLCAweDAyNWYsIDB4MDI2MCwgMHgwMjYxLCAweDAyNjIsIDB4MDI2MywgMHgwMjY0LAotICAgICAgICAweDAyNjUsIDB4MDI2NiwgMHgwMjY3LCAweDAyNjgsIDB4MDI2OSwgMHgwMjZhLCAweDAyNmIsIDB4MDI2YywgMHgwMjZkLCAweDAyNmUsCi0gICAgICAgIDB4MDI2ZiwgMHgwMjcwLCAweDAyNzEsIDB4MDI3MiwgMHgwMjczLCAweDAyNzQsIDB4MDI3NSwgMHgwMjc2LCAweDAyNzcsIDB4MDI3OCwKLSAgICAgICAgMHgwMjc5LCAweDAyN2EsIDB4MDI3YiwgMHgwMjdjLCAweDAyN2QsIDB4MDI3ZSwgMHgwMjdmLCAweDAyODAsIDB4MDI4MSwgMHgwMjgyLAotICAgICAgICAweDAyODMsIDB4MDI4NSwgMHgwMjg2LCAweDAyODcsIDB4MDI4OCwgMHgwMjg5LCAweDAyOGEsIDB4MDI4YiwgMHgwMjhjLCAweDAyOGQsCi0gICAgICAgIDB4MDI4ZSwgMHgwMjhmLCAweDAyOTEsIDB4MDJiZSwgMHgwMmMwLCAweDAyYzIsIDB4MDJjNCwgMHgwMmM2LCAweDAyYzgsIDB4MDJjYSwKLSAgICAgICAgMHgwMmNjLCAweDAyZDIsIDB4MDJkNCwgMHgwMmRhLCAweDAyZGMsIDB4MDJkZSwgMHgwMmUwLCAweDAyZTIsIDB4MDJlNCwgMHgwMmU2LAotICAgICAgICAweDAyZTgsIDB4MDJlYSwgMHgwMmVjLCAweDAyZWUKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQVVUTyBHRU5FUkFURUQgKGJ5IHRoZSBQeXRob24gY29kZSBhYm92ZSkKLSAgICAgKiBUaGUgdmFsdWVzIGluIHRoaXMgdGFibGUgYXJlIGJyb2tlbiBkb3duIGFzIGZvbGxvd3MgKG1zYiB0byBsc2IpOgotICAgICAqICAgICBpc28gY291bnRyeSBjb2RlIDE2IGJpdHMKLSAgICAgKiAgICAgKHVudXNlZCkgICAgICAgICAgMSBiaXQKLSAgICAgKiAgICAgd2lmaSBjaGFubmVsICAgICAgNCBiaXRzCi0gICAgICogICAgIHNtYWxsZWQgZGlnaXQgICAgIDIgYml0cwotICAgICAqICAgICBkZWZhdWx0IHRpbWV6b25lICA1IGJpdHMKLSAgICAgKiAgICAgZGVmYXVsdCBsYW5ndWFnZSAgNCBiaXRzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gSU5EX0NPREVTID0gewotICAgICAgICAweDY3NzIwNDAwLCAweDZlNmM2YzY4LCAweDYyNjUwNDAwLCAweDY2NzIwNGI1LCAweDZkNjMwNDAwLCAweDYxNjQwNDAwLAotICAgICAgICAweDY1NzMwNGE0LCAweDY4NzUwNDAwLCAweDYyNjEwNDAwLCAweDY4NzIwNDAwLCAweDcyNzMwNDAwLCAweDY5NzQwNGQ2LAotICAgICAgICAweDc2NjEwNGQ2LCAweDcyNmYwNDAwLCAweDYzNjgwNTAyLCAweDYzN2E2Y2MxLCAweDczNmIwNDAwLCAweDYxNzQ2Y2UyLAotICAgICAgICAweDY3NjI2YzkzLCAweDY3NjI2YzkzLCAweDY0NmIwNDAwLCAweDczNjUwNDAwLCAweDZlNmYwNDAwLCAweDY2NjkwNDAwLAotICAgICAgICAweDZjNzQwNDAwLCAweDZjNzYwNDAwLCAweDY1NjUwNDAwLCAweDcyNzUwNDAwLCAweDc1NjEwNDAwLCAweDYyNzkwNDAwLAotICAgICAgICAweDZkNjQwNDAwLCAweDcwNmMwNGYwLCAweDY0NjU2YzcyLCAweDY3NjkwNDAwLCAweDcwNzQwNDAwLCAweDZjNzUwNDAwLAotICAgICAgICAweDY5NjUwNDgzLCAweDY5NzMwNDAwLCAweDYxNmMwNDAwLCAweDZkNzQwNDAwLCAweDYzNzkwNDAwLCAweDY3NjUwNDAwLAotICAgICAgICAweDYxNmQwNDAwLCAweDYyNjcwNDAwLCAweDc0NzIwNDAwLCAweDY2NmYwNDAwLCAweDY3NjUwNDAwLCAweDY3NmMwNDAwLAotICAgICAgICAweDczNmQwNDAwLCAweDczNmMwNDAwLCAweDZkNmIwNDAwLCAweDZjNjkwNDAwLCAweDZkNjUwNDAwLCAweDYzNjE1ZTAwLAotICAgICAgICAweDcwNmQwNDAwLCAweDc1NzM1ZTAzLCAweDc1NzM1ZTAzLCAweDc1NzM1ZTAzLCAweDc1NzM1ZTAzLCAweDc1NzM1ZTAzLAotICAgICAgICAweDc1NzM1ZTAzLCAweDc1NzM1ZTAzLCAweDcwNzIwNDAwLCAweDc2NjkwNDAwLCAweDZkNzgwNjAwLCAweDZhNmQwNjAwLAotICAgICAgICAweDY3NzAwNDAwLCAweDYyNjIwNjAwLCAweDYxNjcwNjAwLCAweDZiNzkwNjAwLCAweDc2NjcwNjAwLCAweDYyNmQwNDAwLAotICAgICAgICAweDY3NjQwNDAwLCAweDZkNzMwNDAwLCAweDZiNmUwNDAwLCAweDZjNjMwNDAwLCAweDc2NjMwNDAwLCAweDZlNmMwNDAwLAotICAgICAgICAweDYxNzcwNDAwLCAweDYyNzMwNDAwLCAweDYxNjkwNjAwLCAweDY0NmQwNDAwLCAweDYzNzUwNDAwLCAweDY0NmYwNDAwLAotICAgICAgICAweDY4NzQwNDAwLCAweDc0NzQwNDAwLCAweDc0NjMwNDAwLCAweDYxN2EwNDAwLCAweDZiN2EwNDAwLCAweDYyNzQwNDAwLAotICAgICAgICAweDY5NmUwNDAwLCAweDY5NmUwNDAwLCAweDcwNmIwNDAwLCAweDYxNjYwNDAwLCAweDZjNmIwNDAwLCAweDZkNmQwNDAwLAotICAgICAgICAweDZjNjIwNDAwLCAweDZhNmYwNDAwLCAweDczNzkwNDAwLCAweDY5NzEwNDAwLCAweDZiNzcwNDAwLCAweDczNjEwNDAwLAotICAgICAgICAweDc5NjUwNDAwLCAweDZmNmQwNDAwLCAweDcwNzMwNDAwLCAweDYxNjUwNDAwLCAweDY5NmMwNDAwLCAweDYyNjgwNDAwLAotICAgICAgICAweDcxNjEwNDAwLCAweDZkNmUwNDAwLCAweDZlNzAwNDAwLCAweDYxNjUwNDAwLCAweDYxNjUwNDAwLCAweDY5NzIwNDAwLAotICAgICAgICAweDc1N2EwNDAwLCAweDc0NmEwNDAwLCAweDZiNjcwNDAwLCAweDc0NmQwNDAwLCAweDZhNzA3NDQ3LCAweDZhNzA3NDQ3LAotICAgICAgICAweDZiNzIwNDAwLCAweDc2NmUwNDAwLCAweDY4NmIwNDAwLCAweDZkNmYwNDAwLCAweDZiNjgwNDAwLCAweDZjNjEwNDAwLAotICAgICAgICAweDYzNmU2YzI5LCAweDYzNmU2YzI5LCAweDc0NzcwNDAwLCAweDZiNzAwNDAwLCAweDYyNjQwNDAwLCAweDZkNzYwNDAwLAotICAgICAgICAweDZkNzkwNDAwLCAweDYxNzU1YzUzLCAweDY5NjQwNDAwLCAweDc0NmMwNDAwLCAweDcwNjgwNDAwLCAweDc0NjgwNDAwLAotICAgICAgICAweDczNjc1YzMzLCAweDYyNmUwNDAwLCAweDZlN2EwNTEzLCAweDZkNzAwNDAwLCAweDY3NzUwNDAwLCAweDZlNzIwNDAwLAotICAgICAgICAweDcwNjcwNDAwLCAweDc0NmYwNDAwLCAweDczNjIwNDAwLCAweDc2NzUwNDAwLCAweDY2NmEwNDAwLCAweDc3NjYwNDAwLAotICAgICAgICAweDYxNzMwNDAwLCAweDZiNjkwNDAwLCAweDZlNjMwNDAwLCAweDcwNjYwNDAwLCAweDYzNmIwNDAwLCAweDc3NzMwNDAwLAotICAgICAgICAweDY2NmQwNDAwLCAweDZkNjgwNDAwLCAweDcwNzcwNDAwLCAweDY1NjcwNDAwLCAweDY0N2EwNDAwLCAweDZkNjEwNDAwLAotICAgICAgICAweDc0NmUwNDAwLCAweDZjNzkwNDAwLCAweDY3NmQwNDAwLCAweDczNmUwNDAwLCAweDZkNzIwNDAwLCAweDZkNmMwNDAwLAotICAgICAgICAweDY3NmUwNDAwLCAweDYzNjkwNDAwLCAweDYyNjYwNDAwLCAweDZlNjUwNDAwLCAweDc0NjcwNDAwLCAweDYyNmEwNDAwLAotICAgICAgICAweDZkNzUwNDAwLCAweDZjNzIwNDAwLCAweDczNmMwNDAwLCAweDY3NjgwNDAwLCAweDZlNjcwNDAwLCAweDc0NjQwNDAwLAotICAgICAgICAweDYzNjYwNDAwLCAweDYzNmQwNDAwLCAweDYzNzYwNDAwLCAweDczNzQwNDAwLCAweDY3NzEwNDAwLCAweDY3NjEwNDAwLAotICAgICAgICAweDYzNjcwNDAwLCAweDYzNjcwNDAwLCAweDYxNmYwNDAwLCAweDY3NzcwNDAwLCAweDczNjMwNDAwLCAweDczNjQwNDAwLAotICAgICAgICAweDcyNzcwNDAwLCAweDY1NzQwNDAwLCAweDczNmYwNDAwLCAweDY0NmEwNDAwLCAweDZiNjUwNDAwLCAweDc0N2EwNDAwLAotICAgICAgICAweDc1NjcwNDAwLCAweDYyNjkwNDAwLCAweDZkN2EwNDAwLCAweDdhNmQwNDAwLCAweDZkNjcwNDAwLCAweDcyNjUwNDAwLAotICAgICAgICAweDdhNzcwNDAwLCAweDZlNjEwNDAwLCAweDZkNzcwNDAwLCAweDZjNzMwNDAwLCAweDYyNzcwNDAwLCAweDczN2EwNDAwLAotICAgICAgICAweDZiNmQwNDAwLCAweDdhNjEwNDEzLCAweDY1NzIwNDAwLCAweDYyN2EwNDAwLCAweDY3NzQwNDAwLCAweDczNzYwNDAwLAotICAgICAgICAweDY4NmUwNjAwLCAweDZlNjkwNDAwLCAweDYzNzIwNDAwLCAweDcwNjEwNDAwLCAweDcwNjUwNDAwLCAweDYxNzIwNjAwLAotICAgICAgICAweDYyNzIwNDAwLCAweDYzNmMwNDAwLCAweDYzNmYwNjAwLCAweDc2NjUwNDAwLCAweDYyNmYwNDAwLCAweDY3NzkwNDAwLAotICAgICAgICAweDY1NjMwNDAwLCAweDY3NjYwNDAwLCAweDcwNzkwNDAwLCAweDczNzIwNDAwLCAweDc1NzkwNDAwLCAweDY2NmIwNDAwCi0gICAgfTsKLQogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJNY2NUYWJsZSI7CiAKKyAgICBzdGF0aWMgQXJyYXlMaXN0PE1jY0VudHJ5PiB0YWJsZTsKKworICAgIHN0YXRpYyBjbGFzcyBNY2NFbnRyeSBpbXBsZW1lbnRzIENvbXBhcmFibGU8TWNjRW50cnk+CisgICAgeworICAgICAgICBpbnQgbWNjOworICAgICAgICBTdHJpbmcgaXNvOworICAgICAgICBpbnQgc21hbGxlc3REaWdpdHNNbmM7CisgICAgICAgIFN0cmluZyBsYW5ndWFnZTsKKyAgICAgICAgaW50IHdpZmlDaGFubmVsczsKKworICAgICAgICBNY2NFbnRyeShpbnQgbW5jLCBTdHJpbmcgaXNvLCBpbnQgc21hbGxlc3REaWdpdHNNQ0MpIHsKKyAgICAgICAgICAgIHRoaXMobW5jLCBpc28sIHNtYWxsZXN0RGlnaXRzTUNDLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIE1jY0VudHJ5KGludCBtbmMsIFN0cmluZyBpc28sIGludCBzbWFsbGVzdERpZ2l0c01DQywgU3RyaW5nIGxhbmd1YWdlKSB7CisgICAgICAgICAgICB0aGlzKG1uYywgaXNvLCBzbWFsbGVzdERpZ2l0c01DQywgbGFuZ3VhZ2UsIDApOworICAgICAgICB9CisKKyAgICAgICAgTWNjRW50cnkoaW50IG1uYywgU3RyaW5nIGlzbywgaW50IHNtYWxsZXN0RGlnaXRzTUNDLCBTdHJpbmcgbGFuZ3VhZ2UsIGludCB3aWZpQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgIHRoaXMubWNjID0gbW5jOworICAgICAgICAgICAgdGhpcy5pc28gPSBpc287CisgICAgICAgICAgICB0aGlzLnNtYWxsZXN0RGlnaXRzTW5jID0gc21hbGxlc3REaWdpdHNNQ0M7CisgICAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7CisgICAgICAgICAgICB0aGlzLndpZmlDaGFubmVscyA9IHdpZmlDaGFubmVsczsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oTWNjRW50cnkgbykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1jYyAtIG8ubWNjOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWNjRW50cnkKKyAgICBlbnRyeUZvck1jYyhpbnQgbWNjKQorICAgIHsKKyAgICAgICAgaW50IGluZGV4OworCisgICAgICAgIE1jY0VudHJ5IG07CisKKyAgICAgICAgbSA9IG5ldyBNY2NFbnRyeShtY2MsIG51bGwsIDApOworCisgICAgICAgIGluZGV4ID0gQ29sbGVjdGlvbnMuYmluYXJ5U2VhcmNoKHRhYmxlLCBtKTsKKworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0YWJsZS5nZXQoaW5kZXgpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCi0gICAgICogR2l2ZW4gYSBNb2JpbGUgQ291bnRyeSBDb2RlLCByZXR1cm5zIGEgZGVmYXVsdCB0aW1lIHpvbmUgSUQKLSAgICAgKiBpZiBhdmFpbGFibGUuICBSZXR1cm5zIG51bGwgaWYgdW5hdmFpbGFibGUuCisgICAgICogUmV0dXJucyBhIGRlZmF1bHQgdGltZSB6b25lIElEIGZvciB0aGUgZ2l2ZW4gTUNDLgorICAgICAqIEBwYXJhbSBtY2MgTW9iaWxlIENvdW50cnkgQ29kZQorICAgICAqIEByZXR1cm4gZGVmYXVsdCBUaW1lWm9uZSBJRCwgb3IgbnVsbCBpZiBub3Qgc3BlY2lmaWVkCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFRpbWVab25lRm9yTWNjKGludCBtY2MpIHsKLSAgICAgICAgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChNQ0NfQ09ERVMsIChzaG9ydCltY2MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIE1jY0VudHJ5IGVudHJ5OworCisgICAgICAgIGVudHJ5ID0gZW50cnlGb3JNY2MobWNjKTsKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwgfHwgZW50cnkuaXNvID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9jYWxlIGxvY2FsZTsKKyAgICAgICAgICAgIGlmIChlbnRyeS5sYW5ndWFnZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZShlbnRyeS5pc28pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKGVudHJ5Lmxhbmd1YWdlLCBlbnRyeS5pc28pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nW10gdHogPSBUaW1lWm9uZXMuZm9yTG9jYWxlKGxvY2FsZSk7CisgICAgICAgICAgICBpZiAodHoubGVuZ3RoID09IDApIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIHR6WzBdOwogICAgICAgICB9Ci0gICAgICAgIGludCBpbmRDb2RlID0gSU5EX0NPREVTW2luZGV4XTsKLSAgICAgICAgaW50IHR6SW5kID0gKGluZENvZGUgPj4+IDQpICYgMHgwMDFGOwotICAgICAgICBTdHJpbmcgdHogPSBUWl9TVFJJTkdTW3R6SW5kXTsKLSAgICAgICAgaWYgKHR6ID09ICIiKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHo7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2l2ZW4gYSBNb2JpbGUgQ291bnRyeSBDb2RlLCByZXR1cm5zIGFuIElTTyB0d28tY2hhcmFjdGVyCi0gICAgICogY291bnRyeSBjb2RlIGlmIGF2YWlsYWJsZS4gIFJldHVybnMgIiIgaWYgdW5hdmFpbGFibGUuCisgICAgICogR2l2ZW4gYSBHU00gTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucworICAgICAqIGFuIElTTyB0d28tY2hhcmFjdGVyIGNvdW50cnkgY29kZSBpZiBhdmFpbGFibGUuCisgICAgICogUmV0dXJucyAiIiBpZiB1bmF2YWlsYWJsZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb3VudHJ5Q29kZUZvck1jYyhpbnQgbWNjKSB7Ci0gICAgICAgIGludCBpbmRleCA9IEFycmF5cy5iaW5hcnlTZWFyY2goTUNDX0NPREVTLCAoc2hvcnQpbWNjKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nCisgICAgY291bnRyeUNvZGVGb3JNY2MoaW50IG1jYykKKyAgICB7CisgICAgICAgIE1jY0VudHJ5IGVudHJ5OworCisgICAgICAgIGVudHJ5ID0gZW50cnlGb3JNY2MobWNjKTsKKworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmlzbzsKICAgICAgICAgfQotICAgICAgICBpbnQgaW5kQ29kZSA9IElORF9DT0RFU1tpbmRleF07Ci0gICAgICAgIGJ5dGVbXSBpc28gPSB7KGJ5dGUpKChpbmRDb2RlID4+PiAyNCkgJiAweDAwRkYpLCAoYnl0ZSkoKGluZENvZGUgPj4+IDE2KSAmIDB4MDBGRil9OwotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhpc28pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdpdmVuIGEgR1NNIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMgYW4gSVNPIDItMyBjaGFyYWN0ZXIKLSAgICAgKiBsYW5ndWFnZSBjb2RlIGlmIGF2YWlsYWJsZS4gIFJldHVybnMgbnVsbCBpZiB1bmF2YWlsYWJsZS4KKyAgICAgKiBHaXZlbiBhIEdTTSBNb2JpbGUgQ291bnRyeSBDb2RlLCByZXR1cm5zCisgICAgICogYW4gSVNPIDItMyBjaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZSBpZiBhdmFpbGFibGUuCisgICAgICogUmV0dXJucyBudWxsIGlmIHVuYXZhaWxhYmxlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRMYW5ndWFnZUZvck1jYyhpbnQgbWNjKSB7Ci0gICAgICAgIGludCBpbmRleCA9IEFycmF5cy5iaW5hcnlTZWFyY2goTUNDX0NPREVTLCAoc2hvcnQpbWNjKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBNY2NFbnRyeSBlbnRyeTsKKworICAgICAgICBlbnRyeSA9IGVudHJ5Rm9yTWNjKG1jYyk7CisKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGVudHJ5Lmxhbmd1YWdlOwogICAgICAgICB9Ci0gICAgICAgIGludCBpbmRDb2RlID0gSU5EX0NPREVTW2luZGV4XTsKLSAgICAgICAgaW50IGxhbmdJbmQgPSBpbmRDb2RlICYgMHgwMDBGOwotICAgICAgICBTdHJpbmcgbGFuZyA9IExBTkdfU1RSSU5HU1tsYW5nSW5kXTsKLSAgICAgICAgaWYgKGxhbmcgPT0gIiIpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsYW5nOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdpdmVuIGEgR1NNIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgKiBzbWFsbGVzdCBudW1iZXIgb2YgZGlnaXRzIGZpZWxkLiAgUmV0dXJucyAyIGlmIHVuYXZhaWxhYmxlLgorICAgICAqIEdpdmVuIGEgR1NNIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMKKyAgICAgKiB0aGUgc21hbGxlc3QgbnVtYmVyIG9mIGRpZ2l0cyB0aGF0IE0gaWYgYXZhaWxhYmxlLgorICAgICAqIFJldHVybnMgMiBpZiB1bmF2YWlsYWJsZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBzbWFsbGVzdERpZ2l0c01jY0Zvck1uYyhpbnQgbWNjKSB7Ci0gICAgICAgIGludCBpbmRleCA9IEFycmF5cy5iaW5hcnlTZWFyY2goTUNDX0NPREVTLCAoc2hvcnQpbWNjKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgIHB1YmxpYyBzdGF0aWMgaW50CisgICAgc21hbGxlc3REaWdpdHNNY2NGb3JNbmMoaW50IG1jYykKKyAgICB7CisgICAgICAgIE1jY0VudHJ5IGVudHJ5OworCisgICAgICAgIGVudHJ5ID0gZW50cnlGb3JNY2MobWNjKTsKKworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZW50cnkuc21hbGxlc3REaWdpdHNNbmM7CiAgICAgICAgIH0KLSAgICAgICAgaW50IGluZENvZGUgPSBJTkRfQ09ERVNbaW5kZXhdOwotICAgICAgICBpbnQgc21EaWcgPSAoaW5kQ29kZSA+Pj4gOSkgJiAweDAwMDM7Ci0gICAgICAgIHJldHVybiBzbURpZzsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHaXZlbiBhIEdTTSBNb2JpbGUgQ291bnRyeSBDb2RlLCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygd2lmaQogICAgICAqIGNoYW5uZWxzIGFsbG93ZWQgaW4gdGhhdCBjb3VudHJ5LiAgUmV0dXJucyAwIGlmIHVuYXZhaWxhYmxlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IHdpZmlDaGFubmVsc0Zvck1jYyhpbnQgbWNjKSB7Ci0gICAgICAgIGludCBpbmRleCA9IEFycmF5cy5iaW5hcnlTZWFyY2goTUNDX0NPREVTLCAoc2hvcnQpbWNjKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgIHB1YmxpYyBzdGF0aWMgaW50CisgICAgd2lmaUNoYW5uZWxzRm9yTWNjKGludCBtY2MpIHsKKyAgICAgICAgTWNjRW50cnkgZW50cnk7CisKKyAgICAgICAgZW50cnkgPSBlbnRyeUZvck1jYyhtY2MpOworCisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS53aWZpQ2hhbm5lbHM7CiAgICAgICAgIH0KLSAgICAgICAgaW50IGluZENvZGUgPSBJTkRfQ09ERVNbaW5kZXhdOwotICAgICAgICBpbnQgd2lmaSA9IChpbmRDb2RlID4+PiAxMSkgJiAweDAwMEY7Ci0gICAgICAgIHJldHVybiB3aWZpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjU2LDQgKzI3NiwyNjIgQEAKICAgICAgICAgICAgIHdNLnNldE51bUFsbG93ZWRDaGFubmVscyh3aWZpQ2hhbm5lbHMsIHRydWUpOwogICAgICAgICB9CiAgICAgfQorCisgICAgc3RhdGljIHsKKyAgICAgICAgdGFibGUgPSBuZXcgQXJyYXlMaXN0PE1jY0VudHJ5PigyNDApOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIHRhYmxlIGJlbG93IGlzIGJ1aWx0IGZyb20gdHdvIHJlc291cmNlczoKKyAgICAgICAgICoKKyAgICAgICAgICogMSkgSVRVICJNb2JpbGUgTmV0d29yayBDb2RlIChNTkMpIGZvciB0aGUgaW50ZXJuYXRpb25hbAorICAgICAgICAgKiAgIGlkZW50aWZpY2F0aW9uIHBsYW4gZm9yIG1vYmlsZSB0ZXJtaW5hbHMgYW5kIG1vYmlsZSB1c2VycyIKKyAgICAgICAgICogICB3aGljaCBpcyBhdmFpbGFibGUgYXMgYW4gYW5uZXggdG8gdGhlIElUVSBvcGVyYXRpb25hbCBidWxsZXRpbgorICAgICAgICAgKiAgIGF2YWlsYWJsZSBoZXJlOiBodHRwOi8vd3d3Lml0dS5pbnQvaXR1LXQvYnVsbGV0aW4vYW5uZXguaHRtbAorICAgICAgICAgKgorICAgICAgICAgKiAyKSBUaGUgSVNPIDMxNjYgY291bnRyeSBjb2RlcyBsaXN0LCBhdmFpbGFibGUgaGVyZToKKyAgICAgICAgICogICAgaHR0cDovL3d3dy5pc28ub3JnL2lzby9lbi9wcm9kcy1zZXJ2aWNlcy9pc28zMTY2bWEvMDJpc28tMzE2Ni1jb2RlLWxpc3RzL2luZGV4Lmh0bWwKKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyB0YWJsZSBoYXMgbm90IGJlZW4gdmVyaWZpZWQuCisgICAgICAgICAqCisgICAgICAgICAqLworCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjAyLCJnciIsMikpOwkvL0dyZWVjZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIwNCwibmwiLDIsIm5sIiwxMykpOwkvL05ldGhlcmxhbmRzIChLaW5nZG9tIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMDYsImJlIiwyKSk7CS8vQmVsZ2l1bQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIwOCwiZnIiLDIsImZyIikpOwkvL0ZyYW5jZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIxMiwibWMiLDIpKTsJLy9Nb25hY28gKFByaW5jaXBhbGl0eSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMTMsImFkIiwyKSk7CS8vQW5kb3JyYSAoUHJpbmNpcGFsaXR5IG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIxNCwiZXMiLDIsImVzIikpOwkvL1NwYWluCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjE2LCJodSIsMikpOwkvL0h1bmdhcnkgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIxOCwiYmEiLDIpKTsJLy9Cb3NuaWEgYW5kIEhlcnplZ292aW5hCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjE5LCJociIsMikpOwkvL0Nyb2F0aWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIyMCwicnMiLDIpKTsJLy9TZXJiaWEgYW5kIE1vbnRlbmVncm8KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMjIsIml0IiwyLCJpdCIpKTsJLy9JdGFseQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIyNSwidmEiLDIsIml0IikpOwkvL1ZhdGljYW4gQ2l0eSBTdGF0ZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIyNiwicm8iLDIpKTsJLy9Sb21hbmlhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjI4LCJjaCIsMiwiZGUiKSk7CS8vU3dpdHplcmxhbmQgKENvbmZlZGVyYXRpb24gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjMwLCJjeiIsMiwiY3MiLDEzKSk7CS8vQ3plY2ggUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMzEsInNrIiwyKSk7CS8vU2xvdmFrIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjMyLCJhdCIsMiwiZGUiLDEzKSk7CS8vQXVzdHJpYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIzNCwiZ2IiLDIsImVuIiwxMykpOwkvL1VuaXRlZCBLaW5nZG9tIG9mIEdyZWF0IEJyaXRhaW4gYW5kIE5vcnRoZXJuIElyZWxhbmQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMzUsImdiIiwyLCJlbiIsMTMpKTsJLy9Vbml0ZWQgS2luZ2RvbSBvZiBHcmVhdCBCcml0YWluIGFuZCBOb3J0aGVybiBJcmVsYW5kCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjM4LCJkayIsMikpOwkvL0Rlbm1hcmsKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDAsInNlIiwyKSk7CS8vU3dlZGVuCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjQyLCJubyIsMikpOwkvL05vcndheQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI0NCwiZmkiLDIpKTsJLy9GaW5sYW5kCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjQ2LCJsdCIsMikpOwkvL0xpdGh1YW5pYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjQ3LCJsdiIsMikpOwkvL0xhdHZpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjQ4LCJlZSIsMikpOwkvL0VzdG9uaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI1MCwicnUiLDIpKTsJLy9SdXNzaWFuIEZlZGVyYXRpb24KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNTUsInVhIiwyKSk7CS8vVWtyYWluZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI1NywiYnkiLDIpKTsJLy9CZWxhcnVzIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNTksIm1kIiwyKSk7CS8vTW9sZG92YSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjYwLCJwbCIsMikpOwkvL1BvbGFuZCAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjYyLCJkZSIsMiwiZGUiLDEzKSk7CS8vR2VybWFueSAoRmVkZXJhbCBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNjYsImdpIiwyKSk7CS8vR2licmFsdGFyCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjY4LCJwdCIsMikpOwkvL1BvcnR1Z2FsCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjcwLCJsdSIsMikpOwkvL0x1eGVtYm91cmcKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNzIsImllIiwyLCJlbiIpKTsJLy9JcmVsYW5kCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjc0LCJpcyIsMikpOwkvL0ljZWxhbmQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNzYsImFsIiwyKSk7CS8vQWxiYW5pYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjc4LCJtdCIsMikpOwkvL01hbHRhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjgwLCJjeSIsMikpOwkvL0N5cHJ1cyAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjgyLCJnZSIsMikpOwkvL0dlb3JnaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODMsImFtIiwyKSk7CS8vQXJtZW5pYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjg0LCJiZyIsMikpOwkvL0J1bGdhcmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODYsInRyIiwyKSk7CS8vVHVya2V5CisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjg4LCJmbyIsMikpOwkvL0Zhcm9lIElzbGFuZHMKKyAgICAgICAgICAgICAgICB0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI4OSwiZ2UiLDIpKTsgICAgLy9BYmtoYXppYSAoR2VvcmdpYSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyOTAsImdsIiwyKSk7CS8vR3JlZW5sYW5kIChEZW5tYXJrKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI5Miwic20iLDIpKTsJLy9TYW4gTWFyaW5vIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyOTMsInNsIiwyKSk7CS8vU2xvdmVuaWEgKFJlcHVibGljIG9mKQorICAgICAgICAgICAgICAgIHRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjk0LCJtayIsMikpOyAgIC8vVGhlIEZvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBvZiBNYWNlZG9uaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyOTUsImxpIiwyKSk7CS8vTGllY2h0ZW5zdGVpbiAoUHJpbmNpcGFsaXR5IG9mKQorICAgICAgICAgICAgICAgIHRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjk3LCJtZSIsMikpOyAgICAvL01vbnRlbmVncm8gKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMwMiwiY2EiLDMsIiIsMTEpKTsJLy9DYW5hZGEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMDgsInBtIiwyKSk7CS8vU2FpbnQgUGllcnJlIGFuZCBNaXF1ZWxvbiAoQ29sbGVjdGl2aXQgdGVycml0b3JpYWxlIGRlIGxhIFJwdWJsaXF1ZSBmcmFuYWlzZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMTAsInVzIiwzLCJlbiIsMTEpKTsJLy9Vbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMTEsInVzIiwzLCJlbiIsMTEpKTsJLy9Vbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMTIsInVzIiwzLCJlbiIsMTEpKTsJLy9Vbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMTMsInVzIiwzLCJlbiIsMTEpKTsJLy9Vbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMTQsInVzIiwzLCJlbiIsMTEpKTsJLy9Vbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMTUsInVzIiwzLCJlbiIsMTEpKTsJLy9Vbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMTYsInVzIiwzLCJlbiIsMTEpKTsJLy9Vbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMzAsInByIiwyKSk7CS8vUHVlcnRvIFJpY28KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMzIsInZpIiwyKSk7CS8vVW5pdGVkIFN0YXRlcyBWaXJnaW4gSXNsYW5kcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMzNCwibXgiLDMpKTsJLy9NZXhpY28KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzMzgsImptIiwzKSk7CS8vSmFtYWljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM0MCwiZ3AiLDIpKTsJLy9HdWFkZWxvdXBlIChGcmVuY2ggRGVwYXJ0bWVudCBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNDIsImJiIiwzKSk7CS8vQmFyYmFkb3MKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNDQsImFnIiwzKSk7CS8vQW50aWd1YSBhbmQgQmFyYnVkYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM0Niwia3kiLDMpKTsJLy9DYXltYW4gSXNsYW5kcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM0OCwidmciLDMpKTsJLy9Ccml0aXNoIFZpcmdpbiBJc2xhbmRzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzUwLCJibSIsMikpOwkvL0Jlcm11ZGEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNTIsImdkIiwyKSk7CS8vR3JlbmFkYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM1NCwibXMiLDIpKTsJLy9Nb250c2VycmF0CisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzU2LCJrbiIsMikpOwkvL1NhaW50IEtpdHRzIGFuZCBOZXZpcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM1OCwibGMiLDIpKTsJLy9TYWludCBMdWNpYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM2MCwidmMiLDIpKTsJLy9TYWludCBWaW5jZW50IGFuZCB0aGUgR3JlbmFkaW5lcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM2MiwibmwiLDIpKTsJLy9OZXRoZXJsYW5kcyBBbnRpbGxlcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM2MywiYXciLDIpKTsJLy9BcnViYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM2NCwiYnMiLDIpKTsJLy9CYWhhbWFzIChDb21tb253ZWFsdGggb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM2NSwiYWkiLDMpKTsJLy9Bbmd1aWxsYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM2NiwiZG0iLDIpKTsJLy9Eb21pbmljYSAoQ29tbW9ud2VhbHRoIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM2OCwiY3UiLDIpKTsJLy9DdWJhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzcwLCJkbyIsMikpOwkvL0RvbWluaWNhbiBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM3MiwiaHQiLDIpKTsJLy9IYWl0aSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzc0LCJ0dCIsMikpOwkvL1RyaW5pZGFkIGFuZCBUb2JhZ28KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNzYsInRjIiwyKSk7CS8vVHVya3MgYW5kIENhaWNvcyBJc2xhbmRzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDAwLCJheiIsMikpOwkvL0F6ZXJiYWlqYW5pIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDAxLCJreiIsMikpOwkvL0themFraHN0YW4gKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQwMiwiYnQiLDIpKTsJLy9CaHV0YW4gKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDA0LCJpbiIsMikpOwkvL0luZGlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MDUsImluIiwyKSk7CS8vSW5kaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxMCwicGsiLDIpKTsJLy9QYWtpc3RhbiAoSXNsYW1pYyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTIsImFmIiwyKSk7CS8vQWZnaGFuaXN0YW4KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTMsImxrIiwyKSk7CS8vU3JpIExhbmthIChEZW1vY3JhdGljIFNvY2lhbGlzdCBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTQsIm1tIiwyKSk7CS8vTXlhbm1hciAoVW5pb24gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDE1LCJsYiIsMikpOwkvL0xlYmFub24KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTYsImpvIiwyKSk7CS8vSm9yZGFuIChIYXNoZW1pdGUgS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTcsInN5IiwyKSk7CS8vU3lyaWFuIEFyYWIgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTgsImlxIiwyKSk7CS8vSXJhcSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDE5LCJrdyIsMikpOwkvL0t1d2FpdCAoU3RhdGUgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDIwLCJzYSIsMikpOwkvL1NhdWRpIEFyYWJpYSAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjEsInllIiwyKSk7CS8vWWVtZW4gKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyMiwib20iLDIpKTsJLy9PbWFuIChTdWx0YW5hdGUgb2YpCisgICAgICAgICAgICAgICAgdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjMsInBzIiwyKSk7ICAgIC8vUGFsZXN0aW5lCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDI0LCJhZSIsMikpOwkvL1VuaXRlZCBBcmFiIEVtaXJhdGVzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDI1LCJpbCIsMikpOwkvL0lzcmFlbCAoU3RhdGUgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDI2LCJiaCIsMikpOwkvL0JhaHJhaW4gKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDI3LCJxYSIsMikpOwkvL1FhdGFyIChTdGF0ZSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjgsIm1uIiwyKSk7CS8vTW9uZ29saWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjksIm5wIiwyKSk7CS8vTmVwYWwKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MzAsImFlIiwyKSk7CS8vVW5pdGVkIEFyYWIgRW1pcmF0ZXMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MzEsImFlIiwyKSk7CS8vVW5pdGVkIEFyYWIgRW1pcmF0ZXMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MzIsImlyIiwyKSk7CS8vSXJhbiAoSXNsYW1pYyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MzQsInV6IiwyKSk7CS8vVXpiZWtpc3RhbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDM2LCJ0aiIsMikpOwkvL1RhamlraXN0YW4gKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzNywia2ciLDIpKTsJLy9LeXJneXogUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MzgsInRtIiwyKSk7CS8vVHVya21lbmlzdGFuCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDQwLCJqcCIsMiwiamEiLDE0KSk7CS8vSmFwYW4KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NDEsImpwIiwyLCJqYSIsMTQpKTsJLy9KYXBhbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ1MCwia3IiLDIsImtvIiwxMykpOwkvL0tvcmVhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NTIsInZuIiwyKSk7CS8vVmlldCBOYW0gKFNvY2lhbGlzdCBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NTQsImhrIiwyKSk7CS8vIkhvbmcgS29uZywgQ2hpbmEiCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDU1LCJtbyIsMikpOwkvLyJNYWNhbywgQ2hpbmEiCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDU2LCJraCIsMikpOwkvL0NhbWJvZGlhIChLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ1NywibGEiLDIpKTsJLy9MYW8gUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ2MCwiY24iLDIsInpoIiwxMykpOwkvL0NoaW5hIChQZW9wbGUncyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NjEsImNuIiwyLCJ6aCIsMTMpKTsJLy9DaGluYSAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDY2LCJ0dyIsMikpOwkvLyJUYWl3YW4sIENoaW5hIgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ2Nywia3AiLDIpKTsJLy9EZW1vY3JhdGljIFBlb3BsZSdzIFJlcHVibGljIG9mIEtvcmVhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDcwLCJiZCIsMikpOwkvL0JhbmdsYWRlc2ggKFBlb3BsZSdzIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ3MiwibXYiLDIpKTsJLy9NYWxkaXZlcyAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTAyLCJteSIsMikpOwkvL01hbGF5c2lhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTA1LCJhdSIsMiwiZW4iLDExKSk7CS8vQXVzdHJhbGlhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTEwLCJpZCIsMikpOwkvL0luZG9uZXNpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTE0LCJ0bCIsMikpOwkvL0RlbW9jcmF0aWMgUmVwdWJsaWMgb2YgVGltb3ItTGVzdGUKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MTUsInBoIiwyKSk7CS8vUGhpbGlwcGluZXMgKFJlcHVibGljIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MjAsInRoIiwyKSk7CS8vVGhhaWxhbmQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MjUsInNnIiwyLCJlbiIsMTEpKTsJLy9TaW5nYXBvcmUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUyOCwiYm4iLDIpKTsJLy9CcnVuZWkgRGFydXNzYWxhbQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUzMCwibnoiLDIsICJlbiIpKTsJLy9OZXcgWmVhbGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUzNCwibXAiLDIpKTsJLy9Ob3J0aGVybiBNYXJpYW5hIElzbGFuZHMgKENvbW1vbndlYWx0aCBvZiB0aGUpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTM1LCJndSIsMikpOwkvL0d1YW0KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MzYsIm5yIiwyKSk7CS8vTmF1cnUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUzNywicGciLDIpKTsJLy9QYXB1YSBOZXcgR3VpbmVhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTM5LCJ0byIsMikpOwkvL1RvbmdhIChLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0MCwic2IiLDIpKTsJLy9Tb2xvbW9uIElzbGFuZHMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDEsInZ1IiwyKSk7CS8vVmFudWF0dSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQyLCJmaiIsMikpOwkvL0ZpamkgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0Mywid2YiLDIpKTsJLy9XYWxsaXMgYW5kIEZ1dHVuYSAoVGVycml0b2lyZSBmcmFuYWlzIGQnb3V0cmUtbWVyKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0NCwiYXMiLDIpKTsJLy9BbWVyaWNhbiBTYW1vYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0NSwia2kiLDIpKTsJLy9LaXJpYmF0aSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQ2LCJuYyIsMikpOwkvL05ldyBDYWxlZG9uaWEgKFRlcnJpdG9pcmUgZnJhbmFpcyBkJ291dHJlLW1lcikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDcsInBmIiwyKSk7CS8vRnJlbmNoIFBvbHluZXNpYSAoVGVycml0b2lyZSBmcmFuYWlzIGQnb3V0cmUtbWVyKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0OCwiY2siLDIpKTsJLy9Db29rIElzbGFuZHMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDksIndzIiwyKSk7CS8vU2Ftb2EgKEluZGVwZW5kZW50IFN0YXRlIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU1MCwiZm0iLDIpKTsJLy9NaWNyb25lc2lhIChGZWRlcmF0ZWQgU3RhdGVzIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU1MSwibWgiLDIpKTsJLy9NYXJzaGFsbCBJc2xhbmRzIChSZXB1YmxpYyBvZiB0aGUpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTUyLCJwdyIsMikpOwkvL1BhbGF1IChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDIsImVnIiwyKSk7CS8vRWd5cHQgKEFyYWIgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjAzLCJkeiIsMikpOwkvL0FsZ2VyaWEgKFBlb3BsZSdzIERlbW9jcmF0aWMgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjA0LCJtYSIsMikpOwkvL01vcm9jY28gKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjA1LCJ0biIsMikpOwkvL1R1bmlzaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDYsImx5IiwyKSk7CS8vTGlieWEgKFNvY2lhbGlzdCBQZW9wbGUncyBMaWJ5YW4gQXJhYiBKYW1haGlyaXlhKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwNywiZ20iLDIpKTsJLy9HYW1iaWEgKFJlcHVibGljIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDgsInNuIiwyKSk7CS8vU2VuZWdhbCAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjA5LCJtciIsMikpOwkvL01hdXJpdGFuaWEgKElzbGFtaWMgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjEwLCJtbCIsMikpOwkvL01hbGkgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxMSwiZ24iLDIpKTsJLy9HdWluZWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxMiwiY2kiLDIpKTsJLy9DdGUgZCdJdm9pcmUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxMywiYmYiLDIpKTsJLy9CdXJraW5hIEZhc28KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MTQsIm5lIiwyKSk7CS8vTmlnZXIgKFJlcHVibGljIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MTUsInRnIiwyKSk7CS8vVG9nb2xlc2UgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MTYsImJqIiwyKSk7CS8vQmVuaW4gKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxNywibXUiLDIpKTsJLy9NYXVyaXRpdXMgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxOCwibHIiLDIpKTsJLy9MaWJlcmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MTksInNsIiwyKSk7CS8vU2llcnJhIExlb25lCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjIwLCJnaCIsMikpOwkvL0doYW5hCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjIxLCJuZyIsMikpOwkvL05pZ2VyaWEgKEZlZGVyYWwgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjIyLCJ0ZCIsMikpOwkvL0NoYWQgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyMywiY2YiLDIpKTsJLy9DZW50cmFsIEFmcmljYW4gUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjQsImNtIiwyKSk7CS8vQ2FtZXJvb24gKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyNSwiY3YiLDIpKTsJLy9DYXBlIFZlcmRlIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjYsInN0IiwyKSk7CS8vU2FvIFRvbWUgYW5kIFByaW5jaXBlIChEZW1vY3JhdGljIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyNywiZ3EiLDIpKTsJLy9FcXVhdG9yaWFsIEd1aW5lYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjI4LCJnYSIsMikpOwkvL0dhYm9uZXNlIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjI5LCJjZyIsMikpOwkvL0NvbmdvIChSZXB1YmxpYyBvZiB0aGUpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjMwLCJjZyIsMikpOwkvL0RlbW9jcmF0aWMgUmVwdWJsaWMgb2YgdGhlIENvbmdvCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjMxLCJhbyIsMikpOwkvL0FuZ29sYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjMyLCJndyIsMikpOwkvL0d1aW5lYS1CaXNzYXUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzMywic2MiLDIpKTsJLy9TZXljaGVsbGVzIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzQsInNkIiwyKSk7CS8vU3VkYW4gKFJlcHVibGljIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzUsInJ3IiwyKSk7CS8vUndhbmRhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzYsImV0IiwyKSk7CS8vRXRoaW9waWEgKEZlZGVyYWwgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzcsInNvIiwyKSk7CS8vU29tYWxpIERlbW9jcmF0aWMgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzgsImRqIiwyKSk7CS8vRGppYm91dGkgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzOSwia2UiLDIpKTsJLy9LZW55YSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQwLCJ0eiIsMikpOwkvL1RhbnphbmlhIChVbml0ZWQgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQxLCJ1ZyIsMikpOwkvL1VnYW5kYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQyLCJiaSIsMikpOwkvL0J1cnVuZGkgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY0MywibXoiLDIpKTsJLy9Nb3phbWJpcXVlIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDUsInptIiwyKSk7CS8vWmFtYmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDYsIm1nIiwyKSk7CS8vTWFkYWdhc2NhciAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQ3LCJyZSIsMikpOwkvL1JldW5pb24gKEZyZW5jaCBEZXBhcnRtZW50IG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY0OCwienciLDIpKTsJLy9aaW1iYWJ3ZSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQ5LCJuYSIsMikpOwkvL05hbWliaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1MCwibXciLDIpKTsJLy9NYWxhd2kKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NTEsImxzIiwyKSk7CS8vTGVzb3RobyAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NTIsImJ3IiwyKSk7CS8vQm90c3dhbmEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1Mywic3oiLDIpKTsJLy9Td2F6aWxhbmQgKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjU0LCJrbSIsMikpOwkvL0NvbW9yb3MgKFVuaW9uIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NTUsInphIiwyLCJlbiIpKTsJLy9Tb3V0aCBBZnJpY2EgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1NywiZXIiLDIpKTsJLy9Fcml0cmVhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzAyLCJieiIsMikpOwkvL0JlbGl6ZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcwNCwiZ3QiLDIpKTsJLy9HdWF0ZW1hbGEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcwNiwic3YiLDIpKTsJLy9FbCBTYWx2YWRvciAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzA4LCJobiIsMykpOwkvL0hvbmR1cmFzIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MTAsIm5pIiwyKSk7CS8vTmljYXJhZ3VhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzEyLCJjciIsMikpOwkvL0Nvc3RhIFJpY2EKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MTQsInBhIiwyKSk7CS8vUGFuYW1hIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MTYsInBlIiwyKSk7CS8vUGVydQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcyMiwiYXIiLDMpKTsJLy9BcmdlbnRpbmUgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MjQsImJyIiwyKSk7CS8vQnJhemlsIChGZWRlcmF0aXZlIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDczMCwiY2wiLDIpKTsJLy9DaGlsZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDczMiwiY28iLDMpKTsJLy9Db2xvbWJpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzM0LCJ2ZSIsMikpOwkvL1ZlbmV6dWVsYSAoQm9saXZhcmlhbiBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MzYsImJvIiwyKSk7CS8vQm9saXZpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzM4LCJneSIsMikpOwkvL0d1eWFuYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDc0MCwiZWMiLDIpKTsJLy9FY3VhZG9yCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzQyLCJnZiIsMikpOwkvL0ZyZW5jaCBHdWlhbmEgKEZyZW5jaCBEZXBhcnRtZW50IG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDc0NCwicHkiLDIpKTsJLy9QYXJhZ3VheSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzQ2LCJzciIsMikpOwkvL1N1cmluYW1lIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3NDgsInV5IiwyKSk7CS8vVXJ1Z3VheSAoRWFzdGVybiBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3NTAsImZrIiwyKSk7CS8vRmFsa2xhbmQgSXNsYW5kcyAoTWFsdmluYXMpCisgICAgICAgIC8vdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg5MDEsIiIsMikpOwkvLyJJbnRlcm5hdGlvbmFsIE1vYmlsZSwgc2hhcmVkIGNvZGUiCisKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0YWJsZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YQppbmRleCAzZGQ5YTAxLi5mZmZlMDU3IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YQpAQCAtMTcsMTAgKzE3LDkgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LkNlbGxMb2NhdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlOwpAQCAtMjgsNyArMjcsNiBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkRhdGFDb25uZWN0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uTmV0d29ya0luZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Hc21EYXRhQ29ubmVjdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRSYWRpb0NvbnRyb2w7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTk5LDExICs5NywxMSBAQAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhPTkVfTkFNRV9LRVkgPSAicGhvbmVOYW1lIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVBU09OX0tFWSA9ICJyZWFzb24iOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfQ0hBTkdFX1JFQVNPTl9LRVkgPSAicmVhc29uIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQVBOX1RZUEVTX0tFWSA9ICJhcG5UeXBlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQVBOX1RZUEVfS0VZID0gImFwblR5cGUiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9BUE5fS0VZID0gImFwbiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0xJTktfUFJPUEVSVElFU19LRVkgPSAibGlua1Byb3BlcnRpZXMiOwogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0lGQUNFX05BTUVfS0VZID0gImlmYWNlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfR0FURVdBWV9LRVkgPSAiZ2F0ZXdheSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBORVRXT1JLX1VOQVZBSUxBQkxFX0tFWSA9ICJuZXR3b3JrVW52YWlsYWJsZSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9ORV9JTl9FQ01fU1RBVEUgPSAicGhvbmVpbkVDTVN0YXRlIjsKIApAQCAtMjQzLDEzICsyNDEsMjEgQEAKICAgICBDZWxsTG9jYXRpb24gZ2V0Q2VsbExvY2F0aW9uKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIGN1cnJlbnQgRGF0YVN0YXRlLiBObyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGV4aXN0cyBhdCB0aGlzCi0gICAgICogaW50ZXJmYWNlIC0tIHVzZQorICAgICAqIEdldCB0aGUgY3VycmVudCBmb3IgdGhlIGRlZmF1bHQgYXBuIERhdGFTdGF0ZS4gTm8gY2hhbmdlIG5vdGlmaWNhdGlvbgorICAgICAqIGV4aXN0cyBhdCB0aGlzIGludGVyZmFjZSAtLSB1c2UKICAgICAgKiB7QGxpbmsgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyfSBpbnN0ZWFkLgogICAgICAqLwogICAgIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKCk7CiAKICAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgRGF0YVN0YXRlLiBObyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGV4aXN0cyBhdCB0aGlzCisgICAgICogaW50ZXJmYWNlIC0tIHVzZQorICAgICAqIHtAbGluayBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXJ9IGluc3RlYWQuCisgICAgICogQHBhcmFtIGFwblR5cGUgc3BlY2lmeSBmb3Igd2hpY2ggYXBuIHRvIGdldCBjb25uZWN0aW9uIHN0YXRlIGluZm8uCisgICAgICovCisgICAgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoU3RyaW5nIGFwblR5cGUpOworCisgICAgLyoqCiAgICAgICogR2V0IHRoZSBjdXJyZW50IERhdGFBY3Rpdml0eVN0YXRlLiBObyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGV4aXN0cyBhdCB0aGlzCiAgICAgICogaW50ZXJmYWNlIC0tIHVzZQogICAgICAqIHtAbGluayBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyfSBpbnN0ZWFkLgpAQCAtMzEzLDYgKzMxOSwxMSBAQAogICAgIFN0cmluZyBnZXRBY3RpdmVBcG4oKTsKIAogICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTGlua1Byb3BlcnRpZXMgZm9yIHRoZSBuYW1lZCBhcG4gb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlCisgICAgICovCisgICAgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoU3RyaW5nIGFwblR5cGUpOworCisgICAgLyoqCiAgICAgICogR2V0IGN1cnJlbnQgc2lnbmFsIHN0cmVuZ3RoLiBObyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGF2YWlsYWJsZSBvbiB0aGlzCiAgICAgICogaW50ZXJmYWNlLiBVc2UgPGNvZGU+UGhvbmVTdGF0ZU5vdGlmaWVyPC9jb2RlPiBvciBhbiBlcXVpdmFsZW50LgogICAgICAqIEFuIEFTVSBpcyAwLTMxIG9yIC0xIGlmIHVua25vd24gKGZvciBHU00sIGRCbSA9IC0xMTMgLSAyICogYXN1KS4KQEAgLTEzNjgsMjkgKzEzNzksNiBAQAogICAgIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHVzZWQgYnkgdGhlIHNwZWNpZmllZCBBUE4gdHlwZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SW50ZXJmYWNlTmFtZShTdHJpbmcgYXBuVHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBuZXR3b3JrIGludGVyZmFjZSB1c2VkIGJ5IHRoZSBzcGVjaWZpZWQKLSAgICAgKiBBUE4gdHlwZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SXBBZGRyZXNzKFN0cmluZyBhcG5UeXBlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGdhdGV3YXkgZm9yIHRoZSBuZXR3b3JrIGludGVyZmFjZSB1c2VkIGJ5IHRoZSBzcGVjaWZpZWQgQVBOCi0gICAgICogdHlwZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0R2F0ZXdheShTdHJpbmcgYXBuVHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBETlMgc2VydmVycyBmb3IgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHVzZWQgYnkgdGhlIHNwZWNpZmllZAotICAgICAqIEFQTiB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREbnNTZXJ2ZXJzKFN0cmluZyBhcG5UeXBlKTsKLQotICAgIC8qKgogICAgICAqIFJldHJpZXZlcyB0aGUgdW5pcXVlIGRldmljZSBJRCwgZS5nLiwgSU1FSSBmb3IgR1NNIHBob25lcyBhbmQgTUVJRCBmb3IgQ0RNQSBwaG9uZXMuCiAgICAgICovCiAgICAgU3RyaW5nIGdldERldmljZUlkKCk7CkBAIC0xNTM1LDYgKzE1MjMsMTEgQEAKICAgICBib29sZWFuIGlzT3RhU3BOdW1iZXIoU3RyaW5nIGRpYWxTdHIpOwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIE9UQSBTZXJ2aWNlIFByb3Zpc2lvbmluZyBuZWVkcyB0byBiZSBwZXJmb3JtZWQuCisgICAgICovCisgICAgYm9vbGVhbiBuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKTsKKworICAgIC8qKgogICAgICAqIFJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIHdoZW4gQ0RNQSBjYWxsIHdhaXRpbmcgY29tZXMKICAgICAgKgogICAgICAqIEBwYXJhbSBoIEhhbmRsZXIgdGhhdCByZWNlaXZlcyB0aGUgbm90aWZpY2F0aW9uIG1lc3NhZ2UuCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVCYXNlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVCYXNlLmphdmEKaW5kZXggYzNjOGY1ZS4uMzZhMmZjZiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lQmFzZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUJhc2UuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKQEAgLTM1LDEwICszNiw4IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Hc21EYXRhQ29ubmVjdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRSYWRpb0NvbnRyb2w7CiAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiAKQEAgLTczNyw4ICs3MzYsMTMgQEAKICAgICAgICAgbU5vdGlmaWVyLm5vdGlmeU1lc3NhZ2VXYWl0aW5nQ2hhbmdlZCh0aGlzKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uKSB7Ci0gICAgICAgIG1Ob3RpZmllci5ub3RpZnlEYXRhQ29ubmVjdGlvbih0aGlzLCByZWFzb24pOworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlLAorICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlKSB7CisgICAgICAgIG1Ob3RpZmllci5ub3RpZnlEYXRhQ29ubmVjdGlvbih0aGlzLCByZWFzb24sIGFwblR5cGUsIHN0YXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICBtTm90aWZpZXIubm90aWZ5RGF0YUNvbm5lY3Rpb24odGhpcywgcmVhc29uLCBhcG5UeXBlKTsKICAgICB9CiAKICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFBob25lTmFtZSgpOwpAQCAtODI0LDkgKzgyOCwxOSBAQAogICAgICAgICBsb2dVbmV4cGVjdGVkQ2RtYU1ldGhvZENhbGwoInVucmVnaXN0ZXJGb3JTdWJzY3JpcHRpb25JbmZvUmVhZHkiKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgT1RBIFNlcnZpY2UgUHJvdmlzaW9uaW5nIG5lZWRzIHRvIGJlIHBlcmZvcm1lZC4KKyAgICAgKiBJZiBub3Qgb3ZlcnJpZGRlbiByZXR1cm4gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgbnVtYmVyIGlzIGFuIE9UQVNQIG51bWJlci4KKyAgICAgKiBJZiBub3Qgb3ZlcnJpZGRlbiByZXR1cm4gZmFsc2UuCisgICAgICovCiAgICAgcHVibGljICBib29sZWFuIGlzT3RhU3BOdW1iZXIoU3RyaW5nIGRpYWxTdHIpIHsKLSAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieSB0aGUgY2xhc3MgQ0RNQVBob25lLiBOb3QgaW1wbGVtZW50ZWQgaW4gR1NNUGhvbmUuCi0gICAgICAgIGxvZ1VuZXhwZWN0ZWRDZG1hTWV0aG9kQ2FsbCgiaXNPdGFTcE51bWJlciIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC05MTYsMzAgKzkzMCwxOCBAQAogICAgICAgICAgbG9nVW5leHBlY3RlZENkbWFNZXRob2RDYWxsKCJ1bnNldE9uRWNiTW9kZUV4aXRSZXNwb25zZSIpOwogICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1EYXRhQ29ubmVjdGlvbi5nZXRJbnRlcmZhY2VOYW1lKGFwblR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXBBZGRyZXNzKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZ2V0SXBBZGRyZXNzKGFwblR5cGUpOwotICAgIH0KLQogICAgIHB1YmxpYyBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eUVuYWJsZWQoKSB7CiAgICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YUVuYWJsZWQoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEdhdGV3YXkoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1EYXRhQ29ubmVjdGlvbi5nZXRHYXRld2F5KGFwblR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREbnNTZXJ2ZXJzKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZ2V0RG5zU2VydmVycyhhcG5UeXBlKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aXZlQXBuVHlwZXMoKSB7CiAgICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZ2V0QWN0aXZlQXBuVHlwZXMoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhQ29ubmVjdGlvbi5nZXRMaW5rUHJvcGVydGllcyhhcG5UeXBlKTsKKyAgICB9CisKICAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGl2ZUFwbigpIHsKICAgICAgICAgcmV0dXJuIG1EYXRhQ29ubmVjdGlvbi5nZXRBY3RpdmVBcG5TdHJpbmcoKTsKICAgICB9CkBAIC05NTIsNiArOTU0LDEwIEBACiAgICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZGlzYWJsZUFwblR5cGUodHlwZSk7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKSB7CisgICAgICAgIHJldHVybiAoKG1EYXRhQ29ubmVjdGlvbiAhPSBudWxsKSAmJiAobURhdGFDb25uZWN0aW9uLmlzRGF0YVBvc3NpYmxlKCkpKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBzaW11bGF0ZURhdGFDb25uZWN0aW9uCiAgICAgICoKQEAgLTk4MCw3ICs5ODYsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgbURhdGFDb25uZWN0aW9uLnNldFN0YXRlKGRjU3RhdGUpOwotICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCwgUGhvbmUuQVBOX1RZUEVfREVGQVVMVCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDM0LDYgKzEwNDAsMTAgQEAKICAgICAgICAgICAgICAgICAiY2FsbGVkLCBDRE1BUGhvbmUgaW5hY3RpdmUuIik7CiAgICAgfQogCisgICAgcHVibGljIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKCkgeworICAgICAgICByZXR1cm4gZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShBUE5fVFlQRV9ERUZBVUxUKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDb21tb24gZXJyb3IgbG9nZ2VyIG1ldGhvZCBmb3IgdW5leHBlY3RlZCBjYWxscyB0byBHU00vV0NETUEtb25seSBtZXRob2RzLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTm90aWZpZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU5vdGlmaWVyLmphdmEKaW5kZXggZTk2ZWVhZS4uNjkxMjcxZiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTm90aWZpZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOb3RpZmllci5qYXZhCkBAIC0zMyw5ICszMywxMiBAQAogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2FsbEZvcndhcmRpbmdDaGFuZ2VkKFBob25lIHNlbmRlcik7CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24pOworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpOwogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKTsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlLAorICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlKTsKKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpOwogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUFjdGl2aXR5KFBob25lIHNlbmRlcik7CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZVByb3h5LmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVQcm94eS5qYXZhCmluZGV4IDVlN2RjYjAuLmI2ZTRjZGEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZVByb3h5LmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lUHJveHkuamF2YQpAQCAtMjAsMTMgKzIwLDExIEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5DZWxsTG9jYXRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TaWduYWxTdHJlbmd0aDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtMzQsNyArMzIsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hLkNETUFQaG9uZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVBob25lOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uTmV0d29ya0luZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Hc21EYXRhQ29ubmVjdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRSYWRpb0NvbnRyb2w7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTE3Miw3ICsxNjksMTEgQEAKICAgICB9CiAKICAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpOworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldERhdGFDb25uZWN0aW9uU3RhdGUoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCk7CisgICAgfQorCisgICAgcHVibGljIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShhcG5UeXBlKTsKICAgICB9CiAKICAgICBwdWJsaWMgRGF0YUFjdGl2aXR5U3RhdGUgZ2V0RGF0YUFjdGl2aXR5U3RhdGUoKSB7CkBAIC0yMDcsNiArMjA4LDEwIEBACiAgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0QWN0aXZlQXBuVHlwZXMoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRMaW5rUHJvcGVydGllcyhhcG5UeXBlKTsKKyAgICB9CisKICAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGl2ZUFwbigpIHsKICAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRBY3RpdmVBcG4oKTsKICAgICB9CkBAIC02NjAsMjIgKzY2NSw2IEBACiAgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRJbnRlcmZhY2VOYW1lKGFwblR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXBBZGRyZXNzKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0SXBBZGRyZXNzKGFwblR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0R2F0ZXdheShTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldEdhdGV3YXkoYXBuVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldERuc1NlcnZlcnMoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXREbnNTZXJ2ZXJzKGFwblR5cGUpOwotICAgIH0KLQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV2aWNlSWQoKSB7CiAgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGV2aWNlSWQoKTsKICAgICB9CkBAIC03NjQsNiArNzUzLDEwIEBACiAgICAgICAgIG1BY3RpdmVQaG9uZS5leGl0RW1lcmdlbmN5Q2FsbGJhY2tNb2RlKCk7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCl7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUubmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCk7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNPdGFTcE51bWJlcihTdHJpbmcgZGlhbFN0cil7CiAgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuaXNPdGFTcE51bWJlcihkaWFsU3RyKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEKaW5kZXggNTY5YWM1Yy4uMWEwZGQ4OSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1JJTC5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9SSUwuamF2YQpAQCAtMjg1LDkgKzI4NSw4IEBACiAgICAgICAgIH0KIAogCi0gICAgICAgIC8vKioqKiogSGFuZGxlciBpbXBsZW1lbWVudGF0aW9uCi0KLSAgICAgICAgcHVibGljIHZvaWQKKyAgICAgICAgLy8qKioqKiBIYW5kbGVyIGltcGxlbWVudGF0aW9uCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZAogICAgICAgICBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CiAgICAgICAgICAgICBSSUxSZXF1ZXN0IHJyID0gKFJJTFJlcXVlc3QpKG1zZy5vYmopOwogICAgICAgICAgICAgUklMUmVxdWVzdCByZXEgPSBudWxsOwpAQCAtNzgwLDcgKzc3OSw3IEBACiAgICAgICAgIHNlbmQocnIpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkCisgICAgQERlcHJlY2F0ZWQgcHVibGljIHZvaWQKICAgICBnZXRQRFBDb250ZXh0TGlzdChNZXNzYWdlIHJlc3VsdCkgewogICAgICAgICBnZXREYXRhQ2FsbExpc3QocmVzdWx0KTsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXIuamF2YQppbmRleCA2MDZiNTJkLi5mMWE3MTA3IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEKQEAgLTI1NSw2ICsyNTUsNyBAQAogICAgICAgICBtQ20udW5yZWdpc3RlckZvck9uKHRoaXMpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgewogICAgICAgICBMb2cuZChUQUcsICJTTVNEaXNwYXRjaGVyIGZpbmFsaXplZCIpOwogICAgIH0KQEAgLTY3OSw3ICs2ODAsNyBAQAogICAgICAqICB0aGUgZXh0cmEgImVycm9yQ29kZSIgY29udGFpbmluZyBhIHJhZGlvIHRlY2hub2xvZ3kgc3BlY2lmaWMgdmFsdWUsCiAgICAgICogIGdlbmVyYWxseSBvbmx5IHVzZWZ1bCBmb3IgdHJvdWJsZXNob290aW5nLjxicj4KICAgICAgKiAgVGhlIHBlci1hcHBsaWNhdGlvbiBiYXNlZCBTTVMgY29udHJvbCBjaGVja3Mgc2VudEludGVudC4gSWYgc2VudEludGVudAotICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYWl0b25zLAorICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYXRpb25zLAogICAgICAqICB3aGljaCBjYXVzZSBzbWFsbGVyIG51bWJlciBvZiBTTVMgdG8gYmUgc2VudCBpbiBjaGVja2luZyBwZXJpb2QuCiAgICAgICogQHBhcmFtIGRlbGl2ZXJ5SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT4gaXMKICAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgZGVsaXZlcmVkIHRvIHRoZSByZWNpcGllbnQuICBUaGUKQEAgLTczMiw3ICs3MzMsNyBAQAogICAgICAqICAgPGNvZGU+UkVTVUxUX0VSUk9SX1JBRElPX09GRjwvY29kZT4KICAgICAgKiAgIDxjb2RlPlJFU1VMVF9FUlJPUl9OVUxMX1BEVTwvY29kZT4uCiAgICAgICogIFRoZSBwZXItYXBwbGljYXRpb24gYmFzZWQgU01TIGNvbnRyb2wgY2hlY2tzIHNlbnRJbnRlbnQuIElmIHNlbnRJbnRlbnQKLSAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2FpdG9ucywKKyAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2F0aW9ucywKICAgICAgKiAgd2hpY2ggY2F1c2Ugc21hbGxlciBudW1iZXIgb2YgU01TIHRvIGJlIHNlbnQgaW4gY2hlY2tpbmcgcGVyaW9kLgogICAgICAqIEBwYXJhbSBkZWxpdmVyeUludGVudHMgaWYgbm90IG51bGwsIGFuIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gb2YKICAgICAgKiAgIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+cyAob25lIGZvciBlYWNoIG1lc3NhZ2UgcGFydCkgdGhhdCBpcwpAQCAtNzQ4LDcgKzc0OSw3IEBACiAgICAgICogU2VuZCBhIFNNUwogICAgICAqCiAgICAgICogQHBhcmFtIHNtc2MgdGhlIFNNU0MgdG8gc2VuZCB0aGUgbWVzc2FnZSB0aHJvdWdoLCBvciBOVUxMIGZvciB0aGUKLSAgICAgKiAgZGVmYXR1bHQgU01TQworICAgICAqICBkZWZhdWx0IFNNU0MKICAgICAgKiBAcGFyYW0gcGR1IHRoZSByYXcgUERVIHRvIHNlbmQKICAgICAgKiBAcGFyYW0gc2VudEludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPkludGVudDwvY29kZT4gaXMKICAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjY2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KQEAgLTc1OCw3ICs3NTksNyBAQAogICAgICAqICA8Y29kZT5SRVNVTFRfRVJST1JfUkFESU9fT0ZGPC9jb2RlPgogICAgICAqICA8Y29kZT5SRVNVTFRfRVJST1JfTlVMTF9QRFU8L2NvZGU+LgogICAgICAqICBUaGUgcGVyLWFwcGxpY2F0aW9uIGJhc2VkIFNNUyBjb250cm9sIGNoZWNrcyBzZW50SW50ZW50LiBJZiBzZW50SW50ZW50Ci0gICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhaXRvbnMsCisgICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhdGlvbnMsCiAgICAgICogIHdoaWNoIGNhdXNlIHNtYWxsZXIgbnVtYmVyIG9mIFNNUyB0byBiZSBzZW50IGluIGNoZWNraW5nIHBlcmlvZC4KICAgICAgKiBAcGFyYW0gZGVsaXZlcnlJbnRlbnQgaWYgbm90IE5VTEwgdGhpcyA8Y29kZT5JbnRlbnQ8L2NvZGU+IGlzCiAgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIGRlbGl2ZXJlZCB0byB0aGUgcmVjaXBpZW50LiAgVGhlCkBAIC05MjcsMTQgKzkyOCwxNCBAQAogICAgICAqLwogICAgIHN0YXRpYyBwcm90ZWN0ZWQgY2xhc3MgU21zVHJhY2tlciB7CiAgICAgICAgIC8vIGZpZWxkcyBuZWVkIHRvIGJlIHB1YmxpYyBmb3IgZGVyaXZlZCBTbXNEaXNwYXRjaGVycwotICAgICAgICBwdWJsaWMgSGFzaE1hcCBtRGF0YTsKKyAgICAgICAgcHVibGljIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1EYXRhOwogICAgICAgICBwdWJsaWMgaW50IG1SZXRyeUNvdW50OwogICAgICAgICBwdWJsaWMgaW50IG1NZXNzYWdlUmVmOwogCiAgICAgICAgIHB1YmxpYyBQZW5kaW5nSW50ZW50IG1TZW50SW50ZW50OwogICAgICAgICBwdWJsaWMgUGVuZGluZ0ludGVudCBtRGVsaXZlcnlJbnRlbnQ7CiAKLSAgICAgICAgU21zVHJhY2tlcihIYXNoTWFwIGRhdGEsIFBlbmRpbmdJbnRlbnQgc2VudEludGVudCwKKyAgICAgICAgU21zVHJhY2tlcihIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsCiAgICAgICAgICAgICAgICAgUGVuZGluZ0ludGVudCBkZWxpdmVyeUludGVudCkgewogICAgICAgICAgICAgbURhdGEgPSBkYXRhOwogICAgICAgICAgICAgbVNlbnRJbnRlbnQgPSBzZW50SW50ZW50OwpAQCAtOTQzLDcgKzk0NCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgU21zVHJhY2tlciBTbXNUcmFja2VyRmFjdG9yeShIYXNoTWFwIGRhdGEsIFBlbmRpbmdJbnRlbnQgc2VudEludGVudCwKKyAgICBwcm90ZWN0ZWQgU21zVHJhY2tlciBTbXNUcmFja2VyRmFjdG9yeShIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsCiAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IGRlbGl2ZXJ5SW50ZW50KSB7CiAgICAgICAgIHJldHVybiBuZXcgU21zVHJhY2tlcihkYXRhLCBzZW50SW50ZW50LCBkZWxpdmVyeUludGVudCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NpcFBob25lTm90aWZpZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaXBQaG9uZU5vdGlmaWVyLmphdmEKaW5kZXggNDA5MmM2OS4uMzBkMDZkOCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NpcFBob25lTm90aWZpZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2lwUGhvbmVOb3RpZmllci5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKQEAgLTk0LDI2ICs5NSw0MiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICBkb05vdGlmeURhdGFDb25uZWN0aW9uKHNlbmRlciwgcmVhc29uLCBhcG5UeXBlLCBzZW5kZXIuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShhcG5UeXBlKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSkgeworICAgICAgICBkb05vdGlmeURhdGFDb25uZWN0aW9uKHNlbmRlciwgcmVhc29uLCBhcG5UeXBlLCBzdGF0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvTm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSkgeworICAgICAgICAvLyBUT0RPCisgICAgICAgIC8vIHVzZSBhcG5UeXBlIGFzIHRoZSBrZXkgdG8gd2hpY2ggY29ubmVjdGlvbiB3ZSdyZSB0YWxraW5nIGFib3V0LgorICAgICAgICAvLyBwYXNzIGFwblR5cGUgYmFjayB1cCB0byBmZXRjaCBwYXJ0aWN1bGFyIGZvciB0aGlzIG9uZS4KICAgICAgICAgVGVsZXBob255TWFuYWdlciB0ZWxlcGhvbnkgPSBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKTsKKyAgICAgICAgTGlua1Byb3BlcnRpZXMgbGlua1Byb3BlcnRpZXMgPSBudWxsOworICAgICAgICBpZiAoc3RhdGUgPT0gUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RFRCkgeworICAgICAgICAgICAgbGlua1Byb3BlcnRpZXMgPSBzZW5kZXIuZ2V0TGlua1Byb3BlcnRpZXMoYXBuVHlwZSk7CisgICAgICAgIH0KICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1SZWdpc3RyeS5ub3RpZnlEYXRhQ29ubmVjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgY29udmVydERhdGFTdGF0ZShzZW5kZXIuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgY29udmVydERhdGFTdGF0ZShzdGF0ZSksCiAgICAgICAgICAgICAgICAgICAgIHNlbmRlci5pc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpLCByZWFzb24sCiAgICAgICAgICAgICAgICAgICAgIHNlbmRlci5nZXRBY3RpdmVBcG4oKSwKLSAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmdldEFjdGl2ZUFwblR5cGVzKCksCi0gICAgICAgICAgICAgICAgICAgIHNlbmRlci5nZXRJbnRlcmZhY2VOYW1lKG51bGwpLAorICAgICAgICAgICAgICAgICAgICBhcG5UeXBlLAorICAgICAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcywKICAgICAgICAgICAgICAgICAgICAgKCh0ZWxlcGhvbnkhPW51bGwpID8gdGVsZXBob255LmdldE5ldHdvcmtUeXBlKCkgOgotICAgICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLk5FVFdPUktfVFlQRV9VTktOT1dOKSwKLSAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmdldEdhdGV3YXkobnVsbCkpOworICAgICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLk5FVFdPUktfVFlQRV9VTktOT1dOKSk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgbVJlZ2lzdHJ5Lm5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKHJlYXNvbik7CisgICAgICAgICAgICBtUmVnaXN0cnkubm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uLCBhcG5UeXBlKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkCiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNIZWFkZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNIZWFkZXIuamF2YQppbmRleCA3ODcyZWVjLi43YTY1MTYyIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU21zSGVhZGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc0hlYWRlci5qYXZhCkBAIC0zMCw3ICszMCw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTbXNIZWFkZXIgewogCi0gICAgLy8gVE9ETyhjbGVhbnVwKTogdGhpcyBkYXRhc3RydWN0dXJlIGlzIGdlbmVyYWxseSByZWZlcnJlZCB0byBhcworICAgIC8vIFRPRE8oY2xlYW51cCk6IHRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgZ2VuZXJhbGx5IHJlZmVycmVkIHRvIGFzCiAgICAgLy8gdGhlICd1c2VyIGRhdGEgaGVhZGVyJyBvciBVREgsIGFuZCBzbyB0aGUgY2xhc3MgbmFtZSBzaG91bGQKICAgICAvLyBjaGFuZ2UgdG8gcmVmbGVjdCB0aGlzLi4uCiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNNZXNzYWdlQmFzZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc01lc3NhZ2VCYXNlLmphdmEKaW5kZXggYWY2YzVmOC4uY2JkODYwNiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc01lc3NhZ2VCYXNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc01lc3NhZ2VCYXNlLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIApAQCAtMzY2LDEzICszNjUsMTMgQEAKICAgICAvKioKICAgICAgKiBUcnkgdG8gcGFyc2UgdGhpcyBtZXNzYWdlIGFzIGFuIGVtYWlsIGdhdGV3YXkgbWVzc2FnZQogICAgICAqIFRoZXJlIGFyZSB0d28gd2F5cyBzcGVjaWZpZWQgaW4gVFMgMjMuMDQwIFNlY3Rpb24gMy44IDoKLSAgICAgKiAgLSBTTVMgbWVzc2FnZSAibWF5IGhhdmUgaXRzIFRQLVBJRCBzZXQgZm9yIGludGVybmV0IGVsZWN0cm9uaWMgbWFpbCAtIE1UCisgICAgICogIC0gU01TIG1lc3NhZ2UgIm1heSBoYXZlIGl0cyBUUC1QSUQgc2V0IGZvciBJbnRlcm5ldCBlbGVjdHJvbmljIG1haWwgLSBNVAogICAgICAqIFNNUyBmb3JtYXQ6IFs8ZnJvbS1hZGRyZXNzPjxzcGFjZT5dPG1lc3NhZ2U+IC0gIkRlcGVuZGluZyBvbiB0aGUKICAgICAgKiBuYXR1cmUgb2YgdGhlIGdhdGV3YXksIHRoZSBkZXN0aW5hdGlvbi9vcmlnaW5hdGlvbiBhZGRyZXNzIGlzIGVpdGhlcgogICAgICAqIGRlcml2ZWQgZnJvbSB0aGUgY29udGVudCBvZiB0aGUgU01TIFRQLU9BIG9yIFRQLURBIGZpZWxkLCBvciB0aGUKICAgICAgKiBUUC1PQS9UUC1EQSBmaWVsZCBjb250YWlucyBhIGdlbmVyaWMgZ2F0ZXdheSBhZGRyZXNzIGFuZCB0aGUgdG8vZnJvbQogICAgICAqIGFkZHJlc3MgaXMgYWRkZWQgYXQgdGhlIGJlZ2lubmluZyBhcyBzaG93biBhYm92ZS4iICh3aGljaCBpcyBzdXBwb3J0ZWQgaGVyZSkKLSAgICAgKiAtIE11bHRpcGxlIGFkZHJlc2VzIHNlcGFyYXRlZCBieSBjb21tYXMsIG5vIHNwYWNlcywgU3ViamVjdCBmaWVsZCBkZWxpbWl0ZWQKKyAgICAgKiAtIE11bHRpcGxlIGFkZHJlc3NlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLCBubyBzcGFjZXMsIFN1YmplY3QgZmllbGQgZGVsaW1pdGVkCiAgICAgICogYnkgJygpJyBvciAnIyMnIGFuZCAnIycgU2VjdGlvbiA5LjIuMy4yNC4xMSAod2hpY2ggYXJlIE5PVCBzdXBwb3J0ZWQgaGVyZSkKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBleHRyYWN0RW1haWxBZGRyZXNzRnJvbU1lc3NhZ2VCb2R5KCkgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1RlbGVwaG9ueVByb3BlcnRpZXMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZWxlcGhvbnlQcm9wZXJ0aWVzLmphdmEKaW5kZXggYTExMzc4Ny4uMTM2ZDViMSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1RlbGVwaG9ueVByb3BlcnRpZXMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVsZXBob255UHJvcGVydGllcy5qYXZhCkBAIC00NSw3ICs0NSw3IEBACiAgICAgICogIENETUEgbmV0d29ya3MuCiAgICAgICovCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9PUEVSQVRPUl9BTFBIQSA9ICJnc20ub3BlcmF0b3IuYWxwaGEiOwotICAgIC8vVE9ETzogbW9zdCBvZiB0aGVzZSBwcm9wcmlldGllcyBhcmUgZ2VuZXJpYywgc3Vic3RpdHV0ZSBnc20uIHdpdGggcGhvbmUuIGJ1ZyAxODU2OTU5CisgICAgLy9UT0RPOiBtb3N0IG9mIHRoZXNlIHByb3BlcnRpZXMgYXJlIGdlbmVyaWMsIHN1YnN0aXR1dGUgZ3NtLiB3aXRoIHBob25lLiBidWcgMTg1Njk1OQogCiAgICAgLyoqIE51bWVyaWMgbmFtZSAoTUNDK01OQykgb2YgY3VycmVudCByZWdpc3RlcmVkIG9wZXJhdG9yLjxwPgogICAgICAqICBBdmFpbGFiaWxpdHk6IHdoZW4gcmVnaXN0ZXJlZCB0byBhIG5ldHdvcmsuIFJlc3VsdCBtYXkgYmUgdW5yZWxpYWJsZSBvbgpAQCAtODMsMTIgKzgzLDEyIEBACiAKICAgICAvKiogVGhlIE1DQytNTkMgKG1vYmlsZSBjb3VudHJ5IGNvZGUrbW9iaWxlIG5ldHdvcmsgY29kZSkgb2YgdGhlCiAgICAgICogIHByb3ZpZGVyIG9mIHRoZSBTSU0uIDUgb3IgNiBkZWNpbWFsIGRpZ2l0cy4KLSAgICAgKiAgQXZhaWxhYmxpdHk6IFNJTSBzdGF0ZSBtdXN0IGJlICJSRUFEWSIKKyAgICAgKiAgQXZhaWxhYmlsaXR5OiBTSU0gc3RhdGUgbXVzdCBiZSAiUkVBRFkiCiAgICAgICovCiAgICAgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9JQ0NfT1BFUkFUT1JfTlVNRVJJQyA9ICJnc20uc2ltLm9wZXJhdG9yLm51bWVyaWMiOwogCiAgICAgLyoqIFBST1BFUlRZX0lDQ19PUEVSQVRPUl9BTFBIQSBpcyBhbHNvIGtub3duIGFzIHRoZSBTUE4sIG9yIFNlcnZpY2UgUHJvdmlkZXIgTmFtZS4KLSAgICAgKiAgQXZhaWxhYmxpdHk6IFNJTSBzdGF0ZSBtdXN0IGJlICJSRUFEWSIKKyAgICAgKiAgQXZhaWxhYmlsaXR5OiBTSU0gc3RhdGUgbXVzdCBiZSAiUkVBRFkiCiAgICAgICovCiAgICAgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9JQ0NfT1BFUkFUT1JfQUxQSEEgPSAiZ3NtLnNpbS5vcGVyYXRvci5hbHBoYSI7CiAKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgICAgICAicm8udGVsZXBob255LmNhbGxfcmluZy5tdWx0aXBsZSI7CiAKICAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpLXNlY29uZHMgYmV0d2VlbiBDQUxMX1JJTkcgbm90aWZpY2F0aW9ucy4KKyAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIENBTExfUklORyBub3RpZmljYXRpb25zLgogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ0FMTF9SSU5HX0RFTEFZID0gInJvLnRlbGVwaG9ueS5jYWxsX3JpbmcuZGVsYXkiOwogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BUGhvbmUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCmluZGV4IDg0MGQzNjYuLjhkNzdmNzYgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCkBAIC01MTYsMTQgKzUxNiw2IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpIHsKLSAgICAgICAgYm9vbGVhbiBub0RhdGEgPSBtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YUVuYWJsZWQoKSAmJgotICAgICAgICAgICAgICAgIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSA9PSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwotICAgICAgICByZXR1cm4gIW5vRGF0YSAmJiBnZXRJY2NDYXJkKCkuZ2V0U3RhdGUoKSA9PSBJY2NDYXJkLlN0YXRlLlJFQURZICYmCi0gICAgICAgICAgICAgICAgZ2V0U2VydmljZVN0YXRlKCkuZ2V0U3RhdGUoKSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSAmJgotICAgICAgICAgICAgICAgIChtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSB8fCAhZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBNTUkgZnJvbSB0aGUgcGVuZGluZyBsaXN0IGFuZCBub3RpZmllcyByZWdpc3RyYW50cyB0aGF0CiAgICAgICogaXQgaXMgY29tcGxldGUuCkBAIC02MTQsNyArNjA2LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpIHsKKyAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoU3RyaW5nIGFwblR5cGUpIHsKICAgICAgICAgRGF0YVN0YXRlIHJldCA9IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAKICAgICAgICAgaWYgKG1TU1QgPT0gbnVsbCkgewpAQCAtNjI2LDYgKzYxOCw4IEBACiAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBvdXQgb2Ygc2VydmljZSwgb3BlbiBUQ1Agc29ja2V0cyBtYXkgc3RpbGwgd29yawogICAgICAgICAgICAgLy8gYnV0IG5vIGRhdGEgd2lsbCBmbG93CiAgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOworICAgICAgICB9IGVsc2UgaWYgKG1EYXRhQ29ubmVjdGlvbi5pc0FwblR5cGVFbmFibGVkKGFwblR5cGUpID09IGZhbHNlKSB7CisgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3dpdGNoIChtRGF0YUNvbm5lY3Rpb24uZ2V0U3RhdGUoKSkgewogICAgICAgICAgICAgICAgIGNhc2UgRkFJTEVEOgpAQCAtODc5LDI2ICs4NzMsNiBAQAogICAgICAgICBtUnVpbVJlY29yZHMuc2V0Vm9pY2VNZXNzYWdlV2FpdGluZygxLCBtd2kpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBDRE1BIE9UQSBTZXJ2aWNlIFByb3Zpc2lvbmluZyBuZWVkcyB0byBiZSBwZXJmb3JtZWQuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBib29sZWFuCi0gICAgbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkgewotICAgICAgICBTdHJpbmcgY2RtYU1pbiA9IGdldENkbWFNaW4oKTsKLSAgICAgICAgYm9vbGVhbiBuZWVkc1Byb3Zpc2lvbmluZzsKLSAgICAgICAgaWYgKGNkbWFNaW4gPT0gbnVsbCB8fCAoY2RtYU1pbi5sZW5ndGgoKSA8IDYpKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAibmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nOiBpbGxlZ2FsIGNkbWFNaW49JyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2RtYU1pbiArICInIGFzc3VtZSBwcm92aXNpb25pbmcgbmVlZGVkLiIpOwotICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSAoY2RtYU1pbi5lcXVhbHMoVU5BQ1RJVkFURURfTUlOX1ZBTFVFKQotICAgICAgICAgICAgICAgICAgICB8fCBjZG1hTWluLnN1YnN0cmluZygwLDYpLmVxdWFscyhVTkFDVElWQVRFRF9NSU4yX1ZBTFVFKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJ0ZXN0X2NkbWFfc2V0dXAiLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZzogcmV0PSIgKyBuZWVkc1Byb3Zpc2lvbmluZyk7Ci0gICAgICAgIHJldHVybiBuZWVkc1Byb3Zpc2lvbmluZzsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGl0RW1lcmdlbmN5Q2FsbGJhY2tNb2RlKCkgewogICAgICAgICBpZiAobVdha2VMb2NrLmlzSGVsZCgpKSB7CkBAIC0xMTkyLDYgKzExNjYsMjYgQEAKICAgICAgICAgbVNNUy5zZXRDZWxsQnJvYWRjYXN0Q29uZmlnKGNvbmZpZ1ZhbHVlc0FycmF5LCByZXNwb25zZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIE9UQSBTZXJ2aWNlIFByb3Zpc2lvbmluZyBuZWVkcyB0byBiZSBwZXJmb3JtZWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkgeworICAgICAgICBTdHJpbmcgY2RtYU1pbiA9IGdldENkbWFNaW4oKTsKKyAgICAgICAgYm9vbGVhbiBuZWVkc1Byb3Zpc2lvbmluZzsKKyAgICAgICAgaWYgKGNkbWFNaW4gPT0gbnVsbCB8fCAoY2RtYU1pbi5sZW5ndGgoKSA8IDYpKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAibmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nOiBpbGxlZ2FsIGNkbWFNaW49JyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2RtYU1pbiArICInIGFzc3VtZSBwcm92aXNpb25pbmcgbmVlZGVkLiIpOworICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSAoY2RtYU1pbi5lcXVhbHMoVU5BQ1RJVkFURURfTUlOX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICB8fCBjZG1hTWluLnN1YnN0cmluZygwLDYpLmVxdWFscyhVTkFDVElWQVRFRF9NSU4yX1ZBTFVFKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJ0ZXN0X2NkbWFfc2V0dXAiLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZzogcmV0PSIgKyBuZWVkc1Byb3Zpc2lvbmluZyk7CisgICAgICAgIHJldHVybiBuZWVkc1Byb3Zpc2lvbmluZzsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVM2ODNBX0ZFQVRVUkVfQ09ERSA9ICIqMjI4IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVM2ODNBX0ZFQVRVUkVfQ09ERV9OVU1fRElHSVRTID0gNDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVM2ODNBX1NZU19TRUxfQ09ERV9OVU1fRElHSVRTID0gMjsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQppbmRleCA5ZjJhNDRiLi41OTE4MjQ1IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCkBAIC0yMywxNCArMjMsMTIgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwotaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQuVHJhZmZpY1N0YXRzOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKQEAgLTUwLDggKzQ4LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRXZlbnRMb2dUYWdzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQXBuU2V0dGluZzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlJldHJ5TWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU2VydmljZVN0YXRlVHJhY2tlcjsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKQEAgLTMwNSw5ICszMDEsNDAgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRGF0YUFsbG93ZWQoKSB7Ci0gICAgICAgIGJvb2xlYW4gcm9hbWluZyA9IHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKTsKLSAgICAgICAgcmV0dXJuIGdldEFueURhdGFFbmFibGVkKCkgJiYgKCFyb2FtaW5nIHx8IGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkpICYmIG1NYXN0ZXJEYXRhRW5hYmxlZDsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RhdGFBbGxvd2VkKCkgeworICAgICAgICBpbnQgcHNTdGF0ZSA9IG1DZG1hUGhvbmUubVNTVC5nZXRDdXJyZW50Q2RtYURhdGFDb25uZWN0aW9uU3RhdGUoKTsKKyAgICAgICAgYm9vbGVhbiByb2FtaW5nID0gKHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSAmJiAhZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSk7CisgICAgICAgIGJvb2xlYW4gZGVzaXJlZFBvd2VyU3RhdGUgPSBtQ2RtYVBob25lLm1TU1QuZ2V0RGVzaXJlZFBvd2VyU3RhdGUoKTsKKworICAgICAgICBib29sZWFuIGFsbG93ZWQgPSAocHNTdGF0ZSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSAmJgorICAgICAgICAgICAgICAgIChwaG9uZS5tQ00uZ2V0UmFkaW9TdGF0ZSgpID09IENvbW1hbmRzSW50ZXJmYWNlLlJhZGlvU3RhdGUuTlZfUkVBRFkgfHwKKyAgICAgICAgICAgICAgICAgbUNkbWFQaG9uZS5tUnVpbVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpKSAmJgorICAgICAgICAgICAgICAgIChtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkgfHwKKyAgICAgICAgICAgICAgICAgcGhvbmUuZ2V0U3RhdGUoKSA9PSBQaG9uZS5TdGF0ZS5JRExFKSAmJgorICAgICAgICAgICAgICAgICFyb2FtaW5nICYmCisgICAgICAgICAgICAgICAgbU1hc3RlckRhdGFFbmFibGVkICYmCisgICAgICAgICAgICAgICAgZGVzaXJlZFBvd2VyU3RhdGUgJiYKKyAgICAgICAgICAgICAgICAhbVBlbmRpbmdSZXN0YXJ0UmFkaW8gJiYKKyAgICAgICAgICAgICAgICAhbUNkbWFQaG9uZS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKSk7CisgICAgICAgIGlmICghYWxsb3dlZCAmJiBEQkcpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSAiIjsKKyAgICAgICAgICAgIGlmIChwc1N0YXRlICE9IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFKSByZWFzb24gKz0gIiAtIHBzU3RhdGU9ICIgKyBwc1N0YXRlOworICAgICAgICAgICAgaWYgKHBob25lLm1DTS5nZXRSYWRpb1N0YXRlKCkgIT0gQ29tbWFuZHNJbnRlcmZhY2UuUmFkaW9TdGF0ZS5OVl9SRUFEWSAmJgorICAgICAgICAgICAgICAgICAgICAhbUNkbWFQaG9uZS5tUnVpbVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpKSB7CisgICAgICAgICAgICAgICAgcmVhc29uICs9ICIgLSByYWRpb1N0YXRlPSAiICsgcGhvbmUubUNNLmdldFJhZGlvU3RhdGUoKSArICIgLSBSVUlNIG5vdCBsb2FkZWQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBob25lLmdldFN0YXRlKCkgIT0gUGhvbmUuU3RhdGUuSURMRSAmJgorICAgICAgICAgICAgICAgICAgICBtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkpIHsKKyAgICAgICAgICAgICAgICByZWFzb24gKz0gIiAtIGNvbmN1cnJlbnRWb2ljZUFuZERhdGEgbm90IGFsbG93ZWQgYW5kIHN0YXRlPSAiICsgcGhvbmUuZ2V0U3RhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyb2FtaW5nKSByZWFzb24gKz0gIiAtIFJvYW1pbmciOworICAgICAgICAgICAgaWYgKCFtTWFzdGVyRGF0YUVuYWJsZWQpIHJlYXNvbiArPSAiIC0gbU1hc3RlckRhdGFFbmFibGVkPSBmYWxzZSI7CisgICAgICAgICAgICBpZiAoIWRlc2lyZWRQb3dlclN0YXRlKSByZWFzb24gKz0gIiAtIGRlc2lyZWRQb3dlclN0YXRlPSBmYWxzZSI7CisgICAgICAgICAgICBpZiAobVBlbmRpbmdSZXN0YXJ0UmFkaW8pIHJlYXNvbiArPSAiIC0gbVBlbmRpbmdSZXN0YXJ0UmFkaW89IHRydWUiOworICAgICAgICAgICAgaWYgKG1DZG1hUGhvbmUubmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkpIHJlYXNvbiArPSAiIC0gbmVlZHMgUHJvdmlzaW9uaW5nIjsKKyAgICAgICAgICAgIGxvZygiRGF0YSBub3QgYWxsb3dlZCBkdWUgdG8iICsgcmVhc29uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWxsb3dlZDsKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gdHJ5U2V0dXBEYXRhKFN0cmluZyByZWFzb24pIHsKQEAgLTMxNyw3ICszNDQsOCBAQAogICAgICAgICAgICAgLy8gQXNzdW1lIGRhdGEgaXMgY29ubmVjdGVkIG9uIHRoZSBzaW11bGF0b3IKICAgICAgICAgICAgIC8vIEZJWE1FICB0aGlzIGNhbiBiZSBpbXByb3ZlZAogICAgICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgdHJ1ZSk7CiAKICAgICAgICAgICAgIExvZy5pKExPR19UQUcsICIoZml4PykgV2UncmUgb24gdGhlIHNpbXVsYXRvcjsgYXNzdW1pbmcgZGF0YSBpcyBjb25uZWN0ZWQiKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMzI3LDM2ICszNTUsMTMgQEAKICAgICAgICAgYm9vbGVhbiByb2FtaW5nID0gcGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpOwogICAgICAgICBib29sZWFuIGRlc2lyZWRQb3dlclN0YXRlID0gbUNkbWFQaG9uZS5tU1NULmdldERlc2lyZWRQb3dlclN0YXRlKCk7CiAKLSAgICAgICAgaWYgKChzdGF0ZSA9PSBTdGF0ZS5JRExFIHx8IHN0YXRlID09IFN0YXRlLlNDQU5OSU5HKQotICAgICAgICAgICAgICAgICYmIChwc1N0YXRlID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFKQotICAgICAgICAgICAgICAgICYmICgocGhvbmUubUNNLmdldFJhZGlvU3RhdGUoKSA9PSBDb21tYW5kc0ludGVyZmFjZS5SYWRpb1N0YXRlLk5WX1JFQURZKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgbUNkbWFQaG9uZS5tUnVpbVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpKQotICAgICAgICAgICAgICAgICYmIChtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBob25lLmdldFN0YXRlKCkgPT0gUGhvbmUuU3RhdGUuSURMRSApCi0gICAgICAgICAgICAgICAgJiYgaXNEYXRhQWxsb3dlZCgpCi0gICAgICAgICAgICAgICAgJiYgZGVzaXJlZFBvd2VyU3RhdGUKLSAgICAgICAgICAgICAgICAmJiAhbVBlbmRpbmdSZXN0YXJ0UmFkaW8KLSAgICAgICAgICAgICAgICAmJiAhbUNkbWFQaG9uZS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKSkgewotCi0gICAgICAgICAgICByZXR1cm4gc2V0dXBEYXRhKHJlYXNvbik7Ci0KKyAgICAgICAgaWYgKChzdGF0ZSA9PSBTdGF0ZS5JRExFIHx8IHN0YXRlID09IFN0YXRlLlNDQU5OSU5HKSAmJgorICAgICAgICAgICAgICAgIGlzRGF0YUFsbG93ZWQoKSAmJiBnZXRBbnlEYXRhRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBib29sZWFuIHJldFZhbHVlID0gc2V0dXBEYXRhKHJlYXNvbik7CisgICAgICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCByZXRWYWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygidHJ5U2V0dXBEYXRhOiBOb3QgcmVhZHkgZm9yIGRhdGE6ICIgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGFTdGF0ZT0iICsgc3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAiIFBTIHN0YXRlPSIgKyBwc1N0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiByYWRpbyBzdGF0ZT0iICsgcGhvbmUubUNNLmdldFJhZGlvU3RhdGUoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcnVpbT0iICsgbUNkbWFQaG9uZS5tUnVpbVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBjb25jdXJyZW50Vm9pY2UmRGF0YT0iICsgbUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBwaG9uZVN0YXRlPSIgKyBwaG9uZS5nZXRTdGF0ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhRW5hYmxlZD0iICsgZ2V0QW55RGF0YUVuYWJsZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcm9hbWluZz0iICsgcm9hbWluZyArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YU9uUm9hbWluZ0VuYWJsZT0iICsgZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgZGVzaXJlZFBvd2VyU3RhdGU9IiArIGRlc2lyZWRQb3dlclN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiBQZW5kaW5nUmVzdGFydFJhZGlvPSIgKyBtUGVuZGluZ1Jlc3RhcnRSYWRpbyArCi0gICAgICAgICAgICAgICAgICAgICIgTWFzdGVyRGF0YUVuYWJsZWQ9IiArIG1NYXN0ZXJEYXRhRW5hYmxlZCArCi0gICAgICAgICAgICAgICAgICAgICIgbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nPSIgKyBtQ2RtYVBob25lLm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIGZhbHNlKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTM4Miw2ICszODcsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuRElTQ09OTkVDVElORyk7CisgICAgICAgIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkocmVhc29uKTsKIAogICAgICAgICBib29sZWFuIG5vdGlmaWNhdGlvbkRlZmVycmVkID0gZmFsc2U7CiAgICAgICAgIGZvciAoRGF0YUNvbm5lY3Rpb24gY29ubiA6IGRhdGFDb25uZWN0aW9uTGlzdCkgewpAQCAtNDQwLDEzICs0NDYsMTMgQEAKICAgICAgICAgY29ubi5jb25uZWN0KG1zZywgbUFjdGl2ZUFwbik7CiAKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuSU5JVElORyk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBub3RpZnlEZWZhdWx0RGF0YShTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIHNldFN0YXRlKFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKICAgICAgICAgbVJldHJ5TWdyLnJlc2V0UmV0cnlDb3VudCgpOwogICAgIH0KQEAgLTYyMiwxMiArNjI4LDEzIEBACiAKICAgICBwcml2YXRlIHZvaWQgbm90aWZ5Tm9EYXRhKEZhaWxDYXVzZSBsYXN0RmFpbENhdXNlQ29kZSkgewogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5GQUlMRUQpOworICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KG51bGwpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBnb3RvSWRsZUFuZE5vdGlmeURhdGFDb25uZWN0aW9uKFN0cmluZyByZWFzb24pIHsKICAgICAgICAgaWYgKERCRykgbG9nKCJnb3RvSWRsZUFuZE5vdGlmeURhdGFDb25uZWN0aW9uOiByZWFzb249IiArIHJlYXNvbik7CiAgICAgICAgIHNldFN0YXRlKFN0YXRlLklETEUpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICBtQWN0aXZlQXBuID0gbnVsbDsKICAgICB9CiAKQEAgLTY4NywxMSArNjk0LDEzIEBACiAgICAgICAgICAgICAvLyBBc3N1bWUgZGF0YSBpcyBjb25uZWN0ZWQgb24gdGhlIHNpbXVsYXRvcgogICAgICAgICAgICAgLy8gRklYTUUgIHRoaXMgY2FuIGJlIGltcHJvdmVkCiAgICAgICAgICAgICBzZXRTdGF0ZShTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsKTsKIAogICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgIldlJ3JlIG9uIHRoZSBzaW11bGF0b3I7IGFzc3VtaW5nIGRhdGEgaXMgY29ubmVjdGVkIik7CiAgICAgICAgIH0KIAorICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KG51bGwpOworCiAgICAgICAgIGlmIChzdGF0ZSAhPSBTdGF0ZS5JRExFKSB7CiAgICAgICAgICAgICBjbGVhblVwQ29ubmVjdGlvbih0cnVlLCBudWxsKTsKICAgICAgICAgfQpAQCAtNzIzLDYgKzczMiw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoYXIuZXhjZXB0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIG1MaW5rUHJvcGVydGllcyA9IGdldExpbmtQcm9wZXJ0aWVzKG1BY3RpdmVEYXRhQ29ubmVjdGlvbik7CisKICAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgaXMgc2V0dXAKICAgICAgICAgICAgIG5vdGlmeURlZmF1bHREYXRhKHJlYXNvbik7CiAgICAgICAgIH0gZWxzZSB7CkBAIC03NjIsNyArNzczLDcgQEAKICAgICAgICAgICAgIG9uUmVzdGFydFJhZGlvKCk7CiAgICAgICAgIH0KIAotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICBtQWN0aXZlQXBuID0gbnVsbDsKICAgICAgICAgaWYgKHJldHJ5QWZ0ZXJEaXNjb25uZWN0ZWQocmVhc29uKSkgewogICAgICAgICAgIHRyeVNldHVwRGF0YShyZWFzb24pOwpAQCAtNzg5LDcgKzgwMCw4IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgb25Wb2ljZUNhbGxTdGFydGVkKCkgewogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEICYmICFtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkpIHsKICAgICAgICAgICAgIHN0b3BOZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfU1RBUlRFRCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9TVEFSVEVEKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkoUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfU1RBUlRFRCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTgwMCwxMSArODEyLDEyIEBACiAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQpIHsKICAgICAgICAgICAgIGlmICghbUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpKSB7CiAgICAgICAgICAgICAgICAgc3RhcnROZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX0VOREVEKTsKKyAgICAgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9FTkRFRCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIGNsZWFuIHNsYXRlIGFmdGVyIGNhbGwgZW5kLgogICAgICAgICAgICAgICAgIHJlc2V0UG9sbFN0YXRzKCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX0VOREVEKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1SZXRyeU1nci5yZXNldFJldHJ5Q291bnQoKTsKICAgICAgICAgICAgIC8vIGluIGNhc2UgZGF0YSBzZXR1cCB3YXMgYXR0ZW1wdGVkIHdoZW4gd2Ugd2VyZSBvbiBhIHZvaWNlIGNhbGwKQEAgLTgzOCw3ICs4NTEsNyBAQAogICAgIHByaXZhdGUgdm9pZCBvbkNkbWFEYXRhRGV0YWNoZWQoKSB7CiAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQpIHsKICAgICAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9DRE1BX0RBVEFfREVUQUNIRUQpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0NETUFfREFUQV9ERVRBQ0hFRCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuRkFJTEVEKSB7CiAgICAgICAgICAgICAgICAgY2xlYW5VcENvbm5lY3Rpb24oZmFsc2UsIFBob25lLlJFQVNPTl9DRE1BX0RBVEFfREVUQUNIRUQpOwpAQCAtOTQ5LDM0ICs5NjIsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlRGF0YUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVEYXRhQ29ubmVjdGlvbi5nZXRJbnRlcmZhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldElwQWRkcmVzcyhTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICBpZiAobUFjdGl2ZURhdGFDb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtQWN0aXZlRGF0YUNvbm5lY3Rpb24uZ2V0SXBBZGRyZXNzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRHYXRld2F5KFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlRGF0YUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVEYXRhQ29ubmVjdGlvbi5nZXRHYXRld2F5QWRkcmVzcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXREbnNTZXJ2ZXJzKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlRGF0YUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVEYXRhQ29ubmVjdGlvbi5nZXREbnNTZXJ2ZXJzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCiAgICAgcHVibGljIEFycmF5TGlzdDxEYXRhQ29ubmVjdGlvbj4gZ2V0QWxsRGF0YUNvbm5lY3Rpb25zKCkgewogICAgICAgICByZXR1cm4gZGF0YUNvbm5lY3Rpb25MaXN0OwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTTVNEaXNwYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU01TRGlzcGF0Y2hlci5qYXZhCmluZGV4IDhlYWY0YTIuLjUzZDBmMjAgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTTVNEaXNwYXRjaGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNNU0Rpc3BhdGNoZXIuamF2YQpAQCAtNzAsNiArNzAsNyBAQAogICAgICAqIEBwYXJhbSBhciBBc3luY1Jlc3VsdCBwYXNzZWQgaW50byB0aGUgbWVzc2FnZSBoYW5kbGVyLiAgYXIucmVzdWx0IHNob3VsZAogICAgICAqICAgICAgICAgICBiZSBhIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHN0YXR1cyByZXBvcnQgUERVLCBhcyBBU0NJSSBoZXguCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU3RhdHVzUmVwb3J0KEFzeW5jUmVzdWx0IGFyKSB7CiAgICAgICAgIExvZy5kKFRBRywgImhhbmRsZVN0YXR1c1JlcG9ydCBpcyBhIHNwZWNpYWwgR1NNIGZ1bmN0aW9uLCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGluIENETUEhIik7CiAgICAgfQpAQCAtOTIsNiArOTMsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGludCBkaXNwYXRjaE1lc3NhZ2UoU21zTWVzc2FnZUJhc2Ugc21zYikgewogCiAgICAgICAgIC8vIElmIHNtcyBpcyBudWxsLCBtZWFucyB0aGVyZSB3YXMgYSBwYXJzaW5nIGVycm9yLgpAQCAtMzM1LDYgKzMzNyw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kRGF0YShTdHJpbmcgZGVzdEFkZHIsIFN0cmluZyBzY0FkZHIsIGludCBkZXN0UG9ydCwKICAgICAgICAgICAgIGJ5dGVbXSBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgU21zTWVzc2FnZS5TdWJtaXRQZHUgcGR1ID0gU21zTWVzc2FnZS5nZXRTdWJtaXRQZHUoCkBAIC0zNDMsNiArMzQ2LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRUZXh0KFN0cmluZyBkZXN0QWRkciwgU3RyaW5nIHNjQWRkciwgU3RyaW5nIHRleHQsCiAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgU21zTWVzc2FnZS5TdWJtaXRQZHUgcGR1ID0gU21zTWVzc2FnZS5nZXRTdWJtaXRQZHUoCkBAIC0zNTEsNiArMzU1LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRNdWx0aXBhcnRUZXh0KFN0cmluZyBkZXN0QWRkciwgU3RyaW5nIHNjQWRkciwKICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHBhcnRzLCBBcnJheUxpc3Q8UGVuZGluZ0ludGVudD4gc2VudEludGVudHMsCiAgICAgICAgICAgICBBcnJheUxpc3Q8UGVuZGluZ0ludGVudD4gZGVsaXZlcnlJbnRlbnRzKSB7CkBAIC0zNTksNyArMzY0LDcgQEAKICAgICAgICAgICogVE9ETyhjbGVhbnVwKTogVGhlcmUgaXMgbm8gcmVhbCBjb2RlIGRpZmZlcmVuY2UgYmV0d2VlbgogICAgICAgICAgKiB0aGlzIGFuZCB0aGUgR1NNIHZlcnNpb24sIGFuZCBoZW5jZSBpdCBzaG91bGQgYmUgbW92ZWQgdG8KICAgICAgICAgICogdGhlIGJhc2UgY2xhc3Mgb3IgY29uc29saWRhdGVkIHNvbWVob3csIHByb3ZpZGVkIGNhbGxpbmcKLSAgICAgICAgICogdGhlIHByb3BlciBzdWJtaXRwZHUgc3R1ZmYgY2FuIGJlIGFycmFuZ2VkLgorICAgICAgICAgKiB0aGUgcHJvcGVyIHN1Ym1pdCBwZHUgc3R1ZmYgY2FuIGJlIGFycmFuZ2VkLgogICAgICAgICAgKi8KIAogICAgICAgICBpbnQgcmVmTnVtYmVyID0gZ2V0TmV4dENvbmNhdGVuYXRlZFJlZigpICYgMHgwMEZGOwpAQCAtNDMyLDggKzQzNyw5IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kU21zKFNtc1RyYWNrZXIgdHJhY2tlcikgewotICAgICAgICBIYXNoTWFwIG1hcCA9IHRyYWNrZXIubURhdGE7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IHRyYWNrZXIubURhdGE7CiAKICAgICAgICAgLy8gYnl0ZSBzbXNjW10gPSAoYnl0ZVtdKSBtYXAuZ2V0KCJzbXNjIik7ICAvLyB1bnVzZWQgZm9yIENETUEKICAgICAgICAgYnl0ZSBwZHVbXSA9IChieXRlW10pIG1hcC5nZXQoInBkdSIpOwpAQCAtNDQ0LDExICs0NTAsMTMgQEAKICAgICB9CiAKICAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kTXVsdGlwYXJ0U21zIChTbXNUcmFja2VyIHRyYWNrZXIpIHsKICAgICAgICAgTG9nLmQoVEFHLCAiVE9ETzogQ2RtYVNNU0Rpc3BhdGNoZXIuc2VuZE11bHRpcGFydFNtcyBub3QgaW1wbGVtZW50ZWQiKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGFja25vd2xlZGdlTGFzdEluY29taW5nU21zKGJvb2xlYW4gc3VjY2VzcywgaW50IHJlc3VsdCwgTWVzc2FnZSByZXNwb25zZSl7CiAgICAgICAgIC8vIEZJWE1FIHVuaXQgdGVzdCBsZWF2ZXMgY20gPT0gbnVsbC4gdGhpcyBzaG91bGQgY2hhbmdlCiAKQEAgLTQ2OSwxNiArNDc3LDE5IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZUNlbGxCcm9hZGNhc3RTbXMoaW50IGFjdGl2YXRlLCBNZXNzYWdlIHJlc3BvbnNlKSB7CiAgICAgICAgIG1DbS5zZXRDZG1hQnJvYWRjYXN0QWN0aXZhdGlvbigoYWN0aXZhdGUgPT0gMCksIHJlc3BvbnNlKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGdldENlbGxCcm9hZGNhc3RTbXNDb25maWcoTWVzc2FnZSByZXNwb25zZSkgewogICAgICAgICBtQ20uZ2V0Q2RtYUJyb2FkY2FzdENvbmZpZyhyZXNwb25zZSk7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDZWxsQnJvYWRjYXN0Q29uZmlnKGludFtdIGNvbmZpZ1ZhbHVlc0FycmF5LCBNZXNzYWdlIHJlc3BvbnNlKSB7CiAgICAgICAgIG1DbS5zZXRDZG1hQnJvYWRjYXN0Q29uZmlnKGNvbmZpZ1ZhbHVlc0FycmF5LCByZXNwb25zZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKaW5kZXggMmNhZDZjYy4uNWQ0ZGM1OCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCkBAIC0xMTE5LDcgKzExMTksNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGhhc0NkbWFEYXRhQ29ubmVjdGlvbkNoYW5nZWQgfHwgaGFzTmV0d29ya1R5cGVDaGFuZ2VkKSB7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsKTsKKyAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwsIG51bGwpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGhhc1JvYW1pbmdPbikgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKaW5kZXggY2ZjZmQ5OC4uYTlkZjM3NSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCkBAIC02Nyw4ICs2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGFyID0gKEFzeW5jUmVzdWx0KW1zZy5vYmo7CiAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhci5leGNlcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TbXMgID0gKExpc3Q8U21zUmF3RGF0YT4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZFZhbGlkUmF3RGF0YSgoQXJyYXlMaXN0PGJ5dGVbXT4pIGFyLnJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNtcyA9IGJ1aWxkVmFsaWRSYXdEYXRhKChBcnJheUxpc3Q8Ynl0ZVtdPikgYXIucmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoREJHKSBsb2coIkNhbm5vdCBsb2FkIFNtcyByZWNvcmRzIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TbXMgIT0gbnVsbCkKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1Ntc01lc3NhZ2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1Ntc01lc3NhZ2UuamF2YQppbmRleCAwZjNiOGZmLi5lOTViMmY5IDEwMDc1NQotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9TbXNNZXNzYWdlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvU21zTWVzc2FnZS5qYXZhCkBAIC0xOCwxMSArMTgsOCBAQAogCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuVGltZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkVuY29kZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY1V0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlOwpAQCAtMzMsNyArMzAsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hLnNtcy5Vc2VyRGF0YTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhleER1bXA7CiAKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwpAQCAtNTgsNyArNTQsNyBAQAogLyoqCiAgKiBUT0RPKGNsZWFudXApOiBpbnRlcm5hbGx5IHJldHVybmluZyBudWxsIGluIG1hbnkgcGxhY2VzIG1ha2VzCiAgKiBkZWJ1Z2dpbmcgdmVyeSBoYXJkIChhbW9uZyBtYW55IG90aGVyIHJlYXNvbnMpIGFuZCBzaG91bGQgYmUgbWFkZQotICogbW9yZSBtZWFuaW5nZnVsIChyZXBsYWNlZCB3aXRoIGV4ZWNwdGlvbnMgZm9yIGV4YW1wbGUpLiAgTnVsbAorICogbW9yZSBtZWFuaW5nZnVsIChyZXBsYWNlZCB3aXRoIGV4Y2VwdGlvbnMgZm9yIGV4YW1wbGUpLiAgTnVsbAogICogcmV0dXJucyBzaG91bGQgb25seSBvY2N1ciBhdCB0aGUgdmVyeSBvdXRzaWRlIG9mIHRoZSBtb2R1bGUvY2xhc3MKICAqIHNjb3BlLgogICovCkBAIC02MTQsNyArNjEwLDcgQEAKICAgICAgKiBpbmNyZW1lbnRpbmcgd2l0aGluIHRoZSByYW5nZSAxLi42NTUzNSByZW1lbWJlcmluZyB0aGUgc3RhdGUKICAgICAgKiB2aWEgYSBwZXJzaXN0ZW50IHN5c3RlbSBwcm9wZXJ0eS4gIChTZWUgQy5TMDAxNS1CLCB2Mi4wLAogICAgICAqIDQuMy4xLjUpIFNpbmNlIHRoaXMgcm91dGluZSBpcyBleHBlY3RlZCB0byBiZSBhY2Nlc3NlZCB2aWEgdmlhCi0gICAgICogYmluZGVyLWNhbGwsIGFuZCBoZW5jZSBzaG91bGQgYmUgdGhyZWFkc2FmZSwgaXQgaGFzIGJlZW4KKyAgICAgKiBiaW5kZXItY2FsbCwgYW5kIGhlbmNlIHNob3VsZCBiZSB0aHJlYWQtc2FmZSwgaXQgaGFzIGJlZW4KICAgICAgKiBzeW5jaHJvbml6ZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIGludCBnZXROZXh0TWVzc2FnZUlkKCkgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0JlYXJlckRhdGEuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9CZWFyZXJEYXRhLmphdmEKaW5kZXggYWI3OWZlOS4uY2YwNmRhYiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0JlYXJlckRhdGEuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvQmVhcmVyRGF0YS5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTUFYX1VTRVJfREFUQV9CWVRFU19XSVRIX0hFQURFUjsKIAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUludEFycmF5OwogCiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZTsKIApAQCAtMzAsMTAgKzI5LDggQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkdzbUFscGhhYmV0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zLlVzZXJEYXRhOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZS5UZXh0RW5jb2RpbmdEZXRhaWxzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5IZXhEdW1wOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQml0d2lzZUlucHV0U3RyZWFtOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQml0d2lzZU91dHB1dFN0cmVhbTsKIApAQCAtNDUsMTMgKzQyLDEzIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExPR19UQUcgPSAiU01TIjsKIAogICAgIC8qKgotICAgICAqIEJlYXJlciBEYXRhIFN1YnBhcmFtZXRlciBJbmRlbnRpZmllcnMKKyAgICAgKiBCZWFyZXIgRGF0YSBTdWJwYXJhbWV0ZXIgSWRlbnRpZmllcnMKICAgICAgKiAoU2VlIDNHUFAyIEMuUzAwMTUtQiwgdjIuMCwgdGFibGUgNC41LTEpCiAgICAgICogTk9URTogQ29tbWVudGVkIHN1YnBhcmFtZXRlciB0eXBlcyBhcmUgbm90IGltcGxlbWVudGVkLgogICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fTUVTU0FHRV9JREVOVElGSUVSICAgICAgICAgICAgICAgPSAweDAwOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVVNFUl9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAxOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVVNFUl9SRVBPTlNFX0NPREUgICAgICAgICAgICAgICAgPSAweDAyOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVVNFUl9SRVNQT05TRV9DT0RFICAgICAgICAgICAgICAgPSAweDAyOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fTUVTU0FHRV9DRU5URVJfVElNRV9TVEFNUCAgICAgICAgPSAweDAzOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVkFMSURJVFlfUEVSSU9EX0FCU09MVVRFICAgICAgICAgPSAweDA0OwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVkFMSURJVFlfUEVSSU9EX1JFTEFUSVZFICAgICAgICAgPSAweDA1OwpAQCAtNjk3LDcgKzY5NCw3IEBACiAgICAgLyoKICAgICAgKiBUT0RPKGNsZWFudXApOiBDZG1hU21zQWRkcmVzcyBlbmNvZGluZyBzaG91bGQgbWFrZSB1c2Ugb2YKICAgICAgKiBDZG1hU21zQWRkcmVzcy5wYXJzZSBwcm92aWRlZCB0aGF0IERUTUYgZW5jb2RpbmcgaXMgdW5pZmllZCwKLSAgICAgKiBhbmQgdGhlIGRpZmZlcmVuY2UgaW4gNGJpdCB2cyA4Yml0IGlzIHJlc29sdmVkLgorICAgICAqIGFuZCB0aGUgZGlmZmVyZW5jZSBpbiA0LWJpdCB2cy4gOC1iaXQgaXMgcmVzb2x2ZWQuCiAgICAgICovCiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGVuY29kZUNkbWFTbXNBZGRyZXNzKENkbWFTbXNBZGRyZXNzIGFkZHIpIHRocm93cyBDb2RpbmdFeGNlcHRpb24gewpAQCAtODA1LDYgKzgwMiw3IEBACiAgICAgICogKFNlZSAzR1BQMiBDLlIxMDAxLUYsIHYxLjAsIHNlY3Rpb24gNC41IGZvciBsYXlvdXQgZGV0YWlscykKICAgICAgKgogICAgICAqIEBwYXJhbSBiRGF0YSBhbiBpbnN0YW5jZSBvZiBCZWFyZXJEYXRhLgorICAgICAqCiAgICAgICogQHJldHVybiBieXRlIGFycmF5IG9mIHJhdyBlbmNvZGVkIFNNUyBiZWFyZXIgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGUoQmVhcmVyRGF0YSBiRGF0YSkgewpAQCAtOTE1LDcgKzkxMyw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlY29kZVV0ZjE2KGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbnVtRmllbGRzKQogICAgICAgICB0aHJvd3MgQ29kaW5nRXhjZXB0aW9uCiAgICAgewotICAgICAgICAvLyBTdGFydCByZWFkaW5nIGZyb20gdGhlIG5leHQgMTYtYml0IGFsaWduZWQgYm91bmRyeSBhZnRlciBvZmZzZXQuCisgICAgICAgIC8vIFN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgbmV4dCAxNi1iaXQgYWxpZ25lZCBib3VuZGFyeSBhZnRlciBvZmZzZXQuCiAgICAgICAgIGludCBwYWRkaW5nID0gb2Zmc2V0ICUgMjsKICAgICAgICAgbnVtRmllbGRzIC09IChvZmZzZXQgKyBwYWRkaW5nKSAvIDI7CiAgICAgICAgIHRyeSB7CkBAIC05NjEsNyArOTU5LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVjb2RlN2JpdEdzbShieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IG51bUZpZWxkcykKICAgICAgICAgdGhyb3dzIENvZGluZ0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgLy8gU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBuZXh0IDctYml0IGFsaWduZWQgYm91bmRyeSBhZnRlciBvZmZzZXQuCisgICAgICAgIC8vIFN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgbmV4dCA3LWJpdCBhbGlnbmVkIGJvdW5kYXJ5IGFmdGVyIG9mZnNldC4KICAgICAgICAgaW50IG9mZnNldEJpdHMgPSBvZmZzZXQgKiA4OwogICAgICAgICBpbnQgb2Zmc2V0U2VwdGV0cyA9IChvZmZzZXRCaXRzICsgNikgLyA3OwogICAgICAgICBudW1GaWVsZHMgLT0gb2Zmc2V0U2VwdGV0czsKQEAgLTE1NTQsNyArMTU1Miw3IEBACiAgICAgICAgICAgICAgICAgY2FzZSBTVUJQQVJBTV9VU0VSX0RBVEE6CiAgICAgICAgICAgICAgICAgICAgIGRlY29kZVN1Y2Nlc3MgPSBkZWNvZGVVc2VyRGF0YShiRGF0YSwgaW5TdHJlYW0pOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNVQlBBUkFNX1VTRVJfUkVQT05TRV9DT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgU1VCUEFSQU1fVVNFUl9SRVNQT05TRV9DT0RFOgogICAgICAgICAgICAgICAgICAgICBkZWNvZGVTdWNjZXNzID0gZGVjb2RlVXNlclJlc3BvbnNlQ29kZShiRGF0YSwgaW5TdHJlYW0pOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNVQlBBUkFNX1JFUExZX09QVElPTjoKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9TbXNFbnZlbG9wZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL1Ntc0VudmVsb3BlLmphdmEKaW5kZXggMGRjYWNjMS4uYTY3MzI3YSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL1Ntc0VudmVsb3BlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL1Ntc0VudmVsb3BlLmphdmEKQEAgLTE3LDcgKzE3LDcgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zOwogCiAKLXB1YmxpYyBmaW5hbCBjbGFzcyBTbXNFbnZlbG9wZXsKK3B1YmxpYyBmaW5hbCBjbGFzcyBTbXNFbnZlbG9wZSB7CiAgICAgLyoqCiAgICAgICogTWVzc2FnZSBUeXBlcwogICAgICAqIChTZWUgM0dQUDIgQy5TMDAxNS1CIDMuNC4xKQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZS5qYXZhCmluZGV4IDY2NjU2MzIuLjczMzFlMDUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lLmphdmEKQEAgLTI5MSw3ICsyOTEsNyBAQAogICAgICAgICByZXR1cm4gbVBlbmRpbmdNTUlzOwogICAgIH0KIAotICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpIHsKKyAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoU3RyaW5nIGFwblR5cGUpIHsKICAgICAgICAgRGF0YVN0YXRlIHJldCA9IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAKICAgICAgICAgaWYgKG1TU1QgPT0gbnVsbCkgewpAQCAtMzA0LDYgKzMwNCw4IEBACiAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBvdXQgb2Ygc2VydmljZSwgb3BlbiBUQ1Agc29ja2V0cyBtYXkgc3RpbGwgd29yawogICAgICAgICAgICAgLy8gYnV0IG5vIGRhdGEgd2lsbCBmbG93CiAgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOworICAgICAgICB9IGVsc2UgaWYgKG1EYXRhQ29ubmVjdGlvbi5pc0FwblR5cGVFbmFibGVkKGFwblR5cGUpID09IGZhbHNlKSB7CisgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwogICAgICAgICB9IGVsc2UgeyAvKiBtU1NULmdwcnNTdGF0ZSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSAqLwogICAgICAgICAgICAgc3dpdGNoIChtRGF0YUNvbm5lY3Rpb24uZ2V0U3RhdGUoKSkgewogICAgICAgICAgICAgICAgIGNhc2UgRkFJTEVEOgpAQCAtNDA1LDggKzQwNyw4IEBACiAgICAgfQogCiAgICAgLypwYWNrYWdlKi8gdm9pZAotICAgIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24pIHsKLSAgICAgICAgbU5vdGlmaWVyLm5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKHRoaXMsIHJlYXNvbik7CisgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgbU5vdGlmaWVyLm5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKHRoaXMsIHJlYXNvbiwgYXBuVHlwZSk7CiAgICAgfQogCiAgICAgLypwYWNrYWdlKi8gdm9pZApAQCAtMTA5NSwyNyArMTA5Nyw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIG9ubHkgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaCB3ZSByZXBvcnQgdGhhdCBkYXRhIGNvbm5lY3Rpdml0eSBpcyBub3QKLSAgICAgKiBwb3NzaWJsZSBhcmUKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkRhdGEgcm9hbWluZyBpcyBkaXNhbGxvd2VkIGFuZCB3ZSBhcmUgcm9hbWluZy48L2xpPgotICAgICAqIDxsaT5UaGUgY3VycmVudCBkYXRhIHN0YXRlIGlzIHtAY29kZSBESVNDT05ORUNURUR9IGZvciBhIHJlYXNvbiBvdGhlciB0aGFuCi0gICAgICogaGF2aW5nIGV4cGxpY2l0bHkgZGlzYWJsZWQgY29ubmVjdGl2aXR5LiBJbiBvdGhlciB3b3JkcywgZGF0YSBpcyBub3QgYXZhaWxhYmxlCi0gICAgICogYmVjYXVzZSB0aGUgcGhvbmUgaXMgb3V0IG9mIGNvdmVyYWdlIG9yIHNvbWUgbGlrZSByZWFzb24uPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGRhdGEgY29ubmVjdGl2aXR5IGlzIHBvc3NpYmxlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpIHsKLSAgICAgICAgLy8gVE9ETzogQ3VycmVudGx5IGNoZWNrcyBpZiBhbnkgR1BSUyBjb25uZWN0aW9uIGlzIGFjdGl2ZS4gU2hvdWxkIGl0IG9ubHkKLSAgICAgICAgLy8gY2hlY2sgZm9yICJkZWZhdWx0Ij8KLSAgICAgICAgYm9vbGVhbiBub0RhdGEgPSBtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YUVuYWJsZWQoKSAmJgotICAgICAgICAgICAgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpID09IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7Ci0gICAgICAgIHJldHVybiAhbm9EYXRhICYmIGdldEljY0NhcmQoKS5nZXRTdGF0ZSgpID09IFNpbUNhcmQuU3RhdGUuUkVBRFkgJiYKLSAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlU3RhdGUoKS5nZXRTdGF0ZSgpID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFICYmCi0gICAgICAgICAgICAobURhdGFDb25uZWN0aW9uLmdldERhdGFPblJvYW1pbmdFbmFibGVkKCkgfHwgIWdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gTU1JIGZyb20gdGhlIHBlbmRpbmcgbGlzdCBhbmQgbm90aWZpZXMKICAgICAgKiByZWdpc3RyYW50cyB0aGF0IGl0IGlzIGNvbXBsZXRlLgogICAgICAqIEBwYXJhbSBtbWkgTU1JIHRoYXQgaXMgZG9uZQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvbi5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvbi5qYXZhCmluZGV4IDA5ZDQ2ZGQuLjE1NzJmMDkgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb24uamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uLmphdmEKQEAgLTE4MCw4ICsxODAsOCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEbnNPayhTdHJpbmdbXSBkb21haW5OYW1lU2VydmVycykgewotICAgICAgICBpZiAoTlVMTF9JUC5lcXVhbHMoZG5zU2VydmVyc1swXSkgJiYgTlVMTF9JUC5lcXVhbHMoZG5zU2VydmVyc1sxXSkKLSAgICAgICAgICAgICAgICAgICAgJiYgISgoR1NNUGhvbmUpIHBob25lKS5pc0Ruc0NoZWNrRGlzYWJsZWQoKSkgeworICAgICAgICBpZiAoTlVMTF9JUC5lcXVhbHMoZG9tYWluTmFtZVNlcnZlcnNbMF0pICYmIE5VTExfSVAuZXF1YWxzKGRvbWFpbk5hbWVTZXJ2ZXJzWzFdKQorICAgICAgICAgICAgICAgICYmICEoKEdTTVBob25lKSBwaG9uZSkuaXNEbnNDaGVja0Rpc2FibGVkKCkpIHsKICAgICAgICAgICAgIC8vIFdvcmsgYXJvdW5kIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgUU1JIGRvZXMgbm90IGZpbGwgaW4gRE5TOgogICAgICAgICAgICAgLy8gRGVhY3RpdmF0ZSBQRFAgYW5kIGxldCBEYXRhQ29ubmVjdGlvblRyYWNrZXIgcmV0cnkuCiAgICAgICAgICAgICAvLyBEbyBub3QgYXBwbHkgdGhlIHJhY2UgY29uZGl0aW9uIHdvcmthcm91bmQgZm9yIE1NUyBBUE4KQEAgLTE4OSw2ICsxODksOSBAQAogICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBBUE4gd2lsbCBub3QgYmUgcmVzdG9yZWQgYW55bW9yZS4KICAgICAgICAgICAgIGlmICghYXBuLnR5cGVzWzBdLmVxdWFscyhQaG9uZS5BUE5fVFlQRV9NTVMpCiAgICAgICAgICAgICAgICAgfHwgIWlzSXBBZGRyZXNzKGFwbi5tbXNQcm94eSkpIHsKKyAgICAgICAgICAgICAgICBsb2coU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJpc0Ruc09rOiByZXR1cm4gZmFsc2UgYXBuLnR5cGVzWzBdPSVzIEFQTl9UWVBFX01NUz0lcyBpc0lwQWRkcmVzcyglcyk9JXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXBuLnR5cGVzWzBdLCBQaG9uZS5BUE5fVFlQRV9NTVMsIGFwbi5tbXNQcm94eSwgaXNJcEFkZHJlc3MoYXBuLm1tc1Byb3h5KSkpOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKaW5kZXggZjZkNDQ5MS4uNDQxNDQ2MCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCkBAIC0yNywxNSArMjcsMTQgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5JQ29ubmVjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Qcm94eVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVHJhZmZpY1N0YXRzOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CkBAIC01OCw2ICs1Nyw4IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkRhdGFDb25uZWN0aW9uLkZhaWxDYXVzZTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogLyoqCkBAIC0zODgsMTIgKzM4OSw2IEBACiAgICAgICAgIHJldHVybiBwZHBzOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RhdGFBbGxvd2VkKCkgewotICAgICAgICBib29sZWFuIHJvYW1pbmcgPSBwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCk7Ci0gICAgICAgIHJldHVybiBnZXRBbnlEYXRhRW5hYmxlZCgpICYmICghcm9hbWluZyB8fCBnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpKSAmJgotICAgICAgICAgICAgICAgIG1NYXN0ZXJEYXRhRW5hYmxlZDsKLSAgICB9Ci0KICAgICAvLyoqKioqKiBDYWxsZWQgZnJvbSBTZXJ2aWNlU3RhdGVUcmFja2VyCiAgICAgLyoqCiAgICAgICogSW52b2tlZCB3aGVuIFNlcnZpY2VTdGF0ZVRyYWNrZXIgb2JzZXJ2ZXMgYSB0cmFuc2l0aW9uIGZyb20gR1BSUwpAQCAtNDA1LDEzICs0MDAsMTMgQEAKICAgICAgICAgICogd2hlbiBHUFJTIGRldGFjaGVzLCBidXQgd2Ugc2hvdWxkIHN0b3AgdGhlIG5ldHdvcmsgcG9sbGluZy4KICAgICAgICAgICovCiAgICAgICAgIHN0b3BOZXRTdGF0UG9sbCgpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fR1BSU19ERVRBQ0hFRCk7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9HUFJTX0RFVEFDSEVEKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgb25HcHJzQXR0YWNoZWQoKSB7CiAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQpIHsKICAgICAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9HUFJTX0FUVEFDSEVEKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9HUFJTX0FUVEFDSEVEKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5GQUlMRUQpIHsKICAgICAgICAgICAgICAgICBjbGVhblVwQ29ubmVjdGlvbihmYWxzZSwgUGhvbmUuUkVBU09OX0dQUlNfQVRUQUNIRUQpOwpAQCAtNDIxLDYgKzQxNiwzNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEYXRhQWxsb3dlZCgpIHsKKyAgICAgICAgaW50IGdwcnNTdGF0ZSA9IG1Hc21QaG9uZS5tU1NULmdldEN1cnJlbnRHcHJzU3RhdGUoKTsKKyAgICAgICAgYm9vbGVhbiBkZXNpcmVkUG93ZXJTdGF0ZSA9IG1Hc21QaG9uZS5tU1NULmdldERlc2lyZWRQb3dlclN0YXRlKCk7CisKKyAgICAgICAgYm9vbGVhbiBhbGxvd2VkID0gKChncHJzU3RhdGUgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UgfHwgbm9BdXRvQXR0YWNoKSAmJgorICAgICAgICAgICAgICAgIG1Hc21QaG9uZS5tU0lNUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkgJiYKKyAgICAgICAgICAgICAgICBwaG9uZS5nZXRTdGF0ZSgpID09IFBob25lLlN0YXRlLklETEUgJiYKKyAgICAgICAgICAgICAgICBtTWFzdGVyRGF0YUVuYWJsZWQgJiYKKyAgICAgICAgICAgICAgICAoIXBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSB8fCBnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpKSAmJgorICAgICAgICAgICAgICAgICFtSXNQc1Jlc3RyaWN0ZWQgJiYKKyAgICAgICAgICAgICAgICBkZXNpcmVkUG93ZXJTdGF0ZSk7CisgICAgICAgIGlmICghYWxsb3dlZCAmJiBEQkcpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSAiIjsKKyAgICAgICAgICAgIGlmIChncHJzU3RhdGUgIT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UpIHJlYXNvbiArPSAiIC0gZ3Bycz0gIiArIGdwcnNTdGF0ZTsKKyAgICAgICAgICAgIGlmICghbUdzbVBob25lLm1TSU1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSkgcmVhc29uICs9ICIgLSBTSU0gbm90IGxvYWRlZCI7CisgICAgICAgICAgICBpZiAocGhvbmUuZ2V0U3RhdGUoKSAhPSBQaG9uZS5TdGF0ZS5JRExFKSB7CisgICAgICAgICAgICAgICAgcmVhc29uICs9ICIgLSBQaG9uZVN0YXRlPSAiICsgcGhvbmUuZ2V0U3RhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbU1hc3RlckRhdGFFbmFibGVkKSByZWFzb24gKz0gIiAtIG1NYXN0ZXJEYXRhRW5hYmxlZD0gZmFsc2UiOworICAgICAgICAgICAgaWYgKHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSAmJiBnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgcmVhc29uICs9ICIgLSBSb2FtaW5nIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSXNQc1Jlc3RyaWN0ZWQpIHJlYXNvbiArPSAiIC0gbUlzUHNSZXN0cmljdGVkPSB0cnVlIjsKKyAgICAgICAgICAgIGlmICghZGVzaXJlZFBvd2VyU3RhdGUpIHJlYXNvbiArPSAiIC0gZGVzaXJlZFBvd2VyU3RhdGU9IGZhbHNlIjsKKyAgICAgICAgICAgIGxvZygiRGF0YSBub3QgYWxsb3dlZCBkdWUgdG8iICsgcmVhc29uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWxsb3dlZDsKKyAgICB9CisKICAgICBwcml2YXRlIGJvb2xlYW4gdHJ5U2V0dXBEYXRhKFN0cmluZyByZWFzb24pIHsKICAgICAgICAgaWYgKERCRykgbG9nKCIqKip0cnlTZXR1cERhdGEgZHVlIHRvICIgKyAocmVhc29uID09IG51bGwgPyAiKHVuc3BlY2lmaWVkKSIgOiByZWFzb24pKTsKIApAQCAtNDMwLDcgKzQ1NCw3IEBACiAgICAgICAgICAgICAvLyBBc3N1bWUgZGF0YSBpcyBjb25uZWN0ZWQgb24gdGhlIHNpbXVsYXRvcgogICAgICAgICAgICAgLy8gRklYTUUgIHRoaXMgY2FuIGJlIGltcHJvdmVkCiAgICAgICAgICAgICBzZXRTdGF0ZShTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAKICAgICAgICAgICAgIExvZy5pKExPR19UQUcsICIoZml4PykgV2UncmUgb24gdGhlIHNpbXVsYXRvcjsgYXNzdW1pbmcgZGF0YSBpcyBjb25uZWN0ZWQiKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtNDM5LDE5ICs0NjMsMTUgQEAKICAgICAgICAgaW50IGdwcnNTdGF0ZSA9IG1Hc21QaG9uZS5tU1NULmdldEN1cnJlbnRHcHJzU3RhdGUoKTsKICAgICAgICAgYm9vbGVhbiBkZXNpcmVkUG93ZXJTdGF0ZSA9IG1Hc21QaG9uZS5tU1NULmdldERlc2lyZWRQb3dlclN0YXRlKCk7CiAKLSAgICAgICAgaWYgKChzdGF0ZSA9PSBTdGF0ZS5JRExFIHx8IHN0YXRlID09IFN0YXRlLlNDQU5OSU5HKQotICAgICAgICAgICAgICAgICYmIChncHJzU3RhdGUgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UgfHwgbm9BdXRvQXR0YWNoKQotICAgICAgICAgICAgICAgICYmIG1Hc21QaG9uZS5tU0lNUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkKLSAgICAgICAgICAgICAgICAmJiBwaG9uZS5nZXRTdGF0ZSgpID09IFBob25lLlN0YXRlLklETEUKLSAgICAgICAgICAgICAgICAmJiBpc0RhdGFBbGxvd2VkKCkKLSAgICAgICAgICAgICAgICAmJiAhbUlzUHNSZXN0cmljdGVkCi0gICAgICAgICAgICAgICAgJiYgZGVzaXJlZFBvd2VyU3RhdGUgKSB7CisgICAgICAgIGlmICgoKHN0YXRlID09IFN0YXRlLklETEUpIHx8IChzdGF0ZSA9PSBTdGF0ZS5TQ0FOTklORykpICYmCisgICAgICAgICAgICAgICAgaXNEYXRhQWxsb3dlZCgpICYmIGdldEFueURhdGFFbmFibGVkKCkpIHsKIAogICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLklETEUpIHsKICAgICAgICAgICAgICAgICB3YWl0aW5nQXBucyA9IGJ1aWxkV2FpdGluZ0FwbnMoKTsKICAgICAgICAgICAgICAgICBpZiAod2FpdGluZ0FwbnMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIGxvZygiTm8gQVBOIGZvdW5kIik7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeU5vRGF0YShHc21EYXRhQ29ubmVjdGlvbi5GYWlsQ2F1c2UuTUlTU0lOR19VTktOT1dOX0FQTik7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGxvZyAoIkNyZWF0ZSBmcm9tIGFsbEFwbnMgOiAiICsgYXBuTGlzdFRvU3RyaW5nKGFsbEFwbnMpKTsKQEAgLTQ2MSwyMiArNDgxLDExIEBACiAgICAgICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICAgICAgbG9nICgiU2V0dXAgd2FpdG5nQXBucyA6ICIgKyBhcG5MaXN0VG9TdHJpbmcod2FpdGluZ0FwbnMpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzZXR1cERhdGEocmVhc29uKTsKKyAgICAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBzZXR1cERhdGEocmVhc29uKTsKKyAgICAgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIHJldFZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChEQkcpCi0gICAgICAgICAgICAgICAgbG9nKCJ0cnlTZXR1cERhdGE6IE5vdCByZWFkeSBmb3IgZGF0YTogIiArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YVN0YXRlPSIgKyBzdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICIgZ3Byc1N0YXRlPSIgKyBncHJzU3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAiIHNpbT0iICsgbUdzbVBob25lLm1TSU1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgVU1UUz0iICsgbUdzbVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkgKwotICAgICAgICAgICAgICAgICAgICAiIHBob25lU3RhdGU9IiArIHBob25lLmdldFN0YXRlKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGlzRGF0YUFsbG93ZWQ9IiArIGlzRGF0YUFsbG93ZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YUVuYWJsZWQ9IiArIGdldEFueURhdGFFbmFibGVkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIHJvYW1pbmc9IiArIHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YU9uUm9hbWluZ0VuYWJsZT0iICsgZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcHMgcmVzdHJpY3RlZD0iICsgbUlzUHNSZXN0cmljdGVkICsKLSAgICAgICAgICAgICAgICAgICAgIiBkZXNpcmVkUG93ZXJTdGF0ZT0iICsgZGVzaXJlZFBvd2VyU3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAiIE1hc3RlckRhdGFFbmFibGVkPSIgKyBtTWFzdGVyRGF0YUVuYWJsZWQpOworICAgICAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgZmFsc2UpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtNTk1LDQ2ICs2MDQsMTAgQEAKICAgICAgICAgcGRwLmNvbm5lY3QobXNnLCBhcG4pOwogCiAgICAgICAgIHNldFN0YXRlKFN0YXRlLklOSVRJTkcpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVQZHAgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChhcG5UeXBlID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAobUFjdGl2ZUFwbiAhPSBudWxsICYmIG1BY3RpdmVBcG4uY2FuSGFuZGxlVHlwZShhcG5UeXBlKSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVBkcC5nZXRJbnRlcmZhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldElwQWRkcmVzcyhTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICBpZiAobUFjdGl2ZVBkcCAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKGFwblR5cGUgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgIChtQWN0aXZlQXBuICE9IG51bGwgJiYgbUFjdGl2ZUFwbi5jYW5IYW5kbGVUeXBlKGFwblR5cGUpKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBtQWN0aXZlUGRwLmdldElwQWRkcmVzcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0R2F0ZXdheShTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICBpZiAobUFjdGl2ZVBkcCAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKGFwblR5cGUgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgIChtQWN0aXZlQXBuICE9IG51bGwgJiYgbUFjdGl2ZUFwbi5jYW5IYW5kbGVUeXBlKGFwblR5cGUpKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBtQWN0aXZlUGRwLmdldEdhdGV3YXlBZGRyZXNzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldERuc1NlcnZlcnMoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVQZHAgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChhcG5UeXBlID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAobUFjdGl2ZUFwbiAhPSBudWxsICYmIG1BY3RpdmVBcG4uY2FuSGFuZGxlVHlwZShhcG5UeXBlKSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVBkcC5nZXREbnNTZXJ2ZXJzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBib29sZWFuCiAgICAgcGRwU3RhdGVzSGFzQ0lEIChBcnJheUxpc3Q8RGF0YUNhbGxTdGF0ZT4gc3RhdGVzLCBpbnQgY2lkKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzID0gc3RhdGVzLnNpemUoKSA7IGkgPCBzIDsgaSsrKSB7CkBAIC03NDYsNyArNzE5LDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBub3RpZnlEZWZhdWx0RGF0YShTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIHNldFN0YXRlKFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKICAgICAgICAgLy8gcmVzZXQgcmVjb25uZWN0IHRpbWVyCiAgICAgICAgIG1SZXRyeU1nci5yZXNldFJldHJ5Q291bnQoKTsKQEAgLTc1Niw3ICs3MjksNyBAQAogICAgIHByaXZhdGUgdm9pZCBnb3RvSWRsZUFuZE5vdGlmeURhdGFDb25uZWN0aW9uKFN0cmluZyByZWFzb24pIHsKICAgICAgICAgaWYgKERCRykgbG9nKCJnb3RvSWRsZUFuZE5vdGlmeURhdGFDb25uZWN0aW9uOiByZWFzb249IiArIHJlYXNvbik7CiAgICAgICAgIHNldFN0YXRlKFN0YXRlLklETEUpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICBtQWN0aXZlQXBuID0gbnVsbDsKICAgICB9CiAKQEAgLTk5OCw3ICs5NzEsNyBAQAogICAgICAgICAgICAgaWYgKCFtUmV0cnlNZ3IuaXNSZXRyeU5lZWRlZCgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFtUmVxdWVzdGVkQXBuVHlwZS5lcXVhbHMoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm8gbW9yZSByZXRyaWVzIG9uIGEgc2Vjb25kYXJ5IEFQTiBhdHRlbXB0LCB0ZWxsIHRoZSB3b3JsZCBhbmQgcmV2ZXJ0LgotICAgICAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQVBOX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9BUE5fRkFJTEVEKTsKICAgICAgICAgICAgICAgICAgICAgb25FbmFibGVBcG4oYXBuVHlwZVRvSWQobVJlcXVlc3RlZEFwblR5cGUpLCBESVNBQkxFRCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDkxLDcgKzEwNjQsNyBAQAogICAgICAgICAgICAgLy8gQXNzdW1lIGRhdGEgaXMgY29ubmVjdGVkIG9uIHRoZSBzaW11bGF0b3IKICAgICAgICAgICAgIC8vIEZJWE1FICB0aGlzIGNhbiBiZSBpbXByb3ZlZAogICAgICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CiAKICAgICAgICAgICAgIExvZy5pKExPR19UQUcsICJXZSdyZSBvbiB0aGUgc2ltdWxhdG9yOyBhc3N1bWluZyBkYXRhIGlzIGNvbm5lY3RlZCIpOwogICAgICAgICB9CkBAIC0xMTI1LDYgKzEwOTgsMjUgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChhci5leGNlcHRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzID0gZ2V0TGlua1Byb3BlcnRpZXMobUFjdGl2ZVBkcCk7CisKKyAgICAgICAgICAgIEFwblNldHRpbmcgYXBuID0gbUFjdGl2ZVBkcC5nZXRBcG4oKTsKKyAgICAgICAgICAgIGlmIChhcG4ucHJveHkgIT0gbnVsbCAmJiBhcG4ucHJveHkubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFByb3h5UHJvcGVydGllcyBwcm94eSA9IG5ldyBQcm94eVByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJveHkuc2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRCeU5hbWUoYXBuLnByb3h5KSk7CisgICAgICAgICAgICAgICAgICAgIHByb3h5LnNldFBvcnQoSW50ZWdlci5wYXJzZUludChhcG4ucG9ydCkpOworICAgICAgICAgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMuc2V0SHR0cFByb3h5KHByb3h5KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmtub3duSG9zdEV4Y2VwdGlvbiBtYWtpbmcgUHJveHlQcm9wZXJ0aWVzOiAiICsgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU2VjdXJpdHlFeGNlcHRpb24gbWFraW5nIFByb3h5UHJvcGVydGllczogIiArIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJOdW1iZXJGb3JtYXRFeGNlcHRpb24gbWFraW5nIFByb3h5UHJvcGVydGllcyAoIiArIGFwbi5wb3J0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTogIiArIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gZXZlcnl0aGluZyBpcyBzZXR1cAogICAgICAgICAgICAgaWYgKGlzQXBuVHlwZUFjdGl2ZShQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSkgewogICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJnc20uZGVmYXVsdHBkcGNvbnRleHQuYWN0aXZlIiwgInRydWUiKTsKQEAgLTExNTgsNyArMTE1MCw3IEBACiAgICAgICAgICAgICBpZiAoY2F1c2UuaXNQZXJtYW5lbnRGYWlsKCkpIHsKICAgICAgICAgICAgICAgICBub3RpZnlOb0RhdGEoY2F1c2UpOwogICAgICAgICAgICAgICAgIGlmICghbVJlcXVlc3RlZEFwblR5cGUuZXF1YWxzKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9BUE5fRkFJTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0FQTl9GQUlMRUQpOwogICAgICAgICAgICAgICAgICAgICBvbkVuYWJsZUFwbihhcG5UeXBlVG9JZChtUmVxdWVzdGVkQXBuVHlwZSksIERJU0FCTEVEKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTE4OCw3ICsxMTgwLDcgQEAKICAgICAgICAgICAgcmVhc29uID0gKFN0cmluZykgYXIudXNlck9iajsKICAgICAgICAgfQogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5JRExFKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgbUFjdGl2ZUFwbiA9IG51bGw7CiAgICAgICAgIGlmIChyZXRyeUFmdGVyRGlzY29ubmVjdGVkKHJlYXNvbikpIHsKICAgICAgICAgICAgIHRyeVNldHVwRGF0YShyZWFzb24pOwpAQCAtMTIxOSw3ICsxMjExLDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvblZvaWNlQ2FsbFN0YXJ0ZWQoKSB7CiAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQgJiYgISBtR3NtUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSkgewogICAgICAgICAgICAgc3RvcE5ldFN0YXRQb2xsKCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9TVEFSVEVEKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX1NUQVJURUQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjI3LDcgKzEyMTksNyBAQAogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICBpZiAoIW1Hc21QaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpKSB7CiAgICAgICAgICAgICAgICAgc3RhcnROZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX0VOREVEKTsKKyAgICAgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9FTkRFRCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIGNsZWFuIHNsYXRlIGFmdGVyIGNhbGwgZW5kLgogICAgICAgICAgICAgICAgIHJlc2V0UG9sbFN0YXRzKCk7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNNU0Rpc3BhdGNoZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU01TRGlzcGF0Y2hlci5qYXZhCmluZGV4IDMwNzlhNjQuLmVkNzA2NmIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU01TRGlzcGF0Y2hlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU01TRGlzcGF0Y2hlci5qYXZhCkBAIC01Niw2ICs1Niw3IEBACiAgICAgICogQHBhcmFtIGFyIEFzeW5jUmVzdWx0IHBhc3NlZCBpbnRvIHRoZSBtZXNzYWdlIGhhbmRsZXIuICBhci5yZXN1bHQgc2hvdWxkCiAgICAgICogICAgICAgICAgIGJlIGEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc3RhdHVzIHJlcG9ydCBQRFUsIGFzIEFTQ0lJIGhleC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTdGF0dXNSZXBvcnQoQXN5bmNSZXN1bHQgYXIpIHsKICAgICAgICAgU3RyaW5nIHBkdVN0cmluZyA9IChTdHJpbmcpIGFyLnJlc3VsdDsKICAgICAgICAgU21zTWVzc2FnZSBzbXMgPSBTbXNNZXNzYWdlLm5ld0Zyb21DRFMocGR1U3RyaW5nKTsKQEAgLTg0LDYgKzg1LDcgQEAKIAogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgaW50IGRpc3BhdGNoTWVzc2FnZShTbXNNZXNzYWdlQmFzZSBzbXNiKSB7CiAKICAgICAgICAgLy8gSWYgc21zIGlzIG51bGwsIG1lYW5zIHRoZXJlIHdhcyBhIHBhcnNpbmcgZXJyb3IuCkBAIC0xNTEsNiArMTUzLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmREYXRhKFN0cmluZyBkZXN0QWRkciwgU3RyaW5nIHNjQWRkciwgaW50IGRlc3RQb3J0LAogICAgICAgICAgICAgYnl0ZVtdIGRhdGEsIFBlbmRpbmdJbnRlbnQgc2VudEludGVudCwgUGVuZGluZ0ludGVudCBkZWxpdmVyeUludGVudCkgewogICAgICAgICBTbXNNZXNzYWdlLlN1Ym1pdFBkdSBwZHUgPSBTbXNNZXNzYWdlLmdldFN1Ym1pdFBkdSgKQEAgLTE1OSw2ICsxNjIsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZFRleHQoU3RyaW5nIGRlc3RBZGRyLCBTdHJpbmcgc2NBZGRyLCBTdHJpbmcgdGV4dCwKICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2VudEludGVudCwgUGVuZGluZ0ludGVudCBkZWxpdmVyeUludGVudCkgewogICAgICAgICBTbXNNZXNzYWdlLlN1Ym1pdFBkdSBwZHUgPSBTbXNNZXNzYWdlLmdldFN1Ym1pdFBkdSgKQEAgLTE2Nyw2ICsxNzEsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZE11bHRpcGFydFRleHQoU3RyaW5nIGRlc3RpbmF0aW9uQWRkcmVzcywgU3RyaW5nIHNjQWRkcmVzcywKICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHBhcnRzLCBBcnJheUxpc3Q8UGVuZGluZ0ludGVudD4gc2VudEludGVudHMsCiAgICAgICAgICAgICBBcnJheUxpc3Q8UGVuZGluZ0ludGVudD4gZGVsaXZlcnlJbnRlbnRzKSB7CkBAIC0zMDYsOCArMzExLDkgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRTbXMoU21zVHJhY2tlciB0cmFja2VyKSB7Ci0gICAgICAgIEhhc2hNYXAgbWFwID0gdHJhY2tlci5tRGF0YTsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gdHJhY2tlci5tRGF0YTsKIAogICAgICAgICBieXRlIHNtc2NbXSA9IChieXRlW10pIG1hcC5nZXQoInNtc2MiKTsKICAgICAgICAgYnl0ZSBwZHVbXSA9IChieXRlW10pIG1hcC5nZXQoInBkdSIpOwpAQCAtMzIyLDEyICszMjgsMTMgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSB0cmFja2VyIGhvbGRzIHRoZSBtdWx0aXBhcnQgU21zIHRyYWNrZXIgcmVhZHkgdG8gYmUgc2VudAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRNdWx0aXBhcnRTbXMgKFNtc1RyYWNrZXIgdHJhY2tlcikgewogICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXJ0czsKICAgICAgICAgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IHNlbnRJbnRlbnRzOwogICAgICAgICBBcnJheUxpc3Q8UGVuZGluZ0ludGVudD4gZGVsaXZlcnlJbnRlbnRzOwogCi0gICAgICAgIEhhc2hNYXAgbWFwID0gdHJhY2tlci5tRGF0YTsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gdHJhY2tlci5tRGF0YTsKIAogICAgICAgICBTdHJpbmcgZGVzdGluYXRpb25BZGRyZXNzID0gKFN0cmluZykgbWFwLmdldCgiZGVzdGluYXRpb24iKTsKICAgICAgICAgU3RyaW5nIHNjQWRkcmVzcyA9IChTdHJpbmcpIG1hcC5nZXQoInNjYWRkcmVzcyIpOwpAQCAtMzQyLDYgKzM0OSw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBhY2tub3dsZWRnZUxhc3RJbmNvbWluZ1Ntcyhib29sZWFuIHN1Y2Nlc3MsIGludCByZXN1bHQsIE1lc3NhZ2UgcmVzcG9uc2UpewogICAgICAgICAvLyBGSVhNRSB1bml0IHRlc3QgbGVhdmVzIGNtID09IG51bGwuIHRoaXMgc2hvdWxkIGNoYW5nZQogICAgICAgICBpZiAobUNtICE9IG51bGwpIHsKQEAgLTM1MCw2ICszNTgsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVDZWxsQnJvYWRjYXN0U21zKGludCBhY3RpdmF0ZSwgTWVzc2FnZSByZXNwb25zZSkgewogICAgICAgICAvLyBVbmxlc3MgQ0JTIGlzIGltcGxlbWVudGVkIGZvciBHU00sIHRoaXMgcG9pbnQgc2hvdWxkIGJlIHVucmVhY2hhYmxlLgogICAgICAgICBMb2cuZShUQUcsICJFcnJvciEgVGhlIGZ1bmN0aW9uYWxpdHkgY2VsbCBicm9hZGNhc3Qgc21zIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgR1NNLiIpOwpAQCAtMzU3LDYgKzM2Niw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBnZXRDZWxsQnJvYWRjYXN0U21zQ29uZmlnKE1lc3NhZ2UgcmVzcG9uc2UpewogICAgICAgICAvLyBVbmxlc3MgQ0JTIGlzIGltcGxlbWVudGVkIGZvciBHU00sIHRoaXMgcG9pbnQgc2hvdWxkIGJlIHVucmVhY2hhYmxlLgogICAgICAgICBMb2cuZShUQUcsICJFcnJvciEgVGhlIGZ1bmN0aW9uYWxpdHkgY2VsbCBicm9hZGNhc3Qgc21zIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgR1NNLiIpOwpAQCAtMzY0LDYgKzM3NCw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgIHZvaWQgc2V0Q2VsbEJyb2FkY2FzdENvbmZpZyhpbnRbXSBjb25maWdWYWx1ZXNBcnJheSwgTWVzc2FnZSByZXNwb25zZSkgewogICAgICAgICAvLyBVbmxlc3MgQ0JTIGlzIGltcGxlbWVudGVkIGZvciBHU00sIHRoaXMgcG9pbnQgc2hvdWxkIGJlIHVucmVhY2hhYmxlLgogICAgICAgICBMb2cuZShUQUcsICJFcnJvciEgVGhlIGZ1bmN0aW9uYWxpdHkgY2VsbCBicm9hZGNhc3Qgc21zIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgR1NNLiIpOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQppbmRleCA5MGVjYmQ3Li5iNjM5ZWVhIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQpAQCAtMTAxOCw3ICsxMDE4LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChoYXNOZXR3b3JrVHlwZUNoYW5nZWQpIHsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICAgICAgLy8gVE9ETyAtIGRvIHdlIHJlYWxseSB3YW50IHRoaXM/CisgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsLCBudWxsKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChoYXNSb2FtaW5nT24pIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TaW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKaW5kZXggMjAyOGNhNC4uZjAwMGQ3OSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TaW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TaW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKQEAgLTg2LDYgKzg2LDcgQEAKICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKQEAgLTE5MSw2ICsxOTIsNyBAQAogICAgICAgICByZXR1cm4gbVNtczsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIG1zZykgewogICAgICAgICBMb2cuZChMT0dfVEFHLCAiW1NpbVNtc0ludGVyZmFjZU1hbmFnZXJdICIgKyBtc2cpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNNZXNzYWdlLmphdmEKaW5kZXggOWEzYzQ3Ni4uYTc3NDg0YSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNNZXNzYWdlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNNZXNzYWdlLmphdmEKQEAgLTI2LDcgKzI2LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc0hlYWRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zTWVzc2FnZUJhc2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlLlRleHRFbmNvZGluZ0RldGFpbHM7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CkBAIC00NSw3ICs0NCw3IEBACiAgKiBBIFNob3J0IE1lc3NhZ2UgU2VydmljZSBtZXNzYWdlLgogICoKICAqLwotcHVibGljIGNsYXNzIFNtc01lc3NhZ2UgZXh0ZW5kcyBTbXNNZXNzYWdlQmFzZXsKK3B1YmxpYyBjbGFzcyBTbXNNZXNzYWdlIGV4dGVuZHMgU21zTWVzc2FnZUJhc2UgewogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJHU00iOwogCiAgICAgcHJpdmF0ZSBNZXNzYWdlQ2xhc3MgbWVzc2FnZUNsYXNzOwpAQCAtMzExLDcgKzMxMCw3IEBACiAgICAgICAgICAgICAvLyB0aGUgcmVjZWl2ZXIncyBTSU0gY2FyZC4gWW91IGNhbiB0aGVuIHNlbmQgbWVzc2FnZXMgdG8geW91cnNlbGYKICAgICAgICAgICAgIC8vIChvbiBhIHBob25lIHdpdGggdGhpcyBjaGFuZ2UpIGFuZCB0aGV5J2xsIGVuZCB1cCBvbiB0aGUgU0lNIGNhcmQuCiAgICAgICAgICAgICBiby53cml0ZSgweDAwKTsKLSAgICAgICAgfSBlbHNlIHsgLy9hc3N1bWUgVUNTLTIKKyAgICAgICAgfSBlbHNlIHsgLy8gYXNzdW1lIFVDUy0yCiAgICAgICAgICAgICBpZiAoKDB4ZmYgJiB1c2VyRGF0YVswXSkgPiBNQVhfVVNFUl9EQVRBX0JZVEVTKSB7CiAgICAgICAgICAgICAgICAgLy8gTWVzc2FnZSB0b28gbG9uZwogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMzc3LDcgKzM3Niw3IEBACiAgICAgICogQHBhcmFtIGRlc3RpbmF0aW9uQWRkcmVzcyB0aGUgYWRkcmVzcyBvZiB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBtZXNzYWdlCiAgICAgICogQHBhcmFtIGRlc3RpbmF0aW9uUG9ydCB0aGUgcG9ydCB0byBkZWxpdmVyIHRoZSBtZXNzYWdlIHRvIGF0IHRoZQogICAgICAqICAgICAgICBkZXN0aW5hdGlvbgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXQgZm9yIHRoZSBtZXNzYWdlCisgICAgICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgZm9yIHRoZSBtZXNzYWdlCiAgICAgICogQHJldHVybiBhIDxjb2RlPlN1Ym1pdFBkdTwvY29kZT4gY29udGFpbmluZyB0aGUgZW5jb2RlZCBTQwogICAgICAqICAgICAgICAgYWRkcmVzcywgaWYgYXBwbGljYWJsZSwgYW5kIHRoZSBlbmNvZGVkIG1lc3NhZ2UuCiAgICAgICogICAgICAgICBSZXR1cm5zIG51bGwgb24gZW5jb2RlIGVycm9yLgpAQCAtNDgyLDcgKzQ4MSw3IEBACiAgICAgICAgIHJldHVybiBibzsKICAgICB9CiAKLSAgICBzdGF0aWMgY2xhc3MgUGR1UGFyc2VyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQZHVQYXJzZXIgewogICAgICAgICBieXRlIHBkdVtdOwogICAgICAgICBpbnQgY3VyOwogICAgICAgICBTbXNIZWFkZXIgdXNlckRhdGFIZWFkZXI7CkBAIC00OTAsMTAgKzQ4OSw2IEBACiAgICAgICAgIGludCBtVXNlckRhdGFTZXB0ZXRQYWRkaW5nOwogICAgICAgICBpbnQgbVVzZXJEYXRhU2l6ZTsKIAotICAgICAgICBQZHVQYXJzZXIoU3RyaW5nIHMpIHsKLSAgICAgICAgICAgIHRoaXMoSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcyhzKSk7Ci0gICAgICAgIH0KLQogICAgICAgICBQZHVQYXJzZXIoYnl0ZVtdIHBkdSkgewogICAgICAgICAgICAgdGhpcy5wZHUgPSBwZHU7CiAgICAgICAgICAgICBjdXIgPSAwOwpAQCAtNTQ1LDcgKzU0MCw3IEBACiAgICAgICAgICAgICBHc21TbXNBZGRyZXNzIHJldDsKIAogICAgICAgICAgICAgLy8gIlRoZSBBZGRyZXNzLUxlbmd0aCBmaWVsZCBpcyBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mCi0gICAgICAgICAgICAvLyB0aGUgbnVtYmVyIGZpZWxkLCBpLmUuIGV4Y2x1ZGVzIGFueSBzZW1pIG9jdGV0IGNvbnRhaW5pbmcgb25seQorICAgICAgICAgICAgLy8gdGhlIG51bWJlciBmaWVsZCwgaS5lLiBleGNsdWRlcyBhbnkgc2VtaS1vY3RldCBjb250YWluaW5nIG9ubHkKICAgICAgICAgICAgIC8vIGZpbGwgYml0cy4iCiAgICAgICAgICAgICAvLyBUaGUgVE9BIGZpZWxkIGlzIG5vdCBpbmNsdWRlZCBhcyBwYXJ0IG9mIHRoaXMKICAgICAgICAgICAgIGludCBhZGRyZXNzTGVuZ3RoID0gcGR1W2N1cl0gJiAweGZmOwpAQCAtNTczLDcgKzU2OCw3IEBACiAgICAgICAgICAgICBpbnQgc2Vjb25kID0gSWNjVXRpbHMuZ3NtQmNkQnl0ZVRvSW50KHBkdVtjdXIrK10pOwogCiAgICAgICAgICAgICAvLyBGb3IgdGhlIHRpbWV6b25lLCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlCi0gICAgICAgICAgICAvLyBsZWFzdCBzaWduZmljYW50IG5pYmJsZSBpcyB0aGUgc2lnbiBieXRlCisgICAgICAgICAgICAvLyBsZWFzdCBzaWduaWZpY2FudCBuaWJibGUgaXMgdGhlIHNpZ24gYnl0ZQogICAgICAgICAgICAgLy8gKG1lYW5pbmcgdGhlIG1heCByYW5nZSBvZiB0aGlzIGZpZWxkIGlzIDc5IHF1YXJ0ZXItaG91cnMsCiAgICAgICAgICAgICAvLyB3aGljaCBpcyBtb3JlIHRoYW4gZW5vdWdoKQogCkBAIC02MzIsNyArNjI3LDcgQEAKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIEhlcmUgd2UganVzdCBjcmVhdGUgdGhlIHVzZXIgZGF0YSBsZW5ndGggdG8gYmUgdGhlIHJlbWFpbmRlciBvZgogICAgICAgICAgICAgICAgICAqIHRoZSBwZHUgbWludXMgdGhlIHVzZXIgZGF0YSBoZWFkZXIsIHNpbmNlIHVzZXJEYXRhTGVuZ3RoIG1lYW5zCi0gICAgICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgc2VwZXRzLgorICAgICAgICAgICAgICAgICAqIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIHNlcHRldHMuCiAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgYnVmZmVyTGVuID0gcGR1Lmxlbmd0aCAtIG9mZnNldDsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC02NzEsMTAgKzY2NiwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJpdHMgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSB1c2VyIGRhdGEKKyAgICAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYml0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1c2VyIGRhdGEKICAgICAgICAgICogYXJyYXkgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgc2VwdGV0cy4KICAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYml0cyBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIHVzZXIgZGF0YQorICAgICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFkZGluZyBiaXRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVzZXIgZGF0YQogICAgICAgICAgKiBhcnJheSBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBzZXB0ZXRzCiAgICAgICAgICAqLwogICAgICAgICBpbnQgZ2V0VXNlckRhdGFTZXB0ZXRQYWRkaW5nKCkgewpAQCAtNjk0LDcgKzY4OSw3IEBACiAgICAgICAgIFhYWCBOb3Qgc3VyZSB3aGF0IHRoaXMgb25lIGlzIHN1cHBvc2VkIHRvIGJlIGRvaW5nLCBhbmQgbm8gb25lIGlzIHVzaW5nCiAgICAgICAgIGl0LgogICAgICAgICBTdHJpbmcgZ2V0VXNlckRhdGFHU004Yml0KCkgewotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJyZW1haW5kZXIgb2YgcHVkOiIgKworICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJyZW1haW5kZXIgb2YgcGR1OiIgKwogICAgICAgICAgICAgLy8gSGV4RHVtcC5kdW1wSGV4U3RyaW5nKHBkdSwgY3VyLCBwZHUubGVuZ3RoIC0gY3VyKSk7CiAgICAgICAgICAgICBpbnQgY291bnQgPSBwZHVbY3VyKytdICYgMHhmZjsKICAgICAgICAgICAgIGludCBzaXplID0gcGR1W2N1cisrXTsKQEAgLTgyNywxMSArODIyLDEzIEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldFByb3RvY29sSWRlbnRpZmllcigpIHsKICAgICAgICAgcmV0dXJuIHByb3RvY29sSWRlbnRpZmllcjsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzUmVwbGFjZSgpIHsKICAgICAgICAgcmV0dXJuIChwcm90b2NvbElkZW50aWZpZXIgJiAweGMwKSA9PSAweDQwCiAgICAgICAgICAgICAgICAgJiYgKHByb3RvY29sSWRlbnRpZmllciAmIDB4M2YpID4gMApAQCAtODM5LDEyICs4MzYsMTQgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzQ3Boc013aU1lc3NhZ2UoKSB7CiAgICAgICAgIHJldHVybiAoKEdzbVNtc0FkZHJlc3MpIG9yaWdpbmF0aW5nQWRkcmVzcykuaXNDcGhzVm9pY2VNZXNzYWdlQ2xlYXIoKQogICAgICAgICAgICAgICAgIHx8ICgoR3NtU21zQWRkcmVzcykgb3JpZ2luYXRpbmdBZGRyZXNzKS5pc0NwaHNWb2ljZU1lc3NhZ2VTZXQoKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTVdJQ2xlYXJNZXNzYWdlKCkgewogICAgICAgICBpZiAoaXNNd2kgJiYgKG13aVNlbnNlID09IGZhbHNlKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC04NTUsNiArODU0LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTVdJU2V0TWVzc2FnZSgpIHsKICAgICAgICAgaWYgKGlzTXdpICYmIChtd2lTZW5zZSA9PSB0cnVlKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC04NjUsNiArODY1LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTXdpRG9udFN0b3JlKCkgewogICAgICAgICBpZiAoaXNNd2kgJiYgbXdpRG9udFN0b3JlKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTg4NCwzMSArODg1LDM0IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzU3RhdHVzUmVwb3J0TWVzc2FnZSgpIHsKICAgICAgICAgcmV0dXJuIGlzU3RhdHVzUmVwb3J0TWVzc2FnZTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzUmVwbHlQYXRoUHJlc2VudCgpIHsKICAgICAgICAgcmV0dXJuIHJlcGx5UGF0aFByZXNlbnQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVFMgMjcuMDA1IDMuMSwgPHBkdT4gZGVmaW5pdGlvbiAiSW4gdGhlIGNhc2Ugb2YgU01TOiAzR1BQIFRTIDI0LjAxMSBbNl0KKyAgICAgKiBUUyAyNy4wMDUgMy4xLCAmbHQ7cGR1Jmd0OyBkZWZpbml0aW9uICJJbiB0aGUgY2FzZSBvZiBTTVM6IDNHUFAgVFMgMjQuMDExIFs2XQogICAgICAqIFNDIGFkZHJlc3MgZm9sbG93ZWQgYnkgM0dQUCBUUyAyMy4wNDAgWzNdIFRQRFUgaW4gaGV4YWRlY2ltYWwgZm9ybWF0OgogICAgICAqIE1FL1RBIGNvbnZlcnRzIGVhY2ggb2N0ZXQgb2YgVFAgZGF0YSB1bml0IGludG8gdHdvIElSQSBjaGFyYWN0ZXIgbG9uZwotICAgICAqIGhleGFkIG51bWJlciAoZS5nLiBvY3RldCB3aXRoIGludGVnZXIgdmFsdWUgNDIgaXMgcHJlc2VudGVkIHRvIFRFIGFzIHR3bworICAgICAqIGhleCBudW1iZXIgKGUuZy4gb2N0ZXQgd2l0aCBpbnRlZ2VyIHZhbHVlIDQyIGlzIHByZXNlbnRlZCB0byBURSBhcyB0d28KICAgICAgKiBjaGFyYWN0ZXJzIDJBIChJUkEgNTAgYW5kIDY1KSkiIC4uLmluIHRoZSBjYXNlIG9mIGNlbGwgYnJvYWRjYXN0LAogICAgICAqIHNvbWV0aGluZyBlbHNlLi4uCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUGR1KGJ5dGVbXSBwZHUpIHsKICAgICAgICAgbVBkdSA9IHBkdTsKLSAgICAgICAgLy8gTG9nLmQoTE9HX1RBRywgInJhdyBzbXMgbWVzYWdlOiIpOworICAgICAgICAvLyBMb2cuZChMT0dfVEFHLCAicmF3IHNtcyBtZXNzYWdlOiIpOwogICAgICAgICAvLyBMb2cuZChMT0dfVEFHLCBzKTsKIAogICAgICAgICBQZHVQYXJzZXIgcCA9IG5ldyBQZHVQYXJzZXIocGR1KTsKQEAgLTExNjIsNiArMTE2Niw3IEBACiAgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBNZXNzYWdlQ2xhc3MgZ2V0TWVzc2FnZUNsYXNzKCkgewogICAgICAgICByZXR1cm4gbWVzc2FnZUNsYXNzOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vVXNpbVBob25lQm9va01hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vVXNpbVBob25lQm9va01hbmFnZXIuamF2YQppbmRleCBiNjQyNTQxLi40MWYzYjIzIDEwMDc1NQotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1VzaW1QaG9uZUJvb2tNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Vc2ltUGhvbmVCb29rTWFuYWdlci5qYXZhCkBAIC0yNyw4ICsyNyw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY1V0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZUJhc2U7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS5sYW5nLnJlZmxlY3QuTGlzdE9mVHlwZXM7Ci0KIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcENvbm5lY3Rpb25CYXNlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcENvbm5lY3Rpb25CYXNlLmphdmEKaW5kZXggNmM5ODliNC4uZjVkODRlYiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBDb25uZWN0aW9uQmFzZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwQ29ubmVjdGlvbkJhc2UuamF2YQpAQCAtMjM4LDExICsyMzgsOSBAQAogICAgICAgICByZXR1cm4gQ29ubmVjdGlvbi5QUkVTRU5UQVRJT05fQUxMT1dFRDsKICAgICB9CiAKLSAgICAvKgogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBVVVNJbmZvIGdldFVVU0luZm8oKSB7CiAgICAgICAgIC8vIEZJWE1FOiB3aGF0J3MgdGhpcyBmb3IgU0lQPwogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9Ci0gICAgKi8KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwUGhvbmUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwUGhvbmUuamF2YQppbmRleCAxMzI1ZGQzLi45YTQ1ZDNhIDEwMDc1NQotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZS5qYXZhCkBAIC01OSw3ICs1OSw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lUHJveHk7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lU3ViSW5mbzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255UHJvcGVydGllczsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVVVTSW5mbzsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwpAQCAtOTksNiArOTgsMTQgQEAKICAgICAgICAgLy8gICAgICAgIG5ldyBJbnRlZ2VyKFBob25lLlBIT05FX1RZUEVfR1NNKS50b1N0cmluZygpKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKG8gPT0gdGhpcykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBTaXBQaG9uZSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgU2lwUGhvbmUgdGhhdCA9IChTaXBQaG9uZSkgbzsKKyAgICAgICAgcmV0dXJuIG1Qcm9maWxlLmdldFVyaVN0cmluZygpLmVxdWFscyh0aGF0Lm1Qcm9maWxlLmdldFVyaVN0cmluZygpKTsKKyAgICB9CisKICAgICBwdWJsaWMgU3RyaW5nIGdldFBob25lTmFtZSgpIHsKICAgICAgICAgcmV0dXJuICJTSVA6IiArIGdldFVyaVN0cmluZyhtUHJvZmlsZSk7CiAgICAgfQpAQCAtMTY4LDEwICsxNzUsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIENvbm5lY3Rpb24gZGlhbChTdHJpbmcgZGlhbFN0cmluZywgVVVTSW5mbyB1dXNpbmZvKSB0aHJvd3MgQ2FsbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRpYWwoZGlhbFN0cmluZyk7Ci0gICAgfQotCiAgICAgcHVibGljIENvbm5lY3Rpb24gZGlhbChTdHJpbmcgZGlhbFN0cmluZykgdGhyb3dzIENhbGxTdGF0ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHN5bmNocm9uaXplZCAoU2lwUGhvbmUuY2xhc3MpIHsKICAgICAgICAgICAgIHJldHVybiBkaWFsSW50ZXJuYWwoZGlhbFN0cmluZyk7CkBAIC03NzgsMTAgKzc4MSw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFVVU0luZm8gZ2V0VVVTSW5mbygpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ2FsbC5TdGF0ZSBnZXRDYWxsU3RhdGVGcm9tKFNpcEF1ZGlvQ2FsbCBzaXBBdWRpb0NhbGwpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwUGhvbmVCYXNlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lQmFzZS5qYXZhCmluZGV4IDRiN2U5OTEuLmU3NDI4ODcgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwUGhvbmVCYXNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZUJhc2UuamF2YQpAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CkBAIC02NSw3ICs2Niw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lUHJveHk7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lU3ViSW5mbzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255UHJvcGVydGllczsKLS8vaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5VVVNJbmZvOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5VVVNJbmZvOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMTAyLDEzICsxMDMsMTEgQEAKIAogICAgIHB1YmxpYyBhYnN0cmFjdCBDYWxsIGdldFJpbmdpbmdDYWxsKCk7CiAKLSAgICAvKgogICAgIHB1YmxpYyBDb25uZWN0aW9uIGRpYWwoU3RyaW5nIGRpYWxTdHJpbmcsIFVVU0luZm8gdXVzSW5mbykKICAgICAgICAgICAgIHRocm93cyBDYWxsU3RhdGVFeGNlcHRpb24gewogICAgICAgICAvLyBpZ25vcmUgVVVTSW5mbwogICAgICAgICByZXR1cm4gZGlhbChkaWFsU3RyaW5nKTsKICAgICB9Ci0gICAgKi8KIAogICAgIHZvaWQgbWlncmF0ZUZyb20oU2lwUGhvbmVCYXNlIGZyb20pIHsKICAgICAgICAgbWlncmF0ZShtUmluZ2JhY2tSZWdpc3RyYW50cywgZnJvbS5tUmluZ2JhY2tSZWdpc3RyYW50cyk7CkBAIC01MzQsNiArNTMzLDE4IEBACiAgICAgICAgIExvZy5lKExPR19UQUcsICJFcnJvciEgVGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgU0lQLiIpOwogICAgIH0KIAorICAgIC8vQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkgeworICAgICAgICAvLyBGSVhNRTogd2hhdCdzIHRoaXMgZm9yIFNJUD8KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vQE92ZXJyaWRlCisgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIC8vIEZJWE1FOiB3aGF0J3MgdGhpcyBmb3IgU0lQPworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKICAgICB2b2lkIHVwZGF0ZVBob25lU3RhdGUoKSB7CiAgICAgICAgIFN0YXRlIG9sZFN0YXRlID0gc3RhdGU7CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS90ZXN0L1NpbXVsYXRlZENvbW1hbmRzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9TaW11bGF0ZWRDb21tYW5kcy5qYXZhCmluZGV4IDljNzJlNWEuLmZkY2Y3OGQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS90ZXN0L1NpbXVsYXRlZENvbW1hbmRzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvU2ltdWxhdGVkQ29tbWFuZHMuamF2YQpAQCAtMTYsNyArMTYsNiBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0OwogCi0KIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKQEAgLTI3LDcgKzI2LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29tbWFuZEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29tbWFuZHNJbnRlcmZhY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkRhdGFDYWxsU3RhdGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0NhcmQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5VVVNJbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ2FsbEZhaWxDYXVzZTsKQEAgLTMzNSw3ICszMzMsNyBAQAogCiAgICAgLyoqCiAgICAgICogKEFzeW5jUmVzdWx0KXJlc3BvbnNlLm9iaikucmVzdWx0IHdpbGwgYmUgYW4gSW50ZWdlciByZXByZXNlbnRpbmcKLSAgICAgKiB0aGUgc3VtIG9mIGVuYWJsZWQgc2VyaXZpY2UgY2xhc3NlcyAoc3VtIG9mIFNFUlZJQ0VfQ0xBU1NfKikKKyAgICAgKiB0aGUgc3VtIG9mIGVuYWJsZWQgc2VydmljZSBjbGFzc2VzIChzdW0gb2YgU0VSVklDRV9DTEFTU18qKQogICAgICAqCiAgICAgICogQHBhcmFtIGZhY2lsaXR5IG9uZSBvZiBDQl9GQUNJTFRZXyoKICAgICAgKiBAcGFyYW0gcGluIHBhc3N3b3JkIG9yICIiIGlmIG5vdCByZXF1aXJlZApAQCAtNDQxLDcgKzQzOSw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBjb250YWlucyBhIExpc3Qgb2YgRHJpdmVyQ2FsbAogICAgICAqICAgICAgVGhlIGFyLnJlc3VsdCBMaXN0IGlzIHNvcnRlZCBieSBEcml2ZXJDYWxsLmluZGV4CiAgICAgICovCkBAIC00NjgsNyArNDY2LDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGNvbnRhaW5zIGEgTGlzdCBvZiBEYXRhQ2FsbFN0YXRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZ2V0RGF0YUNhbGxMaXN0KE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC00NzksNyArNDc3LDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqCiAgICAgICogQ0xJUl9ERUZBVUxUICAgICA9PSBvbiAidXNlIHN1YnNjcmlwdGlvbiBkZWZhdWx0IHZhbHVlIgpAQCAtNDk2LDcgKzQ5NCw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKgogICAgICAqIENMSVJfREVGQVVMVCAgICAgPT0gb24gInVzZSBzdWJzY3JpcHRpb24gZGVmYXVsdCB2YWx1ZSIKQEAgLTUxMyw3ICs1MTEsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgU3RyaW5nIGNvbnRhaW5pbmcgSU1TSSBvbiBzdWNjZXNzCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZ2V0SU1TSShNZXNzYWdlIHJlc3VsdCkgewpAQCAtNTI0LDcgKzUyMiw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBTdHJpbmcgY29udGFpbmluZyBJTUVJIG9uIHN1Y2Nlc3MKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXRJTUVJKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC01MzUsNyArNTMzLDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIFN0cmluZyBjb250YWluaW5nIElNRUlTViBvbiBzdWNjZXNzCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZ2V0SU1FSVNWKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC01NDcsNyArNTQ1LDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqCiAgICAgICogIDNHUFAgMjIuMDMwIDYuNS41CkBAIC01NzIsNyArNTcwLDcgQEAKICAgICAgKiAgIlJlbGVhc2VzIGFsbCBoZWxkIGNhbGxzIG9yIHNldHMgVXNlciBEZXRlcm1pbmVkIFVzZXIgQnVzeSAoVURVQikKICAgICAgKiAgIGZvciBhIHdhaXRpbmcgY2FsbC4iCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBoYW5ndXBXYWl0aW5nT3JCYWNrZ3JvdW5kIChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNTkzLDcgKzU5MSw3IEBACiAgICAgICogIHRoZSBvdGhlciAoaGVsZCBvciB3YWl0aW5nKSBjYWxsLiIKICAgICAgKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaGFuZ3VwRm9yZWdyb3VuZFJlc3VtZUJhY2tncm91bmQgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC02MTQsNyArNjEyLDcgQEAKICAgICAgKiAgdGhlIG90aGVyIChoZWxkIG9yIHdhaXRpbmcpIGNhbGwuIgogICAgICAqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzd2l0Y2hXYWl0aW5nT3JIb2xkaW5nQW5kQWN0aXZlIChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNjM0LDcgKzYzMiw3IEBACiAgICAgICogIkFkZHMgYSBoZWxkIGNhbGwgdG8gdGhlIGNvbnZlcnNhdGlvbiIKICAgICAgKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY29uZmVyZW5jZSAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTY1NCw3ICs2NTIsNyBAQAogICAgICAqICJDb25uZWN0cyB0aGUgdHdvIGNhbGxzIGFuZCBkaXNjb25uZWN0cyB0aGUgc3Vic2NyaWJlciBmcm9tIGJvdGggY2FsbHMiCiAgICAgICoKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV4cGxpY2l0Q2FsbFRyYW5zZmVyIChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNjkwLDcgKzY4OCw3IEBACiAgICAgLyoqCiAgICAgICoKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFjY2VwdENhbGwgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC03MDgsNyArNzA2LDcgQEAKICAgICAvKioKICAgICAgKiAgYWxzbyBrbm93biBhcyBVRFVCCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWplY3RDYWxsIChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNzg1LDcgKzc4Myw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gcmVzdWx0IGlzIGNhbGxiYWNrIG1lc3NhZ2UKICAgICAgKiAgICAgICAgKChBc3luY1Jlc3VsdClyZXNwb25zZS5vYmopLnJlc3VsdCAgaXMgYW4gaW50W10gd2l0aCBldmVyeQotICAgICAqICAgICAgICBlbGVtZW50IHJlcHJlc2VudGluZyBvbmUgYXZpYWxhYmxlIEJNXypfQkFORAorICAgICAqICAgICAgICBlbGVtZW50IHJlcHJlc2VudGluZyBvbmUgYXZhaWxhYmxlIEJNXypfQkFORAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHF1ZXJ5QXZhaWxhYmxlQmFuZE1vZGUgKE1lc3NhZ2UgcmVzdWx0KSB7CiAgICAgICAgIGludCByZXRbXSA9IG5ldyBpbnQgWzRdOwpAQCAtODk0LDcgKzg5Miw3IEBACiAKICAgICAvKioKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNlbmREdG1mKGNoYXIgYywgTWVzc2FnZSByZXN1bHQpIHsKQEAgLTkwMyw3ICs5MDEsNyBAQAogCiAgICAgLyoqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzdGFydER0bWYoY2hhciBjLCBNZXNzYWdlIHJlc3VsdCkgewpAQCAtOTEyLDcgKzkxMCw3IEBACiAKICAgICAvKioKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN0b3BEdG1mKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC05MjEsNyArOTE5LDcgQEAKIAogICAgIC8qKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2VuZEJ1cnN0RHRtZihTdHJpbmcgZHRtZlN0cmluZywgaW50IG9uLCBpbnQgb2ZmLCBNZXNzYWdlIHJlc3VsdCkgewpAQCAtOTU2LDYgKzk1NCw3IEBACiAgICAgICAgIHVuaW1wbGVtZW50ZWQocmVzcG9uc2UpOwogICAgIH0KIAorICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0dXBEZWZhdWx0UERQKFN0cmluZyBhcG4sIFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQsIE1lc3NhZ2UgcmVzdWx0KSB7CiAgICAgICAgIHVuaW1wbGVtZW50ZWQocmVzdWx0KTsKICAgICB9CkBAIC05NjcsOSArOTY2LDcgQEAKIAogICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGVEYXRhQ2FsbChpbnQgY2lkLCBNZXNzYWdlIHJlc3VsdCkge3VuaW1wbGVtZW50ZWQocmVzdWx0KTt9CiAKLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZURlZmF1bHRQRFAoaW50IGNpZCwgTWVzc2FnZSByZXN1bHQpIHt1bmltcGxlbWVudGVkKHJlc3VsdCk7fQogCiAgICAgcHVibGljIHZvaWQgc2V0UHJlZmVycmVkTmV0d29ya1R5cGUoaW50IG5ldHdvcmtUeXBlICwgTWVzc2FnZSByZXN1bHQpIHsKQEAgLTEwNDYsNyArMTA0Myw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogcGFyYW1ldGVycyBlcXVpdmlsaWVudCB0byAyNy4wMDcgQVQrQ1JTTSBjb21tYW5kCisgICAgICogcGFyYW1ldGVycyBlcXVpdmFsZW50IHRvIDI3LjAwNyBBVCtDUlNNIGNvbW1hbmQKICAgICAgKiByZXNwb25zZS5vYmogd2lsbCBiZSBhbiBBc3luY1Jlc3VsdAogICAgICAqIHJlc3BvbnNlLm9iai51c2VyT2JqIHdpbGwgYmUgYSBTaW1Jb1Jlc3VsdCBvbiBzdWNjZXNzCiAgICAgICovCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvbW9ja3JpbC9BbmRyb2lkLm1rIGIvdGVsZXBob255L21vY2tyaWwvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWFlODRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L21vY2tyaWwvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMwIEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjCisKK0xPQ0FMX1BBVEg6PSQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGNvcmUgZnJhbWV3b3JrCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBsaWJyaWxwcm90by1qYXZhCisKK0xPQ0FMX01PRFVMRSA6PSBtb2NrcmlsY29udHJvbGxlcgorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0pBVkFfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9tb2NrcmlsL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvbW9ja3JpbC9Nb2NrUmlsQ29udHJvbGxlci5qYXZhIGIvdGVsZXBob255L21vY2tyaWwvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9tb2NrcmlsL01vY2tSaWxDb250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUxMzliZAotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS9tb2NrcmlsL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvbW9ja3JpbC9Nb2NrUmlsQ29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255Lm1vY2tyaWw7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuY29tbXVuaWNhdGlvbi5Nc2dIZWFkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuY29tbXVuaWNhdGlvbi5Nc2c7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlJpbENoYW5uZWw7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDdHJsQ21kczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHM7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5taWNyby5NZXNzYWdlTWljcm87CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIENvbnRhaW4gYSBsaXN0IG9mIGNvbW1hbmRzIHRvIGNvbnRyb2wgTW9jayBSSUwuIEJlZm9yZSB1c2luZyB0aGVzZSBjb21tYW5kcyB0aGUgZGV2aWNlcworICogbmVlZHMgdG8gYmUgc2V0IHdpdGggTW9jayBSSUwuIFJlZmVyIHRvIGhhcmR3YXJlL3JpbC9tb2NrcmlsL1JFQURNRS50eHQgZm9yIGRldGFpbHMuCisgKgorICovCitwdWJsaWMgY2xhc3MgTW9ja1JpbENvbnRyb2xsZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTW9ja1JJTENvbnRyb2xsZXIiOworICAgIHByaXZhdGUgUmlsQ2hhbm5lbCBtUmlsQ2hhbm5lbCA9IG51bGw7CisgICAgcHJpdmF0ZSBNc2cgbU1lc3NhZ2UgPSBudWxsOworCisgICAgcHVibGljIE1vY2tSaWxDb250cm9sbGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbVJpbENoYW5uZWwgPSBSaWxDaGFubmVsLm1ha2VSaWxDaGFubmVsKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIGNoYW5uZWwgYWZ0ZXIgdGhlIGNvbW11bmljYXRpb24gaXMgZG9uZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSB0ZXN0IGlzIGZpbmlzaGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlQ2hhbm5lbCgpIHsKKyAgICAgICAgbVJpbENoYW5uZWwuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIGNvbW1hbmRzIGFuZCByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzCisgICAgICogQHBhcmFtIGNtZCBmb3IgTXNnSGVhZGVyCisgICAgICogQHBhcmFtIHRva2VuIGZvciBNc2dIZWFkZXIKKyAgICAgKiBAcGFyYW0gc3RhdHVzIGZvciBNc2dIZWFkZXIKKyAgICAgKiBAcGFyYW0gcGJEYXRhIGZvciBNc2cgZGF0YQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBjb21tYW5kIGlzIHNlbnQgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBpZiBpdCBmYWlscworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzZW5kQ3RybENvbW1hbmQoaW50IGNtZCwgbG9uZyB0b2tlbiwgaW50IHN0YXR1cywgTWVzc2FnZU1pY3JvIHBiRGF0YSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTXNnLnNlbmQobVJpbENoYW5uZWwsIGNtZCwgdG9rZW4sIHN0YXR1cywgcGJEYXRhKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAic2VuZCBjb21tYW5kIDogJWQgZmFpbGVkOiAiICsgZS5nZXRTdGFja1RyYWNlKCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBjb250cm9sIHJlc3BvbnNlCisgICAgICogQHJldHVybiBNc2cgaWYgcmVzcG9uc2UgaXMgcmVjZWl2ZWQsIGVsc2UgcmV0dXJuIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBNc2cgZ2V0Q3RybFJlc3BvbnNlKCkgeworICAgICAgICBNc2cgcmVzcG9uc2UgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2UgPSBNc2cucmVjdihtUmlsQ2hhbm5lbCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgInJlY2VpdmUgcmVzcG9uc2UgZm9yIGdldFJhZGlvU3RhdGUoKSBlcnJvcjogIiArIGUuZ2V0U3RhY2tUcmFjZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSByYWRpbyBzdGF0ZSBpZiBpdCBpcyB2YWxpZCwgb3RoZXJ3aXNlIHJldHVybiAtMQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmFkaW9TdGF0ZSgpIHsKKyAgICAgICAgaWYgKCFzZW5kQ3RybENvbW1hbmQoUmlsQ3RybENtZHMuQ1RSTF9DTURfR0VUX1JBRElPX1NUQVRFLCAwLCAwLCBudWxsKSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIE1zZyByZXNwb25zZSA9IGdldEN0cmxSZXNwb25zZSgpOworICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAiZmFpbGVkIHRvIGdldCByZXNwb25zZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJlc3BvbnNlLnByaW50SGVhZGVyKFRBRyk7CisgICAgICAgIFJpbEN0cmxDbWRzLkN0cmxSc3BSYWRpb1N0YXRlIHJlc3AgPQorICAgICAgICAgICAgcmVzcG9uc2UuZ2V0RGF0YUFzKFJpbEN0cmxDbWRzLkN0cmxSc3BSYWRpb1N0YXRlLmNsYXNzKTsKKyAgICAgICAgaW50IHN0YXRlID0gcmVzcC5nZXRTdGF0ZSgpOworICAgICAgICBpZiAoKHN0YXRlID49IFJpbENtZHMuUkFESU9TVEFURV9PRkYpICYmIChzdGF0ZSA8PSBSaWxDbWRzLlJBRElPU1RBVEVfTlZfUkVBRFkpKQorICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSByYWRpbyBzdGF0ZSBvZiBtb2NrIHJpbCB0byB0aGUgZ2l2ZW4gc3RhdGUKKyAgICAgKiBAcGFyYW0gc3RhdGUgZm9yIGdpdmVuIHJhZGlvIHN0YXRlCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdGF0ZSBpcyBzZXQgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgaXQgZmFpbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRSYWRpb1N0YXRlKGludCBzdGF0ZSkgeworICAgICAgICBSaWxDdHJsQ21kcy5DdHJsUmVxUmFkaW9TdGF0ZSByZXEgPSBuZXcgUmlsQ3RybENtZHMuQ3RybFJlcVJhZGlvU3RhdGUoKTsKKyAgICAgICAgaWYgKHN0YXRlIDwgMCB8fCBzdGF0ZSA+IFJpbENtZHMuUkFESU9TVEFURV9OVl9SRUFEWSkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAidGhlIGdpdmUgcmFkaW8gc3RhdGUgaXMgbm90IHZhbGlkLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJlcS5zZXRTdGF0ZShzdGF0ZSk7CisgICAgICAgIGlmICghc2VuZEN0cmxDb21tYW5kKFJpbEN0cmxDbWRzLkNUUkxfQ01EX1NFVF9SQURJT19TVEFURSwgMCwgMCwgcmVxKSkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAic2VuZCBzZXQgcmFkaW8gc3RhdGUgcmVxdWVzdCBmYWlsZWQuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgTXNnIHJlc3BvbnNlID0gZ2V0Q3RybFJlc3BvbnNlKCk7CisgICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJmYWlsZWQgdG8gZ2V0IHJlc3BvbnNlIGZvciBzZXRSYWRpb1N0YXRlIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmVzcG9uc2UucHJpbnRIZWFkZXIoVEFHKTsKKyAgICAgICAgUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUgcmVzcCA9CisgICAgICAgICAgICByZXNwb25zZS5nZXREYXRhQXMoUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUuY2xhc3MpOworICAgICAgICBpbnQgY3Vyc3RhdGUgPSByZXNwLmdldFN0YXRlKCk7CisgICAgICAgIHJldHVybiBjdXJzdGF0ZSA9PSBzdGF0ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL0FuZHJvaWQubWsgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczMWQwZAotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE0IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IG1vY2tyaWxjb250cm9sbGVyCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFRlbGVwaG9ueU1vY2tSaWxUZXN0cworCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2Y0NGEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisKKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZWxlcGhvbnltb2NrcmlsdGVzdHMiPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bGFiZWw9IlRlbGVwaG9ueU1vY2tSaWxUZXN0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iVGVsZXBob255TW9ja1JpbFRlc3QiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSIuVGVsZXBob255TW9ja1Rlc3RSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQudGVsZXBob255bW9ja3JpbHRlc3RzIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJUZXN0IHJ1bm5lciBmb3IgVGVsZXBob255IFRlc3RzIFVzaW5nIE1vY2sgUklMIgorICAgIC8+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfU1RBVEUiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9UZWxlcGhvbnlNb2NrVGVzdFJ1bm5lci5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255bW9ja3JpbHRlc3RzL1RlbGVwaG9ueU1vY2tUZXN0UnVubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhlZTczOAotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9UZWxlcGhvbnlNb2NrVGVzdFJ1bm5lci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZWxlcGhvbnltb2NrcmlsdGVzdHM7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFN1aXRlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5tb2NrcmlsLk1vY2tSaWxDb250cm9sbGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC50ZWxlcGhvbnltb2NrcmlsdGVzdHMuZnVuY3Rpb25hbC5TaW1wbGVUZXN0VXNpbmdNb2NrUmlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IHJ1bm5lciBmb3IgdGVsZXBob255IHRlc3RzIHRoYXQgdXNpbmcgTW9jayBSSUwKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUZWxlcGhvbnlNb2NrVGVzdFJ1bm5lciBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUc9IlRlbGVwaG9ueU1vY2tUZXN0UnVubmVyIjsKKyAgICBwdWJsaWMgTW9ja1JpbENvbnRyb2xsZXIgbUNvbnRyb2xsZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGVzdFN1aXRlIGdldEFsbFRlc3RzKCkgeworICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgSW5zdHJ1bWVudGF0aW9uVGVzdFN1aXRlKHRoaXMpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlVGVzdFVzaW5nTW9ja1JpbC5jbGFzcyk7CisgICAgICAgIHJldHVybiBzdWl0ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQ29udHJvbGxlciA9IG5ldyBNb2NrUmlsQ29udHJvbGxlcigpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZSgiQ3JlYXRlIE1vY2sgUklsIENvbnRyb2xsZXIgZmFpbGVkIiwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIFRlc3RDYXNlLmFzc2VydE5vdE51bGwobUNvbnRyb2xsZXIpOworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbmlzaChpbnQgcmVzdWx0Q29kZSwgQnVuZGxlIHJlc3VsdHMpIHsKKyAgICAgICAgaWYgKG1Db250cm9sbGVyICE9IG51bGwpCisgICAgICAgICAgICBtQ29udHJvbGxlci5jbG9zZUNoYW5uZWwoKTsKKyAgICAgICAgc3VwZXIuZmluaXNoKHJlc3VsdENvZGUsIHJlc3VsdHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9mdW5jdGlvbmFsL1NpbXBsZVRlc3RVc2luZ01vY2tSaWwuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9mdW5jdGlvbmFsL1NpbXBsZVRlc3RVc2luZ01vY2tSaWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWExY2YyCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255bW9ja3JpbHRlc3RzL2Z1bmN0aW9uYWwvU2ltcGxlVGVzdFVzaW5nTW9ja1JpbC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlbGVwaG9ueW1vY2tyaWx0ZXN0cy5mdW5jdGlvbmFsOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255Lm1vY2tyaWwuTW9ja1JpbENvbnRyb2xsZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC50ZWxlcGhvbnltb2NrcmlsdGVzdHMuVGVsZXBob255TW9ja1Rlc3RSdW5uZXI7CisKKy8qKgorICogQSBzaW1wbGUgdGVzdCB0aGF0IHVzaW5nIE1vY2sgUklMIENvbnRyb2xsZXIKKyAqLworcHVibGljIGNsYXNzIFNpbXBsZVRlc3RVc2luZ01vY2tSaWwgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTaW1wbGVUZXN0VXNpbmdNb2NrUmlsIjsKKyAgICBwcml2YXRlIE1vY2tSaWxDb250cm9sbGVyIG1Nb2NrUmlsQ3RybCA9IG51bGw7CisgICAgcHJpdmF0ZSBUZWxlcGhvbnlNb2NrVGVzdFJ1bm5lciBtUnVubmVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbVJ1bm5lciA9IChUZWxlcGhvbnlNb2NrVGVzdFJ1bm5lcilnZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgbU1vY2tSaWxDdHJsID0gbVJ1bm5lci5tQ29udHJvbGxlcjsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtTW9ja1JpbEN0cmwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCByYWRpbyBzdGF0ZSBvZiBSSUwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmFkaW9TdGF0ZSgpIHsKKyAgICAgICAgaW50IHN0YXRlID0gbU1vY2tSaWxDdHJsLmdldFJhZGlvU3RhdGUoKTsKKyAgICAgICAgTG9nLnYoVEFHLCAidGVzdEdldFJhZGlvU3RhdGU6ICIgKyBzdGF0ZSk7CisgICAgICAgIGFzc2VydFRydWUoc3RhdGUgPj0gMCAmJiBzdGF0ZSA8PSA5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGN1cnJlbnQgcmFkaW8gc3RhdGUgb2YgUklMCisgICAgICogYW5kIHZlcmlmeSB0aGUgcmFkaW8gc3RhdGUgaXMgc2V0IGNvcnJlY3RseQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRSYWRpb1N0YXRlKCkgeworICAgICAgICBmb3IgKGludCBzdGF0ZSA9IDA7IHN0YXRlIDw9IDk7IHN0YXRlKyspIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgInNldCByYWRpbyBzdGF0ZSB0byBiZSAiICsgc3RhdGUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgic2V0IHJhZGlvIHN0YXRlOiAiICsgc3RhdGUgKyAiIGZhaWxlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICBtTW9ja1JpbEN0cmwuc2V0UmFkaW9TdGF0ZShzdGF0ZSkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEZhbHNlKCJ1c2UgYW4gaW52YWxpZCByYWRpbyBzdGF0ZSIsIG1Nb2NrUmlsQ3RybC5zZXRSYWRpb1N0YXRlKC0xKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJ0aGUgcmFkaW8gc3RhdGUgZG9lc24ndCBleGlzdCIsIG1Nb2NrUmlsQ3RybC5zZXRSYWRpb1N0YXRlKDEwKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL0FuZHJvaWQubWsgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvQW5kcm9pZC5tawppbmRleCA0NWUyNjVhLi45OGU0NDAzIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvQW5kcm9pZC5taworKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvQW5kcm9pZC5tawpAQCAtNSw2ICs1LDggQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCiAKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBsaWJyaWxwcm90by1qYXZhCisKIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEZyYW1ld29ya3NUZWxlcGhvbnlUZXN0cwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA2YTk3NDIzLi5iYTFkOTU3IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMzIsNiArMzIsMTMgQEAKICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5mcmFtZXdvcmtzLnRlbGVwaG9ueXRlc3RzIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJGcmFtZXdvcmtzIFRlbGVwaG9ueSBUZXN0cyI+CiAgICAgPC9pbnN0cnVtZW50YXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iLlRlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmZyYW1ld29ya3MudGVsZXBob255dGVzdHMiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlc3QgUnVubmVyIGZvciBNb2NrIFJpbCBUZXN0cyIKKyAgICAvPgorCiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1BIT05FX1NUQVRFIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+CiAKIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNTliODEuLjAwMDAwMDAKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKLQotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlclV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBQaG9uZU51bWJlclV0aWxzVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3ROZXR3b3JrUG9ydGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIisxNzAwNTU1NDE0MSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIisxNzAwNTU1NDE0MSIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIrMTcwMDU1NTQxNDEiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDE0MSIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDE0MSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIjEgKDcwMCkuNTU1LTQxNDEiKQotICAgICAgICApOwotCi0gICAgICAgIC8vIFRoaXMgbWF5IHNlZW0gd3JvbmcsIGJ1dCBpdCdzIHByb2JhYmx5IG9rCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxNDEqIyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIjEgKDcwMCkuNTU1LTQxNDEqIyIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIjEgKDcwMCkuNTU1LTQxTk4iKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MU5OLDEyMzQiKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MU5OOzEyMzQiKQotICAgICAgICApOwotCi0gICAgICAgIC8vIEFuIE1NSSBzdHJpbmcgaXMgdW5wZXJ0ZXJiZWQsIGV2ZW4gdGhvdWdoIGl0IGNvbnRhaW5zIGEKLSAgICAgICAgLy8gKHZhbGlkIGluIHRoaXMgY2FzZSkgZW1iZWRkZWQgKwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIioqMjEqKjE3MDA1NTU0MTQxIyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIioqMjEqKisxNzAwNTU1NDE0MSMiKQotICAgICAgICAgICAgICAgIC8vVE9ETyB0aGlzIGlzIHRoZSBjb3JyZWN0IHJlc3VsdCwgYWx0aG91Z2ggdGhlIGFib3ZlCi0gICAgICAgICAgICAgICAgLy9yZXN1bHQgaGFzIGJlZW4gcmV0dXJuZWQgc2luY2UgY2hhbmdlIDMxNzc2Ci0gICAgICAgICAgICAgICAgLy8iKioyMSoqKzE3MDA1NTU0MTQxIyIKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiLDEyMzQiKSk7Ci0KLSAgICAgICAgYnl0ZSBbXSBiID0gbmV3IGJ5dGVbMjBdOwotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4RjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTcwMDU1NTAwMjAiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODA7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4RjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTcwMDU1NTAwMjAiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTA7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4RjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzE3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOwotICAgICAgICBhc3NlcnRFcXVhbHMoIisxNzAwNTU1MDAyMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKLQotICAgICAgICBieXRlW10gYlJldCA9IFBob25lTnVtYmVyVXRpbHMubmV0d29ya1BvcnRpb25Ub0NhbGxlZFBhcnR5QkNEKCIrMTcwMDU1NTAwMjAiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIGJSZXQubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA3OyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhiW2ldLCBiUmV0W2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJSZXQgPSBQaG9uZU51bWJlclV0aWxzLm5ldHdvcmtQb3J0aW9uVG9DYWxsZWRQYXJ0eUJDRFdpdGhMZW5ndGgoIisxNzAwNTU1MDAyMCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoOCwgYlJldC5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYlJldFswXSwgNyk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgODsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoYltpIC0gMV0sIGJSZXRbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgYlJldCA9IFBob25lTnVtYmVyVXRpbHMubmV0d29ya1BvcnRpb25Ub0NhbGxlZFBhcnR5QkNEKCI3MDA1NTUwMDIwIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiNzAwNTU1MDAyMCIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYlJldCwgMCwgYlJldC5sZW5ndGgpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4QjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTcwMDU1NTAwMjAjIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEIwOwotICAgICAgICBhc3NlcnRFcXVhbHMoIisxNzAwNTU1MDAyMCMiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHgyQTsgYlsyXSA9IChieXRlKSAweEIxOwotICAgICAgICBhc3NlcnRFcXVhbHMoIioyMSMiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDMpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHgyQjsgYlsyXSA9IChieXRlKSAweEIxOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiMyMSMiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDMpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHgyQTsgYlsyXSA9IChieXRlKSAweEIxOwotICAgICAgICBhc3NlcnRFcXVhbHMoIioyMSMrIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAzKSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4QUE7IGJbMl0gPSAoYnl0ZSkgMHgxMjsgYlszXSA9IChieXRlKSAweEZCOwotICAgICAgICBhc3NlcnRFcXVhbHMoIioqMjEjIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA0KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4QUE7IGJbMl0gPSAoYnl0ZSkgMHgxMjsgYlszXSA9IChieXRlKSAweEZCOwotICAgICAgICBhc3NlcnRFcXVhbHMoIioqMjEjKyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNCkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDlBOyBiWzJdID0gKGJ5dGUpIDB4QTk7IGJbM10gPSAoYnl0ZSkgMHg3MTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDAwOyBiWzVdID0gKGJ5dGUpIDB4NTU7IGJbNl0gPSAoYnl0ZSkgMHgwNTsgYls3XSA9IChieXRlKSAweDIwOwotICAgICAgICBiWzhdID0gKGJ5dGUpIDB4QjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKjk5KjE3MDA1NTUwMDIwIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgOSkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDlBOyBiWzJdID0gKGJ5dGUpIDB4QTk7IGJbM10gPSAoYnl0ZSkgMHg3MTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDAwOyBiWzVdID0gKGJ5dGUpIDB4NTU7IGJbNl0gPSAoYnl0ZSkgMHgwNTsgYls3XSA9IChieXRlKSAweDIwOwotICAgICAgICBiWzhdID0gKGJ5dGUpIDB4QjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKjk5KisxNzAwNTU1MDAyMCMiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHhBQTsgYlsyXSA9IChieXRlKSAweDEyOyBiWzNdID0gKGJ5dGUpIDB4MUE7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNzsgYls1XSA9IChieXRlKSAweDUwOyBiWzZdID0gKGJ5dGUpIDB4NTU7IGJbN10gPSAoYnl0ZSkgMHgwMDsKLSAgICAgICAgYls4XSA9IChieXRlKSAweDAyOyBiWzldID0gKGJ5dGUpIDB4RkI7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKioyMSoxNzAwNTU1MDAyMCMiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDEwKSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4QUE7IGJbMl0gPSAoYnl0ZSkgMHgxMjsgYlszXSA9IChieXRlKSAweDFBOwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDc7IGJbNV0gPSAoYnl0ZSkgMHg1MDsgYls2XSA9IChieXRlKSAweDU1OyBiWzddID0gKGJ5dGUpIDB4MDA7Ci0gICAgICAgIGJbOF0gPSAoYnl0ZSkgMHgwMjsgYls5XSA9IChieXRlKSAweEZCOwotICAgICAgICBhc3NlcnRFcXVhbHMoIioqMjEqKzE3MDA1NTUwMDIwIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMTApKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHgyQTsgYlsyXSA9IChieXRlKSAweEExOyBiWzNdID0gKGJ5dGUpIDB4NzE7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKLSAgICAgICAgYls4XSA9IChieXRlKSAweEYwOwotICAgICAgICBhc3NlcnRFcXVhbHMoIioyMSoxNzAwNTU1MDAyMCIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgOSkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDJBOyBiWzJdID0gKGJ5dGUpIDB4QjE7IGJbM10gPSAoYnl0ZSkgMHg3MTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDAwOyBiWzVdID0gKGJ5dGUpIDB4NTU7IGJbNl0gPSAoYnl0ZSkgMHgwNTsgYls3XSA9IChieXRlKSAweDIwOwotICAgICAgICBiWzhdID0gKGJ5dGUpIDB4RjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKjIxIysxNzAwNTU1MDAyMCIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgOSkpOwotCi0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24obnVsbCkpOwotICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbihudWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKG51bGwsIG51bGwpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKG51bGwsICIxMjMiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMTIzIiwgbnVsbCkpOwotICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKG51bGwpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQobnVsbCkpOwotICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuc3RyaW5nRnJvbVN0cmluZ0FuZFRPQShudWxsLCAxKSk7Ci0gICAgfQotCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0TmV0d29ya1BvcnRpb25BbHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIrMTcwMDU1NTQxNDEiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIrMTcwMDU1NTQxNDEiKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKzEgKDcwMCkuNTU1LTQxNDEiKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxNDEiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIxICg3MDApLjU1NS00MTQxIikKLSAgICAgICAgKTsKLQotICAgICAgICAvLyBUaGlzIG1heSBzZWVtIHdyb25nLCBidXQgaXQncyBwcm9iYWJseSBvawotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxKiMiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIxICg3MDApLjU1NS00MTQxKiMiKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIxICg3MDApLjU1NS00MU5OIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDFOTiwxMjM0IikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDFOTjsxMjM0IikKLSAgICAgICAgKTsKLQotICAgICAgICAvLyBBbiBNTUkgc3RyaW5nIGlzIHVucGVydGVyYmVkLCBldmVuIHRob3VnaCBpdCBjb250YWlucyBhCi0gICAgICAgIC8vICh2YWxpZCBpbiB0aGlzIGNhc2UpIGVtYmVkZGVkICsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIqKjIxKiorMTcwMDU1NTQxNDEjIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKioyMSoqKzE3MDA1NTU0MTQxIyIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIqMzEjKzQ0Nzk2NjE2NDIwOCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIiozMSMrNDQ3OTY2MTY0MjA4IikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIiozMSMrNDQ3OTY2MTY0MjA4IiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKjMxIyAoKzQ0KSA3OSA2NjE2IDQyMDgiKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIiIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIsMTIzNCIpKTsKLQotICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KG51bGwpKTsKLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MTQxIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxTk4iKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiLDEyMzQiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MU5OLDEyMzQiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiOzEyMzQiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MU5OOzEyMzQiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiOzEyMzQsO04iLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxTk47MS0yLjM0ICw7TiIpKTsKLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gdGhpcyBpcyBvZGQKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIiLCAiIikpOwotCi0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI5MTEiLCAiOTExIikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjkxMSIsICIxODAwNTU1MDkxMSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjU1NTUiLCAiNTU1NSIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI1NTU1IiwgIjE4MDA1NTU1NTU1NSIpKTsKLQotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIisxNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIrMSAoNzAwKS41NTUtNDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIrMSAoNzAwKS41NTUtNDE0MSwxMjM0IikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjE3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjcwMDU1NTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjE3MDA1NTU0MTQxIiwgIjU1NTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiMDExMTcwMDU1NTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiMDAxNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjE3MDA1NTU0MTQxIiwgIjAwMTcwMDU1NTQxNDEiKSk7Ci0KLQotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIioqMzEjKzE3MDA1NTU0MTQxIikpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzEgOTk5IDcwMDU1NTQxNDEiLCAiKzEgNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjAxMSAxIDcwMDU1NTQxNDEiLCAiNzAwNTU1NDE0MSIpKTsKLQotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjAxMSAxMSA3MDA1NTU0MTQxIiwgIisxNzAwNTU1NDE0MSIpKTsKLQotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICI3MDg1ODgyMzAwIikpOwotCi0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAgMjA3IDc5MiAzNDkwIikpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIwMCAyMDcgNzkyIDM0OTAiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIwMTEgMjA3IDc5MiAzNDkwIikpOwotCi0gICAgICAgIC8qKioqKiBGSVhNRSdzICoqKioqKi8KLSAgICAgICAgLy8KLSAgICAgICAgLy8gTU1JIGhlYWRlciBzaG91bGQgYmUgaWdub3JlZAotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIqKjMxIzE3MDA1NTU0MTQxIikpOwotCi0gICAgICAgIC8vIEl0J3MgdG9vIGJhZCB0aGlzIGlzIGZhbHNlCi0gICAgICAgIC8vICs0NCAoMCkgMjA3IDc5MiAzNDkwIGlzIG5vdCBhIGRpYWxhYmxlIG51bWJlcgotICAgICAgICAvLyBidXQgaXQgaXMgY29tbW9ubHkgaG93IEV1cm9wZWFuIHBob25lIG51bWJlcnMgYXJlIHdyaXR0ZW4KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIis0NCAoMCkgMjA3IDc5MiAzNDkwIikpOwotCi0gICAgICAgIC8vIFRoZSBqYXBhbmVzZSBpbnRlcm5hdGlvbmFsIHByZWZpeCwgZm9yIGV4YW1wbGUsIG1lc3NlcyB1cyB1cAotICAgICAgICAvLyBCdXQgd2hvIHVzZXMgYSBHU00gcGhvbmUgaW4gSmFwYW4/Ci0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIwMTAgNDQgMjA3IDc5MiAzNDkwIikpOwotCi0gICAgICAgIC8vIFRoZSBBdXN0cmFsaWFuIG9uZSBtZXNzZXMgdXMgdXAgdG9vCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIwMDExIDQ0IDIwNyA3OTIgMzQ5MCIpKTsKLQotICAgICAgICAvLyBUaGUgUnVzc2lhbiB0cnVuayBwcmVmaXggbWVzc2VzIHVzIHVwLCBhcyBkb2VzIGN1cnJlbnQKLSAgICAgICAgLy8gUnVzc2lhbiBhcmVhIGNvZGVzICh3aGljaCBiZWluIHdpdGggMCkKLQotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis3KDA5NSk5MTAwNzY2IiwgIjgoMDk1KTkxMDA3NjYiKSk7Ci0KLSAgICAgICAgLy8gNDQ0IGlzIG5vdCBhIHZhbGlkIGNvdW50cnkgY29kZSwgYnV0Ci0gICAgICAgIC8vIG1hdGNoSW50bFByZWZpeEFuZENDIGRvZXNudCBrbm93IHRoaXMKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NDQgMjA3IDc5MiAzNDkwIiwgIjAgMjA3IDc5MiAzNDkwIikpOwotCi0gICAgICAgIC8vIGNvbXBhcmUgU01TIHNob3J0IGNvZGUKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjQwNC0wNCIsICI0MDQwNCIpKTsKLSAgICB9Ci0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9DYWxsZXJJREluZGV4YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMTcwMDU1NTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxLTcwMC01NTUtNDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjEtNzAwLTU1NS00MTQxLDEyMzQiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxLTcwMC01NTUtNDE0MTsxMjM0IikpOwotCi0gICAgICAgIC8vdGhpcyBzZWVtcyB3cm9uZywgb3IgYXQgbGVhc3QgdXNlbGVzcwotICAgICAgICBhc3NlcnRFcXVhbHMoIk5OMTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxTk4iKSk7Ci0KLSAgICAgICAgLy88c2hydWc+IC0tIHRoZXNlIGFyZSBhbGwgbm90IHVzZWZ1bCwgYnV0IG5vdCB0ZXJyaWJseSB3cm9uZwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDAzMiIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIyMzAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMzIrIiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIisyMzAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiMxMzAjKiIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIqIzAzMSMiKSk7Ci0gICAgfQotCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbmRleGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1MDA3MSIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMS03MDAtNTU1LTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NTAwNzEiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjEtNzAwLTU1NS00MTQxLDEyMzQiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NTAwNzEiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjEtNzAwLTU1NS00MTQxOzEyMzQiKSk7Ci0KLSAgICAgICAgLy90aGlzIHNlZW1zIHdyb25nLCBvciBhdCBsZWFzdCB1c2VsZXNzCi0gICAgICAgIGFzc2VydEVxdWFscygiTk4xNDU1NTAwNzEiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjEtNzAwLTU1NS00MU5OIikpOwotCi0gICAgICAgIC8vPHNocnVnPiAtLSB0aGVzZSBhcmUgYWxsIG5vdCB1c2VmdWwsIGJ1dCBub3QgdGVycmlibHkgd3JvbmcKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIyMzAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMzIrIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIrMjMwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIjMTMwIyoiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIiojMDMxIyIpKTsKLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5hbnBGb3JtYXR0aW5nKCkgewotICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjgwMDU1NTEyMTIiKTsKLSAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROYW5wTnVtYmVyKG51bWJlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODAwLTU1NS0xMjEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIG51bWJlci5jbGVhcigpOwotICAgICAgICBudW1iZXIuYXBwZW5kKCI4MDA1NTUxMjEiKTsKLSAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROYW5wTnVtYmVyKG51bWJlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODAwLTU1NS0xMjEiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgbnVtYmVyLmNsZWFyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjU1NS0xMjEyIik7Ci0gICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjU1NS0xMjEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIG51bWJlci5jbGVhcigpOwotICAgICAgICBudW1iZXIuYXBwZW5kKCI4MDAtNTU1MTIiKTsKLSAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROYW5wTnVtYmVyKG51bWJlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODAwLTU1NS0xMiIsIG51bWJlci50b1N0cmluZygpKTsKLQotICAgICAgICBudW1iZXIuY2xlYXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiNDY2NDUiKTsKLSAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROYW5wTnVtYmVyKG51bWJlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiNDY2NDUiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoIjEtODAwLTQ2NjQtNDExIiwKLSAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiMS04MDAtR09PRy00MTEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTgwMDQ2NjQ0MTEiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIxODAwR09PRzQxMSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLTgwMC00NjYtNDQxMSIsCi0gICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjEtODAwLTQ2Ni00NDExIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjE4MDA0NjY0NDExIiwKLSAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiMTgwMDQ2NjQ0MTEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMjIyLTMzMy00NDQtNTU1LTY2Ni03Nzc3LTg4OC05OTk5IiwKLSAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFCQy1ERUYtR0hJLUpLTC1NTk8tUFFSUy1UVVYtV1hZWiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMjItMzMzLTQ0NC01NTUtNjY2LTc3NzctODg4LTk5OTkiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJjLWRlZi1naGktamtsLW1uby1wcXJzLXR1di13eHl6IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIig4MDApIDIyMi0zMzM0IiwKLSAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiKDgwMCkgQUJDLURFRkciKSk7Ci0gICAgfQotCi0gICAgLy8gVG8gcnVuIHRoaXMgdGVzdCwgdGhlIGRldmljZSBoYXMgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIG5ldHdvcmsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDExODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIis4NDc1Nzk3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzE4NDc1Nzk3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTEyMzQ1NjciLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMTIzNDU2NyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTEyMzQ1NjcwMDAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIisyMzQ1NjcwMDAwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTExMTg3NTc2NzgwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIisxMTg3NTc2NzgwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDE4NDc1MjMxNzUzIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwrMTg0NzUyMzE3NTMiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDExODQ3NTc5NzAwMCwxODQ3NTIzMTc1MyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIis4NDc1Nzk3MDAwLCsxODQ3NTIzMTc1MyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwOzAxMTg0NjkzMTIzNDUiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwOys4NDY5MzEyMzQ1IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsMDExMTIzNDU2NyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsKzEyMzQ1NjciKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTk3MDAwOzAxMTExODc1NzY3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTk3MDAwOysxMTg3NTc2NzAwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLCwwMTE4NDY5MzEyMzQ1IiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwsKzg0NjkzMTIzNDUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMDssMDExODQ2OTMxMjM0NSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7LCs4NDY5MzEyMzQ1IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsOzE4NDc1MjMxNzUzIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCw7KzE4NDc1MjMxNzUzIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7LDAxMTExODc1NzY3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMDssKzExODc1NzY3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsOzAxMTExODc1NzY3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCw7KzExODc1NzY3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsLCwwMTExMTg3NTc2NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsLCwrMTE4NzU3NjcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMDssLDAxMTExODc1NzY3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMDssLCsxMTg3NTc2NzAwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIrOyw4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzssODQ3NTc5NzAwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0Nys1NzktNzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0Nys1NzktNzAwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIsODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIiw4NDc1Nzk3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjs7ODQ3NTc5NzAwMCwsIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiOzs4NDc1Nzk3MDAwLCwiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiK3RoaXMraXMkd2VpcmQ7LCsiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrdGhpcytpcyR3ZWlyZDssKyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIiKSk7Ci0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUobnVsbCkpOwotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCxQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9KQVBBTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX1VOS05PV04pKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfSkFQQU4sUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfSkFQQU4pKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfVU5LTk9XTixQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9VTktOT1dOKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmFzaWMgY2hlY2tzIGZvciB0aGUgVm9pY2VNYWlsIG51bWJlci4KLSAgICAgKi8KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFdpdGhOdW1iZXJOb3RFcXVhbFRvVm9pY2VNYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoIjkxMSIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcigidGVsOjkxMSIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcigiKzE4MDAxMjM0NTY3IikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCIiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIobnVsbCkpOwotICAgICAgICAvLyBUaGlzIHRlc3QgZmFpbHMgb24gYSBkZXZpY2Ugd2l0aG91dCBhIHNpbSBjYXJkCi0gICAgICAgIC8qVGVsZXBob255TWFuYWdlciBtVGVsZXBob255TWFuYWdlciA9Ci0gICAgICAgICAgICAoVGVsZXBob255TWFuYWdlcilnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlRFTEVQSE9OWV9TRVJWSUNFKTsKLSAgICAgICAgU3RyaW5nIG1Wb2ljZU1haWxOdW1iZXIgPSBtVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0Vm9pY2VNYWlsTnVtYmVyKCk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcihtVm9pY2VNYWlsTnVtYmVyKSk7Ci0gICAgICAgICovCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlcldhdGNoZXJUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhlYWVjZC4uMDAwMDAwMAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKLQotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyOwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFdhdGNoZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBQaG9uZU51bWJlcldhdGNoZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SHlwaGVuYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBUZXh0V2F0Y2hlciB0dyA9IG5ldyBQaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlcigpOwotICAgICAgICBudW1iZXIuYXBwZW5kKCI1NTUtMTIxMiIpOwotICAgICAgICAvLyBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGxlZnQgZWRnZQotICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgMCk7Ci0gICAgICAgIHR3LmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgMCwgMCwgMSk7Ci0gICAgICAgIC8vIEluc2VydCBhbiA4IGF0IHRoZSBiZWdpbm5pbmcKLSAgICAgICAgbnVtYmVyLmluc2VydCgwLCAiOCIpOwotICAgICAgICB0dy5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODU1LTUxMi0xMiIsIG51bWJlci50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIeXBoZW5EZWxldGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIFRleHRXYXRjaGVyIHR3ID0gbmV3IFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjU1NS0xMjEyIik7Ci0gICAgICAgIC8vIE1vdmUgdGhlIGN1cnNvciB0byBhZnRlciB0aGUgaHlwaGVuCi0gICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCA0KTsKLSAgICAgICAgLy8gRGVsZXRlIHRoZSBoeXBoZW4KLSAgICAgICAgdHcuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCAzLCAxLCAwKTsKLSAgICAgICAgbnVtYmVyLmRlbGV0ZSgzLCA0KTsKLSAgICAgICAgdHcuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOwotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBpdCBkZWxldGVkIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBoeXBoZW4gCi0gICAgICAgIGFzc2VydEVxdWFscygiNTUxLTIxMiIsIG51bWJlci50b1N0cmluZygpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBpdCBkZWFscyB3aXRoIGxlZnQgZWRnZSBib3VuZGFyeSBjYXNlCi0gICAgICAgIG51bWJlci5pbnNlcnQoMCwgIi0iKTsKLSAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDEpOwotICAgICAgICB0dy5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDAsIDEsIDApOwotICAgICAgICBudW1iZXIuZGVsZXRlKDAsIDEpOwotICAgICAgICB0dy5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGl0IGRlbGV0ZWQgdGhlIGNoYXJhY3RlciBiZWZvcmUgdGhlIGh5cGhlbiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI1NTEtMjEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvZnJhbWV3b3Jrcy90ZWxlcGhvbnl0ZXN0cy9UZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lci5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9mcmFtZXdvcmtzL3RlbGVwaG9ueXRlc3RzL1RlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5MmY1NwotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvZnJhbWV3b3Jrcy90ZWxlcGhvbnl0ZXN0cy9UZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lci5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5mcmFtZXdvcmtzLnRlbGVwaG9ueXRlc3RzOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFN1aXRlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlJpbENoYW5uZWw7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255Lm1vY2tyaWwuTW9ja1JpbFRlc3Q7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitwdWJsaWMgY2xhc3MgVGVsZXBob255TW9ja1JpbFRlc3RSdW5uZXIgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIHsKKworICAgIHB1YmxpYyBSaWxDaGFubmVsIG1Nb2NrUmlsQ2hhbm5lbDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXN0U3VpdGUgZ2V0QWxsVGVzdHMoKSB7CisgICAgICAgIGxvZygiZ2V0QWxsVGVzdHMgRSIpOworICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgSW5zdHJ1bWVudGF0aW9uVGVzdFN1aXRlKHRoaXMpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTW9ja1JpbFRlc3QuY2xhc3MpOworICAgICAgICBsb2coImdldEFsbFRlc3RzIFgiKTsKKyAgICAgICAgcmV0dXJuIHN1aXRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRMb2FkZXIoKSB7CisgICAgICAgIGxvZygiZ2V0TG9hZGVyIEVYIik7CisgICAgICAgIHJldHVybiBUZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgbG9nKCJvbkNyZWF0ZSBFIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtTW9ja1JpbENoYW5uZWwgPSBSaWxDaGFubmVsLm1ha2VSaWxDaGFubmVsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgbG9nKCJvbkNyZWF0ZSBYIik7CisKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIC8vIEkndmUgbm90IHNlZW4gdGhpcyBjYWxsZWQKKyAgICAgICAgbG9nKCJvbkRlc3Ryb3kgRVgiKTsKKyAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKKyAgICAgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGluc3RydW1lbnRhdGlvbiB0aHJlYWQgaXMgc3RhcnRlZC4KKyAgICAgICAgLy8gQXQgdGhlIG1vbWVudCB3ZSBkb24ndCBuZWVkIHRoZSB0aHJlYWQgc28gcmV0dXJuCisgICAgICAgIC8vIHdoaWNoIHdpbGwgc2h1dCBkb3duIHRoaXMgdW51c2VkIHRocmVhZC4KKyAgICAgICAgbG9nKCJvblN0YXJ0IEVYIik7CisgICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2goaW50IHJlc3VsdENvZGUsIEJ1bmRsZSByZXN1bHRzKSB7CisgICAgICAgIC8vIENhbGxlZCB3aGVuIGNvbXBsZXRlIHNvIEkgYXNrIHRoZSBtTW9ja1JpbENoYW5uZWwgdG8gcXVpdC4KKyAgICAgICAgbG9nKCJmaW5pc2ggRSIpOworICAgICAgICBtTW9ja1JpbENoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgbG9nKCJmaW5pc2ggWCIpOworICAgICAgICBzdXBlci5maW5pc2gocmVzdWx0Q29kZSwgcmVzdWx0cyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgcykgeworICAgICAgICBMb2cuZSgiVGVsZXBob255TW9ja1JpbFRlc3RSdW5uZXIiLCBzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldFRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0VGVzdC5qYXZhCmluZGV4IDNhOWM1MTEuLmE2YjlhMmEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0VGVzdC5qYXZhCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0VGVzdC5qYXZhCkBAIC01MSw3ICs1MSw3IEBACiAgICAgICAgIC8vICdAJyBtYXBzIHRvIGNoYXIgMAogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgR3NtQWxwaGFiZXQuY2hhclRvR3NtKCdAJykpOwogCi0gICAgICAgIC8vIGBhIChhIHdpdGggZ3JhdmUgYWNjZW50KSBtYXBzIHRvIGxhc3QgR1NNIGNoYXJhdGVyCisgICAgICAgIC8vIGBhIChhIHdpdGggZ3JhdmUgYWNjZW50KSBtYXBzIHRvIGxhc3QgR1NNIGNoYXJhY3RlcgogICAgICAgICBhc3NlcnRFcXVhbHMoMHg3ZiwgR3NtQWxwaGFiZXQuY2hhclRvR3NtKCdcdTAwZTAnKSk7CiAKICAgICAgICAgLy8KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbVNtc1Rlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbVNtc1Rlc3QuamF2YQppbmRleCAzMTAzZmMxLi4yMTVjNmNlIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21TbXNUZXN0LmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtU21zVGVzdC5qYXZhCkBAIC0yNCw4ICsyNCw2IEBACiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwogCi1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQogcHVibGljIGNsYXNzIEdzbVNtc1Rlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewogCiAgICAgQFNtYWxsVGVzdApkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGVUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZVRlc3QuamF2YQppbmRleCAyZDY5NzdjLi43ZWIzZGY4IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZVRlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZVRlc3QuamF2YQpAQCAtMjgsNyArMjgsNyBAQAogCiAgICAgQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lWm9uZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoTWNjVGFibGUuZGVmYXVsdFRpbWVab25lRm9yTWNjKDIwOCksICJFdXJvcGUvUGFyaXMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1jY1RhYmxlLmRlZmF1bHRUaW1lWm9uZUZvck1jYygyMDgpLCAiRUNUIik7CiAgICAgICAgIGFzc2VydEVxdWFscyhNY2NUYWJsZS5kZWZhdWx0VGltZVpvbmVGb3JNY2MoMjMyKSwgIkV1cm9wZS9WaWVubmEiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKE1jY1RhYmxlLmRlZmF1bHRUaW1lWm9uZUZvck1jYyg2NTUpLCAiQWZyaWNhL0pvaGFubmVzYnVyZyIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoTWNjVGFibGUuZGVmYXVsdFRpbWVab25lRm9yTWNjKDQ0MCksICJBc2lhL1Rva3lvIik7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGE2ZjUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YQpAQCAtMCwwICsxLDUzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OworCitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7CisKK3B1YmxpYyBjbGFzcyBQaG9uZU51bWJlclV0aWxzVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3ROZXR3b3JrUG9ydGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIisxNzAwNTU1NDE0MSIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIisxNzAwNTU1NDE0MSIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIrMTcwMDU1NTQxNDEiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDE0MSIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIxNzAwNTU1NDE0MSIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIjEgKDcwMCkuNTU1LTQxNDEiKQorICAgICAgICApOworCisgICAgICAgIC8vIFRoaXMgbWF5IHNlZW0gd3JvbmcsIGJ1dCBpdCdzIHByb2JhYmx5IG9rCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxNDEqIyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIjEgKDcwMCkuNTU1LTQxNDEqIyIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIjEgKDcwMCkuNTU1LTQxTk4iKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MU5OLDEyMzQiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MU5OOzEyMzQiKQorICAgICAgICApOworCisgICAgICAgIC8vIEFuIE1NSSBzdHJpbmcgaXMgdW5wZXJ0ZXJiZWQsIGV2ZW4gdGhvdWdoIGl0IGNvbnRhaW5zIGEKKyAgICAgICAgLy8gKHZhbGlkIGluIHRoaXMgY2FzZSkgZW1iZWRkZWQgKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIioqMjEqKjE3MDA1NTU0MTQxIyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIioqMjEqKisxNzAwNTU1NDE0MSMiKQorICAgICAgICAgICAgICAgIC8vVE9ETyB0aGlzIGlzIHRoZSBjb3JyZWN0IHJlc3VsdCwgYWx0aG91Z2ggdGhlIGFib3ZlCisgICAgICAgICAgICAgICAgLy9yZXN1bHQgaGFzIGJlZW4gcmV0dXJuZWQgc2luY2UgY2hhbmdlIDMxNzc2CisgICAgICAgICAgICAgICAgLy8iKioyMSoqKzE3MDA1NTU0MTQxIyIKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiLDEyMzQiKSk7CisKKyAgICAgICAgYnl0ZSBbXSBiID0gbmV3IGJ5dGVbMjBdOworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4RjA7CisgICAgICAgIGFzc2VydEVxdWFscygiMTcwMDU1NTAwMjAiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODA7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4RjA7CisgICAgICAgIGFzc2VydEVxdWFscygiMTcwMDU1NTAwMjAiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTA7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4RjA7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE3MDA1NTUwMDIwIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIisxNzAwNTU1MDAyMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKKworICAgICAgICBieXRlW10gYlJldCA9IFBob25lTnVtYmVyVXRpbHMubmV0d29ya1BvcnRpb25Ub0NhbGxlZFBhcnR5QkNEKCIrMTcwMDU1NTAwMjAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIGJSZXQubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA3OyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhiW2ldLCBiUmV0W2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGJSZXQgPSBQaG9uZU51bWJlclV0aWxzLm5ldHdvcmtQb3J0aW9uVG9DYWxsZWRQYXJ0eUJDRFdpdGhMZW5ndGgoIisxNzAwNTU1MDAyMCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoOCwgYlJldC5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoYlJldFswXSwgNyk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYltpIC0gMV0sIGJSZXRbaV0pOworICAgICAgICB9CisKKyAgICAgICAgYlJldCA9IFBob25lTnVtYmVyVXRpbHMubmV0d29ya1BvcnRpb25Ub0NhbGxlZFBhcnR5QkNEKCI3MDA1NTUwMDIwIik7CisgICAgICAgIGFzc2VydEVxdWFscygiNzAwNTU1MDAyMCIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYlJldCwgMCwgYlJldC5sZW5ndGgpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4QjA7CisgICAgICAgIGFzc2VydEVxdWFscygiMTcwMDU1NTAwMjAjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEIwOworICAgICAgICBhc3NlcnRFcXVhbHMoIisxNzAwNTU1MDAyMCMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHgyQTsgYlsyXSA9IChieXRlKSAweEIxOworICAgICAgICBhc3NlcnRFcXVhbHMoIioyMSMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDMpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHgyQjsgYlsyXSA9IChieXRlKSAweEIxOworICAgICAgICBhc3NlcnRFcXVhbHMoIiMyMSMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDMpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHgyQTsgYlsyXSA9IChieXRlKSAweEIxOworICAgICAgICBhc3NlcnRFcXVhbHMoIioyMSMrIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAzKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4QUE7IGJbMl0gPSAoYnl0ZSkgMHgxMjsgYlszXSA9IChieXRlKSAweEZCOworICAgICAgICBhc3NlcnRFcXVhbHMoIioqMjEjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA0KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4QUE7IGJbMl0gPSAoYnl0ZSkgMHgxMjsgYlszXSA9IChieXRlKSAweEZCOworICAgICAgICBhc3NlcnRFcXVhbHMoIioqMjEjKyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNCkpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDlBOyBiWzJdID0gKGJ5dGUpIDB4QTk7IGJbM10gPSAoYnl0ZSkgMHg3MTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDAwOyBiWzVdID0gKGJ5dGUpIDB4NTU7IGJbNl0gPSAoYnl0ZSkgMHgwNTsgYls3XSA9IChieXRlKSAweDIwOworICAgICAgICBiWzhdID0gKGJ5dGUpIDB4QjA7CisgICAgICAgIGFzc2VydEVxdWFscygiKjk5KjE3MDA1NTUwMDIwIyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgOSkpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDlBOyBiWzJdID0gKGJ5dGUpIDB4QTk7IGJbM10gPSAoYnl0ZSkgMHg3MTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDAwOyBiWzVdID0gKGJ5dGUpIDB4NTU7IGJbNl0gPSAoYnl0ZSkgMHgwNTsgYls3XSA9IChieXRlKSAweDIwOworICAgICAgICBiWzhdID0gKGJ5dGUpIDB4QjA7CisgICAgICAgIGFzc2VydEVxdWFscygiKjk5KisxNzAwNTU1MDAyMCMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHhBQTsgYlsyXSA9IChieXRlKSAweDEyOyBiWzNdID0gKGJ5dGUpIDB4MUE7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNzsgYls1XSA9IChieXRlKSAweDUwOyBiWzZdID0gKGJ5dGUpIDB4NTU7IGJbN10gPSAoYnl0ZSkgMHgwMDsKKyAgICAgICAgYls4XSA9IChieXRlKSAweDAyOyBiWzldID0gKGJ5dGUpIDB4RkI7CisgICAgICAgIGFzc2VydEVxdWFscygiKioyMSoxNzAwNTU1MDAyMCMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDEwKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4QUE7IGJbMl0gPSAoYnl0ZSkgMHgxMjsgYlszXSA9IChieXRlKSAweDFBOworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDc7IGJbNV0gPSAoYnl0ZSkgMHg1MDsgYls2XSA9IChieXRlKSAweDU1OyBiWzddID0gKGJ5dGUpIDB4MDA7CisgICAgICAgIGJbOF0gPSAoYnl0ZSkgMHgwMjsgYls5XSA9IChieXRlKSAweEZCOworICAgICAgICBhc3NlcnRFcXVhbHMoIioqMjEqKzE3MDA1NTUwMDIwIyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMTApKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHgyQTsgYlsyXSA9IChieXRlKSAweEExOyBiWzNdID0gKGJ5dGUpIDB4NzE7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKKyAgICAgICAgYls4XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIioyMSoxNzAwNTU1MDAyMCIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgOSkpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDJBOyBiWzJdID0gKGJ5dGUpIDB4QjE7IGJbM10gPSAoYnl0ZSkgMHg3MTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDAwOyBiWzVdID0gKGJ5dGUpIDB4NTU7IGJbNl0gPSAoYnl0ZSkgMHgwNTsgYls3XSA9IChieXRlKSAweDIwOworICAgICAgICBiWzhdID0gKGJ5dGUpIDB4RjA7CisgICAgICAgIGFzc2VydEVxdWFscygiKjIxIysxNzAwNTU1MDAyMCIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgOSkpOworCisgICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24obnVsbCkpOworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbihudWxsKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKG51bGwsICIxMjMiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMTIzIiwgbnVsbCkpOworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQobnVsbCkpOworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuc3RyaW5nRnJvbVN0cmluZ0FuZFRPQShudWxsLCAxKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0TmV0d29ya1BvcnRpb25BbHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIrMTcwMDU1NTQxNDEiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIrMTcwMDU1NTQxNDEiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKzEgKDcwMCkuNTU1LTQxNDEiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxNDEiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIxICg3MDApLjU1NS00MTQxIikKKyAgICAgICAgKTsKKworICAgICAgICAvLyBUaGlzIG1heSBzZWVtIHdyb25nLCBidXQgaXQncyBwcm9iYWJseSBvaworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxKiMiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIxICg3MDApLjU1NS00MTQxKiMiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIxICg3MDApLjU1NS00MU5OIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDFOTiwxMjM0IikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDFOTjsxMjM0IikKKyAgICAgICAgKTsKKworICAgICAgICAvLyBBbiBNTUkgc3RyaW5nIGlzIHVucGVydGVyYmVkLCBldmVuIHRob3VnaCBpdCBjb250YWlucyBhCisgICAgICAgIC8vICh2YWxpZCBpbiB0aGlzIGNhc2UpIGVtYmVkZGVkICsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIqKjIxKiorMTcwMDU1NTQxNDEjIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKioyMSoqKzE3MDA1NTU0MTQxIyIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIqMzEjKzQ0Nzk2NjE2NDIwOCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIiozMSMrNDQ3OTY2MTY0MjA4IikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIiozMSMrNDQ3OTY2MTY0MjA4IiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKjMxIyAoKzQ0KSA3OSA2NjE2IDQyMDgiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIiIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIsMTIzNCIpKTsKKworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KG51bGwpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxNzAwNTU1NDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MTQxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxTk4iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiLDEyMzQiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MU5OLDEyMzQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiOzEyMzQiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MU5OOzEyMzQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiOzEyMzQsO04iLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxTk47MS0yLjM0ICw7TiIpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdGhpcyBpcyBvZGQKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIiLCAiIikpOworCisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI5MTEiLCAiOTExIikpOworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjkxMSIsICIxODAwNTU1MDkxMSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjU1NTUiLCAiNTU1NSIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI1NTU1IiwgIjE4MDA1NTU1NTU1NSIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIisxNzAwNTU1NDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIrMSAoNzAwKS41NTUtNDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIrMSAoNzAwKS41NTUtNDE0MSwxMjM0IikpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjE3MDA1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiNTU1NDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjE3MDA1NTU0MTQxIiwgIjU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiMDExMTcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiMDAxNzAwNTU1NDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjE3MDA1NTU0MTQxIiwgIjAwMTcwMDU1NTQxNDEiKSk7CisKKworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIioqMzEjKzE3MDA1NTU0MTQxIikpOworCisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzEgOTk5IDcwMDU1NTQxNDEiLCAiKzEgNzAwNTU1NDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjAxMSAxIDcwMDU1NTQxNDEiLCAiNzAwNTU1NDE0MSIpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjAxMSAxMSA3MDA1NTU0MTQxIiwgIisxNzAwNTU1NDE0MSIpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICI3MDg1ODgyMzAwIikpOworCisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAgMjA3IDc5MiAzNDkwIikpOworCisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIwMCAyMDcgNzkyIDM0OTAiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIwMTEgMjA3IDc5MiAzNDkwIikpOworCisgICAgICAgIC8qKioqKiBGSVhNRSdzICoqKioqKi8KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTU1JIGhlYWRlciBzaG91bGQgYmUgaWdub3JlZAorICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIqKjMxIzE3MDA1NTU0MTQxIikpOworCisgICAgICAgIC8vIEl0J3MgdG9vIGJhZCB0aGlzIGlzIGZhbHNlCisgICAgICAgIC8vICs0NCAoMCkgMjA3IDc5MiAzNDkwIGlzIG5vdCBhIGRpYWxhYmxlIG51bWJlcgorICAgICAgICAvLyBidXQgaXQgaXMgY29tbW9ubHkgaG93IEV1cm9wZWFuIHBob25lIG51bWJlcnMgYXJlIHdyaXR0ZW4KKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIis0NCAoMCkgMjA3IDc5MiAzNDkwIikpOworCisgICAgICAgIC8vIFRoZSBqYXBhbmVzZSBpbnRlcm5hdGlvbmFsIHByZWZpeCwgZm9yIGV4YW1wbGUsIG1lc3NlcyB1cyB1cAorICAgICAgICAvLyBCdXQgd2hvIHVzZXMgYSBHU00gcGhvbmUgaW4gSmFwYW4/CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIwMTAgNDQgMjA3IDc5MiAzNDkwIikpOworCisgICAgICAgIC8vIFRoZSBBdXN0cmFsaWFuIG9uZSBtZXNzZXMgdXMgdXAgdG9vCisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIwMDExIDQ0IDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvLyBUaGUgUnVzc2lhbiB0cnVuayBwcmVmaXggbWVzc2VzIHVzIHVwLCBhcyBkb2VzIGN1cnJlbnQKKyAgICAgICAgLy8gUnVzc2lhbiBhcmVhIGNvZGVzICh3aGljaCBiZWluIHdpdGggMCkKKworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis3KDA5NSk5MTAwNzY2IiwgIjgoMDk1KTkxMDA3NjYiKSk7CisKKyAgICAgICAgLy8gNDQ0IGlzIG5vdCBhIHZhbGlkIGNvdW50cnkgY29kZSwgYnV0CisgICAgICAgIC8vIG1hdGNoSW50bFByZWZpeEFuZENDIGRvZXNudCBrbm93IHRoaXMKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NDQgMjA3IDc5MiAzNDkwIiwgIjAgMjA3IDc5MiAzNDkwIikpOworCisgICAgICAgIC8vIGNvbXBhcmUgU01TIHNob3J0IGNvZGUKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjQwNC0wNCIsICI0MDQwNCIpKTsKKyAgICB9CisKKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9DYWxsZXJJREluZGV4YWJsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMTcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxLTcwMC01NTUtNDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjEtNzAwLTU1NS00MTQxLDEyMzQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxLTcwMC01NTUtNDE0MTsxMjM0IikpOworCisgICAgICAgIC8vdGhpcyBzZWVtcyB3cm9uZywgb3IgYXQgbGVhc3QgdXNlbGVzcworICAgICAgICBhc3NlcnRFcXVhbHMoIk5OMTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxTk4iKSk7CisKKyAgICAgICAgLy88c2hydWc+IC0tIHRoZXNlIGFyZSBhbGwgbm90IHVzZWZ1bCwgYnV0IG5vdCB0ZXJyaWJseSB3cm9uZworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDAzMiIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIyMzAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMzIrIiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIisyMzAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiMxMzAjKiIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIqIzAzMSMiKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbmRleGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1MDA3MSIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMS03MDAtNTU1LTQxNDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NTAwNzEiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjEtNzAwLTU1NS00MTQxLDEyMzQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NTAwNzEiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjEtNzAwLTU1NS00MTQxOzEyMzQiKSk7CisKKyAgICAgICAgLy90aGlzIHNlZW1zIHdyb25nLCBvciBhdCBsZWFzdCB1c2VsZXNzCisgICAgICAgIGFzc2VydEVxdWFscygiTk4xNDU1NTAwNzEiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjEtNzAwLTU1NS00MU5OIikpOworCisgICAgICAgIC8vPHNocnVnPiAtLSB0aGVzZSBhcmUgYWxsIG5vdCB1c2VmdWwsIGJ1dCBub3QgdGVycmlibHkgd3JvbmcKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIyMzAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMzIrIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIrMjMwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIjMTMwIyoiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIiojMDMxIyIpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5hbnBGb3JtYXR0aW5nKCkgeworICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIG51bWJlci5hcHBlbmQoIjgwMDU1NTEyMTIiKTsKKyAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROYW5wTnVtYmVyKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscygiODAwLTU1NS0xMjEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOworCisgICAgICAgIG51bWJlci5jbGVhcigpOworICAgICAgICBudW1iZXIuYXBwZW5kKCI4MDA1NTUxMjEiKTsKKyAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROYW5wTnVtYmVyKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscygiODAwLTU1NS0xMjEiLCBudW1iZXIudG9TdHJpbmcoKSk7CisKKyAgICAgICAgbnVtYmVyLmNsZWFyKCk7CisgICAgICAgIG51bWJlci5hcHBlbmQoIjU1NS0xMjEyIik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjU1NS0xMjEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOworCisgICAgICAgIG51bWJlci5jbGVhcigpOworICAgICAgICBudW1iZXIuYXBwZW5kKCI4MDAtNTU1MTIiKTsKKyAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROYW5wTnVtYmVyKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscygiODAwLTU1NS0xMiIsIG51bWJlci50b1N0cmluZygpKTsKKworICAgICAgICBudW1iZXIuY2xlYXIoKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZCgiNDY2NDUiKTsKKyAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROYW5wTnVtYmVyKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscygiNDY2NDUiLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIjEtODAwLTQ2NjQtNDExIiwKKyAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiMS04MDAtR09PRy00MTEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTgwMDQ2NjQ0MTEiLAorICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIxODAwR09PRzQxMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLTgwMC00NjYtNDQxMSIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjEtODAwLTQ2Ni00NDExIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE4MDA0NjY0NDExIiwKKyAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiMTgwMDQ2NjQ0MTEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMjIyLTMzMy00NDQtNTU1LTY2Ni03Nzc3LTg4OC05OTk5IiwKKyAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFCQy1ERUYtR0hJLUpLTC1NTk8tUFFSUy1UVVYtV1hZWiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMjItMzMzLTQ0NC01NTUtNjY2LTc3NzctODg4LTk5OTkiLAorICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJjLWRlZi1naGktamtsLW1uby1wcXJzLXR1di13eHl6IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIig4MDApIDIyMi0zMzM0IiwKKyAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiKDgwMCkgQUJDLURFRkciKSk7CisgICAgfQorCisgICAgLy8gVG8gcnVuIHRoaXMgdGVzdCwgdGhlIGRldmljZSBoYXMgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIG5ldHdvcmsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiMDExODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIis4NDc1Nzk3MDAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzE4NDc1Nzk3MDAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTEyMzQ1NjciLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMTIzNDU2NyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTEyMzQ1NjcwMDAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIisyMzQ1NjcwMDAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTExMTg3NTc2NzgwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIisxMTg3NTc2NzgwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDE4NDc1MjMxNzUzIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwrMTg0NzUyMzE3NTMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDExODQ3NTc5NzAwMCwxODQ3NTIzMTc1MyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIis4NDc1Nzk3MDAwLCsxODQ3NTIzMTc1MyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwOzAxMTg0NjkzMTIzNDUiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwOys4NDY5MzEyMzQ1IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsMDExMTIzNDU2NyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsKzEyMzQ1NjciKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTk3MDAwOzAxMTExODc1NzY3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTk3MDAwOysxMTg3NTc2NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLCwwMTE4NDY5MzEyMzQ1IiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwsKzg0NjkzMTIzNDUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMDssMDExODQ2OTMxMjM0NSIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7LCs4NDY5MzEyMzQ1IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsOzE4NDc1MjMxNzUzIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCw7KzE4NDc1MjMxNzUzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7LDAxMTExODc1NzY3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMDssKzExODc1NzY3MDAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsOzAxMTExODc1NzY3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCw7KzExODc1NzY3MDAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsLCwwMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsLCwrMTE4NzU3NjcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMDssLDAxMTExODc1NzY3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMDssLCsxMTg3NTc2NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrOyw4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzssODQ3NTc5NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0Nys1NzktNzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0Nys1NzktNzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIsODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIiw4NDc1Nzk3MDAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjs7ODQ3NTc5NzAwMCwsIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiOzs4NDc1Nzk3MDAwLCwiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiK3RoaXMraXMkd2VpcmQ7LCsiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrdGhpcytpcyR3ZWlyZDssKyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIiKSk7CisgICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUobnVsbCkpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCxQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9KQVBBTikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIisxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX1VOS05PV04pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfSkFQQU4sUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfSkFQQU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfVU5LTk9XTixQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9VTktOT1dOKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmFzaWMgY2hlY2tzIGZvciB0aGUgVm9pY2VNYWlsIG51bWJlci4KKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhOdW1iZXJOb3RFcXVhbFRvVm9pY2VNYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoIjkxMSIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcigidGVsOjkxMSIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcigiKzE4MDAxMjM0NTY3IikpOworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCIiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIobnVsbCkpOworICAgICAgICAvLyBUaGlzIHRlc3QgZmFpbHMgb24gYSBkZXZpY2Ugd2l0aG91dCBhIHNpbSBjYXJkCisgICAgICAgIC8qVGVsZXBob255TWFuYWdlciBtVGVsZXBob255TWFuYWdlciA9CisgICAgICAgICAgICAoVGVsZXBob255TWFuYWdlcilnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlRFTEVQSE9OWV9TRVJWSUNFKTsKKyAgICAgICAgU3RyaW5nIG1Wb2ljZU1haWxOdW1iZXIgPSBtVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0Vm9pY2VNYWlsTnVtYmVyKCk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcihtVm9pY2VNYWlsTnVtYmVyKSk7CisgICAgICAgICovCisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtYXROdW1iZXJUb0UxNjQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE2NTAyOTEwMDAwIiwgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXJUb0UxNjQoIjY1MCAyOTEwMDAwIiwgInVzIikpOworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyVG9FMTY0KCIxMjM0NTY3IiwgInVzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIisxODAwNDY2NDExNCIsIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyVG9FMTY0KCI4MDAtR09PRy0xMTQiLCAidXMiKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtYXROdW1iZXIoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiKDY1MCkgMjkxLTAwMDAiLCBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcigiNjUwIDI5MTAwMDAiLCAidXMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTIzLTQ1NjciLCBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcigiMTIzNDU2NyIsICJ1cyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIoODAwKSA0NjYtNDExNCIsIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyKCI4MDAtR09PRy0xMTQiLCAidXMiKSk7CisKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZU51bWJlcigpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI2NTAyOTEwMDAwIiwgUGhvbmVOdW1iZXJVdGlscy5ub3JtYWxpemVOdW1iZXIoIjY1MCAyOTEwMDAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEyMzQ1NjciLCBQaG9uZU51bWJlclV0aWxzLm5vcm1hbGl6ZU51bWJlcigiMTIsMyM0KjU2NyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4MDA0NjY0MTE0IiwgUGhvbmVOdW1iZXJVdGlscy5ub3JtYWxpemVOdW1iZXIoIjgwMC1HT09HLTExNCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTY1MDI5MTAwMDAiLCBQaG9uZU51bWJlclV0aWxzLm5vcm1hbGl6ZU51bWJlcigiKzEgNjUwIDI5MTAwMDAiKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtYXREYWlsYWJlTnVtYmVyKCkgeworICAgICAgICAvLyBVc2luZyB0aGUgcGhvbmVOdW1iZXJFMTY0J3MgY291bnRyeSBjb2RlCisgICAgICAgIGFzc2VydEVxdWFscygiKDY1MCkgMjkxLTAwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyKCI2NTAyOTEwMDAwIiwgIisxNjUwMjkxMDAwMCIsICJDTiIpKTsKKyAgICAgICAgLy8gVGhlIHBob25lTnVtYmVyRTE2NCBpcyBudWxsCisgICAgICAgIGFzc2VydEVxdWFscygiKDY1MCkgMjkxLTAwMDAiLCBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcigiNjUwMjkxMDAwMCIsIG51bGwsICJVUyIpKTsKKyAgICAgICAgLy8gVGhlIGdpdmVuIG51bWJlciBoYXMgYSBjb3VudHJ5IGNvZGUuCisgICAgICAgIGFzc2VydEVxdWFscygiKzEgNjUwLTI5MS0wMDAwIiwgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoIisxNjUwMjkxMDAwMCIsIG51bGwsICJDTiIpKTsKKyAgICAgICAgLy8gVGhlIGdpdmVuIG51bWJlciB3YXMgZm9ybWF0dGVkLgorICAgICAgICBhc3NlcnRFcXVhbHMoIjY1MC0yOTEtMDAwMCIsIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyKCI2NTAtMjkxLTAwMDAiLCBudWxsLCAiVVMiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZTU3M2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU51bWJlcldhdGNoZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CisKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKKworcHVibGljIGNsYXNzIFBob25lTnVtYmVyV2F0Y2hlclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRDaGFycygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG11bHRpQ2hhcnMgPSAiNjUwMTIzNDUiOworICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0dGVkMSA9ICIoNjUwKSAxMjMtNDUiOworICAgICAgICBUZXh0V2F0Y2hlciB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgLy8gQXBwZW5kIG1vcmUgdGhhbiBvbmUgY2hhcnMKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCAwLCAwLCBtdWx0aUNoYXJzLmxlbmd0aCgpKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZChtdWx0aUNoYXJzKTsKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCAwLCAwLCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3JtYXR0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3JtYXR0ZWQxLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgICAgICAvLyBBcHBlbmQgb25lIGNoYXJzCisgICAgICAgIGZpbmFsIGNoYXIgYXBwZW5kQ2hhciA9ICc2JzsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdHRlZDIgPSAiKDY1MCkgMTIzLTQ1NiI7CisgICAgICAgIGludCBsZW4gPSBudW1iZXIubGVuZ3RoKCk7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpLCAwLCAxKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZChhcHBlbmRDaGFyKTsKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCBsZW4sIDAsIDEpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3JtYXR0ZWQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3JtYXR0ZWQyLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVMYXN0Q2hhcnMoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBpbml0ID0gIjY1MDEyMzQ1Njc4IjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdDEgPSAiKDY1MCkgMTIzLTQ1NjciOworICAgICAgICBUZXh0V2F0Y2hlciB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgbGFzdCBjaGFyLgorICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICBpbnQgbGVuID0gbnVtYmVyLmxlbmd0aCgpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIGxlbiAtIDEsIDEsIDApOworICAgICAgICBudW1iZXIuZGVsZXRlKGxlbiAtIDEsIGxlbik7CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpIC0gMSwgMSwgMCk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdDEsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdDEubGVuZ3RoKCksIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisgICAgICAgIC8vIFJlbW92ZSBsYXN0IDUgY2hhcnMKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdDIgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCBudW1iZXIubGVuZ3RoKCkgLSA0LCA0LCAwKTsKKyAgICAgICAgbnVtYmVyLmRlbGV0ZShudW1iZXIubGVuZ3RoKCkgLSA1LCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpKTsKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIG51bWJlci5sZW5ndGgoKSwgNCwgMCk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdDIsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdDIubGVuZ3RoKCksIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluc2VydENoYXJzKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgaW5pdCA9ICIoNjUwKSAyMyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDEgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgVGV4dFdhdGNoZXIgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworCisgICAgICAgIC8vIEluc2VydCBvbmUgY2hhcgorICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDQsIDAsIDEpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDQsICIxIik7IC8vICg2NTAxKSAyMworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgNSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiAxCisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA0LCAwLCAxKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnMScKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisKKyAgICAgICAgLy8gSW5zZXJ0IG11bHRpcGxlIGNoYXJzCisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDIgPSAiKDY1MCkgMTQ1LTY3MjMiOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDcsIDAsIDQpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDcsICI0NTY3Iik7IC8vIGNoYW5nZSB0byAoNjUwKSAxNDU2NzIzCisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCAxMSk7IC8vIHRoZSBjdXJzb3IgaXMgYXQgdGhlIHJpZ2h0IG9mICc3Jy4KKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDcsIDAsIDQpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDIsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgYmUgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICc3JworICAgICAgICBhc3NlcnRFcXVhbHMoMTIsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0b3BGb3JtYXR0aW5nKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgaW5pdCA9ICIoNjUwKSAxMjMiOworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQxID0gIig2NTApIDEyMyA0IjsKKyAgICAgICAgVGV4dFdhdGNoZXIgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworCisgICAgICAgIC8vIEFwcGVuZCBzcGFjZQorICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDksIDAsIDIpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDksICIgNCIpOyAvLyAoNjUwMSkgMjMgNAorICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpKTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIDQKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDksIDAsIDIpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDEsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICcxJworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworCisgICAgICAgIC8vIERlbGV0ZSBhICcpJworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQyID0iKDY1MCAxMjMiOworICAgICAgICB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisgICAgICAgIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDQsIDEsIDApOworICAgICAgICBudW1iZXIuZGVsZXRlKDQsIDUpOyAvLyAoNjUwMSAyMyA0CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCA1KTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIDEKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDQsIDEsIDApOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDIsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICcxJworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKworICAgICAgICAvLyBJbnNlcnQgYSBoeXBoZW4KKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMyA9Iig2NTApIDEyLTMiOworICAgICAgICB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisgICAgICAgIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDgsIDAsIDEpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDgsICItIik7IC8vICg2NTApIDEyLTMKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDkpOyAvLyBtYWtlIHRoZSBjdXJzb3IgYXQgcmlnaHQgb2YgLQorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgOCwgMCwgMSk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMywgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICAvLyB0aGUgY3Vyc29yIHNob3VsZCBzdGlsbCBhdCB0aGUgcmlnaHQgb2YgJy0nCisgICAgICAgIGFzc2VydEVxdWFscyg5LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN0YXJ0Rm9ybWF0dGluZygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGluaXQgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMSA9ICIoNjUwKSAxMjMgNCI7CisgICAgICAgIFRleHRXYXRjaGVyIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKworICAgICAgICAvLyBBcHBlbmQgc3BhY2UKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAyKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg5LCAiIDQiKTsgLy8gKDY1MCkgMTIzIDQKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiA0CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAyKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnNCcKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMS5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKworICAgICAgICAvLyBDbGVhciB0aGUgY3VycmVudCBzdHJpbmcsIGFuZCBzdGFydCBmb3JtYXR0aW5nIGFnYWluLgorICAgICAgICBpbnQgbGVuID0gbnVtYmVyLmxlbmd0aCgpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDAsIGxlbiwgMCk7CisgICAgICAgIG51bWJlci5kZWxldGUoMCwgbGVuKTsKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDAsIGxlbiwgMCk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQyID0gIig2NTApIDEyMy00IjsKKyAgICAgICAgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoaW5pdCk7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgOSwgMCwgMSk7CisgICAgICAgIG51bWJlci5pbnNlcnQoOSwgIjQiKTsgLy8gKDY1MCkgMTIzNAorICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpKTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIDQKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDksIDAsIDEpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDIsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICc0JworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQyLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0Q2hhbmdlZEJ5T3RoZXJUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgZmluYWwgVGV4dFdhdGNoZXIgY2xlYW51cFRleHRXYXRjaGVyID0gbmV3IFRleHRXYXRjaGVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSBzKSB7CisgICAgICAgICAgICAgICAgcy5jbGVhcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgIGludCBhZnRlcikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBiZWZvcmUsCisgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCkgeworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBmaW5hbCBTdHJpbmcgaW5pdCA9ICIoNjUwKSAxMjMiOworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQxID0gIiI7CisgICAgICAgIFRleHRXYXRjaGVyIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKworICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDUsIDAsIDEpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDUsICI0Iik7IC8vICg2NTA0KSAxMjMKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDUpOyAvLyBtYWtlIHRoZSBjdXJzb3IgYXQgcmlnaHQgb2YgNAorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgNSwgMCwgMSk7CisgICAgICAgIG51bWJlci5zZXRTcGFuKGNsZWFudXBUZXh0V2F0Y2hlciwgMCwgbnVtYmVyLmxlbmd0aCgpLCAwKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBUZXh0V2F0Y2hlciBnZXRUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlcigiVVMiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZXN0UGhvbmVOb3RpZmllci5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVzdFBob25lTm90aWZpZXIuamF2YQppbmRleCA0Mjc3OTViLi44Y2IwNWNjIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZXN0UGhvbmVOb3RpZmllci5qYXZhCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Rlc3RQaG9uZU5vdGlmaWVyLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7CisKIC8qKgogICogU3R1YiBjbGFzcyB1c2VkIGZvciB1bml0IHRlc3RzCiAgKi8KQEAgLTMyLDcgKzM0LDcgQEAKIAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNlbGxMb2NhdGlvbihQaG9uZSBzZW5kZXIpIHsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBub3RpZnlTaWduYWxTdHJlbmd0aChQaG9uZSBzZW5kZXIpIHsKICAgICB9CiAKQEAgLTQyLDEwICs0NCwxNCBAQAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNhbGxGb3J3YXJkaW5nQ2hhbmdlZChQaG9uZSBzZW5kZXIpIHsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24pIHsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQWN0aXZpdHkoUGhvbmUgc2VuZGVyKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmVUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmVUZXN0LmphdmEKaW5kZXggYjk2NzQzYS4uNDg1NTQyYiAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lVGVzdC5qYXZhCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZVRlc3QuamF2YQpAQCAtMTgsMjcgKzE4LDIxIEBACiAKIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGU7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGxTdGF0ZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29ubmVjdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuTW1pQ29kZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlc3RQaG9uZU5vdGlmaWVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ2FsbEZhaWxDYXVzZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVBob25lOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNVGVzdEhhbmRsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Hc21NbWlDb2RlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU3VwcFNlcnZpY2VOb3RpZmljYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkQ29tbWFuZHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkUmFkaW9Db250cm9sOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9tb2NrcmlsL01vY2tSaWxUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9tb2NrcmlsL01vY2tSaWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkNWIzMQotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L21vY2tyaWwvTW9ja1JpbFRlc3QuamF2YQpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255Lm1vY2tyaWw7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmNvbW11bmljYXRpb24uTXNnSGVhZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmNvbW11bmljYXRpb24uTXNnOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5SaWxDaGFubmVsOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ3RybENtZHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDbWRzOworCitpbXBvcnQgY29tLmFuZHJvaWQuZnJhbWV3b3Jrcy50ZWxlcGhvbnl0ZXN0cy5UZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLkludmFsaWRQcm90b2NvbEJ1ZmZlck1pY3JvRXhjZXB0aW9uOworCisvLyBUZXN0IHN1aXRlIGZvciB0ZXN0IHJpbAorcHVibGljIGNsYXNzIE1vY2tSaWxUZXN0IGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTW9ja1JpbFRlc3QiOworCisgICAgUmlsQ2hhbm5lbCBtTW9ja1JpbENoYW5uZWw7CisgICAgVGVsZXBob255TW9ja1JpbFRlc3RSdW5uZXIgbVJ1bm5lcjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIG1SdW5uZXIgPSAoVGVsZXBob255TW9ja1JpbFRlc3RSdW5uZXIpZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CisgICAgICAgIG1Nb2NrUmlsQ2hhbm5lbCA9IG1SdW5uZXIubU1vY2tSaWxDaGFubmVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBzKSB7CisgICAgICAgIExvZy52KFRBRywgcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBwcm90b2J1ZiBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24KKyAgICAgKiBAdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlck1pY3JvRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFByb3RvYnVmU2VyRGVzKCkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlck1pY3JvRXhjZXB0aW9uIHsKKyAgICAgICAgbG9nKCJ0ZXN0UHJvdG9idWZTZXJkZXMgRSIpOworCisgICAgICAgIFJpbEN0cmxDbWRzLkN0cmxSc3BSYWRpb1N0YXRlIHJzID0gbmV3IFJpbEN0cmxDbWRzLkN0cmxSc3BSYWRpb1N0YXRlKCk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgcnMuc3RhdGUgPT0gMCB3YXMgJWQiLCBycy5nZXRTdGF0ZSgpKSwKKyAgICAgICAgICAgICAgICBycy5nZXRTdGF0ZSgpID09IDApOworICAgICAgICBycy5zZXRTdGF0ZSgxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBycy5zdGF0ZSA9PSAxIHdhcyAlZCIsIHJzLmdldFN0YXRlKCkpLAorICAgICAgICAgICAgICAgIHJzLmdldFN0YXRlKCkgPT0gMSk7CisKKyAgICAgICAgYnl0ZVtdIHJzX3NlciA9IHJzLnRvQnl0ZUFycmF5KCk7CisgICAgICAgIFJpbEN0cmxDbWRzLkN0cmxSc3BSYWRpb1N0YXRlIHJzTmV3ID0gUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUucGFyc2VGcm9tKHJzX3Nlcik7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgcnNOZXcuc3RhdGUgPT0gMSB3YXMgJWQiLCBycy5nZXRTdGF0ZSgpKSwKKyAgICAgICAgICAgICAgICBycy5nZXRTdGF0ZSgpID09IDEpOworCisgICAgICAgIGxvZygidGVzdFByb3RvYnVmU2VyZGVzIFgiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGVjaG8gY29tbWFuZCB3b3JrcyB1c2luZyB3cml0ZU1zZyAmIHJlYWRNc2cKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob01zZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGxvZygidGVzdEVjaG9Nc2cgRSIpOworCisgICAgICAgIE1zZ0hlYWRlciBtaCA9IG5ldyBNc2dIZWFkZXIoKTsKKyAgICAgICAgbWguc2V0Q21kKDApOworICAgICAgICBtaC5zZXRUb2tlbigxKTsKKyAgICAgICAgbWguc2V0U3RhdHVzKDIpOworICAgICAgICBCeXRlQnVmZmVyIGRhdGEgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDMpOworICAgICAgICBkYXRhLnB1dCgoYnl0ZSkzKTsKKyAgICAgICAgZGF0YS5wdXQoKGJ5dGUpNCk7CisgICAgICAgIGRhdGEucHV0KChieXRlKTUpOworICAgICAgICBNc2cuc2VuZChtTW9ja1JpbENoYW5uZWwsIG1oLCBkYXRhKTsKKworICAgICAgICBNc2cgcmVzcE1zZyA9IE1zZy5yZWN2KG1Nb2NrUmlsQ2hhbm5lbCk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgbWhkLmhlYWRlci5jbWQgPT0gMCB3YXMgJWQiLHJlc3BNc2cuZ2V0Q21kKCkpLAorICAgICAgICAgICAgICAgIHJlc3BNc2cuZ2V0Q21kKCkgPT0gMCk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgbWhkLmhlYWRlci50b2tlbiA9PSAxIHdhcyAlZCIscmVzcE1zZy5nZXRUb2tlbigpKSwKKyAgICAgICAgICAgICAgICByZXNwTXNnLmdldFRva2VuKCkgPT0gMSk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgbWhkLmhlYWRlci5zdGF0dXMgPT0gMiB3YXMgJWQiLCByZXNwTXNnLmdldFN0YXR1cygpKSwKKyAgICAgICAgICAgICAgICByZXNwTXNnLmdldFN0YXR1cygpID09IDIpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIG1oZC5kYXRhWzBdID09IDMgd2FzICVkIiwgcmVzcE1zZy5nZXREYXRhKDApKSwKKyAgICAgICAgICAgICAgICByZXNwTXNnLmdldERhdGEoMCkgPT0gMyk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgbWhkLmRhdGFbMV0gPT0gNCB3YXMgJWQiLCByZXNwTXNnLmdldERhdGEoMSkpLAorICAgICAgICAgICAgICAgIHJlc3BNc2cuZ2V0RGF0YSgxKSA9PSA0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBtaGQuZGF0YVsyXSA9PSA1IHdhcyAlZCIsIHJlc3BNc2cuZ2V0RGF0YSgyKSksCisgICAgICAgICAgICAgICAgcmVzcE1zZy5nZXREYXRhKDIpID09IDUpOworCisgICAgICAgIGxvZygidGVzdEVjaG9Nc2cgWCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZ2V0IGFzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEFzKCkgeworICAgICAgICBsb2coInRlc3RHZXRBcyBFIik7CisKKyAgICAgICAgLy8gVXNlIGEgbWVzc2FnZSBoZWFkZXIgYXMgdGhlIHByb3RvYnVmIGRhdGEgY29udGVudAorICAgICAgICBNc2dIZWFkZXIgbWggPSBuZXcgTXNnSGVhZGVyKCk7CisgICAgICAgIG1oLnNldENtZCgxMjM0NSk7CisgICAgICAgIG1oLnNldFRva2VuKDk4NzYpOworICAgICAgICBtaC5zZXRTdGF0dXMoNzY1NCk7CisgICAgICAgIG1oLnNldExlbmd0aERhdGEoNDMyMSk7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gbWgudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgTXNnSGVhZGVyIG1oUmVzdWx0ID0gTXNnLmdldEFzKE1zZ0hlYWRlci5jbGFzcywgZGF0YSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBjbWQgPT0gMTIzNDUgd2FzICVkIiwgbWhSZXN1bHQuZ2V0Q21kKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldENtZCgpID09IDEyMzQ1KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCB0b2tlbiA9PSA5ODc2IHdhcyAlZCIsIG1oUmVzdWx0LmdldFRva2VuKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldFRva2VuKCkgPT0gOTg3Nik7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgc3RhdHVzID09IDc2NTQgd2FzICVkIiwgbWhSZXN1bHQuZ2V0U3RhdHVzKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldFN0YXR1cygpID09IDc2NTQpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIGxlbmd0aERhdGEgPT0gNDMyMSB3YXMgJWQiLCBtaFJlc3VsdC5nZXRMZW5ndGhEYXRhKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldExlbmd0aERhdGEoKSA9PSA0MzIxKTsKKworICAgICAgICBNc2cgbXNnID0gTXNnLm9idGFpbigpOworICAgICAgICBtc2cuc2V0RGF0YShCeXRlQnVmZmVyLndyYXAoZGF0YSkpOworCisgICAgICAgIG1oUmVzdWx0ID0gbXNnLmdldERhdGFBcyhNc2dIZWFkZXIuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgY21kID09IDEyMzQ1IHdhcyAlZCIsIG1oUmVzdWx0LmdldENtZCgpKSwKKyAgICAgICAgICAgICAgICBtaFJlc3VsdC5nZXRDbWQoKSA9PSAxMjM0NSk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgdG9rZW4gPT0gOTg3NiB3YXMgJWQiLCBtaFJlc3VsdC5nZXRUb2tlbigpKSwKKyAgICAgICAgICAgICAgICBtaFJlc3VsdC5nZXRUb2tlbigpID09IDk4NzYpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIHN0YXR1cyA9PSA3NjU0IHdhcyAlZCIsIG1oUmVzdWx0LmdldFN0YXR1cygpKSwKKyAgICAgICAgICAgICAgICBtaFJlc3VsdC5nZXRTdGF0dXMoKSA9PSA3NjU0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBsZW5ndGhEYXRhID09IDQzMjEgd2FzICVkIiwgbWhSZXN1bHQuZ2V0TGVuZ3RoRGF0YSgpKSwKKyAgICAgICAgICAgICAgICBtaFJlc3VsdC5nZXRMZW5ndGhEYXRhKCkgPT0gNDMyMSk7CisKKyAgICAgICAgbG9nKCJ0ZXN0R2V0QXMgWCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSYWRpb1N0YXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbG9nKCJ0ZXN0R2V0UmFkaW9TdGF0ZSBFIik7CisKKyAgICAgICAgTXNnLnNlbmQobU1vY2tSaWxDaGFubmVsLCAxLCA5ODc2LCAwLCBudWxsKTsKKworICAgICAgICBNc2cgcmVzcCA9IE1zZy5yZWN2KG1Nb2NrUmlsQ2hhbm5lbCk7CisgICAgICAgIC8vcmVzcC5wcmludEhlYWRlcigidGVzdEdldFJhZGlvU3RhdGUiKTsKKworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIGNtZCA9PSAxIHdhcyAlZCIsIHJlc3AuZ2V0Q21kKCkpLAorICAgICAgICAgICAgICAgIHJlc3AuZ2V0Q21kKCkgPT0gMSk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgdG9rZW4gPT0gOTg3NiB3YXMgJWQiLCByZXNwLmdldFRva2VuKCkpLAorICAgICAgICAgICAgICAgIHJlc3AuZ2V0VG9rZW4oKSA9PSA5ODc2KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBzdGF0dXMgPT0gMCB3YXMgJWQiLCByZXNwLmdldFN0YXR1cygpKSwKKyAgICAgICAgICAgICAgICByZXNwLmdldFN0YXR1cygpID09IDApOworCisgICAgICAgIFJpbEN0cmxDbWRzLkN0cmxSc3BSYWRpb1N0YXRlIHJzcCA9IHJlc3AuZ2V0RGF0YUFzKFJpbEN0cmxDbWRzLkN0cmxSc3BSYWRpb1N0YXRlLmNsYXNzKTsKKworICAgICAgICBpbnQgc3RhdGUgPSByc3AuZ2V0U3RhdGUoKTsKKyAgICAgICAgbG9nKCJ0ZXN0R2V0UmFkaW9TdGF0ZSBzdGF0ZT0iICsgc3RhdGUpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIFJhZGlvU3RhdGUgPj0gMCAmJiBSYWRpb1N0YXRlIDw9IDkgd2FzICVkIiwgc3RhdGUpLAorICAgICAgICAgICAgICAgICgoc3RhdGUgPj0gMCkgJiYgKHN0YXRlIDw9IDkpKSk7CisKKyAgICAgICAgbG9nKCJ0ZXN0R2V0UmFkaW9TdGF0ZSBYIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldFJhZGlvU3RhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBsb2coInRlc3RTZXRSYWRpb1N0YXRlIEUiKTsKKworICAgICAgICBSaWxDdHJsQ21kcy5DdHJsUmVxUmFkaW9TdGF0ZSBjbWRycyA9IG5ldyBSaWxDdHJsQ21kcy5DdHJsUmVxUmFkaW9TdGF0ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY21kcnMuZ2V0U3RhdGUoKSk7CisKKyAgICAgICAgY21kcnMuc2V0U3RhdGUoUmlsQ21kcy5SQURJT1NUQVRFX1NJTV9OT1RfUkVBRFkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY21kcnMuZ2V0U3RhdGUoKSk7CisKKyAgICAgICAgTXNnLnNlbmQobU1vY2tSaWxDaGFubmVsLCBSaWxDdHJsQ21kcy5DVFJMX0NNRF9TRVRfUkFESU9fU1RBVEUsIDAsIDAsIGNtZHJzKTsKKworICAgICAgICBNc2cgcmVzcCA9IE1zZy5yZWN2KG1Nb2NrUmlsQ2hhbm5lbCk7CisKKyAgICAgICAgUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUgcnNwID0gcmVzcC5nZXREYXRhQXMoUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUuY2xhc3MpOworCisgICAgICAgIGludCBzdGF0ZSA9IHJzcC5nZXRTdGF0ZSgpOworICAgICAgICBsb2coImdldCByZXNwb25zZSBmb3IgdGVzdFNldFJhZGlvU3RhdGU6ICIgKyBzdGF0ZSk7CisgICAgICAgIGFzc2VydFRydWUoUmlsQ21kcy5SQURJT1NUQVRFX1NJTV9OT1RfUkVBRFkgPT0gc3RhdGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvTG9hZGVyVGVzdENhc2UuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvTG9hZGVyVGVzdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmU2NTkwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Mb2FkZXJUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVzdDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Mb2FkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkxvYWRlci5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWU7CisKKy8qKgorICogQSBjb252ZW5pZW5jZSBjbGFzcyBmb3IgdGVzdGluZyB7QGxpbmsgTG9hZGVyfXMuIFRoaXMgdGVzdCBjYXNlCisgKiBwcm92aWRlcyBhIHNpbXBsZSB3YXkgdG8gc3luY2hyb25vdXNseSBnZXQgdGhlIHJlc3VsdCBmcm9tIGEgTG9hZGVyIG1ha2luZworICogaXQgZWFzeSB0byBhc3NlcnQgdGhhdCB0aGUgTG9hZGVyIHJldHVybnMgdGhlIGV4cGVjdGVkIHJlc3VsdC4KKyAqLworcHVibGljIGNsYXNzIExvYWRlclRlc3RDYXNlIGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBzdGF0aWMgeworICAgICAgICAvLyBGb3JjZSBjbGFzcyBsb2FkaW5nIG9mIEFzeW5jVGFzayBvbiB0aGUgbWFpbiB0aHJlYWQgc28gdGhhdCBpdCdzIGhhbmRsZXJzIGFyZSB0aWVkIHRvCisgICAgICAgIC8vIHRoZSBtYWluIHRocmVhZCBhbmQgcmVzcG9uc2VzIGZyb20gdGhlIHdvcmtlciB0aHJlYWQgZ2V0IGRlbGl2ZXJlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgICAgIC8vIFRoZSB0ZXN0cyBhcmUgcnVuIG9uIGFub3RoZXIgdGhyZWFkLCBhbGxvd2luZyB0aGVtIHRvIGJsb2NrIHdhaXRpbmcgb24gYSByZXNwb25zZSBmcm9tCisgICAgICAgIC8vIHRoZSBjb2RlIHJ1bm5pbmcgb24gdGhlIG1haW4gdGhyZWFkLiBUaGUgbWFpbiB0aHJlYWQgY2FuJ3QgYmxvY2sgc2luY2UgdGhlIEF5c25jVGFzaworICAgICAgICAvLyByZXN1bHRzIGNvbWUgaW4gdmlhIHRoZSBldmVudCBsb29wLgorICAgICAgICBuZXcgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIFZvaWQ+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgVm9pZCBkb0luQmFja2dyb3VuZChWb2lkLi4uIGFyZ3MpIHtyZXR1cm4gbnVsbDt9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoVm9pZCByZXN1bHQpIHt9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVucyBhIExvYWRlciBzeW5jaHJvbm91c2x5IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGxvYWQuIFRoZSBsb2FkZXIgd2lsbAorICAgICAqIGJlIHN0YXJ0ZWQsIHN0b3BwZWQsIGFuZCBkZXN0cm95ZWQgYnkgdGhpcyBtZXRob2Qgc28gaXQgY2Fubm90IGJlIHJldXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2FkZXIgVGhlIGxvYWRlciB0byBydW4gc3luY2hyb25vdXNseQorICAgICAqIEByZXR1cm4gVGhlIHJlc3VsdCBmcm9tIHRoZSBsb2FkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFQgZ2V0TG9hZGVyUmVzdWx0U3luY2hyb25vdXNseShmaW5hbCBMb2FkZXI8VD4gbG9hZGVyKSB7CisgICAgICAgIC8vIFRoZSB0ZXN0IHRocmVhZCBibG9ja3Mgb24gdGhpcyBxdWV1ZSB1bnRpbCB0aGUgbG9hZGVyIHB1dHMgaXQncyByZXN1bHQgaW4KKyAgICAgICAgZmluYWwgQXJyYXlCbG9ja2luZ1F1ZXVlPFQ+IHF1ZXVlID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxUPigxKTsKKworICAgICAgICAvLyBUaGlzIGNhbGxiYWNrIHJ1bnMgb24gdGhlICJtYWluIiB0aHJlYWQgYW5kIHVuYmxvY2tzIHRoZSB0ZXN0IHRocmVhZAorICAgICAgICAvLyB3aGVuIGl0IHB1dHMgdGhlIHJlc3VsdCBpbnRvIHRoZSBibG9ja2luZyBxdWV1ZQorICAgICAgICBmaW5hbCBPbkxvYWRDb21wbGV0ZUxpc3RlbmVyPFQ+IGxpc3RlbmVyID0gbmV3IE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8VD4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9hZENvbXBsZXRlKExvYWRlcjxUPiBjb21wbGV0ZWRMb2FkZXIsIFQgZGF0YSkgeworICAgICAgICAgICAgICAgIC8vIFNodXQgdGhlIGxvYWRlciBkb3duCisgICAgICAgICAgICAgICAgY29tcGxldGVkTG9hZGVyLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICBjb21wbGV0ZWRMb2FkZXIuc3RvcExvYWRpbmcoKTsKKyAgICAgICAgICAgICAgICBjb21wbGV0ZWRMb2FkZXIuZGVzdHJveSgpOworCisgICAgICAgICAgICAgICAgLy8gU3RvcmUgdGhlIHJlc3VsdCwgdW5ibG9ja2luZyB0aGUgdGVzdCB0aHJlYWQKKyAgICAgICAgICAgICAgICBxdWV1ZS5hZGQoZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgLy8gVGhpcyBoYW5kbGVyIHJ1bnMgb24gdGhlICJtYWluIiB0aHJlYWQgb2YgdGhlIHByb2Nlc3Mgc2luY2UgQXN5bmNUYXNrCisgICAgICAgIC8vIGlzIGRvY3VtZW50ZWQgYXMgbmVlZGluZyB0byBydW4gb24gdGhlIG1haW4gdGhyZWFkIGFuZCBtYW55IExvYWRlcnMgdXNlCisgICAgICAgIC8vIEFzeW5jVGFzaworICAgICAgICBmaW5hbCBIYW5kbGVyIG1haW5UaHJlYWRIYW5kbGVyID0gbmV3IEhhbmRsZXIoTG9vcGVyLmdldE1haW5Mb29wZXIoKSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyLnJlZ2lzdGVyTGlzdGVuZXIoMCwgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGxvYWRlci5zdGFydExvYWRpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvLyBBc2sgdGhlIG1haW4gdGhyZWFkIHRvIHN0YXJ0IHRoZSBsb2FkaW5nIHByb2Nlc3MKKyAgICAgICAgbWFpblRocmVhZEhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZSgwKTsKKworICAgICAgICAvLyBCbG9jayBvbiB0aGUgcXVldWUgd2FpdGluZyBmb3IgdGhlIHJlc3VsdCBvZiB0aGUgbG9hZCB0byBiZSBpbnNlcnRlZAorICAgICAgICBUIHJlc3VsdDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcXVldWUudGFrZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ3YWl0aW5nIHRocmVhZCBpbnRlcnJ1cHRlZCIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Byb3ZpZGVyVGVzdENhc2UuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZS5qYXZhCmluZGV4IGUxMTcyY2YuLjc0Y2ViZWUgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZS5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZS5qYXZhCkBAIC03Myw2ICs3MywxOCBAQAogICAgICAgICBtUmVzb2x2ZXIuYWRkUHJvdmlkZXIobVByb3ZpZGVyQXV0aG9yaXR5LCBnZXRQcm92aWRlcigpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBlbnZpcm9ubWVudCBmb3IgdGhlIHRlc3QgZml4dHVyZS4KKyAgICAgKiA8cD4KKyAgICAgKiBDYWxscyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciNzaHV0ZG93bigpfSBvbiB0aGUKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcn0gcmVwcmVzZW50ZWQgYnkgbVByb3ZpZGVyLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Qcm92aWRlci5zaHV0ZG93bigpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKwogICAgIHB1YmxpYyBNb2NrQ29udGVudFJlc29sdmVyIGdldE1vY2tDb250ZW50UmVzb2x2ZXIoKSB7CiAgICAgICAgIHJldHVybiBtUmVzb2x2ZXI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlMi5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlMi5qYXZhCmluZGV4IDFmYjU1MzguLjY0ZDExYzUgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZTIuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Byb3ZpZGVyVGVzdENhc2UyLmphdmEKQEAgLTE0MSw2ICsxNDEsMTggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUZWFycyBkb3duIHRoZSBlbnZpcm9ubWVudCBmb3IgdGhlIHRlc3QgZml4dHVyZS4KKyAgICAgKiA8cD4KKyAgICAgKiBDYWxscyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciNzaHV0ZG93bigpfSBvbiB0aGUKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcn0gcmVwcmVzZW50ZWQgYnkgbVByb3ZpZGVyLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Qcm92aWRlci5zaHV0ZG93bigpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEdldHMgdGhlIHtAbGluayBNb2NrQ29udGVudFJlc29sdmVyfSBjcmVhdGVkIGJ5IHRoaXMgY2xhc3MgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBZb3UKICAgICAgKiBtdXN0IHVzZSB0aGUgbWV0aG9kcyBvZiB0aGlzIHJlc29sdmVyIHRvIGFjY2VzcyB0aGUgcHJvdmlkZXIgdW5kZXIgdGVzdC4KICAgICAgKgpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9SZW5hbWluZ0RlbGVnYXRpbmdDb250ZXh0LmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1JlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQuamF2YQppbmRleCA5NzNiOWYyLi5lZWUzYWQ3IDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1JlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1JlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0V3JhcHBlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5GaWxlVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTE0OCw2ICsxNDksMTcgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUsCisgICAgICAgICAgICBpbnQgbW9kZSwgU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGludGVybmFsTmFtZSA9IHJlbmFtZWRGaWxlTmFtZShuYW1lKTsKKyAgICAgICAgaWYgKCFtRGF0YWJhc2VOYW1lcy5jb250YWlucyhuYW1lKSkgeworICAgICAgICAgICAgbURhdGFiYXNlTmFtZXMuYWRkKG5hbWUpOworICAgICAgICAgICAgbUZpbGVDb250ZXh0LmRlbGV0ZURhdGFiYXNlKGludGVybmFsTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1GaWxlQ29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShpbnRlcm5hbE5hbWUsIG1vZGUsIGZhY3RvcnksIGVycm9ySGFuZGxlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZGVsZXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgaWYgKG1EYXRhYmFzZU5hbWVzLmNvbnRhaW5zKG5hbWUpKSB7CiAgICAgICAgICAgICBtRGF0YWJhc2VOYW1lcy5yZW1vdmUobmFtZSk7CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRlbnRQcm92aWRlci5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDb250ZW50UHJvdmlkZXIuamF2YQppbmRleCAzZmQ3MWM4Li5iNjNmZjNkIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTEyNyw2ICsxMjcsMTYgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgICAgICB9CiAKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIE1vY2tDb250ZW50UHJvdmlkZXIudGhpcy5nZXRTdHJlYW1UeXBlcyh1cmwsIG1pbWVUeXBlRmlsdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgICAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGUoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykKKyAgICAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIE1vY2tDb250ZW50UHJvdmlkZXIudGhpcy5vcGVuVHlwZWRBc3NldEZpbGUodXJsLCBtaW1lVHlwZSwgb3B0cyk7CisgICAgICAgIH0KICAgICB9CiAgICAgcHJpdmF0ZSBmaW5hbCBJbnZlcnNpb25JQ29udGVudFByb3ZpZGVyIG1JQ29udGVudFByb3ZpZGVyID0gbmV3IEludmVyc2lvbklDb250ZW50UHJvdmlkZXIoKTsKIApAQCAtMjIyLDYgKzIzMiwxNCBAQAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QgY2FsbCIpOwogICAgIH0KIAorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIGNhbGwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGUoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QgY2FsbCIpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFJldHVybnMgSUNvbnRlbnRQcm92aWRlciB3aGljaCBjYWxscyBiYWNrIHNhbWUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzLgogICAgICAqIEJ5IG92ZXJyaWRpbmcgdGhpcyBjbGFzcywgd2UgYXZvaWQgdGhlIG1lY2hhbmlzbSBoaWRkZW4gYmVoaW5kIENvbnRlbnRQcm92aWRlcgpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDb250ZXh0LmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRleHQuamF2YQppbmRleCBmZmQ3NTdjLi5jMzFjOWNjIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRleHQuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRleHQuamF2YQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CkBAIC0xODQsNiArMTg1LDEyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNRTGl0ZURhdGFiYXNlIG9wZW5PckNyZWF0ZURhdGFiYXNlKFN0cmluZyBmaWxlLCBpbnQgbW9kZSwKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkgZmFjdG9yeSwgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBGaWxlIGdldERhdGFiYXNlUGF0aChTdHJpbmcgbmFtZSkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0N1cnNvci5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDdXJzb3IuamF2YQppbmRleCA5YjFjMGVmLi5iYWExNTBhIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0N1cnNvci5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ3Vyc29yLmphdmEKQEAgLTE3OCwzNiArMTc4LDExIEBACiAgICAgfQogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoTWFwPD8gZXh0ZW5kcyBMb25nLCA/IGV4dGVuZHMgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVXBkYXRlcygpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCBzZXROb3RpZmljYXRpb25VcmkoQ29udGVudFJlc29sdmVyIGNyLCBVcmkgdXJpKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwogICAgIH0KIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNVcGRhdGVzKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKENvbnRlbnRPYnNlcnZlciBvYnNlcnZlcikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKICAgICB9CkBAIC0yMTcsNDggKzE5Miw3IEBACiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwogICAgIH0KIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlQmxvYihpbnQgY29sdW1uSW5kZXgsIGJ5dGVbXSB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZURvdWJsZShpbnQgY29sdW1uSW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUZsb2F0KGludCBjb2x1bW5JbmRleCwgZmxvYXQgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVJbnQoaW50IGNvbHVtbkluZGV4LCBpbnQgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVMb25nKGludCBjb2x1bW5JbmRleCwgbG9uZyB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVNob3J0KGludCBjb2x1bW5JbmRleCwgc2hvcnQgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTdHJpbmcoaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVUb051bGwoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIHZvaWQgYWJvcnRVcGRhdGVzKCkgeworICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrSUNvbnRlbnRQcm92aWRlci5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tJQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggMGJlNWJlYS4uMTgzYmU0MSAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tJQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tJQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTMyLDYgKzMyLDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogLyoqCkBAIC0xMDIsNCArMTAzLDEzIEBACiAgICAgcHVibGljIElCaW5kZXIgYXNCaW5kZXIoKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwogICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGUoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL1Rlc3RHcm91cGluZy5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nLmphdmEKaW5kZXggZGY2ZGE3MC4uYTJiOTRmZiAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nLmphdmEKQEAgLTQ2LDYgKzQ2LDggQEAKICAqLwogcHVibGljIGNsYXNzIFRlc3RHcm91cGluZyB7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJUZXN0R3JvdXBpbmciOworCiAgICAgU29ydGVkU2V0PENsYXNzPD8gZXh0ZW5kcyBUZXN0Q2FzZT4+IHRlc3RDYXNlQ2xhc3NlczsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxDbGFzczw/IGV4dGVuZHMgVGVzdENhc2U+PiBTT1JUX0JZX1NJTVBMRV9OQU1FCkBAIC0xMTQsNyArMTE2LDcgQEAKICAgICAgICAgZm9yIChTdHJpbmcgcGFja2FnZU5hbWUgOiBwYWNrYWdlTmFtZXMpIHsKICAgICAgICAgICAgIExpc3Q8Q2xhc3M8PyBleHRlbmRzIFRlc3RDYXNlPj4gYWRkZWRDbGFzc2VzID0gdGVzdENhc2VDbGFzc2VzSW5QYWNrYWdlKHBhY2thZ2VOYW1lKTsKICAgICAgICAgICAgIGlmIChhZGRlZENsYXNzZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoIlRlc3RHcm91cGluZyIsICJJbnZhbGlkIFBhY2thZ2U6ICciICsgcGFja2FnZU5hbWUKKyAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiSW52YWxpZCBQYWNrYWdlOiAnIiArIHBhY2thZ2VOYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICArICInIGNvdWxkIG5vdCBiZSBmb3VuZCBvciBoYXMgbm8gdGVzdHMiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRlc3RDYXNlQ2xhc3Nlcy5hZGRBbGwoYWRkZWRDbGFzc2VzKTsKQEAgLTIzNCw2ICsyMzYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExvZy5pKExPR19UQUcsIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJUZXN0Q2FzZSBjbGFzcyAlcyBpcyBtaXNzaW5nIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggbm8gcGFyYW1ldGVycyAiICsKKyAgICAgICAgICAgICAgICAgICAgIm9yIGEgc2luZ2xlIFN0cmluZyBwYXJhbWV0ZXIgLSBza2lwcGluZyIsCisgICAgICAgICAgICAgICAgICAgIGFDbGFzcy5nZXROYW1lKCkpKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL1Rlc3RHcm91cGluZ1Rlc3QuamF2YSBiL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL1Rlc3RHcm91cGluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDQ3N2QxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBVbml0IHRlc3RzIGZvciB7QGxpbmsgVGVzdEdyb3VwaW5nfQorICovCitwdWJsaWMgY2xhc3MgVGVzdEdyb3VwaW5nVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgVGVzdEdyb3VwaW5nIG1Hcm91cGluZzsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIG1Hcm91cGluZyA9IG5ldyBUZXN0R3JvdXBpbmcoVGVzdEdyb3VwaW5nLlNPUlRfQllfU0lNUExFX05BTUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIHRoYXQgVGVzdENhc2VzIHdpdGggbm8gcHVibGljIGNvbnN0cnVjdG9yIGFyZSBub3QgbG9hZGVkLgorICAgICAqIFJlbGllcyBvbiBmaXh0dXJlIGNsYXNzZXMgaW4gYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5leGFtcGxlcy5jb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUZXN0c19ub1B1YmxpY0NvbnN0cnVjdG9yKCkgeworICAgICAgICBtR3JvdXBpbmcuYWRkUGFja2FnZXNSZWN1cnNpdmUoImFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuZXhhbXBsZXMuY29uc3RydWN0b3IiKTsKKyAgICAgICAgTGlzdDxUZXN0TWV0aG9kPiB0ZXN0cyA9IG1Hcm91cGluZy5nZXRUZXN0cygpOworICAgICAgICAvLyBvbmx5IHRoZSBQdWJsaWNDb25zdHJ1Y3RvclRlc3QncyB0ZXN0IG1ldGhvZCBzaG91bGQgYmUgcHJlc2VudAorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdGVzdHMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0UHVibGljQ29uc3RydWN0b3IiLCB0ZXN0cy5nZXQoMCkuZ2V0TmFtZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9Ob1B1YmxpY0NvbnN0cnVjdG9yVGVzdC5qYXZhIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzkwOWExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmV4YW1wbGVzLmNvbnN0cnVjdG9yOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEEge0BsaW5rIFRlc3RDYXNlfSB3aGljaCBzaG91bGQgbm90IGJlIGxvYWRlZCBzaW5jZSBpdCBoYXMgbm9uLXB1YmxpYyBjb25zdHJ1Y3RvcnMgd2l0aCBubyBhcmdzLgorICovCitwdWJsaWMgY2xhc3MgTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBOb1B1YmxpY0NvbnN0cnVjdG9yVGVzdCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QoU3RyaW5nIGZvbywgU3RyaW5nIGZvbzIpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90UnVuKCkgeworICAgICAgICBmYWlsKCJtZXRob2QgaW4gTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QgcnVuIHVuZXhwZWN0ZWRseSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL1Byb3RlY3RlZENvbnN0cnVjdG9yVGVzdC5qYXZhIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHJvdGVjdGVkQ29uc3RydWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4NjJmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL1Byb3RlY3RlZENvbnN0cnVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuZXhhbXBsZXMuY29uc3RydWN0b3I7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQSBwcm90ZWN0ZWQgY29uc3RydWN0b3IgdGVzdCBjYXNlIHRoYXQgc2hvdWxkIG5vdCBiZSBsb2FkZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBQcm90ZWN0ZWRDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcm90ZWN0ZWQgUHJvdGVjdGVkQ29uc3RydWN0b3JUZXN0KCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RSdW4oKSB7CisgICAgICAgIGZhaWwoIm1ldGhvZCBpbiBQcm90ZWN0ZWRDb25zdHJ1Y3RvclRlc3QgcnVuIHVuZXhwZWN0ZWRseSIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHVibGljQ29uc3RydWN0b3JUZXN0LmphdmEgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTFlMjVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHVibGljQ29uc3RydWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5leGFtcGxlcy5jb25zdHJ1Y3RvcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBBIHB1YmxpYyBjb25zdHJ1Y3RvciB0ZXN0IGNhc2UgdGhhdCBzaG91bGQgYmUgbG9hZGVkLgorICovCitwdWJsaWMgY2xhc3MgUHVibGljQ29uc3RydWN0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdFB1YmxpY0NvbnN0cnVjdG9yKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaAppbmRleCBhMDU4ZDRhLi4wMzczNjdlIDEwMDY0NAotLS0gYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvUGx1Z2luT2JqZWN0LmgKKysrIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oCkBAIC02NSw3ICs2NSw3IEBACiBwdWJsaWM6CiAgICAgU3ViUGx1Z2luKE5QUCBpbnN0KSA6IG1faW5zdChpbnN0KSB7fQogICAgIHZpcnR1YWwgflN1YlBsdWdpbigpIHt9Ci0gICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSA9IDA7CisgICAgdmlydHVhbCBpbnQxNl90IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpID0gMDsKIAogICAgIE5QUCBpbnN0KCkgY29uc3QgeyByZXR1cm4gbV9pbnN0OyB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5jcHAgYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvZXZlbnQvRXZlbnRQbHVnaW4uY3BwCmluZGV4IDJlZmYzOTQuLjkxZjFiM2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5jcHAKKysrIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmNwcApAQCAtMTM4LDcgKzEzOCw3IEBACiAgICAgYnJvd3Nlci0+bWVtZnJlZShiZWdpbk1lbSk7CiB9CiAKLWludDE2IEV2ZW50UGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CitpbnQxNl90IEV2ZW50UGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CiAgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgewogCiAgICAgICAgIGNhc2Uga0RyYXdfQU5QRXZlbnRUeXBlOiB7CmRpZmYgLS1naXQgYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvZXZlbnQvRXZlbnRQbHVnaW4uaCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5oCmluZGV4IDg4YjdjOWQuLjA0M2JlODUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5oCisrKyBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5oCkBAIC0zMiw3ICszMiw3IEBACiBwdWJsaWM6CiAgICAgRXZlbnRQbHVnaW4oTlBQIGluc3QpOwogICAgIHZpcnR1YWwgfkV2ZW50UGx1Z2luKCk7Ci0gICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKKyAgICB2aXJ0dWFsIGludDE2X3QgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7CiAKIHByaXZhdGU6CiAgICAgdm9pZCBkcmF3UGx1Z2luKGNvbnN0IEFOUEJpdG1hcCYgYml0bWFwLCBjb25zdCBBTlBSZWN0SSYgY2xpcCk7CmRpZmYgLS1naXQgYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvbWFpbi5jcHAgYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvbWFpbi5jcHAKaW5kZXggNDAyYTdlMi4uNTExMTgwYyAxMDA2NDQKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL21haW4uY3BwCisrKyBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9tYWluLmNwcApAQCAtMzQsMTkgKzM0LDE5IEBACiBOUE5ldHNjYXBlRnVuY3MqIGJyb3dzZXI7CiAjZGVmaW5lIEVYUE9SVCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQogCi1OUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNiBtb2RlLCBpbnQxNiBhcmdjLAorTlBFcnJvciBOUFBfTmV3KE5QTUlNRVR5cGUgcGx1Z2luVHlwZSwgTlBQIGluc3RhbmNlLCB1aW50MTZfdCBtb2RlLCBpbnQxNl90IGFyZ2MsCiAgICAgICAgIGNoYXIqIGFyZ25bXSwgY2hhciogYXJndltdLCBOUFNhdmVkRGF0YSogc2F2ZWQpOwogTlBFcnJvciBOUFBfRGVzdHJveShOUFAgaW5zdGFuY2UsIE5QU2F2ZWREYXRhKiogc2F2ZSk7CiBOUEVycm9yIE5QUF9TZXRXaW5kb3coTlBQIGluc3RhbmNlLCBOUFdpbmRvdyogd2luZG93KTsKIE5QRXJyb3IgTlBQX05ld1N0cmVhbShOUFAgaW5zdGFuY2UsIE5QTUlNRVR5cGUgdHlwZSwgTlBTdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgTlBCb29sIHNlZWthYmxlLCB1aW50MTYqIHN0eXBlKTsKKyAgICAgICAgTlBCb29sIHNlZWthYmxlLCB1aW50MTZfdCogc3R5cGUpOwogTlBFcnJvciBOUFBfRGVzdHJveVN0cmVhbShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIE5QUmVhc29uIHJlYXNvbik7Ci1pbnQzMiAgIE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSk7Ci1pbnQzMiAgIE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyIG9mZnNldCwgaW50MzIgbGVuLAoraW50MzJfdCAgIE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSk7CitpbnQzMl90ICAgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzJfdCBvZmZzZXQsIGludDMyX3QgbGVuLAogICAgICAgICB2b2lkKiBidWZmZXIpOwogdm9pZCAgICBOUFBfU3RyZWFtQXNGaWxlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgY29uc3QgY2hhciogZm5hbWUpOwogdm9pZCAgICBOUFBfUHJpbnQoTlBQIGluc3RhbmNlLCBOUFByaW50KiBwbGF0Zm9ybVByaW50KTsKLWludDE2ICAgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpOworaW50MTZfdCAgIE5QUF9IYW5kbGVFdmVudChOUFAgaW5zdGFuY2UsIHZvaWQqIGV2ZW50KTsKIHZvaWQgICAgTlBQX1VSTE5vdGlmeShOUFAgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIFVSTCwgTlBSZWFzb24gcmVhc29uLAogICAgICAgICB2b2lkKiBub3RpZnlEYXRhKTsKIE5QRXJyb3IgTlBQX0dldFZhbHVlKE5QUCBpbnN0YW5jZSwgTlBQVmFyaWFibGUgdmFyaWFibGUsIHZvaWQgKnZhbHVlKTsKQEAgLTEyOSw3ICsxMjksNyBAQAogICAgIHJldHVybiAiYXBwbGljYXRpb24veC1icm93c2VydGVzdHBsdWdpbjpidHA6QW5kcm9pZCBCcm93c2VyIFRlc3QgUGx1Z2luIjsKIH0KIAotTlBFcnJvciBOUFBfTmV3KE5QTUlNRVR5cGUgcGx1Z2luVHlwZSwgTlBQIGluc3RhbmNlLCB1aW50MTYgbW9kZSwgaW50MTYgYXJnYywKK05QRXJyb3IgTlBQX05ldyhOUE1JTUVUeXBlIHBsdWdpblR5cGUsIE5QUCBpbnN0YW5jZSwgdWludDE2X3QgbW9kZSwgaW50MTZfdCBhcmdjLAogICAgICAgICAgICAgICAgIGNoYXIqIGFyZ25bXSwgY2hhciogYXJndltdLCBOUFNhdmVkRGF0YSogc2F2ZWQpCiB7CiAKQEAgLTE4OCw3ICsxODgsNyBAQAogICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKIH0KIAotTlBFcnJvciBOUFBfTmV3U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBNSU1FVHlwZSB0eXBlLCBOUFN0cmVhbSogc3RyZWFtLCBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNiogc3R5cGUpCitOUEVycm9yIE5QUF9OZXdTdHJlYW0oTlBQIGluc3RhbmNlLCBOUE1JTUVUeXBlIHR5cGUsIE5QU3RyZWFtKiBzdHJlYW0sIE5QQm9vbCBzZWVrYWJsZSwgdWludDE2X3QqIHN0eXBlKQogewogICAgICpzdHlwZSA9IE5QX0FTRklMRU9OTFk7CiAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwpAQCAtMTk5LDEyICsxOTksMTIgQEAKICAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7CiB9CiAKLWludDMyIE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSkKK2ludDMyX3QgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKQogewogICAgIHJldHVybiAwOwogfQogCi1pbnQzMiBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMiBvZmZzZXQsIGludDMyIGxlbiwgdm9pZCogYnVmZmVyKQoraW50MzJfdCBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMl90IG9mZnNldCwgaW50MzJfdCBsZW4sIHZvaWQqIGJ1ZmZlcikKIHsKICAgICByZXR1cm4gMDsKIH0KQEAgLTIxNyw3ICsyMTcsNyBAQAogewogfQogCi1pbnQxNiBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCkKK2ludDE2X3QgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpCiB7CiAgICAgUGx1Z2luT2JqZWN0ICpvYmogPSByZWludGVycHJldF9jYXN0PFBsdWdpbk9iamVjdCo+KGluc3RhbmNlLT5wZGF0YSk7CiAgICAgY29uc3QgQU5QRXZlbnQqIGV2dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQU5QRXZlbnQqPihldmVudCk7CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAwM2I3ZTI2Li5jMTUxMjUxIDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE4LDE1ICsxOCwxOCBAQAogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOm5hbWU9IkhUTUxIb3N0QXBwIj4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik1lbnUiIGFuZHJvaWQ6bGFiZWw9IkR1bXAgUmVuZGVyIFRyZWUiCi0gICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiPgorICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249InBvcnRyYWl0IgorICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkxpZ2h0Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5URVNUIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJUZXN0U2hlbGxBY3Rpdml0eSIgYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVUb3AiCi0gICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiLz4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iUmVsaWFiaWxpdHlUZXN0QWN0aXZpdHkiIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249InBvcnRyYWl0Ii8+CisgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiCisgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTGlnaHQiLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iUmVsaWFiaWxpdHlUZXN0QWN0aXZpdHkiIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249InBvcnRyYWl0IgorICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkxpZ2h0Ii8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSIuTGF5b3V0VGVzdHNBdXRvUnVubmVyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvYXNzZXRzL3J1bl9sYXlvdXRfdGVzdHMucHkgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weQppbmRleCBiNmU3YmYzLi5jZWFjNWQyIDEwMDc1NQotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weQpAQCAtMTc2LDcgKzE3Niw3IEBACiAgICMgQ291bnQgY3Jhc2hlZCB0ZXN0cy4KICAgY3Jhc2hlZF90ZXN0cyA9IFtdCiAKLSAgdGltZW91dF9tcyA9ICczMDAwMCcKKyAgdGltZW91dF9tcyA9ICcxNTAwMCcKICAgaWYgb3B0aW9ucy50aW1lX291dF9tczoKICAgICB0aW1lb3V0X21zID0gb3B0aW9ucy50aW1lX291dF9tcwogCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvQ2FsbGJhY2tQcm94eS5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0NhbGxiYWNrUHJveHkuamF2YQppbmRleCA1NzgwYzQzLi43NDBmNTQ0IDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvQ2FsbGJhY2tQcm94eS5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9DYWxsYmFja1Byb3h5LmphdmEKQEAgLTc0LDYgKzc0LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX1NFVF9DQU5fT1BFTl9XSU5ET1dTID0gNDI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVF9HRU9MT0NBVElPTl9QRVJNSVNTSU9OID0gNDM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9WRVJSSURFX1BSRUZFUkVOQ0UgPSA0NDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX0RVTVBfQ0hJTERfRlJBTUVTX1RFWFQgPSA0NTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUX1hTU19BVURJVE9SX0VOQUJMRUQgPSA0NjsKICAgICAKICAgICBDYWxsYmFja1Byb3h5KEV2ZW50U2VuZGVyIGV2ZW50U2VuZGVyLCAKICAgICAgICAgICAgIExheW91dFRlc3RDb250cm9sbGVyIGxheW91dFRlc3RDb250cm9sbGVyKSB7CkBAIC0xNzUsNyArMTc3LDExIEBACiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIExBWU9VVF9EVU1QX1RFWFQ6Ci0gICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dCgpOworICAgICAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQobXNnLmFyZzEgPT0gMSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExBWU9VVF9EVU1QX0NISUxEX0ZSQU1FU19URVhUOgorICAgICAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVyLmR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBMQVlPVVRfRFVNUF9ISVNUT1JZOgpAQCAtMjczLDYgKzI3OSwxMCBAQAogICAgICAgICAgICAgYm9vbGVhbiB2YWx1ZSA9IG1zZy5nZXREYXRhKCkuZ2V0Qm9vbGVhbigidmFsdWUiKTsKICAgICAgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlci5vdmVycmlkZVByZWZlcmVuY2Uoa2V5LCB2YWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNFVF9YU1NfQVVESVRPUl9FTkFCTEVEOgorICAgICAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVyLnNldFhTU0F1ZGl0b3JFbmFibGVkKG1zZy5hcmcxID09IDEpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM3Nyw3ICszODcsMTUgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBkdW1wQXNUZXh0KCkgewotICAgICAgICBvYnRhaW5NZXNzYWdlKExBWU9VVF9EVU1QX1RFWFQpLnNlbmRUb1RhcmdldCgpOworICAgICAgICBvYnRhaW5NZXNzYWdlKExBWU9VVF9EVU1QX1RFWFQsIDApLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoYm9vbGVhbiBlbmFibGVQaXhlbFRlc3RzKSB7CisgICAgICAgIG9idGFpbk1lc3NhZ2UoTEFZT1VUX0RVTVBfVEVYVCwgZW5hYmxlUGl4ZWxUZXN0cyA/IDEgOiAwKS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wQ2hpbGRGcmFtZXNBc1RleHQoKSB7CisgICAgICAgIG9idGFpbk1lc3NhZ2UoTEFZT1VUX0RVTVBfQ0hJTERfRlJBTUVTX1RFWFQpLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGR1bXBCYWNrRm9yd2FyZExpc3QoKSB7CkBAIC00OTIsMTAgKzUxMCwyMiBAQAogICAgICAgICBvYnRhaW5NZXNzYWdlKFNFVF9HRU9MT0NBVElPTl9QRVJNSVNTSU9OLCBhbGxvdyA/IDEgOiAwLCAwKS5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oYm9vbGVhbiBjYW5Qcm92aWRlQWxwaGEsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsIGRvdWJsZSBiZXRhLCBib29sZWFuIGNhblByb3ZpZGVHYW1tYSwgZG91YmxlIGdhbW1hKSB7CisgICAgICAgIC8vIENvbmZpZ3VyYXRpb24gaXMgaW4gV2ViS2l0LCBzbyBzdGF5IG9uIFdlYkNvcmUgdGhyZWFkLCBidXQgZ28gdmlhIHRoZSBUZXN0U2hlbGxBY3Rpdml0eQorICAgICAgICAvLyBhcyB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgV2Vidmlldy4KKyAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVyLnNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihjYW5Qcm92aWRlQWxwaGEsIGFscGhhLCBjYW5Qcm92aWRlQmV0YSwgYmV0YSwKKyAgICAgICAgICAgICAgICBjYW5Qcm92aWRlR2FtbWEsIGdhbW1hKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBvdmVycmlkZVByZWZlcmVuY2UoU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgewogICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBvYnRhaW5NZXNzYWdlKE9WRVJSSURFX1BSRUZFUkVOQ0UpOwogICAgICAgICBtZXNzYWdlLmdldERhdGEoKS5wdXRTdHJpbmcoImtleSIsIGtleSk7CiAgICAgICAgIG1lc3NhZ2UuZ2V0RGF0YSgpLnB1dEJvb2xlYW4oInZhbHVlIiwgdmFsdWUpOwogICAgICAgICBtZXNzYWdlLnNlbmRUb1RhcmdldCgpOwogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFhTU0F1ZGl0b3JFbmFibGVkKGJvb2xlYW4gZmxhZykgeworICAgICAgICBvYnRhaW5NZXNzYWdlKFNFVF9YU1NfQVVESVRPUl9FTkFCTEVELCBmbGFnID8gMSA6IDAsIDApLnNlbmRUb1RhcmdldCgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9GaWxlRmlsdGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRmlsZUZpbHRlci5qYXZhCmluZGV4IDc3ZmQzZWQuLjRjZmYzZGUyIDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRmlsZUZpbHRlci5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9GaWxlRmlsdGVyLmphdmEKQEAgLTczLDQzICs3Myw3NCBAQAogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGlnbm9yZVRlc3RMaXN0ID0gewogICAgICAgICAiZWRpdGluZy9zZWxlY3Rpb24vbW92ZS1sZWZ0LXJpZ2h0Lmh0bWwiLCAvLyBDYXVzZXMgRHVtcFJlbmRlclRyZWUgdG8gaGFuZworICAgICAgICAiZmFzdC9qcy9leGNlc3NpdmUtY29tbWEtdXNhZ2UuaHRtbCIsIC8vIFRlc3RzIGh1Z2UgaW5pdGlhbGl6ZXIgbGlzdCwgY2F1c2VzIE9PTS4KICAgICAgICAgImZhc3QvanMvcmVnZXhwLWNoYXJjbGFzcy1jcmFzaC5odG1sIiwgLy8gUmVnRXhwIGlzIHRvbyBsYXJnZSwgY2F1c2luZyBPT00KICAgICAgICAgImZhc3QvcmVnZXgvdGVzdDEuaHRtbCIsIC8vIENhdXNlcyBEdW1wUmVuZGVyVHJlZSB0byBoYW5nIHdpdGggVjgKLSAgICAgICAgImZhc3QvcmVnZXgvc2xvdy5odG1sIiAvLyBDYXVzZXMgRHVtcFJlbmRlclRyZWUgdG8gaGFuZyB3aXRoIFY4CisgICAgICAgICJmYXN0L3JlZ2V4L3Nsb3cuaHRtbCIsIC8vIENhdXNlcyBEdW1wUmVuZGVyVHJlZSB0byBoYW5nIHdpdGggVjgKKyAgICAgICAgImlldGVzdGNlbnRlci9KYXZhc2NyaXB0LzE1LjQuNC4xNS0zLTE0Lmh0bWwiLCAvLyBoYW5ncyB0aGUgbGF5b3V0IHRlc3RzCisgICAgICAgIC8vIGh0dHA6Ly9iL2lzc3VlP2lkPTI4ODk1OTUKKyAgICAgICAgImlldGVzdGNlbnRlci9KYXZhc2NyaXB0LzE1LjQuNC4xNS0zLTI5Lmh0bWwiLCAvLyBoYW5ncyB0aGUgbGF5b3V0IHRlc3RzCisgICAgICAgIC8vIGh0dHA6Ly9iL2lzc3VlP2lkPTI4ODk1OTYKKyAgICAgICAgImlldGVzdGNlbnRlci9KYXZhc2NyaXB0LzE1LjQuNC4xNS0zLTguaHRtbCIgLy8gaGFuZ3MgdGhlIGxheW91dCB0ZXN0cworICAgICAgICAvLyBodHRwOi8vYi9pc3N1ZT9pZD0yODg5NTk4CiAgICAgfTsKIAogICAgIHN0YXRpYyB2b2lkIGZpbGxJZ25vcmVSZXN1bHRMaXN0KCkgewotICAgICAgICAvLyBUaGlzIGZpcnN0IGJsb2NrIG9mIHRlc3RzIGFyZSBmb3IgSFRNTDUgZmVhdHVyZXMsIGZvciB3aGljaCBBbmRyb2lkCisgICAgICAgIC8vIFRoaXMgZmlyc3QgYmxvY2sgb2YgdGVzdHMgYXJlIGZvciBmZWF0dXJlcyBmb3Igd2hpY2ggQW5kcm9pZAogICAgICAgICAvLyBzaG91bGQgcGFzcyBhbGwgdGVzdHMuIFRoZXkgYXJlIHNraXBwZWQgb25seSB0ZW1wb3JhcmlseS4KICAgICAgICAgLy8gVE9ETzogRml4IHRoZXNlIGZhaWxpbmcgdGVzdHMgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhpcyBsaXN0LgorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9ldmVudHMvdG91Y2gvYmFzaWMtbXVsdGktdG91Y2gtZXZlbnRzLmh0bWwiKTsgLy8gUmVxdWlyZXMgbXVsdGktdG91Y2gKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZXZlbnRzL3RvdWNoL3RvdWNoLXRhcmdldC5odG1sIik7IC8vIFJlcXVpcmVzIG11bHRpLXRvdWNoCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL2FwcGNhY2hlL2VtcHR5LW1hbmlmZXN0Lmh0bWwiKTsgLy8gZmxha3kKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMvYXBwY2FjaGUvZmFsbGJhY2suaHRtbCIpOyAvLyBodHRwOi8vYi9pc3N1ZT9pZD0yNzEzMDA0CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL2FwcGNhY2hlL2ZvcmVpZ24taWZyYW1lLW1haW4uaHRtbCIpOyAvLyBmbGFreSAtIHNraXBzIHN0YXRlcwogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy9hcHBjYWNoZS9tYW5pZmVzdC13aXRoLWVtcHR5LWZpbGUuaHRtbCIpOyAvLyBmbGFreQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy9hcHBjYWNoZS9vcmlnaW4tcXVvdGEuaHRtbCIpOyAvLyBuZWVkcyBjbGVhckFsbEFwcGxpY2F0aW9uQ2FjaGVzKCksIHNlZSBodHRwOi8vYi9pc3N1ZT9pZD0yOTQ0MTk2CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLmh0bWwiKTsgLy8gU3VjY2VlZHMgYnV0IER1bXBSZW5kZXJUcmVlIGRvZXMgbm90IHJlYWQgcmVzdWx0IGNvcnJlY3RseQogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9oYXNoLWNoYW5nZS13aXRoLXhoci5odG1sIik7IC8vIFN1Y2NlZWRzIGJ1dCBEdW1wUmVuZGVyVHJlZSBkb2VzIG5vdCByZWFkIHJlc3VsdCBjb3JyZWN0bHkKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2Uvb3Blbi1kYXRhYmFzZS1jcmVhdGlvbi1jYWxsYmFjay1pc29sYXRlZC13b3JsZC5odG1sIik7IC8vIFJlcXVpcmVzIGxheW91dFRlc3RDb250cm9sbGVyLmV2YWx1YXRlU2NyaXB0SW5Jc29sYXRlZFdvcmxkKCkKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2Uvc3RhdGVtZW50LWVycm9yLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9zdGF0ZW1lbnQtc3VjY2Vzcy1jYWxsYmFjay1pc29sYXRlZC13b3JsZC5odG1sIik7IC8vIFJlcXVpcmVzIGxheW91dFRlc3RDb250cm9sbGVyLmV2YWx1YXRlU2NyaXB0SW5Jc29sYXRlZFdvcmxkKCkKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvdHJhbnNhY3Rpb24tY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL3RyYW5zYWN0aW9uLWVycm9yLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS90cmFuc2FjdGlvbi1zdWNjZXNzLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQogCi0gICAgICAgIC8vIFdpbGwgYWx3YXlzIGZhaWwKLSAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS9zdmcvbGV2ZWwzL3hwYXRoIik7IC8vIFhQYXRoIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgLy8gRXhwZWN0ZWQgZmFpbHVyZXMgZHVlIHRvIHVuc3VwcG9ydGVkIGZlYXR1cmVzLgorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9ldmVudHMvdG91Y2gvdG91Y2gtY29vcmRzLWluLXpvb20tYW5kLXNjcm9sbC5odG1sIik7IC8vIFJlcXVpcmVzIGV2ZW50U2VuZGVyLnpvb21QYWdlSW4oKSx6b29tUGFnZU91dCgpCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L3dvcmtlcnMiKTsgLy8gd29ya2VycyBub3Qgc3VwcG9ydGVkCi0gICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L3hwYXRoIik7IC8vIFhQYXRoIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMvZXZlbnRzb3VyY2Uvd29ya2VycyIpOyAvLyB3b3JrZXJzIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMvd29ya2VycyIpOyAvLyB3b3JrZXJzIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMveG1saHR0cHJlcXVlc3Qvd29ya2VycyIpOyAvLyB3b3JrZXJzIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvZG9tc3RvcmFnZS9sb2NhbHN0b3JhZ2UvcHJpdmF0ZS1icm93c2luZy1hZmZlY3RzLXN0b3JhZ2UuaHRtbCIpOyAvLyBwcml2YXRlIGJyb3dzaW5nIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvZG9tc3RvcmFnZS9zZXNzaW9uc3RvcmFnZS9wcml2YXRlLWJyb3dzaW5nLWFmZmVjdHMtc3RvcmFnZS5odG1sIik7IC8vIHByaXZhdGUgYnJvd3Npbmcgbm90IHN1cHBvcnRlZAorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9pbmRleGVkZGIiKTsgLy8gaW5kZXhlZGRiIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvcHJpdmF0ZS1icm93c2luZy1yZWFkb25seS5odG1sIik7IC8vIHByaXZhdGUgYnJvd3Npbmcgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgid2Vic29ja2V0L3Rlc3RzL3dvcmtlcnMiKTsgLy8gd29ya2VycyBub3Qgc3VwcG9ydGVkCiAKKyAgICAgICAgLy8gRXhwZWN0ZWQgZmFpbHVyZXMgZHVlIHRvIG1pc3NpbmcgZXhwZWN0ZWQgcmVzdWx0cworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL2Nhbm9uaWNhbGZvcm0wOC54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL2Nhbm9uaWNhbGZvcm0wOS54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL2RvY3VtZW50Z2V0aW5wdXRlbmNvZGluZzAzLnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvZW50aXR5Z2V0aW5wdXRlbmNvZGluZzAyLnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvZW50aXR5Z2V0eG1sdmVyc2lvbjAyLnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWdldGJhc2V1cmkwNS54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVnZXRiYXNldXJpMDcueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlZ2V0YmFzZXVyaTA5LnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWdldGJhc2V1cmkxMC54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVnZXRiYXNldXJpMTEueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlZ2V0YmFzZXVyaTE1LnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWdldGJhc2V1cmkxNy54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVnZXRiYXNldXJpMTgueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlbG9va3VwbmFtZXNwYWNldXJpMDEueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlbG9va3VwcHJlZml4MTkueGh0bWwiKTsKKwogICAgICAgICAvLyBUT0RPOiBUaGVzZSBuZWVkIHRvIGJlIHRyaWFnZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvY3NzL2Nhc2UtdHJhbnNmb3JtLmh0bWwiKTsgLy8gd2lsbCBub3QgZml4ICM2MTk3MDcKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL0VsZW1lbnQvb2Zmc2V0TGVmdC1vZmZzZXRUb3AtYm9keS1xdWlyay5odG1sIik7IC8vIGRpZmZlcmVudCBzY3JlZW4gc2l6ZSByZXN1bHQgaW4gZXh0cmEgc3BhY2VzIGluIEFwcGxlIGNvbXBhcmVkIHRvIHVzCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9XaW5kb3cvUGx1Zy1pbnMuaHRtbCIpOyAvLyBuZWVkIHRlc3QgcGx1Z2luCi0gICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9XaW5kb3cvd2luZG93LXByb3BlcnRpZXMuaHRtbCIpOyAvLyB4c2x0IGFuZCB4cGF0aCBlbGVtZW50cyBtaXNzaW5nIGZyb20gcHJvcGVydHkgbGlzdAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vV2luZG93L3dpbmRvdy1zY3JlZW4tcHJvcGVydGllcy5odG1sIik7IC8vIHBpeGVsIGRlcHRoCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9XaW5kb3cvd2luZG93LXh5LXByb3BlcnRpZXMuaHRtbCIpOyAvLyByZXF1aXJlcyBldmVudFNlbmRlci5tb3VzZURvd24oKSxtb3VzZVVwKCkKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL2F0dHJpYnV0ZS1uYW1lc3BhY2VzLWdldC1zZXQuaHRtbCIpOyAvLyBodHRwOi8vYi83MzMyMjkKLSAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL2djLTkuaHRtbCIpOyAvLyByZXF1aXJlcyB4cGF0aCBzdXBwb3J0Ci0gICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9nbG9iYWwtY29uc3RydWN0b3JzLmh0bWwiKTsgLy8gcmVxdWlyZXMgeHNsdCBhbmQgeHBhdGggc3VwcG9ydAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vb2JqZWN0LWVtYmVkLXBsdWdpbi1zY3JpcHRpbmcuaHRtbCIpOyAvLyBkeW5hbWljIHBsdWdpbnMgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vdGFiaW5kZXgtY2xhbXAuaHRtbCIpOyAvLyB0aGVyZSBpcyBleHRyYSBzcGFjaW5nIGluIHRoZSBmaWxlIGR1ZSB0byBtdWx0aXBsZSBpbnB1dCBib3hlcyBmaXR0aW5nIG9uIG9uZSBsaW5lIG9uIEFwcGxlLCBvdXJzIGFyZSB3cmFwcGVkLiBTcGFjZSBhdCBsaW5lIGVuZHMgYXJlIHN0cmlwcGVkLgogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9ldmVudHMvYW5jaG9yLWltYWdlLXNjcm9sbGVkLXgteS5odG1sIik7IC8vIHJlcXVpcmVzIGV2ZW50U2VuZGVyLm1vdXNlRG93bigpLG1vdXNlVXAoKQpAQCAtMTcyLDggKzIwMyw2IEBACiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L3JlcGxhY2VkL2ltYWdlLW1hcC5odG1sIik7IC8vIHJlcXVpcmVzIGV2ZW50U2VuZGVyLm1vdXNlRG93bigpLG1vdXNlVXAoKQogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC90ZXh0L3BsYWluLXRleHQtbGluZS1icmVha3MuaHRtbCIpOyAvLyBleHRyYSBzcGFjaW5nIGJlY2F1c2UgaUZyYW1lcyByZW5kZXJlZCBuZXh0IHRvIGVhY2ggb3RoZXIgb24gQXBwbGUKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInByb2ZpbGVyIik7IC8vIHByb2ZpbGVyIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN2ZyIpOyAvLyBzdmcgaXMgbm90IHN1cHBvcnRlZAotCiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRnNVdGlscy5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZzVXRpbHMuamF2YQppbmRleCA2Y2ZjZTQxLi41ZDM0ZTI1IDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRnNVdGlscy5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9Gc1V0aWxzLmphdmEKQEAgLTQ5LDggKzQ5LDEzIEBACiAgICAgICAgIC8vbm8gY3JlYXRpb24gb2YgaW5zdGFuY2VzCiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbmRMYXlvdXRUZXN0c1JlY3Vyc2l2ZWx5KEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcywKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdGVzdHMgaW4gdGhlIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgd3JpdGVMYXlvdXRUZXN0TGlzdFJlY3Vyc2l2ZWx5KEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcywKICAgICAgICAgICAgIFN0cmluZyBkaXIsIGJvb2xlYW4gaWdub3JlUmVzdWx0c0luRGlyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGludCB0ZXN0Q291bnQgPSAwOwogICAgICAgICBMb2cudihMT0dUQUcsICJTZWFyY2hpbmcgdGVzdHMgdW5kZXIgIiArIGRpcik7CiAKICAgICAgICAgRmlsZSBkID0gbmV3IEZpbGUoZGlyKTsKQEAgLTY4LDcgKzczLDcgQEAKICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIHRlc3QgZGlyZWN0b3J5LCB3ZSBkb24ndCByZWN1cnNlIGludG8gaXQuCiAgICAgICAgICAgICAgICAgaWYgKCFGaWxlRmlsdGVyLmlzTm9uVGVzdERpcihzKSkgewogICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJSZWN1cnNpbmcgb24gIiArIHMpOwotICAgICAgICAgICAgICAgICAgICBmaW5kTGF5b3V0VGVzdHNSZWN1cnNpdmVseShib3MsIHMsIGlnbm9yZVJlc3VsdHNJbkRpcik7CisgICAgICAgICAgICAgICAgICAgIHRlc3RDb3VudCArPSB3cml0ZUxheW91dFRlc3RMaXN0UmVjdXJzaXZlbHkoYm9zLCBzLCBpZ25vcmVSZXN1bHRzSW5EaXIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KQEAgLTc5LDcgKzg0LDkgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKChzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5odG1sIikgfHwgcy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIueG1sIikpCisgICAgICAgICAgICBpZiAoKHMudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmh0bWwiKQorICAgICAgICAgICAgICAgICAgICB8fCBzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi54bWwiKQorICAgICAgICAgICAgICAgICAgICB8fCBzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi54aHRtbCIpKQogICAgICAgICAgICAgICAgICAgICAmJiAhcy5lbmRzV2l0aCgiVEVNUExBVEUuaHRtbCIpKSB7CiAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiUmVjb3JkaW5nICIgKyBzKTsKICAgICAgICAgICAgICAgICBib3Mud3JpdGUocy5nZXRCeXRlcygpKTsKQEAgLTg4LDggKzk1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGJvcy53cml0ZSgoIiBJR05PUkVfUkVTVUxUIikuZ2V0Qnl0ZXMoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJvcy53cml0ZSgnXG4nKTsKKyAgICAgICAgICAgICAgICB0ZXN0Q291bnQrKzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICByZXR1cm4gdGVzdENvdW50OwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVUZXN0U3RhdHVzKFN0cmluZyBzdGF0dXNGaWxlLCBTdHJpbmcgcykgewpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RDb250cm9sbGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQppbmRleCA5MjM2MzQ1Li45YmUyZjFjIDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQpAQCAtMTgsMjkgKzE4LDMwIEBACiAKIHB1YmxpYyBpbnRlcmZhY2UgTGF5b3V0VGVzdENvbnRyb2xsZXIgewogCi0JcHVibGljIHZvaWQgZHVtcEFzVGV4dCgpOwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbERvbmUoKTsKLQlwdWJsaWMgdm9pZCBub3RpZnlEb25lKCk7Ci0JCi0JLy8gRm9yY2UgYSByZWRyYXcgb2YgdGhlIHBhZ2UKLQlwdWJsaWMgdm9pZCBkaXNwbGF5KCk7Ci0JLy8gVXNlZCB3aXRoIHBpeGVsIGR1bXBzIG9mIGNvbnRlbnQKLQlwdWJsaWMgdm9pZCB0ZXN0UmVwYWludCgpOwotCQotCS8vIElmIHRoZSBwYWdlIHRpdGxlIGNoYW5nZXMsIGFkZCB0aGUgaW5mb3JtYXRpb24gdG8gdGhlIG91dHB1dC4KLQlwdWJsaWMgdm9pZCBkdW1wVGl0bGVDaGFuZ2VzKCk7Ci0JcHVibGljIHZvaWQgZHVtcEJhY2tGb3J3YXJkTGlzdCgpOwotCXB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lU2Nyb2xsUG9zaXRpb25zKCk7Ci0JcHVibGljIHZvaWQgZHVtcEVkaXRpbmdDYWxsYmFja3MoKTsKLQkKLQkvLyBTaG93L0hpZGUgd2luZG93IGZvciB3aW5kb3cub25CbHVyKCkgdGVzdGluZwotCXB1YmxpYyB2b2lkIHNldFdpbmRvd0lzS2V5KGJvb2xlYW4gYik7Ci0JLy8gTWFjIGZ1bmN0aW9uLCB1c2VkIHRvIGRpc2FibGUgZXZlbnRzIGdvaW5nIHRvIHRoZSB3aW5kb3cKLQlwdWJsaWMgdm9pZCBzZXRNYWluRnJhbWVJc0ZpcnN0UmVzcG9uZGVyKGJvb2xlYW4gYik7Ci0JCi0JcHVibGljIHZvaWQgZHVtcFNlbGVjdGlvblJlY3QoKTsKLQkKLQkvLyBpbnZhbGlkYXRlIGFuZCBkcmF3IG9uZSBsaW5lIGF0IGEgdGltZSBvZiB0aGUgd2ViIHZpZXcuCisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dChib29sZWFuIGVuYWJsZVBpeGVsVGVzdHMpOworICAgIHB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpOworICAgIHB1YmxpYyB2b2lkIHdhaXRVbnRpbERvbmUoKTsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEb25lKCk7CisKKyAgICAvLyBGb3JjZSBhIHJlZHJhdyBvZiB0aGUgcGFnZQorICAgIHB1YmxpYyB2b2lkIGRpc3BsYXkoKTsKKyAgICAvLyBVc2VkIHdpdGggcGl4ZWwgZHVtcHMgb2YgY29udGVudAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBhaW50KCk7CisKKyAgICAvLyBJZiB0aGUgcGFnZSB0aXRsZSBjaGFuZ2VzLCBhZGQgdGhlIGluZm9ybWF0aW9uIHRvIHRoZSBvdXRwdXQuCisgICAgcHVibGljIHZvaWQgZHVtcFRpdGxlQ2hhbmdlcygpOworICAgIHB1YmxpYyB2b2lkIGR1bXBCYWNrRm9yd2FyZExpc3QoKTsKKyAgICBwdWJsaWMgdm9pZCBkdW1wQ2hpbGRGcmFtZVNjcm9sbFBvc2l0aW9ucygpOworICAgIHB1YmxpYyB2b2lkIGR1bXBFZGl0aW5nQ2FsbGJhY2tzKCk7CisKKyAgICAvLyBTaG93L0hpZGUgd2luZG93IGZvciB3aW5kb3cub25CbHVyKCkgdGVzdGluZworICAgIHB1YmxpYyB2b2lkIHNldFdpbmRvd0lzS2V5KGJvb2xlYW4gYik7CisgICAgLy8gTWFjIGZ1bmN0aW9uLCB1c2VkIHRvIGRpc2FibGUgZXZlbnRzIGdvaW5nIHRvIHRoZSB3aW5kb3cKKyAgICBwdWJsaWMgdm9pZCBzZXRNYWluRnJhbWVJc0ZpcnN0UmVzcG9uZGVyKGJvb2xlYW4gYik7CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wU2VsZWN0aW9uUmVjdCgpOworCisgICAgLy8gaW52YWxpZGF0ZSBhbmQgZHJhdyBvbmUgbGluZSBhdCBhIHRpbWUgb2YgdGhlIHdlYiB2aWV3LgogICAgIHB1YmxpYyB2b2lkIHJlcGFpbnRTd2VlcEhvcml6b250YWxseSgpOwogICAgIAogICAgIC8vIEhpc3RvcnkgdGVzdGluZyBmdW5jdGlvbnMKQEAgLTY3LDQgKzY4LDExIEBACiAgICAgcHVibGljIHZvaWQgc2V0R2VvbG9jYXRpb25QZXJtaXNzaW9uKGJvb2xlYW4gYWxsb3cpOwogCiAgICAgcHVibGljIHZvaWQgb3ZlcnJpZGVQcmVmZXJlbmNlKFN0cmluZyBrZXksIGJvb2xlYW4gdmFsdWUpOworCisgICAgLy8gRm9yIFhTU0F1ZGl0b3IgdGVzdHMKKyAgICBwdWJsaWMgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZChib29sZWFuIGZsYWcpOworCisgICAgLy8gRm9yIERldmljZU9yaWVudGF0aW9uIHRlc3RzCisgICAgcHVibGljIHZvaWQgc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGJvb2xlYW4gY2FuUHJvdmlkZUFscGhhLCBkb3VibGUgYWxwaGEsCisgICAgICAgICAgICBib29sZWFuIGNhblByb3ZpZGVCZXRhLCBkb3VibGUgYmV0YSwgYm9vbGVhbiBjYW5Qcm92aWRlR2FtbWEsIGRvdWJsZSBnYW1tYSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdHNBdXRvVGVzdC5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RzQXV0b1Rlc3QuamF2YQppbmRleCA5Y2NmNTQ5Li4xMzJmMTdhIDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdHNBdXRvVGVzdC5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0c0F1dG9UZXN0LmphdmEKQEAgLTIwLDkgKzIwLDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZS5mb3J3YXJkZXIuQWRiVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUuZm9yd2FyZGVyLkZvcndhcmRTZXJ2aWNlOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTE1OCwxOCArMTU2LDExIEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgbUpzRW5naW5lOwogICAgIHByaXZhdGUgU3RyaW5nIG1UZXN0UGF0aFByZWZpeDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUZpbmlzaGVkOworICAgIHByaXZhdGUgaW50IG1UZXN0Q291bnQ7CisgICAgcHJpdmF0ZSBpbnQgbVJlc3VtZUluZGV4OwogCiAgICAgcHVibGljIExheW91dFRlc3RzQXV0b1Rlc3QoKSB7Ci0gICAgICBzdXBlcigiY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUiLCBUZXN0U2hlbGxBY3Rpdml0eS5jbGFzcyk7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIHJlc3VsdCBvZiB0aGUgbGF5b3V0IHRlc3QgdG8KLSAgICAvLyBBbSBzdGF0dXMgc28gdGhhdCBpdCBjYW4gYmUgcGlja2VkIHVwIGZyb20gYSBzY3JpcHQuCi0gICAgcHJpdmF0ZSB2b2lkIHBhc3NPckZhaWxDYWxsYmFjayhTdHJpbmcgZmlsZSwgYm9vbGVhbiByZXN1bHQpIHsKLSAgICAgIEluc3RydW1lbnRhdGlvbiBpbnN0ID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCk7Ci0gICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgYnVuZGxlLnB1dEJvb2xlYW4oZmlsZSwgcmVzdWx0KTsKLSAgICAgIGluc3Quc2VuZFN0YXR1cygwLCBidW5kbGUpOworICAgICAgc3VwZXIoVGVzdFNoZWxsQWN0aXZpdHkuY2xhc3MpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBnZXRUZXN0TGlzdCgpIHsKQEAgLTE5MCw2ICsxODEsNyBAQAogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiRXJyb3Igd2hpbGUgcmVhZGluZyB0ZXN0IGxpc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICB9CisgICAgICAgIG1UZXN0Q291bnQgPSBtVGVzdExpc3Quc2l6ZSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZXN1bWVUZXN0TGlzdCgpIHsKQEAgLTIwMCw2ICsxOTIsNyBAQAogICAgICAgICAgICAgICAgIGlmIChtVGVzdExpc3QuZWxlbWVudEF0KGkpLmVxdWFscyhsaW5lKSkgewogICAgICAgICAgICAgICAgICAgICBtVGVzdExpc3QgPSBuZXcgVmVjdG9yPFN0cmluZz4obVRlc3RMaXN0LnN1Ykxpc3QoaSsxLCBtVGVzdExpc3Quc2l6ZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgIG1UZXN0TGlzdElnbm9yZVJlc3VsdCA9IG5ldyBWZWN0b3I8Qm9vbGVhbj4obVRlc3RMaXN0SWdub3JlUmVzdWx0LnN1Ykxpc3QoaSsxLCBtVGVzdExpc3RJZ25vcmVSZXN1bHQuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIG1SZXN1bWVJbmRleCA9IGkgKyAxOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMzIsMTQgKzIyNSwyMiBAQAogICAgICAgICAvLyBUaGUgZ2VuZXJpYyByZXN1bHQgaXMgYXQgPHBhdGg+LzxuYW1lPi1leHBlY3RlZC50eHQKICAgICAgICAgLy8gRmlyc3QgdHJ5IHRoZSBBbmRyb2lkLXNwZWNpZmljIHJlc3VsdCBhdAogICAgICAgICAvLyBwbGF0Zm9ybS9hbmRyb2lkLTxqcy1lbmdpbmU+LzxwYXRoPi88bmFtZT4tZXhwZWN0ZWQudHh0CisgICAgICAgIC8vIHRoZW4KKyAgICAgICAgLy8gcGxhdGZvcm0vYW5kcm9pZC88cGF0aD4vPG5hbWU+LWV4cGVjdGVkLnR4dAogICAgICAgICBpbnQgcG9zID0gdGVzdC5sYXN0SW5kZXhPZignLicpOwogICAgICAgICBpZiAocG9zID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIFN0cmluZyBnZW5lcmljRXhwZWN0ZWRSZXN1bHQgPSB0ZXN0LnN1YnN0cmluZygwLCBwb3MpICsgIi1leHBlY3RlZC50eHQiOwogICAgICAgICBTdHJpbmcgYW5kcm9pZEV4cGVjdGVkUmVzdWx0c0RpciA9ICJwbGF0Zm9ybS9hbmRyb2lkLSIgKyBtSnNFbmdpbmUgKyAiLyI7Ci0gICAgICAgIFN0cmluZyBhbmRyb2lkRXhwZWN0ZWRSZXN1bHQgPQotICAgICAgICAgICAgZ2VuZXJpY0V4cGVjdGVkUmVzdWx0LnJlcGxhY2VGaXJzdChMQVlPVVRfVEVTVFNfUk9PVCwgTEFZT1VUX1RFU1RTX1JPT1QgKyBhbmRyb2lkRXhwZWN0ZWRSZXN1bHRzRGlyKTsKKyAgICAgICAgU3RyaW5nIGFuZHJvaWRFeHBlY3RlZFJlc3VsdCA9IGdlbmVyaWNFeHBlY3RlZFJlc3VsdC5yZXBsYWNlRmlyc3QoTEFZT1VUX1RFU1RTX1JPT1QsCisgICAgICAgICAgICAgICAgTEFZT1VUX1RFU1RTX1JPT1QgKyBhbmRyb2lkRXhwZWN0ZWRSZXN1bHRzRGlyKTsKICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYW5kcm9pZEV4cGVjdGVkUmVzdWx0KTsKKyAgICAgICAgaWYgKGYuZXhpc3RzKCkpCisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZEV4cGVjdGVkUmVzdWx0OworICAgICAgICBhbmRyb2lkRXhwZWN0ZWRSZXN1bHRzRGlyID0gInBsYXRmb3JtL2FuZHJvaWQvIjsKKyAgICAgICAgYW5kcm9pZEV4cGVjdGVkUmVzdWx0ID0gZ2VuZXJpY0V4cGVjdGVkUmVzdWx0LnJlcGxhY2VGaXJzdChMQVlPVVRfVEVTVFNfUk9PVCwKKyAgICAgICAgICAgICAgICBMQVlPVVRfVEVTVFNfUk9PVCArIGFuZHJvaWRFeHBlY3RlZFJlc3VsdHNEaXIpOworICAgICAgICBmID0gbmV3IEZpbGUoYW5kcm9pZEV4cGVjdGVkUmVzdWx0KTsKICAgICAgICAgcmV0dXJuIGYuZXhpc3RzKCkgPyBhbmRyb2lkRXhwZWN0ZWRSZXN1bHQgOiBnZW5lcmljRXhwZWN0ZWRSZXN1bHQ7CiAgICAgfQogCkBAIC0zMDAsNyArMzAxLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBydW5UZXN0QW5kV2FpdFVudGlsRG9uZShUZXN0U2hlbGxBY3Rpdml0eSBhY3Rpdml0eSwgU3RyaW5nIHRlc3QsIGludCB0aW1lb3V0LCBib29sZWFuIGlnbm9yZVJlc3VsdCkgeworICAgIHByaXZhdGUgdm9pZCBydW5UZXN0QW5kV2FpdFVudGlsRG9uZShUZXN0U2hlbGxBY3Rpdml0eSBhY3Rpdml0eSwgU3RyaW5nIHRlc3QsIGludCB0aW1lb3V0LCBib29sZWFuIGlnbm9yZVJlc3VsdCwgaW50IHRlc3ROdW1iZXIpIHsKICAgICAgICAgYWN0aXZpdHkuc2V0Q2FsbGJhY2sobmV3IFRlc3RTaGVsbENhbGxiYWNrKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgZmluaXNoZWQoKSB7CiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChMYXlvdXRUZXN0c0F1dG9UZXN0LnRoaXMpIHsKQEAgLTMzNiw2ICszMzcsOSBAQAogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVEVTVF9VUkwsIEZzVXRpbHMuZ2V0VGVzdFVybCh0ZXN0KSk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5SRVNVTFRfRklMRSwgcmVzdWx0RmlsZSk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5USU1FT1VUX0lOX01JTExJUywgdGltZW91dCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5UT1RBTF9URVNUX0NPVU5ULCBtVGVzdENvdW50KTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LkNVUlJFTlRfVEVTVF9OVU1CRVIsIHRlc3ROdW1iZXIpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuU1RPUF9PTl9SRUZfRVJST1IsIHRydWUpOwogICAgICAgICBhY3Rpdml0eS5zdGFydEFjdGl2aXR5KGludGVudCk7CiAKICAgICAgICAgLy8gV2FpdCB1bnRpbCBkb25lLgpAQCAtMzc1LDggKzM3OSw4IEBACiAgICAgICAgIC8vIFJlYWQgc2V0dGluZ3MKICAgICAgICAgbVRlc3RQYXRoUHJlZml4ID0gKG5ldyBGaWxlKExBWU9VVF9URVNUU19ST09UICsgcnVubmVyLm1UZXN0UGF0aCkpLmdldEFic29sdXRlUGF0aCgpOwogICAgICAgICBtUmViYXNlbGluZVJlc3VsdHMgPSBydW5uZXIubVJlYmFzZWxpbmU7Ci0gICAgICAgIC8vIEpTQyBpcyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IGVuZ2luZS4KLSAgICAgICAgbUpzRW5naW5lID0gcnVubmVyLm1Kc0VuZ2luZSA9PSBudWxsID8gImpzYyIgOiBydW5uZXIubUpzRW5naW5lOworICAgICAgICAvLyBWOCBpcyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IGVuZ2luZS4KKyAgICAgICAgbUpzRW5naW5lID0gcnVubmVyLm1Kc0VuZ2luZSA9PSBudWxsID8gInY4IiA6IHJ1bm5lci5tSnNFbmdpbmU7CiAKICAgICAgICAgaW50IHRpbWVvdXQgPSBydW5uZXIubVRpbWVvdXRJbk1pbGxpczsKICAgICAgICAgaWYgKHRpbWVvdXQgPD0gMCkgewpAQCAtMzkzLDcgKzM5Nyw3IEBACiAgICAgICAgICAgICByZXN1bWVUZXN0TGlzdCgpOwogCiAgICAgICAgIFRlc3RTaGVsbEFjdGl2aXR5IGFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKLSAgICAgICAgYWN0aXZpdHkuc2V0RGVmYXVsdER1bXBEYXRhVHlwZShEdW1wRGF0YVR5cGUuRFVNUF9BU19URVhUKTsKKyAgICAgICAgYWN0aXZpdHkuc2V0RGVmYXVsdER1bXBEYXRhVHlwZShEdW1wRGF0YVR5cGUuRVhUX1JFUFIpOwogCiAgICAgICAgIC8vIFJ1biB0ZXN0cy4KICAgICAgICAgaW50IGFkZHIgPSAtMTsKQEAgLTQxMCw3ICs0MTQsOSBAQAogICAgICAgICAgICAgYm9vbGVhbiBpZ25vcmVSZXN1bHQgPSBtVGVzdExpc3RJZ25vcmVSZXN1bHQuZWxlbWVudEF0KGkpOwogICAgICAgICAgICAgRnNVdGlscy51cGRhdGVUZXN0U3RhdHVzKFRFU1RfU1RBVFVTX0ZJTEUsIHMpOwogICAgICAgICAgICAgLy8gUnVuIHRlc3RzCi0gICAgICAgICAgICBydW5UZXN0QW5kV2FpdFVudGlsRG9uZShhY3Rpdml0eSwgcywgcnVubmVyLm1UaW1lb3V0SW5NaWxsaXMsIGlnbm9yZVJlc3VsdCk7CisgICAgICAgICAgICAvLyBpIGlzIDAgYmFzZWQsIGJ1dCB0ZXN0IGNvdW50IGlzIDEgYmFzZWQgc28gYWRkIDEgdG8gaSBoZXJlLgorICAgICAgICAgICAgcnVuVGVzdEFuZFdhaXRVbnRpbERvbmUoYWN0aXZpdHksIHMsIHJ1bm5lci5tVGltZW91dEluTWlsbGlzLCBpZ25vcmVSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgIGkgKyAxICsgbVJlc3VtZUluZGV4KTsKICAgICAgICAgfQogCiAgICAgICAgIEZzVXRpbHMudXBkYXRlVGVzdFN0YXR1cyhURVNUX1NUQVRVU19GSUxFLCAiI0RPTkUiKTsKQEAgLTQzNSw3ICs0NDEsNyBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgRmlsZSB0ZXN0c19saXN0ID0gbmV3IEZpbGUoTEFZT1VUX1RFU1RTX0xJU1RfRklMRSk7CiAgICAgICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0odGVzdHNfbGlzdCwgZmFsc2UpKTsKLSAgICAgICAgICAgIEZzVXRpbHMuZmluZExheW91dFRlc3RzUmVjdXJzaXZlbHkoYm9zLCBnZXRUZXN0UGF0aCgpLCBmYWxzZSk7IC8vIERvbid0IGlnbm9yZSByZXN1bHRzCisgICAgICAgICAgICBGc1V0aWxzLndyaXRlTGF5b3V0VGVzdExpc3RSZWN1cnNpdmVseShib3MsIGdldFRlc3RQYXRoKCksIGZhbHNlKTsgLy8gRG9uJ3QgaWdub3JlIHJlc3VsdHMKICAgICAgICAgICAgIGJvcy5mbHVzaCgpOwogICAgICAgICAgICAgYm9zLmNsb3NlKCk7CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9NZW51LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTWVudS5qYXZhCmluZGV4IDljNGI1NzI1Ni4uMGIwMGQ2NSAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL01lbnUuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTWVudS5qYXZhCkBAIC01MywyOSArNTMsMzggQEAKICAgICAgICAgaW50ZW50LnNldENsYXNzKHRoaXMsIFRlc3RTaGVsbEFjdGl2aXR5LmNsYXNzKTsKICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX1NJTkdMRV9UT1ApOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVEVTVF9VUkwsICJmaWxlOi8vIiArIGZpbGVuYW1lKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRPVEFMX1RFU1RfQ09VTlQsIDEpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuQ1VSUkVOVF9URVNUX05VTUJFUiwgMSk7CiAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICB2b2lkIHByb2Nlc3NEaXJlY3RvcnkoU3RyaW5nIHBhdGgsIGJvb2xlYW4gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGdlbmVyYXRlVGVzdExpc3QocGF0aCk7CisgICAgICAgIGludCB0ZXN0Q291bnQgPSBnZW5lcmF0ZVRlc3RMaXN0KHBhdGgpOwogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcpOwogICAgICAgICBpbnRlbnQuc2V0Q2xhc3ModGhpcywgVGVzdFNoZWxsQWN0aXZpdHkuY2xhc3MpOwogICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfU0lOR0xFX1RPUCk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5VSV9BVVRPX1RFU1QsIExBWU9VVF9URVNUU19MSVNUX0ZJTEUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVE9UQUxfVEVTVF9DT1VOVCwgdGVzdENvdW50KTsKKyAgICAgICAgLy8gVGVzdFNoZWxsQWN0aXZpdHkgd2lsbCBwcm9jZXNzIHRoaXMgaW50ZW50IG9uY2UgYW5kIGluY3JlbWVudCB0aGUgdGVzdCBpbmRleAorICAgICAgICAvLyBiZWZvcmUgcnVubmluZyB0aGUgZmlyc3QgdGVzdCwgc28gcGFzcyAwIGhlcmUgdG8gYWxsb3cgZm9yIHRoYXQuCisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5DVVJSRU5UX1RFU1RfTlVNQkVSLCAwKTsKICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVRlc3RMaXN0KFN0cmluZyBwYXRoKSB7CisgICAgcHJpdmF0ZSBpbnQgZ2VuZXJhdGVUZXN0TGlzdChTdHJpbmcgcGF0aCkgeworICAgICAgICBpbnQgdGVzdENvdW50ID0gMDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEZpbGUgdGVzdHNfbGlzdCA9IG5ldyBGaWxlKExBWU9VVF9URVNUU19MSVNUX0ZJTEUpOwogICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlc3RzX2xpc3QsIGZhbHNlKSk7Ci0gICAgICAgICAgICBGc1V0aWxzLmZpbmRMYXlvdXRUZXN0c1JlY3Vyc2l2ZWx5KGJvcywgcGF0aCwgZmFsc2UpOyAvLyBEb24ndCBpZ25vcmUgcmVzdWx0cworICAgICAgICAgICAgdGVzdENvdW50ID0gRnNVdGlscy53cml0ZUxheW91dFRlc3RMaXN0UmVjdXJzaXZlbHkoCisgICAgICAgICAgICAgICAgICAgIGJvcywgcGF0aCwgZmFsc2UpOyAvLyBEb24ndCBpZ25vcmUgcmVzdWx0cwogICAgICAgICAgICAgYm9zLmZsdXNoKCk7CiAgICAgICAgICAgICBib3MuY2xvc2UoKTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICBMb2cuZShMT0dUQUcsICJFcnJvciB3aGVuIGNyZWF0aW5nIHRlc3QgbGlzdDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9CisgICAgICAgcmV0dXJuIHRlc3RDb3VudDsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9UZXN0U2hlbGxBY3Rpdml0eS5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1Rlc3RTaGVsbEFjdGl2aXR5LmphdmEKaW5kZXggNzQ3NTcxOS4uNDBhZjhjMCAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1Rlc3RTaGVsbEFjdGl2aXR5LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1Rlc3RTaGVsbEFjdGl2aXR5LmphdmEKQEAgLTM1LDYgKzM1LDggQEAKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuR2VvbG9jYXRpb25QZXJtaXNzaW9uczsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5IdHRwQXV0aEhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuSnNQcm9tcHRSZXN1bHQ7CkBAIC01NSw2ICs1Nyw3IEBACiBpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCkBAIC05OSw2ICsxMDIsOCBAQAogICAgICAgICBMb2cudihMT0dUQUcsICJtZXNzYWdlIHNlbnQgdG8gV2ViVmlldyB0byBkdW1wIHRleHQuIik7CiAgICAgICAgIHN3aXRjaCAobUR1bXBEYXRhVHlwZSkgewogICAgICAgICAgICAgY2FzZSBEVU1QX0FTX1RFWFQ6CisgICAgICAgICAgICAgICAgY2FsbGJhY2suYXJnMSA9IG1EdW1wVG9wRnJhbWVBc1RleHQgPyAxIDogMDsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5hcmcyID0gbUR1bXBDaGlsZEZyYW1lc0FzVGV4dCA/IDEgOiAwOwogICAgICAgICAgICAgICAgIG1XZWJWaWV3LmRvY3VtZW50QXNUZXh0KGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgRVhUX1JFUFI6CkBAIC0xMTcsNiArMTIyLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisgICAgICAgIHJlcXVlc3RXaW5kb3dGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX1BST0dSRVNTKTsKIAogICAgICAgICBMaW5lYXJMYXlvdXQgY29udGVudFZpZXcgPSBuZXcgTGluZWFyTGF5b3V0KHRoaXMpOwogICAgICAgICBjb250ZW50Vmlldy5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOwpAQCAtMTQ1LDYgKzE1MSw5IEBACiAgICAgICAgIGlmIChpbnRlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgZXhlY3V0ZUludGVudChpbnRlbnQpOwogICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBpcyBhc3luY2hyb25vdXMsIGJ1dCBpdCBnZXRzIHByb2Nlc3NlZCBieSBXZWJDb3JlIGJlZm9yZSBpdCBzdGFydHMgbG9hZGluZyBwYWdlcy4KKyAgICAgICAgbVdlYlZpZXcudXNlTW9ja0RldmljZU9yaWVudGF0aW9uKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNTksNiArMTY4LDkgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCisgICAgICAgIG1Ub3RhbFRlc3RDb3VudCA9IGludGVudC5nZXRJbnRFeHRyYShUT1RBTF9URVNUX0NPVU5ULCBtVG90YWxUZXN0Q291bnQpOworICAgICAgICBtQ3VycmVudFRlc3ROdW1iZXIgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQ1VSUkVOVF9URVNUX05VTUJFUiwgbUN1cnJlbnRUZXN0TnVtYmVyKTsKKwogICAgICAgICBtVGVzdFVybCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShURVNUX1VSTCk7CiAgICAgICAgIGlmIChtVGVzdFVybCA9PSBudWxsKSB7CiAgICAgICAgICAgICBtVWlBdXRvVGVzdFBhdGggPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoVUlfQVVUT19URVNUKTsKQEAgLTE3Miw2ICsxODQsMTEgQEAKICAgICAgICAgbVRpbWVvdXRJbk1pbGxpcyA9IGludGVudC5nZXRJbnRFeHRyYShUSU1FT1VUX0lOX01JTExJUywgMCk7CiAgICAgICAgIG1HZXREcmF3dGltZSA9IGludGVudC5nZXRCb29sZWFuRXh0cmEoR0VUX0RSQVdfVElNRSwgZmFsc2UpOwogICAgICAgICBtU2F2ZUltYWdlUGF0aCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShTQVZFX0lNQUdFKTsKKyAgICAgICAgbVN0b3BPblJlZkVycm9yID0gaW50ZW50LmdldEJvb2xlYW5FeHRyYShTVE9QX09OX1JFRl9FUlJPUiwgZmFsc2UpOworICAgICAgICBzZXRUaXRsZSgiVGVzdCAiICsgbUN1cnJlbnRUZXN0TnVtYmVyICsgIiBvZiAiICsgbVRvdGFsVGVzdENvdW50KTsKKyAgICAgICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpbUN1cnJlbnRUZXN0TnVtYmVyIC8gbVRvdGFsVGVzdENvdW50OworICAgICAgICBpbnQgcHJvZ3Jlc3MgPSAoaW50KShyYXRpbyAqIFdpbmRvdy5QUk9HUkVTU19FTkQpOworICAgICAgICBnZXRXaW5kb3coKS5zZXRGZWF0dXJlSW50KFdpbmRvdy5GRUFUVVJFX1BST0dSRVNTLCBwcm9ncmVzcyk7CiAKICAgICAgICAgTG9nLnYoTE9HVEFHLCAiICBMb2FkaW5nICIgKyBtVGVzdFVybCk7CiAgICAgICAgIG1XZWJWaWV3LmxvYWRVcmwobVRlc3RVcmwpOwpAQCAtMjM3LDYgKzI1NCw3IEBACiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fVklFVyk7CiAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9TSU5HTEVfVE9QKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRFU1RfVVJMLCBGc1V0aWxzLmdldFRlc3RVcmwodXJsKSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5DVVJSRU5UX1RFU1RfTlVNQkVSLCArK21DdXJyZW50VGVzdE51bWJlcik7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUSU1FT1VUX0lOX01JTExJUywgMTAwMDApOwogICAgICAgICBleGVjdXRlSW50ZW50KGludGVudCk7CiAgICAgfQpAQCAtMzI5LDE0ICszNDcsMjkgQEAKIAogICAgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgogICAgIC8vIExheW91dFRlc3RDb250cm9sbGVyIEZ1bmN0aW9ucwotICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoKSB7CisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dChib29sZWFuIGVuYWJsZVBpeGVsVGVzdHMpIHsKKyAgICAgICAgLy8gQWRkZWQgYWZ0ZXIgd2Via2l0IHVwZGF0ZSB0byByNjM4NTkuIFNlZSB0cmFjLndlYmtpdC5vcmcvY2hhbmdlc2V0LzYzNzMwLgorICAgICAgICBpZiAoZW5hYmxlUGl4ZWxUZXN0cykgeworICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiZHVtcEFzVGV4dChlbmFibGVQaXhlbFRlc3RzID09IHRydWUpIG5vdCBpbXBsZW1lbnRlZCBvbiBBbmRyb2lkISIpOworICAgICAgICB9CisKICAgICAgICAgbUR1bXBEYXRhVHlwZSA9IER1bXBEYXRhVHlwZS5EVU1QX0FTX1RFWFQ7CisgICAgICAgIG1EdW1wVG9wRnJhbWVBc1RleHQgPSB0cnVlOwogICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1XZWJWaWV3LmdldFVybCgpOwogICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiZHVtcEFzVGV4dCBjYWxsZWQ6ICIrdXJsKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpIHsKKyAgICAgICAgbUR1bXBEYXRhVHlwZSA9IER1bXBEYXRhVHlwZS5EVU1QX0FTX1RFWFQ7CisgICAgICAgIG1EdW1wQ2hpbGRGcmFtZXNBc1RleHQgPSB0cnVlOworICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1XZWJWaWV3LmdldFVybCgpOworICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiZHVtcENoaWxkRnJhbWVzQXNUZXh0IGNhbGxlZDogIit1cmwpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgd2FpdFVudGlsRG9uZSgpIHsKICAgICAgICAgbVdhaXRVbnRpbERvbmUgPSB0cnVlOwogICAgICAgICBTdHJpbmcgdXJsID0gbVdlYlZpZXcuZ2V0VXJsKCk7CkBAIC0zNDgsNyArMzgxLDkgQEAKICAgICAgICAgTG9nLnYoTE9HVEFHLCAibm90aWZ5RG9uZSBjYWxsZWQ6ICIgKyB1cmwpOwogICAgICAgICBpZiAobVdhaXRVbnRpbERvbmUpIHsKICAgICAgICAgICAgIG1XYWl0VW50aWxEb25lID0gZmFsc2U7Ci0gICAgICAgICAgICBtQ2hyb21lQ2xpZW50Lm9uUHJvZ3Jlc3NDaGFuZ2VkKG1XZWJWaWV3LCAxMDEpOworICAgICAgICAgICAgaWYgKCFtUmVxdWVzdGVkV2ViS2l0RGF0YSAmJiAhbVRpbWVkT3V0ICYmICFmaW5pc2hlZCgpKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdFdlYktpdERhdGEoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtNDU5LDggKzQ5NCwyNSBAQAogICAgICAqIFNldHMgdGhlIEdlb2xvY2F0aW9uIHBlcm1pc3Npb24gc3RhdGUgdG8gYmUgdXNlZCBmb3IgYWxsIGZ1dHVyZSByZXF1ZXN0cy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYm9vbGVhbiBhbGxvdykgewotICAgICAgICBtR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0ID0gdHJ1ZTsKKyAgICAgICAgbUlzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0ID0gdHJ1ZTsKICAgICAgICAgbUdlb2xvY2F0aW9uUGVybWlzc2lvbiA9IGFsbG93OworCisgICAgICAgIGlmIChtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3Mua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2sgY2FsbGJhY2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgKEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2spIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBvcmlnaW4gPSAoU3RyaW5nKSBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcy5nZXQoY2FsbGJhY2spOworICAgICAgICAgICAgICAgIGNhbGxiYWNrLmludm9rZShvcmlnaW4sIG1HZW9sb2NhdGlvblBlcm1pc3Npb24sIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgbVdlYlZpZXcuc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGNhblByb3ZpZGVBbHBoYSwgYWxwaGEsIGNhblByb3ZpZGVCZXRhLCBiZXRhLAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVHYW1tYSwgZ2FtbWEpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG92ZXJyaWRlUHJlZmVyZW5jZShTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKSB7CkBAIC00NzMsNiArNTI1LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZCAoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuc2V0WFNTQXVkaXRvckVuYWJsZWQoZmxhZyk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBmaW5hbCBXZWJWaWV3Q2xpZW50IG1WaWV3Q2xpZW50ID0gbmV3IFdlYlZpZXdDbGllbnQoKXsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFnZUZpbmlzaGVkKFdlYlZpZXcgdmlldywgU3RyaW5nIHVybCkgewpAQCAtNDkwLDExICs1NDYsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgZHJhd1BhZ2VUb0ZpbGUobVNhdmVJbWFnZVBhdGggKyAiLyIgKyBuYW1lICsgIi5wbmciLCBtV2ViVmlldyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBDYWxsaW5nIGZpbmlzaGVkKCkgd2lsbCBjaGVjayBpZiB3ZSd2ZSBtZXQgYWxsIHRoZSBjb25kaXRpb25zIGZvciBjb21wbGV0aW5nCi0gICAgICAgICAgICAvLyB0aGlzIHRlc3QgYW5kIG1vdmUgdG8gdGhlIG5leHQgb25lIGlmIHdlIGFyZSByZWFkeS4KKyAgICAgICAgICAgIC8vIHRoaXMgdGVzdCBhbmQgbW92ZSB0byB0aGUgbmV4dCBvbmUgaWYgd2UgYXJlIHJlYWR5LiBPdGhlcndpc2Ugd2UgYXNrIFdlYkNvcmUgdG8KKyAgICAgICAgICAgIC8vIGR1bXAgdGhlIHBhZ2UuCiAgICAgICAgICAgICBpZiAoZmluaXNoZWQoKSkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtV2FpdFVudGlsRG9uZSAmJiAhbVJlcXVlc3RlZFdlYktpdERhdGEgJiYgIW1UaW1lZE91dCkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RXZWJLaXREYXRhKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtV2FpdFVudGlsRG9uZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJwYWdlIGZpbmlzaGVkIGxvYWRpbmcgYnV0IHdhaXRpbmcgZm9yIG5vdGlmeURvbmUgdG8gYmUgY2FsbGVkOiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobVJlcXVlc3RlZFdlYktpdERhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAicGFnZSBmaW5pc2hlZCBsb2FkaW5nIGJ1dCB3ZWJraXQgZGF0YSBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZDogIiArIHVybCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1UaW1lZE91dCkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJwYWdlIGZpbmlzaGVkIGxvYWRpbmcgYnV0IGFscmVhZHkgdGltZWQgb3V0OiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHN1cGVyLm9uUGFnZUZpbmlzaGVkKHZpZXcsIHVybCk7CiAgICAgICAgIH0KIApAQCAtNTM2LDQ0ICs2MTEsOCBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBXZWJDaHJvbWVDbGllbnQgbUNocm9tZUNsaWVudCA9IG5ldyBXZWJDaHJvbWVDbGllbnQoKSB7CiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChXZWJWaWV3IHZpZXcsIGludCBuZXdQcm9ncmVzcykgewotCi0gICAgICAgICAgICAvLyBub3RpZnlEb25lIGNhbGxzIHRoaXMgd2l0aCAxMDElLiBXZSBvbmx5IHdhbnQgdG8gdXBkYXRlIHRoaXMgZmxhZyBpZiB0aGlzCi0gICAgICAgICAgICAvLyBpcyB0aGUgcmVhbCBjYWxsIGZyb20gV2ViQ29yZS4KLSAgICAgICAgICAgIGlmIChuZXdQcm9ncmVzcyA9PSAxMDApIHsKLSAgICAgICAgICAgICAgICBtT25lSHVuZHJlZFBlcmNlbnRDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdpdGggdGhlIGZsYWcgdXBkYXRlZCwgd2UgY2FuIG5vdyBwcm9jZWVkIGFzIG5vcm1hbCB3aGV0aGVyIHRoZSBwcm9ncmVzcyB1cGRhdGUgY2FtZSBmcm9tCi0gICAgICAgICAgICAvLyBXZWJDb3JlIG9yIG5vdGlmeURvbmUuCi0gICAgICAgICAgICBpZiAobmV3UHJvZ3Jlc3MgPj0gMTAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gZmluaXNoZWQoKSB3aWxsIGNoZWNrIGlmIHdlIGFyZSByZWFkeSB0byBtb3ZlIHRvIHRoZSBuZXh0IHRlc3QgYW5kIGRvIHNvIGlmIHdlIGFyZS4KLSAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFtVGltZWRPdXQgJiYgIW1XYWl0VW50aWxEb25lICYmICFtUmVxdWVzdGVkV2ViS2l0RGF0YSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbVdlYlZpZXcuZ2V0VXJsKCk7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIkZpbmlzaGVkOiAiKyB1cmwpOwotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0V2ViS2l0RGF0YSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtV2ViVmlldy5nZXRVcmwoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1UaW1lZE91dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiVGltZWQgb3V0IGJlZm9yZSBmaW5pc2hpbmc6ICIgKyB1cmwpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1XYWl0VW50aWxEb25lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJXYWl0aW5nIGZvciBub3RpZnlEb25lOiAiICsgdXJsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVxdWVzdGVkV2ViS2l0RGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiUmVxdWVzdGVkIHdlYmtpdCBkYXRhIHJlYWR5OiAiICsgdXJsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmVkVGl0bGUoV2ViVmlldyB2aWV3LCBTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgICAgIGlmICh0aXRsZS5sZW5ndGgoKSA+IDMwKQotICAgICAgICAgICAgICAgIHRpdGxlID0gIi4uLiIrdGl0bGUuc3Vic3RyaW5nKHRpdGxlLmxlbmd0aCgpLTMwKTsKLSAgICAgICAgICAgIHNldFRpdGxlKHRpdGxlKTsKKyAgICAgICAgICAgIHNldFRpdGxlKCJUZXN0ICIgKyBtQ3VycmVudFRlc3ROdW1iZXIgKyAiIG9mICIgKyBtVG90YWxUZXN0Q291bnQgKyAiOiAiKyB0aXRsZSk7CiAgICAgICAgICAgICBpZiAobUR1bXBUaXRsZUNoYW5nZXMpIHsKICAgICAgICAgICAgICAgICBtVGl0bGVDaGFuZ2VzLmFwcGVuZCgiVElUTEUgQ0hBTkdFRDogIik7CiAgICAgICAgICAgICAgICAgbVRpdGxlQ2hhbmdlcy5hcHBlbmQodGl0bGUpOwpAQCAtNjcwLDIxICs3MDksNDAgQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2VvbG9jYXRpb25QZXJtaXNzaW9uc1Nob3dQcm9tcHQoU3RyaW5nIG9yaWdpbiwKICAgICAgICAgICAgICAgICBHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAobUdlb2xvY2F0aW9uUGVybWlzc2lvblNldCkgeworICAgICAgICAgICAgaWYgKG1Jc0dlb2xvY2F0aW9uUGVybWlzc2lvblNldCkgewogICAgICAgICAgICAgICAgIGNhbGxiYWNrLmludm9rZShvcmlnaW4sIG1HZW9sb2NhdGlvblBlcm1pc3Npb24sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2ssIFN0cmluZz4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzLnB1dChjYWxsYmFjaywgb3JpZ2luKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbnNvbGVNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZU51bWJlciwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlSUQpIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db25zb2xlTWVzc2FnZShDb25zb2xlTWVzc2FnZSBjb25zb2xlTWVzc2FnZSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJDT05TT0xFIE1FU1NBR0U6IGxpbmUgIiArIGNvbnNvbGVNZXNzYWdlLmxpbmVOdW1iZXIoKSArICI6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBjb25zb2xlTWVzc2FnZS5tZXNzYWdlKCkgKyAiXG4iOwogICAgICAgICAgICAgaWYgKG1Db25zb2xlTWVzc2FnZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1Db25zb2xlTWVzc2FnZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgY29uc29sZU1lc3NhZ2UgPSAiQ09OU09MRSBNRVNTQUdFOiBsaW5lICIKLSAgICAgICAgICAgICAgICAgICAgKyBsaW5lTnVtYmVyICsiOiAiKyBtZXNzYWdlICsiXG4iOwotICAgICAgICAgICAgbUNvbnNvbGVNZXNzYWdlcy5hcHBlbmQoY29uc29sZU1lc3NhZ2UpOwotICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiTE9HOiAiK2NvbnNvbGVNZXNzYWdlKTsKKyAgICAgICAgICAgIG1Db25zb2xlTWVzc2FnZXMuYXBwZW5kKG1zZyk7CisgICAgICAgICAgICBMb2cudihMT0dUQUcsICJMT0c6ICIgKyBtc2cpOworICAgICAgICAgICAgLy8gdGhlIHJhdGlvbmFsZSBoZXJlIGlzIHRoYXQgaWYgdGhlcmUncyBhbiBlcnJvciBvZiBlaXRoZXIgdHlwZSwgYW5kIHRoZSB0ZXN0IHdhcworICAgICAgICAgICAgLy8gd2FpdGluZyBmb3IgIm5vdGlmeURvbmUiIHNpZ25hbCB0byBmaW5pc2gsIHRoZW4gdGhlcmUncyBubyBwb2ludCBpbiB3YWl0aW5nCisgICAgICAgICAgICAvLyBhbnltb3JlIGJlY2F1c2UgdGhlIEpTIGV4ZWN1dGlvbiBpcyBhbHJlYWR5IHRlcm1pbmF0ZWQgYXQgdGhpcyBwb2ludCBhbmQgYQorICAgICAgICAgICAgLy8gIm5vdGlmeURvbmUiIHdpbGwgbmV2ZXIgY29tZSBvdXQgc28gaXQncyBqdXN0IHdhc3RpbmcgdGltZSB0aWxsIHRpbWVvdXQga2lja3MgaW4KKyAgICAgICAgICAgIGlmICgobXNnLmNvbnRhaW5zKCJVbmNhdWdodCBSZWZlcmVuY2VFcnJvcjoiKSB8fCBtc2cuY29udGFpbnMoIlVuY2F1Z2h0IFR5cGVFcnJvcjoiKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgbVdhaXRVbnRpbERvbmUgJiYgbVN0b3BPblJlZkVycm9yKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiVGVybWluYXRpbmcgdGVzdCBjYXNlIG9uIHVuY2F1Z2h0IFJlZmVyZW5jZUVycm9yIG9yIFR5cGVFcnJvci4iKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeURvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIDUwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtNzIzLDEzICs3ODEsMTUgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5ld1dpbmRvd1dlYlZpZXcgZXh0ZW5kcyBXZWJWaWV3IHsKICAgICAgICAgcHVibGljIE5ld1dpbmRvd1dlYlZpZXcoQ29udGV4dCBjb250ZXh0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzSWZhY2VzKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsLCAwLCBqc0lmYWNlcyk7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsLCAwLCBqc0lmYWNlcywgZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlc2V0VGVzdFN0YXR1cygpIHsKICAgICAgICAgbVdhaXRVbnRpbERvbmUgPSBmYWxzZTsKICAgICAgICAgbUR1bXBEYXRhVHlwZSA9IG1EZWZhdWx0RHVtcERhdGFUeXBlOworICAgICAgICBtRHVtcFRvcEZyYW1lQXNUZXh0ID0gZmFsc2U7CisgICAgICAgIG1EdW1wQ2hpbGRGcmFtZXNBc1RleHQgPSBmYWxzZTsKICAgICAgICAgbVRpbWVkT3V0ID0gZmFsc2U7CiAgICAgICAgIG1EdW1wVGl0bGVDaGFuZ2VzID0gZmFsc2U7CiAgICAgICAgIG1SZXF1ZXN0ZWRXZWJLaXREYXRhID0gZmFsc2U7CkBAIC03MzksMTAgKzc5OSwxMiBAQAogICAgICAgICBtRXZlbnRTZW5kZXIuY2xlYXJUb3VjaFBvaW50cygpOwogICAgICAgICBtRXZlbnRTZW5kZXIuY2xlYXJUb3VjaE1ldGFTdGF0ZSgpOwogICAgICAgICBtUGFnZUZpbmlzaGVkID0gZmFsc2U7Ci0gICAgICAgIG1PbmVIdW5kcmVkUGVyY2VudENvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgIG1EdW1wV2ViS2l0RGF0YSA9IGZhbHNlOwogICAgICAgICBtR2V0RHJhd3RpbWUgPSBmYWxzZTsKICAgICAgICAgbVNhdmVJbWFnZVBhdGggPSBudWxsOworICAgICAgICBzZXREZWZhdWx0V2ViU2V0dGluZ3MobVdlYlZpZXcpOworICAgICAgICBtSXNHZW9sb2NhdGlvblBlcm1pc3Npb25TZXQgPSBmYWxzZTsKKyAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgPSBudWxsOwogICAgIH0KIAogICAgIHByaXZhdGUgbG9uZ1tdIGdldERyYXdXZWJWaWV3VGltZShXZWJWaWV3IHZpZXcsIGludCBjb3VudCkgewpAQCAtNzc5LDcgKzg0MSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGNhbk1vdmVUb05leHRUZXN0KCkgewotICAgICAgICByZXR1cm4gKG1EdW1wV2ViS2l0RGF0YSAmJiBtT25lSHVuZHJlZFBlcmNlbnRDb21wbGV0ZSAmJiBtUGFnZUZpbmlzaGVkICYmICFtV2FpdFVudGlsRG9uZSkgfHwgbVRpbWVkT3V0OworICAgICAgICByZXR1cm4gKG1EdW1wV2ViS2l0RGF0YSAmJiBtUGFnZUZpbmlzaGVkICYmICFtV2FpdFVudGlsRG9uZSkgfHwgbVRpbWVkT3V0OwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZXR1cFdlYlZpZXdGb3JMYXlvdXRUZXN0cyhXZWJWaWV3IHdlYnZpZXcsIENhbGxiYWNrUHJveHkgY2FsbGJhY2tQcm94eSkgewpAQCAtNzg3LDYgKzg0OSwxOSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgc2V0RGVmYXVsdFdlYlNldHRpbmdzKHdlYnZpZXcpOworCisgICAgICAgIHdlYnZpZXcuc2V0V2ViQ2hyb21lQ2xpZW50KG1DaHJvbWVDbGllbnQpOworICAgICAgICB3ZWJ2aWV3LnNldFdlYlZpZXdDbGllbnQobVZpZXdDbGllbnQpOworICAgICAgICAvLyBTZXR0aW5nIGEgdG91Y2ggaW50ZXJ2YWwgb2YgLTEgZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhlIG9wdGltaXNhdGlvbiBpbiBXZWJWaWV3CisgICAgICAgIC8vIHRoYXQgc3RvcHMgcmVwZWF0ZWQgdG91Y2ggZXZlbnRzIGZsb29kaW5nIFdlYkNvcmUuIFRoZSBFdmVudCBTZW5kZXIgb25seSBzZW5kcyBhCisgICAgICAgIC8vIHNpbmdsZSBldmVudCByYXRoZXIgdGhhbiBhIHN0cmVhbSBvZiBldmVudHMgKGxpa2Ugd2hhdCB3b3VsZCBnZW5lcmFsbHkgaGFwcGVuIGluCisgICAgICAgIC8vIGEgcmVhbCB1c2Ugb2YgdG91Y2ggZXZlbnRzIGluIGEgV2ViVmlldykgIGFuZCBzbyBpZiB0aGUgV2ViVmlldyBkcm9wcyB0aGUgZXZlbnQsCisgICAgICAgIC8vIHRoZSB0ZXN0IHdpbGwgZmFpbCBhcyB0aGUgdGVzdCBleHBlY3RzIG9uZSBjYWxsYmFjayBmb3IgZXZlcnkgdG91Y2ggaXQgc3ludGhlc2l6ZXMuCisgICAgICAgIHdlYnZpZXcuc2V0VG91Y2hJbnRlcnZhbCgtMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFdlYlNldHRpbmdzKFdlYlZpZXcgd2VidmlldykgewogICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IHdlYnZpZXcuZ2V0U2V0dGluZ3MoKTsKICAgICAgICAgc2V0dGluZ3Muc2V0QXBwQ2FjaGVFbmFibGVkKHRydWUpOwogICAgICAgICBzZXR0aW5ncy5zZXRBcHBDYWNoZVBhdGgoZ2V0QXBwbGljYXRpb25Db250ZXh0KCkuZ2V0Q2FjaGVEaXIoKS5nZXRQYXRoKCkpOwpAQCAtNzk5LDE1ICs4NzQsNyBAQAogICAgICAgICBzZXR0aW5ncy5zZXREYXRhYmFzZVBhdGgoZ2V0RGlyKCJkYXRhYmFzZXMiLDApLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgc2V0dGluZ3Muc2V0RG9tU3RvcmFnZUVuYWJsZWQodHJ1ZSk7CiAgICAgICAgIHNldHRpbmdzLnNldFdvcmtlcnNFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICB3ZWJ2aWV3LnNldFdlYkNocm9tZUNsaWVudChtQ2hyb21lQ2xpZW50KTsKLSAgICAgICAgd2Vidmlldy5zZXRXZWJWaWV3Q2xpZW50KG1WaWV3Q2xpZW50KTsKLSAgICAgICAgLy8gU2V0dGluZyBhIHRvdWNoIGludGVydmFsIG9mIC0xIGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoZSBvcHRpbWlzYXRpb24gaW4gV2ViVmlldwotICAgICAgICAvLyB0aGF0IHN0b3BzIHJlcGVhdGVkIHRvdWNoIGV2ZW50cyBmbG9vZGluZyBXZWJDb3JlLiBUaGUgRXZlbnQgU2VuZGVyIG9ubHkgc2VuZHMgYQotICAgICAgICAvLyBzaW5nbGUgZXZlbnQgcmF0aGVyIHRoYW4gYSBzdHJlYW0gb2YgZXZlbnRzIChsaWtlIHdoYXQgd291bGQgZ2VuZXJhbGx5IGhhcHBlbiBpbgotICAgICAgICAvLyBhIHJlYWwgdXNlIG9mIHRvdWNoIGV2ZW50cyBpbiBhIFdlYlZpZXcpICBhbmQgc28gaWYgdGhlIFdlYlZpZXcgZHJvcHMgdGhlIGV2ZW50LAotICAgICAgICAvLyB0aGUgdGVzdCB3aWxsIGZhaWwgYXMgdGhlIHRlc3QgZXhwZWN0cyBvbmUgY2FsbGJhY2sgZm9yIGV2ZXJ5IHRvdWNoIGl0IHN5bnRoZXNpemVzLgotICAgICAgICB3ZWJ2aWV3LnNldFRvdWNoSW50ZXJ2YWwoLTEpOworICAgICAgICBzZXR0aW5ncy5zZXRYU1NBdWRpdG9yRW5hYmxlZChmYWxzZSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBXZWJWaWV3IG1XZWJWaWV3OwpAQCAtODI0LDYgKzg5MSw5IEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgbVNhdmVJbWFnZVBhdGg7CiAgICAgcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBtVGVzdExpc3RSZWFkZXI7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1HZXREcmF3dGltZTsKKyAgICBwcml2YXRlIGludCBtVG90YWxUZXN0Q291bnQ7CisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRUZXN0TnVtYmVyOworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RvcE9uUmVmRXJyb3I7CiAKICAgICAvLyBTdGF0ZXMKICAgICBwcml2YXRlIGJvb2xlYW4gbVRpbWVkT3V0OwpAQCAtODMzLDYgKzkwMyw4IEBACiAgICAgLy8gTGF5b3V0IHRlc3QgY29udHJvbGxlciB2YXJpYWJsZXMuCiAgICAgcHJpdmF0ZSBEdW1wRGF0YVR5cGUgbUR1bXBEYXRhVHlwZTsKICAgICBwcml2YXRlIER1bXBEYXRhVHlwZSBtRGVmYXVsdER1bXBEYXRhVHlwZSA9IER1bXBEYXRhVHlwZS5FWFRfUkVQUjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUR1bXBUb3BGcmFtZUFzVGV4dDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUR1bXBDaGlsZEZyYW1lc0FzVGV4dDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVdhaXRVbnRpbERvbmU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wVGl0bGVDaGFuZ2VzOwogICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIG1UaXRsZUNoYW5nZXM7CkBAIC04NDYsNyArOTE4LDYgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtUGFnZUZpbmlzaGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wV2ViS2l0RGF0YSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtT25lSHVuZHJlZFBlcmNlbnRDb21wbGV0ZSA9IGZhbHNlOwogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FT1VUX1NUUiA9ICIqKlRlc3QgdGltZW91dCI7CiAKQEAgLTg2MSwxMSArOTMyLDE1IEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9BVVRPX1RFU1QgPSAiVWlBdXRvVGVzdCI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfRFJBV19USU1FID0gIkdldERyYXdUaW1lIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfSU1BR0UgPSAiU2F2ZUltYWdlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRPVEFMX1RFU1RfQ09VTlQgPSAiVGVzdENvdW50IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfVEVTVF9OVU1CRVIgPSAiVGVzdE51bWJlciI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9QX09OX1JFRl9FUlJPUiA9ICJTdG9wT25SZWZlcmVuY2VFcnJvciI7CiAKICAgICBzdGF0aWMgZmluYWwgaW50IERSQVdfUlVOUyA9IDU7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBEUkFXX1RJTUVfTE9HID0gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkgKwogICAgICAgICAiL2FuZHJvaWQvcGFnZV9kcmF3X3RpbWUudHh0IjsKIAotICAgIHByaXZhdGUgYm9vbGVhbiBtR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0OworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNHZW9sb2NhdGlvblBlcm1pc3Npb25TZXQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1HZW9sb2NhdGlvblBlcm1pc3Npb247CisgICAgcHJpdmF0ZSBNYXAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3M7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvQW5kcm9pZC5tayBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZmM2MzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI5IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGRpZmZfbWF0Y2hfcGF0Y2gKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IER1bXBSZW5kZXJUcmVlMgorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMGM0ZTlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw1OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgcGFja2FnZT0iY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyIj4KKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii51aS5EaXJMaXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJEdW1wIFJlbmRlciBUcmVlIDIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9uIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8IS0tIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVGFzayIgaXMgdGhlcmUgc28gd2Ugb25seSBoYXZlIGEgb25lIGluc3RhbmNlCisgICAgICAgICAgICAgb2YgdGhpcyBhY3Rpdml0eS4gSG93ZXZlciwgaXQgZG9lc24ndCBzZWVtIHRvIHdvcmsgZXhhY3RseSBsaWtlIGRlc2NyaWJlZCBpbiB0aGUKKyAgICAgICAgICAgICBkb2N1bWVudGF0aW9uLCBiZWNhdXNlIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGFwcGxpY2F0aW9uIHN1Z2dlc3QKKyAgICAgICAgICAgICB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHRhc2sgZm9yIGFsbCAzIGFjdGl2aXRpZXMuIFdlIGRvbid0IHVuZGVyc3RhbmQKKyAgICAgICAgICAgICBob3cgZXhhY3RseSBpdCBhbGwgd29ya3MsIGJ1dCBhdCB0aGUgbW9tZW50IGl0IHdvcmtzIGp1c3QgZmluZS4KKyAgICAgICAgICAgICBJdCBjYW4gbGVhZCB0byBzb21lIHdlaXJkIGJlaGF2aW91ciBpbiB0aGUgZnV0dXJlLiAtLT4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLlRlc3RzTGlzdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVGVzdHMnIGxpc3QgYWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZVRhc2siPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5MYXlvdXRUZXN0c0V4ZWN1dG9yIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iTGF5b3V0IHRlc3RzJyBleGVjdXRvciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cHJvY2Vzcz0iOmV4ZWN1dG9yIj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9Ik1hbmFnZXJTZXJ2aWNlIj4KKyAgICAgICAgPC9zZXJ2aWNlPgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnNjcmlwdHN1cHBvcnQuU2NyaXB0VGVzdFJ1bm5lciIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iTGF5b3V0IHRlc3RzIHNjcmlwdCBydW5uZXIiIC8+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfU0RDQVJEIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldBS0VfTE9DSyIgLz4KKzwvbWFuaWZlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL2Fzc2V0cy9ydW5fYXBhY2hlMi5weSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2FwYWNoZTIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTc2NGYwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2FwYWNoZTIucHkKQEAgLTAsMCArMSwxMjEgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIiIiU3RhcnQsIHN0b3AsIG9yIHJlc3RhcnQgYXBhY2hlMiBzZXJ2ZXIuCisKKyAgQXBhY2hlMiBtdXN0IGJlIGluc3RhbGxlZCB3aXRoIG1vZF9waHAhCisKKyAgVXNhZ2U6CisgICAgcnVuX2FwYWNoZTIucHkgc3RhcnR8c3RvcHxyZXN0YXJ0CisiIiIKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IGxvZ2dpbmcKKworZGVmIG1haW4oKToKKyAgaWYgbGVuKHN5cy5hcmd2KSA8IDI6CisgICAgcnVuX2NtZCA9ICIiCisgIGVsc2U6CisgICAgcnVuX2NtZCA9IHN5cy5hcmd2WzFdCisKKyAgIyBTZXR1cCBsb2dnaW5nIGNsYXNzCisgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9bG9nZ2luZy5JTkZPLCBmb3JtYXQ9JyUobWVzc2FnZSlzJykKKworICBpZiBub3QgcnVuX2NtZCBpbiAoInN0YXJ0IiwgInN0b3AiLCAicmVzdGFydCIpOgorICAgIGxvZ2dpbmcuaW5mbygiaWxsZWdhbCBhcmd1bWVudDogIiArIHJ1bl9jbWQpCisgICAgbG9nZ2luZy5pbmZvKCJVc2FnZTogcHl0aG9uIHJ1bl9hcGFjaGUyLnB5IHN0YXJ0fHN0b3B8cmVzdGFydCIpCisgICAgcmV0dXJuCisKKyAgIyBDcmVhdGUgL3RtcC9XZWJLaXQgaWYgaXQgZG9lc24ndCBleGlzdC4gVGhpcyBpcyBuZWVkZWQgZm9yIHZhcmlvdXMgZmlsZXMgdXNlZCBieSBhcGFjaGUyCisgIHRtcF9XZWJLaXQgPSBvcy5wYXRoLmpvaW4oIi90bXAiLCAiV2ViS2l0IikKKyAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHRtcF9XZWJLaXQpOgorICAgIG9zLm1rZGlyKHRtcF9XZWJLaXQpCisKKyAgIyBHZXQgdGhlIHBhdGggdG8gYW5kcm9pZCB0cmVlIHJvb3QgYmFzZWQgb24gdGhlIHNjcmlwdCBsb2NhdGlvbi4KKyAgIyBCYXNpY2FsbHkgd2UgZ28gNSBsZXZlbHMgdXAKKyAgcGFyZW50ID0gb3MucGFyZGlyCisgIHNjcmlwdF9sb2NhdGlvbiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pKQorICBhbmRyb2lkX3RyZWVfcm9vdCA9IG9zLnBhdGguam9pbihzY3JpcHRfbG9jYXRpb24sIHBhcmVudCwgcGFyZW50LCBwYXJlbnQsIHBhcmVudCwgcGFyZW50KQorICBhbmRyb2lkX3RyZWVfcm9vdCA9IG9zLnBhdGgubm9ybXBhdGgoYW5kcm9pZF90cmVlX3Jvb3QpCisKKyAgIyBQYXRocyByZWxhdGl2ZSB0byBhbmRyb2lkX3RyZWVfcm9vdAorICB3ZWJraXRfcGF0aCA9IG9zLnBhdGguam9pbigiZXh0ZXJuYWwiLCAid2Via2l0IikKKyAgbGF5b3V0X3Rlc3RzX3BhdGggPSBvcy5wYXRoLmpvaW4od2Via2l0X3BhdGgsICJMYXlvdXRUZXN0cyIpCisgIGh0dHBfY29uZl9wYXRoID0gb3MucGF0aC5qb2luKGxheW91dF90ZXN0c19wYXRoLCAiaHR0cCIsICJjb25mIikKKworICAjIFByZXBhcmUgdGhlIGNvbW1hbmQgdG8gc2V0ICR7QVBBQ0hFX1JVTl9VU0VSfSBhbmQgJHtBUEFDSEVfUlVOX0dST1VQfQorICBlbnZ2YXJzX3BhdGggPSBvcy5wYXRoLmpvaW4oIi9ldGMiLCAiYXBhY2hlMiIsICJlbnZ2YXJzIikKKyAgZXhwb3J0X2VudnZhcnNfY21kID0gInNvdXJjZSAiICsgZW52dmFyc19wYXRoCisKKyAgZXJyb3JfbG9nX3BhdGggPSBvcy5wYXRoLmpvaW4odG1wX1dlYktpdCwgImFwYWNoZTItZXJyb3IubG9nIikKKyAgY3VzdG9tX2xvZ19wYXRoID0gb3MucGF0aC5qb2luKHRtcF9XZWJLaXQsICJhcGFjaGUyLWFjY2Vzcy5sb2ciKQorCisgICMgUHJlcGFyZSB0aGUgY29tbWFuZCB0byAocmUpc3RhcnQvc3RvcCB0aGUgc2VydmVyIHdpdGggc3BlY2lmaWVkIHNldHRpbmdzCisgIGFwYWNoZTJfcmVzdGFydF9jbWQgPSAiYXBhY2hlMiAtayAiICsgcnVuX2NtZAorICBkaXJlY3RpdmVzICA9ICIgLWMgXCJTZXJ2ZXJSb290ICIgKyBhbmRyb2lkX3RyZWVfcm9vdCArICJcIiIKKworICAjIFdlIHVzZSBodHRwL3Rlc3RzIGFzIHRoZSBkb2N1bWVudCByb290IGFzIHRoZSBIVFRQIHRlc3RzIHVzZSBoYXJkY29kZWQKKyAgIyByZXNvdXJjZXMgYXQgdGhlIHNlcnZlciByb290LiBXZSB0aGVuIHVzZSBhbGlhc2VzIHRvIG1ha2UgYXZhaWxhYmxlIHRoZQorICAjIGNvbXBsZXRlIHNldCBvZiB0ZXN0cyBhbmQgdGhlIHJlcXVpcmVkIHNjcmlwdHMuCisgIGRpcmVjdGl2ZXMgKz0gIiAtYyBcIkRvY3VtZW50Um9vdCAiICsgb3MucGF0aC5qb2luKGxheW91dF90ZXN0c19wYXRoLCAiaHR0cCIsICJ0ZXN0cy8iKSArICJcIiIKKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiQWxpYXMgL0xheW91dFRlc3RzICIgKyBsYXlvdXRfdGVzdHNfcGF0aCArICJcIiIKKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiQWxpYXMgL1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL2FuZHJvaWQgIiArIFwKKyAgICBvcy5wYXRoLmpvaW4od2Via2l0X3BhdGgsICJXZWJLaXRUb29scyIsICJEdW1wUmVuZGVyVHJlZSIsICJhbmRyb2lkIikgKyAiXCIiCisKKyAgIyBUaGlzIGRpcmVjdGl2ZSBpcyBjb21tZW50ZWQgb3V0IGluIGFwYWNoZTItZGViaWFuLWh0dHBkLmNvbmYgZm9yIHNvbWUgcmVhc29uCisgICMgSG93ZXZlciwgaXQgaXMgdXNlZnVsIHRvIGJyb3dzZSB0aHJvdWdoIHRlc3RzIGluIHRoZSBicm93c2VyLCBzbyBpdCdzIGFkZGVkIGhlcmUuCisgICMgT25lIHRoaW5nIHRvIG5vdGUgaXMgdGhhdCBiZWNhdXNlIG9mIHByb2JsZW1zIHdpdGggbW9kX2RpciBhbmQgcG9ydCBudW1iZXJzLCBtb2RfZGlyCisgICMgaXMgdHVybmVkIG9mZi4gVGhhdCBtZWFucyB0aGF0IHRoZXJlIF9tdXN0XyBiZSBhIHRyYWlsaW5nIHNsYXNoIGF0IHRoZSBlbmQgb2YgVVJMCisgICMgZm9yIGF1dG8gaW5kZXhlcyB0byB3b3JrIGNvcnJlY3RseS4KKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiTG9hZE1vZHVsZSBhdXRvaW5kZXhfbW9kdWxlIC91c3IvbGliL2FwYWNoZTIvbW9kdWxlcy9tb2RfYXV0b2luZGV4LnNvXCIiCisKKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiRXJyb3JMb2cgIiArIGVycm9yX2xvZ19wYXRoICsiXCIiCisgIGRpcmVjdGl2ZXMgKz0gIiAtYyBcIkN1c3RvbUxvZyAiICsgY3VzdG9tX2xvZ19wYXRoICsgIiBjb21iaW5lZFwiIgorICBkaXJlY3RpdmVzICs9ICIgLWMgXCJTU0xDZXJ0aWZpY2F0ZUZpbGUgIiArIG9zLnBhdGguam9pbihodHRwX2NvbmZfcGF0aCwgIndlYmtpdC1odHRwZC5wZW0iKSArIFwKKyAgICAiXCIiCisgIGRpcmVjdGl2ZXMgKz0gIiAtYyBcIlVzZXIgJHtBUEFDSEVfUlVOX1VTRVJ9XCIiCisgIGRpcmVjdGl2ZXMgKz0gIiAtYyBcIkdyb3VwICR7QVBBQ0hFX1JVTl9HUk9VUH1cIiIKKyAgZGlyZWN0aXZlcyArPSAiIC1DIFwiVHlwZXNDb25maWcgIiArIG9zLnBhdGguam9pbigiL2V0YyIsICJtaW1lLnR5cGVzIikgKyAiXCIiCisgIGNvbmZfZmlsZV9jbWQgPSAiIC1mICIgKyBcCisgICAgb3MucGF0aC5qb2luKGFuZHJvaWRfdHJlZV9yb290LCBodHRwX2NvbmZfcGF0aCwgImFwYWNoZTItZGViaWFuLWh0dHBkLmNvbmYiKQorCisgICMgVHJ5IHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmRzCisgIGxvZ2dpbmcuaW5mbygiV2lsbCAiICsgcnVuX2NtZCArICIgYXBhY2hlMiBzZXJ2ZXIuIikKKyAgY21kID0gZXhwb3J0X2VudnZhcnNfY21kICsgIiAmJiAiICsgYXBhY2hlMl9yZXN0YXJ0X2NtZCArIGRpcmVjdGl2ZXMgKyBjb25mX2ZpbGVfY21kCisgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgKG91dCwgZXJyKSA9IHAuY29tbXVuaWNhdGUoKQorCisgICMgT3V0cHV0IHRoZSBzdGRvdXQgZnJvbSB0aGUgY29tbWFuZCB0byBjb25zb2xlCisgIGxvZ2dpbmcuaW5mbyhvdXQpCisKKyAgIyBSZXBvcnQgYW55IGVycm9ycworICBpZiBwLnJldHVybmNvZGUgIT0gMDoKKyAgICBsb2dnaW5nLmluZm8oIiEhIEVSUk9SUzoiKQorCisgICAgaWYgZXJyLmZpbmQoZW52dmFyc19wYXRoKSAhPSAtMToKKyAgICAgIGxvZ2dpbmcuaW5mbyhlcnIpCisgICAgZWxpZiBlcnIuZmluZCgnY29tbWFuZCBub3QgZm91bmQnKSAhPSAtMToKKyAgICAgIGxvZ2dpbmcuaW5mbygiYXBhY2hlMiBpcyBwcm9iYWJseSBub3QgaW5zdGFsbGVkIikKKyAgICBlbHNlOgorICAgICAgbG9nZ2luZy5pbmZvKGVycikKKyAgICAgIGxvZ2dpbmcuaW5mbygiVHJ5IGxvb2tpbmcgaW4gIiArIGVycm9yX2xvZ19wYXRoICsgIiBmb3IgZGV0YWlscyIpCisgIGVsc2U6CisgICAgbG9nZ2luZy5pbmZvKCJPSyIpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgIG1haW4oKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMTNkOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CkBAIC0wLDAgKzEsNjUgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyIiIlJ1biBsYXlvdXQgdGVzdHMgb24gdGhlIGRldmljZS4KKworICBJdCBydW5zIHRoZSBzcGVjaWZpZWQgdGVzdHMgb24gdGhlIGRldmljZSwgZG93bmxvYWRzIHRoZSBzdW1tYXJpZXMgdG8gdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkKKyAgYW5kIG9wZW5zIGh0bWwgZGV0YWlscyBpbiB0aGUgZGVmYXVsdCBicm93c2VyLgorCisgIFVzYWdlOgorICAgIHJ1bl9sYXlvdXRfdGVzdHMucHkgUEFUSAorIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgd2ViYnJvd3NlcgoraW1wb3J0IHRlbXBmaWxlCisKKyNUT0RPOiBUaGVzZSBzaG91bGQgbm90IGJlIGhhcmRjb2RlZAorUkVTVUxUU19BQlNPTFVURV9QQVRIID0gIi9zZGNhcmQvYW5kcm9pZC9MYXlvdXRUZXN0cy1yZXN1bHRzLyIKK0RFVEFJTFNfSFRNTCA9ICJkZXRhaWxzLmh0bWwiCitTVU1NQVJZX1RYVCA9ICJzdW1tYXJ5LnR4dCIKKworZGVmIG1haW4oKToKKyAgaWYgbGVuKHN5cy5hcmd2KSA+IDE6CisgICAgcGF0aCA9IHN5cy5hcmd2WzFdCisgIGVsc2U6CisgICAgcGF0aCA9ICIiCisKKyAgbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1sb2dnaW5nLklORk8sIGZvcm1hdD0nJShtZXNzYWdlKXMnKQorCisgIHRtcGRpciA9IHRlbXBmaWxlLmdldHRlbXBkaXIoKQorCisgICMgUnVuIHRoZSB0ZXN0cyBpbiBwYXRoCisgIGNtZCA9ICJhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAiCisgIGNtZCArPSAiLWUgY2xhc3MgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnNjcmlwdHN1cHBvcnQuU3RhcnRlciNzdGFydExheW91dFRlc3RzICIKKyAgY21kICs9ICItZSBwYXRoIFwiIiArIHBhdGggKyAiXCIgIgorICBjbWQgKz0iLXcgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyL2NvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0LlNjcmlwdFRlc3RSdW5uZXIiCisKKyAgbG9nZ2luZy5pbmZvKCJSdW5uaW5nIHRoZSB0ZXN0cy4uLiIpCisgIHN1YnByb2Nlc3MuUG9wZW4oY21kLCBzaGVsbD1UcnVlLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKS5jb21tdW5pY2F0ZSgpCisKKyAgbG9nZ2luZy5pbmZvKCJEb3dubG9hZGluZyB0aGUgc3VtbWFyaWVzLi4uIikKKworICAjIERvd25sb2FkIHRoZSB0eHQgc3VtbWFyeSB0byB0bXAgZm9sZGVyCisgIHN1bW1hcnlfdHh0X3RtcF9wYXRoID0gb3MucGF0aC5qb2luKHRtcGRpciwgU1VNTUFSWV9UWFQpCisgIGNtZCA9ICJhZGIgcHVsbCAiICsgUkVTVUxUU19BQlNPTFVURV9QQVRIICsgU1VNTUFSWV9UWFQgKyAiICIgKyBzdW1tYXJ5X3R4dF90bXBfcGF0aAorICBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkuY29tbXVuaWNhdGUoKQorCisgICMgRG93bmxvYWQgdGhlIGh0bWwgc3VtbWFyeSB0byB0bXAgZm9sZGVyCisgIGRldGFpbHNfaHRtbF90bXBfcGF0aCA9IG9zLnBhdGguam9pbih0bXBkaXIsIERFVEFJTFNfSFRNTCkKKyAgY21kID0gImFkYiBwdWxsICIgKyBSRVNVTFRTX0FCU09MVVRFX1BBVEggKyBERVRBSUxTX0hUTUwgKyAiICIgKyBkZXRhaWxzX2h0bWxfdG1wX3BhdGgKKyAgc3VicHJvY2Vzcy5Qb3BlbihjbWQsIHNoZWxsPVRydWUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpLmNvbW11bmljYXRlKCkKKworICAjIFByaW50IHN1bW1hcnkgdG8gY29uc29sZQorICBsb2dnaW5nLmluZm8oIkFsbCBkb25lLlxuIikKKyAgY21kID0gImNhdCAiICsgc3VtbWFyeV90eHRfdG1wX3BhdGgKKyAgb3Muc3lzdGVtKGNtZCkKKyAgbG9nZ2luZy5pbmZvKCIiKQorCisgICMgT3BlbiB0aGUgYnJvd3NlciB3aXRoIHN1bW1hcnkKKyAgd2ViYnJvd3Nlci5vcGVuKGRldGFpbHNfaHRtbF90bXBfcGF0aCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgbWFpbigpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9mb2xkZXIucG5nIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9mb2xkZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViM2ZjZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2RyYXdhYmxlL2ZvbGRlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9ydW50ZXN0LnBuZyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9yZXMvZHJhd2FibGUvcnVudGVzdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwYzY1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9yZXMvZHJhd2FibGUvcnVudGVzdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9sYXlvdXQvZGlybGlzdF9yb3cueG1sIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9sYXlvdXQvZGlybGlzdF9yb3cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NTc4YTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2xheW91dC9kaXJsaXN0X3Jvdy54bWwKQEAgLTAsMCArMSw0MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI4MHB4IgorICAgICAgICBhbmRyb2lkOmFkanVzdFZpZXdCb3VuZHM9InRydWUiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE1cHgiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxNXB4IgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjE1cHgiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iMTVweCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xhYmVsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNjBweCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE0c3AiCisgICAgLz4KKworPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmQxZWI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19ydW5fYWJvcnRfZGlyX3RpdGxlX3ByZWZpeCI+RGlyZWN0b3J5Ojwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX3J1bl9hYm9ydF9kaXJfbXNnIj5UaGlzIHdpbGwgcnVuIGFsbCB0aGUgdGVzdHMgaW4gdGhpcyBkaXJlY3RvcnkgYW5kIGFsbAorICAgICAgICAgICAgdGhlIHN1YmRpcmVjdG9yaWVzLiBJdCBtYXkgdGFrZSBhIGZldyBob3VycyE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19ydW5fYWJvcnRfZGlyX29rX2J1dHRvbiI+UnVuIHRlc3RzITwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX3J1bl9hYm9ydF9kaXJfYWJvcnRfYnV0dG9uIj5BYm9ydDwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfcHJvZ3Jlc3NfdGl0bGUiPkxvYWRpbmcgaXRlbXMuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfcHJvZ3Jlc3NfbXNnIj5QbGVhc2Ugd2FpdC4uLjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJydW5uZXJfcHJlbG9hZGluZ190aXRsZSI+UHJlbG9hZGluZyB0ZXN0cy4uLjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvQWJzdHJhY3RSZXN1bHQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0Fic3RyYWN0UmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4OTMwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0Fic3RyYWN0UmVzdWx0LmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworCisvKioKKyAqIEEgY2xhc3MgdGhhdCByZXByZXNlbnQgYSByZXN1bHQgb2YgdGhlIHRlc3QuIEl0IGlzIHJlc3BvbnNpYmxlIGZvciByZXR1cm5pbmcgdGhlIHJlc3VsdCdzCisgKiByYXcgZGF0YSBhbmQgZ2VuZXJhdGluZyBpdHMgb3duIGRpZmYgaW4gSFRNTCBmb3JtYXQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc3VsdCBpbXBsZW1lbnRzIENvbXBhcmFibGU8QWJzdHJhY3RSZXN1bHQ+IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkFic3RyYWN0UmVzdWx0IjsKKworICAgIHB1YmxpYyBlbnVtIFRlc3RUeXBlIHsKKyAgICAgICAgVEVYVCB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dFJlc3VsdChidW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBSRU5ERVJfVFJFRSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBSZW5kZXJUcmVlIHRlc3RzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCAqLworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSk7CisgICAgfQorCisgICAgcHVibGljIGVudW0gUmVzdWx0Q29kZSB7CisgICAgICAgIFBBU1MoIlBhc3NlZCIpLAorICAgICAgICBGQUlMX1JFU1VMVF9ESUZGRVJTKCJSZXN1bHQgZGlmZmVycyIpLAorICAgICAgICBGQUlMX05PX0VYUEVDVEVEX1JFU1VMVCgiTm8gZXhwZWN0ZWQgcmVzdWx0IiksCisgICAgICAgIEZBSUxfVElNRURfT1VUKCJUaW1lZCBvdXQiKSwKKyAgICAgICAgRkFJTF9DUkFTSEVEKCJDcmFzaGVkIik7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVRpdGxlOworCisgICAgICAgIHByaXZhdGUgUmVzdWx0Q29kZShTdHJpbmcgdGl0bGUpIHsKKyAgICAgICAgICAgIG1UaXRsZSA9IHRpdGxlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbVRpdGxlOworICAgICAgICB9CisgICAgfQorCisgICAgU3RyaW5nIG1BZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZzsKKworICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEFic3RyYWN0UmVzdWx0IGFub3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlbGF0aXZlUGF0aCgpLmNvbXBhcmVUbyhhbm90aGVyLmdldFJlbGF0aXZlUGF0aCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZyhTdHJpbmcgYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcpIHsKKyAgICAgICAgbUFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nID0gYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmc7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG1BZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyB0aGUgcmVzdWx0IG9iamVjdCBvYnRhaW4gdGhlIHJlc3VsdHMgb2YgdGhlIHRlc3QgZnJvbSB0aGUgd2VidmlldworICAgICAqIGFuZCBzdG9yZSB0aGVtIGluIHRoZSBmb3JtYXQgdGhhdCBzdWl0cyBpdHNlbGYgYmVzdHMuIFRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cy4KKyAgICAgKiBUaGUgbWVzc2FnZSBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgaXMgYSBtZXNzYWdlIHRoYXQgc2hvdWxkIGJlIHNlbnQgdG8gaXRzIHRhcmdldAorICAgICAqIHdoZW4gdGhlIHJlc3VsdCBmaW5pc2hlcyBvYnRhaW5pbmcgdGhlIHJlc3VsdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3ZWJ2aWV3CisgICAgICogQHBhcmFtIHJlc3VsdE9idGFpbmVkTXNnCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgb2J0YWluQWN0dWFsUmVzdWx0cyhXZWJWaWV3IHdlYnZpZXcsIE1lc3NhZ2UgcmVzdWx0T2J0YWluZWRNc2cpOworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChieXRlW10gZXhwZWN0ZWRSZXN1bHQpOworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXhwZWN0ZWRUZXh0UmVzdWx0KFN0cmluZyBleHBlY3RlZFJlc3VsdCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHJlc3VsdCdzIGltYWdlIGRhdGEgdGhhdCBjYW4gYmUgd3JpdHRlbiB0byB0aGUgZGlzay4gSXQgY2FuIGJlIG51bGwKKyAgICAgKiBpZiB0aGVyZSBpcyBhbiBlcnJvciBvZiBzb21lIHNvcnQgb3IgZm9yIGV4YW1wbGUgdGhlIHRlc3QgdGltZXMgb3V0LgorICAgICAqCisgICAgICogPHA+IFNvbWUgdGVzdHMgd2lsbCBub3QgcHJvdmlkZSBkYXRhIChsaWtlIHRleHQgdGVzdHMpCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICByZXN1bHRzIGltYWdlIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldEFjdHVhbEltYWdlUmVzdWx0KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHJlc3VsdCdzIHRleHQgZGF0YS4gSXQgY2FuIGJlIG51bGwKKyAgICAgKiBpZiB0aGVyZSBpcyBhbiBlcnJvciBvZiBzb21lIHNvcnQgb3IgZm9yIGV4YW1wbGUgdGhlIHRlc3QgdGltZXMgb3V0LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgcmVzdWx0cyB0ZXh0IGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEFjdHVhbFRleHRSZXN1bHQoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvZGUgb2YgdGhpcyByZXN1bHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0aGUgY29kZSBvZiB0aGlzIHJlc3VsdAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBSZXN1bHRDb2RlIGdldFJlc3VsdENvZGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0IGRhdGEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0IGRhdGEuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFRlc3RUeXBlIGdldFR5cGUoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcGllY2Ugb2YgSFRNTCBjb2RlIHRoYXQgcHJlc2VudHMgYSB2aXN1YWwgZGlmZiBiZXR3ZWVuIGEgcmVzdWx0IGFuZAorICAgICAqIHRoZSBleHBlY3RlZCByZXN1bHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBhIHBpZWNlIG9mIEhUTUwgY29kZSB3aXRoIGEgdmlzdWFsIGRpZmYgYmV0d2VlbiB0aGUgcmVzdWx0IGFuZCB0aGUgZXhwZWN0ZWQgcmVzdWx0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREaWZmQXNIdG1sKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgQnVuZGxlIGdldEJ1bmRsZSgpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0FkZGl0aW9uYWxUZXh0T3V0cHV0LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9BZGRpdGlvbmFsVGV4dE91dHB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOWE5MTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9BZGRpdGlvbmFsVGV4dE91dHB1dC5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQud2Via2l0LkNvbnNvbGVNZXNzYWdlOworCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiBBIGNsYXNzIHRoYXQgc3RvcmVzIGNvbnNvbGVzIG1lc3NhZ2VzLCBkYXRhYmFzZSBjYWxsYmFja3MsIGFsZXJ0IG1lc3NhZ2VzLCBldGMuCisgKi8KK3B1YmxpYyBjbGFzcyBBZGRpdGlvbmFsVGV4dE91dHB1dCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQWRkaXRpb25hbFRleHRPdXRwdXQiOworCisgICAgLyoqCisgICAgICogT3JkZXJpbmcgb2YgZW51bXMgaXMgaW1wb3J0YW50IGFzIGl0IGRldGVybWluZXMgb3JkZXJpbmcgb2YgdGhlIHRvU3RyaW5nIG1ldGhvZCEKKyAgICAgKiBTdHJpbmdCdWlsZGVycyB3aWxsIGJlIHByaW50ZWQgaW4gdGhlIG9yZGVyIHRoZSBjb3JyZXNwb25kaW5nIHR5cGVzIGFwcGVhciBoZXJlLgorICAgICAqLworICAgIHByaXZhdGUgZW51bSBPdXRwdXRUeXBlIHsKKyAgICAgICAgSlNfRElBTE9HLAorICAgICAgICBFWENFRURFRF9EQl9RVU9UQV9NRVNTQUdFLAorICAgICAgICBDT05TT0xFX01FU1NBR0U7CisgICAgfQorCisgICAgU3RyaW5nQnVpbGRlcltdIG1PdXRwdXRzID0gbmV3IFN0cmluZ0J1aWxkZXJbT3V0cHV0VHlwZS52YWx1ZXMoKS5sZW5ndGhdOworCisgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIGdldFN0cmluZ0J1aWxkZXJGb3JUeXBlKE91dHB1dFR5cGUgb3V0cHV0VHlwZSkgeworICAgICAgICBpbnQgaW5kZXggPSBvdXRwdXRUeXBlLm9yZGluYWwoKTsKKyAgICAgICAgaWYgKG1PdXRwdXRzW2luZGV4XSA9PSBudWxsKSB7CisgICAgICAgICAgICBtT3V0cHV0c1tpbmRleF0gPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtT3V0cHV0c1tpbmRleF07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kRXhjZWVkZWREYlF1b3RhTWVzc2FnZShTdHJpbmcgdXJsU3RyaW5nLCBTdHJpbmcgZGF0YWJhc2VJZGVudGlmaWVyKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZS5FWENFRURFRF9EQl9RVU9UQV9NRVNTQUdFKTsKKworICAgICAgICBTdHJpbmcgcHJvdG9jb2wgPSAiIjsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSAiIjsKKyAgICAgICAgaW50IHBvcnQgPSAwOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpOworICAgICAgICAgICAgcHJvdG9jb2wgPSB1cmwuZ2V0UHJvdG9jb2woKTsKKyAgICAgICAgICAgIGhvc3QgPSB1cmwuZ2V0SG9zdCgpOworICAgICAgICAgICAgaWYgKHVybC5nZXRQb3J0KCkgPiAtMSkgeworICAgICAgICAgICAgICAgIHBvcnQgPSB1cmwuZ2V0UG9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgInVybFN0cmluZz0iICsgdXJsU3RyaW5nICsgIiBkYXRhYmFzZUlkZW50aWZpZXI9IiArIGRhdGFiYXNlSWRlbnRpZmllciwKKyAgICAgICAgICAgICAgICAgICAgZSk7CisgICAgICAgIH0KKworICAgICAgICBvdXRwdXQuYXBwZW5kKCJVSSBERUxFR0FURSBEQVRBQkFTRSBDQUxMQkFDSzogIik7CisgICAgICAgIG91dHB1dC5hcHBlbmQoImV4Y2VlZGVkRGF0YWJhc2VRdW90YUZvclNlY3VyaXR5T3JpZ2luOnsiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZChwcm90b2NvbCArICIsICIgKyBob3N0ICsgIiwgIiArIHBvcnQgKyAifSAiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiZGF0YWJhc2U6IiArIGRhdGFiYXNlSWRlbnRpZmllciArICJcbiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZENvbnNvbGVNZXNzYWdlKENvbnNvbGVNZXNzYWdlIGNvbnNvbGVNZXNzYWdlKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZS5DT05TT0xFX01FU1NBR0UpOworCisgICAgICAgIG91dHB1dC5hcHBlbmQoIkNPTlNPTEUgTUVTU0FHRTogbGluZSAiICsgY29uc29sZU1lc3NhZ2UubGluZU51bWJlcigpKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiOiAiICsgY29uc29sZU1lc3NhZ2UubWVzc2FnZSgpICsgIlxuIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSnNBbGVydChTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIG91dHB1dCA9IGdldFN0cmluZ0J1aWxkZXJGb3JUeXBlKE91dHB1dFR5cGUuSlNfRElBTE9HKTsKKworICAgICAgICBvdXRwdXQuYXBwZW5kKCJBTEVSVDogIik7CisgICAgICAgIG91dHB1dC5hcHBlbmQobWVzc2FnZSk7CisgICAgICAgIG91dHB1dC5hcHBlbmQoJ1xuJyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSnNDb25maXJtKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZS5KU19ESUFMT0cpOworCisgICAgICAgIG91dHB1dC5hcHBlbmQoIkNPTkZJUk06ICIpOworICAgICAgICBvdXRwdXQuYXBwZW5kKG1lc3NhZ2UpOworICAgICAgICBvdXRwdXQuYXBwZW5kKCdcbicpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZEpzUHJvbXB0KFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZS5KU19ESUFMT0cpOworCisgICAgICAgIG91dHB1dC5hcHBlbmQoIlBST01QVDogIik7CisgICAgICAgIG91dHB1dC5hcHBlbmQobWVzc2FnZSk7CisgICAgICAgIG91dHB1dC5hcHBlbmQoIiwgZGVmYXVsdCB0ZXh0OiAiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZChkZWZhdWx0VmFsdWUpOworICAgICAgICBvdXRwdXQuYXBwZW5kKCdcbicpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtT3V0cHV0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG1PdXRwdXRzW2ldICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKG1PdXRwdXRzW2ldLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvQ3Jhc2hlZER1bW15UmVzdWx0LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9DcmFzaGVkRHVtbXlSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzkzZGFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvQ3Jhc2hlZER1bW15UmVzdWx0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKKy8qKgorICogQSBkdW1teSBjbGFzcyByZXByZXNlbnRpbmcgdGVzdCB0aGF0IGNyYXNoZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBDcmFzaGVkRHVtbXlSZXN1bHQgZXh0ZW5kcyBBYnN0cmFjdFJlc3VsdCB7CisgICAgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisKKyAgICBwdWJsaWMgQ3Jhc2hlZER1bW15UmVzdWx0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgbVJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlUGF0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYnl0ZVtdIGdldEFjdHVhbEltYWdlUmVzdWx0KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFjdHVhbFRleHRSZXN1bHQoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdW5kbGUgZ2V0QnVuZGxlKCkgeworICAgICAgICAvKiogVE9ETzogICovCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlmZkFzSHRtbCgpIHsKKyAgICAgICAgLyoqIFRPRE86IFByb2JhYmx5IHNob3cgYXQgbGVhc3QgZXhwZWN0ZWQgcmVzdWx0cyAqLworICAgICAgICByZXR1cm4gIk9vb3BzLCBJIGNyYXNoZWQuLi4iOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCkgeworICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzdWx0Q29kZSBnZXRSZXN1bHRDb2RlKCkgeworICAgICAgICByZXR1cm4gUmVzdWx0Q29kZS5GQUlMX0NSQVNIRUQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlc3RUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9idGFpbkFjdHVhbFJlc3VsdHMoV2ViVmlldyB3ZWJ2aWV3LCBNZXNzYWdlIHJlc3VsdE9idGFpbmVkTXNnKSB7CisgICAgICAgIC8qKiBUaGlzIG1ldGhvZCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhpcyB0eXBlIG9mIHJlc3VsdCAqLworICAgICAgICBhc3NlcnQgZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChieXRlW10gZXhwZWN0ZWRSZXN1bHQpIHsKKyAgICAgICAgLyoqIFRPRE8gKi8KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZFRleHRSZXN1bHQoU3RyaW5nIGV4cGVjdGVkUmVzdWx0KSB7CisgICAgICAgIC8qKiBUT0RPICovCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0V2ZW50U2VuZGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9FdmVudFNlbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViN2NiYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9FdmVudFNlbmRlci5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworCisvKioKKyAqIEEgY2xhc3MgdGhhdCBhY3RzIGFzIGEgSlMgaW50ZXJmYWNlIGZvciB3ZWJ2aWV3IHRvIG1vY2sgdmFyaW91cyB0b3VjaCBldmVudHMsCisgKiBtb3VzZSBhY3Rpb25zIGFuZCBrZXkgcHJlc3Nlcy4KKyAqCisgKiBUaGUgbWV0aG9kcyBoZXJlIGp1c3QgY2FsbCBjb3JyZXNwb25kaW5nIG1ldGhvZHMgb24gRXZlbnRTZW5kZXJJbXBsCisgKiB0aGF0IGNvbnRhaW5zIHRoZSBsb2dpYyBvZiBob3cgdG8gZXhlY3V0ZSB0aGUgbWV0aG9kcy4KKyAqLworcHVibGljIGNsYXNzIEV2ZW50U2VuZGVyIHsKKyAgICBFdmVudFNlbmRlckltcGwgbUV2ZW50U2VuZGVySW1wbCA9IG5ldyBFdmVudFNlbmRlckltcGwoKTsKKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnJlc2V0KHdlYlZpZXcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuYWJsZURPTVVJRXZlbnRMb2dnaW5nKGludCBkb21Ob2RlKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwuZW5hYmxlRE9NVUlFdmVudExvZ2dpbmcoZG9tTm9kZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmlyZUtleWJvYXJkRXZlbnRzVG9FbGVtZW50KGludCBkb21Ob2RlKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwuZmlyZUtleWJvYXJkRXZlbnRzVG9FbGVtZW50KGRvbU5vZGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGtleURvd24oU3RyaW5nIGNoYXJhY3RlciwgU3RyaW5nW10gd2l0aE1vZGlmaWVycykgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLmtleURvd24oY2hhcmFjdGVyLCB3aXRoTW9kaWZpZXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBrZXlEb3duKFN0cmluZyBjaGFyYWN0ZXIpIHsKKyAgICAgICAga2V5RG93bihjaGFyYWN0ZXIsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxlYXBGb3J3YXJkKGludCBtaWxsaXNlY29uZHMpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5sZWFwRm9yd2FyZChtaWxsaXNlY29uZHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlQ2xpY2soKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwubW91c2VDbGljaygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bigpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5tb3VzZURvd24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZU1vdmVUbyhpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5tb3VzZU1vdmVUbyh4LCB5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZVVwKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLm1vdXNlVXAoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaFN0YXJ0KCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnRvdWNoU3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRUb3VjaFBvaW50KGludCB4LCBpbnQgeSkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLmFkZFRvdWNoUG9pbnQoeCwgeSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlVG91Y2hQb2ludChpbnQgaWQsIGludCB4LCBpbnQgeSkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnVwZGF0ZVRvdWNoUG9pbnQoaWQsIHgsIHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRvdWNoTW9kaWZpZXIoU3RyaW5nIG1vZGlmaWVyLCBib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5zZXRUb3VjaE1vZGlmaWVyKG1vZGlmaWVyLCBlbmFibGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaE1vdmUoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwudG91Y2hNb3ZlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVsZWFzZVRvdWNoUG9pbnQoaW50IGlkKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwucmVsZWFzZVRvdWNoUG9pbnQoaWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRvdWNoRW5kKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnRvdWNoRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hDYW5jZWwoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwudG91Y2hDYW5jZWwoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhclRvdWNoUG9pbnRzKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLmNsZWFyVG91Y2hQb2ludHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjYW5jZWxUb3VjaFBvaW50KGludCBpZCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLmNhbmNlbFRvdWNoUG9pbnQoaWQpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9FdmVudFNlbmRlckltcGwuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0V2ZW50U2VuZGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZTYxMzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9FdmVudFNlbmRlckltcGwuamF2YQpAQCAtMCwwICsxLDU2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgRXZlbnRTZW5kZXIKKyAqLworcHVibGljIGNsYXNzIEV2ZW50U2VuZGVySW1wbCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiRXZlbnRTZW5kZXJJbXBsIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRU5BQkxFX0RPTV9VSV9FVkVOVF9MT0dHSU5HID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0ZJUkVfS0VZQk9BUkRfRVZFTlRTX1RPX0VMRU1FTlQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTEVBUF9GT1JXQVJEID0gMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfS0VZX0RPV04gPSAzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19NT1VTRV9ET1dOID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX01PVVNFX1VQID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX01PVVNFX0NMSUNLID0gNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX01PVVNFX01PVkVfVE8gPSA3OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19BRERfVE9VQ0hfUE9JTlQgPSA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVE9VQ0hfU1RBUlQgPSA5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVVBEQVRFX1RPVUNIX1BPSU5UID0gMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UT1VDSF9NT1ZFID0gMTE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19DTEVBUl9UT1VDSF9QT0lOVFMgPSAxMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RPVUNIX0NBTkNFTCA9IDEzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfUkVMRUFTRV9UT1VDSF9QT0lOVCA9IDE0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVE9VQ0hfRU5EID0gMTU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TRVRfVE9VQ0hfTU9ESUZJRVIgPSAxNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NBTkNFTF9UT1VDSF9QT0lOVCA9IDE3OworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUb3VjaFBvaW50IHsKKyAgICAgICAgV2ViVmlldyBtV2ViVmlldzsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVg7CisgICAgICAgIHByaXZhdGUgaW50IG1ZOworICAgICAgICBwcml2YXRlIGxvbmcgbURvd25UaW1lOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJlbGVhc2VkID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTW92ZWQgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1DYW5jZWxsZWQgPSBmYWxzZTsKKworICAgICAgICBwdWJsaWMgVG91Y2hQb2ludChXZWJWaWV3IHdlYlZpZXcsIGludCB4LCBpbnQgeSkgeworICAgICAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgICAgICAgICAgbVggPSBzY2FsZVgoeCk7CisgICAgICAgICAgICBtWSA9IHNjYWxlWSh5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0WCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtWDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0WSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtWTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01vdmVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Nb3ZlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG1vdmUoaW50IG5ld1gsIGludCBuZXdZKSB7CisgICAgICAgICAgICBtWCA9IHNjYWxlWChuZXdYKTsKKyAgICAgICAgICAgIG1ZID0gc2NhbGVZKG5ld1kpOworICAgICAgICAgICAgbU1vdmVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0SGFzTW92ZWQoKSB7CisgICAgICAgICAgICBtTW92ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGdldERvd25UaW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Eb3duVGltZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldERvd25UaW1lKGxvbmcgZG93blRpbWUpIHsKKyAgICAgICAgICAgIG1Eb3duVGltZSA9IGRvd25UaW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWxlYXNlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUmVsZWFzZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworICAgICAgICAgICAgbVJlbGVhc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1DYW5jZWxsZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7CisgICAgICAgICAgICBtQ2FuY2VsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IHNjYWxlWChpbnQgeCkgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpKHggKiBtV2ViVmlldy5nZXRTY2FsZSgpKSAtIG1XZWJWaWV3LmdldFNjcm9sbFgoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IHNjYWxlWShpbnQgeSkgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpKHkgKiBtV2ViVmlldy5nZXRTY2FsZSgpKSAtIG1XZWJWaWV3LmdldFNjcm9sbFkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxUb3VjaFBvaW50PiBtVG91Y2hQb2ludHM7CisgICAgcHJpdmF0ZSBpbnQgbVRvdWNoTWV0YVN0YXRlOworICAgIHByaXZhdGUgaW50IG1Nb3VzZVg7CisgICAgcHJpdmF0ZSBpbnQgbU1vdXNlWTsKKworICAgIHByaXZhdGUgV2ViVmlldyBtV2ViVmlldzsKKworICAgIHByaXZhdGUgSGFuZGxlciBtRXZlbnRTZW5kZXJIYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBUb3VjaFBvaW50IHRvdWNoUG9pbnQ7CisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlOworICAgICAgICAgICAgS2V5RXZlbnQgZXZlbnQ7CisKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19FTkFCTEVfRE9NX1VJX0VWRU5UX0xPR0dJTkc6CisgICAgICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBpbXBsZW1lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19GSVJFX0tFWUJPQVJEX0VWRU5UU19UT19FTEVNRU5UOgorICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogaW1wbGVtZW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfTEVBUF9GT1JXQVJEOgorICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogaW1wbGVtZW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfS0VZX0RPV046CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZSA9IChCdW5kbGUpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoYXJhY3RlciA9IGJ1bmRsZS5nZXRTdHJpbmcoImNoYXJhY3RlciIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB3aXRoTW9kaWZpZXJzID0gYnVuZGxlLmdldFN0cmluZ0FycmF5KCJ3aXRoTW9kaWZpZXJzIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdpdGhNb2RpZmllcnMgIT0gbnVsbCAmJiB3aXRoTW9kaWZpZXJzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2l0aE1vZGlmaWVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyVG9LZXlDb2RlKHdpdGhNb2RpZmllcnNbaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBleGVjdXRlS2V5RXZlbnQoS2V5RXZlbnQuQUNUSU9OX0RPV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhclRvS2V5Q29kZShjaGFyYWN0ZXIudG9Mb3dlckNhc2UoKS50b0NoYXJBcnJheSgpWzBdKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLyoqIE1PVVNFICovCisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19NT1VTRV9ET1dOOgorICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogSW1wbGVtZW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfTU9VU0VfVVA6CisgICAgICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBJbXBsZW1lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19NT1VTRV9DTElDSzoKKyAgICAgICAgICAgICAgICAgICAgLyoqIFRPRE86IEltcGxlbWVudCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX01PVVNFX01PVkVfVE86CisgICAgICAgICAgICAgICAgICAgIGludCB4ID0gbXNnLmFyZzE7CisgICAgICAgICAgICAgICAgICAgIGludCB5ID0gbXNnLmFyZzI7CisKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoeCA+IG1Nb3VzZVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbmV3IEtleUV2ZW50KEtleUV2ZW50LkFDVElPTl9ET1dOLCBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHggPCBtTW91c2VYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0xFRlQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5vbktleURvd24oZXZlbnQuZ2V0S2V5Q29kZSgpLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5vbktleVVwKGV2ZW50LmdldEtleUNvZGUoKSwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoeSA+IG1Nb3VzZVkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbmV3IEtleUV2ZW50KEtleUV2ZW50LkFDVElPTl9ET1dOLCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeSA8IG1Nb3VzZVkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbmV3IEtleUV2ZW50KEtleUV2ZW50LkFDVElPTl9ET1dOLCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5vbktleURvd24oZXZlbnQuZ2V0S2V5Q29kZSgpLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5vbktleVVwKGV2ZW50LmdldEtleUNvZGUoKSwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbU1vdXNlWCA9IHg7CisgICAgICAgICAgICAgICAgICAgIG1Nb3VzZVkgPSB5OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8qKiBUT1VDSCAqLworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQUREX1RPVUNIX1BPSU5UOgorICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLmFkZChuZXcgVG91Y2hQb2ludChtV2ViVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMSwgbXNnLmFyZzIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFRvdWNoUG9pbnRzKCkuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRyArICI6Ok1TR19BRERfVE9VQ0hfUE9JTlQiLCAiQWRkZWQgbW9yZSB0aGFuIG9uZSB0b3VjaCBwb2ludCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfVE9VQ0hfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgKiBGSVhNRTogQXQgdGhlIG1vbWVudCB3ZSBkb24ndCBzdXBwb3J0IG11bHRpLXRvdWNoLiBIZW5jZSwgd2Ugb25seSBleGFtaW5lCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSBmaXJzdCB0b3VjaCBwb2ludC4gSW4gZnV0dXJlIHRoaXMgbWV0aG9kIHdpbGwgbmVlZCByZXdyaXRpbmcuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0VG91Y2hQb2ludHMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0b3VjaFBvaW50ID0gZ2V0VG91Y2hQb2ludHMoKS5nZXQoMCk7CisKKyAgICAgICAgICAgICAgICAgICAgdG91Y2hQb2ludC5zZXREb3duVGltZShTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVUb3VjaEV2ZW50KHRvdWNoUG9pbnQsIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19VUERBVEVfVE9VQ0hfUE9JTlQ6CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZSA9IChCdW5kbGUpbXNnLm9iajsKKworICAgICAgICAgICAgICAgICAgICBpbnQgaWQgPSBidW5kbGUuZ2V0SW50KCJpZCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPj0gZ2V0VG91Y2hQb2ludHMoKS5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpNU0dfVVBEQVRFX1RPVUNIX1BPSU5UIiwgIlRvdWNoUG9pbnQgb3V0IG9mIGJvdW5kczogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZ2V0VG91Y2hQb2ludHMoKS5nZXQoaWQpLm1vdmUoYnVuZGxlLmdldEludCgieCIpLCBidW5kbGUuZ2V0SW50KCJ5IikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RPVUNIX01PVkU6CisgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgKiBGSVhNRTogQXQgdGhlIG1vbWVudCB3ZSBkb24ndCBzdXBwb3J0IG11bHRpLXRvdWNoLiBIZW5jZSwgd2Ugb25seSBleGFtaW5lCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSBmaXJzdCB0b3VjaCBwb2ludC4gSW4gZnV0dXJlIHRoaXMgbWV0aG9kIHdpbGwgbmVlZCByZXdyaXRpbmcuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0VG91Y2hQb2ludHMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0b3VjaFBvaW50ID0gZ2V0VG91Y2hQb2ludHMoKS5nZXQoMCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF0b3VjaFBvaW50Lmhhc01vdmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBleGVjdXRlVG91Y2hFdmVudCh0b3VjaFBvaW50LCBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSk7CisgICAgICAgICAgICAgICAgICAgIHRvdWNoUG9pbnQucmVzZXRIYXNNb3ZlZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0NBTkNFTF9UT1VDSF9QT0lOVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5hcmcxID49IGdldFRvdWNoUG9pbnRzKCkuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHICsgIjo6TVNHX1JFTEVBU0VfVE9VQ0hfUE9JTlQiLCAiVG91Y2hQb2ludCBvdXQgb2YgYm91bmRzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbXNnLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLmdldChtc2cuYXJnMSkuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfVE9VQ0hfQ0FOQ0VMOgorICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICogRklYTUU6IEF0IHRoZSBtb21lbnQgd2UgZG9uJ3Qgc3VwcG9ydCBtdWx0aS10b3VjaC4gSGVuY2UsIHdlIG9ubHkgZXhhbWluZQorICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZmlyc3QgdG91Y2ggcG9pbnQuIEluIGZ1dHVyZSB0aGlzIG1ldGhvZCB3aWxsIG5lZWQgcmV3cml0aW5nLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFRvdWNoUG9pbnRzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG91Y2hQb2ludCA9IGdldFRvdWNoUG9pbnRzKCkuZ2V0KDApOworCisgICAgICAgICAgICAgICAgICAgIGlmICh0b3VjaFBvaW50LmlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVUb3VjaEV2ZW50KHRvdWNoUG9pbnQsIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUkVMRUFTRV9UT1VDSF9QT0lOVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5hcmcxID49IGdldFRvdWNoUG9pbnRzKCkuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHICsgIjo6TVNHX1JFTEVBU0VfVE9VQ0hfUE9JTlQiLCAiVG91Y2hQb2ludCBvdXQgb2YgYm91bmRzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbXNnLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLmdldChtc2cuYXJnMSkucmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RPVUNIX0VORDoKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIEZJWE1FOiBBdCB0aGUgbW9tZW50IHdlIGRvbid0IHN1cHBvcnQgbXVsdGktdG91Y2guIEhlbmNlLCB3ZSBvbmx5IGV4YW1pbmUKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIGZpcnN0IHRvdWNoIHBvaW50LiBJbiBmdXR1cmUgdGhpcyBtZXRob2Qgd2lsbCBuZWVkIHJld3JpdGluZy4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRUb3VjaFBvaW50cygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRvdWNoUG9pbnQgPSBnZXRUb3VjaFBvaW50cygpLmdldCgwKTsKKworICAgICAgICAgICAgICAgICAgICBleGVjdXRlVG91Y2hFdmVudCh0b3VjaFBvaW50LCBNb3Rpb25FdmVudC5BQ1RJT05fVVApOworICAgICAgICAgICAgICAgICAgICBpZiAodG91Y2hQb2ludC5pc1JlbGVhc2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFRvdWNoUG9pbnRzKCkucmVtb3ZlKDApOworICAgICAgICAgICAgICAgICAgICAgICAgdG91Y2hQb2ludCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TRVRfVE9VQ0hfTU9ESUZJRVI6CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZSA9IChCdW5kbGUpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vZGlmaWVyID0gYnVuZGxlLmdldFN0cmluZygibW9kaWZpZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVkID0gYnVuZGxlLmdldEJvb2xlYW4oImVuYWJsZWQiKTsKKworICAgICAgICAgICAgICAgICAgICBpbnQgbWFzayA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICgiYWx0Ii5lcXVhbHMobW9kaWZpZXIudG9Mb3dlckNhc2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBLZXlFdmVudC5NRVRBX0FMVF9PTjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgic2hpZnQiLmVxdWFscyhtb2RpZmllci50b0xvd2VyQ2FzZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFzayA9IEtleUV2ZW50Lk1FVEFfU0hJRlRfT047CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImN0cmwiLmVxdWFscyhtb2RpZmllci50b0xvd2VyQ2FzZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFzayA9IEtleUV2ZW50Lk1FVEFfU1lNX09OOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1ldGFTdGF0ZSB8PSBtYXNrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTWV0YVN0YXRlICY9IH5tYXNrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19DTEVBUl9UT1VDSF9QT0lOVFM6CisgICAgICAgICAgICAgICAgICAgIGdldFRvdWNoUG9pbnRzKCkuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgdm9pZCByZXNldChXZWJWaWV3IHdlYlZpZXcpIHsKKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgICAgICBtVG91Y2hQb2ludHMgPSBudWxsOworICAgICAgICBtVG91Y2hNZXRhU3RhdGUgPSAwOworICAgICAgICBtTW91c2VYID0gMDsKKyAgICAgICAgbU1vdXNlWSA9IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5hYmxlRE9NVUlFdmVudExvZ2dpbmcoaW50IGRvbU5vZGUpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0VOQUJMRV9ET01fVUlfRVZFTlRfTE9HR0lORyk7CisgICAgICAgIG1zZy5hcmcxID0gZG9tTm9kZTsKKyAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZpcmVLZXlib2FyZEV2ZW50c1RvRWxlbWVudChpbnQgZG9tTm9kZSkgeworICAgICAgICBNZXNzYWdlIG1zZyA9IG1FdmVudFNlbmRlckhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfRklSRV9LRVlCT0FSRF9FVkVOVFNfVE9fRUxFTUVOVCk7CisgICAgICAgIG1zZy5hcmcxID0gZG9tTm9kZTsKKyAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxlYXBGb3J3YXJkKGludCBtaWxsaXNlY29uZHMpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0xFQVBfRk9SV0FSRCk7CisgICAgICAgIG1zZy5hcmcxID0gbWlsbGlzZWNvbmRzOworICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQga2V5RG93bihTdHJpbmcgY2hhcmFjdGVyLCBTdHJpbmdbXSB3aXRoTW9kaWZpZXJzKSB7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoImNoYXJhY3RlciIsIGNoYXJhY3Rlcik7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmdBcnJheSgid2l0aE1vZGlmaWVycyIsIHdpdGhNb2RpZmllcnMpOworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0tFWV9ET1dOLCBidW5kbGUpLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIC8qKiBNT1VTRSAqLworCisgICAgcHVibGljIHZvaWQgbW91c2VEb3duKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX01PVVNFX0RPV04pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlVXAoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfTU9VU0VfVVApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlQ2xpY2soKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfTU9VU0VfQ0xJQ0spOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlTW92ZVRvKGludCB4LCBpbnQgeSkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX01PVVNFX01PVkVfVE8sIHgsIHkpLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIC8qKiBUT1VDSCAqLworCisgICAgcHVibGljIHZvaWQgYWRkVG91Y2hQb2ludChpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BRERfVE9VQ0hfUE9JTlQsIHgsIHkpLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRvdWNoU3RhcnQoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfVE9VQ0hfU1RBUlQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVRvdWNoUG9pbnQoaW50IGlkLCBpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgYnVuZGxlLnB1dEludCgiaWQiLCBpZCk7CisgICAgICAgIGJ1bmRsZS5wdXRJbnQoIngiLCB4KTsKKyAgICAgICAgYnVuZGxlLnB1dEludCgieSIsIHkpOworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1VQREFURV9UT1VDSF9QT0lOVCwgYnVuZGxlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaE1vdmUoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfVE9VQ0hfTU9WRSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2FuY2VsVG91Y2hQb2ludChpbnQgaWQpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0NBTkNFTF9UT1VDSF9QT0lOVCk7CisgICAgICAgIG1zZy5hcmcxID0gaWQ7CisgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaENhbmNlbCgpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19UT1VDSF9DQU5DRUwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VUb3VjaFBvaW50KGludCBpZCkgeworICAgICAgICBNZXNzYWdlIG1zZyA9IG1FdmVudFNlbmRlckhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfUkVMRUFTRV9UT1VDSF9QT0lOVCk7CisgICAgICAgIG1zZy5hcmcxID0gaWQ7CisgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaEVuZCgpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19UT1VDSF9FTkQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRvdWNoTW9kaWZpZXIoU3RyaW5nIG1vZGlmaWVyLCBib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZygibW9kaWZpZXIiLCBtb2RpZmllcik7CisgICAgICAgIGJ1bmRsZS5wdXRCb29sZWFuKCJlbmFibGVkIiwgZW5hYmxlZCk7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfU0VUX1RPVUNIX01PRElGSUVSLCBidW5kbGUpLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyVG91Y2hQb2ludHMoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfQ0xFQVJfVE9VQ0hfUE9JTlRTKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8VG91Y2hQb2ludD4gZ2V0VG91Y2hQb2ludHMoKSB7CisgICAgICAgIGlmIChtVG91Y2hQb2ludHMgPT0gbnVsbCkgeworICAgICAgICAgICAgbVRvdWNoUG9pbnRzID0gbmV3IExpbmtlZExpc3Q8VG91Y2hQb2ludD4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtVG91Y2hQb2ludHM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVUb3VjaEV2ZW50KFRvdWNoUG9pbnQgdG91Y2hQb2ludCwgaW50IGFjdGlvbikgeworICAgICAgICBNb3Rpb25FdmVudCBldmVudCA9CisgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQub2J0YWluKHRvdWNoUG9pbnQuZ2V0RG93blRpbWUoKSwgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCksCisgICAgICAgICAgICAgICAgYWN0aW9uLCB0b3VjaFBvaW50LmdldFgoKSwgdG91Y2hQb2ludC5nZXRZKCksIG1Ub3VjaE1ldGFTdGF0ZSk7CisgICAgICAgIG1XZWJWaWV3Lm9uVG91Y2hFdmVudChldmVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVLZXlFdmVudChpbnQgYWN0aW9uLCBpbnQga2V5Q29kZSkgeworICAgICAgICBLZXlFdmVudCBldmVudCA9IG5ldyBLZXlFdmVudChhY3Rpb24sIGtleUNvZGUpOworICAgICAgICBtV2ViVmlldy5vbktleURvd24oZXZlbnQuZ2V0S2V5Q29kZSgpLCBldmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzdW1lcyBsb3dlcmNhc2UgY2hhcnMsIGNhc2UgbmVlZHMgdG8gYmUgaGFuZGxlZCBieSBjYWxsaW5nIGZ1bmN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBjaGFyVG9LZXlDb2RlKGNoYXIgYykgeworICAgICAgICAvLyBoYW5kbGUgbnVtYmVycworICAgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBjIC0gJzAnOworICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfMCArIG9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhhbmRsZSBjaGFyYWN0ZXJzCisgICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgeworICAgICAgICAgICAgaW50IG9mZnNldCA9IGMgLSAnYSc7CisgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9BICsgb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8gaGFuZGxlIGFsbCBvdGhlcnMKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICcqJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9TVEFSOworCisgICAgICAgICAgICBjYXNlICcjJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9QT1VORDsKKworICAgICAgICAgICAgY2FzZSAnLCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfQ09NTUE7CisKKyAgICAgICAgICAgIGNhc2UgJy4nOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1BFUklPRDsKKworICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1RBQjsKKworICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfU1BBQ0U7CisKKyAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9FTlRFUjsKKworICAgICAgICAgICAgY2FzZSAnXGInOgorICAgICAgICAgICAgY2FzZSAweDdGOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0RFTDsKKworICAgICAgICAgICAgY2FzZSAnfic6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfR1JBVkU7CisKKyAgICAgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX01JTlVTOworCisgICAgICAgICAgICBjYXNlICc9JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9FUVVBTFM7CisKKyAgICAgICAgICAgIGNhc2UgJygnOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0xFRlRfQlJBQ0tFVDsKKworICAgICAgICAgICAgY2FzZSAnKSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfUklHSFRfQlJBQ0tFVDsKKworICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0JBQ0tTTEFTSDsKKworICAgICAgICAgICAgY2FzZSAnOyc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfU0VNSUNPTE9OOworCisgICAgICAgICAgICBjYXNlICdcJyc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfQVBPU1RST1BIRTsKKworICAgICAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfU0xBU0g7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbW9kaWZpZXJUb0tleUNvZGUoU3RyaW5nIG1vZGlmaWVyKSB7CisgICAgICAgIGlmIChtb2RpZmllci5lcXVhbHMoImN0cmxLZXkiKSkgeworICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfQUxUX0xFRlQ7CisgICAgICAgIH0gZWxzZSBpZiAobW9kaWZpZXIuZXF1YWxzKCJzaGlmdEtleSIpKSB7CisgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9TSElGVF9MRUZUOworICAgICAgICB9IGVsc2UgaWYgKG1vZGlmaWVyLmVxdWFscygiYWx0S2V5IikpIHsKKyAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1NZTTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1VOS05PV047CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0ZpbGVGaWx0ZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0ZpbGVGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2M4NTY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRmlsZUZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEEgdXRpbGl0eSB0byBmaWx0ZXIgb3V0IHNvbWUgZmlsZXMvZGlyZWN0b3JpZXMgZnJvbSB0aGUgdmlld3MgYW5kIHRlc3RzIHRoYXQgcnVuLgorICovCitwdWJsaWMgY2xhc3MgRmlsZUZpbHRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiRmlsZUZpbHRlciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9FWFBFQ1RBVElPTlNfVFhUX1BBVEggPQorICAgICAgICAgICAgInBsYXRmb3JtL2FuZHJvaWQvdGVzdF9leHBlY3RhdGlvbnMudHh0IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT0tFTl9TS0lQID0gIlNLSVAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT0tFTl9JR05PUkVfUkVTVUxUID0gIklHTk9SRV9SRVNVTFQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT0tFTl9TTE9XID0gIlNMT1ciOworCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBtU2tpcExpc3QgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBtSWdub3JlUmVzdWx0TGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IG1TbG93TGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb290RGlyUGF0aDsKKworICAgIHB1YmxpYyBGaWxlRmlsdGVyKFN0cmluZyByb290RGlyUGF0aCkgeworICAgICAgICAvKiogSXQgbWF5IG9yIG1heSBub3QgY29udGFpbiBhIHRyYWlsaW5nIHNsYXNoICovCisgICAgICAgIHRoaXMubVJvb3REaXJQYXRoID0gcm9vdERpclBhdGg7CisKKyAgICAgICAgcmVsb2FkQ29uZmlndXJhdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0cmltVHJhaWxpbmdTbGFzaElmUHJlc2VudChTdHJpbmcgcGF0aCkgeworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKyAgICAgICAgcmV0dXJuIGZpbGUuZ2V0UGF0aCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbG9hZENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIEZpbGUgdHh0X2V4cCA9IG5ldyBGaWxlKG1Sb290RGlyUGF0aCwgVEVTVF9FWFBFQ1RBVElPTlNfVFhUX1BBVEgpOworCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJ1ZmZlcmVkUmVhZGVyOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnVmZmVyZWRSZWFkZXIgPQorICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIodHh0X2V4cCkpOworCisgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgIFN0cmluZyBlbnRyeTsKKyAgICAgICAgICAgIFN0cmluZ1tdIHBhcnRzOworICAgICAgICAgICAgU3RyaW5nIHBhdGg7CisgICAgICAgICAgICBTZXQ8U3RyaW5nPiB0b2tlbnM7CisgICAgICAgICAgICBCb29sZWFuIHNraXBwZWQ7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGxpbmUgPSBidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoqIFJlbW92ZSB0aGUgY29tbWVudCBhbmQgdHJpbSAqLworICAgICAgICAgICAgICAgIGVudHJ5ID0gbGluZS5zcGxpdCgiLy8iLCAyKVswXS50cmltKCk7CisKKyAgICAgICAgICAgICAgICAvKiogT21pdCBlbXB0eSBsaW5lcywgYWR2YW5jZSB0byBuZXh0IGxpbmUgKi8KKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qKiBTcGxpdCBvbiB3aGl0ZXNwYWNlIGludG8gcGF0aCBwYXJ0IGFuZCB0aGUgcmVzdCAqLworICAgICAgICAgICAgICAgIHBhcnRzID0gZW50cnkuc3BsaXQoIlxccyIsIDIpOworCisgICAgICAgICAgICAgICAgLyoqIEF0IHRoaXMgcG9pbnQgcGFydHMubGVuZ3RoID49IDEgKi8KKyAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRyArICI6OnJlbG9hZENvbmZpZ3VyYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGVyZSBhcmUgbm8gb3B0aW9ucyBzcGVjaWZpZWQgZm9yIHRoZSB0ZXN0ISIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwYXRoID0gdHJpbVRyYWlsaW5nU2xhc2hJZlByZXNlbnQocGFydHNbMF0pOworCisgICAgICAgICAgICAgICAgLyoqIFNwbGl0IG9uIHdoaXRlc3BhY2UgKi8KKyAgICAgICAgICAgICAgICB0b2tlbnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QocGFydHNbMV0uc3BsaXQoIlxccyIsIDApKSk7CisKKyAgICAgICAgICAgICAgICAvKiogQ2hvc2UgdGhlIHJpZ2h0IGNvbGxlY3Rpb25zIHRvIGFkZCB0byAqLworICAgICAgICAgICAgICAgIHNraXBwZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmNvbnRhaW5zKFRPS0VOX1NLSVApKSB7CisgICAgICAgICAgICAgICAgICAgIG1Ta2lwTGlzdC5hZGQocGF0aCk7CisgICAgICAgICAgICAgICAgICAgIHNraXBwZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qKiBJZiB0ZXN0IGlzIG9uIHNraXAgbGlzdCB3ZSBpZ25vcmUgYW55IGZ1cnRoZXIgb3B0aW9ucyAqLworICAgICAgICAgICAgICAgIGlmIChza2lwcGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuY29udGFpbnMoVE9LRU5fSUdOT1JFX1JFU1VMVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUlnbm9yZVJlc3VsdExpc3QuYWRkKHBhdGgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuY29udGFpbnMoVE9LRU5fU0xPVykpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNsb3dMaXN0LmFkZChwYXRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAibVJvb3REaXJQYXRoPSIgKyBtUm9vdERpclBhdGggKyAiOiBGaWxlIG5vdCBmb3VuZDogIiArCisgICAgICAgICAgICAgICAgICAgIHR4dF9leHAuZ2V0UGF0aCgpLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1Sb290RGlyUGF0aD0iICsgbVJvb3REaXJQYXRoLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0ZXN0IGlzIHN1cHBvc2VkIHRvIGJlIHNraXBwZWQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBQYXRoIGdpdmVuIHNob3VsZCByZWxhdGl2ZSB3aXRoaW4gTGF5b3V0VGVzdHMgZm9sZGVyLCBlLmcuIGZhc3QvZG9tL2Zvby5odG1sCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVzdFBhdGgKKyAgICAgKiAgICAgICAgICAgIC0gYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiBMYXlvdXRUZXN0cyBmb2xkZXIKKyAgICAgKiBAcmV0dXJuIGlmIHRoZSB0ZXN0IGlzIHN1cHBvc2VkIHRvIGJlIHNraXBwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NraXAoU3RyaW5nIHRlc3RQYXRoKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHByZWZpeCA6IGdldFByZWZpeGVzKHRlc3RQYXRoKSkgeworICAgICAgICAgICAgaWYgKG1Ta2lwTGlzdC5jb250YWlucyhwcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRlc3QgcmVzdWx0IGlzIHN1cHBvc2VkIHRvIGJlIGlnbm9yZWQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBQYXRoIGdpdmVuIHNob3VsZCByZWxhdGl2ZSB3aXRoaW4gTGF5b3V0VGVzdHMgZm9sZGVyLCBlLmcuIGZhc3QvZG9tL2Zvby5odG1sCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVzdFBhdGgKKyAgICAgKiAgICAgICAgICAgIC0gYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiBMYXlvdXRUZXN0cyBmb2xkZXIKKyAgICAgKiBAcmV0dXJuIGlmIHRoZSB0ZXN0IHJlc3VsdCBpcyBzdXBwb3NlZCB0byBiZSBpZ25vcmVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmVSZXMoU3RyaW5nIHRlc3RQYXRoKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHByZWZpeCA6IGdldFByZWZpeGVzKHRlc3RQYXRoKSkgeworICAgICAgICAgICAgaWYgKG1JZ25vcmVSZXN1bHRMaXN0LmNvbnRhaW5zKHByZWZpeCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGVzdCBpcyBzbG93IGFuZCBzaG91bGQgaGF2ZSB0aW1lb3V0IGluY3JlYXNlZC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFBhdGggZ2l2ZW4gc2hvdWxkIHJlbGF0aXZlIHdpdGhpbiBMYXlvdXRUZXN0cyBmb2xkZXIsIGUuZy4gZmFzdC9kb20vZm9vLmh0bWwKKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0UGF0aAorICAgICAqICAgICAgICAgICAgLSBhIHJlbGF0aXZlIHBhdGggd2l0aGluIExheW91dFRlc3RzIGZvbGRlcgorICAgICAqIEByZXR1cm4gaWYgdGhlIHRlc3QgaXMgc2xvdyBhbmQgc2hvdWxkIGhhdmUgdGltZW91dCBpbmNyZWFzZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTbG93KFN0cmluZyB0ZXN0UGF0aCkgeworICAgICAgICBmb3IgKFN0cmluZyBwcmVmaXggOiBnZXRQcmVmaXhlcyh0ZXN0UGF0aCkpIHsKKyAgICAgICAgICAgIGlmIChtU2xvd0xpc3QuY29udGFpbnMocHJlZml4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIHBhdGggcHJlZml4ZXMgb2YgdGhlIGdpdmVuIHBhdGguCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBlLmcuIHRoaXMvaXMvYS9wYXRoIHJldHVybnMgdGhlIGxpc3Q6IHRoaXMgdGhpcy9pcyB0aGlzL2lzL2EgdGhpcy9pcy9hL3BhdGgKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBhbGwgcGF0aCBwcmVmaXhlcyBvZiB0aGUgZ2l2ZW4gcGF0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0UHJlZml4ZXMoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBwcmVmaXhlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPig4KTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBwcmVmaXhlcy5hZGQoZmlsZS5nZXRQYXRoKCkpOworICAgICAgICAgICAgZmlsZSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICB9IHdoaWxlIChmaWxlICE9IG51bGwpOworCisgICAgICAgIHJldHVybiBwcmVmaXhlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIGRpcmVjdG9yeSBtYXkgY29udGFpbiB0ZXN0cyBvciBjb250YWlucyBqdXN0IGhlbHBlciBmaWxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXJOYW1lCisgICAgICogQHJldHVybgorICAgICAqICAgICAgaWYgdGhlIGRpcmVjdG9yeSBtYXkgY29udGFpbiB0ZXN0cworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Rlc3REaXIoU3RyaW5nIGRpck5hbWUpIHsKKyAgICAgICAgcmV0dXJuICghZGlyTmFtZS5lcXVhbHMoInNjcmlwdC10ZXN0cyIpCisgICAgICAgICAgICAgICAgJiYgIWRpck5hbWUuZXF1YWxzKCJyZXNvdXJjZXMiKSAmJiAhZGlyTmFtZS5zdGFydHNXaXRoKCIuIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUgZmlsZSBpcyBhIHRlc3QuCisgICAgICogQ3VycmVudGx5IHdlIHJ1biAuaHRtbCBhbmQgLnhodG1sIHRlc3RzLgorICAgICAqCisgICAgICogQHBhcmFtIHRlc3ROYW1lCisgICAgICogQHJldHVybgorICAgICAqICAgICAgaWYgdGhlIGZpbGUgaXMgYSB0ZXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVGVzdEZpbGUoU3RyaW5nIHRlc3ROYW1lKSB7CisgICAgICAgIHJldHVybiB0ZXN0TmFtZS5lbmRzV2l0aCgiLmh0bWwiKSB8fCB0ZXN0TmFtZS5lbmRzV2l0aCgiLnhodG1sIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHRoZSB0ZXN0cyByb290IGRpcgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVQYXRoCisgICAgICogQHJldHVybgorICAgICAqICAgICAgdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHRlc3RzIHJvb3QgZGlyCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoU3RyaW5nIGZpbGVQYXRoKSB7CisgICAgICAgIEZpbGUgcm9vdERpciA9IG5ldyBGaWxlKG1Sb290RGlyUGF0aCk7CisgICAgICAgIHJldHVybiBmaWxlUGF0aC5yZXBsYWNlRmlyc3Qocm9vdERpci5nZXRQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciwgIiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byB0aGUgdGVzdHMgcm9vdCBkaXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlUGF0aAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB0ZXN0cyByb290IGRpcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKEZpbGUgZmlsZSkgeworICAgICAgICByZXR1cm4gZ2V0UmVsYXRpdmVQYXRoKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIH0KKworICAgIHB1YmxpYyBGaWxlIGdldEFic29sdXRlRmlsZShTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIHJldHVybiBuZXcgRmlsZShtUm9vdERpclBhdGgsIHJlbGF0aXZlUGF0aCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBYm9zbHV0ZVBhdGgoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICByZXR1cm4gZ2V0QWJzb2x1dGVGaWxlKHJlbGF0aXZlUGF0aCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIHBhdGggY29udGFpbnMgZXh0ZW5zaW9uIChlLmcgLmZvbyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlKSB0aGVuIGl0IGNoYW5nZXMKKyAgICAgKiB0aGlzICguZm9vKSBpbnRvIG5ld0VuZGluZyAoc28gaXQgaGFzIHRvIGNvbnRhaW4gdGhlIGRvdCBpZiB3ZSB3YW50IHRvIHByZXNlcnZlIGl0KS4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSBwYXRoIGRvZXNuJ3QgY29udGFpbiBhbiBleHRlbnNpb24sIGl0IGFkZHMgdGhlIGVuZGluZyB0byB0aGUgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKKyAgICAgKiBAcGFyYW0gbmV3RW5kaW5nCisgICAgICogQHJldHVybgorICAgICAqICAgICAgYSBuZXcgcGF0aCwgY29udGFpbmluZyB0aGUgbmV3RXh0ZW5zaW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2V0UGF0aEVuZGluZyhTdHJpbmcgcmVsYXRpdmVQYXRoLCBTdHJpbmcgbmV3RW5kaW5nKSB7CisgICAgICAgIGludCBkb3RQb3MgPSByZWxhdGl2ZVBhdGgubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKGRvdFBvcyA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCArIG5ld0VuZGluZzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZWxhdGl2ZVBhdGguc3Vic3RyaW5nKDAsIGRvdFBvcykgKyBuZXdFbmRpbmc7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0ZzVXRpbHMuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0ZzVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2ZlNjlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRnNVdGlscy5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKKy8qKgorICoKKyAqLworcHVibGljIGNsYXNzIEZzVXRpbHMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiRnNVdGlscyI7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVEYXRhVG9TdG9yYWdlKEZpbGUgZmlsZSwgYnl0ZVtdIGJ5dGVzLCBib29sZWFuIGFwcGVuZCkgeworICAgICAgICBMb2cuZChMT0dfVEFHLCAid3JpdGVEYXRhVG9TdG9yYWdlKCk6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKKyAgICAgICAgICAgICAgICBmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKKyAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAid3JpdGVEYXRhVG9TdG9yYWdlKCk6IEZpbGUgY3JlYXRlZC4iKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlLCBhcHBlbmQpOworICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZShieXRlcyk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJmaWxlLmdldEFic29sdXRlUGF0aD0iICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSByZWFkRGF0YUZyb21TdG9yYWdlKEZpbGUgZmlsZSkgeworICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWFkRGF0YUZyb21TdG9yYWdlKCk6IEZpbGUgZG9lcyBub3QgZXhpc3Q6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworICAgICAgICAgICAgICAgIGJ5dGVzID0gbmV3IGJ5dGVbKGludCkgZmlsZS5sZW5ndGgoKV07CisgICAgICAgICAgICAgICAgZmlzLnJlYWQoYnl0ZXMpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoZmlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiZmlsZS5nZXRBYnNvbHV0ZVBhdGg9IiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ5dGVzOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDU3ZWI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuTW9ja0dlb2xvY2F0aW9uOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlN0b3JhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogQSBjbGFzcyB0aGF0IGlzIHJlZ2lzdGVyZWQgYXMgSlMgaW50ZXJmYWNlIGZvciB3ZWJ2aWV3IGluIExheW91dFRlc3RFeGVjdXRvcgorICovCitwdWJsaWMgY2xhc3MgTGF5b3V0VGVzdENvbnRyb2xsZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkxheW91dFRlc3RDb250cm9sbGVyIjsKKworICAgIExheW91dFRlc3RzRXhlY3V0b3IgbUxheW91dFRlc3RzRXhlY3V0b3I7CisKKyAgICBwdWJsaWMgTGF5b3V0VGVzdENvbnRyb2xsZXIoTGF5b3V0VGVzdHNFeGVjdXRvciBsYXlvdXRUZXN0c0V4ZWN1dG9yKSB7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yID0gbGF5b3V0VGVzdHNFeGVjdXRvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3YWl0VW50aWxEb25lKCkgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci53YWl0VW50aWxEb25lKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RG9uZSgpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3Iubm90aWZ5RG9uZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoKSB7CisgICAgICAgIGR1bXBBc1RleHQoZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoYm9vbGVhbiBlbmFibGVQaXhlbFRlc3QpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3IuZHVtcEFzVGV4dChlbmFibGVQaXhlbFRlc3QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3IuZHVtcENoaWxkRnJhbWVzQXNUZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXJBbGxEYXRhYmFzZXMoKSB7CisgICAgICAgIExvZy5pKExPR19UQUcsICJjbGVhckFsbERhdGFiYXNlcygpIGNhbGxlZCIpOworICAgICAgICBXZWJTdG9yYWdlLmdldEluc3RhbmNlKCkuZGVsZXRlQWxsRGF0YSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhbk9wZW5XaW5kb3dzKCkgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5zZXRDYW5PcGVuV2luZG93cygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBEYXRhYmFzZUNhbGxiYWNrcygpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3IuZHVtcERhdGFiYXNlQ2FsbGJhY2tzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGF0YWJhc2VRdW90YShsb25nIHF1b3RhKSB7CisgICAgICAgIC8qKiBUT0RPOiBSZXNldCB0aGlzIGJlZm9yZSBldmVyeSB0ZXN0ISAqLworICAgICAgICBMb2cuaShMT0dfVEFHLCAic2V0RGF0YWJhc2VRdW90YSgpIGNhbGxlZCB3aXRoOiAiICsgcXVvdGEpOworICAgICAgICBXZWJTdG9yYWdlLmdldEluc3RhbmNlKCkuc2V0UXVvdGFGb3JPcmlnaW4oVXJpLmZyb21GaWxlKG5ldyBGaWxlKCIiKSkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBxdW90YSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R2VvbG9jYXRpb25QZXJtaXNzaW9uKGJvb2xlYW4gYWxsb3cpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3Iuc2V0R2VvbG9jYXRpb25QZXJtaXNzaW9uKGFsbG93KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrR2VvbG9jYXRpb25Qb3NpdGlvbihkb3VibGUgbGF0aXR1ZGUsIGRvdWJsZSBsb25naXR1ZGUsIGRvdWJsZSBhY2N1cmFjeSkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCAic2V0TW9ja0dlb2xvY2F0aW9uUG9zaXRpb24oKTogIiArICJsYXRpdHVkZT0iICsgbGF0aXR1ZGUgKworICAgICAgICAgICAgICAgICIgbG9uZ2l0dWRlPSIgKyBsb25naXR1ZGUgKyAiIGFjY3VyYWN5PSIgKyBhY2N1cmFjeSk7CisgICAgICAgIE1vY2tHZW9sb2NhdGlvbi5nZXRJbnN0YW5jZSgpLnNldFBvc2l0aW9uKGxhdGl0dWRlLCBsb25naXR1ZGUsIGFjY3VyYWN5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrR2VvbG9jYXRpb25FcnJvcihpbnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgInNldE1vY2tHZW9sb2NhdGlvbkVycm9yKCk6ICIgKyAiY29kZT0iICsgY29kZSArICIgbWVzc2FnZT0iICsgbWVzc2FnZSk7CisgICAgICAgIE1vY2tHZW9sb2NhdGlvbi5nZXRJbnN0YW5jZSgpLnNldEVycm9yKGNvZGUsIG1lc3NhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgLy8gQ29uZmlndXJhdGlvbiBpcyBpbiBXZWJLaXQsIHNvIHN0YXkgb24gV2ViQ29yZSB0aHJlYWQsIGJ1dCBnbyB2aWEgTGF5b3V0VGVzdHNFeGVjdXRvcgorICAgICAgICAvLyBhcyB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgV2Vidmlldy4KKyAgICAgICAgTG9nLmkoTE9HX1RBRywgInNldE1vY2tEZXZpY2VPcmllbnRhdGlvbigiICsgY2FuUHJvdmlkZUFscGhhICsKKyAgICAgICAgICAgICAgICAiLCAiICsgYWxwaGEgKyAiLCAiICsgY2FuUHJvdmlkZUJldGEgKyAiLCAiICsgYmV0YSArICIsICIgKyBjYW5Qcm92aWRlR2FtbWEgKworICAgICAgICAgICAgICAgICIsICIgKyBnYW1tYSArICIpIik7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yLnNldE1vY2tEZXZpY2VPcmllbnRhdGlvbigKKyAgICAgICAgICAgICAgICBjYW5Qcm92aWRlQWxwaGEsIGFscGhhLCBjYW5Qcm92aWRlQmV0YSwgYmV0YSwgY2FuUHJvdmlkZUdhbW1hLCBnYW1tYSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0xheW91dFRlc3RzRXhlY3V0b3IuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0xheW91dFRlc3RzRXhlY3V0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTdlYzdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTGF5b3V0VGVzdHNFeGVjdXRvci5qYXZhCkBAIC0wLDAgKzEsNjEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlci5XYWtlTG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuSnNQcm9tcHRSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuSnNSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViQ2hyb21lQ2xpZW50OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NsaWVudDsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5HZW9sb2NhdGlvblBlcm1pc3Npb25zOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlN0b3JhZ2UuUXVvdGFVcGRhdGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFRoaXMgYWN0aXZpdHkgZXhlY3V0ZXMgdGhlIHRlc3QuIEl0IGNvbnRhaW5zIFdlYlZpZXcgYW5kIGxvZ2ljIG9mIExheW91dFRlc3RDb250cm9sbGVyCisgKiBmdW5jdGlvbnMuIEl0IHJ1bnMgaW4gYSBzZXBhcmF0ZSBwcm9jZXNzIGFuZCBzZW5kcyB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIHRoZSB0ZXN0CisgKiB0byBNYW5hZ2VyU2VydmljZS4gVGhlIHJlYXNvbiB3aHkgaXMgdG8gaGFuZGxlIGNyYXNoaW5nICh0ZXN0IHRoYXQgY3Jhc2hlcyBicmluZ3MgZG93bgorICogd2hvbGUgcHJvY2VzcyB3aXRoIGl0KS4KKyAqLworcHVibGljIGNsYXNzIExheW91dFRlc3RzRXhlY3V0b3IgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIGVudW0gQ3VycmVudFN0YXRlIHsKKyAgICAgICAgSURMRSwKKyAgICAgICAgUkVOREVSSU5HX1BBR0UsCisgICAgICAgIFdBSVRJTkdfRk9SX0FTWU5DSFJPTk9VU19URVNULAorICAgICAgICBPQlRBSU5JTkdfUkVTVUxUOworCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZ1N0YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMgPT0gQ3VycmVudFN0YXRlLlJFTkRFUklOR19QQUdFIHx8CisgICAgICAgICAgICAgICAgICAgIHRoaXMgPT0gQ3VycmVudFN0YXRlLldBSVRJTkdfRk9SX0FTWU5DSFJPTk9VU19URVNUOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIFRPRE86IG1ha2UgaXQgYSBzZXR0aW5nICovCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUU19ST09UX0RJUl9QQVRIID0KKyAgICAgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgImFuZHJvaWQiICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgIkxheW91dFRlc3RzIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkxheW91dFRlc3RFeGVjdXRvciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9URVNUU19MSVNUID0gIlRlc3RzTGlzdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVEVTVF9JTkRFWCA9ICJUZXN0SW5kZXgiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19BQ1RVQUxfUkVTVUxUX09CVEFJTkVEID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RFU1RfVElNRURfT1VUID0gMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1RJTUVfT1VUX01TID0gMTUgKiAxMDAwOworCisgICAgLyoqIEEgbGlzdCBvZiB0ZXN0cyB0aGF0IHJlbWFpbiB0byBydW4gc2luY2UgbGFzdCBjcmFzaCAqLworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1UZXN0c0xpc3Q7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGEgbnVtYmVyIG9mIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuIEl0IGlzIDAtYmFzZWQgYW5kIGRvZXNuJ3QgcmVzZXQgYWZ0ZXIKKyAgICAgKiB0aGUgY3Jhc2guIEluaXRpYWwgaW5kZXggaXMgcGFzc2VkIHRvIExheW91dFRlc3RzRXhlY3V0ZXIgaW4gdGhlIGludGVudCB0aGF0IHN0YXJ0cworICAgICAqIGl0LgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1DdXJyZW50VGVzdEluZGV4OworCisgICAgLyoqIFRoZSB0b3RhbCBudW1iZXIgb2YgdGVzdHMgdG8gcnVuLCBkb2Vzbid0IHJlc2V0IGFmdGVyIGNyYXNoICovCisgICAgcHJpdmF0ZSBpbnQgbVRvdGFsVGVzdENvdW50OworCisgICAgcHJpdmF0ZSBXZWJWaWV3IG1DdXJyZW50V2ViVmlldzsKKyAgICBwcml2YXRlIFN0cmluZyBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGg7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUN1cnJlbnRUZXN0VXJpOworICAgIHByaXZhdGUgQ3VycmVudFN0YXRlIG1DdXJyZW50U3RhdGUgPSBDdXJyZW50U3RhdGUuSURMRTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtQ3VycmVudFRlc3RUaW1lZE91dDsKKyAgICBwcml2YXRlIEFic3RyYWN0UmVzdWx0IG1DdXJyZW50UmVzdWx0OworICAgIHByaXZhdGUgQWRkaXRpb25hbFRleHRPdXRwdXQgbUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dDsKKworICAgIHByaXZhdGUgTGF5b3V0VGVzdENvbnRyb2xsZXIgbUxheW91dFRlc3RDb250cm9sbGVyID0gbmV3IExheW91dFRlc3RDb250cm9sbGVyKHRoaXMpOworICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FuT3BlbldpbmRvd3M7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wRGF0YWJhc2VDYWxsYmFja3M7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0dlb2xvY2F0aW9uUGVybWlzc2lvblNldDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUdlb2xvY2F0aW9uUGVybWlzc2lvbjsKKyAgICBwcml2YXRlIE1hcDxHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrLCBTdHJpbmc+IG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzOworCisgICAgcHJpdmF0ZSBFdmVudFNlbmRlciBtRXZlbnRTZW5kZXIgPSBuZXcgRXZlbnRTZW5kZXIoKTsKKworICAgIHByaXZhdGUgV2FrZUxvY2sgbVNjcmVlbkRpbUxvY2s7CisKKyAgICAvKiogQ09NTVVOSUNBVElPTiBXSVRIIE1hbmFnZXJTZXJ2aWNlICovCisKKyAgICBwcml2YXRlIE1lc3NlbmdlciBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXI7CisKKyAgICBwcml2YXRlIFNlcnZpY2VDb25uZWN0aW9uIG1TZXJ2aWNlQ29ubmVjdGlvbiA9IG5ldyBTZXJ2aWNlQ29ubmVjdGlvbigpIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7CisgICAgICAgICAgICBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKHNlcnZpY2UpOworICAgICAgICAgICAgc3RhcnRUZXN0cygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKKyAgICAgICAgICAgIC8qKiBUT0RPICovCisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1SZXN1bHRIYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQUNUVUFMX1JFU1VMVF9PQlRBSU5FRDoKKyAgICAgICAgICAgICAgICAgICAgb25BY3R1YWxSZXN1bHRzT2J0YWluZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19URVNUX1RJTUVEX09VVDoKKyAgICAgICAgICAgICAgICAgICAgb25UZXN0VGltZWRPdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKiogV0VCVklFVyBDT05GSUdVUkFUSU9OICovCisKKyAgICBwcml2YXRlIFdlYlZpZXdDbGllbnQgbVdlYlZpZXdDbGllbnQgPSBuZXcgV2ViVmlld0NsaWVudCgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFnZUZpbmlzaGVkKFdlYlZpZXcgdmlldywgU3RyaW5nIHVybCkgeworICAgICAgICAgICAgLyoqIFNvbWUgdGVzdHMgZmlyZSB1cCBtYW55IHBhZ2UgbG9hZHMsIHdlIGRvbid0IHdhbnQgdG8gZGV0ZWN0IHRoZW0gKi8KKyAgICAgICAgICAgIGlmICghdXJsLmVxdWFscyhtQ3VycmVudFRlc3RVcmkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBDdXJyZW50U3RhdGUuUkVOREVSSU5HX1BBR0UpIHsKKyAgICAgICAgICAgICAgICBvblRlc3RGaW5pc2hlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgV2ViQ2hyb21lQ2xpZW50IG1XZWJDaHJvbWVDbGllbnQgPSBuZXcgV2ViQ2hyb21lQ2xpZW50KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25FeGNlZWRlZERhdGFiYXNlUXVvdGEoU3RyaW5nIHVybCwgU3RyaW5nIGRhdGFiYXNlSWRlbnRpZmllciwKKyAgICAgICAgICAgICAgICBsb25nIGN1cnJlbnRRdW90YSwgbG9uZyBlc3RpbWF0ZWRTaXplLCBsb25nIHRvdGFsVXNlZFF1b3RhLAorICAgICAgICAgICAgICAgIFF1b3RhVXBkYXRlciBxdW90YVVwZGF0ZXIpIHsKKyAgICAgICAgICAgIC8qKiBUT0RPOiBUaGlzIHNob3VsZCBiZSByZWNvcmRlZCBhcyBwYXJ0IG9mIHRoZSB0ZXh0IHJlc3VsdCAqLworICAgICAgICAgICAgLyoqIFRPRE86IFRoZSBxdW90YSBzaG91bGQgYWxzbyBwcm9iYWJseSBiZSByZXNldCBzb21laG93IGZvciBldmVyeSB0ZXN0PyAqLworICAgICAgICAgICAgaWYgKG1EdW1wRGF0YWJhc2VDYWxsYmFja3MpIHsKKyAgICAgICAgICAgICAgICBnZXRDdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQoKS5hcHBlbmRFeGNlZWRlZERiUXVvdGFNZXNzYWdlKHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlSWRlbnRpZmllcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBxdW90YVVwZGF0ZXIudXBkYXRlUXVvdGEoY3VycmVudFF1b3RhICsgNSAqIDEwMjQgKiAxMDI0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkpzQWxlcnQoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsLCBTdHJpbmcgbWVzc2FnZSwgSnNSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgICAgICBnZXRDdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQoKS5hcHBlbmRKc0FsZXJ0KG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzdWx0LmNvbmZpcm0oKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uSnNDb25maXJtKFdlYlZpZXcgdmlldywgU3RyaW5nIHVybCwgU3RyaW5nIG1lc3NhZ2UsIEpzUmVzdWx0IHJlc3VsdCkgeworICAgICAgICAgICAgZ2V0Q3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0KCkuYXBwZW5kSnNDb25maXJtKG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzdWx0LmNvbmZpcm0oKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uSnNQcm9tcHQoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSwKKyAgICAgICAgICAgICAgICBKc1Byb21wdFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgICAgIGdldEN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCgpLmFwcGVuZEpzUHJvbXB0KG1lc3NhZ2UsIGRlZmF1bHRWYWx1ZSk7CisgICAgICAgICAgICByZXN1bHQuY29uZmlybSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db25zb2xlTWVzc2FnZShDb25zb2xlTWVzc2FnZSBjb25zb2xlTWVzc2FnZSkgeworICAgICAgICAgICAgZ2V0Q3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0KCkuYXBwZW5kQ29uc29sZU1lc3NhZ2UoY29uc29sZU1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVXaW5kb3coV2ViVmlldyB2aWV3LCBib29sZWFuIGRpYWxvZywgYm9vbGVhbiB1c2VyR2VzdHVyZSwKKyAgICAgICAgICAgICAgICBNZXNzYWdlIHJlc3VsdE1zZykgeworICAgICAgICAgICAgV2ViVmlldy5XZWJWaWV3VHJhbnNwb3J0IHRyYW5zcG9ydCA9IChXZWJWaWV3LldlYlZpZXdUcmFuc3BvcnQpcmVzdWx0TXNnLm9iajsKKyAgICAgICAgICAgIC8qKiBCeSBkZWZhdWx0IHdpbmRvd3MgY2Fubm90IGJlIG9wZW5lZCwgc28ganVzdCBzZW5kIG51bGwgYmFjay4gKi8KKyAgICAgICAgICAgIFdlYlZpZXcgbmV3V2luZG93V2ViVmlldyA9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChtQ2FuT3BlbldpbmRvd3MpIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBXZSBuZXZlciBkaXNwbGF5IHRoZSBuZXcgd2luZG93LCBqdXN0IGNyZWF0ZSB0aGUgdmlldyBhbmQgYWxsb3cgaXQncyBjb250ZW50IHRvCisgICAgICAgICAgICAgICAgICogZXhlY3V0ZSBhbmQgYmUgcmVjb3JkZWQgYnkgdGhlIGV4ZWN1dG9yLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG5ld1dpbmRvd1dlYlZpZXcgPSBuZXcgV2ViVmlldyhMYXlvdXRUZXN0c0V4ZWN1dG9yLnRoaXMpOworICAgICAgICAgICAgICAgIHNldHVwV2ViVmlldyhuZXdXaW5kb3dXZWJWaWV3KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJhbnNwb3J0LnNldFdlYlZpZXcobmV3V2luZG93V2ViVmlldyk7CisgICAgICAgICAgICByZXN1bHRNc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkdlb2xvY2F0aW9uUGVybWlzc2lvbnNTaG93UHJvbXB0KFN0cmluZyBvcmlnaW4sCisgICAgICAgICAgICAgICAgR2VvbG9jYXRpb25QZXJtaXNzaW9ucy5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgaWYgKG1Jc0dlb2xvY2F0aW9uUGVybWlzc2lvblNldCkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrLmludm9rZShvcmlnaW4sIG1HZW9sb2NhdGlvblBlcm1pc3Npb24sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2ssIFN0cmluZz4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzLnB1dChjYWxsYmFjaywgb3JpZ2luKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKiogSU1QTEVNRU5UQVRJT04gKi8KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICByZXF1ZXN0V2luZG93RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9QUk9HUkVTUyk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOworICAgICAgICBtVGVzdHNMaXN0ID0gaW50ZW50LmdldFN0cmluZ0FycmF5TGlzdEV4dHJhKEVYVFJBX1RFU1RTX0xJU1QpOworICAgICAgICBtQ3VycmVudFRlc3RJbmRleCA9IGludGVudC5nZXRJbnRFeHRyYShFWFRSQV9URVNUX0lOREVYLCAtMSk7CisgICAgICAgIG1Ub3RhbFRlc3RDb3VudCA9IG1DdXJyZW50VGVzdEluZGV4ICsgbVRlc3RzTGlzdC5zaXplKCk7CisKKyAgICAgICAgUG93ZXJNYW5hZ2VyIHBtID0gKFBvd2VyTWFuYWdlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7CisgICAgICAgIG1TY3JlZW5EaW1Mb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlNDUkVFTl9ESU1fV0FLRV9MT0NLCisgICAgICAgICAgICAgICAgfCBQb3dlck1hbmFnZXIuT05fQUZURVJfUkVMRUFTRSwgIldha2VMb2NrIGluIExheW91dFRlc3RlciIpOworICAgICAgICBtU2NyZWVuRGltTG9jay5hY3F1aXJlKCk7CisKKyAgICAgICAgYmluZFNlcnZpY2UobmV3IEludGVudCh0aGlzLCBNYW5hZ2VyU2VydmljZS5jbGFzcyksIG1TZXJ2aWNlQ29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNldCgpIHsKKyAgICAgICAgV2ViVmlldyBwcmV2aW91c1dlYlZpZXcgPSBtQ3VycmVudFdlYlZpZXc7CisKKyAgICAgICAgcmVzZXRMYXlvdXRUZXN0Q29udHJvbGxlcigpOworCisgICAgICAgIG1DdXJyZW50VGVzdFRpbWVkT3V0ID0gZmFsc2U7CisgICAgICAgIG1DdXJyZW50UmVzdWx0ID0gbnVsbDsKKyAgICAgICAgbUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCA9IG51bGw7CisKKyAgICAgICAgbUN1cnJlbnRXZWJWaWV3ID0gbmV3IFdlYlZpZXcodGhpcyk7CisgICAgICAgIHNldHVwV2ViVmlldyhtQ3VycmVudFdlYlZpZXcpOworCisgICAgICAgIG1FdmVudFNlbmRlci5yZXNldChtQ3VycmVudFdlYlZpZXcpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KG1DdXJyZW50V2ViVmlldyk7CisgICAgICAgIGlmIChwcmV2aW91c1dlYlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRyArICI6OnJlc2V0IiwgInByZXZpb3VzV2ViVmlldyAhPSBudWxsIik7CisgICAgICAgICAgICBwcmV2aW91c1dlYlZpZXcuZGVzdHJveSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwV2ViVmlldyhXZWJWaWV3IHdlYlZpZXcpIHsKKyAgICAgICAgd2ViVmlldy5zZXRXZWJWaWV3Q2xpZW50KG1XZWJWaWV3Q2xpZW50KTsKKyAgICAgICAgd2ViVmlldy5zZXRXZWJDaHJvbWVDbGllbnQobVdlYkNocm9tZUNsaWVudCk7CisgICAgICAgIHdlYlZpZXcuYWRkSmF2YXNjcmlwdEludGVyZmFjZShtTGF5b3V0VGVzdENvbnRyb2xsZXIsICJsYXlvdXRUZXN0Q29udHJvbGxlciIpOworICAgICAgICB3ZWJWaWV3LmFkZEphdmFzY3JpcHRJbnRlcmZhY2UobUV2ZW50U2VuZGVyLCAiZXZlbnRTZW5kZXIiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0dGluZyBhIHRvdWNoIGludGVydmFsIG9mIC0xIGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoZSBvcHRpbWlzYXRpb24gaW4gV2ViVmlldworICAgICAgICAgKiB0aGF0IHN0b3BzIHJlcGVhdGVkIHRvdWNoIGV2ZW50cyBmbG9vZGluZyBXZWJDb3JlLiBUaGUgRXZlbnQgU2VuZGVyIG9ubHkgc2VuZHMgYQorICAgICAgICAgKiBzaW5nbGUgZXZlbnQgcmF0aGVyIHRoYW4gYSBzdHJlYW0gb2YgZXZlbnRzIChsaWtlIHdoYXQgd291bGQgZ2VuZXJhbGx5IGhhcHBlbiBpbgorICAgICAgICAgKiBhIHJlYWwgdXNlIG9mIHRvdWNoIGV2ZW50cyBpbiBhIFdlYlZpZXcpICBhbmQgc28gaWYgdGhlIFdlYlZpZXcgZHJvcHMgdGhlIGV2ZW50LAorICAgICAgICAgKiB0aGUgdGVzdCB3aWxsIGZhaWwgYXMgdGhlIHRlc3QgZXhwZWN0cyBvbmUgY2FsbGJhY2sgZm9yIGV2ZXJ5IHRvdWNoIGl0IHN5bnRoZXNpemVzLgorICAgICAgICAgKi8KKyAgICAgICAgd2ViVmlldy5zZXRUb3VjaEludGVydmFsKC0xKTsKKworICAgICAgICBXZWJTZXR0aW5ncyB3ZWJWaWV3U2V0dGluZ3MgPSB3ZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRBcHBDYWNoZUVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRBcHBDYWNoZVBhdGgoZ2V0QXBwbGljYXRpb25Db250ZXh0KCkuZ2V0Q2FjaGVEaXIoKS5nZXRQYXRoKCkpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0QXBwQ2FjaGVNYXhTaXplKExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldEphdmFTY3JpcHRFbmFibGVkKHRydWUpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0SmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzQXV0b21hdGljYWxseSh0cnVlKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldFN1cHBvcnRNdWx0aXBsZVdpbmRvd3ModHJ1ZSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRMYXlvdXRBbGdvcml0aG0oV2ViU2V0dGluZ3MuTGF5b3V0QWxnb3JpdGhtLk5PUk1BTCk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXREYXRhYmFzZUVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXREYXRhYmFzZVBhdGgoZ2V0RGlyKCJkYXRhYmFzZXMiLCAwKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXREb21TdG9yYWdlRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldFdvcmtlcnNFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldFhTU0F1ZGl0b3JFbmFibGVkKGZhbHNlKTsKKworICAgICAgICAvLyBUaGlzIGlzIGFzeW5jaHJvbm91cywgYnV0IGl0IGdldHMgcHJvY2Vzc2VkIGJ5IFdlYkNvcmUgYmVmb3JlIGl0IHN0YXJ0cyBsb2FkaW5nIHBhZ2VzLgorICAgICAgICBtQ3VycmVudFdlYlZpZXcudXNlTW9ja0RldmljZU9yaWVudGF0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0VGVzdHMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXNzYWdlIHNlcnZpY2VNc2cgPQorICAgICAgICAgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihudWxsLCBNYW5hZ2VyU2VydmljZS5NU0dfRklSU1RfVEVTVCk7CisKKyAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBpZiAoIW1UZXN0c0xpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZygiZmlyc3RUZXN0IiwgbVRlc3RzTGlzdC5nZXQoMCkpOworICAgICAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoImluZGV4IiwgbUN1cnJlbnRUZXN0SW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXJ2aWNlTXNnLnNldERhdGEoYnVuZGxlKTsKKyAgICAgICAgICAgIG1NYW5hZ2VyU2VydmljZU1lc3Nlbmdlci5zZW5kKHNlcnZpY2VNc2cpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aD0iICsgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJ1bk5leHRUZXN0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1bk5leHRUZXN0KCkgeworICAgICAgICBhc3NlcnQgbUN1cnJlbnRTdGF0ZSA9PSBDdXJyZW50U3RhdGUuSURMRSA6ICJtQ3VycmVudFN0YXRlID0gIiArIG1DdXJyZW50U3RhdGUubmFtZSgpOworCisgICAgICAgIGlmIChtVGVzdHNMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgb25BbGxUZXN0c0ZpbmlzaGVkKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggPSBtVGVzdHNMaXN0LnJlbW92ZSgwKTsKKyAgICAgICAgTG9nLmQoTE9HX1RBRyArICI6OnJ1bk5leHRUZXN0IiwgIlN0YXJ0OiAiICsgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsKKyAgICAgICAgICAgICAgICAiKCIgKyBtQ3VycmVudFRlc3RJbmRleCArICIpIik7CisgICAgICAgIG1DdXJyZW50VGVzdFVyaSA9CisgICAgICAgICAgICAgICAgVXJpLmZyb21GaWxlKG5ldyBGaWxlKFRFU1RTX1JPT1RfRElSX1BBVEgsIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCkpLnRvU3RyaW5nKCk7CisKKyAgICAgICAgcmVzZXQoKTsKKworICAgICAgICAvKiogU3RhcnQgdGltZS1vdXQgY291bnRkb3duIGFuZCB0aGUgdGVzdCAqLworICAgICAgICBtQ3VycmVudFN0YXRlID0gQ3VycmVudFN0YXRlLlJFTkRFUklOR19QQUdFOworICAgICAgICBtUmVzdWx0SGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChNU0dfVEVTVF9USU1FRF9PVVQsIERFRkFVTFRfVElNRV9PVVRfTVMpOworICAgICAgICBtQ3VycmVudFdlYlZpZXcubG9hZFVybChtQ3VycmVudFRlc3RVcmkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvblRlc3RUaW1lZE91dCgpIHsKKyAgICAgICAgYXNzZXJ0IG1DdXJyZW50U3RhdGUuaXNSdW5uaW5nU3RhdGUoKSA6ICJtQ3VycmVudFN0YXRlID0gIiArIG1DdXJyZW50U3RhdGUubmFtZSgpOworCisgICAgICAgIExvZy53KExPR19UQUcsICJvblRlc3RUaW1lZE91dCgpOiAiICsgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoKTsKKyAgICAgICAgbUN1cnJlbnRUZXN0VGltZWRPdXQgPSB0cnVlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXaGlsZSBpdCBpcyB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlIHRoYXQgdGhlIHRlc3QgdGltZXMgb3V0IGJlY2F1c2UKKyAgICAgICAgICogb2Ygd2VidmlldyBiZWNvbWluZyB1bnJlc3BvbnNpdmUsIGl0IGlzIHZlcnkgdW5saWtlbHkuIFRoZXJlZm9yZSBpdCdzCisgICAgICAgICAqIGFzc3VtZWQgdGhhdCBvYnRhaW5pbmcgcmVzdWx0cyAodGhhdCBjYWxscyB2YXJpb3VzIHdlYnZpZXcgbWV0aG9kcykKKyAgICAgICAgICogd2lsbCBub3QgaXRzZWxmIGhhbmcuCisgICAgICAgICAqLworICAgICAgICBvYnRhaW5BY3R1YWxSZXN1bHRzRnJvbVdlYlZpZXcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25UZXN0RmluaXNoZWQoKSB7CisgICAgICAgIGFzc2VydCBtQ3VycmVudFN0YXRlLmlzUnVubmluZ1N0YXRlKCkgOiAibUN1cnJlbnRTdGF0ZSA9ICIgKyBtQ3VycmVudFN0YXRlLm5hbWUoKTsKKworICAgICAgICBMb2cuaShMT0dfVEFHLCAib25UZXN0RmluaXNoZWQoKTogIiArIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCk7CisgICAgICAgIG9idGFpbkFjdHVhbFJlc3VsdHNGcm9tV2ViVmlldygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvYnRhaW5BY3R1YWxSZXN1bHRzRnJvbVdlYlZpZXcoKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJZiB0aGUgcmVzdWx0IGhhcyBub3QgYmVlbiBzZXQgYnkgdGhlIHRpbWUgdGhlIHRlc3QgZmluaXNoZXMgd2UgY3JlYXRlCisgICAgICAgICAqIGEgZGVmYXVsdCB0eXBlIG9mIHJlc3VsdC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChtQ3VycmVudFJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICAvKiogVE9ETzogRGVmYXVsdCB0eXBlIHNob3VsZCBiZSBSZW5kZXJUcmVlUmVzdWx0LiBXZSBkb24ndCBzdXBwb3J0IGl0IG5vdy4gKi8KKyAgICAgICAgICAgIG1DdXJyZW50UmVzdWx0ID0gbmV3IFRleHRSZXN1bHQobUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1DdXJyZW50U3RhdGUgPSBDdXJyZW50U3RhdGUuT0JUQUlOSU5HX1JFU1VMVDsKKworICAgICAgICBtQ3VycmVudFJlc3VsdC5vYnRhaW5BY3R1YWxSZXN1bHRzKG1DdXJyZW50V2ViVmlldywKKyAgICAgICAgICAgICAgICBtUmVzdWx0SGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BQ1RVQUxfUkVTVUxUX09CVEFJTkVEKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uQWN0dWFsUmVzdWx0c09idGFpbmVkKCkgeworICAgICAgICBhc3NlcnQgbUN1cnJlbnRTdGF0ZSA9PSBDdXJyZW50U3RhdGUuT0JUQUlOSU5HX1JFU1VMVAorICAgICAgICAgICAgICAgIDogIm1DdXJyZW50U3RhdGUgPSAiICsgbUN1cnJlbnRTdGF0ZS5uYW1lKCk7CisKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgIm9uQWN0dWFsUmVzdWx0c09idGFpbmVkKCk6ICIgKyBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGgpOworICAgICAgICBtQ3VycmVudFN0YXRlID0gQ3VycmVudFN0YXRlLklETEU7CisKKyAgICAgICAgbVJlc3VsdEhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX1RFU1RfVElNRURfT1VUKTsKKyAgICAgICAgcmVwb3J0UmVzdWx0VG9TZXJ2aWNlKCk7CisgICAgICAgIG1DdXJyZW50VGVzdEluZGV4Kys7CisgICAgICAgIHVwZGF0ZVByb2dyZXNzQmFyKCk7CisgICAgICAgIHJ1bk5leHRUZXN0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlcG9ydFJlc3VsdFRvU2VydmljZSgpIHsKKyAgICAgICAgaWYgKG1DdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgbUN1cnJlbnRSZXN1bHQuc2V0QWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcobUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dC50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXNzYWdlIHNlcnZpY2VNc2cgPQorICAgICAgICAgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihudWxsLCBNYW5hZ2VyU2VydmljZS5NU0dfUFJPQ0VTU19BQ1RVQUxfUkVTVUxUUyk7CisKKyAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBtQ3VycmVudFJlc3VsdC5nZXRCdW5kbGUoKTsKKyAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoInRlc3RJbmRleCIsIG1DdXJyZW50VGVzdEluZGV4KTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFRlc3RUaW1lZE91dCkgeworICAgICAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoInJlc3VsdENvZGUiLCBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLkZBSUxfVElNRURfT1VULm5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1UZXN0c0xpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZygibmV4dFRlc3QiLCBtVGVzdHNMaXN0LmdldCgwKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlcnZpY2VNc2cuc2V0RGF0YShidW5kbGUpOworICAgICAgICAgICAgbU1hbmFnZXJTZXJ2aWNlTWVzc2VuZ2VyLnNlbmQoc2VydmljZU1zZyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAibUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoPSIgKyBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGgsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVByb2dyZXNzQmFyKCkgeworICAgICAgICBnZXRXaW5kb3coKS5zZXRGZWF0dXJlSW50KFdpbmRvdy5GRUFUVVJFX1BST0dSRVNTLAorICAgICAgICAgICAgICAgIG1DdXJyZW50VGVzdEluZGV4ICogV2luZG93LlBST0dSRVNTX0VORCAvIG1Ub3RhbFRlc3RDb3VudCk7CisgICAgICAgIHNldFRpdGxlKG1DdXJyZW50VGVzdEluZGV4ICogMTAwIC8gbVRvdGFsVGVzdENvdW50ICsgIiUgIiArCisgICAgICAgICAgICAgICAgIigiICsgbUN1cnJlbnRUZXN0SW5kZXggKyAiLyIgKyBtVG90YWxUZXN0Q291bnQgKyAiKSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkFsbFRlc3RzRmluaXNoZWQoKSB7CisgICAgICAgIG1TY3JlZW5EaW1Mb2NrLnJlbGVhc2UoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWVzc2FnZSBzZXJ2aWNlTXNnID0KKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obnVsbCwgTWFuYWdlclNlcnZpY2UuTVNHX0FMTF9URVNUU19GSU5JU0hFRCk7CisgICAgICAgICAgICBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXIuc2VuZChzZXJ2aWNlTXNnKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGg9IiArIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCwgZSk7CisgICAgICAgIH0KKworICAgICAgICB1bmJpbmRTZXJ2aWNlKG1TZXJ2aWNlQ29ubmVjdGlvbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBBZGRpdGlvbmFsVGV4dE91dHB1dCBnZXRDdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQoKSB7CisgICAgICAgIGlmIChtQ3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0ID09IG51bGwpIHsKKyAgICAgICAgICAgIG1DdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQgPSBuZXcgQWRkaXRpb25hbFRleHRPdXRwdXQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dDsKKyAgICB9CisKKyAgICAvKiogTEFZT1VUIFRFU1QgQ09OVFJPTExFUiAqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19XQUlUX1VOVElMX0RPTkUgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTk9USUZZX0RPTkUgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRFVNUF9BU19URVhUID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RVTVBfQ0hJTERfRlJBTUVTX0FTX1RFWFQgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0VUX0NBTl9PUEVOX1dJTkRPV1MgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRFVNUF9EQVRBQkFTRV9DQUxMQkFDS1MgPSA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0VUX0dFT0xPQ0FUSU9OX1BFUk1JU1NJT04gPSA2OworCisgICAgSGFuZGxlciBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBhc3NlcnQgbUN1cnJlbnRTdGF0ZS5pc1J1bm5pbmdTdGF0ZSgpIDogIm1DdXJyZW50U3RhdGUgPSAiICsgbUN1cnJlbnRTdGF0ZS5uYW1lKCk7CisKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19XQUlUX1VOVElMX0RPTkU6CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBDdXJyZW50U3RhdGUuV0FJVElOR19GT1JfQVNZTkNIUk9OT1VTX1RFU1Q7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfTk9USUZZX0RPTkU6CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFN0YXRlID09IEN1cnJlbnRTdGF0ZS5XQUlUSU5HX0ZPUl9BU1lOQ0hST05PVVNfVEVTVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb25UZXN0RmluaXNoZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RVTVBfQVNfVEVYVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50UmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UmVzdWx0ID0gbmV3IFRleHRSZXN1bHQobUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBtQ3VycmVudFJlc3VsdCBpbnN0YW5jZW9mIFRleHRSZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJtQ3VycmVudFJlc3VsdCBpbnN0YW5jZW9mIiArIG1DdXJyZW50UmVzdWx0LmdldENsYXNzKCkuZ2V0TmFtZSgpOworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfRFVNUF9DSElMRF9GUkFNRVNfQVNfVEVYVDoKKyAgICAgICAgICAgICAgICAgICAgLyoqIElmIGR1bXBBc1RleHQgd2FzIG5vdCBjYWxsZWQgd2UgYXNzdW1lIHRoYXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGV4dCAqLworICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRSZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRSZXN1bHQgPSBuZXcgVGV4dFJlc3VsdChtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG1DdXJyZW50UmVzdWx0IGluc3RhbmNlb2YgVGV4dFJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIm1DdXJyZW50UmVzdWx0IGluc3RhbmNlb2YiICsgbUN1cnJlbnRSZXN1bHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgKChUZXh0UmVzdWx0KW1DdXJyZW50UmVzdWx0KS5zZXREdW1wQ2hpbGRGcmFtZXNBc1RleHQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfU0VUX0NBTl9PUEVOX1dJTkRPV1M6CisgICAgICAgICAgICAgICAgICAgIG1DYW5PcGVuV2luZG93cyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfRFVNUF9EQVRBQkFTRV9DQUxMQkFDS1M6CisgICAgICAgICAgICAgICAgICAgIG1EdW1wRGF0YWJhc2VDYWxsYmFja3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NFVF9HRU9MT0NBVElPTl9QRVJNSVNTSU9OOgorICAgICAgICAgICAgICAgICAgICBtSXNHZW9sb2NhdGlvblBlcm1pc3Npb25TZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtR2VvbG9jYXRpb25QZXJtaXNzaW9uID0gbXNnLmFyZzEgPT0gMTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8R2VvbG9jYXRpb25QZXJtaXNzaW9ucy5DYWxsYmFjaz4gaXRlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrIGNhbGxiYWNrID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9yaWdpbiA9IG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzLmdldChjYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suaW52b2tlKG9yaWdpbiwgbUdlb2xvY2F0aW9uUGVybWlzc2lvbiwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogIm1zZy53aGF0PSIgKyBtc2cud2hhdDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0TGF5b3V0VGVzdENvbnRyb2xsZXIoKSB7CisgICAgICAgIG1DYW5PcGVuV2luZG93cyA9IGZhbHNlOworICAgICAgICBtRHVtcERhdGFiYXNlQ2FsbGJhY2tzID0gZmFsc2U7CisgICAgICAgIG1Jc0dlb2xvY2F0aW9uUGVybWlzc2lvblNldCA9IGZhbHNlOworICAgICAgICBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2FpdFVudGlsRG9uZSgpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsgIjogd2FpdFVudGlsRG9uZSgpIGNhbGxlZCIpOworICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1dBSVRfVU5USUxfRE9ORSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RG9uZSgpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsgIjogbm90aWZ5RG9uZSgpIGNhbGxlZCIpOworICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX05PVElGWV9ET05FKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wQXNUZXh0KGJvb2xlYW4gZW5hYmxlUGl4ZWxUZXN0KSB7CisgICAgICAgIExvZy5pKExPR19UQUcsIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCArICI6IGR1bXBBc1RleHQoIiArIGVuYWJsZVBpeGVsVGVzdCArICIpIGNhbGxlZCIpOworICAgICAgICAvKiogVE9ETzogSW1wbGVtZW50ICovCisgICAgICAgIGlmIChlbmFibGVQaXhlbFRlc3QpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJlbmFibGVQaXhlbFRlc3Qgbm90IGltcGxlbWVudGVkLCBzd2l0Y2hpbmcgdG8gZmFsc2UiKTsKKyAgICAgICAgfQorICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0RVTVBfQVNfVEVYVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcENoaWxkRnJhbWVzQXNUZXh0KCkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiOiBkdW1wQ2hpbGRGcmFtZXNBc1RleHQoKSBjYWxsZWQiKTsKKyAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19EVU1QX0NISUxEX0ZSQU1FU19BU19URVhUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDYW5PcGVuV2luZG93cygpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsgIjogc2V0Q2FuT3BlbldpbmRvd3MoKSBjYWxsZWQiKTsKKyAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19TRVRfQ0FOX09QRU5fV0lORE9XUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcERhdGFiYXNlQ2FsbGJhY2tzKCkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiOiBkdW1wRGF0YWJhc2VDYWxsYmFja3MoKSBjYWxsZWQiKTsKKyAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19EVU1QX0RBVEFCQVNFX0NBTExCQUNLUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R2VvbG9jYXRpb25QZXJtaXNzaW9uKGJvb2xlYW4gYWxsb3cpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsgIjogc2V0R2VvbG9jYXRpb25QZXJtaXNzaW9uKCIgKyBhbGxvdyArCisgICAgICAgICAgICAgICAgIikgY2FsbGVkIik7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19TRVRfR0VPTE9DQVRJT05fUEVSTUlTU0lPTik7CisgICAgICAgIG1zZy5hcmcxID0gYWxsb3cgPyAxIDogMDsKKyAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsgIjogc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKCIgKyBjYW5Qcm92aWRlQWxwaGEgKworICAgICAgICAgICAgICAgICIsICIgKyBhbHBoYSArICIsICIgKyBjYW5Qcm92aWRlQmV0YSArICIsICIgKyBiZXRhICsgIiwgIiArIGNhblByb3ZpZGVHYW1tYSArCisgICAgICAgICAgICAgICAgIiwgIiArIGdhbW1hICsgIikiKTsKKyAgICAgICAgbUN1cnJlbnRXZWJWaWV3LnNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihjYW5Qcm92aWRlQWxwaGEsIGFscGhhLCBjYW5Qcm92aWRlQmV0YSwgYmV0YSwKKyAgICAgICAgICAgICAgICBjYW5Qcm92aWRlR2FtbWEsIGdhbW1hKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTWFuYWdlclNlcnZpY2UuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL01hbmFnZXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxMTI2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL01hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2VuZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBIHNlcnZpY2UgdGhhdCBoYW5kbGVzIG1hbmFnaW5nIHRoZSByZXN1bHRzIG9mIHRlc3RzLCBpbmZvcm1pbmcgb2YgY3Jhc2hlcywgZ2VuZXJhdGluZworICogc3VtbWFyaWVzLCBldGMuCisgKi8KK3B1YmxpYyBjbGFzcyBNYW5hZ2VyU2VydmljZSBleHRlbmRzIFNlcnZpY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiTWFuYWdlclNlcnZpY2UiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19URVNUX0NSQVNIRUQgPSAwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENSQVNIX1RJTUVPVVRfTVMgPSAyMCAqIDEwMDA7CisKKyAgICAvKiogVE9ETzogbWFrZSBpdCBhIHNldHRpbmcgKi8KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RTX1JPT1RfRElSX1BBVEggPQorICAgICAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkgKworICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IgKyAiYW5kcm9pZCIgKworICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IgKyAiTGF5b3V0VGVzdHMiOworCisgICAgLyoqIFRPRE86IG1ha2UgaXQgYSBzZXR0aW5nICovCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRTX1JPT1RfRElSX1BBVEggPQorICAgICAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkgKworICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IgKyAiYW5kcm9pZCIgKworICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IgKyAiTGF5b3V0VGVzdHMtcmVzdWx0cyI7CisKKyAgICAvKiogVE9ETzogTWFrZSBpdCBhIHNldHRpbmcgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gRVhQRUNURURfUkVTVUxUX0xPQ0FUSU9OX1JFTEFUSVZFX0RJUl9QUkVGSVhFUyA9CisgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMyk7CisgICAgeworICAgICAgICBFWFBFQ1RFRF9SRVNVTFRfTE9DQVRJT05fUkVMQVRJVkVfRElSX1BSRUZJWEVTLmFkZCgicGxhdGZvcm0iICsgRmlsZS5zZXBhcmF0b3IgKworICAgICAgICAgICAgICAgICJhbmRyb2lkLXY4IiArIEZpbGUuc2VwYXJhdG9yKTsKKyAgICAgICAgRVhQRUNURURfUkVTVUxUX0xPQ0FUSU9OX1JFTEFUSVZFX0RJUl9QUkVGSVhFUy5hZGQoInBsYXRmb3JtIiArIEZpbGUuc2VwYXJhdG9yICsKKyAgICAgICAgICAgICAgICAiYW5kcm9pZCIgKyBGaWxlLnNlcGFyYXRvcik7CisgICAgICAgIEVYUEVDVEVEX1JFU1VMVF9MT0NBVElPTl9SRUxBVElWRV9ESVJfUFJFRklYRVMuYWRkKCIiKTsKKyAgICB9CisKKyAgICAvKiogVE9ETzogTWFrZSB0aGVzZSBzZXR0aW5ncyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JFU1VMVF9FWFRFTlNJT04gPSAidHh0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfUkVTVUxUX0VYVEVOU0lPTiA9ICJwbmciOworCisgICAgc3RhdGljIGZpbmFsIGludCBNU0dfUFJPQ0VTU19BQ1RVQUxfUkVTVUxUUyA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBNU0dfQUxMX1RFU1RTX0ZJTklTSEVEID0gMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IE1TR19GSVJTVF9URVNUID0gMjsKKworICAgIC8qKgorICAgICAqIFRoaXMgaGFuZGxlciBpcyBwdXJlbHkgZm9yIElQQy4gSXQgaXMgdXNlZCB0byBjcmVhdGUgbU1lc3NlbmdlcgorICAgICAqIHRoYXQgZ2VuZXJhdGVzIGEgYmluZGVyIHJldHVybmVkIGluIG9uQmluZCBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBIYW5kbGVyIG1JbmNvbWluZ0hhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19GSVJTVF9URVNUOgorICAgICAgICAgICAgICAgICAgICBtU3VtbWFyaXplci5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbXNnLmdldERhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgZW5zdXJlTmV4dFRlc3RTZXR1cChidW5kbGUuZ2V0U3RyaW5nKCJmaXJzdFRlc3QiKSwgYnVuZGxlLmdldEludCgiaW5kZXgiKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUFJPQ0VTU19BQ1RVQUxfUkVTVUxUUzoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywibUluY29taW5nSGFuZGxlcjogIiArIG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJyZWxhdGl2ZVBhdGgiKSk7CisgICAgICAgICAgICAgICAgICAgIG9uQWN0dWFsUmVzdWx0c09idGFpbmVkKG1zZy5nZXREYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0FMTF9URVNUU19GSU5JU0hFRDoKKyAgICAgICAgICAgICAgICAgICAgbVN1bW1hcml6ZXIuc2V0VGVzdHNSZWxhdGl2ZVBhdGgobUFsbFRlc3RzUmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgbVN1bW1hcml6ZXIuc3VtbWFyaXplKCk7CisgICAgICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1hbmFnZXJTZXJ2aWNlLnRoaXMsIFRlc3RzTGlzdEFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX1NIVVRET1dOKTsKKyAgICAgICAgICAgICAgICAgICAgLyoqIFRoaXMgZmxhZyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBzZW5kIHRoZSBpbnRlbnQgZnJvbSB0aGUgc2VydmljZSAqLworICAgICAgICAgICAgICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgTWVzc2VuZ2VyIG1NZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKG1JbmNvbWluZ0hhbmRsZXIpOworCisgICAgcHJpdmF0ZSBIYW5kbGVyIG1DcmFzaE1lc3NhZ2VzSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IE1TR19URVNUX0NSQVNIRUQpIHsKKyAgICAgICAgICAgICAgICBvblRlc3RDcmFzaGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBGaWxlRmlsdGVyIG1GaWxlRmlsdGVyOworICAgIHByaXZhdGUgU3VtbWFyaXplciBtU3VtbWFyaXplcjsKKworICAgIHByaXZhdGUgU3RyaW5nIG1DdXJyZW50bHlSdW5uaW5nVGVzdDsKKyAgICBwcml2YXRlIGludCBtQ3VycmVudGx5UnVubmluZ1Rlc3RJbmRleDsKKworICAgIHByaXZhdGUgU3RyaW5nIG1BbGxUZXN0c1JlbGF0aXZlUGF0aDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZSgpOworCisgICAgICAgIG1GaWxlRmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoVEVTVFNfUk9PVF9ESVJfUEFUSCk7CisgICAgICAgIG1TdW1tYXJpemVyID0gbmV3IFN1bW1hcml6ZXIobUZpbGVGaWx0ZXIsIFJFU1VMVFNfUk9PVF9ESVJfUEFUSCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBvblN0YXJ0Q29tbWFuZChJbnRlbnQgaW50ZW50LCBpbnQgZmxhZ3MsIGludCBzdGFydElkKSB7CisgICAgICAgIG1BbGxUZXN0c1JlbGF0aXZlUGF0aCA9IGludGVudC5nZXRTdHJpbmdFeHRyYSgicGF0aCIpOworICAgICAgICBhc3NlcnQgbUFsbFRlc3RzUmVsYXRpdmVQYXRoICE9IG51bGw7CisgICAgICAgIHJldHVybiBTVEFSVF9TVElDS1k7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgcmV0dXJuIG1NZXNzZW5nZXIuZ2V0QmluZGVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uQWN0dWFsUmVzdWx0c09idGFpbmVkKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgbUNyYXNoTWVzc2FnZXNIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19URVNUX0NSQVNIRUQpOworICAgICAgICBlbnN1cmVOZXh0VGVzdFNldHVwKGJ1bmRsZS5nZXRTdHJpbmcoIm5leHRUZXN0IiksIGJ1bmRsZS5nZXRJbnQoInRlc3RJbmRleCIpICsgMSk7CisKKyAgICAgICAgQWJzdHJhY3RSZXN1bHQgcmVzdWx0cyA9CisgICAgICAgICAgICAgICAgQWJzdHJhY3RSZXN1bHQuVGVzdFR5cGUudmFsdWVPZihidW5kbGUuZ2V0U3RyaW5nKCJ0eXBlIikpLmNyZWF0ZVJlc3VsdChidW5kbGUpOworCisgICAgICAgIExvZy5pKExPR19UQUcsICJvbkFjdHVhbFJlc3VsdE9idGFpbmVkOiAiICsgcmVzdWx0cy5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgIGhhbmRsZVJlc3VsdHMocmVzdWx0cyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZU5leHRUZXN0U2V0dXAoU3RyaW5nIG5leHRUZXN0LCBpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKG5leHRUZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJlbnN1cmVOZXh0VGVzdFNldHVwKCk6IG5leHRUZXN0PW51bGwiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1DdXJyZW50bHlSdW5uaW5nVGVzdCA9IG5leHRUZXN0OworICAgICAgICBtQ3VycmVudGx5UnVubmluZ1Rlc3RJbmRleCA9IGluZGV4OworICAgICAgICBtQ3Jhc2hNZXNzYWdlc0hhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoTVNHX1RFU1RfQ1JBU0hFRCwgQ1JBU0hfVElNRU9VVF9NUyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBzZW5kcyBhbiBpbnRlbnQgdG8gVGVzdHNMaXN0QWN0aXZpdHkgdG8gcmVzdGFydCBMYXlvdXRUZXN0c0V4ZWN1dG9yLgorICAgICAqIFRoZSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBmbG93IGlzIGluIHRoZSBjb21tZW50IG9mIG9uTmV3SW50ZW50CisgICAgICogbWV0aG9kIGluIFRlc3RzTGlzdEFjdGl2aXR5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBvblRlc3RDcmFzaGVkKCkgeworICAgICAgICBoYW5kbGVSZXN1bHRzKG5ldyBDcmFzaGVkRHVtbXlSZXN1bHQobUN1cnJlbnRseVJ1bm5pbmdUZXN0KSk7CisKKyAgICAgICAgTG9nLncoTE9HX1RBRywgIm9uVGVzdENyYXNoZWQoKTogIiArIG1DdXJyZW50bHlSdW5uaW5nVGVzdCArCisgICAgICAgICAgICAgICAgIiAoIiArIG1DdXJyZW50bHlSdW5uaW5nVGVzdEluZGV4ICsgIikiKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBUZXN0c0xpc3RBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9SRUJPT1QpOworICAgICAgICAvKiogVGhpcyBmbGFnIGlzIG5lZWRlZCBiZWNhdXNlIHdlIHNlbmQgdGhlIGludGVudCBmcm9tIHRoZSBzZXJ2aWNlICovCisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYSgiY3Jhc2hlZFRlc3RJbmRleCIsIG1DdXJyZW50bHlSdW5uaW5nVGVzdEluZGV4KTsKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSZXN1bHRzKEFic3RyYWN0UmVzdWx0IHJlc3VsdHMpIHsKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IHJlc3VsdHMuZ2V0UmVsYXRpdmVQYXRoKCk7CisgICAgICAgIHJlc3VsdHMuc2V0RXhwZWN0ZWRUZXh0UmVzdWx0KGdldEV4cGVjdGVkVGV4dFJlc3VsdChyZWxhdGl2ZVBhdGgpKTsKKyAgICAgICAgcmVzdWx0cy5zZXRFeHBlY3RlZEltYWdlUmVzdWx0KGdldEV4cGVjdGVkSW1hZ2VSZXN1bHQocmVsYXRpdmVQYXRoKSk7CisKKyAgICAgICAgZHVtcEFjdHVhbFRleHRSZXN1bHQocmVzdWx0cyk7CisgICAgICAgIGR1bXBBY3R1YWxJbWFnZVJlc3VsdChyZXN1bHRzKTsKKworICAgICAgICBtU3VtbWFyaXplci5hcHBlbmRUZXN0KHJlc3VsdHMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkdW1wQWN0dWFsVGV4dFJlc3VsdChBYnN0cmFjdFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgU3RyaW5nIHRlc3RQYXRoID0gcmVzdWx0LmdldFJlbGF0aXZlUGF0aCgpOworICAgICAgICBTdHJpbmcgYWN0dWFsVGV4dFJlc3VsdCA9IHJlc3VsdC5nZXRBY3R1YWxUZXh0UmVzdWx0KCk7CisgICAgICAgIGlmIChhY3R1YWxUZXh0UmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyByZXN1bHRQYXRoID0gRmlsZUZpbHRlci5zZXRQYXRoRW5kaW5nKHRlc3RQYXRoLCAiLWFjdHVhbC4iICsgVEVYVF9SRVNVTFRfRVhURU5TSU9OKTsKKyAgICAgICAgRnNVdGlscy53cml0ZURhdGFUb1N0b3JhZ2UobmV3IEZpbGUoUkVTVUxUU19ST09UX0RJUl9QQVRILCByZXN1bHRQYXRoKSwKKyAgICAgICAgICAgICAgICBhY3R1YWxUZXh0UmVzdWx0LmdldEJ5dGVzKCksIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZHVtcEFjdHVhbEltYWdlUmVzdWx0KEFic3RyYWN0UmVzdWx0IHJlc3VsdCkgeworICAgICAgICBTdHJpbmcgdGVzdFBhdGggPSByZXN1bHQuZ2V0UmVsYXRpdmVQYXRoKCk7CisgICAgICAgIGJ5dGVbXSBhY3R1YWxJbWFnZVJlc3VsdCA9IHJlc3VsdC5nZXRBY3R1YWxJbWFnZVJlc3VsdCgpOworICAgICAgICBpZiAoYWN0dWFsSW1hZ2VSZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHJlc3VsdFBhdGggPSBGaWxlRmlsdGVyLnNldFBhdGhFbmRpbmcodGVzdFBhdGgsCisgICAgICAgICAgICAgICAgIi1hY3R1YWwuIiArIElNQUdFX1JFU1VMVF9FWFRFTlNJT04pOworICAgICAgICBGc1V0aWxzLndyaXRlRGF0YVRvU3RvcmFnZShuZXcgRmlsZShSRVNVTFRTX1JPT1RfRElSX1BBVEgsIHJlc3VsdFBhdGgpLAorICAgICAgICAgICAgICAgIGFjdHVhbEltYWdlUmVzdWx0LCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXhwZWN0ZWRUZXh0UmVzdWx0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IGdldEV4cGVjdGVkUmVzdWx0KHJlbGF0aXZlUGF0aCwgVEVYVF9SRVNVTFRfRVhURU5TSU9OKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldEV4cGVjdGVkSW1hZ2VSZXN1bHQoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICByZXR1cm4gZ2V0RXhwZWN0ZWRSZXN1bHQocmVsYXRpdmVQYXRoLCBJTUFHRV9SRVNVTFRfRVhURU5TSU9OKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gZ2V0RXhwZWN0ZWRSZXN1bHQoU3RyaW5nIHJlbGF0aXZlUGF0aCwgU3RyaW5nIGV4dGVuc2lvbikgeworICAgICAgICBTdHJpbmcgb3JpZ2luYWxSZWxhdGl2ZVBhdGggPQorICAgICAgICAgICAgICAgIEZpbGVGaWx0ZXIuc2V0UGF0aEVuZGluZyhyZWxhdGl2ZVBhdGgsICItZXhwZWN0ZWQuIiArIGV4dGVuc2lvbik7CisKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbnVsbDsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGxvY2F0aW9ucyA9IEVYUEVDVEVEX1JFU1VMVF9MT0NBVElPTl9SRUxBVElWRV9ESVJfUFJFRklYRVM7CisKKyAgICAgICAgaW50IHNpemUgPSBFWFBFQ1RFRF9SRVNVTFRfTE9DQVRJT05fUkVMQVRJVkVfRElSX1BSRUZJWEVTLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGJ5dGVzID09IG51bGwgJiYgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgcmVsYXRpdmVQYXRoID0gbG9jYXRpb25zLmdldChpKSArIG9yaWdpbmFsUmVsYXRpdmVQYXRoOworICAgICAgICAgICAgYnl0ZXMgPSBGc1V0aWxzLnJlYWREYXRhRnJvbVN0b3JhZ2UobmV3IEZpbGUoVEVTVFNfUk9PVF9ESVJfUEFUSCwgcmVsYXRpdmVQYXRoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYnl0ZXM7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1N1bW1hcml6ZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1N1bW1hcml6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2JjMGIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvU3VtbWFyaXplci5qYXZhCkBAIC0wLDAgKzEsMzkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogQSBjbGFzcyB0aGF0IGNvbGxlY3RzIGluZm9ybWF0aW9uIGFib3V0IHRlc3RzIHRoYXQgcmFuIGFuZCBjYW4gY3JlYXRlIEhUTUwKKyAqIGZpbGVzIHdpdGggc3VtbWFyaWVzIGFuZCBlYXN5IG5hdmlnYXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBTdW1tYXJpemVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlN1bW1hcml6ZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENTUyA9CisgICAgICAgICAgICAiPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPiIgKworICAgICAgICAgICAgIiogeyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LWZhbWlseTogVmVyZGFuYTsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyOiAwOyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW46IDA7IiArCisgICAgICAgICAgICAiICAgICAgIHBhZGRpbmc6IDA7fSIgKworICAgICAgICAgICAgImJvZHkgeyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW46IDEwcHg7fSIgKworICAgICAgICAgICAgImgxIHsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC1zaXplOiAyNHB4OyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW46IDRweCAwIDRweCAwO30iICsKKyAgICAgICAgICAgICJoMiB7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtc2l6ZToxOHB4OyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW46IDIwcHggMCAzcHggMDt9IiArCisgICAgICAgICAgICAiaDMsIGgzIGEgeyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXNpemU6IDE0cHg7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiBibGFjazsiICsKKyAgICAgICAgICAgICIgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7fSIgKworICAgICAgICAgICAgImgzIGEgc3Bhbi5wYXRoIHsiICsKKyAgICAgICAgICAgICIgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7fSIgKworICAgICAgICAgICAgImgzIHNwYW4udHJpIHsiICsKKyAgICAgICAgICAgICIgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOyIgKworICAgICAgICAgICAgIiAgICAgICBmbG9hdDogbGVmdDsiICsKKyAgICAgICAgICAgICIgICAgICAgd2lkdGg6IDIwcHg7fSIgKworICAgICAgICAgICAgImgzIHNwYW4uc3FyIHsiICsKKyAgICAgICAgICAgICIgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogIzhlZTEwMDsiICsKKyAgICAgICAgICAgICIgICAgICAgZmxvYXQ6IGxlZnQ7IiArCisgICAgICAgICAgICAiICAgICAgIHdpZHRoOiAyMHB4O30iICsKKyAgICAgICAgICAgICJoMyBpbWcgeyIgKworICAgICAgICAgICAgIiAgICAgICB3aWR0aDogOHB4OyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDt9IiArCisgICAgICAgICAgICAiZGl2LmRpZmYgeyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tYm90dG9tOiAyNXB4O30iICsKKyAgICAgICAgICAgICJkaXYuZGlmZiBhIHsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC1zaXplOiAxMnB4OyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogIzg4ODt9IiArCisgICAgICAgICAgICAidGFibGUudmlzdWFsX2RpZmYgeyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItYm90dG9tOiAwcHggc29saWQ7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IiArCisgICAgICAgICAgICAiICAgICAgIHdpZHRoOiAxMDAlOyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tYm90dG9tOiAycHg7fSIgKworICAgICAgICAgICAgInRhYmxlLnZpc3VhbF9kaWZmIHRyLmhlYWRlcnMgdGQgeyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQ7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci10b3A6IDA7IiArCisgICAgICAgICAgICAiICAgICAgIHBhZGRpbmctYm90dG9tOiAzcHg7fSIgKworICAgICAgICAgICAgInRhYmxlLnZpc3VhbF9kaWZmIHRyLnJlc3VsdHMgdGQgeyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItdG9wOiAxcHggZGFzaGVkOyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZDsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC1zaXplOiAxNXB4OyIgKworICAgICAgICAgICAgIiAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO30iICsKKyAgICAgICAgICAgICJ0YWJsZS52aXN1YWxfZGlmZiB0ci5yZXN1bHRzIHRkLmxpbmVfY291bnQgeyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNhYWE7IiArCisgICAgICAgICAgICAiICAgICAgIG1pbi13aWR0aDoyMHB4OyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LWFsaWduOiByaWdodDsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQ7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQ7IiArCisgICAgICAgICAgICAiICAgICAgIHBhZGRpbmc6IDJweCAxcHggMnB4IDBweDt9IiArCisgICAgICAgICAgICAidGFibGUudmlzdWFsX2RpZmYgdHIucmVzdWx0cyB0ZC5saW5lIHsiICsKKyAgICAgICAgICAgICIgICAgICAgcGFkZGluZzogMnB4IDBweCAycHggNHB4OyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZDsiICsKKyAgICAgICAgICAgICIgICAgICAgd2lkdGg6IDQ5LjglO30iICsKKyAgICAgICAgICAgICJ0YWJsZS52aXN1YWxfZGlmZiB0ci5mb290ZXJzIHRkIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkOyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItYm90dG9tOiAwO30iICsKKyAgICAgICAgICAgICJ0YWJsZS52aXN1YWxfZGlmZiB0ciB0ZC5zcGFjZSB7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlcjogMDsiICsKKyAgICAgICAgICAgICIgICAgICAgd2lkdGg6IDAuNCV9IiArCisgICAgICAgICAgICAiZGl2LnNwYWNlIHsiICsKKyAgICAgICAgICAgICIgICAgICAgbWFyZ2luLXRvcDo0cHg7fSIgKworICAgICAgICAgICAgInNwYW4uZXFsIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YzZjNmMzt9IiArCisgICAgICAgICAgICAic3Bhbi5kZWwgeyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY4ODg4OyB9IiArCisgICAgICAgICAgICAic3Bhbi5pbnMgeyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODhmZjg4OyB9IiArCisgICAgICAgICAgICAic3Bhbi5mYWlsIHsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IHJlZDt9IiArCisgICAgICAgICAgICAic3Bhbi5wYXNzIHsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IGdyZWVuO30iICsKKyAgICAgICAgICAgICJzcGFuLnRpbWVfb3V0IHsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IG9yYW5nZTt9IiArCisgICAgICAgICAgICAidGFibGUuc3VtbWFyeSB7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tdG9wOiAyMHB4O30iICsKKyAgICAgICAgICAgICJ0YWJsZS5zdW1tYXJ5IHRkIHsiICsKKyAgICAgICAgICAgICIgICAgICAgcGFkZGluZzogM3B4O30iICsKKyAgICAgICAgICAgICJzcGFuLmxpc3RJdGVtIHsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC1zaXplOiAxMXB4OyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXdlaWdodDogbm9ybWFsOyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyIgKworICAgICAgICAgICAgIiAgICAgICBwYWRkaW5nOiAzcHg7IiArCisgICAgICAgICAgICAiICAgICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4O30iICsKKyAgICAgICAgICAgICJzcGFuLiIgKyBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLlBBU1MubmFtZSgpICsgInsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzhlZTEwMDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IGJsYWNrO30iICsKKyAgICAgICAgICAgICJzcGFuLiIgKyBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLkZBSUxfUkVTVUxUX0RJRkZFUlMubmFtZSgpICsgInsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IGJsYWNrO30iICsKKyAgICAgICAgICAgICJzcGFuLiIgKyBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLkZBSUxfTk9fRVhQRUNURURfUkVTVUxULm5hbWUoKSArICJ7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNhNzAwZTQ7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiAjZmZmO30iICsKKyAgICAgICAgICAgICJzcGFuLiIgKyBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLkZBSUxfVElNRURfT1VULm5hbWUoKSArICJ7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2NiMDA7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiBibGFjazt9IiArCisgICAgICAgICAgICAic3Bhbi4iICsgQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5GQUlMX0NSQVNIRUQubmFtZSgpICsgInsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2MzMDAwMDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6ICNmZmY7fSIgKworICAgICAgICAgICAgInNwYW4ubm9MdGMgeyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTQ0MDAwOyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogI2ZmZjt9IiArCisgICAgICAgICAgICAic3Bhbi5ub0V2ZW50U2VuZGVyIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzgxNTYwMDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6ICNmZmY7fSIgKworICAgICAgICAgICAgIjwvc3R5bGU+IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFQgPQorICAgICAgICAgICAgIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiPiIgKworICAgICAgICAgICAgIiAgICBmdW5jdGlvbiB0b2dnbGVEaXNwbGF5KGlkKSB7IiArCisgICAgICAgICAgICAiICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOyIgKworICAgICAgICAgICAgIiAgICAgICAgdHJpYW5nbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHJpLicgKyBpZCk7IiArCisgICAgICAgICAgICAiICAgICAgICBpZiAoZWxlbWVudC5zdHlsZS5kaXNwbGF5ID09ICdub25lJykgeyIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnOyIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIHRyaWFuZ2xlLmlubmVySFRNTCA9ICcmI3gyNWJjOyAnOyIgKworICAgICAgICAgICAgIiAgICAgICAgfSBlbHNlIHsiICsKKyAgICAgICAgICAgICIgICAgICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgdHJpYW5nbGUuaW5uZXJIVE1MID0gJyYjeDI1YjY7ICc7IiArCisgICAgICAgICAgICAiICAgICAgICB9IiArCisgICAgICAgICAgICAiICAgIH0iICsKKyAgICAgICAgICAgICI8L3NjcmlwdD4iOworCisgICAgLyoqIFRPRE86IE1ha2UgaXQgYSBzZXR0aW5nICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfREVUQUlMU19SRUxBVElWRV9QQVRIID0gImRldGFpbHMuaHRtbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRYVF9TVU1NQVJZX1JFTEFUSVZFX1BBVEggPSAic3VtbWFyeS50eHQiOworCisgICAgcHJpdmF0ZSBpbnQgbUNyYXNoZWRUZXN0c0NvdW50ID0gMDsKKyAgICBwcml2YXRlIExpc3Q8QWJzdHJhY3RSZXN1bHQ+IG1GYWlsZWROb3RJZ25vcmVkVGVzdHMgPSBuZXcgQXJyYXlMaXN0PEFic3RyYWN0UmVzdWx0PigpOworICAgIHByaXZhdGUgTGlzdDxBYnN0cmFjdFJlc3VsdD4gbUlnbm9yZWRUZXN0cyA9IG5ldyBBcnJheUxpc3Q8QWJzdHJhY3RSZXN1bHQ+KCk7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVBhc3NlZE5vdElnbm9yZWRUZXN0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisgICAgcHJpdmF0ZSBGaWxlRmlsdGVyIG1GaWxlRmlsdGVyOworICAgIHByaXZhdGUgU3RyaW5nIG1SZXN1bHRzUm9vdERpclBhdGg7CisKKyAgICBwcml2YXRlIFN0cmluZyBtVGVzdHNSZWxhdGl2ZVBhdGg7CisKKyAgICBwcml2YXRlIERhdGUgbURhdGU7CisKKyAgICBwdWJsaWMgU3VtbWFyaXplcihGaWxlRmlsdGVyIGZpbGVGaWx0ZXIsIFN0cmluZyByZXN1bHRzUm9vdERpclBhdGgpIHsKKyAgICAgICAgbUZpbGVGaWx0ZXIgPSBmaWxlRmlsdGVyOworICAgICAgICBtUmVzdWx0c1Jvb3REaXJQYXRoID0gcmVzdWx0c1Jvb3REaXJQYXRoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRlc3QoQWJzdHJhY3RSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgIFN0cmluZyByZWxhdGl2ZVBhdGggPSByZXN1bHQuZ2V0UmVsYXRpdmVQYXRoKCk7CisKKyAgICAgICAgaWYgKHJlc3VsdC5nZXRSZXN1bHRDb2RlKCkgPT0gQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5GQUlMX0NSQVNIRUQpIHsKKyAgICAgICAgICAgIG1DcmFzaGVkVGVzdHNDb3VudCsrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1GaWxlRmlsdGVyLmlzSWdub3JlUmVzKHJlbGF0aXZlUGF0aCkpIHsKKyAgICAgICAgICAgIG1JZ25vcmVkVGVzdHMuYWRkKHJlc3VsdCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmdldFJlc3VsdENvZGUoKSA9PSBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLlBBU1MpIHsKKyAgICAgICAgICAgIG1QYXNzZWROb3RJZ25vcmVkVGVzdHMuYWRkKHJlbGF0aXZlUGF0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRmFpbGVkTm90SWdub3JlZFRlc3RzLmFkZChyZXN1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGVzdHNSZWxhdGl2ZVBhdGgoU3RyaW5nIHRlc3RzUmVsYXRpdmVQYXRoKSB7CisgICAgICAgIG1UZXN0c1JlbGF0aXZlUGF0aCA9IHRlc3RzUmVsYXRpdmVQYXRoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN1bW1hcml6ZSgpIHsKKyAgICAgICAgY3JlYXRlSHRtbERldGFpbHMoKTsKKyAgICAgICAgY3JlYXRlVHh0U3VtbWFyeSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBtQ3Jhc2hlZFRlc3RzQ291bnQgPSAwOworICAgICAgICBtRmFpbGVkTm90SWdub3JlZFRlc3RzLmNsZWFyKCk7CisgICAgICAgIG1JZ25vcmVkVGVzdHMuY2xlYXIoKTsKKyAgICAgICAgbVBhc3NlZE5vdElnbm9yZWRUZXN0cy5jbGVhcigpOworICAgICAgICBtRGF0ZSA9IG5ldyBEYXRlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVR4dFN1bW1hcnkoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgdHh0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS9NTS9kZCBISDptbTpzcyIpOworICAgICAgICB0eHQuYXBwZW5kKG1UZXN0c1JlbGF0aXZlUGF0aCArICJcbiIpOworICAgICAgICB0eHQuYXBwZW5kKCJEYXRlOiAiICsgZGF0ZUZvcm1hdC5mb3JtYXQobURhdGUpICsgIlxuIik7CisgICAgICAgIHR4dC5hcHBlbmQoIkJ1aWxkIGZpbmdlcnByaW50OiAiICsgQnVpbGQuRklOR0VSUFJJTlQgKyAiXG4iKTsKKyAgICAgICAgdHh0LmFwcGVuZCgiV2ViS2l0IHZlcnNpb246ICIgKyBnZXRXZWJLaXRWZXJzaW9uRnJvbVVzZXJBZ2VudFN0cmluZygpICsgIlxuIik7CisKKyAgICAgICAgdHh0LmFwcGVuZCgiVE9UQUw6ICAgIiArIGdldFRvdGFsVGVzdENvdW50KCkgKyAiXG4iKTsKKyAgICAgICAgaWYgKG1DcmFzaGVkVGVzdHNDb3VudCA+IDApIHsKKyAgICAgICAgICAgIHR4dC5hcHBlbmQoIkNSQVNIRUQgKHRvdGFsIGFtb25nIGFsbCB0ZXN0cyk6ICIgKyBtQ3Jhc2hlZFRlc3RzQ291bnQgKyAiXG4iKTsKKyAgICAgICAgICAgIHR4dC5hcHBlbmQoIi0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgfQorICAgICAgICB0eHQuYXBwZW5kKCJGQUlMRUQ6ICAiICsgbUZhaWxlZE5vdElnbm9yZWRUZXN0cy5zaXplKCkgKyAiXG4iKTsKKyAgICAgICAgdHh0LmFwcGVuZCgiSUdOT1JFRDogIiArIG1JZ25vcmVkVGVzdHMuc2l6ZSgpICsgIlxuIik7CisgICAgICAgIHR4dC5hcHBlbmQoIlBBU1NFRDogICIgKyBtUGFzc2VkTm90SWdub3JlZFRlc3RzLnNpemUoKSArICJcbiIpOworCisgICAgICAgIEZzVXRpbHMud3JpdGVEYXRhVG9TdG9yYWdlKG5ldyBGaWxlKG1SZXN1bHRzUm9vdERpclBhdGgsIFRYVF9TVU1NQVJZX1JFTEFUSVZFX1BBVEgpLAorICAgICAgICAgICAgICAgIHR4dC50b1N0cmluZygpLmdldEJ5dGVzKCksIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlSHRtbERldGFpbHMoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgaHRtbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgaHRtbC5hcHBlbmQoIjxodG1sPjxoZWFkPiIpOworICAgICAgICBodG1sLmFwcGVuZChDU1MpOworICAgICAgICBodG1sLmFwcGVuZChTQ1JJUFQpOworICAgICAgICBodG1sLmFwcGVuZCgiPC9oZWFkPjxib2R5PiIpOworCisgICAgICAgIGNyZWF0ZVRvcFN1bW1hcnlUYWJsZShodG1sKTsKKworICAgICAgICBjcmVhdGVSZXN1bHRzTGlzdFdpdGhEaWZmKGh0bWwsICJGYWlsZWQiLCBtRmFpbGVkTm90SWdub3JlZFRlc3RzKTsKKworICAgICAgICBjcmVhdGVSZXN1bHRzTGlzdFdpdGhEaWZmKGh0bWwsICJJZ25vcmVkIiwgbUlnbm9yZWRUZXN0cyk7CisKKyAgICAgICAgY3JlYXRlUmVzdWx0c0xpc3ROb0RpZmYoaHRtbCwgIlBhc3NlZCIsIG1QYXNzZWROb3RJZ25vcmVkVGVzdHMpOworCisgICAgICAgIGh0bWwuYXBwZW5kKCI8L2JvZHk+PC9odG1sPiIpOworCisgICAgICAgIEZzVXRpbHMud3JpdGVEYXRhVG9TdG9yYWdlKG5ldyBGaWxlKG1SZXN1bHRzUm9vdERpclBhdGgsIEhUTUxfREVUQUlMU19SRUxBVElWRV9QQVRIKSwKKyAgICAgICAgICAgICAgICBodG1sLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldFRvdGFsVGVzdENvdW50KCkgeworICAgICAgICByZXR1cm4gbUZhaWxlZE5vdElnbm9yZWRUZXN0cy5zaXplKCkgKworICAgICAgICAgICAgICAgIG1QYXNzZWROb3RJZ25vcmVkVGVzdHMuc2l6ZSgpICsKKyAgICAgICAgICAgICAgICBtSWdub3JlZFRlc3RzLnNpemUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRXZWJLaXRWZXJzaW9uRnJvbVVzZXJBZ2VudFN0cmluZygpIHsKKyAgICAgICAgUmVzb3VyY2VzIHJlc291cmNlcyA9IG5ldyBSZXNvdXJjZXMobmV3IEFzc2V0TWFuYWdlcigpLCBuZXcgRGlzcGxheU1ldHJpY3MoKSwKKyAgICAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpKTsKKyAgICAgICAgU3RyaW5nIHVzZXJBZ2VudCA9CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy53ZWJfdXNlcl9hZ2VudCk7CisKKyAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gUGF0dGVybi5jb21waWxlKCJBcHBsZVdlYktpdC8oWzAtOV0rP1xcLlswLTldKSIpLm1hdGNoZXIodXNlckFnZW50KTsKKyAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hlci5ncm91cCgxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gInVua25vd24iOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUb3BTdW1tYXJ5VGFibGUoU3RyaW5nQnVpbGRlciBodG1sKSB7CisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5L01NL2RkIEhIOm1tOnNzIik7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8aDE+IiArIG1UZXN0c1JlbGF0aXZlUGF0aCArICI8L2gxPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiPGgzPiIgKyAiRGF0ZTogIiArIGRhdGVGb3JtYXQuZm9ybWF0KG5ldyBEYXRlKCkpICsgIjwvaDM+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8aDM+IiArICJCdWlsZCBmaW5nZXJwcmludDogIiArIEJ1aWxkLkZJTkdFUlBSSU5UICsgIjwvaDM+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8aDM+IiArICJXZWJLaXQgdmVyc2lvbjogIiArIGdldFdlYktpdFZlcnNpb25Gcm9tVXNlckFnZW50U3RyaW5nKCkgKyAiPC9oMz4iKTsKKworICAgICAgICBodG1sLmFwcGVuZCgiPHRhYmxlIGNsYXNzPVwic3VtbWFyeVwiPiIpOworICAgICAgICBjcmVhdGVTdW1tYXJ5VGFibGVSb3coaHRtbCwgIlRPVEFMIiwgZ2V0VG90YWxUZXN0Q291bnQoKSk7CisgICAgICAgIGNyZWF0ZVN1bW1hcnlUYWJsZVJvdyhodG1sLCAiQ1JBU0hFRCIsIG1DcmFzaGVkVGVzdHNDb3VudCk7CisgICAgICAgIGNyZWF0ZVN1bW1hcnlUYWJsZVJvdyhodG1sLCAiRkFJTEVEIiwgbUZhaWxlZE5vdElnbm9yZWRUZXN0cy5zaXplKCkpOworICAgICAgICBjcmVhdGVTdW1tYXJ5VGFibGVSb3coaHRtbCwgIklHTk9SRUQiLCBtSWdub3JlZFRlc3RzLnNpemUoKSk7CisgICAgICAgIGNyZWF0ZVN1bW1hcnlUYWJsZVJvdyhodG1sLCAiUEFTU0VEIiwgbVBhc3NlZE5vdElnbm9yZWRUZXN0cy5zaXplKCkpOworICAgICAgICBodG1sLmFwcGVuZCgiPC90YWJsZT4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlU3VtbWFyeVRhYmxlUm93KFN0cmluZ0J1aWxkZXIgaHRtbCwgU3RyaW5nIGNhcHRpb24sIGludCBzaXplKSB7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8dHI+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkPiIgKyBjYXB0aW9uICsgIjwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkPiIgKyBzaXplICsgIjwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8L3RyPiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVSZXN1bHRzTGlzdFdpdGhEaWZmKFN0cmluZ0J1aWxkZXIgaHRtbCwgU3RyaW5nIHRpdGxlLAorICAgICAgICAgICAgTGlzdDxBYnN0cmFjdFJlc3VsdD4gcmVzdWx0c0xpc3QpIHsKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aDsKKyAgICAgICAgU3RyaW5nIGlkID0gIiI7CisgICAgICAgIEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUgcmVzdWx0Q29kZTsKKworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdHNMaXN0KTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjxoMj4iICsgdGl0bGUgKyAiIFsiICsgcmVzdWx0c0xpc3Quc2l6ZSgpICsgIl08L2gyPiIpOworICAgICAgICBmb3IgKEFic3RyYWN0UmVzdWx0IHJlc3VsdCA6IHJlc3VsdHNMaXN0KSB7CisgICAgICAgICAgICByZWxhdGl2ZVBhdGggPSByZXN1bHQuZ2V0UmVsYXRpdmVQYXRoKCk7CisgICAgICAgICAgICByZXN1bHRDb2RlID0gcmVzdWx0LmdldFJlc3VsdENvZGUoKTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxoMz4iKTsKKworICAgICAgICAgICAgaWYgKHJlc3VsdENvZGUgPT0gQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5QQVNTKSB7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxzcGFuIGNsYXNzPVwic3FyXCI+JiN4MjVhMDsgPC9zcGFuPiIpOworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8c3BhbiBjbGFzcz1cInBhdGhcIj4iICsgcmVsYXRpdmVQYXRoICsgIjwvc3Bhbj4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogVGVjaG5pY2FsbHksIHR3byBkaWZmZXJlbnQgcGF0aHMgY291bGQgZW5kIHVwIGJlaW5nIHRoZSBzYW1lLCBiZWNhdXNlCisgICAgICAgICAgICAgICAgICogJzonIGlzIGEgdmFsaWQgIGNoYXJhY3RlciBpbiBhIHBhdGguIEhvd2V2ZXIsIGl0IGlzIHByb2JhYmx5IG5vdCBnb2luZworICAgICAgICAgICAgICAgICAqIHRvIGNhdXNlIGFueSBwcm9ibGVtcyBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZCA9IHJlbGF0aXZlUGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yLCAiOiIpOworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8YSBocmVmPVwiI1wiIG9uQ2xpY2s9XCJ0b2dnbGVEaXNwbGF5KCciICsgaWQgKyAiJyk7Iik7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoInJldHVybiBmYWxzZTtcIj4iKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiPHNwYW4gY2xhc3M9XCJ0cmlcIiBpZD1cInRyaS4iICsgaWQgKyAiXCI+JiN4MjViNjsgPC9zcGFuPiIpOworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8c3BhbiBjbGFzcz1cInBhdGhcIj4iICsgcmVsYXRpdmVQYXRoICsgIjwvc3Bhbj4iKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiPC9hPiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiIDxzcGFuIGNsYXNzPVwibGlzdEl0ZW0gIiArIHJlc3VsdENvZGUubmFtZSgpICsgIlwiPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQocmVzdWx0Q29kZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8L3NwYW4+Iik7CisKKyAgICAgICAgICAgIC8qKiBEZXRlY3QgbWlzc2luZyBMVEMgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgIFN0cmluZyBhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZyA9IHJlc3VsdC5nZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZygpOworICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcuY29udGFpbnMoImNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlIikgJiYKKyAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcuY29udGFpbnMoImhhcyBubyBtZXRob2QiKSkgeworICAgICAgICAgICAgICAgIGlmIChhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZy5jb250YWlucygiTGF5b3V0VGVzdENvbnRyb2xsZXIiKSkgeworICAgICAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiIDxzcGFuIGNsYXNzPVwibGlzdEl0ZW0gbm9MdGNcIj5MVEMgZnVuY3Rpb24gbWlzc2luZzwvc3Bhbj4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nLmNvbnRhaW5zKCJFdmVudFNlbmRlciIpKSB7CisgICAgICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgPHNwYW4gY2xhc3M9XCJsaXN0SXRlbSBub0V2ZW50U2VuZGVyXCI+Iik7CisgICAgICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCJFUyBmdW5jdGlvbiBtaXNzaW5nPC9zcGFuPiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjwvaDM+Iik7CisKKyAgICAgICAgICAgIGlmIChyZXN1bHRDb2RlICE9IEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuUEFTUykgeworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8ZGl2IGNsYXNzPVwiZGlmZlwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiBpZD1cIiIgKyBpZCArICJcIj4iKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZChyZXN1bHQuZ2V0RGlmZkFzSHRtbCgpKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiPGEgaHJlZj1cIiNcIiBvbkNsaWNrPVwidG9nZ2xlRGlzcGxheSgnIiArIGlkICsgIicpOyIpOworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCJyZXR1cm4gZmFsc2U7XCI+SGlkZTwvYT4iKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiPC9kaXY+Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8ZGl2IGNsYXNzPVwic3BhY2VcIj48L2Rpdj4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVSZXN1bHRzTGlzdE5vRGlmZihTdHJpbmdCdWlsZGVyIGh0bWwsIFN0cmluZyB0aXRsZSwKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXN1bHRzTGlzdCkgeworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdHNMaXN0KTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjxoMj5QYXNzZWQgWyIgKyByZXN1bHRzTGlzdC5zaXplKCkgKyAiXTwvaDI+Iik7CisgICAgICAgIGZvciAoU3RyaW5nIHJlc3VsdCA6IHJlc3VsdHNMaXN0KSB7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPGgzPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxzcGFuIGNsYXNzPVwic3FyXCI+JiN4MjVhMDsgPC9zcGFuPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxzcGFuIGNsYXNzPVwicGF0aFwiPiIgKyByZXN1bHQgKyAiPC9zcGFuPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjwvaDM+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPGRpdiBjbGFzcz1cInNwYWNlXCI+PC9kaXY+Iik7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGVzdHNMaXN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1Rlc3RzTGlzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk2NWZkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1Rlc3RzTGlzdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLlByb2dyZXNzRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworCitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnNjcmlwdHN1cHBvcnQuT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjazsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogQW4gQWN0aXZpdHkgdGhhdCBnZW5lcmF0ZXMgYSBsaXN0IG9mIHRlc3RzIGFuZCBzZW5kcyB0aGUgaW50ZW50IHRvCisgKiBMYXlvdXRUZXN0c0V4ZWN1dGVyIHRvIHJ1biB0aGVtLiBJdCBhbHNvIHJlc3RhcnRzIHRoZSBMYXlvdXRUZXN0c0V4ZWN1dGVyCisgKiBhZnRlciBpdCBjcmFzaGVzLgorICovCitwdWJsaWMgY2xhc3MgVGVzdHNMaXN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RFU1RfTElTVF9QUkVMT0FERVJfRE9ORSA9IDA7CisKKyAgICAvKiogQ29uc3RhbnRzIGZvciBhZGRpbmcgZXh0cmFzIHRvIGFuIGludGVudCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1RFU1RfUEFUSCA9ICJUZXN0UGF0aCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBQcm9ncmVzc0RpYWxvZyBzUHJvZ3Jlc3NEaWFsb2c7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19URVNUX0xJU1RfUFJFTE9BREVSX0RPTkU6CisgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5kaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgIG1UZXN0c0xpc3QgPSAoQXJyYXlMaXN0PFN0cmluZz4pbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgbVRvdGFsVGVzdENvdW50ID0gbVRlc3RzTGlzdC5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3RhcnRFeGVjdXRvcigwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtVGVzdHNMaXN0OworICAgIHByaXZhdGUgaW50IG1Ub3RhbFRlc3RDb3VudDsKKworICAgIHByaXZhdGUgT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjayBtT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjazsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUV2ZXJ5dGhpbmdGaW5pc2hlZDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAvKiogUHJlcGFyZSB0aGUgcHJvZ3Jlc3MgZGlhbG9nICovCisgICAgICAgIHNQcm9ncmVzc0RpYWxvZyA9IG5ldyBQcm9ncmVzc0RpYWxvZyhUZXN0c0xpc3RBY3Rpdml0eS50aGlzKTsKKyAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldENhbmNlbGFibGUoZmFsc2UpOworICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2V0UHJvZ3Jlc3NTdHlsZShQcm9ncmVzc0RpYWxvZy5TVFlMRV9TUElOTkVSKTsKKyAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldFRpdGxlKFIuc3RyaW5nLmRpYWxvZ19wcm9ncmVzc190aXRsZSk7CisgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRNZXNzYWdlKGdldFRleHQoUi5zdHJpbmcuZGlhbG9nX3Byb2dyZXNzX21zZykpOworCisgICAgICAgIHJlcXVlc3RXaW5kb3dGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX1BST0dSRVNTKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gZ2V0SW50ZW50KCk7CisgICAgICAgIGlmICghaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhJbnRlbnQuQUNUSU9OX1JVTikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcGF0aCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShFWFRSQV9URVNUX1BBVEgpOworCisgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zaG93KCk7CisgICAgICAgIE1lc3NhZ2UgZG9uZU1zZyA9IE1lc3NhZ2Uub2J0YWluKG1IYW5kbGVyLCBNU0dfVEVTVF9MSVNUX1BSRUxPQURFUl9ET05FKTsKKworICAgICAgICBJbnRlbnQgc2VydmljZUludGVudCA9IG5ldyBJbnRlbnQodGhpcywgTWFuYWdlclNlcnZpY2UuY2xhc3MpOworICAgICAgICBzZXJ2aWNlSW50ZW50LnB1dEV4dHJhKCJwYXRoIiwgcGF0aCk7CisgICAgICAgIHN0YXJ0U2VydmljZShzZXJ2aWNlSW50ZW50KTsKKworICAgICAgICBuZXcgVGVzdHNMaXN0UHJlbG9hZGVyVGhyZWFkKHBhdGgsIGRvbmVNc2cpLnN0YXJ0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25OZXdJbnRlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhJbnRlbnQuQUNUSU9OX1JFQk9PVCkpIHsKKyAgICAgICAgICAgIG9uQ3Jhc2hJbnRlbnQoaW50ZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKEludGVudC5BQ1RJT05fU0hVVERPV04pKSB7CisgICAgICAgICAgICBvbkV2ZXJ5dGhpbmdGaW5pc2hlZEludGVudChpbnRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBhbiBpbnRlbnQgdGhhdCBjb21lcyBmcm9tIE1hbmFnZVNlcnZpY2Ugd2hlbiBjcmFzaCBpcyBkZXRlY3RlZC4KKyAgICAgKiBUaGUgaW50ZW50IGNvbnRhaW5zIGFuIGluZGV4IGluIG1UZXN0c0xpc3Qgb2YgdGhlIHRlc3QgdGhhdCBjcmFzaGVkLiBUZXN0c0xpc3RBY3Rpdml0eQorICAgICAqIHJlc3RhcnRzIHRoZSBMYXlvdXRUZXN0c0V4ZWN1dG9yIGZyb20gdGhlIGZvbGxvd2luZyB0ZXN0IGluIG1UZXN0c0xpc3QsIGJ5IHNlbmRpbmcKKyAgICAgKiBhbiBpbnRlbnQgdG8gaXQuIFRoaXMgbmV3IGludGVudCBjb250YWlucyBhIGxpc3Qgb2YgcmVtYWluaW5nIHRlc3RzIHRvIHJ1biwKKyAgICAgKiB0b3RhbCBjb3VudCBvZiBhbGwgdGVzdHMsIGFuZCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHRlc3QgdG8gcnVuIGFmdGVyIHJlc3RhcnRpbmcuCisgICAgICogTGF5b3V0VGVzdEV4ZWN1dG9yIHJ1bnMgdGhlbiBhcyB1c3VhbCwgc2VuZGluZyByZXBvcnRzIHRvIE1hbmFnZXJTZXJ2aWNlLiBJZiBpdAorICAgICAqIGRldGVjdHMgdGhlIGNyYXNoIGl0IHNlbmRzIGEgbmV3IGludGVudCBhbmQgdGhlIGZsb3cgcmVwZWF0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgb25DcmFzaEludGVudChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIGludCBuZXh0VGVzdFRvUnVuID0gaW50ZW50LmdldEludEV4dHJhKCJjcmFzaGVkVGVzdEluZGV4IiwgLTEpICsgMTsKKyAgICAgICAgaWYgKG5leHRUZXN0VG9SdW4gPiAwICYmIG5leHRUZXN0VG9SdW4gPD0gbVRvdGFsVGVzdENvdW50KSB7CisgICAgICAgICAgICByZXN0YXJ0RXhlY3V0b3IobmV4dFRlc3RUb1J1bik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWdpc3Rlck9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2soT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBtT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICBpZiAobUV2ZXJ5dGhpbmdGaW5pc2hlZCkgeworICAgICAgICAgICAgbU9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sub25GaW5pc2hlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uRXZlcnl0aGluZ0ZpbmlzaGVkSW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgLyoqIFRPRE86IFNob3cgc29tZSBraW5kIG9mIHN1bW1hcnkgdG8gdGhlIHVzZXIgKi8KKyAgICAgICAgbUV2ZXJ5dGhpbmdGaW5pc2hlZCA9IHRydWU7CisgICAgICAgIGlmIChtT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICBtT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjay5vbkZpbmlzaGVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgICAgICBvdXRTdGF0ZS5wdXRTdHJpbmdBcnJheUxpc3QoInRlc3RzTGlzdCIsIG1UZXN0c0xpc3QpOworICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoInRvdGFsQ291bnQiLCBtVG90YWxUZXN0Q291bnQpOworCisgICAgICAgIHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUob3V0U3RhdGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vblJlc3RvcmVJbnN0YW5jZVN0YXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgbVRlc3RzTGlzdCA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRTdHJpbmdBcnJheUxpc3QoInRlc3RzTGlzdCIpOworICAgICAgICBtVG90YWxUZXN0Q291bnQgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KCJ0b3RhbENvdW50Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogKFJlKXN0YXJ0cyB0aGUgZXhlY3V0ZXIgYWN0aXZpdHkgZnJvbSB0aGUgZ2l2ZW4gdGVzdCBudW1iZXIgKGluY2x1c2l2ZSwgMC1iYXNlZCkuCisgICAgICogVGhpcyBudW1iZXIgaXMgYW4gaW5kZXggaW4gbVRlc3RzTGlzdCwgbm90IHRoZSBzdWJsaXN0IHBhc3NlZCBpbiB0aGUgaW50ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0RnJvbQorICAgICAqICAgICAgdGVzdCBpbmRleCBpbiBtVGVzdHNMaXN0IHRvIHN0YXJ0IHRoZSB0ZXN0cyBmcm9tIChpbmNsdXNpdmUsIDAtYmFzZWQpCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlc3RhcnRFeGVjdXRvcihpbnQgc3RhcnRGcm9tKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgIGludGVudC5zZXRDbGFzcyh0aGlzLCBMYXlvdXRUZXN0c0V4ZWN1dG9yLmNsYXNzKTsKKyAgICAgICAgaW50ZW50LnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX1JVTik7CisKKyAgICAgICAgaWYgKHN0YXJ0RnJvbSA8IG1Ub3RhbFRlc3RDb3VudCkgeworICAgICAgICAgICAgaW50ZW50LnB1dFN0cmluZ0FycmF5TGlzdEV4dHJhKExheW91dFRlc3RzRXhlY3V0b3IuRVhUUkFfVEVTVFNfTElTVCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTdHJpbmc+KG1UZXN0c0xpc3Quc3ViTGlzdChzdGFydEZyb20sIG1Ub3RhbFRlc3RDb3VudCkpKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShMYXlvdXRUZXN0c0V4ZWN1dG9yLkVYVFJBX1RFU1RfSU5ERVgsIHN0YXJ0RnJvbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnRlbnQucHV0U3RyaW5nQXJyYXlMaXN0RXh0cmEoTGF5b3V0VGVzdHNFeGVjdXRvci5FWFRSQV9URVNUU19MSVNULAorICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7CisgICAgICAgIH0KKworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1Rlc3RzTGlzdFByZWxvYWRlclRocmVhZC5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGVzdHNMaXN0UHJlbG9hZGVyVGhyZWFkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE0NWFmNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1Rlc3RzTGlzdFByZWxvYWRlclRocmVhZC5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CisKKy8qKgorICogQSBUaHJlYWQgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyBhIGxpc3RzIG9mIHRlc3RzIHRvIHJ1bi4KKyAqLworcHVibGljIGNsYXNzIFRlc3RzTGlzdFByZWxvYWRlclRocmVhZCBleHRlbmRzIFRocmVhZCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJUZXN0c0xpc3RQcmVsb2FkZXJUaHJlYWQiOworCisgICAgLyoqIFRPRE86IG1ha2UgaXQgYSBzZXR0aW5nICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RTX1JPT1RfRElSX1BBVEggPQorICAgICAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkgKworICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IgKyAiYW5kcm9pZCIgKworICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IgKyAiTGF5b3V0VGVzdHMiOworCisgICAgLyoqIEEgbGlzdCBjb250YWluaW5nIHJlbGF0aXZlIHBhdGhzIG9mIHRlc3RzIHRvIHJ1biAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbVRlc3RzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisgICAgcHJpdmF0ZSBGaWxlRmlsdGVyIG1GaWxlRmlsdGVyOworCisgICAgLyoqCisgICAgICogQSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBmb2xkZXIgd2l0aCB0aGUgdGVzdHMgd2Ugd2FudCB0byBydW4gb3IgcGFydGljdWxhciB0ZXN0LgorICAgICAqIFVzZWQgdXAgdG8gYW5kIGluY2x1ZGluZyBwcmVsb2FkVGVzdHMoKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtUmVsYXRpdmVQYXRoOworCisgICAgcHJpdmF0ZSBNZXNzYWdlIG1Eb25lTXNnOworCisgICAgLyoqCisgICAgICogVGhlIGdpdmVuIHBhdGggbXVzdCBiZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBkaXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aAorICAgICAqIEBwYXJhbSBkb25lTXNnCisgICAgICovCisgICAgcHVibGljIFRlc3RzTGlzdFByZWxvYWRlclRocmVhZChTdHJpbmcgcGF0aCwgTWVzc2FnZSBkb25lTXNnKSB7CisgICAgICAgIG1GaWxlRmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoVEVTVFNfUk9PVF9ESVJfUEFUSCk7CisgICAgICAgIG1SZWxhdGl2ZVBhdGggPSBwYXRoOworICAgICAgICBtRG9uZU1zZyA9IGRvbmVNc2c7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAvKiogQ2hlY2sgaWYgdGhlIHBhdGggaXMgY29ycmVjdCAqLworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShURVNUU19ST09UX0RJUl9QQVRILCBtUmVsYXRpdmVQYXRoKTsKKyAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHICsgIjo6cnVuIiwgIlBhdGggZG9lcyBub3QgZXhpc3Q6ICIgKyBtUmVsYXRpdmVQYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qKiBQb3B1bGF0ZSB0aGUgdGVzdHMnIGxpc3QgYWNjb3JkaW5nbHkgKi8KKyAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBwcmVsb2FkVGVzdHMobVJlbGF0aXZlUGF0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1UZXN0c0xpc3QuYWRkKG1SZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbURvbmVNc2cub2JqID0gbVRlc3RzTGlzdDsKKyAgICAgICAgbURvbmVNc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgYWxsIHRoZSB0ZXN0cyBmcm9tIHRoZSBnaXZlbiBmb2xkZXJzIGFuZCBhbGwgdGhlIHN1YmZvbGRlcnMKKyAgICAgKiBpbnRvIG1UZXN0c0xpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyUmVsYXRpdmVQYXRoCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByZWxvYWRUZXN0cyhTdHJpbmcgZGlyUmVsYXRpdmVQYXRoKSB7CisgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBmb2xkZXJzTGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgZm9sZGVyc0xpc3QuYWRkKGRpclJlbGF0aXZlUGF0aCk7CisKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aDsKKyAgICAgICAgU3RyaW5nIGN1cnJlbnREaXJSZWxhdGl2ZVBhdGg7CisgICAgICAgIFN0cmluZyBpdGVtTmFtZTsKKyAgICAgICAgRmlsZVtdIGl0ZW1zOworICAgICAgICB3aGlsZSAoIWZvbGRlcnNMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgY3VycmVudERpclJlbGF0aXZlUGF0aCA9IGZvbGRlcnNMaXN0LnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICBpdGVtcyA9IG5ldyBGaWxlKFRFU1RTX1JPT1RfRElSX1BBVEgsIGN1cnJlbnREaXJSZWxhdGl2ZVBhdGgpLmxpc3RGaWxlcygpOworICAgICAgICAgICAgZm9yIChGaWxlIGl0ZW0gOiBpdGVtcykgeworICAgICAgICAgICAgICAgIGl0ZW1OYW1lID0gaXRlbS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgcmVsYXRpdmVQYXRoID0gY3VycmVudERpclJlbGF0aXZlUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgaXRlbU5hbWU7CisKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS5pc0RpcmVjdG9yeSgpICYmIEZpbGVGaWx0ZXIuaXNUZXN0RGlyKGl0ZW1OYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBmb2xkZXJzTGlzdC5hZGQocmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKEZpbGVGaWx0ZXIuaXNUZXN0RmlsZShpdGVtTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtRmlsZUZpbHRlci5pc1NraXAocmVsYXRpdmVQYXRoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RzTGlzdC5hZGQocmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vbVN1bW1hcml6ZXIuYWRkU2tpcHBlZFRlc3QocmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBTdW1tYXJpemVyIGlzIG5vdyBpbiBzZXJ2aWNlIC0gZmlndXJlIG91dCBob3cgdG8gc2VuZCB0aGUgaW5mbyAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1RleHRSZXN1bHQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1RleHRSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjg2NGU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGV4dFJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKK2ltcG9ydCBuYW1lLmZyYXNlci5uZWlsLnBsYWludGV4dC5kaWZmX21hdGNoX3BhdGNoOworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CisKKy8qKgorICogQSByZXN1bHQgb2JqZWN0IGZvciB3aGljaCB0aGUgZXhwZWN0ZWQgb3V0cHV0IGlzIHRleHQuIEl0IGRvZXMgbm90IGhhdmUgYW4gaW1hZ2UKKyAqIGV4cGVjdGVkIHJlc3VsdC4KKyAqCisgKiA8cD5DcmVhdGVkIGlmIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKSB3YXMgY2FsbGVkLgorICovCitwdWJsaWMgY2xhc3MgVGV4dFJlc3VsdCBleHRlbmRzIEFic3RyYWN0UmVzdWx0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRE9DVU1FTlRfQVNfVEVYVCA9IDA7CisKKyAgICBwcml2YXRlIFN0cmluZyBtRXhwZWN0ZWRSZXN1bHQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUFjdHVhbFJlc3VsdDsKKyAgICBwcml2YXRlIFN0cmluZyBtUmVsYXRpdmVQYXRoOworICAgIHByaXZhdGUgUmVzdWx0Q29kZSBtUmVzdWx0Q29kZTsKKyAgICBwcml2YXRlIE1lc3NhZ2UgbVJlc3VsdE9idGFpbmVkTXNnOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wQ2hpbGRGcmFtZXNBc1RleHQ7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIGlmIChtc2cud2hhdCA9PSBNU0dfRE9DVU1FTlRfQVNfVEVYVCkgeworICAgICAgICAgICAgICAgIG1BY3R1YWxSZXN1bHQgPSAoU3RyaW5nKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgbVJlc3VsdE9idGFpbmVkTXNnLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBUZXh0UmVzdWx0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgbVJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlUGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREdW1wQ2hpbGRGcmFtZXNBc1RleHQoYm9vbGVhbiBkdW1wQ2hpbGRGcmFtZXNBc1RleHQpIHsKKyAgICAgICAgbUR1bXBDaGlsZEZyYW1lc0FzVGV4dCA9IGR1bXBDaGlsZEZyYW1lc0FzVGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHJlY3JlYXRlIHRoZSBSZXN1bHQgd2hlbiByZWNlaXZlZCBieSB0aGUgc2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidW5kbGUKKyAgICAgKiAgICAgIGJ1bmRsZSB3aXRoIGRhdGEgdXNlZCB0byByZWNyZWF0ZSB0aGUgcmVzdWx0CisgICAgICovCisgICAgcHVibGljIFRleHRSZXN1bHQoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICBtRXhwZWN0ZWRSZXN1bHQgPSBidW5kbGUuZ2V0U3RyaW5nKCJleHBlY3RlZFRleHR1YWxSZXN1bHQiKTsKKyAgICAgICAgbUFjdHVhbFJlc3VsdCA9IGJ1bmRsZS5nZXRTdHJpbmcoImFjdHVhbFRleHR1YWxSZXN1bHQiKTsKKyAgICAgICAgc2V0QWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcoYnVuZGxlLmdldFN0cmluZygiYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmciKSk7CisgICAgICAgIG1SZWxhdGl2ZVBhdGggPSBidW5kbGUuZ2V0U3RyaW5nKCJyZWxhdGl2ZVBhdGgiKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdENvZGUgPSBidW5kbGUuZ2V0U3RyaW5nKCJyZXN1bHRDb2RlIik7CisgICAgICAgIGlmIChyZXN1bHRDb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SZXN1bHRDb2RlID0gUmVzdWx0Q29kZS52YWx1ZU9mKHJlc3VsdENvZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3VsdENvZGUgZ2V0UmVzdWx0Q29kZSgpIHsKKyAgICAgICAgaWYgKG1SZXN1bHRDb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtUmVzdWx0Q29kZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRXhwZWN0ZWRSZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgbVJlc3VsdENvZGUgPSBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLkZBSUxfTk9fRVhQRUNURURfUkVTVUxUOworICAgICAgICB9IGVsc2UgaWYgKCFtRXhwZWN0ZWRSZXN1bHQuZXF1YWxzKG1BY3R1YWxSZXN1bHQpKSB7CisgICAgICAgICAgICBtUmVzdWx0Q29kZSA9IEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuRkFJTF9SRVNVTFRfRElGRkVSUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SZXN1bHRDb2RlID0gQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5QQVNTOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1SZXN1bHRDb2RlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBieXRlW10gZ2V0QWN0dWFsSW1hZ2VSZXN1bHQoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0dWFsVGV4dFJlc3VsdCgpIHsKKyAgICAgICAgU3RyaW5nIGFkZGl0aW9uYWxUZXh0UmVzdWx0U3RyaW5nID0gZ2V0QWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcoKTsKKyAgICAgICAgaWYgKGFkZGl0aW9uYWxUZXh0UmVzdWx0U3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBhZGRpdGlvbmFsVGV4dFJlc3VsdFN0cmluZysgbUFjdHVhbFJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtQWN0dWFsUmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEV4cGVjdGVkSW1hZ2VSZXN1bHQoYnl0ZVtdIGV4cGVjdGVkUmVzdWx0KSB7CisgICAgICAgIC8qKiBUaGlzIG1ldGhvZCBpcyBub3QgYXBwbGljYWJsZSB0byB0aGlzIHR5cGUgb2YgcmVzdWx0ICovCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRUZXh0UmVzdWx0KFN0cmluZyBleHBlY3RlZFJlc3VsdCkgeworICAgICAgICBtRXhwZWN0ZWRSZXN1bHQgPSBleHBlY3RlZFJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldERpZmZBc0h0bWwoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgaHRtbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8dGFibGUgY2xhc3M9XCJ2aXN1YWxfZGlmZlwiPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ciBjbGFzcz1cImhlYWRlcnNcIj4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+RXhwZWN0ZWQgcmVzdWx0OjwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgICAgIDx0ZCBjbGFzcz1cInNwYWNlXCI+PC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+QWN0dWFsIHJlc3VsdDo8L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdHI+Iik7CisKKyAgICAgICAgaWYgKG1FeHBlY3RlZFJlc3VsdCA9PSBudWxsIHx8IG1BY3R1YWxSZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgYXBwZW5kTnVsbHNIdG1sKGh0bWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXBwZW5kRGlmZkh0bWwoaHRtbCk7CisgICAgICAgIH0KKworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ciBjbGFzcz1cImZvb3RlcnNcIj4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPHRkIGNsYXNzPVwic3BhY2VcIj48L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdHI+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8L3RhYmxlPiIpOworCisgICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZERpZmZIdG1sKFN0cmluZ0J1aWxkZXIgaHRtbCkgeworICAgICAgICBMaW5rZWRMaXN0PGRpZmZfbWF0Y2hfcGF0Y2guRGlmZj4gZGlmZnMgPQorICAgICAgICAgICAgICAgIG5ldyBkaWZmX21hdGNoX3BhdGNoKCkuZGlmZl9tYWluKG1FeHBlY3RlZFJlc3VsdCwgbUFjdHVhbFJlc3VsdCk7CisKKyAgICAgICAgZGlmZnMgPSBWaXN1YWxEaWZmVXRpbHMuc3BsaXREaWZmc09uTmV3bGluZShkaWZmcyk7CisKKyAgICAgICAgTGlua2VkTGlzdDxTdHJpbmc+IGV4cGVjdGVkTGluZXMgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisgICAgICAgIExpbmtlZExpc3Q8SW50ZWdlcj4gZXhwZWN0ZWRMaW5lTnVtcyA9IG5ldyBMaW5rZWRMaXN0PEludGVnZXI+KCk7CisgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBhY3R1YWxMaW5lcyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgTGlua2VkTGlzdDxJbnRlZ2VyPiBhY3R1YWxMaW5lTnVtcyA9IG5ldyBMaW5rZWRMaXN0PEludGVnZXI+KCk7CisKKyAgICAgICAgVmlzdWFsRGlmZlV0aWxzLmdlbmVyYXRlRXhwZWN0ZWRSZXN1bHRMaW5lcyhkaWZmcywgZXhwZWN0ZWRMaW5lTnVtcywgZXhwZWN0ZWRMaW5lcyk7CisgICAgICAgIFZpc3VhbERpZmZVdGlscy5nZW5lcmF0ZUFjdHVhbFJlc3VsdExpbmVzKGRpZmZzLCBhY3R1YWxMaW5lTnVtcywgYWN0dWFsTGluZXMpOworCisgICAgICAgIGh0bWwuYXBwZW5kKFZpc3VhbERpZmZVdGlscy5nZXRIdG1sKGV4cGVjdGVkTGluZU51bXMsIGV4cGVjdGVkTGluZXMsCisgICAgICAgICAgICAgICAgYWN0dWFsTGluZU51bXMsIGFjdHVhbExpbmVzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZE51bGxzSHRtbChTdHJpbmdCdWlsZGVyIGh0bWwpIHsKKyAgICAgICAgLyoqIFRPRE86IENyZWF0ZSBhIHNlcGFyYXRlIHJvdyBmb3IgZWFjaCBsaW5lIG9mIG5vdCBudWxsIHJlc3VsdCAqLworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ciBjbGFzcz1cInJlc3VsdHNcIj4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQgY2xhc3M9XCJsaW5lX2NvdW50XCI+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQgY2xhc3M9XCJsaW5lXCI+Iik7CisgICAgICAgIGlmIChtRXhwZWN0ZWRSZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIkV4cGVjdGVkIHJlc3VsdCB3YXMgTlVMTCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaHRtbC5hcHBlbmQobUV4cGVjdGVkUmVzdWx0LnJlcGxhY2UoIlxuIiwgIjxiciAvPiIpKTsKKyAgICAgICAgfQorICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8dGQgY2xhc3M9XCJzcGFjZVwiPjwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkIGNsYXNzPVwibGluZV9jb3VudFwiPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkIGNsYXNzPVwibGluZVwiPiIpOworICAgICAgICBpZiAobUFjdHVhbFJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiQWN0dWFsIHJlc3VsdCB3YXMgTlVMTCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaHRtbC5hcHBlbmQobUFjdHVhbFJlc3VsdC5yZXBsYWNlKCJcbiIsICI8YnIgLz4iKSk7CisgICAgICAgIH0KKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8L3RyPiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXN0VHlwZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gVGVzdFR5cGUuVEVYVDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvYnRhaW5BY3R1YWxSZXN1bHRzKFdlYlZpZXcgd2VidmlldywgTWVzc2FnZSByZXN1bHRPYnRhaW5lZE1zZykgeworICAgICAgICBtUmVzdWx0T2J0YWluZWRNc2cgPSByZXN1bHRPYnRhaW5lZE1zZzsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19ET0NVTUVOVF9BU19URVhUKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogYXJnMSAtIHNob3VsZCBkdW1wIHRvcCBmcmFtZSBhcyB0ZXh0CisgICAgICAgICAqIGFyZzIgLSBzaG91bGQgZHVtcCBjaGlsZCBmcmFtZXMgYXMgdGV4dAorICAgICAgICAgKi8KKyAgICAgICAgbXNnLmFyZzEgPSAxOworICAgICAgICBtc2cuYXJnMiA9IG1EdW1wQ2hpbGRGcmFtZXNBc1RleHQgPyAxIDogMDsKKyAgICAgICAgd2Vidmlldy5kb2N1bWVudEFzVGV4dChtc2cpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdW5kbGUgZ2V0QnVuZGxlKCkgeworICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBidW5kbGUucHV0U3RyaW5nKCJleHBlY3RlZFRleHR1YWxSZXN1bHQiLCBtRXhwZWN0ZWRSZXN1bHQpOworICAgICAgICBidW5kbGUucHV0U3RyaW5nKCJhY3R1YWxUZXh0dWFsUmVzdWx0IiwgZ2V0QWN0dWFsVGV4dFJlc3VsdCgpKTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZygiYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmciLCBnZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZygpKTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZygicmVsYXRpdmVQYXRoIiwgbVJlbGF0aXZlUGF0aCk7CisgICAgICAgIGlmIChtUmVzdWx0Q29kZSAhPSBudWxsKSB7CisgICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nKCJyZXN1bHRDb2RlIiwgbVJlc3VsdENvZGUubmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBidW5kbGUucHV0U3RyaW5nKCJ0eXBlIiwgZ2V0VHlwZSgpLm5hbWUoKSk7CisgICAgICAgIHJldHVybiBidW5kbGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoKSB7CisgICAgICAgIHJldHVybiBtUmVsYXRpdmVQYXRoOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9WaXN1YWxEaWZmVXRpbHMuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1Zpc3VhbERpZmZVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YmY3NWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9WaXN1YWxEaWZmVXRpbHMuamF2YQpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgbmFtZS5mcmFzZXIubmVpbC5wbGFpbnRleHQuZGlmZl9tYXRjaF9wYXRjaDsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworCisvKioKKyAqIEhlbHBlciBtZXRob2RzIGZvIFRleHRSZXN1bHQuZ2V0RGlmZkFzSHRtbCgpCisgKi8KK3B1YmxpYyBjbGFzcyBWaXN1YWxEaWZmVXRpbHMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERPTlRfUFJJTlRfTElORV9OVU1CRVIgPSAtMTsKKworICAgIC8qKgorICAgICAqIFByZXByb2Nlc3NlcyB0aGUgbGlzdCBvZiBkaWZmcyBzbyB0aGF0IG5ldyBsaW5lIGNoYXJhY3RlcnMgYXBwZWFyIG9ubHkgYXQgdGhlIGVuZCBvZgorICAgICAqIGRpZmYudGV4dAorICAgICAqCisgICAgICogQHBhcmFtIGRpZmZzCisgICAgICogQHJldHVybgorICAgICAqICAgICAgTGlua2VkTGlzdCBvZiBkaWZmcyB3aGVyZSBuZXcgbGluZSBjaGFyYWN0ZXIgYXBwZWFycyBvbmx5IG9uIHRoZSBlbmQgb2YKKyAgICAgKiAgICAgIGRpZmYudGV4dAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlua2VkTGlzdDxkaWZmX21hdGNoX3BhdGNoLkRpZmY+IHNwbGl0RGlmZnNPbk5ld2xpbmUoCisgICAgICAgICAgICBMaW5rZWRMaXN0PGRpZmZfbWF0Y2hfcGF0Y2guRGlmZj4gZGlmZnMpIHsKKyAgICAgICAgTGlua2VkTGlzdDxkaWZmX21hdGNoX3BhdGNoLkRpZmY+IG5ld0RpZmZzID0gbmV3IExpbmtlZExpc3Q8ZGlmZl9tYXRjaF9wYXRjaC5EaWZmPigpOworCisgICAgICAgIFN0cmluZ1tdIHBhcnRzOworICAgICAgICBpbnQgbGVuZ3RoTWludXNPbmU7CisgICAgICAgIGZvciAoZGlmZl9tYXRjaF9wYXRjaC5EaWZmIGRpZmYgOiBkaWZmcykgeworICAgICAgICAgICAgcGFydHMgPSBkaWZmLnRleHQuc3BsaXQoIlxuIiwgLTEpOworICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgbmV3RGlmZnMuYWRkKGRpZmYpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZW5ndGhNaW51c09uZSA9IHBhcnRzLmxlbmd0aCAtIDE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aE1pbnVzT25lOyBpKyspIHsKKyAgICAgICAgICAgICAgICBuZXdEaWZmcy5hZGQobmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihkaWZmLm9wZXJhdGlvbiwgcGFydHNbaV0gKyAiXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXBhcnRzW2xlbmd0aE1pbnVzT25lXS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBuZXdEaWZmcy5hZGQobmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihkaWZmLm9wZXJhdGlvbiwgcGFydHNbbGVuZ3RoTWludXNPbmVdKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3RGlmZnM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlRXhwZWN0ZWRSZXN1bHRMaW5lcyhMaW5rZWRMaXN0PGRpZmZfbWF0Y2hfcGF0Y2guRGlmZj4gZGlmZnMsCisgICAgICAgICAgICBMaW5rZWRMaXN0PEludGVnZXI+IGxpbmVOdW1zLCBMaW5rZWRMaXN0PFN0cmluZz4gbGluZXMpIHsKKyAgICAgICAgU3RyaW5nIGRlbFNwYW4gPSAiPHNwYW4gY2xhc3M9XCJkZWxcIj4iOworICAgICAgICBTdHJpbmcgZXFsU3BhbiA9ICI8c3BhbiBjbGFzcz1cImVxbFwiPiI7CisKKyAgICAgICAgU3RyaW5nIGxpbmUgPSAiIjsKKyAgICAgICAgaW50IGkgPSAxOworICAgICAgICBmb3IgKGRpZmZfbWF0Y2hfcGF0Y2guRGlmZiBkaWZmIDogZGlmZnMpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZGlmZi5vcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlIERFTEVURToKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHByb2Nlc3NEaWZmKGRpZmYsIGxpbmVOdW1zLCBsaW5lcywgbGluZSwgaSwgZGVsU3Bhbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgSU5TRVJUOgorICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZi50ZXh0LmVuZHNXaXRoKCJcbiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtcy5hZGQoRE9OVF9QUklOVF9MSU5FX05VTUJFUik7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcy5hZGQoIiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBFUVVBTDoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHByb2Nlc3NEaWZmKGRpZmYsIGxpbmVOdW1zLCBsaW5lcywgbGluZSwgaSwgZXFsU3Bhbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghbGluZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGxpbmVzLmFkZChsaW5lKTsKKyAgICAgICAgICAgIGxpbmVOdW1zLmFkZChpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZUFjdHVhbFJlc3VsdExpbmVzKExpbmtlZExpc3Q8ZGlmZl9tYXRjaF9wYXRjaC5EaWZmPiBkaWZmcywKKyAgICAgICAgICAgIExpbmtlZExpc3Q8SW50ZWdlcj4gbGluZU51bXMsIExpbmtlZExpc3Q8U3RyaW5nPiBsaW5lcykgeworICAgICAgICBTdHJpbmcgaW5zU3BhbiA9ICI8c3BhbiBjbGFzcz1cImluc1wiPiI7CisgICAgICAgIFN0cmluZyBlcWxTcGFuID0gIjxzcGFuIGNsYXNzPVwiZXFsXCI+IjsKKworICAgICAgICBTdHJpbmcgbGluZSA9ICIiOworICAgICAgICBpbnQgaSA9IDE7CisgICAgICAgIGZvciAoZGlmZl9tYXRjaF9wYXRjaC5EaWZmIGRpZmYgOiBkaWZmcykgeworICAgICAgICAgICAgc3dpdGNoIChkaWZmLm9wZXJhdGlvbikgeworICAgICAgICAgICAgICAgIGNhc2UgSU5TRVJUOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gcHJvY2Vzc0RpZmYoZGlmZiwgbGluZU51bXMsIGxpbmVzLCBsaW5lLCBpLCBpbnNTcGFuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBERUxFVEU6CisgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmLnRleHQuZW5kc1dpdGgoIlxuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVOdW1zLmFkZChET05UX1BSSU5UX0xJTkVfTlVNQkVSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFkZCgiIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEVRVUFMOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gcHJvY2Vzc0RpZmYoZGlmZiwgbGluZU51bXMsIGxpbmVzLCBsaW5lLCBpLCBlcWxTcGFuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFsaW5lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbGluZXMuYWRkKGxpbmUpOworICAgICAgICAgICAgbGluZU51bXMuYWRkKGkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgb3IgYXBwZW5kIGEgbGluZSBmb3IgYSBnaXZlbiBkaWZmIGFuZCBhZGQgaXQgdG8gZ2l2ZW4gY29sbGVjdGlvbnMgaWYgbmVjZXNzYXJ5LgorICAgICAqIEl0IHB1dHMgZGlmZnMgaW4gSFRNTCBzcGFucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaWZmCisgICAgICogQHBhcmFtIGxpbmVOdW1zCisgICAgICogQHBhcmFtIGxpbmVzCisgICAgICogQHBhcmFtIGxpbmUKKyAgICAgKiBAcGFyYW0gaQorICAgICAqIEBwYXJhbSBiZWdTcGFuCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NEaWZmKGRpZmZfbWF0Y2hfcGF0Y2guRGlmZiBkaWZmLCBMaW5rZWRMaXN0PEludGVnZXI+IGxpbmVOdW1zLAorICAgICAgICAgICAgTGlua2VkTGlzdDxTdHJpbmc+IGxpbmVzLCBTdHJpbmcgbGluZSwgaW50IGksIFN0cmluZyBiZWdTcGFuKSB7CisgICAgICAgIFN0cmluZyBlbmRTcGFuID0gIjwvc3Bhbj4iOworICAgICAgICBTdHJpbmcgYnIgPSAiJm5ic3A7IjsKKworICAgICAgICBpZiAoZGlmZi50ZXh0LmVuZHNXaXRoKCJcbiIpKSB7CisgICAgICAgICAgICBsaW5lTnVtcy5hZGQoaSsrKTsKKyAgICAgICAgICAgIC8qKiBUT0RPOiBUaGluayBvZiBiZXR0ZXIgd2F5IHRvIHJlcGxhY2Ugc3R1ZmYgKi8KKyAgICAgICAgICAgIGxpbmUgKz0gYmVnU3BhbiArIGRpZmYudGV4dC5yZXBsYWNlKCIgICIsICImbmJzcDsmbmJzcDsiKQorICAgICAgICAgICAgICAgICAgICArIGVuZFNwYW4gKyBicjsKKyAgICAgICAgICAgIGxpbmVzLmFkZChsaW5lKTsKKyAgICAgICAgICAgIGxpbmUgPSAiIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxpbmUgKz0gYmVnU3BhbiArIGRpZmYudGV4dC5yZXBsYWNlKCIgICIsICImbmJzcDsmbmJzcDsiKSArIGVuZFNwYW47CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGluZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRIdG1sKExpbmtlZExpc3Q8SW50ZWdlcj4gbGluZU51bXMxLCBMaW5rZWRMaXN0PFN0cmluZz4gbGluZXMxLAorICAgICAgICAgICAgTGlua2VkTGlzdDxJbnRlZ2VyPiBsaW5lTnVtczIsIExpbmtlZExpc3Q8U3RyaW5nPiBsaW5lczIpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBodG1sID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaW50IGxpbmVOdW07CisgICAgICAgIGludCBzaXplID0gbGluZXMxLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8dHIgY2xhc3M9XCJyZXN1bHRzXCI+Iik7CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkIGNsYXNzPVwibGluZV9jb3VudFwiPiIpOworICAgICAgICAgICAgbGluZU51bSA9IGxpbmVOdW1zMS5yZW1vdmVGaXJzdCgpOworICAgICAgICAgICAgaWYgKGxpbmVOdW0gPiAwKSB7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQobGluZU51bSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdGQ+Iik7CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkIGNsYXNzPVwibGluZVwiPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQobGluZXMxLnJlbW92ZUZpcnN0KCkpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8L3RkPiIpOworCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZCBjbGFzcz1cInNwYWNlXCI+PC90ZD4iKTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQgY2xhc3M9XCJsaW5lX2NvdW50XCI+Iik7CisgICAgICAgICAgICBsaW5lTnVtID0gbGluZU51bXMyLnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICBpZiAobGluZU51bSA+IDApIHsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZChsaW5lTnVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90ZD4iKTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQgY2xhc3M9XCJsaW5lXCI+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZChsaW5lczIucmVtb3ZlRmlyc3QoKSk7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdGQ+Iik7CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8L3RyPiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL2ZvcndhcmRlci9BZGJVdGlscy5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvZm9yd2FyZGVyL0FkYlV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE2NWExYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL2ZvcndhcmRlci9BZGJVdGlscy5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5mb3J3YXJkZXI7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKKworLyoqCisgKiBUaGUgdXRpbGl0eSBjbGFzcyB0aGF0IGNhbiBzZXR1cCBhIHNvY2tldCBhbGxvd2luZyB0aGUgZGV2aWNlIHRvIGNvbW11bmljYXRlIHdpdGggcmVtb3RlCisgKiBtYWNoaW5lcyB0aHJvdWdoIHRoZSBtYWNoaW5lIHRoYXQgdGhlIGRldmljZSBpcyBjb25uZWN0ZWQgdG8gdmlhIGFkYi4KKyAqLworcHVibGljIGNsYXNzIEFkYlV0aWxzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJBZGJVdGlscyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURCX09LID0gIk9LQVkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBREJfUE9SVCA9IDUwMzc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQl9IT1NUID0gIjEyNy4wLjAuMSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFEQl9SRVNQT05TRV9TSVpFID0gNDsKKworICAgIC8qKgorICAgICAqIFNlbmQgYW4gQURCIGNvbW1hbmQgdXNpbmcgZXhpc3Rpbmcgc29ja2V0IGNvbm5lY3Rpb24KKyAgICAgKgorICAgICAqIFRoZSBzdHJlYW1zIHByb3ZpZGVkIG11c3QgYmUgZnJvbSBhIHNvY2tldCBjb25uZWN0ZWQgdG8gYWRiIGFscmVhZHkKKyAgICAgKgorICAgICAqIEBwYXJhbSBpcyBpbnB1dCBzdHJlYW0gb2YgdGhlIHNvY2tldCBjb25uZWN0aW9uCisgICAgICogQHBhcmFtIG9zIG91dHB1dCBzdHJlYW0gb2YgdGhlIHNvY2tldAorICAgICAqIEBwYXJhbSBjbWQgdGhlIGFkYiBjb21tYW5kIHRvIHNlbmQKKyAgICAgKiBAcmV0dXJuIGlmIGFkYiBnYXZlIGEgc3VjY2VzcyByZXNwb25zZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNlbmRBZGJDbWQoSW5wdXRTdHJlYW0gaXMsIE91dHB1dFN0cmVhbSBvcywgU3RyaW5nIGNtZCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtBREJfUkVTUE9OU0VfU0laRV07CisKKyAgICAgICAgY21kID0gU3RyaW5nLmZvcm1hdCgiJTA0WCIsIGNtZC5sZW5ndGgoKSkgKyBjbWQ7CisgICAgICAgIG9zLndyaXRlKGNtZC5nZXRCeXRlcygpKTsKKyAgICAgICAgaW50IHJlYWQgPSBpcy5yZWFkKGJ1Zik7CisgICAgICAgIGlmIChyZWFkICE9IEFEQl9SRVNQT05TRV9TSVpFIHx8ICFBREJfT0suZXF1YWxzKG5ldyBTdHJpbmcoYnVmKSkpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJhZGIgY21kIGZhaWxkLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHRjcCBzb2NrZXQgY29ubmVjdGlvbiB0byBzcGVjaWZpZWQgSVAgYWRkcmVzcyBhbmQgcG9ydCBwcm94aWVkIGJ5IGFkYgorICAgICAqCisgICAgICogVGhlIHByb3h5aW5nIGlzIHRyYW5zcGFyZW50LCBlLmcuIGlmIGEgc29ja2V0IGlzIHJldHVybmVkLCB0aGVuIGl0IGNhbiBiZSB3cml0dGVuIHRvIGFuZAorICAgICAqIHJlYWQgZnJvbSBhcyBpZiBpdCBpcyBkaXJlY3RseSBjb25uZWN0ZWQgdG8gdGhlIHRhcmdldAorICAgICAqCisgICAgICogQHBhcmFtIHJlbW90ZUFkZHJlc3MgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byBjb25uZWN0IHRvCisgICAgICogQHBhcmFtIHJlbW90ZVBvcnQgcG9ydCBvZiB0aGUgaG9zdCB0byBjb25uZWN0IHRvCisgICAgICogQHJldHVybiBhIHZhbGlkIFNvY2tldCBpbnN0YW5jZSBpZiBzdWNjZXNzZnVsLCBudWxsIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU29ja2V0IGdldFNvY2tldFRvUmVtb3RlTWFjaGluZShTdHJpbmcgcmVtb3RlQWRkcmVzcywgaW50IHJlbW90ZVBvcnQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNvY2tldCBzb2NrZXQgPSBuZXcgU29ja2V0KEFEQl9IT1NULCBBREJfUE9SVCk7CisgICAgICAgICAgICBTdHJpbmcgY21kID0gInRjcDoiICsgcmVtb3RlUG9ydCArICI6IiArIHJlbW90ZUFkZHJlc3M7CisgICAgICAgICAgICBpZiAoIXNlbmRBZGJDbWQoc29ja2V0LmdldElucHV0U3RyZWFtKCksIHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSwgY21kKSkgeworICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNvY2tldDsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiZXJyb3IgY3JlYXRpbmcgYWRiIHNvY2tldCIsIGlvZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvQ29ubmVjdGlvbkhhbmRsZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL2ZvcndhcmRlci9Db25uZWN0aW9uSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNmNiN2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvQ29ubmVjdGlvbkhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLmZvcndhcmRlcjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworCisvKioKKyAqIFdvcmtlciBjbGFzcyBmb3Ige0BsaW5rIEZvcndhcmRlcn0uIEEgQ29ubmVjdGlvbkhhbmRsZXIgd2lsbCBiZSBjcmVhdGVkIG9uY2UgdGhlIEZvcndhcmRlcgorICogYWNjZXB0cyBhbiBpbmNvbWluZyBjb25uZWN0aW9uLCBhbmQgaXQgd2lsbCB0aGVuIGZvcndhcmQgdGhlIGluY29taW5nL291dGdvaW5nIHN0cmVhbXMgdG8gYQorICogY29ubmVjdGlvbiBhbHJlYWR5IHByb3hpZWQgYnkgYWRiIG5ldHdvcmtpbmcgKHNlZSBhbHNvIHtAbGluayBBZGJVdGlsc30pLgorICovCitwdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkhhbmRsZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQ29ubmVjdGlvbkhhbmRsZXIiOworCisgICAgcHJpdmF0ZSBjbGFzcyBTb2NrZXRQaXBlVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKworICAgICAgICBwcml2YXRlIFNvY2tldCBtSW5Tb2NrZXQsIG1PdXRTb2NrZXQ7CisKKyAgICAgICAgcHVibGljIFNvY2tldFBpcGVUaHJlYWQoU29ja2V0IGluU29ja2V0LCBTb2NrZXQgb3V0U29ja2V0KSB7CisgICAgICAgICAgICBtSW5Tb2NrZXQgPSBpblNvY2tldDsKKyAgICAgICAgICAgIG1PdXRTb2NrZXQgPSBvdXRTb2NrZXQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXM7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3M7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgICAgICBpcyA9IG1JblNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICBvcyA9IG1PdXRTb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsIHRoaXMudG9TdHJpbmcoKSwgZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNDA5Nl07CisgICAgICAgICAgICBpbnQgbGVuZ3RoOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGVuZ3RoID0gaXMucmVhZChidWZmZXIpKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBvcy53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8qKiBUaGlzIGV4Y2VwdGlvbiBtZWFucyBvbmUgb2YgdGhlIHN0cmVhbXMgaXMgY2xvc2VkICovCisgICAgICAgICAgICAgICAgICAgIExvZy52KExPR19UQUcsIHRoaXMudG9TdHJpbmcoKSwgZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJTb2NrZXRQaXBlVGhyZWFkOlxuIiArIG1JblNvY2tldCArICJcbj0+XG4iICsgbU91dFNvY2tldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU29ja2V0IG1Gcm9tU29ja2V0LCBtVG9Tb2NrZXQ7CisgICAgcHJpdmF0ZSBTb2NrZXRQaXBlVGhyZWFkIG1Gcm9tVG9QaXBlLCBtVG9Gcm9tUGlwZTsKKworICAgIHB1YmxpYyBDb25uZWN0aW9uSGFuZGxlcihTb2NrZXQgZnJvbVNvY2tldCwgU29ja2V0IHRvU29ja2V0KSB7CisgICAgICAgIG1Gcm9tU29ja2V0ID0gZnJvbVNvY2tldDsKKyAgICAgICAgbVRvU29ja2V0ID0gdG9Tb2NrZXQ7CisgICAgICAgIG1Gcm9tVG9QaXBlID0gbmV3IFNvY2tldFBpcGVUaHJlYWQobUZyb21Tb2NrZXQsIG1Ub1NvY2tldCk7CisgICAgICAgIG1Ub0Zyb21QaXBlID0gbmV3IFNvY2tldFBpcGVUaHJlYWQobVRvU29ja2V0LCBtRnJvbVNvY2tldCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIG1Gcm9tVG9QaXBlLnN0YXJ0KCk7CisgICAgICAgIG1Ub0Zyb21QaXBlLnN0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgc2h1dGRvd24obUZyb21Tb2NrZXQpOworICAgICAgICBzaHV0ZG93bihtVG9Tb2NrZXQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzaHV0ZG93bihTb2NrZXQgc29ja2V0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Gcm9tVG9QaXBlKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtVG9Gcm9tUGlwZSkgeworICAgICAgICAgICAgICAgICAgICAvKiogVGhpcyB3aWxsIHN0b3AgdGhlIHdoaWxlIGxvb3AgaW4gdGhlIHJ1biBtZXRob2QgKi8KKyAgICAgICAgICAgICAgICAgICAgc29ja2V0LnNodXRkb3duSW5wdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgc29ja2V0LnNodXRkb3duT3V0cHV0KCk7CisgICAgICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1Gcm9tVG9QaXBlPSIgKyBtRnJvbVRvUGlwZSArICIgbVRvRnJvbVBpcGU9IiArIG1Ub0Zyb21QaXBlLCBlKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvRm9yd2FyZGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvRm9yd2FyZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlZjZkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL2ZvcndhcmRlci9Gb3J3YXJkZXIuamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLmZvcndhcmRlcjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBBIHBvcnQgZm9yd2FyZGluZyBzZXJ2ZXIuIExpc3RlbnMgb24gbG9jYWxob3N0IG9uIHNwZWNpZmllZCBwb3J0IGFuZCBmb3J3YXJkcyB0aGUgdGNwCisgKiBjb21tdW5pY2F0aW9ucyB0byBleHRlcm5hbCBzb2NrZXQgdmlhIGFkYiBuZXR3b3JraW5nIHByb3h5LgorICovCitwdWJsaWMgY2xhc3MgRm9yd2FyZGVyIGV4dGVuZHMgVGhyZWFkIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJGb3J3YXJkZXIiOworCisgICAgcHJpdmF0ZSBpbnQgbVBvcnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVJlbW90ZU1hY2hpbmVJcEFkZHJlc3M7CisKKyAgICBwcml2YXRlIEJvb2xlYW4gbUlzUnVubmluZyA9IGZhbHNlOworICAgIHByaXZhdGUgU2VydmVyU29ja2V0IG1TZXJ2ZXJTb2NrZXQ7CisKKyAgICBwcml2YXRlIFNldDxDb25uZWN0aW9uSGFuZGxlcj4gbUNvbm5lY3Rpb25IYW5kbGVycyA9IG5ldyBIYXNoU2V0PENvbm5lY3Rpb25IYW5kbGVyPigpOworCisgICAgcHVibGljIEZvcndhcmRlcihpbnQgcG9ydCwgU3RyaW5nIHJlbW90ZU1hY2hpbmVJcEFkZHJlc3MpIHsKKyAgICAgICAgbVBvcnQgPSBwb3J0OworICAgICAgICBtUmVtb3RlTWFjaGluZUlwQWRkcmVzcyA9IHJlbW90ZU1hY2hpbmVJcEFkZHJlc3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIExvZy5pKExPR19UQUcsICJzdGFydCgpOiBTdGFydGluZyBmb3dhcmRlciBvbiBwb3J0OiAiICsgbVBvcnQpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChtSXNSdW5uaW5nKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgInN0YXJ0KCk6IEZvcndhcmRlciBvbiBwb3J0OiAiICsgbVBvcnQgKyAiIGFscmVhZHkgcnVubmluZyEgTk9PUC4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQobVBvcnQpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAibVBvcnQ9IiArIG1Qb3J0LCBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1Jc1J1bm5pbmcgPSB0cnVlOworICAgICAgICBzdXBlci5zdGFydCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIGlmICghbUlzUnVubmluZykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoqIFRoZXNlIHNvY2tldHMgd2lsbCBiZSBjbG9zZWQgd2hlbiBGb3J3YXJkZXIuc3RvcCgpIGlzIGNhbGxlZCAqLworICAgICAgICAgICAgICAgIFNvY2tldCBsb2NhbFNvY2tldDsKKyAgICAgICAgICAgICAgICBTb2NrZXQgcmVtb3RlU29ja2V0OworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsU29ja2V0ID0gbVNlcnZlclNvY2tldC5hY2NlcHQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3RlU29ja2V0ID0gQWRiVXRpbHMuZ2V0U29ja2V0VG9SZW1vdGVNYWNoaW5lKG1SZW1vdGVNYWNoaW5lSXBBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3J0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8qKiBUaGlzIG1vc3QgbGlrZWx5IG1lYW5zIHRoYXQgbVNlcnZlclNvY2tldCBpcyBhbHJlYWR5IGNsb3NlZCAqLworICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHICsgIm1Qb3J0PSIgKyBtUG9ydCwgZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocmVtb3RlU29ja2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJtUG9ydD0iICsgbVBvcnQsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgInJ1bigpOiBtUG9ydD0gIiArIG1Qb3J0ICsgIiBGYWlsZWQgdG8gc3RhcnQgZm9yd2FyZGluZyBmcm9tICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkhhbmRsZXIgZm9yd2FyZGVyID0gbmV3IENvbm5lY3Rpb25IYW5kbGVyKGxvY2FsU29ja2V0LCByZW1vdGVTb2NrZXQpOworICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSGFuZGxlcnMuYWRkKGZvcndhcmRlcik7CisgICAgICAgICAgICAgICAgZm9yd2FyZGVyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAoIW1Jc1J1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZlclNvY2tldC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAibVBvcnQ9IiArIG1Qb3J0LCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbUlzUnVubmluZyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChDb25uZWN0aW9uSGFuZGxlciBjb25uZWN0aW9uSGFuZGxlciA6IG1Db25uZWN0aW9uSGFuZGxlcnMpIHsKKyAgICAgICAgICAgIGNvbm5lY3Rpb25IYW5kbGVyLnN0b3AoKTsKKyAgICAgICAgfQorICAgICAgICBtQ29ubmVjdGlvbkhhbmRsZXJzLmNsZWFyKCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL2ZvcndhcmRlci9Gb3J3YXJkZXJNYW5hZ2VyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvRm9yd2FyZGVyTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZmVlNGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvRm9yd2FyZGVyTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5mb3J3YXJkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEEgc2ltcGxlIGNsYXNzIHRvIHN0YXJ0IGFuZCBzdG9wIEZvcndhcmRlcnMgcnVubmluZyBvbiBzb21lIHBvcnRzLgorICoKKyAqIEl0IHVzZXMgYSBzaW5nbGV0b24gcGF0dGVybiBhbmQgaXMgdGhyZWFkIHNhZmUuCisgKi8KK3B1YmxpYyBjbGFzcyBGb3J3YXJkZXJNYW5hZ2VyIHsKKyAgICAvKioKKyAgICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgc2VydmVyIHNlcnZpbmcgdGhlIHRlc3RzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUX0lQID0gIjEyNy4wLjAuMSI7CisKKyAgICAvKioKKyAgICAgKiBXZSB1c2UgdGhlc2UgcG9ydHMgYmVjYXVzZSBvdGhlciB3ZWJraXQgcGxhdGZvcm1zIGRvLiBUaGV5IGFyZSBzZXQgdXAgaW4KKyAgICAgKiBleHRlcm5hbC93ZWJraXQvTGF5b3V0VGVzdHMvaHR0cC9jb25mL2FwYWNoZTItZGViaWFuLWh0dHBkLmNvbmYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX1BPUlQgPSA4MDgwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBTX1BPUlQgPSA4NDQzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgRm9yd2FyZGVyTWFuYWdlciBmb3J3YXJkZXJNYW5hZ2VyOworCisgICAgcHJpdmF0ZSBTZXQ8Rm9yd2FyZGVyPiBtU2VydmVyczsKKworICAgIHByaXZhdGUgRm9yd2FyZGVyTWFuYWdlcigpIHsKKyAgICAgICAgbVNlcnZlcnMgPSBuZXcgSGFzaFNldDxGb3J3YXJkZXI+KDIpOworICAgICAgICBtU2VydmVycy5hZGQobmV3IEZvcndhcmRlcihIVFRQX1BPUlQsIEhPU1RfSVApKTsKKyAgICAgICAgbVNlcnZlcnMuYWRkKG5ldyBGb3J3YXJkZXIoSFRUUFNfUE9SVCwgSE9TVF9JUCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEZvcndhcmRlck1hbmFnZXIgZ2V0Rm9yd2FyZGVyTWFuYWdlcigpIHsKKyAgICAgICAgaWYgKGZvcndhcmRlck1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgZm9yd2FyZGVyTWFuYWdlciA9IG5ldyBGb3J3YXJkZXJNYW5hZ2VyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZvcndhcmRlck1hbmFnZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgZm9yIChGb3J3YXJkZXIgc2VydmVyIDogbVNlcnZlcnMpIHsKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB7CisgICAgICAgIGZvciAoRm9yd2FyZGVyIHNlcnZlciA6IG1TZXJ2ZXJzKSB7CisgICAgICAgICAgICBzZXJ2ZXIuZmluaXNoKCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9PbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9zY3JpcHRzdXBwb3J0L09uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWQ0MzY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9PbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnNjcmlwdHN1cHBvcnQ7CisKKy8qKgorICogQ2FsbGJhY2sgdXNlZCB0byBpbmZvcm0gc2NyaXB0c3VwcG9ydC5TdGFydGVyIHRoYXQgZXZlcnl0aGluZyBpcyBmaW5pc2hlZCBhbmQKKyAqIHdlIGNhbiBleGl0CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjayB7CisgICAgcHVibGljIHZvaWQgb25GaW5pc2hlZCgpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3NjcmlwdHN1cHBvcnQvU2NyaXB0VGVzdFJ1bm5lci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9TY3JpcHRUZXN0UnVubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmNThkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3NjcmlwdHN1cHBvcnQvU2NyaXB0VGVzdFJ1bm5lci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0OworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI7CisKKy8qKgorICogRXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIHRvIGFsbG93IHRoZSBzY3JpcHQgdG8gcGFzcyBhcmd1bWVudHMgdG8gdGhlIGFwcGxpY2F0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBTY3JpcHRUZXN0UnVubmVyIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciB7CisgICAgU3RyaW5nIG1UZXN0c1JlbGF0aXZlUGF0aDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBhcmd1bWVudHMpIHsKKyAgICAgICAgbVRlc3RzUmVsYXRpdmVQYXRoID0gYXJndW1lbnRzLmdldFN0cmluZygicGF0aCIpOworICAgICAgICBzdXBlci5vbkNyZWF0ZShhcmd1bWVudHMpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdHNSZWxhdGl2ZVBhdGgoKSB7CisgICAgICAgIHJldHVybiBtVGVzdHNSZWxhdGl2ZVBhdGg7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3NjcmlwdHN1cHBvcnQvU3RhcnRlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9TdGFydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTczMGM4YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3NjcmlwdHN1cHBvcnQvU3RhcnRlci5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5UZXN0c0xpc3RBY3Rpdml0eTsKKworLyoqCisgKiBBIGNsYXNzIHdoaWNoIHByb3ZpZGVzIG1ldGhvZHMgdGhhdCBjYW4gYmUgaW52b2tlZCBieSBhIHNjcmlwdCBydW5uaW5nIG9uIHRoZSBob3N0IG1hY2hpbmUgdG8KKyAqIHJ1biB0aGUgdGVzdHMuCisgKgorICogSXQgc3RhcnRzIGEgVGVzdHNMaXN0QWN0aXZpdHkgYW5kIGRvZXMgbm90IHJldHVybiB1bnRpbCBhbGwgdGhlIHRlc3RzIGZpbmlzaCBleGVjdXRpbmcuCisgKi8KK3B1YmxpYyBjbGFzcyBTdGFydGVyIGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8VGVzdHNMaXN0QWN0aXZpdHk+IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJTdGFydGVyIjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUV2ZXJ5dGhpbmdGaW5pc2hlZDsKKworICAgIHB1YmxpYyBTdGFydGVyKCkgeworICAgICAgICBzdXBlcihUZXN0c0xpc3RBY3Rpdml0eS5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gYWRiIHRvIHN0YXJ0IGV4ZWN1dGluZyB0aGUgdGVzdHMuIEl0IGRvZXNuJ3QgcmV0dXJuCisgICAgICogdW50aWwgZXZlcnl0aGluZyBpcyBmaW5pc2hlZCBzbyB0aGF0IHRoZSBzY3JpcHQgY2FuIHdhaXQgZm9yIHRoZSBlbmQgaWYgaXQgbmVlZHMKKyAgICAgKiB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydExheW91dFRlc3RzKCkgeworICAgICAgICBTY3JpcHRUZXN0UnVubmVyIHJ1bm5lciA9IChTY3JpcHRUZXN0UnVubmVyKWdldEluc3RydW1lbnRhdGlvbigpOworICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoID0gcnVubmVyLmdldFRlc3RzUmVsYXRpdmVQYXRoKCk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZSgiY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyIiwgIlRlc3RzTGlzdEFjdGl2aXR5Iik7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9SVU4pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdHNMaXN0QWN0aXZpdHkuRVhUUkFfVEVTVF9QQVRILCByZWxhdGl2ZVBhdGgpOworICAgICAgICBzZXRBY3Rpdml0eUludGVudChpbnRlbnQpOworICAgICAgICBnZXRBY3Rpdml0eSgpLnJlZ2lzdGVyT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjayhuZXcgT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIC8qKiBUaGlzIG1ldGhvZCBpcyBzYWZlIHRvIGNhbGwgb24gYW55IHRocmVhZCAqLworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaGVkKCkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoU3RhcnRlci50aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIG1FdmVyeXRoaW5nRmluaXNoZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBTdGFydGVyLnRoaXMubm90aWZ5QWxsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHdoaWxlICghbUV2ZXJ5dGhpbmdGaW5pc2hlZCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMud2FpdCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgInN0YXJ0TGF5b3V0VGVzdHMoKSIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi91aS9EaXJMaXN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3VpL0Rpckxpc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMGQ3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi91aS9EaXJMaXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnVpOworCitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLkZpbGVGaWx0ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLlRlc3RzTGlzdEFjdGl2aXR5OworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Qcm9ncmVzc0RpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEFuIEFjdGl2aXR5IHRoYXQgYWxsb3dzIG5hdmlnYXRpbmcgdGhyb3VnaCB0ZXN0cyBmb2xkZXJzIGFuZCBjaG9vc2luZyBmb2xkZXJzIG9yIHRlc3RzIHRvIHJ1bi4KKyAqLworcHVibGljIGNsYXNzIERpckxpc3RBY3Rpdml0eSBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJEaXJMaXN0QWN0aXZpdHkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX0RJUl9QQVRIID0KKyAgICAgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgImFuZHJvaWQiICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgIkxheW91dFRlc3RzIjsKKworICAgIC8qKiBUT0RPOiBUaGlzIGlzIGp1c3QgYSBndWVzcyAtIHRoaW5rIG9mIGEgYmV0dGVyIHdheSB0byBhY2hpZXZlIGl0ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FQU5fVElUTEVfQ0hBUl9TSVpFID0gMTM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPR1JFU1NfRElBTE9HX0RFTEFZX01TID0gMjAwOworCisgICAgLyoqIENvZGUgZm9yIHRoZSBkaWFsb2csIHVzZWQgaW4gc2hvd0RpYWxvZyBhbmQgb25DcmVhdGVEaWFsb2cgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElBTE9HX1JVTl9BQk9SVF9ESVIgPSAwOworCisgICAgLyoqIE1lc3NhZ2VzIGNvZGVzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19MT0FERURfSVRFTVMgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0hPV19QUk9HUkVTU19ESUFMT0cgPSAxOworCisgICAgLyoqIEluaXRpYWxpemVkIGxhemlseSBiZWZvcmUgZmlyc3Qgc1Byb2dyZXNzRGlhbG9nLnNob3coKSAqLworICAgIHByaXZhdGUgc3RhdGljIFByb2dyZXNzRGlhbG9nIHNQcm9ncmVzc0RpYWxvZzsKKworICAgIHByaXZhdGUgTGlzdFZpZXcgbUxpc3RWaWV3OworCisgICAgLyoqIFRoaXMgaXMgYSByZWxhdGl2ZSBwYXRoISAqLworICAgIHByaXZhdGUgU3RyaW5nIG1DdXJyZW50RGlyUGF0aDsKKworICAgIC8qKgorICAgICAqIFRPRE86IFRoaXMgc2hvdWxkIG5vdCBiZSBhIGNvbnN0YW50LCBidXQgcmF0aGVyIGJlIGNvbmZpZ3VyYWJsZSBmcm9tIHNvbWV3aGVyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtUm9vdERpclBhdGggPSBST09UX0RJUl9QQVRIOworCisgICAgcHJpdmF0ZSBGaWxlRmlsdGVyIG1GaWxlRmlsdGVyOworCisgICAgLyoqCisgICAgICogQSB0aHJlYWQgcmVzcG9uc2libGUgZm9yIGxvYWRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgZnJvbSBzZCBjYXJkCisgICAgICogYW5kIHNlbmRpbmcgdGhlbSB2aWEgTWVzc2FnZSB0byBtYWluIHRocmVhZCB0aGF0IHRoZW4gbG9hZHMgdGhlbSBpbnRvCisgICAgICogTGlzdFZpZXcKKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIExvYWRMaXN0SXRlbXNUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisKKyAgICAgICAgcHVibGljIExvYWRMaXN0SXRlbXNUaHJlYWQoU3RyaW5nIHJlbGF0aXZlUGF0aCwgSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBtUmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOworICAgICAgICAgICAgbUhhbmRsZXIgPSBoYW5kbGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfTE9BREVEX0lURU1TKTsKKyAgICAgICAgICAgIG1zZy5vYmogPSBnZXREaXJMaXN0KG1SZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcnkgc2ltcGxlIG9iamVjdCB0byB1c2UgaW5zaWRlIExpc3RWaWV3IGFzIGFuIGl0ZW0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdEl0ZW0gaW1wbGVtZW50cyBDb21wYXJhYmxlPExpc3RJdGVtPiB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzRGlyZWN0b3J5OworCisgICAgICAgIHB1YmxpYyBMaXN0SXRlbShTdHJpbmcgcmVsYXRpdmVQYXRoLCBib29sZWFuIGlzRGlyZWN0b3J5KSB7CisgICAgICAgICAgICBtUmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOworICAgICAgICAgICAgbU5hbWUgPSBuZXcgRmlsZShyZWxhdGl2ZVBhdGgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgIG1Jc0RpcmVjdG9yeSA9IGlzRGlyZWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUlzRGlyZWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhMaXN0SXRlbSBhbm90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aC5jb21wYXJlVG8oYW5vdGhlci5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTGlzdEl0ZW0pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aC5lcXVhbHMoKChMaXN0SXRlbSkgbykuZ2V0UmVsYXRpdmVQYXRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aC5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGN1c3RvbSBhZGFwdGVyIHRoYXQgc2V0cyB0aGUgcHJvcGVyIGljb24gYW5kIGxhYmVsIGluIHRoZSBsaXN0IHZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGlyTGlzdEFkYXB0ZXIgZXh0ZW5kcyBBcnJheUFkYXB0ZXI8TGlzdEl0ZW0+IHsKKyAgICAgICAgcHJpdmF0ZSBBY3Rpdml0eSBtQ29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBMaXN0SXRlbVtdIG1JdGVtczsKKworICAgICAgICBwdWJsaWMgRGlyTGlzdEFkYXB0ZXIoQWN0aXZpdHkgY29udGV4dCwgTGlzdEl0ZW1bXSBpdGVtcykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgUi5sYXlvdXQuZGlybGlzdF9yb3csIGl0ZW1zKTsKKworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICAgICAgbUl0ZW1zID0gaXRlbXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gbUNvbnRleHQuZ2V0TGF5b3V0SW5mbGF0ZXIoKTsKKyAgICAgICAgICAgIFZpZXcgcm93ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5kaXJsaXN0X3JvdywgbnVsbCk7CisKKyAgICAgICAgICAgIFRleHRWaWV3IGxhYmVsID0gKFRleHRWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQubGFiZWwpOworICAgICAgICAgICAgbGFiZWwuc2V0VGV4dChtSXRlbXNbcG9zaXRpb25dLmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIEltYWdlVmlldyBpY29uID0gKEltYWdlVmlldykgcm93LmZpbmRWaWV3QnlJZChSLmlkLmljb24pOworICAgICAgICAgICAgaWYgKG1JdGVtc1twb3NpdGlvbl0uaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIGljb24uc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLmZvbGRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGljb24uc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLnJ1bnRlc3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcm93OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIG1GaWxlRmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoUk9PVF9ESVJfUEFUSCk7CisgICAgICAgIG1MaXN0VmlldyA9IGdldExpc3RWaWV3KCk7CisKKyAgICAgICAgbUxpc3RWaWV3LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgICAgICBMaXN0SXRlbSBpdGVtID0gKExpc3RJdGVtKSBwYXJlbnQuZ2V0SXRlbUF0UG9zaXRpb24ocG9zaXRpb24pOworCisgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICBzaG93RGlyKGl0ZW0uZ2V0UmVsYXRpdmVQYXRoKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qKiBSdW4gdGhlIHRlc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LnNldENsYXNzKERpckxpc3RBY3Rpdml0eS50aGlzLCBUZXN0c0xpc3RBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9SVU4pOworICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdHNMaXN0QWN0aXZpdHkuRVhUUkFfVEVTVF9QQVRILCBpdGVtLmdldFJlbGF0aXZlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgbUxpc3RWaWV3LnNldE9uSXRlbUxvbmdDbGlja0xpc3RlbmVyKG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1Mb25nQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25JdGVtTG9uZ0NsaWNrKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgICAgICBMaXN0SXRlbSBpdGVtID0gKExpc3RJdGVtKSBwYXJlbnQuZ2V0SXRlbUF0UG9zaXRpb24ocG9zaXRpb24pOworCisgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYXJndW1lbnRzID0gbmV3IEJ1bmRsZSgxKTsKKyAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzLnB1dFN0cmluZygibmFtZSIsIGl0ZW0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzLnB1dFN0cmluZygicmVsYXRpdmVQYXRoIiwgaXRlbS5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIHNob3dEaWFsb2coRElBTE9HX1JVTl9BQk9SVF9ESVIsIGFyZ3VtZW50cyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyoqIFRPRE86IE1heWJlIHNob3cgc29tZSBpbmZvIGFib3V0IGEgdGVzdD8gKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgLyoqIEFsbCB0aGUgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRlc3Qgcm9vdCBkaXIgd2hlcmUgcG9zc2libGUgKi8KKyAgICAgICAgc2hvd0RpcigiIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgLyoqCisgICAgICogTW92ZXMgdG8gdGhlIHBhcmVudCBkaXJlY3RvcnkgaWYgb25lIGV4aXN0cy4gRG9lcyBub3QgYWxsb3cgdG8gbW92ZSBhYm92ZQorICAgICAqIHRoZSB0ZXN0ICdyb290JyBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25CYWNrUHJlc3NlZCgpIHsKKyAgICAgICAgRmlsZSBjdXJyZW50RGlyUGFyZW50ID0gbmV3IEZpbGUobUN1cnJlbnREaXJQYXRoKS5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgIGlmIChjdXJyZW50RGlyUGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNob3dEaXIoY3VycmVudERpclBhcmVudC5nZXRQYXRoKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2hvd0RpcigiIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50cyB0aGUgYWN0aXZpdHkgZnJvbSByZWNyZWF0aW5nIG9uIGNoYW5nZSBvZiBvcmllbnRhdGlvbi4gVGhlIHRpdGxlIG5lZWRzIHRvCisgICAgICogYmUgcmVjYWxjdWxhdGVkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOworCisgICAgICAgIHNldFRpdGxlKHNob3J0ZW5UaXRsZShtQ3VycmVudERpclBhdGgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKGludCBpZCwgZmluYWwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG51bGw7CisgICAgICAgIEFsZXJ0RGlhbG9nLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKHRoaXMpOworCisgICAgICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgICAgIGNhc2UgRElBTE9HX1JVTl9BQk9SVF9ESVI6CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRUaXRsZShnZXRUZXh0KFIuc3RyaW5nLmRpYWxvZ19ydW5fYWJvcnRfZGlyX3RpdGxlX3ByZWZpeCkgKyAiICIgKworICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5nZXRTdHJpbmcoIm5hbWUiKSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRNZXNzYWdlKFIuc3RyaW5nLmRpYWxvZ19ydW5fYWJvcnRfZGlyX21zZyk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRDYW5jZWxhYmxlKHRydWUpOworCisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRQb3NpdGl2ZUJ1dHRvbihSLnN0cmluZy5kaWFsb2dfcnVuX2Fib3J0X2Rpcl9va19idXR0b24sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVEaWFsb2coRElBTE9HX1JVTl9BQk9SVF9ESVIpOworICAgICAgICAgICAgICAgICAgICAgICAgLyoqIFJ1biB0aGUgdGVzdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuc2V0Q2xhc3MoRGlyTGlzdEFjdGl2aXR5LnRoaXMsIFRlc3RzTGlzdEFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9SVU4pOworICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RzTGlzdEFjdGl2aXR5LkVYVFJBX1RFU1RfUEFUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5nZXRTdHJpbmcoInJlbGF0aXZlUGF0aCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXROZWdhdGl2ZUJ1dHRvbihSLnN0cmluZy5kaWFsb2dfcnVuX2Fib3J0X2Rpcl9hYm9ydF9idXR0b24sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVEaWFsb2coRElBTE9HX1JVTl9BQk9SVF9ESVIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICBkaWFsb2cgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRPbkNhbmNlbExpc3RlbmVyKG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DYW5jZWxMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsKERpYWxvZ0ludGVyZmFjZSBkaWFsb2cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZURpYWxvZyhESUFMT0dfUlVOX0FCT1JUX0RJUik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkaWFsb2c7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgdGhlIGNvbnRlbnRzIG9mIGRpciBpbnRvIHRoZSBsaXN0IHZpZXcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyUGF0aAorICAgICAqICAgICAgZGlyZWN0b3J5IHRvIGxvYWQgaW50byBsaXN0IHZpZXcKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2hvd0RpcihTdHJpbmcgZGlyUGF0aCkgeworICAgICAgICBtQ3VycmVudERpclBhdGggPSBkaXJQYXRoOworCisgICAgICAgIC8qKiBTaG93IHByb2dyZXNzIGRpYWxvZyB3aXRoIGEgZGVsYXkgKi8KKyAgICAgICAgZmluYWwgSGFuZGxlciBkZWxheWVkRGlhbG9nSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IE1TR19TSE9XX1BST0dSRVNTX0RJQUxPRykgeworICAgICAgICAgICAgICAgICAgICBpZiAoc1Byb2dyZXNzRGlhbG9nID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZyA9IG5ldyBQcm9ncmVzc0RpYWxvZyhEaXJMaXN0QWN0aXZpdHkudGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2V0Q2FuY2VsYWJsZShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2V0UHJvZ3Jlc3NTdHlsZShQcm9ncmVzc0RpYWxvZy5TVFlMRV9TUElOTkVSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRUaXRsZShSLnN0cmluZy5kaWFsb2dfcHJvZ3Jlc3NfdGl0bGUpOworICAgICAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldE1lc3NhZ2UoZ2V0VGV4dChSLnN0cmluZy5kaWFsb2dfcHJvZ3Jlc3NfbXNnKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNob3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIE1lc3NhZ2UgbXNnU2hvd0RpYWxvZyA9IGRlbGF5ZWREaWFsb2dIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1NIT1dfUFJPR1JFU1NfRElBTE9HKTsKKyAgICAgICAgZGVsYXllZERpYWxvZ0hhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1zZ1Nob3dEaWFsb2csIFBST0dSRVNTX0RJQUxPR19ERUxBWV9NUyk7CisKKyAgICAgICAgLyoqIERlbGVnYXRlIGxvYWRpbmcgY29udGVudHMgZnJvbSBTRCBjYXJkIHRvIGEgbmV3IHRocmVhZCAqLworICAgICAgICBuZXcgTG9hZExpc3RJdGVtc1RocmVhZChtQ3VycmVudERpclBhdGgsIG5ldyBIYW5kbGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IE1TR19MT0FERURfSVRFTVMpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0TGlzdEFkYXB0ZXIobmV3IERpckxpc3RBZGFwdGVyKERpckxpc3RBY3Rpdml0eS50aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMaXN0SXRlbVtdKW1zZy5vYmopKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsYXllZERpYWxvZ0hhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX1NIT1dfUFJPR1JFU1NfRElBTE9HKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0VGl0bGUoc2hvcnRlblRpdGxlKG1DdXJyZW50RGlyUGF0aCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc1Byb2dyZXNzRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5kaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZmluZCBhIG5lYXQgd2F5IHRvIGRldGVybWluZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IGZpdCBpbiB0aGUgdGl0bGUKKyAgICAgKiBiYXIuCisgICAgICogKi8KKyAgICBwcml2YXRlIFN0cmluZyBzaG9ydGVuVGl0bGUoU3RyaW5nIHRpdGxlKSB7CisgICAgICAgIGlmICh0aXRsZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICByZXR1cm4gIlRlc3RzJyByb290IGRpcjoiOworICAgICAgICB9CisgICAgICAgIGludCBjaGFyQ291bnQgPSBtTGlzdFZpZXcuZ2V0V2lkdGgoKSAvIE1FQU5fVElUTEVfQ0hBUl9TSVpFOworCisgICAgICAgIGlmICh0aXRsZS5sZW5ndGgoKSA+IGNoYXJDb3VudCkgeworICAgICAgICAgICAgcmV0dXJuICIuLi4iICsgdGl0bGUuc3Vic3RyaW5nKHRpdGxlLmxlbmd0aCgpIC0gY2hhckNvdW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0aXRsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXJyYXkgd2l0aCBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgorICAgICAqIEZpcnN0IGl0IGNvbnRhaW5zIHRoZSBzdWJmb2xkZXJzLCB0aGVuIHRoZSBmaWxlcy4gQm90aCBzb3J0ZWQKKyAgICAgKiBhbHBoYWJldGljYWxseS4KKyAgICAgKgorICAgICAqIFRoZSBkaXJQYXRoIGlzIHJlbGF0aXZlLgorICAgICAqLworICAgIHByaXZhdGUgTGlzdEl0ZW1bXSBnZXREaXJMaXN0KFN0cmluZyBkaXJQYXRoKSB7CisgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUobVJvb3REaXJQYXRoLCBkaXJQYXRoKTsKKworICAgICAgICBpZiAoIWRpci5leGlzdHMoKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXN0SXRlbVswXTsKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8TGlzdEl0ZW0+IHN1YkRpcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RJdGVtPigpOworICAgICAgICBMaXN0PExpc3RJdGVtPiBzdWJGaWxlcyA9IG5ldyBBcnJheUxpc3Q8TGlzdEl0ZW0+KCk7CisKKyAgICAgICAgZm9yIChGaWxlIGl0ZW0gOiBkaXIubGlzdEZpbGVzKCkpIHsKKyAgICAgICAgICAgIGlmIChpdGVtLmlzRGlyZWN0b3J5KCkgJiYgRmlsZUZpbHRlci5pc1Rlc3REaXIoaXRlbS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgc3ViRGlycy5hZGQobmV3IExpc3RJdGVtKG1GaWxlRmlsdGVyLmdldFJlbGF0aXZlUGF0aChpdGVtKSwgdHJ1ZSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChGaWxlRmlsdGVyLmlzVGVzdEZpbGUoaXRlbS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgc3ViRmlsZXMuYWRkKG5ldyBMaXN0SXRlbShtRmlsZUZpbHRlci5nZXRSZWxhdGl2ZVBhdGgoaXRlbSksIGZhbHNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHN1YkRpcnMpOworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHN1YkZpbGVzKTsKKworICAgICAgICAvKiogQ29uY2F0ZW5hdGUgdGhlIHR3byBsaXN0cyAqLworICAgICAgICBzdWJEaXJzLmFkZEFsbChzdWJGaWxlcyk7CisKKyAgICAgICAgcmV0dXJuIHN1YkRpcnMudG9BcnJheShuZXcgTGlzdEl0ZW1bc3ViRGlycy5zaXplKCldKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWQubWsgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDc0M2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBId0FjY2VsZXJhdGlvblRlc3QKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Y2JjNDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDIzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aSI+CisKKyAgICA8YXBwbGljYXRpb24KKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iSHdVaSIKKyAgICAgICAgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJ0cnVlIj4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IkFscGhhTGF5ZXJzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX86xTGF5ZXJzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iVGV4dEdhbW1hQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0dhbW1hIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlRleHRHYW1tYUFjdGl2aXR5JFN1YkdhbW1hQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1N1YiBHYW1tYSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGFyZHdhcmVBY2NlbGVyYXRlZD0iZmFsc2UiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJMYXllcnNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfTGF5ZXJzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iWGZlcm1vZGVBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfWGZlcm1vZGVzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJCaXRtYXBzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0JpdG1hcHMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuVHJhbnNsdWNlbnQuTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJCaXRtYXBzQWxwaGFBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfQml0bWFwc0FscGhhIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJCaXRtYXBzUmVjdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9CaXRtYXBzUmVjdCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iTmluZVBhdGNoZXNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfOXBhdGNoIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iUXVpY2tSZWplY3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfUXVpY2tSZWplY3QiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJSb3RhdGlvbkFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9Sb3RhdGlvbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJTaGFkZXJzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1NoYWRlcnMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJUZXh0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1RleHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJMaXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0xpc3QiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJNb3JlU2hhZGVyc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9TaGFkZXJzMiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJDb2xvckZpbHRlcnNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfQ29sb3JGaWx0ZXJzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IkxpbmVzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0xpbmVzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGFyZHdhcmVBY2NlbGVyYXRlZD0iZmFsc2UiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iUGF0aHNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfUGF0aHMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iVHJhbnNmb3JtM2RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfM2QiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iU2ltcGxlUGF0aHNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfU2ltcGxlUGF0aHMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQWR2YW5jZWRCbGVuZEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9BZHZhbmNlZEJsZW5kIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlN0YWNrQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1N0YWNrcyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9pY29uLnBuZyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9pY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGZiZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQxLmpwZyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQxLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjg1MWYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS1oZHBpL3N1bnNldDEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQyLnBuZyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjU4ZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS1oZHBpL3N1bnNldDIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQzLnBuZyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTA4YjI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS1oZHBpL3N1bnNldDMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvaWNvbi5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2ljb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNDBhMTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2ljb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvc3Vuc2V0MS5qcGcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDEuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyODUxZjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvc3Vuc2V0Mi5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNThlZTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvc3Vuc2V0My5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MDhiMjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L2xpc3RfYWN0aXZpdHkueG1sIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvbGlzdF9hY3Rpdml0eS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiYTM3MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L2xpc3RfYWN0aXZpdHkueG1sCkBAIC0wLDAgKzEsNzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgICAgIAorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIzZGlwIgorCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkFkZCIgLz4KKyAgICAgICAgCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjNkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCisKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iUmVtb3ZlIiAvPgorICAgICAgICAKKyAgICA8L0xpbmVhckxheW91dD4KKyAgICAKKyAgICA8TGlzdFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9saXN0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIiAvPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgICAgIAorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIzZGlwIgorCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkFkZCIgLz4KKyAgICAgICAgCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjNkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCisKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iUmVtb3ZlIiAvPgorICAgICAgICAKKyAgICA8L0xpbmVhckxheW91dD4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9zdGFjay54bWwgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9zdGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkMmQ3M2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9zdGFjay54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEZyYW1lTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjBkcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjBkcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxMmRwIgorICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMmRwIgorICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIj4KKyAgICA8U3RhY2tWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhY2tfdmlldyIgCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzNDhweCIgCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzc0cHgiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6Y2FjaGVDb2xvckhpbnQ9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDphdXRvU3RhcnQ9InRydWUiIC8+Cis8L0ZyYW1lTGF5b3V0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvc3RhY2tfaXRlbS54bWwgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9zdGFja19pdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTA0MDE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvc3RhY2tfaXRlbS54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEZyYW1lTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YWNrX2l0ZW0iICAKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCI+IAorICAgIDxGcmFtZUxheW91dCAgCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCI+IAorICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXdfaWNvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjUwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIgLz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbWluaV90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiIC8+CisgICAgPC9GcmFtZUxheW91dD4KKyAgICA8VGV4dFZpZXcgCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIAorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiIC8+Cis8L0ZyYW1lTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3RleHRfbGFyZ2UueG1sIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvdGV4dF9sYXJnZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODViMzc0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3RleHRfbGFyZ2UueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxUZXh0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjZkaXAiCisgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNmRpcCIKKyAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2VJbnZlcnNlIgorICAgIGFuZHJvaWQ6dGV4dD0iV2lkZ2V0ICIvPiAKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3RleHRfbWVkaXVtLnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3RleHRfbWVkaXVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTE5NWU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvdGV4dF9tZWRpdW0ueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxUZXh0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjZkaXAiCisgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNmRpcCIKKyAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtSW52ZXJzZSIKKyAgICBhbmRyb2lkOnRleHQ9IldpZGdldCAiLz4gCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC90ZXh0X3NtYWxsLnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3RleHRfc21hbGwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZWVlNjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC90ZXh0X3NtYWxsLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8VGV4dFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI2ZGlwIgorICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjZkaXAiCisgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsSW52ZXJzZSIKKyAgICBhbmRyb2lkOnRleHQ9IldpZGdldCAiLz4gCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvQWR2YW5jZWRCbGVuZEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvQWR2YW5jZWRCbGVuZEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4MGE2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9BZHZhbmNlZEJsZW5kQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29tcG9zZVNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQWR2YW5jZWRCbGVuZEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgU2hhZGVyc1ZpZXcodGhpcykpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBTaGFkZXJzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIEJpdG1hcFNoYWRlciBtU2NhbGVkU2hhZGVyOworICAgICAgICBwcml2YXRlIGludCBtVGV4V2lkdGg7CisgICAgICAgIHByaXZhdGUgaW50IG1UZXhIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbVBhaW50OworICAgICAgICBwcml2YXRlIGZsb2F0IG1EcmF3V2lkdGg7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbURyYXdIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgTGluZWFyR3JhZGllbnQgbUhvckdyYWRpZW50OworICAgICAgICBwcml2YXRlIENvbXBvc2VTaGFkZXIgbUNvbXBvc2VTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTJTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTNTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTRTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTVTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTZTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1TY2FsZWQyU2hhZGVyOworCisgICAgICAgIFNoYWRlcnNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIEJpdG1hcCB0ZXh0dXJlID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbVRleFdpZHRoID0gdGV4dHVyZS5nZXRXaWR0aCgpOworICAgICAgICAgICAgbVRleEhlaWdodCA9IHRleHR1cmUuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBtRHJhd1dpZHRoID0gbVRleFdpZHRoICogMi4yZjsKKyAgICAgICAgICAgIG1EcmF3SGVpZ2h0ID0gbVRleEhlaWdodCAqIDEuMmY7CisKKyAgICAgICAgICAgIG1TY2FsZWRTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworICAgICAgICAgICAgTWF0cml4IG0yID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTIuc2V0U2NhbGUoMC41ZiwgMC41Zik7CisgICAgICAgICAgICBtU2NhbGVkU2hhZGVyLnNldExvY2FsTWF0cml4KG0yKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVNjYWxlZDJTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworICAgICAgICAgICAgTWF0cml4IG0zID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTMuc2V0U2NhbGUoMC4xZiwgMC4xZik7CisgICAgICAgICAgICBtU2NhbGVkMlNoYWRlci5zZXRMb2NhbE1hdHJpeChtMyk7CisKKyAgICAgICAgICAgIG1Ib3JHcmFkaWVudCA9IG5ldyBMaW5lYXJHcmFkaWVudCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCAwLjBmLAorICAgICAgICAgICAgICAgICAgICBDb2xvci5CTEFDSywgQ29sb3IuV0hJVEUsIFNoYWRlci5UaWxlTW9kZS5DTEFNUCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1Db21wb3NlU2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobVNjYWxlZFNoYWRlciwgbUhvckdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuREFSS0VOKTsKKyAgICAgICAgICAgIG1Db21wb3NlMlNoYWRlciA9IG5ldyBDb21wb3NlU2hhZGVyKG1TY2FsZWRTaGFkZXIsIG1Ib3JHcmFkaWVudCwKKyAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLkxJR0hURU4pOworICAgICAgICAgICAgbUNvbXBvc2UzU2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobVNjYWxlZFNoYWRlciwgbUhvckdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuTVVMVElQTFkpOworICAgICAgICAgICAgbUNvbXBvc2U0U2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobVNjYWxlZFNoYWRlciwgbUhvckdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU0NSRUVOKTsKKyAgICAgICAgICAgIG1Db21wb3NlNVNoYWRlciA9IG5ldyBDb21wb3NlU2hhZGVyKG1TY2FsZWRTaGFkZXIsIG1Ib3JHcmFkaWVudCwKKyAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLkFERCk7CisgICAgICAgICAgICBtQ29tcG9zZTZTaGFkZXIgPSBuZXcgQ29tcG9zZVNoYWRlcihtSG9yR3JhZGllbnQsIG1TY2FsZWRTaGFkZXIsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5PVkVSTEFZKTsKKworICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwLjBmLCA0MC4wZik7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUNvbXBvc2VTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtQ29tcG9zZTJTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtQ29tcG9zZTNTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSg0MC4wZiArIG1EcmF3V2lkdGggKyA0MC4wZiwgNDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlNFNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlNVNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlNlNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvQWxwaGFMYXllcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0FscGhhTGF5ZXJzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjE3YTA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0FscGhhTGF5ZXJzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFscGhhQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQWxwaGFMYXllcnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJId1VpIjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBEaXJ0eUJpdG1hcFZpZXcgY29udGFpbmVyID0gbmV3IERpcnR5Qml0bWFwVmlldyh0aGlzKTsKKworICAgICAgICBDb2xvclZpZXcgY29sb3IgPSBuZXcgQ29sb3JWaWV3KHRoaXMpOworICAgICAgICBjb250YWluZXIuYWRkVmlldyhjb2xvciwgbmV3IERpcnR5Qml0bWFwVmlldy5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgZGlwVG9QeCh0aGlzLCAxMDApLCBkaXBUb1B4KHRoaXMsIDEwMCksIEdyYXZpdHkuQ0VOVEVSKSk7CisKKyAgICAgICAgQWxwaGFBbmltYXRpb24gYSA9IG5ldyBBbHBoYUFuaW1hdGlvbigxLjBmLCAwLjBmKTsKKyAgICAgICAgYS5zZXREdXJhdGlvbigyMDAwKTsKKyAgICAgICAgYS5zZXRSZXBlYXRDb3VudChBbmltYXRpb24uSU5GSU5JVEUpOworICAgICAgICBhLnNldFJlcGVhdE1vZGUoQW5pbWF0aW9uLlJFVkVSU0UpOworICAgICAgICBjb2xvci5zdGFydEFuaW1hdGlvbihhKTsKKworICAgICAgICBzZXRDb250ZW50Vmlldyhjb250YWluZXIpOworICAgIH0KKyAgICAKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCisgICAgc3RhdGljIGludCBkaXBUb1B4KENvbnRleHQgYywgaW50IGRpcCkgeworICAgICAgICByZXR1cm4gKGludCkgKGMuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5ICogZGlwICsgMC41Zik7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIENvbG9yVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBDb2xvclZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JHQigwLCAyNTUsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIERpcnR5Qml0bWFwVmlldyBleHRlbmRzIEZyYW1lTGF5b3V0IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUGFpbnQ7CisKKyAgICAgICAgRGlydHlCaXRtYXBWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisgICAgICAgICAgICBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaERyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgyMDAuMGYsIDAuMGYsIDIyMC4wZiwgMjAuMGYsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMjAuMGYsIDAuMGYsIDQwLjBmLCAyMC4wZik7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiY2xpcFJlY3QgPSAiICsgY2FudmFzLmdldENsaXBCb3VuZHMoKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDEwMC4wZiwgMTAwLjBmLCAxMTAuMGYsIDExMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkJXKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDI1LjBmLCA1LjBmLCAzMC4wZiwgMTAuMGYsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5CVykpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy5zY2FsZSgyLjBmLCAyLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgyMC4wZiwgMC4wZiwgNDAuMGYsIDIwLjBmKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJjbGlwUmVjdCA9ICIgKyBjYW52YXMuZ2V0Q2xpcEJvdW5kcygpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoNTAuMGYsIDUwLjBmLCA2MC4wZiwgNjAuMGYsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5CVykpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInJlamVjdGVkID0gIiArIGNhbnZhcy5xdWlja1JlamVjdCgyNS4wZiwgNS4wZiwgMzAuMGYsIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuRWRnZVR5cGUuQlcpKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDIwLjBmLCAyMC4wZik7CisgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMjAuMGYsIDAuMGYsIDQwLjBmLCAyMC4wZik7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiY2xpcFJlY3QgPSAiICsgY2FudmFzLmdldENsaXBCb3VuZHMoKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDgwLjBmLCA4MC4wZiwgOTAuMGYsIDkwLjBmLAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuRWRnZVR5cGUuQlcpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoMjUuMGYsIDUuMGYsIDMwLjBmLCAxMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkJXKSk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnNjYWxlKDIuMGYsIDIuMGYpOyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLmNsaXBSZWN0KDIwLjBmLCAwLjBmLCA0MC4wZiwgMjAuMGYpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZjAwZmYwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgMjAuMGYsIDIwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMjAuMGYsIDAuMGYsIDQwLjBmLCAyMC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVUbyA9IGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMuc2F2ZUxheWVyQWxwaGEoMC4wZiwgMTAwLjBmLCBnZXRXaWR0aCgpLCAxNTAuMGYsIDEyNywKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkhBU19BTFBIQV9MQVlFUl9TQVZFX0ZMQUcgfCBDYW52YXMuQ0xJUF9UT19MQVlFUl9TQVZFX0ZMQUcpOworICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4ZmYwMDAwZmYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDEwMC4wZiwgNDAuMGYsIDE1MC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmMDBmZmZmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCg0MC4wZiwgMTAwLjBmLCAxNDAuMGYsIDE1MC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmZmYwMGZmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgxNDAuMGYsIDEwMC4wZiwgMjQwLjBmLCAxNTAuMGYsIG1QYWludCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQocmVzdG9yZVRvKTsKKworICAgICAgICAgICAgc3VwZXIuZGlzcGF0Y2hEcmF3KGNhbnZhcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvQml0bWFwc0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvQml0bWFwc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhOGQzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZlhmZXJtb2RlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uU2NhbGVBbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBCaXRtYXBzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBCaXRtYXBzVmlldyB2aWV3ID0gbmV3IEJpdG1hcHNWaWV3KHRoaXMpOworICAgICAgICBmaW5hbCBGcmFtZUxheW91dCBsYXlvdXQgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KHZpZXcsIG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoNDgwLCA4MDAsIEdyYXZpdHkuQ0VOVEVSKSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgICAgIAorICAgICAgICBTY2FsZUFuaW1hdGlvbiBhID0gbmV3IFNjYWxlQW5pbWF0aW9uKDEuMGYsIDIuMGYsIDEuMGYsIDIuMGYsCisgICAgICAgICAgICAgICAgU2NhbGVBbmltYXRpb24uUkVMQVRJVkVfVE9fU0VMRiwgMC41ZiwKKyAgICAgICAgICAgICAgICBTY2FsZUFuaW1hdGlvbi5SRUxBVElWRV9UT19TRUxGLDAuNWYpOworICAgICAgICBhLnNldER1cmF0aW9uKDIwMDApOworICAgICAgICBhLnNldFJlcGVhdENvdW50KEFuaW1hdGlvbi5JTkZJTklURSk7CisgICAgICAgIGEuc2V0UmVwZWF0TW9kZShBbmltYXRpb24uUkVWRVJTRSk7CisgICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJpdG1hcHNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbUJpdG1hcFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDI7CisgICAgICAgIHByaXZhdGUgZmluYWwgUG9ydGVyRHVmZlhmZXJtb2RlIG1Ec3RJbjsKKworICAgICAgICBCaXRtYXBzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtQml0bWFwMSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1CaXRtYXAyID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDIpOworCisgICAgICAgICAgICBtQml0bWFwUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1Ec3RJbiA9IG5ldyBQb3J0ZXJEdWZmWGZlcm1vZGUoUG9ydGVyRHVmZi5Nb2RlLkRTVF9JTik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDAuMGYsIDAuMGYsIG1CaXRtYXBQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgbUJpdG1hcDEuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAyNS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMiwgMC4wZiwgMC4wZiwgbnVsbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1CaXRtYXBQYWludC5zZXRBbHBoYSgxMjcpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBtQml0bWFwMi5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCAwLjBmLCAwLjBmLCBtQml0bWFwUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0QWxwaGEoMjU1KTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgbUJpdG1hcDEuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAyNS4wZik7CisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbUJpdG1hcDIuZ2V0V2lkdGgoKSwgbUJpdG1hcDIuZ2V0SGVpZ2h0KCksIG1CaXRtYXBQYWludCk7CisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0WGZlcm1vZGUobURzdEluKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAyLCAwLjBmLCAwLjBmLCBtQml0bWFwUGFpbnQpOworCisgICAgICAgICAgICBtQml0bWFwUGFpbnQucmVzZXQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzQWxwaGFBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNBbHBoYUFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmZDhmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzQWxwaGFBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQml0bWFwc0FscGhhQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBCaXRtYXBzVmlldyB2aWV3ID0gbmV3IEJpdG1hcHNWaWV3KHRoaXMpOworICAgICAgICBmaW5hbCBGcmFtZUxheW91dCBsYXlvdXQgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KHZpZXcsIG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoNDgwLCA4MDAsIEdyYXZpdHkuQ0VOVEVSKSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJpdG1hcHNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbUJpdG1hcFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDI7CisgICAgICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXAzOworCisgICAgICAgIEJpdG1hcHNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJMb2FkaW5nIHN1bnNldDEsIGRlZmF1bHQgb3B0aW9ucyIpOworICAgICAgICAgICAgbUJpdG1hcDEgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiTG9hZGluZyBzdW5zZXQyLCBkZWZhdWx0IG9wdGlvbnMiKTsKKyAgICAgICAgICAgIG1CaXRtYXAyID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDIpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgIkxvYWRpbmcgc3Vuc2V0MywgZm9yY2luZyBBUkdCLTg4ODgiKTsKKyAgICAgICAgICAgIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBvcHRzID0gbmV3IEJpdG1hcEZhY3RvcnkuT3B0aW9ucygpOworICAgICAgICAgICAgb3B0cy5pblByZWZlcnJlZENvbmZpZyA9IEJpdG1hcC5Db25maWcuQVJHQl84ODg4OworICAgICAgICAgICAgbUJpdG1hcDMgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0Mywgb3B0cyk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiICAgIGhhcyBiaXRtYXAgYWxwaGE/ICIgKyBtQml0bWFwMy5oYXNBbHBoYSgpKTsKKworICAgICAgICAgICAgbUJpdG1hcFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgCisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiPT09PT09PT09PT09PT09PT0gRHJhdyIpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDAuMGYsIDAuMGYsIG1CaXRtYXBQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgbUJpdG1hcDEuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAyNS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMiwgMC4wZiwgMC4wZiwgbnVsbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgbUJpdG1hcDIuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAyNS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMywgMC4wZiwgMC4wZiwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvQml0bWFwc1JlY3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNSZWN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODcyNmMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNSZWN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBCaXRtYXBzUmVjdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZmluYWwgQml0bWFwc1ZpZXcgdmlldyA9IG5ldyBCaXRtYXBzVmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcodmlldyk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJpdG1hcHNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbUJpdG1hcFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDI7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVjdCBtU3JjUmVjdDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWN0RiBtRHN0UmVjdDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWN0RiBtRHN0UmVjdDI7CisKKyAgICAgICAgQml0bWFwc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJpdG1hcDEgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisgICAgICAgICAgICBtQml0bWFwMiA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQyKTsKKworICAgICAgICAgICAgbUJpdG1hcFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0RmlsdGVyQml0bWFwKHRydWUpOworCisgICAgICAgICAgICBmaW5hbCBmbG9hdCBmb3VydGggPSBtQml0bWFwMS5nZXRXaWR0aCgpIC8gNC4wZjsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IGhhbGYgPSBtQml0bWFwMS5nZXRIZWlnaHQoKSAvIDIuMGY7CisgICAgICAgICAgICBtU3JjUmVjdCA9IG5ldyBSZWN0KChpbnQpIGZvdXJ0aCwgKGludCkgKGhhbGYgLSBoYWxmIC8gMi4wZiksCisgICAgICAgICAgICAgICAgICAgIChpbnQpIChmb3VydGggKyBmb3VydGgpLCAoaW50KSAoaGFsZiArIGhhbGYgLyAyLjBmKSk7CisgICAgICAgICAgICBtRHN0UmVjdCA9IG5ldyBSZWN0Rihmb3VydGgsIGhhbGYgLSBoYWxmIC8gMi4wZiwgZm91cnRoICsgZm91cnRoLCBoYWxmICsgaGFsZiAvIDIuMGYpOworICAgICAgICAgICAgbURzdFJlY3QyID0gbmV3IFJlY3RGKGZvdXJ0aCwgaGFsZiAtIGhhbGYgLyAyLjBmLAorICAgICAgICAgICAgICAgICAgICAoZm91cnRoICsgZm91cnRoKSAqIDMuMGYsIChoYWxmICsgaGFsZiAvIDIuMGYpICogMy4wZik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIG1TcmNSZWN0LCBtRHN0UmVjdCwgbUJpdG1hcFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBtQml0bWFwMS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC0xMDAuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCBtU3JjUmVjdCwgbURzdFJlY3QyLCBtQml0bWFwUGFpbnQpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9Db2xvckZpbHRlcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0NvbG9yRmlsdGVyc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDllMWVhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9Db2xvckZpbHRlcnNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvck1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yTWF0cml4Q29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5MaWdodGluZ0NvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQ29sb3JGaWx0ZXJzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBCaXRtYXBzVmlldyB2aWV3ID0gbmV3IEJpdG1hcHNWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50Vmlldyh2aWV3KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQml0bWFwc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAyOworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1Db2xvck1hdHJpeFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1MaWdodGluZ1BhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1CbGVuZFBhaW50OworCisgICAgICAgIEJpdG1hcHNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1CaXRtYXAxID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbUJpdG1hcDIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0Mik7CisKKyAgICAgICAgICAgIG1Db2xvck1hdHJpeFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBmaW5hbCBDb2xvck1hdHJpeCBjb2xvck1hdHJpeCA9IG5ldyBDb2xvck1hdHJpeCgpOworICAgICAgICAgICAgY29sb3JNYXRyaXguc2V0U2F0dXJhdGlvbigwKTsKKyAgICAgICAgICAgIG1Db2xvck1hdHJpeFBhaW50LnNldENvbG9yRmlsdGVyKG5ldyBDb2xvck1hdHJpeENvbG9yRmlsdGVyKGNvbG9yTWF0cml4KSk7CisKKyAgICAgICAgICAgIG1MaWdodGluZ1BhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGlnaHRpbmdQYWludC5zZXRDb2xvckZpbHRlcihuZXcgTGlnaHRpbmdDb2xvckZpbHRlcigweDAwNjBmZmZmLCAweDAwMTAxMDMwKSk7CisKKyAgICAgICAgICAgIG1CbGVuZFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtQmxlbmRQYWludC5zZXRDb2xvckZpbHRlcihuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKDB4N2Y5OTAwNDAsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfT1ZFUikpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgY2FudmFzLmRyYXdBUkdCKDI1NSwgMjU1LCAyNTUsIDI1NSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDAuMGYsIDAuMGYsIG1Db2xvck1hdHJpeFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA1MC4wZiArIG1CaXRtYXAxLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCAwLjBmLCAwLjBmLCBtTGlnaHRpbmdQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNTAuMGYgKyBtQml0bWFwMS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgMC4wZiwgMC4wZiwgbUJsZW5kUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTIwLjBmICsgbUJpdG1hcDEuZ2V0V2lkdGgoKSArIDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDIsIDAuMGYsIDAuMGYsIG1Db2xvck1hdHJpeFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA1MC4wZiArIG1CaXRtYXAyLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAyLCAwLjBmLCAwLjBmLCBtTGlnaHRpbmdQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNTAuMGYgKyBtQml0bWFwMi5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMiwgMC4wZiwgMC4wZiwgbUJsZW5kUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9MYXllcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0xheWVyc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3Y2QxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9MYXllcnNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBMYXllcnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBMYXllcnNWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTGF5ZXJzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIFBhaW50IG1MYXllclBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1SZWN0UGFpbnQ7CisKKyAgICAgICAgTGF5ZXJzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtTGF5ZXJQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVJlY3RQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxNDAuMGYsIDEwMC4wZik7CisKKyAgICAgICAgICAgIC8vY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBjb3VudCA9IGNhbnZhcy5zYXZlTGF5ZXIoMC4wZiwgMC4wZiwgMjAwLjBmLCAxMDAuMGYsIG1MYXllclBhaW50LAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuQUxMX1NBVkVfRkxBRyk7CisKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgMjAwLjBmLCAxMDAuMGYsIG1SZWN0UGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoY291bnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEyNS4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLnNhdmVMYXllcigwLjBmLCAwLjBmLCAyMDAuMGYsIDEwMC4wZiwgbUxheWVyUGFpbnQsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5BTExfU0FWRV9GTEFHKTsKKworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRDb2xvcigweGZmMDBmZjAwKTsKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0QWxwaGEoNTApOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDIwMC4wZiwgMTAwLjBmLCBtUmVjdFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KGNvdW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgyNS4wZiwgMTI1LjBmKTsKKworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRDb2xvcigweGZmMDAwMGZmKTsKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0QWxwaGEoMjU1KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAxMDAuMGYsIDUwLjBmLCBtUmVjdFBhaW50KTsgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxheWVyUGFpbnQuc2V0QWxwaGEoMTI3KTsKKyAgICAgICAgICAgIG1MYXllclBhaW50LnNldFhmZXJtb2RlKG5ldyBQb3J0ZXJEdWZmWGZlcm1vZGUoUG9ydGVyRHVmZi5Nb2RlLlNSQ19PVVQpKTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLnNhdmVMYXllcig1MC4wZiwgMjUuMGYsIDE1MC4wZiwgNzUuMGYsIG1MYXllclBhaW50LAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuQUxMX1NBVkVfRkxBRyk7CisKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoNTAuMGYsIDI1LjBmLCAxNTAuMGYsIDc1LjBmLCBtUmVjdFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KGNvdW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMjUuMGYpOworCisgICAgICAgICAgICBtUmVjdFBhaW50LnNldENvbG9yKDB4ZmYwMDAwZmYpOworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRBbHBoYSgyNTUpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDEwMC4wZiwgNTAuMGYsIG1SZWN0UGFpbnQpOyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICBtTGF5ZXJQYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIG1MYXllclBhaW50LnNldEFscGhhKDEyNyk7CisgICAgICAgICAgICBtTGF5ZXJQYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKFBvcnRlckR1ZmYuTW9kZS5EU1RfQVRPUCkpOworICAgICAgICAgICAgY291bnQgPSBjYW52YXMuc2F2ZUxheWVyKDUwLjBmLCAyNS4wZiwgMTUwLjBmLCA3NS4wZiwgbUxheWVyUGFpbnQsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5BTExfU0FWRV9GTEFHKTsKKworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCg1MC4wZiwgMjUuMGYsIDE1MC4wZiwgNzUuMGYsIG1SZWN0UGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoY291bnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtTGF5ZXJQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0xpbmVzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9MaW5lc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwMGQ0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9MaW5lc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBTaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIExpbmVzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBMaW5lc1ZpZXcgdmlldyA9IG5ldyBMaW5lc1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBMaW5lc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVNtYWxsUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbU1lZGl1bVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1MYXJnZVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcFNoYWRlciBtU2hhZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0W10gbVBvaW50czsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtQWxwaGFQYWludDsKKworICAgICAgICBMaW5lc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJpdG1hcDEgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisKKyAgICAgICAgICAgIG1TbWFsbFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIG1TbWFsbFBhaW50LnNldFN0cm9rZVdpZHRoKDEuMGYpOworCisgICAgICAgICAgICBtTWVkaXVtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0U3Ryb2tlV2lkdGgoNC4wZik7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRDb2xvcigweGZmMDBmZjAwKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFN0cm9rZVdpZHRoKDE1LjBmKTsKKworICAgICAgICAgICAgbUFscGhhUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1BbHBoYVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1BbHBoYVBhaW50LnNldENvbG9yKDB4N2ZmZjAwNTApOworICAgICAgICAgICAgbUFscGhhUGFpbnQuc2V0U3Ryb2tlV2lkdGgoMTAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcihtQml0bWFwMSwgQml0bWFwU2hhZGVyLlRpbGVNb2RlLk1JUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgQml0bWFwU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisKKyAgICAgICAgICAgIG1Qb2ludHMgPSBuZXcgZmxvYXRbXSB7CisgICAgICAgICAgICAgICAgICAgIDYyLjBmLCAwLjBmLCAzMDIuMGYsIDQwMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgMzAyLjBmLCA0MDAuMGYsIDM1Mi4wZiwgNDAwLjBmLAorICAgICAgICAgICAgICAgICAgICAzNTIuMGYsIDQwMC4wZiwgMzUyLjBmLCA1MDAuMGYKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMuZHJhd0FSR0IoMjU1LCAyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTAwLjBmLCAyMC4wZik7CisKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgwLjBmLCAwLjBmLCA0MC4wZiwgNDAwLjBmLCBtU21hbGxQYWludCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmUoNS4wZiwgMC4wZiwgOTUuMGYsIDQwMC4wZiwgbU1lZGl1bVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgyMi4wZiwgMC4wZiwgMTYyLjBmLCA0MDAuMGYsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG1TaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKDQyLjBmLCAwLjBmLCAyMjIuMGYsIDQwMC4wZiwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG51bGwpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmVzKG1Qb2ludHMsIG1BbHBoYVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMjAuMGYsIDAuMGYpOworICAgICAgICAgICAgbUFscGhhUGFpbnQuc2V0U2hhZGVyKG1TaGFkZXIpOyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lcyhtUG9pbnRzLCBtQWxwaGFQYWludCk7CisgICAgICAgICAgICBtQWxwaGFQYWludC5zZXRTaGFkZXIobnVsbCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvTGlzdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvTGlzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRiOTM2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9MaXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBMaXN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREFUQV9MSVNUID0geworICAgICAgICAgICAgIkFmZ2hhbmlzdGFuIiwgIkFsYmFuaWEiLCAiQWxnZXJpYSIsICJBbWVyaWNhbiBTYW1vYSIsICJBbmRvcnJhIiwKKyAgICAgICAgICAgICJBbmdvbGEiLCAiQW5ndWlsbGEiLCAiQW50YXJjdGljYSIsICJBbnRpZ3VhIGFuZCBCYXJidWRhIiwgIkFyZ2VudGluYSIsCisgICAgICAgICAgICAiQXJtZW5pYSIsICJBcnViYSIsICJBdXN0cmFsaWEiLCAiQXVzdHJpYSIsICJBemVyYmFpamFuIiwKKyAgICAgICAgICAgICJCYWhyYWluIiwgIkJhbmdsYWRlc2giLCAiQmFyYmFkb3MiLCAiQmVsYXJ1cyIsICJCZWxnaXVtIiwKKyAgICAgICAgICAgICJCZWxpemUiLCAiQmVuaW4iLCAiQmVybXVkYSIsICJCaHV0YW4iLCAiQm9saXZpYSIsCisgICAgICAgICAgICAiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsICJCb3Rzd2FuYSIsICJCb3V2ZXQgSXNsYW5kIiwgIkJyYXppbCIsCisgICAgICAgICAgICAiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwgIkJyaXRpc2ggVmlyZ2luIElzbGFuZHMiLCAiQnJ1bmVpIiwgIkJ1bGdhcmlhIiwKKyAgICAgICAgICAgICJCdXJraW5hIEZhc28iLCAiQnVydW5kaSIsICJDb3RlIGQnSXZvaXJlIiwgIkNhbWJvZGlhIiwgIkNhbWVyb29uIiwgIkNhbmFkYSIsICJDYXBlIFZlcmRlIiwKKyAgICAgICAgICAgICJDYXltYW4gSXNsYW5kcyIsICJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiLCAiQ2hhZCIsICJDaGlsZSIsICJDaGluYSIsCisgICAgICAgICAgICAiQ2hyaXN0bWFzIElzbGFuZCIsICJDb2NvcyAoS2VlbGluZykgSXNsYW5kcyIsICJDb2xvbWJpYSIsICJDb21vcm9zIiwgIkNvbmdvIiwKKyAgICAgICAgICAgICJDb29rIElzbGFuZHMiLCAiQ29zdGEgUmljYSIsICJDcm9hdGlhIiwgIkN1YmEiLCAiQ3lwcnVzIiwgIkN6ZWNoIFJlcHVibGljIiwKKyAgICAgICAgICAgICJEZW1vY3JhdGljIFJlcHVibGljIG9mIHRoZSBDb25nbyIsICJEZW5tYXJrIiwgIkRqaWJvdXRpIiwgIkRvbWluaWNhIiwgIkRvbWluaWNhbiBSZXB1YmxpYyIsCisgICAgICAgICAgICAiRWFzdCBUaW1vciIsICJFY3VhZG9yIiwgIkVneXB0IiwgIkVsIFNhbHZhZG9yIiwgIkVxdWF0b3JpYWwgR3VpbmVhIiwgIkVyaXRyZWEiLAorICAgICAgICAgICAgIkVzdG9uaWEiLCAiRXRoaW9waWEiLCAiRmFlcm9lIElzbGFuZHMiLCAiRmFsa2xhbmQgSXNsYW5kcyIsICJGaWppIiwgIkZpbmxhbmQiLAorICAgICAgICAgICAgIkZvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBvZiBNYWNlZG9uaWEiLCAiRnJhbmNlIiwgIkZyZW5jaCBHdWlhbmEiLCAiRnJlbmNoIFBvbHluZXNpYSIsCisgICAgICAgICAgICAiRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIiwgIkdhYm9uIiwgIkdlb3JnaWEiLCAiR2VybWFueSIsICJHaGFuYSIsICJHaWJyYWx0YXIiLAorICAgICAgICAgICAgIkdyZWVjZSIsICJHcmVlbmxhbmQiLCAiR3JlbmFkYSIsICJHdWFkZWxvdXBlIiwgIkd1YW0iLCAiR3VhdGVtYWxhIiwgIkd1aW5lYSIsICJHdWluZWEtQmlzc2F1IiwKKyAgICAgICAgICAgICJHdXlhbmEiLCAiSGFpdGkiLCAiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIiwgIkhvbmR1cmFzIiwgIkhvbmcgS29uZyIsICJIdW5nYXJ5IiwKKyAgICAgICAgICAgICJJY2VsYW5kIiwgIkluZGlhIiwgIkluZG9uZXNpYSIsICJJcmFuIiwgIklyYXEiLCAiSXJlbGFuZCIsICJJc3JhZWwiLCAiSXRhbHkiLCAiSmFtYWljYSIsCisgICAgICAgICAgICAiSmFwYW4iLCAiSm9yZGFuIiwgIkthemFraHN0YW4iLCAiS2VueWEiLCAiS2lyaWJhdGkiLCAiS3V3YWl0IiwgIkt5cmd5enN0YW4iLCAiTGFvcyIsCisgICAgICAgICAgICAiTGF0dmlhIiwgIkxlYmFub24iLCAiTGVzb3RobyIsICJMaWJlcmlhIiwgIkxpYnlhIiwgIkxpZWNodGVuc3RlaW4iLCAiTGl0aHVhbmlhIiwgIkx1eGVtYm91cmciLAorICAgICAgICAgICAgIk1hY2F1IiwgIk1hZGFnYXNjYXIiLCAiTWFsYXdpIiwgIk1hbGF5c2lhIiwgIk1hbGRpdmVzIiwgIk1hbGkiLCAiTWFsdGEiLCAiTWFyc2hhbGwgSXNsYW5kcyIsCisgICAgICAgICAgICAiTWFydGluaXF1ZSIsICJNYXVyaXRhbmlhIiwgIk1hdXJpdGl1cyIsICJNYXlvdHRlIiwgIk1leGljbyIsICJNaWNyb25lc2lhIiwgIk1vbGRvdmEiLAorICAgICAgICAgICAgIk1vbmFjbyIsICJNb25nb2xpYSIsICJNb250c2VycmF0IiwgIk1vcm9jY28iLCAiTW96YW1iaXF1ZSIsICJNeWFubWFyIiwgIk5hbWliaWEiLAorICAgICAgICAgICAgIk5hdXJ1IiwgIk5lcGFsIiwgIk5ldGhlcmxhbmRzIiwgIk5ldGhlcmxhbmRzIEFudGlsbGVzIiwgIk5ldyBDYWxlZG9uaWEiLCAiTmV3IFplYWxhbmQiLAorICAgICAgICAgICAgIk5pY2FyYWd1YSIsICJOaWdlciIsICJOaWdlcmlhIiwgIk5pdWUiLCAiTm9yZm9sayBJc2xhbmQiLCAiTm9ydGggS29yZWEiLCAiTm9ydGhlcm4gTWFyaWFuYXMiLAorICAgICAgICAgICAgIk5vcndheSIsICJPbWFuIiwgIlBha2lzdGFuIiwgIlBhbGF1IiwgIlBhbmFtYSIsICJQYXB1YSBOZXcgR3VpbmVhIiwgIlBhcmFndWF5IiwgIlBlcnUiLAorICAgICAgICAgICAgIlBoaWxpcHBpbmVzIiwgIlBpdGNhaXJuIElzbGFuZHMiLCAiUG9sYW5kIiwgIlBvcnR1Z2FsIiwgIlB1ZXJ0byBSaWNvIiwgIlFhdGFyIiwKKyAgICAgICAgICAgICJSZXVuaW9uIiwgIlJvbWFuaWEiLCAiUnVzc2lhIiwgIlJ3YW5kYSIsICJTcW8gVG9tZSBhbmQgUHJpbmNpcGUiLCAiU2FpbnQgSGVsZW5hIiwKKyAgICAgICAgICAgICJTYWludCBLaXR0cyBhbmQgTmV2aXMiLCAiU2FpbnQgTHVjaWEiLCAiU2FpbnQgUGllcnJlIGFuZCBNaXF1ZWxvbiIsCisgICAgICAgICAgICAiU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXMiLCAiU2Ftb2EiLCAiU2FuIE1hcmlubyIsICJTYXVkaSBBcmFiaWEiLCAiU2VuZWdhbCIsCisgICAgICAgICAgICAiU2V5Y2hlbGxlcyIsICJTaWVycmEgTGVvbmUiLCAiU2luZ2Fwb3JlIiwgIlNsb3Zha2lhIiwgIlNsb3ZlbmlhIiwgIlNvbG9tb24gSXNsYW5kcyIsCisgICAgICAgICAgICAiU29tYWxpYSIsICJTb3V0aCBBZnJpY2EiLCAiU291dGggR2VvcmdpYSBhbmQgdGhlIFNvdXRoIFNhbmR3aWNoIElzbGFuZHMiLCAiU291dGggS29yZWEiLAorICAgICAgICAgICAgIlNwYWluIiwgIlNyaSBMYW5rYSIsICJTdWRhbiIsICJTdXJpbmFtZSIsICJTdmFsYmFyZCBhbmQgSmFuIE1heWVuIiwgIlN3YXppbGFuZCIsICJTd2VkZW4iLAorICAgICAgICAgICAgIlN3aXR6ZXJsYW5kIiwgIlN5cmlhIiwgIlRhaXdhbiIsICJUYWppa2lzdGFuIiwgIlRhbnphbmlhIiwgIlRoYWlsYW5kIiwgIlRoZSBCYWhhbWFzIiwKKyAgICAgICAgICAgICJUaGUgR2FtYmlhIiwgIlRvZ28iLCAiVG9rZWxhdSIsICJUb25nYSIsICJUcmluaWRhZCBhbmQgVG9iYWdvIiwgIlR1bmlzaWEiLCAiVHVya2V5IiwKKyAgICAgICAgICAgICJUdXJrbWVuaXN0YW4iLCAiVHVya3MgYW5kIENhaWNvcyBJc2xhbmRzIiwgIlR1dmFsdSIsICJWaXJnaW4gSXNsYW5kcyIsICJVZ2FuZGEiLAorICAgICAgICAgICAgIlVrcmFpbmUiLCAiVW5pdGVkIEFyYWIgRW1pcmF0ZXMiLCAiVW5pdGVkIEtpbmdkb20iLAorICAgICAgICAgICAgIlVuaXRlZCBTdGF0ZXMiLCAiVW5pdGVkIFN0YXRlcyBNaW5vciBPdXRseWluZyBJc2xhbmRzIiwgIlVydWd1YXkiLCAiVXpiZWtpc3RhbiIsCisgICAgICAgICAgICAiVmFudWF0dSIsICJWYXRpY2FuIENpdHkiLCAiVmVuZXp1ZWxhIiwgIlZpZXRuYW0iLCAiV2FsbGlzIGFuZCBGdXR1bmEiLCAiV2VzdGVybiBTYWhhcmEiLAorICAgICAgICAgICAgIlllbWVuIiwgIll1Z29zbGF2aWEiLCAiWmFtYmlhIiwgIlppbWJhYndlIgorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lmxpc3RfYWN0aXZpdHkpOworCisgICAgICAgIExpc3RBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgU2ltcGxlTGlzdEFkYXB0ZXIodGhpcyk7CisKKyAgICAgICAgTGlzdFZpZXcgbGlzdCA9IChMaXN0VmlldykgZmluZFZpZXdCeUlkKFIuaWQubGlzdCk7CisgICAgICAgIGxpc3Quc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgCisgICAgICAgIHJlZ2lzdGVyRm9yQ29udGV4dE1lbnUobGlzdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51LCBWaWV3IHYsIENvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbyBtZW51SW5mbykgeworICAgICAgICBzdXBlci5vbkNyZWF0ZUNvbnRleHRNZW51KG1lbnUsIHYsIG1lbnVJbmZvKTsKKyAgICAgICAgbWVudS5zZXRIZWFkZXJUaXRsZSgiQ29udGV4dCBtZW51Iik7CisgICAgICAgIG1lbnUuYWRkKCJMaXN0IGl0ZW0gMSIpOworICAgICAgICBtZW51LmFkZCgiTGlzdCBpdGVtIDIiKTsKKyAgICAgICAgbWVudS5hZGQoIkxpc3QgaXRlbSAzIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2ltcGxlTGlzdEFkYXB0ZXIgZXh0ZW5kcyBBcnJheUFkYXB0ZXI8U3RyaW5nPiB7CisgICAgICAgIHB1YmxpYyBTaW1wbGVMaXN0QWRhcHRlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8xLCBEQVRBX0xJU1QpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICBUZXh0VmlldyB2ID0gKFRleHRWaWV3KSBzdXBlci5nZXRWaWV3KHBvc2l0aW9uLCBjb252ZXJ0VmlldywgcGFyZW50KTsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOworICAgICAgICAgICAgZmluYWwgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IHIuZ2V0RGlzcGxheU1ldHJpY3MoKTsKKyAgICAgICAgICAgIHYuc2V0Q29tcG91bmREcmF3YWJsZVBhZGRpbmcoKGludCkgKDYgKiBtZXRyaWNzLmRlbnNpdHkgKyAwLjVmKSk7CisgICAgICAgICAgICB2LnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhyLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNvbiksCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL01vcmVTaGFkZXJzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9Nb3JlU2hhZGVyc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzZWViYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9Nb3JlU2hhZGVyc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBTaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29tcG9zZVNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkxpZ2h0aW5nQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5MaW5lYXJHcmFkaWVudDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIE1vcmVTaGFkZXJzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBTaGFkZXJzVmlldyh0aGlzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFNoYWRlcnNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1TY2FsZWRTaGFkZXI7CisgICAgICAgIHByaXZhdGUgaW50IG1UZXhXaWR0aDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVRleEhlaWdodDsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbURyYXdXaWR0aDsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtRHJhd0hlaWdodDsKKyAgICAgICAgcHJpdmF0ZSBMaW5lYXJHcmFkaWVudCBtSG9yR3JhZGllbnQ7CisgICAgICAgIHByaXZhdGUgTGluZWFyR3JhZGllbnQgbVZlcnRHcmFkaWVudDsKKyAgICAgICAgcHJpdmF0ZSBDb21wb3NlU2hhZGVyIG1Db21wb3NlU2hhZGVyOworICAgICAgICBwcml2YXRlIENvbXBvc2VTaGFkZXIgbUNvbXBvc2UyU2hhZGVyOworICAgICAgICBwcml2YXRlIFBhaW50IG1MYXJnZVBhaW50OworICAgICAgICBwcml2YXRlIEJpdG1hcFNoYWRlciBtU2NhbGVkMlNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBDb2xvckZpbHRlciBtQ29sb3JGaWx0ZXI7CisKKyAgICAgICAgU2hhZGVyc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgQml0bWFwIHRleHR1cmUgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisgICAgICAgICAgICBtVGV4V2lkdGggPSB0ZXh0dXJlLmdldFdpZHRoKCk7CisgICAgICAgICAgICBtVGV4SGVpZ2h0ID0gdGV4dHVyZS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIG1EcmF3V2lkdGggPSBtVGV4V2lkdGggKiAyLjJmOworICAgICAgICAgICAgbURyYXdIZWlnaHQgPSBtVGV4SGVpZ2h0ICogMS4yZjsKKworICAgICAgICAgICAgbVNjYWxlZFNoYWRlciA9IG5ldyBCaXRtYXBTaGFkZXIodGV4dHVyZSwgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisgICAgICAgICAgICBNYXRyaXggbTIgPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICBtMi5zZXRTY2FsZSgwLjVmLCAwLjVmKTsKKyAgICAgICAgICAgIG1TY2FsZWRTaGFkZXIuc2V0TG9jYWxNYXRyaXgobTIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtU2NhbGVkMlNoYWRlciA9IG5ldyBCaXRtYXBTaGFkZXIodGV4dHVyZSwgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisgICAgICAgICAgICBNYXRyaXggbTMgPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICBtMy5zZXRTY2FsZSgwLjFmLCAwLjFmKTsKKyAgICAgICAgICAgIG1TY2FsZWQyU2hhZGVyLnNldExvY2FsTWF0cml4KG0zKTsKKworICAgICAgICAgICAgbUhvckdyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgIENvbG9yLlJFRCwgMHg3ZjAwZmYwMCwgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVZlcnRHcmFkaWVudCA9IG5ldyBMaW5lYXJHcmFkaWVudCgwLjBmLCAwLjBmLCAwLjBmLCBtRHJhd0hlaWdodCAvIDIuMGYsCisgICAgICAgICAgICAgICAgICAgIENvbG9yLllFTExPVywgQ29sb3IuTUFHRU5UQSwgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisKKyAgICAgICAgICAgIG1Db21wb3NlU2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobVNjYWxlZFNoYWRlciwgbUhvckdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX09WRVIpOworICAgICAgICAgICAgbUNvbXBvc2UyU2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobUhvckdyYWRpZW50LCBtU2NhbGVkU2hhZGVyLAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX09VVCk7CisKKyAgICAgICAgICAgIG1Db2xvckZpbHRlciA9IG5ldyBMaWdodGluZ0NvbG9yRmlsdGVyKDB4MDA2MGZmZmYsIDB4MDAxMDEwMzApOworIAorICAgICAgICAgICAgbUxhcmdlUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFRleHRTaXplKDM2LjBmKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldENvbG9yKDB4ZmYwMDAwMDApOworICAgICAgICAgICAgCisgICAgICAgICAgICBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoNDAuMGYsIDQwLjBmKTsKKworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtQ29tcG9zZVNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlMlNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwLjBmICsgbURyYXdXaWR0aCArIDQwLjBmLCA0MC4wZik7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihtSG9yR3JhZGllbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJPcGVuR0wgcmVuZGVyaW5nIiwgMC4wZiwgMjAuMGYsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG1TY2FsZWQyU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiT3BlbkdMIHJlbmRlcmluZyIsIDAuMGYsIDYwLjBmLCBtTGFyZ2VQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihtQ29tcG9zZTJTaGFkZXIpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0Q29sb3JGaWx0ZXIobUNvbG9yRmlsdGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiT3BlbkdMIHJlbmRlcmluZyIsIDAuMGYsIDEwMC4wZiwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0Q29sb3JGaWx0ZXIobnVsbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTaGFkZXIobVZlcnRHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIk9wZW5HTCByZW5kZXJpbmciLCAwLjBmLCAyMC4wZiwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL05pbmVQYXRjaGVzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9OaW5lUGF0Y2hlc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI2OGZiZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9OaW5lUGF0Y2hlc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIE5pbmVQYXRjaGVzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAKKyAgICAgICAgRnJhbWVMYXlvdXQgbGF5b3V0ID0gbmV3IEZyYW1lTGF5b3V0KHRoaXMpOworICAgICAgICBCdXR0b24gYiA9IG5ldyBCdXR0b24odGhpcyk7CisgICAgICAgIGIuc2V0TGF5b3V0UGFyYW1zKG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULCBHcmF2aXR5LkNFTlRFUikpOworICAgICAgICBiLnNldFRleHQoIjkgcGF0Y2hlcyIpOworICAgICAgICBsYXlvdXQuYWRkVmlldyhiKTsKKyAgICAgICAgbGF5b3V0LnNldEJhY2tncm91bmRDb2xvcigweGZmZmZmZmZmKTsKKyAgICAgICAgCisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1BhdGhzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9QYXRoc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkOTk0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9QYXRoc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBTaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFBhdGhzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBQYXRoc1ZpZXcgdmlldyA9IG5ldyBQYXRoc1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBQYXRoc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVNtYWxsUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbU1lZGl1bVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1MYXJnZVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcFNoYWRlciBtU2hhZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIFBhdGggbVBhdGg7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVjdEYgbVBhdGhCb3VuZHM7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUJvdW5kc1BhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwOworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1PZmZzZXQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUxpbmVQYWludDsKKworICAgICAgICBQYXRoc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJpdG1hcDEgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisKKyAgICAgICAgICAgIG1TbWFsbFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIG1TbWFsbFBhaW50LnNldFN0cm9rZVdpZHRoKDEuMGYpOworICAgICAgICAgICAgbVNtYWxsUGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuU1RST0tFKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxpbmVQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUxpbmVQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTGluZVBhaW50LnNldENvbG9yKDB4ZmZmZjAwZmYpOworICAgICAgICAgICAgbUxpbmVQYWludC5zZXRTdHJva2VXaWR0aCgxLjBmKTsKKyAgICAgICAgICAgIG1MaW5lUGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuU1RST0tFKTsKKworICAgICAgICAgICAgbU1lZGl1bVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldENvbG9yKDB4ZmYwMDAwZmYpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFN0cm9rZVdpZHRoKDEwLjBmKTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5TVFJPS0UpOworCisgICAgICAgICAgICBtTGFyZ2VQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0Q29sb3IoMHhmZjAwZmYwMCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTdHJva2VXaWR0aCgxNS4wZik7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5GSUxMKTsKKworICAgICAgICAgICAgbVNoYWRlciA9IG5ldyBCaXRtYXBTaGFkZXIobUJpdG1hcDEsIEJpdG1hcFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIEJpdG1hcFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworCisgICAgICAgICAgICBtUGF0aCA9IG5ldyBQYXRoKCk7CisgICAgICAgICAgICBtUGF0aC5tb3ZlVG8oMC4wZiwgMC4wZik7CisgICAgICAgICAgICBtUGF0aC5jdWJpY1RvKDAuMGYsIDAuMGYsIDEwMC4wZiwgMTUwLjBmLCAxMDAuMGYsIDIwMC4wZik7CisgICAgICAgICAgICBtUGF0aC5jdWJpY1RvKDEwMC4wZiwgMjAwLjBmLCA1MC4wZiwgMzAwLjBmLCAtODAuMGYsIDIwMC4wZik7CisgICAgICAgICAgICBtUGF0aC5jdWJpY1RvKC04MC4wZiwgMjAwLjBmLCAxMDAuMGYsIDIwMC4wZiwgMjAwLjBmLCAwLjBmKTsKKworICAgICAgICAgICAgbVBhdGhCb3VuZHMgPSBuZXcgUmVjdEYoKTsKKyAgICAgICAgICAgIG1QYXRoLmNvbXB1dGVCb3VuZHMobVBhdGhCb3VuZHMsIHRydWUpOworCisgICAgICAgICAgICBtQm91bmRzUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1Cb3VuZHNQYWludC5zZXRDb2xvcigweDQwMDBmZjAwKTsKKworICAgICAgICAgICAgbU9mZnNldCA9IG1NZWRpdW1QYWludC5nZXRTdHJva2VXaWR0aCgpOworICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gKGludCkgKG1QYXRoQm91bmRzLndpZHRoKCkgKyBtT2Zmc2V0ICogMy4wZiArIDAuNWYpOworICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IChpbnQpIChtUGF0aEJvdW5kcy5oZWlnaHQoKSArIG1PZmZzZXQgKiAzLjBmICsgMC41Zik7CisgICAgICAgICAgICBtQml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcCh3aWR0aCwgaGVpZ2h0LCBCaXRtYXAuQ29uZmlnLkFMUEhBXzgpOworICAgICAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMobUJpdG1hcCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC1tUGF0aEJvdW5kcy5sZWZ0ICsgbU9mZnNldCAqIDEuNWYsIC1tUGF0aEJvdW5kcy50b3AgKyBtT2Zmc2V0ICogMS41Zik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVBhdGgsIG1NZWRpdW1QYWludCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMuZHJhd0FSR0IoMjU1LCAyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMjAwLjBmLCA2MC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVBhdGgsIG1TbWFsbFBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgzNTAuMGYsIDAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRoKG1QYXRoLCBtTWVkaXVtUGFpbnQpOworCisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTaGFkZXIobVNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDM1MC4wZiwgMC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVBhdGgsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihudWxsKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDIwMC4wZiwgMzYwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbVNtYWxsUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KG1QYXRoQm91bmRzLCBtQm91bmRzUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDM1MC4wZiwgMC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwLCBtUGF0aEJvdW5kcy5sZWZ0IC0gbU9mZnNldCAqIDEuNWYsCisgICAgICAgICAgICAgICAgICAgIG1QYXRoQm91bmRzLnRvcCAtIG1PZmZzZXQgKiAxLjVmLCBudWxsKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChtUGF0aEJvdW5kcywgbUJvdW5kc1BhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgwLjBmLCAtMzYwLjBmLCAwLjBmLCA1MDAuMGYsIG1MaW5lUGFpbnQpOworCisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTaGFkZXIobVNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDM1MC4wZiwgMC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVBhdGgsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChtUGF0aEJvdW5kcywgbUJvdW5kc1BhaW50KTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihudWxsKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvUXVpY2tSZWplY3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1F1aWNrUmVqZWN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmEyNDlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1F1aWNrUmVqZWN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFF1aWNrUmVqZWN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBRdWlja1JlamVjdFZpZXcgdmlldyA9IG5ldyBRdWlja1JlamVjdFZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBRdWlja1JlamVjdFZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtQml0bWFwUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAxOworCisgICAgICAgIFF1aWNrUmVqZWN0VmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtQml0bWFwMSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKworICAgICAgICAgICAgbUJpdG1hcFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0RmlsdGVyQml0bWFwKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgaW50IGNvdW50ID0gY2FudmFzLmdldFNhdmVDb3VudCgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImNvdW50PSIgKyBjb3VudCk7CisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiY291bnQgYWZ0ZXIgc2F2ZT0iICsgY291bnQpOworICAgICAgICAgICAgY291bnQgPSBjYW52YXMuZ2V0U2F2ZUNvdW50KCk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiZ2V0U2F2ZUNvdW50IGFmdGVyIHNhdmU9IiArIGNvdW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5nZXRTYXZlQ291bnQoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudCBhZnRlciByZXN0b3JlPSIgKyBjb3VudCk7CisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImNvdW50IGFmdGVyIHNhdmU9IiArIGNhbnZhcy5nZXRTYXZlQ291bnQoKSk7CisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImNvdW50IGFmdGVyIHNhdmU9IiArIGNhbnZhcy5nZXRTYXZlQ291bnQoKSk7CisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImNvdW50IGFmdGVyIHNhdmU9IiArIGNhbnZhcy5nZXRTYXZlQ291bnQoKSk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoY291bnQpOworICAgICAgICAgICAgY291bnQgPSBjYW52YXMuZ2V0U2F2ZUNvdW50KCk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiY291bnQgYWZ0ZXIgcmVzdG9yZVRvQ291bnQ9IiArIGNvdW50KTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLnNhdmVMYXllcigwLCAwLCAxMCwgMTAsIG1CaXRtYXBQYWludCwgQ2FudmFzLkFMTF9TQVZFX0ZMQUcpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImNvdW50IGFmdGVyIHNhdmVMYXllcj0iICsgY291bnQpOworICAgICAgICAgICAgY291bnQgPSBjYW52YXMuZ2V0U2F2ZUNvdW50KCk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiZ2V0U2F2ZUNvdW50IGFmdGVyIHNhdmVMYXllcj0iICsgY291bnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLmdldFNhdmVDb3VudCgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImNvdW50IGFmdGVyIHJlc3RvcmU9IiArIGNvdW50KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgwLjBmLCAwLjBmLCA0MC4wZiwgNDAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDAuMGYsIDAuMGYsIG1CaXRtYXBQYWludCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgLW1CaXRtYXAxLmdldFdpZHRoKCksIDAuMGYsIG1CaXRtYXBQYWludCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgNTAuMGYsIDAuMGYsIG1CaXRtYXBQYWludCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9Sb3RhdGlvbkFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvUm90YXRpb25BY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MjljYjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvUm90YXRpb25BY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgUm90YXRpb25BY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgRHJhd2luZ1ZpZXcgY29udGFpbmVyID0gbmV3IERyYXdpbmdWaWV3KHRoaXMpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbnRhaW5lcik7CisgICAgfQorICAgIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKKyAgICBzdGF0aWMgaW50IGRpcFRvUHgoQ29udGV4dCBjLCBpbnQgZGlwKSB7CisgICAgICAgIHJldHVybiAoaW50KSAoYy5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHkgKiBkaXAgKyAwLjVmKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgRHJhd2luZ1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUGFpbnQ7CisKKyAgICAgICAgRHJhd2luZ1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoZGlwVG9QeChnZXRDb250ZXh0KCksIDQwMCksIGRpcFRvUHgoZ2V0Q29udGV4dCgpLCAyMDApKTsKKyAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoNDUuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoLTgwLjBmLCAtODAuMGYsIDgwLjBmLCA4MC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAyMjAuMGYsIDIyMC4wZiwgbVBhaW50KTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvU2hhZGVyc0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvU2hhZGVyc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkMTQyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9TaGFkZXJzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTGluZWFyR3JhZGllbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFNoYWRlcnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcobmV3IFNoYWRlcnNWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgU2hhZGVyc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXBTaGFkZXIgbVJlcGVhdFNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXBTaGFkZXIgbVRyYW5zbGF0ZWRTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1TY2FsZWRTaGFkZXI7CisgICAgICAgIHByaXZhdGUgaW50IG1UZXhXaWR0aDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVRleEhlaWdodDsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbURyYXdXaWR0aDsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtRHJhd0hlaWdodDsKKyAgICAgICAgcHJpdmF0ZSBMaW5lYXJHcmFkaWVudCBtSG9yR3JhZGllbnQ7CisgICAgICAgIHByaXZhdGUgTGluZWFyR3JhZGllbnQgbURpYWdHcmFkaWVudDsKKyAgICAgICAgcHJpdmF0ZSBMaW5lYXJHcmFkaWVudCBtVmVydEdyYWRpZW50OworCisgICAgICAgIFNoYWRlcnNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIEJpdG1hcCB0ZXh0dXJlID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbVRleFdpZHRoID0gdGV4dHVyZS5nZXRXaWR0aCgpOworICAgICAgICAgICAgbVRleEhlaWdodCA9IHRleHR1cmUuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBtRHJhd1dpZHRoID0gbVRleFdpZHRoICogMi4yZjsKKyAgICAgICAgICAgIG1EcmF3SGVpZ2h0ID0gbVRleEhlaWdodCAqIDEuMmY7CisKKyAgICAgICAgICAgIG1SZXBlYXRTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5SRVBFQVQsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5SRVBFQVQpOworCisgICAgICAgICAgICBtVHJhbnNsYXRlZFNoYWRlciA9IG5ldyBCaXRtYXBTaGFkZXIodGV4dHVyZSwgU2hhZGVyLlRpbGVNb2RlLlJFUEVBVCwKKyAgICAgICAgICAgICAgICAgICAgU2hhZGVyLlRpbGVNb2RlLlJFUEVBVCk7CisgICAgICAgICAgICBNYXRyaXggbTEgPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICBtMS5zZXRUcmFuc2xhdGUobVRleFdpZHRoIC8gMi4wZiwgbVRleEhlaWdodCAvIDIuMGYpOworICAgICAgICAgICAgbTEucG9zdFJvdGF0ZSg0NSwgMCwgMCk7CisgICAgICAgICAgICBtVHJhbnNsYXRlZFNoYWRlci5zZXRMb2NhbE1hdHJpeChtMSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1TY2FsZWRTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworICAgICAgICAgICAgTWF0cml4IG0yID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTIuc2V0U2NhbGUoMC41ZiwgMC41Zik7CisgICAgICAgICAgICBtU2NhbGVkU2hhZGVyLnNldExvY2FsTWF0cml4KG0yKTsKKworICAgICAgICAgICAgbUhvckdyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgIENvbG9yLlJFRCwgQ29sb3IuR1JFRU4sIFNoYWRlci5UaWxlTW9kZS5DTEFNUCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1EaWFnR3JhZGllbnQgPSBuZXcgTGluZWFyR3JhZGllbnQoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCAvIDEuNWYsIG1EcmF3SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBDb2xvci5CTFVFLCBDb2xvci5NQUdFTlRBLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgCisgICAgICAgICAgICBtVmVydEdyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAuMGYsIDAuMGYsIDAuMGYsIG1EcmF3SGVpZ2h0IC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IuWUVMTE9XLCBDb2xvci5NQUdFTlRBLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKworICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgLy9jYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgLy8gQml0bWFwIHNoYWRlcnMKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwLjBmLCA0MC4wZik7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobVJlcGVhdFNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1UcmFuc2xhdGVkU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobVNjYWxlZFNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisKKyAgICAgICAgICAgIC8vIEdyYWRpZW50cworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoNDAuMGYgKyBtRHJhd1dpZHRoICsgNDAuMGYsIDQwLjBmKTsKKworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtSG9yR3JhZGllbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtRGlhZ0dyYWRpZW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobVZlcnRHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvU2ltcGxlUGF0aHNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1NpbXBsZVBhdGhzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzFhMTE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1NpbXBsZVBhdGhzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBTaW1wbGVQYXRoc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBGcmFtZUxheW91dCBsYXlvdXQgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgIEVkaXRUZXh0IHRleHQgPSBuZXcgRWRpdFRleHQodGhpcyk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KHRleHQsIG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoNjAwLCAzNTAsIEdyYXZpdHkuQ0VOVEVSKSk7CisgICAgICAgIHRleHQuc2V0VGV4dCgiVGhpcyBpcyBhbiBleGFtcGxlIG9mIGFuIEVkaXRUZXh0IHdpZGdldCBcbiIgKworICAgICAgICAgICAgICAgICJ1c2luZyBzaW1wbGUgcGF0aHMgdG8gY3JlYXRlIHRoZSBzZWxlY3Rpb24uIik7CisgICAgICAgIC8vdGV4dC5zZXRTZWxlY3Rpb24oMCwgdGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9TdGFja0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvU3RhY2tBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOGRiNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvU3RhY2tBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3RhY2tWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgU3RhY2tBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuc3RhY2spOworCisgICAgICAgIFN0YWNrVmlldyBzdGFjayA9IChTdGFja1ZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YWNrX3ZpZXcpOworICAgICAgICBzdGFjay5zZXRBZGFwdGVyKG5ldyBBcnJheUFkYXB0ZXI8RHJhd2FibGU+KHRoaXMsIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8xLAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5pZC50ZXh0MSwgbmV3IERyYXdhYmxlW10geworICAgICAgICAgICAgZ2V0UmVzb3VyY2VzKCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5zdW5zZXQxKSwKKyAgICAgICAgICAgIGdldFJlc291cmNlcygpLmdldERyYXdhYmxlKFIuZHJhd2FibGUuc3Vuc2V0MiksCisgICAgICAgIH0pIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgICAgICBWaWV3IGl0ZW0gPSBjb252ZXJ0VmlldzsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBMYXlvdXRJbmZsYXRlci5mcm9tKGdldENvbnRleHQoKSkuaW5mbGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5zdGFja19pdGVtLCBudWxsLCBmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKChJbWFnZVZpZXcpIGl0ZW0uZmluZFZpZXdCeUlkKFIuaWQudGV4dHZpZXdfaWNvbikpLnNldEltYWdlRHJhd2FibGUoCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRJdGVtKHBvc2l0aW9uICUgZ2V0Q291bnQoKSkpOworICAgICAgICAgICAgICAgICgoVGV4dFZpZXcpIGl0ZW0uZmluZFZpZXdCeUlkKFIuaWQubWluaV90ZXh0KSkuc2V0VGV4dCgiIiArIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHN0YWNrLnNldERpc3BsYXllZENoaWxkKDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9UZXh0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9UZXh0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmU5ZDVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1RleHRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFRleHRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcobmV3IEN1c3RvbVRleHRWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQ3VzdG9tVGV4dFZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtTWVkaXVtUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUxhcmdlUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVN0cmlrZVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1TY2FsZWRQYWludDsKKworICAgICAgICBDdXN0b21UZXh0VmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtTWVkaXVtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRUZXh0U2l6ZSgzNi4wZik7CisKKyAgICAgICAgICAgIG1TdHJpa2VQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVN0cmlrZVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1TdHJpa2VQYWludC5zZXRUZXh0U2l6ZSgxNi4wZik7CisgICAgICAgICAgICBtU3RyaWtlUGFpbnQuc2V0VW5kZXJsaW5lVGV4dCh0cnVlKTsKKworICAgICAgICAgICAgbVNjYWxlZFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtU2NhbGVkUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbVNjYWxlZFBhaW50LnNldFRleHRTaXplKDE2LjBmKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCAyMCwgbU1lZGl1bVBhaW50KTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRUZXh0QWxpZ24oUGFpbnQuQWxpZ24uQ0VOVEVSKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDEwMCwgNDAsIG1NZWRpdW1QYWludCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0VGV4dEFsaWduKFBhaW50LkFsaWduLlJJR0hUKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDEwMCwgNjAsIG1NZWRpdW1QYWludCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0VGV4dEFsaWduKFBhaW50LkFsaWduLkxFRlQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCAxMDAsIG1NZWRpdW1QYWludCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0U2hhZG93TGF5ZXIoMi41ZiwgMC4wZiwgMC4wZiwgMHhmZjAwMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDE1MCwgbU1lZGl1bVBhaW50KTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5jbGVhclNoYWRvd0xheWVyKCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDIwMCwgbUxhcmdlUGFpbnQpOworCisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTaGFkb3dMYXllcigyLjVmLCAzLjBmLCAzLjBmLCAweGZmMDAwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDEwMCwgNDAwLCBtTGFyZ2VQYWludCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTaGFkb3dMYXllcigzLjBmLCAzLjBmLCAzLjBmLCAweGZmMDBmZjAwKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldEFscGhhKDEwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDUwMCwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0QWxwaGEoMjU1KTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LmNsZWFyU2hhZG93TGF5ZXIoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgNTAwLCA0MCwgbVN0cmlrZVBhaW50KTsKKyAgICAgICAgICAgIG1TdHJpa2VQYWludC5zZXRTdHJpa2VUaHJ1VGV4dCh0cnVlKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDUwMCwgNzAsIG1TdHJpa2VQYWludCk7CisgICAgICAgICAgICBtU3RyaWtlUGFpbnQuc2V0VW5kZXJsaW5lVGV4dChmYWxzZSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCA1MDAsIDEwMCwgbVN0cmlrZVBhaW50KTsKKyAgICAgICAgICAgIG1TdHJpa2VQYWludC5zZXRTdHJpa2VUaHJ1VGV4dChmYWxzZSk7CisgICAgICAgICAgICBtU3RyaWtlUGFpbnQuc2V0VW5kZXJsaW5lVGV4dCh0cnVlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVNjYWxlZFBhaW50LnNldFRleHRTY2FsZVgoMC41Zik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCA1MDAsIDIwMCwgbVNjYWxlZFBhaW50KTsKKyAgICAgICAgICAgIG1TY2FsZWRQYWludC5zZXRUZXh0U2NhbGVYKDIuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgNTAwLCAyMzAsIG1TY2FsZWRQYWludCk7CisgICAgICAgICAgICBtU2NhbGVkUGFpbnQuc2V0VGV4dFNjYWxlWCgxLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDUwMCwgMjYwLCBtU2NhbGVkUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLmNsaXBSZWN0KDE1MC4wZiwgMjIwLjBmLCA0NTAuMGYsIDMyMC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDMwMCwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvVGV4dEdhbW1hQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9UZXh0R2FtbWFBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NWNmYTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvVGV4dEdhbW1hQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFRleHRHYW1tYUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBmaW5hbCBMaW5lYXJMYXlvdXQgbGF5b3V0ID0gbmV3IExpbmVhckxheW91dCh0aGlzKTsKKyAgICAgICAgbGF5b3V0LnNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7CisKKyAgICAgICAgZmluYWwgR2FtbWFUZXh0VmlldyBnYW1tYSA9IG5ldyBHYW1tYVRleHRWaWV3KHRoaXMpOworICAgICAgICBsYXlvdXQuYWRkVmlldyhnYW1tYSwgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UCisgICAgICAgICkpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgICAgIAorICAgICAgICBsYXlvdXQucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBCaXRtYXAgYiA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoZ2FtbWEuZ2V0V2lkdGgoKSwgZ2FtbWEuZ2V0SGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgICAgICAgICAgQ2FudmFzIGMgPSBuZXcgQ2FudmFzKGIpOworICAgICAgICAgICAgICAgIGMuZHJhd0NvbG9yKDAsIFBvcnRlckR1ZmYuTW9kZS5DTEVBUik7CisgICAgICAgICAgICAgICAgZ2FtbWEuZHJhdyhjKTsKKworICAgICAgICAgICAgICAgIEltYWdlVmlldyBpbWFnZSA9IG5ldyBJbWFnZVZpZXcoVGV4dEdhbW1hQWN0aXZpdHkudGhpcyk7CisgICAgICAgICAgICAgICAgaW1hZ2Uuc2V0SW1hZ2VCaXRtYXAoYik7CisKKyAgICAgICAgICAgICAgICBsYXlvdXQuYWRkVmlldyhpbWFnZSwgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UCisgICAgICAgICAgICAgICAgKSk7CisKKyAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoVGV4dEdhbW1hQWN0aXZpdHkudGhpcywgU3ViR2FtbWFBY3Rpdml0eS5jbGFzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBnZXRXaW5kb3coKS5zZXRCYWNrZ3JvdW5kRHJhd2FibGUobmV3IENvbG9yRHJhd2FibGUoMHhmZmZmZmZmZikpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBHYW1tYVRleHRWaWV3IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKKyAgICAgICAgR2FtbWFUZXh0VmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kQ29sb3IoMHhmZmZmZmZmZik7CisKKyAgICAgICAgICAgIGZpbmFsIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShjKTsKKyAgICAgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQudGV4dF9sYXJnZSwgdGhpcywgdHJ1ZSk7CisgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnRleHRfbWVkaXVtLCB0aGlzLCB0cnVlKTsKKyAgICAgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQudGV4dF9zbWFsbCwgdGhpcywgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YkdhbW1hQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgICAgICBmaW5hbCBMaW5lYXJMYXlvdXQgbGF5b3V0ID0gbmV3IExpbmVhckxheW91dCh0aGlzKTsKKyAgICAgICAgICAgIGxheW91dC5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOworICAgICAgICAKKyAgICAgICAgICAgIGZpbmFsIEdhbW1hVGV4dFZpZXcgZ2FtbWEgPSBuZXcgR2FtbWFUZXh0Vmlldyh0aGlzKTsKKyAgICAgICAgICAgIGZpbmFsIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UCisgICAgICAgICAgICApOworICAgICAgICAgICAgbHAuc2V0TWFyZ2lucygwLCA3NCwgMCwgMCk7CisgICAgICAgICAgICBsYXlvdXQuYWRkVmlldyhnYW1tYSwgbHApOworCisgICAgICAgICAgICBzZXRDb250ZW50VmlldyhsYXlvdXQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL1RyYW5zZm9ybTNkQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9UcmFuc2Zvcm0zZEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzNGNkZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9UcmFuc2Zvcm0zZEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbWVyYTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFRyYW5zZm9ybTNkQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBUcmFuc2Zvcm0zZFZpZXcgdmlldyA9IG5ldyBUcmFuc2Zvcm0zZFZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBUcmFuc2Zvcm0zZFZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgQ2FtZXJhIG1DYW1lcmE7CisgICAgICAgIHByaXZhdGUgTWF0cml4IG1NYXRyaXg7CisKKyAgICAgICAgVHJhbnNmb3JtM2RWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1CaXRtYXAxID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbUNhbWVyYSA9IG5ldyBDYW1lcmEoKTsKKyAgICAgICAgICAgIG1NYXRyaXggPSBuZXcgTWF0cml4KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMuZHJhd0FSR0IoMjU1LCAyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgZmluYWwgZmxvYXQgY2VudGVyWCA9IGdldFdpZHRoKCkgLyAyLjBmIC0gbUJpdG1hcDEuZ2V0V2lkdGgoKSAvIDIuMGY7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBjZW50ZXJZID0gZ2V0SGVpZ2h0KCkgLyAyLjBmIC0gbUJpdG1hcDEuZ2V0SGVpZ2h0KCkgLyAyLjBmOworICAgICAgICAgICAgZmluYWwgQ2FtZXJhIGNhbWVyYSA9IG1DYW1lcmE7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZpbmFsIE1hdHJpeCBtYXRyaXggPSBtTWF0cml4OworCisgICAgICAgICAgICByb3RhdGUoY2VudGVyWCwgY2VudGVyWSwgY2FtZXJhLCBtYXRyaXgsIDMyLjBmKTsKKyAgICAgICAgICAgIGRyYXdCaXRtYXAoY2FudmFzLCBjZW50ZXJYLCBjZW50ZXJZLCAwLjBmLCBtYXRyaXgpOworCisgICAgICAgICAgICByb3RhdGUoY2VudGVyWCwgY2VudGVyWSwgY2FtZXJhLCBtYXRyaXgsIDEyLjBmKTsKKyAgICAgICAgICAgIGRyYXdCaXRtYXAoY2FudmFzLCBjZW50ZXJYLCBjZW50ZXJZLCAtbUJpdG1hcDEuZ2V0V2lkdGgoKSwgbWF0cml4KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcm90YXRlKGNlbnRlclgsIGNlbnRlclksIGNhbWVyYSwgbWF0cml4LCA1Mi4wZik7CisgICAgICAgICAgICBkcmF3Qml0bWFwKGNhbnZhcywgY2VudGVyWCwgY2VudGVyWSwgbUJpdG1hcDEuZ2V0V2lkdGgoKSwgbWF0cml4KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcm90YXRlKGNlbnRlclgsIGNlbnRlclksIGNhbWVyYSwgbWF0cml4LCAxMjIuMGYpOworICAgICAgICAgICAgZHJhd0JpdG1hcChjYW52YXMsIGNlbnRlclgsIGNlbnRlclksIG1CaXRtYXAxLmdldFdpZHRoKCkgKiAyLjBmLCBtYXRyaXgpOworICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZHJhd0JpdG1hcChDYW52YXMgY2FudmFzLCBmbG9hdCBjZW50ZXJYLCBmbG9hdCBjZW50ZXJZLCBmbG9hdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgTWF0cml4IG1hdHJpeCkgeworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUob2Zmc2V0LCAwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5jb25jYXQobWF0cml4KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCBjZW50ZXJYLCBjZW50ZXJZLCBudWxsKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcm90YXRlKGZsb2F0IGNlbnRlclgsIGZsb2F0IGNlbnRlclksIENhbWVyYSBjYW1lcmEsCisgICAgICAgICAgICAgICAgTWF0cml4IG1hdHJpeCwgZmxvYXQgYW5nbGUpIHsKKyAgICAgICAgICAgIGNhbWVyYS5zYXZlKCk7CisgICAgICAgICAgICBjYW1lcmEucm90YXRlWShhbmdsZSk7CisgICAgICAgICAgICBjYW1lcmEuZ2V0TWF0cml4KG1hdHJpeCk7CisgICAgICAgICAgICBjYW1lcmEucmVzdG9yZSgpOworCisgICAgICAgICAgICBtYXRyaXgucHJlVHJhbnNsYXRlKC1jZW50ZXJYLCAtY2VudGVyWSk7CisgICAgICAgICAgICBtYXRyaXgucG9zdFRyYW5zbGF0ZShjZW50ZXJYLCBjZW50ZXJZKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9YZmVybW9kZUFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvWGZlcm1vZGVBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjODFmMDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2h3dWkvWGZlcm1vZGVBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGU7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBYZmVybW9kZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgCisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBYZmVybW9kZXNWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgWGZlcm1vZGVzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1CbHVlUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVJlZFBhaW50OworCisgICAgICAgIFhmZXJtb2Rlc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJsdWVQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUJsdWVQYWludC5zZXRDb2xvcigweGZmMDAwMGZmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVJlZFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtUmVkUGFpbnQuc2V0Q29sb3IoMHg3ZmZmMDAwMCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgLy9jYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMDAuMGYsIDEwMC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFNSQyBtb2RlcworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5TUkNfT1ZFUik7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuU1JDX0lOKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsgICAgICAgICAgICAKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5TUkNfT1VUKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5TUkNfQVRPUCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuU1JDKTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMDAuMGYsIDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBEU1QgbW9kZXMKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuRFNUX09WRVIpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLkRTVF9JTik7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7ICAgICAgICAgICAgCisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuRFNUX09VVCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuRFNUX0FUT1ApOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLkRTVCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTAwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gT3RoZXIgbW9kZXMKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuQ0xFQVIpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLlhPUik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUJsdWVQYWludC5zZXRBbHBoYSgxMjcpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDUwLjBmLCA1MC4wZiwgbUJsdWVQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUJsdWVQYWludC5zZXRBbHBoYSgxMCk7CisgICAgICAgICAgICBtQmx1ZVBhaW50LnNldENvbG9yKDB4N2YwMDAwZmYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDUwLjBmLCA1MC4wZiwgbUJsdWVQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1CbHVlUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBtQmx1ZVBhaW50LnNldEFscGhhKDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZHJhd1JlY3RzKENhbnZhcyBjYW52YXMsIFBvcnRlckR1ZmYuTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgNTAuMGYsIDUwLjBmLCBtQmx1ZVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMjUuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIG1SZWRQYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKG1vZGUpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCA1MC4wZiwgNTAuMGYsIG1SZWRQYWludCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9nbWFpbC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvYXBwX2dtYWlsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2QzM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9nbWFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9waG9uZS5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvYXBwX3Bob25lLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzJlN2QzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9waG9uZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9jaGF0LnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfY2hhdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiNGUyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfY2hhdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9lbWFpbC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc3RhdHVzYmFyX2VtYWlsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2VmZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9lbWFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9taXNzZWRjYWxsLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfbWlzc2VkY2FsbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlZWMyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfbWlzc2VkY2FsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24xLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4NTI1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24yLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzMDk4NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24zLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3MmI2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb240LnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uNC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhNDBmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9hcHBfZ21haWwucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9nbWFpbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvYXBwX2dtYWlsLnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9nbWFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9hcHBfcGhvbmUucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9waG9uZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvYXBwX3Bob25lLnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9waG9uZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY19zdGF0dXNiYXJfY2hhdC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX2NoYXQucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljX3N0YXR1c2Jhcl9jaGF0LnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N0YXR1c2Jhcl9jaGF0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljX3N0YXR1c2Jhcl9lbWFpbC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX2VtYWlsLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY19zdGF0dXNiYXJfZW1haWwucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX2VtYWlsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljX3N0YXR1c2Jhcl9taXNzZWRjYWxsLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY19zdGF0dXNiYXJfbWlzc2VkY2FsbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNfc3RhdHVzYmFyX21pc3NlZGNhbGwucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX21pc3NlZGNhbGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjEucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb24xLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uMS5wbmcKcmVuYW1lIHRvIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uMi5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbjIucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljb24yLnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb24yLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljb24zLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uMy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjMucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbjMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjQucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb240LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uNC5wbmcKcmVuYW1lIHRvIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3NyYy9jb20vYW5kcm9pZC9zdGF0dXNiYXJ0ZXN0L05vdGlmaWNhdGlvblRlc3RMaXN0LmphdmEgYi90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvTm90aWZpY2F0aW9uVGVzdExpc3QuamF2YQppbmRleCAzNzk3NmVlLi4xNmIzMDAxIDEwMDY0NAotLS0gYS90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvTm90aWZpY2F0aW9uVGVzdExpc3QuamF2YQorKysgYi90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvTm90aWZpY2F0aW9uVGVzdExpc3QuamF2YQpAQCAtNjMzLDIwICs2MzMsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9LAogCi0gICAgICAgIG5ldyBUZXN0KCJUaWNrZXIiKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdCA9IG5ldyBOb3RpZmljYXRpb24oCi0gICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuYXBwX2dtYWlsLCAKLSAgICAgICAgICAgICAgICAgICAgIk5ldyBtYWlsIGZyb20gam9lb0BleGFtcGxlLmNvbSwgb24gdGhlIHRvcGljIG9mIHZlcnkgbG9uZyB0aWNrZXIgdGV4dHMiLAotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gICAgICAgICAgICAgICAgbm90LnNldExhdGVzdEV2ZW50SW5mbyhOb3RpZmljYXRpb25UZXN0TGlzdC50aGlzLAotICAgICAgICAgICAgICAgICAgICAiQSBuZXcgbWVzc2FnZSBhd2FpdHMiLAotICAgICAgICAgICAgICAgICAgICAiVGhlIGNvbnRlbnRzIGFyZSB2ZXJ5IGludGVyZXN0aW5nIGFuZCBpbXBvcnRhbnQiLAotICAgICAgICAgICAgICAgICAgICBtYWtlSW50ZW50KCkpOwotICAgICAgICAgICAgICAgIG1OTS5ub3RpZnkoMSwgbm90KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwKLQogICAgICAgICBuZXcgVGVzdCgiQ3Jhc2giKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3NyYy9jb20vYW5kcm9pZC9zdGF0dXNiYXJ0ZXN0L1N0YXR1c0JhclRlc3QuamF2YSBiL3Rlc3RzL1N0YXR1c0Jhci9zcmMvY29tL2FuZHJvaWQvc3RhdHVzYmFydGVzdC9TdGF0dXNCYXJUZXN0LmphdmEKaW5kZXggMTA3ODcwMS4uYjY2NWQyZiAxMDA2NDQKLS0tIGEvdGVzdHMvU3RhdHVzQmFyL3NyYy9jb20vYW5kcm9pZC9zdGF0dXNiYXJ0ZXN0L1N0YXR1c0JhclRlc3QuamF2YQorKysgYi90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvU3RhdHVzQmFyVGVzdC5qYXZhCkBAIC03Niw3ICs3NiwxNyBAQAogICAgICAgICAgICAgICAgIHdpbi5zZXRBdHRyaWJ1dGVzKHdpblBhcmFtcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0sCi0gICAgICAgIG5ldyBUZXN0KCJmdWxsU2NyZWVuSW50ZW50IikgeworICAgICAgICBuZXcgVGVzdCgiSW1tZXJzaXZlOiBFbnRlciIpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBzZXRJbW1lcnNpdmUodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIG5ldyBUZXN0KCJJbW1lcnNpdmU6IEV4aXQiKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgc2V0SW1tZXJzaXZlKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgbmV3IFRlc3QoIlByaW9yaXR5IG5vdGlmaWNhdGlvbiIpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90ID0gbmV3IE5vdGlmaWNhdGlvbihTdGF0dXNCYXJUZXN0LnRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuc3RhdF9zeXNfcGhvbmUsCkBAIC04Niw4ICs5Niw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoODg4KSA1NTUtNTAzOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBub3QuZmxhZ3MgfD0gTm90aWZpY2F0aW9uLkZMQUdfSElHSF9QUklPUklUWTsKICAgICAgICAgICAgICAgICBJbnRlbnQgZnVsbFNjcmVlbkludGVudCA9IG5ldyBJbnRlbnQoU3RhdHVzQmFyVGVzdC50aGlzLCBUZXN0QWxlcnRBY3Rpdml0eS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaW50IGlkID0gKGludClTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBpbnQgaWQgPSAoaW50KVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOyAvLyBYWFggSEFYCiAgICAgICAgICAgICAgICAgZnVsbFNjcmVlbkludGVudC5wdXRFeHRyYSgiaWQiLCBpZCk7CiAgICAgICAgICAgICAgICAgbm90LmZ1bGxTY3JlZW5JbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KAogICAgICAgICAgICAgICAgICAgICBTdGF0dXNCYXJUZXN0LnRoaXMsCmRpZmYgLS1naXQgYS90b29scy9hYXB0L0NvbW1hbmQuY3BwIGIvdG9vbHMvYWFwdC9Db21tYW5kLmNwcAppbmRleCBiMGYwODZiLi5iNTBhMzkzIDEwMDY0NAotLS0gYS90b29scy9hYXB0L0NvbW1hbmQuY3BwCisrKyBiL3Rvb2xzL2FhcHQvQ29tbWFuZC5jcHAKQEAgLTE5OCw4ICsxOTgsMTAgQEAKICAgICAgICAgaWYgKCZyZXMgPT0gTlVMTCkgewogICAgICAgICAgICAgcHJpbnRmKCJcbk5vIHJlc291cmNlIHRhYmxlIGZvdW5kLlxuIik7CiAgICAgICAgIH0gZWxzZSB7CisjaWZuZGVmIEhBVkVfQU5EUk9JRF9PUwogICAgICAgICAgICAgcHJpbnRmKCJcblJlc291cmNlIHRhYmxlOlxuIik7CiAgICAgICAgICAgICByZXMucHJpbnQoZmFsc2UpOworI2VuZGlmCiAgICAgICAgIH0KIAogICAgICAgICBBc3NldCogbWFuaWZlc3RBc3NldCA9IGFzc2V0cy5vcGVuTm9uQXNzZXQoIkFuZHJvaWRNYW5pZmVzdC54bWwiLApAQCAtMzkwLDggKzM5Miw5IEBACiAgICAgfQogCiAgICAgaWYgKHN0cmNtcCgicmVzb3VyY2VzIiwgb3B0aW9uKSA9PSAwKSB7CisjaWZuZGVmIEhBVkVfQU5EUk9JRF9PUwogICAgICAgICByZXMucHJpbnQoYnVuZGxlLT5nZXRWYWx1ZXMoKSk7Ci0KKyNlbmRpZgogICAgIH0gZWxzZSBpZiAoc3RyY21wKCJ4bWx0cmVlIiwgb3B0aW9uKSA9PSAwKSB7CiAgICAgICAgIGlmIChidW5kbGUtPmdldEZpbGVTcGVjQ291bnQoKSA8IDMpIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IG5vIGR1bXAgeG1sdHJlZSByZXNvdXJjZSBmaWxlIHNwZWNpZmllZFxuIik7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L1BhY2thZ2UuY3BwIGIvdG9vbHMvYWFwdC9QYWNrYWdlLmNwcAppbmRleCA5OTlhNWNmLi4zY2I2MTRmIDEwMDY0NAotLS0gYS90b29scy9hYXB0L1BhY2thZ2UuY3BwCisrKyBiL3Rvb2xzL2FhcHQvUGFja2FnZS5jcHAKQEAgLTQ0MSw3ICs0NDEsNyBAQAogCiBzc2l6ZV90IHByb2Nlc3NKYXJGaWxlcyhCdW5kbGUqIGJ1bmRsZSwgWmlwRmlsZSogemlwKQogewotICAgIHNzaXplX3QgZXJyOworICAgIHN0YXR1c190IGVycjsKICAgICBzc2l6ZV90IGNvdW50ID0gMDsKICAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8Y29uc3QgY2hhcio+JiBqYXJzID0gYnVuZGxlLT5nZXRKYXJGaWxlcygpOwogCmRpZmYgLS1naXQgYS90b29scy9hYXB0L1Jlc291cmNlLmNwcCBiL3Rvb2xzL2FhcHQvUmVzb3VyY2UuY3BwCmluZGV4IDljNWZjZGEyLi4wMTcyOGExIDEwMDY0NAotLS0gYS90b29scy9hYXB0L1Jlc291cmNlLmNwcAorKysgYi90b29scy9hYXB0L1Jlc291cmNlLmNwcApAQCAtNTQyLDExICs1NDIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxBYXB0R3JvdXBFbnRyeSwgc3A8QWFwdEZpbGU+ID4gYmFzZUZpbGVzID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwLT5nZXRGaWxlcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYmFzZUZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJiYXNlRmlsZSAlbGQgaGFzIGZsYXZvciAlc1xuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImJhc2VGaWxlICVkIGhhcyBmbGF2b3IgJXNcbiIsIGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlRmlsZXMua2V5QXQoaSkudG9TdHJpbmcoKS5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBvdmVybGF5RmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIm92ZXJsYXlGaWxlICVsZCBoYXMgZmxhdm9yICVzXG4iLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Zigib3ZlcmxheUZpbGUgJWQgaGFzIGZsYXZvciAlc1xuIiwgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlGaWxlcy5rZXlBdChpKS50b1N0cmluZygpLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTYwLDcgKzU2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUF0KG92ZXJsYXlHcm91cEluZGV4KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZihiYXNlRmlsZUluZGV4IDwgVU5LTk9XTl9FUlJPUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGUtPmdldFZlcmJvc2UoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImZvdW5kIGEgbWF0Y2ggKCVsZCkgZm9yIG92ZXJsYXkgZmlsZSAlcywgZm9yIGZsYXZvciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJmb3VuZCBhIG1hdGNoICglZCkgZm9yIG92ZXJsYXkgZmlsZSAlcywgZm9yIGZsYXZvciAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlRmlsZUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlHcm91cC0+Z2V0TGVhZigpLnN0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlGaWxlcy5rZXlBdChvdmVybGF5R3JvdXBJbmRleCkudG9TdHJpbmcoKS5zdHJpbmcoKSk7CkBAIC0yMDgxLDEyICsyMDgxLDEzIEBACiAgICAgLy8gdGFnOmF0dHJpYnV0ZSBwYWlycyB0aGF0IHNob3VsZCBiZSBjaGVja2VkIGluIGxheW91dCBmaWxlcy4KICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBOYW1lc3BhY2VBdHRyaWJ1dGVQYWlyPiBrTGF5b3V0VGFnQXR0clBhaXJzOwogICAgIGFkZFRhZ0F0dHJQYWlyKCZrTGF5b3V0VGFnQXR0clBhaXJzLCAidmlldyIsIE5VTEwsICJjbGFzcyIpOworICAgIGFkZFRhZ0F0dHJQYWlyKCZrTGF5b3V0VGFnQXR0clBhaXJzLCAiZnJhZ21lbnQiLCBOVUxMLCAiY2xhc3MiKTsKICAgICBhZGRUYWdBdHRyUGFpcigma0xheW91dFRhZ0F0dHJQYWlycywgImZyYWdtZW50IiwgUkVTT1VSQ0VTX0FORFJPSURfTkFNRVNQQUNFLCAibmFtZSIpOwogCiAgICAgLy8gdGFnOmF0dHJpYnV0ZSBwYWlycyB0aGF0IHNob3VsZCBiZSBjaGVja2VkIGluIHhtbCBmaWxlcy4KICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBOYW1lc3BhY2VBdHRyaWJ1dGVQYWlyPiBrWG1sVGFnQXR0clBhaXJzOwogICAgIGFkZFRhZ0F0dHJQYWlyKCZrWG1sVGFnQXR0clBhaXJzLCAiUHJlZmVyZW5jZVNjcmVlbiIsIFJFU09VUkNFU19BTkRST0lEX05BTUVTUEFDRSwgImZyYWdtZW50Iik7Ci0gICAgYWRkVGFnQXR0clBhaXIoJmtYbWxUYWdBdHRyUGFpcnMsICJIZWFkZXIiLCBSRVNPVVJDRVNfQU5EUk9JRF9OQU1FU1BBQ0UsICJmcmFnbWVudCIpOworICAgIGFkZFRhZ0F0dHJQYWlyKCZrWG1sVGFnQXR0clBhaXJzLCAiaGVhZGVyIiwgUkVTT1VSQ0VTX0FORFJPSURfTkFNRVNQQUNFLCAiZnJhZ21lbnQiKTsKIAogICAgIGNvbnN0IFZlY3RvcjxzcDxBYXB0RGlyPiA+JiBkaXJzID0gYXNzZXRzLT5yZXNEaXJzKCk7CiAgICAgY29uc3Qgc2l6ZV90IEsgPSBkaXJzLnNpemUoKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQvUmVzb3VyY2VUYWJsZS5jcHAgYi90b29scy9hYXB0L1Jlc291cmNlVGFibGUuY3BwCmluZGV4IDc1NWI5M2IuLmY0MGE4NzcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvUmVzb3VyY2VUYWJsZS5jcHAKKysrIGIvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcApAQCAtMjM2Niw3ICsyMzY2LDcgQEAKICAgICAgICAgaWYgKGNvbmZpZ1NldC5jb3VudChkZWZhdWx0TG9jYWxlKSA9PSAwKSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgImFhcHQ6IHdhcm5pbmc6IHN0cmluZyAnJXMnIGhhcyBubyBkZWZhdWx0IHRyYW5zbGF0aW9uIGluICVzOyBmb3VuZDoiLAogICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KG5hbWVJdGVyLT5maXJzdCkuc3RyaW5nKCksIG1CdW5kbGUtPmdldFJlc291cmNlU291cmNlRGlycygpWzBdKTsKLSAgICAgICAgICAgIGZvciAoc2V0PFN0cmluZzg+OjppdGVyYXRvciBsb2NhbGVzID0gY29uZmlnU2V0LmJlZ2luKCk7CisgICAgICAgICAgICBmb3IgKHNldDxTdHJpbmc4Pjo6Y29uc3RfaXRlcmF0b3IgbG9jYWxlcyA9IGNvbmZpZ1NldC5iZWdpbigpOwogICAgICAgICAgICAgICAgICBsb2NhbGVzICE9IGNvbmZpZ1NldC5lbmQoKTsKICAgICAgICAgICAgICAgICAgbG9jYWxlcysrKSB7CiAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICIgJXMiLCAoKmxvY2FsZXMpLnN0cmluZygpKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQvU3RyaW5nUG9vbC5jcHAgYi90b29scy9hYXB0L1N0cmluZ1Bvb2wuY3BwCmluZGV4IGEwOWNlYzAuLmUyOGJkZmYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvU3RyaW5nUG9vbC5jcHAKKysrIGIvdG9vbHMvYWFwdC9TdHJpbmdQb29sLmNwcApAQCAtMzAsNyArMzAsNyBAQAogICAgICAgICAgICAgc3RyID0gU3RyaW5nOChwb29sLT5zdHJpbmdBdChzLCAmbGVuKSkuc3RyaW5nKCk7CiAgICAgICAgIH0KIAotICAgICAgICBwcmludGYoIlN0cmluZyAjJWxkOiAlc1xuIiwgcywgc3RyKTsKKyAgICAgICAgcHJpbnRmKCJTdHJpbmcgIyVkOiAlc1xuIiwgcywgc3RyKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQvWE1MTm9kZS5jcHAgYi90b29scy9hYXB0L1hNTE5vZGUuY3BwCmluZGV4IDg1NTFiMGYuLmNlZTg1NDYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvWE1MTm9kZS5jcHAKKysrIGIvdG9vbHMvYWFwdC9YTUxOb2RlLmNwcApAQCAtMjAzLDkgKzIwMywxMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh4bGlmZkRlcHRoID09IDAgJiYgcHNldWRvbG9jYWxpemUpIHsKKyNpZmRlZiBFTkFCTEVfUFNFVURPTE9DQUxJWkUKICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBvcmlnKFN0cmluZzgodGV4dCkuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBzZXVkbyA9IHBzZXVkb2xvY2FsaXplX3N0cmluZyhvcmlnKTsKICAgICAgICAgICAgICAgICBjdXJTdHJpbmcuYXBwZW5kKFN0cmluZzE2KFN0cmluZzgocHNldWRvLmNfc3RyKCkpKSk7CisjZWxzZQorICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisjZW5kaWYKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGlzRm9ybWF0dGVkICYmIGhhc1N1YnN0aXR1dGlvbkVycm9ycyhmaWxlTmFtZSwgaW5YbWwsIHRleHQpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9aaXBGaWxlLmggYi90b29scy9hYXB0L1ppcEZpbGUuaAppbmRleCBkYmJkMDcyLi43ODc3NTUwIDEwMDY0NAotLS0gYS90b29scy9hYXB0L1ppcEZpbGUuaAorKysgYi90b29scy9hYXB0L1ppcEZpbGUuaApAQCAtNTcsNyArNTcsNyBAQAogICAgIC8qCiAgICAgICogT3BlbiBhIG5ldyBvciBleGlzdGluZyBhcmNoaXZlLgogICAgICAqLwotICAgIHR5cGVkZWYgZW51bSB7CisgICAgZW51bSB7CiAgICAgICAgIGtPcGVuUmVhZE9ubHkgICA9IDB4MDEsCiAgICAgICAgIGtPcGVuUmVhZFdyaXRlICA9IDB4MDIsCiAgICAgICAgIGtPcGVuQ3JlYXRlICAgICA9IDB4MDQsICAgICAvLyBjcmVhdGUgaWYgaXQgZG9lc24ndCBleGlzdApkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL1JFQURNRSBiL3Rvb2xzL2xheW91dGxpYi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZlYTliZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xheW91dGxpYi9SRUFETUUKQEAgLTAsMCArMSw0IEBACitMYXlvdXRsaWIgaXMgYSBjdXN0b20gdmVyc2lvbiBvZiB0aGUgYW5kcm9pZCBWaWV3IGZyYW1ld29yayBkZXNpZ25lZCB0byBydW4gaW5zaWRlIEVjbGlwc2UuCitUaGUgZ29hbCBvZiB0aGUgbGlicmFyeSBpcyB0byBwcm92aWRlIGxheW91dCByZW5kZXJpbmcgaW4gRWNsaXBzZSB0aGF0IGFyZSB2ZXJ5IHZlcnkgY2xvc2UgdG8gdGhlaXIgcmVuZGVyaW5nIG9uIGRldmljZXMuCisKK05vbmUgb2YgdGhlIGNvbS5hbmRyb2lkLiogb3IgYW5kcm9pZC4qIGNsYXNzZXMgaW4gbGF5b3V0bGliIHJ1biBvbiBkZXZpY2VzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCmluZGV4IGQ1ZDMxNWUuLjFlMWFiYTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKKysrIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YQpAQCAtNjksMTEgKzY5LDYgQEAKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW4ndCBjcmVhdGUgQ2FudmFzKGludCkiKTsKICAgICB9CiAKLSAgICBwdWJsaWMgQ2FudmFzKGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMIGdsKSB7Ci0gICAgICAgIG1Mb2dnZXIgPSBudWxsOwotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbid0IGNyZWF0ZSBDYW52YXMoamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wpIik7Ci0gICAgfQotCiAgICAgLy8gY3VzdG9tIGNvbnN0cnVjdG9ycyBmb3Igb3VyIHVzZS4KICAgICBwdWJsaWMgQ2FudmFzKGludCB3aWR0aCwgaW50IGhlaWdodCwgSUxheW91dExvZyBsb2dnZXIpIHsKICAgICAgICAgbUxvZ2dlciA9IGxvZ2dlcjsKQEAgLTExNzQsMTUgKzExNjksNiBAQAogICAgIH0KIAogICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzI2dldEdMKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgR0wgZ2V0R0woKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldEdMKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQogICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjZ2V0TWF0cml4KCkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTEyNTcsMTUgKzEyNDMsNiBAQAogICAgIH0KIAogICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzI3NldFZpZXdwb3J0KGludCwgaW50KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHN1cGVyLnNldFZpZXdwb3J0KHdpZHRoLCBoZWlnaHQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKICAgICAgKiBAc2VlIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzI3NrZXcoZmxvYXQsIGZsb2F0KQogICAgICAqLwogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9CcmlkZ2VDb250ZXh0LmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZUNvbnRleHQuamF2YQppbmRleCA3NDRiZmJlLi41OGIxYjZjIDEwMDY0NAotLS0gYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZUNvbnRleHQuamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZUNvbnRleHQuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5UaGVtZTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CkBAIC0xMDU5LDYgKzEwNjAsMTMgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIGFyZzAsIGludCBhcmcxLAorICAgICAgICAgICAgQ3Vyc29yRmFjdG9yeSBhcmcyLCBEYXRhYmFzZUVycm9ySGFuZGxlciBhcmczKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIERyYXdhYmxlIHBlZWtXYWxscGFwZXIoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS92b2lwL2phdmEvYW5kcm9pZC9uZXQvc2lwL1NpcEF1ZGlvQ2FsbEltcGwuamF2YSBiL3ZvaXAvamF2YS9hbmRyb2lkL25ldC9zaXAvU2lwQXVkaW9DYWxsSW1wbC5qYXZhCmluZGV4IDU3ODljZDQuLmI4YWM2ZDcgMTAwNjQ0Ci0tLSBhL3ZvaXAvamF2YS9hbmRyb2lkL25ldC9zaXAvU2lwQXVkaW9DYWxsSW1wbC5qYXZhCisrKyBiL3ZvaXAvamF2YS9hbmRyb2lkL25ldC9zaXAvU2lwQXVkaW9DYWxsSW1wbC5qYXZhCkBAIC0zNiw3ICszNiw2IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQuc2lwLlNpcFByb2ZpbGU7CiBpbXBvcnQgYW5kcm9pZC5uZXQuc2lwLlNpcFNlc3Npb25BZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQubmV0LnNpcC5TaXBTZXNzaW9uU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5WaWJyYXRvcjsKQEAgLTg1LDEzICs4NCwxMCBAQAogICAgIHByaXZhdGUgVG9uZUdlbmVyYXRvciBtUmluZ2JhY2tUb25lOwogCiAgICAgcHJpdmF0ZSBTaXBQcm9maWxlIG1QZW5kaW5nQ2FsbFJlcXVlc3Q7Ci0gICAgcHJpdmF0ZSBXaWZpTWFuYWdlciBtV207Ci0gICAgcHJpdmF0ZSBXaWZpTWFuYWdlci5XaWZpTG9jayBtV2lmaUhpZ2hQZXJmTG9jazsKIAogICAgIHB1YmxpYyBTaXBBdWRpb0NhbGxJbXBsKENvbnRleHQgY29udGV4dCwgU2lwUHJvZmlsZSBsb2NhbFByb2ZpbGUpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtTG9jYWxQcm9maWxlID0gbG9jYWxQcm9maWxlOwotICAgICAgICBtV20gPSAoV2lmaU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJRklfU0VSVklDRSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoU2lwQXVkaW9DYWxsLkxpc3RlbmVyIGxpc3RlbmVyKSB7CkBAIC00MjYsMjggKzQyMiw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgZ3JhYldpZmlIaWdoUGVyZkxvY2soKSB7Ci0gICAgICAgIGlmIChtV2lmaUhpZ2hQZXJmTG9jayA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudihUQUcsICJhY3F1aXJlIHdpZmkgaGlnaCBwZXJmIGxvY2siKTsKLSAgICAgICAgICAgIG1XaWZpSGlnaFBlcmZMb2NrID0gKChXaWZpTWFuYWdlcikKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJRklfU0VSVklDRSkpCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVXaWZpTG9jayhXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTF9ISUdIX1BFUkYsIFRBRyk7Ci0gICAgICAgICAgICBtV2lmaUhpZ2hQZXJmTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVsZWFzZVdpZmlIaWdoUGVyZkxvY2soKSB7Ci0gICAgICAgIGlmIChtV2lmaUhpZ2hQZXJmTG9jayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudihUQUcsICJyZWxlYXNlIHdpZmkgaGlnaCBwZXJmIGxvY2siKTsKLSAgICAgICAgICAgIG1XaWZpSGlnaFBlcmZMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1XaWZpSGlnaFBlcmZMb2NrID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1dpZmlPbigpIHsKLSAgICAgICAgcmV0dXJuIChtV20uZ2V0Q29ubmVjdGlvbkluZm8oKS5nZXRCU1NJRCgpID09IG51bGwpID8gZmFsc2UgOiB0cnVlOwotICAgIH0KLQogICAgIHByaXZhdGUgU2Vzc2lvbkRlc2NyaXB0aW9uIGNyZWF0ZUNvbnRpbnVlU2Vzc2lvbkRlc2NyaXB0aW9uKCkgewogICAgICAgICByZXR1cm4gY3JlYXRlU2RwQnVpbGRlcih0cnVlLCBtQ29kZWMpLmJ1aWxkKCk7CiAgICAgfQpAQCAtNTgyLDcgKzU1Niw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgc3RhcnRDYWxsKFNkcFNlc3Npb25EZXNjcmlwdGlvbiBwZWVyU2QpIHsKICAgICAgICAgc3RvcENhbGwoRE9OVF9SRUxFQVNFX1NPQ0tFVCk7Ci0gICAgICAgIGlmIChpc1dpZmlPbigpKSBncmFiV2lmaUhpZ2hQZXJmTG9jaygpOworCiAgICAgICAgIG1QZWVyU2QgPSBwZWVyU2Q7CiAgICAgICAgIFN0cmluZyBwZWVyTWVkaWFBZGRyZXNzID0gcGVlclNkLmdldFBlZXJNZWRpYUFkZHJlc3MoQVVESU8pOwogICAgICAgICAvLyBUT0RPOiBoYW5kbGUgbXVsdGlwbGUgbWVkaWEgZmllbGRzCkBAIC02NDksNyArNjIzLDYgQEAKIAogICAgIHByaXZhdGUgdm9pZCBzdG9wQ2FsbChib29sZWFuIHJlbGVhc2VTb2NrZXQpIHsKICAgICAgICAgTG9nLmQoVEFHLCAic3RvcCBhdWRpb2NhbGwiKTsKLSAgICAgICAgcmVsZWFzZVdpZmlIaWdoUGVyZkxvY2soKTsKICAgICAgICAgaWYgKG1BdWRpb1N0cmVhbSAhPSBudWxsKSB7CiAgICAgICAgICAgICBtQXVkaW9TdHJlYW0uam9pbihudWxsKTsKIApkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvSVdpZmlNYW5hZ2VyLmFpZGwgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9JV2lmaU1hbmFnZXIuYWlkbAppbmRleCA2ZTBiYzlkLi4xOTEzZmEwIDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9JV2lmaU1hbmFnZXIuYWlkbAorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9JV2lmaU1hbmFnZXIuYWlkbApAQCAtNDAsMTUgKzQwLDE1IEBACiAKICAgICBib29sZWFuIHBpbmdTdXBwbGljYW50KCk7CiAKLSAgICBib29sZWFuIHN0YXJ0U2Nhbihib29sZWFuIGZvcmNlQWN0aXZlKTsKKyAgICB2b2lkIHN0YXJ0U2Nhbihib29sZWFuIGZvcmNlQWN0aXZlKTsKIAogICAgIExpc3Q8U2NhblJlc3VsdD4gZ2V0U2NhblJlc3VsdHMoKTsKIAotICAgIGJvb2xlYW4gZGlzY29ubmVjdCgpOworICAgIHZvaWQgZGlzY29ubmVjdCgpOwogCi0gICAgYm9vbGVhbiByZWNvbm5lY3QoKTsKKyAgICB2b2lkIHJlY29ubmVjdCgpOwogCi0gICAgYm9vbGVhbiByZWFzc29jaWF0ZSgpOworICAgIHZvaWQgcmVhc3NvY2lhdGUoKTsKIAogICAgIFdpZmlJbmZvIGdldENvbm5lY3Rpb25JbmZvKCk7CiAKQEAgLTg1LDUgKzg1LDIxIEBACiAgICAgV2lmaUNvbmZpZ3VyYXRpb24gZ2V0V2lmaUFwQ29uZmlndXJhdGlvbigpOwogCiAgICAgdm9pZCBzZXRXaWZpQXBDb25maWd1cmF0aW9uKGluIFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcpOworCisgICAgdm9pZCBzdGFydFdpZmkoKTsKKworICAgIHZvaWQgc3RvcFdpZmkoKTsKKworICAgIHZvaWQgYWRkVG9CbGFja2xpc3QoU3RyaW5nIGJzc2lkKTsKKworICAgIHZvaWQgY2xlYXJCbGFja2xpc3QoKTsKKworICAgIHZvaWQgY29ubmVjdE5ldHdvcmtXaXRoQ29uZmlnKGluIFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcpOworCisgICAgdm9pZCBjb25uZWN0TmV0d29ya1dpdGhJZChpbnQgbmV0d29ya0lkKTsKKworICAgIHZvaWQgc2F2ZU5ldHdvcmsoaW4gV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZyk7CisKKyAgICB2b2lkIGZvcmdldE5ldHdvcmsoaW50IG5ldHdvcmtJZCk7CiB9CiAKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWdTdG9yZS5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUNvbmZpZ1N0b3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhkNWI3ZQotLS0gL2Rldi9udWxsCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWdTdG9yZS5qYXZhCkBAIC0wLDAgKzEsNjgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldC53aWZpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbi5TdGF0dXM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIEFQSSB0byBtYW5hZ2UgY29uZmlndXJlZAorICogd2lmaSBuZXR3b3Jrcy4gVGhlIEFQSSBpcyBub3QgdGhyZWFkIHNhZmUgaXMgYmVpbmcKKyAqIHVzZWQgb25seSBmcm9tIFdpZmlTdGF0ZU1hY2hpbmUuCisgKgorICogSXQgZGVhbHMgd2l0aCB0aGUgZm9sbG93aW5nCisgKiAtIEFkZC91cGRhdGUvcmVtb3ZlIGEgV2lmaUNvbmZpZ3VyYXRpb24KKyAqIC0gTWFpbnRhaW4gYSBsaXN0IG9mIGNvbmZpZ3VyZWQgbmV0d29ya3MgZm9yIHF1aWNrIGFjY2VzcworICogVE9ETzoKKyAqIC0gaGFuZGxlIHN0YXRpYyBJUCBwZXIgY29uZmlndXJhdGlvbgorICogLSBoYW5kbGUgcHJveHkgcGVyIGNvbmZpZ3VyYXRpb24KKyAqLworY2xhc3MgV2lmaUNvbmZpZ1N0b3JlIHsKKworICAgIHByaXZhdGUgc3RhdGljIENvbnRleHQgc0NvbnRleHQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJXaWZpQ29uZmlnU3RvcmUiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxXaWZpQ29uZmlndXJhdGlvbj4gc0NvbmZpZ3VyZWROZXR3b3JrcyA9IG5ldyBBcnJheUxpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+KCk7CisgICAgLyogVHJhY2tzIHRoZSBoaWdoZXN0IHByaW9yaXR5IG9mIGNvbmZpZ3VyZWQgbmV0d29ya3MgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc0xhc3RQcmlvcml0eSA9IC0xOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBjb250ZXh0LCBmZXRjaCB0aGUgbGlzdCBvZiBjb25maWd1cmVkIG5ldHdvcmtzCisgICAgICogYW5kIGVuYWJsZSBhbGwgc3RvcmVkIG5ldHdvcmtzIGluIHN1cHBsaWNhbnQuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiVXBkYXRpbmcgY29uZmlnIGFuZCBlbmFibGluZyBhbGwgbmV0d29ya3MiKTsKKyAgICAgICAgc0NvbnRleHQgPSBjb250ZXh0OworICAgICAgICB1cGRhdGVDb25maWd1cmVkTmV0d29ya3MoKTsKKyAgICAgICAgZW5hYmxlQWxsTmV0d29ya3MoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGZXRjaCB0aGUgbGlzdCBvZiBjdXJyZW50bHkgY29uZmlndXJlZCBuZXR3b3JrcworICAgICAqIEByZXR1cm4gTGlzdCBvZiBuZXR3b3JrcworICAgICAqLworICAgIHN0YXRpYyBMaXN0PFdpZmlDb25maWd1cmF0aW9uPiBnZXRDb25maWd1cmVkTmV0d29ya3MoKSB7CisgICAgICAgIExpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+IG5ldHdvcmtzID0gbmV3IEFycmF5TGlzdDxXaWZpQ29uZmlndXJhdGlvbj4oKTsKKyAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA6IHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgICAgICBuZXR3b3Jrcy5hZGQoY29uZmlnLmNsb25lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXR3b3JrczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBlbmFibGUgYWxsIG5ldHdvcmtzIGFuZCBzYXZlIGNvbmZpZy4gVGhpcyB3aWxsIGJlIGEgbm8tb3AgaWYgdGhlIGxpc3QKKyAgICAgKiBvZiBjb25maWd1cmVkIG5ldHdvcmtzIGluZGljYXRlcyBhbGwgbmV0d29ya3MgYXMgYmVpbmcgZW5hYmxlZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGVuYWJsZUFsbE5ldHdvcmtzKCkgeworICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA6IHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgIGlmKGNvbmZpZyAhPSBudWxsICYmIGNvbmZpZy5zdGF0dXMgPT0gU3RhdHVzLkRJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5lbmFibGVOZXR3b3JrQ29tbWFuZChjb25maWcubmV0d29ya0lkLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBXaWZpTmF0aXZlLnNhdmVDb25maWdDb21tYW5kKCk7CisgICAgICAgIHVwZGF0ZUNvbmZpZ0FuZFNlbmRDaGFuZ2VCcm9hZGNhc3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3RzIHRoZSBzcGVjaWZpZWQgbmV0d29yayBjb25maWcgZm9yIGNvbm5lY3Rpb24uIFRoaXMgaW52b2x2ZXMKKyAgICAgKiBhZGRpdGlvbi91cGRhdGUgb2YgdGhlIHNwZWNpZmllZCBjb25maWcsIHVwZGF0aW5nIHRoZSBwcmlvcml0eSBvZgorICAgICAqIGFsbCB0aGUgbmV0d29ya3MgYW5kIGVuYWJsaW5nIHRoZSBnaXZlbiBuZXR3b3JrIHdoaWxlIGRpc2FibGluZyBvdGhlcnMuCisgICAgICoKKyAgICAgKiBTZWxlY3RpbmcgYSBuZXR3b3JrIHdpbGwgbGVhdmUgdGhlIG90aGVyIG5ldHdvcmtzIGRpc2FibGVkIGFuZAorICAgICAqIGEgY2FsbCB0byBlbmFibGVBbGxOZXR3b3JrcygpIG5lZWRzIHRvIGJlIGlzc3VlZCB1cG9uIGEgY29ubmVjdGlvbgorICAgICAqIG9yIGEgZmFpbHVyZSBldmVudCBmcm9tIHN1cHBsaWNhbnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgVGhlIGNvbmZpZ3VyYXRpb24gZGV0YWlscyBpbiBXaWZpQ29uZmlndXJhdGlvbgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHNlbGVjdE5ldHdvcmsoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IG5ldElkID0gYWRkT3JVcGRhdGVOZXR3b3JrTmF0aXZlKGNvbmZpZyk7CisgICAgICAgICAgICBzZWxlY3ROZXR3b3JrKG5ldElkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbGVjdHMgdGhlIHNwZWNpZmllZCBuZXR3b3JrIGZvciBjb25uZWN0aW9uLiBUaGlzIGludm9sdmVzCisgICAgICogdXBkYXRpbmcgdGhlIHByaW9yaXR5IG9mIGFsbCB0aGUgbmV0d29ya3MgYW5kIGVuYWJsaW5nIHRoZSBnaXZlbgorICAgICAqIG5ldHdvcmsgd2hpbGUgZGlzYWJsaW5nIG90aGVycy4KKyAgICAgKgorICAgICAqIFNlbGVjdGluZyBhIG5ldHdvcmsgd2lsbCBsZWF2ZSB0aGUgb3RoZXIgbmV0d29ya3MgZGlzYWJsZWQgYW5kCisgICAgICogYSBjYWxsIHRvIGVuYWJsZUFsbE5ldHdvcmtzKCkgbmVlZHMgdG8gYmUgaXNzdWVkIHVwb24gYSBjb25uZWN0aW9uCisgICAgICogb3IgYSBmYWlsdXJlIGV2ZW50IGZyb20gc3VwcGxpY2FudAorICAgICAqCisgICAgICogQHBhcmFtIG5ldElkIG5ldHdvcmsgdG8gc2VsZWN0IGZvciBjb25uZWN0aW9uCisgICAgICovCisgICAgc3RhdGljIHZvaWQgc2VsZWN0TmV0d29yayhpbnQgbmV0SWQpIHsKKyAgICAgICAgLy8gUmVzZXQgdGhlIHByaW9yaXR5IG9mIGVhY2ggbmV0d29yayBhdCBzdGFydCBvciBpZiBpdCBnb2VzIHRvbyBoaWdoLgorICAgICAgICBpZiAoc0xhc3RQcmlvcml0eSA9PSAtMSB8fCBzTGFzdFByaW9yaXR5ID4gMTAwMDAwMCkgeworICAgICAgICAgICAgZm9yIChXaWZpQ29uZmlndXJhdGlvbiBjb25mIDogc0NvbmZpZ3VyZWROZXR3b3JrcykgeworICAgICAgICAgICAgICAgIGlmIChjb25mLm5ldHdvcmtJZCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBjb25mLnByaW9yaXR5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYWRkT3JVcGRhdGVOZXR3b3JrTmF0aXZlKGNvbmYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNMYXN0UHJpb3JpdHkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHRvIHRoZSBoaWdoZXN0IHByaW9yaXR5IGFuZCBzYXZlIHRoZSBjb25maWd1cmF0aW9uLgorICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgY29uZmlnLm5ldHdvcmtJZCA9IG5ldElkOworICAgICAgICBjb25maWcucHJpb3JpdHkgPSArK3NMYXN0UHJpb3JpdHk7CisKKyAgICAgICAgYWRkT3JVcGRhdGVOZXR3b3JrTmF0aXZlKGNvbmZpZyk7CisgICAgICAgIFdpZmlOYXRpdmUuc2F2ZUNvbmZpZ0NvbW1hbmQoKTsKKworICAgICAgICAvKiBFbmFibGUgdGhlIGdpdmVuIG5ldHdvcmsgd2hpbGUgZGlzYWJsaW5nIGFsbCBvdGhlciBuZXR3b3JrcyAqLworICAgICAgICBXaWZpTmF0aXZlLmVuYWJsZU5ldHdvcmtDb21tYW5kKG5ldElkLCB0cnVlKTsKKworICAgICAgICAvKiB1cGRhdGUgdGhlIGNvbmZpZ3VyZWQgbmV0d29ya3MgbGlzdCBidXQgbm90IHNlbmQgYQorICAgICAgICAgKiBicm9hZGNhc3QgdG8gYXZvaWQgYSBmZXRjaCBmcm9tIHNldHRpbmdzCisgICAgICAgICAqIGR1cmluZyB0aGlzIHRlbXBvcmFyeSBkaXNhYmxpbmcgb2YgbmV0d29ya3MKKyAgICAgICAgICovCisgICAgICAgIHVwZGF0ZUNvbmZpZ3VyZWROZXR3b3JrcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZC91cGRhdGUgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIGFuZCBzYXZlIGNvbmZpZworICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyBXaWZpQ29uZmlndXJhdGlvbiB0byBiZSBzYXZlZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHNhdmVOZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBpbnQgbmV0SWQgPSBhZGRPclVwZGF0ZU5ldHdvcmtOYXRpdmUoY29uZmlnKTsKKyAgICAgICAgLyogZW5hYmxlIGEgbmV3IG5ldHdvcmsgKi8KKyAgICAgICAgaWYgKGNvbmZpZy5uZXR3b3JrSWQgPCAwKSB7CisgICAgICAgICAgICBXaWZpTmF0aXZlLmVuYWJsZU5ldHdvcmtDb21tYW5kKG5ldElkLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgV2lmaU5hdGl2ZS5zYXZlQ29uZmlnQ29tbWFuZCgpOworICAgICAgICB1cGRhdGVDb25maWdBbmRTZW5kQ2hhbmdlQnJvYWRjYXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yZ2V0IHRoZSBzcGVjaWZpZWQgbmV0d29yayBhbmQgc2F2ZSBjb25maWcKKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIHRvIGZvcmdldAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGZvcmdldE5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIFdpZmlOYXRpdmUucmVtb3ZlTmV0d29ya0NvbW1hbmQobmV0SWQpOworICAgICAgICBXaWZpTmF0aXZlLnNhdmVDb25maWdDb21tYW5kKCk7CisgICAgICAgIHVwZGF0ZUNvbmZpZ0FuZFNlbmRDaGFuZ2VCcm9hZGNhc3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQvdXBkYXRlIGEgbmV0d29yay4gTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHNhdmVDb25maWcgb3BlcmF0aW9uLgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgcHVibGljCisgICAgICogQVBJLiBUaGUgbW9yZSBwb3dlcmZ1bCBzYXZlTmV0d29yaygpIGlzIHVzZWQgYnkgdGhlCisgICAgICogc3RhdGUgbWFjaGluZQorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyB3aWZpIGNvbmZpZ3VyYXRpb24gdG8gYWRkL3VwZGF0ZQorICAgICAqLworICAgIHN0YXRpYyBpbnQgYWRkT3JVcGRhdGVOZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBpbnQgcmV0ID0gYWRkT3JVcGRhdGVOZXR3b3JrTmF0aXZlKGNvbmZpZyk7CisgICAgICAgIHVwZGF0ZUNvbmZpZ0FuZFNlbmRDaGFuZ2VCcm9hZGNhc3QoKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBuZXR3b3JrLiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gc2F2ZUNvbmZpZyBvcGVyYXRpb24uCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBwdWJsaWMKKyAgICAgKiBBUEkuIFRoZSBtb3JlIHBvd2VyZnVsIGZvcmdldE5ldHdvcmsoKSBpcyB1c2VkIGJ5IHRoZQorICAgICAqIHN0YXRlIG1hY2hpbmUgZm9yIG5ldHdvcmsgcmVtb3ZhbAorICAgICAqCisgICAgICogQHBhcmFtIG5ldElkIG5ldHdvcmsgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIHJlbW92ZU5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIGJvb2xlYW4gcmV0ID0gV2lmaU5hdGl2ZS5yZW1vdmVOZXR3b3JrQ29tbWFuZChuZXRJZCk7CisgICAgICAgIHVwZGF0ZUNvbmZpZ0FuZFNlbmRDaGFuZ2VCcm9hZGNhc3QoKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgYSBuZXR3b3JrLiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gc2F2ZUNvbmZpZyBvcGVyYXRpb24uCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBwdWJsaWMKKyAgICAgKiBBUEkuIFRoZSBtb3JlIHBvd2VyZnVsIHNlbGVjdE5ldHdvcmsoKS9zYXZlTmV0d29yaygpIGlzIHVzZWQgYnkgdGhlCisgICAgICogc3RhdGUgbWFjaGluZSBmb3IgY29ubmVjdGluZyB0byBhIG5ldHdvcmsKKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBlbmFibGVOZXR3b3JrKGludCBuZXRJZCwgYm9vbGVhbiBkaXNhYmxlT3RoZXJzKSB7CisgICAgICAgIGJvb2xlYW4gcmV0ID0gV2lmaU5hdGl2ZS5lbmFibGVOZXR3b3JrQ29tbWFuZChuZXRJZCwgZGlzYWJsZU90aGVycyk7CisgICAgICAgIHVwZGF0ZUNvbmZpZ0FuZFNlbmRDaGFuZ2VCcm9hZGNhc3QoKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNhYmxlIGEgbmV0d29yay4gTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHNhdmVDb25maWcgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIHRvIGJlIGRpc2FibGVkCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gZGlzYWJsZU5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIGJvb2xlYW4gcmV0ID0gV2lmaU5hdGl2ZS5kaXNhYmxlTmV0d29ya0NvbW1hbmQobmV0SWQpOworICAgICAgICB1cGRhdGVDb25maWdBbmRTZW5kQ2hhbmdlQnJvYWRjYXN0KCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZSB0aGUgY29uZmlndXJlZCBuZXR3b3JrcyBpbiBzdXBwbGljYW50IHRvIGRpc2sKKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBzYXZlQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zYXZlQ29uZmlnQ29tbWFuZCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlQ29uZmlnQW5kU2VuZENoYW5nZUJyb2FkY2FzdCgpIHsKKyAgICAgICAgdXBkYXRlQ29uZmlndXJlZE5ldHdvcmtzKCk7CisgICAgICAgIGlmICghQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgcmV0dXJuOworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5TVVBQTElDQU5UX0NPTkZJR19DSEFOR0VEX0FDVElPTik7CisgICAgICAgIHNDb250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZUNvbmZpZ3VyZWROZXR3b3JrcygpIHsKKyAgICAgICAgU3RyaW5nIGxpc3RTdHIgPSBXaWZpTmF0aXZlLmxpc3ROZXR3b3Jrc0NvbW1hbmQoKTsKKyAgICAgICAgc0xhc3RQcmlvcml0eSA9IDA7CisKKyAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICBzQ29uZmlndXJlZE5ldHdvcmtzLmNsZWFyKCk7CisKKyAgICAgICAgICAgIGlmIChsaXN0U3RyID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBTdHJpbmdbXSBsaW5lcyA9IGxpc3RTdHIuc3BsaXQoIlxuIik7CisgICAgICAgICAgICAvLyBTa2lwIHRoZSBmaXJzdCBsaW5lLCB3aGljaCBpcyBhIGhlYWRlcgorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IGxpbmVzW2ldLnNwbGl0KCJcdCIpOworICAgICAgICAgICAgICAgIC8vIG5ldHdvcmstaWQgfCBzc2lkIHwgYnNzaWQgfCBmbGFncworICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBXaWZpQ29uZmlndXJhdGlvbigpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5uZXR3b3JrSWQgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3VsdFswXSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRbM10uaW5kZXhPZigiW0NVUlJFTlRdIikgIT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzLkNVUlJFTlQ7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdFszXS5pbmRleE9mKCJbRElTQUJMRURdIikgIT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzLkRJU0FCTEVEOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzLkVOQUJMRUQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyA9IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5FTkFCTEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWFkTmV0d29ya1ZhcmlhYmxlcyhjb25maWcpOworICAgICAgICAgICAgICAgIGlmIChjb25maWcucHJpb3JpdHkgPiBzTGFzdFByaW9yaXR5KSB7CisgICAgICAgICAgICAgICAgICAgIHNMYXN0UHJpb3JpdHkgPSBjb25maWcucHJpb3JpdHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNDb25maWd1cmVkTmV0d29ya3MuYWRkKGNvbmZpZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgYWRkT3JVcGRhdGVOZXR3b3JrTmF0aXZlKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgc3VwcGxpZWQgbmV0d29ya0lkIGlzIC0xLCB3ZSBjcmVhdGUgYSBuZXcgZW1wdHkKKyAgICAgICAgICogbmV0d29yayBjb25maWd1cmF0aW9uLiBPdGhlcndpc2UsIHRoZSBuZXR3b3JrSWQgc2hvdWxkCisgICAgICAgICAqIHJlZmVyIHRvIGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAqLworICAgICAgICBpbnQgbmV0SWQgPSBjb25maWcubmV0d29ya0lkOworICAgICAgICBib29sZWFuIG5ld05ldHdvcmsgPSBuZXRJZCA9PSAtMTsKKyAgICAgICAgLy8gbmV0d29ya0lkIG9mIC0xIG1lYW5zIHdlIHdhbnQgdG8gY3JlYXRlIGEgbmV3IG5ldHdvcmsKKworICAgICAgICBpZiAobmV3TmV0d29yaykgeworICAgICAgICAgICAgbmV0SWQgPSBXaWZpTmF0aXZlLmFkZE5ldHdvcmtDb21tYW5kKCk7CisgICAgICAgICAgICBpZiAobmV0SWQgPCAwKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGFkZCBhIG5ldHdvcmshIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNldFZhcmlhYmxlczogeworCisgICAgICAgICAgICBpZiAoY29uZmlnLlNTSUQgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5zc2lkVmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5TU0lEKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgU1NJRDogIitjb25maWcuU1NJRCk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29uZmlnLkJTU0lEICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uYnNzaWRWYXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLkJTU0lEKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgQlNTSUQ6ICIrY29uZmlnLkJTU0lEKTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBhbGxvd2VkS2V5TWFuYWdlbWVudFN0cmluZyA9CisgICAgICAgICAgICAgICAgbWFrZVN0cmluZyhjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQsIFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQuc3RyaW5ncyk7CisgICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LmNhcmRpbmFsaXR5KCkgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210LnZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkS2V5TWFuYWdlbWVudFN0cmluZykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IGtleV9tZ210OiAiKworICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEtleU1hbmFnZW1lbnRTdHJpbmcpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRQcm90b2NvbHNTdHJpbmcgPQorICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRQcm90b2NvbHMsIFdpZmlDb25maWd1cmF0aW9uLlByb3RvY29sLnN0cmluZ3MpOworICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkUHJvdG9jb2xzLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC52YXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFByb3RvY29sc1N0cmluZykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IHByb3RvOiAiKworICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFByb3RvY29sc1N0cmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYWxsb3dlZEF1dGhBbGdvcml0aG1zU3RyaW5nID0KKyAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkQXV0aEFsZ29yaXRobXMsIFdpZmlDb25maWd1cmF0aW9uLkF1dGhBbGdvcml0aG0uc3RyaW5ncyk7CisgICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRBdXRoQWxnb3JpdGhtcy5jYXJkaW5hbGl0eSgpICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS52YXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF1dGhBbGdvcml0aG1zU3RyaW5nKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgYXV0aF9hbGc6ICIrCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQXV0aEFsZ29yaXRobXNTdHJpbmcpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRQYWlyd2lzZUNpcGhlcnNTdHJpbmcgPQorICAgICAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkUGFpcndpc2VDaXBoZXJzLAorICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5QYWlyd2lzZUNpcGhlci5zdHJpbmdzKTsKKyAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZFBhaXJ3aXNlQ2lwaGVycy5jYXJkaW5hbGl0eSgpICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIudmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRQYWlyd2lzZUNpcGhlcnNTdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBwYWlyd2lzZTogIisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRQYWlyd2lzZUNpcGhlcnNTdHJpbmcpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRHcm91cENpcGhlcnNTdHJpbmcgPQorICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRHcm91cENpcGhlcnMsIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnN0cmluZ3MpOworICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkR3JvdXBDaXBoZXJzLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Hcm91cENpcGhlci52YXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEdyb3VwQ2lwaGVyc1N0cmluZykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IGdyb3VwOiAiKworICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEdyb3VwQ2lwaGVyc1N0cmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBQcmV2ZW50IGNsaWVudCBzY3Jldy11cCBieSBwYXNzaW5nIGluIGEgV2lmaUNvbmZpZ3VyYXRpb24gd2UgZ2F2ZSBpdAorICAgICAgICAgICAgLy8gYnkgcHJldmVudGluZyAiKiIgYXMgYSBrZXkuCisgICAgICAgICAgICBpZiAoY29uZmlnLnByZVNoYXJlZEtleSAhPSBudWxsICYmICFjb25maWcucHJlU2hhcmVkS2V5LmVxdWFscygiKiIpICYmCisgICAgICAgICAgICAgICAgICAgICFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLnBza1Zhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcucHJlU2hhcmVkS2V5KSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgcHNrOiAiK2NvbmZpZy5wcmVTaGFyZWRLZXkpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbGVhbiBoYXNTZXRLZXkgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChjb25maWcud2VwS2V5cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWcud2VwS2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IGNsaWVudCBzY3Jldy11cCBieSBwYXNzaW5nIGluIGEgV2lmaUNvbmZpZ3VyYXRpb24gd2UgZ2F2ZSBpdAorICAgICAgICAgICAgICAgICAgICAvLyBieSBwcmV2ZW50aW5nICIqIiBhcyBhIGtleS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy53ZXBLZXlzW2ldICE9IG51bGwgJiYgIWNvbmZpZy53ZXBLZXlzW2ldLmVxdWFscygiKiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ud2VwS2V5VmFyTmFtZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHNldCB3ZXBfa2V5IitpKyI6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLndlcEtleXNbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc1NldEtleSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChoYXNTZXRLZXkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi53ZXBUeEtleUlkeFZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhjb25maWcud2VwVHhLZXlJbmRleCkpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHNldCB3ZXBfdHhfa2V5aWR4OiAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBUeEtleUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLnByaW9yaXR5VmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoY29uZmlnLnByaW9yaXR5KSkpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNvbmZpZy5TU0lEICsgIjogZmFpbGVkIHRvIHNldCBwcmlvcml0eTogIgorICAgICAgICAgICAgICAgICAgICAgICAgK2NvbmZpZy5wcmlvcml0eSk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29uZmlnLmhpZGRlblNTSUQgJiYgIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uaGlkZGVuU1NJRFZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvbmZpZy5oaWRkZW5TU0lEID8gMSA6IDApKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0IGhpZGRlblNTSUQ6ICIrCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuaGlkZGVuU1NJRCk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uLkVudGVycHJpc2VGaWVsZCBmaWVsZAorICAgICAgICAgICAgICAgICAgICA6IGNvbmZpZy5lbnRlcnByaXNlRmllbGRzKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhck5hbWUgPSBmaWVsZC52YXJOYW1lKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZmllbGQudmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQgIT0gY29uZmlnLmVhcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUubGVuZ3RoKCkgPT0gMCkgPyAiTlVMTCIgOiBjb252ZXJ0VG9RdW90ZWRTdHJpbmcodmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNvbmZpZy5TU0lEICsgIjogZmFpbGVkIHRvIHNldCAiICsgdmFyTmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV0SWQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3TmV0d29yaykgeworICAgICAgICAgICAgV2lmaU5hdGl2ZS5yZW1vdmVOZXR3b3JrQ29tbWFuZChuZXRJZCk7CisgICAgICAgICAgICBMb2cuZChUQUcsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IGEgbmV0d29yayB2YXJpYWJsZSwgcmVtb3ZlZCBuZXR3b3JrOiAiCisgICAgICAgICAgICAgICAgICAgICsgbmV0SWQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgdGhlIHZhcmlhYmxlcyBmcm9tIHRoZSBzdXBwbGljYW50IGRhZW1vbiB0aGF0IGFyZSBuZWVkZWQgdG8KKyAgICAgKiBmaWxsIGluIHRoZSBXaWZpQ29uZmlndXJhdGlvbiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIHRoZSB7QGxpbmsgV2lmaUNvbmZpZ3VyYXRpb259IG9iamVjdCB0byBiZSBmaWxsZWQgaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWFkTmV0d29ya1ZhcmlhYmxlcyhXaWZpQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKworICAgICAgICBpbnQgbmV0SWQgPSBjb25maWcubmV0d29ya0lkOworICAgICAgICBpZiAobmV0SWQgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8qCisgICAgICAgICAqIFRPRE86IG1heWJlIHNob3VsZCBoYXZlIGEgbmF0aXZlIG1ldGhvZCB0aGF0IHRha2VzIGFuIGFycmF5IG9mCisgICAgICAgICAqIHZhcmlhYmxlIG5hbWVzIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHZhbHVlcy4gQnV0IHdlJ2Qgc3RpbGwKKyAgICAgICAgICogYmUgZG9pbmcgYSByb3VuZCB0cmlwIHRvIHRoZSBzdXBwbGljYW50IGRhZW1vbiBmb3IgZWFjaCB2YXJpYWJsZS4KKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyB2YWx1ZTsKKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24uc3NpZFZhck5hbWUpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgY29uZmlnLlNTSUQgPSByZW1vdmVEb3VibGVRdW90ZXModmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uZmlnLlNTSUQgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLmJzc2lkVmFyTmFtZSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICBjb25maWcuQlNTSUQgPSB2YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbmZpZy5CU1NJRCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24ucHJpb3JpdHlWYXJOYW1lKTsKKyAgICAgICAgY29uZmlnLnByaW9yaXR5ID0gLTE7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbmZpZy5wcmlvcml0eSA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLmhpZGRlblNTSURWYXJOYW1lKTsKKyAgICAgICAgY29uZmlnLmhpZGRlblNTSUQgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29uZmlnLmhpZGRlblNTSUQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSAhPSAwOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLndlcFR4S2V5SWR4VmFyTmFtZSk7CisgICAgICAgIGNvbmZpZy53ZXBUeEtleUluZGV4ID0gLTE7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBUeEtleUluZGV4ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQobmV0SWQsCisgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLndlcEtleVZhck5hbWVzW2ldKTsKKyAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLndlcEtleXNbaV0gPSB2YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29uZmlnLndlcEtleXNbaV0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLnBza1Zhck5hbWUpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgY29uZmlnLnByZVNoYXJlZEtleSA9IHZhbHVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uZmlnLnByZVNoYXJlZEtleSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChjb25maWcubmV0d29ya0lkLAorICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLlByb3RvY29sLnZhck5hbWUpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uUHJvdG9jb2wuc3RyaW5ncyk7CisgICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRQcm90b2NvbHMuc2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChjb25maWcubmV0d29ya0lkLAorICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQudmFyTmFtZSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQorICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210LnN0cmluZ3MpOworICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudC5zZXQoaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKGNvbmZpZy5uZXR3b3JrSWQsCisgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS52YXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9CisgICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLkF1dGhBbGdvcml0aG0uc3RyaW5ncyk7CisgICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRBdXRoQWxnb3JpdGhtcy5zZXQoaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKGNvbmZpZy5uZXR3b3JrSWQsCisgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIudmFyTmFtZSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQorICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5QYWlyd2lzZUNpcGhlci5zdHJpbmdzKTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZFBhaXJ3aXNlQ2lwaGVycy5zZXQoaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKGNvbmZpZy5uZXR3b3JrSWQsCisgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uR3JvdXBDaXBoZXIudmFyTmFtZSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQorICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5Hcm91cENpcGhlci5zdHJpbmdzKTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZEdyb3VwQ2lwaGVycy5zZXQoaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoV2lmaUNvbmZpZ3VyYXRpb24uRW50ZXJwcmlzZUZpZWxkIGZpZWxkIDoKKyAgICAgICAgICAgICAgICBjb25maWcuZW50ZXJwcmlzZUZpZWxkcykgeworICAgICAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQobmV0SWQsCisgICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhck5hbWUoKSk7CisgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgICAgIGlmIChmaWVsZCAhPSBjb25maWcuZWFwKSB2YWx1ZSA9IHJlbW92ZURvdWJsZVF1b3Rlcyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgZmllbGQuc2V0VmFsdWUodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlbW92ZURvdWJsZVF1b3RlcyhTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIGlmIChzdHJpbmcubGVuZ3RoKCkgPD0gMikgcmV0dXJuICIiOworICAgICAgICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZygxLCBzdHJpbmcubGVuZ3RoKCkgLSAxKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29udmVydFRvUXVvdGVkU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgcmV0dXJuICJcIiIgKyBzdHJpbmcgKyAiXCIiOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtYWtlU3RyaW5nKEJpdFNldCBzZXQsIFN0cmluZ1tdIHN0cmluZ3MpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaW50IG5leHRTZXRCaXQgPSAtMTsKKworICAgICAgICAvKiBNYWtlIHN1cmUgYWxsIHNldCBiaXRzIGFyZSBpbiBbMCwgc3RyaW5ncy5sZW5ndGgpIHRvIGF2b2lkCisgICAgICAgICAqIGdvaW5nIG91dCBvZiBib3VuZHMgb24gc3RyaW5ncy4gIChTaG91bGRuJ3QgaGFwcGVuLCBidXQuLi4pICovCisgICAgICAgIHNldCA9IHNldC5nZXQoMCwgc3RyaW5ncy5sZW5ndGgpOworCisgICAgICAgIHdoaWxlICgobmV4dFNldEJpdCA9IHNldC5uZXh0U2V0Qml0KG5leHRTZXRCaXQgKyAxKSkgIT0gLTEpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoc3RyaW5nc1tuZXh0U2V0Qml0XS5yZXBsYWNlKCdfJywgJy0nKSkuYXBwZW5kKCcgJyk7CisgICAgICAgIH0KKworICAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgc3BhY2UKKyAgICAgICAgaWYgKHNldC5jYXJkaW5hbGl0eSgpID4gMCkgeworICAgICAgICAgICAgYnVmLnNldExlbmd0aChidWYubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbG9va3VwU3RyaW5nKFN0cmluZyBzdHJpbmcsIFN0cmluZ1tdIHN0cmluZ3MpIHsKKyAgICAgICAgaW50IHNpemUgPSBzdHJpbmdzLmxlbmd0aDsKKworICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgnLScsICdfJyk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICBpZiAoc3RyaW5nLmVxdWFscyhzdHJpbmdzW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKworICAgICAgICAvLyBpZiB3ZSBldmVyIGdldCBoZXJlLCB3ZSBzaG91bGQgcHJvYmFibHkgYWRkIHRoZQorICAgICAgICAvLyB2YWx1ZSB0byBXaWZpQ29uZmlndXJhdGlvbiB0byByZWZsZWN0IHRoYXQgaXQncworICAgICAgICAvLyBzdXBwb3J0ZWQgYnkgdGhlIFdQQSBzdXBwbGljYW50CisgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byBsb29rLXVwIGEgc3RyaW5nOiAiICsgc3RyaW5nKTsKKworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBkdW1wKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZyBMUyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgc2IuYXBwZW5kKCJzTGFzdFByaW9yaXR5ICIpLmFwcGVuZChzTGFzdFByaW9yaXR5KS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIkNvbmZpZ3VyZWQgbmV0d29ya3MgIikuYXBwZW5kKExTKTsKKyAgICAgICAgZm9yIChXaWZpQ29uZmlndXJhdGlvbiBjb25mIDogZ2V0Q29uZmlndXJlZE5ldHdvcmtzKCkpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChjb25mKS5hcHBlbmQoTFMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWd1cmF0aW9uLmphdmEgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlndXJhdGlvbi5qYXZhCmluZGV4IDAxYmM5MTkuLmNhNGYyOWYgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWd1cmF0aW9uLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUNvbmZpZ3VyYXRpb24uamF2YQpAQCAtMjE2LDcgKzIxNiw3IEBACiAgICAgLyoqCiAgICAgICogVGhlIG5ldHdvcmsncyBTU0lELiBDYW4gZWl0aGVyIGJlIGFuIEFTQ0lJIHN0cmluZywKICAgICAgKiB3aGljaCBtdXN0IGJlIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90YXRpb24gbWFya3MKLSAgICAgKiAoZS5nLiwge0Bjb2RlICZxdW90O015TmV0d29yayZxdW90O30sIG9yIGEgc3RyaW5nIG9mCisgICAgICogKGUuZy4sIHtAY29kZSAiTXlOZXR3b3JrIn0sIG9yIGEgc3RyaW5nIG9mCiAgICAgICogaGV4IGRpZ2l0cyx3aGljaCBhcmUgbm90IGVuY2xvc2VkIGluIHF1b3RlcwogICAgICAqIChlLmcuLCB7QGNvZGUgMDFhMjQzZjQwNX0pLgogICAgICAqLwpAQCAtMjM5LDcgKzIzOSw3IEBACiAgICAgcHVibGljIFN0cmluZyBwcmVTaGFyZWRLZXk7CiAgICAgLyoqCiAgICAgICogVXAgdG8gZm91ciBXRVAga2V5cy4gRWl0aGVyIGFuIEFTQ0lJIHN0cmluZyBlbmNsb3NlZCBpbiBkb3VibGUKLSAgICAgKiBxdW90YXRpb24gbWFya3MgKGUuZy4sIHtAY29kZSAmcXVvdDthYmNkZWYmcXVvdDt9IG9yIGEgc3RyaW5nCisgICAgICogcXVvdGF0aW9uIG1hcmtzIChlLmcuLCB7QGNvZGUgImFiY2RlZiJ9IG9yIGEgc3RyaW5nCiAgICAgICogb2YgaGV4IGRpZ2l0cyAoZS5nLiwge0Bjb2RlIDAxMDIwMzA0MDV9KS4KICAgICAgKiA8cC8+CiAgICAgICogV2hlbiB0aGUgdmFsdWUgb2Ygb25lIG9mIHRoZXNlIGtleXMgaXMgcmVhZCwgdGhlIGFjdHVhbCBrZXkgaXMKQEAgLTQzMiw2ICs0MzIsMzggQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBXaWZpQ29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoaXMgV2lmaUNvbmZpZ3VyYXRpb24uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgV2lmaUNvbmZpZ3VyYXRpb24gY2xvbmUoKSB7CisgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBXaWZpQ29uZmlndXJhdGlvbigpOworICAgICAgICBjb25maWcubmV0d29ya0lkID0gbmV0d29ya0lkOworICAgICAgICBjb25maWcuc3RhdHVzID0gc3RhdHVzOworICAgICAgICBjb25maWcuU1NJRCA9IFNTSUQ7CisgICAgICAgIGNvbmZpZy5CU1NJRCA9IEJTU0lEOworICAgICAgICBjb25maWcucHJlU2hhcmVkS2V5ID0gcHJlU2hhcmVkS2V5OworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2VwS2V5cy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldID0gd2VwS2V5c1tpXTsKKworICAgICAgICBjb25maWcud2VwVHhLZXlJbmRleCA9IHdlcFR4S2V5SW5kZXg7CisgICAgICAgIGNvbmZpZy5wcmlvcml0eSA9IHByaW9yaXR5OworICAgICAgICBjb25maWcuaGlkZGVuU1NJRCA9IGhpZGRlblNTSUQ7CisgICAgICAgIGNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudCAgID0gKEJpdFNldCkgYWxsb3dlZEtleU1hbmFnZW1lbnQuY2xvbmUoKTsKKyAgICAgICAgY29uZmlnLmFsbG93ZWRQcm90b2NvbHMgICAgICAgPSAoQml0U2V0KSBhbGxvd2VkUHJvdG9jb2xzLmNsb25lKCk7CisgICAgICAgIGNvbmZpZy5hbGxvd2VkQXV0aEFsZ29yaXRobXMgID0gKEJpdFNldCkgYWxsb3dlZEF1dGhBbGdvcml0aG1zLmNsb25lKCk7CisgICAgICAgIGNvbmZpZy5hbGxvd2VkUGFpcndpc2VDaXBoZXJzID0gKEJpdFNldCkgYWxsb3dlZFBhaXJ3aXNlQ2lwaGVycy5jbG9uZSgpOworICAgICAgICBjb25maWcuYWxsb3dlZEdyb3VwQ2lwaGVycyAgICA9IChCaXRTZXQpIGFsbG93ZWRHcm91cENpcGhlcnMuY2xvbmUoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudGVycHJpc2VGaWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNvbmZpZy5lbnRlcnByaXNlRmllbGRzW2ldLnNldFZhbHVlKGVudGVycHJpc2VGaWVsZHNbaV0udmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisKICAgICAvKiogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZSB7QGhpZGV9ICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CiAgICAgICAgIGRlc3Qud3JpdGVJbnQobmV0d29ya0lkKTsKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNYW5hZ2VyLmphdmEgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTWFuYWdlci5qYXZhCmluZGV4IDlkMjE1MjEuLjhjM2VjNWYgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNYW5hZ2VyLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1hbmFnZXIuamF2YQpAQCAtMTY1LDcgKzE2NSw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRElTQUJMSU5HID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0RJU0FCTElORyA9IDEwOwogICAgIC8qKgogICAgICAqIFdpLUZpIEFQIGlzIGRpc2FibGVkLgogICAgICAqCkBAIC0xNzQsNyArMTc0LDcgQEAKICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9ESVNBQkxFRCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9ESVNBQkxFRCA9IDExOwogICAgIC8qKgogICAgICAqIFdpLUZpIEFQIGlzIGN1cnJlbnRseSBiZWluZyBlbmFibGVkLiBUaGUgc3RhdGUgd2lsbCBjaGFuZ2UgdG8KICAgICAgKiB7QGxpbmsgI1dJRklfQVBfU1RBVEVfRU5BQkxFRH0gaWYgaXQgZmluaXNoZXMgc3VjY2Vzc2Z1bGx5LgpAQCAtMTg0LDcgKzE4NCw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRU5BQkxJTkcgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRU5BQkxJTkcgPSAxMjsKICAgICAvKioKICAgICAgKiBXaS1GaSBBUCBpcyBlbmFibGVkLgogICAgICAqCkBAIC0xOTMsNyArMTkzLDcgQEAKICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9FTkFCTEVEID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0VOQUJMRUQgPSAxMzsKICAgICAvKioKICAgICAgKiBXaS1GaSBBUCBpcyBpbiBhIGZhaWxlZCBzdGF0ZS4gVGhpcyBzdGF0ZSB3aWxsIG9jY3VyIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZwogICAgICAqIGVuYWJsaW5nIG9yIGRpc2FibGluZwpAQCAtMjAzLDcgKzIwMyw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRkFJTEVEID0gNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0ZBSUxFRCA9IDE0OwogCiAgICAgLyoqCiAgICAgICogQnJvYWRjYXN0IGludGVudCBhY3Rpb24gaW5kaWNhdGluZyB0aGF0IGEgY29ubmVjdGlvbiB0byB0aGUgc3VwcGxpY2FudCBoYXMKQEAgLTI3NCw3ICsyNzQsMTQgQEAKICAgICAgKiBAc2VlICNFUlJPUl9BVVRIRU5USUNBVElORwogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NVUFBMSUNBTlRfRVJST1IgPSAic3VwcGxpY2FudEVycm9yIjsKLQorICAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBpbnRlbnQgYWN0aW9uIGluZGljYXRpbmcgdGhhdCB0aGUgc3VwcGxpY2FudCBjb25maWd1cmF0aW9uIGNoYW5nZWQuCisgICAgICogVGhpcyBjYW4gYmUgYXMgYSByZXN1bHQgb2YgYWRkaW5nL3VwZGF0aW5nL2RlbGV0aW5nIGEgbmV0d29yaworICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBQTElDQU5UX0NPTkZJR19DSEFOR0VEX0FDVElPTiA9CisgICAgICAgICJhbmRyb2lkLm5ldC53aWZpLnN1cHBsaWNhbnQuQ09ORklHX0NIQU5HRSI7CiAgICAgLyoqCiAgICAgICogQW4gYWNjZXNzIHBvaW50IHNjYW4gaGFzIGNvbXBsZXRlZCwgYW5kIHJlc3VsdHMgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBzdXBwbGljYW50LgogICAgICAqIENhbGwge0BsaW5rICNnZXRTY2FuUmVzdWx0cygpfSB0byBvYnRhaW4gdGhlIHJlc3VsdHMuCkBAIC0yOTMsMTEgKzMwMCwyNiBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX05FV19SU1NJID0gIm5ld1Jzc2kiOwogCiAgICAgLyoqCisgICAgICogQnJvYWRjYXN0IGludGVudCBhY3Rpb24gaW5kaWNhdGluZyB0aGF0IHRoZSBJUCBjb25maWd1cmF0aW9uCisgICAgICogY2hhbmdlZCBvbiB3aWZpLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfQ0hBTkdFRF9BQ1RJT04gPSAiYW5kcm9pZC5uZXQud2lmaS5DT05GSUdfQ0hBTkdFRCI7CisgICAgLyoqCisgICAgICogVGhlIGxvb2t1cCBrZXkgZm9yIGEge0BsaW5rIGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzfSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICAqIFdpLUZpIG5ldHdvcmsuIFJldHJpZXZlIHdpdGgKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudCNnZXRQYXJjZWxhYmxlRXh0cmEoU3RyaW5nKX0uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9MSU5LX1BST1BFUlRJRVMgPSAibGlua1Byb3BlcnRpZXMiOworCisgICAgLyoqCiAgICAgICogVGhlIG5ldHdvcmsgSURzIG9mIHRoZSBjb25maWd1cmVkIG5ldHdvcmtzIGNvdWxkIGhhdmUgY2hhbmdlZC4KICAgICAgKi8KICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVFdPUktfSURTX0NIQU5HRURfQUNUSU9OID0gImFuZHJvaWQubmV0LndpZmkuTkVUV09SS19JRFNfQ0hBTkdFRCI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBY3Rpdml0eSBBY3Rpb246IFBpY2sgYSBXaS1GaSBuZXR3b3JrIHRvIGNvbm5lY3QgdG8uCiAgICAgICogPHA+SW5wdXQ6IE5vdGhpbmcuCkBAIC0zMDcsMTYgKzMyOSw2IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1BJQ0tfV0lGSV9ORVRXT1JLID0gImFuZHJvaWQubmV0LndpZmkuUElDS19XSUZJX05FVFdPUksiOwogCiAgICAgLyoqCi0gICAgICogSW4gdGhpcyBXaS1GaSBsb2NrIG1vZGUsIFdpLUZpIHdpbGwgYmVoYXZlIGFzIGluIHRoZSBtb2RlCi0gICAgICoge0BsaW5rICNXSUZJX01PREVfRlVMTH0gYnV0IGl0IG9wZXJhdGVzIGF0IGhpZ2ggcGVyZm9ybWFuY2UKLSAgICAgKiBhdCB0aGUgZXhwZW5zZSBvZiBwb3dlci4gVGhpcyBtb2RlIHNob3VsZCBiZSB1c2VkCi0gICAgICogb25seSB3aGVuIHRoZSB3aWZpIGNvbm5lY3Rpb24gbmVlZHMgdG8gaGF2ZSBtaW5pbXVtIGxvc3MgYW5kIGxvdwotICAgICAqIGxhdGVuY3kgYXMgaXQgY2FuIGltcGFjdCB0aGUgYmF0dGVyeSBsaWZlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9NT0RFX0ZVTExfSElHSF9QRVJGID0gMzsKLQotICAgIC8qKgogICAgICAqIEluIHRoaXMgV2ktRmkgbG9jayBtb2RlLCBXaS1GaSB3aWxsIGJlIGtlcHQgYWN0aXZlLAogICAgICAqIGFuZCB3aWxsIGJlaGF2ZSBub3JtYWxseSwgaS5lLiwgaXQgd2lsbCBhdHRlbXB0IHRvIGF1dG9tYXRpY2FsbHkKICAgICAgKiBlc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvIGEgcmVtZW1iZXJlZCBhY2Nlc3MgcG9pbnQgdGhhdCBpcwpAQCAtNTEyLDcgKzUyNCw4IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdCgpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICBtU2VydmljZS5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtNTI2LDcgKzUzOSw4IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcmVjb25uZWN0KCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnJlY29ubmVjdCgpOworICAgICAgICAgICAgbVNlcnZpY2UucmVjb25uZWN0KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtNTQwLDcgKzU1NCw4IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcmVhc3NvY2lhdGUoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UucmVhc3NvY2lhdGUoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnJlYXNzb2NpYXRlKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtNTY5LDcgKzU4NCw4IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3RhcnRTY2FuKCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnN0YXJ0U2NhbihmYWxzZSk7CisgICAgICAgICAgICBtU2VydmljZS5zdGFydFNjYW4oZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTU4Nyw3ICs2MDMsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0U2NhbkFjdGl2ZSgpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5zdGFydFNjYW4odHJ1ZSk7CisgICAgICAgICAgICBtU2VydmljZS5zdGFydFNjYW4odHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtNzUzLDggKzc3MCw5IEBACiAgICAgICAgIH0gZWxzZSBpZiAocnNzaSA+PSBNQVhfUlNTSSkgewogICAgICAgICAgICAgcmV0dXJuIG51bUxldmVscyAtIDE7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgcGFydGl0aW9uU2l6ZSA9IChNQVhfUlNTSSAtIE1JTl9SU1NJKSAvIChudW1MZXZlbHMgLSAxKTsKLSAgICAgICAgICAgIHJldHVybiAocnNzaSAtIE1JTl9SU1NJKSAvIHBhcnRpdGlvblNpemU7CisgICAgICAgICAgICBmbG9hdCBpbnB1dFJhbmdlID0gKE1BWF9SU1NJIC0gTUlOX1JTU0kpOworICAgICAgICAgICAgZmxvYXQgb3V0cHV0UmFuZ2UgPSAobnVtTGV2ZWxzIC0gMSk7CisgICAgICAgICAgICByZXR1cm4gKGludCkoKGZsb2F0KShyc3NpIC0gTUlOX1JTU0kpICogb3V0cHV0UmFuZ2UgLyBpbnB1dFJhbmdlKTsKICAgICAgICAgfQogICAgIH0KICAgICAKQEAgLTg0OCw2ICs4NjYsMTY2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSBkcml2ZXIgYW5kIGNvbm5lY3QgdG8gbmV0d29yay4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBvdmVyLXJpZGUgV2lmaUxvY2sgYW5kIGRldmljZSBpZGxlIHN0YXR1cy4gRm9yIGV4YW1wbGUsCisgICAgICogZXZlbiBpZiB0aGUgZGV2aWNlIGlzIGlkbGUgb3IgdGhlcmUgaXMgb25seSBhIHNjYW4tb25seSBsb2NrIGhlbGQsCisgICAgICogYSBzdGFydCB3aWZpIHdvdWxkIG1lYW4gdGhhdCB3aWZpIGNvbm5lY3Rpb24gaXMga2VwdCBhY3RpdmUgdW50aWwKKyAgICAgKiBhIHN0b3BXaWZpKCkgaXMgc2VudC4KKyAgICAgKgorICAgICAqIFRoaXMgQVBJIGlzIHVzZWQgYnkgV2lmaVN0YXRlVHJhY2tlcgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcyBlbHNlIHtAY29kZSBmYWxzZX0KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0V2lmaSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnN0YXJ0V2lmaSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNjb25uZWN0IGZyb20gYSBuZXR3b3JrIChpZiBhbnkpIGFuZCBzdG9wIHRoZSBkcml2ZXIuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgb3Zlci1yaWRlIFdpZmlMb2NrIGFuZCBkZXZpY2UgaWRsZSBzdGF0dXMuIFdpLUZpCisgICAgICogc3RheXMgaW5hY3RpdmUgdW50aWwgYSBzdGFydFdpZmkoKSBpcyBpc3N1ZWQuCisgICAgICoKKyAgICAgKiBUaGlzIEFQSSBpcyB1c2VkIGJ5IFdpZmlTdGF0ZVRyYWNrZXIKKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgZWxzZSB7QGNvZGUgZmFsc2V9CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdG9wV2lmaSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnN0b3BXaWZpKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGJzc2lkIHRvIHRoZSBzdXBwbGljYW50IGJsYWNrbGlzdAorICAgICAqCisgICAgICogVGhpcyBBUEkgaXMgdXNlZCBieSBXaWZpV2F0Y2hkb2dTZXJ2aWNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIGVsc2Uge0Bjb2RlIGZhbHNlfQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWRkVG9CbGFja2xpc3QoU3RyaW5nIGJzc2lkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5hZGRUb0JsYWNrbGlzdChic3NpZCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIHRoZSBzdXBwbGljYW50IGJsYWNrbGlzdAorICAgICAqCisgICAgICogVGhpcyBBUEkgaXMgdXNlZCBieSBXaWZpV2F0Y2hkb2dTZXJ2aWNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIGVsc2Uge0Bjb2RlIGZhbHNlfQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2xlYXJCbGFja2xpc3QoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5jbGVhckJsYWNrbGlzdCgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUT0RPOiBkZXByZWNhdGUgc3luY2hyb25vdXMgQVBJIGFuZCBvcGVuIHVwIHRoZSBmb2xsb3dpbmcgQVBJICovCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0byBhIG5ldHdvcmsgd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi4gVGhlIG5ldHdvcmsgYWxzbworICAgICAqIGdldHMgYWRkZWQgdG8gdGhlIHN1cHBsaWNhbnQgY29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIEZvciBhIG5ldyBuZXR3b3JrLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW5zdGVhZCBvZiBhCisgICAgICogc2VxdWVuY2Ugb2YgYWRkTmV0d29yaygpLCBlbmFibGVOZXR3b3JrKCksIHNhdmVDb25maWd1cmF0aW9uKCkgYW5kCisgICAgICogcmVjb25uZWN0KCkKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgdGhlIHNldCBvZiB2YXJpYWJsZXMgdGhhdCBkZXNjcmliZSB0aGUgY29uZmlndXJhdGlvbiwKKyAgICAgKiAgICAgICAgICAgIGNvbnRhaW5lZCBpbiBhIHtAbGluayBXaWZpQ29uZmlndXJhdGlvbn0gb2JqZWN0LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29ubmVjdE5ldHdvcmsoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5jb25uZWN0TmV0d29ya1dpdGhDb25maWcoY29uZmlnKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3QgdG8gYSBuZXR3b3JrIHdpdGggdGhlIGdpdmVuIG5ldHdvcmtJZC4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnN0ZWFkIG9mIGEgZW5hYmxlTmV0d29yaygpLCBzYXZlQ29uZmlndXJhdGlvbigpIGFuZAorICAgICAqIHJlY29ubmVjdCgpCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV0d29ya0lkIHRoZSBuZXR3b3JrIGlkIGlkZW50aWZpeWluZyB0aGUgbmV0d29yayBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICBzdXBwbGljYW50IGNvbmZpZ3VyYXRpb24gbGlzdAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29ubmVjdE5ldHdvcmsoaW50IG5ldHdvcmtJZCkgeworICAgICAgICBpZiAobmV0d29ya0lkIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5jb25uZWN0TmV0d29ya1dpdGhJZChuZXR3b3JrSWQpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeyB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZSB0aGUgZ2l2ZW4gbmV0d29yayBpbiB0aGUgc3VwcGxpY2FudCBjb25maWcuIElmIHRoZSBuZXR3b3JrIGFscmVhZHkKKyAgICAgKiBleGlzdHMsIHRoZSBjb25maWd1cmF0aW9uIGlzIHVwZGF0ZWQuIEEgbmV3IG5ldHdvcmsgaXMgZW5hYmxlZAorICAgICAqIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBGb3IgYSBuZXcgbmV0d29yaywgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluc3RlYWQgb2YgYQorICAgICAqIHNlcXVlbmNlIG9mIGFkZE5ldHdvcmsoKSwgZW5hYmxlTmV0d29yaygpIGFuZCBzYXZlQ29uZmlndXJhdGlvbigpLgorICAgICAqCisgICAgICogRm9yIGFuIGV4aXN0aW5nIG5ldHdvcmssIGl0IGFjY29tcGxpc2hlcyB0aGUgdGFzayBvZiB1cGRhdGVOZXR3b3JrKCkKKyAgICAgKiBhbmQgc2F2ZUNvbmZpZ3VyYXRpb24oKQorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyB0aGUgc2V0IG9mIHZhcmlhYmxlcyB0aGF0IGRlc2NyaWJlIHRoZSBjb25maWd1cmF0aW9uLAorICAgICAqICAgICAgICAgICAgY29udGFpbmVkIGluIGEge0BsaW5rIFdpZmlDb25maWd1cmF0aW9ufSBvYmplY3QuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzYXZlTmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnNhdmVOZXR3b3JrKGNvbmZpZyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7IH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxldGUgdGhlIG5ldHdvcmsgaW4gdGhlIHN1cHBsaWNhbnQgY29uZmlnLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluc3RlYWQgb2YgYSBzZXF1ZW5jZSBvZiByZW1vdmVOZXR3b3JrKCkKKyAgICAgKiBhbmQgc2F2ZUNvbmZpZ3VyYXRpb24oKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgdGhlIHNldCBvZiB2YXJpYWJsZXMgdGhhdCBkZXNjcmliZSB0aGUgY29uZmlndXJhdGlvbiwKKyAgICAgKiAgICAgICAgICAgIGNvbnRhaW5lZCBpbiBhIHtAbGluayBXaWZpQ29uZmlndXJhdGlvbn0gb2JqZWN0LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZm9yZ2V0TmV0d29yayhpbnQgbmV0SWQpIHsKKyAgICAgICAgaWYgKG5ldElkIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5mb3JnZXROZXR3b3JrKG5ldElkKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBrZWVwIHRoZSBXaS1GaSByYWRpbyBhd2FrZS4KICAgICAgKiBOb3JtYWxseSB0aGUgV2ktRmkgcmFkaW8gbWF5IHR1cm4gb2ZmIHdoZW4gdGhlIHVzZXIgaGFzIG5vdCB1c2VkIHRoZSBkZXZpY2UgaW4gYSB3aGlsZS4KQEAgLTEwMDMsOSArMTE4MSw4IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIG5ldyBXaWZpTG9jay4KICAgICAgKgotICAgICAqIEBwYXJhbSBsb2NrVHlwZSB0aGUgdHlwZSBvZiBsb2NrIHRvIGNyZWF0ZS4gU2VlIHtAbGluayAjV0lGSV9NT0RFX0ZVTEx9LAotICAgICAqIGFuZCB7QGxpbmsgI1dJRklfTU9ERV9TQ0FOX09OTFl9IGZvciBkZXNjcmlwdGlvbnMgb2YgdGhlIHR5cGVzIG9mIFdpLUZpIGxvY2tzLgotICAgICAqCisgICAgICogQHBhcmFtIGxvY2tUeXBlIHRoZSB0eXBlIG9mIGxvY2sgdG8gY3JlYXRlLiBTZWUge0BsaW5rICNXSUZJX01PREVfRlVMTH0gYW5kCisgICAgICoge0BsaW5rICNXSUZJX01PREVfU0NBTl9PTkxZfSBmb3IgZGVzY3JpcHRpb25zIG9mIHRoZSB0eXBlcyBvZiBXaS1GaSBsb2Nrcy4KICAgICAgKiBAcGFyYW0gdGFnIGEgdGFnIGZvciB0aGUgV2lmaUxvY2sgdG8gaWRlbnRpZnkgaXQgaW4gZGVidWdnaW5nIG1lc3NhZ2VzLiAgVGhpcyBzdHJpbmcgaXMgCiAgICAgICogICAgICAgICAgICBuZXZlciBzaG93biB0byB0aGUgdXNlciB1bmRlciBub3JtYWwgY29uZGl0aW9ucywgYnV0IHNob3VsZCBiZSBkZXNjcmlwdGl2ZSAKICAgICAgKiAgICAgICAgICAgIGVub3VnaCB0byBpZGVudGlmeSB5b3VyIGFwcGxpY2F0aW9uIGFuZCB0aGUgc3BlY2lmaWMgV2lmaUxvY2sgd2l0aGluIGl0LCBpZiBpdApkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1vbml0b3IuamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNb25pdG9yLmphdmEKaW5kZXggMjY2ZDgwMS4uYWYzMTMyZiAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1vbml0b3IuamF2YQorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTW9uaXRvci5qYXZhCkBAIC0xOSwxNCArMTksMTMgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRlVHJhY2tlcjsKIAogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwogCiAvKioKICAqIExpc3RlbnMgZm9yIGV2ZW50cyBmcm9tIHRoZSB3cGFfc3VwcGxpY2FudCBzZXJ2ZXIsIGFuZCBwYXNzZXMgdGhlbSBvbgotICogdG8gdGhlIHtAbGluayBXaWZpU3RhdGVUcmFja2VyfSBmb3IgaGFuZGxpbmcuIFJ1bnMgaW4gaXRzIG93biB0aHJlYWQuCisgKiB0byB0aGUge0BsaW5rIFdpZmlTdGF0ZU1hY2hpbmV9IGZvciBoYW5kbGluZy4gUnVucyBpbiBpdHMgb3duIHRocmVhZC4KICAqCiAgKiBAaGlkZQogICovCkBAIC0xMTcsNyArMTE2LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBQYXR0ZXJuIG1Db25uZWN0ZWRFdmVudFBhdHRlcm4gPQogICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIigoPzpbMC05YS1mXXsyfTopezV9WzAtOWEtZl17Mn0pIC4qIFxcW2lkPShbMC05XSspICIpOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBXaWZpU3RhdGVUcmFja2VyIG1XaWZpU3RhdGVUcmFja2VyOworICAgIHByaXZhdGUgZmluYWwgV2lmaVN0YXRlTWFjaGluZSBtV2lmaVN0YXRlTWFjaGluZTsKIAogICAgIC8qKgogICAgICAqIFRoaXMgaW5kaWNhdGVzIHRoZSBzdXBwbGljYW50IGNvbm5lY3Rpb24gZm9yIHRoZSBtb25pdG9yIGlzIGNsb3NlZApAQCAtMTM5LDMxICsxMzgsMjcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JFQ1ZfRVJST1JTICAgID0gMTA7CiAKLSAgICBwdWJsaWMgV2lmaU1vbml0b3IoV2lmaVN0YXRlVHJhY2tlciB0cmFja2VyKSB7Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyID0gdHJhY2tlcjsKKyAgICBwdWJsaWMgV2lmaU1vbml0b3IoV2lmaVN0YXRlTWFjaGluZSB3aWZpU3RhdGVNYWNoaW5lKSB7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lID0gd2lmaVN0YXRlTWFjaGluZTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzdGFydE1vbml0b3JpbmcoKSB7CiAgICAgICAgIG5ldyBNb25pdG9yVGhyZWFkKCkuc3RhcnQoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgTmV0d29ya1N0YXRlVHJhY2tlciBnZXROZXR3b3JrU3RhdGVUcmFja2VyKCkgewotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXI7Ci0gICAgfQotCiAgICAgY2xhc3MgTW9uaXRvclRocmVhZCBleHRlbmRzIFRocmVhZCB7CiAgICAgICAgIHB1YmxpYyBNb25pdG9yVGhyZWFkKCkgewogICAgICAgICAgICAgc3VwZXIoIldpZmlNb25pdG9yIik7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogCiAgICAgICAgICAgICBpZiAoY29ubmVjdFRvU3VwcGxpY2FudCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gU2VuZCBhIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IGl0IGlzIG5vdyBwb3NzaWJsZSB0byBzZW5kIGNvbW1hbmRzCiAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHN1cHBsaWNhbnQKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlTdXBwbGljYW50Q29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeVN1cHBsaWNhbnRDb25uZWN0aW9uKCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVN1cHBsaWNhbnRMb3N0KCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5U3VwcGxpY2FudExvc3QoKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKQEAgLTI1OSw3ICsyNTQsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IGFuZCBleGl0Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVN1cHBsaWNhbnRMb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeVN1cHBsaWNhbnRMb3N0KCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUV2ZW50KGV2ZW50LCBldmVudERhdGEpOwpAQCAtMjcyLDcgKzI2Nyw3IEBACiAgICAgICAgICAgICBpbnQgY29ubmVjdFRyaWVzID0gMDsKIAogICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBpZiAobVdpZmlTdGF0ZVRyYWNrZXIuY29ubmVjdFRvU3VwcGxpY2FudCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKFdpZmlOYXRpdmUuY29ubmVjdFRvU3VwcGxpY2FudCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdFRyaWVzKysgPCAzKSB7CkBAIC0yODUsNyArMjgwLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVQYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KCkgewotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIubm90aWZ5UGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCgpOworICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5UGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCgpOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURyaXZlckV2ZW50KFN0cmluZyBzdGF0ZSkgewpAQCAtMjkzLDExICsyODgsMTEgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdGUuZXF1YWxzKCJTVE9QUEVEIikpIHsKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlEcml2ZXJTdG9wcGVkKCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5RHJpdmVyU3RvcHBlZCgpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lcXVhbHMoIlNUQVJURUQiKSkgewotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeURyaXZlclN0YXJ0ZWQoKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlEcml2ZXJTdGFydGVkKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmVxdWFscygiSEFOR0VEIikpIHsKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlEcml2ZXJIdW5nKCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5RHJpdmVySHVuZygpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTMxOCw3ICszMTMsNyBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIGNhc2UgU0NBTl9SRVNVTFRTOgotICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlTY2FuUmVzdWx0c0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlTY2FuUmVzdWx0c0F2YWlsYWJsZSgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIGNhc2UgVU5LTk9XTjoKQEAgLTM3NSw3ICszNzAsNyBAQAogICAgICAgICAgICAgaWYgKG5ld1N1cHBsaWNhbnRTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuSU5WQUxJRCkgewogICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkludmFsaWQgc3VwcGxpY2FudCBzdGF0ZTogIiArIG5ld1N0YXRlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVN0YXRlQ2hhbmdlKG5ldHdvcmtJZCwgQlNTSUQsIG5ld1N1cHBsaWNhbnRTdGF0ZSk7CisgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlTdXBwbGljYW50U3RhdGVDaGFuZ2UobmV0d29ya0lkLCBCU1NJRCwgbmV3U3VwcGxpY2FudFN0YXRlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzk1LDcgKzM5MCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVN0YXRlQ2hhbmdlKG5ld1N0YXRlLCBCU1NJRCwgbmV0d29ya0lkKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5TmV0d29ya1N0YXRlQ2hhbmdlKG5ld1N0YXRlLCBCU1NJRCwgbmV0d29ya0lkKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlOYXRpdmUuamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlOYXRpdmUuamF2YQppbmRleCAyNWYwNWMwLi40N2Y4ODEzIDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTmF0aXZlLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU5hdGl2ZS5qYXZhCkBAIC00MSw2ICs0MSw4IEBACiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgU3RyaW5nIGdldEVycm9yU3RyaW5nKGludCBlcnJvckNvZGUpOwogCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBsb2FkRHJpdmVyKCk7CisKKyAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIGlzRHJpdmVyTG9hZGVkKCk7CiAgICAgCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiB1bmxvYWREcml2ZXIoKTsKIApAQCAtMTQ5LDggKzE1MSw2IEBACiAKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBTdHJpbmcgZ2V0RGhjcEVycm9yKCk7CiAKLSAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIHNldFN1c3BlbmRPcHRpbWl6YXRpb25zQ29tbWFuZChib29sZWFuIGVuYWJsZWQpOwotCiAgICAgLyoqCiAgICAgICogV2FpdCBmb3IgdGhlIHN1cHBsaWNhbnQgdG8gc2VuZCBhbiBldmVudCwgcmV0dXJuaW5nIHRoZSBldmVudCBzdHJpbmcuCiAgICAgICogQHJldHVybiB0aGUgZXZlbnQgc3RyaW5nIHNlbnQgYnkgdGhlIHN1cHBsaWNhbnQuCmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVNYWNoaW5lLmphdmEgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVNYWNoaW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxNjUyNgotLS0gL2Rldi9udWxsCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZU1hY2hpbmUuamF2YQpAQCAtMCwwICsxLDMxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0LndpZmk7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRElTQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRU5BQkxFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfVU5LTk9XTjsKKworLyoqCisgKiBUT0RPOiBBZGQgc29mdCBBUCBzdGF0ZXMgYXMgcGFydCBvZiBXSUZJX1NUQVRFX1hYWAorICogUmV0YWluIFdJRklfU1RBVEVfRU5BQkxJTkcgdGhhdCBpbmRpY2F0ZXMgZHJpdmVyIGlzIGxvYWRpbmcKKyAqIEFkZCBXSUZJX1NUQVRFX0FQX0VOQUJMRUQgdG8gaW5kaWNhdGUgc29mdCBBUCBoYXMgc3RhcnRlZAorICogYW5kIFdJRklfU1RBVEVfRkFJTEVEIGZvciBmYWlsdXJlCisgKiBEZXByZWNhdGUgV0lGSV9TVEFURV9VTktOT1dOCisgKgorICogRG9pbmcgdGhpcyB3aWxsIHNpbXBsaWZ5IHRoZSBsb2dpYyBmb3Igc2VuZGluZyBicm9hZGNhc3RzCisgKi8KK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0RJU0FCTEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRElTQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRU5BQkxFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0VOQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRkFJTEVEOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0LkRoY3BJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtVdGlsczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbi5TdGF0dXM7CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLmJhY2t1cC5JQmFja3VwTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSGVhZHNldDsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBMmRwOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0czsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhpZXJhcmNoaWNhbFN0YXRlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOworCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogVHJhY2sgdGhlIHN0YXRlIG9mIFdpZmkgY29ubmVjdGl2aXR5LiBBbGwgZXZlbnQgaGFuZGxpbmcgaXMgZG9uZSBoZXJlLAorICogYW5kIGFsbCBjaGFuZ2VzIGluIGNvbm5lY3Rpdml0eSBzdGF0ZSBhcmUgaW5pdGlhdGVkIGhlcmUuCisgKgorICogQGhpZGUKKyAqLworLy9UT0RPOiB3ZSBzdGlsbCBuZWVkIGZyZXF1ZW50IHNjYW5uaW5nIGZvciB0aGUgY2FzZSB3aGVuCisvLyB3ZSBpc3N1ZSBkaXNjb25uZWN0IGJ1dCBuZWVkIHNjYW4gcmVzdWx0cyBmb3Igb3BlbiBuZXR3b3JrIG5vdGlmaWNhdGlvbgorcHVibGljIGNsYXNzIFdpZmlTdGF0ZU1hY2hpbmUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJXaWZpU3RhdGVNYWNoaW5lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS1RZUEUgPSAiV0lGSSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKworICAgIC8qIFRPRE86IGZldGNoIGEgY29uZmlndXJhYmxlIGludGVyZmFjZSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0ZUQVBfSUZBQ0UgPSAid2wwLjEiOworCisgICAgcHJpdmF0ZSBXaWZpTW9uaXRvciBtV2lmaU1vbml0b3I7CisgICAgcHJpdmF0ZSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIG53U2VydmljZTsKKyAgICBwcml2YXRlIENvbm5lY3Rpdml0eU1hbmFnZXIgbUNtOworCisgICAgLyogU2NhbiByZXN1bHRzIGhhbmRsaW5nICovCisgICAgcHJpdmF0ZSBMaXN0PFNjYW5SZXN1bHQ+IG1TY2FuUmVzdWx0czsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNjYW5SZXN1bHRQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJcdCsiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRfQ0FDSEVfU0laRSA9IDgwOworICAgIHByaXZhdGUgZmluYWwgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNjYW5SZXN1bHQ+IG1TY2FuUmVzdWx0Q2FjaGU7CisKKyAgICBwcml2YXRlIFN0cmluZyBtSW50ZXJmYWNlTmFtZTsKKworICAgIHByaXZhdGUgaW50IG1OdW1BbGxvd2VkQ2hhbm5lbHMgPSAwOworICAgIHByaXZhdGUgaW50IG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsKKyAgICBwcml2YXRlIFN0cmluZyBtTGFzdEJzc2lkOworICAgIHByaXZhdGUgaW50IG1MYXN0TmV0d29ya0lkOworICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlUnNzaVBvbGxpbmcgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVVzZVN0YXRpY0lwID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgbVJlY29ubmVjdENvdW50ID0gMDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzU2Nhbk1vZGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUNvbmZpZ0NoYW5nZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEluc3RhbmNlIG9mIHRoZSBibHVldG9vdGggaGVhZHNldCBoZWxwZXIuIFRoaXMgbmVlZHMgdG8gYmUgY3JlYXRlZAorICAgICAqIGVhcmx5IGJlY2F1c2UgdGhlcmUgaXMgYSBkZWxheSBiZWZvcmUgaXQgYWN0dWFsbHkgJ2Nvbm5lY3RzJywgYXMKKyAgICAgKiBub3RlZCBieSBpdHMgamF2YWRvYy4gSWYgd2UgY2hlY2sgYmVmb3JlIGl0IGlzIGNvbm5lY3RlZCwgaXQgd2lsbCBiZQorICAgICAqIGluIGFuIGVycm9yIHN0YXRlIGFuZCB3ZSB3aWxsIG5vdCBkaXNhYmxlIGNvZXhpc3RlbmNlLgorICAgICAqLworICAgIHByaXZhdGUgQmx1ZXRvb3RoSGVhZHNldCBtQmx1ZXRvb3RoSGVhZHNldDsKKworICAgIHByaXZhdGUgQmx1ZXRvb3RoQTJkcCBtQmx1ZXRvb3RoQTJkcDsKKworICAgIC8qKgorICAgICAqIE9ic2VydmVzIHRoZSBzdGF0aWMgSVAgYWRkcmVzcyBzZXR0aW5ncy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNldHRpbmdzT2JzZXJ2ZXIgbVNldHRpbmdzT2JzZXJ2ZXI7CisgICAgcHJpdmF0ZSBMaW5rUHJvcGVydGllcyBtTGlua1Byb3BlcnRpZXM7CisKKyAgICAvLyBIZWxkIGR1cmluZyBkcml2ZXIgbG9hZCBhbmQgdW5sb2FkCisgICAgcHJpdmF0ZSBzdGF0aWMgUG93ZXJNYW5hZ2VyLldha2VMb2NrIHNXYWtlTG9jazsKKworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKworICAgIHByaXZhdGUgRGhjcEluZm8gbURoY3BJbmZvOworICAgIHByaXZhdGUgV2lmaUluZm8gbVdpZmlJbmZvOworICAgIHByaXZhdGUgTmV0d29ya0luZm8gbU5ldHdvcmtJbmZvOworICAgIHByaXZhdGUgU3VwcGxpY2FudFN0YXRlVHJhY2tlciBtU3VwcGxpY2FudFN0YXRlVHJhY2tlcjsKKyAgICAvKiBDb25uZWN0aW9uIHRvIGEgc3BlY2lmaWMgbmV0d29yayBpbnZvbHZlcyBkaXNhYmxpbmcgYWxsIG5ldHdvcmtzLAorICAgICAqIHRoaXMgZmxhZyB0cmFja3MgaWYgbmV0d29ya3MgbmVlZCB0byBiZSByZS1lbmFibGVkICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVBbGxOZXR3b3JrcyA9IGZhbHNlOworCisKKyAgICAvLyBFdmVudCBsb2cgdGFncyAobXVzdCBiZSBpbiBzeW5jIHdpdGggZXZlbnQtbG9nLXRhZ3MpCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCAgICAgICAgPSA1MDAyMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVEICAgICAgICA9IDUwMDIyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVExPR19TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQgID0gNTAwMjM7CisKKyAgICAvKiBMb2FkIHRoZSBkcml2ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0xPQURfRFJJVkVSICAgICAgICAgICAgICAgICAgICAgID0gMTsKKyAgICAvKiBVbmxvYWQgdGhlIGRyaXZlciAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfVU5MT0FEX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgPSAyOworICAgIC8qIEluZGljYXRlcyBkcml2ZXIgbG9hZCBzdWNjZWVkZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0xPQURfRFJJVkVSX1NVQ0NFU1MgICAgICAgICAgICAgID0gMzsKKyAgICAvKiBJbmRpY2F0ZXMgZHJpdmVyIGxvYWQgZmFpbGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9MT0FEX0RSSVZFUl9GQUlMVVJFICAgICAgICAgICAgICA9IDQ7CisgICAgLyogSW5kaWNhdGVzIGRyaXZlciB1bmxvYWQgc3VjY2VlZGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9VTkxPQURfRFJJVkVSX1NVQ0NFU1MgICAgICAgICAgICA9IDU7CisgICAgLyogSW5kaWNhdGVzIGRyaXZlciB1bmxvYWQgZmFpbGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9VTkxPQURfRFJJVkVSX0ZBSUxVUkUgICAgICAgICAgICA9IDY7CisKKyAgICAvKiBTdGFydCB0aGUgc3VwcGxpY2FudCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RBUlRfU1VQUExJQ0FOVCAgICAgICAgICAgICAgICAgPSAxMTsKKyAgICAvKiBTdG9wIHRoZSBzdXBwbGljYW50ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVE9QX1NVUFBMSUNBTlQgICAgICAgICAgICAgICAgICA9IDEyOworICAgIC8qIFN0YXJ0IHRoZSBkcml2ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NUQVJUX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgID0gMTM7CisgICAgLyogU3RhcnQgdGhlIGRyaXZlciAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RPUF9EUklWRVIgICAgICAgICAgICAgICAgICAgICAgPSAxNDsKKyAgICAvKiBJbmRpY2F0ZXMgREhDUCBzdWNjZWRlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfSVBfQ09ORklHX1NVQ0NFU1MgICAgICAgICAgICAgICAgPSAxNTsKKyAgICAvKiBJbmRpY2F0ZXMgREhDUCBmYWlsZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0lQX0NPTkZJR19GQUlMVVJFICAgICAgICAgICAgICAgID0gMTY7CisgICAgLyogUmUtY29uZmlndXJlIGludGVyZmFjZSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUkVDT05GSUdVUkVfSVAgICAgICAgICAgICAgICAgICAgPSAxNzsKKworCisgICAgLyogU3RhcnQgdGhlIHNvZnQgYWNjZXNzIHBvaW50ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVEFSVF9BUCAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxOworICAgIC8qIFN0b3AgdGhlIHNvZnQgYWNjZXNzIHBvaW50ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVE9QX0FQICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyOworCisKKyAgICAvKiBTdXBwbGljYW50IGV2ZW50cyAqLworICAgIC8qIENvbm5lY3Rpb24gdG8gc3VwcGxpY2FudCBlc3RhYmxpc2hlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVVBfQ09OTkVDVElPTl9FVkVOVCAgICAgICAgICAgICAgICAgPSAzMTsKKyAgICAvKiBDb25uZWN0aW9uIHRvIHN1cHBsaWNhbnQgbG9zdCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVVBfRElTQ09OTkVDVElPTl9FVkVOVCAgICAgICAgICAgICAgPSAzMjsKKyAgICAvKiBEcml2ZXIgc3RhcnQgY29tcGxldGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSSVZFUl9TVEFSVF9FVkVOVCAgICAgICAgICAgICAgICAgICA9IDMzOworICAgIC8qIERyaXZlciBzdG9wIGNvbXBsZXRlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfU1RPUF9FVkVOVCAgICAgICAgICAgICAgICAgICAgPSAzNDsKKyAgICAvKiBOZXR3b3JrIGNvbm5lY3Rpb24gY29tcGxldGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVCAgICAgICAgICAgICA9IDM2OworICAgIC8qIE5ldHdvcmsgZGlzY29ubmVjdGlvbiBjb21wbGV0ZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkVUV09SS19ESVNDT05ORUNUSU9OX0VWRU5UICAgICAgICAgID0gMzc7CisgICAgLyogU2NhbiByZXN1bHRzIGFyZSBhdmFpbGFibGUgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRTX0VWRU5UICAgICAgICAgICAgICAgICAgID0gMzg7CisgICAgLyogU3VwcGxpY2F0ZSBzdGF0ZSBjaGFuZ2VkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5UICAgICAgICA9IDM5OworICAgIC8qIFBhc3N3b3JkIG1heSBiZSBpbmNvcnJlY3QgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfTUFZX0JFX0lOQ09SUkVDVF9FVkVOVCAgICAgID0gNDA7CisKKyAgICAvKiBTdXBwbGljYW50IGNvbW1hbmRzICovCisgICAgLyogSXMgc3VwcGxpY2FudCBhbGl2ZSA/ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9QSU5HX1NVUFBMSUNBTlQgICAgICAgICAgICAgICAgICA9IDUxOworICAgIC8qIEFkZC91cGRhdGUgYSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0FERF9PUl9VUERBVEVfTkVUV09SSyAgICAgICAgICAgID0gNTI7CisgICAgLyogRGVsZXRlIGEgbmV0d29yayAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUkVNT1ZFX05FVFdPUksgICAgICAgICAgICAgICAgICAgPSA1MzsKKyAgICAvKiBFbmFibGUgYSBuZXR3b3JrLiBUaGUgZGV2aWNlIHdpbGwgYXR0ZW1wdCBhIGNvbm5lY3Rpb24gdG8gdGhlIGdpdmVuIG5ldHdvcmsuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9FTkFCTEVfTkVUV09SSyAgICAgICAgICAgICAgICAgICA9IDU0OworICAgIC8qIERpc2FibGUgYSBuZXR3b3JrLiBUaGUgZGV2aWNlIGRvZXMgbm90IGF0dGVtcHQgYSBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbiBuZXR3b3JrLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfRElTQUJMRV9ORVRXT1JLICAgICAgICAgICAgICAgICAgPSA1NTsKKyAgICAvKiBCbGFja2xpc3QgbmV0d29yay4gRGUtcHJpb3JpdGl6ZXMgdGhlIGdpdmVuIEJTU0lEIGZvciBjb25uZWN0aW9uLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfQkxBQ0tMSVNUX05FVFdPUksgICAgICAgICAgICAgICAgPSA1NjsKKyAgICAvKiBDbGVhciB0aGUgYmxhY2tsaXN0IG5ldHdvcmsgbGlzdCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfQ0xFQVJfQkxBQ0tMSVNUICAgICAgICAgICAgICAgICAgPSA1NzsKKyAgICAvKiBTYXZlIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NBVkVfQ09ORklHICAgICAgICAgICAgICAgICAgICAgID0gNTg7CisKKyAgICAvKiBTdXBwbGljYW50IGNvbW1hbmRzIGFmdGVyIGRyaXZlciBzdGFydCovCisgICAgLyogSW5pdGlhdGUgYSBzY2FuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVEFSVF9TQ0FOICAgICAgICAgICAgICAgICAgICAgICA9IDcxOworICAgIC8qIFNldCBzY2FuIG1vZGUuIENPTk5FQ1RfTU9ERSBvciBTQ0FOX09OTFlfTU9ERSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU0VUX1NDQU5fTU9ERSAgICAgICAgICAgICAgICAgICAgPSA3MjsKKyAgICAvKiBTZXQgc2NhbiB0eXBlLiBTQ0FOX0FDVElWRSBvciBTQ0FOX1BBU1NJVkUgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NFVF9TQ0FOX1RZUEUgICAgICAgICAgICAgICAgICAgID0gNzM7CisgICAgLyogRGlzY29ubmVjdCBmcm9tIGEgbmV0d29yayAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfRElTQ09OTkVDVCAgICAgICAgICAgICAgICAgICAgICAgPSA3NDsKKyAgICAvKiBSZWNvbm5lY3QgdG8gYSBuZXR3b3JrICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9SRUNPTk5FQ1QgICAgICAgICAgICAgICAgICAgICAgICA9IDc1OworICAgIC8qIFJlYXNzb2NpYXRlIHRvIGEgbmV0d29yayAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUkVBU1NPQ0lBVEUgICAgICAgICAgICAgICAgICAgICAgPSA3NjsKKyAgICAvKiBTZXQgcG93ZXIgbW9kZQorICAgICAqIFBPV0VSX01PREVfQUNUSVZFCisgICAgICogUE9XRVJfTU9ERV9BVVRPCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TRVRfUE9XRVJfTU9ERSAgICAgICAgICAgICAgICAgICA9IDc3OworICAgIC8qIFNldCBibHVldG9vdGggY28tZXhpc3RlbmNlCisgICAgICogQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfRU5BQkxFRAorICAgICAqIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0RJU0FCTEVECisgICAgICogQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfU0VOU0UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0UgICAgICAgID0gNzg7CisgICAgLyogRW5hYmxlL2Rpc2FibGUgYmx1ZXRvb3RoIHNjYW4gbW9kZQorICAgICAqIHRydWUoMSkKKyAgICAgKiBmYWxzZSgwKQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREUgICAgICAgICAgPSA3OTsKKyAgICAvKiBTZXQgbnVtYmVyIG9mIGFsbG93ZWQgY2hhbm5lbHMgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NFVF9OVU1fQUxMT1dFRF9DSEFOTkVMUyAgICAgICAgID0gODA7CisgICAgLyogUmVxdWVzdCBjb25uZWN0aXZpdHkgbWFuYWdlciB3YWtlIGxvY2sgYmVmb3JlIGRyaXZlciBzdG9wICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9SRVFVRVNUX0NNX1dBS0VMT0NLICAgICAgICAgICAgICA9IDgxOworICAgIC8qIEVuYWJsZXMgUlNTSSBwb2xsICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9FTkFCTEVfUlNTSV9QT0xMICAgICAgICAgICAgICAgICA9IDgyOworICAgIC8qIFJTU0kgcG9sbCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUlNTSV9QT0xMICAgICAgICAgICAgICAgICAgICAgICAgPSA4MzsKKyAgICAvKiBHZXQgY3VycmVudCBSU1NJICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9HRVRfUlNTSSAgICAgICAgICAgICAgICAgICAgICAgICA9IDg0OworICAgIC8qIEdldCBhcHByb3ggY3VycmVudCBSU1NJICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9HRVRfUlNTSV9BUFBST1ggICAgICAgICAgICAgICAgICA9IDg1OworICAgIC8qIEdldCBsaW5rIHNwZWVkIG9uIGNvbm5lY3Rpb24gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0dFVF9MSU5LX1NQRUVEICAgICAgICAgICAgICAgICAgID0gODY7CisgICAgLyogUmFkaW8gbWFjIGFkZHJlc3MgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0dFVF9NQUNfQUREUiAgICAgICAgICAgICAgICAgICAgID0gODc7CisgICAgLyogU2V0IHVwIHBhY2tldCBmaWx0ZXJpbmcgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NUQVJUX1BBQ0tFVF9GSUxURVJJTkcgICAgICAgICAgID0gODg7CisgICAgLyogQ2xlYXIgcGFja2V0IGZpbHRlciAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RPUF9QQUNLRVRfRklMVEVSSU5HICAgICAgICAgICAgPSA4OTsKKyAgICAvKiBDb25uZWN0IHRvIGEgc3BlY2lmaWVkIG5ldHdvcmsgKG5ldHdvcmsgaWQKKyAgICAgKiBvciBXaWZpQ29uZmlndXJhdGlvbikgVGhpcyBpbnZvbHZlcyBpbmNyZWFzaW5nCisgICAgICogdGhlIHByaW9yaXR5IG9mIHRoZSBuZXR3b3JrLCBlbmFibGluZyB0aGUgbmV0d29yaworICAgICAqICh3aGlsZSBkaXNhYmxpbmcgb3RoZXJzKSBhbmQgaXNzdWluZyBhIHJlY29ubmVjdC4KKyAgICAgKiBOb3RlIHRoYXQgQ01EX1JFQ09OTkVDVCBqdXN0IGRvZXMgYSByZWNvbm5lY3QgdG8KKyAgICAgKiBhbiBleGlzdGluZyBuZXR3b3JrLiBBbGwgdGhlIG5ldHdvcmtzIGdldCBlbmFibGVkCisgICAgICogdXBvbiBhIHN1Y2Nlc3NmdWwgY29ubmVjdGlvbiBvciBhIGZhaWx1cmUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9DT05ORUNUX05FVFdPUksgICAgICAgICAgICAgICAgICA9IDkwOworICAgIC8qIFNhdmUgdGhlIHNwZWNpZmllZCBuZXR3b3JrLiBUaGlzIGludm9sdmVzIGFkZGluZworICAgICAqIGFuIGVuYWJsZWQgbmV0d29yayAoaWYgbmV3KSBhbmQgdXBkYXRpbmcgdGhlCisgICAgICogY29uZmlnIGFuZCBpc3N1aW5nIGEgc2F2ZSBvbiBzdXBwbGljYW50IGNvbmZpZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NBVkVfTkVUV09SSyAgICAgICAgICAgICAgICAgICAgID0gOTE7CisgICAgLyogRGVsZXRlIHRoZSBzcGVjaWZpZWQgbmV0d29yay4gVGhpcyBpbnZvbHZlcworICAgICAqIHJlbW92aW5nIHRoZSBuZXR3b3JrIGFuZCBpc3N1aW5nIGEgc2F2ZSBvbgorICAgICAqIHN1cHBsaWNhbnQgY29uZmlnLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfRk9SR0VUX05FVFdPUksgICAgICAgICAgICAgICAgICAgPSA5MjsKKworCisKKyAgICAvKioKKyAgICAgKiBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBwb2xsaW5nIGZvciBjb25uZWN0aW9uCisgICAgICogc3RhdHVzIGl0ZW1zIHRoYXQgYXJlIG5vdCBzZW50IHZpYSBhc3luY2hyb25vdXMgZXZlbnRzLgorICAgICAqIEFuIGV4YW1wbGUgaXMgUlNTSSAoc2lnbmFsIHN0cmVuZ3RoKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9MTF9SU1NJX0lOVEVSVkFMX01TRUNTID0gMzAwMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX01PREUgICA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fT05MWV9NT0RFID0gMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FOX0FDVElWRSA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fUEFTU0lWRSA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgd2Ugd2lsbCByZXRyeSBhIGNvbm5lY3Rpb24gdG8gYW4gYWNjZXNzIHBvaW50CisgICAgICogZm9yIHdoaWNoIHdlIGhhdmUgZmFpbGVkIGluIGFjcXVpcmluZyBhbiBJUCBhZGRyZXNzIGZyb20gREhDUC4gQSB2YWx1ZSBvZgorICAgICAqIE4gbWVhbnMgdGhhdCB3ZSB3aWxsIG1ha2UgTisxIGNvbm5lY3Rpb24gYXR0ZW1wdHMgaW4gYWxsLgorICAgICAqIDxwPgorICAgICAqIFNlZSB7QGxpbmsgU2V0dGluZ3MuU2VjdXJlI1dJRklfTUFYX0RIQ1BfUkVUUllfQ09VTlR9LiBUaGlzIGlzIHRoZSBkZWZhdWx0CisgICAgICogdmFsdWUgaWYgYSBTZXR0aW5ncyB2YWx1ZSBpcyBub3QgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfREhDUF9SRVRSSUVTID0gOTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfUE9XRVJfTU9ERV9BVVRPID0gMDsKKworICAgIC8qIERlZmF1bHQgcGFyZW50IHN0YXRlICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRGVmYXVsdFN0YXRlID0gbmV3IERlZmF1bHRTdGF0ZSgpOworICAgIC8qIFRlbXBvcmFyeSBpbml0aWFsIHN0YXRlICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtSW5pdGlhbFN0YXRlID0gbmV3IEluaXRpYWxTdGF0ZSgpOworICAgIC8qIFVubG9hZGluZyB0aGUgZHJpdmVyICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyVW5sb2FkaW5nU3RhdGUgPSBuZXcgRHJpdmVyVW5sb2FkaW5nU3RhdGUoKTsKKyAgICAvKiBMb2FkaW5nIHRoZSBkcml2ZXIgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Ecml2ZXJVbmxvYWRlZFN0YXRlID0gbmV3IERyaXZlclVubG9hZGVkU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZC91bmxvYWQgZmFpbGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyRmFpbGVkU3RhdGUgPSBuZXcgRHJpdmVyRmFpbGVkU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZGluZyAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlckxvYWRpbmdTdGF0ZSA9IG5ldyBEcml2ZXJMb2FkaW5nU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyTG9hZGVkU3RhdGUgPSBuZXcgRHJpdmVyTG9hZGVkU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZGVkLCB3YWl0aW5nIGZvciBzdXBwbGljYW50IHRvIHN0YXJ0ICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtV2FpdEZvclN1cFN0YXRlID0gbmV3IFdhaXRGb3JTdXBTdGF0ZSgpOworCisgICAgLyogRHJpdmVyIGxvYWRlZCBhbmQgc3VwcGxpY2FudCByZWFkeSAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclN1cFJlYWR5U3RhdGUgPSBuZXcgRHJpdmVyU3VwUmVhZHlTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdGFydCBpc3N1ZWQsIHdhaXRpbmcgZm9yIGNvbXBsZXRlZCBldmVudCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclN0YXJ0aW5nU3RhdGUgPSBuZXcgRHJpdmVyU3RhcnRpbmdTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdGFydGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyU3RhcnRlZFN0YXRlID0gbmV3IERyaXZlclN0YXJ0ZWRTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdG9wcGluZyAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclN0b3BwaW5nU3RhdGUgPSBuZXcgRHJpdmVyU3RvcHBpbmdTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdG9wcGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyU3RvcHBlZFN0YXRlID0gbmV3IERyaXZlclN0b3BwZWRTdGF0ZSgpOworICAgIC8qIFNjYW4gZm9yIG5ldHdvcmtzLCBubyBjb25uZWN0aW9uIHdpbGwgYmUgZXN0YWJsaXNoZWQgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1TY2FuTW9kZVN0YXRlID0gbmV3IFNjYW5Nb2RlU3RhdGUoKTsKKyAgICAvKiBDb25uZWN0aW5nIHRvIGFuIGFjY2VzcyBwb2ludCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUNvbm5lY3RNb2RlU3RhdGUgPSBuZXcgQ29ubmVjdE1vZGVTdGF0ZSgpOworICAgIC8qIEZldGNoaW5nIElQIGFmdGVyIG5ldHdvcmsgY29ubmVjdGlvbiAoYXNzb2MrYXV0aCBjb21wbGV0ZSkgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Db25uZWN0aW5nU3RhdGUgPSBuZXcgQ29ubmVjdGluZ1N0YXRlKCk7CisgICAgLyogQ29ubmVjdGVkIHdpdGggSVAgYWRkciAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUNvbm5lY3RlZFN0YXRlID0gbmV3IENvbm5lY3RlZFN0YXRlKCk7CisgICAgLyogZGlzY29ubmVjdCBpc3N1ZWQsIHdhaXRpbmcgZm9yIG5ldHdvcmsgZGlzY29ubmVjdCBjb25maXJtYXRpb24gKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1EaXNjb25uZWN0aW5nU3RhdGUgPSBuZXcgRGlzY29ubmVjdGluZ1N0YXRlKCk7CisgICAgLyogTmV0d29yayBpcyBub3QgY29ubmVjdGVkLCBzdXBwbGljYW50IGFzc29jK2F1dGggaXMgbm90IGNvbXBsZXRlICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRGlzY29ubmVjdGVkU3RhdGUgPSBuZXcgRGlzY29ubmVjdGVkU3RhdGUoKTsKKworICAgIC8qIFNvZnQgQXAgaXMgcnVubmluZyAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbVNvZnRBcFN0YXJ0ZWRTdGF0ZSA9IG5ldyBTb2Z0QXBTdGFydGVkU3RhdGUoKTsKKworCisgICAgLyoqCisgICAgICogT25lIG9mICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxFRH0sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxJTkd9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRU5BQkxFRH0sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9FTkFCTElOR30sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9VTktOT1dOfQorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1XaWZpU3RhdGUgPSBuZXcgQXRvbWljSW50ZWdlcihXSUZJX1NUQVRFX0RJU0FCTEVEKTsKKworICAgIC8qKgorICAgICAqIE9uZSBvZiAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMSU5HfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0VOQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRU5BQkxJTkd9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRkFJTEVEfQorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1XaWZpQXBTdGF0ZSA9IG5ldyBBdG9taWNJbnRlZ2VyKFdJRklfQVBfU1RBVEVfRElTQUJMRUQpOworCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1MYXN0RW5hYmxlVWlkID0gbmV3IEF0b21pY0ludGVnZXIoUHJvY2Vzcy5teVVpZCgpKTsKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgbUxhc3RBcEVuYWJsZVVpZCA9IG5ldyBBdG9taWNJbnRlZ2VyKFByb2Nlc3MubXlVaWQoKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIElCYXR0ZXJ5U3RhdHMgbUJhdHRlcnlTdGF0czsKKworICAgIHB1YmxpYyBXaWZpU3RhdGVNYWNoaW5lKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihUQUcpOworCisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKworICAgICAgICBtTmV0d29ya0luZm8gPSBuZXcgTmV0d29ya0luZm8oQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkksIDAsIE5FVFdPUktUWVBFLCAiIik7CisgICAgICAgIG1CYXR0ZXJ5U3RhdHMgPSBJQmF0dGVyeVN0YXRzLlN0dWIuYXNJbnRlcmZhY2UoU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiYmF0dGVyeWluZm8iKSk7CisKKyAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOworICAgICAgICBud1NlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7CisKKyAgICAgICAgbVdpZmlNb25pdG9yID0gbmV3IFdpZmlNb25pdG9yKHRoaXMpOworICAgICAgICBtRGhjcEluZm8gPSBuZXcgRGhjcEluZm8oKTsKKyAgICAgICAgbVdpZmlJbmZvID0gbmV3IFdpZmlJbmZvKCk7CisgICAgICAgIG1JbnRlcmZhY2VOYW1lID0gU3lzdGVtUHJvcGVydGllcy5nZXQoIndpZmkuaW50ZXJmYWNlIiwgInRpd2xhbjAiKTsKKyAgICAgICAgbVN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIgPSBuZXcgU3VwcGxpY2FudFN0YXRlVHJhY2tlcihjb250ZXh0LCBnZXRIYW5kbGVyKCkpOworCisgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0ID0gbmV3IEJsdWV0b290aEhlYWRzZXQobUNvbnRleHQsIG51bGwpOworICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKKworICAgICAgICBtTmV0d29ya0luZm8uc2V0SXNBdmFpbGFibGUoZmFsc2UpOworICAgICAgICBtTGlua1Byb3BlcnRpZXMuY2xlYXIoKTsKKyAgICAgICAgbUxhc3RCc3NpZCA9IG51bGw7CisgICAgICAgIG1MYXN0TmV0d29ya0lkID0gLTE7CisgICAgICAgIG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsKKworICAgICAgICBtU2NhblJlc3VsdENhY2hlID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTY2FuUmVzdWx0PigKKyAgICAgICAgICAgIFNDQU5fUkVTVUxUX0NBQ0hFX1NJWkUsIDAuNzVmLCB0cnVlKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBMaW1pdCB0aGUgY2FjaGUgc2l6ZSBieSBTQ0FOX1JFU1VMVF9DQUNIRV9TSVpFCisgICAgICAgICAgICAgICAgICogZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVFbGRlc3RFbnRyeShNYXAuRW50cnkgZWxkZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTQ0FOX1JFU1VMVF9DQUNIRV9TSVpFIDwgdGhpcy5zaXplKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIG1TZXR0aW5nc09ic2VydmVyID0gbmV3IFNldHRpbmdzT2JzZXJ2ZXIobmV3IEhhbmRsZXIoKSk7CisKKyAgICAgICAgUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlciA9IChQb3dlck1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOworICAgICAgICBzV2FrZUxvY2sgPSBwb3dlck1hbmFnZXIubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLCBUQUcpOworCisgICAgICAgIGFkZFN0YXRlKG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobUluaXRpYWxTdGF0ZSwgbURlZmF1bHRTdGF0ZSk7CisgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyVW5sb2FkaW5nU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclVubG9hZGVkU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Ecml2ZXJGYWlsZWRTdGF0ZSwgbURyaXZlclVubG9hZGVkU3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlckxvYWRpbmdTdGF0ZSwgbURlZmF1bHRTdGF0ZSk7CisgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyTG9hZGVkU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1XYWl0Rm9yU3VwU3RhdGUsIG1Ecml2ZXJMb2FkZWRTdGF0ZSk7CisgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyU3VwUmVhZHlTdGF0ZSwgbURlZmF1bHRTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclN0YXJ0aW5nU3RhdGUsIG1Ecml2ZXJTdXBSZWFkeVN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyU3RhcnRlZFN0YXRlLCBtRHJpdmVyU3VwUmVhZHlTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1TY2FuTW9kZVN0YXRlLCBtRHJpdmVyU3RhcnRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobUNvbm5lY3RNb2RlU3RhdGUsIG1Ecml2ZXJTdGFydGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobUNvbm5lY3RpbmdTdGF0ZSwgbUNvbm5lY3RNb2RlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobUNvbm5lY3RlZFN0YXRlLCBtQ29ubmVjdE1vZGVTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRGlzY29ubmVjdGluZ1N0YXRlLCBtQ29ubmVjdE1vZGVTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRGlzY29ubmVjdGVkU3RhdGUsIG1Db25uZWN0TW9kZVN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyU3RvcHBpbmdTdGF0ZSwgbURyaXZlclN1cFJlYWR5U3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Ecml2ZXJTdG9wcGVkU3RhdGUsIG1Ecml2ZXJTdXBSZWFkeVN0YXRlKTsKKyAgICAgICAgICAgIGFkZFN0YXRlKG1Tb2Z0QXBTdGFydGVkU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworCisgICAgICAgIHNldEluaXRpYWxTdGF0ZShtSW5pdGlhbFN0YXRlKTsKKworICAgICAgICBpZiAoREJHKSBzZXREYmcodHJ1ZSk7CisKKyAgICAgICAgLy9zdGFydCB0aGUgc3RhdGUgbWFjaGluZQorICAgICAgICBzdGFydCgpOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBNZXRob2RzIGV4cG9zZWQgZm9yIHB1YmxpYyB1c2UKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzeW5jUGluZ1N1cHBsaWNhbnQoKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2UoQ01EX1BJTkdfU1VQUExJQ0FOVCkuYm9vbFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2Nhbihib29sZWFuIGZvcmNlQWN0aXZlKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NUQVJUX1NDQU4sIGZvcmNlQWN0aXZlID8KKyAgICAgICAgICAgICAgICBTQ0FOX0FDVElWRSA6IFNDQU5fUEFTU0lWRSwgMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdpZmlFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIG1MYXN0RW5hYmxlVWlkLnNldChCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgaWYgKGVuYWJsZSkgeworICAgICAgICAgICAgLyogQXJndW1lbnQgaXMgdGhlIHN0YXRlIHRoYXQgaXMgZW50ZXJlZCBwcmlvciB0byBsb2FkICovCisgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9MT0FEX0RSSVZFUiwgV0lGSV9TVEFURV9FTkFCTElORywgMCkpOworICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1NUQVJUX1NVUFBMSUNBTlQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1NUT1BfU1VQUExJQ0FOVCk7CisgICAgICAgICAgICAvKiBBcmd1bWVudCBpcyB0aGUgc3RhdGUgdGhhdCBpcyBlbnRlcmVkIHVwb24gc3VjY2VzcyAqLworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUiwgV0lGSV9TVEFURV9ESVNBQkxFRCwgMCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2lmaUFwRW5hYmxlZChXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnLCBib29sZWFuIGVuYWJsZSkgeworICAgICAgICBtTGFzdEFwRW5hYmxlVWlkLnNldChCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgaWYgKGVuYWJsZSkgeworICAgICAgICAgICAgLyogQXJndW1lbnQgaXMgdGhlIHN0YXRlIHRoYXQgaXMgZW50ZXJlZCBwcmlvciB0byBsb2FkICovCisgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9MT0FEX0RSSVZFUiwgV0lGSV9BUF9TVEFURV9FTkFCTElORywgMCkpOworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU1RBUlRfQVAsIHdpZmlDb25maWcpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVE9QX0FQKTsKKyAgICAgICAgICAgIC8qIEFyZ3VtZW50IGlzIHRoZSBzdGF0ZSB0aGF0IGlzIGVudGVyZWQgdXBvbiBzdWNjZXNzICovCisgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9VTkxPQURfRFJJVkVSLCBXSUZJX0FQX1NUQVRFX0RJU0FCTEVELCAwKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHN5bmNHZXRXaWZpU3RhdGUoKSB7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlLmdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgc3luY0dldFdpZmlTdGF0ZUJ5TmFtZSgpIHsKKyAgICAgICAgc3dpdGNoIChtV2lmaVN0YXRlLmdldCgpKSB7CisgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRElTQUJMSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAiZGlzYWJsaW5nIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImRpc2FibGVkIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gImVuYWJsaW5nIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiZW5hYmxlZCI7CisgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gInVua25vd24gc3RhdGUiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIltpbnZhbGlkIHN0YXRlXSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHN5bmNHZXRXaWZpQXBTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1XaWZpQXBTdGF0ZS5nZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHN5bmNHZXRXaWZpQXBTdGF0ZUJ5TmFtZSgpIHsKKyAgICAgICAgc3dpdGNoIChtV2lmaUFwU3RhdGUuZ2V0KCkpIHsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9ESVNBQkxJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuICJkaXNhYmxpbmciOworICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiZGlzYWJsZWQiOworICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0VOQUJMSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAiZW5hYmxpbmciOworICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0VOQUJMRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJlbmFibGVkIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9GQUlMRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJmYWlsZWQiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIltpbnZhbGlkIHN0YXRlXSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgc3RhdHVzIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBjb25uZWN0aW9uLCBpZiBhbnkuCisgICAgICogQHJldHVybiBhIHtAbGluayBXaWZpSW5mb30gb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgY29ubmVjdGlvbgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFdpZmlJbmZvIHN5bmNSZXF1ZXN0Q29ubmVjdGlvbkluZm8oKSB7CisgICAgICAgIHJldHVybiBtV2lmaUluZm87CisgICAgfQorCisgICAgcHVibGljIERoY3BJbmZvIHN5bmNHZXREaGNwSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG1EaGNwSW5mbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREcml2ZXJTdGFydChib29sZWFuIGVuYWJsZSkgeworICAgICAgaWYgKGVuYWJsZSkgeworICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVEFSVF9EUklWRVIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZW5kTWVzc2FnZShDTURfU1RPUF9EUklWRVIpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjYW5Pbmx5TW9kZShib29sZWFuIGVuYWJsZSkgeworICAgICAgaWYgKGVuYWJsZSkgeworICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NFVF9TQ0FOX01PREUsIFNDQU5fT05MWV9NT0RFLCAwKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NFVF9TQ0FOX01PREUsIENPTk5FQ1RfTU9ERSwgMCkpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjYW5UeXBlKGJvb2xlYW4gYWN0aXZlKSB7CisgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX1NDQU5fVFlQRSwgU0NBTl9BQ1RJVkUsIDApKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX1NDQU5fVFlQRSwgU0NBTl9QQVNTSVZFLCAwKSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIExpc3Q8U2NhblJlc3VsdD4gc3luY0dldFNjYW5SZXN1bHRzTGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIG1TY2FuUmVzdWx0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNjb25uZWN0IGZyb20gQWNjZXNzIFBvaW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdENvbW1hbmQoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKENNRF9ESVNDT05ORUNUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZSBhIHJlY29ubmVjdGlvbiB0byBBUAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlY29ubmVjdENvbW1hbmQoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKENNRF9SRUNPTk5FQ1QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYXRlIGEgcmUtYXNzb2NpYXRpb24gdG8gQVAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFzc29jaWF0ZUNvbW1hbmQoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKENNRF9SRUFTU09DSUFURSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbmV0d29yayBzeW5jaHJvbm91c2x5CisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5ldHdvcmsgaWQgb2YgdGhlIG5ldyBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIGludCBzeW5jQWRkT3JVcGRhdGVOZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9BRERfT1JfVVBEQVRFX05FVFdPUkssIGNvbmZpZykuaW50VmFsdWU7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+IHN5bmNHZXRDb25maWd1cmVkTmV0d29ya3MoKSB7CisgICAgICAgIHJldHVybiBXaWZpQ29uZmlnU3RvcmUuZ2V0Q29uZmlndXJlZE5ldHdvcmtzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZXRlIGEgbmV0d29yaworICAgICAqCisgICAgICogQHBhcmFtIG5ldHdvcmtJZCBpZCBvZiB0aGUgbmV0d29yayB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3luY1JlbW92ZU5ldHdvcmsoaW50IG5ldHdvcmtJZCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1JFTU9WRV9ORVRXT1JLLCBuZXR3b3JrSWQsIDApKS5ib29sVmFsdWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBFbmFibGVOZXRQYXJhbXMgeworICAgICAgICBwcml2YXRlIGludCBuZXRJZDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGRpc2FibGVPdGhlcnM7CisgICAgICAgIEVuYWJsZU5ldFBhcmFtcyhpbnQgbiwgYm9vbGVhbiBiKSB7CisgICAgICAgICAgICBuZXRJZCA9IG47CisgICAgICAgICAgICBkaXNhYmxlT3RoZXJzID0gYjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBFbmFibGUgYSBuZXR3b3JrCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yaworICAgICAqIEBwYXJhbSBkaXNhYmxlT3RoZXJzIHRydWUsIGlmIGFsbCBvdGhlciBuZXR3b3JrcyBoYXZlIHRvIGJlIGRpc2FibGVkCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzeW5jRW5hYmxlTmV0d29yayhpbnQgbmV0SWQsIGJvb2xlYW4gZGlzYWJsZU90aGVycykgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9FTkFCTEVfTkVUV09SSywKKyAgICAgICAgICAgICAgICBuZXcgRW5hYmxlTmV0UGFyYW1zKG5ldElkLCBkaXNhYmxlT3RoZXJzKSkuYm9vbFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2FibGUgYSBuZXR3b3JrCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yaworICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3luY0Rpc2FibGVOZXR3b3JrKGludCBuZXRJZCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0RJU0FCTEVfTkVUV09SSywgbmV0SWQsIDApKS5ib29sVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmxhY2tsaXN0IGEgQlNTSUQuIFRoaXMgd2lsbCBhdm9pZCB0aGUgQVAgaWYgdGhlcmUgYXJlCisgICAgICogYWx0ZXJuYXRlIEFQcyB0byBjb25uZWN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gYnNzaWQgQlNTSUQgb2YgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUb0JsYWNrbGlzdChTdHJpbmcgYnNzaWQpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfQkxBQ0tMSVNUX05FVFdPUkssIGJzc2lkKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIGJsYWNrbGlzdCBsaXN0CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckJsYWNrbGlzdCgpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfQ0xFQVJfQkxBQ0tMSVNUKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29ubmVjdE5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0NPTk5FQ1RfTkVUV09SSywgbmV0SWQsIDApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0TmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnKSB7CisgICAgICAgIC8qIGFyZzEgaXMgdXNlZCB0byBpbmRpY2F0ZSBuZXRJZCwgZm9yY2UgYSBuZXRJZCB2YWx1ZSBvZiAtMSB3aGVuCisgICAgICAgICAqIHdlIGFyZSBwYXNzaW5nIGEgY29uZmlndXJhdGlvbiBzaW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZgorICAgICAgICAgKiAwIGlzIGEgdmFsaWQgbmV0SWQKKyAgICAgICAgICovCisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0NPTk5FQ1RfTkVUV09SSywgLTEsIDAsIHdpZmlDb25maWcpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlTmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NBVkVfTkVUV09SSywgd2lmaUNvbmZpZykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZvcmdldE5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0ZPUkdFVF9ORVRXT1JLLCBuZXRJZCwgMCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuYWJsZVJzc2lQb2xsaW5nKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0VOQUJMRV9SU1NJX1BPTEwsIGVuYWJsZWQgPyAxIDogMCwgMCkpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBHZXQgUlNTSSB0byBjdXJyZW50bHkgY29ubmVjdGVkIG5ldHdvcmsKKyAgICAgKgorICAgICAqIEByZXR1cm4gUlNTSSB2YWx1ZSwgLTEgb24gZmFpbHVyZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgc3luY0dldFJzc2koKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2UoQ01EX0dFVF9SU1NJKS5pbnRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYXBwcm94IFJTU0kgdG8gY3VycmVudGx5IGNvbm5lY3RlZCBuZXR3b3JrCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJTU0kgdmFsdWUsIC0xIG9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHN5bmNHZXRSc3NpQXBwcm94KCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9HRVRfUlNTSV9BUFBST1gpLmludFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBsaW5rIHNwZWVkIHRvIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yaworICAgICAqCisgICAgICogQHJldHVybiBsaW5rIHNwZWVkLCAtMSBvbiBmYWlsdXJlCisgICAgICovCisgICAgcHVibGljIGludCBzeW5jR2V0TGlua1NwZWVkKCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9HRVRfTElOS19TUEVFRCkuaW50VmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IE1BQyBhZGRyZXNzIG9mIHJhZGlvCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1BQyBhZGRyZXNzLCBudWxsIG9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHN5bmNHZXRNYWNBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9HRVRfTUFDX0FERFIpLnN0cmluZ1ZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IHBhY2tldCBmaWx0ZXJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFBhY2tldEZpbHRlcmluZygpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1NUQVJUX1BBQ0tFVF9GSUxURVJJTkcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3AgcGFja2V0IGZpbHRlcmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3BQYWNrZXRGaWx0ZXJpbmcoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBwb3dlciBtb2RlCisgICAgICogQHBhcmFtIG1vZGUKKyAgICAgKiAgICAgRFJJVkVSX1BPV0VSX01PREVfQVVUTworICAgICAqICAgICBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQb3dlck1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX1BPV0VSX01PREUsIG1vZGUsIDApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG51bWJlciBvZiBhbGxvd2VkIHJhZGlvIGZyZXF1ZW5jeSBjaGFubmVscyBmcm9tIHRoZSBzeXN0ZW0KKyAgICAgKiBzZXR0aW5nIHZhbHVlLCBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TnVtQWxsb3dlZENoYW5uZWxzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2V0TnVtQWxsb3dlZENoYW5uZWxzKAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9OVU1fQUxMT1dFRF9DSEFOTkVMUykpOworICAgICAgICB9IGNhdGNoIChTZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKG1OdW1BbGxvd2VkQ2hhbm5lbHMgIT0gMCkgeworICAgICAgICAgICAgICAgIHNldE51bUFsbG93ZWRDaGFubmVscyhtTnVtQWxsb3dlZENoYW5uZWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgdXNlIHRoZSBkcml2ZXIgZGVmYXVsdAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBudW1iZXIgb2YgcmFkaW8gZnJlcXVlbmN5IGNoYW5uZWxzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZAorICAgICAqIGluIHRoZSBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluLgorICAgICAqIEBwYXJhbSBudW1DaGFubmVscyB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgY2hhbm5lbHMuIE11c3QgYmUgZ3JlYXRlciB0aGFuIDAKKyAgICAgKiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE2LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE51bUFsbG93ZWRDaGFubmVscyhpbnQgbnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTLCBudW1DaGFubmVscywgMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscworICAgICAqCisgICAgICogQHJldHVybiBjaGFubmVsIGNvdW50LCAtMSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBUT0RPOiB0aGlzIGlzIG5vdCBhIHB1YmxpYyBBUEkgYW5kIG5lZWRzIHRvIGJlIHJlbW92ZWQgaW4gZmF2b3IKKyAgICAgKiBvZiBhc3luY2hyb25vdXMgcmVwb3J0aW5nLiB1bnVzZWQgZm9yIG5vdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE51bUFsbG93ZWRDaGFubmVscygpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBibHVldG9vdGggY29leCBtb2RlOgorICAgICAqCisgICAgICogQHBhcmFtIG1vZGUKKyAgICAgKiAgQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfRU5BQkxFRAorICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9ESVNBQkxFRAorICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9TRU5TRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZShpbnQgbW9kZSkgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfQkxVRVRPT1RIX0NPRVhJU1RFTkNFLCBtb2RlLCAwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlIG9yIGRpc2FibGUgQmx1ZXRvb3RoIGNvZXhpc3RlbmNlIHNjYW4gbW9kZS4gV2hlbiB0aGlzIG1vZGUgaXMgb24sCisgICAgICogc29tZSBvZiB0aGUgbG93LWxldmVsIHNjYW4gcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSBkcml2ZXIgYXJlIGNoYW5nZWQgdG8KKyAgICAgKiByZWR1Y2UgaW50ZXJmZXJlbmNlIHdpdGggQTJEUCBzdHJlYW1pbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXNCbHVldG9vdGhQbGF5aW5nIHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhpcyBtb2RlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qmx1ZXRvb3RoU2Nhbk1vZGUoYm9vbGVhbiBpc0JsdWV0b290aFBsYXlpbmcpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREUsIGlzQmx1ZXRvb3RoUGxheWluZyA/IDEgOiAwLCAwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZSBjb25maWd1cmF0aW9uIG9uIHN1cHBsaWNhbnQKKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICoKKyAgICAgKiBUT0RPOiBkZXByZWNhdGUgdGhpcworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN5bmNTYXZlQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9TQVZFX0NPTkZJRykuYm9vbFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RDbVdha2VMb2NrKCkgeworICAgICAgICBzZW5kTWVzc2FnZShDTURfUkVRVUVTVF9DTV9XQUtFTE9DSyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmcgTFMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisgICAgICAgIHNiLmFwcGVuZCgiY3VycmVudCBIU00gc3RhdGU6ICIpLmFwcGVuZChnZXRDdXJyZW50U3RhdGUoKS5nZXROYW1lKCkpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibUxpbmtQcm9wZXJ0aWVzICIpLmFwcGVuZChtTGlua1Byb3BlcnRpZXMpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibVdpZmlJbmZvICIpLmFwcGVuZChtV2lmaUluZm8pLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibURoY3BJbmZvICIpLmFwcGVuZChtRGhjcEluZm8pLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibU5ldHdvcmtJbmZvICIpLmFwcGVuZChtTmV0d29ya0luZm8pLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibU51bUFsbG93ZWRDaGFubmVscyAiKS5hcHBlbmQobU51bUFsbG93ZWRDaGFubmVscykuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtTGFzdFNpZ25hbExldmVsICIpLmFwcGVuZChtTGFzdFNpZ25hbExldmVsKS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1MYXN0QnNzaWQgIikuYXBwZW5kKG1MYXN0QnNzaWQpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibUxhc3ROZXR3b3JrSWQgIikuYXBwZW5kKG1MYXN0TmV0d29ya0lkKS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1FbmFibGVBbGxOZXR3b3JrcyAiKS5hcHBlbmQobUVuYWJsZUFsbE5ldHdvcmtzKS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1FbmFibGVSc3NpUG9sbGluZyAiKS5hcHBlbmQobUVuYWJsZVJzc2lQb2xsaW5nKS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ICIpLmFwcGVuZChtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCkuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtVXNlU3RhdGljSXAgIikuYXBwZW5kKG1Vc2VTdGF0aWNJcCkuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtUmVjb25uZWN0Q291bnQgIikuYXBwZW5kKG1SZWNvbm5lY3RDb3VudCkuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtSXNTY2FuTW9kZSAiKS5hcHBlbmQobUlzU2Nhbk1vZGUpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibUNvbmZpZ0NoYW5nZWQgIikuYXBwZW5kKG1Db25maWdDaGFuZ2VkKS5hcHBlbmQoTFMpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgiU3VwcGxpY2FudCBzdGF0dXMiKS5hcHBlbmQoTFMpCisgICAgICAgICAgICAgICAgLmFwcGVuZChXaWZpTmF0aXZlLnN0YXR1c0NvbW1hbmQoKSkuYXBwZW5kKExTKS5hcHBlbmQoTFMpOworCisgICAgICAgIHNiLmFwcGVuZChXaWZpQ29uZmlnU3RvcmUuZHVtcCgpKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIEludGVybmFsIHByaXZhdGUgZnVuY3Rpb25zCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgY2xhc3MgU3luY1JldHVybiB7CisgICAgICAgIGJvb2xlYW4gYm9vbFZhbHVlOworICAgICAgICBpbnQgaW50VmFsdWU7CisgICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZTsKKyAgICAgICAgT2JqZWN0IG9ialZhbHVlOworICAgIH0KKworICAgIGNsYXNzIFN5bmNQYXJhbXMgeworICAgICAgICBPYmplY3QgbVBhcmFtZXRlcjsKKyAgICAgICAgU3luY1JldHVybiBtU3luY1JldHVybjsKKyAgICAgICAgU3luY1BhcmFtcygpIHsKKyAgICAgICAgICAgIG1TeW5jUmV0dXJuID0gbmV3IFN5bmNSZXR1cm4oKTsKKyAgICAgICAgfQorICAgICAgICBTeW5jUGFyYW1zKE9iamVjdCBwKSB7CisgICAgICAgICAgICBtUGFyYW1ldGVyID0gcDsKKyAgICAgICAgICAgIG1TeW5jUmV0dXJuID0gbmV3IFN5bmNSZXR1cm4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIG1lc3NhZ2Uub2JqIGlzIHVzZWQgdG8gc3RvcmUgU3luY1BhcmFtcworICAgICAqLworICAgIHByaXZhdGUgU3luY1JldHVybiBzeW5jZWRTZW5kKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIFN5bmNQYXJhbXMgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtc2cub2JqOworICAgICAgICBzeW5jaHJvbml6ZWQoc3luY1BhcmFtcykgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAic3luY2VkU2VuZCAiICsgbXNnKTsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG1zZyk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMud2FpdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInNlbmRTeW5jTWVzc2FnZTogdW5leHBlY3RlZCBpbnRlcnJ1cHRpb24gb2Ygd2FpdCgpIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN5bmNQYXJhbXMubVN5bmNSZXR1cm47CisgICAgfQorCisgICAgcHJpdmF0ZSBTeW5jUmV0dXJuIHNlbmRTeW5jTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXMgPSBuZXcgU3luY1BhcmFtcygpOworICAgICAgICBtc2cub2JqID0gc3luY1BhcmFtczsKKyAgICAgICAgcmV0dXJuIHN5bmNlZFNlbmQobXNnKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN5bmNSZXR1cm4gc2VuZFN5bmNNZXNzYWdlKGludCB3aGF0LCBPYmplY3QgcGFyYW0pIHsKKyAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zID0gbmV3IFN5bmNQYXJhbXMocGFyYW0pOworICAgICAgICBNZXNzYWdlIG1zZyA9IG9idGFpbk1lc3NhZ2Uod2hhdCwgc3luY1BhcmFtcyk7CisgICAgICAgIHJldHVybiBzeW5jZWRTZW5kKG1zZyk7CisgICAgfQorCisKKyAgICBwcml2YXRlIFN5bmNSZXR1cm4gc2VuZFN5bmNNZXNzYWdlKGludCB3aGF0KSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2Uob2J0YWluTWVzc2FnZSh3aGF0KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeU9uTXNnT2JqZWN0KE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIFN5bmNQYXJhbXMgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtc2cub2JqOworICAgICAgICBpZiAoc3luY1BhcmFtcyAhPSBudWxsKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQoc3luY1BhcmFtcykgeworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIm5vdGlmeU9uTXNnT2JqZWN0ICIgKyBtc2cpOworICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciEgc3luY1BhcmFtcyBpbiBub3RpZnlPbk1zZ09iamVjdCBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0V2lmaVN0YXRlKGludCB3aWZpU3RhdGUpIHsKKyAgICAgICAgZmluYWwgaW50IHByZXZpb3VzV2lmaVN0YXRlID0gbVdpZmlTdGF0ZS5nZXQoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHdpZmlTdGF0ZSA9PSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT24obUxhc3RFbmFibGVVaWQuZ2V0KCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aWZpU3RhdGUgPT0gV0lGSV9TVEFURV9ESVNBQkxFRCkgeworICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlPZmYobUxhc3RFbmFibGVVaWQuZ2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIG5vdGUgYmF0dGVyeSBzdGF0cyBpbiB3aWZpIik7CisgICAgICAgIH0KKworICAgICAgICBtV2lmaVN0YXRlLnNldCh3aWZpU3RhdGUpOworCisgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInNldFdpZmlTdGF0ZTogIiArIHN5bmNHZXRXaWZpU3RhdGVCeU5hbWUoKSk7CisKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfV0lGSV9TVEFURSwgd2lmaVN0YXRlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1BSRVZJT1VTX1dJRklfU1RBVEUsIHByZXZpb3VzV2lmaVN0YXRlKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRXaWZpQXBTdGF0ZShpbnQgd2lmaUFwU3RhdGUpIHsKKyAgICAgICAgZmluYWwgaW50IHByZXZpb3VzV2lmaUFwU3RhdGUgPSBtV2lmaUFwU3RhdGUuZ2V0KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh3aWZpQXBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0VOQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT24obUxhc3RBcEVuYWJsZVVpZC5nZXQoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdpZmlBcFN0YXRlID09IFdJRklfQVBfU1RBVEVfRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT2ZmKG1MYXN0QXBFbmFibGVVaWQuZ2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmFpbGVkIHRvIG5vdGUgYmF0dGVyeSBzdGF0cyBpbiB3aWZpIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBVcGRhdGUgc3RhdGUKKyAgICAgICAgbVdpZmlBcFN0YXRlLnNldCh3aWZpQXBTdGF0ZSk7CisKKyAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAic2V0V2lmaUFwU3RhdGU6ICIgKyBzeW5jR2V0V2lmaUFwU3RhdGVCeU5hbWUoKSk7CisKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuV0lGSV9BUF9TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfV0lGSV9BUF9TVEFURSwgd2lmaUFwU3RhdGUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfUFJFVklPVVNfV0lGSV9BUF9TVEFURSwgcHJldmlvdXNXaWZpQXBTdGF0ZSk7CisgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgc2NhbiByZXN1bHQgbGluZSBwYXNzZWQgdG8gdXMgYnkgd3BhX3N1cHBsaWNhbnQgKGhlbHBlcikuCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgdG8gcGFyc2UKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgU2NhblJlc3VsdH0gb2JqZWN0CisgICAgICovCisgICAgcHJpdmF0ZSBTY2FuUmVzdWx0IHBhcnNlU2NhblJlc3VsdChTdHJpbmcgbGluZSkgeworICAgICAgICBTY2FuUmVzdWx0IHNjYW5SZXN1bHQgPSBudWxsOworICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ2FjaGUgaW1wbGVtZW50YXRpb24gKExpbmtlZEhhc2hNYXApIGlzIG5vdCBzeW5jaHJvbml6ZWQsIHRodXMsCisgICAgICAgICAgICAgKiBtdXN0IHN5bmNocm9uaXplZCBoZXJlIQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TY2FuUmVzdWx0Q2FjaGUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBzY2FuUmVzdWx0UGF0dGVybi5zcGxpdChsaW5lKTsKKyAgICAgICAgICAgICAgICBpZiAoMyA8PSByZXN1bHQubGVuZ3RoICYmIHJlc3VsdC5sZW5ndGggPD0gNSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnNzaWQgPSByZXN1bHRbMF07CisgICAgICAgICAgICAgICAgICAgIC8vIGJzc2lkIHwgZnJlcXVlbmN5IHwgbGV2ZWwgfCBmbGFncyB8IHNzaWQKKyAgICAgICAgICAgICAgICAgICAgaW50IGZyZXF1ZW5jeTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gSW50ZWdlci5wYXJzZUludChyZXN1bHRbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3VsdFsyXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb21lIGltcGxlbWVudGF0aW9ucyBhdm9pZCBuZWdhdGl2ZSB2YWx1ZXMgYnkgYWRkaW5nIDI1NgorICAgICAgICAgICAgICAgICAgICAgICAgICogc28gd2UgbmVlZCB0byBhZGp1c3QgZm9yIHRoYXQgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID4gMCkgbGV2ZWwgLT0gMjU2OworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIFRoZSBmb3JtYXR0aW5nIG9mIHRoZSByZXN1bHRzIHJldHVybmVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAqIHdwYV9zdXBwbGljYW50IGlzIGludGVuZGVkIHRvIG1ha2UgdGhlIGZpZWxkcworICAgICAgICAgICAgICAgICAgICAgKiBsaW5lIHVwIG5pY2VseSB3aGVuIHByaW50ZWQsCisgICAgICAgICAgICAgICAgICAgICAqIG5vdCB0byBtYWtlIHRoZW0gZWFzeSB0byBwYXJzZS4gU28gd2UgaGF2ZSB0bworICAgICAgICAgICAgICAgICAgICAgKiBhcHBseSBzb21lIGhldXJpc3RpY3MgdG8gZmlndXJlIG91dCB3aGljaCBmaWVsZAorICAgICAgICAgICAgICAgICAgICAgKiBpcyB0aGUgU1NJRCBhbmQgd2hpY2ggZmllbGQgaXMgdGhlIGZsYWdzLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNzaWQ7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmbGFnczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdFszXS5jaGFyQXQoMCkgPT0gJ1snKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZXN1bHRbM107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQgPSByZXN1bHRbM107CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0Lmxlbmd0aCA9PSA1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlc3VsdFszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQgPSByZXN1bHRbNF07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBIZXJlLCB3ZSBtdXN0IGhhdmUgMyBmaWVsZHM6IG5vIGZsYWdzIGFuZCBzc2lkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICBzc2lkID0gIiI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBic3NpZCArIHNzaWQgaXMgdGhlIGhhc2gga2V5CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBic3NpZCArIHNzaWQ7CisgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQgPSBtU2NhblJlc3VsdENhY2hlLmdldChrZXkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2NhblJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0LmxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0LlNTSUQgPSBzc2lkOworICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdC5jYXBhYmlsaXRpZXMgPSBmbGFnczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQuZnJlcXVlbmN5ID0gZnJlcXVlbmN5OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGFkZCBzY2FuIHJlc3VsdHMgdGhhdCBoYXZlIG5vIFNTSUQgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA8IHNzaWQudHJpbSgpLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTY2FuUmVzdWx0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCwgYnNzaWQsIGZsYWdzLCBsZXZlbCwgZnJlcXVlbmN5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2NhblJlc3VsdENhY2hlLnB1dChrZXksIHNjYW5SZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiTWlzZm9ybWF0dGVkIHNjYW4gcmVzdWx0IHRleHQgd2l0aCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmxlbmd0aCArICIgZmllbGRzOiAiICsgbGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNjYW5SZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2NhblJlc3VsdHMgaW5wdXQgZm9ybWF0CisgICAgICogMDA6YmI6Y2M6ZGQ6Y2M6ZWUgICAgICAgMjQyNyAgICAxNjYgICAgIFtXUEEtRUFQLVRLSVBdW1dQQTItRUFQLUNDTVBdICAgTmV0MQorICAgICAqIDAwOmJiOmNjOmRkOmNjOmZmICAgICAgIDI0MTIgICAgMTY1ICAgICBbV1BBLUVBUC1US0lQXVtXUEEyLUVBUC1DQ01QXSAgIE5ldDIKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0U2NhblJlc3VsdHMoU3RyaW5nIHNjYW5SZXN1bHRzKSB7CisgICAgICAgIGlmIChzY2FuUmVzdWx0cyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5MaXN0ID0gbmV3IEFycmF5TGlzdDxTY2FuUmVzdWx0PigpOworCisgICAgICAgIGludCBsaW5lQ291bnQgPSAwOworCisgICAgICAgIGludCBzY2FuUmVzdWx0c0xlbiA9IHNjYW5SZXN1bHRzLmxlbmd0aCgpOworICAgICAgICAvLyBQYXJzZSB0aGUgcmVzdWx0IHN0cmluZywga2VlcGluZyBpbiBtaW5kIHRoYXQgdGhlIGxhc3QgbGluZSBkb2VzCisgICAgICAgIC8vIG5vdCBlbmQgd2l0aCBhIG5ld2xpbmUuCisgICAgICAgIGZvciAoaW50IGxpbmVCZWcgPSAwLCBsaW5lRW5kID0gMDsgbGluZUVuZCA8PSBzY2FuUmVzdWx0c0xlbjsgKytsaW5lRW5kKSB7CisgICAgICAgICAgICBpZiAobGluZUVuZCA9PSBzY2FuUmVzdWx0c0xlbiB8fCBzY2FuUmVzdWx0cy5jaGFyQXQobGluZUVuZCkgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgICsrbGluZUNvdW50OworCisgICAgICAgICAgICAgICAgaWYgKGxpbmVDb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmVCZWcgPSBsaW5lRW5kICsgMTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsaW5lRW5kID4gbGluZUJlZykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IHNjYW5SZXN1bHRzLnN1YnN0cmluZyhsaW5lQmVnLCBsaW5lRW5kKTsKKyAgICAgICAgICAgICAgICAgICAgU2NhblJlc3VsdCBzY2FuUmVzdWx0ID0gcGFyc2VTY2FuUmVzdWx0KGxpbmUpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2NhblJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuTGlzdC5hZGQoc2NhblJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJtaXNmb3JtYXR0ZWQgc2NhbiByZXN1bHQgZm9yOiAiICsgbGluZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGluZUJlZyA9IGxpbmVFbmQgKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbVNjYW5SZXN1bHRzID0gc2Nhbkxpc3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZmV0Y2hTU0lEKCkgeworICAgICAgICBTdHJpbmcgc3RhdHVzID0gV2lmaU5hdGl2ZS5zdGF0dXNDb21tYW5kKCk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gZXh0cmFjdCBzc2lkIGZyb20gYSBzZXJpZXMgb2YgIm5hbWU9dmFsdWUiCisgICAgICAgIFN0cmluZ1tdIGxpbmVzID0gc3RhdHVzLnNwbGl0KCJcbiIpOworICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogbGluZXMpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHByb3AgPSBsaW5lLnNwbGl0KCIgKj0gKiIpOworICAgICAgICAgICAgaWYgKHByb3AubGVuZ3RoIDwgMikgY29udGludWU7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHByb3BbMF07CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwcm9wWzFdOworICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgic3NpZCIpKSByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUxpbmtQcm9wZXJ0aWVzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzLnNldEludGVyZmFjZShOZXR3b3JrSW50ZXJmYWNlLmdldEJ5TmFtZShtSW50ZXJmYWNlTmFtZSkpOworICAgICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiU29ja2V0RXhjZXB0aW9uIGNyZWF0aW5nIE5ldHdvcmtJbnRlcmZhY2UgZnJvbSAiICsgbUludGVyZmFjZU5hbWUgKworICAgICAgICAgICAgICAgICAgICAiLiBlPSIgKyBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTlBFIGNyZWF0aW5nIE5ldHdvcmtJbnRlcmZhY2UuIGU9IiArIGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE8gLSBmaXggdGhpcyBmb3IgdjYKKyAgICAgICAgbUxpbmtQcm9wZXJ0aWVzLmFkZEFkZHJlc3MoTmV0d29ya1V0aWxzLmludFRvSW5ldEFkZHJlc3MobURoY3BJbmZvLmlwQWRkcmVzcykpOworICAgICAgICBtTGlua1Byb3BlcnRpZXMuc2V0R2F0ZXdheShOZXR3b3JrVXRpbHMuaW50VG9JbmV0QWRkcmVzcyhtRGhjcEluZm8uZ2F0ZXdheSkpOworICAgICAgICBtTGlua1Byb3BlcnRpZXMuYWRkRG5zKE5ldHdvcmtVdGlscy5pbnRUb0luZXRBZGRyZXNzKG1EaGNwSW5mby5kbnMxKSk7CisgICAgICAgIG1MaW5rUHJvcGVydGllcy5hZGREbnMoTmV0d29ya1V0aWxzLmludFRvSW5ldEFkZHJlc3MobURoY3BJbmZvLmRuczIpKTsKKyAgICAgICAgLy8gVE9ETyAtIGFkZCBwcm94eSBpbmZvCisgICAgfQorCisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tVc2VTdGF0aWNJcCgpIHsKKyAgICAgICAgbVVzZVN0YXRpY0lwID0gZmFsc2U7CisgICAgICAgIGZpbmFsIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKFNldHRpbmdzLlN5c3RlbS5nZXRJbnQoY3IsIFNldHRpbmdzLlN5c3RlbS5XSUZJX1VTRV9TVEFUSUNfSVApID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFNldHRpbmdzLlNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGFkZHIgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfSVApOworICAgICAgICAgICAgaWYgKGFkZHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1EaGNwSW5mby5pcEFkZHJlc3MgPSBzdHJpbmdUb0lwQWRkcihhZGRyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkciA9IFNldHRpbmdzLlN5c3RlbS5nZXRTdHJpbmcoY3IsIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19HQVRFV0FZKTsKKyAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRGhjcEluZm8uZ2F0ZXdheSA9IHN0cmluZ1RvSXBBZGRyKGFkZHIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX05FVE1BU0spOworICAgICAgICAgICAgaWYgKGFkZHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1EaGNwSW5mby5uZXRtYXNrID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHIgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfRE5TMSk7CisgICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbURoY3BJbmZvLmRuczEgPSBzdHJpbmdUb0lwQWRkcihhZGRyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkciA9IFNldHRpbmdzLlN5c3RlbS5nZXRTdHJpbmcoY3IsIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ETlMyKTsKKyAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRGhjcEluZm8uZG5zMiA9IHN0cmluZ1RvSXBBZGRyKGFkZHIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtRGhjcEluZm8uZG5zMiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtVXNlU3RhdGljSXAgPSB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBzdHJpbmdUb0lwQWRkcihTdHJpbmcgYWRkclN0cmluZykgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHBhcnRzID0gYWRkclN0cmluZy5zcGxpdCgiXFwuIik7CisgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoICE9IDQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5rbm93bkhvc3RFeGNlcHRpb24oYWRkclN0cmluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBhID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1swXSkgICAgICA7CisgICAgICAgICAgICBpbnQgYiA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMV0pIDw8ICA4OworICAgICAgICAgICAgaW50IGMgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzJdKSA8PCAxNjsKKyAgICAgICAgICAgIGludCBkID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1szXSkgPDwgMjQ7CisKKyAgICAgICAgICAgIHJldHVybiBhIHwgYiB8IGMgfCBkOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbmtub3duSG9zdEV4Y2VwdGlvbihhZGRyU3RyaW5nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldE1heERoY3BSZXRyaWVzKCkgeworICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTUFYX0RIQ1BfUkVUUllfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfTUFYX0RIQ1BfUkVUUklFUyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAgICAgcHVibGljIFNldHRpbmdzT2JzZXJ2ZXIoSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBzdXBlcihoYW5kbGVyKTsKKyAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9VU0VfU1RBVElDX0lQKSwgZmFsc2UsIHRoaXMpOworICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfSVApLCBmYWxzZSwgdGhpcyk7CisgICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19HQVRFV0FZKSwgZmFsc2UsIHRoaXMpOworICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfTkVUTUFTSyksIGZhbHNlLCB0aGlzKTsKKyAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0ROUzEpLCBmYWxzZSwgdGhpcyk7CisgICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ETlMyKSwgZmFsc2UsIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSkgeworICAgICAgICAgICAgc3VwZXIub25DaGFuZ2Uoc2VsZkNoYW5nZSk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gd2FzU3RhdGljSXAgPSBtVXNlU3RhdGljSXA7CisgICAgICAgICAgICBpbnQgb0lwLCBvR3csIG9Nc2ssIG9EbnMxLCBvRG5zMjsKKyAgICAgICAgICAgIG9JcCA9IG9HdyA9IG9Nc2sgPSBvRG5zMSA9IG9EbnMyID0gMDsKKyAgICAgICAgICAgIGlmICh3YXNTdGF0aWNJcCkgeworICAgICAgICAgICAgICAgIG9JcCA9IG1EaGNwSW5mby5pcEFkZHJlc3M7CisgICAgICAgICAgICAgICAgb0d3ID0gbURoY3BJbmZvLmdhdGV3YXk7CisgICAgICAgICAgICAgICAgb01zayA9IG1EaGNwSW5mby5uZXRtYXNrOworICAgICAgICAgICAgICAgIG9EbnMxID0gbURoY3BJbmZvLmRuczE7CisgICAgICAgICAgICAgICAgb0RuczIgPSBtRGhjcEluZm8uZG5zMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoZWNrVXNlU3RhdGljSXAoKTsKKworICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSA9PSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0KKyAgICAgICAgICAgICAgICAod2FzU3RhdGljSXAgIT0gbVVzZVN0YXRpY0lwKSB8fAorICAgICAgICAgICAgICAgICAgICAod2FzU3RhdGljSXAgJiYgKAorICAgICAgICAgICAgICAgICAgICAgICAgb0lwICAgIT0gbURoY3BJbmZvLmlwQWRkcmVzcyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgb0d3ICAgIT0gbURoY3BJbmZvLmdhdGV3YXkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9Nc2sgICE9IG1EaGNwSW5mby5uZXRtYXNrIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBvRG5zMSAhPSBtRGhjcEluZm8uZG5zMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgb0RuczIgIT0gbURoY3BJbmZvLmRuczIpKTsKKworICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfUkVDT05GSUdVUkVfSVApOworICAgICAgICAgICAgICAgIG1Db25maWdDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gZGlzYWJsZSBjb2V4aXN0ZW5jZSBtb2RlIHdoaWxlIG9idGFpbmluZyBJUCBhZGRyZXNzLiBUaGlzCisgICAgICogbG9naWMgd2lsbCByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSBjdXJyZW50IGJsdWV0b290aAorICAgICAqIGhlYWRzZXQvaGFuZHNmcmVlIHN0YXRlIGlzIGRpc2Nvbm5lY3RlZC4gVGhpcyBtZWFucyBpZiBpdCBpcyBpbiBhbgorICAgICAqIGVycm9yIHN0YXRlLCB3ZSB3aWxsIE5PVCBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUgdG8gZXJyIG9uIHRoZSBzaWRlCisgICAgICogb2Ygc2FmZXR5LgorICAgICAqCisgICAgICogQHJldHVybiBXaGV0aGVyIHRvIGRpc2FibGUgY29leGlzdGVuY2UgbW9kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkRGlzYWJsZUNvZXhpc3RlbmNlTW9kZSgpIHsKKyAgICAgICAgaW50IHN0YXRlID0gbUJsdWV0b290aEhlYWRzZXQuZ2V0U3RhdGUobUJsdWV0b290aEhlYWRzZXQuZ2V0Q3VycmVudEhlYWRzZXQoKSk7CisgICAgICAgIHJldHVybiBzdGF0ZSA9PSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tJc0JsdWV0b290aFBsYXlpbmcoKSB7CisgICAgICAgIGJvb2xlYW4gaXNCbHVldG9vdGhQbGF5aW5nID0gZmFsc2U7CisgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGNvbm5lY3RlZCA9IG1CbHVldG9vdGhBMmRwLmdldENvbm5lY3RlZFNpbmtzKCk7CisKKyAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlIDogY29ubmVjdGVkKSB7CisgICAgICAgICAgICBpZiAobUJsdWV0b290aEEyZHAuZ2V0U2lua1N0YXRlKGRldmljZSkgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HKSB7CisgICAgICAgICAgICAgICAgaXNCbHVldG9vdGhQbGF5aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzZXRCbHVldG9vdGhTY2FuTW9kZShpc0JsdWV0b290aFBsYXlpbmcpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kU2NhblJlc3VsdHNBdmFpbGFibGVCcm9hZGNhc3QoKSB7CisgICAgICAgIGlmICghQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgcmV0dXJuOworCisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QobmV3IEludGVudChXaWZpTWFuYWdlci5TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFX0FDVElPTikpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kUnNzaUNoYW5nZUJyb2FkY2FzdChmaW5hbCBpbnQgbmV3UnNzaSkgeworICAgICAgICBpZiAoIUFjdGl2aXR5TWFuYWdlck5hdGl2ZS5pc1N5c3RlbVJlYWR5KCkpIHJldHVybjsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5SU1NJX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FV19SU1NJLCBuZXdSc3NpKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kTmV0d29ya1N0YXRlQ2hhbmdlQnJvYWRjYXN0KFN0cmluZyBic3NpZCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVAorICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVQTEFDRV9QRU5ESU5HKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FVFdPUktfSU5GTywgbU5ldHdvcmtJbmZvKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX0xJTktfUFJPUEVSVElFUywgbUxpbmtQcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKGJzc2lkICE9IG51bGwpCisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfQlNTSUQsIGJzc2lkKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kQ29uZmlnQ2hhbmdlQnJvYWRjYXN0KCkgeworICAgICAgICBpZiAoIUFjdGl2aXR5TWFuYWdlck5hdGl2ZS5pc1N5c3RlbVJlYWR5KCkpIHJldHVybjsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuQ09ORklHX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX0xJTktfUFJPUEVSVElFUywgbUxpbmtQcm9wZXJ0aWVzKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kU3VwcGxpY2FudFN0YXRlQ2hhbmdlZEJyb2FkY2FzdChTdGF0ZUNoYW5nZVJlc3VsdCBzYywgYm9vbGVhbiBmYWlsZWRBdXRoKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UCisgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19SRUNFSVZFUl9SRVBMQUNFX1BFTkRJTkcpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTkVXX1NUQVRFLCAoUGFyY2VsYWJsZSlzYy5zdGF0ZSk7CisgICAgICAgIGlmIChmYWlsZWRBdXRoKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoCisgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVhUUkFfU1VQUExJQ0FOVF9FUlJPUiwKKyAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5FUlJPUl9BVVRIRU5USUNBVElORyk7CisgICAgICAgIH0KKyAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kU3VwcGxpY2FudENvbm5lY3Rpb25DaGFuZ2VkQnJvYWRjYXN0KGJvb2xlYW4gY29ubmVjdGVkKSB7CisgICAgICAgIGlmICghQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgcmV0dXJuOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfQ09OTkVDVElPTl9DSEFOR0VfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1NVUFBMSUNBTlRfQ09OTkVDVEVELCBjb25uZWN0ZWQpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBkZXRhaWxlZCBzdGF0ZSBvZiBhIG5ldHdvcmsuCisgICAgICogQHBhcmFtIHN0YXRlIHRoZSBuZXcgQHtjb2RlIERldGFpbGVkU3RhdGV9CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldERldGFpbGVkU3RhdGUoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSkgeworICAgICAgICBMb2cuZChUQUcsICJzZXREZXRhaWxlZCBzdGF0ZSwgb2xkID0iCisgICAgICAgICAgICAgICAgKyBtTmV0d29ya0luZm8uZ2V0RGV0YWlsZWRTdGF0ZSgpICsgIiBhbmQgbmV3IHN0YXRlPSIgKyBzdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZSAhPSBtTmV0d29ya0luZm8uZ2V0RGV0YWlsZWRTdGF0ZSgpKSB7CisgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb2xsIGZvciBpbmZvIG5vdCByZXBvcnRlZCB2aWEgZXZlbnRzCisgICAgICogUlNTSSAmIExpbmtzcGVlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXF1ZXN0UG9sbGVkSW5mbygpIHsKKyAgICAgICAgaW50IG5ld1Jzc2kgPSBXaWZpTmF0aXZlLmdldFJzc2lDb21tYW5kKCk7CisgICAgICAgIGlmIChuZXdSc3NpICE9IC0xICYmIC0yMDAgPCBuZXdSc3NpICYmIG5ld1Jzc2kgPCAyNTYpIHsgLy8gc2NyZWVuIG91dCBpbnZhbGlkIHZhbHVlcworICAgICAgICAgICAgLyogc29tZSBpbXBsZW1lbnRhdGlvbnMgYXZvaWQgbmVnYXRpdmUgdmFsdWVzIGJ5IGFkZGluZyAyNTYKKyAgICAgICAgICAgICAqIHNvIHdlIG5lZWQgdG8gYWRqdXN0IGZvciB0aGF0IGhlcmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChuZXdSc3NpID4gMCkgbmV3UnNzaSAtPSAyNTY7CisgICAgICAgICAgICBtV2lmaUluZm8uc2V0UnNzaShuZXdSc3NpKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSYXRoZXIgdGhlbiBzZW5kaW5nIHRoZSByYXcgUlNTSSBvdXQgZXZlcnkgdGltZSBpdAorICAgICAgICAgICAgICogY2hhbmdlcywgd2UgcHJlY2FsY3VsYXRlIHRoZSBzaWduYWwgbGV2ZWwgdGhhdCB3b3VsZAorICAgICAgICAgICAgICogYmUgZGlzcGxheWVkIGluIHRoZSBzdGF0dXMgYmFyLCBhbmQgb25seSBzZW5kIHRoZQorICAgICAgICAgICAgICogYnJvYWRjYXN0IGlmIHRoYXQgbXVjaCBtb3JlIGNvYXJzZS1ncmFpbmVkIG51bWJlcgorICAgICAgICAgICAgICogY2hhbmdlcy4gVGhpcyBjdXRzIGRvd24gZ3JlYXRseSBvbiB0aGUgbnVtYmVyIG9mCisgICAgICAgICAgICAgKiBicm9hZGNhc3RzLCBhdCB0aGUgY29zdCBvZiBub3QgbVdpZmlJbmZvcm1pbmcgb3RoZXJzCisgICAgICAgICAgICAgKiBpbnRlcmVzdGVkIGluIFJTU0kgb2YgYWxsIHRoZSBjaGFuZ2VzIGluIHNpZ25hbAorICAgICAgICAgICAgICogbGV2ZWwuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8vIFRPRE86IFRoZSBzZWNvbmQgYXJnIHRvIHRoZSBjYWxsIGJlbG93IG5lZWRzIHRvIGJlIGEgc3ltYm9sIHNvbWV3aGVyZSwgYnV0CisgICAgICAgICAgICAvLyBpdCdzIGFjdHVhbGx5IHRoZSBzaXplIG9mIGFuIGFycmF5IG9mIGljb25zIHRoYXQncyBwcml2YXRlCisgICAgICAgICAgICAvLyB0byBTdGF0dXNCYXIgUG9saWN5LgorICAgICAgICAgICAgaW50IG5ld1NpZ25hbExldmVsID0gV2lmaU1hbmFnZXIuY2FsY3VsYXRlU2lnbmFsTGV2ZWwobmV3UnNzaSwgNCk7CisgICAgICAgICAgICBpZiAobmV3U2lnbmFsTGV2ZWwgIT0gbUxhc3RTaWduYWxMZXZlbCkgeworICAgICAgICAgICAgICAgIHNlbmRSc3NpQ2hhbmdlQnJvYWRjYXN0KG5ld1Jzc2kpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxhc3RTaWduYWxMZXZlbCA9IG5ld1NpZ25hbExldmVsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVdpZmlJbmZvLnNldFJzc2koLTIwMCk7CisgICAgICAgIH0KKyAgICAgICAgaW50IG5ld0xpbmtTcGVlZCA9IFdpZmlOYXRpdmUuZ2V0TGlua1NwZWVkQ29tbWFuZCgpOworICAgICAgICBpZiAobmV3TGlua1NwZWVkICE9IC0xKSB7CisgICAgICAgICAgICBtV2lmaUluZm8uc2V0TGlua1NwZWVkKG5ld0xpbmtTcGVlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIFdpLUZpIENvbm5lY3Rpb25zIGJ5IGNsZWFyaW5nIGFueSBzdGF0ZSwgcmVzZXR0aW5nIGFueSBzb2NrZXRzCisgICAgICogdXNpbmcgdGhlIGludGVyZmFjZSwgc3RvcHBpbmcgREhDUCAmIGRpc2FibGluZyBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlTmV0d29ya0Rpc2Nvbm5lY3QoKSB7CisgICAgICAgIExvZy5kKFRBRywgIlJlc2V0IGNvbm5lY3Rpb25zIGFuZCBzdG9wcGluZyBESENQIik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVzZXQgY29ubmVjdGlvbnMgJiBzdG9wIERIQ1AKKyAgICAgICAgICovCisgICAgICAgIE5ldHdvcmtVdGlscy5yZXNldENvbm5lY3Rpb25zKG1JbnRlcmZhY2VOYW1lKTsKKworICAgICAgICBpZiAoIU5ldHdvcmtVdGlscy5zdG9wRGhjcChtSW50ZXJmYWNlTmFtZSkpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBzdG9wIERIQ1AiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIERpc2FibGUgaW50ZXJmYWNlICovCisgICAgICAgIE5ldHdvcmtVdGlscy5kaXNhYmxlSW50ZXJmYWNlKG1JbnRlcmZhY2VOYW1lKTsKKworICAgICAgICAvKiBzZW5kIGV2ZW50IHRvIENNICYgbmV0d29yayBjaGFuZ2UgYnJvYWRjYXN0ICovCisgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQpOworICAgICAgICBzZW5kTmV0d29ya1N0YXRlQ2hhbmdlQnJvYWRjYXN0KG1MYXN0QnNzaWQpOworCisgICAgICAgIC8qIFJlc2V0IGRhdGEgc3RydWN0dXJlcyAqLworICAgICAgICBtV2lmaUluZm8uc2V0SXBBZGRyZXNzKDApOworICAgICAgICBtV2lmaUluZm8uc2V0QlNTSUQobnVsbCk7CisgICAgICAgIG1XaWZpSW5mby5zZXRTU0lEKG51bGwpOworICAgICAgICBtV2lmaUluZm8uc2V0TmV0d29ya0lkKC0xKTsKKworICAgICAgICAvKiBDbGVhciBuZXR3b3JrIHByb3BlcnRpZXMgKi8KKyAgICAgICAgbUxpbmtQcm9wZXJ0aWVzLmNsZWFyKCk7CisKKyAgICAgICAgbUxhc3RCc3NpZD0gbnVsbDsKKyAgICAgICAgbUxhc3ROZXR3b3JrSWQgPSAtMTsKKworICAgIH0KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIE5vdGlmaWNhdGlvbnMgZnJvbSBXaWZpTW9uaXRvcgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qKgorICAgICAqIEEgc3RydWN0dXJlIGZvciBzdXBwbHlpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBzdXBwbGljYW50IHN0YXRlCisgICAgICogY2hhbmdlIGluIHRoZSBTVEFURV9DSEFOR0UgZXZlbnQgbWVzc2FnZSB0aGF0IGNvbWVzIGZyb20gdGhlCisgICAgICogV2lmaU1vbml0b3IKKyAgICAgKiB0aHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhdGVDaGFuZ2VSZXN1bHQgeworICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdChpbnQgbmV0d29ya0lkLCBTdHJpbmcgQlNTSUQsIE9iamVjdCBzdGF0ZSkgeworICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgdGhpcy5CU1NJRCA9IEJTU0lEOworICAgICAgICAgICAgdGhpcy5uZXR3b3JrSWQgPSBuZXR3b3JrSWQ7CisgICAgICAgIH0KKyAgICAgICAgaW50IG5ldHdvcmtJZDsKKyAgICAgICAgU3RyaW5nIEJTU0lEOworICAgICAgICBPYmplY3Qgc3RhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IGEgdXNlci1lbnRlcmVkIHBhc3N3b3JkIGtleQorICAgICAqIG1heSBiZSBpbmNvcnJlY3QgKGkuZS4sIGNhdXNlZCBhdXRoZW50aWNhdGlvbiB0byBmYWlsKS4KKyAgICAgKi8KKyAgICB2b2lkIG5vdGlmeVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKFBBU1NXT1JEX01BWV9CRV9JTkNPUlJFQ1RfRVZFTlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCBhIGNvbm5lY3Rpb24gdG8gdGhlIHN1cHBsaWNhbnQKKyAgICAgKiBkYWVtb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQuCisgICAgICovCisgICAgdm9pZCBub3RpZnlTdXBwbGljYW50Q29ubmVjdGlvbigpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoU1VQX0NPTk5FQ1RJT05fRVZFTlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCBhIGNvbm5lY3Rpb24gdG8gdGhlIHN1cHBsaWNhbnQKKyAgICAgKiBkYWVtb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQuCisgICAgICovCisgICAgdm9pZCBub3RpZnlTdXBwbGljYW50TG9zdCgpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoU1VQX0RJU0NPTk5FQ1RJT05fRVZFTlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgc3RhdGUgb2YgV2lmaSBjb25uZWN0aXZpdHkKKyAgICAgKiBoYXMgY2hhbmdlZC4KKyAgICAgKiBAcGFyYW0gbmV0d29ya0lkIHRoZSBjb25maWd1cmVkIG5ldHdvcmsgb24gd2hpY2ggdGhlIHN0YXRlIGNoYW5nZSBvY2N1cnJlZAorICAgICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IG5ldHdvcmsgc3RhdGUKKyAgICAgKiBAcGFyYW0gQlNTSUQgd2hlbiB0aGUgbmV3IHN0YXRlIGlzIHtAbGluayBEZXRhaWxlZFN0YXRlI0NPTk5FQ1RFRAorICAgICAqIE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUuQ09OTkVDVEVEfSwKKyAgICAgKiB0aGlzIGlzIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgYWNjZXNzIHBvaW50LiBPdGhlcndpc2UsIGl0CisgICAgICogaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHZvaWQgbm90aWZ5TmV0d29ya1N0YXRlQ2hhbmdlKERldGFpbGVkU3RhdGUgbmV3U3RhdGUsIFN0cmluZyBCU1NJRCwgaW50IG5ldHdvcmtJZCkgeworICAgICAgICBpZiAobmV3U3RhdGUgPT0gTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQpIHsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoTkVUV09SS19DT05ORUNUSU9OX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RhdGVDaGFuZ2VSZXN1bHQobmV0d29ya0lkLCBCU1NJRCwgbmV3U3RhdGUpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKE5FVFdPUktfRElTQ09OTkVDVElPTl9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXRlQ2hhbmdlUmVzdWx0KG5ldHdvcmtJZCwgQlNTSUQsIG5ld1N0YXRlKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzdGF0ZSBvZiB0aGUgc3VwcGxpY2FudAorICAgICAqIGhhcyBjaGFuZ2VkLgorICAgICAqIEBwYXJhbSBuZXR3b3JrSWQgdGhlIGNvbmZpZ3VyZWQgbmV0d29yayBvbiB3aGljaCB0aGUgc3RhdGUgY2hhbmdlIG9jY3VycmVkCisgICAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcge0Bjb2RlIFN1cHBsaWNhbnRTdGF0ZX0KKyAgICAgKi8KKyAgICB2b2lkIG5vdGlmeVN1cHBsaWNhbnRTdGF0ZUNoYW5nZShpbnQgbmV0d29ya0lkLCBTdHJpbmcgQlNTSUQsIFN1cHBsaWNhbnRTdGF0ZSBuZXdTdGF0ZSkgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5ULAorICAgICAgICAgICAgICAgIG5ldyBTdGF0ZUNoYW5nZVJlc3VsdChuZXR3b3JrSWQsIEJTU0lELCBuZXdTdGF0ZSkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSBzY2FuIGhhcyBjb21wbGV0ZWQsIGFuZCByZXN1bHRzCisgICAgICogYXJlIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICB2b2lkIG5vdGlmeVNjYW5SZXN1bHRzQXZhaWxhYmxlKCkgeworICAgICAgICAvKioKKyAgICAgICAgICogU3dpdGNoIHNjYW4gbW9kZSBvdmVyIHRvIHBhc3NpdmUuCisgICAgICAgICAqIFR1cm5pbmcgb2ZmIHNjYW4tb25seSBtb2RlIGhhcHBlbnMgb25seSBpbiAiQ29ubmVjdCIgbW9kZQorICAgICAgICAgKi8KKyAgICAgICAgc2V0U2NhblR5cGUoZmFsc2UpOworICAgICAgICBzZW5kTWVzc2FnZShTQ0FOX1JFU1VMVFNfRVZFTlQpOworICAgIH0KKworICAgIHZvaWQgbm90aWZ5RHJpdmVyU3RhcnRlZCgpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoRFJJVkVSX1NUQVJUX0VWRU5UKTsKKyAgICB9CisKKyAgICB2b2lkIG5vdGlmeURyaXZlclN0b3BwZWQoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKERSSVZFUl9TVE9QX0VWRU5UKTsKKyAgICB9CisKKyAgICB2b2lkIG5vdGlmeURyaXZlckh1bmcoKSB7CisgICAgICAgIHNldFdpZmlFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgc2V0V2lmaUVuYWJsZWQodHJ1ZSk7CisgICAgfQorCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBIU00gc3RhdGVzCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBjbGFzcyBEZWZhdWx0U3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXM7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICAvKiBTeW5jaHJvbm91cyBjYWxsIHJldHVybnMgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9QSU5HX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVNT1ZFX05FVFdPUks6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRU5BQkxFX05FVFdPUks6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQUJMRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0FERF9PUl9VUERBVEVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9HRVRfUlNTSToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9HRVRfUlNTSV9BUFBST1g6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX0xJTktfU1BFRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX01BQ19BRERSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NBVkVfQ09ORklHOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmJvb2xWYWx1ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmludFZhbHVlID0gLTE7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uc3RyaW5nVmFsdWUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRU5BQkxFX1JTU0lfUE9MTDoKKyAgICAgICAgICAgICAgICAgICAgbUVuYWJsZVJzc2lQb2xsaW5nID0gKG1lc3NhZ2UuYXJnMSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgbVN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIuc2VuZE1lc3NhZ2UoQ01EX0VOQUJMRV9SU1NJX1BPTEwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogRGlzY2FyZCAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0xPQURfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1VOTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0FQOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfQVA6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU0NBTjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09OTkVDVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUFTU09DSUFURToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTkZJR1VSRV9JUDoKKyAgICAgICAgICAgICAgICBjYXNlIFNVUF9DT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgU1VQX0RJU0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBEUklWRVJfU1RBUlRfRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBEUklWRVJfU1RPUF9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfRElTQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIFNDQU5fUkVTVUxUU19FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgUEFTU1dPUkRfTUFZX0JFX0lOQ09SUkVDVF9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9CTEFDS0xJU1RfTkVUV09SSzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9DTEVBUl9CTEFDS0xJU1Q6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9UWVBFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9QT1dFUl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFUVVFU1RfQ01fV0FLRUxPQ0s6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfQ09OTkVDVF9ORVRXT1JLOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NBVkVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9GT1JHRVRfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIHVuaGFuZGxlZCBtZXNzYWdlIiArIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgSW5pdGlhbFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgLy9UT0RPOiBjb3VsZCBtb3ZlIGxvZ2dpbmcgaW50byBhIGNvbW1vbiBjbGFzcworICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAvLyBbMzEtOF0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKKyAgICAgICAgICAgIC8vIFs3IC0gMF0gSFNNIHN0YXRlIGNoYW5nZQorICAgICAgICAgICAgLy8gNTAwMjEgd2lmaV9zdGF0ZV9jaGFuZ2VkIChjdXN0b218MXw1KQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGlmIChXaWZpTmF0aXZlLmlzRHJpdmVyTG9hZGVkKCkpIHsKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyVW5sb2FkZWRTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJMb2FkaW5nU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgZmluYWwgTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuY29weUZyb20oZ2V0Q3VycmVudE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAvKiBUT0RPOiBhZGQgYSB0aW1lb3V0IHRvIGZhaWwgd2hlbiBkcml2ZXIgbG9hZCBpcyBodW5nLgorICAgICAgICAgICAgICogU2ltaWxhcmx5IGZvciBkcml2ZXIgdW5sb2FkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICAgICAgICAgIC8vZW5hYmxpbmcgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2UuYXJnMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0VOQUJMSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlTdGF0ZShXSUZJX1NUQVRFX0VOQUJMSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0VOQUJMSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKFdpZmlOYXRpdmUubG9hZERyaXZlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEcml2ZXIgbG9hZCBzdWNjZXNzZnVsIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfTE9BRF9EUklWRVJfU1VDQ0VTUyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gbG9hZCBkcml2ZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS5hcmcxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0VOQUJMSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpU3RhdGUoV0lGSV9TVEFURV9VTktOT1dOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0VOQUJMSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0xPQURfRFJJVkVSX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0xPQURfRFJJVkVSX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyTG9hZGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9MT0FEX0RSSVZFUl9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckZhaWxlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfVU5MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0FQOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlckxvYWRlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9VTkxPQURfRFJJVkVSOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlclVubG9hZGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICAgICAgaWYoV2lmaU5hdGl2ZS5zdGFydFN1cHBsaWNhbnQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3VwcGxpY2FudCBzdGFydCBzdWNjZXNzZnVsIik7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2lmaU1vbml0b3Iuc3RhcnRNb25pdG9yaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpU3RhdGUoV0lGSV9TVEFURV9FTkFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtV2FpdEZvclN1cFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBzdGFydCBzdXBwbGljYW50ISIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUiwgV0lGSV9TVEFURV9VTktOT1dOLCAwKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfQVA6CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc3RhcnRBY2Nlc3NQb2ludCgoV2lmaUNvbmZpZ3VyYXRpb24pIG1lc3NhZ2Uub2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0ZUQVBfSUZBQ0UpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gaW4gc3RhcnRBY2Nlc3NQb2ludCgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9VTkxPQURfRFJJVkVSLCBXSUZJX0FQX1NUQVRFX0ZBSUxFRCwgMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU29mdCBBUCBzdGFydCBzdWNjZXNzZnVsIik7CisgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcFN0YXRlKFdJRklfQVBfU1RBVEVfRU5BQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtU29mdEFwU3RhcnRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlclVubG9hZGluZ1N0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgICBtZXNzYWdlLmNvcHlGcm9tKGdldEN1cnJlbnRNZXNzYWdlKCkpOworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgICAgICAgICBpZihXaWZpTmF0aXZlLnVubG9hZERyaXZlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEcml2ZXIgdW5sb2FkIHN1Y2Nlc3NmdWwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9VTkxPQURfRFJJVkVSX1NVQ0NFU1MpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS5hcmcxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9VTktOT1dOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpU3RhdGUobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9GQUlMRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcFN0YXRlKG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHVubG9hZCBkcml2ZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUl9GQUlMVVJFKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2UuYXJnMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaVN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRkFJTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1VOTE9BRF9EUklWRVJfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJVbmxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfVU5MT0FEX0RSSVZFUl9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckZhaWxlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfVU5MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0FQOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlclVubG9hZGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJMb2FkaW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyRmFpbGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisKKyAgICBjbGFzcyBXYWl0Rm9yU3VwU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgU1VQX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN1cHBsaWNhbnQgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCIpOworICAgICAgICAgICAgICAgICAgICBtU3VwcGxpY2FudFN0YXRlVHJhY2tlci5yZXNldFN1cHBsaWNhbnRTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIGRhdGEgc3RydWN0dXJlcyAqLworICAgICAgICAgICAgICAgICAgICBtTGFzdEJzc2lkID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3ROZXR3b3JrSWQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RTaWduYWxMZXZlbCA9IC0xOworCisgICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRNYWNBZGRyZXNzKFdpZmlOYXRpdmUuZ2V0TWFjQWRkcmVzc0NvbW1hbmQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ1N0b3JlLmluaXRpYWxpemUobUNvbnRleHQpOworCisgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogaW5pdGlhbGl6ZSBhbmQgZml4IG11bHRpY2FzdCBmaWx0ZXJpbmcKKyAgICAgICAgICAgICAgICAgICAgLy9tV00uaW5pdGlhbGl6ZU11bHRpY2FzdEZpbHRlcmluZygpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoQTJkcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoQTJkcCA9IG5ldyBCbHVldG9vdGhBMmRwKG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjaGVja0lzQmx1ZXRvb3RoUGxheWluZygpOworCisgICAgICAgICAgICAgICAgICAgIGNoZWNrVXNlU3RhdGljSXAoKTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRDb25uZWN0aW9uQ2hhbmdlZEJyb2FkY2FzdCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdXBSZWFkeVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTdG9wIHN1cHBsaWNhbnQgcmVjZWl2ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zdG9wU3VwcGxpY2FudCgpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIEZhaWwgc29mdCBhcCB3aGVuIHdhaXRpbmcgZm9yIHN1cHBsaWNhbnQgc3RhcnQgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9BUDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmFpbGVkIHRvIHN0YXJ0IHNvZnQgQVAgd2l0aCBhIHJ1bm5pbmcgc3VwcGxpY2FudCIpOworICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1VOTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJTdXBSZWFkeVN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgICAgICAvKiBJbml0aWFsaXplIGZvciBjb25uZWN0IG1vZGUgb3BlcmF0aW9uIGF0IHN0YXJ0ICovCisgICAgICAgICAgICBtSXNTY2FuTW9kZSA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXM7CisgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWc7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9TVVBQTElDQU5UOiAgIC8qIFN1cHBsaWNhbnQgc3RvcHBlZCBieSB1c2VyICovCisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN0b3Agc3VwcGxpY2FudCByZWNlaXZlZCIpOworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnN0b3BTdXBwbGljYW50KCk7CisgICAgICAgICAgICAgICAgICAgIC8vJEZBTEwtVEhST1VHSCQKKyAgICAgICAgICAgICAgICBjYXNlIFNVUF9ESVNDT05ORUNUSU9OX0VWRU5UOiAgLyogU3VwcGxpY2FudCBkaWVkICovCisgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmNsb3NlU3VwcGxpY2FudENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlTmV0d29ya0Rpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRDb25uZWN0aW9uQ2hhbmdlZEJyb2FkY2FzdChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIG1TdXBwbGljYW50U3RhdGVUcmFja2VyLnJlc2V0U3VwcGxpY2FudFN0YXRlKCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyTG9hZGVkU3RhdGUpOworCisgICAgICAgICAgICAgICAgICAgIC8qIFdoZW4gc3VwcGxpY2FudCBkaWVzLCB1bmxvYWQgZHJpdmVyIGFuZCBlbnRlciBmYWlsZWQgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBjb25zaWRlciBicmluZ2luZyB1cCBzdXBwbGljYW50IGFnYWluCisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLndoYXQgPT0gU1VQX0RJU0NPTk5FQ1RJT05fRVZFTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN1cHBsaWNhbnQgZGllZCwgdW5sb2FkaW5nIGRyaXZlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUiwgV0lGSV9TVEFURV9VTktOT1dOLCAwKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfRFJJVkVSOgorICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zdGFydERyaXZlckNvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdGFydGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTQ0FOX1JFU1VMVFNfRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIHNldFNjYW5SZXN1bHRzKFdpZmlOYXRpdmUuc2NhblJlc3VsdHNDb21tYW5kKCkpOworICAgICAgICAgICAgICAgICAgICBzZW5kU2NhblJlc3VsdHNBdmFpbGFibGVCcm9hZGNhc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUElOR19TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmJvb2xWYWx1ZSA9IFdpZmlOYXRpdmUucGluZ0NvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0FERF9PUl9VUERBVEVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IChXaWZpQ29uZmlndXJhdGlvbikgc3luY1BhcmFtcy5tUGFyYW1ldGVyOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmludFZhbHVlID0gV2lmaUNvbmZpZ1N0b3JlLmFkZE9yVXBkYXRlTmV0d29yayhjb25maWcpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVNT1ZFX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmJvb2xWYWx1ZSA9IFdpZmlDb25maWdTdG9yZS5yZW1vdmVOZXR3b3JrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRU5BQkxFX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBFbmFibGVOZXRQYXJhbXMgZW5hYmxlTmV0UGFyYW1zID0gKEVuYWJsZU5ldFBhcmFtcykgc3luY1BhcmFtcy5tUGFyYW1ldGVyOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmJvb2xWYWx1ZSA9IFdpZmlDb25maWdTdG9yZS5lbmFibGVOZXR3b3JrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZU5ldFBhcmFtcy5uZXRJZCwgZW5hYmxlTmV0UGFyYW1zLmRpc2FibGVPdGhlcnMpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQUJMRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5ib29sVmFsdWUgPSBXaWZpQ29uZmlnU3RvcmUuZGlzYWJsZU5ldHdvcmsoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0JMQUNLTElTVF9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5hZGRUb0JsYWNrbGlzdENvbW1hbmQoKFN0cmluZyltZXNzYWdlLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0NMRUFSX0JMQUNLTElTVDoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5jbGVhckJsYWNrbGlzdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0FWRV9DT05GSUc6CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uYm9vbFZhbHVlID0gV2lmaUNvbmZpZ1N0b3JlLnNhdmVDb25maWcoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIEluZm9ybSB0aGUgYmFja3VwIG1hbmFnZXIgYWJvdXQgYSBkYXRhIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICBJQmFja3VwTWFuYWdlciBpYm0gPSBJQmFja3VwTWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5CQUNLVVBfU0VSVklDRSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoaWJtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWJtLmRhdGFDaGFuZ2VkKCJjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IGFnYWluIGxhdGVyCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX01BQ19BRERSOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLnN0cmluZ1ZhbHVlID0gV2lmaU5hdGl2ZS5nZXRNYWNBZGRyZXNzQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIENhbm5vdCBzdGFydCBzb2Z0IEFQIHdoaWxlIGluIGNsaWVudCBtb2RlICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfQVA6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZhaWxlZCB0byBzdGFydCBzb2Z0IEFQIHdpdGggYSBydW5uaW5nIHN1cHBsaWNhbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICAgICAgbUlzU2Nhbk1vZGUgPSAobWVzc2FnZS5hcmcxID09IFNDQU5fT05MWV9NT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0FWRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBjb25maWcgPSAoV2lmaUNvbmZpZ3VyYXRpb24pIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlnU3RvcmUuc2F2ZU5ldHdvcmsoY29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRk9SR0VUX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5mb3JnZXROZXR3b3JrKG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyU3RhcnRpbmdTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBEUklWRVJfU1RBUlRfRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyU3RhcnRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIFF1ZXVlIGRyaXZlciBjb21tYW5kcyAmIGNvbm5lY3Rpb24gZXZlbnRzICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VfRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBQQVNTV09SRF9NQVlfQkVfSU5DT1JSRUNUX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU0NBTjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQVNTT0NJQVRFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyU3RhcnRlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaVJ1bm5pbmcoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBpZ25vcmUpIHt9CisKKyAgICAgICAgICAgIC8qIEluaXRpYWxpemUgY2hhbm5lbCBjb3VudCAqLworICAgICAgICAgICAgc2V0TnVtQWxsb3dlZENoYW5uZWxzKCk7CisKKyAgICAgICAgICAgIGlmIChtSXNTY2FuTW9kZSkgeworICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZChTQ0FOX09OTFlfTU9ERSk7CisgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5kaXNjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtU2Nhbk1vZGVTdGF0ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZChDT05ORUNUX01PREUpOworICAgICAgICAgICAgICAgIC8qIElmIHN1cHBsaWNhbnQgaGFzIGFscmVhZHkgY29ubmVjdGVkLCBiZWZvcmUgd2UgY291bGQgZmluaXNoIGVzdGFibGlzaGluZworICAgICAgICAgICAgICAgICAqIHRoZSBjb250cm9sIGNoYW5uZWwgY29ubmVjdGlvbiwgd2UgbWlzcyBhbGwgdGhlIHN1cHBsaWNhbnQgZXZlbnRzLgorICAgICAgICAgICAgICAgICAqIERpc2Nvbm5lY3QgYW5kIHJlY29ubmVjdCB3aGVuIGRyaXZlciBoYXMgc3RhcnRlZCB0byBlbnN1cmUgd2UgcmVjZWl2ZQorICAgICAgICAgICAgICAgICAqIGFsbCBzdXBwbGljYW50IGV2ZW50cy4KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIFRPRE86IFRoaXMgaXMgYSBiaXQgdW5jbGVhbiwgaWRlYWxseSB0aGUgc3VwcGxpY2FudCBzaG91bGQgbmV2ZXIKKyAgICAgICAgICAgICAgICAgKiBjb25uZWN0IHVudGlsIHRvbGQgdG8gZG8gc28gYnkgdGhlIGZyYW1ld29yaworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnJlY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbm5lY3RNb2RlU3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXM7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fVFlQRToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX0FDVElWRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRTY2FuTW9kZUNvbW1hbmQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFNjYW5Nb2RlQ29tbWFuZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0UG93ZXJNb2RlQ29tbWFuZChtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX0NPRVhJU1RFTkNFOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZUNvbW1hbmQobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VTY2FuTW9kZUNvbW1hbmQobWVzc2FnZS5hcmcxID09IDEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgICAgIG1OdW1BbGxvd2VkQ2hhbm5lbHMgPSBtZXNzYWdlLmFyZzE7CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0TnVtQWxsb3dlZENoYW5uZWxzQ29tbWFuZChtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9EUklWRVI6CisgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSBhbm90aGVyIGRyaXZlciBzdGFydCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zdG9wRHJpdmVyQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlclN0b3BwaW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRVFVRVNUX0NNX1dBS0VMT0NLOgorICAgICAgICAgICAgICAgICAgICBpZiAobUNtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DbSA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1DbS5yZXF1ZXN0TmV0d29ya1RyYW5zaXRpb25XYWtlbG9jayhUQUcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnN0YXJ0UGFja2V0RmlsdGVyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zdG9wUGFja2V0RmlsdGVyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpU3RvcHBlZCgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGlnbm9yZSkgeyB9CisgICAgICAgICAgICBtU2NhblJlc3VsdHMgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyU3RvcHBpbmdTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBEUklWRVJfU1RPUF9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdG9wcGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogUXVldWUgZHJpdmVyIGNvbW1hbmRzICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPV0VSX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU0NBTjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQVNTT0NJQVRFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyU3RvcHBlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIFNjYW5Nb2RlU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gU0NBTl9PTkxZX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFNjYW5SZXN1bHRIYW5kbGluZ0NvbW1hbmQobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUucmVjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUlzU2Nhbk1vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NDQU46CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2NhbkNvbW1hbmQobWVzc2FnZS5hcmcxID09IFNDQU5fQUNUSVZFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0RJU0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVDT05ORUNUOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQVNTT0NJQVRFOgorICAgICAgICAgICAgICAgIGNhc2UgU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VfRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBDb25uZWN0TW9kZVN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIFN5bmNQYXJhbXMgc3luY1BhcmFtczsKKyAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0OworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgUEFTU1dPUkRfTUFZX0JFX0lOQ09SUkVDVF9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIG1TdXBwbGljYW50U3RhdGVUcmFja2VyLmhhbmRsZUV2ZW50KHN0YXRlQ2hhbmdlUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU0NBTjoKKyAgICAgICAgICAgICAgICAgICAgLyogV2UgbmVlZCB0byBzZXQgc2NhbiB0eXBlIGluIGNvbXBsZXRlZCBzdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG5ld01zZyA9IG9idGFpbk1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3TXNnLmNvcHlGcm9tKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBtU3VwcGxpY2FudFN0YXRlVHJhY2tlci5zZW5kTWVzc2FnZShuZXdNc2cpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogRG8gYSByZWR1bmRhbnQgZGlzY29ubmVjdCB3aXRob3V0IHRyYW5zaXRpb24gKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5yZWNvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQVNTT0NJQVRFOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnJlYXNzb2NpYXRlQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9DT05ORUNUX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIGludCBuZXRJZCA9IG1lc3NhZ2UuYXJnMTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnID0gKFdpZmlDb25maWd1cmF0aW9uKSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgICAgICAvKiBXZSBjb25uZWN0IHRvIGEgc3BlY2lmaWMgbmV0d29yayBieSBpc3N1aW5nIGEgc2VsZWN0CisgICAgICAgICAgICAgICAgICAgICAqIHRvIHRoZSBXaWZpQ29uZmlnU3RvcmUuIFRoaXMgZW5hYmxlcyB0aGUgbmV0d29yaywKKyAgICAgICAgICAgICAgICAgICAgICogd2hpbGUgZGlzYWJsaW5nIGFsbCBvdGhlciBuZXR3b3JrcyBpbiB0aGUgc3VwcGxpY2FudC4KKyAgICAgICAgICAgICAgICAgICAgICogRGlzYWJsaW5nIGEgY29ubmVjdGVkIG5ldHdvcmsgd2lsbCBjYXVzZSBhIGRpc2Nvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICogZnJvbSB0aGUgbmV0d29yay4gQSByZWNvbm5lY3RDb21tYW5kKCkgd2lsbCB0aGVuIGluaXRpYXRlCisgICAgICAgICAgICAgICAgICAgICAqIGEgY29ubmVjdGlvbiB0byB0aGUgZW5hYmxlZCBuZXR3b3JrLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlnU3RvcmUuc2VsZWN0TmV0d29yayhjb25maWcpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ1N0b3JlLnNlbGVjdE5ldHdvcmsobmV0SWQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSBhIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBuZWVkIHRvIGVuYWJsZSBhbGwKKyAgICAgICAgICAgICAgICAgICAgICogbmV0d29ya3MgYWZ0ZXIgc3VwcGxpY2FudCBpbmRpY2F0ZXMgYSBuZXR3b3JrCisgICAgICAgICAgICAgICAgICAgICAqIHN0YXRlIGNoYW5nZSBldmVudAorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgbUVuYWJsZUFsbE5ldHdvcmtzID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnJlY29ubmVjdENvbW1hbmQoKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBFeHBlY3QgYSBkaXNjb25uZWN0aW9uIGZyb20gdGhlIG9sZCBjb25uZWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTQ0FOX1JFU1VMVFNfRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgc2NhbiBzZXR0aW5nIGJhY2sgdG8gImNvbm5lY3QiIG1vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kKENPTk5FQ1RfTU9ERSk7CisgICAgICAgICAgICAgICAgICAgIC8qIEhhbmRsZSBzY2FuIHJlc3VsdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19DT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIk5ldHdvcmsgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCIpOworICAgICAgICAgICAgICAgICAgICBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CisKKyAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBtYWtlIHN1cHBsaWNhbnQgbW9kaWZpY2F0aW9uIHRvIHB1c2ggdGhpcyBpbiBldmVudHMKKyAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldFNTSUQoZmV0Y2hTU0lEKCkpOworICAgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0QlNTSUQobUxhc3RCc3NpZCA9IHN0YXRlQ2hhbmdlUmVzdWx0LkJTU0lEKTsKKyAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldE5ldHdvcmtJZChzdGF0ZUNoYW5nZVJlc3VsdC5uZXR3b3JrSWQpOworICAgICAgICAgICAgICAgICAgICBtTGFzdE5ldHdvcmtJZCA9IHN0YXRlQ2hhbmdlUmVzdWx0Lm5ldHdvcmtJZDsKKyAgICAgICAgICAgICAgICAgICAgLyogc2VuZCBldmVudCB0byBDTSAmIG5ldHdvcmsgY2hhbmdlIGJyb2FkY2FzdCAqLworICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuT0JUQUlOSU5HX0lQQUREUik7CisgICAgICAgICAgICAgICAgICAgIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QobUxhc3RCc3NpZCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywiTmV0d29yayBjb25uZWN0aW9uIGxvc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlTmV0d29ya0Rpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0dFVF9SU1NJOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmludFZhbHVlID0gV2lmaU5hdGl2ZS5nZXRSc3NpQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX1JTU0lfQVBQUk9YOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmludFZhbHVlID0gV2lmaU5hdGl2ZS5nZXRSc3NpQXBwcm94Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX0xJTktfU1BFRUQ6CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uaW50VmFsdWUgPSBXaWZpTmF0aXZlLmdldExpbmtTcGVlZENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBDb25uZWN0aW5nU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIGJvb2xlYW4gbW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGU7CisgICAgICAgIGludCBwb3dlck1vZGU7CisgICAgICAgIFRocmVhZCBtRGhjcFRocmVhZDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGlmICghbVVzZVN0YXRpY0lwKSB7CisKKyAgICAgICAgICAgICAgICBtRGhjcFRocmVhZCA9IG51bGw7CisgICAgICAgICAgICAgICAgbW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBwb3dlck1vZGUgPSBEUklWRVJfUE9XRVJfTU9ERV9BVVRPOworCisgICAgICAgICAgICAgICAgaWYgKHNob3VsZERpc2FibGVDb2V4aXN0ZW5jZU1vZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBUaGVyZSBhcmUgcHJvYmxlbXMgc2V0dGluZyB0aGUgV2ktRmkgZHJpdmVyJ3MgcG93ZXIKKyAgICAgICAgICAgICAgICAgICAgICogbW9kZSB0byBhY3RpdmUgd2hlbiBibHVldG9vdGggY29leGlzdGVuY2UgbW9kZSBpcworICAgICAgICAgICAgICAgICAgICAgKiBlbmFibGVkIG9yIHNlbnNlLgorICAgICAgICAgICAgICAgICAgICAgKiA8cD4KKyAgICAgICAgICAgICAgICAgICAgICogV2Ugc2V0IFdpLUZpIHRvIGFjdGl2ZSBtb2RlIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICogb2J0YWluaW5nIGFuIElQIGFkZHJlc3MgYmVjYXVzZSB3ZSd2ZSBmb3VuZAorICAgICAgICAgICAgICAgICAgICAgKiBjb21wYXRpYmlsaXR5IGlzc3VlcyB3aXRoIHNvbWUgcm91dGVycyB3aXRoIGxvdyBwb3dlcgorICAgICAgICAgICAgICAgICAgICAgKiBtb2RlLgorICAgICAgICAgICAgICAgICAgICAgKiA8cD4KKyAgICAgICAgICAgICAgICAgICAgICogSW4gb3JkZXIgZm9yIHRoaXMgYWN0aXZlIHBvd2VyIG1vZGUgdG8gcHJvcGVybHkgYmUgc2V0LAorICAgICAgICAgICAgICAgICAgICAgKiB3ZSBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUgdW50aWwgd2UncmUgZG9uZSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAqIG9idGFpbmluZyBhbiBJUCBhZGRyZXNzLiAgT25lIGV4Y2VwdGlvbiBpcyBpZiB3ZQorICAgICAgICAgICAgICAgICAgICAgKiBhcmUgY3VycmVudGx5IGNvbm5lY3RlZCB0byBhIGhlYWRzZXQsIHNpbmNlIGRpc2FibGluZworICAgICAgICAgICAgICAgICAgICAgKiBjb2V4aXN0ZW5jZSB3b3VsZCBpbnRlcnJ1cHQgdGhhdCBjb25uZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgdGhlIGNvZXhpc3RlbmNlIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfRElTQUJMRUQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBvd2VyTW9kZSA9ICBXaWZpTmF0aXZlLmdldFBvd2VyTW9kZUNvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICBpZiAocG93ZXJNb2RlIDwgMCkgeworICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHN1cHBsaWNhbnQgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgIC8vIGdldFBvd2VyTW9kZUNvbW1hbmQuCisgICAgICAgICAgICAgICAgICAgIHBvd2VyTW9kZSA9IERSSVZFUl9QT1dFUl9NT0RFX0FVVE87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwb3dlck1vZGUgIT0gRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFKSB7CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0UG93ZXJNb2RlQ29tbWFuZChEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkRIQ1AgcmVxdWVzdCBzdGFydGVkIik7CisgICAgICAgICAgICAgICAgbURoY3BUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE5ldHdvcmtVdGlscy5ydW5EaGNwKG1JbnRlcmZhY2VOYW1lLCBtRGhjcEluZm8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiREhDUCByZXF1ZXN0IHN1Y2NlZWRlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9JUF9DT05GSUdfU1VDQ0VTUyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkRIQ1AgcmVxdWVzdCBmYWlsZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzLmdldERoY3BFcnJvcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfSVBfQ09ORklHX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgbURoY3BUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKE5ldHdvcmtVdGlscy5jb25maWd1cmVJbnRlcmZhY2UobUludGVyZmFjZU5hbWUsIG1EaGNwSW5mbykpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiU3RhdGljIElQIGNvbmZpZ3VyYXRpb24gc3VjY2VlZGVkIik7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9JUF9DT05GSUdfU1VDQ0VTUyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiU3RhdGljIElQIGNvbmZpZ3VyYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9JUF9DT05GSUdfRkFJTFVSRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworCisgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICBjYXNlIENNRF9JUF9DT05GSUdfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICAgIG1SZWNvbm5lY3RDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICBtTGFzdFNpZ25hbExldmVsID0gLTE7IC8vIGZvcmNlIHVwZGF0ZSBvZiBzaWduYWwgc3RyZW5ndGgKKyAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRJcEFkZHJlc3MobURoY3BJbmZvLmlwQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJUCBjb25maWd1cmF0aW9uOiAiICsgbURoY3BJbmZvKTsKKyAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZUxpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICAgIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QobUxhc3RCc3NpZCk7CisgICAgICAgICAgICAgICAgICAvL1RPRE86IHdlIGNvdWxkIGFsc28gZGV0ZWN0IGFuIElQIGNvbmZpZyBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgIC8vIGZyb20gYSBESENQIHJlbmV3YWwgYW5kIHNlbmQgb3V0IGEgY29uZmlnIGNoYW5nZQorICAgICAgICAgICAgICAgICAgLy8gYnJvYWRjYXN0CisgICAgICAgICAgICAgICAgICBpZiAobUNvbmZpZ0NoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzZW5kQ29uZmlnQ2hhbmdlQnJvYWRjYXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ0NoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgQ01EX0lQX0NPTkZJR19GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldElwQWRkcmVzcygwKTsKKworICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSVAgY29uZmlndXJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICogSWYgd2UndmUgZXhjZWVkZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgZm9yIERIQ1AKKyAgICAgICAgICAgICAgICAgICAqIHRvIGEgZ2l2ZW4gbmV0d29yaywgZGlzYWJsZSB0aGUgbmV0d29yaworICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBpZiAoKyttUmVjb25uZWN0Q291bnQgPiBnZXRNYXhEaGNwUmV0cmllcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVjb25uZWN0Q291bnQgKyAiIHRpbWVzLCBEaXNhYmxpbmcgIiArIG1MYXN0TmV0d29ya0lkKTsKKyAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlnU3RvcmUuZGlzYWJsZU5ldHdvcmsobUxhc3ROZXR3b3JrSWQpOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAvKiBESENQIHRpbWVzIG91dCBhZnRlciBhYm91dCAzMCBzZWNvbmRzLCB3ZSBkbyBhCisgICAgICAgICAgICAgICAgICAgKiBkaXNjb25uZWN0IGFuZCBhbiBpbW1lZGlhdGUgcmVjb25uZWN0IHRvIHRyeSBhZ2FpbgorICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnJlY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIENNRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5kaXNjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0aW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgY29ubmVjdGlvbiB0byBzYW1lIG5ldHdvcmsgKi8KKyAgICAgICAgICAgICAgY2FzZSBDTURfQ09OTkVDVF9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgaW50IG5ldElkID0gbWVzc2FnZS5hcmcxOworICAgICAgICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXROZXR3b3JrSWQoKSA9PSBuZXRJZCkgeworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgICAgICAgLyogSWdub3JlICovCisgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19DT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOgorICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0RJU0NPTk5FQ1QpOworICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hcmcxID09IFNDQU5fT05MWV9NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0RJU0NPTk5FQ1QpOworICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTkZJR1VSRV9JUDoKKyAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICB9CisgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKKyAgICAgICAgICAvKiByZXNldCBwb3dlciBzdGF0ZSAmIGJsdWV0b290aCBjb2V4aXN0ZW5jZSBpZiBvbiBESENQICovCisgICAgICAgICAgaWYgKCFtVXNlU3RhdGljSXApIHsKKyAgICAgICAgICAgICAgaWYgKHBvd2VyTW9kZSAhPSBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUpIHsKKyAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0UG93ZXJNb2RlQ29tbWFuZChwb3dlck1vZGUpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKG1vZGlmaWVkQmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlKSB7CisgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGNvZXhpc3RlbmNlIG1vZGUgYmFjayB0byBpdHMgZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLkJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX1NFTlNFKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIENvbm5lY3RlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5kaXNjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09ORklHVVJFX0lQOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIlJlY29uZmlndXJpbmcgSVAgb24gY29ubmVjdGlvbiIpOworICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMucmVzZXRDb25uZWN0aW9ucyhtSW50ZXJmYWNlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9ESVNDT05ORUNUKTsKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hcmcxID09IFNDQU5fT05MWV9NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfRElTQ09OTkVDVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSBjb25uZWN0aW9uIHRvIHNhbWUgbmV0d29yayAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0NPTk5FQ1RfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ldElkID0gbWVzc2FnZS5hcmcxOworICAgICAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldE5ldHdvcmtJZCgpID09IG5ldElkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSAqLworICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19DT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRGlzY29ubmVjdGluZ1N0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6IC8qIFN0b3AgZHJpdmVyIG9ubHkgYWZ0ZXIgZGlzY29ubmVjdCBoYW5kbGVkICovCisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX09OTFlfTU9ERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7CisgICAgICAgICAgICBpZiAobUVuYWJsZUFsbE5ldHdvcmtzKSB7CisgICAgICAgICAgICAgICAgbUVuYWJsZUFsbE5ldHdvcmtzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ1N0b3JlLmVuYWJsZUFsbE5ldHdvcmtzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEaXNjb25uZWN0ZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gU0NBTl9PTkxZX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZChtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9TdXBwbGljYW50IGRpc2Nvbm5lY3QgdG8gcHJldmVudCBmdXJ0aGVyIGNvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSXNTY2FuTW9kZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVNjYW5Nb2RlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgbmV0d29yayBkaXNjb25uZWN0ICovCisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBTb2Z0QXBTdGFydGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfQVA6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywiU3RvcHBpbmcgU29mdCBBUCIpOworICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0RJU0FCTElORyk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc3RvcEFjY2Vzc1BvaW50KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiBpbiBzdG9wQWNjZXNzUG9pbnQoKSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyTG9hZGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9BUDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCJTb2Z0QVAgc2V0IG9uIGEgcnVubmluZyBhY2Nlc3MgcG9pbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG53U2VydmljZS5zZXRBY2Nlc3NQb2ludCgoV2lmaUNvbmZpZ3VyYXRpb24pIG1lc3NhZ2Uub2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0ZUQVBfSUZBQ0UpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gaW4gbndTZXJ2aWNlIGR1cmluZyBzb2Z0IEFQIHNldCIpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc3RvcEFjY2Vzc1BvaW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ291bGQgbm90IHN0b3AgQVAsIDoiICsgZWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUiwgV0lGSV9BUF9TVEFURV9GQUlMRUQsIDApKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBGYWlsIGNsaWVudCBtb2RlIG9wZXJhdGlvbiB3aGVuIHNvZnQgQVAgaXMgZW5hYmxlZCAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywiQ2Fubm90IHN0YXJ0IHN1cHBsaWNhbnQgd2l0aCBhIHJ1bm5pbmcgc29mdCBBUCIpOworICAgICAgICAgICAgICAgICAgICBzZXRXaWZpU3RhdGUoV0lGSV9TVEFURV9VTktOT1dOKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgY2xhc3MgU3VwcGxpY2FudFN0YXRlVHJhY2tlciBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVJzc2lQb2xsVG9rZW4gPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWF4IG51bWJlciBvZiB0aGUgV1BBIHN1cHBsaWNhbnQgbG9vcCBpdGVyYXRpb25zIGJlZm9yZSB3ZQorICAgICAgICAgKiBkZWNpZGUgdGhhdCB0aGUgbG9vcCBzaG91bGQgYmUgdGVybWluYXRlZDoKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfU1VQUExJQ0FOVF9MT09QX0lURVJBVElPTlMgPSA0OworICAgICAgICBwcml2YXRlIGludCBtTG9vcERldGVjdEluZGV4ID0gMDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUxvb3BEZXRlY3RDb3VudCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqICBTdXBwbGljYW50IHN0YXRlIGNoYW5nZSBjb21tYW5kcyBmb2xsb3cKKyAgICAgICAgICogIHRoZSBvcmRpbmFsIHZhbHVlcyBkZWZpbmVkIGluIFN1cHBsaWNhbnRTdGF0ZS5qYXZhCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVEVEICAgICAgICAgICA9IDA7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkFDVElWRSAgICAgICAgICAgICAgID0gMTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5OSU5HICAgICAgICAgICAgICAgPSAyOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVNTT0NJQVRJTkcgICAgICAgICAgICA9IDM7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBU1NPQ0lBVEVEICAgICAgICAgICAgID0gNDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPVVJfV0FZX0hBTkRTSEFLRSAgICAgPSA1OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JPVVBfSEFORFNIQUtFICAgICAgICA9IDY7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT01QTEVURUQgICAgICAgICAgICAgID0gNzsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERPUk1BTlQgICAgICAgICAgICAgICAgPSA4OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5JTklUSUFMSVpFRCAgICAgICAgICA9IDk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEICAgICAgICAgICAgICAgID0gMTA7CisKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtVW5pbml0aWFsaXplZFN0YXRlID0gbmV3IFVuaW5pdGlhbGl6ZWRTdGF0ZSgpOworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Jbml0aWFsaXplZFN0YXRlID0gbmV3IEluaXRpYWxpemVkU3RhdGUoKTs7CisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUluYWN0aXZlU3RhdGUgPSBuZXcgSW5hY3RpdmVTdGF0ZSgpOworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1EaXNjb25uZWN0U3RhdGUgPSBuZXcgRGlzY29ubmVjdGVkU3RhdGUoKTsKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtU2NhblN0YXRlID0gbmV3IFNjYW5TdGF0ZSgpOworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Db25uZWN0U3RhdGUgPSBuZXcgQ29ubmVjdFN0YXRlKCk7CisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUhhbmRzaGFrZVN0YXRlID0gbmV3IEhhbmRzaGFrZVN0YXRlKCk7CisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUNvbXBsZXRlZFN0YXRlID0gbmV3IENvbXBsZXRlZFN0YXRlKCk7CisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURvcm1hbnRTdGF0ZSA9IG5ldyBEb3JtYW50U3RhdGUoKTsKKworICAgICAgICBwdWJsaWMgU3VwcGxpY2FudFN0YXRlVHJhY2tlcihDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgdGFyZ2V0KSB7CisgICAgICAgICAgICBzdXBlcihUQUcsIHRhcmdldC5nZXRMb29wZXIoKSk7CisKKyAgICAgICAgICAgIGFkZFN0YXRlKG1VbmluaXRpYWxpemVkU3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobUluaXRpYWxpemVkU3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1JbmFjdGl2ZVN0YXRlLCBtSW5pdGlhbGl6ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobURpc2Nvbm5lY3RTdGF0ZSwgbUluaXRpYWxpemVkU3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1TY2FuU3RhdGUsIG1Jbml0aWFsaXplZFN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtQ29ubmVjdFN0YXRlLCBtSW5pdGlhbGl6ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1IYW5kc2hha2VTdGF0ZSwgbUNvbm5lY3RTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Db21wbGV0ZWRTdGF0ZSwgbUNvbm5lY3RTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobURvcm1hbnRTdGF0ZSwgbUluaXRpYWxpemVkU3RhdGUpOworCisgICAgICAgICAgICBzZXRJbml0aWFsU3RhdGUobVVuaW5pdGlhbGl6ZWRTdGF0ZSk7CisKKyAgICAgICAgICAgIC8vc3RhcnQgdGhlIHN0YXRlIG1hY2hpbmUKKyAgICAgICAgICAgIHN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCkgeworICAgICAgICAgICAgU3VwcGxpY2FudFN0YXRlIG5ld1N0YXRlID0gKFN1cHBsaWNhbnRTdGF0ZSkgc3RhdGVDaGFuZ2VSZXN1bHQuc3RhdGU7CisKKyAgICAgICAgICAgIC8vIFN1cHBsaWNhbnQgc3RhdGUgY2hhbmdlCisgICAgICAgICAgICAvLyBbMzEtMTNdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisgICAgICAgICAgICAvLyBbOCAtIDBdIFN1cHBsaWNhbnQgc3RhdGUgKGFzIGRlZmluZWQgaW4gU3VwcGxpY2FudFN0YXRlLmphdmEpCisgICAgICAgICAgICAvLyA1MDAyMyBzdXBwbGljYW50X3N0YXRlX2NoYW5nZWQgKGN1c3RvbXwxfDUpCisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1NVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRCwgbmV3U3RhdGUub3JkaW5hbCgpKTsKKworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShuZXdTdGF0ZS5vcmRpbmFsKCksIHN0YXRlQ2hhbmdlUmVzdWx0KSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZXNldFN1cHBsaWNhbnRTdGF0ZSgpIHsKKyAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtVW5pbml0aWFsaXplZFN0YXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCByZXNldExvb3BEZXRlY3Rpb24oKSB7CisgICAgICAgICAgICBtTG9vcERldGVjdENvdW50ID0gMDsKKyAgICAgICAgICAgIG1Mb29wRGV0ZWN0SW5kZXggPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZVRyYW5zaXRpb24oTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbXNnLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0U3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNDQU5OSU5HOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVNjYW5TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVNTT0NJQVRJTkc6CisgICAgICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICAvKiBCU1NJRCBpcyB2YWxpZCBvbmx5IGluIEFTU09DSUFUSU5HIHN0YXRlICovCisgICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRCU1NJRChzdGF0ZUNoYW5nZVJlc3VsdC5CU1NJRCk7CisgICAgICAgICAgICAgICAgICAgIC8vJEZBTEwtVEhST1VHSCQKKyAgICAgICAgICAgICAgICBjYXNlIEFTU09DSUFURUQ6CisgICAgICAgICAgICAgICAgY2FzZSBGT1VSX1dBWV9IQU5EU0hBS0U6CisgICAgICAgICAgICAgICAgY2FzZSBHUk9VUF9IQU5EU0hBS0U6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSGFuZHNoYWtlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db21wbGV0ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRE9STUFOVDoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Eb3JtYW50U3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElOQUNUSVZFOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUluYWN0aXZlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFVOSU5JVElBTElaRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBJTlZBTElEOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVVuaW5pdGlhbGl6ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtc2cub2JqOworICAgICAgICAgICAgU3VwcGxpY2FudFN0YXRlIHN1cFN0YXRlID0gKFN1cHBsaWNhbnRTdGF0ZSkgc3RhdGVDaGFuZ2VSZXN1bHQuc3RhdGU7CisgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKFdpZmlJbmZvLmdldERldGFpbGVkU3RhdGVPZihzdXBTdGF0ZSkpOworICAgICAgICAgICAgbVdpZmlJbmZvLnNldFN1cHBsaWNhbnRTdGF0ZShzdXBTdGF0ZSk7CisgICAgICAgICAgICBtV2lmaUluZm8uc2V0TmV0d29ya0lkKHN0YXRlQ2hhbmdlUmVzdWx0Lm5ldHdvcmtJZCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgKiBIU00gc3RhdGVzCisgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIGNsYXNzIEluaXRpYWxpemVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU0NBTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2NhbkNvbW1hbmQobWVzc2FnZS5hcmcxID09IFNDQU5fQUNUSVZFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLncoVEFHLCAiSWdub3JpbmcgIiArIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgVW5pbml0aWFsaXplZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZShmYWxzZSk7CisgICAgICAgICAgICAgICAgIHJlc2V0TG9vcERldGVjdGlvbigpOworICAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYW5kbGVUcmFuc2l0aW9uKG1lc3NhZ2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLncoVEFHLCAiSWdub3JpbmcgIiArIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgeworICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZSh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIEluYWN0aXZlU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZ2V0Q3VycmVudE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZShmYWxzZSk7CisgICAgICAgICAgICAgICAgIHJlc2V0TG9vcERldGVjdGlvbigpOworICAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KHN0YXRlQ2hhbmdlUmVzdWx0LCBmYWxzZSk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlVHJhbnNpdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKKyAgICAgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0SXNBdmFpbGFibGUodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIGNsYXNzIERpc2Nvbm5lY3RlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgICByZXNldExvb3BEZXRlY3Rpb24oKTsKKworICAgICAgICAgICAgICAgICAvKiBJZiBhIGRpc2Nvbm5lY3QgZXZlbnQgaGFwcGVucyBhZnRlciBhIHBhc3N3b3JkIGtleSBmYWlsdXJlCisgICAgICAgICAgICAgICAgICAqIGV2ZW50LCBkaXNhYmxlIHRoZSBuZXR3b3JrCisgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICBpZiAobVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZhaWxlZCB0byBhdXRoZW50aWNhdGUsIGRpc2FibGluZyBuZXR3b3JrICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uZ2V0TmV0d29ya0lkKCkpOworICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ1N0b3JlLmRpc2FibGVOZXR3b3JrKG1XaWZpSW5mby5nZXROZXR3b3JrSWQoKSk7CisgICAgICAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3Qoc3RhdGVDaGFuZ2VSZXN1bHQsIHRydWUpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3Qoc3RhdGVDaGFuZ2VSZXN1bHQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVRyYW5zaXRpb24obWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBTY2FuU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZ2V0Q3VycmVudE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICAgICAgIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgIHJlc2V0TG9vcERldGVjdGlvbigpOworICAgICAgICAgICAgICAgICBzZW5kU3VwcGxpY2FudFN0YXRlQ2hhbmdlZEJyb2FkY2FzdChzdGF0ZUNoYW5nZVJlc3VsdCwgZmFsc2UpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVRyYW5zaXRpb24obWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBDb25uZWN0U3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NDQU46CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFNjYW5SZXN1bHRIYW5kbGluZ0NvbW1hbmQoU0NBTl9PTkxZX01PREUpOworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zY2FuQ29tbWFuZChtZXNzYWdlLmFyZzEgPT0gU0NBTl9BQ1RJVkUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgSGFuZHNoYWtlU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZSBtZXNzYWdlID0gZ2V0Q3VycmVudE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICAgICAgIGlmIChtTG9vcERldGVjdEluZGV4ID4gbWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgICAgICBtTG9vcERldGVjdENvdW50Kys7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgaWYgKG1Mb29wRGV0ZWN0Q291bnQgPiBNQVhfU1VQUExJQ0FOVF9MT09QX0lURVJBVElPTlMpIHsKKyAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5kaXNhYmxlTmV0d29yayhzdGF0ZUNoYW5nZVJlc3VsdC5uZXR3b3JrSWQpOworICAgICAgICAgICAgICAgICAgICAgbUxvb3BEZXRlY3RDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICBtTG9vcERldGVjdEluZGV4ID0gbWVzc2FnZS53aGF0OworCisgICAgICAgICAgICAgICAgIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KHN0YXRlQ2hhbmdlUmVzdWx0LCBmYWxzZSk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlVHJhbnNpdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIENvbXBsZXRlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgICBtUnNzaVBvbGxUb2tlbisrOworICAgICAgICAgICAgICAgICBpZiAobUVuYWJsZVJzc2lQb2xsaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQob2J0YWluTWVzc2FnZShDTURfUlNTSV9QT0xMLCBtUnNzaVBvbGxUb2tlbiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPTExfUlNTSV9JTlRFUlZBTF9NU0VDUyk7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICByZXNldExvb3BEZXRlY3Rpb24oKTsKKworICAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICBzZW5kU3VwcGxpY2FudFN0YXRlQ2hhbmdlZEJyb2FkY2FzdChzdGF0ZUNoYW5nZVJlc3VsdCwgZmFsc2UpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFTU09DSUFUSU5HOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFTU09DSUFURUQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRk9VUl9XQVlfSEFORFNIQUtFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEdST1VQX0hBTkRTSEFLRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfUlNTSV9QT0xMOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBtUnNzaVBvbGxUb2tlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBJbmZvIGFuZCBjb250aW51ZSBwb2xsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvbGxlZEluZm8oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQob2J0YWluTWVzc2FnZShDTURfUlNTSV9QT0xMLCBtUnNzaVBvbGxUb2tlbiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0xMX1JTU0lfSU5URVJWQUxfTVNFQ1MpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQb2xsaW5nIGhhcyBjb21wbGV0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9FTkFCTEVfUlNTSV9QT0xMOgorICAgICAgICAgICAgICAgICAgICAgICAgbVJzc2lQb2xsVG9rZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlUnNzaVBvbGxpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBwb2xsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvbGxlZEluZm8oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQob2J0YWluTWVzc2FnZShDTURfUlNTSV9QT0xMLCBtUnNzaVBvbGxUb2tlbiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0xMX1JTU0lfSU5URVJWQUxfTVNFQ1MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlVHJhbnNpdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBEb3JtYW50U3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZ2V0Q3VycmVudE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CisKKyAgICAgICAgICAgICAgICByZXNldExvb3BEZXRlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3Qoc3RhdGVDaGFuZ2VSZXN1bHQsIGZhbHNlKTsKKworICAgICAgICAgICAgICAgIC8qIFRPRE86IHJlY29ubmVjdCBpcyBub3cgYmVpbmcgaGFuZGxlZCBhdCBESENQIGZhaWx1cmUgaGFuZGxpbmcKKyAgICAgICAgICAgICAgICAgKiBJZiB3ZSBydW4gaW50byBpc3N1ZXMgd2l0aCBzdGF5aW5nIGluIERvcm1hbnQgc3RhdGUsIG1pZ2h0CisgICAgICAgICAgICAgICAgICogbmVlZCBhIHJlY29ubmVjdCBoZXJlCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVUcmFuc2l0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlci5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IDU5ZjIzMTIuLjVhMjA3MzYgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZVRyYWNrZXIuamF2YQorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVUcmFja2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNiw0NTAgKzE2LDExMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmV0LndpZmk7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTEVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRElTQUJMSU5HOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRU5BQkxFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMSU5HOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfVU5LTk9XTjsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdGVUcmFja2VyOwotaW1wb3J0IGFuZHJvaWQubmV0LkRoY3BJbmZvOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtVdGlsczsKLWltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0OwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEEyZHA7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5JQmF0dGVyeVN0YXRzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZVRyYWNrZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIAotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIAogLyoqCi0gKiBUcmFjayB0aGUgc3RhdGUgb2YgV2lmaSBjb25uZWN0aXZpdHkuIEFsbCBldmVudCBoYW5kbGluZyBpcyBkb25lIGhlcmUsCi0gKiBhbmQgYWxsIGNoYW5nZXMgaW4gY29ubmVjdGl2aXR5IHN0YXRlIGFyZSBpbml0aWF0ZWQgaGVyZS4KKyAqIFRyYWNrIHRoZSBzdGF0ZSBvZiB3aWZpIGZvciBjb25uZWN0aXZpdHkgc2VydmljZS4KICAqCiAgKiBAaGlkZQogICovCi1wdWJsaWMgY2xhc3MgV2lmaVN0YXRlVHJhY2tlciBleHRlbmRzIE5ldHdvcmtTdGF0ZVRyYWNrZXIgeworcHVibGljIGNsYXNzIFdpZmlTdGF0ZVRyYWNrZXIgaW1wbGVtZW50cyBOZXR3b3JrU3RhdGVUcmFja2VyIHsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HRCA9IENvbmZpZy5MT0dEIHx8IGZhbHNlOwotICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVRXT1JLVFlQRSA9ICJXSUZJIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIldpZmlTdGF0ZVRyYWNrZXIiOwogCi0gICAgLy8gRXZlbnQgbG9nIHRhZ3MgKG11c3QgYmUgaW4gc3luYyB3aXRoIGV2ZW50LWxvZy10YWdzKQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVExPR19ORVRXT1JLX1NUQVRFX0NIQU5HRUQgPSA1MDAyMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEID0gNTAwMjI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX0RSSVZFUl9TVEFURV9DSEFOR0VEID0gNTAwMjM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX1NUQVRFX0NIQU5HRUQgPSA1MDAyNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfU1VQUExJQ0FOVF9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQgPSA1MDAyNTsKKyAgICBwcml2YXRlIEF0b21pY0Jvb2xlYW4gbVRlYXJkb3duUmVxdWVzdGVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgIHByaXZhdGUgQXRvbWljQm9vbGVhbiBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgIHByaXZhdGUgQXRvbWljSW50ZWdlciBtRGVmYXVsdEdhdGV3YXlBZGRyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgcHJpdmF0ZSBBdG9taWNCb29sZWFuIG1EZWZhdWx0Um91dGVTZXQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CiAKLSAgICAvLyBFdmVudCBjb2RlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TVVBQTElDQU5UX0NPTk5FQ1RJT04gICAgICAgICAgICAgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TVVBQTElDQU5UX0RJU0NPTk5FQ1QgICAgICAgICAgICAgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQgICAgICAgICAgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ORVRXT1JLX1NUQVRFX0NIQU5HRUQgICAgICAgICAgICAgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFICAgICAgICAgICAgPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVUNDRUVERUQgPSA2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9GQUlMRUQgICAgPSA3OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9QT0xMX0lOVEVSVkFMICAgICAgICAgICAgICAgICAgICAgPSA4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ESENQX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgPSA5OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ERUZFUlJFRF9ESVNDT05ORUNUICAgICAgICAgICAgICAgPSAxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREVGRVJSRURfUkVDT05ORUNUICAgICAgICAgICAgICAgID0gMTE7Ci0gICAgLyoqCi0gICAgICogVGhlIGRyaXZlciBpcyBzdGFydGVkIG9yIHN0b3BwZWQuIFRoZSBvYmplY3Qgd2lsbCBiZSB0aGUgc3RhdGU6IHRydWUgZm9yCi0gICAgICogc3RhcnRlZCwgZmFsc2UgZm9yIHN0b3BwZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RSSVZFUl9TVEFURV9DSEFOR0VEICAgICAgICAgICAgICA9IDEyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9QQVNTV09SRF9LRVlfTUFZX0JFX0lOQ09SUkVDVCAgICAgPSAxMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTUFZQkVfU1RBUlRfU0NBTl9QT1NUX0RJU0NPTk5FQ1QgID0gMTQ7CisgICAgcHJpdmF0ZSBMaW5rUHJvcGVydGllcyBtTGlua1Byb3BlcnRpZXM7CisgICAgcHJpdmF0ZSBOZXR3b3JrSW5mbyBtTmV0d29ya0luZm87CiAKLSAgICAvKioKLSAgICAgKiBUaGUgZHJpdmVyIHN0YXRlIGluZGljYXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSSVZFUl9TVEFSVEVEICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSSVZFUl9TVE9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSSVZFUl9IVU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI7CisgICAgLyogRm9yIHNlbmRpbmcgZXZlbnRzIHRvIGNvbm5lY3Rpdml0eSBzZXJ2aWNlIGhhbmRsZXIgKi8KKyAgICBwcml2YXRlIEhhbmRsZXIgbUNzSGFuZGxlcjsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtV2lmaVN0YXRlUmVjZWl2ZXI7CisgICAgcHJpdmF0ZSBXaWZpTWFuYWdlciBtV2lmaU1hbmFnZXI7CiAKLSAgICAvKioKLSAgICAgKiBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBwb2xsaW5nIGZvciBjb25uZWN0aW9uCi0gICAgICogc3RhdHVzIGl0ZW1zIHRoYXQgYXJlIG5vdCBzZW50IHZpYSBhc3luY2hyb25vdXMgZXZlbnRzLgotICAgICAqIEFuIGV4YW1wbGUgaXMgUlNTSSAoc2lnbmFsIHN0cmVuZ3RoKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9MTF9TVEFUVVNfSU5URVJWQUxfTVNFQ1MgPSAzMDAwOworICAgIHB1YmxpYyBXaWZpU3RhdGVUcmFja2VyKCkgeworICAgICAgICBtTmV0d29ya0luZm8gPSBuZXcgTmV0d29ya0luZm8oQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkksIDAsIE5FVFdPUktUWVBFLCAiIik7CisgICAgICAgIG1MaW5rUHJvcGVydGllcyA9IG5ldyBMaW5rUHJvcGVydGllcygpOwogCi0gICAgLyoqCi0gICAgICogVGhlIG1heCBudW1iZXIgb2YgdGhlIFdQQSBzdXBwbGljYW50IGxvb3AgaXRlcmF0aW9ucyBiZWZvcmUgd2UKLSAgICAgKiBkZWNpZGUgdGhhdCB0aGUgbG9vcCBzaG91bGQgYmUgdGVybWluYXRlZDoKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NVUFBMSUNBTlRfTE9PUF9JVEVSQVRJT05TID0gNDsKKyAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKGZhbHNlKTsKKyAgICAgICAgbUxpbmtQcm9wZXJ0aWVzLmNsZWFyKCk7CisgICAgICAgIHNldFRlYXJkb3duUmVxdWVzdGVkKGZhbHNlKTsKKyAgICB9CiAKLSAgICAvKioKLSAgICAgKiBXaGVuIGEgRElTQ09OTkVDVCBldmVudCBpcyByZWNlaXZlZCwgd2UgZGVmZXIgaGFuZGxpbmcgaXQgdG8KLSAgICAgKiBhbGxvdyBmb3IgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhlIERJU0NPTk5FQ1QgaXMgYWJvdXQgdG8KLSAgICAgKiBiZSBmb2xsb3dlZCBzaG9ydGx5IGJ5IGEgQ09OTkVDVCB0byB0aGUgc2FtZSBuZXR3b3JrIHdlIHdlcmUKLSAgICAgKiBqdXN0IGNvbm5lY3RlZCB0by4gSW4gc3VjaCBhIGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gcmVwb3J0Ci0gICAgICogdGhlIG5ldHdvcmsgYXMgZG93biwgbm9yIGRvIHdlIHdhbnQgdG8gcmVjb25maWd1cmUgdGhlIG5ldHdvcmsKLSAgICAgKiBpbnRlcmZhY2UsIGV0Yy4gSWYgd2UgZ2V0IGEgQ09OTkVDVCBldmVudCBmb3IgYW5vdGhlciBuZXR3b3JrCi0gICAgICogd2l0aGluIHRoZSBkZWxheSB3aW5kb3csIHdlIGltbWVkaWF0ZWx5IGhhbmRsZSB0aGUgcGVuZGluZwotICAgICAqIGRpc2Nvbm5lY3QgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIENPTk5FQ1QuPHAvPgotICAgICAqIFRoZSBmaXZlIHNlY29uZCBkZWxheSBpcyBjaG9zZW4gc29tZXdoYXQgYXJiaXRyYXJpbHksIGJ1dCBpcwotICAgICAqIG1lYW50IHRvIGNvdmVyIG1vc3Qgb2YgdGhlIGNhc2VzIHdoZXJlIGEgRElTQ09OTkVDVC9DT05ORUNUCi0gICAgICogaGFwcGVucyB0byBhIG5ldHdvcmsuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfREVMQVlfTVNFQ1MgPSA1MDAwOwotICAgIC8qKgotICAgICAqIFdoZW4gdGhlIHN1cHBsaWNhbnQgZ29lcyBpZGxlIGFmdGVyIHdlIGRvIGFuIGV4cGxpY2l0IGRpc2Nvbm5lY3QKLSAgICAgKiBmb2xsb3dpbmcgYSBESENQIGZhaWx1cmUsIHdlIG5lZWQgdG8ga2ljayB0aGUgc3VwcGxpY2FudCBpbnRvCi0gICAgICogdHJ5aW5nIHRvIGFzc29jaWF0ZSB3aXRoIGFjY2VzcyBwb2ludHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQ09OTkVDVF9ERUxBWV9NU0VDUyA9IDIwMDA7CiAKLSAgICAvKioKLSAgICAgKiBXaGVuIHRoZSBzdXBwbGljYW50IGRpc2Nvbm5lY3RzIGZyb20gYW4gQVAgaXQgc29tZXRpbWVzIGZvcmdldHMKLSAgICAgKiB0byByZXN0YXJ0IHNjYW5uaW5nLiAgV2FpdCB0aGlzIGRlbGF5IGJlZm9yZSBhc2tpbmcgaXQgdG8gc3RhcnQKLSAgICAgKiBzY2FubmluZyAoaW4gY2FzZSBpdCBmb3Jnb3QpLiAgMTUgc2VjIGlzIHRoZSBzdGFuZGFyZCBkZWxheSBiZXR3ZWVuCi0gICAgICogc2NhbnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtJQ0tTVEFSVF9TQ0FOTklOR19ERUxBWV9NU0VDUyA9IDE1MDAwOworICAgIHB1YmxpYyB2b2lkIHNldFRlYXJkb3duUmVxdWVzdGVkKGJvb2xlYW4gaXNSZXF1ZXN0ZWQpIHsKKyAgICAgICAgbVRlYXJkb3duUmVxdWVzdGVkLnNldChpc1JlcXVlc3RlZCk7CisgICAgfQogCi0gICAgLyoqCi0gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHdlIHdpbGwgcmV0cnkgYSBjb25uZWN0aW9uIHRvIGFuIGFjY2VzcyBwb2ludAotICAgICAqIGZvciB3aGljaCB3ZSBoYXZlIGZhaWxlZCBpbiBhY3F1aXJpbmcgYW4gSVAgYWRkcmVzcyBmcm9tIERIQ1AuIEEgdmFsdWUgb2YKLSAgICAgKiBOIG1lYW5zIHRoYXQgd2Ugd2lsbCBtYWtlIE4rMSBjb25uZWN0aW9uIGF0dGVtcHRzIGluIGFsbC4KLSAgICAgKiA8cD4KLSAgICAgKiBTZWUge0BsaW5rIFNldHRpbmdzLlNlY3VyZSNXSUZJX01BWF9ESENQX1JFVFJZX0NPVU5UfS4gVGhpcyBpcyB0aGUgZGVmYXVsdAotICAgICAqIHZhbHVlIGlmIGEgU2V0dGluZ3MgdmFsdWUgaXMgbm90IHByZXNlbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX0RIQ1BfUkVUUklFUyA9IDk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1BPV0VSX01PREVfQVVUTyA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3VycmVudCBXUEEgc3VwcGxpY2FudCBsb29wIHN0YXRlICh1c2VkIHRvIGRldGVjdCBsb29waW5nIGJlaGF2aW9yKToKLSAgICAgKi8KLSAgICBwcml2YXRlIFN1cHBsaWNhbnRTdGF0ZSBtU3VwcGxpY2FudExvb3BTdGF0ZSA9IFN1cHBsaWNhbnRTdGF0ZS5ESVNDT05ORUNURUQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3VycmVudCBudW1iZXIgb2YgV1BBIHN1cHBsaWNhbnQgbG9vcCBpdGVyYXRpb25zOgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1OdW1TdXBwbGljYW50TG9vcEl0ZXJhdGlvbnMgPSAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgbnVtYmVyIG9mIHN1cHBsaWNhbnQgc3RhdGUgY2hhbmdlcy4gIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUKLSAgICAgKiBpZiB3ZSd2ZSByZWNlaXZlZCBhbnkgbmV3IGluZm8gc2luY2Ugd2UgZm91bmQgb3V0IGl0IHdhcyBESVNDT05ORUNURUQgb3IKLSAgICAgKiBJTkFDVElWRS4gIElmIHdlIGhhdmVuJ3QgZm9yIFggbXMsIHdlIHRoZW4gcmVxdWVzdCBhIHNjYW4gLSBpdCBzaG91bGQgaGF2ZQotICAgICAqIGRvbmUgdGhhdCBhdXRvbWF0aWNhbGx5LCBidXQgc29tZXRpbWVzIHNvbWUgZmlybXdhcmUgZG9lcyBub3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbU51bVN1cHBsaWNhbnRTdGF0ZUNoYW5nZXMgPSAwOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB3ZSByZWNlaXZlZCBhbiBldmVudCB0aGF0IHRoYXQgYSBwYXNzd29yZC1rZXkgbWF5IGJlIGluY29ycmVjdC4KLSAgICAgKiBJZiB0aGUgbmV4dCBpbmNvbWluZyBzdXBwbGljYW50IHN0YXRlIGNoYW5nZSBldmVudCBpcyBESVNDT05ORUNULAotICAgICAqIGJyb2FkY2FzdCBhIG1lc3NhZ2UgdGhhdCB3ZSBoYXZlIGEgcG9zc2libGUgcGFzc3dvcmQgZXJyb3IgYW5kIGRpc2FibGUKLSAgICAgKiB0aGUgbmV0d29yay4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUFBMX1NDQU5fSEFORExJTkdfTk9STUFMID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVVBQTF9TQ0FOX0hBTkRMSU5HX0xJU1RfT05MWSA9IDI7Ci0KLSAgICBwcml2YXRlIFdpZmlNb25pdG9yIG1XaWZpTW9uaXRvcjsKLSAgICBwcml2YXRlIFdpZmlJbmZvIG1XaWZpSW5mbzsKLSAgICBwcml2YXRlIExpc3Q8U2NhblJlc3VsdD4gbVNjYW5SZXN1bHRzOwotICAgIHByaXZhdGUgV2lmaU1hbmFnZXIgbVdNOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSGF2ZUlwQWRkcmVzczsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU9idGFpbmluZ0lwQWRkcmVzczsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVRvcm5Eb3duQnlDb25uTWdyOwotICAgIC8qKgotICAgICAqIEEgRElTQ09OTkVDVCBldmVudCBoYXMgYmVlbiByZWNlaXZlZCwgYnV0IHByb2Nlc3NpbmcgaXQKLSAgICAgKiBpcyBiZWluZyBkZWZlcnJlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbURpc2Nvbm5lY3RQZW5kaW5nOwotICAgIC8qKgotICAgICAqIEFuIG9wZXJhdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQgYXMgYSByZXN1bHQgb2Ygd2hpY2ggd2UgZXhwZWN0IHRoZSBuZXh0IGV2ZW50Ci0gICAgICogd2lsbCBiZSBhIERJU0NPTk5FQ1QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1EaXNjb25uZWN0RXhwZWN0ZWQ7Ci0gICAgcHJpdmF0ZSBEaGNwSGFuZGxlciBtRGhjcFRhcmdldDsKLSAgICBwcml2YXRlIERoY3BJbmZvIG1EaGNwSW5mbzsKLSAgICBwcml2YXRlIGludCBtTGFzdFNpZ25hbExldmVsID0gLTE7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUxhc3RCc3NpZDsKLSAgICBwcml2YXRlIFN0cmluZyBtTGFzdFNzaWQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUxhc3ROZXR3b3JrSWQgPSAtMTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVVzZVN0YXRpY0lwID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBpbnQgbVJlY29ubmVjdENvdW50OwotCi0gICAgLyogVHJhY2tzIGlmIGFueSBuZXR3b3JrIGluIHRoZSBjb25maWd1cmF0aW9uIGlzIGRpc2FibGVkICovCi0gICAgcHJpdmF0ZSBBdG9taWNCb29sZWFuIG1Jc0FueU5ldHdvcmtEaXNhYmxlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKLQotICAgIC8vIHVzZWQgdG8gc3RvcmUgdGhlIChub24tcGVyc2lzdGVkKSBudW0gZGV0ZXJtaW5lZCBkdXJpbmcgZGV2aWNlIGJvb3QgCi0gICAgLy8gKGZyb20gbWNjIG9yIG90aGVyIHBob25lIGluZm8pIGJlZm9yZSB0aGUgZHJpdmVyIGlzIHN0YXJ0ZWQuCi0gICAgcHJpdmF0ZSBpbnQgbU51bUFsbG93ZWRDaGFubmVscyA9IDA7Ci0KLSAgICAvLyBWYXJpYWJsZXMgcmVsYXRpbmcgdG8gdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbgotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBpY29uIHRvIHNob3cgaW4gdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbi4gVGhpcyB3aWxsIGFsc28KLSAgICAgKiBiZSB0aGUgSUQgb2YgdGhlIE5vdGlmaWNhdGlvbiBnaXZlbiB0byB0aGUgTm90aWZpY2F0aW9uTWFuYWdlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUgPQotICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X25vdGlmeV93aWZpX2luX3JhbmdlOwotICAgIC8qKgotICAgICAqIFdoZW4gYSBub3RpZmljYXRpb24gaXMgc2hvd24sIHdlIHdhaXQgdGhpcyBhbW91bnQgYmVmb3JlIHBvc3NpYmx5IHNob3dpbmcgaXQgYWdhaW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBsb25nIE5PVElGSUNBVElPTl9SRVBFQVRfREVMQVlfTVM7Ci0gICAgLyoqCi0gICAgICogV2hldGhlciB0aGUgdXNlciBoYXMgc2V0IHRoZSBzZXR0aW5nIHRvIHNob3cgdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0gICAgLyoqCi0gICAgICogT2JzZXJ2ZXMgdGhlIHVzZXIgc2V0dGluZyB0byBrZWVwIHtAbGluayAjbU5vdGlmaWNhdGlvbkVuYWJsZWR9IGluIHN5bmMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyOwotICAgIC8qKgotICAgICAqIFRoZSB7QGxpbmsgU3lzdGVtI2N1cnJlbnRUaW1lTWlsbGlzKCl9IG11c3QgYmUgYXQgbGVhc3QgdGhpcyB2YWx1ZSBmb3IgdXMKLSAgICAgKiB0byBzaG93IHRoZSBub3RpZmljYXRpb24gYWdhaW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBsb25nIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lOwotICAgIC8qKgotICAgICAqIFRoZSBOb3RpZmljYXRpb24gb2JqZWN0IGdpdmVuIHRvIHRoZSBOb3RpZmljYXRpb25NYW5hZ2VyLgotICAgICAqLwotICAgIHByaXZhdGUgTm90aWZpY2F0aW9uIG1Ob3RpZmljYXRpb247Ci0gICAgLyoqCi0gICAgICogV2hldGhlciB0aGUgbm90aWZpY2F0aW9uIGlzIGJlaW5nIHNob3duLCBhcyBzZXQgYnkgdXMuIFRoYXQgaXMsIGlmIHRoZQotICAgICAqIHVzZXIgY2FuY2VscyB0aGUgbm90aWZpY2F0aW9uLCB3ZSB3aWxsIG5vdCByZWNlaXZlIHRoZSBjYWxsYmFjayBzbyB0aGlzCi0gICAgICogd2lsbCBzdGlsbCBiZSB0cnVlLiBXZSBvbmx5IGd1YXJhbnRlZSBpZiB0aGlzIGlzIGZhbHNlLCB0aGVuIHRoZQotICAgICAqIG5vdGlmaWNhdGlvbiBpcyBub3Qgc2hvd2luZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWNhdGlvblNob3duOwotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2YgY29udGludW91cyBzY2FucyB0aGF0IG11c3Qgb2NjdXIgYmVmb3JlIGNvbnNpZGVyIHRoZQotICAgICAqIHN1cHBsaWNhbnQgaW4gYSBzY2FubmluZyBzdGF0ZS4gVGhpcyBhbGxvd3Mgc3VwcGxpY2FudCB0byBhc3NvY2lhdGUgd2l0aAotICAgICAqIHJlbWVtYmVyZWQgbmV0d29ya3MgdGhhdCBhcmUgaW4gdGhlIHNjYW4gcmVzdWx0cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1NDQU5TX0JFRk9SRV9BQ1RVQUxMWV9TQ0FOTklORyA9IDM7Ci0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzY2FucyBzaW5jZSB0aGUgbGFzdCBuZXR3b3JrIHN0YXRlIGNoYW5nZS4gV2hlbiB0aGlzCi0gICAgICogZXhjZWVkcyB7QGxpbmsgI05VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkd9LCB3ZSBjb25zaWRlciB0aGUKLSAgICAgKiBzdXBwbGljYW50IHRvIGFjdHVhbGx5IGJlIHNjYW5uaW5nLiBXaGVuIHRoZSBuZXR3b3JrIHN0YXRlIGNoYW5nZXMgdG8KLSAgICAgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiBzY2FubmluZywgd2UgcmVzZXQgdGhpcyB0byAwLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlOwotICAgIC8qKgotICAgICAqIE9ic2VydmVzIHRoZSBzdGF0aWMgSVAgYWRkcmVzcyBzZXR0aW5ncy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNldHRpbmdzT2JzZXJ2ZXIgbVNldHRpbmdzT2JzZXJ2ZXI7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1NjYW5Nb2RlQWN0aXZlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlUnNzaVBvbGxpbmc7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0hpZ2hQZXJmRW5hYmxlZDsKLSAgICBwcml2YXRlIGludCBtUG93ZXJNb2RlUmVmQ291bnQgPSAwOwotICAgIHByaXZhdGUgaW50IG1PcHRpbWl6YXRpb25zRGlzYWJsZWRSZWZDb3VudCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBPbmUgb2YgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX1NUQVRFX0RJU0FCTEVEfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX1NUQVRFX0RJU0FCTElOR30sCi0gICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9FTkFCTEVEfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX1NUQVRFX0VOQUJMSU5HfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX1NUQVRFX1VOS05PV059Ci0gICAgICoKLSAgICAgKiBnZXRXaWZpU3RhdGUoKSBpcyBub3Qgc3luY2hyb25pemVkIHRvIG1ha2Ugc3VyZSBpdCdzIGFsd2F5cyBmYXN0LAotICAgICAqIGV2ZW4gd2hlbiB0aGUgaW5zdGFuY2UgbG9jayBpcyBoZWxkIG9uIG90aGVyIHNsb3cgb3BlcmF0aW9ucy4KLSAgICAgKiBVc2UgYSBhdG9taWMgdmFyaWFibGUgZm9yIHN0YXRlLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBtV2lmaVN0YXRlID0gbmV3IEF0b21pY0ludGVnZXIoV0lGSV9TVEFURV9VTktOT1dOKTsKLQotICAgIC8vIFdpLUZpIHJ1biBzdGF0ZXM6Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9TVEFURV9TVEFSVElORyA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9TVEFURV9SVU5OSU5HICA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9TVEFURV9TVE9QUElORyA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9TVEFURV9TVE9QUEVEICA9IDQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbVJ1blN0YXRlTmFtZXNbXSA9IHsKLSAgICAgICAgICAgICJTdGFydGluZyIsCi0gICAgICAgICAgICAiUnVubmluZyIsCi0gICAgICAgICAgICAiU3RvcHBpbmciLAotICAgICAgICAgICAgIlN0b3BwZWQiCi0gICAgfTsKLSAgICBwcml2YXRlIGludCBtUnVuU3RhdGU7Ci0KLSAgICBwcml2YXRlIGZpbmFsIElCYXR0ZXJ5U3RhdHMgbUJhdHRlcnlTdGF0czsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNTY2FuT25seTsKLQotICAgIHByaXZhdGUgQmx1ZXRvb3RoQTJkcCBtQmx1ZXRvb3RoQTJkcDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1JbnRlcmZhY2VOYW1lOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBMUyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHNEbnNQcm9wTmFtZXM7Ci0gICAgcHJpdmF0ZSBSdW5uYWJsZSBtUmVsZWFzZVdha2VMb2NrQ2FsbGJhY2s7Ci0KLSAgICAvKioKLSAgICAgKiBBIHN0cnVjdHVyZSBmb3Igc3VwcGx5aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgc3VwcGxpY2FudCBzdGF0ZQotICAgICAqIGNoYW5nZSBpbiB0aGUgU1RBVEVfQ0hBTkdFIGV2ZW50IG1lc3NhZ2UgdGhhdCBjb21lcyBmcm9tIHRoZQotICAgICAqIFdpZmlNb25pdG9yCi0gICAgICogdGhyZWFkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN1cHBsaWNhbnRTdGF0ZUNoYW5nZVJlc3VsdCB7Ci0gICAgICAgIFN1cHBsaWNhbnRTdGF0ZUNoYW5nZVJlc3VsdChpbnQgbmV0d29ya0lkLCBTdHJpbmcgQlNTSUQsIFN1cHBsaWNhbnRTdGF0ZSBzdGF0ZSkgewotICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwotICAgICAgICAgICAgdGhpcy5CU1NJRCA9IEJTU0lEOwotICAgICAgICAgICAgdGhpcy5uZXR3b3JrSWQgPSBuZXR3b3JrSWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG5ldHdvcmtJZDsKLSAgICAgICAgU3RyaW5nIEJTU0lEOwotICAgICAgICBTdXBwbGljYW50U3RhdGUgc3RhdGU7CisgICAgcHVibGljIGJvb2xlYW4gaXNUZWFyZG93blJlcXVlc3RlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1UZWFyZG93blJlcXVlc3RlZC5nZXQoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBIHN0cnVjdHVyZSBmb3Igc3VwcGx5aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgY29ubmVjdGlvbiBpbgotICAgICAqIHRoZSBDT05ORUNURUQgZXZlbnQgbWVzc2FnZSB0aGF0IGNvbWVzIGZyb20gdGhlIFdpZmlNb25pdG9yCi0gICAgICogdGhyZWFkLgorICAgICAqIEJlZ2luIG1vbml0b3Jpbmcgd2lmaSBjb25uZWN0aXZpdHkKICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOZXR3b3JrU3RhdGVDaGFuZ2VSZXN1bHQgewotICAgICAgICBOZXR3b3JrU3RhdGVDaGFuZ2VSZXN1bHQoRGV0YWlsZWRTdGF0ZSBzdGF0ZSwgU3RyaW5nIEJTU0lELCBpbnQgbmV0d29ya0lkKSB7Ci0gICAgICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICB0aGlzLkJTU0lEID0gQlNTSUQ7Ci0gICAgICAgICAgICB0aGlzLm5ldHdvcmtJZCA9IG5ldHdvcmtJZDsKLSAgICAgICAgfQotICAgICAgICBEZXRhaWxlZFN0YXRlIHN0YXRlOwotICAgICAgICBTdHJpbmcgQlNTSUQ7Ci0gICAgICAgIGludCBuZXR3b3JrSWQ7Ci0gICAgfQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZyhDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgdGFyZ2V0KSB7CisgICAgICAgIG1Dc0hhbmRsZXIgPSB0YXJnZXQ7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKIAotICAgIHB1YmxpYyBXaWZpU3RhdGVUcmFja2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciB0YXJnZXQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgdGFyZ2V0LCBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSwgMCwgIldJRkkiLCAiIik7Ci0gICAgICAgIAotICAgICAgICBtV2lmaUluZm8gPSBuZXcgV2lmaUluZm8oKTsKLSAgICAgICAgbVdpZmlNb25pdG9yID0gbmV3IFdpZmlNb25pdG9yKHRoaXMpOwotICAgICAgICBtSGF2ZUlwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICBtT2J0YWluaW5nSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgIHNldFRvcm5Eb3duQnlDb25uTWdyKGZhbHNlKTsKLSAgICAgICAgbURpc2Nvbm5lY3RQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgIG1TY2FuUmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8U2NhblJlc3VsdD4oKTsKLSAgICAgICAgLy8gQWxsb2NhdGUgREhDUCBpbmZvIG9iamVjdCBvbmNlLCBhbmQgZmlsbCBpdCBpbiBvbiBlYWNoIHJlcXVlc3QKLSAgICAgICAgbURoY3BJbmZvID0gbmV3IERoY3BJbmZvKCk7Ci0gICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9TVEFSVElORzsKKyAgICAgICAgbVdpZmlNYW5hZ2VyID0gKFdpZmlNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFKTsKKyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5DT05GSUdfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFdpZmlNYW5hZ2VyLlNDQU5fUkVTVUxUU19BVkFJTEFCTEVfQUNUSU9OKTsKIAotICAgICAgICAvLyBTZXR0aW5nIGlzIGluIHNlY29uZHMKLSAgICAgICAgTk9USUZJQ0FUSU9OX1JFUEVBVF9ERUxBWV9NUyA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTkVUV09SS1NfQVZBSUxBQkxFX1JFUEVBVF9ERUxBWSwgOTAwKSAqIDEwMDBsOwotICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlciA9IG5ldyBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyKG5ldyBIYW5kbGVyKCkpOwotICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlci5yZWdpc3RlcigpOwotCi0gICAgICAgIG1TZXR0aW5nc09ic2VydmVyID0gbmV3IFNldHRpbmdzT2JzZXJ2ZXIobmV3IEhhbmRsZXIoKSk7Ci0KLSAgICAgICAgbUludGVyZmFjZU5hbWUgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgid2lmaS5pbnRlcmZhY2UiLCAidGl3bGFuMCIpOwotICAgICAgICBzRG5zUHJvcE5hbWVzID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICJkaGNwLiIgKyBtSW50ZXJmYWNlTmFtZSArICIuZG5zMSIsCi0gICAgICAgICAgICAiZGhjcC4iICsgbUludGVyZmFjZU5hbWUgKyAiLmRuczIiCi0gICAgICAgIH07Ci0gICAgICAgIG1CYXR0ZXJ5U3RhdHMgPSBJQmF0dGVyeVN0YXRzLlN0dWIuYXNJbnRlcmZhY2UoU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiYmF0dGVyeWluZm8iKSk7Ci0KKyAgICAgICAgbVdpZmlTdGF0ZVJlY2VpdmVyID0gbmV3IFdpZmlTdGF0ZVJlY2VpdmVyKCk7CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVdpZmlTdGF0ZVJlY2VpdmVyLCBmaWx0ZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2Q6IHNldHMgdGhlIHN1cHBsaWNhbnQgc3RhdGUgYW5kIGtlZXBzIHRoZSBuZXR3b3JrCi0gICAgICogaW5mbyB1cGRhdGVkLgotICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IHN0YXRlCisgICAgICogRGlzYWJsZSBjb25uZWN0aXZpdHkgdG8gYSBuZXR3b3JrCisgICAgICogVE9ETzogZG8gYXdheSB3aXRoIHJldHVybiB2YWx1ZSBhZnRlciBtYWtpbmcgTW9iaWxlRGF0YVN0YXRlVHJhY2tlciBhc3luYwogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRTdXBwbGljYW50U3RhdGUoU3VwcGxpY2FudFN0YXRlIHN0YXRlKSB7Ci0gICAgICAgIG1XaWZpSW5mby5zZXRTdXBwbGljYW50U3RhdGUoc3RhdGUpOwotICAgICAgICB1cGRhdGVOZXR3b3JrSW5mbygpOwotICAgICAgICBjaGVja1BvbGxUaW1lcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdXBwbGljYW50U3RhdGUgZ2V0U3VwcGxpY2FudFN0YXRlKCkgewotICAgICAgICByZXR1cm4gbVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpOworICAgIHB1YmxpYyBib29sZWFuIHRlYXJkb3duKCkgeworICAgICAgICBtVGVhcmRvd25SZXF1ZXN0ZWQuc2V0KHRydWUpOworICAgICAgICBtV2lmaU1hbmFnZXIuc3RvcFdpZmkoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZDogc2V0cyB0aGUgc3VwcGxpY2FudCBzdGF0ZSBhbmQga2VlcHMgdGhlIG5ldHdvcmsKLSAgICAgKiBpbmZvIHVwZGF0ZWQgKHN0cmluZyB2ZXJzaW9uKS4KLSAgICAgKiBAcGFyYW0gc3RhdGVOYW1lIHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgbmV3IHN0YXRlCisgICAgICogUmUtZW5hYmxlIGNvbm5lY3Rpdml0eSB0byBhIG5ldHdvcmsgYWZ0ZXIgYSB7QGxpbmsgI3RlYXJkb3duKCl9LgorICAgICAqIFRPRE86IGRvIGF3YXkgd2l0aCByZXR1cm4gdmFsdWUgYWZ0ZXIgbWFraW5nIE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIgYXN5bmMKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0U3VwcGxpY2FudFN0YXRlKFN0cmluZyBzdGF0ZU5hbWUpIHsKLSAgICAgICAgbVdpZmlJbmZvLnNldFN1cHBsaWNhbnRTdGF0ZShzdGF0ZU5hbWUpOwotICAgICAgICB1cGRhdGVOZXR3b3JrSW5mbygpOwotICAgICAgICBjaGVja1BvbGxUaW1lcigpOworICAgIHB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpIHsKKyAgICAgICAgbVRlYXJkb3duUmVxdWVzdGVkLnNldChmYWxzZSk7CisgICAgICAgIG1XaWZpTWFuYWdlci5zdGFydFdpZmkoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZDogc2V0cyB0aGUgYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgdGhlIGNvbm5lY3Rpb24KLSAgICAgKiBtYW5hZ2VyIGFza2VkIHRoZSBuZXR3b3JrIHRvIGJlIHRvcm4gZG93biAoYW5kIHNvIG9ubHkgdGhlIGNvbm5lY3Rpb24KLSAgICAgKiBtYW5hZ2VyIGNhbiBzZXQgaXQgdXAgYWdhaW4pLgotICAgICAqIG5ldHdvcmsgaW5mbyB1cGRhdGVkLgotICAgICAqIEBwYXJhbSBmbGFnIHtAY29kZSB0cnVlfSBpZiBleHBsaWNpdGx5IGRpc2FibGVkLgorICAgICAqIFR1cm4gdGhlIHdpcmVsZXNzIHJhZGlvIG9mZiBmb3IgYSBuZXR3b3JrLgorICAgICAqIEBwYXJhbSB0dXJuT24ge0Bjb2RlIHRydWV9IHRvIHR1cm4gdGhlIHJhZGlvIG9uLCB7QGNvZGUgZmFsc2V9CisgICAgICogVE9ETzogZG8gYXdheSB3aXRoIHJldHVybiB2YWx1ZSBhZnRlciBtYWtpbmcgTW9iaWxlRGF0YVN0YXRlVHJhY2tlciBhc3luYwogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRUb3JuRG93bkJ5Q29ubk1ncihib29sZWFuIGZsYWcpIHsKLSAgICAgICAgbVRvcm5Eb3duQnlDb25uTWdyID0gZmxhZzsKLSAgICAgICAgdXBkYXRlTmV0d29ya0luZm8oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUgRE5TIHNlcnZlcnMgYXZhaWxhYmxlIGZvciB0aGUgV0xBTgotICAgICAqIG5ldHdvcmsgaW50ZXJmYWNlLgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIEROUyBhZGRyZXNzZXMsIHdpdGggbm8gaG9sZXMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE5hbWVTZXJ2ZXJzKCkgewotICAgICAgICByZXR1cm4gZ2V0TmFtZVNlcnZlckxpc3Qoc0Ruc1Byb3BOYW1lcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIG91ciBXTEFOIG5ldHdvcmsgaW50ZXJmYWNlLgotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2Ygb3VyIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtSW50ZXJmYWNlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0Y3AgYnVmZmVyIHNpemVzCi0gICAgICogZm9yIHRoaXMgbmV0d29yay4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRjcEJ1ZmZlclNpemVzUHJvcE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAibmV0LnRjcC5idWZmZXJzaXplLndpZmkiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZygpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IGEgaGFuZGxlIG9uIHRoZSBXaWZpTWFuYWdlci4gVGhpcyBjYW5ub3QgYmUgZG9uZSBpbiBvdXIKLSAgICAgICAgICogY29uc3RydWN0b3IsIGJlY2F1c2UgdGhlIFdpZmkgc2VydmljZSBpcyBub3QgeWV0IHJlZ2lzdGVyZWQuCi0gICAgICAgICAqLwotICAgICAgICBtV00gPSAoV2lmaU1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJRklfU0VSVklDRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFdmVudExvb3AoKSB7Ci0gICAgICAgIG1XaWZpTW9uaXRvci5zdGFydE1vbml0b3JpbmcoKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRSYWRpbyhib29sZWFuIHR1cm5PbikgeworICAgICAgICBtV2lmaU1hbmFnZXIuc2V0V2lmaUVuYWJsZWQodHVybk9uKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NzEsMjE3MiArMTMxLDExOCBAQAogICAgICAqIHVuYXZhaWxhYmxlLgogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIFdpLUZpIGNvbm5lY3Rpb25zIGFyZSBwb3NzaWJsZQogICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogVE9ETzogTmVlZCB0byBhbHNvIGxvb2sgYXQgc2NhbiByZXN1bHRzIHRvIHNlZSB3aGV0aGVyIHdlJ3JlCi0gICAgICAgICAqIGluIHJhbmdlIG9mIGFueSBhY2Nlc3MgcG9pbnRzLiBJZiB3ZSBoYXZlIHNjYW4gcmVzdWx0cyB0aGF0Ci0gICAgICAgICAqIGFyZSBubyBtb3JlIHRoYW4gTiBzZWNvbmRzIG9sZCwgdXNlIHRob3NlLCBvdGhlcndpc2UsIGluaXRpYXRlCi0gICAgICAgICAqIGEgc2NhbiBhbmQgd2FpdCBmb3IgdGhlIHJlc3VsdHMuIFRoaXMgb25seSBtYXR0ZXJzIGlmIHdlCi0gICAgICAgICAqIGFsbG93IG1vYmlsZSB0byBiZSB0aGUgcHJlZmVycmVkIG5ldHdvcmsuCi0gICAgICAgICAqLwotICAgICAgICBTdXBwbGljYW50U3RhdGUgc3VwcFN0YXRlID0gbVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpOwotICAgICAgICByZXR1cm4gc3VwcFN0YXRlICE9IFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEICYmCi0gICAgICAgICAgICAgICAgc3VwcFN0YXRlICE9IFN1cHBsaWNhbnRTdGF0ZS5JTkFDVElWRSAmJgotICAgICAgICAgICAgICAgIChtVG9ybkRvd25CeUNvbm5NZ3IgfHwgIWlzRHJpdmVyU3RvcHBlZCgpKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1OZXR3b3JrSW5mby5pc0F2YWlsYWJsZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiBUaGVyZSBhcmUgY3VycmVudGx5IG5vIGRlZmluZWQgV2ktRmkgc3VidHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROZXR3b3JrU3VidHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZDogdXBkYXRlcyB0aGUgbmV0d29yayBpbmZvIG9iamVjdCB0byBrZWVwIGl0IGluIHN5bmMgd2l0aAotICAgICAqIHRoZSBXaS1GaSBzdGF0ZSB0cmFja2VyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVOZXR3b3JrSW5mbygpIHsKLSAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKGlzQXZhaWxhYmxlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcG9ydCB3aGV0aGVyIHRoZSBXaS1GaSBjb25uZWN0aW9uIGlzIGZ1bGx5IGNvbmZpZ3VyZWQgZm9yIGRhdGEuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAbGluayBTdXBwbGljYW50U3RhdGV9IGlzCi0gICAgICoge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlI0NPTVBMRVRFRCBDT01QTEVURUR9LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGlvbkNvbXBsZXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSA9PSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcG9ydCB3aGV0aGVyIHRoZSBXaS1GaSBjb25uZWN0aW9uIGhhcyBzdWNjZXNzZnVsbHkgYWNxdWlyZWQgYW4gSVAgYWRkcmVzcy4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgV2ktRmkgY29ubmVjdGlvbiBoYXMgYmVlbiBhc3NpZ25lZCBhbiBJUCBhZGRyZXNzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0lwQWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIG1IYXZlSXBBZGRyZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCBhIHVzZXItZW50ZXJlZCBwYXNzd29yZCBrZXkKLSAgICAgKiBtYXkgYmUgaW5jb3JyZWN0IChpLmUuLCBjYXVzZWQgYXV0aGVudGljYXRpb24gdG8gZmFpbCkuCi0gICAgICovCi0gICAgdm9pZCBub3RpZnlQYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KCkgewotICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKEVWRU5UX1BBU1NXT1JEX0tFWV9NQVlfQkVfSU5DT1JSRUNUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSBjb25uZWN0aW9uIHRvIHRoZSBzdXBwbGljYW50Ci0gICAgICogZGFlbW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLgotICAgICAqLwotICAgIHZvaWQgbm90aWZ5U3VwcGxpY2FudENvbm5lY3Rpb24oKSB7Ci0gICAgICAgIHNlbmRFbXB0eU1lc3NhZ2UoRVZFTlRfU1VQUExJQ0FOVF9DT05ORUNUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHN0YXRlIG9mIHRoZSBzdXBwbGljYW50Ci0gICAgICogaGFzIGNoYW5nZWQuCi0gICAgICogQHBhcmFtIG5ldHdvcmtJZCB0aGUgY29uZmlndXJlZCBuZXR3b3JrIG9uIHdoaWNoIHRoZSBzdGF0ZSBjaGFuZ2Ugb2NjdXJyZWQKLSAgICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyB7QGNvZGUgU3VwcGxpY2FudFN0YXRlfQotICAgICAqLwotICAgIHZvaWQgbm90aWZ5U3RhdGVDaGFuZ2UoaW50IG5ldHdvcmtJZCwgU3RyaW5nIEJTU0lELCBTdXBwbGljYW50U3RhdGUgbmV3U3RhdGUpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBNZXNzYWdlLm9idGFpbigKLSAgICAgICAgICAgIHRoaXMsIEVWRU5UX1NVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRCwKLSAgICAgICAgICAgIG5ldyBTdXBwbGljYW50U3RhdGVDaGFuZ2VSZXN1bHQobmV0d29ya0lkLCBCU1NJRCwgbmV3U3RhdGUpKTsKLSAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgc3RhdGUgb2YgV2lmaSBjb25uZWN0aXZpdHkKLSAgICAgKiBoYXMgY2hhbmdlZC4KLSAgICAgKiBAcGFyYW0gbmV0d29ya0lkIHRoZSBjb25maWd1cmVkIG5ldHdvcmsgb24gd2hpY2ggdGhlIHN0YXRlIGNoYW5nZSBvY2N1cnJlZAotICAgICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IG5ldHdvcmsgc3RhdGUKLSAgICAgKiBAcGFyYW0gQlNTSUQgd2hlbiB0aGUgbmV3IHN0YXRlIGlzIHtAbGluayBEZXRhaWxlZFN0YXRlI0NPTk5FQ1RFRAotICAgICAqIE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUuQ09OTkVDVEVEfSwKLSAgICAgKiB0aGlzIGlzIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgYWNjZXNzIHBvaW50LiBPdGhlcndpc2UsIGl0Ci0gICAgICogaXMge0Bjb2RlIG51bGx9LgotICAgICAqLwotICAgIHZvaWQgbm90aWZ5U3RhdGVDaGFuZ2UoRGV0YWlsZWRTdGF0ZSBuZXdTdGF0ZSwgU3RyaW5nIEJTU0lELCBpbnQgbmV0d29ya0lkKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oCi0gICAgICAgICAgICB0aGlzLCBFVkVOVF9ORVRXT1JLX1NUQVRFX0NIQU5HRUQsCi0gICAgICAgICAgICBuZXcgTmV0d29ya1N0YXRlQ2hhbmdlUmVzdWx0KG5ld1N0YXRlLCBCU1NJRCwgbmV0d29ya0lkKSk7Ci0gICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSBzY2FuIGhhcyBjb21wbGV0ZWQsIGFuZCByZXN1bHRzCi0gICAgICogYXJlIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeVNjYW5SZXN1bHRzQXZhaWxhYmxlKCkgewotICAgICAgICAvLyByZXNldCB0aGUgc3VwcGxpY2FudCdzIGhhbmRsaW5nIG9mIHNjYW4gcmVzdWx0cyB0byAibm9ybWFsIiBtb2RlCi0gICAgICAgIHNldFNjYW5SZXN1bHRIYW5kbGluZyhTVVBQTF9TQ0FOX0hBTkRMSU5HX05PUk1BTCk7Ci0gICAgICAgIHNlbmRFbXB0eU1lc3NhZ2UoRVZFTlRfU0NBTl9SRVNVTFRTX0FWQUlMQUJMRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHdlIGNhbiBubyBsb25nZXIgY29tbXVuaWNhdGUgd2l0aAotICAgICAqIHRoZSBzdXBwbGljYW50IGRhZW1vbi4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeVN1cHBsaWNhbnRMb3N0KCkgewotICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKEVWRU5UX1NVUFBMSUNBTlRfRElTQ09OTkVDVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBXaS1GaSBkcml2ZXIgaGFzIGJlZW4gc3RvcHBlZC4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeURyaXZlclN0b3BwZWQoKSB7Ci0gICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9TVE9QUEVEOwotCi0gICAgICAgIC8vIFNlbmQgYSBkcml2ZXIgc3RvcHBlZCBtZXNzYWdlIHRvIG91ciBoYW5kbGVyCi0gICAgICAgIE1lc3NhZ2Uub2J0YWluKHRoaXMsIEVWRU5UX0RSSVZFUl9TVEFURV9DSEFOR0VELCBEUklWRVJfU1RPUFBFRCwgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBXaS1GaSBkcml2ZXIgaGFzIGJlZW4gcmVzdGFydGVkIGFmdGVyCi0gICAgICogaGF2aW5nIGJlZW4gc3RvcHBlZC4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeURyaXZlclN0YXJ0ZWQoKSB7Ci0gICAgICAgIC8vIFNlbmQgYSBkcml2ZXIgc3RhcnRlZCBtZXNzYWdlIHRvIG91ciBoYW5kbGVyCi0gICAgICAgIE1lc3NhZ2Uub2J0YWluKHRoaXMsIEVWRU5UX0RSSVZFUl9TVEFURV9DSEFOR0VELCBEUklWRVJfU1RBUlRFRCwgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBXaS1GaSBkcml2ZXIgaGFzIGh1bmcgYW5kIG5lZWRzIHJlc3RhcnRpbmcuCi0gICAgICovCi0gICAgdm9pZCBub3RpZnlEcml2ZXJIdW5nKCkgewotICAgICAgICAvLyBTZW5kIGEgZHJpdmVyIGhhbmdlZCBtZXNzYWdlIHRvIG91ciBoYW5kbGVyCi0gICAgICAgIE1lc3NhZ2Uub2J0YWluKHRoaXMsIEVWRU5UX0RSSVZFUl9TVEFURV9DSEFOR0VELCBEUklWRVJfSFVORywgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpbnRlcnZhbCB0aW1lciBmb3IgcG9sbGluZyBjb25uZWN0aW9uIGluZm9ybWF0aW9uCi0gICAgICogdGhhdCBpcyBub3QgZGVsaXZlcmVkIGFzeW5jaHJvbm91c2x5LgotICAgICAqLwotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2hlY2tQb2xsVGltZXIoKSB7Ci0gICAgICAgIGlmIChtRW5hYmxlUnNzaVBvbGxpbmcgJiYKLSAgICAgICAgICAgICAgICBtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLkNPTVBMRVRFRCAmJgotICAgICAgICAgICAgICAgICFoYXNNZXNzYWdlcyhFVkVOVF9QT0xMX0lOVEVSVkFMKSkgewotICAgICAgICAgICAgc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoRVZFTlRfUE9MTF9JTlRFUlZBTCwgUE9MTF9TVEFUVVNfSU5URVJWQUxfTVNFQ1MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVE9ETzogbVJ1blN0YXRlIGlzIG5vdCBzeW5jaHJvbml6ZWQgaW4gc29tZSBwbGFjZXMKLSAgICAgKiBhZGRyZXNzIHRoaXMgYXMgcGFydCBvZiByZS1hcmNoaXRlY3QuCi0gICAgICoKLSAgICAgKiBUT0RPOiBXZSBhcmUgZXhwb3NpbmcgYW4gYWRkaXRpb25hbCBwdWJsaWMgc3luY2hyb25pemVkIGNhbGwKLSAgICAgKiBmb3IgYSB3YWtlbG9jayBvcHRpbWl6YXRpb24gaW4gV2lmaVNlcnZpY2UuIFJlbW92ZSBpdAotICAgICAqIHdoZW4gd2UgaGFuZGxlIHRoZSB3YWtlbG9jayBpbiBDb25uZWN0aXZpdHlTZXJ2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0RyaXZlclN0b3BwZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1NUT1BQRUQgfHwgbVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUElORzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90ZVJ1blN0YXRlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfUlVOTklORykgewotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlSdW5uaW5nKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlTdG9wcGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBpZ25vcmUpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcnVuIHN0YXRlIHRvIGVpdGhlciAibm9ybWFsIiBvciAic2Nhbi1vbmx5Ii4KLSAgICAgKiBAcGFyYW0gc2Nhbk9ubHlNb2RlIHRydWUgaWYgdGhlIG5ldyBtb2RlIHNob3VsZCBiZSBzY2FuLW9ubHkuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFNjYW5Pbmx5TW9kZShib29sZWFuIHNjYW5Pbmx5TW9kZSkgewotICAgICAgICAvLyBkbyBub3RoaW5nIHVubGVzcyBzY2FuLW9ubHkgbW9kZSBpcyBjaGFuZ2luZwotICAgICAgICBpZiAobUlzU2Nhbk9ubHkgIT0gc2Nhbk9ubHlNb2RlKSB7Ci0gICAgICAgICAgICBpbnQgc2NhblR5cGUgPSAoc2Nhbk9ubHlNb2RlID8KLSAgICAgICAgICAgICAgICAgICAgU1VQUExfU0NBTl9IQU5ETElOR19MSVNUX09OTFkgOiBTVVBQTF9TQ0FOX0hBTkRMSU5HX05PUk1BTCk7Ci0gICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiU2Nhbi1vbmx5IG1vZGUgY2hhbmdpbmcgdG8gIiArIHNjYW5Pbmx5TW9kZSArICIgc2NhblR5cGU9IiArIHNjYW5UeXBlKTsKLSAgICAgICAgICAgIGlmIChzZXRTY2FuUmVzdWx0SGFuZGxpbmcoc2NhblR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgbUlzU2Nhbk9ubHkgPSBzY2FuT25seU1vZGU7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2Nhbk9ubHlNb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWNvbm5lY3RDb21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgc3VzcGVuZCBtb2RlIG9wdGltaXphdGlvbnMuIFRoZXNlIGluY2x1ZGU6Ci0gICAgICogLSBwYWNrZXQgZmlsdGVyaW5nCi0gICAgICogLSB0dXJuIG9mZiByb2FtaW5nCi0gICAgICogLSBEVElNIHNldHRpbmdzCi0gICAgICoKLSAgICAgKiBVc2VzIHJlZmVyZW5jZSBjb3VudGluZyB0byBrZWVwIHRoZSBzdXNwZW5kIG9wdGltaXphdGlvbnMgZGlzYWJsZWQKLSAgICAgKiBhcyBsb25nIGFzIG9uZSBlbnRpdHkgd2FudHMgb3B0aW1pemF0aW9ucyBkaXNhYmxlZC4KLSAgICAgKgotICAgICAqIEZvciBleGFtcGxlLCBXaWZpTG9jayBjYW4ga2VlcCBzdXNwZW5kIG9wdGltaXphdGlvbnMgZGlzYWJsZWQKLSAgICAgKiBvciB0aGUgdXNlciBzZXR0aW5nICh3aWZpIG5ldmVyIHNsZWVwcykgY2FuIGtlZXAgc3VzcGVuZCBvcHRpbWl6YXRpb25zCi0gICAgICogZGlzYWJsZWQuIEFzIGxvbmcgYXMgb25lIGVudGl0eSB3YW50cyBpdCBkaXNhYmxlZCwgaXQgc2hvdWxkIHN0YXkKLSAgICAgKiB0aGF0IHdheQotICAgICAqCi0gICAgICogQHBhcmFtIGVuYWJsZWQgdHJ1ZSBpZiBvcHRpbWl6YXRpb25zIG5lZWQgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFN1c3BlbmRNb2RlT3B0aW1pemF0aW9ucyhib29sZWFuIGVuYWJsZWQpIHsKLQotICAgICAgICAvKiBJdCBpcyBnb29kIHRvIHBsdW1iIHN1c3BlbmQgb3B0aW1pemF0aW9uIGVuYWJsZQotICAgICAgICAgKiBvciBkaXNhYmxlIGV2ZW4gaWYgcmVmIGNvdW50IGluZGljYXRlcyBhbHJlYWR5IGRvbmUKLSAgICAgICAgICogc2luY2Ugd2UgY291bGQgaGF2ZSBhIGNhc2Ugb2YgcHJldmlvdXMgZmFpbHVyZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghZW5hYmxlZCkgewotICAgICAgICAgICAgbU9wdGltaXphdGlvbnNEaXNhYmxlZFJlZkNvdW50Kys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtT3B0aW1pemF0aW9uc0Rpc2FibGVkUmVmQ291bnQtLTsKLSAgICAgICAgICAgIGlmIChtT3B0aW1pemF0aW9uc0Rpc2FibGVkUmVmQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBLZWVwIHJlZmNvdW50IGZyb20gYmVjb21pbmcgbmVnYXRpdmUgKi8KLSAgICAgICAgICAgICAgICBtT3B0aW1pemF0aW9uc0Rpc2FibGVkUmVmQ291bnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBXaWZpTmF0aXZlLnNldFN1c3BlbmRPcHRpbWl6YXRpb25zQ29tbWFuZChlbmFibGVkKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldCBoaWdoIHBlcmZvcm1hbmNlIG1vZGUgb2Ygb3BlcmF0aW9uLiBUaGlzIHdvdWxkIG1lYW4KLSAgICAgKiB1c2UgYWN0aXZlIHBvd2VyIG1vZGUgYW5kIGRpc2FibGUgc3VzcGVuZCBvcHRpbWl6YXRpb25zCi0gICAgICogQHBhcmFtIGVuYWJsZWQgdHJ1ZSBpZiBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0SGlnaFBlcmZNb2RlKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBpZiAobUlzSGlnaFBlcmZFbmFibGVkICE9IGVuYWJsZWQpIHsKLSAgICAgICAgICAgIGlmIChlbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgc2V0UG93ZXJNb2RlKERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSk7Ci0gICAgICAgICAgICAgICAgc2V0U3VzcGVuZE1vZGVPcHRpbWl6YXRpb25zKGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0UG93ZXJNb2RlKERSSVZFUl9QT1dFUl9NT0RFX0FVVE8pOwotICAgICAgICAgICAgICAgIHNldFN1c3BlbmRNb2RlT3B0aW1pemF0aW9ucyh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Jc0hpZ2hQZXJmRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgICAgICAgICBMb2cuZChUQUcsImhpZ2ggcGVyZm9ybWFuY2UgbW9kZTogIiArIGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tJc0JsdWV0b290aFBsYXlpbmcoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNCbHVldG9vdGhQbGF5aW5nID0gZmFsc2U7Ci0gICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGNvbm5lY3RlZCA9IG1CbHVldG9vdGhBMmRwLmdldENvbm5lY3RlZFNpbmtzKCk7Ci0KLSAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlIDogY29ubmVjdGVkKSB7Ci0gICAgICAgICAgICBpZiAobUJsdWV0b290aEEyZHAuZ2V0U2lua1N0YXRlKGRldmljZSkgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HKSB7Ci0gICAgICAgICAgICAgICAgaXNCbHVldG9vdGhQbGF5aW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzZXRCbHVldG9vdGhTY2FuTW9kZShpc0JsdWV0b290aFBsYXlpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuYWJsZVJzc2lQb2xsaW5nKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGlmIChtRW5hYmxlUnNzaVBvbGxpbmcgIT0gZW5hYmxlKSB7Ci0gICAgICAgICAgICBtRW5hYmxlUnNzaVBvbGxpbmcgPSBlbmFibGU7Ci0gICAgICAgICAgICBjaGVja1BvbGxUaW1lcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2UgcmVsZWFzZSB0aGUgd2FrZWxvY2sgaW4gV2lmaVNlcnZpY2UKLSAgICAgKiB1c2luZyBhIHRpbWVyLgotICAgICAqCi0gICAgICogVE9ETzoKLSAgICAgKiBSZWxlYXNpbmcgd2FrZWxvY2sgdXNpbmcgYm90aCB0aW1lciBhbmQKLSAgICAgKiBhIGNhbGwgZnJvbSBDb25uZWN0aXZpdHlTZXJ2aWNlIHJlcXVpcmVzCi0gICAgICogYSByZXRoaW5rLiBXZSBoYWQgcHJvYmxlbXMgd2hlcmUgV2lmaVNlcnZpY2UKLSAgICAgKiBjb3VsZCBrZWVwIGEgd2FrZWxvY2sgZm9yZXZlciBpZiB3ZSBkZWxldGUKLSAgICAgKiBtZXNzYWdlcyBpbiB0aGUgYXN5bmNocm9ub3VzIGNhbGwKLSAgICAgKiBmcm9tIENvbm5lY3Rpdml0eVNlcnZpY2UKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlV2FrZUxvY2soKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhY2tzIHRoZSBXUEEgc3VwcGxpY2FudCBzdGF0ZXMgdG8gZGV0ZWN0ICJsb29wIiBzaXR1YXRpb25zLgotICAgICAqIEBwYXJhbSBuZXdTdXBwbGljYW50U3RhdGUgVGhlIG5ldyBXUEEgc3VwcGxpY2FudCBzdGF0ZS4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3VwcGxpY2FudCBsb29wIHNob3VsZCBiZSBzdG9wcGVkCi0gICAgICogYW5kIHtAY29kZSBmYWxzZX0gaWYgaXQgc2hvdWxkIGNvbnRpbnVlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N1cHBsaWNhbnRMb29waW5nKFN1cHBsaWNhbnRTdGF0ZSBuZXdTdXBwbGljYW50U3RhdGUpIHsKLSAgICAgICAgaWYgKFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVElORy5vcmRpbmFsKCkgPD0gbmV3U3VwcGxpY2FudFN0YXRlLm9yZGluYWwoKQotICAgICAgICAgICAgJiYgbmV3U3VwcGxpY2FudFN0YXRlLm9yZGluYWwoKSA8IFN1cHBsaWNhbnRTdGF0ZS5DT01QTEVURUQub3JkaW5hbCgpKSB7Ci0gICAgICAgICAgICBpZiAobVN1cHBsaWNhbnRMb29wU3RhdGUgIT0gbmV3U3VwcGxpY2FudFN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1N1cHBsaWNhbnRTdGF0ZS5vcmRpbmFsKCkgPCBtU3VwcGxpY2FudExvb3BTdGF0ZS5vcmRpbmFsKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgKyttTnVtU3VwcGxpY2FudExvb3BJdGVyYXRpb25zOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1TdXBwbGljYW50TG9vcFN0YXRlID0gbmV3U3VwcGxpY2FudFN0YXRlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG5ld1N1cHBsaWNhbnRTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEKSB7Ci0gICAgICAgICAgICByZXNldFN1cHBsaWNhbnRMb29wU3RhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtTnVtU3VwcGxpY2FudExvb3BJdGVyYXRpb25zID49IE1BWF9TVVBQTElDQU5UX0xPT1BfSVRFUkFUSU9OUzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIFdQQSBzdXBwbGljYW50IGxvb3Agc3RhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0U3VwcGxpY2FudExvb3BTdGF0ZSgpIHsKLSAgICAgICAgbU51bVN1cHBsaWNhbnRMb29wSXRlcmF0aW9ucyA9IDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICBJbnRlbnQgaW50ZW50OwotCi0gICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgIGNhc2UgRVZFTlRfU1VQUExJQ0FOVF9DT05ORUNUSU9OOgotICAgICAgICAgICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9SVU5OSU5HOwotICAgICAgICAgICAgICAgIG5vdGVSdW5TdGF0ZSgpOwotICAgICAgICAgICAgICAgIGNoZWNrVXNlU3RhdGljSXAoKTsKLSAgICAgICAgICAgICAgICAvKiBSZXNldCBub3RpZmljYXRpb24gc3RhdGUgb24gbmV3IGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICByZXNldE5vdGlmaWNhdGlvblRpbWVyKCk7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBESENQIHJlcXVlc3RzIGFyZSBibG9ja2luZywgc28gcnVuIHRoZW0gaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgSGFuZGxlclRocmVhZCBkaGNwVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIkRIQ1AgSGFuZGxlciBUaHJlYWQiKTsKLSAgICAgICAgICAgICAgICBkaGNwVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgbURoY3BUYXJnZXQgPSBuZXcgRGhjcEhhbmRsZXIoZGhjcFRocmVhZC5nZXRMb29wZXIoKSwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgbUlzU2Nhbk1vZGVBY3RpdmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1Jc0hpZ2hQZXJmRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1PcHRpbWl6YXRpb25zRGlzYWJsZWRSZWZDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTW9kZVJlZkNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICBtVG9ybkRvd25CeUNvbm5NZ3IgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtTGFzdEJzc2lkID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtTGFzdFNzaWQgPSBudWxsOwotICAgICAgICAgICAgICAgIG1Jc0FueU5ldHdvcmtEaXNhYmxlZC5zZXQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJlcXVlc3RDb25uZWN0aW9uSW5mbygpOwotICAgICAgICAgICAgICAgIFN1cHBsaWNhbnRTdGF0ZSBzdXBwbFN0YXRlID0gbVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoZSBNQUMgYWRkcmVzcyBpc24ndCBnb2luZyB0byBjaGFuZ2UsIHNvIGp1c3QgcmVxdWVzdCBpdAotICAgICAgICAgICAgICAgICAqIG9uY2UgaGVyZS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmcgbWFjYWRkciA9IGdldE1hY0FkZHJlc3MoKTsKLQotICAgICAgICAgICAgICAgIGlmIChtYWNhZGRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldE1hY0FkZHJlc3MobWFjYWRkcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cudihUQUcsICJDb25uZWN0aW9uIHRvIHN1cHBsaWNhbnQgZXN0YWJsaXNoZWQsIHN0YXRlPSIgKwotICAgICAgICAgICAgICAgICAgICBzdXBwbFN0YXRlKTsKLSAgICAgICAgICAgICAgICAvLyBXaS1GaSBzdXBwbGljYW50IGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlZDoKLSAgICAgICAgICAgICAgICAvLyBbMzEtIDJdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0gICAgICAgICAgICAgICAgLy8gWyAxLSAwXSBDb25uZWN0ZWQgdG8gc3VwcGxpY2FudCAoMSksIGRpc2Nvbm5lY3RlZCBmcm9tIHN1cHBsaWNhbnQgKDApICwKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgIG9yIHN1cHBsaWNhbnQgZGllZCAoMikKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1NVUFBMSUNBTlRfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VELCAxKTsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIFRoZSBDT01QTEVURUQgc3RhdGUgY2hhbmdlIGZyb20gdGhlIHN1cHBsaWNhbnQgbWF5IGhhdmUgb2NjdXJyZWQKLSAgICAgICAgICAgICAgICAgKiBpbiBiZXR3ZWVuIHBvbGxpbmcgZm9yIHN1cHBsaWNhbnQgYXZhaWxhYmlsaXR5LCBpbiB3aGljaCBjYXNlCi0gICAgICAgICAgICAgICAgICogd2UgZGlkbid0IHBlcmZvcm0gYSBESENQIHJlcXVlc3QgdG8gZ2V0IGFuIElQIGFkZHJlc3MuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKHN1cHBsU3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkNPTVBMRVRFRCkgewotICAgICAgICAgICAgICAgICAgICBtTGFzdEJzc2lkID0gbVdpZmlJbmZvLmdldEJTU0lEKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0U3NpZCA9IG1XaWZpSW5mby5nZXRTU0lEKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZUludGVyZmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgewotICAgICAgICAgICAgICAgICAgICBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfQ09OTkVDVElPTl9DSEFOR0VfQUNUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1NVUFBMSUNBTlRfQ09OTkVDVEVELCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3VwcGxTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEICYmIG1IYXZlSXBBZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoV2lmaUluZm8uZ2V0RGV0YWlsZWRTdGF0ZU9mKHN1cHBsU3RhdGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBGaWx0ZXIgb3V0IG11bHRpY2FzdCBwYWNrZXRzLiBUaGlzIHNhdmVzIGJhdHRlcnkgcG93ZXIsIHNpbmNlCi0gICAgICAgICAgICAgICAgICogdGhlIENQVSBkb2Vzbid0IGhhdmUgdG8gc3BlbmQgdGltZSBwcm9jZXNzaW5nIHBhY2tldHMgdGhhdAotICAgICAgICAgICAgICAgICAqIGFyZSBnb2luZyB0byBlbmQgdXAgYmVpbmcgdGhyb3duIGF3YXkuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgbVdNLmluaXRpYWxpemVNdWx0aWNhc3RGaWx0ZXJpbmcoKTsKLQotICAgICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoQTJkcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhBMmRwID0gbmV3IEJsdWV0b290aEEyZHAobUNvbnRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaGVja0lzQmx1ZXRvb3RoUGxheWluZygpOwotCi0gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGlzIGFmdGVyIHRoZSBzdXBwbGljYW50IGlzIGFsaXZlCi0gICAgICAgICAgICAgICAgc2V0TnVtQWxsb3dlZENoYW5uZWxzKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfU1VQUExJQ0FOVF9ESVNDT05ORUNUOgotICAgICAgICAgICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9TVE9QUEVEOwotICAgICAgICAgICAgICAgIG5vdGVSdW5TdGF0ZSgpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZGllZCA9IG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9ESVNBQkxFRCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9ESVNBQkxJTkc7Ci0gICAgICAgICAgICAgICAgaWYgKGRpZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIlN1cHBsaWNhbnQgZGllZCB1bmV4cGVjdGVkbHkiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiQ29ubmVjdGlvbiB0byBzdXBwbGljYW50IGxvc3QiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gV2ktRmkgc3VwcGxpY2FudCBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZWQ6Ci0gICAgICAgICAgICAgICAgLy8gWzMxLSAyXSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotICAgICAgICAgICAgICAgIC8vIFsgMS0gMF0gQ29ubmVjdGVkIHRvIHN1cHBsaWNhbnQgKDEpLCBkaXNjb25uZWN0ZWQgZnJvbSBzdXBwbGljYW50ICgwKSAsCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICBvciBzdXBwbGljYW50IGRpZWQgKDIpCi0gICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19TVVBQTElDQU5UX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCwgZGllZCA/IDIgOiAwKTsKLSAgICAgICAgICAgICAgICBjbG9zZVN1cHBsaWNhbnRDb25uZWN0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGllZCkgewotICAgICAgICAgICAgICAgICAgICByZXNldENvbm5lY3Rpb25zKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBXaGVuIHN1cHBsaWNhbnQgZGllcywga2lsbCB0aGUgREhDUCB0aHJlYWQKLSAgICAgICAgICAgICAgICBpZiAobURoY3BUYXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtRGhjcFRhcmdldC5nZXRMb29wZXIoKS5xdWl0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1EaGNwVGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNvbnRleHQucmVtb3ZlU3RpY2t5QnJvYWRjYXN0KG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTikpOwotICAgICAgICAgICAgICAgIGlmIChBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuU1VQUExJQ0FOVF9DT05ORUNUSU9OX0NIQU5HRV9BQ1RJT04pOwotICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfU1VQUExJQ0FOVF9DT05ORUNURUQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVEKTsKLSAgICAgICAgICAgICAgICBzZXRTdXBwbGljYW50U3RhdGUoU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQpOwotICAgICAgICAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbU9idGFpbmluZ0lwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChkaWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1XTS5zZXRXaWZpRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX01BWUJFX1NUQVJUX1NDQU5fUE9TVF9ESVNDT05ORUNUOgotICAgICAgICAgICAgICAgIC8vIE9ubHkgZG8gdGhpcyBpZiB3ZSBoYXZlbid0IGdvdHRlbiBhIG5ldyBzdXBwbGljYW50IHN0YXR1cyBzaW5jZSB0aGUgdGltZXIKLSAgICAgICAgICAgICAgICAvLyBzdGFydGVkCi0gICAgICAgICAgICAgICAgaWYgKG1OdW1TdXBwbGljYW50U3RhdGVDaGFuZ2VzID09IG1zZy5hcmcxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjYW4oZmFsc2UpOyAvLyBkbyBhIHBhc3NpdmUgc2NhbgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgbU51bVN1cHBsaWNhbnRTdGF0ZUNoYW5nZXMrKzsKLSAgICAgICAgICAgICAgICBTdXBwbGljYW50U3RhdGVDaGFuZ2VSZXN1bHQgc3VwcGxpY2FudFN0YXRlUmVzdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgKFN1cHBsaWNhbnRTdGF0ZUNoYW5nZVJlc3VsdCkgbXNnLm9iajsKLSAgICAgICAgICAgICAgICBTdXBwbGljYW50U3RhdGUgbmV3U3RhdGUgPSBzdXBwbGljYW50U3RhdGVSZXN1bHQuc3RhdGU7Ci0gICAgICAgICAgICAgICAgU3VwcGxpY2FudFN0YXRlIGN1cnJlbnRTdGF0ZSA9IG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKTsKLQotICAgICAgICAgICAgICAgIC8vIFdpLUZpIHN1cHBsaWNhbnQgc3RhdGUgY2hhbmdlZDoKLSAgICAgICAgICAgICAgICAvLyBbMzEtIDZdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0gICAgICAgICAgICAgICAgLy8gWyA1LSAwXSBTdXBwbGljYW50IHN0YXRlIG9yZGluYWwgKGFzIGRlZmluZWQgYnkgU3VwcGxpY2FudFN0YXRlKQotICAgICAgICAgICAgICAgIGludCBldmVudExvZ1BhcmFtID0gKG5ld1N0YXRlLm9yZGluYWwoKSAmIDB4M2YpOwotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VELCBldmVudExvZ1BhcmFtKTsKLQotICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cudihUQUcsICJDaGFuZ2luZyBzdXBwbGljYW50IHN0YXRlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY3VycmVudFN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA9PT4gIiArIG5ld1N0YXRlKTsKLQotICAgICAgICAgICAgICAgIGludCBuZXR3b3JrSWQgPSBzdXBwbGljYW50U3RhdGVSZXN1bHQubmV0d29ya0lkOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhlIFN1cHBsaWNhbnRTdGF0ZSBCU1NJRCB2YWx1ZSBpcyB2YWxpZCBpbiBBU1NPQ0lBVElORyBzdGF0ZSBvbmx5LgotICAgICAgICAgICAgICAgICAqIFRoZSBOZXR3b3JrU3RhdGUgQlNTSUQgdmFsdWUgY29tZXMgdXBvbiBhIHN1Y2Nlc3NmdWwgY29ubmVjdGlvbi4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoc3VwcGxpY2FudFN0YXRlUmVzdWx0LnN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVElORykgewotICAgICAgICAgICAgICAgICAgICBtTGFzdEJzc2lkID0gc3VwcGxpY2FudFN0YXRlUmVzdWx0LkJTU0lEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIElmIHdlIGdldCBkaXNjb25uZWN0IG9yIGluYWN0aXZlIHdlIG5lZWQgdG8gc3RhcnQgb3VyCi0gICAgICAgICAgICAgICAgICogd2F0Y2hkb2cgdGltZXIgdG8gc3RhcnQgYSBzY2FuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5ESVNDT05ORUNURUQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5JTkFDVElWRSkgewotICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQob2J0YWluTWVzc2FnZShFVkVOVF9NQVlCRV9TVEFSVF9TQ0FOX1BPU1RfRElTQ09OTkVDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtU3VwcGxpY2FudFN0YXRlQ2hhbmdlcywgMCksIEtJQ0tTVEFSVF9TQ0FOTklOR19ERUxBWV9NU0VDUyk7Ci0gICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIERpZCB3ZSBnZXQgdG8gRElTQ09OTkVDVEVEIHN0YXRlIGR1ZSB0byBhbgotICAgICAgICAgICAgICAgICAqIGF1dGhlbnRpY2F0aW9uIChwYXNzd29yZCkgZmFpbHVyZT8KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBib29sZWFuIGZhaWxlZFRvQXV0aGVudGljYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbGVkVG9BdXRoZW50aWNhdGUgPSBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogS2VlcCB0cmFjayBvZiB0aGUgc3VwcGxpY2FudCBzdGF0ZSBhbmQgY2hlY2sgaWYgd2Ugc2hvdWxkCi0gICAgICAgICAgICAgICAgICogZGlzYWJsZSB0aGUgbmV0d29yawotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZWROZXR3b3JrID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKGlzU3VwcGxpY2FudExvb3BpbmcobmV3U3RhdGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RvcCBXUEEgc3VwcGxpY2FudCBsb29wIGFuZCBkaXNhYmxlIG5ldHdvcmsiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZE5ldHdvcmsgPSB3aWZpTWFuYWdlckRpc2FibGVOZXR3b3JrKG5ldHdvcmtJZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGRpc2FibGVkTmV0d29yaykgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBSZXNldCB0aGUgbG9vcCBzdGF0ZSBpZiB3ZSBkaXNhYmxlZCB0aGUgbmV0d29yawotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcmVzZXRTdXBwbGljYW50TG9vcFN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZSAhPSBjdXJyZW50U3RhdGUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuRElTQ09OTkVDVEVEICYmIGlzRHJpdmVyU3RvcHBlZCgpKSkgewotICAgICAgICAgICAgICAgICAgICBzZXRTdXBwbGljYW50U3RhdGUobmV3U3RhdGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkRPUk1BTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERldGFpbGVkU3RhdGUgbmV3RGV0YWlsZWRTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgcmVjb25uZWN0TXNnID0gb2J0YWluTWVzc2FnZShFVkVOVF9ERUZFUlJFRF9SRUNPTk5FQ1QsIG1MYXN0QnNzaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc1NjYW5Pbmx5IHx8IG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEZXRhaWxlZFN0YXRlID0gRGV0YWlsZWRTdGF0ZS5JRExFOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEZXRhaWxlZFN0YXRlID0gRGV0YWlsZWRTdGF0ZS5GQUlMRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEaXNjb25uZWN0ZWRTdGF0ZShuZXdEZXRhaWxlZFN0YXRlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogSWYgd2Ugd2VyZSBhc3NvY2lhdGVkIHdpdGggYSBuZXR3b3JrIChuZXR3b3JrSWQgIT0gLTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICogYXNzdW1lIHdlIHJlYWNoZWQgdGhpcyBzdGF0ZSBiZWNhdXNlIG9mIGEgZmFpbGVkIGF0dGVtcHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIGFjcXVpcmUgYW4gSVAgYWRkcmVzcywgYW5kIGF0dGVtcHQgYW5vdGhlciBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgSVAgYWRkcmVzcyBhY3F1aXNpdGlvbiBpbiBSRUNPTk5FQ1RfREVMQVlfTVNFQ1MKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG1pbGxpc2Vjb25kcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfUlVOTklORyAmJiAhbUlzU2Nhbk9ubHkgJiYgbmV0d29ya0lkICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKHJlY29ubmVjdE1zZywgUkVDT05ORUNUX0RFTEFZX01TRUNTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUElORykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BEcml2ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVJ1blN0YXRlID09IFJVTl9TVEFURV9TVEFSVElORyAmJiAhbUlzU2Nhbk9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbm5lY3RDb21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUhhdmVJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0RyaXZlclN0b3BwZWQoKSB8fCBtRGlzY29ubmVjdEV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGlzY29ubmVjdGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZURpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZSAhPSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEICYmICFtRGlzY29ubmVjdFBlbmRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogSWdub3JlIGV2ZW50cyB0aGF0IGRvbid0IGNoYW5nZSB0aGUgY29ubmVjdGl2aXR5IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICogc3VjaCBhcyBXUEEgcmVrZXlpbmcgb3BlcmF0aW9ucy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY3VycmVudFN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5DT01QTEVURUQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkFTU09DSUFUSU5HIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVEVEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5GT1VSX1dBWV9IQU5EU0hBS0UgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkdST1VQX0hBTkRTSEFLRSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShXaWZpSW5mby5nZXREZXRhaWxlZFN0YXRlT2YobmV3U3RhdGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG1EaXNjb25uZWN0RXhwZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5TVVBQTElDQU5UX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVQTEFDRV9QRU5ESU5HKTsKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FV19TVEFURSwgKFBhcmNlbGFibGUpbmV3U3RhdGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmFpbGVkVG9BdXRoZW50aWNhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cuZChUQUcsICJGYWlsZWQgdG8gYXV0aGVudGljYXRlLCBkaXNhYmxpbmcgbmV0d29yayAiICsgbmV0d29ya0lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZmlNYW5hZ2VyRGlzYWJsZU5ldHdvcmsobmV0d29ya0lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5FWFRSQV9TVVBQTElDQU5UX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVSUk9SX0FVVEhFTlRJQ0FUSU5HKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX05FVFdPUktfU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIEVhY2ggQ09OTkVDVCBvciBESVNDT05ORUNUIGdlbmVyYXRlcyBhIHBhaXIgb2YgZXZlbnRzLgotICAgICAgICAgICAgICAgICAqIE9uZSBpcyBhIHN1cHBsaWNhbnQgc3RhdGUgY2hhbmdlIGV2ZW50LCBhbmQgdGhlIG90aGVyCi0gICAgICAgICAgICAgICAgICogaXMgYSBuZXR3b3JrIHN0YXRlIGNoYW5nZSBldmVudC4gRm9yIGNvbm5lY3RzLCB0aGUKLSAgICAgICAgICAgICAgICAgKiBzdXBwbGljYW50IGV2ZW50IGFsd2F5cyBhcnJpdmVzIGZpcnN0LCBmb2xsb3dlZCBieQotICAgICAgICAgICAgICAgICAqIHRoZSBuZXR3b3JrIHN0YXRlIGNoYW5nZSBldmVudC4gT25seSB0aGUgbGF0dGVyIGV2ZW50Ci0gICAgICAgICAgICAgICAgICogaGFzIHRoZSBCU1NJRCwgd2hpY2ggd2UgYXJlIGludGVyZXN0ZWQgaW4gY2FwdHVyaW5nLgotICAgICAgICAgICAgICAgICAqIEZvciBkaXNjb25uZWN0cywgdGhlIG9yZGVyIGlzIHRoZSBvcHBvc2l0ZSAtLSB0aGUKLSAgICAgICAgICAgICAgICAgKiBuZXR3b3JrIHN0YXRlIGNoYW5nZSBldmVudCBjb21lcyBmaXJzdCwgZm9sbG93ZWQgYnkKLSAgICAgICAgICAgICAgICAgKiB0aGUgc3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2UgZXZlbnQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgTmV0d29ya1N0YXRlQ2hhbmdlUmVzdWx0IHJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgICAgIChOZXR3b3JrU3RhdGVDaGFuZ2VSZXN1bHQpIG1zZy5vYmo7Ci0KLSAgICAgICAgICAgICAgICAvLyBXaS1GaSBuZXR3b3JrIHN0YXRlIGNoYW5nZWQ6Ci0gICAgICAgICAgICAgICAgLy8gWzMxLSA2XSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotICAgICAgICAgICAgICAgIC8vIFsgNS0gMF0gRGV0YWlsZWQgc3RhdGUgb3JkaW5hbCAoYXMgZGVmaW5lZCBieSBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlKSAgIAotICAgICAgICAgICAgICAgIGV2ZW50TG9nUGFyYW0gPSAocmVzdWx0LnN0YXRlLm9yZGluYWwoKSAmIDB4M2YpOwotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfTkVUV09SS19TVEFURV9DSEFOR0VELCBldmVudExvZ1BhcmFtKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiTmV3IG5ldHdvcmsgc3RhdGUgaXMgIiArIHJlc3VsdC5zdGF0ZSk7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBJZiB3ZSdyZSBpbiBzY2FuLW9ubHkgbW9kZSwgZG9uJ3QgYWR2YW5jZSB0aGUgc3RhdGUgbWFjaGluZSwgYW5kCi0gICAgICAgICAgICAgICAgICogZG9uJ3QgcmVwb3J0IHRoZSBzdGF0ZSBjaGFuZ2UgdG8gY2xpZW50cy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAobUlzU2Nhbk9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIkRyb3BwaW5nIGV2ZW50IGluIHNjYW4tb25seSBtb2RlIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXRlICE9IERldGFpbGVkU3RhdGUuU0NBTk5JTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHNjYW4gY291bnQgc2luY2UgdGhlcmUgd2FzIGEgbmV0d29yayBzdGF0ZQotICAgICAgICAgICAgICAgICAgICAgKiBjaGFuZ2UuIFRoaXMgY291bGQgYmUgZnJvbSBzdXBwbGljYW50IHRyeWluZyB0byBhc3NvY2lhdGUKLSAgICAgICAgICAgICAgICAgICAgICogd2l0aCBhIG5ldHdvcmsuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBtTnVtU2NhbnNTaW5jZU5ldHdvcmtTdGF0ZUNoYW5nZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogSWYgdGhlIHN1cHBsaWNhbnQgc2VudCB1cyBhIENPTk5FQ1RFRCBldmVudCwgd2UgZG9uJ3QKLSAgICAgICAgICAgICAgICAgKiB3YW50IHRvIHNlbmQgb3V0IGFuIGluZGljYXRpb24gb2Ygb3ZlcmFsbCBuZXR3b3JrCi0gICAgICAgICAgICAgICAgICogY29ubmVjdGl2aXR5IHVudGlsIHdlIGhhdmUgb3VyIElQIGFkZHJlc3MuIElmIHRoZQotICAgICAgICAgICAgICAgICAqIHN1cHBsaWNhbnQgc2VudCB1cyBhIERJU0NPTk5FQ1RFRCBldmVudCwgd2UgZGVsYXkKLSAgICAgICAgICAgICAgICAgKiBzZW5kaW5nIGEgbm90aWZpY2F0aW9uIGluIGNhc2UgYSByZWNvbm5lY3Rpb24gdG8KLSAgICAgICAgICAgICAgICAgKiB0aGUgc2FtZSBhY2Nlc3MgcG9pbnQgb2NjdXJzIHdpdGhpbiBhIHNob3J0IHRpbWUuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0ZSA9PSBEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpICE9IFN1cHBsaWNhbnRTdGF0ZS5ET1JNQU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZURpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVxdWVzdENvbm5lY3Rpb25TdGF0dXMobVdpZmlJbmZvKTsKLSAgICAgICAgICAgICAgICBpZiAoIShyZXN1bHQuc3RhdGUgPT0gRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICghbUhhdmVJcEFkZHJlc3MgfHwgbURpc2Nvbm5lY3RQZW5kaW5nKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShyZXN1bHQuc3RhdGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdGUgPT0gRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogUmVtb3ZlIHRoZSAnYXZhaWxhYmxlIG5ldHdvcmtzJyBub3RpZmljYXRpb24gd2hlbiB3ZQotICAgICAgICAgICAgICAgICAgICAgKiBzdWNjZXNzZnVsbHkgY29ubmVjdCB0byBhIG5ldHdvcmsuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25WaXNpYmxlKGZhbHNlLCAwLCBmYWxzZSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gd2FzRGlzY29ubmVjdFBlbmRpbmcgPSBtRGlzY29ubmVjdFBlbmRpbmc7Ci0gICAgICAgICAgICAgICAgICAgIGNhbmNlbERpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogVGhlIGNvbm5lY3Rpb24gaXMgZnVsbHkgY29uZmlndXJlZCBhcyBmYXIgYXMgbGluay1sZXZlbAotICAgICAgICAgICAgICAgICAgICAgKiBjb25uZWN0aXZpdHkgaXMgY29uY2VybmVkLCBidXQgd2UgbWF5IHN0aWxsIG5lZWQgdG8gb2J0YWluCi0gICAgICAgICAgICAgICAgICAgICAqIGFuIElQIGFkZHJlc3MuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpZiAod2FzRGlzY29ubmVjdFBlbmRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERldGFpbGVkU3RhdGUgc2F2ZVN0YXRlID0gZ2V0TmV0d29ya0luZm8oKS5nZXREZXRhaWxlZFN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEaXNjb25uZWN0ZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RFRCwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZUludGVybmFsKHNhdmVTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RCc3NpZCA9IHJlc3VsdC5CU1NJRDsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RTc2lkID0gbVdpZmlJbmZvLmdldFNTSUQoKTsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3ROZXR3b3JrSWQgPSByZXN1bHQubmV0d29ya0lkOwotICAgICAgICAgICAgICAgICAgICBpZiAobUhhdmVJcEFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLk9CVEFJTklOR19JUEFERFIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QobVdpZmlJbmZvLmdldEJTU0lEKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX1NDQU5fUkVTVUxUU19BVkFJTEFCTEU6Ci0gICAgICAgICAgICAgICAgaWYgKEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5pc1N5c3RlbVJlYWR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNDQU5fUkVTVUxUU19BVkFJTEFCTEVfQUNUSU9OKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRTY2FuUmVzdWx0c0F2YWlsYWJsZSgpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIE9uIHJlY2VpdmluZyB0aGUgZmlyc3Qgc2NhbiByZXN1bHRzIGFmdGVyIGNvbm5lY3RpbmcgdG8KLSAgICAgICAgICAgICAgICAgKiB0aGUgc3VwcGxpY2FudCwgc3dpdGNoIHNjYW4gbW9kZSBvdmVyIHRvIHBhc3NpdmUuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgc2V0U2Nhbk1vZGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX1BPTExfSU5URVJWQUw6Ci0gICAgICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSAhPSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UG9sbGVkSW5mbyhtV2lmaUluZm8sIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBjaGVja1BvbGxUaW1lcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSBFVkVOVF9ERUZFUlJFRF9ESVNDT05ORUNUOgotICAgICAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgIT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGlzY29ubmVjdGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQsIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9ERUZFUlJFRF9SRUNPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogbUxhc3RCc3NpZCBjYW4gYmUgbnVsbCB3aGVuIHRoZXJlIGlzIGEgcmVjb25uZWN0Ci0gICAgICAgICAgICAgICAgICogcmVxdWVzdCBvbiB0aGUgZmlyc3QgQlNTSUQgd2UgY29ubmVjdCB0bwotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZyBCU1NJRCA9IChtc2cub2JqICE9IG51bGwpID8gbXNnLm9iai50b1N0cmluZygpIDogbnVsbDsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBJZiB3ZSd2ZSBleGNlZWRlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBmb3IgcmVjb25uZWN0aW5nCi0gICAgICAgICAgICAgICAgICogdG8gYSBnaXZlbiBuZXR3b3JrLCBkaXNhYmxlIHRoZSBuZXR3b3JrCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSAhPSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKyttUmVjb25uZWN0Q291bnQgPiBnZXRNYXhEaGNwUmV0cmllcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZhaWxlZCByZWNvbm5lY3QgY291bnQ6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlY29ubmVjdENvdW50ICsgIiBEaXNhYmxpbmcgIiArIEJTU0lEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1XTS5kaXNhYmxlTmV0d29yayhtTGFzdE5ldHdvcmtJZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVjb25uZWN0Q29tbWFuZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVUNDRUVERUQ6Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogU2luY2UgdGhpcyBldmVudCBpcyBzZW50IGZyb20gYW5vdGhlciB0aHJlYWQsIGl0IG1pZ2h0IGhhdmUgYmVlbgotICAgICAgICAgICAgICAgICAqIHNlbnQgYWZ0ZXIgd2UgY2xvc2VkIG91ciBjb25uZWN0aW9uIHRvIHRoZSBzdXBwbGljYW50IGluIHRoZSBjb3Vyc2UKLSAgICAgICAgICAgICAgICAgKiBvZiBkaXNhYmxpbmcgV2ktRmkuIEluIHRoYXQgY2FzZSwgd2Ugc2hvdWxkIGp1c3QgaWdub3JlIHRoZSBldmVudC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpID09IFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUmVjb25uZWN0Q291bnQgPSAwOwotICAgICAgICAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtT2J0YWluaW5nSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldElwQWRkcmVzcyhtRGhjcEluZm8uaXBBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICBtTGFzdFNpZ25hbExldmVsID0gLTE7IC8vIGZvcmNlIHVwZGF0ZSBvZiBzaWduYWwgc3RyZW5ndGgKLSAgICAgICAgICAgICAgICBpZiAobU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSAhPSBEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChtV2lmaUluZm8uZ2V0QlNTSUQoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiSVAgY29uZmlndXJhdGlvbjogIiArIG1EaGNwSW5mbyk7Ci0gICAgICAgICAgICAgICAgLy8gV2ktRmkgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gc3RhdGUgY2hhbmdlZDoKLSAgICAgICAgICAgICAgICAvLyBbMzEtIDFdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0gICAgICAgICAgICAgICAgLy8gWyAwLSAwXSBJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBzdWNjZWVkZWQgKDEpIG9yIGZhaWxlZCAoMCkgICAKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX1NUQVRFX0NIQU5HRUQsIDEpOwotCi0gICAgICAgICAgICAgICAgLy8gV2UndmUgY29ubmVjdGVkIHN1Y2Nlc3NmdWxseSwgc28gYWxsb3cgdGhlIG5vdGlmaWNhdGlvbiBhZ2FpbiBpbiB0aGUgZnV0dXJlCi0gICAgICAgICAgICAgICAgcmVzZXROb3RpZmljYXRpb25UaW1lcigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX0ZBSUxFRDoKLSAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpICE9IFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdpLUZpIGludGVyZmFjZSBjb25maWd1cmF0aW9uIHN0YXRlIGNoYW5nZWQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFszMS0gMV0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKLSAgICAgICAgICAgICAgICAgICAgLy8gWyAwLSAwXSBJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBzdWNjZWVkZWQgKDEpIG9yIGZhaWxlZCAoMCkKLSAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVEFURV9DSEFOR0VELCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbUhhdmVJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldElwQWRkcmVzcygwKTsKLSAgICAgICAgICAgICAgICAgICAgbU9idGFpbmluZ0lwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX0RSSVZFUl9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgIC8vIFdpLUZpIGRyaXZlciBzdGF0ZSBjaGFuZ2VkOgotICAgICAgICAgICAgICAgIC8vIDAgU1RBUlRFRAotICAgICAgICAgICAgICAgIC8vIDEgU1RPUFBFRAotICAgICAgICAgICAgICAgIC8vIDIgSFVORwotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfRFJJVkVSX1NUQVRFX0NIQU5HRUQsIG1zZy5hcmcxKTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnLmFyZzEpIHsKLSAgICAgICAgICAgICAgICBjYXNlIERSSVZFUl9TVEFSVEVEOgotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogU2V0IHRoZSBudW1iZXIgb2YgYWxsb3dlZCByYWRpbyBjaGFubmVscyBhY2NvcmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICogdG8gdGhlIHN5c3RlbSBzZXR0aW5nLCBzaW5jZSBpdCBnZXRzIHJlc2V0IGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgKiBkcml2ZXIgdXBvbiBjaGFuZ2luZyB0byB0aGUgU1RBUlRFRCBzdGF0ZS4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHNldE51bUFsbG93ZWRDaGFubmVscygpOwotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1NUQVJUSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJ1blN0YXRlID0gUlVOX1NUQVRFX1JVTk5JTkc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtSXNTY2FuT25seSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbm5lY3RDb21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gc29tZSBzaXR1YXRpb25zLCBzdXBwbGljYW50IG5lZWRzIHRvIGJlIGtpY2tzdGFydGVkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IHRoZSBiYWNrZ3JvdW5kIHNjYW5uaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4odHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRFJJVkVSX0hVTkc6Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIldpZmkgRHJpdmVyIHJlcG9ydHMgSFVORyAtIHJlbG9hZGluZy4iKTsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIHJlc3RhcnQgdGhlIGRyaXZlciAtIHRvZ2dsZSBvZmYgYW5kIG9uCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBtV00uc2V0V2lmaUVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBtV00uc2V0V2lmaUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBub3RlUnVuU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9QQVNTV09SRF9LRVlfTUFZX0JFX0lOQ09SUkVDVDoKLSAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gd2lmaU1hbmFnZXJEaXNhYmxlTmV0d29yayhpbnQgbmV0d29ya0lkKSB7Ci0gICAgICAgIGJvb2xlYW4gZGlzYWJsZWROZXR3b3JrID0gZmFsc2U7Ci0gICAgICAgIGlmICgwIDw9IG5ldHdvcmtJZCkgewotICAgICAgICAgICAgZGlzYWJsZWROZXR3b3JrID0gbVdNLmRpc2FibGVOZXR3b3JrKG5ldHdvcmtJZCk7Ci0gICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgewotICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlZE5ldHdvcmspIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiRGlzYWJsZWQgbmV0d29yazogIiArIG5ldHdvcmtJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChMT0NBTF9MT0dEKSB7Ci0gICAgICAgICAgICBpZiAoIWRpc2FibGVkTmV0d29yaykgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBkaXNhYmxlIG5ldHdvcms6IiArCi0gICAgICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIG5ldHdvcmsgaWQ6ICIgKyBuZXR3b3JrSWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaXNhYmxlZE5ldHdvcms7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUludGVyZmFjZSgpIHsKLSAgICAgICAgY2hlY2tQb2xsVGltZXIoKTsKLSAgICAgICAgbUxhc3RTaWduYWxMZXZlbCA9IC0xOwotICAgICAgICBpZiAoIW1Vc2VTdGF0aWNJcCkgewotICAgICAgICAgICAgaWYgKCFtSGF2ZUlwQWRkcmVzcyAmJiAhbU9idGFpbmluZ0lwQWRkcmVzcykgewotICAgICAgICAgICAgICAgIG1PYnRhaW5pbmdJcEFkZHJlc3MgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1EaGNwVGFyZ2V0LnNlbmRFbXB0eU1lc3NhZ2UoRVZFTlRfREhDUF9TVEFSVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBpZiAoTmV0d29ya1V0aWxzLmNvbmZpZ3VyZUludGVyZmFjZShtSW50ZXJmYWNlTmFtZSwgbURoY3BJbmZvKSkgewotICAgICAgICAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBldmVudCA9IEVWRU5UX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX1NVQ0NFRURFRDsKLSAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiU3RhdGljIElQIGNvbmZpZ3VyYXRpb24gc3VjY2VlZGVkIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9GQUlMRUQ7Ci0gICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIlN0YXRpYyBJUCBjb25maWd1cmF0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VuZEVtcHR5TWVzc2FnZShldmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldCBvdXIgSVAgc3RhdGUgYW5kIHNlbmQgb3V0IGJyb2FkY2FzdHMgZm9sbG93aW5nIGEgZGlzY29ubmVjdC4KLSAgICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIHtAY29kZSBEZXRhaWxlZFN0YXRlfSB0byBzZXQuIFNob3VsZCBiZSBlaXRoZXIKLSAgICAgKiB7QGNvZGUgRElTQ09OTkVDVEVEfSBvciB7QGNvZGUgRkFJTEVEfS4KLSAgICAgKiBAcGFyYW0gZGlzYWJsZUludGVyZmFjZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgaW50ZXJmYWNlIHNob3VsZAotICAgICAqIGJlIGRpc2FibGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURpc2Nvbm5lY3RlZFN0YXRlKERldGFpbGVkU3RhdGUgbmV3U3RhdGUsIGJvb2xlYW4gZGlzYWJsZUludGVyZmFjZSkgewotICAgICAgICBpZiAobURpc2Nvbm5lY3RQZW5kaW5nKSB7Ci0gICAgICAgICAgICBjYW5jZWxEaXNjb25uZWN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbURpc2Nvbm5lY3RFeHBlY3RlZCA9IGZhbHNlOwotICAgICAgICByZXNldENvbm5lY3Rpb25zKGRpc2FibGVJbnRlcmZhY2UpOwotICAgICAgICBzZXREZXRhaWxlZFN0YXRlKG5ld1N0YXRlKTsKLSAgICAgICAgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChtTGFzdEJzc2lkKTsKLSAgICAgICAgbVdpZmlJbmZvLnNldEJTU0lEKG51bGwpOwotICAgICAgICBtTGFzdEJzc2lkID0gbnVsbDsKLSAgICAgICAgbUxhc3RTc2lkID0gbnVsbDsKLSAgICAgICAgbURpc2Nvbm5lY3RQZW5kaW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBXaS1GaSBDb25uZWN0aW9ucyBieSBjbGVhcmluZyBhbnkgc3RhdGUsIHJlc2V0dGluZyBhbnkgc29ja2V0cwotICAgICAqIHVzaW5nIHRoZSBpbnRlcmZhY2UsIHN0b3BwaW5nIERIQ1AsIGFuZCBkaXNhYmxpbmcgdGhlIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldENvbm5lY3Rpb25zKGJvb2xlYW4gZGlzYWJsZUludGVyZmFjZSkgewotICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLmQoVEFHLCAiUmVzZXQgY29ubmVjdGlvbnMgYW5kIHN0b3BwaW5nIERIQ1AiKTsKLSAgICAgICAgbUhhdmVJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgbU9idGFpbmluZ0lwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICBtV2lmaUluZm8uc2V0SXBBZGRyZXNzKDApOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFJlc2V0IGNvbm5lY3Rpb24gZGVwZW5kcyBvbiBib3RoIHRoZSBpbnRlcmZhY2UgYW5kIHRoZSBJUCBhc3NpZ25lZCwKLSAgICAgICAgICogc28gaXQgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIGFueSBjaGFuY2Ugb2YgdGhlIElQIGJlaW5nIGxvc3QuCi0gICAgICAgICAqLwotICAgICAgICBOZXR3b3JrVXRpbHMucmVzZXRDb25uZWN0aW9ucyhtSW50ZXJmYWNlTmFtZSk7Ci0KLSAgICAgICAgLy8gU3RvcCBESENQCi0gICAgICAgIGlmIChtRGhjcFRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRGhjcFRhcmdldC5zZXRDYW5jZWxDYWxsYmFjayh0cnVlKTsKLSAgICAgICAgICAgIG1EaGNwVGFyZ2V0LnJlbW92ZU1lc3NhZ2VzKEVWRU5UX0RIQ1BfU1RBUlQpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghTmV0d29ya1V0aWxzLnN0b3BEaGNwKG1JbnRlcmZhY2VOYW1lKSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IHN0b3AgREhDUCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEludGVyZmFjZSBpcyByZS1lbmFibGVkIGluIHRoZSBzdXBwbGljYW50Ci0gICAgICAgICAqIHdoZW4gbW92aW5nIG91dCBvZiBBU1NPQ0lBVElORyBzdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGlzYWJsZUludGVyZmFjZSkgewotICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy5kKFRBRywgIkRpc2FibGluZyBpbnRlcmZhY2UiKTsKLSAgICAgICAgICAgIE5ldHdvcmtVdGlscy5kaXNhYmxlSW50ZXJmYWNlKG1JbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBzdXBwbGljYW50IGlzIHJlcG9ydGluZyB0aGF0IHdlIGFyZSBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY3VycmVudAotICAgICAqIGFjY2VzcyBwb2ludC4gT2Z0ZW4sIGhvd2V2ZXIsIGEgZGlzY29ubmVjdCB3aWxsIGJlIGZvbGxvd2VkIHZlcnkgc2hvcnRseQotICAgICAqIGJ5IGEgcmVjb25uZWN0IHRvIHRoZSBzYW1lIGFjY2VzcyBwb2ludC4gVGhlcmVmb3JlLCB3ZSBkZWxheSByZXNldHRpbmcKLSAgICAgKiB0aGUgY29ubmVjdGlvbidzIElQIHN0YXRlIGZvciBhIGJpdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2NoZWR1bGVEaXNjb25uZWN0KCkgewotICAgICAgICBtRGlzY29ubmVjdFBlbmRpbmcgPSB0cnVlOwotICAgICAgICBpZiAoIWhhc01lc3NhZ2VzKEVWRU5UX0RFRkVSUkVEX0RJU0NPTk5FQ1QpKSB7Ci0gICAgICAgICAgICBzZW5kRW1wdHlNZXNzYWdlRGVsYXllZChFVkVOVF9ERUZFUlJFRF9ESVNDT05ORUNULCBESVNDT05ORUNUX0RFTEFZX01TRUNTKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjYW5jZWxEaXNjb25uZWN0KCkgewotICAgICAgICBtRGlzY29ubmVjdFBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgcmVtb3ZlTWVzc2FnZXMoRVZFTlRfREVGRVJSRURfRElTQ09OTkVDVCk7Ci0gICAgfQotCi0gICAgcHVibGljIERoY3BJbmZvIGdldERoY3BJbmZvKCkgewotICAgICAgICByZXR1cm4gbURoY3BJbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdDxTY2FuUmVzdWx0PiBnZXRTY2FuUmVzdWx0c0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtU2NhblJlc3VsdHM7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFNjYW5SZXN1bHRzTGlzdChMaXN0PFNjYW5SZXN1bHQ+IHNjYW5MaXN0KSB7Ci0gICAgICAgIG1TY2FuUmVzdWx0cyA9IHNjYW5MaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBzdGF0dXMgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24sIGlmIGFueS4KLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFdpZmlJbmZvfSBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBjb25uZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIFdpZmlJbmZvIHJlcXVlc3RDb25uZWN0aW9uSW5mbygpIHsKLSAgICAgICAgcmVxdWVzdENvbm5lY3Rpb25TdGF0dXMobVdpZmlJbmZvKTsKLSAgICAgICAgcmVxdWVzdFBvbGxlZEluZm8obVdpZmlJbmZvLCBmYWxzZSk7Ci0gICAgICAgIHJldHVybiBtV2lmaUluZm87Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlcXVlc3RDb25uZWN0aW9uU3RhdHVzKFdpZmlJbmZvIGluZm8pIHsKLSAgICAgICAgU3RyaW5nIHJlcGx5ID0gc3RhdHVzKCk7Ci0gICAgICAgIGlmIChyZXBseSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgICogUGFyc2UgdGhlIHJlcGx5IGZyb20gdGhlIHN1cHBsaWNhbnQgdG8gdGhlIHN0YXR1cyBjb21tYW5kLCBhbmQgdXBkYXRlCi0gICAgICAgICAqIGxvY2FsIHN0YXRlIGFjY29yZGluZ2x5LiBUaGUgcmVwbHkgaXMgYSBzZXJpZXMgb2YgbGluZXMgb2YgdGhlIGZvcm0KLSAgICAgICAgICogIm5hbWU9dmFsdWUiLgotICAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nIFNTSUQgPSBudWxsOwotICAgICAgICBTdHJpbmcgQlNTSUQgPSBudWxsOwotICAgICAgICBTdHJpbmcgc3VwcFN0YXRlID0gbnVsbDsKLSAgICAgICAgaW50IG5ldElkID0gLTE7Ci0gICAgICAgIFN0cmluZ1tdIGxpbmVzID0gcmVwbHkuc3BsaXQoIlxuIik7Ci0gICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgewotICAgICAgICAgICAgU3RyaW5nW10gcHJvcCA9IGxpbmUuc3BsaXQoIiAqPSAqIiwgMik7Ci0gICAgICAgICAgICBpZiAocHJvcC5sZW5ndGggPCAyKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwcm9wWzBdOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvcFsxXTsKLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImlkIikpCi0gICAgICAgICAgICAgICAgbmV0SWQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgic3NpZCIpKQotICAgICAgICAgICAgICAgIFNTSUQgPSB2YWx1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYnNzaWQiKSkKLSAgICAgICAgICAgICAgICBCU1NJRCA9IHZhbHVlOwotICAgICAgICAgICAgZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJ3cGFfc3RhdGUiKSkKLSAgICAgICAgICAgICAgICBzdXBwU3RhdGUgPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBpbmZvLnNldE5ldHdvcmtJZChuZXRJZCk7Ci0gICAgICAgIGluZm8uc2V0U1NJRChTU0lEKTsKLSAgICAgICAgaW5mby5zZXRCU1NJRChCU1NJRCk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFdlIG9ubHkgc2V0IHRoZSBzdXBwbGljYW50IHN0YXRlIGlmIHRoZSBwcmV2aW91cyBzdGF0ZSB3YXMKLSAgICAgICAgICogVU5JTklUSUFMSVpFRC4gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gd2hlbiB3ZSBmaXJzdCBjb25uZWN0IHRvCi0gICAgICAgICAqIHRoZSBzdXBwbGljYW50LiBPbmNlIHdlJ3JlIGNvbm5lY3RlZCwgd2Ugc2hvdWxkIGFsd2F5cyByZWNlaXZlCi0gICAgICAgICAqIGFuIGV2ZW50IHVwb24gYW55IHN0YXRlIGNoYW5nZSwgYnV0IGluIHRoaXMgY2FzZSwgd2Ugd2FudCB0bwotICAgICAgICAgKiBtYWtlIHN1cmUgYW55IGxpc3RlbmVycyBhcmUgbWFkZSBhd2FyZSBvZiB0aGUgc3RhdGUgY2hhbmdlLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSA9PSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCAmJiBzdXBwU3RhdGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHNldFN1cHBsaWNhbnRTdGF0ZShzdXBwU3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZHluYW1pYyBpbmZvcm1hdGlvbiB0aGF0IGlzIG5vdCByZXBvcnRlZCB2aWEgZXZlbnRzLgotICAgICAqIEBwYXJhbSBpbmZvIHRoZSBvYmplY3QgaW50byB3aGljaCB0aGUgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGNhcHR1cmVkLgotICAgICAqLwotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVxdWVzdFBvbGxlZEluZm8oV2lmaUluZm8gaW5mbywgYm9vbGVhbiBwb2xsaW5nKQotICAgIHsKLSAgICAgICAgaW50IG5ld1Jzc2kgPSAocG9sbGluZyA/IGdldFJzc2lBcHByb3goKSA6IGdldFJzc2koKSk7Ci0gICAgICAgIGlmIChuZXdSc3NpICE9IC0xICYmIC0yMDAgPCBuZXdSc3NpICYmIG5ld1Jzc2kgPCAyNTYpIHsgLy8gc2NyZWVuIG91dCBpbnZhbGlkIHZhbHVlcwotICAgICAgICAgICAgLyogc29tZSBpbXBsZW1lbnRhdGlvbnMgYXZvaWQgbmVnYXRpdmUgdmFsdWVzIGJ5IGFkZGluZyAyNTYKLSAgICAgICAgICAgICAqIHNvIHdlIG5lZWQgdG8gYWRqdXN0IGZvciB0aGF0IGhlcmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChuZXdSc3NpID4gMCkgbmV3UnNzaSAtPSAyNTY7Ci0gICAgICAgICAgICBpbmZvLnNldFJzc2kobmV3UnNzaSk7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogUmF0aGVyIHRoZW4gc2VuZGluZyB0aGUgcmF3IFJTU0kgb3V0IGV2ZXJ5IHRpbWUgaXQKLSAgICAgICAgICAgICAqIGNoYW5nZXMsIHdlIHByZWNhbGN1bGF0ZSB0aGUgc2lnbmFsIGxldmVsIHRoYXQgd291bGQKLSAgICAgICAgICAgICAqIGJlIGRpc3BsYXllZCBpbiB0aGUgc3RhdHVzIGJhciwgYW5kIG9ubHkgc2VuZCB0aGUKLSAgICAgICAgICAgICAqIGJyb2FkY2FzdCBpZiB0aGF0IG11Y2ggbW9yZSBjb2Fyc2UtZ3JhaW5lZCBudW1iZXIKLSAgICAgICAgICAgICAqIGNoYW5nZXMuIFRoaXMgY3V0cyBkb3duIGdyZWF0bHkgb24gdGhlIG51bWJlciBvZgotICAgICAgICAgICAgICogYnJvYWRjYXN0cywgYXQgdGhlIGNvc3Qgb2Ygbm90IGluZm9ybWluZyBvdGhlcnMKLSAgICAgICAgICAgICAqIGludGVyZXN0ZWQgaW4gUlNTSSBvZiBhbGwgdGhlIGNoYW5nZXMgaW4gc2lnbmFsCi0gICAgICAgICAgICAgKiBsZXZlbC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLy8gVE9ETzogVGhlIHNlY29uZCBhcmcgdG8gdGhlIGNhbGwgYmVsb3cgbmVlZHMgdG8gYmUgYSBzeW1ib2wgc29tZXdoZXJlLCBidXQKLSAgICAgICAgICAgIC8vIGl0J3MgYWN0dWFsbHkgdGhlIHNpemUgb2YgYW4gYXJyYXkgb2YgaWNvbnMgdGhhdCdzIHByaXZhdGUKLSAgICAgICAgICAgIC8vIHRvIFN0YXR1c0JhciBQb2xpY3kuCi0gICAgICAgICAgICBpbnQgbmV3U2lnbmFsTGV2ZWwgPSBXaWZpTWFuYWdlci5jYWxjdWxhdGVTaWduYWxMZXZlbChuZXdSc3NpLCA0KTsKLSAgICAgICAgICAgIGlmIChuZXdTaWduYWxMZXZlbCAhPSBtTGFzdFNpZ25hbExldmVsKSB7Ci0gICAgICAgICAgICAgICAgc2VuZFJzc2lDaGFuZ2VCcm9hZGNhc3QobmV3UnNzaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTGFzdFNpZ25hbExldmVsID0gbmV3U2lnbmFsTGV2ZWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbmZvLnNldFJzc2koLTIwMCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG5ld0xpbmtTcGVlZCA9IGdldExpbmtTcGVlZCgpOwotICAgICAgICBpZiAobmV3TGlua1NwZWVkICE9IC0xKSB7Ci0gICAgICAgICAgICBpbmZvLnNldExpbmtTcGVlZChuZXdMaW5rU3BlZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRSc3NpQ2hhbmdlQnJvYWRjYXN0KGZpbmFsIGludCBuZXdSc3NpKSB7Ci0gICAgICAgIGlmIChBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSB7Ci0gICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5SU1NJX0NIQU5HRURfQUNUSU9OKTsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVdfUlNTSSwgbmV3UnNzaSk7Ci0gICAgICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChTdHJpbmcgYnNzaWQpIHsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTik7Ci0gICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QKLSAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX1JFQ0VJVkVSX1JFUExBQ0VfUEVORElORyk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVRXT1JLX0lORk8sIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgIGlmIChic3NpZCAhPSBudWxsKQotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX0JTU0lELCBic3NpZCk7Ci0gICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNhYmxlIFdpLUZpIGNvbm5lY3Rpdml0eSBieSBzdG9wcGluZyB0aGUgZHJpdmVyLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHRlYXJkb3duKCkgewotICAgICAgICBpZiAoIW1Ub3JuRG93bkJ5Q29ubk1ncikgewotICAgICAgICAgICAgaWYgKGRpc2Nvbm5lY3RBbmRTdG9wKCkpIHsKLSAgICAgICAgICAgICAgICBzZXRUb3JuRG93bkJ5Q29ubk1ncih0cnVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWVuYWJsZSBXaS1GaSBjb25uZWN0aXZpdHkgYnkgcmVzdGFydGluZyB0aGUgZHJpdmVyLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpIHsKLSAgICAgICAgaWYgKG1Ub3JuRG93bkJ5Q29ubk1ncikgewotICAgICAgICAgICAgaWYgKHJlc3RhcnQoKSkgewotICAgICAgICAgICAgICAgIHNldFRvcm5Eb3duQnlDb25uTWdyKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXZSB3YW50IHRvIHN0b3AgdGhlIGRyaXZlciwgYnV0IGlmIHdlJ3JlIGNvbm5lY3RlZCB0byBhIG5ldHdvcmssCi0gICAgICogd2UgZmlyc3Qgd2FudCB0byBkaXNjb25uZWN0LCBzbyB0aGF0IHRoZSBzdXBwbGljYW50IGlzIGFsd2F5cyBpbgotICAgICAqIGEga25vd24gc3RhdGUgKERJU0NPTk5FQ1RFRCkgd2hlbiB0aGUgZHJpdmVyIGlzIHN0b3BwZWQuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywgd2hpY2ggbWVhbnMgdGhhdCB0aGUKLSAgICAgKiBkaXNjb25uZWN0IG9yIHN0b3AgY29tbWFuZCB3YXMgaW5pdGlhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkaXNjb25uZWN0QW5kU3RvcCgpIHsKLSAgICAgICAgYm9vbGVhbiByZXQgPSB0cnVlOzsKLSAgICAgICAgaWYgKG1SdW5TdGF0ZSAhPSBSVU5fU1RBVEVfU1RPUFBJTkcgJiYgbVJ1blN0YXRlICE9IFJVTl9TVEFURV9TVE9QUEVEKSB7Ci0gICAgICAgICAgICAvLyBUYWtlIGRvd24gYW55IG9wZW4gbmV0d29yayBub3RpZmljYXRpb25zCi0gICAgICAgICAgICBzZXROb3RpZmljYXRpb25WaXNpYmxlKGZhbHNlLCAwLCBmYWxzZSwgMCk7Ci0KLSAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLkRPUk1BTlQpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBzdG9wRHJpdmVyKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldCA9IGRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9TVE9QUElORzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZXN0YXJ0KCkgewotICAgICAgICBpZiAobVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUEVEKSB7Ci0gICAgICAgICAgICBtUnVuU3RhdGUgPSBSVU5fU1RBVEVfU1RBUlRJTkc7Ci0gICAgICAgICAgICByZXNldENvbm5lY3Rpb25zKHRydWUpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXJ0RHJpdmVyKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUElORykgewotICAgICAgICAgICAgbVJ1blN0YXRlID0gUlVOX1NUQVRFX1NUQVJUSU5HOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0V2lmaVN0YXRlKCkgewotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZS5nZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaWZpU3RhdGUoaW50IHdpZmlTdGF0ZSkgewotICAgICAgICBtV2lmaVN0YXRlLnNldCh3aWZpU3RhdGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQW55TmV0d29ya0Rpc2FibGVkKCkgewotICAgICAgICByZXR1cm4gbUlzQW55TmV0d29ya0Rpc2FibGVkLmdldCgpOwotICAgIH0KLQotICAgLyoqCi0gICAgICogVGhlIFdpZmlOYXRpdmUgaW50ZXJmYWNlIGZ1bmN0aW9ucyBhcmUgbGlzdGVkIGJlbG93LgotICAgICAqIFRoZSBvbmx5IG5hdGl2ZSBjYWxsIHRoYXQgaXMgbm90IHN5bmNocm9uaXplZCBvbgotICAgICAqIFdpZmlTdGF0ZVRyYWNrZXIgaXMgd2FpdEZvckV2ZW50KCkgd2hpY2ggd2FpdHMgb24gYQotICAgICAqIHNlcGVyYXRlIG1vbml0b3IgY2hhbm5lbC4KLSAgICAgKgotICAgICAqIEFsbCBzdXBwbGljYW50IGNvbW1hbmRzIG5lZWQgdGhlIHdpZmkgdG8gYmUgaW4gYW4KLSAgICAgKiBlbmFibGVkIHN0YXRlLiBUaGlzIGNhbiBiZSBkb25lIGJ5IGNoZWNraW5nIHRoZQotICAgICAqIG1XaWZpU3RhdGUgdG8gYmUgV0lGSV9TVEFURV9FTkFCTEVELgotICAgICAqCi0gICAgICogQWxsIGNvbW1hbmRzIHRoYXQgY2FuIGNhdXNlIGNvbW1hbmRzIHRvIGRyaXZlcgotICAgICAqIGluaXRpYXRlZCBuZWVkIHRoZSBkcml2ZXIgc3RhdGUgdG8gYmUgc3RhcnRlZC4KLSAgICAgKiBUaGlzIGlzIGRvbmUgYnkgY2hlY2tpbmcgaXNEcml2ZXJTdG9wcGVkKCkgdG8KLSAgICAgKiBiZSBmYWxzZS4KLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIExvYWQgdGhlIGRyaXZlciBhbmQgZmlybXdhcmUKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGxvYWREcml2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmxvYWREcml2ZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbmxvYWQgdGhlIGRyaXZlciBhbmQgZmlybXdhcmUKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHVubG9hZERyaXZlcigpIHsKLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUudW5sb2FkRHJpdmVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIHN1cHBsaWNhbnQgY29uZmlnIGFuZAotICAgICAqIHN0YXJ0IHRoZSBzdXBwbGljYW50IGRhZW1vbgotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RhcnRTdXBwbGljYW50KCkgewotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zdGFydFN1cHBsaWNhbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wIHRoZSBzdXBwbGljYW50IGRhZW1vbgotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RvcFN1cHBsaWNhbnQoKSB7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0b3BTdXBwbGljYW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXN0YWJsaXNoZXMgdHdvIGNoYW5uZWxzIC0gY29udHJvbCBjaGFubmVsIGZvciBjb21tYW5kcwotICAgICAqIGFuZCBtb25pdG9yIGNoYW5uZWwgZm9yIG5vdGlmeWluZyBXaWZpTW9uaXRvcgotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29ubmVjdFRvU3VwcGxpY2FudCgpIHsKLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuY29ubmVjdFRvU3VwcGxpY2FudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlIHRoZSBjb250cm9sL21vbml0b3IgY2hhbm5lbHMgdG8gc3VwcGxpY2FudAotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZVN1cHBsaWNhbnRDb25uZWN0aW9uKCkgewotICAgICAgICBXaWZpTmF0aXZlLmNsb3NlU3VwcGxpY2FudENvbm5lY3Rpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB0aGUgc3VwcGxpY2FudCBpcyBhbGl2ZQotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcGluZygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUucGluZ0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpbml0aWF0ZSBhbiBhY3RpdmUgb3IgcGFzc2l2ZSBzY2FuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZm9yY2VBY3RpdmUgdHJ1ZSBpZiBpdCBpcyBhIGFjdGl2ZSBzY2FuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2Nhbihib29sZWFuIGZvcmNlQWN0aXZlKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNjYW5Db21tYW5kKGZvcmNlQWN0aXZlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgc3VwcGxpY2FudCBvciBkcml2ZXIKLSAgICAgKiB0YWtlIGNhcmUgb2YgaW5pdGlhdGluZyBzY2FuIGFuZCBkb2luZyBBUCBzZWxlY3Rpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBtb2RlCi0gICAgICogICAgU1VQUExfU0NBTl9IQU5ETElOR19OT1JNQUwKLSAgICAgKiAgICBTVVBQTF9TQ0FOX0hBTkRMSU5HX0xJU1RfT05MWQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldFNjYW5SZXN1bHRIYW5kbGluZyhpbnQgbW9kZSkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kKG1vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZldGNoIHRoZSBzY2FuIHJlc3VsdHMgZnJvbSB0aGUgc3VwcGxpY2FudAotICAgICAqCi0gICAgICogQHJldHVybiBleGFtcGxlIHJlc3VsdCBzdHJpbmcKLSAgICAgKiAwMDpiYjpjYzpkZDpjYzplZSAgICAgICAyNDI3ICAgIDE2NiAgICAgW1dQQS1FQVAtVEtJUF1bV1BBMi1FQVAtQ0NNUF0gICBOZXQxCi0gICAgICogMDA6YmI6Y2M6ZGQ6Y2M6ZmYgICAgICAgMjQxMiAgICAxNjUgICAgIFtXUEEtRUFQLVRLSVBdW1dQQTItRUFQLUNDTVBdICAgTmV0MgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHNjYW5SZXN1bHRzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNjYW5SZXN1bHRzQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc2NhbiBtb2RlIC0gYWN0aXZlIG9yIHBhc3NpdmUKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldFNjYW5Nb2RlKGJvb2xlYW4gaXNTY2FuTW9kZUFjdGl2ZSkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlzU2Nhbk1vZGVBY3RpdmUgIT0gaXNTY2FuTW9kZUFjdGl2ZSkgewotICAgICAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc2V0U2Nhbk1vZGVDb21tYW5kKG1Jc1NjYW5Nb2RlQWN0aXZlID0gaXNTY2FuTW9kZUFjdGl2ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzY29ubmVjdCBmcm9tIEFjY2VzcyBQb2ludAotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzY29ubmVjdCgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWF0ZSBhIHJlY29ubmVjdGlvbiB0byBBUAotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVjb25uZWN0Q29tbWFuZCgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUucmVjb25uZWN0Q29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIG5ldHdvcmsKLSAgICAgKgotICAgICAqIEByZXR1cm4gbmV0d29yayBpZCBvZiB0aGUgbmV3IG5ldHdvcmsKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBhZGROZXR3b3JrKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5hZGROZXR3b3JrQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZSBhIG5ldHdvcmsKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXR3b3JrSWQgaWQgb2YgdGhlIG5ldHdvcmsgdG8gYmUgcmVtb3ZlZAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbW92ZU5ldHdvcmsoaW50IG5ldHdvcmtJZCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbURpc2Nvbm5lY3RFeHBlY3RlZCA9IFdpZmlOYXRpdmUucmVtb3ZlTmV0d29ya0NvbW1hbmQobmV0d29ya0lkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGUgYSBuZXR3b3JrCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yawotICAgICAqIEBwYXJhbSBkaXNhYmxlT3RoZXJzIHRydWUsIGlmIGFsbCBvdGhlciBuZXR3b3JrcyBoYXZlIHRvIGJlIGRpc2FibGVkCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZW5hYmxlTmV0d29yayhpbnQgbmV0SWQsIGJvb2xlYW4gZGlzYWJsZU90aGVycykgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGlzYWJsZU90aGVycykgbUlzQW55TmV0d29ya0Rpc2FibGVkLnNldCh0cnVlKTsKLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZW5hYmxlTmV0d29ya0NvbW1hbmQobmV0SWQsIGRpc2FibGVPdGhlcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuYWJsZSBhbGwgbmV0d29ya3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXR3b3JrcyBsaXN0IG9mIGNvbmZpZ3VyZWQgbmV0d29ya3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZW5hYmxlQWxsTmV0d29ya3MoTGlzdDxXaWZpQ29uZmlndXJhdGlvbj4gbmV0d29ya3MpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUlzQW55TmV0d29ya0Rpc2FibGVkLnNldChmYWxzZSk7Ci0gICAgICAgIGZvciAoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnIDogbmV0d29ya3MpIHsKLSAgICAgICAgICAgIGlmIChjb25maWcuc3RhdHVzID09IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5ESVNBQkxFRCkgewotICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZW5hYmxlTmV0d29ya0NvbW1hbmQoY29uZmlnLm5ldHdvcmtJZCwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzYWJsZSBhIG5ldHdvcmsKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIGlkIG9mIHRoZSBuZXR3b3JrCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzYWJsZU5ldHdvcmsoaW50IG5ldElkKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1Jc0FueU5ldHdvcmtEaXNhYmxlZC5zZXQodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmRpc2FibGVOZXR3b3JrQ29tbWFuZChuZXRJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhdGUgYSByZS1hc3NvY2lhdGlvbiBpbiBzdXBwbGljYW50Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWFzc29jaWF0ZSgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUucmVhc3NvY2lhdGVDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmxhY2tsaXN0IGEgQlNTSUQuIFRoaXMgd2lsbCBhdm9pZCB0aGUgQVAgaWYgdGhlcmUgYXJlCi0gICAgICogYWx0ZXJuYXRlIEFQcyB0byBjb25uZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYnNzaWQgQlNTSUQgb2YgdGhlIG5ldHdvcmsKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGRUb0JsYWNrbGlzdChTdHJpbmcgYnNzaWQpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuYWRkVG9CbGFja2xpc3RDb21tYW5kKGJzc2lkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhciB0aGUgYmxhY2tsaXN0IGxpc3QKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNsZWFyQmxhY2tsaXN0KCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5jbGVhckJsYWNrbGlzdENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0IGFsbCBjb25maWd1cmVkIG5ldHdvcmtzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgbmV0d29ya3Mgb3IgbnVsbCBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgbGlzdE5ldHdvcmtzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmxpc3ROZXR3b3Jrc0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbmV0d29yayBzZXR0aW5nIGJ5IG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIGlkIG9mIHRoZSBuZXR3b3JrCi0gICAgICogQHBhcmFtIG5hbWUgbmV0d29yayB2YXJpYWJsZSBrZXkKLSAgICAgKiBAcmV0dXJuIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8ga2V5Ci0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0TmV0d29ya1ZhcmlhYmxlKGludCBuZXRJZCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLCBuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgbmV0d29yayBzZXR0aW5nIGJ5IG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIGlkIG9mIHRoZSBuZXR3b3JrCi0gICAgICogQHBhcmFtIG5hbWUgbmV0d29yayB2YXJpYWJsZSBrZXkKLSAgICAgKiBAcGFyYW0gdmFsdWUgbmV0d29yayB2YXJpYWJsZSB2YWx1ZQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldE5ldHdvcmtWYXJpYWJsZShpbnQgbmV0SWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgbmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBkZXRhaWxlZCBzdGF0dXMgb2YgdGhlIGNvbm5lY3Rpb24KLSAgICAgKgotICAgICAqIEByZXR1cm4gRXhhbXBsZSBzdGF0dXMgcmVzdWx0Ci0gICAgICogIGJzc2lkPWFhOmJiOmNjOmRkOmVlOmZmCi0gICAgICogIHNzaWQ9VGVzdE5ldAotICAgICAqICBpZD0zCi0gICAgICogIHBhaXJ3aXNlX2NpcGhlcj1OT05FCi0gICAgICogIGdyb3VwX2NpcGhlcj1OT05FCi0gICAgICogIGtleV9tZ210PU5PTkUKLSAgICAgKiAgd3BhX3N0YXRlPUNPTVBMRVRFRAotICAgICAqICBpcF9hZGRyZXNzPVguWC5YLlgKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBzdGF0dXMoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc3RhdHVzQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBSU1NJIHRvIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yawotICAgICAqCi0gICAgICogQHJldHVybiBSU1NJIHZhbHVlLCAtMSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0UnNzaSgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZ2V0UnNzaUFwcHJveENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYXBwcm94IFJTU0kgdG8gY3VycmVudGx5IGNvbm5lY3RlZCBuZXR3b3JrCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJTU0kgdmFsdWUsIC0xIG9uIGZhaWx1cmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRSc3NpQXBwcm94KCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXRSc3NpQXBwcm94Q29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBsaW5rIHNwZWVkIHRvIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yawotICAgICAqCi0gICAgICogQHJldHVybiBsaW5rIHNwZWVkLCAtMSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0TGlua1NwZWVkKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXRMaW5rU3BlZWRDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IE1BQyBhZGRyZXNzIG9mIHJhZGlvCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE1BQyBhZGRyZXNzLCBudWxsIG9uIGZhaWx1cmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRNYWNBZGRyZXNzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmdldE1hY0FkZHJlc3NDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgZHJpdmVyCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdGFydERyaXZlcigpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc3RhcnREcml2ZXJDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcCBkcml2ZXIKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BEcml2ZXIoKSB7Ci0gICAgICAgIC8qIERyaXZlciBzdG9wIHNob3VsZCBub3QgaGFwcGVuIG9ubHkgd2hlbiBzdXBwbGljYW50IGV2ZW50Ci0gICAgICAgICAqIERSSVZFUl9TVE9QUEVEIGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZCAqLwotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgbVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc3RvcERyaXZlckNvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBwYWNrZXQgZmlsdGVyaW5nCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdGFydFBhY2tldEZpbHRlcmluZygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wIHBhY2tldCBmaWx0ZXJpbmcKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BQYWNrZXRGaWx0ZXJpbmcoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0b3BQYWNrZXRGaWx0ZXJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgcG93ZXIgbW9kZQotICAgICAqIEByZXR1cm4gcG93ZXIgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFBvd2VyTW9kZSgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEICYmICFpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmdldFBvd2VyTW9kZUNvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgcG93ZXIgbW9kZQotICAgICAqIEBwYXJhbSBtb2RlCi0gICAgICogICAgIERSSVZFUl9QT1dFUl9NT0RFX0FVVE8KLSAgICAgKiAgICAgRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFCi0gICAgICoKLSAgICAgKiBVc2VzIHJlZmVyZW5jZSBjb3VudGluZyB0byBrZWVwIHBvd2VyIG1vZGUgYWN0aXZlCi0gICAgICogYXMgbG9uZyBhcyBvbmUgZW50aXR5IHdhbnRzIHBvd2VyIG1vZGUgdG8gYmUgYWN0aXZlLgotICAgICAqCi0gICAgICogRm9yIGV4YW1wbGUsIFdpZmlMb2NrIGhpZ2ggcGVyZiBtb2RlIGNhbiBrZWVwIHBvd2VyIG1vZGUgYWN0aXZlCi0gICAgICogb3IgYSBESENQIHNlc3Npb24gY2FuIGtlZXAgaXQgYWN0aXZlLiBBcyBsb25nIGFzIG9uZSBlbnRpdHkgd2FudHMKLSAgICAgKiBpdCBlbmFibGVkLCBpdCBzaG91bGQgc3RheSB0aGF0IHdheQotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQb3dlck1vZGUoaW50IG1vZGUpIHsKLQotICAgICAgICAvKiBJdCBpcyBnb29kIHRvIHBsdW1iIHBvd2VyIG1vZGUgY2hhbmdlCi0gICAgICAgICAqIGV2ZW4gaWYgcmVmIGNvdW50IGluZGljYXRlcyBhbHJlYWR5IGRvbmUKLSAgICAgICAgICogc2luY2Ugd2UgY291bGQgaGF2ZSBhIGNhc2Ugb2YgcHJldmlvdXMgZmFpbHVyZS4KLSAgICAgICAgICovCi0gICAgICAgIHN3aXRjaChtb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRToKLSAgICAgICAgICAgICAgICBtUG93ZXJNb2RlUmVmQ291bnQrKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRFJJVkVSX1BPV0VSX01PREVfQVVUTzoKLSAgICAgICAgICAgICAgICBtUG93ZXJNb2RlUmVmQ291bnQtLTsKLSAgICAgICAgICAgICAgICBpZiAobVBvd2VyTW9kZVJlZkNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyogS2VlcCByZWZjb3VudCBmcm9tIGJlY29taW5nIG5lZ2F0aXZlICovCi0gICAgICAgICAgICAgICAgICAgIG1Qb3dlck1vZGVSZWZDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBXaWZpTmF0aXZlLnNldFBvd2VyTW9kZUNvbW1hbmQobW9kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBudW1iZXIgb2YgYWxsb3dlZCByYWRpbyBmcmVxdWVuY3kgY2hhbm5lbHMgZnJvbSB0aGUgc3lzdGVtCi0gICAgICogc2V0dGluZyB2YWx1ZSwgaWYgYW55LgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLCBlLmcuLAotICAgICAqIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaXMgaW52YWxpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0TnVtQWxsb3dlZENoYW5uZWxzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHNldE51bUFsbG93ZWRDaGFubmVscygKLSAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTlVNX0FMTE9XRURfQ0hBTk5FTFMpKTsKLSAgICAgICAgfSBjYXRjaCAoU2V0dGluZ3MuU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChtTnVtQWxsb3dlZENoYW5uZWxzICE9IDApIHsKLSAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldE51bUFsbG93ZWRDaGFubmVsc0NvbW1hbmQobU51bUFsbG93ZWRDaGFubmVscyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBvdGhlcndpc2UsIHVzZSB0aGUgZHJpdmVyIGRlZmF1bHQKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG51bWJlciBvZiByYWRpbyBmcmVxdWVuY3kgY2hhbm5lbHMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSB1c2VkCi0gICAgICogaW4gdGhlIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uCi0gICAgICogQHBhcmFtIG51bUNoYW5uZWxzIHRoZSBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscy4gTXVzdCBiZSBncmVhdGVyIHRoYW4gMAotICAgICAqIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UsIGUuZy4sCi0gICAgICoge0Bjb2RlIG51bUNoYW5uZWxzfSBpcyBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0TnVtQWxsb3dlZENoYW5uZWxzKGludCBudW1DaGFubmVscykgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtTnVtQWxsb3dlZENoYW5uZWxzID0gbnVtQ2hhbm5lbHM7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNldE51bUFsbG93ZWRDaGFubmVsc0NvbW1hbmQobnVtQ2hhbm5lbHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscwotICAgICAqCi0gICAgICogQHJldHVybiBjaGFubmVsIGNvdW50LCAtMSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0TnVtQWxsb3dlZENoYW5uZWxzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXROdW1BbGxvd2VkQ2hhbm5lbHNDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGJsdWV0b290aCBjb2V4IG1vZGU6Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kZQotICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9FTkFCTEVECi0gICAgICogIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0RJU0FCTEVECi0gICAgICogIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX1NFTlNFCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlKGludCBtb2RlKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZUNvbW1hbmQobW9kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5hYmxlIG9yIGRpc2FibGUgQmx1ZXRvb3RoIGNvZXhpc3RlbmNlIHNjYW4gbW9kZS4gV2hlbiB0aGlzIG1vZGUgaXMgb24sCi0gICAgICogc29tZSBvZiB0aGUgbG93LWxldmVsIHNjYW4gcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSBkcml2ZXIgYXJlIGNoYW5nZWQgdG8KLSAgICAgKiByZWR1Y2UgaW50ZXJmZXJlbmNlIHdpdGggQTJEUCBzdHJlYW1pbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXNCbHVldG9vdGhQbGF5aW5nIHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhpcyBtb2RlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEJsdWV0b290aFNjYW5Nb2RlKGJvb2xlYW4gaXNCbHVldG9vdGhQbGF5aW5nKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFdpZmlOYXRpdmUuc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VTY2FuTW9kZUNvbW1hbmQoaXNCbHVldG9vdGhQbGF5aW5nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIGNvbmZpZ3VyYXRpb24gb24gc3VwcGxpY2FudAotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2F2ZUNvbmZpZygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc2F2ZUNvbmZpZ0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWxvYWQgdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSBmaWxlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWxvYWRDb25maWcoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnJlbG9hZENvbmZpZ0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRSYWRpbyhib29sZWFuIHR1cm5PbikgewotICAgICAgICByZXR1cm4gbVdNLnNldFdpZmlFbmFibGVkKHR1cm5Pbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIFRoZXJlIGFyZSBjdXJyZW50bHkgbm8gV2ktRmktc3BlY2lmaWMgZmVhdHVyZXMgc3VwcG9ydGVkLgotICAgICAqIEBwYXJhbSBmZWF0dXJlIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlCi0gICAgICogQHJldHVybiB7QGNvZGUgLTF9IGluZGljYXRpbmcgZmFpbHVyZSwgYWx3YXlzCisgICAgICogVGVsbHMgdGhlIHVuZGVybHlpbmcgbmV0d29ya2luZyBzeXN0ZW0gdGhhdCB0aGUgY2FsbGVyIHdhbnRzIHRvCisgICAgICogYmVnaW4gdXNpbmcgdGhlIG5hbWVkIGZlYXR1cmUuIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB7QGNvZGUgZmVhdHVyZX0KKyAgICAgKiBpcyBjb21wbGV0ZWx5IHVwIHRvIGVhY2ggbmV0d29ya2luZyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZSB0byBiZSB1c2VkCisgICAgICogQHBhcmFtIGNhbGxpbmdQaWQgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIHByb2Nlc3MgdGhhdCBpcyBpc3N1aW5nIHRoaXMgcmVxdWVzdAorICAgICAqIEBwYXJhbSBjYWxsaW5nVWlkIHRoZSB1c2VyIElEIG9mIHRoZSBwcm9jZXNzIHRoYXQgaXMgaXNzdWluZyB0aGlzIHJlcXVlc3QKKyAgICAgKiBAcmV0dXJuIGFuIGludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBvdXRjb21lIG9mIHRoZSByZXF1ZXN0LgorICAgICAqIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIHZhbHVlIGlzIHNwZWNpZmljIHRvIGVhY2ggbmV0d29ya2luZworICAgICAqIGltcGxlbWVudGF0aW9uK2ZlYXR1cmUgY29tYmluYXRpb24sIGV4Y2VwdCB0aGF0IHRoZSB2YWx1ZSB7QGNvZGUgLTF9CisgICAgICogYWx3YXlzIGluZGljYXRlcyBmYWlsdXJlLgorICAgICAqIFRPRE86IG5lZWRzIHRvIGdvIGF3YXkKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHN0YXJ0VXNpbmdOZXR3b3JrRmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkKSB7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogVGhlcmUgYXJlIGN1cnJlbnRseSBubyBXaS1GaS1zcGVjaWZpYyBmZWF0dXJlcyBzdXBwb3J0ZWQuCi0gICAgICogQHBhcmFtIGZlYXR1cmUgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUKLSAgICAgKiBAcmV0dXJuIHtAY29kZSAtMX0gaW5kaWNhdGluZyBmYWlsdXJlLCBhbHdheXMKKyAgICAgKiBUZWxscyB0aGUgdW5kZXJseWluZyBuZXR3b3JraW5nIHN5c3RlbSB0aGF0IHRoZSBjYWxsZXIgaXMgZmluaXNoZWQKKyAgICAgKiB1c2luZyB0aGUgbmFtZWQgZmVhdHVyZS4gVGhlIGludGVycHJldGF0aW9uIG9mIHtAY29kZSBmZWF0dXJlfQorICAgICAqIGlzIGNvbXBsZXRlbHkgdXAgdG8gZWFjaCBuZXR3b3JraW5nIGltcGxlbWVudGF0aW9uLgorICAgICAqIEBwYXJhbSBmZWF0dXJlIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlIHRoYXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAgICAgKiBAcGFyYW0gY2FsbGluZ1BpZCB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgcHJvY2VzcyB0aGF0IGlzIGlzc3VpbmcgdGhpcyByZXF1ZXN0CisgICAgICogQHBhcmFtIGNhbGxpbmdVaWQgdGhlIHVzZXIgSUQgb2YgdGhlIHByb2Nlc3MgdGhhdCBpcyBpc3N1aW5nIHRoaXMgcmVxdWVzdAorICAgICAqIEByZXR1cm4gYW4gaW50ZWdlciB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG91dGNvbWUgb2YgdGhlIHJlcXVlc3QuCisgICAgICogVGhlIGludGVycHJldGF0aW9uIG9mIHRoaXMgdmFsdWUgaXMgc3BlY2lmaWMgdG8gZWFjaCBuZXR3b3JraW5nCisgICAgICogaW1wbGVtZW50YXRpb24rZmVhdHVyZSBjb21iaW5hdGlvbiwgZXhjZXB0IHRoYXQgdGhlIHZhbHVlIHtAY29kZSAtMX0KKyAgICAgKiBhbHdheXMgaW5kaWNhdGVzIGZhaWx1cmUuCisgICAgICogVE9ETzogbmVlZHMgdG8gZ28gYXdheQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgc3RvcFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCkgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW50ZXJwcmV0U2NhblJlc3VsdHNBdmFpbGFibGUoKSB7Ci0KLSAgICAgICAgLy8gSWYgd2Ugc2hvdWxkbid0IHBsYWNlIGEgbm90aWZpY2F0aW9uIG9uIGF2YWlsYWJsZSBuZXR3b3JrcywgdGhlbgotICAgICAgICAvLyBkb24ndCBib3RoZXIgZG9pbmcgYW55IG9mIHRoZSBmb2xsb3dpbmcKLSAgICAgICAgaWYgKCFtTm90aWZpY2F0aW9uRW5hYmxlZCkgcmV0dXJuOwotCi0gICAgICAgIE5ldHdvcmtJbmZvIG5ldHdvcmtJbmZvID0gZ2V0TmV0d29ya0luZm8oKTsKLQotICAgICAgICBTdGF0ZSBzdGF0ZSA9IG5ldHdvcmtJbmZvLmdldFN0YXRlKCk7Ci0gICAgICAgIGlmICgoc3RhdGUgPT0gTmV0d29ya0luZm8uU3RhdGUuRElTQ09OTkVDVEVEKQotICAgICAgICAgICAgICAgIHx8IChzdGF0ZSA9PSBOZXR3b3JrSW5mby5TdGF0ZS5VTktOT1dOKSkgewotCi0gICAgICAgICAgICAvLyBMb29rIGZvciBhbiBvcGVuIG5ldHdvcmsKLSAgICAgICAgICAgIExpc3Q8U2NhblJlc3VsdD4gc2NhblJlc3VsdHMgPSBnZXRTY2FuUmVzdWx0c0xpc3QoKTsKLSAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IG51bU9wZW5OZXR3b3JrcyA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHNjYW5SZXN1bHRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNjYW5SZXN1bHQgc2NhblJlc3VsdCA9IHNjYW5SZXN1bHRzLmdldChpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc2NhblJlc3VsdC5jYXBhYmlsaXRpZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBudW1PcGVuTmV0d29ya3MrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChudW1PcGVuTmV0d29ya3MgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgrK21OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlID49IE5VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBXZSd2ZSBzY2FubmVkIGNvbnRpbnVvdXNseSBhdCBsZWFzdAotICAgICAgICAgICAgICAgICAgICAgICAgICogTlVNX1NDQU5TX0JFRk9SRV9OT1RJRklDQVRJT04gdGltZXMuIFRoZSB1c2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBwcm9iYWJseSBkb2VzIG5vdCBoYXZlIGEgcmVtZW1iZXJlZCBuZXR3b3JrIGluIHJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICogc2luY2Ugb3RoZXJ3aXNlIHN1cHBsaWNhbnQgd291bGQgaGF2ZSB0cmllZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICogYXNzb2NpYXRlIGFuZCB0aHVzIHJlc2V0dGluZyB0aGlzIGNvdW50ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUodHJ1ZSwgbnVtT3Blbk5ldHdvcmtzLCBmYWxzZSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gTm8gb3BlbiBuZXR3b3JrcyBpbiByYW5nZSwgcmVtb3ZlIHRoZSBub3RpZmljYXRpb24KLSAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHByaXZhdGUgRE5TIHJvdXRlIGlzIHNldCBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVEbnNSb3V0ZVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qcml2YXRlRG5zUm91dGVTZXQuZ2V0KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGlzcGxheSBvciBkb24ndCBkaXNwbGF5IGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlcmUgYXJlIG9wZW4gV2ktRmkgbmV0d29ya3MuCi0gICAgICogQHBhcmFtIHZpc2libGUge0Bjb2RlIHRydWV9IGlmIG5vdGlmaWNhdGlvbiBzaG91bGQgYmUgdmlzaWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKiBAcGFyYW0gbnVtTmV0d29ya3MgdGhlIG51bWJlciBuZXR3b3JrcyBzZWVuCi0gICAgICogQHBhcmFtIGZvcmNlIHtAY29kZSB0cnVlfSB0byBmb3JjZSBub3RpZmljYXRpb24gdG8gYmUgc2hvd24vbm90LXNob3duLAotICAgICAqIGV2ZW4gaWYgaXQgaXMgYWxyZWFkeSBzaG93bi9ub3Qtc2hvd24uCi0gICAgICogQHBhcmFtIGRlbGF5IHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSBub3RpZmljYXRpb24gc2hvdWxkIGJlIG1hZGUKLSAgICAgKiB2aXNpYmxlIG9yIGludmlzaWJsZS4KKyAgICAgKiBTZXQgYSBmbGFnIGluZGljYXRpbmcgcHJpdmF0ZSBETlMgcm91dGUgaXMgc2V0CiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShib29sZWFuIHZpc2libGUsIGludCBudW1OZXR3b3JrcywgYm9vbGVhbiBmb3JjZSwgaW50IGRlbGF5KSB7Ci0gICAgICAgIAotICAgICAgICAvLyBTaW5jZSB3ZSB1c2UgYXV0byBjYW5jZWwgb24gdGhlIG5vdGlmaWNhdGlvbiwgd2hlbiB0aGUKLSAgICAgICAgLy8gbU5ldHdvcmtzQXZhaWxhYmxlTm90aWZpY2F0aW9uU2hvd24gaXMgdHJ1ZSwgdGhlIG5vdGlmaWNhdGlvbiBtYXkKLSAgICAgICAgLy8gaGF2ZSBhY3R1YWxseSBiZWVuIGNhbmNlbGVkLiAgSG93ZXZlciwgd2hlbiBpdCBpcyBmYWxzZSB3ZSBrbm93Ci0gICAgICAgIC8vIGZvciBzdXJlIHRoYXQgaXQgaXMgbm90IGJlaW5nIHNob3duIChpdCB3aWxsIG5vdCBiZSBzaG93biBhbnkgb3RoZXIKLSAgICAgICAgLy8gcGxhY2UgdGhhbiBoZXJlKQotICAgICAgICAKLSAgICAgICAgLy8gSWYgaXQgc2hvdWxkIGJlIGhpZGRlbiBhbmQgaXQgaXMgYWxyZWFkeSBoaWRkZW4sIHRoZW4gbm9vcAotICAgICAgICBpZiAoIXZpc2libGUgJiYgIW1Ob3RpZmljYXRpb25TaG93biAmJiAhZm9yY2UpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE1lc3NhZ2UgbWVzc2FnZTsKLSAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTm90IGVub3VnaCB0aW1lIGhhcyBwYXNzZWQgdG8gc2hvdyB0aGUgbm90aWZpY2F0aW9uIGFnYWluCi0gICAgICAgICAgICBpZiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBtTm90aWZpY2F0aW9uUmVwZWF0VGltZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIENhY2hlIHRoZSBOb3RpZmljYXRpb24gbWFpbmx5IHNvIHdlIGNhbiByZW1vdmUgdGhlCi0gICAgICAgICAgICAgICAgLy8gRVZFTlRfTk9USUZJQ0FUSU9OX0NIQU5HRUQgbWVzc2FnZSB3aXRoIHRoaXMgTm90aWZpY2F0aW9uIGZyb20KLSAgICAgICAgICAgICAgICAvLyB0aGUgcXVldWUgbGF0ZXIKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbigpOwotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24ud2hlbiA9IDA7Ci0gICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5pY29uID0gSUNPTl9ORVRXT1JLU19BVkFJTEFCTEU7Ci0gICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5mbGFncyA9IE5vdGlmaWNhdGlvbi5GTEFHX0FVVE9fQ0FOQ0VMOwotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uY29udGVudEludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QWN0aXZpdHkobUNvbnRleHQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLkFDVElPTl9QSUNLX1dJRklfTkVUV09SSyksIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRRdWFudGl0eVRleHQoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIucGx1cmFscy53aWZpX2F2YWlsYWJsZSwgbnVtTmV0d29ya3MpOwotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGRldGFpbHMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRRdWFudGl0eVRleHQoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIucGx1cmFscy53aWZpX2F2YWlsYWJsZV9kZXRhaWxlZCwgbnVtTmV0d29ya3MpOwotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ID0gdGl0bGU7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uLnNldExhdGVzdEV2ZW50SW5mbyhtQ29udGV4dCwgdGl0bGUsIGRldGFpbHMsIG1Ob3RpZmljYXRpb24uY29udGVudEludGVudCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBOT1RJRklDQVRJT05fUkVQRUFUX0RFTEFZX01TOwotCi0gICAgICAgICAgICBtZXNzYWdlID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX05PVElGSUNBVElPTl9DSEFOR0VELCAxLAotICAgICAgICAgICAgICAgICAgICBJQ09OX05FVFdPUktTX0FWQUlMQUJMRSwgbU5vdGlmaWNhdGlvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgLy8gUmVtb3ZlIGFueSBwZW5kaW5nIG1lc3NhZ2VzIHRvIHNob3cgdGhlIG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgbVRhcmdldC5yZW1vdmVNZXNzYWdlcyhFVkVOVF9OT1RJRklDQVRJT05fQ0hBTkdFRCwgbU5vdGlmaWNhdGlvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1lc3NhZ2UgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfTk9USUZJQ0FUSU9OX0NIQU5HRUQsIDAsIElDT05fTkVUV09SS1NfQVZBSUxBQkxFKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1UYXJnZXQuc2VuZE1lc3NhZ2VEZWxheWVkKG1lc3NhZ2UsIGRlbGF5KTsKLSAgICAgICAgCi0gICAgICAgIG1Ob3RpZmljYXRpb25TaG93biA9IHZpc2libGU7CisgICAgcHVibGljIHZvaWQgcHJpdmF0ZURuc1JvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtUHJpdmF0ZURuc1JvdXRlU2V0LnNldChlbmFibGVkKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbGVhcnMgdmFyaWFibGVzIHJlbGF0ZWQgdG8gdHJhY2tpbmcgd2hldGhlciBhIG5vdGlmaWNhdGlvbiBoYXMgYmVlbgotICAgICAqIHNob3duIHJlY2VudGx5LgotICAgICAqIDxwPgotICAgICAqIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIHRoZSB0aW1lciB0aGF0IHByZXZlbnRzIG5vdGlmaWNhdGlvbnMgZnJvbQotICAgICAqIGJlaW5nIHNob3duIHRvbyBvZnRlbiB3aWxsIGJlIGNsZWFyZWQuCisgICAgICogRmV0Y2ggTmV0d29ya0luZm8gZm9yIHRoZSBuZXR3b3JrCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0Tm90aWZpY2F0aW9uVGltZXIoKSB7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lID0gMDsKLSAgICAgICAgbU51bVNjYW5zU2luY2VOZXR3b3JrU3RhdGVDaGFuZ2UgPSAwOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZCgiaW50ZXJmYWNlICIpLmFwcGVuZChtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiIHJ1blN0YXRlPSIpOwotICAgICAgICBpZiAobVJ1blN0YXRlID49IDEgJiYgbVJ1blN0YXRlIDw9IG1SdW5TdGF0ZU5hbWVzLmxlbmd0aCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG1SdW5TdGF0ZU5hbWVzW21SdW5TdGF0ZS0xXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobVJ1blN0YXRlKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQoTFMpLmFwcGVuZChtV2lmaUluZm8pLmFwcGVuZChMUyk7Ci0gICAgICAgIHNiLmFwcGVuZChtRGhjcEluZm8pLmFwcGVuZChMUyk7Ci0gICAgICAgIHNiLmFwcGVuZCgiaGF2ZUlwQWRkcmVzcz0iKS5hcHBlbmQobUhhdmVJcEFkZHJlc3MpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCBvYnRhaW5pbmdJcEFkZHJlc3M9IikuYXBwZW5kKG1PYnRhaW5pbmdJcEFkZHJlc3MpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCBzY2FuTW9kZUFjdGl2ZT0iKS5hcHBlbmQobUlzU2Nhbk1vZGVBY3RpdmUpLmFwcGVuZChMUykuCi0gICAgICAgICAgICAgICAgYXBwZW5kKCJsYXN0U2lnbmFsTGV2ZWw9IikuYXBwZW5kKG1MYXN0U2lnbmFsTGV2ZWwpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCBleHBsaWNpdGx5RGlzYWJsZWQ9IikuYXBwZW5kKG1Ub3JuRG93bkJ5Q29ubk1ncik7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIHB1YmxpYyBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG1OZXR3b3JrSW5mbzsKICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIERoY3BIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBIYW5kbGVyIG1UYXJnZXQ7Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogV2hldGhlciB0byBza2lwIHRoZSBESENQIHJlc3VsdCBjYWxsYmFjayB0byB0aGUgdGFyZ2V0LiBGb3IgZXhhbXBsZSwKLSAgICAgICAgICogdGhpcyBjb3VsZCBiZSBzZXQgaWYgdGhlIG5ldHdvcmsgd2Ugd2VyZSByZXF1ZXN0aW5nIGFuIElQIGZvciBoYXMKLSAgICAgICAgICogc2luY2UgYmVlbiBkaXNjb25uZWN0ZWQuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBOb3RlOiBUaGVyZSBpcyBzdGlsbCBhIGNoYW5jZSB3aGVyZSB0aGUgY2xpZW50J3MgaW50ZW5kZWQgREhDUAotICAgICAgICAgKiByZXF1ZXN0IG5vdCBiZWluZyBjYW5jZWxlZC4gRm9yIGV4YW1wbGUsIHdlIGFyZSByZXF1ZXN0IGZvciBJUCBvbgotICAgICAgICAgKiBBLCBhbmQgaGUgcXVldWVzIHJlcXVlc3QgZm9yIElQIG9uIEIsIGFuZCB0aGVuIGNhbmNlbHMgdGhlIHJlcXVlc3Qgb24KLSAgICAgICAgICogQiB3aGlsZSB3ZSdyZSBzdGlsbCByZXF1ZXN0aW5nIGZyb20gQS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FuY2VsQ2FsbGJhY2s7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbmNlIG9mIHRoZSBibHVldG9vdGggaGVhZHNldCBoZWxwZXIuIFRoaXMgbmVlZHMgdG8gYmUgY3JlYXRlZAotICAgICAgICAgKiBlYXJseSBiZWNhdXNlIHRoZXJlIGlzIGEgZGVsYXkgYmVmb3JlIGl0IGFjdHVhbGx5ICdjb25uZWN0cycsIGFzCi0gICAgICAgICAqIG5vdGVkIGJ5IGl0cyBqYXZhZG9jLiBJZiB3ZSBjaGVjayBiZWZvcmUgaXQgaXMgY29ubmVjdGVkLCBpdCB3aWxsIGJlCi0gICAgICAgICAqIGluIGFuIGVycm9yIHN0YXRlIGFuZCB3ZSB3aWxsIG5vdCBkaXNhYmxlIGNvZXhpc3RlbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBCbHVldG9vdGhIZWFkc2V0IG1CbHVldG9vdGhIZWFkc2V0OwotICAgICAgICAKLSAgICAgICAgcHVibGljIERoY3BIYW5kbGVyKExvb3BlciBsb29wZXIsIEhhbmRsZXIgdGFyZ2V0KSB7Ci0gICAgICAgICAgICBzdXBlcihsb29wZXIpOwotICAgICAgICAgICAgbVRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXQgPSBuZXcgQmx1ZXRvb3RoSGVhZHNldChtQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX0RIQ1BfU1RBUlQ6Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1vZGlmaWVkQmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGludCBwb3dlck1vZGUgPSBEUklWRVJfUE9XRVJfTU9ERV9BVVRPOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGREaXNhYmxlQ29leGlzdGVuY2VNb2RlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGVyZSBhcmUgcHJvYmxlbXMgc2V0dGluZyB0aGUgV2ktRmkgZHJpdmVyJ3MgcG93ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG1vZGUgdG8gYWN0aXZlIHdoZW4gYmx1ZXRvb3RoIGNvZXhpc3RlbmNlIG1vZGUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGVuYWJsZWQgb3Igc2Vuc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiA8cD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIFdlIHNldCBXaS1GaSB0byBhY3RpdmUgbW9kZSB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBvYnRhaW5pbmcgYW4gSVAgYWRkcmVzcyBiZWNhdXNlIHdlJ3ZlIGZvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBjb21wYXRpYmlsaXR5IGlzc3VlcyB3aXRoIHNvbWUgcm91dGVycyB3aXRoIGxvdyBwb3dlcgotICAgICAgICAgICAgICAgICAgICAgICAgICogbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIDxwPgotICAgICAgICAgICAgICAgICAgICAgICAgICogSW4gb3JkZXIgZm9yIHRoaXMgYWN0aXZlIHBvd2VyIG1vZGUgdG8gcHJvcGVybHkgYmUgc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICogd2UgZGlzYWJsZSBjb2V4aXN0ZW5jZSBtb2RlIHVudGlsIHdlJ3JlIGRvbmUgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICogb2J0YWluaW5nIGFuIElQIGFkZHJlc3MuICBPbmUgZXhjZXB0aW9uIGlzIGlmIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBhcmUgY3VycmVudGx5IGNvbm5lY3RlZCB0byBhIGhlYWRzZXQsIHNpbmNlIGRpc2FibGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICogY29leGlzdGVuY2Ugd291bGQgaW50ZXJydXB0IHRoYXQgY29ubmVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBjb2V4aXN0ZW5jZSBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfRElTQUJMRUQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBwb3dlck1vZGUgPSBnZXRQb3dlck1vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvd2VyTW9kZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgc3VwcGxpY2FudCBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgIC8vIGdldFBvd2VyTW9kZUNvbW1hbmQuCi0gICAgICAgICAgICAgICAgICAgICAgICBwb3dlck1vZGUgPSBEUklWRVJfUE9XRVJfTU9ERV9BVVRPOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3dlck1vZGUgIT0gRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRQb3dlck1vZGUoRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBuZXcgcmVxdWVzdCBpcyBiZWluZyBtYWRlLCBzbyBhc3N1bWUgd2Ugd2lsbCBjYWxsYmFjawotICAgICAgICAgICAgICAgICAgICAgICAgbUNhbmNlbENhbGxiYWNrID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGhjcEhhbmRsZXI6IERIQ1AgcmVxdWVzdCBzdGFydGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChOZXR3b3JrVXRpbHMucnVuRGhjcChtSW50ZXJmYWNlTmFtZSwgbURoY3BJbmZvKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVUNDRUVERUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiRGhjcEhhbmRsZXI6IERIQ1AgcmVxdWVzdCBzdWNjZWVkZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gRVZFTlRfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fRkFJTEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRGhjcEhhbmRsZXI6IERIQ1AgcmVxdWVzdCBmYWlsZWQ6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlscy5nZXREaGNwRXJyb3IoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAocG93ZXJNb2RlICE9IERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0UG93ZXJNb2RlKHBvd2VyTW9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgY29leGlzdGVuY2UgbW9kZSBiYWNrIHRvIGl0cyBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfU0VOU0UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1DYW5jZWxDYWxsYmFjaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UYXJnZXQuc2VuZEVtcHR5TWVzc2FnZShldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Q2FuY2VsQ2FsbGJhY2soYm9vbGVhbiBjYW5jZWxDYWxsYmFjaykgewotICAgICAgICAgICAgbUNhbmNlbENhbGxiYWNrID0gY2FuY2VsQ2FsbGJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogV2hldGhlciB0byBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUgd2hpbGUgb2J0YWluaW5nIElQIGFkZHJlc3MuIFRoaXMKLSAgICAgICAgICogbG9naWMgd2lsbCByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSBjdXJyZW50IGJsdWV0b290aAotICAgICAgICAgKiBoZWFkc2V0L2hhbmRzZnJlZSBzdGF0ZSBpcyBkaXNjb25uZWN0ZWQuIFRoaXMgbWVhbnMgaWYgaXQgaXMgaW4gYW4KLSAgICAgICAgICogZXJyb3Igc3RhdGUsIHdlIHdpbGwgTk9UIGRpc2FibGUgY29leGlzdGVuY2UgbW9kZSB0byBlcnIgb24gdGhlIHNpZGUKLSAgICAgICAgICogb2Ygc2FmZXR5LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiBXaGV0aGVyIHRvIGRpc2FibGUgY29leGlzdGVuY2UgbW9kZS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGREaXNhYmxlQ29leGlzdGVuY2VNb2RlKCkgewotICAgICAgICAgICAgaW50IHN0YXRlID0gbUJsdWV0b290aEhlYWRzZXQuZ2V0U3RhdGUobUJsdWV0b290aEhlYWRzZXQuZ2V0Q3VycmVudEhlYWRzZXQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrVXNlU3RhdGljSXAoKSB7Ci0gICAgICAgIG1Vc2VTdGF0aWNJcCA9IGZhbHNlOwotICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9VU0VfU1RBVElDX0lQKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0lQKTsKLSAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRGhjcEluZm8uaXBBZGRyZXNzID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZHIgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfR0FURVdBWSk7Ci0gICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURoY3BJbmZvLmdhdGV3YXkgPSBzdHJpbmdUb0lwQWRkcihhZGRyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkciA9IFNldHRpbmdzLlN5c3RlbS5nZXRTdHJpbmcoY3IsIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ORVRNQVNLKTsKLSAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRGhjcEluZm8ubmV0bWFzayA9IHN0cmluZ1RvSXBBZGRyKGFkZHIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0ROUzEpOwotICAgICAgICAgICAgaWYgKGFkZHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1EaGNwSW5mby5kbnMxID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZHIgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfRE5TMik7Ci0gICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURoY3BJbmZvLmRuczIgPSBzdHJpbmdUb0lwQWRkcihhZGRyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbURoY3BJbmZvLmRuczIgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbVVzZVN0YXRpY0lwID0gdHJ1ZTsKKyAgICAvKioKKyAgICAgKiBGZXRjaCBMaW5rUHJvcGVydGllcyBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgTGlua1Byb3BlcnRpZXMobUxpbmtQcm9wZXJ0aWVzKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgc3RyaW5nVG9JcEFkZHIoU3RyaW5nIGFkZHJTdHJpbmcpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IGFkZHJTdHJpbmcuc3BsaXQoIlxcLiIpOwotICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPSA0KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVua25vd25Ib3N0RXhjZXB0aW9uKGFkZHJTdHJpbmcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgYSA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMF0pICAgICAgOwotICAgICAgICAgICAgaW50IGIgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzFdKSA8PCAgODsKLSAgICAgICAgICAgIGludCBjID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1syXSkgPDwgMTY7Ci0gICAgICAgICAgICBpbnQgZCA9IEludGVnZXIucGFyc2VJbnQocGFydHNbM10pIDw8IDI0OwotCi0gICAgICAgICAgICByZXR1cm4gYSB8IGIgfCBjIHwgZDsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5rbm93bkhvc3RFeGNlcHRpb24oYWRkclN0cmluZyk7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBGZXRjaCBkZWZhdWx0IGdhdGV3YXkgYWRkcmVzcyBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldERlZmF1bHRHYXRld2F5QWRkcigpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0R2F0ZXdheUFkZHIuZ2V0KCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBpbnQgZ2V0TWF4RGhjcFJldHJpZXMoKSB7Ci0gICAgICAgIHJldHVybiBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9NQVhfREhDUF9SRVRSWV9DT1VOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9NQVhfREhDUF9SRVRSSUVTKTsKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBkZWZhdWx0IHJvdXRlIGlzIHNldAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJvdXRlU2V0KCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRSb3V0ZVNldC5nZXQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIFNldHRpbmdzT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgewotICAgICAgICBwdWJsaWMgU2V0dGluZ3NPYnNlcnZlcihIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgICAgIHN1cGVyKGhhbmRsZXIpOwotICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1VTRV9TVEFUSUNfSVApLCBmYWxzZSwgdGhpcyk7Ci0gICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19JUCksIGZhbHNlLCB0aGlzKTsKLSAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0dBVEVXQVkpLCBmYWxzZSwgdGhpcyk7Ci0gICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ORVRNQVNLKSwgZmFsc2UsIHRoaXMpOwotICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfRE5TMSksIGZhbHNlLCB0aGlzKTsKLSAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0ROUzIpLCBmYWxzZSwgdGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQ2hhbmdlKHNlbGZDaGFuZ2UpOwotCi0gICAgICAgICAgICBib29sZWFuIHdhc1N0YXRpY0lwID0gbVVzZVN0YXRpY0lwOwotICAgICAgICAgICAgaW50IG9JcCwgb0d3LCBvTXNrLCBvRG5zMSwgb0RuczI7Ci0gICAgICAgICAgICBvSXAgPSBvR3cgPSBvTXNrID0gb0RuczEgPSBvRG5zMiA9IDA7Ci0gICAgICAgICAgICBpZiAod2FzU3RhdGljSXApIHsKLSAgICAgICAgICAgICAgICBvSXAgPSBtRGhjcEluZm8uaXBBZGRyZXNzOwotICAgICAgICAgICAgICAgIG9HdyA9IG1EaGNwSW5mby5nYXRld2F5OwotICAgICAgICAgICAgICAgIG9Nc2sgPSBtRGhjcEluZm8ubmV0bWFzazsKLSAgICAgICAgICAgICAgICBvRG5zMSA9IG1EaGNwSW5mby5kbnMxOwotICAgICAgICAgICAgICAgIG9EbnMyID0gbURoY3BJbmZvLmRuczI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja1VzZVN0YXRpY0lwKCk7Ci0KLSAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9Ci0gICAgICAgICAgICAgICAgKHdhc1N0YXRpY0lwICE9IG1Vc2VTdGF0aWNJcCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKHdhc1N0YXRpY0lwICYmICgKLSAgICAgICAgICAgICAgICAgICAgICAgIG9JcCAgICE9IG1EaGNwSW5mby5pcEFkZHJlc3MgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9HdyAgICE9IG1EaGNwSW5mby5nYXRld2F5IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBvTXNrICAhPSBtRGhjcEluZm8ubmV0bWFzayB8fAotICAgICAgICAgICAgICAgICAgICAgICAgb0RuczEgIT0gbURoY3BJbmZvLmRuczEgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9EbnMyICE9IG1EaGNwSW5mby5kbnMyKSk7Ci0KLSAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb25uZWN0aW9ucyh0cnVlKTsKLSAgICAgICAgICAgICAgICBjb25maWd1cmVJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAobVVzZVN0YXRpY0lwKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIC8qKgorICAgICAqIFNldCBhIGZsYWcgaW5kaWNhdGluZyBkZWZhdWx0IHJvdXRlIGlzIHNldCBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWZhdWx0Um91dGVTZXQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1EZWZhdWx0Um91dGVTZXQuc2V0KGVuYWJsZWQpOwogICAgIH0KIAotICAgIHByaXZhdGUgY2xhc3MgTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzeXN0ZW0gcHJvcGVydGllcyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGNwIGJ1ZmZlciBzaXplcworICAgICAqIGZvciB0aGlzIG5ldHdvcmsuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCkgeworICAgICAgICByZXR1cm4gIm5ldC50Y3AuYnVmZmVyc2l6ZS53aWZpIjsKKyAgICB9CiAKLSAgICAgICAgcHVibGljIE5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIoSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgICAgICBzdXBlcihoYW5kbGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKCkgewotICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TZWN1cmUuZ2V0VXJpRm9yKAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX05FVFdPUktTX0FWQUlMQUJMRV9OT1RJRklDQVRJT05fT04pLCB0cnVlLCB0aGlzKTsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkID0gZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotCisgICAgcHJpdmF0ZSBjbGFzcyBXaWZpU3RhdGVSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSkgewotICAgICAgICAgICAgc3VwZXIub25DaGFuZ2Uoc2VsZkNoYW5nZSk7Ci0KLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkID0gZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmICghbU5vdGlmaWNhdGlvbkVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYW55IG5vdGlmaWNhdGlvbiB0aGF0IG1heSBiZSBzaG93aW5nCi0gICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgdHJ1ZSwgMCk7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICBtTmV0d29ya0luZm8gPSAoTmV0d29ya0luZm8pIGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5FWFRSQV9ORVRXT1JLX0lORk8pOworICAgICAgICAgICAgICAgIG1MaW5rUHJvcGVydGllcyA9IChMaW5rUHJvcGVydGllcykgaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVYVFJBX0xJTktfUFJPUEVSVElFUyk7CisgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtQ3NIYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfU1RBVEVfQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKKyAgICAgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoV2lmaU1hbmFnZXIuQ09ORklHX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgICAgIG1MaW5rUHJvcGVydGllcyA9IChMaW5rUHJvcGVydGllcykgaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVYVFJBX0xJTktfUFJPUEVSVElFUyk7CisgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtQ3NIYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfQ09ORklHVVJBVElPTl9DSEFOR0VELCBtTmV0d29ya0luZm8pOworICAgICAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzZXROb3RpZmljYXRpb25UaW1lcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGdldFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX05FVFdPUktTX0FWQUlMQUJMRV9OT1RJRklDQVRJT05fT04sIDEpID09IDE7CiAgICAgICAgIH0KICAgICB9CisKIH0K